Plan 9 from Bell Labs’s /usr/web/sources/contrib/steve/root/sys/lib/texmf/source/latex/base/ltfinal.dtx

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


% \iffalse meta-comment
%
% Copyright 1993 1994 1995 1996 1997
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file. 
% 
% For further copyright information, and conditions for modification
% and distribution, see the file legal.txt, and any other copyright
% notices in this file.
% 
% This file is part of the LaTeX2e system.
% ----------------------------------------
%   This system 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.
% 
%   For error reports concerning UNCHANGED versions of this file no
%   more than one year old, see bugs.txt.
% 
%   Please do not request updates from us directly.  Primary
%   distribution is through the CTAN archives.
% 
% 
% IMPORTANT COPYRIGHT NOTICE:
% 
% You are NOT ALLOWED to distribute this file alone.
% 
% You are allowed to distribute this file under the condition that it
% is distributed together with all the files listed in manifest.txt.
% 
% If you receive only some of these files from someone, complain!
% 
% 
% Permission is granted to copy this file to another file with a
% clearly different name and to customize the declarations in that
% copy to serve the needs of your installation, provided that you
% comply with the conditions in the file legal.txt.
% 
% However, NO PERMISSION is granted to produce or to distribute a
% modified version of this file under its original name.
%  
% You are NOT ALLOWED to change this file.
% 
% 
% 
% \fi
%
% \iffalse
%%% From File: ltfinal.dtx
%
%<*driver>
% \fi
\ProvidesFile{ltfinal.dtx}
             [1998/05/20 v1.01a LaTeX Kernel (Final Settings)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltfinal.dtx}
