nbibtex-0.9.18/0000775007651200140720000000000011042440236011073 5ustar nrnrnbibtex-0.9.18/nbibfind.10000664007651200140720000000733010426526600012740 0ustar nrnr.TH NBIBFIND 1 "4 May 2006" .\"===================================================================== .if t .ds TX \fRT\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X\fP .if n .ds TX TeX .ie t .ds OX \fIT\v'+0.25m'E\v'-0.25m'X\fP for troff .el .ds OX TeX for nroff .\" the same but obliqued .\" BX definition must follow TX so BX can use TX .if t .ds BX \fRNB\s-2IB\s0\fP\*(TX .if n .ds BX NbibTeX .\" OB definition must follow TX so OB can use TX .if t .ds OB \fRB\s-2IB\s0\fP\*(TX .if n .ds OB BibTeX .\" LX definition must follow TX so LX can use TX .if t .ds LX \fRL\\h'-0.36m'\\v'-0.15v'\\s-2A\\s0\\h'-0.15m'\\v'0.15v'\fP\*(TX .if n .ds LX LaTeX .\"===================================================================== .SH NAME nbibfind \- find bibliography entries for BibTeX or NbibTeX .SH SYNOPSIS .B nbibfind .RB [ -terse | -full | -bib ] .I query .RI [ bibname ...] .\"===================================================================== .SH DESCRIPTION .B nbibfind searches for \*(OB entries using the same query algorithm as \*(BX. If the optional list of .IR bibname s is given, it searches only those bibliographies; otherwise, it searches all bibliographies on the user's BIBINPUTS (or on the standard system path). The language of .I query is that of .BR nbibtex (1). .\"===================================================================== .SH OPTIONS .TP .B "-terse" Print a one-line summary of each matched entry (the default). .TP .B "-full" Print a longer summary of each matched entry, including full authors, year, and title, possibly spread over multiple lines. .TP .B "-bib" Print each entry in a form suitable for including in a .I .bib file. .\"===================================================================== .SH EXAMPLES .B "nbibfind author=knuth:series=art-programming:volume=2" .br .B "nbibfind knuth:seminumerical personal.bib" .br .B "nbibfind harper-moggi:phase" .br .B "nbibfind :essence-algol" .br .B "nbibfind :essence-functional" .\"===================================================================== .SH QUERY LANGUAGE The query language is that of .BR nbibtex (1). .PP A query consists of a sequence of one or more .I constraints separated by colons. A constraint may be empty. .PP A nonempty constraint is of the form .IB key = words\fR, where .I key is the name of a field in the \*(BX entry and .I words is a sequence of one or more words separated by dashes. The contraint is satisfied if every word in .I words is found in the field named by .I key. (The .I key may also be .BR "[type]" , which matches agains the type of the entry, or .BR "*" , which looks for .I words in .I any field.) .PP As a convenience, keys may be defaulted in up to three constraints. In the first constraint, the default key is .BR author . In the second constraint, the default key is .B year if .I words is all digits, and is .B title otherwise. In the third constraint, the default key is .B year if .I words is all digits, and is .B "[type]" otherwise. .PP To match a word in .IR words , .B nbibfind uses the Boyer-Moore string-matching algorithm, so longer words are usually faster. .\"===================================================================== .SH ENVIRONMENT For .I .bib files, .B nbibfind uses the BIBINPUTS environment variable if that is set, otherwise the default. For details of the searching, see .BR tex (1) and .BR kpsewhich (1). .PP .\"===================================================================== .SH "SEE ALSO" .BR nbibtex (1), .BR latex (1), .BR tex (1), .BR kpsewhich (1), .BR bibtex (1). .br Leslie Lamport, .IR "\*(LX \- A Document Preparation System" , Addison-Wesley, 1985, ISBN 0-201-15790-X. .\"===================================================================== .SH AUTHOR Norman Ramsey, Harvard University. nbibtex-0.9.18/nbibtex.c0000664007651200140720000000223511042435521012675 0ustar nrnr#line 1225 "nbib.nw" #include #include #include #include #include extern int luaopen_bibtex(lua_State *L); extern int luaopen_boyer_moore (lua_State *L); int main (int argc, char *argv[]) { int i, rc; lua_State *L = luaL_newstate(); static const char* files[] = { SHARE "/bibtex.lua", SHARE "/natbib.nbs" }; #define OPEN(N) lua_pushcfunction(L, luaopen_ ## N); lua_call(L, 0, 0) OPEN(base); OPEN(table); OPEN(io); OPEN(package); OPEN(string); OPEN(bibtex); OPEN(boyer_moore); for (i = 0; i < sizeof(files)/sizeof(files[0]); i++) { if (luaL_dofile(L, files[i])) { fprintf(stderr, "%s: error loading configuration file %s\n", argv[0], files[i]); exit(2); } } lua_pushstring(L, "bibtex"); lua_gettable(L, LUA_GLOBALSINDEX); lua_pushstring(L, "main"); lua_gettable(L, -2); lua_newtable(L); for (i = 0; i < argc; i++) { lua_pushnumber(L, i); lua_pushstring(L, argv[i]); lua_settable(L, -3); } rc = lua_pcall(L, 1, 0, 0); if (rc) { fprintf(stderr, "Call failed: %s\n", lua_tostring(L, -1)); lua_pop(L, 1); } lua_close(L); return rc; } nbibtex-0.9.18/fun.tex0000664007651200140720000000535611042422300012406 0ustar nrnr\documentclass[twocolumn]{article} \title{A Selective History of Functional Programming\\ {\large Or, How Good is \emph{Your} Bib{\TeX} File?}} \author{Norman Ramsey} \usepackage{natbib} \usepackage{times}% smaller fonts \bibpunct();A{}, \begin{document} \maketitle \small This history is intended not so much to capture functional programming as it is to test my replacement for Bib{\TeX}. The idea is that you change the \verb+\bibliography+ command to use your own bibliography, try my \texttt{nbibtex}, and see how many papers it picks up correctly. To get all~23 references, I~had to combine the bibliographies of four professors (a 24th~reference was introduced by one of the~23). My own personal bibliography is missing 7~references \citep{iverson::book, :lambda-ultimate-declarative, Backus:liberate-neumann, macqueen:MODULES-for-ml, milner-tofte-harper:definition:1990, jones:qualified-TYPES:booK, peyton-jones-launchbury:lazy-functional-state-threads:in}. It all started with \cite{mccarthy:symbolic-recursive}. \cite{iverson::book} had some good ideas, but what really got people excited was Backus's \citeyearpar{Backus:liberate-neumann} Turing lecture. By that time of course we had Scheme \citep{sussman-steele:scheme:197}, which we all know is the ultimate language \citep{:lambda-ultimate-imperative,:lambda-ultimate-declarative,:lambda-ultimate-goto}. But others were working eagerly on types. \cite{milner:type-polymorphism-programming} was busy with~ML and type inference \citep{damas-milner}. MacQueen's \citeyearpar{macqueen:MODULES-for-ml} module proposal led to Standard~ML \citep{milner-tofte-harper:definition:1990}. Later work on modules by \cite{harper-lillibridge:sharing} led to a revised Definition \citep{milner-tofte-macqueen-harper}. Closely related work by \cite{leroy:modules:1994,leroy:functors:1995,leroy:modular-module-system} led to new developments in the Objective Caml dialect. Meanwhile, lazy functional programmers like \cite{hughes:why-functional-matters} were busy developing Haskell \citep{peyton-jones:haskell:book}. Nifty features like type classes \citep{wadler-blott:ad-hoc-polymorphism} led to a cool theory of qualified types \citep{jones:qualified-TYPES:booK}. Not to mention monads \citep{wadler:essence-functional}, special threads \citep{peyton-jones-launchbury:lazy-functional-state-threads:in}, and other awkward \citep{peyton-jones:awkward-squad} features. There are too many papers to read them all in one semester, but when my students held a vote among those they read, they liked \cite{wadler-blott} best, although there was strong support for \cite{leroy:separate-compilation}. \providecommand\includeftpref{} % wackiness of Simon's \bibliographystyle{plainnatx} \bibliography{fun} \end{document} nbibtex-0.9.18/nbib.nw0000664007651200140720000036440411042435431012367 0ustar nrnr% -*- mode: noweb; noweb-code-mode: lua-mode -*- \documentclass{article} \usepackage{fullpage} \usepackage{noweb,url} \usepackage[hypertex]{hyperref} \noweboptions{smallcode} \def\BibTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}} \def\NbibTeX{{\rm N\kern-.05em{\sc bi\kern-.025em b}\kern-.08em T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}} \let\bibtex\BibTeX \let\nbibtex\NbibTeX \title{A Replacement for \bibtex\\ (Version )} \author{Norman Ramsey} \setcounter{tocdepth}{2} %% keep TOC on one page \def\lbrace{\char123} \def\rbrace{\char125} \begin{document} @ \maketitle \tableofcontents \clearpage \section{Overview} The code herein comprises the ``nbib'' package, which is a collection of tools to help authors take better advantage of \BibTeX\ data, especially when working in collaboration. The driving technology is that instead of using \BibTeX\ ``keys,'' which are chosen arbitrarily and idiosyncratically, nbib builds a bibliography by searching the contents of citations. \begin{itemize} \item \texttt{nbibtex} is a drop-in replacement for \texttt{bibtex}. Authors' \verb+\cite{+\ldots\kern-2pt \verb+}+ commands are interpreted either as classic \bibtex\ keys (for backward compatibility) or as search commands. Thus, if your bibliography contains the classic paper on type inference, \texttt{nbibtex} should find it using a citation like \verb+\cite{damas-milner:1978}+, or \verb+\cite{damas-milner:polymorphism}+, or perhaps even simply \verb+\cite{damas-milner}+---\emph{regardless} of the \bibtex\ key you may have chosen. The same citations should also work with your coauthors' bibliographies, even if they are keyed differently. \item \texttt{nbibfind} uses the nbib search engine on the command line. If you know you are looking for a paper by Harper and Moggi, you can just type \begin{verbatim} nbibfind harper-moggi \end{verbatim} and see what comes out. \item To help you work with coauthors who don't have the nbib package, \texttt{nbibmake}\footnote {Not yet implemented.} examines a {\LaTeX} document and builds a custom \texttt{.bib} file just for that document. \end{itemize} \noindent The package is written in a combination of~C and Lua: \begin{itemize} \item Because I want nbib to be able to handle bibliographies with thousands or tens of thousands of entries, the code to parse a \texttt{.bib} ``database'' is written in~C. A~computer bought in 2003 can parse over 15,000~entries per second. \item Because the search for \bibtex\ entries requires string searching on every entry, the string search is also written in~C (and uses Boyer-Moore). \item Because string manipulation is much more easily done in Lua, all the code that converts a \bibtex\ entry into printed matter is written in Lua, as is all the ``driver'' code that implements various programs. \end{itemize} The net result is that \texttt{nbibtex} is about five times slower than classic \texttt{bibtex}. This slowdown is easy to observe when printing a bibliography of several thousand entries, but on a typical paper with fewer than fifty citations and a personal bibliography with a thousand entries, the pause is imperceptible. \subsection{Compatibility} I've made every effort to make \nbibtex\ compatible with \bibtex, so that \nbibtex\ can be used on existing papers and should produce the same output as \bibtex. Regrettably, compatibility means avoiding modern treatment of non-ASCII characters, such as are found in the ISO Latin-1 character set: classic \bibtex\ simply treats every non-ASCII character as a letter. \begin{itemize} \item It would be pleasant to try instead to set \nbibtex\ to use an ISO~8859-1 locale, but this leads to incompatible output: \nbibtex\ forces characters to lower case that \bibtex\ leaves alone. <>= do local locales = { "en_US", "en_AU", "en_CA", "en_GB", "fr_CA", "fr_CH", "fr_FR", } for _, l in pairs(locales) do if os.setlocale(l .. '.iso88591', 'ctype') then break end end end @ \item A much less pleasant alternative would be to abandon the support that Lua provides for distinguishing letters from nonletters and instead to try to do some sort of system-dependent character classification, as is done in \bibtex. I~don't have the stomach for it. \item The most principled solution I~can imagine would be to define a special ``\bibtex\ locale,'' whose sole purpose would be to guarantee compatibility with \bibtex. But this potential solution looks like a nightmare for software distribution. \item What I've done is proceed blithely with the user's current locale, throwing in a hack here or there as needed to guarantee compatibility with the test cases I~have in the default locale I~happen to use. The most notable case is [[bst.purify]], which is used to generate keys for sorting. \end{itemize} Expedience carries the day. Feh. @ \section{Parsing \texttt{.bib} files} This section reads the \texttt{.bib} file(s). <>= #include #include #include #include #include #include #include #include <> <> <> <> <> <> @ \subsection{Internal interfaces} \subsubsection {Data structures} For convenience in keeping function prototypes uncluttered, all state associated with reading a particular \bibtex\ file is stored in a single [[Bibreader]] abstraction. That state is divided into three groups: \begin{itemize} \item Fields that say what file we are reading and what is our position within that file \item A~buffer that holds one line of the \texttt{.bib} file currently being scanned \item State accessible from Lua: an interpreter; a list of strings from the \texttt{.bib} preamble, which is exposed to the client; a warning function provided by the client; and a macro table provided by the client and updated by [[@string]] commands \end{itemize} In the buffer, the meaningful characters are in the half-open interval $[{}[[buf]], [[lim]])$, and we reserve space for a sentinel at~[[lim]]. The invariant is that $[[buf]] \le [[cur]] < [[lim]]$ and $[[buf]]+[[bufsize]] \ge [[lim]]+1$. <>= typedef struct bibreader { const char *filename; /* name of the .bib file */ FILE *file; /* .bib file open for read */ int line_num; /* line number of the .bib file */ int entry_line; /* line number of last seen entry start */ unsigned char *buf, *cur, *lim; /* input buffer */ unsigned bufsize; /* size of buffer */ char entry_close; /* character expected to close current entry */ lua_State *L; int preamble; /* reference to preamble list of strings */ int warning; /* reference to universal warning function */ int macros; /* reference to macro table */ } *Bibreader; @ The [[is_id_char]] array is used to define a predicate that says whether a character is considered part of an identifier. <>= bool is_id_char[256]; /* needs initialization */ #define concat_char '#' /* used to concatenate parts of a field defn */ @ \subsubsection {Scanning} Most internal functions are devoted to some form of scanning. The model is a bit like Icon: scanning may succeed or fail, and it has a side effect on the state of the reader---in particular the value of the [[cur]] pointer, and possibly also the contents of the buffer. (Unlike Icon, there is no backtracking.) Success or failure is nonzero or zero but is represented using type [[bool]]. <>= typedef int bool; @ Function [[getline]] refills the buffer with a new line (and updates [[line_num]]), returning failure on end of file. <>= static bool getline(Bibreader rdr); @ Several scanning functions come in two flavors, which depend on what happends at the end of a line: the [[_getline]] flavor refills the buffer and keeps scanning; the normal flavor fails. Here are some functions that scan for combinations of particular characters, whitespace, and nonwhite characters. <>= static bool upto1(Bibreader rdr, char c); static bool upto1_getline(Bibreader rdr, char c); static void upto_white_or_1(Bibreader rdr, char c); static void upto_white_or_2(Bibreader rdr, char c1, char c2); static void upto_white_or_3(Bibreader rdr, char c1, char c2, char c3); static bool upto_nonwhite(Bibreader rdr); static bool upto_nonwhite_getline(Bibreader rdr); @ Because there is always whitespace at the end of a line, the [[upto_white_*]] flavor cannot fail. @ Some more sophisticated scanning functions. None attempts to return a value; instead each functions scans past the token in question, which the client can then find between the old and new values of the [[cur]] pointer. <>= static bool scan_identifier (Bibreader rdr, char c1, char c2, char c3); static bool scan_nonneg_integer (Bibreader rdr, unsigned *np); @ Continuing from low to high level, here are functions used to scan fields, about which more below: <>= static bool scan_and_buffer_a_field_token (Bibreader rdr, int key, luaL_Buffer *b); static bool scan_balanced_braces(Bibreader rdr, char close, luaL_Buffer *b); static bool scan_and_push_the_field_value (Bibreader rdr, int key); @ Two utility functions used after scanning: The [[lower_case]] function overwrites buffer characters with their lowercase equivalents. The [[strip_leading_and_trailing_space]] functions removes leading and trailing space characters from a string on top of the Lua stack. <>= static void lower_case(unsigned char *p, unsigned char *lim); static void strip_leading_and_trailing_space(lua_State *L); @ \subsubsection{Other functions} <>= static int get_bib_command_or_entry_and_process(Bibreader rdr); int luaopen_bibtex (lua_State *L); @ \subsubsection{Commands} In addition to database entries, a \texttt{.bib} file may contain the [[comment]], [[preamble]], and [[string]] commands. Each is implemented by a function of type [[Command]], which is associated with the name by [[find_command]]. <>= typedef bool (*Command)(Bibreader); static Command find_command(unsigned char *p, unsigned char *lim); static bool do_comment (Bibreader rdr); static bool do_preamble(Bibreader rdr); static bool do_string (Bibreader rdr); @ \subsubsection{Error handling} The [[warnv]] function is used to call the warning function supplied by the Lua client. In addition to the reader, it takes as arguments the number of results expected and the signature of the arguments. (The warning function may receive any combination of string~([[s]]), floating-point~([[f]]), and integer~([[d]]) arguments; the [[fmt]] string gives the sequence of the arguments that follow.) <>= static void warnv(Bibreader rdr, int nres, const char *fmt, ...); @ There's a lot of crap here to do with reporting errors. An error in a function called direct from Lua pushes [[false]] and a message and returns~[[2]]; an error in a boolean function pushes the same but returns failure to its caller. I~hope to replace this code with native Lua error handling ([[lua_error]]). <>= #define LERRPUSH(S) do { \ if (!lua_checkstack(rdr->L, 10)) assert(0); \ lua_pushboolean(rdr->L, 0); \ lua_pushfstring(rdr->L, "%s, line %d: ", rdr->filename, rdr->line_num); \ lua_pushstring(rdr->L, S); \ lua_concat(rdr->L, 2); \ } while(0) #define LERRFPUSH(S,A) do { \ if (!lua_checkstack(rdr->L, 10)) assert(0); \ lua_pushboolean(rdr->L, 0); \ lua_pushfstring(rdr->L, "%s, line %d: ", rdr->filename, rdr->line_num); \ lua_pushfstring(rdr->L, S, A); \ lua_concat(rdr->L, 2); \ } while(0) #define LERR(S) do { LERRPUSH(S); return 2; } while(0) #define LERRF(S,A) do { LERRFPUSH(S,A); return 2; } while(0) /* next: cases for Boolean functions */ #define LERRB(S) do { LERRPUSH(S); return 0; } while(0) #define LERRFB(S,A) do { LERRFPUSH(S,A); return 0; } while(0) @ \subsection{Reading a database entry} Syntactically, a \texttt{.bib} file is a sequence of entries, perhaps with a few \texttt{.bib} commands thrown in. Each entry consists of an at~sign, an entry type, and, between braces or parentheses and separated by commas, a database key and a list of fields. Each field consists of a field name, an equals sign, and nonempty list of field tokens separated by [[concat_char]]s. Each field token is either a nonnegative number, a macro name (like `jan'), or a brace-balanced string delimited by either double quotes or braces. Finally, case differences are ignored for all but delimited strings and database keys, and whitespace characters and ends-of-line may appear in all reasonable places (i.e., anywhere except within entry types, database keys, field names, and macro names); furthermore, comments may appear anywhere between entries (or before the first or after the last) as long as they contain no at~signs. This function reads a database entry and pushes it on the Lua stack. Any commands encountered before the database entry are executed. If no entry remains, the function returns~0. <>= #undef ready_tok #define ready_tok(RDR) do { \ if (!upto_nonwhite_getline(RDR)) \ LERR("Unexpected end of file"); \ } while(0) static int get_bib_command_or_entry_and_process(Bibreader rdr) { unsigned char *id, *key; int keyindex; bool (*command)(Bibreader); getnext: <> id = rdr->cur; if (!scan_identifier (rdr, '{', '(', '(')) LERR("Expected an entry type"); lower_case (id, rdr->cur); /* ignore case differences */ <cur]]})$ points to a command, execute it and go to [[getnext]]>> lua_pushlstring(rdr->L, (char *) id, rdr->cur - id); /* push entry type */ rdr->entry_line = rdr->line_num; ready_tok(rdr); <entry_close]]>> ready_tok(rdr); key = rdr->cur; <cur]] to next whitespace, comma, or possibly [[}]]>> lua_pushlstring(rdr->L, (char *) key, rdr->cur - key); /* push database key */ keyindex = lua_gettop(rdr->L); lua_newtable(rdr->L); /* push table of fields */ ready_tok(rdr); for (; *rdr->cur != rdr->entry_close; ) { <entry_close]])>> <> ready_tok(rdr); } rdr->cur++; /* skip past close of entry */ return 3; /* entry type, key, table of fields */ } @ <>= if (!upto1_getline(rdr, '@')) return 0; /* no more entries; return nil */ assert(*rdr->cur == '@'); rdr->cur++; /* skip the @ sign */ ready_tok(rdr); @ <cur]]})$ points to a command, execute it and go to [[getnext]]>>= command = find_command(id, rdr->cur); if (command) { if (!command(rdr)) return 2; /* command put (false, message) on Lua stack; we're done */ goto getnext; } @ An entry is delimited either by braces or by brackets; in order to recognize the correct closing delimiter, we put it in [[rdr->entry_close]]. <entry_close]]>>= if (*rdr->cur == '{') rdr->entry_close = '}'; else if (*rdr->cur == '(') rdr->entry_close = ')'; else LERR("Expected entry to open with { or ("); rdr->cur++; @ I'm not quite sure why stopping at~[[}]] is conditional on the closing delimiter in this way. <cur]] to next whitespace, comma, or possibly [[}]]>>= if (rdr->entry_close == '}') { upto_white_or_1(rdr, ','); } else { upto_white_or_2(rdr, ',', '}'); } @ At this point we're at a nonwhite token that is not the closing delimiter. If it's not a comma, there's big trouble---but even if it is, the database may be using comma as a terminator, in which case a closing delimiter signals the end of the entry. <entry_close]])>>= if (*rdr->cur == ',') { rdr->cur++; ready_tok(rdr); if (*rdr->cur == rdr->entry_close) { break; } } else { LERR("Expected comma or end of entry"); } @ The syntax for a field is \emph{identifier}\texttt{=}\emph{value}. The field name is forced to lower case. <>= if (id = rdr->cur, !scan_identifier (rdr, '=', '=', '=')) LERR("Expected a field name"); lower_case(id, rdr->cur); lua_pushlstring(rdr->L, (char *) id, rdr->cur - id); /* push field name */ ready_tok(rdr); if (*rdr->cur != '=') LERR("Expected '=' to follow field name"); rdr->cur++; /* skip over the [['=']] */ ready_tok(rdr); if (!scan_and_push_the_field_value(rdr, keyindex)) return 2; strip_leading_and_trailing_space(rdr->L); <> @ Official \bibtex\ does not permit duplicate entries for a single field. But in entries on the net, you see lots of such duplicates in such unofficial fields as \texttt{reffrom}. Because classic \bibtex\ doesn't report errors on fields that aren't advertised by the \texttt{.bst} file, we don't want to just blat out a whole bunch of warning messages. So instead we dump the problem on the warning function provided by the Lua client. We therefore can't simply set the field in the field table: we first look it up, and if it is nil, we set it; otherwise we warn. <>= lua_pushvalue(rdr->L, -2); /* push key */ lua_gettable(rdr->L, -4); if (lua_isnil(rdr->L, -1)) { lua_pop(rdr->L, 1); lua_settable(rdr->L, -3); } else { lua_pop(rdr->L, 1); /* off comes old value */ warnv(rdr, 0, "ssdsss", /* tag, file, line, cite-key, field, newvalue */ "extra field", rdr->filename, rdr->line_num, lua_tostring(rdr->L, keyindex), lua_tostring(rdr->L, -2), lua_tostring(rdr->L, -1)); lua_pop(rdr->L, 2); /* off come key and new value */ } @ \subsection{Scanning functions} \subsubsection{Scanning functions for fields} @ While scanning fields, we are not operating in a toplevel function, so the error handling for [[ready_tok]] needs to be a bit different. <>= #undef ready_tok #define ready_tok(RDR) do { \ if (!upto_nonwhite_getline(RDR)) \ LERRB("Unexpected end of file"); \ } while(0) @ Each field value is accumulated into a [[luaL_Buffer]] from the Lua auxiliary library. The buffer is always called~[[b]]; for conciseness, we use the macro [[copy_char]] to add a character to it. <>= #define copy_char(C) luaL_putchar(b, (C)) @ A field value is a sequence of one or more tokens separated by a [[concat_char]] ([[#]]~mark). A~precondition for calling [[scan_and_push_the_field_value]] is that [[rdr]] is pointing at a nonwhite character. <>= static bool scan_and_push_the_field_value (Bibreader rdr, int key) { luaL_Buffer field; luaL_checkstack(rdr->L, 10, "Not enough Lua stack to parse bibtex database"); luaL_buffinit(rdr->L, &field); for (;;) { if (!scan_and_buffer_a_field_token(rdr, key, &field)) return 0; ready_tok(rdr); /* cur now points to [[concat_char]] or end of field */ if (*rdr->cur != concat_char) break; else { rdr->cur++; ready_tok(rdr); } } luaL_pushresult(&field); return 1; } @ Because [[ready_tok]] can [[return]] in case of error, we can't write \begin{quote} [[for(; *rdr->cur == concat_char; rdr->cur++, ready_tok(rdr))]]. \end{quote} @ A field token is either a nonnegative number, a macro name (like `jan'), or a brace-balanced string delimited by either double quotes or braces. Thus there are four possibilities for the first character of the field token: If it's a left brace or a double quote, the token (with balanced braces, up to the matchin closing delimiter) is a string; if it's a digit, the token is a number; if it's anything else, the token is a macro name (and should thus have been defined by either the \texttt{.bst}-file's \texttt{macro} command or the \texttt{.bib}-file's \texttt{string} command). This function returns [[false]] if there was a serious syntax error. <>= static bool scan_and_buffer_a_field_token (Bibreader rdr, int key, luaL_Buffer *b) { unsigned char *p; unsigned number; *rdr->lim = ' '; switch (*rdr->cur) { case '{': case '"': return scan_balanced_braces(rdr, *rdr->cur == '{' ? '}' : '"', b); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': p = rdr->cur; scan_nonneg_integer(rdr, &number); luaL_addlstring(b, (char *)p, rdr->cur - p); return 1; default: /* named macro */ p = rdr->cur; if (!scan_identifier(rdr, ',', rdr->entry_close, concat_char)) LERRB("Expected a field part"); lower_case (p, rdr->cur); /* ignore case differences */ /* missing warning of macro name used in its own definition */ lua_pushlstring(rdr->L, (char *) p, rdr->cur - p); /* stack: name */ lua_getref(rdr->L, rdr->macros); /* stack: name macros */ lua_insert(rdr->L, -2); /* stack: name macros name */ lua_gettable(rdr->L, -2); /* stack: name defn */ lua_remove(rdr->L, -2); /* stack: defn */ <> return 1; } } @ Here's another warning that's kicked out to the client. Reason: standard \bibtex\ complains only if it intends to use the entry in question. <>= { int t = lua_gettop(rdr->L); if (lua_isnil(rdr->L, -1)) { lua_pop(rdr->L, 1); lua_pushlstring(rdr->L, (char *) p, rdr->cur - p); warnv(rdr, 1, "ssdss", /* tag, file, line, key, macro */ "undefined macro", rdr->filename, rdr->line_num, key ? lua_tostring(rdr->L, key) : NULL, lua_tostring(rdr->L, -1)); if (lua_isstring(rdr->L, -1)) luaL_addvalue(b); else lua_pop(rdr->L, 1); lua_pop(rdr->L, 1); } else { luaL_addvalue(b); } assert(lua_gettop(rdr->L) == t-1); } @ This \texttt{.bib}-specific function scans and buffers a string with balanced braces, stopping just past the matching [[close]]. The original \bibtex\ tries to optimize the common case of a field with no internal braces; I~don't. A~precondition for calling this function is that [[rdr->cur]] point at the opening delimiter. Whitespace is compressed to a single space character. <>= static int scan_balanced_braces(Bibreader rdr, char close, luaL_Buffer *b) { unsigned char *p, *cur, c; int braces = 0; /* number of currently open braces *inside* string */ rdr->cur++; /* scan past left delimiter */ *rdr->lim = ' '; if (isspace(*rdr->cur)) { copy_char(' '); ready_tok(rdr); } for (;;) { p = rdr->cur; upto_white_or_3(rdr, '}', '{', close); cur = rdr->cur; for ( ; p < cur; p++) /* copy nonwhite, nonbrace characters */ copy_char(*p); *rdr->lim = ' '; c = *cur; /* will be whitespace if at end of line */ <> } } @ Beastly complicated: \begin{itemize} \item Space is compressed and scanned past. \item A closing delimiter ends the scan at brace level~0 and otherwise is buffered. \item Braces adjust the [[braces]] count. \end{itemize} <>= if (isspace(c)) { copy_char(' '); ready_tok(rdr); } else { rdr->cur++; if (c == close) { if (braces == 0) { luaL_pushresult(b); return 1; } else { copy_char(c); if (c == '}') braces--; } } else if (c == '{') { braces++; copy_char(c); } else { assert(c == '}'); if (braces > 0) { braces--; copy_char(c); } else { luaL_pushresult(b); /* restore invariant */ LERRB("Unexpected '}'"); } } } @ \subsubsection {Low-level scanning functions} Scan the reader up to the character requested or end of line; fails if not found. <>= static bool upto1(Bibreader rdr, char c) { unsigned char *p = rdr->cur; unsigned char *lim = rdr->lim; *lim = c; while (*p != c) p++; rdr->cur = p; return p < lim; } @ Scan the reader up to the character requested or end of file; fails if not found. <>= static int upto1_getline(Bibreader rdr, char c) { while (!upto1(rdr, c)) if (!getline(rdr)) return 0; return 1; } @ Scan the reader up to the next whitespace or the one character requested. Always succeeds, because the end of the line is whitespace. <>= static void upto_white_or_1(Bibreader rdr, char c) { unsigned char *p = rdr->cur; unsigned char *lim = rdr->lim; *lim = c; while (*p != c && !isspace(*p)) p++; rdr->cur = p; } @ Scan the reader up to the next whitespace or either of two characters requested. <>= static void upto_white_or_2(Bibreader rdr, char c1, char c2) { unsigned char *p = rdr->cur; unsigned char *lim = rdr->lim; *lim = c1; while (*p != c1 && *p != c2 && !isspace(*p)) p++; rdr->cur = p; } @ Scan the reader up to the next whitespace or any of three characters requested. <>= static void upto_white_or_3(Bibreader rdr, char c1, char c2, char c3) { unsigned char *p = rdr->cur; unsigned char *lim = rdr->lim; *lim = c1; while (!isspace(*p) && *p != c1 && *p != c2 && *p != c3) p++; rdr->cur = p; } @ This function scans over whitespace characters, stopping either at the first nonwhite character or the end of the line, respectively returning [[true]] or [[false]]. <>= static bool upto_nonwhite(Bibreader rdr) { unsigned char *p = rdr->cur; unsigned char *lim = rdr->lim; *lim = 'x'; while (isspace(*p)) p++; rdr->cur = p; return p < lim; } @ Scan past whitespace up to end of file if needed; returns true iff nonwhite character found. <>= static int upto_nonwhite_getline(Bibreader rdr) { while (!upto_nonwhite(rdr)) if (!getline(rdr)) return 0; return 1; } @ \subsubsection{Actual input} <>= static bool getline(Bibreader rdr) { char *result; unsigned char *buf = rdr->buf; int n; result = fgets((char *)buf, rdr->bufsize, rdr->file); if (result == NULL) return 0; rdr->line_num++; for (n = strlen((char *)buf); buf[n-1] != '\n'; n = strlen((char *)buf)) { /* failed to get whole line */ rdr->bufsize *= 2; buf = rdr->buf = realloc(rdr->buf, rdr->bufsize); assert(buf); if (fgets((char *)buf+n,rdr->bufsize-n,rdr->file)==NULL) { n = strlen((char *)buf) + 1; /* -1 below is incorrect without newline */ break; /* file ended without a newline */ } } rdr->cur = buf; rdr->lim = buf+n-1; /* trailing newline not in string */ return 1; } @ \subsubsection{Medium-level scanning functions} This procedure scans for an identifier, stopping at the first [[illegal_id_char]], or stopping at the first character if it's [[numeric]]. It sets the global variable [[scan_result]] to [[id_null]] if the identifier is null, else to [[white_adjacent]] if it ended at a whitespace character or an end-of-line, else to [[specified_char_adjacent]] if it ended at one of [[char1]] or [[char2]] or [[char3]], else to [[other_char_adjacent]] if it ended at a nonspecified, nonwhitespace [[illegal_id_char]]. By convention, when some calling code really wants just one or two ``specified'' characters, it merely repeats one of the characters. <>= static int scan_identifier (Bibreader rdr, char c1, char c2, char c3) { unsigned char *p, *orig, c; orig = p = rdr->cur; if (!isdigit(*p)) { /* scan until end-of-line or an [[illegal_id_char]] */ *rdr->lim = ' '; /* an illegal id character and also white space */ while (is_id_char[*p]) p++; } c = *p; if (p > rdr->cur && (isspace(c) || c == c1 || c == c2 || c == c3)) { rdr->cur = p; return 1; } else { return 0; } } @ This function scans for a nonnegative integer, stopping at the first nondigit; it writes the resulting integer through [[np]]. It returns [[true]] if the token was a legal nonnegative integer (i.e., consisted of one or more digits). <>= static bool scan_nonneg_integer (Bibreader rdr, unsigned *np) { unsigned char *p = rdr->cur; unsigned n = 0; *rdr->lim = ' '; /* sentinel */ while (isdigit(*p)) { n = n * 10 + (*p - '0'); p++; } if (p == rdr->cur) return 0; /* no digits */ else { rdr->cur = p; *np = n; return 1; } } @ This procedure scans for an integer, stopping at the first nondigit; it sets the value of [[token_value]] accordingly. It returns [[true]] if the token was a legal integer (i.e., consisted of an optional [[minus_sign]] followed by one or more digits). <>= static bool scan_integer (Bibreader rdr) { unsigned char *p = rdr->cur; int n = 0; int sign = 0; /* number of characters of sign */ *rdr->lim = ' '; /* sentinel */ if (*p == '-') { sign = 1; p++; } while (isdigit(*p)) { n = n * 10 + (*p - '0'); p++; } if (p == rdr->cur) return 0; /* no digits */ else { rdr->cur = p; return 1; } } @ \subsection{C~utility functions} @ <>= static void lower_case(unsigned char *p, unsigned char *lim) { for (; p < lim; p++) *p = tolower(*p); } @ <>= static void strip_leading_and_trailing_space(lua_State *L) { const char *p; int n; assert(lua_isstring(L, -1)); p = lua_tostring(L, -1); n = lua_strlen(L, -1); if (n > 0 && (isspace(*p) || isspace(p[n-1]))) { while(n > 0 && isspace(*p)) p++, n--; while(n > 0 && isspace(p[n-1])) n--; lua_pushlstring(L, p, n); lua_remove(L, -2); } } @ \subsection{Implementations of the \bibtex\ commands} On encountering an [[@]]\emph{identifier}, we ask if the \emph{identifier} stands for a command and if so, return that command. <>= static Command find_command(unsigned char *p, unsigned char *lim) { int n = lim - p; assert(lim > p); #define match(S) (!strncmp(S, (char *)p, n) && (S)[n] == '\0') switch(*p) { case 'c' : if (match("comment")) return do_comment; else break; case 'p' : if (match("preamble")) return do_preamble; else break; case 's' : if (match("string")) return do_string; else break; } return (Command)0; } @ %% \webindexsort{database-file commands}{\quad \texttt{comment}} The \texttt{comment} command is implemented for SCRIBE compatibility. It's not really needed because \BibTeX\ treats (flushes) everything not within an entry as a comment anyway. <>= static bool do_comment(Bibreader rdr) { return 1; } @ %% \webindexsort{database-file commands}{\quad \texttt{preamble}} The \texttt{preamble} command lets a user have \TeX\ stuff inserted (by the standard styles, at least) directly into the \texttt{.bbl} file. It is intended primarily for allowing \TeX\ macro definitions used within the bibliography entries (for better sorting, for example). One \texttt{preamble} command per \texttt{.bib} file should suffice. A \texttt{preamble} command has either braces or parentheses as outer delimiters. Inside is the preamble string, which has the same syntax as a field value: a nonempty list of field tokens separated by [[concat_char]]s. There are three types of field tokens---nonnegative numbers, macro names, and delimited strings. This module does all the scanning (that's not subcontracted), but the \texttt{.bib}-specific scanning function [[scan_and_push_the_field_value_and_eat_white]] actually stores the value. <>= static bool do_preamble(Bibreader rdr) { ready_tok(rdr); <entry_close]]>> ready_tok(rdr); lua_rawgeti(rdr->L, LUA_REGISTRYINDEX, rdr->preamble); lua_pushnumber(rdr->L, lua_objlen(rdr->L, -1) + 1); if (!scan_and_push_the_field_value(rdr, 0)) return 0; ready_tok(rdr); if (*rdr->cur != rdr->entry_close) LERRFB("Missing '%c' in preamble command", rdr->entry_close); rdr->cur++; lua_settable(rdr->L, -3); lua_pop(rdr->L, 1); /* remove preamble */ return 1; } @ %% \webindexsort{database-file commands}{\quad \texttt{string}} The \texttt{string} command is implemented both for SCRIBE compatibility and for allowing a user: to override a \texttt{.bst}-file \texttt{macro} command, to define one that the \texttt{.bst} file doesn't, or to engage in good, wholesome, typing laziness. The \texttt{string} command does mostly the same thing as the \texttt{.bst}-file's \texttt{macro} command (but the syntax is different and the \texttt{string} command compresses white space). In fact, later in this program, the term ``macro'' refers to either a \texttt{.bst} ``macro'' or a \texttt{.bib} ``string'' (when it's clear from the context that it's not a \texttt{WEB} macro). A \texttt{string} command has either braces or parentheses as outer delimiters. Inside is the string's name (it must be a legal identifier, and case differences are ignored---all upper-case letters are converted to lower case), then an equals sign, and the string's definition, which has the same syntax as a field value: a nonempty list of field tokens separated by [[concat_char]]s. There are three types of field tokens---nonnegative numbers, macro names, and delimited strings. <>= static bool do_string(Bibreader rdr) { unsigned char *id; int keyindex; ready_tok(rdr); <entry_close]]>> ready_tok(rdr); id = rdr->cur; if (!scan_identifier(rdr, '=', '=', '=')) LERRB("Expected a string name followed by '='"); lower_case(id, rdr->cur); lua_pushlstring(rdr->L, (char *)id, rdr->cur - id); keyindex = lua_gettop(rdr->L); ready_tok(rdr); if (*rdr->cur != '=') LERRB("Expected a string name followed by '='"); rdr->cur++; ready_tok(rdr); if (!scan_and_push_the_field_value(rdr, keyindex)) return 0; ready_tok(rdr); if (*rdr->cur != rdr->entry_close) LERRFB("Missing '%c' in macro definition", rdr->entry_close); rdr->cur++; lua_getref(rdr->L, rdr->macros); lua_insert(rdr->L, -3); lua_settable(rdr->L, -3); lua_pop(rdr->L, 1); return 1; } @ \subsection{Interface to Lua} First, we define Lua access to a reader. <>= static Bibreader checkreader(lua_State *L, int index) { return luaL_checkudata(L, index, "bibtex.reader"); } @ The reader's [[__index]] metamethod provides access to the [[entry_line]] and [[preamble]] values as if they were fields of the Lua table. It also provides access to the [[next]] and [[close]] methods of the reader object. <>= static int reader_meta_index(lua_State *L) { Bibreader rdr = checkreader(L, 1); const char *key; if (!lua_isstring(L, 2)) return 0; key = lua_tostring(L, 2); if (!strcmp(key, "next")) lua_pushcfunction(L, next_entry); else if (!strcmp(key, "entry_line")) lua_pushnumber(L, rdr->entry_line); else if (!strcmp(key, "preamble")) lua_rawgeti(L, LUA_REGISTRYINDEX, rdr->preamble); else if (!strcmp(key, "close")) lua_pushcfunction(L, closereader); else lua_pushnil(L); return 1; } @ Here are the functions exported in the [[bibtex]] module: <>= static int openreader(lua_State *L); static int next_entry(lua_State *L); static int closereader(lua_State *L); <>= static const struct luaL_reg bibtexlib [] = { {"open", openreader}, {"close", closereader}, {"next", next_entry}, {NULL, NULL} }; @ \newcommand\nt[1]{\rmfamily{\emph{#1}}} \newcommand\optional[1]{\rmfamily{[}#1\rmfamily{]}} To create a reader, we call \begin{quote} \texttt{openreader(\nt{filename}, \optional{\nt{macro-table}, \optional{\nt{warn-function}}})} \end{quote} The warning function will be called in one of the following ways: \begin{itemize} \item warn([["extra field"]], \emph{file}, \emph{line}, \emph{citation-key}, \emph{field-name}, \emph{field-value}) Duplicate definition of a field in a single entry. \item warn([["undefined macro"]], \emph{file}, \emph{line}, \emph{citation-key}, \emph{macro-name}) Use of an undefined macro. \end{itemize} <>= #define INBUF 128 /* initial size of input buffer */ /* filename * macro table * warning function -> reader */ static int openreader(lua_State *L) { const char *filename = luaL_checkstring(L, 1); FILE *f = fopen(filename, "r"); Bibreader rdr; if (!f) { lua_pushnil(L); lua_pushfstring(L, "Could not open file '%s'", filename); return 2; } <> rdr = lua_newuserdata(L, sizeof(*rdr)); luaL_getmetatable(L, "bibtex.reader"); lua_setmetatable(L, -2); rdr->line_num = 0; rdr->buf = rdr->cur = rdr->lim = malloc(INBUF); rdr->bufsize = INBUF; rdr->file = f; rdr->filename = malloc(lua_strlen(L, 1)+1); assert(rdr->filename); strncpy((char *)rdr->filename, filename, lua_strlen(L, 1)+1); rdr->L = L; lua_newtable(L); rdr->preamble = luaL_ref(L, LUA_REGISTRYINDEX); lua_pushvalue(L, 2); rdr->macros = luaL_ref(L, LUA_REGISTRYINDEX); lua_pushvalue(L, 3); rdr->warning = luaL_ref(L, LUA_REGISTRYINDEX); return 1; } @ <>= if (lua_type(L, 2) == LUA_TNONE) lua_newtable(L); if (lua_type(L, 3) == LUA_TNONE) lua_pushnil(L); else if (!lua_isfunction(L, 3)) luaL_error(L, "Warning value to bibtex.open is not a function"); @ Reader method [[next_entry]] takes no parameters. On success it returns a triple (\emph{type}, \emph{key}, \emph{field-table}). On error it returns (\texttt{false}, \emph{message}). On end of file it returns nothing. <>= static int next_entry(lua_State *L) { Bibreader rdr = checkreader(L, 1); if (!rdr->file) luaL_error(L, "Tried to read from closed bibtex.reader"); return get_bib_command_or_entry_and_process(rdr); } @ Closing a reader recovers its resources; the [[file]] field of a closed reader is [[NULL]]. <>= static int closereader(lua_State *L) { Bibreader rdr = checkreader(L, 1); if (!rdr->file) luaL_error(L, "Tried to close closed bibtex.reader"); fclose(rdr->file); rdr->file = NULL; free(rdr->buf); rdr->buf = rdr->cur = rdr->lim = NULL; rdr->bufsize = 0; free((void*)rdr->filename); rdr->filename = NULL; rdr->L = NULL; luaL_unref(L, LUA_REGISTRYINDEX, rdr->preamble); rdr->preamble = 0; luaL_unref(L, LUA_REGISTRYINDEX, rdr->warning); rdr->warning = 0; luaL_unref(L, LUA_REGISTRYINDEX, rdr->macros); rdr->macros = 0; return 0; } @ To help implement the call to the warning function, we have [[warnv]]. If there is no warning function, we return the nubmer of nils specified by [[nres]]. <>= static void warnv(Bibreader rdr, int nres, const char *fmt, ...) { const char *p; va_list vl; lua_rawgeti(rdr->L, LUA_REGISTRYINDEX, rdr->warning); if (lua_isnil(rdr->L, -1)) { lua_pop(rdr->L, 1); while (nres-- > 0) lua_pushnil(rdr->L); } else { va_start(vl, fmt); for (p = fmt; *p; p++) switch (*p) { case 'f': lua_pushnumber(rdr->L, va_arg(vl, double)); break; case 'd': lua_pushnumber(rdr->L, va_arg(vl, int)); break; case 's': { const char *s = va_arg(vl, char *); if (s == NULL) lua_pushnil(rdr->L); else lua_pushstring(rdr->L, s); break; } default: luaL_error(rdr->L, "invalid parameter type %c", *p); } lua_call(rdr->L, p - fmt, nres); va_end(vl); } } @ Here's where the library is initialized. This is the only exported function in the whole file. <>= int luaopen_bibtex (lua_State *L) { luaL_newmetatable(L, "bibtex.reader"); lua_pushstring(L, "__index"); lua_pushcfunction(L, reader_meta_index); /* pushes the index method */ lua_settable(L, -3); /* metatable.__index = metatable */ luaL_register(L, "bibtex", bibtexlib); <> return 1; } @ In an identifier, we can accept any printing character except the ones listed in the [[nonids]] string. <>= { unsigned c; static unsigned char *nonids = (unsigned char *)"\"#%'(),={} \t\n\f"; unsigned char *p; for (c = 0; c <= 0377; c++) is_id_char[c] = 1; for (c = 0; c <= 037; c++) is_id_char[c] = 0; for (p = nonids; *p; p++) is_id_char[*p] = 0; } @ \subsection{Main function for the nbib commands} This code will is the standalone main function for all the nbib commands. \nextchunklabel{c-main} <>= #include #include #include #include #include extern int luaopen_bibtex(lua_State *L); extern int luaopen_boyer_moore (lua_State *L); int main (int argc, char *argv[]) { int i, rc; lua_State *L = luaL_newstate(); static const char* files[] = { SHARE "/bibtex.lua", SHARE "/natbib.nbs" }; #define OPEN(N) lua_pushcfunction(L, luaopen_ ## N); lua_call(L, 0, 0) OPEN(base); OPEN(table); OPEN(io); OPEN(package); OPEN(string); OPEN(bibtex); OPEN(boyer_moore); for (i = 0; i < sizeof(files)/sizeof(files[0]); i++) { if (luaL_dofile(L, files[i])) { fprintf(stderr, "%s: error loading configuration file %s\n", argv[0], files[i]); exit(2); } } lua_pushstring(L, "bibtex"); lua_gettable(L, LUA_GLOBALSINDEX); lua_pushstring(L, "main"); lua_gettable(L, -2); lua_newtable(L); for (i = 0; i < argc; i++) { lua_pushnumber(L, i); lua_pushstring(L, argv[i]); lua_settable(L, -3); } rc = lua_pcall(L, 1, 0, 0); if (rc) { fprintf(stderr, "Call failed: %s\n", lua_tostring(L, -1)); lua_pop(L, 1); } lua_close(L); return rc; } @ \section{Implementation of \texttt{nbibtex}} From here out, everything is written in Lua (\url{http://www.lua.org}). The main module is [[bibtex]], and style-file support is in the submodule [[bibtex.bst]]. Each has a [[doc]] submodule, which is intended as machine-readable documentation. <>= <> local config = config or { } --- may be defined by config process local workaround = { badbibs = true, --- don't look at bad .bib files that come with teTeX } local bst = { } bibtex.bst = bst bibtex.doc = { } bibtex.bst.doc = { } bibtex.doc.bst = '# table of functions used to write style files' @ Not much code is executed during startup, so the main issue is to manage declaration before use. I~have a few forward declarations in [[<>]]; otherwise, count only on ``utility'' functions being declared before ``exported'' ones. <>= local find = string.find <> <> <> <> return bibtex @ The Lua code relies on the C~code. How we get the C~code depends on how \texttt{bibtex.lua} is used; there are two alternatives: \begin{itemize} \item In the distribution, \texttt{bibtex.lua} is loaded by the C~code in chunk~\subpageref{c-main}, which defines the [[bibtex]] module. \item For standalone testing purposes, \texttt{bibtex.lua} can be loaded directly into an interactive Lua interpreter, in which case it loads the [[bibtex]] module as a shared library. \end{itemize} <>= if not bibtex then require 'nrlib' nrlib.load 'bibtex' end @ \subsection{Error handling, warning messages, and logging} <>= local function printf (...) return io.stdout:write(string.format(...)) end local function eprintf(...) return io.stderr:write(string.format(...)) end @ I have to figure out what to do about errors --- the current code is bogus. Among other things, I should be setting error levels. <>= local function bibwarnf (...) eprintf(...); eprintf('\n') end local function biberrorf(...) eprintf(...); eprintf('\n') end local function bibfatalf(...) eprintf(...); eprintf('\n'); os.exit(2) end @ Logging? What logging? <>= local function logf() end @ \subsubsection{Support for delayed warnings} Like classic \bibtex, \nbibtex\ typically warns only about entries that are actually used. This functionality is implemented by function [[hold_warning]], which keeps warnings on ice until they are either returned by [[held_warnings]] or thrown away by [[drop_warning]]. The function [[emit_warning]] emits a warning message eagerly when called; it is used to issue warnings about entries we actually use, or if the [[-strict]] option is given, to issue every warning. <>= local hold_warning -- function suitable to pass to bibtex.open; holds local emit_warning -- function suitable to pass to bibtex.open; prints local held_warnings -- returns nil or list of warnings since last call local drop_warnings -- drops warnings local extra_ok = { reffrom = true } -- set of fields about which we should not warn of duplicates do local warnfuns = { } warnfuns["extra field"] = function(file, line, cite, field, newvalue) if not extra_ok[field] then bibwarnf("Warning--I'm ignoring %s's extra \"%s\" field\n--line %d of file %s\n", cite, field, line, file) end end warnfuns["undefined macro"] = function(file, line, cite, macro) bibwarnf("Warning--string name \"%s\" is undefined\n--line %d of file %s\n", macro, line, file) end function emit_warning(tag, ...) return assert(warnfuns[tag])(...) end local held function hold_warning(...) held = held or { } table.insert(held, { ... }) end function held_warnings() local h = held held = nil return h end function drop_warnings() held = nil end end @ \subsection{Miscellany} All this stuff is dubious. <>= function table.copy(t) local u = { } for k, v in pairs(t) do u[k] = v end return u end @ <>= local function open(f, m, what) local f, msg = io.open(f, m) if f then return f else (what or bibfatalf)('Could not open file %s: %s', f, msg) end end @ <>= local function entries(rdr, empty) assert(not empty) return function() return rdr:next() end end bibtex.entries = entries bibtex.doc.entries = 'reader -> iterator # generate entries' @ \subsection{Internal documentation} We attempt to document everything! <>= function bibtex:show_doc(title) local out = bst.writer(io.stdout, 5) local function outf(...) return out:write(string.format(...)) end local allkeys, dkeys = { }, { } for k, _ in pairs(self) do table.insert(allkeys, k) end for k, _ in pairs(self.doc) do table.insert(dkeys, k) end table.sort(allkeys) table.sort(dkeys) for i = 1, table.getn(dkeys) do outf("%s.%-12s : %s\n", title, dkeys[i], self.doc[dkeys[i]]) end local header for i = 1, table.getn(allkeys) do local k = allkeys[i] if k ~= "doc" and k ~= "show_doc" and not self.doc[k] then if not header then outf('Undocumented keys in table %s:', title) header = true end outf(' %s', k) end end if header then outf('\n') end end bibtex.bst.show_doc = bibtex.show_doc @ Here is the documentation for what's defined in C~code: <>= bibtex.doc.open = 'filename -> reader # open a reader for a .bib file' bibtex.doc.close = 'reader -> unit # close open reader' bibtex.doc.next = 'reader -> type * key * field table # read an entry' @ \subsection{Main function for \texttt{nbibtex}} Actually, the same main function does for both \texttt{nbibtex} and \texttt{nbibfind}; depending on how the program is called, it delegates to [[bibtex.bibtex]] or [[bibtex.run_find]]. <>= bibtex.doc.main = 'string list -> unit # main program that dispatches on argv[0]' function bibtex.main(argv) if argv[1] == '-doc' then -- undocumented internal doco bibtex:show_doc('bibtex') bibtex.bst:show_doc('bst') elseif find(argv[0], 'bibfind$') then return bibtex.run_find(argv) elseif find(argv[0], 'bibtex$') then return bibtex.bibtex(argv) else error("Call me something ending in 'bibtex' or 'bibfind'; when called\n ".. argv[0]..", I don't know what to do") end end @ <>= local permissive = false -- nbibtex extension (ignore missing .bib files, etc.) local strict = false -- complain eagerly about errors in .bib files local min_crossrefs = 2 -- how many crossref's required to add an entry? local output_name = nil -- output file if not default local bib_out = false -- output .bib format bibtex.doc.bibtex = 'string list -> unit # main program for nbibtex' function bibtex.bibtex(argv) <> if table.getn(argv) < 1 then bibfatalf('Usage: %s [-permissive|-strict|...] filename[.aux] [bibfile...]', argv[0]) end local auxname = table.remove(argv, 1) local basename = string.gsub(string.gsub(auxname, '%.aux$', ''), '%.$', '') auxname = basename .. '.aux' local bblname = output_name or (basename .. '.bbl') local blgname = basename .. (output_name and '.nlg' or '.blg') local blg = open(blgname, 'w') -- Here's what we accumulate by reading .aux files: local bibstyle -- the bibliography style local bibfiles = { } -- list of files named in order of file local citekeys = { } -- list of citation keys from .aux -- (in order seen, mixed case, no duplicates) local cited_star = false -- .tex contains \cite{*} or \nocite{*} <> if table.getn(argv) > 0 then -- override the bibfiles listed in the .aux file bibfiles = argv end <> <> blg:close() end @ Options are straightforward. <>= while table.getn(argv) > 0 and find(argv[1], '^%-') do if argv[1] == '-terse' then -- do nothing elseif argv[1] == '-permissive' then permissive = true elseif argv[1] == '-strict' then strict = true elseif argv[1] == '-min-crossrefs' and find(argv[2], '^%d+$') then min_crossrefs = assert(tonumber(argv[2])) table.remove(argv, 1) elseif string.find(argv[1], '^%-min%-crossrefs=(%d+)$') then local _, _, n = string.find(argv[1], '^%-min%-crossrefs=(%d+)$') min_crossrefs = assert(tonumber(n)) elseif string.find(argv[1], '^%-min%-crossrefs') then biberrorf("Ill-formed option %s", argv[1]) elseif argv[1] == '-o' then output_name = assert(argv[2]) table.remove(argv, 1) elseif argv[1] == '-bib' then bib_out = true elseif argv[1] == '-help' then help() elseif argv[1] == '-version' then printf("nbibtex version \n") os.exit(0) else biberrorf('Unknown option %s', argv[1]) help(2) end table.remove(argv, 1) end @ <>= local function help(code) printf([[ Usage: nbibtex [OPTION]... AUXFILE[.aux] [BIBFILE...] Write bibliography for entries in AUXFILE to AUXFILE.bbl. Options: -bib write output as BibTeX source -help display this help and exit -o FILE write output to FILE (- for stdout) -min-crossrefs=NUMBER include item after NUMBER cross-refs; default 2 -permissive allow missing bibfiles and (some) duplicate entries -strict complain about any ill-formed entry we see -version output version information and exit Home page at http://www.eecs.harvard.edu/~nr/nbibtex. Email bug reports to nr@eecs.harvard.edu. ]]) os.exit(code or 0) end @ \subsection{Reading all the aux files and validating the inputs} We pay attention to four commands: [[\@input]], [[\bibdata]], [[\bibstyle]], and [[\citation]]. <>= do local commands = { } -- table of commands we recognize in .aux files local function do_nothing() end -- default for unrecognized commands setmetatable(commands, { __index = function() return do_nothing end }) <> commands['@input'](auxname) -- reads all the variables end @ <>= do local auxopened = { } --- map filename to true/false commands['@input'] = function (auxname) if not find(auxname, '%.aux$') then bibwarnf('Name of auxfile "%s" does not end in .aux\n', auxname) end <> local aux = open(auxname, 'r') logf('Top-level aux file: %s\n', auxname) for line in aux:lines() do local _, _, cmd, arg = find(line, '^\\([%a%@]+)%s*{([^%}]+)}%s*$') if cmd then commands[cmd](arg) end end aux:close() end end <>= if auxopened[auxname] then error("File " .. auxname .. " cyclically \\@input's itself") else auxopened[auxname] = true end @ \bibtex\ expects \texttt{.bib} files to be separated by commas. They are forced to lower case, should have no spaces in them, and the [[\bibdata]] command should appear exactly once. <>= do local bibdata_seen = false function commands.bibdata(arg) assert(not bibdata_seen, [[LaTeX provides multiple \bibdata commands]]) bibdata_seen = true for bib in string.gmatch(arg, '[^,]+') do assert(not find(bib, '%s'), 'bibname from LaTeX contains whitespace') table.insert(bibfiles, string.lower(bib)) end end end @ The style should be unique, and it should be known to us. <>= function commands.bibstyle(stylename) if bibstyle then biberrorf('Illegal, another \\bibstyle command') else bibstyle = bibtex.style(string.lower(stylename)) if not bibstyle then bibfatalf('There is no nbibtex style called "%s"') end end end @ We accumulated cited keys in [[citekeys]]. Keys may be duplicated, but the input should not contain two keys that differ only in case. <>= do local keys_seen, lower_seen = { }, { } -- which keys have been seen already function commands.citation(arg) for key in string.gmatch(arg, '[^,]+') do assert(not find(key, '%s'), 'Citation key {' .. key .. '} from LaTeX contains whitespace') if key == '*' then cited_star = true elseif not keys_seen[key] then --- duplicates are OK keys_seen[key] = true local low = string.lower(key) <> if not cited_star then -- no more insertions after the star table.insert(citekeys, key) -- must be key, not low, -- so that keys in .bbl match .aux end end end end end @ <>= if lower_seen[low] then biberrorf("Citation key '%s' inconsistent with earlier key '%s'", key, lower_seen[low]) else lower_seen[low] = key end @ After reading the variables, we do a little validation. I~can't seem to make up my mind what should be done incrementally while things are being read. <>= if not bibstyle then bibfatalf('No \\bibliographystyle in original LaTeX') end if table.getn(bibfiles) == 0 then bibfatalf('No .bib files specified --- no \\bibliography in original LaTeX?') end if table.getn(citekeys) == 0 and not cited_star then biberrorf('No citations in document --- empty bibliography') end do --- check for duplicate bib entries local i = 1 local seen = { } while i <= table.getn(bibfiles) do local bib = bibfiles[i] if seen[bib] then bibwarnf('Multiple references to bibfile "%s"', bib) table.remove(bibfiles, i) else i = i + 1 end end end @ \subsection{Reading the entries from all the \bibtex\ files} These are diagnostics that might be written to a log. <>= logf("bibstyle == %q\n", bibstyle.name) logf("consult these bibfiles:") for _, bib in ipairs(bibfiles) do logf(" %s", bib) end logf("\ncite these papers:\n") for _, key in ipairs(citekeys) do logf(" %s\n", key) end if cited_star then logf(" and everything else in the database\n") end @ @ Each bibliography file is opened with [[openbib]]. Unlike classic \bibtex, we can't simply select the first entry matching a citation key. Instead, we read all entries into [[bibentries]] and do searches later. The easy case is when we're not permissive: we put all the entries into one list, just as if they had come from a single \texttt{.bib} file. But if we're permissive, duplicates in different bibfiles are OK: we will search one bibfile after another and stop after the first successful search---thus instead of a single list, we have a list of lists. <>= local bibentries = { } -- if permissive, list of lists, else list of entries local dupcheck = { } -- maps lower key to entry local preamble = { } -- accumulates preambles from all .bib files local got_one_bib = false -- did we open even one .bib file? <> local warnings = { } -- table of held warnings for each entry local macros = bibstyle.macros() -- must accumulate macros across .bib files for _, bib in ipairs(bibfiles) do local bibfilename, rdr = openbib(bib, macros) if rdr then local t -- list that will receive entries from this reader if permissive then t = { } table.insert(bibentries, t) else t = bibentries end local localdupcheck = { } -- lower key to entry; finds duplicates within this file for type, key, fields, file, line in entries(rdr) do if type == nil then break elseif type then -- got something without error local e = { type = type, key = key, fields = fields, file = bibfilename, line = rdr.entry_line } warnings[e] = held_warnings() <> local ok1, ok2 = not_dup(localdupcheck), not_dup(dupcheck) -- evaluate both if ok1 and ok2 then table.insert(t, e) end end end for _, l in ipairs(rdr.preamble) do table.insert(preamble, l) end rdr:close() end end if not got_one_bib then bibfatalf("Could not open any of the following .bib files: %s", table.concat(bibfiles, ' ')) end @ Because the preamble is accumulated as the \texttt{.bib} file is read, it must be copied at the end. @ Here we open files. If we're not being permissive, we must open each file successfully. If we're permissive, it's enough to get at least one. To find the pathname for a bib file, we use [[bibtex.bibpath]]. <>= local function openbib(bib, macros) macros = macros or bibstyle.macros() local filename, msg = bibtex.bibpath(bib) if not filename then if not permissive then biberrorf("Cannot find file %s.bib", bib) end return end local rdr = bibtex.open(filename, macros, strict and emit_warning or hold_warning) if not rdr and not permissive then biberrorf("Cannot open file %s.bib", bib) return end got_one_bib = true return filename, rdr end @ \subsubsection{Duplication checks} There's a great deal of nuisance to checking the integrity of a \texttt{.bib} file. <>= <> local k = string.lower(key) local function not_dup(dup) local e1, e2 = dup[k], e if e1 then -- do return false end --- avoid extra msgs for now local diff = entries_differ(e1, e2) if diff then local verybad = not permissive or e1.file == e2.file local complain = verybad and biberrorf or bibwarnf if e1.key == e2.key then if verybad then savecomplaint(e1, e2, complain, "Ignoring second entry with key '%s' on file %s, line %d\n" .. " (first entry occurred on file %s, line %d;\n".. " entries differ in %s)\n", e2.key, e2.file, e2.line, e1.file, e1.line, diff) end else savecomplaint(e1, e2, complain, "Entries '%s' on file %s, line %d and\n '%s' on file %s, line %d" .. " have keys that differ only in case\n", e1.key, e1.file, e1.line, e2.key, e2.file, e2.line) end elseif e1.file == e2.file then savecomplaint(e1, e2, bibwarnf, "Entry '%s' is duplicated in file '%s' at both line %d and line %d\n", e1.key, e1.file, e1.line, e2.line) elseif not permissive then savecomplaint(e1, e2, bibwarnf, "Entry '%s' appears both on file '%s', line %d and file '%s', line %d".. "\n (entries are exact duplicates)\n", e1.key, e1.file, e1.line, e2.file, e2.line) end return false else dup[k] = e return true end end @ Calling [[savecomplaint(e1, e2, complain, ...)]] takes the complaint [[complain(...)]] and associates it with entries [[e1]] and [[e2]]. If we are operating in ``strict'' mode, the complaint is issued right away; otherwise calling [[issuecomplaints(e)]] issues the complaint lazily. In non-strict, lazy mode, the outside world arranges to issue only complaints with entries that are actually used. <>= local savecomplained, issuecomplaints if strict then function savecomplaint(e1, e2, complain, ...) return complain(...) end function issuecomplaints(e) end else local complaints = { } local function save(e, t) complaints[e] = complaints[e] or { } table.insert(complaints[e], t) end function savecomplaint(e1, e2, ...) save(e1, { ... }) save(e2, { ... }) end local function call(c, ...) return c(...) end function issuecomplaints(e) for _, c in ipairs(complaints[e] or { }) do call(unpack(c)) end end end @ <>= -- return 'key' or 'type' or 'field ' at which entries differ, -- or nil if entries are the same local function entries_differ(e1, e2, notkey) if e1.key ~= e2.key and not notkey then return 'key' end if e1.type ~= e2.type then return 'type' end for k, v in pairs(e1.fields) do if e2.fields[k] ~= v then return 'field ' .. k end end for k, v in pairs(e2.fields) do if e1.fields[k] ~= v then return 'field ' .. k end end end @ I've seen at least one bibliography with identical entries listed under multiple keys. (Thanks, Andrew.) <>= -- every entry is identical to every other local function all_entries_identical(es, notkey) if table.getn(es) == 0 then return true end for i = 2, table.getn(es) do if entries_differ(es[1], es[i], notkey) then return false end end return true end @ \subsection{Computing and emitting the list of citations} A significant complexity added in \nbibtex\ is that a single entry may be cited using more than one citation key. For example, [[\cite{milner:type-polymorphism}]] and [[\cite{milner:theory-polymorphism}]] may well specify the same paper. Thus, in addition to a list of citations, I~also keep track of the set of keys with which each entry is cited, as well as the first such key. The function [[cite]] manages all these data structures. <>= local citations = { } -- list of citations local cited = { } -- (entry -> key set) table local first_cited = { } -- (entry -> key) table local function cite(c, e) -- cite entry e with key c local seen = cited[e] cited[e] = seen or { } cited[e][c] = true if not seen then first_cited[e] = c table.insert(citations, e) end end @ When the dust settles, we adjust members of each citation record: the first key actually used becomes [[key]], the original key becomes [[orig_key]], and other keys go into [[also_cited_as]]. <>= for i = 1, table.getn(citations) do local c = citations[i] local key = assert(first_cited[c], "citation is not cited?!") c.orig_key, c.key = c.key, key local also = { } for k in pairs(cited[c]) do if k ~= key then table.insert(also, k) end end c.also_cited_as = also end @ For each actual [[\cite]] command in the original {\LaTeX} file, we call [[find_entry]] to find an appropriate \bibtex\ entry. Because a [[\cite]] command might match more than one paper, the results may be ambiguous. We therefore produce a list of all \emph{candidates} matching the [[\cite]] command. If we're permissive, we search one list of entries after another, stopping as soon as we get some candidates. If we're not permissive, we have just one list of entries overall, so we search it and we're done. If permissive, we search entry lists in turn until we <>= local find_entry -- function from key to citation do local cache = { } -- (citation-key -> entry) table function find_entry(c) local function remember(e) cache[c] = e; return e end -- cache e and return it if cache[c] or dupcheck[c] then return cache[c] or dupcheck[c] else local candidates if permissive then for _, entries in ipairs(bibentries) do candidates = query(c, entries) if table.getn(candidates) > 0 then break end end else candidates = query(c, bibentries) end assert(candidates) <> end end end @ If we have no candidates, we're hosed. Otherwise, if all the candidates are identical (most likely when there is a unique candidate, but still possible otherwise),\footnote {Andrew Appel has a bibliography in which the \emph{Definition of Standard~ML} appears as two different entries that are identical except for keys.} we take the first. Finally, if there are multiple, distinct candidates to choose from, we take the first and issue a warning message. To avoid surprising the unwary coauthor, we put a warning message into the entry as well, from which it will go into the printed bibliography. <>= if table.getn(candidates) == 0 then biberrorf('No .bib entry matches \\cite{%s}', c) elseif all_entries_identical(candidates, 'notkey') then logf("Query '%s' produced unique candidate %s from %s\n", c, candidates[1].key, candidates[1].file) return remember(candidates[1]) else local e = table.copy(candidates[1]) <> e.warningmsg = string.format('[This entry is the first match for query ' .. '\\texttt{%s}, which produced %d matches.]', c, table.getn(candidates)) return remember(e) end @ I can do better later\ldots <>= bibwarnf("Query '%s' produced %d candidates\n (using %s from %s)\n", c, table.getn(candidates), e.key, e.file) bibwarnf("First two differ in %s\n", entries_differ(candidates[1], candidates[2], true)) @ The [[query]] function uses the engine described in Section~\ref{sec:query}. <>= function query(c, entries) local p = matchq(c) local t = { } for _, e in ipairs(entries) do if p(e.type, e.fields) then table.insert(t, e) end end return t end bibtex.query = query bibtex.doc.query = 'query: string -> entry list -> entry list' <>= local query local matchq bibtex.doc.matchq = 'matchq: string -> predicate --- compile query string' bibtex.matchq = matchq @ Finally we can compute the list of entries: search on each citation key, and if we had [[\cite{*}]] or [[\nocite{*}]], add all the other entries as well. The [[cite]] command takes care of avoiding duplicates. <>= for _, c in ipairs(citekeys) do local e = find_entry(c) if e then cite(c, e) end end if cited_star then for _, es in ipairs(permissive and bibentries or {bibentries}) do logf('Adding all entries in list of %d\n', table.getn(es)) for _, e in ipairs(es) do cite(e.key, e) end end end <> @ I've always hated \bibtex's cross-reference feature, but I believe I've implemented it faithfully. <>= bibtex.do_crossrefs(citations, find_entry) @ With the entries computed, there are two ways to emit: as another \bibtex\ file or as required by the style file. So that we can read from [[bblname]] before writing to it, the opening of [[bbl]] is carefully delayed to this point. <>= <> local bbl = bblname == '-' and io.stdout or open(bblname, 'w') if bib_out then bibtex.emit(bbl, preamble, citations) else bibstyle.emit(bbl, preamble, citations) end if bblname ~= '-' then bbl:close() end @ Here's a function to emit a list of citations as \bibtex\ source. <>= bibtex.doc.emit = 'outfile * string list * entry list -> unit -- write citations in .bib format' function bibtex.emit(bbl, preamble, citations) local warned = false if preamble[1] then bbl:write('@preamble{\n') for i = 1, table.getn(preamble) do bbl:write(string.format(' %s "%s"\n', i > 1 and '#' or ' ', preamble[i])) end bbl:write('}\n\n') end for _, e in ipairs(citations) do local also = e.also_cited_as if also and table.getn(also) > 0 then for _, k in ipairs(e.also_cited_as or { }) do bbl:write(string.format('@%s{%s, crossref={%s}}\n', e.type, k, e.key)) end if not warned then warned = true bibwarnf("Warning: some entries (such as %s) are cited with multiple keys;\n".. " in the emitted .bib file, these entries are duplicated (using crossref)\n", e.key) end end emit_tkf.bib(bbl, e.type, e.key, e.fields) end end @ <>= for _, e in ipairs(citations) do if warnings[e] then for _, w in ipairs(warnings[e]) do emit_warning(unpack(w)) end end end @ \subsection{Cross-reference} If an entry contains a [[crossref]] field, that field is used as a key to find the parent, and the entry inherits missing fields from the parent. If the parent is cross-referenced sufficiently often (i.e., more than [[min_crossref]] times), it may be added to the citation list, in which case the style file knows what to do with the [[crossref]] field. But if the parent is not cited sufficiently often, it disappears, and do does the [[crossref]] field. <>= bibtex.doc.do_crossrefs = "citation list -> unit # add crossref'ed fields in place" function bibtex.do_crossrefs(citations, find_entry) local map = { } --- key to entry (on citation list) local xmap = { } --- key to entry (xref'd only) local xref_count = { } -- entry -> number of times xref'd <> for i = 1, table.getn(citations) do local c = citations[i] if c.fields.crossref then local lowref = string.lower(c.fields.crossref) local parent = map[lowref] or xmap[lowref] if not parent and find_entry then parent = find_entry(lowref) xmap[lowref] = parent end if not parent then biberrorf("Entry %s cross-references to %s, but I can't find %s", c.key, c.fields.crossref, c.fields.crossref) c.fields.crossref = nil else xref_count[parent] = (xref_count[parent] or 0) + 1 local fields = c.fields fields.crossref = parent.key -- force a case match! for k, v in pairs(parent.fields) do -- inherit field if missing fields[k] = fields[k] or v end end end end <> <> end <>= for i = 1, table.getn(citations) do local c = citations[i] local key = string.lower(c.key) map[key] = map[key] or c end <>= for _, e in pairs(xmap) do -- includes only missing entries if xref_count[e] >= min_crossrefs then table.insert(citations, e) end end <>= for i = 1, table.getn(citations) do local c = citations[i] if c.fields.crossref then local parent = xmap[string.lower(c.fields.crossref)] if parent and xref_count[parent] < min_crossrefs then c.fields.crossref = nil end end end @ \subsection{The query engine (i.e., the point of it all)} \label{sec:query} The query language is described in the man page for [[nbibtex]]. Its implementation is divided into two parts: the internal predicates which are composed to form a query predicate, and the parser that takes a string and produces a query predicate. Function [[matchq]] is declared [[local]] above and is the only function visible outside this block. <>= do if not boyer_moore then require 'boyer-moore' end local bm = boyer_moore local compile = bm.compilenc local search = bm.matchnc -- type predicate = type * field table -> bool -- val match : field * string -> predicate -- val author : string -> predicate -- val matchty : string -> predicate -- val andp : predicate option * predicate option -> predicate option -- val orp : predicate option * predicate option -> predicate option -- val matchq : string -> predicate --- compile query string <> <> <> end @ \subsubsection{Query predicates} The common case is a predicate for a named field. We also have some special syntax for ``all fields'' and the \bibtex\ ``type,'' which is not a field. <>= local matchty local function match(field, string) if string == '' then return nil end local pat = compile(string) if field == '*' then return function (t, fields) for _, v in pairs(fields) do if search(pat, v) then return true end end end elseif field == '[type]' then return matchty(string) else return function (t, fields) return search(pat, fields[field] or '') end end end @ Here's a type matcher. <>= function matchty(string) if string == '' then return nil end local pat = compile(string) return function (t, fields) return search(pat, t) end end @ We make a special case of [[author]] because it really means ``author or editor.'' <>= local function author(string) if string == '' then return nil end local pat = compile(string) return function (t, fields) return search(pat, fields.author or fields.editor or '') end end @ We conjoin and disjoin predicates, being careful to use tail calls (not [[and]] and [[or]]) in order to save stack space. <>= local function andp(p, q) -- associate to right for constant stack space if not p then return q elseif not q then return p else return function (t,f) if p(t,f) then return q(t,f) end end end end <>= local function orp(p, q) -- associate to right for constant stack space if not p then return q elseif not q then return p else return function (t,f) if p(t,f) then return true else return q(t,f) end end end end @ \subsubsection{The query compiler} The function [[matchq]] takes the syntax explained in the man page and produces a predicate. <>= function matchq(query) local find = string.find local parts = split(query, '%:') local p = nil if parts[1] and not find(parts[1], '=') then <> table.remove(parts, 1) if parts[1] and not find(parts[1], '=') then <> table.remove(parts, 1) if parts[1] and not find(parts[1], '=') then <> table.remove(parts, 1) end end end for _, part in ipairs(parts) do if not find(part, '=') then biberrorf('bad query %q --- late specs need = sign', query) else local _, _, field, words = find(part, '^(.*)=(.*)$') assert(field and words, 'bug in query parsing') <> end end if not p then bibwarnf('empty query---matches everything\n') return function() return true end else return p end end @ Here's where an unnamed key defaults to author or editor. <>= for _, word in ipairs(split(parts[1], '-')) do p = andp(author(word), p) end <>= local field, words = find(parts[1], '%D') and 'title' or 'year', parts[1] <> <>= if find(parts[1], '%D') then local ty = nil for _, word in ipairs(split(parts[1], '-')) do ty = orp(matchty(word), ty) end p = andp(p, ty) --- check type last for efficiency else for _, word in ipairs(split(parts[1], '-')) do p = andp(p, match('year', word)) -- check year last for efficiency end end @ There could be lots of matches on a year, so we check years last. <>= for _, word in ipairs(split(words, '-')) do if field == 'year' then p = andp(p, match(field, word)) else p = andp(match(field, word), p) end end @ \subsection{Path search and other system-dependent stuff} To find a bib file, I rely on the \texttt{kpsewhich} program, which is typically found on Unix {\TeX} installations, and which should guarantee to find the same bib files as normal bibtex. <>= assert(io.popen) local function capture(cmd, raw) local f = assert(io.popen(cmd, 'r')) local s = assert(f:read('*a')) assert(f:close()) --- can't get an exit code if raw then return s end s = string.gsub(s, '^%s+', '') s = string.gsub(s, '%s+$', '') s = string.gsub(s, '[\n\r]+', ' ') return s end @ Function [[bibpath]] is normally called on a bibname in a {\LaTeX} file, but because a bibname may also be given on the command line, we add \texttt{.bib} only if not already present. Also, because we can <>= bibtex.doc.bibpath = 'string -> string # from \\bibliography name, find pathname of file' function bibtex.bibpath(bib) if find(bib, '/') then local f, msg = io.open(bib) if not f then return nil, msg else f:close() return bib end else if not find(bib, '%.bib$') then bib = bib .. '.bib' end local pathname = capture('kpsewhich ' .. bib) if string.len(pathname) > 1 then return pathname else return nil, 'kpsewhich cannot find ' .. bib end end end @ \section{Implementation of \texttt{nbibfind}} \subsection{Output formats for \bibtex\ entries} We can emit a \bibtex\ entry in any of three formats: [[bib]], [[terse]], and [[full]]. An emitter takes as arguments the type, key, and fields of the entry, and optionally the name of the file the entry came from. <>= local emit_tkf = { } @ The simplest entry is legitimate \bibtex\ source: <>= function emit_tkf.bib(outfile, type, key, fields) outfile:write('@', type, '{', key, ',\n') for k, v in pairs(fields) do outfile:write(' ', k, ' = {', v, '},\n') end outfile:write('}\n\n') end @ For the other two entries, we devise a string format. In principle, we could go with an ASCII form of a full-blown style, but since the purpose is to identify the entry in relatively few characters, it seems sufficient to spit out the author, year, title, and possibly the source. ``Full'' output shows the whole string; ``terse'' is just the first line. <>= do local function bibstring(type, key, fields, bib) <> local names = format_lab_names(fields.author) or format_lab_names(fields.editor) or fields.key or fields.organization or '????' local year = fields.year local lbl = names .. (year and ' ' .. year or '') local title = fields.title or '????' if bib then key = string.gsub(bib, '.*/', '') .. ': ' .. key end local answer = bib and string.format('%-25s = %s: %s', key, lbl, title) or string.format('%-21s = %s: %s', key, lbl, title) local where = fields.booktitle or fields.journal if where then answer = answer .. ', in ' .. where end answer = string.gsub(answer, '%~', ' ') for _, cs in ipairs { 'texttt', 'emph', 'textrm', 'textup' } do answer = string.gsub(answer, '\\' .. cs .. '%A', '') end answer = string.gsub(answer, '[%{%}]', '') return answer end function emit_tkf.terse(outfile, type, key, fields, bib) outfile:write(truncate(bibstring(type, key, fields, bib), 80), '\n') end function emit_tkf.full(outfile, type, key, fields, bib) local w = bst.writer(outfile) w:write(bibstring(type, key, fields, bib), '\n') end end @ <>= local format_lab_names do local fmt = '{vv }{ll}' local function format_names(s) local s = bst.commafy(bst.format_names(fmt, bst.namesplit(s))) return (string.gsub(s, ' and others$', ' et al.')) end function format_lab_names(s) if not s then return s end local t = bst.namesplit(s) if table.getn(t) > 3 then return bst.format_name(fmt, t[1]) .. ' et al.' else return format_names(s) end end end @ Function [[truncate]] returns enough of a string to fit in [[n]] columns, with ellipses as needed. <>= local function truncate(s, n) local l = string.len(s) if l <= n then return s else return string.sub(s, 1, n-3) .. '...' end end @ @ \subsection{Main functions for \texttt{nbibfind}} <>= bibtex.doc.run_find = 'string list -> unit # main program for nbibfind' bibtex.doc.find = 'string * string list -> entry list' function bibtex.find(pattern, bibs) local es = { } local p = matchq(pattern) for _, bib in ipairs(bibs) do local rdr = bibtex.open(bib, bst.months(), hold_warning) for type, key, fields in entries(rdr) do if type == nil then break elseif not type then io.stderr:write('Something disastrous happened with entry ', key, '\n') elseif key == pattern or p(type, fields) then <> table.insert(es, { type = type, key = key, fields = fields, bib = table.getn(bibs) > 1 and bib }) else drop_warnings() end end rdr:close() end return es end function bibtex.run_find(argv) local emit = emit_tkf.terse while argv[1] and find(argv[1], '^-') do if emit_tkf[string.sub(argv[1], 2)] then emit = emit_tkf[string.sub(argv[1], 2)] else biberrorf('Unrecognized option %s', argv[1]) end table.remove(argv, 1) end if table.getn(argv) == 0 then io.stderr:write(string.format('Usage: %s [-bib|-terse|-full] pattern [bibs]\n', string.gsub(argv[0], '.*/', ''))) os.exit(1) end local pattern = table.remove(argv, 1) local bibs = { } <> local entries = bibtex.find(pattern, bibs) for _, e in ipairs(entries) do emit(io.stdout, e.type, e.key, e.fields, e.bib) end end @ If we have no arguments, search all available bibfiles. Otherwise, an argument with a~[[/]] is a pathname, and an argument without~[[/]] is a name as it would appear in [[\bibliography]]. <>= if table.getn(argv) == 0 then bibs = all_bibs() else for _, a in ipairs(argv) do if find(a, '/') then table.insert(bibs, a) else table.insert(bibs, assert(bibtex.bibpath(a))) end end end @ <>= local ws = held_warnings() if ws then for _, w in ipairs(ws) do emit_warning(unpack(w)) end end @ To search all bib files, we lean heavily on \texttt{kpsewhich}, which is distributed with the Web2C version of {\TeX}, and which knows exactly which directories to search. <>= local function all_bibs() local pre_path = assert(capture('kpsewhich -show-path bib')) local path = assert(capture('kpsewhich -expand-path ' .. pre_path)) local bibs = { } -- list of results local inserted = { } -- set of inserted bibs, to avoid duplicates for _, dir in ipairs(split(path, ':')) do local files = assert(capture('echo ' .. dir .. '/*.bib')) for _, file in ipairs(split(files, '%s')) do if readable(file) then if not (workaround.badbibs and (find(file, 'amsxport%-options') or find(file, '/plbib%.bib$'))) then if not inserted[file] then table.insert(bibs, file) inserted[file] = true end end end end end return bibs end bibtex.all_bibs = all_bibs @ Notice the [[workaround.badbibs]], which prevents us from searching some bogus bibfiles that come with Thomas Esser's te{\TeX}. @ It's a pity there's no more efficient way to see if a file is readable than to try to read it, but that's portability for you. <>= local function readable(file) local f, msg = io.open(file, 'r') if f then f:close() return true else return false, msg end end @ \section{Support for style files} A \bibtex\ style file is used to turn a \bibtex\ entry into {\TeX} or {\LaTeX} code suitable for inclusion in a bibliography. It can also be used for many other wondrous purposes, such as generating HTML for web pages. In classes \bibtex, each style file is written in a rudimentary, unnamed, stack-based language, which is described in a document called ``Designing \bibtex\ Styles,'' which is often called \texttt{btxhak.dvi}. One of the benefits of \nbibtex\ is that styles can instead be written in Lua, which is a much more powerful language---and perhaps even easier to read. But while Lua has amply powerful string-processing primitives, it lacks some of the primitives that are specific to \bibtex. Most notable among these primitives is the machinery for parsing and formatting names (of authors, editors and so on). That machinery is re-implemented here. If documentation seems scanty, consult the original \texttt{btxhak}. @ In classic \bibtex, each style is its own separate file. Here, we share code by allowing a single file to register multiple styles. <>= bibtex.doc.register_style = [[string * style -> unit # remember style with given name type style = { emit : outfile * string list * citation list -> unit , style : table of formatting functions # defined document types , macros : unit -> macro table }]] bibtex.doc.style = 'name -> style # return style with given name, loading on demand' do local styles = { } function bibtex.register_style(name, s) assert(not styles[name], "Duplicate registration of style " .. name) styles[name] = s s.name = s.name or name end function bibtex.style(name) if not styles[name] then local loaded if config.nbs then local loaded = loadfile(config.nbs .. '/' .. name .. '.nbs') if loaded then loaded() end end if not loaded then require ('nbib-' .. name) end if not styles[name] then bibfatalf('Tried to load a file, but it did not register style %s\n', name) end end return styles[name] end end @ \subsection{Special string-processing support} A great deal of \bibtex's processing depends on giving a special status to substrings inside braces; indeed, when such a substring begins with a backslash, it is called a ``special character.'' Accordingly, we provide a function to search for a pattern \emph{outside} balanced braces. <>= local function find_outside_braces(s, pat, i) local len = string.len(s) local j, k = string.find(s, pat, i) if not j then return j, k end local jb, kb = string.find(s, '%b{}', i) while jb and jb < j do --- scan past braces --- braces come first, so we search again after close brace local i2 = kb + 1 j, k = string.find(s, pat, i2) if not j then return j, k end jb, kb = string.find(s, '%b{}', i2) end -- either pat precedes braces or there are no braces return string.find(s, pat, j) --- 2nd call needed to get captures end @ \subsubsection{String splitting} Another common theme in \bibtex\ is the list represented as string. A~list of names is represented as a string with individual names separated by ``and.'' A~name itself is a list of parts separated by whitespace. So here are some functions to do general splitting. When we don't care about the separators, we use [[split]]; when we care only about the separators, we use [[splitters]]; and when we care about both, we use [[odd_even_split]]. <>= local function split(s, pat, find) --- return list of substrings separated by pat find = find or string.find -- could be find_outside_braces local len = string.len(s) local t = { } local insert = table.insert local i, j, k = 1, true while j and i <= len + 1 do j, k = find(s, pat, i) if j then insert(t, string.sub(s, i, j-1)) i = k + 1 else insert(t, string.sub(s, i)) end end return t end @ Function [[splitters]] returns a table that, when interleaved with the result of [[split]], reconstructs the original string. <>= local function splitters(s, pat, find) --- return list of separators find = find or string.find -- could be find_outside_braces local t = { } local insert = table.insert local j, k = find(s, pat, 1) while j do insert(t, string.sub(s, j, k)) j, k = find(s, pat, k+1) end return t end @ Function [[odd_even_split]] makes odd entries strings between the sought-for pattern and even entries the strings that match the pattern. <>= local function odd_even_split(s, pat) local len = string.len(s) local t = { } local insert = table.insert local i, j, k = 1, true while j and i <= len + 1 do j, k = find(s, pat, i) if j then insert(t, string.sub(s, i, j-1)) insert(t, string.sub(s, j, k)) i = k + 1 else insert(t, string.sub(s, i)) end end return t end @ As a special case, we may want to pull out brace-delimited substrings: <>= local function brace_split(s) return odd_even_split(s, '%b{}') end @ Some things need splits. <>= <> @ \subsubsection{String lengths and widths} Function [[text_char_count]] counts characters, but a special counts as one character. It is based on \bibtex's [[text.length$]] function. <>= local function text_char_count(s) local n = 0 local i, last = 1, string.len(s) while i <= last do local special, splast, sp = find(s, '(%b{})', i) if not special then return n + (last - i + 1) elseif find(sp, '^{\\') then n = n + (special - i + 1) -- by statute, it's a single character i = splast + 1 else n = n + (splast - i + 1) - 2 -- don't count braces i = splast + 1 end end return n end bst.text_length = text_char_count bst.doc.text_length = "string -> int # length (with 'special' char == 1)" @ Sometimes we want to know not how many characters are in a string, but how much space we expect it to take when typeset. (Or rather, we want to compare such widths to find the widest.) This is original \bibtex's [[width$]] function. The code should use the [[char_width]] array, for which [[space]] is the only whitespace character given a nonzero printing width. The widths here are taken from Stanford's June~'87 $cmr10$~font and represent hundredths of a point (rounded), but since they're used only for relative comparisons, the units have no meaning. <>= do local char_width = { } local special_widths = { ss = 500, ae = 722, oe = 778, AE = 903, oe = 1014 } for i = 0, 255 do char_width[i] = 0 end local char_width_from_32 = { 278, 278, 500, 833, 500, 833, 778, 278, 389, 389, 500, 778, 278, 333, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 278, 778, 472, 472, 778, 750, 708, 722, 764, 681, 653, 785, 750, 361, 514, 778, 625, 917, 750, 778, 681, 778, 736, 556, 722, 750, 750, 1028, 750, 750, 611, 278, 500, 278, 500, 278, 278, 500, 556, 444, 556, 444, 306, 500, 556, 278, 306, 528, 278, 833, 556, 500, 556, 528, 392, 394, 389, 556, 528, 722, 528, 528, 444, 500, 1000, 500, 500, } for i = 1, table.getn(char_width_from_32) do char_width[32+i-1] = char_width_from_32[i] end bst.doc.width = "string -> faux_points # width of string in 1987 cmr10" function bst.width(s) assert(false, 'have not implemented width yet') end end @ \subsection{Parsing names and lists of names} Names in a string are separated by \texttt{and} surrounded by nonnull whitespace. Case is not significant. <>= local function namesplit(s) local t = split(s, '%s+[aA][nN][dD]%s+', find_outside_braces) local i = 2 while i <= table.getn(t) do while find(t[i], '^[aA][nN][dD]%s+') do t[i] = string.gsub(t[i], '^[aA][nN][dD]%s+', '') table.insert(t, i, '') i = i + 1 end i = i + 1 end return t end bst.namesplit = namesplit bst.doc.namesplit = 'string -> list of names # split names on "and"' @ <>= local sep_and_not_tie = '%-' local sep_chars = sep_and_not_tie .. '%~' @ To parse an individual name, we want to count commas. We first remove leading white space (and [[sep_char]]s), and trailing white space (and [[sep_char]]s) and commas, complaining for each trailing comma. We then represent the name as two sequences: [[tokens]] and [[trailers]]. The [[tokens]] are the names themselves, and the [[trailers]] are the separator characters between tokens. (A~separator is white space, a dash, or a tie, and multiple separators in sequence are frowned upon.) The [[commas]] table becomes an array mapping the comma number to the index of the token that follows it. <>= local parse_name do local white_sep = '[' .. sep_chars .. '%s]+' local white_comma_sep = '[' .. sep_chars .. '%s%,]+' local trailing_commas = '(,[' .. sep_chars .. '%s%,]*)$' local sep_char = '[' .. sep_chars .. ']' local leading_white_sep = '^' .. white_sep <> function parse_name(s, inter_token) if string.find(s, trailing_commas) then biberrorf("Name '%s' has one or more commas at the end", s) end s = string.gsub(s, trailing_commas, '') s = string.gsub(s, leading_white_sep, '') local tokens = split(s, white_comma_sep, find_outside_braces) local trailers = splitters(s, white_comma_sep, find_outside_braces) <> local commas = { } --- maps each comma to index of token the follows it for i, t in ipairs(trailers) do string.gsub(t, ',', function() table.insert(commas, i+1) end) end local name = { } <> return name end end bst.parse_name = parse_name bst.doc.parse_name = 'string * string option -> name table' @ A~name has up to four parts: the most general form is either ``First von Last, Junior'' or ``von Last, First, Junior'', but various vons and Juniors can be omitted. The name-parsing algorithm is baroque and is transliterated from the original \bibtex\ source, but the principle is clear: assign the full version of each part to the four fields [[ff]], [[vv]], [[ll]], and [[jj]]; and assign an abbreviated version of each part to the fields [[f]], [[v]], [[l]], and [[j]]. <>= local first_start, first_lim, last_lim, von_start, von_lim, jr_lim -- variables mark subsequences; if start == lim, sequence is empty local n = table.getn(tokens) <> local commacount = table.getn(commas) if commacount == 0 then -- first von last jr von_start, first_start, last_lim, jr_lim = 1, 1, n+1, n+1 <> elseif commacount == 1 then -- von last jr, first von_start, last_lim, jr_lim, first_start, first_lim = 1, commas[1], commas[1], commas[1], n+1 divide_von_from_last() elseif commacount == 2 then -- von last, jr, first von_start, last_lim, jr_lim, first_start, first_lim = 1, commas[1], commas[2], commas[2], n+1 divide_von_from_last() else biberrorf("Too many commas in name '%s'") end <> @ The von name, if any, goes from the first von token to the last von token, except the last name is entitled to at least one token. So to find the limit of the von name, we start just before the last token and wind down until we find a von token or we hit the von start (in which latter case there is no von name). <>= function divide_von_from_last() von_lim = last_lim - 1; while von_lim > von_start and not isVon(tokens[von_lim-1]) do von_lim = von_lim - 1 end end @ OK, here's one form. <>= local got_von = false while von_start < last_lim-1 do if isVon(tokens[von_start]) then divide_von_from_last() got_von = true break else von_start = von_start + 1 end end if not got_von then -- there is no von name while von_start > 1 and find(trailers[von_start - 1], sep_and_not_tie) do von_start = von_start - 1 end von_lim = von_start end first_lim = von_start @ The last name starts just past the last token, before the first comma (if there is no comma, there is deemed to be one at the end of the string), for which there exists a first brace-level-0 letter (or brace-level-1 special character), and it's in lower case, unless this last token is also the last token before the comma, in which case the last name starts with this token (unless this last token is connected by a [[sep_char]] other than a [[tie]] to the previous token, in which case the last name starts with as many tokens earlier as are connected by non[[tie]]s to this last one (except on Tuesdays $\ldots\,$), although this module never sees such a case). Note that if there are any tokens in either the von or last names, then the last name has at least one, even if it starts with a lower-case letter. @ The string separating tokens is reduced to a single ``separator character.'' A~comma always trumps other separator characters. Otherwise, if there's no comma, we take the first character, be it a separator or a space. (Patashnik considers that multiple such characters constitute ``silliness'' on the user's part.) <>= for i = 1, table.getn(trailers) do local s = trailers[i] assert(string.len(s) > 0) if find(s, ',') then trailers[i] = ',' else trailers[i] = string.sub(s, 1, 1) end end @ <>= <> set_name(first_start, first_lim, 'ff', 'f') set_name(von_start, von_lim, 'vv', 'v') set_name(von_lim, last_lim, 'll', 'l') set_name(last_lim, jr_lim, 'jj', 'j') @ We set long and short forms together; [[ss]]~is the long form and [[s]]~is the short form. <>= local function set_name(start, lim, long, short) if start < lim then -- string concatenation is quadratic, but names are short <> local ss = tokens[start] local s = abbrev(tokens[start]) for i = start + 1, lim - 1 do if inter_token then ss = ss .. inter_token .. tokens[i] s = s .. inter_token .. abbrev(tokens[i]) else local ssep, nnext = trailers[i-1], tokens[i] local sep, next = ssep, abbrev(nnext) <> ss = ss .. ssep .. nnext s = s .. '.' .. sep .. next end end name[long] = ss name[short] = s end end @ Here is the default for a character between tokens: a~tie is the default space character between the last two tokens of the name part, and between the first two tokens if the first token is short enough; otherwise, a space is the default. <>= if find(sep, sep_char) then -- do nothing; sep is OK elseif i == lim-1 then sep, ssep = '~', '~' elseif i == start + 1 then sep = text_char_count(s) < 3 and '~' or ' ' ssep = text_char_count(ss) < 3 and '~' or ' ' else sep, ssep = ' ', ' ' end @ The von name starts with the first token satisfying [[isVon]], unless that is the last token. A~``von token'' is simply one that begins with a lower-case letter---but those damn specials complicate everything. <>= local upper_specials = { OE = true, AE = true, AA = true, O = true, L = true } local lower_specials = { i = true, j = true, oe = true, ae = true, aa = true, o = true, l = true, ss = true } <>= function isVon(s) local lower = find_outside_braces(s, '%l') -- first nonbrace lowercase local letter = find_outside_braces(s, '%a') -- first nonbrace letter local bs, ebs, command = find_outside_braces(s, '%{%\\(%a+)') -- \xxx if lower and lower <= letter and lower <= (bs or lower) then return true elseif letter and letter <= (bs or letter) then return false elseif bs then if upper_specials[command] then return false elseif lower_specials[command] then return true else local close_brace = find_outside_braces(s, '%}', ebs+1) lower = find(s, '%l') -- first nonbrace lowercase letter = find(s, '%a') -- first nonbrace letter return lower and lower <= letter end else return false end end @ An abbreviated token is the first letter of a token, except again we have to deal with the damned specials. <>= local function abbrev(token) local first_alpha, _, alpha = find(token, '(%a)') local first_brace = find(token, '%{%\\') if first_alpha and first_alpha <= (first_brace or first_alpha) then return alpha elseif first_brace then local i, j, special = find(token, '(%b{})', first_brace) if i then return special else -- unbalanced braces return string.sub(token, first_brace) end else return '' end end @ \subsection{Formatting names} Lacking Lua's string-processing utilities, classic \bibtex\ defines a way of converting a ``format string'' and a name into a formatted name. I~find this formatting technique painful, but I also wanted to preserve compatibility with existing bibliography styles, so I've implemented it as accurately as I~can. The interface is not quite identical to classic \bibtex; a style can use [[namesplit]] to split names and then [[format_name]] to format a single one, or it can throw caution to the winds and call [[format_names]] to format a whole list of names. <>= bst.doc.format_names = "format * name list -> string list # format each name in list" function bst.format_names(fmt, t) local u = { } for i = 1, table.getn(t) do u[i] = bst.format_name(fmt, t[i]) end return u end @ A \bibtex\ format string contains its variable elements inside braces. Thus, we format a name by replacing each braced substring of the format string. <>= do local good_keys = { ff = true, vv = true, ll = true, jj = true, f = true, v = true, l = true, j = true, } bst.doc.format_name = "format * name -> string # format 1 name as in bibtex" function bst.format_name(fmt, name) local t = type(name) == 'table' and name or parse_name(name) -- at most one of the important letters, perhaps doubled, may appear local function replace_braced(s) local i, j, alpha = find_outside_braces(s, '(%a+)', 2) if not i then return '' --- can never be printed, but who are we to complain? elseif not good_keys[alpha] then biberrorf ('The format string %q has an illegal brace-level-1 letter', s) elseif find_outside_braces(s, '%a+', j+1) then biberrorf ('The format string %q has two sets of brace-level-1 letters', s) elseif t[alpha] then local k = j + 1 local t = t <> local head, tail = string.sub(s, 2, i-1) .. t[alpha], string.sub(s, k, -2) <> return head .. tail else return '' end end return (string.gsub(fmt, '%b{}', replace_braced)) end end @ <>= local kk, jj = find(s, '%b{}', k) if kk and kk == k then k = jj + 1 if type(name) == 'string' then t = parse_name(name, string.sub(s, kk+1, jj-1)) else error('Style error -- used a pre-parsed name with non-standard inter-token format string') end end @ <>= if find(tail, '%~%~$') then tail = string.sub(tail, 1, -2) -- denotes hard tie elseif find(tail, '%~$') then if text_char_count(head) + text_char_count(tail) - 1 >= 3 then tail = string.gsub(tail, '%~$', ' ') end end @ \subsection{Line-wrapping output} EXPLAIN THIS INTERFACE!!! My [[max_print_line]] appears to be off by one from Oren Patashnik's. <>= local min_print_line, max_print_line = 3, 79 bibtex.hard_max = max_print_line bibtex.doc.hard_max = 'int # largest line that avoids a forced line break (for wizards)' bst.doc.writer = "io-handle * int option -> object # result:write(s) buffers and breaks lines" function bst.writer(out, indent) indent = indent or 2 assert(indent + 10 < max_print_line) indent = string.rep(' ', indent) local gsub = string.gsub local buf = '' local function write(self, ...) local s = table.concat { ... } local lines = split(s, '\n') lines[1] = buf .. lines[1] buf = table.remove(lines) for i = 1, table.getn(lines) do local line = lines[i] if not find(line, '^%s+$') then -- no line of just whitespace line = gsub(line, '%s+$', '') while string.len(line) > max_print_line do <> end out:write(line, '\n') end end end assert(out.write, "object passed to bst.writer does not have a write method") return { write = write } end <>= local last_pre_white, post_white local i, j, n = 1, 1, string.len(line) while i and i <= n and i <= max_print_line do i, j = find(line, '%s+', i) if i and i <= max_print_line + 1 then if i > min_print_line then last_pre_white, post_white = i - 1, j + 1 end i = j + 1 end end if last_pre_white then out:write(string.sub(line, 1, last_pre_white), '\n') if post_white > max_print_line + 2 then post_white = max_print_line + 2 -- bug-for-bug compatibility with bibtex end line = indent .. string.sub(line, post_white) elseif n < bibtex.hard_max then out:write(line, '\n') line = '' else -- ``unbreakable'' out:write(string.sub(line, 1, bibtex.hard_max-1), '%\n') line = string.sub(line, bibtex.hard_max) end @ <>= assert(min_print_line >= 3) assert(max_print_line > min_print_line) @ \subsection{Functions copied from classic \bibtex} \paragraph{Adding a period} Find the last non-[[}]] character, and if it is not a sentence terminator, add a period. <>= do local terminates_sentence = { ["."] = true, ["?"] = true, ["!"] = true } bst.doc.add_period = "string -> string # add period unless already .?!" function bst.add_period(s) local _, _, last = find(s, '([^%}])%}*$') if last and not terminates_sentence[last] then return s .. '.' else return s end end end @ \paragraph{Case-changing} Classic \bibtex\ has a [[change.case$]] function, which takes an argument telling whether to change to lower case, upper case, or ``title'' case (which has initial letters capitalized). Because Lua supports first-class functions, it makes more sense just to export three functions: [[lower]], [[title]], and [[upper]]. <>= do bst.doc.lower = "string -> string # lower case according to bibtex rules" bst.doc.upper = "string -> string # upper case according to bibtex rules" bst.doc.title = "string -> string # title case according to bibtex rules" <> <> end @ Case conversion is complicated by the presence of brace-delimited sequences, especially since there is one set of conventions for a ``special character'' (brace-delimited sequence beginning with {\TeX} control sequence) and another set of conventions for other brace-delimited sequences. To deal with them, we typically do an ``odd-even split'' on balanced braces, then apply a ``normal'' conversion function to the odd elements and a ``special'' conversion function to the even elements. The application is done by [[oeapp]]. <>= local function oeapp(f, g, t) for i = 1, table.getn(t), 2 do t[i] = f(t[i]) end for i = 2, table.getn(t), 2 do t[i] = g(t[i]) end return t end @ Upper- and lower-case conversion are easiest. Non-specials are hit directly with [[string.lower]] or [[string.upper]]; for special characters, we use utility called [[convert_special]]. <>= local lower_special = convert_special(string.lower) local upper_special = convert_special(string.upper) function bst.lower(s) return table.concat(oeapp(string.lower, lower_special, brace_split(s))) end function bst.upper(s) return table.concat(oeapp(string.upper, upper_special, brace_split(s))) end @ Here is [[convert_special]]. If a special begins with an alphabetic control sequence, we convert only elements between control sequences. If a special begins with a nonalphabetic control sequence, we convert the whole special as usual. Finally, if a special does not begin with a control sequence, we leave it the hell alone. (This is the convention that allows us to put [[{FORTRAN}]] in a \bibtex\ entry and be assured that capitalization is not lost.) <>= function convert_special(cvt) return function(s) if find(s, '^{\\(%a+)') then local t = odd_even_split(s, '\\%a+') for i = 1, table.getn(t), 2 do t[i] = cvt(t[i]) end return table.concat(t) elseif find(s, '^{\\') then return cvt(s) else return s end end end @ Title conversion doesn't fit so nicely into the framework. Function [[lower_later]] lowers all but the first letter of a string. <>= local function lower_later(s) return string.sub(s, 1, 1) .. string.lower(string.sub(s, 2)) end @ For title conversion, we don't mess with a token that follows a colon. Hence, we must maintain [[prev]] and can't use [[convert_special]]. <>= local function title_special(s, prev) if find(prev, ':%s+$') then return s else if find(s, '^{\\(%a+)') then local t = odd_even_split(s, '\\%a+') for i = 1, table.getn(t), 2 do local prev = t[i-1] or prev if find(prev, ':%s+$') then assert(false, 'bugrit') else t[i] = string.lower(t[i]) end end return table.concat(t) elseif find(s, '^{\\') then return string.lower(s) else return s end end end @ Internal function [[recap]] deals with the damn colons. <>= function bst.title(s) local function recap(s, first) local parts = odd_even_split(s, '%:%s+') parts[1] = first and lower_later(parts[1]) or string.lower(parts[1]) for i = (first and 3 or 1), table.getn(parts), 2 do parts[i] = lower_later(parts[i]) end return table.concat(parts) end local t = brace_split(s) for i = 1, table.getn(t), 2 do -- elements outside specials get recapped t[i] = recap(t[i], i == 1) end for i = 2, table.getn(t), 2 do -- specials are, well, special local prev = t[i-1] if i == 2 and not find(prev, '%S') then prev = ': ' end t[i] = title_special(t[i], prev) end return table.concat(t) end @ \paragraph{Purification} Purification (classic [[purify$]]) involves removing non-alphanumeric characters. Each sequence of ``separator'' characters becomes a single space. <>= do bst.doc.purify = "string -> string # remove nonalphanumeric, non-sep chars" local high_alpha = string.char(128) .. '-' .. string.char(255) local sep_white_char = '[' .. sep_chars .. '%s]' local disappears = '[^' .. sep_chars .. high_alpha .. '%s%w]' local gsub = string.gsub local function purify(s) return gsub(gsub(s, sep_white_char, ' '), disappears, '') end -- special characters are purified by removing all non-alphanumerics, -- including white space and sep-chars local function spurify(s) return gsub(s, '[^%w' .. high_alpha .. ']+', '') end local purify_all_chars = { oe = true, OE = true, ae = true, AE = true, ss = true } function bst.purify(s) local t = brace_split(s) for i = 1, table.getn(t) do local _, k, cmd = find(t[i], '^{\\(%a+)%s*') if k then if lower_specials[cmd] or upper_specials[cmd] then if not purify_all_chars[cmd] then cmd = string.sub(cmd, 1, 1) end t[i] = cmd .. spurify(string.sub(t[i], k+1)) else t[i] = spurify(string.sub(t[i], k+1)) end elseif find(t[i], '^{\\') then t[i] = spurify(t[i]) else t[i] = purify(t[i]) end end return table.concat(t) end end @ \paragraph{Text prefix} Function [[text_prefix]] (classic [[text.prefix$]]) takes an initial substring of a string, with the proviso that a \bibtex\ ``special character'' sequence counts as a single character. <>= bst.doc.text_prefix = "string * int -> string # take first n chars with special == 1" function bst.text_prefix(s, n) local t = brace_split(s) local answer, rem = '', n for i = 1, table.getn(t), 2 do answer = answer .. string.sub(t[i], 1, rem) rem = rem - string.len(t[i]) if rem <= 0 then return answer end if find(t[i+1], '^{\\') then answer = answer .. t[i+1] rem = rem - 1 else <> end end return answer end <>= local s = t[i+1] local braces = 0 local sub = string.sub for i = 1, string.len(s) do local c = sub(s, i, i) if c == '{' then braces = braces + 1 elseif c == '}' then braces = braces + 1 else rem = rem - 1 if rem == 0 then return answer .. string.sub(s, 1, i) .. string.rep('}', braces) end end end answer = answer .. s @ \paragraph{Emptiness test} Function [[empty]] (classic [[empty$]]) tells if a value is empty; i.e., it is missing (nil) or it is only white space. <>= bst.doc.empty = "string option -> bool # is string there and holding nonspace?" function bst.empty(s) return s == nil or not find(s, '%S') end @ @ \subsection{Other utilities} \paragraph{A stable sort} Function [[bst.sort]] is like [[table.sort]] only stable. It is needed because classic \bibtex\ uses a stable sort. Its interface is the same as [[table.sort]]. <>= bst.doc.sort = 'value list * compare option # like table.sort, but stable' function bst.sort(t, lt) lt = lt or function(x, y) return x < y end local pos = { } --- position of each element in original table for i = 1, table.getn(t) do pos[t[i]] = i end local function nlt(x, y) if lt(x, y) then return true elseif lt(y, x) then return false else -- elements look equal return pos[x] < pos[y] end end return table.sort(t, nlt) end bst.doc.sort = 'value list * compare option -> unit # stable sort' @ \paragraph{The standard months} Every style is required to recognize the months, so we make it easy to create a fresh table with either full or abbreviated months. <>= bst.doc.months = "string option -> table # macros table containing months" function bst.months(what) local m = { jan = "January", feb = "February", mar = "March", apr = "April", may = "May", jun = "June", jul = "July", aug = "August", sep = "September", oct = "October", nov = "November", dec = "December" } if what == 'short' or what == 3 then for k, v in pairs(m) do m[k] = string.sub(v, 1, 3) end end return m end @ \paragraph{Comma-separated lists} The function [[commafy]] takes a list and inserts commas and [[and]] (or [[or]]) using American conventions. For example, \begin{quote} [[commafy { 'Graham', 'Knuth', 'Patashnik' }]] \end{quote} returns [['Graham, Knuth, and Patashnik']], but \begin{quote} [[commafy { 'Knuth', 'Plass' }]] \end{quote} returns [['Knuth and Plass']]. <>= bst.doc.commafy = "string list -> string # concat separated by commas, and" function bst.commafy(t, andword) andword = andword or 'and' local n = table.getn(t) if n == 1 then return t[1] elseif n == 2 then return t[1] .. ' ' .. andword .. ' ' .. t[2] else local last = t[n] t[n] = andword .. ' ' .. t[n] local answer = table.concat(t, ', ') t[n] = last return answer end end @ \section{Testing and so on} Here are a couple of test functions I used during development that I thought might be worth keeping around. <>= bibtex.doc.cat = 'string -> unit # emit the named bib file in bib format' function bibtex.cat(bib) local rdr = bibtex.open(bib, bst.months()) if not rdr then rdr = assert(bibtex.open(assert(bibtex.bibpath(bib)), bst.months())) end for type, key, fields in entries(rdr) do if type == nil then break elseif not type then io.stderr:write('Error on key ', key, '\n') else emit_tkf.bib(io.stdout, type, key, fields) end end bibtex.close(rdr) end @ <>= bibtex.doc.count = 'string list -> unit # take list of bibs and print number of entries' function bibtex.count(argv) local bibs = { } local macros = { } local n = 0 <> local function warn() end for _, bib in ipairs(bibs) do local rdr = bibtex.open(bib, macros) for type, key, fields in entries(rdr) do if type == nil then break elseif type then n = n + 1 end end rdr:close() end printf("%d\n", n) end @ <>= bibtex.doc.all_entries = "bibname * macro-table -> preamble * citation list" function bibtex.all_entries(bib, macros) macros = macros or bst.months() warn = warn or emit_warning local rdr = bibtex.open(bib, macros, warn) if not rdr then rdr = assert(bibtex.open(assert(bibtex.bibpath(bib)), macros, warn), "could not open bib file " .. bib) end local cs = { } local seen = { } for type, key, fields in entries(rdr) do if type == nil then break elseif not type then io.stderr:write(key, '\n') elseif not seen[key] then seen[key] = true table.insert(cs, { type = type, key = key, fields = fields, file = bib, line = rdr.entry_line }) end end local p = assert(rdr.preamble) rdr:close() return p, cs end @ \section{Laundry list} THINGS TO DO: \begin{itemize} \item TRANSITION THE C~CODE TO LUA NATIVE ERROR HANDLING ([[luaL_error]] and [[pcall]]) \item NO WARNING FOR DUPLICATE FIELDS NOT DEFINED IN .BST? \item STANDARD WARNING FOR REPEATED ENTRY? \item NOT ENFORCED: An entry type must be defined in the \texttt{.bst} file if this entry is to be included in the reference list. \item THE WHOLE BST-SEARCH THING NEEDS MORE CARE. BibTeX searches the directories in the path defined by the BSTINPUTS environment variable for .bst files. If BSTINPUTS is not set, it uses the system default. For .bib files, it uses the BIBINPUTS environment variable if that is set, otherwise the default. See tex(1) for the details of the searching. If the environment variable TEXMFOUTPUT is set, BibTeX attempts to put its output files in it, if they cannot be put in the current directory. Again, see tex(1). No special searching is done for the .aux file. \item RATIONALIZE ERROR MACHINERY WITH WARNING, ERROR, AND FATAL CASES -- AND COUNTS. \item Here are some things that \bibtex\ does that \nbibtex\ should do: \begin{enumerate} \item Writes a log file \item Counts warnings, or if there is an error, counts errors instead \end{enumerate} \end{itemize} \end{document} @ nbibtex-0.9.18/bibtex.lua.in0000444007651200140720000024140411042435443013465 0ustar nrnr-- From here out, everything is written in Lua -- (http://www.lua.org). The main module is [[bibtex]], -- and style-file support is in the submodule -- [[bibtex.bst]]. Each has a [[doc]] submodule, which is -- intended as machine-readable documentation. -- = -- The Lua code relies on the C code. How we get the -- C code depends on how bibtex.lua is used; there are -- two alternatives: -- * In the distribution, bibtex.lua is loaded by the -- C code in chunk [->], which defines the [[bibtex]] -- module. -- * For standalone testing purposes, bibtex.lua can be -- loaded directly into an interactive Lua -- interpreter, in which case it loads the [[bibtex]] -- module as a shared library. -- = if not bibtex then require 'nrlib' nrlib.load 'bibtex' end local config = config or { } --- may be defined by config process local workaround = { badbibs = true, --- don't look at bad .bib files that come with teTeX } local bst = { } bibtex.bst = bst bibtex.doc = { } bibtex.bst.doc = { } bibtex.doc.bst = '# table of functions used to write style files' -- Not much code is executed during startup, so the main -- issue is to manage declaration before use. I have a -- few forward declarations in [[<>]]; otherwise, count only on -- ``utility'' functions being declared before -- ``exported'' ones. -- = local find = string.find -- = local query local matchq bibtex.doc.matchq = 'matchq: string -> predicate --- compile query string' bibtex.matchq = matchq -- Error handling, warning messages, and logging -- -- = ------------------------------------------------------------------------ ---------- Utility functions for "Implementation of nbibtex" ----------- ------------------------------------------------------------------------ local function printf (...) return io.stdout:write(string.format(...)) end local function eprintf(...) return io.stderr:write(string.format(...)) end -- I have to figure out what to do about errors --- the -- current code is bogus. Among other things, I should be -- setting error levels. -- = local function bibwarnf (...) eprintf(...); eprintf('\n') end local function biberrorf(...) eprintf(...); eprintf('\n') end local function bibfatalf(...) eprintf(...); eprintf('\n'); os.exit(2) end -- Logging? What logging? -- -- = local function logf() end -- Support for delayed warnings -- -- Like classic BibTeX, NbibTeX typically warns only -- about entries that are actually used. This -- functionality is implemented by function -- [[hold_warning]], which keeps warnings on ice until -- they are either returned by [[held_warnings]] or -- thrown away by [[drop_warning]]. The function -- [[emit_warning]] emits a warning message eagerly when -- called; it is used to issue warnings about entries we -- actually use, or if the [[-strict]] option is given, -- to issue every warning. -- = local hold_warning -- function suitable to pass to bibtex.open; holds local emit_warning -- function suitable to pass to bibtex.open; prints local held_warnings -- returns nil or list of warnings since last call local drop_warnings -- drops warnings local extra_ok = { reffrom = true } -- set of fields about which we should not warn of duplicates do local warnfuns = { } warnfuns["extra field"] = function(file, line, cite, field, newvalue) if not extra_ok[field] then bibwarnf("Warning--I'm ignoring %s's extra \"%s\" field\n--line %d of file %s\n", cite, field, line, file) end end warnfuns["undefined macro"] = function(file, line, cite, macro) bibwarnf("Warning--string name \"%s\" is undefined\n--line %d of file %s\n", macro, line, file) end function emit_warning(tag, ...) return assert(warnfuns[tag])(...) end local held function hold_warning(...) held = held or { } table.insert(held, { ... }) end function held_warnings() local h = held held = nil return h end function drop_warnings() held = nil end end -- Miscellany -- -- All this stuff is dubious. -- = function table.copy(t) local u = { } for k, v in pairs(t) do u[k] = v end return u end -- = local function open(f, m, what) local f, msg = io.open(f, m) if f then return f else (what or bibfatalf)('Could not open file %s: %s', f, msg) end end -- = local function help(code) printf([[ Usage: nbibtex [OPTION]... AUXFILE[.aux] [BIBFILE...] Write bibliography for entries in AUXFILE to AUXFILE.bbl. Options: -bib write output as BibTeX source -help display this help and exit -o FILE write output to FILE (- for stdout) -min-crossrefs=NUMBER include item after NUMBER cross-refs; default 2 -permissive allow missing bibfiles and (some) duplicate entries -strict complain about any ill-formed entry we see -version output version information and exit Home page at http://www.eecs.harvard.edu/~nr/nbibtex. Email bug reports to nr@eecs.harvard.edu. ]]) os.exit(code or 0) end -- = -- return 'key' or 'type' or 'field ' at which entries differ, -- or nil if entries are the same local function entries_differ(e1, e2, notkey) if e1.key ~= e2.key and not notkey then return 'key' end if e1.type ~= e2.type then return 'type' end for k, v in pairs(e1.fields) do if e2.fields[k] ~= v then return 'field ' .. k end end for k, v in pairs(e2.fields) do if e1.fields[k] ~= v then return 'field ' .. k end end end -- I've seen at least one bibliography with identical -- entries listed under multiple keys. (Thanks, Andrew.) -- = -- every entry is identical to every other local function all_entries_identical(es, notkey) if table.getn(es) == 0 then return true end for i = 2, table.getn(es) do if entries_differ(es[1], es[i], notkey) then return false end end return true end -- Path search and other system-dependent stuff -- -- To find a bib file, I rely on the kpsewhich program, -- which is typically found on Unix TeX installations, -- and which should guarantee to find the same bib files -- as normal bibtex. -- = assert(io.popen) local function capture(cmd, raw) local f = assert(io.popen(cmd, 'r')) local s = assert(f:read('*a')) assert(f:close()) --- can't get an exit code if raw then return s end s = string.gsub(s, '^%s+', '') s = string.gsub(s, '%s+$', '') s = string.gsub(s, '[\n\r]+', ' ') return s end -- Output formats for BibTeX entries -- -- We can emit a BibTeX entry in any of three formats: -- [[bib]], [[terse]], and [[full]]. An emitter takes as -- arguments the type, key, and fields of the entry, and -- optionally the name of the file the entry came from. -- = ------------------------------------------------------------------------ ---------- Utility functions for "Implementation of nbibfind" ---------- ------------------------------------------------------------------------ local emit_tkf = { } -- Function [[truncate]] returns enough of a string to -- fit in [[n]] columns, with ellipses as needed. -- = local function truncate(s, n) local l = string.len(s) if l <= n then return s else return string.sub(s, 1, n-3) .. '...' end end -- It's a pity there's no more efficient way to see if a -- file is readable than to try to read it, but that's -- portability for you. -- = local function readable(file) local f, msg = io.open(file, 'r') if f then f:close() return true else return false, msg end end -- Special string-processing support -- -- A great deal of BibTeX's processing depends on giving -- a special status to substrings inside braces; indeed, -- when such a substring begins with a backslash, it is -- called a ``special character.'' Accordingly, we -- provide a function to search for a pattern outside -- balanced braces. -- = ------------------------------------------------------------------------ ----------- Utility functions for "Support for style files" ------------ ------------------------------------------------------------------------ local function find_outside_braces(s, pat, i) local len = string.len(s) local j, k = string.find(s, pat, i) if not j then return j, k end local jb, kb = string.find(s, '%b{}', i) while jb and jb < j do --- scan past braces --- braces come first, so we search again after close brace local i2 = kb + 1 j, k = string.find(s, pat, i2) if not j then return j, k end jb, kb = string.find(s, '%b{}', i2) end -- either pat precedes braces or there are no braces return string.find(s, pat, j) --- 2nd call needed to get captures end -- String splitting -- -- Another common theme in BibTeX is the list represented -- as string. A list of names is represented as a string -- with individual names separated by ``and.'' A name -- itself is a list of parts separated by whitespace. So -- here are some functions to do general splitting. When -- we don't care about the separators, we use [[split]]; -- when we care only about the separators, we use -- [[splitters]]; and when we care about both, we use -- [[odd_even_split]]. -- = local function split(s, pat, find) --- return list of substrings separated by pat find = find or string.find -- could be find_outside_braces local len = string.len(s) local t = { } local insert = table.insert local i, j, k = 1, true while j and i <= len + 1 do j, k = find(s, pat, i) if j then insert(t, string.sub(s, i, j-1)) i = k + 1 else insert(t, string.sub(s, i)) end end return t end -- Function [[splitters]] returns a table that, when -- interleaved with the result of [[split]], reconstructs -- the original string. -- = local function splitters(s, pat, find) --- return list of separators find = find or string.find -- could be find_outside_braces local t = { } local insert = table.insert local j, k = find(s, pat, 1) while j do insert(t, string.sub(s, j, k)) j, k = find(s, pat, k+1) end return t end -- Function [[odd_even_split]] makes odd entries strings -- between the sought-for pattern and even entries the -- strings that match the pattern. -- = local function odd_even_split(s, pat) local len = string.len(s) local t = { } local insert = table.insert local i, j, k = 1, true while j and i <= len + 1 do j, k = find(s, pat, i) if j then insert(t, string.sub(s, i, j-1)) insert(t, string.sub(s, j, k)) i = k + 1 else insert(t, string.sub(s, i)) end end return t end -- As a special case, we may want to pull out -- brace-delimited substrings: -- = local function brace_split(s) return odd_even_split(s, '%b{}') end -- = -- To search all bib files, we lean heavily on kpsewhich, -- which is distributed with the Web2C version of TeX, -- and which knows exactly which directories to search. -- = local function all_bibs() local pre_path = assert(capture('kpsewhich -show-path bib')) local path = assert(capture('kpsewhich -expand-path ' .. pre_path)) local bibs = { } -- list of results local inserted = { } -- set of inserted bibs, to avoid duplicates for _, dir in ipairs(split(path, ':')) do local files = assert(capture('echo ' .. dir .. '/*.bib')) for _, file in ipairs(split(files, '%s')) do if readable(file) then if not (workaround.badbibs and (find(file, 'amsxport%-options') or find(file, '/plbib%.bib$'))) then if not inserted[file] then table.insert(bibs, file) inserted[file] = true end end end end end return bibs end bibtex.all_bibs = all_bibs -- [[workaround.badbibs]], which prevents us -- from searching some bogus bibfiles that come with -- Thomas Esser's teTeX. -- String lengths and widths -- -- Function [[text_char_count]] counts characters, but a -- special counts as one character. It is based on -- BibTeX's [[text.length]] function. -- = local function text_char_count(s) local n = 0 local i, last = 1, string.len(s) while i <= last do local special, splast, sp = find(s, '(%b{})', i) if not special then return n + (last - i + 1) elseif find(sp, '^{\\') then n = n + (special - i + 1) -- by statute, it's a single character i = splast + 1 else n = n + (splast - i + 1) - 2 -- don't count braces i = splast + 1 end end return n end bst.text_length = text_char_count bst.doc.text_length = "string -> int # length (with 'special' char == 1)" -- The von name starts with the first token satisfying -- [[isVon]], unless that is the last token. A ``von -- token'' is simply one that begins with a lower-case -- letter---but those damn specials complicate -- everything. -- = local upper_specials = { OE = true, AE = true, AA = true, O = true, L = true } local lower_specials = { i = true, j = true, oe = true, ae = true, aa = true, o = true, l = true, ss = true } -- = ------------------------------------------------------------------------ ---------------------- IMPLEMENTATION OF NBIBTEX ----------------------- ------------------------------------------------------------------------ local function entries(rdr, empty) assert(not empty) return function() return rdr:next() end end bibtex.entries = entries bibtex.doc.entries = 'reader -> iterator # generate entries' -- Internal documentation -- -- We attempt to document everything! -- = function bibtex:show_doc(title) local out = bst.writer(io.stdout, 5) local function outf(...) return out:write(string.format(...)) end local allkeys, dkeys = { }, { } for k, _ in pairs(self) do table.insert(allkeys, k) end for k, _ in pairs(self.doc) do table.insert(dkeys, k) end table.sort(allkeys) table.sort(dkeys) for i = 1, table.getn(dkeys) do outf("%s.%-12s : %s\n", title, dkeys[i], self.doc[dkeys[i]]) end local header for i = 1, table.getn(allkeys) do local k = allkeys[i] if k ~= "doc" and k ~= "show_doc" and not self.doc[k] then if not header then outf('Undocumented keys in table %s:', title) header = true end outf(' %s', k) end end if header then outf('\n') end end bibtex.bst.show_doc = bibtex.show_doc -- Here is the documentation for what's defined in -- C code: -- = bibtex.doc.open = 'filename -> reader # open a reader for a .bib file' bibtex.doc.close = 'reader -> unit # close open reader' bibtex.doc.next = 'reader -> type * key * field table # read an entry' -- = bibtex.doc.main = 'string list -> unit # main program that dispatches on argv[0]' function bibtex.main(argv) if argv[1] == '-doc' then -- undocumented internal doco bibtex:show_doc('bibtex') bibtex.bst:show_doc('bst') elseif find(argv[0], 'bibfind$') then return bibtex.run_find(argv) elseif find(argv[0], 'bibtex$') then return bibtex.bibtex(argv) else error("Call me something ending in 'bibtex' or 'bibfind'; when called\n ".. argv[0]..", I don't know what to do") end end -- = local permissive = false -- nbibtex extension (ignore missing .bib files, etc.) local strict = false -- complain eagerly about errors in .bib files local min_crossrefs = 2 -- how many crossref's required to add an entry? local output_name = nil -- output file if not default local bib_out = false -- output .bib format bibtex.doc.bibtex = 'string list -> unit # main program for nbibtex' function bibtex.bibtex(argv) -- Options are straightforward. -- -- = while table.getn(argv) > 0 and find(argv[1], '^%-') do if argv[1] == '-terse' then -- do nothing elseif argv[1] == '-permissive' then permissive = true elseif argv[1] == '-strict' then strict = true elseif argv[1] == '-min-crossrefs' and find(argv[2], '^%d+$') then min_crossrefs = assert(tonumber(argv[2])) table.remove(argv, 1) elseif string.find(argv[1], '^%-min%-crossrefs=(%d+)$') then local _, _, n = string.find(argv[1], '^%-min%-crossrefs=(%d+)$') min_crossrefs = assert(tonumber(n)) elseif string.find(argv[1], '^%-min%-crossrefs') then biberrorf("Ill-formed option %s", argv[1]) elseif argv[1] == '-o' then output_name = assert(argv[2]) table.remove(argv, 1) elseif argv[1] == '-bib' then bib_out = true elseif argv[1] == '-help' then help() elseif argv[1] == '-version' then printf("nbibtex version \n") os.exit(0) else biberrorf('Unknown option %s', argv[1]) help(2) end table.remove(argv, 1) end if table.getn(argv) < 1 then bibfatalf('Usage: %s [-permissive|-strict|...] filename[.aux] [bibfile...]', argv[0]) end local auxname = table.remove(argv, 1) local basename = string.gsub(string.gsub(auxname, '%.aux$', ''), '%.$', '') auxname = basename .. '.aux' local bblname = output_name or (basename .. '.bbl') local blgname = basename .. (output_name and '.nlg' or '.blg') local blg = open(blgname, 'w') -- Here's what we accumulate by reading .aux files: local bibstyle -- the bibliography style local bibfiles = { } -- list of files named in order of file local citekeys = { } -- list of citation keys from .aux -- (in order seen, mixed case, no duplicates) local cited_star = false -- .tex contains \cite{*} or \nocite{*} -- Reading all the aux files and validating the inputs -- -- We pay attention to four commands: [[input]], -- [[\bibdata]], [[\bibstyle]], and [[\citation]]. -- = do local commands = { } -- table of commands we recognize in .aux files local function do_nothing() end -- default for unrecognized commands setmetatable(commands, { __index = function() return do_nothing end }) -- = do local auxopened = { } --- map filename to true/false commands['@input'] = function (auxname) if not find(auxname, '%.aux$') then bibwarnf('Name of auxfile "%s" does not end in .aux\n', auxname) end -- = if auxopened[auxname] then error("File " .. auxname .. " cyclically \\@input's itself") else auxopened[auxname] = true end local aux = open(auxname, 'r') logf('Top-level aux file: %s\n', auxname) for line in aux:lines() do local _, _, cmd, arg = find(line, '^\\([%a%@]+)%s*{([^%}]+)}%s*$') if cmd then commands[cmd](arg) end end aux:close() end end -- BibTeX expects .bib files to be separated by commas. -- They are forced to lower case, should have no spaces -- in them, and the [[\bibdata]] command should appear -- exactly once. -- = do local bibdata_seen = false function commands.bibdata(arg) assert(not bibdata_seen, [[LaTeX provides multiple \bibdata commands]]) bibdata_seen = true for bib in string.gmatch(arg, '[^,]+') do assert(not find(bib, '%s'), 'bibname from LaTeX contains whitespace') table.insert(bibfiles, string.lower(bib)) end end end -- The style should be unique, and it should be known to -- us. -- = function commands.bibstyle(stylename) if bibstyle then biberrorf('Illegal, another \\bibstyle command') else bibstyle = bibtex.style(string.lower(stylename)) if not bibstyle then bibfatalf('There is no nbibtex style called "%s"') end end end -- We accumulated cited keys in [[citekeys]]. Keys may be -- duplicated, but the input should not contain two keys -- that differ only in case. -- = do local keys_seen, lower_seen = { }, { } -- which keys have been seen already function commands.citation(arg) for key in string.gmatch(arg, '[^,]+') do assert(not find(key, '%s'), 'Citation key {' .. key .. '} from LaTeX contains whitespace') if key == '*' then cited_star = true elseif not keys_seen[key] then --- duplicates are OK keys_seen[key] = true local low = string.lower(key) -- = if lower_seen[low] then biberrorf("Citation key '%s' inconsistent with earlier key '%s'", key, lower_seen[low]) else lower_seen[low] = key end if not cited_star then -- no more insertions after the star table.insert(citekeys, key) -- must be key, not low, -- so that keys in .bbl match .aux end end end end end commands['@input'](auxname) -- reads all the variables end if table.getn(argv) > 0 then -- override the bibfiles listed in the .aux file bibfiles = argv end -- After reading the variables, we do a little -- validation. I can't seem to make up my mind what -- should be done incrementally while things are being -- read. -- = if not bibstyle then bibfatalf('No \\bibliographystyle in original LaTeX') end if table.getn(bibfiles) == 0 then bibfatalf('No .bib files specified --- no \\bibliography in original LaTeX?') end if table.getn(citekeys) == 0 and not cited_star then biberrorf('No citations in document --- empty bibliography') end do --- check for duplicate bib entries local i = 1 local seen = { } while i <= table.getn(bibfiles) do local bib = bibfiles[i] if seen[bib] then bibwarnf('Multiple references to bibfile "%s"', bib) table.remove(bibfiles, i) else i = i + 1 end end end -- Reading the entries from all the BibTeX files -- -- These are diagnostics that might be written to a log. -- = logf("bibstyle == %q\n", bibstyle.name) logf("consult these bibfiles:") for _, bib in ipairs(bibfiles) do logf(" %s", bib) end logf("\ncite these papers:\n") for _, key in ipairs(citekeys) do logf(" %s\n", key) end if cited_star then logf(" and everything else in the database\n") end -- Each bibliography file is opened with [[openbib]]. -- Unlike classic BibTeX, we can't simply select the -- first entry matching a citation key. Instead, we read -- all entries into [[bibentries]] and do searches later. -- -- The easy case is when we're not permissive: we put all -- the entries into one list, just as if they had come -- from a single .bib file. But if we're permissive, -- duplicates in different bibfiles are OK: we will -- search one bibfile after another and stop after the -- first successful search---thus instead of a single -- list, we have a list of lists. -- = local bibentries = { } -- if permissive, list of lists, else list of entries local dupcheck = { } -- maps lower key to entry local preamble = { } -- accumulates preambles from all .bib files local got_one_bib = false -- did we open even one .bib file? -- Here we open files. If we're not being permissive, we -- must open each file successfully. If we're permissive, -- it's enough to get at least one. -- -- To find the pathname for a bib file, we use -- [[bibtex.bibpath]]. -- = local function openbib(bib, macros) macros = macros or bibstyle.macros() local filename, msg = bibtex.bibpath(bib) if not filename then if not permissive then biberrorf("Cannot find file %s.bib", bib) end return end local rdr = bibtex.open(filename, macros, strict and emit_warning or hold_warning) if not rdr and not permissive then biberrorf("Cannot open file %s.bib", bib) return end got_one_bib = true return filename, rdr end local warnings = { } -- table of held warnings for each entry local macros = bibstyle.macros() -- must accumulate macros across .bib files for _, bib in ipairs(bibfiles) do local bibfilename, rdr = openbib(bib, macros) if rdr then local t -- list that will receive entries from this reader if permissive then t = { } table.insert(bibentries, t) else t = bibentries end local localdupcheck = { } -- lower key to entry; finds duplicates within this file for type, key, fields, file, line in entries(rdr) do if type == nil then break elseif type then -- got something without error local e = { type = type, key = key, fields = fields, file = bibfilename, line = rdr.entry_line } warnings[e] = held_warnings() -- Duplication checks -- -- There's a great deal of nuisance to checking the -- integrity of a .bib file. -- = -- Calling [[savecomplaint(e1, e2, complain, ...)]] takes -- the complaint [[complain(...)]] and associates it with -- entries [[e1]] and [[e2]]. If we are operating in -- ``strict'' mode, the complaint is issued right away; -- otherwise calling [[issuecomplaints(e)]] issues the -- complaint lazily. In non-strict, lazy mode, the -- outside world arranges to issue only complaints with -- entries that are actually used. -- = local savecomplained, issuecomplaints if strict then function savecomplaint(e1, e2, complain, ...) return complain(...) end function issuecomplaints(e) end else local complaints = { } local function save(e, t) complaints[e] = complaints[e] or { } table.insert(complaints[e], t) end function savecomplaint(e1, e2, ...) save(e1, { ... }) save(e2, { ... }) end local function call(c, ...) return c(...) end function issuecomplaints(e) for _, c in ipairs(complaints[e] or { }) do call(unpack(c)) end end end local k = string.lower(key) local function not_dup(dup) local e1, e2 = dup[k], e if e1 then -- do return false end --- avoid extra msgs for now local diff = entries_differ(e1, e2) if diff then local verybad = not permissive or e1.file == e2.file local complain = verybad and biberrorf or bibwarnf if e1.key == e2.key then if verybad then savecomplaint(e1, e2, complain, "Ignoring second entry with key '%s' on file %s, line %d\n" .. " (first entry occurred on file %s, line %d;\n".. " entries differ in %s)\n", e2.key, e2.file, e2.line, e1.file, e1.line, diff) end else savecomplaint(e1, e2, complain, "Entries '%s' on file %s, line %d and\n '%s' on file %s, line %d" .. " have keys that differ only in case\n", e1.key, e1.file, e1.line, e2.key, e2.file, e2.line) end elseif e1.file == e2.file then savecomplaint(e1, e2, bibwarnf, "Entry '%s' is duplicated in file '%s' at both line %d and line %d\n", e1.key, e1.file, e1.line, e2.line) elseif not permissive then savecomplaint(e1, e2, bibwarnf, "Entry '%s' appears both on file '%s', line %d and file '%s', line %d".. "\n (entries are exact duplicates)\n", e1.key, e1.file, e1.line, e2.file, e2.line) end return false else dup[k] = e return true end end local ok1, ok2 = not_dup(localdupcheck), not_dup(dupcheck) -- evaluate both if ok1 and ok2 then table.insert(t, e) end end end for _, l in ipairs(rdr.preamble) do table.insert(preamble, l) end rdr:close() end end if not got_one_bib then bibfatalf("Could not open any of the following .bib files: %s", table.concat(bibfiles, ' ')) end -- Computing and emitting the list of citations -- -- A significant complexity added in NbibTeX is that a -- single entry may be cited using more than one citation -- key. For example, [[[cite milner:type-polymorphism]]] -- and [[[cite milner:theory-polymorphism]]] may well -- specify the same paper. Thus, in addition to a list of -- citations, I also keep track of the set of keys with -- which each entry is cited, as well as the first such -- key. The function [[cite]] manages all these data -- structures. -- = local citations = { } -- list of citations local cited = { } -- (entry -> key set) table local first_cited = { } -- (entry -> key) table local function cite(c, e) -- cite entry e with key c local seen = cited[e] cited[e] = seen or { } cited[e][c] = true if not seen then first_cited[e] = c table.insert(citations, e) end end -- For each actual [[[cite ]]] command in the original -- LaTeX file, we call [[find_entry]] to find an -- appropriate BibTeX entry. Because a [[[cite ]]] -- command might match more than one paper, the results -- may be ambiguous. We therefore produce a list of all -- candidates matching the [[[cite ]]] command. If we're -- permissive, we search one list of entries after -- another, stopping as soon as we get some candidates. -- If we're not permissive, we have just one list of -- entries overall, so we search it and we're done. If -- permissive, we search entry lists in turn until we -- = local find_entry -- function from key to citation do local cache = { } -- (citation-key -> entry) table function find_entry(c) local function remember(e) cache[c] = e; return e end -- cache e and return it if cache[c] or dupcheck[c] then return cache[c] or dupcheck[c] else local candidates if permissive then for _, entries in ipairs(bibentries) do candidates = query(c, entries) if table.getn(candidates) > 0 then break end end else candidates = query(c, bibentries) end assert(candidates) -- If we have no candidates, we're hosed. Otherwise, if -- all the candidates are identical (most likely when -- there is a unique candidate, but still possible -- otherwise), [Andrew Appel has a bibliography in which -- the \emph{Definition of Standard~ML} appears as two -- different entries that are identical except for keys.] -- we take the first. Finally, if there are multiple, -- distinct candidates to choose from, we take the first -- and issue a warning message. To avoid surprising the -- unwary coauthor, we put a warning message into the -- entry as well, from which it will go into the printed -- bibliography. -- = if table.getn(candidates) == 0 then biberrorf('No .bib entry matches \\cite{%s}', c) elseif all_entries_identical(candidates, 'notkey') then logf("Query '%s' produced unique candidate %s from %s\n", c, candidates[1].key, candidates[1].file) return remember(candidates[1]) else local e = table.copy(candidates[1]) -- I can do better later... -- -- = bibwarnf("Query '%s' produced %d candidates\n (using %s from %s)\n", c, table.getn(candidates), e.key, e.file) bibwarnf("First two differ in %s\n", entries_differ(candidates[1], candidates[2], true)) e.warningmsg = string.format('[This entry is the first match for query ' .. '\\texttt{%s}, which produced %d matches.]', c, table.getn(candidates)) return remember(e) end end end end -- Finally we can compute the list of entries: search on -- each citation key, and if we had [[[cite *]]] or [[]], -- add all the other entries as well. The [[cite]] -- command takes care of avoiding duplicates. -- = for _, c in ipairs(citekeys) do local e = find_entry(c) if e then cite(c, e) end end if cited_star then for _, es in ipairs(permissive and bibentries or {bibentries}) do logf('Adding all entries in list of %d\n', table.getn(es)) for _, e in ipairs(es) do cite(e.key, e) end end end -- When the dust settles, we adjust members of each -- citation record: the first key actually used becomes -- [[key]], the original key becomes [[orig_key]], and -- other keys go into [[also_cited_as]]. -- = for i = 1, table.getn(citations) do local c = citations[i] local key = assert(first_cited[c], "citation is not cited?!") c.orig_key, c.key = c.key, key local also = { } for k in pairs(cited[c]) do if k ~= key then table.insert(also, k) end end c.also_cited_as = also end -- I've always hated BibTeX's cross-reference feature, -- but I believe I've implemented it faithfully. -- = bibtex.do_crossrefs(citations, find_entry) -- With the entries computed, there are two ways to emit: -- as another BibTeX file or as required by the style -- file. So that we can read from [[bblname]] before -- writing to it, the opening of [[bbl]] is carefully -- delayed to this point. -- = -- = for _, e in ipairs(citations) do if warnings[e] then for _, w in ipairs(warnings[e]) do emit_warning(unpack(w)) end end end local bbl = bblname == '-' and io.stdout or open(bblname, 'w') if bib_out then bibtex.emit(bbl, preamble, citations) else bibstyle.emit(bbl, preamble, citations) end if bblname ~= '-' then bbl:close() end blg:close() end -- Here's a function to emit a list of citations as -- BibTeX source. -- = bibtex.doc.emit = 'outfile * string list * entry list -> unit -- write citations in .bib format' function bibtex.emit(bbl, preamble, citations) local warned = false if preamble[1] then bbl:write('@preamble{\n') for i = 1, table.getn(preamble) do bbl:write(string.format(' %s "%s"\n', i > 1 and '#' or ' ', preamble[i])) end bbl:write('}\n\n') end for _, e in ipairs(citations) do local also = e.also_cited_as if also and table.getn(also) > 0 then for _, k in ipairs(e.also_cited_as or { }) do bbl:write(string.format('@%s{%s, crossref={%s}}\n', e.type, k, e.key)) end if not warned then warned = true bibwarnf("Warning: some entries (such as %s) are cited with multiple keys;\n".. " in the emitted .bib file, these entries are duplicated (using crossref)\n", e.key) end end emit_tkf.bib(bbl, e.type, e.key, e.fields) end end -- Cross-reference -- -- If an entry contains a [[crossref]] field, that field -- is used as a key to find the parent, and the entry -- inherits missing fields from the parent. -- -- If the parent is cross-referenced sufficiently often -- (i.e., more than [[min_crossref]] times), it may be -- added to the citation list, in which case the style -- file knows what to do with the [[crossref]] field. But -- if the parent is not cited sufficiently often, it -- disappears, and do does the [[crossref]] field. -- = bibtex.doc.do_crossrefs = "citation list -> unit # add crossref'ed fields in place" function bibtex.do_crossrefs(citations, find_entry) local map = { } --- key to entry (on citation list) local xmap = { } --- key to entry (xref'd only) local xref_count = { } -- entry -> number of times xref'd -- = for i = 1, table.getn(citations) do local c = citations[i] local key = string.lower(c.key) map[key] = map[key] or c end for i = 1, table.getn(citations) do local c = citations[i] if c.fields.crossref then local lowref = string.lower(c.fields.crossref) local parent = map[lowref] or xmap[lowref] if not parent and find_entry then parent = find_entry(lowref) xmap[lowref] = parent end if not parent then biberrorf("Entry %s cross-references to %s, but I can't find %s", c.key, c.fields.crossref, c.fields.crossref) c.fields.crossref = nil else xref_count[parent] = (xref_count[parent] or 0) + 1 local fields = c.fields fields.crossref = parent.key -- force a case match! for k, v in pairs(parent.fields) do -- inherit field if missing fields[k] = fields[k] or v end end end end -- = for _, e in pairs(xmap) do -- includes only missing entries if xref_count[e] >= min_crossrefs then table.insert(citations, e) end end -- = for i = 1, table.getn(citations) do local c = citations[i] if c.fields.crossref then local parent = xmap[string.lower(c.fields.crossref)] if parent and xref_count[parent] < min_crossrefs then c.fields.crossref = nil end end end end -- The query engine (i.e., the point of it all) -- -- [*] The query language is described in the man page -- for [[nbibtex]]. Its implementation is divided into -- two parts: the internal predicates which are composed -- to form a query predicate, and the parser that takes a -- string and produces a query predicate. Function -- [[matchq]] is declared [[local]] above and is the only -- function visible outside this block. -- = do if not boyer_moore then require 'boyer-moore' end local bm = boyer_moore local compile = bm.compilenc local search = bm.matchnc -- type predicate = type * field table -> bool -- val match : field * string -> predicate -- val author : string -> predicate -- val matchty : string -> predicate -- val andp : predicate option * predicate option -> predicate option -- val orp : predicate option * predicate option -> predicate option -- val matchq : string -> predicate --- compile query string -- Query predicates -- -- The common case is a predicate for a named field. We -- also have some special syntax for ``all fields'' and -- the BibTeX ``type,'' which is not a field. -- = local matchty local function match(field, string) if string == '' then return nil end local pat = compile(string) if field == '*' then return function (t, fields) for _, v in pairs(fields) do if search(pat, v) then return true end end end elseif field == '[type]' then return matchty(string) else return function (t, fields) return search(pat, fields[field] or '') end end end -- Here's a type matcher. -- -- = function matchty(string) if string == '' then return nil end local pat = compile(string) return function (t, fields) return search(pat, t) end end -- We make a special case of [[author]] because it really -- means ``author or editor.'' -- = local function author(string) if string == '' then return nil end local pat = compile(string) return function (t, fields) return search(pat, fields.author or fields.editor or '') end end -- We conjoin and disjoin predicates, being careful to -- use tail calls (not [[and]] and [[or]]) in order to -- save stack space. -- = local function andp(p, q) -- associate to right for constant stack space if not p then return q elseif not q then return p else return function (t,f) if p(t,f) then return q(t,f) end end end end -- = local function orp(p, q) -- associate to right for constant stack space if not p then return q elseif not q then return p else return function (t,f) if p(t,f) then return true else return q(t,f) end end end end -- The query compiler -- -- The function [[matchq]] takes the syntax explained in -- the man page and produces a predicate. -- = function matchq(query) local find = string.find local parts = split(query, '%:') local p = nil if parts[1] and not find(parts[1], '=') then -- Here's where an unnamed key defaults to author or -- editor. -- = for _, word in ipairs(split(parts[1], '-')) do p = andp(author(word), p) end table.remove(parts, 1) if parts[1] and not find(parts[1], '=') then -- = local field, words = find(parts[1], '%D') and 'title' or 'year', parts[1] -- There could be lots of matches on a year, so we check -- years last. -- = for _, word in ipairs(split(words, '-')) do if field == 'year' then p = andp(p, match(field, word)) else p = andp(match(field, word), p) end end table.remove(parts, 1) if parts[1] and not find(parts[1], '=') then -- = if find(parts[1], '%D') then local ty = nil for _, word in ipairs(split(parts[1], '-')) do ty = orp(matchty(word), ty) end p = andp(p, ty) --- check type last for efficiency else for _, word in ipairs(split(parts[1], '-')) do p = andp(p, match('year', word)) -- check year last for efficiency end end table.remove(parts, 1) end end end for _, part in ipairs(parts) do if not find(part, '=') then biberrorf('bad query %q --- late specs need = sign', query) else local _, _, field, words = find(part, '^(.*)=(.*)$') assert(field and words, 'bug in query parsing') -- There could be lots of matches on a year, so we check -- years last. -- = for _, word in ipairs(split(words, '-')) do if field == 'year' then p = andp(p, match(field, word)) else p = andp(match(field, word), p) end end end end if not p then bibwarnf('empty query---matches everything\n') return function() return true end else return p end end -- The [[query]] function uses the engine described in -- Section [->]. -- = function query(c, entries) local p = matchq(c) local t = { } for _, e in ipairs(entries) do if p(e.type, e.fields) then table.insert(t, e) end end return t end bibtex.query = query bibtex.doc.query = 'query: string -> entry list -> entry list' end -- Function [[bibpath]] is normally called on a bibname -- in a LaTeX file, but because a bibname may also be -- given on the command line, we add .bib only if not -- already present. Also, because we can -- = bibtex.doc.bibpath = 'string -> string # from \\bibliography name, find pathname of file' function bibtex.bibpath(bib) if find(bib, '/') then local f, msg = io.open(bib) if not f then return nil, msg else f:close() return bib end else if not find(bib, '%.bib$') then bib = bib .. '.bib' end local pathname = capture('kpsewhich ' .. bib) if string.len(pathname) > 1 then return pathname else return nil, 'kpsewhich cannot find ' .. bib end end end -- The simplest entry is legitimate BibTeX source: -- -- = ------------------------------------------------------------------------ ---------------------- IMPLEMENTATION OF NBIBFIND ---------------------- ------------------------------------------------------------------------ function emit_tkf.bib(outfile, type, key, fields) outfile:write('@', type, '{', key, ',\n') for k, v in pairs(fields) do outfile:write(' ', k, ' = {', v, '},\n') end outfile:write('}\n\n') end -- For the other two entries, we devise a string format. -- In principle, we could go with an ASCII form of a -- full-blown style, but since the purpose is to identify -- the entry in relatively few characters, it seems -- sufficient to spit out the author, year, title, and -- possibly the source. ``Full'' output shows the whole -- string; ``terse'' is just the first line. -- = do local function bibstring(type, key, fields, bib) -- = local format_lab_names do local fmt = '{vv }{ll}' local function format_names(s) local s = bst.commafy(bst.format_names(fmt, bst.namesplit(s))) return (string.gsub(s, ' and others$', ' et al.')) end function format_lab_names(s) if not s then return s end local t = bst.namesplit(s) if table.getn(t) > 3 then return bst.format_name(fmt, t[1]) .. ' et al.' else return format_names(s) end end end local names = format_lab_names(fields.author) or format_lab_names(fields.editor) or fields.key or fields.organization or '????' local year = fields.year local lbl = names .. (year and ' ' .. year or '') local title = fields.title or '????' if bib then key = string.gsub(bib, '.*/', '') .. ': ' .. key end local answer = bib and string.format('%-25s = %s: %s', key, lbl, title) or string.format('%-21s = %s: %s', key, lbl, title) local where = fields.booktitle or fields.journal if where then answer = answer .. ', in ' .. where end answer = string.gsub(answer, '%~', ' ') for _, cs in ipairs { 'texttt', 'emph', 'textrm', 'textup' } do answer = string.gsub(answer, '\\' .. cs .. '%A', '') end answer = string.gsub(answer, '[%{%}]', '') return answer end function emit_tkf.terse(outfile, type, key, fields, bib) outfile:write(truncate(bibstring(type, key, fields, bib), 80), '\n') end function emit_tkf.full(outfile, type, key, fields, bib) local w = bst.writer(outfile) w:write(bibstring(type, key, fields, bib), '\n') end end -- = bibtex.doc.run_find = 'string list -> unit # main program for nbibfind' bibtex.doc.find = 'string * string list -> entry list' function bibtex.find(pattern, bibs) local es = { } local p = matchq(pattern) for _, bib in ipairs(bibs) do local rdr = bibtex.open(bib, bst.months(), hold_warning) for type, key, fields in entries(rdr) do if type == nil then break elseif not type then io.stderr:write('Something disastrous happened with entry ', key, '\n') elseif key == pattern or p(type, fields) then -- = local ws = held_warnings() if ws then for _, w in ipairs(ws) do emit_warning(unpack(w)) end end table.insert(es, { type = type, key = key, fields = fields, bib = table.getn(bibs) > 1 and bib }) else drop_warnings() end end rdr:close() end return es end function bibtex.run_find(argv) local emit = emit_tkf.terse while argv[1] and find(argv[1], '^-') do if emit_tkf[string.sub(argv[1], 2)] then emit = emit_tkf[string.sub(argv[1], 2)] else biberrorf('Unrecognized option %s', argv[1]) end table.remove(argv, 1) end if table.getn(argv) == 0 then io.stderr:write(string.format('Usage: %s [-bib|-terse|-full] pattern [bibs]\n', string.gsub(argv[0], '.*/', ''))) os.exit(1) end local pattern = table.remove(argv, 1) local bibs = { } -- If we have no arguments, search all available -- bibfiles. Otherwise, an argument with a [[/]] is a -- pathname, and an argument without [[/]] is a name as -- it would appear in [[[BibTeX bibliography] -- = if table.getn(argv) == 0 then bibs = all_bibs() else for _, a in ipairs(argv) do if find(a, '/') then table.insert(bibs, a) else table.insert(bibs, assert(bibtex.bibpath(a))) end end end local entries = bibtex.find(pattern, bibs) for _, e in ipairs(entries) do emit(io.stdout, e.type, e.key, e.fields, e.bib) end end -- In classic BibTeX, each style is its own separate -- file. Here, we share code by allowing a single file to -- register multiple styles. -- = ------------------------------------------------------------------------ ----------------------- SUPPORT FOR STYLE FILES ------------------------ ------------------------------------------------------------------------ bibtex.doc.register_style = [[string * style -> unit # remember style with given name type style = { emit : outfile * string list * citation list -> unit , style : table of formatting functions # defined document types , macros : unit -> macro table }]] bibtex.doc.style = 'name -> style # return style with given name, loading on demand' do local styles = { } function bibtex.register_style(name, s) assert(not styles[name], "Duplicate registration of style " .. name) styles[name] = s s.name = s.name or name end function bibtex.style(name) if not styles[name] then local loaded if config.nbs then local loaded = loadfile(config.nbs .. '/' .. name .. '.nbs') if loaded then loaded() end end if not loaded then require ('nbib-' .. name) end if not styles[name] then bibfatalf('Tried to load a file, but it did not register style %s\n', name) end end return styles[name] end end -- Sometimes we want to know not how many characters are -- in a string, but how much space we expect it to take -- when typeset. (Or rather, we want to compare such -- widths to find the widest.) This is original BibTeX's -- [[width]] function. -- -- The code should use the [[char_width]] array, for -- which [[space]] is the only whitespace character given -- a nonzero printing width. The widths here are taken -- from Stanford's June '87 cmr10 font and represent -- hundredths of a point (rounded), but since they're -- used only for relative comparisons, the units have no -- meaning. -- = do local char_width = { } local special_widths = { ss = 500, ae = 722, oe = 778, AE = 903, oe = 1014 } for i = 0, 255 do char_width[i] = 0 end local char_width_from_32 = { 278, 278, 500, 833, 500, 833, 778, 278, 389, 389, 500, 778, 278, 333, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 278, 778, 472, 472, 778, 750, 708, 722, 764, 681, 653, 785, 750, 361, 514, 778, 625, 917, 750, 778, 681, 778, 736, 556, 722, 750, 750, 1028, 750, 750, 611, 278, 500, 278, 500, 278, 278, 500, 556, 444, 556, 444, 306, 500, 556, 278, 306, 528, 278, 833, 556, 500, 556, 528, 392, 394, 389, 556, 528, 722, 528, 528, 444, 500, 1000, 500, 500, } for i = 1, table.getn(char_width_from_32) do char_width[32+i-1] = char_width_from_32[i] end bst.doc.width = "string -> faux_points # width of string in 1987 cmr10" function bst.width(s) assert(false, 'have not implemented width yet') end end -- Parsing names and lists of names -- -- Names in a string are separated by and surrounded by -- nonnull whitespace. Case is not significant. -- = local function namesplit(s) local t = split(s, '%s+[aA][nN][dD]%s+', find_outside_braces) local i = 2 while i <= table.getn(t) do while find(t[i], '^[aA][nN][dD]%s+') do t[i] = string.gsub(t[i], '^[aA][nN][dD]%s+', '') table.insert(t, i, '') i = i + 1 end i = i + 1 end return t end bst.namesplit = namesplit bst.doc.namesplit = 'string -> list of names # split names on "and"' -- = local sep_and_not_tie = '%-' local sep_chars = sep_and_not_tie .. '%~' -- To parse an individual name, we want to count commas. -- We first remove leading white space (and -- [[sep_char]]s), and trailing white space (and -- [[sep_char]]s) and commas, complaining for each -- trailing comma. -- -- We then represent the name as two sequences: -- [[tokens]] and [[trailers]]. The [[tokens]] are the -- names themselves, and the [[trailers]] are the -- separator characters between tokens. (A separator is -- white space, a dash, or a tie, and multiple separators -- in sequence are frowned upon.) The [[commas]] table -- becomes an array mapping the comma number to the index -- of the token that follows it. -- = local parse_name do local white_sep = '[' .. sep_chars .. '%s]+' local white_comma_sep = '[' .. sep_chars .. '%s%,]+' local trailing_commas = '(,[' .. sep_chars .. '%s%,]*)$' local sep_char = '[' .. sep_chars .. ']' local leading_white_sep = '^' .. white_sep -- = function isVon(s) local lower = find_outside_braces(s, '%l') -- first nonbrace lowercase local letter = find_outside_braces(s, '%a') -- first nonbrace letter local bs, ebs, command = find_outside_braces(s, '%{%\\(%a+)') -- \xxx if lower and lower <= letter and lower <= (bs or lower) then return true elseif letter and letter <= (bs or letter) then return false elseif bs then if upper_specials[command] then return false elseif lower_specials[command] then return true else local close_brace = find_outside_braces(s, '%}', ebs+1) lower = find(s, '%l') -- first nonbrace lowercase letter = find(s, '%a') -- first nonbrace letter return lower and lower <= letter end else return false end end function parse_name(s, inter_token) if string.find(s, trailing_commas) then biberrorf("Name '%s' has one or more commas at the end", s) end s = string.gsub(s, trailing_commas, '') s = string.gsub(s, leading_white_sep, '') local tokens = split(s, white_comma_sep, find_outside_braces) local trailers = splitters(s, white_comma_sep, find_outside_braces) -- The string separating tokens is reduced to a single -- ``separator character.'' A comma always trumps other -- separator characters. Otherwise, if there's no comma, -- we take the first character, be it a separator or a -- space. (Patashnik considers that multiple such -- characters constitute ``silliness'' on the user's -- part.) -- = for i = 1, table.getn(trailers) do local s = trailers[i] assert(string.len(s) > 0) if find(s, ',') then trailers[i] = ',' else trailers[i] = string.sub(s, 1, 1) end end local commas = { } --- maps each comma to index of token the follows it for i, t in ipairs(trailers) do string.gsub(t, ',', function() table.insert(commas, i+1) end) end local name = { } -- A name has up to four parts: the most general form is -- either ``First von Last, Junior'' or ``von Last, -- First, Junior'', but various vons and Juniors can be -- omitted. The name-parsing algorithm is baroque and is -- transliterated from the original BibTeX source, but -- the principle is clear: assign the full version of -- each part to the four fields [[ff]], [[vv]], [[ll]], -- and [[jj]]; and assign an abbreviated version of each -- part to the fields [[f]], [[v]], [[l]], and [[j]]. -- = local first_start, first_lim, last_lim, von_start, von_lim, jr_lim -- variables mark subsequences; if start == lim, sequence is empty local n = table.getn(tokens) -- The von name, if any, goes from the first von token to -- the last von token, except the last name is entitled -- to at least one token. So to find the limit of the von -- name, we start just before the last token and wind -- down until we find a von token or we hit the von start -- (in which latter case there is no von name). -- = function divide_von_from_last() von_lim = last_lim - 1; while von_lim > von_start and not isVon(tokens[von_lim-1]) do von_lim = von_lim - 1 end end local commacount = table.getn(commas) if commacount == 0 then -- first von last jr von_start, first_start, last_lim, jr_lim = 1, 1, n+1, n+1 -- OK, here's one form. -- -- = local got_von = false while von_start < last_lim-1 do if isVon(tokens[von_start]) then divide_von_from_last() got_von = true break else von_start = von_start + 1 end end if not got_von then -- there is no von name while von_start > 1 and find(trailers[von_start - 1], sep_and_not_tie) do von_start = von_start - 1 end von_lim = von_start end first_lim = von_start elseif commacount == 1 then -- von last jr, first von_start, last_lim, jr_lim, first_start, first_lim = 1, commas[1], commas[1], commas[1], n+1 divide_von_from_last() elseif commacount == 2 then -- von last, jr, first von_start, last_lim, jr_lim, first_start, first_lim = 1, commas[1], commas[2], commas[2], n+1 divide_von_from_last() else biberrorf("Too many commas in name '%s'") end -- = -- We set long and short forms together; [[ss]] is the -- long form and [[s]] is the short form. -- = local function set_name(start, lim, long, short) if start < lim then -- string concatenation is quadratic, but names are short -- An abbreviated token is the first letter of a token, -- except again we have to deal with the damned specials. -- = local function abbrev(token) local first_alpha, _, alpha = find(token, '(%a)') local first_brace = find(token, '%{%\\') if first_alpha and first_alpha <= (first_brace or first_alpha) then return alpha elseif first_brace then local i, j, special = find(token, '(%b{})', first_brace) if i then return special else -- unbalanced braces return string.sub(token, first_brace) end else return '' end end local ss = tokens[start] local s = abbrev(tokens[start]) for i = start + 1, lim - 1 do if inter_token then ss = ss .. inter_token .. tokens[i] s = s .. inter_token .. abbrev(tokens[i]) else local ssep, nnext = trailers[i-1], tokens[i] local sep, next = ssep, abbrev(nnext) -- Here is the default for a character between tokens: -- a tie is the default space character between the last -- two tokens of the name part, and between the first two -- tokens if the first token is short enough; otherwise, -- a space is the default. -- = if find(sep, sep_char) then -- do nothing; sep is OK elseif i == lim-1 then sep, ssep = '~', '~' elseif i == start + 1 then sep = text_char_count(s) < 3 and '~' or ' ' ssep = text_char_count(ss) < 3 and '~' or ' ' else sep, ssep = ' ', ' ' end ss = ss .. ssep .. nnext s = s .. '.' .. sep .. next end end name[long] = ss name[short] = s end end set_name(first_start, first_lim, 'ff', 'f') set_name(von_start, von_lim, 'vv', 'v') set_name(von_lim, last_lim, 'll', 'l') set_name(last_lim, jr_lim, 'jj', 'j') return name end end bst.parse_name = parse_name bst.doc.parse_name = 'string * string option -> name table' -- Formatting names -- -- Lacking Lua's string-processing utilities, classic -- BibTeX defines a way of converting a ``format string'' -- and a name into a formatted name. I find this -- formatting technique painful, but I also wanted to -- preserve compatibility with existing bibliography -- styles, so I've implemented it as accurately as I can. -- -- The interface is not quite identical to classic -- BibTeX; a style can use [[namesplit]] to split names -- and then [[format_name]] to format a single one, or it -- can throw caution to the winds and call -- [[format_names]] to format a whole list of names. -- = bst.doc.format_names = "format * name list -> string list # format each name in list" function bst.format_names(fmt, t) local u = { } for i = 1, table.getn(t) do u[i] = bst.format_name(fmt, t[i]) end return u end -- A BibTeX format string contains its variable elements -- inside braces. Thus, we format a name by replacing -- each braced substring of the format string. -- = do local good_keys = { ff = true, vv = true, ll = true, jj = true, f = true, v = true, l = true, j = true, } bst.doc.format_name = "format * name -> string # format 1 name as in bibtex" function bst.format_name(fmt, name) local t = type(name) == 'table' and name or parse_name(name) -- at most one of the important letters, perhaps doubled, may appear local function replace_braced(s) local i, j, alpha = find_outside_braces(s, '(%a+)', 2) if not i then return '' --- can never be printed, but who are we to complain? elseif not good_keys[alpha] then biberrorf ('The format string %q has an illegal brace-level-1 letter', s) elseif find_outside_braces(s, '%a+', j+1) then biberrorf ('The format string %q has two sets of brace-level-1 letters', s) elseif t[alpha] then local k = j + 1 local t = t -- = local kk, jj = find(s, '%b{}', k) if kk and kk == k then k = jj + 1 if type(name) == 'string' then t = parse_name(name, string.sub(s, kk+1, jj-1)) else error('Style error -- used a pre-parsed name with non-standard inter-token format string') end end local head, tail = string.sub(s, 2, i-1) .. t[alpha], string.sub(s, k, -2) -- = if find(tail, '%~%~$') then tail = string.sub(tail, 1, -2) -- denotes hard tie elseif find(tail, '%~$') then if text_char_count(head) + text_char_count(tail) - 1 >= 3 then tail = string.gsub(tail, '%~$', ' ') end end return head .. tail else return '' end end return (string.gsub(fmt, '%b{}', replace_braced)) end end -- Line-wrapping output -- -- EXPLAIN THIS INTERFACE!!! -- -- My [[max_print_line]] appears to be off by one from -- Oren Patashnik's. -- = local min_print_line, max_print_line = 3, 79 bibtex.hard_max = max_print_line bibtex.doc.hard_max = 'int # largest line that avoids a forced line break (for wizards)' bst.doc.writer = "io-handle * int option -> object # result:write(s) buffers and breaks lines" function bst.writer(out, indent) indent = indent or 2 assert(indent + 10 < max_print_line) indent = string.rep(' ', indent) local gsub = string.gsub local buf = '' local function write(self, ...) local s = table.concat { ... } local lines = split(s, '\n') lines[1] = buf .. lines[1] buf = table.remove(lines) for i = 1, table.getn(lines) do local line = lines[i] if not find(line, '^%s+$') then -- no line of just whitespace line = gsub(line, '%s+$', '') while string.len(line) > max_print_line do -- = local last_pre_white, post_white local i, j, n = 1, 1, string.len(line) while i and i <= n and i <= max_print_line do i, j = find(line, '%s+', i) if i and i <= max_print_line + 1 then if i > min_print_line then last_pre_white, post_white = i - 1, j + 1 end i = j + 1 end end if last_pre_white then out:write(string.sub(line, 1, last_pre_white), '\n') if post_white > max_print_line + 2 then post_white = max_print_line + 2 -- bug-for-bug compatibility with bibtex end line = indent .. string.sub(line, post_white) elseif n < bibtex.hard_max then out:write(line, '\n') line = '' else -- ``unbreakable'' out:write(string.sub(line, 1, bibtex.hard_max-1), '%\n') line = string.sub(line, bibtex.hard_max) end end out:write(line, '\n') end end end assert(out.write, "object passed to bst.writer does not have a write method") return { write = write } end -- Functions copied from classic BibTeX -- -- Adding a period -- -- Find the last non-[[]] character, and if it is not a -- sentence terminator, add a period. -- = do local terminates_sentence = { ["."] = true, ["?"] = true, ["!"] = true } bst.doc.add_period = "string -> string # add period unless already .?!" function bst.add_period(s) local _, _, last = find(s, '([^%}])%}*$') if last and not terminates_sentence[last] then return s .. '.' else return s end end end -- Case-changing -- -- Classic BibTeX has a [[change.case]] function, which -- takes an argument telling whether to change to lower -- case, upper case, or ``title'' case (which has initial -- letters capitalized). Because Lua supports first-class -- functions, it makes more sense just to export three -- functions: [[lower]], [[title]], and [[upper]]. -- = do bst.doc.lower = "string -> string # lower case according to bibtex rules" bst.doc.upper = "string -> string # upper case according to bibtex rules" bst.doc.title = "string -> string # title case according to bibtex rules" -- Case conversion is complicated by the presence of -- brace-delimited sequences, especially since there is -- one set of conventions for a ``special character'' -- (brace-delimited sequence beginning with TeX control -- sequence) and another set of conventions for other -- brace-delimited sequences. To deal with them, we -- typically do an ``odd-even split'' on balanced braces, -- then apply a ``normal'' conversion function to the odd -- elements and a ``special'' conversion function to the -- even elements. The application is done by [[oeapp]]. -- = local function oeapp(f, g, t) for i = 1, table.getn(t), 2 do t[i] = f(t[i]) end for i = 2, table.getn(t), 2 do t[i] = g(t[i]) end return t end -- Here is [[convert_special]]. If a special begins with -- an alphabetic control sequence, we convert only -- elements between control sequences. If a special -- begins with a nonalphabetic control sequence, we -- convert the whole special as usual. Finally, if a -- special does not begin with a control sequence, we -- leave it the hell alone. (This is the convention that -- allows us to put [[FORTRAN]] in a BibTeX entry and be -- assured that capitalization is not lost.) -- = function convert_special(cvt) return function(s) if find(s, '^{\\(%a+)') then local t = odd_even_split(s, '\\%a+') for i = 1, table.getn(t), 2 do t[i] = cvt(t[i]) end return table.concat(t) elseif find(s, '^{\\') then return cvt(s) else return s end end end -- Title conversion doesn't fit so nicely into the -- framework. -- -- Function [[lower_later]] lowers all but the first -- letter of a string. -- = local function lower_later(s) return string.sub(s, 1, 1) .. string.lower(string.sub(s, 2)) end -- Upper- and lower-case conversion are easiest. -- Non-specials are hit directly with [[string.lower]] or -- [[string.upper]]; for special characters, we use -- utility called [[convert_special]]. -- = local lower_special = convert_special(string.lower) local upper_special = convert_special(string.upper) function bst.lower(s) return table.concat(oeapp(string.lower, lower_special, brace_split(s))) end function bst.upper(s) return table.concat(oeapp(string.upper, upper_special, brace_split(s))) end -- For title conversion, we don't mess with a token that -- follows a colon. Hence, we must maintain [[prev]] and -- can't use [[convert_special]]. -- = local function title_special(s, prev) if find(prev, ':%s+$') then return s else if find(s, '^{\\(%a+)') then local t = odd_even_split(s, '\\%a+') for i = 1, table.getn(t), 2 do local prev = t[i-1] or prev if find(prev, ':%s+$') then assert(false, 'bugrit') else t[i] = string.lower(t[i]) end end return table.concat(t) elseif find(s, '^{\\') then return string.lower(s) else return s end end end -- Internal function [[recap]] deals with the damn -- colons. -- = function bst.title(s) local function recap(s, first) local parts = odd_even_split(s, '%:%s+') parts[1] = first and lower_later(parts[1]) or string.lower(parts[1]) for i = (first and 3 or 1), table.getn(parts), 2 do parts[i] = lower_later(parts[i]) end return table.concat(parts) end local t = brace_split(s) for i = 1, table.getn(t), 2 do -- elements outside specials get recapped t[i] = recap(t[i], i == 1) end for i = 2, table.getn(t), 2 do -- specials are, well, special local prev = t[i-1] if i == 2 and not find(prev, '%S') then prev = ': ' end t[i] = title_special(t[i], prev) end return table.concat(t) end end -- Purification -- -- Purification (classic [[purify]]) involves removing -- non-alphanumeric characters. Each sequence of -- ``separator'' characters becomes a single space. -- = do bst.doc.purify = "string -> string # remove nonalphanumeric, non-sep chars" local high_alpha = string.char(128) .. '-' .. string.char(255) local sep_white_char = '[' .. sep_chars .. '%s]' local disappears = '[^' .. sep_chars .. high_alpha .. '%s%w]' local gsub = string.gsub local function purify(s) return gsub(gsub(s, sep_white_char, ' '), disappears, '') end -- special characters are purified by removing all non-alphanumerics, -- including white space and sep-chars local function spurify(s) return gsub(s, '[^%w' .. high_alpha .. ']+', '') end local purify_all_chars = { oe = true, OE = true, ae = true, AE = true, ss = true } function bst.purify(s) local t = brace_split(s) for i = 1, table.getn(t) do local _, k, cmd = find(t[i], '^{\\(%a+)%s*') if k then if lower_specials[cmd] or upper_specials[cmd] then if not purify_all_chars[cmd] then cmd = string.sub(cmd, 1, 1) end t[i] = cmd .. spurify(string.sub(t[i], k+1)) else t[i] = spurify(string.sub(t[i], k+1)) end elseif find(t[i], '^{\\') then t[i] = spurify(t[i]) else t[i] = purify(t[i]) end end return table.concat(t) end end -- Text prefix -- -- Function [[text_prefix]] (classic [[text.prefix]]) -- takes an initial substring of a string, with the -- proviso that a BibTeX ``special character'' sequence -- counts as a single character. -- = bst.doc.text_prefix = "string * int -> string # take first n chars with special == 1" function bst.text_prefix(s, n) local t = brace_split(s) local answer, rem = '', n for i = 1, table.getn(t), 2 do answer = answer .. string.sub(t[i], 1, rem) rem = rem - string.len(t[i]) if rem <= 0 then return answer end if find(t[i+1], '^{\\') then answer = answer .. t[i+1] rem = rem - 1 else -- = local s = t[i+1] local braces = 0 local sub = string.sub for i = 1, string.len(s) do local c = sub(s, i, i) if c == '{' then braces = braces + 1 elseif c == '}' then braces = braces + 1 else rem = rem - 1 if rem == 0 then return answer .. string.sub(s, 1, i) .. string.rep('}', braces) end end end answer = answer .. s end end return answer end -- Emptiness test -- -- Function [[empty]] (classic [[empty]]) tells if a -- value is empty; i.e., it is missing (nil) or it is -- only white space. -- = bst.doc.empty = "string option -> bool # is string there and holding nonspace?" function bst.empty(s) return s == nil or not find(s, '%S') end -- Other utilities -- -- A stable sort -- -- Function [[bst.sort]] is like [[table.sort]] only -- stable. It is needed because classic BibTeX uses a -- stable sort. Its interface is the same as -- [[table.sort]]. -- = bst.doc.sort = 'value list * compare option # like table.sort, but stable' function bst.sort(t, lt) lt = lt or function(x, y) return x < y end local pos = { } --- position of each element in original table for i = 1, table.getn(t) do pos[t[i]] = i end local function nlt(x, y) if lt(x, y) then return true elseif lt(y, x) then return false else -- elements look equal return pos[x] < pos[y] end end return table.sort(t, nlt) end bst.doc.sort = 'value list * compare option -> unit # stable sort' -- The standard months -- -- Every style is required to recognize the months, so we -- make it easy to create a fresh table with either full -- or abbreviated months. -- = bst.doc.months = "string option -> table # macros table containing months" function bst.months(what) local m = { jan = "January", feb = "February", mar = "March", apr = "April", may = "May", jun = "June", jul = "July", aug = "August", sep = "September", oct = "October", nov = "November", dec = "December" } if what == 'short' or what == 3 then for k, v in pairs(m) do m[k] = string.sub(v, 1, 3) end end return m end -- Comma-separated lists -- -- The function [[commafy]] takes a list and inserts -- commas and [[and]] (or [[or]]) using American -- conventions. For example, -- -- [[commafy 'Graham', 'Knuth', 'Patashnik' ]] -- -- returns [['Graham, Knuth, and Patashnik']], but -- -- [[commafy 'Knuth', 'Plass' ]] -- -- returns [['Knuth and Plass']]. -- = bst.doc.commafy = "string list -> string # concat separated by commas, and" function bst.commafy(t, andword) andword = andword or 'and' local n = table.getn(t) if n == 1 then return t[1] elseif n == 2 then return t[1] .. ' ' .. andword .. ' ' .. t[2] else local last = t[n] t[n] = andword .. ' ' .. t[n] local answer = table.concat(t, ', ') t[n] = last return answer end end -- Here are a couple of test functions I used during -- development that I thought might be worth keeping -- around. -- = ------------------------------------------------------------------------ -------------------------- TESTING AND SO ON --------------------------- ------------------------------------------------------------------------ bibtex.doc.cat = 'string -> unit # emit the named bib file in bib format' function bibtex.cat(bib) local rdr = bibtex.open(bib, bst.months()) if not rdr then rdr = assert(bibtex.open(assert(bibtex.bibpath(bib)), bst.months())) end for type, key, fields in entries(rdr) do if type == nil then break elseif not type then io.stderr:write('Error on key ', key, '\n') else emit_tkf.bib(io.stdout, type, key, fields) end end bibtex.close(rdr) end -- = bibtex.doc.count = 'string list -> unit # take list of bibs and print number of entries' function bibtex.count(argv) local bibs = { } local macros = { } local n = 0 -- If we have no arguments, search all available -- bibfiles. Otherwise, an argument with a [[/]] is a -- pathname, and an argument without [[/]] is a name as -- it would appear in [[[BibTeX bibliography] -- = if table.getn(argv) == 0 then bibs = all_bibs() else for _, a in ipairs(argv) do if find(a, '/') then table.insert(bibs, a) else table.insert(bibs, assert(bibtex.bibpath(a))) end end end local function warn() end for _, bib in ipairs(bibs) do local rdr = bibtex.open(bib, macros) for type, key, fields in entries(rdr) do if type == nil then break elseif type then n = n + 1 end end rdr:close() end printf("%d\n", n) end -- = bibtex.doc.all_entries = "bibname * macro-table -> preamble * citation list" function bibtex.all_entries(bib, macros) macros = macros or bst.months() warn = warn or emit_warning local rdr = bibtex.open(bib, macros, warn) if not rdr then rdr = assert(bibtex.open(assert(bibtex.bibpath(bib)), macros, warn), "could not open bib file " .. bib) end local cs = { } local seen = { } for type, key, fields in entries(rdr) do if type == nil then break elseif not type then io.stderr:write(key, '\n') elseif not seen[key] then seen[key] = true table.insert(cs, { type = type, key = key, fields = fields, file = bib, line = rdr.entry_line }) end end local p = assert(rdr.preamble) rdr:close() return p, cs end -- = assert(min_print_line >= 3) assert(max_print_line > min_print_line) return bibtex nbibtex-0.9.18/README0000664007651200140720000000550310430514626011763 0ustar nrnr NbibTeX -- A better BibTeX ~~~~~~~~~~~~~~~~~~~~~~~~~~ NbibTeX helps authors take better advantage of BibTeX data, especially when working in collaboration. Instead of using BibTeX 'keys', which are chosen arbitrarily and idiosyncratically, NbibTeX builds a bibliography by searching the actual contents of citations. The command nbibtex can be used just as you would use bibtex. Your \cite{...} commands are interpreted either as classic BibTeX keys (for backward compatibility) or as search commands. Thus, if your bibliography contains the classic paper on type inference, nbibtex should find it using a citation like \cite{damas-milner:1978}, or \cite{damas-milner:polymorphism}, or perhaps even simply \cite{damas-milner}. The same citations should also work with your coauthors' bibliographies, even if those bibliographies are organized differently. NbibTeX also comes with the nbibfind command, which uses the NbibTeX search engine on the command line. If you know you are looking for a paper by Harper and Moggi, you can just type nbibfind harper-moggi and see what comes out. To help you work with coauthors who don't have NbibTeX, nbibtex can also emit a .bib file containing exactly the entries cited in your paper. Using NbibTeX ~~~~~~~~~~~~~ I envision three different ways for people to use NbibTeX. 1. Use as you would bibtex for your own papers with your own bibliography. Your file paper.tex will contain \bibliography{yours}, and to create a bibliography you will simply use nbibtex paper 2. Use to work with coauthors who also have NbibTeX, each using his or her own bibliography. Your file paper.tex will contain \bibliography{yours,mine,his}, and to create a bibliography you will use nbibtex -permissive paper nbibtex will cheerfully ignore any missing bibliographies. 3. Use to work with coauthors, some of whom have only bibtex. In this case, your best bet is to use nbibtex to make a paper-specific bibliography file. Your file paper.tex will contain \bibliography{paper}, and to create or update paper.bib you will use nbibtex -permissive -bib -o paper.bib paper paper yours This command line tells nbibtex to emit a .bib file (-bib) to file paper.bib, based on citations found in paper.aux (first paper) and using BibTeX entries found in either paper.bib (second paper) or in yours.bib. Because of the -permissive option, it is OK if paper.bib is missing. With paper.bib in place, you and your coauthors can all use classic BibTeX: bibtex paper You might enjoy trying out option 3 on the enclosed paper 'fun.tex'. Indefensible hacking based on NbibTeX ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ I'm using the same infrastructure to keep my web pages up to date, but that's a story for another day. nbibtex-0.9.18/boyer-moore.c0000664007651200140720000000671610513752504013516 0ustar nrnr#line 61 "boyer-moore.nw" #include #include #include #include #include #include #include #define ALPHASIZE 256 /* size of alphabet */ /* bmBc[256] has last occurrence of each character in pattern */ static void preBmBc(const unsigned char *x, int m, int bmBc[]) { int i; for (i = 0; i < ALPHASIZE; ++i) bmBc[i] = m; for (i = 0; i < m - 1; ++i) bmBc[x[i]] = m - i - 1; } /* suff[m] does what?? */ static void suffixes(const unsigned char *x, int m, int *suff) { int f, g, i; suff[m - 1] = m; g = m - 1; for (i = m - 2; i >= 0; --i) { if (i > g && suff[i + m - 1 - f] < i - g) suff[i] = suff[i + m - 1 - f]; else { if (i < g) g = i; f = i; while (g >= 0 && x[g] == x[g + m - 1 - f]) --g; suff[i] = f - g; } } } static void preBmGs(const unsigned char *x, int m, int bmGs[]) { int i, j, *suff; suff = malloc(m * sizeof(*suff)); assert(suff); suffixes(x, m, suff); for (i = 0; i < m; ++i) bmGs[i] = m; j = 0; for (i = m - 1; i >= -1; --i) if (i == -1 || suff[i] == i + 1) for (; j < m - 1 - i; ++j) if (bmGs[j] == m) bmGs[j] = m - 1 - i; for (i = 0; i <= m - 2; ++i) bmGs[m - 1 - suff[i]] = m - 1 - i; free(suff); } #define MAX(A, B) ((A) > (B) ? (A) : (B)) #define MATMETA "boyer-moore.ncmatcher" typedef struct matcher { int m; int bmBc[ALPHASIZE]; int *bmGs; unsigned char *pat; } *Matcher; static int compile_nocase(lua_State *L) { /* take string and return compiled tolower(string) as a case-insensitive matcher */ const unsigned char *x = (const unsigned char *) luaL_checkstring(L, 1); int m = lua_strlen(L, 1); Matcher mat = lua_newuserdata(L, sizeof *mat + m * sizeof *(mat->bmGs) + m); int i; if (m == 0) luaL_error(L, "Tried to compile Boyer-Moore matcher for empty string"); assert(mat); luaL_getmetatable(L, MATMETA); lua_setmetatable(L, -2); mat->m = m; mat->bmGs = (int *) (mat+1); mat->pat = (unsigned char *)(mat->bmGs + m); for (i = 0; i < m; i++) mat->pat[i] = tolower(x[i]); /* Preprocessing */ preBmGs(x, m, mat->bmGs); preBmBc(x, m, &mat->bmBc[0]); return 1; } static int search_nocase(lua_State *L) { /* take compiled matcher, string and return first_match, last_match or nil */ Matcher mat = luaL_checkudata(L, 1, MATMETA); const unsigned char *y = (const unsigned char *) luaL_checkstring(L, 2); int n = lua_strlen(L, 2); int i, j; const unsigned char *x = mat->pat; int *bmGs = mat->bmGs; int *bmBc = &mat->bmBc[0]; int m = mat->m; /* Searching */ for (j = 0; j <= n - m; ) { for (i = m - 1; i >= 0 && (x[i] == y[i + j] || x[i] == tolower(y[i+j])); --i); if (i < 0) { lua_pushnumber(L, j+1); /* lua positions are 1-indexed */ lua_pushnumber(L, j+m); /* position of final char (j+1+m-1) */ return 2; j += bmGs[0]; } else j += MAX(bmGs[i], bmBc[tolower(y[i + j])] - m + 1 + i); } return 0; /* no match */ } static const struct luaL_reg bmlib [] = { {"compilenc", compile_nocase }, {"matchnc", search_nocase }, {NULL, NULL} }; int luaopen_boyer_moore (lua_State *L) { luaL_newmetatable(L, MATMETA); luaL_register(L, "boyer_moore", bmlib); return 1; } int luaopen_moore (lua_State *L) { /* tolerate 'boyer-moore.so' */ return luaopen_boyer_moore(L); } nbibtex-0.9.18/nbib.c0000664007651200140720000004745511042435443012174 0ustar nrnr#line 158 "nbib.nw" #include #include #include #include #include #include #include #include #line 205 "nbib.nw" typedef struct bibreader { const char *filename; /* name of the .bib file */ FILE *file; /* .bib file open for read */ int line_num; /* line number of the .bib file */ int entry_line; /* line number of last seen entry start */ unsigned char *buf, *cur, *lim; /* input buffer */ unsigned bufsize; /* size of buffer */ char entry_close; /* character expected to close current entry */ lua_State *L; int preamble; /* reference to preamble list of strings */ int warning; /* reference to universal warning function */ int macros; /* reference to macro table */ } *Bibreader; #line 237 "nbib.nw" typedef int bool; #line 242 "nbib.nw" static bool getline(Bibreader rdr); #line 251 "nbib.nw" static bool upto1(Bibreader rdr, char c); static bool upto1_getline(Bibreader rdr, char c); static void upto_white_or_1(Bibreader rdr, char c); static void upto_white_or_2(Bibreader rdr, char c1, char c2); static void upto_white_or_3(Bibreader rdr, char c1, char c2, char c3); static bool upto_nonwhite(Bibreader rdr); static bool upto_nonwhite_getline(Bibreader rdr); #line 266 "nbib.nw" static bool scan_identifier (Bibreader rdr, char c1, char c2, char c3); static bool scan_nonneg_integer (Bibreader rdr, unsigned *np); #line 272 "nbib.nw" static bool scan_and_buffer_a_field_token (Bibreader rdr, int key, luaL_Buffer *b); static bool scan_balanced_braces(Bibreader rdr, char close, luaL_Buffer *b); static bool scan_and_push_the_field_value (Bibreader rdr, int key); #line 282 "nbib.nw" static void lower_case(unsigned char *p, unsigned char *lim); static void strip_leading_and_trailing_space(lua_State *L); #line 287 "nbib.nw" static int get_bib_command_or_entry_and_process(Bibreader rdr); int luaopen_bibtex (lua_State *L); #line 297 "nbib.nw" typedef bool (*Command)(Bibreader); static Command find_command(unsigned char *p, unsigned char *lim); static bool do_comment (Bibreader rdr); static bool do_preamble(Bibreader rdr); static bool do_string (Bibreader rdr); #line 314 "nbib.nw" static void warnv(Bibreader rdr, int nres, const char *fmt, ...); #line 1044 "nbib.nw" static int openreader(lua_State *L); static int next_entry(lua_State *L); static int closereader(lua_State *L); #line 224 "nbib.nw" bool is_id_char[256]; /* needs initialization */ #define concat_char '#' /* used to concatenate parts of a field defn */ #line 1048 "nbib.nw" static const struct luaL_reg bibtexlib [] = { {"open", openreader}, {"close", closereader}, {"next", next_entry}, {NULL, NULL} }; #line 323 "nbib.nw" #define LERRPUSH(S) do { \ if (!lua_checkstack(rdr->L, 10)) assert(0); \ lua_pushboolean(rdr->L, 0); \ lua_pushfstring(rdr->L, "%s, line %d: ", rdr->filename, rdr->line_num); \ lua_pushstring(rdr->L, S); \ lua_concat(rdr->L, 2); \ } while(0) #define LERRFPUSH(S,A) do { \ if (!lua_checkstack(rdr->L, 10)) assert(0); \ lua_pushboolean(rdr->L, 0); \ lua_pushfstring(rdr->L, "%s, line %d: ", rdr->filename, rdr->line_num); \ lua_pushfstring(rdr->L, S, A); \ lua_concat(rdr->L, 2); \ } while(0) #define LERR(S) do { LERRPUSH(S); return 2; } while(0) #define LERRF(S,A) do { LERRFPUSH(S,A); return 2; } while(0) /* next: cases for Boolean functions */ #define LERRB(S) do { LERRPUSH(S); return 0; } while(0) #define LERRFB(S,A) do { LERRFPUSH(S,A); return 0; } while(0) #line 510 "nbib.nw" #undef ready_tok #define ready_tok(RDR) do { \ if (!upto_nonwhite_getline(RDR)) \ LERRB("Unexpected end of file"); \ } while(0) #line 522 "nbib.nw" #define copy_char(C) luaL_putchar(b, (C)) #line 529 "nbib.nw" static bool scan_and_push_the_field_value (Bibreader rdr, int key) { luaL_Buffer field; luaL_checkstack(rdr->L, 10, "Not enough Lua stack to parse bibtex database"); luaL_buffinit(rdr->L, &field); for (;;) { if (!scan_and_buffer_a_field_token(rdr, key, &field)) return 0; ready_tok(rdr); /* cur now points to [[concat_char]] or end of field */ if (*rdr->cur != concat_char) break; else { rdr->cur++; ready_tok(rdr); } } luaL_pushresult(&field); return 1; } #line 561 "nbib.nw" static bool scan_and_buffer_a_field_token (Bibreader rdr, int key, luaL_Buffer *b) { unsigned char *p; unsigned number; *rdr->lim = ' '; switch (*rdr->cur) { case '{': case '"': return scan_balanced_braces(rdr, *rdr->cur == '{' ? '}' : '"', b); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': p = rdr->cur; scan_nonneg_integer(rdr, &number); luaL_addlstring(b, (char *)p, rdr->cur - p); return 1; default: /* named macro */ p = rdr->cur; if (!scan_identifier(rdr, ',', rdr->entry_close, concat_char)) LERRB("Expected a field part"); lower_case (p, rdr->cur); /* ignore case differences */ /* missing warning of macro name used in its own definition */ lua_pushlstring(rdr->L, (char *) p, rdr->cur - p); /* stack: name */ lua_getref(rdr->L, rdr->macros); /* stack: name macros */ lua_insert(rdr->L, -2); /* stack: name macros name */ lua_gettable(rdr->L, -2); /* stack: name defn */ lua_remove(rdr->L, -2); /* stack: defn */ #line 595 "nbib.nw" { int t = lua_gettop(rdr->L); if (lua_isnil(rdr->L, -1)) { lua_pop(rdr->L, 1); lua_pushlstring(rdr->L, (char *) p, rdr->cur - p); warnv(rdr, 1, "ssdss", /* tag, file, line, key, macro */ "undefined macro", rdr->filename, rdr->line_num, key ? lua_tostring(rdr->L, key) : NULL, lua_tostring(rdr->L, -1)); if (lua_isstring(rdr->L, -1)) luaL_addvalue(b); else lua_pop(rdr->L, 1); lua_pop(rdr->L, 1); } else { luaL_addvalue(b); } assert(lua_gettop(rdr->L) == t-1); } #line 587 "nbib.nw" return 1; } } #line 621 "nbib.nw" static int scan_balanced_braces(Bibreader rdr, char close, luaL_Buffer *b) { unsigned char *p, *cur, c; int braces = 0; /* number of currently open braces *inside* string */ rdr->cur++; /* scan past left delimiter */ *rdr->lim = ' '; if (isspace(*rdr->cur)) { copy_char(' '); ready_tok(rdr); } for (;;) { p = rdr->cur; upto_white_or_3(rdr, '}', '{', close); cur = rdr->cur; for ( ; p < cur; p++) /* copy nonwhite, nonbrace characters */ copy_char(*p); *rdr->lim = ' '; c = *cur; /* will be whitespace if at end of line */ #line 654 "nbib.nw" if (isspace(c)) { copy_char(' '); ready_tok(rdr); } else { rdr->cur++; if (c == close) { if (braces == 0) { luaL_pushresult(b); return 1; } else { copy_char(c); if (c == '}') braces--; } } else if (c == '{') { braces++; copy_char(c); } else { assert(c == '}'); if (braces > 0) { braces--; copy_char(c); } else { luaL_pushresult(b); /* restore invariant */ LERRB("Unexpected '}'"); } } } #line 640 "nbib.nw" } } #line 803 "nbib.nw" static int scan_identifier (Bibreader rdr, char c1, char c2, char c3) { unsigned char *p, *orig, c; orig = p = rdr->cur; if (!isdigit(*p)) { /* scan until end-of-line or an [[illegal_id_char]] */ *rdr->lim = ' '; /* an illegal id character and also white space */ while (is_id_char[*p]) p++; } c = *p; if (p > rdr->cur && (isspace(c) || c == c1 || c == c2 || c == c3)) { rdr->cur = p; return 1; } else { return 0; } } #line 828 "nbib.nw" static bool scan_nonneg_integer (Bibreader rdr, unsigned *np) { unsigned char *p = rdr->cur; unsigned n = 0; *rdr->lim = ' '; /* sentinel */ while (isdigit(*p)) { n = n * 10 + (*p - '0'); p++; } if (p == rdr->cur) return 0; /* no digits */ else { rdr->cur = p; *np = n; return 1; } } #line 366 "nbib.nw" #undef ready_tok #define ready_tok(RDR) do { \ if (!upto_nonwhite_getline(RDR)) \ LERR("Unexpected end of file"); \ } while(0) static int get_bib_command_or_entry_and_process(Bibreader rdr) { unsigned char *id, *key; int keyindex; bool (*command)(Bibreader); getnext: #line 406 "nbib.nw" if (!upto1_getline(rdr, '@')) return 0; /* no more entries; return nil */ assert(*rdr->cur == '@'); rdr->cur++; /* skip the @ sign */ ready_tok(rdr); #line 379 "nbib.nw" id = rdr->cur; if (!scan_identifier (rdr, '{', '(', '(')) LERR("Expected an entry type"); lower_case (id, rdr->cur); /* ignore case differences */ #line 413 "nbib.nw" command = find_command(id, rdr->cur); if (command) { if (!command(rdr)) return 2; /* command put (false, message) on Lua stack; we're done */ goto getnext; } #line 385 "nbib.nw" lua_pushlstring(rdr->L, (char *) id, rdr->cur - id); /* push entry type */ rdr->entry_line = rdr->line_num; ready_tok(rdr); #line 424 "nbib.nw" if (*rdr->cur == '{') rdr->entry_close = '}'; else if (*rdr->cur == '(') rdr->entry_close = ')'; else LERR("Expected entry to open with { or ("); rdr->cur++; #line 389 "nbib.nw" ready_tok(rdr); key = rdr->cur; #line 435 "nbib.nw" if (rdr->entry_close == '}') { upto_white_or_1(rdr, ','); } else { upto_white_or_2(rdr, ',', '}'); } #line 392 "nbib.nw" lua_pushlstring(rdr->L, (char *) key, rdr->cur - key); /* push database key */ keyindex = lua_gettop(rdr->L); lua_newtable(rdr->L); /* push table of fields */ ready_tok(rdr); for (; *rdr->cur != rdr->entry_close; ) { #line 447 "nbib.nw" if (*rdr->cur == ',') { rdr->cur++; ready_tok(rdr); if (*rdr->cur == rdr->entry_close) { break; } } else { LERR("Expected comma or end of entry"); } #line 398 "nbib.nw" #line 460 "nbib.nw" if (id = rdr->cur, !scan_identifier (rdr, '=', '=', '=')) LERR("Expected a field name"); lower_case(id, rdr->cur); lua_pushlstring(rdr->L, (char *) id, rdr->cur - id); /* push field name */ ready_tok(rdr); if (*rdr->cur != '=') LERR("Expected '=' to follow field name"); rdr->cur++; /* skip over the [['=']] */ ready_tok(rdr); if (!scan_and_push_the_field_value(rdr, keyindex)) return 2; strip_leading_and_trailing_space(rdr->L); #line 488 "nbib.nw" lua_pushvalue(rdr->L, -2); /* push key */ lua_gettable(rdr->L, -4); if (lua_isnil(rdr->L, -1)) { lua_pop(rdr->L, 1); lua_settable(rdr->L, -3); } else { lua_pop(rdr->L, 1); /* off comes old value */ warnv(rdr, 0, "ssdsss", /* tag, file, line, cite-key, field, newvalue */ "extra field", rdr->filename, rdr->line_num, lua_tostring(rdr->L, keyindex), lua_tostring(rdr->L, -2), lua_tostring(rdr->L, -1)); lua_pop(rdr->L, 2); /* off come key and new value */ } #line 399 "nbib.nw" ready_tok(rdr); } rdr->cur++; /* skip past close of entry */ return 3; /* entry type, key, table of fields */ } #line 687 "nbib.nw" static bool upto1(Bibreader rdr, char c) { unsigned char *p = rdr->cur; unsigned char *lim = rdr->lim; *lim = c; while (*p != c) p++; rdr->cur = p; return p < lim; } #line 700 "nbib.nw" static int upto1_getline(Bibreader rdr, char c) { while (!upto1(rdr, c)) if (!getline(rdr)) return 0; return 1; } #line 710 "nbib.nw" static void upto_white_or_1(Bibreader rdr, char c) { unsigned char *p = rdr->cur; unsigned char *lim = rdr->lim; *lim = c; while (*p != c && !isspace(*p)) p++; rdr->cur = p; } #line 721 "nbib.nw" static void upto_white_or_2(Bibreader rdr, char c1, char c2) { unsigned char *p = rdr->cur; unsigned char *lim = rdr->lim; *lim = c1; while (*p != c1 && *p != c2 && !isspace(*p)) p++; rdr->cur = p; } #line 732 "nbib.nw" static void upto_white_or_3(Bibreader rdr, char c1, char c2, char c3) { unsigned char *p = rdr->cur; unsigned char *lim = rdr->lim; *lim = c1; while (!isspace(*p) && *p != c1 && *p != c2 && *p != c3) p++; rdr->cur = p; } #line 745 "nbib.nw" static bool upto_nonwhite(Bibreader rdr) { unsigned char *p = rdr->cur; unsigned char *lim = rdr->lim; *lim = 'x'; while (isspace(*p)) p++; rdr->cur = p; return p < lim; } #line 758 "nbib.nw" static int upto_nonwhite_getline(Bibreader rdr) { while (!upto_nonwhite(rdr)) if (!getline(rdr)) return 0; return 1; } #line 767 "nbib.nw" static bool getline(Bibreader rdr) { char *result; unsigned char *buf = rdr->buf; int n; result = fgets((char *)buf, rdr->bufsize, rdr->file); if (result == NULL) return 0; rdr->line_num++; for (n = strlen((char *)buf); buf[n-1] != '\n'; n = strlen((char *)buf)) { /* failed to get whole line */ rdr->bufsize *= 2; buf = rdr->buf = realloc(rdr->buf, rdr->bufsize); assert(buf); if (fgets((char *)buf+n,rdr->bufsize-n,rdr->file)==NULL) { n = strlen((char *)buf) + 1; /* -1 below is incorrect without newline */ break; /* file ended without a newline */ } } rdr->cur = buf; rdr->lim = buf+n-1; /* trailing newline not in string */ return 1; } #line 874 "nbib.nw" static void lower_case(unsigned char *p, unsigned char *lim) { for (; p < lim; p++) *p = tolower(*p); } #line 880 "nbib.nw" static void strip_leading_and_trailing_space(lua_State *L) { const char *p; int n; assert(lua_isstring(L, -1)); p = lua_tostring(L, -1); n = lua_strlen(L, -1); if (n > 0 && (isspace(*p) || isspace(p[n-1]))) { while(n > 0 && isspace(*p)) p++, n--; while(n > 0 && isspace(p[n-1])) n--; lua_pushlstring(L, p, n); lua_remove(L, -2); } } #line 901 "nbib.nw" static Command find_command(unsigned char *p, unsigned char *lim) { int n = lim - p; assert(lim > p); #define match(S) (!strncmp(S, (char *)p, n) && (S)[n] == '\0') switch(*p) { case 'c' : if (match("comment")) return do_comment; else break; case 'p' : if (match("preamble")) return do_preamble; else break; case 's' : if (match("string")) return do_string; else break; } return (Command)0; } #line 918 "nbib.nw" static bool do_comment(Bibreader rdr) { return 1; } #line 940 "nbib.nw" static bool do_preamble(Bibreader rdr) { ready_tok(rdr); #line 424 "nbib.nw" if (*rdr->cur == '{') rdr->entry_close = '}'; else if (*rdr->cur == '(') rdr->entry_close = ')'; else LERR("Expected entry to open with { or ("); rdr->cur++; #line 943 "nbib.nw" ready_tok(rdr); lua_rawgeti(rdr->L, LUA_REGISTRYINDEX, rdr->preamble); lua_pushnumber(rdr->L, lua_objlen(rdr->L, -1) + 1); if (!scan_and_push_the_field_value(rdr, 0)) return 0; ready_tok(rdr); if (*rdr->cur != rdr->entry_close) LERRFB("Missing '%c' in preamble command", rdr->entry_close); rdr->cur++; lua_settable(rdr->L, -3); lua_pop(rdr->L, 1); /* remove preamble */ return 1; } #line 979 "nbib.nw" static bool do_string(Bibreader rdr) { unsigned char *id; int keyindex; ready_tok(rdr); #line 424 "nbib.nw" if (*rdr->cur == '{') rdr->entry_close = '}'; else if (*rdr->cur == '(') rdr->entry_close = ')'; else LERR("Expected entry to open with { or ("); rdr->cur++; #line 984 "nbib.nw" ready_tok(rdr); id = rdr->cur; if (!scan_identifier(rdr, '=', '=', '=')) LERRB("Expected a string name followed by '='"); lower_case(id, rdr->cur); lua_pushlstring(rdr->L, (char *)id, rdr->cur - id); keyindex = lua_gettop(rdr->L); ready_tok(rdr); if (*rdr->cur != '=') LERRB("Expected a string name followed by '='"); rdr->cur++; ready_tok(rdr); if (!scan_and_push_the_field_value(rdr, keyindex)) return 0; ready_tok(rdr); if (*rdr->cur != rdr->entry_close) LERRFB("Missing '%c' in macro definition", rdr->entry_close); rdr->cur++; lua_getref(rdr->L, rdr->macros); lua_insert(rdr->L, -3); lua_settable(rdr->L, -3); lua_pop(rdr->L, 1); return 1; } #line 1013 "nbib.nw" static Bibreader checkreader(lua_State *L, int index) { return luaL_checkudata(L, index, "bibtex.reader"); } #line 1023 "nbib.nw" static int reader_meta_index(lua_State *L) { Bibreader rdr = checkreader(L, 1); const char *key; if (!lua_isstring(L, 2)) return 0; key = lua_tostring(L, 2); if (!strcmp(key, "next")) lua_pushcfunction(L, next_entry); else if (!strcmp(key, "entry_line")) lua_pushnumber(L, rdr->entry_line); else if (!strcmp(key, "preamble")) lua_rawgeti(L, LUA_REGISTRYINDEX, rdr->preamble); else if (!strcmp(key, "close")) lua_pushcfunction(L, closereader); else lua_pushnil(L); return 1; } #line 1078 "nbib.nw" #define INBUF 128 /* initial size of input buffer */ /* filename * macro table * warning function -> reader */ static int openreader(lua_State *L) { const char *filename = luaL_checkstring(L, 1); FILE *f = fopen(filename, "r"); Bibreader rdr; if (!f) { lua_pushnil(L); lua_pushfstring(L, "Could not open file '%s'", filename); return 2; } #line 1114 "nbib.nw" if (lua_type(L, 2) == LUA_TNONE) lua_newtable(L); if (lua_type(L, 3) == LUA_TNONE) lua_pushnil(L); else if (!lua_isfunction(L, 3)) luaL_error(L, "Warning value to bibtex.open is not a function"); #line 1092 "nbib.nw" rdr = lua_newuserdata(L, sizeof(*rdr)); luaL_getmetatable(L, "bibtex.reader"); lua_setmetatable(L, -2); rdr->line_num = 0; rdr->buf = rdr->cur = rdr->lim = malloc(INBUF); rdr->bufsize = INBUF; rdr->file = f; rdr->filename = malloc(lua_strlen(L, 1)+1); assert(rdr->filename); strncpy((char *)rdr->filename, filename, lua_strlen(L, 1)+1); rdr->L = L; lua_newtable(L); rdr->preamble = luaL_ref(L, LUA_REGISTRYINDEX); lua_pushvalue(L, 2); rdr->macros = luaL_ref(L, LUA_REGISTRYINDEX); lua_pushvalue(L, 3); rdr->warning = luaL_ref(L, LUA_REGISTRYINDEX); return 1; } #line 1128 "nbib.nw" static int next_entry(lua_State *L) { Bibreader rdr = checkreader(L, 1); if (!rdr->file) luaL_error(L, "Tried to read from closed bibtex.reader"); return get_bib_command_or_entry_and_process(rdr); } #line 1138 "nbib.nw" static int closereader(lua_State *L) { Bibreader rdr = checkreader(L, 1); if (!rdr->file) luaL_error(L, "Tried to close closed bibtex.reader"); fclose(rdr->file); rdr->file = NULL; free(rdr->buf); rdr->buf = rdr->cur = rdr->lim = NULL; rdr->bufsize = 0; free((void*)rdr->filename); rdr->filename = NULL; rdr->L = NULL; luaL_unref(L, LUA_REGISTRYINDEX, rdr->preamble); rdr->preamble = 0; luaL_unref(L, LUA_REGISTRYINDEX, rdr->warning); rdr->warning = 0; luaL_unref(L, LUA_REGISTRYINDEX, rdr->macros); rdr->macros = 0; return 0; } #line 1162 "nbib.nw" static void warnv(Bibreader rdr, int nres, const char *fmt, ...) { const char *p; va_list vl; lua_rawgeti(rdr->L, LUA_REGISTRYINDEX, rdr->warning); if (lua_isnil(rdr->L, -1)) { lua_pop(rdr->L, 1); while (nres-- > 0) lua_pushnil(rdr->L); } else { va_start(vl, fmt); for (p = fmt; *p; p++) switch (*p) { case 'f': lua_pushnumber(rdr->L, va_arg(vl, double)); break; case 'd': lua_pushnumber(rdr->L, va_arg(vl, int)); break; case 's': { const char *s = va_arg(vl, char *); if (s == NULL) lua_pushnil(rdr->L); else lua_pushstring(rdr->L, s); break; } default: luaL_error(rdr->L, "invalid parameter type %c", *p); } lua_call(rdr->L, p - fmt, nres); va_end(vl); } } #line 1193 "nbib.nw" int luaopen_bibtex (lua_State *L) { luaL_newmetatable(L, "bibtex.reader"); lua_pushstring(L, "__index"); lua_pushcfunction(L, reader_meta_index); /* pushes the index method */ lua_settable(L, -3); /* metatable.__index = metatable */ luaL_register(L, "bibtex", bibtexlib); #line 1207 "nbib.nw" { unsigned c; static unsigned char *nonids = (unsigned char *)"\"#%'(),={} \t\n\f"; unsigned char *p; for (c = 0; c <= 0377; c++) is_id_char[c] = 1; for (c = 0; c <= 037; c++) is_id_char[c] = 0; for (p = nonids; *p; p++) is_id_char[*p] = 0; } #line 1201 "nbib.nw" return 1; } nbibtex-0.9.18/INSTALL0000664007651200140720000000120610432166646012137 0ustar nrnrIf you're lucky enough to be able to use a Debian package, go to http://www.eecs.harvard.edu/~nr/nbibtex and follow the directions for getting nbibtex. Otherwise, to build NbibTeX requires a C compiler and Lua version 5.0. Needing Lua means needing the right -I and -l options to your compiler. Because I live in fear of gnu autoconfig, I have written a ./configure script by hand. Maybe it does something useful. By default, the script installs into /usr/local. Options to ./configure include --debian configure as for Debian, including installation into /usr --compatible make the 'plainnat' style exactly compatible with BibTeX nbibtex-0.9.18/Makefile.in0000664007651200140720000000106610427165167013160 0ustar nrnrOBJS=nbib.o nbibtex.o boyer-moore.o nbibtex: $(OBJS) $(CC) -o nbibtex $(OBJS) $(LDFLAGS) install: nbibtex for i in $(SHARE) $(BIN) $(MAN1); do [ -d $$i ] || install -d $$i; done install -m644 bibtex.lua natbib.nbs $(SHARE) install -m644 nbibtex.1 nbibfind.1 $(MAN1) install -m755 nbibtex $(BIN) rm -f $(BIN)/nbibfind ln $(BIN)/nbibtex $(BIN)/nbibfind uninstall: rm $(SHARE)/bibtex.lua $(SHARE)/natbib.nbs rm $(MAN1)/nbibtex.1 $(MAN1)/nbibfind.1 rm $(BIN)/nbibtex $(BIN)/nbibfind rmdir $(SHARE) clean: rm -f $(OBJS) distclean: clean rm -f nbibtex nbibtex-0.9.18/configure0000775007651200140720000000750010501643253013007 0ustar nrnr#!/bin/sh DESTDIR= PREFIX=usr/local debian= plain_compatible=false while [ $# -gt 0 ] do case $1 in --help) cat 1>&2 </dev/null`" ]; then CF="`pkg-config --cflags lua5.1`" LF="`pkg-config --libs lua5.1`" if [ -z "$CF" ]; then echo "Don't know how to find include files for Lua 5.1"; exit 1 fi if [ -z "$LF" ]; then echo "Don't know how to find libraries for Lua 5.1"; exit 1 fi fi LUAI="/usr/include/lua5.1 /usr/local/include/lua5.1 /usr/include /usr/local/include" LUAI="$LUAI /usr/local/lua5.1/include /usr/local/lua/include /usr/include/lua" LIBS="/lib /usr/lib /usr/local/lib" lua51= lua40= lua50= if [ -z "$CF" ]; then for i in $LUAI; do if [ -r $i/lua.h ] && grep 'LUA_VERSION.* 5\.1' $i/lua.h > /dev/null; then CF="-I$i" break elif [ -r $i/lua.h ] && grep 'LUA_VERSION.* 5\.0' $i/lua.h > /dev/null; then lua50=true elif [ -r $i/lua.h ] && grep 'LUA_VERSION.* 4\.0' $i/lua.h > /dev/null; then lua40=true fi done fi if [ -z "$LF" ]; then L1= for i in $LIBS; do if [ -r $i/liblua5.1.so ]; then LF="-L$i" L1="-lliblua5.1" break fi done if [ -z "$L1" ]; then for i in $LIBS; do if [ -r $i/liblua.so ]; then if [ "x$LF" != "x-L$i" ]; then LF="$LF -L$i"; fi L1="-lliblua" break fi done fi if [ -n "$L1" ]; then LF="$LF $L1" else LF= fi fi if [ -z "$CF" ]; then echo "Don't know how to find include files for Lua 5.0"; exit 1 fi if [ -z "$LF" ]; then echo "Don't know how to find libraries for Lua 5.0" if [ -n "$lua40" ]; then echo "(I did find an include file for Lua 4.0)"; fi if [ -n "$lua40" ]; then echo "(I did find an include file for Lua 4.0)"; fi if [ -n "$lua51" ]; then echo "(I did find an include file for Lua 5.1, but nbibtex requires Lua 5.0)"; fi exit 1 fi echo "Lua: OK" ################################################################ if [ -z "$debian" ]; then setdest="DESTDIR=$DESTDIR" else setdest= fi dollar='$' cat < Makefile $setdest SHARE=$dollar(DESTDIR)/$PREFIX/share/nbibtex BIN=$dollar(DESTDIR)/$PREFIX/bin MAN1=$dollar(DESTDIR)/$PREFIX/share/man/man1 EOF cat <> Makefile CFLAGS=$CF -DSHARE='"$dollar(SHARE)"' LDFLAGS=$LF EOF cat Makefile.in >> Makefile cat < bibtex.lua local config = { nbs = "$SHARE" } EOF if [ $plain_compatible = false ]; then compatibility='Two of these styles\ .RB ( abbrvnat \ and\ .BR unsrtnat )\ are completely compatible with the corresponding \\*(OB styles;\ the third style \ .RB ( plainnat ) \ has been changed to more closely follow \ the Chicago Manual of Style. \ A compatible version is available as style \ .BR plainnatc .' else compatibility='These styles \ .RB ( plainnat , \ .BR abbrvnat , \ and \ .BR unsrtnat ) \ are completely compatible with the corresponding \\*(OB styles. \ An improved version of the "plain" style, \ which more closely follows the Chicago Manual of Style, \ is available as style \ .BR plainnatx .' fi sed -e "s@@$DESTDIR/$PREFIX/share/nbibtex@g" \ -e "s@@$compatibility@" \ < nbibtex.1.in > nbibtex.1 cat < natbib.nbs local plain_compatible = $plain_compatible EOF nbibtex-0.9.18/natbib.nbs.in0000664007651200140720000013147110501640623013453 0ustar nrnr--[[---------------------------------------------------------------- REIMPLEMENTATION OF NATBIB STYLES FOR NBIBTEX This file implements the three 'natbib' bibliography styles: plainnat, abbrvnat, and unsrtnat. It also implements the 'improved' style plainnatx. One advantage of using Lua as opposed to the original Bibtex language is that we can easily use higher-order functions to reuse code across styles. The styles generated by this file have two modes. In 'compatibility' mode, every effort is made to produce output that is bit-for-bit identical with the original 'natbib' styles. In non-compatibility mode, I have felt free to change the original styles to reduce clutter and otherwise make the bibliography easier to read. If you are reading this source code to change the way a particular entry looks, search for 'style.' followed by the type of that entry. For example, if you want to change the formatting for a conference paper, search for 'style.inproceedings'. --]]---------------------------------------------------------------- local plain_compatible = true local plain_compatible = plain_compatible if plain_compatible == nil then plain_compatible = false end --- default : plain not compatible local suppress = { doi = true, url = false } -- In non-compatibility mode, certain fields are suppressed from -- (almost) every bibtex entry. By default I suppress 'doi' and -- 'url', but you can suppress others if not bibtex then require 'bibtex' end local bst = bibtex.bst -- used to implement style -- create a bibtex style local function make_style(style_base, min_etal, chicago, compatible) -- style_base is 'abbrv', 'plain', or 'unsrt' -- min_etal is minimum number of authors require to force 'First et al' -- chicago == chicago-style dates -- compatible == output should be identical to existing natbib styles min_etal = min_etal or 4 if chicago == nil then chicago = (style_base == 'plain') end if compatible == nil then compatible = (style_base ~= 'plain') end local suppress = compatible and { } or suppress -- compatible styles suppress no fields local abbrv = style_base == 'abbrv' -- drives several short/long formats --[=[---------------------------------------------------------------- The original Bibtex is written in a PostScript-like language that has no function parameters; all values are passed on a stack. In this language, each entry in turn has its fields placed in global variables, after which the engine applies a function named in an ITERATE directive. To produce output identical to the original, it is easiest to mimic this style. We therefore arrange to take a citation and place its information into variables that are shared by all the functions defined below. The full citation is in [[citation]], the key is in [[key]], and a table of field values is in [[fields]]. Because with nbibtex, the original entry key may be different from the actual citation key, we provide the original as [[warning_key]]. All these variables are set by function [[with_entry]], which then applies a function. The ITERATE directive is replaced by a loop that calls [[with_entry]] with each entry and a suitable function. --]=]---------------------------------------------------------------- local citation, key, warning_key, fields --- set to current entry local function with_entry(c, f, ...) citation, key, fields = c, c.key, c.fields warning_key = citation.orig_key or key f(...) end ---------------------------------------------------------------------- ----------------------------- INTERFACES ----------------------------- ---------------------------------------------------------------------- --[[---------------------------------------------------------------- Below see sections on * Abbreviations * Utilities * Error handling * Output * Field infrastructure * Formatting support * Sorting --]]---------------------------------------------------------------- ----- ABBREVIATIONS ----- local find = string.find local gsub = string.gsub local stringf = string.format local function eprintf(...) return io.stderr:write(stringf(...)) end local empty = bst.empty ------------------------- ----- UTILITIES ----- local defaulting -- apply to table to make 'default' field the default local nonempty -- return argument if not empty; otherwise return nil --------------------- ----- ERROR HANDLING ----- local dump -- dump(when) -- dump current entry, with optional tag 'when' local warnf -- warnf(fmt,...) -- issue warning for current citation local check -- check(k, s/f) -- if s or f() is empty, warning of missing k -------------------------- ----- OUTPUT IN SENTENCE STRUCTURE ----- -- Output is to a given file; it can be raw with writef or structured with output(). local output_to -- output_to(file) --- emit entries to this file local writef -- writef(fmt,...) --- raw write to file -- As written to the output, an entry has a prolog, an epilog, and contents. -- The contents is a sequence of blocks. A block is a sequence of sentences, -- each terminated by a period. A sentence is a sequence of fragments separated -- by commas. A single fragment is written by output(). local new_block -- new_block() --- start a new block local new_sentence -- new_sentence() --- start a new sentence local output -- output(...) --- emit each argument as one fragment local output_bibitem -- emit an entry's prolog local fin_entry -- emit an entry's epilog local output_caps -- output_caps() --- returns true iff next fragment needs caps -- The actual story about output() is more complicated. -- It emits zero or more items, where an item is -- * a string (emitted as fragment) -- * nil (ignored) -- * a function returning zero or more items (run and emitted) -- * a list of items in a Lua table -- Useful effects can be obtained by including new_block or new_sentence -- among the arguments to output() -- The mismatched names for prolog and epilog are inherited from bibtex. ---------------------------------------- ----- FIELD INFRASTRUCTURE ----- -- Support for formatting names local make_full_names -- make_full_names() -- return names by which entry is identified in author-date styles local format_names -- format_names(s[, fmt]) -- return argument, formatting using given format or default for style local format_full_names -- format_full_names(s) -- return argument formatted as full names -- Here follow several higher-order functions to manipulate fields. -- Function [[nonempty_field(fieldname, f)]] returns a nullary function -- that returns [[f]] applied to the field, or if the field is empty, -- returns the empty string. -- One source of useful functions [[f]] is function [[fieldf]], -- which is a curried form of [[string.format]]. It can usefully be -- partially applied and passed to [[nonempty_field]]. Applying -- [[nb]] to a function [[f]] produces a new function that first -- creates a new block, then applies [[f]]. local nonempty_field local fieldf local nb -------------------------------- ----- FORMATTING SUPPORT ----- local n_dashify -- return argument with each single dash converted to a TeX en-dash local emphasize -- return argument wrapped in \emph{...} local box_small -- if argument is short, wrap in mbox local tie_or_space_connect -- -- connect(s, t): join s and t with tie if t is short and space if long ------------------------------ ----- SORTING ----- local bibsort -- sort list of citations and assign 'extra_label' fields ------------------- --[[---------------------------------------------------------------- IMPLEMENTATIONS --]]---------------------------------------------------------------- do local default_meta = { __index = function(t) return t.default end } function defaulting(t) setmetatable(t, default_meta); return t end end function nonempty(s) if not bst.empty(s) then return s end end ---------------------------------------------------------------------- --------------------------- ERROR HANDLING --------------------------- ---------------------------------------------------------------------- function dump(when) eprintf('%s========= %s ========\n', when and 'at ' .. when .. ': ' or '', key) for k, v in pairs(fields) do eprintf(' %s = %q\n', k, type(v) == 'string' and v or tostring(v)) end eprintf(' purify(fields.label) == %q\n', bst.purify(fields.label or '')) eprintf '\n' end function warnf(...) io.stderr:write('Warning--') io.stderr:write(string.format(...)) io.stderr:write(string.format('\n--line %d of file %s\n', citation.line, string.gsub(citation.file, '.*[/\\]', ''))) end function check(k, s) if type(s) == 'function' then s = s() end --- be tolerant if empty(s) then warnf('empty %s in %s', k, warning_key) else return s end end ---------------------------------------------------------------------- -------------------- OUTPUT IN SENTENCE STRUCTURE -------------------- ---------------------------------------------------------------------- do local bblfile -- open file for bbl file function output_to(bbl) bblfile = bst.writer(bbl) end function writef(...) return bblfile:write(string.format(...)) end -- output is done with a delay of one fragment, so that state changes -- may be used to add a period to the preceding fragment, for example. local pending_out = '' --- delayed fragment awaiting output local output_state --- tracks where we are in sentence and block local before_all, mid_sentence, after_sentence, after_block = 'bef', 'mids', 'afters', 'afterbl' function output_caps() -- anything not in the middle of a sentence should be capitalized return output_state ~= mid_sentence end local function output_one(s) -- emit a single fragment, or if a fragment is empty, do nothing -- (replaces both 'output' and 'output.nonnull' from original Bibtex) if empty(s) then return end -- writef('[outputting %s:]', string.len(s) > 10 and string.sub(s, 1, 10) .. '...' or s) if output_state == mid_sentence then writef('%s, ', pending_out) elseif output_state == after_block then writef('%s\n\\newblock ', bst.add_period(pending_out)) elseif output_state == before_all then writef('%s', pending_out) elseif output_state == after_sentence then writef('%s ', bst.add_period(pending_out)) else assert(false, 'Bad output state ' .. (output_state or 'nil')) end output_state = mid_sentence pending_out = s -- writef('[:done]') end do -- The general output() is table-driven local output_funs = { } output_funs['string'] = output_one output_funs['nil'] = function() end output_funs['table'] = function(t) return output(unpack(t)) end output_funs['function'] = function(f) return output(f()) end function output(...) local n = select('#', ...) local arg = { ... } for i = 1, n do --- can't use ipairs b/c arg might be nil local v = arg[i] assert(output_funs[type(v)], "Bad value to output()") (v) end end end -- prolog function output_bibitem() local full = make_full_names() if full == fields.short_list then full = '' end writef('\n\\bibitem[%s)%s]{%s}\n', fields.label, full, key) if false and style_base == 'abbrv' then -- for diagnostics writef('\\sortkey{%s}\n', fields.sort_key) writef('\\sortlabel{%s}\n', fields.sort_label) end output_state = before_all pending_out = '' end -- epilog function fin_entry() writef('%s\n', bst.add_period(pending_out)) pending_out = '' if citation.warningmsg then writef('%s\n', citation.warningmsg) end for _, a in ipairs(citation.also_cited_as or { }) do writef("\\letbib{%s}{%s}\n", a, key) end end -- state changers function new_block() if output_state ~= before_all then output_state = after_block end end function new_sentence() if output_state ~= after_block and output_state ~= before_all then output_state = after_sentence end end end ---------------------------------------- ---------------------------------------------------------------------- ------------------------- FORMATTING SUPPORT ------------------------- ---------------------------------------------------------------------- function emphasize(s) return empty(s) and '' or "\\emph{" .. s .. '}' end function n_dashify(s) return (string.gsub(s, '%-+', function(s) return s == '-' and '--' or s end)) end function box_small(s) -- box small page ranges to avoid splitting if bst.text_length(s) < 7 then return stringf("\\mbox{%s}", s) else return s end end function tie_or_space_connect(s, t) if bst.text_length(t) < 3 then return stringf('%s~%s', s, t) else return stringf('%s %s', s, t) end end ---------------------------------------------------------------- local function key_if_empty(s) -- return [[key]] field if [[s]] is empty if empty(s) then return fields.key or '' else return '' end end local format_key = key_if_empty --- name compatible with original bibtex ---------------------------------------------------------------------- ------------------------ FIELD INFRASTRUCTURE ------------------------ ---------------------------------------------------------------------- local function nonempty_field(k, f) -- takes a nonempty s = fields[k] and returns f(s) assert(k, 'missing field name in nonempty_field') if suppress[k] then return function () end else return function() local s = fields[k] if empty(s) then return '' else return f(s) end end end end -- a useful f to pass to nonempty_field is 'fieldf' (curried stringf) function fieldf(fmt) return function(s) return stringf(fmt, s) end end -- a wrapper for f puts output after a new block function nb(f) return function(s) new_block() return f(s) end end do ---- NAME FORMATTING local default_name_format = abbrv and "{f.~}{vv~}{ll}{, jj}" or "{ff~}{vv~}{ll}{, jj}" function format_names(s, fmt) fmt = fmt or default_name_format local s = bst.commafy(bst.format_names(fmt, bst.namesplit(s))) return (gsub(s, ' and others$', ' et~al.')) end function format_full_names(s) return format_names(s, "{vv~}{ll}") end end ----- BASIC FORMATTING UNITS ----- -- -- The general idea here is that each field has its own characteristic -- formatting. The details are a little more complicated: Names can be -- formatted either as full names or using the default formatting; -- a book title is italicized where other titles are not. But many things -- are clean. local format_isbn = nonempty_field('isbn', nb(fieldf 'ISBN %s')) local format_issn = nonempty_field('issn', nb(fieldf 'ISSN %s')) local format_url = nonempty_field('url', nb(fieldf 'URL \\url{%s}')) local format_doi = nonempty_field('doi', nb(fieldf '\\doi{%s}')) local format_eid = nonempty_field('eid', function (s) return tie_or_space_connect("art.", s) end) local format_title = nonempty_field('title', bst.title) local format_btitle = nonempty_field('title', emphasize) -- book title local author_full = nonempty_field('author', format_full_names) local editor_full = nonempty_field('editor', format_full_names) local function author_editor_full() return nonempty(author_full()) or nonempty(editor_full()) or '' end local format_authors = nonempty_field('author', format_names) local format_editors = nonempty_field('editor', function(e) if table.getn(bst.namesplit(e)) > 1 then return format_names(e) .. ', editors' else return format_names(e) .. ', editor' end end) function make_full_names() if citation.type == 'book' or citation.type == 'inbook' then return author_editor_full() elseif citation.type == 'proceedings' then return editor_full() else return author_full() end end ----- FORMATTING DATES ----- local function format_date() local year = fields.year or '' if empty(year) then warnf('empty year in %s', warning_key) return fields.extra_label or '' elseif not empty(fields.month) then if chicago then return stringf('%s (%s)%s', year, fields.month, fields.extra_label or '') else return stringf('%s %s%s', fields.month, year, fields.extra_label or '') end else return year .. (fields.extra_label or '') end end local chicago_date, nonchicago_date -- each entry emits both dates, one of which is nil -- according to which convention is used if chicago then function chicago_date() return { check('year', format_date()), new_block } end function nonchicago_date() end else function chicago_date() end function nonchicago_date() return check('year', format_date()) end end local function either_or_check(fnames, f) if not empty(f) then warnf("can't use both %s in %s", fnames, warning_key) end end ---------------------------------------------------------------------- ---------------- FORMATTING COMPLICATED HAIRY THINGS ----------------- ---------------------------------------------------------------------- --[[ These are more complicated formatted fragments, typically composed of a group of one to a few fields ]]-- local format_bvolume = nonempty_field('volume', function(s) local v = tie_or_space_connect("volume", s) either_or_check("volume and number", fields.number) local series = fields.series if not empty(series) then if not compatible and (series == "Lecture Notes in Computer Science" or series == "LNCS") then return emphasize 'LNCS' .. ' ' .. v else return v .. ' of ' .. emphasize(series) end else return v end end) local function format_number_series() if empty(fields.volume) then if empty(fields.number) then return fields.series or '' else local num = output_caps() and 'Number' or 'number' num = tie_or_space_connect(num, fields.number) if empty(fields.series) then warnf("there's a number but no series in %s", warning_key) return num else return stringf('%s in %s', num, fields.series) end end else return '' end end local format_edition = nonempty_field('edition', function(s) local f = output_caps() and bst.title or bst.lower return stringf('%s edition', f(s)) end) local format_pages = nonempty_field('pages', compatible and function (s) if string.find(s, '[%-%,%+]') then return tie_or_space_connect('pages', n_dashify(s)) else return tie_or_space_connect('page', s) end end or function (s) if string.find(s, '[%-%,%+]') then return stringf('pages~%s', box_small(n_dashify(s))) else return stringf('page~%s', s) end end ) local function format_vol_num_other(format_other, raw_other) return function() local v = fields.volume or '' if not empty(fields.number) then v = stringf('%s\\penalty0 (%s)', v, fields.number) if empty(fields.volume) then warnf("there's a number but no volume in ", warning_key) end end if not empty(fields.pages) then if empty(v) then v = format_other() else v = stringf('%s:\\penalty0 %s', v, raw_other()) end end return v end end local format_vol_num_pages = format_vol_num_other(format_pages, function() return n_dashify(fields.pages) end) local format_vol_num_eid = format_vol_num_other(format_eid, function() return fields.eid end) local function format_chapter_pages() if empty(fields.chapter) then return format_pages() else local ty = bst.lower(nonempty(fields.type) or 'chapter') local c = tie_or_space_connect(ty, fields.chapter) if nonempty(fields.pages) then c = stringf('%s, %s', c, format_pages()) end return c end end local format_in_ed_booktitle = nonempty_field('booktitle', function (bt) if empty(fields.editor) then return 'In ' .. emphasize(bt) else return stringf('In %s, %s', format_editors(), emphasize(bt)) end end) ---------------------------------------------------------------- local function format_tr_number() local ty = nonempty(fields.type) or 'Technical Report' if empty(fields.number) then return bst.title(ty) else return tie_or_space_connect(ty, fields.number) end end local function format_article_crossref() local pfx if empty(fields.key) then if empty(fields.journal) then warnf("need key or journal for %s to crossref %s ", warning_key, fields.crossref) else pfx = stringf("In \\emph{%s}", fields.journal) end else pfx = "In " .. fields.key end return stringf('%s \\citep{%s}', pfx, fields.crossref) end local function format_book_crossref() local pfx if empty(fields.volume) then warnf("empty volume in %s's crossref of %s", warning_key, fields.crossref) pfx = "In " else pfx = tie_or_space_connect("Volume", fields.volume) .. ' of ' end if empty(fields.editor) or (fields.editor or '') == (fields.author or '') then if not empty(fields.key) then pfx = pfx .. fields.key elseif not empty(fields.series) then pfx = stringf("%s\\emph{%s}", pfx, fields.series) else warnf("need editor, key, or series for %s to crossref %s", warning_key, fields.crossref) end end return stringf("%s, \\citet{%s}", pfx, fields.crossref) end local function format_incoll_inproc_crossref() local pfx if empty(fields.editor) or (fields.editor or '') == (fields.author or '') then if not empty(fields.key) then pfx = "In " .. fields.key elseif not empty(fields.booktitle) then pfx = "In \\emph{" .. fields.booktitle .. "}" else warnf("need editor, key, or booktitle for %s to crossref %s", warning_key, fields.crossref) pfx = "" end else pfx = "In " end return stringf("%s \\citet{%s}", pfx, fields.crossref) end ---------------------------------------------------------------- ----------- FORMATTING FUNCTION FOR EACH ENTRY TYPE ---------- ---------------------------------------------------------------- local style = defaulting { } --- contains function for each entry type, plus out field for writing function style.article() output_bibitem() output(check('author', format_authors()), format_key(fields.author), new_block, chicago_date, check('title', format_title()), new_block) if not fields.crossref then output(check('journal', emphasize(fields.journal)), format_vol_num_pages, nonchicago_date) else output(format_article_crossref, format_pages) end output(format_issn, format_doi, format_url, new_block, fields.note) fin_entry() end function style.book() output_bibitem() if empty(fields.author) then output(check("author and editor", format_editors()), format_key(fields.editor)) else output(format_authors) if not fields.crossref then either_or_check('author and editor', fields.editor) end end output(new_block, chicago_date(), check('title', format_btitle())) if not fields.crossref then output(format_bvolume, new_block, format_number_series, new_sentence, check("publisher", fields.publisher), fields.address) else output(new_block, format_book_crossref) end output(format_edition, nonchicago_date, format_isbn, format_doi, format_url, new_block, fields.note) fin_entry() end function style.booklet() output_bibitem() output(format_authors, format_key(fields.author), new_block, check("title", format_title())) if not (empty(fields.howpublished) and empty(fields.address)) then new_block() end output(fields.howpublished, fields.address, format_date, format_isbn, format_doi, format_url, new_block, fields.note) fin_entry() end function style.inbook() output_bibitem() if empty(fields.author) then output(check("author and editor", format_editors()), format_key(fields.editor)) else output(format_authors) if not fields.crossref then either_or_check("author and editor", fields.editor) end end output(new_block, chicago_date, check("title", format_btitle())) if not fields.crossref then output(format_bvolume, check("chapter and pages", format_chapter_pages), new_block, format_number_series, new_sentence, check("publisher", fields.publisher), fields.address) else output(check("chapter and pages", format_chapter_pages), new_block, format_book_crossref) end output(format_edition, nonchicago_date, format_isbn, format_doi, format_url, new_block, fields.note) fin_entry() end function style.incollection() output_bibitem() output(check("author", format_authors()), format_key(fields.author), new_block, chicago_date, check("title", format_title()), new_block) if not fields.crossref then output(check("booktitle", format_in_ed_booktitle()), format_bvolume, format_number_series, format_chapter_pages, new_sentence, check("publisher", fields.publisher), fields.address, format_edition, nonchicago_date) else output(format_incoll_inproc_crossref, format_chapter_pages) end output(format_isbn, format_doi, format_url, new_block, fields.note) fin_entry() end function style.inproceedings() output_bibitem() output(check("author", format_authors()), format_key(fields.author), new_block, chicago_date, check("title", format_title()), new_block) if not fields.crossref then output(check("booktitle", format_in_ed_booktitle()), format_bvolume, format_number_series, format_pages) if empty(fields.address) then if not (empty(fields.organization) and empty(fields.publisher)) then output(new_sentence, fields.organization, fields.publisher) end output(nonchicago_date) else output(fields.address, nonchicago_date, new_sentence, fields.organization, fields.publisher) end else output(format_incoll_inproc_crossref, format_pages) end output(format_isbn, format_doi, format_url, new_block, fields.note) fin_entry() end style.conference = style.inproceedings function style.manual() output_bibitem() output(format_authors, format_key(fields.author), new_block, chicago_date, check("title", format_btitle())) if not (empty(fields.organization) and empty(fields.address)) then output(new_block, fields.organization, fields.address) end output(format_edition, nonchicago_date, format_url, new_block, fields.note) fin_entry() end local function thesis(default_type, format_title) return function() local type = empty(fields.type) and default_type or bst.title(fields.type) output_bibitem() output(check("author", format_authors()), format_key(fields.author), new_block, chicago_date, check("title", format_title()), new_block, type, check("school", fields.school), fields.address, nonchicago_date, format_url, new_block, fields.note) fin_entry() end end style.mastersthesis = thesis("Master's thesis", format_title) function style.misc() -- misc cannot be refactored to use chicago_date output_bibitem() output(format_authors, format_key(fields.author)) if chicago then output(new_block, check("year", format_date())) end if not (empty(fields.title) and empty(fields.howpublished)) then output(new_block, format_title) if not empty(fields.howpublished) then output(new_block, fields.howpublished) end end if not chicago then output(format_date()) end output(format_url, new_block, fields.note) do -- if everything interesting is empty, complain local found for _, f in ipairs { 'author', 'title', 'howpublished', 'month', 'year', 'note', 'key' } do if not empty(fields[f]) then found = true; break end end if not found then warnf("all relevant fields are empty in %s", warning_key) end end fin_entry() end style.phdthesis = thesis("PhD thesis", format_btitle) function style.proceedings() output_bibitem() output(format_editors, format_key(fields.editor), new_block, chicago_date, check("title", format_btitle()), format_bvolume, format_number_series, fields.address, nonchicago_date, new_sentence, fields.organization, fields.publisher, format_isbn, format_doi, format_url, new_block, fields.note) fin_entry() end function style.techreport() output_bibitem() output(check("author", format_authors()), format_key(fields.author), new_block, chicago_date, check("title", format_title()), new_block, format_tr_number, check("institution", fields.institution), fields.address, nonchicago_date, format_url, new_block, fields.note) fin_entry() end function style.unpublished() output_bibitem() output(check("author", format_authors()), format_key(fields.author), new_block, chicago_date, check("title", format_title()), format_url, new_block, check("note", fields.note), nonchicago_date) fin_entry() end style.default = assert(style.misc, 'empty default function') ---------------------------------------------------------------- ---------------------- MACROS ---------------------------------- ---------------------------------------------------------------- local macros if abbrv then function macros() local macros = bst.months(3) for k, v in pairs(macros) do macros[k] = v .. "." end macros.may = "May" macros.jun = "June" macros.jul = "July" macros.sep = "Sept." macros.acmcs = "ACM Comput. Surv." macros.acta = "Acta Inf." macros.cacm = "Commun. ACM" macros.ibmjrd = "IBM J. Res. Dev." macros.ibmsj = "IBM Syst.~J." macros.ieeese = "IEEE Trans. Softw. Eng." macros.ieeetc = "IEEE Trans. Comput." macros.ieeetcad = "IEEE Trans. Comput.-Aided Design Integrated Circuits" macros.ipl = "Inf. Process. Lett." macros.jacm = "J.~ACM" macros.jcss = "J.~Comput. Syst. Sci." macros.scp = "Sci. Comput. Programming" macros.sicomp = "SIAM J. Comput." macros.tocs = "ACM Trans. Comput. Syst." macros.tods = "ACM Trans. Database Syst." macros.tog = "ACM Trans. Gr." macros.toms = "ACM Trans. Math. Softw." macros.toois = "ACM Trans. Office Inf. Syst." macros.toplas = "ACM Trans. Prog. Lang. Syst." macros.tcs = "Theoretical Comput. Sci." return macros end else --- not abbreviated function macros() local macros = bst.months() macros.acmcs = "ACM Computing Surveys" macros.acta = "Acta Informatica" macros.cacm = "Communications of the ACM" macros.ibmjrd = "IBM Journal of Research and Development" macros.ibmsj = "IBM Systems Journal" macros.ieeese = "IEEE Transactions on Software Engineering" macros.ieeetc = "IEEE Transactions on Computers" macros.ieeetcad = "IEEE Transactions on Computer-Aided Design of Integrated Circuits" macros.ipl = "Information Processing Letters" macros.jacm = "Journal of the ACM" macros.jcss = "Journal of Computer and System Sciences" macros.scp = "Science of Computer Programming" macros.sicomp = "SIAM Journal on Computing" macros.tocs = "ACM Transactions on Computer Systems" macros.tods = "ACM Transactions on Database Systems" macros.tog = "ACM Transactions on Graphics" macros.toms = "ACM Transactions on Mathematical Software" macros.toois = "ACM Transactions on Office Information Systems" macros.toplas = "ACM Transactions on Programming Languages and Systems" macros.tcs = "Theoretical Computer Science" return macros end end ---------------------------------------------------------------- ----------------------------- LABELS --------------------------- ---------------------------------------------------------------- -- Make the label used to refer to citation (normally author or editor, but...) local label_from -- take list of fields; use first nonempty one to form label, e.g. -- label_from { 'author', 'editor' } do local lab_name_format = compatible and '{vv~}{ll}' or '{vv }{ll}' function format_lab_names(s) -- names as used in a label -- if too many names, use 'et~al.' local t = bst.namesplit(s) if table.getn(t) >= min_etal then return bst.format_name(lab_name_format, t[1]) .. ' et~al.' else return format_names(s, lab_name_format) end end local labformat = defaulting { -- how to form label text from each kind of field used default = format_lab_names, key = function(s) return s end, organization = function(s) return bst.text_prefix(gsub(s, '^The ',''), 3) end, } function label_from(fs) return function() for _, f in ipairs(fs) do if nonempty(fields[f]) then return labformat[f](fields[f]) end end return nonempty(fields.key) or string.sub(key, 1, 3) -- label of last restort end end end ---------------------------------------------------------------- ---------------------------- SORTING --------------------------- ---------------------------------------------------------------- do --[[-------------------------------------------------------------- Sorting works as follows: 1. Assign labels (called 'sort_key' and 'sort_label'). 2. Sort by 'sort_key'. 3. Make a forward-backward pass to assign an 'extra' part to each label. Thus, if two papers by the same author are both published in 2005, they become '2005a' and '2005b'. But if only one is, it stays '2005', not '2005a'. 4. Sort again by 'sort_label'. All sorts are stable --]]-------------------------------------------------------------- --- Internal sorting interfaces local presort = { } -- Pass 1: presort[style_base](c, i) sets labels in entry c, which is number i local adjust_labels -- Pass 3: forward and backward label adjustment function bibsort(citations) for i = 1, table.getn(citations) do with_entry(citations[i], presort[style_base], i) end local function cmp(field) return function (e1, e2) return e1.fields[field] < e2.fields[field] end end bst.sort(citations, cmp 'sort_key') -- use a stable sort adjust_labels(citations) bst.sort(citations, cmp 'sort_label') end function adjust_labels(citations) -- duplicate labels in sequence get extra 'a', 'b', 'c', etc local i, n = 1, table.getn(citations) while i <= n do local c = citations[i] local next = citations[i+1] if next and c.fields.label == next.fields.label then -- do a run of identical labels local label = c.fields.label local tag = string.byte 'a' --- if next label gets a tag, this is it local j = i while j <= n and citations[j].fields.label == label do local fields = citations[j].fields fields.extra_label = stringf("{\\natexlab{%c}}", tag + j - i) fields.label = fields.label .. fields.extra_label j = j + 1 end i = j else c.fields.extra_label = '' i = i + 1 end end end -- all the rest of the complexity lies in computing sort keys for each entry -- Make a key used in sorting (much as is done with labels) local sort_from -- take list of fields; use first nonempty one to form sort key, -- e.g., sort_from { 'author', 'editor' } local sort_format -- table of sort-format functions indexed by field local sortify -- make string suitable for sorting (lower case, no specials) do function sortify(s) return bst.lower(bst.purify(s)) end -- for sorting, ignore case and special characters local function strip(pfx, f) -- return function to strip prefix word and apply f local pat = '^' .. pfx .. '%s' return function(s) return f(gsub(s, pat, '')) end end -- to assist sorting, names are formatted without punctuation local sort_name_format = -- if abbreviating, use first initials; otherwise use first names abbrv and "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" or "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" local function sort_format_names(s) local names = bst.namesplit(s) local f = "" local n = table.getn(names) for i = 1, n do if i > 1 then f = f .. " " end local t = bst.format_name(sort_name_format, names[i]) if i == n and t == "others" then f = f .. (compatible and "zzzzz" or "et al") else if compatible and n >= min_etal and i == min_etal - 1 then f = f .. "zz" .. (fields.year or '') .. " " end f = f .. sortify(t) end end return f end --- sort functions by field type sort_format = defaulting { -- how to form sort key from each kind of field used default = sort_format_names, title = strip('A', strip('An', strip('The', sortify))), key = sortify, organization = strip('The', sortify), } function sort_from(fs) return function() for _, f in ipairs(fs) do if nonempty(fields[f]) then return sort_format[f](fields[f]) end end warnf("to sort, need %s in %s", bst.commafy(fs, 'or'), warning_key) return '' end end local entry_max = 250 --- maximum number of characters used in sort key local short_label_tab = defaulting { --- fields used to compute label default = label_from { 'author' }, book = label_from { 'author', 'editor' }, inbook = label_from { 'author', 'editor' }, manual = label_from { 'author', 'key', 'organization' }, proceedings = label_from { 'editor', 'key', 'organization' }, } local sort_types = defaulting { -- fields used to compute sort key default = sort_from { 'author', 'key' }, book = sort_from { 'author', 'editor', 'key' }, inbook = sort_from { 'author', 'editor', 'key' }, manual = sort_from { 'author', 'organization', 'key' }, proceedings = sort_from { 'editor', 'organization', 'key' }, } local function lab_year() if empty(fields.year) or fields.short_list == (fields.key or '') then return '' else return fields.year end end function presort.plain() local type = citation.type fields.short_list = short_label_tab[type]() if compatible then fields.label = stringf('%s(%s', fields.short_list, lab_year()) fields.sort_label = stringf("%s %s", sort_types[type](), key) else fields.label = stringf('%s(%s', fields.short_list, fields.year or '') fields.sort_label = stringf("%s %s %s", sort_types[type](), sortify(fields.year or ''), sort_format.title(fields.title or '')) end fields.sort_key = sortify(fields.label) .. " " .. fields.sort_label fields.sort_key = string.sub(fields.sort_key, 1, entry_max) fields.sort_label = string.sub(fields.sort_label, 1, entry_max) end presort.abbrv = presort.plain function presort.unsrt(i) fields.short_list = short_label_tab[citation.type]() if compatible then fields.label = stringf('%s(%s', fields.short_list, lab_year()) else fields.label = stringf('%s(%s', fields.short_list, fields.year or '') end fields.sort_label = stringf("%010d", i) fields.sort_key = sortify(fields.label) .. " " .. fields.sort_label fields.sort_key = string.sub(fields.sort_key, 1, entry_max) fields.sort_label = string.sub(fields.sort_label, 1, entry_max) end end end ---------------------------------------------------------------- ---------------------- EMIT THE BBL FILE ----------------------- ---------------------------------------------------------------- local function multikeys(citations) for _, c in ipairs(citations) do if table.getn(c.also_cited_as or { }) > 0 then return true end end return false end local function emitbbl(bbl, preamble, citations) output_to(bbl) if multikeys(citations) then -- for compatibility, do only on demand writef('%s\n', [[\def\letbib#1#2{% \def\tempb##1##2##3##4##5\ends{\csname NAT@wrout\endcsname{##1}{##2}{##3}{##4}}% \def\tempc##1{\expandafter\tempb##1{??}{??}{??}{??}{??}\ends}% \csname @ifundefined\endcsname{b@#2\csname @extra@b@citeb\endcsname}% {}% {\expandafter\tempc\csname b@#2\csname @extra@b@citeb\endcsname\endcsname{#1}}}]]) end for _, l in ipairs(preamble) do writef('%s', l) end if preamble[1] then writef('\n') end if chicago then writef([[ \begin{thebibliography}{%d} \expandafter\ifx\csname natexlab\endcsname\relax\def\natexlab#1{#1}\fi \expandafter\ifx\csname url\endcsname\relax \def\url#1{{\tt #1}}\fi ]], table.getn(citations)) else writef([[ \begin{thebibliography}{%d} \providecommand{\natexlab}[1]{#1} \providecommand{\url}[1]{\texttt{#1}} \expandafter\ifx\csname urlstyle\endcsname\relax \providecommand{\doi}[1]{doi: #1}\else \providecommand{\doi}{doi: \begingroup \urlstyle{rm}\Url}\fi ]], table.getn(citations)) end bibsort(citations) for _, c in ipairs(citations) do with_entry(c, style[c.type]) end writef("\n\\end{thebibliography}\n") end return { emit = emitbbl, style = style, macros = assert(macros) } end ------------------------------------------------------------------------ ----------------- BUILD AND REGISTER THE NATBIB STYLES ----------------- ------------------------------------------------------------------------ local plain = make_style 'plain' local abbrv = make_style ('abbrv', 3) local unsrt = make_style ('unsrt', 3) local plainc = make_style ('plain', 3, false, true) bibtex.register_style('plainnat', plain_compatible and plainc or plain) bibtex.register_style('plainnat2', make_style('plain', 3)) bibtex.register_style('plainnatx', plain) bibtex.register_style('plainnatc', plainc) bibtex.register_style('abbrvnat', abbrv) bibtex.register_style('unsrtnat', unsrt) nbibtex-0.9.18/nbib.ps0000664007651200140720000170323211042435522012363 0ustar nrnr%!PS-Adobe-2.0 %%Creator: dvips(k) 5.96.1 Copyright 2007 Radical Eye Software %%Title: nbib.dvi %%CreationDate: Fri Jul 25 16:45:06 2008 %%Pages: 77 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 %%DocumentFonts: CMR17 CMCSC10 CMR12 CMBX12 CMBX10 CMR10 CMTT10 CMSY10 %%+ CMTI10 CMR7 CMR8 CMSY9 CMTI9 CMTT9 CMR6 CMTT12 CMMI10 CMMI8 CMR9 %%+ CMMI9 CMTI8 %%DocumentPaperSizes: Letter %%EndComments %DVIPSWebPage: (www.radicaleye.com) %DVIPSCommandLine: dvips -Pcmz -o nbib.ps nbib.dvi %DVIPSParameters: dpi=600 %DVIPSSource: TeX output 2008.07.25:1645 %%BeginProcSet: tex.pro 0 0 %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr 1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S /BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N /p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ /Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) (LaserWriter 16/600)]{A length product length le{A length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end %%EndProcSet %%BeginProcSet: texps.pro 0 0 %! TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type /nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def end %%EndProcSet %%BeginProcSet: special.pro 0 0 %! TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N /vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N /rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N /@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{ /hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B /@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{ /urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known {userdict/md get type/dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup length 20 add dict copy def}if end md begin /letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{ itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack} if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{ noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{ Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale }if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState save N userdict maxlength dict begin/magscale true def normalscale currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts /psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR/showpage{}N/erasepage{}N/setpagedevice{pop}N/copypage{}N/p 3 def @MacSetUp}N/doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath moveto}N/endTexFig{end psf$SavedState restore}N /@beginspecial{SDict begin/SpecialSave save N gsave normalscale currentpoint TR @SpecialDefaults count/ocount X/dcount countdictstack N} N/@setspecial{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury lineto closepath clip}if/showpage{}N/erasepage{}N /setpagedevice{pop}N/copypage{}N newpath}N/@endspecial{count ocount sub{ pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave restore end}N/@defspecial{SDict begin}N/@fedspecial{end}B/li{lineto}B /rl{rlineto}B/rc{rcurveto}B/np{/SaveX currentpoint/SaveY X N 1 setlinecap newpath}N/st{stroke SaveX SaveY moveto}N/fil{fill SaveX SaveY moveto}N/ellipse{/endangle X/startangle X/yrad X/xrad X/savematrix matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end %%EndProcSet %%BeginFont: CMTI8 %!PS-AdobeFont-1.1: CMTI8 1.0 %%CreationDate: 1991 Aug 18 21:07:42 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTI8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMTI8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 12 /fi put dup 68 /D put dup 76 /L put dup 77 /M put dup 83 /S put dup 97 /a put dup 100 /d put dup 101 /e put dup 102 /f put dup 105 /i put dup 110 /n put dup 111 /o put dup 114 /r put dup 116 /t put readonly def /FontBBox{-35 -250 1190 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5 525003F3DAD7933EB57E7DB1462E9D906F6D8F5BF740206C1EC5F36E00AAFF68 F3EF6F3A2540E5F9564D1C215BC1E7E69C7D04DA5DB1CF195613C9CBF4BAA360 84AEF3E10E24877FBE36AD731DC97305BDE6DB1F934909FAF60B8E28561FBC57 0F5B6225425BFDE8F0C71CD4507B82FF803E9A301397975E38A259DE1E1B4FC0 06BB1DC2D45B987A2268A77CE8DC025CB0D1B39788BBEE149103950650171C94 5FED1063050A90BD38605BD9365D1C2AE42A7DA3DDB9A263FE10BD487F63D908 D4F02758BD9D7BE53E6353A25BEFA29E42B50C1D078A8B3A746EEDB381CCE36C 93FC4BD1A8D1D6ACD0D355E948CFE397B74D243EB51597D251D0BAE6884D70E8 FEE119462E1939A9783414DF59EEA5FF1529F13869D1FF0A44935C5198CC5DAA E1FD2A17AEEBF4974052D06734A409E26C457C06700C55896C90BB33E044A737 46590D9FA242819B9527FD59818D8829D4EB2D26A34CC05A2CC063E66F2DF193 8E4F9670014BC243180E45B51DDB05AD1E6A7F619EE1CE09CFC1A4F02CB7270E 4482FEDF673EDED38EF3173C475C34BFB3F6623C5E942A7797FEDDD0EF1D54E9 1D90D7076C0A9687E334907C22F2E7C603388D8D626B0E5A62B7543DCBB575D7 9A6BE1528EC9BC18570001092524E4FBB02F3B29293BCB4F0EF14A2DD9DB22A5 BB33455799E8120D2A4862424AA4A382972E2845E042506FC8F6E201D11DD0F2 09FAD8DC29C3E12B66293ACBFB13FA0F26238981F2CD52B47A8CDE6DF5CDFAAF 3113E1A6366B806EABA9C34E5D41167CD10D7B639021FB4CFDAE28CE72A93F3C E8929A4BBA0EC700D5662AAD9EB38047C6C7C63EB3FA153A65FFC947D1DAFA83 BFA135660F82D631A4E919E5A959BE09BAADC19CA3FBCC7A84ED9BCD27172C4B 29A7D3BE46C7221AA0131972D052343CCA651DB77EF13044FEEA9FC934DBE128 7EB00CB51AE0E4441228A53E50A5C7A8C98C01628CBDEABC4A973E0A21408D03 5F0E66B97FD2BA0E2107372D2102CD08F341916EED50DF42135BEAF2DD2226DE 0CC7936C708E215AF8A1354E994063247A4D5040F40C7AC301F1F89D07A5E9D2 DDF56B83593F22CE3FF6EB65A22F0F3A11F47BC093A27A637F3F83986236599C A161E3BB0636EEAEB4A002E16363E156951690BF3E6A00116C43DD0493B5AD6F A569D3B63341BC24614267B3454B5CC5297D9EC9F969CF54456F661B0ECC50DD 43F766682CDBAC7B4C839D513C166AF67BC095BD912437C71FEEAAD709762FD0 99AB7DD64A3C0BDEC115291F78E2FEE28F252AF12953983643D28FE77C54FB5A FC7383C61E7398880CB0C26A2166276A67F8D61D8F8CD90CC2DD14649A672C95 DFDABF32F2F4F980A5F215BBEDCD6C8CB458417B55719598F44DCB1363365D9D 48643B1157762AB4C83B559E07595A4FEE8580156FA4E26CCE42580E78C82637 A4B5D0EF7FA35DCFA0A23EE5C23A7E9B638371BD9888ADC4C3AFEEF22B2CD6F2 975A3768C4C5A9017A1605A87F85454A3F824BC0CE12314B74CB507B2C505DBB 4DF59D7BF3EB2B04DA0150E592081C96F7A03CD7A7DF16C0C1BD5558D97795A2 C54E432438D424E906C1705F204C5A2A1AA6304C367566AE70CD17E76F2BBEF8 F25012676EBE2474F53A164528B440395E01465A38D9F8B877B0FB01CDE1F66C A22711A8D70E4E218E83FAA9F608AC6D52D37BA855E7BBC90A64B544DDEC7C86 90B0EFF55C15A8A7D97DB122785084831D08AC9C4D889E9D3B1F3B123C75017E 45A92EDAF4E312A05259F8D40BF93D3BB507AD1699F8745D1FB0D2679ECFF1F6 50E0E438439AF15ED024DF6C0AFBF24B11D83F3BDC58A03B47AAC8C3C2C2CAD8 F5BB9568D39EA370DD0957C6B30D0BF63F395DBE7D082EC5884AE278D7E20041 106E0DA189EDDFF904CD159EAC08976C765DA6636BFACE1C5C4AFBDB9077AAD9 5E7E3045F8E616F0507357304AB696E5901C8FA315E99E5EF9DD277BF3144473 6694B0F143383836A9C3BD79F7E064880F4E3DD0402640B2D5239D5F7CA73FC0 9DE396392C474E42D5E0280B9041D704040A1980964F4EF722318CB9EABED128 976CD9BAAF735C591C3D774B184C9CAADEDCD28DF7D7887D67CE70D25CD6700B 64313C703A3B2A890F359EFC2A02A180BA959B635F150797BDBA8D1BEA24AAF8 95556D2E08EDEC17952EEA75F6D1FD6A50B3B6181085AC2CB590004CC285AB1E 7EFBC618B39859596E443C689DA067174D263AA70FC1F975414B431BE8B62074 0ADB53FFBF2E7C97A7F8DF2F8FD43FB36AB18A00DDBA774904EA8FB03DBD6CAD 0C8DE4EB41345890E4C20420356DC9BF9152E8F58379E0D35BE2EF6C8C179C28 0DE587655399E4A83268A115D0DC8A7AD47082B03FD659DF19FFAD11CF719E22 D0DCB296773C906C550278B5C98E0F92B1CEC1C671DCAC3BA56BA13DBD4F8969 D905B494839D6EDF704EE069F24932BF7F32CAA03F37230658D36D29AA854040 9CF12CFD9E0B52B93187D73F778BBE062563A398D30F8461C007A7D4913EAEB1 979C267CAE061BD88C1CF7E69F2EBE4A51B0B15A05C6C17B8668184B767E1E81 3B31769FC5ED8F03E6714559E85A2BEF48BAFAEE6D77C95E58D4D42F15D8F6FE AE1289D7D23468B4F01D6C2430D2BAE8E23D0A1DC3EA48EEFB0D1F218A3730BA 61B79AF2E177C9EDDFCFC72A387D01E4D5E753C2DF692D859961A851A766FBB8 6792DD89BB80D94B7413D7BF64738AA62277F6F33498B1EA99B2285AB1920410 A9F06AB526244C48705F155BCB1B8C56288A67DFB951614C9AF7288241672728 8CD2F7489C49F3A580E1D015C09CD8693C6833FA8CC9568D86CE2CE5052A25C9 8A9248F88A48770FF5CD369DFA408927926AF66646653C5F5E4A7FCEA254841A D82221436789309218496E0C40DBAA3D9643CF88493D37839FCA7698CC080DCD F7CDB228D0C77503B55348E08269819F3A2AC97531FDD6998F8F06C066F268E6 5DEA3263C3BFC8FF07EF376ABEFE6A756F35A8DFEA44391AA5CA9BA4EC9C210C BE6FF58E6DB36713391A8C35F78D8058CB2C6593B74B132642F1DE8FB82284B9 8D1EFB850FA9A859102B2767906B8B50D86A39E766017B9AB5FCC122993EAD12 C905F564408E88AF509E34AE4AE9837AD130A38F945783E0108E246C4BB7DE70 9BC0F8410C3AE90E852C0D535801BFF987B413E8E5D067C2CE65630FEEB22CF4 B7D9320B6CC624847881BDB3D8E313CC0ECF0A166A119F173722607237AA57E4 EDDBDE557393EB37C1C3ACD81E84E5E59386A77BAA01B11F36D0C844F347C75E 4A8AFB9C62CF94DE81C0F8BA56F21CA3707857CBE388C710ABA88D4FC1D18DDB 718E387FC60F830B64749D4F16A9E81F051DD61C34A7518DFBF4442863934CBB 04E8E8E55041AF66785D77CCEB810131C411714060E1C36F5BC64647914E55F8 396265C9B6EA8E892E933DF056897B3EDCAA93AC8FCA308A7484994C0FD51510 C57FCCA9E6D9E43555FB56F943A971B4E20355E39D8A7ACD7F289848566DD13B 675F534C5CFB01B26E38ECC59540C26C2D471CB6716B3C88115F6D844E598165 4913EF0B7589C675508CBF4BAA7074B7DDC316084FECD420B49C3A53AEA4B7B9 282552520CFABC7634D016AB5DE79834291804D759B78CD35EF9A0168E5EFFF7 CCD0CCC4CA5873AAF0E22B542838D7BC49CBE26B06AC7232D2550BF6BCB22035 E5B73208E0A99C5338B60C360D54FB543704CACD72786D14CA0C4F37E12C5BDA 3BCAF9BA6279BC8EF63F7020F50D2F667579F46271A97D646D609619BF83DA3D F08FA69970E0E96F55CA54B19AC6F36EC20A361A76C7FB264BED5D259845DC04 2233A218E53B8E3EB92724AC4ADE85959A5F672EA81EFF2553AD5D5AFD91B303 FDF644346A9A67624671794229791C59082FF2D42F676DC097611C328A2633D9 91BFD2E730916C6A6A4EABBB1571368BC6306FE7A29425283E90F6168CB354B0 0AF8D8EE005126C7CE973CF82637C4B2A8977AF6851D4FC27D36435CEA622F7E 940D5CB5020C22B76FE9289EDC57325F9CB3CE8837A5B632488C1B0F36439E36 4E9985210E7CFE1ACD1784C68F9D5B9A7A0686B1DCB1ED06D434FD4CA595D7DD 78B85C5640C03195FE2E5DD64606B77EB3700B3351BB49DE53BDE723E4FF691C 23EC98FA6297A92EAD1BFB2EC185600DDDC4553308F2559458584D6434DADA92 15EE2D9F737DFCE8941A8B414819C63C762398093CE9D07B039088CB061028D4 F3D1E8AA087126264B0D8CA61F53B312C21A7F23A7E7782E68C4C78795E2279F 0CF6A358CAB8B3A2257F418F3392E8ED54D454B13ED0DD8D0A8BE5A750555418 8FF8A872E41B429D2FE4F993189035A11FD011BD2B0DC1AB4C1E61AB4758CA28 B34B3C19861B67237AE9CB877B87AAD49FE731F3EB33F5B441CDD8179BBE36DE 7FF4562DEE71597FAA43BA3A2C30561D0D5050F98C73485B80A695C8963DA8CE 38E13CD15E270E08FC9485599911F9C6D99BBB0DEAD28443B1F6BA8277109A42 84DE87E03AD44E26AAEE1A9CDFE7AB25718F1DFBA31E8763EF90A24FB0F2006B D2ADA508DE4E21CA7E713987DE89443D66CB15BB0DF7B42E81F8F047AFEEEE70 AFBC542297E2F6B3FBAC5D62D579B356BF5C418616BC30E1E960F940AE76D219 86D022BC055068DEA9F590155CCDF27400382564FBAC81DB00FB53FC899E9C17 358AEAAF4D3C465A2025013407525BE23BDC9E46B28EE347A06396A9481D8DCA 2390972B96F6C2824F5CD2CD8F8B07567E07AA696D08A98920598F9A13746F5B 4F396493910EC159FA730A4909D14B88DE64579058F4102C4C5484DEBD1FEFCB 63A03FE2E8D620C97C5A0F97D918A1F4AA 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMTT12 %!PS-AdobeFont-1.1: CMTT12 1.0 %%CreationDate: 1991 Aug 20 16:45:46 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTT12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def end readonly def /FontName /CMTT12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 46 /period put dup 98 /b put dup 100 /d put dup 101 /e put dup 102 /f put dup 105 /i put dup 110 /n put dup 116 /t put dup 120 /x put readonly def /FontBBox{-1 -234 524 695}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F0364CD5660FE13FF01BC20148F9C480BCD0E C81D5BFC66F04993DD73F0BE0AB13F53B1BA79FE5F618A4F672B16C06BE3251E 3BCB599BFA0E6041FBD558475370D693A959259A2699BA6E97CF40435B8E8A4B 426343E145DF14E59028D4E0941AB537E34024E6CDE0EA9AF8038A3260A0358D D5B1DB53582F0DAB7ADE29CF8DBA0992D5A94672DFF91573F38D9BFD1A57E161 E52DA1B41433C82261E47F79997DF603935D2A187A95F7A25D148FB3C2B6AA32 6B982C32C6B25867871ED7B38E150031A3DE568C8D3731A779EAAF09AC5CE6C5 A129C4147E56882B8068DF37C97C761694F1316AF93E33FF7E0B2F1F252735CE 0D9F7BCE136B06EE967ABE0C8DF24DCBBF99874702ED252B677F407CB39678CC 85DDFC2F45C552BA967E4158165ED16FECC4E32AC4D3B3EB8046DCDD37C92FDF F1F3710BB8EF5CA358ABACA33C7E5ACAD6BF5DC58BDFC3CF09BA2A38291D45A4 C15FF1916FE2EC47FDC80911EB9C61F5D355BEDFC9DB17588547763AC5F0B1CC 12D2FFB32E0803D37E3281DA9CE36C5433655526ACFB3A301C56FAB09DF07B5D 048B47687348DEB96F3F9C53CE56DDD312B93D3918CD92AF53FB9461864D11B8 0138918D0B1270C54873C4012CDE6F886DB11BCEA04B023EBB43E0D0A06BE725 741D08B9DB688731A6C9886C15A83C28DADCC81385EA239E045E8F3670CE03DB 9EE77ED067036595C9F3B1854343BE3A12E486B6E5A2F8AC44FA5378D28DCCEE 306B0E283AA444423F9A4FF38E2B56DCF67A39CEB2C643DAE86865517D5D0371 CB8797208ADEC637330A3A57902C9A88EDB75A7C16FA9850075D9F19578EC666 1353CC1FC512D59DFF847ACCD3D3A430B504B211673DDC4479821337AB4E5E65 62C97A48B143573EEA38CBF56CF1B10B12035AE7CD129D5CB190A0FDA1E0AF23 9F052F23941FF6BB4E1090E581719A71BEB37CD13690F2809B361962251F0E88 B795DCF072BB111F7DB378E60D893BC84AEF77DA84C38908A4BF04EB017E726D 8903DD02D195624C1BC626D1C83945D00F780FC8A80C47370582577E479D974C 736DDE04CCA1C866CAA7808AF454655D7957DB9E22D11A94F2C29F00D3B396B4 A95E36F718FA0A0EDE44C72C329C3D22DBE26A83EDCA865790369F443A2DE2DD E9F1883D446C9192D025CA5ACEC66CE436CBC516D7383BF8CB0DC2E3AC1B2766 ED78FDA832CD470CE482D3DE0626108D25144FDF3A1164F656E60BA770D076DB 0794D8FF96D06E6B50A152BBD1F8E138A40FD52C2F0611D1DEA86A8923AD9C2D C24F984AC250325316C85AF7DF7CCD3D385371F896AE8A4B9D552D89974168D9 8CAF0D5B1B370654FA45BB7F45A9B51FC779E7C1C5F70D82C20D3FCF7B08A90D 60672A148C6962B9458B33151CBD9FFA83A4AF35AB28B18AA45D68AD8C0B76DA 4C49CD306B883BB1B3A3A3762E8F0500348B8CE20DF21E64F7935477884688CE A9390A303BC14B7DD36D1DA394ED9066663BFA0360FD5AEE0AC73C36C1CA8551 305FA9C07FD0D6FAC844BCE9B047309C7D60F72233BFD80E2794149010C8D3CA 6BCF6F7003AA23F85E9F4BFC7F238D5CDEEED61684F97B54CCBA789689330A9F 87093139AEC889874C15DC8F89B8BEC004E4838D66592E181D62EA12BD40CD32 4D308405129E4EB488FB783D1017F976916847F754BA1D8641EA56795D8F1B4F DE3B9DE9B4C6424659E019A7B995A711250D9101096A2CE3C2F9997671B7A40C 8FD0194F86C2E25EE41E59B30EC70AE1B55B2F3478565054640567443249611C 17FFBAF19F4FCC1BB8EA8F26D9823576195F5F1C99D264072E565268E876C467 22AC26207901B50EA21B29F795500930DD766F3AA4E7F507F84CBFB0B6081500 F4A7D99751C01D2C3FDA10EE97EE2652981A822E3599D67B35E746D7826A68D1 629F07EDCBBF75028A00A4EB2F8C3F4C580FAEDF3164CD607A9FCF07605ED6F3 5C7BF8CF348690236156D7268FDC7983A741CA3DDC8053BFB0C2BC4C88321BC4 3492296D0A1F7A6B5ADB90A6849207543ADF46661D587C13C88BBD91873B2500 8320B45AB43B262AC297EFD751556AD8E176DEEE97FA226C01C621E2D5671C6A DD92A5F88E245FFBC79CC7697C0D7F40BDBCD73AD662A3AC04B8C48ED291A953 923277F691D7BE5E01E9F8157D6F2528D912B410BBD87BEFE242FE3171582674 C198D275751304D7F5F6076859CAE82078B7F7AC4F9E0DBEA86D855E15E0AC18 7253261FAA0230E36CC9464E982D657F2E7A671BCD739C5C80C1EEBBF4D3F139 389B58DB2A1E5F13520CB614CEB8A42D00BB3BF065CF1FD9EDFC5DCA1CCEF16C 46B133C4D9FFAAAA8DE1E589CC98001B086D6161D0C8BFD639620706F7526601 F719B957810E75E3F962BB16EEF06DA5BCA798535392BDE29FD0D9F4BF2920C9 7C154BBF72D051F1421894065A0B1CECB201FC4CAA0AE1210D7B891105500C04 E6EEEC60093DC965EC69B6DB2B2095A961E78A984FF1F2F45547196D25E99484 7959EE3C756A6E61ACE56F3C7C7C774F21C931502025D766EDE2EA7F66AE61BC 54BDB7D8490A329C5F0AB2B5E7AD715F36F866C92D41D4032F3E057B05F6AB7B F1ADC995DB9A43E9C6ACB3C066F94F941C77A582C86060EAE9038BBC9AA5CB63 E8183A1C33AD63DF711DF249D18CEFFA416436E614141E02C99B522732D5D6E6 870B7072DDCC17D50DC5F720D6208EED871B1CED126EC98F147CA1926B81FCBB 3725080D5A85B59D9EB95E7B65D04A2A789CE666E7 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMCSC10 %!PS-AdobeFont-1.1: CMCSC10 1.0 %%CreationDate: 1991 Aug 18 17:46:49 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMCSC10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMCSC10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 98 /b put dup 105 /i put readonly def /FontBBox{14 -250 1077 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A30EB76029337 900ECFB1390CA5C0C3A04528044F266BA17BE487C79B94FAC6D6484684C5BFEA 87BCCC77D40AD11552035E95E3007126418ED49B68468B38A14E88E68A267B98 076F1C9769A5AFBC285E5B158EAC9F926F1D6C0B8F1D57D9C31D25AE27123518 9D2CD92E5689E0213089BD268DA5E47525CB8EABAA4B78A15AEA34705889AB3A FFB8953B5B3482E52BFA0940630ADF8C0AC2177D907324299EE980E850F203CD B627962F43D5A678C44243CDE97853BDC6AB45FD5C09AD274DAF89929F583CC9 CCC24BDFC68B92111055ABA5F26D2DC67C70906F71C2957701D65AE746A60C30 40E6CB24B97FCDAD0487AE38A201FBF0E41BABD2181981A71940F1E707F91E5D C8CA50CB16D8702D188E56D014D92F76CE0B52ABDB9110E32438D2BBF3E6A40B 7B005F10BB437812CAC6ED2996F7606DC962C4FDE207FF322782C343DF44CEC5 FF06A55C630C20E9AE1B0D1C5673753C43BA0767D65D1B451CC6380D8BB3C4DC 81E8FD8AA79BE993218686F29D3CD925566DD587F541A0DA1B1CC3BCEA2E6C7D 5E1016F6917A871F1BBAD96AF9E867735017119A381FCF33EB2D3E1E7093FD90 CDB0CED4818CFD9E201A03430CEC713620BE0D3254158931FB657C6877C1B3D2 24030F377820DA58F4B95CFE645109F3F1B80DB5FACFD7D05AE2909EEFCF95AD 9CB286C8B6C075CA2267C101B736139863186C193E31085E7C9FD88EF8BBECE3 933542C85309013325B4BBFE9A5B606780C8580ABDA2F5D0064EBFC23939B307 08568C3B7F5F053BF367DEBA349FABB9F760C44D100BDEEFBB01F27BFC61FE5D 37503B51B9E254921BDA95918F81E31DD0E9B8B8250AEA38F82DAD325435B64C D8B5F7A301A72E45C800ADABEB39A03DC420795717AF97E1CCFD821C179B5565 CA93AB1429F1D350F15CB1F57E7A5E719F465C0D3FE09FD3B9F633E145C865EF B295C7BA073B1E4A4F317A1E054116714D8C23A26E0AD3D8C6A5CD8E426922CA B97DAD2D32C09BC98806C9B3FD0A5E7F697820337DFA4CC668213A9C78F63A37 BC3BB68D3D7ECB3B1ABD19330573F96F5AA89701E6F36DE746FC440E8B900DF0 5DB22E08A48E5F3CECC48578B099C2E0A6EE39C8FFA856E3814EFE12AE5ECF9F DAF59482263A65F11C57D09A24F56F456A38152F5EFE6C66FDE1FD5B322D29C1 14D3184B2E3C99330F6DC405760261B82E1B0B40593796E920F192F15BB507D8 5534ACE2E0B3FF19366404B3A62402EAE224CAA7CBC16701608BCC6418634A9C B117F056AE679BFE54694EE4E67D50CFB9045EBACED199C37C8E68E368D68059 36A0E508C471A67026C120490944BAB229248A0CF57920613B160CBE7D4B25E4 FCE23BD0C5C83A84 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMMI9 %!PS-AdobeFont-1.1: CMMI9 1.100 %%CreationDate: 1996 Jul 23 07:53:55 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.100) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMMI9) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMMI9 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 59 /comma put readonly def /FontBBox{-29 -250 1075 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 9E394A533A081C36D6F5CA5FED4F9AC9ADE41E04F9FC52E758C9F45A92BED935 86F9CFDB57732045913A6422AD4206418610C81D882EE493DE9523CC1BFE1505 DD1390B19BC1947A01B93BC668BE9B2A0E69A968554239B88C00AF9FBDF09CCD 67D3B2094C11A04762FE8CC1E91D020A28B3C122D24BEAACF82313F4604F2FEF 6E176D730A879BE45DD0D4996EF0247AEB1CA0AB08FF374D99F06D47B36F9554 FAD9A2D3CE451B7791C3709D8A1DDDEFBD840C1B42AB824D5A0DFF0E0F15B0B7 22AEEB877FF489581DA6FA8DA64944555101EB16F7AB0B717E148B7B98D8DBFD 730C52937E226545CF8DC3E07C5BA30739BAFCD0F2B44275A6D503F582C0FB4F 449963D0AD2FAFDE33BA3D77BCA9D1DF878DDAFCA2E22CC4BACD542B282164C7 97C2BDE318AF9D501CA21F6E662E7AAB75A5F24D2C182E598D175D44E88AB19A E7CD59584F95B389183EE21B525BF52A3F23C0FE5383A5565A19361D716F508C AAB78411CA5A4D27552CC1C435760D5A89D535B71C593E755C616661363308DA A683F54ED0C23FB2C225A008392B0B719F66F11A946A090B7C00B662A3C69599 B4ECB0CC70C85C4BBBF207E0026F6C7A19F2ACFB7A60804FC98A4BFFD7BFFF2B 9529E6D9D4238002BBC255BC62959D6F3381FE06E0621B879D5FE5B541D45A1E 759A6E7DC32B1D1632368D09A97039DF255B6492B1B2B7E2C1434E8306ECA7D3 5A79B6D614B4979F10988BC76ED53A5F45315CD7DA216221F842FD0F3E050DD2 BAC23C984D506D8F7D614BCB6B244F5F41321549BB0BD041FBF3053307168680 3435E9C9445A59A7C666418C4F2512C32058B1CE1EA47F00930CB228EFA5C55F 1E69458EA5F53CB64BB754DC25A4385A270A8C1F8BF2C9937A809D321BFE9605 045746539B38DBFAE253A7B6C3483B6C6E9FC204AA9442E43459BEFAD40BB95E F2A5F14EA47F4B6C6CD1AB4D9EB6FADBE69EB375844376A0D2A670D9BF3D41B8 14B8B8C20FB508255F1258E5266CA75DF1E985D977B4612F9C2C9CE406940E7D 721BCFDAC2B2F23A07990E9AE02920D85F2BDAB24E186ACEE7582939E534AAD5 47DEEFA1BC3B1AEE113C6BCA30B1C4C6101F628ADE2D83BBC0A2DDB3CCF8D2D1 22B5F7C7D15B16159F180D5E507F2AD813089277 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMR9 %!PS-AdobeFont-1.1: CMR9 1.0 %%CreationDate: 1991 Aug 20 16:39:59 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR9) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMR9 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 41 /parenright put dup 91 /bracketleft put readonly def /FontBBox{-39 -250 1036 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0 92A36FADB679CF58BAFDD3E51DFDD314B91A605515D729EE20C42505FD4E0835 3C9D365B14C003BC6DD352F0228A8C161F172D2551CD1C67CD0B1B21DED53203 046FAFF9B1129167921DD82C5964F9DDDFE0D2686875BD075FC81831A941F20E C5CD90040A092E559F6D1D3B0E9BB71733595AE0EA6093F986377A96060BF12A A1B525CD9FA741FE051DD54A32BECD55A868DD63119A4370F8322CCBEC889BC2 A723CB4015FC4AA90AE873EA14DE13382CA9CF0D8DFB65F0ABEDFD9A64BB3F4D 731E2E1C9A1789228FF44116230A70C339C9819676022AB31B5C9C589AE9094B 09882051AD4637C1710D93E8DD117B4E7B478493B91EA6306FDB3FA6D738AAB1 49FBB21A00AC2A999C21445DE3177F21D8B6AAB33869C882613EA6B5EC56476B 5634181ECBF03BFEDB57F079EACE3B334F6F384BDF9D70AEBD592C8ECF21378B 54A8B5DBF7CB9282E16AA517E14843909339B5E7C55B038BF3BB493F3B884A1C C25F9E8FB912CBE23199AD9D2C3E573727701BA301526C66C3617B9514D6F11F 11930B1D97C17816C85B1BFD9B973A191B33CC3B391815AD14F1CBE935942AEC D4004E6BEF379066FD72209DC88D2E634E79BCC2B98C766CBD92C561F2703F8A 109E6C6CEC7B866F2FC7ADF646BF492E520319F3B949AB5D84AE990B33344A40 3971F58DFDF8D8D67FA0B8F2A0D884F8C09A5A721319B911DBA0A35903877343 C37BC36C5EB32353272D1E6ED5FCA611BE319A7E1E842CB7576E7DE90DFECF89 9E58BB6430D9915B21B801B7E59AF142136E37651973C3604ECB418DF3781F08 3C0F2B2970707B20E814AC815C2466B2091DACD99625F545E1271F71399E8BE7 C186570261008FC3E1DF0E67D3F359E686588C71FE75385359A52DB8945CA5D0 8CB7095125E4FDDD5522A98FEA8DBA9672A15519A1AF818AC4AEB204D51943C3 34D82EEB8DF6B0B8C02CB793BCB888277955555912CEA37EB5D911D7F824341D CC1B963D903DD4BF5C504076ACDE67D7BBF2CF05055F2ECC96D9F00695E4603E E4D038B3C2340C2A0139FB7417D953B1834D9525A6B1943963B19324122713C9 06A96292825D1B428F69D57121D819CD0A65D9F866282E687D22A8F6A76E5CF8 E936F13673DDFC25A7E949FC226C3CF47EE90E9759A1FD9E3E1FE0DA6131E1E0 E929086574A420070BC1BFC7D4F58DDEF6CD26E5CAC79377DC0F11A1E31C85F9 2F436D58C3316651B9CBA30BD53F55C46F0069D2B0878B03924E29561535 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMMI8 %!PS-AdobeFont-1.1: CMMI8 1.100 %%CreationDate: 1996 Jul 23 07:53:54 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.100) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMMI8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMMI8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 46 /triangleright put dup 47 /triangleleft put readonly def /FontBBox{-24 -250 1110 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5 5250011D19E9366EB6FD153D3A100CAA6212E3D5D93990737F8D326D347B7EDC 4391C9DF440285B8FC159D0E98D4258FC57892DDF753642CD526A96ACEDA4120 788F22B1D09F149794E66DD1AC2C2B3BC6FEC59D626F427CD5AE9C54C7F78F62 C36F49B3C2E5E62AFB56DCEE87445A12A942C14AE618D1FE1B11A9CF9FAA1F32 617B598CE5058715EF3051E228F72F651040AD99A741F247C68007E68C84E9D1 D0BF99AA5D777D88A7D3CED2EA67F4AE61E8BC0495E7DA382E82DDB2B009DD63 532C74E3BE5EC555A014BCBB6AB31B8286D7712E0E926F8696830672B8214E9B 5D0740C16ADF0AFD47C4938F373575C6CA91E46D88DE24E682DEC44B57EA8AF8 4E57D45646073250D82C4B50CBBB0B369932618301F3D4186277103B53B3C9E6 DB42D6B30115F67B9D078220D5752644930643BDF9FACF684EBE13E39B65055E B1BD054C324962025EC79E1D155936FE32D9F2224353F2A46C3558EF216F6BB2 A304BAF752BEEC36C4440B556AEFECF454BA7CBBA7537BCB10EBC21047333A89 8936419D857CD9F59EBA20B0A3D9BA4A0D3395336B4CDA4BA6451B6E4D1370FA D9BDABB7F271BC1C6C48D9DF1E5A6FAE788F5609DE3C48D47A67097C547D9817 AD3A7CCE2B771843D69F860DA4059A71494281C0AD8D4BAB3F67BB6739723C04 AE05F9E35B2B2CB9C7874C114F57A185C8563C0DCCA93F8096384D71A2994748 A3C7C8B8AF54961A8838AD279441D9A5EB6C1FE26C98BD025F353124DA68A827 AE2AF8D25CA48031C242AA433EEEBB8ABA4B96821786C38BACB5F58C3D5DA011 85B385124DFAE11BA4AB27032F02AB84277DB8B54826D64150C0E6C44847E0F8 7B8C3B2F64901A6294B12EA49956CE64B494E0209BFB2AE0C259EA9A893EC32B C4FA0503335F5A1964FD5CCCAACCA02ADA888BB751B8465AE8444AC5EEE0D492 BA68DFF43A29E159E9081B23DF3D24298ED3AD48109E9B168991F08DD486271D DBE58A6CA2B355B58A18837686C8F73C27FC9E0C4D503CAE512AB2211E185703 022B61F56E4877E621E29FAD2AF31C90760F25F4B8CDA1ABDA9B94660EA88442 FEF8B51DE57E7570C7BC05391CB232CF7C7D33C7FABBDB2F0ED17C46B9E9768A A16E0321917C38DAD3BA56C061E921005D2D3724A8815F179EC5B021CF53F248 2F37E66DC8E93798F89FF3EE27170865C2E723F005FA9B0E4DDBAF43DD50A11D 5D0EC5F60D8162C220832ED62BCE9530355A80A1407D0C7101A18B289D7CAA71 86FDB2741B5CF0BDA7BFC21DF1CAE24EF6E75D8148B94DF40D8CBECE13022A6F 4690736418141D7F2C2618F0A93A8B59456FE444BFAA83785117209037 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMMI10 %!PS-AdobeFont-1.1: CMMI10 1.100 %%CreationDate: 1996 Jul 23 07:53:57 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.100) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMMI10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMMI10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 58 /period put dup 59 /comma put dup 60 /less put dup 99 /c put dup 109 /m put dup 114 /r put readonly def /FontBBox{-32 -250 1048 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 9E394A533A081C36D456A09920001A3D2199583EB9B84B4DEE08E3D12939E321 990CD249827D9648574955F61BAAA11263A91B6C3D47A5190165B0C25ABF6D3E 6EC187E4B05182126BB0D0323D943170B795255260F9FD25F2248D04F45DFBFB DEF7FF8B19BFEF637B210018AE02572B389B3F76282BEB29CC301905D388C721 59616893E774413F48DE0B408BC66DCE3FE17CB9F84D205839D58014D6A88823 D9320AE93AF96D97A02C4D5A2BB2B8C7925C4578003959C46E3CE1A2F0EAC4BF 8B9B325E46435BDE60BC54D72BC8ACB5C0A34413AC87045DC7B84646A324B808 6FD8E34217213E131C3B1510415CE45420688ED9C1D27890EC68BD7C1235FAF9 1DAB3A369DD2FC3BE5CF9655C7B7EDA7361D7E05E5831B6B8E2EEC542A7B38EE 03BE4BAC6079D038ACB3C7C916279764547C2D51976BABA94BA9866D79F13909 95AA39B0F03103A07CBDF441B8C5669F729020AF284B7FF52A29C6255FCAACF1 74109050FBA2602E72593FBCBFC26E726EE4AEF97B7632BC4F5F353B5C67FED2 3EA752A4A57B8F7FEFF1D7341D895F0A3A0BE1D8E3391970457A967EFF84F6D8 47750B1145B8CC5BD96EE7AA99DDC9E06939E383BDA41175233D58AD263EBF19 AFC0E2F840512D321166547B306C592B8A01E1FA2564B9A26DAC14256414E4C8 42616728D918C74D13C349F4186EC7B9708B86467425A6FDB3A396562F7EE4D8 40B43621744CF8A23A6E532649B66C2A0002DD04F8F39618E4F572819DD34837 B5A08E643FDCA1505AF6A1FA3DDFD1FA758013CAED8ACDDBBB334D664DFF5B53 95601766730045C2D9F29DC2BFEBDE5E7720CC7D82522859B92B2395E3305B29 73FD4E10D7424AD26B4CB3A3B63772EAC0C1D2105D9D905BDDAEAE6D1608B712 3FBE98033DCC0388B4F7C41BB62EDBB86AF2632E2DE8F7647A13F5687010ED09 4F623DB722C478C95C2876F9D36DC318015CCE51CC458196221F79BC766EC955 80E17D642DFD23D7FAC69C5536361311640EDCF70A695C64534231AA573D9DD6 D4DE612F998BA3BC526A9C8CE3B506277D99DFA253E49EBD8E8D1CAC7D29294D 73A5DBB684E0DB043188F7F4C4D7F651A9E8ABBA7CAC3F9DB366553416ED1F67 5480281C2356B3C16E14CEE1FAF70A10E28B2729372BAED967E5A5548621E00E C11A217F16D8D662FA8743FFEDED1177926DB303E939809999ED4071A8072A92 AC242B2BCA812DB939859148D52C7298F13D75EAF794993BE6202EEC8CBE3301 341AC9B408E1A86713E46B2E138151154402F619BF30B13DA4D90C2D991CCB5F 46DCE3249CBBAFC50688BAEDF032EA0536B70231947F0286B443304FDCF20ADA CDE1FAF0A6E590D55C674C2940F6440F1137899C87FD7450137D08E111C148AE 38DC2A14E4DAAAA7B1DD3B3C76C0A745AE5235DF544964F8DC851152CFCD9F59 4B015FDD882264B2435F32BD6821209ECBA79A2A766B7925C7B584367C5E9F49 32F577DE7E2E5726D51522B311944A9AB097E41985A6B0A59D78112FDE8500CE 840BC1F24859692C55AE0BFA47454690C7EE71581D40E280A52C4847B3765A9E 3D27BB08E47B426DEA01537A5F06E01B0BE0282F63C8613D6376D36EDC819B98 5E38BABFB939413481E0207EEB9ADB2D21910476156E846A5AC974100A211C07 2F43E3A084CA249F9F2C33936B186E88F5A63E7F4ED44C47D77685F5961EF19E 0516519EC31493447A3E66CED7DF12EFC4C47004D4059135FEAA3E9FA72CCA37 6497E79BFEE337A571C5B58411529F4799C83E20999416FE5B663ACD6D8811AF B006C3A0D24626A9F05256B19B443FACE644DF61040EF66C5370E7967051DD92 EE2C16C6299DB1EE78561B4BFFA8A2E28CC960055030E854FD64FB17BC407CBF 9DF3B94963A99114BBB754D6C5F0DCA2C527BF586CE4A4BBFE9F7764FB483BB2 7B37560F84855603194774641C768A2F0A483DC4CCDC9479F94B1CC1A98ED4AF 9449D7186397011ACD1B5752205FC88AB3FC4B1088677666FBC4367331C034D7 648C6726F55E2573AF7E00ECEED5ED2CB03A371041E76D8EC6635F5BE41A82CA 1053A0BD5258C956D7DDAEFBF705429E6DC8462F24AB0528FA2634775E82D1D9 1AE99184CC2DA0ACE683E0904DE8C1FDFCCD25BA22B9B6B0E13B6D9356F9C83B 2E667BDB2B1C58B3A033DC9B4FAB027DDBE484FB7DCDB5F6EC7F94524158D5E8 8DD5D59A602A08C34CF8E2DC56D4AD913A410AB37BA001FE050B079140C7F1B4 B307DFD2D8C73B8399D4BB594C0D17B371D50DF999FF9504CBD962DA2624C49C 73710FD13604A61B980046813AC537CFC8167C083EEE3C 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMR6 %!PS-AdobeFont-1.1: CMR6 1.0 %%CreationDate: 1991 Aug 20 16:39:02 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR6) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMR6 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 49 /one put dup 50 /two put readonly def /FontBBox{-20 -250 1193 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C 68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361 3645B82392D5CAE11A7CB49D7E2E82DCD485CBA17D1AFFF95F4224CF7ECEE45C BFB7C8C77C22A01C345078D28D3ECBF804CDC2FE5025FA0D05CCC5EFC0C4F87E CBED13DDDF8F34E404F471C6DD2E43331D73E89BBC71E7BF889F6293793FEF5A C9DD3792F032E37A364C70914843F7AA314413D022AE3238730B420A7E9D0CF5 D0E24F501451F9CDECE10AF7E14FF15C4F12F3FCA47DD9CD3C7AEA8D1551017D 23131C09ED104C052054520268A4FA3C6338BA6CF14C3DE3BAF2EA35296EE3D8 D6496277E11DFF6076FE64C8A8C3419FA774473D63223FFA41CBAE609C3D976B 93DFB4079ADC7C4EF07303F93808DDA9F651F61BCCF79555059A44CBAF84A711 6D98083CEF58230D54AD486C74C4A257FC703ACF918219D0A597A5F680B606E4 EF94ADF8BF91A5096A806DB64EC96636A98397D22A74932EB7346A9C4B5EE953 CB3C80AA634BFC28AA938C704BDA8DC4D13551CCFE2B2784BE8BF54502EBA9AF D49B79237B9C56310550BC30E9108BB06EAC755D6AA4E688EFE2A0AAB17F20FE 00CD0BFF1B9CB6BDA0FA3A29A3117388B6686657A150CE6421FD5D420F4F7FB5 B0DAA1BA19D638676E9CF159AC7325EF17B9F74E082BEF75E10A31C7011C0FFA 99B797CE549B5C45238DD0FADD6B99D233AC69282DF0D91EA2DBD08CE0083904 A6D968D5AE3BD159D01BDFF42D16111BC0A517C66B43972080D9DD4F3B9AE7FB 11B035CE715C1218B2D779761D8D7E9DEBE277531BD58F313EBD27E33BEF9DC5 50C7821A8BBC3B9FDF899D7EAA0B94493B97AFEAC503EB5ED7A7AB67C3039A0F BF0BA4B455D035FF3126F33A4DF59FF96752CF58DC0863924F6042B14DC2DEE4 099CAA764A8EFFEB78F7FFD276F0928BA32624C3A69ACEB8777A461298B201D3 4DA271476B8AC8966668D4E28A6FBA952F6D295AA80CC09B0CFD6BE840703B07 7ED93999EB5630C2C7CD9BA683ED457D1341C3AA702B5FA8593A51E8E9165FF6 1385693E19161FF1ADC1FE0BE16FD3AFCDC3916A309FCE6B3F2B362C9F958A16 821E1EB2DD899522DD3155C0B7A7F0876E4DA32FD30D8289266D9F05E77F1F1C D3BFD2D4D6C8B6FDE0E8957BDBBEC54458C70B96F4CD77E734EE0CF620684024 EB05DF0536FAFF10FC6F6050AB338D44EA9C38150D3779A550C505C06D417A71 62D41C2D23843E0A2A73F72D4B5286E3CB7B8695B2434479776A59CB3BC6D352 677CCABF4133E20F12D91CFD8978C09FB81DF801707194AB8FABA9A6599C20FA B36DB0A166490D20BB0BD53581A8715B099754E6FA0F7D2892F5573380DDFF1E F9C3DA9F74BDBEBBDFA5715AE23264F967BC7841CE58E5EE2764555978D904F6 E8DEF6ED66C478848FC35A9827ACEA1D7CE85C8626C162FF296869DE 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMTT9 %!PS-AdobeFont-1.1: CMTT9 1.0 %%CreationDate: 1991 Aug 20 16:46:24 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTT9) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def end readonly def /FontName /CMTT9 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 33 /exclam put dup 34 /quotedbl put dup 35 /numbersign put dup 36 /dollar put dup 37 /percent put dup 38 /ampersand put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 43 /plus put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 60 /less put dup 61 /equal put dup 62 /greater put dup 63 /question put dup 64 /at put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 91 /bracketleft put dup 92 /backslash put dup 93 /bracketright put dup 94 /asciicircum put dup 95 /underscore put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /braceleft put dup 124 /bar put dup 125 /braceright put dup 126 /asciitilde put readonly def /FontBBox{-6 -233 542 698}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D1E 2931CE5F5D18C658602059F07BE66E6EFC9239D7AB2FB8A4CBD41675B8ECF279 650C29E53B14AC0E392A664848C1844B1CECBB2D5CFB72D0916B675C9A9A1E35 F12696A6F628473C604A95376468E06E295AD6F76CEB939D94113532050B9D5A D2F41A9EFB9424D986612313B89EFE9C8A71313340B248F6853B1EDBF02B7F9E F447220FE131D7D54CFB8AA1281DBAEA73E665BACB1F164552CC0CEDB63BD4B1 4A9AE8AC6FA02242DBE8DA46B64B6BFC11762F0784F216FC8B9120D688D1705A 438B14F5E5DEAF2A98408B3B64620DE3732A4DAE6D08D5D97E34C75DAE19EABD BA0796165C1151BCBFB1DF8D29A63A8300DBDB9E3323CB82D0337598B83F4F2B A97CF5196D4D1CEC1EDB8966E548C0D9C194C932319610FB43EA1B86322FE641 AB48770FF13BD475A7267E142388563D1A400419C585B22A9886074687BEDF74 D905BE8EE440BA2ABF28EAB673399B7F129B9729DD5564C681954621903B84BB CAF89AC5ADB2932472DF29ADA2BDBDB4D05F65F28F5F4C529613D61858E0074A 082A852710A62A147C966F2B85B51B0BE85F11D2057C66FDD61F6C5755367980 9F4DE680601D4DA41B46F8D2148450000413C27AA39B586B74B977B25F0FD3C0 4BA1EBFAFDBEC531EA1210365091671CE3C86A6D4BC591C37DCC02570042575A 9D24252D6E01A8603753934D7EA5CAC1BE4E5AD2BA047DE8F3983B23A8A1511F B08D373B69E5076CE4300137B8805EBCC0AAB89BBB312A77835795E3C069322D 42C893A30AD739E2BDD299679B158F7493764F2321E3965141B5ED1C6F4765ED F46D391A646B30C90002B1C461AEE79E5F094CACCA656CEA3DB921CC5205F328 A2C69F817061D6C60B121EEE844CA5008F23DF0665DBE77FC6AA17283BE2AFC6 6C52308D860781647D82BDD659BB4A98A69836D709FE1BD9F75BCD02F4DB7B50 8D54CAC298DDF38B4273B5A33DC2674A95A35CD2CB24839C5F97475503DA9E65 CDE8B65A65018E8D7D3AD4521FD8AF0A960C16297CA51024467879C20B03DDE3 E63C4D363F93AD83303788D553AD35C422992B80292097BFCB4969FAD0E03C2D 4A24A72B9BAEDB907597492409C890D6D2CBCDB562E6EFAF62081FD5055DAE53 A2BB50F51BF3EB4D3A1FBD64261177EE2FCF92C8FC82E8204A6BF5F7ACC9BA41 06451AC30E49620A232DCAB9201D1BE3819F86F3488D1984B8F9A794F760C42F 07EA0662BC18D36CCD663773EEF8118B9D85F691289167D75B074F3FE9900AAE 40DFE5B7064A61BE3CFD2B29C2FAF2914CC6F6D5D93F1EC11F8B2F8F9997EB3F 2A553C2D1082D648D7FECACE1190537940C2734E2E8C159CFE7CFA84FF4FFDC0 1078C1BFAA1821A97C8DE3C50724B8ECA436FBEFF171C76BDF78A7AD8C89EF98 322C643704E5B852C4E67A4BBF948DB6F38AA3E7009D354F64DD3BBADCA102C6 9F17BB5187DF0F17338E2BC681B68520C1CED29BD7132455294D95848C20FA14 C80571E1CD039F97CBEBB0FEB8E9FB2E3246E61DCB6E05E202EF54358107C014 3AEAB6D536DD899775A3FA9CA3D481D6F2E767825CE2E7E24C2C024A64D9108A DCE568E59105AB2B5167F3426CFF3EBA7367C9759A329C52470AD2024B87235F 4CDC8D76E603D720BAA894E329CA8B96620A4685C1954C8D9B0EC5976F9D5F5E B4AB4D4A54541FFB42803E45651CF19590B52D4169BED1F3C61412E0D29A5C25 6B20A6FC11610D15EA4694F032411F82A13CA5CC919C0A6FBD99E67C840B0340 FC17756CD9DDAD26F275C419F37C654DDCF17F08C593C05851BEFB31E0CB10F4 6A6C66AAD744DC72F442564C8FBAC55A3BE27CD59C61FF1B9933E951670ED187 FCA6ABF522440DB90CA10D9D438C6A5376CC0EA69EC872F5ACD597F50EEBA7E3 5CB9F870D6A5BCD18ADAE77D9FDA404A7A448D58DCDB07B545101AE5F5FE5887 751FBB512D6FB9A54DAC9105E37B64224071C8D32914FED32E242414F0AB4925 D9BB7B95C75E2277A34890C1A423173AC5093C4968EA08EE294FB01C51B242D5 F918A225C49B4EFAA3E779B68BDB62445F6737C80CB5F9CBDD8E0BDC1319D854 1AF179FE9F9378A433FBD169CA367E7F74BE33EEC0183F1919D3C484908B01A9 B99D9A94F3E446584E5059C5A00B4EA0ABE803EC5B21728B43FB04B50261637A 79F3382E216F971F7C55E98E1336B37A29F21FB9507F862BA519E5C6E34D5DD9 08B81FBA65180BD56777C9401FC2D1724A2D6B8385C9662BF95F46A0BC9093D9 DB84952B4A14992D5B965FF078D3DF55C39252F8965FA9BBCDA6BDA03828001D 5BDBC2245BD3EE9A712171EFD55592DFC8BE07032AD8B9916AA34A575F5A5382 F7290B17EA4E9B7C612E3BA7B573A477E462C907E6A7EB48C8B3B57DE7E95A2D 66368D376409DAD409CBA2DEA2FC3326D2BD15A331CB23D5CA9E5E7FEF879FCE 4DF5B422ADDB78697D77A534C2AED9578C1D60F45B101DC89A5313AD28904066 3C2455D80D44D060C13934AE29F7735C2317083710871E4B780EC529330F8047 466634A54155A59BC811F1FB66315F5E32C7202A0D30CB9924F06A8E2E44E618 BCF9DEABAD457C367EEEBDF8755C7B4959E313E82AA1BEB816073314BD33C3DA F8E3949594CA64BA168A225C96D86DFB45A9562FDF9006D7D14B982B95902E2F FF4CD3CF4B6AC6F7198123C869400249B6253B9306EBDA5F1376E945EA0144DA 4E2EB4BA04C9A62F89CE99F1B14AAD27434D88B33574378E22B65B55B2AFCABD C6E60E32114FE3006805CE8E5D6D203C18E8BA0B03C4840CF86B49C11C290AA5 3C5CFBB7EB4F55A3FD3F48BD862D23BA76B54E5866EAD1757EAAADEE7460A67A 4D86AC35DB8FE155D8224B819F6F4954BCCB6E9218FAEF2749291AF844710A6C 146FBC4424B1D08E19ACDFDDCC450114A57E13A880C4EABD95FDEF72A3EF69C3 C3561A337322FEF30FFE8119DEC30B68D609B7F7D34EC2D5B97F5782D7508E29 FAD4199B416E4FEA4B03DA0419D23BC761F51ECD5EED35120B69630946DDB1A4 FF534D04BD7FBFDAD9CBC6EB50CA5A1ED575CD42262C6D41A54FDD8B4D8E8971 6287DA5C9E92A5AF19490C94EC497DF2855F7C2A8D5511C6A79AA29B85F637FC AE7E4955B3AD5A7E09911ED284C46F008F7C92ED809F097918BE8F71CFB9D4DE 035DD4DDCCD61BB5A4745088A2B836B8F36E9B82C7CD18EAFC56CEB037F6DCFA 45316D6B308FBF502BAFC58DEA911CA8A963C3E4B8BB9D0526927E3B51A89897 CCBEBADA9823A824A440E67B7DBFA644C9BBE3042280FB2AD6DB14861CE514CD 625AC00808E8A06F03A49D47EE87CD730BE0C49BA4E3C5ED39DD00EB71B5DCBA 5F1EF54CB3711C600EC58B395C9BABADD6C8ABF48BD023E64BB59033F183267B C96277B5E70FD0135019DA3041E8D13B845109ECBEE3B91A807FBDF468FA87FF 4949CB0C025EF836CE47B5AAE41702B5D989E80786E9527C01321C09D90C3D4D 83506B28BB0DDC10A1D8B24DCE5339ED5AF2AA63DB96F8420D52C0574DA4AFA2 87754EF724624436CF0FD6DA279D405DE2EC1ED7C42F24D64BBAA7F2ECCD3290 685FA1168E76929CCCB2ABDDC15EA0AA8750A3B6313134821BE3C89448DADC08 71FF849917FB7CCCC73AB92B36B6E7D7AF950CF60C70EAA86DC0762744DDF181 0B767910F1684138C3B5BB0AC3774E528874F6CF5F92C74DC5331CAB1AA4AD57 53EC8D0983C07FA0F44F61AE472E9FEAD1F527B0BA38CB5C3A8A59D0D0ED102B 6786F717F9F25C48788939CFF4CE267C163D435742A2253AD2D905D2B777C148 02EC29897CA0B77BD07B5FE870D7F8DBB766CB7F1C98BC584DC74121708CE9F2 B898D5C0A068CF4B96ADF99FF92CB1A8CD2A13D3A9EDFC708F1A665C12D78A21 36D3976192AE2C5852313BE98EFE5B2E286CB4EB07D17BD23D3E2834A1FC301A 7599F776F37475D3D5144AD9017113C896981E93FC103EFCF04693340EA09364 58E557EF1795126B3E858222665A7E540733323E1605CC4788E1094AFCE864FE AA08B33FF219E1E596E9B7421D42F7658D413802F0E9D36AE099D5378F913D84 BD54EA099BFDA16116D410C1F9BB85D02A9B8CF6354CC9EB3670577E62E508E4 1EB85B1BA3593632AF48B63CE2909FF90F4FC726A63F6AAD26E8D89C6D0D99FB BD20134D1EE54A87D7D86760866F916FF28FAF78ED1AEC8350484C3CFB3F1599 CDD56528DA5788446949958EBA1B03EAC4ABED1AEFACDA5F70DFBC3E0FC77F59 393D1220A83E08482F21C130C959D9F55E045AEE34BC56B364F2539B87DD04A6 05A47347029A443142DC89C07AA24BC2C172424CE4FF8FDF6F9B5E0B84FC9BF6 9D43AE5246A462D86501E78C9B36BC9CDEF8A37C0246F7FCD10B08D26271138F 5FC7B2BAD85C9C5CB1696F3D807E5A8ACC26624EBCF824AA3DFA3C4232E9F988 4F5B903AA76BF8525F8F87F471C4136CE4F9BF8E8157AE99BE101943596CEEC7 B520AD28F848D6A8EDF2A1B2917120A0CA4D224A4879CC1372B995714B55AD43 0FD031A1BB40C0EC894655F6317E9CD3A9B8E9551D04AE8B51F570143D153521 232B0BCC7255BC858550B227BCEC0F89DB82ADC3E09B68CB30EE6E958DE2071C 31B3A52B3D092A4B512E27ACA49D7DD3D67E1BD6022DB894764FC3C03288E775 771B1B4FE7B1775DA7324E81B3F62C8799FA2713EF4817F7AB14CC7F345B8E1D EF7618993EF7F80C7D0C0DD217D3F6018C801B1018FD4D0E28CCA3C622D3126F 1C58E7A3D58A5A90AB264D34A22DA49F044A52AC384B4F9565B73EB8381ECC76 26CDF1ADF941F2130E94FC13A17D64A06DA775FE56E30FF4E42ADDE306F58C5C 75BF400AF43F50F0C61D9F09BF8D02546757FE2FFABD58453FB0CF176275F0D0 E9B35818EF4B0C41EB822944399D7EC08697D510C6FA14CA4B069E1B025F4BE8 EBF5280BF490CC5413E76B6093A640AF53718A8DF65C97DADE96D3ECEAEAC9D6 B51192D7787E4B63964957DD97260340005F8F348FADBD8B8A6C626C2AF9DC02 AA4C95285B681BBA2E030B99CF5C6A429292057F8C8A16383C5F31F0170F3AEE 2909288A4E64B7BB2062A79863040E2183466F6ADE86A354751D91999B8EC08B FC1AD7794654073FCCB7730A0159B1F18DBC262B096582727B6DCF318E9F8124 DA565CA4010109615DD41B7C26ABD38058B2E0026F837DB5C93B4258B9BF4605 AF724F67A35A5D75AE261E5733A8364B248F20D7D5704CC4D9692AE5B2F045E9 CAFAEB42A6CE8B2F660D09A6430148292DA50869EBB8D64B2BF42EDBEFFB703B 4E97BBC4230870F6B140E7EDE03D3706B8B6D42863D174BBCCA56B9AF74A85DB AE22E8BBDF5213A75B57E51E0E147B4C4A0ADDBB9090C00D066A7EFF0F75BF86 1E71544EB9E0345A983045070BC708C82F452D529E924308BFC69D3AC2331E13 A175E59F34B94D4DF8B1188B27509376E0F619523CE0DCB82B5D7551ADC01036 EB66301225C78A3EDCB035E2D617BD5B21110C5B89D1D21A3002FD9D6669E8C8 949C19AAE4B4ABD86CB1E737E9714DA2C30F24AB25A25D97825DF81C9B1E3F06 EA96C02255837784126C12CEA39F56B8460FD07346DD5795AD7601BF623E4F27 98490E88F76790BB92D834F2EDD1108E631158428C87C1291FD1A6750C866D3C 72490B82A75B87E1DE769CC723D078946012E2D247812A66F073B1286A798824 04C43955BE3CEAB2D44C3CFC2E979703723FBC89D51E55B42B0EBAE8097A46A9 84E1E9DDDAB4941A0A9618C8605EBD5AA71EA8B7B0E76C6CF58166F461F91559 D561E353128AF639194F72088F3BC34FAD742BA19A0CA9A8FC4205F22F42AB69 820AF657FFB14F5E17133EC8A6EAE3C01F00F4F7D7EB18FBBCC88273B0DF4193 B82881D2B295DEE98EC72C29757775E22DBA9606DC4D8D5AA77A6936971DB657 4C1A062665FDE458742D0664854814C57BF9CF287CE98621A6DF47A03542363C 27DE1990F242BDF604DA46AD82A6D287553B88A2E857C06655E47CBA82191E1B 3AC56F7B6682A7629ACBB565E6E95B6015AA54EB2E93717AFBFCBE12FECA1F1E 2C0C83C8083A95351B88B8DD1C088DE1F020560437178B472E621093E08386D7 A6B6848096F48FC3C06DD560596C5579A96DDB645672E6D55483228A3EA20B61 B94322233B1F644E5C560E9B50ED02B5F52D6029C7FDAE1C7537FA5AD111D60D 85ADF88C2887485635D32D4522117C6A000FC12D2AC9F1F98E5B8376528B1FEA 472146ACD9FC9E6DD01F34B6E77B7711060E2CC989DB85288D193C556C2E2D6C EFFD2301F0BC6E181C0AB49B555B008E5465F3056885E510E9706D5AD9FE944D A7BB44C4C495C5E8ECA8870AA34ACCBA7BEEDE5968DD3D18A729E5B572622BAA 3F73E9A45FF44643A892DBA32F6AF370D68C21AB50735CE1BDFDAA225CE999DB DC7A9411B687CEE1CAF9E44D362DFF500C70E75E2DB2F70169D713CB3FD3937A 4FCC203E22B737414B0C7DB353A1F77CE4BCDD129457F712C70424DB6607B8F7 06A9DDE5D6612F78539D9A519A39465336A35DAD5915915D0DF74457EFF75552 145CA2ED6C7776428EC5CD9CDCF56CD63881B93CD8C1BC5E29B8BE0F29042EC0 82D49ACADC9338E17A56B332C04BE862E58EFB86F0F2991168E2A600FEFBA07D 1C6C9128A48E57E3F8E3E52B1C734BE37E3F14BF44FEA10224A242619CD4FF5F F6438D4EF139E252A1D3B9F6E435CC134F9D702F7D40F4331624DB535C27658C 1508AC614B99D8C6901E78CDE6699B94C90F7A75BDF7DF4E74ECC86A38EE794F F3D7FACCA5551018CC732F8A81F7934370EB761BD429CED61F66E425F3B6F465 ED4B9C848DCDD078A774B9132DC539948A74FE224C7F92C8B19AC348A61CD4CF E44E8E075D02901FF55CFE2E3C5A2024942C71A9BF4CEBCAE74CA3B47BB16E9B 3CE383B26BA2BA93856C96DCCD66F9BA8E849060AEF2449EA5720FCE18EC2570 ED6CC349D537EC2AB62AAC939E792A6DAA151B4045DE5F804E5A9EF0317DC8A5 2A312F75250562669258F4FD7210CEB6ADA9A4E6E68327935DFDD9639CC6F515 88316FB7CBAC54C6C4E7F41FCE9A3D528DB609FFEF8A0A571F22A1EFA63C4D2D 9E0E3EB4CA6DABFB427383BAE827AA7303FD881AAA5FEFF3D867875FAE2D4766 AD1BEA49DA8F04E0C5034227A904516952D4D341DFDB8403BC64F6FD558779D4 C3823F4235F7B573204073F15EC7E7B3DE4BAFD368FF2CECA990497D7CFB452B 3BBEA203967349771561891D12EABCB4FA3E3845C5F3AB679EA7195F8E209A94 A792C912EF23E7BE72C8F115535AE0C02D997222E85832BF8C174978A6B990ED C9E600C942479BC7A7AAC8129F59A58C6013114E4F1301157E2C018B38F1F4A4 7902E83853C8023EF38BD129E47D66044C5394286D7F54F7A7BD9EF39FB38DFA 14C9CA0FD2382A1ABB019F82765C15E2A108C3E3F67F9E1ECCB9E9EB7861DE1B 2C1C24D906DE7E096C77A1D3B8E2DEF75F0A3AA5529DC131FAE1FF825BF7D3FB 925CD893EA6D118D3B03B241A5DD094E11C9445D610A5876DD24882E21385F9F B22C9BA1B5B909196E39D1C38BD3360C2CA00F5ABA937FECEF55BBC513DBDE00 989EC1BB9CFFFDC0A296F42A3361FFC276A92725548185241667ED33A6E3BEDF 09E4327E35504C5337BD01624C348DA0405638B90CCFD25A909321FBF06AB0A8 1B6E30DA62B2356C01567762ACBE54427891D401F0F4159B06A236F55C6A7AB1 793BEDC8F1265E3C8FF4F45D971A354FDFED1AD911B444D88A8FF96FE40C2333 33FB9ED7AB48C727A87DB0F2F9E0944EFA8CF0A9962D95553AEF6576A6DC1E3A A6AB30A05F2A34B9CA4271E4875841E23838B59461008980DF727BE01A5AD854 98231BF9A50123960DB97EB9A755AA856E6382FBD7665CFE89B06A4246AC8EA6 97F65D89F7069C7A238E73958DC205D2C1BF6976901625AD3CEA54AFA6D5ADE8 307799B0711E28698C3DA90F263A4F7517E0D39806FC53EA9FA3C0031DB0A7C7 9E89BB2727E73205A9206A510302970F317FA44475E5D130A5928F3123851C58 70F13E2764F7680AE8C45201A176BE9EB87F094A281644BFEFF7FBE36AA8982E 3A66D9524C96465B1A547FE2A2D005403588258512A494BD1A02516BC390EF96 99DD06AA21F66A2988095F2EEA179FAB8FB565CC39DE5FCB332AD073B53FD1A9 C54E1844363C27DE1FDA5CB9E57242C38862F566814F8991763F8994B987071C F1503830766D8CF46BCECD1207B4907C2E4049D41D5063548C2669308D22346E 39C829E70015A8980A6501420610DA9022F99D5560578A2F61739EE780B6841D DE2A7526EB86B22CB65F84CE6493730D93589085B8BA13ECCE8EBF49B71E15EF 33AB3F84F6064F6167D707CA3CE53A5CBBBF766D28D1E805535100A33E67EBF4 043C12FD78949BD865DF2110706FC94AEC922638A5976F8FAA839A7B4D8A5523 4834894C44BD8504D2081F8FAA07C2B783A011B02268D3214072B80E1ACD4EB2 FAD9686182E0D0D5138245A32B1058EE3C29FB04977CEDFFFF5CBA8E116CEC6A 5931762ECF8DED72AEBAA0BDA3694F4D3EF3A4EC620800F1F90BAB90ADCED4B8 6EA4B7EEC64DEC90ACE3D28B1E17EB7FB37B0E4B83978ED1F426C8767B03AE48 68014127B771DE835F6C0F5B5948A333A5C3CF7DF7483AF93BA422094FCDB3B6 6950F06735DC79B1FB28A62B16CC435004ADB1FD35EF569EA27B2CCD58D8FBE5 078D0379DE42EDAAB49121F914B9E22A32D194F80CD1F93B0E2840168EA0EBD6 2EF286C12DBFF843D46DCCB7FCBF4AC94060EFAC1B7DE06797A495964B1318F9 270A0A6A4B0FCA2E98B98C24FBC5375C72971A9AA79E9AE8AC730A28A5396AD3 D32D24E85BE4BBA69062A9AB77CE8BC65853C1A9BB3E128E7836E20A4DCD304C BCF0436915307BA3B00A3465CAC89A855CEEFD4A618E3973E267D72ED0076228 CCAC555884A6E63ACC2AADC22DF4BD48A2AA05E4C31834E130E4EFAFBE736ABF 40912D9E6155D61E407E8C6C65BF042D16CDE001BBA5B43B0BD6D80BD14EE62F 7E52BCDF8C0D02BBFB1E180B6273C57131041D853B5DE40D8EC3C44EF3311FA1 9C1DA9B2E3411FF5F4B73E4CA56B1388F3C59CE8493EB0A5F04B82F5602DA1AC BFB54CFE959CAC7DAF2406F5DBEA72F78206D6425E9CAD979440A641D725F498 8F782F842753B5D32353EA129398F07E69C78CB6B4BB61EC943AC1B0FFAF0E47 A38D7DC081CF38335EA682E4611B5260EED85D8B43DEF6311F5830D7ED9FAECD 180F5044863B7FF43AF993FF8320BA3B21732C6665E8C86D7B88CD7C1896B6D8 26150B940E1E7F4D71FD38B3107E4A06BE9201EA6F3E64A04DDECECDCD35382C 12CA307E37333997A5361306E571CF878BCF473530BB8A44AC08B22F79998AEA 9638AB2ACEE79651FB718CFF848A5BBA9B123A1E3E9B2DBDD3FE7C741C05291D 02F79A7ED7630849571AF40AE4A65560857074ED127ABB8A0935F3498082BA48 73EAB03DAE204103FF55850B5B46D699012EE96B72755FCAFDF688E5EB2D4A96 CAFD2CA3CDA14355A91FB8FDB6F36049E3DEAE4A2F8520293672F5E023710CFB 86DAC56CACEB32DD450146201544583F1DE38E0B02590FCB0ACD9380F8ABAE69 12E4D68935DD5EB9AD8B0052F0C019E3DBCE90D6C3990696E65F64FE3EAF5E60 0B6CA23A173A5A13E696D41297AFB67FADB7E83569E0192B60FA10A3F6E0D5B3 4D700EFA259E906A54F4296A5FA12EB46A374A90771E11147F4633C755E5C48D A2ADAEEEC1B0DC8FFCB047EB5361D7AEB2D50A87C6B03C73DF481A939B40FFAB 674B5BBA724012869E2C52C1436DB527C29DBC518F47F39B1DE3AB2C9FD94E5D DB2D3F0C06806998DC4B54F875AEE96E64DA13EADE3C2A8871B90C1A49001DAC 2884C2169BED18AF00936B85EB861A0B823DE64E27AC5F74CD187C44E7DC9EFE 75EDFE9C60466071A41085DA33D967B958941622D5E1BA219679C390696466B2 965E4F9236C08B4ADA07137450C81B72AF9B29295B03839892420D4AFE4B9461 C1C90A9C11EBA00AC40687D84613740526AE6A716A3EF850CB378382FDECC600 6374D69559573A4855C6400A4B385219C1D8A3CDE9BB0F00A332F56629914657 E5861BB5A2B89C7201A167E357A8769447A7E7B2B5A71FD11F58F7792782ADCF 3A3BA369A1BA956E953D031266141FBF7D035632EA2565B234891D0A1E912BCD 3A1AA06498678A739BF55A675982327DB0B347B27CD342F545C2BDB42A86B980 9DE95191C0641554356386D2B35ED1AC702856D43ECC6E6F397C78541250DE10 8F60BB1A02B1F9307B36901A59BCCD9D7E4C43F5EFC946A1A3111005821D1621 9C8329C75E4C3904ADB21E5EBA3AFF6DF2864EE9B22105E5420542ABEF53B38B A26BCC9149DD14375E372D52ABCCF16A1133CAF9E6364B776507136D00A7EB4D 608C005DDBFEBAC6AFA8C772443776A4F45DAB29785949645CF1748D10AFB3FB 3D07529EC067BC51180FCAFD0066C1033D07B97E38A688616254057352EBECED BBA0191DE63B6D47AF2BD8CA13137639ED67A4B87865AC37E619059D2F147F68 1DD850B7342A2865AC52C4E2182CE52B8FED1E8438C9C3324DC785624A622145 24FD26BC47DFADA9B555C8D979FB9D1CACBB0EA3B2A69E7A8A80ADEB40ACE057 C9E6525479ACF9AE1F2C7DDBD76D84B7455B446FD1B0BF9B3BC83D8B7A042FFB 50ACA64CCB6C3CC9175CB878A90DF6727CBF20B295A8BEE55FC87B268A4BF533 36C7BBAC687CBF671416B409D7E1B5BBD3EE117C7DB77058ADD0DC95A56B3056 6DA251AA8E600D4011A2B196C340EC7DEC43A393C6C4F221F862418FF17AA4CE 8D11FD018928D8CDF7125AC91BBB5EA1E89B1705432F6672D4759624863AA9C1 49AE2AA65F793F44BDD18DBE266E783F64A34925DC5D6649313828EBEE074826 FC151AA2A9FCF927BDA8B88D3F1F95CF5790C38C73B2EE94A6C750D06E6B6BDA F8B55BFAD9B7673CE2C071DA8AA117D529E12B75BFEEC3BEC098B02709A279E8 93CD24DA39B16FFB7B5A38E316E20395ACA3005B4E2A06E91FFC567C59143E11 A175773EF23EA7982C5E16FDCD15A42D9D3EA4D3ECA58925C4CD6BE40FAA90D3 08001F800B6BDF57A2459002C8535596A2D8ACE51CD3B8CE09FD26472A7D842D EC4E653D2F17C5F34EBEFFB4F37195F163F1F576FA188B2C71E3AA30AAB7E2CC 32C6A1F20C5FB4D44B252FFEA34B89C4248F7FE4AB87AD7A751FE4298ACFAB38 2AA68ACD6DED2A24B480D148796A113F25EC31A98C8947EFA95A6256C4C49A32 2FF3610E39C3F84D20F88918B011A11D0BAC37CF07ECDE325210450F0178A8D8 5A5EBB9FE09409E8688EAAB559FC1C07B8EDFACA948178EAC1C6086CB414447E D2519BAE516AE68B26BA6473BE949939ECBFE17E175D82A5F03A853E5662EE83 1EA7DD3814030F6557EC442419E82F9AB6831D22168B5D84F3B91C4F4C78E4D3 B3C00063A4FC6CF9562D02744F624136C5A2F7A5B39BB3B94FF28E3859DF80AA BF4D76230B95790D6FA9F40FA646F8F07C1289C2786BE87D6B4CDD8EAFE34E34 7821FF3967391958B19DA543F6D983F235D327B942392B776E6600469C714B0B 1BD54BE06B04A3507D8D75B207B58D4D070595BDE60D0271A269C243955A4E47 6382775FAC30E7CE0ACD8EA5E5812319CD1B029F4B9EB2706A2403091B57EAA4 683B2CB55FE9E4320D2773BC404412DBF03B82648D0A95CD13DBFE2CC6BB8A6F CA1DF7B4CBC459235CBE71CF0E11D2DF5BD2B8ED835E79D735B6C2C1DBA8407F A26D26EFFB6A658846524AC2FCBF854D2D08A5D611B5FD4BF4B0D6F4C9473F4F 5C377F2474A817D1522EE00E05B4BEB43A8F0141DAE8CB7D7B6255B5132A3A66 C9F85D79F583D1C24A695B6D408D8314BA2A485DA3B898BA083B13FA224686D6 4BAEE88554BC0A7012DA7339FE3A041CA46ABFB8E2E1DEC0685CC271D389E926 DD806F4AC57ACA0A06F7DE6691BB70F501E54AD10E82C978B1C252278C4E3EC8 132E4FEA77DD0F50D428B4887F9E7AEB344C6B4C3A90B9900E537735132268FB A69F08AACB74DF8C1E504D660425612AF5F57AFFFB7E27DEE881660012CB6E21 C10BA8ED6487097E7E782136370490FB0A0C0DE717119A34C6B57097CFC53EEF 0701A4D4A36B844173FFE772C42BB64AAB79A9E1270102263574A0A95BF3460F C3577592BE6F860C5C54EDF4E965F349A61617C639735B95B19DDACE08738B02 9635749BEA711D3FBC9DD3D53509D60F3AE89DFBFF81ACBC3642B533ABD197CC D58CC1AD18196D99D25E13B14B644FFDB6E2C11F8535BBFE8FA055FEF35F5863 056129816E42587362FCFB1BAC9CF5159196FA04B78314A9D34CFD21A7A3D4F8 C4CD83BD80608A210524A02FCD669B2CCA17A2E9CB9AEDE7ADFD2FAD9587F894 B39E0974865E1C53105DBA6669994BEFB5441435C7D411F0425AC1EF29ECAB5C 4106AE63AC793225239F6D5B0E41EE4308192935B31BEF41B0404ADFA5ABB0D8 F68613ACCEF7019DB390DFFE93CA1460B62FF167BE8CE89C2F4AF33979EDD39D 385D4986C30DA6B2D2868D28A22201845B28E1A809619EA37478435635476267 66E30D0CF0016B29B1E0DBD29BAFAFBE2C87F735801CA22347E3435749B9685F 3D6A6229FFE509F1BD1214F3CC720B7FC396FFCD6C942A93C5C9CC62774CE99C DDEAA351DA814BDA045FFBB0029613E321977F9CC5D849C2CEBCCF6286E50F6F 80F4C091E07C6738A656917CBC5C20A97C0CE44C514D82E88D001FAA804BE16E 8C3C335CAAA2B1C481CD48F3C033A33DCA0552C8C19E3CA08E215DECBF9CE118 0C18B2C14EF128796C5880CE466167FEE95526542EB0D11602155B3F76B6A7CE 175C02214CEA613E4DDF70B640756624D1BC133572120A5F00C6387D8C31B43A C982C18B3EDA4C30CD8F8CB7456EAA7B1B3A6EE182D0AFB225EDAFECD8B27B79 9EB9BBA4B742920EC05B9539655705C342299725B6A565FD0AF5639973E78B39 60EF61825F1F686E15666BC75E11C421ABB20135E14031A2DB2D3C039DD62BDE 963D41FC744147EF2B8A1E556E765316BBBAA79538B92961EDE13232A0BE7FC6 2DD06BB660C762B852C15A364A0DE631F2331B9E0CAE3744F37E0343E7E8FF79 747316CFC4E70CA9073475C696EE1E10593C9E47C47F8A736CEFFF129278F56E C3AC99C245E6CE207CF2910245FA0691A9D84061C416ED104C9B711005C90E80 31D0C31AF0C58077408EED541AFF2B9E809CD705744EE5C7E35FFB4D544B9F45 F676FFC866D273855648A363CB3AD22E22CDA416B2601216336777EEB3461E95 F3448B8E6DC7E20C67682352DFB59E536378354365C5C6B62A8AF1B94FACDBE2 1D45D252BA3C2D65CFA89C0AF5032A4E6E45B2732951D9F79620880379244AC0 638A5C6D0A3D30D90B0925E21CEAC4EA726A92667C7BDA6A2E0FBEC5850AB9A1 650ABED17C947374E71FF6B7A9436795AB7BBD8699FD6F115998709E894B92FE 334D68882DE03C94FC6CA9A73DE0890B886081CC7B656E33A1AE83E58C7352A9 EE20840B62B54A37572232EB2F8B4B450AABCE2F3CC172849D50B9C27498C556 1980C2CE057AE59A0EF778FF7EBE74B43305894108C079032729A56B89C397E0 8D867CC53F69F3A870977988A36A98D9C3156C2E1E8CAB89F713393467B00242 6E4AD894AA9CCB5F100FE6587A98A08906208367B93EF2EDBE3F30CEEECA075A 2495885F1B3A89BF387B716BE164AFEBF694392796CB7FD591585D504A325270 EB4671735C13602F56AA2F62ADB25A67CA7B584D9C75F397B8088B0F46462AE0 BA45F4F6DA1F938B623D366CD591E436C5C7C49CA960FE903BF318DE28B063E3 15ED7B7791080E7BC4A1D0228C73083586BA6A5FD4517CCC26CBF99E75CD6510 90F95F0F76846D19FFCAF6200CBAF0C764D61365AFCF27775C142071706243E7 3DF86D8C91A83B81E9D449549994E1FE99B5CE57CE907C11BB2F031EABE62CFC 1620C58D8A5BEDACFFD482E645394CA8298A08DBCBB73BEEF26C1C01B8CED947 75A5C99526E06622024A9A82B0D421BE950855BF0AC56F2D78B1E3D451DFF8E7 7643434C45A0BDEF7F56612A129A68EB8103919E2A1A2AD0413175526CF206FB 73C8581213EB1536D3C274AA0840DC93D21C3239F9F831DBCD5D133B857B9848 42D9143AF53BFFD05946B488C565D525B79256F42811E28B6C81ECA429DD7695 D824CAF409CD648A8A2F969A4CE76368E743E9F030440A2851E8AC19FD47BA0B 0F5BBEF5835A4298E028872757FBC4734157440A053CE65BDB324D4FA7B3FB97 DBBC60D78EFD7136C4466AC12B2ED4C1A3D27551DBE6E256CA3710FE02DACDD7 FF824ADAE7C942683F865D1684F14D55FB7A025EDBAC1A2E0E089BBE8791D1F6 D9646C44CCD036255E3E311FDB94EF451D6428121AE9BF30AF4605D606695C9D 5ACB0CD8D5947B43909B61624EF5E88647356480932D88966525EE25D1433614 2788C5AFB1BBA48F1418C0DE65ACAEDF2CAF528A71103731270769A27814E887 E57AF1B05D39D64D2EC9A5A7D0EFCF7960013616FC2450D78485145C31D45303 9C4CFF836A67367031329BA529D9AF9DE2232C57378A4A88A3EDFE53181B5A9A 4A43C9DC03A7DFE1DE4F19A12977807B95EEBC818E23023F65E100EFC56BB255 A7D4BEA50314301A1013A01B116026AA5EDFD61CD602D57BE3501A93064E9E82 1CAC4EA235EF80DBFD2DA7DD1B0909E7263EA1583EA3647C5FED785D2968EEB4 3F431F729354C3A605306E3F326A85DAF5008C76736F49AA461A1E8F0357818F 9292E48894A5C3A3C7275A489707875D49A75892303CC3AF4FFF5804C75160E0 3890F6CBF67B5E3E4ED12466F596056702EC23102EC2EBECCDFA0C8092783417 5C9737A0541A9DEDBA10685D4B790D2A732A3373DBEC6FE3A78E3DE9C1C278B0 A51D236F150EC97E8DB3C45514CABFFFDAAAD51BE5629E166D9E5FFABF7B07B2 89FBE5C204998C004D095C32FEE5DFF810EBA7AECA567115A25B860CDEA52AB0 42C68AA53970B2B26773CF5551E9D52FD4347D4515C83A59C55ADFE1013FB91E 35C0D63B85B8414863918B61BA4E3A4F428D3169AA779BE90085F0817A71150A 5DF10EBA2F0856ADEAFCADDA4CCA1747334DA47232479A35F3ED49AF7083A064 1641B8B7B5192B1C4DCB7350B4341997AFF9F05B362A0537775DC96404422C22 EC0C0A95F54B15B1729865263566D3F815DECDA0BE8F29BBD96093F94D03A66A 79855671EA89A3B49966D7B10D8841CEF4B73856E23F4E4F7F3E6801F983DC5C F3855D7925DB079E7563284CB20621BA95FA691C0C0B5CCA8DF60AB1C30A7CA1 B9AE12F28CE0B2F3F78A193CE57DBB5A873AC7554EC376A9C41DF027C275B918 E76D1768CAC383C2C6A4BDBAD03B31DB9447115B8356EDE72C030D69FDFC05E1 8A757B08613700A0AA958BFA74D980B7358E434B65C76AD435DE91AA009AD615 7CB4DCB63FF5505AC39CC366D89E07D9084394B5A7EBCDCC176433F7906B8881 EA00CFBD5E778557ECCE017441F832EB05F63774FF20109F712D198B8A29CAF6 15C1032B3A111418D332BF1EDBA4485607D74DA2EBC582C5C5639FB8959B98BE C2836EC09D29C27EFC12DCE53CB7569C2354F2CEE0DB971B39FE7129E5E95BD5 75348B274F66DCC8593908922F9243FDC27871B3CCA4A6A24E501EAECBC07C9E 894BCB14B854891DA54C07803AED94DCC03CAB577BA7061D40AD2B6E63738030 3A89088A5059CDC0D56853CB0BAF878B3BA1F317EEBB0D606D8F35B10A32A290 137FEBDBA2524E8691E6E181345AE69190542793A59936514C3AE19CE82A1918 B30EA803C5626F9DA6C0C534A792038FCD85A09A29D9218664870237CD50283F FD011682F1D3467720C3FC7139DCD6BE93C12B9B533BC21FEDC63706060C1501 7D32F7DDADE5C9B62AC519B97324958D7535441A0E3D9562CCC3F6DC68D3F719 1DDB125BC6216D4ACD38E87FE55CF4C3D90FCAD896A2A3126BA303283372CC7F 4CA62BA586C49EC6B514BE67F2CF56430CDF1FC7170F363A26FCE96B0AB6E6F3 53732980B60320C3953A5D93B433671ED607B3DABDA6451556DE8CFF6002A89D 3F221EEA3541C032DAC4C80FBD483476B944F0544A7E15037A81482FEA373486 817954A5CE4A1D6CCB13E4D489C485199DD1B4DDC7EFBAAE92707DC55A8193FE 82B7EB27A507D4A45002B3D374ABF0BD552F4998D9C235BD9E567B905C04173C 099BA0AF26F90143AA41363FC5AF83F6921AAAC0CC96747D47BDDDB304E286EB 6F0D59A84BCAC831E5268BFA2298176380EF2472B42CFC65CA0B5048F86C5DB4 77610A4D275A3BFE5574EFF95FA5D6D153B66D5327988FC655E9F537FF4D4CDB 16F4245F940F8AF48AB066C6EFADB60E693470B232B733928E735F6BB39C02BA F7013E615980091EBE4E6DE10484ED8A9E4F21445222AA4F45E562B2869FA879 5C068C0560CD23921F41E2C220258E7C03CD7349EA9DA8101829071640DB65F4 3C61F840FEBA8DB640DAB05F8E1887C3EA50FE50E842E137E491C1347C99E1DC 30A042EA4C2A04B87908178B06EE755D4E587E89B3925DDA4C30CD8F9C8B634B 121563ABB22E0839E61767E5A517905ECBBB17EC210692B8D8F94940E1565391 487C47396CAC9AC5B3C37AFE6FD9D44A2571430A34396B109BF55BE10B02D9CB 708162E3CBC166912657DBA0AB2097E25E4734EF050CFEAF4624564B3B4EC5F8 146F22F88C55C3A2A985F9B20FBDE71E07E3B6C12EC05AEAE6971ACAE1EE6EC7 9A1DAAF301AB9D65742041CC850C9FCF40EDE86E1ABA17875CDDD90A1FCFF66B C81E6765CED9BC2E2C73CC993FD246EFFDE5FCE327C6DC6691224A508FEF907F 68856B84D20A29A6305BE08CB76DE17D443FBEB62459A2872F781254C60468B9 34CE23EDFDA9A010AB753A56B9C16B0B88E2DE9B421B661B2DAA7C011C10B41A 3EFE9946145E173FC56480C6C66CB137DCC903A6599483BDB42AFBE7A1490860 A147E4CA471A7EF1593440D68983D8F7292CDCDBC8C33C226B7EF84EB5956394 0F35FF9022BC6A3E43F83990722670063615DEBFDF84A37E941E377B3A5BE121 FF18E347D4BD09C3A7095F5BDC0D88CED702282AB3E68BAC4A44937FA4FB4EE3 68A416978F75A83AEBA759BA6997EB8232DCE6D850B3552AC91F4EC7788B7F36 F83A578147F0193A4D65FD5117ECCE6D8F0A6F4E7E56815B5D1C79E10C134372 50B3520145130ED97DA031BC94EE5F3F341B6CC296F2D219A3978742F3CD2B77 907253DFF72296F03A2A5B52AF2732D04BB61AC95AD61D90DEFBBB560664DE35 C814302A4D6BC2F91044FE769A87C3B6C6E01EA261A7C390A2114CA918ABB22A 1C6CD602D7238A4BA703389EDAE41A21350EAC32542095322923D53A2BF47762 4EC197B1415422EC27E3B81F67E5AA20B6C0CBEECA962F97349C45A1CFB58E7C 520BAA9132E18A185617FF802D2CA682CEDFEE6C820F1561AA12269812B6F54B 154418E9FE192F211F9D3AE1F2CAA17106EB30DA1BA00E25A6C89C68F43BA148 947C23CB50DF1BD8462EBE92DA80EC4973C05E9DBF17FAAF98A667408398D8C7 234AC3B1A1984406218CF20FF0FDAEBE741D8D612A56CD3699BF221FCDA6A26C 49F1A80138C450B46D1F8F778FBFF5BF8BA46520F522D5C2D8B030CF984D0B5A 65C9429095CF58F0506C4DD9BA787D8932BCA72308D07284F905C3FBBEF0E0FF F7A53A761F72FD3702D145790D0D20DD2E0B0588CB86DECC4503808B9F69274A 987097F43206FE63C14382A1C3E2243D41C60ECC5C661DB764397E92721B5C92 6CB2BEA599DABA33C9C1595963DEB61B144C687DAA11DBE6EA8E8EC1A3E6B74B 4F2751FE59F01A1FC4C794BA21883497D309611F36EDFC1FD1CBAA36E9205B2B D9378DDFC24A14610F7B128ACF2E301A47C26DA055B3AA993243985EF5FF4915 41B4375D68A0702815DD57C707FB9DDA86E91AC5B5157458F0E483A1E3B1DCBF 8A48BE8C3D76A8D989DA6E8D3756A5E76A620D4A48B127D7FB79437791ECF831 12E862AC2D630ABBAFB0AC4F9AD1F139DE184F1A45B42EA25B8EED3378B693D5 E0A357E65934C33FF49D022AA1BF43CA30F5EA9BB6B06E2FB869FA6EE78D1BBF FD57F77372B31BD6C650E975D79228917C8C7EA7F0CFAC2A1061C17DF3A31C99 4E0192594E0B88086AA34F4E7C59812A0169799208229E0489599A34451BA51A 5C3018DF422104597675142A91B5D85850D9BAD16193A88783E757D4FAA8A4FC 598E6BC22FE6FDA7CA174DD9B7C2DFB878DB18D9E1682D2AA261CECFE9D3F48B 47019C38E6F809EB5530F9867ADA2E6EB4054E1E0F5F8C48AE9C0BA8C9E7CABB 66A2E0690D69E9189DD3DAB29425924D6B5D219805EF3CAF2AE589BAD148F85F A1C41B7CF5F364F692E269D6FCE9F01CFA4C371108DC3ADFC701C8DE58416B6B 6AECFB3673D24F43B3F06CA3EE62A6E07F39FF8D39F020142832A1A94C163E7B 764BADCB1F08388C7CFABA55EBBA9209555ED42401C64B2F508C2B1D80E65FA9 4FA68326D7E55318565A71FC92D0181C605E541BF9DBFFAF7D5C299E2A18B778 14B3C95844A24D3757AC667FBF35FD64166A36A01EB5642E7674D5B7BBEE82ED 82545547719566A9AD9F67C1B2185A67F4C2AEB852E324D1D8AAEDED0C3159A8 7E4ABAD918A3D9D9618E6B33534046B8B960919049A8D0DCF35FB47C6D9BDE66 F9FD5D07C2B720CA7FAFD12BDF129AE1E6540801A8EDC4D08F6D302C70C46012 3D4492C0F40D0767770ADD82923C4F6A8FDB3521307A2B31323D3C7ABC322DC7 1C900127864EA930208DE660CFD90220251F087201B8C65CBFBDCCD4D0DE2E6F 370647E073B4CC22B6AC821BC35E3944B1C7E13DBCD94607AA5AA5A34311014A 2E3F3EC262D811E70DED8BC27029EC08B5AC1872032EF108A5D5BD9FE7BA71E1 66B6EDFDAC4637595CBE6855B1DD37761E9B44D09AAFA060E6139EB13DD9328F 366843C73814D170A48ADE0DCEBA800BFDFB30650A3F90BE3AD6B435F4ECD330 3CD63F39E8584252684D8F458DF1F352F9891753DD2783E37AAC94FD79D9080A C4AD14CCD09C46AD9D94E2AA31D0D2713110EAF88F9FF2B25F8EA786F22ED0C3 768E0062938044BCE44F6CE9479C6263651649FB40C0A3F28C2F76BD7DB3AC86 FCFFA1663D00F5C5FE8AD5E1083C1860346BB4C6B7E05E4F1F3318D42054C93F 90E171E54108EEFE7AD182F068D4D1DA4F4B7BAD4FAD4525683FC4002C9BB38F 789035E5B8EDAEC137FB6155240C929F7585767C532EE15A9D2645A80D38BC08 4AAB5D329DEB802CBF897ABD31E391C41FAC6A734D48F6D0FFFDDCAFE5E6FAAE D050EE487D8A88AAF7608BABFDAFA7C06F94877F4A8C4706C2125CF72756A180 4D0CB724CA21207C5035D499557D50BB6FCD880C909C623D1FDE8EDA2C41621B 41051FF1DBF57B1E679546708AF90E2571D4D6FF5443C10F6B6DCEEBD3B9AA99 E233F5868B3BBEC9108C73C74B7F5B86B7788DED893626BAC38A8C86787E3979 88C6F01DBBAA9D6FB5FCCFBE2D2F127D74F54E35D25923A3982C01A821D33A6F E349D91A4C7DAA65DDEB628A7180057A13B6CF8BDB3512861A8039D2C6EF4395 0A7B23ACB0C8DA7C 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMTI9 %!PS-AdobeFont-1.1: CMTI9 1.0 %%CreationDate: 1991 Aug 18 21:08:07 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTI9) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMTI9 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 11 /ff put dup 12 /fi put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 48 /zero put dup 50 /two put dup 51 /three put dup 59 /semicolon put dup 67 /C put dup 76 /L put dup 80 /P put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put readonly def /FontBBox{-35 -250 1148 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 9E3948FFB3DF7BFF10C9BDA4EFE5F68A8CB1526990D1357AE6D2F7C2D2EF8496 4E47B39E6712EB8908A3265E5FAB40567E866C244814449F1E993AAB422C3F1D DFA8C7118584F2E5197FD4BFA3A8AE9E953C6CD4672C0FF51E41C3A919749C1A F06650DF4C5E17492164BDBCDF22609A74BFA7F69960A64B9F949FFC2A807458 8579366C4F41BDE1FDFBCC4845FA19BBB6963D65EE8532549274BAEBDFF24FA6 03235D1BE37C06B1938AF369DA75BF38DDBC87A1FF445EAA16E1895ABE9506B9 211955753E447865D33CEF007391D2666A046277A30A49804FFCED3FEA5EB2C3 E52EE14A9F75241EA10C91974CDA6236EB840FD44D6DDE4D9B3266C3B99BD38B D835BCA8CB819C073480FB972CC028D218F6A1D344CE1B63F4FBF2C826F412E1 6E0B05A26125865A14FD7B7030B478BB8BC6BC395335C3BA940E1C348267F4F9 0AF97BBEE253511940F1048E175D3569F7D05A28851B6F50765FEB6C9654FEDC 1BF52F535DB5BB90C1BD5D2EBF75E0AEBE82B20507F3C28A03746781018D4EB2 298E4F2C27ACF73FA73EBE43F014BB575AAD516C0407B29E1653375135ECB74D C91372F06FA8EF37C31AF3FA48AE65318EAA6C34830A5377ABB2DFA5DA53A574 433484BA1466709A4B186761655C8E482833B697673E847C691079E7F1DCB8D6 1AD91101D757B83E2090337D525AEECB028FB3C9F6A6E6AD2F322CFDC5A833E6 1CE4EDBF41FD34FD61630581D222F854A76C2EA9FD72796A7C9CC1F6C2FCCD16 E95CA05826A4ECFADA6A5FB83C41A7131E52BA6585DD6DD78515D8F7327DFC6F 9404F89462449259B5E39445A85944F364031F7291AFF15C9C47D97435A3444D 00E677FACD3F983BE8FC61180545736839281C2A61B8BDAFC6FE3B220FAA6C5E 066BC8D767145922A1C836076742267E741A008184366254DC4EE2D33EFF13A1 00180C7FE3BDDF371490D6CAA59466418A13BCA77E6A80D3BBCBA43C5D535D47 707238EDFBB5EDC03BC1CD8C70FC78895439C5A4DB40606CF39245F28671C65C 23691C87D47DA3A9F022CD939F4C379CF4237C018D8B6112BE9B0F6ADF4EE8AE A28AFFFCA5E2E53D776C0317494D3B9B8F6892F3F1E8D0A6A39BEFFD58024E09 FB8F5ACAAE35C27956880B4310687B36877074D01C890A76DA6DCD490F530F22 6ABE809C97F09C514C2FB4684D824EEB7AD86E8969A4B2E9D26CE78CF119C392 C3E382EE63B0FBA44AE0FA4BC301B29ECA7BB47E349A76F9BE6A7BC697F7B980 BABC15FFE43BFFA4197B8DD1ED0AA2EBBC0B6A0935095D7B6CEA0942342D19B6 F71C1CF0C609A2D08192FECA357478618FF3FCF1C05F913F25E7FC59FB07E8C8 7E64FB76F1345BCC5A93453580758A44D671026F1029B8501DA97820936DD707 9B56631D12D8AC901B07B4A37272004046F11436637572A672A750A1B3F0128D D2C02417EDEF16082DACF11E2803DABF3F38559702F0E595551CC1F48FC9C05C 45527A352EA059E0E21AA9306626F7BB7E39C603861C9149221E4F13027DA716 CE23AAE1777BDF187C8065CB88653B05F223C19202A665085241C59A263152D3 0799DDA22BD9B14027B462D6B925E25AF8E5146578A03C30941FAA44F0084140 7CCEF21ED7677C219CFF4C327DF103EDD0A6B51A41C0B97AB7E931817D0ACC81 C0C809450FBEFC27786A96026525207F6C370EC2A917A03AD416D2297C38285D 24586B4873EA8F87B5DB66D8CDDC4981EEF4736D3D263538D078475FC08D360F AA30FDB49A6E6417139EA9CDE64EC3367306DD4BC2F333D0C0F06C9053A34685 FD270D4AD8BF21360BCB30612FCFA82D03A34F5996ADA26EDC36E8052D6ADD71 D68A6177397C54977CB9C5428E3819F2AAA063ECA536C8FF0A3A5AE834C7ED0E CB0B2559B5B8FBCFA18FE6CDDE00C415E4CA1172B7C11ABE48DA1CA108BA5005 B8E6D2C3088D4DB848616CA4E179EBEE72D2EE19B424D565CFB1A6E8A532DF75 6AD25282899F1317D3948D66BE5AF0ADEC1068E58FE34D48521EF9BFA384BEF4 3EAE913A3B234631180A5E6D101B2EA3942CA5DAF68332404479FC749F780F8A 31574DBEE3C04AE1A4ED6ABF8AE909E14B15F5128E9DB3E282B0D5B24638F744 98CE2E6397991120D0D283982A172DF42AD16EB4D4F30B77D21488DF2F1B6706 CBB8D83DAA503C55093B65E60161B4032060121985C31F34FE27B8AD13D19F80 E4D08998B755C41C72CC989BA6479D07FE051751FE6482EBB699C8F51BD3F498 EB13B8C986F4F902F01B5FF311BBB09FB9F14D0E80E401D8EB66FFCB33037528 918BE38C8D82A7E5DC0FBE3F367E26839D411C6C968D88C3C6475B21790DC9BB A66457A53727EA499C0191720524FFF92027F571C46D9584216896632E48F3F6 4088E43C811391F0A5522F8D6CD70368E7270E335AEC39840F1797AD2F2DB05E F5A0E987DFD719098603E9877F671A1493A5730F06EDB780DBD6106FC6138510 75CE0830DD0A91603003EF84C2D86CF36B22F669BDE4D35526DFEB6132C5D6F4 B97AF4BF9359E3A888153A538729F086B153F5FF1F1870E89DA6B0071A4D107C 6CF9F5231D64518C84872F953E4640AD06FDC68FD5616E59040063B418DD1AB1 E6BB6B179A1B6391E899FCDA2D1BD48A35EF303F8DC7399D04E94B92624065FC A9F7C08714A657354D7C1CD75A1584D4C842BA7A9010FD506982C49975A96054 EC5817A5E6A6A59F1259DCFECF53912BFB6B12E1558FCC10BCED77CCC845D06F F633E360794D94EAF4AFE896B08EFA1232BB14A099DE6F7FA52A939C0A783623 257DD5F50463B45228945D9233F02BE4F28A625A2534D5F0973FA5BE0BC888B1 209F72A2CE78C114A0E6FE5030B561C8FAD2B0E905CCA95E71FB3DD354E32D3B 5F61667AC8A5F39CC72E21DC1B6BF67AA40BEB7FCB33C33AEF37F1EFF3C0CD80 1EB0D3675D10B629A2577C0338EDF46DC357B04CBDBE208810C96AE156B0B50B 49234221530D85C755C08809525D53540E99D9786A99DD1162242F0F4263B935 A7BC5261FF9603351C03361C236CBB053F7D2C113F873B8D1151736365DEE8CB 4720544603ACB6361FC5E06FF2573963700F092876C7A2E8B1777440E257E0CB 5CBBAAC556ED70166D16CE30DDCD300DDFB23577514BFEFE77473D84D484B411 5DA916397A1CEF417F441BBA4EBC1379AF644D486767E42050555C4705883EDF 9AC9E385DA1C3EAA89C2FFCCA5F1229F6E0A292E85BFE382C1D24EFB8664E226 77A4345C3C8E6B1C3E6CE8A4F39069FCB47F53006CB977707BF4C31B8B89B010 31DF6E56779167E10649DCBB4B84B73F8F531177AA162EAAA790C42042A6ABC0 F3A5B36C19C65979A1D0EA5E1EDFD899B0CA0B2B3E3416B03B0A15738BC2347A A89ADA98D833C56F2BC5BED0CFDFFFCEDE415509BF060D1EFD4E30DFA8E4AD8C A2618CDA72152DFB7F11DADE3D6CA7B9AB4D11E3AA11ACA44FF9CB51FDE4D0E8 FC85FEA520BACC042FFB50AC87081F2FF016BFE3A4EE583C74EA8A21FF304F47 E2E744F6267CF31620641715D8D3223EBBE0034D172547716FFA7D45B36E30D9 D39CBDA4F9CF17ADCDE2918A2789D6223D66E64D1DDB20238F57FD86A47F735F 72404632FBE11036DA0F9F3231B1044C44767C1F60B31AD974C003993FD2B118 B21FAA4BF348CB8529A4F2C7DB6D64075FC9EB6C9F95618BBFE3C5931114DE94 7604720C659E9635CE3C145F565C1E2232CA3CC986E76232D5DBA01F3F939E92 0D7AD810462B866BE22D2CF3D4E1637485DD8A03CD7C2762E83C54DEDFA560A3 50DF65BFEF2075438A5DD976BB82DD055D6BC68454FD8093A4B7AD0AC859F8F8 6A6F378A343B50510D64EF7A2EDB18A3F2039395FC1206DC6FF119F8EFFEE6A8 885901947D041470F40E8E15BF4F2651E2F5A98FAA4CA86B704A03738399693E 9753CB274E3E95F275944A2F1B12AD702BC7CF5523EC6BD5B0702D76D95B7850 396FE0F2EB4D4E580589AAAB6F4030076E8D057CDD5C55BCC0B0400044C72644 75D5BEFDB158019780206441B06EA4D76A834CA5ADF194F55037B0D48C2B8B7E ECF76EAC99836B54CB25EBAF78BC32EDC42C1472C9BDA0141CAE69A541650E5F 79163DA894A4AA4B5CCAB958876004BBD12B2FC01A91A997EAD24B302E4E2724 FD2DE0E2F6EEAA27B2C0BCF6C975FF81ED121153C3CF90B7849E1EA1D8B28A16 D5BD79E3FE5B7B72E937991654811F4A4A28FAB73ECDC1198D9B822DEA74AE37 4DB8FC471A32AD000025961E2FA2C601D0113867916499D1E637A3159E3648B1 1E28AF7F15D1BDA8C37BBB2D8E7EB8267EB2C5048ADE1BA9EAD115E269051978 342EBC4EA4FE799E257DF679FF80180EFDDC79BF839F9001D29E7347B7C8B7AE 0140554CC9CF83D04C1623454C968580248A9091D7BDF67E9D32D1D4687644C8 5846EAD681A7C0914B9BCD5937D1791E8DD66B1E5A7F844F05FF6ABE0C0AB9E4 8C8408301166D41488E68AF7C1958A3922B49B2F21F94AB8235E8C9825BA66AA 7F040AB52BBD9C82011B1B8C5C320EA6D86D9CDD7E2E0130C310F25B81DDEDF5 CCAB32F24F7D9723C4EA5EFC044B9DF2E6B1774AAAE745956ED37513A16D42E0 8D34C5E6A8C4174E4573AE3787A1D32FB787E09B2FC4D94C8CA3FD91D3AC87F7 9737CC5A1D8187613CABEFC800D6F557435815EBB840B42499FD2E3E7EC8241A 19835620AB23D9CE2912BC6CCED29B15C421CEA60AC22FB47892DDD9F5AC9211 32DC96B80385ABC5C12B00E87EB73784B50805E4A63D12275C2B209693975EB3 D290BD4C50F52D9AD5DD537ABDB8D461E358921F99068F24FC71A4C2AF68CD6E 2311E57B00A1CBA95C6B0402622A2F73D6E17ED8BDF85FA20AB53932230AB82F 65C7E0DE4F987576507F723929D2B38664CD6A04A39C6D5866E71D8E1CB3C6A3 DCA52140B2350B9F3019CD320944AAC7F10EBDA3A69978FF0A60A9428CD87248 7A682BA722459C41814899F6670653F263D1D11B00E650AA4402D74B8982D9D6 E11956651D080AC060029BFD750F155D28593D57F5111D507C9DFEA8A1C86AAD 5958AD0657C1CD74393E716956650B7D2C058162A559064B47CA3AF1D44C2526 A8A3EDA71EF1985041484DF3DCBACD06DA2DD384F9DDE6A6F0870DC95599E8C1 916FF8912038F986BF74F2CD0EACDBD4BD322D6BB36C44B22B1103A6FDA1819A 0526EDC0D55DEE228D44CC64C5617FF01DD7FAD531F7EFE0B3995496779D2BA7 24CB382ACB83C6575BC75EE6408E8CA18DB82E891C99CDE8EA81CEAE4E387004 5B6E7DE99B0DC834B7ED3ECB88C24BF70DB7BC122D508124E53A4317192EC4E2 46CE0794F4CBBB570EB18DFAD989C92272A7D2A2793F97BFB4C8B3435718D808 E80EDC5FCAD47CDC1BB8EA3A8C983F62FA97D8DAFCB79E064C42F6370EC031AE 181F9A7EC4A752B08D2EFA5E2E935D2358910215EFC0B9DDADB385E4EABC7CFF 85A899BF58438D5EED8DD2EB2E0C1510A57EF8E1DF51698B200203699C8683B7 9DE8D8A2D7A36E71D8347DC1E7A7AC8FFC04AEAA5564B99D06EDB226ED615259 49D0999816655450B7C03E2FB945D694F3A7822D3D6BB5B9F545BAFDA7C31110 7250CC61C82BB073C7B406387CB69B5E13D0F11C27AD756E1E3550E1628D3306 D7616A6DD06EFA614E5936E74B75E29C8132E5EFAC7020E706DCB79BF84016DD 76DD1C652A1221A7D0EA7D32EBA6704D108DAB8D4D33C00A9593E7F3277BA8D3 965147CDD1FBBC177FC0894F18FBB3836BDC3BE0ED20ED213CE65C1D7DFBB444 7C1A849517F2CBD8EDE8BB0D6F515F3A47C9C5C4015A9B62E1732A59DD0B73D1 3A31EEBA19251F6E4BB8175208670D9F6C1670C55329A0C82F46E68565763FAD 30BA4214376C027D806FBABC817BF68FF387B39F322748B09149A7DB7B26A4C6 9652B491148A09087267A637B2E21952FDE8F75DA9CCEC386AA342D418D42DF0 F35E2C0F845C5EBD86582579E49B66816B980D8C48FD13F56A61C218315BFE4B FC79701ECE3D617AB1CE0C8E5370129112DBB71DB4CEEB5178A55BF614A24E7C 93767EAF9C31C8A0B88791A260ECBBB5A28537A0306812965C697052747601BD B781F8F786681A5EF48137802651742D489F6EBA1B84BF25BEC8CCC231BFA1F5 D4DF0D5D172A985C40FBFF875D6C92C5B8FFE3F4385A12FBBE440411FB4B7C99 3071A15F7E3CD698100DA5E6C612448A360BACDF3492D1BFEE545874DE1854B7 57AEEF92612682D34CC39BF22096E3E11BA447CC83A55C866C0F0C33D6B48F8B 4844A6B1A83D82E94C39CD480D554108C87218C10BCC8691A558D31DE59AAB9A 3B6388767D31E7B2D31B653D67E8AA976AD1800B009CF4FF46643F932F0FD14B CC031C644DC061DDD38B8101B923F99AB8B64B6980172B62FCB1742656CA26B6 A8F94208969FD50ECF568A09C97C104A9975CD4FC9954160F91255D2FBD416ED 593DE20BEFA70414C08B05B9F5009B5EDA4C238C60558B1D328956ABB36C2362 57623F069CDD8D40B37D21ED20A1FD80B276BB69DF7C9ECB28C0F8B16B0414E0 EA197E26404B3E1BC4928BE2BDF230C74303647EDA4DCFFC6D90510214F7A51C 9F091456C74A246E3AA5CCD9E8F96515AEFCB11BFA14E23861117F848331AB3F 230DD2CDB6D1B9A87634E2EF3667232218B7097DC3EAE88F21FA5CE00ACA56AD 6F5B0BDF4007C20C2C8FCFC684BF1AE8DB92CD2134A1461767F99AD6C3DBF88C C83F5E7AB6F5033B4FC1952C32AA3E7CFB8568AA14159B5A06B42DE813669B6E 81A33C1EF590D96DEA56543B912C20459165443FB79E41098D492EC76A4ABA0C BE1538634CFCB8133E2F916DC95E7F52A00B4169D4B31695B208457A15A585CB 163CD30D191E96806B2BFAA38ED66440114655B9D3CFDEC3D3ABAEC544F19A25 5D7AF57DDFF3CD59CD38AC44346FB71926CEA1AAB9115DABDCFF2A44072222F7 3678F12209E6D795F1EEB7AFDCDDFB0757EC6ED3805C0E23066020D7D3E0221A 64767BA01DCD022F11AF80476C0E70DC53B5D68F3C547CF5415CCA7E51C2272C B2559B97E90ADD9201E240A084F9E435656728E035185B4FFF180E3DB90C1253 0D30B413D69B5B2878113FFE47125AF9575A3EA694CF7112E69ADE76B28CB2B7 D78B934179C2F360A8E9162ED3901013C21C5D1C1F2AAF3DA72B4C5ECD41BCC2 E7708C21AA05297741BBC5B4117A98FF044420AD5C9E32117B39530A5613EC82 B6E726036F6D9DB5E1581927BA117BEC35C488CCAF482F7151701396D0FD2797 63710EC39D4587184CD6A996C6261A7821C099FC0502457CAF7DD72E9F63D2F3 F253DC76DA979DEB9D64A0946A048327D9148AA048DDBF64467A4C1D08C7D718 C5FB1F1C6C9D6A534879F7A7B838FF7B2EDCDEA450D42DACBF792B3349DC65EE 2042A3082149B08A4B071B5FC133BAB8B474EDE3D20FA87A7D0EE969EF63EC12 DFC32A5D69C18A7F0D0EAC092F2257B7C9626549B52D74C5DC509ACAE5B796DD 94C8E71DADE91359369C4BAC970AEDF099E0824256D0E35153158E653810896E C5FB0B7FA6318A6EE862A0BB12B4DD710E31A0F166AB191E71BEE012BF8E9B71 1687A3EEEB3DA3F96D074F8383DC12104D4ABF5F4DB553DB873AD51423AB1673 0489762578EB531A266631783FADB9A53811F30D2A3AE572A72803357A41F03C 85C839E2400412DB5D71DEDF5434FE65BE3C73DD755DFDD08B9A263D59F3C4AD CE78E49EE441F5DF85282506ACC4A2B3011B4B7D52433092E1DDAAC8E1D3D2E9 84534D94632B28C80473EE36E069C05FA8A7C5676C44CFE861439340B361B4E8 FB5A3F251FBECCF507B00A775AAEAEC4F5A8240C7E5E30938214225044231E14 A23F41E75BE1D6538532367D5EC52F41099BAACEF848D7851D70BD6695090FDD 0237E63787BC64455248A13BFA26005D5A2DDFF4D2E55909C0FD71146298DD45 B5944478AD7F55B471B93C6F85A866226A702980A56F7DED49A03CC839DEFF71 3D95F141F0C6A73579543690FFE2A3AD3551C9B7BC44D27E35F2E5B960153854 866589900B9753E78C2531E67B494AC81D7C7C50C31BFD1400C7AC5B085E2958 DD4AC4F7F23EDD46B5F854BD4FF33346A05B4CFC323060432B268503D12C535D 2DEAFDE052E29677FB5E7BC4676F3069C2BD1EAAF2D268B36BCC63704928807B A329F0F03B6A395A91B1F4D53DB9CEFA6E3AC89C9A281ABB33B0C14F2F001565 46E1004D24ED04EEF23BE22B54AF8AF2252166AEA6E7DA8D2621A90B90129520 490FBC763D1267FEEC9A7736DF791B0B3D79E567CAF57803AA513E4114170741 D34934EC4BBAA2D97BF272D29B5FE6DB4131FEB72ED37AA5CE21C09CC0808B7E 2E832F37DFFB21F899C9E37E3AA9F9B65CBBA0B5D0366E41D8BF9516187A4342 448ACF3C237D75AF96EE68F3A6357D2AC3B7F0E7F0ECD5BABB754842AD4DF4C5 BAD3C32E004182A6F41A24D99919BC51A15120042BB2AA51F7D86E0CD1D149E7 65954A01037EA2BBD88E12F9D89AE0BB3F2105A937D3903879E6B7793296CD3D B032068B6A82CA3182313C15084BB5D2DB8FF0F4B9FFB4D399244EF03722E411 98A575DF877DB9C1F1BF47921A9EFCC271536229129BA002E8292AD35ABE9C95 33A722158043BED8911050D5AFB458DDB1ED084EAFE21438264DF9C9FE6EB91B 974ECB3F0B8CF6813E36E73D06D2A2849E718D927E807AA089BED1B7D2CE09C6 43F5EDD29D586F3A9C6B7C50FF9DF427CE64C70BD92E1E701E60B8AFA7F315F8 12BDF66CF5B306998B488EB8A77B6E636044D80E9FD0924B436AE2C6F15A1423 7DCE8B5858E4ABAD4BBD6952CA30C47EE85D5891DFAE121C8A3D99715CCD150B D36B5774437F24EE25553E1EB0D0F92EE80CA87334CB4F2F8E67CE8E5753A233 5FFE3685339ABC51B5B35247D08BFE9180199E856484CF55C566DE6ED4085292 2A5674D8FFF30907B091D85F63C1609BC352B330BC42D255D9A6DD613602256E 78339E61E11C1A220C7C5E39DA27641073EA416ABC61474434F08957CDFDE6F7 0E405C3663F549E886EEEB5631FB9222F595D17FA2494C24076F5AAB1771EE7E 061900F309BD14E7233B50149A7C7BCCE8064F0AE9CA9A6A3F827B3D97D2DE8E C216C88A929C29E9453017330E86EF5486E7590807BDC1A10F0E1F73F681E5CF CCC1E51DB74C59AD1B4CF2D957E69DDF9CAEA22352640953DDC08BA315D5574C 7031C77D3CB90D81085BC7880819A58B7AC2D49EAFEA8C6EED38A03DDD961CD9 CAC9430D7D9303644C9A1B2F210CADE3AF99923B4E35F1D6F47C9793488BDE58 346F479DC897AB6040984E00D0845989CF189C6FD34E646C52C0524E56D91B77 5D8386D5AE524ECB444F6B61D60B97F91BEE1114708F94189BF9E7590D9137F7 A4D55D2CC74B4D20DD4F8ADF6A7A885067CB0AB082E3E62BF631430F47134F37 B77E63A81DD8ACB1E57C5DB5193C628A5384E132C885944F464E604692F0D59B A180F72448F0D8B55E83BD2FC4E89C6A2530CEE32959513CC0EE2B4CC2B5012A 3B650CB5806B723639DA4BA8C699477F8220ABA41DF62ECC7FE55A595D12B2D6 A79B750C65920826B7E972BD7B37A25525A4D668D2F95B5AD6FB89F07173E333 95CDBB50F397C1DAC8946E585A7FACE425349F384F7AB711BF069AB63DB54424 F549E18096CA4D924758D3A3D28BE3D3AF3166BF923C79627335B76A6AFAF088 EDCB43D010FF02AAFC4274170278F20F67EF0A9659D479B129A7BB3D3388E0FF D5CD977CF45542ED141F4FA1A07E764BD1F1E3A3328E92E674FA694C4BDACE17 EDDA7B948A270659E31851E2B5CB230E9E903B2E55466CF0B8A49C1CCD2149B4 A45F57375CFD76012B90F528BAA4FAEA8183B6F49016CD10BECB54D03F504320 1ACF6373C29DE097CFC46EC8710FB01FD0DB8EA1682D03E2AA9087E05FAE0570 6746DC14AF90AC3BB988B91326FB5193851FCB99AF11FF79DA150A7AD96C794F 31FBE219CBF1B39761B204C2C1B31F5D628A133FE4397A91E7077B930C0AE948 A0B5F576ACC29DEAF1FEB692436AFFDA1DA6AA72DB969716040B9D3A9BFD7EC5 3D18E28EE193EA13A95D65A56AB97FF130D058659FEF2D7668993D483649D107 A5AAE496521A7D4C9BE539327D019C1BCD0583DEDC02278FC0C5D84139E94F14 90C42E57CA98DDF00921F3C7B2EC73C7CFC73DDE16023770C292F59F79F04D71 860EC6CF4F98FCE4BCE432C39A008EAB9C30660E9B06B924762C2759C686CF1C 26313F64C6CA8B907C76DD6BC88D6D916DB6FD6DB9E468982ED9622D1DD63EC6 3941AFDA506511CD39596EE74BD3B7BBA26773C383F4273833B9591BB5C4F4EF BF489D13D4E82A51ECBFA543F4DAADF838DDE20DB1D3436C3054C9724776225B CB1C27D3383E9C3F712DA01A0F01AC84210AA36C778CD6601A33F300C53B9AE9 1371304463CA53831DABC42E540294B59D7ED94786205E0457C9E0AAFA68477A 98F65A263C8595FA2120BFCC72DEB457D42DAF4033FC2C97601AB1425CFF35B8 2745781212C6A3A443C377332E912EB4CC710938446072E5C8F4AFCB0F45A727 314D50DB26ABFBF45E15CCA0E0ED25E5823A2A2AB95105F8B506E6C49F36531C 558630B06A8169EDF0C5AC9018636D43EC5140A52522CB3C0F5568AEAF531F7B 4D0824A377B6C8B384C171769EF2662818E514DA60A5155EDE66A61E43A17F63 54121CC036AE45523556D262F536579C59858E173C38D3A8E2A4F042E9F29815 443BEEA7D841CFA21294272121D9E96AB1028429C8168B8B2D7814CA6DB80DAB 0F95E075157D06C27C1193B6791C00A0860B973DD0238302024F3BE675BD086E D91D3604B745D52ABF2AF0F40C49D598A7D3A4587050AB7A0D72DF4B68AD4080 5A194F847D88FB7342198A3B00E0B4AEA900602CC55C95D0EB176E0CED67977E 2DDBE57F3D98242C9AB5ECD33208F23E219DE2C4172A03BB3F3CCBDDADEF1347 ACE975122A513072C8EFE7D36B1347685427921472BCC72AD1AA9B7FE867C69F 8653B1EE5D6C1C32536B68688284E266CCBE6429525B4F6291A4576EE20F8F28 CF5F498772428FCF35A589DDA4972B920B4A75F0137C0A83DE7085CB8561FBAE 7EBB0EF666A11B2AC4E9927ECAFF4F4811279081AE8F08CB8F5B6AE11EC6BCDC B13FE07F156BFD1488FE29DF3A9E5266B4936C2DD64D12FFB74BDA1C3F8A89DE C9C1A31AAFC833A67CBE3CEEA15511841A3A722A5B00507CCE3D6A6F2B0221BD 73550560F72A3B24D53DACB8D0DB43FBE9CD191ECAA4FB07F5A44CA0D6209921 48923EEE02AA0038B5AB6EAC9CD80D2AF649C7C628D8F4BF908E0C37376C03AD FCD3DEED0EF6032C87F4995E58241B62CD68A8FFA703D89F06C3C3FB5C03F58A 50C659F0E8E4BBF55519B34C636408788528C29CD918E0F972CA1BCF304ABC46 DED0BFD39BCB06FC8C66E32E2D3C208B8134153CC7BF4EB8CBCF3B6D10A9B1D1 0C8A8FF6A486EAE15F5934B88FC8A828CE428E42F4FCBB607C1C557D4319BBB2 D0B38EFE7FFD3229183CBC603B673AF87CC255A004ACDCCE17060EDE524AF741 76F58AEFF2D9C8FAA0D949C1A9BAAD87A5D5D77DF9E28E281427D5C5F7D963CE 2C2330570944CF5E77B426FD71CE87C3C8DFAC309B01A1478244F8A391273FE5 E6E99A647631ED43216D9657825A6F938C58956C72EA5E8ECA225F76F24C30BC 61D183795B3DBE81B51650DA8FFA28FA29CFD33DF95A73D3851ADBB5F31EB0B8 7029978DBFE83DFF9D38E9709FF21B565FC4E3AFA3DE7C28E1CFF23A6B461BBF 2917A4D1711500B2ACE312689917FA1EEADA154D41E87D9F7687069BF716DA6F 49A7E194CE23030516B2AAA0BE8960E0B6A0487302BCD648DC7BB34B0CE11A2B 1301C361C27D29F5999B882AC5431691A44BA943549DCC22BC08AE143413D694 95071DA5533D91F2350D69B9CFF8CC69ED35789AD813048F195F324EE1A3B7CB FA86834DA5B13119CA868A5C8F 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMSY9 %!PS-AdobeFont-1.1: CMSY9 1.0 %%CreationDate: 1991 Aug 15 07:22:27 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMSY9) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.035 def /isFixedPitch false def end readonly def /FontName /CMSY9 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 104 /angbracketleft put dup 105 /angbracketright put readonly def /FontBBox{-30 -958 1146 777}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A 221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A 27D1663E0B62F461F6E40A5D6676D0037D33F24E2FAC2B0009AD3C8350CDF8CC 65BCA87979C36D14CB552E9A985E48BE4E88ECA16DF418749AF04FDD2B0E1380 D281BB2476BB45FF30946B247DFD7F57305FA87E50CA338121C71CDFDF927A9C 77FF14CB4A1D6D80356FB1171ED38C37702350497B44E42CE31DB2F493807DAA 15B887C671199A54C4C1294BC520F5538C15556BC43C9F62342B121C6DCD6C5F 491DA47FF360201EE21C08A781ED0589A6DF91B99FE118B9B29E4F068672E52F 1A06C514D91C4C937D4E642503392B1CD1BF5AF0BCA28EBD840AD76CC39AD7AA CF2C05711374F7849708E1106F88737C9AA60612D384CA8C173FF1031EBF6EA4 176136DE1B9F29E40E82680A2CFFDC24DA05853307F1D1F6537D061EBCBCC5AE E6316380ECD8E63ACBEA9FD1FC28949366850AAABCBC9552CAB2CA3BB934C8A2 14C9DFADE24D9214858B1D42B2171DB18A475AF78868C2549F19555AAB07F586 58B28541C74E14F28B68DA42A9D46C031CBD74FC09BFEAA3AC1DDC68B7B71B81 6003C9C6AC8EDDDC046D247A2B8AFA63A3B1BA1F12AE0B4DD07327F0138BF470 4630E4B5DA55C194F454EE2E872E0ABE6B879DF2E87CF81F75D79F458F7D3F81 FDB76C15EEC4125D18685E1D8591C54C0B0D069E2ED73434617B9D30E64457E6 1542E4630E848948FF2747D5C31B9C314AE108931003DB9F76644DB43D245499 2D28E8452E50B1945E13A5DE2A8B93523D3671D1C7ED07EAB6FFB559E5A1F828 B22D2FAF349B40C3B31FE806595F67C5E75260514F456FA0013668D948619514 0EFFC35C1AA131AF8578A254AE62CA75A6631489C78CCE633A3B302BFACB 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMR8 %!PS-AdobeFont-1.1: CMR8 1.0 %%CreationDate: 1991 Aug 20 16:39:40 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMR8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 11 /ff put dup 40 /parenleft put dup 41 /parenright put dup 46 /period put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 65 /A put dup 78 /N put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 119 /w put dup 120 /x put dup 121 /y put readonly def /FontBBox{-36 -250 1070 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C 68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361 3645B82392D5CAE11A7CB49D7E2E82DCD485CBA1772CE422BB1D7283AD675B65 48A7EA0069A883EC1DAA3E1F9ECE7586D6CF0A128CD557C7E5D7AA3EA97EBAD3 9619D1BFCF4A6D64768741EDEA0A5B0EFBBF347CDCBE2E03D756967A16B613DB 0FC45FA2A3312E0C46A5FD0466AB097C58FFEEC40601B8395E52775D0AFCD7DB 8AB317333110531E5C44A4CB4B5ACD571A1A60960B15E450948A5EEA14DD330F EA209265DB8E1A1FC80DCD3860323FD26C113B041A88C88A21655878680A4466 FA10403D24BB97152A49B842C180E4D258C9D48F21D057782D90623116830BA3 9902B3C5F2F2DD01433B0D7099C07DBDE268D0FFED5169BCD03D48B2F058AD62 D8678C626DC7A3F352152C99BA963EF95F8AD11DB8B0D351210A17E4C2C55AD8 9EB64172935D3C20A398F3EEEEC31551966A7438EF3FEE422C6D4E05337620D5 ACC7B52BED984BFAAD36EF9D20748B05D07BE4414A63975125D272FAD83F76E6 10FFF8363014BE526D580873C5A42B70FA911EC7B86905F13AFE55EB0273F582 83158793B8CC296B8DE1DCCF1250FD57CB0E035C7EDA3B0092ED940D37A05493 2EC54E09B984FCA4AB7D2EA182BCF1263AA244B07EC0EA901C077A059F709F30 4384CB5FA748F2054FAD9A7A43D4EA427918BD414F766531136B60C3477C6632 BEFE3897B58C19276A301926C2AEF2756B367319772C9B201C49B4D935A8267B 041D6F1783B6AEA4DAC4F5B3507D7032AA640AAB12E343A4E9BDCF419C04A721 3888B25AF4E293AACED9A6BDC78E61DA1C424C6503CC1885F762B877DBB5D073 3A75DB5AE79007535150CE3DADA75DA8B7FD2BBC2E4B72C50324E17E64C3C230 3E5A2013974FAA7CB8F0B011AB85216E87C893A175E36CB1F9A8B5CA0FC75E0D 0C8C2DE998FA57C006DEDA39EDCA968168AAE28FBAED216BB3EA9CC1B55366A7 70F72812082533F436338E5039318F562CF7600F9630FB294000C85688935D34 6CBE7B6643B9BC84286B338C2AEFE38D128DC9816DD77D2328F5A5A8D1D6B329 727C54652C988B18131D168FA8A1E2595423A45CDFC1B95B2A1F3B9528D683EE 43C35C77933897EC819CEF30B857A2B1732030FB432F5847A572D80745E1B38D 6F3AD8857723EC9E2C246964BEEC8ED82A32F81F16892F25DD3BE0E61306D535 966ED92C569E517059697EBB0BF3E305EAB0CF0C068ADF5A1E4125D28395E69E 40F74AE234E1A12F39C019BDC2B11208A20D4C0DDC48B6E054F711E1EA0D318C 50093A78B6AAAD13B7328FB14DD1211E304570F14088CB8F87D43F1ECBD293A4 C00684A42FA4645A576EDAAFF5B46D48A078603F7ACFE6F19E6D841C38E7E5C4 3A64DF501D86079BBED917A1ECDE0247C0E026F3DCBB0991EB16190EDB4B348E 51C1CF68C1C1B2F2745B0D07F3D1101F60297083B419B5768ED5578A5C5FC7C0 50F66F06593EA95C6F3B3F9766E6F51445C2A9A7403C50BCB17A70089938D85F 70EE34C0B94FD9B5165B54FA4B1008B015EDBA045EB5307D6CFED3FF2FED181A 54AEB7C1C737EF3A8C8EBF0D7036B6ADB636A4D2862EFF469F2345BCEF40F25C 5A750AC985306A7BE1EC0986345CF55B84D97001FBC8160A6776F47407D7CAF3 224CB568544C1F3327CFC4744DCA0CB2AAC43188D61C72E9E80A4F3DC177CC02 CC6BF08946AD5C73AF2B7CC2ABCE37FF89571314DB39DD58E07645F4EB111BDA 87B4E8F17229D70D558F6ADBFDD193893F1F1939D327B88DA6200E9D082B7587 C595726C85C5702BBD95D4C726F8E2C96C94B9B6092AAD41113591FB3060C6D5 57031246B1530D95E44C6ECFC9C512D1C58CF6D537365921B81A2531922249D7 512F2C4AA7F71C3CF20AF4A2D0BD94081D84A1227E13E37F8F29B2A24BFED3D0 CBFD0AEB42C7AE3487A1A351DD101207CD9915E903EC182C8D5944A88A49EBC7 B752D43A56F3B34284EB990C7E5146F90785F4489D7226ED6FDD49ABD10AFB9A 875DEBF63B8E8B4587C3A493E9CC3BB7704D5D947EEE99B00A273E5B2700C8DF F34B5B9568E07E3A564662B0652A11667FCDF747D95EFCC2A09833E9AF2D22E5 94D3593CD0DDC096A23A9B848780B1566385788662AA921838A72618900F07D4 D9340A04F0E4D8FFCC8487A756FE3B3B955BC84B16C23EF3E0728A2F63B259B2 E3D67CB8EFCA4229893750D18B56C1AA27AA74279005220AD9A4483FFEAAE5B9 A29D7E7D1794285FB3B53B5ED40C05BFB48F0CB1ACBC899F5CA92DF46553EC17 B3AABE80A309EA29581676170B8F75351182DCDFA1375BD5C0C1D4A385398C6A 1A06421A70EAEC8E59599E5BFF3DC2C11ABCBC64FFBACBAAA4335E9FE938CA0C 71E061610A1A04B8706400E35FF80A16833A4805A615EB7039ECC6CDF6E66B33 30FC0EEC0742CF10C7724F84FBCBE7D42FFA7B11D0CAD9045BDD72A1CC9287BA 305FD7F471DF2A081F4CB2C421DD7276C7239E4C0C656D080D9615CE4A8C9A35 D30CF6E8C032761444F14C1865A315C3DC3A449C32BB9352035521D928F0DF85 EC898FD5C4A4D164CE0B3290F3450174934992CE8CF10B4C1F07458501257017 36AF2C8C92D5B24DC6B8830AA41AE66921C9318786E1164CBFAB7423485E347B BE7DD7CD232F9E112FD829C105E005D430C1D57B6DF4C165DC0E779B2B4CC3E6 2606643BEEFC54A290360F4A2D33D7C39BD0D32EBE8E3BF19A807EE21B761D65 9DC739AC82D0B762C96A9B9D9E5D1C739309EFED34BFB269F9054FCFF5CC78E8 82292EFFBB8F3D2E818C54BE60A1E42E4FA165ECEBB4F46ECBAE477DD3317C09 913EE9AAD81140E090A90E5B731D58BC00ACD52565F71CE31841E055425B65FE 4BB5FA6AD565587E56C92D2EEF5FAF3A82CF0E3F741B925770749A84553F7D58 40FC3DBDFA1A44FF6901D676E6C01951FDA22F7AC30C2FB9A6B8FDEF6B30269B DC7E2A416E957954C99B18E622908D40FC2BEC73C7475CAD7649060BCC11D4DA 07C404A7BE0E2A902648BC2DAE53BF258FFD412E0215FDB5DCA39693E2CEAC24 3697A9A61E3493995B7AC6CBAD30FBE224EF15A9C2529303B357EEBF21887A5D C1F2ABB2F178D6A9521CDB0FA8B3773AF29047C2A60043198B7FB3B144267DAB 9BEE8A7709FE4FB2536BB6A213BFEF8F3BDC4785C59D10282FA8CAA92AB83CA8 22A263724CF3121FB0697DF08D05AFA233DBB79EE224F9799458C03E15D113B1 EB3C8CF0151167499E472D236ECF9E81A1386A880D15F036B9B8D8703468710C BCF2903A58F9FFA272D971784EAC7D46C419CABA2DA20BDE55DA878FB6B294EA 3DDB4712F6086DE78E6CD552DBBBF5D61FE04EA7978489FBC556F75ACEFD6BFC 5CDA7055F2BC1A1254FCE8F29DAF28C68E51F5FCD8784A34983DC2D4F62B9B4C 548955FBB4C5CAF95F87799FF848BBA54423093A2FC130BE55062ECBBEF82C15 DC8A2ACAE0DA6756C943652D1E32E0AA35D0C17024E5A69C890954F933F244F8 4CFB3C324B3F7F446E8F1047E2DF4748B3F4EA15375C75D0DF245BB18CAAD17C 47A43BD7303B6E28FE4A44E2270BB62894691274D004EE52E321BECDE52AD90C BBF49046379E32C7BAE4BEBA02C7BDF9352B4290701B9007F3E5995C093D49E0 C6C7DC0E56E2704FCD8B98EEC5FDE4ED8C5259C92068BCCE9AAA3F316F6C4B1F A43F05D40671010BFBB18237F3E881ED4EBE69CB0D24FD16AAE2D4FFB635626F CF5993F29DB380C00BB855B9FFDD18C9CFA9E8F528CFDF288458ACFA568F914A E1D0F9A7BB3ECD51D9FC6C8E7BC00FA50B986C259A62F97177DBE3A87F68CABF 9E793CE4ACD25699187A07AF5005C8B004AB7ADDDAE9C0D21336D39FE8A6A7D6 45E90E2426CDE3B6BC58408297E97EE9DAF658EADCCE710DBB8385122D9D94AD 05C861D66646789A2B53E7E6F1B370AD229B37E524654AEB85D37C73910283C2 09395D0D75A2C85A2F82CFC09315141455E6AD6983FFB5A9E0C33746FD70A7B5 4D0F19404D4471916DA417E0B456E4895E0D1698BB60CBFE95457F226405E1F6 9966B857476B6A3AD26B1EB0D6AE5FE3157460563056D89A70C1F7F969D6789B 20164CA53272690E7DCEB263A5BD634EDA15F08356CB503BECF93EE40EAAF467 BFE80FA46FD5D648FEB49B5C1906DFA2838A1A76D44A1E460981B40753A6F2A8 3E26322EE90F8B99AF8F69EB52F00BCA677821D7E3E85A4FCB4231C2632C7B1D 7ECDE737BF04A6F3EFDF5F4CE8C80204470B3F72D8B64E9CD5E90D148BE28D2C B0F8D1016D205BD5131D1FBD964F7DD71236239453EC5949577E6BA895A34589 3D780DB23FB17B351A2B4F96FD827D54B2B0863294FF4AA47820F49AC3798266 1CD038DBA4E0429F1A60100FB5C956682616C45C8B9504BBB5E9D3E3EB1C2865 D71487FFB3A6CAF5216D9499467E131D822FFC93FD39F2CCC90083C06EAF5A00 A8489BF873C5256F54EFF519101732493D3531CCD223211FE326E5958DB7261F 7FFCAEA38BDC18C52FDE90CD22D3A425C37A6BCBA380F005BEFD16735BA46DFE F7741FC0EC500AC14866E224468A1796174357E02348A3188390F8E629145E23 6FA41EC0BFA473443CB159F517997D984C2CF8532EEB6FC7618E57D734A533FA 761EFA80326909E09FD757E44E5B730198235B7FE8B6DF5FF28DD4B05C1BB460 E3A7CA510DA6CD66301AA4460AF1799006B41AB9262EFE49371C3CD87A438736 76F0A8461CBF8C7AB5939DE0D63043D3630DF8C398FD69E7D7EFB840AD31C943 2BB78EC10339E38C1ECAEF7BF707E034454084EB564DFA11C9C7D8C1DCFFE6E3 6CF2FE34656C23DB776541B58AD2585E6B731667F8B08E310FB51EFCCBA57439 59DDAD1C4749ED5B4B0084EE37F4110B93B1C9D766E176DC51565120919AE742 92AB4D39AB953F847DAB0FF4CCAEF128DC0AB7AC4E6920E03DE7FAC69A65275E 14653CCE6404A0670F362F501E5B508C078353C6658842B6AF48AAC8E43555DC 910245FE5B563104DF538FC3B58E849E5B1EEB0066FEF01970E1C7DCE5327094 E109369B736A8CF49B42D02093F3CCC529A4FA2C55018597D69D964380D9724F 49250C4D7E085C7D7D6247F0A98D608B9B1ABCB879345CAFC44A09D939444E5D CCC8E59A51A61B74D57DA57A329D31A8508D3CF242528611019E71BAA1F1D712 D9FD8EE1B4B51B2A595C66D5DE0048C3CA1B4A8DA95F005CED23A28CD9AD88E7 BD9EB0476AE352586FA605E98BD6C9A9866963F47044F213B85A3CA872ABC93F 22C77F5879D735EE2330969CA10CA70990ADA2F9907D5FC72233559D9BDF62B2 3CFE750DC2A14CADE8695154EB0889C4FE0645E52B0EF862F8338ADAA4228F61 7EF9D65262CB13F720967AAFC856AD727CAB490A08B36E1B3EF94F85B23F535B 5BF9CC782D51E30A2EF9FACB9B1C98855A5943849E2C52E09481CB8692D1B421 E8DBA13AF94CF0CBE8CC64A58682E7B5EDFA4710362588F8FFDD06AD5E16B790 CF0C4DDD17E1A562FDA1267B3D6CDAC538E110BFCC737A579E1E98649EDBE4C1 61F1859A484ECB8FA83726D975BA908C234F293FACA81B995A7E41E69C6E0D38 29D4EB0846F914CA1F2ABAA9E46AA45DEFC50FBBA67BAD8CCC9D8B31F5D7BEE9 ADEE9D67A3FD78EF84A68664848FA3ABBE6B7A84C257A131C0B09DDCAAE38551 4A42B453A8521E28D9AE3851B3950A010A18116488AD0DD74D3AC5478DAB8A39 380C9530E81F8DFF60223A177D1E62BBCD2C00EAB062ECD0596E4E9E65671EBE 8DC8BCC09055EACFD307C20AF65662404C076BC0E117C882EBE29644568232CE 92162B3A10856F139764BAB15FE2592C80A98F16A2ED6EB6A2B9F755C09BAA39 54897C628BD8331C91E17EB8C0B7BEE3883B6DE7588FE85EC61C01E08458F422 4E253BDF0301FB0B955B41B32AF29FE41E90504784B4CE3BE01262621D2E9A2D E10DFEB897CF3A7F61CCB983A78700B646F5282FBA53DF48E2BFF396FEE682D3 A8CB6F76766171BC1DD3B2958B40481982B39069B186707649D17ED7318AA4E3 15A537151306D1D3EF321AD529814D34B69ED7914C668CB7E6180191FF2F76EA 2A877961F4D40BA517D5258C9E948E43CA90C7141C5070BBCD9A5B554A56FC57 16EA35F1885A472F75B53885BC14191C4098B837CB70C5E2C5EEABF7231B02A7 B896DE6FEC37B45D7F800D3C4964BC628F9FE62D17F4647C75DD816399A59048 6DC9A594ED732763B208CBC653BF581BA68263E4C9771B10767D88A97C4180F7 01D046ABFDEFB5EB2D172D593421C02D80CED0BCEF809C66F2E904659E07DC04 F72B9998A92B5C5117C01DCFF40ED8780B7A720F59AB03E9DCA50A0CA3D7F7DD 4AE594F3CD0E980D59DE736976D9F6AE76AB6C61E2C12938951F975F8829A971 8E3BB1B18221D93431FD9DEBB583EB3044206CE36D780E15E221ECE0BDED70D4 0AFA00236301602B03E8BA3A814A0FBEB2A245079B7803A6F19925E4110A3C72 056E1D0891468043DF86B51B6C13E3861572F7FB83FD12BF5787A8736E8BCF88 66A8D0D1B73FBD545038FB340DC76EB9679869214E18C5E1EA3C5F8396BD12DC 9A1D62CB1AA7E6FE0AB8B6724E3467094449A85CF31CBF33E1A262357E6730B1 169287ADB5E36B4D8D2387F4E4E748AF60A29E9DBFA1FB782695C25DDF3CF3B3 42273762418A4CEAA5578E767C54AB23913857841D7C3016AC58905F686D9923 70ED499DD72361B1846D444549EBA5C49BAC5E674B7F0805F4B263392439F9D5 8623B2941AB6AD01EC11B819CD2E544B35431FF1341D0903845BFE446FE33E30 FA4E2C8B994752D87ECAF7698F7ED5C8AE1634A1D9DA1A5752D0728E1CF9687E 2056AFDCC669539F6C3E1E4FA1267784B7F0A3566602736EA3DA76228D7DFF59 8C865E7F268C1DF198DCEDC3E9A894C59D179E95F788833948C97C1B904C1293 08F54FCBA2CE991F3283C2F320536ABD994DB9FCBA15C8D883649109132DB5FA D1A4689E953E1B4805002C162F93F87AB54F827D3D08CB97F0B4723E68D0A677 587D9DA7C85C288AA95246A1969AD5B4534910513FD9720BA381B60E3C0B0D0E 0B9C96D6866E0B6E92AD1AFB828D80BE51758CB812E87DFBBB67BDBD0E0C9765 B44AFD782044CFFC8A4DB4EA716A0033365BAAAF480E6BBB41EA8670AAE60BB2 ACFB0BFAF92995339D2DD07F6395111F74B81D7F474B64DD47D9ECB245455889 478D748FE270F3E69CEBFF75B9CFB99AE9B6F45964EE156D31DE143248C7F51B 2671C7EBE76A624EAAF0DD695E594C45316E424B6F2A5D24B84B0662CFEB3919 EA9F21760DE69D33101C37C1276195478BC5C423F41CD3439D5B554EFB3BE8A0 E2F5AF35E70758B8D75299C061FF338D02FE8761F9A40DC8ECE92DB4C0DBE383 F5952C4D857F51555D19CC1C57D7998D617F622937C3EA87F9C452637A269D01 5108D388312D231EAA8F6C4029F3D37B1B1A4B8E3F4EDB779274A5CFAF9071DC E7E5B94EE2CB81DEC1346CA432BA9B9820D04AD7E0D4B32FE7BC389EBD374F88 6190EF68AA8F83E5BE76796319A829B7E2F4D99F0583A9B08973B011A0C65E65 934EE906A25CE324914CF155592986AD32CC332DDF9263A8B37C7EA509A4726F 3EE4393D4CB9FA932C408BC3C4D0948C57F85346FCA48214F88CA41BCAF8641F FBDC98BB3F433DD2B36847C6D9031EAB15E00C76411F3E4AF2F5C7DA0ACDF4F7 0E4571145C26E9B5894CA92A4864B730167122FC2B40BD411099805A8E48B3A9 4A1D7A44EDDB0514B70CA4684D3AAA2D19B0869CCC876A29577F4A1936B82C64 858CC1E5135A87A231DDF61AC2066C4C886CBDB6119C07E9B92004A6778493C1 E9722202A4C51F0567B968358CE607FCA6211F0676EDE95B54EF552C893D34CC D6D5E6912738A81E1B1DBDA22F6E73688FC7A7D6DFED233274B77D04E9160094 841ED40E3D818DA15C170B57759A2941CB9C2426609727FD5FAE7D480E2DE7AB 345A0E7216194E0662288BECCABF2ED8CDF3CE6D82F310231D5B84C861D1E0DF 11473C172B8FFFBA72AF79CB329ACA83EDE92A4FE4DF0283552E1B6BCA8EBEE7 4619971DD826DCC60C46F69DA5292A4ECD793166DEDAB03B1E697A2FC8BD0383 9B504DD422B93F8C57C56AECE89B7008D445F87A397508C4E6ABB8B7E0822DA4 4D0499BB591494FE1D8ABD952F068B9D32B8C3AA2E9D7D4718BF6C82FE9FEF1A 7E805FC591529095153607A1EDF9F1811A563816538C44417E6E166DECAC4769 0B3F4A9E0D7B14FB73D07AD8CBCD90C3DF02DB4460D23F455535DD4B541F513D E1CD3533ABAB48558E9DC9C158F5E54D19ADF486BA94B1011D5C1668AFDB3EC3 DEA714C70580F21BDB51ABB4AA023D529542A99B26E605255A24289E32522989 81547847E618B40C8A662AEBA7EAB40152759F69B57A5DA6015C7CCA84F14F61 5C5D7271F4E7A4555FA3B4FD34915AFE57476B8CB1CD411E5519B5B8A820111C C31BBAF45A541BF294260438A115070A10DAC5F6E273306C68C5B0CF2E31A9BE F6D2ED7D0D8FE59361D6D4943796014D05360D54FB470506D90FBFB1A29AC9C3 4AFBCEB5306FBFDBD41788E01EBB1127A1F9121199CDCDB6E5A5000ED4D62440 AEE023163EBF2AEFC2416015A38F7F67682C4A675DFC5DDFE54513D54DB21691 BD982263D9A386E02F65DD37C2260743843D9B705A6BE5371BB50F1A8533A7BC 1396F20CEDCC022D984B5AE481DD57D6F63BA3F90878BDBA88F3A05AEEFAFA77 B206CE2E9B5210162BEF2DC40AF2BED2B0E4063D33A70C645E4CF415F3B989CB 5033981559ED88E67A5E6B4C3CFFD1AAEBFAB484FE61F7506E16CCFB979290D4 3CDA3838816B62994CD15D66430E5837487F5A04C3EC783A9CF57DFCE0297B84 1FFD49FBBA8C0D309944652619B681E5D02B5E712B90BA1614D5472597921E41 D21EABCC22A0E199657E98271E416B804E21C8B8F2A6D57D88552C118541EE63 D13863226D024FA883ECD55F5E743283D91B2DE4F7B6DC87A32F7E738B438E88 D24468CE3A628AD6664E523CE3B3ADF03334AC9AF2D8F6E333D1ADA14E0D458B B2B3AA420ADC37BA52F604026F0DC47EE3EF2AC42D77E7732B5DF74B3590E99E F09515C1ACB677EF2F7289CF9DBAC11BDC1A3C12A9291A871712B36DEE894492 F8F094924F29BB657BD9AEE3FA5C80BC2E5FD956843D46ECD875C5A5A49F3A60 25A22050D18CE3951ED98216B5797DCED02244571DDA53A731F15028FF68C032 AD8553FD2A0560A07665C7FE297C257029402205FDCBFCB243D7490FAEDFA25A CF271869F876BFE02D4C1B0975934E9CC7833C758F453B6149681600FB8D06A5 B5C5AA5C58349224EEDE3F2D5A7C9E5AC265A2205183CF09E99D0E14ED3740DF CD0E12E135E029E71EA99FBF2BD98184479B6012C98AA987EF26F88E83586D04 69E415D0747780FD720615DF446C1C4421E907DA30225E17A8BFB79AD148A300 FA89BA29427F040D7E0CBEDF944B398F53F71D299155AEB0000DF5A8EFF01524 6F95A100E0941454601FF38E14786C93E577DB29E9D7CF6E6ABE0702A2751B19 3FAD9E5AC99ABDF6D398DD3BBB7CE676BCB3B6FFA6A4A8323A416357364BDCA3 7E0AA5 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMBX12 %!PS-AdobeFont-1.1: CMBX12 1.0 %%CreationDate: 1991 Aug 20 16:34:54 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMBX12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMBX12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 11 /ff put dup 12 /fi put dup 40 /parenleft put dup 41 /parenright put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 67 /C put dup 69 /E put dup 70 /F put dup 73 /I put dup 76 /L put dup 77 /M put dup 79 /O put dup 80 /P put dup 82 /R put dup 83 /S put dup 84 /T put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put readonly def /FontBBox{-53 -251 1139 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F0364CD5660F74BEE96790DE35AFA90CCF712 B1805DA88AE375A04D99598EADFC625BDC1F9C315B6CF28C9BD427F32C745C99 AEBE70DAAED49EA45AF94F081934AA47894A370D698ABABDA4215500B190AF26 7FCFB7DDA2BC68605A4EF61ECCA3D61C684B47FFB5887A3BEDE0B4D30E8EBABF 20980C23312618EB0EAF289B2924FF4A334B85D98FD68545FDADB47F991E7390 B10EE86A46A5AF8866C010225024D5E5862D49DEB5D8ECCB95D94283C50A363D 68A49071445610F03CE3600945118A6BC0B3AA4593104E727261C68C4A47F809 D77E4CF27B3681F6B6F3AC498E45361BF9E01FAF5527F5E3CC790D3084674B3E 26296F3E03321B5C555D2458578A89E72D3166A3C5D740B3ABB127CF420C316D F957873DA04CF0DB25A73574A4DE2E4F2D5D4E8E0B430654CF7F341A1BDB3E26 77C194764EAD58C585F49EF10843FE020F9FDFD9008D660DE50B9BD7A2A87299 BC319E66D781101BB956E30643A19B93C8967E1AE4719F300BFE5866F0D6DA5E C55E171A24D3B707EFA325D47F473764E99BC8B1108D815CF2ACADFA6C4663E8 30855D673CE98AB78F5F829F7FA226AB57F07B3E7D4E7CE30ED3B7EB0D3035C5 148DA8D9FA34483414FDA8E3DC9E6C479E3EEE9A11A0547FC9085FA4631AD19C E936E0598E3197207FA7BB6E55CFD5EF72AEC12D9A9675241C7A71316B2E148D E2A1732B3627109EA446CB320EBBE2E78281CDF0890E2E72B6711335857F1E23 337C75E729701E93D5BEC0630CDC7F4E957233EC09F917E5CA703C7E93841598 0E73843FC6619DE017C8473A6D1B2BE5142DEBA285B98FA1CC5E64D2ADB981E6 472971848451A245DDF6AA3B8225E9AC8E4630B0FF32D679EC27ACAD85C6394E A6F71023B660EE883D8B676837E9EBA4E42BA8F365433A900F1DC3A9F0E88A26 331E4A51928EF3C90E1D7D90BDE7A402CA9A72A5B256C10A6FC1C2482A6C099F 62ECD4D282C049DAD12561B2150903748CD9F702FEBEA44EAE19B5994E0E83B2 AA26DB6F8D7506F773FA44A657E150A7216317E74F4C8ED893BEBBCE23D84802 DE6DA1B382426A271B442651149B5713046B1D7CD410C8CC94D841BB0CE8E784 6397155D755A071A28EE3A907D6CB27858038B86BE38D31F1B6BF5EE18F1840E FBD6BA65A6F9936201674D1CD1B38CCE47F0D46433E9CCD40CBC684F06F29CBD 7353284D7B2D4AD2F463F4DB6C163149EE68155043BE7514CE289F1266B714EB 74D282E6EA8700EE90B9D1F6B76571AE048AA92D63E3A89F5A55F6DA5861E0AE A5EF3540BEE1464D07B38EB0077C1CE6C2EC9E2792E2106338D65B38BB166B15 F3095CDB0B54863980ACFC71A2E4F90E75F9D33D43D71963E7CBAAD6BD3FFCFB 7569FC4E6565DA4F8A5BCC6DD283772F13C6BEC056CFD8779CF267DF0B02FC6C B7B68ECBD756E12ED75A35AB84B58AD20749DEEF9228762B52DB22AB5CD31F0E 7B5855529C7483C681D5A1366DC46BB7B7BC375E7C756BB6C038094E0955A071 82EB3B7769562D768C23058AD578631E5636661E70ED5E79336639376544CC48 7D4FBDE0C6F8DF4DDA2DCF5CE301E47E72A2A517F92F54C4AEAEE1B50BB6DA0E 28A44EEFEFE7D1293A8BA0C024CCEEBB4C860AD2959F1869DC2B6E39E9C9F1F7 138AC330C2EE9F5EF53E90DB9F19FEF15B2273C10A9FA2CD467CB4E69EAB0736 2FEBC420C3885548D20BF8CC4A3162ACA5D7A06557D49D500DD17C1EB455A03A ED6E4995FED12CD1DA759EAE6270CCBAC99F894203B6674414F031168680E73B 09557EC6FE13E5569119AFCC3A2372E59408887BACC0A76FE23F3270985E5011 214BC144908ED9BF9B5F8D8B8718C6F9559EF45F95609D3B02604F173063C465 A8C55C81E05C1E5032CE22D62F832E22933C091326E532032006D43C8C771321 4EC42970BD7190077CDD68B28879428ACF67D2EAD5286A641F3A3BD3105180D9 D13A6F7FA669BE8DB6145728483B3532F7A32C65E4BED5AD3D797BB13164DF47 7B6DA069C09283D2261306ACFA463F763D3A4855BE3C44C762E4109D5E651D44 156B1D3A14C28A220B3FCE845746B0F64018C70AEF483EB836D82708131DA258 B97DCC67D9421FEA86D243B72B4A26E6EB9FA71D2704739691A94044A2EA077B AFE66E0E1B3CC618AE4BF5CDD48F7DFAB2FEFEB6378EF28F7F6D62917E84C754 B2082E77ABA8AFD1BCC907ED41C60DD54456837EE6AC278BC6A19547E639257E DC0D5585A25A7F6F0F109CF2E66E4B390AB34B0C0F7907DF5E0A3E286C86B4AE 137314BF5CD95436926D7CA4B5E82CB95E05E049FE0BFA57D1A84EBAB7C662F1 6C7A9E7DCE13CB19EE433D849D75A870069BC78F19C353D3A4A3C564502D7658 02B686CF253B3B912829A9C9730D2A479A173A5790F43663386E11C2B6E3F11C F5D41BF3047BE615C1F72ED970CC139339A03881525EE426E058120003801217 F08C0BC28DE8AE09F1BA3933E44D037413ACAF1F261556470C9B222F682162BA 79A87817A1B40973508D741873B5EB6E015D6B08705DF10DD5B3914B9E996CCD 8DCBA25F0E7F989344A0280283BADDDB11CB98A12AC706330867432E0552C8DD CE26F0C492374F061E9587AC717202A4F9F82A6E9BE1BDAB5C068D9E406F168A 2917C71311C9D60452BCF79D153CCD00219EC0726E5BFF9C18A08E927810AA0A ACD942641C7E4F2AC05927B7486BAA61F1795C082E4982F60F0ECFA4D7E3C33F 6E324EDFB540EB2FA93A389D8A889908143414E23AF62381216C3C604F451650 BA3A7A42FC5AD6E1F09CF32B70CBA97C9D6D7F691F489043B7D9157919F8DE8B 01A370937906EA20537B6BBEA149D825F2C0572C3743AC7CFCBB6EFAC97A6CA6 26EDB65049E98D5FEB0BD959DB874D33B64EA9D0771F27D597C85282516C7618 AA58DB2198D9052FC332548141CBA5C85C25818A46CE06F44897880F64586657 4E17AE89CC3C36E3F53B92C51F42CAED81A9D9511AAB19F5F6342A2BF29FC209 71E6C47593C4D3950A501D1267C62CA2C23B2BAFDBC3E1C4D44E32AABCE86660 90BC5C9BA089100EA87E7516560E7FA59CB228D2BC62E85027BE7C32C1438B4E 05FE005D93E094190277D31AC35E0225A2A85C8D0EF1203C9C02E2D88E54994A 5F6024E874B13D82EE33842D8CF2862AF7933D9C7B2D49F6A1A13C3FE9036796 DF4D2B622BC4C4AF54DE615054D037A508B80F4AC26F68621CA40FEF47DE75DE FD61C0B4597E4D57CF488461AD466F6277E6D5B77E2C0275E4031F4F3A92F662 BEEE560B3880FDAB3D6159E7776B9206DF6E89DF800FAE288B4463D69DF5DAD4 88D926CCB18D6FD32837143066245E34B5A89944B8BCB65D9C54C51358AA2D7A BF1D5B647B9BACC48A5DD506A212B86DD2C510ACA97BE2AB191C71931FB95F10 BC4C0CC158200B540177B787F47DD66F8E8094DF679C9DE6545BB26EB7B9B4E0 CC5FC6D94627BA908DC4CBBAA519F57932A62D26A1C68C41F56508DFCE44FA55 B370A3A23247216DECD496B4AF8CF0140AA57592C238F53657E257494AF56AAD EC820D4089B3CAE9E0F77A3682EC8EDA0C8BB916C309C32F9ABE65F95F9F8DC2 F00A5B398878E85DE77FD0D7E717552BD35D67380F1D12CE47AEE2289C065274 A8BFC73CDAA40B3D4F9F430A8A8E2E22D870CCC7C29B23C2347A971DB5A4EF76 F60582DB661D73775AE71A16C2EEF0ADB55752078CD49DA0711F859F59EC7553 6FB05727F73187529B9356182D95C02890DDE6520EC260037B562BBD71F67162 BF19DCBF9C9844055561E20C5986F0C7E226B77BE65DAF179D469C842DDA0989 FD661346E1255204A6657F80B38C4214103FBC83C2B15DC3113748BEE7AA1427 5A27D978A8C3D2403F5B5FD6B77298D39733C40F8DF24A6EFCE78BC9D44D73B8 43C56034D1E23BF6772796246233137E3C94D186577F7FCAE292F703E68F6886 E79E1C8D98CF1CD90DA98FD825BA85CA5E386C99975D4889EF7380475F67F5FF A5F272B385F30A86C7FE51C3A67A22E0485E63363950AFD46BC336A8DE20AB79 85D8CC6A15BBCA6DF69B87188E4640ADBF10F4BC0B9D245B16545896EA9DA961 27BB69311173D72D9632FFA813870A1E6ADDB7D1D4A303C7AA9F2A167B63E978 E895A4CA3BC2EED1E83FC745CF676BFA24FCD0E3C7888592BCC6FEBAD4BDCC40 3B76C00B914AD8FE0E8C1DDE20FE55FA5F760A2979BBB5BC4A20A1ACA9D862FA D4114E2C1DBFCC58676469C14AB34D0BEC1CF9B271156F4A5232BDB769A69E56 B6107401B3BABDC2E43F39E2BAAEF23D98A0C3A28526EBCB77CDDFE047514574 374DD6DCC1E80EBEA555BE043521538C56FA33D01DFCF3C06BFBE13EA4FE9CBA 18FC179A67F11860D92AA8AE47682A1C75451E385688DF9F128E1535883A9BD7 31B62F63524860BA011E1E7B3100294A45008390B796CE9A762115B5E3E26E4A C622D53D6B2A0AB23E0CCEED72423333F6436976885A7DCE75419B51BEF48E70 5AD0B74235FC4465FBA63F9BA1F03AF40331650310F019D395AA57DAD54F5F63 6581583559459892F50B1932E11F3E1BAC4DCDF5D3F73415D57A9EA7C1265434 C49DD4B983DF2B9F1C21937ED35A5ADE36FC37EA382218FB551C746C424193E7 7F4AA659453E5843CA47EC67D81BDE1999CE4D0E42F811B8807300D915987C17 86D8B4C3E0FD40A8A8F440E97F34392DF1E3FE2C002A9C21625CB59ABF8D9102 36F2BF46997300861D6539F001358A5E473AB4C1A11F631D6380BB70098A485C ED278CAF744BC0241E7485D79C97C3FDA8EA58A199BDBE051204DBDF7D4889AC 944359DBA0B9C7CCA5C6F8583941A9A3BAD47D154818BECF723F3794B98F1E61 44CBA525E3B93C8D0E78297D00B53271ADB808D584DBCADB9FBA43721CF7A8EB 484DC886CA87C94F267BFD391CD036017D180F5E3FD8C2801678A70C16702F10 74CA90B2EFFE40A2F6796ABFA23D68F09F796BDBDB8913D4FB073B1100BB23A6 7DF9063944DAD91CE425DB34A8D346D000009FE0328B34A7EF91A6BDE25AA218 2AB4394E2BD7FCC8FDE8427CA57987735081D5D65C3F318C8DC7D8B5A2F04B40 C56F65897622C0D5A15A9DD6B109F17C1E17E2944A3A1798ECF4B2F649924596 4FCFAF4AD7300158A4290734FA40D1E22C918384531689C93AE7CA7CDDE0B2EA 28FCE2D53B54A70783855DE25C80874146379EDA12989F6D90C49BD8A0603088 8185423141C78608DD7F7B15DFEB6C79A6AA0727D574A38B7A644A82D4AF1368 6F8EA90C4F95B28FF1091EC76A5970B14445BC477E5110B946A0AE1C69035BFA 84CAAC5D103528C3BABA9D30491AE72EFB2160B606B8BF14EDCB6E5D61C76E19 F231AEF93CB9FF91BD4A8718BC0C355887328E7038D33BB3754621450E2DD42D B9D886C1FBABB2255D7C84531772EE8D7118ADEAE92212945291B959C9A10091 32C1B754C4C4D35F24344B36B60B8A9AD3B910E11B5C3F252AA8871E695A5AED FC4AE54270C1F6895940225A2BF0339363D8FB2D2C173946B5E37CBA23EF8136 528FE4668FDB6D04DC2C5DE2753FD0A27E6DFEB85B353E95818BB05873E4DF91 75EABD59037D887716F92A314B801CA0CC9347FA78E4BF313E882D3E73EF020D 3F0D4CBBFF9A9CC7D33D99FE8621610F33051D9F13A4FABF45D39B720A3532FB 5BB54ACA17A63BA57991211593946E44EACA9A5BA67DEB91B42CECAC4A7C2AD6 6F610786AE32934ECDE31949156E7F20F8C726EC8A1D9976BE642F333455E4AE E67CB174F8ED9A8F16A00289A043E8A57F77F678E72B454BA5CEC060D7704642 517F0B27D0A0277CBAAFD3EC84B56CFAA461FAC48EE7D6FEF88BE48E0DD57248 6A793161EC79569BA8C1243CD01CED52F6133030DCEC7AD8606565D1645E7B3E 52E32DEDC675C363327B77BDF0EC42C095086E0797795F06369E6C86CD07C0A2 8655D29533E9C040B65A8ABE0AAF6D5D72ADE8FA255ED2E2050D6834B8CFAD41 76FB0AEB99EAD059E3F96A2DD6DD23B4CAFA745269A212237B08C1DADE5815AE 2FB9AA1A6B402B8961BD0D1662CB0C77426AEE83A6FC3CC8BA7D60048B97A47D 8B5F82E45691FF151881CB4DC6BA60263C90CDA71EBB6E836422B381FEFC2085 4B7C81977645830DC8DEB293B2B726DC52A39D7C920D2DBEB3C1889B8344D109 9918DCA3E3C701343035D0FB04E40BB65123BDB46BFCE38130F6FC4D8134A701 5F8F10D620BAF4B0B41E748E4688954B2DF462450D60966308C1A9BF19078069 E33C5B9E6D973D731BFE417DE903BE16F9531FE90002C9B2AE690936E1B6A546 B3A0986CE710D32E2B21380C3C25B6518AFE199C3203F8E8E608C927CB6ADFEE BB87C54242AC55E020F969048CD48EC147876854A5D920BE597F60EB1E1BDE34 F23455A7B08E51BED617CA93788C1BE5EC101E3A504D9DDFB3DC8F212FC99408 2E260E9F82F46F06CE06E6F32666EE9AEEDBF41141B025BDC55A16DAB91094EF B401F4CB493048BF9837FF81A290F45DE6E6E754584B1C8627B907519D2194E9 364384F1796EC411AA455C154CF2B4AC3CAEA2EFDEBAE6D6A9009AC42CBE9A77 1F65A30448BF3166618304A9B342F92FEB19B114F63907F660BD11F94B01F0B1 265EE0EA8D4B7E0917E77073A1FF9730C72D9D68E9F551B91ABA39178F934286 4D480FEF7143F9CD6BEAE8FE1313105562749E50C19840857F01240A13FF3215 29E17622F177F11CA2D92DA19A691EE0BA2765D792A064DA27054CD5CF914EAC F6F0F3B052DE89F97CB729CDF46DD5E879285F6CB3D5C2071124D0C8534586F9 045E9FA39C30E536B79BEC82553A25170E343FD0C70696D806CFB7014805D359 10817EA494046CD9AA69FDDB24E58E3184D918B970C2BA76AB12330D2ABDEA74 987F8758F943150278EBDB17EBEBBE9C6DD61B952DC8BCEE34277F6AF88992D8 A31A64146F2FCC7C0C97306FF87329EC89D95CECF329C6585BCCC3765B6ED3F8 8D25DF2C79AE2D22033059E7AB49A2F168537D061531CC190BBA6D8082E27BE6 A6EE7FAD88871A41908BA7299E17564BA547BE2B2CFD3D71A9FBC3B8227A3EA8 2EF7694D0F449E377E99530B0955B5A927965B3D9E8D9FA7FE64F65FFB207719 560A6FAFE37BA9EDBA5102D07548AEC21F396950EC3176CE4DC1872BC3E944CC 029AE9F11C76431963AA569F6019313E25AD4483ACFBF4F4F53F2D0205B05779 127A38D67D49811F8497DB5C235AF16037F4034DC50BE45F8B0E999F86353132 B367B065F77BA00FDBAC7A0544D9568B60C6A16D35D398BE6730051E53643BDE 6BFF07CFA7FFF369CE8EA801C5A48B333BA5ADFF3D1333357A59621E765E3A34 7201965228EA1F221B859C2A046F86DC0D5F3E3B8185F100330A859F916E6683 7C0EB24AA7385EC5400B007689DEDF3BE1CE2F99FE7E75737870DA79588322B4 442CDF8D75C88409BEE5807D4E20D3B3721B8D91392624B48C12B7C047D3D6F4 0D7F0CA1D835E17E903E66C60278D18D1B82000BF80F08A5717104729F29D9DF D735AE929F6BA4420DD13F56E258425311436A69DC1967B53FC08280B92397C6 719B7E98B2FEA92947A15A8A336508E8CA918A1DB1D8781F28A5D5C0E7AAD338 43C9EDEAA680500E4E5BDB140DF2194882F3779A8EE9168853BE95BBC303ABB3 A8350A3511833F3A1B72AF1D777E7FC4BA021BF09561CC6F3079FFD5CE650EB5 2B5E67B59964EC8D3A587FCF16B26EB5C3037A11683D53F5A5FCC7A66611425E 3B44D70FC5DB89A174F96E492C0DDD8C5E3615CF573F14A90D463F6F7999983C 8EAF5678A7B60ED40554AE31E35A2FEFDFB14F88B2193301FBA04A95AC647371 5570AC83FC40252AAA1ECEBAAFA007441D5A990B18000D41B50B3CB55CCDE58A DC3BB1E60028F0C98296404B89E26B289A17F79658F3C228604C703D3706BAE3 8ED309BC64E7DF3B439966446BBC96335E57033EC28A6A87655F87728E8D93EA 659B87E415E1B93C6D5E5E55F172913ABC39E4B107688D74B88EA9CB6FB93184 23B9657745796B399E6C447A939CC84B3EB006E4361E806EF393AD23A95F6D7B A1335DEA6638FD856D7D4519EB1E03F66B6646D548EE85CF3512D2FD6D435372 13C54D82745D548F064C5EBD5485B0FF75E78596D7D1C7892B9BA78D140CDAE6 816AC1402829B752247D8B9EB8AA83EF167CFF0D93D0967CC628C2E67260556E C673142744A7EFBD1F3B5B3BD605EEE892C02F461FF694E13C31F59C2ABA7490 A2D5A22D752B2757B2C2ABFDF413270D121D7070C9BC14BBD6D1AEF07C6C7109 F916F33081445C3275655926DEA202C4909A6A7D878F05F85DBA05260851B5C2 90FCB31B2670DD1E77E430CE0C67A9B454CEA43BCB3015D4F18FEB4D5706A8EC B5CD452453BE66BC4748DDC6B370BD670634171E8DA59AAC16855F50BE06696C 5FF25481F622E4E7A111B8951CC137D47010AAEC4A47364C09C6891F92848E04 032760DC401EDE04E45ADE3949F4E52DAC2C2AF18EB699EBEDD2D8FB36E2E1A0 B2EB71652A57C9BF038C5DABF3C2383A46CA2849789E66B7C0C21C3DD6443495 FE30FDFF46D0E66301A58FDB3FF827CA150B4E4C2C10ADA393C2062487140CA1 D63DD931F3B334F1F62D2F0737290C569E6A9AB51D96D88BA52B680D9764FED0 CE5541F77BD183E4B244B508BC95E3738BB430A16854B6D4AE6923F6B8237371 1DA9DF0E5751FCC670A77781298AA820DF3AB88624E18C3723C75C304C8E2C38 C5368797F73FF39003B02F846930B194353882D897775605577CB96C233E6B3B 9AE933E1FF8A5B9EAB0C8B55CB6B06030353EC0047804B0B0FBBF78DEE3A286C 353933D4291B6347E8EADB4BFF4C7599F99C7ECAA706BD749F775EDBDFCFE1FD 48FE1F02BBF07F75EE9D88AA8F076B3BB6E35957B14BC7202ADCFF89BDD9DA53 61F9AC75BD3BC992FF271F0A4F3A14C51CDA324A72A3A995851FBEDF73A340E9 C6A72A36771F9F05C60932D2C8F9FC510DC75AC5A03354343650D8A3CE51D1A0 94739C66CC1301AF02286352CCBF936CA06DE2FD83F28B93234D61C3C8E946BA 07A6F248EC71A29089DD1FEEF097200C9F1182FEAD2F8BAF89463FAFFED7AA0E 5B89BC7B1897714C8ABF1E93EACCFDCD8C5733137A239CDC381DC6DEFB5F024D 2A4C84E961EA0EEAF3FE01B50C32205E967EEDF15C51F4A227AFE174E8067D86 8A7B65E9067F7245CBC254050006F9EBD87DF2702C858233C6956701C7DA9CEA 09A3C000E8012D951151B43E1DE9464A0D96AA2A057ADB2C981549EF01325766 9EDC78BB1C914AF80FB29D99F6556FFC372A8B308284D7E27791E64CCC1EB575 C150348284A5A641A9899B81791D3DC2354F87AE0155618FB832256C27B5DCB2 A22FDE7BD264A9A3CD2C60038E9C96F24B5A10CC689725E8DC250F8394C90BDC 7431F236E2401D753CEAAECBB7091BEDF125735934E69B76C04D4DF0D2118525 4068A539BD225C73CD85571D8BA8E17765F9FE7E25AB5CFDB6E4D6E9C8472E5F F67A1CB13198A5B746124060387B4A8D1353FEB6D89B0891ACBE554E89FD9562 AB94993D670582EF246C136073514FF983A39E3C3EF66D5BD76A384986777FB6 18894A4449EBB1BB04D08EA7AE9EA79DF6283701F7808053600297EFBE0AEA92 3AF3F855E074195412EA808D0172C65B76DC91869B4292B0F5B1004BE3EC2154 7EA967AE2DD9E3E446CA0C57E4CBA72DDC24188CA6BA785D34F79C3496813230 136A66BF829478AA09DFB377AAF1162AFD8F005F1BE6CCA0FFA80C0FE937CB05 0DC9777F0BC393095C40731F0B69346E86C1A4709005B0D2D92DACE0AD2776E5 E4C2CB4A5365F2160A1F13E08777406CCE9FD46E319EAB1A72B8193FE212C344 C14AC52BDC064025960E9091F953FF1732EE80E013C73F51E08904B565DFA6C3 EA5AA65D27537AD479103E32CC2439B45816E1C9E4F79220307C4BA7AC32E6F7 508AD1D5D16508C42BF8B17BCB01CB945F08D64E2D7294C973462204BAD81DC0 614D09E2C0EC1A25C60F8F53C08DCB6EB11AFE3A930E9685B238ABFB0754938A 1C53C4E42A01B623256B7C4D03780E855BD2619A6369CAAEFBF9B8B409CA7C7E 719502B3C13C64D559405F771DD9082609CF4DCF0126E462397C2192BC4F0C27 15B2CD1ACBAE54920346486EA54D248631A51052BB389A591BCC6605E1E17D11 CE28CDDD797BC3EFA6F370432C61B1B8B5B228D71A200BEBED3C5D8EC41EE6D0 7E7F15E268AFE758A797CA5576B4FEB801FB573216B32FB5EF1F15EF822C4D4A 19866DF1F4AEEF702F73B22F7BE4B3127778059161383C3863790359B65EEC5D 8FDD44BA6558ABD1AFFEBDC7372F6235FA1EDB103A1073825088A69D636EA49F 65BF86B3685E2CC2E75C6F4A19CE681B660A13B6A769C67CFAE5E8F66A3B09BF CD420EA77A3CD72E040A8042C2A1748E7C6E44214E7F96C94D523D9AD31FE24D 7F6524281622FEAD6D1CA745A6FFAAF838D7295451887B4B1DA1DEB23DB7EF27 570F0C36868AE72A06739C46760BC9C601AAB9CC068989C37ADDC747F2255A24 661B2B6F6CF6F159BC5D3EA424AB5648E8D8A93BDD1543BF1024BEFEBF16ED0A 3A12DF2CED1CDEEB8E487AF097F0BD1ED20D0968AF9454399F21F313B7EB1938 8E7FF502227B57ED913158B2C2DFC2739174DB634C25B46BD5355B8AAA82BCBA 93AE6288FF3A2B26B8D39812A02899433D1EF7C3DF918B989B60A5DC6CAEF192 285561C24558C68C260CC436966E4DB57157EBF05CF715A133CC630A446B7166 B21CD9BEE2AD8022AD06F7AD7D4D00E034D80453385FE210132E837968EC846D 3F940E7A5F1CAB3EDCC6838B7794016EB3188C424CAF63C4BA91FBD7A015B88D 9E5BD3CE0C022D4CBF00205B8826BBD9EA1711D18DA6D8769748B0A0BDA8E9D8 21E1CD2ED5B861D27593A5D07C14E8D1A04F90466923F4A804CBD2F3A179EB62 3518E2A1432328C96F484D15655773E89CB6BD3B02805C2D1449973B9D1073B7 7D62EF61D600B9C72CE9990A9ADD8A888DEA6686F72F14B75C6E4D3D1C08A32C 87AA9A47815B52A2C559AD8DF9FA2EB23E8F2F2C35C2CEC93328AB9093BE0E0C C638D5269E2BFC59BDE06B901F38EDF8BBD056940F27E29DEAF3290496F40977 556CA390BF5EF5935E5242C95A52948C1C9AE331AFA64C4D857DE76C818AC0CD 78348B7B51392CC55339259D89F698E2654022D1BCF6B38093D590DDF9E5C3F0 DEC73B3D898537330DE4805976579718936D3DB540C7E93053480E1E73870EEA B98ED93EEA83D3121EA023B1FB7CA1579DCF26F6A078CDEA42C47EC76972557C CDCC5F958EBDAF69A0B5EF1D42E08457DD2A08532912CBCB76C6CF9D35AB6F09 5727F5BBF5713F9C175FCBAE118E158F1D5845D4AB4D06E69BF1414D87D23599 A3908255559E63733246B68EF9BC252C8C8EDFA0550A686758818A57CDEC097D 7CCF8B7E59A3F029A143A1628EDFDEDE08200811E7112AD2397257BAA9E27DBE F035D25E649C9B65062453EDF8ADD9A0C25804FB3500E7B569872C1F3741E410 83334A38955E5456DEDB4EA280A2C39DD216A6CB052CD9DDC9239B8381774E43 BA5D40BC51A2F8A0F9735A0EBBF40AF7F0E15D5B0E8FA1D950A242F7993F8FD6 0A45044A15F901C266526031C09AEDF2A25CCEE020C71DBDC9C86AA906756720 5419EFF825ABFF5F5CDB50E668683A7EB5EAF82FF4CD3400ACADED55388D8CDD 988FA7F868A67E09A1 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMR7 %!PS-AdobeFont-1.1: CMR7 1.0 %%CreationDate: 1991 Aug 20 16:39:21 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR7) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMR7 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 49 /one put dup 50 /two put dup 65 /A put readonly def /FontBBox{-27 -250 1122 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF5B8CABB9FFC6CC3F1E9AE32F234EB60FE7D E34995B1ACFF52428EA20C8ED4FD73E3935CEBD40E0EAD70C0887A451E1B1AC8 47AEDE4191CCDB8B61345FD070FD30C4F375D8418DDD454729A251B3F61DAE7C 8882384282FDD6102AE8EEFEDE6447576AFA181F27A48216A9CAD730561469E4 78B286F22328F2AE84EF183DE4119C402771A249AAC1FA5435690A28D1B47486 1060C8000D3FE1BF45133CF847A24B4F8464A63CEA01EC84AA22FD005E74847E 01426B6890951A7DD1F50A5F3285E1F958F11FC7F00EE26FEE7C63998EA1328B C9841C57C80946D2C2FC81346249A664ECFB08A2CE075036CEA7359FCA1E90C0 F686C3BB27EEFA45D548F7BD074CE60E626A4F83C69FE93A5324133A78362F30 8E8DCC80DD0C49E137CDC9AC08BAE39282E26A7A4D8C159B95F227BDA2A281AF A9DAEBF31F504380B20812A211CF9FEB112EC29A3FB3BD3E81809FC6293487A7 455EB3B879D2B4BD46942BB1243896264722CB59146C3F65BD59B96A74B12BB2 9A1354AF174932210C6E19FE584B1B14C00E746089CBB17E68845D7B3EA05105 EEE461E3697FCF835CBE6D46C75523478E766832751CF6D96EC338BDAD57D53B 52F5340FAC9FE0456AD13101824234B262AC0CABA43B62EBDA39795BAE6CFE97 563A50AAE1F195888739F2676086A9811E5C9A4A7E0BF34F3E25568930ADF80F 0BDDAC3B634AD4BA6A59720EA4749236CF0F79ABA4716C340F98517F6F06D9AB 7ED8F46FC1868B5F3D3678DF71AA772CF1F7DD222C6BF19D8EF0CFB7A76FC6D1 0AD323C176134907AB375F20CFCD667AB094E2C7CB2179C4283329C9E435E7A4 1E042AD0BAA059B3F862236180B34D3FCED833472577BACD472A4B067A46F8EE 2AFACDE591ADF7304939394F221B5B9B316BC47DC7772711A35B466E1790D4F5 C02C57DE57A0498128C6041CB7E702F4D8500433633B8358C438237BBA39C647 F659FACF75574B1AAD3FE61FB97D6C5D0B19E4AC762321891092E73D192C4816 2F14A6FFAA1B22AABB65E8F611F1E9AF66DF68DA1B2B64B4CA8870261F8663FA 28953254FA64F0AD6EFBFAB15830AF856A65835C803B70963595060F91F4079B F8BF5396F04C070254AC5DCACB20C0B1FADD38825886322366927C97E3C5AA1B EA858D5974EBC14D17D4ADDCB3C7EA74A8A2B75293747CFCE0B484713D631F95 43BD5A359229F1276D2F652078ADA5000D1E060CE5CDF2E57401E487F3C10975 09AACD27CEE8581EBADC25D0FC9CEA530E88E5E89F92A63B15D7AC7EC4084977 B42E77F04F96F37B1D2A054C1C88415FF19AC8BE2D58EB6F50DFFE53CC72E630 719A920911EA94AA5DFEED6D7032F2E89B4707625FEC73D9250DAA58BDA761E2 691BFBD9416887C25AE99A7E4840670C502A9F15282D7AB448A58D722ED1B689 C11D1294E80BA0CAC6792F4B8C28D7CE56F019D4514391F9E841A51D66AB1A3B 5FD64644AAB5790DB5C4E1D00D9C749A057026BED785FDF5D405193CCC1C53FB 35256D93F949BEE6A29641725CFEDC98174632B33812E335EC2D33F283B1AF95 2935416D4B20F95A997EC9A08C58D2CCE3F579D648599F1C12307AF6923C1AED 6CA31D4CA6C50C0C23AF8D6363A649CCD5D645765F2889B25B3E0A2A9C97B22B 2E5282B4E76C178F50234BAEEAC278B7DC051B15F93FFAA917 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMTI10 %!PS-AdobeFont-1.1: CMTI10 1.00B %%CreationDate: 1992 Feb 19 19:56:16 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTI10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /CMTI10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 12 /fi put dup 45 /hyphen put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 121 /y put readonly def /FontBBox{-163 -250 1146 969}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 9E3948FFB0B4E70F212EC976D65099D84E0D37A7A771C3101D6AD26A0513378F 21EC3643079EECE0C9AB54B4772E5DCA82D0D4ACC7F42FB493AA04A3BF4A1BD6 06ECE186315DBE9CFDCB1A0303E8D3E83027CD3AFA8F0BD466A8E8CA0E7164CF 55B332FAD43482748DD4A1CB3F40CB1F5E67192B8216A0D8FE30F9F05BF016F5 B5CC130A4B0796EE065495422FBA55BEE9BFD99D04464D987AC4D237C208FA86 0B112E55CE7B3782A34BC22E3DE31755D9AFF19E490C8E43B85E17ECE87FA8B9 1485831624D24F37C39BF9972D74E6EC4784727AC00B9C4A3AD3DA1C22BD6961 7E0ADAF55422F22ACA5E4DCD4DF9FCD187A566B7FB661D0530454D0DD6C6C50A 7A3875C6CBF8EC7769F32A1F3F7FC1C072BADEC97794D4E90E0035282A170402 356E5A9CD9ABD80AC4342A5283E458A7269252F4541CBB6452B39ED54D336D0B 19928E9CD1AB26AD83EB209E2EC75011A2643813053B5DBB0246097C4821B5F2 C92554E9140BE35B2DBFCD98809A8EC9FC910FDE9E0D86457C70ACB056EBF90F 244DC0A5BBD455E15D6E3180311D52CF50B0BF7D0A7F64F3A1821E0AEDBC2E7B AEB549FE1D51088C153799C6E089B5D5D65E1C4E2D2B430CDF1FFA23CCB25D95 5C4DD885310A706B320AB25C8D742C6F29953254FA54DAAEE60ED477877D19BC D28E9AB576B0EA088171FD000B60D73B3C57F754BC07EBC9BF751B7D2B32459D 993861B7C4B0D98C422A11BECEF76F4EFC0ECAEE89723E6CED53E3678D733363 2DF068AEF0FE7DFB57393BDAA439A6A4C396F86032A98009EAE1247B7DE83B3B E46DF2898598FF5E6CA6953127432A967E4FD41CDD60D6E413059A58FA556EF3 309178B57C16A763CFC9BEEC276944BDEA255789EF4E1ECDE1EA43EEDB955513 F42EDDCF39AE522A1DC2D80B2772B05DA60F3DC15A815A6BAFEDC399C7956E75 3851CB3588E22936FBFB63A58300298B11C45D82385C083D07AF133BB1BC941A FDD9F34D5E0B8087EF2A58C54D8AB7580EE3ED58AEB83B72CB9028F472ADBF11 05A77651F118824F6CD00209EFB60C1D32D46A78E8C8DCB8B0E742828E3B7D17 DF5200D68189C91FB8489CDEE8BC223C4281DDCA5F7DA80BD5C2D66A14695EA1 5F05E03500579ADD440ED2C57F535807560C6FE3873143D792734FEAB93AE8DD 633BA6FC5683083402BF086D23594AAC84A4868AFAA32AFBDF86142B350F8F62 E2531321E4CCF34293024EF8AB617BAB11A3A5EDA03CAC5AC431C893607DF8E5 C3DC8646027A7554625A16FD184A70DB5FE6DCEA366B64430A147144CC9839F5 72829FFA42BC3A8406D680E44A0305C9C9E265E91AE82EDF30F73730DCD4AA24 C5514CBF11876BF4739C05BAD764CF35EA3C7B19A12D858BC442592BD6A82DC4 57A0B6B768897D73D3295AD195E38CFE27D45934193F717681C86B15B9C71B3A 68B26BA3A4B397F75431EAFBB6F976AC3DAB2DDFCB5E277A14D8570B0EE13AA1 19B3840625124C767A22ED6273A296034BC7DD936FE6DC4B61AFC1999E954936 90BD60DDAA0559735E2D4016099C5A85F894A4C1122C84CE00AC1CCF894E7CC6 3717C027926302B039B637B724AC69DA10875E3FE2BF3D386B58870427AE2D8B 98992DCAFD86959A90B0BDD412162E4B2E41C7E9416A9AF93E6C527008FA0CC1 728BED56B5178804C0146D59298E74D1EABBA5CA099399A856C7C4DD67B541C8 BC07A3003B82A3D462CE9E46828321BC8A24C6714AA70106BDA22CDF748C8A69 9873A6665AB4627D56DED6FEABDF08DE197EC1668D120ECF5E4A98F3A46FEFC6 E07C7BCC9D25769416BC2E32BF7B771CC70224FE2540473DEC160A10F081C365 31EA9B1B5A2A4C304971BD26D79D442CE705848CD359222BFF6DBF31BA33F7AA 87AD91BE43A9CAC2FD1A07AFBD1B2754A68F137FD55AA83D961D152F1E8C2F9A 6229ED9BBE10775A174B6561B5CDB57D43B64592C160912BC53E6C6205FFCA51 8FFD62CBAACDDDBE4F940F84A9E9EC003B9AAE5088CC8F45A0F590DCAD1D985F FCD7E6E9B30A33CC8935B1F8B37F5AC8165226B1374869379D20FB3F762646FF 43B879F33E8014380B4D0EFC350BBD1B70D5153DFBAE376DADB641B0CD3D229A FB9B86A2B60E5F7E4A4CCF14C17BD08D0E3480D12E0D38933BC40F977F77F4F3 A149BFC34ED8B62D1BA1D615085280384302BEF7EAE1E10B24933B64A132CC97 2CFEAF329DC02B87F9702DBCF9E14AAAA83D6764300AD4D7084C014579AC7F57 737C53851C9434402DCC81AA368BE4B4B70DB98B00EA36173B02F3D16B7993BB 4A056268A9DC09BC887A990085D57F04020C5E18A45F9A6C6380FBD53358566E B5DBCC2527494285D90D3BD8AB18333C959D0CBA1F66682B7D6747507901C2DB A4B453901F1D196543019ECA5684AB33011872D91859E0BF6FD483FD8612CDCB 6C91B7535C13B80ABB5B2457A982FEE71AC0E05859301A8690404AA7E8D7BDBC BD2683D2610D29A6A0226752FB60E7BA196425137D71F3796AEF27043E2DF399 A77C12DC6AC5F10F4610FC9BE9E7DC86412DD568E62DAD05E4842EE76B8275B0 B647B89CF8F04766C295EE3FEFC7EFECE260CEDE64776EC856CE37F9D9515171 799EC63BDB6613C5B3F1C2BC2B8F7A405C9634F4B1513CC511D10D33A1E4C943 493014490558A2DD44554CF974669146ACA6E8428B737769E16E1A08001BF221 307CD7B5568B244488BAFB7DB1DBB3DBE0375AD907ADE6662F14CA40298C43B6 589641E9221535E1BE84C48F1CF09DF6B01AF2B800D5F04335EB58029DAB4B7C 48AA1C090E45F677ABB6891F9144045C53DA91950EC6243436953BC19AE4A0B9 03DB5C3D30CE06F4FF67A4ADDA974E8037E11032B5BE1BB2F0FD843E1A6F0082 3D86F5D6E3CD327BE9EC656D0FFE1C5EFFDDE1D4C8789F12BA797E58FA7E95ED D0603FFD969458CD2C158FE3851FBA0AC06DB486F0917AECCF41E149C5715012 0AAA0F2FFC787D8309B7D9DFDC58469857C31892DCDA7D0A2FA5D9C129572ACC 15BE9091B6E9AE9FF589F97C2E4D7168A53C53A7F03C7CD05BA8E168CA5F997F 0142D51A9D3D49277B14E9D8DCAF7256476AE5EE76A2708FB8FD6E128B24A370 8DB8A89E172CF5674AB695F350FA290F63A57BF812A2885BF9153014C4151C57 41D3597ECAB73DE5323A9530A8F0E61D40E3F632E88E1B23BA27F92355E55702 40450C8918626134CC0CCE28912B550643EEB9D0272C7E17D53FA5446455AE17 829AF937F4750AEFE8396890141C72E98D5050033EBC59ADD6639AF1599D998C 8CD434C53BB9EFA821E77A77BC3C2700CB6A274AD515A906FB42F507AB468472 0547E7A20E2E8FA1237DF93A0C35E4C7B187E67A3DD9EDE1635B64B8CED4CDCF 90C60FB69B7FD09E6F98ABE62A2A0A806CCA9B4E038BF6B35ABA1EB591518449 A71E4A0F43F3DD33284F90C6BAE962A664DA7EAC9519DB5D56C079BFD20C9F17 F36A1E2166B62D2A2EC8140223A0B2DF6F277CC43B4A9747B8F4B89C984CAB10 AE75CCA935ECB7F6AE48716A40E83876942BAFC28734F382988F08050C2BF247 A4B65B911F5F9E4F9FB09AECDA4BC476173C9A224DD7859CC4DEF959B42C63E9 D80E7E3D326ADC7C3892EC00DE131D86A23EEB15598D548BC7E79D056E1D35B1 8C681E874961A4BF983D5042E698BEC61D95B4A0B01981DAA60F8DD8E2B0B0C0 7C242B3353333A0AF36F6D6A8275122574926C7DBF2B3D4EB8D67B13973DDA30 FC3CC9510635AC7E8E4113928CB24E091C9BD251205B03593D8D33D6865506C7 F7F82E5558340B800B3F77F40B795CCBFFDBE202638C24FAB114B99664F8E7F7 1BF0274D39343E34159D52EA4EB074DB564C3C4D5DC60312B63540FC06B92E95 35BB216D17F0D4596F602D9D5B8167F63AED8274850D7404F1FEFEF0332B6C92 7E423DDD9B51A2FD4956B271C7B1CE6C9E13978873F9884278B919519B6AD7DF 15204C2A5A092CDB1A13AC4F3141C5FD96D23A298D265196775AC7B2B618E558 DAA34421F3E6D52BA4451522EE74D7DCAD72E8BCE1DD31B3B9C1B8FE3B503792 A251F2F5299F8A98805AFAEB857DFFEB8F23701F5996C3988171AEE157B77B57 7AAF3E67D9AF90ECA2AB750F08AC49AC5CE79CC1C402410A532EFB1DC5658286 BAFD7669C1C93E02BB49241AFF07FE329B90A08FA598724D9BAE2ABEFC3CC96A 8952A2A6B5D43A66FD85A78FD2C691C533CA3D9AF943C110DD5E756CE4508421 A6B95A4903CF3D7DEFF2C15CFB6D9A9420F788868223FDB2C9C620AC88879F3A E38F29053817FCDFC4F9FA38F1228A79054F52922770E506763A519173689951 A823471381BE7018FFCCE0AA79C1A84038A52445A8C7B5AC1C249CAA0C8EF784 9AED132324A9543A1FE3DA2D54EDC9CEEC64F14170C22588C14F47E74F28E733 46548ACBEDD984994AA44BEB342C78820C573E3F25B80A53BC2A732698B093E7 3BD2452C3799C7E1C55EA5F0C4B9349B807E44C6BE03FADD03104D2C50518BAC 072A604C6A306EAC7E54ABC7C955A59BE3BE6156ED3D00BB0B052825D7FFBE99 581E48C57A3843466E90786C06D3BE05E943CBDBFE11047CF488523CC2B8E8EE 2BB9A235B99B1EF47155E65E815788FA97B83D5E191118427B76F70345A5C104 91556820105047DD7CCBAE9591FB1FE2235CAF3FCE18CEA0BF3E00C05B053C6B C61603EB7ADB681C2D18EBAA400C5E4D28685F6717E6235252B7D716CF714BCE A6F3E3E12B5DD2E0F0A343CEB159544DD36181E89595BAC600D84A0B5E27FA1A F6A9E4223AB95190356E6463E7E76927ECAFB0F65136E2A65631B2072FBE04DD B4C3DF12CFE73D7130B955B0C8AB797AF921820305065AFE0B2851D2730E5356 D833869412D8AA0B0946FB7FEB2FF567FE15216B9CFFF8136F6A68D867B22376 4E3839AC80B2BEB5388F35B5E16868D68070FCFC0F41965C4F6F0C3C56DABA48 EF72C00C542018CA719CDBE4B1D18E60FF8ABA04729D9216B45BB3C9A772EACD 787533A72E3F00151C0C732BE18F14D8CF0871EFB8123592EC5A90909FB63934 B4914845CA6CF47F9D5595552563DF007C1AEA6A749E0BAC9067AB0F49EB672C 0FE28EC4E7C4FF83D46140335935B04BCA8E7F5A9DD5BDF875147B0519673CB2 012B433194ED6C5D893ED46C59B73363A0FEE8CC0D0551A03F25D01E1F19537B BAA00156F57557D5662FCEE9317C8CB87FBC4ED973FE2194DB6800EFB3E006D0 815E117332FC492E8A7A51E121F079326E2C9C23561F869DD8AE1C7FE1C91437 BE76BED630BCD9178CCC370092902DC59303AA772F6DE08F58214D2F5D53C1DB 40C332044AB755C1F568019AFFA8CB82AA1F66E82E01953C6D6A04AFB716D8C8 ECDDB12010001ABF06E69E6CA36889F0AA8420473CD4676B6D77D531D95686BC 752483C3B956F193C0CFE66522265A24D719E0F46A8520638E3C24D469EC5285 B55325F3F903B930C6151B0C4CC10245B716155B0E31DB990ECCD43AE59C27BA 92728F255CE9A8F57DBB46E7EACC51B48D52AEC50A9DFB3C22C18C787C6AF245 B737AA52F48A53A81E28DADB8FC2B639CBD95A115147DAE6A195CBE8ED84D503 724396F0F3C5BE918E68CB8EC903155B69D370AD9ECFF7183DF50C162CA2665F 2A88AE0E43D3ABC0A38C50E6A7020AB389F353A4C510B915D4A03D13C6692E39 7D441BD0EA2FAA78F61BBB690C46364A119F022A8B479C189781273918293B5B 857E2E03AEE59434F2645C2741A80CE715935E0EB005163FA0708F1774CC0504 B6ECA0C7F07387BAD69FDC61275C633B8069B12CC051C1E3563139132A624A0A 651967CD7946E6BD2BC9F415B777A083730598BDE2302957234BC6C4FD142274 7BCF1CB84DA1D2265F32703F0FC00F51A64B3E33461DF10D2EB0F7E8A440B38E 4E0CEEDF79193DDA53C9D67427663A027F52EEE6C7DA55ECBA1B603864B4B4DA 2E54B3EF4A49ACC60DA44D9266E7DB3C0AD3C894EEC4B5BBE327B434231C308D E3455A237DD17F4018631F8607367F3F9D321EE5135092ED8E4ACA899A5C5841 C1CED5E3F48E386440AB94377E558EFA456C6F15522D368B8715924C7D594217 5534BE688BCCF88F440783953EB3467ACF7BB97BC72CABA262AD5AF6F1C57D61 903F91091116FA448A2C0006471A0EB40995CAB0C9B39D75292DA99BEBC5F942 462FC61A1969A72FEFC98ECEF6FEEAFD3EC2812F2A80F82143AE1C177C434900 8139E3A04944A85BCD457AAC15FC9CAFBC16123EB24950BFC3ECD61FA5731F85 4166D059BB89F51D39046A34AB62F92811D796F9E3BB73FD625B64E014968501 9920393389F5C3BA66138E8905A7C5E76E92A19F75CFEC0ED374662571DDE0E5 4B1AD8C65C31892B18DBA1638B1D09F48F738B327E225C79092F77F8A06BBA4D F536611B4A72A1B79A6BF8C8E49E0B3CB0AA85A1518ADED692127328800FA11F 4783509DF1FE0881B0B3A6EF79DA0E36A64DC0EC9FB250AA651E781423E1620F 986BDCFF14E6E5FCA3E637315A51305E1A541FE94C799AD3828F8B8599D22085 7876A5825691D65C3FDA416D675CBDC851B07A3501DDFB36BCBF7617D955F3AE 74111E7B3C883C2CEE67EA1F50B239BCF0181783B91D9FEDD779195BB39641B6 444B376304147B00D6EBB40BF0A7B87E147671D1BE5632819A882006B3A873AC 825A4C9494061785AC3E54008AFAE95718CEBE1C7A1197EB8A3E75B94FE44903 D4A3289D398063F12208351165B5AB78142F1A288AA160B42BDD169AA176EF7C 3F537C10FFEFF3BEEC462E76689E5EE17C2DD5D8CACF11D3AB92F4AA144D9928 20B11EC8BD49078A0253237A0E00945E6FE9D74F0D0BC8D28263E1050804ABB8 CE2AF4C3CCBB5AF31563B6FDD534129A85A3B8DB718EB3431C08B8354B6DF154 57C43E05F74DC651E40DEE34FD299E80C9718FE83223B37A77BE2800E1654594 9710D6A9EE00C8BF3AA5E6956A9B3A02BABBB4480DB882042608AFD546924A4D 590F5DBFCB5DEED60A438C78A9ACE5F2A83218C5A9621722404EAF262997CBCE A2DCDEDB3762B3090F49C07199DEBBFCB48A7E66671CB50C8FCEC59152BECE29 F8F0202C18815E2DABF93A650D862CB37AAC5A78CBA0D073AC29CA005BC82D3E 7B9661C01E5806582F4235F0A92A59A5F543EABE2C9FD09985BE8D0D960ED145 B01D8DCFC6F8DE2696E3E4A25E13F6D970710A5F2539DA71C7E7D4ACC8566269 A264975F9E331DD4F8DAFE80858A8786D44B51CF45C4FD746A8329DE129F0742 953C6D5A486A5515C23F16596C0B582732C6FBADB5EF5B7A0AD4C3FCAD11CF8A CC43402E02846B54005B8A87918B596ACBDA2869CBF84F96D10258D82113C821 E8EFEDE721E4C68F50539C3DAE056BBC3685D4FB6C7F708ADD6CFB0DC46F8160 148F4426E8F400EC6484A6476F1FB58AE35ED0CF5CAB726CC446F70901D8C5F4 B994C5662F7A1781B55DC17747F91036117A5CABE5136D7BF46E178A443F7BF7 FFC41E74CBC73558DF2B586A8B48BB7A8BCE66B3B86BF3F7D82A43D9DB72A9C6 BD10AD7A540EA60144F08747D67286A3956B51036E0974B9C8A2DC5A44C9D0BB F0A15608D4DB4B835B8DDB902339C10C0E30527D0078A4B034BC0DE5BF5804A5 139A9387CA19E48D60145B1925AF67C73A9DD24A07AC34773E5E05D51C998FE0 FBE3079688B8D4BBE42696E01E4E748A71903F683562E937B9F6198726A1215C D4D122EA31ED4E0D5AF1BEA67D2B88FB219563D626041C544F3E4D12ED428BA4 44741A7ED265FF65D51E53B71939BEC0399B6AA51F66F8428E27D49C8EF76E35 EE76F5CA554343C14E65C1F5B2C759F06B688EFF5578ED3954259FE783F8E14D 49087395C9CC7E6B6AC388FD8299A9E82AB6F56C678FC0 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMSY10 %!PS-AdobeFont-1.1: CMSY10 1.0 %%CreationDate: 1991 Aug 15 07:20:57 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMSY10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.035 def /isFixedPitch false def end readonly def /FontName /CMSY10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 15 /bullet put dup 17 /equivalence put dup 20 /lessequal put dup 21 /greaterequal put dup 104 /angbracketleft put dup 105 /angbracketright put readonly def /FontBBox{-29 -960 1116 775}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A 221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A 27D1663E0B62F461F6E40A5D6676D1D12B51E641C1D4E8E2771864FC104F8CBF 5B78EC1D88228725F1C453A678F58A7E1B7BD7CA700717D288EB8DA1F57C4F09 0ABF1D42C5DDD0C384C7E22F8F8047BE1D4C1CC8E33368FB1AC82B4E96146730 DE3302B2E6B819CB6AE455B1AF3187FFE8071AA57EF8A6616B9CB7941D44EC7A 71A7BB3DF755178D7D2E4BB69859EFA4BBC30BD6BB1531133FD4D9438FF99F09 4ECC068A324D75B5F696B8688EEB2F17E5ED34CCD6D047A4E3806D000C199D7C 515DB70A8D4F6146FE068DC1E5DE8BC57032092296D5371C275E56FB4903A60E 73A228179D24A58002B117C0560B3DF58B4E57A930ED7488408794CF673FB1A0 675EEFF32E35396C7B5B30EBC6D9C10FD9B6D5E62A4A8AFD177AEF449394BDF9 957CCF8A49CF74A091B0A698259C683A8D62729859B3BB99619781EB3851478B 79AEAFE46B4EA9626C7165A094250CFBA148BB5A79AAE7EFF89906BBCD030DE0 5D9D7A93CB183721D14B59C1B512793D1918B73699C5325E680C9298AEAC08B7 8944A566C67A2FADE697F758C4D37019762AB2114C34EE796FFD1D1334039B30 128640553515E980BD84D217776E68168FDEBABB4B1B46654D90D0C5DFEEAC4F 4349C84D9295F284727C9FC7947E0D30D76E86AEA55EFF7A5736A497CD005547 3AAE63CD70BB618D312AF24BC72A4F2896AFAE1FFD3271D441DEFB88B16D5527 AC9853F1216A134536C90A7D23D79C648B3094C61DB45CA6F7B1AB364EEB2635 CF71B0522A04649A32DCE2B3D3D47F6632287E86EE571C7B439DDA3A933874AB 22D95D1A3E97000F740B5165068C80DF06A3636E6DFA41010274F80140A391A8 D6C58DD028DE4BE678F7E46BE95B4C2F91084A4E43002FC33BD45D74DC853350 F4107E38D161CF1BF79F9CDB8021FD5B28AAE8A653B53E062A9B5EA25A03853E 9B60F2C2180A2E866C50744246F3DAC58259441738A63CD15A9942716B533672 6A4D1AF8AB4520D0A943FC318D35867CEF7BAEB4E3D6345BB37C34F4EB2166E2 45E03756410104986BAE7C154DDC6FFB00AF3DFC885DD8FDCA9B69AD0421EA71 24F4C4E7772E09D394E85CD5C81C5915CED69BE010D71EAFE5923538D395477C 66C5A23E4CA439CE6730F5C3C495FD32B06B4F741362C0F08145568D7B2CD698 4031CB1CF0EDD6C5D943537E17A8E1F59B3C9A9671D308F752C414DF3B2B8686 D51A4D059C04E4B87124AF38A425DFB2812626D5434A8919B6E18894854212E9 88E823917B1D3B2E7D973AACBB4E82C27700D87F8F1B59F0778D9737B7A944B2 5FA403DA5C8E448B659AA43848C4DCE8821AF30F77B9C30C931AFBDB1B905A24 CA7D7340B05850B5F0B280E698E1AC4A8DB0E19EF7FBE6E4A94FF2410476F7F6 9ACEA872EB3522DF408463303F976F498A43AEA49E139651053E8351106732C0 1D8E9DCA08ED0536CEF7BD088E029E4C88C6E9B8F440490C7FC6B9E5FC117B28 F29DE558AAC412B848131ECCE28ED87F5DA9DE1C07FECA0E5A8635E0025BD815 256B572F3905E831C74E9296DC4566A7887A745C97C50DBF1A8C2C888D660F9B F3C0D1 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMTT10 %!PS-AdobeFont-1.1: CMTT10 1.00B %%CreationDate: 1992 Apr 26 10:42:42 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTT10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def end readonly def /FontName /CMTT10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 34 /quotedbl put dup 35 /numbersign put dup 36 /dollar put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 43 /plus put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 49 /one put dup 50 /two put dup 51 /three put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 61 /equal put dup 62 /greater put dup 64 /at put dup 65 /A put dup 66 /B put dup 67 /C put dup 69 /E put dup 70 /F put dup 71 /G put dup 75 /K put dup 76 /L put dup 78 /N put dup 79 /O put dup 80 /P put dup 82 /R put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 92 /backslash put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /braceleft put dup 125 /braceright put readonly def /FontBBox{-4 -235 731 800}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D19 38DD5C4467F9DD8C5D1A2000B3A6BF2F25629BAEC199AE8BD4BA6ED9BBF7DABF D0E153BAB1C17900D4FCE209622ACD19E7C74C2807D0397357ED07AB460D5204 EB3A45B7AC4D106B7303AD8348853032A745F417943F9B4FED652B835AA49727 A8B4117AFF1D4BCE831EB510B6851796D0BE6982B76620CB3CE0C22CACDD4593 F244C14EEC0E5A7C4AC42392F81C01BC4257FE12AF33F4BFEA9108FF11CF9714 4DD6EC70A2C4C1E4F328A1EB25E43525FB1E16C07E28CC359DF61F426B7D41EA 6A0C84DD63275395A503AAE908E1C82D389FD12A21E86999799E7F24A994472E A10EAE77096709BE0D11AAD24A30D96E15A51D720AFB3B10D2E0AC8DC1A1204B E8725E00D7E3A96F9978BC19377034D93D080C4391E579C34FF9FC2379CB119F 1E5BBEA91AE20F343C6420BE1E2BD0636B04FCCC0BEE0DC2D56D66F06DB22438 452822CBEAF03EE9EAA8398F276EC0D92A7FB978C17805DB2F4A7DFBA56FD6AF 8670EB364F01DE8FCAFBAF657D68C3A03112915736CEABAA8BA5C0AC25288369 5D49BD891FABEFE8699A0AE3ED85B48ACB22229E15623399C93DE7D935734ADA DA7A1462C111D44AD53EA35B57E5D0B5FC0B481820E43222DB8EFCD5D30E15F9 BA304FA879392EE0BCC0E1A61E74B3A1FC3A3D170218D7244580C7AA0DC65D19 741FA5FE6F8CBF60250ACC27454BBF0897CA4B909C83A56672958752ED4B5E79 E18660764F155E86F09EFA9F7685F2F5027EC85A775287B30E2069DE4E4D5712 E7D033481A53A2702BA7542C71062173039030CF28D8B9C63B5596A9B42B33E7 D922944A38713383D3648A4AF160A3B0C8F3379BA4372BE2E7EA49AABA75AEEE C5DDE1D8BF68483C3D21271280ABB91D54CC819680322EAB72E1250A760BC8DA 726405EFE420635B5B7F0B48752C06083E92BDE06401C42A2C528C8A60381227 CEBEF0C9440DC034DAD9C19FB27DB399BDAEE22053591D6538587C768C1B7B0B 7D1E222D2D8AF3A6473CC4C0D6C3E0DB49068CEB8BFAA3D4CB5E17327404D6A8 35514F62BD91BFC544B7C5E0DCD6D6D2C4E3CF6589E9D3E6301F8D9F0BE230E7 CE59D2E092C715D0B604C34C085EB2D33965A88680F56773200501F41CB97FA4 ACCE1DB88B720933F198CEB4F5AC209307E3DAAACD471613F115E08F7076846C AC5FDDF999DC291B0F002A0A87A0B3134990EF215B151F5214A44C79764CC25A C8CD09A90BA2C7842FBEAC42FBAC1D4B5519FA59C060E299FFD99B03E572BCCE 239237ECDCB23458C7C2923E9826687197EAE4071A32993D96F84745484B767F 6941E43DA1E9C5734C59A45AE8F8ECDB944577917D66F809E2D1F9F1E4C4B077 C4B2C87200B8BFBE2C476B131F088932B3A795DC2C03E4B424D31A31F06EBC65 74BE1C99DFE0E400838F718712D374D9AED7F0A85A6E22563D3F83C0D8A7E9C1 B1ADFECA454BB0EF4F25ED4043B213A315CD6522DCF7BEECD78B8AE3B5A6215E E757F1B973F867668ECF0E4CB9F17B5A7C97089C2CC425412CC671F69F5AC170 824CA29486FF5B332D3FDEE85CE6756FE89ACB875128C7E5EF5DE8654B08A0DE 45FC92CABC82865D0FE2D708B7275CC4B81A4BCD68D6780CA13EAAEE32B61BDF 224B75AA0F1E79EBD26716F90D92BDC042FD61648324867F1084DDAF1D0D5600 E50EE63CDF0CACEF717354820EFE8F2AC93D14BDFBE15AC249624B45CE80295A 6BAE3D52BF04C6A986CF2E8F86729EDD2232B29D513E96F2E7133245F1EFD57A 89FDCD1B735BF61EC499EBFC873823B92DB024F9D631FE819A52826029A47B35 16BB2E811D1280F13A130074BBA9A961D5669DF806D6E56EB4CC35242858A1EC C34AADDF3837686C290C47C3463052D3478EC279E6FF80B6651CE76FF3F53DF3 81EF618485498A47743C75EBA63806CE063A84809D082B5FDF3908E6BED58A33 5BEDC5B3D02964CCCB50006AB12F3E1946463835519959C092E2DF9B35F469AB C87F78759E573A54862A1058F2B26322EC2555120F7CAF85080956E1C5A2F3B6 A3D13C40F716E4E758846A1BB2C43C27C807678D7A355972E88CECF087D865AE 80AAD177DA40ECDC4B7591C86F4DE5C220105C82DDA23A07F414B3C9D558572E 3BF51826677F51E957355FE4D8EDB385D3134C0BE5141EB835624C4D0ADC8A85 9AE0A54749EFDFD3F373947A8950A6AEBC4554BFF209865297A039D2B3D14096 BB94F08F94B73B10CB938F977244345F09BB476410B624F074ACC210BF018E5D B411F2A1C66BDD591C95BE5BB5BFE1A0901C0E37EF3BADA352792BCB0EB89B01 1F4F74B2FA66CCDCD82BA8FA94F26A1DFF997B1CDE1369F639081152543D89E4 4CAD4A6F930272768911CCFF51188A4F054487462BA6439647E16A43C68CA4B4 E8AF63FFB58FEBF9DB6686725161D87FB973B66F6B26DA85A7B20CDB203AF52E 8600D9CBF3A5EF0DEF366E66CC05AF5C2AA2A66D9CB8409C12A2B7D5DECA1E6B 2632B4DB2CB60964166024B81FE2CA387323BBB9F889C4E543641E225EC193BB 4164E1F408D50D3524BF9A0A80378488F351E4B1B78227FA9B82C9E4E0DCDBFE 0E654F5017994CA1DACC3794BEE94D0219D04F5FE834283AADF815529F7575EA 51B91EB75E68B9726D1C3C2A85466BFBDC98ED3539A1BFEA7DAF9136F57493CE AC32A53E150991A1BBD755F9DD1F70B382CF98BD87D55E1339745C2A5033F7A4 D43D164640AD13B4BB5B9C361931203C9D112F4B8BFB141577078D6CA7C36539 854F4E437F745797D55E9451D16E632C305C2871AE2DBDD9F4391087BF7061D2 8CF493C5C9FFC162D2529569BA27B7549781B911DCA39447013006C3FD85C27E 3CD80DC0DF94261A25A3D53A4EE7F67F0538211E4AF71B19A8A24AD7D2D55AC5 B077465D7C0A0C95E9D80526FBA12D614EEDC0B214FB86229B7AED6BE55FF3DE 2CE96011377D7740A8166A181AA1A23B091CF07AD203160461F031F748DEB0FC FBEBAE34A2169A79C93ABCF067FE7DA8C7CAF8409FF27EF1DAE847A7F68A0B8A 142DC8315D3AF97B7BAD056B5264619B253B7445E668F90D80D67E421A0B2832 A62C854985FFE596F335A9F60DA952D6FCC2561A350032ED48D987EB407F8D8C 257C95DBCB1EB20811068945BAC4E1599403A932E2749767E4A22707827B33FA 87FB5DBCD542B3FDB3E8E644852255C62A506D29C15D4693E3D7C9DEDB00FF59 4F588B171283286BD2BC1969FD8E026E235C4A5B79661DD4DEF49576F40C8AF6 F0ED54C7A045B87BE4BB6705BE9D989A97E97E52B87C6A029A4EE38004604958 0408E027E576C3326949F22BC8D3DEAEB3DC722D887164454F5F6C1A736CBC71 74871FB161273DA45B0DD10AEBD33C4078C8CB9BDC8A86623828B123D429C41D 5D972EAC74BEE5085232A0AC5F7FB9EADFD5C6DFEC55D2690FF8EB39D53B8098 2B5A2E1A5A36DD8FBA75D9563990601F21538629A26A67189900B78D146B8410 D1EF7C4D390D014284990B24C9FCF74A1FAAC20F797A8988609247341537B9E6 EB28CE5D18FEB2256BC7B9ECB8230B8272214B2858119FD5F92E9DDD09C70C12 4FA80F8230E284C9B82C02EFFC0F1996493F1D49B47BBD1DC58F39A2830910DB A735ECFF77BA7FE45420BC93313F81D7E49D39D850AAE1ED35CBCB7B50227FD1 959C89D7FA33703C1461A8DB2591B9CEE1204F6A80026E7EB67CAC79AE71C9C8 81A852D597A74C04C3732000F8D9BC1FACD187E184843B28E18515CB91421480 BB09B2F18C04FCCAB9AB86F74670DBD41FBDC1EC6A7FD894F0ABF67426CBD6C6 CF1B290E32C9F13A58059C96D469F8E0467348AAAB0960E2EF445EFAC298C92D 0B0476B10EFB722FF182ADD0E5A3F7BFEAAE500928F5AF08C046D6496D63A443 3625440068912A9694A95ECC2BB93042847AFF42C56A60350AA6D62D334E0434 AA47D71C3E846F10E855BBE9668C870A7E913E20B882EDB056BB2B72E64ACEAB 7263AE9CCAAD39E94E5E208B52268319650E08C333456DB5F34E61293B7FAC25 12B0BB2F209488CBD309A72CC6CFC7B11D5BAFD80296929138CA599EB37E19C8 961CC1624923DC55291702B405204D3C94DF623A5150B71691ABB2DA0A03D760 F8EF39E6331C834C0590B6E4260EE8C381061F8A9690A340A7E6B42420DA1836 E7D7F8F8F374BF9714289A655BAA6B95DF7276B4304CEC0439644C3530B7790C 4C61C5F96FFDEE846B5626B539D369AEC298059F77162BD5FDE113B3CF357E77 81F10A691168D6771D980F5B1D649AA0A6FC93348E8C898EB38BF24D3B43B29F 3F9D2F7CEDF8D4771308206C7EFE56C897B6386FD449625413A801BB02B5165D 44870802E7832FFB57F490B93228EECB5DC999E7F16EFCFBDB4DACB091F52A27 0BB3BDFA32FE3FA76E5B364D44BAD23C46E108B8694B4D9D0B928FFE52AD55AB 1AD4820716A4E5852350DCAD7153148D8CD57E8DA94FF889ABF370304D34030F BEF127DBA237DA74CC1367DE530D2DA041F7FB0B7B65741E905E855EE6311616 946F2FED97F08D516B2AC8CE1C9C7199724041A584279CEDB88D727AE767A786 B545153525EB9F1455DFBF593D38CA7B9F805579ACF2075D544AAC375FD89A0A 3084C908F334C3F22276DEA852D339C57CA672BF7CBBA2138C15F3044464251F EE07D79EC2C3450DC700F92CCE140D2F28C39BEEAA160E477B84A93CC59E3B2E 47A65561C8C1D3D3B455ACDA80638D564FD32B46DBA3D3DB1EA44DF3CEB0B5DD 9268BF0A708A0140A3E1766F156FDB2DA49783D65AE9F6DB561948104E8BECFC 87EDE15BA95CAE29ED899D647498ACD83FEDED9E53218461F9954FB32325341C AD7ACE32DEFA1956D27DA8EEB7B89236FBA0C6455ECE41B02638D1B3164EA303 DA0DE7D7481A4CEDAAAA2D58713EFF34788A3CEC4FECCC89CBD38BBED461CAAC 81B8177C9FD3FF0B3967F6015172FC820B126612E3B0481990B484626923CF27 1B6BA65052C79A254A558ACF780548A8F428638360A1F8F99448288B8A015C26 0BF32ACFB815830B926E0BC1406FAF505370BC4820827E90A190309B609EFC4C BA2CC0BF30CCAE5DCA22141242C2657F1B63A3920926DF707C282FA83BB9AC88 31C135A5BA434C55B5780A5EACE4C55EB265A8D3F41F689E0C103B699E4300D7 E01D0EB04FCF2F43A5533375F32926AE127FA10D2E8CFF108F3D862F45336345 68CB1095C0F2637793199069FEA84766A32609D8FD3EE4570767A2B3889A4231 D12E629430530A99DC6B22F8D6C0DAE739195F17365CD6FB4794F79A36FCAEC9 37C749144D6E637EF36826300221D8C3994E0EEF4A387E01E22567BA992E586F 1D555EE99BD0796B5EEDE39A7528DC38F1CF34FAC77C530FCF72FBEDD0864E37 72A1F3BBD17EDB8A9B531EA2D887074D1330F685584D34D59EDB3E83BEC26E47 AF87BB8D2309B5CBA12278DA2DD824B3A4F4576201511B9B3A2EDF47B0C2DDB1 C1FCBD8C94A3EBE78E578284E9BB716627EADAE89F188910949740931399C72C F061A731DFD585D31E0BFF44B0EBB17E8537C490005D48A49C9182780AF18BC7 CC6CD722BD5425A76E0428128FE7D54A33F5E29CBA11FF943B202E002730FA29 C7883CC41E8FCCBA6021F76F37F34FAE41E346EC3FCEF18947E5B8CC010149F1 41BDE4DFC5A1E83491239FFEB353E0C52C3A163917F61E0C4B66C314337F4070 B0EDAC10214552ED195BB00911AB46C3EE2073942A7231B5C9DAEF48D5DCF69D 4BC84A423C5F4AB967C9A956EA56D552E0D5E054FA5738A1AB1811E4D24BC7B7 C70915C15B1431D7DC6516454A7AF905649B1C4A937A3BE548FB16178DD65C42 0CB2710A2CFEE661BEB1F86B6B8137822B42899969A4DA0F7952D4DBC64F14FA B486E9BCB484BE32303E8012646BB1AEA7E8AD4380776A3AA5C6B0E9A6117B5F D6046A4E42B4CEF58A120EED1ADA1A12DABE22E23415EF12C01C839A3B1664C5 A975A9CF9D338F7A94A97660BAC4C5D1550F294CD1E224FBBF75892255CD9FCB 542A0F146EB4531E91512C36F7B9B1FDCEE4470C9E898089FF0FC2E19A197450 A894DDFCB9490CA1F4944BC9B1879CE5FFDC84B1F3E8F8CE43B1542EB3914571 C7B467FC0A62F7E82AF19537F6F81B330CE0AAF8CBE725446FC907CF331EEDA7 21005CE276CF605D3249BE49D42AD895C35D8472588CF18C91D6E997A1B45236 9972E6C2188CCE78201463147CC8659E553E3BB47081A292D8D887FAAE7D000C A547CE3CF95CD2F8A64E2FD5A3DD7ABF780CCDC181C36EF86A16CDDADD50DA0A 1FAEE701BE18415A9FE6C3C0E39AE92C187F3E0F618A203A690C3EDE0F75E74F 419F2D276482D6DEFAC269E4EECD1FB24993E1FF00C49C1636DE8A3B8F328C62 EA47167198E10D3C45B132DA84BEA8BC9526FD35A216183AFF2D6B49C9DDAA10 38002793360E92F38800952537F3A2B0252B690795DFE32170DA874A5AAF8BC5 78D34DBED20C3DB30E7D74C70971D90A55FF08824BE6E4B8938559F35301B623 65FA63AC72BF680A31CFDF7209B0A12F2B99E0F1569EBC45CE71C21025ADA282 1612656E75660F19C91E637A50374256A04181E26EDFE4403BFA58A56722120F 89DD1DDFF7E7210A1F1AB51B991ED174A95109A1D64DCCF8C3D3F857CF6AAAE5 6873951FF62CB03DF1E49CEA2628BB15706858A526FE5B88AC49BE8452C1D57B 16900493FA4184D7F6CA5CAD2AE85A63A59F8350CCACB9E34FBC877C73B51433 D6E8371A250EA5919DE41A33EA89FC61A60F17B1401FA82F6E56F80946C73FEA BF7599396DDB7361BA80AE3B47BD502DA875CA9E2B3413CBB8F501914D711894 3D97542353A797DAEEC3A38E3C850B941AE5F12A09467E727A863BC5B7FD5302 E3D4385D7C0C0C4142697266FF8AC9CBD74C67268186F8003A6389587FD633D0 7942ED606702F376B757EEA9880F7991AC30DF5BF93A3C50C223A417710B2E97 E12C9458FD149938FF605A86FDBEBC5DB445C3B728A136345E01906F305A7430 6C212542DA0475E1EED51142CB0496DACCFE93DEEAC6DA49D8A872D19E080FBD 55EB52F896F445F37DC93A8863B8944F7CEEA9E3C94AE57B81F91E625BF3AF2A B59FA9ABF6D0C7DABE3D6A67F52C4C0993B421FEAE1C3EE2E48F523E172EB16C EF77DACF8D77318F89604E89EF2CA8C424913FDB9FFED5A1A0099E437D3801E3 7764A07D13614BF5EA1B68F36102CEDFCF2C960CE7DB171776ADA4832CD6C6AB BD6CC11D6BFC89072CBDB18174EB878A7502120AA1FB11E0B6A96ABC28EB8966 B0AC7771A1C6778B8560EB8E4930D45F5E5C9D92618C4C07EEB13E87C0CEEC0E 86B7CEEA833F6C82DCE7524A94528B662F5A30053436338AE479A7E8EE8EA288 1B45F432A255508CCA5EA7EFE58542688757F51E589D3D0050ECB101C527BC14 B8E27507816A94BE6EA240AF726664A25BAEF53228C32D181DCC6247195FD1AA 29940F3992841361456EA662F8CC29FF92543290D3FE9B460B7932F896CC9AD3 7DB2AA291A82EFFEF193C958A0532A95DC455B8F37370DE26D4C7E5B1A9402E6 091718E356A4BF71C97F671D6260000F35727B7DA6ADC10A894C9C790405579D 6074356A50EFDDD9B6A250025C3768708EDEB462F91249C6334189F077CC630D 365B9F23541035D49AD303524602548AA31ECF6789502DEC99CD78728B4BD651 914BA58AEDF6A49A6A6E627D0957A44C323CB0EC3B133D3AA01179149CCF4C43 1E083AA6458FCDE65D9CCB6EAACEEDE409549D1918F2924143D8377E75577882 E19A31C743E808203FC5B41E14D2D9FF1708E096F753DFE728BA1BA7776AA147 E47542B55735AD8BCE3B6B66C90C93C2F7B7C70C0C2B1585DEDC89533DD9EDDE A5816760399FBA0E5877250AAA672D34AB769939D88499AD4FC0FC61C47E9E74 2172F87E5B43CBF14D63B471BD2E383032C28FD00102E3A1B57ADD43B220617C 665507A6CC721EEAE0B1049E4ECF6CE774FE9680D736F81F17D0134A638F878F 5C48023027B011018BC5B1C1F05468940B693E428A528FE1133F7A4305CDBE57 8825A2A982A5CE87454EAE8ABFABEFD60F67FA0B62F9A822B13EDF0F25EFD1FA 615C040E19DE8C4D849EC630D5C30C38228E2B8F81850ADC8AD2A84DF70A0DE5 F57B8F4660A2E365702878A871DA3FEA438FA368ED746F6AB22BA173F89AE533 CB43CE9350AE4B526FBDEFAF812C354116AEA0A3620FBB495CEB8795625ED14E 39469546E6C1315F1C2B1469D07682A928FF0562B3FFB568EAA1F41BAE585243 41A102C7A1F19DDDD6911179DAE178E05E78F55E8FE510EE2276401B89DC942B F89BA888AE53A11CBA0A6D791B1E6FBD6288A999EF4E76C82269A341D0EF0A91 B775E34FACFB9A6C192E2F3B2DA6B8F355C749DD84CADC9F8497EDCFA0865A43 BEED6DA156D25E8CD8000ADC154D17ECC5D53B9CFE08AAC410001CDFEFC5B24B 03D1505AA5B2E6B964883DA217EF134BBC44A072843D7F54C716B751EE2F29AD 20AB69E929FF2C87F990C934B89EC3F2BD669283A9165CDD7C1A2621826F1B09 623CC862DFE9ED9622368725D7ED6AE45CA32EB2196F63A99723AE791520C922 33F5F5243B174CA72090A816337CD9C89F0D84D48D18F6697E0C6066650B00B2 219ECA05BE9AFB8CADAEF996AC693875455A3F4F855FA22902D09F14D4D270CA A4E6CA7C0D96465FE530171E856A72AFC67AE9EA1E72E9B51924A9C90A7EE2DC 0B05EDFE78DA198C174C72E60E30B732DF54A074C0CD06AB8EE40DAC4AD42112 A7E3BE36B4E05BD99F12ED7D5C1C3F51E6A97053E1E60F4C22021224FB04B14F 2F21B3F1AB01A967486270E298426D2EB4406BECD09E62ED1CB4BD91F9EFAC15 00203282144243E7A8B387B5DD8CBD8788C42889B0951F28E0DC2EC357F71074 0234186A46E289F7717869B788883750FA227F3A8818840F7B62923C768D66E4 5B979FA22AB33161C269D5B55E6AC53F97519826C45333C63F08531D3ACE6A09 2759E2E1CD510DC0C57F1B98B94B5388AD5B185016B20BE694E1C4585071472B FCBA2FD8526B366B300BB43AA33DB9DF6BB24C14485E95E3A240EB5F047A0EE9 2577055D26A5268B41334CA22E8EA44B118E5A812875648C543E55E79BD6738C 04191EE14730A664CA2A3A11720A3C185A807AFF4034C626C6D6FC87E0A6EC40 7F5929B4A4C41DBBF445F648732526AF78E8EE6432B66F346A7C35D7A07CC4A9 34BEA3D04D21C79781F032E9BE1BF921D63FCCCA970D16D71617082048F15F0A 510C83566D9C910412CF3E8BA3D7819F829E99098FFB1665226936787D7DB7C5 16853A6912DCD2D0B12D5B4767AEC96DED3462C00BE05A8098D9DE17443342D2 FE00D28BD6A9D151498FAF33D7F7B6C0CB668BE56D4A5F3DF57D40B0605D4884 4E815E9C47C6FF3A0CB42936C19DF02DAECC3740A98DAB5B595F4A62DF8D4BBB E91CF600427C7F0E284430BB1364E5A69E53E2DF0AF7040DF749B8C6DBB91517 25C692019C6C643FFB0AC6237EC7781C3672C45EA47381CC80207D761D5D6036 29C5254B4E73A925B7CF9929D11FF6ADF65BD80D97ABBC9E057C334E26388C79 06163FD9227A8622A01C6C0437CD92D2DF5B439B180D1ACECD68CE2B5C7EC014 208B342C23797F79D22313B99B5301EE899F68E8D32F50952298D845699FB819 A14A9FD5EEA8C9E31C025D7C2ADE0DA17BA4C30ACDA733EF16C222042D4E8FB5 519F32E7EC2A8C61D278EB4F2C70538BF2E4E931E8FA10804F1C86EB44308229 78DA6456DDF99A119C46C78E2B29B5D178C90A7A641A290CB66333A1CF933B25 0FEB5B341D141D361B4037BE31DFA2A413849FE955CC8DD070810674BA5D037A DE57041B7ED0D11E41550A336E3C36D451AA792F6DA0483DDD3ED285CA071974 F32D35A3EB0F96A127556469339470D32B78F1B1EFD2D924D79D062FF113BF57 B662C4B062150970CA03F79225B528B7AA5F7213434287D1C503F9B4476DFBBB 8AB23584E617EC2D4120D09D26B20AB430F9544C1A72A1EC3BEE1E011B949C1A A889D9E5E7C83C588745667E8345495188040654D0119B2C543471701166B63D 8BD573CAB0E52D9D172522F31EA050130FBC0D198459AB9ACA17872A540EB1DB 83D49E984C10ECC0E58BE8C23E0B3DDDC26D17182D45EB45989D83077EF39BE5 B41E33F0651EC3FE5815AFFCB786C05CAD55643657636B4BE03B1A4127984BA7 E7D4C8285A919345DA50D13E28B7750795DAD5FD4421D73F69AEE133B6B8D2E2 C2C0BFBD456C4D8E5E832E95F9765AA4F404CF833DFAC4AE68720956765D4370 EAE8B11CACB4BFF659545C7E9BC7DD65D7FF0AE427FE3745DD5F136CB95C745A 9572C28A5BE099381DF26991C7D8065EC466C79383D8176BD6E7325F396A3863 D6500D68884439D22EFA5A583C920E3A9B5C4595582200D68CACE7203C5BDA46 24DA20C04B05926F583A0EA33ECA5CCB89BA5168EA4365FF618C00EDBDE35456 42304A39D847F98373D5C56DB48DCA2C38916DF64F81D473276F1E2A32E3B9F9 ED9A3F1C90A9165EFC94CDE9543C36C2D774722FF2B4C1254F870109F2CAC091 A49B86AD16550A6B6A99413CE5D4FD6494784A1B2B37380ECC883A152CD4BCA6 F6A254ED5391BFAB167DF56131B0535251A3CB7017A4F610379866BD8C52285B FBBA38175E3951961D78D11D5D20A3A56DD47C3D096C0E7E3D2188A1A95770F7 0DFA32123729D6AE890A1DEE559D115C8B466C4DABAF5A1BDAEA0007600128D1 32472ABDC299AA7DADC1E82C560562CC1CC448DA7BA40BA3740F5BE66808CEEE 1BF8BFAABDAF0C5B06534A1343F19D23D89F1E029C8AC2FA06D47F8DA8CD1CD3 E03068B29B3940E1086947E79ADC36204003EEB0C6753C344169A02A1632E389 7A1CF6D2D582605E228A73760474928F1865742D2F6E9443481CF31FF28FFC01 BC997EA2FC714ACAB78F600DDD5F2CC42D3821E55F966296906417D6B8D91C1D F63F40B30A029EAA18AC800E393E9A69E9463B10BDE679087F668FA8B93BC165 D2153525815555A16BB961AE21A2D2135A4D0F543963B94A1429F6BC6CFA1B1D 5B8A5465346403270E938774B080553E6D0D26FD192F58E927C9A5514F9DA25C 050EF52D4A49491FE494A738110A9E239CEEC7AB933BDBB047C088A7E82DB6E1 ECDB227DB7905E5C63C2EA227153C88D695E70D37C1F685CE1D35846456FD1D9 91D3A6D3BB2AC55AE8131E94F89335BD903A63C2B5615B9E73824E88523180E0 939881DC7C32941A65156E0944C59F32B3B5E4C622D549D9242A9F3A7DA13BA2 67101A752AADB0F253E896235A6B11DA8C9B0805674E31AB43C0AF1D7BE595B6 F2E5CBA614DC9E256032EA02D57C7A6A4A7449AE50268AEA9E4AADBAD35FA22A BC05FA0948FB67154E370244D729698CA48BFD38E40C8522E012000584CA8773 18BB677C3BDB57916E7D1863E09AAB6A64E4A95219D6BFA2BCBA386EA8975DA0 B06C862526FE8A0522E30913F28A5B62AC8CFA004F89EC880EB118B0746C0737 C3F08647D86FA0541D8D096C05974C00D4F7D7AB43D8D5257657E6DA6D35290A DC24E9ABACA2DAEAFD3B273799D8D16A0762320950DB953D261F1FAEB0F7271C E2EE0AB618D3777189009379852BB13917D9353663F3AD9FCC0D7C9FFCE842D0 7FE3D5354AD051EBB840DAD6D48F4A5CC8C6A24096D354A04D06F489ADB65512 638C3EB8A343AA05AB15260FAF751630C46EA15169A87FB6D4861676A4D29B50 19496C77108FA8FC83F9893B520940E9A78FCD51A461D9CF945458959ADDD4C0 0DC18FD7A0E006FD0EF07D41D40C17D4A0442B2774DE92DE55B74A84E409D642 7020B0AF0E393C5F5577FDCD557FF15AE690D6AE94733842B964D54A21E7676C BF64FD0365EA01523C7DB502142580B5AE91CB9C91704CA69C0BA7F2817B1378 AFFAA5FB54D2DB4594B08CBA014D047363FAB2B2762275FC9325E29D1973D5BE F67FF1496352DC83F3080FB6FDD915316D685023AF844D08EACFB8B0A024E1BB 6BF7631DC677AFB9ED94C689DEF5AA1821CEAD1FF880D3224F4E621C96899972 A41AE5D6192878CF21E4055A198332E098FACCBEA328BECC010234D911F3E3B9 B99DE214027049726CAA262E2D3ECB0697E6AB54E01103413FB0A19A3DF68C82 A25810D2FE7C25452FB8E78C7495736CA161B64C0B66E9D6F0525A93A4529DD8 E87BA251C22D480B3A578046EF2056033DFCE42A1CEEA6D5BEB6174A0941BA40 00769388C4C0E25A33CAF6647E1CDE9C6C6F2E709D9564C8689DD4543758112C CD60AAD2BD2AAE020B488ECB060A6F2EFB2FA919BA3F30C69B046360581AD36E 11ADF2791377FD7A9B7845A2294E1790984984FA7CC3CCBDE7FDB9D0A59764BE D8673D8709A346202DCA798F3A3F66D06B41A70AA1DC290E191AA445AA361AE7 7BBD98E87757508495E6DC2D1BFE9DEA1C7C91E4768BB61096B818385BE50612 37C6E7CC7D469DB8531A8DE0B99E7BBB4DD52844E856CB835260DFB5787E0E74 504FEA680B2ACB0D550A4CABC8256174CDFBAED2764D4B71AE7CCAE819DDE32E 149E8D2C8C24CE45703F837A468A8544E5CC6AD5F2272A12C0CA384A71E46C83 5E74D8BB1C1FB4B3B08E5E32BBBE837F45A96254A840FB335BF9B0F0F9113476 7675CDBD13383719EB8E18C00A89C5C2C5EB3B0CB9CE35B9181155B284A6B176 E3C7F3166CBC8E24E39BB9F077D367130BE352C5C7DF1375549F2BCD1733AC1A 4F443635A176CFE0F3FB7AE281EF718529E582EC453FD389EBA6D01ED7B587D7 E54C63A4685E5AB9E733ACE9F8BCDD5FF487F6B0F61DDE2E02C6EB30E3C387F2 1FA1E21CACF075A50DED3CBA1CB6ABA9D1597AD8F6832D911C35FED259ACB82A 012D11AF1ADA8155FB4BAC575F39D8FCDF7BD41DD6E567EA6F67B6E0B3230B99 AE8981C5AB3C63EC4FE787032A0B2AB1ADF9DEA6B5C60E5A81F8CF0396C4093A D069F4C4F55955BBD42588F14ED66B31A42365FBABC2E2D289B4C2B231130D83 255ADF2B95CEE5ED3850E1855BE2D56889DE54CB45213C4501EC0B80872063CC FC49C902E572226AC896068799F40C6C3AFBA63B8CD37CC1C428E89D4FC9F0D3 1D96ADDE8DC16B789134E5E54D9374E36DAEE726885F7B661177FD6642AC16B3 7016287248753519A643CDE130F8398F325E39C9D4AD2F3BA6C92021E5383BC2 5C089A135B9DEC63DA791A5E7C8DAAA34C78E04C195D2CAC4F35CF6DA6195C55 AA93BD19F5CB90D7889E09F47743195F394EB079350AF7EC40EA651A47D86828 48F2368D8D21AD9160879FABA9B408B480749F35A673C9CE2C270AA3494272A1 B6FFF4688C66ABC424609BA7D9E065E7BD07533A3B72FC79DD1C5E53F04F5D8C F0B26C03C0F8EBCCFC82B4AC7DD9AB38E7F7DEB0D00E47F1E9CA94BFF01FB59B F3CA47CB2FEBBE9C602E6BD7D3547561FFF7E00147F6CE391472AD5A7DEF0DEE 9F6FDA7FEACDAEA6579C2AEC50332DB2062336490AD454785BEEC4CB827BDAB1 C1B846A782D6A05DAA66828407D98B2C8EBF117FF1365424F95653BF9EC461AF 8831B87C8C5E7D39D921415514692810870CAB7174BFEF271073D14A6A2F5B45 FF425251B4EBDCCEB4D86952E8448B5096456F8CF3FCAE6EBF7904A7C661BBC4 F6F4D33F36A9041F261F3DE9C4E12463EDE7A7E244C366A64D2737A652583CFF 35D7E703C79F3D913019B58424734EDA920144AA031526340E368C2C4F5E965D EDB373F69403363830A6D0F4718966FF582F31F192455C2ABE7AFF821D1FABCA 47FB09FB399DB32C25D1A6F57B804B699ABCAC01728DDC98A42E189910D5BFAE 8DBF5416CFBECC0015FC07CCBD3FE75D6A32DD74F5A2456A873E560A113F92D2 208BE9C917B5C31BCC78363A26FE16DF685377181BCC0C3828E8991C33C19BA2 0F0D42444F192F208F685FD04250B465687315F2478CD9D6BA2F1F098FC91A1A 7C312EAC83D03E4C4EDC56BF67CA177E6FC2AB914E3E9EACB2745E04B4729854 9B87DF71066B9F2593EB6CF29DA2B1CC3432E148E67B8185CD919DAABA8FF8C5 4EBB66A80A0723D3447CC17F7BB5E380AF1C8A2E94FB3077E391B5D5C0BA64D5 11FCAA68D5988B7748CB414D2D44F7B675F3BBC61A4AF835410AB98942A6F74C AF9565CFA049FBA742F4116FF3BD1B1637E01D338E55B978CAAA4F51D25BA780 D009007BCC23427833E90B49E1D6FAFECBB5C8C0E8E53AF573668E68064DCBC4 36C88E1D47F17D9C7F0F3A4D80BBE8901B9B0E6D3BBF9AA2F1A288555FCC0374 DFDD339E93BB92792EBD972F6F033898E1DCD9101B19F69CC829D476AD1CFDB3 4D8B4BC35B5235961B0F6B6C8DC2DCC84C8A2C08FA40B1DDADA99FA2F00ADA30 2EC289C9BDCA98E51ADCA26B707F1A80841D7F112ACEEE4557C48F00B5F3D3D5 580D5AAA75CAE8A9F6C0E5100A85771FDB24A0A7CA98C6993B75F32DE189F800 ECC1C9799708A50EA9494FED719D4421750A29C1BFF6D52AD50EDFB0822C5329 D1080561CC63DE43FFBA01A4C3771D224B16815B35E637AD0F35450F341D6E71 E535633E3FD58938CEFB32E8F16BB10C63FF0F1D681C0B13D6ADD88F8A24D59A 3CD5DF3C03C45B436FB28A18A16A5D45F5B078CBCFC84DBB39CC41BCB3C86CA9 49FDB62448DBC770E2A39BCC6043FF7B30AEEAD8CC6AC557D8BBCFC5DBAC8E55 5A3D81D54458FCBB51E2E9D57671AA82B7314B5B41EF9D4FD4E09061E6F3748F 98B13370DC8334FCDFDBE7BE8D15E7FA03146D106B2624FB7809CCEE6F18764C 4BD66DD12B739A1F4D76EF10F2F811B7EF06261BE20A99D04E6A432EE6CB9878 5E805C8760B7379F6651A2CBA2D267F870FCD0BAB78EE4E3AA7EFC6669B0F634 00F30D9D1C7F7DB6038CF3AD43D4EDED58AEEF40A6A66407DC737F421313580F 48F05B5379353C707D70C2E754115C8E1F04ADB1B31DCE221CD1F85F2372545D 1B3F51CE1FAAB8762154426C7869E2D030F659ED342C2C95F4D118739BA6075F 2E17E226EBC5C55297A829C8C54C61A0FE55F90955927F8EA8BCD439C96F187E E424BEF643E001ED09850196A83CA2B03F26E2D17168C0A8FD5443AB6DE0B610 863D0C91A243CE5ACE2492B58C347BE9C06E49A0D3014FE1B7E736495BDB890F F254BDBD9E1F89C55A364A0DD6B1B1EFF2E2DA124E1DAF5E5D752DCC8BCC2D36 09088B5AA7D8B6B266302952BA2B7AEEB52626FD16CAC87BE7526B830AC72885 AA60EACE9B4C78271B7CF3EAC09FFB6DDC6A1A06B20AD9F4AF21740A2761D308 318B80314AB13836774105CDBD8CB86AFC2BB218E6E321A30AA98D20BB37C301 4640980E7CAD9932A20F284B12003ED6366302CCD562B0578EE419A6062A10E0 A4DF314AA747075CE77DBEA7E3A109A2B16C252B9061B8E5E7AA0FEE1A0F7EE8 8F0240078AB3BFA31FA63D98A1EBD0EAE3A3C182A6DB964B37813AD6CA5E74E3 9336311D1821F9A2D7C4281C9222AD6BFB29B2BBA0A15D5656D7D946BC9466E0 322FE71FC86B9AB1DA4EC617075C90D38387DEC14B97F7D4887E3EBDAEB5BD72 D90E94694839743849E981E93D73A7B68D0D41F6E1C952CAB8B56F78902E2A95 ED2B75EB32CEF6EB2708BFF7889EC6667A71EB12CE150CDB522D70D016F8E0B2 605EA03E417FCA7FD9DAB1215C7C2FE1802FE5763F4D84C6586AE655EA8F07D7 0F277196012EBCF8801D08542EA7B875B266C5D6A643BF48491393437A8EC767 BDD77B583291D98653ED2C81E940BB84C22A873D77FD883F8AB0B1FFF25566E5 9C27DC9706E9C82AAAFDD16055FBBB492B7F71A3BFE3B73647E8F3B5A3FF4554 BC450A5E4F45903E798839864B12DB5071DAB6458E2A871743FE16579E3C1EA4 C160CA710381570409780B6DF34E8C87EAED9F97851BA5C734ADC83EE339C7C9 2C846C7180805A90F3E3AADB04CCF1D0059105860E059A6E30FDDB6AE60D62BB 6D0ECB764291D63910C554DCFC1A18F6BFBDE2CE6A0407 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMR10 %!PS-AdobeFont-1.1: CMR10 1.00B %%CreationDate: 1992 Feb 19 19:54:52 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMR10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 11 /ff put dup 12 /fi put dup 13 /fl put dup 14 /ffi put dup 33 /exclam put dup 34 /quotedblright put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 43 /plus put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 63 /question put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 91 /bracketleft put dup 92 /quotedblleft put dup 93 /bracketright put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /endash put dup 124 /emdash put readonly def /FontBBox{-251 -250 1009 969}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0 92A36FAC8D27F9087AFEEA2096F839A2BC4B937F24E080EF7C0F9374A18D565C 295A05210DB96A23175AC59A9BD0147A310EF49C551A417E0A22703F94FF7B75 409A5D417DA6730A69E310FA6A4229FC7E4F620B0FC4C63C50E99E179EB51E4C 4BC45217722F1E8E40F1E1428E792EAFE05C5A50D38C52114DFCD24D54027CBF 2512DD116F0463DE4052A7AD53B641A27E81E481947884CE35661B49153FA19E 0A2A860C7B61558671303DE6AE06A80E4E450E17067676E6BBB42A9A24ACBC3E B0CA7B7A3BFEA84FED39CCFB6D545BB2BCC49E5E16976407AB9D94556CD4F008 24EF579B6800B6DC3AAF840B3FC6822872368E3B4274DD06CA36AF8F6346C11B 43C772CC242F3B212C4BD7018D71A1A74C9A94ED0093A5FB6557F4E0751047AF D72098ECA301B8AE68110F983796E581F106144951DF5B750432A230FDA3B575 5A38B5E7972AABC12306A01A99FCF8189D71B8DBF49550BAEA9CF1B97CBFC7CC 96498ECC938B1A1710B670657DE923A659DB8757147B140A48067328E7E3F9C3 7D1888B284904301450CE0BC15EEEA00E48CCD6388F3FC3BEFD8D9C400015B65 0F2F536D035626B1FF0A69D732C7A1836D635C30C06BED4327737029E5BA5830 B9E88A4024C3326AD2F34F47B54739B48825AD6699F7D117EA4C4AEC4440BF6D AA0099DEFD326235965C63647921828BF269ECC87A2B1C8CAD6C78B6E561B007 97BE2BC7CA32B4534075F6491BE959D1F635463E71679E527F4F456F774B2AF8 FEF3D8C63B2F8B99FE0F73BA44B3CF15A613471EA3C7A1CD783D3EB41F4ACEE5 20759B6A4C4466E2D80EF7C7866BAD06E5DF0434D2C607FC82C9EBD4D8902EE4 0A7617C3AEACCB7CCE00319D0677AA6DB7E0250B51908F966977BD8C8D07FDBD F4D058444E7D7D91788DEA997CBE0545902E67194B7BA3CD0BF454FCA60B9A20 3E6BB526D2D5B5321EE18DD2A0B15E53BCB8E3E01067B30ED2DD2CB9B06D3122 A737435305D42DE9C6B614926BFD44DF10D14402EBEDFF0B144B1C9BD22D7379 5262FEEAFE31C8A721C2D46AA00C10681BA9970D09F1EA4FA1566B96E221864A 45A24ADAEC63F61C9FD18376D3984449A1F998C318A8FE36D0D5020E18A49625 0F3BB603BA1F3E66FF412F6A32433FF8BD2968D79CE4273AD0E0CDDA5153C2BF F8A46A2244F9394A49D339F763F5A7411A3C29336B21CCB01723705AF589B078 3763035411FE36AB5D744E81379106890688CB5BC41184548B7FEBA08DE7288E E6570FEA20C51FACE8E8F824BB61A4A038AB817C47B87391611B77928B2565A9 3B27A573C05D36ED01D8F27CB2C793370FA9B90021B5696280A55F2CB6117B64 293EAE0EA5A243F56FD007773CA35DF71B3D28643C25210CCE25F37A5095D6E5 9CAFD99DD1DB0D7EAD454C13464DF6FF5DD42339797AE5AE467084550FC00139 6EE818C6365007B2FD6E26285B832CFE6EA7E99665A224C9813C036CED262639 3FB39C1F05FF8F31D2DEF37BB9B883334F51EA124581B786A3D5FE6424B19872 AE7CB657C8D9528934B990B94FA4A6D61BC9D2CA9B4E95A22CBAA066043F44D1 AF32F545B9E123536914A7FD7FE96F12039EC25128C810BFF546AABC609DF57F E19D511F324E32956177C4376D191C691B9F0B21FA84BAF3DCBBA536CD710A80 1DCD4C83C02E69A140E1A4CFFA3B012398F21DDD96ED8060DB98EE133F430022 41BA1DA473F1C99F0D6CDBD35188DAF712AC83E0EDE08EFC3CA2B4A21EE55692 CF22799274A5CFAE84C89C937AEECF9CC71A328015B63C1730FA68A18871E174 D035568A73346EBE4EBCAE410A4F2505370A0ECB487FB40FD823065AC56CE66A 9D8440C5B3F74B855EDAECE69835137D4D76FC0FEBA53998F57EEF25C7E3D9A9 21BFDBD66C84D8AF7D8A3B79FAA9DA2963FD47689E519FBB2B7793CE6DE04A5C 203539BF94A5A700E65B5A5DD37B051EA4348BDC4CA39909ABDF8C4102A58FD6 661206115F7EF6C29E12408BADB83AD40071F53B501C15601338467BED90B659 2708D01CD77E109ABA63C19FE12606511639C5D9D5522C80692D1CA874E17B9C 753AEEF13718DD36A008B2D39D618F4F766174423AE972CB619634766A5DA025 F9682D9E2A3C752D0F6F18B0D58319FCA606BD6DBC4F83D19DCAC84A6165B460 AC1A0057B12E2023F175E6A51FC12A4852043F6F2F2625ECFF6E866293531437 1C060C9383278C81B8DF68BEED88C49F86B7617C5B938457D19FA336C616D2AB 0A430B489EAE7998EAB74FC8C037550E12EF9AC540FD37473DB1A44B1747A4C7 4687624D806FAC32A53BD65A333DA3732ADA2774D6621BB59BDAECA5637F1F41 CD2AAEA8DB9774C2730DBDE3A2F9499C719A0E9D59FF37C4F4E6E54D5EC402C8 6599488AE21DD119CA2BF54EDB306B26351D0CC4C82040835580087C60327110 9F8A1277DDBBD25823AD30F0E960604BFF9CE454C5C841119F73535F3093FBD6 8E47B1357BA56E3D906EC70D68E85465479539187B56EC67A64DE38FC444950E A82B014254689B676BD02A3068ED7ED5D4C9CA1839ACD730A1796A6301F1155B 39708D8990BE9625950F0C341334721128DFBE111186A097055BF9E4C5417490 16DAA761C9E2DF6AB620F86BBE55D186EC0D0C6D6D76C6E6A0C7324A49E94752 6A8F3555B5132D1431D852395577620EEC6D73504081073EAA00F731DB4DCC90 B02844BCC6EDEB94ECBB7D4FFA5CFC8CCC803465F2A2EFD7A5A43FC2CE9D9695 1487BE72BC5D95AB9ABABC8CFADC6BA4C356E0A157CDC36D75D3CA1F2DB532F0 AA1182EBC288ACE9C5CEF9A95014B7BA9FD6A380F2F6B222AB75EF6C3B43F2FB ACC060267AB461CA2D4C6E76D768A8D9B8D08F9203176C628B662A08AEE8B32F 998360203D561D62E3A7C5D04315B754DDF86EBC16497BD1289444ECF73249C2 1B8C246F1BBFA0BD8436D82B57901B5F1E52E809C1886C46B9CC1DE1F6951969 0AF1462E1A8748C5529422DD99D7A97ADAA6B708906E4B3D650CDAEDFE83B206 0C1272BD49B74E197C0B515450AB464CA5722A3BCEE1735C087F29687232047C B5738C44EF323DC8781F05694C9D407E93F6E4F5966F4252B0AB4BE18DC585FE F954FEF697AE3D7B2653CB588CB7BDD26AED91D256A31610EB03B6B923242EB5 10B941411DDBFC2D43C861077241D97A791A27CBA6F34E81297BB991D408A7B5 6DB02C905AE3229B47166C5E54286CA7074043568A858042E8231DD1E13EEB8C D765F2B9C8989A9762D1CCBDBB6A97BD8409D26C77CDD29D04B6EB00A0A1365B 73F24D9ED335A3D01FBABC12D1ABB216BB3F8EA7E5C8E8ED97E606A8AC5D3F89 DA3DE0006B508E1DA333723CF376A307C23F3827977D8DA46E6BB31F4E7D36B9 0B78B6D1E119EC2495D91FEA8E8400A66B765712193120F5C6A829889BE09BD5 DC45C9ABCAC9DC9C5B2E6BABEBBAE7188C1F475C077C8F5EDCC9FB06CC3847AA CA3386C76335C76DFA811B0E164F05DC22D30FFD93A159165854E3B96CBABE23 D77728D57DC2DCA744C1D9E6C7C2C540A5A0AFFAB3D2114473767153948B2F0D E1FAD21B5D8867167440A3737791DE8D6B70876D913102F68D6C1E1B7EBEBAF4 FAC6486D539B7B3AC66A308B3CA2DDE7FDDCD2DB161E857B39E9AB725007D677 D1BF829E6105FFA5496C55A8B9F15AD7411B88AA13D05FF18C4EDEC5E66AD593 4B5FD918AE8D942CDA898B6B5D0A1A716B73A4B3FA739AD10084CF67575BC7D6 247405B86BA1084F6D841F49BEB4758F447A9D574DEF1FA190A76660FEFB4B79 6092A6EC80E9A122F33C7D0FDDB5C2D4244BDDF3C990052B6B324C0CE9DF614D 09D7FDDADDF1E7BB97F7B335CCDDFABF2E31D70AA0C0D06D2BD1C35FA8B8848E 8CFBF0DB21A19DA8C3CEC3A4A6DDDED86C36C0F1540074DFAA8F34E032338523 DDAA33FD23DFB64B35E38C1FCF4B4A43533C5C05D9EDC683E08F76825E0E5D95 9E7ED0571CC793A4364040B568C7E2EBA2DF64C387FEAA3BAE077297A9F7623E 6E9B1DA0DEDAD08BA2FE166C635AC69B1BC50654701709FB46AF7840F6573041 035DA4D9680AA039E6AC35B10FB408E60C5B48F8DAE8410960AFB98FBDB179D8 9577CFBA439B3922441DC01CBAA1A6EAA7BD58354EC91AF775221478A9216C27 B72E4BC2603D48797036163DBB5F2258A0CC46C35685D4E4B32F8F0A5E652738 604B23D3F609223A2B3443E2FC0FE98CDCB4777598C7D067B0C3EC8111D6816B 7BDC49FA5AF162BCC4F97422CB4C8F596658718CE94FB1EA5122FC4FCBDC348B 79A67BD26424F1807EF6A7C08DEE7FC99417A6312D5C893D5F4B3AEDE2F83562 A0798662E4EA6185D238391886150572794A3EDECD269349BC5CAFDCA4BF5B82 93768E5F3E2E75E878ED2E393A6C6DD3CE19ECF8AD3AFCA359E7B500089AD20B A0F91D31692FFA14EE27110F9652CE35CD1CCE664F2EF456D275C2A44DDDA4B7 0DCAB65F5270820FFE84EE5746365CC4AABF3C68F339BC8102238917C2E69A2B DF1CB9D2DFEB4F84C98D963F0CE5D93C58D899DA1F55E22475C2691DE1620238 675EABFD5ADB64815E875180AB058B4152C75B9ADF0F9FFBA8207D598CD9A6E5 EBCC755A658E15031856680FCEA57CC2D430C2EA81ED02B9217475D0C8E0F987 1C92AE2B7F63FB8DB90072FB7543D623EE7750FB048A6E470CEA7482FA4F948B 6A3308CC57BF9EA127083AE953B968730795A27823BC9CA87E451274D4C586EB 2A6435CFAA27F8448CB572BE2B6D0EEB95C5A8C2B5D5E9831AF273477DE905B3 CD36937FD2FE2EF5BC95DEFB3D7C7C0F4665D461A6A73CC431807B2239EA01FE CC4991AC718D8177124806E06F968DD250FF71FB24CC039A3242A183ED64659F D7F80AE407936C8A21C6DE7BDDFE8E538CA92F9E9790E1A9F93E4502230F7E2F 5DB0792C697780BE2E0082357FDD4AB76C1554D49F7B27FD33F549B7D32CE41C 840CDE2B6733E29A8B8AA3E1EBCAC715FCA248F380BC7EAA0C0D44F131BBAC4A D19D5D06E4C3C04A27B49D731D126B6D927F6D6D96D64367F79E92B86F240AFF 3F23516E5837E6B03AB82BBD9691AFD7A650B952A12DD4E02BC9109763887363 16BF8A451EA357868DA2FCD75CCD37BC44F89B85851904412A2DFA9730D33E3C 0F1F047AE78E9B692ADAEF244180195665F5B1102FEF09ADC1B00858B3A15D90 E823C0572D9B7742A21FBBD927325B23A406203F2CCB9DC8528DC0388AF328C0 80CD58E93BB7008EA14C2E244C7741F039F82B7C54AD1CA15E72C9897AA4C72D FBC101279E0F6C84D5F34EFCB7800CD39F9A23614BB44D6EDFCE82D8D8A6796D 3E28A703B5705B5FCE4A5DC7E87C9251F9B939AF09B9309E7BED0F5F6B3D17C8 2D53325EE5CC3F6471C3314E9ACCFD8FAF3B17E0AD6CE39A53350319B23FAB23 E72D393EC7700BDC32A323F9EADECE4A0CDE54B13A3B0A7EB8DBC8F0C50732AD 2A7B1A54F78965F4918354E6B364F497E4F55D9619467896C5BAADF0F986D906 006A13B1B9EF5D2A9656F6F72464117818DC3C87736737867951255A24EBEC30 B3806FD14D91513BCB1AE8DC452A2283455F7BF56CD088553E62B5162834D8A7 E255C6C14C68CF448074D6E8454E3CB23052A527B274E4F31B36D5FB10075E33 A68BAE62FE2EB97DC6BB4AE7A4C2F77B3A982FE7680E9CDF690CAA5F141955BF D15CA8AA547E53186C2BB8C586B51EEB4119586F4B590AE63E657118557B87DB 5C15D5CE01DFABB59E5225D88FBAD555524BC14FE67D0E4F58D55546FECDE722 002C77EB799D254F1D7284DB9EC6E1A85AE7515E0E55CB116220C4B6C99427D0 97C340871236691C80E0A24BAC6D6240092036BA33EA20610432B94574347826 9447842B4ECA2600D9B6DB37458D8DFF4352284D9EE88E1AC58CEFD9D63D9C78 C4470113B9D5B7A5FB7DD39A935C84B6F30F78BC771B34146A807EAC00A71EA5 87F91A5D6ACEBF9157F7083369A581911B4A5503564FFBAC7ADA4885BF97B67E 952D1308C73877D1A31E6347FB2DC9A79F5C7E28A78DCC42764BCE7DF904A3A7 AF6287E4341A6DAB1F6B54CF7C09B92DB648CDF340E9FD6C066A97C2733A5BD0 4AA83C4203D2956382E6C3715DA2F88A663C557B6157623A11AAF9DC24991170 583D81D511CE7840F59F30E9940F4FE2D8264A9382AA651DE0EC9655653FF2CD B6806D1337814AEB40D6EBD29CFF5C575C0A0C7B10C68122DB53C582FA531A21 84571828A93E3FAD118BB0BDF825224896EB4AD838CC2A15C143874D221F79CB 76E4670DC884AC9C752BB7912A7975B5A343B6CF7C9B3EB28E76B61D8DB48E31 C61A24D0343B3257BE80EA2183E91464B35C83CE4FFC9E5077AAAE742C1C1673 09CF7EA18265904F439D85200221AA72347053BDD70D9DB117D5ACD6F3707A20 6781DBF62916D8F426FE3D5B303FC38EEDE88FB473E4B2B83CE5C0EF951C1B2C D30723A6FFED3167279A9D745DA1629F1B4564EF52BB3EEFEFAFF34B59AF3E43 0548499C22E6109B93E288164F6F20EE03AF7B931AE7AB64632D908D7C3BD166 480016D0687F76947B419CF4D6FFCD6CF2BFA5478877032A316D1E7BD10E41E0 AACF1F865E5479FEA1FB179965C6ADC2092E1C71FDFD5109D5D9EDEFF0919D03 3C21319CB5BE624819BB9A03590750630561298144ED8FE8BB75EC110EF4B88C 749ED0FAF595E9B71E6CB9CC7323E5517C6726B68FBC7E8604896BAE0E14E8EE A8202ACF34BEDB113838A7AE960E0BF1FD18C54B0876C44F63748CFBD3CD6580 4D8A60103D68B9B67A45469BAA23319B8B6D129975B56D062EFE83DDAE8EBFCF CCE95C9E1041C22868A207157A6EE3DE64EE9D4D6B12C56CC092FDF997C6FDC0 826EF70D46E24848E648CC7B523FBCC292E6D388C498C1EE6FFE2103C225EE99 889A13A258E20F59BC9B06FABD79B3DBA822EA9578690A23A94FF168125CB1CA 40E5DD335F79FF00CFF24EEBE583FC554E080D45B1D0A462A5FCABC77AA88914 4361DEDA40C24E6CFCA3BCFAD6F80015EE17B53E69651877D5CE0A1D30941811 B1A6B5753E484F3429E3CEFEC84597D11B8D07157931E0EE29AB0F188D0B13CF 7A296823BDDE11ED07A62818B77E7FD71B4F51B0B95239A9B333324F1A9E7826 AD6E00EA97C95C550D529FABD9CDF791DDA7693EBA2CFF971D2B8B75DA24140E 5F52F12F4CDF614B25DA7319E290121B6B48561BFF9880078F4F03CA445F813E 6C57925D9BA45F2BD3EC5B76141942DB646340F90657234FA005ECA5CF286944 C9CDB8D06C4742250FD1B4E83902C32D621114063A329CBACD727F8D12F7E025 25EF34EA59B54E1471583D79451581B769A96C352255C85D5BDA0B693EEB09C5 BC76A15DC54717E51B64E0A110AC626C4489F35F9804D6CCE2A87B59C64A2B82 4BEB958896306775FA4D1CB26CE008E1159AE2DB1852679F6272C0B0F3D86361 182727228CE51DE059CEFC4860AB09E61B7F8176ABD343F00A5472F4A107F1B2 1863F6A26C0D0BAFC463A4B42020D8ECC13E855763A7761D0FDB2094ED32CDB9 4D38532749F845896D4F1FD67CC03161227D98F5EDAF69B75B8FCC5D7FE96A16 C18FFED76554E92DB495EF600E59E6CAF19EAF53A2EBDCD762E95F4E9F641C4C E1B5583654F8FD341CF0EE1939253A7C548663DA81ADB915C3AF182E146304AE 734705C9DEE4F13D42C913C06E68E435216971F0450005F20A40BEDCE83A5127 664C64464AF507C150846F7A54388483F8BD668AB9B6878453EDFC2C1B28CD8B 8E0B15DBD516274B17979D72A711C30024E04115E2291B142E5E408FFADCB1DF 357F37DD7A59F2B65529712AA96C161FB86D8040C1BBB1278A22829AC26ED524 E909C121D2EFDF16BC02EA7A70828F3F5B635FB7A79FDCCC7DB0579F1DA495B6 4C7FF6BA9362CD79E3B0965A45FC3967232AC837769A2ADF8CA8792F272B0570 9DA29EB1D49BAFAFD1BCC9078C8AABC1BF52C8BF17BB303C0F43A10AF1DE577A 356DFFCAD40DD1D5630723E037A21CB48B8A2B6BF0AD4072BC83C959AC2527F4 710590DBB74CEAB1BFCB173FCD6C304166650F89BD02E10007930CDEFB4C03EF 9CD624A5A8EA98CBE9E479E1C430B1F7E5DC697052AC50FCBD298F5A4E258F15 CDF5A567DEF8045E44B217432B7CE104F541DE11FD582E049040EE2EB1E774A8 09AD8A1A8AC2D6C75FFB84CF4299797FF13DA70551FFF1751425DF94275D2B4F 44DACBC9CC969EAC2A9591FB2F4637DEA0F4C4DD47C05F0C7239E6F691694A71 AD2FB46ED3C2188FB9535A476A675964FBCAB962ACD992F9217EF76FE431F4A6 B2A44A41862B5FC806E160BA66A0D689A61AF63219099C2976EB18FAAEE3BA05 F0E6EE00F1AA6BF7233A353F018FD21D789CC767749172877ED4A25CFCCA3E77 71778EAE22FD131AD30F5741756561662DB09D163891D3732590956990CFD921 D0B16FB7644216A3BFA5197E4076D58003F6C24A0AAB56B537CD94EE396F9C8D F9AAF786FA56DA56246BD61884704211C0FD5021AFD6F053F6279E0B2FC3448A 6C0D713C08A18C1DF426AD38208F27E3032B259270E2A009B463588729E26907 1AE54A3CA0EB4A1E1C74BF12548FCEA79032F7D064BACE69D0BF8F052161B7CB D8848FF3ABEF7D1F055B8C3D9544F3D221DBB408CEF9DE35571689635AB07341 FBC45D9CBB38C75613C1132CCB8DDB6C8AFE2C84EEC736C8F08E1538CC3126F5 6CB4EA710AFB06058568FCABA75FF2D3FFFCA942997535A622443619487CDEBB 2EE0E006BE05A2D4DAB0E886CDFB58BEF78EEE14218B30E8E6883331DDD0AAFF C3A47477CE1F5244FFF655554DF9FE2C69F8D9BCB584F7971981C3AD7F3B3B0D AC5C60E27F987C7DB03640F6ADED84BAAF4206A1991A1E99BAC65C8FD8D340B1 00A709DADFA12140DBB60971AC1C45EFBB526B45DF246CB4061FC0FBAE8F8EF1 471EDA65BBE10A2A2C2B27658F3CCB6F1F71E4861B23C322E37FDF4DF9B5D422 C5D52464FAE92227F5B46FD37F1D98076FD81766AD9FBAF58AD5D29596AFC68F 5492170D1A2317FE7A7E61E3F394996A27437841E6FC08B4736C78E04D46C85F BB37E92DD5BD038F3773366C7A10E127BD63C1E80D89E5B189CCBF5764125B62 95DFECB0E496D7F252E561A251305E48C88CA0BAEDEC452D58E49A8F02D2F52C 17BCB1CCFD9C31922002CFA42BD5D4D50895E69C79B757390F6337A40F35FEFE D8A13CA23872A1EFB4CC484E385EBA300AEF43A06E849A5223CBD363759AB02D 6660FA98F916E476D221954B3592F18B739E76C341B061727C597126BB743238 4353CDF0E46983F7494604D1C47F0F9310E7E1DC62711F87ACA33BBCAACE9B3F 384AF1FAB7BFD3A08F0647BCCCD337854C2A5DBFC71D6E17C8E45134EE1015DF D6D49B8AFFBD8E288C5EB52D9C491B50D4E5951CD2A1BDCCA1E22F936BC2C2ED 4EDF6ABA107962E3AAD721036150579CFC38035E6758320A429B0F67E5F5621F 43A5D3DD6CE9E9E8FB9FCD8FB5E543FAB9FDEB0F4DA1CB6A7D711DDF7D8FE3DE 6DE9C944321FC8B8E832ED808F9661DA135E18DDA2FD2EA1985D9238DD24BBE5 750E45EBA52EDDF61CE19BEE681C9AEA6C35A111A5B9C316634D218A6B6978E3 8872F284CC8CA7011173F00F53AA3748862C7529AF4DF3B5A88294E07A0BD775 7F259346B162D6D1563AF3F49DFDF81B474372E9793F429C13EDD9A3107EC478 61E31A9DC381C0D6D17048C1FEBABEE1F2DD45CAFA00287396F3019D6A1782A0 2DDAD1DE2BF11B3403258736D8F84AC9800A1FF79914B313B0ACE43E38D860CB 671D2AFA0B7CB747CFB42F0077B14FBC13E5B1A256EB3C5C87A087947824A414 24801824C22C1153BE0BB01D629765A47F0AF80DCB8051395066AA1520FA4A09 85F3E1C172EE37F7B2E0B35BF7EDF77DA314E1E34F27CB7170D3C94B72227E4E 9302444B3884AFA0DB586F6B06C7851292C1E70B2C3B8308E4360FF423CCBEFD C04E98748130610FDB1EF00282B50D37B4C3428A8E415CA674ED4EFFA6FD2B2C 58250A11E3E7EFE00769716AA4F4B2E7E8FE2D8B996E2AC52A64B90860A1774E 0BDB52A9BEBA9198FD3B14C6BE04162569021D29FDF871ED8C754F238AC8B63A 64B39D11B506BB53A80DD15132FBFB626C3B6B593BFA96B4843A5C2FA253E717 525971483B640E7BC6318BCB1ABC01E1D4BE2422509305B47C7F2E19688A63F8 C8669ED629E4D862CEF610C490653B6E524BC204589DE4DB58113B5363893062 A3B18368947558DFC1132572713FC0BF13EEFA46885C51D2B7C70D6D0D6655B9 EC086DF8C74E7D5B3BE2F4952A8E7608781A012FCA86059CD98E7CB8AE3A3226 1C4F1359A064A5132FF1FE97367349BFE29CC54383EA2048A4402AED1D1A4761 8AC01E9B85A6904ACAC2A0432869917333E1416837262ABC670D6B0B47518806 CC8541216CBF204B75CD0229A79D0D33BE665FF95AD443ECA58D3D567FDB2637 3B4695FE7432D25F3702EDCC4B0695AC3525CC7C32CC7635210F53D6F8583DAE 1E869A060DF6D4E6FE1D8AFDB84DFF9202C88B5159BB87183B66DBA28A766DC6 2FB31F2A70CEB32DAAF4327CBF7D799CDDA1717211E9636D068B5ED2AF9915EB A090BF9E3602C60D631DA56A3457A02A4AEB034164AD958CE42896419DFDC8BF 7B9ACC2B21555DBC09DE1A7027F77B7225726A502DD5467646B857A449D7DC90 359632A5AD1256A9E5C2C2D6B7592092E1869C4ADA5D8E36BE3516131FB0C878 C3402A83DC7377FCA1BA7B7D87A6800664406568C7A1E03E68C80A66E075548F 70BC773F5B704BE19DC0F1627174E2E0633CDDF6AAAE55BBC3FF2B4C16508C63 FEAC64A07A83824915B48EB2BD860E6FC33A5DFDCE597F02949F01ED059F56C2 60CF27DF5929BC31E48DBA0B45749395D431A71C8494A232FCAA613A92B15ADC DD6A8DD8BFA7825DA222B59E66B84C8362D199B8EDF138CAD0B61D53A5DDF759 007C4AD503F42B644FE1A15D43E9BF15EE37EAED0B78DBC36F7495957AD87E10 C898E5C2DB7D657D85D5B78965D7BF2A36C6E9E6471FB21833B25ECE471A49AA 8CF13BF1B8B91706EF356AEDF89C12251FFCB38D5BE48FDBE1DAF27D59567532 25DB975FE75EFAA6253F34810F086E183FD705DBDECEDFF2F84CFC406752EFAD 610CCB43F9C8174CD0ECC75E186DD5268711B83D1ECFE7BEA93972BCF6FB89FF 0E918444C477A588E5398902CE35F087C6C7A140ECC12EAD65A518DAADA85AF4 2E9BBE62B2AD2B87175C3C38093172481E40241ED51940EDEA5E5875280F649E AEE9C73BD67FCA9131BF2D5952E7CF922D43232FEE86449DC95E58270357D951 2F3824466D651B556BCA4D81957B4B6B41E04B310C769AD533EFE3E810D70FB3 8DE0FAA7603C06BF0AE8688DE6ADFA139B4A8C85B9A1D4B8399DFDD770B2334A CA42270373997BA7FA7AF8D7AE5FB8B4E35BB29962A59D478073A0E6FAEB5001 E608DA0C2321F44AD824C29F3D320CE51EAA4ABCD736E7A827CC7267DA919B6F 05E35D238FE0A141900C9DA80BA116CEF33FD0DF8AE5E510BA55C1B909FCA46A D8DBE63485DA7C4B62798F17C2C7AF7D7B56F5D596CD7141F1082F38312079D8 F817DF66B8B915A554306415060370B7B20921C3E830F8B14DF9BD592D802F52 B84652207814272FC3CDC9CF869AC6BB7177A602D06B1EC58E87867262F499E3 FAC66B660CF1BA0112BC417B8011664F4EF5EDA89B4FC2A228D37AA561BA0C87 6377FE6607B26ACA73EB658F288D228DDA8A41D7426F160520D3E193C87FEFAD 589B91E7478263552419E5D5653ADABA011C74A71D560C15284FB91E35E2E089 28EB787843039A405720D4D08CCB670C86545007938C6291D0A86E600D2D95F2 43CC09EE4B46CD8539A74BCA6C5745C43A9C3B7C7511F1200027725C7CD9F643 F593DDF49EEEA97B663AD324AB97854203281D16255130F5A6A2CAB151D2D3ED 7FF60101E9C267392D43BF70D4214FF523D253B696DDAB33F9C02667FCCC0DC9 66BC3E43459C5F7CA96B1A0045C796A6D99FCD5EBE965B40C54462A1C4FF73A7 8C65D10D98BC951A32F2A1DA5403B56E66EB00040166D182521B16176E8777AD 21E489E04F4D8B2700B827257A117584CE6EFA5D5DEA065A3F549B08DC2C74BE 884AA60D906B3C30DCA87585CC7735A286A15B623FC9F0A6A0BDC1E4D532EBDB AA1C21FF99AA742C4FCD37D7472CCDB1EC83B2879E76C909DDE802B58BCDFEE8 1E0CFDAF154C75CF09702786CDC169FEC9FCE6FF72E1B7958E17EB65BFB8894D 291C9B57355E35420EE671ED01DC4293D06FF55E9DEAD31D6B184B7F49C53D7A 23E2E265B1D0075862BF5B62CF8C15752E816247BFEFD17483980D859C25B1D7 BC5C8ECE765FA3A1EB7388F039DA6AE51BE80CBDEC4A487AD676B5B18DBFAF32 658F8020A2A4A3AC5D8928472C9FB8135C4D6C0CDC9369AE3282235BA1DB62E1 01F53646149BF7085F56E37F455FC931672E6B6D4233C7EEF489A6AEB3CBBB8E 7131C041A93F23718A11CD5193EFBD6F56CBF6BD83CD46284DB0FD2AFDF1C463 EC177C7503B072F73E5A575D50FC0780F77118095C35C2B93241C51510DDBF70 B6AB8CF8DA989231C1D0A756271A1C996097DEAFB8D3D909227B1D1E3E61CC2C 95976A0920A57A9B67878B07710AB2EF7C7E42CCE189C154DE37EDD619A60A33 8ABD76092137F3E00F6AB407AC1CDFDC8C801DA75E17B13E3CF71C4E94AF514F 9BEF68C1C662DA4B39D7FD75B3E29674A8DD526122E8FBEFC73D9A80B9E84376 36F71C34C85DE6C22D99FC6D19B0F715C6AF95C2A8D07FCE5F888D141EBDB1AB FA4AF6256A2AEE2564C3A929BA6190A007CF87D91D58836C9F7C698EB6EC033D 013FC46FB581E0A1D2B0343D573855E58771792733D68BDFAC574AEE7F6DBB7E 6E4754B6A3742EA4484D1D3B3909EFC8C989CCB96794D981F0B3720BE855A0E9 3FA423CC50F63A548418F20624CB537F0F1D5ED7B4B6BB7E47EA5CC2E804E36A 5793ABF2EB2C20130AED82E2CEECDF8347A3853B6E93828A52932E0AD5F28E9D 1302A978E32BF43698E95AB9ED75019F7C14EC6DB8506AC92783E7A6268B9264 8D85B24C4DA6D2E97F850E1D31645BF776D6CD465050F0D2C9E9122FBFFEEA1D 4EC49DE569874E97E93CE5D55A2E6B1A687D9B54D828C535A6803247C5F1D573 0AF0AAA66394537DCDF403F2E68ED8B335F5B60B78AA257962201199050012D6 67BDC3BCD3262AC148E0A18D1B5AF0D1B83AF1D833667364B5B903322D53ADBD E00A3D28C08F72F8B7AD718A83BC3E34F59C3D9F1B534486534390106B78CD88 77E2FB50B91C838B45B0587C326A899868C2B9DC8CC63ED4BED805BFC59F27F5 DA97671D05C389093F022872164848CC48704A2E15D97AA0648C0B1263A16AB1 91BB96EB79E2E8C1A6DA13E0DD7F365AF595439854D06233C89D0A2C9F88D589 ACD01D7CA6A3C19699187183AC958BEC3B3292A32BF2B244B172FA3090721D97 13475B26DBB1D9A66FA8E6627E69740F3C359A9877CF555E2365C71289DD9B5D 08CD452314972BF905472CBB2B7EB36847E8E99A8A023B80AE39DD242AE95C0A D813695D98EB2AFBE00D6C2ED75281BC71094BE7CDD7C60FD069F96F929CBDE0 74BE07C5DCCEBB0A2B6A1D319DFBC88CEB99C68F3610C46DC6224319235E95CB BDAAEFC56170446F1ED4A0477F6189B8FED3E24CD633A5956864F3D934D03313 40BD9C83BFA7076551A73E0C211FBC330E132BE7202085B26BED27A10938A35F 9C3E5EC64C15B14349A502B6CB9B1772EAF52FD2FE948183342071E68ED8408A F7CDCE46A090461D8343E2F6F2A3A23508A32C9342314F47202521FE247CCDB0 5B1D0C8EF27DDDDE01EBC261BDFAE18DB6DDE289814DF97BF1BDA389ABE0C816 67CFB1114F082CC64C2D3D86F0CC8832F9992923E816FB2146C390155B349F11 731569DEAC88FFCC123710A0BAD4F69FE8A47C99A522E72B5D6807678CFAA687 E7CE55046329C6A752E75F0C2FE89054B474797025010872D1BF4656C5D99E67 EC97C17D63EBAB73138705883420A8D1E8B72CB9275E4C3DA387822A9EC34B9B 6770DA662F374CF59FA217EE8576872C7FBB93AE721AA4B1069A948CE67BB1F0 1A72D0A22DA00097C2197BC840D7D89CB3E6BD67C6E96F270A49439B4EDD33FC 1E2DD8330EB135EEEBB2BF0D062C3760281E2E59DA929077D2B034D6F8084095 4253024115066276653265F50A91A18D9AE8707A1FEAE25E63A8DBD09EA6C2C4 0CDF96BF558A3F4FE6744B5C8C83A02622E9FBDF042CAB037435EDA6FA9E5E58 19EBFCAB423A6A5927859516339CD7133359ED1F150B9F3A2F1DDD2B4F256991 BB55FC62128830B0E4BD29451518A16757B73D9DD6F640A73780788BCB05FE31 F6E2F94600FA3B4C7D64D8E83A15321F26F91BD1EBAB888C7E911EA91652CC4A 14DBD8290C1CD0697E09B4CD3F8F525BF5AFF4C1DDA58AB495085A18344ED6F2 83A1C0CC79832082B1C5FDD76C0CC63ADC2DD4C8D0E9F4DA7ED46CBCFC7514DD FDB1F528E0E001BF62415E99A2E46C448BBD21F92FC39989C5E20ACC6AF49552 E1BBB6AB793D31809461A10B285E385742FB2B7BA69753AC059F039560F37607 61DD4081A7CB71A3C8F1D18BED06F561E5D581B554A44A40FF75845A0A7E17FE 8ACA13D1D308A7153736BF14DB04478B94F4224CFEA632560C4A9679E751A5E9 EB9285F3E0374D66282EB67D23850393B4B57BB1A4D8D87DF255F197F8BFF122 BF36511BF48EC56EF3562694993D3F8437BC6840AE3E9BB8CB5E72FF85FE2DAB 5B65EC0367F2147E504A644869B089307C9BFEF1F389E43EFA7F9CCD4670DF64 9519D3F86E5DAF6CC450CFC5B133293614AFB66FFEC483B85F3CC4203ECE059A 07C45CA5DF494A6BE27CF03390D6B650CD0B4FA1AAED79AFF572750E45F8E4E5 003B406AB454E6C2C18E49A208A2293FE80D072940CE3CA197BD411648F456AC 1FC4603D36DC45E7664A1AA4D167D0870FAB4C25AB3BC2333E6A75A087DF2F67 1BDAE14B77D3E9892948BA5C99EA375D77BB542C3F9A2F5089721E455926131C 692E3DA7CE1A707D93A4919AD555CB83ABCC364ACFE4159314B3D2BB3C0AE905 C7FB63D11B88FCAE2A99BBF61664B69E7C42746D6E476FE03E3684321C4A649A A46E89FD36D22F94257C9C963CE78F6C6915856A70DCE5EAD205A3A3CE0FD755 FF9D2974CA28B364411BF9D72730ED9A628049D57AB193BBF92D8463047F6B72 6062C31C5DDC75B3F02EB7CC95A2D9A498DBEB32690F04BE6676615D3C704FAF 7C4250A10C8CF383A80DA86840AB8C465D49FC3603A226D242B016A9B6CEA21E 88ADEA9FC501455E229CB85A0C12369B2B76E5C407E51F17901E9B5617958695 DEC3541EF0FBAA673BAA01DCE61D7FB7659F854BA4B066903B361FFC6DFF4B13 E6840DB5C3B19768EFA1F3967E9E9398022655F217C373B909B4B01733895136 E9DDA1211E6B0CA02852FB659F21AA0280CE6EA46D1070346783495BF2115244 9E91E06459E8AC46BCB9C98C89D2457C2F45B28A5AFDEA4DD15AB8134C052D5D 1C8A5974BCD179AD27A3175E85C28A53D2B3CA7F7793BC1D8766C5479D82B022 6549D056CFF23B4BEE5E250ADEE863CF4E3181CF7C205FEDF9DE00F0383F350C 5BC76019EC442F52C5930E73BE3068C8CDBF49C547B0A0E7142E1C42B5FD0853 AF70207CEB7B9DDCD2329113B22A553BC5FD169A46F2BCA71907DB1BB5A9DA33 986C76D2F48FEB952A876CC405A5031B5675A50FA45D418C65CAFE90213AA0A8 3115AD32630A545D930B3241D62B8C7AFCEBA19720CB31E0239614EC6CCE5E8A C3273DD8065429117F79720DFAF3E81A13CF79C233CEBFA2B240158D6E4AB842 238B2A74897B6E4A2D342E082248F8B1D6607137598B93AC3951796756793E12 2DEE4A0BCE4C41F9BAE37DA5EA7BFFE9979866947A23FE04A69C2BA612B3C52B CFD53B99C26D3271A32FAFB22CC1C3E2E324B92DC702917974A625DE59F19C37 943E49CA1C21E9A7C3192F5CE3833B516F536986DE74A8906C5CDF185AC438CB 1D71535E0A066F7E319645350D857C66E2B6E9AE20B506FB5847EB16E5CFFAAB 039C6E06B59EE45D5246CE2B1EC7D02ED7F0B3FA2E99C7DA9109784DDAE489DB 6CA864826B6AC43869706A816A5EA17C62CB9ACFD72B8D19445BDF4AD13BD680 662BDEB15520106AA29DB4ABFB3A6578D5F4BE3754D7FC19F0F6D1D75498F2D3 404720C744CF8DA4E74CEB9CCA99D33711762C199A74EA3D8B9416A451654B74 51582D2D92DB2A0F050F7C3F2F47CE6F9C08E1691C9B950E5522CE6881C0761F 6EA206C95EEFFEE3FB04A6A934B3A9CA09DE66E469402EDBF35018BCE0EA0106 44071EB1E73F7A048B07CFC4F35264B3B7641321B27CD7AFC998F7AA9BE18FF9 AEAAEBE0193D07D05F7BF26D5D78B6386B603893F37F3DA4F070628D062544EE 63E4E7AB8B5C90BEF573CC98C3D779834F38A0E8281B33C929DB3931FF60685B C1E04EE83D393EFF8069C6FF7FD0ED489282A6699AC7B761DF15249FB00C575F 760BAEF6E543E359D87866F4A7E367ECA58A2692A728406126A18C7EA181AEE3 A44102F75955AE2E692B56F1DF37FA0EA881E7185069AB924E7EA28F8808FEC5 7FE73899927695DBE812B3A1D8CA93E2D0C7BD0E01DB711E877B90ECD56EB21E B5F85BFCAB551BE448B6BD415D860A799CBB862F3326D551A214EABC99E3D3AE 82594DA2D7F6B76A76E07E60BEC404671634EBCB560E659478198617A572B7A6 31310E2C66406B8CE6373E51DBC815B0DF1529FBC4C15EA0BBD4C881E01CE7D9 F274A8EDAC8887D756BF1007741B119B1D3F1B01D240B103E80FCA00ABEA2CFD 014507CB06C5194F61E62A1A4A53E89F37AD107B78092B663EF83899301E5C6B 4656879A97D3787F2A8FB8E4A60D5B0BAB9C3D6A663906E513EDFE3043DBBD16 BBEC8E7C49A7039E4FCBA7B64093AC35354C7F6EBED305397F140035BD56D3B5 1E1A81A0109857A85CC81BDDC700E0804204B28DB67717566FC49E9ECE0DAEC2 D26B0998183B6F23711F56E3DE9CF9A746329952A62DBE6791A9BFA865364C85 579EE3639205BA7EF8D038388372D5F739A851AEE9ECBDE4B3E3DD13088E0219 7CAE5F32E70B7BD92F62819E2969BFFCCC7109A5A9DF9D00F10E367707E00A2E 24328009D31878A81043328A89696A6772607379A49821DC73DFB7101F141B6C A0648ECD97420459D93BC85B6A7232E8045EBE4A46DD53913343747D13A9EDCC AADD4B38B23EB097B9A02511A019A6678E58BA0230AB445324CF233277723C10 6321D7B2DD1478A429FBF0CA42C7C3056CC66B70A8F6B4F497857A9D2510B21C 635D2AF8BCDF97B484A2F943F85673ABF9C0CF13D11C8835EBA953556899A836 F5FC283E82E62E73CF5A44DFD2ACDF9C96D3690FE59923E9AC14576C3D7B47AD B52F367C875C0C78354F47665008E0732502B92EBEB537C9CC0973525C5E2089 C897BC8216E45D7F2CF8988B4A8088280DDA4C3B090B0B1300FA976094EA660C 0C56312CE99E3AAD9C95CCF2C1D066CDDD8E2BDB019FA9C690EF843E366F3803 BB28B661172DDEFF37A63A844ED76659B9202D7F163FD89939EE16D78BA096AA 9DD18E2D4338DC75DF4C6D859AE0BC23E096126340AE5AAA000856D79CAA93DA 45652AB7F1B4E88B074238FB741FEA209D3F8A9C6803B2A6D0D5F91BC88D94C1 3B68AC4A8FA99AD327819189C178AA294F35F46CACE1962354AACECADC85A8F3 A25629798B6C90525F06B10DF75E648206103D7763FBAA27282B175EB3B09167 C6594665A41362CC3286FD471350DD2EB6D54D175CC78A200066B4BD928F557A E31375857590D5A3A8E5E0BE7605911D3803E8108A715C7BE5E24A436D6E82BF EFD58DB9107EF31511F69E2A95C3C9B90489EBF17019D12DEC48A922C75C3ED5 4FD8C092B37DCF40D6EB852C687BED0C189B464B0D08F22C9D7A542C51A9ADCA 4919F46C996682EB10F3AD5CB76CC70BE5C199A0D35958317581069780576672 75D1A7AE844007E62F9C20845F12746BA26220A7E144BED9C5783AB33748A192 2F2EE547CE7E87E93505A22C804269865EE376F2686BFBD629BC2D657E5BAA48 F3DAEA2E267D72C245D555EE178BD5870469B102443ED294ADF2BEA57BC5448A 948313FB4045421BE63D50B1E5D8D07BA3675BAF6E428D79FF158D4CEB88A890 B8023A4ED43ACE2F2D2AE67FF49CDF7140D19AA7727700983BF3AA2333D82C5C 274D0A16F07662B85F82BFBDB01E19F98232BF2855A6635EF03116862BB40082 0AD998D91E8DC13A578F98AE616869B2BEEE242936B19DC1F47225F5B21299F4 CF582528CAD863031F87B416F0076656A4F4E7E851890BE992151E96D0FBF420 DB2B3BCBE4BCF84F9A6F10A5E849EB783838D6ECED9F0C518CFAE39996F87562 3034FB313052202B4AD294664E6D7350F235BFFE552B3CE04617EC8A15739EF5 0E58471748B2854ED3EF91EF6E8330F63916674081CBDEAC874A17AD1514CF0E 2CECC9F7949F6277C910ECC21DAA735C4E97EE1A73FC675E5044308556BB8118 6667827362CD4B554C2C80717F5EC461E0E7D3731532D3040C716C6C7D4BE266 1797022E3C4FAB87674FCEDFD94DD403AED6B573199F19D32BCCB9F82FAA67B6 31B0DA0B749C7859B6C2E975FD51EBAC8D441F84E69543627184953895D021B5 6D9510A0F8B3E364A64895AB4FF86495EBA17088D9B95BE925F1A1AC5BEB2BF4 797E89C1C61AE8640DB9032EA0C082930D450540F7C2F5FEC25D51984F1E3EF2 FB526DA85186797031FF88339A4E48B7D953F4B72817FE4B1F9BE19391175F94 C2DEB8705549C640D91AD81D858ABF1F84E51BA96B9879ECB03D2B38405DBBBB 681CC3E23D949D4D0FE5780C5C7450FA32493E2A9E534BB42E9405B1E2D1A2AA 2822416ABA551C4E657DE7BA71AD3F5A41370E9166B156802F0A5896D1AC05F3 0F29477997E2330F4E7114E2F6BCAF2C2C6B875A04361B134813EBFB78055A7D 270E4211EC1A032498E02871DA5B38286F56B43893C1D5EF16B2F13513161F1E 968AD9F9604970C7034707358F27C2CBF4C463E3B7437C947AA0D74582A431BA 4831E00FC078A4FB35C3B41F8E8959E280B2597CEC3E2A24C25A99E5E8035CFC 24ACB465093971775CDA094575881613E4F476BC6338C9B0DCD03CEAB1BE03BA 84328B373C295B5C2015458F1379D5E56762DEE33EEEB15D290982E202C779BE 2FCD2ED33A29B003867E4DA9E1270810F331AE18DECF30E9F8761F51F33388A5 4CC33C068F395ECF1CA02385819DD0A4340534DFD9868D86BE619BED6EE1DFDA AC004DB2AD2396716991DB127CF58F8492CFAE52097B52914AD133BF911B47D1 8E51B365028288087B633724947F370E3E2CC662BC2CBD9CC3808D4D91CEE846 09F3048B961E1D6A9597C7179E5FCEB838A869B62B65691E7B0EF38A462D7148 667A5C612C265AFA35EE36A4639853100F11F12934E9EC5BA4E11EB4029D3352 B6CF26CC066E1F21FDADF574567CDD1C89595D37D5FC769C20BFAC3700D36C5A E15B68FF13480ACC44BD3EB6F37923BF7CBDA8E7C56DF50E74FD67CD91A3BB30 384F17776BDA399C9485F36A600EE0E924C61D3732E604A77A621957EE5AD374 37ACE2B64C5FD9EA9A8E97000B120474573350A7F56E6C022B0A4F598AC3A829 9AF7DA4B995A95BE2AE1F0B04FDF346E8BD1198B227EE70A16334FC9BA6009F1 B0DC399F70B90F0FA5F0B036D211A0D47C5A4E3F63994D3EA69C353B1B1FF0B3 C9ACEE39F7A28D0FCB4358EC9922348C04AD417C3157A17F46BCA0FF4A4B4B4A CF1C93C30F3305F8A48E39095C89174226305127FDC825822BC85E1DB653B643 CD49F998AB656DC0214F5158832FE53CF8FEC0D35B68732890F634087DBD32EE 402CB82E699CD4825587DC69B35884B0F22A1A1BDD9AE1D23C6A862BD3EA6EB4 9F9D0ED6F37795E2BE304C3FA1B1BA7B9F163751F4A173DBF22F292D683670F1 361CBB69AE96BC6476C4EC1C583B1322F922B98EA5480F1400A22601963DA93A C3E0332BA6ECE74D2D4B2854F3E873D533052C2371D4FDB9871375A8FCF9939C 8F97F587C4778C235E83BE223FA7C48D44817E599F0C67DBFEF164EED99F20F7 6AE234B78472F25BC65321EF5EFE3EBDF5D3DEEB7112ADDA69197BA856038F39 D1E376B36B03043379967B4A4391029B4E8774F86550410CFDE192BF79864EC5 A8531E2C0B1960DC457AF697BBA5BB419EF05A1CC9184D3B59E0BE52AC9910F4 7EF9DB7969A420305F498380187874A3804B21B9C6A1A5DB934B9B1D7FEC4508 9B83861A69869B22E17CB5407F5116B7622D3640824DA8F8CD3DA42FB59483BB D175208507C84A8DFB1C14201C8A72F7168951657DD5AA56D6FA717174C272F7 C85098813CC5A6ABDA5D75028652E32F4706B449ACD17827B0A24C3A80C6FC0B F03C4D7B216D96EF514CDE95E9004056496CC4BB408329EB7505D378EDBD8E02 E5B76A2830402A4ED9C5386BE4FCDD38D869B8F7E8E68E694B7E0737BA6BDC91 C95AB944D95D2DDCF264F7DECACC1487836030FE9513B358E1D3B2B035F81F41 99351E7EA8A475FA51C3B376F3EFE4905340E7D7B812B894953F39DE251E6B22 DC0620A0AA9D1D7CFAED319056D49743909D3E6F25038509495EA592BFCE5863 AFD92F32FC2B0F57D41ED784B2D52EECEC771E9F5563DDED0E8A96CD56BB73B0 4369B7FC3B54486A5A5D607CF00B4A0D4F3E699E82FB61908EE53F37384766D6 66A71EBD29B49CB2B2D08739D8B7EAAC52609CE07D2F35FA12384EDB0BC67FCC C0C8A140D240E16D802FAB5DF7DB262E2D116601A079EE249ADAF04438A2E7C5 3A5A75D6BD3D475A33B9C3B53FF5859415D8AA4D651172E24F4544F5B41AEB15 B6C794F814383587080FB74C8D10B508F82084D248266E08945664BD4BB9203B EF6CBC500036A0DD450E77D5DCEF44F7 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMBX10 %!PS-AdobeFont-1.1: CMBX10 1.00B %%CreationDate: 1992 Feb 19 19:54:06 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00B) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMBX10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMBX10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 12 /fi put dup 45 /hyphen put dup 46 /period put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 57 /nine put dup 65 /A put dup 67 /C put dup 68 /D put dup 69 /E put dup 73 /I put dup 76 /L put dup 77 /M put dup 79 /O put dup 80 /P put dup 81 /Q put dup 83 /S put dup 84 /T put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put readonly def /FontBBox{-301 -250 1164 946}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F00F963068B8B731A88D7740B0DDAED1B3F82 7DB9DFB4372D3935C286E39EE7AC9FB6A9B5CE4D2FAE1BC0E55AE02BFC464378 77B9F65C23E3BAB41EFAE344DDC9AB1B3CCBC0618290D83DC756F9D5BEFECB18 2DB0E39997F264D408BD076F65A50E7E94C9C88D849AB2E92005CFA316ACCD91 FF524AAD7262B10351C50EBAD08FB4CD55D2E369F6E836C82C591606E1E5C73F DE3FA3CAD272C67C6CBF43B66FE4B8677DAFEEA19288428D07FEB1F4001BAA68 7AAD6DDBE432714E799CFA49D8A1A128F32E8B280524BC8041F1E64ECE4053C4 9F0AEC699A75B827002E9F95826DB3F643338F858011008E338A899020962176 CF66A62E3AEF046D91C88C87DEB03CE6CCDF4FB651990F0E86D17409F121773D 6877DF0085DFB269A3C07AA6660419BD0F0EF3C53DA2318BA1860AB34E28BAC6 E82DDB1C43E5203AC9DF9277098F2E42C0F7BD03C6D90B629DE97730245B8E8E 8903B9225098079C55A37E4E59AE2A9E36B6349FA2C09BB1F5F4433E4EEFC75E 3F9830EB085E7E6FBE2666AC5A398C2DF228062ACF9FCA5656390A15837C4A99 EC3740D873CFEF2E248B44CA134693A782594DD0692B4DBF1F16C4CDECA692C4 0E44FDBEF704101118BC53575BF22731E7F7717934AD715AC33B5D3679B784C9 4046E6CD3C0AD80ED1F65626B14E33CFDA6EB2825DC444FA6209615BC08173FF 1805BDFCCA4B11F50D6BD483FD8639F9E8D0245B463D65A0F12C26C8A8EE2910 757696C3F13144D8EA5649816AAD61A949C3A723ABB585990593F20A35CD6B7E 0FA0AD8551CEE41F61924DC36A464A10A1B14C33FAFB04862E30C66C1BC55665 6D07D93B8C0D596E109EE2B1AAB479F7FAA35279ADB468A624BE26D527BFF5ED E067598E1B8B78188FA4BCFB0B51692D07B0BEBB930C6F0997B437E2C51B876B 61A563A2673932C2045833FAA35DB22ADE12102335D5DC734AE3AC5EEE6658D7 92EB62131E1DFBA441F53EFF9021D9D4C491F26BE8F54C61165CAD778CE8695C EEAF70E3B20C64D4C2B34A084B5770BAB2A974E898F62BFE90F132A37E2DCA4F 43E13DB13C94DFA8ECE2B7374827AE168634FA007F8981ADA046CED3448BF453 FCD9A4F194FA648F9FC0971734BB69CB73439CB0DD021D44A7C11BF295E81733 4DFBA460FF3D654F9FB337E99E6D66FBA87A817EB9CA1536C84833870E3626DA 55D48DE850D3E6F6B29DA0E7C9D681283586F208DB8D58042E3A7CE55BE84822 C98237911453E479EAB65AFEBA3F61A763B40E74535BE56C9D8D06DDF9441741 5C9D9D917439368736619717FAB4F06E2C329AE0BA411F3FD522D9C33AD8369B D7DCC9DF993778482F35F965973DE876FA19E109AA198A00658AB3F0D8E3DDD1 08A573F2D525202EDF2C3F52D34947E0964D0E8E89F6043C0D2C9C394D2615D3 5E1E123BD76D4E60AC8600305C844091278B74194D938A402F66FCF1A12B17FB 64C1F829392A4308CA536228FCE80FD44B49B8059ACFE6DABCC6E16695199ADD 20EA5D10BD495D1151F4BB20BEFF60640B158E98BC0EAF63260748B3DF27CF58 70FF1D8B7BF07F3885A13B51C8B7142CCE34B3FA47FD3DC952FE14918D8D1191 FC3D85580E60350C3A635A2B883261095DE959F32F98605EF62847B1441DE353 FF998E234F034F0666FE27B523E655E470D2748EF9715B7AACDD6767403F4519 651AAADDAE550C14C7F46D949B25672A813C00F690D3C1C623DE81693159167B 60F326F4A67670649EB3F86E3A783D8FD79E247A630215E18F61E4B6ED37FD17 8755311B952AD69AF732D4506F970C9724013DA67DE117132DD23DD50A8B884C C3D0564A7FD59E083E914164B5D1B5FA98029D7DA38A46F6C1302B33D5583B23 F30B89E2D1BD1415928B7D2D39125FC3226F1713196D8B206ED266C2A36DA634 E3449F0E80D86D8E8580A71EAE0DC0329816BD095AD5C2A75E7672E7B17E0378 35641FEE00260B500C608A379066AE6C001650F8AF054091785BEDA0B8CA0CBF CE60D367A357871B353ED90307FF79C0CF85CDB9E770C35CCFCD37F066FE9FEE 73476684A2B81AE15451F0C1698F1B015A3B4F927CABF282C3342803610B2F3E F9F080C1730B1A0DEEA5B45583A924931F35B679F58363B8F1BEE2D9CB067766 63FD94272B9DD0A2F7EDFF110AD9468A0E41C5D9E5EDC36C78E36FB54C45EC48 2BBD13129C8D01F10B2CB65C9616538D1C225AA0C8726ADC87E473C3082F601F CA43019F42874F380B3DC2371B699D422080FA3BA627AAD885B37436368B0530 DA3E220D6F02A567FB66C9CA4B7AF9CBF699BED87EA10470FCB0C70BA1B09CDC 660C008F3590BECBC508D4EAFEE488C409BC09A2987C42711E5AB9E16A258012 ACD0457496648736661B10AA612C369CE03BB374617AD20207D91E55E7A56198 F7A4F6C879E2846F083BB78B819FB644805193033E155AAF48909C339E361C4C 2A6AAC8513D2AC14FFFD14CB92175DAF4194CD5E470665532B9F3BEA0EE8B651 CBD2F9F54F692AB2EF881ABAC4B80B2F77F70C524CA16FDB91B93B2AA8C5573D 9F3B618F597C493D8E7068102F7A18CA854FFDD456307692B2390456A7106D05 B142ACAD365E7E59C39A2EDDDD4128ACB02EF30480BD5F1EBF4E2CE882EA4C3B 89C4848E2B528C09CB681F43556B02FA6A8F2F2DA83BFEE0691C41C93EBB9ABF F48E55201FB27F17D47C918E2921A88955DE3CB447536C6B67F6432F3C0CE4B7 59FB42B646E173B8798C1D3D13F8FEEEFB08ED4F7CA2FDB061108F9737461A48 C5BE2F6042D916BB7B91CDE91CFFEA7EA4081EA513C8683A544D7B97B60F1B63 C340188D3EA8083D1A495BD7DC7F2B4A45B67CA962E2F554F12345252F5CB09C FD21D460DE582F723D9C4CCEEEFAD4B9635F23F26CA641F65910CAC0B857B57A 58BA38258C638CD19259F66157F1F9D02213B05AF0BF5B78EA275A1C1F9CB469 00C83026FD63925CCC2A409AF16A143719F1603B6A187AC8662AC7095AECCBD9 6CA591D6C641C54074AAAE025BC4E4538C0DE9EDC2F745F6FAB684AE4C2BFEA5 CB9B526AF998970398DBCF2C960C864D3008EC259EE98277A9DC34F44379AB1F 277783DDD5A09B64140E7423F666C5A3477D3044FA4276E59225DCE48C1860C3 465D89A0A3CA550C1912BF46D1D038C0727F228199EA323C24875115E1DED127 C2E911F0632E520BF918BCF953ACE05A61AB99B2525C2D04690A5E4B9D218BA8 FF99CBC5707A15AA57BDF3504E7E2E5288E9B20D7C10C7984D9C59A688BF20F5 27A2063E5D151F933BDBEA66CA8D8FC6BAD8FD5A74D18FF44238BDBEBF5911DC 9182D1FE5A51B4A3438C54B3E6EEE083FC42581290171B6CD52E07CCF835B75E 8DBB0B35EF380E6F6A9D89D3403EB55F3C27100275079700AEE4603DF560E902 1522A0F9CB9DB57B30343940A5BE9A44CA0D1D01CA0C575CEEB022B79086B9C1 5BE476A016048DFB9133D123AEFE1193988CC9A8F33E519BA9E7A9A0BF90C73A 2207780E3A3446FC35D7110318A455A60FFECAD18F12A92C121E916E11E0E2B2 1E96221FD8F46B5649FD7BA8CD3AC799674703CCB77C706B61BE237AE1E08E7F D6999E5CC9533CAD95579B29525D9988F34761426BE0CABF3B08B144F4399233 01C358F91F0212DAA55344969F22EC823D457D17640808DE59D14238507670B7 8A72919F8F28924298AAB851D2E40778DB6CD071BB56D8504BAB7ABB22588D85 E89C74DA9A4E80654EFC47E2F7D9E5EF4E4314A82B62CD0CF3B94F0E3861EDB4 750998482F0E42A3F03DBE41629E028B591DB7C1E42979F4754A37D840354839 5236EF2D3D8A0F82FBC337E38AD419F175DDC9831A1F5A4C87B36150189AFC47 FED4B9265BE53BAD5EBBCB5180CE483749179782030042529BF252843CA29B3A 1B1B08519A6A4221400DC4BD8D48CE76DB4E02DF0E98C78290C9361D340E0CCC F2AD53E3641CCAB42F41330F4BC4D911F87FE9303A0B4718285D04EC6C4008CD C7860D587159A643AA2ED554AB1C06B090CFE8958A1E7538FEB23822DD9116AD 00AAAE9112D672B43356F66F3E0103C44D28ACBF02455E229CFF3EEF9E79CF8E E81793AE4D29C7ECF91A4387F510D3CF66233E93CF886A6E58D7ED4686A03978 486434890CEA26EC51E671B0126F125A43CAE8C119A5F084B9AED690D1EAA7F5 3F241F3BE5EAF4DCF931D665E64C6BEB7ED4FF725BF230FC37FA000269B023EF AF05912C6A7788EED2BF1FF1E690020614B38AA377CD3C5BCFAD8E63D86083D6 9FCBE678FF0BC9AAE973CD1C5DE67DB51A43BECAD764A4A4747FC24296485A54 FD5229053857CD1ED4E4AD506BE96289FF3BAC37139574B0A133E5C64B7A4AB0 D08019B6EF929EEB9DE41671CCF5D0E10E9C53216E9BE0A16C503D8298EA3FB4 CB1DB3F2B6D1BFC7DCB4CF8726FAE7CC81966926AECB99D0388A5FCC9B2AC522 76DF6FD67190B90CA8F078068DEE98D9989A519FF210D6C39E0E6E886E93D4D3 293615EAE43C7E768ACE33660B063CA08860D5095A47BF843AB072FDE35ADE5F 3597D2F92313835783DCA46F433E10EEAD48F63EF3C0DFB411CB0AA732FCFEBE C48960782D24FC7474B5284C67DF419F59D74E890380CEC5B1043F69383DA7EE 0F8A85D9A16766BCA8A51C18A7B4510EA9C86C23132F82A360BA9E97016ED4EF 13B624A4ED40D1A810B0F8412CDB4F6B6BF404ADCCD9CF7E71C4E7FEED6FB83C 1EA18755BE92B5639354CC1494C935EF836CDC7C611372CD660808E4CD5F91C4 3590AFE17D81593307EDB413B1387080AE75CE190846896D3AC0CE076E90D05A EB7AE8CE188DF687848E8E1E56574CB5AEDCBFF7D66002752206431183DD3056 A0E953FCC9CD7A8679B49D1A3ABA5FE7E68927552A1C413B7F91E6472170502B 58A424FA2D7E13EDE167EDCA5DE461094309F5DF48FEA287815CF63BC9389602 95793BCADD65840EEEF2B95A6A0D5B6A9F2ABAF5CA4ACEBBCD4F50C97ADC2AB0 5B91F3D1EE8ED75F4DF339E8D4DE075F2A79FD45309D0294A691859D67BFB12E 9842410D62E7328E76587AB87B38132B7E750BFCADA1D261ED5345BC6AEB7CFB F6E38DCD61C641282CB462E99305C189221A1DDED861908EF6FEDD7ECEE104D8 46DA740E57F17EDD281DA50AA9375544FB8F3EA2768EE823BAD9457D88F73CD8 F9E0E1E0699CFEF8568818B022FC1AFF8E6A52B0415C72353149321A4B8484CA E4FCB4040BF51E4A51D980216966FAD6B8D0396CB9B7ED2941F1E4C2BE8B0550 16D46076EA4D5BB764964479E08F3A3BBC8D35CA881D10B213F312A2DA4933B3 0B9EC894877D79E4FBEAF609625626650E2A711B89BEDFC2F6014A9E14D4C04E A1EB4E17FFE9E6B8F491CB95A559FCC28CAE92BA4C8D1420DF87381A66DCFE64 857218DE0828EC9D267C801204939853EDB1E1299A3E7653FF5386090C9ED128 63C594C0745A4EC9FDAC9404EB53E10324ADDAFE62D9B124BA7D40607E24877E 7942DA1414B21B385FE6BAD4A655793CACB7AB6DA75C72A80BAFC854A7E45B47 F5C90DC69EC66EF77E8B10F21880E43B2C165B78672DD0FFE60200A2C38100CB 386D6F9822A4FB16F5A9319EF6B159335C3B252171844BE52988CC201B25408D 35AE615CBFD2BB6625FC33C084C37DF43C486D29A80B0D571A6315DF1A278AA8 3AA5A20953D0615FC18B78036071916F397C57195B61A065C33E75539161231B 998E34A9984F7553ED1427A011820941ED9088EB2A9DEB154649381DF67669AA F07DEFABA576CB1C9F3BB0A6D38960EA7A514578C2ED399E3E3D46922255DDB6 E7B21AD86CACF393D81B1C20821DAF0305D74310B8996CB58C5C0FCCB7580E9B 43BEC50DB0459692FBB8DCD23610A4EA063C064ABF26D4E14FFB5E91E9A7D0D4 99A57AC6574DCF57515D8A21DF5B26BFFF7416362A5224F00C1101EC30AC9C70 6CEE2FC9513B328C86DE8BC62C72AD08CDC2DA3EF30FCAD854676F74DE8EAD87 36CCE678B45A23288CF5BE7777725CC878EE6D5AFEBDE4CDE4348DBE254AC31C E7929318648C923A30F3E87698C9E2044DB94EAE0C2E016F9B63461B120F0FB4 F6F6235CCD9A096A30BA9730003D0B3221A2B6B02635E661D833D2A0688669B5 A4533052C8E7F3B6568D67A95BD7D99DFBCD7B76A7AB7D9669E8DA1ECFFAFD23 92E605023B2E7F19B2BF600C65FF036E79312733AA2834D0E1A8841CA979EA8A 8E5CE358877576565A3471645178366B885FFF48DC004FB14C218B253BA38993 C680AFDBCDFDEA04B35D9364AB3B0C4D73C9ECB4D3A0013CEA0BED556D1AAC22 F6C8378FEB3E63069AFBF63081413F1F00EF269EE3F6FFE537E170A2E35613E9 2003D2ACBA8DF3C9068E67668289C65DC80617334D0ED1672D1D44A8613B5388 0FA120DCEBB6476DDBFE5444A23D815A533AAE68C658ACBC50C428E337C5E70E 0DB37D78B8C413E95EC12D607C4EE02EA4316CDA75C51F07DE9BAF8290D6159D 4A79A16DEFE76A3D774AF728E5C4180580EB6FE2BBE255FA6BF80F887E462FE4 B4AF1408F6F0F5DC7312A5FEA270A1C0A635C4A78B05960026D494D4720FE53D A32A8663E0BC8A23512B922386E295F0ADF7974EF15010DB3450941E2CDEB615 FC3085BB008C8B24AC8F6D57848E052B19D2ABA44EA672C623E0D294C010389A 49186EBFF06DD51474E6674135F5AABF6E138E65802211D6BCA5E3BEF893E81D 9FE73E9B37D395D0995F45B7957C6F50573498BE3DC7888C917D141C2A8A0A8E CD0027AD1B35060E476435F87ED23E19B38B5DFCED076A19A594A1399D9B7EC6 DB7C2CF6E1F5928A5E3A322257CE4478E904302CC9E3975501F4BB2CFA982D7F CDD0E316009F35D5A121E19895BB21529DE0EADF02E8CF329715810AF17B03C5 D4E40FCA3545BD17B9E5E7587927A3B5C0E2149B849B8E1954A7D66D015F4E44 D308BDCDDED949DCE99D67BF9CCDE422E05DAEEADB1BD3EF7DCAE7454E3FF47B B3F03D248AA7AFA4A64C329519B61FBC9982245A4E985B1C1688F9411A6942C6 CBAFDFE7789AB610506D0EA4C7036CEE3ED14E3000F42BEBFA10B35A3333D9A7 828AE6CED664AA2214CC94870F1A2DB0367E77690B3D6E2EA9F7F51E52A2C107 927D8724DF5D7C418DA962CD6F3E5CEB70C07F9BFAAAF9E57537261711BF6968 3BD0652B4F44F0BCAE4C711668215B94E5094662BCA077E218338C977D4BB38E C6E0D5665BE11F2747B60AD6BE318ABE5B751184CE97F19C9236BCBCB24B9FB2 F4FB928B852449E77D17BA3CE3A41910FAA307AE4581F2A06396DE04D3D49BAA 175D436B5A3306000E075DD0B389C0501F2968CDF19207E4E4A0ACCFB6A3CE76 2AA38DBBB8600D247342072C0AFD31861C12D5B6FED8A6DA0175BA35D42E4A00 A6AF27F1EE60FFF849752237550F9C824E3266B7AEA50F1396ECF6A12EE34AF6 14FAA86E588D01A0486C6991C8D05327A6A197F36E519519592BA1C9E5FDD1BE 0532ABFD1F9F9DF586A182D8A62C228A1B23B3E57E0B664E9AF4BBFCD66A7AF4 DA52997BCE3D9AC5459184270D96E3241A519D9619BE48046385F1A2301E7FA0 53D7171D572A8999125FAD962ECC8DD5A0DA13AF87CAFCF8712797AF2507C152 D286F7F2FA4B90059D4D9D828D2D90CE2CD2BC3E709E9215A4E80848E8D91487 324E3707BE4ACD3254F8F33D5F2182F306E6AE6D1E5AF42FCE6CD804BB1881EB 60EB7DC87D3086FD6F1CF7D974EA28D918A6269BE102ECC8D1177C3FF5A531C3 1B29345538D19A8E9F8B9E54EE3FCE330EB33CE303B797E6305406B2BB3CE87D C01873631C1EB837B642D5DB8A260A3733D049C606108AAA7CBA8FF8AF77E3DA 64DDB6C46AB2387433593DC6F922E8A6AAB29298462C0DA375672963862B55A7 723E01744EB0B70A431A8ED821DE1C34D2BF6E9360AAC388424D87B4D9C47AA7 404168B3F92B1F7BB577F1FBC332CD3DB6B1ADDB896ADD9BEAD3F6DEA3B23C67 245772D5B50FBEF895E6652F3F4CF779F618CBD2B00636FF5BF633C1392CE3A4 39360597564A4AEF49E540BE1091A7367CF7D0996CA18C965D4041A8910FD3D7 5642B6FA93EC073B9D51277D588F5AE31A34ECC08F2AF8CE42BFC9B08204A473 3DDCECEA45012F8734007555E885D21D7D5428F296EC1BBFEC77F57075938CBC 9E46DD911274C39056E104B9679FE835252E5A86741B0161192261105D6B9822 1811C587C2C9E5B98E4A74456488BD9F233E5EF192A350C2F984ABEBDA774A54 97AF058D5C0CDA01B30BACB92818C5AD5E787F6C14CB81609FF763A65E7624D3 77AB443CE66AF62B09826F6BE17A4C21525DE7BA35B36E1D6379719B22CE485F CAC2E213EC0F635D870D706DAF0CE1D18303574E2AD22D6702B19F4D3E594554 8996787B2918814F61DEACDA54E2190365952DF8A68B4AE8342D3A98BCDEB3A1 70BF4FC89A656AF7A04851000A0A5C87EDEF62E1450014AA8FC6F55B5C8E06E3 612C5329E2CAAF77B9EA3FF8685E13EC359B463447588581DBA3DE871BA72F1F 10EAA63E657F469E23F4E075FD5FD9DDB86B8F0815D6BFFA56D4A40B7B5F2803 828DBE7E63AEC864C967D3FCD70A70A84051BC1F482ACF92DC3EDED82C38F6EC DE656062E0E8FCE9A4121C8241D63A115AB40FE2C207BD03CC999923A3BDBDA5 7BEB789393ADD58100813135DA1711E7867BBDEC2BED561A737F0B1A070EF58B D77658A883C5FD45E0292932654398A3BBD3EFDF68535EE1EA6F4EBAECBD4547 6CB3A80A0FA537C9F4DAD7E4782E28C2BA39170181C52EC32BD2F6BF8A1DC30B 8667976D0EE0E51C193A212F9FC11E0784491A308A0B1E05303248D801655F7F 1F614ABCE115845045BEE8935C8B2A3D38C240CDC1F33BB7E7C902D7FFE8CA68 4F7E57FFF6CE3AF7D32E7E5A1B7A9D50F49186D8698BED0385B7A30C0A5B43DA F8A3448F3C83FCE56025A69A1C4F098CE9EDE236E997F883E985C9D605B81E8F 16B2B15330468DBEE516D63CCF7704B65761ABDCA2DBC1078800F41CD88E3823 706EA33044DFCA900C486A1D807435A1A5CF17B56C5A84BE3844C8586F86E25D 3B791DB2575D58352E45FA65947B609F1652207D3C56C29ACB04E49D2DAA2310 F24C4C835C40DE25225DB7B19377B1E67ED9DE83674AC375E8900936890421E9 41D9B54D30B9CAB838E0899BA24E092C671BA13FAF966D948F01492E3740EBFE E3BD451FB78AAAB2087FA47927660D615F007394F39CB8621C8B20B6115AFFDE 9572C4E3F8126548D264BEA2FE0400512352A856D2C46E7E4DF88BABD17FEF2F 16D7BB04BB43BE87E85321CD12DC7E2ECB0730CFB279C7D09E4058CDB0994A0A 4FC32472C0BE9F689945FF09C2C173635445FBA33C7AA4DEA331D5877AF53C8B 0F06DF99F6C390259F6922E16F483737A35B6CE99074CCB8500F517A159741FE 3B605FD3E6B1503A21D8F89088281DC48816571DA0711B906F19954983155F37 38DE56FD6AC1948608CCC40717CFBF6A9E859A0FF3BC1FEF51C5C86A3BB61C13 F5B99E6AACB2BEF697806901C327DDFCEE80B7A198910A9A84E26E6B0632D562 701819F193935F2117B4A138F41533A84249E1E89528A86A39CBB290A995254F 42C5E2FBFA1109111DE6E8094E4269FD13607F4AD7E1EC43831E4E7B8F54111E 7E0BC73A0C33A9D4E5B776AEE212B7FFD9BDE558B84BD749AA45CA4B6C55AE5F EF3D4A008BA402B13F3930915FF0107C2EF817DF94917D5A04F859421C10897E AE6DF4A80F7AA7C56C5983C16FF9FA74E935DF299E347B2C0F88159AF1BF5E28 FF72A15B340EB6610F3D148109B9364A4D4EB9FB96D0026630DA48C91B81E9F6 FA5C537D214AD8D89309D80A9D7AC30188DE33E2824E81848CE85887DBE5A3A2 E132C624EDF52F197AF2C234CDA12F21FD0C4A699BA19675CD4241F76DAA3026 470B862D673BAD8EF811BCFA0D5462FB31F57ED0A5B39F6584F41C5D41F5A666 82E257819CC94FF88ED2386C085468727E8788019E6FEEF3C655FD24736BD1C9 59C85C235958A2A27DB0F79C0CD90F53063F613222FCD68028442D8A3C73DB8D D89FB3ECF75B1B1D5EB84DA6593C8402F25DCB2E02A191FF9F121AD317FA40A2 3AAD6E38335655C4DDE09BB4116267472EECC151A1E1598971DB47761ECA0756 8D3ACE710CF45A344B88C3E7A8EB76292F876326BECA405472B65E62C00DAF05 A255282092FB7DBDAD32B5B4A1AB6CE03BACFAB2928A8EC2E16A74ED0A15431D 54466C7B83158D4501566BACD19210FDA4C3F5192D3D53892CA94E212C6E3664 446D5163658CE568BF22B766B550A218FDAE67B174DFD45E48E13AC9893E7098 7CDA54EA6262E2CD7AA6C092C5B6C30F0D5BFA99164561D73BAD7F15FA7E3876 6C16DE230885A55A60EE4BB2794104EAF0C63078617922AD73E428DDA6773A82 F8ADAB313F090B3B08FCD6D3B8C0D37A916F43304D31A302A8FF2EA2893E6939 50258F99323733A373BEDE59D083B1DFAB8CCB3D371F78D6D150EBE931A65222 ACBB97DBD7C2820FB0682140E69F34DC3E0CB5AC6DE893D8975A2F80F51AE256 3D735684D567B62847AAA9493DBD176C58622298D0F4C0965EE406358518ED51 935C3935F2BE2FEE1D08C6384ADDB79975B6F3EB60353C59910BE1EA13BDADB2 8CCEEF614F59912F906705B92289D782137DF21488712B96FDB5C82733AE6DC3 1EAD9E240575D9C4AE0D09CF99B0EEBF911B47D188BABE28AA7732DBEAC86F31 A8A6DE0313AFEFDB4D7C4C11E132C876B333D197557D1134C0915C4E2B9A1CBE F02881D2ACD5DC36C5F41D4FB78EE7DC971546C3CD0F78AC7981805DB933BE62 4CEDF40D827C1A936A872B21DE62343286A3A5E121666BFA5DACCE828C4ACE3E 46B9A5D51F9E1DBC075BB4F92B02F70728E0AB6CFA264DB79FBB49D456073846 89F8EE4F6A0DA8A82862DE59CF164D211B24357AA48759125E2368C06F5F8E8C 3D2AE449D28F313EBD7FAE2EF7B6F57997F2EAC7838073DC3A199C6A6F3981BA 4C67251B3F52196D801D386206090112FBF316477CEEB5D24CF11C158596ACF5 36AC679F8E9EBEC8063C2D5D80BA226CD044B1ACE8076911708CA90BE28D5212 6C57CDDE24F7B7C4896FE40E242559C319A611FC620D6FCDB8CF9FB2BFED7038 D4C3C3EFC8F3A00A737A09F1CDFDCF85FC236A487B54A0DE2082209D89F3AECC 2DA00AF956D05AEF68BC2A804EAA61DD952D4B2B9C76776759C47681BD5E68E7 3F21B0F679CF7CEFF8019FF5AF62D09C877ECF56D3D1746DAA4251408772E608 6B058A09B92B93BC36C6CFB788FD4C998F723DBA7ECBFAF2EB1E719ED20124A7 4908AFED4E81B557CAFE74A522119FFAA9EB8AC2D1A1913EACEBF992EF7A84F7 6C6CEB9D4D27C8E531731E5987311E42AA3BCD1CBB72AF0E102567A30AA16BDD 396D792819113B9D3FEE685E1825BA71E581405FEB1D17E35ABC0F7FCA356A76 6E57C7B223D7E2665102FA8F6CF342F21A1AF23A7A355F47C649569C862E1916 437DED37CA58A01ADF9443A06EE2898E586EA6349C20AB2B4A021783D61F4EB4 07B69471A04C31619DB9D126DEF573A02F7CE6F6567504208DA74E583D06B4AE 23F5CA1FFAB25337544FFA1AAAE3A8102420964DB0BE2CFB0575D74EFA99A55B 206331290305F19894470947B8037EFF8D81D8D45F4DFBE73EF53F207A16C74E 9FB9D01715EC81DBACC2C70BD034BA51DEFF07BEBD95A9AD96B00F63E7ED459D 1048B8B8D19460BEF2DFD652D61CFB7C782878A88C95A987A9F04656157300FF 17A7A7928437912E4EE041111AFD6DCB8A3D7F3E4AB21F73BFB44E9875EF923D FA25C7F9ADD6B5904FE0950E76CAE1772DE1A65E779A6FE47D7A091DA2B89B64 5DD98AD700F69EBFCE6C78AED0949B640EC301EEA2A199CA608357B0769545CA 82D5234A101BCAAC7B37BC03F5328F82C7FB5DC87540874B56164ED9471D8363 0A0D03CC970704E75AFFAA65FAA3343DF74C4F060F8138681698969E8FA6D9EF F90A13DB97725C9B68DE763D9A9C80986CCFD704DCF2D60F25EE41B1DEB41BC7 428BA7EC57C714F7B9FB469CF2841F1ACD1FE9D03D7BEB5A257695DE47AE1375 77D29772E3F84D1744E3B87693BD35915A64D826B39E8E336F1E688CE7566A39 D8E1F95F11DF50414D26D41ABB861CADDD6ED12465F6D4F2F0D8DA907A1786E5 5A9E5983CCB47730B07776FD6094D5BB5A9F01E8AFC408F5BE0893ADEF503F3E 085337A4409006DA0A099D95D8B7BB2B36022D8858CBE4CF78EDF83E99654736 7D282BAD7DFA5FB7B32017CAD7F4A47310E255C4468DC3EDB2A842D0BE9ED23B D639E304AD33FE060E62E40357E5FAAC12B1C8625D02533C6FB8A546B4B27CCD C7DD10A92EC52423484A07E5A7AC95EA386871E03980ABF75FF8C5A0463551B7 B69C836F2017AF7380FBC96F0D4827B4DB128989A1B8C025BEA077841564C20E 34E639B398A81D7F0934FFA661FD7EFA554FFE7B2C6910DFF331A5805887AA35 C5A57870CE36EF5F9213D1764FB7989DA3CCC6CE9FBA443E2D6A77402592439D 9EC440A14F791D05230F7986489B8305D3C3EBFBFCFBEB90B64022244B54CB5A 491BF0A8CC8D823763CEA84773E497B14A3D96903D1CAEAF2884A85A09208565 37519E184D98204FCD79D27F64A9F0094C2009822223058E7A17026A0CD3D391 47D77743B7BDD661B3BB1390905F23CE780E3C15AF8E394BBE73D12A8A0140F6 0CDCFB1C81121A915003C8EBCB4B4AD7B014399C33D256C0AEB99970BECFD39F B4430B917F9F1F2C8C1CEDFA27B0C8B1CC2DCE0C2ACDE5AEC47D69D5EC473F12 EC7456D64487BDDE2DC81775A1F98507A9AB5D3A3663F4B2CB916C1317E538DA 9FA75BEE6E387A65CEDC24253DB9C0A517744E89EED24EE82A5A46A766426F23 3641B42CE58FD60F786021150E8D52E9621120AC1AA27999F61E31FB441BA766 9EB1E2026BBE7D8AB00F28489134D3DD4CDE5A5C4187AAE55CB94CD8B64073D9 8FD9366835FD121A1C26C6F2EF60060AEF54420D098A074821E2C26935FFD463 8A90FF7DA2437466A1C4D8F3D25D9CCACFA00B007A7D31F4F560D427405D48BA BBE287E036469627154EDD43457A7D7E029C9F41359CB9A2BF939349EAB11FFB 8EEC8B5695C90D88A535ABEC 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMR12 %!PS-AdobeFont-1.1: CMR12 1.0 %%CreationDate: 1991 Aug 20 16:38:05 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMR12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 44 /comma put dup 48 /zero put dup 50 /two put dup 53 /five put dup 56 /eight put dup 66 /B put dup 69 /E put dup 74 /J put dup 78 /N put dup 82 /R put dup 84 /T put dup 88 /X put dup 97 /a put dup 101 /e put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 114 /r put dup 115 /s put dup 117 /u put dup 121 /y put readonly def /FontBBox{-34 -251 988 750}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C 68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361 3645B82392D5CAE11A7CB49D7E2E82DCD485CBA04C77322EB2E6A79D73DC194E 59C120A2DABB9BF72E2CF256DD6EB54EECBA588101ABD933B57CE8A3A0D16B28 51D7494F73096DF53BDC66BBF896B587DF9643317D5F610CD9088F9849126F23 DDE030F7B277DD99055C8B119CAE9C99158AC4E150CDFC2C66ED92EBB4CC092A AA078CE16247A1335AD332DAA950D20395A7384C33FF72EAA31A5B89766E635F 45C4C068AD7EE867398F0381B07CB94D29FF097D59FF9961D195A948E3D87C31 821E9295A56D21875B41988F7A16A1587050C3C71B4E4355BB37F255D6B237CE 96F25467F70FA19E0F85785FF49068949CCC79F2F8AE57D5F79BB9C5CF5EED5D 9857B9967D9B96CDCF73D5D65FF75AFABB66734018BAE264597220C89FD17379 26764A9302D078B4EB0E29178C878FD61007EEA2DDB119AE88C57ECFEF4B71E4 140A34951DDC3568A84CC92371A789021A103A1A347050FDA6ECF7903F67D213 1D0C7C474A9053866E9C88E65E6932BA87A73686EAB0019389F84D159809C498 1E7A30ED942EB211B00DBFF5BCC720F4E276C3339B31B6EABBB078430E6A09BB 377D3061A20B1EB98796B8607EECBC699445EAA866C38E03ED7D4F3EDBCA1926 2AF6A41F67AFCFBF3630C943FA111E4CCD988A7363F7C2B75EAF5830B049460E 0D2B337988F150B9182E989E7750C51BA83DF37685483F86D1F47478883F3F6A 4B7F768DA5AA89E8F163029ADD4A9209DE8A4F285766C06EA859639B92CCCDCA F59B1C2BB8D588CA754D1257BFF76B53984DF4937093AAEF79009D32A29A4C16 FB610C7D6713482C48D7F9E8410C0F00AD6E67021056B6035534E79F05D14EF2 4E87EEECEF12B006CF37C0BD61EBB0D1CFF64B923C5CF9C35BD786DF92AD188F AE49D95DEECDE998C8A8AB722205A8E9143F01FD974F0A9C6C43CE7F0AC2C9FE 50478D07AC11F948A5B91DD6FC959A77B4FDC88E1D175CC4F17A2DE5B569278C D7AA616B7C22336F552A364CA7F443AED39D59154F45CEF3A889C6C7C65C9C84 9482F0641A1B8F2982A7472681811514E4B46F31DF6870F39B78E74A44EA0807 FDB2902AF1DB8B3F8770EE5A26BC0E8135BD7F619714BB7AD2604FD3EF8C34FF F1F91D7D15506A1A2B772897EC2C5A360B81317B226F27F2651ABE2C7B97379D 64D8D3B8145C558995610ECF3F3CCF65DF3CBC9EA714D36146C1D5243965FBB0 63A6F921934886A5E8A423C01FD893954EA3BC931D6FF2F1E2F8770D5DDA623E 3371C586785DD44763E4F331C52C40A1AB85863BBEFC512DCC634E9430CACB8C 9FDE1FD96544C0977AF635FFF8C50197ABFDEFEF6E5C44424111D66A5C736B0B F7189508C7111AA237DB482DBF049A7ADD467D9AE3DE453DFC1FC82BABCDCB84 8BDEA53FCD3146FE4BADA55BE2BF7550B1F4714D418C22CB905C9E919E93AF15 C1A1009E1577CE9C10B36743BB56033572D3EBBDC5EA1CE25B504C76F3D92B40 8F8FB10D55D0DB0B1EF707FFBAA8CE8FA7946BF975B5B33CAAC3CAC7F1EB2D94 F7A65B46569B73B51DD7AB923292C5C30C389E488D1A9DEA2D0126EE1BD1E827 9B704B2C6B3B7A90D031039397DD387625212ED95FF9CA6E4F483569BD5F55F0 1F2EA9E991A0EADE9E9EC7E2AA577266011B1D8866DF90E952BCF523FD1E7641 4F7343EADE2E4D1416188AADBCA1486EDD1A8AB28CF9A421E6E2FCC191BC4220 84166C596530B20B49965703503C7130F595B08AEFE92BA6C17D03763ED45B21 341F76793EAAB06319A9378317B8EC211094648677790AECD0B97D2A9CC3249C 1D88C6F32FEDFEAEFE29C193BAA61A45915B0FB4C083EFE00121A267E0F44355 E52D7F7B0B0B9A7E37348C1B26EE00244A529B80E417CE9A75AA1561B773360C B7605767C2FBE58D5201E2B46FE36EC358F7BC489552269F75926D1894963C86 2F93C55C4E26C51A218BF624BED92BC795DAC7C8A23C89356001A9FB3819E91F F46E54B984E00E772E163E36D32A70B14167B1EBA2E7F3599273F914EC0790EE 73C414CA607043A5AC8AFF39AF85CFFB22F0B81B499E3E5606BE87A42438C695 5835181A5BB15B27217B2D7B2ED9966B2C3089F50124D661FDC5732F7D9DEB07 C16FB8D8448AA2C973BBDEF2033F98C94D5C1742809BB97DE09A058BA73962A9 19B257937AD1BC234422C507EDA5AC627AE3800A39FF9471945AA41A34A6DD91 CAFDAB1D4422A86F8CCE226B2D0981DB6B71F7611A67E74F7BD20323EEDF6C36 C4FB1B883350B3F7A50301B9B2C34BC2A482784F583E4046D0CF9095D9B86429 9E6A4D1F6B5F0A055F80439537DC68421417B1AAB9F48F1A37A1886576D4B5EE C6E31262B78C56ABF8FD04CE7B073A5DD090C013C57BFA0D2A9F4C281E6164FC 83D25105ADE31C5FF393474ACB6B35A90B7A623D543209081FD437E578A880F2 1662B307BA8B65CC1EEB191049AC92E12925C995264AEADD5842B22C52EC5DD4 87CF42A1661D6518CF87F548CF480EECF1B5A1AD361E4D3CBA10B0ABD5CB875C DB07916205362441894504CC3386251625BDD6E8DFEC3D6D3D704F4F3D879865 45B01BEF4154470C4A7AE86C0208D5B0772BFF8DA19443B12C424DDDAED76E05 43B465362185050EF686079934F7C562C734200ECF568134B84D4521C755BC5A AC3731C18A0302DE5FEE4CBAC3F66FE2875CFABD50A5603C04D65C9181845EE1 A85797DB3C1BF2420A9D93B16EFB65F883D5A98A9CF4BBCDD8736BAE6C01455F 3A54ADEE69D7D700BDA4551EF586816CE59C75D78687226C320065A2ED3D09E1 C8D430827F6C840FE03FAEBDAFEFD45250BD4D960ADB82B881E88CACDEC83536 9DF8F882F7F2C405A399E377A5A2076BE79CE67D69DF77F66FD450ED6F46FCFB 92766A83C68E63FB5FC6C9AE449A82726C0D7704D69FD2C41FF0F69AD2134A8F 3BE7713D7CEC47453DF84E6748DE69ABEC0553E2520003537C8422A949DC896D 74273208020BB9180176CFDA736DF39C3E6199FE27D6E4E3559B5CC7F966239B 2AC27CFFE32EA238DEA59B6627668FCB68E85F7E84BB1BBE5E243403C3119EA8 D7DD47E3DA996117F897863075004C1378A00EAEAF7A57C50297FBF253276C85 2D84BE4F1B1B5C39DFFC28E6F8A34BC2D8425DE0D88C50A83564871B8C6E3F36 3340DF50FFB7FBFF0BD2FD25BB575C974B9AE5FCFD578E618F0F0A654D120EC2 DB44DEA8CDDAFCFE5B511ABCEC24C5E5CD86CFDAB6458E6020D8A60B2849EF84 53CADFCFFF33D12C0379B2ACF46B2D38C4190BD65E88DCDB4354ED3FD3CD1AC7 967E625E915EF9B9D98E3AE691311FDDC1B281CD065303701E20701F5B3372CA 734D1EAD8CB02A685AEBC781F1FE724A7019B0BCD969E6162EDE63A01DD610BE 9FB42BE3095DA652007DFD0DCE12CFE85E4C1E683012F122AAC78CC842EDCC48 0619507C2BC4C4AFBED68EA488D1880E4CF4B447E824D5C4B374E8CDDA79DFFB 2AA5554F112149083116D1D288DE0EDC0950AECA2FAC7A169A8D4C68982CBC09 0981719D7EB3DA31843D0B9DAB6B57AD3F55BEE460CFF2CEB52E4D3738A88183 A76A0A5ABBAD35510D1EB17185715F319FA9EAA7FEFED131BEB0ED0E9A15660B DC166B0477ED2DF2210530DE3012C16D37EDAEBD3A0353E9D579E9821503D30F 01452D33EA54F31369FC7BBD3D0EB15A291EB4BEC878DFA5AAC739C8DE82EFFD 321FDB59C8F527330C4B8BA2BF6C0DE255051540467E3DE95784F556CC1F2D34 FA761BF625C2677BBA4EFC17C766BB1E1534D90C79A471A403C227848179E0F3 032C113FFF66A8CAE6BA755DC50332924363A8094AB94A716F281B5C7FC80CAA A52B740DD16621D2CEFFB2E7E53795C00AEF579E529CA6D4010053AB405F3351 973255EC91FDE567573C15E50D8E1188866A3298FE10A4106FA958DD7E9A9F2E 7DBBA2EB0D7D149604E2491CC65D77CE2CEBA271357FAD28688B3C7C0A91CF01 C31078AE091F41C50BAD798DA1A2377DE08842CCA48133E558A3058929949AEC 9EC49E4B606C22571FAC640B01D8C88634AF45E0D9593B8E69B1D06A3E07D28A C13D84BA70B08F893BC26AD90B9357510E9FEF004F88DDB902B395E18B05E65E D5EEA0C9B86A7EB2A30E8F12ED968417CA2D2A198BCF3E5BA0A69B07771C123D 7C6A4E27522A4A70384DAFD5F7D327E87ACCCC5E09654747CD3DE58AEEBB700B 8884B3E780FC87CE7116A9FA13D79202AD71BB20A21C5B3F635C20AAA7314E6F 67210E4CE1B833E2F219600DF2DD422AD64EDE8C467C93D73709964F259A7254 5C2F2897D83B61442185EFEAF0DF526343E600D8D426026039EE66AE8BDD40E8 AA9E2D2048EDF122CDC9AE1D17CB5C26EF4BDDC4406B7B640A8BBD2A78A15836 09114E9B9599CFFE8037EF8E88843BE0E7E613AB2393868AA6FC80860DFCD8C2 C1AA5287B0DE026F1C861BA3F8BABB5AF76FF0E200A50022785059F01B26242F D529A49283296018125532BC4F85745BF5A814C4EA6BD13EE60B9BDC4D20B86C DBC7B26B340AF9675FEFC0D6E0FFFC0D2072B997601F28B977158F00C5971D77 D82FE3AC597DEEEBBCABBF2E7531F69DB6FDA9D787CBE8AB662A7662A2F44682 F5E3A3B46E8EA1C48E6758FB0AC023905FB6F34F4EAFA1C88EA526B4E2AAD4C1 199C2A18284AD19E723ED25059FBB8699CCF218E0E741B1A0494B5F4D9502001 C065605D3818221723E0186713AC31E9521AAA546D757B060483064E39CCC32D B01ED4B515A4A3783DA6C43C75C651E139405821734B13CBD92E0C4B61B0D1BB 7AA0FAD952E6C7D5A6E4C3D9C944E797183135A5780173C09F6066EF1051C094 83A7B5037A6FCBFC3F87340EBF66443D487A36381596C5C1FD3FF9E3928C18CA 3B654958E93F2E2D5334F6D173A658EC4288BF45812FC15A3D64FC29A99332AA AD7ABF9FBA1AB1E0FC9A7BBFBDDD975FC3E3F56EC8544321A973028010127E9E 9B65CE5B65E919A258884AE4FF862FC595F2F6429EAD2CC25F59E5DD326BC77F 350D9F7051667FADEB01A1466A59B81336CC6991F7007D0819E46665AB7ECBB6 9CCAFC47625AFE24C3302C01A09B1E8AF681EEA0328A84148D2FAEFD95E4DD91 835E502F00A2F8BCB7D87D0DB641AD3C1DB6280E155AE5A43E8A820F790FD1C8 81E778D48FD6D469C51D25B9882B373F58B528D23C3129CFF237ECFDAE11B999 3852ECA4087F04F98CC462DC153420C8BD00AB421204BC1DEDA42E3A39E953C7 E4544A11E780F7958AC84F7610426D574490C3869A94F90BEEBEF509DE97FF63 7B7742441946163E37C3432E7DCA8ABA5575070791EFF234FB8FA58A91F8CC59 563255534801343F9E29A98754F6F933F6EC745C76A990779E3DE2B84D37A481 E65EBE457F39E3858624E466561FBAAF571BFFE2EC9ECB228AAA909FC5725EB6 B07C7CCC1D849EBA235AA22F67ED51B226F9021796558CC209D247DE52944C9B 9BA500F50B9333EA136DBC12049316FFA635817B77297935C4B70569953F3783 92608F6C029EBAF6AA95D486678D4583258BA7021026CF4B04AFFDC93DC4F39C 1655B0DA0861489CACE8037B553B70C04CEA123E12A6395ED10AB4E98D0852BF B7E4AE241908AF9647994323D18F04DCE225E4BB7EC333B6EE548F930F3664B6 335766AB7E4225D26C4AAFB74D19CA1EF097D98B6BA814C59BC5E63D8E1BD811 6B4E9876C0F12F23845947CE896B2A16F79D2FE9373524042E633C2457803CE1 AA15EFE056FFD2826DEF08A6BC7B1D247E60159D5B50583FF591FDF0A7E618C8 B9F6F9218C0C755DA566689CE2CCFF7A59F3C018A3292A7CCC2F80E171D399C6 A8FE37829E9C329DA0F74A7305428ED1A728359167D47D0D0EC5E9B370EDBC7A 52CFEC36BD1FFB52AF2D0E379812B1945D8B9A235C06B9B84DD5ECB9821BC8AC 92D02FD51A7BF06B72C8B086B1FE80C014C01B5A1B30A173EB788364E4D3172F D579EEA97F0BDA2F96A2D1847A85434B5894055E03783FAF34F852F7592BD569 9D76132F11971C4EC3A3EDC6A6F60450CA8349B25DE1B30C0CFD327F460A2B9B 509B7E5457B4124D499F06368308204CBD60222200AD7EF6ED95414BF2D846A6 1F3F177F23CFC931F653C7F3855796B64BC10332D56A71F98E16522DC48C017D AB1FBB6B923F2F4C20A703D531713891EE02840E410AC741B9068BFF68E7564F 06C19EC0C39F7B51E2 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont %%BeginFont: CMR17 %!PS-AdobeFont-1.1: CMR17 1.0 %%CreationDate: 1991 Aug 20 16:38:24 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR17) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /CMR17 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 40 /parenleft put dup 41 /parenright put dup 46 /period put dup 48 /zero put dup 49 /one put dup 56 /eight put dup 57 /nine put dup 65 /A put dup 66 /B put dup 69 /E put dup 82 /R put dup 84 /T put dup 86 /V put dup 88 /X put dup 97 /a put dup 99 /c put dup 101 /e put dup 102 /f put dup 105 /i put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put readonly def /FontBBox{-33 -250 945 749}readonly def currentdict end currentfile eexec D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 2BDBF16FBC7512FAA308A093FE5F075EA0A10A15B0ED05D5039DA41B32B16E95 A3CE9725A429B35BAD796912FC328E3A28F96FCADA20A598E247755E7E7FF801 BDB00E9B9B086BDBE6EDCF841A3EAFC6F5284FED3C634085BA4EE0FC6A026E96 96D55575481B007BF93CA452EE3F71D83FAAB3D9DEDD2A8F96C5840EAE5BE5DC 9322E81DFF5E250DEB386E12A49FC9FBF9B4C25C3283F3CEA74B8278A1B09DA7 E9AE4FBAAF23EDF5A3E07D39385D521547C3AAAB8EB70549756EBA8EF445AF4A 497CA924ACCC3DD5456F8E2C7E36946A5BF14E2E959895F7C94F49137256BE46 4A238684D52792234869EAE1A6D8ADF4E138B79472D2A90A6CA99E2394CC20CD 3841733046175B20CEBE372327BF13428EED6A3E2FDF84C2DBA4B0AD584EE9DF B51828D3B8F385846158C29C9AC3496CB9692DD10219697B2ED4D425C3957FD8 C4600D76E045C561216EF05D38177243C314877A69A1C22E3BEC611A2EE5A216 9B7C264CF6D1839DBBD78A40610F2C0D7C2FE09FFA9822FF55035AD52546970F 83EED2D30EABB1F303091EBC11A5379B12BB3F405E371519A53EA9D66174ED25 A2E55463EC71A97BE4C04B39E68112956117C8252DB6FB14AB64534B4BCD568B 246DB833982B38CDE7268BBF74B6B0C18091E1B1F87D32D66F4DD023D1F10D2A 7736A960F72AC01F733A11023832CD68FB6288A5977743F6F3F23E0C1657CF5D E8374835BDBD2DED3690C84A1EBB8E2383A5E49E610B6F5F0F5F5EC43CFD16FF 24FEEFB92425CCB577E17FDE4EA6C50E1448DC5726A21888E25B6D6B52DA3D3C E4C4C6A73C176DFEB60B6B6191B336AC4F5BAA123E1B3B6FAE4B3FA9DC8F7E39 335277EF2294315BE95F64EBDB1F393B293FD0FDB9DEE6C89082232013130D28 9234FF12DF47D454558A1EE8603B2832772E5CA07D18B34A4763D5B890F7173F B8FD3476D9C3AD3E73BCFF039739F2C4E9677364BDDE61CBE66CBB74CCD550CB CE2E9E2E5EEAE72C5B80FEB3CF5D8CFBFAB31B7CEE89159CA71ADA696455C677 F275458B6BCEE0593B643C80B9E57A5D6619647186160F5C305672024A767C56 F7E5B6C52A8D90B81E27A8C4CF540BC211B8D44099EDB5017587FB2A3589BAF8 0D83512725BDC7114C2152C9B373BFFA5ED6117CF0740B4F801DC6D4F67903BA 583FA96719D443E0F92CA4B6874037D62E83A34929B5BE172353543B9AFFD43C 6B6322C483A4EFC1FB4AC86904944319C1419249975D7A53F618F03030ED2232 D19A73A299810C151DCE571D8FF73444AABE87A1A9CF4D595D1C0F688C69A670 863FBC3754E83BC728367BDF74DA8DBEDBBFDEF6A11647E7FE3359DB6855ED55 C3B943257559332B348F9ED6E9B1FCC9B30C49F2AEFA1D4A0B628C64EFA732C0 EF0D4DE3CA3CCEB2D976059AC00131B558D0BCC3047ADBC2D65ABBCC57C6CF0F 569920A6B84663FA964E23B632B06A2A6BCF23F2D1262D15662CE0551A40A3F1 F0BF5D7CD87CED7B33B2ADB4F5B47CEC093BBCA7D4E5A62DE5EEB943925362BF B03DCAFDDF83A82060AC26801C7CE23D4F3F1AB6972FB8B1C05D691160BAD8ED BAA5757F2CCD0F9F82BFBF8BFB56C463640B482943CC3B796F537DD5DD63DC95 C649D365BDD7CA8841243CE5CA207A1E794F7467E5E0C38F0B025A7EBD053A9F 679379B417D00A04E7B66951DE6113965074D6451070FB1E99344F19DCE6B3AA 1151C9A1099D11F659797D3D1CA07203A7A61A56E8E457206384792550C1A481 E461F06FA5A54C1967CB9F2214ADA5E92D409FDDDA3B4DEC85C366362B08F618 1CECEB53A9E1EDB295C1932F6477EEA8E0B1A4121E258D863EDE1CBA11C44BFA E7789166580F77B6BB38C9C0B4225C718A92ECCCFACCBD80A49F2802B574F3B0 66D244A30AA8D808EA4238CD5A403BD2681CC08DA15A2FF42EEF1438D9D9D5CD 362BC50E7A5FCA2A0E1A42E5E10E2AD8AFA3BD6A615C300E7983CFFE788DC50C A4D8E98B2C3F94E71E4583B961470015F213B8B517F93D13FBB928DC1DFDF5B1 A4DF059D79F476D59140BB2BB569BB4A439838B489C6E4FFDA96CDCC7CCFD9CA 06100BD2A405E500010D1949995AB1C6DF94BB44011D24BBEB8FE1B7C6EB2E14 BB853619F15CD4EDCFAF27233C883817D89F0D29379E2D48E4886276C5DCA472 D3D638D1EF3AD05DC030FF68503A8EE562B7D33B61FCE33F4637465FA49377E8 9F5091F0DDDB9C4B0E56B928970CE7EA5C2F674DBE0BD926CADF66369032A606 1D24B149EB227608FB763335A473FE3DD4C3961D624217EA4B340E5043F289D1 F7F8C378FD5B430CB56ABD440F2E223FB02313AF693DA56BA086AF80BDEA1D44 88394D68E386BF341C03AA7F7B2651D8FAE192C1810D47DA1A8488CAD81223C3 FA0295D8E2C75D2318731D9AC19C45FC8DC59B1B23A243AA3018E13B25C93609 6C9DC208ECE62F570248A3F599EA16B3E38E2D04CC1BECB62D2E2B96F1C11D85 2EDA15F03E7FD9D75D9B564B812ACD4610378BC62370626498F5066195CEEA45 527C543E6563FC4EE4C1C09DE86E71DB7B9924D4D23D7107CB9C66875F39B8BC AFE73164E77485484D7AC95360CE5524ADC7BED1FE4E54279C90EFA76E1431C5 6809564FDAFBBC9E6079473013BD942D227BCE3286D463EA421B76D3EB8E9F78 FF5FFDBE23DDBF69250A65A1AA4E888796B589484C156B4ED9B32EE7A23E4385 0B28566B67F7ED35D625E3741DAC90F72D764011CACC9E124569F083E154635C 21DB7B7B68FA1768365A0F8C38672F5CC4EF444BDC34B7572391890975813B3A CB7A92807415C694D13514FACDEB47CE537DE7E8D844C86131E0AB1C27A4EE30 9DCA5D7870037B12783C401786CADE153543258B817B70F965219BDA24436D2A 023687DB1376C1CCCDA2D2028D3F3B4922D7244FA0D6ABDA098E7786D9E35807 0AF1D580B902093516B8404257B38CBF900C6A90AA56D72A4F6B654EF12F14E7 68865645489BB92C44D292FABC813BD5AA3EBDEA6C706C51FE81D54D5293AE58 6E32D7D1FBFD09C7617F086DD3F01056551B54391F1811425990D437C28EC4DA 2BA343A8AE87ABA89EB1187B24C03D699605B0950BE17B4C44661E4BE08D61C3 7B02C179AA91EB881694EEC48DEE990DF71A77658548DE0D494E1764C96BF52A 2DBF84B8C83B9C0003CA98142545C22C51E0D8F48DC94325C72B037F7DFEC910 D81438707FF433B5A40047DD4E98044EE1C2A7284E847E2BDFAFB9F406954913 FBB594EDBE63D71DAE28AD2B5E815C756DA99BF2A8DDB9DE280D9F789A252A38 0B18C0CD8B1E7555608596A4447AE6B40EB81DFC14DB22097AD5DD8991FAC222 244A9C45F5DDE5E5ADC5E91A287DEA76A4D81F75B083EABD0D3CD602FB339605 742EAD4031799B9F3CFFDF192799333A68CB415BB70538D4FA68D0CAF785574A F470EAACB3EC138E90F2C60223D4749322C0E356322A3C0ED21380E922C850D4 66C7E0A4525783AE33A4CDFB10E1EDE9A52F33682F2527985557AB831C5839DC 423C2BD761C0C20161CDBC8E8DAD83452749EF3C40EFD7DF08499F6FA79D6F28 2D3A3BF1183F91403458C711BA0EA987233C50FF0104BF2E361E46CA9B6C036A 48A30C651F9956848792B9D1B5D6C45076AF58EF17C39BA159894FB30577D11B 22008B9B5B47F994440977370FFE508538A92DC23D196D83506EDB74C0CD3E44 BC8CD1550A421864DD026E118416B23A4D03905632D2CA47C77F15D490C2220A B6FA6ECBF18D56182F8B063CF1DDC7B83BB783C021E7868EFADEE6BBEFB7F287 F2665B5555382AFF2AD86C92C127DE5D71C1DF92427169236CE6F5687F0FFA57 271EFC15DF34D80E3488B3A92DC8EF9F55F3198B2E6AB22F0FE812F3D9CEC016 BE2435F692EAABB086DA255674A8569A8D9C2386734075D0FA0E5EA1A8954E44 6F13567D4051955C0B98F71C09CF3CC06B4F5D30254A2B4CA924988E1FD05500 21ABCE378068BB1313826846E45C13BD374200CC42460F752CE7334EA0B85BDA 62BAF43BBA6FC81DC204AB5D4C58D3ED008DCFF9CC66F5BB643DA00DF341F360 586F2FC08C1664F342040D801C4192F0A33418A3F1CBFCCC738987022924DA18 5F38F830ABAD838ADFE12486EDAB3032FB9D05011054C84F7016BF5A3D167942 09D69F193A831B67F2A32399F6847C301CA1D13DFB965862751C1B38286C61BD 2DD5592D76217610FE2432C5A050C8ED7641C03A3AF2C28EDB89E356A5FC43D6 14C973414DB5FE66E1CC163FFC3118DC7DFB2C6166E8DBD727BE28EDA2751C64 B4FDB402E460F541C68DE4D99D2ED8AD7E51FAD303BE4D3FAD6694209F9E9775 8764B1B3D21CF394B226BB3AE4754CD2E6BD131EA756C023A46671296D588EF9 63A90D9D8DF13F1CA170291CC83270A72C5F636BB0EE1FE7F3BA05D520C2E1B0 621BF571A99CC425098A593791B5865A802C9DD51BBA440EF6C8F510967A68CB 2AD3C2FCC4B66F0675EC1616155050BEBBE8412EECDC5CF375D60B78592F4618 D71C5F4C0AD60FF059A68AE5BCC2574658A3C8D3D7CE5035851CD54D7390C2BD B068048A604C75811489BDBCF1019BAE699424C68B18754231272D799BD5F5E4 EC001FA3193F5096213DEE2FF022C1C8270CBB2BA82B2B4E7E691F9BE273D817 B7D0F5ED9064CD05EBC1BA6C301DDD813E22AC862E18AEACA5CC86EBBC9DD111 EF03CB3F78AB976CD6E9A8ECA671BDDF0B6346AD92E3F25F7F5D8B83A9631929 7B930669B3CD83DEC555D03A260F6A011DA713126D8B500E2CC73809468B57DC 3C33BA71360E7C005EE4F395521DBF5117FF6375BCC7EEE7DE160B86B27F1B93 AE31527C6A1137995B0E3D8DC8CDBD59F994FD577C77455D669FE0BF5841AD3C 334E5E3C75FBE55B03CB5BB2390387B5C5681EA38911814C21428C3FEE3ED616 88B0E2EA8ACE85FCF05F7EBA4894A31013BC90EB7CF8E0991C30AADF52E1FCDF 8041817A269CA25AE058A3B744593C4D158EACFD934577F1212EA22E62032C3B 53E8811B379F501FA049A5E75D5EE762B83BA62A40ED65825615E8EC667A4F84 9A00854227AEDE7F3F2DEEED2B93DA766176A859FF8E7CC4CE282357ACF798EB 05C8588142063B1F7664D305695B55D63BC4B351A64CAF58D06870088FA06C90 37394EAE3D0CAA927A03829E16D2422000FF5CA89E87FDD716BDE127A89DC605 B8E6239287DACDF303EA07B83D879047B16A8F6905EC048B191BCBF823A7CBE7 6FB00B47DBE38D81AD13C5DAE5267BB27A7BF9081701BE162D6B9D48E6DAE798 1712CB58DEAE8178AA9C78E9ED4D3D9618E8D586FCFFB3E184FEB44E2C8D55A4 7BCC12501F42C402E597FA4905EFEF5FA31462A4410760256C2081B785525F4F F4ED09E6417543C849F0B14AFC56F76BAA1A96E802F7C8E82D1FD851A9563056 667A5F744D358DF59B445663B88C02E8E32B78B5332091253C439D78A860D4E6 1CFF4C7F50F78BD75C91F806CAAAB1F527FA2C4A1D614288B2F700A105DDD4A9 88B5E6B4160CFD5CE4BEA8CC8D2207689D3FBF43DB35BDB26259A4A5760F5DC5 A00988C038B684E9386CD79F1BE405D8269C88C30635E828213252EDB17DBEC0 B0D822F243B71CCCB97B55D1597D2246E05E79ECC63E6026610850D030EB15A7 0C362CFB11530701F02B9CE693C98D5FD0E00BDB00A91AD8496E640C385123BB 792644DFC33117591389B37806A791E68E58CB04DC299B4791A726065DBA9D5E 94A80C9B8B11CE87066655FE55BA6069FBDB8B1BD7C74272CD66774D45C78796 052CFF929BC5D251718F6D235282637C8AE59B14920DD9B63FF8A2F9C000B2B4 A600B2AD93F7A5855CD21DFF84B2BC2DB72115535400C6A98FB3E1728938C3F0 54B4E98D03C311D4302F97DFBA3D7D99796BAEF468D5EAD29F9A8D275BEDAC9F CB2CFA0FC1FE5CD1D4F2F157EB166296350DF8BBA07DFB0377410FC0CC22C0D1 79B7CA0496EE5DAACB6E1FCD669E44F17925301E1AAF909BA37B832F74B1EC6D 13FF7B2F700EEE886948AE118155048999F122102AADA02D053027098D714CC1 63C081047C9EC88C6FEC5A44D2879E17E1046289C5B4FC1EC9331D4FA1E3A8DB 6B19020DF871C779E5595DAAA46BC1150563D63557A5B41A9F9552C8B767A5E6 60820D3EA6AE43CBAF934ECD45F30E4E68B6EC078C466F7D16A64256F7951F0E 5E566B80DEB380740509AA64C0A07C03187779E9263F8C3A1D936EC0D1180EC4 D950B2810F9E983D857EE8C55E0C60DCC0460848ADDBA7C7D8F27E175564A6BB 3D43C43F07E7464141AA73B5ABF5FDBCD656E28175FA5CF7613D58D9E56CE0C0 537811160FB2B61E028F5C63FB23DDED4424BE72038862AA3C4C5F592B97CB79 72524055A3BDC7A86AF4E45574FCAF8B88DFFBA551464F5D3B3D014DC1F94D32 8F962C1389D47FF532A3F9D728F776B3C5FAA2EFBA0D466567C7436F34A006E4 3DA8A05F6E522769627E50315A0CD993F389D2B87A142B29E7B9261573A645F6 631AC540B18B732B9586D6459E7FECC7BCE357186E90FB4A3847943503E6AF47 7B42B60FCFB1C4884400019CE7E71C295311168292D15629BDDAF585D148A355 259FA8A2037B3A60749320BC1506C119AA3A76DB0941BDE110E7B00EE09883E0 0EF028EFA981C2E2AC842C43F985ADB742F6AF48CF2F6C8F8A345B214DC55293 9763409A0DAA2C76AF13AA052226B183C18761D2DD040007DF1859B81BEA6AD9 0929181584DE27726A576F654D565E3251DE2278119CF35B058E2F462386DB94 47BD3F25456D51850D6F7D3F0B68897447E12901FD46EA17B7337200742FD933 371D9F15C913510AA72EE91403D662D22314DF65E3E9C4BC47049A2E291C4BA6 345B86F948DDBE960DBE9CD995261A161A7A4B8E7C474C8192664D9BD362F8EB D19F80D57BE76FB0E28480E660BA37C8B996F48DCBE6875BBD37414A2CC9CF05 9AEAC199FA719165934152DC1D2679DA76CC3F 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndFont TeXDict begin 40258431 52099146 1000 600 600 (nbib.dvi) @start /Fa 139[24 1[30 2[36 40 4[22 2[22 33 36 2[36 13[40 5[64 45 7[54 55[40 12[{}14 66.4176 /CMTI8 rf /Fb 135[51 3[51 5[51 4[51 2[51 51 51 1[51 98[{}8 99.6264 /CMTT12 rf /Fc 150[30 6[58 98[{}2 99.6264 /CMCSC10 rf /Fd 196[21 59[{}1 74.7198 /CMMI9 rf /Fe 164[21 49[30 41[{}2 74.7198 /CMR9 rf /Ff 208[35 35 46[{}2 66.4176 /CMMI8 rf /Fg 141[37 4[73 9[36 38[65 23 23 58[{}6 83.022 /CMMI10 rf /Fh 135[62 3[62 5[62 4[62 2[62 62 62 1[62 51[62 46[{}9 119.552 /CMTT12 rf /Fi 205[30 30 49[{}2 49.8132 /CMR6 rf /Fj 129[39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 1[39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 33[{}93 74.7198 /CMTT9 rf /Fk 133[31 37 35 51 35 41 25 31 32 35 39 39 43 63 20 35 24 24 39 35 24 35 39 35 35 39 16[52 3[48 8[55 7[24 7[39 39 1[39 1[24 27 24 2[31 31 24 26[43 47 11[{}41 74.7198 /CMTI9 rf /Fl 150[30 30 104[{}2 74.7198 /CMSY9 rf /Fm 134[37 37 51 2[27 28 28 1[39 35 39 59 20 37 1[20 39 35 22 31 39 31 39 35 18[53 12[53 7[35 35 35 35 35 35 35 35 35 35 1[20 4[27 27 28[41 11[{}37 66.4176 /CMR8 rf /Fn 134[59 59 81 59 62 44 44 46 59 62 56 62 93 31 2[31 62 56 34 51 62 50 62 54 12[78 62 84 1[77 84 1[106 67 2[42 2[70 74 1[81 9[56 56 56 56 56 56 56 56 56 56 1[31 37 31 2[44 44 27[62 65 11[{}51 99.6264 /CMBX12 rf /Fo 190[49 14[33 33 49[{}3 58.1154 /CMR7 rf /Fp 134[40 1[55 38 45 28 34 35 1[42 42 47 68 21 38 1[25 1[38 25 38 42 38 38 42 51[30 32[47 12[{}23 83.022 /CMTI10 rf /Fq 150[32 32 82[65 65 2[65 1[42 15[{}6 83.022 /CMSY10 rf /Fr 150[25 6[48 98[{}2 83.022 /CMCSC10 rf /Fs 130[44 1[44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 4[44 4[44 44 44 44 1[44 1[44 44 44 1[44 44 3[44 44 44 1[44 44 44 44 1[44 44 1[44 44 44 44 44 3[44 44 44 1[44 44 44 44 44 44 44 44 44 2[44 44 44 34[{}68 83.022 /CMTT10 rf /Ft 131[83 42 37 44 44 60 44 46 32 33 33 44 46 42 46 69 23 44 25 23 46 42 25 37 46 37 46 42 23 2[23 42 23 51 62 62 85 62 62 60 46 61 1[57 65 62 76 52 65 43 30 62 65 54 57 63 60 59 62 1[39 3[23 23 42 42 42 42 42 42 42 42 42 42 1[23 28 23 65 1[32 32 23 4[42 23 18[69 46 46 48 11[{}83 83.022 /CMR10 rf /Fu 134[50 50 69 50 53 37 38 39 50 53 48 53 80 27 50 1[27 53 48 29 44 53 42 53 46 12[66 53 1[72 65 72 1[91 57 2[36 3[63 73 69 1[72 7[48 1[48 48 48 48 48 48 48 48 1[27 32 32[53 12[{}48 83.022 /CMBX10 rf /Fv 134[71 1[97 71 75 52 53 55 1[75 67 75 112 37 2[37 1[67 41 61 75 2[65 12[94 75 2[92 101 2[81 2[50 5[97 11[67 67 67 67 67 67 67 36[75 12[{}33 119.552 /CMBX12 rf /Fw 134[51 3[54 1[38 38 2[49 54 81 27 6[43 3[49 8[73 3[70 1[72 3[73 3[50 4[66 2[69 9[49 2[49 2[49 1[49 3[27 44[{}22 99.6264 /CMR12 rf /Fx 150[43 6[83 98[{}2 143.462 /CMCSC10 rf /Fy 139[51 52 51 1[73 66 73 111 36 2[36 2[40 58 1[58 1[66 8[99 1[99 1[96 1[98 12[90 2[94 99 7[66 66 6[66 66 1[36 4[51 51 40[{}27 143.462 /CMR17 rf end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi TeXDict begin %%BeginPaperSize: Letter letter %%EndPaperSize end %%EndSetup %%Page: 1 1 TeXDict begin 1 0 bop 1166 432 a Fy(A)43 b(Replacemen)l(t)i(for)d(B)-7 b Fx(i)l(b)c Fy(T)2560 475 y(E)2635 432 y(X)1498 614 y(\(V)g(ersion)43 b(0.9.18\))1594 905 y Fw(Norman)33 b(Ramsey)1666 1100 y(July)h(25,)e(2008)0 1458 y Fv(Con)l(ten)l(ts)0 1640 y Fu(1)77 b(Ov)m(erview)3335 b(3)125 1740 y Ft(1.1)83 b(Compatibilit)n(y)42 b(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h (.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)134 b(3)0 1923 y Fu(2)77 b(P)m(arsing)32 b Fs(.bib)e Fu(\014les)3014 b(4)125 2022 y Ft(2.1)83 b(In)n(ternal)27 b(in)n(terfaces)82 b(.)41 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f (.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)134 b(5)125 2122 y(2.2)83 b(Reading)28 b(a)f(database)f(en)n(try)67 b(.)42 b(.)f(.)h(.)f(.)h(.)g (.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.) h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)134 b(8)125 2222 y(2.3)83 b(Scanning)28 b(functions)53 b(.)41 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f (.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) f(.)h(.)g(.)f(.)h(.)f(.)93 b(10)125 2321 y(2.4)83 b(C)28 b(utilit)n(y)g(functions)72 b(.)41 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f (.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)93 b(18)125 2421 y(2.5)83 b(Implemen)n(tations)28 b(of)f(the)h(B)l Fr(i)n(b)-7 b Ft(T)1350 2446 y(E)1397 2421 y(X)28 b(commands)22 b(.)42 b(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.) h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)93 b(19)125 2520 y(2.6)83 b(In)n(terface)27 b(to)h(Lua)c(.)41 b(.)h(.)f(.)h(.)g(.)f (.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f (.)h(.)f(.)93 b(20)125 2620 y(2.7)83 b(Main)28 b(function)g(for)f(the)h (n)n(bib)g(commands)68 b(.)42 b(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f (.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) h(.)f(.)93 b(26)0 2803 y Fu(3)77 b(Implemen)m(tation)30 b(of)41 b Fs(nbibtex)2562 b Fu(27)125 2902 y Ft(3.1)83 b(Error)26 b(handling,)h(w)n(arning)f(messages,)g(and)i(logging)71 b(.)42 b(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)93 b(27)125 3002 y(3.2)83 b(Miscellan)n(y)34 b(.)42 b(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f (.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) h(.)f(.)93 b(30)125 3102 y(3.3)83 b(In)n(ternal)27 b(do)r(cumen)n (tation)79 b(.)41 b(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g (.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.) h(.)f(.)h(.)g(.)f(.)h(.)f(.)93 b(31)125 3201 y(3.4)83 b(Main)28 b(function)g(for)f Fs(nbibtex)22 b Ft(.)42 b(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f (.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) h(.)f(.)93 b(31)125 3301 y(3.5)83 b(Reading)28 b(all)f(the)h(aux)f (\014les)g(and)h(v)-5 b(alidating)27 b(the)h(inputs)77 b(.)42 b(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.) h(.)f(.)h(.)g(.)f(.)h(.)f(.)93 b(34)125 3400 y(3.6)83 b(Reading)28 b(the)f(en)n(tries)g(from)h(all)f(the)h(B)l Fr(i)n(b)-7 b Ft(T)1668 3425 y(E)1714 3400 y(X)28 b(\014les)79 b(.)42 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.) f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)93 b(36)125 3500 y(3.7)83 b(Computing)28 b(and)f(emitting)i(the)f(list)f(of)h(citations) h(.)41 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)93 b(41)125 3600 y(3.8)83 b(Cross-reference)59 b(.)41 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f (.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f (.)93 b(45)125 3699 y(3.9)83 b(The)28 b(query)f(engine)g(\(i.e.,)h(the) g(p)r(oin)n(t)g(of)g(it)g(all\))71 b(.)42 b(.)f(.)h(.)g(.)f(.)h(.)f(.)h (.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.) f(.)h(.)f(.)93 b(46)125 3799 y(3.10)41 b(P)n(ath)27 b(searc)n(h)f(and)i (other)f(system-dep)r(enden)n(t)g(stu\013)39 b(.)j(.)g(.)f(.)h(.)f(.)h (.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.) f(.)h(.)f(.)93 b(49)0 3982 y Fu(4)77 b(Implemen)m(tation)30 b(of)41 b Fs(nbibfind)2518 b Fu(50)125 4081 y Ft(4.1)83 b(Output)29 b(formats)d(for)i(B)l Fr(i)n(b)-7 b Ft(T)1206 4106 y(E)1252 4081 y(X)28 b(en)n(tries)54 b(.)42 b(.)f(.)h(.)f(.)h(.)f (.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)93 b(50)125 4181 y(4.2)83 b(Main)28 b(functions)g(for)f Fs(nbibfind)74 b Ft(.)42 b(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f (.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) h(.)f(.)93 b(53)0 4363 y Fu(5)77 b(Supp)s(ort)31 b(for)h(st)m(yle)g (\014les)2775 b(55)125 4463 y Ft(5.1)83 b(Sp)r(ecial)28 b(string-pro)r(cessing)d(supp)r(ort)55 b(.)42 b(.)g(.)f(.)h(.)f(.)h(.)f (.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)93 b(57)125 4563 y(5.2)83 b(P)n(arsing)26 b(names)h(and)g(lists)h(of)g(names)46 b(.)c(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f (.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)93 b(60)125 4662 y(5.3)83 b(F)-7 b(ormatting)27 b(names)77 b(.)41 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f (.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)93 b(66)125 4762 y(5.4)83 b(Line-wrapping)27 b(output)73 b(.)42 b(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f (.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)93 b(67)125 4862 y(5.5)83 b(F)-7 b(unctions)28 b(copied)g(from)f(classic)f (B)l Fr(i)n(b)-7 b Ft(T)1569 4887 y(E)1616 4862 y(X)22 b(.)41 b(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)93 b(68)125 4961 y(5.6)83 b(Other)28 b(utilities)k(.)42 b(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f (.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)93 b(74)0 5144 y Fu(6)77 b(T)-8 b(esting)31 b(and)h(so)f(on)2942 b(75)1929 5400 y Ft(1)p eop end %%Page: 2 2 TeXDict begin 2 1 bop 0 83 a Fu(7)77 b(Laundry)33 b(list)3167 b(77)1929 5400 y Ft(2)p eop end %%Page: 3 3 TeXDict begin 3 2 bop 0 83 a Fv(1)135 b(Ov)l(erview)0 265 y Ft(The)35 b(co)r(de)g(herein)g(comprises)f(the)h(\\n)n(bib")f (pac)n(k)-5 b(age,)36 b(whic)n(h)f(is)g(a)f(collection)h(of)g(to)r(ols) f(to)h(help)g(authors)f(tak)n(e)h(b)r(etter)0 364 y(adv)-5 b(an)n(tage)24 b(of)i(B)l Fr(i)n(b)-7 b Ft(T)648 390 y(E)694 364 y(X)26 b(data,)f(esp)r(ecially)g(when)h(w)n(orking)e(in)i (collab)r(oration.)34 b(The)26 b(driving)f(tec)n(hnology)f(is)h(that)h (instead)0 464 y(of)34 b(using)f(B)l Fr(i)n(b)-7 b Ft(T)489 489 y(E)536 464 y(X)34 b(\\k)n(eys,")g(whic)n(h)g(are)f(c)n(hosen)g (arbitrarily)f(and)h(idiosyncratically)-7 b(,)34 b(n)n(bib)g(builds)h (a)e(bibliograph)n(y)f(b)n(y)0 564 y(searc)n(hing)26 b(the)i(con)n(ten)n(ts)f(of)g(citations.)125 704 y Fq(\017)41 b Fs(nbibtex)36 b Ft(is)k(a)f(drop-in)g(replacemen)n(t)g(for)g Fs(bibtex)p Ft(.)70 b(Authors')40 b Fs(\\cite{)p Ft(.)11 b(.)j(.)m Fs(})40 b Ft(commands)f(are)f(in)n(terpreted)h(ei-)208 804 y(ther)j(as)f(classic)g(B)l Fr(i)n(b)-7 b Ft(T)948 829 y(E)994 804 y(X)43 b(k)n(eys)e(\(for)h(bac)n(kw)n(ard)e (compatibilit)n(y\))i(or)f(as)h(searc)n(h)e(commands.)80 b(Th)n(us,)46 b(if)c(y)n(our)208 903 y(bibliograph)n(y)c(con)n(tains)h (the)h(classic)f(pap)r(er)g(on)g(t)n(yp)r(e)h(inference,)j Fs(nbibtex)37 b Ft(should)j(\014nd)g(it)g(using)g(a)f(citation)208 1003 y(lik)n(e)34 b Fs(\\cite{damas-milne)o(r:)o(19)o(78})o Ft(,)d(or)j Fs(\\cite{damas-milne)o(r:)o(pol)o(ym)o(orp)o(hi)o(sm)o(})p Ft(,)d(or)j(p)r(erhaps)h(ev)n(en)f(simply)208 1102 y Fs(\\cite{damas-mil)o(ner)o(})p Ft(|)p Fp(r)-5 b(e)l(gar)l(d)t(less)24 b Ft(of)e(the)f(B)l Fr(i)n(b)-7 b Ft(T)1887 1127 y(E)1934 1102 y(X)21 b(k)n(ey)g(y)n(ou)g(ma)n(y)g(ha)n(v)n(e)f(c)n(hosen.)34 b(The)21 b(same)g(citations)g(should)208 1202 y(also)26 b(w)n(ork)g(with)i(y)n(our)f(coauthors')f(bibliographies,)g(ev)n(en)h (if)h(they)g(are)e(k)n(ey)n(ed)h(di\013eren)n(tly)-7 b(.)125 1355 y Fq(\017)41 b Fs(nbibfind)25 b Ft(uses)k(the)h(n)n(bib)f (searc)n(h)e(engine)i(on)g(the)g(command)g(line.)42 b(If)29 b(y)n(ou)g(kno)n(w)f(y)n(ou)g(are)g(lo)r(oking)g(for)h(a)g(pap)r(er)208 1455 y(b)n(y)e(Harp)r(er)g(and)g(Moggi,)g(y)n(ou)f(can)i(just)g(t)n(yp) r(e)295 1622 y Fs(nbibfind)40 b(harper-moggi)208 1789 y Ft(and)27 b(see)g(what)h(comes)f(out.)125 1942 y Fq(\017)41 b Ft(T)-7 b(o)37 b(help)i(y)n(ou)f(w)n(ork)e(with)j(coauthors)e(who)h (don't)g(ha)n(v)n(e)f(the)i(n)n(bib)g(pac)n(k)-5 b(age,)39 b Fs(nbibmake)3166 1912 y Fo(1)3238 1942 y Ft(examines)f(a)g(L)3709 1925 y Fo(A)3746 1942 y Ft(T)3792 1960 y(E)3838 1942 y(X)208 2041 y(do)r(cumen)n(t)27 b(and)h(builds)g(a)f(custom)g Fs(.bib)f Ft(\014le)i(just)g(for)f(that)h(do)r(cumen)n(t.)0 2182 y(The)g(pac)n(k)-5 b(age)26 b(is)h(written)h(in)g(a)f(com)n (bination)g(of)g(C)h(and)f(Lua:)125 2322 y Fq(\017)41 b Ft(Because)22 b(I)i(w)n(an)n(t)f(n)n(bib)h(to)g(b)r(e)g(able)f(to)h (handle)g(bibliographies)e(with)i(thousands)f(or)g(tens)h(of)g (thousands)f(of)h(en)n(tries,)208 2421 y(the)39 b(co)r(de)g(to)g(parse) f(a)g Fs(.bib)g Ft(\\database")f(is)h(written)i(in)f(C.)g(A)g(computer) g(b)r(ough)n(t)g(in)g(2003)e(can)i(parse)f(o)n(v)n(er)208 2521 y(15,000)25 b(en)n(tries)i(p)r(er)g(second.)125 2674 y Fq(\017)41 b Ft(Because)23 b(the)i(searc)n(h)e(for)i(B)l Fr(i)n(b)-7 b Ft(T)1201 2699 y(E)1247 2674 y(X)25 b(en)n(tries)f (requires)f(string)h(searc)n(hing)f(on)h(ev)n(ery)g(en)n(try)-7 b(,)24 b(the)h(string)f(searc)n(h)g(is)g(also)208 2774 y(written)j(in)h(C)g(\(and)g(uses)f(Bo)n(y)n(er-Mo)r(ore\).)125 2927 y Fq(\017)41 b Ft(Because)20 b(string)g(manipulation)h(is)g(m)n (uc)n(h)f(more)h(easily)f(done)h(in)g(Lua,)h(all)f(the)g(co)r(de)g (that)g(con)n(v)n(erts)e(a)i(B)l Fr(i)n(b)-7 b Ft(T)3581 2952 y(E)3627 2927 y(X)22 b(en)n(try)208 3026 y(in)n(to)27 b(prin)n(ted)g(matter)h(is)f(written)h(in)g(Lua,)f(as)g(is)h(all)f(the) h(\\driv)n(er")d(co)r(de)j(that)g(implemen)n(ts)f(v)-5 b(arious)27 b(programs.)0 3167 y(The)35 b(net)g(result)f(is)h(that)f Fs(nbibtex)e Ft(is)j(ab)r(out)f(\014v)n(e)h(times)g(slo)n(w)n(er)d (than)j(classic)f Fs(bibtex)p Ft(.)55 b(This)35 b(slo)n(wdo)n(wn)e(is)i (easy)e(to)0 3266 y(observ)n(e)f(when)h(prin)n(ting)g(a)g(bibliograph)n (y)e(of)i(sev)n(eral)f(thousand)h(en)n(tries,)h(but)f(on)g(a)g(t)n (ypical)g(pap)r(er)g(with)g(few)n(er)g(than)0 3366 y(\014ft)n(y)28 b(citations)f(and)h(a)f(p)r(ersonal)f(bibliograph)n(y)g(with)i(a)f (thousand)h(en)n(tries,)f(the)h(pause)f(is)g(imp)r(erceptible.)0 3593 y Fn(1.1)112 b(Compatibilit)m(y)0 3746 y Ft(I'v)n(e)26 b(made)h(ev)n(ery)f(e\013ort)g(to)h(mak)n(e)f(N)l Fr(bi)n(b)-7 b Ft(T)1349 3771 y(E)1396 3746 y(X)27 b(compatible)g(with)g(B)l Fr(i)n(b)-7 b Ft(T)2262 3771 y(E)2308 3746 y(X,)28 b(so)e(that)h(N)l Fr(bi)n(b)-7 b Ft(T)2917 3771 y(E)2964 3746 y(X)27 b(can)g(b)r(e)g (used)g(on)f(existing)0 3846 y(pap)r(ers)h(and)h(should)g(pro)r(duce)g (the)g(same)g(output)g(as)g(B)l Fr(i)n(b)-7 b Ft(T)1901 3871 y(E)1947 3846 y(X.)28 b(Regrettably)-7 b(,)28 b(compatibilit)n(y)f (means)h(a)n(v)n(oiding)e(mo)r(dern)0 3945 y(treatmen)n(t)21 b(of)g(non-ASCI)r(I)h(c)n(haracters,)e(suc)n(h)h(as)f(are)h(found)g(in) h(the)g(ISO)f(Latin-1)f(c)n(haracter)f(set:)34 b(classic)20 b(B)l Fr(i)n(b)-7 b Ft(T)3532 3970 y(E)3578 3945 y(X)22 b(simply)0 4045 y(treats)27 b(ev)n(ery)f(non-ASCI)r(I)i(c)n(haracter)d (as)i(a)h(letter.)125 4185 y Fq(\017)41 b Ft(It)36 b(w)n(ould)g(b)r(e)h (pleasan)n(t)f(to)g(try)g(instead)g(to)h(set)f(N)l Fr(bi)n(b)-7 b Ft(T)2029 4210 y(E)2076 4185 y(X)37 b(to)f(use)g(an)h(ISO)f(8859-1)d (lo)r(cale,)39 b(but)e(this)f(leads)g(to)208 4285 y(incompatible)27 b(output:)37 b(N)l Fr(bi)n(b)-7 b Ft(T)1221 4310 y(E)1268 4285 y(X)28 b(forces)f(c)n(haracters)e(to)j(lo)n(w)n(er)e(case)g(that)i (B)l Fr(i)n(b)-7 b Ft(T)2826 4310 y(E)2872 4285 y(X)28 b(lea)n(v)n(es)e(alone.)-8 4394 y Fm(3)181 b Fl(h)p Fk(ple)l(asant)28 b(c)l(o)l(de)h(that)g(r)l(esults)g(in)e(inc)l(omp)l(atible)h(output)h Fm(3)p Fl(i)p Fq(\021)291 4486 y Fj(do)369 4577 y(local)40 b(locales)h(=)447 4668 y({)f("en_US",)h("en_AU",)g("en_CA",)g("en_GB",) g("fr_CA",)g("fr_CH",)g("fr_FR",)g(})369 4760 y(for)f(_,)g(l)f(in)h (pairs\(locales\))i(do)447 4851 y(if)e(os.setlocale\(l)j(..)c ('.iso88591',)j('ctype'\))f(then)f(break)h(end)369 4942 y(end)291 5034 y(end)p 0 5074 1560 4 v 92 5127 a Fi(1)127 5151 y Fm(Not)24 b(y)n(et)h(implemen)n(ted.)1929 5400 y Ft(3)p eop end %%Page: 4 4 TeXDict begin 4 3 bop 125 83 a Fq(\017)41 b Ft(A)23 b(m)n(uc)n(h)h (less)e(pleasan)n(t)h(alternativ)n(e)f(w)n(ould)h(b)r(e)h(to)f(abandon) g(the)g(supp)r(ort)h(that)f(Lua)g(pro)n(vides)f(for)h(distinguishing) 208 183 y(letters)h(from)h(nonletters)f(and)h(instead)g(to)f(try)h(to)g (do)f(some)h(sort)f(of)h(system-dep)r(enden)n(t)g(c)n(haracter)d (classi\014cation,)208 282 y(as)k(is)i(done)f(in)h(B)l Fr(i)n(b)-7 b Ft(T)853 307 y(E)899 282 y(X.)28 b(I)g(don't)g(ha)n(v)n (e)e(the)i(stomac)n(h)f(for)g(it.)125 448 y Fq(\017)41 b Ft(The)30 b(most)g(principled)g(solution)g(I)g(can)g(imagine)g(w)n (ould)f(b)r(e)i(to)f(de\014ne)h(a)e(sp)r(ecial)h(\\B)l Fr(i)n(b)-7 b Ft(T)3079 473 y(E)3125 448 y(X)30 b(lo)r(cale,")g(whose)g (sole)208 548 y(purp)r(ose)35 b(w)n(ould)i(b)r(e)f(to)h(guaran)n(tee)d (compatibilit)n(y)j(with)g(B)l Fr(i)n(b)-7 b Ft(T)2281 573 y(E)2327 548 y(X.)37 b(But)g(this)f(p)r(oten)n(tial)h(solution)f (lo)r(oks)f(lik)n(e)h(a)208 648 y(nigh)n(tmare)26 b(for)h(soft)n(w)n (are)f(distribution.)125 814 y Fq(\017)41 b Ft(What)29 b(I'v)n(e)f(done)h(is)g(pro)r(ceed)f(blithely)h(with)h(the)f(user's)f (curren)n(t)g(lo)r(cale,)h(thro)n(wing)f(in)h(a)f(hac)n(k)h(here)f(or)g (there)h(as)208 913 y(needed)c(to)f(guaran)n(tee)f(compatibilit)n(y)i (with)g(the)g(test)g(cases)f(I)h(ha)n(v)n(e)f(in)h(the)g(default)g(lo)r (cale)f(I)h(happ)r(en)h(to)e(use.)36 b(The)208 1013 y(most)27 b(notable)g(case)g(is)g Fs(bst.purify)p Ft(,)d(whic)n(h)j(is)h(used)g (to)f(generate)f(k)n(eys)h(for)g(sorting.)0 1179 y(Exp)r(edience)g (carries)f(the)i(da)n(y)-7 b(.)36 b(F)-7 b(eh.)0 1453 y Fv(2)135 b(P)l(arsing)45 b Fh(.bib)e Fv(\014les)0 1635 y Ft(This)28 b(section)f(reads)f(the)i Fs(.bib)e Ft(\014le\(s\).)-215 1752 y Fm(4)180 b Fl(h)p Fk(nbib.c)27 b Fm(4)p Fl(i)p Fq(\021)83 1843 y Fj(#include)41 b()83 1934 y(#include)g()83 2026 y(#include)g()83 2117 y(#include)g()83 2208 y(#include)g()83 2299 y(#include)g()83 2482 y(#include)g()83 2573 y(#include)g()83 2756 y Fl(h)p Fk(typ)l(e)29 b(de\014nitions)f Fm(5a)p Fl(i)83 2847 y(h)p Fk(function)g(pr)l(ototyp) l(es)i Fm(5c)p Fl(i)83 2939 y(h)p Fk(initialize)l(d)d(and)h (uninitialize)l(d)f(data)h Fm(5b)p Fl(i)83 3030 y(h)p Fk(macr)l(o)g(de\014nitions)h Fm(7b)p Fl(i)83 3121 y(h)p Fk(Pr)l(o)l(c)l(e)l(dur)l(es)h(and)e(functions)g(for)g(input)g(sc)l (anning)g Fm(10c)p Fl(i)83 3213 y(h)p Fk(function)g(de\014nitions)g Fm(8)p Fl(i)1929 5400 y Ft(4)p eop end %%Page: 5 5 TeXDict begin 5 4 bop 0 83 a Fn(2.1)112 b(In)m(ternal)38 b(in)m(terfaces)0 236 y Fu(2.1.1)94 b(Data)33 b(structures)0 390 y Ft(F)-7 b(or)32 b(con)n(v)n(enience)g(in)h(k)n(eeping)g(function) g(protot)n(yp)r(es)f(uncluttered,)j(all)e(state)g(asso)r(ciated)e(with) j(reading)e(a)g(particular)0 489 y(B)l Fr(i)n(b)-7 b Ft(T)165 514 y(E)211 489 y(X)28 b(\014le)g(is)f(stored)g(in)h(a)f (single)g Fs(Bibreader)d Ft(abstraction.)36 b(That)27 b(state)h(is)f(divided)h(in)n(to)f(three)h(groups:)125 655 y Fq(\017)41 b Ft(Fields)27 b(that)h(sa)n(y)f(what)g(\014le)h(w)n (e)f(are)g(reading)f(and)i(what)f(is)h(our)f(p)r(osition)g(within)h (that)g(\014le)125 821 y Fq(\017)41 b Ft(A)27 b(bu\013er)h(that)g (holds)f(one)h(line)f(of)h(the)g Fs(.bib)e Ft(\014le)i(curren)n(tly)e (b)r(eing)i(scanned)125 987 y Fq(\017)41 b Ft(State)30 b(accessible)g(from)g(Lua:)42 b(an)31 b(in)n(terpreter;)g(a)f(list)h (of)f(strings)g(from)g(the)h Fs(.bib)e Ft(pream)n(ble,)i(whic)n(h)f(is) h(exp)r(osed)208 1087 y(to)c(the)h(clien)n(t;)g(a)f(w)n(arning)f (function)i(pro)n(vided)f(b)n(y)g(the)h(clien)n(t;)g(and)f(a)g(macro)f (table)i(pro)n(vided)e(b)n(y)i(the)g(clien)n(t)f(and)208 1187 y(up)r(dated)h(b)n(y)f Fs(@string)e Ft(commands)0 1353 y(In)k(the)h(bu\013er,)g(the)f(meaningful)h(c)n(haracters)d(are)h (in)h(the)h(half-op)r(en)f(in)n(terv)-5 b(al)29 b([)p Fs(buf)n Fg(;)14 b Fs(lim)o Ft(\),)30 b(and)f(w)n(e)g(reserv)n(e)e (space)i(for)f(a)0 1452 y(sen)n(tinel)g(at)f Fs(lim)p Ft(.)36 b(The)27 b(in)n(v)-5 b(arian)n(t)27 b(is)g(that)h Fs(buf)22 b Fq(\024)h Fs(cur)f Fg(<)g Fs(lim)27 b Ft(and)g Fs(buf)17 b Ft(+)h Fs(bufsize)i Fq(\025)j Fs(lim)17 b Ft(+)h(1.)-251 1568 y Fm(5a)181 b Fl(h)p Fk(typ)l(e)29 b(de\014nitions)f Fm(5a)p Fl(i)p Fq(\021)3080 b Fm(\(4\))83 1660 y Fj(typedef)41 b(struct)f(bibreader)i({)161 1751 y(const)f(char)f(*filename;)512 b(/*)40 b(name)g(of)g(the)g(.bib)g (file)g(*/)161 1842 y(FILE)h(*file;)903 b(/*)40 b(.bib)g(file)g(open)g (for)g(read)g(*/)161 1934 y(int)g(line_num;)826 b(/*)40 b(line)g(number)h(of)e(the)h(.bib)g(file)g(*/)161 2025 y(int)g(entry_line;)748 b(/*)40 b(line)g(number)h(of)e(last)h(seen)h (entry)f(start)g(*/)161 2208 y(unsigned)i(char)e(*buf,)g(*cur,)g(*lim;) 119 b(/*)40 b(input)g(buffer)h(*/)161 2299 y(unsigned)h(bufsize;)668 b(/*)40 b(size)g(of)g(buffer)g(*/)161 2390 y(char)h(entry_close;)120 b(/*)40 b(character)h(expected)g(to)f(close)g(current)h(entry)f(*/)161 2573 y(lua_State)i(*L;)161 2664 y(int)e(preamble;)277 b(/*)40 b(reference)h(to)f(preamble)h(list)f(of)g(strings)g(*/)161 2756 y(int)g(warning;)316 b(/*)40 b(reference)h(to)f(universal)h (warning)g(function)g(*/)161 2847 y(int)f(macros;)355 b(/*)40 b(reference)h(to)f(macro)g(table)g(*/)83 2938 y(})f(*Bibreader;)125 3063 y Ft(The)31 b Fs(is)p 392 3063 27 4 v 30 w(id)p 510 3063 V 31 w(char)f Ft(arra)n(y)e(is)k(used)f (to)g(de\014ne)g(a)g(predicate)g(that)g(sa)n(ys)f(whether)h(a)g(c)n (haracter)e(is)i(considered)f(part)h(of)0 3162 y(an)c(iden)n(ti\014er.) -254 3279 y Fm(5b)180 b Fl(h)p Fk(initialize)l(d)27 b(and)h (uninitialize)l(d)f(data)h Fm(5b)p Fl(i)q Fq(\021)2309 b Fm(\(4\))48 b(21c)13 b Ff(.)83 3370 y Fj(bool)40 b(is_id_char[256];) 161 b(/*)39 b(needs)i(initialization)h(*/)83 3461 y(#define)f (concat_char)h('#')79 b(/*)39 b(used)i(to)e(concatenate)j(parts)e(of)g (a)f(field)i(defn)f(*/)0 3702 y Fu(2.1.2)94 b(Scanning)0 3855 y Ft(Most)29 b(in)n(ternal)g(functions)h(are)f(dev)n(oted)g(to)h (some)f(form)g(of)h(scanning.)42 b(The)29 b(mo)r(del)h(is)g(a)f(bit)h (lik)n(e)f(Icon:)41 b(scanning)29 b(ma)n(y)0 3955 y(succeed)c(or)g (fail,)i(and)e(it)i(has)e(a)g(side)h(e\013ect)g(on)g(the)g(state)g(of)g (the)g(reader|in)e(particular)h(the)h(v)-5 b(alue)26 b(of)g(the)g Fs(cur)e Ft(p)r(oin)n(ter,)0 4055 y(and)32 b(p)r(ossibly)g(also)f(the)i(con)n(ten)n(ts)f(of)g(the)h(bu\013er.)51 b(\(Unlik)n(e)33 b(Icon,)g(there)f(is)h(no)f(bac)n(ktrac)n(king.\))49 b(Success)32 b(or)f(failure)h(is)0 4154 y(nonzero)26 b(or)h(zero)f(but)j(is)e(represen)n(ted)g(using)g(t)n(yp)r(e)h Fs(bool)p Ft(.)-247 4270 y Fm(5c)181 b Fl(h)p Fk(function)28 b(pr)l(ototyp)l(es)i Fm(5c)p Fl(i)q Fq(\021)2784 b Fm(\(4\))48 b(5d)13 b Ff(.)83 4362 y Fj(typedef)41 b(int)f(bool;)125 4486 y Ft(F)-7 b(unction)29 b Fs(getline)d Ft(re\014lls)j(the)g (bu\013er)g(with)g(a)g(new)g(line)g(\(and)g(up)r(dates)g Fs(line)p 2694 4486 V 30 w(num)p Ft(\),)g(returning)f(failure)g(on)h (end)g(of)0 4586 y(\014le.)-254 4702 y Fm(5d)180 b Fl(h)p Fk(function)28 b(pr)l(ototyp)l(es)i Fm(5c)p Fl(i)q Ft(+)o Fq(\021)2563 b Fm(\(4\))49 b Ff(/)12 b Fm(5c)47 b(6a)13 b Ff(.)83 4793 y Fj(static)41 b(bool)f(getline\(Bibreader)j(rdr\);)1929 5400 y Ft(5)p eop end %%Page: 6 6 TeXDict begin 6 5 bop 125 83 a Ft(Sev)n(eral)23 b(scanning)h(functions) h(come)f(in)h(t)n(w)n(o)f(\015a)n(v)n(ors,)f(whic)n(h)h(dep)r(end)i(on) e(what)h(happ)r(ends)g(at)f(the)h(end)g(of)g(a)f(line:)36 b(the)p 0 183 27 4 v 26 183 a Fs(getline)28 b Ft(\015a)n(v)n(or)g (re\014lls)i(the)g(bu\013er)h(and)f(k)n(eeps)f(scanning;)i(the)g (normal)e(\015a)n(v)n(or)f(fails.)45 b(Here)30 b(are)f(some)h (functions)h(that)0 282 y(scan)c(for)g(com)n(binations)g(of)g (particular)f(c)n(haracters,)g(whitespace,)h(and)g(non)n(white)h(c)n (haracters.)-251 399 y Fm(6a)181 b Fl(h)p Fk(function)28 b(pr)l(ototyp)l(es)i Fm(5c)p Fl(i)q Ft(+)o Fq(\021)2552 b Fm(\(4\))48 b Ff(/)12 b Fm(5d)47 b(6b)13 b Ff(.)83 490 y Fj(static)41 b(bool)f(upto1\(Bibreader)i(rdr,)f(char)f(c\);)83 581 y(static)h(bool)f(upto1_getline\(Bibreader)k(rdr,)c(char)g(c\);)83 672 y(static)h(void)f(upto_white_or_1\(Bibreader)45 b(rdr,)40 b(char)g(c\);)83 764 y(static)h(void)f(upto_white_or_2\(Bibreader)45 b(rdr,)40 b(char)g(c1,)g(char)g(c2\);)83 855 y(static)h(void)f (upto_white_or_3\(Bibreader)45 b(rdr,)40 b(char)g(c1,)g(char)g(c2,)g (char)g(c3\);)83 946 y(static)h(bool)f(upto_nonwhite\(Bibreader)k (rdr\);)83 1038 y(static)d(bool)f(upto_nonwhite_getline\(Bibreade)q(r) 45 b(rdr\);)0 1162 y Ft(Because)27 b(there)g(is)g(alw)n(a)n(ys)f (whitespace)h(at)h(the)g(end)g(of)f(a)g(line,)h(the)g Fs(upto)p 2368 1162 V 30 w(white)p 2618 1162 V 29 w(*)f Ft(\015a)n(v)n(or)f(cannot)h(fail.)125 1262 y(Some)32 b(more)h(sophisticated)f(scanning)g(functions.)54 b(None)33 b(attempts)g(to)g(return)f(a)h(v)-5 b(alue;)36 b(instead)d(eac)n(h)f (functions)0 1362 y(scans)c(past)g(the)h(tok)n(en)f(in)h(question,)g (whic)n(h)g(the)g(clien)n(t)f(can)h(then)g(\014nd)g(b)r(et)n(w)n(een)g (the)g(old)f(and)h(new)f(v)-5 b(alues)29 b(of)f(the)h Fs(cur)0 1461 y Ft(p)r(oin)n(ter.)-254 1577 y Fm(6b)180 b Fl(h)p Fk(function)28 b(pr)l(ototyp)l(es)i Fm(5c)p Fl(i)q Ft(+)o Fq(\021)2563 b Fm(\(4\))49 b Ff(/)12 b Fm(6a)47 b(6c)13 b Ff(.)83 1669 y Fj(static)41 b(bool)f (scan_identifier)i(\(Bibreader)g(rdr,)e(char)g(c1,)g(char)g(c2,)g(char) g(c3\);)83 1760 y(static)h(bool)f(scan_nonneg_integer)j(\(Bibreader)f (rdr,)e(unsigned)h(*np\);)125 1885 y Ft(Con)n(tin)n(uing)26 b(from)i(lo)n(w)f(to)g(high)h(lev)n(el,)f(here)g(are)f(functions)i (used)g(to)f(scan)g(\014elds,)h(ab)r(out)g(whic)n(h)f(more)g(b)r(elo)n (w:)-247 2001 y Fm(6c)181 b Fl(h)p Fk(function)28 b(pr)l(ototyp)l(es)i Fm(5c)p Fl(i)q Ft(+)o Fq(\021)2552 b Fm(\(4\))48 b Ff(/)12 b Fm(6b)47 b(6d)13 b Ff(.)83 2092 y Fj(static)41 b(bool)f (scan_and_buffer_a_field_token)46 b(\(Bibreader)41 b(rdr,)f(int)g(key,) g(luaL_Buffer)i(*b\);)83 2183 y(static)f(bool)f (scan_balanced_braces\(Bibreader)46 b(rdr,)40 b(char)g(close,)h (luaL_Buffer)g(*b\);)83 2275 y(static)g(bool)f (scan_and_push_the_field_value)46 b(\(Bibreader)41 b(rdr,)f(int)g (key\);)125 2399 y Ft(Tw)n(o)33 b(utilit)n(y)h(functions)h(used)f (after)g(scanning:)49 b(The)34 b Fs(lower)p 2126 2399 V 29 w(case)f Ft(function)i(o)n(v)n(erwrites)c(bu\013er)k(c)n (haracters)d(with)0 2499 y(their)21 b(lo)n(w)n(ercase)e(equiv)-5 b(alen)n(ts.)34 b(The)22 b Fs(strip)p 1398 2499 V 29 w(leading)p 1735 2499 V 29 w(and)p 1896 2499 V 30 w(trailing)p 2278 2499 V 28 w(space)d Ft(functions)j(remo)n(v)n(es)d(leading)i(and)g (trailing)0 2599 y(space)27 b(c)n(haracters)e(from)i(a)h(string)e(on)i (top)f(of)h(the)g(Lua)f(stac)n(k.)-254 2715 y Fm(6d)180 b Fl(h)p Fk(function)28 b(pr)l(ototyp)l(es)i Fm(5c)p Fl(i)q Ft(+)o Fq(\021)2567 b Fm(\(4\))49 b Ff(/)12 b Fm(6c)47 b(6e)13 b Ff(.)83 2806 y Fj(static)41 b(void)f (lower_case\(unsigned)j(char)d(*p,)g(unsigned)h(char)g(*lim\);)83 2897 y(static)g(void)f(strip_leading_and_trailing_spa)q(ce\(lu)q(a_St)q (ate)46 b(*L\);)0 3138 y Fu(2.1.3)94 b(Other)32 b(functions)-247 3283 y Fm(6e)181 b Fl(h)p Fk(function)28 b(pr)l(ototyp)l(es)i Fm(5c)p Fl(i)q Ft(+)o Fq(\021)2569 b Fm(\(4\))49 b Ff(/)12 b Fm(6d)47 b(6f)12 b Ff(.)83 3374 y Fj(static)41 b(int)f (get_bib_command_or_entry_and_pr)q(ocess)q(\(Bib)q(read)q(er)45 b(rdr\);)83 3466 y(int)40 b(luaopen_bibtex)i(\(lua_State)g(*L\);)0 3723 y Fu(2.1.4)94 b(Commands)0 3876 y Ft(In)34 b(addition)g(to)g (database)e(en)n(tries,)j(a)f Fs(.bib)e Ft(\014le)i(ma)n(y)f(con)n (tain)g(the)h Fs(comment)p Ft(,)f Fs(preamble)p Ft(,)f(and)i Fs(string)e Ft(commands.)0 3976 y(Eac)n(h)26 b(is)i(implemen)n(ted)g(b) n(y)f(a)h(function)g(of)f(t)n(yp)r(e)h Fs(Command)p Ft(,)d(whic)n(h)i (is)h(asso)r(ciated)e(with)i(the)g(name)g(b)n(y)f Fs(find)p 3494 3976 V 30 w(command)p Ft(.)-237 4092 y Fm(6f)180 b Fl(h)p Fk(function)28 b(pr)l(ototyp)l(es)i Fm(5c)p Fl(i)q Ft(+)o Fq(\021)2563 b Fm(\(4\))49 b Ff(/)12 b Fm(6e)47 b(7a)13 b Ff(.)83 4184 y Fj(typedef)41 b(bool)f (\(*Command\)\(Bibreader\);)83 4275 y(static)h(Command)f (find_command\(unsigned)k(char)d(*p,)e(unsigned)j(char)e(*lim\);)83 4366 y(static)h(bool)f(do_comment)h(\(Bibreader)h(rdr\);)83 4457 y(static)f(bool)f(do_preamble\(Bibreader)k(rdr\);)83 4549 y(static)d(bool)f(do_string)80 b(\(Bibreader)42 b(rdr\);)1929 5400 y Ft(6)p eop end %%Page: 7 7 TeXDict begin 7 6 bop 0 83 a Fu(2.1.5)94 b(Error)32 b(handling)0 236 y Ft(The)23 b Fs(warnv)e Ft(function)i(is)g(used)g(to)f(call)h(the) g(w)n(arning)f(function)h(supplied)g(b)n(y)g(the)g(Lua)f(clien)n(t.)36 b(In)23 b(addition)g(to)f(the)h(reader,)0 336 y(it)35 b(tak)n(es)e(as)g(argumen)n(ts)g(the)i(n)n(um)n(b)r(er)e(of)i(results)e (exp)r(ected)i(and)f(the)g(signature)f(of)h(the)h(argumen)n(ts.)55 b(\(The)34 b(w)n(arning)0 436 y(function)e(ma)n(y)e(receiv)n(e)g(an)n (y)g(com)n(bination)g(of)h(string)g(\()p Fs(s)p Ft(\),)h(\015oating-p)r (oin)n(t)e(\()p Fs(f)p Ft(\),)i(and)f(in)n(teger)f(\()p Fs(d)p Ft(\))h(argumen)n(ts;)h(the)f Fs(fmt)0 535 y Ft(string)c(giv)n (es)f(the)i(sequence)f(of)h(the)g(argumen)n(ts)e(that)i(follo)n(w.\)) -251 651 y Fm(7a)181 b Fl(h)p Fk(function)28 b(pr)l(ototyp)l(es)i Fm(5c)p Fl(i)q Ft(+)o Fq(\021)2534 b Fm(\(4\))48 b Ff(/)12 b Fm(6f)47 b(21b)13 b Ff(.)83 743 y Fj(static)41 b(void)f (warnv\(Bibreader)i(rdr,)f(int)e(nres,)i(const)f(char)g(*fmt,)h(...\);) 125 867 y Ft(There's)34 b(a)g(lot)h(of)g(crap)f(here)g(to)h(do)f(with)i (rep)r(orting)d(errors.)57 b(An)35 b(error)e(in)i(a)f(function)i (called)e(direct)h(from)f(Lua)0 967 y(pushes)h Fs(false)f Ft(and)h(a)g(message)f(and)h(returns)f Fs(2)p Ft(;)39 b(an)c(error)f(in)h(a)g(b)r(o)r(olean)g(function)h(pushes)f(the)h(same) f(but)h(returns)0 1066 y(failure)27 b(to)h(its)f(caller.)36 b(I)28 b(hop)r(e)g(to)f(replace)g(this)h(co)r(de)f(with)h(nativ)n(e)f (Lua)g(error)f(handling)h(\()p Fs(lua)p 3041 1066 27 4 v 31 w(error)p Ft(\).)-254 1183 y Fm(7b)180 b Fl(h)p Fk(macr)l(o)28 b(de\014nitions)h Fm(7b)p Fl(i)p Fq(\021)3004 b Fm(\(4\))83 1274 y Fj(#define)41 b(LERRPUSH\(S\))h(do)d({)h(\\)161 1365 y(if)g(\(!lua_checkstack\(rdr->L,)45 b(10\)\))40 b(assert\(0\);)h(\\)161 1457 y(lua_pushboolean\(rdr->L,)k(0\);)40 b(\\)161 1548 y(lua_pushfstring\(rdr->L,)45 b("\045s,)40 b(line)g(\045d:)g(",)g(rdr->filename,)i(rdr->line_num\);)h(\\)161 1639 y(lua_pushstring\(rdr->L,)i(S\);)40 b(\\)161 1731 y(lua_concat\(rdr->L,)k(2\);)c(\\)161 1822 y(})g(while\(0\))83 1913 y(#define)h(LERRFPUSH\(S,A\))h(do)e({)f(\\)161 2005 y(if)h(\(!lua_checkstack\(rdr->L,)45 b(10\)\))40 b(assert\(0\);)h(\\) 161 2096 y(lua_pushboolean\(rdr->L,)k(0\);)40 b(\\)161 2187 y(lua_pushfstring\(rdr->L,)45 b("\045s,)40 b(line)g(\045d:)g(",)g (rdr->filename,)i(rdr->line_num\);)h(\\)161 2279 y (lua_pushfstring\(rdr->L,)i(S,)40 b(A\);)g(\\)161 2370 y(lua_concat\(rdr->L,)k(2\);)c(\\)161 2461 y(})g(while\(0\))83 2553 y(#define)h(LERR\(S\))119 b(do)40 b({)f(LERRPUSH\(S\);)121 b(return)40 b(2;)g(})f(while\(0\))83 2644 y(#define)i(LERRF\(S,A\))g (do)f({)f(LERRFPUSH\(S,A\);)k(return)e(2;)e(})h(while\(0\))161 2735 y(/*)g(next:)h(cases)f(for)g(Boolean)h(functions)g(*/)83 2827 y(#define)g(LERRB\(S\))119 b(do)40 b({)f(LERRPUSH\(S\);)121 b(return)40 b(0;)g(})g(while\(0\))83 2918 y(#define)h(LERRFB\(S,A\))h (do)d({)h(LERRFPUSH\(S,A\);)i(return)f(0;)f(})f(while\(0\))1929 5400 y Ft(7)p eop end %%Page: 8 8 TeXDict begin 8 7 bop 0 83 a Fn(2.2)112 b(Reading)39 b(a)e(database)j(en)m(try)0 236 y Ft(Syn)n(tactically)-7 b(,)38 b(a)f Fs(.bib)e Ft(\014le)i(is)f(a)h(sequence)f(of)g(en)n (tries,)j(p)r(erhaps)d(with)h(a)g(few)g Fs(.bib)e Ft(commands)h(thro)n (wn)g(in.)64 b(Eac)n(h)0 336 y(en)n(try)30 b(consists)g(of)h(an)g(at)f (sign,)h(an)g(en)n(try)f(t)n(yp)r(e,)i(and,)g(b)r(et)n(w)n(een)e (braces)g(or)g(paren)n(theses)f(and)i(separated)e(b)n(y)i(commas,)0 436 y(a)i(database)f(k)n(ey)g(and)h(a)g(list)g(of)g(\014elds.)54 b(Eac)n(h)31 b(\014eld)j(consists)e(of)h(a)g(\014eld)g(name,)i(an)e (equals)f(sign,)i(and)f(nonempt)n(y)g(list)0 535 y(of)c(\014eld)f(tok)n (ens)g(separated)f(b)n(y)i Fs(concat)p 1297 535 27 4 v 29 w(char)p Ft(s.)38 b(Eac)n(h)27 b(\014eld)i(tok)n(en)f(is)g(either) h(a)f(nonnegativ)n(e)f(n)n(um)n(b)r(er,)i(a)f(macro)f(name)0 635 y(\(lik)n(e)h(`jan'\),)i(or)d(a)h(brace-balanced)f(string)h (delimited)h(b)n(y)f(either)h(double)f(quotes)g(or)g(braces.)38 b(Finally)-7 b(,)29 b(case)e(di\013erences)0 734 y(are)f(ignored)g(for) h(all)g(but)g(delimited)h(strings)f(and)f(database)g(k)n(eys,)h(and)g (whitespace)f(c)n(haracters)f(and)i(ends-of-line)g(ma)n(y)0 834 y(app)r(ear)32 b(in)h(all)f(reasonable)f(places)h(\(i.e.,)i(an)n (ywhere)e(except)g(within)i(en)n(try)e(t)n(yp)r(es,)i(database)e(k)n (eys,)h(\014eld)g(names,)g(and)0 934 y(macro)23 b(names\);)i (furthermore,)e(commen)n(ts)h(ma)n(y)f(app)r(ear)g(an)n(ywhere)g(b)r (et)n(w)n(een)h(en)n(tries)f(\(or)g(b)r(efore)h(the)g(\014rst)g(or)f (after)h(the)0 1033 y(last\))k(as)e(long)h(as)g(they)h(con)n(tain)f(no) g(at)h(signs.)125 1133 y(This)c(function)h(reads)f(a)g(database)f(en)n (try)h(and)h(pushes)f(it)h(on)f(the)h(Lua)f(stac)n(k.)35 b(An)n(y)25 b(commands)f(encoun)n(tered)f(b)r(efore)0 1233 y(the)28 b(database)e(en)n(try)h(are)g(executed.)37 b(If)28 b(no)f(en)n(try)g(remains,)g(the)h(function)g(returns)f(0.)-215 1349 y Fm(8)180 b Fl(h)p Fk(function)28 b(de\014nitions)g Fm(8)p Fl(i)p Fq(\021)2770 b Fm(\(4\))48 b(14b)13 b Ff(.)83 1440 y Fj(#undef)41 b(ready_tok)83 1531 y(#define)g(ready_tok\(RDR\))h (do)e({)f(\\)161 1623 y(if)h(\(!upto_nonwhite_getline\(RDR\))q(\))45 b(\\)240 1714 y(LERR\("Unexpected)e(end)d(of)f(file"\);)i(\\)161 1805 y(})f(while\(0\))83 1988 y(static)h(int)f (get_bib_command_or_entry_and_pr)q(ocess)q(\(Bib)q(read)q(er)45 b(rdr\))40 b({)161 2079 y(unsigned)i(char)e(*id,)g(*key;)161 2171 y(int)g(keyindex;)161 2262 y(bool)h(\(*command\)\(Bibreader\);)122 2353 y(getnext:)161 2445 y Fl(h)p Fk(sc)l(an)29 b Fj(rdr)f Fk(up)g(to)g(and)g(p)l(ast)h(the)f(next)h Fj(@)f Fk(sign)f(and)h(skip)g (white)g(sp)l(ac)l(e)h(\(or)f(r)l(eturn)i(0\))e Fm(9a)p Fl(i)161 2627 y Fj(id)40 b(=)g(rdr->cur;)161 2719 y(if)g (\(!scan_identifier)j(\(rdr,)e('{',)f('\(',)g('\('\)\))240 2810 y(LERR\("Expected)i(an)e(entry)g(type"\);)161 2901 y(lower_case)i(\(id,)e(rdr->cur\);)277 b(/*)40 b(ignore)g(case)g (differences)i(*/)161 2993 y Fl(h)p Fk(if)27 b Fe([)p Fj(id)p Fd(;)14 b Fj(rdr->cur)r Fe(\))27 b Fk(p)l(oints)h(to)g(a)g(c)l (ommand,)g(exe)l(cute)h(it)f(and)g(go)g(to)g Fj(getnext)h Fm(9b)p Fl(i)161 3175 y Fj(lua_pushlstring\(rdr->L,)45 b(\(char)40 b(*\))g(id,)g(rdr->cur)h(-)e(id\);)158 b(/*)40 b(push)g(entry)g(type)h(*/)161 3267 y(rdr->entry_line)i(=)d (rdr->line_num;)161 3358 y(ready_tok\(rdr\);)161 3449 y Fl(h)p Fk(sc)l(an)29 b(p)l(ast)g(op)l(ening)f(delimiter)f(and)h(set)h Fj(rdr->entry)p 1793 3449 24 4 v 30 w(close)g Fm(9c)p Fl(i)161 3541 y Fj(ready_tok\(rdr\);)161 3632 y(key)40 b(=)g(rdr->cur;)161 3723 y Fl(h)p Fk(set)29 b Fj(rdr->cur)g Fk(to)f(next)h(whitesp)l(ac)l(e,)g(c)l(omma,)e(or)h(p)l(ossibly)g Fj(})g Fm(9d)p Fl(i)161 3815 y Fj(lua_pushlstring\(rdr->L,)45 b(\(char)40 b(*\))g(key,)g(rdr->cur)h(-)f(key\);)79 b(/*)40 b(push)g(database)h(key)f(*/)161 3906 y(keyindex)i(=)d (lua_gettop\(rdr->L\);)161 3997 y(lua_newtable\(rdr->L\);)1378 b(/*)40 b(push)g(table)g(of)g(fields)h(*/)161 4088 y(ready_tok\(rdr\);) 161 4180 y(for)f(\(;)g(*rdr->cur)h(!=)f(rdr->entry_close;)j(\))d({)240 4271 y Fl(h)p Fk(absorb)29 b(c)l(omma)f(\(br)l(e)l(aking)h(if)d(fol)t (lowe)l(d)h(by)h Fj(rdr->entry)p 1966 4271 V 31 w(close)p Fk(\))h Fm(9e)p Fl(i)240 4362 y(h)p Fk(r)l(e)l(ad)f(a)g(\014eld-value)h (p)l(air)f(and)g(set)g(it)g(in)f(the)h(\014eld)g(table,)g(which)f(is)h (on)f(top)i(of)e(the)h(Lua)g(stack)h Fm(10a)p Fl(i)240 4454 y Fj(ready_tok\(rdr\);)161 4545 y(})161 4636 y(rdr->cur++;)81 b(/*)40 b(skip)g(past)g(close)h(of)e(entry)i(*/)161 4728 y(return)g(3;)f(/*)f(entry)i(type,)f(key,)g(table)h(of)e(fields)i(*/)83 4819 y(})1929 5400 y Ft(8)p eop end %%Page: 9 9 TeXDict begin 9 8 bop -251 83 a Fm(9a)181 b Fl(h)p Fk(sc)l(an)28 b Fj(rdr)g Fk(up)g(to)g(and)g(p)l(ast)h(the)g(next)f Fj(@)g Fk(sign)g(and)g(skip)g(white)f(sp)l(ac)l(e)i(\(or)g(r)l(eturn)g (0\))f Fm(9a)p Fl(i)q Fq(\021)1098 b Fm(\(8\))83 174 y Fj(if)40 b(\(!upto1_getline\(rdr,)j('@'\)\))161 266 y(return)e(0;)79 b(/*)40 b(no)f(more)h(entries;)i(return)e(nil)g(*/)83 357 y(assert\(*rdr->cur)j(==)d('@'\);)83 448 y(rdr->cur++;)120 b(/*)40 b(skip)g(the)g(@)f(sign)i(*/)83 540 y(ready_tok\(rdr\);)-254 714 y Fm(9b)180 b Fl(h)p Fk(if)26 b Fe([)p Fj(id)p Fd(;)14 b Fj(rdr->cur)r Fe(\))27 b Fk(p)l(oints)i(to)f(a)g(c)l(ommand,)f(exe)l (cute)j(it)d(and)h(go)g(to)g Fj(getnext)h Fm(9b)p Fl(i)q Fq(\021)1290 b Fm(\(8\))83 805 y Fj(command)41 b(=)e(find_command\(id,) k(rdr->cur\);)83 897 y(if)d(\(command\))h({)161 988 y(if)f (\(!command\(rdr\)\))240 1079 y(return)h(2;)e(/*)h(command)h(put)f (\(false,)g(message\))h(on)f(Lua)g(stack;)h(we're)f(done)g(*/)161 1171 y(goto)h(getnext;)83 1262 y(})125 1403 y Ft(An)27 b(en)n(try)f(is)h(delimited)h(either)f(b)n(y)f(braces)g(or)g(b)n(y)h (brac)n(k)n(ets;)e(in)i(order)f(to)h(recognize)e(the)i(correct)f (closing)g(delimiter,)0 1503 y(w)n(e)h(put)h(it)g(in)g Fs(rdr->entry)p 899 1503 27 4 v 28 w(close)p Ft(.)-247 1619 y Fm(9c)181 b Fl(h)p Fk(sc)l(an)28 b(p)l(ast)h(op)l(ening)f (delimiter)g(and)g(set)g Fj(rdr->entry)p 1631 1619 24 4 v 31 w(close)h Fm(9c)p Fl(i)p Fq(\021)1513 b Fm(\(8)24 b(19c)h(20a\))83 1710 y Fj(if)40 b(\(*rdr->cur)h(==)f('{'\))240 1802 y(rdr->entry_close)j(=)c('}';)83 1893 y(else)h(if)g(\(*rdr->cur)h (==)f('\('\))240 1984 y(rdr->entry_close)j(=)c('\)';)83 2076 y(else)240 2167 y(LERR\("Expected)j(entry)f(to)e(open)i(with)f({)f (or)h(\("\);)83 2258 y(rdr->cur++;)125 2383 y Ft(I'm)27 b(not)h(quite)g(sure)f(wh)n(y)g(stopping)g(at)h Fs(})f Ft(is)g(conditional)g(on)h(the)g(closing)e(delimiter)i(in)g(this)g(w)n (a)n(y)-7 b(.)-254 2499 y Fm(9d)180 b Fl(h)p Fk(set)28 b Fj(rdr->cur)i Fk(to)e(next)h(whitesp)l(ac)l(e,)g(c)l(omma,)e(or)h(p)l (ossibly)g Fj(})g Fm(9d)p Fl(i)p Fq(\021)1761 b Fm(\(8\))83 2590 y Fj(if)40 b(\(rdr->entry_close)j(==)c('}'\))i({)161 2682 y(upto_white_or_1\(rdr,)j(','\);)83 2773 y(})39 b(else)i({)161 2864 y(upto_white_or_2\(rdr,)j(',',)c('}'\);)83 2956 y(})125 3080 y Ft(A)n(t)33 b(this)g(p)r(oin)n(t)g(w)n(e're)f(at)g (a)h(non)n(white)f(tok)n(en)g(that)i(is)e(not)h(the)g(closing)f (delimiter.)53 b(If)33 b(it's)g(not)g(a)f(comma,)h(there's)0 3180 y(big)f(trouble|but)h(ev)n(en)f(if)h(it)f(is,)i(the)f(database)e (ma)n(y)h(b)r(e)g(using)g(comma)g(as)g(a)g(terminator,)h(in)f(whic)n(h) h(case)e(a)h(closing)0 3279 y(delimiter)c(signals)e(the)i(end)g(of)g (the)g(en)n(try)-7 b(.)-247 3396 y Fm(9e)181 b Fl(h)p Fk(absorb)29 b(c)l(omma)f(\(br)l(e)l(aking)h(if)d(fol)t(lowe)l(d)i(by)f Fj(rdr->entry)p 1726 3396 V 31 w(close)p Fk(\))i Fm(9e)p Fl(i)p Fq(\021)1642 b Fm(\(8\))83 3487 y Fj(if)40 b(\(*rdr->cur)h(==)f (','\))g({)161 3578 y(rdr->cur++;)161 3670 y(ready_tok\(rdr\);)161 3761 y(if)g(\(*rdr->cur)i(==)d(rdr->entry_close\))k({)240 3852 y(break;)161 3944 y(})83 4035 y(})c(else)i({)161 4126 y(LERR\("Expected)i(comma)d(or)g(end)g(of)g(entry"\);)83 4218 y(})1929 5400 y Ft(9)p eop end %%Page: 10 10 TeXDict begin 10 9 bop 125 83 a Ft(The)27 b(syn)n(tax)g(for)g(a)g (\014eld)h(is)f Fp(identi\014er)9 b Fs(=)p Fp(value)p Ft(.)38 b(The)28 b(\014eld)g(name)f(is)h(forced)f(to)g(lo)n(w)n(er)f (case.)-286 199 y Fm(10a)181 b Fl(h)p Fk(r)l(e)l(ad)29 b(a)e(\014eld-value)i(p)l(air)f(and)g(set)g(it)g(in)f(the)h(\014eld)g (table,)g(which)f(is)h(on)f(top)i(of)e(the)h(Lua)g(stack)h Fm(10a)p Fl(i)q Fq(\021)783 b Fm(\(8\))83 291 y Fj(if)40 b(\(id)g(=)f(rdr->cur,)i(!scan_identifier)i(\(rdr,)e('=',)f('=',)g ('='\)\))161 382 y(LERR\("Expected)j(a)c(field)i(name"\);)83 473 y(lower_case\(id,)h(rdr->cur\);)83 565 y(lua_pushlstring\(rdr->L,)i (\(char)d(*\))f(id,)f(rdr->cur)i(-)f(id\);)79 b(/*)40 b(push)g(field)g(name)h(*/)83 656 y(ready_tok\(rdr\);)83 747 y(if)f(\(*rdr->cur)h(!=)f('='\))161 839 y(LERR\("Expected)j('=')d (to)f(follow)i(field)f(name"\);)83 930 y(rdr->cur++;)787 b(/*)40 b(skip)g(over)g(the)g([['=']])h(*/)83 1021 y(ready_tok\(rdr\);) 83 1112 y(if)f(\(!scan_and_push_the_field_valu)q(e\(rdr)q(,)45 b(keyindex\)\))161 1204 y(return)c(2;)83 1295 y (strip_leading_and_trailing_sp)q(ace\()q(rdr->)q(L\);)83 1386 y Fl(h)p Fk(if)26 b(\014eld)i(is)f(not)i(alr)l(e)l(ady)f(set,)g (set)h(it;)e(otherwise)i(warn)f Fm(10b)p Fl(i)125 1511 y Ft(O\016cial)c(B)l Fr(i)n(b)-7 b Ft(T)573 1536 y(E)619 1511 y(X)25 b(do)r(es)f(not)h(p)r(ermit)g(duplicate)f(en)n(tries)g(for) g(a)g(single)h(\014eld.)36 b(But)25 b(in)g(en)n(tries)e(on)i(the)g (net,)g(y)n(ou)f(see)g(lots)0 1611 y(of)h(suc)n(h)f(duplicates)h(in)g (suc)n(h)f(uno\016cial)g(\014elds)h(as)f Fs(reffrom)p Ft(.)33 b(Because)24 b(classic)g(B)l Fr(i)n(b)-7 b Ft(T)2701 1636 y(E)2747 1611 y(X)25 b(do)r(esn't)g(rep)r(ort)f(errors)f(on)h (\014elds)0 1710 y(that)29 b(aren't)g(adv)n(ertised)f(b)n(y)h(the)h Fs(.bst)d Ft(\014le,)j(w)n(e)f(don't)g(w)n(an)n(t)g(to)g(just)g(blat)h (out)f(a)g(whole)f(bunc)n(h)i(of)f(w)n(arning)f(messages.)0 1810 y(So)f(instead)h(w)n(e)f(dump)h(the)g(problem)f(on)h(the)g(w)n (arning)e(function)i(pro)n(vided)e(b)n(y)i(the)g(Lua)f(clien)n(t.)125 1910 y(W)-7 b(e)32 b(therefore)g(can't)h(simply)f(set)h(the)g(\014eld)g (in)g(the)f(\014eld)h(table:)47 b(w)n(e)32 b(\014rst)h(lo)r(ok)e(it)i (up,)i(and)d(if)h(it)g(is)g(nil,)h(w)n(e)e(set)h(it;)0 2009 y(otherwise)27 b(w)n(e)g(w)n(arn.)-290 2125 y Fm(10b)181 b Fl(h)p Fk(if)26 b(\014eld)i(is)f(not)i(alr)l(e)l(ady)f(set,)g(set)h (it;)e(otherwise)i(warn)f Fm(10b)p Fl(i)q Fq(\021)1890 b Fm(\(10a\))83 2217 y Fj(lua_pushvalue\(rdr->L,)44 b(-2\);)79 b(/*)40 b(push)g(key)g(*/)83 2308 y(lua_gettable\(rdr->L,)k(-4\);)83 2399 y(if)c(\(lua_isnil\(rdr->L,)j(-1\)\))d({)161 2491 y(lua_pop\(rdr->L,)j(1\);)161 2582 y(lua_settable\(rdr->L,)h(-3\);)83 2673 y(})39 b(else)i({)161 2765 y(lua_pop\(rdr->L,)i(1\);)79 b(/*)40 b(off)g(comes)g(old)g(value)80 b(*/)161 2856 y(warnv\(rdr,)42 b(0,)e("ssdsss",)h(/*)f(tag,)g(file,)g(line,)g (cite-key,)i(field,)e(newvalue)h(*/)397 2947 y("extra)f(field",)h (rdr->filename,)i(rdr->line_num,)397 3039 y(lua_tostring\(rdr->L,)h (keyindex\),)397 3130 y(lua_tostring\(rdr->L,)g(-2\),)c (lua_tostring\(rdr->L,)k(-1\)\);)161 3221 y(lua_pop\(rdr->L,)f(2\);)79 b(/*)40 b(off)g(come)g(key)g(and)g(new)g(value)g(*/)83 3313 y(})0 3570 y Fn(2.3)112 b(Scanning)39 b(functions)0 3723 y Fu(2.3.1)94 b(Scanning)32 b(functions)f(for)h(\014elds)125 3876 y Ft(While)f(scanning)f(\014elds,)i(w)n(e)f(are)f(not)h(op)r (erating)f(in)h(a)f(toplev)n(el)h(function,)h(so)e(the)i(error)d (handling)h(for)h Fs(ready)p 3745 3876 27 4 v 29 w(tok)0 3976 y Ft(needs)c(to)h(b)r(e)g(a)f(bit)h(di\013eren)n(t.)-282 4092 y Fm(10c)181 b Fl(h)p Fk(Pr)l(o)l(c)l(e)l(dur)l(es)30 b(and)e(functions)g(for)g(input)g(sc)l(anning)g Fm(10c)p Fl(i)q Fq(\021)1876 b Fm(\(4\))48 b(10d)13 b Ff(.)83 4184 y Fj(#undef)41 b(ready_tok)83 4275 y(#define)g(ready_tok\(RDR\))h (do)e({)f(\\)161 4366 y(if)h(\(!upto_nonwhite_getline\(RDR\))q(\))45 b(\\)240 4458 y(LERRB\("Unexpected)e(end)d(of)g(file"\);)g(\\)161 4549 y(})g(while\(0\))125 4673 y Ft(Eac)n(h)26 b(\014eld)i(v)-5 b(alue)27 b(is)g(accum)n(ulated)g(in)n(to)h(a)f Fs(luaL)p 1709 4673 V 29 w(Buffer)f Ft(from)h(the)h(Lua)f(auxiliary)f(library)-7 b(.)35 b(The)28 b(bu\013er)g(is)f(alw)n(a)n(ys)0 4773 y(called)g Fs(b)p Ft(;)h(for)f(conciseness,)f(w)n(e)h(use)h(the)g (macro)e Fs(copy)p 1749 4773 V 30 w(char)g Ft(to)h(add)h(a)f(c)n (haracter)e(to)j(it.)-290 4889 y Fm(10d)181 b Fl(h)p Fk(Pr)l(o)l(c)l(e)l(dur)l(es)30 b(and)e(functions)g(for)g(input)g(sc)l (anning)g Fm(10c)p Fl(i)q Ft(+)p Fq(\021)1654 b Fm(\(4\))48 b Ff(/)12 b Fm(10c)48 b(11)13 b Ff(.)83 4981 y Fj(#define)41 b(copy_char\(C\))h(luaL_putchar\(b,)g(\(C\)\))1908 5400 y Ft(10)p eop end %%Page: 11 11 TeXDict begin 11 10 bop 125 83 a Ft(A)28 b(\014eld)f(v)-5 b(alue)28 b(is)f(a)h(sequence)f(of)g(one)h(or)e(more)h(tok)n(ens)g (separated)f(b)n(y)i(a)f Fs(concat)p 2749 83 27 4 v 29 w(char)f Ft(\()p Fs(#)h Ft(mark\).)37 b(A)28 b(precondition)0 183 y(for)f(calling)g Fs(scan)p 571 183 V 30 w(and)p 733 183 V 30 w(push)p 939 183 V 30 w(the)p 1101 183 V 30 w(field)p 1351 183 V 29 w(value)f Ft(is)h(that)h Fs(rdr)e Ft(is)i(p)r(oin)n(ting)f(at)h(a)f(non)n(white)g(c)n(haracter.)-251 299 y Fm(11)181 b Fl(h)p Fk(Pr)l(o)l(c)l(e)l(dur)l(es)30 b(and)e(functions)g(for)g(input)g(sc)l(anning)g Fm(10c)p Fl(i)q Ft(+)p Fq(\021)1646 b Fm(\(4\))49 b Ff(/)12 b Fm(10d)47 b(12)13 b Ff(.)83 390 y Fj(static)41 b(bool)f (scan_and_push_the_field_value)46 b(\(Bibreader)41 b(rdr,)f(int)g (key\))g({)161 482 y(luaL_Buffer)i(field;)161 664 y (luaL_checkstack\(rdr->L,)j(10,)40 b("Not)g(enough)h(Lua)e(stack)i(to)f (parse)g(bibtex)g(database"\);)161 756 y(luaL_buffinit\(rdr->L,)k (&field\);)161 847 y(for)c(\(;;\))h({)240 938 y(if)f (\(!scan_and_buffer_a_field_token)q(\(rdr)q(,)45 b(key,)40 b(&field\)\))318 1029 y(return)h(0;)240 1121 y(ready_tok\(rdr\);)i(/*)c (cur)h(now)g(points)h(to)e([[concat_char]])k(or)d(end)g(of)f(field)i (*/)240 1212 y(if)f(\(*rdr->cur)h(!=)f(concat_char\))i(break;)240 1303 y(else)e({)g(rdr->cur++;)h(ready_tok\(rdr\);)i(})161 1395 y(})161 1486 y(luaL_pushresult\(&field\);)161 1577 y(return)e(1;)83 1669 y(})0 1793 y Ft(Because)27 b Fs(ready)p 543 1793 V 29 w(tok)f Ft(can)i Fs(return)d Ft(in)j(case)e(of)i(error,)e (w)n(e)h(can't)g(write)208 1959 y Fs(for\(;)41 b(*rdr->cur)f(==)j (concat)p 1305 1959 V 29 w(char;)e(rdr->cur++,)e(ready)p 2338 1959 V 29 w(tok\(rdr\)\))p Ft(.)1908 5400 y(11)p eop end %%Page: 12 12 TeXDict begin 12 11 bop 125 83 a Ft(A)39 b(\014eld)h(tok)n(en)e(is)h (either)g(a)g(nonnegativ)n(e)f(n)n(um)n(b)r(er,)k(a)d(macro)f(name)h (\(lik)n(e)g(`jan'\),)j(or)d(a)g(brace-balanced)e(string)0 183 y(delimited)32 b(b)n(y)f(either)h(double)f(quotes)g(or)g(braces.)47 b(Th)n(us)31 b(there)g(are)g(four)g(p)r(ossibilities)g(for)g(the)h (\014rst)f(c)n(haracter)e(of)j(the)0 282 y(\014eld)26 b(tok)n(en:)36 b(If)26 b(it's)h(a)e(left)i(brace)e(or)g(a)h(double)g (quote,)g(the)g(tok)n(en)g(\(with)h(balanced)e(braces,)g(up)i(to)f(the) g(matc)n(hin)g(closing)0 382 y(delimiter\))c(is)f(a)f(string;)j(if)f (it's)f(a)g(digit,)h(the)g(tok)n(en)e(is)h(a)g(n)n(um)n(b)r(er;)i(if)f (it's)f(an)n(ything)f(else,)j(the)e(tok)n(en)g(is)g(a)f(macro)g(name)h (\(and)0 482 y(should)i(th)n(us)h(ha)n(v)n(e)e(b)r(een)i(de\014ned)g(b) n(y)g(either)f(the)h Fs(.bst)p Ft(-\014le's)e Fs(macro)f Ft(command)j(or)e(the)i Fs(.bib)p Ft(-\014le's)e Fs(string)f Ft(command\).)0 581 y(This)28 b(function)g(returns)f Fs(false)e Ft(if)j(there)g(w)n(as)e(a)i(serious)e(syn)n(tax)g(error.) -251 697 y Fm(12)181 b Fl(h)p Fk(Pr)l(o)l(c)l(e)l(dur)l(es)30 b(and)e(functions)g(for)g(input)g(sc)l(anning)g Fm(10c)p Fl(i)q Ft(+)p Fq(\021)1646 b Fm(\(4\))49 b Ff(/)12 b Fm(11)47 b(13b)13 b Ff(.)83 789 y Fj(static)41 b(bool)f (scan_and_buffer_a_field_token)46 b(\(Bibreader)41 b(rdr,)f(int)g(key,) g(luaL_Buffer)i(*b\))e({)161 880 y(unsigned)i(char)e(*p;)161 971 y(unsigned)i(number;)161 1063 y(*rdr->lim)g(=)d(')h(';)161 1154 y(switch)h(\(*rdr->cur\))h({)240 1245 y(case)e('{':)g(case)g('"':) 318 1337 y(return)h(scan_balanced_braces\(rdr,)k(*rdr->cur)c(==)f('{')g (?)f('}')h(:)g('"',)g(b\);)240 1428 y(case)g('0':)g(case)g('1':)g(case) h('2':)f(case)g('3':)g(case)g('4':)240 1519 y(case)g('5':)g(case)g ('6':)g(case)h('7':)f(case)g('8':)g(case)g('9':)318 1611 y(p)g(=)f(rdr->cur;)318 1702 y(scan_nonneg_integer\(rdr,)45 b(&number\);)318 1793 y(luaL_addlstring\(b,)f(\(char)c(*\)p,)g (rdr->cur)h(-)f(p\);)318 1885 y(return)h(1;)201 1976 y(default:)318 2067 y(/*)f(named)g(macro)h(*/)318 2159 y(p)f(=)f(rdr->cur;)318 2250 y(if)h(\(!scan_identifier\(rdr,)k(',',)c (rdr->entry_close,)k(concat_char\)\))397 2341 y(LERRB\("Expected)e(a)e (field)g(part"\);)318 2433 y(lower_case)i(\(p,)e(rdr->cur\);)120 b(/*)39 b(ignore)i(case)f(differences)i(*/)397 2524 y(/*)e(missing)g (warning)h(of)f(macro)g(name)g(used)g(in)g(its)g(own)g(definition)h(*/) 318 2615 y(lua_pushlstring\(rdr->L,)k(\(char)40 b(*\))g(p,)g(rdr->cur)h (-)e(p\);)h(/*)g(stack:)g(name)g(*/)318 2707 y(lua_getref\(rdr->L,)k (rdr->macros\);)748 b(/*)40 b(stack:)g(name)g(macros)h(*/)318 2798 y(lua_insert\(rdr->L,)j(-2\);)1099 b(/*)40 b(stack:)g(name)g (macros)h(name)f(*/)318 2889 y(lua_gettable\(rdr->L,)k(-2\);)1021 b(/*)40 b(stack:)g(name)g(defn)h(*/)318 2980 y(lua_remove\(rdr->L,)j (-2\);)1099 b(/*)40 b(stack:)g(defn)g(*/)318 3072 y Fl(h)p Fk(if)27 b(top)h(of)f(stack)i(is)f(nil,)e(p)l(op)i(it)f(and)h(warn)h (of)e(unde\014ne)l(d)i(macr)l(o;)f(else)g(bu\013er)g(it)g Fm(13a)p Fl(i)318 3163 y Fj(return)41 b(1;)161 3254 y(})83 3346 y(})1908 5400 y Ft(12)p eop end %%Page: 13 13 TeXDict begin 13 12 bop 125 83 a Ft(Here's)32 b(another)g(w)n(arning)f (that's)i(kic)n(k)n(ed)f(out)h(to)g(the)h(clien)n(t.)52 b(Reason:)47 b(standard)32 b(B)l Fr(i)n(b)-7 b Ft(T)3041 108 y(E)3087 83 y(X)33 b(complains)g(only)f(if)i(it)0 183 y(in)n(tends)28 b(to)f(use)h(the)g(en)n(try)f(in)h(question.)-286 299 y Fm(13a)181 b Fl(h)p Fk(if)26 b(top)j(of)e(stack)i(is)e(nil,)f(p)l (op)j(it)e(and)h(warn)g(of)f(unde\014ne)l(d)i(macr)l(o;)f(else)g (bu\013er)h(it)e Fm(13a)p Fl(i)q Fq(\021)1142 b Fm(\(12\))83 390 y Fj({)39 b(int)h(t)g(=)f(lua_gettop\(rdr->L\);)161 482 y(if)h(\(lua_isnil\(rdr->L,)j(-1\)\))e({)240 573 y(lua_pop\(rdr->L,)i(1\);)240 664 y(lua_pushlstring\(rdr->L,)h(\(char)d (*\))e(p,)h(rdr->cur)h(-)f(p\);)240 756 y(warnv\(rdr,)h(1,)f("ssdss",)h (/*)f(tag,)g(file,)g(line,)h(key,)f(macro)g(*/)475 847 y("undefined)i(macro",)f(rdr->filename,)h(rdr->line_num,)475 938 y(key)e(?)g(lua_tostring\(rdr->L,)j(key\))e(:)e(NULL,)h (lua_tostring\(rdr->L,)k(-1\)\);)240 1029 y(if)c (\(lua_isstring\(rdr->L,)k(-1\)\))318 1121 y(luaL_addvalue\(b\);)240 1212 y(else)318 1303 y(lua_pop\(rdr->L,)f(1\);)240 1395 y(lua_pop\(rdr->L,)g(1\);)161 1486 y(})d(else)g({)240 1577 y(luaL_addvalue\(b\);)161 1669 y(})161 1760 y (assert\(lua_gettop\(rdr->L\))45 b(==)40 b(t-1\);)83 1851 y(})125 1976 y Ft(This)22 b Fs(.bib)p Ft(-sp)r(eci\014c)f (function)i(scans)f(and)g(bu\013ers)h(a)f(string)g(with)h(balanced)f (braces,)h(stopping)f(just)h(past)g(the)g(matc)n(h-)0 2076 y(ing)h Fs(close)p Ft(.)33 b(The)25 b(original)d(B)l Fr(i)n(b)-7 b Ft(T)1040 2101 y(E)1086 2076 y(X)25 b(tries)e(to)h (optimize)g(the)h(common)e(case)g(of)h(a)g(\014eld)g(with)h(no)e(in)n (ternal)h(braces;)g(I)g(don't.)0 2175 y(A)37 b(precondition)f(for)h (calling)f(this)h(function)g(is)g(that)g Fs(rdr->cur)c Ft(p)r(oin)n(t)k(at)g(the)g(op)r(ening)g(delimiter.)64 b(Whitespace)37 b(is)0 2275 y(compressed)26 b(to)i(a)f(single)g(space)g (c)n(haracter.)-290 2391 y Fm(13b)181 b Fl(h)p Fk(Pr)l(o)l(c)l(e)l(dur) l(es)30 b(and)e(functions)g(for)g(input)g(sc)l(anning)g Fm(10c)p Fl(i)q Ft(+)p Fq(\021)1650 b Fm(\(4\))48 b Ff(/)12 b Fm(12)48 b(17a)13 b Ff(.)83 2482 y Fj(static)41 b(int)f (scan_balanced_braces\(Bibreader)46 b(rdr,)40 b(char)g(close,)g (luaL_Buffer)i(*b\))e({)161 2574 y(unsigned)i(char)e(*p,)g(*cur,)g(c;) 161 2665 y(int)g(braces)h(=)e(0;)79 b(/*)40 b(number)h(of)e(currently)j (open)e(braces)g(*inside*)h(string)g(*/)161 2848 y(rdr->cur++;)121 b(/*)39 b(scan)h(past)h(left)f(delimiter)h(*/)161 2939 y(*rdr->lim)h(=)d(')h(';)161 3030 y(if)g(\(isspace\(*rdr->cur\)\))k({) 240 3122 y(copy_char\(')e('\);)240 3213 y(ready_tok\(rdr\);)161 3304 y(})161 3396 y(for)e(\(;;\))h({)240 3487 y(p)e(=)h(rdr->cur;)240 3578 y(upto_white_or_3\(rdr,)k('}',)c('{',)g(close\);)240 3670 y(cur)g(=)f(rdr->cur;)240 3761 y(for)h(\()f(;)h(p)f(<)h(cur;)g (p++\))g(/*)g(copy)g(nonwhite,)h(nonbrace)g(characters)h(*/)318 3852 y(copy_char\(*p\);)240 3944 y(*rdr->lim)f(=)f(')f(';)240 4035 y(c)g(=)h(*cur;)79 b(/*)40 b(will)g(be)g(whitespace)h(if)f(at)g (end)g(of)f(line)i(*/)240 4126 y Fl(h)p Fk(dep)l(ending)29 b(on)e Fj(c)p Fk(,)h(r)l(eturn)h(or)f(adjust)g Fj(braces)h Fk(and)f(c)l(ontinue)h Fm(14a)p Fl(i)161 4218 y Fj(})83 4309 y(})1908 5400 y Ft(13)p eop end %%Page: 14 14 TeXDict begin 14 13 bop 125 83 a Ft(Beastly)26 b(complicated:)125 249 y Fq(\017)41 b Ft(Space)27 b(is)g(compressed)g(and)g(scanned)g (past.)125 415 y Fq(\017)41 b Ft(A)27 b(closing)g(delimiter)h(ends)f (the)h(scan)f(at)h(brace)e(lev)n(el)i(0)f(and)g(otherwise)g(is)g (bu\013ered.)125 581 y Fq(\017)41 b Ft(Braces)26 b(adjust)h(the)h Fs(braces)e Ft(coun)n(t.)-286 739 y Fm(14a)181 b Fl(h)p Fk(dep)l(ending)29 b(on)e Fj(c)p Fk(,)h(r)l(eturn)h(or)f(adjust)g Fj(braces)h Fk(and)f(c)l(ontinue)h Fm(14a)p Fl(i)p Fq(\021)1667 b Fm(\(13b\))83 830 y Fj(if)40 b(\(isspace\(c\)\))i({)161 922 y(copy_char\(')g('\);)161 1013 y(ready_tok\(rdr\);)83 1104 y(})d(else)i({)161 1196 y(rdr->cur++;)161 1287 y(if)f(\(c)g(==)g (close\))g({)240 1378 y(if)g(\(braces)g(==)g(0\))g({)318 1469 y(luaL_pushresult\(b\);)318 1561 y(return)h(1;)240 1652 y(})e(else)i({)318 1743 y(copy_char\(c\);)318 1835 y(if)f(\(c)g(==)f('}'\))397 1926 y(braces--;)240 2017 y(})161 2109 y(})h(else)g(if)g(\(c)f(==)h('{'\))g({)240 2200 y(braces++;)240 2291 y(copy_char\(c\);)161 2383 y(})g(else)g({)240 2474 y(assert\(c)h(==)f('}'\);)240 2565 y(if)g(\(braces)g(>)g(0\))g({)318 2657 y(braces--;)318 2748 y(copy_char\(c\);)240 2839 y(})f(else)i({)318 2931 y(luaL_pushresult\(b\);)j(/*)c(restore)g(invariant)i(*/)318 3022 y(LERRB\("Unexpected)h('}'"\);)240 3113 y(})161 3205 y(})83 3296 y(})0 3553 y Fu(2.3.2)94 b(Lo)m(w-lev)m(el)31 b(scanning)h(functions)0 3707 y Ft(Scan)27 b(the)h(reader)e(up)i(to)g (the)g(c)n(haracter)d(requested)i(or)g(end)h(of)f(line;)h(fails)g(if)g (not)f(found.)-290 3823 y Fm(14b)181 b Fl(h)p Fk(function)28 b(de\014nitions)g Fm(8)p Fl(i)p Ft(+)p Fq(\021)2580 b Fm(\(4\))48 b Ff(/)12 b Fm(8)47 b(15a)13 b Ff(.)83 3914 y Fj(static)41 b(bool)f(upto1\(Bibreader)i(rdr,)f(char)f(c\))f({)161 4005 y(unsigned)j(char)e(*p)f(=)h(rdr->cur;)161 4097 y(unsigned)i(char)e(*lim)g(=)f(rdr->lim;)161 4188 y(*lim)i(=)e(c;)161 4279 y(while)i(\(*p)f(!=)f(c\))240 4371 y(p++;)161 4462 y(rdr->cur)j(=)d(p;)161 4553 y(return)i(p)f(<)f(lim;)83 4645 y(})1908 5400 y Ft(14)p eop end %%Page: 15 15 TeXDict begin 15 14 bop 125 83 a Ft(Scan)27 b(the)h(reader)e(up)i(to)f (the)h(c)n(haracter)e(requested)h(or)g(end)g(of)h(\014le;)g(fails)f(if) h(not)g(found.)-286 199 y Fm(15a)181 b Fl(h)p Fk(function)28 b(de\014nitions)g Fm(8)p Fl(i)p Ft(+)p Fq(\021)2501 b Fm(\(4\))48 b Ff(/)12 b Fm(14b)48 b(15b)13 b Ff(.)83 291 y Fj(static)41 b(int)f(upto1_getline\(Bibreader)k(rdr,)c(char)g (c\))g({)161 382 y(while)h(\(!upto1\(rdr,)h(c\)\))240 473 y(if)e(\(!getline\(rdr\)\))318 565 y(return)h(0;)161 656 y(return)g(1;)83 747 y(})125 872 y Ft(Scan)26 b(the)g(reader)f(up)i (to)f(the)g(next)h(whitespace)f(or)f(the)i(one)f(c)n(haracter)e (requested.)36 b(Alw)n(a)n(ys)25 b(succeeds,)h(b)r(ecause)g(the)0 971 y(end)i(of)f(the)h(line)g(is)g(whitespace.)-290 1088 y Fm(15b)181 b Fl(h)p Fk(function)28 b(de\014nitions)g Fm(8)p Fl(i)p Ft(+)p Fq(\021)2513 b Fm(\(4\))48 b Ff(/)12 b Fm(15a)48 b(15c)13 b Ff(.)83 1179 y Fj(static)41 b(void)f (upto_white_or_1\(Bibreader)45 b(rdr,)40 b(char)g(c\))g({)161 1270 y(unsigned)i(char)e(*p)f(=)h(rdr->cur;)161 1362 y(unsigned)i(char)e(*lim)g(=)f(rdr->lim;)161 1453 y(*lim)i(=)e(c;)161 1544 y(while)i(\(*p)f(!=)f(c)h(&&)g(!isspace\(*p\)\))240 1636 y(p++;)161 1727 y(rdr->cur)i(=)d(p;)83 1818 y(})125 1943 y Ft(Scan)27 b(the)h(reader)e(up)i(to)f(the)h(next)g(whitespace)f (or)g(either)h(of)f(t)n(w)n(o)g(c)n(haracters)e(requested.)-282 2059 y Fm(15c)181 b Fl(h)p Fk(function)28 b(de\014nitions)g Fm(8)p Fl(i)p Ft(+)p Fq(\021)2501 b Fm(\(4\))48 b Ff(/)12 b Fm(15b)48 b(15d)13 b Ff(.)83 2150 y Fj(static)41 b(void)f (upto_white_or_2\(Bibreader)45 b(rdr,)40 b(char)g(c1,)g(char)g(c2\))g ({)161 2242 y(unsigned)i(char)e(*p)f(=)h(rdr->cur;)161 2333 y(unsigned)i(char)e(*lim)g(=)f(rdr->lim;)161 2424 y(*lim)i(=)e(c1;)161 2516 y(while)i(\(*p)f(!=)f(c1)h(&&)g(*p)f(!=)h(c2) g(&&)g(!isspace\(*p\)\))240 2607 y(p++;)161 2698 y(rdr->cur)i(=)d(p;)83 2790 y(})125 2914 y Ft(Scan)27 b(the)h(reader)e(up)i(to)f(the)h(next)g (whitespace)f(or)g(an)n(y)g(of)g(three)h(c)n(haracters)d(requested.) -290 3030 y Fm(15d)181 b Fl(h)p Fk(function)28 b(de\014nitions)g Fm(8)p Fl(i)p Ft(+)p Fq(\021)2517 b Fm(\(4\))48 b Ff(/)12 b Fm(15c)48 b(15e)13 b Ff(.)83 3122 y Fj(static)41 b(void)f (upto_white_or_3\(Bibreader)45 b(rdr,)40 b(char)g(c1,)g(char)g(c2,)g (char)g(c3\))g({)161 3213 y(unsigned)i(char)e(*p)f(=)h(rdr->cur;)161 3304 y(unsigned)i(char)e(*lim)g(=)f(rdr->lim;)161 3396 y(*lim)i(=)e(c1;)161 3487 y(while)i(\(!isspace\(*p\))h(&&)e(*p)f(!=)h (c1)g(&&)f(*p)h(!=)g(c2)f(&&)h(*p)g(!=)g(c3\))240 3578 y(p++;)161 3670 y(rdr->cur)i(=)d(p;)83 3761 y(})125 3885 y Ft(This)23 b(function)i(scans)e(o)n(v)n(er)f(whitespace)h(c)n (haracters,)g(stopping)g(either)h(at)f(the)i(\014rst)e(non)n(white)h(c) n(haracter)e(or)h(the)h(end)0 3985 y(of)k(the)g(line,)f(resp)r(ectiv)n (ely)g(returning)g Fs(true)f Ft(or)h Fs(false)p Ft(.)-282 4101 y Fm(15e)181 b Fl(h)p Fk(function)28 b(de\014nitions)g Fm(8)p Fl(i)p Ft(+)p Fq(\021)2505 b Fm(\(4\))48 b Ff(/)12 b Fm(15d)48 b(16a)13 b Ff(.)83 4193 y Fj(static)41 b(bool)f (upto_nonwhite\(Bibreader)k(rdr\))c({)161 4284 y(unsigned)i(char)e(*p)f (=)h(rdr->cur;)161 4375 y(unsigned)i(char)e(*lim)g(=)f(rdr->lim;)161 4467 y(*lim)i(=)e('x';)161 4558 y(while)i(\(isspace\(*p\)\))240 4649 y(p++;)161 4741 y(rdr->cur)h(=)d(p;)161 4832 y(return)i(p)f(<)f (lim;)83 4923 y(})1908 5400 y Ft(15)p eop end %%Page: 16 16 TeXDict begin 16 15 bop 125 83 a Ft(Scan)27 b(past)g(whitespace)g(up)h (to)g(end)g(of)f(\014le)h(if)g(needed;)g(returns)f(true)g(i\013)h(non)n (white)g(c)n(haracter)d(found.)-286 199 y Fm(16a)181 b Fl(h)p Fk(function)28 b(de\014nitions)g Fm(8)p Fl(i)p Ft(+)p Fq(\021)2509 b Fm(\(4\))48 b Ff(/)12 b Fm(15e)48 b(16b)13 b Ff(.)83 291 y Fj(static)41 b(int)f (upto_nonwhite_getline\(Bibreader)46 b(rdr\))40 b({)161 382 y(while)h(\(!upto_nonwhite\(rdr\)\))240 473 y(if)f (\(!getline\(rdr\)\))318 565 y(return)h(0;)161 656 y(return)g(1;)83 747 y(})0 988 y Fu(2.3.3)94 b(Actual)32 b(input)-290 1133 y Fm(16b)181 b Fl(h)p Fk(function)28 b(de\014nitions)g Fm(8)p Fl(i)p Ft(+)p Fq(\021)2505 b Fm(\(4\))48 b Ff(/)12 b Fm(16a)48 b(18b)13 b Ff(.)83 1224 y Fj(static)41 b(bool)f (getline\(Bibreader)j(rdr\))d({)161 1315 y(char)h(*result;)161 1407 y(unsigned)h(char)e(*buf)g(=)f(rdr->buf;)161 1498 y(int)h(n;)161 1589 y(result)h(=)f(fgets\(\(char)h(*\)buf,)g (rdr->bufsize,)h(rdr->file\);)161 1681 y(if)e(\(result)h(==)f(NULL\)) 240 1772 y(return)h(0;)161 1863 y(rdr->line_num++;)161 1955 y(for)f(\(n)g(=)g(strlen\(\(char)h(*\)buf\);)g(buf[n-1])g(!=)f ('\\n';)g(n)g(=)f(strlen\(\(char)j(*\)buf\)\))f({)240 2046 y(/*)f(failed)g(to)g(get)g(whole)g(line)g(*/)240 2137 y(rdr->bufsize)i(*=)e(2;)240 2229 y(buf)g(=)f(rdr->buf)i(=)f (realloc\(rdr->buf,)j(rdr->bufsize\);)240 2320 y(assert\(buf\);)240 2411 y(if)d(\(fgets\(\(char)i(*\)buf+n,rdr->bufsize-n,rdr->fil)q(e\)==) q(NULL\))k({)318 2503 y(n)40 b(=)f(strlen\(\(char)j(*\)buf\))f(+)e(1;) 79 b(/*)40 b(-1)g(below)g(is)g(incorrect)h(without)g(newline)g(*/)318 2594 y(break;)g(/*)f(file)g(ended)g(without)h(a)e(newline)i(*/)240 2685 y(})161 2777 y(})161 2868 y(rdr->cur)h(=)d(buf;)161 2959 y(rdr->lim)j(=)d(buf+n-1;)80 b(/*)40 b(trailing)h(newline)g(not)f (in)f(string)i(*/)161 3051 y(return)g(1;)83 3142 y(})1908 5400 y Ft(16)p eop end %%Page: 17 17 TeXDict begin 17 16 bop 0 83 a Fu(2.3.4)94 b(Medium-lev)m(el)29 b(scanning)j(functions)0 236 y Ft(This)d(pro)r(cedure)f(scans)g(for)h (an)f(iden)n(ti\014er,)i(stopping)e(at)h(the)g(\014rst)g Fs(illegal)p 2487 236 27 4 v 29 w(id)p 2604 236 V 30 w(char)p Ft(,)f(or)g(stopping)h(at)f(the)i(\014rst)f(c)n(har-)0 336 y(acter)35 b(if)i(it's)g Fs(numeric)p Ft(.)60 b(It)36 b(sets)g(the)h(global)e(v)-5 b(ariable)35 b Fs(scan)p 2015 336 V 30 w(result)f Ft(to)i Fs(id)p 2541 336 V 30 w(null)f Ft(if)i(the)f(iden)n(ti\014er)h(is)f(n)n(ull,)i(else)e(to)0 436 y Fs(white)p 225 436 V 29 w(adjacent)27 b Ft(if)k(it)g(ended)g(at)f (a)g(whitespace)g(c)n(haracter)e(or)i(an)g(end-of-line,)h(else)f(to)g Fs(specified)p 3323 436 V 28 w(char)p 3527 436 V 29 w(adjacent)0 535 y Ft(if)38 b(it)g(ended)g(at)f(one)g(of)h Fs(char1)d Ft(or)i Fs(char2)e Ft(or)i Fs(char3)p Ft(,)h(else)f(to)g Fs(other)p 2325 535 V 30 w(char)p 2531 535 V 29 w(adjacent)d Ft(if)k(it)g(ended)g(at)f(a)h(nonsp)r(eci-)0 635 y(\014ed,)29 b(non)n(whitespace)f Fs(illegal)p 1047 635 V 29 w(id)p 1164 635 V 30 w(char)p Ft(.)39 b(By)29 b(con)n(v)n(en)n(tion,)e(when)i (some)g(calling)f(co)r(de)g(really)g(w)n(an)n(ts)g(just)i(one)e(or)g(t) n(w)n(o)0 734 y(\\sp)r(eci\014ed")f(c)n(haracters,)e(it)j(merely)f(rep) r(eats)g(one)g(of)h(the)g(c)n(haracters.)-286 851 y Fm(17a)181 b Fl(h)p Fk(Pr)l(o)l(c)l(e)l(dur)l(es)30 b(and)e(functions)g(for)g (input)g(sc)l(anning)g Fm(10c)p Fl(i)q Ft(+)p Fq(\021)1607 b Fm(\(4\))48 b Ff(/)12 b Fm(13b)48 b(17b)13 b Ff(.)83 942 y Fj(static)41 b(int)f(scan_identifier)i(\(Bibreader)g(rdr,)e(char) g(c1,)g(char)g(c2,)g(char)g(c3\))g({)161 1033 y(unsigned)i(char)e(*p,)g (*orig,)g(c;)161 1216 y(orig)h(=)e(p)h(=)f(rdr->cur;)161 1307 y(if)h(\(!isdigit\(*p\)\))j({)240 1399 y(/*)d(scan)g(until)g (end-of-line)i(or)e(an)f([[illegal_id_char]])44 b(*/)240 1490 y(*rdr->lim)d(=)f(')f(';)79 b(/*)40 b(an)f(illegal)i(id)f (character)h(and)f(also)g(white)h(space)f(*/)240 1581 y(while)g(\(is_id_char[*p]\))318 1673 y(p++;)161 1764 y(})161 1855 y(c)g(=)f(*p;)161 1947 y(if)h(\(p)g(>)f(rdr->cur)i(&&)f (\(isspace\(c\))i(||)d(c)h(==)g(c1)f(||)h(c)f(==)h(c2)g(||)f(c)h(==)g (c3\)\))g({)240 2038 y(rdr->cur)h(=)e(p;)240 2129 y(return)i(1;)161 2220 y(})f(else)g({)240 2312 y(return)h(0;)161 2403 y(})83 2494 y(})125 2619 y Ft(This)22 b(function)h(scans)f(for)g(a)h (nonnegativ)n(e)e(in)n(teger,)i(stopping)f(at)h(the)g(\014rst)f (nondigit;)i(it)g(writes)e(the)h(resulting)f(in)n(teger)0 2719 y(through)f Fs(np)p Ft(.)35 b(It)22 b(returns)g Fs(true)e Ft(if)j(the)f(tok)n(en)g(w)n(as)f(a)h(legal)f(nonnegativ)n(e) g(in)n(teger)g(\(i.e.,)j(consisted)d(of)i(one)e(or)h(more)f(digits\).) -290 2835 y Fm(17b)181 b Fl(h)p Fk(Pr)l(o)l(c)l(e)l(dur)l(es)30 b(and)e(functions)g(for)g(input)g(sc)l(anning)g Fm(10c)p Fl(i)q Ft(+)p Fq(\021)1815 b Fm(\(4\))48 b Ff(/)12 b Fm(17a)83 2926 y Fj(static)41 b(bool)f(scan_nonneg_integer)j (\(Bibreader)f(rdr,)e(unsigned)h(*np\))f({)161 3018 y(unsigned)i(char)e (*p)f(=)h(rdr->cur;)161 3109 y(unsigned)i(n)d(=)g(0;)161 3200 y(*rdr->lim)j(=)d(')h(';)118 b(/*)39 b(sentinel)j(*/)161 3291 y(while)f(\(isdigit\(*p\)\))h({)240 3383 y(n)d(=)h(n)f(*)h(10)f(+) h(\(*p)g(-)f('0'\);)240 3474 y(p++;)161 3565 y(})161 3657 y(if)h(\(p)g(==)g(rdr->cur\))240 3748 y(return)h(0;)e(/*)h(no)g (digits)g(*/)161 3839 y(else)h({)240 3931 y(rdr->cur)g(=)e(p;)240 4022 y(*np)h(=)f(n;)240 4113 y(return)i(1;)161 4205 y(})83 4296 y(})1908 5400 y Ft(17)p eop end %%Page: 18 18 TeXDict begin 18 17 bop 125 83 a Ft(This)38 b(pro)r(cedure)f(scans)g (for)g(an)h(in)n(teger,)i(stopping)d(at)h(the)g(\014rst)g(nondigit;)43 b(it)c(sets)f(the)g(v)-5 b(alue)38 b(of)g Fs(token)p 3658 83 27 4 v 29 w(value)0 183 y Ft(accordingly)-7 b(.)70 b(It)39 b(returns)g Fs(true)e Ft(if)j(the)g(tok)n(en)e(w)n(as)g(a)h (legal)f(in)n(teger)h(\(i.e.,)j(consisted)d(of)g(an)g(optional)f Fs(minus)p 3701 183 V 30 w(sign)0 282 y Ft(follo)n(w)n(ed)27 b(b)n(y)g(one)g(or)g(more)g(digits\).)-286 399 y Fm(18a)181 b Fl(h)p Fk(unuse)l(d)29 b(Pr)l(o)l(c)l(e)l(dur)l(es)h(and)e(functions) g(for)g(input)g(sc)l(anning)g Fm(18a)p Fl(i)q Fq(\021)83 490 y Fj(static)41 b(bool)f(scan_integer)i(\(Bibreader)f(rdr\))f({)161 581 y(unsigned)i(char)e(*p)f(=)h(rdr->cur;)161 672 y(int)g(n)g(=)f(0;) 161 764 y(int)h(sign)h(=)e(0;)236 b(/*)39 b(number)i(of)f(characters)h (of)f(sign)g(*/)161 855 y(*rdr->lim)i(=)d(')h(';)118 b(/*)39 b(sentinel)j(*/)161 946 y(if)e(\(*p)g(==)g('-'\))g({)240 1038 y(sign)g(=)g(1;)240 1129 y(p++;)161 1220 y(})161 1312 y(while)h(\(isdigit\(*p\)\))h({)240 1403 y(n)d(=)h(n)f(*)h(10)f(+) h(\(*p)g(-)f('0'\);)240 1494 y(p++;)161 1586 y(})161 1677 y(if)h(\(p)g(==)g(rdr->cur\))240 1768 y(return)h(0;)e(/*)h(no)g (digits)g(*/)161 1860 y(else)h({)240 1951 y(rdr->cur)g(=)e(p;)240 2042 y(return)i(1;)161 2134 y(})83 2225 y(})0 2482 y Fn(2.4)112 b(C)38 b(utilit)m(y)f(functions)-290 2669 y Fm(18b)181 b Fl(h)p Fk(function)28 b(de\014nitions)g Fm(8)p Fl(i)p Ft(+)p Fq(\021)2509 b Fm(\(4\))48 b Ff(/)12 b Fm(16b)48 b(18c)13 b Ff(.)83 2760 y Fj(static)41 b(void)f (lower_case\(unsigned)j(char)d(*p,)g(unsigned)h(char)g(*lim\))f({)161 2851 y(for)g(\(;)g(p)g(<)f(lim;)h(p++\))240 2943 y(*p)g(=)f (tolower\(*p\);)83 3034 y(})-282 3208 y Fm(18c)181 b Fl(h)p Fk(function)28 b(de\014nitions)g Fm(8)p Fl(i)p Ft(+)p Fq(\021)2505 b Fm(\(4\))48 b Ff(/)12 b Fm(18b)48 b(19a)13 b Ff(.)83 3300 y Fj(static)41 b(void)f (strip_leading_and_trailing_spa)q(ce\(lu)q(a_St)q(ate)46 b(*L\))39 b({)161 3391 y(const)i(char)f(*p;)161 3482 y(int)g(n;)161 3574 y(assert\(lua_isstring\(L,)45 b(-1\)\);)161 3665 y(p)40 b(=)f(lua_tostring\(L,)k(-1\);)161 3756 y(n)d(=)f (lua_strlen\(L,)k(-1\);)161 3848 y(if)d(\(n)g(>)f(0)h(&&)f (\(isspace\(*p\))j(||)e(isspace\(p[n-1]\)\)\))j({)240 3939 y(while\(n)e(>)e(0)h(&&)f(isspace\(*p\)\))318 4030 y(p++,)i(n--;)240 4122 y(while\(n)g(>)e(0)h(&&)f(isspace\(p[n-1]\)\)) 318 4213 y(n--;)240 4304 y(lua_pushlstring\(L,)k(p,)d(n\);)240 4396 y(lua_remove\(L,)i(-2\);)161 4487 y(})83 4578 y(})1908 5400 y Ft(18)p eop end %%Page: 19 19 TeXDict begin 19 18 bop 0 83 a Fn(2.5)112 b(Implemen)m(tations)39 b(of)f(the)f Fw(B)-5 b Fc(i)m(b)d Fw(T)1628 113 y(E)1683 83 y(X)38 b Fn(commands)0 236 y Ft(On)21 b(encoun)n(tering)e(an)i Fs(@)p Fp(identi\014er)p Ft(,)i(w)n(e)d(ask)g(if)h(the)h Fp(identi\014er)30 b Ft(stands)21 b(for)f(a)h(command)f(and)h(if)g(so,) h(return)e(that)h(command.)-286 352 y Fm(19a)181 b Fl(h)p Fk(function)28 b(de\014nitions)g Fm(8)p Fl(i)p Ft(+)p Fq(\021)2509 b Fm(\(4\))48 b Ff(/)12 b Fm(18c)48 b(19b)13 b Ff(.)83 444 y Fj(static)41 b(Command)f(find_command\(unsigned)k(char) d(*p,)e(unsigned)j(char)e(*lim\))g({)161 535 y(int)g(n)g(=)f(lim)h(-)g (p;)161 626 y(assert\(lim)i(>)d(p\);)83 718 y(#define)i(match\(S\))g (\(!strncmp\(S,)h(\(char)e(*\)p,)g(n\))g(&&)g(\(S\)[n])g(==)g('\\0'\)) 161 809 y(switch\(*p\))i({)240 900 y(case)e('c')g(:)f(if)h (\(match\("comment"\)\))83 b(return)40 b(do_comment;)81 b(else)40 b(break;)240 992 y(case)g('p')g(:)f(if)h (\(match\("preamble"\)\))k(return)c(do_preamble;)i(else)e(break;)240 1083 y(case)g('s')g(:)f(if)h(\(match\("string"\)\))122 b(return)40 b(do_string;)120 b(else)40 b(break;)161 1174 y(})161 1266 y(return)h(\(Command\)0;)83 1357 y(})125 1482 y Ft(The)22 b Fs(comment)e Ft(command)j(is)f(implemen)n(ted)i(for) e(SCRIBE)g(compatibilit)n(y)-7 b(.)35 b(It's)23 b(not)g(really)e (needed)i(b)r(ecause)g(B)l Fr(i)n(b)-7 b Ft(T)3792 1507 y(E)3838 1482 y(X)0 1581 y(treats)27 b(\(\015ushes\))h(ev)n(erything)e (not)i(within)g(an)g(en)n(try)f(as)f(a)i(commen)n(t)f(an)n(yw)n(a)n(y) -7 b(.)-290 1697 y Fm(19b)181 b Fl(h)p Fk(function)28 b(de\014nitions)g Fm(8)p Fl(i)p Ft(+)p Fq(\021)2513 b Fm(\(4\))48 b Ff(/)12 b Fm(19a)48 b(19c)13 b Ff(.)83 1789 y Fj(static)41 b(bool)f(do_comment\(Bibreader)k(rdr\))c({)161 1880 y(return)h(1;)83 1971 y(})125 2096 y Ft(The)33 b Fs(preamble)c Ft(command)k(lets)g(a)g(user)f(ha)n(v)n(e)g(T)1723 2114 y(E)1769 2096 y(X)h(stu\013)h(inserted)f(\(b)n(y)g(the)g(standard) f(st)n(yles,)i(at)e(least\))h(directly)0 2196 y(in)n(to)28 b(the)h Fs(.bbl)e Ft(\014le.)40 b(It)29 b(is)f(in)n(tended)h(primarily) f(for)g(allo)n(wing)f(T)2064 2213 y(E)2110 2196 y(X)i(macro)e (de\014nitions)i(used)g(within)g(the)g(bibliograph)n(y)0 2295 y(en)n(tries)e(\(for)g(b)r(etter)h(sorting,)f(for)g(example\).)37 b(One)27 b Fs(preamble)d Ft(command)j(p)r(er)h Fs(.bib)e Ft(\014le)i(should)f(su\016ce.)125 2395 y(A)d Fs(preamble)d Ft(command)j(has)g(either)g(braces)f(or)g(paren)n(theses)g(as)h(outer)g (delimiters.)35 b(Inside)25 b(is)f(the)g(pream)n(ble)g(string,)0 2494 y(whic)n(h)e(has)g(the)g(same)g(syn)n(tax)f(as)h(a)g(\014eld)g(v) -5 b(alue:)34 b(a)22 b(nonempt)n(y)g(list)h(of)f(\014eld)g(tok)n(ens)g (separated)f(b)n(y)g Fs(concat)p 3398 2494 27 4 v 29 w(char)p Ft(s.)34 b(There)0 2594 y(are)27 b(three)g(t)n(yp)r(es)h(of)f (\014eld)h(tok)n(ens|nonnegativ)n(e)d(n)n(um)n(b)r(ers,)i(macro)g (names,)g(and)g(delimited)i(strings.)125 2694 y(This)k(mo)r(dule)g(do)r (es)g(all)g(the)g(scanning)g(\(that's)g(not)g(sub)r(con)n(tracted\),)h (but)g(the)g Fs(.bib)p Ft(-sp)r(eci\014c)d(scanning)i(function)0 2793 y Fs(scan)p 181 2793 V 30 w(and)p 343 2793 V 30 w(push)p 549 2793 V 30 w(the)p 711 2793 V 30 w(field)p 961 2793 V 29 w(value)p 1210 2793 V 29 w(and)p 1371 2793 V 31 w(eat)p 1534 2793 V 30 w(white)25 b Ft(actually)i(stores)g(the)h (v)-5 b(alue.)-282 2910 y Fm(19c)181 b Fl(h)p Fk(function)28 b(de\014nitions)g Fm(8)p Fl(i)p Ft(+)p Fq(\021)2505 b Fm(\(4\))48 b Ff(/)12 b Fm(19b)48 b(20a)13 b Ff(.)83 3001 y Fj(static)41 b(bool)f(do_preamble\(Bibreader)k(rdr\))c({)161 3092 y(ready_tok\(rdr\);)161 3184 y Fl(h)p Fk(sc)l(an)29 b(p)l(ast)g(op)l(ening)f(delimiter)f(and)h(set)h Fj(rdr->entry)p 1793 3184 24 4 v 30 w(close)g Fm(9c)p Fl(i)161 3275 y Fj(ready_tok\(rdr\);)161 3366 y(lua_rawgeti\(rdr->L,)44 b(LUA_REGISTRYINDEX,)f(rdr->preamble\);)161 3458 y (lua_pushnumber\(rdr->L,)i(lua_objlen\(rdr->L,)e(-1\))d(+)f(1\);)161 3549 y(if)h(\(!scan_and_push_the_field_va)q(lue\(r)q(dr,)46 b(0\)\))240 3640 y(return)41 b(0;)161 3731 y(ready_tok\(rdr\);)161 3823 y(if)f(\(*rdr->cur)i(!=)d(rdr->entry_close\))240 3914 y(LERRFB\("Missing)k('\045c')d(in)f(preamble)i(command",)h (rdr->entry_close\);)161 4005 y(rdr->cur++;)161 4097 y(lua_settable\(rdr->L,)i(-3\);)161 4188 y(lua_pop\(rdr->L,)f(1\);)d (/*)g(remove)g(preamble)h(*/)161 4279 y(return)g(1;)83 4371 y(})1908 5400 y Ft(19)p eop end %%Page: 20 20 TeXDict begin 20 19 bop 125 83 a Ft(The)21 b Fs(string)e Ft(command)i(is)g(implemen)n(ted)i(b)r(oth)e(for)g(SCRIBE)g (compatibilit)n(y)h(and)f(for)g(allo)n(wing)f(a)h(user:)33 b(to)21 b(o)n(v)n(erride)0 183 y(a)h Fs(.bst)p Ft(-\014le)f Fs(macro)g Ft(command,)i(to)g(de\014ne)g(one)f(that)i(the)f Fs(.bst)e Ft(\014le)i(do)r(esn't,)h(or)e(to)g(engage)f(in)i(go)r(o)r (d,)h(wholesome,)e(t)n(yping)0 282 y(laziness.)125 382 y(The)33 b Fs(string)e Ft(command)i(do)r(es)g(mostly)g(the)h(same)e (thing)i(as)f(the)g Fs(.bst)p Ft(-\014le's)f Fs(macro)f Ft(command)i(\(but)h(the)g(syn)n(tax)0 482 y(is)i(di\013eren)n(t)h(and) g(the)f Fs(string)f Ft(command)h(compresses)f(white)i(space\).)63 b(In)37 b(fact,)i(later)d(in)g(this)h(program,)g(the)g(term)0 581 y(\\macro")24 b(refers)i(to)h(either)f(a)h Fs(.bst)e Ft(\\macro")f(or)i(a)g Fs(.bib)f Ft(\\string")g(\(when)j(it's)e(clear)g (from)g(the)i(con)n(text)e(that)h(it's)g(not)f(a)0 681 y Fs(WEB)g Ft(macro\).)125 780 y(A)36 b Fs(string)d Ft(command)j(has)g (either)f(braces)g(or)g(paren)n(theses)g(as)g(outer)h(delimiters.)62 b(Inside)36 b(is)g(the)g(string's)f(name)0 880 y(\(it)29 b(m)n(ust)f(b)r(e)h(a)f(legal)g(iden)n(ti\014er,)g(and)g(case)g (di\013erences)g(are)f(ignored|all)g(upp)r(er-case)g(letters)h(are)g (con)n(v)n(erted)e(to)j(lo)n(w)n(er)0 980 y(case\),)23 b(then)f(an)g(equals)f(sign,)i(and)f(the)h(string's)e(de\014nition,)i (whic)n(h)f(has)g(the)g(same)g(syn)n(tax)f(as)h(a)f(\014eld)i(v)-5 b(alue:)34 b(a)21 b(nonempt)n(y)0 1079 y(list)27 b(of)g(\014eld)f(tok)n (ens)g(separated)g(b)n(y)g Fs(concat)p 1425 1079 27 4 v 29 w(char)p Ft(s.)35 b(There)26 b(are)f(three)i(t)n(yp)r(es)g(of)f (\014eld)h(tok)n(ens|nonnegativ)n(e)e(n)n(um)n(b)r(ers,)0 1179 y(macro)h(names,)h(and)h(delimited)g(strings.)-286 1295 y Fm(20a)181 b Fl(h)p Fk(function)28 b(de\014nitions)g Fm(8)p Fl(i)p Ft(+)p Fq(\021)2509 b Fm(\(4\))48 b Ff(/)12 b Fm(19c)48 b(20b)13 b Ff(.)83 1386 y Fj(static)41 b(bool)f (do_string\(Bibreader)j(rdr\))d({)161 1478 y(unsigned)i(char)e(*id;)161 1569 y(int)g(keyindex;)161 1660 y(ready_tok\(rdr\);)161 1752 y Fl(h)p Fk(sc)l(an)29 b(p)l(ast)g(op)l(ening)f(delimiter)f(and)h (set)h Fj(rdr->entry)p 1793 1752 24 4 v 30 w(close)g Fm(9c)p Fl(i)161 1843 y Fj(ready_tok\(rdr\);)161 1934 y(id)40 b(=)g(rdr->cur;)161 2026 y(if)g(\(!scan_identifier\(rdr,)k ('=',)d('=',)f('='\)\))240 2117 y(LERRB\("Expected)j(a)c(string)i(name) f(followed)h(by)e('='"\);)161 2208 y(lower_case\(id,)k(rdr->cur\);)161 2300 y(lua_pushlstring\(rdr->L,)i(\(char)40 b(*\)id,)h(rdr->cur)g(-)e (id\);)161 2391 y(keyindex)j(=)d(lua_gettop\(rdr->L\);)161 2482 y(ready_tok\(rdr\);)161 2574 y(if)h(\(*rdr->cur)i(!=)d('='\))240 2665 y(LERRB\("Expected)k(a)c(string)i(name)f(followed)h(by)e('='"\);) 161 2756 y(rdr->cur++;)161 2848 y(ready_tok\(rdr\);)161 2939 y(if)h(\(!scan_and_push_the_field_va)q(lue\(r)q(dr,)46 b(keyindex\)\))240 3030 y(return)41 b(0;)161 3122 y(ready_tok\(rdr\);) 161 3213 y(if)f(\(*rdr->cur)i(!=)d(rdr->entry_close\))240 3304 y(LERRFB\("Missing)k('\045c')d(in)f(macro)i(definition",)h (rdr->entry_close\);)161 3396 y(rdr->cur++;)161 3487 y(lua_getref\(rdr->L,)i(rdr->macros\);)161 3578 y(lua_insert\(rdr->L,)g (-3\);)161 3670 y(lua_settable\(rdr->L,)g(-3\);)161 3761 y(lua_pop\(rdr->L,)f(1\);)161 3852 y(return)e(1;)83 3944 y(})0 4201 y Fn(2.6)112 b(In)m(terface)38 b(to)f(Lua)0 4354 y Ft(First,)28 b(w)n(e)f(de\014ne)h(Lua)f(access)f(to)i(a)f (reader.)-290 4470 y Fm(20b)181 b Fl(h)p Fk(function)28 b(de\014nitions)g Fm(8)p Fl(i)p Ft(+)p Fq(\021)2509 b Fm(\(4\))48 b Ff(/)12 b Fm(20a)48 b(21a)13 b Ff(.)83 4562 y Fj(static)41 b(Bibreader)g(checkreader\(lua_State)j(*L,)c(int)g (index\))g({)161 4653 y(return)h(luaL_checkudata\(L,)i(index,)e ("bibtex.reader"\);)83 4744 y(})1908 5400 y Ft(20)p eop end %%Page: 21 21 TeXDict begin 21 20 bop 125 83 a Ft(The)22 b(reader's)p 600 83 27 4 v 631 83 V 83 w Fs(index)f Ft(metametho)r(d)i(pro)n(vides)d (access)i(to)g(the)h Fs(entry)p 2397 83 V 29 w(line)e Ft(and)h Fs(preamble)d Ft(v)-5 b(alues)22 b(as)g(if)g(they)h(w)n(ere)0 183 y(\014elds)28 b(of)f(the)h(Lua)f(table.)37 b(It)28 b(also)f(pro)n(vides)f(access)g(to)i(the)g Fs(next)e Ft(and)h Fs(close)f Ft(metho)r(ds)i(of)f(the)h(reader)e(ob)5 b(ject.)-286 299 y Fm(21a)181 b Fl(h)p Fk(function)28 b(de\014nitions)g Fm(8)p Fl(i)p Ft(+)p Fq(\021)2505 b Fm(\(4\))48 b Ff(/)12 b Fm(20b)48 b(22a)13 b Ff(.)83 390 y Fj(static)41 b(int)f(reader_meta_index\(lua_State)45 b(*L\))40 b({)161 482 y(Bibreader)i(rdr)e(=)f(checkreader\(L,)k(1\);) 161 573 y(const)e(char)f(*key;)161 664 y(if)g(\(!lua_isstring\(L,)j (2\)\))240 756 y(return)e(0;)161 847 y(key)f(=)g(lua_tostring\(L,)i (2\);)161 938 y(if)e(\(!strcmp\(key,)i("next"\)\))240 1029 y(lua_pushcfunction\(L,)i(next_entry\);)161 1121 y(else)d(if)e(\(!strcmp\(key,)j("entry_line"\)\))240 1212 y(lua_pushnumber\(L,)h(rdr->entry_line\);)161 1303 y(else)e(if)e(\(!strcmp\(key,)j("preamble"\)\))240 1395 y(lua_rawgeti\(L,)g(LUA_REGISTRYINDEX,)i(rdr->preamble\);)161 1486 y(else)d(if)e(\(!strcmp\(key,)j("close"\)\))240 1577 y(lua_pushcfunction\(L,)i(closereader\);)161 1669 y(else)240 1760 y(lua_pushnil\(L\);)161 1851 y(return)d(1;)83 1943 y(})125 2067 y Ft(Here)27 b(are)f(the)i(functions)g(exp)r(orted)f (in)h(the)g Fs(bibtex)d Ft(mo)r(dule:)-290 2183 y Fm(21b)181 b Fl(h)p Fk(function)28 b(pr)l(ototyp)l(es)i Fm(5c)p Fl(i)q Ft(+)o Fq(\021)2724 b Fm(\(4\))48 b Ff(/)12 b Fm(7a)83 2275 y Fj(static)41 b(int)f(openreader\(lua_State)j(*L\);)83 2366 y(static)e(int)f(next_entry\(lua_State)j(*L\);)83 2457 y(static)e(int)f(closereader\(lua_State)k(*L\);)-282 2615 y Fm(21c)181 b Fl(h)p Fk(initialize)l(d)27 b(and)h(uninitialize)l (d)f(data)h Fm(5b)p Fl(i)q Ft(+)o Fq(\021)2272 b Fm(\(4\))48 b Ff(/)13 b Fm(5b)83 2707 y Fj(static)41 b(const)f(struct)h(luaL_reg)g (bibtexlib)g([])f(=)f({)161 2798 y({"open",)j(openreader},)161 2889 y({"close",)g(closereader},)161 2980 y({"next",)g(next_entry},)161 3072 y({NULL,)f(NULL})83 3163 y(};)1908 5400 y Ft(21)p eop end %%Page: 22 22 TeXDict begin 22 21 bop 125 83 a Ft(T)-7 b(o)27 b(create)f(a)i(reader,) e(w)n(e)h(call)208 249 y Fs(openreader\()p Fp(\014lename)6 b Ft(,)23 b([)p Fp(macr)l(o-table)6 b Ft(,)29 b([)p Fp(warn-function)6 b Ft(]]\))125 415 y(The)27 b(w)n(arning)f(function)j(will)e(b)r(e)h (called)g(in)f(one)h(of)f(the)h(follo)n(wing)f(w)n(a)n(ys:)125 581 y Fq(\017)41 b Ft(w)n(arn\()p Fs("extra)f(field")p Ft(,)25 b Fp(\014le)p Ft(,)j Fp(line)p Ft(,)g Fp(citation-key)p Ft(,)h Fp(\014eld-name)p Ft(,)f Fp(\014eld-value)6 b Ft(\))208 714 y(Duplicate)28 b(de\014nition)g(of)f(a)g(\014eld)h(in)g (a)f(single)g(en)n(try)-7 b(.)125 880 y Fq(\017)41 b Ft(w)n(arn\()p Fs("undefined)d(macro")p Ft(,)25 b Fp(\014le)p Ft(,)j Fp(line)p Ft(,)g Fp(citation-key)p Ft(,)h Fp(macr)l(o-name)6 b Ft(\))208 1013 y(Use)27 b(of)h(an)f(unde\014ned)h(macro.)-286 1171 y Fm(22a)181 b Fl(h)p Fk(function)28 b(de\014nitions)g Fm(8)p Fl(i)p Ft(+)p Fq(\021)2509 b Fm(\(4\))48 b Ff(/)12 b Fm(21a)48 b(23a)13 b Ff(.)83 1262 y Fj(#define)41 b(INBUF)f(128)79 b(/*)40 b(initial)h(size)f(of)g(input)g(buffer)h(*/)83 1353 y(/*)f(filename)h(*)e(macro)i(table)f(*)f(warning)i(function)g(->) f(reader)h(*/)83 1445 y(static)g(int)f(openreader\(lua_State)j(*L\))d ({)161 1536 y(const)h(char)f(*filename)h(=)f(luaL_checkstring\(L,)j (1\);)161 1627 y(FILE)e(*f)e(=)h(fopen\(filename,)i("r"\);)161 1719 y(Bibreader)g(rdr;)161 1810 y(if)e(\(!f\))g({)240 1901 y(lua_pushnil\(L\);)240 1993 y(lua_pushfstring\(L,)j("Could)e(not) f(open)g(file)g('\045s'",)h(filename\);)240 2084 y(return)g(2;)161 2175 y(})161 2358 y Fl(h)p Fk(set)29 b(items)f(2)f(and)h(3)g(on)g (stack)h(to)f(hold)g(macr)l(o)g(table)g(and)g(optional)g(warning)g (function)g Fm(22b)p Fl(i)161 2540 y Fj(rdr)40 b(=)g (lua_newuserdata\(L,)j(sizeof\(*rdr\)\);)161 2632 y (luaL_getmetatable\(L,)h("bibtex.reader"\);)161 2723 y(lua_setmetatable\(L,)g(-2\);)161 2906 y(rdr->line_num)f(=)c(0;)161 2997 y(rdr->buf)j(=)d(rdr->cur)i(=)e(rdr->lim)j(=)d(malloc\(INBUF\);) 161 3088 y(rdr->bufsize)j(=)e(INBUF;)161 3180 y(rdr->file)i(=)d(f;)161 3271 y(rdr->filename)k(=)c(malloc\(lua_strlen\(L,)44 b(1\)+1\);)161 3362 y(assert\(rdr->filename\);)161 3454 y(strncpy\(\(char)f(*\)rdr->filename,)g(filename,)e(lua_strlen\(L,)h (1\)+1\);)161 3545 y(rdr->L)f(=)f(L;)161 3636 y(lua_newtable\(L\);)161 3728 y(rdr->preamble)j(=)c(luaL_ref\(L,)j(LUA_REGISTRYINDEX\);)161 3819 y(lua_pushvalue\(L,)h(2\);)161 3910 y(rdr->macros)f(=)e (luaL_ref\(L,)h(LUA_REGISTRYINDEX\);)161 4002 y(lua_pushvalue\(L,)i (3\);)161 4093 y(rdr->warning)f(=)e(luaL_ref\(L,)i (LUA_REGISTRYINDEX\);)161 4184 y(return)f(1;)83 4276 y(})-290 4450 y Fm(22b)181 b Fl(h)p Fk(set)28 b(items)g(2)g(and)g(3)g (on)f(stack)i(to)g(hold)e(macr)l(o)h(table)h(and)f(optional)g(warning)g (function)g Fm(22b)p Fl(i)p Fq(\021)880 b Fm(\(22a\))83 4541 y Fj(if)40 b(\(lua_type\(L,)i(2\))d(==)h(LUA_TNONE\))161 4633 y(lua_newtable\(L\);)83 4815 y(if)g(\(lua_type\(L,)i(3\))d(==)h (LUA_TNONE\))161 4907 y(lua_pushnil\(L\);)83 4998 y(else)g(if)g (\(!lua_isfunction\(L,)j(3\)\))161 5089 y(luaL_error\(L,)g("Warning)e (value)f(to)g(bibtex.open)h(is)f(not)g(a)g(function"\);)1908 5400 y Ft(22)p eop end %%Page: 23 23 TeXDict begin 23 22 bop 28 83 a Ft(Reader)28 b(metho)r(d)h Fs(next)p 796 83 27 4 v 29 w(entry)e Ft(tak)n(es)g(no)h(parameters.)37 b(On)28 b(success)g(it)h(returns)e(a)h(triple)g(\()p Fp(typ)l(e)p Ft(,)i Fp(key)p Ft(,)f Fp(\014eld-table)6 b Ft(\).)40 b(On)0 183 y(error)26 b(it)i(returns)f(\()p Fs(false)p Ft(,)e Fp(message)6 b Ft(\).)39 b(On)27 b(end)h(of)g(\014le) f(it)h(returns)f(nothing.)-286 299 y Fm(23a)181 b Fl(h)p Fk(function)28 b(de\014nitions)g Fm(8)p Fl(i)p Ft(+)p Fq(\021)2505 b Fm(\(4\))48 b Ff(/)12 b Fm(22a)48 b(23b)13 b Ff(.)83 390 y Fj(static)41 b(int)f(next_entry\(lua_State)j(*L\))d({) 161 482 y(Bibreader)i(rdr)e(=)f(checkreader\(L,)k(1\);)161 573 y(if)d(\(!rdr->file\))240 664 y(luaL_error\(L,)i("Tried)f(to)e (read)i(from)f(closed)g(bibtex.reader"\);)161 756 y(return)h (get_bib_command_or_entry_and_)q(proc)q(ess\(r)q(dr\);)83 847 y(})125 971 y Ft(Closing)26 b(a)h(reader)g(reco)n(v)n(ers)d(its)k (resources;)e(the)i Fs(file)e Ft(\014eld)i(of)f(a)g(closed)g(reader)f (is)i Fs(NULL)p Ft(.)-290 1088 y Fm(23b)181 b Fl(h)p Fk(function)28 b(de\014nitions)g Fm(8)p Fl(i)p Ft(+)p Fq(\021)2509 b Fm(\(4\))48 b Ff(/)12 b Fm(23a)48 b(24a)13 b Ff(.)83 1179 y Fj(static)41 b(int)f(closereader\(lua_State)k(*L\))39 b({)161 1270 y(Bibreader)j(rdr)e(=)f(checkreader\(L,)k(1\);)161 1362 y(if)d(\(!rdr->file\))240 1453 y(luaL_error\(L,)i("Tried)f(to)e (close)i(closed)f(bibtex.reader"\);)161 1544 y(fclose\(rdr->file\);)161 1636 y(rdr->file)i(=)d(NULL;)161 1727 y(free\(rdr->buf\);)161 1818 y(rdr->buf)j(=)d(rdr->cur)i(=)e(rdr->lim)j(=)d(NULL;)161 1910 y(rdr->bufsize)j(=)e(0;)161 2001 y (free\(\(void*\)rdr->filename\);)161 2092 y(rdr->filename)j(=)c(NULL;) 161 2183 y(rdr->L)i(=)f(NULL;)161 2275 y(luaL_unref\(L,)j (LUA_REGISTRYINDEX,)g(rdr->preamble\);)161 2366 y(rdr->preamble)g(=)c (0;)161 2457 y(luaL_unref\(L,)k(LUA_REGISTRYINDEX,)g(rdr->warning\);) 161 2549 y(rdr->warning)f(=)e(0;)161 2640 y(luaL_unref\(L,)j (LUA_REGISTRYINDEX,)g(rdr->macros\);)161 2731 y(rdr->macros)f(=)e(0;) 161 2823 y(return)h(0;)83 2914 y(})1908 5400 y Ft(23)p eop end %%Page: 24 24 TeXDict begin 24 23 bop 125 83 a Ft(T)-7 b(o)28 b(help)g(implemen)n(t)h (the)g(call)f(to)g(the)h(w)n(arning)e(function,)i(w)n(e)f(ha)n(v)n(e)g Fs(warnv)p Ft(.)37 b(If)29 b(there)f(is)g(no)g(w)n(arning)f(function,)i (w)n(e)0 183 y(return)e(the)h(n)n(ubmer)f(of)h(nils)g(sp)r(eci\014ed)g (b)n(y)f Fs(nres)p Ft(.)-286 299 y Fm(24a)181 b Fl(h)p Fk(function)28 b(de\014nitions)g Fm(8)p Fl(i)p Ft(+)p Fq(\021)2501 b Fm(\(4\))48 b Ff(/)12 b Fm(23b)48 b(24b)13 b Ff(.)83 390 y Fj(static)41 b(void)f(warnv\(Bibreader)i(rdr,)f(int)e (nres,)i(const)f(char)g(*fmt,)h(...\))f({)161 482 y(const)h(char)f(*p;) 161 573 y(va_list)h(vl;)161 756 y(lua_rawgeti\(rdr->L,)j (LUA_REGISTRYINDEX,)f(rdr->warning\);)161 847 y(if)d (\(lua_isnil\(rdr->L,)j(-1\)\))e({)240 938 y(lua_pop\(rdr->L,)i(1\);) 240 1029 y(while)d(\(nres--)h(>)f(0\))318 1121 y (lua_pushnil\(rdr->L\);)161 1212 y(})g(else)g({)240 1303 y(va_start\(vl,)i(fmt\);)240 1395 y(for)e(\(p)g(=)f(fmt;)h(*p;)g(p++\)) 318 1486 y(switch)h(\(*p\))f({)397 1577 y(case)g('f':)g (lua_pushnumber\(rdr->L,)k(va_arg\(vl,)e(double\)\);)f(break;)397 1669 y(case)f('d':)g(lua_pushnumber\(rdr->L,)k(va_arg\(vl,)e(int\)\);)e (break;)397 1760 y(case)g('s':)g({)475 1851 y(const)h(char)f(*s)f(=)h (va_arg\(vl,)h(char)g(*\);)475 1943 y(if)f(\(s)g(==)f(NULL\))i (lua_pushnil\(rdr->L\);)475 2034 y(else)f(lua_pushstring\(rdr->L,)45 b(s\);)475 2125 y(break;)397 2217 y(})397 2308 y(default:)c (luaL_error\(rdr->L,)i("invalid)e(parameter)h(type)e(\045c",)g(*p\);) 318 2399 y(})240 2491 y(lua_call\(rdr->L,)j(p)c(-)h(fmt,)g(nres\);)240 2582 y(va_end\(vl\);)161 2673 y(})83 2765 y(})125 2889 y Ft(Here's)27 b(where)g(the)h(library)e(is)h(initialized.)38 b(This)27 b(is)h(the)g(only)f(exp)r(orted)g(function)h(in)g(the)g (whole)f(\014le.)-290 3005 y Fm(24b)181 b Fl(h)p Fk(function)28 b(de\014nitions)g Fm(8)p Fl(i)p Ft(+)p Fq(\021)2709 b Fm(\(4\))48 b Ff(/)12 b Fm(24a)83 3097 y Fj(int)40 b(luaopen_bibtex)i (\(lua_State)g(*L\))e({)161 3188 y(luaL_newmetatable\(L,)k ("bibtex.reader"\);)161 3279 y(lua_pushstring\(L,)g("__index"\);)161 3371 y(lua_pushcfunction\(L,)g(reader_meta_index\);)83 b(/*)40 b(pushes)g(the)g(index)h(method)f(*/)161 3462 y(lua_settable\(L,)j(-3\);)79 b(/*)40 b(metatable.__index)j(=)d (metatable)h(*/)161 3645 y(luaL_register\(L,)i("bibtex",)f (bibtexlib\);)161 3736 y Fl(h)p Fk(initialize)27 b(the)h Fj(is)p 717 3736 24 4 v 29 w(id)p 824 3736 V 29 w(char)g Fk(table)g Fm(25)p Fl(i)161 3827 y Fj(return)41 b(1;)83 3919 y(})1908 5400 y Ft(24)p eop end %%Page: 25 25 TeXDict begin 25 24 bop 125 83 a Ft(In)27 b(an)h(iden)n(ti\014er,)f(w)n (e)g(can)h(accept)f(an)n(y)g(prin)n(ting)g(c)n(haracter)e(except)j(the) g(ones)f(listed)h(in)g(the)g Fs(nonids)d Ft(string.)-251 199 y Fm(25)181 b Fl(h)p Fk(initialize)26 b(the)j Fj(is)p 556 199 24 4 v 29 w(id)p 663 199 V 28 w(char)g Fk(table)f Fm(25)p Fl(i)p Fq(\021)2517 b Fm(\(24b\))83 291 y Fj({)161 382 y(unsigned)42 b(c;)161 473 y(static)f(unsigned)g(char)f(*nonids)h (=)f(\(unsigned)h(char)f(*\)"\\"#\045'\(\),={})i(\\t\\n\\f";)161 565 y(unsigned)g(char)e(*p;)161 747 y(for)g(\(c)g(=)g(0;)f(c)h(<=)f (0377;)i(c++\))240 839 y(is_id_char[c])h(=)e(1;)161 930 y(for)g(\(c)g(=)g(0;)f(c)h(<=)f(037;)h(c++\))240 1021 y(is_id_char[c])i(=)e(0;)161 1112 y(for)g(\(p)g(=)g(nonids;)g(*p;)g (p++\))240 1204 y(is_id_char[*p])i(=)e(0;)83 1295 y(})1908 5400 y Ft(25)p eop end %%Page: 26 26 TeXDict begin 26 25 bop 0 83 a Fn(2.7)112 b(Main)39 b(function)f(for)f (the)h(n)m(bib)g(commands)0 236 y Ft(This)28 b(co)r(de)f(will)h(is)f (the)h(standalone)f(main)g(function)i(for)e(all)g(the)h(n)n(bib)g (commands.)-251 352 y Fm(26)181 b Fl(h)p Fk(nbibtex.c)29 b Fm(26)p Fl(i)p Fq(\021)83 444 y Fj(#include)41 b()83 535 y(#include)g()83 718 y(#include)g()83 809 y(#include)g()83 900 y(#include)g()83 1083 y(extern)g(int)f(luaopen_bibtex\(lua_State)k(*L\);)83 1174 y(extern)d(int)f(luaopen_boyer_moore)j(\(lua_State)f(*L\);)83 1357 y(int)e(main)g(\(int)g(argc,)h(char)f(*argv[]\))h({)161 1448 y(int)f(i,)g(rc;)161 1540 y(lua_State)i(*L)d(=)h (luaL_newstate\(\);)161 1631 y(static)h(const)f(char*)h(files[])g(=)e ({)h(SHARE)g("/bibtex.lua",)82 b(SHARE)40 b("/natbib.nbs")i(};)161 1814 y(#define)f(OPEN\(N\))g(lua_pushcfunction\(L,)j(luaopen_)d(##)f (N\);)g(lua_call\(L,)h(0,)f(0\))161 1905 y(OPEN\(base\);)i (OPEN\(table\);)g(OPEN\(io\);)f(OPEN\(package\);)i(OPEN\(string\);)f (OPEN\(bibtex\);)161 1996 y(OPEN\(boyer_moore\);)161 2179 y(for)e(\(i)g(=)g(0;)f(i)h(<)f(sizeof\(files\)/sizeof\(files[0])q (\);)45 b(i++\))c({)240 2270 y(if)f(\(luaL_dofile\(L,)i(files[i]\)\))g ({)318 2362 y(fprintf\(stderr,)h("\045s:)d(error)h(loading)f (configuration)j(file)d(\045s\\n",)632 2453 y(argv[0],)h(files[i]\);) 318 2544 y(exit\(2\);)240 2636 y(})161 2727 y(})161 2818 y(lua_pushstring\(L,)j("bibtex"\);)161 2910 y(lua_gettable\(L,)f (LUA_GLOBALSINDEX\);)161 3001 y(lua_pushstring\(L,)h("main"\);)161 3092 y(lua_gettable\(L,)f(-2\);)161 3184 y(lua_newtable\(L\);)161 3275 y(for)d(\(i)g(=)g(0;)f(i)h(<)f(argc;)h(i++\))h({)240 3366 y(lua_pushnumber\(L,)i(i\);)240 3458 y(lua_pushstring\(L,)g (argv[i]\);)240 3549 y(lua_settable\(L,)g(-3\);)161 3640 y(})161 3731 y(rc)d(=)g(lua_pcall\(L,)i(1,)d(0,)h(0\);)161 3823 y(if)g(\(rc\))g({)240 3914 y(fprintf\(stderr,)j("Call)d(failed:)h (\045s\\n",)f(lua_tostring\(L,)j(-1\)\);)240 4005 y(lua_pop\(L,)e(1\);) 161 4097 y(})161 4188 y(lua_close\(L\);)161 4279 y(return)g(rc;)83 4371 y(})1908 5400 y Ft(26)p eop end %%Page: 27 27 TeXDict begin 27 26 bop 0 83 a Fv(3)135 b(Implemen)l(tation)47 b(of)57 b Fh(nbibtex)0 265 y Ft(F)-7 b(rom)24 b(here)f(out,)i(ev)n (erything)e(is)i(written)f(in)g(Lua)g(\()p Fs(http://www.lua.org)o Ft(\).)30 b(The)24 b(main)h(mo)r(dule)f(is)g Fs(bibtex)p Ft(,)f(and)h(st)n(yle-)0 364 y(\014le)34 b(supp)r(ort)f(is)h(in)g(the)g (submo)r(dule)g Fs(bibtex.bst)p Ft(.)51 b(Eac)n(h)33 b(has)g(a)g Fs(doc)g Ft(submo)r(dule,)i(whic)n(h)f(is)g(in)n(tended)g (as)f(mac)n(hine-)0 464 y(readable)26 b(do)r(cumen)n(tation.)-286 580 y Fm(27a)181 b Fl(h)p Fk(bibtex.lua)28 b Fm(27a)p Fl(i)q Fq(\021)3171 b Fm(27b)13 b Ff(.)83 672 y Fl(h)p Fk(if)26 b(not)j(alr)l(e)l(ady)f(pr)l(esent,)h(lo)l(ad)f(the)h(C)e(c)l (o)l(de)i(for)e(the)h Fj(bibtex)h Fk(mo)l(dule)f Fm(27c)p Fl(i)83 854 y Fj(local)40 b(config)h(=)e(config)i(or)f({)f(})h(---)g (may)f(be)h(defined)h(by)f(config)g(process)83 1037 y(local)g (workaround)i(=)d({)161 1128 y(badbibs)i(=)f(true,)79 b(---)40 b(don't)h(look)f(at)f(bad)h(.bib)g(files)h(that)f(come)g(with) g(teTeX)83 1220 y(})83 1311 y(local)g(bst)g(=)g({)f(})83 1402 y(bibtex.bst)j(=)d(bst)83 1585 y(bibtex.doc)j(=)d({)g(})83 1676 y(bibtex.bst.doc)j(=)e({)f(})83 1859 y(bibtex.doc.bst)j(=)e('#)g (table)g(of)g(functions)h(used)f(to)g(write)g(style)g(files')125 1983 y Ft(Not)26 b(m)n(uc)n(h)g(co)r(de)g(is)g(executed)h(during)e (startup,)i(so)e(the)i(main)f(issue)g(is)g(to)h(manage)e(declaration)g (b)r(efore)h(use.)36 b(I)26 b(ha)n(v)n(e)0 2083 y(a)37 b(few)i(forw)n(ard)d(declarations)g(in)i Fq(h)p Fp(de)l(clar)l(ations)j (of)f(internal)g(functions)f Fm(43c)p Fq(i)p Ft(;)44 b(otherwise,)c(coun)n(t)d(only)h(on)g(\\utilit)n(y")0 2183 y(functions)28 b(b)r(eing)g(declared)e(b)r(efore)i(\\exp)r(orted") e(ones.)-290 2299 y Fm(27b)181 b Fl(h)p Fk(bibtex.lua)28 b Fm(27a)p Fl(i)q Ft(+)o Fq(\021)3111 b Ff(/)12 b Fm(27a)83 2390 y Fj(local)40 b(find)h(=)e(string.find)83 2482 y Fl(h)p Fk(de)l(clar)l(ations)29 b(of)e(internal)i(functions)f Fm(43c)p Fl(i)83 2573 y(h)p Fk(Lua)g(utility)f(functions)i Fm(27d)p Fl(i)83 2664 y(h)p Fk(exp)l(orte)l(d)h(Lua)e(functions)g Fm(30c)p Fl(i)83 2756 y(h)p Fk(che)l(ck)h(c)l(onstant)h(values)e(for)f (c)l(onsistency)j Fm(68b)p Fl(i)83 2938 y Fj(return)41 b(bibtex)125 3063 y Ft(The)29 b(Lua)g(co)r(de)g(relies)f(on)h(the)h(C)f (co)r(de.)42 b(Ho)n(w)29 b(w)n(e)f(get)h(the)h(C)f(co)r(de)g(dep)r (ends)h(on)f(ho)n(w)h Fs(bibtex.lua)25 b Ft(is)k(used;)h(there)0 3162 y(are)d(t)n(w)n(o)f(alternativ)n(es:)125 3328 y Fq(\017)41 b Ft(In)22 b(the)i(distribution,)f Fs(bibtex.lua)c Ft(is)k(loaded)f(b)n(y)g(the)h(C)g(co)r(de)g(in)g(c)n(h)n(unk)f(26,)h (whic)n(h)g(de\014nes)f(the)h Fs(bibtex)e Ft(mo)r(dule.)125 3494 y Fq(\017)41 b Ft(F)-7 b(or)21 b(standalone)f(testing)i(purp)r (oses,)g Fs(bibtex.lua)c Ft(can)j(b)r(e)i(loaded)e(directly)g(in)n(to)h (an)f(in)n(teractiv)n(e)g(Lua)g(in)n(terpreter,)208 3594 y(in)27 b(whic)n(h)h(case)f(it)h(loads)e(the)i Fs(bibtex)e Ft(mo)r(dule)h(as)g(a)h(shared)e(library)-7 b(.)-282 3752 y Fm(27c)181 b Fl(h)p Fk(if)26 b(not)j(alr)l(e)l(ady)f(pr)l (esent,)h(lo)l(ad)f(the)h(C)e(c)l(o)l(de)i(for)e(the)h Fj(bibtex)h Fk(mo)l(dule)f Fm(27c)p Fl(i)q Fq(\021)1439 b Fm(\(27a\))83 3843 y Fj(if)40 b(not)g(bibtex)g(then)161 3934 y(require)h('nrlib')161 4026 y(nrlib.load)h('bibtex')83 4117 y(end)0 4391 y Fn(3.1)112 b(Error)37 b(handling,)i(w)m(arning)f (messages,)h(and)g(logging)-290 4536 y Fm(27d)181 b Fl(h)p Fk(Lua)28 b(utility)f(functions)i Fm(27d)p Fl(i)p Fq(\021)2588 b Fm(\(27b\))49 b(28a)13 b Ff(.)83 4627 y Fj(local)40 b(function)h(printf)g(\(...\))f(return)h (io.stdout:write\(string.format)q(\(...\))q(\))k(end)83 4719 y(local)40 b(function)h(eprintf\(...\))h(return)f (io.stderr:write\(string.format)q(\(...\))q(\))k(end)1908 5400 y Ft(27)p eop end %%Page: 28 28 TeXDict begin 28 27 bop 125 83 a Ft(I)27 b(ha)n(v)n(e)e(to)i(\014gure)g (out)g(what)g(to)g(do)f(ab)r(out)h(errors)e(|)i(the)h(curren)n(t)e(co)r (de)h(is)g(b)r(ogus.)36 b(Among)27 b(other)f(things,)h(I)g(should)0 183 y(b)r(e)h(setting)g(error)d(lev)n(els.)-286 299 y Fm(28a)181 b Fl(h)p Fk(Lua)28 b(utility)f(functions)i Fm(27d)p Fl(i)p Ft(+)p Fq(\021)2316 b Fm(\(27b\))48 b Ff(/)12 b Fm(27d)48 b(28b)13 b Ff(.)83 390 y Fj(local)40 b(function)h(bibwarnf)g(\(...\))g(eprintf\(...\);)h(eprintf\('\\n'\))g (end)83 482 y(local)e(function)h(biberrorf\(...\))i(eprintf\(...\);)f (eprintf\('\\n'\))g(end)83 573 y(local)e(function)h(bibfatalf\(...\))i (eprintf\(...\);)f(eprintf\('\\n'\);)g(os.exit\(2\))g(end)125 697 y Ft(Logging?)35 b(What)28 b(logging?)-290 814 y Fm(28b)181 b Fl(h)p Fk(Lua)28 b(utility)f(functions)i Fm(27d)p Fl(i)p Ft(+)p Fq(\021)2359 b Fm(\(27b\))48 b Ff(/)12 b Fm(28a)48 b(29)13 b Ff(.)83 905 y Fj(local)40 b(function)h(logf\(\))g(end)1908 5400 y Ft(28)p eop end %%Page: 29 29 TeXDict begin 29 28 bop 0 83 a Fu(3.1.1)94 b(Supp)s(ort)32 b(for)g(dela)m(y)m(ed)g(w)m(arnings)0 236 y Ft(Lik)n(e)c(classic)g(B)l Fr(i)n(b)-7 b Ft(T)603 261 y(E)649 236 y(X,)30 b(N)l Fr(bi)n(b)-7 b Ft(T)980 261 y(E)1026 236 y(X)30 b(t)n(ypically)e(w)n (arns)f(only)i(ab)r(out)f(en)n(tries)h(that)g(are)f(actually)g(used.)40 b(This)29 b(functionalit)n(y)0 336 y(is)34 b(implemen)n(ted)g(b)n(y)f (function)i Fs(hold)p 1221 336 27 4 v 29 w(warning)p Ft(,)e(whic)n(h)h(k)n(eeps)f(w)n(arnings)f(on)h(ice)h(un)n(til)g(they)g (are)e(either)i(returned)f(b)n(y)0 436 y Fs(held)p 181 436 V 30 w(warnings)f Ft(or)i(thro)n(wn)g(a)n(w)n(a)n(y)f(b)n(y)i Fs(drop)p 1509 436 V 30 w(warning)p Ft(.)57 b(The)35 b(function)h Fs(emit)p 2614 436 V 29 w(warning)d Ft(emits)i(a)g(w)n (arning)f(message)0 535 y(eagerly)29 b(when)i(called;)h(it)f(is)f(used) h(to)f(issue)g(w)n(arnings)f(ab)r(out)i(en)n(tries)f(w)n(e)g(actually)g (use,)h(or)f(if)h(the)g Fs(-strict)d Ft(option)i(is)0 635 y(giv)n(en,)d(to)g(issue)h(ev)n(ery)e(w)n(arning.)-251 751 y Fm(29)181 b Fl(h)p Fk(Lua)28 b(utility)f(functions)i Fm(27d)p Fl(i)p Ft(+)p Fq(\021)2320 b Fm(\(27b\))48 b Ff(/)12 b Fm(28b)48 b(30a)13 b Ff(.)83 842 y Fj(local)40 b(hold_warning)82 b(--)39 b(function)i(suitable)g(to)f(pass)g(to)g (bibtex.open;)i(holds)83 934 y(local)e(emit_warning)82 b(--)39 b(function)i(suitable)g(to)f(pass)g(to)g(bibtex.open;)i(prints) 83 1025 y(local)e(held_warnings)j(--)c(returns)i(nil)f(or)g(list)g(of)f (warnings)j(since)e(last)g(call)83 1116 y(local)g(drop_warnings)j(--)c (drops)i(warnings)83 1299 y(local)f(extra_ok)h(=)f({)f(reffrom)i(=)f (true)g(})201 1390 y(--)f(set)h(of)g(fields)h(about)f(which)g(we)g (should)h(not)e(warn)i(of)e(duplicates)83 1573 y(do)161 1664 y(local)i(warnfuns)g(=)e({)h(})161 1756 y(warnfuns["extra)j (field"])e(=)240 1847 y(function\(file,)h(line,)f(cite,)f(field,)h (newvalue\))318 1938 y(if)f(not)g(extra_ok[field])j(then)397 2030 y(bibwarnf\("Warning--I'm)h(ignoring)d(\045s's)f(extra)h (\\"\045s\\")f(field\\n--line)i(\045d)e(of)g(file)g(\045s\\n",)750 2121 y(cite,)g(field,)h(line,)f(file\))318 2212 y(end)240 2304 y(end)161 2486 y(warnfuns["undefined)k(macro"])d(=)240 2577 y(function\(file,)h(line,)f(cite,)f(macro\))318 2669 y(bibwarnf\("Warning--string)45 b(name)40 b(\\"\045s\\")h(is)f (undefined\\n--line)j(\045d)c(of)h(file)g(\045s\\n",)671 2760 y(macro,)h(line,)f(file\))240 2851 y(end)161 3034 y(function)i(emit_warning\(tag,)h(...\))240 3125 y(return)e (assert\(warnfuns[tag]\)\(...\))161 3217 y(end)161 3399 y(local)g(held)161 3491 y(function)h(hold_warning\(...\))240 3582 y(held)e(=)g(held)g(or)f({)h(})240 3673 y(table.insert\(held,)j({) d(...)g(}\))161 3765 y(end)161 3856 y(function)i(held_warnings\(\))240 3947 y(local)e(h)g(=)f(held)240 4039 y(held)h(=)g(nil)240 4130 y(return)h(h)161 4221 y(end)161 4313 y(function)h (drop_warnings\(\))240 4404 y(held)e(=)g(nil)161 4495 y(end)83 4587 y(end)1908 5400 y Ft(29)p eop end %%Page: 30 30 TeXDict begin 30 29 bop 0 83 a Fn(3.2)112 b(Miscellan)m(y)0 236 y Ft(All)28 b(this)g(stu\013)g(is)g(dubious.)-286 352 y Fm(30a)181 b Fl(h)p Fk(Lua)28 b(utility)f(functions)i Fm(27d)p Fl(i)p Ft(+)p Fq(\021)2355 b Fm(\(27b\))49 b Ff(/)12 b Fm(29)47 b(30b)13 b Ff(.)83 444 y Fj(function)41 b(table.copy\(t\))161 535 y(local)g(u)e(=)h({)f(})161 626 y(for)h(k,)g(v)g(in)f(pairs\(t\))i(do)f(u[k])g(=)g(v)f(end)161 718 y(return)i(u)83 809 y(end)-290 967 y Fm(30b)181 b Fl(h)p Fk(Lua)28 b(utility)f(functions)i Fm(27d)p Fl(i)p Ft(+)p Fq(\021)2320 b Fm(\(27b\))48 b Ff(/)12 b Fm(30a)48 b(33b)13 b Ff(.)83 1058 y Fj(local)40 b(function)h(open\(f,)g(m,)f (what\))161 1150 y(local)h(f,)f(msg)f(=)h(io.open\(f,)h(m\))161 1241 y(if)f(f)g(then)240 1332 y(return)h(f)161 1423 y(else)240 1515 y(\(what)f(or)g(bibfatalf\)\('Could)j(not)d(open)g(file)g(\045s:)g (\045s',)g(f,)g(msg\))161 1606 y(end)83 1697 y(end)-282 1872 y Fm(30c)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Fq(\021)2518 b Fm(\(27b\))49 b(31a)13 b Ff(.)83 1963 y Fj(local)40 b(function)h(entries\(rdr,)h(empty\))161 2054 y(assert\(not)g(empty\))161 2146 y(return)f(function\(\))h(return) e(rdr:next\(\))i(end)83 2237 y(end)83 2420 y(bibtex.entries)g(=)e (entries)83 2511 y(bibtex.doc.entries)j(=)d('reader)h(->)e(iterator)120 b(#)39 b(generate)i(entries')1908 5400 y Ft(30)p eop end %%Page: 31 31 TeXDict begin 31 30 bop 0 83 a Fn(3.3)112 b(In)m(ternal)38 b(do)s(cumen)m(tation)0 236 y Ft(W)-7 b(e)28 b(attempt)g(to)g(do)r (cumen)n(t)g(ev)n(erything!)-286 352 y Fm(31a)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2254 b Fm(\(27b\))49 b Ff(/)12 b Fm(30c)48 b(31b)13 b Ff(.)83 444 y Fj(function)41 b(bibtex:show_doc\(title\))161 535 y(local)g(out)f(=)f(bst.writer\(io.stdout,)44 b(5\))161 626 y(local)d(function)g(outf\(...\))g(return)g (out:write\(string.format\(...\)\))46 b(end)161 718 y(local)41 b(allkeys,)g(dkeys)f(=)g({)f(},)h({)f(})161 809 y(for)h(k,)g(_)g(in)f (pairs\(self\))199 b(do)40 b(table.insert\(allkeys,)k(k\))39 b(end)161 900 y(for)h(k,)g(_)g(in)f(pairs\(self.doc\))k(do)d (table.insert\(dkeys,)122 b(k\))39 b(end)161 992 y (table.sort\(allkeys\))161 1083 y(table.sort\(dkeys\))161 1174 y(for)h(i)g(=)f(1,)h(table.getn\(dkeys\))j(do)240 1266 y(outf\("\045s.\045-12s)f(:)e(\045s\\n",)g(title,)h(dkeys[i],)g (self.doc[dkeys[i]]\))161 1357 y(end)161 1448 y(local)g(header)161 1540 y(for)f(i)g(=)f(1,)h(table.getn\(allkeys\))k(do)240 1631 y(local)c(k)g(=)f(allkeys[i])240 1722 y(if)h(k)f(~=)h("doc")g(and) g(k)f(~=)h("show_doc")i(and)e(not)f(self.doc[k])j(then)318 1814 y(if)e(not)g(header)h(then)397 1905 y(outf\('Undocumented)i(keys)d (in)g(table)g(\045s:',)h(title\))397 1996 y(header)f(=)g(true)318 2088 y(end)318 2179 y(outf\(')h(\045s',)f(k\))240 2270 y(end)161 2362 y(end)161 2453 y(if)g(header)h(then)f(outf\('\\n'\))h (end)83 2544 y(end)83 2636 y(bibtex.bst.show_doc)j(=)39 b(bibtex.show_doc)28 2760 y Ft(Here)27 b(is)g(the)h(do)r(cumen)n (tation)g(for)f(what's)g(de\014ned)h(in)g(C)g(co)r(de:)-290 2876 y Fm(31b)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2258 b Fm(\(27b\))49 b Ff(/)12 b Fm(31a)48 b(31c)13 b Ff(.)83 2968 y Fj(bibtex.doc.open)82 b(=)39 b('filename)j(->)d(reader)i(#)e(open)h(a)g(reader)h(for)e(a)h (.bib)g(file')83 3059 y(bibtex.doc.close)j(=)c('reader)i(->)f(unit)197 b(#)39 b(close)i(open)f(reader')83 3150 y(bibtex.doc.next)82 b(=)39 b('reader)i(->)f(type)g(*)f(key)h(*)g(field)g(table)h(#)e(read)h (an)g(entry')0 3408 y Fn(3.4)112 b(Main)39 b(function)f(for)f Fb(nbibtex)0 3561 y Ft(Actually)-7 b(,)31 b(the)f(same)g(main)g (function)g(do)r(es)g(for)g(b)r(oth)g Fs(nbibtex)d Ft(and)j Fs(nbibfind)p Ft(;)e(dep)r(ending)j(on)e(ho)n(w)h(the)g(program)e(is)0 3661 y(called,)f(it)h(delegates)f(to)g Fs(bibtex.bibtex)c Ft(or)j Fs(bibtex.run)p 1939 3661 27 4 v 28 w(find)p Ft(.)-282 3777 y Fm(31c)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2286 b Fm(\(27b\))49 b Ff(/)12 b Fm(31b)47 b(32)13 b Ff(.)83 3868 y Fj(bibtex.doc.main)43 b(=)c('string)i(list)f(->)g(unit)g(#)f (main)h(program)h(that)f(dispatches)i(on)e(argv[0]')83 3959 y(function)h(bibtex.main\(argv\))161 4051 y(if)f(argv[1])h(==)f ('-doc')g(then)g(--)g(undocumented)i(internal)f(doco)240 4142 y(bibtex:show_doc\('bibtex'\))240 4233 y (bibtex.bst:show_doc\('bst'\))161 4325 y(elseif)g(find\(argv[0],)h ('bibfind$'\))g(then)240 4416 y(return)f(bibtex.run_find\(argv\))161 4507 y(elseif)g(find\(argv[0],)h('bibtex$'\))g(then)240 4599 y(return)f(bibtex.bibtex\(argv\))161 4690 y(else)240 4781 y(error\("Call)h(me)d(something)j(ending)e(in)g('bibtex')h(or)f ('bibfind';)h(when)f(called\\n)81 b("..)475 4873 y(argv[0]..",)42 b(I)d(don't)i(know)f(what)g(to)g(do"\))161 4964 y(end)83 5055 y(end)1908 5400 y Ft(31)p eop end %%Page: 32 32 TeXDict begin 32 31 bop -251 83 a Fm(32)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2254 b Fm(\(27b\))49 b Ff(/)12 b Fm(31c)48 b(44b)13 b Ff(.)83 174 y Fj(local)40 b(permissive)160 b(=)39 b(false)h(--)g(nbibtex)h(extension)g(\(ignore)g(missing)g(.bib)f (files,)h(etc.\))83 266 y(local)f(strict)316 b(=)39 b(false)h(--)g (complain)h(eagerly)g(about)f(errors)h(in)f(.bib)g(files)83 357 y(local)g(min_crossrefs)j(=)c(2)196 b(--)40 b(how)g(many)g (crossref's)i(required)f(to)e(add)h(an)g(entry?)83 448 y(local)g(output_name)121 b(=)39 b(nil)118 b(--)40 b(output)h(file)f (if)f(not)h(default)83 540 y(local)g(bib_out)277 b(=)39 b(false)h(--)g(output)h(.bib)f(format)83 722 y(bibtex.doc.bibtex)j(=)d ('string)g(list)h(->)e(unit)h(#)g(main)g(program)h(for)f(nbibtex')83 814 y(function)h(bibtex.bibtex\(argv\))161 905 y Fl(h)p Fk(set)29 b(bibtex)g(options)f(fr)l(om)g Fj(argv)g Fm(33a)p Fl(i)161 996 y Fj(if)40 b(table.getn\(argv\))j(<)c(1)h(then)240 1088 y(bibfatalf\('Usage:)j(\045s)d([-permissive|-strict|...])45 b(filename[.aux])d([bibfile...]',)632 1179 y(argv[0]\))161 1270 y(end)161 1362 y(local)f(auxname)g(=)e(table.remove\(argv,)k(1\)) 161 1453 y(local)e(basename)g(=)e(string.gsub\(string.gsub\(auxn)q (ame,)46 b('\045.aux$',)41 b(''\),)f('\045.$',)h(''\))161 1544 y(auxname)g(=)f(basename)h(..)e('.aux')161 1636 y(local)i(bblname)g(=)e(output_name)j(or)e(\(basename)h(..)e('.bbl'\)) 161 1727 y(local)i(blgname)g(=)e(basename)i(..)f(\(output_name)i(and)e ('.nlg')g(or)g('.blg'\))161 1818 y(local)h(blg)f(=)f(open\(blgname,)j ('w'\))161 2001 y(--)e(Here's)h(what)f(we)g(accumulate)h(by)f(reading)h (.aux)f(files:)161 2092 y(local)h(bibstyle)433 b(--)40 b(the)g(bibliography)i(style)161 2183 y(local)f(bibfiles)g(=)e({)h(}) 196 b(--)40 b(list)g(of)g(files)g(named)g(in)g(order)g(of)g(file)161 2275 y(local)h(citekeys)g(=)e({)h(})196 b(--)40 b(list)g(of)g(citation) h(keys)f(from)g(.aux)1142 2366 y(--)g(\(in)g(order)g(seen,)g(mixed)h (case,)f(no)g(duplicates\))161 2457 y(local)h(cited_star)g(=)f(false)g (--)g(.tex)g(contains)h(\\cite{*})g(or)f(\\nocite{*})161 2640 y Fl(h)p Fk(using)28 b(\014le)g Fj(auxname)p Fk(,)g(set)h Fj(bibstyle)p Fk(,)g Fj(citekeys)p Fk(,)f(and)g Fj(bibfiles)i Fm(34a)p Fl(i)161 2823 y Fj(if)40 b(table.getn\(argv\))j(>)c(0)h(then)g (--)g(override)h(the)f(bibfiles)h(listed)f(in)g(the)g(.aux)g(file)240 2914 y(bibfiles)h(=)e(argv)161 3005 y(end)161 3097 y Fl(h)p Fk(validate)29 b(c)l(ontents)g(of)f Fj(bibstyle)p Fk(,)g Fj(citekeys)p Fk(,)h(and)f Fj(bibfiles)h Fm(36a)p Fl(i)161 3188 y(h)p Fk(fr)l(om)f Fj(bibstyle)p Fk(,)g Fj(citekeys)p Fk(,)h(and)f Fj(bibfiles)p Fk(,)h(c)l(ompute)g(and)f (emit)f(the)i(list)e(of)g(entries)i Fm(36b)p Fl(i)161 3279 y Fj(blg:close\(\))83 3371 y(end)1908 5400 y Ft(32)p eop end %%Page: 33 33 TeXDict begin 33 32 bop 125 83 a Ft(Options)27 b(are)f(straigh)n(tforw) n(ard.)-286 199 y Fm(33a)181 b Fl(h)p Fk(set)28 b(bibtex)h(options)g (fr)l(om)e Fj(argv)h Fm(33a)p Fl(i)q Fq(\021)2573 b Fm(\(32\))83 291 y Fj(while)40 b(table.getn\(argv\))j(>)d(0)f(and)h(find\(argv[1],)i ('^\045-'\))f(do)161 382 y(if)f(argv[1])h(==)f('-terse')h(then)240 473 y(--)f(do)f(nothing)161 565 y(elseif)i(argv[1])g(==)f ('-permissive')i(then)240 656 y(permissive)f(=)f(true)161 747 y(elseif)h(argv[1])g(==)f('-strict')h(then)240 839 y(strict)g(=)e(true)161 930 y(elseif)i(argv[1])g(==)f('-min-crossrefs') i(and)e(find\(argv[2],)j('^\045d+$'\))e(then)240 1021 y(min_crossrefs)h(=)e(assert\(tonumber\(argv[2]\)\))240 1112 y(table.remove\(argv,)j(1\))161 1204 y(elseif)e (string.find\(argv[1],)j('^\045-min\045-crossrefs=\(\045d+\)$'\))h (then)240 1295 y(local)40 b(_,)g(_,)g(n)f(=)h(string.find\(argv[1],)j ('^\045-min\045-crossrefs=\(\045d+\)$'\))240 1386 y(min_crossrefs)f(=)e (assert\(tonumber\(n\)\))161 1478 y(elseif)h(string.find\(argv[1],)j ('^\045-min\045-crossrefs'\))g(then)240 1569 y(biberrorf\("Ill-formed)g (option)d(\045s",)f(argv[1]\))161 1660 y(elseif)h(argv[1])g(==)f('-o')g (then)240 1752 y(output_name)i(=)d(assert\(argv[2]\))240 1843 y(table.remove\(argv,)k(1\))161 1934 y(elseif)e(argv[1])g(==)f ('-bib')g(then)240 2026 y(bib_out)h(=)e(true)161 2117 y(elseif)i(argv[1])g(==)f('-help')g(then)240 2208 y(help\(\))161 2300 y(elseif)h(argv[1])g(==)f('-version')h(then)240 2391 y(printf\("nbibtex)i(version)d(0.9.18\\n"\))240 2482 y(os.exit\(0\))161 2574 y(else)240 2665 y(biberrorf\('Unknown)j (option)e(\045s',)f(argv[1]\))240 2756 y(help\(2\))161 2848 y(end)161 2939 y(table.remove\(argv,)k(1\))83 3030 y(end)-290 3188 y Fm(33b)181 b Fl(h)p Fk(Lua)28 b(utility)f(functions)i Fm(27d)p Fl(i)p Ft(+)p Fq(\021)2316 b Fm(\(27b\))48 b Ff(/)12 b Fm(30b)48 b(40b)13 b Ff(.)83 3279 y Fj(local)40 b(function)h(help\(code\))161 3371 y(printf\([[)83 3462 y(Usage:)g(nbibtex)f([OPTION]...)i(AUXFILE[.aux])g([BIBFILE...])161 3553 y(Write)f(bibliography)h(for)e(entries)h(in)e(AUXFILE)i(to)f (AUXFILE.bbl.)83 3736 y(Options:)161 3827 y(-bib)747 b(write)40 b(output)h(as)e(BibTeX)i(source)161 3919 y(-help)708 b(display)41 b(this)f(help)g(and)g(exit)161 4010 y(-o)g(FILE)629 b(write)40 b(output)h(to)e(FILE)h(\(-)g(for)g(stdout\))161 4101 y(-min-crossrefs=NUMBER)84 b(include)41 b(item)f(after)g(NUMBER)h (cross-refs;)g(default)g(2)161 4193 y(-permissive)474 b(allow)40 b(missing)h(bibfiles)g(and)f(\(some\))g(duplicate)i(entries) 161 4284 y(-strict)630 b(complain)41 b(about)f(any)g(ill-formed)i (entry)e(we)g(see)161 4375 y(-version)591 b(output)40 b(version)h(information)h(and)e(exit)83 4558 y(Home)g(page)g(at)g (http://www.eecs.harvard.edu/~)q(nr/nb)q(ibte)q(x.)83 4649 y(Email)g(bug)g(reports)h(to)f(nr@eecs.harvard.edu.)83 4741 y(]]\))161 4832 y(os.exit\(code)i(or)e(0\))83 4923 y(end)1908 5400 y Ft(33)p eop end %%Page: 34 34 TeXDict begin 34 33 bop 0 83 a Fn(3.5)112 b(Reading)39 b(all)f(the)f(aux)h(\014les)g(and)h(v)-6 b(alidating)39 b(the)e(inputs)0 236 y Ft(W)-7 b(e)28 b(pa)n(y)f(atten)n(tion)g(to)h (four)f(commands:)36 b Fs(\\@input)p Ft(,)25 b Fs(\\bibdata)p Ft(,)f Fs(\\bibstyle)p Ft(,)g(and)k Fs(\\citation)p Ft(.)-286 352 y Fm(34a)181 b Fl(h)p Fk(using)28 b(\014le)f Fj(auxname)p Fk(,)i(set)f Fj(bibstyle)p Fk(,)h Fj(citekeys)p Fk(,)g(and)f Fj(bibfiles)h Fm(34a)p Fl(i)q Fq(\021)1552 b Fm(\(32\))83 444 y Fj(do)161 535 y(local)41 b(commands)g(=)e({)h(})f(--)h(table)g (of)g(commands)h(we)f(recognize)h(in)f(.aux)g(files)161 626 y(local)h(function)g(do_nothing\(\))h(end)e(--)f(default)i(for)f (unrecognized)i(commands)161 718 y(setmetatable\(commands,)j({)39 b(__index)i(=)e(function\(\))j(return)f(do_nothing)g(end)f(}\))161 809 y Fl(h)p Fk(functions)29 b(for)e(c)l(ommands)h(found)g(in)f(.aux)h (\014les)g Fm(34b)p Fl(i)161 900 y Fj(commands['@input']\(auxname\))85 b(--)40 b(reads)g(all)g(the)g(variables)83 992 y(end)-290 1150 y Fm(34b)181 b Fl(h)p Fk(functions)28 b(for)g(c)l(ommands)g(found) g(in)f(.aux)g(\014les)h Fm(34b)p Fl(i)q Fq(\021)1837 b Fm(\(34a\))49 b(34d)13 b Ff(.)83 1241 y Fj(do)161 1332 y(local)41 b(auxopened)g(=)f({)f(})79 b(---)40 b(map)g(filename)h(to)e (true/false)161 1515 y(commands['@input'])44 b(=)39 b(function)i (\(auxname\))240 1606 y(if)f(not)g(find\(auxname,)i('\045.aux$'\))f (then)318 1697 y(bibwarnf\('Name)i(of)c(auxfile)i("\045s")f(does)h(not) e(end)h(in)g(.aux\\n',)h(auxname\))240 1789 y(end)240 1880 y Fl(h)p Fk(mark)28 b Fj(auxname)h Fk(as)f(op)l(ene)l(d)h(\(but)g (fail)d(if)g(op)l(ene)l(d)j(alr)l(e)l(ady\))g Fm(34c)p Fl(i)240 1971 y Fj(local)40 b(aux)g(=)g(open\(auxname,)i('r'\))240 2063 y(logf\('Top-level)h(aux)c(file:)i(\045s\\n',)f(auxname\))240 2154 y(for)g(line)g(in)g(aux:lines\(\))h(do)318 2245 y(local)g(_,)e(_,)h(cmd,)g(arg)g(=)g(find\(line,)h ('^\\\\\([\045a\045@]+\)\045s*{\([^\045}]+\)}\045s*)q($'\))318 2337 y(if)f(cmd)g(then)g(commands[cmd]\(arg\))j(end)240 2428 y(end)240 2519 y(aux:close\(\))161 2611 y(end)83 2702 y(end)-282 2876 y Fm(34c)181 b Fl(h)p Fk(mark)28 b Fj(auxname)h Fk(as)f(op)l(ene)l(d)h(\(but)g(fail)d(if)g(op)l(ene)l(d) j(alr)l(e)l(ady\))g Fm(34c)p Fl(i)q Fq(\021)1748 b Fm(\(34b\))83 2968 y Fj(if)40 b(auxopened[auxname])j(then)161 3059 y(error\("File)f(")e(..)f(auxname)i(..)f(")f(cyclically)j(\\\\@input's) f(itself"\))83 3150 y(else)161 3242 y(auxopened[auxname])j(=)39 b(true)83 3333 y(end)125 3474 y Ft(B)l Fr(i)n(b)-7 b Ft(T)290 3499 y(E)336 3474 y(X)33 b(exp)r(ects)f Fs(.bib)f Ft(\014les)i(to)f(b)r(e)h(separated)e(b)n(y)i(commas.)50 b(They)33 b(are)e(forced)h(to)h(lo)n(w)n(er)e(case,)i(should)f(ha)n(v)n (e)f(no)0 3574 y(spaces)c(in)g(them,)i(and)e(the)h Fs(\\bibdata)c Ft(command)k(should)f(app)r(ear)g(exactly)g(once.)-290 3690 y Fm(34d)181 b Fl(h)p Fk(functions)28 b(for)g(c)l(ommands)g(found) g(in)f(.aux)g(\014les)h Fm(34b)p Fl(i)q Ft(+)p Fq(\021)1572 b Fm(\(34a\))49 b Ff(/)12 b Fm(34b)48 b(35a)13 b Ff(.)83 3781 y Fj(do)161 3873 y(local)41 b(bibdata_seen)h(=)d(false)161 4055 y(function)j(commands.bibdata\(arg\))240 4147 y(assert\(not)f (bibdata_seen,)i([[LaTeX)d(provides)h(multiple)h(\\bibdata)f (commands]]\))240 4238 y(bibdata_seen)h(=)d(true)240 4329 y(for)h(bib)g(in)f(string.gmatch\(arg,)44 b('[^,]+'\))d(do)318 4421 y(assert\(not)h(find\(bib,)f('\045s'\),)g('bibname)g(from)f(LaTeX) g(contains)h(whitespace'\))318 4512 y(table.insert\(bibfiles,)k (string.lower\(bib\)\))240 4603 y(end)161 4695 y(end)83 4786 y(end)1908 5400 y Ft(34)p eop end %%Page: 35 35 TeXDict begin 35 34 bop 125 83 a Ft(The)27 b(st)n(yle)g(should)h(b)r(e) g(unique,)g(and)f(it)h(should)f(b)r(e)h(kno)n(wn)f(to)h(us.)-286 199 y Fm(35a)181 b Fl(h)p Fk(functions)28 b(for)g(c)l(ommands)g(found)g (in)f(.aux)g(\014les)h Fm(34b)p Fl(i)q Ft(+)p Fq(\021)1569 b Fm(\(34a\))48 b Ff(/)12 b Fm(34d)48 b(35b)13 b Ff(.)83 291 y Fj(function)41 b(commands.bibstyle\(stylename\))161 382 y(if)f(bibstyle)h(then)240 473 y(biberrorf\('Illegal,)i(another)e (\\\\bibstyle)h(command'\))161 565 y(else)240 656 y(bibstyle)f(=)e (bibtex.style\(string.lower\(s)q(tylen)q(ame\))q(\))240 747 y(if)h(not)g(bibstyle)h(then)318 839 y(bibfatalf\('There)i(is)d(no) g(nbibtex)g(style)h(called)f("\045s"'\))240 930 y(end)161 1021 y(end)83 1112 y(end)32 1237 y Ft(W)-7 b(e)32 b(accum)n(ulated)f (cited)h(k)n(eys)f(in)h Fs(citekeys)p Ft(.)46 b(Keys)31 b(ma)n(y)g(b)r(e)h(duplicated,)h(but)f(the)g(input)h(should)e(not)h (con)n(tain)f(t)n(w)n(o)0 1337 y(k)n(eys)c(that)h(di\013er)f(only)g(in) h(case.)-290 1453 y Fm(35b)181 b Fl(h)p Fk(functions)28 b(for)g(c)l(ommands)g(found)g(in)f(.aux)g(\014les)h Fm(34b)p Fl(i)q Ft(+)p Fq(\021)1776 b Fm(\(34a\))49 b Ff(/)12 b Fm(35a)83 1544 y Fj(do)161 1636 y(local)41 b(keys_seen,)g(lower_seen) h(=)d({)h(},)f({)h(})f(--)h(which)g(keys)h(have)f(been)g(seen)g (already)161 1818 y(function)i(commands.citation\(arg\))240 1910 y(for)e(key)g(in)f(string.gmatch\(arg,)44 b('[^,]+'\))d(do)318 2001 y(assert\(not)h(find\(key,)f('\045s'\),)593 2092 y('Citation)g(key)f({')g(..)g(key)f(..)h('})g(from)g(LaTeX)g(contains)h (whitespace'\))318 2183 y(if)f(key)g(==)g('*')g(then)397 2275 y(cited_star)h(=)f(true)318 2366 y(elseif)h(not)f(keys_seen[key])i (then)e(---)g(duplicates)i(are)e(OK)397 2457 y(keys_seen[key])i(=)e (true)397 2549 y(local)g(low)g(=)g(string.lower\(key\))397 2640 y Fl(h)p Fk(if)26 b(another)j(key)g(with)e(same)h(lower)l(c)l (ase,)h(c)l(omplain)e(bitterly)i Fm(35c)p Fl(i)397 2731 y Fj(if)40 b(not)f(cited_star)j(then)e(--)g(no)f(more)i(insertions)g (after)f(the)g(star)475 2823 y(table.insert\(citekeys,)45 b(key\))40 b(--)f(must)h(be)g(key,)g(not)g(low,)1574 2914 y(--)f(so)h(that)g(keys)g(in)g(.bbl)g(match)g(.aux)397 3005 y(end)318 3097 y(end)240 3188 y(end)161 3279 y(end)83 3371 y(end)-282 3528 y Fm(35c)181 b Fl(h)p Fk(if)26 b(another)k(key)e (with)g(same)g(lower)l(c)l(ase,)g(c)l(omplain)g(bitterly)g Fm(35c)p Fl(i)q Fq(\021)1706 b Fm(\(35b\))83 3620 y Fj(if)40 b(lower_seen[low])i(then)161 3711 y(biberrorf\("Citation)i(key)c ('\045s')g(inconsistent)i(with)e(earlier)h(key)f('\045s'",)554 3802 y(key,)g(lower_seen[low]\))83 3894 y(else)161 3985 y(lower_seen[low])j(=)d(key)83 4076 y(end)1908 5400 y Ft(35)p eop end %%Page: 36 36 TeXDict begin 36 35 bop 125 83 a Ft(After)28 b(reading)g(the)g(v)-5 b(ariables,)28 b(w)n(e)g(do)g(a)g(little)h(v)-5 b(alidation.)39 b(I)28 b(can't)g(seem)h(to)f(mak)n(e)f(up)i(m)n(y)f(mind)h(what)g (should)f(b)r(e)0 183 y(done)f(incremen)n(tally)g(while)h(things)f(are) g(b)r(eing)h(read.)-286 299 y Fm(36a)181 b Fl(h)p Fk(validate)28 b(c)l(ontents)i(of)d Fj(bibstyle)p Fk(,)i Fj(citekeys)p Fk(,)g(and)f Fj(bibfiles)h Fm(36a)p Fl(i)q Fq(\021)1648 b Fm(\(32\))83 390 y Fj(if)40 b(not)g(bibstyle)h(then)161 482 y(bibfatalf\('No)i(\\\\bibliographystyle)g(in)d(original)h (LaTeX'\))83 573 y(end)83 756 y(if)f(table.getn\(bibfiles\))j(==)d(0)g (then)161 847 y(bibfatalf\('No)j(.bib)d(files)g(specified)h(---)f(no)g (\\\\bibliography)i(in)e(original)h(LaTeX?'\))83 938 y(end)83 1121 y(if)f(table.getn\(citekeys\))j(==)d(0)g(and)g(not)f (cited_star)j(then)161 1212 y(biberrorf\('No)h(citations)e(in)f (document)h(---)f(empty)g(bibliography'\))83 1303 y(end)83 1486 y(do)g(---)g(check)g(for)g(duplicate)h(bib)f(entries)161 1577 y(local)h(i)e(=)h(1)161 1669 y(local)h(seen)f(=)f({)h(})161 1760 y(while)h(i)e(<=)h(table.getn\(bibfiles\))k(do)240 1851 y(local)c(bib)g(=)g(bibfiles[i])240 1943 y(if)g(seen[bib])h(then) 318 2034 y(bibwarnf\('Multiple)j(references)d(to)f(bibfile)h("\045s"',) f(bib\))318 2125 y(table.remove\(bibfiles,)45 b(i\))240 2217 y(else)318 2308 y(i)40 b(=)f(i)h(+)f(1)240 2399 y(end)161 2491 y(end)83 2582 y(end)0 2839 y Fn(3.6)112 b(Reading)39 b(the)e(en)m(tries)g(from)h(all)g(the)g Fw(B)-5 b Fc(i)m(b)d Fw(T)2062 2869 y(E)2117 2839 y(X)37 b Fn(\014les)0 2993 y Ft(These)27 b(are)g(diagnostics)f(that)i(migh)n (t)g(b)r(e)g(written)f(to)h(a)f(log.)-290 3109 y Fm(36b)181 b Fl(h)p Fk(fr)l(om)27 b Fj(bibstyle)p Fk(,)i Fj(citekeys)p Fk(,)g(and)f Fj(bibfiles)p Fk(,)h(c)l(ompute)f(and)g(emit)g(the)g(list) g(of)f(entries)i Fm(36b)p Fl(i)p Fq(\021)727 b Fm(\(32\))48 b(37)13 b Ff(.)83 3200 y Fj(logf\("bibstyle)42 b(==)e(\045q\\n",)h (bibstyle.name\))83 3291 y(logf\("consult)h(these)f(bibfiles:"\))83 3383 y(for)f(_,)g(bib)g(in)f(ipairs\(bibfiles\))k(do)d(logf\(")g (\045s",)g(bib\))h(end)83 3474 y(logf\("\\ncite)h(these)e (papers:\\n"\))83 3565 y(for)g(_,)g(key)g(in)f(ipairs\(citekeys\))k(do) d(logf\(")80 b(\045s\\n",)40 b(key\))g(end)83 3657 y(if)g(cited_star)h (then)f(logf\(")80 b(and)40 b(everything)i(else)e(in)f(the)h (database\\n"\))i(end)1908 5400 y Ft(36)p eop end %%Page: 37 37 TeXDict begin 37 36 bop 125 83 a Ft(Eac)n(h)31 b(bibliograph)n(y)g (\014le)i(is)f(op)r(ened)h(with)g Fs(openbib)p Ft(.)49 b(Unlik)n(e)33 b(classic)f(B)l Fr(i)n(b)-7 b Ft(T)2602 108 y(E)2648 83 y(X,)33 b(w)n(e)f(can't)h(simply)g(select)f(the)h (\014rst)0 183 y(en)n(try)27 b(matc)n(hing)g(a)g(citation)h(k)n(ey)-7 b(.)36 b(Instead,)27 b(w)n(e)h(read)e(all)i(en)n(tries)f(in)n(to)g Fs(bibentries)c Ft(and)28 b(do)f(searc)n(hes)f(later.)125 282 y(The)h(easy)f(case)g(is)h(when)h(w)n(e're)e(not)h(p)r(ermissiv)n (e:)36 b(w)n(e)27 b(put)g(all)g(the)h(en)n(tries)e(in)n(to)h(one)g (list,)g(just)h(as)f(if)g(they)h(had)f(come)0 382 y(from)k(a)g(single)g Fs(.bib)f Ft(\014le.)49 b(But)32 b(if)g(w)n(e're)e(p)r(ermissiv)n(e,)i (duplicates)f(in)h(di\013eren)n(t)g(bib\014les)f(are)g(OK:)g(w)n(e)g (will)h(searc)n(h)d(one)0 482 y(bib\014le)f(after)f(another)g(and)g (stop)g(after)h(the)f(\014rst)h(successful)f(searc)n(h|th)n(us)f (instead)h(of)h(a)f(single)g(list,)h(w)n(e)f(ha)n(v)n(e)f(a)h(list)h (of)0 581 y(lists.)-251 697 y Fm(37)181 b Fl(h)p Fk(fr)l(om)27 b Fj(bibstyle)p Fk(,)i Fj(citekeys)p Fk(,)g(and)f Fj(bibfiles)p Fk(,)h(c)l(ompute)f(and)g(emit)g(the)g(list)g(of)f(entries)i Fm(36b)p Fl(i)p Ft(+)p Fq(\021)423 b Fm(\(32\))48 b Ff(/)12 b Fm(36b)48 b(41a)13 b Ff(.)83 789 y Fj(local)40 b(bibentries)i(=)d({)h (})f(--)h(if)g(permissive,)h(list)f(of)g(lists,)h(else)f(list)g(of)g (entries)83 880 y(local)g(dupcheck)h(=)f({)f(})h(--)f(maps)i(lower)f (key)g(to)g(entry)83 971 y(local)g(preamble)h(=)f({)f(})h(--)f (accumulates)j(preambles)f(from)g(all)f(.bib)g(files)83 1063 y(local)g(got_one_bib)i(=)e(false)g(--)g(did)g(we)f(open)h(even)g (one)g(.bib)h(file?)83 1154 y Fl(h)p Fk(de\014nition)28 b(of)f(function)h Fj(openbib)p Fk(,)h(which)e(sets)i Fj(get)p 1662 1154 24 4 v 29 w(one)p 1808 1154 V 29 w(bib)f Fk(if)f(suc)l(c)l(essful)i Fm(38)p Fl(i)83 1337 y Fj(local)40 b(warnings)h(=)f({)f(})79 b(--)40 b(table)g(of)g(held)g(warnings)h(for) f(each)g(entry)83 1428 y(local)g(macros)h(=)e(bibstyle.macros\(\))44 b(--)39 b(must)h(accumulate)i(macros)e(across)h(.bib)f(files)83 1519 y(for)g(_,)g(bib)g(in)f(ipairs\(bibfiles\))k(do)161 1611 y(local)e(bibfilename,)h(rdr)e(=)f(openbib\(bib,)j(macros\))161 1702 y(if)e(rdr)g(then)240 1793 y(local)g(t)g(--)f(list)i(that)f(will)g (receive)h(entries)f(from)h(this)f(reader)240 1885 y(if)g(permissive)h (then)318 1976 y(t)f(=)f({)h(})318 2067 y(table.insert\(bibentries,)45 b(t\))240 2159 y(else)318 2250 y(t)40 b(=)f(bibentries)240 2341 y(end)240 2433 y(local)h(localdupcheck)i(=)e({)f(})h(--)g(lower)g (key)g(to)f(entry;)i(finds)f(duplicates)i(within)f(this)f(file)240 2524 y(for)g(type,)g(key,)g(fields,)h(file,)g(line)f(in)f (entries\(rdr\))j(do)318 2615 y(if)e(type)g(==)g(nil)g(then)397 2707 y(break)318 2798 y(elseif)h(type)f(then)g(--)g(got)g(something)h (without)g(error)397 2889 y(local)f(e)g(=)f({)h(type)g(=)f(type,)i(key) e(=)h(key,)g(fields)h(=)e(fields,)868 2980 y(file)h(=)f(bibfilename,)j (line)e(=)g(rdr.entry_line)i(})397 3072 y(warnings[e])g(=)d (held_warnings\(\))397 3163 y Fl(h)p Fk(de\014nition)28 b(of)f(lo)l(c)l(al)g(function)h Fj(not)p 1456 3163 V 29 w(dup)g Fm(39)p Fl(i)397 3254 y Fj(local)40 b(ok1,)g(ok2)g(=)g (not_dup\(localdupcheck\),)k(not_dup\(dupcheck\))f(--)d(evaluate)h (both)397 3346 y(if)f(ok1)f(and)h(ok2)g(then)475 3437 y(table.insert\(t,)j(e\))397 3528 y(end)318 3620 y(end)240 3711 y(end)240 3802 y(for)d(_,)g(l)f(in)h(ipairs\(rdr.preamble\))j(do)d (table.insert\(preamble,)k(l\))c(end)240 3894 y(rdr:close\(\))161 3985 y(end)83 4076 y(end)83 4259 y(if)g(not)g(got_one_bib)h(then)161 4350 y(bibfatalf\("Could)i(not)d(open)g(any)g(of)g(the)g(following)h (.bib)f(files:)h(\045s",)554 4442 y(table.concat\(bibfiles,)j(')39 b('\)\))83 4533 y(end)0 4658 y Ft(Because)27 b(the)h(pream)n(ble)e(is)i (accum)n(ulated)f(as)g(the)h Fs(.bib)e Ft(\014le)h(is)h(read,)f(it)h(m) n(ust)f(b)r(e)h(copied)g(at)f(the)h(end.)1908 5400 y(37)p eop end %%Page: 38 38 TeXDict begin 38 37 bop 125 83 a Ft(Here)23 b(w)n(e)h(op)r(en)g (\014les.)35 b(If)25 b(w)n(e're)e(not)h(b)r(eing)g(p)r(ermissiv)n(e,)g (w)n(e)g(m)n(ust)g(op)r(en)g(eac)n(h)f(\014le)h(successfully)-7 b(.)35 b(If)25 b(w)n(e're)e(p)r(ermissiv)n(e,)0 183 y(it's)28 b(enough)f(to)g(get)h(at)f(least)g(one.)125 282 y(T)-7 b(o)27 b(\014nd)h(the)g(pathname)f(for)g(a)g(bib)h(\014le,)g(w)n(e)g (use)f Fs(bibtex.bibpath)p Ft(.)-251 399 y Fm(38)181 b Fl(h)p Fk(de\014nition)28 b(of)f(function)h Fj(openbib)p Fk(,)h(which)e(sets)i Fj(get)p 1579 399 24 4 v 29 w(one)p 1725 399 V 29 w(bib)f Fk(if)f(suc)l(c)l(essful)i Fm(38)p Fl(i)p Fq(\021)1296 b Fm(\(37\))83 490 y Fj(local)40 b(function)h(openbib\(bib,)h(macros\))161 581 y(macros)f(=)f(macros)g (or)g(bibstyle.macros\(\))161 672 y(local)h(filename,)g(msg)f(=)f (bibtex.bibpath\(bib\))161 764 y(if)h(not)g(filename)h(then)240 855 y(if)f(not)g(permissive)h(then)f(biberrorf\("Cannot)j(find)d(file)h (\045s.bib",)g(bib\))f(end)240 946 y(return)161 1038 y(end)161 1129 y(local)h(rdr)f(=)f(bibtex.open\(filename,)44 b(macros,)d(strict)g(and)f(emit_warning)h(or)f(hold_warning\))161 1220 y(if)g(not)g(rdr)g(and)g(not)g(permissive)h(then)240 1312 y(biberrorf\("Cannot)i(open)d(file)g(\045s.bib",)h(bib\))240 1403 y(return)161 1494 y(end)161 1586 y(got_one_bib)h(=)e(true)161 1677 y(return)h(filename,)g(rdr)83 1768 y(end)1908 5400 y Ft(38)p eop end %%Page: 39 39 TeXDict begin 39 38 bop 0 83 a Fu(3.6.1)94 b(Duplication)31 b(c)m(hec)m(ks)0 236 y Ft(There's)c(a)g(great)f(deal)i(of)f(n)n (uisance)g(to)h(c)n(hec)n(king)e(the)i(in)n(tegrit)n(y)f(of)g(a)g Fs(.bib)f Ft(\014le.)-251 352 y Fm(39)181 b Fl(h)p Fk(de\014nition)28 b(of)f(lo)l(c)l(al)h(function)f Fj(not)p 1059 352 24 4 v 29 w(dup)i Fm(39)p Fl(i)p Fq(\021)2381 b Fm(\(37\))83 444 y Fl(h)p Fk(abstr)l(action)30 b(exp)l(orting)f Fj(savecomplaint)i Fk(and)d Fj(issuecomplaints)j Fm(40a)p Fl(i)83 626 y Fj(local)40 b(k)g(=)f(string.lower\(key\))83 718 y(local)h(function)h (not_dup\(dup\))161 809 y(local)g(e1,)f(e2)f(=)h(dup[k],)h(e)161 900 y(if)f(e1)g(then)240 992 y(--)g(do)f(return)i(false)f(end)g(---)g (avoid)g(extra)h(msgs)f(for)g(now)240 1083 y(local)g(diff)g(=)g (entries_differ\(e1,)j(e2\))240 1174 y(if)d(diff)g(then)318 1266 y(local)h(verybad)g(=)e(not)h(permissive)h(or)f(e1.file)h(==)f (e2.file)318 1357 y(local)h(complain)g(=)e(verybad)i(and)f(biberrorf)h (or)f(bibwarnf)318 1448 y(if)g(e1.key)h(==)e(e2.key)i(then)397 1540 y(if)f(verybad)g(then)475 1631 y(savecomplaint\(e1,)j(e2,)d (complain,)1024 1722 y("Ignoring)i(second)e(entry)h(with)f(key)g ('\045s')g(on)g(file)g(\045s,)g(line)g(\045d\\n")g(..)1024 1814 y(")79 b(\(first)41 b(entry)f(occurred)h(on)f(file)g(\045s,)g (line)g(\045d;\\n"..)1024 1905 y(")118 b(entries)41 b(differ)g(in)e (\045s\)\\n",)1024 1996 y(e2.key,)i(e2.file,)g(e2.line,)g(e1.file,)g (e1.line,)g(diff\))397 2088 y(end)318 2179 y(else)397 2270 y(savecomplaint\(e1,)i(e2,)d(complain,)515 2362 y("Entries)h('\045s')f(on)f(file)i(\045s,)e(line)i(\045d)e(and\\n)80 b('\045s')40 b(on)g(file)g(\045s,)g(line)g(\045d")g(..)515 2453 y(")f(have)h(keys)g(that)g(differ)h(only)f(in)g(case\\n",)515 2544 y(e1.key,)g(e1.file,)h(e1.line,)g(e2.key,)g(e2.file,)g(e2.line\)) 318 2636 y(end)240 2727 y(elseif)g(e1.file)f(==)g(e2.file)h(then)318 2818 y(savecomplaint\(e1,)i(e2,)d(bibwarnf,)397 2910 y("Entry)g('\045s')h(is)e(duplicated)j(in)d(file)i('\045s')f(at)f(both) i(line)f(\045d)f(and)h(line)g(\045d\\n",)397 3001 y(e1.key,)h(e1.file,) g(e1.line,)g(e2.line\))240 3092 y(elseif)g(not)e(permissive)j(then)318 3184 y(savecomplaint\(e1,)h(e2,)d(bibwarnf,)397 3275 y("Entry)g('\045s')h(appears)f(both)h(on)e(file)h('\045s',)h(line)f (\045d)g(and)f(file)i('\045s',)f(line)g(\045d"..)397 3366 y("\\n)79 b(\(entries)41 b(are)f(exact)g(duplicates\)\\n",)397 3458 y(e1.key,)h(e1.file,)g(e1.line,)g(e2.file,)g(e2.line\))240 3549 y(end)240 3640 y(return)g(false)161 3731 y(else)240 3823 y(dup[k])g(=)e(e)240 3914 y(return)i(true)161 4005 y(end)83 4097 y(end)1908 5400 y Ft(39)p eop end %%Page: 40 40 TeXDict begin 40 39 bop 125 83 a Ft(Calling)33 b Fs(savecomplaint\(e)o (1,)k(e2,)42 b(complain,)e(...\))32 b Ft(tak)n(es)h(the)h(complain)n(t) f Fs(complain\(...\))28 b Ft(and)34 b(asso)r(ciates)0 183 y(it)25 b(with)g(en)n(tries)f Fs(e1)g Ft(and)h Fs(e2)p Ft(.)35 b(If)25 b(w)n(e)g(are)e(op)r(erating)h(in)h(\\strict")e(mo)r (de,)j(the)f(complain)n(t)f(is)h(issued)f(righ)n(t)g(a)n(w)n(a)n(y;)g (otherwise)0 282 y(calling)d Fs(issuecomplaints\(e)o(\))16 b Ft(issues)21 b(the)h(complain)n(t)g(lazily)-7 b(.)34 b(In)22 b(non-strict,)h(lazy)e(mo)r(de,)i(the)f(outside)g(w)n(orld)f (arranges)0 382 y(to)27 b(issue)h(only)f(complain)n(ts)g(with)h(en)n (tries)f(that)h(are)e(actually)h(used.)-286 490 y Fm(40a)181 b Fl(h)p Fk(abstr)l(action)30 b(exp)l(orting)f Fj(savecomplaint)i Fk(and)d Fj(issuecomplaints)j Fm(40a)p Fl(i)p Fq(\021)1517 b Fm(\(39\))83 582 y Fj(local)40 b(savecomplained,)j(issuecomplaints)83 673 y(if)d(strict)g(then)161 764 y(function)i(savecomplaint\(e1,)h(e2,) d(complain,)h(...\))240 856 y(return)g(complain\(...\))161 947 y(end)161 1038 y(function)h(issuecomplaints\(e\))h(end)83 1130 y(else)161 1221 y(local)e(complaints)g(=)f({)f(})161 1312 y(local)i(function)g(save\(e,)g(t\))240 1404 y(complaints[e])h(=)e (complaints[e])i(or)d({)h(})240 1495 y(table.insert\(complaints[e],)45 b(t\))161 1586 y(end)161 1678 y(function)d(savecomplaint\(e1,)h(e2,)d (...\))240 1769 y(save\(e1,)h({)e(...)h(}\))240 1860 y(save\(e2,)h({)e(...)h(}\))161 1952 y(end)161 2043 y(local)h(function) g(call\(c,)g(...\))240 2134 y(return)g(c\(...\))161 2225 y(end)161 2317 y(function)h(issuecomplaints\(e\))240 2408 y(for)e(_,)g(c)f(in)h(ipairs\(complaints[e])j(or)d({)g(}\))f(do) 318 2499 y(call\(unpack\(c\)\))240 2591 y(end)161 2682 y(end)83 2773 y(end)-290 2908 y Fm(40b)181 b Fl(h)p Fk(Lua)28 b(utility)f(functions)i Fm(27d)p Fl(i)p Ft(+)p Fq(\021)2323 b Fm(\(27b\))49 b Ff(/)12 b Fm(33b)48 b(40c)13 b Ff(.)83 2999 y Fj(--)40 b(return)g('key')h(or)e('type')i(or)f('field)g(') h(at)f(which)g(entries)h(differ,)83 3090 y(--)f(or)f(nil)h(if)g (entries)h(are)f(the)g(same)83 3182 y(local)g(function)h (entries_differ\(e1,)j(e2,)c(notkey\))161 3273 y(if)g(e1.key)80 b(~=)40 b(e2.key)79 b(and)40 b(not)g(notkey)h(then)f(return)h('key')79 b(end)161 3364 y(if)40 b(e1.type)h(~=)f(e2.type)629 b(then)40 b(return)h('type')f(end)161 3456 y(for)g(k,)g(v)g(in)f (pairs\(e1.fields\))k(do)240 3547 y(if)d(e2.fields[k])i(~=)d(v)h(then)g (return)g('field)h(')e(..)h(k)g(end)161 3638 y(end)161 3730 y(for)g(k,)g(v)g(in)f(pairs\(e2.fields\))k(do)240 3821 y(if)d(e1.fields[k])i(~=)d(v)h(then)g(return)g('field)h(')e(..)h (k)g(end)161 3912 y(end)83 4004 y(end)125 4129 y Ft(I'v)n(e)27 b(seen)g(at)g(least)h(one)f(bibliograph)n(y)f(with)i(iden)n(tical)f(en) n(tries)g(listed)h(under)f(m)n(ultiple)i(k)n(eys.)36 b(\(Thanks,)27 b(Andrew.\))-282 4238 y Fm(40c)181 b Fl(h)p Fk(Lua)28 b(utility)f(functions)i Fm(27d)p Fl(i)p Ft(+)p Fq(\021)2316 b Fm(\(27b\))48 b Ff(/)12 b Fm(40b)48 b(49d)13 b Ff(.)83 4329 y Fj(--)40 b(every)g(entry)g(is)g(identical)h(to)f (every)g(other)83 4420 y(local)g(function)h(all_entries_identical\(es,) k(notkey\))161 4512 y(if)40 b(table.getn\(es\))j(==)c(0)h(then)g (return)g(true)h(end)161 4603 y(for)f(i)g(=)f(2,)h(table.getn\(es\))i (do)240 4694 y(if)e(entries_differ\(es[1],)k(es[i],)c(notkey\))h(then) 318 4786 y(return)g(false)240 4877 y(end)161 4968 y(end)161 5060 y(return)g(true)83 5151 y(end)1908 5400 y Ft(40)p eop end %%Page: 41 41 TeXDict begin 41 40 bop 0 83 a Fn(3.7)112 b(Computing)39 b(and)f(emitting)g(the)f(list)g(of)h(citations)0 236 y Ft(A)27 b(signi\014can)n(t)e(complexit)n(y)h(added)g(in)g(N)l Fr(bi)n(b)-7 b Ft(T)1457 261 y(E)1504 236 y(X)27 b(is)f(that)g(a)g (single)g(en)n(try)f(ma)n(y)h(b)r(e)g(cited)h(using)f(more)f(than)h (one)g(citation)0 336 y(k)n(ey)-7 b(.)61 b(F)-7 b(or)36 b(example,)h Fs(\\cite{milner:type)o(-po)o(ly)o(mo)o(rph)o(is)o(m})30 b Ft(and)35 b Fs(\\cite{milner:theo)o(ry-)o(po)o(ly)o(mor)o(ph)o(ism)o (})30 b Ft(ma)n(y)0 436 y(w)n(ell)d(sp)r(ecify)g(the)g(same)g(pap)r (er.)36 b(Th)n(us,)27 b(in)g(addition)g(to)g(a)f(list)i(of)e (citations,)h(I)g(also)f(k)n(eep)h(trac)n(k)e(of)i(the)h(set)f(of)g(k)n (eys)f(with)0 535 y(whic)n(h)g(eac)n(h)e(en)n(try)h(is)h(cited,)g(as)f (w)n(ell)h(as)e(the)i(\014rst)g(suc)n(h)f(k)n(ey)-7 b(.)36 b(The)25 b(function)i Fs(cite)d Ft(manages)g(all)h(these)h(data)f (structures.)-286 651 y Fm(41a)181 b Fl(h)p Fk(fr)l(om)27 b Fj(bibstyle)p Fk(,)i Fj(citekeys)p Fk(,)g(and)f Fj(bibfiles)p Fk(,)h(c)l(ompute)f(and)g(emit)g(the)g(list)g(of)f(entries)i Fm(36b)p Fl(i)p Ft(+)p Fq(\021)462 b Fm(\(32\))48 b Ff(/)12 b Fm(37)48 b(42a)13 b Ff(.)83 743 y Fj(local)40 b(citations)i(=)d({)h (})f(--)h(list)g(of)g(citations)83 834 y(local)g(cited)h(=)e({)h(})f (--)h(\(entry)g(->)g(key)g(set\))g(table)83 925 y(local)g(first_cited)i (=)e({)f(})g(--)h(\(entry)h(->)e(key\))i(table)83 1017 y(local)f(function)h(cite\(c,)g(e\))f(--)g(cite)g(entry)g(e)g(with)g (key)g(c)161 1108 y(local)h(seen)f(=)f(cited[e])161 1199 y(cited[e])j(=)d(seen)h(or)g({)f(})161 1291 y(cited[e][c])j(=)e(true) 161 1382 y(if)g(not)g(seen)g(then)240 1473 y(first_cited[e])i(=)e(c)240 1565 y(table.insert\(citations,)k(e\))161 1656 y(end)83 1747 y(end)125 1872 y Ft(When)31 b(the)g(dust)h(settles,)g(w)n(e)e (adjust)h(mem)n(b)r(ers)g(of)g(eac)n(h)f(citation)h(record:)42 b(the)31 b(\014rst)g(k)n(ey)f(actually)h(used)f(b)r(ecomes)0 1971 y Fs(key)p Ft(,)c(the)i(original)f(k)n(ey)f(b)r(ecomes)i Fs(orig)p 1286 1971 27 4 v 29 w(key)p Ft(,)f(and)g(other)g(k)n(eys)g (go)g(in)n(to)g Fs(also)p 2513 1971 V 30 w(cited)p 2763 1971 V 29 w(as)p Ft(.)-290 2088 y Fm(41b)181 b Fl(h)p Fk(using)28 b Fj(cited)g Fk(and)g Fj(first)p 804 2088 24 4 v 30 w(cited)p Fk(,)g(adjust)g(\014elds)g Fj(key)g Fk(and)g Fj(also)p 1954 2088 V 29 w(cited)p 2178 2088 V 30 w(as)g Fm(41b)p Fl(i)p Fq(\021)1222 b Fm(\(43d\))83 2179 y Fj(for)40 b(i)f(=)h(1,)g(table.getn\(citations\))k(do)161 2270 y(local)d(c)e(=)h(citations[i])161 2362 y(local)h(key)f(=)f (assert\(first_cited[c],)44 b("citation)e(is)d(not)h(cited?!"\))161 2453 y(c.orig_key,)i(c.key)f(=)e(c.key,)i(key)161 2544 y(local)g(also)f(=)f({)h(})161 2636 y(for)g(k)g(in)g(pairs\(cited[c]\)) i(do)240 2727 y(if)e(k)f(~=)h(key)g(then)g(table.insert\(also,)j(k\))d (end)161 2818 y(end)161 2910 y(c.also_cited_as)j(=)d(also)83 3001 y(end)1908 5400 y Ft(41)p eop end %%Page: 42 42 TeXDict begin 42 41 bop 125 83 a Ft(F)-7 b(or)33 b(eac)n(h)g(actual)g Fs(\\cite)f Ft(command)h(in)h(the)g(original)f(L)1945 66 y Fo(A)1982 83 y Ft(T)2028 101 y(E)2073 83 y(X)i(\014le,)g(w)n(e)e (call)h Fs(find)p 2802 83 27 4 v 30 w(entry)d Ft(to)j(\014nd)g(an)g (appropriate)0 183 y(B)l Fr(i)n(b)-7 b Ft(T)165 208 y(E)211 183 y(X)24 b(en)n(try)-7 b(.)35 b(Because)23 b(a)g Fs(\\cite)e Ft(command)i(migh)n(t)h(matc)n(h)f(more)g(than)h(one)f(pap)r(er,)h(the) g(results)f(ma)n(y)f(b)r(e)i(am)n(biguous.)0 282 y(W)-7 b(e)30 b(therefore)e(pro)r(duce)h(a)g(list)g(of)h(all)f Fp(c)l(andidates)37 b Ft(matc)n(hing)29 b(the)h Fs(\\cite)d Ft(command.)42 b(If)29 b(w)n(e're)g(p)r(ermissiv)n(e,)g(w)n(e)g(searc)n (h)0 382 y(one)k(list)g(of)g(en)n(tries)f(after)h(another,)h(stopping)e (as)h(so)r(on)f(as)g(w)n(e)h(get)g(some)f(candidates.)53 b(If)34 b(w)n(e're)e(not)h(p)r(ermissiv)n(e,)g(w)n(e)0 482 y(ha)n(v)n(e)e(just)h(one)g(list)g(of)f(en)n(tries)h(o)n(v)n (erall,)e(so)i(w)n(e)f(searc)n(h)f(it)j(and)e(w)n(e're)g(done.)50 b(If)32 b(p)r(ermissiv)n(e,)g(w)n(e)f(searc)n(h)g(en)n(try)g(lists)h (in)0 581 y(turn)c(un)n(til)g(w)n(e)-286 697 y Fm(42a)181 b Fl(h)p Fk(fr)l(om)27 b Fj(bibstyle)p Fk(,)i Fj(citekeys)p Fk(,)g(and)f Fj(bibfiles)p Fk(,)h(c)l(ompute)f(and)g(emit)g(the)g(list) g(of)f(entries)i Fm(36b)p Fl(i)p Ft(+)p Fq(\021)423 b Fm(\(32\))48 b Ff(/)12 b Fm(41a)48 b(43d)13 b Ff(.)83 789 y Fj(local)40 b(find_entry)i(--)e(function)h(from)f(key)g(to)f (citation)83 880 y(do)161 971 y(local)i(cache)f(=)g({)f(})h(--)f (\(citation-key)j(->)e(entry\))h(table)161 1154 y(function)h (find_entry\(c\))240 1245 y(local)e(function)h(remember\(e\))h (cache[c])f(=)f(e;)f(return)i(e)e(end)h(--)g(cache)g(e)g(and)g(return)g (it)240 1428 y(if)g(cache[c])h(or)e(dupcheck[c])j(then)318 1519 y(return)f(cache[c])g(or)f(dupcheck[c])240 1611 y(else)318 1702 y(local)h(candidates)318 1793 y(if)f(permissive)i(then) 397 1885 y(for)e(_,)f(entries)i(in)f(ipairs\(bibentries\))j(do)475 1976 y(candidates)f(=)d(query\(c,)i(entries\))475 2067 y(if)f(table.getn\(candidates\))k(>)c(0)f(then)h(break)h(end)397 2159 y(end)318 2250 y(else)397 2341 y(candidates)g(=)f(query\(c,)h (bibentries\))318 2433 y(end)318 2524 y(assert\(candidates\))318 2615 y Fl(h)p Fk(fr)l(om)28 b(the)g(available)g Fj(candidates)p Fk(,)h(cho)l(ose)g(one)f(and)g Fj(remember)h Fk(it)f Fm(42b)p Fl(i)240 2707 y Fj(end)161 2798 y(end)83 2889 y(end)125 3014 y Ft(If)k(w)n(e)f(ha)n(v)n(e)f(no)h(candidates,)h(w)n (e're)f(hosed.)48 b(Otherwise,)32 b(if)g(all)f(the)h(candidates)f(are)g (iden)n(tical)g(\(most)h(lik)n(ely)f(when)0 3113 y(there)g(is)h(a)f (unique)h(candidate,)g(but)h(still)f(p)r(ossible)f(otherwise\),)2094 3083 y Fo(2)2163 3113 y Ft(w)n(e)h(tak)n(e)f(the)h(\014rst.)48 b(Finally)-7 b(,)33 b(if)f(there)g(are)e(m)n(ultiple,)0 3213 y(distinct)h(candidates)e(to)h(c)n(ho)r(ose)f(from,)i(w)n(e)f(tak) n(e)f(the)i(\014rst)f(and)g(issue)g(a)f(w)n(arning)g(message.)43 b(T)-7 b(o)30 b(a)n(v)n(oid)f(surprising)g(the)0 3313 y(un)n(w)n(ary)h(coauthor,)i(w)n(e)f(put)h(a)g(w)n(arning)e(message)g (in)n(to)i(the)g(en)n(try)f(as)g(w)n(ell,)i(from)e(whic)n(h)h(it)g (will)g(go)f(in)n(to)g(the)h(prin)n(ted)0 3412 y(bibliograph)n(y)-7 b(.)-290 3528 y Fm(42b)181 b Fl(h)p Fk(fr)l(om)27 b(the)i(available)e Fj(candidates)p Fk(,)i(cho)l(ose)h(one)e(and)g Fj(remember)h Fk(it)e Fm(42b)p Fl(i)q Fq(\021)1484 b Fm(\(42a\))83 3620 y Fj(if)40 b(table.getn\(candidates\))k(==)c(0)f(then)161 3711 y(biberrorf\('No)k(.bib)d(entry)g(matches)h(\\\\cite{\045s}',)h (c\))83 3802 y(elseif)f(all_entries_identical\(candidate)q(s,)k ('notkey'\))d(then)161 3894 y(logf\("Query)g('\045s')e(produced)h (unique)g(candidate)g(\045s)f(from)g(\045s\\n",)475 3985 y(c,)g(candidates[1].key,)j(candidates[1].file\))161 4076 y(return)e(remember\(candidates[1]\))83 4168 y(else)161 4259 y(local)g(e)e(=)h(table.copy\(candidates[1]\))161 4350 y Fl(h)p Fk(warn)28 b(of)g(multiple)f(c)l(andidates)i(for)f(query) g Fj(c)g Fm(43a)p Fl(i)161 4442 y Fj(e.warningmsg)42 b(=)e(string.format\('[This)k(entry)c(is)g(the)g(first)g(match)g(for)g (query)h(')e(..)1299 4533 y('\\\\texttt{\045s},)j(which)f(produced)g (\045d)f(matches.]',)1299 4624 y(c,)g(table.getn\(candidates\)\))161 4716 y(return)h(remember\(e\))83 4807 y(end)p 0 4995 1560 4 v 92 5049 a Fi(2)127 5072 y Fm(Andrew)20 b(App)r(el)g(has)g(a)h (bibliograph)n(y)f(in)f(whic)n(h)i(the)g Fa(De\014nition)h(of)g (Standar)l(d)i(ML)c Fm(app)r(ears)g(as)g(t)n(w)n(o)h(di\013eren)n(t)g (en)n(tries)f(that)h(are)f(iden)n(tical)0 5151 y(except)26 b(for)c(k)n(eys.)1908 5400 y Ft(42)p eop end %%Page: 43 43 TeXDict begin 43 42 bop 125 83 a Ft(I)27 b(can)g(do)h(b)r(etter)g (later.)13 b(.)h(.)-286 199 y Fm(43a)181 b Fl(h)p Fk(warn)28 b(of)f(multiple)g(c)l(andidates)j(for)d(query)i Fj(c)f Fm(43a)p Fl(i)p Fq(\021)2155 b Fm(\(42b\))83 291 y Fj(bibwarnf\("Query) 43 b('\045s')d(produced)h(\045d)f(candidates\\n)159 b(\(using)41 b(\045s)e(from)i(\045s\)\\n",)436 382 y(c,)f(table.getn\(candidates\),) k(e.key,)d(e.file\))83 473 y(bibwarnf\("First)i(two)d(differ)g(in)g (\045s\\n",)g(entries_differ\(candidates[1)q(],)45 b(candidates[2],)e (true\)\))125 598 y Ft(The)27 b Fs(query)f Ft(function)i(uses)f(the)h (engine)f(describ)r(ed)h(in)g(Section)f(3.9.)-290 714 y Fm(43b)181 b Fl(h)p Fk(de\014nition)28 b(of)f Fj(query)p Fk(,)h(use)l(d)h(to)f(se)l(ar)l(ch)h(a)f(list)f(of)g(entries)i Fm(43b)p Fl(i)q Fq(\021)1787 b Fm(\(46b\))83 805 y Fj(function)41 b(query\(c,)g(entries\))161 897 y(local)g(p)e(=)h(matchq\(c\))161 988 y(local)h(t)e(=)h({)f(})161 1079 y(for)h(_,)g(e)g(in)f (ipairs\(entries\))k(do)240 1171 y(if)d(p\(e.type,)h(e.fields\))g(then) 318 1262 y(table.insert\(t,)i(e\))240 1353 y(end)161 1445 y(end)161 1536 y(return)e(t)83 1627 y(end)83 1719 y(bibtex.query)h(=)d(query)83 1810 y(bibtex.doc.query)k(=)c('query:)i (string)g(->)e(entry)i(list)f(->)g(entry)g(list')-282 1968 y Fm(43c)181 b Fl(h)p Fk(de)l(clar)l(ations)29 b(of)e(internal)i (functions)f Fm(43c)p Fl(i)q Fq(\021)2373 b Fm(\(27b\))83 2059 y Fj(local)40 b(query)83 2150 y(local)g(matchq)83 2242 y(bibtex.doc.matchq)j(=)d('matchq:)h(string)f(->)g(predicate)h (---)f(compile)h(query)f(string')83 2333 y(bibtex.matchq)i(=)e(matchq) 125 2474 y Ft(Finally)e(w)n(e)g(can)g(compute)h(the)g(list)g(of)f(en)n (tries:)58 b(searc)n(h)37 b(on)i(eac)n(h)e(citation)i(k)n(ey)-7 b(,)41 b(and)d(if)h(w)n(e)f(had)h Fs(\\cite{*})c Ft(or)0 2574 y Fs(\\nocite{*})p Ft(,)24 b(add)j(all)g(the)h(other)f(en)n(tries) g(as)g(w)n(ell.)37 b(The)27 b Fs(cite)f Ft(command)i(tak)n(es)e(care)h (of)g(a)n(v)n(oiding)f(duplicates.)-290 2690 y Fm(43d)181 b Fl(h)p Fk(fr)l(om)27 b Fj(bibstyle)p Fk(,)i Fj(citekeys)p Fk(,)g(and)f Fj(bibfiles)p Fk(,)h(c)l(ompute)f(and)g(emit)g(the)g(list) g(of)f(entries)i Fm(36b)p Fl(i)p Ft(+)p Fq(\021)431 b Fm(\(32\))48 b Ff(/)12 b Fm(42a)48 b(43e)13 b Ff(.)83 2781 y Fj(for)40 b(_,)g(c)f(in)h(ipairs\(citekeys\))j(do)161 2873 y(local)e(e)e(=)h(find_entry\(c\))161 2964 y(if)g(e)g(then)g (cite\(c,)h(e\))e(end)83 3055 y(end)83 3147 y(if)h(cited_star)h(then) 161 3238 y(for)f(_,)g(es)g(in)f(ipairs\(permissive)44 b(and)39 b(bibentries)j(or)e({bibentries}\))i(do)240 3329 y(logf\('Adding)g(all)e(entries)h(in)e(list)h(of)g(\045d\\n',)h (table.getn\(es\)\))240 3421 y(for)f(_,)g(e)f(in)h(ipairs\(es\))h(do) 318 3512 y(cite\(e.key,)h(e\))240 3603 y(end)161 3694 y(end)83 3786 y(end)83 3877 y Fl(h)p Fk(using)28 b Fj(cited)g Fk(and)g Fj(first)p 887 3877 24 4 v 30 w(cited)p Fk(,)g(adjust)g (\014elds)g Fj(key)g Fk(and)g Fj(also)p 2037 3877 V 30 w(cited)p 2262 3877 V 29 w(as)g Fm(41b)p Fl(i)125 4002 y Ft(I'v)n(e)f(alw)n(a)n(ys)e(hated)j(B)l Fr(i)n(b)-7 b Ft(T)945 4027 y(E)991 4002 y(X's)28 b(cross-reference)d(feature,)i (but)h(I)g(b)r(eliev)n(e)f(I'v)n(e)g(implemen)n(ted)i(it)f(faithfully) -7 b(.)-282 4118 y Fm(43e)181 b Fl(h)p Fk(fr)l(om)27 b Fj(bibstyle)p Fk(,)i Fj(citekeys)p Fk(,)g(and)f Fj(bibfiles)p Fk(,)h(c)l(ompute)f(and)g(emit)g(the)g(list)g(of)f(entries)i Fm(36b)p Fl(i)p Ft(+)p Fq(\021)423 b Fm(\(32\))48 b Ff(/)12 b Fm(43d)48 b(44a)13 b Ff(.)83 4209 y Fj (bibtex.do_crossrefs\(citations)q(,)45 b(find_entry\))1908 5400 y Ft(43)p eop end %%Page: 44 44 TeXDict begin 44 43 bop 125 83 a Ft(With)34 b(the)g(en)n(tries)f (computed,)i(there)e(are)f(t)n(w)n(o)h(w)n(a)n(ys)f(to)h(emit:)50 b(as)32 b(another)h(B)l Fr(i)n(b)-7 b Ft(T)2835 108 y(E)2881 83 y(X)34 b(\014le)g(or)e(as)h(required)g(b)n(y)g(the)0 183 y(st)n(yle)28 b(\014le.)39 b(So)28 b(that)g(w)n(e)g(can)g(read)f (from)h Fs(bblname)e Ft(b)r(efore)i(writing)f(to)i(it,)f(the)h(op)r (ening)f(of)g Fs(bbl)f Ft(is)h(carefully)g(dela)n(y)n(ed)f(to)0 282 y(this)h(p)r(oin)n(t.)-286 399 y Fm(44a)181 b Fl(h)p Fk(fr)l(om)27 b Fj(bibstyle)p Fk(,)i Fj(citekeys)p Fk(,)g(and)f Fj(bibfiles)p Fk(,)h(c)l(ompute)f(and)g(emit)g(the)g(list)g(of)f (entries)i Fm(36b)p Fl(i)p Ft(+)p Fq(\021)631 b Fm(\(32\))48 b Ff(/)12 b Fm(43e)83 490 y Fl(h)p Fk(emit)27 b(warnings)i(for)e (entries)i(in)e Fj(citations)j Fm(44c)p Fl(i)83 581 y Fj(local)40 b(bbl)g(=)g(bblname)h(==)e('-')h(and)g(io.stdout)h(or)f (open\(bblname,)i('w'\))83 672 y(if)e(bib_out)h(then)161 764 y(bibtex.emit\(bbl,)i(preamble,)f(citations\))83 855 y(else)161 946 y(bibstyle.emit\(bbl,)i(preamble,)d(citations\))83 1038 y(end)83 1129 y(if)f(bblname)h(~=)e('-')h(then)g(bbl:close\(\))i (end)125 1254 y Ft(Here's)27 b(a)g(function)h(to)f(emit)i(a)e(list)h (of)f(citations)g(as)g(B)l Fr(i)n(b)-7 b Ft(T)1968 1279 y(E)2014 1254 y(X)28 b(source.)-290 1370 y Fm(44b)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2290 b Fm(\(27b\))48 b Ff(/)12 b Fm(32)48 b(45a)13 b Ff(.)83 1461 y Fj(bibtex.doc.emit)43 b(=)161 1553 y('outfile)f(*)d(string)i(list)f(*)f(entry)i(list)f(->)f (unit)h(--)g(write)h(citations)g(in)e(.bib)i(format')83 1644 y(function)g(bibtex.emit\(bbl,)i(preamble,)e(citations\))161 1735 y(local)g(warned)f(=)g(false)161 1826 y(if)g(preamble[1])i(then) 240 1918 y(bbl:write\('@preamble{\\n'\))240 2009 y(for)e(i)f(=)h(1,)f (table.getn\(preamble\))44 b(do)318 2100 y(bbl:write\(string.format\(') 85 b(\045s)39 b("\045s"\\n',)i(i)f(>)f(1)h(and)g('#')f(or)h(')g(',)f (preamble[i]\)\))240 2192 y(end)240 2283 y(bbl:write\('}\\n\\n'\))161 2374 y(end)161 2466 y(for)h(_,)g(e)g(in)f(ipairs\(citations\))k(do)240 2557 y(local)d(also)g(=)g(e.also_cited_as)240 2648 y(if)g(also)g(and)g (table.getn\(also\))j(>)c(0)g(then)318 2740 y(for)h(_,)g(k)f(in)h (ipairs\(e.also_cited_as)k(or)c({)f(}\))h(do)397 2831 y(bbl:write\(string.format\('@\045s{\045)q(s,)45 b (crossref={\045s}}\\n',)f(e.type,)c(k,)g(e.key\)\))318 2922 y(end)318 3014 y(if)g(not)g(warned)h(then)397 3105 y(warned)f(=)g(true)397 3196 y(bibwarnf\("Warning:)j(some)d(entries)h (\(such)f(as)g(\045s\))g(are)g(cited)g(with)g(multiple)i(keys;\\n"..) 475 3288 y(")79 b(in)40 b(the)g(emitted)g(.bib)h(file,)f(these)g (entries)h(are)f(duplicated)h(\(using)g(crossref\)\\n",)750 3379 y(e.key\))318 3470 y(end)240 3562 y(end)240 3653 y(emit_tkf.bib\(bbl,)i(e.type,)e(e.key,)f(e.fields\))161 3744 y(end)83 3836 y(end)-282 3993 y Fm(44c)181 b Fl(h)p Fk(emit)27 b(warnings)i(for)e(entries)i(in)e Fj(citations)j Fm(44c)p Fl(i)p Fq(\021)2161 b Fm(\(44a\))83 4085 y Fj(for)40 b(_,)g(e)f(in)h(ipairs\(citations\))j(do)161 4176 y(if)d(warnings[e])i (then)240 4267 y(for)e(_,)g(w)f(in)h(ipairs\(warnings[e]\))j(do)d (emit_warning\(unpack\(w\)\))k(end)161 4359 y(end)83 4450 y(end)1908 5400 y Ft(44)p eop end %%Page: 45 45 TeXDict begin 45 44 bop 0 83 a Fn(3.8)112 b(Cross-reference)0 236 y Ft(If)31 b(an)g(en)n(try)f(con)n(tains)g(a)g Fs(crossref)e Ft(\014eld,)j(that)g(\014eld)h(is)e(used)h(as)f(a)g(k)n(ey)g(to)h (\014nd)g(the)g(paren)n(t,)g(and)g(the)g(en)n(try)f(inherits)0 336 y(missing)d(\014elds)h(from)f(the)h(paren)n(t.)125 436 y(If)e(the)h(paren)n(t)f(is)g(cross-referenced)e(su\016cien)n(tly)i (often)g(\(i.e.,)i(more)d(than)i Fs(min)p 2635 436 27 4 v 30 w(crossref)c Ft(times\),)k(it)g(ma)n(y)e(b)r(e)i(added)0 535 y(to)g(the)h(citation)f(list,)h(in)g(whic)n(h)f(case)g(the)h(st)n (yle)f(\014le)g(kno)n(ws)f(what)i(to)f(do)g(with)h(the)g Fs(crossref)c Ft(\014eld.)37 b(But)28 b(if)g(the)g(paren)n(t)0 635 y(is)f(not)h(cited)g(su\016cien)n(tly)g(often,)g(it)g(disapp)r (ears,)e(and)h(do)h(do)r(es)f(the)h Fs(crossref)c Ft(\014eld.)-286 751 y Fm(45a)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2247 b Fm(\(27b\))48 b Ff(/)12 b Fm(44b)48 b(46b)13 b Ff(.)83 842 y Fj (bibtex.doc.do_crossrefs)44 b(=)c("citation)h(list)f(->)g(unit)g(#)g (add)g(crossref'ed)h(fields)g(in)f(place")83 934 y(function)h (bibtex.do_crossrefs\(citations)q(,)k(find_entry\))161 1025 y(local)c(map)79 b(=)39 b({)h(})f(---)h(key)g(to)g(entry)g(\(on)g (citation)h(list\))161 1116 y(local)g(xmap)f(=)f({)h(})f(---)h(key)g (to)g(entry)g(\(xref'd)h(only\))161 1208 y(local)g(xref_count)g(=)f({)f (})h(--)f(entry)i(->)e(number)i(of)f(times)g(xref'd)161 1299 y Fl(h)p Fk(make)28 b Fj(map)g Fk(map)g(lower-c)l(ase)i(keys)e(in) f Fj(citations)j Fk(to)e(their)g(entries)h Fm(45b)p Fl(i)161 1390 y Fj(for)40 b(i)g(=)f(1,)h(table.getn\(citations\))k(do)240 1482 y(local)c(c)g(=)f(citations[i])240 1573 y(if)h(c.fields.crossref)j (then)318 1664 y(local)e(lowref)f(=)g(string.lower\(c.fields.crossref)q (\))318 1756 y(local)h(parent)f(=)g(map[lowref])i(or)d(xmap[lowref])318 1847 y(if)h(not)g(parent)h(and)e(find_entry)j(then)397 1938 y(parent)e(=)g(find_entry\(lowref\))397 2030 y(xmap[lowref])i(=)d (parent)318 2121 y(end)318 2212 y(if)h(not)g(parent)h(then)397 2304 y(biberrorf\("Entry)i(\045s)c(cross-references)k(to)d(\045s,)g (but)g(I)f(can't)i(find)f(\045s",)789 2395 y(c.key,)h (c.fields.crossref,)i(c.fields.crossref\))397 2486 y(c.fields.crossref) g(=)c(nil)318 2577 y(else)397 2669 y(xref_count[parent])k(=)d (\(xref_count[parent])j(or)d(0\))g(+)f(1)397 2760 y(local)h(fields)h(=) e(c.fields)397 2851 y(fields.crossref)j(=)e(parent.key)h(--)f(force)g (a)g(case)g(match!)397 2943 y(for)g(k,)f(v)h(in)g (pairs\(parent.fields\))j(do)d(--)g(inherit)h(field)f(if)g(missing)475 3034 y(fields[k])i(=)d(fields[k])i(or)f(v)397 3125 y(end)318 3217 y(end)240 3308 y(end)161 3399 y(end)161 3491 y Fl(h)p Fk(add)28 b(oft-cr)l(ossr)l(ef)8 b('d)30 b(entries)f(fr)l(om)e Fj(xmap)i Fk(to)f(the)g(list)f(in)h Fj(citations)h Fm(45c)p Fl(i)161 3582 y(h)p Fk(r)l(emove)g Fj(crossref)g Fk(\014elds)f(for)g (entries)h(with)e(seldom-cr)l(ossr)l(ef)8 b('d)30 b(p)l(ar)l(ents)g Fm(46a)p Fl(i)83 3673 y Fj(end)-290 3831 y Fm(45b)181 b Fl(h)p Fk(make)28 b Fj(map)g Fk(map)g(lower-c)l(ase)h(keys)g(in)e Fj(citations)i Fk(to)f(their)h(entries)g Fm(45b)p Fl(i)p Fq(\021)1451 b Fm(\(45a\))83 3922 y Fj(for)40 b(i)f(=)h(1,)g (table.getn\(citations\))k(do)161 4014 y(local)d(c)e(=)h(citations[i]) 161 4105 y(local)h(key)f(=)f(string.lower\(c.key\))161 4196 y(map[key])j(=)d(map[key])i(or)f(c)83 4288 y(end)-282 4462 y Fm(45c)181 b Fl(h)p Fk(add)28 b(oft-cr)l(ossr)l(ef)8 b('d)29 b(entries)g(fr)l(om)f Fj(xmap)g Fk(to)g(the)h(list)e(in)g Fj(citations)j Fm(45c)p Fl(i)p Fq(\021)1460 b Fm(\(45a\))83 4553 y Fj(for)40 b(_,)g(e)f(in)h(pairs\(xmap\))h(do)f(--)g(includes)h (only)f(missing)h(entries)161 4645 y(if)f(xref_count[e])i(>=)e (min_crossrefs)i(then)240 4736 y(table.insert\(citations,)i(e\))161 4827 y(end)83 4919 y(end)1908 5400 y Ft(45)p eop end %%Page: 46 46 TeXDict begin 46 45 bop -286 83 a Fm(46a)181 b Fl(h)p Fk(r)l(emove)29 b Fj(crossref)g Fk(\014elds)f(for)f(entries)i(with)f (seldom-cr)l(ossr)l(ef)8 b('d)30 b(p)l(ar)l(ents)f Fm(46a)p Fl(i)q Fq(\021)1293 b Fm(\(45a\))83 174 y Fj(for)40 b(i)f(=)h(1,)g (table.getn\(citations\))k(do)161 266 y(local)d(c)e(=)h(citations[i]) 161 357 y(if)g(c.fields.crossref)j(then)240 448 y(local)d(parent)h(=)e (xmap[string.lower\(c.fields.c)q(ross)q(ref\))q(])240 540 y(if)h(parent)g(and)g(xref_count[parent])j(<)d(min_crossrefs)i (then)318 631 y(c.fields.crossref)h(=)d(nil)240 722 y(end)161 814 y(end)83 905 y(end)0 1179 y Fn(3.9)112 b(The)38 b(query)g(engine)g (\(i.e.,)g(the)f(p)s(oin)m(t)h(of)f(it)h(all\))0 1332 y Ft(The)26 b(query)e(language)g(is)i(describ)r(ed)f(in)h(the)g(man)f (page)g(for)g Fs(nbibtex)p Ft(.)33 b(Its)26 b(implemen)n(tation)f(is)h (divided)g(in)n(to)f(t)n(w)n(o)g(parts:)0 1432 y(the)33 b(in)n(ternal)g(predicates)f(whic)n(h)h(are)f(comp)r(osed)h(to)g(form)g (a)f(query)h(predicate,)h(and)f(the)g(parser)f(that)h(tak)n(es)f(a)h (string)0 1531 y(and)d(pro)r(duces)f(a)h(query)f(predicate.)44 b(F)-7 b(unction)31 b Fs(matchq)c Ft(is)j(declared)g Fs(local)e Ft(ab)r(o)n(v)n(e)g(and)i(is)g(the)h(only)f(function)g (visible)0 1631 y(outside)d(this)h(blo)r(c)n(k.)-290 1747 y Fm(46b)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2254 b Fm(\(27b\))49 b Ff(/)12 b Fm(45a)48 b(50a)13 b Ff(.)83 1839 y Fj(do)161 1930 y(if)40 b(not)g(boyer_moore)i(then)240 2021 y(require)f ('boyer-moore')161 2113 y(end)161 2204 y(local)g(bm)f(=)f(boyer_moore) 161 2295 y(local)i(compile)g(=)e(bm.compilenc)161 2386 y(local)i(search)80 b(=)39 b(bm.matchnc)161 2569 y(--)h(type)g (predicate)i(=)d(type)h(*)g(field)g(table)g(->)g(bool)161 2660 y(--)g(val)g(match)119 b(:)39 b(field)i(*)e(string)i(->)e (predicate)161 2752 y(--)h(val)g(author)80 b(:)39 b(string)i(->)f (predicate)161 2843 y(--)g(val)g(matchty)h(:)e(string)i(->)f(predicate) 161 2934 y(--)g(val)g(andp)158 b(:)39 b(predicate)j(option)e(*)g (predicate)h(option)g(->)e(predicate)i(option)161 3026 y(--)f(val)g(orp)197 b(:)39 b(predicate)j(option)e(*)g(predicate)h (option)g(->)e(predicate)i(option)161 3117 y(--)f(val)g(matchq)80 b(:)39 b(string)i(->)f(predicate)h(---)f(compile)h(query)f(string)161 3300 y Fl(h)p Fk(de\014nitions)29 b(of)e(query-pr)l(e)l(dic)l(ate)k (functions)d Fm(47a)p Fl(i)161 3482 y(h)p Fk(de\014nition)g(of)g Fj(matchq)p Fk(,)g(the)g(query)h(c)l(ompiler)f Fm(48b)p Fl(i)161 3574 y(h)p Fk(de\014nition)g(of)g Fj(query)p Fk(,)g(use)l(d)g(to)g(se)l(ar)l(ch)i(a)d(list)h(of)f(entries)i Fm(43b)p Fl(i)83 3665 y Fj(end)1908 5400 y Ft(46)p eop end %%Page: 47 47 TeXDict begin 47 46 bop 0 83 a Fu(3.9.1)94 b(Query)32 b(predicates)0 236 y Ft(The)26 b(common)g(case)f(is)h(a)g(predicate)g (for)g(a)f(named)h(\014eld.)37 b(W)-7 b(e)27 b(also)e(ha)n(v)n(e)g (some)h(sp)r(ecial)f(syn)n(tax)h(for)f(\\all)h(\014elds")g(and)g(the)0 336 y(B)l Fr(i)n(b)-7 b Ft(T)165 361 y(E)211 336 y(X)28 b(\\t)n(yp)r(e,")f(whic)n(h)h(is)f(not)h(a)f(\014eld.)-286 452 y Fm(47a)181 b Fl(h)p Fk(de\014nitions)28 b(of)f(query-pr)l(e)l (dic)l(ate)32 b(functions)c Fm(47a)p Fl(i)q Fq(\021)1973 b Fm(\(46b\))49 b(47b)13 b Ff(.)83 543 y Fj(local)40 b(matchty)83 635 y(local)g(function)h(match\(field,)h(string\))161 726 y(if)e(string)h(==)e('')h(then)g(return)h(nil)f(end)161 817 y(local)h(pat)f(=)f(compile\(string\))161 909 y(if)h(field)h(==)e ('*')h(then)240 1000 y(return)h(function)g(\(t,)e(fields\))593 1091 y(for)h(_,)g(v)f(in)h(pairs\(fields\))i(do)e(if)f(search\(pat,)j (v\))e(then)g(return)g(true)h(end)e(end)515 1183 y(end)161 1274 y(elseif)i(field)f(==)g('[type]')h(then)240 1365 y(return)g(matchty\(string\))161 1457 y(else)240 1548 y(return)g(function)g(\(t,)e(fields\))i(return)g(search\(pat,)h (fields[field])g(or)d(''\))h(end)161 1639 y(end)83 1731 y(end)125 1855 y Ft(Here's)27 b(a)g(t)n(yp)r(e)h(matc)n(her.)-290 1971 y Fm(47b)181 b Fl(h)p Fk(de\014nitions)28 b(of)f(query-pr)l(e)l (dic)l(ate)32 b(functions)c Fm(47a)p Fl(i)q Ft(+)o Fq(\021)1717 b Fm(\(46b\))49 b Ff(/)12 b Fm(47a)48 b(47c)13 b Ff(.)83 2063 y Fj(function)41 b(matchty\(string\))161 2154 y(if)f(string)h(==)e ('')h(then)g(return)h(nil)f(end)161 2245 y(local)h(pat)f(=)f (compile\(string\))161 2337 y(return)i(function)g(\(t,)f(fields\))h (return)f(search\(pat,)i(t\))e(end)83 2428 y(end)125 2553 y Ft(W)-7 b(e)28 b(mak)n(e)e(a)h(sp)r(ecial)h(case)e(of)i Fs(author)d Ft(b)r(ecause)i(it)h(really)f(means)g(\\author)f(or)h (editor.")-282 2669 y Fm(47c)181 b Fl(h)p Fk(de\014nitions)28 b(of)f(query-pr)l(e)l(dic)l(ate)32 b(functions)c Fm(47a)p Fl(i)q Ft(+)o Fq(\021)1706 b Fm(\(46b\))48 b Ff(/)12 b Fm(47b)48 b(47d)13 b Ff(.)83 2760 y Fj(local)40 b(function)h (author\(string\))161 2851 y(if)f(string)h(==)e('')h(then)g(return)h (nil)f(end)161 2943 y(local)h(pat)f(=)f(compile\(string\))161 3034 y(return)i(function)g(\(t,)f(fields\))515 3125 y(return)g (search\(pat,)i(fields.author)g(or)e(fields.editor)i(or)e(''\))436 3217 y(end)83 3308 y(end)125 3433 y Ft(W)-7 b(e)28 b(conjoin)f(and)h (disjoin)g(predicates,)f(b)r(eing)h(careful)f(to)h(use)g(tail)f(calls)h (\(not)g Fs(and)e Ft(and)i Fs(or)p Ft(\))f(in)i(order)d(to)i(sa)n(v)n (e)e(stac)n(k)0 3532 y(space.)-290 3648 y Fm(47d)181 b Fl(h)p Fk(de\014nitions)28 b(of)f(query-pr)l(e)l(dic)l(ate)32 b(functions)c Fm(47a)p Fl(i)q Ft(+)o Fq(\021)1717 b Fm(\(46b\))49 b Ff(/)12 b Fm(47c)48 b(48a)13 b Ff(.)83 3740 y Fj(local)40 b(function)h(andp\(p,)g(q\))161 3831 y(--)f(associate)h(to)f(right)g (for)g(constant)h(stack)g(space)161 3922 y(if)f(not)g(p)g(then)240 4014 y(return)h(q)161 4105 y(elseif)g(not)f(q)f(then)240 4196 y(return)i(p)161 4288 y(else)240 4379 y(return)g(function)g (\(t,f\))f(if)g(p\(t,f\))g(then)g(return)h(q\(t,f\))g(end)e(end)161 4470 y(end)83 4562 y(end)1908 5400 y Ft(47)p eop end %%Page: 48 48 TeXDict begin 48 47 bop -286 83 a Fm(48a)181 b Fl(h)p Fk(de\014nitions)28 b(of)f(query-pr)l(e)l(dic)l(ate)32 b(functions)c Fm(47a)p Fl(i)q Ft(+)o Fq(\021)1909 b Fm(\(46b\))49 b Ff(/)12 b Fm(47d)83 174 y Fj(local)40 b(function)h(orp\(p,)g(q\))161 266 y(--)f(associate)h(to)f(right)g(for)g(constant)h(stack)g(space)161 357 y(if)f(not)g(p)g(then)240 448 y(return)h(q)161 540 y(elseif)g(not)f(q)f(then)240 631 y(return)i(p)161 722 y(else)240 814 y(return)g(function)g(\(t,f\))f(if)g(p\(t,f\))g(then)g (return)h(true)f(else)g(return)h(q\(t,f\))f(end)g(end)161 905 y(end)83 996 y(end)0 1254 y Fu(3.9.2)94 b(The)32 b(query)g(compiler)0 1407 y Ft(The)c(function)g Fs(matchq)d Ft(tak)n(es)i(the)h(syn)n(tax)e(explained)i(in)f(the)h(man)g(page)f (and)g(pro)r(duces)g(a)g(predicate.)-290 1523 y Fm(48b)181 b Fl(h)p Fk(de\014nition)28 b(of)f Fj(matchq)p Fk(,)h(the)h(query)g(c)l (ompiler)e Fm(48b)p Fl(i)q Fq(\021)2134 b Fm(\(46b\))83 1614 y Fj(function)41 b(matchq\(query\))161 1706 y(local)g(find)f(=)f (string.find)161 1797 y(local)i(parts)f(=)g(split\(query,)i('\045:'\)) 161 1888 y(local)f(p)e(=)h(nil)161 1980 y(if)g(parts[1])h(and)f(not)g (find\(parts[1],)i('='\))f(then)240 2071 y Fl(h)p Fk(add)28 b(to)g Fj(p)g Fk(a)f(match)i(for)e Fj(parts[1])i Fk(as)f(author)i Fm(48c)p Fl(i)240 2162 y Fj(table.remove\(parts,)43 b(1\))240 2254 y(if)d(parts[1])h(and)f(not)f(find\(parts[1],)k('='\))d(then)318 2345 y Fl(h)p Fk(add)28 b(to)g Fj(p)g Fk(a)g(match)g(for)g Fj(parts[1])h Fk(as)f(title)g(or)g(ye)l(ar)g Fm(49a)p Fl(i)318 2436 y Fj(table.remove\(parts,)44 b(1\))318 2528 y(if)c(parts[1])h(and)f(not)g(find\(parts[1],)i('='\))e(then)397 2619 y Fl(h)p Fk(add)28 b(to)g Fj(p)g Fk(a)f(match)i(for)e Fj(parts[1])i Fk(as)f(typ)l(e)h(or)f(ye)l(ar)h Fm(49b)p Fl(i)397 2710 y Fj(table.remove\(parts,)43 b(1\))318 2802 y(end)240 2893 y(end)161 2984 y(end)161 3076 y(for)d(_,)g(part)g (in)g(ipairs\(parts\))i(do)240 3167 y(if)e(not)g(find\(part,)h('='\))f (then)318 3258 y(biberrorf\('bad)j(query)d(\045q)g(---)g(late)g(specs)g (need)g(=)g(sign',)g(query\))240 3350 y(else)318 3441 y(local)h(_,)e(_,)h(field,)h(words)f(=)g(find\(part,)h ('^\(.*\)=\(.*\)$'\))318 3532 y(assert\(field)h(and)e(words,)h('bug)f (in)g(query)g(parsing'\))318 3624 y Fl(h)p Fk(add)28 b(to)g Fj(p)g Fk(a)g(match)g(for)g Fj(words)g Fk(as)g Fj(field)h Fm(49c)p Fl(i)240 3715 y Fj(end)161 3806 y(end)161 3897 y(if)40 b(not)g(p)g(then)240 3989 y(bibwarnf\('empty)j (query---matches)f(everything\\n'\))240 4080 y(return)f(function\(\))g (return)g(true)f(end)161 4171 y(else)240 4263 y(return)h(p)161 4354 y(end)83 4445 y(end)28 4570 y Ft(Here's)27 b(where)g(an)g(unnamed) h(k)n(ey)f(defaults)h(to)f(author)g(or)f(editor.)-282 4686 y Fm(48c)181 b Fl(h)p Fk(add)28 b(to)g Fj(p)g Fk(a)f(match)i(for)e Fj(parts[1])j Fk(as)e(author)h Fm(48c)p Fl(i)p Fq(\021)2103 b Fm(\(48b\))83 4778 y Fj(for)40 b(_,)g(word)g(in)f (ipairs\(split\(parts[1],)45 b('-'\)\))40 b(do)161 4869 y(p)g(=)f(andp\(author\(word\),)44 b(p\))83 4960 y(end)1908 5400 y Ft(48)p eop end %%Page: 49 49 TeXDict begin 49 48 bop -286 83 a Fm(49a)181 b Fl(h)p Fk(add)28 b(to)g Fj(p)g Fk(a)f(match)i(for)e Fj(parts[1])j Fk(as)e(title)f(or)h(ye)l(ar)h Fm(49a)p Fl(i)q Fq(\021)1919 b Fm(\(48b\))83 174 y Fj(local)40 b(field,)h(words)f(=)g (find\(parts[1],)i('\045D'\))f(and)e('title')i(or)f('year',)h(parts[1]) 83 266 y Fl(h)p Fk(add)28 b(to)g Fj(p)g Fk(a)f(match)i(for)e Fj(words)i Fk(as)f Fj(field)g Fm(49c)p Fl(i)-290 440 y Fm(49b)181 b Fl(h)p Fk(add)28 b(to)g Fj(p)g Fk(a)f(match)i(for)e Fj(parts[1])j Fk(as)e(typ)l(e)g(or)g(ye)l(ar)h Fm(49b)p Fl(i)q Fq(\021)1911 b Fm(\(48b\))83 531 y Fj(if)40 b(find\(parts[1],)i ('\045D'\))e(then)161 623 y(local)h(ty)f(=)f(nil)161 714 y(for)h(_,)g(word)g(in)g(ipairs\(split\(parts[1],)k('-'\)\))c(do) 240 805 y(ty)g(=)f(orp\(matchty\(word\),)k(ty\))161 897 y(end)161 988 y(p)d(=)f(andp\(p,)i(ty\))f(---)g(check)g(type)h(last)f (for)g(efficiency)83 1079 y(else)161 1171 y(for)g(_,)g(word)g(in)g (ipairs\(split\(parts[1],)k('-'\)\))c(do)240 1262 y(p)f(=)h(andp\(p,)h (match\('year',)h(word\)\))e(--)g(check)g(year)h(last)f(for)g (efficiency)161 1353 y(end)83 1445 y(end)125 1586 y Ft(There)27 b(could)g(b)r(e)h(lots)f(of)h(matc)n(hes)f(on)g(a)g(y)n(ear,)g(so)f(w)n (e)i(c)n(hec)n(k)e(y)n(ears)g(last.)-282 1702 y Fm(49c)181 b Fl(h)p Fk(add)28 b(to)g Fj(p)g Fk(a)f(match)i(for)e Fj(words)i Fk(as)f Fj(field)g Fm(49c)p Fl(i)q Fq(\021)2112 b Fm(\(48b)25 b(49a\))83 1793 y Fj(for)40 b(_,)g(word)g(in)f (ipairs\(split\(words,)44 b('-'\)\))c(do)161 1885 y(if)g(field)h(==)e ('year')i(then)240 1976 y(p)e(=)h(andp\(p,)h(match\(field,)h(word\)\)) 161 2067 y(else)240 2159 y(p)d(=)h(andp\(match\(field,)j(word\),)e(p\)) 161 2250 y(end)83 2341 y(end)0 2599 y Fn(3.10)112 b(P)m(ath)37 b(searc)m(h)h(and)h(other)e(system-dep)s(enden)m(t)j(stu\013)0 2752 y Ft(T)-7 b(o)26 b(\014nd)g(a)g(bib)g(\014le,)h(I)f(rely)f(on)h (the)g Fs(kpsewhich)c Ft(program,)j(whic)n(h)h(is)f(t)n(ypically)h (found)g(on)g(Unix)g(T)3143 2770 y(E)3189 2752 y(X)h(installations,)e (and)0 2851 y(whic)n(h)j(should)f(guaran)n(tee)f(to)h(\014nd)h(the)g (same)f(bib)h(\014les)g(as)f(normal)f(bibtex.)-290 2968 y Fm(49d)181 b Fl(h)p Fk(Lua)28 b(utility)f(functions)i Fm(27d)p Fl(i)p Ft(+)p Fq(\021)2323 b Fm(\(27b\))49 b Ff(/)12 b Fm(40c)48 b(50b)13 b Ff(.)83 3059 y Fj(assert\(io.popen\))83 3150 y(local)40 b(function)h(capture\(cmd,)h(raw\))161 3242 y(local)f(f)e(=)h(assert\(io.popen\(cmd,)k('r'\)\))161 3333 y(local)d(s)e(=)h(assert\(f:read\('*a'\)\))161 3424 y(assert\(f:close\(\)\))83 b(---)40 b(can't)g(get)g(an)g(exit)g(code) 161 3516 y(if)g(raw)g(then)g(return)h(s)e(end)161 3607 y(s)h(=)f(string.gsub\(s,)k('^\045s+',)e(''\))161 3698 y(s)f(=)f(string.gsub\(s,)k('\045s+$',)e(''\))161 3790 y(s)f(=)f(string.gsub\(s,)k('[\\n\\r]+',)e(')f('\))161 3881 y(return)h(s)83 3972 y(end)1908 5400 y Ft(49)p eop end %%Page: 50 50 TeXDict begin 50 49 bop 125 83 a Ft(F)-7 b(unction)30 b Fs(bibpath)e Ft(is)i(normally)f(called)g(on)h(a)g(bibname)g(in)h(a)e (L)2206 66 y Fo(A)2243 83 y Ft(T)2289 101 y(E)2335 83 y(X)i(\014le,)g(but)f(b)r(ecause)g(a)g(bibname)g(ma)n(y)g(also)f(b)r(e) 0 183 y(giv)n(en)e(on)g(the)h(command)f(line,)h(w)n(e)f(add)h Fs(.bib)e Ft(only)h(if)h(not)g(already)e(presen)n(t.)36 b(Also,)27 b(b)r(ecause)h(w)n(e)f(can)-286 299 y Fm(50a)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2254 b Fm(\(27b\))49 b Ff(/)12 b Fm(46b)48 b(50c)13 b Ff(.)83 390 y Fj(bibtex.doc.bibpath)43 b(=)d('string)h(->)e(string)i(#)e(from)h(\\\\bibliography)j(name,)d (find)g(pathname)h(of)f(file')83 482 y(function)h (bibtex.bibpath\(bib\))161 573 y(if)f(find\(bib,)h('/'\))g(then)240 664 y(local)f(f,)g(msg)g(=)f(io.open\(bib\))240 756 y(if)h(not)g(f)f (then)318 847 y(return)i(nil,)f(msg)240 938 y(else)318 1029 y(f:close\(\))318 1121 y(return)h(bib)240 1212 y(end)161 1303 y(else)240 1395 y(if)f(not)g(find\(bib,)h('\045.bib$'\))g(then)318 1486 y(bib)f(=)g(bib)g(..)f('.bib')240 1577 y(end)240 1669 y(local)h(pathname)h(=)f(capture\('kpsewhich)j(')d(..)f(bib\))240 1760 y(if)h(string.len\(pathname\))j(>)d(1)f(then)318 1851 y(return)i(pathname)240 1943 y(else)318 2034 y(return)g(nil,)f ('kpsewhich)i(cannot)e(find)g(')g(..)f(bib)240 2125 y(end)161 2217 y(end)83 2308 y(end)0 2607 y Fv(4)135 b(Implemen)l(tation)47 b(of)57 b Fh(nbibfind)0 2806 y Fn(4.1)112 b(Output)38 b(formats)g(for)f Fw(B)-5 b Fc(i)m(b)d Fw(T)1428 2836 y(E)1483 2806 y(X)38 b Fn(en)m(tries)0 2959 y Ft(W)-7 b(e)26 b(can)g(emit)g(a)f(B)l Fr(i)n(b)-7 b Ft(T)711 2984 y(E)758 2959 y(X)26 b(en)n(try)f(in)h(an)n(y)f(of)h(three)f (formats:)36 b Fs(bib)p Ft(,)25 b Fs(terse)p Ft(,)f(and)h Fs(full)p Ft(.)35 b(An)26 b(emitter)g(tak)n(es)f(as)g(argumen)n(ts)0 3059 y(the)j(t)n(yp)r(e,)g(k)n(ey)-7 b(,)27 b(and)g(\014elds)h(of)g (the)f(en)n(try)-7 b(,)28 b(and)f(optionally)g(the)h(name)f(of)h(the)g (\014le)f(the)h(en)n(try)f(came)h(from.)-290 3175 y Fm(50b)181 b Fl(h)p Fk(Lua)28 b(utility)f(functions)i Fm(27d)p Fl(i)p Ft(+)p Fq(\021)2316 b Fm(\(27b\))48 b Ff(/)12 b Fm(49d)48 b(52b)13 b Ff(.)83 3266 y Fj(local)40 b(emit_tkf)h(=)f({)f(})125 3391 y Ft(The)27 b(simplest)h(en)n(try)f(is)g(legitimate)h(B)l Fr(i)n(b)-7 b Ft(T)1472 3416 y(E)1518 3391 y(X)28 b(source:)-282 3507 y Fm(50c)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2290 b Fm(\(27b\))48 b Ff(/)12 b Fm(50a)48 b(51)13 b Ff(.)83 3598 y Fj(function)41 b(emit_tkf.bib\(outfile,)j(type,)c(key,)h(fields\))161 3690 y(outfile:write\('@',)j(type,)c('{',)g(key,)g(',\\n'\))161 3781 y(for)g(k,)g(v)g(in)f(pairs\(fields\))j(do)240 3872 y(outfile:write\(')82 b(',)39 b(k,)h(')g(=)f({',)h(v,)g('},\\n'\))161 3964 y(end)161 4055 y(outfile:write\('}\\n\\n'\))83 4146 y(end)1908 5400 y Ft(50)p eop end %%Page: 51 51 TeXDict begin 51 50 bop 125 83 a Ft(F)-7 b(or)28 b(the)h(other)f(t)n(w) n(o)g(en)n(tries,)g(w)n(e)h(devise)f(a)g(string)h(format.)39 b(In)29 b(principle,)g(w)n(e)g(could)f(go)g(with)h(an)g(ASCI)r(I)g (form)g(of)f(a)0 183 y(full-blo)n(wn)e(st)n(yle,)f(but)i(since)e(the)i (purp)r(ose)e(is)h(to)f(iden)n(tify)h(the)h(en)n(try)e(in)h(relativ)n (ely)e(few)j(c)n(haracters,)c(it)k(seems)e(su\016cien)n(t)0 282 y(to)j(spit)g(out)g(the)g(author,)g(y)n(ear,)e(title,)j(and)f(p)r (ossibly)f(the)i(source.)36 b(\\F)-7 b(ull")28 b(output)h(sho)n(ws)d (the)j(whole)e(string;)h(\\terse")e(is)0 382 y(just)i(the)g(\014rst)g (line.)-251 498 y Fm(51)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2294 b Fm(\(27b\))48 b Ff(/)12 b Fm(50c)48 b(53)13 b Ff(.)83 589 y Fj(do)161 681 y(local)41 b(function)g(bibstring\(type,)i(key,)d (fields,)g(bib\))240 772 y Fl(h)p Fk(de\014ne)28 b(lo)l(c)l(al)g Fj(format)p 905 772 24 4 v 29 w(lab)p 1051 772 V 29 w(names)h Fk(as)f(for)f(a)h(biblio)l(gr)l(aphy)h(lab)l(el)e Fm(52a)p Fl(i)240 863 y Fj(local)40 b(names)h(=)e (format_lab_names\(fields.autho)q(r\))45 b(or)789 955 y(format_lab_names\(fields.edito)q(r\))g(or)789 1046 y(fields.key)d(or)d(fields.organization)44 b(or)c('????')240 1137 y(local)g(year)g(=)g(fields.year)240 1229 y(local)g(lbl)g(=)g (names)g(..)g(\(year)g(and)g(')f(')h(..)g(year)g(or)f(''\))240 1320 y(local)h(title)h(=)e(fields.title)j(or)e('????')240 1411 y(if)g(bib)g(then)318 1503 y(key)g(=)g(string.gsub\(bib,)j('.*/',) d(''\))g(..)g(':)f(')h(..)g(key)240 1594 y(end)240 1685 y(local)g(answer)h(=)318 1777 y(bib)f(and)318 1868 y (string.format\('\045-25s)k(=)c(\045s:)g(\045s',)g(key,)g(lbl,)g (title\))h(or)318 1959 y(string.format\('\045-21s)j(=)c(\045s:)g (\045s',)g(key,)g(lbl,)g(title\))240 2051 y(local)g(where)h(=)e (fields.booktitle)k(or)d(fields.journal)240 2142 y(if)g(where)g(then)g (answer)h(=)e(answer)i(..)e(',)h(in)g(')f(..)h(where)g(end)240 2233 y(answer)h(=)e(string.gsub\(answer,)44 b('\045~',)c(')f('\))240 2325 y(for)h(_,)g(cs)f(in)h(ipairs)g({)g('texttt',)h('emph',)g ('textrm',)g('textup')g(})f(do)318 2416 y(answer)h(=)e (string.gsub\(answer,)44 b('\\\\')c(..)g(cs)f(..)h('\045A',)h(''\))240 2507 y(end)240 2599 y(answer)g(=)e(string.gsub\(answer,)44 b('[\045{\045}]',)d(''\))240 2690 y(return)g(answer)161 2781 y(end)161 2964 y(function)h(emit_tkf.terse\(outfile,)i(type,)c (key,)g(fields,)h(bib\))240 3055 y(outfile:write\(truncate\(bibstr)q (ing\(t)q(ype,)46 b(key,)40 b(fields,)h(bib\),)f(80\),)g('\\n'\))161 3147 y(end)161 3329 y(function)i(emit_tkf.full\(outfile,)i(type,)c (key,)g(fields,)h(bib\))240 3421 y(local)f(w)g(=)f (bst.writer\(outfile\))240 3512 y(w:write\(bibstring\(type,)44 b(key,)d(fields,)f(bib\),)h('\\n'\))161 3603 y(end)83 3694 y(end)1908 5400 y Ft(51)p eop end %%Page: 52 52 TeXDict begin 52 51 bop -286 83 a Fm(52a)181 b Fl(h)p Fk(de\014ne)28 b(lo)l(c)l(al)g Fj(format)p 665 83 24 4 v 29 w(lab)p 811 83 V 29 w(names)h Fk(as)f(for)f(a)h(biblio)l(gr)l (aphy)h(lab)l(el)e Fm(52a)p Fl(i)q Fq(\021)1637 b Fm(\(51\))83 174 y Fj(local)40 b(format_lab_names)83 266 y(do)161 357 y(local)h(fmt)f(=)f('{vv)h(}{ll}')161 448 y(local)h(function)g (format_names\(s\))240 540 y(local)f(s)g(=)f (bst.commafy\(bst.format_names)q(\(fmt,)46 b(bst.namesplit\(s\)\)\))240 631 y(return)41 b(\(string.gsub\(s,)h(')e(and)g(others$',)h(')e(et)h (al.'\)\))161 722 y(end)161 814 y(function)i(format_lab_names\(s\))240 905 y(if)e(not)g(s)f(then)h(return)h(s)e(end)240 996 y(local)h(t)g(=)f(bst.namesplit\(s\))240 1088 y(if)h(table.getn\(t\))i (>)d(3)h(then)318 1179 y(return)h(bst.format_name\(fmt,)j(t[1]\))c(..)g (')f(et)h(al.')240 1270 y(else)318 1362 y(return)h(format_names\(s\)) 240 1453 y(end)161 1544 y(end)83 1636 y(end)125 1777 y Ft(F)-7 b(unction)28 b Fs(truncate)c Ft(returns)j(enough)g(of)g(a)h (string)e(to)i(\014t)g(in)g Fs(n)f Ft(columns,)h(with)g(ellipses)f(as)g (needed.)-290 1893 y Fm(52b)181 b Fl(h)p Fk(Lua)28 b(utility)f (functions)i Fm(27d)p Fl(i)p Ft(+)p Fq(\021)2355 b Fm(\(27b\))49 b Ff(/)12 b Fm(50b)47 b(55)13 b Ff(.)83 1984 y Fj(local)40 b(function)h(truncate\(s,)h(n\))161 2076 y(local)f(l)e(=)h (string.len\(s\))161 2167 y(if)g(l)g(<=)f(n)h(then)240 2258 y(return)h(s)161 2350 y(else)240 2441 y(return)g(string.sub\(s,)h (1,)d(n-3\))i(..)e('...')161 2532 y(end)83 2623 y(end)1908 5400 y Ft(52)p eop end %%Page: 53 53 TeXDict begin 53 52 bop 0 83 a Fn(4.2)112 b(Main)39 b(functions)f(for)f Fb(nbibfind)-251 228 y Fm(53)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2325 b Fm(\(27b\))49 b Ff(/)12 b Fm(51)47 b(56)13 b Ff(.)83 319 y Fj(bibtex.doc.run_find)44 b(=)39 b('string)i(list)f(->)g(unit)g (#)f(main)h(program)h(for)f(nbibfind')83 411 y(bibtex.doc.find)j(=)c ('string)i(*)e(string)i(list)f(->)g(entry)g(list')83 593 y(function)h(bibtex.find\(pattern,)j(bibs\))161 685 y(local)d(es)f(=)f({)g(})161 776 y(local)i(p)e(=)h(matchq\(pattern\)) 161 867 y(for)g(_,)g(bib)g(in)g(ipairs\(bibs\))i(do)240 959 y(local)e(rdr)g(=)g(bibtex.open\(bib,)j(bst.months\(\),)f (hold_warning\))240 1050 y(for)e(type,)g(key,)g(fields)h(in)f (entries\(rdr\))i(do)318 1141 y(if)e(type)g(==)g(nil)g(then)397 1233 y(break)318 1324 y(elseif)h(not)f(type)g(then)397 1415 y(io.stderr:write\('Something)45 b(disastrous)c(happened)h(with)e (entry)g(',)g(key,)g('\\n'\))318 1507 y(elseif)h(key)f(==)g(pattern)g (or)g(p\(type,)h(fields\))g(then)397 1598 y Fl(h)p Fk(emit)27 b(held)h(warnings,)g(if)e(any)i Fm(54b)p Fl(i)397 1689 y Fj(table.insert\(es,)43 b({)c(type)h(=)g(type,)g(key)g(=)f(key,)i (fields)f(=)g(fields,)1142 1780 y(bib)g(=)g(table.getn\(bibs\))i(>)e(1) f(and)h(bib)g(}\))318 1872 y(else)397 1963 y(drop_warnings\(\))318 2054 y(end)240 2146 y(end)240 2237 y(rdr:close\(\))161 2328 y(end)161 2420 y(return)h(es)83 2511 y(end)83 2694 y(function)g(bibtex.run_find\(argv\))161 2785 y(local)g(emit)f(=)f (emit_tkf.terse)161 2876 y(while)i(argv[1])g(and)f(find\(argv[1],)i ('^-'\))e(do)240 2968 y(if)g(emit_tkf[string.sub\(argv[1],)45 b(2\)])40 b(then)318 3059 y(emit)h(=)e(emit_tkf[string.sub\(argv[1],)46 b(2\)])240 3150 y(else)318 3242 y(biberrorf\('Unrecognized)f(option)40 b(\045s',)h(argv[1]\))240 3333 y(end)240 3424 y(table.remove\(argv,)i (1\))161 3516 y(end)161 3607 y(if)d(table.getn\(argv\))j(==)d(0)f(then) 240 3698 y(io.stderr:write\(string.format)q(\('Usa)q(ge:)46 b(\045s)39 b([-bib|-terse|-full])44 b(pattern)d([bibs]\\n',)1417 3790 y(string.gsub\(argv[0],)j('.*/',)c(''\)\)\))240 3881 y(os.exit\(1\))161 3972 y(end)161 4064 y(local)h(pattern)g(=)e (table.remove\(argv,)k(1\))161 4155 y(local)e(bibs)f(=)f({)h(})161 4246 y Fl(h)p Fk(make)28 b Fj(bibs)h Fk(the)f(list)f(of)h(p)l(athnames) h(implie)l(d)e(by)h Fj(argv)g Fm(54a)p Fl(i)161 4429 y Fj(local)41 b(entries)g(=)e(bibtex.find\(pattern,)44 b(bibs\))161 4520 y(for)c(_,)g(e)g(in)f(ipairs\(entries\))k(do)240 4612 y(emit\(io.stdout,)g(e.type,)d(e.key,)h(e.fields,)g(e.bib\))161 4703 y(end)83 4794 y(end)1908 5400 y Ft(53)p eop end %%Page: 54 54 TeXDict begin 54 53 bop 125 83 a Ft(If)30 b(w)n(e)f(ha)n(v)n(e)g(no)h (argumen)n(ts,)f(searc)n(h)g(all)g(a)n(v)-5 b(ailable)29 b(bib\014les.)44 b(Otherwise,)30 b(an)f(argumen)n(t)g(with)i(a)e Fs(/)h Ft(is)g(a)f(pathname,)0 183 y(and)e(an)h(argumen)n(t)e(without)i Fs(/)g Ft(is)f(a)g(name)h(as)f(it)h(w)n(ould)f(app)r(ear)f(in)i Fs(\\bibliography)p Ft(.)-286 299 y Fm(54a)181 b Fl(h)p Fk(make)28 b Fj(bibs)g Fk(the)h(list)e(of)g(p)l(athnames)j(implie)l(d)c (by)i Fj(argv)g Fm(54a)p Fl(i)q Fq(\021)1756 b Fm(\(53)25 b(76a\))83 390 y Fj(if)40 b(table.getn\(argv\))j(==)c(0)h(then)161 482 y(bibs)h(=)e(all_bibs\(\))83 573 y(else)161 664 y(for)h(_,)g(a)g (in)f(ipairs\(argv\))j(do)240 756 y(if)e(find\(a,)g('/'\))h(then)318 847 y(table.insert\(bibs,)j(a\))240 938 y(else)318 1029 y(table.insert\(bibs,)g(assert\(bibtex.bibpath\(a\)\)\))240 1121 y(end)161 1212 y(end)83 1303 y(end)-290 1461 y Fm(54b)181 b Fl(h)p Fk(emit)27 b(held)h(warnings,)g(if)e(any)i Fm(54b)p Fl(i)q Fq(\021)2634 b Fm(\(53\))83 1553 y Fj(local)40 b(ws)g(=)g(held_warnings\(\))83 1644 y(if)g(ws)f(then)161 1735 y(for)h(_,)g(w)g(in)f(ipairs\(ws\))j(do)240 1826 y(emit_warning\(unpack\(w\)\))161 1918 y(end)83 2009 y(end)125 2150 y Ft(T)-7 b(o)32 b(searc)n(h)g(all)h(bib)g(\014les,)i(w) n(e)d(lean)h(hea)n(vily)f(on)h Fs(kpsewhich)p Ft(,)e(whic)n(h)i(is)g (distributed)g(with)h(the)g(W)-7 b(eb2C)33 b(v)n(ersion)e(of)0 2250 y(T)46 2268 y(E)92 2250 y(X,)d(and)g(whic)n(h)f(kno)n(ws)g (exactly)g(whic)n(h)g(directories)f(to)i(searc)n(h.)-282 2366 y Fm(54c)181 b Fl(h)p Fk(p)l(ost-split)29 b(Lua)f(utility)g (functions)g Fm(54c)p Fl(i)q Fq(\021)2470 b Fm(\(58d\))83 2457 y Fj(local)40 b(function)h(all_bibs\(\))161 2549 y(local)g(pre_path)g(=)e(assert\(capture\('kpsewhich)45 b(-show-path)d(bib'\)\))161 2640 y(local)f(path)f(=)f (assert\(capture\('kpsewhich)45 b(-expand-path)d(')e(..)f(pre_path\)\)) 161 2731 y(local)i(bibs)f(=)f({)h(})f(--)h(list)g(of)g(results)161 2823 y(local)h(inserted)g(=)e({)h(})f(--)h(set)g(of)g(inserted)h(bibs,) f(to)g(avoid)g(duplicates)161 2914 y(for)g(_,)g(dir)g(in)g (ipairs\(split\(path,)j(':'\)\))d(do)240 3005 y(local)g(files)h(=)e (assert\(capture\('echo)44 b(')39 b(..)h(dir)g(..)g('/*.bib'\)\))240 3097 y(for)g(_,)g(file)g(in)f(ipairs\(split\(files,)44 b('\045s'\)\))c(do)318 3188 y(if)g(readable\(file\))i(then)397 3279 y(if)e(not)f(\(workaround.badbibs)44 b(and)c(\(find\(file,)i ('amsxport\045-options'\))h(or)1652 3371 y(find\(file,)f ('/plbib\045.bib$'\)\)\))397 3462 y(then)475 3553 y(if)e(not)g (inserted[file])i(then)554 3645 y(table.insert\(bibs,)h(file\))554 3736 y(inserted[file])f(=)e(true)475 3827 y(end)397 3919 y(end)318 4010 y(end)240 4101 y(end)161 4193 y(end)161 4284 y(return)h(bibs)83 4375 y(end)83 4467 y(bibtex.all_bibs)i(=)c (all_bibs)0 4591 y Ft(Notice)g(the)g Fs(workaround.badb)o(ibs)o Ft(,)d(whic)n(h)i(prev)n(en)n(ts)g(us)g(from)h(searc)n(hing)e(some)h(b) r(ogus)g(bib\014les)g(that)h(come)g(with)0 4691 y(Thomas)27 b(Esser's)f(teT)709 4709 y(E)755 4691 y(X.)1908 5400 y(54)p eop end %%Page: 55 55 TeXDict begin 55 54 bop 125 83 a Ft(It's)37 b(a)f(pit)n(y)h(there's)g (no)g(more)f(e\016cien)n(t)h(w)n(a)n(y)f(to)g(see)h(if)h(a)e(\014le)h (is)g(readable)f(than)h(to)g(try)g(to)f(read)h(it,)i(but)f(that's)0 183 y(p)r(ortabilit)n(y)27 b(for)g(y)n(ou.)-251 299 y Fm(55)181 b Fl(h)p Fk(Lua)28 b(utility)f(functions)i Fm(27d)p Fl(i)p Ft(+)p Fq(\021)2320 b Fm(\(27b\))48 b Ff(/)12 b Fm(52b)48 b(57a)13 b Ff(.)83 390 y Fj(local)40 b(function)h(readable\(file\))161 482 y(local)g(f,)f(msg)f(=)h (io.open\(file,)i('r'\))161 573 y(if)e(f)g(then)240 664 y(f:close\(\))240 756 y(return)h(true)161 847 y(else)240 938 y(return)g(false,)f(msg)161 1029 y(end)83 1121 y(end)0 1420 y Fv(5)135 b(Supp)t(ort)44 b(for)h(st)l(yle)h(\014les)0 1602 y Ft(A)39 b(B)l Fr(i)n(b)-7 b Ft(T)266 1627 y(E)313 1602 y(X)39 b(st)n(yle)g(\014le)g(is)g(used)g(to)g(turn)g(a)f(B)l Fr(i)n(b)-7 b Ft(T)1615 1627 y(E)1662 1602 y(X)39 b(en)n(try)f(in)n(to) h(T)2217 1620 y(E)2263 1602 y(X)h(or)e(L)2500 1585 y Fo(A)2537 1602 y Ft(T)2583 1620 y(E)2629 1602 y(X)h(co)r(de)g(suitable) g(for)f(inclusion)h(in)g(a)0 1702 y(bibliograph)n(y)-7 b(.)57 b(It)35 b(can)g(also)f(b)r(e)h(used)g(for)f(man)n(y)g(other)h(w) n(ondrous)e(purp)r(oses,)j(suc)n(h)e(as)g(generating)g(HTML)h(for)f(w)n (eb)0 1801 y(pages.)i(In)27 b(classes)f(B)l Fr(i)n(b)-7 b Ft(T)791 1826 y(E)837 1801 y(X,)28 b(eac)n(h)f(st)n(yle)g(\014le)g (is)h(written)f(in)h(a)f(rudimen)n(tary)-7 b(,)26 b(unnamed,)i(stac)n (k-based)d(language,)h(whic)n(h)0 1901 y(is)h(describ)r(ed)f(in)h(a)g (do)r(cumen)n(t)g(called)f(\\Designing)g(B)l Fr(i)n(b)-7 b Ft(T)1818 1926 y(E)1864 1901 y(X)28 b(St)n(yles,")e(whic)n(h)h(is)f (often)h(called)g Fs(btxhak.dvi)p Ft(.)32 b(One)27 b(of)g(the)0 2001 y(b)r(ene\014ts)f(of)g(N)l Fr(bi)n(b)-7 b Ft(T)614 2026 y(E)661 2001 y(X)26 b(is)g(that)g(st)n(yles)f(can)g(instead)h(b)r (e)g(written)g(in)g(Lua,)g(whic)n(h)g(is)g(a)f(m)n(uc)n(h)h(more)f(p)r (o)n(w)n(erful)g(language|)0 2100 y(and)i(p)r(erhaps)g(ev)n(en)h (easier)e(to)h(read.)125 2200 y(But)j(while)f(Lua)h(has)f(amply)g(p)r (o)n(w)n(erful)g(string-pro)r(cessing)f(primitiv)n(es,)h(it)h(lac)n(ks) f(some)g(of)h(the)g(primitiv)n(es)f(that)h(are)0 2299 y(sp)r(eci\014c)25 b(to)g(B)l Fr(i)n(b)-7 b Ft(T)550 2324 y(E)597 2299 y(X.)25 b(Most)g(notable)g(among)f(these)i(primitiv)n (es)e(is)h(the)h(mac)n(hinery)e(for)h(parsing)f(and)h(formatting)g (names)0 2399 y(\(of)34 b(authors,)g(editors)f(and)g(so)g(on\).)55 b(That)33 b(mac)n(hinery)g(is)g(re-implemen)n(ted)g(here.)55 b(If)34 b(do)r(cumen)n(tation)f(seems)g(scan)n(t)n(y)-7 b(,)0 2499 y(consult)27 b(the)h(original)e Fs(btxhak)p Ft(.)1908 5400 y(55)p eop end %%Page: 56 56 TeXDict begin 56 55 bop 125 83 a Ft(In)34 b(classic)g(B)l Fr(i)n(b)-7 b Ft(T)662 108 y(E)708 83 y(X,)35 b(eac)n(h)f(st)n(yle)g (is)g(its)h(o)n(wn)f(separate)f(\014le.)57 b(Here,)36 b(w)n(e)e(share)g(co)r(de)g(b)n(y)g(allo)n(wing)f(a)i(single)f(\014le)g (to)0 183 y(register)26 b(m)n(ultiple)i(st)n(yles.)-251 299 y Fm(56)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2286 b Fm(\(27b\))49 b Ff(/)12 b Fm(53)47 b(59b)13 b Ff(.)83 390 y Fj (bibtex.doc.register_style)45 b(=)161 482 y([[string)d(*)d(style)h(->)g (unit)g(#)g(remember)h(style)f(with)g(given)h(name)83 573 y(type)f(style)h(=)e({)g(emit)119 b(:)39 b(outfile)i(*)f(string)g (list)g(*)g(citation)h(list)f(->)g(unit)593 664 y(,)f(style)80 b(:)39 b(table)i(of)f(formatting)h(functions)g(#)f(defined)h(document)g (types)593 756 y(,)e(macros)i(:)e(unit)i(->)e(macro)i(table)593 847 y(}]])83 938 y(bibtex.doc.style)i(=)c('name)i(->)e(style)i(#)e (return)i(style)f(with)g(given)h(name,)f(loading)h(on)f(demand')83 1121 y(do)161 1212 y(local)h(styles)f(=)g({)f(})161 1395 y(function)j(bibtex.register_style\(name,)j(s\))240 1486 y(assert\(not)c(styles[name],)i("Duplicate)e(registration)h(of)e(style) g(")g(..)f(name\))240 1577 y(styles[name])j(=)d(s)240 1669 y(s.name)i(=)e(s.name)i(or)e(name)161 1760 y(end)161 1943 y(function)j(bibtex.style\(name\))240 2034 y(if)e(not)g (styles[name])h(then)318 2125 y(local)g(loaded)318 2217 y(if)f(config.nbs)i(then)397 2308 y(local)e(loaded)h(=)e (loadfile\(config.nbs)44 b(..)39 b('/')h(..)g(name)g(..)g('.nbs'\))397 2399 y(if)g(loaded)g(then)g(loaded\(\))h(end)318 2491 y(end)318 2582 y(if)f(not)g(loaded)h(then)397 2673 y(require)g (\('nbib-')g(..)e(name\))318 2765 y(end)318 2856 y(if)h(not)g (styles[name])i(then)397 2947 y(bibfatalf\('Tried)h(to)c(load)i(a)e (file,)h(but)g(it)g(did)g(not)g(register)h(style)f(\045s\\n',)h(name\)) 318 3039 y(end)240 3130 y(end)240 3221 y(return)g(styles[name])161 3313 y(end)83 3404 y(end)1908 5400 y Ft(56)p eop end %%Page: 57 57 TeXDict begin 57 56 bop 0 83 a Fn(5.1)112 b(Sp)s(ecial)39 b(string-pro)s(cessing)g(supp)s(ort)0 236 y Ft(A)30 b(great)f(deal)g (of)h(B)l Fr(i)n(b)-7 b Ft(T)746 261 y(E)792 236 y(X's)30 b(pro)r(cessing)e(dep)r(ends)j(on)e(giving)g(a)g(sp)r(ecial)h(status)g (to)f(substrings)g(inside)h(braces;)g(indeed,)0 336 y(when)e(suc)n(h)f (a)h(substring)f(b)r(egins)g(with)h(a)g(bac)n(kslash,)e(it)i(is)g (called)f(a)g(\\sp)r(ecial)g(c)n(haracter.")35 b(Accordingly)-7 b(,)27 b(w)n(e)g(pro)n(vide)f(a)0 436 y(function)i(to)g(searc)n(h)e (for)h(a)g(pattern)g Fp(outside)35 b Ft(balanced)27 b(braces.)-286 552 y Fm(57a)181 b Fl(h)p Fk(Lua)28 b(utility)f(functions)i Fm(27d)p Fl(i)p Ft(+)p Fq(\021)2355 b Fm(\(27b\))49 b Ff(/)12 b Fm(55)47 b(57b)13 b Ff(.)83 643 y Fj(local)40 b(function)h(find_outside_braces\(s,)k(pat,)40 b(i\))161 734 y(local)h(len)f(=)f(string.len\(s\))161 826 y(local)i(j,)f(k)f(=)g (string.find\(s,)k(pat,)d(i\))161 917 y(if)g(not)g(j)g(then)g(return)g (j,)g(k)f(end)161 1008 y(local)i(jb,)f(kb)f(=)h(string.find\(s,)i ('\045b{}',)f(i\))161 1100 y(while)g(jb)f(and)f(jb)h(<)g(j)f(do)h(---)g (scan)g(past)g(braces)240 1191 y(---)g(braces)g(come)h(first,)f(so)g (we)g(search)g(again)g(after)h(close)f(brace)240 1282 y(local)g(i2)g(=)f(kb)h(+)g(1)240 1374 y(j,)g(k)f(=)h(string.find\(s,)i (pat,)e(i2\))240 1465 y(if)g(not)g(j)f(then)h(return)h(j,)e(k)h(end)240 1556 y(jb,)g(kb)g(=)f(string.find\(s,)j('\045b{}',)f(i2\))161 1648 y(end)161 1739 y(--)f(either)h(pat)f(precedes)h(braces)f(or)g (there)g(are)g(no)g(braces)161 1830 y(return)h(string.find\(s,)h(pat,)f (j\))e(---)h(2nd)g(call)g(needed)h(to)f(get)f(captures)83 1922 y(end)0 2162 y Fu(5.1.1)94 b(String)31 b(splitting)0 2316 y Ft(Another)24 b(common)g(theme)g(in)h(B)l Fr(i)n(b)-7 b Ft(T)1155 2341 y(E)1201 2316 y(X)24 b(is)g(the)h(list)f(represen)n (ted)f(as)h(string.)35 b(A)24 b(list)h(of)f(names)g(is)g(represen)n (ted)f(as)g(a)h(string)0 2415 y(with)j(individual)f(names)g(separated)f (b)n(y)h(\\and.")36 b(A)26 b(name)h(itself)g(is)f(a)g(list)g(of)h (parts)e(separated)g(b)n(y)h(whitespace.)36 b(So)27 b(here)0 2515 y(are)22 b(some)h(functions)h(to)f(do)g(general)f(splitting.)36 b(When)24 b(w)n(e)f(don't)g(care)f(ab)r(out)i(the)f(separators,)f(w)n (e)h(use)g Fs(split)p Ft(;)g(when)g(w)n(e)0 2614 y(care)j(only)i(ab)r (out)f(the)h(separators,)d(w)n(e)j(use)f Fs(splitters)p Ft(;)d(and)j(when)h(w)n(e)f(care)g(ab)r(out)g(b)r(oth,)i(w)n(e)e(use)g Fs(odd)p 3403 2614 27 4 v 30 w(even)p 3609 2614 V 30 w(split)p Ft(.)-290 2731 y Fm(57b)181 b Fl(h)p Fk(Lua)28 b(utility)f(functions)i Fm(27d)p Fl(i)p Ft(+)p Fq(\021)2323 b Fm(\(27b\))49 b Ff(/)12 b Fm(57a)48 b(58a)13 b Ff(.)83 2822 y Fj(local)40 b(function)h(split\(s,)g(pat,)g(find\))f(---)g (return)g(list)h(of)e(substrings)j(separated)f(by)f(pat)161 2913 y(find)h(=)e(find)h(or)g(string.find)i(--)d(could)i(be)e (find_outside_braces)161 3005 y(local)i(len)f(=)f(string.len\(s\))161 3096 y(local)i(t)e(=)h({)f(})161 3187 y(local)i(insert)f(=)g (table.insert)161 3279 y(local)h(i,)f(j,)f(k)h(=)f(1,)h(true)161 3370 y(while)h(j)e(and)h(i)g(<=)f(len)h(+)g(1)f(do)240 3461 y(j,)h(k)f(=)h(find\(s,)g(pat,)g(i\))240 3553 y(if)g(j)f(then)318 3644 y(insert\(t,)j(string.sub\(s,)g(i,)e(j-1\)\))318 3735 y(i)g(=)f(k)h(+)f(1)240 3827 y(else)318 3918 y(insert\(t,)j (string.sub\(s,)g(i\)\))240 4009 y(end)161 4101 y(end)161 4192 y(return)f(t)83 4283 y(end)1908 5400 y Ft(57)p eop end %%Page: 58 58 TeXDict begin 58 57 bop 125 83 a Ft(F)-7 b(unction)34 b Fs(splitters)d Ft(returns)i(a)h(table)g(that,)j(when)d(in)n(terlea)n (v)n(ed)e(with)j(the)g(result)f(of)g Fs(split)p Ft(,)g(reconstructs)f (the)0 183 y(original)26 b(string.)-286 299 y Fm(58a)181 b Fl(h)p Fk(Lua)28 b(utility)f(functions)i Fm(27d)p Fl(i)p Ft(+)p Fq(\021)2316 b Fm(\(27b\))48 b Ff(/)12 b Fm(57b)48 b(58b)13 b Ff(.)83 390 y Fj(local)40 b(function)h(splitters\(s,)h(pat,) f(find\))f(---)g(return)g(list)h(of)e(separators)161 482 y(find)i(=)e(find)h(or)g(string.find)i(--)d(could)i(be)e (find_outside_braces)161 573 y(local)i(t)e(=)h({)f(})161 664 y(local)i(insert)f(=)g(table.insert)161 756 y(local)h(j,)f(k)f(=)g (find\(s,)i(pat,)f(1\))161 847 y(while)h(j)e(do)240 938 y(insert\(t,)i(string.sub\(s,)h(j,)e(k\)\))240 1029 y(j,)g(k)f(=)h (find\(s,)g(pat,)g(k+1\))161 1121 y(end)161 1212 y(return)h(t)83 1303 y(end)125 1428 y Ft(F)-7 b(unction)26 b Fs(odd)p 607 1428 27 4 v 30 w(even)p 813 1428 V 30 w(split)f Ft(mak)n(es)g(o)r (dd)h(en)n(tries)g(strings)f(b)r(et)n(w)n(een)i(the)f(sough)n(t-for)f (pattern)h(and)g(ev)n(en)g(en)n(tries)g(the)0 1528 y(strings)h(that)h (matc)n(h)f(the)h(pattern.)-290 1644 y Fm(58b)181 b Fl(h)p Fk(Lua)28 b(utility)f(functions)i Fm(27d)p Fl(i)p Ft(+)p Fq(\021)2327 b Fm(\(27b\))49 b Ff(/)12 b Fm(58a)48 b(58c)13 b Ff(.)83 1735 y Fj(local)40 b(function)h(odd_even_split\(s,)j(pat\)) 161 1826 y(local)d(len)f(=)f(string.len\(s\))161 1918 y(local)i(t)e(=)h({)f(})161 2009 y(local)i(insert)f(=)g(table.insert) 161 2100 y(local)h(i,)f(j,)f(k)h(=)f(1,)h(true)161 2192 y(while)h(j)e(and)h(i)g(<=)f(len)h(+)g(1)f(do)240 2283 y(j,)h(k)f(=)h(find\(s,)g(pat,)g(i\))240 2374 y(if)g(j)f(then)318 2466 y(insert\(t,)j(string.sub\(s,)g(i,)e(j-1\)\))318 2557 y(insert\(t,)i(string.sub\(s,)g(j,)e(k\)\))318 2648 y(i)g(=)f(k)h(+)f(1)240 2740 y(else)318 2831 y(insert\(t,)j (string.sub\(s,)g(i\)\))240 2922 y(end)161 3014 y(end)161 3105 y(return)f(t)83 3196 y(end)125 3321 y Ft(As)27 b(a)g(sp)r(ecial)h (case,)e(w)n(e)i(ma)n(y)f(w)n(an)n(t)g(to)g(pull)h(out)g (brace-delimited)f(substrings:)-282 3437 y Fm(58c)181 b Fl(h)p Fk(Lua)28 b(utility)f(functions)i Fm(27d)p Fl(i)p Ft(+)p Fq(\021)2316 b Fm(\(27b\))48 b Ff(/)12 b Fm(58b)48 b(58d)13 b Ff(.)83 3528 y Fj(local)40 b(function)h(brace_split\(s\))i (return)d(odd_even_split\(s,)k('\045b{}'\))c(end)125 3653 y Ft(Some)27 b(things)g(need)h(splits.)-290 3769 y Fm(58d)181 b Fl(h)p Fk(Lua)28 b(utility)f(functions)i Fm(27d)p Fl(i)p Ft(+)p Fq(\021)2327 b Fm(\(27b\))49 b Ff(/)12 b Fm(58c)48 b(59a)13 b Ff(.)83 3861 y Fl(h)p Fk(p)l(ost-split)29 b(Lua)f(utility)g(functions)g Fm(54c)p Fl(i)1908 5400 y Ft(58)p eop end %%Page: 59 59 TeXDict begin 59 58 bop 0 83 a Fu(5.1.2)94 b(String)31 b(lengths)g(and)h(widths)0 236 y Ft(F)-7 b(unction)26 b Fs(text)p 526 236 27 4 v 29 w(char)p 731 236 V 30 w(count)d Ft(coun)n(ts)i(c)n(haracters,)e(but)j(a)f(sp)r(ecial)g(coun)n(ts)f(as)h (one)g(c)n(haracter.)34 b(It)25 b(is)g(based)g(on)g(B)l Fr(i)n(b)-7 b Ft(T)3736 261 y(E)3782 236 y(X's)0 336 y Fs(text.length$)23 b Ft(function.)-286 452 y Fm(59a)181 b Fl(h)p Fk(Lua)28 b(utility)f(functions)i Fm(27d)p Fl(i)p Ft(+)p Fq(\021)2323 b Fm(\(27b\))49 b Ff(/)12 b Fm(58d)48 b(64c)13 b Ff(.)83 543 y Fj(local)40 b(function)h(text_char_count\(s\)) 161 635 y(local)g(n)e(=)h(0)161 726 y(local)h(i,)f(last)g(=)f(1,)h (string.len\(s\))161 817 y(while)h(i)e(<=)h(last)g(do)240 909 y(local)g(special,)h(splast,)g(sp)f(=)f(find\(s,)i('\(\045b{}\)',)g (i\))240 1000 y(if)f(not)g(special)g(then)318 1091 y(return)h(n)e(+)h (\(last)g(-)g(i)f(+)h(1\))240 1183 y(elseif)h(find\(sp,)g('^{\\\\'\))f (then)318 1274 y(n)g(=)f(n)h(+)f(\(special)i(-)f(i)f(+)h(1\))f(--)h(by) g(statute,)h(it's)f(a)f(single)i(character)318 1365 y(i)f(=)f(splast)i (+)e(1)240 1457 y(else)318 1548 y(n)h(=)f(n)h(+)f(\(splast)i(-)e(i)h(+) f(1\))h(-)g(2)78 b(--)40 b(don't)g(count)h(braces)318 1639 y(i)f(=)f(splast)i(+)e(1)240 1731 y(end)161 1822 y(end)161 1913 y(return)i(n)83 2005 y(end)83 2096 y(bst.text_length)i (=)c(text_char_count)83 2187 y(bst.doc.text_length)44 b(=)39 b("string)i(->)f(int)f(#)h(length)g(\(with)h('special')g(char)f (==)g(1\)")125 2312 y Ft(Sometimes)32 b(w)n(e)g(w)n(an)n(t)f(to)h(kno)n (w)g(not)g(ho)n(w)g(man)n(y)f(c)n(haracters)f(are)i(in)g(a)g(string,)h (but)g(ho)n(w)e(m)n(uc)n(h)h(space)g(w)n(e)g(exp)r(ect)0 2411 y(it)f(to)g(tak)n(e)f(when)h(t)n(yp)r(eset.)47 b(\(Or)30 b(rather,)h(w)n(e)f(w)n(an)n(t)g(to)h(compare)e(suc)n(h)i(widths)g(to)g (\014nd)g(the)g(widest.\))47 b(This)31 b(is)g(original)0 2511 y(B)l Fr(i)n(b)-7 b Ft(T)165 2536 y(E)211 2511 y(X's)28 b Fs(width$)d Ft(function.)125 2611 y(The)35 b(co)r(de)f(should)h(use)g (the)g Fs(char)p 1254 2611 V 30 w(width)e Ft(arra)n(y)-7 b(,)34 b(for)h(whic)n(h)f Fs(space)f Ft(is)i(the)h(only)e(whitespace)h (c)n(haracter)d(giv)n(en)i(a)0 2710 y(nonzero)j(prin)n(ting)g(width.)69 b(The)38 b(widths)g(here)g(are)f(tak)n(en)g(from)h(Stanford's)g(June)g ('87)f Fg(cmr)r Ft(10)g(fon)n(t)h(and)g(represen)n(t)0 2810 y(h)n(undredths)d(of)f(a)h(p)r(oin)n(t)g(\(rounded\),)h(but)g (since)e(they're)h(used)g(only)f(for)g(relativ)n(e)g(comparisons,)g (the)i(units)f(ha)n(v)n(e)e(no)0 2910 y(meaning.)-290 3026 y Fm(59b)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2290 b Fm(\(27b\))48 b Ff(/)12 b Fm(56)48 b(60a)13 b Ff(.)83 3117 y Fj(do)161 3208 y(local)41 b(char_width)g(=)f({)f(})161 3300 y(local)i (special_widths)h(=)e({)f(ss)h(=)f(500,)h(ae)g(=)g(722,)g(oe)f(=)h (778,)g(AE)g(=)f(903,)h(oe)g(=)f(1014)i(})161 3391 y(for)f(i)g(=)f(0,)h (255)g(do)g(char_width[i])i(=)d(0)h(end)161 3482 y(local)h (char_width_from_32)i(=)d({)279 3574 y(278,)g(278,)g(500,)h(833,)f (500,)g(833,)g(778,)g(278,)g(389,)g(389,)h(500,)f(778,)g(278,)g(333,) 279 3665 y(278,)g(500,)g(500,)h(500,)f(500,)g(500,)g(500,)g(500,)g (500,)g(500,)h(500,)f(500,)g(278,)g(278,)279 3756 y(278,)g(778,)g(472,) h(472,)f(778,)g(750,)g(708,)g(722,)g(764,)g(681,)h(653,)f(785,)g(750,)g (361,)279 3848 y(514,)g(778,)g(625,)h(917,)f(750,)g(778,)g(681,)g(778,) g(736,)g(556,)h(722,)f(750,)g(750,)279 3939 y(1028,)h(750,)f(750,)g (611,)g(278,)g(500,)g(278,)g(500,)g(278,)h(278,)f(500,)g(556,)g(444,) 279 4030 y(556,)g(444,)g(306,)h(500,)f(556,)g(278,)g(306,)g(528,)g (278,)g(833,)h(556,)f(500,)g(556,)g(528,)279 4122 y(392,)g(394,)g(389,) h(556,)f(528,)g(722,)g(528,)g(528,)g(444,)g(500,)h(1000,)f(500,)g(500,) 161 4213 y(})161 4304 y(for)g(i)g(=)f(1,)h (table.getn\(char_width_from_32)q(\))45 b(do)240 4396 y(char_width[32+i-1])e(=)d(char_width_from_32[i])161 4487 y(end)161 4670 y(bst.doc.width)j(=)c("string)i(->)f(faux_points)h (#)f(width)g(of)g(string)g(in)g(1987)g(cmr10")161 4761 y(function)i(bst.width\(s\))240 4852 y(assert\(false,)g('have)e(not)g (implemented)i(width)e(yet'\))161 4944 y(end)83 5035 y(end)1908 5400 y Ft(59)p eop end %%Page: 60 60 TeXDict begin 60 59 bop 0 83 a Fn(5.2)112 b(P)m(arsing)38 b(names)h(and)f(lists)g(of)g(names)0 236 y Ft(Names)27 b(in)h(a)f(string)g(are)g(separated)f(b)n(y)j Fs(and)d Ft(surrounded)h(b)n(y)g(nonn)n(ull)g(whitespace.)37 b(Case)27 b(is)g(not)h(signi\014can)n(t.)-286 352 y Fm(60a)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2247 b Fm(\(27b\))48 b Ff(/)12 b Fm(59b)48 b(60b)13 b Ff(.)83 444 y Fj(local)40 b(function)h (namesplit\(s\))161 535 y(local)g(t)e(=)h(split\(s,)h ('\045s+[aA][nN][dD]\045s+',)j(find_outside_braces\))161 626 y(local)d(i)e(=)h(2)161 718 y(while)h(i)e(<=)h(table.getn\(t\))i (do)240 809 y(while)e(find\(t[i],)i('^[aA][nN][dD]\045s+'\))h(do)318 900 y(t[i])e(=)e(string.gsub\(t[i],)k('^[aA][nN][dD]\045s+',)h(''\))318 992 y(table.insert\(t,)f(i,)d(''\))318 1083 y(i)g(=)f(i)h(+)f(1)240 1174 y(end)240 1266 y(i)g(=)h(i)f(+)h(1)161 1357 y(end)161 1448 y(return)h(t)83 1540 y(end)83 1631 y(bst.namesplit)h(=)e (namesplit)83 1722 y(bst.doc.namesplit)j(=)d('string)g(->)g(list)g(of)g (names)g(#)g(split)g(names)g(on)g("and"')-290 1971 y Fm(60b)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2290 b Fm(\(27b\))48 b Ff(/)12 b Fm(60a)48 b(61)13 b Ff(.)83 2063 y Fj(local)40 b(sep_and_not_tie)j(=)c('\045-')83 2154 y(local)h(sep_chars)i(=)d (sep_and_not_tie)k(..)c('\045~')1908 5400 y Ft(60)p eop end %%Page: 61 61 TeXDict begin 61 60 bop 125 83 a Ft(T)-7 b(o)37 b(parse)f(an)h (individual)h(name,)i(w)n(e)d(w)n(an)n(t)g(to)h(coun)n(t)f(commas.)66 b(W)-7 b(e)38 b(\014rst)f(remo)n(v)n(e)f(leading)h(white)h(space)f (\(and)0 183 y Fs(sep)p 137 183 27 4 v 30 w(char)p Ft(s\),)26 b(and)i(trailing)e(white)i(space)f(\(and)h Fs(sep)p 1683 183 V 30 w(char)p Ft(s\))e(and)i(commas,)e(complaining)h(for)g(eac)n(h) g(trailing)g(comma.)125 282 y(W)-7 b(e)40 b(then)h(represen)n(t)e(the)h (name)g(as)g(t)n(w)n(o)f(sequences:)61 b Fs(tokens)38 b Ft(and)i Fs(trailers)p Ft(.)71 b(The)40 b Fs(tokens)e Ft(are)h(the)i(names)0 382 y(themselv)n(es,)30 b(and)g(the)g Fs(trailers)d Ft(are)i(the)i(separator)d(c)n(haracters)f(b)r(et)n(w)n (een)j(tok)n(ens.)44 b(\(A)30 b(separator)e(is)i(white)h(space,)e(a)0 482 y(dash,)f(or)g(a)f(tie,)i(and)f(m)n(ultiple)h(separators)d(in)j (sequence)e(are)h(fro)n(wned)f(up)r(on.\))40 b(The)28 b Fs(commas)e Ft(table)i(b)r(ecomes)g(an)g(arra)n(y)0 581 y(mapping)f(the)h(comma)f(n)n(um)n(b)r(er)h(to)f(the)h(index)g(of)f (the)h(tok)n(en)f(that)h(follo)n(ws)f(it.)-251 697 y Fm(61)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2251 b Fm(\(27b\))48 b Ff(/)12 b Fm(60b)48 b(66a)13 b Ff(.)83 789 y Fj(local)40 b(parse_name)83 880 y(do)161 971 y(local)h(white_sep)355 b(=)39 b('[')h(..)g(sep_chars)h(..)f('\045s]+')161 1063 y(local)h(white_comma_sep)121 b(=)39 b('[')h(..)g(sep_chars)h(..)f ('\045s\045,]+')161 1154 y(local)h(trailing_commas)121 b(=)39 b('\(,[')i(..)e(sep_chars)j(..)d('\045s\045,]*\)$')161 1245 y(local)i(sep_char)394 b(=)39 b('[')h(..)g(sep_chars)h(..)f(']') 161 1337 y(local)h(leading_white_sep)i(=)c('^')h(..)g(white_sep)161 1519 y Fl(h)p Fk(name-p)l(arsing)30 b(utilities)d Fm(65a)p Fl(i)161 1702 y Fj(function)42 b(parse_name\(s,)g(inter_token\))240 1793 y(if)e(string.find\(s,)i(trailing_commas\))h(then)318 1885 y(biberrorf\("Name)g('\045s')d(has)g(one)g(or)g(more)g(commas)g (at)g(the)g(end",)g(s\))240 1976 y(end)240 2067 y(s)f(=)h (string.gsub\(s,)i(trailing_commas,)h(''\))240 2159 y(s)c(=)h (string.gsub\(s,)i(leading_white_sep,)i(''\))240 2250 y(local)c(tokens)h(=)e(split\(s,)i(white_comma_sep,)i (find_outside_braces\))240 2341 y(local)d(trailers)h(=)f(splitters\(s,) i(white_comma_sep,)h(find_outside_braces\))240 2433 y Fl(h)p Fk(r)l(ewrite)29 b Fj(trailers)g Fk(to)f(hold)g(a)f(single)h (sep)l(ar)l(ator)i(char)l(acter)g(e)l(ach)f Fm(63b)p Fl(i)240 2524 y Fj(local)40 b(commas)h(=)e({)h(})f(---)h(maps)g(each)g (comma)h(to)e(index)i(of)f(token)g(the)g(follows)h(it)240 2615 y(for)f(i,)g(t)f(in)h(ipairs\(trailers\))j(do)318 2707 y(string.gsub\(t,)g(',',)d(function\(\))h(table.insert\(commas,)j (i+1\))c(end\))240 2798 y(end)240 2889 y(local)g(name)g(=)g({)f(})240 2980 y Fl(h)p Fk(p)l(arse)29 b(the)f(name)g(tokens)h(and)f(set)h (\014elds)f(of)f Fj(name)h Fm(62a)p Fl(i)240 3072 y Fj(return)41 b(name)161 3163 y(end)83 3254 y(end)83 3346 y(bst.parse_name)h(=)e (parse_name)83 3437 y(bst.doc.parse_name)j(=)d('string)h(*)e(string)i (option)f(->)g(name)g(table')1908 5400 y Ft(61)p eop end %%Page: 62 62 TeXDict begin 62 61 bop 125 83 a Ft(A)34 b(name)g(has)g(up)h(to)f(four) g(parts:)49 b(the)35 b(most)f(general)f(form)h(is)g(either)g(\\First)g (v)n(on)g(Last,)h(Junior")e(or)g(\\v)n(on)h(Last,)0 183 y(First,)27 b(Junior",)e(but)i(v)-5 b(arious)25 b(v)n(ons)h(and)g (Juniors)f(can)h(b)r(e)h(omitted.)37 b(The)26 b(name-parsing)f (algorithm)g(is)i(baro)r(que)e(and)h(is)0 282 y(transliterated)e(from)h (the)h(original)e(B)l Fr(i)n(b)-7 b Ft(T)1313 307 y(E)1359 282 y(X)26 b(source,)f(but)h(the)f(principle)h(is)f(clear:)35 b(assign)24 b(the)i(full)g(v)n(ersion)e(of)h(eac)n(h)g(part)0 382 y(to)h(the)g(four)f(\014elds)h Fs(ff)p Ft(,)g Fs(vv)p Ft(,)f Fs(ll)p Ft(,)h(and)g Fs(jj)p Ft(;)f(and)h(assign)f(an)g (abbreviated)g(v)n(ersion)f(of)i(eac)n(h)f(part)h(to)f(the)i(\014elds)e Fs(f)p Ft(,)h Fs(v)p Ft(,)g Fs(l)p Ft(,)g(and)0 482 y Fs(j)p Ft(.)-286 598 y Fm(62a)181 b Fl(h)p Fk(p)l(arse)29 b(the)f(name)g(tokens)h(and)f(set)h(\014elds)f(of)f Fj(name)h Fm(62a)p Fl(i)q Fq(\021)2032 b Fm(\(61\))83 689 y Fj(local)40 b(first_start,)i(first_lim,)g(last_lim,)f(von_start,)h(von_lim,)f (jr_lim)161 780 y(--)f(variables)h(mark)g(subsequences;)h(if)d(start)i (==)e(lim,)i(sequence)g(is)e(empty)83 872 y(local)h(n)g(=)f (table.getn\(tokens\))83 963 y Fl(h)p Fk(lo)l(c)l(al)27 b(p)l(arsing)i(functions)f Fm(62b)p Fl(i)83 1146 y Fj(local)40 b(commacount)i(=)d(table.getn\(commas\))83 1237 y(if)h(commacount)h(==) f(0)f(then)h(--)g(first)h(von)e(last)i(jr)161 1328 y(von_start,)h (first_start,)g(last_lim,)f(jr_lim)g(=)e(1,)h(1,)g(n+1,)g(n+1)161 1420 y Fl(h)p Fk(p)l(arse)29 b(\014rst)g(von)f(last)g(jr)g Fm(63a)p Fl(i)83 1511 y Fj(elseif)41 b(commacount)g(==)f(1)f(then)h(--) g(von)g(last)g(jr,)g(first)161 1602 y(von_start,)i(last_lim,)f(jr_lim,) g(first_start,)h(first_lim)f(=)240 1694 y(1,)f(commas[1],)h(commas[1],) h(commas[1],)f(n+1)161 1785 y(divide_von_from_last\(\))83 1876 y(elseif)g(commacount)g(==)f(2)f(then)h(--)g(von)g(last,)g(jr,)g (first)161 1968 y(von_start,)i(last_lim,)f(jr_lim,)g(first_start,)h (first_lim)f(=)240 2059 y(1,)f(commas[1],)h(commas[2],)h(commas[2],)f (n+1)161 2150 y(divide_von_from_last\(\))83 2242 y(else)161 2333 y(biberrorf\("Too)i(many)d(commas)h(in)e(name)h('\045s'"\))83 2424 y(end)83 2516 y Fl(h)p Fk(set)28 b(\014elds)g(of)g(name)f(b)l(ase) l(d)i(on)f Fj(first)p 1236 2516 24 4 v 30 w(start)g Fk(and)g(friends)g Fm(63c)p Fl(i)125 2640 y Ft(The)c(v)n(on)f(name,)i(if)g(an)n(y)-7 b(,)24 b(go)r(es)f(from)h(the)h(\014rst)f(v)n(on)f(tok)n(en)h(to)g(the) g(last)g(v)n(on)f(tok)n(en,)i(except)f(the)h(last)e(name)h(is)h(en)n (titled)0 2740 y(to)33 b(at)g(least)f(one)h(tok)n(en.)53 b(So)32 b(to)h(\014nd)h(the)f(limit)h(of)f(the)g(v)n(on)g(name,)h(w)n (e)e(start)h(just)h(b)r(efore)e(the)i(last)e(tok)n(en)h(and)g(wind)0 2839 y(do)n(wn)27 b(un)n(til)h(w)n(e)f(\014nd)h(a)g(v)n(on)e(tok)n(en)h (or)g(w)n(e)g(hit)h(the)g(v)n(on)f(start)g(\(in)h(whic)n(h)g(latter)f (case)g(there)g(is)h(no)f(v)n(on)g(name\).)-290 2956 y Fm(62b)181 b Fl(h)p Fk(lo)l(c)l(al)27 b(p)l(arsing)i(functions)f Fm(62b)p Fl(i)q Fq(\021)2731 b Fm(\(62a\))83 3047 y Fj(function)41 b(divide_von_from_last\(\))161 3138 y(von_lim)g(=)f(last_lim)h(-)e(1;) 161 3230 y(while)i(von_lim)g(>)e(von_start)i(and)f(not)g (isVon\(tokens[von_lim-1]\))45 b(do)240 3321 y(von_lim)c(=)e(von_lim)i (-)e(1)161 3412 y(end)83 3504 y(end)1908 5400 y Ft(62)p eop end %%Page: 63 63 TeXDict begin 63 62 bop 125 83 a Ft(OK,)26 b(here's)h(one)h(form.)-286 199 y Fm(63a)181 b Fl(h)p Fk(p)l(arse)29 b(\014rst)g(von)f(last)g(jr)f Fm(63a)p Fl(i)q Fq(\021)2776 b Fm(\(62a\))83 291 y Fj(local)40 b(got_von)h(=)f(false)83 382 y(while)g(von_start)i(<)d(last_lim-1)j(do) 161 473 y(if)e(isVon\(tokens[von_start]\))45 b(then)240 565 y(divide_von_from_last\(\))240 656 y(got_von)c(=)e(true)240 747 y(break)161 839 y(else)240 930 y(von_start)i(=)f(von_start)h(+)e(1) 161 1021 y(end)83 1112 y(end)83 1204 y(if)h(not)g(got_von)g(then)h(--)e (there)i(is)e(no)h(von)g(name)161 1295 y(while)h(von_start)g(>)f(1)f (and)h(find\(trailers[von_start)k(-)c(1],)g(sep_and_not_tie\))j(do)240 1386 y(von_start)e(=)f(von_start)h(-)e(1)161 1478 y(end)161 1569 y(von_lim)i(=)f(von_start)83 1660 y(end)83 1752 y(first_lim)h(=)f(von_start)125 1876 y Ft(The)35 b(last)g(name)h (starts)e(just)i(past)g(the)f(last)h(tok)n(en,)h(b)r(efore)e(the)h (\014rst)f(comma)g(\(if)h(there)f(is)h(no)f(comma,)i(there)e(is)0 1976 y(deemed)26 b(to)g(b)r(e)g(one)g(at)g(the)g(end)g(of)g(the)g (string\),)g(for)g(whic)n(h)g(there)f(exists)h(a)g(\014rst)f(brace-lev) n(el-0)e(letter)j(\(or)g(brace-lev)n(el-1)0 2076 y(sp)r(ecial)k(c)n (haracter\),)g(and)h(it's)g(in)g(lo)n(w)n(er)e(case,)h(unless)h(this)g (last)f(tok)n(en)h(is)f(also)g(the)h(last)f(tok)n(en)g(b)r(efore)h(the) g(comma,)g(in)0 2175 y(whic)n(h)24 b(case)f(the)h(last)g(name)g(starts) f(with)h(this)h(tok)n(en)e(\(unless)h(this)g(last)g(tok)n(en)f(is)h (connected)g(b)n(y)g(a)f Fs(sep)p 3297 2175 27 4 v 30 w(char)g Ft(other)g(than)0 2275 y(a)i Fs(tie)f Ft(to)h(the)h(previous)e (tok)n(en,)h(in)h(whic)n(h)f(case)g(the)g(last)g(name)g(starts)g(with)h (as)e(man)n(y)h(tok)n(ens)f(earlier)g(as)h(are)f(connected)0 2374 y(b)n(y)31 b(non)p Fs(tie)p Ft(s)e(to)i(this)g(last)g(one)f (\(except)h(on)g(T)-7 b(uesda)n(ys)30 b Fg(:)14 b(:)g(:)f Ft(\),)33 b(although)d(this)h(mo)r(dule)g(nev)n(er)f(sees)h(suc)n(h)f (a)h(case\).)46 b(Note)0 2474 y(that)30 b(if)h(there)f(are)f(an)n(y)g (tok)n(ens)h(in)g(either)g(the)g(v)n(on)g(or)f(last)h(names,)g(then)h (the)f(last)g(name)g(has)f(at)h(least)g(one,)g(ev)n(en)g(if)h(it)0 2574 y(starts)c(with)h(a)f(lo)n(w)n(er-case)e(letter.)125 2673 y(The)f(string)g(separating)e(tok)n(ens)i(is)g(reduced)g(to)g(a)g (single)g(\\separator)d(c)n(haracter.")34 b(A)24 b(comma)g(alw)n(a)n (ys)e(trumps)j(other)0 2773 y(separator)33 b(c)n(haracters.)57 b(Otherwise,)36 b(if)f(there's)g(no)g(comma,)h(w)n(e)f(tak)n(e)f(the)h (\014rst)g(c)n(haracter,)g(b)r(e)h(it)f(a)g(separator)d(or)i(a)0 2873 y(space.)i(\(P)n(atashnik)26 b(considers)h(that)h(m)n(ultiple)g (suc)n(h)f(c)n(haracters)e(constitute)j(\\silliness")e(on)i(the)g (user's)f(part.\))-290 2989 y Fm(63b)181 b Fl(h)p Fk(r)l(ewrite)29 b Fj(trailers)g Fk(to)f(hold)g(a)f(single)h(sep)l(ar)l(ator)i(char)l (acter)g(e)l(ach)f Fm(63b)p Fl(i)q Fq(\021)1558 b Fm(\(61\))83 3080 y Fj(for)40 b(i)f(=)h(1,)g(table.getn\(trailers\))j(do)161 3171 y(local)e(s)e(=)h(trailers[i])161 3263 y(assert\(string.len\(s\))k (>)c(0\))161 3354 y(if)g(find\(s,)h(','\))f(then)240 3445 y(trailers[i])i(=)d(',')161 3537 y(else)240 3628 y(trailers[i])j(=)d(string.sub\(s,)j(1,)e(1\))161 3719 y(end)83 3811 y(end)-282 3968 y Fm(63c)181 b Fl(h)p Fk(set)28 b(\014elds)g(of)g(name)f(b)l(ase)l(d)i(on)f Fj(first)p 1153 3968 24 4 v 30 w(start)g Fk(and)g(friends)g Fm(63c)p Fl(i)q Fq(\021)1736 b Fm(\(62a\))83 4060 y Fl(h)p Fk(de\014nition)28 b(of)f(function)h Fj(set)p 970 4060 V 29 w(name)g Fm(64a)p Fl(i)83 4151 y Fj(set_name\(first_start,)44 b(first_lim,)e('ff',)e ('f'\))83 4242 y(set_name\(von_start,)122 b(von_lim,)e('vv',)40 b('v'\))83 4334 y(set_name\(von_lim,)200 b(last_lim,)81 b('ll',)40 b('l'\))83 4425 y(set_name\(last_lim,)161 b(jr_lim,)e('jj',)40 b('j'\))1908 5400 y Ft(63)p eop end %%Page: 64 64 TeXDict begin 64 63 bop 125 83 a Ft(W)-7 b(e)28 b(set)f(long)g(and)g (short)g(forms)g(together;)g Fs(ss)g Ft(is)g(the)h(long)f(form)h(and)f Fs(s)g Ft(is)h(the)g(short)f(form.)-286 199 y Fm(64a)181 b Fl(h)p Fk(de\014nition)28 b(of)f(function)h Fj(set)p 887 199 24 4 v 29 w(name)g Fm(64a)p Fl(i)q Fq(\021)2447 b Fm(\(63c\))83 291 y Fj(local)40 b(function)h(set_name\(start,)i(lim,) d(long,)h(short\))161 382 y(if)f(start)h(<)e(lim)h(then)240 473 y(--)g(string)g(concatenation)i(is)e(quadratic,)i(but)d(names)i (are)f(short)240 565 y Fl(h)p Fk(de\014nition)28 b(of)f Fj(abbrev)p Fk(,)h(for)g(shortening)h(a)f(token)h Fm(65b)p Fl(i)240 656 y Fj(local)40 b(ss)g(=)f(tokens[start])240 747 y(local)h(s)79 b(=)39 b(abbrev\(tokens[start]\))240 839 y(for)h(i)f(=)h(start)g(+)g(1,)f(lim)h(-)g(1)f(do)318 930 y(if)h(inter_token)i(then)397 1021 y(ss)e(=)f(ss)h(..)f (inter_token)j(..)e(tokens[i])397 1112 y(s)79 b(=)39 b(s)79 b(..)39 b(inter_token)j(..)e(abbrev\(tokens[i]\))318 1204 y(else)397 1295 y(local)g(ssep,)h(nnext)f(=)f(trailers[i-1],)k (tokens[i])397 1386 y(local)d(sep,)80 b(next)f(=)39 b(ssep,)394 b(abbrev\(nnext\))397 1478 y Fl(h)p Fk(p)l(ossibly)28 b(adjust)g Fj(sep)h Fk(and)f Fj(ssep)g Fk(ac)l(c)l(or)l(ding)h(to)f (token)h(p)l(osition)f(and)g(size)g Fm(64b)p Fl(i)397 1569 y Fj(ss)40 b(=)f(ss)h(..)314 b(ssep)40 b(..)g(nnext)397 1660 y(s)79 b(=)39 b(s)79 b(..)39 b('.')h(..)g(sep)79 b(..)40 b(next)318 1752 y(end)240 1843 y(end)240 1934 y(name[long])h(=)f(ss)240 2026 y(name[short])i(=)d(s)161 2117 y(end)83 2208 y(end)125 2333 y Ft(Here)28 b(is)i(the)f(default)h (for)f(a)f(c)n(haracter)g(b)r(et)n(w)n(een)h(tok)n(ens:)39 b(a)29 b(tie)g(is)h(the)f(default)h(space)e(c)n(haracter)g(b)r(et)n(w)n (een)h(the)g(last)0 2433 y(t)n(w)n(o)f(tok)n(ens)g(of)h(the)g(name)f (part,)h(and)g(b)r(et)n(w)n(een)g(the)g(\014rst)f(t)n(w)n(o)g(tok)n (ens)g(if)h(the)h(\014rst)e(tok)n(en)g(is)h(short)f(enough;)h (otherwise,)0 2532 y(a)e(space)g(is)h(the)g(default.)-290 2648 y Fm(64b)181 b Fl(h)p Fk(p)l(ossibly)28 b(adjust)h Fj(sep)f Fk(and)g Fj(ssep)g Fk(ac)l(c)l(or)l(ding)h(to)f(token)h(p)l (osition)f(and)g(size)g Fm(64b)p Fl(i)q Fq(\021)1296 b Fm(\(64a\))83 2740 y Fj(if)40 b(find\(sep,)h(sep_char\))g(then)161 2831 y(--)f(do)g(nothing;)h(sep)f(is)f(OK)83 2922 y(elseif)i(i)e(==)h (lim-1)g(then)161 3014 y(sep,)h(ssep)f(=)f('~',)h('~')83 3105 y(elseif)h(i)e(==)h(start)g(+)g(1)f(then)161 3196 y(sep)80 b(=)39 b(text_char_count\(s\))83 b(<)39 b(3)h(and)f('~')h(or)g (')f(')161 3288 y(ssep)i(=)e(text_char_count\(ss\))44 b(<)39 b(3)h(and)f('~')h(or)g(')f(')83 3379 y(else)161 3470 y(sep,)i(ssep)f(=)f(')h(',)f(')h(')83 3562 y(end)125 3686 y Ft(The)29 b(v)n(on)f(name)h(starts)f(with)i(the)g(\014rst)e(tok) n(en)h(satisfying)f Fs(isVon)p Ft(,)g(unless)h(that)g(is)g(the)h(last)f (tok)n(en.)41 b(A)29 b(\\v)n(on)f(tok)n(en")0 3786 y(is)f(simply)h(one) f(that)h(b)r(egins)g(with)g(a)f(lo)n(w)n(er-case)e(letter|but)j(those)f (damn)h(sp)r(ecials)f(complicate)g(ev)n(erything.)-282 3902 y Fm(64c)181 b Fl(h)p Fk(Lua)28 b(utility)f(functions)i Fm(27d)p Fl(i)p Ft(+)p Fq(\021)2523 b Fm(\(27b\))49 b Ff(/)12 b Fm(59a)83 3993 y Fj(local)40 b(upper_specials)j(=)c({)h(OE)f (=)h(true,)g(AE)g(=)f(true,)i(AA)e(=)h(true,)g(O)g(=)f(true,)h(L)g(=)f (true)i(})83 4085 y(local)f(lower_specials)j(=)c({)h(i)f(=)h(true,)g(j) f(=)h(true,)g(oe)g(=)f(true,)i(ae)e(=)h(true,)g(aa)g(=)f(true,)1064 4176 y(o)g(=)h(true,)g(l)f(=)h(true,)g(ss)g(=)f(true)i(})1908 5400 y Ft(64)p eop end %%Page: 65 65 TeXDict begin 65 64 bop -286 83 a Fm(65a)181 b Fl(h)p Fk(name-p)l(arsing)29 b(utilities)f Fm(65a)p Fl(i)p Fq(\021)2793 b Fm(\(61\))83 174 y Fj(function)41 b(isVon\(s\))161 266 y(local)g(lower)79 b(=)40 b(find_outside_braces\(s,)k('\045l'\))c (--)g(first)h(nonbrace)g(lowercase)161 357 y(local)g(letter)f(=)g (find_outside_braces\(s,)k('\045a'\))c(--)g(first)h(nonbrace)g(letter) 161 448 y(local)g(bs,)f(ebs,)g(command)h(=)e(find_outside_braces\(s,)44 b('\045{\045\\\\\(\045a+\)'\))f(--)c(\\xxx)161 540 y(if)h(lower)h(and)e (lower)i(<=)e(letter)i(and)f(lower)g(<=)g(\(bs)g(or)g(lower\))g(then) 240 631 y(return)h(true)161 722 y(elseif)g(letter)g(and)f(letter)g(<=)g (\(bs)g(or)f(letter\))i(then)240 814 y(return)g(false)161 905 y(elseif)g(bs)f(then)240 996 y(if)g(upper_specials[command])k(then) 318 1088 y(return)d(false)240 1179 y(elseif)g(lower_specials[command])j (then)318 1270 y(return)d(true)240 1362 y(else)318 1453 y(local)g(close_brace)g(=)f(find_outside_braces\(s,)k('\045}',)d (ebs+1\))318 1544 y(lower)80 b(=)39 b(find\(s,)i('\045l'\))g(--)e (first)i(nonbrace)g(lowercase)318 1636 y(letter)g(=)e(find\(s,)i ('\045a'\))g(--)e(first)i(nonbrace)g(letter)318 1727 y(return)g(lower)f(and)g(lower)h(<=)e(letter)240 1818 y(end)161 1910 y(else)240 2001 y(return)i(false)161 2092 y(end)83 2183 y(end)125 2325 y Ft(An)23 b(abbreviated)f(tok)n(en)g(is)h (the)g(\014rst)f(letter)h(of)g(a)f(tok)n(en,)i(except)e(again)g(w)n(e)g (ha)n(v)n(e)g(to)h(deal)f(with)i(the)f(damned)g(sp)r(ecials.)-290 2441 y Fm(65b)181 b Fl(h)p Fk(de\014nition)28 b(of)f Fj(abbrev)p Fk(,)h(for)g(shortening)h(a)f(token)h Fm(65b)p Fl(i)p Fq(\021)2015 b Fm(\(64a\))83 2532 y Fj(local)40 b(function)h(abbrev\(token\))161 2623 y(local)g(first_alpha,)h(_,)d (alpha)i(=)e(find\(token,)j('\(\045a\)'\))161 2715 y(local)f (first_brace)434 b(=)39 b(find\(token,)j('\045{\045\\\\'\))161 2806 y(if)e(first_alpha)i(and)e(first_alpha)i(<=)d(\(first_brace)j(or)e (first_alpha\))i(then)240 2897 y(return)f(alpha)161 2989 y(elseif)g(first_brace)h(then)240 3080 y(local)e(i,)g(j,)g(special)g(=) g(find\(token,)i('\(\045b{}\)',)f(first_brace\))240 3171 y(if)f(i)f(then)318 3263 y(return)i(special)240 3354 y(else)f(--)g(unbalanced)h(braces)318 3445 y(return)g (string.sub\(token,)i(first_brace\))240 3537 y(end)161 3628 y(else)240 3719 y(return)e('')161 3811 y(end)83 3902 y(end)1908 5400 y Ft(65)p eop end %%Page: 66 66 TeXDict begin 66 65 bop 0 83 a Fn(5.3)112 b(F)-9 b(ormatting)38 b(names)0 236 y Ft(Lac)n(king)30 b(Lua's)g(string-pro)r(cessing)f (utilities,)k(classic)d(B)l Fr(i)n(b)-7 b Ft(T)1931 261 y(E)1977 236 y(X)32 b(de\014nes)f(a)g(w)n(a)n(y)f(of)h(con)n(v)n (erting)e(a)i(\\format)f(string")g(and)0 336 y(a)38 b(name)f(in)n(to)h (a)f(formatted)h(name.)68 b(I)38 b(\014nd)g(this)g(formatting)g(tec)n (hnique)g(painful,)j(but)d(I)g(also)f(w)n(an)n(ted)g(to)h(preserv)n(e)0 436 y(compatibilit)n(y)27 b(with)h(existing)g(bibliograph)n(y)e(st)n (yles,)h(so)f(I'v)n(e)i(implemen)n(ted)g(it)g(as)f(accurately)f(as)h(I) h(can.)125 535 y(The)e(in)n(terface)f(is)h(not)g(quite)g(iden)n(tical)f (to)h(classic)f(B)l Fr(i)n(b)-7 b Ft(T)1915 560 y(E)1961 535 y(X;)27 b(a)e(st)n(yle)h(can)f(use)h Fs(namesplit)c Ft(to)k(split)g(names)g(and)g(then)0 635 y Fs(format)p 269 635 27 4 v 29 w(name)h Ft(to)h(format)f(a)h(single)g(one,)g(or)f (it)i(can)f(thro)n(w)f(caution)h(to)g(the)h(winds)f(and)g(call)g Fs(format)p 3285 635 V 29 w(names)e Ft(to)j(format)0 734 y(a)e(whole)g(list)h(of)g(names.)-286 851 y Fm(66a)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2286 b Fm(\(27b\))49 b Ff(/)12 b Fm(61)47 b(66b)13 b Ff(.)83 942 y Fj(bst.doc.format_names)44 b(=)39 b("format)i(*)f(name)g(list)g(->)f(string)i(list)f(#)g(format)g (each)g(name)h(in)e(list")83 1033 y(function)i(bst.format_names\(fmt,)j (t\))161 1125 y(local)d(u)e(=)h({)f(})161 1216 y(for)h(i)g(=)f(1,)h (table.getn\(t\))i(do)240 1307 y(u[i])e(=)g(bst.format_name\(fmt,)j (t[i]\))161 1399 y(end)161 1490 y(return)e(u)83 1581 y(end)125 1706 y Ft(A)21 b(B)l Fr(i)n(b)-7 b Ft(T)373 1731 y(E)419 1706 y(X)22 b(format)f(string)f(con)n(tains)h(its)g(v)-5 b(ariable)20 b(elemen)n(ts)h(inside)h(braces.)33 b(Th)n(us,)23 b(w)n(e)e(format)f(a)h(name)g(b)n(y)g(replacing)0 1805 y(eac)n(h)27 b(braced)g(substring)f(of)i(the)g(format)f(string.)-290 1922 y Fm(66b)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2258 b Fm(\(27b\))49 b Ff(/)12 b Fm(66a)48 b(67c)13 b Ff(.)83 2013 y Fj(do)161 2104 y(local)41 b(good_keys)g(=)f({)f(ff)h(=)f(true,)i(vv)e(=)h(true,)g (ll)g(=)f(true,)i(jj)e(=)h(true,)946 2196 y(f)79 b(=)39 b(true,)i(v)78 b(=)40 b(true,)g(l)79 b(=)39 b(true,)i(j)78 b(=)40 b(true,)g(})161 2378 y(bst.doc.format_name)k(=)39 b("format)i(*)f(name)g(->)g(string)g(#)g(format)g(1)g(name)g(as)f(in)h (bibtex")161 2470 y(function)i(bst.format_name\(fmt,)h(name\))240 2561 y(local)d(t)g(=)f(type\(name\))j(==)d('table')i(and)f(name)g(or)g (parse_name\(name\))240 2652 y(--)g(at)f(most)h(one)g(of)g(the)g (important)h(letters,)g(perhaps)g(doubled,)g(may)f(appear)240 2744 y(local)g(function)h(replace_braced\(s\))318 2835 y(local)g(i,)e(j,)h(alpha)g(=)g(find_outside_braces\(s,)k ('\(\045a+\)',)d(2\))318 2926 y(if)f(not)g(i)f(then)397 3018 y(return)h('')g(---)g(can)g(never)g(be)g(printed,)h(but)f(who)g (are)g(we)f(to)h(complain?)318 3109 y(elseif)h(not)f(good_keys[alpha])j (then)397 3200 y(biberrorf)e(\('The)f(format)h(string)g(\045q)e(has)h (an)g(illegal)h(brace-level-1)h(letter',)f(s\))318 3291 y(elseif)g(find_outside_braces\(s,)j('\045a+',)d(j+1\))f(then)397 3383 y(biberrorf)h(\('The)f(format)h(string)g(\045q)e(has)h(two)g(sets) g(of)g(brace-level-1)i(letters',)f(s\))318 3474 y(elseif)g(t[alpha])g (then)397 3565 y(local)f(k)g(=)f(j)h(+)f(1)397 3657 y(local)h(t)g(=)f (t)397 3748 y Fl(h)p Fk(make)28 b Fj(k)f Fk(fol)t(low)g(inter-token)j (string,)e(if)e(any,)i(r)l(ebuilding)g Fj(t)f Fk(as)i(ne)l(e)l(de)l(d)g Fm(67a)p Fl(i)397 3839 y Fj(local)40 b(head,)h(tail)f(=)f (string.sub\(s,)j(2,)e(i-1\))g(..)g(t[alpha],)h(string.sub\(s,)h(k,)e (-2\))397 3931 y Fl(h)p Fk(adjust)28 b Fj(tail)g Fk(to)h(ac)l(c)l(ount) g(for)e(discr)l(etionality)i(of)f(ties,)f(if)g(any)h Fm(67b)p Fl(i)397 4022 y Fj(return)40 b(head)h(..)e(tail)318 4113 y(else)397 4205 y(return)h('')318 4296 y(end)240 4387 y(end)240 4479 y(return)h(\(string.gsub\(fmt,)i('\045b{}',)d (replace_braced\)\))161 4570 y(end)83 4661 y(end)1908 5400 y Ft(66)p eop end %%Page: 67 67 TeXDict begin 67 66 bop -286 83 a Fm(67a)181 b Fl(h)p Fk(make)28 b Fj(k)f Fk(fol)t(low)g(inter-token)j(string,)e(if)f(any,)g (r)l(ebuilding)h Fj(t)g Fk(as)g(ne)l(e)l(de)l(d)h Fm(67a)p Fl(i)p Fq(\021)1375 b Fm(\(66b\))83 174 y Fj(local)40 b(kk,)g(jj)g(=)f(find\(s,)i('\045b{}',)g(k\))83 266 y(if)f(kk)f(and)h (kk)g(==)g(k)f(then)161 357 y(k)h(=)f(jj)h(+)g(1)161 448 y(if)g(type\(name\))i(==)d('string')i(then)240 540 y(t)e(=)h(parse_name\(name,)j(string.sub\(s,)f(kk+1,)e(jj-1\)\))161 631 y(else)240 722 y(error\('Style)i(error)e(--)g(used)g(a)g (pre-parsed)h(name)f(with)g(non-standard)i(inter-token)g(format)f (string'\))161 814 y(end)83 905 y(end)-290 1063 y Fm(67b)181 b Fl(h)p Fk(adjust)28 b Fj(tail)h Fk(to)f(ac)l(c)l(ount)h(for)f(discr)l (etionality)h(of)e(ties,)g(if)g(any)h Fm(67b)p Fl(i)p Fq(\021)1621 b Fm(\(66b\))83 1154 y Fj(if)40 b(find\(tail,)h ('\045~\045~$'\))g(then)161 1245 y(tail)g(=)e(string.sub\(tail,)k(1,)d (-2\))g(--)f(denotes)i(hard)f(tie)83 1337 y(elseif)h(find\(tail,)g ('\045~$'\))g(then)161 1428 y(if)f(text_char_count\(head\))k(+)c (text_char_count\(tail\))k(-)39 b(1)h(>=)f(3)h(then)240 1519 y(tail)g(=)g(string.gsub\(tail,)j('\045~$',)d(')g('\))161 1611 y(end)83 1702 y(end)0 1976 y Fn(5.4)112 b(Line-wrapping)40 b(output)0 2129 y Ft(EXPLAIN)27 b(THIS)h(INTERF)-9 b(A)n(CE!!!)125 2229 y(My)27 b Fs(max)p 409 2229 27 4 v 30 w(print)p 659 2229 V 30 w(line)f Ft(app)r(ears)g(to)h(b)r(e)h(o\013)g(b)n(y)f (one)h(from)f(Oren)g(P)n(atashnik's.)-282 2345 y Fm(67c)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2254 b Fm(\(27b\))49 b Ff(/)12 b Fm(66b)48 b(68c)13 b Ff(.)83 2436 y Fj(local)40 b(min_print_line,)j (max_print_line)f(=)e(3,)g(79)83 2528 y(bibtex.hard_max)j(=)c (max_print_line)83 2619 y(bibtex.doc.hard_max)44 b(=)39 b('int)h(#)g(largest)g(line)h(that)f(avoids)g(a)g(forced)g(line)g (break)h(\(for)f(wizards\)')83 2710 y(bst.doc.writer)i(=)e("io-handle)h (*)f(int)g(option)g(->)g(object)h(#)e(result:write\(s\))k(buffers)e (and)e(breaks)i(lines")83 2802 y(function)g(bst.writer\(out,)i (indent\))161 2893 y(indent)e(=)f(indent)g(or)g(2)161 2984 y(assert\(indent)j(+)c(10)h(<)f(max_print_line\))161 3076 y(indent)i(=)f(string.rep\(')h(',)f(indent\))161 3167 y(local)h(gsub)f(=)f(string.gsub)161 3258 y(local)i(buf)f(=)f('') 161 3350 y(local)i(function)g(write\(self,)h(...\))240 3441 y(local)e(s)g(=)f(table.concat)j({)e(...)g(})240 3532 y(local)g(lines)h(=)e(split\(s,)i('\\n'\))240 3624 y(lines[1])g(=)e(buf)h(..)g(lines[1])240 3715 y(buf)g(=)f (table.remove\(lines\))240 3806 y(for)h(i)f(=)h(1,)f (table.getn\(lines\))44 b(do)318 3897 y(local)d(line)f(=)f(lines[i])318 3989 y(if)h(not)g(find\(line,)h('^\045s+$'\))h(then)e(--)f(no)h(line)g (of)g(just)g(whitespace)397 4080 y(line)g(=)f(gsub\(line,)j('\045s+$',) f(''\))397 4171 y(while)f(string.len\(line\))j(>)d(max_print_line)i(do) 475 4263 y Fl(h)p Fk(emit)28 b(initial)e(p)l(art)j(of)e(line)g(and)h(r) l(e)l(assign)h Fm(68a)p Fl(i)397 4354 y Fj(end)397 4445 y(out:write\(line,)42 b('\\n'\))318 4537 y(end)240 4628 y(end)161 4719 y(end)161 4811 y(assert\(out.write,)i("object)c(passed)h (to)f(bst.writer)h(does)f(not)g(have)g(a)g(write)g(method"\))161 4902 y(return)h({)f(write)g(=)f(write)i(})83 4993 y(end)1908 5400 y Ft(67)p eop end %%Page: 68 68 TeXDict begin 68 67 bop -286 83 a Fm(68a)181 b Fl(h)p Fk(emit)27 b(initial)g(p)l(art)i(of)e(line)g(and)h(r)l(e)l(assign)h Fm(68a)p Fl(i)p Fq(\021)2274 b Fm(\(67c\))83 174 y Fj(local)40 b(last_pre_white,)j(post_white)83 266 y(local)d(i,)g(j,)g(n)f(=)h(1,)f (1,)h(string.len\(line\))83 357 y(while)g(i)g(and)g(i)f(<=)h(n)f(and)h (i)g(<=)f(max_print_line)k(do)161 448 y(i,)d(j)g(=)f(find\(line,)j ('\045s+',)e(i\))161 540 y(if)g(i)g(and)g(i)f(<=)h(max_print_line)i(+)e (1)f(then)240 631 y(if)h(i)f(>)h(min_print_line)i(then)e (last_pre_white,)j(post_white)e(=)f(i)f(-)h(1,)f(j)h(+)f(1)h(end)240 722 y(i)f(=)h(j)f(+)h(1)161 814 y(end)83 905 y(end)83 996 y(if)g(last_pre_white)i(then)161 1088 y (out:write\(string.sub\(line,)k(1,)39 b(last_pre_white\),)k('\\n'\))161 1179 y(if)d(post_white)i(>)d(max_print_line)k(+)c(2)g(then)240 1270 y(post_white)i(=)f(max_print_line)i(+)e(2)f(--)h(bug-for-bug)i (compatibility)g(with)e(bibtex)161 1362 y(end)161 1453 y(line)h(=)e(indent)i(..)e(string.sub\(line,)k(post_white\))83 1544 y(elseif)e(n)e(<)h(bibtex.hard_max)i(then)161 1636 y(out:write\(line,)h('\\n'\))161 1727 y(line)e(=)e('')83 1818 y(else)h(--)g(``unbreakable'')161 1910 y (out:write\(string.sub\(line,)46 b(1,)39 b(bibtex.hard_max-1\),)44 b('\045\\n'\))161 2001 y(line)d(=)e(string.sub\(line,)k (bibtex.hard_max\))83 2092 y(end)-290 2267 y Fm(68b)181 b Fl(h)p Fk(che)l(ck)29 b(c)l(onstant)h(values)e(for)f(c)l(onsistency)j Fm(68b)p Fl(i)q Fq(\021)2235 b Fm(\(27b\))83 2358 y Fj (assert\(min_print_line)44 b(>=)c(3\))83 2449 y(assert\(max_print_line) k(>)39 b(min_print_line\))0 2723 y Fn(5.5)112 b(F)-9 b(unctions)38 b(copied)g(from)g(classic)g Fw(B)-5 b Fc(i)m(b)d Fw(T)1919 2753 y(E)1974 2723 y(X)0 2876 y Fu(Adding)31 b(a)i(p)s(erio)s(d)81 b Ft(Find)29 b(the)f(last)f(non-)p Fs(})g Ft(c)n(haracter,)e(and)j(if)g(it)g(is)f(not)h(a)f(sen)n(tence)g (terminator,)g(add)g(a)g(p)r(erio)r(d.)-282 2993 y Fm(68c)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2258 b Fm(\(27b\))49 b Ff(/)12 b Fm(67c)48 b(69a)13 b Ff(.)83 3084 y Fj(do)161 3175 y(local)41 b(terminates_sentence)i(=)d({)f(["."])i(=)e(true,)h(["?"])h (=)e(true,)i(["!"])f(=)f(true)i(})161 3358 y(bst.doc.add_period)j(=)39 b("string)i(->)f(string)g(#)g(add)g(period)g(unless)h(already)g(.?!") 161 3449 y(function)h(bst.add_period\(s\))240 3540 y(local)e(_,)g(_,)g (last)g(=)f(find\(s,)i('\([^\045}]\)\045}*$'\))240 3632 y(if)f(last)g(and)g(not)g(terminates_sentence[last])k(then)318 3723 y(return)d(s)e(..)h('.')240 3814 y(else)318 3906 y(return)h(s)240 3997 y(end)161 4088 y(end)83 4180 y(end)1908 5400 y Ft(68)p eop end %%Page: 69 69 TeXDict begin 69 68 bop 0 83 a Fu(Case-c)m(hanging)83 b Ft(Classic)22 b(B)l Fr(i)n(b)-7 b Ft(T)1117 108 y(E)1163 83 y(X)23 b(has)f(a)h Fs(change.case$)18 b Ft(function,)24 b(whic)n(h)f(tak)n(es)e(an)i(argumen)n(t)f(telling)h(whether)f(to)0 183 y(c)n(hange)h(to)h(lo)n(w)n(er)e(case,)i(upp)r(er)g(case,)g(or)g (\\title")f(case)g(\(whic)n(h)i(has)e(initial)i(letters)e (capitalized\).)36 b(Because)23 b(Lua)h(supp)r(orts)0 282 y(\014rst-class)i(functions,)i(it)g(mak)n(es)f(more)f(sense)h(just) i(to)e(exp)r(ort)g(three)h(functions:)37 b Fs(lower)p Ft(,)25 b Fs(title)p Ft(,)h(and)i Fs(upper)p Ft(.)-286 399 y Fm(69a)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2294 b Fm(\(27b\))48 b Ff(/)12 b Fm(68c)48 b(72)13 b Ff(.)83 490 y Fj(do)161 581 y(bst.doc.lower)43 b(=)c("string)i(->)f(string)79 b(#)40 b(lower)g(case)g(according)i(to)d(bibtex)i(rules")161 672 y(bst.doc.upper)i(=)c("string)i(->)f(string)79 b(#)40 b(upper)g(case)g(according)i(to)d(bibtex)i(rules")161 764 y(bst.doc.title)i(=)c("string)i(->)f(string)79 b(#)40 b(title)g(case)g(according)i(to)d(bibtex)i(rules")161 946 y Fl(h)p Fk(utilities)28 b(for)f(c)l(ase)i(c)l(onversion)g Fm(69b)p Fl(i)161 1129 y(h)p Fk(de\014nitions)g(of)e(c)l(ase-c)l (onversion)k(functions)d Fm(69c)p Fl(i)83 1220 y Fj(end)125 1345 y Ft(Case)23 b(con)n(v)n(ersion)g(is)h(complicated)g(b)n(y)h(the)f (presence)g(of)h(brace-delimited)f(sequences,)g(esp)r(ecially)g(since)h (there)f(is)g(one)0 1445 y(set)i(of)f(con)n(v)n(en)n(tions)f(for)h(a)g (\\sp)r(ecial)g(c)n(haracter")e(\(brace-delimited)i(sequence)g(b)r (eginning)h(with)g(T)3140 1462 y(E)3186 1445 y(X)g(con)n(trol)e (sequence\))0 1544 y(and)29 b(another)g(set)h(of)f(con)n(v)n(en)n (tions)f(for)h(other)g(brace-delimited)g(sequences.)42 b(T)-7 b(o)30 b(deal)f(with)h(them,)h(w)n(e)e(t)n(ypically)g(do)g(an)0 1644 y(\\o)r(dd-ev)n(en)e(split")h(on)g(balanced)f(braces,)g(then)i (apply)f(a)g(\\normal")e(con)n(v)n(ersion)g(function)j(to)f(the)g(o)r (dd)g(elemen)n(ts)g(and)g(a)0 1743 y(\\sp)r(ecial")e(con)n(v)n(ersion)g (function)i(to)f(the)h(ev)n(en)f(elemen)n(ts.)37 b(The)28 b(application)f(is)g(done)g(b)n(y)h Fs(oeapp)p Ft(.)-290 1860 y Fm(69b)181 b Fl(h)p Fk(utilities)27 b(for)h(c)l(ase)g(c)l (onversion)i Fm(69b)p Fl(i)p Fq(\021)2360 b Fm(\(69a\))49 b(70a)13 b Ff(.)83 1951 y Fj(local)40 b(function)h(oeapp\(f,)g(g,)f (t\))161 2042 y(for)g(i)g(=)f(1,)h(table.getn\(t\),)i(2)e(do)240 2134 y(t[i])g(=)g(f\(t[i]\))161 2225 y(end)161 2316 y(for)g(i)g(=)f(2,) h(table.getn\(t\),)i(2)e(do)240 2408 y(t[i])g(=)g(g\(t[i]\))161 2499 y(end)161 2590 y(return)h(t)83 2682 y(end)125 2806 y Ft(Upp)r(er-)j(and)g(lo)n(w)n(er-case)e(con)n(v)n(ersion)g(are)i (easiest.)86 b(Non-sp)r(ecials)44 b(are)f(hit)i(directly)f(with)h Fs(string.lower)40 b Ft(or)0 2906 y Fs(string.upper)p Ft(;)23 b(for)k(sp)r(ecial)g(c)n(haracters,)e(w)n(e)j(use)f(utilit)n(y) h(called)f Fs(convert)p 2452 2906 27 4 v 29 w(special)p Ft(.)-282 3022 y Fm(69c)181 b Fl(h)p Fk(de\014nitions)28 b(of)f(c)l(ase-c)l(onversion)k(functions)e Fm(69c)p Fl(i)p Fq(\021)1973 b Fm(\(69a\))49 b(70c)13 b Ff(.)83 3113 y Fj(local)40 b(lower_special)j(=)c(convert_special\(string.lower\))83 3205 y(local)h(upper_special)j(=)c(convert_special\(string.upper\))83 3387 y(function)i(bst.lower\(s\))161 3479 y(return)g (table.concat\(oeapp\(string.low)q(er,)46 b(lower_special,)c (brace_split\(s\)\)\))83 3570 y(end)83 3753 y(function)f (bst.upper\(s\))161 3844 y(return)g(table.concat\(oeapp\(string.upp)q (er,)46 b(upper_special,)c(brace_split\(s\)\)\))83 3935 y(end)1908 5400 y Ft(69)p eop end %%Page: 70 70 TeXDict begin 70 69 bop 125 83 a Ft(Here)39 b(is)g Fs(convert)p 741 83 27 4 v 28 w(special)p Ft(.)70 b(If)39 b(a)g(sp)r(ecial)g(b)r (egins)h(with)f(an)g(alphab)r(etic)h(con)n(trol)e(sequence,)k(w)n(e)d (con)n(v)n(ert)e(only)0 183 y(elemen)n(ts)30 b(b)r(et)n(w)n(een)g(con)n (trol)f(sequences.)44 b(If)31 b(a)f(sp)r(ecial)g(b)r(egins)g(with)h(a)e (nonalphab)r(etic)h(con)n(trol)f(sequence,)i(w)n(e)f(con)n(v)n(ert)0 282 y(the)g(whole)f(sp)r(ecial)g(as)g(usual.)41 b(Finally)-7 b(,)30 b(if)g(a)f(sp)r(ecial)g(do)r(es)g(not)h(b)r(egin)f(with)h(a)f (con)n(trol)f(sequence,)h(w)n(e)g(lea)n(v)n(e)f(it)i(the)g(hell)0 382 y(alone.)62 b(\(This)37 b(is)f(the)g(con)n(v)n(en)n(tion)f(that)i (allo)n(ws)d(us)j(to)f(put)h Fs({FORTRAN})32 b Ft(in)37 b(a)f(B)l Fr(i)n(b)-7 b Ft(T)2781 407 y(E)2827 382 y(X)36 b(en)n(try)g(and)g(b)r(e)h(assured)e(that)0 482 y(capitalization)27 b(is)g(not)h(lost.\))-286 598 y Fm(70a)181 b Fl(h)p Fk(utilities)27 b(for)h(c)l(ase)g(c)l(onversion)i Fm(69b)p Fl(i)p Ft(+)p Fq(\021)2088 b Fm(\(69a\))48 b Ff(/)12 b Fm(69b)48 b(70b)13 b Ff(.)83 689 y Fj(function)41 b(convert_special\(cvt\))161 780 y(return)g(function\(s\))515 872 y(if)e(find\(s,)i ('^{\\\\\(\045a+\)'\))h(then)593 963 y(local)e(t)g(=)f (odd_even_split\(s,)k('\\\\\045a+'\))593 1054 y(for)d(i)f(=)h(1,)f (table.getn\(t\),)k(2)c(do)671 1146 y(t[i])i(=)e(cvt\(t[i]\))593 1237 y(end)593 1328 y(return)i(table.concat\(t\))515 1420 y(elseif)f(find\(s,)h('^{\\\\'\))g(then)593 1511 y(return)g(cvt\(s\))515 1602 y(else)593 1694 y(return)g(s)515 1785 y(end)436 1876 y(end)83 1968 y(end)125 2092 y Ft(Title)27 b(con)n(v)n(ersion)f(do)r(esn't)h(\014t)i(so)d(nicely)i(in)n(to)f(the)h (framew)n(ork.)125 2192 y(F)-7 b(unction)28 b Fs(lower)p 697 2192 V 29 w(later)e Ft(lo)n(w)n(ers)f(all)j(but)g(the)g(\014rst)f (letter)h(of)f(a)g(string.)-290 2308 y Fm(70b)181 b Fl(h)p Fk(utilities)27 b(for)h(c)l(ase)g(c)l(onversion)i Fm(69b)p Fl(i)p Ft(+)p Fq(\021)2295 b Fm(\(69a\))49 b Ff(/)12 b Fm(70a)83 2399 y Fj(local)40 b(function)h(lower_later\(s\))161 2491 y(return)g(string.sub\(s,)h(1,)e(1\))g(..)f (string.lower\(string.sub\(s,)45 b(2\)\))83 2582 y(end)125 2707 y Ft(F)-7 b(or)23 b(title)j(con)n(v)n(ersion,)d(w)n(e)h(don't)h (mess)f(with)h(a)f(tok)n(en)g(that)h(follo)n(ws)f(a)g(colon.)35 b(Hence,)25 b(w)n(e)f(m)n(ust)h(main)n(tain)f Fs(prev)f Ft(and)0 2806 y(can't)28 b(use)f Fs(convert)p 664 2806 V 28 w(special)p Ft(.)-282 2922 y Fm(70c)181 b Fl(h)p Fk(de\014nitions)28 b(of)f(c)l(ase-c)l(onversion)k(functions)e Fm(69c)p Fl(i)p Ft(+)p Fq(\021)1744 b Fm(\(69a\))48 b Ff(/)12 b Fm(69c)48 b(71)13 b Ff(.)83 3014 y Fj(local)40 b(function)h(title_special\(s,)i(prev\))161 3105 y(if)d(find\(prev,)i (':\045s+$'\))f(then)240 3196 y(return)g(s)161 3288 y(else)240 3379 y(if)f(find\(s,)g('^{\\\\\(\045a+\)'\))i(then)318 3470 y(local)f(t)e(=)h(odd_even_split\(s,)j('\\\\\045a+'\))318 3562 y(for)d(i)g(=)f(1,)h(table.getn\(t\),)i(2)e(do)397 3653 y(local)g(prev)g(=)g(t[i-1])g(or)g(prev)397 3744 y(if)g(find\(prev,)h(':\045s+$'\))g(then)475 3836 y(assert\(false,)h ('bugrit'\))397 3927 y(else)475 4018 y(t[i])e(=)g(string.lower\(t[i]\)) 397 4110 y(end)318 4201 y(end)318 4292 y(return)h(table.concat\(t\))240 4384 y(elseif)g(find\(s,)f('^{\\\\'\))h(then)318 4475 y(return)g(string.lower\(s\))240 4566 y(else)318 4658 y(return)g(s)240 4749 y(end)161 4840 y(end)83 4932 y(end)1908 5400 y Ft(70)p eop end %%Page: 71 71 TeXDict begin 71 70 bop 125 83 a Ft(In)n(ternal)26 b(function)j Fs(recap)c Ft(deals)i(with)h(the)g(damn)g(colons.)-251 199 y Fm(71)181 b Fl(h)p Fk(de\014nitions)28 b(of)f(c)l(ase-c)l (onversion)k(functions)e Fm(69c)p Fl(i)p Ft(+)p Fq(\021)1908 b Fm(\(69a\))49 b Ff(/)12 b Fm(70c)83 291 y Fj(function)41 b(bst.title\(s\))161 382 y(local)g(function)g(recap\(s,)g(first\))240 473 y(local)f(parts)h(=)e(odd_even_split\(s,)k('\045:\045s+'\))240 565 y(parts[1])e(=)e(first)i(and)f(lower_later\(parts[1]\))k(or)39 b(string.lower\(parts[1]\))240 656 y(for)h(i)f(=)h(\(first)g(and)g(3)g (or)f(1\),)h(table.getn\(parts\),)k(2)39 b(do)318 747 y(parts[i])i(=)f(lower_later\(parts[i]\))240 839 y(end)240 930 y(return)h(table.concat\(parts\))161 1021 y(end)161 1112 y(local)g(t)e(=)h(brace_split\(s\))161 1204 y(for)g(i)g(=)f(1,)h (table.getn\(t\),)i(2)e(do)g(--)f(elements)i(outside)g(specials)g(get)f (recapped)240 1295 y(t[i])g(=)g(recap\(t[i],)h(i)f(==)f(1\))161 1386 y(end)161 1478 y(for)h(i)g(=)f(2,)h(table.getn\(t\),)i(2)e(do)g (--)f(specials)i(are,)f(well,)h(special)240 1569 y(local)f(prev)g(=)g (t[i-1])240 1660 y(if)g(i)f(==)h(2)f(and)h(not)g(find\(prev,)i ('\045S'\))e(then)g(prev)g(=)g(':)f(')h(end)240 1752 y(t[i])g(=)g(title_special\(t[i],)j(prev\))161 1843 y(end)161 1934 y(return)e(table.concat\(t\))83 2026 y(end)1908 5400 y Ft(71)p eop end %%Page: 72 72 TeXDict begin 72 71 bop 0 83 a Fu(Puri\014cation)83 b Ft(Puri\014cation)41 b(\(classic)g Fs(purify$)p Ft(\))e(in)n(v)n(olv)n (es)h(remo)n(ving)h(non-alphan)n(umeric)f(c)n(haracters.)77 b(Eac)n(h)41 b(se-)0 183 y(quence)27 b(of)h(\\separator")c(c)n (haracters)i(b)r(ecomes)h(a)g(single)g(space.)-251 299 y Fm(72)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2254 b Fm(\(27b\))49 b Ff(/)12 b Fm(69a)48 b(73a)13 b Ff(.)83 390 y Fj(do)161 482 y(bst.doc.purify)43 b(=)c("string)i(->)f(string)g(#)g(remove)g (nonalphanumeric,)j(non-sep)e(chars")161 573 y(local)g(high_alpha)g(=)f (string.char\(128\))j(..)c('-')h(..)g(string.char\(255\))161 664 y(local)h(sep_white_char)h(=)e('[')g(..)f(sep_chars)j(..)d ('\045s]')161 756 y(local)i(disappears)198 b(=)40 b('[^')g(..)g (sep_chars)h(..)e(high_alpha)j(..)e('\045s\045w]')161 847 y(local)h(gsub)f(=)f(string.gsub)161 938 y(local)i(function)g (purify\(s\))240 1029 y(return)g(gsub\(gsub\(s,)g(sep_white_char,)i(')d ('\),)f(disappears,)j(''\))161 1121 y(end)161 1212 y(--)e(special)h (characters)g(are)f(purified)h(by)f(removing)h(all)f (non-alphanumerics,)161 1303 y(--)g(including)h(white)g(space)f(and)g (sep-chars)161 1395 y(local)h(function)g(spurify\(s\))240 1486 y(return)g(gsub\(s,)f('[^\045w')h(..)f(high_alpha)h(..)f(']+',)g (''\))161 1577 y(end)161 1669 y(local)h(purify_all_chars)i(=)c({)h(oe)f (=)h(true,)g(OE)g(=)f(true,)i(ae)e(=)h(true,)g(AE)g(=)f(true,)i(ss)e(=) h(true)g(})161 1851 y(function)i(bst.purify\(s\))240 1943 y(local)e(t)g(=)f(brace_split\(s\))240 2034 y(for)h(i)f(=)h(1,)f (table.getn\(t\))k(do)318 2125 y(local)e(_,)e(k,)h(cmd)g(=)f (find\(t[i],)j('^{\\\\\(\045a+\)\045s*'\))318 2217 y(if)e(k)g(then)397 2308 y(if)g(lower_specials[cmd])j(or)d(upper_specials[cmd])j(then)475 2399 y(if)d(not)g(purify_all_chars[cmd])k(then)554 2491 y(cmd)c(=)f(string.sub\(cmd,)k(1,)c(1\))475 2582 y(end)475 2673 y(t[i])h(=)g(cmd)g(..)f(spurify\(string.sub\(t[i],)45 b(k+1\)\))397 2765 y(else)475 2856 y(t[i])40 b(=)g (spurify\(string.sub\(t[i],)45 b(k+1\)\))397 2947 y(end)318 3039 y(elseif)c(find\(t[i],)g('^{\\\\'\))g(then)397 3130 y(t[i])f(=)f(spurify\(t[i]\))318 3221 y(else)397 3313 y(t[i])h(=)f(purify\(t[i]\))318 3404 y(end)240 3495 y(end)240 3587 y(return)i(table.concat\(t\))161 3678 y(end)83 3769 y(end)1908 5400 y Ft(72)p eop end %%Page: 73 73 TeXDict begin 73 72 bop 0 83 a Fu(T)-8 b(ext)32 b(pre\014x)83 b Ft(F)-7 b(unction)27 b Fs(text)p 1070 83 27 4 v 30 w(prefix)d Ft(\(classic)i Fs(text.prefix$)p Ft(\))c(tak)n(es)k(an)g (initial)h(substring)f(of)h(a)f(string,)h(with)g(the)0 183 y(pro)n(viso)f(that)i(a)f(B)l Fr(i)n(b)-7 b Ft(T)701 208 y(E)747 183 y(X)28 b(\\sp)r(ecial)f(c)n(haracter")e(sequence)i (coun)n(ts)g(as)g(a)g(single)g(c)n(haracter.)-286 299 y Fm(73a)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2294 b Fm(\(27b\))48 b Ff(/)12 b Fm(72)48 b(73c)13 b Ff(.)83 390 y Fj(bst.doc.text_prefix)44 b(=)39 b("string)i(*)e(int)h(->)g(string)80 b(#)39 b(take)h(first)h(n)e (chars)h(with)h(special)f(==)g(1")83 482 y(function)h (bst.text_prefix\(s,)i(n\))161 573 y(local)e(t)e(=)h(brace_split\(s\)) 161 664 y(local)h(answer,)g(rem)f(=)f('',)h(n)161 756 y(for)g(i)g(=)f(1,)h(table.getn\(t\),)i(2)e(do)240 847 y(answer)h(=)e(answer)i(..)e(string.sub\(t[i],)k(1,)d(rem\))240 938 y(rem)g(=)f(rem)h(-)g(string.len\(t[i]\))240 1029 y(if)g(rem)g(<=)f(0)h(then)g(return)g(answer)h(end)240 1121 y(if)f(find\(t[i+1],)i('^{\\\\'\))e(then)318 1212 y(answer)h(=)e(answer)i(..)f(t[i+1])318 1303 y(rem)g(=)g(rem)g(-)f(1) 240 1395 y(else)318 1486 y Fl(h)p Fk(take)29 b(up)f(to)g Fj(rem)g Fk(char)l(acters)j(fr)l(om)c Fj(t[i+1])p Fk(,)h(not)g(c)l (ounting)h(br)l(ac)l(es)h Fm(73b)p Fl(i)240 1577 y Fj(end)161 1669 y(end)161 1760 y(return)41 b(answer)83 1851 y(end)-290 2009 y Fm(73b)181 b Fl(h)p Fk(take)29 b(up)e(to)i Fj(rem)f Fk(char)l(acters)i(fr)l(om)d Fj(t[i+1])p Fk(,)i(not)f(c)l(ounting)h(br) l(ac)l(es)g Fm(73b)p Fl(i)q Fq(\021)1487 b Fm(\(73a\))83 2100 y Fj(local)40 b(s)g(=)f(t[i+1])83 2192 y(local)h(braces)h(=)e(0)83 2283 y(local)h(sub)g(=)g(string.sub)83 2374 y(for)g(i)f(=)h(1,)g (string.len\(s\))i(do)161 2466 y(local)f(c)e(=)h(sub\(s,)g(i,)g(i\))161 2557 y(if)g(c)g(==)f('{')h(then)240 2648 y(braces)h(=)e(braces)i(+)e(1) 161 2740 y(elseif)i(c)f(==)f('}')h(then)240 2831 y(braces)h(=)e(braces) i(+)e(1)161 2922 y(else)240 3014 y(rem)h(=)f(rem)h(-)g(1)240 3105 y(if)g(rem)g(==)f(0)h(then)318 3196 y(return)h(answer)g(..)e (string.sub\(s,)j(1,)e(i\))g(..)f(string.rep\('}',)k(braces\))240 3288 y(end)161 3379 y(end)83 3470 y(end)83 3562 y(answer)e(=)e(answer)i (..)e(s)0 3819 y Fu(Emptiness)33 b(test)83 b Ft(F)-7 b(unction)31 b Fs(empty)e Ft(\(classic)h Fs(empty$)p Ft(\))e(tells)j(if)g(a)f(v)-5 b(alue)31 b(is)f(empt)n(y;)j(i.e.,)e(it)g (is)g(missing)f(\(nil\))h(or)f(it)h(is)0 3919 y(only)c(white)h(space.) -282 4035 y Fm(73c)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2254 b Fm(\(27b\))49 b Ff(/)12 b Fm(73a)48 b(74a)13 b Ff(.)83 4126 y Fj(bst.doc.empty)42 b(=)e("string)g(option)h(->)f(bool)g(#)f(is) h(string)h(there)f(and)g(holding)h(nonspace?")83 4217 y(function)g(bst.empty\(s\))161 4309 y(return)g(s)f(==)f(nil)h(or)g (not)g(find\(s,)h('\045S'\))83 4400 y(end)1908 5400 y Ft(73)p eop end %%Page: 74 74 TeXDict begin 74 73 bop 0 83 a Fn(5.6)112 b(Other)38 b(utilities)0 236 y Fu(A)27 b(stable)f(sort)83 b Ft(F)-7 b(unction)24 b Fs(bst.sort)c Ft(is)j(lik)n(e)g Fs(table.sort)c Ft(only)k(stable.)35 b(It)23 b(is)g(needed)h(b)r(ecause)f(classic)f(B)l Fr(i)n(b)-7 b Ft(T)3620 261 y(E)3666 236 y(X)23 b(uses)0 336 y(a)k(stable)g(sort.)37 b(Its)27 b(in)n(terface)g(is)h(the)g(same)f (as)g Fs(table.sort)p Ft(.)-286 452 y Fm(74a)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2254 b Fm(\(27b\))49 b Ff(/)12 b Fm(73c)48 b(74b)13 b Ff(.)83 543 y Fj(bst.doc.sort)42 b(=)d('value)i(list)f(*)g (compare)g(option)h(#)e(like)i(table.sort,)g(but)f(stable')83 635 y(function)h(bst.sort\(t,)h(lt\))161 726 y(lt)e(=)g(lt)f(or)h (function\(x,)i(y\))d(return)i(x)e(<)h(y)f(end)161 817 y(local)i(pos)f(=)f({)h(})f(---)h(position)h(of)f(each)g(element)h(in)e (original)i(table)161 909 y(for)f(i)g(=)f(1,)h(table.getn\(t\))i(do)e (pos[t[i]])h(=)f(i)f(end)161 1000 y(local)i(function)g(nlt\(x,)f(y\)) 240 1091 y(if)g(lt\(x,)g(y\))g(then)318 1183 y(return)h(true)240 1274 y(elseif)g(lt\(y,)f(x\))g(then)318 1365 y(return)h(false)240 1457 y(else)f(--)g(elements)h(look)f(equal)318 1548 y(return)h(pos[x])g (<)e(pos[y])240 1639 y(end)161 1731 y(end)161 1822 y(return)i (table.sort\(t,)h(nlt\))83 1913 y(end)83 2005 y(bst.doc.sort)g(=)d ('value)i(list)f(*)g(compare)g(option)h(->)f(unit)79 b(#)40 b(stable)g(sort')0 2245 y Fu(The)c(standard)h(mon)m(ths)82 b Ft(Ev)n(ery)30 b(st)n(yle)h(is)g(required)f(to)h(recognize)e(the)j (mon)n(ths,)f(so)g(w)n(e)f(mak)n(e)h(it)g(easy)f(to)h(create)f(a)0 2345 y(fresh)d(table)h(with)g(either)f(full)i(or)d(abbreviated)h(mon)n (ths.)-290 2461 y Fm(74b)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2254 b Fm(\(27b\))49 b Ff(/)12 b Fm(74a)48 b(75a)13 b Ff(.)83 2553 y Fj(bst.doc.months)42 b(=)e("string)h(option)f(->)g(table)g(#)g (macros)g(table)h(containing)g(months")83 2644 y(function)g (bst.months\(what\))161 2735 y(local)g(m)e(=)h({)240 2826 y(jan)g(=)f("January",)j(feb)e(=)f("February",)j(mar)e(=)f ("March",)i(apr)f(=)g("April",)240 2918 y(may)g(=)f("May",)i(jun)f(=)f ("June",)i(jul)f(=)f("July",)i(aug)f(=)g("August",)240 3009 y(sep)g(=)f("September",)j(oct)e(=)g("October",)h(nov)f(=)f ("November",)j(dec)e(=)g("December")h(})161 3100 y(if)f(what)g(==)g ('short')h(or)e(what)i(==)e(3)h(then)240 3192 y(for)g(k,)g(v)f(in)h (pairs\(m\))h(do)318 3283 y(m[k])g(=)e(string.sub\(v,)j(1,)e(3\))240 3374 y(end)161 3466 y(end)161 3557 y(return)h(m)83 3648 y(end)1908 5400 y Ft(74)p eop end %%Page: 75 75 TeXDict begin 75 74 bop 0 83 a Fu(Comma-separated)38 b(lists)82 b Ft(The)33 b(function)h Fs(commafy)c Ft(tak)n(es)j(a)g (list)g(and)g(inserts)g(commas)g(and)g Fs(and)f Ft(\(or)h Fs(or)p Ft(\))f(using)0 183 y(American)27 b(con)n(v)n(en)n(tions.)35 b(F)-7 b(or)27 b(example,)208 349 y Fs(commafy)40 b({)j('Graham',)d ('Knuth',)h('Patashnik')e(})0 515 y Ft(returns)27 b Fs('Graham,)40 b(Knuth,)h(and)i(Patashnik')p Ft(,)23 b(but)208 681 y Fs(commafy)40 b({)j('Knuth',)e('Plass')f(})0 847 y Ft(returns)27 b Fs('Knuth)41 b(and)h(Plass')p Ft(.)-286 963 y Fm(75a)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2247 b Fm(\(27b\))48 b Ff(/)12 b Fm(74b)48 b(75b)13 b Ff(.)83 1054 y Fj(bst.doc.commafy)43 b(=)c("string)i(list)f(->)g(string)g(#)g(concat)g(separated)i(by)d (commas,)i(and")83 1146 y(function)g(bst.commafy\(t,)h(andword\))161 1237 y(andword)f(=)f(andword)h(or)e('and')161 1328 y(local)i(n)e(=)h (table.getn\(t\))161 1420 y(if)g(n)g(==)f(1)h(then)240 1511 y(return)h(t[1])161 1602 y(elseif)g(n)f(==)f(2)h(then)240 1694 y(return)h(t[1])f(..)f(')h(')f(..)h(andword)h(..)e(')h(')f(..)h (t[2])161 1785 y(else)240 1876 y(local)g(last)g(=)g(t[n])240 1968 y(t[n])g(=)g(andword)g(..)g(')f(')h(..)g(t[n])240 2059 y(local)g(answer)h(=)e(table.concat\(t,)k(',)d('\))240 2150 y(t[n])g(=)g(last)240 2242 y(return)h(answer)161 2333 y(end)83 2424 y(end)0 2724 y Fv(6)135 b(T)-11 b(esting)45 b(and)g(so)g(on)0 2906 y Ft(Here)23 b(are)f(a)g(couple)h(of)g(test)g (functions)g(I)g(used)g(during)g(dev)n(elopmen)n(t)f(that)i(I)f(though) n(t)f(migh)n(t)h(b)r(e)h(w)n(orth)e(k)n(eeping)g(around.)-290 3022 y Fm(75b)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2254 b Fm(\(27b\))49 b Ff(/)12 b Fm(75a)48 b(76a)13 b Ff(.)83 3113 y Fj(bibtex.doc.cat)42 b(=)e('string)h(->)e(unit)i(#)e(emit)h(the)g(named)g(bib)g(file)g(in)g (bib)g(format')83 3204 y(function)h(bibtex.cat\(bib\))161 3296 y(local)g(rdr)f(=)f(bibtex.open\(bib,)k(bst.months\(\)\))161 3387 y(if)d(not)g(rdr)g(then)240 3478 y(rdr)g(=)f (assert\(bibtex.open\(assert\(bi)q(btex)q(.bibp)q(ath\()q(bib\))q(\),) 45 b(bst.months\(\)\)\))161 3570 y(end)161 3661 y(for)40 b(type,)h(key,)f(fields)g(in)g(entries\(rdr\))i(do)240 3752 y(if)e(type)g(==)f(nil)h(then)318 3844 y(break)240 3935 y(elseif)h(not)e(type)i(then)318 4026 y(io.stderr:write\('Error)k (on)39 b(key)h(',)g(key,)g('\\n'\))240 4118 y(else)318 4209 y(emit_tkf.bib\(io.stdout,)45 b(type,)40 b(key,)g(fields\))240 4300 y(end)161 4392 y(end)161 4483 y(bibtex.close\(rdr\))83 4574 y(end)1908 5400 y Ft(75)p eop end %%Page: 76 76 TeXDict begin 76 75 bop -286 83 a Fm(76a)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2247 b Fm(\(27b\))48 b Ff(/)12 b Fm(75b)48 b(76b)13 b Ff(.)83 174 y Fj(bibtex.doc.count)43 b(=)c('string)i(list)f (->)g(unit)g(#)g(take)g(list)g(of)g(bibs)g(and)g(print)g(number)h(of)e (entries')83 266 y(function)i(bibtex.count\(argv\))161 357 y(local)g(bibs)f(=)f({)h(})161 448 y(local)h(macros)f(=)g({)f(})161 540 y(local)i(n)e(=)h(0)161 631 y Fl(h)p Fk(make)28 b Fj(bibs)h Fk(the)f(list)f(of)h(p)l(athnames)h(implie)l(d)e(by)h Fj(argv)g Fm(54a)p Fl(i)161 722 y Fj(local)41 b(function)g(warn\(\))f (end)161 814 y(for)g(_,)g(bib)g(in)g(ipairs\(bibs\))i(do)240 905 y(local)e(rdr)g(=)g(bibtex.open\(bib,)j(macros\))240 996 y(for)d(type,)g(key,)g(fields)h(in)f(entries\(rdr\))i(do)318 1088 y(if)e(type)g(==)g(nil)g(then)397 1179 y(break)318 1270 y(elseif)h(type)f(then)397 1362 y(n)f(=)h(n)f(+)h(1)318 1453 y(end)240 1544 y(end)240 1636 y(rdr:close\(\))161 1727 y(end)161 1818 y(printf\("\045d\\n",)j(n\))83 1910 y(end)-290 2084 y Fm(76b)181 b Fl(h)p Fk(exp)l(orte)l(d)30 b(Lua)e(functions)g Fm(30c)p Fl(i)q Ft(+)o Fq(\021)2454 b Fm(\(27b\))49 b Ff(/)12 b Fm(76a)83 2175 y Fj(bibtex.doc.all_entries) 44 b(=)c("bibname)h(*)e(macro-table)j(->)e(preamble)h(*)e(citation)i (list")83 2267 y(function)g(bibtex.all_entries\(bib,)k(macros\))161 2358 y(macros)c(=)f(macros)g(or)g(bst.months\(\))161 2449 y(warn)h(=)e(warn)h(or)g(emit_warning)161 2540 y(local)h(rdr)f(=)f (bibtex.open\(bib,)k(macros,)e(warn\))161 2632 y(if)f(not)g(rdr)g(then) 240 2723 y(rdr)g(=)f(assert\(bibtex.open\(assert\(bi)q(btex)q(.bibp)q (ath\()q(bib\))q(\),)45 b(macros,)c(warn\),)750 2814 y("could)f(not)g(open)h(bib)e(file)i(")e(..)h(bib\))161 2906 y(end)161 2997 y(local)h(cs)f(=)f({)g(})161 3088 y(local)i(seen)f(=)f({)h(})161 3180 y(for)g(type,)h(key,)f(fields)g(in) g(entries\(rdr\))i(do)240 3271 y(if)e(type)g(==)f(nil)h(then)318 3362 y(break)240 3454 y(elseif)h(not)e(type)i(then)318 3545 y(io.stderr:write\(key,)j('\\n'\))240 3636 y(elseif)d(not)e (seen[key])j(then)318 3728 y(seen[key])g(=)d(true)318 3819 y(table.insert\(cs,)k({)d(type)g(=)f(type,)i(key)f(=)f(key,)h (fields)h(=)e(fields,)i(file)f(=)g(bib,)1064 3910 y(line)g(=)f (rdr.entry_line)k(}\))240 4002 y(end)161 4093 y(end)161 4184 y(local)e(p)e(=)h(assert\(rdr.preamble\))161 4276 y(rdr:close\(\))161 4367 y(return)h(p,)f(cs)83 4458 y(end)1908 5400 y Ft(76)p eop end %%Page: 77 77 TeXDict begin 77 76 bop 0 83 a Fv(7)135 b(Laundry)44 b(list)0 265 y Ft(THINGS)28 b(TO)g(DO:)125 431 y Fq(\017)41 b Ft(TRANSITION)28 b(THE)f(C)h(CODE)f(TO)g(LUA)h(NA)-7 b(TIVE)28 b(ERR)n(OR)f(HANDLING)i(\()p Fs(luaL)p 3080 431 27 4 v 30 w(error)d Ft(and)h Fs(pcall)p Ft(\))125 597 y Fq(\017)41 b Ft(NO)27 b(W)-9 b(ARNING)29 b(F)n(OR)e(DUPLICA)-7 b(TE)28 b(FIELDS)f(NOT)h(DEFINED)g(IN)g(.BST?)125 763 y Fq(\017)41 b Ft(ST)-7 b(AND)n(ARD)29 b(W)-9 b(ARNING)29 b(F)n(OR)e(REPEA)-7 b(TED)26 b(ENTR)-7 b(Y?)125 929 y Fq(\017)41 b Ft(NOT)31 b(ENF)n(OR)n(CED:)g(An)h(en)n(try)f(t)n(yp)r(e)h (m)n(ust)g(b)r(e)g(de\014ned)g(in)g(the)h Fs(.bst)d Ft(\014le)i(if)g (this)g(en)n(try)f(is)h(to)f(b)r(e)i(included)f(in)208 1029 y(the)c(reference)e(list.)125 1195 y Fq(\017)41 b Ft(THE)27 b(WHOLE)g(BST-SEAR)n(CH)g(THING)i(NEEDS)e(MORE)g(CARE.)208 1328 y(BibT)-7 b(eX)26 b(searc)n(hes)e(the)j(directories)e(in)h(the)g (path)h(de\014ned)f(b)n(y)g(the)h(BSTINPUTS)f(en)n(vironmen)n(t)f(v)-5 b(ariable)25 b(for)h(.bst)208 1427 y(\014les.)58 b(If)36 b(BSTINPUTS)f(is)f(not)h(set,)i(it)e(uses)g(the)g(system)g(default.)59 b(F)-7 b(or)34 b(.bib)i(\014les,)g(it)g(uses)e(the)h(BIBINPUTS)208 1527 y(en)n(vironmen)n(t)26 b(v)-5 b(ariable)27 b(if)h(that)g(is)f (set,)h(otherwise)f(the)h(default.)37 b(See)27 b(tex\(1\))h(for)f(the)h (details)g(of)f(the)h(searc)n(hing.)208 1660 y(If)h(the)g(en)n (vironmen)n(t)f(v)-5 b(ariable)28 b(TEXMF)n(OUTPUT)h(is)f(set,)i(BibT) -7 b(eX)29 b(attempts)g(to)g(put)h(its)f(output)h(\014les)f(in)g(it,)h (if)208 1759 y(they)i(cannot)f(b)r(e)i(put)f(in)h(the)f(curren)n(t)f (directory)-7 b(.)49 b(Again,)33 b(see)e(tex\(1\).)51 b(No)32 b(sp)r(ecial)f(searc)n(hing)g(is)g(done)h(for)g(the)208 1859 y(.aux)27 b(\014le.)125 2025 y Fq(\017)41 b Ft(RA)-7 b(TIONALIZE)31 b(ERR)n(OR)h(MA)n(CHINER)-7 b(Y)32 b(WITH)h(W)-9 b(ARNING,)33 b(ERR)n(OR,)f(AND)h(F)-9 b(A)i(T)g(AL)32 b(CASES)g({)g(AND)208 2125 y(COUNTS.)125 2291 y Fq(\017)41 b Ft(Here)27 b(are)f(some)h(things)h(that)g(B)l Fr(i)n(b)-7 b Ft(T)1345 2316 y(E)1391 2291 y(X)28 b(do)r(es)f(that)h(N)l Fr(bi)n(b)-7 b Ft(T)2064 2316 y(E)2111 2291 y(X)28 b(should)f(do:)284 2457 y(1.)41 b(W)-7 b(rites)28 b(a)f(log)g(\014le)284 2589 y(2.)41 b(Coun)n(ts)27 b(w)n(arnings,)f(or)h(if)h(there)g(is)f(an) g(error,)f(coun)n(ts)h(errors)e(instead)1908 5400 y(77)p eop end %%Trailer userdict /end-hook known{end-hook}if %%EOF nbibtex-0.9.18/nbibtex.1.in0000664007651200140720000002061211042436412013217 0ustar nrnr.TH NBIBTEX 1 "15 May 2006" .\"===================================================================== .if t .ds TX \fRT\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X\fP .if n .ds TX TeX .ie t .ds OX \fIT\v'+0.25m'E\v'-0.25m'X\fP for troff .el .ds OX TeX for nroff .\" the same but obliqued .\" BX definition must follow TX so BX can use TX .if t .ds BX \fRNB\s-2IB\s0\fP\*(TX .if n .ds BX NbibTeX .\" OB definition must follow TX so OB can use TX .if t .ds OB \fRB\s-2IB\s0\fP\*(TX .if n .ds OB BibTeX .\" LX definition must follow TX so LX can use TX .if t .ds LX \fRL\\h'-0.36m'\\v'-0.15v'\\s-2A\\s0\\h'-0.15m'\\v'0.15v'\fP\*(TX .if n .ds LX LaTeX .\"===================================================================== .SH NAME nbibtex \- make a bibliography for LaTeX .SH SYNOPSIS .B nbibtex .RI [ options ] .IR auxname [\fB.aux\fP] .RI [ bibname ...] .\"===================================================================== .SH DESCRIPTION \*(BX is a drop-in replacement for \*(OB. It reads the top-level auxiliary .RI ( .aux ) file that was output during the running of .BR latex (1) or .BR tex (1) and creates a bibliography .RI ( .bbl ) file that will be incorporated into the document on subsequent runs of \*(LX or \*(TX. .PP \*(BX looks up, in bibliographic database .RI ( .bib ) files specified by the \\bibliography command, the entries specified by the \\cite and \\nocite commands in the \*(LX or \*(TX source file. The association of \\cite command with .I ".bib" entry is made by a simple query language described below. \*(BX formats the information from the .I ".bib" entries according to instructions in a bibliography style .RI ( .nbs ) file (specified by the \\bibliographystyle command, and it outputs the results to the .I .bbl file. .PP If the optional .IR bibname s are used, \*(BX looks in the named bibliographies .I instead of those specified by the \\bibliography command. A .I bibname without a slash (/) character means the same thing it would mean in a \\bibliographystyle command: it is looked up according to the .rules of \*(OB. A .I bibname with a slash character is taken to be the absolute or relative pathname of a .I ".bib" file. Explicit .IR bibname s can be used with the .B "-bib" and .B "-o" options to make a paper-specific .I .bib file from larger .I .bib files. .PP The \*(LX manual explains what a \*(LX source file must contain to work with \*(BX. Appendix B of the manual describes the format of the .I .bib files. The `\*(BXing' document describes extensions and details of this format, and it gives other useful hints for using \*(BX. .\"===================================================================== .SH OPTIONS .TP .BI "-min-crossrefs=" number The .B -min-crossrefs option defines the minimum number of .B crossref required for automatic inclusion of the crossref'd entry on the citation list; the default is 2. .TP .B "-terse" Accepted for backward compatibility with \*(OB; \*(BX is terse by default. .TP .B "-permissive" Enables \*(BX to continue working even when some of the .I .bib files mentioned in the \\bibliography command are missing. Also tells \*(BX not to object if duplicate entries are found in multiple .I .bib files. .TP .B "-strict" Tells \*(BX to complain about all irregularities it spots in any .I .bib file it parses. By default, \*(BX (like \*(OB) complains only about entries it actually intends to use. .TP .BI "-o " file Writes the bibliography to .I file instead of to the default .IB auxname .bbl . If .I file is .BR "-" , writes to standard output. .TP .B "-bib" Instead of writing a bibliography for use by \*(LX, writes exactly those \*(BX entries needed by .IR auxname. Useful for making paper-specific .I .bib files. .TP .B "-help" Emit a short help message and exit. .TP .B "-version" Emit version information and exit. .PP .\"===================================================================== .SH EXAMPLES To make a normal bibliography for file .BR paper.tex: .IP .B "nbibtex paper" .PP To use the personal .I .bib file .B personal.bib to make a paper-specific bibliography for file .BR paper.tex , which should use the command .BR "\\bibliography{paper}" : .IP .B "nbibtex -o paper.bib -bib paper personal" .PP The file .B personal.bib should be found on the usual BIBINPUTS path. .PP To extend the bibliography .B paper.bib by filling in missing entries from .BR personal.bib : .IP .B "nbibtex -permissive -o paper.bib -bib paper paper personal" .\"===================================================================== .SH QUERY LANGUAGE To specify a paper you wish to cite, classic \*(OB requires an arbitrary key. The advantage of \*(BX is that you cite a paper by the .I contents of the \*(BX entry. .IP The citation consists of a sequence of one or more .I constraints separated by colons. A constraint may be empty. .IP A nonempty constraint is of the form .IB key = words\fR, where .I key is the name of a field in the \*(BX entry and .I words is a sequence of one or more words separated by dashes. The contraint is satisfied if every word in .I words is found in the field named by .I key. (The .I key may also be .BR "[type]" , which matches agains the type of the entry, or .BR "*" , which looks for .I words in .I any field.) .PP For example, the following queries might match an entry for a useful source on arithmetic: .IP .B "author=knuth:series=art-programming:volume=2" .br .B "author=knuth:title=seminumerical:year=1981 .PP As a convenience, keys may be defaulted in up to three constraints. In the first constraint, the default key is .B author (or if there is no author, .BR editor ). In the second constraint, the default key is .B year if .I words is all digits, and is .B title otherwise. In the third constraint, the default key is .B year if .I words is all digits, and is .B "[type]" otherwise. So for example, we could have written .IP .B "knuth:seminumerical:1981" .PP To match a word in .IR words , \(*BX uses the Boyer-Moore string-matching algorithm, so longer words are usually faster. .PP \*(BX's query language can be used on the command line by .BR nbibfind (1). .\"===================================================================== .SH NBIBTEX STYLES AND COMPATIBILITY WITH \*(OB Like \*(OB, \*(BX supports a variety of "styles" of bibliography. Each style is defined by a program written in Lua, using additional primitives suitable to construction of bibliographies. \*(BX provides the three standard styles in a form suitable for use with the .B natbib package. .PP Additional styles may be created by writing new Lua code; for example, an author wishing to create a style called .B mcbride would put a file called .B mcbride.nbs (for New \*(OB Style) in the directory .BR "" . For guidance on what goes into such a file, consult the other files in that directory and the literate source code for \*(BX. .\"===================================================================== .SH ENVIRONMENT .\"\*(BX searches the directories in the .\"path defined by the BSTINPUTS environment variable for .\".I .bst .\"files. If BSTINPUTS is not set, it uses .\"the NBSINPUTS variable. .\"If neither is set, it uses .\"the system default. For .I .bib files, \*(BX searches the directories in the path defined by the BIBINPUTS environment variable if that is set, otherwise the default. For details of the searching, see .BR tex (1) and .BR kpsewhich (1). .PP .\"If the environment variable .\"TEXMFOUTPUT is set, \*(BX attempts to put its output .\"files in it, if they cannot be put in the current directory. .\"WRONG!!! .\"Again, see .\".BR tex (1). No special searching is done for the .I .aux file. .\"===================================================================== .SH FILES .TP .I /*.nbs New bibliography style files. .\"===================================================================== .SH BUGS Although I have made some effort in this direction, compatibility with \*(OB does not extend to .B ".bib" files containing non-ASCII characters. .\"===================================================================== .SH "SEE ALSO" .BR nbibfind (1), .BR latex (1), .BR tex (1), .BR kpsewhich (1), .BR bibtex (1). .br Leslie Lamport, .IR "\*(LX \- A Document Preparation System" , Addison-Wesley, 1985, ISBN 0-201-15790-X. .br The \*(BX home page at .BR "http://www.eecs.harvard.edu/~nr/nbibtex" . .br The Lua home page at .BR "http://www.lua.org" . .\"===================================================================== .SH AUTHOR Norman Ramsey, Harvard University.