\title{\filename}
\date{\filedate}
\author{%
  Johannes Braams\and
  David Carlisle\and
  Alan Jeffrey\and
  Leslie Lamport\and
  Frank Mittelbach\and
  Chris Rowley\and
  Rainer Sch\"opf}
\begin{document}
\maketitle
 \DocInput{ltfinal.dtx}
\end{document}
%</driver>
% \fi
%
% \CheckSum{466}
%
% \section{Final settings}
% This section contains the final settings for \LaTeX.  It initialises
% some debugging and typesetting parameters, sets the default
% |\catcode|s and uc/lc codes, and inputs the hyphenation file.
%
% \StopEventually{}
%
% \changes{v0.1a}{1994/03/07}{Initial version, split from latex.dtx}
% \changes{v0.1a}{1994/03/07}{Remove oldcomments environment}
% \changes{v0.1c}{1994/04/21}{Added comments, set the catcodes of
%    128--255.}
% \changes{v0.1d}{1994/04/23}{Check that \cs{font@submax} is still zero}
% \changes{v0.1e}{1994/05/02}{Set all the catcodes}
% \changes{v0.1f}{1994/05/03}{Set the catcode of control-J to be
%    `other', for use in messages.}
% \changes{v0.1g}{1994/05/05}{Added empty errhelp.}
% \changes{v0.1h}{1994/05/13}{Added package ot1enc, and defined
%    \cs{@acci}, \cs{@accii} and \cs{@acciii}.}
% \changes{v0.1j}{1994/05/18}{Corrected the lccode for d-bar.}
% \changes{v0.1k}{1994/05/19}{Removed \cs{makeat...}}
% \changes{v1.0n}{1994/05/31}{Renamed lthyphen.* to lthyphen.*.}
% \changes{v1.0o}{1994/11/17}
%         {\cs{@tempa} to \cs{reserved@a}}
% \changes{v1.0p}{1994/12/01}
%         {Renamed lthyphen.* to hyphen.*.}
% \changes{v1.0r}{1995/06/05}
%         {Added \cs{MakeUppercase} and \cs{MakeLowercase}.}
% \changes{v1.0s}{1995/06/06}
%         {Made \cs{MakeUppercase} and \cs{MakeLowercase} brace their
%         argument.}
%
% \subsection{Debugging}
%
% By default, \LaTeX{} shows statistics:
%    \begin{macrocode}
%<*2ekernel>
\tracingstats1
%    \end{macrocode}
% \changes{v0.1g}{1994/05/05}{Set error help empty.}
% Empty the error help message, which may have some rubbish:
%    \begin{macrocode}
\errhelp{}
%    \end{macrocode}
% 
%
% \subsection{Typesetting parameters}
%
% \begin{macro}{\@lowpenalty}
% \begin{macro}{\@medpenalty}
% \begin{macro}{\@highpenalty}
%    These are penalties used internally.
%    \begin{macrocode}
\newcount\@lowpenalty
\newcount\@medpenalty
\newcount\@highpenalty
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% The default values of the picture and |\fbox| parameters:
%    \begin{macrocode}
\unitlength = 1pt
\fboxsep = 3pt
\fboxrule = .4pt
%    \end{macrocode}
% The saved value of \TeX's |\maxdepth|:
%    \begin{macrocode}
\@maxdepth       = \maxdepth
%    \end{macrocode}
% |\vsize| initialized because a |\clearpage| with |\vsize < \topskip|
%  causes trouble.
% |\@colroom| and |\@colht| also initialized because |\vsize| may be
%  set to them if a |\clearpage| is done before the |\begin{document}|
%
%    \begin{macrocode}
\vsize = 1000pt
\@colroom = \vsize
\@colht = \vsize
%    \end{macrocode}
% Initialise |\textheight| |\textwidth| and page style, to avoid
% internal errors if they are not set by the class.
% \changes{v0.1b}{1994/04/18}
%         {Initialise \cs{textheight}, \cs{textwidth} and page style}
%    \begin{macrocode}
\textheight=.5\maxdimen
\textwidth=\textheight
\ps@empty
%    \end{macrocode}
%
% \subsection{Lccodes for hyphenation}
%
% \changes{v1.01a}{1998/05/20}{Set up lccodes before loading
%    hyphenation files: pr/2639}
%    We set things up so that hypehnation files can assume that the
%    default (T1) lccodes are in use (at present this also sets up the
%    uccodes).
%    We temporarily define |\reserved@a| to apply |\reserved@c| to
%    all the numbers in the range of its arguments.
%    \begin{macrocode}
\def\reserved@a#1#2{%
   \@tempcnta#1\relax
   \@tempcntb#2\relax
   \reserved@b
}
\def\reserved@b{%
   \ifnum\@tempcnta>\@tempcntb\else
      \reserved@c\@tempcnta
      \advance\@tempcnta\@ne
      \expandafter\reserved@b
   \fi
}
%    \end{macrocode}
%    Depending on the \TeX{} version, we might not be allowed to do
%    this for non-ASCII characters.
% \changes{v1.0n}{1994/06/09}{For \TeX2, do not set codes for higher
%                   half of character table.}
%    \begin{macrocode}
\def\reserved@c#1{%
   \count@=#1\advance\count@ by -"20
   \uccode#1=\count@
   \lccode#1=#1
}
\reserved@a{`\a}{`\z}
\ifnum\inputlineno=\m@ne\else
  \reserved@a{"A0}{"BC}
  \reserved@a{"E0}{"FF}
\fi
%    \end{macrocode}
% The upper case characters need their |\uccode| and |\lccode| values
% set, and their |\sfcode| set to 999.
%    \begin{macrocode}
\def\reserved@c#1{%
   \count@=#1\advance\count@ by "20
   \uccode#1=#1
   \lccode#1=\count@
   \sfcode#1=999
}
\reserved@a{`\A}{`\Z}
\ifnum\inputlineno=\m@ne\else
  \reserved@a{"80}{"9C}
  \reserved@a{"C0}{"DF}
\fi
%    \end{macrocode}
% Well, it would be nice if that were correct, but unfortunately, the
% Cork encoding contains some odd slots whose uccode or lccode isn't
% quite what you'd expect.
%    \begin{macrocode}
\uccode`\^^Y=`\I     % dotless i
\lccode`\^^Y=`\^^Y   % dotless i
\uccode`\^^Z=`\J     % dotless j, ae in OT1
\lccode`\^^Z=`\^^Z   % dotless j, ae in OT1
\ifnum\inputlineno=\m@ne\else
  \lccode`\^^9d=`\i    % dotted I
  \uccode`\^^9d=`\^^9d % dotted I
  \lccode`\^^9e=`\^^9e % d-bar
  \uccode`\^^9e=`\^^d0 % d-bar
\fi
%    \end{macrocode}
% Finally here is one that helps hyphenation in the OT1 encoding.
% \changes{v1.0z}{1996/10/31}
%    {Added extra \cs{lcode}, hoping it does no harm in T1 (pr/1969)}
%    \begin{macrocode}
\lccode`\^^[=`\^^[   % oe in OT1
%    \end{macrocode}
%
% \subsection{Hyphenation}
%
% \changes{v0.1a}{1994/03/07}{move code here from lhyphen.dtx}
% \changes{v0.1a}{1994/03/07}
%         {use \cs{InputIfFileExists} not \cs{IfFileExists}}
% \changes{v1.0x}{1995/11/01}
%      {(DPC) Switch meaning of \cs{@addtofilelist} for cfg files}%
% The following code will be compiled into the format file. It checks
% for the existance of \texttt{hyphen.cfg} in inputs that file if
% found. Otherwise it inputs \texttt{hyphen.ltx}.  Note that these
% are loaded in \emph{before} the |\catcode|s are set, so local
% hyphenation files can use 8-bit input.
%
% We try to load the customized hyphenation description file.
%    \begin{macrocode}
\InputIfFileExists{hyphen.cfg}
           {\typeout{===========================================^^J%
                      Local configuration file hyphen.cfg used^^J%
                     ===========================================}%
             \def\@addtofilelist##1{\xdef\@filelist{\@filelist,##1}}%
           }
           {\input{hyphen.ltx}}
\let\@addtofilelist\@gobble
%    \end{macrocode}
%
%
%
% \subsection{Font loading}
%    Fonts loaded during the formatting process might already have
%    changed the |\font@submax| from |0pt| to something higher.
%    If so, we put out a bold warning.
% \changes{v0.1l}{1994/05/20}{Use new font warning commands}
%    \begin{macrocode}
\ifdim \font@submax >\z@
   \@font@warning{Size substitutions with differences\MessageBreak
                 up to \font@submax\space have occured.\MessageBreak
                \MessageBreak
                Please check the transcript file
                carefully\MessageBreak
                and redo the format generation if necessary!
                \@gobbletwo}%
   \errhelp{Only stopped, to give you time to
            read the above message.}
   \errmessage{}
%    \end{macrocode}
%    We reset the macro. Otherwise every user will get a warning on
%    every job.
%    \begin{macrocode}
\def\font@submax{0pt}
\fi
%    \end{macrocode}
%
% \subsection{Input encoding}
%
% We temporarily define |\reserved@a| to apply |\reserved@c| to all the
% numbers in the range of its arguments.
%    \begin{macrocode}
\def\reserved@a#1#2{%
   \@tempcnta#1\relax
   \@tempcntb#2\relax
   \reserved@b
}
\def\reserved@b{%
   \ifnum\@tempcnta>\@tempcntb\else
      \reserved@c\@tempcnta
      \advance\@tempcnta\@ne
      \expandafter\reserved@b
   \fi
}
%    \end{macrocode}
% \changes{v0.1e}{1994/05/02}{Added setting the special catcodes.}
% \changes{v0.1f}{1994/05/02}{Set the catcode of control-J.}
% Set the special catcodes (although some of these are useless, since an
% error will have occurred if the catcodes have changed).  Note that
% |^^J| has catcode `other' for use in warning messages.
%    \begin{macrocode}
\catcode`\ =10
\catcode`\#=6
\catcode`\$=3
\catcode`\%=14
\catcode`\&=4
\catcode`\\=0
\catcode`\^=7
\catcode`\_=8
\catcode`\{=1
\catcode`\}=2
\catcode`\~=13
\catcode`\@=11
\catcode`\^^I=10
\catcode`\^^J=12
\catcode`\^^L=13
\catcode`\^^M=5
%    \end{macrocode}
% \changes{v0.1e}{1994/05/02}{Added setting the `other' catcodes.}
% Set the `other' catcodes.
%    \begin{macrocode}
\def\reserved@c#1{\catcode#1=12\relax}
\reserved@c{`\!}
\reserved@c{`\"}
\reserved@a{`\'}{`\?}
\reserved@c{`\[}
\reserved@c{`\]}
\reserved@c{`\`}
\reserved@c{`\|}
%    \end{macrocode}
% \changes{v0.1e}{1994/05/02}{Added setting the `letter' catcodes.}
% Set the `letter' catcodes.
%    \begin{macrocode}
\def\reserved@c#1{\catcode#1=11\relax}
\reserved@a{`\A}{`\Z}
\reserved@a{`\a}{`\z}
%    \end{macrocode}
% \changes{v0.1e}{1994/05/02}{Made slot 127 illegal}
% \changes{v1.0n}{1994/11/18}
%         {re-allow slots 127--255}
% All the characters in the range 0--31 and 127--255 are illegal,
% \emph{except} tab (|^^I|), nl (|^^J|), ff (|^^L|) and cr (|^^M|).
%
% Now allow 8-bit characters, although their use in this way is
% strongly discouraged. See |inputenc.dtx| for a supported mechanism
% for 8-bit input.
%    \begin{macrocode}
\def\reserved@c#1{\catcode#1=15\relax}
\reserved@a{0}{`\^^H}
\reserved@c{`\^^K}
\reserved@a{`\^^N}{31}
%\ifnum\inputlineno=\m@ne
  \catcode"7F=15
%\else
%  \reserved@a{"7F}{"FF}
%\fi
%    \end{macrocode}
%    
% \subsection{Lccodes and uccodes}
%    
% \changes{v1.01a}{1998/05/20}{Set up uc/lccodes after loading
%    hyphenation files: pr/2639}
%    We now again set up the default (T1) uc/lccodes.
%    The lower case characters need their |\uccode| and |\lccode| values
%    set. Some of this is a repeat of the set-up before loading
%    hyphenation files.
%    Depending on the \TeX{} version, we might not be allowed to do
%    this for non-ASCII characters.
% \changes{v1.0n}{1994/06/09}{For \TeX2, do not set codes for higher
%                   half of character table.}
%    \begin{macrocode}
\def\reserved@c#1{%
   \count@=#1\advance\count@ by -"20
   \uccode#1=\count@
   \lccode#1=#1
}
\reserved@a{`\a}{`\z}
\ifnum\inputlineno=\m@ne\else
  \reserved@a{"A0}{"BC}
  \reserved@a{"E0}{"FF}
\fi
%    \end{macrocode}
% The upper case characters need their |\uccode| and |\lccode| values
% set, and their |\sfcode| set to 999.
%    \begin{macrocode}
\def\reserved@c#1{%
   \count@=#1\advance\count@ by "20
   \uccode#1=#1
   \lccode#1=\count@
   \sfcode#1=999
}
\reserved@a{`\A}{`\Z}
\ifnum\inputlineno=\m@ne\else
  \reserved@a{"80}{"9C}
  \reserved@a{"C0}{"DF}
\fi
%    \end{macrocode}
% Well, it would be nice if that were correct, but unfortunately, the
% Cork encoding contains some odd slots whose uccode or lccode isn't
% quite what you'd expect.
%    \begin{macrocode}
\uccode`\^^Y=`\I     % dotless i
\lccode`\^^Y=`\^^Y   % dotless i
\uccode`\^^Z=`\J     % dotless j, ae in OT1
\lccode`\^^Z=`\^^Z   % dotless j, ae in OT1
\ifnum\inputlineno=\m@ne\else
  \lccode`\^^9d=`\i    % dotted I
  \uccode`\^^9d=`\^^9d % dotted I
  \lccode`\^^9e=`\^^9e % d-bar
  \uccode`\^^9e=`\^^d0 % d-bar
\fi
%    \end{macrocode}
% Finally here is one that helps hyphenation in the OT1 encoding.
% \changes{v1.0z}{1996/10/31}
%    {Added extra \cs{lcode}, hoping it does no harm in T1 (pr/1969)}
%    \begin{macrocode}
\lccode`\^^[=`\^^[   % oe in OT1
%    \end{macrocode}
%
% \begin{macro}{\MakeUppercase}
% \begin{macro}{\MakeUppercase}
% \begin{macro}{\@uclclist}
%
% \changes{v1.0z1}{1997/10/20}{Removed \cs{aa} and \cs{AA} from
%    \cs{@uclclist} as these are macros.} 
%
%    And whilst we're doing things with uc/lc tables, here are two
%    commands to upper- and lower-case a string.
%
%    \emph{Note} that this implementation is subject to change!  At
%    the moment we're not providing any way to extend the list of
%    uc/lc commands, since finding a good interface is difficult.
%    These commands have some nasty features, such as uppercasing
%    mathematics, environment names, labels, etc.  A much better
%    long-term solution is to use all-caps fonts, but these aren't
%    generally available.
%    \begin{macrocode}
\DeclareRobustCommand{\MakeUppercase}[1]{{%
      \def\i{I}\def\j{J}%
      \def\reserved@a##1##2{\let##1##2\reserved@a}%
      \expandafter\reserved@a\@uclclist\reserved@b{\reserved@b\@gobble}%
      \protected@edef\reserved@a{\uppercase{#1}}%
      \reserved@a
   }}
\DeclareRobustCommand{\MakeLowercase}[1]{{%
      \def\reserved@a##1##2{\let##2##1\reserved@a}%
      \expandafter\reserved@a\@uclclist\reserved@b{\reserved@b\@gobble}%
      \protected@edef\reserved@a{\lowercase{#1}}%
      \reserved@a
   }}
\def\@uclclist{\oe\OE\o\O\ae\AE
      \dh\DH\dj\DJ\l\L\ng\NG\ss\SS\th\TH}
%    \end{macrocode}
%    The above code works, but has the nasty side-effect that if you
%    say something like:
%\begin{verbatim}
%    \markboth{\MakeUppercase\contentsname}
%             {\MakeUppercase\contentsname}
%\end{verbatim}
%    then the uppercasing is only done to the first letter of the
%    contents name, since the mark expands out to:
%\begin{verbatim}
%    \mark{\protect\MakeUppercase Table of Contents}
%         {\protect\MakeUppercase Table of Contents}
%\end{verbatim}
%    In order to get round this, we redefine |\MakeUppercase| and
%    |\MakeLowercase| to grab their argument and brace it.  This is a
%    very low-level hack, and is \emph{not} recommended practice!
%    This is an instance of a general problem that makes it unsafe to
%    grab arguments unbraced, and probably needs a more general
%    solution.  For the moment though, this hack will do:
%    \begin{macrocode}
\protected@edef\MakeUppercase#1{\MakeUppercase{#1}}
\protected@edef\MakeLowercase#1{\MakeLowercase{#1}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \changes{v1.0h}{1994/05/13}{Added output enc stuff}
% \changes{v1.0i}{1994/05/16}{moved output enc stuff to lfonts}
%
% \changes{v0.1a}{1994/03/07}{Add code from the old dump.dtx}
%
% \subsection{Applying Patch files}
% Between major releases, small patches will be distributed in
% files |ltpatch.ltx| which must be added at this point.
% \changes{v1.0m}{1994/06/08}{Add patch file system}
%    \begin{macrocode}
\IfFileExists{ltpatch.ltx}
  {\typeout{=================================^^J%
             Applying patch file ltpatch.ltx^^J%
            =================================}
   \def\fmtversion@topatch{unknown}
   \input{ltpatch.ltx} 
   \ifx\fmtversion\fmtversion@topatch
      \ifx\patch@level\@undefined
        \typeout{^^J^^J^^J%
         !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J%
         !! Patch file `ltpatch.ltx' not suitable for this^^J%
         !! version of LaTeX.^^J^^J%
         !! Please check if initex found an old patch file:^^J%
         !! --- if so, rename it or delete it, and redo the^^J%
         !! initex run.^^J%
         !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J}%
        \batchmode \@@end
      \else
%    \end{macrocode}
% \changes{v1.0q}{1995/04/21}
%         {Allow initial patch level 0}
% \changes{v1.0t}{1995/06/13}
%         {Add patch level string more carefully}
% The code below adds the `patch level' string to the first |\typeout|
% in the startup banner.
%    \begin{macrocode}
        \def\fmtversion@topatch{0}%
        \ifx\fmtversion@topatch\patch@level\else
          \def\reserved@a\typeout##1##2\reserved@a{%
                 \typeout{##1 patch level \patch@level}##2}
          \everyjob\expandafter\expandafter\expandafter{%
             \expandafter\reserved@a\the\everyjob\reserved@a}
          \let\reserved@a\relax
          \the\everyjob
        \fi
      \fi
   \else
      \typeout{^^J^^J^^J%
     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J%
     !! Patch file `ltpatch.ltx' (for version <\fmtversion@topatch>)^^J%
     !! is not suitable for version <\fmtversion> of LaTeX.^^J^^J%
     !! Please check if initex found an old patch file:^^J%
     !! --- if so, rename it or delete it, and redo the^^J%
     !!     initex run.^^J%
     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J}%
       \batchmode \@@end
   \fi
   \let\fmtversion@topatch\relax
  }{}
%    \end{macrocode}
%
% \subsection{Freeing Memory}
%
% \begin{macro}{\reserved@a}
% \begin{macro}{\reserved@b}
% \changes{v1.0v}{1995/10/17}{reset here after the \cs{input} above}
% And just to make sure nobody relies on those definitions of
% |\reserved@b| and friends.
% These macros are reserved for use in the kernel. \emph{Do not use
% them as general scratch macros}.
%    \begin{macrocode}
\let\reserved@a\@filelist
\let\reserved@b=\@undefined
\let\reserved@c=\@undefined
\let\reserved@d=\@undefined
\let\reserved@e=\@undefined
\let\reserved@f=\@undefined
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\toks}
% \changes{v1.0y}{1996/07/10}
%      {Free up memory from scratch registers /2213}
%    \begin{macrocode}
\toks0{}
\toks2{}
\toks4{}
\toks6{}
\toks8{}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Initialise file list}
%
% \begin{macro}{\@providesfile}
% \changes{v1.0v}{1995/10/17}{reset macro}
% Initialise for use in the document. During initex a modified version
% has been used which leaves debugging information for |latexbug.tex|.
%    \begin{macrocode}
\def\@providesfile#1[#2]{%
    \wlog{File: #1 #2}%
    \expandafter\xdef\csname ver@#1\endcsname{#2}%
  \endgroup}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@filelist}
% \changes{v1.0w}{1995/10/19}{Move after \cs{reserved@a} setting:-)}
% \begin{macro}{\@addtofilelist}
% Reset |\@filelist| so files input while making the format are not
% listed. The list built up so far may take up a lot of memory and so
% it is moved to |\reserved@a| where it will be overwritten as soon
% as almost any \LaTeX\ command is issued in a class file.
% However the |latexbug.tex| program will be able to access this
% information and insert it into a bug report.
%    \begin{macrocode}
\let\@filelist\@gobble
\def\@addtofilelist#1{\xdef\@filelist{\@filelist,#1}}%
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \subsection{Dumping the format}
%    Finally we make |@| into a letter, ensure the format will 
% be in the `normal' error mode, and dump everything into the
%    format file.
% \changes{v1.0t}{1995/06/13}
%         {Call \cs{errorstopmode}}
%    \begin{macrocode}
\makeatother
\errorstopmode
\dump
%</2ekernel>
%    \end{macrocode}
%
% \Finale
%

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to webmaster@9p.io.