diff options
author | Lua Team <team@lua.org> | 1995-11-28 12:00:00 +0000 |
---|---|---|
committer | repogen <> | 1995-11-28 12:00:00 +0000 |
commit | 71754d2f6423fb9b6e87658e58bafc5470d53f65 (patch) | |
tree | c704e97b80e52a52d3152738941bb4c8ca676b97 | |
parent | a8b6ba0954edb9e0e669e1f451b9a8f145ce5166 (diff) | |
download | lua-github-71754d2f6423fb9b6e87658e58bafc5470d53f65.tar.gz |
Lua 2.22.2
42 files changed, 5152 insertions, 4316 deletions
@@ -1,18 +1,24 @@ -Copyright (c) 1994-1995 -Waldemar Celes Filho, Luiz Henrique de Figueiredo, Roberto Ierusalimschy. -All rights reserved. +Copyright (c) 1994-1995 TeCGraf, PUC-Rio. Written by Waldemar Celes Filho, +Roberto Ierusalimschy, Luiz Henrique de Figueiredo. All rights reserved. -Permission is hereby granted, without written agreement and without license -or royalty fees, to use, copy, modify, and distribute this software and its -documentation for any purpose, provided that the above copyright notice and -the following two paragraphs appear in all copies of this software. +Permission is hereby granted, without written agreement and without license or +royalty fees, to use, copy, modify, and distribute this software and its +documentation for any purpose, subject to the following conditions: -In no event shall the authors be liable to any party for direct, indirect, -special, incidental, or consequential damages arising out of the use of this -software and its documentation. +The above copyright notice and this permission notice shall appear in all +copies or substantial portions of this software. -The authors specifically disclaims any warranties, including, but not limited +The name "Lua" cannot be used for any modified form of this software that does +not originate from the authors. Nevertheless, the name "Lua" may and should be +used to designate the language implemented and described in this package, +even if embedded in any other system, as long as its syntax and semantics +remain unchanged. + +The authors specifically disclaim any warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular -purpose. the software provided hereunder is on an "as is" basis, and the +purpose. The software provided hereunder is on an "as is" basis, and the authors have no obligation to provide maintenance, support, updates, -enhancements, or modifications. +enhancements, or modifications. In no event shall TeCGraf, PUC-Rio, or the +authors be liable to any party for direct, indirect, special, incidental, or +consequential damages arising out of the use of this software and its +documentation. @@ -5,38 +5,48 @@ Dozens of industrial products developed by TeCGraf use Lua. * Some features of Lua - + a simple, pascal-like, syntax; - + powerful data description constructs (e.g., associative arrays); - + user-controlled type constructors; - + fallbacks for extending the meaning of the language in unconventional ways; - + Lua programs are compiled into bytecodes, which are then interpreted to - simulate a virtual machine; - + portable, written in ANSI C. + + a simple, pascal-like, syntax + + powerful data description constructs (e.g., associative arrays) + + user-controlled type constructors + + fallbacks for extending the language in unconventional ways (e.g., + inheritance, overloading) + + garbage collection + + Lua programs are compiled into bytecodes, which are then interpreted + + portable, written in ANSI C (runs in Unix, DOS, Windows, Mac, Cray, ...) * Availability - ftp://ftp.icad.puc-rio.br/pub/lua/lua-2.1.tar.gz - http://www.inf.puc-rio.br/projetos/roberto/lua.html + In Brazil: ftp://ftp.icad.puc-rio.br/pub/lua/lua-2.2.tar.gz + In Canada: ftp://csg.uwaterloo.ca/pub/lhf/lua/lua-2.2.tar.gz + Home page: http://www.inf.puc-rio.br/~roberto/lua.html -* Changes since version 1.1 (current version is 2.1) - + object-oriented support; - + fallbacks; - + simplified syntax for tables; - + many internal improvements. +* Legal matters + Lua is freely available for both academic and commercial purposes. + Lua is not in the public domain; TeCGraf keeps its copyright. + See COPYRIGHT. + +* Changes since version 2.1 (current version is 2.2) + + functions now may be declared with any "lvalue" as a name + + garbage collection of functions + + support for pipes + +* Changes since version 1.1 + + object-oriented support + + fallbacks + + simplified syntax for tables + + many internal improvements * Installing To make, simply type domake. If make succeeds, you get an interpreter in ./bin/lua. + If make fails, please let me know. The libraries are in ./lib. The include files are in ./include. You don't need the other directories for development. - There is a reference manual in ./doc and tests in ./test. + There is a reference manual in ./doc, and tests and examples in ./test. This distribution is biased towards SunOS 4 with gcc but it is simple to - change the Makefiles for other systems. + change the Makefiles for other systems, if necessary. If you are running SunOs, type also "domake dynamic" to build shared libraries in ./lib. - -* Legal matters - Lua is now freely available for both academic and commercial purposes. - Lua is not in the public domain; TeCGraf keeps its copyright. + If your system does not have "popen", then change ./clients/lib/Makefile. * Contacting the authors Send your comments, bug reports and anything else to lhf@icad.puc-rio.br. diff --git a/clients/lib/Makefile b/clients/lib/Makefile index b191b750..70750979 100644 --- a/clients/lib/Makefile +++ b/clients/lib/Makefile @@ -7,15 +7,19 @@ LIB= $(LUA)/lib INCS= -I/usr/5include -I$(INC) WARN= -Wall -Wmissing-prototypes -Wshadow -ansi +# if your system does not have popen, remove -DPOPEN from the line below +DEFS= -DPOPEN + CC= gcc CFLAGS= $(INCS) $(DEFS) $(WARN) -O2 OBJS= iolib.o mathlib.o strlib.o +SRCS= iolib.c mathlib.c mathlib.h strlib.c strlib.h SLIB= $(LIB)/liblualib.a # dynamic libraries only work for SunOs -DLIB= $(LIB)/liblualib.so.2.1 +DLIB= $(LIB)/liblualib.so.$(VERSION) all: $(SLIB) @@ -32,4 +36,7 @@ clean: rm -f $(OBJS) $(SLIB) $(DLIB) co: - co -M iolib.c mathlib.c mathlib.h strlib.c strlib.h + co -f -M $(SRCS) + +klean: clean + rm -f $(SRCS) diff --git a/clients/lib/iolib.c b/clients/lib/iolib.c index bb3883ab..01f8b553 100644 --- a/clients/lib/iolib.c +++ b/clients/lib/iolib.c @@ -3,7 +3,7 @@ ** Input/output library to LUA */ -char *rcs_iolib="$Id: iolib.c,v 1.21 1995/02/06 19:36:13 roberto Exp $"; +char *rcs_iolib="$Id: iolib.c,v 1.29 1995/11/10 18:32:59 roberto Exp $"; #include <stdio.h> #include <ctype.h> @@ -14,51 +14,68 @@ char *rcs_iolib="$Id: iolib.c,v 1.21 1995/02/06 19:36:13 roberto Exp $"; #include <stdlib.h> #include "lua.h" +#include "luadebug.h" #include "lualib.h" static FILE *in=stdin, *out=stdout; + +#ifdef POPEN +FILE *popen(); +int pclose(); +#else +#define popen(x,y) NULL /* that is, popen always fails */ +#define pclose(x) (-1) +#endif + + +static void closeread (void) +{ + if (in != stdin) + { + if (pclose(in) == -1) + fclose(in); + in = stdin; + } +} + +static void closewrite (void) +{ + if (out != stdout) + { + if (pclose(out) == -1) + fclose(out); + out = stdout; + } +} + /* ** Open a file to read. ** LUA interface: ** status = readfrom (filename) ** where: ** status = 1 -> success -** status = 0 -> error +** status = nil -> error */ static void io_readfrom (void) { - lua_Object o = lua_getparam (1); - if (o == LUA_NOOBJECT) /* restore standart input */ - { - if (in != stdin) - { - fclose (in); - in = stdin; - } + if (lua_getparam (1) == LUA_NOOBJECT) + { /* restore standart input */ + closeread(); lua_pushnumber (1); } else { - if (!lua_isstring (o)) - { - lua_error ("incorrect argument to function 'readfrom`"); - lua_pushnumber (0); - } - else - { - FILE *fp = fopen (lua_getstring(o),"r"); + char *s = lua_check_string(1, "readfrom"); + FILE *fp = (*s == '|') ? popen(s+1, "r") : fopen(s, "r"); if (fp == NULL) - { - lua_pushnumber (0); - } + lua_pushnil(); else { - if (in != stdin) fclose (in); + closeread(); in = fp; lua_pushnumber (1); } - } } } @@ -69,41 +86,27 @@ static void io_readfrom (void) ** status = writeto (filename) ** where: ** status = 1 -> success -** status = 0 -> error +** status = nil -> error */ static void io_writeto (void) { - lua_Object o = lua_getparam (1); - if (o == LUA_NOOBJECT) /* restore standart output */ + if (lua_getparam (1) == LUA_NOOBJECT) /* restore standart output */ { - if (out != stdout) - { - fclose (out); - out = stdout; - } + closewrite(); lua_pushnumber (1); } else { - if (!lua_isstring (o)) - { - lua_error ("incorrect argument to function 'writeto`"); - lua_pushnumber (0); - } - else - { - FILE *fp = fopen (lua_getstring(o),"w"); + char *s = lua_check_string(1, "writeto"); + FILE *fp = (*s == '|') ? popen(s+1,"w") : fopen(s,"w"); if (fp == NULL) - { - lua_pushnumber (0); - } + lua_pushnil(); else { - if (out != stdout) fclose (out); + closewrite(); out = fp; lua_pushnumber (1); } - } } } @@ -115,50 +118,90 @@ static void io_writeto (void) ** where: ** status = 2 -> success (already exist) ** status = 1 -> success (new file) -** status = 0 -> error +** status = nil -> error */ static void io_appendto (void) { - lua_Object o = lua_getparam (1); - if (o == LUA_NOOBJECT) /* restore standart output */ + char *s = lua_check_string(1, "appendto"); + struct stat st; + int r = (stat(s, &st) == -1) ? 1 : 2; + FILE *fp = fopen (s, "a"); + if (fp == NULL) + lua_pushnil(); + else { - if (out != stdout) + if (out != stdout) fclose (out); + out = fp; + lua_pushnumber (r); + } +} + + +static char getformat (char *f, int *just, int *m, int *n) +{ + int t; + switch (*f++) { - fclose (out); - out = stdout; + case 's': case 'S': + t = 's'; + break; + case 'f': case 'F': case 'g': case 'G': case 'e': case 'E': + t = 'f'; + break; + case 'i': case 'I': + t = 'i'; + break; + default: + t = 0; /* to avoid compiler warnings */ + lua_arg_error("read/write (format)"); } - lua_pushnumber (1); - } - else - { - if (!lua_isstring (o)) + *just = (*f == '<' || *f == '>' || *f == '|') ? *f++ : '>'; + if (isdigit(*f)) { - lua_error ("incorrect argument to function 'appendto`"); - lua_pushnumber (0); + *m = 0; + while (isdigit(*f)) + *m = *m*10 + (*f++ - '0'); } else + *m = -1; + if (*f == '.') { - int r; - FILE *fp; - struct stat st; - if (stat(lua_getstring(o), &st) == -1) r = 1; - else r = 2; - fp = fopen (lua_getstring(o),"a"); - if (fp == NULL) - { - lua_pushnumber (0); - } - else - { - if (out != stdout) fclose (out); - out = fp; - lua_pushnumber (r); - } + f++; /* skip point */ + *n = 0; + while (isdigit(*f)) + *n = *n*10 + (*f++ - '0'); } - } + else + *n = -1; + return t; } +static char *add_char (int c) +{ + static char *buff = NULL; + static int max = 0; + static int n = 0; + if (n >= max) + { + if (max == 0) + { + max = 100; + buff = (char *)malloc(max); + } + else + { + max *= 2; + buff = (char *)realloc(buff, max); + } + if (buff == NULL) + lua_error("memory overflow"); + } + buff[n++] = c; + if (c == 0) + n = 0; /* prepare for next string */ + return buff; +} /* ** Read a variable. On error put nil on stack. @@ -174,138 +217,105 @@ static void io_appendto (void) ** Estes especificadores podem vir seguidos de numero que representa ** o numero de campos a serem lidos. */ -static void io_read (void) + +static int read_until_char (int del) +{ + int c; + while((c = fgetc(in)) != EOF && c != del) + add_char(c); + return c; +} + +static int read_until_blank (void) +{ + int c; + while((c = fgetc(in)) != EOF && !isspace(c)) + add_char(c); + return c; +} + +static void read_m (int m) +{ + int c; + while (m-- && (c = fgetc(in)) != EOF) + add_char(c); +} + + +static void read_free (void) { - lua_Object o = lua_getparam (1); - if (o == LUA_NOOBJECT || !lua_isstring(o)) /* free format */ - { int c; - char s[256]; while (isspace(c=fgetc(in))) ; - if (c == '\"') + if (c == EOF) { - int n=0; - while((c = fgetc(in)) != '\"') - { - if (c == EOF) - { - lua_pushnil (); - return; - } - s[n++] = c; - } - s[n] = 0; + lua_pushnil(); + return; } - else if (c == '\'') - { - int n=0; - while((c = fgetc(in)) != '\'') - { + if (c == '\"' || c == '\'') + { /* string */ + c = read_until_char(c); if (c == EOF) { - lua_pushnil (); - return; + add_char(0); /* to be ready for next time */ + lua_pushnil(); } - s[n++] = c; - } - s[n] = 0; + else + lua_pushstring(add_char(0)); } else { - double d; - ungetc (c, in); - if (fscanf (in, "%s", s) != 1) - { - lua_pushnil (); - return; - } - if (sscanf(s, "%lf %*c", &d) == 1) - { - lua_pushnumber (d); - return; - } - } - lua_pushstring (s); - return; - } - else /* formatted */ - { - char *e = lua_getstring(o); - char t; - int m=0; - while (isspace(*e)) e++; - t = *e++; - while (isdigit(*e)) - m = m*10 + (*e++ - '0'); - - if (m > 0) - { - char f[80]; - char s[256]; - sprintf (f, "%%%ds", m); - if (fgets (s, m, in) == NULL) - { - lua_pushnil(); - return; - } - else - { - if (s[strlen(s)-1] == '\n') - s[strlen(s)-1] = 0; - } - switch (tolower(t)) - { - case 'i': - { - long int l; - sscanf (s, "%ld", &l); - lua_pushnumber(l); - } - break; - case 'f': case 'g': case 'e': - { - float fl; - sscanf (s, "%f", &fl); - lua_pushnumber(fl); - } - break; - default: - lua_pushstring(s); - break; - } + double d; + char dummy; + char *s; + add_char(c); + read_until_blank(); + s = add_char(0); + if (sscanf(s, "%lf %c", &d, &dummy) == 1) + lua_pushnumber(d); + else + lua_pushstring(s); } - else +} + +static void io_read (void) +{ + lua_Object o = lua_getparam (1); + if (o == LUA_NOOBJECT) /* free format */ + read_free(); + else /* formatted */ { - switch (tolower(t)) - { - case 'i': + int m, dummy1, dummy2; + switch (getformat(lua_check_string(1, "read"), &dummy1, &m, &dummy2)) { - long int l; - if (fscanf (in, "%ld", &l) == EOF) - lua_pushnil(); - else lua_pushnumber(l); - } - break; - case 'f': case 'g': case 'e': - { - float f; - if (fscanf (in, "%f", &f) == EOF) - lua_pushnil(); - else lua_pushnumber(f); - } - break; - default: - { - char s[256]; - if (fscanf (in, "%s", s) == EOF) - lua_pushnil(); - else lua_pushstring(s); + case 's': + if (m < 0) + read_until_blank(); + else + read_m(m); + lua_pushstring(add_char(0)); + break; + + case 'i': /* can read as float, since it makes no difference to Lua */ + case 'f': + { + double d; + int result; + if (m < 0) + result = fscanf(in, "%lf", &d); + else + { + read_m(m); + result = sscanf(add_char(0), "%lf", &d); + } + if (result == 1) + lua_pushnumber(d); + else + lua_pushnil(); + break; + } } - break; - } } - } } @@ -314,33 +324,13 @@ static void io_read (void) */ static void io_readuntil (void) { - int n=255,m=0; - int c,d; - char *s; - lua_Object lo = lua_getparam(1); - if (!lua_isstring(lo)) - d = EOF; - else - d = *lua_getstring(lo); - - s = (char *)malloc(n+1); - while((c = fgetc(in)) != EOF && c != d) - { - if (m==n) - { - n *= 2; - s = (char *)realloc(s, n+1); - } - s[m++] = c; - } + int del = *lua_check_string(1, "readuntil"); + int c = read_until_char(del); if (c != EOF) ungetc(c,in); - s[m] = 0; - lua_pushstring(s); - free(s); + lua_pushstring(add_char(0)); } - /* ** Write a variable. On error put 0 on stack, otherwise put 1. ** LUA interface: @@ -367,106 +357,100 @@ static void io_readuntil (void) ** inteiros -> numero minimo de digitos ** string -> nao se aplica */ -static char *buildformat (char *e, lua_Object o) + +static int write_fill (int n, int c) { - static char buffer[2048]; - static char f[80]; - char *string = &buffer[255]; - char *fstart=e, *fspace, *send; - char t, j='r'; - int m=0, n=-1, l; - while (isspace(*e)) e++; - fspace = e; - t = *e++; - if (*e == '<' || *e == '|' || *e == '>') j = *e++; - while (isdigit(*e)) - m = m*10 + (*e++ - '0'); - if (*e == '.') e++; /* skip point */ - while (isdigit(*e)) - if (n < 0) n = (*e++ - '0'); - else n = n*10 + (*e++ - '0'); - - sprintf(f,"%%"); - if (j == '<' || j == '|') sprintf(strchr(f,0),"-"); - if (m > 0) sprintf(strchr(f,0),"%d", m); - if (n >= 0) sprintf(strchr(f,0),".%d", n); - switch (t) - { - case 'i': case 'I': t = 'd'; - sprintf(strchr(f,0), "%c", t); - sprintf (string, f, (long int)lua_getnumber(o)); - break; - case 'f': case 'g': case 'e': case 'G': case 'E': - sprintf(strchr(f,0), "%c", t); - sprintf (string, f, (float)lua_getnumber(o)); - break; - case 'F': t = 'f'; - sprintf(strchr(f,0), "%c", t); - sprintf (string, f, (float)lua_getnumber(o)); - break; - case 's': case 'S': t = 's'; - sprintf(strchr(f,0), "%c", t); - sprintf (string, f, lua_getstring(o)); - break; - default: return ""; - } - l = strlen(string); - send = string+l; - if (m!=0 && l>m) - { - int i; - for (i=0; i<m; i++) - string[i] = '*'; - string[i] = 0; - } - else if (m!=0 && j=='|') - { - int k; - int i=l-1; - while (isspace(string[i]) || string[i]==0) i--; - string -= (m-i)/2; - for(k=0; k<(m-i)/2; k++) - string[k] = ' '; - } - /* add space characteres */ - while (fspace != fstart) - { - string--; - fspace--; - *string = *fspace; - } - while (isspace(*e)) *send++ = *e++; - *send = 0; - return string; + while (n--) + if (fputc(c, out) == EOF) + return 0; + return 1; +} + +static int write_string (char *s, int just, int m) +{ + int status; + int l = strlen(s); + int pre; /* number of blanks before string */ + if (m < 0) m = l; + else if (l > m) + { + write_fill(m, '*'); + return 0; + } + pre = (just == '<') ? 0 : (just == '>') ? m-l : (m-l)/2; + status = write_fill(pre, ' '); + status = status && fprintf(out, "%s", s) >= 0; + status = status && write_fill(m-(l+pre), ' '); + return status; +} + +static int write_float (int just, int m, int n) +{ + char buffer[100]; + lua_Object p = lua_getparam(1); + float number; + if (!lua_isnumber(p)) return 0; + number = lua_getnumber(p); + if (n >= 0) + sprintf(buffer, "%.*f", n, number); + else + sprintf(buffer, "%g", number); + return write_string(buffer, just, m); } + + +static int write_int (int just, int m, int n) +{ + char buffer[100]; + lua_Object p = lua_getparam(1); + int number; + if (!lua_isnumber(p)) return 0; + number = (int)lua_getnumber(p); + if (n >= 0) + sprintf(buffer, "%.*d", n, number); + else + sprintf(buffer, "%d", number); + return write_string(buffer, just, m); +} + + static void io_write (void) { - lua_Object o1 = lua_getparam (1); - lua_Object o2 = lua_getparam (2); - if (o1 == LUA_NOOBJECT) /* new line */ - { - fprintf (out, "\n"); - lua_pushnumber(1); - } - else if (o2 == LUA_NOOBJECT) /* free format */ - { - int status=0; - if (lua_isnumber(o1)) - status = fprintf (out, "%g", lua_getnumber(o1)); - else if (lua_isstring(o1)) - status = fprintf (out, "%s", lua_getstring(o1)); - lua_pushnumber(status); - } - else /* formated */ - { - if (!lua_isstring(o2)) - { - lua_error ("incorrect format to function `write'"); - lua_pushnumber(0); - return; + int status = 0; + if (lua_getparam (2) == LUA_NOOBJECT) /* free format */ + { + lua_Object o1 = lua_getparam(1); + if (lua_isnumber(o1)) + status = fprintf (out, "%g", lua_getnumber(o1)) >= 0; + else if (lua_isstring(o1)) + status = fprintf (out, "%s", lua_getstring(o1)) >= 0; } - lua_pushnumber(fprintf (out, "%s", buildformat(lua_getstring(o2),o1))); - } + else /* formated */ + { + int just, m, n; + switch (getformat (lua_check_string(2, "write"), &just, &m, &n)) + { + case 's': + { + lua_Object p = lua_getparam(1); + if (lua_isstring(p)) + status = write_string(lua_getstring(p), just, m); + else + status = 0; + break; + } + case 'f': + status = write_float(just, m, n); + break; + case 'i': + status = write_int(just, m, n); + break; + } + } + if (status) + lua_pushnumber(status); + else + lua_pushnil(); } /* @@ -475,40 +459,18 @@ static void io_write (void) */ static void io_execute (void) { - lua_Object o = lua_getparam (1); - if (o == LUA_NOOBJECT || !lua_isstring (o)) - { - lua_error ("incorrect argument to function 'execute`"); - lua_pushnumber (0); - } - else - { - int res = system(lua_getstring(o)); - lua_pushnumber (res); - } - return; + lua_pushnumber(system(lua_check_string(1, "execute"))); } /* -** Remove a file. -** On error put 0 on stack, otherwise put 1. +** Remove a file. On error return nil. */ static void io_remove (void) { - lua_Object o = lua_getparam (1); - if (o == LUA_NOOBJECT || !lua_isstring (o)) - { - lua_error ("incorrect argument to function 'execute`"); - lua_pushnumber (0); - } - else - { - if (remove(lua_getstring(o)) == 0) + if (remove(lua_check_string(1, "remove")) == 0) lua_pushnumber (1); - else - lua_pushnumber (0); - } - return; + else + lua_pushnil(); } @@ -517,15 +479,9 @@ static void io_remove (void) */ static void io_getenv (void) { - lua_Object s = lua_getparam(1); - if (!lua_isstring(s)) - lua_pushnil(); - else - { - char *env = getenv(lua_getstring(s)); - if (env == NULL) lua_pushnil(); - else lua_pushstring(env); - } + char *env = getenv(lua_check_string(1, "getenv")); + if (env == NULL) lua_pushnil(); + else lua_pushstring(env); } /* @@ -573,7 +529,7 @@ static void io_exit (void) { lua_Object o = lua_getparam(1); if (lua_isstring(o)) - printf("%s\n", lua_getstring(o)); + fprintf(stderr, "%s\n", lua_getstring(o)); exit(1); } @@ -593,6 +549,54 @@ static void io_debug (void) } } + +void lua_printstack (FILE *f) +{ + int level = 0; + lua_Object func; + fprintf(f, "Active Stack:\n"); + while ((func = lua_stackedfunction(level++)) != LUA_NOOBJECT) + { + char *name; + int currentline; + fprintf(f, "\t"); + switch (*getobjname(func, &name)) + { + case 'g': + fprintf(f, "function %s", name); + break; + case 'f': + fprintf(f, "fallback %s", name); + break; + default: + { + char *filename; + int linedefined; + lua_funcinfo(func, &filename, &linedefined); + if (linedefined == 0) + fprintf(f, "main of %s", filename); + else if (linedefined < 0) + fprintf(f, "%s", filename); + else + fprintf(f, "function (%s:%d)", filename, linedefined); + } + } + if ((currentline = lua_currentline(func)) > 0) + fprintf(f, " at line %d", currentline); + fprintf(f, "\n"); + } +} + + +static void errorfb (void) +{ + lua_Object o = lua_getparam(1); + char *s = lua_isstring(o) ? lua_getstring(o) : "(no messsage)"; + fprintf(stderr, "lua: %s\n", s); + lua_printstack(stderr); +} + + /* ** Open io library */ @@ -612,4 +616,7 @@ void iolib_open (void) lua_register ("beep", io_beep); lua_register ("exit", io_exit); lua_register ("debug", io_debug); + lua_register ("print_stack", errorfb); + lua_setfallback("error", errorfb); } + diff --git a/clients/lib/mathlib.c b/clients/lib/mathlib.c index ca5ab780..3f1e57f6 100644 --- a/clients/lib/mathlib.c +++ b/clients/lib/mathlib.c @@ -3,7 +3,7 @@ ** Mathematics library to LUA */ -char *rcs_mathlib="$Id: mathlib.c,v 1.9 1995/02/06 19:36:43 roberto Exp $"; +char *rcs_mathlib="$Id: mathlib.c,v 1.13 1995/11/10 17:54:31 roberto Exp $"; #include <stdio.h> /* NULL */ #include <math.h> @@ -11,19 +11,15 @@ char *rcs_mathlib="$Id: mathlib.c,v 1.9 1995/02/06 19:36:43 roberto Exp $"; #include "lualib.h" #include "lua.h" +#ifndef PI #define PI 3.14159265358979323846 +#endif #define TODEGREE(a) ((a)*180.0/PI) #define TORAD(a) ((a)*PI/180.0) static void math_abs (void) { - double d; - lua_Object o = lua_getparam (1); - if (o == LUA_NOOBJECT) - lua_error ("too few arguments to function `abs'"); - if (!lua_isnumber(o)) - lua_error ("incorrect arguments to function `abs'"); - d = lua_getnumber(o); + double d = lua_check_number(1, "abs"); if (d < 0) d = -d; lua_pushnumber (d); } @@ -31,13 +27,7 @@ static void math_abs (void) static void math_sin (void) { - double d; - lua_Object o = lua_getparam (1); - if (o == LUA_NOOBJECT) - lua_error ("too few arguments to function `sin'"); - if (!lua_isnumber(o)) - lua_error ("incorrect arguments to function `sin'"); - d = lua_getnumber(o); + double d = lua_check_number(1, "sin"); lua_pushnumber (sin(TORAD(d))); } @@ -45,13 +35,7 @@ static void math_sin (void) static void math_cos (void) { - double d; - lua_Object o = lua_getparam (1); - if (o == LUA_NOOBJECT) - lua_error ("too few arguments to function `cos'"); - if (!lua_isnumber(o)) - lua_error ("incorrect arguments to function `cos'"); - d = lua_getnumber(o); + double d = lua_check_number(1, "cos"); lua_pushnumber (cos(TORAD(d))); } @@ -59,104 +43,64 @@ static void math_cos (void) static void math_tan (void) { - double d; - lua_Object o = lua_getparam (1); - if (o == LUA_NOOBJECT) - lua_error ("too few arguments to function `tan'"); - if (!lua_isnumber(o)) - lua_error ("incorrect arguments to function `tan'"); - d = lua_getnumber(o); + double d = lua_check_number(1, "tan"); lua_pushnumber (tan(TORAD(d))); } static void math_asin (void) { - double d; - lua_Object o = lua_getparam (1); - if (o == LUA_NOOBJECT) - lua_error ("too few arguments to function `asin'"); - if (!lua_isnumber(o)) - lua_error ("incorrect arguments to function `asin'"); - d = lua_getnumber(o); + double d = lua_check_number(1, "asin"); lua_pushnumber (TODEGREE(asin(d))); } static void math_acos (void) { - double d; - lua_Object o = lua_getparam (1); - if (o == LUA_NOOBJECT) - lua_error ("too few arguments to function `acos'"); - if (!lua_isnumber(o)) - lua_error ("incorrect arguments to function `acos'"); - d = lua_getnumber(o); + double d = lua_check_number(1, "acos"); lua_pushnumber (TODEGREE(acos(d))); } - static void math_atan (void) { - double d; - lua_Object o = lua_getparam (1); - if (o == LUA_NOOBJECT) - lua_error ("too few arguments to function `atan'"); - if (!lua_isnumber(o)) - lua_error ("incorrect arguments to function `atan'"); - d = lua_getnumber(o); + double d = lua_check_number(1, "atan"); lua_pushnumber (TODEGREE(atan(d))); } +static void math_atan2 (void) +{ + double d1 = lua_check_number(1, "atan2"); + double d2 = lua_check_number(2, "atan2"); + lua_pushnumber (TODEGREE(atan2(d1, d2))); +} + + static void math_ceil (void) { - double d; - lua_Object o = lua_getparam (1); - if (o == LUA_NOOBJECT) - lua_error ("too few arguments to function `ceil'"); - if (!lua_isnumber(o)) - lua_error ("incorrect arguments to function `ceil'"); - d = lua_getnumber(o); + double d = lua_check_number(1, "ceil"); lua_pushnumber (ceil(d)); } static void math_floor (void) { - double d; - lua_Object o = lua_getparam (1); - if (o == LUA_NOOBJECT) - lua_error ("too few arguments to function `floor'"); - if (!lua_isnumber(o)) - lua_error ("incorrect arguments to function `floor'"); - d = lua_getnumber(o); + double d = lua_check_number(1, "floor"); lua_pushnumber (floor(d)); } static void math_mod (void) { - int d1, d2; - lua_Object o1 = lua_getparam (1); - lua_Object o2 = lua_getparam (2); - if (!lua_isnumber(o1) || !lua_isnumber(o2)) - lua_error ("incorrect arguments to function `mod'"); - d1 = (int) lua_getnumber(o1); - d2 = (int) lua_getnumber(o2); + int d1 = (int)lua_check_number(1, "mod"); + int d2 = (int)lua_check_number(2, "mod"); lua_pushnumber (d1%d2); } static void math_sqrt (void) { - double d; - lua_Object o = lua_getparam (1); - if (o == LUA_NOOBJECT) - lua_error ("too few arguments to function `sqrt'"); - if (!lua_isnumber(o)) - lua_error ("incorrect arguments to function `sqrt'"); - d = lua_getnumber(o); + double d = lua_check_number(1, "sqrt"); lua_pushnumber (sqrt(d)); } @@ -187,104 +131,56 @@ static void math_pow (void) static void math_min (void) { int i=1; - double d, dmin; - lua_Object o; - if ((o = lua_getparam(i++)) == LUA_NOOBJECT) - lua_error ("too few arguments to function `min'"); - if (!lua_isnumber(o)) - lua_error ("incorrect arguments to function `min'"); - dmin = lua_getnumber (o); - while ((o = lua_getparam(i++)) != LUA_NOOBJECT) + double dmin = lua_check_number(i, "min"); + while (lua_getparam(++i) != LUA_NOOBJECT) { - if (!lua_isnumber(o)) - lua_error ("incorrect arguments to function `min'"); - d = lua_getnumber (o); + double d = lua_check_number(i, "min"); if (d < dmin) dmin = d; } lua_pushnumber (dmin); } - static void math_max (void) { int i=1; - double d, dmax; - lua_Object o; - if ((o = lua_getparam(i++)) == LUA_NOOBJECT) - lua_error ("too few arguments to function `max'"); - if (!lua_isnumber(o)) - lua_error ("incorrect arguments to function `max'"); - dmax = lua_getnumber (o); - while ((o = lua_getparam(i++)) != LUA_NOOBJECT) + double dmax = lua_check_number(i, "max"); + while (lua_getparam(++i) != LUA_NOOBJECT) { - if (!lua_isnumber(o)) - lua_error ("incorrect arguments to function `max'"); - d = lua_getnumber (o); + double d = lua_check_number(i, "max"); if (d > dmax) dmax = d; } lua_pushnumber (dmax); } - static void math_log (void) { - double d; - lua_Object o = lua_getparam (1); - if (o == LUA_NOOBJECT) - lua_error ("too few arguments to function `log'"); - if (!lua_isnumber(o)) - lua_error ("incorrect arguments to function `log'"); - d = lua_getnumber(o); + double d = lua_check_number(1, "log"); lua_pushnumber (log(d)); } static void math_log10 (void) { - double d; - lua_Object o = lua_getparam (1); - if (o == LUA_NOOBJECT) - lua_error ("too few arguments to function `log10'"); - if (!lua_isnumber(o)) - lua_error ("incorrect arguments to function `log10'"); - d = lua_getnumber(o); + double d = lua_check_number(1, "log10"); lua_pushnumber (log10(d)); } static void math_exp (void) { - double d; - lua_Object o = lua_getparam (1); - if (o == LUA_NOOBJECT) - lua_error ("too few arguments to function `exp'"); - if (!lua_isnumber(o)) - lua_error ("incorrect arguments to function `exp'"); - d = lua_getnumber(o); + double d = lua_check_number(1, "exp"); lua_pushnumber (exp(d)); } static void math_deg (void) { - float d; - lua_Object o = lua_getparam (1); - if (o == LUA_NOOBJECT) - lua_error ("too few arguments to function `deg'"); - if (!lua_isnumber(o)) - lua_error ("incorrect arguments to function `deg'"); - d = lua_getnumber(o); + float d = lua_check_number(1, "deg"); lua_pushnumber (d*180./PI); } static void math_rad (void) { - float d; - lua_Object o = lua_getparam (1); - if (o == LUA_NOOBJECT) - lua_error ("too few arguments to function `rad'"); - if (!lua_isnumber(o)) - lua_error ("incorrect arguments to function `rad'"); - d = lua_getnumber(o); + float d = lua_check_number(1, "rad"); lua_pushnumber (d/180.*PI); } @@ -300,6 +196,7 @@ void mathlib_open (void) lua_register ("asin", math_asin); lua_register ("acos", math_acos); lua_register ("atan", math_atan); + lua_register ("atan2", math_atan2); lua_register ("ceil", math_ceil); lua_register ("floor", math_floor); lua_register ("mod", math_mod); diff --git a/clients/lib/strlib.c b/clients/lib/strlib.c index 6b92a30b..0f37ab85 100644 --- a/clients/lib/strlib.c +++ b/clients/lib/strlib.c @@ -3,9 +3,10 @@ ** String library to LUA */ -char *rcs_strlib="$Id: strlib.c,v 1.12 1995/02/06 19:37:51 roberto Exp $"; +char *rcs_strlib="$Id: strlib.c,v 1.14 1995/11/10 17:54:31 roberto Exp $"; #include <string.h> +#include <stdio.h> #include <stdlib.h> #include <ctype.h> @@ -13,9 +14,31 @@ char *rcs_strlib="$Id: strlib.c,v 1.12 1995/02/06 19:37:51 roberto Exp $"; #include "lualib.h" -static char *newstring (lua_Object o) +void lua_arg_error(char *funcname) +{ + char buff[100]; + sprintf(buff, "incorrect arguments to function `%s'", funcname); + lua_error(buff); +} + +char *lua_check_string (int numArg, char *funcname) +{ + lua_Object o = lua_getparam(numArg); + if (!(lua_isstring(o) || lua_isnumber(o))) + lua_arg_error(funcname); + return lua_getstring(o); +} + +float lua_check_number (int numArg, char *funcname) +{ + lua_Object o = lua_getparam(numArg); + if (!lua_isnumber(o)) + lua_arg_error(funcname); + return lua_getnumber(o); +} + +static char *newstring (char *s) { - char *s = lua_getstring(o); char *ns = (char *)malloc(strlen(s)+1); if (ns == 0) lua_error("not enough memory for new string"); @@ -31,34 +54,17 @@ static char *newstring (lua_Object o) */ static void str_find (void) { - char *s1, *s2, *f; - int init; - lua_Object o1 = lua_getparam (1); - lua_Object o2 = lua_getparam (2); - lua_Object o3 = lua_getparam (3); - lua_Object o4 = lua_getparam (4); - if (!lua_isstring(o1) || !lua_isstring(o2)) - lua_error ("incorrect arguments to function `strfind'"); - if (o3 == LUA_NOOBJECT) - init = 0; - else if (lua_isnumber(o3)) - init = lua_getnumber(o3)-1; - else - { - lua_error ("incorrect arguments to function `strfind'"); - return; /* to avoid warnings */ - } - s1 = lua_getstring(o1); - s2 = lua_getstring(o2); - f = strstr(s1+init,s2); + char *s1 = lua_check_string(1, "strfind"); + char *s2 = lua_check_string(2, "strfind"); + int init = (lua_getparam(3) == LUA_NOOBJECT) ? 0 : + (int)lua_check_number(3, "strfind")-1; + char *f = strstr(s1+init,s2); if (f != NULL) { int pos = f-s1+1; - if (o4 == LUA_NOOBJECT) + if (lua_getparam (4) == LUA_NOOBJECT) lua_pushnumber (pos); - else if (!lua_isnumber(o4)) - lua_error ("incorrect arguments to function `strfind'"); - else if ((int)lua_getnumber(o4) >= pos+strlen(s2)-1) + else if ((int)lua_check_number(4, "strfind") >= pos+strlen(s2)-1) lua_pushnumber (pos); else lua_pushnil(); @@ -74,10 +80,8 @@ static void str_find (void) */ static void str_len (void) { - lua_Object o = lua_getparam (1); - if (!lua_isstring(o)) - lua_error ("incorrect arguments to function `strlen'"); - lua_pushnumber(strlen(lua_getstring(o))); + char *s = lua_check_string(1, "strlen"); + lua_pushnumber(strlen(s)); } @@ -88,48 +92,47 @@ static void str_len (void) */ static void str_sub (void) { - int start, end; - char *s; - lua_Object o1 = lua_getparam (1); - lua_Object o2 = lua_getparam (2); - lua_Object o3 = lua_getparam (3); - if (!lua_isstring(o1) || !lua_isnumber(o2)) - lua_error ("incorrect arguments to function `strsub'"); - if (o3 != LUA_NOOBJECT && !lua_isnumber(o3)) - lua_error ("incorrect third argument to function `strsub'"); - s = newstring(o1); - start = lua_getnumber (o2); - end = o3 == LUA_NOOBJECT ? strlen(s) : lua_getnumber (o3); + char *s = lua_check_string(1, "strsub"); + int start = (int)lua_check_number(2, "strsub"); + int end = (lua_getparam(3) == LUA_NOOBJECT) ? strlen(s) : + (int)lua_check_number(3, "strsub"); if (end < start || start < 1 || end > strlen(s)) lua_pushliteral(""); else { + char temp = s[end]; s[end] = 0; lua_pushstring (&s[start-1]); + s[end] = temp; } - free(s); } /* -** Convert a string to lower case. -** LUA interface: -** lowercase = strlower (string) +** Convert a string according to given function. */ -static void str_lower (void) +typedef int (*strfunc)(int s); +static void str_apply (strfunc f, char *funcname) { char *s, *c; - lua_Object o = lua_getparam (1); - if (!lua_isstring(o)) - lua_error ("incorrect arguments to function `strlower'"); - c = s = newstring(o); + c = s = newstring(lua_check_string(1, funcname)); while (*c != 0) { - *c = tolower(*c); + *c = f(*c); c++; } lua_pushstring(s); free(s); -} +} + +/* +** Convert a string to lower case. +** LUA interface: +** lowercase = strlower (string) +*/ +static void str_lower (void) +{ + str_apply(tolower, "strlower"); +} /* @@ -139,20 +142,40 @@ static void str_lower (void) */ static void str_upper (void) { - char *s, *c; - lua_Object o = lua_getparam (1); - if (!lua_isstring(o)) - lua_error ("incorrect arguments to function `strlower'"); - c = s = newstring(o); - while (*c != 0) - { - *c = toupper(*c); - c++; - } - lua_pushstring(s); - free(s); -} + str_apply(toupper, "strupper"); +} +/* +** get ascii value of a character in a string +*/ +static void str_ascii (void) +{ + char *s = lua_check_string(1, "ascii"); + lua_Object o2 = lua_getparam(2); + int pos; + pos = (o2 == LUA_NOOBJECT) ? 0 : (int)lua_check_number(2, "ascii")-1; + if (pos<0 || pos>=strlen(s)) + lua_arg_error("ascii"); + lua_pushnumber(s[pos]); +} + +/* +** converts one or more integers to chars in a string +*/ +#define maxparams 50 +static void str_int2str (void) +{ + char s[maxparams+1]; + int i = 0; + while (lua_getparam(++i) != LUA_NOOBJECT) + { + if (i > maxparams) + lua_error("too many parameters to function `int2str'"); + s[i-1] = (int)lua_check_number(i, "int2str"); + } + s[i-1] = 0; + lua_pushstring(s); +} /* ** Open string library @@ -164,4 +187,6 @@ void strlib_open (void) lua_register ("strsub", str_sub); lua_register ("strlower", str_lower); lua_register ("strupper", str_upper); + lua_register ("ascii", str_ascii); + lua_register ("int2str", str_int2str); } diff --git a/clients/lua/Makefile b/clients/lua/Makefile index 10538d67..b76dae3c 100644 --- a/clients/lua/Makefile +++ b/clients/lua/Makefile @@ -12,6 +12,7 @@ INCS= -I/usr/5include -I$(INC) WARN= -Wall -Wmissing-prototypes -Wshadow -ansi OBJS= lua.o +SRCS= lua.c T=$(BIN)/lua @@ -19,9 +20,14 @@ $T: $(OBJS) $(CC) -o $@ $(OBJS) -L$(LIB) -llua -llualib -lm dynamic: + rm -f $T + make clean: rm -f $T $(OBJS) co: - co -M lua.c + co -f -M $(SRCS) + +klean: clean + rm -f $(SRCS) diff --git a/clients/lua/lua.c b/clients/lua/lua.c index 19836646..33c7adcb 100644 --- a/clients/lua/lua.c +++ b/clients/lua/lua.c @@ -3,7 +3,7 @@ ** Linguagem para Usuarios de Aplicacao */ -char *rcs_lua="$Id: lua.c,v 1.4 1995/02/07 16:04:15 lhf Exp $"; +char *rcs_lua="$Id: lua.c,v 1.7 1995/10/31 17:05:35 roberto Exp $"; #include <stdio.h> #include <string.h> @@ -15,6 +15,12 @@ static int lua_argc; static char **lua_argv; /* +** although this function is POSIX, there is no standard header file that +** defines it +*/ +int isatty (int fd); + +/* %F Allow Lua code to access argv strings. %i Receive from Lua the argument number (starting with 1). %o Return to Lua the argument, or nil if it does not exist. @@ -33,6 +39,19 @@ static void lua_getargv (void) } +static void manual_input (void) +{ + if (isatty(fileno(stdin))) + { + char buffer[250]; + while (gets(buffer) != 0) + lua_dostring(buffer); + } + else + lua_dofile(NULL); /* executes stdin as a file */ +} + + int main (int argc, char *argv[]) { int i; @@ -44,26 +63,25 @@ int main (int argc, char *argv[]) lua_register("argv", lua_getargv); if (argc < 2) - { - char buffer[250]; - while (gets(buffer) != 0) - result = lua_dostring(buffer); - } + manual_input(); else { for (i=1; i<argc; i++) - { if (strcmp(argv[i], "--") == 0) { lua_argc = argc-i-1; lua_argv = argv+i; break; } - } for (i=1; i<argc; i++) { if (strcmp(argv[i], "--") == 0) break; + else if (strcmp(argv[i], "-") == 0) + manual_input(); + else if (strcmp(argv[i], "-v") == 0) + printf("%s %s\n(written by %s)\n\n", + LUA_VERSION, LUA_COPYRIGHT, LUA_AUTHORS); else result = lua_dofile (argv[i]); } diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 00000000..de48bd70 --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,16 @@ +# makefile for lua distribution + +all: + latex manual.tex + latex manual.tex + dvips -o manual.ps manual.dvi + rm -f manual.tex manual.aux manual.log + +clean: + rm -f manual.tex + +co: + co -f -M manual.tex + +klean: clean + rm -f manual.tex manual.ps manual.dvi diff --git a/doc/manual.dvi b/doc/manual.dvi Binary files differdeleted file mode 100644 index 7ab7e9bc..00000000 --- a/doc/manual.dvi +++ /dev/null diff --git a/doc/manual.ps b/doc/manual.ps index bfd0730c..21271b85 100644 --- a/doc/manual.ps +++ b/doc/manual.ps @@ -1,2571 +1,2858 @@ %!PS-Adobe-2.0 -%%Creator: dvips, version 5.4 (C) 1986-90 Radical Eye Software +%%Creator: dvips 5.58 Copyright 1986, 1994 Radical Eye Software %%Title: manual.dvi -%%Pages: 24 1 -%%BoundingBox: 0 0 596 843 +%%CreationDate: Tue Nov 28 10:59:43 1995 +%%Pages: 27 +%%PageOrder: Ascend +%%BoundingBox: 0 0 612 792 %%EndComments +%DVIPSCommandLine: /software/tex/bin/_dvips -o manual.ps manual.dvi +%DVIPSParameters: dpi=300, comments removed +%DVIPSSource: TeX output 1995.11.28:1056 %%BeginProcSet: tex.pro -/TeXDict 200 dict def TeXDict begin /N /def load def /B{bind def}N /S /exch -load def /X{S N}B /TR /translate load N /isls false N /vsize 10 N /@rigin{ -isls{[0 1 -1 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale -Resolution VResolution vsize neg mul TR}B /@letter{/vsize 10 N}B /@landscape{ -/isls true N /vsize -1 N}B /@a4{/vsize 10.6929133858 N}B /@a3{/vsize 15.5531 N -}B /@ledger{/vsize 16 N}B /@legal{/vsize 13 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 /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 /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 IE N end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[ -}B /E{pop nn dup definefont setfont}B /ch-image{ch-data dup type /stringtype -ne{ctr get /ctr ctr 1 add N}if}B /ch-width{ch-data dup length 5 sub get}B -/ch-height{ch-data dup length 4 sub get}B /ch-xoff{128 ch-data dup length 3 -sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data -dup length 1 sub get}B /ctr 0 N /CharBuilder{save 3 1 roll S dup /base get 2 -index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff -ch-height sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height -true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 add]{ch-image}imagemask restore}B /D{ -/cc X dup type /stringtype ne{]}if nn /base get cc ctr put nn /BitMaps get S -ctr S sf 1 ne{dup dup length 1 sub dup 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}B /eop{clear SI restore showpage userdict /eop-hook -known{eop-hook}if}B /@start{userdict /start-hook known{start-hook}if -/VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255{IE S 1 -string dup 0 3 index put cvn put}for}B /p /show load N /RMat[1 0 0 -1 0 0]N -/BDot 8 string N /v{/ruley X /rulex X V}B /V{gsave TR -.1 -.1 TR rulex ruley -scale 1 1 false RMat{BDot}imagemask grestore}B /a{moveto}B /delta 0 N /tail{ -dup /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 /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 /w{0 rmoveto}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save N}B -/eos{clear SS restore}B end +/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N +/X{S N}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{dup dup 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 /IE 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 IE N +end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /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 dup definefont setfont}B /ch-width{ch-data dup +length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{ +128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub +get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data +dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N +/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup +/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx +0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff +setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff +.1 sub]{ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]} +if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup +length 1 sub dup 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 dup 1 get dup mul exch 0 get dup 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 +/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for +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 /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V +{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7 +getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false} +ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false +RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1 +false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform +round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg +rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail +{dup /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 -TeXDict begin 1000 300 300 @start /Fa 7 121 df<1FF0003FFC007FFE00780F00300700 -000380000380007F8007FF801FFF803F8380780380700380E00380E00380E00380700780780F80 -3FFFFC1FFDFC07F0FC16157D941A>97 D<01F80007FF000FFF801E07C03C01C07800E07000E0E0 -0070E00070FFFFF0FFFFF0FFFFF0E000007000007000007800703C00701F01F00FFFE003FFC000 -FE0014157D941A>101 D<FE3E00FEFF80FFFFC00FC1C00F80E00F00E00E00E00E00E00E00E00E -00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E0FFE3FEFFE7FEFFE3FE17157F94 -1A>110 D<7F83F0FF8FF87FBFFC03FC3C03F01803E00003C00003C00003800003800003800003 -80000380000380000380000380000380000380007FFF00FFFF007FFF0016157E941A>114 -D<00C00001C00001C00001C00001C00001C00001C0007FFFE0FFFFE0FFFFE001C00001C00001C0 -0001C00001C00001C00001C00001C00001C00001C00001C07001C07001C07001C07000E0E000FF -E0007FC0001F00141C7F9B1A>116 D<7F83FCFFC7FE7F83FC0E00E00E00E00E00E00701C00701 -C00701C003838003838003838001C70001C70001C70000EE0000EE0000EE00007C00007C000038 -0017157F941A>118 D<7FC7F87FCFFC7FC7F80703C003838003C70001EF0000FE00007C000078 -00003800007C0000EE0001EE0001C7000383800783C00F01C07FC7FCFFC7FE7FC7FC17157F941A ->120 D E /Fb 1 122 df<1C02260646064606860C0C0C0C0C0C0C18181818181818380C7007B0 -00300060706070C021801E000F147F8D11>121 D E /Fc 2 121 df<70F8F8F87005057C840D> -58 D<03C1C00C62201034701038F02038F020386040700000700000700000700000E00000E000 -00E00000E02061C040F1C040F1C080E2C080446300383C0014147E931A>120 -D E /Fd 47 121 df<000FF000007FFC0001F80E0003E01F0007C03F000F803F000F803F000F80 -1E000F800C000F8000000F8000000F8000000F800000FFFFFF00FFFFFF000F801F000F801F000F -801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F00 -0F801F000F801F000F801F000F801F000F801F000F801F007FF0FFE07FF0FFE01B237FA21F>12 -D<387CFEFEFE7C3807077C8610>46 D<0000180000380000380000700000700000E00000E00000 -E00001C00001C0000380000380000380000700000700000700000E00000E00001C00001C00001C -0000380000380000700000700000700000E00000E00001C00001C00001C0000380000380000700 -000700000700000E00000E00000E00001C00001C0000380000380000380000700000700000E000 -00E00000C0000015317DA41C>I<00180000780001F800FFF800FFF80001F80001F80001F80001 -F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001 -F80001F80001F80001F80001F80001F80001F80001F80001F8007FFFE07FFFE013207C9F1C>49 -D<03FC000FFF003C1FC07007E07C07F0FE03F0FE03F8FE03F8FE01F87C01F83803F80003F80003 -F00003F00007E00007C0000F80001F00003E0000380000700000E01801C0180380180700180E00 -380FFFF01FFFF03FFFF07FFFF0FFFFF0FFFFF015207D9F1C>I<00FE0007FFC00F07E01E03F03F -03F03F81F83F81F83F81F81F03F81F03F00003F00003E00007C0001F8001FE0001FF000007C000 -01F00001F80000FC0000FC3C00FE7E00FEFF00FEFF00FEFF00FEFF00FC7E01FC7801F81E07F00F -FFC001FE0017207E9F1C>I<0000E00001E00003E00003E00007E0000FE0001FE0001FE00037E0 -0077E000E7E001C7E00187E00307E00707E00E07E00C07E01807E03807E07007E0E007E0FFFFFE -FFFFFE0007E00007E00007E00007E00007E00007E00007E000FFFE00FFFE17207E9F1C>I<1000 -201E01E01FFFC01FFF801FFF001FFE001FF8001BC00018000018000018000018000019FC001FFF -001E0FC01807E01803E00003F00003F00003F80003F83803F87C03F8FE03F8FE03F8FC03F0FC03 -F07007E03007C01C1F800FFF0003F80015207D9F1C>I<001F8000FFE003F07007C0F00F01F81F -01F83E01F83E01F87E00F07C00007C0000FC0800FC7FC0FCFFE0FD80F0FF00F8FE007CFE007CFC -007EFC007EFC007EFC007E7C007E7C007E7C007E3C007C3E007C1E00F80F00F00783E003FFC000 -FF0017207E9F1C>I<6000007800007FFFFE7FFFFE7FFFFC7FFFF87FFFF87FFFF0E00060E000C0 -C00180C00300C00300000600000C00001C0000180000380000780000780000F00000F00000F000 -01F00001F00001F00003F00003F00003F00003F00003F00003F00003F00001E00017227DA11C> -I<00FE0003FFC00601E00C00701800701800383800383C00383F00383F80783FE0701FF8E01FFF -C00FFF8007FFC003FFE007FFF01E7FF83C1FFC7807FC7801FEF000FEF0003EF0001EF0001EF000 -1CF8001C7800383C00381F01F00FFFC001FF0017207E9F1C>I<000070000000007000000000F8 -00000000F800000000F800000001FC00000001FC00000003FE00000003FE00000003FE00000006 -FF000000067F0000000E7F8000000C3F8000000C3F800000183FC00000181FC00000381FE00000 -300FE00000300FE00000600FF000006007F00000E007F80000FFFFF80000FFFFF800018001FC00 -018001FC00038001FE00030000FE00030000FE000600007F000600007F00FFE00FFFF8FFE00FFF -F825227EA12A>65 D<0003FE0080001FFF818000FF01E38001F8003F8003E0001F8007C0000F80 -0F800007801F800007803F000003803F000003807F000001807E000001807E00000180FE000000 -00FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE000000007E0000 -00007E000001807F000001803F000001803F000003801F800003000F8000030007C000060003F0 -000C0001F800380000FF00F000001FFFC0000003FE000021227DA128>67 -D<FFFFFF8000FFFFFFF00007F003FC0007F0007E0007F0003F0007F0001F8007F0000FC007F000 -07E007F00007E007F00007F007F00003F007F00003F007F00003F007F00003F807F00003F807F0 -0003F807F00003F807F00003F807F00003F807F00003F807F00003F807F00003F807F00003F007 -F00003F007F00003F007F00007E007F00007E007F0000FC007F0001F8007F0003F0007F0007E00 -07F003FC00FFFFFFF000FFFFFF800025227EA12B>I<FFFFFFFCFFFFFFFC07F000FC07F0003C07 -F0001C07F0000C07F0000E07F0000E07F0000607F0180607F0180607F0180607F0180007F03800 -07F0780007FFF80007FFF80007F0780007F0380007F0180007F0180007F0180307F0180307F000 -0307F0000607F0000607F0000607F0000E07F0000E07F0001E07F0003E07F001FCFFFFFFFCFFFF -FFFC20227EA125>I<FFFFFFF8FFFFFFF807F001F807F0007807F0003807F0001807F0001C07F0 -001C07F0000C07F0000C07F0180C07F0180C07F0180007F0180007F0380007F0780007FFF80007 -FFF80007F0780007F0380007F0180007F0180007F0180007F0180007F0000007F0000007F00000 -07F0000007F0000007F0000007F0000007F00000FFFFE000FFFFE0001E227EA123>I<FFFF83FF -FEFFFF83FFFE07F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F000 -1FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007FFFFFFC007FF -FFFFC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007 -F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC0 -FFFF83FFFEFFFF83FFFE27227EA12C>72 D<FFFFE0FFFFE003F80003F80003F80003F80003F800 -03F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F800 -03F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F800FFFFE0 -FFFFE013227FA115>I<FFFFE000FFFFE00007F0000007F0000007F0000007F0000007F0000007 -F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F00000 -07F0000007F0000007F0000007F0000007F0001807F0001807F0001807F0001807F0003807F000 -3807F0007007F0007007F000F007F001F007F007F0FFFFFFF0FFFFFFF01D227EA122>76 -D<FFF000000FFFFFF800001FFF07F800001FE006FC000037E006FC000037E006FC000037E0067E -000067E0067E000067E0063F0000C7E0063F0000C7E0061F800187E0061F800187E0060FC00307 -E0060FC00307E0060FC00307E00607E00607E00607E00607E00603F00C07E00603F00C07E00601 -F81807E00601F81807E00601F81807E00600FC3007E00600FC3007E006007E6007E006007E6007 -E006003FC007E006003FC007E006001F8007E006001F8007E006001F8007E006000F0007E0FFF0 -0F00FFFFFFF00600FFFF30227EA135>I<0007FC0000003FFF800000FC07E00003F001F80007E0 -00FC000FC0007E001F80003F001F80003F003F00001F803F00001F807F00001FC07E00000FC07E -00000FC0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0 -FE00000FE0FE00000FE07E00000FC07F00001FC07F00001FC03F00001F803F80003F801F80003F -000FC0007E0007E000FC0003F001F80000FC07E000003FFF80000007FC000023227DA12A>79 -D<FFFFFF00FFFFFFE007F007F007F001FC07F000FC07F0007E07F0007E07F0007F07F0007F07F0 -007F07F0007F07F0007F07F0007E07F0007E07F000FC07F001FC07F007F007FFFFE007FFFF0007 -F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F00000 -07F0000007F0000007F00000FFFF8000FFFF800020227EA126>I<01FC0407FF8C1F03FC3C007C -7C003C78001C78001CF8000CF8000CFC000CFC0000FF0000FFE0007FFF007FFFC03FFFF01FFFF8 -0FFFFC03FFFE003FFE0003FF00007F00003F00003FC0001FC0001FC0001FE0001EE0001EF0003C -FC003CFF00F8C7FFE080FF8018227DA11F>83 D<7FFFFFFF807FFFFFFF807E03F80F807803F807 -807003F803806003F80180E003F801C0E003F801C0C003F800C0C003F800C0C003F800C0C003F8 -00C00003F800000003F800000003F800000003F800000003F800000003F800000003F800000003 -F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8000000 -03F800000003F800000003F800000003F800000003F8000003FFFFF80003FFFFF80022227EA127 ->I<FFFF800FFEFFFF800FFE07F00000C007F80000C003F800018003F800018001FC00030001FC -00030001FE00070000FE00060000FF000600007F000C00007F800C00003F801800003F80180000 -3FC03800001FC03000001FE03000000FE06000000FF060000007F0C0000007F0C0000007F9C000 -0003F980000003FD80000001FF00000001FF00000000FE00000000FE00000000FE000000007C00 -0000007C00000000380000000038000027227FA12A>86 D<07FC001FFF803F07C03F03E03F01E0 -3F01F01E01F00001F00001F0003FF003FDF01FC1F03F01F07E01F0FC01F0FC01F0FC01F0FC01F0 -7E02F07E0CF81FF87F07E03F18167E951B>97 D<FF000000FF0000001F0000001F0000001F0000 -001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0FE0001F3F -F8001FF07C001F801E001F001F001F000F801F000F801F000FC01F000FC01F000FC01F000FC01F -000FC01F000FC01F000FC01F000FC01F000F801F001F801F801F001FC03E001EE07C001C3FF800 -180FC0001A237EA21F>I<00FF8007FFE00F83F01F03F03E03F07E03F07C01E07C0000FC0000FC -0000FC0000FC0000FC0000FC00007C00007E00007E00003E00301F00600FC0E007FF8000FE0014 -167E9519>I<0001FE000001FE0000003E0000003E0000003E0000003E0000003E0000003E0000 -003E0000003E0000003E0000003E0000003E0001FC3E0007FFBE000F81FE001F007E003E003E00 -7E003E007C003E00FC003E00FC003E00FC003E00FC003E00FC003E00FC003E00FC003E00FC003E -007C003E007C003E003E007E001E00FE000F83BE0007FF3FC001FC3FC01A237EA21F>I<00FE00 -07FF800F87C01E01E03E01F07C00F07C00F8FC00F8FC00F8FFFFF8FFFFF8FC0000FC0000FC0000 -7C00007C00007E00003E00181F00300FC07003FFC000FF0015167E951A>I<03FC1E0FFF7F1F0F -8F3E07CF3C03C07C03E07C03E07C03E07C03E07C03E03C03C03E07C01F0F801FFF0013FC003000 -003000003800003FFF801FFFF00FFFF81FFFFC3800FC70003EF0001EF0001EF0001EF0001E7800 -3C7C007C3F01F80FFFE001FF0018217E951C>103 D<FF000000FF0000001F0000001F0000001F -0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F07E000 -1F1FF8001F307C001F403C001F803E001F803E001F003E001F003E001F003E001F003E001F003E -001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E00FFE1 -FFC0FFE1FFC01A237EA21F>I<1C003F007F007F007F003F001C00000000000000000000000000 -0000FF00FF001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F -001F00FFE0FFE00B247EA310>I<0038007C00FE00FE00FE007C00380000000000000000000000 -00000003FE03FE003E003E003E003E003E003E003E003E003E003E003E003E003E003E003E003E -003E003E003E003E003E003E003E783EFC3EFC3CFC7C78F87FE01F800F2E83A311>I<FF000000 -FF0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000 -001F0000001F0000001F00FF801F00FF801F0038001F0060001F01C0001F0380001F0700001F0E -00001F1C00001F7E00001FFF00001FCF00001F0F80001F07C0001F03E0001F01E0001F01F0001F -00F8001F007C001F003C00FFE0FFC0FFE0FFC01A237EA21E>I<FF00FF001F001F001F001F001F -001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00 -1F001F001F001F001F001F001F00FFE0FFE00B237EA210>I<FF07F007F000FF1FFC1FFC001F30 -3E303E001F403E403E001F801F801F001F801F801F001F001F001F001F001F001F001F001F001F -001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00 -1F001F001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FFE0FFE0FFE0FFE0FF -E02B167E9530>I<FF07E000FF1FF8001F307C001F403C001F803E001F803E001F003E001F003E -001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F00 -3E001F003E001F003E00FFE1FFC0FFE1FFC01A167E951F>I<00FE0007FFC00F83E01E00F03E00 -F87C007C7C007C7C007CFC007EFC007EFC007EFC007EFC007EFC007EFC007E7C007C7C007C3E00 -F81F01F00F83E007FFC000FE0017167E951C>I<FF0FE000FF3FF8001FF07C001F803E001F001F -001F001F801F001F801F000FC01F000FC01F000FC01F000FC01F000FC01F000FC01F000FC01F00 -0FC01F001F801F001F801F803F001FC03E001FE0FC001F3FF8001F0FC0001F0000001F0000001F -0000001F0000001F0000001F0000001F0000001F000000FFE00000FFE000001A207E951F>I<FE -1F00FE3FC01E67E01EC7E01E87E01E87E01F83C01F00001F00001F00001F00001F00001F00001F -00001F00001F00001F00001F00001F00001F0000FFF000FFF00013167E9517>114 -D<0FF3003FFF00781F00600700E00300E00300F00300FC00007FE0007FF8003FFE000FFF0001FF -00000F80C00780C00380E00380E00380F00700FC0E00EFFC00C7F00011167E9516>I<01800001 -80000180000180000380000380000780000780000F80003F8000FFFF00FFFF000F80000F80000F -80000F80000F80000F80000F80000F80000F80000F80000F80000F81800F81800F81800F81800F -81800F830007C30003FE0000F80011207F9F16>I<FF01FE00FF01FE001F003E001F003E001F00 -3E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F -003E001F003E001F003E001F007E001F00FE000F81BE0007FF3FC001FC3FC01A167E951F>I<FF -E01FE0FFE01FE00F8006000F8006000FC00E0007C00C0007E01C0003E0180003E0180001F03000 -01F0300000F8600000F86000007CC000007CC000007FC000003F8000003F8000001F0000001F00 -00000E0000000E00001B167F951E>I<FFE7FF07F8FFE7FF07F81F007800C00F807801800F807C -01800F807C018007C07E030007C0DE030007E0DE070003E0DF060003E18F060001F18F0C0001F3 -8F8C0001FB079C0000FB07D80000FE03D800007E03F000007E03F000007C01F000003C01E00000 -3800E000001800C00025167F9528>I<FFE07FC0FFE07FC00F801C0007C0380003E0700003F060 -0001F8C00000F98000007F8000003F0000001F0000001F8000003FC0000037C0000063E00000C1 -F00001C0F8000380FC0007007E000E003E00FF80FFE0FF80FFE01B167F951E>I -E /Fe 4 112 df<03CC0E2E181C381C301C701CE038E038E038E038C072C072C07260F261341E -180F107C8F14>97 D<307C1E00598663009E0783809E0703809C0703809C070380380E0700380E -0700380E0700380E0E00701C0E40701C0E40701C1C40701C1C80E0380C80601807001A107C8F1F ->109 D<307C005986009E07009E07009C07009C0700380E00380E00380E00381C00701C80701C -80703880703900E01900600E0011107C8F16>I<01F006180C0C180E300E700E600EE00EE00EE0 -0CE01CE018E030606030C01F000F107C8F14>I E /Ff 2 104 df<007001C00380070007000700 -07000700070007000700070007000700070007000E001C00F0001C000E00070007000700070007 -0007000700070007000700070007000700038001C000700C257D9B13>102 -D<F0001C000E000700070007000700070007000700070007000700070007000700038001C00070 -01C0038007000700070007000700070007000700070007000700070007000E001C00F0000C257D -9B13>I E /Fg 35 122 df<00FC000182000703000607000E02000E00000E00000E00000E0000 -0E0000FFFF000E07000E07000E07000E07000E07000E07000E07000E07000E07000E07000E0700 -0E07000E07000E07007F0FE0131A809915>12 D<60F0F868080808101020C0050B7D990B>39 -D<60F0F07010101020204080040B7D830B>44 D<60F0F06004047D830B>46 -D<078018603030303060186018E01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01CE01C6018 -601870383030186007800E187E9713>48 D<0F8010E02070607870382038007800700070006000 -C00F8000E000700038003C003CE03CE03CC03C4038407030E00F800E187E9713>51 -D<60F0F060000000000000000060F0F0701010102020408004177D8F0B>59 -D<000C0000000C0000000C0000001E0000001E0000003F00000027000000270000004380000043 -8000004380000081C0000081C0000081C0000100E0000100E00001FFE000020070000200700006 -007800040038000400380008001C0008001C001C001E00FF00FFC01A1A7F991D>65 -D<FFFF000E01C00E00E00E00700E00780E00780E00780E00780E00780E00F00E00E00E03C00FFF -800E01E00E00700E00780E003C0E003C0E003C0E003C0E003C0E00380E00780E00F00E01E0FFFF -80161A7E991B>I<FFF0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E -00000E00000E00000E00000E00000E00000E00000E00200E00200E00200E00600E00400E00400E -00C00E03C0FFFFC0131A7E9918>76 D<FFFF000E03C00E00E00E00700E00700E00780E00780E00 -780E00780E00700E00700E00E00E03C00FFF000E00000E00000E00000E00000E00000E00000E00 -000E00000E00000E00000E0000FFE000151A7E991A>80 D<0FC21836200E6006C006C002C002C0 -02E00070007E003FE01FF807FC003E000E00070003800380038003C002C006E004D81887E0101A -7E9915>83 D<7FFFFF00701C0700401C0100401C0100C01C0180801C0080801C0080801C008000 -1C0000001C0000001C0000001C0000001C0000001C0000001C0000001C0000001C0000001C0000 -001C0000001C0000001C0000001C0000001C0000001C0000001C000003FFE000191A7F991C>I< -FF83FF0FF03C007801C01C007800801C007800800E007801000E007801000E009C010007009C02 -0007009C020007010E020007010E020003810E04000382070400038207040001C207080001C403 -880001C403880000E403900000E403900000E801D000007801E000007801E000007000E0000070 -00E000003000C0000020004000241A7F9927>87 D<FEFEC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 -C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0FEFE07257D9B0B>91 D<FEFE06060606060606060606 -0606060606060606060606060606060606060606060606FEFE0725809B0B>93 -D<3F8070C070E020700070007007F01C7030707070E070E071E071E0F171FB1E3C10107E8F13> -97 D<FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00001CF8001F0E00 -1E07001C03801C01801C01C01C01C01C01C01C01C01C01C01C01C01C03801C03001E07001B0C00 -10F000121A7F9915>I<07F80C1C381C30087000E000E000E000E000E000E0007000300438080C -1807E00E107F8F11>I<007E00000E00000E00000E00000E00000E00000E00000E00000E00000E -0003CE000C3E00380E00300E00700E00E00E00E00E00E00E00E00E00E00E00E00E00600E00700E -00381E001C2E0007CFC0121A7F9915>I<07C01C3030187018600CE00CFFFCE000E000E000E000 -6000300438080C1807E00E107F8F11>I<01F0031807380E100E000E000E000E000E000E00FFC0 -0E000E000E000E000E000E000E000E000E000E000E000E000E000E007FE00D1A80990C>I<0FCE -187330307038703870387038303018602FC02000600070003FF03FFC1FFE600FC003C003C003C0 -036006381C07E010187F8F13>I<18003C003C001800000000000000000000000000FC001C001C -001C001C001C001C001C001C001C001C001C001C001C001C00FF80091A80990A>105 -D<FC001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00 -1C001C001C001C001C001C00FF80091A80990A>108 D<FC7C1F001D8E63801E0781C01E0781C0 -1C0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701 -C01C0701C0FF9FE7F81D107F8F20>I<FCF8001D0C001E0E001E0E001C0E001C0E001C0E001C0E -001C0E001C0E001C0E001C0E001C0E001C0E001C0E00FF9FC012107F8F15>I<07E01C38300C70 -0E6006E007E007E007E007E007E0076006700E381C1C3807E010107F8F13>I<FCF8001F0E001E -07001C03801C03801C01C01C01C01C01C01C01C01C01C01C01C01C03801C03001E07001F0C001C -F0001C00001C00001C00001C00001C00001C0000FF800012177F8F15>I<FCE01D701E701E201C -001C001C001C001C001C001C001C001C001C001C00FFC00C107F8F0F>114 -D<1F2060E04020C020C020F0007F003FC01FE000F080708030C030C020F0408F800C107F8F0F> -I<0400040004000C000C001C003C00FFC01C001C001C001C001C001C001C001C001C201C201C20 -1C201C200E4003800B177F960F>I<FC7E001C0E001C0E001C0E001C0E001C0E001C0E001C0E00 -1C0E001C0E001C0E001C0E001C0E001C1E000C2E0007CFC012107F8F15>I<FF1F803C06001C04 -001C04001E0C000E08000E080007100007100007900003A00003A00001C00001C00001C0000080 -0011107F8F14>I<FF1F803C06001C04001C04001E0C000E08000E080007100007100007900003 -A00003A00001C00001C00001C000008000008000010000010000E10000E20000E4000078000011 -177F8F14>121 D E /Fh 4 52 df<00C00000C00000C00000C00000C00000C00000C00000C000 -00C000FFFF80FFFF8000C00000C00000C00000C00000C00000C00000C00000C00000C00011147E -8F17>43 D<0C003C00CC000C000C000C000C000C000C000C000C000C000C000C000C00FF800910 -7E8F0F>49 D<1F00618040C08060C0600060006000C00180030006000C00102020207FC0FFC00B -107F8F0F>I<1F00218060C060C000C0008001800F00008000400060C060C060804060801F000B -107F8F0F>I E /Fi 5 107 df<07E01FF83FFC7FFE7FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -7FFE7FFE3FFC1FF807E010127D9317>15 D<000000040000000002000000000200000000010000 -0000008000000000400000000020FFFFFFFFFCFFFFFFFFFC000000002000000000400000000080 -000000010000000002000000000200000000040026107D922D>33 D<000F0038006000E001C001 -C001C001C001C001C001C001C001C001C001C001C001C001C001C0038007001E00F8001E000700 -038001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C000E00060003800 -0F102D7DA117>102 D<F8001E000700038001C001C001C001C001C001C001C001C001C001C001 -C001C001C001C001C000E000600038000F0038006000E001C001C001C001C001C001C001C001C0 -01C001C001C001C001C001C001C0038007001E00F800102D7DA117>I<C0C0C0C0C0C0C0C0C0C0 -C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0022D7BA1 -0D>106 D E /Fj 3 52 df<03000700FF00070007000700070007000700070007000700070007 -000700070007000700070007007FF00C157E9412>49 D<0F8030E040708030C038E03840380038 -00700070006000C00180030006000C08080810183FF07FF0FFF00D157E9412>I<0FE030306018 -701C701C001C00180038006007E000300018000C000E000EE00EE00EC00C401830300FE00F157F -9412>I E /Fk 46 121 df<3807007C0F80FE1FC0FF1FE0FF1FE07F0FE03B0760030060030060 -0600C00600C00E01C00C0180180300700E0020040013107E9F1B>34 D<387CFEFFFF7F3B030306 -060E0C18702008107C9F0F>39 D<387CFEFEFE7C3807077C860F>46 D<00E00001E0000FE000FF -E000F3E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003 -E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E000FFFF80FFFF8011 -1D7C9C1A>49 D<07F0001FFE00383F007C1F80FE0FC0FE0FC0FE0FE0FE07E07C07E03807E0000F -E0000FC0000FC0001F80001F00003E0000780000F00000E00001C0000380600700600E00601C00 -E01FFFC03FFFC07FFFC0FFFFC0FFFFC0131D7D9C1A>I<01FC0007FF000E0F801E0FC03F07E03F -07E03F07E03F07E01E0FC0000FC0000F80001F0001FC0001FC00000F800007C00003E00003F000 -03F83803F87C03F8FE03F8FE03F8FE03F0FC03F07807E03C0FC01FFF8003FC00151D7E9C1A>I< -0001C00003C00007C00007C0000FC0001FC0003BC00073C00063C000C3C00183C00383C00703C0 -0E03C00C03C01803C03803C07003C0E003C0FFFFFEFFFFFE0007C00007C00007C00007C00007C0 -0007C000FFFE00FFFE171D7F9C1A>I<3803803FFF803FFF003FFE003FFC003FF0003F80003000 -0030000030000030000033F8003FFE003C1F00380F803007C00007C00007E00007E07807E0FC07 -E0FC07E0FC07E0FC07C0780FC0600F80381F001FFC0007F000131D7D9C1A>I<003F0001FFC007 -E0E00F81E01F03F01E03F03E03F07C03F07C01E07C0000FC1000FCFF00FDFFC0FD03E0FE01F0FE -01F0FC01F8FC01F8FC01F8FC01F87C01F87C01F87C01F83C01F03E01F01E03E00F07C007FF8001 -FE00151D7E9C1A>I<6000007FFFF87FFFF87FFFF07FFFE07FFFE0E001C0C00380C00700C00E00 -000C00001C0000380000780000780000F00000F00000F00001F00001F00001F00003F00003F000 -03F00003F00003F00003F00003F00003F00001E000151E7D9D1A>I<01FC0007FF000E07801C01 -C01800E03800E03800E03C00E03F00E03FC1C01FE3801FFF000FFE0007FF8007FFC01FFFE03C3F -F0780FF07803F8F001F8F000F8F00078F00078F000707800707C00E03E03C00FFF8003FC00151D -7E9C1A>I<0000E000000000E000000001F000000001F000000001F000000003F800000003F800 -000006FC00000006FC0000000EFE0000000C7E0000000C7E000000183F000000183F000000303F -800000301F800000701FC00000600FC00000600FC00000C007E00000FFFFE00001FFFFF0000180 -03F000018003F000030001F800030001F800060001FC00060000FC000E0000FE00FFE00FFFE0FF -E00FFFE0231F7E9E28>65 D<FFFFFE00FFFFFFC007C007E007C003F007C001F807C001FC07C001 -FC07C001FC07C001FC07C001FC07C001F807C003F807C007F007C00FE007FFFF8007FFFFC007C0 -03F007C001F807C001FC07C000FC07C000FE07C000FE07C000FE07C000FE07C000FE07C000FC07 -C001FC07C003F807C007F0FFFFFFE0FFFFFF001F1F7E9E25>I<0007FC02003FFF0E00FE03DE03 -F000FE07E0003E0FC0001E1F80001E3F00000E3F00000E7F0000067E0000067E000006FE000000 -FE000000FE000000FE000000FE000000FE000000FE0000007E0000007E0000067F0000063F0000 -063F00000C1F80000C0FC0001807E0003803F0007000FE01C0003FFF800007FC001F1F7D9E26> -I<FFFFFE0000FFFFFFC00007E007F00007E001F80007E000FC0007E0007E0007E0003F0007E000 -3F0007E0001F8007E0001F8007E0001F8007E0001FC007E0001FC007E0001FC007E0001FC007E0 -001FC007E0001FC007E0001FC007E0001FC007E0001FC007E0001F8007E0001F8007E0001F8007 -E0003F0007E0003F0007E0007E0007E000FC0007E001F80007E007F000FFFFFFC000FFFFFE0000 -221F7E9E28>I<FFFFFFE0FFFFFFE007E007E007E001E007E000E007E0006007E0007007E00030 -07E0003007E0603007E0603007E0600007E0E00007E1E00007FFE00007FFE00007E1E00007E0E0 -0007E0600007E0600C07E0600C07E0000C07E0001807E0001807E0001807E0003807E0007807E0 -00F807E003F0FFFFFFF0FFFFFFF01E1F7E9E22>I<FFFFFFE0FFFFFFE007E007E007E001E007E0 -00E007E0006007E0007007E0003007E0003007E0603007E0603007E0600007E0E00007E1E00007 -FFE00007FFE00007E1E00007E0E00007E0600007E0600007E0600007E0000007E0000007E00000 -07E0000007E0000007E0000007E0000007E00000FFFF8000FFFF80001C1F7E9E21>I<FFFFFFFF -07E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007 -E007E007E007E007E007E007E007E0FFFFFFFF101F7E9E14>73 D<FFFF8000FFFF800007E00000 -07E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E000 -0007E0000007E0000007E0000007E0000007E0000007E0000007E000C007E000C007E000C007E0 -01C007E001C007E001C007E0038007E0038007E00F8007E01F80FFFFFF80FFFFFF801A1F7E9E1F ->76 D<001FF80000FFFF0001F81F8007E007E00FC003F01F8001F81F0000F83F0000FC7F0000FE -7E00007E7E00007EFE00007FFE00007FFE00007FFE00007FFE00007FFE00007FFE00007FFE0000 -7FFE00007F7E00007E7F0000FE7F0000FE3F0000FC3F8001FC1F8001F80FC003F007E007E001F8 -1F8000FFFF00001FF800201F7D9E27>79 D<FFFFFE00FFFFFF8007E00FE007E003F007E001F807 -E001F807E001FC07E001FC07E001FC07E001FC07E001FC07E001F807E001F807E003F007E00FE0 -07FFFF8007FFFE0007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E000 -0007E0000007E0000007E0000007E00000FFFF0000FFFF00001E1F7E9E24>I<FFFFF80000FFFF -FF000007E01FC00007E007E00007E003F00007E003F00007E003F80007E003F80007E003F80007 -E003F80007E003F00007E003F00007E007E00007E01FC00007FFFF000007FFFC000007E03E0000 -07E01F000007E01F800007E00FC00007E00FC00007E00FC00007E00FE00007E00FE00007E00FE0 -0007E00FE03007E00FF03007E00FF07007E007F860FFFF01FFE0FFFF007F80241F7E9E27>82 -D<03FC080FFF381E03F83800F8700078700038F00038F00018F00018F80000FC00007FC0007FFE -003FFF801FFFE00FFFF007FFF000FFF80007F80000FC00007C00003CC0003CC0003CC0003CE000 -38E00078F80070FE01E0E7FFC081FF00161F7D9E1D>I<7FFFFFFC7FFFFFFC7C07E07C7007E01C -6007E00C6007E00CE007E00EC007E006C007E006C007E006C007E0060007E0000007E0000007E0 -000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007 -E0000007E0000007E0000007E0000007E00003FFFFC003FFFFC01F1E7E9D24>I<0400800E01C0 -180300300600700E00600C00600C00C01800C01800DC1B80FE1FC0FF1FE0FF1FE07F0FE03E07C0 -1C038013107B9F1B>92 D<07FC001FFF003F0F803F07C03F03E03F03E00C03E00003E0007FE007 -FBE01F03E03C03E07C03E0F803E0F803E0F803E0FC05E07E0DE03FF9FE0FE07E17147F9319>97 -D<FF0000FF00001F00001F00001F00001F00001F00001F00001F00001F00001F00001F00001F1F -C01F7FF01FE0F81F807C1F007E1F003E1F003E1F003F1F003F1F003F1F003F1F003F1F003F1F00 -3E1F003E1F007C1F807C1EC1F81C7FE0181F8018207E9F1D>I<01FE0007FF801F0FC03E0FC03E -0FC07C0FC07C0300FC0000FC0000FC0000FC0000FC0000FC00007C00007E00003E00603F00C01F -81C007FF0001FC0013147E9317>I<0007F80007F80000F80000F80000F80000F80000F80000F8 -0000F80000F80000F80000F801F8F80FFEF81F83F83E01F87E00F87C00F87C00F8FC00F8FC00F8 -FC00F8FC00F8FC00F8FC00F87C00F87C00F87E00F83E01F81F07F80FFEFF03F8FF18207E9F1D> -I<01FE0007FF801F83E03F01F07E00F07E00F8FC00F8FC00F8FFFFF8FFFFF8FC0000FC0000FC00 -007C00007E00003E00183F00380F807007FFE000FF8015147F9318>I<001F8000FFC001F3E003 -E7E003C7E007C7E007C3C007C00007C00007C00007C00007C000FFFC00FFFC0007C00007C00007 -C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007 -C0003FFC003FFC0013207F9F10>I<01FC3C07FFFE0F079E1E03DE3E03E03E03E03E03E03E03E0 -3E03E01E03C00F07800FFF0009FC001800001800001C00001FFF800FFFF007FFF81FFFFC3C007C -70003EF0001EF0001EF0001E78003C78003C3F01F80FFFE001FF00171E7F931A>I<FF0000FF00 -001F00001F00001F00001F00001F00001F00001F00001F00001F00001F00001F0FC01F3FE01F61 -F01FC0F81F80F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00 -F81F00F81F00F8FFE3FFFFE3FF18207D9F1D>I<1C003F007F007F007F003F001C000000000000 -00000000000000FF00FF001F001F001F001F001F001F001F001F001F001F001F001F001F001F00 -1F001F00FFE0FFE00B217EA00E>I<FF0000FF00001F00001F00001F00001F00001F00001F0000 -1F00001F00001F00001F00001F01FE1F01FE1F00F01F01C01F03801F07001F1E001F38001F7C00 -1FFE001FFF001F1F001E0F801E07C01E07E01E03F01E01F01E00F8FFC3FFFFC3FF18207E9F1C> -107 D<FF00FF001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00 -1F001F001F001F001F001F001F001F001F001F001F001F00FFE0FFE00B207E9F0E>I<FE0FE03F -80FE1FF07FC01E70F9C3E01E407D01F01E807E01F01F807E01F01F007C01F01F007C01F01F007C -01F01F007C01F01F007C01F01F007C01F01F007C01F01F007C01F01F007C01F01F007C01F01F00 -7C01F01F007C01F0FFE3FF8FFEFFE3FF8FFE27147D932E>I<FE0FC0FE3FE01E61F01EC0F81E80 -F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00 -F8FFE3FFFFE3FF18147D931D>I<01FF0007FFC01F83F03E00F83E00F87C007C7C007CFC007EFC -007EFC007EFC007EFC007EFC007E7C007C7C007C3E00F83E00F81F83F007FFC001FF0017147F93 -1A>I<FF1FC0FF7FF01FE1F81F80FC1F007E1F007E1F003E1F003F1F003F1F003F1F003F1F003F -1F003F1F003E1F007E1F007C1F80FC1FC1F81F7FE01F1F801F00001F00001F00001F00001F0000 -1F00001F0000FFE000FFE000181D7E931D>I<FE3E00FE7F801ECFC01E8FC01E8FC01F8FC01F03 -001F00001F00001F00001F00001F00001F00001F00001F00001F00001F00001F0000FFF000FFF0 -0012147E9316>114 D<0FE63FFE701E600EE006E006F800FFC07FF83FFC1FFE03FE001FC007C0 -07E007F006F81EFFFCC7F010147E9315>I<01800180018003800380038007800F803F80FFFCFF -FC0F800F800F800F800F800F800F800F800F800F800F860F860F860F860F8607CC03F801F00F1D -7F9C14>I<FF07F8FF07F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F -00F81F00F81F00F81F00F81F01F81F01F80F06F807FCFF03F8FF18147D931D>I<FFE7FE1FE0FF -E7FE1FE01F00F007001F00F803000F80F806000F80F8060007C1BC0C0007C1BC0C0007C1BE0C00 -03E31E180003E31E180001F60F300001F60F300001F60FB00000FC07E00000FC07E000007803C0 -00007803C000007803C000003001800023147F9326>119 D<FFE1FF00FFE1FF000F80700007C0 -E00007E0C00003E1800001F3800000FF0000007E0000003E0000003F0000007F8000006F800000 -C7C0000183E0000381F0000701F8000E00FC00FF81FF80FF81FF8019147F931C>I -E /Fl 85 127 df<70F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F870000000000070F8F8F870051C77 -9B18>33 D<4010E038F078E038E038E038E038E038E038E038E038E038E03860300D0E7B9C18> -I<030600078F00078F00078F00078F00078F00078F007FFFC0FFFFE0FFFFE07FFFC00F1E000F1E -000F1E000F1E000F1E000F1E007FFFC0FFFFE0FFFFE07FFFC01E3C001E3C001E3C001E3C001E3C -001E3C000C1800131C7E9B18>I<00C00001C00001C00001C00003F0000FFC003FFE007DCF0071 -C700E1C380E1C780E1C780E1C780F1C00079C0003DC0001FE0000FF80003FC0001DE0001CF0001 -C70061C380F1C380F1C380E1C380E1C70071C70079DE003FFE001FF80007E00001C00001C00001 -C00000C00011247D9F18>I<3803007C07807C0780EE0F80EE0F00EE0F00EE1F00EE1E00EE1E00 -EE3E007C3C007C3C00387C0000780000780000F80000F00001F00001E00001E00003E00003C000 -03C00007C0000783800787C00F87C00F0EE00F0EE01F0EE01E0EE01E0EE03E0EE03C07C03C07C0 -18038013247E9F18>I<01C00007E0000FF0000E70001C38001C38001C38001C38001C73F01C73 -F01CE3F00FE3800FC7000F87000F07001F0E003F0E007B8E0073DC00E1DC00E0F800E0F800E070 -70E0787070FC707FFFE03FCFE00F03C0141C7F9B18>I<387C7C7E3E0E0E0E1C1C38F8F0C0070E -789B18>I<007000F001E003C007800F001E001C00380038007000700070007000E000E000E000 -E000E000E000E000E0007000700070007000380038001C001E000F00078003C001F000F000700C -24799F18>I<6000F00078003C001E000F000780038001C001C000E000E000E000E00070007000 -700070007000700070007000E000E000E000E001C001C0038007800F001E003C007800F0006000 -0C247C9F18>I<01C00001C00001C00001C000C1C180F1C780F9CF807FFF001FFC0007F00007F0 -001FFC007FFF00F9CF80F1C780C1C18001C00001C00001C00001C00011147D9718>I<00600000 -F00000F00000F00000F00000F00000F00000F0007FFFC0FFFFE0FFFFE07FFFC000F00000F00000 -F00000F00000F00000F00000F00000600013147E9718>I<1C3E7E7F3F1F070E1E7CF860080C78 -8518>I<7FFF00FFFF80FFFF807FFF0011047D8F18>I<3078FCFC78300606778518>I<00030000 -0780000780000F80000F00001F00001E00001E00003E00003C00007C0000780000780000F80000 -F00001F00001E00003E00003C00003C00007C0000780000F80000F00000F00001F00001E00003E -00003C00003C00007C0000780000F80000F00000F0000060000011247D9F18>I<01F00007FC00 -0FFE001F1F001C07003803807803C07001C07001C0E000E0E000E0E000E0E000E0E000E0E000E0 -E000E0E000E0E000E0F001E07001C07001C07803C03803801C07001F1F000FFE0007FC0001F000 -131C7E9B18>I<01800380038007800F803F80FF80FB8043800380038003800380038003800380 -0380038003800380038003800380038003807FFCFFFE7FFC0F1C7B9B18>I<03F0000FFE003FFF -007C0F807003C0E001C0F000E0F000E06000E00000E00000E00001C00001C00003C0000780000F -00001E00003C0000780000F00001E00007C0000F80001E00E03C00E07FFFE0FFFFE07FFFE0131C -7E9B18>I<07F8001FFE003FFF007807807803C07801C03001C00001C00003C0000380000F0003 -FF0003FE0003FF000007800003C00001C00000E00000E00000E0F000E0F000E0F001C0F003C07C -07803FFF001FFE0003F800131C7E9B18>I<001F00003F0000770000770000E70001E70001C700 -0387000787000707000E07001E07003C0700380700780700F00700FFFFF8FFFFF8FFFFF8000700 -000700000700000700000700000700007FF000FFF8007FF0151C7F9B18>I<1FFF803FFF803FFF -803800003800003800003800003800003800003800003800003BF8003FFE003FFF003C07801803 -C00001C00000E00000E06000E0F000E0F000E0E001C07003C07C0F803FFF001FFC0003F000131C -7E9B18>I<E00000FFFFE0FFFFE0FFFFE0E003C0E00780000700000E00001E00001C0000380000 -380000700000700000E00000E00000E00001C00001C00001C00001C00003C00003800003800003 -8000038000038000038000038000131D7E9C18>55 D<3078FCFC783000000000000000003078FC -FC78300614779318>58 D<183C7E7E3C180000000000000000183C7E7E3E1E0E1C3C78F060071A -789318>I<000300000780001F80003F00007E0001FC0003F00007E0001FC0003F00007E0000FC -0000FC00007E00003F00001FC00007E00003F00001FC00007E00003F00001F8000078000030011 -187D9918>I<7FFFC0FFFFE0FFFFE0FFFFE0000000000000000000000000FFFFE0FFFFE0FFFFE0 -7FFFC0130C7E9318>I<600000F00000FC00007E00003F00001FC00007E00003F00001FC00007E -00003F00001F80001F80003F00007E0001FC0003F00007E0001FC0003F00007E0000FC0000F000 -0060000011187D9918>I<0FF0003FFC007FFF00700F00F00380F00380600780000F00003E0000 -7C0001F00001E00003C00003C00003C00003C00003C00003800000000000000000000000000000 -000003800007C00007C00007C000038000111C7D9B18>I<007C0001FE0007FF000F87801E03C0 -3C1DC0387FC070FFE071E3E071C1E0E1C1E0E380E0E380E0E380E0E380E0E380E0E380E0E1C1C0 -71C1C071E3C070FF80387F003C1C001E00E00F83E007FFC001FF80007E00131C7E9B18>I<0070 -0000F80000F80000D80000D80001DC0001DC0001DC00018C00038E00038E00038E00038E000306 -000707000707000707000707000FFF800FFF800FFF800E03800E03801C01C01C01C07F07F0FF8F -F87F07F0151C7F9B18>I<FFFC00FFFF00FFFF801C03C01C01C01C00E01C00E01C00E01C00E01C -01E01C01C01C07C01FFF801FFF001FFFC01C03C01C00E01C00F01C00701C00701C00701C00701C -00F01C00E01C03E0FFFFC0FFFF80FFFE00141C7F9B18>I<00F8E003FEE007FFE00F07E01E03E0 -3C01E03800E07000E07000E0700000E00000E00000E00000E00000E00000E00000E00000E00000 -7000007000E07000E03800E03C00E01E01C00F07C007FF8003FE0000F800131C7E9B18>I<7FF8 -00FFFE007FFF001C0F801C03C01C03C01C01E01C00E01C00E01C00F01C00701C00701C00701C00 -701C00701C00701C00701C00701C00F01C00E01C00E01C01E01C01C01C03C01C0F807FFF00FFFE -007FF800141C7F9B18>I<FFFFF0FFFFF0FFFFF01C00701C00701C00701C00701C00001C00001C -0E001C0E001C0E001FFE001FFE001FFE001C0E001C0E001C0E001C00001C00001C00381C00381C -00381C00381C0038FFFFF8FFFFF8FFFFF8151C7F9B18>I<FFFFE0FFFFE0FFFFE01C00E01C00E0 -1C00E01C00E01C00001C00001C1C001C1C001C1C001FFC001FFC001FFC001C1C001C1C001C1C00 -1C00001C00001C00001C00001C00001C00001C0000FFC000FFC000FFC000131C7E9B18>I<01F1 -C003FDC00FFFC01F0FC01C03C03803C03801C07001C07001C0700000E00000E00000E00000E000 -00E00000E00FF0E01FF0E00FF07001C07001C07003C03803C03803C01C07C01F0FC00FFFC003FD -C001F1C0141C7E9B18>I<7FFF00FFFF807FFF0001C00001C00001C00001C00001C00001C00001 -C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001 -C00001C00001C0007FFF00FFFF807FFF00111C7D9B18>73 D<01FFC003FFC001FFC0000E00000E -00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E -00000E00000E00000E00000E00F00E00F00E00F03C007FFC003FF0000FC000121C7D9B18>I<7F -E000FFE0007FE0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E -00000E00000E00000E00000E00000E00000E00000E00700E00700E00700E00700E00707FFFF0FF -FFF07FFFF0141C7F9B18>76 D<FC01F8FE03F8FE03F83B06E03B06E03B06E03B06E03B8EE03B8E -E0398CE0398CE039DCE039DCE039DCE038D8E038D8E038F8E03870E03870E03800E03800E03800 -E03800E03800E03800E0FE03F8FE03F8FE03F8151C7F9B18>I<7E07F0FF0FF87F07F01D81C01D -81C01D81C01DC1C01CC1C01CC1C01CE1C01CE1C01CE1C01C61C01C71C01C71C01C31C01C39C01C -39C01C39C01C19C01C19C01C1DC01C0DC01C0DC01C0DC07F07C0FF87C07F03C0151C7F9B18>I< -0FF8003FFE007FFF00780F00700700F00780E00380E00380E00380E00380E00380E00380E00380 -E00380E00380E00380E00380E00380E00380E00380E00380E00380F00780700700780F007FFF00 -3FFE000FF800111C7D9B18>I<FFFE00FFFF80FFFFC01C03C01C01E01C00E01C00701C00701C00 -701C00701C00701C00E01C01E01C03C01FFFC01FFF801FFE001C00001C00001C00001C00001C00 -001C00001C00001C0000FF8000FF8000FF8000141C7F9B18>I<7FF800FFFE007FFF001C0F801C -03801C03C01C01C01C01C01C01C01C03C01C03801C0F801FFF001FFE001FFE001C0F001C07001C -03801C03801C03801C03801C03801C039C1C039C1C039C7F01F8FF81F87F00F0161C7F9B18>82 -D<7FFFF8FFFFF8FFFFF8E07038E07038E07038E070380070000070000070000070000070000070 -0000700000700000700000700000700000700000700000700000700000700000700000700007FF -0007FF0007FF00151C7F9B18>84 D<FF83FEFF83FEFF83FE1C00701C00701C00701C00701C0070 -1C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701C0070 -1C00700E00E00F01E00783C003FF8001FF00007C00171C809B18>I<FF07F8FF07F8FF07F81C01 -C01C01C01C01C01C01C00E03800E03800E03800E03800F0780070700070700070700070700038E -00038E00038E00038E00018C0001DC0001DC0001DC0000D80000F80000F800007000151C7F9B18 ->I<FE03F8FE03F8FE03F87000707000707000703800E03800E03800E03800E03800E038F8E038 -F8E039DCE039DCE019DCC019DCC019DCC0198CC01D8DC01D8DC01D8DC01D8DC00D8D800D05800F -07800F07800E0380151C7F9B18>I<3FFFE07FFFE07FFFE07001C07003C0700780700700000F00 -001E00001C00003C0000780000700000F00001E00001C00003C0000780000700000F00001E00E0 -1C00E03C00E07800E07000E0FFFFE0FFFFE0FFFFE0131C7E9B18>90 D<FFF8FFF8FFF8E000E000 -E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E0 -00E000E000E000E000E000E000E000E000FFF8FFF8FFF80D24779F18>I<600000F00000F00000 -F800007800007C00003C00003C00003E00001E00001F00000F00000F00000F800007800007C000 -03C00003C00003E00001E00001F00000F00000F800007800007800007C00003C00003E00001E00 -001E00001F00000F00000F8000078000078000030011247D9F18>I<FFF8FFF8FFF80038003800 -380038003800380038003800380038003800380038003800380038003800380038003800380038 -00380038003800380038003800380038FFF8FFF8FFF80D247F9F18>I<018007C01FF07EFCF83E -E00E0F067C9B18>I<7FFF00FFFF80FFFF807FFF0011047D7F18>I<061E3E387070E0E0E0F8FC7C -7C38070E789E18>I<1FE0003FF8007FFC00781E00300E0000070000070000FF0007FF001FFF00 -7F0700780700E00700E00700E00700F00F00781F003FFFF01FFBF007E1F014147D9318>I<7E00 -00FE00007E00000E00000E00000E00000E00000E00000E3E000EFF800FFFC00FC1E00F80E00F00 -700E00700E00380E00380E00380E00380E00380E00380F00700F00700F80E00FC1E00FFFC00EFF -80063E00151C809B18>I<01FE0007FF001FFF803E0780380300700000700000E00000E00000E0 -0000E00000E00000E000007000007001C03801C03E03C01FFF8007FF0001FC0012147D9318>I< -001F80003F80001F8000038000038000038000038000038003E3800FFB801FFF803C1F80380F80 -700780700380E00380E00380E00380E00380E00380E00380700780700780380F803C1F801FFFF0 -0FFBF803E3F0151C7E9B18>I<01F00007FC001FFE003E0F00380780700380700380E001C0E001 -C0FFFFC0FFFFC0FFFFC0E000007000007001C03801C03E03C01FFF8007FF0001FC0012147D9318 ->I<001F80007FC000FFE000E1E001C0C001C00001C00001C0007FFFC0FFFFC0FFFFC001C00001 -C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0007F -FF007FFF007FFF00131C7F9B18>I<01E1F007FFF80FFFF81E1E301C0E00380700380700380700 -3807003807001C0E001E1E001FFC001FF80039E0003800001C00001FFE001FFFC03FFFE07801F0 -700070E00038E00038E00038E000387800F07E03F01FFFC00FFF8001FC00151F7F9318>I<7E00 -00FE00007E00000E00000E00000E00000E00000E00000E3E000EFF800FFFC00FC1C00F80E00F00 -E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E07FC3FCFFE7 -FE7FC3FC171C809B18>I<03800007C00007C00007C0000380000000000000000000000000007F -C000FFC0007FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001 -C00001C00001C00001C000FFFF00FFFF80FFFF00111D7C9C18>I<0038007C007C007C00380000 -0000000000000FFC1FFC0FFC001C001C001C001C001C001C001C001C001C001C001C001C001C00 -1C001C001C001C001C001C001C001C001C6038F078FFF07FE03F800E277E9C18>I<FE0000FE00 -00FE00000E00000E00000E00000E00000E00000E3FF00E7FF00E3FF00E07800E0F000E1E000E3C -000E78000EF0000FF8000FFC000F9C000F0E000E0F000E07000E03800E03C0FFC7F8FFC7F8FFC7 -F8151C7F9B18>I<7FE000FFE0007FE00000E00000E00000E00000E00000E00000E00000E00000 -E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000 -E00000E0007FFFC0FFFFE07FFFC0131C7E9B18>I<7CE0E000FFFBF8007FFFF8001F1F1C001E1E -1C001E1E1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C -1C1C001C1C1C001C1C1C007F1F1F00FFBFBF807F1F1F001914819318>I<7E3E00FEFF807FFFC0 -0FC1C00F80E00F00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E0 -0E00E07FC3FCFFE7FE7FC3FC1714809318>I<01F0000FFE001FFF003E0F803803807001C07001 -C0E000E0E000E0E000E0E000E0E000E0F001E07001C07803C03C07803E0F801FFF000FFE0001F0 -0013147E9318>I<7E3E00FEFF807FFFC00FC1E00F80E00F00700E00700E00380E00380E00380E -00380E00380E00380F00700F00700F80E00FC1E00FFFC00EFF800E3E000E00000E00000E00000E -00000E00000E00000E00007FC000FFE0007FC000151E809318>I<01E38007FB801FFF803E1F80 -380F80700780700780E00380E00380E00380E00380E00380E00380700780700780380F803C1F80 -1FFF800FFB8003E380000380000380000380000380000380000380000380003FF8003FF8003FF8 -151E7E9318>I<7F87E0FF9FF07FBFF803F87803F03003E00003C00003C0000380000380000380 -000380000380000380000380000380000380007FFE00FFFF007FFE0015147F9318>I<07F7003F -FF007FFF00780F00E00700E00700E007007C00007FE0001FFC0003FE00001F00600780E00380E0 -0380F00380F80F00FFFF00FFFC00E7F00011147D9318>I<018000038000038000038000038000 -7FFFC0FFFFC0FFFFC0038000038000038000038000038000038000038000038000038000038040 -0380E00380E00380E001C1C001FFC000FF80003E0013197F9818>I<7E07E0FE0FE07E07E00E00 -E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E01E00F03 -E007FFFC03FFFE01FCFC1714809318>I<7F8FF0FF8FF87F8FF01E03C00E03800E03800E038007 -0700070700070700038E00038E00038E00038E0001DC0001DC0001DC0000F80000F80000700015 -147F9318>I<FF8FF8FF8FF8FF8FF83800E03800E03800E01C01C01C01C01C71C01CF9C01CF9C0 -1CD9C01CD9C00DDD800DDD800DDD800D8D800F8F800F8F8007070015147F9318>I<7F8FF07F9F -F07F8FF0070700078E00039E0001DC0001F80000F80000700000F00000F80001DC00039E00038E -000707000F07807F8FF0FF8FF87F8FF015147F9318>I<7F8FF0FF8FF87F8FF00E01C00E03800E -0380070380070700070700038700038600038E0001CE0001CE0000CC0000CC0000DC0000780000 -780000780000700000700000700000F00000E00079E0007BC0007F80003F00001E0000151E7F93 -18>I<3FFFF07FFFF07FFFF07001E07003C0700780000F00001E00003C0000F80001F00003C000 -0780000F00701E00703C0070780070FFFFF0FFFFF0FFFFF014147F9318>I<0007E0001FE0007F -E000780000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00001E0 -007FC000FF8000FF80007FC00001E00000E00000E00000E00000E00000E00000E00000E00000E0 -0000E00000E00000E000007800007FE0001FE00007E013247E9F18>I<60F0F0F0F0F0F0F0F0F0 -F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0600424769F18>I<7C0000FF0000 -FFC00003C00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E000 -00F000007FC0003FE0003FE0007FC000F00000E00000E00000E00000E00000E00000E00000E000 -00E00000E00000E00000E00003C000FFC000FF00007C000013247E9F18>I<060C1F1E3FBEFBF8 -F1F060C00F067C9B18>I E /Fm 33 122 df<00003FE00000E010000180380003807800030078 -00070030000700000007000000070000000E0000000E0000000E000000FFFFE0000E00E0001C01 -C0001C01C0001C01C0001C01C0001C038000380380003803800038038000380700003807000070 -07000070071000700E2000700E2000700E2000E00E2000E0064000E0038000E0000000C0000001 -C0000001C000003180000079800000F3000000620000003C0000001D29829F1A>12 -D<00003FC0FF800000E0E38040000181E600E0000381EC01E0000300DC01E00007001C00C00007 -00180000000700380000000E00380000000E00380000000E00380000000E0070000000FFFFFFFF -80001C00700380001C00700700001C00700700001C00700700001C00E00700001C00E00E000038 -00E00E00003800E00E00003800E00E00003801C01C00003801C01C00007001C01C00007001C01C -40007001C0388000700380388000700380388000E00380388000E00380190000E003000E0000E0 -0700000000C00700000001C00600000001C00600000031860E000000798F0C000000F31E180000 -00620C300000003C07C00000002B29829F28>14 D<0E1F3F3F1D0102020404081020C0080E779F -0E>39 D<000200020006000E003C00DC031C001C0038003800380038007000700070007000E000 -E000E000E001C001C001C001C003800380038003800780FFF80F1E7B9D17>49 -D<070F1F1F0E0000000000000000000070F8F8F0E008147B930E>58 D<0000FE0200078186001C -004C0038003C0060003C00C0001C01C0001803800018070000180F0000181E0000101E0000103C -0000003C00000078000000780000007800000078000000F0000000F0000000F0000000F0000000 -F00000807000008070000080700001003800010038000200180004000C001800060020000381C0 -0000FE00001F217A9F21>67 D<01FFFFFC001E0038001E0018001E0008001E0008003C0008003C -0008003C0008003C00080078001000780800007808000078080000F0100000F0300000FFF00000 -F0300001E0200001E0200001E0200001E0200003C0000003C0000003C0000003C0000007800000 -0780000007800000078000000F800000FFF800001E1F7D9E1E>70 D<01FF007FE0001F000F0000 -1F0004000017800400001780040000278008000023C008000023C008000023C008000041E01000 -0041E010000041F010000040F010000080F0200000807820000080782000008078200001003C40 -0001003C400001003C400001001E400002001E800002001E800002000F800002000F800004000F -0000040007000004000700000C000700001C00020000FF80020000231F7D9E22>78 -D<01FFFF80001E00E0001E0070001E0038001E003C003C003C003C003C003C003C003C003C0078 -007800780078007800F0007800E000F003C000F00F0000FFFC0000F0000001E0000001E0000001 -E0000001E0000003C0000003C0000003C0000003C0000007800000078000000780000007800000 -0F800000FFF000001E1F7D9E1F>80 D<00F1800389C00707800E03801C03803C03803807007807 -00780700780700F00E00F00E00F00E00F00E20F01C40F01C40703C40705C40308C800F07001314 -7C9317>97 D<07803F8007000700070007000E000E000E000E001C001C001CF01D0C3A0E3C0E38 -0F380F700F700F700F700FE01EE01EE01EE01CE03CE038607060E031C01F0010207B9F15>I<00 -7E0001C1000300800E07801E07801C07003C0200780000780000780000F00000F00000F00000F0 -0000F0000070010070020030040018380007C00011147C9315>I<0000780003F8000070000070 -0000700000700000E00000E00000E00000E00001C00001C000F1C00389C00707800E03801C0380 -3C0380380700780700780700780700F00E00F00E00F00E00F00E20F01C40F01C40703C40705C40 -308C800F070015207C9F17>I<007C01C207010E011C013C013802780C7BF07C00F000F000F000 -F0007000700170023804183807C010147C9315>I<00007800019C00033C00033C000718000700 -000700000E00000E00000E00000E00000E0001FFE0001C00001C00001C00001C00003800003800 -00380000380000380000700000700000700000700000700000700000E00000E00000E00000E000 -00C00001C00001C0000180003180007B0000F300006600003C00001629829F0E>I<003C6000E2 -7001C1E00380E00700E00F00E00E01C01E01C01E01C01E01C03C03803C03803C03803C03803C07 -003C07001C0F001C17000C2E0003CE00000E00000E00001C00001C00301C00783800F0700060E0 -003F8000141D7E9315>I<01E0000FE00001C00001C00001C00001C00003800003800003800003 -8000070000070000071E000763000E81800F01C00E01C00E01C01C03801C03801C03801C038038 -0700380700380700380E10700E20700C20701C20700C40E00CC060070014207D9F17>I<00C001 -E001E001C000000000000000000000000000000E003300230043804300470087000E000E000E00 -1C001C001C003840388030807080310033001C000B1F7C9E0E>I<0001800003C00003C0000380 -000000000000000000000000000000000000000000003C00004600008700008700010700010700 -020E00000E00000E00000E00001C00001C00001C00001C00003800003800003800003800007000 -00700000700000700000E00000E00030E00079C000F180006300003C00001228829E0E>I<01E0 -000FE00001C00001C00001C00001C0000380000380000380000380000700000700000703C00704 -200E08E00E11E00E21E00E40C01C80001D00001E00001FC00038E0003870003870003838407070 -80707080707080703100E03100601E0013207D9F15>I<03C01FC0038003800380038007000700 -070007000E000E000E000E001C001C001C001C0038003800380038007000700070007100E200E2 -00E200E200640038000A207C9F0C>I<1C0F80F0002630C318004740640C004780680E00470070 -0E004700700E008E00E01C000E00E01C000E00E01C000E00E01C001C01C038001C01C038001C01 -C038001C01C0708038038071003803806100380380E10038038062007007006600300300380021 -147C9325>I<1C0F802630C04740604780604700704700708E00E00E00E00E00E00E00E01C01C0 -1C01C01C01C01C03843803883803083807083803107003303001C016147C931A>I<007C0001C3 -000301800E01C01E01C01C01E03C01E07801E07801E07801E0F003C0F003C0F003C0F00780F007 -00700F00700E0030180018700007C00013147C9317>I<01C1E002621804741C04781C04701E04 -701E08E01E00E01E00E01E00E01E01C03C01C03C01C03C01C0380380780380700380E003C1C007 -2380071E000700000700000E00000E00000E00000E00001C00001C0000FFC000171D809317>I< -1C1E002661004783804787804707804703008E00000E00000E00000E00001C00001C00001C0000 -1C000038000038000038000038000070000030000011147C9313>114 D<00FC030206010C030C -070C060C000F800FF007F803FC003E000E700EF00CF00CE008401020601F8010147D9313>I<01 -8001C0038003800380038007000700FFF007000E000E000E000E001C001C001C001C0038003800 -38003820704070407080708031001E000C1C7C9B0F>I<0E00C03300E02301C04381C04301C047 -01C08703800E03800E03800E03801C07001C07001C07001C07101C0E20180E20180E201C1E200C -264007C38014147C9318>I<0E03803307802307C04383C04301C04700C08700800E00800E0080 -0E00801C01001C01001C01001C02001C02001C04001C04001C08000E300003C00012147C9315> -I<0E00C1C03300E3C02301C3E04381C1E04301C0E04701C060870380400E0380400E0380400E03 -80401C0700801C0700801C0700801C0701001C0701001C0602001C0F02000C0F04000E13080003 -E1F0001B147C931E>I<0383800CC4401068E01071E02071E02070C040E00000E00000E00000E0 -0001C00001C00001C00001C040638080F38080F38100E5810084C60078780013147D9315>I<0E -00C03300E02301C04381C04301C04701C08703800E03800E03800E03801C07001C07001C07001C -07001C0E00180E00180E001C1E000C3C0007DC00001C00001C00003800F03800F07000E06000C0 -C0004380003E0000131D7C9316>I E /Fn 74 123 df<001F83E000F06E3001C078780380F878 -0300F03007007000070070000700700007007000070070000700700007007000FFFFFF80070070 -000700700007007000070070000700700007007000070070000700700007007000070070000700 -7000070070000700700007007000070070000700700007007000070070007FE3FF001D20809F1B ->11 D<003F0000E0C001C0C00381E00701E00701E0070000070000070000070000070000070000 -FFFFE00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E0 -0700E00700E00700E00700E00700E00700E07FC3FE1720809F19>I<003FE000E0E001C1E00381 -E00700E00700E00700E00700E00700E00700E00700E00700E0FFFFE00700E00700E00700E00700 -E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700 -E00700E07FE7FE1720809F19>I<001F81F80000F04F040001C07C06000380F80F000300F00F00 -0700F00F00070070000007007000000700700000070070000007007000000700700000FFFFFFFF -000700700700070070070007007007000700700700070070070007007007000700700700070070 -070007007007000700700700070070070007007007000700700700070070070007007007000700 -700700070070070007007007007FE3FE3FF02420809F26>I<07070F1C383060C00808779F17> -19 D<7038F87CFC7EFC7E743A0402040204020804080410081008201040200F0E7E9F17>34 -D<70F8FCFC74040404080810102040060E7C9F0D>39 D<0020004000800100020006000C000C00 -180018003000300030007000600060006000E000E000E000E000E000E000E000E000E000E000E0 -00E0006000600060007000300030003000180018000C000C000600020001000080004000200B2E -7DA112>I<800040002000100008000C00060006000300030001800180018001C000C000C000C0 -00E000E000E000E000E000E000E000E000E000E000E000E000C000C000C001C001800180018003 -000300060006000C00080010002000400080000B2E7DA112>I<70F8FCFC740404040808101020 -40060E7C840D>44 D<FFC0FFC00A027F8A0F>I<70F8F8F87005057C840D>I<0003000300070006 -0006000E000C000C001C0018001800380030003000700060006000E000C000C001C00180018001 -800380030003000700060006000E000C000C001C0018001800380030003000700060006000E000 -C000C000102D7DA117>I<03F0000E1C001C0E00180600380700700380700380700380700380F0 -03C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C070 -03807003807003807807803807001806001C0E000E1C0003F000121F7E9D17>I<018003800F80 -F38003800380038003800380038003800380038003800380038003800380038003800380038003 -800380038003800380038007C0FFFE0F1E7C9D17>I<03F0000C1C00100E002007004007808007 -80F007C0F803C0F803C0F803C02007C00007C0000780000780000F00000E00001C000038000070 -0000600000C0000180000300000600400C00401800401000803FFF807FFF80FFFF80121E7E9D17 ->I<03F0000C1C00100E00200F00780F80780780780780380F80000F80000F00000F00000E0000 -1C0000380003F000003C00000E00000F000007800007800007C02007C0F807C0F807C0F807C0F0 -0780400780400F00200E001C3C0003F000121F7E9D17>I<000600000600000E00000E00001E00 -002E00002E00004E00008E00008E00010E00020E00020E00040E00080E00080E00100E00200E00 -200E00400E00C00E00FFFFF0000E00000E00000E00000E00000E00000E00000E0000FFE0141E7F -9D17>I<1803001FFE001FFC001FF8001FE00010000010000010000010000010000010000011F0 -00161C00180E001007001007800003800003800003C00003C00003C07003C0F003C0F003C0E003 -80400380400700200600100E000C380003E000121F7E9D17>I<007C000182000701000E03800C -07801C0780380300380000780000700000700000F1F000F21C00F40600F80700F80380F80380F0 -03C0F003C0F003C0F003C0F003C07003C07003C07003803803803807001807000C0E00061C0001 -F000121F7E9D17>I<4000007FFFC07FFF807FFF80400100800200800200800400000800000800 -00100000200000200000400000400000C00000C00001C000018000038000038000038000038000 -078000078000078000078000078000078000078000030000121F7D9D17>I<03F0000C0C001006 -003003002001806001806001806001807001807803003E03003F06001FC8000FF00003F80007FC -000C7E00103F00300F806003804001C0C001C0C000C0C000C0C000C0C000806001802001001002 -000C0C0003F000121F7E9D17>I<03F0000E18001C0C00380600380700700700700380F00380F0 -0380F003C0F003C0F003C0F003C0F003C07007C07007C03807C0180BC00E13C003E3C000038000 -0380000380000700300700780600780E00700C002018001070000FC000121F7E9D17>I<70F8F8 -F8700000000000000000000070F8F8F87005147C930D>I<70F8F8F87000000000000000000000 -70F0F8F878080808101010202040051D7C930D>I<7FFFFFE0FFFFFFF000000000000000000000 -00000000000000000000000000000000000000000000FFFFFFF07FFFFFE01C0C7D9023>61 -D<000100000003800000038000000380000007C0000007C0000007C0000009E0000009E0000009 -E0000010F0000010F0000010F00000207800002078000020780000403C0000403C0000403C0000 -801E0000801E0000FFFE0001000F0001000F0001000F00020007800200078002000780040003C0 -0E0003C01F0007E0FFC03FFE1F207F9F22>65 D<FFFFE0000F80380007801E0007801F0007800F -0007800F8007800F8007800F8007800F8007800F8007800F0007801F0007801E0007803C0007FF -F00007803C0007801E0007800F0007800F8007800780078007C0078007C0078007C0078007C007 -8007C00780078007800F8007800F0007801F000F803C00FFFFF0001A1F7E9E20>I<000FC04000 -7030C001C009C0038005C0070003C00E0001C01E0000C01C0000C03C0000C07C0000407C000040 -78000040F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8000000F80000 -00780000007C0000407C0000403C0000401C0000401E0000800E000080070001000380020001C0 -040000703800000FC0001A217D9F21>I<FFFFFF000F800F000780030007800300078001000780 -0180078000800780008007800080078080800780800007808000078080000781800007FF800007 -818000078080000780800007808000078080000780002007800020078000200780004007800040 -07800040078000C0078000C0078001800F800F80FFFFFF801B1F7E9E1F>69 -D<FFFFFF000F800F00078003000780030007800100078001800780008007800080078000800780 -0080078080000780800007808000078080000781800007FF800007818000078080000780800007 -808000078080000780000007800000078000000780000007800000078000000780000007800000 -0FC00000FFFE0000191F7E9E1E>I<000FE0200078186000E004E0038002E0070001E00F0000E0 -1E0000601E0000603C0000603C0000207C00002078000020F8000000F8000000F8000000F80000 -00F8000000F8000000F8000000F8007FFCF80003E0780001E07C0001E03C0001E03C0001E01E00 -01E01E0001E00F0001E0070001E0038002E000E0046000781820000FE0001E217D9F24>I<FFF8 -FFF80F800F8007800F0007800F0007800F0007800F0007800F0007800F0007800F0007800F0007 -800F0007800F0007800F0007800F0007FFFF0007800F0007800F0007800F0007800F0007800F00 -07800F0007800F0007800F0007800F0007800F0007800F0007800F0007800F0007800F000F800F -80FFF8FFF81D1F7E9E22>I<FFFC0FC00780078007800780078007800780078007800780078007 -800780078007800780078007800780078007800780078007800780078007800FC0FFFC0E1F7F9E -10>I<FFFE000FC000078000078000078000078000078000078000078000078000078000078000 -078000078000078000078000078000078000078000078000078002078002078002078002078006 -07800407800407800C07801C0F807CFFFFFC171F7E9E1C>76 D<FF80001FF80F80001F80078000 -1F0005C0002F0005C0002F0005C0002F0004E0004F0004E0004F000470008F000470008F000470 -008F000438010F000438010F000438010F00041C020F00041C020F00041C020F00040E040F0004 -0E040F00040E040F000407080F000407080F000407080F000403900F000403900F000401E00F00 -0401E00F000401E00F000E00C00F001F00C01F80FFE0C1FFF8251F7E9E2A>I<FF803FF807C007 -C007C0038005E0010005E0010004F001000478010004780100043C0100043C0100041E0100040F -0100040F010004078100040781000403C1000401E1000401E1000400F1000400F1000400790004 -003D0004003D0004001F0004001F0004000F0004000700040007000E0003001F000300FFE00100 -1D1F7E9E22>I<001F800000F0F00001C0380007801E000F000F000E0007001E0007803C0003C0 -3C0003C07C0003E0780001E0780001E0F80001F0F80001F0F80001F0F80001F0F80001F0F80001 -F0F80001F0F80001F0F80001F0780001E07C0003E07C0003E03C0003C03C0003C01E0007800E00 -07000F000F0007801E0001C0380000F0F000001F80001C217D9F23>I<FFFFE0000F8078000780 -1C0007801E0007800F0007800F8007800F8007800F8007800F8007800F8007800F8007800F0007 -801E0007801C000780780007FFE000078000000780000007800000078000000780000007800000 -078000000780000007800000078000000780000007800000078000000FC00000FFFC0000191F7E -9E1F>I<FFFF80000F80F0000780780007803C0007801E0007801E0007801F0007801F0007801F -0007801F0007801E0007801E0007803C00078078000780F00007FF80000781C0000780E0000780 -F0000780700007807800078078000780780007807C0007807C0007807C0007807C0407807E0407 -803E040FC01E08FFFC0F10000003E01E207E9E21>82 D<07E0800C198010078030038060018060 -0180E00180E00080E00080E00080F00000F000007800007F00003FF0001FFC000FFE0003FF0000 -1F800007800003C00003C00001C08001C08001C08001C08001C0C00180C00380E00300F00600CE -0C0081F80012217D9F19>I<7FFFFFE0780F01E0600F0060400F0020400F0020C00F0030800F00 -10800F0010800F0010800F0010000F0000000F0000000F0000000F0000000F0000000F0000000F -0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000 -0F0000000F0000000F0000001F800007FFFE001C1F7E9E21>I<FFFC3FF80FC007C00780038007 -800100078001000780010007800100078001000780010007800100078001000780010007800100 -078001000780010007800100078001000780010007800100078001000780010007800100078001 -0007800100038002000380020001C0020001C0040000E008000070180000382000000FC0001D20 -7E9E22>I<FFF003FE1F8000F80F0000600F800060078000400780004003C0008003C0008003C0 -008001E0010001E0010001F0010000F0020000F0020000F806000078040000780400003C080000 -3C0800003C0800001E1000001E1000001F3000000F2000000F20000007C0000007C0000007C000 -000380000003800000038000000100001F207F9E22>I<FFF07FF81FF01F800FC007C00F000780 -03800F00078001000F0007C00100078007C00200078007C00200078007C0020003C009E0040003 -C009E0040003C009E0040003E010F00C0001E010F0080001E010F0080001F02078080000F02078 -100000F02078100000F0403C10000078403C20000078403C20000078C03E2000003C801E400000 -3C801E4000003C801E4000001F000F8000001F000F8000001F000F8000001E00078000000E0007 -0000000E00070000000C000300000004000200002C207F9E2F>I<FEFEC0C0C0C0C0C0C0C0C0C0 -C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0FEFE072D7CA10D> -91 D<080410082010201040204020804080408040B85CFC7EFC7E7C3E381C0F0E7B9F17>I<FEFE -060606060606060606060606060606060606060606060606060606060606060606060606060606 -0606FEFE072D7FA10D>I<1FE000303000781800781C00300E00000E00000E00000E0000FE0007 -8E001E0E00380E00780E00F00E10F00E10F00E10F01E10781E103867200F83C014147E9317>97 -D<0E0000FE00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E3E -000EC3800F01C00F00E00E00E00E00700E00700E00780E00780E00780E00780E00780E00780E00 -700E00700E00E00F00E00D01C00CC300083E0015207F9F19>I<03F80E0C1C1E381E380C700070 -00F000F000F000F000F000F00070007000380138011C020E0C03F010147E9314>I<000380003F -8000038000038000038000038000038000038000038000038000038000038003E380061B801C07 -80380380380380700380700380F00380F00380F00380F00380F00380F003807003807003803803 -803807801C07800E1B8003E3F815207E9F19>I<03F0000E1C001C0E0038070038070070070070 -0380F00380F00380FFFF80F00000F00000F000007000007000003800801800800C010007060001 -F80011147F9314>I<007C00C6018F038F07060700070007000700070007000700FFF007000700 -07000700070007000700070007000700070007000700070007000700070007007FF01020809F0E ->I<0000E003E3300E3C301C1C30380E00780F00780F00780F00780F00780F00380E001C1C001E -380033E0002000002000003000003000003FFE001FFF800FFFC03001E0600070C00030C00030C0 -0030C000306000603000C01C038003FC00141F7F9417>I<0E0000FE00000E00000E00000E0000 -0E00000E00000E00000E00000E00000E00000E00000E3E000E43000E81800F01C00F01C00E01C0 -0E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0 -FFE7FC16207F9F19>I<1C001E003E001E001C000000000000000000000000000E007E000E000E -000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00FFC00A1F809E0C> -I<00E001F001F001F000E0000000000000000000000000007007F000F000700070007000700070 -00700070007000700070007000700070007000700070007000700070007000706070F060F0C061 -803F000C28829E0E>I<0E0000FE00000E00000E00000E00000E00000E00000E00000E00000E00 -000E00000E00000E0FF00E03C00E03000E02000E04000E08000E10000E30000E70000EF8000F38 -000E1C000E1E000E0E000E07000E07800E03800E03C00E03E0FFCFF815207F9F18>I<0E00FE00 -0E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E -000E000E000E000E000E000E000E000E000E00FFE00B20809F0C>I<0E1F01F000FE618618000E -81C81C000F00F00E000F00F00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E00 -0E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E -000E00E00E00FFE7FE7FE023147F9326>I<0E3E00FE43000E81800F01C00F01C00E01C00E01C0 -0E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0FFE7FC -16147F9319>I<01F800070E001C03803801C03801C07000E07000E0F000F0F000F0F000F0F000 -F0F000F0F000F07000E07000E03801C03801C01C0380070E0001F80014147F9317>I<0E3E00FE -C3800F01C00F00E00E00E00E00F00E00700E00780E00780E00780E00780E00780E00780E00700E -00F00E00E00F01E00F01C00EC3000E3E000E00000E00000E00000E00000E00000E00000E00000E -0000FFE000151D7F9319>I<03E0800619801C05803C0780380380780380700380F00380F00380 -F00380F00380F00380F003807003807803803803803807801C0B800E138003E380000380000380 -000380000380000380000380000380000380003FF8151D7E9318>I<0E78FE8C0F1E0F1E0F0C0E -000E000E000E000E000E000E000E000E000E000E000E000E000E00FFE00F147F9312>I<1F9030 -704030C010C010C010E00078007F803FE00FF00070803880188018C018C018E030D0608F800D14 -7E9312>I<020002000200060006000E000E003E00FFF80E000E000E000E000E000E000E000E00 -0E000E000E000E080E080E080E080E080610031001E00D1C7F9B12>I<0E01C0FE1FC00E01C00E -01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E -03C00603C0030DC001F1FC16147F9319>I<FF83F81E01E01C00C00E00800E00800E0080070100 -07010003820003820003820001C40001C40001EC0000E80000E800007000007000007000002000 -15147F9318>I<FF9FE1FC3C0780701C0300601C0380200E0380400E0380400E03C0400707C080 -0704C0800704E080038861000388710003C8730001D0320001D03A0000F03C0000E01C0000E01C -0000601800004008001E147F9321>I<7FC3FC0F01E00701C007018003810001C20000E40000EC -00007800003800003C00007C00004E000087000107000303800201C00601E01E01E0FF07FE1714 -809318>I<FF83F81E01E01C00C00E00800E00800E008007010007010003820003820003820001 -C40001C40001EC0000E80000E800007000007000007000002000002000004000004000004000F0 -8000F08000F100006200003C0000151D7F9318>I<3FFF380E200E201C40384078407000E001E0 -01C00380078007010E011E011C0338027006700EFFFE10147F9314>I E -/Fo 41 122 df<0001FF0000001FFFC000007F80F00000FE00F80003FC01FC0003F803FC0007F0 -03FC0007F003FC0007F003FC0007F001F80007F000F00007F000000007F000000007F000000007 -F0000000FFFFFFFC00FFFFFFFC00FFFFFFFC0007F001FC0007F001FC0007F001FC0007F001FC00 -07F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC -0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001 -FC0007F001FC007FFF1FFFC07FFF1FFFC07FFF1FFFC0222A7FA926>12 D<000E00001E00007E00 -07FE00FFFE00FFFE00F8FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 -00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 -00FE0000FE0000FE0000FE0000FE0000FE0000FE007FFFFE7FFFFE7FFFFE17277BA622>49 -D<00FF800003FFF0000FFFFC003F03FF007C00FF807C007FC0FE007FC0FF003FE0FF003FE0FF00 -3FE0FF001FE07E001FE03C003FE000003FE000003FC000003FC000007F8000007F800000FF0000 -01FE000001FC000003F0000007E000000FC000001F0000003E0000007C00E0007800E000F000E0 -01E001C0038001C0070001C00FFFFFC01FFFFFC03FFFFFC07FFFFFC0FFFFFF80FFFFFF80FFFFFF -801B277DA622>I<007F800003FFF00007FFFC001F81FE001F00FF003F80FF003F807F803FC07F -803F807F803F807F801F007F800000FF800000FF000000FF000001FE000003F8000007F00000FF -C00000FFF0000001FC000000FF0000007F8000007FC000003FC000003FE000003FE000003FE03C -003FE07E003FE0FF003FE0FF003FE0FF003FC0FF007FC0FE007F807C00FF803F01FF001FFFFC00 -07FFF00000FF80001B277DA622>I<00000E0000001E0000003E0000007E000000FE000000FE00 -0001FE000003FE0000077E00000E7E00000E7E00001C7E0000387E0000707E0000E07E0000E07E -0001C07E0003807E0007007E000E007E000E007E001C007E0038007E0070007E00E0007E00FFFF -FFF8FFFFFFF8FFFFFFF80000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 -00FE00007FFFF8007FFFF8007FFFF81D277EA622>I<0C0003000F803F000FFFFE000FFFFE000F -FFFC000FFFF8000FFFE0000FFFC0000FFE00000E0000000E0000000E0000000E0000000E000000 -0E0000000E7FC0000FFFF8000F80FE000E007F000C003F8000003F8000001FC000001FC000001F -E000001FE018001FE07E001FE0FE001FE0FE001FE0FE001FE0FE001FE0FE001FC078003FC07800 -3F803C007F001F01FE000FFFFC0003FFF00000FF80001B277DA622>I<0007F000003FFC0000FF -FF0001FC0F0007F01F800FE03F800FC03F801FC03F803F803F803F801F007F8000007F0000007F -0000007F000000FF000000FF0FC000FF3FF800FF70FE00FFE03F00FFC03F80FF801FC0FF801FC0 -FF801FC0FF001FE0FF001FE0FF001FE0FF001FE07F001FE07F001FE07F001FE07F001FE03F801F -C03F801FC01F803F800FC03F8007E0FF0003FFFC0000FFF000003FC0001B277DA622>I<380000 -003E0000003FFFFFF03FFFFFF03FFFFFF07FFFFFE07FFFFFC07FFFFFC07FFFFF8070000F007000 -1E0070003C00E0003800E0007800E000F0000001E0000003C0000003C000000780000007800000 -0F0000001F0000001F0000001F0000003F0000003F0000003E0000007E0000007E0000007E0000 -007E000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE00 -00003800001C297CA822>I<000003800000000007C00000000007C0000000000FE0000000000F -E0000000000FE0000000001FF0000000001FF0000000003FF8000000003FF8000000003FF80000 -000073FC0000000073FC00000000F3FE00000000E1FE00000000E1FE00000001C0FF00000001C0 -FF00000003C0FF80000003807F80000007807FC0000007003FC0000007003FC000000E003FE000 -000E001FE000001E001FF000001C000FF000001FFFFFF000003FFFFFF800003FFFFFF800007800 -07FC0000700003FC0000700003FC0000E00001FE0000E00001FE0001E00001FF0001C00000FF00 -01C00000FF00FFFE001FFFFEFFFE001FFFFEFFFE001FFFFE2F297EA834>65 -D<FFFFFFFFE0FFFFFFFFE0FFFFFFFFE003FC001FE003FC0007F003FC0001F003FC0001F003FC00 -00F003FC00007003FC00007003FC00007003FC01C07803FC01C03803FC01C03803FC01C03803FC -03C00003FC03C00003FC0FC00003FFFFC00003FFFFC00003FFFFC00003FC0FC00003FC03C00003 -FC03C00003FC01C00E03FC01C00E03FC01C00E03FC01C01C03FC00001C03FC00001C03FC00001C -03FC00003C03FC00003803FC00007803FC0000F803FC0001F803FC0003F803FC001FF8FFFFFFFF -F0FFFFFFFFF0FFFFFFFFF027297DA82D>69 D<FFFFFFFFC0FFFFFFFFC0FFFFFFFFC003FC003FC0 -03FC000FE003FC0003E003FC0001E003FC0001E003FC0000E003FC0000E003FC0000E003FC0000 -F003FC03807003FC03807003FC03807003FC03800003FC07800003FC07800003FC1F800003FFFF -800003FFFF800003FFFF800003FC1F800003FC07800003FC07800003FC03800003FC03800003FC -03800003FC03800003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003 -FC00000003FC00000003FC000000FFFFFC0000FFFFFC0000FFFFFC000024297DA82B>I<FFFFFC -FFFFFCFFFFFC01FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE00 -01FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE00 -01FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE00FFFFFCFFFFFC -FFFFFC16297EA81A>73 D<FFFFFC0000FFFFFC0000FFFFFC000003FC00000003FC00000003FC00 -000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC -00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003 -FC00000003FC00000003FC00000003FC0001C003FC0001C003FC0001C003FC0001C003FC0003C0 -03FC00038003FC00038003FC00078003FC00078003FC000F8003FC000F8003FC001F8003FC007F -8003FC01FF00FFFFFFFF00FFFFFFFF00FFFFFFFF0022297DA829>76 D<FFFE0000001FFFC0FFFE -0000001FFFC0FFFF0000003FFFC003FF0000003FF00003FF0000003FF00003BF80000077F00003 -BF80000077F000039FC00000E7F000039FC00000E7F000038FE00001C7F000038FE00001C7F000 -0387F0000387F0000387F0000387F0000387F0000387F0000383F8000707F0000383F8000707F0 -000381FC000E07F0000381FC000E07F0000380FE001C07F0000380FE001C07F0000380FF003807 -F00003807F003807F00003807F003807F00003803F807007F00003803F807007F00003801FC0E0 -07F00003801FC0E007F00003800FE1C007F00003800FE1C007F00003800FE1C007F000038007F3 -8007F000038007F38007F000038003FF0007F000038003FF0007F000038001FE0007F000038001 -FE0007F000038000FC0007F000038000FC0007F000FFFE00FC01FFFFC0FFFE007801FFFFC0FFFE -007801FFFFC03A297DA841>I<FFFFFFF800FFFFFFFF00FFFFFFFFC003FC003FE003FC000FF003 -FC0007F803FC0007FC03FC0003FC03FC0003FE03FC0003FE03FC0003FE03FC0003FE03FC0003FE -03FC0003FE03FC0003FE03FC0003FC03FC0007FC03FC0007F803FC000FF003FC003FE003FFFFFF -8003FFFFFE0003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00 -000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC -00000003FC000000FFFFF00000FFFFF00000FFFFF0000027297DA82F>80 -D<007F806003FFF0E00FFFFFE01F807FE03F001FE07E0007E07E0003E07C0003E0FC0001E0FC00 -01E0FC0000E0FE0000E0FE0000E0FF000000FFC000007FFE00007FFFE0003FFFFC003FFFFF001F -FFFF8007FFFFC003FFFFE000FFFFF00007FFF000007FF000000FF8000007F8000003F8E00003F8 -E00001F8E00001F8E00001F8F00001F8F00001F0F80003F0FC0003E0FF0007E0FFE01FC0FFFFFF -00E0FFFE00C01FF0001D297CA826>83 D<7FFFFFFFFFC07FFFFFFFFFC07FFFFFFFFFC07F803FC0 -3FC07E003FC007C078003FC003C078003FC003C070003FC001C0F0003FC001E0F0003FC001E0E0 -003FC000E0E0003FC000E0E0003FC000E0E0003FC000E0E0003FC000E000003FC0000000003FC0 -000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000 -003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0 -000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000 -003FC00000007FFFFFE000007FFFFFE000007FFFFFE0002B287EA730>I<FFFFF0003FFF80FFFF -F0003FFF80FFFFF0003FFF8003FE000001E00001FE000001C00001FF000003C00000FF00000380 -0000FF0000038000007F8000070000007F8000070000007FC0000F0000003FC0000E0000003FE0 -001E0000001FE0001C0000001FF0001C0000000FF000380000000FF0003800000007F800700000 -0007F8007000000007FC00F000000003FC00E000000003FE01E000000001FE01C000000001FF01 -C000000000FF038000000000FF038000000000FF8780000000007F8700000000007FCF00000000 -003FCE00000000003FFE00000000001FFC00000000001FFC00000000000FF800000000000FF800 -000000000FF8000000000007F0000000000007F0000000000003E0000000000003E00000000000 -01C000000031297FA834>86 D<01FF800007FFF0000F81FC001FC0FE001FC07F001FC07F001FC0 -3F800F803F8000003F8000003F8000003F80000FFF8000FFFF8007FC3F801FE03F803F803F807F -803F807F003F80FE003F80FE003F80FE003F80FE007F80FF007F807F00FFC03F83DFFC0FFF0FFC -01FC03FC1E1B7E9A21>97 D<FFE0000000FFE0000000FFE00000000FE00000000FE00000000FE0 -0000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000F -E00000000FE00000000FE1FE00000FE7FF80000FFE07E0000FF803F8000FF001FC000FE000FE00 -0FE000FE000FE0007F000FE0007F000FE0007F800FE0007F800FE0007F800FE0007F800FE0007F -800FE0007F800FE0007F800FE0007F800FE0007F800FE0007F000FE000FF000FE000FE000FF000 -FE000FF001FC000FF803F8000F9E07E0000F0FFF80000E01FC0000212A7EA926>I<001FF80000 -FFFE0003F01F000FE03F801FC03F803F803F803F803F807F801F007F000000FF000000FF000000 -FF000000FF000000FF000000FF000000FF000000FF000000FF0000007F0000007F8000003F8001 -C03FC001C01FC003C00FE0078003F01F0000FFFC00001FE0001A1B7E9A1F>I<00003FF8000000 -3FF80000003FF800000003F800000003F800000003F800000003F800000003F800000003F80000 -0003F800000003F800000003F800000003F800000003F800000003F800001FE3F80000FFFBF800 -03F03FF8000FE00FF8001FC007F8003F8003F8003F8003F8007F8003F8007F0003F800FF0003F8 -00FF0003F800FF0003F800FF0003F800FF0003F800FF0003F800FF0003F800FF0003F800FF0003 -F8007F0003F8007F0003F8003F8003F8003F8007F8001FC00FF8000FE01FF80003F03FFF8000FF -F3FF80003FC3FF80212A7EA926>I<003FE00001FFF80003F07E000FE03F001FC01F803F800FC0 -3F800FC07F000FC07F0007E0FF0007E0FF0007E0FF0007E0FFFFFFE0FFFFFFE0FF000000FF0000 -00FF000000FF0000007F0000007F8000003F8000E03F8001E01FC001C00FE003C003F81F8000FF -FE00001FF0001B1B7E9A20>I<0007F0003FFC00FE3E01FC7F03F87F03F87F07F07F07F03E07F0 -0007F00007F00007F00007F00007F00007F000FFFFC0FFFFC0FFFFC007F00007F00007F00007F0 -0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0 -0007F00007F00007F00007F0007FFF807FFF807FFF80182A7EA915>I<00FF81F003FFE7FC0FC1 -FE7C1F80FC7C3F80FE7C3F007E107F007F007F007F007F007F007F007F007F007F007F007F003F -007E003F80FE001F80FC000FC1F8001FFFE00018FF8000380000003C0000003C0000003E000000 -3FFFF8003FFFFF001FFFFFC00FFFFFE007FFFFF01FFFFFF07E0007F87C0001F8F80001F8F80000 -F8F80000F8F80000F8FC0001F87E0003F03F0007E00FC01F8003FFFE00007FF0001E287E9A22> -I<FFE0000000FFE0000000FFE00000000FE00000000FE00000000FE00000000FE00000000FE000 -00000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE0 -7F00000FE1FFC0000FE787E0000FEE07F0000FFC03F8000FF803F8000FF003F8000FF003F8000F -F003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F800 -0FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8 -00FFFE3FFF80FFFE3FFF80FFFE3FFF80212A7DA926>I<07001FC01FE03FE03FE03FE01FE01FC0 -07000000000000000000000000000000FFE0FFE0FFE00FE00FE00FE00FE00FE00FE00FE00FE00F -E00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2B7DAA14>I<FF -E00000FFE00000FFE000000FE000000FE000000FE000000FE000000FE000000FE000000FE00000 -0FE000000FE000000FE000000FE000000FE000000FE01FFC0FE01FFC0FE01FFC0FE007C00FE00F -800FE01E000FE07C000FE0F8000FE1F0000FE3E0000FE7C0000FEFE0000FFFF0000FFFF0000FFF -F8000FF3FC000FE1FE000FC0FE000FC0FF000FC07F800FC03F800FC03FC00FC01FE00FC00FF0FF -FC3FFEFFFC3FFEFFFC3FFE1F2A7EA924>107 D<FFE0FFE0FFE00FE00FE00FE00FE00FE00FE00F -E00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0 -0FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2A7DA914>I<FFC07F800FF0 -00FFC1FFE03FFC00FFC783F0F07E000FCE03F9C07F000FDC01FB803F000FF801FF003F800FF001 -FE003F800FF001FE003F800FF001FE003F800FE001FC003F800FE001FC003F800FE001FC003F80 -0FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC -003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800F -E001FC003F80FFFE1FFFC3FFF8FFFE1FFFC3FFF8FFFE1FFFC3FFF8351B7D9A3C>I<FFC07F0000 -FFC1FFC000FFC787E0000FCE07F0000FDC03F8000FF803F8000FF003F8000FF003F8000FF003F8 -000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003 -F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F800FFFE -3FFF80FFFE3FFF80FFFE3FFF80211B7D9A26>I<003FE00001FFFC0003F07E000FC01F801F800F -C03F800FE03F0007E07F0007F07F0007F07F0007F0FF0007F8FF0007F8FF0007F8FF0007F8FF00 -07F8FF0007F8FF0007F8FF0007F87F0007F07F0007F03F800FE03F800FE01F800FC00FC01F8007 -F07F0001FFFC00003FE0001D1B7E9A22>I<FFE1FE0000FFE7FF8000FFFE07E0000FF803F8000F -F001FC000FE001FE000FE000FE000FE000FF000FE000FF000FE0007F800FE0007F800FE0007F80 -0FE0007F800FE0007F800FE0007F800FE0007F800FE0007F800FE0007F800FE000FF000FE000FF -000FE000FE000FF001FE000FF003FC000FF803F8000FFE0FE0000FEFFF80000FE1FC00000FE000 -00000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE0 -000000FFFE000000FFFE000000FFFE00000021277E9A26>I<FFC1F0FFC7FCFFCE3E0FDC7F0FD8 -7F0FF87F0FF07F0FF03E0FF0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0 -000FE0000FE0000FE0000FE0000FE0000FE000FFFF00FFFF00FFFF00181B7E9A1C>114 -D<03FE300FFFF03E03F07800F07000F0F00070F00070F80070FC0000FFE000FFFE007FFFC03FFF -E01FFFF007FFF800FFFC0003FC0000FCE0007CE0003CF0003CF0003CF80078FC0078FF01F0F7FF -C0C1FF00161B7E9A1B>I<00700000700000700000700000F00000F00000F00001F00003F00003 -F00007F0001FFFF0FFFFF0FFFFF007F00007F00007F00007F00007F00007F00007F00007F00007 -F00007F00007F00007F00007F00007F03807F03807F03807F03807F03807F03807F03803F87001 -F8F000FFE0001F8015267FA51B>I<FFE03FF800FFE03FF800FFE03FF8000FE003F8000FE003F8 -000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003 -F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE0 -07F8000FE007F8000FE00FF80007E01FF80003F03BFF8001FFF3FF80003FC3FF80211B7D9A26> -I<FFFE03FF80FFFE03FF80FFFE03FF8007F000700007F000700007F800F00003F800E00003FC01 -E00001FC01C00001FC01C00000FE03800000FE038000007F070000007F070000007F8F0000003F -8E0000003FDE0000001FDC0000001FDC0000000FF80000000FF80000000FF800000007F0000000 -07F000000003E000000003E000000001C00000211B7F9A24>I<FFFE7FFC0FFEFFFE7FFC0FFEFF -FE7FFC0FFE0FE007E000E007F003F001C007F003F001C007F807F803C003F807F8038003F807F8 -038001FC0EFC070001FC0EFC070001FE1EFC0F0000FE1C7E0E0000FE1C7E0E0000FF383F1E0000 -7F383F1C00007F783F3C00003FF01FB800003FF01FB800003FF01FF800001FE00FF000001FE00F -F000000FC007E000000FC007E000000FC007E00000078003C00000078003C0002F1B7F9A32>I< -FFFC0FFF00FFFC0FFF00FFFC0FFF0007F003C00003F807800001FC07800000FE0F000000FF1E00 -00007F3C0000003FF80000001FF00000000FF00000000FF000000007F000000007F80000000FFC -0000001FFE0000001EFE0000003C7F000000783F800000F01FC00001E01FE00001C00FE00003C0 -07F000FFF01FFF80FFF01FFF80FFF01FFF80211B7F9A24>I<FFFE03FF80FFFE03FF80FFFE03FF -8007F000700007F000700007F800F00003F800E00003FC01E00001FC01C00001FC01C00000FE03 -800000FE038000007F070000007F070000007F8F0000003F8E0000003FDE0000001FDC0000001F -DC0000000FF80000000FF80000000FF800000007F000000007F000000003E000000003E0000000 -01C000000001C000000003800000000380000038078000007C07000000FE0F000000FE0E000000 -FE1E000000FE3C0000007C780000003FE00000000FC000000021277F9A24>I -E /Fp 13 118 df<0F001F003F803F007E00F800F000C0000A08769C18>19 -D<00038000000380000007C0000007C0000007C000000FE000000FE000001FF000001BF000001B -F0000031F8000031F8000061FC000060FC0000E0FE0000C07E0000C07E0001803F0001FFFF0003 -FFFF8003001F8003001F8006000FC006000FC00E000FE00C0007E0FFC07FFEFFC07FFE1F1C7E9B -24>65 D<07F8201FFEE03C07E07801E07000E0F000E0F00060F00060F80000FE0000FFE0007FFE -003FFF003FFF800FFFC007FFE0007FE00003F00001F00000F0C000F0C000F0C000E0E000E0F001 -C0FC03C0EFFF0083FC00141C7D9B1B>83 D<0FF8001C1E003E0F803E07803E07C01C07C00007C0 -007FC007E7C01F07C03C07C07C07C0F807C0F807C0F807C0780BC03E13F80FE1F815127F9117> -97 D<FF0000FF00001F00001F00001F00001F00001F00001F00001F00001F00001F00001F3F80 -1FE1E01F80701F00781F003C1F003C1F003E1F003E1F003E1F003E1F003E1F003E1F003C1F003C -1F00781F80701EC1E01C3F00171D7F9C1B>I<03FC000E0E001C1F003C1F00781F00780E00F800 -00F80000F80000F80000F80000F800007800007801803C01801C03000E0E0003F80011127E9115 ->I<1E003F003F003F003F001E00000000000000000000000000FF00FF001F001F001F001F001F -001F001F001F001F001F001F001F001F001F00FFE0FFE00B1E7F9D0E>105 -D<FF0FC07E00FF31E18F001F40F207801F80FC07C01F80FC07C01F00F807C01F00F807C01F00F8 -07C01F00F807C01F00F807C01F00F807C01F00F807C01F00F807C01F00F807C01F00F807C01F00 -F807C0FFE7FF3FF8FFE7FF3FF825127F9128>109 D<01FC000F07801C01C03C01E07800F07800 -F0F800F8F800F8F800F8F800F8F800F8F800F87800F07800F03C01E01E03C00F078001FC001512 -7F9118>111 D<FE3E00FE47001E8F801E8F801E8F801F07001F00001F00001F00001F00001F00 -001F00001F00001F00001F00001F0000FFF000FFF00011127F9114>114 -D<1FD830786018E018E018F000FF807FE07FF01FF807FC007CC01CC01CE01CE018F830CFC00E12 -7E9113>I<0300030003000300070007000F000F003FFCFFFC1F001F001F001F001F001F001F00 -1F001F001F0C1F0C1F0C1F0C0F08079803F00E1A7F9913>I<FF07F8FF07F81F00F81F00F81F00 -F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F01F80F01F80786FF01F8 -FF18127F911B>I E /Fq 19 118 df<387C7E7E3E0E1E3C7CF860070B798416>44 -D<FFFF80FFFF80FFFF8011037E8D16>I<70F8F8F8700505788416>I<00F80003FE000FFF001F0F -803E3F803C7F8078FFC071E7C0F1C3C0E3C3C0E381C0E381C0E381C0E381C0E381C0E3C3C0F1C3 -8071E78078FF003C7E003E3C001F03C00FFFC003FF0000FC0012197E9816>64 -D<1FE0007FF8007FFC00783C00301E00000E00000E0003FE001FFE007E0E00F00E00E00E00E00E -00F01E00F83E007FFFE03FE7E00F83E013127E9116>97 D<7E0000FE00007E00000E00000E0000 -0E00000E00000E3E000EFF800FFFC00F83E00F01E00E00F00E00F00E00700E00700E00700E0070 -0E00F00F00E00F01E00F83C00FFFC00EFF00063C001419809816>I<03F80FFE1FFE3C1E780C70 -00F000E000E000E000E000F000700778073E0F1FFE0FFC03F010127D9116>I<003F00007F0000 -3F0000070000070000070000070003C7000FF7003FFF003C1F00780F00F00700F00700E00700E0 -0700E00700E00700F00700F00F00781F007C3F003FFFE01FF7F007C7E014197F9816>I<03E00F -F81FFC3C1E780E7007E007FFFFFFFFFFFFE000E000700778073C0F1FFE0FFC03F010127D9116> -I<001F00007F8000FF8001E78001C30001C00001C0007FFF00FFFF00FFFF0001C00001C00001C0 -0001C00001C00001C00001C00001C00001C00001C00001C00001C0003FFE007FFF003FFE001119 -7F9816>I<7E0000FE00007E00000E00000E00000E00000E00000E3C000EFF000FFF800F87800F -03800F03800E03800E03800E03800E03800E03800E03800E03800E03800E03807FC7F0FFE7F87F -C7F01519809816>104 D<018003C003C0018000000000000000007FC07FC07FC001C001C001C0 -01C001C001C001C001C001C001C001C001C07FFFFFFF7FFF101A7D9916>I<FFC000FFC000FFC0 -0001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0 -0001C00001C00001C00001C00001C00001C000FFFF80FFFF80FFFF8011197E9816>108 -D<03E0000FF8001FFC003C1E00780F00700700E00380E00380E00380E00380E00380F007807007 -00780F003C1E001FFC000FF80003E00011127E9116>111 D<7E3E00FEFF807FFFC00F83E00F01 -E00E00F00E00F00E00700E00700E00700E00700E00F00F00E00F01E00F83C00FFFC00EFF000E3C -000E00000E00000E00000E00000E00000E00007FC000FFE0007FC000141B809116>I<FF0FC0FF -3FE0FF7FE007F04007E00007C00007800007800007000007000007000007000007000007000007 -0000FFFC00FFFC00FFFC0013127F9116>114 D<0FEC3FFC7FFCF03CE01CE01CF0007F801FF007 -FC003EE00EE00EF00EF81EFFFCFFF8C7E00F127D9116>I<030000070000070000070000070000 -7FFF00FFFF00FFFF00070000070000070000070000070000070000070000070100070380070380 -07078007878003FF0003FE0000F80011177F9616>I<7E1F80FE3F807E1F800E03800E03800E03 -800E03800E03800E03800E03800E03800E03800E03800E07800F0F800FFFF007FFF803E3F01512 -809116>I E /Fr 44 127 df<007E0001C1800301800703C00E03C00E01800E00000E00000E00 -000E00000E0000FFFFC00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01 -C00E01C00E01C00E01C00E01C00E01C00E01C07F87F8151D809C17>12 D<FC001C001C001C001C -001C001C001C001C001C001C001C001C001C001C001C001C00FF8009127F910C>16 -D<1C1C3C3870C0800707779C15>19 D<1C001E00078003C001C00380FF000A077B7E12>24 -D<FFE0FFE00B0280890E>45 D<60F0F06004047C830C>I<030007003F00C70007000700070007 -000700070007000700070007000700070007000700070007000700070007000700070007000F80 -FFF80D1C7C9B15>49 D<07C01830201C400C400EF00FF80FF807F8077007000F000E000E001C00 -1C00380070006000C00180030006010C01180110023FFE7FFEFFFE101C7E9B15>I<0006000000 -06000000060000000F0000000F0000000F00000017800000178000001780000023C0000023C000 -0023C0000041E0000041E0000041E0000080F0000080F0000180F8000100780001FFF80003007C -0002003C0002003C0006003E0004001E0004001E000C001F001E001F00FF80FFF01C1D7F9C1F> -65 D<001F808000E0618001801980070007800E0003801C0003801C0001803800018078000080 -7800008070000080F0000000F0000000F0000000F0000000F0000000F0000000F0000000F00000 -00700000807800008078000080380000801C0001001C0001000E000200070004000180080000E0 -3000001FC000191E7E9C1E>67 D<FFFFFC0F003C0F000C0F00040F00040F00060F00020F00020F -02020F02000F02000F02000F06000FFE000F06000F02000F02000F02000F02010F00010F00020F -00020F00020F00060F00060F000C0F003CFFFFFC181C7E9B1C>69 D<FFF00F000F000F000F000F -000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F00 -0F000F00FFF00C1C7F9B0F>73 D<FFF8000F80000F00000F00000F00000F00000F00000F00000F -00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00080F00080F00080F -00180F00180F00100F00300F00700F01F0FFFFF0151C7E9B1A>76 D<003F800000E0E000038038 -0007001C000E000E001C0007003C00078038000380780003C0780003C0700001C0F00001E0F000 -01E0F00001E0F00001E0F00001E0F00001E0F00001E0F00001E0700001C0780003C0780003C038 -0003803C0007801C0007000E000E0007001C000380380000E0E000003F80001B1E7E9C20>79 -D<FFFF800F00E00F00780F003C0F001C0F001E0F001E0F001E0F001E0F001E0F001C0F003C0F00 -780F00E00FFF800F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00 -000F0000FFF000171C7E9B1C>I<FFFF00000F01E0000F0078000F003C000F001C000F001E000F -001E000F001E000F001E000F001C000F003C000F0078000F01E0000FFF00000F03C0000F00E000 -0F00F0000F0078000F0078000F0078000F0078000F0078000F0078000F0078100F0078100F0038 -100F003C20FFF01C20000007C01C1D7E9B1F>82 D<7FFFFFC0700F01C0600F00C0400F0040400F -0040C00F0020800F0020800F0020800F0020000F0000000F0000000F0000000F0000000F000000 -0F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000 -000F0000000F0000001F800003FFFC001B1C7F9B1E>84 D<FFF07FC00F000E000F0004000F0004 -000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F00 -04000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004000700080007 -800800038010000180100000C020000070C000001F00001A1D7E9B1F>I<1FC000307000783800 -781C00301C00001C00001C0001FC000F1C00381C00701C00601C00E01C40E01C40E01C40603C40 -304E801F870012127E9115>97 D<FC00001C00001C00001C00001C00001C00001C00001C00001C -00001C00001C00001C7C001D86001E03001C01801C01C01C00C01C00E01C00E01C00E01C00E01C -00E01C00E01C00C01C01C01C01801E030019060010F800131D7F9C17>I<07E00C301878307870 -306000E000E000E000E000E000E00060007004300418080C3007C00E127E9112>I<003F000007 -0000070000070000070000070000070000070000070000070000070003E7000C1700180F003007 -00700700600700E00700E00700E00700E00700E00700E00700600700700700300700180F000C37 -0007C7E0131D7E9C17>I<03E00C301818300C700E6006E006FFFEE000E000E000E00060007002 -300218040C1803E00F127F9112>I<00F8018C071E061E0E0C0E000E000E000E000E000E00FFE0 -0E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E007FE00F1D809C0D ->I<00038003C4C00C38C01C3880181800381C00381C00381C00381C001818001C38000C300013 -C0001000003000001800001FF8001FFF001FFF803003806001C0C000C0C000C0C000C060018030 -03001C0E0007F800121C7F9215>I<FC00001C00001C00001C00001C00001C00001C00001C0000 -1C00001C00001C00001C7C001C87001D03001E03801C03801C03801C03801C03801C03801C0380 -1C03801C03801C03801C03801C03801C03801C0380FF9FF0141D7F9C17>I<18003C003C001800 -0000000000000000000000000000FC001C001C001C001C001C001C001C001C001C001C001C001C -001C001C001C001C00FF80091D7F9C0C>I<00C001E001E000C000000000000000000000000000 -000FE000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E0 -00E000E060E0F0C0F1C061803E000B25839C0D>I<FC001C001C001C001C001C001C001C001C00 -1C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00FF -80091D7F9C0C>108 D<FC7E07E0001C838838001D019018001E01E01C001C01C01C001C01C01C -001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C0 -1C001C01C01C001C01C01C001C01C01C00FF8FF8FF8021127F9124>I<FC7C001C87001D03001E -03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C -0380FF9FF014127F9117>I<03F0000E1C00180600300300700380600180E001C0E001C0E001C0 -E001C0E001C0E001C06001807003803003001806000E1C0003F00012127F9115>I<FC7C001D86 -001E03001C01801C01C01C00C01C00E01C00E01C00E01C00E01C00E01C00E01C01C01C01C01C01 -801E03001D06001CF8001C00001C00001C00001C00001C00001C00001C0000FF8000131A7F9117 ->I<03C1000C3300180B00300F00700700700700E00700E00700E00700E00700E00700E0070060 -0700700700300F00180F000C370007C70000070000070000070000070000070000070000070000 -3FE0131A7E9116>I<FCE01D301E781E781C301C001C001C001C001C001C001C001C001C001C00 -1C001C00FFC00D127F9110>I<1F9030704030C010C010E010F8007F803FE00FF000F880388018 -C018C018E010D0608FC00D127F9110>I<04000400040004000C000C001C003C00FFE01C001C00 -1C001C001C001C001C001C001C001C101C101C101C101C100C100E2003C00C1A7F9910>I<FC1F -801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03 -801C07800C07800E1B8003E3F014127F9117>I<FF07E03C03801C01001C01000E02000E020007 -040007040007040003880003880003D80001D00001D00000E00000E00000E00000400013127F91 -16>I<FF3FCFE03C0F03801C0701801C0701001C0B01000E0B82000E0B82000E1182000711C400 -0711C4000720C40003A0E80003A0E80003C0680001C0700001C0700001803000008020001B127F -911E>I<7F8FF00F03800F030007020003840001C80001D80000F00000700000780000F800009C -00010E00020E000607000403801E07C0FF0FF81512809116>I<FF07E03C03801C01001C01000E -02000E020007040007040007040003880003880003D80001D00001D00000E00000E00000E00000 -4000004000008000008000F08000F10000F300006600003C0000131A7F9116>I<FFFFFFFFFF80 -2901808B2A>124 D<1C043F0843F080E00E047D9B15>126 D E /Fs 7 115 -df<003FC000FFF003C0F00780300F00001E00003C00003C0000780000780000780000F00000F0 -0000F00000F00000F00000F00000F00000F00000F000007800007800007800003C00003C00001E -00000F000807801803C07800FFF0003F80151F7D9D1B>67 D<003F8001FFF003C0F80780380F00 -181E00003C00003C0000780000780000780000F00000F00000F00000F00000F00000F00000F007 -F8F007F8F000387800387800387800383C00383C00381E00380F003807803803C0F801FFF0003F -80151F7D9D1C>71 D<FFFFFF80FFFFFF80001E0000001E0000001E0000001E0000001E0000001E -0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E000000 -1E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E0000 -001E0000001E0000191D7F9C1C>84 D<0FC03FF07FF87038401C001C001C00FC0FFC3FFC781CE0 -1CE01CE01CF07C7FFC7FDC3F1C0E127E9114>97 D<07C01FE03FF078787018601CFFFCFFFCFFFC -E000E000E000700070043C1C3FFC1FF807E00E127E9112>101 D<00FC01FC03FC07000E000E00 -0E000E000E000E000E00FFE0FFE00E000E000E000E000E000E000E000E000E000E000E000E000E -000E000E000E000E1D809C0D>I<E380E780EF80FC00F800F000F000E000E000E000E000E000E0 -00E000E000E000E000E00009127D910E>114 D E /Ft 31 123 df<70F8FCFC74040404040808 -10102040060F7C840E>44 D<008003800F80F38003800380038003800380038003800380038003 -800380038003800380038003800380038003800380038003800380038003800380038007C0FFFE -0F217CA018>49 D<1000801E07001FFF001FFE001FF80013E00010000010000010000010000010 -000010000010F800130E001407001803801003800001C00001C00001E00001E00001E00001E070 -01E0F001E0F001E0E001C08001C04003C04003802007001006000C1C0003F00013227EA018>53 -D<01F800060E000803001001802001802000C06000C06000C06000C07000C07801803E01003F02 -001FC4000FF80003F80003FC00067F00083F80100F803007C06001C06000E0C000E0C00060C000 -60C00060C000606000406000C03000801803000E0E0003F00013227EA018>56 -D<01F000060C000C0600180700380380700380700380F001C0F001C0F001C0F001E0F001E0F001 -E0F001E0F001E07001E07003E03803E01805E00C05E00619E003E1E00001C00001C00001C00003 -80000380300300780700780600700C002018001030000FC00013227EA018>I<0007E010003818 -3000E0063001C00170038000F0070000F00E0000701E0000701C0000303C0000303C0000307C00 -00107800001078000010F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8 -00000078000000780000107C0000103C0000103C0000101C0000201E0000200E00004007000040 -0380008001C0010000E0020000381C000007E0001C247DA223>67 D<FFFFFFC00F8007C0078001 -C0078000C007800040078000400780006007800020078000200780002007802020078020000780 -200007802000078060000780E00007FFE0000780E0000780600007802000078020000780200007 -802000078000000780000007800000078000000780000007800000078000000780000007800000 -0FC00000FFFE00001B227EA120>70 D<FFFC3FFF0FC003F0078001E0078001E0078001E0078001 -E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E00780 -01E007FFFFE0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E007 -8001E0078001E0078001E0078001E0078001E0078001E0078001E00FC003F0FFFC3FFF20227EA1 -25>72 D<FFFC0FC007800780078007800780078007800780078007800780078007800780078007 -80078007800780078007800780078007800780078007800780078007800FC0FFFC0E227EA112> -I<FFFE00000FC00000078000000780000007800000078000000780000007800000078000000780 -000007800000078000000780000007800000078000000780000007800000078000000780000007 -800000078000000780000007800080078000800780008007800080078001800780018007800100 -078003000780030007800F000F803F00FFFFFF0019227EA11E>76 D<FFFFE000000F803C000007 -800E00000780078000078007C000078003C000078003E000078003E000078003E000078003E000 -078003E000078003C000078007C000078007800007800E000007803C000007FFE0000007807000 -00078038000007801C000007801E000007800E000007800F000007800F000007800F000007800F -000007800F800007800F800007800F800007800F808007800FC080078007C0800FC003C100FFFC -01E2000000007C0021237EA124>82 D<FFF03FFC03FE1F8007E000F80F0003C000700F0003C000 -200F0003C00020078001E00040078001E00040078001E0004003C002F0008003C002F0008003C0 -02F0008001E00478010001E00478010001E00478010000F0083C020000F0083C020000F0083C02 -0000F8183E06000078101E04000078101E0400007C101E0400003C200F0800003C200F0800003C -200F0800001E40079000001E40079000001E40079000000F8003E000000F8003E000000F8003E0 -0000070001C00000070001C00000070001C0000003000180000002000080002F237FA132>87 -D<0FE0001838003C0C003C0E0018070000070000070000070000FF0007C7001E07003C07007807 -00700700F00708F00708F00708F00F087817083C23900FC1E015157E9418>97 -D<0E0000FE00001E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00 -000E00000E1F000E61C00E80600F00300E00380E003C0E001C0E001E0E001E0E001E0E001E0E00 -1E0E001E0E001E0E001C0E003C0E00380F00700C80600C41C0083F0017237FA21B>I<01FE0007 -03000C07801C0780380300780000700000F00000F00000F00000F00000F00000F00000F0000070 -00007800403800401C00800C010007060001F80012157E9416>I<0000E0000FE00001E00000E0 -0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E001F8E00704E00C02E0 -1C01E03800E07800E07000E0F000E0F000E0F000E0F000E0F000E0F000E0F000E07000E07800E0 -3800E01801E00C02E0070CF001F0FE17237EA21B>I<01FC000707000C03801C01C03801C07801 -E07000E0F000E0FFFFE0F00000F00000F00000F00000F000007000007800203800201C00400E00 -8007030000FC0013157F9416>I<00007001F198071E180E0E181C07001C07003C07803C07803C -07803C07801C07001C07000E0E000F1C0019F0001000001000001800001800001FFE000FFFC00F -FFE03800F0600030400018C00018C00018C000186000306000303800E00E038003FE0015217F95 -18>103 D<0E0000FE00001E00000E00000E00000E00000E00000E00000E00000E00000E00000E -00000E00000E00000E1F800E60C00E80E00F00700F00700E00700E00700E00700E00700E00700E -00700E00700E00700E00700E00700E00700E00700E00700E00700E0070FFE7FF18237FA21B>I< -1C001E003E001E001C00000000000000000000000000000000000E00FE001E000E000E000E000E -000E000E000E000E000E000E000E000E000E000E000E000E000E00FFC00A227FA10E>I<0E00FE -001E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00 -0E000E000E000E000E000E000E000E000E000E000E000E000E00FFE00B237FA20E>108 -D<0E1FC07F00FE60E183801E807201C00F003C00E00F003C00E00E003800E00E003800E00E0038 -00E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E00 -3800E00E003800E00E003800E00E003800E00E003800E0FFE3FF8FFE27157F942A>I<0E1F80FE -60C01E80E00F00700F00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E -00700E00700E00700E00700E00700E0070FFE7FF18157F941B>I<01FC000707000C01801800C0 -3800E0700070700070F00078F00078F00078F00078F00078F00078F000787000707800F03800E0 -1C01C00E038007070001FC0015157F9418>I<01F8200704600E02601C01603801E07800E07800 -E0F000E0F000E0F000E0F000E0F000E0F000E0F000E07000E07800E03801E01C01E00C02E0070C -E001F0E00000E00000E00000E00000E00000E00000E00000E00000E00000E0000FFE171F7E941A ->113 D<0E3CFE461E8F0F0F0F060F000E000E000E000E000E000E000E000E000E000E000E000E -000E000F00FFF010157F9413>I<0F8830786018C018C008C008E008F0007F803FE00FF001F800 -3C801C800C800CC00CC008E018D0308FC00E157E9413>I<02000200020002000600060006000E -001E003E00FFF80E000E000E000E000E000E000E000E000E000E000E000E040E040E040E040E04 -0E040708030801F00E1F7F9E13>I<0E0070FE07F01E00F00E00700E00700E00700E00700E0070 -0E00700E00700E00700E00700E00700E00700E00700E00700E00F00E00F006017003827800FC7F -18157F941B>I<FFC1FE1E00780E00300E00200E002007004007004003808003808003808001C1 -0001C10000E20000E20000E2000074000074000038000038000038000010000010000020000020 -00002000004000F04000F08000F180004300003C0000171F7F941A>121 -D<3FFFC0380380300780200700600E00401C00403C0040380000700000E00001E00001C0000380 -400700400F00400E00C01C0080380080780180700780FFFF8012157F9416>I -E /Fu 21 118 df<78FCFCFCFC7806067A8512>46 D<00080000380000780001F8003FF800FE78 -00C078000078000078000078000078000078000078000078000078000078000078000078000078 -000078000078000078000078000078000078000078000078000078000078000078000078000078 -0000780000780000780000780000780000780000780000780000780000780000780000780000FC -007FFFF87FFFF8152F7AAE21>49 D<007F800001FFF0000701F8000C007E0018003F0010001F00 -20000F8040000FC0400007C0400007E0B00007E0F80003E0FC0003E0FC0003E0FC0003E0780007 -E0000007E0000007C0000007C000000F8000000F8000001F0000001F0000003E0000003C000000 -78000000F0000000E0000001C0000003800000070000000E0000001C0000001800000030000000 -60000000C000200180002003000020060000400C00004008000040100000C03FFFFFC07FFFFF80 -FFFFFF80FFFFFF801B2F7DAE21>I<FFFFC00000FFFFC0000007F000000003E000000003E00000 -0003E000000003E000000003E000000003E000000003E000000003E000000003E000000003E000 -000003E000000003E000000003E000000003E000000003E000000003E000000003E000000003E0 -00000003E000000003E000000003E000000003E000000003E000000003E000000003E000000003 -E000000003E000000003E000000003E000004003E000004003E000004003E000004003E0000080 -03E000008003E000008003E000008003E000018003E000018003E000038003E000038003E00007 -8003E0000F0003E0003F0007E000FF00FFFFFFFF00FFFFFFFF0022317CB029>76 -D<FFF00000007FF8FFF00000007FF807F00000007F0002F8000000BE0002F8000000BE0002F800 -0000BE00027C0000013E00027C0000013E00023E0000023E00023E0000023E00023E0000023E00 -021F0000043E00021F0000043E00021F0000043E00020F8000083E00020F8000083E00020F8000 -083E000207C000103E000207C000103E000207C000103E000203E000203E000203E000203E0002 -01F000403E000201F000403E000201F000403E000200F800803E000200F800803E000200F80080 -3E0002007C01003E0002007C01003E0002007C01003E0002003E02003E0002003E02003E000200 -3E02003E0002001F04003E0002001F04003E0002000F88003E0002000F88003E0002000F88003E -00020007D0003E00020007D0003E00020007D0003E00020003E0003E00020003E0003E00020003 -E0003E00070001C0003E000F8001C0007F00FFF801C00FFFF8FFF800800FFFF835317CB03D>I< -FFFFFFC000FFFFFFF80007E000FE0003E0001F0003E0000F8003E00007C003E00003E003E00003 -F003E00001F003E00001F003E00001F803E00001F803E00001F803E00001F803E00001F803E000 -01F803E00001F003E00001F003E00003E003E00003E003E00007C003E0000F8003E0001F0003E0 -00FC0003FFFFF00003E000000003E000000003E000000003E000000003E000000003E000000003 -E000000003E000000003E000000003E000000003E000000003E000000003E000000003E0000000 -03E000000003E000000003E000000003E000000003E000000003E000000003E000000007F00000 -00FFFF800000FFFF80000025317CB02D>80 D<FFFFFF000000FFFFFFF0000007E001FC000003E0 -003E000003E0001F800003E00007C00003E00007E00003E00003E00003E00003F00003E00001F0 -0003E00001F80003E00001F80003E00001F80003E00001F80003E00001F80003E00001F80003E0 -0001F00003E00003F00003E00003E00003E00007C00003E0000F800003E0001F000003E0003C00 -0003E001F0000003FFFF00000003E003E0000003E00078000003E0003C000003E0001E000003E0 -000F000003E0000F800003E00007800003E00007C00003E00007C00003E00007C00003E00007C0 -0003E00007C00003E00007E00003E00007E00003E00007E00003E00007E00003E00007E00003E0 -0007E00803E00007F00803E00003F00803E00003F00807F00001F010FFFF8000F810FFFF80007C -60000000000F802D327CB031>82 D<00FE00000303C0000C00E00010007000100038003C003C00 -3E001C003E001E003E001E0008001E0000001E0000001E0000001E00000FFE0000FC1E0003E01E -000F801E001F001E003E001E003C001E007C001E00F8001E04F8001E04F8001E04F8003E04F800 -3E0478003E047C005E043E008F080F0307F003FC03E01E1F7D9E21>97 D<003F8000E060038018 -0700040F00041E001E1C003E3C003E7C003E7C0008780000F80000F80000F80000F80000F80000 -F80000F80000F80000F800007800007C00007C00003C00011E00011E00020F0002070004038018 -00E060003F80181F7D9E1D>99 D<003F800000E0E0000380380007003C000E001E001E001E001C -000F003C000F007C000F0078000F8078000780F8000780F8000780FFFFFF80F8000000F8000000 -F8000000F8000000F8000000F8000000780000007C0000003C0000003C0000801E0000800E0001 -000F0002000780020001C00C0000F03000001FC000191F7E9E1D>101 D<0007E0001C10003838 -00707C00E07C01E07C01C03803C00003C00003C00003C00003C00003C00003C00003C00003C000 -03C00003C00003C000FFFFC0FFFFC003C00003C00003C00003C00003C00003C00003C00003C000 -03C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C000 -03C00003C00003C00003C00003C00007E0007FFF007FFF0016327FB114>I<000000F0007F0308 -01C1C41C0380E81C070070080F0078001E003C001E003C003E003E003E003E003E003E003E003E -003E003E003E003E001E003C001E003C000F007800070070000780E00009C1C000087F00001800 -0000180000001800000018000000180000001C0000000E0000000FFFF80007FFFF0003FFFF800E -000FC0180001E0300000F070000070E0000038E0000038E0000038E0000038E000003870000070 -70000070380000E01C0001C00700070001C01C00003FE0001E2F7E9F21>I<01800000003F8000 -0000FF80000000FF800000000F8000000007800000000780000000078000000007800000000780 -000000078000000007800000000780000000078000000007800000000780000000078000000007 -8000000007800000000780FE00000783078000078C03C000079001E00007A001E00007A000F000 -07C000F00007C000F000078000F000078000F000078000F000078000F000078000F000078000F0 -00078000F000078000F000078000F000078000F000078000F000078000F000078000F000078000 -F000078000F000078000F000078000F000078000F000078000F000078000F0000FC001F800FFFC -1FFF80FFFC1FFF8021327EB125>I<07000F801F801F800F800700000000000000000000000000 -0000000000000000000001801F80FF80FF800F8007800780078007800780078007800780078007 -8007800780078007800780078007800780078007800780078007800FC0FFF8FFF80D307EAF12> -I<01803F80FF80FF800F8007800780078007800780078007800780078007800780078007800780 -078007800780078007800780078007800780078007800780078007800780078007800780078007 -80078007800780078007800780078007800FC0FFFCFFFC0E327EB112>108 -D<0180FE001FC0003F83078060F000FF8C03C1807800FF9001E2003C000FA001E4003C0007A000 -F4001E0007C000F8001E0007C000F8001E00078000F0001E00078000F0001E00078000F0001E00 -078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0 -001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E0007 -8000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F000 -1E000FC001F8003F00FFFC1FFF83FFF0FFFC1FFF83FFF0341F7E9E38>I<0180FE00003F830780 -00FF8C03C000FF9001E0000FA001E00007A000F00007C000F00007C000F000078000F000078000 -F000078000F000078000F000078000F000078000F000078000F000078000F000078000F0000780 -00F000078000F000078000F000078000F000078000F000078000F000078000F000078000F00007 -8000F000078000F000078000F0000FC001F800FFFC1FFF80FFFC1FFF80211F7E9E25>I<001FC0 -0000F0780001C01C00070007000F0007801E0003C01C0001C03C0001E03C0001E0780000F07800 -00F0780000F0F80000F8F80000F8F80000F8F80000F8F80000F8F80000F8F80000F8F80000F878 -0000F07C0001F03C0001E03C0001E01E0003C01E0003C00F00078007800F0001C01C0000F07800 -001FC0001D1F7E9E21>I<0183E03F8C18FF907CFF907C0FA07C07C03807C00007C00007C00007 -800007800007800007800007800007800007800007800007800007800007800007800007800007 -80000780000780000780000780000780000FC000FFFE00FFFE00161F7E9E19>114 -D<00400000400000400000400000400000C00000C00000C00001C00001C00003C00007C0000FC0 -001FFFE0FFFFE003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C0 -0003C00003C00003C00003C00003C00003C01003C01003C01003C01003C01003C01003C01003C0 -1001C02001E02000E0400078C0001F00142C7FAB19>116 D<01800030003F8007F000FF801FF0 -00FF801FF0000F8001F000078000F000078000F000078000F000078000F000078000F000078000 -F000078000F000078000F000078000F000078000F000078000F000078000F000078000F0000780 -00F000078000F000078000F000078000F000078000F000078001F000078001F000078001F00003 -8002F00003C004F00001C008F800007030FF80001FC0FF80211F7E9E25>I -E end +TeXDict begin 40258431 52099146 1000 300 300 +(/home/lhf/w/doc/lua/html/save/manual.dvi) @start /Fa +7 121 df<07F8001FFE003FFF803E07C03E03C01C01E00001E0003FE003FFE00FFFE03F +C1E07C01E07801E0F001E0F001E0F001E07803E07C07E03FFFFE1FFEFE03F87E17157E94 +1A>97 D<01F80007FF000FFF801F07C03C03C07801E07801E0F000F0F000F0FFFFF0FFFF +F0FFFFF0F000007000007800007C00F03E00F01F03F00FFFE003FFC000FE0014157D941A +>101 D<7F0F8000FF7FE0007FFFF0000FF0F0000FC078000F8078000F0078000F007800 +0F0078000F0078000F0078000F0078000F0078000F0078000F0078000F0078000F007800 +0F0078007FE1FF00FFF3FF807FE1FF00191580941A>110 D<7FC1F8FFC7FC7FDFFE03FE +1E03F80C03F00003E00003E00003C00003C00003C00003C00003C00003C00003C00003C0 +0003C00003C0007FFF80FFFF807FFF8017157F941A>114 D<01C00003C00003C00003C0 +0003C00003C00003C0007FFFE0FFFFE0FFFFE003C00003C00003C00003C00003C00003C0 +0003C00003C00003C00003C00003C0F003C0F003C0F003C0F001E1E001FFE000FF80003F +00141C7F9B1A>116 D<7FC7FCFFC7FE7FC7FC0F01E00F01E00F01E00F83E00783C00783 +C00783C003C78003C78003C78001C70001EF0001EF0001EF0000FE0000FE0000FE00007C +0017157F941A>118 D<7FC7F87FCFFC7FC7F80787C007C78003EF8001FF0000FE0000FC +00007C00007C00007C0000FE0001EF0003EF0003C7800783C00F83E07FC7FCFFC7FE7FC7 +FC17157F941A>120 D E /Fb 1 122 df<1C0C2E1C4E1C8E389C381C381C383870387038 +70387018E00FE000E000C0E1C0E38047003C000E137F8C11>121 +D E /Fc 2 121 df<70F8F8F87005057C840D>58 D<07C3C00FE7E0187C603078F06079 +F06079F0C0F1E000F1C000F00000F00001E00001E00039E00079E030FBC060FBC060F3C0 +C0E7E3807CFF00383C0014147E931A>120 D E /Fd 47 121 df<0007F800007FFE0001 +FC0F0003F01F0007E03F800FC03F800FC03F800FC03F800FC01F000FC004000FC000000F +C000000FC00000FFFFFF80FFFFFF80FFFFFF800FC01F800FC01F800FC01F800FC01F800F +C01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800F +C01F800FC01F800FC01F807FF8FFF07FF8FFF07FF8FFF01C237FA21F>12 +D<3C7EFFFFFFFF7E3C08087C8710>46 D<0000180000380000380000700000700000E000 +00E00000E00001C00001C0000380000380000380000700000700000700000E00000E0000 +1C00001C00001C0000380000380000700000700000700000E00000E00001C00001C00001 +C0000380000380000700000700000700000E00000E00000E00001C00001C000038000038 +0000380000700000700000E00000E00000C0000015317DA41C>I<00180000780003F800 +FFF800FFF800FDF80001F80001F80001F80001F80001F80001F80001F80001F80001F800 +01F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F800 +01F80001F8007FFFE07FFFE07FFFE013207C9F1C>49 D<03FC000FFF003FFFC0783FE07C +0FF0FE07F0FE03F8FE03F8FE03F87C03F83803F80003F80003F00007F00007E0000FC000 +1F80001F00003C0000780000F00001E03803C0380700380600380C00781FFFF03FFFF07F +FFF0FFFFF0FFFFF0FFFFF015207D9F1C>I<01FE0007FF800FFFE01E07F03F03F03F03F8 +3F83F83F03F81F03F80C03F80003F00007E00007C0001F8001FE0001FF000007E00003F0 +0001F80001FC0001FE0001FE7C01FE7C01FEFE01FEFE01FCFE01FC7C03F87C07F03FFFE0 +0FFFC003FE0017207E9F1C>I<0000E00001E00003E00007E0000FE0000FE0001FE0003F +E00077E000E7E000E7E001C7E00387E00707E00E07E00E07E01C07E03807E07007E0E007 +E0FFFFFFFFFFFFFFFFFF0007E00007E00007E00007E00007E00007E000FFFF00FFFF00FF +FF18207E9F1C>I<2000603C01E03FFFC03FFFC03FFF803FFE003FFC003FF00038000038 +000038000038000039FC003FFF003E0FC03807E03003F00003F00003F00003F80003F838 +03F87C03F8FC03F8FC03F8FC03F0F803F07007E03C0FC03FFF800FFF0003F80015207D9F +1C>I<001F8000FFE003FFF007F0F00FC1F81F81F83F01F83F01F87E00F07E00007E0000 +FE0800FE7FC0FEFFE0FF81F0FF00F8FF00FCFF00FCFE00FEFE00FEFE00FEFE00FE7E00FE +7E00FE7E00FE3E00FC3E00FC1F00F80F83F007FFE003FFC000FF0017207E9F1C>I<7000 +007C00007FFFFE7FFFFE7FFFFE7FFFFC7FFFF87FFFF0F00070E000E0E001C0E00380E007 +00000E00000E00001C00003C0000380000780000780000F80000F00001F00001F00001F0 +0001F00003F00003F00003F00003F00003F00003F00003F00001E00017227DA11C>I<00 +FE0003FFC007FFE00F83F01E01F01E00F83E00F83E00F83F00F83F80F83FE1F01FF9E01F +FFC00FFF8007FFC003FFE00FFFF01F7FF83E1FFC7C07FC7C01FEF800FEF8007EF8003EF8 +003EF8003E7C003C7E00783F01F81FFFF00FFFC001FF0017207E9F1C>I<000070000000 +00F800000000F800000000F800000001FC00000001FC00000003FE00000003FE00000003 +FE000000077F000000077F0000000F7F8000000E3F8000000E3F8000001C1FC000001C1F +C000003C1FE00000380FE00000380FE00000700FF000007007F00000F007F80000FFFFF8 +0000FFFFF80001FFFFFC0001C001FC0001C001FC00038000FE00038000FE00078000FF00 +0700007F00FFF007FFF8FFF007FFF8FFF007FFF825227EA12A>65 +D<0003FE0180001FFF838000FFFFE78001FF00FF8003F8003F8007F0001F800FE0000F80 +1FC0000F803F800007803F800007807F800003807F000003807F00000380FF00000000FF +00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF000000007F00 +0000007F000003807F800003803F800003803F800007801FC00007000FE0000F0007F000 +1E0003F8003C0001FF00F80000FFFFF000001FFFC0000003FE000021227DA128>67 +D<FFFFFF8000FFFFFFF000FFFFFFFC0007F003FE0007F0007F0007F0003F8007F0001FC0 +07F0000FE007F0000FE007F0000FF007F00007F007F00007F007F00007F007F00007F807 +F00007F807F00007F807F00007F807F00007F807F00007F807F00007F807F00007F807F0 +0007F807F00007F007F00007F007F00007F007F0000FE007F0000FE007F0001FC007F000 +3F8007F0007F0007F003FE00FFFFFFFC00FFFFFFF000FFFFFF800025227EA12B>I<FFFF +FFFCFFFFFFFCFFFFFFFC07F001FC07F0007C07F0003C07F0001C07F0001E07F0001E07F0 +1C0E07F01C0E07F01C0E07F01C0E07F03C0007F07C0007FFFC0007FFFC0007FFFC0007F0 +7C0007F03C0007F01C0707F01C0707F01C0707F01C0E07F0000E07F0000E07F0001E07F0 +001E07F0003E07F0007E07F001FCFFFFFFFCFFFFFFFCFFFFFFFC20227EA125>I<FFFFFF +F8FFFFFFF8FFFFFFF807F003F807F000F807F0007807F0003807F0003C07F0003C07F01C +1C07F01C1C07F01C1C07F01C1C07F03C0007F07C0007FFFC0007FFFC0007FFFC0007F07C +0007F03C0007F01C0007F01C0007F01C0007F01C0007F0000007F0000007F0000007F000 +0007F0000007F0000007F00000FFFFC000FFFFC000FFFFC0001E227EA123>I<FFFF83FF +FEFFFF83FFFEFFFF83FFFE07F0001FC007F0001FC007F0001FC007F0001FC007F0001FC0 +07F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007 +FFFFFFC007FFFFFFC007FFFFFFC007F0001FC007F0001FC007F0001FC007F0001FC007F0 +001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F000 +1FC007F0001FC0FFFF83FFFEFFFF83FFFEFFFF83FFFE27227EA12C>72 +D<FFFF80FFFF80FFFF8007F00007F00007F00007F00007F00007F00007F00007F00007F0 +0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0 +0007F00007F00007F00007F00007F00007F00007F000FFFF80FFFF80FFFF8011227EA115 +>I<FFFFC000FFFFC000FFFFC00007F0000007F0000007F0000007F0000007F0000007F0 +000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0 +000007F0000007F0000007F0003807F0003807F0003807F0003807F0007807F0007807F0 +007807F000F007F001F007F003F007F00FF0FFFFFFF0FFFFFFF0FFFFFFF01D227EA122> +76 D<FFF800001FFFFFF800001FFFFFFC00003FFF07FC00003FE007FC00003FE0077E00 +0077E0077E000077E0073F0000E7E0073F0000E7E0071F8001C7E0071F8001C7E0071F80 +01C7E0070FC00387E0070FC00387E00707E00707E00707E00707E00703F00E07E00703F0 +0E07E00703F00E07E00701F81C07E00701F81C07E00700FC3807E00700FC3807E007007E +7007E007007E7007E007007E7007E007003FE007E007003FE007E007001FC007E007001F +C007E007000F8007E0FFF80F80FFFFFFF80F80FFFFFFF80700FFFF30227EA135>I<0007 +FC0000003FFF800000FE0FE00003F803F80007E000FC000FC0007E001FC0007F001F8000 +3F003F80003F803F80003F807F00001FC07F00001FC07F00001FC0FF00001FE0FF00001F +E0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0FF00001FE0 +7F00001FC07F80003FC07F80003FC03F80003F803FC0007F801FC0007F000FE000FE0007 +F001FC0003F803F80000FE0FE000003FFF80000007FC000023227DA12A>79 +D<FFFFFF00FFFFFFE0FFFFFFF007F007F807F001FC07F001FE07F000FE07F000FF07F000 +FF07F000FF07F000FF07F000FF07F000FF07F000FE07F001FE07F001FC07F007F807FFFF +F007FFFFC007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F000 +0007F0000007F0000007F0000007F00000FFFF8000FFFF8000FFFF800020227EA126>I< +01FE0607FF8E1FFFFE3F01FE7C007E78003E78001EF8001EF8000EF8000EFC0000FF0000 +FFE0007FFF007FFFC03FFFF01FFFF80FFFFC03FFFE003FFE0003FE00007F00003F00001F +E0001FE0001FE0001FF0001EF0003EFC003CFF00FCFFFFF8E7FFE0C0FF8018227DA11F> +83 D<7FFFFFFF807FFFFFFF807FFFFFFF807E03F81F807C03F807807803F807807003F8 +0380F003F803C0F003F803C0E003F801C0E003F801C0E003F801C0E003F801C00003F800 +000003F800000003F800000003F800000003F800000003F800000003F800000003F80000 +0003F800000003F800000003F800000003F800000003F800000003F800000003F8000000 +03F800000003F800000003F8000001FFFFF00001FFFFF00001FFFFF00022227EA127>I< +FFFF001FFEFFFF001FFEFFFF001FFE07F00001C007F80003C003F800038003FC00078001 +FC00070001FC00070000FE000E0000FE000E0000FF001E00007F001C00007F803C00003F +803800003F803800001FC07000001FC07000001FE0F000000FE0E000000FF0E0000007F1 +C0000007F1C0000007FBC0000003FB80000003FF80000001FF00000001FF00000000FE00 +000000FE00000000FE000000007C000000007C0000000038000027227FA12A>86 +D<0FFE003FFF807E07E07E03F07E01F07E01F83C01F80001F80001F800FFF807FFF81FE1 +F83F01F87E01F8FC01F8FC01F8FC01F8FC01F87E03F87E0EFF1FFCFF07F03F18167E951B +>97 D<FF800000FF800000FF8000001F8000001F8000001F8000001F8000001F8000001F +8000001F8000001F8000001F8000001F8000001F8FE0001FFFF8001FF07C001FC03E001F +801F001F800F801F800F801F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F +800FC01F800FC01F800F801F801F801F801F001FC03E001FE07C001E7FF8001C0FC0001A +237EA21F>I<00FF8007FFE00F83F01F03F03E03F07E03F07C01E07C0000FC0000FC0000 +FC0000FC0000FC0000FC00007C00007E00007E00003E00381F00700FC0F007FFC000FF00 +15167E9519>I<0001FF000001FF000001FF0000003F0000003F0000003F0000003F0000 +003F0000003F0000003F0000003F0000003F0000003F0001FE3F0007FFBF000F81FF001F +007F003E003F007E003F007C003F00FC003F00FC003F00FC003F00FC003F00FC003F00FC +003F00FC003F00FC003F007C003F007C003F003E003F001F00FF000F83FFE007FFBFE001 +FC3FE01B237EA21F>I<00FE0007FF800F87C01E01E03E01F07C00F07C00F8FC00F8FC00 +F8FFFFF8FFFFF8FC0000FC0000FC00007C00007C00007E00003E00381F00700FC0F003FF +C000FF0015167E951A>I<01FE1F0007FFFF800F87E7801F03E7801E01E7003E01F0003E +01F0003E01F0003E01F0003E01F0001E01E0001F03E0000F87C0000FFF800019FE000018 +0000001C0000001C0000001FFFE0001FFFF8000FFFFE000FFFFF003FFFFF007C003F80F8 +001F80F8000F80F8000F80F8000F807C001F007E003F001F80FC000FFFF80001FFC00019 +217F951C>103 D<FF800000FF800000FF8000001F8000001F8000001F8000001F800000 +1F8000001F8000001F8000001F8000001F8000001F8000001F87E0001F9FF8001FB8FC00 +1FE07C001FC07E001FC07E001F807E001F807E001F807E001F807E001F807E001F807E00 +1F807E001F807E001F807E001F807E001F807E001F807E001F807E00FFF1FFC0FFF1FFC0 +FFF1FFC01A237EA21F>I<1E003F007F807F807F807F803F001E00000000000000000000 +000000FF80FF80FF801F801F801F801F801F801F801F801F801F801F801F801F801F801F +801F801F80FFF0FFF0FFF00C247FA30F>I<003C007E00FF00FF00FF00FF007E003C0000 +0000000000000000000003FF03FF03FF003F003F003F003F003F003F003F003F003F003F +003F003F003F003F003F003F003F003F003F003F003F003F783FFC3FFC3EFC7E78FC7FF0 +1FC0102E83A311>I<FF800000FF800000FF8000001F8000001F8000001F8000001F8000 +001F8000001F8000001F8000001F8000001F8000001F8000001F83FF801F83FF801F83FF +801F80F0001F83E0001F8780001F8F00001F9E00001FBE00001FFE00001FFF00001FFF80 +001FCFC0001F8FC0001F87E0001F83F0001F83F0001F81F8001F80FC00FFF1FFC0FFF1FF +C0FFF1FFC01A237EA21E>I<FF80FF80FF801F801F801F801F801F801F801F801F801F80 +1F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F80 +1F801F80FFF0FFF0FFF00C237FA20F>I<FF87F00FE000FF9FFC3FF800FFB87E70FC001F +E03EC07C001FC03F807E001FC03F807E001F803F007E001F803F007E001F803F007E001F +803F007E001F803F007E001F803F007E001F803F007E001F803F007E001F803F007E001F +803F007E001F803F007E001F803F007E001F803F007E00FFF1FFE3FFC0FFF1FFE3FFC0FF +F1FFE3FFC02A167E952F>I<FF87E000FF9FF800FFB8FC001FE07C001FC07E001FC07E00 +1F807E001F807E001F807E001F807E001F807E001F807E001F807E001F807E001F807E00 +1F807E001F807E001F807E001F807E00FFF1FFC0FFF1FFC0FFF1FFC01A167E951F>I<00 +FE0007FFC00F83E01E00F03E00F87C007C7C007C7C007CFC007EFC007EFC007EFC007EFC +007EFC007EFC007E7C007C7C007C3E00F81F01F00F83E007FFC000FE0017167E951C>I< +FF8FE000FFFFF800FFF07C001FC03E001F801F001F801F801F801F801F800FC01F800FC0 +1F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F801F801F801F801F803F00 +1FC03E001FE0FC001FFFF8001F8FC0001F8000001F8000001F8000001F8000001F800000 +1F8000001F800000FFF00000FFF00000FFF000001A207E951F>I<FF0F80FF1FE0FF33F0 +1F63F01FC3F01FC3F01FC1E01F80001F80001F80001F80001F80001F80001F80001F8000 +1F80001F80001F80001F8000FFF800FFF800FFF80014167F9517>114 +D<07F3001FFF00781F00700F00F00700F00700F80000FF0000FFF0007FFC003FFE001FFF +0007FF00003F80E00F80E00780F00780F00780F80700FC1E00FFFC00C7F00011167E9516 +>I<01C00001C00001C00001C00003C00003C00003C00007C00007C0000FC0003FFF00FF +FF00FFFF000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000F +C3800FC3800FC3800FC3800FC3800FC30007E70003FE0000FC0011207F9F16>I<FF83FE +00FF83FE00FF83FE001F807E001F807E001F807E001F807E001F807E001F807E001F807E +001F807E001F807E001F807E001F807E001F807E001F807E001F807E001F80FE001F80FE +000F83FFC007FF7FC001FC7FC01A167E951F>I<FFF03FE0FFF03FE0FFF03FE00FC00E00 +0FE01E0007E01C0007E01C0003F0380003F0380003F8780001F8700001FCF00000FCE000 +00FCE000007FC000007FC000007FC000003F8000003F8000001F0000001F0000000E0000 +1B167F951E>I<FFE3FF8FF8FFE3FF8FF8FFE3FF8FF81FC07C03C00FC0FE03800FC0FE03 +800FE0FF078007E1FF070007E1DF070003F1DF8E0003F38F8E0003F38F8E0001FB8FDC00 +01FF07DC0001FF07FC0000FF07F80000FE03F80000FE03F800007E03F000007C01F00000 +3C01E000003800E00025167F9528>I<FFF0FFE0FFF0FFE0FFF0FFE007E0780007F0F000 +03F8F00001F9E00000FFC00000FF8000007F0000003F0000001F8000003FC000007FE000 +00F7F00001E3F00001C1F80003C0FC000780FE00FFC1FFE0FFC1FFE0FFC1FFE01B167F95 +1E>I E /Fe 4 112 df<03CC0E2E183C381C301C701CE038E038E038E038C073C073C0F3 +60F263361E1C10107C8F14>97 D<383E1F006CC331804F83C1C0CF03C1C0CE0381C0CE03 +81C01C0703801C0703801C0703801C070700380E0730380E0730380E0E30380E0E60701C +0640300C03801C107D8F1F>109 D<383E006CC3004F8380CF0380CE0380CE03801C0700 +1C07001C07001C0E00380E60380E60381C60381CC0700C8030070013107D8F16>I<01F0 +06180C0C180E300E700E600EE00EE00EE00CE01CE018E030606030C01F000F107C8F14> +I E /Ff 2 104 df<003C00E001C0038003800380038003800380038003800380038003 +800380038007001E00F8001E000700038003800380038003800380038003800380038003 +800380038001C000E0003C0E257E9B13>102 D<F8001E00070003800380038003800380 +0380038003800380038003800380038001C000E0003C00E001C003800380038003800380 +0380038003800380038003800380038007001E00F8000E257E9B13>I +E /Fg 35 122 df<00FC000383000603800E07801C07801C03001C00001C00001C00001C +0000FFFF80FFFF801C03801C03801C03801C03801C03801C03801C03801C03801C03801C +03801C03801C0380FF8FF0FF8FF0141A809915>12 D<70F8FCFC7404040808102040060C +7D990B>39 D<70F0F8F87808081010102040050C7D840B>44 D<70F8F8F87005057D840B +>46 D<07E01C38381C381C700E700E700EF00FF00FF00FF00FF00FF00FF00FF00FF00FF0 +0F700E700E700E381C381C1C3807E010187F9713>48 D<07E01FF8383C781C781E781E30 +1E001E001C0038007007E00038001C000E000F000F700FF80FF80EF01E703C3FF80FE010 +187F9713>51 D<70F8F8F87000000000000070F0F8F8780808101010204005177D8F0B> +59 D<000C0000001E0000001E0000001E0000003F0000003F0000003F00000067800000 +6780000067800000C3C00000C3C00000C3C0000181E0000181E0000181E0000300F00003 +FFF00007FFF80006007800060078000E007C000C003C001E003C00FF81FFC0FF81FFC01A +1A7F991D>65 D<FFFF80FFFFE00F00F00F00780F003C0F003C0F003C0F003C0F003C0F00 +780F00700F01E00FFFC00F00F00F00380F003C0F001E0F001E0F001E0F001E0F001E0F00 +3C0F003C0F00F8FFFFF0FFFFC0171A7F991B>I<FFF000FFF0000F00000F00000F00000F +00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00180F +00180F00180F00380F00380F00300F00700F01F0FFFFF0FFFFF0151A7F9918>76 +D<FFFF80FFFFE00F00F00F00780F00380F003C0F003C0F003C0F003C0F003C0F00380F00 +700F01E00FFFC00F00000F00000F00000F00000F00000F00000F00000F00000F00000F00 +00FFF000FFF000161A7F991A>80 D<07C21FF6383E701E600EE006E006E006F000F8007F +803FF01FF80FFC01FE001E000F0007C007C007C007E006F00EFC1CDFF887E0101A7E9915 +>83 D<7FFFFF007FFFFF00781E0F00601E0300601E0300E01E0380C01E0180C01E0180C0 +1E0180001E0000001E0000001E0000001E0000001E0000001E0000001E0000001E000000 +1E0000001E0000001E0000001E0000001E0000001E0000001E000003FFF00003FFF00019 +1A7F991C>I<FFC3FF0FF0FFC3FF0FF01E007803C01E007801801E007801800F00FC0300 +0F00FC03000F00FC030007819E060007819E060007819E060003C39F0C0003C30F0C0003 +C30F0C0003E30F1C0001E607980001E607980001E607980000FC03F00000FC03F00000FC +03F000007801E000007801E000007801E000003801C000003000C000241A7F9927>87 +D<FEFEC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 +FEFE07257D9B0B>91 D<FEFE060606060606060606060606060606060606060606060606 +060606060606060606FEFE0725809B0B>93 D<1FC000707000783800781C00301C00001C +0003FC001F1C003C1C00781C00F01C00F01D80F01D80F03D80785D801F8F0011107F8F13 +>97 D<FC0000FC00001C00001C00001C00001C00001C00001C00001C00001C00001CFC00 +1F07001E03801C03C01C01C01C01E01C01E01C01E01C01E01C01E01C01E01C01C01C0380 +1E03001F060018F800131A809915>I<07F01C1C383C783C7018F000F000F000F000F000 +F0007000780C380C1C3807E00E107F8F11>I<003F00003F000007000007000007000007 +0000070000070000070000070003E7000C1F00180F00380700700700F00700F00700F007 +00F00700F00700F00700700700780700380F001C3FE007E7E0131A7F9915>I<07C01C70 +38387038701CF01CFFFCF000F000F000F0007000780C38081C3807E00E107F8F11>I<01 +F007180E3C0C3C1C181C001C001C001C001C00FFC0FFC01C001C001C001C001C001C001C +001C001C001C001C001C00FF80FF800E1A80990C>I<0FC700387B80703B80F03C00F03C +00F03C00F03C007038003870006FC0004000004000006000007FF0003FFC003FFE00600F +00C00300C00300C00300C00300600600381C0007E00011187F8F13>I<387C7C7C380000 +000000FCFC1C1C1C1C1C1C1C1C1C1C1C1CFFFF081A80990A>105 +D<FC00FC001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C +001C001C001C001C001C001C00FF80FF80091A80990A>108 D<FC7C1F00FD8E63801E07 +81C01E0781C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C07 +01C01C0701C01C0701C0FF9FE7F8FF9FE7F81D107F8F20>I<FC7C00FD87001E03801E03 +801C03801C03801C03801C03801C03801C03801C03801C03801C03801C0380FF9FF0FF9F +F01410808F15>I<07E01C38381C700E700EF00FF00FF00FF00FF00FF00F700E700E381C +1C3807E010107F8F13>I<FCFC00FF07001E03801C03C01C03C01C01E01C01E01C01E01C +01E01C01E01C01E01C03C01C03801E07001F0E001CF8001C00001C00001C00001C00001C +0000FF8000FF80001317808F15>I<FCF0FD1C1E3C1E3C1C181C001C001C001C001C001C +001C001C001C00FF80FF800E10808F0F>114 D<1F2060E04060C060C060F0007F003FC0 +1FE000F0C070C030E030E020F0408F800C107F8F0F>I<18001800180018001800180038 +007FC0FFC03800380038003800380038003800386038603860386038601CC007800B177F +960F>I<FC1F80FC1F801C03801C03801C03801C03801C03801C03801C03801C03801C03 +801C03801C07800C07800E0BF003F3F01410808F15>I<FE3F80FE3F803C0E001C0C001C +0C000E18000E18000E180007300007300007700003E00003E00001C00001C00001C00011 +107F8F14>I<FE3F80FE3F803C0E001C0C001C0C000E18000E18000E1800073000073000 +07700003E00003E00001C00001C00001C000018000018000618000F30000F30000E60000 +78000011177F8F14>121 D E /Fh 4 52 df<00C00000C00000C00000C00000C00000C0 +0000C00000C00000C000FFFF80FFFF8000C00000C00000C00000C00000C00000C00000C0 +0000C00000C00011147E8F17>43 D<0C007C009C001C001C001C001C001C001C001C001C +001C001C001C001C00FF8009107E8F0F>49 D<1F006180C0C0E0E0E0E000E000C001C001 +8003000400082010203FC07FC0FFC00B107F8F0F>I<1F00218071C071C021C001800300 +1F00018000C000E040E0E0E0E0C041803F000B107F8F0F>I E /Fi +5 107 df<03F0000FFC001FFE003FFF007FFF807FFF80FFFFC0FFFFC0FFFFC0FFFFC0FF +FFC0FFFFC07FFF807FFF803FFF001FFE000FFC0003F00012127E9317>15 +D<0000000600000000060000000006000000000300000000030000000003800000000180 +00000000C0000000006000000000700000000018FFFFFFFFFFFFFFFFFFFF000000001800 +00000070000000006000000000C000000001800000000380000000030000000003000000 +0006000000000600000000060028187E962D>33 D<001F007F00F801E003C003C003C003 +C003C003C003C003C003C003C003C003C003C003C003C007800F00FE00F800FE000F0007 +8003C003C003C003C003C003C003C003C003C003C003C003C003C003C003C001E000F800 +7F001F102D7DA117>102 D<F800FE001F00078003C003C003C003C003C003C003C003C0 +03C003C003C003C003C003C003C001E000F0007F001F007F00F001E003C003C003C003C0 +03C003C003C003C003C003C003C003C003C003C003C007801F00FE00F800102D7DA117> +I<C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 +C0C0C0C0C0C0C0C0C0C0022D7BA10D>106 D E /Fj 3 52 df<06001E00FE00EE000E00 +0E000E000E000E000E000E000E000E000E000E000E000E00FFE0FFE00B137D9211>49 +D<1F003FC041E0C0F0E070E07000F000E000E001C00380030004000810101020307FE0FF +E0FFE00C137E9211>I<1FC03FE07070707820380078007000E00FC000700038003C003C +403CE03CE03840707FE01FC00E137F9211>I E /Fk 46 121 df<3C03C07E07E0FF0FF0 +FF8FF8FF8FF8FF8FF87F87F83D83D80180180380380300300300300600600E00E01C01C0 +38038030030015117E9F1B>34 D<3C007E00FF00FF80FF80FF807F803D80018003800300 +030006000E001C003800300009117D9F0F>39 D<3C7EFFFFFFFF7E3C08087D870F>46 +D<00380000F80007F800FFF800FFF800F9F80001F80001F80001F80001F80001F80001F8 +0001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F8 +0001F80001F8007FFFE07FFFE07FFFE0131D7D9C1A>49 D<03FC001FFF803FFFC07C1FE0 +FE07F0FE03F0FE03F8FE01F87C01F83801F80003F80003F00007E00007E0000FC0001F00 +003E00007C0000F00001E0380380380700380E00781FFFF83FFFF07FFFF0FFFFF0FFFFF0 +FFFFF0151D7E9C1A>I<03FC000FFF801FFFC03C0FE07E07F07E03F07E03F07E03F03C07 +F00007E0000FC0001F8003FE0003FC00000F800007E00003F00003F00003F83803F87C03 +F8FE03F8FE03F8FE03F0FC07F07C0FE03FFFC01FFF0003FC00151D7E9C1A>I<0001E000 +03E00003E00007E0000FE0001FE0003BE00073E000F3E001E3E001C3E00383E00703E00E +03E01C03E03803E07803E0F003E0FFFFFEFFFFFEFFFFFE0007E00007E00007E00007E000 +07E000FFFE00FFFE00FFFE171D7F9C1A>I<3800E03FFFE03FFFC03FFF803FFF003FFC00 +3FC00038000038000038000038000039FC003FFF803E07C03803E01003F00003F00003F8 +0003F87803F8FC03F8FC03F8FC03F8FC03F07807E07C0FE03FFFC00FFF0003F800151D7E +9C1A>I<003F0001FFC007FFE00FC1E01F03F01E03F03E03F07E03F07C01E07C0000FC10 +00FCFF00FDFFC0FF03E0FE01F0FE01F0FC01F8FC01F8FC01F8FC01F87C01F87C01F87C01 +F83C01F03E01F01F03E00FFFC007FF8001FC00151D7E9C1A>I<7000007FFFF87FFFF87F +FFF87FFFF07FFFE0FFFFC0F00380E00700E00E00E00E00001C0000380000780000700000 +F00000F00001F00001E00003E00003E00003E00007E00007E00007E00007E00007E00007 +E00003C000018000151E7D9D1A>I<01FE0007FF801FFFC03E07E03C03F07C01F07C01F0 +7E01F07F81F07FE3E03FF3C03FFF801FFF000FFF8007FFC01FFFE03E7FF07C1FF87807F8 +F803F8F801F8F800F8F800F8F800F07C01F07F03E03FFFC00FFF8003FC00151D7E9C1A> +I<0000E000000001F000000001F000000003F800000003F800000003F800000007FC0000 +0007FC0000000FFE0000000EFE0000000EFE0000001C7F0000001C7F0000003C7F800000 +383F800000383F800000701FC00000701FC00000F01FE00000E00FE00000FFFFE00001FF +FFF00001FFFFF00003C007F800038003F800038003F800070001FC00070001FC00FFF01F +FFE0FFF01FFFE0FFF01FFFE0231F7E9E28>65 D<FFFFFE00FFFFFFC0FFFFFFE007E007F0 +07E003F807E001FC07E001FC07E001FC07E001FC07E001FC07E001FC07E001F807E003F0 +07E00FE007FFFF8007FFFFE007E003F007E001F807E000FC07E000FC07E000FE07E000FE +07E000FE07E000FE07E000FE07E001FC07E001FC07E007F8FFFFFFF0FFFFFFE0FFFFFF00 +1F1F7E9E25>I<0007F806007FFF0E01FFFFDE03FE03FE07F000FE0FC0007E1F80003E3F +80001E3F00001E7F00000E7E00000E7E00000EFE000000FE000000FE000000FE000000FE +000000FE000000FE0000007E0000007E00000E7F00000E3F00000E3F80001C1F80001C0F +C0003807F0007803FE03F001FFFFC0007FFF800007FC001F1F7D9E26>I<FFFFFE0000FF +FFFFC000FFFFFFF00007F007F80007F001FC0007F000FE0007F0007F0007F0003F0007F0 +003F8007F0001F8007F0001F8007F0001FC007F0001FC007F0001FC007F0001FC007F000 +1FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001F8007F0001F8007F0003F +8007F0003F0007F0007F0007F0007E0007F001FC0007F007F800FFFFFFF000FFFFFFC000 +FFFFFE0000221F7E9E28>I<FFFFFFE0FFFFFFE0FFFFFFE007F007E007F003E007F001E0 +07F000F007F000F007F0707007F0707007F0707007F0707007F1F00007FFF00007FFF000 +07FFF00007F1F00007F0700007F0701C07F0701C07F0701C07F0003807F0003807F00038 +07F0007807F0007807F001F807F007F8FFFFFFF0FFFFFFF0FFFFFFF01E1F7E9E22>I<FF +FFFFE0FFFFFFE0FFFFFFE007F007E007F003E007F001E007F000F007F000F007F0007007 +F0707007F0707007F0707007F0700007F1F00007FFF00007FFF00007FFF00007F1F00007 +F0700007F0700007F0700007F0700007F0000007F0000007F0000007F0000007F0000007 +F00000FFFFC000FFFFC000FFFFC0001C1F7E9E21>I<FFFF80FFFF80FFFF8007F00007F0 +0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0 +0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F000FFFF +80FFFF80FFFF80111F7F9E14>73 D<FFFFC000FFFFC000FFFFC00007F0000007F0000007 +F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007 +F0000007F0000007F0000007F0000007F001C007F001C007F001C007F001C007F003C007 +F003C007F0078007F0078007F00F8007F03F80FFFFFF80FFFFFF80FFFFFF801A1F7E9E1F +>76 D<001FF80000FFFF0001F81F8007E007E00FC003F01F8001F81F0000F83F0000FC7F +0000FE7E00007E7E00007EFE00007FFE00007FFE00007FFE00007FFE00007FFE00007FFE +00007FFE00007FFE00007F7E00007E7F0000FE7F0000FE3F0000FC3F8001FC1F8001F80F +C003F007E007E001F81F8000FFFF00001FF800201F7D9E27>79 D<FFFFFE00FFFFFF80FF +FFFFE007F00FF007F003F807F001F807F001FC07F001FC07F001FC07F001FC07F001FC07 +F001FC07F001F807F003F007F00FF007FFFFC007FFFF0007F0000007F0000007F0000007 +F0000007F0000007F0000007F0000007F0000007F0000007F0000007F00000FFFF8000FF +FF8000FFFF80001E1F7E9E24>I<FFFFF80000FFFFFF8000FFFFFFC00007F00FF00007F0 +03F80007F001F80007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001 +F80007F003F00007F00FE00007FFFF800007FFFF000007F03F800007F00FC00007F00FE0 +0007F007F00007F007F00007F007F00007F007F00007F007F00007F007F00007F007F020 +07F007F07007F003F070FFFF81F8E0FFFF80FFC0FFFF803F80241F7E9E27>82 +D<03FC180FFF381FFFF83E03F87C00F8780078F80078F80038F80038FC0000FF0000FFF8 +007FFF007FFFC03FFFE01FFFF00FFFF803FFF8001FFC0001FC0000FC00007CE0007CE000 +7CE0007CF00078F800F8FE01F0FFFFE0EFFFC0C1FF00161F7D9E1D>I<7FFFFFFC7FFFFF +FC7FFFFFFC7E0FE0FC780FE03C700FE01CF00FE01EF00FE01EE00FE00EE00FE00EE00FE0 +0EE00FE00E000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0 +00000FE000000FE000000FE000000FE000000FE000000FE000000FE00007FFFFC007FFFF +C007FFFFC01F1E7E9D24>I<0600600E00E01C01C0380380300300600600600600E00E00 +C00C00DE0DE0FF0FF0FF8FF8FF8FF8FF8FF87F87F83F03F01E01E015117D9F1B>92 +D<07FC001FFF803F0FC03F07E03F03F03F03F00C03F00003F001FFF00FFFF01F83F07E03 +F07C03F0F803F0F803F0F803F0FC07F07E0DFE3FF8FE07E07E17147F9319>97 +D<FF800000FF800000FF8000001F8000001F8000001F8000001F8000001F8000001F8000 +001F8000001F8000001F8000001F8FE0001FFFF8001FF07C001FC03E001F803F001F801F +001F801F001F801F801F801F801F801F801F801F801F801F801F801F801F801F001F801F +001F803E001FC03E001FE0FC001E7FF0001C1FC00019207F9F1D>I<01FE0007FF801F0F +C03E0FC03E0FC07C0FC07C0300FC0000FC0000FC0000FC0000FC0000FC00007C00007E00 +003E00E03F01C01F83C007FF8001FC0013147E9317>I<0007FC000007FC000007FC0000 +00FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC0001 +FCFC000FFFFC001F83FC003E00FC007E00FC007C00FC007C00FC00FC00FC00FC00FC00FC +00FC00FC00FC00FC00FC00FC00FC007C00FC007C00FC007E00FC003E01FC001F07FF800F +FFFF8003F8FF8019207E9F1D>I<01FE0007FF800F83C01E01E03E00F07C00F07C00F8FC +00F8FFFFF8FFFFF8FC0000FC0000FC00007C00007C00003E00381E00380F80F007FFE000 +FF8015147F9318>I<003F8000FFC003F3E007E7E007C7E00FC7E00FC3C00FC0000FC000 +0FC0000FC0000FC000FFFC00FFFC00FFFC000FC0000FC0000FC0000FC0000FC0000FC000 +0FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0007FFC007FFC007FFC0013207F +9F10>I<03FC7C0FFFFE1E07DE3C03DE7C03EC7C03E07C03E07C03E07C03E03C03C01E07 +801FFF0033FC003000007000007800007FFF803FFFF03FFFF81FFFFC3FFFFC7C00FEF800 +3EF8003EF8003EF8003E7C007C3F01F80FFFE003FF80171E7F931A>I<FF800000FF8000 +00FF8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000 +001F8000001F87F0001F9FF8001FB8FC001FE07E001FC07E001FC07E001F807E001F807E +001F807E001F807E001F807E001F807E001F807E001F807E001F807E001F807E001F807E +00FFF3FFC0FFF3FFC0FFF3FFC01A207E9F1D>I<1E003F007F807F807F807F803F001E00 +00000000000000000000FF80FF80FF801F801F801F801F801F801F801F801F801F801F80 +1F801F801F801F80FFF0FFF0FFF00C217EA00F>I<FF800000FF800000FF8000001F8000 +001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F83FF +001F83FF001F83FF001F81E0001F83C0001F8780001F9E00001FBC00001FFE00001FFF00 +001FDF00001F9F80001F0FC0001F07E0001F03E0001F03F0001F01F800FFE3FF80FFE3FF +80FFE3FF8019207F9F1C>107 D<FF80FF80FF801F801F801F801F801F801F801F801F80 +1F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F80 +FFF0FFF0FFF00C207E9F0F>I<FF07F00FE000FF1FFC3FF800FF387E70FC001F603FC07E +001FC03F807E001FC03F807E001F803F007E001F803F007E001F803F007E001F803F007E +001F803F007E001F803F007E001F803F007E001F803F007E001F803F007E001F803F007E +001F803F007E00FFF1FFE3FFC0FFF1FFE3FFC0FFF1FFE3FFC02A147E932D>I<FF07F000 +FF1FF800FF38FC001F607E001FC07E001FC07E001F807E001F807E001F807E001F807E00 +1F807E001F807E001F807E001F807E001F807E001F807E001F807E00FFF3FFC0FFF3FFC0 +FFF3FFC01A147E931D>I<01FF0007FFC01F83F03E00F83E00F87C007C7C007CFC007EFC +007EFC007EFC007EFC007EFC007E7C007C7C007C3E00F83E00F81F83F007FFC001FF0017 +147F931A>I<FF8FE000FFFFF800FFF0FC001FC07E001F803F001F803F001F801F001F80 +1F801F801F801F801F801F801F801F801F801F801F801F801F001F803F001F803E001FC0 +7E001FE0FC001FFFF0001F9FC0001F8000001F8000001F8000001F8000001F8000001F80 +0000FFF00000FFF00000FFF00000191D7F931D>I<FF1F00FF3FC0FF67E01FC7E01FC7E0 +1FC7E01F81801F80001F80001F80001F80001F80001F80001F80001F80001F80001F8000 +FFF800FFF800FFF80013147F9316>114 D<0FE63FFE783E700EF00EF00EFE00FFE07FF8 +3FFC1FFE0FFF007FE01FE00FF00FF00EFC1EFFFCC7F010147E9315>I<03800380038003 +800780078007800F801F803FFCFFFCFFFC1F801F801F801F801F801F801F801F801F801F +8E1F8E1F8E1F8E1F8E0F9C07F803F00F1D7F9C14>I<FF83FE00FF83FE00FF83FE001F80 +7E001F807E001F807E001F807E001F807E001F807E001F807E001F807E001F807E001F80 +7E001F807E001F807E001F80FE001F80FE000F83FFC007FF7FC001FC7FC01A147E931D> +I<FFE7FF3FE0FFE7FF3FE0FFE7FF3FE01F80FC07000FC1FC0E000FC1FC0E000FC3FE1E00 +07E3BE1C0007E3BE1C0007F7BF3C0003F71F380003F71FB80001FE0FF00001FE0FF00001 +FE0FF00000FC07E00000FC07E00000FC07E000007803C000007803C00023147F9326> +119 D<FFF3FF00FFF3FF00FFF3FF000FE0E00007E1E00003F3C00001FF800000FF000000 +FE0000007E0000003F0000007F800000FFC00001EFE00003C7E0000383F0000781F800FF +C3FF80FFC3FF80FFC3FF8019147F931C>I E /Fl 84 127 df<70F8F8F8F8F8F8F8F8F8 +F8F8F8F8F8F8F870000000000070F8F8F870051C779B18>33 D<2008701CF83EF83EF83E +F83EF83EF83E701C701C701C701C701C30180F0E7C9C18>I<030600078F00078F00078F +00078F00078F00078F007FFFC0FFFFE0FFFFE07FFFC00F1E000F1E000F1E000F1E000F1E +000F1E007FFFC0FFFFE0FFFFE07FFFC01E3C001E3C001E3C001E3C001E3C001E3C000C18 +00131C7E9B18>I<00C00001C00001C00001C00003F0000FFC003FFE007DDF0071CF00E1 +C780E1CF80E1CF80E1CF80F1C70079C0007FC0003FF0001FFC0007FE0001FF0001CF0021 +C78071C380F9C380F9C380F1C380F1C70079C7007DDE003FFC001FF80007E00001C00001 +C00001C00000C00011247D9F18>I<3803007C07807C0780EE0F80EE0F00EE0F00EE1F00 +EE1E00EE1E00EE3E007C3C007C3C00387C0000780000780000F80000F00001F00001E000 +01E00003E00003C00003C00007C0000783800787C00F87C00F0EE00F0EE01F0EE01E0EE0 +1E0EE03E0EE03C07C03C07C018038013247E9F18>I<01C00007E0000FF0000E70001C38 +001C38001C38001C38001C73F81CF3F81CE3F80FC1C00FC3800F83800F03801F07003F87 +007B8E0071CE00F1FC00F0FC00F07C00F07870F0787078FE707FFFE03FC7E00F03C0151C +7F9B18>I<387C7C7E3E0E0E0E1C1C38F8F0C0070E789B18>I<007000F001E003C007800F +001E001E003C003C007800780078007000F000F000F000F000F000F000F000F000700078 +00780078003C003C001E001E000F00078003C001F000F000700C24799F18>I<6000F000 +78003C001E000F000780078003C003C001E001E001E000E000F000F000F000F000F000F0 +00F000F000E001E001E001E003C003C0078007800F001E003C007800F00060000C247C9F +18>I<01C00001C00001C00001C00061C300F9CF80FDDF807FFF003FFE000FF8000FF800 +3FFE007FFF00FDDF80F9CF8061C30001C00001C00001C00001C00011147D9718>I<0060 +0000F00000F00000F00000F00000F00000F00000F0007FFFC0FFFFE0FFFFE07FFFC000F0 +0000F00000F00000F00000F00000F00000F00000600013147E9718>I<1C3E7E7F3F1F07 +0E1E7CF860080C788518>I<7FFFC0FFFFE0FFFFE07FFFC013047E8F18>I<3078FCFC7830 +0606778518>I<000300000780000780000F80000F00001F00001E00001E00003E00003C +00007C0000780000780000F80000F00001F00001E00003E00003C00003C00007C0000780 +000F80000F00000F00001F00001E00003E00003C00003C00007C0000780000F80000F000 +00F0000060000011247D9F18>I<01F00007FC000FFE001F1F001E0F003C07807803C078 +03C07803C0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F803E078 +03C07803C07C07C03C07801E0F001F1F000FFE0007FC0001F000131C7E9B18>I<01C001 +C003C007C007C01FC0FFC0FBC063C003C003C003C003C003C003C003C003C003C003C003 +C003C003C003C003C003C07FFEFFFF7FFE101C7C9B18>I<03F0001FFE003FFF007C0F80 +7807C0F003C0F801E0F801E07001E00001E00001E00003C00003C0000780000780000F00 +001E00003C0000F80001F00003E00007C0000F80001E01E03C01E07FFFE0FFFFE07FFFE0 +131C7E9B18>I<03F8001FFE003FFF003C0F807C07C07C03C07C03C01003C00003800007 +80000F0003FE0003FE0003FF00000F800007C00003C00001E00001E00001E07001E0F801 +E0F803C0F007C07C0F807FFF001FFE0007F000131C7E9B18>I<001F00003F00007F0000 +770000F70001E70001C70003C7000787000707000E07001E07003C0700380700780700F0 +0700FFFFF8FFFFF8FFFFF8000700000700000700000700000700000700007FF0007FF000 +7FF0151C7F9B18>I<3FFF807FFF807FFF80780000780000780000780000780000780000 +7800007800007BF8007FFE007FFF007C0F803003C00003C00001E00001E07001E0F801E0 +F801E0F803C07807C07C0F803FFF001FFC0003F000131C7E9B18>I<F00000FFFFE0FFFF +E0FFFFE0F007C0F00F80000F00001E00003C00003C0000780000780000F00000F00001E0 +0001E00001E00003C00003C00003C00003C0000780000780000780000780000780000780 +00078000030000131D7E9C18>55 D<3078FCFC783000000000000000003078FCFC783006 +14779318>58 D<183C7E7E3C180000000000000000183C7E7E3E1E0E1C3C78F060071A78 +9318>I<0000C00003E00007E0001FC0003F8000FE0001FC0007F0000FE0003F80007F00 +00FC0000FC00007F00003F80000FE00007F00001FC0000FE00003F80001FC00007E00003 +E00000C013187E9918>I<7FFFC0FFFFE0FFFFE07FFFC00000000000000000000000007F +FFC0FFFFE0FFFFE07FFFC0130C7E9318>I<600000F80000FC00007F00003F80000FE000 +07F00001FC0000FE00003F80001FC00007E00007E0001FC0003F8000FE0001FC0007F000 +0FE0003F80007F0000FC0000F8000060000013187E9918>I<0FF0003FFC007FFF00781F +00F80780F80780F80780201F00007E0000FC0001F00001E00003C00003C00003C00003C0 +0003C00003800000000000000000000000000000000003800007C00007C00007C0000380 +00111C7D9B18>I<007C0001FE0007FF000F87801E03C03C1DC0387FC070FFE071E3E071 +C1E0E1C1E0E380E0E380E0E380E0E380E0E380E0E380E0E1C1C071C1C071E3C070FF8038 +7F003C1C001E01E00F83E007FFC001FF80007E00131C7E9B18>I<00F80000F80000F800 +01FC0001DC0001DC0001DC0003DE0003DE0003DE0003DE00038E00078F00078F00078F00 +078F00078F000F07800FFF800FFF800FFF800F07801E03C01E03C01E03C07F8FF0FF8FF8 +7F8FF0151C7F9B18>I<7FFE00FFFF007FFF801E07C01E03C01E01E01E01E01E01E01E01 +E01E01E01E03C01E07C01FFF801FFF001FFFC01E03E01E01E01E00F01E00F01E00F01E00 +F01E00F01E00F01E01E01E03E07FFFC0FFFF807FFE00141C7F9B18>I<00F8E003FFE007 +FFE00F07E01E03E03C03E03C01E07801E07801E0700000F00000F00000F00000F00000F0 +0000F00000F00000F000007000007801E07801E03C01E03C01E01E03C00F07C007FF8003 +FE0000F800131C7E9B18>I<7FFC00FFFF007FFF801E07C01E03E01E01E01E01F01E00F0 +1E00F01E00F81E00781E00781E00781E00781E00781E00781E00781E00781E00781E00F0 +1E00F01E01F01E01E01E03E01E07C07FFF80FFFF007FFC00151C809B18>I<FFFFF0FFFF +F0FFFFF01E00F01E00F01E00F01E00F01E00001E00001E0F001E0F001E0F001FFF001FFF +001FFF001E0F001E0F001E0F001E00001E00001E00781E00781E00781E00781E0078FFFF +F8FFFFF8FFFFF8151C7F9B18>I<FFFFF8FFFFF8FFFFF81E00781E00781E00781E00781E +00001E00001E0F001E0F001E0F001FFF001FFF001FFF001E0F001E0F001E0F001E00001E +00001E00001E00001E00001E00001E0000FFE000FFE000FFE000151C7F9B18>I<01F1C0 +07FFC00FFFC01F0FC01E07C03C03C03803C07803C07803C0700000F00000F00000F00000 +F00000F00000F01FF0F03FF0F01FF07003C07803C07803C03807C03C07C01E0FC01F0FC0 +0FFFC007FFC001F3C0141C7E9B18>I<7FFF80FFFFC07FFF8001E00001E00001E00001E0 +0001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E0 +0001E00001E00001E00001E00001E00001E0007FFF80FFFFC07FFF80121C7D9B18>73 +D<01FFE001FFE001FFE0000F00000F00000F00000F00000F00000F00000F00000F00000F +00000F00000F00000F00000F00000F00000F00000F00000F00000F00700F00F80F00F80F +00F83E007FFC003FF8000FE000131C7E9B18>I<FFE000FFE000FFE0001E00001E00001E +00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E +00001E00001E00001E00F01E00F01E00F01E00F01E00F0FFFFF0FFFFF0FFFFF0141C7F9B +18>76 D<FC01F8FE03F8FE03F83F07E03B06E03B06E03B06E03B8EE03B8EE0398CE0398C +E039DCE039DCE039DCE038D8E038F8E038F8E03870E03870E03800E03800E03800E03800 +E03800E03800E0FE03F8FE03F8FE03F8151C7F9B18>I<7E07F0FF0FF87F07F01F81C01D +81C01D81C01DC1C01CC1C01CC1C01CE1C01CE1C01CE1C01C61C01C71C01C71C01C31C01C +39C01C39C01C39C01C19C01C19C01C1DC01C0DC01C0DC01C0FC07F07C0FF87C07F03C015 +1C7F9B18>I<0FFE003FFF807FFFC07C07C07803C0F803E0F001E0F001E0F001E0F001E0 +F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0 +F803E07803C07C07C07FFFC03FFF800FFE00131C7E9B18>I<FFFE00FFFF80FFFFC01E07 +C01E03E01E01E01E00F01E00F01E00F01E00F01E00F01E01E01E03E01E07C01FFFC01FFF +801FFE001E00001E00001E00001E00001E00001E00001E00001E0000FFC000FFC000FFC0 +00141C7F9B18>I<7FF800FFFE007FFF001E1F801E07801E07C01E03C01E03C01E03C01E +07C01E07801E1F801FFF001FFE001FFE001E0F001E0F001E07801E07801E07801E07801E +07801E07BC1E07BC1E07BC7F83F8FFC1F87F80F0161C7F9B18>82 +D<7FFFF8FFFFF8FFFFF8F07878F07878F07878F078780078000078000078000078000078 +000078000078000078000078000078000078000078000078000078000078000078000078 +0000780007FF8007FF8007FF80151C7F9B18>84 D<FFC7FEFFC7FEFFC7FE1E00F01E00F0 +1E00F01E00F01E00F01E00F01E00F01E00F01E00F01E00F01E00F01E00F01E00F01E00F0 +1E00F01E00F01E00F01E00F01E00F00F01E00F01E007C7C003FF8001FF00007C00171C80 +9B18>I<FF07F8FF8FF8FF07F83C01E01E03C01E03C01E03C01E03C00F07800F07800F07 +800F07800F0780078F00078F00078F00078F00038E00038E0003DE0003DE0001DC0001DC +0001DC0001FC0001FC0000F80000F800151C7F9B18>I<FE03F8FE03F8FE03F870007070 +00707000703800E03800E03800E03800E03800E038F8E039FCE039DCE039DCE019DCC019 +DCC019DCC0198CC0198CC01D8DC01D8DC01D8DC01D05C00F07800F07800F07800E038015 +1C7F9B18>I<FFFCFFFCFFFCF000F000F000F000F000F000F000F000F000F000F000F000 +F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000 +FFFCFFFCFFFC0E24789F18>91 D<600000F00000F00000F800007800007C00003C00003C +00003E00001E00001F00000F00000F00000F800007800007C00003C00003C00003E00001 +E00001F00000F00000F800007800007800007C00003C00003E00001E00001E00001F0000 +0F00000F8000078000078000030011247D9F18>I<FFFCFFFCFFFC003C003C003C003C00 +3C003C003C003C003C003C003C003C003C003C003C003C003C003C003C003C003C003C00 +3C003C003C003C003C003C003C003CFFFCFFFCFFFC0E247F9F18>I<03800FE03FF8FFFE +FC7EF01E40040F077C9B18>I<7FFFC0FFFFE0FFFFE07FFFC013047E7F18>I<061E3E3870 +70E0E0E0F8FC7C7C38070E789E18>I<0FF0003FFC007FFE007C1F007C0F003807800007 +8000FF8007FF801FFF807F87807C0780F00780F00780F00780F807807C1F803FFFF81FFB +F807E1F815147E9318>I<7F0000FF00007F00000F00000F00000F00000F00000F00000F +3E000FFF800FFFE00FC1F00F80F00F00780F00780F003C0F003C0F003C0F003C0F003C0F +003C0F00780F80780F80F00FC1F00FFFE00FFF80073E00161C809B18>I<01FC0007FF00 +1FFF803E0F803C0F80780700780000F00000F00000F00000F00000F00000F00000780000 +7803C03C03C03E07C01FFF8007FF0001FC0012147D9318>I<001FC0003FC0001FC00003 +C00003C00003C00003C00003C001F3C007FFC01FFFC03E0FC03C07C07803C07803C0F003 +C0F003C0F003C0F003C0F003C0F003C07803C07807C03C07C03E1FC01FFFF807FBFC01F3 +F8161C7F9B18>I<01F80007FE000FFF001F0F803C03C07803C07801C0F001E0F001E0FF +FFE0FFFFE0FFFFE0F000007800007801E03C01E01F03E00FFFC007FF8000FE0013147E93 +18>I<001F80007FC000FFE000F3E001E3E001E08001E00001E0007FFFC0FFFFC0FFFFC0 +01E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E000 +01E00001E0007FFF807FFF807FFF80131C7F9B18>I<03F1E00FFFF01FFFF83E1F783C0F +307807807807807807807807807807803C0F003E1F003FFE003FFC003BF0003800003800 +001FFE001FFFC03FFFE07801F0700070E00038E00038E00038E000387800F07E03F01FFF +C00FFF8001FC00151F7F9318>I<7F0000FF00007F00000F00000F00000F00000F00000F +00000F1F000F7F800FFFC00FE1C00FC1E00F81E00F01E00F01E00F01E00F01E00F01E00F +01E00F01E00F01E00F01E00F01E00F01E07FE3FCFFF3FE7FE3FC171C809B18>I<01C000 +03E00003E00003E00001C0000000000000000000000000007FE000FFE0007FE00001E000 +01E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E000 +01E000FFFF80FFFF80FFFF80111D7D9C18>I<001C003E003E003E001C00000000000000 +000FFE0FFE0FFE001E001E001E001E001E001E001E001E001E001E001E001E001E001E00 +1E001E001E001E001E001E001E701CF83CF878FFF87FF01FC00F277E9C18>I<7E0000FE +00007E00000E00000E00000E00000E00000E00000E3FF00E3FF00E3FF00E07800E0F000E +1E000E3C000E78000EF0000FF8000FFC000F9C000F0E000E0F000E07000E03800E03C07F +C7F8FFC7F87FC7F8151C7F9B18>I<FFE000FFE000FFE00001E00001E00001E00001E000 +01E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E000 +01E00001E00001E00001E00001E00001E000FFFFC0FFFFC0FFFFC0121C7D9B18>I<F9C1 +C0FFF7F0FFFFF03E3E383C3C383C3C383838383838383838383838383838383838383838 +38383838383838383838383838FE3E3EFE7E7EFE3E3E1714809318>I<7F1F00FF7F807F +FFC00FE1C00FC1E00F81E00F01E00F01E00F01E00F01E00F01E00F01E00F01E00F01E00F +01E00F01E00F01E07FE3FCFFF3FE7FE3FC1714809318>I<01F0000FFE001FFF003E0F80 +3C07807803C07803C0F001E0F001E0F001E0F001E0F001E0F001E07803C07803C03C0780 +3F1F801FFF000FFE0001F00013147E9318>I<7F3E00FFFF807FFFE00FC1F00F80F00F00 +780F00780F003C0F003C0F003C0F003C0F003C0F003C0F00780F80780F80F00FC1F00FFF +E00FFF800F3E000F00000F00000F00000F00000F00000F00000F00007FE000FFF0007FE0 +00161E809318>I<01F9E007FDE00FFFE01F0FE03C07E07803E07801E0F001E0F001E0F0 +01E0F001E0F001E0F001E07801E07803E03C07E03E0FE01FFFE007FDE001F1E00001E000 +01E00001E00001E00001E00001E00001E0000FFC001FFE000FFC171E7F9318>I<FF87E0 +FF9FF0FFBFF807F87807F03007E00007C00007C000078000078000078000078000078000 +078000078000078000078000FFFE00FFFF00FFFE0015147F9318>I<07FF003FFF007FFF +00700F00E00F00E00F00F000007E00007FF0001FFC0007FF00003F00700780F00380F003 +80F80380FC0F00FFFF00FFFC00E7F00011147D9318>I<03800007800007800007800007 +80007FFFC0FFFFC0FFFFC007800007800007800007800007800007800007800007800007 +80000780C00781E00781E00781E003C3C003FFC001FF00007E0013197F9818>I<7F0FE0 +FF1FE07F0FE00F01E00F01E00F01E00F01E00F01E00F01E00F01E00F01E00F01E00F01E0 +0F01E00F01E00F03E00F07E007FFFC03FFFE01F9FC1714809318>I<7F8FF0FF8FF87F8F +F01C01C00E03800E03800E0380070700070700070700078F00038E00038E0003DE0001DC +0001DC0001DC0000F80000F80000700015147F9318>I<FF07F8FF8FF8FF07F83800E038 +00E03800E03800E01C01C01C71C01CF9C01CF9C01CF9C01DDDC00DDD800DDD800DDD800F +8F800F8F800F8F8007070015147F9318>I<7F8FF07F9FF07F8FF00F0700078E00039E00 +01DC0001F80000F80000700000F00000F80001DC00039E00038E000707000E07807F8FF0 +FF8FF87F8FF015147F9318>I<7F8FF0FF8FF87F8FF00E01C00E03800E03800703800707 +00070700038700038700038E0001CE0001CE0001CC0000DC0000FC000078000078000078 +0000700000700000700000F0007CE0007DE00073C0007F80003F00001E0000151E7F9318 +>I<3FFFF07FFFF07FFFF07803E07807C0780F80001F00003E00007C0000F80001F00003 +E00007C0000F80F01F00F03E00F07C00F0FFFFF0FFFFF0FFFFF014147F9318>I<0007E0 +001FE0007FE0007C0000F00000F00000F00000F00000F00000F00000F00000F00000F000 +00F00000F00001F0007FE000FFC000FFC0007FE00001F00000F00000F00000F00000F000 +00F00000F00000F00000F00000F00000F00000F000007C00007FE0001FE00007E013247E +9F18>I<60F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 +F0F0F0600424769F18>I<7E0000FF8000FFE00003E00000F00000F00000F00000F00000 +F00000F00000F00000F00000F00000F00000F00000F800007FC0003FE0003FE0007FC000 +F80000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00003 +E000FFE000FF80007E000013247E9F18>I<0E0C1F1E3FBEFBF8F1F060E00F067C9B18>I +E /Fm 34 122 df<00001FE000007FF00001C03800018078000380780007003000070000 +0007000000070000000E0000000E0000000E000000FFFFE000FFFFE0001C01C0001C01C0 +001C01C0001C01C0001C0380003803800038038000380380003807000038070000780700 +0070071800700E3000700E3000700E3000600E6000E007E000E003C000E0000000E00000 +01C0000001C00000318000007B800000F30000007E0000003C0000001D29829F1A>12 +D<00003FC0FF800000FFE3FFC00001C1E700E0000381EE01E0000380DC01E00007001C00 +C0000700180000000700380000000700380000000E00380000000E00380000000E007000 +0000FFFFFFFF8000FFFFFFFF80000E00700700001C00700700001C00700700001C00E007 +00001C00E00E00001C00E00E00003800E00E00003800E00E00003801C01C00003801C01C +00003801C01C00007001C01C60007001C038C00070038038C00070038038C00070038039 +8000E003801F8000E003000F0000E00700000000E00700000001C00700000001C00E0000 +0031860E000000798F1C000000F31E380000007E0FF00000003C07C00000002B29829F28 +>14 D<1C3E7E7E3E060C0C18183060C080070E769F0E>39 D<000200060006000E003C00 +FC03DC031C0038003800380038007000700070007000E000E000E000E001C001C001C001 +C00380038003800380FFF8FFF80F1E7B9D17>49 D<070F1F1F0E00000000000000000000 +70F8F8F0E008147B930E>58 D<0000FE020007FF06001F818C003E00DC0078007C00F000 +7C01E0003803C00038078000380F8000381F0000301F0000303E0000303E0000007C0000 +007C0000007C0000007C000000F8000000F8000000F8000000F80000C0F8000180780001 +8078000300780003003C0006003C000C001E0018000F00300007C0E00003FF800000FE00 +001F217A9F21>67 D<01FFFFFC01FFFFF8001E0078001E0038001E0038003C0018003C00 +18003C0018003C003000780C3000780C3000780C0000781C0000F0380000FFF80000FFF8 +0000F0380001E0300001E0300001E0300001E0300003C0000003C0000003C0000003C000 +0007800000078000000780000007800000FFFC0000FFF800001E1F7D9E1E>70 +D<00FF007FE001FF00FFC0001F001E00001F800C00001F800C0000378018000033C01800 +0033C018000033C018000063C030000061E030000061E030000061E0300000C0F0600000 +C0F0600000C0F0600000C0786000018078C000018078C00001803CC00001803CC0000300 +3D800003001F800003001F800003001F800006000F000006000F000006000F00000E000F +0000FFC0060000FFC0060000231F7D9E22>78 D<01FFFF8001FFFFE0001E01F0001E0078 +001E0078003C007C003C007C003C007C003C007C007800F8007800F8007800F0007801E0 +00F003C000F00F8000FFFF0000FFF80001E0000001E0000001E0000001E0000003C00000 +03C0000003C0000003C0000007800000078000000780000007800000FFF80000FFF00000 +1E1F7D9E1F>80 D<0007E040001FF8C0003C1D8000700F8000E0078001C0078001800300 +038003000380030003800300038000000380000003C0000003F8000001FF800001FFE000 +007FF000001FF0000001F800000078000000380000003800000038003000380030003800 +3000300070007000700060007800E0007801C000EE078000C7FE000081F800001A217D9F +1A>83 D<00F18003FDC0078F800E07801C07803C07803C0700780700780700780700F00E +00F00E00F00E00F00E30F01C60F03C60707C6078FCC03FCFC00F070014147C9317>97 +D<07803F803F000700070007000E000E000E000E001C001C001CF01FFC3F1E3E0E3C0F38 +0F700F700F700F700FE01EE01EE01EE03CE03CE038607071E03FC01F0010207B9F15>I< +007E0001FF000383800F07801E07801C07003C0200780000780000780000F00000F00000 +F00000F00000F00000700200700700381E001FF80007E00011147C9315>I<0000780003 +F80003F00000700000700000700000E00000E00000E00000E00001C00001C000F1C003FD +C0078F800E07801C07803C07803C0700780700780700780700F00E00F00E00F00E00F00E +30F01C60F03C60707C6078FCC03FCFC00F070015207C9F17>I<007C0001FF000783000F +01801E01803C01803C0300780E007FFC007FE000F00000F00000F00000F0000070000070 +02007807003C1E001FF80007E00011147C9315>I<0000F80001FC0003BC00033C000718 +000700000700000E00000E00000E00000E00000E0000FFE001FFE0001C00001C00001C00 +00380000380000380000380000380000700000700000700000700000700000E00000E000 +00E00000E00000E00001C00001C00001C0000180003380007B8000F300007E00003C0000 +1629829F0E>I<003C6000FF7001E3E00381E00701E00F01E00F01C01E01C01E01C01E01 +C03C03803C03803C03803C03803C07003C0F001C1F001E3F000FFE0003CE00000E00000E +00001C00001C00301C00783800F0F0007FE0003F8000141D7E9315>I<01E0000FE0000F +C00001C00001C00001C000038000038000038000038000070000070000073E00077F000E +C3800F81C00F01C00E01C01E03801C03801C03801C0380380700380700380700380E1870 +0E30700E30701C60700C60E00FC060078015207D9F17>I<006000F000F000E000000000 +000000000000000000000F001F80318031C063806380C3800700070007000E000E000E00 +1C301C601C6038C018C01F800F000C1F7D9E0E>I<0001800003C00003C0000380000000 +000000000000000000000000000000000000003C00007E0000C700018700030700030700 +060E00000E00000E00000E00001C00001C00001C00001C00003800003800003800003800 +00700000700000700000700000E00000E00030E00079C000F380007F00003C0000122882 +9E0E>I<01E0000FE0000FC00001C00001C00001C0000380000380000380000380000700 +000700000703C00707E00E0C600E18E00E31E00E61E01CC1C01F80001F00001FC00039E0 +003870003870003838607070C07070C07070C0703980E03F00601E0013207D9F15>I<03 +C01FC01F8003800380038007000700070007000E000E000E000E001C001C001C001C0038 +003800380038007000700070007180E300E300E300E6007E003C000A207C9F0C>I<1E07 +C0F8003F1FE1FC0033B8730E0063E076070063C03C07006380380700C780780E00070070 +0E000700700E000700700E000E00E01C000E00E01C000E00E01C000E00E038601C01C038 +C01C01C038C01C01C071801C01C031803803803F001801801E0023147D9325>I<1E07C0 +3F1FE033B87063E07063C038638038C780700700700700700700700E00E00E00E00E00E0 +0E01C31C01C61C01C61C038C1C018C3801F81800F018147D931A>I<007C0001FF000383 +800F01C01E01C01C01E03C01E07801E07801E07801E0F003C0F003C0F003C0F00780F007 +00700F00701E003838001FF00007C00013147C9317>I<01C1E007E7F8067E3C0C7C1C0C +781E0C701E18E01E00E01E00E01E00E01E01C03C01C03C01C03C01C07803C07803C07003 +C0E003E3C0077F80071E000700000700000E00000E00000E00000E00001C0000FFC000FF +8000171D809317>I<0E0F003F3F8033F1C063C1C063C3C06383C0C78380070000070000 +0700000E00000E00000E00000E00001C00001C00001C00001C000038000018000012147D +9313>114 D<00FC03FE07070E0F0E0F0E0E1E000F800FF007F803FC003E001E701EF01C +F01CE03860703FE01F8010147D9313>I<018001C0038003800380038007000700FFF0FF +F00E000E000E000E001C001C001C001C0038003800380038307060706070C071803F001E +000C1C7C9B0F>I<0F00601F80703180E031C0E06380E06380E0C381C00701C00701C007 +01C00E03800E03800E03800E038C0E07180E07180E0F180E1F3007F3F003E1C016147D93 +18>I<0F01C01F83C03183E031C1E06380E06380E0C380C00700C00700C00700C00E0180 +0E01800E01800E03000E03000E06000E06000F0C0007F80001E00013147D9315>I<0F00 +60E01F8071E03180E1F031C0E0F06380E0706380E070C381C0600701C0600701C0600701 +C0600E0380C00E0380C00E0380C00E0381800E0381800E0781800E078300070F860007F9 +FC0001F0F8001C147D931E>I<0787800FCFC018F8E03070E06071E06071E0C0E1C000E0 +0000E00000E00001C00001C00001C00071C060F380C0F380C0E38180C7C3007CFE00387C +0013147D9315>I<0F00601F80703180E031C0E06380E06380E0C381C00701C00701C007 +01C00E03800E03800E03800E03800E07000E07000E0F000E1F0007FE0003EE00000E0000 +0E00001C00781C0078380070700060E0003FC0001F0000141D7D9316>I +E /Fn 74 123 df<001FC1F0007FF7F801F07E7C03C0FC7C0780FC7C0F00F8380F007800 +0F0078000F0078000F0078000F0078000F007800FFFFFF80FFFFFF800F0078000F007800 +0F0078000F0078000F0078000F0078000F0078000F0078000F0078000F0078000F007800 +0F0078000F0078000F0078000F0078000F0078007FE3FF807FE3FF801E20809F1B>11 +D<001F8000FFC001E0E003C0F00781F00F01F00F00E00F00000F00000F00000F00000F00 +00FFFFF0FFFFF00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00 +F00F00F00F00F00F00F00F00F00F00F00F00F07FC3FE7FC3FE1720809F19>I<001FB000 +FFF001E1F003C1F00781F00F00F00F00F00F00F00F00F00F00F00F00F00F00F0FFFFF0FF +FFF00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F +00F00F00F00F00F00F00F00F00F07FE7FE7FE7FE1720809F19>I<001FC0FC00007FE7FE +0001F07F070003C0FE07800780FC0F800F00F80F800F007807000F007800000F00780000 +0F007800000F007800000F00780000FFFFFFFF80FFFFFFFF800F007807800F007807800F +007807800F007807800F007807800F007807800F007807800F007807800F007807800F00 +7807800F007807800F007807800F007807800F007807800F007807800F007807807FE3FF +3FF07FE3FF3FF02420809F26>I<070F1F1E3C78F0E0400809779F17>19 +D<7038F87CFC7EFC7E7C3E0C060C060C06180C180C381C3018603040200F0E7F9F17>34 +D<70F8FCFC7C0C0C0C181838306040060E7C9F0D>39 D<006000C001800380070006000E +001C001C003C003800380078007000700070007000F000F000F000F000F000F000F000F0 +00F000F000F000F00070007000700070007800380038003C001C001C000E000600070003 +80018000C000600B2E7CA112>I<C0006000300038001C000C000E000700070007800380 +038003C001C001C001C001C001E001E001E001E001E001E001E001E001E001E001E001E0 +01C001C001C001C003C0038003800780070007000E000C001C00380030006000C0000B2E +7EA112>I<70F8F8F878181818183030606040050E7C840D>44 D<FFF0FFF0FFF00C0380 +8B0F>I<70F8F8F87005057C840D>I<0000400000C0000180000180000180000300000300 +000300000600000600000C00000C00000C00001800001800001800003000003000006000 +00600000600000C00000C00000C000018000018000018000030000030000060000060000 +0600000C00000C00000C0000180000180000300000300000300000600000600000600000 +C00000C00000122D7EA117>I<03F0000FFC001E1E001C0E003807007807807003807003 +80700380F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003 +C0F003C0F003C07003807003807003807807803807001C0E001E1E000FFC0003F000121F +7E9D17>I<00C001C00FC0FFC0F3C003C003C003C003C003C003C003C003C003C003C003 +C003C003C003C003C003C003C003C003C003C003C003C003C07FFF7FFF101E7D9D17>I< +07F0000FFC00383E00700F00600F80F80780FC07C0FC07C0FC03C07803C03003C00007C0 +000780000780000F00001E00001C0000380000700000E00001C0000380000300C00600C0 +0C00C01801C03FFF807FFF80FFFF80FFFF80121E7E9D17>I<03F0000FFC001C1E00300F +00780F807C0F807C07807C0F803C0F80000F00000F00001E00007C0007F00007F000003C +00000E00000F000007800007800007C03007C07807C0FC07C0FC07C0FC0780780F80700F +003C1E001FFC0007F000121F7E9D17>I<000700000700000F00001F00001F00003F0000 +7F0000EF0000CF0001CF00038F00030F00070F000E0F000C0F00180F00380F00300F0060 +0F00E00F00FFFFF0FFFFF0000F00000F00000F00000F00000F00000F0000FFF000FFF014 +1E7F9D17>I<3003003FFF003FFE003FF8003FE000300000300000300000300000300000 +30000031F00037FC003E1E00380F00380F003007800007800007C00007C00007C07807C0 +F807C0F807C0F80780F00780600F00700E00383C001FF80007E000121F7E9D17>I<007C +0001FE000783000E07800C0F801C0F80380700380000780000700000700000F1F800F3FE +00F40E00F80700F80380F80380F003C0F003C0F003C0F003C0F003C07003C07003C07003 +803803803807001C07000E1E0007FC0001F000121F7E9D17>I<6000007FFFE07FFFE07F +FFC07FFFC0E00180C00300C00300C00600000C0000180000180000300000700000600000 +E00000E00001E00001C00001C00003C00003C00003C00003C00007C00007C00007C00007 +C00007C00007C000038000131F7E9D17>I<03F0000FFC001C1E00380700300700700380 +7003807003807803807C07007F07003F8E001FFC000FF80007FC0007FE001EFF00387F80 +701F80700FC0E003C0E003C0E001C0E001C0E001C0F001807003803807001E0E000FFC00 +03F000121F7E9D17>I<03F00007F8001E1C00380E00380700700700700380F00380F003 +80F003C0F003C0F003C0F003C0F003C07007C07007C03807C01C0BC01FF3C007E3C00003 +800003800007800007003807007C0E007C0E00781C003078001FF0000FC000121F7E9D17 +>I<70F8F8F8700000000000000000000070F8F8F87005147C930D>I<70F8F8F870000000 +0000000000000070F8F8F878181818183030606040051D7C930D>I<FFFFFFFCFFFFFFFC +0000000000000000000000000000000000000000000000000000000000000000FFFFFFFC +FFFFFFFC1E0C7E9023>61 D<0003800000038000000380000007C0000007C0000007C000 +000FE000000FE000000FE0000019F0000019F0000019F0000030F8000030F8000030F800 +00607C0000607C0000607C0000C03E0000C03E0000C03E0001FFFF0001FFFF0001801F00 +03000F8003000F8003000F80060007C0060007C01F0007E0FFC03FFEFFC03FFE1F207F9F +22>65 D<FFFFE000FFFFF8000F803E000F801E000F801F000F800F800F800F800F800F80 +0F800F800F800F800F800F000F801F000F803E000F807C000FFFF8000FFFFC000F801F00 +0F800F800F8007C00F8003C00F8003E00F8003E00F8003E00F8003E00F8003E00F8007C0 +0F8007C00F800F800F803F00FFFFFE00FFFFF8001B1F7E9E20>I<000FE010007FF83000 +F80E7003E00370078001F00F0000F01F0000F01E0000703C0000703C0000707C00003078 +000030F8000030F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8 +000000780000307C0000303C0000303C0000301E0000601F0000600F0000C00780018003 +E0030000F80E00007FFC00000FE0001C217E9F21>I<FFFFFF80FFFFFF800F800F800F80 +03800F8003800F8001800F8001C00F8000C00F8000C00F80C0C00F80C0C00F80C0000F80 +C0000F81C0000FFFC0000FFFC0000F81C0000F80C0000F80C0000F80C0600F80C0600F80 +00600F8000C00F8000C00F8000C00F8001C00F8001C00F8003C00F800F80FFFFFF80FFFF +FF801B1F7E9E1F>69 D<FFFFFF80FFFFFF8007C00F8007C0038007C0018007C0018007C0 +01C007C000C007C000C007C060C007C060C007C0600007C0600007C0E00007FFE00007FF +E00007C0E00007C0600007C0600007C0600007C0600007C0000007C0000007C0000007C0 +000007C0000007C0000007C0000007C00000FFFF0000FFFF00001A1F7F9E1E>I<000FE0 +10007FF83000F80E7003E00370078001F00F0000F01F0000F01E0000703C0000703C0000 +707C00003078000030F8000030F8000000F8000000F8000000F8000000F8000000F80000 +00F8007FFEF8007FFE780001F07C0001F03C0001F03C0001F01E0001F01F0001F00F0001 +F007C001F003E003F000FC0E70007FFC10000FF0001F217E9F24>I<FFF8FFF8FFF8FFF8 +0F800F800F800F800F800F800F800F800F800F800F800F800F800F800F800F800F800F80 +0F800F800F800F800F800F800FFFFF800FFFFF800F800F800F800F800F800F800F800F80 +0F800F800F800F800F800F800F800F800F800F800F800F800F800F800F800F800F800F80 +FFF8FFF8FFF8FFF81D1F7E9E22>I<FFF8FFF80F800F800F800F800F800F800F800F800F +800F800F800F800F800F800F800F800F800F800F800F800F800F800F800F800F800F800F +80FFF8FFF80D1F7F9E10>I<FFFC00FFFC000F80000F80000F80000F80000F80000F8000 +0F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F8006 +0F80060F80060F80060F800E0F800E0F800C0F801C0F803C0F80FCFFFFFCFFFFFC171F7E +9E1C>76 D<FFC0000FFEFFE0001FFE07E0001FC007E0001FC006F00037C006F00037C006 +F00037C006780067C006780067C006780067C0063C00C7C0063C00C7C0063C00C7C0061E +0187C0061E0187C0060F0307C0060F0307C0060F0307C006078607C006078607C0060786 +07C00603CC07C00603CC07C00603CC07C00601F807C00601F807C00601F807C00600F007 +C00F00F007C0FFF0F0FFFEFFF060FFFE271F7F9E2A>I<FF801FF8FFC01FF80FE003C00F +E001800DF001800DF001800CF801800CFC01800C7C01800C3E01800C3F01800C1F01800C +0F81800C0FC1800C07C1800C07E1800C03E1800C01F1800C01F9800C00F9800C007D800C +007F800C003F800C001F800C001F800C000F800C000F800C0007801E000380FFC00380FF +C001801D1F7E9E22>I<001FE000007FF80001F03E0003C00F00078007800F0003C01E00 +01E03E0001F03C0000F07C0000F87C0000F878000078F800007CF800007CF800007CF800 +007CF800007CF800007CF800007CF800007CF800007C7C0000F87C0000F87C0000F83C00 +00F03E0001F01E0001E00F0003C00780078003C00F0001F03E00007FF800001FE0001E21 +7E9F23>I<FFFFE000FFFFF8000F803E000F801F000F800F800F8007800F8007C00F8007 +C00F8007C00F8007C00F8007C00F8007800F800F800F801F000F803E000FFFF8000FFFE0 +000F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8000 +000F8000000F8000000F800000FFF80000FFF800001A1F7E9E1F>I<FFFF8000FFFFF000 +0F807C000F803E000F801F000F800F000F800F800F800F800F800F800F800F800F800F00 +0F801F000F803E000F807C000FFFF0000FFFE0000F81F8000F807C000F807C000F803E00 +0F803E000F803E000F803E000F803E000F803E000F803E000F803E0C0F803E0C0F801F0C +FFF80F18FFF807F8000001F01E207E9E21>82 D<03F0400FFCC01E0FC03807C07803C070 +01C0F001C0F000C0F000C0F000C0F80000FC00007F00007FF0003FFE001FFF000FFF8003 +FFC0007FE00007E00003F00001F00000F0C000F0C000F0C000F0E000E0E000E0F001E0F8 +01C0FE0780C7FF0081FC0014217E9F19>I<7FFFFFE07FFFFFE07C0F81E0700F80E0600F +8060600F8060E00F8070C00F8030C00F8030C00F8030C00F8030000F8000000F8000000F +8000000F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8000000F +8000000F8000000F8000000F8000000F8000000F8000000F800003FFFE0003FFFE001C1F +7E9E21>I<FFF81FF8FFF81FF80F8003C00F8001800F8001800F8001800F8001800F8001 +800F8001800F8001800F8001800F8001800F8001800F8001800F8001800F8001800F8001 +800F8001800F8001800F8001800F8001800F8001800F8001800F80018007800300078003 +0003C0030003C0060001E00C0000F83800003FF000000FC0001D207E9E22>I<FFF807FE +FFF807FE0F8000F00F8000E007C000C007C000C007C000C003E0018003E0018003F00180 +01F0030001F0030001F8070000F8060000F8060000FC0E00007C0C00007C0C00003E1800 +003E1800003E1800001F3000001F3000001FB000000FE000000FE000000FE0000007C000 +0007C0000003800000038000000380001F207F9E22>I<FFF8FFF83FF0FFF8FFF83FF01F +800F8007800F800F8003000F8007C003000FC007C0070007C007C0060007C00FE0060007 +E00FE00E0003E00FE00C0003E01FF00C0003E019F00C0001F019F0180001F019F0180001 +F030F8180000F830F8300000F830F8300000F8607C3000007C607C6000007C607C600000 +7CC03E6000007EC03EE000003EC03EC000003FC03FC000003F801FC000001F801F800000 +1F801F8000001F000F8000000F000F0000000F000F0000000E000700000006000600002C +207F9E2F>I<FFFFC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 +C0C0C0C0C0C0C0C0C0C0C0C0C0FFFF082D7CA10D>91 D<0804180C3018703860306030C0 +60C060C060F87CFC7EFC7E7C3E381C0F0E7A9F17>I<FFFF030303030303030303030303 +0303030303030303030303030303030303030303030303030303030303FFFF082D80A10D +>I<0FE0003FF8007C3C007C1E007C0F00380F00000F00000F0001FF000FCF003E0F0078 +0F00780F00F00F30F00F30F00F30F01F30783FF03FC7E00F83C014147E9317>97 +D<1E0000FE0000FE00001E00001E00001E00001E00001E00001E00001E00001E00001E00 +001E3F001EFFC01FC1E01F00F01E00701E00781E00381E003C1E003C1E003C1E003C1E00 +3C1E003C1E00381E00781E00701F00F01D83E01CFF80183E0016207F9F19>I<01F80007 +FE001E1F003C1F00381F00780E00700000F00000F00000F00000F00000F00000F0000078 +00007800003C01803C03801F070007FE0001F80011147F9314>I<0001E0000FE0000FE0 +0001E00001E00001E00001E00001E00001E00001E00001E00001E003F1E007FDE01F07E0 +3C03E03801E07801E07001E0F001E0F001E0F001E0F001E0F001E0F001E07001E07801E0 +3801E03C03E01E0FE00FFDFC03F1FC16207F9F19>I<03F0000FFC001E1E003C0F003807 +00780700700380F00380FFFF80FFFF80F00000F00000F000007000007800003801803C03 +801F070007FE0001F80011147F9314>I<003E0000FF0003CF80078F80078F800F07000F +00000F00000F00000F00000F00000F0000FFF000FFF0000F00000F00000F00000F00000F +00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00007F +F0007FF0001120809F0E>I<0000E003E3F00FFE701C1C70380E60780F00780F00780F00 +780F00780F00380E001C1C001FF80033E0002000003000003000003FFE003FFF801FFFC0 +1FFFE07001E06000F0E00070E00070E000707000E07801E03E07C00FFF0003FC00141F7F +9417>I<1E0000FE0000FE00001E00001E00001E00001E00001E00001E00001E00001E00 +001E00001E1F001E7F801EC3C01F81E01F01E01E01E01E01E01E01E01E01E01E01E01E01 +E01E01E01E01E01E01E01E01E01E01E01E01E01E01E0FFC7FCFFC7FC16207F9F19>I<1C +003E003E003E001C000000000000000000000000001E00FE00FE001E001E001E001E001E +001E001E001E001E001E001E001E001E001E001E00FFC0FFC00A1F7F9E0D>I<007000F8 +00F800F80070000000000000000000000000007807F807F800F800780078007800780078 +007800780078007800780078007800780078007800780078007800787078F878F8F0F9E0 +7FC03F000D28839E0E>I<1E0000FE0000FE00001E00001E00001E00001E00001E00001E +00001E00001E00001E00001E1FF01E1FF01E0F801E0E001E0C001E18001E30001E70001E +F0001FF8001F78001E3C001E3E001E1E001E1F001E0F801E07801E07C0FFCFF8FFCFF815 +207F9F18>I<1E00FE00FE001E001E001E001E001E001E001E001E001E001E001E001E00 +1E001E001E001E001E001E001E001E001E001E001E001E001E001E001E00FFC0FFC00A20 +7F9F0D>I<1E1F80FC00FE7FC3FE00FEC1E60F001F80FC07801F00F807801E00F007801E +00F007801E00F007801E00F007801E00F007801E00F007801E00F007801E00F007801E00 +F007801E00F007801E00F007801E00F007801E00F00780FFC7FE3FF0FFC7FE3FF024147F +9327>I<1E1F00FE7F80FEC3C01F81E01F01E01E01E01E01E01E01E01E01E01E01E01E01 +E01E01E01E01E01E01E01E01E01E01E01E01E01E01E0FFC7FCFFC7FC16147F9319>I<01 +F80007FE001E07803C03C03801C07000E07000E0F000F0F000F0F000F0F000F0F000F0F0 +00F07000E07801E03801C03C03C01E078007FE0001F80014147F9317>I<1E3F00FEFFC0 +FFC3E01F00F01E00701E00781E00781E003C1E003C1E003C1E003C1E003C1E003C1E0078 +1E00781E00F01F00F01F83E01EFF801E3E001E00001E00001E00001E00001E00001E0000 +1E0000FFC000FFC000161D7F9319>I<01F06007FCE01F0EE03C03E03C03E07801E07801 +E0F001E0F001E0F001E0F001E0F001E0F001E07801E07801E03803E03C03E01F0FE00FFD +E003F1E00001E00001E00001E00001E00001E00001E00001E0000FFC000FFC161D7F9318 +>I<1E78FEFCFF9E1F1E1F0C1F001E001E001E001E001E001E001E001E001E001E001E00 +1E00FFE0FFE00F147F9312>I<0FC83FF870386018E018E018F000FF807FE03FF81FFC01 +FC003EC00EC00EE00EE00CF83CDFF887E00F147F9312>I<06000600060006000E000E00 +1E003E00FFF8FFF81E001E001E001E001E001E001E001E001E001E001E0C1E0C1E0C1E0C +1E0C0F1807F003E00E1C7F9B12>I<1E01E0FE0FE0FE0FE01E01E01E01E01E01E01E01E0 +1E01E01E01E01E01E01E01E01E01E01E01E01E01E01E01E01E03E01E03E00E0DE007F9FC +03F1FC16147F9319>I<FFC7F8FFC7F81E01E01F01C00F01800F01800783000783000783 +0003C60003C60003C60001EC0001EC0001FC0000F80000F8000070000070000070001514 +7F9318>I<FF9FF3FCFF9FF3FC1E03C0F01E03C0601F03C0E00F07C0C00F07E0C00F87E1 +C0078CE180078CF18007CCF38003D8730003D87B0003F87F0001F03E0001F03E0001F03E +0000E01C0000E01C0000E01C001E147F9321>I<7FE7FC7FE7FC0F83E007838003C30003 +E70001EE0000FC00007800007800003C00007E0000FE0001CF000187800387800703C00F +03E0FF87FEFF87FE1714809318>I<FFC7F8FFC7F81E01E01F01C00F01800F0180078300 +07830007830003C60003C60003C60001EC0001EC0001FC0000F80000F800007000007000 +00700000600000600000600070C000F8C000C18000E380007F00003C0000151D7F9318> +I<7FFF7FFF781E703E603C607860F861F001E003E007C007830F831F031E073C067C0678 +1EFFFEFFFE10147F9314>I E /Fo 41 122 df<0001FF0000001FFFC000007F81E00000 +FC01E00001F807F00003F807F00007F007F00007F007F00007F007F00007F007F00007F0 +01C00007F000000007F000000007F000000007F03FF800FFFFFFF800FFFFFFF800FFFFFF +F80007F003F80007F003F80007F003F80007F003F80007F003F80007F003F80007F003F8 +0007F003F80007F003F80007F003F80007F003F80007F003F80007F003F80007F003F800 +07F003F80007F003F80007F003F80007F003F80007F003F80007F003F80007F003F8007F +FF3FFF807FFF3FFF807FFF3FFF80212A7FA925>12 D<000E00001E00007E0007FE00FFFE +00FFFE00F8FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE +0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE +0000FE0000FE0000FE0000FE0000FE0000FE0000FE00FFFFFEFFFFFEFFFFFE17277BA622 +>49 D<00FF800007FFF0001FFFFC003E07FE007E01FF807F007F80FF807FC0FF803FC0FF +803FE0FF801FE0FF801FE07F001FE03E003FE000003FE000003FC000003FC000007F8000 +007F000000FE000000FC000001F8000003F0000007C000000F8000001F0000003C000000 +7800E0007000E000E000E001C001C0030001C0060001C00FFFFFC01FFFFFC03FFFFFC07F +FFFFC0FFFFFF80FFFFFF80FFFFFF801B277DA622>I<007F800003FFF00007FFFC000F81 +FE001F00FF001F80FF003FC07F803FC07F803FC07F803FC07F801FC07F800F80FF000000 +FF000000FE000001FC000003F8000007F00000FF800000FFC0000001F8000000FE000000 +7F0000007F8000003FC000003FC000003FE01C003FE07F003FE07F003FE0FF803FE0FF80 +3FE0FF803FC0FF803FC07F007F807E00FF003F01FE001FFFFC0007FFF00000FF80001B27 +7DA622>I<00000F0000000F0000001F0000003F0000007F000000FF000001FF000001FF +000003BF0000073F00000E3F00001C3F00003C3F0000383F0000703F0000E03F0001C03F +0003803F0007803F0007003F000E003F001C003F0038003F0070003F00F0003F00FFFFFF +F8FFFFFFF8FFFFFFF800007F0000007F0000007F0000007F0000007F0000007F0000007F +0000007F00001FFFF8001FFFF8001FFFF81D277EA622>I<180003001F801F001FFFFE00 +1FFFFC001FFFF8001FFFF0001FFFE0001FFF80001FFE00001C0000001C0000001C000000 +1C0000001C0000001C0000001C7FC0001DFFF8001F80FC001E003F0008003F0000001F80 +00001FC000001FC000001FE000001FE03C001FE07E001FE0FF001FE0FF001FE0FF001FE0 +FF001FC0FE001FC07C003F8078003F803C007F001F01FE000FFFFC0003FFF00000FF8000 +1B277DA622>I<0007F800003FFE0000FFFF0001FC0F8003F00F8007E01FC00FC03FC01F +803FC01F803FC03F803FC03F001F807F000F007F0000007F000000FF020000FF1FF000FF +3FFC00FF603E00FFC03F00FF801F80FF801FC0FF801FC0FF001FC0FF001FE0FF001FE0FF +001FE07F001FE07F001FE07F001FE07F001FE03F001FE03F001FC01F801FC01F801F800F +C03F0007E07E0003FFFC0001FFF800003FC0001B277DA622>I<380000003E0000003FFF +FFF03FFFFFF03FFFFFF07FFFFFE07FFFFFC07FFFFF807FFFFF0070000E0070000E007000 +1C00E0003800E0007000E000E0000001C0000001C0000003800000078000000F8000000F +0000001F0000001F0000003F0000003F0000007E0000007E0000007E000000FE000000FE +000000FE000000FE000001FE000001FE000001FE000001FE000001FE000001FE000001FE +000000FC0000007800001C297CA822>I<00000780000000000780000000000FC0000000 +000FC0000000000FC0000000001FE0000000001FE0000000003FF0000000003FF0000000 +003FF00000000077F80000000077F800000000F7FC00000000E3FC00000000E3FC000000 +01C1FE00000001C1FE00000003C1FF0000000380FF0000000380FF00000007007F800000 +07007F8000000F007FC000000E003FC000000E003FC000001C001FE000001C001FE00000 +3FFFFFF000003FFFFFF000003FFFFFF00000700007F80000700007F80000F00007FC0000 +E00003FC0001E00003FE0001C00001FE0001C00001FE0003C00001FF00FFFE003FFFFCFF +FE003FFFFCFFFE003FFFFC2E297EA833>65 D<FFFFFFFFE0FFFFFFFFE0FFFFFFFFE003FC +001FE003FC0007F003FC0001F003FC0001F003FC0000F003FC00007003FC00007003FC00 +007003FC01C07803FC01C03803FC01C03803FC01C03803FC03C00003FC03C00003FC0FC0 +0003FFFFC00003FFFFC00003FFFFC00003FC0FC00003FC03C00003FC03C00003FC01C00E +03FC01C00E03FC01C00E03FC01C01C03FC00001C03FC00001C03FC00001C03FC00003C03 +FC00003803FC00007803FC0000F803FC0001F803FC0003F803FC001FF8FFFFFFFFF0FFFF +FFFFF0FFFFFFFFF027297EA82C>69 D<FFFFFFFFC0FFFFFFFFC0FFFFFFFFC003FC003FC0 +03FC000FE003FC0003E003FC0001E003FC0001E003FC0000E003FC0000E003FC0000E003 +FC0000F003FC01C07003FC01C07003FC01C07003FC01C00003FC03C00003FC03C00003FC +0FC00003FFFFC00003FFFFC00003FFFFC00003FC0FC00003FC03C00003FC03C00003FC01 +C00003FC01C00003FC01C00003FC01C00003FC00000003FC00000003FC00000003FC0000 +0003FC00000003FC00000003FC00000003FC00000003FC000000FFFFFC0000FFFFFC0000 +FFFFFC000024297EA82A>I<FFFFF0FFFFF0FFFFF003FC0003FC0003FC0003FC0003FC00 +03FC0003FC0003FC0003FC0003FC0003FC0003FC0003FC0003FC0003FC0003FC0003FC00 +03FC0003FC0003FC0003FC0003FC0003FC0003FC0003FC0003FC0003FC0003FC0003FC00 +03FC0003FC0003FC0003FC0003FC0003FC00FFFFF0FFFFF0FFFFF014297EA819>73 +D<FFFFFC0000FFFFFC0000FFFFFC000003FC00000003FC00000003FC00000003FC000000 +03FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003 +FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC +00000003FC00000003FC00000003FC0001C003FC0001C003FC0001C003FC0001C003FC00 +03C003FC00038003FC00038003FC00078003FC00078003FC000F8003FC000F8003FC001F +8003FC007F8003FC01FF00FFFFFFFF00FFFFFFFF00FFFFFFFF0022297EA828>76 +D<FFFE0000003FFF80FFFE0000003FFF80FFFF0000007FFF8003FF0000007FE00003FF00 +00007FE00003BF800000EFE00003BF800000EFE000039FC00001CFE000039FC00001CFE0 +00038FE000038FE000038FE000038FE000038FE000038FE0000387F000070FE0000387F0 +00070FE0000383F8000E0FE0000383F8000E0FE0000381FC001C0FE0000381FC001C0FE0 +000381FC001C0FE0000380FE00380FE0000380FE00380FE00003807F00700FE00003807F +00700FE00003803F80E00FE00003803F80E00FE00003803F80E00FE00003801FC1C00FE0 +0003801FC1C00FE00003800FE3800FE00003800FE3800FE000038007F7000FE000038007 +F7000FE000038007F7000FE000038003FE000FE000038003FE000FE000038001FC000FE0 +00038001FC000FE000038000F8000FE000FFFE00F803FFFF80FFFE00F803FFFF80FFFE00 +7003FFFF8039297DA840>I<FFFFFFF800FFFFFFFF00FFFFFFFFC003FC003FE003FC000F +F003FC0007F803FC0007FC03FC0003FC03FC0003FE03FC0003FE03FC0003FE03FC0003FE +03FC0003FE03FC0003FE03FC0003FE03FC0003FC03FC0007FC03FC0007F803FC000FF003 +FC003FE003FFFFFF8003FFFFFE0003FC00000003FC00000003FC00000003FC00000003FC +00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00 +000003FC00000003FC00000003FC00000003FC000000FFFFF00000FFFFF00000FFFFF000 +0027297EA82E>80 D<00FF806003FFF0E00FFFF9E01F80FFE03F001FE03E0007E07C0003 +E07C0003E0FC0001E0FC0001E0FC0000E0FE0000E0FE0000E0FF000000FFC000007FFC00 +007FFFE0003FFFF8001FFFFE001FFFFF0007FFFF8003FFFFC000FFFFC0000FFFE000007F +E000001FF000000FF0000007F0E00003F0E00003F0E00003F0E00003F0F00003E0F00003 +E0F80007E0FC0007C0FF000F80FFE03F80F3FFFE00E1FFFC00C01FF0001C297CA825>83 +D<7FFFFFFFFF807FFFFFFFFF807FFFFFFFFF807F807F807F807C007F800F8078007F8007 +8078007F80078070007F800380F0007F8003C0F0007F8003C0E0007F8001C0E0007F8001 +C0E0007F8001C0E0007F8001C0E0007F8001C000007F80000000007F80000000007F8000 +0000007F80000000007F80000000007F80000000007F80000000007F80000000007F8000 +0000007F80000000007F80000000007F80000000007F80000000007F80000000007F8000 +0000007F80000000007F80000000007F80000000007F80000000007F80000000007F8000 +0000007F80000000FFFFFFC00000FFFFFFC00000FFFFFFC0002A287EA72F>I<FFFFF000 +7FFFFFFFF0007FFFFFFFF0007FFF03FE000001C001FE0000038001FE0000038001FF0000 +078000FF0000070000FF80000F00007F80000E00007FC0000E00003FC0001C00003FC000 +1C00003FE0003C00001FE0003800001FF0007800000FF0007000000FF80070000007F800 +E0000007F800E0000003FC01C0000003FC01C0000003FE03C0000001FE0380000001FF07 +80000000FF0700000000FF87000000007F8E000000007F8E000000007FDE000000003FDC +000000003FFC000000001FF8000000001FF8000000000FF0000000000FF0000000000FF0 +0000000007E00000000007E00000000003C00000000003C0000030297FA833>86 +D<01FF80000FFFF0001F81FC003FC0FE003FC07F003FC03F003FC03F801F803F800F003F +8000003F8000003F800000FF80007FFF8003FFFF800FF03F801FC03F803F803F807F003F +80FE003F80FE003F80FE003F80FE003F80FE007F807F00DF803F839FFC1FFF0FFC03FC03 +FC1E1B7E9A21>97 D<FFE00000FFE00000FFE000000FE000000FE000000FE000000FE000 +000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE1FE +000FEFFF800FFE0FE00FF803F00FF001F80FE001FC0FE000FC0FE000FE0FE000FE0FE000 +FF0FE000FF0FE000FF0FE000FF0FE000FF0FE000FF0FE000FF0FE000FF0FE000FE0FE000 +FE0FE000FE0FE001FC0FE001FC0FF001F80FF803F00F9C0FE00F0FFF800E01FC00202A7E +A925>I<003FE00001FFFC0003F07E000FC0FF001FC0FF003F80FF003F80FF007F007E00 +7F003C007F000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000 +7F0000007F0000007F8000003F8003803F8003801FC007000FE00E0003F83C0001FFF800 +003FC000191B7E9A1E>I<00007FF000007FF000007FF0000007F0000007F0000007F000 +0007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F000 +3F87F001FFF7F007F03FF00FC00FF01F8007F03F8007F03F8007F07F0007F07F0007F07F +0007F0FF0007F0FF0007F0FF0007F0FF0007F0FF0007F0FF0007F0FF0007F0FF0007F07F +0007F07F0007F03F0007F03F8007F01F800FF00FC01FF007F07FFF01FFE7FF007F87FF20 +2A7EA925>I<003FC00001FFF00003F0FC000FC03E001F803F001F801F003F801F807F00 +1F807F001FC07F000FC0FF000FC0FF000FC0FFFFFFC0FFFFFFC0FF000000FF000000FF00 +00007F0000007F0000007F0000003F8001C01F8001C00FC0038007C0070003F01E0000FF +FC00003FE0001A1B7E9A1F>I<0003F800001FFE00007E3F0001FC3F8001F87F8003F87F +8007F07F8007F03F0007F03F0007F0000007F0000007F0000007F0000007F0000007F000 +00FFFFC000FFFFC000FFFFC00007F0000007F0000007F0000007F0000007F0000007F000 +0007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F000 +0007F0000007F0000007F0000007F0000007F0000007F000007FFF80007FFF80007FFF80 +00192A7EA915>I<00FF81F003FFE7F80FC1FE1C1F80FC7C3F007E7C3F007E387F007F00 +7F007F007F007F007F007F007F007F007F007F003F007E003F007E001F80FC000FC1F800 +1FFFE00018FF800038000000380000003C0000003E0000003FFFF8003FFFFF001FFFFFC0 +0FFFFFE007FFFFF01FFFFFF03E0007F07C0001F8F80000F8F80000F8F80000F8F80000F8 +7C0001F07C0001F03F0007E00FC01F8007FFFF00007FF0001E287E9A22>I<FFE00000FF +E00000FFE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000F +E000000FE000000FE000000FE000000FE000000FE0FE000FE3FF800FE70FC00FEC0FE00F +F807E00FF807F00FF007F00FF007F00FE007F00FE007F00FE007F00FE007F00FE007F00F +E007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00F +E007F00FE007F0FFFE3FFFFFFE3FFFFFFE3FFF202A7DA925>I<07000F801FC03FE03FE0 +3FE01FC00F8007000000000000000000000000000000FFE0FFE0FFE00FE00FE00FE00FE0 +0FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0FFFE +FFFEFFFE0F2B7EAA12>I<FFE00000FFE00000FFE000000FE000000FE000000FE000000F +E000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000F +E01FFC0FE01FFC0FE01FFC0FE007800FE00F000FE01E000FE03C000FE078000FE0E0000F +E3C0000FE7C0000FEFE0000FFFF0000FFFF8000FF3F8000FE1FC000FC0FE000FC07F000F +C07F000FC03F800FC01FC00FC00FE00FC00FE00FC007F0FFFC1FFFFFFC1FFFFFFC1FFF20 +2A7FA923>107 D<FFE0FFE0FFE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0 +0FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0 +0FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2A7EA912>I<FFC07F001FC000FFC1 +FFC07FF000FFC707E1C1F8000FCC07F301FC000FD803F600FC000FD803FE00FE000FF003 +FC00FE000FF003FC00FE000FE003F800FE000FE003F800FE000FE003F800FE000FE003F8 +00FE000FE003F800FE000FE003F800FE000FE003F800FE000FE003F800FE000FE003F800 +FE000FE003F800FE000FE003F800FE000FE003F800FE000FE003F800FE000FE003F800FE +000FE003F800FE000FE003F800FE00FFFE3FFF8FFFE0FFFE3FFF8FFFE0FFFE3FFF8FFFE0 +331B7D9A38>I<FFC0FE00FFC3FF80FFC70FC00FCC0FE00FD807E00FD807F00FF007F00F +F007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00F +E007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F0FFFE3FFFFF +FE3FFFFFFE3FFF201B7D9A25>I<003FE00001FFFC0003F07E000FC01F801F800FC03F80 +0FE03F0007E07F0007F07F0007F07F0007F0FF0007F8FF0007F8FF0007F8FF0007F8FF00 +07F8FF0007F8FF0007F8FF0007F87F0007F07F0007F03F800FE03F800FE01F800FC00FC0 +1F8007F07F0001FFFC00003FE0001D1B7E9A22>I<FFE1FE00FFEFFF80FFFE0FE00FF807 +F00FF003F80FE001FC0FE001FC0FE001FE0FE000FE0FE000FF0FE000FF0FE000FF0FE000 +FF0FE000FF0FE000FF0FE000FF0FE000FF0FE000FE0FE001FE0FE001FE0FE001FC0FE003 +FC0FF003F80FF807F00FFC1FE00FEFFF800FE1FC000FE000000FE000000FE000000FE000 +000FE000000FE000000FE000000FE000000FE00000FFFE0000FFFE0000FFFE000020277E +9A25>I<FFC1F0FFC7FCFFCE3E0FDC7F0FD87F0FF07F0FF07F0FF03E0FE0000FE0000FE0 +000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0 +000FE000FFFF00FFFF00FFFF00181B7F9A1B>114 D<03FE300FFFF03E03F07800F07000 +F0F00070F00070F80070FE0000FFE0007FFF007FFFC03FFFE01FFFF007FFF800FFF80007 +FC0000FCE0007CE0003CF0003CF00038F80038FC0070FF01E0F7FFC0C1FF00161B7E9A1B +>I<00E00000E00000E00000E00001E00001E00001E00003E00003E00007E0000FE0001F +FFE0FFFFE0FFFFE00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000F +E0000FE0000FE0000FE0000FE0700FE0700FE0700FE0700FE0700FE0700FE07007F0E003 +F0C001FF80007F0014267FA51A>I<FFE07FF0FFE07FF0FFE07FF00FE007F00FE007F00F +E007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00F +E007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE00FF00FE00FF007 +E01FF003F077FF01FFE7FF007F87FF201B7D9A25>I<FFFC03FFFFFC03FFFFFC03FF0FF0 +00F007F000E007F800E003F801C003F801C003FC03C001FC038001FE078000FE070000FF +0700007F0E00007F0E00007F9E00003F9C00003FFC00001FF800001FF800000FF000000F +F000000FF0000007E0000007E0000003C0000003C000201B7F9A23>I<FFFC7FFC1FFCFF +FC7FFC1FFCFFFC7FFC1FFC0FE00FE001C007F007E0038007F007E0038007F807F0078003 +F807F0070003F80FF8070003FC0FF80F0001FC0FF80E0001FC1FFC0E0000FE1CFC1C0000 +FE1CFE1C0000FF387E3C00007F387E3800007F787F3800003FF03F7000003FF03FF00000 +3FE01FF000001FE01FE000001FE01FE000000FC00FC000000FC00FC000000F8007C00000 +07800780000007800780002E1B7F9A31>I<FFFC1FFEFFFC1FFEFFFC1FFE07F0038003F8 +078003FC0F0001FE1E0000FE3C00007F3800007FF800003FF000001FE000000FE000000F +F0000007F800000FF800001FFC00003CFE000038FF0000787F0000F03F8001E01FC003C0 +1FE003800FE0FFF03FFFFFF03FFFFFF03FFF201B7F9A23>I<FFFC03FFFFFC03FFFFFC03 +FF0FF000F007F000E007F800E003F801C003F801C003FC03C001FC038001FE078000FE07 +0000FF0700007F0E00007F0E00007F9E00003F9C00003FFC00001FF800001FF800000FF0 +00000FF000000FF0000007E0000007E0000003C0000003C0000003800000038000000780 +00380700007C0F0000FE0E0000FE1E0000FE1C0000FE38000074F000003FE000000F8000 +0020277F9A23>I E /Fp 39 127 df<007E0001C1800301800703C00E03C00E01800E00 +000E00000E00000E00000E0000FFFFC0FFFFC00E01C00E01C00E01C00E01C00E01C00E01 +C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C07F87F87F87F8151D809C17 +>12 D<FC00FC001C001C001C001C001C001C001C001C001C001C001C001C001C001C00FF +80FF8009127F910C>16 D<070F0F1C3870E0400808789C15>19 D<1C001E000780038003 +800380FF00800009087B7E12>24 D<70F8F8F87005057D840C>46 +D<07C01FF0387C603C601EF01FF81FF80FF80F700F001F001E001E003C0038007000E000 +C00180030006000C031803100320067FFEFFFEFFFE101C7E9B15>50 +D<00060000000F0000000F0000000F0000001F8000001F8000001F8000003FC0000033C0 +000033C0000073E0000061E0000061E00000E1F00000C0F00000C0F00001C0F800018078 +0001FFF80003FFFC0003003C0003003C0007003E0006001E0006001E000E001F001E000F +00FF807FF0FF807FF01C1D7F9C1F>65 D<001F808000FFE18001F03B8007C00F800F0007 +801F0007801E0003803C0003807C0001807C00018078000180F8000000F8000000F80000 +00F8000000F8000000F8000000F8000000F8000000780001807C0001807C0001803C0001 +801E0003001F0003000F00060007C00C0001F0380000FFF000001FC000191E7E9C1E>67 +D<FFFFFCFFFFFC0F007C0F001C0F000C0F000E0F00060F03060F03060F03060F03000F07 +000FFF000FFF000F07000F03000F03000F03030F03030F00030F00060F00060F00060F00 +0E0F001E0F007CFFFFFCFFFFFC181C7E9B1C>69 D<FFF0FFF00F000F000F000F000F000F +000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F +00FFF0FFF00C1C7F9B0F>73 D<FFF800FFF8000F00000F00000F00000F00000F00000F00 +000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00180F00180F00 +180F00180F00380F00300F00700F00F00F01F0FFFFF0FFFFF0151C7E9B1A>76 +D<003F800000E0E0000380380007001C000E000E001E000F003C0007803C0007807C0007 +C0780003C0780003C0F80003E0F80003E0F80003E0F80003E0F80003E0F80003E0F80003 +E0F80003E0780003C07C0007C07C0007C03C0007803E000F801E000F000F001E0007001C +000380380000E0E000003F80001B1E7E9C20>79 D<FFFF80FFFFE00F01F00F00780F003C +0F003E0F003E0F003E0F003E0F003E0F003C0F003C0F00780F01F00FFFC00F00000F0000 +0F00000F00000F00000F00000F00000F00000F00000F00000F0000FFF000FFF000171C7E +9B1C>I<7FFFFFC07FFFFFC0780F03C0700F01C0600F00C0E00F00E0C00F0060C00F0060 +C00F0060C00F0060000F0000000F0000000F0000000F0000000F0000000F0000000F0000 +000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000 +03FFFC0003FFFC001B1C7F9B1E>84 D<0FE0001838003C1C003C0E00180E00000E00000E +0001FE000F8E003C0E00780E00700E00F00E60F00E60F00E60701E603827C00FC3801312 +7F9115>97 D<FC0000FC00001C00001C00001C00001C00001C00001C00001C00001C0000 +1C00001CFC001F87001E03801C01C01C01E01C00E01C00F01C00F01C00F01C00F01C00F0 +1C00F01C00E01C01E01C01C01E03801B070018FC00141D7F9C17>I<03F80E0C1C1E381E +780C7000F000F000F000F000F000F0007000780638061C0C0E1803E00F127F9112>I<00 +1F80001F8000038000038000038000038000038000038000038000038000038003F3800E +0F801C0780380380780380700380F00380F00380F00380F00380F00380F0038070038078 +03803803801C07800E1BF003F3F0141D7F9C17>I<07E00C301818381C701E700EF00EFF +FEF000F000F000F000700070063806180C0E1803E00F127F9112>I<00F8018C071E061E +0E0C0E000E000E000E000E000E00FFE0FFE00E000E000E000E000E000E000E000E000E00 +0E000E000E000E000E007FE07FE00F1D809C0D>I<00038007E4C00C39C0381DC0381C00 +781E00781E00781E00781E00381C00381C001C300037E0002000003000003000003FF800 +1FFF001FFF803003806001C0C000C0C000C0C000C06001803003001C0E0007F800121C7F +9215>I<FC0000FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00 +001C7C001C87001D03001E03801C03801C03801C03801C03801C03801C03801C03801C03 +801C03801C03801C03801C0380FF9FF0FF9FF0141D7F9C17>I<38007C007C007C003800 +000000000000000000000000FC00FC001C001C001C001C001C001C001C001C001C001C00 +1C001C001C001C00FF80FF80091D7F9C0C>I<01C003E003E003E001C000000000000000 +000000000007E007E000E000E000E000E000E000E000E000E000E000E000E000E000E000 +E000E000E000E000E000E060E0F0C0F1C061803E000B25839C0D>I<FC00FC001C001C00 +1C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00 +1C001C001C001C001C00FF80FF80091D7F9C0C>108 D<FC7E07E000FC838838001D0190 +18001E01E01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C +001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C00FF8FF8FF80 +FF8FF8FF8021127F9124>I<FC7C00FC87001D03001E03801C03801C03801C03801C0380 +1C03801C03801C03801C03801C03801C03801C03801C0380FF9FF0FF9FF014127F9117> +I<03F0000E1C00180600380700700380700380F003C0F003C0F003C0F003C0F003C0F003 +C07003807003803807001C0E000E1C0003F00012127F9115>I<FCFC00FF87001E03801C +01C01C01E01C00E01C00F01C00F01C00F01C00F01C00F01C00F01C01E01C01E01C01C01E +03801F07001CFC001C00001C00001C00001C00001C00001C0000FF8000FF8000141A7F91 +17>I<03F1800E19801C0780380780780380780380F00380F00380F00380F00380F00380 +F003807003807803803807801C07800E1B8003E380000380000380000380000380000380 +000380001FF0001FF0141A7F9116>I<FCE0FD381E781E781C301C001C001C001C001C00 +1C001C001C001C001C001C00FFC0FFC00D127F9110>I<1F9020F04070C030C030E030F8 +007F803FE00FF000F8C038C018C018E018E010D0608FC00D127F9110>I<0C000C000C00 +0C000C000C001C001C003FE0FFE01C001C001C001C001C001C001C001C001C301C301C30 +1C301C300C200E6003C00C1A7F9910>I<FC1F80FC1F801C03801C03801C03801C03801C +03801C03801C03801C03801C03801C03801C03801C03801C07800C07800E1BF003E3F014 +127F9117>I<FF0FE0FF0FE01C07801C03000E06000E06000E0600070C00070C00070C00 +03980003980003F80001F00001F00000E00000E00000E00013127F9116>I<FF3FCFE0FF +3FCFE03C0F07801C0F03001C1B03001C1B87000E1B86000E3B86000E3186000731CC0007 +31CC000760CC0003E0F80003E0F80003C0780003C0780001C0700001C070001B127F911E +>I<7F8FF07F8FF00F0780070600038E0001DC0001D80000F00000700000780000F80001 +DC00038E00030E000607000F0380FF0FF8FF0FF81512809116>I<FF0FE0FF0FE01C0780 +1C03000E06000E06000E0600070C00070C00070C0003980003980003F80001F00001F000 +00E00000E00000E00000C00000C00000C000F18000F18000F300006600003C0000131A7F +9116>I<1C043F0843F080E00E047D9B15>126 D E /Fq 13 118 +df<0F001F003F803F007E00F800F000C0000908769C18>19 D<00038000000380000007 +C0000007C0000007C000000FE000000FE000001FF000001BF000003BF8000031F8000031 +F8000060FC000060FC0000E0FE0000C07E0000C07E0001803F0001FFFF0003FFFF800300 +1F8007001FC006000FC006000FC00C0007E00C0007E0FF803FFEFF803FFE1F1C7E9B24> +65 D<07F8601FFEE03C07E07801E07000E0F000E0F00060F00060F80000FE0000FFE000 +7FFE003FFF003FFF800FFFC007FFE0007FE00003F00001F00000F0C000F0C000F0C000E0 +E000E0F001C0FC03C0EFFF00C3FC00141C7D9B1B>83 D<07F8001FFE003F1F803F07803F +07C01E07C00C07C003FFC01FFFC03F87C07E07C0FC07C0FC07C0FC07C0FC0FC07E1FC03F +FBF80FE1F815127F9117>97 D<FF0000FF00001F00001F00001F00001F00001F00001F00 +001F00001F00001F00001F1FC01FFFE01FC1F81F00F81F007C1F007C1F007E1F007E1F00 +7E1F007E1F007E1F007E1F007C1F007C1F80F81FC1F01C7FE0181F80171D7F9C1B>I<03 +F8000FFE001F3F003E3F007C3F007C1E00FC0C00FC0000FC0000FC0000FC0000FC00007C +00007E01803E03801F07000FFE0003F80011127E9115>I<1C003E007F007F007F003E00 +1C00000000000000000000007F007F001F001F001F001F001F001F001F001F001F001F00 +1F001F001F001F00FFC0FFC00A1E7F9D0E>105 D<FF1FC0FE00FF7FE3FF001FE1F70F80 +1F80FC07C01F80FC07C01F00F807C01F00F807C01F00F807C01F00F807C01F00F807C01F +00F807C01F00F807C01F00F807C01F00F807C01F00F807C01F00F807C0FFE7FF3FF8FFE7 +FF3FF825127F9128>109 D<01FC000FFF801F07C03E03E07C01F07C01F0FC01F8FC01F8 +FC01F8FC01F8FC01F8FC01F87C01F07C01F03E03E01F07C00FFF8001FC0015127F9118> +111 D<FE7C00FEFF001FDF801F9F801F9F801F0F001F06001F00001F00001F00001F0000 +1F00001F00001F00001F00001F0000FFE000FFE00011127F9114>114 +D<1FD83FF87038E018E018F000FF807FE07FF01FF807FC007CC01CC01CE01CF038FFF0CF +C00E127E9113>I<030003000300070007000F000F003F00FFFCFFFC1F001F001F001F00 +1F001F001F001F001F001F0C1F0C1F0C1F0C0F9807F003E00E1A7F9913>I<FF07F8FF07 +F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00 +F81F01F80F03F807FEFF03F8FF18127F911B>I E /Fr 19 118 df<387CFCFE7E3E0E1C +3CF8F040070C788516>44 D<FFFF80FFFF80FFFF8011037E8D16>I<3078FCFC78300606 +788516>I<00F80003FC0007FE000F07001C3B8038FF8079FF8073C7C07383C0E701C0E7 +01C0E701C0E701C0E701C0E701C0E701C073838073C78079FF0038FE001C38000F03C007 +FFC003FF0000FC0012197E9816>64 D<1FE0003FF0007FF800783C00300E00000E00003E +0007FE001FFE007FCE00780E00E00E00E00E00E00E00783E007FFFE03FF7E00FC3E01312 +7E9116>97 D<FC0000FC0000FC00001C00001C00001C00001C00001C7C001DFE001FFF00 +1F07801E03C01C01C01C00E01C00E01C00E01C00E01C00E01C00E01E01C01E03C01F0780 +1FFF001DFE000CF80013197F9816>I<03F80FFC1FFE3C1E780C7000E000E000E000E000 +E000F000700778073E0E1FFC0FF803F010127D9116>I<003F00003F00003F0000070000 +070000070000070003E7000FF7001FFF003C1F00780F00700700E00700E00700E00700E0 +0700E00700E00700700F00780F003C1F001FFFE00FF7E007C7E013197F9816>I<03F000 +0FFC001FFE003C0F00780700700380E00380FFFF80FFFF80FFFF80E00000E00000700380 +7803803E07801FFF0007FE0001F80011127E9116>I<001E00007F0001FF8001C7800383 +000380000380007FFF00FFFF00FFFF000380000380000380000380000380000380000380 +000380000380000380000380000380007FFC00FFFE007FFC0011197F9816>I<FC0000FC +0000FC00001C00001C00001C00001C00001CF8001DFC001FFE001F0F001E07001C07001C +07001C07001C07001C07001C07001C07001C07001C07001C0700FF8FE0FF9FE0FF8FE013 +197F9816>104 D<07000F800F800F800700000000000000FF80FF80FF80038003800380 +038003800380038003800380038003800380FFFCFFFEFFFC0F1A7C9916>I<7FC000FFC0 +007FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0 +0001C00001C00001C00001C00001C00001C00001C00001C0007FFF00FFFF807FFF001119 +7E9816>108 D<03E0000FF8001FFC003C1E00780F00700700E00380E00380E00380E003 +80E00380F00780700700780F003C1E001FFC000FF80003E00011127E9116>111 +D<FC7C00FDFE00FFFF001F07801E03C01C01C01C00E01C00E01C00E01C00E01C00E01C00 +E01E01C01E03C01F07801FFF001DFE001CF8001C00001C00001C00001C00001C00001C00 +00FF8000FF8000FF8000131B7F9116>I<7F0F80FF3FC07F7FE007F1E007C0C007800007 +80000700000700000700000700000700000700000700000700007FFC00FFFC007FFC0013 +127F9116>114 D<0FEC3FFC7FFCF03CE01CE01C70007F801FF007F8003C600EE00EF00E +F81EFFFCFFF8C7E00F127D9116>I<0300000700000700000700000700007FFF00FFFF00 +FFFF00070000070000070000070000070000070000070000070100070380070380070380 +07870003FE0001FC0000F80011177F9616>I<FC3F00FC3F00FC3F001C07001C07001C07 +001C07001C07001C07001C07001C07001C07001C07001C07001C1F001FFFE00FFFE007E7 +E013127F9116>I E /Fs 40 125 df<038007800F800F001E003C0038007000E0004000 +090A77A218>19 D<70F8FCFC7404040404080810102040060F7C840E>44 +D<FFF8FFF8FFF80D03808B10>I<00C001C007C0FFC0FBC003C003C003C003C003C003C0 +03C003C003C003C003C003C003C003C003C003C003C003C003C003C003C003C003C003C0 +03C003C0FFFFFFFF10217CA018>49 D<3000803C07003FFF003FFE003FF80037E0003000 +0030000030000030000030000030000031F800360C003807003007003007800003C00003 +C00003E00003E00003E07003E0F803E0F803E0F803E0F803C0C003C0600780600780300F +001C1E000FFC0003F00013227EA018>53 D<01F00007FC000E0E001C0700380380780380 +700380F001C0F001C0F001C0F001E0F001E0F001E0F001E0F001E07001E07003E03803E0 +1805E00C05E00619E003E1E00001C00001C00003C00003803803807C03807C0700780E00 +301C003838001FF00007C00013227EA018>57 D<000FE010003FF83000F80E7001E00770 +03C001F0078001F00F0000F01E0000F03E0000703C0000707C0000707C00003078000030 +78000030F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8000000 +78000000780000307C0000307C0000303C0000303E0000601E0000600F0000C0078000C0 +03C0018001E0030000FC0E00003FFC00000FE0001C247DA223>67 +D<FFFFF800FFFFFF0007C00F8007C003C007C001E007C000F007C0007807C0007C07C000 +3C07C0003E07C0001E07C0001E07C0001E07C0001F07C0001F07C0001F07C0001F07C000 +1F07C0001F07C0001F07C0001F07C0001F07C0001E07C0001E07C0003E07C0003C07C000 +3C07C0007807C000F007C001F007C003E007C00F80FFFFFF00FFFFF80020227FA125>I< +FFFFFFE0FFFFFFE007C007E007C001E007C000E007C0006007C0007007C0007007C00030 +07C0003007C0183007C0183007C0180007C0180007C0380007C0780007FFF80007FFF800 +07C0780007C0380007C0180007C0180007C0180007C0180007C0000007C0000007C00000 +07C0000007C0000007C0000007C0000007C00000FFFF0000FFFF00001C227FA120>70 +D<FFFE1FFFC0FFFE1FFFC007C000F80007C000F80007C000F80007C000F80007C000F800 +07C000F80007C000F80007C000F80007C000F80007C000F80007C000F80007C000F80007 +C000F80007FFFFF80007FFFFF80007C000F80007C000F80007C000F80007C000F80007C0 +00F80007C000F80007C000F80007C000F80007C000F80007C000F80007C000F80007C000 +F80007C000F80007C000F80007C000F800FFFE1FFFC0FFFE1FFFC022227FA125>72 +D<FFFEFFFE07C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007 +C007C007C007C007C007C007C007C007C007C007C007C007C007C007C0FFFEFFFE0F227F +A112>I<FFFE0000FFFE00000F8000000F8000000F8000000F8000000F8000000F800000 +0F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8000000F800000 +0F8000000F8000000F8000000F8000000F8001800F8001800F8001800F8001800F800380 +0F8003800F8003000F8007000F8007000F800F000F803F00FFFFFF00FFFFFF0019227EA1 +1E>76 D<FFC003FFC0FFE003FFC007F0003C0007F000180006F800180006FC001800067C +001800063E001800063F001800061F001800060F801800060FC018000607C018000603E0 +18000603F018000601F018000600F818000600FC180006007C180006003E180006003F18 +0006001F180006000F980006000FD800060007D800060003F800060003F800060001F800 +060000F800060000F80006000078000F00003800FFF0003800FFF000180022227FA125> +78 D<FFFFF800FFFFFE0007C01F8007C007C007C003C007C001E007C001E007C001F007 +C001F007C001F007C001F007C001F007C001E007C001E007C003C007C0078007C01F0007 +FFFC0007C0000007C0000007C0000007C0000007C0000007C0000007C0000007C0000007 +C0000007C0000007C0000007C0000007C0000007C00000FFFE0000FFFE00001C227FA121 +>80 D<FFFFF00000FFFFFE000007C01F000007C007800007C003C00007C003E00007C001 +F00007C001F00007C001F00007C001F00007C001F00007C001E00007C003E00007C003C0 +0007C007800007C01E000007FFF0000007C03C000007C01E000007C00F000007C00F8000 +07C007C00007C007C00007C007C00007C007C00007C007C00007C007C00007C007C00007 +C007C00007C007C0C007C007C0C007C003C0C0FFFE01E180FFFE00F1000000003E002223 +7FA124>82 D<FFFE03FFC0FFFE03FFC007C0003C0007C000180007C000180007C0001800 +07C000180007C000180007C000180007C000180007C000180007C000180007C000180007 +C000180007C000180007C000180007C000180007C000180007C000180007C000180007C0 +00180007C000180007C000180007C000180007C000180007C000180003C000300003E000 +300001E000300001E000600000F000C0000078018000003E070000000FFE00000003F800 +0022237FA125>85 D<FFF83FFE07FEFFF83FFE07FE1F8003F001F80F8003E000600F8003 +F000600FC003F000E007C003F000C007C003F000C007E006F800C003E006F8018003E006 +F8018003E00C7C018001F00C7C030001F00C7C030001F01C7E030001F8183E070000F818 +3E060000F8183E060000FC301F0600007C301F0C00007C301F0C00007C600F8C00003E60 +0F9800003E600F9800003EE00FD800003FC007F800001FC007F000001FC007F000001F80 +03F000000F8003E000000F8003E000000F0001E00000070001C00000070001C000000700 +01C0002F237FA132>87 D<1FF000383C007C0E007C0F007C078038078000078000078000 +FF8007C7801E07803C0780780780700780F00798F00798F00798F00F987817983C23F00F +C1E015157E9418>97 D<0F0000FF0000FF00001F00000F00000F00000F00000F00000F00 +000F00000F00000F00000F00000F00000F3F000F61C00F80600F00300F00380F003C0F00 +1C0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001C0F003C0F00380F00700F80 +600E61C00C3F0017237FA21B>I<01FE000707000C0F801C0F80380F80780700700000F0 +0000F00000F00000F00000F00000F00000F000007000007800C03800C01C01800C030007 +060001F80012157E9416>I<0001E0001FE0001FE00003E00001E00001E00001E00001E0 +0001E00001E00001E00001E00001E00001E001F9E00707E00C03E01C01E03801E07801E0 +7001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E07001E07801E03801E01801E0 +0C03F0070DFE01F1FE17237EA21B>I<01FC000707000C03801C01C03801C07801E07000 +E0F000E0FFFFE0F00000F00000F00000F00000F000007000007800603800601C00C00E01 +8007070000FC0013157F9416>I<003E0000E18003C3C00387C00787C00F03800F00000F +00000F00000F00000F00000F00000F00000F0000FFF800FFF8000F00000F00000F00000F +00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F +00000F0000FFF000FFF000122380A20F>I<0000F003F1180E1E381C0E38380730380700 +7807807807807807807807803807003807001C0E001E1C0033F000200000200000300000 +3800003FFE001FFFC00FFFE03801F0700070E00038E00038E00038E00038600030700070 +3800E00E038003FE0015217F9518>I<0F0000FF0000FF00001F00000F00000F00000F00 +000F00000F00000F00000F00000F00000F00000F00000F0F800F31C00F40E00F80F00F80 +F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00 +F00F00F00F00F0FFF3FFFFF3FF18237FA21B>I<0E001F001F001F000E00000000000000 +000000000000000000000F007F007F001F000F000F000F000F000F000F000F000F000F00 +0F000F000F000F000F000F00FFE0FFE00B2280A10D>I<0F00FF00FF001F000F000F000F +000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F +000F000F000F000F000F000F000F000F00FFF0FFF00C2380A20D>108 +D<0F0FC07E00FF30E18700FF407203801F807C03C00F807C03C00F007803C00F007803C0 +0F007803C00F007803C00F007803C00F007803C00F007803C00F007803C00F007803C00F +007803C00F007803C00F007803C00F007803C00F007803C0FFF3FF9FFCFFF3FF9FFC2615 +7F9429>I<0F0F80FF31C0FF40E01F80F00F80F00F00F00F00F00F00F00F00F00F00F00F +00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F0FFF3FFFFF3FF18157F94 +1B>I<01FC000707000C01801800C03800E0700070700070F00078F00078F00078F00078 +F00078F00078F000787000707800F03800E01C01C00E038007070001FC0015157F9418> +I<0F3F00FF61C0FF80600F00700F00380F003C0F003C0F001E0F001E0F001E0F001E0F00 +1E0F001E0F001E0F003C0F003C0F00380F00700F80E00F61C00F3F000F00000F00000F00 +000F00000F00000F00000F00000F0000FFF000FFF000171F7F941B>I<01F860070CE00E +02E01C03E03801E07801E07801E0F001E0F001E0F001E0F001E0F001E0F001E0F001E078 +01E07801E03801E01C03E00C03E0070DE001F1E00001E00001E00001E00001E00001E000 +01E00001E00001E0001FFE001FFE171F7E941A>I<0F1E00FF2300FF47801F87800F8300 +0F80000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F0000 +0F00000F0000FFF800FFF8001115809413>I<0FC8307860386018E018E018F000FC007F +C03FE01FF007F8007CC03CC01CC01CE01CE018F038D8708FC00E157E9413>I<06000600 +06000600060006000E000E000E001E003FFCFFFC1E001E001E001E001E001E001E001E00 +1E001E001E0C1E0C1E0C1E0C1E0C1E0C0F18071001E00E1F7F9E13>I<0F00F0FF0FF0FF +0FF01F01F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F00F +00F00F00F00F01F00F01F00702F80386FF00F8FF18157F941B>I<FFC1FEFFC1FE1F00F8 +0F00600F00600780C00780C00780C003C18003C18003E38001E30001E30000F60000F600 +00F600007C00007C00007C0000380000380017157F941A>I<FFC1FEFFC1FE1F00F80F00 +600F00600780C00780C00780C003C18003C18003E38001E30001E30000F60000F60000F6 +00007C00007C00007C00003800003800003000003000007000006000F86000F8C000F8C0 +00F980006300003E0000171F7F941A>121 D<3FFFC03C0780380F80300F00701E00603E +00603C0060780000F80000F00001E00003C00007C0C00780C00F00C01F01C01E01803C01 +807C0380780780FFFF8012157F9416>I<FFFFFFFFFFFF3001808C31>124 +D E /Ft 20 118 df<78FCFCFCFC7806067A8512>46 D<007F800001FFE0000781F8000E +007C0018003E0030001F0030000F8060000FC0600007C0F80007C0FC0007E0FE0007E0FE +0003E0FE0003E0FE0003E07C0007E0000007E0000007C0000007C000000FC000000F8000 +000F8000001F0000003E0000003C00000078000000F8000000F0000001E0000003C00000 +070000000E0000001C000000180000003000000060000000C00060018000600380006007 +0000C00E0000C00C0000C0180001C03FFFFFC07FFFFF80FFFFFF80FFFFFF801B2F7DAE21 +>50 D<FFFFC00000FFFFC0000007F000000003E000000003E000000003E000000003E000 +000003E000000003E000000003E000000003E000000003E000000003E000000003E00000 +0003E000000003E000000003E000000003E000000003E000000003E000000003E0000000 +03E000000003E000000003E000000003E000000003E000000003E000000003E000000003 +E000000003E000000003E000000003E000006003E000006003E000006003E000006003E0 +0000C003E00000C003E00000C003E00000C003E00001C003E00001C003E00003C003E000 +03C003E00007C003E0000F8003E0003F8007E000FF80FFFFFFFF80FFFFFFFF8023317DB0 +29>76 D<FFF00000007FF8FFF8000000FFF807F8000000FF0003F8000000FE00037C0000 +01BE00037C000001BE00037C000001BE00033E0000033E00033E0000033E00033E000003 +3E00031F0000063E00031F0000063E00031F0000063E00030F80000C3E00030F80000C3E +00030F80000C3E000307C000183E000307C000183E000307C000183E000303E000303E00 +0303E000303E000303E000303E000301F000603E000301F000603E000301F000C03E0003 +00F800C03E000300F800C03E0003007C01803E0003007C01803E0003007C01803E000300 +3E03003E0003003E03003E0003003E03003E0003001F06003E0003001F06003E0003001F +06003E0003000F8C003E0003000F8C003E0003000F8C003E00030007D8003E00030007D8 +003E00030007D8003E00030003F0003E00030003F0003E00030003F0003E00078001E000 +3E000FC001E0007F00FFFC01E00FFFF8FFFC00C00FFFF835317CB03D>I<FFFFFFE000FF +FFFFFC0007E0007F0003E0000F8003E00007C003E00003E003E00001F003E00001F803E0 +0000F803E00000F803E00000FC03E00000FC03E00000FC03E00000FC03E00000FC03E000 +00FC03E00000F803E00000F803E00001F803E00001F003E00003E003E00007C003E0000F +8003E0007F0003FFFFFC0003FFFFE00003E000000003E000000003E000000003E0000000 +03E000000003E000000003E000000003E000000003E000000003E000000003E000000003 +E000000003E000000003E000000003E000000003E000000003E000000003E000000003E0 +00000003E000000007F0000000FFFF800000FFFF80000026317DB02D>80 +D<FFFFFF000000FFFFFFF0000007E001FC000003E0003F000003E0000F800003E00007C0 +0003E00003E00003E00003F00003E00003F00003E00001F00003E00001F80003E00001F8 +0003E00001F80003E00001F80003E00001F80003E00001F00003E00003F00003E00003F0 +0003E00003E00003E00007C00003E0000F800003E0003F000003E001FC000003FFFFF000 +0003FFFFC0000003E001F0000003E0007C000003E0003E000003E0001F000003E0000F00 +0003E0000F800003E00007800003E00007C00003E00007C00003E00007C00003E00007C0 +0003E00007C00003E00007E00003E00007E00003E00007E00003E00007E00003E00007E0 +0003E00007E01803E00007F01803E00003F01803E00003F01807F00001F830FFFF8000F8 +70FFFF80007FE0000000000F802D327CB031>82 D<03FE00000FFFC0001E03E0003F00F0 +003F0078003F003C001E001C000C001E0000001E0000001E0000001E0000001E000001FE +00003FFE0001FF1E0007F01E000F801E001F001E003E001E007C001E007C001E00F8001E +0CF8001E0CF8001E0CF8003E0CF8003E0C7C007E0C3E00DF1C1F038FB80FFF07F003F803 +C01E1F7D9E21>97 D<001FF00000FFFC0001F01E0007C03F000F003F000F003F001E001E +003C000C003C0000007C00000078000000F8000000F8000000F8000000F8000000F80000 +00F8000000F8000000F8000000F80000007C0000007C0000003C0000003E0001801E0001 +800F0003000F80070007C00E0001F81C0000FFF000001FC000191F7E9E1D>99 +D<003F800000FFE00003E0F80007803C000F001E001E001E001E000F003C000F007C000F +007C000F8078000780F8000780FFFFFF80FFFFFF80F8000000F8000000F8000000F80000 +00F8000000F8000000780000007C0000003C0000003C0001801E0001800F0003000F8006 +0007C00E0001F0380000FFF000001FC000191F7E9E1D>101 D<0003F0000FF8003C3C00 +787E00F07E01E07E01E03C01C01803C00003C00003C00003C00003C00003C00003C00003 +C00003C00003C00003C000FFFFC0FFFFC003C00003C00003C00003C00003C00003C00003 +C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003 +C00003C00003C00003C00003C00003C00003C00003C00007E0007FFF007FFF0017327FB1 +14>I<000000F0007F03F801FFCF1C03C1FC3C0780F83C0F0078181F007C001E003C003E +003E003E003E003E003E003E003E003E003E003E003E003E003E001E003C001F007C000F +0078000780F0000FC1E0000DFFC0001C7F000018000000180000001C0000001C0000001E +0000000FFFF8000FFFFF0007FFFF800FFFFFC01E0007E0380001F07000007070000078E0 +000038E0000038E0000038E0000038E000003870000070780000F03C0001E01E0003C007 +C01F0001FFFC00003FE0001E2F7E9F21>I<0780000000FF80000000FF800000000F8000 +000007800000000780000000078000000007800000000780000000078000000007800000 +000780000000078000000007800000000780000000078000000007800000000780000000 +07800000000781FE00000787FF8000078E07C000079803E00007B001E00007E000F00007 +C000F00007C000F00007C000F000078000F000078000F000078000F000078000F0000780 +00F000078000F000078000F000078000F000078000F000078000F000078000F000078000 +F000078000F000078000F000078000F000078000F000078000F000078000F000078000F0 +000FC001F800FFFC1FFF80FFFC1FFF8021327EB125>I<0F001F801F801F801F800F0000 +00000000000000000000000000000000000000000007807F807F800F8007800780078007 +800780078007800780078007800780078007800780078007800780078007800780078007 +80078007800FC0FFF8FFF80D307EAF12>I<0780FF80FF800F8007800780078007800780 +078007800780078007800780078007800780078007800780078007800780078007800780 +078007800780078007800780078007800780078007800780078007800780078007800780 +078007800FC0FFFCFFFC0E327EB112>108 D<0781FE003FC000FF87FF80FFF000FF8E07 +C1C0F8000F9803E3007C0007B001E6003C0007E000FC001E0007C000F8001E0007C000F8 +001E0007C000F8001E00078000F0001E00078000F0001E00078000F0001E00078000F000 +1E00078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E +00078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E00 +078000F0001E00078000F0001E00078000F0001E00078000F0001E00078000F0001E000F +C001F8003F00FFFC1FFF83FFF0FFFC1FFF83FFF0341F7E9E38>I<0781FE0000FF87FF80 +00FF8E07C0000F9803E00007B001E00007E000F00007C000F00007C000F00007C000F000 +078000F000078000F000078000F000078000F000078000F000078000F000078000F00007 +8000F000078000F000078000F000078000F000078000F000078000F000078000F0000780 +00F000078000F000078000F000078000F000078000F0000FC001F800FFFC1FFF80FFFC1F +FF80211F7E9E25>I<001FC00000FFF80001E03C0007800F000F0007801E0003C01E0003 +C03C0001E03C0001E0780000F0780000F0780000F0F80000F8F80000F8F80000F8F80000 +F8F80000F8F80000F8F80000F8F80000F8780000F07C0001F03C0001E03C0001E01E0003 +C01E0003C00F00078007C01F0001F07C0000FFF800001FC0001D1F7E9E21>I<0783E0FF +8FF8FF9C7C0FB87C07F07C07E03807E00007C00007C00007C00007800007800007800007 +800007800007800007800007800007800007800007800007800007800007800007800007 +80000780000780000FC000FFFE00FFFE00161F7E9E19>114 D<00C00000C00000C00000 +C00000C00001C00001C00001C00003C00003C00007C0000FC0001FC000FFFFE0FFFFE003 +C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003 +C00003C00003C00003C00003C03003C03003C03003C03003C03003C03003C03003C03001 +E06001E06000F0C0007F80001F00142C7FAB19>116 D<078000F000FF801FF000FF801F +F0000F8001F000078000F000078000F000078000F000078000F000078000F000078000F0 +00078000F000078000F000078000F000078000F000078000F000078000F000078000F000 +078000F000078000F000078000F000078000F000078000F000078000F000078001F00007 +8001F000078003F000038007F00003C00EF00001F03CF80000FFF0FF80003FC0FF80211F +7E9E25>I E end %%EndProlog %%BeginSetup -%%Feature: *Resolution 300 -TeXDict begin @a4 /a4 where {pop a4} if +%%Feature: *Resolution 300dpi +TeXDict begin + %%EndSetup %%Page: 1 1 -bop 96 342 a Fu(Reference)22 b(Man)n(ual)f(of)g(the)h(Programming)e(Language) -h(Lua)h(2.1)87 468 y Ft(Rob)q(erto)17 b(Ierusalimsc)o(h)o(y)46 -b(Luiz)16 b(Henrique)e(de)i(Figueiredo)48 b(W)l(aldemar)15 -b(Celes)h(Filho)736 548 y Fs(T)m(eC)797 561 y(Graf)885 548 -y Fr(|)e(PUC-Rio)562 606 y Fq(roberto,lhf,cele)o(s@ica)o(d.puc)o(-rio)o(.br) -741 720 y Ft(F)l(ebruary)i(8,)h(1995)830 888 y Fp(Abstract)102 -963 y Fr(Lua)12 b(is)g(an)f(extension)i(programming)c(language)i(designed)h -(to)g(b)q(e)h(used)g(as)f(a)g(con\014guration)g(language)102 -1013 y(for)h(an)o(y)g(program)f(that)i(needs)h(one.)j(This)13 -b(do)q(cumen)o(t)g(describ)q(es)j(v)o(ersion)e(2.1)e(of)h(the)h(Lua)f -(program-)102 1063 y(ming)g(language)h(and)g(the)i(API)f(that)g(allo)o(ws)f -(in)o(teraction)g(b)q(et)o(w)o(een)j(Lua)d(programs)g(and)h(its)g(host)g(C) -102 1113 y(program.)h(It)e(also)f(presen)o(ts)j(some)d(examples)g(of)h(using) -f(the)i(main)c(features)k(of)f(the)g(system.)869 1328 y Fp(Sum\023)-24 -b(ario)102 1396 y Fr(Lua)9 b(\023)-20 b(e)11 b(uma)d(linguagem)g(de)j -(extens~)-21 b(ao)11 b(pro)r(jetada)f(para)h(ser)g(usada)f(como)f(linguagem)f -(de)j(con\014gura\030)-18 b(c~)d(ao)102 1446 y(em)19 b(qualquer)h(programa)f -(que)h(precise)i(de)f(uma.)35 b(Este)21 b(do)q(cumen)o(to)f(descrev)o(e)i(a)e -(v)o(ers~)-21 b(ao)21 b(2.1)e(da)102 1496 y(linguagem)f(de)i(programa\030)-18 -b(c~)d(ao)19 b(Lua)h(e)h(a)f(In)o(terface)h(de)g(Programa\030)-18 -b(c~)d(ao)19 b(que)i(p)q(ermite)f(a)g(in)o(tera\030)-18 b(c~)d(ao)102 -1545 y(en)o(tre)15 b(programas)e(Lua)h(e)h(o)f(programa)e(C)j(hosp)q(edeiro.) -20 b(O)14 b(do)q(cumen)o(to)g(tam)o(b)o(\023)-20 b(em)12 b(apresen)o(ta)j -(alguns)102 1595 y(exemplos)e(de)h(uso)g(das)g(principais)g(caracter)-5 -b(\023)-16 b(\020sticas)15 b(do)f(sistema.)-12 1738 y Fo(1)69 -b(In)n(tro)r(duction)-12 1840 y Fn(Lua)18 b(is)f(an)g(extension)h -(programming)f(language)g(designed)i(to)d(supp)q(ort)h(general)h(pro)q -(cedural)g(program-)-12 1896 y(ming)j(features)f(with)g(data)g(description)h -(facilities.)37 b(It)20 b(is)h(supp)q(osed)g(to)f(b)q(e)h(used)f(as)g(a)g -(con\014guration)-12 1953 y(language)e(for)f(an)o(y)g(program)f(that)h(needs) -h(one.)27 b(Its)18 b(main)g(extensions)g(are)f(related)h(to)f(ob)s -(ject-orien)o(ted)-12 2009 y(facilities,)f(and)e(fallbac)o(ks,)g(but)g(it)g -(has)g(some)g(other)f(minor)h(con)o(tributions.)20 b(Lua)14 -b(has)g(b)q(een)h(designed)g(and)-12 2066 y(implemen)o(ted)i(b)o(y)e(W.)g -(Celes)h(F.,)e(L.)h(H.)g(de)g(Figueiredo)i(and)e(R.)g(Ierusalimsc)o(h)o(y)l -(.)59 2122 y(Lua)k(is)g(implemen)o(ted)h(as)e(a)g(library)l(,)i(written)f(in) -g(C.)f(Being)h(an)g(extension)g(language,)g(Lua)g(has)f(no)-12 -2179 y(notion)i(of)f(a)g(\\main")g(program:)28 b(it)19 b(only)h(w)o(orks)f -Fm(emb)n(e)n(dde)n(d)g Fn(in)h(a)f(host)g(clien)o(t,)j(called)f(the)e -Fm(emb)n(e)n(dding)-12 2235 y Fn(program.)g(This)c(host)g(program)e(can)i(in) -o(v)o(ok)o(e)g(functions)h(to)e(execute)h(a)g(piece)h(of)e(co)q(de)i(in)f -(Lua,)g(can)g(write)-12 2291 y(and)i(read)g(Lua)h(v)m(ariables,)g(and)f(can)g -(register)g(C)g(functions)h(to)e(b)q(e)i(called)g(b)o(y)f(Lua)h(co)q(de.)25 -b(Through)17 b(the)-12 2348 y(use)d(of)g(C)f(functions,)i(Lua)f(can)g(b)q(e)h -(augmen)o(ted)e(to)g(cop)q(e)i(with)f(rather)f(di\013eren)o(t)h(domains,)g -(th)o(us)g(creating)-12 2404 y(customized)i(programming)f(languages)g -(sharing)h(a)f(syn)o(tactical)g(framew)o(ork.)59 2461 y(Lua)k(is)g(free)g -(distribution)h(soft)o(w)o(are,)e(and)h(pro)o(vided)g(as)g(usual)g(with)g(no) -g(guaran)o(tees.)30 b(The)19 b(imple-)-12 2517 y(men)o(tation)c(describ)q(ed) -i(in)f(this)g(man)o(ual)f(is)h(a)o(v)m(ailable)h(b)o(y)e(anon)o(ymous)g(ftp)g -(from)60 2611 y Fl(ftp.icad.puc-rio.br:/pub)o(/lua/lua)o(-2.1.ta)o(r.Z)-12 -2705 y Fn(or)g(b)o(y)g(WWW)f(\(W)l(orld)h(Wide)h(W)l(eb\))g(from)60 -2799 y Fl(http://www.inf.puc-rio.b)o(r/projet)o(os/robe)o(rto/lua)o(.html)910 -2976 y Fn(1)p eop +1 0 bop 108 381 a Ft(Reference)22 b(Man)n(ual)f(of)g(the)h(Programming) +f(Language)g(Lua)g(2.2)99 508 y Fs(Rob)q(erto)c(Ierusalimsc)o(h)o(y)49 +b(Luiz)17 b(Henrique)e(de)h(Figueiredo)50 b(W)l(aldemar)17 +b(Celes)g(Filho)563 587 y Fr(roberto,lhf,celes)o(@icad)o(.puc-)o(rio.b) +o(r)479 694 y Fs(Departamen)o(to)g(de)f(Inform\023)-24 +b(atica)17 b(|)f(PUC-Rio)763 795 y(No)o(v)o(em)o(b)q(er,)e(1995)842 +963 y Fq(Abstract)72 1039 y Fp(Lua)f(is)h(an)f(extension)i(programmi)o +(ng)c(language)h(designed)j(to)e(b)q(e)i(used)f(as)g(a)f +(con\014guration)g(language)g(for)72 1089 y(an)o(y)18 +b(program)f(that)h(needs)i(one.)31 b(This)19 b(do)q(cumen)o(t)e +(describ)q(es)k(v)o(ersion)d(2.2)g(of)f(the)i(Lua)f(programming)72 +1138 y(language)d(and)g(the)h(API)g(that)g(allo)o(ws)e(in)o(teraction)i +(b)q(et)o(w)o(een)h(Lua)e(programs)f(and)i(its)f(host)h(C)g(program.)72 +1188 y(It)e(also)f(presen)o(ts)j(some)d(examples)g(of)g(using)h(the)h +(main)c(features)k(of)f(the)g(system.)881 1404 y Fq(Sum\023)-24 +b(ario)72 1471 y Fp(Lua)15 b(\023)-20 b(e)18 b(uma)d(linguagem)f(de)j +(extens~)-21 b(ao)18 b(pro)r(jetada)f(para)f(ser)i(usada)f(como)e +(linguagem)g(de)i(con\014gura\030)-18 b(c~)d(ao)72 1521 +y(em)12 b(qualquer)g(programa)e(que)j(precise)h(de)f(uma.)j(Este)e(do)q +(cumen)o(to)d(descrev)o(e)k(a)d(v)o(ers~)-21 b(ao)13 +b(2.2)e(da)h(linguagem)72 1571 y(de)18 b(programa\030)-18 +b(c~)d(ao)16 b(Lua)i(e)g(a)g(In)o(terface)h(de)f(Programa\030)-18 +b(c~)d(ao)16 b(que)i(p)q(ermite)g(a)f(in)o(tera\030)-18 +b(c~)d(ao)18 b(en)o(tre)h(programas)72 1621 y(Lua)c(e)g(o)g(programa)e +(C)h(hosp)q(edeiro.)22 b(O)15 b(do)q(cumen)o(to)g(tam)o(b)o(\023)-20 +b(em)12 b(apresen)o(ta)k(alguns)e(exemplos)g(de)i(uso)f(das)72 +1671 y(principais)f(caracter)-5 b(\023)-16 b(\020sticas)15 +b(do)f(sistema.)-42 1814 y Fo(1)67 b(In)n(tro)r(duction)-42 +1915 y Fn(Lua)18 b(is)f(an)g(extension)g(programmi)o(ng)d(language)j +(designed)g(to)g(supp)q(ort)g(general)g(pro)q(cedural)g(programming)-42 +1972 y(features)k(with)f(data)g(description)g(facilities.)34 +b(It)21 b(is)f(supp)q(osed)i(to)e(b)q(e)h(used)h(as)e(a)g +(con\014guration)g(language)-42 2028 y(for)d(an)o(y)f(program)f(that)i +(needs)g(one.)26 b(Its)17 b(main)e(extensions)i(are)f(related)h(to)f +(ob)s(ject-orien)o(ted)g(facilities,)f(and)-42 2085 y(fallbac)o(ks,)g +(but)h(it)f(has)h(some)f(other)h(minor)e(con)o(tributions.)21 +b(Lua)16 b(has)g(b)q(een)h(designed)g(and)f(implemen)o(ted)e(b)o(y)-42 +2141 y(W.)h(Celes)g(F.,)f(L.)h(H.)g(de)h(Figueiredo)e(and)h(R.)h +(Ierusalimsc)o(h)o(y)l(.)29 2197 y(Lua)c(is)f(implemen)o(ted)f(as)h(a)g +(library)l(,)g(written)g(in)h(C.)f(Being)g(an)h(extension)g(language,)f +(Lua)h(has)f(no)h(notion)f(of)-42 2254 y(a)h(\\main")d(program:)16 +b(it)10 b(only)h(w)o(orks)g Fm(emb)n(e)n(dde)n(d)f Fn(in)i(a)f(host)g +(clien)o(t,)g(called)g(the)g Fm(emb)n(e)n(dding)f Fn(program.)17 +b(This)11 b(host)-42 2310 y(program)i(can)j(in)o(v)o(ok)o(e)e +(functions)h(to)f(execute)i(a)f(piece)g(of)g(co)q(de)g(in)g(Lua,)g(can) +h(write)e(and)h(read)g(Lua)h(v)m(ariables,)-42 2367 y(and)f(can)e +(register)g(C)h(functions)f(to)h(b)q(e)g(called)g(b)o(y)f(Lua)h(co)q +(de.)20 b(Through)14 b(the)g(use)g(of)g(C)f(functions,)h(Lua)g(can)g(b) +q(e)-42 2423 y(augmen)o(ted)d(to)h(cop)q(e)g(with)f(rather)h +(di\013eren)o(t)f(domains,)f(th)o(us)i(creating)f(customized)g +(programmi)o(ng)e(languages)-42 2480 y(sharing)15 b(a)g(syn)o(tactical) +e(framew)o(ork.)29 2536 y(Lua)f(is)e(free)i(distribution)e(soft)o(w)o +(are,)g(and)h(pro)o(vided)g(as)g(usual)g(with)g(no)g(guaran)o(tees.)18 +b(The)11 b(implemen)o(tatio)o(n)-42 2593 y(describ)q(ed)17 +b(in)e(this)f(man)o(ual)g(is)g(a)o(v)m(ailable)g(b)o(y)h(anon)o(ymous)f +(ftp)h(from)922 2748 y(1)p eop %%Page: 2 2 -bop -12 160 a Fo(2)69 b(En)n(vironmen)n(t)21 b(and)i(Mo)r(dules)-12 -261 y Fn(All)15 b(statemen)o(ts)d(in)j(Lua)e(are)h(executed)g(in)g(a)f -Fm(glob)n(al)h(envir)n(onment)t Fn(.)k(This)d(en)o(vironmen)o(t,)e(whic)o(h)i -(k)o(eeps)e(all)-12 318 y(global)19 b(v)m(ariables)g(and)f(functions,)g(is)h -(initialized)i(at)c(the)h(b)q(eginning)i(of)d(the)h(em)o(b)q(edding)h -(program)e(and)-12 374 y(p)q(ersists)f(un)o(til)g(its)g(end.)59 -430 y(The)i(global)g(en)o(vironmen)o(t)g(can)g(b)q(e)g(manipulated)i(b)o(y)d -(Lua)h(co)q(de)h(or)e(b)o(y)h(the)f(em)o(b)q(edding)j(program,)-12 -487 y(whic)o(h)c(can)g(read)f(and)g(write)g(global)h(v)m(ariables)h(using)f -(functions)g(in)g(the)f(library)h(that)e(implemen)o(ts)j(Lua.)59 -543 y(Global)22 b(v)m(ariables)g(do)f(not)g(need)h(declaration.)39 -b(An)o(y)22 b(v)m(ariable)g(is)g(assumed)g(to)e(b)q(e)i(global)g(unless)-12 -600 y(explicitly)17 b(declared)f(lo)q(cal)g(\(see)e(lo)q(cal)h(declarations,) -g(Section)h(4.4.5\).)h(Before)e(the)f(\014rst)g(assignmen)o(t,)g(the)-12 -656 y(v)m(alue)j(of)d(a)h(global)h(v)m(ariable)h(is)e Fk(nil)p -Fn(.)59 713 y(The)g(unit)h(of)f(execution)h(of)f(Lua)h(is)f(called)i(a)e -Fm(mo)n(dule)s Fn(.)20 b(The)c(syn)o(tax)e(for)h(mo)q(dules)h(is:)1563 -696 y Fj(1)72 785 y Fm(mo)n(dule)50 b Fi(!)g(f)p Fm(statement)32 -b Fi(j)16 b Fm(function)s Fi(g)-12 857 y Fn(A)f(mo)q(dule)h(ma)o(y)f(con)o -(tain)g(statemen)o(ts)f(and)h(function)g(de\014nitions,)i(and)e(ma)o(y)f(b)q -(e)i(in)g(a)e(\014le)i(or)f(in)h(a)e(string)-12 913 y(inside)i(the)f(host)f -(program.)k(When)d(a)f(mo)q(dule)i(is)f(executed,)g(\014rst)f(all)h(its)g -(functions)g(and)f(statemen)o(ts)g(are)-12 970 y(compiled,)g(and)f(the)f -(functions)h(added)g(to)f(the)g(global)h(en)o(vironmen)o(t;)g(then)g(the)f -(statemen)o(ts)f(are)h(executed)-12 1026 y(in)k(sequen)o(tial)g(order.)k(All) -d(mo)q(di\014cations)f(a)f(mo)q(dule)h(e\013ects)f(on)g(the)g(global)h(en)o -(vironmen)o(t)f(p)q(ersist)h(after)-12 1083 y(its)g(end.)k(Those)15 -b(include)j(mo)q(di\014cations)e(to)f(global)g(v)m(ariables)i(and)e -(de\014nitions)i(of)e(new)g(functions)1736 1066 y Fj(2)1757 -1083 y Fn(.)-12 1226 y Fo(3)69 b(T)n(yp)r(es)-12 1327 y Fn(Lua)16 -b(is)h(a)e(dynamically)j(t)o(yp)q(ed)e(language.)22 b(V)l(ariables)17 -b(do)f(not)f(ha)o(v)o(e)g(t)o(yp)q(es;)h(only)g(v)m(alues)h(do.)22 -b(All)17 b(v)m(alues)-12 1384 y(carry)e(their)h(o)o(wn)e(t)o(yp)q(e.)20 -b(Therefore,)15 b(there)g(are)g(no)g(t)o(yp)q(e)g(de\014nitions)i(in)f(the)g -(language.)59 1440 y(There)e(are)f(sev)o(en)i(basic)f(t)o(yp)q(es)g(in)h -(Lua:)k Fm(nil)p Fn(,)13 b Fm(numb)n(er)p Fn(,)g Fm(string)p -Fn(,)g Fm(function)p Fn(,)h Fm(CF)m(unction)p Fn(,)e Fm(user)n(data)p -Fn(,)i(and)-12 1497 y Fm(table)p Fn(.)25 b Fm(Nil)16 b Fn(is)h(the)g(t)o(yp)q -(e)g(of)g(the)g(v)m(alue)h Fk(nil)p Fn(,)g(whose)f(main)g(prop)q(ert)o(y)g -(is)g(to)f(b)q(e)i(di\013eren)o(t)f(from)f(an)o(y)h(other)-12 -1553 y(v)m(alue.)k Fm(Numb)n(er)15 b Fn(represen)o(ts)h(real)f(\(\015oating)g -(p)q(oin)o(t\))g(n)o(um)o(b)q(ers,)g(while)i Fm(string)d Fn(has)i(the)f -(usual)h(meaning.)59 1610 y(F)l(unctions)f(are)e(considered)j(\014rst-class)e -(v)m(alues)i(in)f(Lua.)k(This)c(means)f(that)g(functions)h(can)f(b)q(e)h -(stored)-12 1666 y(in)h(v)m(ariables,)g(passed)f(as)f(argumen)o(ts)g(to)h -(other)f(functions)i(and)f(returned)g(as)g(results.)20 b(When)15 -b(a)f(function)-12 1723 y(is)j(de\014ned)h(in)g(Lua,)e(its)h(b)q(o)q(dy)h(is) -f(compiled)h(and)f(stored)f(in)h(a)f(giv)o(en)h(v)m(ariable.)26 -b(Lua)17 b(can)f(call)i(\(and)f(ma-)-12 1779 y(nipulate\))e(functions)g -(written)f(in)h(Lua)f(and)g(functions)h(written)f(in)g(C;)g(the)g(latter)f -(ha)o(v)o(e)h(t)o(yp)q(e)g Fm(CF)m(unction)s Fn(.)59 1836 y(The)i(t)o(yp)q(e) -g Fm(user)n(data)h Fn(is)f(pro)o(vided)h(to)e(allo)o(w)i(arbitrary)e(C)h(p)q -(oin)o(ters)g(to)g(b)q(e)h(stored)e(in)i(Lua)f(v)m(ariables.)-12 -1892 y(It)21 b(corresp)q(onds)f(to)g Fl(void*)g Fn(and)g(has)g(no)h -(pre-de\014ned)h(op)q(erations)e(in)h(Lua,)h(b)q(esides)g(assignmen)o(t)e -(and)-12 1948 y(equalit)o(y)15 b(test.)k(Ho)o(w)o(ev)o(er,)13 -b(b)o(y)h(using)h(fallbac)o(ks,)f(the)h(programmer)d(ma)o(y)i(de\014ne)h(op)q -(erations)f(for)g Fm(user)n(data)-12 2005 y Fn(v)m(alues;)i(see)g(Section)g -(4.7.)59 2061 y(The)d(t)o(yp)q(e)h Fm(table)e Fn(implemen)o(ts)j(asso)q -(ciativ)o(e)e(arra)o(ys,)f(that)h(is,)h(arra)o(ys)e(whic)o(h)i(can)f(b)q(e)h -(indexed)h(not)e(only)-12 2118 y(with)20 b(n)o(um)o(b)q(ers,)g(but)f(with)g -(an)o(y)g(v)m(alue)h(\(except)g Fk(nil)p Fn(\).)32 b(Therefore,)19 -b(this)h(t)o(yp)q(e)f(ma)o(y)g(b)q(e)g(used)h(not)f(only)-12 -2174 y(to)c(represen)o(t)h(ordinary)g(arra)o(ys,)e(but)h(also)h(sym)o(b)q(ol) -g(tables,)g(sets,)f(records,)g(etc.)21 b(T)l(o)16 b(represen)o(t)f(a)h -(record,)-12 2231 y(Lua)h(uses)f(the)g(\014eld)i(name)e(as)g(an)g(index.)24 -b(The)17 b(language)f(supp)q(orts)g(this)h(represen)o(tation)f(b)o(y)g(pro)o -(viding)-12 2287 y Fl(a.name)f Fn(as)h(syn)o(tactic)g(sugar)g(for)f -Fl(a["name"])p Fn(.)22 b(T)l(ables)17 b(ma)o(y)e(also)h(carry)g(metho)q(ds.) -23 b(Because)17 b(functions)-12 2344 y(are)g(\014rst)g(class)h(v)m(alues,)h -(table)f(\014elds)g(ma)o(y)f(con)o(tain)h(functions.)27 b(The)17 -b(form)g Fl(t:f\(x\))g Fn(is)h(syn)o(tactic)f(sugar)-12 2400 -y(for)e Fl(t.f\(t,x\))p Fn(,)e(whic)o(h)j(calls)h(the)e(metho)q(d)g -Fl(f)g Fn(from)g(the)g(table)h Fl(t)f Fn(passing)g(itself)i(as)d(the)i -(\014rst)e(parameter.)59 2457 y(It)i(is)g(imp)q(ortan)o(t)f(to)g(notice)i -(that)e(tables)h(are)f(ob)s(jects,)g(and)h(not)f(v)m(alues.)23 -b(V)l(ariables)17 b(cannot)e(con)o(tain)-12 2513 y(tables,)e(only)h -(references)f(to)f(them.)19 b(Assignmen)o(t,)13 b(parameter)f(passing)i(and)e -(returns)h(alw)o(a)o(ys)f(manipulate)-12 2569 y(references)18 -b(to)f(tables,)h(and)f(do)h(not)f(imply)h(an)o(y)f(kind)i(of)e(cop)o(y)l(.)26 -b(Moreo)o(v)o(er,)16 b(tables)i(m)o(ust)e(b)q(e)j(explicitly)-12 -2626 y(created)c(b)q(efore)h(used;)f(see)h(Section)g(4.5.7.)p --12 2665 747 2 v 40 2692 a Fh(1)57 2708 y Fg(As)d(usual,)h -Ff(f)p Fe(a)s Ff(g)f Fg(means)g(0)g(or)h(more)f Fe(a)s Fg('s,)e([)p -Fe(a)s Fg(])h(means)i(an)f(optional)i Fe(a)e Fg(and)g Ff(f)p -Fe(a)s Ff(g)1208 2692 y Fh(+)1247 2708 y Fg(means)g(one)g(or)g(more)h -Fe(a)s Fg('s.)40 2738 y Fh(2)57 2754 y Fg(Actually)m(,)g(a)f(function)i -(de\014nition)h(is)d(an)g(assignmen)o(t)i(to)e(a)g(global)i(v)n(ariable;)g -(see)e(Section)i(3.)910 2976 y Fn(2)p eop +2 1 bop 30 199 a Fl(ftp.icad.puc-rio.br:/pub/lu)o(a/lua-2)o(.2.tar.)o +(gz)-42 293 y Fn(or)15 b(b)o(y)g(WWW)g(\(W)l(orld)f(Wide)h(W)l(eb\))g +(from)30 387 y Fl(http://www.inf.puc-rio.br/~)o(roberto)o(/lua.ht)o(ml) +-42 530 y Fo(2)67 b(En)n(vironmen)n(t)25 b(and)e(Mo)r(dules)-42 +632 y Fn(All)10 b(statemen)o(ts)e(in)i(Lua)h(are)f(executed)h(in)g(a)f +Fm(glob)n(al)h(envir)n(onment)p Fn(.)17 b(This)9 b(en)o(vironmen)o(t,)h +(whic)o(h)g(k)o(eeps)h(all)e(global)-42 688 y(v)m(ariables)14 +b(and)g(functions,)f(is)g(initialized)g(at)g(the)h(b)q(eginning)g(of)f +(the)h(em)o(b)q(edding)f(program)f(and)i(p)q(ersists)f(un)o(til)-42 +744 y(its)i(end.)29 801 y(The)g(global)d(en)o(vironmen)o(t)h(can)h(b)q +(e)h(manipulated)e(b)o(y)h(Lua)h(co)q(de)g(or)e(b)o(y)h(the)h(em)o(b)q +(edding)f(program,)e(whic)o(h)-42 857 y(can)k(read)f(and)g(write)g +(global)e(v)m(ariables)i(using)g(functions)g(in)g(the)g(library)f(that) +h(implemen)o(ts)d(Lua.)29 914 y(Global)g(v)m(ariables)h(do)h(not)f +(need)h(declaration.)k(An)o(y)c(v)m(ariable)f(is)g(assumed)g(to)g(b)q +(e)h(global)e(unless)i(explicitly)-42 970 y(declared)20 +b(lo)q(cal)e(\(see)h(lo)q(cal)f(declarations,)h(Section)g(4.4.5\).)30 +b(Before)19 b(the)g(\014rst)g(assignmen)o(t,)e(the)j(v)m(alue)f(of)g(a) +-42 1027 y(global)14 b(v)m(ariable)h(is)g Fk(nil)p Fn(.)29 +1083 y(The)g(unit)g(of)g(execution)h(of)e(Lua)i(is)f(called)f(a)h +Fm(chunk)p Fn(.)20 b(The)15 b(syn)o(tax)g(for)f(c)o(h)o(unks)i(is:)1480 +1067 y Fj(1)42 1155 y Fm(chunk)50 b Fi(!)g(f)p Fm(statement)32 +b Fi(j)16 b Fm(function)s Fi(g)-42 1227 y Fn(A)f(c)o(h)o(unk)f(ma)o(y)e +(con)o(tain)h(statemen)o(ts)f(and)i(function)g(de\014nitions,)g(and)g +(ma)o(y)e(b)q(e)j(in)f(a)g(\014le)g(or)f(in)h(a)g(string)f(inside)-42 +1284 y(the)k(host)f(program.)22 b(When)17 b(a)g(c)o(h)o(unk)g(is)f +(executed,)h(\014rst)g(all)e(its)h(functions)g(and)h(statemen)o(ts)e +(are)h(compiled,)-42 1340 y(then)d(the)e(statemen)o(ts)f(are)i +(executed)g(in)g(sequen)o(tial)f(order.)18 b(All)11 b(mo)q +(di\014cations)f(a)i(c)o(h)o(unk)g(e\013ects)f(on)h(the)g(global)-42 +1397 y(en)o(vironmen)o(t)k(p)q(ersist)h(after)f(its)g(end.)27 +b(Those)17 b(include)g(mo)q(di\014cations)f(to)g(global)g(v)m(ariables) +g(and)i(de\014nitions)-42 1453 y(of)d(new)h(functions)285 +1437 y Fj(2)303 1453 y Fn(.)-42 1596 y Fo(3)67 b(T)n(yp)r(es)-42 +1698 y Fn(Lua)14 b(is)g(a)f(dynamically)f(t)o(yp)q(ed)i(language.)k(V)l +(ariables)13 b(do)h(not)f(ha)o(v)o(e)g(t)o(yp)q(es;)h(only)f(v)m(alues) +h(do.)19 b(All)13 b(v)m(alues)h(carry)-42 1754 y(their)h(o)o(wn)g(t)o +(yp)q(e.)20 b(Therefore,)15 b(there)g(are)g(no)g(t)o(yp)q(e)g +(de\014nitions)g(in)g(the)g(language.)29 1811 y(There)20 +b(are)f(sev)o(en)h(basic)f(t)o(yp)q(es)h(in)g(Lua:)29 +b Fm(nil)p Fn(,)19 b Fm(numb)n(er)p Fn(,)h Fm(string)p +Fn(,)g Fm(function)p Fn(,)g Fm(CF)m(unction)p Fn(,)e +Fm(user)n(data)p Fn(,)j(and)-42 1867 y Fm(table)p Fn(.)f +Fm(Nil)14 b Fn(is)g(the)g(t)o(yp)q(e)h(of)f(the)h(v)m(alue)g +Fk(nil)p Fn(,)e(whose)h(main)f(prop)q(ert)o(y)h(is)h(to)e(b)q(e)j +(di\013eren)o(t)d(from)g(an)o(y)h(other)h(v)m(alue.)-42 +1924 y Fm(Numb)n(er)h Fn(represen)o(ts)f(real)f(\(\015oating)g(p)q(oin) +o(t\))g(n)o(um)o(b)q(ers,)h(while)f Fm(string)h Fn(has)g(the)g(usual)g +(meaning.)29 1980 y(F)l(unctions)20 b(are)f(considered)i(\014rst-class) +e(v)m(alues)h(in)g(Lua.)34 b(This)19 b(means)g(that)h(functions)f(can)h +(b)q(e)h(stored)-42 2037 y(in)c(v)m(ariables,)g(passed)g(as)g(argumen)o +(ts)f(to)g(other)h(functions)g(and)g(returned)h(as)e(results.)26 +b(When)17 b(a)g(function)g(is)-42 2093 y(de\014ned)g(in)d(Lua,)h(its)f +(b)q(o)q(dy)i(is)e(compiled)f(and)i(stored)g(in)f(a)h(giv)o(en)f(v)m +(ariable.)19 b(Lua)c(can)g(call)f(\(and)h(manipulate\))-42 +2150 y(functions)g(written)g(in)g(Lua)g(and)h(functions)f(written)f(in) +h(C;)f(the)i(latter)e(ha)o(v)o(e)g(t)o(yp)q(e)i Fm(CF)m(unction)s +Fn(.)29 2206 y(The)i(t)o(yp)q(e)f Fm(user)n(data)h Fn(is)g(pro)o(vided) +f(to)g(allo)o(w)f(arbitrary)f(C)j(p)q(oin)o(ters)f(to)g(b)q(e)h(stored) +f(in)g(Lua)h(v)m(ariables.)26 b(It)-42 2262 y(corresp)q(onds)18 +b(to)f Fl(void*)f Fn(and)i(has)f(no)g(pre-de\014ned)j(op)q(erations)c +(in)h(Lua,)h(b)q(esides)g(assignmen)o(t)d(and)j(equalit)o(y)-42 +2319 y(test.)24 b(Ho)o(w)o(ev)o(er,)16 b(b)o(y)g(using)h(fallbac)o(ks,) +e(the)i(programmer)c(ma)o(y)i(de\014ne)j(op)q(erations)e(for)g +Fm(user)n(data)h Fn(v)m(alues;)g(see)-42 2375 y(Section)f(4.7.)29 +2432 y(The)c(t)o(yp)q(e)g Fm(table)g Fn(implemen)o(ts)d(asso)q(ciativ)o +(e)i(arra)o(ys,)g(that)g(is,)h(arra)o(ys)e(whic)o(h)i(can)g(b)q(e)h +(indexed)g(not)f(only)f(with)-42 2488 y(n)o(um)o(b)q(ers,)k(but)g(with) +g(an)o(y)g(v)m(alue)h(\(except)f Fk(nil)p Fn(\).)20 b(Therefore,)15 +b(this)f(t)o(yp)q(e)i(ma)o(y)e(b)q(e)i(used)g(not)f(only)g(to)f +(represen)o(t)p -42 2530 780 2 v 10 2557 a Fh(1)28 2573 +y Fg(As)e(usual,)i Ff(f)p Fe(a)s Ff(g)f Fg(means)h(0)f(or)g(more)g +Fe(a)s Fg('s,)f([)p Fe(a)s Fg(])f(means)j(an)f(optional)j +Fe(a)c Fg(and)i Ff(f)p Fe(a)s Ff(g)1179 2557 y Fh(+)1217 +2573 y Fg(means)f(one)h(or)f(more)g Fe(a)s Fg('s.)10 +2603 y Fh(2)28 2619 y Fg(Actually)m(,)h(a)f(function)h(de\014nition)i +(is)d(an)h(assignmen)o(t)h(to)d(a)h(global)j(v)n(ariable;)e(see)f +(Section)i(3.)922 2748 y Fn(2)p eop %%Page: 3 3 -bop -12 160 a Fo(4)69 b(The)23 b(Language)-12 261 y Fn(This)16 -b(section)g(describ)q(es)h(the)e(lexis,)h(syn)o(tax)e(and)i(seman)o(tics)f -(of)g(Lua.)-12 383 y Fd(4.1)56 b(Lexical)17 b(Con)n(v)n(en)n(tions)-12 -469 y Fn(Lua)c(is)g(a)f(case)g(sensitiv)o(e)i(language.)19 -b(Iden)o(ti\014ers)14 b(can)e(b)q(e)h(an)o(y)f(string)h(of)f(letters,)g -(digits,)i(and)e(underscores,)-12 525 y(not)h(b)q(eginning)h(with)f(a)g -(digit.)20 b(The)13 b(follo)o(wing)g(w)o(ords)f(are)h(reserv)o(ed,)g(and)g -(cannot)f(b)q(e)h(used)h(as)e(iden)o(ti\014ers:)203 619 y Fl(and)143 -b(do)190 b(else)143 b(elseif)95 b(end)203 675 y(function)23 -b(if)190 b(local)119 b(nil)167 b(not)203 732 y(or)g(repeat)94 -b(return)h(until)119 b(then)95 b(while)59 826 y Fn(The)15 b(follo)o(wing)h -(strings)f(denote)h(other)e(tok)o(ens:)203 919 y Fl(~=)47 b(<=)h(>=)f(<)72 -b(>)f(==)48 b(=)71 b(..)48 b(+)71 b(-)g(*)h(/)203 976 y(\045)f(\()h(\))f({)h -(})f([)h(])f(;)h(,)f(.)59 1070 y Fn(Literal)17 b(strings)f(can)h(b)q(e)g -(delimited)h(b)o(y)f(matc)o(hing)f(single)i(or)d(double)j(quotes,)e(and)g -(can)h(con)o(tain)f(the)-12 1126 y(C-lik)o(e)f(escap)q(e)g(sequences)g -Fl('\\n')p Fn(,)e Fl('\\t')h Fn(and)g Fl('\\r')p Fn(.)19 b(Commen)o(ts)13 -b(start)g(an)o(ywhere)h(outside)g(a)g(string)g(with)-12 1183 -y(a)h(double)i(h)o(yphen)f(\()p Fl(--)p Fn(\))e(and)h(run)h(un)o(til)g(the)f -(end)h(of)f(the)g(line.)59 1239 y(Numerical)e(constan)o(ts)e(ma)o(y)g(b)q(e)h -(written)g(with)g(an)f(optional)h(decimal)i(part,)d(and)h(an)g(optional)g -(decimal)-12 1296 y(exp)q(onen)o(t.)21 b(Examples)15 b(of)g(v)m(alid)i(n)o -(umerical)f(constan)o(ts)f(are:)155 1389 y Fl(4)119 b(4.)g(.4)g(4.57e-3)g -(.3e12)-12 1511 y Fd(4.2)56 b(Co)r(ercion)-12 1597 y Fn(Lua)17 -b(pro)o(vides)g(some)g(automatic)f(con)o(v)o(ersions.)24 b(An)o(y)17 -b(arithmetic)g(op)q(eration)g(applied)i(to)d(a)g(string)h(tries)-12 -1653 y(to)12 b(con)o(v)o(ert)g(that)g(string)g(to)g(a)g(n)o(um)o(b)q(er,)h -(follo)o(wing)g(the)g(usual)g(rules.)20 b(Con)o(v)o(ersely)l(,)13 -b(whenev)o(er)g(a)f(n)o(um)o(b)q(er)h(is)-12 1710 y(used)h(when)f(a)f(string) -h(is)g(exp)q(ected,)i(that)d(n)o(um)o(b)q(er)h(is)g(con)o(v)o(erted)g(to)f(a) -g(string,)h(according)h(to)e(the)h(follo)o(wing)-12 1766 y(rule:)20 -b(if)15 b(the)f(n)o(um)o(b)q(er)h(is)g(an)f(in)o(teger,)g(it)h(is)f(written)h -(without)f(exp)q(onen)o(t)h(or)e(decimal)j(p)q(oin)o(t;)f(otherwise,)f(it)-12 -1823 y(is)i(formatted)e(follo)o(wing)i(the)f(\\)p Fl(\045g)p -Fn(")f(con)o(v)o(ersion)i(sp)q(eci\014cation)h(of)e(the)g(standard)g -Fl(printf)f Fn(C)h(function.)-12 1944 y Fd(4.3)56 b(Adjustmen)n(t)-12 -2030 y Fn(F)l(unctions)16 b(in)h(Lua)e(can)h(return)f(man)o(y)g(v)m(alues.)22 -b(Because)16 b(there)f(are)h(no)f(t)o(yp)q(e)g(declarations,)h(the)g(system) --12 2087 y(do)q(es)21 b(not)f(kno)o(w)g(ho)o(w)g(man)o(y)g(v)m(alues)i(a)e -(function)h(will)h(return,)g(or)e(ho)o(w)g(man)o(y)g(parameters)f(it)i -(needs.)-12 2143 y(Therefore,)14 b(sometimes,)f(a)h(list)g(of)f(v)m(alues)i -(m)o(ust)e(b)q(e)h Fm(adjuste)n(d)5 b Fn(,)14 b(at)f(run)h(time,)g(to)f(a)g -(giv)o(en)h(length.)20 b(If)14 b(there)-12 2200 y(are)19 b(more)g(v)m(alues)i -(than)e(are)g(needed,)i(the)f(last)f(v)m(alues)i(are)e(thro)o(wn)f(a)o(w)o(a) -o(y)l(.)31 b(If)20 b(there)f(are)h(more)e(needs)-12 2256 y(than)d(v)m(alues,) -h(the)g(list)g(is)g(extended)g(with)g(as)f(man)o(y)f Fk(nil)p -Fn('s)i(as)f(needed.)22 b(Adjustmen)o(t)15 b(o)q(ccurs)g(in)h(m)o(ultiple)-12 -2312 y(assignmen)o(t)f(and)h(function)g(calls.)-12 2434 y Fd(4.4)56 -b(Statemen)n(ts)-12 2520 y Fn(Lua)18 b(supp)q(orts)f(an)g(almost)f(con)o(v)o -(en)o(tional)i(set)e(of)h(statemen)o(ts.)24 b(The)18 b(con)o(v)o(en)o(tional) -f(commands)g(include)-12 2576 y(assignmen)o(t,)d(con)o(trol)h(structures)f -(and)h(pro)q(cedure)g(calls.)21 b(Non-con)o(v)o(en)o(tional)15 -b(commands)g(include)i(table)-12 2633 y(constructors,)d(explained)j(in)f -(Section)h(4.5.7,)c(and)i(lo)q(cal)h(v)m(ariable)h(declarations.)910 -2976 y(3)p eop +3 2 bop -42 199 a Fn(ordinary)15 b(arra)o(ys,)e(but)i(also)f(sym)o(b)q +(ol)g(tables,)g(sets,)g(records,)h(etc.)20 b(T)l(o)15 +b(represen)o(t)g(records,)f(Lua)i(uses)f(the)g(\014eld)-42 +256 y(name)k(as)f(an)h(index.)32 b(The)19 b(language)g(supp)q(orts)g +(this)f(represen)o(tation)g(b)o(y)i(pro)o(viding)e Fl(a.name)g +Fn(as)g(syn)o(tactic)-42 312 y(sugar)i(for)f Fl(a["name"])p +Fn(.)33 b(T)l(ables)20 b(ma)o(y)e(also)h(carry)g(metho)q(ds.)34 +b(Because)20 b(functions)g(are)g(\014rst)f(class)h(v)m(alues,)-42 +369 y(table)d(\014elds)g(ma)o(y)e(con)o(tain)g(functions.)25 +b(The)16 b(form)f Fl(t:f\(x\))h Fn(is)g(syn)o(tactic)g(sugar)g(for)g +Fl(t.f\(t,x\))p Fn(,)g(whic)o(h)g(calls)-42 425 y(the)g(metho)q(d)e +Fl(f)h Fn(from)f(the)h(table)g Fl(t)g Fn(passing)f(itself)g(as)h(the)g +(\014rst)g(parameter.)29 482 y(It)d(is)f(imp)q(ortan)o(t)e(to)i(notice) +g(that)g(tables)g(are)g(ob)s(jects,)g(and)h(not)f(v)m(alues.)19 +b(V)l(ariables)10 b(cannot)i(con)o(tain)e(tables,)-42 +538 y(only)15 b(references)g(to)f(them.)19 b(Assignmen)o(t,)12 +b(parameter)h(passing)i(and)f(returns)h(alw)o(a)o(ys)e(manipulate)g +(references)-42 594 y(to)k(tables,)f(and)i(do)f(not)f(imply)g(an)o(y)h +(kind)g(of)f(cop)o(y)l(.)26 b(Moreo)o(v)o(er,)16 b(tables)g(m)o(ust)f +(b)q(e)j(explicitly)e(created)h(b)q(efore)-42 651 y(used;)f(see)f +(Section)g(4.5.7.)-42 794 y Fo(4)67 b(The)23 b(Language)-42 +895 y Fn(This)15 b(section)g(describ)q(es)h(the)f(lexis,)f(syn)o(tax)h +(and)g(seman)o(tics)e(of)i(Lua.)-42 1017 y Fd(4.1)56 +b(Lexical)19 b(Con)n(v)n(en)n(tions)-42 1103 y Fn(Lua)g(is)e(a)g(case)h +(sensitiv)o(e)f(language.)27 b(Iden)o(ti\014ers)18 b(can)g(b)q(e)g(an)o +(y)f(string)g(of)g(letters,)h(digits,)e(and)i(underscores,)-42 +1159 y(not)d(b)q(eginning)h(with)e(a)h(digit.)k(The)c(follo)o(wing)e(w) +o(ords)i(are)f(reserv)o(ed,)h(and)h(cannot)f(b)q(e)h(used)f(as)g(iden)o +(ti\014ers:)173 1253 y Fl(and)143 b(do)191 b(else)142 +b(elseif)95 b(end)173 1309 y(function)23 b(if)191 b(local)118 +b(nil)167 b(not)173 1366 y(or)g(repeat)95 b(return)f(until)119 +b(then)95 b(while)29 1459 y Fn(The)15 b(follo)o(wing)e(strings)i +(denote)g(other)g(tok)o(ens:)173 1552 y Fl(~=)48 b(<=)f(>=)h(<)71 +b(>)h(==)47 b(=)71 b(..)48 b(+)71 b(-)h(*)f(/)173 1609 +y(\045)h(\()f(\))h({)f(})h([)f(])g(;)h(,)f(.)29 1702 +y Fn(Literal)17 b(strings)f(can)i(b)q(e)g(delimited)e(b)o(y)i(matc)o +(hing)d(single)i(or)g(double)h(quotes,)g(and)f(can)h(con)o(tain)f(the)h +(C-)-42 1758 y(lik)o(e)i(escap)q(e)i(sequences)g Fl('\\n')p +Fn(,)f Fl('\\t')f Fn(and)h Fl('\\r')p Fn(.)36 b(Literal)20 +b(strings)g(can)g(also)g(b)q(e)i(delimited)d(b)o(y)h(matc)o(hing)-42 +1815 y Fl([[)k(...)g(]])p Fn(.)18 b(Literals)12 b(in)h(this)f(last)g +(form)f(ma)o(y)h(run)h(for)f(sev)o(eral)g(lines,)h(ma)o(y)e(con)o(tain) +h(nested)i Fl([[)23 b(...)h(]])p Fn(,)12 b(and)-42 1871 +y(do)k(not)e(in)o(terpret)h(escap)q(e)h(sequences.)29 +1928 y(Commen)o(ts)c(start)h(an)o(ywhere)i(outside)g(a)f(string)g(with) +g(a)g(double)h(h)o(yphen)h(\()p Fl(--)p Fn(\))e(and)h(run)g(un)o(til)f +(the)g(end)i(of)-42 1984 y(the)g(line.)29 2041 y(Numerical)h(constan)o +(ts)g(ma)o(y)f(b)q(e)j(written)e(with)h(an)g(optional)e(decimal)h +(part,)h(and)g(an)g(optional)f(decimal)-42 2097 y(exp)q(onen)o(t.)k +(Examples)14 b(of)g(v)m(alid)h(n)o(umerical)f(constan)o(ts)g(are:)126 +2190 y Fl(4)119 b(4.)g(.4)g(4.57e-3)f(.3e12)-42 2312 +y Fd(4.2)56 b(Co)r(ercion)-42 2398 y Fn(Lua)19 b(pro)o(vides)f(some)f +(automatic)f(con)o(v)o(ersions.)29 b(An)o(y)19 b(arithmetic)d(op)q +(eration)i(applied)g(to)g(a)g(string)f(tries)h(to)-42 +2454 y(con)o(v)o(ert)d(that)f(string)g(to)h(a)f(n)o(um)o(b)q(er,)g +(follo)o(wing)f(the)i(usual)g(rules.)20 b(Con)o(v)o(ersely)l(,)14 +b(whenev)o(er)h(a)g(n)o(um)o(b)q(er)f(is)h(used)-42 2511 +y(when)h(a)f(string)f(is)h(exp)q(ected,)h(that)e(n)o(um)o(b)q(er)h(is)g +(con)o(v)o(erted)g(to)f(a)h(string,)f(according)h(to)f(the)h(follo)o +(wing)e(rule:)20 b(if)-42 2567 y(the)13 b(n)o(um)o(b)q(er)g(is)f(an)h +(in)o(teger,)f(it)g(is)g(written)g(without)g(exp)q(onen)o(t)h(or)f +(decimal)f(p)q(oin)o(t;)i(otherwise,)f(it)g(is)h(formatted)-42 +2623 y(follo)o(wing)g(the)j(\\)p Fl(\045g)p Fn(")e(con)o(v)o(ersion)g +(sp)q(eci\014cation)h(of)g(the)h(standard)e Fl(printf)h +Fn(C)g(function.)922 2748 y(3)p eop %%Page: 4 4 -bop -12 160 a Fk(4.4.1)52 b(Blo)q(c)o(ks)-12 245 y Fn(A)13 -b(blo)q(c)o(k)g(is)g(a)f(list)i(of)e(statemen)o(ts,)g(executed)h(sequen)o -(tially)l(.)21 b(An)o(y)13 b(statemen)o(t)e(can)i(b)q(e)g(optionally)h(follo) -o(w)o(ed)-12 302 y(b)o(y)h(a)g(semicolon.)72 370 y Fm(blo)n(ck)49 -b Fi(!)h(f)p Fm(stat)16 b(sc)s Fi(g)f Fn([)p Fm(r)n(et)h(sc)s -Fn(])128 427 y Fm(sc)49 b Fi(!)h Fn([';'])-12 495 y(F)l(or)14 -b(syn)o(tactic)h(reasons,)e(a)i(return)f(statemen)o(t)g(can)g(only)h(b)q(e)g -(written)g(as)f(the)h(last)f(statemen)o(t)g(of)g(a)g(blo)q(c)o(k.)-12 -551 y(This)i(restriction)g(also)f(a)o(v)o(oids)g(some)g(\\statemen)o(t)e(not) -i(reac)o(hed")g(errors.)-12 671 y Fk(4.4.2)52 b(Assignmen)n(t)-12 -757 y Fn(The)17 b(language)g(allo)o(ws)g(m)o(ultiple)i(assignmen)o(t.)24 -b(Therefore,)17 b(the)g(syn)o(tax)f(de\014nes)i(a)e(list)i(of)e(v)m(ariables) -i(on)-12 814 y(the)13 b(left)g(side,)g(and)g(a)f(list)i(of)e(expressions)h -(on)g(the)f(righ)o(t)h(side.)20 b(Both)12 b(lists)h(ha)o(v)o(e)f(their)h -(elemen)o(ts)h(separated)-12 870 y(b)o(y)h(commas.)146 938 -y Fm(stat)49 b Fi(!)i Fm(varlist1)16 b Fn('=')g Fm(explist1)72 -995 y(varlist1)49 b Fi(!)i Fm(var)16 b Fi(f)p Fn(',')f Fm(var)5 -b Fi(g)-12 1063 y Fn(This)16 b(statemen)o(t)d(\014rst)i(ev)m(aluates)g(all)h -(v)m(alues)g(on)e(the)h(righ)o(t)g(side)g(and)g(ev)o(en)o(tual)g(indices)i -(on)e(the)g(left)g(side,)-12 1119 y(and)h(then)f(mak)o(es)g(the)g(assignmen)o -(ts.)20 b(Therefore,)14 b(it)i(can)f(b)q(e)h(used)g(to)e(exc)o(hange)i(t)o(w) -o(o)e(v)m(alues,)i(as)e(in)60 1213 y Fl(x,)23 b(y)h(=)g(y,)f(x)-12 -1307 y Fn(Before)18 b(the)g(assignmen)o(t,)g(the)g(list)g(of)g(v)m(alues)h -(is)f Fm(adjuste)n(d)g Fn(to)f(the)h(length)h(of)e(the)h(list)h(of)e(v)m -(ariables;)j(see)-12 1364 y(Section)c(4.3.)72 1436 y Fm(var)50 -b Fi(!)g Fm(name)-12 1508 y Fn(A)15 b(single)i(name)e(can)g(denote)h(a)f -(global)h(or)e(a)h(lo)q(cal)i(v)m(ariable,)f(or)e(a)h(formal)g(parameter.)72 -1580 y Fm(var)50 b Fi(!)g Fm(var)17 b Fn('[')e Fm(exp1)i Fn(']')-12 -1652 y(Square)f(brac)o(k)o(ets)f(are)g(used)h(to)f(index)i(a)e(table.)21 -b(If)16 b Fl(var)f Fn(results)h(in)g(a)f(table)h(v)m(alue,)h(the)e(\014eld)i -(indexed)g(b)o(y)-12 1708 y(the)i(expression)g(v)m(alue)h(gets)e(the)h -(assigned)g(v)m(alue.)32 b(Otherwise,)20 b(the)f(fallbac)o(k)g -Fm(settable)f Fn(is)h(called,)i(with)-12 1765 y(three)15 b(parameters:)j(the) -c(v)m(alue)i(of)e Fl(var)p Fn(,)f(the)i(v)m(alue)g(of)f(expression,)h(and)g -(the)f(v)m(alue)h(b)q(eing)h(assigned)f(to)e(it;)-12 1821 y(see)j(Section)g -(4.7.)72 1893 y Fm(var)50 b Fi(!)g Fm(var)17 b Fn('.')j Fm(name)-12 -1966 y Fn(The)c(syn)o(tax)e Fl(var.NAME)g Fn(is)i(just)f(syn)o(tactic)g -(sugar)g(for)f Fl(var["NAME"])p Fn(.)-12 2086 y Fk(4.4.3)52 -b(Con)o(trol)17 b(Structures)-12 2171 y Fn(The)e(condition)h(expression)f(of) -f(a)h(con)o(trol)f(structure)g(can)h(return)g(an)o(y)f(v)m(alue.)21 -b(All)16 b(v)m(alues)f(di\013eren)o(t)g(from)-12 2228 y Fk(nil)f -Fn(are)f(considered)h(true,)f(while)i Fk(nil)f Fn(is)g(considered)g(false.)20 -b Fl(if)p Fn('s,)12 b Fl(while)p Fn('s)g(and)h Fl(repeat)p -Fn('s)f(ha)o(v)o(e)g(the)i(usual)-12 2284 y(meaning.)100 2352 -y Fm(stat)50 b Fi(!)g Fk(while)17 b Fm(exp1)g Fk(do)f Fm(blo)n(ck)g -Fk(end)275 2409 y Fi(j)32 b Fk(rep)q(eat)17 b Fm(blo)n(ck)f -Fk(un)o(til)h Fm(exp1)275 2465 y Fi(j)32 b Fk(if)17 b Fm(exp1)g -Fk(then)f Fm(blo)n(ck)g Fi(f)p Fm(elseif)8 b Fi(g)16 b Fn([)p -Fk(else)g Fm(blo)n(ck)5 b Fn(])15 b Fk(end)72 2522 y Fm(elseif)49 -b Fi(!)h Fk(elseif)17 b Fm(exp1)f Fk(then)h Fm(blo)n(ck)59 -2615 y Fn(A)g Fl(return)g Fn(is)h(used)h(to)e(return)g(v)m(alues)i(from)e(a)g -(function.)28 b(Because)18 b(a)g(function)g(ma)o(y)f(return)h(more)-12 -2672 y(than)d(one)h(v)m(alue,)g(the)f(syn)o(tax)f(for)h(a)g(return)g -(statemen)o(t)f(is:)72 2744 y Fm(r)n(et)49 b Fi(!)i Fk(return)15 -b Fm(explist)910 2976 y Fn(4)p eop +4 3 bop -42 199 a Fd(4.3)56 b(Adjustmen)n(t)-42 285 y +Fn(F)l(unctions)14 b(in)g(Lua)h(can)f(return)g(man)o(y)f(v)m(alues.)19 +b(Because)c(there)f(are)g(no)g(t)o(yp)q(e)h(declarations,)d(the)i +(system)f(do)q(es)-42 342 y(not)18 b(kno)o(w)f(ho)o(w)g(man)o(y)f(v)m +(alues)i(a)g(function)f(will)g(return,)g(or)h(ho)o(w)f(man)o(y)f +(parameters)g(it)h(needs.)28 b(Therefore,)-42 398 y(sometimes,)10 +b(a)i(list)g(of)g(v)m(alues)h(m)o(ust)e(b)q(e)i Fm(adjuste)n(d)5 +b Fn(,)13 b(at)f(run)g(time,)f(to)h(a)h(giv)o(en)f(length.)18 +b(If)13 b(there)g(are)f(more)f(v)m(alues)-42 454 y(than)17 +b(are)f(needed,)i(the)f(last)f(v)m(alues)h(are)f(thro)o(wn)g(a)o(w)o(a) +o(y)l(.)23 b(If)17 b(there)g(are)f(more)g(needs)h(than)g(v)m(alues,)g +(the)f(list)g(is)-42 511 y(extended)j(with)e(as)h(man)o(y)e +Fk(nil)p Fn('s)h(as)g(needed.)29 b(Adjustmen)o(t)17 b(o)q(ccurs)h(in)f +(m)o(ultiple)f(assignmen)o(t)g(and)i(function)-42 567 +y(calls.)-42 689 y Fd(4.4)56 b(Statemen)n(ts)-42 775 +y Fn(Lua)19 b(supp)q(orts)f(an)f(almost)f(con)o(v)o(en)o(tional)g(set)i +(of)f(statemen)o(ts.)26 b(The)18 b(con)o(v)o(en)o(tional)e(commands)f +(include)k(as-)-42 831 y(signmen)o(t,)d(con)o(trol)f(structures)i(and)g +(pro)q(cedure)h(calls.)24 b(Non-con)o(v)o(en)o(tional)16 +b(commands)e(include)k(table)e(con-)-42 888 y(structors,)e(explained)i +(in)f(Section)g(4.5.7,)e(and)i(lo)q(cal)g(v)m(ariable)f(declarations.) +-42 1008 y Fk(4.4.1)52 b(Blo)q(c)o(ks)-42 1094 y Fn(A)15 +b(blo)q(c)o(k)f(is)f(a)h(list)f(of)h(statemen)o(ts,)e(executed)j +(sequen)o(tially)l(.)k(An)o(y)14 b(statemen)o(t)e(can)j(b)q(e)g +(optionally)d(follo)o(w)o(ed)h(b)o(y)-42 1150 y(a)i(semicolon.)42 +1209 y Fm(blo)n(ck)49 b Fi(!)h(f)p Fm(stat)16 b(sc)s +Fi(g)g Fn([)p Fm(r)n(et)f(sc)s Fn(])98 1266 y Fm(sc)49 +b Fi(!)h Fn([';'])-42 1334 y(F)l(or)13 b(syn)o(tactic)f(reasons,)g(a)h +(return)g(statemen)o(t)e(can)i(only)g(b)q(e)g(written)f(as)h(the)g +(last)f(statemen)o(t)f(of)h(a)h(blo)q(c)o(k.)19 b(This)-42 +1391 y(restriction)14 b(also)g(a)o(v)o(oids)g(some)g(\\statemen)o(t)f +(not)i(reac)o(hed")g(errors.)-42 1511 y Fk(4.4.2)52 b(Assignmen)o(t)-42 +1597 y Fn(The)18 b(language)e(allo)o(ws)f(m)o(ultiple)g(assignmen)o(t.) +23 b(Therefore,)17 b(the)g(syn)o(tax)g(de\014nes)h(a)f(list)e(of)i(v)m +(ariables)f(on)h(the)-42 1653 y(left)h(side,)g(and)h(a)e(list)g(of)h +(expressions)g(on)g(the)g(righ)o(t)f(side.)29 b(Both)18 +b(lists)f(ha)o(v)o(e)g(their)h(elemen)o(ts)f(separated)h(b)o(y)-42 +1709 y(commas.)116 1769 y Fm(stat)50 b Fi(!)g Fm(varlist1)16 +b Fn('=')g Fm(explist1)42 1825 y(varlist1)50 b Fi(!)g +Fm(var)17 b Fi(f)p Fn(',')d Fm(var)5 b Fi(g)-42 1894 +y Fn(This)15 b(statemen)o(t)d(\014rst)i(ev)m(aluates)g(all)g(v)m(alues) +g(on)h(the)f(righ)o(t)g(side)g(and)h(ev)o(en)o(tual)f(indices)g(on)h +(the)f(left)g(side,)g(and)-42 1950 y(then)i(mak)o(es)e(the)h(assignmen) +o(ts.)j(Therefore,)c(it)h(can)g(b)q(e)h(used)g(to)e(exc)o(hange)i(t)o +(w)o(o)e(v)m(alues,)h(as)f(in)30 2044 y Fl(x,)24 b(y)f(=)h(y,)g(x)-42 +2138 y Fn(Before)f(the)g(assignmen)o(t,)f(the)g(list)f(of)i(v)m(alues)f +(is)g Fm(adjuste)n(d)h Fn(to)f(the)h(length)f(of)g(the)h(list)e(of)h(v) +m(ariables;)j(see)-42 2194 y(Section)16 b(4.3.)42 2266 +y Fm(var)50 b Fi(!)g Fm(name)-42 2338 y Fn(A)16 b(single)e(name)g(can)i +(denote)f(a)g(global)f(or)h(a)g(lo)q(cal)f(v)m(ariable,)g(or)h(a)g +(formal)d(parameter.)42 2410 y Fm(var)50 b Fi(!)g Fm(var)17 +b Fn('[')e Fm(exp1)i Fn(']')-42 2483 y(Square)j(brac)o(k)o(ets)f(are)h +(used)g(to)f(index)h(a)f(table.)33 b(If)20 b Fl(var)f +Fn(results)g(in)g(a)h(table)f(v)m(alue,)h(the)g(\014eld)g(indexed)h(b)o +(y)-42 2539 y(the)c(expression)f(v)m(alue)h(gets)f(the)h(assigned)f(v)m +(alue.)24 b(Otherwise,)16 b(the)h(fallbac)o(k)e Fm(settable)h +Fn(is)g(called,)g(with)f(three)922 2748 y(4)p eop %%Page: 5 5 -bop -12 160 a Fk(4.4.4)52 b(Expressions)16 b(as)i(Statemen)o(ts)-12 -245 y Fn(All)c(expressions)e(with)h(p)q(ossible)h(side-e\013ects)e(can)h(b)q -(e)f(executed)h(as)f(statemen)o(ts.)18 b(These)12 b(include)i(function)-12 -302 y(calls)i(and)g(table)f(constructors:)72 361 y Fm(stat)50 -b Fi(!)g Fm(functionc)n(al)r(l)72 418 y(stat)g Fi(!)g Fm(table)n(c)n -(onstructor)-12 486 y Fn(Ev)o(en)o(tual)16 b(returned)g(v)m(alues)h(are)f -(thro)o(wn)f(a)o(w)o(a)o(y)l(.)20 b(F)l(unction)c(calls)h(are)f(explained)i -(in)e(Section)h(4.5.8;)d(con-)-12 542 y(structors)g(are)h(the)h(sub)s(ject)f -(of)f(Section)i(4.5.7.)-12 662 y Fk(4.4.5)52 b(Lo)q(cal)20 -b(Declarations)-12 748 y Fn(Lo)q(cal)c(v)m(ariables)g(can)f(b)q(e)g(declared) -h(an)o(ywhere)f(inside)h(a)f(blo)q(c)o(k.)20 b(Their)c(scop)q(e)f(b)q(egins)h -(after)e(the)h(declara-)-12 805 y(tion)i(and)h(lasts)f(un)o(til)h(the)f(end)h -(of)e(the)h(blo)q(c)o(k.)27 b(The)17 b(declaration)h(ma)o(y)e(include)k(an)d -(initial)i(assignmen)o(t:)122 921 y Fm(stat)50 b Fi(!)g Fk(lo)q(cal)18 -b Fm(de)n(clist)e Fn([)p Fm(init)t Fn(])72 977 y Fm(de)n(clist)49 -b Fi(!)h Fm(name)16 b Fi(f)p Fn(',')f Fm(name)s Fi(g)125 1033 -y Fm(init)50 b Fi(!)g Fn('=')16 b Fm(explist1)-12 1102 y Fn(If)d(there)f(is)h -(an)g(initial)h(assignmen)o(t,)f(it)f(has)h(the)f(same)g(seman)o(tics)h(of)f -(a)g(m)o(ultiple)i(assignmen)o(t.)19 b(Otherwise,)-12 1158 -y(all)d(v)m(ariables)h(are)e(initialized)j(with)e Fk(nil)p -Fn(.)-12 1280 y Fd(4.5)56 b(Expressions)-12 1366 y Fk(4.5.1)c(Simple)16 -b(Expressions)-12 1452 y Fn(Simple)h(expressions)f(are:)72 -1520 y Fm(exp)50 b Fi(!)g Fn('\(')15 b Fm(exp)i Fn('\)')72 -1576 y Fm(exp)50 b Fi(!)g Fk(nil)72 1633 y Fm(exp)g Fi(!)g -Fn('n)o(um)o(b)q(er')72 1689 y Fm(exp)g Fi(!)g Fn('literal')72 -1746 y Fm(exp)g Fi(!)g Fm(var)-12 1816 y Fn(Num)o(b)q(ers)17 -b(\(n)o(umerical)h(constan)o(ts\))d(and)i(string)g(literals)g(are)g -(explained)i(in)e(Section)h(4.1.)23 b(V)l(ariables)18 b(are)-12 -1873 y(explained)f(in)g(Section)f(4.4.2.)-12 1993 y Fk(4.5.2)52 -b(Arithmetic)16 b(Op)q(erators)-12 2079 y Fn(Lua)j(supp)q(orts)f(the)h(usual) -g(arithmetic)g(op)q(erators.)28 b(These)19 b(op)q(erators)e(are)h(the)g -(binary)h Fl(+)p Fn(,)g Fl(-)p Fn(,)f Fl(*)p Fn(,)h Fl(/)f -Fn(and)-12 2135 y Fl(^)j Fn(\(exp)q(onen)o(tiation\),)h(and)f(the)f(unary)h -Fl(-)p Fn(.)36 b(If)21 b(the)g(op)q(erands)g(are)f(n)o(um)o(b)q(ers,)i(or)e -(strings)h(that)f(can)h(b)q(e)-12 2192 y(con)o(v)o(erted)15 -b(to)f(n)o(um)o(b)q(ers,)h(according)h(to)e(the)h(rules)h(giv)o(en)f(in)h -(Section)g(4.2,)e(all)i(op)q(erations)f(but)g(exp)q(onen-)-12 -2248 y(tiation)i(ha)o(v)o(e)e(the)i(usual)f(meaning.)24 b(Otherwise,)17 -b(the)f(fallbac)o(k)h(\\arith")e(is)i(called;)h(see)e(Section)h(4.7.)22 -b(An)-12 2305 y(exp)q(onen)o(tiation)17 b(alw)o(a)o(ys)d(calls)i(this)g -(fallbac)o(k.)-12 2425 y Fk(4.5.3)52 b(Relational)20 b(Op)q(erators)-12 -2510 y Fn(Lua)c(o\013ers)e(the)h(follo)o(wing)h(relational)g(op)q(erators:) -155 2604 y Fl(<)72 b(>)f(<=)48 b(>=)f(~=)g(==)-12 2698 y Fn(All)17 -b(return)e Fk(nil)h Fn(as)f(false)g(and)h(1)f(as)f(true.)59 -2754 y(Equalit)o(y)19 b(\014rst)f(compares)g(the)g(t)o(yp)q(es)h(of)f(its)h -(op)q(erands.)30 b(If)18 b(they)h(are)f(di\013eren)o(t,)h(the)g(result)g(is)g -Fk(nil)p Fn(.)-12 2811 y(Otherwise,)h(their)e(v)m(alues)i(are)d(compared.)29 -b(Num)o(b)q(ers)19 b(and)f(strings)g(are)g(compared)g(in)h(the)g(usual)f(w)o -(a)o(y)l(.)910 2976 y(5)p eop +5 4 bop -42 199 a Fn(parameters:)31 b(the)22 b(v)m(alue)f(of)g +Fl(var)p Fn(,)h(the)g(v)m(alue)g(of)f(expression,)h(and)g(the)f(v)m +(alue)h(b)q(eing)g(assigned)f(to)g(it;)i(see)-42 256 +y(Section)16 b(4.7.)42 328 y Fm(var)50 b Fi(!)g Fm(var)17 +b Fn('.')j Fm(name)-42 400 y Fn(The)c(syn)o(tax)e Fl(var.NAME)g +Fn(is)h(just)g(syn)o(tactic)f(sugar)h(for)f Fl(var["NAME"])p +Fn(.)-42 520 y Fk(4.4.3)52 b(Con)o(trol)17 b(Structures)-42 +606 y Fn(The)k(condition)e(expression)h(of)f(a)h(con)o(trol)e +(structure)i(can)g(return)g(an)o(y)g(v)m(alue.)34 b(All)19 +b(v)m(alues)h(di\013eren)o(t)f(from)-42 662 y Fk(nil)f +Fn(are)g(considered)g(true,)h(while)f Fk(nil)f Fn(is)h(considered)h +(false.)28 b Fl(if)p Fn('s,)18 b Fl(while)p Fn('s)f(and)h +Fl(repeat)p Fn('s)f(ha)o(v)o(e)h(the)h(usual)-42 719 +y(meaning.)70 787 y Fm(stat)50 b Fi(!)g Fk(while)15 b +Fm(exp1)i Fk(do)f Fm(blo)n(ck)g Fk(end)245 843 y Fi(j)32 +b Fk(rep)q(eat)17 b Fm(blo)n(ck)f Fk(un)o(til)f Fm(exp1)245 +900 y Fi(j)32 b Fk(if)16 b Fm(exp1)h Fk(then)g Fm(blo)n(ck)e +Fi(f)p Fm(elseif)8 b Fi(g)16 b Fn([)p Fk(else)f Fm(blo)n(ck)5 +b Fn(])15 b Fk(end)42 956 y Fm(elseif)49 b Fi(!)h Fk(elseif)15 +b Fm(exp1)i Fk(then)f Fm(blo)n(ck)29 1049 y Fn(A)g Fl(return)g +Fn(is)g(used)g(to)g(return)g(v)m(alues)h(from)d(a)i(function.)23 +b(Because)17 b(a)f(function)g(ma)o(y)f(return)h(more)f(than)-42 +1106 y(one)h(v)m(alue,)f(the)g(syn)o(tax)g(for)f(a)h(return)g(statemen) +o(t)e(is:)42 1178 y Fm(r)n(et)50 b Fi(!)g Fk(return)16 +b Fm(explist)-42 1370 y Fk(4.4.4)52 b(Expressions)16 +b(as)h(Statemen)o(ts)-42 1456 y Fn(All)h(expressions)h(with)f(p)q +(ossible)g(side-e\013ects)h(can)f(b)q(e)i(executed)f(as)g(statemen)o +(ts.)28 b(These)19 b(include)g(function)-42 1512 y(calls)c(and)g(table) +g(constructors:)42 1572 y Fm(stat)50 b Fi(!)g Fm(functionc)n(al)r(l)42 +1628 y(stat)g Fi(!)g Fm(table)n(c)n(onstructor)-42 1697 +y Fn(Ev)o(en)o(tual)14 b(returned)h(v)m(alues)g(are)g(thro)o(wn)f(a)o +(w)o(a)o(y)l(.)k(F)l(unction)c(calls)g(are)h(explained)f(in)h(Section)f +(4.5.8;)f(construc-)-42 1753 y(tors)i(are)g(the)g(sub)s(ject)g(of)g +(Section)g(4.5.7.)-42 1873 y Fk(4.4.5)52 b(Lo)q(cal)19 +b(Declarations)-42 1959 y Fn(Lo)q(cal)e(v)m(ariables)e(can)h(b)q(e)h +(declared)f(an)o(ywhere)g(inside)g(a)g(blo)q(c)o(k.)22 +b(Their)16 b(scop)q(e)h(b)q(egins)f(after)f(the)i(declaration)-42 +2015 y(and)f(lasts)e(un)o(til)g(the)i(end)f(of)g(the)g(blo)q(c)o(k.)20 +b(The)15 b(declaration)f(ma)o(y)g(include)i(an)f(initial)e(assignmen)o +(t:)92 2083 y Fm(stat)50 b Fi(!)g Fk(lo)q(cal)17 b Fm(de)n(clist)e +Fn([)p Fm(init)t Fn(])42 2140 y Fm(de)n(clist)49 b Fi(!)h +Fm(name)16 b Fi(f)p Fn(',')f Fm(name)s Fi(g)96 2196 y +Fm(init)49 b Fi(!)h Fn('=')16 b Fm(explist1)-42 2265 +y Fn(If)f(there)f(is)f(an)h(initial)e(assignmen)o(t,)g(it)h(has)h(the)g +(same)f(seman)o(tics)f(of)h(a)h(m)o(ultiple)e(assignmen)o(t.)17 +b(Otherwise,)d(all)-42 2321 y(v)m(ariables)h(are)g(initialized)e(with)i +Fk(nil)p Fn(.)-42 2443 y Fd(4.5)56 b(Expressions)-42 +2529 y Fk(4.5.1)c(Simple)15 b(Expressions)-42 2614 y +Fn(Simple)f(expressions)h(are:)922 2748 y(5)p eop %%Page: 6 6 -bop -12 160 a Fn(T)l(ables,)13 b(CF)l(unctions,)h(and)e(functions)h(are)f -(compared)h(b)o(y)f(reference,)h(that)f(is,)h(t)o(w)o(o)e(tables)i(are)f -(considered)-12 216 y(equal)k(only)g(if)g(they)f(are)g(the)g(same)g(table.)20 -b(The)c(op)q(erator)e Fl(~=)h Fn(is)h(exactly)f(the)g(negation)h(of)f -(equalit)o(y)g(\()p Fl(=)p Fn(\).)59 273 y(The)i(other)g(op)q(erators)g(w)o -(ork)f(as)h(follo)o(ws.)26 b(If)17 b(b)q(oth)h(argumen)o(ts)e(are)h(n)o(um)o -(b)q(ers,)h(they)f(are)g(compared)-12 329 y(as)f(suc)o(h.)23 -b(Otherwise,)16 b(if)h(b)q(oth)f(argumen)o(ts)f(can)h(b)q(e)h(con)o(v)o -(erted)f(to)f(strings,)h(their)g(v)m(alues)i(are)d(compared)-12 -385 y(using)h(lexicographical)i(order.)h(Otherwise,)d(the)f(fallbac)o(k)h -(\\order")e(is)i(called;)h(see)e(Section)h(4.7.)-12 505 y Fk(4.5.4)52 -b(Logical)20 b(Op)q(erators)-12 590 y Fn(All)g(logical)g(op)q(erators,)f(lik) -o(e)h(con)o(trol)e(structures,)h(consider)h Fk(nil)g Fn(as)e(false)i(and)f -(an)o(ything)g(else)g(as)g(true.)-12 647 y(Lik)o(e)d(relational)g(op)q -(erators,)e(they)i(return)f Fk(nil)h Fn(as)f(false)g(and)h(1)f(as)f(true.)20 -b(The)c(logical)g(op)q(erators)e(are:)298 736 y Fl(and)72 b(or)f(not)-12 -825 y Fn(The)18 b(op)q(erators)f Fl(and)g Fn(and)h Fl(or)g -Fn(use)g(short-cut)f(ev)m(aluation,)j(that)d(is,)h(the)g(second)h(op)q(erand) -f(is)g(ev)m(aluated)-12 881 y(only)e(if)g(necessary)l(.)-12 -1000 y Fk(4.5.5)52 b(Concatenation)-12 1086 y Fn(Lua)11 b(o\013ers)f(a)h -(string)f(concatenation)h(op)q(erator,)g(denoted)g(b)o(y)g(\\)p -Fl(..)p Fn(".)17 b(If)11 b(op)q(erands)g(are)g(strings)f(or)g(n)o(um)o(b)q -(ers,)-12 1142 y(they)20 b(are)f(con)o(v)o(erted)g(to)g(strings)h(according)g -(to)e(the)i(rules)g(in)h(Section)f(4.2.)32 b(Otherwise,)21 -b(the)f(fallbac)o(k)-12 1199 y(\\concat")15 b(is)g(called;)i(see)e(Section)h -(4.7.)-12 1318 y Fk(4.5.6)52 b(Precedence)-12 1404 y Fn(Op)q(erator)15 -b(precedence)i(follo)o(ws)e(the)h(table)f(b)q(elo)o(w,)h(from)e(the)h(lo)o(w) -o(er)g(to)g(the)g(higher)h(priorit)o(y:)298 1493 y Fl(and)72 -b(or)298 1549 y(<)g(>)f(<=)48 b(>=)f(~=)h(=)298 1606 y(..)298 -1662 y(+)72 b(-)298 1718 y(*)g(/)298 1775 y(not)48 b(-)23 b(\(unary\))298 -1831 y(^)-12 1920 y Fn(All)17 b(binary)e(op)q(erators)g(are)g(left)g(asso)q -(ciativ)o(e,)g(except)h(for)f Fl(^)p Fn(,)f(whic)o(h)i(is)g(righ)o(t)f(asso)q -(ciativ)o(e.)-12 2039 y Fk(4.5.7)52 b(T)l(able)18 b(Constructors)-12 -2125 y Fn(T)l(able)c(constructors)d(are)h(expressions)i(that)e(create)g -(tables.)19 b(They)13 b(can)g(b)q(e)g(used)g(to)f(create)g(empt)o(y)g -(tables,)-12 2182 y(or)j(to)f(create)h(a)g(table)h(and)f(initialize)k(some)c -(\014elds.)59 2238 y(The)g(general)h(syn)o(tax)e(for)h(constructors)f(is:)72 -2306 y Fm(table)n(c)n(onstructor)49 b Fi(!)h Fn(')p Fi(f)p -Fn(')16 b([)p Fm(\014eld)r(list)t Fn(])e(')p Fi(g)p Fn(')241 -2363 y Fm(\014eld)r(list)49 b Fi(!)h Fm(l\014eld)r(list1)15 -b Fn([','])241 2419 y Fm(\014eld)r(list)49 b Fi(!)h Fm(\016eld)r(list1)16 -b Fn([','])241 2476 y Fm(\014eld)r(list)49 b Fi(!)h Fm(l\014eld)r(list1)15 -b Fn(';')g Fm(\016eld)r(list1)h Fn([','])59 2569 y(The)f(form)g -Fm(l\014eld)r(list1)f Fn(is)h(used)h(to)f(initialize)j(lists.)72 -2641 y Fm(l\014eld)r(list1)48 b Fi(!)j Fm(exp)16 b Fi(f)p Fn(',')f -Fm(exp)s Fi(g)-12 2713 y Fn(The)i(expressions)f(in)h(the)g(list)f(are)g -(assigned)h(to)e(consecutiv)o(e)i(n)o(umerical)h(indexes,)f(starting)f(with)g -(1.)22 b(As)-12 2769 y(an)15 b(example:)60 2858 y Fl(a)24 b(=)f({"v1",)g -("v2",)g(34})910 2976 y Fn(6)p eop +6 5 bop 42 193 a Fm(exp)50 b Fi(!)g Fn('\(')16 b Fm(exp)g +Fn('\)')42 250 y Fm(exp)50 b Fi(!)g Fk(nil)42 306 y Fm(exp)g +Fi(!)g Fn('n)o(um)o(b)q(er')42 362 y Fm(exp)g Fi(!)g +Fn('literal')42 419 y Fm(exp)g Fi(!)g Fm(var)-42 490 +y Fn(Num)o(b)q(ers)22 b(\(n)o(umerical)f(constan)o(ts\))g(and)i(string) +f(literals)f(are)h(explained)h(in)f(Section)h(4.1.)41 +b(V)l(ariables)22 b(are)-42 546 y(explained)16 b(in)f(Section)g(4.4.2.) +-42 665 y Fk(4.5.2)52 b(Arithmetic)15 b(Op)q(erators)-42 +751 y Fn(Lua)21 b(supp)q(orts)g(the)g(usual)f(arithmetic)e(op)q +(erators.)35 b(These)21 b(op)q(erators)f(are)g(the)g(binary)h +Fl(+)p Fn(,)g Fl(-)p Fn(,)g Fl(*)p Fn(,)h Fl(/)e Fn(and)h +Fl(^)-42 808 y Fn(\(exp)q(onen)o(tiation\),)15 b(and)h(the)g(unary)g +Fl(-)p Fn(.)22 b(If)16 b(the)g(op)q(erands)g(are)g(n)o(um)o(b)q(ers,)f +(or)g(strings)g(that)g(can)h(b)q(e)h(con)o(v)o(erted)-42 +864 y(to)d(n)o(um)o(b)q(ers,)g(according)g(to)g(the)g(rules)g(giv)o(en) +g(in)h(Section)f(4.2,)f(all)h(op)q(erations)f(but)i(exp)q(onen)o +(tiation)e(ha)o(v)o(e)h(the)-42 920 y(usual)f(meaning.)18 +b(Otherwise,)13 b(the)g(fallbac)o(k)f(\\arith")g(is)g(called;)h(see)g +(Section)g(4.7.)19 b(An)13 b(exp)q(onen)o(tiation)f(alw)o(a)o(ys)-42 +977 y(calls)k(this)f(fallbac)o(k.)22 b(The)16 b(standard)g +(mathematical)c(library)j(rede\014nes)j(this)d(fallbac)o(k,)g(giving)g +(the)h(exp)q(ected)-42 1033 y(meaning)e(to)h(exp)q(onen)o(tiation;)f +(see)h(Section)g(6.3.)-42 1152 y Fk(4.5.3)52 b(Relational)18 +b(Op)q(erators)-42 1238 y Fn(Lua)e(o\013ers)e(the)i(follo)o(wing)d +(relational)g(op)q(erators:)126 1327 y Fl(<)71 b(>)g(<=)48 +b(>=)f(~=)h(==)-42 1415 y Fn(All)15 b(return)g Fk(nil)f +Fn(as)h(false)g(and)g(1)g(as)g(true.)29 1472 y(Equalit)o(y)g(\014rst)h +(compares)f(the)i(t)o(yp)q(es)f(of)h(its)e(op)q(erands.)24 +b(If)17 b(they)g(are)f(di\013eren)o(t,)g(the)g(result)g(is)g +Fk(nil)p Fn(.)23 b(Oth-)-42 1528 y(erwise,)18 b(their)f(v)m(alues)h +(are)g(compared.)26 b(Num)o(b)q(ers)17 b(and)h(strings)f(are)h +(compared)e(in)i(the)g(usual)f(w)o(a)o(y)l(.)27 b(T)l(ables,)-42 +1585 y(CF)l(unctions,)14 b(and)g(functions)g(are)g(compared)f(b)o(y)h +(reference,)h(that)e(is,)h(t)o(w)o(o)e(tables)i(are)g(considered)g +(equal)g(only)-42 1641 y(if)h(they)g(are)g(the)h(same)d(table.)20 +b(The)15 b(op)q(erator)g Fl(~=)f Fn(is)h(exactly)g(the)g(negation)f(of) +h(equalit)o(y)f(\()p Fl(=)p Fn(\).)29 1698 y(The)19 b(other)g(op)q +(erators)f(w)o(ork)g(as)g(follo)o(ws.)29 b(If)19 b(b)q(oth)g(argumen)o +(ts)e(are)i(n)o(um)o(b)q(ers,)f(they)h(are)g(compared)f(as)-42 +1754 y(suc)o(h.)27 b(Otherwise,)17 b(if)g(b)q(oth)g(argumen)o(ts)f(can) +h(b)q(e)h(con)o(v)o(erted)f(to)g(strings,)f(their)h(v)m(alues)g(are)g +(compared)g(using)-42 1811 y(lexicographical)d(order.)20 +b(Otherwise,)14 b(the)i(fallbac)o(k)d(\\order")i(is)g(called;)f(see)h +(Section)h(4.7.)-42 1930 y Fk(4.5.4)52 b(Logical)18 b(Op)q(erators)-42 +2016 y Fn(All)f(logical)f(op)q(erators,)g(lik)o(e)h(con)o(trol)f +(structures,)h(consider)g Fk(nil)g Fn(as)g(false)g(and)g(an)o(ything)g +(else)g(as)g(true.)26 b(The)-42 2072 y(logical)14 b(op)q(erators)g +(are:)269 2161 y Fl(and)71 b(or)g(not)-42 2249 y Fn(The)17 +b(op)q(erators)f Fl(and)g Fn(and)h Fl(or)f Fn(use)h(short-cut)f(ev)m +(aluation,)g(that)g(is,)g(the)h(second)g(op)q(erand)g(is)f(ev)m +(aluated)h(only)-42 2306 y(if)e(necessary)l(.)-42 2425 +y Fk(4.5.5)52 b(Concatenation)-42 2511 y Fn(Lua)18 b(o\013ers)d(a)i +(string)f(concatenation)g(op)q(erator,)f(denoted)j(b)o(y)e(\\)p +Fl(..)p Fn(".)24 b(If)17 b(op)q(erands)g(are)g(strings)e(or)i(n)o(um)o +(b)q(ers,)-42 2567 y(they)c(are)g(con)o(v)o(erted)f(to)g(strings)g +(according)g(to)g(the)h(rules)f(in)h(Section)f(4.2.)18 +b(Otherwise,)13 b(the)g(fallbac)o(k)e(\\concat")-42 2623 +y(is)k(called;)g(see)g(Section)g(4.7.)922 2748 y(6)p +eop %%Page: 7 7 -bop -12 160 a Fn(is)16 b(equiv)m(alen)o(t)h(to:)60 253 y Fl(temp)23 -b(=)h({})60 310 y(temp[1])f(=)g("v1")60 366 y(temp[2])g(=)g("v2")60 -423 y(temp[3])g(=)g(34)60 479 y(a)h(=)f(temp)59 573 y Fn(The)15 -b(next)g(form)g(initializes)j(named)e(\014elds)g(in)g(a)f(table.)72 -632 y Fm(\016eld)r(list1)49 b Fi(!)i Fm(\016eld)16 b Fi(f)p -Fn(',')e Fm(\016eld)5 b Fi(g)157 689 y Fm(\016eld)49 b Fi(!)i -Fm(name)16 b Fn('=')g Fm(exp)-12 757 y Fn(As)f(an)g(example:)60 -851 y Fl(a)24 b(=)f({x)h(=)g(1,)f(y)h(=)g(3})-12 945 y Fn(is)16 -b(equiv)m(alen)o(t)h(to:)60 1039 y Fl(temp)23 b(=)h({})60 1095 -y(temp.x)f(=)h(1)60 1152 y(temp.y)f(=)h(3)60 1208 y(a)g(=)f(temp)-12 -1328 y Fk(4.5.8)52 b(F)l(unction)18 b(Calls)-12 1414 y Fn(A)d(function)h -(call)h(has)e(the)g(follo)o(wing)h(syn)o(tax:)72 1486 y Fm(functionc)n(al)r -(l)49 b Fi(!)h Fm(var)16 b(r)n(e)n(alPar)n(ams)-12 1558 y Fn(Here,)d -Fl(var)g Fn(can)g(b)q(e)h(an)o(y)e(v)m(ariable)j(\(global,)e(lo)q(cal,)h -(indexed,)h(etc\).)k(If)13 b(its)g(t)o(yp)q(e)g(is)g Fm(function)j -Fn(or)d Fm(CF)m(unction)s Fn(,)-12 1615 y(this)k(function)h(is)f(called.)27 -b(Otherwise,)17 b(the)g(fallbac)o(k)g(\\function")h(is)f(called,)h(ha)o(ving) -f(as)g(\014rst)f(parameter)-12 1671 y(the)f(v)m(alue)i(of)e -Fl(var)p Fn(,)f(and)h(then)h(the)f(original)i(call)f(parameters.)59 -1727 y(The)f(form:)72 1800 y Fm(functionc)n(al)r(l)49 b Fi(!)h -Fm(var)16 b Fn(':')k Fm(name)c(r)n(e)n(alPar)n(ams)-12 1872 -y Fn(can)g(b)q(e)f(used)h(to)f(call)h(\\metho)q(ds".)k(A)15 -b(call)h Fl(var:name\(...\))d Fn(is)j(syn)o(tactic)f(sugar)g(for)36 -1965 y Fl(var.name\(var,)22 b(...\))-12 2059 y Fn(except)16 -b(that)e Fl(var)h Fn(is)h(ev)m(aluated)g(only)g(once.)72 2127 -y Fm(r)n(e)n(alPar)n(ams)49 b Fi(!)h Fn('\(')15 b([)p Fm(explist1)6 -b Fn(])16 b('\)')72 2184 y Fm(r)n(e)n(alPar)n(ams)49 b Fi(!)h -Fm(table)n(c)n(onstructor)144 2240 y(explist1)g Fi(!)g Fm(exp1)17 -b Fi(f)p Fn(',')e Fm(exp1)6 b Fi(g)-12 2309 y Fn(All)14 b(argumen)o(t)e -(expressions)h(are)f(ev)m(aluated)i(b)q(efore)f(the)f(call;)j(then)d(the)h -(list)g(of)g(argumen)o(ts)e(is)i(adjusted)g(to)-12 2365 y(the)j(length)g(of)f -(the)g(list)i(of)e(parameters)f(\(see)h(Section)i(4.3\);)d(\014nally)l(,)i -(this)g(list)g(is)g(assigned)g(to)f(the)h(formal)-12 2422 y(parameters.)j(A)c -(call)i(of)d(the)i(form)e Fl(f{...})g Fn(is)i(syn)o(tactic)f(sugar)g(for)f -Fl(f\({...}\))p Fn(,)g(that)g(is,)i(the)f(parameter)-12 2478 -y(list)h(is)g(a)f(single)h(new)g(table.)59 2534 y(Because)k(a)g(function)g -(can)g(return)g(an)o(y)g(n)o(um)o(b)q(er)g(of)f(results)h(\(see)g(Section)h -(4.4.3\),)e(the)h(n)o(um)o(b)q(er)g(of)-12 2591 y(results)11 -b(m)o(ust)f(b)q(e)h(adjusted)f(b)q(efore)h(used.)19 b(If)10 -b(the)h(function)g(is)g(called)h(as)e(an)g(statemen)o(t)f(\(see)h(Section)i -(4.4.4\),)-12 2647 y(its)19 b(return)g(list)g(is)h(adjusted)f(to)f(0.)30 -b(If)19 b(the)g(function)g(is)h(called)g(in)g(a)e(place)i(that)e(needs)i(a)e -(single)i(v)m(alue)-12 2704 y(\(syn)o(tactically)13 b(denoted)f(b)o(y)g(the)g -(non-terminal)h Fl(exp1)p Fn(\),)f(its)g(return)g(list)h(is)f(adjusted)g(to)g -(1.)18 b(If)12 b(the)g(function)-12 2760 y(is)i(called)h(in)g(a)e(place)i -(that)d(can)i(hold)h(man)o(y)e(v)m(alues)h(\(syn)o(tactically)h(denoted)f(b)o -(y)f(the)h(non-terminal)g Fl(exp)p Fn(\),)-12 2817 y(no)h(adjustmen)o(t)g(is) -h(done.)910 2976 y(7)p eop +7 6 bop -42 199 a Fk(4.5.6)52 b(Precedence)-42 285 y +Fn(Op)q(erator)15 b(precedence)i(follo)o(ws)d(the)h(table)g(b)q(elo)o +(w,)f(from)f(the)j(lo)o(w)o(er)d(to)i(the)g(higher)g(priorit)o(y:)269 +379 y Fl(and)71 b(or)269 435 y(<)g(>)h(<=)47 b(>=)h(~=)f(=)269 +492 y(..)269 548 y(+)71 b(-)269 605 y(*)g(/)269 661 y(not)47 +b(-)24 b(\(unary\))269 718 y(^)-42 811 y Fn(All)15 b(binary)g(op)q +(erators)f(are)h(left)f(asso)q(ciativ)o(e,)g(except)h(for)g +Fl(^)p Fn(,)g(whic)o(h)g(is)f(righ)o(t)g(asso)q(ciativ)o(e.)-42 +931 y Fk(4.5.7)52 b(T)l(able)18 b(Constructors)-42 1017 +y Fn(T)l(able)d(constructors)f(are)h(expressions)g(that)f(create)h +(tables;)f(ev)o(ery)h(time)e(a)i(constructor)f(is)h(ev)m(aluated,)g(a)f +(new)-42 1074 y(table)f(is)g(created.)19 b(Constructors)12 +b(can)h(b)q(e)h(used)g(to)e(create)h(empt)o(y)f(tables,)g(or)h(to)g +(create)g(a)f(table)h(and)g(initialize)-42 1130 y(some)h(\014elds.)29 +1187 y(The)h(general)g(syn)o(tax)g(for)f(constructors)h(is:)42 +1255 y Fm(table)n(c)n(onstructor)49 b Fi(!)i Fn(')p Fi(f)p +Fn(')15 b Fm(\014eld)r(list)g Fn(')p Fi(g)p Fn(')212 +1311 y Fm(\014eld)r(list)48 b Fi(!)j Fm(l\014eld)r(list)31 +b Fi(j)16 b Fm(\016eld)r(list)31 b Fi(j)16 b Fm(l\014eld)r(list)f +Fn(';')g Fm(\016eld)r(list)200 1368 y(l\014eld)r(list)48 +b Fi(!)j Fn([)p Fm(l\014eld)r(list1)6 b Fn(])197 1424 +y Fm(\016eld)r(list)49 b Fi(!)i Fn([)p Fm(\016eld)r(list1)6 +b Fn(])29 1517 y(The)15 b(form)f Fm(l\014eld)r(list1)g +Fn(is)h(used)g(to)g(initialize)e(lists.)42 1589 y Fm(l\014eld)r(list1) +49 b Fi(!)h Fm(exp)16 b Fi(f)p Fn(',')f Fm(exp)s Fi(g)h +Fn([','])-42 1662 y(The)i(expressions)f(in)g(the)g(list)f(are)h +(assigned)g(to)g(consecutiv)o(e)g(n)o(umerical)f(indexes,)h(starting)f +(with)h(1.)25 b(As)18 b(an)-42 1718 y(example:)30 1812 +y Fl(a)24 b(=)g({"v1",)f("v2",)g(34})-42 1906 y Fn(is)15 +b(equiv)m(alen)o(t)g(to:)30 2000 y Fl(temp)23 b(=)h({})30 +2056 y(temp[1])f(=)h("v1")30 2112 y(temp[2])f(=)h("v2")30 +2169 y(temp[3])f(=)h(34)30 2225 y(a)g(=)g(temp)29 2319 +y Fn(The)15 b(next)h(form)d(initializes)g(named)i(\014elds)g(in)g(a)g +(table.)42 2378 y Fm(\016eld)r(list1)50 b Fi(!)g Fm(\016eld)16 +b Fi(f)p Fn(',')f Fm(\016eld)5 b Fi(g)15 b Fn([','])127 +2435 y Fm(\016eld)50 b Fi(!)g Fm(name)16 b Fn('=')g Fm(exp)-42 +2503 y Fn(As)g(an)f(example:)30 2597 y Fl(a)24 b(=)g({x)f(=)h(1,)f(y)h +(=)g(3})922 2748 y Fn(7)p eop %%Page: 8 8 -bop -12 160 a Fd(4.6)56 b(F)-5 b(unction)19 b(De\014nitions)-12 -245 y Fn(F)l(unctions)i(in)f(Lua)g(can)g(b)q(e)g(de\014ned)h(an)o(ywhere)f -(in)g(the)g(global)g(lev)o(el)h(of)e(a)h(mo)q(dule.)34 b(The)20 -b(syn)o(tax)f(for)-12 302 y(function)d(de\014nition)h(is:)72 -374 y Fm(function)49 b Fi(!)i Fk(function)17 b Fm(name)f Fn('\(')f([)p -Fm(p)n(arlist1)6 b Fn(])16 b('\)')f Fm(blo)n(ck)h Fk(end)59 -503 y Fn(When)d(Lua)g(\014nds)h(a)f(function)g(de\014nition,)i(its)e(b)q(o)q -(dy)h(is)g(compiled)g(to)f(in)o(termediate)g(co)q(de)h(and)f(stored,)-12 -559 y(with)j(t)o(yp)q(e)f Fm(function)p Fn(,)f(in)o(to)i(the)f(global)h(v)m -(ariable)g Fl(name)p Fn(.)59 615 y(P)o(arameters)e(act)g(as)h(lo)q(cal)h(v)m -(ariables,)h(initialized)h(with)e(the)f(argumen)o(t)f(v)m(alues.)72 -688 y Fm(p)n(arlist1)49 b Fi(!)i Fm('name')16 b Fi(f)p Fn(',')f -Fm(name)s Fi(g)59 816 y Fn(Results)h(are)e(returned)h(using)h(the)e -Fl(return)g Fn(statemen)o(t)g(\(see)h(Section)g(4.4.3\).)j(If)d(con)o(trol)f -(reac)o(hes)h(the)-12 873 y(end)h(of)f(a)g(function)h(without)f(a)g(return)g -(instruction,)h(the)f(function)h(returns)f(with)h(no)f(results.)59 -929 y(There)e(is)h(a)f(sp)q(ecial)i(syn)o(tax)e(for)f(de\014nition)j(of)e -(metho)q(ds,)h(that)e(is,)i(functions)g(whic)o(h)g(are)f(to)g(b)q(e)h(stored) --12 986 y(in)i(table)g(\014elds.)72 1058 y Fm(function)49 b -Fi(!)i Fk(function)17 b Fm(name)f Fn(':')k Fm(name)c Fn('\(')f([)p -Fm(p)n(arlist1)6 b Fn(])16 b('\)')f Fm(blo)n(ck)g Fk(end)-12 -1130 y Fn(A)g(declaration)h(lik)o(e)-12 1224 y Fl(function)23 -b(t:f)g(\(...\))36 1280 y(...)-12 1336 y(end)-12 1430 y Fn(is)16 -b(equiv)m(alen)o(t)h(to)-12 1524 y Fl(function)23 b(temp)g(\(self,)g(...\))36 -1581 y(...)-12 1637 y(end)-12 1693 y(t.f)h(=)f(temp)-12 1787 -y Fn(that)18 b(is,)i(the)f(function)g(is)g(created)g(with)g(a)f(dumm)o(y)h -(name)g(and)f(then)h(assigned)h(to)e(the)h(\014eld)g Fl(f)g -Fn(of)f(the)-12 1844 y(table)g Fl(t)p Fn(.)24 b(Moreo)o(v)o(er,)16 -b(the)h(function)h(gets)e(an)h(extra)f(formal)h(parameter)f(called)i -Fl(self)p Fn(.)25 b(Notice)17 b(that)f(the)-12 1900 y(v)m(ariable)h -Fl(t)e Fn(m)o(ust)f(b)q(e)i(previously)h(initialized)h(with)e(a)f(table)g(v)m -(alue.)-12 2022 y Fd(4.7)56 b(F)-5 b(allbac)n(ks)-12 2108 y -Fn(Lua)23 b(pro)o(vides)f(a)g(p)q(o)o(w)o(erful)h(mec)o(hanism)g(to)e(extend) -i(its)g(seman)o(tics,)g(called)h Fm(fal)r(lb)n(acks)p Fn(.)40 -b(Basically)l(,)26 b(a)-12 2164 y(fallbac)o(k)15 b(is)g(a)g(programmer)e -(de\014ned)j(function)f(whic)o(h)g(is)g(called)h(whenev)o(er)f(Lua)g(do)q(es) -g(not)f(kno)o(w)g(ho)o(w)g(to)-12 2221 y(pro)q(ceed.)59 2277 -y(Lua)h(supp)q(orts)h(the)f(follo)o(wing)h(fallbac)o(ks,)f(iden)o(ti\014ed)i -(b)o(y)f(the)f(giv)o(en)h(strings:)-12 2371 y Fk(\\arith")25 -b Fn(called)18 b(when)g(an)e(arithmetic)i(op)q(eration)f(is)h(applied)g(to)f -(non)g(n)o(umerical)h(op)q(erands,)f(or)g(when)102 2427 y(the)c(binary)g -Fl(^)g Fn(op)q(eration)g(is)h(called.)21 b(Receiv)o(es)14 b(three)f(argumen)o -(ts:)18 b(the)13 b(t)o(w)o(o)f(op)q(erands)h(\(the)g(second)102 -2484 y(one)i(is)g(nil)h(when)f(the)f(op)q(eration)h(is)g(unary)g(min)o(us\))g -(and)f(one)h(of)f(the)h(follo)o(wing)g(strings)f(describing)102 -2540 y(the)h(o\013ended)h(op)q(erator:)150 2653 y Fl(add)47 -b(sub)g(mul)h(div)f(pow)g(unm)102 2765 y Fn(Its)13 b(return)g(v)m(alue)h(is)f -(the)g(\014nal)h(result)f(of)g(the)g(arithmetic)h(op)q(eration.)19 -b(The)13 b(default)h(function)f(issues)102 2822 y(an)i(error.)910 -2976 y(8)p eop +8 7 bop -42 199 a Fn(is)15 b(equiv)m(alen)o(t)g(to:)30 +293 y Fl(temp)23 b(=)h({})30 350 y(temp.x)f(=)h(1)30 +406 y(temp.y)f(=)h(3)30 462 y(a)g(=)g(temp)-42 582 y +Fk(4.5.8)52 b(F)l(unction)18 b(Calls)-42 668 y Fn(A)e(function)f(call)f +(has)h(the)g(follo)o(wing)e(syn)o(tax:)42 740 y Fm(functionc)n(al)r(l) +49 b Fi(!)h Fm(var)17 b(r)n(e)n(alPar)n(ams)-42 813 y +Fn(Here,)i Fl(var)e Fn(can)h(b)q(e)h(an)o(y)e(v)m(ariable)h(\(global,)e +(lo)q(cal,)i(indexed,)g(etc\).)28 b(If)18 b(its)f(t)o(yp)q(e)h(is)g +Fm(function)j Fn(or)c Fm(CF)m(unction)s Fn(,)-42 869 +y(this)g(function)g(is)f(called.)25 b(Otherwise,)17 b(the)g(fallbac)o +(k)f(\\function")g(is)h(called,)g(ha)o(ving)f(as)g(\014rst)h(parameter) +e(the)-42 925 y(v)m(alue)h(of)f Fl(var)p Fn(,)f(and)h(then)h(the)f +(original)f(call)g(parameters.)29 982 y(The)h(form:)42 +1054 y Fm(functionc)n(al)r(l)49 b Fi(!)h Fm(var)17 b +Fn(':')j Fm(name)c(r)n(e)n(alPar)n(ams)-42 1126 y Fn(can)g(b)q(e)g +(used)f(to)g(call)f(\\metho)q(ds".)19 b(A)c(call)f Fl(var:name\(...\))g +Fn(is)g(syn)o(tactic)h(sugar)f(for)6 1220 y Fl(var.name\(var,)22 +b(...\))-42 1314 y Fn(except)16 b(that)f Fl(var)f Fn(is)h(ev)m(aluated) +g(only)g(once.)42 1382 y Fm(r)n(e)n(alPar)n(ams)49 b +Fi(!)h Fn('\(')16 b([)p Fm(explist1)6 b Fn(])15 b('\)')42 +1438 y Fm(r)n(e)n(alPar)n(ams)49 b Fi(!)h Fm(table)n(c)n(onstructor)115 +1495 y(explist1)f Fi(!)h Fm(exp1)17 b Fi(f)p Fn(',')e +Fm(exp1)6 b Fi(g)-42 1563 y Fn(All)18 b(argumen)o(t)e(expressions)i +(are)g(ev)m(aluated)g(b)q(efore)g(the)h(call;)f(then)g(the)g(list)f(of) +h(argumen)o(ts)e(is)i(adjusted)g(to)-42 1620 y(the)j(length)f(of)f(the) +h(list)f(of)h(parameters)e(\(see)j(Section)f(4.3\);)h(\014nally)l(,)f +(this)g(list)f(is)g(assigned)h(to)g(the)g(formal)-42 +1676 y(parameters.)g(A)15 b(call)g(of)g(the)h(form)e +Fl(f{...})h Fn(is)g(syn)o(tactic)f(sugar)h(for)g Fl(f\({...}\))p +Fn(,)f(that)h(is,)g(the)h(parameter)e(list)-42 1732 y(is)h(a)g(single)g +(new)g(table.)29 1789 y(Because)h(a)f(function)h(can)g(return)f(an)o(y) +g(n)o(um)o(b)q(er)g(of)g(results)g(\(see)h(Section)f(4.4.3\),)e(the)j +(n)o(um)o(b)q(er)f(of)g(results)-42 1845 y(m)o(ust)c(b)q(e)i(adjusted)f +(b)q(efore)h(used.)19 b(If)13 b(the)f(function)g(is)g(called)f(as)h(an) +g(statemen)o(t)e(\(see)j(Section)f(4.4.4\),)e(its)h(return)-42 +1902 y(list)18 b(is)h(adjusted)g(to)g(0.)31 b(If)20 b(the)f(function)g +(is)g(called)g(in)g(a)g(place)g(that)f(needs)i(a)f(single)f(v)m(alue)i +(\(syn)o(tactically)-42 1958 y(denoted)f(b)o(y)f(the)g(non-terminal)e +Fl(exp1)p Fn(\),)h(its)g(return)h(list)f(is)g(adjusted)h(to)g(1.)27 +b(If)18 b(the)g(function)g(is)g(called)f(in)h(a)-42 2015 +y(place)f(that)g(can)g(hold)g(man)o(y)e(v)m(alues)i(\(syn)o(tactically) +e(denoted)j(b)o(y)f(the)g(non-terminal)e Fl(exp)p Fn(\),)h(no)h +(adjustmen)o(t)-42 2071 y(is)e(done.)-42 2193 y Fd(4.6)56 +b(F)-5 b(unction)20 b(De\014nitions)-42 2279 y Fn(F)l(unctions)15 +b(in)f(Lua)g(can)h(b)q(e)g(de\014ned)h(an)o(ywhere)e(in)g(the)g(global) +f(lev)o(el)h(of)g(a)g(mo)q(dule.)19 b(The)14 b(syn)o(tax)g(for)g +(function)-42 2335 y(de\014nition)i(is:)42 2407 y Fm(function)50 +b Fi(!)g Fk(function)16 b Fm(var)h Fn('\(')e([)p Fm(p)n(arlist1)6 +b Fn(])16 b('\)')f Fm(blo)n(ck)g Fk(end)29 2536 y Fn(When)f(Lua)g +(pre-compiles)f(a)g(c)o(h)o(unk,)h(all)f(its)f(function)i(b)q(o)q(dies) +g(are)f(pre-compiled,)g(to)q(o.)19 b(Then,)14 b(when)g(Lua)-42 +2592 y(\\executes")i(the)f(function)g(de\014nition,)g(its)f(b)q(o)q(dy) +i(is)f(stored,)f(with)h(t)o(yp)q(e)g Fm(function)p Fn(,)f(in)o(to)g +(the)i(v)m(ariable)e Fl(var)p Fn(.)922 2748 y(8)p eop %%Page: 9 9 -bop -12 160 a Fk(\\order")23 b Fn(called)15 b(when)f(an)f(order)g(comparison) -g(is)h(applied)h(to)e(non)g(n)o(umerical)i(or)e(non)g(string)g(op)q(erands.) -102 216 y(Receiv)o(es)18 b(three)e(argumen)o(ts:)22 b(the)16 -b(t)o(w)o(o)f(op)q(erands)i(and)g(one)f(of)g(the)h(follo)o(wing)g(strings)f -(describing)102 273 y(the)f(o\013ended)h(op)q(erator:)150 383 -y Fl(lt)23 b(gt)h(le)f(ge)102 494 y Fn(Its)d(return)g(v)m(alue)i(is)f(the)f -(\014nal)h(result)g(of)f(the)g(comparison)h(op)q(eration.)35 -b(The)21 b(default)f(function)102 551 y(issues)c(an)f(error.)-12 -644 y Fk(\\concat")25 b Fn(called)20 b(when)f(a)f(concatenation)h(is)g -(applied)h(to)e(non)g(string)g(op)q(erands.)30 b(Receiv)o(es)20 -b(the)f(t)o(w)o(o)102 700 y(op)q(erands)13 b(as)f(argumen)o(ts.)18 -b(Its)13 b(return)f(v)m(alue)i(is)f(the)g(\014nal)g(result)g(of)f(the)h -(concatenation)f(op)q(eration.)102 757 y(The)j(default)h(function)g(issues)g -(an)f(error.)-12 850 y Fk(\\index")24 b Fn(called)13 b(when)f(Lua)g(tries)f -(to)g(retriev)o(e)h(the)f(v)m(alue)i(of)e(an)g(index)i(not)e(presen)o(t)g(in) -i(a)e(table.)19 b(Receiv)o(es)102 907 y(as)c(argumen)o(ts)f(the)i(table)g -(and)f(the)h(index.)21 b(Its)16 b(return)f(v)m(alue)i(is)f(the)f(\014nal)h -(result)g(of)f(the)g(indexing)102 963 y(op)q(eration.)20 b(The)15 -b(default)h(function)g(returns)f(nil.)-12 1056 y Fk(\\gettable")25 -b Fn(called)17 b(when)f(Lua)f(tries)h(to)e(index)j(a)e(non)g(table)h(v)m -(alue.)21 b(Receiv)o(es)c(as)d(argumen)o(ts)h(the)g(non)102 -1113 y(table)i(v)m(alue)h(and)f(the)f(index.)26 b(Its)17 b(return)f(v)m(alue) -i(is)f(the)g(\014nal)h(result)f(of)f(the)h(indexing)h(op)q(eration.)102 -1169 y(The)d(default)h(function)g(issues)g(an)f(error.)-12 -1263 y Fk(\\settable")25 b Fn(called)16 b(when)f(Lua)g(tries)g(to)f(assign)h -(indexed)h(a)e(non)h(table)g(v)m(alue.)21 b(Receiv)o(es)16 -b(as)e(argumen)o(ts)102 1319 y(the)k(non)g(table)h(v)m(alue,)h(the)e(index,)h -(and)g(the)f(assigned)h(v)m(alue.)29 b(The)19 b(default)f(function)h(issues)g -(an)102 1375 y(error.)-12 1469 y Fk(\\function")25 b Fn(called)15 -b(when)e(Lua)h(tries)f(to)f(call)i(a)f(non)g(function)h(v)m(alue.)21 -b(Receiv)o(es)14 b(as)f(argumen)o(ts)f(the)h(non)102 1525 y(function)h(v)m -(alue)g(and)g(the)f(argumen)o(ts)g(giv)o(en)g(in)h(the)g(original)g(call.)20 -b(Its)14 b(return)f(v)m(alues)h(are)f(the)g(\014nal)102 1582 -y(results)i(of)g(the)g(call)i(op)q(eration.)j(The)15 b(default)h(function)g -(issues)g(an)f(error.)-12 1675 y Fk(\\gc")24 b Fn(called)18 -b(during)f(garbage)e(collection.)24 b(Receiv)o(es)18 b(as)d(argumen)o(t)h -(the)g(table)g(b)q(eing)i(collected.)24 b(After)102 1731 y(eac)o(h)15 -b(run)g(of)g(the)g(collector)h(this)f(function)h(is)g(called)g(with)g -(argumen)o(t)e(nil.)21 b(Because)16 b(this)f(function)102 1788 -y(op)q(erates)j(during)i(garbage)d(collection,)k(it)e(m)o(ust)f(b)q(e)h(used) -g(with)g(great)f(care,)h(and)g(programmers)102 1844 y(should)d(a)o(v)o(oid)e -(the)i(creation)f(of)f(new)h(ob)s(jects)g(\(tables)g(or)f(strings\))h(in)g -(this)h(function.)21 b(The)15 b(default)102 1901 y(function)h(do)q(es)f -(nothing.)-12 1994 y Fk(\\error")22 b Fn(called)16 b(when)e(an)g(error)f(o)q -(ccurs.)20 b(Receiv)o(es)15 b(as)e(argumen)o(t)h(a)f(string)h(describing)h -(the)f(error.)19 b(The)102 2050 y(default)d(function)g(prin)o(ts)f(the)g -(message)g(on)g(the)h(standard)e(error)h(output.)59 2143 y(The)e(function)h -Fl(setfallback)d Fn(is)j(used)g(to)e(c)o(hange)h(a)g(fallbac)o(k)h(action.)19 -b(Its)13 b(\014rst)g(argumen)o(t)f(is)i(a)e(string)-12 2199 -y(describing)h(the)f(fallbac)o(k,)g(and)g(the)f(second)h(the)g(new)f -(function)h(to)f(b)q(e)h(called.)20 b(It)12 b(returns)f(the)h(old)f(function) --12 2256 y(for)k(the)g(giv)o(en)h(fallbac)o(k,)f(or)g(nil)i(on)e(error.)59 -2312 y(Section)h(7.4)e(sho)o(ws)h(an)g(example)h(of)f(the)g(use)g(of)g -(fallbac)o(ks.)-12 2434 y Fd(4.8)56 b(Error)18 b(Handling)-12 -2520 y Fn(Because)i(Lua)g(is)g(an)g(extension)g(language,)h(all)f(Lua)g -(actions)f(start)g(from)g(C)g(co)q(de)h(calling)h(a)e(function)-12 -2576 y(from)13 b(the)i(Lua)f(library)l(.)20 b(Whenev)o(er)15 -b(an)f(error)f(o)q(ccurs)h(during)h(Lua)f(compilation)i(or)d(execution,)i(an) -f(error)-12 2632 y(fallbac)o(k)h(function)g(is)g(called,)h(and)e(then)h(the)f -(corresp)q(onden)o(t)g(function)i(from)d(the)h(library)h(\()p -Fl(lua_dofile)p Fn(,)-12 2689 y Fl(lua_dostring)p Fn(,)d Fl(lua_call)p -Fn(,)f(and)j Fl(lua_callfunction)p Fn(\))c(is)j(terminated)h(returning)f(an)g -(error)f(condition.)59 2745 y(The)j(only)h(argumen)o(t)f(to)g(the)g(error)g -(fallbac)o(k)h(function)g(is)g(a)f(string)h(describing)h(the)e(error)g(and)h -(some)-12 2802 y(extra)k(informations,)i(lik)o(e)g(curren)o(t)f(line)i -(\(when)e(the)g(error)f(is)h(at)g(compilation\))g(or)g(curren)o(t)f(function) --12 2858 y(\(when)d(the)f(error)g(is)h(at)f(execution\).)24 -b(F)l(or)16 b(more)g(information)g(ab)q(out)h(an)f(error,)g(the)g(Lua)h -(program)e(can)910 2976 y(9)p eop +9 8 bop 29 199 a Fn(P)o(arameters)13 b(act)i(as)f(lo)q(cal)h(v)m +(ariables,)f(initialized)f(with)i(the)g(argumen)o(t)f(v)m(alues.)42 +271 y Fm(p)n(arlist1)50 b Fi(!)g Fm('name')16 b Fi(f)p +Fn(',')f Fm(name)s Fi(g)29 400 y Fn(Results)g(are)f(returned)h(using)f +(the)h Fl(return)f Fn(statemen)o(t)e(\(see)j(Section)f(4.4.3\).)k(If)d +(con)o(trol)e(reac)o(hes)i(the)g(end)-42 456 y(of)g(a)g(function)g +(without)f(a)h(return)g(instruction,)f(the)h(function)g(returns)h(with) +e(no)h(results.)29 513 y(There)22 b(is)f(a)g(sp)q(ecial)g(syn)o(tax)g +(for)g(de\014nition)h(of)f(metho)q(ds,)h(that)e(is,)j(functions)e(whic) +o(h)g(ha)o(v)o(e)h(an)f(extra)-42 569 y(parameter)14 +b Fm(self)p Fn(.)42 641 y Fm(function)50 b Fi(!)g Fk(function)16 +b Fm(var)h Fn(':')j Fm(name)c Fn('\(')f([)p Fm(p)n(arlist1)6 +b Fn(])16 b('\)')f Fm(blo)n(ck)g Fk(end)-42 714 y Fn(A)h(declaration)e +(lik)o(e)-42 807 y Fl(function)23 b(v:f)h(\(...\))6 864 +y(...)-42 920 y(end)-42 1014 y Fn(is)15 b(equiv)m(alen)o(t)g(to)-42 +1108 y Fl(function)23 b(v.f)h(\(self,)f(...\))6 1164 +y(...)-42 1221 y(end)-42 1315 y Fn(that)16 b(is,)g(the)g(function)g +(gets)g(an)g(extra)f(formal)f(parameter)h(called)h Fl(self)p +Fn(.)22 b(Notice)16 b(that)f(the)h(v)m(ariable)g Fl(v)g +Fn(m)o(ust)-42 1371 y(b)q(e)g(previously)f(initialized)f(with)g(a)h +(table)g(v)m(alue.)-42 1493 y Fd(4.7)56 b(F)-5 b(allbac)n(ks)-42 +1579 y Fn(Lua)17 b(pro)o(vides)f(a)g(p)q(o)o(w)o(erful)g(mec)o(hanism)e +(to)h(extend)i(its)f(seman)o(tics,)e(called)i Fm(fal)r(lb)n(acks)p +Fn(.)23 b(Basically)l(,)15 b(a)h(fallbac)o(k)-42 1635 +y(is)f(a)g(programmer)d(de\014ned)17 b(function)e(whic)o(h)g(is)f +(called)h(whenev)o(er)h(Lua)f(do)q(es)h(not)f(kno)o(w)f(ho)o(w)h(to)g +(pro)q(ceed.)29 1691 y(Lua)h(supp)q(orts)f(the)g(follo)o(wing)e +(fallbac)o(ks,)h(iden)o(ti\014ed)h(b)o(y)g(the)g(giv)o(en)g(strings:) +-42 1785 y Fk(\\arith")24 b Fn(called)17 b(when)g(an)h(arithmetic)c(op) +q(eration)j(is)g(applied)g(to)f(non)i(n)o(umerical)d(op)q(erands,)j(or) +f(when)g(the)72 1842 y(binary)f Fl(^)g Fn(op)q(eration)g(is)f(called.) +23 b(It)17 b(receiv)o(es)f(three)g(argumen)o(ts:)k(the)d(t)o(w)o(o)e +(op)q(erands)h(\(the)g(second)h(one)72 1898 y(is)j(nil)g(when)h(the)g +(op)q(eration)e(is)h(unary)h(min)o(us\))e(and)h(one)h(of)f(the)g(follo) +o(wing)f(strings)g(describing)h(the)72 1955 y(o\013ended)c(op)q +(erator:)120 2067 y Fl(add)47 b(sub)g(mul)h(div)f(pow)g(unm)72 +2180 y Fn(Its)15 b(return)f(v)m(alue)h(is)f(the)h(\014nal)f(result)g +(of)g(the)h(arithmetic)d(op)q(eration.)19 b(The)c(default)f(function)g +(issues)h(an)72 2236 y(error.)-42 2330 y Fk(\\order")23 +b Fn(called)15 b(when)h(an)g(order)f(comparison)e(is)i(applied)h(to)f +(non)g(n)o(umerical)f(or)h(non)h(string)e(op)q(erands.)21 +b(It)72 2386 y(receiv)o(es)d(three)g(argumen)o(ts:)23 +b(the)18 b(t)o(w)o(o)f(op)q(erands)h(and)g(one)g(of)f(the)h(follo)o +(wing)e(strings)h(describing)g(the)72 2443 y(o\013ended)f(op)q(erator:) +120 2555 y Fl(lt)23 b(gt)h(le)g(ge)922 2748 y Fn(9)p +eop %%Page: 10 10 -bop -12 160 a Fn(include)24 b(the)d(compilation)h(pragma)e -Fl($debug)p Fn(.)37 b(This)22 b(pragma)e(m)o(ust)g(b)q(e)i(written)f(in)h(a)f -(line)i(b)o(y)e(itself.)-12 216 y(When)13 b(an)g(error)f(o)q(ccurs)i(in)f(a)g -(program)f(compiled)i(with)g(this)f(option,)g(the)g(error)f(message)h -(includes)i(extra)-12 273 y(information)h(sho)o(wing)f(the)g(stac)o(k)f(of)h -(calls.)59 329 y(The)d(standard)g(error)g(routine)h(only)g(prin)o(ts)g(the)f -(error)g(message)g(to)g Fl(stderr)p Fn(.)18 b(If)13 b(needed,)h(it)f(is)g(p)q -(ossible)-12 385 y(to)i(c)o(hange)g(the)g(error)g(fallbac)o(k)h(routine;)f -(see)h(Section)g(4.7.)59 442 y(Lua)g(co)q(de)h(can)f(generate)g(an)g(error)f -(b)o(y)h(calling)i(the)e(function)h Fl(error)p Fn(.)k(Its)16 -b(optional)h(parameter)e(is)i(a)-12 498 y(string,)e(whic)o(h)h(is)g(used)g -(as)e(the)i(error)e(message.)-12 641 y Fo(5)69 b(The)23 b(Application)e -(Program)h(In)n(terface)-12 742 y Fn(This)e(section)f(describ)q(es)h(the)f -(API)g(for)f(Lua,)i(that)e(is,)i(the)f(set)f(of)g(C)h(functions)g(a)o(v)m -(ailable)i(to)d(the)h(host)-12 799 y(program)13 b(to)g(comm)o(unicate)h(with) -g(the)f(library)l(.)21 b(The)14 b(API)g(functions)g(can)g(b)q(e)g -(classi\014ed)h(in)g(the)f(follo)o(wing)-12 855 y(categories:)44 -945 y(1.)22 b(executing)16 b(Lua)g(co)q(de;)44 1038 y(2.)22 -b(con)o(v)o(erting)15 b(v)m(alues)h(b)q(et)o(w)o(een)g(C)f(and)g(Lua;)44 -1130 y(3.)22 b(manipulating)17 b(\(reading)e(and)g(writing\))h(Lua)f(ob)s -(jects;)44 1222 y(4.)22 b(calling)17 b(Lua)e(functions;)44 -1315 y(5.)22 b(C)15 b(functions)h(to)e(b)q(e)i(called)h(b)o(y)e(Lua;)44 -1407 y(6.)22 b(lo)q(c)o(king)16 b(Lua)g(Ob)s(jects.)-12 1497 -y(All)h(API)e(functions)h(are)f(declared)i(in)f(the)f(\014le)h -Fl(lua.h)p Fn(.)-12 1618 y Fd(5.1)56 b(Executing)17 b(Lua)i(Co)r(de)-12 -1704 y Fn(A)d(host)g(program)e(can)i(execute)h(Lua)f(programs)f(written)h(in) -h(a)e(\014le)i(or)f(in)h(a)e(string,)h(using)h(the)f(follo)o(wing)-12 -1760 y(functions:)-12 1850 y Fl(int)286 b(lua_dofile)357 b(\(char)23 -b(*filename\);)-12 1907 y(int)286 b(lua_dostring)309 b(\(char)23 -b(*string\);)-12 1997 y Fn(Both)15 b(functions)h(return)f(an)g(error)g(co)q -(de:)20 b(0,)15 b(in)h(case)f(of)g(success;)g(non)h(zero,)e(in)i(case)g(of)e -(errors.)-12 2118 y Fd(5.2)56 b(Con)n(v)n(erting)19 b(V)-5 -b(alues)19 b(b)r(et)n(w)n(een)f(C)h(and)g(Lua)-12 2204 y Fn(Because)24 -b(Lua)g(has)g(no)g(static)f(t)o(yp)q(e)h(system,)h(all)f(v)m(alues)h(passed)f -(b)q(et)o(w)o(een)g(Lua)g(and)g(C)f(ha)o(v)o(e)g(t)o(yp)q(e)-12 -2260 y Fl(lua_Object)p Fn(,)14 b(whic)o(h)i(w)o(orks)e(lik)o(e)i(an)f -(abstract)f(t)o(yp)q(e)i(in)g(C)f(that)f(can)i(hold)g(an)o(y)e(Lua)i(v)m -(alue.)59 2317 y(Lua)24 b(has)g(automatic)f(memory)g(managemen)o(t,)i(and)f -(garbage)f(collection.)48 b(Because)24 b(of)g(that,)h(a)-12 -2373 y Fl(lua_Object)15 b Fn(has)h(a)f(limited)j(scop)q(e,)e(and)g(is)h(only) -f(v)m(alid)i(inside)g(the)e Fm(blo)n(ck)k Fn(where)c(it)g(w)o(as)f(created.) -23 b(A)16 b(C)-12 2429 y(function)j(called)g(from)f(Lua)g(is)g(a)g(blo)q(c)o -(k,)h(and)f(its)g(parameters)f(are)h(v)m(alid)h(only)g(un)o(til)g(its)f(end.) -28 b(A)18 b(go)q(o)q(d)-12 2486 y(programming)d(practice)g(is)h(to)e(con)o(v) -o(ert)h(Lua)g(ob)s(jects)g(to)f(C)h(v)m(alues)h(as)f(so)q(on)g(as)g(they)g -(are)g(a)o(v)m(ailable,)h(and)-12 2542 y(nev)o(er)g(to)e(store)h -Fl(lua_Object)p Fn(s)e(in)j(global)g(v)m(ariables.)59 2599 -y(When)h(C)f(co)q(de)i(calls)f(Lua)g(rep)q(eatedly)l(,)h(as)f(in)g(a)g(lo)q -(op,)g(ob)s(jects)f(returned)h(b)o(y)g(there)f(calls)i(ma)o(y)e(acu-)-12 -2655 y(m)o(ulate,)21 b(creating)g(a)f(memory)g(problem.)36 -b(T)l(o)20 b(a)o(v)o(oid)g(this,)i(nested)e(blo)q(c)o(ks)h(can)g(b)q(e)g -(de\014ned)h(with)e(the)-12 2712 y(functions:)-12 2802 y Fl(void)262 -b(lua_beginblock)f(\(void\);)-12 2858 y(void)h(lua_endblock)309 -b(\(void\);)899 2976 y Fn(10)p eop +10 9 bop 72 199 a Fn(Its)17 b(return)h(v)m(alue)f(is)g(the)g(\014nal)g +(result)g(of)g(the)g(comparison)f(op)q(eration.)25 b(The)18 +b(default)e(function)i(issues)72 256 y(an)d(error.)-42 +350 y Fk(\\concat")25 b Fn(called)d(when)g(a)f(concatenation)f(is)h +(applied)h(to)f(non)h(string)e(op)q(erands.)39 b(It)22 +b(receiv)o(es)f(the)h(t)o(w)o(o)72 406 y(op)q(erands)d(as)f(argumen)o +(ts.)29 b(Its)18 b(return)h(v)m(alue)g(is)f(the)g(\014nal)h(result)f +(of)g(the)h(concatenation)f(op)q(eration.)72 462 y(The)e(default)e +(function)h(issues)g(an)h(error.)-42 556 y Fk(\\index")23 +b Fn(called)14 b(when)i(Lua)f(tries)f(to)g(retriev)o(e)g(the)h(v)m +(alue)g(of)f(an)h(index)g(not)f(presen)o(t)h(in)f(a)h(table.)k(It)c +(receiv)o(es)72 613 y(as)20 b(argumen)o(ts)e(the)i(table)g(and)g(the)g +(index.)35 b(Its)20 b(return)g(v)m(alue)g(is)f(the)h(\014nal)g(result)g +(of)f(the)i(indexing)72 669 y(op)q(eration.)e(The)d(default)e(function) +h(returns)h(nil.)-42 763 y Fk(\\gettable")25 b Fn(called)17 +b(when)i(Lua)g(tries)e(to)g(index)i(a)f(non)g(table)g(v)m(alue.)29 +b(It)18 b(receiv)o(es)g(as)g(argumen)o(ts)e(the)i(non)72 +819 y(table)d(v)m(alue)h(and)g(the)g(index.)22 b(Its)15 +b(return)h(v)m(alue)g(is)f(the)h(\014nal)g(result)f(of)g(the)h +(indexing)g(op)q(eration.)k(The)72 876 y(default)15 b(function)g +(issues)g(an)g(error.)-42 970 y Fk(\\settable")24 b Fn(called)18 +b(when)g(Lua)g(tries)f(to)h(assign)f(indexed)h(a)g(non)g(table)f(v)m +(alue.)28 b(It)18 b(receiv)o(es)g(as)f(argumen)o(ts)72 +1026 y(the)e(non)h(table)e(v)m(alue,)h(the)h(index,)f(and)g(the)h +(assigned)e(v)m(alue.)20 b(The)c(default)f(function)g(issues)g(an)g +(error.)-42 1120 y Fk(\\function")24 b Fn(called)16 b(when)h(Lua)g +(tries)f(to)g(call)f(a)h(non)h(function)f(v)m(alue.)24 +b(It)17 b(receiv)o(es)f(as)g(argumen)o(ts)f(the)h(non)72 +1176 y(function)i(v)m(alue)h(and)g(the)f(argumen)o(ts)f(giv)o(en)h(in)g +(the)h(original)d(call.)29 b(Its)19 b(return)f(v)m(alues)h(are)f(the)h +(\014nal)72 1233 y(results)c(of)f(the)i(call)e(op)q(eration.)19 +b(The)d(default)e(function)h(issues)g(an)h(error.)-42 +1327 y Fk(\\gc")24 b Fn(called)12 b(during)g(garbage)e(collection.)18 +b(It)12 b(receiv)o(es)g(as)f(argumen)o(t)f(the)i(table)f(b)q(eing)h +(collected.)19 b(After)11 b(eac)o(h)72 1383 y(run)16 +b(of)f(the)g(collector)f(this)h(function)g(is)g(called)g(with)g +(argumen)o(t)f(nil.)20 b(Because)c(this)e(function)i(op)q(erates)72 +1440 y(during)i(garbage)g(collection,)f(it)h(m)o(ust)f(b)q(e)i(used)g +(with)f(great)f(care,)i(and)f(programmers)d(should)k(a)o(v)o(oid)72 +1496 y(the)g(creation)g(of)g(new)g(ob)s(jects)g(\(tables)f(or)h +(strings\))e(in)i(this)g(function.)32 b(The)19 b(default)g(function)g +(do)q(es)72 1553 y(nothing.)-42 1646 y Fk(\\error")k +Fn(called)16 b(when)i(an)f(error)f(o)q(ccurs.)26 b(It)17 +b(receiv)o(es)g(as)g(argumen)o(t)e(a)i(string)f(describing)h(the)g +(error.)25 b(The)72 1703 y(default)15 b(function)g(prin)o(ts)f(the)i +(message)d(on)j(the)f(standard)g(error)f(output.)29 1797 +y(The)19 b(function)f Fl(setfallback)f Fn(is)g(used)i(to)f(c)o(hange)g +(a)g(fallbac)o(k)f(action.)29 b(Its)18 b(\014rst)g(argumen)o(t)f(is)g +(a)h(string)-42 1853 y(describing)f(the)g(fallbac)o(k,)e(and)i(the)f +(second)i(the)e(new)h(function)g(to)f(b)q(e)h(called.)24 +b(It)16 b(returns)h(the)f(old)h(function)-42 1910 y(for)e(the)g(giv)o +(en)g(fallbac)o(k.)29 1966 y(Section)g(7.4)f(sho)o(ws)h(an)g(example)f +(of)h(the)g(use)h(of)e(fallbac)o(ks.)-42 2088 y Fd(4.8)56 +b(Error)18 b(Handling)-42 2173 y Fn(Because)c(Lua)g(is)e(an)h +(extension)g(language,)f(all)g(Lua)i(actions)e(start)g(from)f(C)i(co)q +(de)h(calling)d(a)i(function)g(from)e(the)-42 2230 y(Lua)j(library)l(.) +k(Whenev)o(er)13 b(an)g(error)f(o)q(ccurs)i(during)f(Lua)g(compilation) +d(or)j(execution,)g(an)g(error)f(fallbac)o(k)g(func-)-42 +2286 y(tion)k(is)g(called,)f(and)i(then)f(the)g(corresp)q(onding)h +(function)f(from)e(the)i(library)f(\()p Fl(lua_dofile)p +Fn(,)g Fl(lua_dostring)p Fn(,)-42 2343 y Fl(lua_call)p +Fn(,)f(and)i Fl(lua_callfunction)p Fn(\))c(is)j(terminated)e(returning) +i(an)g(error)g(condition.)29 2399 y(The)21 b(only)g(argumen)o(t)e(to)h +(the)h(error)g(fallbac)o(k)e(function)i(is)g(a)f(string)g(describing)h +(the)g(error)g(and)g(some)-42 2456 y(extra)c(informations,)d(lik)o(e)h +(curren)o(t)i(line)g(\(when)g(the)f(error)h(is)f(at)g(compilation\))e +(or)i(curren)o(t)h(function)f(\(when)-42 2512 y(the)g(error)f(is)g(at)g +(execution\).)21 b(F)l(or)15 b(more)f(information)e(ab)q(out)k(an)f +(error,)g(the)g(Lua)h(program)e(can)h(include)h(the)-42 +2569 y(compilation)10 b(pragma)h Fl($debug)p Fn(.)18 +b(This)12 b(pragma)f(m)o(ust)f(b)q(e)k(written)d(in)h(a)h(line)f(b)o(y) +g(itself.)18 b(When)13 b(an)f(error)g(o)q(ccurs)911 2748 +y(10)p eop %%Page: 11 11 -bop -12 160 a Fn(After)15 b(the)g(end)h(of)f(the)g(blo)q(c)o(k,)h(all)g -Fl(lua_Object)p Fn('s)d(created)i(inside)i(it)f(are)f(released.)59 -216 y(T)l(o)g(c)o(hec)o(k)g(the)g(t)o(yp)q(e)h(of)e(a)h Fl(lua_Object)p -Fn(,)f(the)h(follo)o(wing)h(function)g(is)g(a)o(v)m(ailable:)-12 -310 y Fl(int)286 b(lua_type)405 b(\(lua_Object)22 b(object\);)-12 -404 y Fn(plus)16 b(the)g(follo)o(wing)g(macros:)-12 498 y Fl(int)286 -b(lua_isnil)381 b(\(lua_Object)22 b(object\);)-12 554 y(int)286 -b(lua_isnumber)309 b(\(lua_Object)22 b(object\);)-12 610 y(int)286 -b(lua_isstring)309 b(\(lua_Object)22 b(object\);)-12 667 y(int)286 -b(lua_istable)333 b(\(lua_Object)22 b(object\);)-12 723 y(int)286 -b(lua_iscfunction)237 b(\(lua_Object)22 b(object\);)-12 780 -y(int)286 b(lua_isuserdata)261 b(\(lua_Object)22 b(object\);)-12 -874 y Fn(All)17 b(macros)d(return)h(1)g(if)h(the)f(ob)s(ject)g(has)g(the)g -(giv)o(en)h(t)o(yp)q(e,)f(and)g(0)g(otherwise.)59 930 y(The)f(function)h -Fl(lua_type)e Fn(can)h(b)q(e)h(used)g(to)e(distinguish)k(b)q(et)o(w)o(een)d -(di\013eren)o(t)g(kinds)i(of)d(user)i(data;)e(see)-12 987 y(b)q(elo)o(w.)59 -1043 y(T)l(o)i(translate)f(a)h(v)m(alue)i(from)d(t)o(yp)q(e)h -Fl(lua_Object)f Fn(to)h(a)g(sp)q(eci\014c)i(C)e(t)o(yp)q(e,)g(the)g -(programmer)f(can)h(use:)-12 1137 y Fl(double)214 b(lua_getnumber)285 -b(\(lua_Object)22 b(object\);)-12 1193 y(char)238 b(*lua_getstring)285 -b(\(lua_Object)22 b(object\);)-12 1250 y(lua_CFunction)46 b(lua_getcfunction) -213 b(\(lua_Object)22 b(object\);)-12 1306 y(void)238 b(*lua_getuserdata)f -(\(lua_Object)22 b(object\);)-12 1400 y(lua_getnumber)16 b -Fn(con)o(v)o(erts)h(a)h Fl(lua_Object)e Fn(to)h(a)h(\015oat.)27 -b(This)18 b Fl(lua_Object)f Fn(m)o(ust)g(b)q(e)i(a)e(n)o(um)o(b)q(er)h(or)g -(a)-12 1456 y(string)d(con)o(v)o(ertible)i(to)d(n)o(um)o(b)q(er)i(\(see)f -(Section)h(4.2\);)d(otherwise,)i(the)h(function)g(returns)f(0.)59 -1513 y Fl(lua_getstring)f Fn(con)o(v)o(erts)h(a)h Fl(lua_Object)e -Fn(to)i(a)g(string)f(\()p Fl(char)23 b(*)p Fn(\).)f(This)17 -b Fl(lua_Object)d Fn(m)o(ust)i(b)q(e)h(a)-12 1569 y(string)h(or)g(a)g(n)o(um) -o(b)q(er;)i(otherwise,)f(the)f(function)i(returns)e(0)g(\(the)g(n)o(ull)i(p)q -(oin)o(ter\).)29 b(This)19 b(function)g(do)q(es)-12 1626 y(not)14 -b(create)g(a)g(new)g(string,)g(but)g(returns)g(a)g(p)q(oin)o(ter)h(to)e(a)h -(string)g(inside)i(the)e(Lua)h(en)o(vironmen)o(t.)20 b(Because)-12 -1682 y(Lua)14 b(has)f(garbage)f(collection,)k(there)d(is)h(no)f(guaran)o(tee) -g(that)f(suc)o(h)i(p)q(oin)o(ter)g(will)h(b)q(e)f(v)m(alid)h(after)d(the)i -(blo)q(c)o(k)-12 1739 y(ends.)59 1795 y Fl(lua_getcfunction)h -Fn(con)o(v)o(erts)i(a)g Fl(lua_Object)g Fn(to)f(a)i(C)f(function.)28 -b(This)18 b Fl(lua_Object)f Fn(m)o(ust)g(ha)o(v)o(e)-12 1852 -y(t)o(yp)q(e)c Fm(CF)m(unction)s Fn(;)f(otherwise,)i(the)f(function)g -(returns)g(0)g(\(the)f(n)o(ull)j(p)q(oin)o(ter\).)k(The)13 -b(t)o(yp)q(e)g Fl(lua_CFunction)-12 1908 y Fn(is)j(explained)h(in)f(Section)g -(5.5.)59 1965 y Fl(lua_getuserdata)k Fn(con)o(v)o(erts)h(a)h -Fl(lua_Object)e Fn(to)i Fl(void*)p Fn(.)40 b(This)22 b Fl(lua_Object)f -Fn(m)o(ust)h(ha)o(v)o(e)f(t)o(yp)q(e)-12 2021 y Fm(user)n(data)s -Fn(;)16 b(otherwise,)f(the)g(function)h(returns)f(0)g(\(the)g(n)o(ull)i(p)q -(oin)o(ter\).)59 2077 y(The)12 b(rev)o(erse)g(pro)q(cess,)h(that)e(is,)i -(passing)g(a)f(sp)q(eci\014c)i(C)d(v)m(alue)j(to)d(Lua,)i(is)g(done)f(b)o(y)g -(using)h(the)g(follo)o(wing)-12 2134 y(functions:)-12 2228 -y Fl(void)262 b(lua_pushnumber)f(\(double)23 b(n\);)-12 2284 -y(void)262 b(lua_pushstring)f(\(char)23 b(*s\);)-12 2341 y(void)262 -b(lua_pushliteral)237 b(\(char)23 b(*s\);)-12 2397 y(void)262 -b(lua_pushcfunction)189 b(\(lua_CFunction)22 b(f\);)-12 2454 -y(void)262 b(lua_pushusertag)237 b(\(void)23 b(*u,)g(int)h(tag\);)-12 -2547 y Fn(plus)16 b(the)g(macro:)-12 2641 y Fl(void)262 b(lua_pushuserdata) -213 b(\(void)23 b(*u\);)-12 2735 y Fn(All)16 b(of)d(them)h(receiv)o(e)h(a)f -(C)g(v)m(alue,)h(con)o(v)o(ert)f(it)g(to)g(a)f Fl(lua_Object)p -Fn(,)g(and)h(lea)o(v)o(e)h(their)f(results)h(on)f(the)g(top)g(of)-12 -2791 y(the)h(Lua)f(stac)o(k,)g(where)g(it)h(can)g(b)q(e)g(assigned)g(to)e(a)h -(v)m(ariable,)i(passed)f(as)f(paramen)o(ter)f(to)h(a)g(Lua)h(function,)-12 -2848 y(etc)f(\(see)g(b)q(elo)o(w\).)20 b Fl(lua_pushliteral)11 -b Fn(is)k(lik)o(e)g Fl(lua_pushstring)p Fn(,)d(but)i(also)g(puts)f(the)h -(string)g(in)h(the)f(Lua)899 2976 y(11)p eop +11 10 bop -42 199 a Fn(in)15 b(a)g(program)e(compiled)h(with)h(this)f +(option,)g(the)i(error)e(message)g(includes)h(extra)g(information)d +(sho)o(wing)i(the)-42 256 y(stac)o(k)h(of)g(calls.)29 +312 y(The)g(standard)f(error)g(routine)g(only)g(prin)o(ts)g(the)g +(error)g(message)f(to)h Fl(stderr)p Fn(.)19 b(If)14 b(needed,)i(it)e +(is)g(p)q(ossible)g(to)-42 369 y(c)o(hange)i(the)f(error)g(fallbac)o(k) +e(routine;)i(see)g(Section)g(4.7.)29 425 y(Lua)e(co)q(de)g(can)f +(generate)g(an)g(error)g(b)o(y)g(calling)f(the)i(function)f +Fl(error)p Fn(.)18 b(Its)13 b(optional)d(parameter)h(is)h(a)g(string,) +-42 482 y(whic)o(h)k(is)e(used)i(as)f(the)g(error)g(message.)-42 +624 y Fo(5)67 b(The)23 b(Application)h(Program)f(In)n(terface)-42 +725 y Fn(This)13 b(section)g(describ)q(es)h(the)f(API)g(for)g(Lua,)h +(that)e(is,)h(the)g(set)g(of)f(C)h(functions)g(a)o(v)m(ailable)f(to)h +(the)g(host)g(program)-42 782 y(to)i(comm)o(unicate)e(with)h(the)h +(library)l(.)k(The)d(API)f(functions)g(can)h(b)q(e)f(classi\014ed)g(in) +g(the)h(follo)o(wing)d(categories:)14 869 y(1.)22 b(executing)15 +b(Lua)h(co)q(de;)14 961 y(2.)22 b(con)o(v)o(erting)14 +b(v)m(alues)i(b)q(et)o(w)o(een)f(C)g(and)g(Lua;)14 1052 +y(3.)22 b(manipulating)13 b(\(reading)h(and)i(writing\))d(Lua)j(ob)s +(jects;)14 1144 y(4.)22 b(calling)14 b(Lua)i(functions;)14 +1235 y(5.)22 b(C)15 b(functions)g(to)g(b)q(e)g(called)g(b)o(y)g(Lua;)14 +1326 y(6.)22 b(lo)q(c)o(king)14 b(Lua)i(Ob)s(jects.)-42 +1414 y(All)f(API)h(functions)f(are)f(declared)i(in)f(the)g(\014le)g +Fl(lua.h)p Fn(.)-42 1535 y Fd(5.1)56 b(Executing)18 b(Lua)h(Co)r(de)-42 +1621 y Fn(A)i(host)g(program)d(can)j(execute)h(Lua)f(programs)d +(written)i(in)h(a)f(\014le)h(or)f(in)h(a)g(string,)f(using)h(the)g +(follo)o(wing)-42 1677 y(functions:)-42 1765 y Fl(int)286 +b(lua_dofile)357 b(\(char)23 b(*filename\);)-42 1821 +y(int)286 b(lua_dostring)309 b(\(char)23 b(*string\);)-42 +1909 y Fn(Both)15 b(functions)f(return)g(an)g(error)f(co)q(de:)20 +b(0,)14 b(in)g(case)g(of)g(success;)h(non)f(zero,)g(in)g(case)h(of)e +(errors.)19 b(The)c(function)-42 1965 y Fl(lua_dofile)p +Fn(,)f(if)h(called)f(with)h(argumen)o(t)e(NULL)j(\(0\),)e(executes)i +(the)f(\\\014le")g Fl(stdin)p Fn(.)-42 2086 y Fd(5.2)56 +b(Con)n(v)n(erting)20 b(V)-5 b(alues)20 b(b)r(et)n(w)n(een)e(C)h(and)h +(Lua)-42 2172 y Fn(Because)13 b(Lua)g(has)f(no)g(static)f(t)o(yp)q(e)h +(system,)f(all)h(v)m(alues)g(passed)g(b)q(et)o(w)o(een)h(Lua)f(and)h(C) +f(ha)o(v)o(e)g(t)o(yp)q(e)g Fl(lua)p 1739 2172 15 2 v +17 w(Object)p Fn(,)-42 2228 y(whic)o(h)k(w)o(orks)e(lik)o(e)g(an)h +(abstract)f(t)o(yp)q(e)i(in)f(C)g(that)f(can)h(hold)g(an)o(y)g(Lua)h(v) +m(alue.)29 2285 y(Lua)11 b(has)f(automatic)e(memory)f(managemen)o(t,)i +(and)h(garbage)g(collection.)17 b(Because)11 b(of)f(that,)g(a)g +Fl(lua_Object)-42 2341 y Fn(has)18 b(a)f(limited)e(scop)q(e,)j(and)g +(is)f(only)g(v)m(alid)g(inside)g(the)h Fm(blo)n(ck)j +Fn(where)d(it)f(w)o(as)f(created.)27 b(A)17 b(C)h(function)f(called)-42 +2398 y(from)c(Lua)i(is)f(a)h(blo)q(c)o(k,)f(and)h(its)e(parameters)g +(are)h(v)m(alid)h(only)f(un)o(til)g(its)f(end.)21 b(A)14 +b(go)q(o)q(d)h(programmi)o(ng)d(practice)-42 2454 y(is)i(to)f(con)o(v)o +(ert)g(Lua)h(ob)s(jects)f(to)g(C)h(v)m(alues)g(as)f(so)q(on)h(as)f +(they)h(are)g(a)o(v)m(ailable,)e(and)i(nev)o(er)g(to)f(store)g +Fl(lua_Object)p Fn(s)-42 2511 y(in)j(C)e(global)g(v)m(ariables.)29 +2567 y(When)f(C)g(co)q(de)h(calls)e(Lua)h(rep)q(eatedly)l(,)g(as)g(in)g +(a)f(lo)q(op,)h(ob)s(jects)f(returned)i(b)o(y)f(these)g(calls)f(accum)o +(ulate,)f(and)-42 2623 y(ma)o(y)j(create)h(a)g(memory)d(problem.)19 +b(T)l(o)c(a)o(v)o(oid)f(this,)g(nested)i(blo)q(c)o(ks)f(can)g(b)q(e)h +(de\014ned)g(with)f(the)g(functions:)911 2748 y(11)p +eop %%Page: 12 12 -bop -12 160 a Fn(literal)17 b(table.)k(This)16 b(a)o(v)o(oids)f(the)h(string) -f(to)g(b)q(e)h(garbage)f(collected,)h(and)g(therefore)f(has)h(a)f(b)q(etter)g -(o)o(v)o(erall)-12 216 y(p)q(erformance.)20 b(As)14 b(a)h(rule,)g(when)g(the) -f(string)h(to)e(b)q(e)j(pushed)f(is)g(a)f(literal,)i Fl(lua_pushliteral)c -Fn(should)k(b)q(e)-12 273 y(used.)59 329 y(User)g(data)f(can)i(ha)o(v)o(e)e -(di\013eren)o(t)i(tags,)e(whose)h(seman)o(tics)g(are)g(de\014ned)i(b)o(y)e -(the)g(host)g(program.)21 b(An)o(y)-12 385 y(p)q(ositiv)o(e)e(in)o(teger)f -(can)g(b)q(e)g(used)h(to)e(tag)g(a)g(user)h(data.)27 b(When)18 -b(a)g(user)g(data)f(is)h(retriev)o(ed,)h(the)e(function)-12 -442 y Fl(lua_type)d Fn(can)i(b)q(e)f(used)h(to)f(get)g(its)g(tag.)59 -498 y(T)l(o)d(complete)h(the)g(set,)g(the)f(v)m(alue)i Fk(nil)g -Fn(or)e(a)g Fl(lua_Object)g Fn(can)g(also)h(b)q(e)g(pushed)h(on)o(to)e(the)g -(stac)o(k,)g(with:)-12 588 y Fl(void)262 b(lua_pushnil)333 -b(\(void\);)-12 644 y(void)262 b(lua_pushobject)f(\(lua_Object)22 -b(object\);)-12 765 y Fd(5.3)56 b(Manipulating)18 b(Lua)h(Ob)s(jects)-12 -851 y Fn(T)l(o)c(read)g(the)h(v)m(alue)g(of)f(an)o(y)g(global)g(Lua)h(v)m -(ariable,)g(one)f(can)h(use)f(the)h(function:)-12 940 y Fl(lua_Object)118 -b(lua_getglobal)285 b(\(char)23 b(*varname\);)-12 1029 y Fn(T)l(o)15 -b(store)g(a)f(v)m(alue)j(previously)f(pushed)h(on)o(to)d(the)h(stac)o(k)g(in) -h(a)f(global)g(v)m(ariable,)i(there)e(is)h(the)f(function:)-12 -1119 y Fl(void)262 b(lua_storeglobal)237 b(\(char)23 b(*varname\);)59 -1208 y Fn(T)l(ables)16 b(can)f(also)g(b)q(e)h(manipulated)h(via)e(the)g(API.) -h(The)f(function)-12 1297 y Fl(lua_Object)118 b(lua_getsubscript)213 -b(\(void\);)-12 1386 y Fn(exp)q(ects)15 b(on)g(the)f(stac)o(k)g(a)g(table)h -(and)g(an)f(index,)i(and)e(returns)h(the)f(con)o(ten)o(ts)g(of)g(the)h(table) -g(at)f(that)f(index.)-12 1443 y(As)22 b(in)h(Lua,)g(if)f(the)g(\014rst)g(ob)s -(ject)f(is)h(not)g(a)f(table,)j(or)d(the)h(index)h(is)g(not)e(presen)o(t)h -(in)h(the)f(table,)h(the)-12 1499 y(corresp)q(onden)o(t)16 -b(fallbac)o(k)g(is)f(called.)59 1556 y(F)l(or)f(compatibilit)o(y)j(with)f -(previous)g(v)o(ersions)f(of)g(the)g(API,)g(the)g(follo)o(wing)h(macros)f -(are)g(supp)q(orted:)-12 1645 y Fl(lua_Object)118 b(lua_getindexed)261 -b(\(lua_Object)22 b(table,)h(float)g(index\);)-12 1702 y(lua_Object)118 -b(lua_getfield)309 b(\(lua_Object)22 b(table,)h(char)g(*field\);)-12 -1791 y Fn(The)16 b(\014rst)e(one)i(is)f(used)h(for)f(n)o(umeric)h(indices,)h -(while)f(the)g(second)f(can)h(b)q(e)g(used)f(for)g(an)o(y)g(string)g(index.) -59 1847 y(T)l(o)h(store)g(a)h(v)m(alue)h(in)g(an)f(index,)h(the)f(program)e -(m)o(ust)i(push)g(on)o(to)f(the)h(stac)o(k)f(the)h(table,)g(the)g(index,)-12 -1904 y(and)f(the)f(v)m(alue,)h(and)f(then)h(call)g(the)f(function:)-12 -1993 y Fl(void)24 b(lua_storesubscript)d(\(void\);)-12 2082 -y Fn(Again,)15 b(the)h(corresp)q(onden)o(t)f(fallbac)o(k)h(is)g(called)h(if)e -(needed.)59 2139 y(Finally)l(,)h(the)g(function)-12 2228 y -Fl(lua_Object)118 b(lua_createtable)237 b(\(void\);)-12 2317 -y Fn(creates)15 b(a)g(new)g(table.)59 2374 y Fm(Ple)n(ase)g(Notic)n(e:)24 -b Fn(Most)15 b(functions)h(from)g(the)f(Lua)i(library)f(receiv)o(e)h -(parameters)e(through)h(the)f(stac)o(k.)-12 2430 y(Because)k(other)f -(functions)h(also)f(use)h(the)f(stac)o(k,)g(it)g(is)h(imp)q(ortan)o(t)f(that) -f(these)i(parameters)e(b)q(e)i(pushed)-12 2487 y(just)c(b)q(efore)g(the)f -(corresp)q(onden)o(t)h(call,)h(without)f(in)o(termediate)g(calls)h(to)e(the)h -(Lua)g(library)l(.)21 b(F)l(or)14 b(instance,)-12 2543 y(supp)q(ose)i(the)f -(user)h(w)o(an)o(ts)e(the)h(v)m(alue)i(of)d Fl(a[i])p Fn(.)20 -b(A)15 b(simplistic)i(solution)f(w)o(ould)g(b)q(e:)36 2632 -y Fl(/*)24 b(Warning:)e(WRONG)h(CODE)h(*/)36 2689 y(lua_Object)e(result;)36 -2745 y(lua_pushobject\(lua_getglo)o(bal\("a"\))o(\);)45 b(/*)23 -b(push)h(table)f(*/)36 2802 y(lua_pushobject\(lua_getglo)o(bal\("i"\))o(\);) -45 b(/*)23 b(push)h(index)f(*/)36 2858 y(result)g(=)h(lua_getsubscript\(\);) -899 2976 y Fn(12)p eop +12 11 bop -42 199 a Fl(void)262 b(lua_beginblock)f(\(void\);)-42 +256 y(void)h(lua_endblock)309 b(\(void\);)-42 350 y Fn(After)15 +b(the)h(end)f(of)g(the)g(blo)q(c)o(k,)g(all)f Fl(lua_Object)p +Fn('s)g(created)h(inside)g(it)f(are)h(released.)29 406 +y(T)l(o)g(c)o(hec)o(k)g(the)h(t)o(yp)q(e)f(of)g(a)g Fl(lua_Object)p +Fn(,)e(the)i(follo)o(wing)e(function)i(is)g(a)o(v)m(ailable:)-42 +500 y Fl(int)286 b(lua_type)405 b(\(lua_Object)22 b(object\);)-42 +594 y Fn(plus)16 b(the)f(follo)o(wing)e(macros:)-42 687 +y Fl(int)286 b(lua_isnil)381 b(\(lua_Object)22 b(object\);)-42 +744 y(int)286 b(lua_isnumber)309 b(\(lua_Object)22 b(object\);)-42 +800 y(int)286 b(lua_isstring)309 b(\(lua_Object)22 b(object\);)-42 +857 y(int)286 b(lua_istable)333 b(\(lua_Object)22 b(object\);)-42 +913 y(int)286 b(lua_iscfunction)237 b(\(lua_Object)22 +b(object\);)-42 970 y(int)286 b(lua_isuserdata)261 b(\(lua_Object)22 +b(object\);)-42 1064 y Fn(All)15 b(macros)e(return)j(1)e(if)h(the)g(ob) +s(ject)g(has)g(the)g(giv)o(en)g(t)o(yp)q(e,)g(and)g(0)g(otherwise.)29 +1120 y(The)20 b(function)g Fl(lua_type)f Fn(can)h(b)q(e)h(used)f(to)g +(distinguish)f(b)q(et)o(w)o(een)h(di\013eren)o(t)f(kinds)h(of)g(user)g +(data;)h(see)-42 1176 y(b)q(elo)o(w.)29 1233 y(T)l(o)15 +b(translate)f(a)h(v)m(alue)g(from)f(t)o(yp)q(e)h Fl(lua_Object)f +Fn(to)g(a)h(sp)q(eci\014c)h(C)f(t)o(yp)q(e,)g(the)g(programmer)d(can)k +(use:)-42 1327 y Fl(double)214 b(lua_getnumber)285 b(\(lua_Object)22 +b(object\);)-42 1383 y(char)239 b(*lua_getstring)284 +b(\(lua_Object)22 b(object\);)-42 1440 y(lua_CFunction)46 +b(lua_getcfunction)213 b(\(lua_Object)22 b(object\);)-42 +1496 y(void)239 b(*lua_getuserdata)d(\(lua_Object)22 +b(object\);)-42 1590 y(lua_getnumber)14 b Fn(con)o(v)o(erts)g(a)g +Fl(lua_Object)g Fn(to)g(a)h(\015oat.)k(This)c Fl(lua_Object)e +Fn(m)o(ust)h(b)q(e)h(a)g(n)o(um)o(b)q(er)f(or)h(a)f(string)-42 +1646 y(con)o(v)o(ertible)h(to)f(n)o(um)o(b)q(er)h(\(see)g(Section)g +(4.2\);)f(otherwise,)g(the)h(function)g(returns)g(0.)29 +1703 y Fl(lua_getstring)c Fn(con)o(v)o(erts)g(a)h Fl(lua_Object)f +Fn(to)h(a)g(string)g(\()p Fl(char)23 b(*)p Fn(\).)18 +b(This)12 b Fl(lua_Object)f Fn(m)o(ust)g(b)q(e)i(a)f(string)-42 +1759 y(or)k(a)f(n)o(um)o(b)q(er;)h(otherwise,)e(the)i(function)g +(returns)g(0)f(\(the)h(n)o(ull)f(p)q(oin)o(ter\).)21 +b(This)16 b(function)f(do)q(es)i(not)e(create)h(a)-42 +1816 y(new)f(string,)d(but)i(returns)g(a)f(p)q(oin)o(ter)g(to)h(a)f +(string)g(inside)g(the)h(Lua)g(en)o(vironmen)o(t.)k(Because)d(Lua)f +(has)f(garbage)-42 1872 y(collection,)h(there)h(is)g(no)g(guaran)o(tee) +g(that)f(suc)o(h)i(p)q(oin)o(ter)e(will)g(b)q(e)i(v)m(alid)f(after)f +(the)i(blo)q(c)o(k)f(ends.)29 1929 y Fl(lua_getcfunction)f +Fn(con)o(v)o(erts)h(a)h Fl(lua_Object)f Fn(to)g(a)h(C)g(function.)23 +b(This)15 b Fl(lua_Object)g Fn(m)o(ust)g(ha)o(v)o(e)g(t)o(yp)q(e)-42 +1985 y Fm(CF)m(unction)s Fn(;)j(otherwise,)f(the)h(function)g(returns)g +(0)f(\(the)h(n)o(ull)f(p)q(oin)o(ter\).)27 b(The)18 b(t)o(yp)q(e)g +Fl(lua_CFunction)e Fn(is)h(ex-)-42 2042 y(plained)f(in)f(Section)g +(5.5.)29 2098 y Fl(lua_getuserdata)10 b Fn(con)o(v)o(erts)i(a)g +Fl(lua_Object)e Fn(to)i Fl(void*)p Fn(.)18 b(This)12 +b Fl(lua_Object)f Fn(m)o(ust)g(ha)o(v)o(e)h(t)o(yp)q(e)g +Fm(user)n(data)s Fn(;)-42 2154 y(otherwise,)j(the)g(function)g(returns) +g(0)g(\(the)g(n)o(ull)f(p)q(oin)o(ter\).)29 2211 y(The)j(rev)o(erse)g +(pro)q(cess,)h(that)e(is,)h(passing)f(a)h(sp)q(eci\014c)h(C)f(v)m(alue) +g(to)g(Lua,)h(is)e(done)i(b)o(y)f(using)g(the)g(follo)o(wing)-42 +2267 y(functions:)-42 2361 y Fl(void)262 b(lua_pushnumber)f(\(double)23 +b(n\);)-42 2418 y(void)262 b(lua_pushstring)f(\(char)23 +b(*s\);)-42 2474 y(void)262 b(lua_pushliteral)237 b(\(char)23 +b(*s\);)-42 2531 y(void)262 b(lua_pushcfunction)189 b(\(lua_CFunction) +22 b(f\);)-42 2587 y(void)262 b(lua_pushusertag)237 b(\(void)23 +b(*u,)h(int)f(tag\);)911 2748 y Fn(12)p eop %%Page: 13 13 -bop -12 160 a Fn(Ho)o(w)o(ev)o(er,)12 b(the)g(call)h Fl(lua_getglobal\("i"\)) -c Fn(mo)q(di\014es)14 b(the)e(stac)o(k,)f(and)h(in)o(v)m(alidates)i(the)e -(previous)h(pushed)-12 216 y(v)m(alue.)21 b(A)16 b(correct)e(solution)i -(could)g(b)q(e:)36 310 y Fl(lua_Object)22 b(index,)h(result;)36 -366 y(index)g(=)h(lua_getglobal\("i"\);)36 423 y(lua_pushobject\(lua_getglo)o -(bal\("a"\))o(\);)45 b(/*)23 b(push)h(table)f(*/)36 479 y -(lua_pushobject\(index\);)355 b(/*)23 b(push)h(index)f(*/)36 -536 y(result)g(=)h(lua_getsubscript\(\);)-12 657 y Fd(5.4)56 -b(Calling)18 b(Lua)h(F)-5 b(unctions)-12 743 y Fn(F)l(unctions)12 -b(de\014ned)h(in)f(Lua)g(b)o(y)f(a)h(mo)q(dule)g(executed)g(with)g -Fl(dofile)f Fn(or)g Fl(dostring)f Fn(can)h(b)q(e)i(called)g(from)d(the)-12 -800 y(host)h(program.)17 b(This)12 b(is)g(done)g(using)g(the)f(follo)o(wing)h -(proto)q(col:)18 b(\014rst,)11 b(the)g(argumen)o(ts)g(to)f(the)i(function)g -(are)-12 856 y(pushed)17 b(on)o(to)e(the)h(Lua)g(stac)o(k)f(\(see)h(Section)g -(5.2\),)f(in)h(direct)h(order,)e(i.e.,)h(the)f(\014rst)h(argumen)o(t)f(is)h -(pushed)-12 913 y(\014rst.)24 b(Again,)18 b(it)f(is)g(imp)q(ortan)o(t)f(to)g -(emphasize)i(that,)e(during)i(this)f(phase,)g(no)g(other)f(Lua)i(function)f -(can)-12 969 y(b)q(e)f(called.)59 1026 y(Then,)f(the)g(function)h(is)g -(called)h(using)-12 1119 y Fl(int)286 b(lua_call)405 b(\(char)23 -b(*functionname\);)-12 1213 y Fn(or)-12 1307 y Fl(int)286 b(lua_callfunction) -213 b(\(lua_Object)22 b(function\);)-12 1401 y Fn(Both)16 b(functions)g -(return)g(an)f(error)g(co)q(de:)21 b(0,)15 b(in)i(case)e(of)g(success;)h(non) -g(zero,)f(in)i(case)f(of)f(errors.)20 b(Finally)l(,)-12 1457 -y(the)15 b(returned)g(v)m(alues)g(\(a)f(Lua)h(function)h(ma)o(y)e(return)g -(man)o(y)g(v)m(alues\))i(can)e(b)q(e)h(retriev)o(ed)g(with)g(the)g(macro)-12 -1551 y Fl(lua_Object)118 b(lua_getresult)309 b(\(int)23 b(number\);)-12 -1645 y(number)15 b Fn(is)g(the)h(order)f(of)f(the)i(result,)f(starting)f -(with)i(1.)k(When)15 b(called)i(with)f(a)f(n)o(um)o(b)q(er)g(larger)g(than)g -(the)-12 1701 y(actual)h(n)o(um)o(b)q(er)f(of)g(results,)g(this)h(function)g -(returns)f Fl(LUA_NOOBJECT)p Fn(.)59 1758 y(Tw)o(o)c(sp)q(ecial)i(Lua)g -(functions)f(ha)o(v)o(e)g(exclusiv)o(e)h(in)o(terfaces:)19 -b Fl(error)11 b Fn(and)h Fl(setfallback)p Fn(.)17 b(A)12 b(C)f(function)-12 -1814 y(can)16 b(generate)e(a)h(Lua)h(error)e(calling)j(the)f(function)-12 -1908 y Fl(void)24 b(lua_error)e(\(char)h(*message\);)-12 2002 -y Fn(This)c(function)h(nev)o(er)e(returns.)30 b(If)19 b(the)g(C)f(function)h -(has)g(b)q(een)g(called)i(from)c(Lua,)j(the)e(corresp)q(onding)-12 -2058 y(Lua)g(execution)h(terminates,)f(as)f(if)i(an)e(error)g(had)h(o)q -(ccured)h(inside)h(Lua)e(co)q(de.)28 b(Otherwise,)19 b(the)f(whole)-12 -2115 y(program)c(terminates.)59 2171 y(F)l(allbac)o(ks)i(can)f(b)q(e)h(c)o -(hanged)f(with:)-12 2265 y Fl(lua_Object)23 b(lua_setfallback)e(\(char)j -(*name,)f(lua_CFunction)f(fallback\);)-12 2359 y Fn(The)17 -b(\014rst)g(parameter)f(is)h(the)g(fallbac)o(k)h(name,)e(and)h(the)g(second)h -(a)e(CF)l(unction)i(to)e(b)q(e)h(used)h(as)e(the)h(new)-12 -2415 y(fallbac)o(k.)32 b(This)19 b(function)h(returns)e(a)h -Fl(lua_Object)p Fn(,)f(whic)o(h)h(is)h(the)f(old)g(fallbac)o(k)h(v)m(alue,)g -(or)e(nil)j(on)d(fail)-12 2472 y(\(in)o(v)m(alid)f(fallbac)o(k)f(name\).)k -(This)c(old)f(v)m(alue)i(can)e(b)q(e)h(used)g(for)e(c)o(haining)j(fallbac)o -(ks.)59 2528 y(An)e(example)h(of)f(C)g(co)q(de)h(calling)h(a)e(Lua)g -(function)h(is)g(sho)o(wn)f(in)h(Section)g(7.6.)899 2976 y(13)p -eop +13 12 bop -42 199 a Fn(plus)16 b(the)f(macro:)-42 293 +y Fl(void)262 b(lua_pushuserdata)213 b(\(void)23 b(*u\);)-42 +387 y Fn(All)17 b(of)f(them)g(receiv)o(e)h(a)f(C)h(v)m(alue,)g(con)o(v) +o(ert)f(it)h(to)f(a)g(corresp)q(onden)o(t)i Fl(lua_Object)p +Fn(,)d(and)i(lea)o(v)o(e)f(the)h(result)g(on)-42 443 +y(the)h(top)g(of)f(the)h(Lua)g(stac)o(k,)f(where)h(it)f(can)h(b)q(e)h +(assigned)e(to)g(a)h(Lua)g(v)m(ariable,)f(passed)h(as)g(paramen)o(ter)e +(to)h(a)-42 500 y(Lua)f(function,)g(etc)f(\(see)h(b)q(elo)o(w\).)21 +b Fl(lua_pushliteral)13 b Fn(is)i(lik)o(e)g Fl(lua_pushstring)p +Fn(,)f(but)h(also)g(puts)h(the)f(string)-42 556 y(in)h(the)g(Lua)g +(literal)e(table.)21 b(This)15 b(a)o(v)o(oids)g(the)h(string)e(to)h(b)q +(e)i(garbage)e(collected,)g(and)h(therefore)f(has)h(a)f(b)q(etter)-42 +613 y(o)o(v)o(erall)e(p)q(erformance.)19 b(As)14 b(a)h(rule,)f(when)h +(the)f(string)g(to)g(b)q(e)h(pushed)g(is)f(a)h(literal,)d +Fl(lua_pushliteral)g Fn(should)-42 669 y(b)q(e)k(used.)29 +726 y(User)10 b(data)g(can)h(ha)o(v)o(e)e(di\013eren)o(t)h(tags,)g +(whose)g(seman)o(tics)f(are)h(de\014ned)h(b)o(y)g(the)f(host)g +(program.)16 b(An)o(y)10 b(p)q(ositiv)o(e)-42 782 y(in)o(teger)15 +b(can)h(b)q(e)h(used)f(to)g(tag)e(a)i(user)g(data.)21 +b(When)16 b(a)g(user)g(data)f(is)g(retriev)o(ed,)g(the)h(function)g +Fl(lua_type)e Fn(can)-42 839 y(b)q(e)i(used)g(to)f(get)f(its)h(tag.)29 +895 y(T)l(o)g(complete)f(the)h(set,)g(the)g(v)m(alue)g +Fk(nil)g Fn(or)f(a)h Fl(lua_Object)f Fn(can)h(also)g(b)q(e)g(pushed)i +(on)o(to)d(the)h(stac)o(k,)f(with:)-42 989 y Fl(void)262 +b(lua_pushnil)333 b(\(void\);)-42 1045 y(void)262 b(lua_pushobject)f +(\(lua_Object)22 b(object\);)-42 1167 y Fd(5.3)56 b(Manipulating)22 +b(Lua)c(Ob)s(jects)-42 1253 y Fn(T)l(o)d(read)h(the)f(v)m(alue)g(of)g +(an)o(y)g(global)f(Lua)h(v)m(ariable,)f(one)i(can)f(use)h(the)f +(function:)-42 1347 y Fl(lua_Object)118 b(lua_getglobal)285 +b(\(char)23 b(*varname\);)-42 1440 y Fn(T)l(o)15 b(store)g(a)g(v)m +(alue)g(previously)g(pushed)h(on)o(to)e(the)i(stac)o(k)e(in)h(a)g +(global)f(v)m(ariable,)g(there)h(is)g(the)g(function:)-42 +1534 y Fl(void)262 b(lua_storeglobal)237 b(\(char)23 +b(*varname\);)29 1628 y Fn(T)l(ables)15 b(can)g(also)f(b)q(e)i +(manipulated)e(via)g(the)i(API.)f(The)g(function)-42 +1722 y Fl(lua_Object)118 b(lua_getsubscript)213 b(\(void\);)-42 +1816 y Fn(exp)q(ects)16 b(on)f(the)h(stac)o(k)e(a)h(table)f(and)i(an)f +(index,)g(and)g(returns)g(the)g(con)o(ten)o(ts)g(of)g(the)g(table)f(at) +h(that)f(index.)20 b(As)-42 1872 y(in)15 b(Lua,)g(if)g(the)g(\014rst)f +(ob)s(ject)h(is)f(not)h(a)f(table,)g(or)h(the)g(index)g(is)g(not)f +(presen)o(t)h(in)g(the)g(table,)f(the)h(corresp)q(onden)o(t)-42 +1929 y(fallbac)o(k)f(is)h(called.)29 1985 y(F)l(or)g(compatibilit)n(y)d +(with)j(previous)g(v)o(ersions)f(of)h(the)g(API,)g(the)h(follo)o(wing)d +(macros)g(are)i(supp)q(orted:)-42 2079 y Fl(lua_Object)118 +b(lua_getindexed)261 b(\(lua_Object)22 b(table,)h(float)h(index\);)-42 +2135 y(lua_Object)118 b(lua_getfield)309 b(\(lua_Object)22 +b(table,)h(char)h(*field\);)-42 2229 y Fn(The)16 b(\014rst)f(one)g(is)g +(used)h(for)e(n)o(umeric)g(indices,)h(while)g(the)g(second)h(can)f(b)q +(e)h(used)g(for)e(an)o(y)h(string)f(index.)29 2286 y(T)l(o)i(store)g(a) +g(v)m(alue)h(in)f(an)h(index,)g(the)f(program)e(m)o(ust)h(push)j(on)o +(to)d(the)i(stac)o(k)e(the)i(table,)f(the)h(index,)f(and)-42 +2342 y(the)g(v)m(alue,)f(and)g(then)h(call)e(the)h(function:)-42 +2436 y Fl(void)24 b(lua_storesubscript)d(\(void\);)-42 +2530 y Fn(Again,)15 b(the)g(corresp)q(onden)o(t)g(fallbac)o(k)f(is)h +(called)g(if)f(needed.)29 2586 y(Finally)l(,)g(the)h(function)911 +2748 y(13)p eop %%Page: 14 14 -bop -12 160 a Fd(5.5)56 b(C)19 b(F)-5 b(unctions)-12 245 y -Fn(T)l(o)15 b(register)g(a)g(C)g(function)h(to)f(Lua,)g(there)g(is)h(the)f -(follo)o(wing)h(macro:)-12 322 y Fl(#define)23 b(lua_register\(n,f\))165 -b(\(lua_pushcfunction\(f\),)21 b(lua_storeglobal\(n\)\))-12 -378 y(/*)j(char)f(*n;)214 b(*/)-12 435 y(/*)24 b(lua_CFunction)e(f;)h(*/)-12 -511 y Fn(whic)o(h)d(receiv)o(es)f(the)g(name)g(the)g(function)g(will)i(ha)o -(v)o(e)d(in)h(Lua,)h(and)f(a)f(p)q(oin)o(ter)i(to)e(the)g(function.)32 -b(This)-12 567 y(p)q(oin)o(ter)16 b(m)o(ust)f(ha)o(v)o(e)f(t)o(yp)q(e)i -Fl(lua_CFunction)p Fn(,)d(whic)o(h)j(is)f(de\014ned)i(as)-12 -644 y Fl(typedef)23 b(void)g(\(*lua_CFunction\))f(\(void\);)-12 -720 y Fn(that)15 b(is,)g(a)g(p)q(oin)o(ter)h(to)e(a)h(function)h(with)g(no)f -(parameters)f(and)h(no)h(results.)59 776 y(In)j(order)f(to)g(comm)o(unicate)g -(prop)q(erly)i(with)e(Lua,)i(a)e(C)g(function)h(m)o(ust)f(follo)o(w)h(a)f -(proto)q(col,)g(whic)o(h)-12 833 y(de\014nes)e(the)g(w)o(a)o(y)e(parameters)g -(and)i(results)f(are)g(passed.)59 889 y(T)l(o)g(access)g(its)g(argumen)o(ts,) -f(a)h(C)g(function)h(calls:)-12 965 y Fl(lua_Object)118 b(lua_getparam)309 -b(\(int)23 b(number\);)-12 1042 y(number)17 b Fn(starts)g(with)h(1)g(to)f -(get)g(the)h(\014rst)g(argumen)o(t.)27 b(When)18 b(called)i(with)e(a)f(n)o -(um)o(b)q(er)i(larger)e(than)h(the)-12 1098 y(actual)d(n)o(um)o(b)q(er)g(of)f -(argumen)o(ts,)f(this)j(function)f(returns)f Fl(LUA_NOOBJECT)p -Fn(.)f(In)i(this)g(w)o(a)o(y)l(,)f(it)g(is)i(p)q(ossible)g(to)-12 -1155 y(write)f(functions)h(that)f(w)o(ork)f(with)i(a)f(v)m(ariable)h(n)o(um)o -(b)q(er)g(of)e(parameters.)59 1211 y(T)l(o)j(return)h(v)m(alues,)i(a)d(C)h -(function)h(just)f(pushes)g(them)g(on)o(to)f(the)i(stac)o(k,)e(in)i(direct)g -(order;)f(see)h(Sec-)-12 1268 y(tion)d(5.2.)j(Lik)o(e)d(a)f(Lua)g(function,)h -(a)f(C)g(function)h(called)g(b)o(y)g(Lua)f(can)g(also)h(return)f(man)o(y)f -(results.)59 1324 y(Section)i(7.5)e(presen)o(ts)h(an)g(example)h(of)f(a)g(CF) -l(unction.)-12 1442 y Fd(5.6)56 b(Lo)r(c)n(king)17 b(Lua)i(Ob)s(jects)-12 -1528 y Fn(As)14 b(already)g(noted,)g Fl(lua_Object)p Fn(s)f(are)g(v)o -(olatile.)21 b(If)14 b(the)g(C)g(co)q(de)g(needs)h(to)e(k)o(eep)i(a)e -Fl(lua_Object)g Fn(outside)-12 1585 y(blo)q(c)o(k)f(b)q(oundaries,)g(it)f -(has)g(to)f Fm(lo)n(ck)g Fn(the)h(ob)s(ject.)18 b(The)11 b(routines)g(to)f -(manipulate)i(lo)q(c)o(king)g(are)e(the)h(follo)o(wing:)-12 -1661 y Fl(int)191 b(lua_lock)22 b(\(void\);)-12 1717 y(lua_Object)h -(lua_getlocked)46 b(\(int)23 b(ref\);)-12 1774 y(void)167 b(lua_pushlocked)22 -b(\(int)h(ref\);)-12 1830 y(void)167 b(lua_unlock)22 b(\(int)h(ref\);)-12 -1907 y Fn(The)f(function)h Fl(lua_lock)d Fn(lo)q(c)o(ks)i(the)g(ob)s(ject)f -(whic)o(h)h(are)g(on)f(the)h(top)f(of)g(the)h(stac)o(k,)g(and)g(returns)g(a) --12 1963 y(reference)g(to)f(it.)37 b(Whenev)o(er)22 b(the)f(lo)q(c)o(k)o(ed)h -(ob)s(ject)f(is)g(needed,)j(a)d(call)h(to)e Fl(lua_getlocked)g -Fn(returns)h(a)-12 2019 y(handle)c(to)f(it,)g(while)h Fl(lua_pushlocked)d -Fn(pushes)j(the)f(handle)h(on)f(the)g(stac)o(k.)22 b(When)16 -b(a)g(lo)q(c)o(k)o(ed)g(ob)s(ject)g(is)-12 2076 y(no)f(longer)h(needed,)g(it) -f(can)h(b)q(e)g(unlo)q(c)o(k)o(ed)g(with)g(a)e(call)j(to)d -Fl(lua_unlock)p Fn(.)-12 2216 y Fo(6)69 b(Prede\014ned)23 b(F)-6 -b(unctions)23 b(and)g(Libraries)-12 2317 y Fn(The)12 b(set)f(of)g -(prede\014ned)i(functions)f(in)g(Lua)g(is)f(small)h(but)g(p)q(o)o(w)o(erful.) -19 b(Most)10 b(of)h(them)g(pro)o(vide)h(features)f(that)-12 -2374 y(allo)o(ws)16 b(some)f(degree)h(of)f(re\015exivit)o(y)h(in)h(the)e -(language.)21 b(Man)o(y)15 b(of)g(these)h(features)f(cannot)g(b)q(e)h(sim)o -(ulated)-12 2430 y(with)g(the)f(rest)g(of)g(the)g(Language)g(nor)g(with)g -(the)h(standard)f(API.)59 2487 y(The)21 b(libraries,)i(on)d(the)h(other)f -(hand,)i(pro)o(vide)g(useful)f(routines)g(that)f(are)h(implemen)o(ted)h -(directly)-12 2543 y(through)13 b(the)f(standard)h(API.)f(Therefore,)h(they)g -(are)f(not)g(necessary)h(to)f(the)h(language,)g(and)g(are)f(pro)o(vided)-12 -2600 y(as)j(separated)g(C)g(mo)q(dules.)21 b(Curren)o(tly)15 -b(there)g(are)g(three)h(standard)e(libraries:)56 2676 y Fi(\017)23 -b Fn(string)15 b(manipulation;)56 2763 y Fi(\017)23 b Fn(mathematical)15 -b(functions)h(\(sin,)f(cos,)g(etc\);)56 2849 y Fi(\017)23 b -Fn(input)16 b(and)f(output;)899 2976 y(14)p eop +14 13 bop -42 199 a Fl(lua_Object)118 b(lua_createtable)237 +b(\(void\);)-42 293 y Fn(creates)15 b(a)g(new)h(table.)29 +349 y Fm(Ple)n(ase)22 b(Notic)n(e:)36 b Fn(Most)22 b(functions)g(from)e +(the)j(Lua)f(library)f(receiv)o(e)i(parameters)d(through)i(the)h(stac)o +(k.)-42 406 y(Because)c(other)e(functions)g(also)g(use)h(the)g(stac)o +(k,)f(it)g(is)g(imp)q(ortan)o(t)e(that)i(these)h(parameters)e(b)q(e)i +(pushed)h(just)-42 462 y(b)q(efore)d(the)f(corresp)q(onden)o(t)g(call,) +f(without)g(in)o(termediate)e(calls)i(to)h(the)g(Lua)g(library)l(.)k(F) +l(or)14 b(instance,)h(supp)q(ose)-42 519 y(the)h(user)f(w)o(an)o(ts)f +(the)h(v)m(alue)h(of)f Fl(a[i])p Fn(.)k(A)c(simplistic)e(solution)h(w)o +(ould)g(b)q(e:)6 613 y Fl(/*)24 b(Warning:)f(WRONG)g(CODE)g(*/)6 +669 y(lua_Object)g(result;)6 725 y(lua_pushobject\(lua_getglobal)o +(\("a"\)\);)44 b(/*)24 b(push)f(table)g(*/)6 782 y +(lua_pushobject\(lua_getglobal)o(\("i"\)\);)44 b(/*)24 +b(push)f(index)g(*/)6 838 y(result)g(=)h(lua_getsubscript\(\);)-42 +932 y Fn(Ho)o(w)o(ev)o(er,)c(the)f(call)g Fl(lua_getglobal\("i"\))e +Fn(mo)q(di\014es)i(the)h(stac)o(k,)f(and)h(in)o(v)m(alidates)e(the)i +(previous)f(pushed)-42 989 y(v)m(alue.)i(A)15 b(correct)g(solution)f +(could)h(b)q(e:)6 1082 y Fl(lua_Object)23 b(result;)6 +1139 y(lua_Object)g(index)g(=)h(lua_getglobal\("i"\);)6 +1195 y(lua_pushobject\(lua_getglobal)o(\("a"\)\);)44 +b(/*)24 b(push)f(table)g(*/)6 1252 y(lua_pushobject\(index\);)355 +b(/*)24 b(push)f(index)g(*/)6 1308 y(result)g(=)h +(lua_getsubscript\(\);)-42 1430 y Fd(5.4)56 b(Calling)21 +b(Lua)e(F)-5 b(unctions)-42 1516 y Fn(F)l(unctions)19 +b(de\014ned)g(in)g(Lua)f(b)o(y)h(a)f(c)o(h)o(unk)g(executed)i(with)e +Fl(dofile)f Fn(or)h Fl(dostring)f Fn(can)i(b)q(e)g(called)f(from)e(the) +-42 1572 y(host)h(program.)23 b(This)16 b(is)g(done)h(using)g(the)g +(follo)o(wing)e(proto)q(col:)22 b(\014rst,)16 b(the)h(argumen)o(ts)e +(to)h(the)h(function)g(are)-42 1629 y(pushed)f(on)o(to)d(the)i(Lua)g +(stac)o(k)e(\(see)i(Section)f(5.2\),)f(in)h(direct)g(order,)g(i.e.,)g +(the)g(\014rst)g(argumen)o(t)f(is)h(pushed)h(\014rst.)-42 +1685 y(Again,)g(it)f(is)h(imp)q(ortan)o(t)e(to)h(emphasize)h(that,)f +(during)h(this)f(phase,)i(no)f(other)g(Lua)g(function)g(can)g(b)q(e)h +(called.)29 1741 y(Then,)f(the)h(function)f(is)f(called)h(using)-42 +1835 y Fl(int)286 b(lua_call)405 b(\(char)23 b(*functionname\);)-42 +1929 y Fn(or)-42 2023 y Fl(int)286 b(lua_callfunction)213 +b(\(lua_Object)22 b(function\);)-42 2116 y Fn(Both)16 +b(functions)g(return)f(an)h(error)f(co)q(de:)22 b(0,)15 +b(in)h(case)g(of)f(success;)i(non)f(zero,)f(in)h(case)g(of)f(errors.)21 +b(Finally)l(,)14 b(the)-42 2173 y(returned)i(v)m(alues)f(\(a)g(Lua)h +(function)f(ma)o(y)e(return)i(man)o(y)f(v)m(alues\))h(can)g(b)q(e)h +(retriev)o(ed)f(with)f(the)i(macro)-42 2267 y Fl(lua_Object)118 +b(lua_getresult)309 b(\(int)23 b(number\);)-42 2360 y +Fn(where)18 b Fl(number)d Fn(is)i(the)g(order)f(of)h(the)g(result,)f +(starting)f(with)h(1.)25 b(When)17 b(called)f(with)g(a)h(n)o(um)o(b)q +(er)f(larger)g(than)-42 2417 y(the)g(actual)e(n)o(um)o(b)q(er)h(of)f +(results,)h(this)f(function)h(returns)g Fl(LUA_NOOBJECT)p +Fn(.)29 2473 y(Tw)o(o)j(sp)q(ecial)g(Lua)g(functions)h(ha)o(v)o(e)e +(exclusiv)o(e)i(in)o(terfaces:)25 b Fl(error)18 b Fn(and)g +Fl(setfallback)p Fn(.)28 b(A)18 b(C)h(function)-42 2530 +y(can)d(generate)f(a)g(Lua)g(error)g(calling)f(the)h(function)-42 +2623 y Fl(void)24 b(lua_error)e(\(char)i(*message\);)911 +2748 y Fn(14)p eop %%Page: 15 15 -bop -12 160 a Fd(6.1)56 b(Prede\014ned)18 b(F)-5 b(unctions)-12 -245 y Fl(dofile)23 b(\(filename\))-12 331 y Fn(This)e(function)g(receiv)o(es) -g(a)f(\014le)h(name,)g(op)q(ens)f(it)h(and)f(executes)h(its)f(con)o(ten)o(ts) -g(as)f(a)h(Lua)g(mo)q(dule.)36 b(It)-12 388 y(returns)15 b(1)g(if)h(there)f -(are)g(no)g(errors,)f Fk(nil)i Fn(otherwise.)-12 508 y Fl(dostring)23 -b(\(string\))-12 594 y Fn(This)17 b(function)f(executes)h(a)e(giv)o(en)i -(string)e(as)h(a)f(Lua)i(mo)q(dule.)23 b(It)16 b(returns)f(1)h(if)g(there)g -(are)g(no)f(errors,)g Fk(nil)-12 650 y Fn(otherwise.)-12 770 -y Fl(next)24 b(\(table,)e(index\))-12 856 y Fn(This)16 b(function)h(allo)o -(ws)e(a)g(program)g(to)g(en)o(umerate)g(all)h(\014elds)h(of)e(a)g(table.)21 -b(Its)16 b(\014rst)f(argumen)o(t)g(is)h(a)f(table)-12 912 y(and)i(its)g -(second)g(argumen)o(t)f(is)h(an)g(index)g(in)h(this)f(table;)g(this)g(index)h -(can)f(b)q(e)g(a)g(n)o(um)o(b)q(er)g(or)f(a)g(string.)24 b(It)-12 -969 y(returns)15 b(the)f(next)h(index)h(of)e(the)g(table)h(and)g(the)g(v)m -(alue)h(asso)q(ciated)e(with)h(the)g(index.)21 b(When)15 b(called)h(with)-12 -1025 y Fk(nil)g Fn(as)e(its)g(second)h(argumen)o(t,)f(the)g(function)i -(returns)e(the)h(\014rst)f(index)i(of)e(the)g(table)h(\(and)f(its)h(asso)q -(ciated)-12 1082 y(v)m(alue\).)21 b(When)16 b(called)g(with)g(the)f(last)g -(index,)h(or)f(with)h Fk(nil)g Fn(in)g(an)f(empt)o(y)g(table,)g(it)h(returns) -f Fk(nil)p Fn(.)59 1138 y(In)h(Lua)h(there)f(is)g(no)g(declaration)h(of)e -(\014elds;)i(seman)o(tically)l(,)h(there)e(is)g(no)g(di\013erence)h(b)q(et)o -(w)o(een)f(a)g(\014eld)-12 1195 y(not)i(presen)o(t)f(in)i(a)f(table)g(or)f(a) -h(\014eld)h(with)f(v)m(alue)h Fk(nil)p Fn(.)29 b(Therefore,)18 -b(the)f(function)i(only)f(considers)h(\014elds)-12 1251 y(with)d(non)f(nil)i -(v)m(alues.)k(The)16 b(order)f(the)g(indices)j(are)d(en)o(umerated)g(are)g -(not)g(sp)q(eci\014ed,)i Fm(even)f(for)g(numeric)-12 1308 y(indic)n(es)p -Fn(.)59 1364 y(See)g(Section)g(7.1)e(for)g(an)i(example)g(of)e(the)i(use)f -(of)g(this)h(function.)-12 1484 y Fl(nextvar)23 b(\(name\))-12 -1570 y Fn(This)14 b(function)g(is)g(similar)g(to)e(the)i(function)g -Fl(next)p Fn(,)e(but)i(it)f(iterates)g(o)o(v)o(er)f(the)i(global)f(v)m -(ariables.)21 b(Its)13 b(single)-12 1626 y(argumen)o(t)18 b(is)i(the)f(name)g -(of)g(a)f(global)i(v)m(ariable,)h(or)d Fk(nil)i Fn(to)f(get)f(a)h(\014rst)f -(name.)32 b(Similarly)21 b(to)d Fl(next)p Fn(,)h(it)-12 1683 -y(returns)e(the)f(name)h(of)f(another)g(v)m(ariable)i(and)f(its)g(v)m(alue,)h -(or)e Fk(nil)h Fn(if)h(there)e(are)h(no)f(more)g(v)m(ariables.)26 -b(See)-12 1739 y(Section)16 b(7.1)f(for)f(an)h(example)h(of)f(the)g(use)h(of) -f(this)g(function.)-12 1859 y Fl(print)23 b(\(e1,)h(e2,)f(...\))-12 -1945 y Fn(This)13 b(function)g(receiv)o(es)g(an)o(y)f(n)o(um)o(b)q(er)g(of)g -(argumen)o(ts,)g(and)g(prin)o(ts)g(their)h(v)m(alues)h(in)f(a)e(reasonable)i -(format.)-12 2002 y(Eac)o(h)h(v)m(alue)i(is)e(prin)o(ted)h(in)g(a)f(new)h -(line.)21 b(This)15 b(function)g(is)f(not)g(in)o(tended)i(for)e(formatted)f -(output,)g(but)i(as)-12 2058 y(a)g(quic)o(k)h(w)o(a)o(y)e(to)h(sho)o(w)g(a)g -(v)m(alue,)h(for)f(instance)h(for)e(error)h(messages)g(or)f(debugging.)22 -b(See)15 b(Section)i(6.4)d(for)-12 2114 y(functions)i(for)f(formatted)f -(output.)-12 2235 y Fl(tonumber)23 b(\(e\))-12 2320 y Fn(This)18 -b(function)g(receiv)o(es)f(one)g(argumen)o(t,)g(and)g(tries)g(to)f(con)o(v)o -(ert)h(it)g(to)f(a)h(n)o(um)o(b)q(er.)25 b(If)18 b(the)f(argumen)o(t)f(is)-12 -2377 y(already)e(a)f(n)o(um)o(b)q(er)h(or)f(a)g(string)g(con)o(v)o(ertible)h -(to)f(a)g(n)o(um)o(b)q(er)h(\(see)f(Section)i(4.2\),)d(it)h(returns)h(that)e -(n)o(um)o(b)q(er;)-12 2433 y(otherwise,)j(it)h(returns)f Fk(nil)p -Fn(.)-12 2553 y Fl(type)24 b(\(v\))-12 2639 y Fn(This)16 b(function)g(allo)o -(ws)f(Lua)h(to)e(test)h(the)g(t)o(yp)q(e)g(of)g(a)f(v)m(alue.)21 -b(It)16 b(receiv)o(es)g(one)f(argumen)o(t,)f(and)h(returns)g(its)-12 -2696 y(t)o(yp)q(e,)h(co)q(ded)g(as)g(a)f(string.)21 b(The)16 -b(p)q(ossible)i(results)e(of)f(this)h(function)g(are)g Fl('nil')p -Fn(,)f Fl('number')p Fn(,)f Fl('string')p Fn(,)-12 2752 y Fl('table')p -Fn(,)g Fl('cfunction')p Fn(,)f Fl('function')p Fn(,)h(and)h -Fl('userdata')p Fn(.)899 2976 y(15)p eop +15 14 bop -42 199 a Fn(This)18 b(function)g(nev)o(er)g(returns.)28 +b(If)18 b(the)g(C)f(function)h(has)g(b)q(een)h(called)f(from)e(Lua,)i +(the)g(corresp)q(onding)g(Lua)-42 256 y(execution)f(terminates,)d(as)i +(if)g(an)g(error)f(had)i(o)q(ccurred)g(inside)f(Lua)h(co)q(de.)23 +b(Otherwise,)16 b(the)h(whole)f(program)-42 312 y(terminates.)29 +369 y(F)l(allbac)o(ks)e(can)h(b)q(e)h(c)o(hanged)g(with:)-42 +460 y Fl(lua_Object)23 b(lua_setfallback)f(\(char)h(*name,)g +(lua_CFunction)f(fallback\);)-42 552 y Fn(The)12 b(\014rst)f(parameter) +f(is)g(the)i(fallbac)o(k)e(name,)h(and)g(the)h(second)f(a)h(CF)l +(unction)f(to)f(b)q(e)i(used)g(as)f(the)h(new)f(fallbac)o(k.)-42 +608 y(This)k(function)g(returns)g(a)g Fl(lua_Object)p +Fn(,)f(whic)o(h)h(is)g(the)g(old)g(fallbac)o(k)f(v)m(alue,)h(or)g(nil)f +(on)h(fail)g(\(in)o(v)m(alid)f(fallbac)o(k)-42 665 y(name\).)19 +b(This)c(old)g(v)m(alue)g(can)g(b)q(e)h(used)g(for)f(c)o(haining)f +(fallbac)o(ks.)29 721 y(An)i(example)e(of)g(C)h(co)q(de)h(calling)e(a)h +(Lua)g(function)h(is)e(sho)o(wn)h(in)g(Section)g(7.6.)-42 +842 y Fd(5.5)56 b(C)19 b(F)-5 b(unctions)-42 928 y Fn(T)l(o)15 +b(register)g(a)f(C)h(function)g(to)g(Lua,)g(there)g(is)g(the)g(follo)o +(wing)e(macro:)-42 1020 y Fl(#define)23 b(lua_register\(n,f\))165 +b(\(lua_pushcfunction\(f\),)21 b(lua_storeglobal\(n\)\))-42 +1076 y(/*)j(char)f(*n;)215 b(*/)-42 1133 y(/*)24 b(lua_CFunction)e(f;)i +(*/)-42 1224 y Fn(whic)o(h)15 b(receiv)o(es)g(the)f(name)g(the)h +(function)f(will)g(ha)o(v)o(e)g(in)g(Lua,)h(and)g(a)f(p)q(oin)o(ter)g +(to)g(the)h(function.)20 b(This)14 b(p)q(oin)o(ter)-42 +1281 y(m)o(ust)g(ha)o(v)o(e)h(t)o(yp)q(e)g Fl(lua_CFunction)p +Fn(,)e(whic)o(h)i(is)g(de\014ned)i(as)-42 1372 y Fl(typedef)23 +b(void)h(\(*lua_CFunction\))d(\(void\);)-42 1464 y Fn(that)15 +b(is,)f(a)h(p)q(oin)o(ter)g(to)f(a)h(function)g(with)g(no)g(parameters) +e(and)j(no)f(results.)29 1521 y(In)g(order)e(to)h(comm)o(unicate)d +(prop)q(erly)j(with)f(Lua,)h(a)f(C)h(function)g(m)o(ust)e(follo)o(w)g +(a)i(proto)q(col,)f(whic)o(h)g(de\014nes)-42 1577 y(the)j(w)o(a)o(y)e +(parameters)f(and)j(results)e(are)h(passed.)29 1633 y(T)l(o)g(access)g +(its)g(argumen)o(ts,)e(a)i(C)g(function)g(calls:)-42 +1725 y Fl(lua_Object)118 b(lua_getparam)309 b(\(int)23 +b(number\);)-42 1817 y Fn(where)16 b Fl(number)e Fn(starts)g(with)h(1)g +(to)f(get)h(the)h(\014rst)e(argumen)o(t.)19 b(When)c(called)g(with)g(a) +g(n)o(um)o(b)q(er)f(larger)g(than)h(the)-42 1873 y(actual)e(n)o(um)o(b) +q(er)f(of)g(argumen)o(ts,)f(this)i(function)f(returns)h +Fl(LUA)p 1029 1873 15 2 v 17 w(NOOBJECT)p Fn(.)e(In)j(this)e(w)o(a)o(y) +l(,)g(it)g(is)h(p)q(ossible)f(to)g(write)-42 1930 y(functions)j(that)g +(w)o(ork)f(with)h(a)g(v)m(ariable)f(n)o(um)o(b)q(er)h(of)f(parameters.) +29 1986 y(T)l(o)g(return)g(v)m(alues,)g(a)g(C)g(function)g(just)f +(pushes)i(them)e(on)o(to)g(the)i(stac)o(k,)e(in)h(direct)g(order;)f +(see)i(Section)f(5.2.)-42 2042 y(Lik)o(e)i(a)e(Lua)i(function,)f(a)g(C) +g(function)g(called)f(b)o(y)h(Lua)h(can)f(also)g(return)g(man)o(y)e +(results.)29 2099 y(Section)i(7.5)f(presen)o(ts)i(an)f(example)f(of)g +(a)h(CF)l(unction.)-42 2220 y Fd(5.6)56 b(Lo)r(c)n(king)19 +b(Lua)f(Ob)s(jects)-42 2306 y Fn(As)h(already)g(noted,)g +Fl(lua_Object)p Fn(s)f(are)h(v)o(olatile.)29 b(If)19 +b(the)g(C)g(co)q(de)h(needs)g(to)e(k)o(eep)h(a)g Fl(lua_Object)f +Fn(outside)-42 2363 y(blo)q(c)o(k)d(b)q(oundaries,)h(it)e(has)h(to)g +Fm(lo)n(ck)f Fn(the)h(ob)s(ject.)20 b(The)15 b(routines)g(to)f +(manipulate)g(lo)q(c)o(king)g(are)h(the)g(follo)o(wing:)-42 +2454 y Fl(int)191 b(lua_lock)23 b(\(void\);)-42 2511 +y(lua_Object)g(lua_getlocked)46 b(\(int)23 b(ref\);)-42 +2567 y(void)167 b(lua_pushlocked)22 b(\(int)h(ref\);)-42 +2623 y(void)167 b(lua_unlock)22 b(\(int)i(ref\);)911 +2748 y Fn(15)p eop %%Page: 16 16 -bop -12 160 a Fl(error)23 b(\(message\))-12 245 y Fn(This)16 -b(function)h(issues)f(an)f(error)g(message)g(and)h(terminates)g(the)f(last)h -(called)h(function)f(from)f(the)h(library)-12 302 y(\()p Fl(lua_dofile)p -Fn(,)d Fl(lua_dostring)p Fn(,)g Fc(:)8 b(:)g(:)e Fn(\).)20 -b(It)15 b(nev)o(er)g(returns.)-12 422 y Fl(setglobal)23 b(\(name,)g(value\)) --12 508 y Fn(This)18 b(function)g(assigns)g(the)f(giv)o(en)h(v)m(alue)h(to)d -(a)h(global)i(v)m(ariable.)27 b(The)18 b(string)f Fl(name)g -Fn(do)q(es)h(not)f(need)h(to)-12 564 y(b)q(e)g(a)f(syn)o(tactically)h(v)m -(alid)h(v)m(ariable)g(name.)26 b(Therefore,)18 b(this)g(function)g(can)f(set) -g(global)h(v)m(ariables)h(with)-12 621 y(strange)c(names)g(lik)o(e)h -Fl(m)24 b(v)g(1)15 b Fn(or)f Fl(34)p Fn(.)-12 741 y Fl(getglobal)23 -b(\(name\))-12 827 y Fn(This)18 b(function)f(retriev)o(es)g(the)g(v)m(alue)h -(of)f(a)f(global)i(v)m(ariable.)26 b(The)17 b(string)g Fl(name)f -Fn(do)q(es)i(not)e(need)i(to)e(b)q(e)i(a)-12 883 y(syn)o(tactically)e(v)m -(alid)h(v)m(ariable)g(name.)-12 1003 y Fl(setfallback)23 b(\(fallbackname,)e -(newfallback\))-12 1089 y Fn(This)f(function)g(sets)f(a)g(new)g(fallbac)o(k)h -(function)g(to)e(the)h(giv)o(en)h(fallbac)o(k.)32 b(It)20 b(returns)f(the)g -(old)h(fallbac)o(k)-12 1145 y(function,)c(or)f(nil)h(in)g(case)f(of)g(error)g -(\(in)o(v)m(alid)i(fallbac)o(k)f(name,)f(or)f Fl(newfallback)g -Fn(is)i(not)e(a)h(function\).)-12 1267 y Fd(6.2)56 b(String)18 -b(Manipulation)-12 1353 y Fn(This)e(library)f(pro)o(vides)h(generic)g -(functions)f(for)f(string)h(manipulation,)h(suc)o(h)g(as)e(\014nding)i(and)f -(extracting)-12 1409 y(substrings.)20 b(When)14 b(indexing)h(a)e(string,)g -(the)h(\014rst)f(c)o(haracter)f(has)i(p)q(osition)g(1.)19 b(See)14 -b(Section)g(7.2)f(for)g(some)-12 1466 y(examples)j(on)f(string)g -(manipulation)i(in)f(Lua.)-12 1586 y Fl(strfind)23 b(\(str,)g(substr,)g -([init,)g([end]]\))-12 1672 y Fn(Receiv)o(es)15 b(t)o(w)o(o)d(string)i -(argumen)o(ts,)e(and)i(returns)f(a)g(n)o(um)o(b)q(er.)20 b(This)14 -b(n)o(um)o(b)q(er)g(indicates)h(the)e(\014rst)g(p)q(osition)-12 -1728 y(where)20 b(the)f(second)h(argumen)o(t)e(app)q(ears)i(in)g(the)f -(\014rst)g(argumen)o(t.)31 b(If)19 b(the)h(second)g(argumen)o(t)e(is)i(not)f -(a)-12 1785 y(substring)i(of)f(the)g(\014rst)g(one,)i(then)e -Fl(strfind)g Fn(returns)g Fk(nil)p Fn(.)36 b(A)21 b(third)g(optional)f(n)o -(umerical)i(argumen)o(t)-12 1841 y(sp)q(eci\014es)e(where)f(to)f(start)f(the) -i(searc)o(h.)29 b(Another)19 b(optional)g(n)o(umerical)g(argumen)o(t)f(sp)q -(eci\014es)i(where)f(to)-12 1897 y(stop)c(it.)-12 2018 y Fl(strlen)23 -b(\(s\))-12 2103 y Fn(Receiv)o(es)17 b(a)e(string)g(and)g(returns)g(its)h -(length.)-12 2223 y Fl(strsub)23 b(\(s,)h(i,)f(j\))-12 2309 -y Fn(Returns)13 b(another)f(string,)h(whic)o(h)g(is)g(a)f(substring)h(of)f -Fl(s)p Fn(,)h(starting)f(at)g Fl(i)g Fn(and)h(runing)g(un)o(til)h -Fl(j)p Fn(.)k(If)13 b Fl(j)g Fn(is)g(absen)o(t)-12 2366 y(or)18 -b(is)g Fk(nil)p Fn(,)i(it)e(is)g(assumed)h(to)e(b)q(e)i(equal)g(to)e(the)h -(length)h(of)e Fl(s)p Fn(.)29 b(P)o(articularly)l(,)19 b(the)f(call)h -Fl(strsub\(s,1,j\))-12 2422 y Fn(returns)e(a)f(pre\014x)i(of)e -Fl(s)h Fn(with)g(length)g Fl(j)p Fn(,)g(while)h(the)f(call)h -Fl(strsub\(s,i\))d Fn(returns)i(a)f(su\016x)h(of)f Fl(s)p Fn(,)h(starting)-12 -2479 y(at)e Fl(i)p Fn(..)-12 2599 y Fl(strlower)23 b(\(s\))-12 -2684 y Fn(Receiv)o(es)16 b(a)d(string)i(and)f(returns)g(a)f(cop)o(y)h(of)g -(that)f(string)h(with)h(all)g(upp)q(er)g(case)f(letters)g(c)o(hanged)g(to)g -(lo)o(w)o(er)-12 2741 y(case.)20 b(All)d(other)d(c)o(haracters)h(are)g(left)g -(unc)o(hanged.)899 2976 y(16)p eop +16 15 bop -42 199 a Fn(The)18 b(function)e Fl(lua_lock)g +Fn(lo)q(c)o(ks)g(the)h(ob)s(ject)f(whic)o(h)h(is)f(on)h(the)g(top)f(of) +h(the)g(stac)o(k,)f(and)h(returns)f(a)h(reference)-42 +256 y(to)e(it.)k(Whenev)o(er)c(the)f(lo)q(c)o(k)o(ed)h(ob)s(ject)f(is)g +(needed,)i(a)e(call)g(to)g Fl(lua_getlocked)f Fn(returns)i(a)f(handle)h +(to)f(it,)g(while)-42 312 y Fl(lua_pushlocked)f Fn(pushes)i(the)f +(handle)g(on)g(the)g(stac)o(k.)19 b(When)c(a)e(lo)q(c)o(k)o(ed)h(ob)s +(ject)g(is)f(no)h(longer)g(needed,)h(it)e(can)-42 369 +y(b)q(e)j(unlo)q(c)o(k)o(ed)g(with)e(a)h(call)f(to)h +Fl(lua_unlock)p Fn(.)-42 512 y Fo(6)67 b(Prede\014ned)24 +b(F)-6 b(unctions)24 b(and)f(Libraries)-42 613 y Fn(The)17 +b(set)g(of)f(prede\014ned)i(functions)e(in)h(Lua)f(is)h(small)d(but)j +(p)q(o)o(w)o(erful.)23 b(Most)15 b(of)h(them)g(pro)o(vide)g(features)g +(that)-42 670 y(allo)o(ws)d(some)g(degree)h(of)g(re\015exivit)o(y)f(in) +h(the)g(language.)19 b(Man)o(y)13 b(of)h(these)h(features)e(cannot)h(b) +q(e)h(sim)o(ulated)d(with)-42 726 y(the)k(rest)f(of)f(the)i(Language)f +(nor)g(with)f(the)i(standard)e(API.)29 783 y(The)g(libraries,)e(on)i +(the)f(other)g(hand,)h(pro)o(vide)g(useful)f(routines)g(that)g(are)h +(implemen)o(ted)d(directly)i(through)-42 839 y(the)g(standard)f(API.)h +(Therefore,)f(they)h(are)f(not)g(necessary)h(to)f(the)g(language,)g +(and)h(are)f(pro)o(vided)h(as)f(separated)-42 896 y(C)j(mo)q(dules.)k +(Curren)o(tly)c(there)g(are)g(three)g(standard)g(libraries:)27 +989 y Fi(\017)22 b Fn(string)14 b(manipulation;)27 1083 +y Fi(\017)22 b Fn(mathematical)11 b(functions)k(\(sin,)g(cos,)f(etc\);) +27 1177 y Fi(\017)22 b Fn(input)15 b(and)h(output.)-42 +1271 y(In)h(order)f(to)g(ha)o(v)o(e)g(access)g(to)g(these)g(libraries,) +f(the)h(host)g(program)e(m)o(ust)h(call)g(the)h(functions)g +Fl(strlib_open)p Fn(,)-42 1327 y Fl(mathlib_open)p Fn(,)e(and)h +Fl(iolib_open)p Fn(,)e(declared)j(in)f Fl(lualib.h)p +Fn(.)-42 1449 y Fd(6.1)56 b(Prede\014ned)18 b(F)-5 b(unctions)-42 +1535 y Fl(dofile)24 b(\(filename\))-42 1621 y Fn(This)16 +b(function)f(receiv)o(es)g(a)g(\014le)h(name,)e(op)q(ens)i(it)f(and)h +(executes)g(its)f(con)o(ten)o(ts)f(as)i(a)f(Lua)h(c)o(h)o(unk.)21 +b(It)15 b(returns)h(1)-42 1677 y(if)f(there)g(are)g(no)g(errors,)g +Fk(nil)f Fn(otherwise.)-42 1797 y Fl(dostring)23 b(\(string\))-42 +1883 y Fn(This)e(function)h(executes)g(a)f(giv)o(en)g(string)f(as)h(a)g +(Lua)h(c)o(h)o(unk.)38 b(It)22 b(returns)f(1)g(if)g(there)g(are)g(no)h +(errors,)f Fk(nil)-42 1939 y Fn(otherwise.)-42 2059 y +Fl(next)j(\(table,)f(index\))-42 2145 y Fn(This)18 b(function)f(allo)o +(ws)f(a)i(program)d(to)i(tra)o(v)o(erse)g(all)g(\014elds)h(of)f(a)g +(table.)27 b(Its)18 b(\014rst)f(argumen)o(t)f(is)i(a)f(table)g(and)-42 +2202 y(its)e(second)i(argumen)o(t)c(is)j(an)f(index)h(in)g(this)f +(table.)21 b(It)15 b(returns)h(the)g(next)f(index)h(of)g(the)f(table)h +(and)f(the)h(v)m(alue)-42 2258 y(asso)q(ciated)g(with)f(the)h(index.)23 +b(When)17 b(called)e(with)h Fk(nil)f Fn(as)g(its)h(second)g(argumen)o +(t,)e(the)j(function)e(returns)h(the)-42 2315 y(\014rst)g(index)g(of)g +(the)g(table)g(\(and)f(its)h(asso)q(ciated)f(v)m(alue\).)22 +b(When)17 b(called)e(with)h(the)g(last)f(index,)h(or)f(with)h +Fk(nil)f Fn(in)-42 2371 y(an)h(empt)o(y)e(table,)g(it)g(returns)h +Fk(nil)p Fn(.)29 2428 y(In)i(Lua)f(there)g(is)g(no)g(declaration)f(of)h +(\014elds;)g(seman)o(tically)l(,)d(there)j(is)g(no)g(di\013erence)g(b)q +(et)o(w)o(een)h(a)e(\014eld)i(not)-42 2484 y(presen)o(t)g(in)f(a)g +(table)f(or)h(a)g(\014eld)h(with)e(v)m(alue)i Fk(nil)p +Fn(.)22 b(Therefore,)16 b(the)g(function)g(only)g(considers)g(\014elds) +h(with)e(non)-42 2540 y(nil)g(v)m(alues.)20 b(The)c(order)f(the)g +(indices)g(are)g(en)o(umerated)f(is)h(not)g(sp)q(eci\014ed,)h +Fm(even)f(for)i(numeric)f(indic)n(es)p Fn(.)29 2597 y(See)g(Section)f +(7.1)f(for)h(an)g(example)f(of)h(the)g(use)h(of)e(this)h(function.)911 +2748 y(16)p eop %%Page: 17 17 -bop -12 160 a Fl(strupper)23 b(\(s\))-12 245 y Fn(Receiv)o(es)16 -b(a)d(string)i(and)f(returns)g(a)f(cop)o(y)h(of)g(that)f(string)h(with)h(all) -g(lo)o(w)o(er)e(case)h(letters)h(c)o(hanged)f(to)f(upp)q(er)-12 -302 y(case.)20 b(All)d(other)d(c)o(haracters)h(are)g(left)g(unc)o(hanged.)-12 -424 y Fd(6.3)56 b(Mathematical)16 b(F)-5 b(unctions)-12 509 -y Fn(This)20 b(library)f(is)h(an)f(in)o(terface)g(to)f(some)h(functions)h(of) -e(the)h(standard)g(C)f(math)h(library)l(.)32 b(Moreo)o(v)o(er,)18 -b(it)-12 566 y(registers)d(a)f(fallbac)o(k)h(for)f(the)h(binary)g(op)q -(erator)f Fl(^)h Fn(whic)o(h,)g(when)g(applied)i(to)d(n)o(um)o(b)q(ers)h -Fl(x^y)p Fn(,)e(returns)i Fc(x)1821 549 y Fb(y)1842 566 y Fn(.)59 -622 y(The)g(library)h(pro)o(vides)g(the)f(follo)o(wing)h(functions:)-12 -716 y Fl(abs)24 b(acos)f(asin)g(atan)h(ceil)f(cos)g(floor)h(log)f(log10)-12 -773 y(max)h(min)47 b(mod)g(sin)h(sqrt)23 b(tan)-12 866 y Fn(Most)16 -b(of)g(them)h(are)g(only)g(in)o(terfaces)g(to)f(the)h(homon)o(ymous)f -(functions)i(in)g(the)f(C)f(library)l(,)i(except)f(that,)-12 -923 y(for)e(the)g(trigonometric)g(functions,)h(all)g(angles)f(are)g -(expressed)h(in)g(degrees.)59 979 y(The)d(function)g Fl(max)g -Fn(returns)f(the)h(maxim)o(um)g(v)m(alue)h(in)f(a)g(list)g(of)g(n)o(umeric)g -(argumen)o(ts.)19 b(Similarly)l(,)c Fl(min)-12 1036 y Fn(computes)g(the)h -(minim)o(um.)21 b(Both)15 b(can)g(b)q(e)h(used)g(with)f(an)g(unlimited)j(n)o -(um)o(b)q(er)d(of)g(argumen)o(ts.)59 1092 y(The)g(function)h -Fl(mod)f Fn(is)h(equiv)m(alen)o(t)h(to)d(the)h Fl(\045)g Fn(op)q(erator)g(in) -h(C.)-12 1214 y Fd(6.4)56 b(I/O)18 b(F)-5 b(acilities)-12 1300 -y Fn(All)16 b(I/O)g(op)q(erations)f(in)h(Lua)f(are)g(done)g(o)o(v)o(er)f(t)o -(w)o(o)g Fm(curr)n(ent)h Fn(\014les,)g(one)h(for)e(reading)i(and)f(one)g(for) -f(writing.)-12 1356 y(Initially)l(,)k(the)d(curren)o(t)g(input)h(\014le)h(is) -e Fl(stdin)p Fn(,)f(and)i(the)f(curren)o(t)g(output)g(\014le)h(is)g -Fl(stdout)p Fn(.)59 1413 y(Unless)g(otherwised)g(stated,)e(all)i(I/O)g -(functions)g(return)f(1)g(on)g(success)h(and)f Fk(nil)h Fn(on)f(failure.)-12 -1533 y Fl(readfrom)23 b(\(filename\))-12 1619 y Fn(This)17 -b(function)g(op)q(ens)g(a)f(\014le)h(named)g Fl(filename)e -Fn(and)i(sets)f(it)g(as)g(the)g Fm(curr)n(ent)h Fn(input)g(\014le.)24 -b(When)17 b(called)-12 1675 y(without)e(parameters,)f(this)i(function)g -(restores)e Fl(stdin)h Fn(as)g(the)g(curren)o(t)g(input)h(\014le.)-12 -1795 y Fl(writeto)23 b(\(filename\))-12 1881 y Fn(This)16 b(function)g(op)q -(ens)g(a)f(\014le)h(named)f Fl(filename)f Fn(and)i(sets)e(it)i(as)f(the)g -Fm(curr)n(ent)g Fn(output)g(\014le.)21 b(Notice)15 b(that,)-12 -1937 y(if)21 b(the)g(\014le)g(already)g(exists,)h(it)f(is)g(completely)h -(erased)e(with)h(this)g(op)q(eration.)36 b(When)21 b(called)h(without)-12 -1994 y(parameters,)14 b(this)i(function)g(restores)e Fl(stdout)h -Fn(as)f(the)i(curren)o(t)f(output)g(\014le.)-12 2114 y Fl(appendto)23 -b(\(filename\))-12 2200 y Fn(This)18 b(function)g(op)q(ens)f(a)g(\014le)h -(named)f Fl(filename)f Fn(and)h(sets)g(it)g(as)g(the)g Fm(curr)n(ent)g -Fn(output)f(\014le.)27 b(Unlik)o(e)18 b(the)-12 2256 y Fl(writeto)d -Fn(op)q(eration,)h(this)g(function)g(do)q(es)g(not)g(erase)f(an)o(y)h -(previous)g(con)o(ten)o(t)f(of)g(the)h(\014le.)23 b(When)16 -b(called)-12 2313 y(without)j(parameters,)g(this)h(function)g(restores)f -Fl(stdout)f Fn(as)h(the)g(curren)o(t)g(output)h(\014le.)33 -b(This)19 b(function)-12 2369 y(returns)c(2)g(if)h(the)f(\014le)h(already)g -(exists,)f(1)g(if)g(it)h(creates)f(a)g(new)g(\014le,)h(and)f -Fk(nil)i Fn(on)e(failure.)-12 2489 y Fl(read)24 b(\([format]\))-12 -2575 y Fn(This)12 b(function)g(returns)e(a)h(v)m(alue)h(read)f(from)f(the)h -(curren)o(t)g(input.)20 b(An)11 b(optional)g(string)g(argumen)o(t)f(sp)q -(eci\014es)-12 2631 y(the)15 b(w)o(a)o(y)g(the)g(input)h(is)g(in)o -(terpreted.)59 2688 y(Without)j(a)g(format)e(argumen)o(t,)i -Fl(read)g Fn(\014rst)g(skips)h(blanks,)g(tabs)f(and)g(newlines.)34 -b(Then)20 b(it)f(c)o(hec)o(ks)-12 2744 y(whether)g(the)h(curren)o(t)e(c)o -(haracter)h(is)g Fl(")g Fn(or)g Fl(')p Fn(.)31 b(If)19 b(so,)g(it)h(reads)f -(a)f(string)h(up)h(to)e(the)h(ending)i(quotation)-12 2801 y(mark,)14 -b(and)h(returns)f(this)h(string,)g(without)f(the)h(quotation)f(marks.)19 -b(Otherwise)d(it)f(reads)f(up)h(to)g(a)f(blank,)-12 2857 y(tab)h(or)g -(newline.)899 2976 y(17)p eop +17 16 bop -42 199 a Fl(nextvar)23 b(\(name\))-42 285 +y Fn(This)18 b(function)g(is)g(similar)d(to)i(the)i(function)f +Fl(next)p Fn(,)f(but)i(it)e(iterates)g(o)o(v)o(er)g(the)h(global)f(v)m +(ariables.)28 b(Its)18 b(single)-42 342 y(argumen)o(t)c(is)h(the)h +(name)e(of)h(a)g(global)f(v)m(ariable,)g(or)h Fk(nil)g +Fn(to)g(get)g(a)g(\014rst)g(name.)k(Similarly)13 b(to)h +Fl(next)p Fn(,)h(it)g(returns)-42 398 y(the)j(name)e(of)g(another)h(v)m +(ariable)f(and)h(its)f(v)m(alue,)i(or)e Fk(nil)g Fn(if)g(there)h(are)g +(no)g(more)e(v)m(ariables.)25 b(See)18 b(Section)e(7.1)-42 +454 y(for)f(an)g(example)f(of)h(the)g(use)h(of)f(this)f(function.)-42 +574 y Fl(print)24 b(\(e1,)f(e2,)g(...\))-42 660 y Fn(This)18 +b(function)g(receiv)o(es)g(an)o(y)g(n)o(um)o(b)q(er)g(of)f(argumen)o +(ts,)g(and)h(prin)o(ts)g(their)f(v)m(alues)i(in)f(a)g(reasonable)f +(format.)-42 717 y(Eac)o(h)i(v)m(alue)g(is)f(prin)o(ted)h(in)f(a)h(new) +g(line.)30 b(This)18 b(function)h(is)f(not)g(in)o(tended)h(for)f +(formatted)f(output,)i(but)g(as)-42 773 y(a)h(quic)o(k)f(w)o(a)o(y)g +(to)g(sho)o(w)g(a)g(v)m(alue,)i(for)e(instance)g(for)g(error)g +(messages)f(or)h(debugging.)34 b(See)20 b(Section)f(6.4)g(for)-42 +830 y(functions)c(for)g(formatted)e(output.)-42 950 y +Fl(tonumber)23 b(\(e\))-42 1036 y Fn(This)13 b(function)f(receiv)o(es)g +(one)h(argumen)o(t,)e(and)h(tries)g(to)g(con)o(v)o(ert)f(it)h(to)g(a)g +(n)o(um)o(b)q(er.)18 b(If)13 b(the)g(argumen)o(t)d(is)i(already)-42 +1092 y(a)j(n)o(um)o(b)q(er)g(or)g(a)g(string)f(con)o(v)o(ertible)g(to)h +(a)g(n)o(um)o(b)q(er)f(\(see)h(Section)h(4.2\),)d(it)i(returns)g(that)f +(n)o(um)o(b)q(er;)h(otherwise,)-42 1148 y(it)g(returns)g +Fk(nil)p Fn(.)-42 1269 y Fl(type)24 b(\(v\))-42 1354 +y Fn(This)13 b(function)h(allo)o(ws)d(Lua)j(to)e(test)h(the)g(t)o(yp)q +(e)h(of)f(a)g(v)m(alue.)19 b(It)13 b(receiv)o(es)h(one)f(argumen)o(t,)f +(and)h(returns)g(its)g(t)o(yp)q(e,)-42 1411 y(co)q(ded)21 +b(as)e(a)g(string.)31 b(The)19 b(p)q(ossible)g(results)g(of)g(this)g +(function)g(are)g Fl("nil")g Fn(\(a)f(string,)h(not)g(the)h(v)m(alue)f +Fk(nil)p Fn(\),)-42 1467 y Fl("number")p Fn(,)g Fl("string")p +Fn(,)g Fl("table")p Fn(,)h Fl("function")e Fn(\(returned)h(b)q(oth)h +(for)f(C)g(functions)g(and)h(Lua)f(functions\),)-42 1524 +y(and)d Fl("userdata")p Fn(.)29 1580 y(Besides)f(this)f(string,)f(the)i +(function)f(returns)h(a)f(second)h(result,)f(whic)o(h)g(is)g(the)h +Fm(tag)g Fn(of)f(the)g(v)m(alue.)20 b(This)14 b(tag)-42 +1637 y(can)g(b)q(e)h(used)f(to)f(distinguish)g(b)q(et)o(w)o(een)g(user) +h(data)f(with)g(di\013eren)o(t)g(tags,)g(and)h(b)q(et)o(w)o(een)f(C)h +(functions)f(and)h(Lua)-42 1693 y(functions.)-42 1813 +y Fl(error)24 b(\(message\))-42 1899 y Fn(This)e(function)f(issues)g +(an)h(error)f(message)f(and)h(terminates)f(the)h(last)g(called)g +(function)g(from)f(the)i(library)-42 1955 y(\()p Fl(lua_dofile)p +Fn(,)14 b Fl(lua_dostring)p Fn(,)f Fc(:)8 b(:)g(:)d Fn(\).)20 +b(It)15 b(nev)o(er)g(returns.)-42 2075 y Fl(setglobal)23 +b(\(name,)g(value\))-42 2161 y Fn(This)18 b(function)h(assigns)e(the)i +(giv)o(en)f(v)m(alue)g(to)g(a)g(global)f(v)m(ariable.)29 +b(The)19 b(string)e Fl(name)h Fn(do)q(es)h(not)f(need)h(to)f(b)q(e)-42 +2218 y(a)f(syn)o(tactically)d(v)m(alid)i(v)m(ariable)g(name.)22 +b(Therefore,)17 b(this)f(function)g(can)g(set)h(global)e(v)m(ariables)g +(with)h(strange)-42 2274 y(names)f(lik)o(e)f Fl(m)24 +b(v)f(1)15 b Fn(or)g Fl(34)p Fn(.)-42 2394 y Fl(getglobal)23 +b(\(name\))-42 2480 y Fn(This)e(function)g(retriev)o(es)g(the)g(v)m +(alue)h(of)f(a)g(global)f(v)m(ariable.)37 b(The)22 b(string)e +Fl(name)h Fn(do)q(es)g(not)g(need)h(to)f(b)q(e)h(a)-42 +2536 y(syn)o(tactically)14 b(v)m(alid)g(v)m(ariable)h(name.)911 +2748 y(17)p eop %%Page: 18 18 -bop 59 160 a Fn(The)15 b(format)f(string)h(can)h(ha)o(v)o(e)e(the)i(follo)o -(wing)g(format:)60 253 y Fl(?[n])-12 347 y Fn(where)g Fl(?)f -Fn(can)g(b)q(e:)-12 441 y Fk('s')h(or)h('S')22 b Fn(to)15 b(read)g(a)g -(string;)-12 535 y Fk('f)5 b(')17 b(or)g('F')k Fn(to)15 b(read)g(a)g(real)g -(n)o(um)o(b)q(er;)-12 629 y Fk('i')i(or)g('I')22 b Fn(to)14 -b(read)i(an)f(in)o(teger.)-12 723 y(The)g(optional)g Fl(n)f -Fn(is)h(a)g(n)o(um)o(b)q(er)f(whic)o(h)i(sp)q(eci\014es)g(ho)o(w)e(man)o(y)g -(c)o(haracters)g(m)o(ust)g(b)q(e)h(read)g(to)f(comp)q(ose)g(the)-12 -779 y(input)i(v)m(alue.)-12 899 y Fl(write)23 b(\(value,)g([format]\))-12 -985 y Fn(This)16 b(function)g(writes)f(the)h(v)m(alue)g(of)f(its)g(\014rst)g -(argumen)o(t)g(to)f(the)i(curren)o(t)f(output.)k(An)d(optional)g(second)-12 -1041 y(argumen)o(t)g(sp)q(eci\014es)j(the)e(format)e(to)i(b)q(e)g(used.)26 -b(This)17 b(format)e(is)j(giv)o(en)f(as)g(a)f(string,)h(comp)q(osed)g(of)g -(four)-12 1098 y(parts.)i(The)d(\014rst)f(part)f(is)i(the)f(only)h(not)f -(optional,)g(and)h(m)o(ust)e(b)q(e)i(one)f(of)g(the)g(follo)o(wing)h(c)o -(haracters:)-12 1192 y Fk('s')g(or)h('S')22 b Fn(to)15 b(write)g(strings;)-12 -1285 y Fk('f)5 b(')17 b(or)g('F')k Fn(to)15 b(write)g(\015oats;)-12 -1379 y Fk('i')i(or)g('I')22 b Fn(to)14 b(write)i(in)o(tegers.)-12 -1473 y(These)g(c)o(haracters)e(can)i(b)q(e)f(follo)o(w)o(ed)h(b)o(y)60 -1567 y Fl([?][m][.n])-12 1661 y Fn(where:)-12 1754 y Fl(?)23 -b Fn(indicates)16 b(justi\014cation)g(inside)h(the)f(\014eld.)130 -1848 y(')p Fl(<)p Fn(')22 b(righ)o(t)15 b(justi\014cation;)130 -1921 y(')p Fl(>)p Fn(')22 b(left)15 b(justi\014cation;)130 -1994 y(')p Fl(|)p Fn(')22 b(cen)o(ter)15 b(justi\014cation.)-12 -2088 y Fl(m)23 b Fn(Indicates)16 b(the)f(\014eld)i(size)f(in)g(c)o -(haracters.)-12 2182 y Fl(.n)23 b Fn(F)l(or)16 b(reals,)i(indicates)g(the)f -(n)o(um)o(b)q(er)h(of)e(digital)j(places.)26 b(F)l(or)16 b(in)o(tegers,)i(it) -f(is)h(the)f(minim)o(um)h(n)o(um)o(b)q(er)102 2238 y(of)d(digits.)20 -b(This)c(option)f(has)h(no)f(meaning)g(for)g(strings.)59 2332 -y(When)e(called)i(without)e(a)g(format)f(string,)h(this)h(function)g(writes)f -(n)o(um)o(b)q(ers)g(using)h(the)f Fl(\045g)g Fn(format)f(and)-12 -2389 y(strings)j(with)h Fl(\045s)p Fn(.)-12 2509 y Fl(debug)23 -b(\(\))-12 2595 y Fn(This)e(function,)g(when)g(called,)h(rep)q(eatedly)f -(presen)o(ts)f(a)g(prompt)f Fl(lua_debug>)42 b Fn(in)21 b(the)f(error)f -(output)-12 2651 y(stream)h(\()p Fl(stderr)p Fn(\),)f(reads)i(a)f(line)i -(from)d(the)i(standard)f(input,)i(and)e(executes)h(\(\\dostring"\))f(the)g -(line.)-12 2708 y(The)e(lo)q(op)g(ends)f(when)h(the)g(user)f(t)o(yp)q(es)g -Fl(cont)g Fn(to)g(the)g(prompt.)26 b(This)18 b(function)g(then)g(returns)f -(and)g(the)-12 2764 y(execution)f(of)f(the)h(program)e(con)o(tin)o(ues.)899 -2976 y(18)p eop +18 17 bop -42 199 a Fl(setfallback)23 b(\(fallbackname,)f +(newfallback\))-42 285 y Fn(This)13 b(function)f(sets)g(a)h(new)f +(fallbac)o(k)g(function)g(to)g(the)h(giv)o(en)f(fallbac)o(k.)18 +b(It)12 b(returns)h(the)g(old)f(fallbac)o(k)f(function.)-42 +407 y Fd(6.2)56 b(String)19 b(Manipulation)-42 493 y +Fn(This)j(library)e(pro)o(vides)i(generic)f(functions)h(for)f(string)g +(manipulation,)f(suc)o(h)i(as)g(\014nding)g(and)g(extracting)-42 +549 y(substrings.)29 b(When)19 b(indexing)f(a)g(string,)f(the)i +(\014rst)f(c)o(haracter)f(has)h(p)q(osition)g(1.)29 b(See)19 +b(Section)f(7.2)f(for)h(some)-42 606 y(examples)c(on)i(string)e +(manipulation)f(in)i(Lua.)-42 726 y Fl(strfind)23 b(\(str,)h(substr,)e +([init,)i([end]]\))-42 811 y Fn(Receiv)o(es)c(t)o(w)o(o)e(string)h +(argumen)o(ts,)f(and)h(returns)g(a)g(n)o(um)o(b)q(er.)32 +b(This)19 b(n)o(um)o(b)q(er)f(indicates)h(the)g(\014rst)g(p)q(osition) +-42 868 y(where)13 b(the)f(second)h(argumen)o(t)e(app)q(ears)h(in)g +(the)g(\014rst)g(argumen)o(t.)17 b(If)c(the)f(second)h(argumen)o(t)d +(is)i(not)g(a)g(substring)-42 924 y(of)j(the)g(\014rst)g(one,)f(then)i +Fl(strfind)e Fn(returns)h Fk(nil)p Fn(.)j(A)e(third)e(optional)g(n)o +(umerical)f(argumen)o(t)g(sp)q(eci\014es)j(where)f(to)-42 +981 y(start)f(the)i(searc)o(h.)j(Another)d(optional)d(n)o(umerical)h +(argumen)o(t)f(sp)q(eci\014es)j(where)g(to)e(stop)h(it.)-42 +1101 y Fl(strlen)24 b(\(s\))-42 1187 y Fn(Receiv)o(es)16 +b(a)f(string)f(and)i(returns)f(its)f(length.)-42 1307 +y Fl(strsub)24 b(\(s,)f(i,)h([j]\))-42 1392 y Fn(Returns)17 +b(another)f(string,)f(whic)o(h)h(is)g(a)g(substring)g(of)g +Fl(s)p Fn(,)g(starting)e(at)i Fl(i)g Fn(and)g(runing)g(un)o(til)g +Fl(j)p Fn(.)23 b(If)16 b Fl(j)g Fn(is)g(absen)o(t,)-42 +1449 y(it)f(is)g(assumed)g(to)f(b)q(e)i(equal)g(to)e(the)i(length)f(of) +g Fl(s)p Fn(.)20 b(P)o(articularly)l(,)13 b(the)j(call)e +Fl(strsub\(s,1,j\))g Fn(returns)h(a)g(pre\014x)-42 1505 +y(of)g Fl(s)g Fn(with)g(length)g Fl(j)p Fn(,)f(while)h(the)g(call)g +Fl(strsub\(s,i\))e Fn(returns)i(a)g(su\016x)g(of)g Fl(s)p +Fn(,)g(starting)e(at)i Fl(i)p Fn(.)-42 1625 y Fl(strlower)23 +b(\(s\))-42 1711 y Fn(Receiv)o(es)14 b(a)e(string)g(and)h(returns)f(a)h +(cop)o(y)f(of)h(that)f(string)f(with)h(all)g(upp)q(er)i(case)f(letters) +e(c)o(hanged)i(to)f(lo)o(w)o(er)g(case.)-42 1768 y(All)j(other)g(c)o +(haracters)f(are)h(left)g(unc)o(hanged.)-42 1888 y Fl(strupper)23 +b(\(s\))-42 1974 y Fn(Receiv)o(es)14 b(a)e(string)g(and)h(returns)f(a)h +(cop)o(y)f(of)h(that)f(string)f(with)h(all)g(lo)o(w)o(er)f(case)i +(letters)f(c)o(hanged)h(to)f(upp)q(er)i(case.)-42 2030 +y(All)h(other)g(c)o(haracters)f(are)h(left)g(unc)o(hanged.)-42 +2150 y Fl(ascii)24 b(\(s,)f([i]\))-42 2236 y Fn(Returns)16 +b(the)f(ascii)g(co)q(de)h(of)e(the)i(c)o(haracter)e Fl(s[i])p +Fn(.)19 b(If)d Fl(i)f Fn(is)g(absen)o(t,)f(it)h(is)f(assumed)h(to)f(b)q +(e)i(1.)-42 2356 y Fl(int2str)23 b(\()p Fi(f)p Fl(i)p +Fi(g)p Fl(\))-42 2442 y Fn(Receiv)o(es)e(0)f(or)g(more)f(n)o(um)o(b)q +(ers.)34 b(Returns)21 b(a)f(string)f(with)h(length)g(equal)g(to)g(the)g +(n)o(um)o(b)q(er)g(of)g(argumen)o(ts,)-42 2498 y(wherein)c(eac)o(h)f(c) +o(haracter)g(has)g(ascii)f(v)m(alue)h(equal)g(to)g(its)f(corresp)q +(onden)o(t)i(argumen)o(t.)911 2748 y(18)p eop %%Page: 19 19 -bop -12 160 a Fo(7)69 b(Some)21 b(Examples)-12 261 y Fn(This)f(section)h(giv) -o(es)e(examples)i(sho)o(wing)e(some)h(features)f(of)g(Lua.)34 -b(It)19 b(do)q(es)h(not)g(in)o(tend)g(to)f(co)o(v)o(er)g(the)-12 -318 y(whole)d(language,)f(but)g(only)h(to)f(illustrate)h(some)f(in)o -(teresting)h(uses)f(of)g(the)g(system.)-12 437 y Fd(7.1)56 -b(The)18 b(F)-5 b(unctions)19 b Fa(next)e Fd(and)j Fa(nextvar)-12 -523 y Fn(This)c(example)g(sho)o(ws)f(ho)o(w)f(to)h(use)g(the)h(function)g -Fl(next)e Fn(to)h(iterate)g(o)o(v)o(er)f(the)i(\014elds)g(of)f(a)g(table.)-12 -605 y Fl(function)23 b(f)h(\(t\))357 b(--)24 b(t)g(is)f(a)h(table)36 -661 y(local)f(i,)h(v)f(=)h(next\(t,)f(nil\))47 b(--)24 b(i)g(is)f(an)h(index) -f(of)g(t,)h(v)g(=)g(t[i])36 718 y(while)f(i)h(do)84 774 y(...)524 -b(--)24 b(do)f(something)g(with)g(i)h(and)g(v)84 831 y(i,)f(v)h(=)g(next\(t,) -f(i\))190 b(--)24 b(get)f(next)h(index)36 887 y(end)-12 944 -y(end)59 1026 y Fn(The)13 b(next)g(example)h(prin)o(ts)f(the)g(names)g(of)f -(all)i(global)g(v)m(ariables)g(in)g(the)f(system)g(with)g(non)g(nil)i(v)m -(alues:)-12 1108 y Fl(function)23 b(printGlobalVariables)e(\(\))36 -1164 y(local)i(i,)h(v)f(=)h(nextvar\(nil\))36 1221 y(while)f(i)h(do)84 -1277 y(print\(i\))84 1334 y(i,)f(v)h(=)g(nextvar\(i\))36 1390 -y(end)-12 1447 y(end)-12 1566 y Fd(7.2)56 b(String)18 b(Manipulation)-12 -1652 y Fn(The)e(\014rst)e(example)i(is)g(a)f(function)h(to)f(trim)g(extra)f -(blanks)i(at)f(the)g(b)q(eginning)i(and)f(end)g(of)e(a)h(string.)-12 -1734 y Fl(function)23 b(trim\(s\))36 1791 y(local)g(l)h(=)g(1)36 -1847 y(while)f(strsub\(s,l,l\))f(==)i(')f(')h(do)84 1904 y(l)f(=)h(l+1)36 -1960 y(end)36 2017 y(local)f(r)h(=)g(strlen\(s\))36 2073 y(while)f -(strsub\(s,r,r\))f(==)i(')f(')h(do)84 2129 y(r)f(=)h(r-1)36 -2186 y(end)36 2242 y(return)f(strsub\(s,l,r\))-12 2299 y(end)59 -2381 y Fn(The)15 b(second)h(example)g(sho)o(ws)e(a)h(function)h(that)f -(eliminates)i(all)f(blanks)g(of)f(a)f(string.)-12 2463 y Fl(function)23 -b(remove_blanks)f(\(s\))36 2520 y(local)h(b)h(=)g(strfind\(s,)e(')i('\))36 -2576 y(while)f(b)h(do)84 2632 y(s)f(=)h(strsub\(s,)f(1,)g(b-1\))h(..)f -(strsub\(s,)g(b+1\))84 2689 y(b)g(=)h(strfind\(s,)f(')g('\))36 -2745 y(end)36 2802 y(return)g(s)-12 2858 y(end)899 2976 y Fn(19)p -eop +19 18 bop -42 199 a Fd(6.3)56 b(Mathematical)20 b(F)-5 +b(unctions)-42 285 y Fn(This)13 b(library)f(is)h(an)g(in)o(terface)f +(to)h(some)e(functions)i(of)g(the)g(standard)g(C)g(math)e(library)l(.) +19 b(Moreo)o(v)o(er,)11 b(it)i(registers)-42 342 y(a)i(fallbac)o(k)f +(for)h(the)g(binary)g(op)q(erator)f Fl(^)h Fn(whic)o(h,)g(when)h +(applied)f(to)f(n)o(um)o(b)q(ers)h Fl(x^y)p Fn(,)f(returns)h +Fc(x)1619 325 y Fb(y)1639 342 y Fn(.)29 398 y(The)g(library)f(pro)o +(vides)h(the)g(follo)o(wing)e(functions:)-42 492 y Fl(abs)24 +b(acos)f(asin)h(atan)f(atan2)g(ceil)g(cos)h(floor)-42 +548 y(log)g(log10)f(max)h(min)47 b(mod)g(sin)h(sqrt)23 +b(tan)-42 642 y Fn(Most)17 b(of)g(them)g(are)g(only)g(in)o(terfaces)g +(to)g(the)g(homon)o(ymous)e(functions)j(in)f(the)h(C)f(library)l(,)g +(except)h(that,)f(for)-42 699 y(the)f(trigonometri)o(c)d(functions,)h +(all)h(angles)f(are)h(expressed)h(in)f(degrees.)29 755 +y(The)d(function)f Fl(max)g Fn(returns)g(the)g(maxim)o(um)d(v)m(alue)j +(of)g(its)f(n)o(umeric)h(argumen)o(ts.)16 b(Similarly)l(,)9 +b Fl(min)i Fn(computes)-42 811 y(the)16 b(minim)o(um)o(.)h(Both)e(can)g +(b)q(e)h(used)g(with)e(an)h(unlimited)f(n)o(um)o(b)q(er)g(of)h(argumen) +o(ts.)29 868 y(The)g(function)h Fl(mod)e Fn(is)h(equiv)m(alen)o(t)g(to) +f(the)i Fl(\045)f Fn(op)q(erator)f(in)h(C.)-42 990 y +Fd(6.4)56 b(I/O)19 b(F)-5 b(acilities)-42 1075 y Fn(All)20 +b(I/O)g(op)q(erations)f(in)h(Lua)g(are)f(done)i(o)o(v)o(er)e(t)o(w)o(o) +f Fm(curr)n(ent)i Fn(\014les,)g(one)g(for)g(reading)f(and)h(one)g(for)f +(writing.)-42 1132 y(Initially)l(,)14 b(the)h(curren)o(t)g(input)h +(\014le)f(is)g Fl(stdin)p Fn(,)f(and)h(the)g(curren)o(t)g(output)g +(\014le)h(is)e Fl(stdout)p Fn(.)29 1188 y(Unless)h(otherwise)g(stated,) +f(all)g(I/O)i(functions)f(return)g(1)g(on)g(success)h(and)f +Fk(nil)f Fn(on)h(failure.)-42 1308 y Fl(readfrom)23 b(\(filename\))-42 +1394 y Fn(This)e(function)g(op)q(ens)g(a)g(\014le)g(named)f +Fl(filename)g Fn(and)h(sets)g(it)f(as)h(the)g Fm(curr)n(ent)f +Fn(input)h(\014le.)38 b(When)21 b(called)-42 1451 y(without)c +(parameters,)e(this)i(function)g(closes)f(the)i(curren)o(t)f(input)g +(\014le,)g(and)h(restores)e Fl(stdin)h Fn(as)f(the)i(curren)o(t)-42 +1507 y(input)e(\014le.)29 1564 y Fm(System)f(dep)n(endent:)k +Fn(if)13 b Fl(filename)h Fn(starts)e(with)i(a)g Fl(|)p +Fn(,)g(then)g(a)g(pip)q(ed)h(input)g(is)e(op)q(en,)i(via)e(function)i +Fl(popen)p Fn(.)-42 1684 y Fl(writeto)23 b(\(filename\))-42 +1769 y Fn(This)13 b(function)g(op)q(ens)h(a)e(\014le)i(named)e +Fl(filename)g Fn(and)h(sets)g(it)f(as)h(the)g Fm(curr)n(ent)g +Fn(output)g(\014le.)19 b(Notice)12 b(that,)h(if)f(the)-42 +1826 y(\014le)19 b(already)e(exists,)g(it)h(is)f(completely)f(erased)j +(with)e(this)g(op)q(eration.)28 b(When)18 b(called)g(without)f +(parameters,)-42 1882 y(this)e(function)g(closes)g(the)g(curren)o(t)g +(output)g(\014le,)g(and)h(restores)e Fl(stdout)g Fn(as)h(the)g(curren)o +(t)g(output)g(\014le.)29 1939 y Fm(System)e(dep)n(endent:)18 +b Fn(if)12 b Fl(filename)f Fn(starts)g(with)h(a)g Fl(|)p +Fn(,)g(then)h(a)f(pip)q(ed)h(output)g(is)e(op)q(en,)j(via)d(function)i +Fl(popen)p Fn(.)-42 2059 y Fl(appendto)23 b(\(filename\))-42 +2145 y Fn(This)11 b(function)g(op)q(ens)h(a)f(\014le)g(named)f +Fl(filename)g Fn(and)i(sets)f(it)f(as)h(the)g Fm(curr)n(ent)g +Fn(output)g(\014le.)19 b(Unlik)o(e)10 b(the)h Fl(writeto)-42 +2201 y Fn(op)q(eration,)16 b(this)f(function)h(do)q(es)h(not)f(erase)f +(an)o(y)h(previous)g(con)o(ten)o(t)g(of)f(the)i(\014le.)22 +b(This)16 b(function)g(returns)g(2)g(if)-42 2258 y(the)g(\014le)f +(already)f(exists,)h(1)f(if)h(it)g(creates)g(a)f(new)i(\014le,)f(and)g +Fk(nil)f Fn(on)h(failure.)-42 2378 y Fl(remove)24 b(\(filename\))-42 +2463 y Fn(This)15 b(function)g(deletes)h(the)f(\014le)g(with)g(the)g +(giv)o(en)g(name.)911 2748 y(19)p eop %%Page: 20 20 -bop -12 160 a Fd(7.3)56 b(P)n(ersistence)-12 245 y Fn(Because)19 -b(of)f(its)h(re\015exiv)o(e)g(facilities,)i(p)q(ersistence)e(in)g(Lua)g(can)g -(b)q(e)f(ac)o(hiev)o(ed)i(with)e(Lua.)30 b(This)19 b(section)-12 -302 y(sho)o(ws)c(some)h(w)o(a)o(ys)e(to)i(store)f(and)h(retriev)o(e)f(v)m -(alues)i(in)g(Lua,)f(using)g(a)g(text)f(\014le)i(written)f(in)g(the)g -(language)-12 358 y(itself)g(as)f(the)g(storage)f(media.)59 -415 y(T)l(o)h(store)f(a)h(single)i(v)m(alue)f(with)g(a)e(name,)h(the)h(follo) -o(wing)f(co)q(de)h(is)g(enough:)-12 509 y Fl(function)23 b(store)g(\(name,)g -(value\))36 565 y(write\('\\n')f(..)i(name)f(..)h('='\))36 -622 y(write_value\(value\))-12 678 y(end)-12 784 y(function)f(write_value)f -(\(value\))36 841 y(local)h(t)h(=)g(type\(value\))131 897 y(if)g(t)g(==)f -('nil')95 b(then)23 b(write\('nil'\))36 954 y(elseif)g(t)h(==)f('number')g -(then)g(write\(value\))36 1010 y(elseif)g(t)h(==)f('string')g(then)g -(write\('"')g(..)h(value)f(..)g('"'\))36 1067 y(end)-12 1123 -y(end)-12 1229 y Fn(In)16 b(order)f(to)g(restore)f(this)i(v)m(alue,)g(a)f -Fl(lua_dofile)e Fn(su\016ces.)59 1286 y(Storing)k(tables)g(is)g(a)g(little)h -(more)f(complex.)25 b(Assuming)18 b(that)e(the)h(table)h(is)f(a)g(tree,)f -(and)h(all)h(indices)-12 1342 y(are)e(iden)o(ti\014ers)i(\(that)d(is,)h(the)h -(tables)f(are)g(b)q(eing)i(used)e(as)g(records\),)g(its)g(v)m(alue)i(can)e(b) -q(e)h(written)f(directly)-12 1399 y(with)g(table)f(constructors.)k(First,)c -(the)g(function)h Fl(write_value)e Fn(is)i(c)o(hanged)f(to)-12 -1492 y Fl(function)23 b(write_value)f(\(value\))36 1549 y(local)h(t)h(=)g -(type\(value\))131 1605 y(if)g(t)g(==)f('nil')95 b(then)23 -b(write\('nil'\))36 1662 y(elseif)g(t)h(==)f('number')g(then)g -(write\(value\))36 1718 y(elseif)g(t)h(==)f('string')g(then)g(write\('"')g -(..)h(value)f(..)g('"'\))36 1775 y(elseif)g(t)h(==)f('table')47 -b(then)23 b(write_record\(value\))36 1831 y(end)-12 1888 y(end)-12 -1981 y Fn(The)16 b(function)g Fl(write_record)d Fn(is:)-12 -2075 y Fl(function)23 b(write_record\(t\))36 2132 y(local)g(i,)h(v)f(=)h -(next\(t,)f(nil\))36 2188 y(write\('{'\))46 b(--)24 b(starts)f(constructor)36 -2245 y(while)g(i)h(do)84 2301 y(store\(i,)e(v\))84 2358 y(write\(',)g('\))84 -2414 y(i,)h(v)h(=)g(next\(t,)f(i\))36 2470 y(end)36 2527 y(write\('}'\))46 -b(--)24 b(closes)f(constructor)-12 2583 y(end)-12 2705 y Fd(7.4)56 -b(Inheritance)-12 2791 y Fn(The)18 b(fallbac)o(k)h(for)f(absen)o(t)f(indices) -j(can)f(b)q(e)f(used)h(to)e(implemen)o(t)j(man)o(y)d(kinds)i(of)f -(inheritance)h(in)g(Lua.)-12 2847 y(As)c(an)g(example,)h(the)f(follo)o(wing)h -(co)q(de)g(implemen)o(ts)h(single)f(inheritance:)899 2976 y(20)p -eop +20 19 bop -42 199 a Fl(read)24 b(\([format]\))-42 285 +y Fn(This)17 b(function)g(returns)f(a)h(v)m(alue)g(read)g(from)e(the)i +(curren)o(t)g(input.)25 b(An)17 b(optional)f(string)g(argumen)o(t)f(sp) +q(eci\014es)-42 342 y(the)h(w)o(a)o(y)e(the)h(input)g(is)g(in)o +(terpreted.)29 398 y(Without)d(a)h(format)d(argumen)o(t,)h +Fl(read)i Fn(\014rst)f(skips)h(blanks,)g(tabs)f(and)h(newlines.)19 +b(Then)14 b(it)e(c)o(hec)o(ks)h(whether)-42 454 y(the)h(curren)o(t)f(c) +o(haracter)f(is)h Fl(")g Fn(or)f Fl(')p Fn(.)19 b(If)14 +b(so,)e(it)h(reads)g(a)f(string)g(up)i(to)f(the)g(ending)g(quotation)f +(mark,)f(and)j(returns)-42 511 y(this)h(string,)f(without)g(the)h +(quotation)f(marks.)k(Otherwise)d(it)g(reads)g(up)h(to)e(a)h(blank,)g +(tab)f(or)h(newline.)29 567 y(The)g(format)e(string)i(can)g(ha)o(v)o(e) +g(the)g(follo)o(wing)e(format:)30 658 y Fl(?[n])-42 748 +y Fn(where)j Fl(?)f Fn(can)g(b)q(e:)-42 839 y Fk('s')i(or)g('S')k +Fn(to)15 b(read)g(a)g(string;)-42 931 y Fk('f)5 b(')17 +b(or)g('F')22 b Fn(to)14 b(read)h(a)g(real)g(n)o(um)o(b)q(er;)-42 +1024 y Fk('i')h(or)i('I')j Fn(to)15 b(read)g(an)g(in)o(teger.)-42 +1114 y(The)e(optional)e Fl(n)h Fn(is)g(a)g(n)o(um)o(b)q(er)g(whic)o(h)g +(sp)q(eci\014es)h(ho)o(w)f(man)o(y)f(c)o(haracters)h(m)o(ust)e(b)q(e)j +(read)g(to)e(comp)q(ose)h(the)g(input)-42 1171 y(v)m(alue.)21 +b(P)o(articularly)l(,)12 b(the)k(format)c Fl("s1")j Fn(reads)g(a)g +(single)g(c)o(haracter.)-42 1290 y Fl(readuntil)23 b(\(char\))-42 +1376 y Fn(Reads)18 b(the)f(curren)o(t)g(input)g(un)o(til)f(the)g +(\014rst)h(o)q(currence)h(of)e(the)h(giv)o(en)f(c)o(haracter.)25 +b(Returns)17 b(the)g(string)f(read.)-42 1432 y(The)g(c)o(haracter)e +(itself)h(is)f(not)h(read.)-42 1552 y Fl(write)24 b(\(value,)f +([format]\))-42 1637 y Fn(This)d(function)g(writes)f(the)i(v)m(alue)f +(of)g(its)f(\014rst)h(argumen)o(t)e(to)i(the)g(curren)o(t)g(output.)35 +b(An)20 b(optional)f(second)-42 1694 y(argumen)o(t)13 +b(sp)q(eci\014es)i(the)f(format)e(to)i(b)q(e)h(used.)20 +b(This)14 b(format)e(is)i(giv)o(en)f(as)h(a)g(string,)f(comp)q(osed)h +(of)g(four)f(parts.)-42 1750 y(The)j(\014rst)f(part)f(is)h(the)g(only)g +(one)g(not)g(optional,)f(and)h(m)o(ust)f(b)q(e)i(one)f(of)g(the)g +(follo)o(wing)e(c)o(haracters:)-42 1841 y Fk('s')k(or)g('S')k +Fn(to)15 b(write)f(strings;)-42 1933 y Fk('f)5 b(')17 +b(or)g('F')22 b Fn(to)14 b(write)g(\015oats;)-42 2026 +y Fk('i')i(or)i('I')j Fn(to)15 b(write)f(in)o(tegers.)-42 +2116 y(These)i(c)o(haracters)e(can)i(b)q(e)g(follo)o(w)o(ed)d(b)o(y)30 +2207 y Fl([?][m][.n])-42 2297 y Fn(where:)-42 2388 y +Fl(?)23 b Fn(indicates)15 b(justi\014cation)f(inside)h(the)g(\014eld.) +100 2480 y(')p Fl(<)p Fn(')22 b(righ)o(t)14 b(justi\014cation)g +(\(default\);)100 2552 y(')p Fl(>)p Fn(')22 b(left)15 +b(justi\014cation;)100 2623 y(')p Fl(|)p Fn(')22 b(cen)o(ter)15 +b(justi\014cation.)911 2748 y(20)p eop %%Page: 21 21 -bop -12 160 a Fl(function)23 b(Index)g(\(t,f\))36 216 y(if)h(f)f(==)h -('parent')f(then)47 b(--)23 b(to)h(avoid)f(loop)84 273 y(return)g -(OldIndex\(t,f\))36 329 y(end)36 385 y(local)g(p)h(=)g(t.parent)36 -442 y(if)g(type\(p\))e(==)i('table')f(then)84 498 y(return)g(p[f])36 -555 y(else)84 611 y(return)g(OldIndex\(t,f\))36 668 y(end)-12 -724 y(end)-12 837 y(OldIndex)g(=)h(setfallback\("index",)d(Index\))-12 -931 y Fn(Whenev)o(er)13 b(Lua)f(attempts)g(to)f(access)i(an)f(absen)o(t)g -(\014eld)i(in)f(a)f(table,)h(it)f(calls)i(the)e(fallbac)o(k)h(function)g -Fl(Index)p Fn(.)-12 987 y(If)h(the)g(table)g(has)g(a)f(\014eld)i -Fl(parent)e Fn(with)h(a)g(table)g(v)m(alue,)h(then)f(Lua)g(attempts)f(to)g -(access)h(the)g(desired)h(\014eld)-12 1044 y(in)g(this)g(paren)o(t)f(ob)s -(ject.)19 b(This)c(pro)q(cess)f(is)h(rep)q(eated)g(\\up)o(w)o(ards")e(un)o -(til)i(a)f(v)m(alue)i(for)e(the)g(\014eld)h(is)g(found)g(or)-12 -1100 y(the)i(ob)s(ject)g(has)g(no)g(paren)o(t.)24 b(In)18 b(the)f(latter)g -(case,)g(the)g(previous)h(fallbac)o(k)g(is)f(called)i(to)d(supply)i(a)f(v)m -(alue)-12 1157 y(for)e(the)g(\014eld.)59 1213 y(When)h(b)q(etter)h(p)q -(erformance)f(is)h(needed,)g(the)g(same)f(fallbac)o(k)h(ma)o(y)e(b)q(e)i -(implemen)o(ted)h(in)f(C,)f(as)g(ilus-)-12 1270 y(trated)f(in)h(Figure)f(1.) -20 b(This)15 b(co)q(de)h(m)o(ust)f(b)q(e)h(registered)f(with:)36 -1363 y Fl(lua_pushliteral\("parent"\))o(;)36 1420 y(lockedParentName)22 -b(=)h(lua_lock\(\);)36 1476 y(lua_pushobject\(lua_setfal)o(lback\("i)o -(ndex",)d(Index\)\);)36 1533 y(lockedOldIndex)i(=)i(lua_lock\(\);)-12 -1627 y Fn(Notice)16 b(that)e(the)i(string)f Fl("parent")f Fn(is)i(k)o(ept)f -(lo)q(c)o(k)o(ed)g(in)h(Lua)g(for)f(optimal)g(p)q(erformace.)-12 -1748 y Fd(7.5)56 b(A)19 b(CF)-5 b(unction)-12 1834 y Fn(A)12 -b(CF)l(unction)h(to)e(compute)i(the)f(maxim)o(um)g(of)f(a)h(v)m(ariable)h(n)o -(um)o(b)q(er)g(of)e(argumen)o(ts)h(is)g(sho)o(wn)g(in)h(Figure)f(2.)-12 -1891 y(After)j(registered)h(with)-12 1984 y Fl(lua_register)22 -b(\("max",)h(math_max\);)-12 2078 y Fn(this)16 b(function)g(is)g(a)o(v)m -(ailable)g(in)g(Lua,)g(as)e(follo)o(ws:)-12 2172 y Fl(i)24 -b(=)g(max\(4,)f(5,)g(10,)h(-34\))47 b(--)23 b(i)h(receives)f(10)-12 -2294 y Fd(7.6)56 b(Calling)18 b(Lua)h(F)-5 b(unctions)-12 2380 -y Fn(This)15 b(example)g(illustrates)g(ho)o(w)f(a)g(C)g(function)h(can)f -(call)i(the)e(Lua)g(function)h Fl(remove_blanks)e Fn(presen)o(ted)-12 -2436 y(in)j(Section)g(7.2.)-12 2530 y Fl(void)24 b(remove_blanks)e(\(char)h -(*s\))-12 2586 y({)36 2643 y(lua_pushstring\(s\);)45 b(/*)24 -b(prepare)f(parameter)f(*/)36 2699 y(lua_call\("remove_blanks"\))o(;)45 -b(/*)24 b(call)f(Lua)g(function)g(*/)36 2756 y(strcpy\(s,)g -(lua_getstring\(lua_getre)o(sult\(1\))o(\)\);)45 b(/*)23 b(copy)h(result)f -(back)g(to)h('s')f(*/)-12 2812 y(})899 2976 y Fn(21)p eop +21 20 bop -42 199 a Fl(m)23 b Fn(Indicates)16 b(the)f(\014eld)g(size)g +(in)g(c)o(haracters.)-42 293 y Fl(.n)23 b Fn(F)l(or)18 +b(reals,)h(indicates)f(the)h(n)o(um)o(b)q(er)f(of)g(digital)f(places.) +31 b(F)l(or)18 b(in)o(tegers,)h(it)f(is)g(the)h(minim)o(um)c(n)o(um)o +(b)q(er)j(of)72 350 y(digits.)h(This)c(option)f(has)h(no)g(meaning)f +(for)h(strings.)29 443 y(When)20 b(called)e(without)g(a)h(format)e +(string,)i(this)f(function)h(writes)f(n)o(um)o(b)q(ers)h(using)f(the)i +Fl(\045g)e Fn(format)f(and)-42 500 y(strings)e(with)f +Fl(\045s)p Fn(.)-42 643 y Fo(7)67 b(Some)22 b(Examples)-42 +744 y Fn(This)17 b(section)f(giv)o(es)g(examples)g(sho)o(wing)g(some)g +(features)g(of)h(Lua.)25 b(It)17 b(do)q(es)g(not)g(in)o(tend)f(to)h(co) +o(v)o(er)f(the)h(whole)-42 801 y(language,)e(but)g(only)g(to)f +(illustrate)f(some)h(in)o(teresting)g(uses)i(of)e(the)i(system.)-42 +923 y Fd(7.1)56 b(The)18 b(F)-5 b(unctions)21 b Fa(next)c +Fd(and)i Fa(nextvar)-42 1008 y Fn(This)f(example)f(sho)o(ws)g(ho)o(w)h +(to)f(use)i(the)f(function)g Fl(next)f Fn(to)h(iterate)f(o)o(v)o(er)g +(the)h(\014elds)g(of)g(a)g(table.)28 b(F)l(unction)-42 +1065 y Fm(clone)15 b Fn(receiv)o(es)g(an)o(y)g(table)f(and)i(returns)f +(a)g(clone)g(of)g(it.)-42 1159 y Fl(function)23 b(clone)g(\(t\))263 +b(--)23 b(t)h(is)f(a)h(table)6 1215 y(local)f(new_t)h(=)f({})263 +b(--)23 b(creates)g(a)h(new)f(table)6 1272 y(local)g(i,)h(v)g(=)f +(next\(t,)g(nil\))48 b(--)23 b(i)h(is)f(an)h(index)f(of)h(t,)f(v)h(=)g +(t[i])6 1328 y(while)f(i)h(do)54 1385 y(new_t[i])f(=)g(v)54 +1441 y(i,)h(v)f(=)h(next\(t,)f(i\))191 b(--)23 b(get)h(next)f(index)6 +1497 y(end)6 1554 y(return)g(new_t)-42 1610 y(end)29 +1704 y Fn(The)15 b(next)h(example)e(prin)o(ts)g(the)i(names)e(of)g(all) +h(global)e(v)m(ariables)i(in)g(the)g(system)f(with)h(non)g(nil)g(v)m +(alues:)-42 1798 y Fl(function)23 b(printGlobalVariables)e(\(\))6 +1854 y(local)i(i,)h(v)g(=)f(nextvar\(nil\))6 1911 y(while)g(i)h(do)54 +1967 y(print\(i\))54 2024 y(i,)g(v)f(=)h(nextvar\(i\))6 +2080 y(end)-42 2137 y(end)-42 2258 y Fd(7.2)56 b(String)19 +b(Manipulation)-42 2344 y Fn(The)d(\014rst)f(example)f(is)g(a)h +(function)g(to)g(trim)e(extra)i(blanks)g(at)f(the)h(b)q(eginning)h(and) +f(end)h(of)f(a)g(string.)-42 2438 y Fl(function)23 b(trim\(s\))6 +2495 y(local)g(l)h(=)g(1)6 2551 y(while)f(strsub\(s,l,l\))f(==)i(')g(') +g(do)54 2607 y(l)g(=)f(l+1)911 2748 y Fn(21)p eop %%Page: 22 22 -bop -12 417 1867 6 v -12 511 a Fl(int)24 b(lockedParentName;)45 -b(/*)24 b(stores)f(the)g(lock)g(index)h(for)f(the)h(string)f("parent")f(*/) --12 567 y(int)i(lockedOldIndex;)93 b(/*)24 b(previous)e(fallback)h(function)g -(*/)-12 680 y(void)h(callOldFallback)d(\(lua_Object)i(table,)g(lua_Object)f -(index\))-12 736 y({)36 793 y(lua_Object)g(oldIndex)h(=)h -(lua_getlocked\(lockedOldIn)o(dex\);)36 849 y(lua_pushobject\(table\);)36 -906 y(lua_pushobject\(index\);)36 962 y(lua_callfunction\(oldIndex)o(\);)-12 -1019 y(})-12 1132 y(void)g(Index)f(\(void\))-12 1188 y({)36 -1245 y(lua_Object)f(table)i(=)f(lua_getparam\(1\);)36 1301 -y(lua_Object)f(index)i(=)f(lua_getparam\(2\);)36 1357 y(lua_Object)f(parent;) -36 1414 y(if)i(\(lua_isstring\(index\))d(&&)i -(strcmp\(lua_getstring\(index\),)d("parent"\))j(==)g(0\))36 -1470 y({)84 1527 y(callOldFallback\(table,)d(index\);)84 1583 -y(return;)36 1640 y(})36 1696 y(lua_pushobject\(table\);)36 -1753 y(lua_pushlocked\(lockedPare)o(ntName\);)36 1809 y(parent)j(=)h -(lua_getsubscript\(\);)36 1866 y(if)g(\(lua_istable\(parent\)\))36 -1922 y({)84 1978 y(lua_pushobject\(parent\);)84 2035 y -(lua_pushobject\(index\);)84 2091 y(/*)f(return)g(result)g(from)h -(getsubscript)e(*/)84 2148 y(lua_pushobject\(lua_gets)o(ubscript)o(\(\)\);)36 -2204 y(})36 2261 y(else)84 2317 y(callOldFallback\(table,)e(index\);)-12 -2374 y(})653 2509 y Fn(Figure)c(1:)j(Inheritance)e(in)f(C.)p --12 2565 V 899 2976 a(22)p eop +22 21 bop 6 199 a Fl(end)6 256 y(local)23 b(r)h(=)g(strlen\(s\))6 +312 y(while)f(strsub\(s,r,r\))f(==)i(')g(')g(do)54 369 +y(r)g(=)f(r-1)6 425 y(end)6 482 y(return)g(strsub\(s,l,r\))-42 +538 y(end)29 631 y Fn(The)15 b(second)h(example)e(sho)o(ws)h(a)g +(function)g(that)f(eliminates)f(all)h(blanks)h(of)g(a)g(string.)-42 +723 y Fl(function)23 b(remove_blanks)f(\(s\))6 780 y(local)h(b)h(=)g +(strfind\(s,)e(')i('\))6 836 y(while)f(b)h(do)54 893 +y(s)g(=)f(strsub\(s,)g(1,)h(b-1\))f(..)h(strsub\(s,)e(b+1\))54 +949 y(b)i(=)f(strfind\(s,)g(')h('\))6 1006 y(end)6 1062 +y(return)f(s)-42 1118 y(end)-42 1240 y Fd(7.3)56 b(P)n(ersistence)-42 +1326 y Fn(Because)21 b(of)e(its)g(re\015exiv)o(e)g(facilities,)g(p)q +(ersistence)h(in)f(Lua)h(can)g(b)q(e)g(ac)o(hiev)o(ed)g(within)f(the)g +(language.)33 b(This)-42 1382 y(section)12 b(sho)o(ws)f(some)g(w)o(a)o +(ys)g(to)g(store)g(and)h(retriev)o(e)f(v)m(alues)i(in)e(Lua,)i(using)f +(a)f(text)h(\014le)g(written)e(in)i(the)g(language)-42 +1439 y(itself)j(as)f(the)i(storage)e(media.)29 1495 y(T)l(o)h(store)f +(a)h(single)g(v)m(alue)g(with)g(a)g(name,)f(the)h(follo)o(wing)e(co)q +(de)j(is)e(enough:)-42 1588 y Fl(function)23 b(store)g(\(name,)g +(value\))6 1644 y(write\('\\n')g(..)g(name)h(..)f('='\))6 +1701 y(write_value\(value\))-42 1757 y(end)-42 1862 y(function)g +(write_value)g(\(value\))6 1918 y(local)g(t)h(=)g(type\(value\))102 +1975 y(if)f(t)h(==)g('nil')94 b(then)24 b(write\('nil'\))6 +2031 y(elseif)f(t)h(==)g('number')e(then)i(write\(value\))6 +2088 y(elseif)f(t)h(==)g('string')e(then)i(write\('[[')e(..)i(value)f +(..)h(']]'\))6 2144 y(end)-42 2200 y(end)-42 2305 y Fn(In)16 +b(order)f(to)g(restore)f(this)h(v)m(alue,)g(a)g Fl(lua_dofile)f +Fn(su\016ces.)29 2361 y(Storing)i(tables)h(is)g(a)g(little)e(more)h +(complex.)25 b(Assuming)16 b(that)g(the)h(table)g(is)g(a)g(tree,)g(and) +g(all)f(indices)i(are)-42 2418 y(iden)o(ti\014ers)13 +b(\(that)e(is,)i(the)g(tables)f(are)g(b)q(eing)h(used)g(as)g +(records\),)f(its)g(v)m(alue)h(can)g(b)q(e)g(written)f(directly)g(with) +g(table)-42 2474 y(constructors.)19 b(First,)14 b(the)h(function)g +Fl(write_value)f Fn(is)h(c)o(hanged)g(to)-42 2567 y Fl(function)23 +b(write_value)g(\(value\))6 2623 y(local)g(t)h(=)g(type\(value\))911 +2748 y Fn(22)p eop %%Page: 23 23 -bop -12 727 1867 6 v -12 821 a Fl(void)24 b(math_max)e(\(void\))-12 -878 y({)12 934 y(int)i(i=1;)71 b(/*)23 b(number)g(of)h(arguments)e(*/)12 -991 y(double)h(d,)h(dmax;)12 1047 y(lua_Object)f(o;)12 1103 -y(/*)h(the)f(function)g(must)g(get)h(at)f(least)g(one)h(argument)f(*/)12 -1160 y(if)h(\(\(o)f(=)h(lua_getparam\(i++\)\))d(==)j(LUA_NOOBJECT\))60 -1216 y(lua_error)e(\("too)i(few)f(arguments)g(to)g(function)g(`max'"\);)12 -1273 y(/*)h(and)f(this)g(argument)g(must)g(be)h(a)g(number)f(*/)12 -1329 y(if)h(\(!lua_isnumber\(o\)\))60 1386 y(lua_error)e(\("incorrect)h -(argument)g(to)g(function)g(`max'"\);)12 1442 y(dmax)g(=)h(lua_getnumber)e -(\(o\);)12 1499 y(/*)i(loops)f(until)g(there)g(is)h(no)f(more)h(arguments)e -(*/)12 1555 y(while)h(\(\(o)h(=)f(lua_getparam\(i++\)\))f(!=)h -(LUA_NOOBJECT\))12 1612 y({)36 1668 y(if)h(\(!lua_isnumber\(o\)\))84 -1724 y(lua_error)e(\("incorrect)h(argument)f(to)i(function)f(`max'"\);)36 -1781 y(d)h(=)f(lua_getnumber)f(\(o\);)36 1837 y(if)i(\(d)f(>)h(dmax\))f(dmax) -g(=)h(d;)12 1894 y(})12 1950 y(/*)g(push)f(the)g(result)g(to)h(be)g(returned) -e(*/)12 2007 y(lua_pushnumber)g(\(dmax\);)-12 2063 y(})610 -2198 y Fn(Figure)16 b(2:)j(C)c(function)h Fl(math)p 1134 2198 -15 2 v 17 w(max)p Fn(.)p -12 2255 1867 6 v 899 2976 a(23)p -eop +23 22 bop 102 199 a Fl(if)23 b(t)h(==)g('nil')94 b(then)24 +b(write\('nil'\))6 256 y(elseif)f(t)h(==)g('number')e(then)i +(write\(value\))6 312 y(elseif)f(t)h(==)g('string')e(then)i(write\('"') +e(..)i(value)f(..)h('"'\))6 369 y(elseif)f(t)h(==)g('table')46 +b(then)24 b(write_record\(value\))6 425 y(end)-42 482 +y(end)-42 575 y Fn(The)16 b(function)f Fl(write_record)e +Fn(is:)-42 669 y Fl(function)23 b(write_record\(t\))6 +726 y(local)g(i,)h(v)g(=)f(next\(t,)g(nil\))6 782 y(write\('{'\))47 +b(--)23 b(starts)g(constructor)6 839 y(while)g(i)h(do)54 +895 y(store\(i,)f(v\))54 951 y(write\(',)g('\))54 1008 +y(i,)h(v)f(=)h(next\(t,)f(i\))6 1064 y(end)6 1121 y(write\('}'\))47 +b(--)23 b(closes)g(constructor)-42 1177 y(end)-42 1299 +y Fd(7.4)56 b(Inheritance)-42 1385 y Fn(The)15 b(fallbac)o(k)f(for)g +(absen)o(t)g(indices)h(can)g(b)q(e)g(used)g(to)f(implemen)o(t)e(man)o +(y)h(kinds)i(of)f(inheritance)g(in)h(Lua.)20 b(As)15 +b(an)-42 1441 y(example,)f(the)h(follo)o(wing)e(co)q(de)j(implemen)o +(ts)d(single)h(inheritance:)-42 1535 y Fl(function)23 +b(Index)g(\(t,f\))6 1592 y(if)h(f)g(==)f('parent')g(then)47 +b(--)24 b(to)f(avoid)g(loop)54 1648 y(return)g(OldIndex\(t,f\))6 +1704 y(end)6 1761 y(local)g(p)h(=)g(t.parent)6 1817 y(if)g(type\(p\))f +(==)g('table')g(then)54 1874 y(return)g(p[f])6 1930 y(else)54 +1987 y(return)g(OldIndex\(t,f\))6 2043 y(end)-42 2100 +y(end)-42 2213 y(OldIndex)g(=)h(setfallback\("index",)d(Index\))-42 +2306 y Fn(Whenev)o(er)15 b(Lua)g(attempts)d(to)i(access)h(an)f(absen)o +(t)g(\014eld)h(in)f(a)g(table,)g(it)g(calls)f(the)i(fallbac)o(k)e +(function)h Fl(Index)p Fn(.)19 b(If)-42 2363 y(the)14 +b(table)e(has)h(a)g(\014eld)h Fl(parent)e Fn(with)h(a)g(table)f(v)m +(alue,)i(then)f(Lua)h(attempts)d(to)h(access)i(the)f(desired)g(\014eld) +h(in)f(this)-42 2419 y(paren)o(t)i(ob)s(ject.)k(This)c(pro)q(cess)g(is) +f(rep)q(eated)h(\\up)o(w)o(ards")f(un)o(til)g(a)h(v)m(alue)g(for)f(the) +h(\014eld)g(is)g(found)g(or)f(the)h(ob)s(ject)-42 2476 +y(has)h(no)f(paren)o(t.)k(In)d(the)f(latter)f(case,)h(the)g(previous)g +(fallbac)o(k)f(is)h(called)g(to)f(supply)i(a)e(v)m(alue)i(for)e(the)i +(\014eld.)29 2532 y(When)e(b)q(etter)g(p)q(erformance)f(is)g(needed,)i +(the)f(same)e(fallbac)o(k)h(ma)o(y)f(b)q(e)i(implemen)o(ted)e(in)i(C,)f +(as)g(illustrated)-42 2589 y(in)j(Figure)e(1.)20 b(This)14 +b(co)q(de)i(m)o(ust)e(b)q(e)i(registered)e(with:)911 +2748 y(23)p eop %%Page: 24 24 -bop -12 160 a Fo(Ac)n(kno)n(wledgme)o(n)n(ts)-12 261 y Fn(The)17 -b(authors)f(w)o(ould)i(lik)o(e)g(to)e(thank)h(CENPES/PETR)o(OBR)1099 -250 y(\023)1093 261 y(AS)g(whic)o(h,)h(join)o(tly)f(with)h(T)l(eCGraf,)e -(used)-12 318 y(extensiv)o(ely)g(early)f(v)o(ersions)f(of)g(this)h(system)f -(and)h(ga)o(v)o(e)f(v)m(aluable)i(commen)o(ts.)j(The)c(authors)e(w)o(ould)i -(also)-12 374 y(lik)o(e)i(to)d(thank)h(Carlos)g(Henrique)h(Levy)l(,)g(who)f -(found)h(the)f(name)g(of)g(the)g(game)1371 358 y Fj(3)1390 -374 y Fn(.)-12 517 y Fo(A)69 b(Incompatibi)o(l)o(i)o(ti)o(es)20 -b(with)h(Previous)i(V)-6 b(ersions)-12 619 y Fn(Although)13 -b(great)f(care)g(has)h(b)q(een)g(tak)o(en)f(to)g(a)o(v)o(oid)h -(incompatibilities)j(with)d(the)f(previous)h(public)i(v)o(ersions)-12 -675 y(of)g(Lua,)g(some)g(di\013erences)h(had)g(to)e(b)q(e)i(in)o(tro)q -(duced.)21 b(Here)16 b(is)f(a)g(list)h(of)f(all)h(these)g(di\013erences.)-12 -797 y Fd(Incompatibilitie)o(s)g(in)i(the)h(Language)56 883 -y Fi(\017)k Fn(The)15 b(equalit)o(y)h(test)f(op)q(erator)f(no)o(w)h(is)h -(denoted)f(b)o(y)g Fl(==)p Fn(,)g(instead)h(of)f Fl(=)p Fn(.)56 -976 y Fi(\017)23 b Fn(The)14 b(syn)o(tax)f(for)g(table)h(construction)g(has)f -(b)q(een)i(greatly)f(simpli\014ed.)22 b(The)14 b(old)g Fl(@\(size\))f -Fn(has)g(b)q(een)102 1033 y(substituted)20 b(b)o(y)f Fl({})p -Fn(.)32 b(The)20 b(list)g(constructor)f(\(formerly)g Fl(@[...])p -Fn(\))f(and)h(the)h(record)f(constructor)102 1089 y(\(formerly)g -Fl(@{...})p Fn(\))g(no)o(w)h(are)g(b)q(oth)g(co)q(ded)h(lik)o(e)g -Fl({...})p Fn(.)34 b(When)20 b(the)h(construction)f(in)o(v)o(olv)o(es)h(a)102 -1146 y(function)15 b(call,)h(lik)o(e)g(in)f Fl(@func{...})p -Fn(,)e(the)i(new)g(syn)o(tax)f(do)q(es)h(not)g(use)g(the)f -Fl(@)p Fn(.)20 b(More)14 b(imp)q(ortan)o(t,)g Fm(a)102 1202 -y(c)n(onstruction)h(function)h(must)h(now)f(explicitly)g(r)n(eturn)g(the)h(c) -n(onstructe)n(d)e(table)p Fn(.)-12 1324 y Fd(Incompatibilitie)o(s)h(in)i(the) -h(API)56 1410 y Fi(\017)k Fn(The)15 b(function)h Fl(lua_call)e -Fn(no)h(longer)h(has)f(the)g(parameter)g Fl(nparam)p Fn(.)56 -1504 y Fi(\017)23 b Fn(The)16 b(function)i Fl(lua_pop)d Fn(is)i(no)f(longer)h -(a)o(v)m(ailable,)h(since)g(it)e(could)i(lead)f(to)f(strange)g(b)q(eha)o -(vior.)24 b(In)102 1560 y(particular,)13 b(to)e(access)i(results)f(returned)h -(from)e(a)h(Lua)h(function,)g(the)f(new)h(macro)e Fl(lua_getresult)102 -1617 y Fn(should)16 b(b)q(e)g(used.)56 1710 y Fi(\017)23 b -Fn(The)15 b(old)h(functions)g Fl(lua_storefield)d Fn(and)j -Fl(lua_storeindexed)d Fn(ha)o(v)o(e)h(b)q(een)j(replaced)f(b)o(y)102 -1823 y Fl(int)23 b(lua_storesubscript)f(\(void\);)102 1935 -y Fn(with)15 b(the)h(parameters)e(explicitly)k(pushed)e(on)f(the)h(stac)o(k.) -56 2029 y Fi(\017)23 b Fn(The)16 b(functionalit)o(y)h(of)f(the)g(function)g -Fl(lua_errorfunction)e Fn(has)i(b)q(een)h(replaced)g(b)o(y)f(the)g -Fm(fal)r(lb)n(ack)102 2086 y Fn(mec)o(hanism;)f(see)h(Section)g(4.8.)56 -2179 y Fi(\017)23 b Fn(When)14 b(calling)i(a)d(function)i(from)e(the)h(Lua)g -(library)l(,)g(parameters)f(passed)h(through)g(the)g(stac)o(k)f(m)o(ust)102 -2236 y(b)q(e)j(pushed)h(just)e(b)q(efore)h(the)f(corresp)q(onden)o(t)h(call,) -h(with)f(no)f(in)o(termediate)h(calls)h(to)e(Lua.)21 b(Sp)q(ecial)102 -2292 y(care)15 b(should)h(b)q(e)g(tak)o(en)f(with)g(macros)g(lik)o(e)h -Fl(lua_getindexed)d Fn(and)j Fl(lua_getfield)p Fn(.)p -12 2815 -747 2 v 40 2842 a Fh(3)57 2858 y Fg(BTW,)d(Lua)g(means)h Fe(mo)n(on)e -Fg(in)i(P)o(ortuguese.)899 2976 y Fn(24)p eop +24 23 bop -42 317 1950 6 v -42 411 a Fl(int)24 b(lockedParentName;)45 +b(/*)24 b(stores)f(the)g(lock)h(index)f(for)g(the)h(string)f("parent")g +(*/)-42 467 y(int)h(lockedOldIndex;)93 b(/*)24 b(previous)f(fallback)f +(function)h(*/)-42 580 y(void)h(callOldFallback)e(\(lua_Object)g +(table,)h(lua_Object)g(index\))-42 637 y({)6 693 y(lua_Object)g +(oldIndex)f(=)i(lua_getlocked\(lockedOldIndex)o(\);)6 +750 y(lua_pushobject\(table\);)6 806 y(lua_pushobject\(index\);)6 +863 y(lua_callfunction\(oldIndex\);)-42 919 y(})-42 1032 +y(void)g(Index)f(\(void\))-42 1088 y({)6 1145 y(lua_Object)g(table)g(=) +h(lua_getparam\(1\);)6 1201 y(lua_Object)f(index)g(=)h +(lua_getparam\(2\);)6 1258 y(lua_Object)f(parent;)6 1314 +y(if)h(\(lua_isstring\(index\))d(&&)j(strcmp\(lua_getstring\(in)o +(dex\),)d("parent"\))h(==)i(0\))6 1371 y({)54 1427 y +(callOldFallback\(table,)d(index\);)54 1484 y(return;)6 +1540 y(})6 1597 y(lua_pushobject\(table\);)6 1653 y +(lua_pushlocked\(lockedParentN)o(ame\);)6 1709 y(parent)i(=)h +(lua_getsubscript\(\);)6 1766 y(if)g(\(lua_istable\(parent\)\))6 +1822 y({)54 1879 y(lua_pushobject\(parent\);)54 1935 +y(lua_pushobject\(index\);)54 1992 y(/*)g(return)f(result)g(from)g +(getsubscript)f(*/)54 2048 y(lua_pushobject\(lua_getsubs)o(cript\(\))o +(\);)6 2105 y(})6 2161 y(else)54 2218 y(callOldFallback\(table,)f +(index\);)-42 2274 y(})665 2409 y Fn(Figure)15 b(1:)k(Inheritance)d(in) +f(C.)p -42 2466 V 911 2748 a(24)p eop +%%Page: 25 25 +25 24 bop -42 159 1950 6 v -42 253 a Fl(void)24 b(math_max)f(\(void\)) +-42 310 y({)-18 366 y(int)h(i=1;)71 b(/*)23 b(number)g(of)h(arguments)f +(*/)-18 423 y(double)g(d,)h(dmax;)-18 479 y(lua_Object)f(o;)-18 +536 y(/*)h(the)f(function)g(must)g(get)h(at)g(least)f(one)g(argument)g +(*/)-18 592 y(if)h(\(\(o)f(=)h(lua_getparam\(i++\)\))e(==)h +(LUA_NOOBJECT\))30 648 y(lua_error)g(\("too)g(few)g(arguments)g(to)h +(function)e(`max'"\);)-18 705 y(/*)i(and)f(this)h(argument)e(must)i(be) +f(a)h(number)f(*/)-18 761 y(if)h(\(!lua_isnumber\(o\)\))30 +818 y(lua_error)f(\("incorrect)f(argument)h(to)g(function)g(`max'"\);) +-18 874 y(dmax)h(=)f(lua_getnumber)f(\(o\);)-18 931 y(/*)i(loops)f +(until)g(there)g(is)h(no)g(more)f(arguments)g(*/)-18 +987 y(while)h(\(\(o)f(=)h(lua_getparam\(i++\)\))d(!=)j(LUA_NOOBJECT\)) +-18 1044 y({)6 1100 y(if)g(\(!lua_isnumber\(o\)\))54 +1157 y(lua_error)f(\("incorrect)f(argument)h(to)g(function)g(`max'"\);) +6 1213 y(d)h(=)g(lua_getnumber)e(\(o\);)6 1270 y(if)i(\(d)f(>)h(dmax\)) +f(dmax)h(=)f(d;)-18 1326 y(})-18 1382 y(/*)h(push)f(the)h(result)f(to)g +(be)h(returned)f(*/)-18 1439 y(lua_pushnumber)f(\(dmax\);)-42 +1495 y(})623 1631 y Fn(Figure)14 b(2:)20 b(C)15 b(function)g +Fl(math)p 1147 1631 15 2 v 16 w(max)p Fn(.)p -42 1687 +1950 6 v 6 1815 a Fl(lua_pushliteral\("parent"\);)6 1871 +y(lockedParentName)22 b(=)i(lua_lock\(\);)6 1928 y +(lua_pushobject\(lua_setfallba)o(ck\("ind)o(ex",)d(Index\)\);)6 +1984 y(lockedOldIndex)h(=)i(lua_lock\(\);)-42 2076 y +Fn(Notice)15 b(ho)o(w)g(the)g(string)f Fl("parent")g +Fn(is)h(k)o(ept)g(lo)q(c)o(k)o(ed)g(in)g(Lua)h(for)e(optimal)f(p)q +(erformance.)-42 2198 y Fd(7.5)56 b(A)19 b(CF)-5 b(unction)-42 +2284 y Fn(A)18 b(CF)l(unction)f(to)f(compute)h(the)g(maxim)o(um)c(of)k +(a)g(v)m(ariable)g(n)o(um)o(b)q(er)f(of)h(argumen)o(ts)f(is)h(sho)o(wn) +g(in)g(Figure)f(2.)-42 2340 y(After)f(registered)g(with)-42 +2432 y Fl(lua_register)23 b(\("max",)g(math_max\);)-42 +2525 y Fn(this)15 b(function)g(is)g(a)o(v)m(ailable)f(in)h(Lua,)g(as)g +(follo)o(ws:)-42 2617 y Fl(i)24 b(=)g(max\(4,)f(5,)h(10,)f(-34\))47 +b(--)24 b(i)g(receives)e(10)911 2748 y Fn(25)p eop +%%Page: 26 26 +26 25 bop -42 199 a Fd(7.6)56 b(Calling)21 b(Lua)e(F)-5 +b(unctions)-42 285 y Fn(This)17 b(example)e(illustrates)f(ho)o(w)i(a)h +(C)f(function)g(can)h(call)e(the)i(Lua)g(function)f Fl(remove_blanks)f +Fn(presen)o(ted)i(in)-42 342 y(Section)f(7.2.)-42 435 +y Fl(void)24 b(remove_blanks)e(\(char)h(*s\))-42 492 +y({)6 548 y(lua_pushstring\(s\);)45 b(/*)24 b(prepare)f(parameter)g(*/) +6 605 y(lua_call\("remove_blanks"\);)44 b(/*)24 b(call)f(Lua)h +(function)f(*/)6 661 y(strcpy\(s,)g(lua_getstring\(lua_getresu)o +(lt\(1\)\)\))o(;)45 b(/*)24 b(copy)f(result)g(back)g(to)h('s')f(*/)-42 +718 y(})-42 861 y Fo(Ac)n(kno)n(wledgmen)n(ts)-42 962 +y Fn(The)18 b(authors)f(w)o(ould)g(lik)o(e)f(to)h(thank)h(CENPES/PETR)o +(OBR)1073 951 y(\023)1067 962 y(AS)g(whic)o(h,)g(join)o(tly)d(with)i(T) +l(eCGraf,)g(used)h(ex-)-42 1019 y(tensiv)o(ely)13 b(early)h(v)o +(ersions)f(of)g(this)g(system)g(and)h(ga)o(v)o(e)e(v)m(aluable)i +(commen)o(ts.)j(The)d(authors)f(w)o(ould)g(also)g(lik)o(e)g(to)-42 +1075 y(thank)j(Carlos)d(Henrique)j(Levy)l(,)f(who)g(found)h(the)f(name) +f(of)h(the)h(game)1204 1059 y Fj(3)1221 1075 y Fn(.)-42 +1218 y Fo(A)68 b(Incompatibiliti)q(es)24 b(with)f(Previous)h(V)-6 +b(ersions)-42 1320 y Fn(Although)15 b(great)f(care)h(has)g(b)q(een)h +(tak)o(en)f(to)f(a)o(v)o(oid)g(incompatibiliti)o(es)e(with)j(the)g +(previous)g(public)g(v)o(ersions)f(of)-42 1376 y(Lua,)i(some)e +(di\013erences)h(had)g(to)g(b)q(e)h(in)o(tro)q(duced.)k(Here)15 +b(is)g(a)g(list)f(of)h(all)f(these)h(di\013erences.)-42 +1498 y Fd(Incompatibilities)21 b(with)f(v)n(ersion)f(2.1)27 +1584 y Fi(\017)j Fn(The)16 b(function)g Fl(type)f Fn(no)o(w)h(returns)g +(the)g(string)f Fl(function)f Fn(b)q(oth)i(for)g(C)g(and)g(Lua)g +(functions.)22 b(Because)72 1640 y(Lua)c(functions)g(and)g(C)g +(functions)f(are)h(compatible,)e(this)i(b)q(eha)o(vior)f(is)g(usually)h +(more)e(useful.)28 b(When)72 1697 y(needed,)20 b(the)e(second)g(result) +g(of)f(function)h Fl(type)f Fn(ma)o(y)f(b)q(e)j(used)g(to)e +(distinguish)g(b)q(et)o(w)o(een)h(Lua)h(and)f(C)72 1753 +y(functions.)27 1847 y Fi(\017)k Fn(A)15 b(function)g(de\014nition)g +(only)g(assigns)f(the)h(function)g(v)m(alue)g(to)g(the)g(giv)o(en)f(v)m +(ariable)h(at)f(execution)h(time.)-42 1969 y Fd(Incompatibilities)21 +b(with)f(v)n(ersion)f(1.1)27 2055 y Fi(\017)j Fn(The)16 +b(equalit)o(y)e(test)g(op)q(erator)h(no)o(w)f(is)h(denoted)h(b)o(y)f +Fl(==)p Fn(,)f(instead)h(of)g Fl(=)p Fn(.)27 2148 y Fi(\017)22 +b Fn(The)13 b(syn)o(tax)f(for)g(table)g(construction)g(has)h(b)q(een)h +(greatly)d(simpli\014ed.)18 b(The)13 b(old)f Fl(@\(size\))g +Fn(has)g(b)q(een)i(sub-)72 2205 y(stituted)h(b)o(y)h +Fl({})p Fn(.)21 b(The)16 b(list)e(constructor)h(\(formerly)e +Fl(@[...])p Fn(\))i(and)h(the)f(record)h(constructor)f(\(formerly)72 +2261 y Fl(@{...})p Fn(\))f(no)o(w)g(are)h(b)q(oth)f(co)q(ded)i(lik)o(e) +e Fl({...})p Fn(.)19 b(When)c(the)g(construction)f(in)o(v)o(olv)o(es)g +(a)g(function)h(call,)e(lik)o(e)72 2318 y(in)i Fl(@func{...})p +Fn(,)e(the)i(new)g(syn)o(tax)f(do)q(es)i(not)e(use)h(the)g +Fl(@)p Fn(.)20 b(More)14 b(imp)q(ortan)o(t,)e Fm(a)17 +b(c)n(onstruction)e(function)72 2374 y(must)i(now)f(explicitly)g(r)n +(eturn)g(the)g(c)n(onstructe)n(d)g(table)p Fn(.)27 2468 +y Fi(\017)22 b Fn(The)16 b(function)f Fl(lua_call)f Fn(no)h(longer)f +(has)h(the)h(parameter)d Fl(nparam)p Fn(.)p -42 2509 +780 2 v 10 2536 a Fh(3)28 2552 y Fg(BTW,)f(Lua)i(means)f +Fe(mo)n(on)f Fg(in)i(P)o(ortuguese.)911 2748 y Fn(26)p +eop +%%Page: 27 27 +27 26 bop 27 199 a Fi(\017)22 b Fn(The)g(function)f Fl(lua_pop)g +Fn(is)g(no)h(longer)e(a)o(v)m(ailable,)i(since)g(it)f(could)g(lead)g +(to)g(strange)g(b)q(eha)o(vior.)39 b(In)72 256 y(particular,)18 +b(to)h(access)g(results)g(returned)g(from)f(a)g(Lua)i(function,)f(the)h +(new)f(macro)e Fl(lua_getresult)72 312 y Fn(should)e(b)q(e)h(used.)27 +406 y Fi(\017)22 b Fn(The)16 b(old)e(functions)h Fl(lua_storefield)f +Fn(and)h Fl(lua_storeindexed)e Fn(ha)o(v)o(e)i(b)q(een)h(replaced)f(b)o +(y)72 518 y Fl(int)24 b(lua_storesubscript)d(\(void\);)72 +631 y Fn(with)15 b(the)g(parameters)e(explicitly)h(pushed)j(on)e(the)g +(stac)o(k.)27 725 y Fi(\017)22 b Fn(The)12 b(functionalit)o(y)e(of)i +(the)g(function)f Fl(lua_errorfunction)f Fn(has)h(b)q(een)i(replaced)f +(b)o(y)g(the)g Fm(fal)r(lb)n(ack)f Fn(mec)o(h-)72 781 +y(anism;)i(see)j(Section)f(4.8.)27 875 y Fi(\017)22 b +Fn(When)16 b(calling)e(a)h(function)h(from)d(the)j(Lua)g(library)l(,)e +(parameters)g(passed)h(through)h(the)f(stac)o(k)g(m)o(ust)f(b)q(e)72 +932 y(pushed)20 b(just)f(b)q(efore)g(the)g(corresp)q(onden)o(t)g(call,) +f(with)g(no)h(in)o(termediate)e(calls)g(to)i(Lua.)31 +b(Sp)q(ecial)19 b(care)72 988 y(should)c(b)q(e)h(tak)o(en)f(with)f +(macros)g(lik)o(e)g Fl(lua_getindexed)f Fn(and)j Fl(lua_getfield)p +Fn(.)911 2748 y(27)p eop %%Trailer end userdict /end-hook known{end-hook}if @@ -1,8 +1,9 @@ -#!/bin/sh +#!/bin/sh -x # makefile for lua hierarchy +VERSION=2.2 LUA=`pwd` -export LUA +export LUA VERSION cd $LUA/src; make $* cd $LUA/include; make $* diff --git a/include/Makefile b/include/Makefile index 5ef4d4b5..e55b7717 100644 --- a/include/Makefile +++ b/include/Makefile @@ -1,8 +1,15 @@ # makefile for lua distribution +SRCS= lua.h lualib.h luadebug.h + all: +dynamic: + clean: co: - co -M lua.h lualib.h + co -f -M $(SRCS) + +klean: clean + rm -f $(SRCS) diff --git a/include/lua.h b/include/lua.h index 09a0909e..4e0a52e3 100644 --- a/include/lua.h +++ b/include/lua.h @@ -2,13 +2,18 @@ ** LUA - Linguagem para Usuarios de Aplicacao ** Grupo de Tecnologia em Computacao Grafica ** TeCGraf - PUC-Rio -** $Id: lua.h,v 3.16 1995/01/27 17:19:06 celes Exp $ +** $Id: lua.h,v 3.21 1995/11/13 15:36:52 roberto Exp $ */ #ifndef lua_h #define lua_h +#define LUA_VERSION "Lua 2.2" +#define LUA_COPYRIGHT "Copyright (C) 1994, 1995 TeCGraf" +#define LUA_AUTHORS "W. Celes, R. Ierusalimschy & L. H. de Figueiredo" + + /* Private Part */ typedef enum @@ -19,6 +24,9 @@ typedef enum LUA_T_ARRAY = -4, LUA_T_FUNCTION = -5, LUA_T_CFUNCTION= -6, + LUA_T_MARK = -7, + LUA_T_CMARK = -8, + LUA_T_LINE = -9, LUA_T_USERDATA = 0 } lua_Type; diff --git a/include/luadebug.h b/include/luadebug.h new file mode 100644 index 00000000..c1e26dcf --- /dev/null +++ b/include/luadebug.h @@ -0,0 +1,20 @@ +/* +** LUA - Linguagem para Usuarios de Aplicacao +** Grupo de Tecnologia em Computacao Grafica +** TeCGraf - PUC-Rio +** $Id: luadebug.h,v 1.2 1995/10/26 14:21:56 roberto Exp $ +*/ + + +#ifndef luadebug_h +#define luadebug_h + +#include "lua.h" + +lua_Object lua_stackedfunction(int level); +void lua_funcinfo (lua_Object func, char **filename, int *linedefined); +int lua_currentline (lua_Object func); +char *getobjname (lua_Object o, char **name); + + +#endif diff --git a/include/lualib.h b/include/lualib.h index 9ce7e44a..d250aa5b 100644 --- a/include/lualib.h +++ b/include/lualib.h @@ -2,7 +2,7 @@ ** Libraries to be used in LUA programs ** Grupo de Tecnologia em Computacao Grafica ** TeCGraf - PUC-Rio -** $Id: lualib.h,v 1.3 1994/12/13 15:59:16 roberto Exp $ +** $Id: lualib.h,v 1.4 1995/11/10 17:54:31 roberto Exp $ */ #ifndef lualib_h @@ -12,5 +12,11 @@ void iolib_open (void); void strlib_open (void); void mathlib_open (void); + +/* auxiliar functions (private) */ +void lua_arg_error(char *funcname); +char *lua_check_string (int numArg, char *funcname); +float lua_check_number (int numArg, char *funcname); + #endif diff --git a/src/Makefile b/src/Makefile index 6d1f1bb1..f6296781 100644 --- a/src/Makefile +++ b/src/Makefile @@ -10,12 +10,13 @@ WARN= -Wall -Wmissing-prototypes -Wshadow -ansi CC= gcc CFLAGS= $(INCS) $(DEFS) $(WARN) -O2 -OBJS= fallback.o hash.o inout.o lex.o mem.o opcode.o parser.o table.o tree.o +OBJS= fallback.o func.o hash.o inout.o lex.o mem.o opcode.o parser.o table.o tree.o +SRCS= fallback.c func.c hash.c inout.c lex.c mem.c opcode.c table.c tree.c fallback.h func.h hash.h inout.h mem.h opcode.h table.h tree.h types.h ugly.h lua.stx SLIB= $(LIB)/liblua.a # dynamic libraries only work for SunOs -DLIB= $(LIB)/liblua.so.2.1 +DLIB= $(LIB)/liblua.so.$(VERSION) all: $(SLIB) @@ -32,4 +33,8 @@ clean: rm -f $(OBJS) $(SLIB) $(DLIB) co: - co -M fallback.c hash.c inout.c lex.c mem.c opcode.c table.c tree.c fallback.h hash.h inout.h mem.h opcode.h table.h tree.h types.h ugly.h + co -f -M $(SRCS) + yacc -d lua.stx ; mv -f y.tab.c parser.c ; mv -f y.tab.h parser.h + +klean: clean + rm -f $(SRCS) parser.c parser.h diff --git a/src/fallback.c b/src/fallback.c index d5bbbba1..aa9fc99d 100644 --- a/src/fallback.c +++ b/src/fallback.c @@ -3,7 +3,7 @@ ** TecCGraf - PUC-Rio */ -char *rcs_fallback="$Id: fallback.c,v 1.11 1995/02/06 19:34:03 roberto Exp $"; +char *rcs_fallback="$Id: fallback.c,v 1.17 1995/10/17 14:30:05 roberto Exp $"; #include <stdio.h> #include <string.h> @@ -11,7 +11,6 @@ char *rcs_fallback="$Id: fallback.c,v 1.11 1995/02/06 19:34:03 roberto Exp $"; #include "mem.h" #include "fallback.h" #include "opcode.h" -#include "inout.h" #include "lua.h" @@ -29,15 +28,16 @@ static void funcFB (void); ** Warning: This list must be in the same order as the #define's */ struct FB luaI_fallBacks[] = { -{"error", {LUA_T_CFUNCTION, errorFB}}, -{"index", {LUA_T_CFUNCTION, indexFB}}, -{"gettable", {LUA_T_CFUNCTION, gettableFB}}, -{"arith", {LUA_T_CFUNCTION, arithFB}}, -{"order", {LUA_T_CFUNCTION, orderFB}}, -{"concat", {LUA_T_CFUNCTION, concatFB}}, -{"settable", {LUA_T_CFUNCTION, gettableFB}}, -{"gc", {LUA_T_CFUNCTION, GDFB}}, -{"function", {LUA_T_CFUNCTION, funcFB}} +{"error", {LUA_T_CFUNCTION, {errorFB}}, 1, 0}, +{"index", {LUA_T_CFUNCTION, {indexFB}}, 2, 1}, +{"gettable", {LUA_T_CFUNCTION, {gettableFB}}, 2, 1}, +{"arith", {LUA_T_CFUNCTION, {arithFB}}, 3, 1}, +{"order", {LUA_T_CFUNCTION, {orderFB}}, 3, 1}, +{"concat", {LUA_T_CFUNCTION, {concatFB}}, 2, 1}, +{"settable", {LUA_T_CFUNCTION, {gettableFB}}, 3, 0}, +{"gc", {LUA_T_CFUNCTION, {GDFB}}, 1, 0}, +{"function", {LUA_T_CFUNCTION, {funcFB}}, -1, -1} + /* no fixed number of params or results */ }; #define N_FB (sizeof(luaI_fallBacks)/sizeof(struct FB)) @@ -48,10 +48,7 @@ void luaI_setfallback (void) char *name = lua_getstring(lua_getparam(1)); lua_Object func = lua_getparam(2); if (name == NULL || !(lua_isfunction(func) || lua_iscfunction(func))) - { - lua_pushnil(); - return; - } + lua_error("incorrect argument to function `setfallback'"); for (i=0; i<N_FB; i++) { if (strcmp(luaI_fallBacks[i].kind, name) == 0) @@ -62,7 +59,7 @@ void luaI_setfallback (void) } } /* name not found */ - lua_pushnil(); + lua_error("incorrect argument to function `setfallback'"); } @@ -84,31 +81,31 @@ static void indexFB (void) static void gettableFB (void) { - lua_reportbug("indexed expression not a table"); + lua_error("indexed expression not a table"); } static void arithFB (void) { - lua_reportbug("unexpected type at conversion to number"); + lua_error("unexpected type at conversion to number"); } static void concatFB (void) { - lua_reportbug("unexpected type at conversion to string"); + lua_error("unexpected type at conversion to string"); } static void orderFB (void) { - lua_reportbug("unexpected type at comparison"); + lua_error("unexpected type at comparison"); } static void GDFB (void) { } static void funcFB (void) { - lua_reportbug("call expression not a function"); + lua_error("call expression not a function"); } @@ -162,10 +159,19 @@ Object *luaI_getlocked (int ref) } -void luaI_travlock (void (*fn)(Object *)) +void luaI_travlock (int (*fn)(Object *)) { Word i; for (i=0; i<lockSize; i++) fn(&lockArray[i]); } + +char *luaI_travfallbacks (int (*fn)(Object *)) +{ + Word i; + for (i=0; i<N_FB; i++) + if (fn(&luaI_fallBacks[i].function)) + return luaI_fallBacks[i].kind; + return NULL; +} diff --git a/src/fallback.h b/src/fallback.h index 225a9063..f4be0b6f 100644 --- a/src/fallback.h +++ b/src/fallback.h @@ -1,5 +1,5 @@ /* -** $Id: fallback.h,v 1.7 1994/11/21 18:22:58 roberto Stab $ +** $Id: fallback.h,v 1.10 1995/10/17 11:52:38 roberto Exp $ */ #ifndef fallback_h @@ -10,6 +10,8 @@ extern struct FB { char *kind; Object function; + int nParams; + int nResults; } luaI_fallBacks[]; #define FB_ERROR 0 @@ -25,7 +27,8 @@ extern struct FB { void luaI_setfallback (void); int luaI_lock (Object *object); Object *luaI_getlocked (int ref); -void luaI_travlock (void (*fn)(Object *)); +void luaI_travlock (int (*fn)(Object *)); +char *luaI_travfallbacks (int (*fn)(Object *)); #endif diff --git a/src/func.c b/src/func.c new file mode 100644 index 00000000..2982f661 --- /dev/null +++ b/src/func.c @@ -0,0 +1,79 @@ +#include <stdio.h> + +#include "luadebug.h" +#include "table.h" +#include "mem.h" +#include "func.h" +#include "opcode.h" + +static TFunc *function_root = NULL; + + +/* +** Insert function in list for GC +*/ +void luaI_insertfunction (TFunc *f) +{ + lua_pack(); + f->next = function_root; + function_root = f; + f->marked = 0; +} + + +/* +** Free function +*/ +static void freefunc (TFunc *f) +{ + luaI_free (f->code); + luaI_free (f); +} + +/* +** Garbage collection function. +** This function traverse the function list freeing unindexed functions +*/ +Long luaI_funccollector (void) +{ + TFunc *curr = function_root; + TFunc *prev = NULL; + Long counter = 0; + while (curr) + { + TFunc *next = curr->next; + if (!curr->marked) + { + if (prev == NULL) + function_root = next; + else + prev->next = next; + freefunc (curr); + ++counter; + } + else + { + curr->marked = 0; + prev = curr; + } + curr = next; + } + return counter; +} + + +void lua_funcinfo (lua_Object func, char **filename, int *linedefined) +{ + Object *f = luaI_Address(func); + if (f->tag == LUA_T_MARK || f->tag == LUA_T_FUNCTION) + { + *filename = f->value.tf->fileName; + *linedefined = f->value.tf->lineDefined; + } + else if (f->tag == LUA_T_CMARK || f->tag == LUA_T_CFUNCTION) + { + *filename = "(C)"; + *linedefined = -1; + } +} + diff --git a/src/func.h b/src/func.h new file mode 100644 index 00000000..2723180f --- /dev/null +++ b/src/func.h @@ -0,0 +1,24 @@ +#ifndef func_h +#define func_h + +#include "types.h" +#include "lua.h" + +/* +** Header para funcoes. +*/ +typedef struct TFunc +{ + struct TFunc *next; + char marked; + int size; + Byte *code; + int lineDefined; + char *fileName; +} TFunc; + +Long luaI_funccollector (void); +void luaI_insertfunction (TFunc *f); + + +#endif @@ -3,14 +3,13 @@ ** hash manager for lua */ -char *rcs_hash="$Id: hash.c,v 2.24 1995/02/06 19:34:03 roberto Exp $"; +char *rcs_hash="$Id: hash.c,v 2.26 1995/10/04 14:20:26 roberto Exp $"; #include <string.h> #include "mem.h" #include "opcode.h" #include "hash.h" -#include "inout.h" #include "table.h" #include "lua.h" @@ -54,7 +53,7 @@ static Word hashindex (Hash *t, Object *ref) /* hash function */ switch (tag(ref)) { case LUA_T_NIL: - lua_reportbug ("unexpected type to index table"); + lua_error ("unexpected type to index table"); return -1; /* UNREACHEABLE */ case LUA_T_NUMBER: return (((Word)nvalue(ref))%nhash(t)); @@ -71,7 +70,7 @@ static Word hashindex (Hash *t, Object *ref) /* hash function */ return (Word)h%nhash(t); /* make it a valid index */ } case LUA_T_FUNCTION: - return (((IntPoint)bvalue(ref))%nhash(t)); + return (((IntPoint)ref->value.tf)%nhash(t)); case LUA_T_CFUNCTION: return (((IntPoint)fvalue(ref))%nhash(t)); case LUA_T_ARRAY: @@ -90,7 +89,7 @@ Bool lua_equalObj (Object *t1, Object *t2) case LUA_T_NUMBER: return nvalue(t1) == nvalue(t2); case LUA_T_STRING: return streq(svalue(t1), svalue(t2)); case LUA_T_ARRAY: return avalue(t1) == avalue(t2); - case LUA_T_FUNCTION: return bvalue(t1) == bvalue(t2); + case LUA_T_FUNCTION: return t1->value.tf == t2->value.tf; case LUA_T_CFUNCTION: return fvalue(t1) == fvalue(t2); default: return uvalue(t1) == uvalue(t2); } diff --git a/src/inout.c b/src/inout.c index 7bd7c235..c73030e3 100644 --- a/src/inout.c +++ b/src/inout.c @@ -5,7 +5,7 @@ ** Also provides some predefined lua functions. */ -char *rcs_inout="$Id: inout.c,v 2.16 1994/12/20 21:20:36 roberto Exp $"; +char *rcs_inout="$Id: inout.c,v 2.25 1995/10/25 13:05:51 roberto Exp $"; #include <stdio.h> #include <stdlib.h> @@ -19,27 +19,19 @@ char *rcs_inout="$Id: inout.c,v 2.16 1994/12/20 21:20:36 roberto Exp $"; #include "tree.h" #include "lua.h" -/* Exported variables */ -Word lua_linenumber; -Bool lua_debug; -Word lua_debugline = 0; - -/* Internal variables */ - #ifndef MAXFUNCSTACK #define MAXFUNCSTACK 100 #endif - -typedef struct FuncStackNode { - struct FuncStackNode *next; - char *file; - Word function; - Word line; -} FuncStackNode; - -static FuncStackNode *funcStack = NULL; -static Word nfuncstack=0; + +#define MAXMESSAGE MAXFUNCSTACK*80 + + +/* Exported variables */ +Word lua_linenumber; +Bool lua_debug = 0; +char *lua_parsedfile; + static FILE *fp; static char *st; @@ -66,16 +58,23 @@ static int stringinput (void) */ char *lua_openfile (char *fn) { - lua_linenumber = 1; lua_setinput (fileinput); - fp = fopen (fn, "r"); + if (fn == NULL) + { + fp = stdin; + fn = "(stdin)"; + } + else + fp = fopen (fn, "r"); if (fp == NULL) { - static char buff[32]; - sprintf(buff, "unable to open file %.10s", fn); + static char buff[255]; + sprintf(buff, "unable to open file `%.200s'", fn); return buff; } - return lua_addfile (fn); + lua_linenumber = 1; + lua_parsedfile = lua_constcreate(fn)->ts.str; + return NULL; } /* @@ -83,9 +82,8 @@ char *lua_openfile (char *fn) */ void lua_closefile (void) { - if (fp != NULL) + if (fp != NULL && fp != stdin) { - lua_delfile(); fclose (fp); fp = NULL; } @@ -94,16 +92,12 @@ void lua_closefile (void) /* ** Function to open a string to be input unit */ -char *lua_openstring (char *s) +void lua_openstring (char *s) { - lua_linenumber = 1; lua_setinput (stringinput); st = s; - { - char sn[64]; - sprintf (sn, "String: %10.10s...", s); - return lua_addfile (sn); - } + lua_linenumber = 1; + lua_parsedfile = lua_constcreate("(string)")->ts.str; } /* @@ -111,75 +105,6 @@ char *lua_openstring (char *s) */ void lua_closestring (void) { - lua_delfile(); -} - - -/* -** Called to execute SETFUNCTION opcode, this function pushs a function into -** function stack. -*/ -void lua_pushfunction (char *file, Word function) -{ - FuncStackNode *newNode; - if (nfuncstack++ >= MAXFUNCSTACK) - { - lua_reportbug("function stack overflow"); - } - newNode = new(FuncStackNode); - newNode->function = function; - newNode->file = file; - newNode->line= lua_debugline; - newNode->next = funcStack; - funcStack = newNode; -} - -/* -** Called to execute RESET opcode, this function pops a function from -** function stack. -*/ -void lua_popfunction (void) -{ - FuncStackNode *temp = funcStack; - if (temp == NULL) return; - --nfuncstack; - lua_debugline = temp->line; - funcStack = temp->next; - luaI_free(temp); -} - -/* -** Report bug building a message and sending it to lua_error function. -*/ -void lua_reportbug (char *s) -{ - char msg[MAXFUNCSTACK*80]; - strcpy (msg, s); - if (lua_debugline != 0) - { - if (funcStack) - { - FuncStackNode *func = funcStack; - int line = lua_debugline; - sprintf (strchr(msg,0), "\n\tactive stack:\n"); - do - { - sprintf (strchr(msg,0), - "\t-> function \"%s\" at file \"%s\":%u\n", - lua_constant[func->function]->str, func->file, line); - line = func->line; - func = func->next; - lua_popfunction(); - } while (func); - } - else - { - sprintf (strchr(msg,0), - "\n\tin statement begining at line %u of file \"%s\"", - lua_debugline, lua_filename()); - } - } - lua_error (msg); } @@ -218,7 +143,7 @@ void lua_print (void) { if (lua_isnumber(obj)) printf("%g\n",lua_getnumber(obj)); else if (lua_isstring(obj)) printf("%s\n",lua_getstring(obj)); - else if (lua_isfunction(obj)) printf("function: %p\n",bvalue(luaI_Address(obj))); + else if (lua_isfunction(obj)) printf("function: %p\n",(luaI_Address(obj))->value.tf); else if (lua_iscfunction(obj)) printf("cfunction: %p\n",lua_getcfunction(obj) ); else if (lua_isuserdata(obj)) printf("userdata: %p\n",lua_getuserdata(obj)); @@ -235,9 +160,11 @@ void lua_print (void) void luaI_type (void) { lua_Object o = lua_getparam(1); + int t; if (o == LUA_NOOBJECT) lua_error("no parameter to function 'type'"); - switch (lua_type(o)) + t = lua_type(o); + switch (t) { case LUA_T_NIL : lua_pushliteral("nil"); @@ -252,15 +179,14 @@ void luaI_type (void) lua_pushliteral("table"); break; case LUA_T_FUNCTION : - lua_pushliteral("function"); - break; case LUA_T_CFUNCTION : - lua_pushliteral("cfunction"); + lua_pushliteral("function"); break; default : lua_pushliteral("userdata"); break; } + lua_pushnumber(t); } /* @@ -289,6 +215,6 @@ void luaI_error (void) { char *s = lua_getstring(lua_getparam(1)); if (s == NULL) s = "(no message)"; - lua_reportbug(s); + lua_error(s); } diff --git a/src/inout.h b/src/inout.h index 22093020..da9c1cc2 100644 --- a/src/inout.h +++ b/src/inout.h @@ -1,5 +1,5 @@ /* -** $Id: inout.h,v 1.7 1994/12/20 21:20:36 roberto Exp $ +** $Id: inout.h,v 1.10 1995/10/17 11:58:41 roberto Exp $ */ @@ -8,17 +8,16 @@ #include "types.h" + extern Word lua_linenumber; extern Bool lua_debug; extern Word lua_debugline; +extern char *lua_parsedfile; char *lua_openfile (char *fn); void lua_closefile (void); -char *lua_openstring (char *s); +void lua_openstring (char *s); void lua_closestring (void); -void lua_pushfunction (char *file, Word function); -void lua_popfunction (void); -void lua_reportbug (char *s); void lua_internaldofile (void); void lua_internaldostring (void); @@ -1,12 +1,12 @@ -char *rcs_lex = "$Id: lex.c,v 2.14 1994/12/27 20:50:38 celes Exp $"; +char *rcs_lex = "$Id: lex.c,v 2.21 1995/11/16 20:46:24 roberto Exp $"; #include <ctype.h> -#include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> +#include "mem.h" #include "tree.h" #include "table.h" #include "opcode.h" @@ -14,6 +14,8 @@ char *rcs_lex = "$Id: lex.c,v 2.14 1994/12/27 20:50:38 celes Exp $"; #include "parser.h" #include "ugly.h" +#define MINBUFF 260 + #define lua_strcmp(a,b) (a[0]<b[0]?(-1):(a[0]>b[0]?(1):strcmp(a,b))) #define next() { current = input(); } @@ -21,7 +23,8 @@ char *rcs_lex = "$Id: lex.c,v 2.14 1994/12/27 20:50:38 celes Exp $"; #define save_and_next() { save(current); next(); } static int current; -static char yytext[256]; +static char *yytext = NULL; +static int textsize = 0; static char *yytextLast; static Input input; @@ -30,6 +33,11 @@ void lua_setinput (Input fn) { current = ' '; input = fn; + if (yytext == NULL) + { + textsize = MINBUFF; + yytext = newvector(textsize, char); + } } char *lua_lasttext (void) @@ -85,9 +93,64 @@ static int findReserved (char *name) } +static void growtext (void) +{ + int size = yytextLast - yytext; + textsize *= 2; + yytext = growvector(yytext, textsize, char); + yytextLast = yytext + size; +} + + +static int read_long_string (void) +{ + int cont = 0; + int spaceleft = textsize - (yytextLast - yytext); + while (1) + { + if (spaceleft <= 2) /* may read more than 1 char in one cicle */ + { + growtext(); + spaceleft = textsize - (yytextLast - yytext); + } + switch (current) + { + case EOF: + case 0: + return WRONGTOKEN; + case '[': + save_and_next(); spaceleft--; + if (current == '[') + { + cont++; + save_and_next(); spaceleft--; + } + continue; + case ']': + save_and_next(); spaceleft--; + if (current == ']') + { + if (cont == 0) return STRING; + cont--; + save_and_next(); spaceleft--; + } + continue; + case '\n': + lua_linenumber++; /* goes through */ + default: + save_and_next(); spaceleft--; + } + } +} + + int yylex (void) { float a; + static int linelasttoken = 0; + if (lua_debug) + luaI_codedebugline(linelasttoken); + linelasttoken = lua_linenumber; while (1) { yytextLast = yytext; @@ -99,8 +162,9 @@ int yylex (void) case EOF: case 0: return 0; - case '\n': lua_linenumber++; + case '\n': linelasttoken = ++lua_linenumber; case ' ': + case '\r': /* CR: to avoid problems with DOS/Windows */ case '\t': next(); continue; @@ -124,10 +188,25 @@ int yylex (void) case '-': save_and_next(); - if (current != '-') return '-'; + if (current != '-') return '-'; /* else goes through */ + case '#': do { next(); } while (current != '\n' && current != 0); continue; + case '[': + save_and_next(); + if (current != '[') return '['; + else + { + save_and_next(); /* pass the second '[' */ + if (read_long_string() == WRONGTOKEN) + return WRONGTOKEN; + save_and_next(); /* pass the second ']' */ + *(yytextLast-2) = 0; /* erases ']]' */ + yylval.vWord = luaI_findconstantbyname(yytext+2); + return STRING; + } + case '=': save_and_next(); if (current != '=') return '='; @@ -152,9 +231,16 @@ int yylex (void) case '\'': { int del = current; + int spaceleft = textsize - (yytextLast - yytext); next(); /* skip the delimiter */ while (current != del) { + if (spaceleft <= 2) /* may read more than 1 char in one cicle */ + { + growtext(); + spaceleft = textsize - (yytextLast - yytext); + } + spaceleft--; switch (current) { case EOF: @@ -177,7 +263,7 @@ int yylex (void) } next(); /* skip the delimiter */ *yytextLast = 0; - yylval.vWord = luaI_findconstant(lua_constcreate(yytext)); + yylval.vWord = luaI_findconstantbyname(yytext); return STRING; } diff --git a/src/yacc/lua.stx b/src/lua.stx index 9c818708..99e96179 100644 --- a/src/yacc/lua.stx +++ b/src/lua.stx @@ -1,6 +1,6 @@ %{ -char *rcs_luastx = "$Id: lua.stx,v 3.17 1995/01/13 22:11:12 roberto Exp $"; +char *rcs_luastx = "$Id: lua.stx,v 3.25 1995/10/26 17:02:50 roberto Exp $"; #include <stdio.h> #include <stdlib.h> @@ -13,6 +13,7 @@ char *rcs_luastx = "$Id: lua.stx,v 3.17 1995/01/13 22:11:12 roberto Exp $"; #include "tree.h" #include "table.h" #include "lua.h" +#include "func.h" /* to avoid warnings generated by yacc */ int yyparse (void); @@ -36,12 +37,14 @@ static Byte *basepc; static int maincode; static int pc; + #define MAXVAR 32 static Long varbuffer[MAXVAR]; /* variables in an assignment list; it's long to store negative Word values */ static int nvarbuffer=0; /* number of variables at a list */ -static Word localvar[STACKGAP]; /* store local variable names */ +#define MAXLOCALS 32 +static Word localvar[MAXLOCALS]; /* store local variable names */ static int nlocalvar=0; /* number of local variables */ #define MAXFIELDS FIELDS_PER_FLUSH*2 @@ -51,6 +54,14 @@ static int nfields=0; /* Internal functions */ +static void yyerror (char *s) +{ + static char msg[256]; + sprintf (msg,"%s near \"%s\" at line %d in file `%s'", + s, lua_lasttext (), lua_linenumber, lua_parsedfile); + lua_error (msg); +} + static void code_byte (Byte c) { if (pc>maxcurr-2) /* 1 byte free to code HALT of main code */ @@ -83,10 +94,10 @@ static void code_float (float n) code_byte(code.m.c4); } -static void code_code (Byte *b) +static void code_code (TFunc *tf) { CodeCode code; - code.b = b; + code.tf = tf; code_byte(code.m.c1); code_byte(code.m.c2); code_byte(code.m.c3); @@ -103,10 +114,10 @@ static void code_word_at (Byte *p, Word n) static void push_field (Word name) { - if (nfields < STACKGAP-1) + if (nfields < MAXFIELDS) fields[nfields++] = name; else - lua_error ("too many fields in a constructor"); + lua_error ("too many fields in nested constructors"); } static void flush_record (int n) @@ -135,18 +146,26 @@ static void flush_list (int m, int n) code_byte(n); } -static void add_nlocalvar (int n) +static void add_localvar (Word name) +{ + if (nlocalvar < MAXLOCALS) + localvar[nlocalvar++] = name; + else + lua_error ("too many local variables"); +} + +static void store_localvar (Word name, int n) { - if (MAX_TEMPS+nlocalvar+MAXVAR+n < STACKGAP) - nlocalvar += n; + if (nlocalvar+n < MAXLOCALS) + localvar[nlocalvar+n] = name; else lua_error ("too many local variables"); } -static void incr_nvarbuffer (void) +static void add_varbuffer (Long var) { - if (nvarbuffer < MAXVAR-1) - nvarbuffer++; + if (nvarbuffer < MAXVAR) + varbuffer[nvarbuffer++] = var; else lua_error ("variable buffer overflow"); } @@ -225,26 +244,35 @@ static void lua_codeadjust (int n) } } -static void init_function (TreeNode *func) +static void change2main (void) { - if (funcCode == NULL) /* first function */ - { - funcCode = newvector(CODE_BLOCK, Byte); - maxcode = CODE_BLOCK; - } - pc=0; basepc=funcCode; maxcurr=maxcode; - nlocalvar=0; - if (lua_debug) + /* (re)store main values */ + pc=maincode; basepc=*initcode; maxcurr=maxmain; + nlocalvar=0; +} + +static void savemain (void) +{ + /* save main values */ + maincode=pc; *initcode=basepc; maxmain=maxcurr; +} + +static void init_func (void) +{ + if (funcCode == NULL) /* first function */ { - code_byte(SETFUNCTION); - code_code((Byte *)luaI_strdup(lua_file[lua_nfile-1])); - code_word(luaI_findconstant(func)); + funcCode = newvector(CODE_BLOCK, Byte); + maxcode = CODE_BLOCK; } + savemain(); /* save main values */ + /* set func values */ + pc=0; basepc=funcCode; maxcurr=maxcode; + nlocalvar = 0; + luaI_codedebugline(lua_linenumber); } static void codereturn (void) { - if (lua_debug) code_byte(RESET); if (nlocalvar == 0) code_byte(RETCODE0); else @@ -254,49 +282,71 @@ static void codereturn (void) } } -static void codedebugline (void) +void luaI_codedebugline (int line) { - if (lua_debug) + static int lastline = 0; + if (lua_debug && line != lastline) { code_byte(SETLINE); - code_word(lua_linenumber); + code_word(line); + lastline = line; } } -static void adjust_mult_assign (int vars, int exps, int temps) +static int adjust_functioncall (Long exp, int i) { - if (exps < 0) + if (exp <= 0) + return -exp; /* exp is -list length */ + else { - int r = vars - (-exps-1); - if (r >= 0) - code_byte(r); + int temp = basepc[exp]; + basepc[exp] = i; + return temp+i; + } +} + +static void adjust_mult_assign (int vars, Long exps, int temps) +{ + if (exps > 0) + { /* must correct function call */ + int diff = vars - basepc[exps]; + if (diff >= 0) + adjust_functioncall(exps, diff); else { - code_byte(0); + adjust_functioncall(exps, 0); lua_codeadjust(temps); } } - else if (vars != exps) + else if (vars != -exps) lua_codeadjust(temps); } -static void lua_codestore (int i) +static void storesinglevar (Long v) { - if (varbuffer[i] > 0) /* global var */ + if (v > 0) /* global var */ { - code_byte(STOREGLOBAL); - code_word(varbuffer[i]-1); + code_byte(STOREGLOBAL); + code_word(v-1); } - else if (varbuffer[i] < 0) /* local var */ + else if (v < 0) /* local var */ { - int number = (-varbuffer[i]) - 1; - if (number < 10) code_byte(STORELOCAL0 + number); - else - { - code_byte(STORELOCAL); - code_byte(number); - } + int number = (-v) - 1; + if (number < 10) code_byte(STORELOCAL0 + number); + else + { + code_byte(STORELOCAL); + code_byte(number); + } } + else + code_byte(STOREINDEXED0); +} + +static void lua_codestore (int i) +{ + if (varbuffer[i] != 0) /* global or local var */ + storesinglevar(varbuffer[i]); else /* indexed var */ { int j; @@ -332,26 +382,22 @@ static void codeIf (Long thenAdd, Long elseAdd) code_word_at(basepc+thenAdd+1,elseinit-(thenAdd+sizeof(Word)+1)); } -static void yyerror (char *s) -{ - static char msg[256]; - sprintf (msg,"%s near \"%s\" at line %d in file \"%s\"", - s, lua_lasttext (), lua_linenumber, lua_filename()); - lua_error (msg); -} - /* ** Parse LUA code. */ -void lua_parse (Byte **code) +void lua_parse (TFunc *tf) { - initcode = code; + lua_debug = 0; + initcode = &(tf->code); *initcode = newvector(CODE_BLOCK, Byte); maincode = 0; maxmain = CODE_BLOCK; + change2main(); if (yyparse ()) lua_error("parse error"); + savemain(); (*initcode)[maincode++] = RETCODE0; + tf->size = maincode; #if LISTING { static void PrintCode (Byte *c, Byte *end); PrintCode(*initcode,*initcode+maincode); } @@ -369,7 +415,7 @@ void lua_parse (Byte **code) char *pChar; Word vWord; Long vLong; - Byte *pByte; + TFunc *pFunc; TreeNode *pNode; } @@ -387,12 +433,17 @@ void lua_parse (Byte **code) %token <vInt> DEBUG %type <vLong> PrepJump -%type <vInt> expr, exprlist, exprlist1, varlist1, funcParams, funcvalue +%type <vLong> exprlist, exprlist1 /* if > 0, points to function return + counter (which has list length); if <= 0, -list lenght */ +%type <vLong> functioncall, expr /* if != 0, points to function return + counter */ +%type <vInt> varlist1, funcParams, funcvalue %type <vInt> fieldlist, localdeclist, decinit -%type <vInt> ffieldlist1 -%type <vInt> lfieldlist1 -%type <vLong> var, singlevar -%type <pByte> body +%type <vInt> ffieldlist, ffieldlist1, semicolonpart +%type <vInt> lfieldlist, lfieldlist1 +%type <vInt> parlist +%type <vLong> var, singlevar, funcname +%type <pFunc> body %left AND OR %left EQ NE '>' '<' LE GE @@ -407,62 +458,48 @@ void lua_parse (Byte **code) functionlist : /* empty */ - | functionlist - { - pc=maincode; basepc=*initcode; maxcurr=maxmain; - nlocalvar=0; - } - stat sc - { - maincode=pc; *initcode=basepc; maxmain=maxcurr; - } + | functionlist globalstat | functionlist function - | functionlist method - | functionlist setdebug ; -function : FUNCTION NAME - { - init_function($2); - } - body +globalstat : stat sc + | setdebug + ; + +function : FUNCTION funcname body { - Word func = luaI_findsymbol($2); - s_tag(func) = LUA_T_FUNCTION; - s_bvalue(func) = $4; + code_byte(PUSHFUNCTION); + code_code($3); + storesinglevar($2); } ; -method : FUNCTION NAME ':' NAME - { - init_function($4); - localvar[nlocalvar]=luaI_findsymbolbyname("self"); - add_nlocalvar(1); - } - body - { - /* assign function to table field */ - pc=maincode; basepc=*initcode; maxcurr=maxmain; - nlocalvar=0; - lua_pushvar(luaI_findsymbol($2)+1); - code_byte(PUSHSTRING); - code_word(luaI_findconstant($4)); - code_byte(PUSHFUNCTION); - code_code($6); - code_byte(STOREINDEXED0); - maincode=pc; *initcode=basepc; maxmain=maxcurr; - } - ; +funcname : var { $$ =$1; init_func(); } + | varexp ':' NAME + { + code_byte(PUSHSTRING); + code_word(luaI_findconstant($3)); + $$ = 0; /* indexed variable */ + init_func(); + add_localvar(luaI_findsymbolbyname("self")); + } + ; body : '(' parlist ')' block END { codereturn(); - $$ = newvector(pc, Byte); - memcpy($$, basepc, pc*sizeof(Byte)); + $$ = new(TFunc); + $$->size = pc; + $$->code = newvector(pc, Byte); + $$->fileName = lua_parsedfile; + $$->lineDefined = $2; + memcpy($$->code, basepc, pc*sizeof(Byte)); + /* save func values */ funcCode = basepc; maxcode=maxcurr; #if LISTING PrintCode(funcCode,funcCode+pc); #endif + change2main(); /* change back to main code */ } ; @@ -472,11 +509,7 @@ statlist : /* empty */ sc : /* empty */ | ';' ; -stat : { codedebugline(); } stat1 ; - -cond : { codedebugline(); } expr1 ; - -stat1 : IF expr1 THEN PrepJump block PrepJump elsepart END +stat : IF expr1 THEN PrepJump block PrepJump elsepart END { codeIf($4, $6); } | WHILE {$<vLong>$=pc;} expr1 DO PrepJump block PrepJump END @@ -487,7 +520,7 @@ stat1 : IF expr1 THEN PrepJump block PrepJump elsepart END code_word_at(basepc+$7+1, pc - ($<vLong>2)); } - | REPEAT {$<vLong>$=pc;} block UNTIL cond PrepJump + | REPEAT {$<vLong>$=pc;} block UNTIL expr1 PrepJump { basepc[$6] = IFFUPJMP; code_word_at(basepc+$6+1, pc - ($<vLong>2)); @@ -504,16 +537,16 @@ stat1 : IF expr1 THEN PrepJump block PrepJump elsepart END lua_codeadjust (0); } } - | functioncall { code_byte(0); } + | functioncall | LOCAL localdeclist decinit - { add_nlocalvar($2); + { nlocalvar += $2; adjust_mult_assign($2, $3, 0); - } + } ; elsepart : /* empty */ | ELSE block - | ELSEIF cond THEN PrepJump block PrepJump elsepart + | ELSEIF expr1 THEN PrepJump block PrepJump elsepart { codeIf($4, $6); } ; @@ -528,9 +561,9 @@ block : {$<vInt>$ = nlocalvar;} statlist ret ; ret : /* empty */ - | RETURN { codedebugline(); } exprlist sc + | RETURN exprlist sc { - if ($3 < 0) code_byte(MULT_RET); + adjust_functioncall($2, MULT_RET); codereturn(); } ; @@ -542,46 +575,46 @@ PrepJump : /* empty */ code_word (0); } -expr1 : expr { if ($1 == 0) code_byte(1); } +expr1 : expr { adjust_functioncall($1, 1); } ; expr : '(' expr ')' { $$ = $2; } - | expr1 EQ expr1 { code_byte(EQOP); $$ = 1; } - | expr1 '<' expr1 { code_byte(LTOP); $$ = 1; } - | expr1 '>' expr1 { code_byte(GTOP); $$ = 1; } - | expr1 NE expr1 { code_byte(EQOP); code_byte(NOTOP); $$ = 1; } - | expr1 LE expr1 { code_byte(LEOP); $$ = 1; } - | expr1 GE expr1 { code_byte(GEOP); $$ = 1; } - | expr1 '+' expr1 { code_byte(ADDOP); $$ = 1; } - | expr1 '-' expr1 { code_byte(SUBOP); $$ = 1; } - | expr1 '*' expr1 { code_byte(MULTOP); $$ = 1; } - | expr1 '/' expr1 { code_byte(DIVOP); $$ = 1; } - | expr1 '^' expr1 { code_byte(POWOP); $$ = 1; } - | expr1 CONC expr1 { code_byte(CONCOP); $$ = 1; } - | '-' expr1 %prec UNARY { code_byte(MINUSOP); $$ = 1;} - | table { $$ = 1; } - | varexp { $$ = 1;} - | NUMBER { code_number($1); $$ = 1; } + | expr1 EQ expr1 { code_byte(EQOP); $$ = 0; } + | expr1 '<' expr1 { code_byte(LTOP); $$ = 0; } + | expr1 '>' expr1 { code_byte(GTOP); $$ = 0; } + | expr1 NE expr1 { code_byte(EQOP); code_byte(NOTOP); $$ = 0; } + | expr1 LE expr1 { code_byte(LEOP); $$ = 0; } + | expr1 GE expr1 { code_byte(GEOP); $$ = 0; } + | expr1 '+' expr1 { code_byte(ADDOP); $$ = 0; } + | expr1 '-' expr1 { code_byte(SUBOP); $$ = 0; } + | expr1 '*' expr1 { code_byte(MULTOP); $$ = 0; } + | expr1 '/' expr1 { code_byte(DIVOP); $$ = 0; } + | expr1 '^' expr1 { code_byte(POWOP); $$ = 0; } + | expr1 CONC expr1 { code_byte(CONCOP); $$ = 0; } + | '-' expr1 %prec UNARY { code_byte(MINUSOP); $$ = 0;} + | table { $$ = 0; } + | varexp { $$ = 0;} + | NUMBER { code_number($1); $$ = 0; } | STRING { code_byte(PUSHSTRING); code_word($1); - $$ = 1; + $$ = 0; } - | NIL {code_byte(PUSHNIL); $$ = 1; } - | functioncall { $$ = 0; } - | NOT expr1 { code_byte(NOTOP); $$ = 1;} + | NIL {code_byte(PUSHNIL); $$ = 0; } + | functioncall { $$ = $1; } + | NOT expr1 { code_byte(NOTOP); $$ = 0;} | expr1 AND PrepJump {code_byte(POP); } expr1 { basepc[$3] = ONFJMP; code_word_at(basepc+$3+1, pc - ($3 + sizeof(Word)+1)); - $$ = 1; + $$ = 0; } | expr1 OR PrepJump {code_byte(POP); } expr1 { basepc[$3] = ONTJMP; code_word_at(basepc+$3+1, pc - ($3 + sizeof(Word)+1)); - $$ = 1; + $$ = 0; } ; @@ -597,7 +630,12 @@ table : ; functioncall : funcvalue funcParams - { code_byte(CALLFUNC); code_byte($1+$2); } + { + code_byte(CALLFUNC); + code_byte($1+$2); + $$ = pc; + code_byte(0); /* may be modified by other rules */ + } ; funcvalue : varexp { $$ = 0; } @@ -610,7 +648,7 @@ funcvalue : varexp { $$ = 0; } ; funcParams : '(' exprlist ')' - { if ($2<0) { code_byte(1); $$ = -$2; } else $$ = $2; } + { $$ = adjust_functioncall($2, 1); } | table { $$ = 1; } ; @@ -618,45 +656,54 @@ exprlist : /* empty */ { $$ = 0; } | exprlist1 { $$ = $1; } ; -exprlist1 : expr { if ($1 == 0) $$ = -1; else $$ = 1; } - | exprlist1 ',' { if ($1 < 0) code_byte(1); } expr +exprlist1 : expr { if ($1 != 0) $$ = $1; else $$ = -1; } + | exprlist1 ',' { $<vLong>$ = adjust_functioncall($1, 1); } expr { - int r = $1 < 0 ? -$1 : $1; - $$ = ($4 == 0) ? -(r+1) : r+1; + if ($4 == 0) $$ = -($<vLong>3 + 1); /* -length */ + else + { + adjust_functioncall($4, $<vLong>3); + $$ = $4; + } } ; -parlist : /* empty */ { lua_codeadjust(0); } - | parlist1 { lua_codeadjust(0); } +parlist : /* empty */ { lua_codeadjust(0); $$ = lua_linenumber; } + | parlist1 { lua_codeadjust(0); $$ = lua_linenumber; } ; parlist1 : NAME { - localvar[nlocalvar]=luaI_findsymbol($1); - add_nlocalvar(1); + add_localvar(luaI_findsymbol($1)); } | parlist1 ',' NAME { - localvar[nlocalvar]=luaI_findsymbol($3); - add_nlocalvar(1); + add_localvar(luaI_findsymbol($3)); } ; -fieldlist : /* empty */ { $$ = 0; } - | lfieldlist1 lastcomma - { $$ = $1; flush_list($1/FIELDS_PER_FLUSH, $1%FIELDS_PER_FLUSH); } +fieldlist : lfieldlist + { flush_list($1/FIELDS_PER_FLUSH, $1%FIELDS_PER_FLUSH); } + semicolonpart + { $$ = $1+$3; } | ffieldlist1 lastcomma { $$ = $1; flush_record($1%FIELDS_PER_FLUSH); } - | lfieldlist1 ';' - { flush_list($1/FIELDS_PER_FLUSH, $1%FIELDS_PER_FLUSH); } - ffieldlist1 lastcomma - { $$ = $1+$4; flush_record($4%FIELDS_PER_FLUSH); } ; +semicolonpart : /* empty */ + { $$ = 0; } + | ';' ffieldlist + { $$ = $2; flush_record($2%FIELDS_PER_FLUSH); } + ; + lastcomma : /* empty */ | ',' ; +ffieldlist : /* empty */ { $$ = 0; } + | ffieldlist1 lastcomma { $$ = $1; } + ; + ffieldlist1 : ffield {$$=1;} | ffieldlist1 ',' ffield { @@ -671,6 +718,10 @@ ffield : NAME '=' expr1 } ; +lfieldlist : /* empty */ { $$ = 0; } + | lfieldlist1 lastcomma { $$ = $1; } + ; + lfieldlist1 : expr1 {$$=1;} | lfieldlist1 ',' expr1 { @@ -683,12 +734,12 @@ lfieldlist1 : expr1 {$$=1;} varlist1 : var { nvarbuffer = 0; - varbuffer[nvarbuffer] = $1; incr_nvarbuffer(); + add_varbuffer($1); $$ = ($1 == 0) ? 1 : 0; } | varlist1 ',' var { - varbuffer[nvarbuffer] = $3; incr_nvarbuffer(); + add_varbuffer($3); $$ = ($3 == 0) ? $1 + 1 : $1; } ; @@ -720,10 +771,10 @@ singlevar : NAME varexp : var { lua_pushvar($1); } ; -localdeclist : NAME {localvar[nlocalvar]=luaI_findsymbol($1); $$ = 1;} +localdeclist : NAME {store_localvar(luaI_findsymbol($1), 0); $$ = 1;} | localdeclist ',' NAME { - localvar[nlocalvar+$1]=luaI_findsymbol($3); + store_localvar(luaI_findsymbol($3), $1); $$ = $1+1; } ; @@ -732,7 +783,8 @@ decinit : /* empty */ { $$ = 0; } | '=' exprlist1 { $$ = $2; } ; -setdebug : DEBUG {lua_debug = $1;} +setdebug : DEBUG { lua_debug = $1; } + ; %% @@ -788,7 +840,7 @@ static void PrintCode (Byte *code, Byte *end) int n = p-code; p++; get_code(c,p); - printf ("%d PUSHFUNCTION %p\n", n, c.b); + printf ("%d PUSHFUNCTION %p\n", n, c.tf); } break; @@ -944,17 +996,6 @@ static void PrintCode (Byte *code, Byte *end) printf ("%d RETCODE %d\n", p-code, *(++p)); p++; break; - case SETFUNCTION: - { - CodeCode c1; - CodeWord c2; - int n = p-code; - p++; - get_code(c1,p); - get_word(c2,p); - printf ("%d SETFUNCTION %s %d\n", n, (char *)c1.b, c2.w); - } - break; case SETLINE: { CodeWord c; @@ -965,7 +1006,6 @@ static void PrintCode (Byte *code, Byte *end) } break; - case RESET: printf ("%d RESET\n", (p++)-code); break; default: printf ("%d Cannot happen: code %d\n", (p++)-code, *(p-1)); break; } } diff --git a/src/opcode.c b/src/opcode.c index 7ce5b2a6..e4089f01 100644 --- a/src/opcode.c +++ b/src/opcode.c @@ -3,14 +3,14 @@ ** TecCGraf - PUC-Rio */ -char *rcs_opcode="$Id: opcode.c,v 3.34 1995/02/06 19:35:09 roberto Exp $"; +char *rcs_opcode="$Id: opcode.c,v 3.50 1995/11/16 20:46:24 roberto Exp $"; #include <setjmp.h> #include <stdlib.h> #include <stdio.h> #include <string.h> -#include <math.h> +#include "luadebug.h" #include "mem.h" #include "opcode.h" #include "hash.h" @@ -23,13 +23,15 @@ char *rcs_opcode="$Id: opcode.c,v 3.34 1995/02/06 19:35:09 roberto Exp $"; #define tostring(o) ((tag(o) != LUA_T_STRING) && (lua_tostring(o) != 0)) -#define STACK_BUFFER (STACKGAP+128) +#define STACK_SIZE 128 typedef int StkId; /* index to stack elements */ -static Long maxstack = 0L; -static Object *stack = NULL; -static Object *top = NULL; +static Object initial_stack; + +static Object *stackLimit = &initial_stack+1; +static Object *stack = &initial_stack; +static Object *top = &initial_stack; /* macros to convert from lua_Object to (Object *) and back */ @@ -38,6 +40,11 @@ static Object *top = NULL; #define Ref(st) ((st)-stack+1) +/* macro to increment stack top. There must be always an empty slot in +* the stack +*/ +#define incr_top if (++top >= stackLimit) growstack() + static StkId CBase = 0; /* when Lua calls C or C calls Lua, points to */ /* the first slot after the last parameter. */ static int CnResults = 0; /* when Lua calls C, has the number of parameters; */ @@ -47,7 +54,7 @@ static jmp_buf *errorJmp = NULL; /* current error recover point */ static StkId lua_execute (Byte *pc, StkId base); -static void do_call (Object *func, StkId base, int nResults, StkId whereRes); +static void do_call (StkId base, int nResults); @@ -57,61 +64,40 @@ Object *luaI_Address (lua_Object o) } -/* -** Error messages -*/ - -static void lua_message (char *s) -{ - lua_pushstring(s); - do_call(&luaI_fallBacks[FB_ERROR].function, (top-stack)-1, 0, (top-stack)-1); -} - -/* -** Reports an error, and jumps up to the available recover label -*/ -void lua_error (char *s) -{ - if (s) lua_message(s); - if (errorJmp) - longjmp(*errorJmp, 1); - else - { - fprintf (stderr, "lua: exit(1). Unable to recover\n"); - exit(1); - } -} - /* ** Init stack */ static void lua_initstack (void) { - maxstack = STACK_BUFFER; + Long maxstack = STACK_SIZE; stack = newvector(maxstack, Object); + stackLimit = stack+maxstack; top = stack; + *(top++) = initial_stack; } /* ** Check stack overflow and, if necessary, realloc vector */ -#define lua_checkstack(n) if ((Long)(n) > maxstack) checkstack(n) +#define lua_checkstack(nt) if ((nt) >= stackLimit) growstack() -static void checkstack (StkId n) +static void growstack (void) { - StkId t; - if (stack == NULL) + if (stack == &initial_stack) lua_initstack(); - if (maxstack >= MAX_INT) - lua_error("stack size overflow"); - t = top-stack; - maxstack *= 2; - if (maxstack >= MAX_INT) - maxstack = MAX_INT; - stack = growvector(stack, maxstack, Object); - top = stack + t; + else + { + StkId t = top-stack; + Long maxstack = stackLimit - stack; + maxstack *= 2; + stack = growvector(stack, maxstack, Object); + stackLimit = stack+maxstack; + top = stack + t; + if (maxstack >= MAX_WORD/2) + lua_error("stack size overflow"); + } } @@ -184,15 +170,25 @@ static int lua_tostring (Object *obj) */ static void adjust_top (StkId newtop) { - Object *nt = stack+newtop; + Object *nt; + lua_checkstack(stack+newtop); + nt = stack+newtop; /* warning: previous call may change stack */ while (top < nt) tag(top++) = LUA_T_NIL; top = nt; /* top could be bigger than newtop */ } +#define adjustC(nParams) adjust_top(CBase+nParams) + -static void adjustC (int nParams) +/* +** Open a hole below "nelems" from the top. +*/ +static void open_stack (int nelems) { - adjust_top(CBase+nParams); + int i; + for (i=0; i<nelems; i++) + *(top-i) = *(top-i-1); + incr_top; } @@ -217,50 +213,55 @@ static StkId callC (lua_CFunction func, StkId base) } /* -** Call the fallback for invalid functions (see do_call) +** Call the specified fallback, putting it on the stack below its arguments */ -static void call_funcFB (Object *func, StkId base, int nResults, StkId whereRes) +static void callFB (int fb) { - StkId i; - /* open space for first parameter (func) */ - for (i=top-stack; i>base; i--) - stack[i] = stack[i-1]; - top++; - stack[base] = *func; - do_call(&luaI_fallBacks[FB_FUNCTION].function, base, nResults, whereRes); + int nParams = luaI_fallBacks[fb].nParams; + open_stack(nParams); + *(top-nParams-1) = luaI_fallBacks[fb].function; + do_call((top-stack)-nParams, luaI_fallBacks[fb].nResults); } /* ** Call a function (C or Lua). The parameters must be on the stack, -** between [stack+base,top). When returns, the results are on the stack, -** between [stack+whereRes,top). The number of results is nResults, unless -** nResults=MULT_RET. +** between [stack+base,top). The function to be called is at stack+base-1. +** When returns, the results are on the stack, between [stack+base-1,top). +** The number of results is nResults, unless nResults=MULT_RET. */ -static void do_call (Object *func, StkId base, int nResults, StkId whereRes) +static void do_call (StkId base, int nResults) { StkId firstResult; + Object *func = stack+base-1; + int i; if (tag(func) == LUA_T_CFUNCTION) + { + tag(func) = LUA_T_CMARK; firstResult = callC(fvalue(func), base); + } else if (tag(func) == LUA_T_FUNCTION) - firstResult = lua_execute(bvalue(func), base); + { + tag(func) = LUA_T_MARK; + firstResult = lua_execute(func->value.tf->code, base); + } else { /* func is not a function */ - call_funcFB(func, base, nResults, whereRes); + /* Call the fallback for invalid functions */ + open_stack((top-stack)-(base-1)); + stack[base-1] = luaI_fallBacks[FB_FUNCTION].function; + do_call(base, nResults); return; } /* adjust the number of results */ if (nResults != MULT_RET && top - (stack+firstResult) != nResults) adjust_top(firstResult+nResults); - /* move results to the given position */ - if (firstResult != whereRes) - { - int i; - nResults = top - (stack+firstResult); /* actual number of results */ - for (i=0; i<nResults; i++) - *(stack+whereRes+i) = *(stack+firstResult+i); - top -= firstResult-whereRes; - } + /* move results to base-1 (to erase parameters and function) */ + base--; + nResults = top - (stack+firstResult); /* actual number of results */ + for (i=0; i<nResults; i++) + *(stack+base+i) = *(stack+firstResult+i); + top -= firstResult-base; } @@ -271,12 +272,12 @@ static void do_call (Object *func, StkId base, int nResults, StkId whereRes) static void pushsubscript (void) { if (tag(top-2) != LUA_T_ARRAY) - do_call(&luaI_fallBacks[FB_GETTABLE].function, (top-stack)-2, 1, (top-stack)-2); + callFB(FB_GETTABLE); else { Object *h = lua_hashget(avalue(top-2), top-1); if (h == NULL || tag(h) == LUA_T_NIL) - do_call(&luaI_fallBacks[FB_INDEX].function, (top-stack)-2, 1, (top-stack)-2); + callFB(FB_INDEX); else { --top; @@ -292,7 +293,7 @@ static void pushsubscript (void) static void storesubscript (void) { if (tag(top-3) != LUA_T_ARRAY) - do_call(&luaI_fallBacks[FB_SETTABLE].function, (top-stack)-3, 0, (top-stack)-3); + callFB(FB_SETTABLE); else { Object *h = lua_hashdefine (avalue(top-3), top-2); @@ -305,19 +306,63 @@ static void storesubscript (void) /* ** Traverse all objects on stack */ -void lua_travstack (void (*fn)(Object *)) +void lua_travstack (int (*fn)(Object *)) { Object *o; for (o = top-1; o >= stack; o--) - fn (o); + fn (o); } /* -** Execute a protected call. If function is null compiles the pre-set input. -** Leave nResults on the stack. +** Error messages and debug functions +*/ + +static void lua_message (char *s) +{ + lua_pushstring(s); + callFB(FB_ERROR); +} + +/* +** Reports an error, and jumps up to the available recover label */ -static int do_protectedrun (Object *function, int nResults) +void lua_error (char *s) +{ + if (s) lua_message(s); + if (errorJmp) + longjmp(*errorJmp, 1); + else + { + fprintf (stderr, "lua: exit(1). Unable to recover\n"); + exit(1); + } +} + + +lua_Object lua_stackedfunction (int level) +{ + Object *p = top; + while (--p >= stack) + if (p->tag == LUA_T_MARK || p->tag == LUA_T_CMARK) + if (level-- == 0) + return Ref(p); + return LUA_NOOBJECT; +} + + +int lua_currentline (lua_Object func) +{ + Object *f = Address(func); + return (f+1 < top && (f+1)->tag == LUA_T_LINE) ? (f+1)->value.i : -1; +} + + +/* +** Execute a protected call. Assumes that function is at CBase and +** parameters are on top of it. Leave nResults on the stack. +*/ +static int do_protectedrun (int nResults) { jmp_buf myErrorJmp; int status; @@ -326,13 +371,13 @@ static int do_protectedrun (Object *function, int nResults) errorJmp = &myErrorJmp; if (setjmp(myErrorJmp) == 0) { - do_call(function, CBase, nResults, CBase); + do_call(CBase+1, nResults); CnResults = (top-stack) - CBase; /* number of results */ CBase += CnResults; /* incorporate results on the stack */ status = 0; } else - { + { /* an error occurred: restore CBase and top */ CBase = oldCBase; top = stack+CBase; status = 1; @@ -344,27 +389,30 @@ static int do_protectedrun (Object *function, int nResults) static int do_protectedmain (void) { - Byte *code = NULL; + TFunc tf; int status; - StkId oldCBase = CBase; jmp_buf myErrorJmp; jmp_buf *oldErr = errorJmp; errorJmp = &myErrorJmp; + adjustC(1); /* one slot for the pseudo-function */ + stack[CBase].tag = LUA_T_FUNCTION; + stack[CBase].value.tf = &tf; + tf.lineDefined = 0; + tf.fileName = lua_parsedfile; + tf.code = NULL; if (setjmp(myErrorJmp) == 0) { - Object f; - lua_parse(&code); - tag(&f) = LUA_T_FUNCTION; bvalue(&f) = code; - do_call(&f, CBase, 0, CBase); - status = 0; + lua_parse(&tf); + status = do_protectedrun(0); } else + { status = 1; - if (code) - luaI_free(code); + adjustC(0); /* erase extra slot */ + } errorJmp = oldErr; - CBase = oldCBase; - top = stack+CBase; + if (tf.code) + luaI_free(tf.code); return status; } @@ -377,14 +425,20 @@ int lua_callfunction (lua_Object function) if (function == LUA_NOOBJECT) return 1; else - return do_protectedrun (Address(function), MULT_RET); + { + open_stack((top-stack)-CBase); + stack[CBase] = *Address(function); + return do_protectedrun (MULT_RET); + } } int lua_call (char *funcname) { Word n = luaI_findsymbolbyname(funcname); - return do_protectedrun(&s_object(n), MULT_RET); + open_stack((top-stack)-CBase); + stack[CBase] = s_object(n); + return do_protectedrun(MULT_RET); } @@ -413,12 +467,7 @@ int lua_dofile (char *filename) int lua_dostring (char *string) { int status; - char *message = lua_openstring(string); - if (message) - { - lua_message(message); - return 1; - } + lua_openstring(string); status = do_protectedmain(); lua_closestring(); return status; @@ -430,12 +479,15 @@ int lua_dostring (char *string) */ lua_Object lua_setfallback (char *name, lua_CFunction fallback) { - static Object func = {LUA_T_CFUNCTION, luaI_setfallback}; - adjustC(0); + adjustC(1); /* one slot for the pseudo-function */ + stack[CBase].tag = LUA_T_CFUNCTION; + stack[CBase].value.f = luaI_setfallback; lua_pushstring(name); lua_pushcfunction(fallback); - do_protectedrun(&func, 1); - return (Ref(top-1)); + if (do_protectedrun(1) == 0) + return (Ref(top-1)); + else + return LUA_NOOBJECT; } @@ -497,7 +549,7 @@ lua_Object lua_createtable (void) adjustC(0); avalue(top) = lua_createarray(0); tag(top) = LUA_T_ARRAY; - top++; + incr_top; CBase++; /* incorporate object in the stack */ return Ref(top-1); } @@ -519,9 +571,9 @@ lua_Object lua_getparam (int number) */ real lua_getnumber (lua_Object object) { - if (object == LUA_NOOBJECT || tag(Address(object)) == LUA_T_NIL) return 0.0; + if (object == LUA_NOOBJECT) return 0.0; if (tonumber (Address(object))) return 0.0; - else return (nvalue(Address(object))); + else return (nvalue(Address(object))); } /* @@ -529,7 +581,7 @@ real lua_getnumber (lua_Object object) */ char *lua_getstring (lua_Object object) { - if (object == LUA_NOOBJECT || tag(Address(object)) == LUA_T_NIL) return NULL; + if (object == LUA_NOOBJECT) return NULL; if (tostring (Address(object))) return NULL; else return (svalue(Address(object))); } @@ -559,7 +611,7 @@ lua_Object lua_getlocked (int ref) { adjustC(0); *top = *luaI_getlocked(ref); - top++; + incr_top; CBase++; /* incorporate object in the stack */ return Ref(top-1); } @@ -567,9 +619,8 @@ lua_Object lua_getlocked (int ref) void lua_pushlocked (int ref) { - lua_checkstack(top-stack+1); *top = *luaI_getlocked(ref); - top++; + incr_top; } @@ -580,15 +631,16 @@ int lua_lock (void) } + /* -** Get a global object. Return the object handle or NULL on error. +** Get a global object. */ lua_Object lua_getglobal (char *name) { Word n = luaI_findsymbolbyname(name); adjustC(0); *top = s_object(n); - top++; + incr_top; CBase++; /* incorporate object in the stack */ return Ref(top-1); } @@ -608,8 +660,8 @@ void lua_storeglobal (char *name) */ void lua_pushnil (void) { - lua_checkstack(top-stack+1); - tag(top++) = LUA_T_NIL; + tag(top) = LUA_T_NIL; + incr_top; } /* @@ -617,8 +669,8 @@ void lua_pushnil (void) */ void lua_pushnumber (real n) { - lua_checkstack(top-stack+1); - tag(top) = LUA_T_NUMBER; nvalue(top++) = n; + tag(top) = LUA_T_NUMBER; nvalue(top) = n; + incr_top; } /* @@ -626,10 +678,9 @@ void lua_pushnumber (real n) */ void lua_pushstring (char *s) { - lua_checkstack(top-stack+1); tsvalue(top) = lua_createstring(s); tag(top) = LUA_T_STRING; - top++; + incr_top; } /* @@ -637,10 +688,9 @@ void lua_pushstring (char *s) */ void lua_pushliteral (char *s) { - lua_checkstack(top-stack+1); - tsvalue(top) = lua_constant[luaI_findconstant(lua_constcreate(s))]; + tsvalue(top) = lua_constant[luaI_findconstantbyname(s)]; tag(top) = LUA_T_STRING; - top++; + incr_top; } /* @@ -648,8 +698,8 @@ void lua_pushliteral (char *s) */ void lua_pushcfunction (lua_CFunction fn) { - lua_checkstack(top-stack+1); - tag(top) = LUA_T_CFUNCTION; fvalue(top++) = fn; + tag(top) = LUA_T_CFUNCTION; fvalue(top) = fn; + incr_top; } /* @@ -658,8 +708,8 @@ void lua_pushcfunction (lua_CFunction fn) void lua_pushusertag (void *u, int tag) { if (tag < LUA_T_USERDATA) return; - lua_checkstack(top-stack+1); - tag(top) = tag; uvalue(top++) = u; + tag(top) = tag; uvalue(top) = u; + incr_top; } /* @@ -667,8 +717,8 @@ void lua_pushusertag (void *u, int tag) */ void lua_pushobject (lua_Object o) { - lua_checkstack(top-stack+1); - *top++ = *Address(o); + *top = *Address(o); + incr_top; } /* @@ -676,8 +726,8 @@ void lua_pushobject (lua_Object o) */ void luaI_pushobject (Object *o) { - lua_checkstack(top-stack+1); - *top++ = *o; + *top = *o; + incr_top; } int lua_type (lua_Object o) @@ -691,15 +741,16 @@ int lua_type (lua_Object o) void luaI_gcFB (Object *o) { - *(top++) = *o; - do_call(&luaI_fallBacks[FB_GC].function, (top-stack)-1, 0, (top-stack)-1); + *top = *o; + incr_top; + callFB(FB_GC); } static void call_arith (char *op) { lua_pushstring(op); - do_call(&luaI_fallBacks[FB_ARITH].function, (top-stack)-3, 1, (top-stack)-3); + callFB(FB_ARITH); } static void comparison (lua_Type tag_less, lua_Type tag_equal, @@ -713,7 +764,7 @@ static void comparison (lua_Type tag_less, lua_Type tag_equal, else if (tostring(l) || tostring(r)) { lua_pushstring(op); - do_call(&luaI_fallBacks[FB_ORDER].function, (top-stack)-3, 1, (top-stack)-3); + callFB(FB_ORDER); return; } else @@ -732,26 +783,28 @@ static void comparison (lua_Type tag_less, lua_Type tag_equal, */ static StkId lua_execute (Byte *pc, StkId base) { - lua_checkstack(STACKGAP+MAX_TEMPS+base); while (1) { OpCode opcode; switch (opcode = (OpCode)*pc++) { - case PUSHNIL: tag(top++) = LUA_T_NIL; break; + case PUSHNIL: tag(top) = LUA_T_NIL; incr_top; break; case PUSH0: case PUSH1: case PUSH2: tag(top) = LUA_T_NUMBER; - nvalue(top++) = opcode-PUSH0; + nvalue(top) = opcode-PUSH0; + incr_top; break; - case PUSHBYTE: tag(top) = LUA_T_NUMBER; nvalue(top++) = *pc++; break; + case PUSHBYTE: + tag(top) = LUA_T_NUMBER; nvalue(top) = *pc++; incr_top; break; case PUSHWORD: { CodeWord code; get_word(code,pc); - tag(top) = LUA_T_NUMBER; nvalue(top++) = code.w; + tag(top) = LUA_T_NUMBER; nvalue(top) = code.w; + incr_top; } break; @@ -759,7 +812,8 @@ static StkId lua_execute (Byte *pc, StkId base) { CodeFloat code; get_float(code,pc); - tag(top) = LUA_T_NUMBER; nvalue(top++) = code.f; + tag(top) = LUA_T_NUMBER; nvalue(top) = code.f; + incr_top; } break; @@ -767,7 +821,8 @@ static StkId lua_execute (Byte *pc, StkId base) { CodeWord code; get_word(code,pc); - tag(top) = LUA_T_STRING; tsvalue(top++) = lua_constant[code.w]; + tag(top) = LUA_T_STRING; tsvalue(top) = lua_constant[code.w]; + incr_top; } break; @@ -775,22 +830,27 @@ static StkId lua_execute (Byte *pc, StkId base) { CodeCode code; get_code(code,pc); - tag(top) = LUA_T_FUNCTION; bvalue(top++) = code.b; + luaI_insertfunction(code.tf); /* may take part in GC */ + top->tag = LUA_T_FUNCTION; + top->value.tf = code.tf; + incr_top; } break; case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: case PUSHLOCAL3: case PUSHLOCAL4: case PUSHLOCAL5: case PUSHLOCAL6: case PUSHLOCAL7: case PUSHLOCAL8: - case PUSHLOCAL9: *top++ = *((stack+base) + (int)(opcode-PUSHLOCAL0)); break; + case PUSHLOCAL9: + *top = *((stack+base) + (int)(opcode-PUSHLOCAL0)); incr_top; break; - case PUSHLOCAL: *top++ = *((stack+base) + (*pc++)); break; + case PUSHLOCAL: *top = *((stack+base) + (*pc++)); incr_top; break; case PUSHGLOBAL: { CodeWord code; get_word(code,pc); - *top++ = s_object(code.w); + *top = s_object(code.w); + incr_top; } break; @@ -803,9 +863,11 @@ static StkId lua_execute (Byte *pc, StkId base) Object receiver = *(top-1); CodeWord code; get_word(code,pc); - tag(top) = LUA_T_STRING; tsvalue(top++) = lua_constant[code.w]; + tag(top) = LUA_T_STRING; tsvalue(top) = lua_constant[code.w]; + incr_top; pushsubscript(); - *(top++) = receiver; + *top = receiver; + incr_top; break; } @@ -835,11 +897,12 @@ static StkId lua_execute (Byte *pc, StkId base) int n = *pc++; if (tag(top-3-n) != LUA_T_ARRAY) { + lua_checkstack(top+2); *(top+1) = *(top-1); *(top) = *(top-2-n); *(top-1) = *(top-3-n); top += 2; - do_call(&luaI_fallBacks[FB_SETTABLE].function, (top-stack)-3, 0, (top-stack)-3); + callFB(FB_SETTABLE); } else { @@ -899,7 +962,7 @@ static StkId lua_execute (Byte *pc, StkId base) get_word(size,pc); avalue(top) = lua_createarray(size.w); tag(top) = LUA_T_ARRAY; - top++; + incr_top; } break; @@ -993,7 +1056,7 @@ static StkId lua_execute (Byte *pc, StkId base) Object *l = top-2; Object *r = top-1; if (tostring(r) || tostring(l)) - do_call(&luaI_fallBacks[FB_CONCAT].function, (top-stack)-2, 1, (top-stack)-2); + callFB(FB_CONCAT); else { tsvalue(l) = lua_createstring (lua_strconc(svalue(l),svalue(r))); @@ -1005,7 +1068,8 @@ static StkId lua_execute (Byte *pc, StkId base) case MINUSOP: if (tonumber(top-1)) { - tag(top++) = LUA_T_NIL; + tag(top) = LUA_T_NIL; + incr_top; call_arith("unm"); } else @@ -1073,9 +1137,8 @@ static StkId lua_execute (Byte *pc, StkId base) { int nParams = *(pc++); int nResults = *(pc++); - Object *func = top-1-nParams; /* function is below parameters */ StkId newBase = (top-stack)-nParams; - do_call(func, newBase, nResults, newBase-1); + do_call(newBase, nResults); } break; @@ -1085,27 +1148,20 @@ static StkId lua_execute (Byte *pc, StkId base) case RETCODE: return base+*pc; - case SETFUNCTION: - { - CodeCode file; - CodeWord func; - get_code(file,pc); - get_word(func,pc); - lua_pushfunction ((char *)file.b, func.w); - } - break; - case SETLINE: { CodeWord code; get_word(code,pc); - lua_debugline = code.w; + if ((stack+base-1)->tag != LUA_T_LINE) + { + /* open space for LINE value */ + open_stack((top-stack)-base); + base++; + (stack+base-1)->tag = LUA_T_LINE; + } + (stack+base-1)->value.i = code.w; + break; } - break; - - case RESET: - lua_popfunction (); - break; default: lua_error ("internal error - opcode doesn't match"); diff --git a/src/opcode.h b/src/opcode.h index e3a6d37c..5e33c2cf 100644 --- a/src/opcode.h +++ b/src/opcode.h @@ -1,6 +1,6 @@ /* ** TeCGraf - PUC-Rio -** $Id: opcode.h,v 3.10 1994/12/20 21:20:36 roberto Exp $ +** $Id: opcode.h,v 3.14 1995/10/25 13:05:51 roberto Exp $ */ #ifndef opcode_h @@ -9,10 +9,7 @@ #include "lua.h" #include "types.h" #include "tree.h" - -#ifndef STACKGAP -#define STACKGAP 128 -#endif +#include "func.h" #ifndef real #define real float @@ -20,8 +17,6 @@ #define FIELDS_PER_FLUSH 40 -#define MAX_TEMPS 20 - typedef enum { @@ -73,9 +68,7 @@ typedef enum CALLFUNC, RETCODE0, RETCODE, - SETFUNCTION, - SETLINE, - RESET + SETLINE } OpCode; #define MULT_RET 255 @@ -89,9 +82,10 @@ typedef union Cfunction f; real n; TaggedString *ts; - Byte *b; + TFunc *tf; struct Hash *a; void *u; + int i; } Value; typedef struct Object @@ -110,7 +104,6 @@ typedef struct #define nvalue(o) ((o)->value.n) #define svalue(o) ((o)->value.ts->str) #define tsvalue(o) ((o)->value.ts) -#define bvalue(o) ((o)->value.b) #define avalue(o) ((o)->value.a) #define fvalue(o) ((o)->value.f) #define uvalue(o) ((o)->value.u) @@ -120,7 +113,6 @@ typedef struct #define s_tag(i) (tag(&s_object(i))) #define s_nvalue(i) (nvalue(&s_object(i))) #define s_svalue(i) (svalue(&s_object(i))) -#define s_bvalue(i) (bvalue(&s_object(i))) #define s_avalue(i) (avalue(&s_object(i))) #define s_fvalue(i) (fvalue(&s_object(i))) #define s_uvalue(i) (uvalue(&s_object(i))) @@ -143,7 +135,7 @@ typedef union typedef union { struct {char c1; char c2; char c3; char c4;} m; - Byte *b; + TFunc *tf; } CodeCode; #define get_code(code,pc) {code.m.c1 = *pc++; code.m.c2 = *pc++;\ code.m.c3 = *pc++; code.m.c4 = *pc++;} @@ -155,8 +147,9 @@ char *lua_strdup (char *l); void lua_setinput (Input fn); /* from "lex.c" module */ char *lua_lasttext (void); /* from "lex.c" module */ int yylex (void); /* from "lex.c" module */ -void lua_parse (Byte **code); /* from "lua.stx" module */ -void lua_travstack (void (*fn)(Object *)); +void lua_parse (TFunc *tf); /* from "lua.stx" module */ +void luaI_codedebugline (int line); /* from "lua.stx" module */ +void lua_travstack (int (*fn)(Object *)); Object *luaI_Address (lua_Object o); void luaI_pushobject (Object *o); void luaI_gcFB (Object *o); diff --git a/src/parser.c b/src/parser.c index 47b77fb0..6b0dba94 100644 --- a/src/parser.c +++ b/src/parser.c @@ -13,7 +13,7 @@ # line 2 "lua.stx" -char *rcs_luastx = "$Id: lua.stx,v 3.17 1995/01/13 22:11:12 roberto Exp $"; +char *rcs_luastx = "$Id: lua.stx,v 3.25 1995/10/26 17:02:50 roberto Exp $"; #include <stdio.h> #include <stdlib.h> @@ -26,6 +26,7 @@ char *rcs_luastx = "$Id: lua.stx,v 3.17 1995/01/13 22:11:12 roberto Exp $"; #include "tree.h" #include "table.h" #include "lua.h" +#include "func.h" /* to avoid warnings generated by yacc */ int yyparse (void); @@ -49,12 +50,14 @@ static Byte *basepc; static int maincode; static int pc; + #define MAXVAR 32 static Long varbuffer[MAXVAR]; /* variables in an assignment list; it's long to store negative Word values */ static int nvarbuffer=0; /* number of variables at a list */ -static Word localvar[STACKGAP]; /* store local variable names */ +#define MAXLOCALS 32 +static Word localvar[MAXLOCALS]; /* store local variable names */ static int nlocalvar=0; /* number of local variables */ #define MAXFIELDS FIELDS_PER_FLUSH*2 @@ -64,6 +67,14 @@ static int nfields=0; /* Internal functions */ +static void yyerror (char *s) +{ + static char msg[256]; + sprintf (msg,"%s near \"%s\" at line %d in file `%s'", + s, lua_lasttext (), lua_linenumber, lua_parsedfile); + lua_error (msg); +} + static void code_byte (Byte c) { if (pc>maxcurr-2) /* 1 byte free to code HALT of main code */ @@ -96,10 +107,10 @@ static void code_float (float n) code_byte(code.m.c4); } -static void code_code (Byte *b) +static void code_code (TFunc *tf) { CodeCode code; - code.b = b; + code.tf = tf; code_byte(code.m.c1); code_byte(code.m.c2); code_byte(code.m.c3); @@ -116,10 +127,10 @@ static void code_word_at (Byte *p, Word n) static void push_field (Word name) { - if (nfields < STACKGAP-1) + if (nfields < MAXFIELDS) fields[nfields++] = name; else - lua_error ("too many fields in a constructor"); + lua_error ("too many fields in nested constructors"); } static void flush_record (int n) @@ -148,18 +159,26 @@ static void flush_list (int m, int n) code_byte(n); } -static void add_nlocalvar (int n) +static void add_localvar (Word name) { - if (MAX_TEMPS+nlocalvar+MAXVAR+n < STACKGAP) - nlocalvar += n; + if (nlocalvar < MAXLOCALS) + localvar[nlocalvar++] = name; else lua_error ("too many local variables"); } -static void incr_nvarbuffer (void) +static void store_localvar (Word name, int n) { - if (nvarbuffer < MAXVAR-1) - nvarbuffer++; + if (nlocalvar+n < MAXLOCALS) + localvar[nlocalvar+n] = name; + else + lua_error ("too many local variables"); +} + +static void add_varbuffer (Long var) +{ + if (nvarbuffer < MAXVAR) + varbuffer[nvarbuffer++] = var; else lua_error ("variable buffer overflow"); } @@ -238,26 +257,35 @@ static void lua_codeadjust (int n) } } -static void init_function (TreeNode *func) +static void change2main (void) { - if (funcCode == NULL) /* first function */ - { - funcCode = newvector(CODE_BLOCK, Byte); - maxcode = CODE_BLOCK; - } - pc=0; basepc=funcCode; maxcurr=maxcode; - nlocalvar=0; - if (lua_debug) + /* (re)store main values */ + pc=maincode; basepc=*initcode; maxcurr=maxmain; + nlocalvar=0; +} + +static void savemain (void) +{ + /* save main values */ + maincode=pc; *initcode=basepc; maxmain=maxcurr; +} + +static void init_func (void) +{ + if (funcCode == NULL) /* first function */ { - code_byte(SETFUNCTION); - code_code((Byte *)luaI_strdup(lua_file[lua_nfile-1])); - code_word(luaI_findconstant(func)); + funcCode = newvector(CODE_BLOCK, Byte); + maxcode = CODE_BLOCK; } + savemain(); /* save main values */ + /* set func values */ + pc=0; basepc=funcCode; maxcurr=maxcode; + nlocalvar = 0; + luaI_codedebugline(lua_linenumber); } static void codereturn (void) { - if (lua_debug) code_byte(RESET); if (nlocalvar == 0) code_byte(RETCODE0); else @@ -267,49 +295,71 @@ static void codereturn (void) } } -static void codedebugline (void) +void luaI_codedebugline (int line) { - if (lua_debug) + static int lastline = 0; + if (lua_debug && line != lastline) { code_byte(SETLINE); - code_word(lua_linenumber); + code_word(line); + lastline = line; } } -static void adjust_mult_assign (int vars, int exps, int temps) +static int adjust_functioncall (Long exp, int i) { - if (exps < 0) + if (exp <= 0) + return -exp; /* exp is -list length */ + else { - int r = vars - (-exps-1); - if (r >= 0) - code_byte(r); + int temp = basepc[exp]; + basepc[exp] = i; + return temp+i; + } +} + +static void adjust_mult_assign (int vars, Long exps, int temps) +{ + if (exps > 0) + { /* must correct function call */ + int diff = vars - basepc[exps]; + if (diff >= 0) + adjust_functioncall(exps, diff); else { - code_byte(0); + adjust_functioncall(exps, 0); lua_codeadjust(temps); } } - else if (vars != exps) + else if (vars != -exps) lua_codeadjust(temps); } -static void lua_codestore (int i) +static void storesinglevar (Long v) { - if (varbuffer[i] > 0) /* global var */ + if (v > 0) /* global var */ { - code_byte(STOREGLOBAL); - code_word(varbuffer[i]-1); + code_byte(STOREGLOBAL); + code_word(v-1); } - else if (varbuffer[i] < 0) /* local var */ + else if (v < 0) /* local var */ { - int number = (-varbuffer[i]) - 1; - if (number < 10) code_byte(STORELOCAL0 + number); - else - { - code_byte(STORELOCAL); - code_byte(number); - } + int number = (-v) - 1; + if (number < 10) code_byte(STORELOCAL0 + number); + else + { + code_byte(STORELOCAL); + code_byte(number); + } } + else + code_byte(STOREINDEXED0); +} + +static void lua_codestore (int i) +{ + if (varbuffer[i] != 0) /* global or local var */ + storesinglevar(varbuffer[i]); else /* indexed var */ { int j; @@ -345,26 +395,22 @@ static void codeIf (Long thenAdd, Long elseAdd) code_word_at(basepc+thenAdd+1,elseinit-(thenAdd+sizeof(Word)+1)); } -static void yyerror (char *s) -{ - static char msg[256]; - sprintf (msg,"%s near \"%s\" at line %d in file \"%s\"", - s, lua_lasttext (), lua_linenumber, lua_filename()); - lua_error (msg); -} - /* ** Parse LUA code. */ -void lua_parse (Byte **code) +void lua_parse (TFunc *tf) { - initcode = code; + lua_debug = 0; + initcode = &(tf->code); *initcode = newvector(CODE_BLOCK, Byte); maincode = 0; maxmain = CODE_BLOCK; + change2main(); if (yyparse ()) lua_error("parse error"); + savemain(); (*initcode)[maincode++] = RETCODE0; + tf->size = maincode; #if LISTING { static void PrintCode (Byte *c, Byte *end); PrintCode(*initcode,*initcode+maincode); } @@ -373,7 +419,7 @@ void lua_parse (Byte **code) -# line 365 "lua.stx" +# line 411 "lua.stx" typedef union { int vInt; @@ -381,7 +427,7 @@ typedef union char *pChar; Word vWord; Long vLong; - Byte *pByte; + TFunc *pFunc; TreeNode *pNode; } YYSTYPE; # define WRONGTOKEN 257 @@ -421,7 +467,7 @@ extern int yyerrflag; YYSTYPE yylval, yyval; # define YYERRCODE 256 -# line 737 "lua.stx" +# line 789 "lua.stx" #if LISTING @@ -476,7 +522,7 @@ static void PrintCode (Byte *code, Byte *end) int n = p-code; p++; get_code(c,p); - printf ("%d PUSHFUNCTION %p\n", n, c.b); + printf ("%d PUSHFUNCTION %p\n", n, c.tf); } break; @@ -632,17 +678,6 @@ static void PrintCode (Byte *code, Byte *end) printf ("%d RETCODE %d\n", p-code, *(++p)); p++; break; - case SETFUNCTION: - { - CodeCode c1; - CodeWord c2; - int n = p-code; - p++; - get_code(c1,p); - get_word(c2,p); - printf ("%d SETFUNCTION %s %d\n", n, (char *)c1.b, c2.w); - } - break; case SETLINE: { CodeWord c; @@ -653,7 +688,6 @@ static void PrintCode (Byte *code, Byte *end) } break; - case RESET: printf ("%d RESET\n", (p++)-code); break; default: printf ("%d Cannot happen: code %d\n", (p++)-code, *(p-1)); break; } } @@ -663,203 +697,194 @@ static void PrintCode (Byte *code, Byte *end) int yyexca[] ={ -1, 1, 0, -1, - -2, 2, --1, 20, - 61, 91, - 44, 91, - -2, 97, --1, 32, - 40, 66, - 123, 66, - -2, 53, --1, 47, - 123, 63, - -2, 70, --1, 74, - 125, 79, + -2, 0, +-1, 14, + 61, 88, + 44, 88, + -2, 94, +-1, 22, + 40, 7, + -2, 94, +-1, 29, + 40, 59, + 123, 59, + -2, 46, +-1, 44, + 123, 56, -2, 63, --1, 79, - 275, 37, - 276, 37, - 277, 37, - 278, 37, - 62, 37, - 60, 37, - 279, 37, - 280, 37, - 281, 37, - 43, 37, - 45, 37, - 42, 37, - 47, 37, - 94, 37, - -2, 72, --1, 80, - 91, 97, - 46, 97, - -2, 92, --1, 118, - 261, 33, - 262, 33, - 266, 33, - 267, 33, - -2, 16, --1, 133, - 125, 85, +-1, 71, + 123, 56, + -2, 84, +-1, 76, + 275, 30, + 276, 30, + 277, 30, + 278, 30, + 62, 30, + 60, 30, + 279, 30, + 280, 30, + 281, 30, + 43, 30, + 45, 30, + 42, 30, + 47, 30, + 94, 30, + -2, 65, +-1, 77, + 91, 94, + 46, 94, + -2, 89, +-1, 132, + 123, 56, + -2, 78, +-1, 138, + 123, 56, -2, 63, --1, 158, - 123, 63, - -2, 70, --1, 159, - 275, 37, - 276, 37, - 277, 37, - 278, 37, - 62, 37, - 60, 37, - 279, 37, - 280, 37, - 281, 37, - 43, 37, - 45, 37, - 42, 37, - 47, 37, - 94, 37, - -2, 74, +-1, 155, + 275, 30, + 276, 30, + 277, 30, + 278, 30, + 62, 30, + 60, 30, + 279, 30, + 280, 30, + 281, 30, + 43, 30, + 45, 30, + 42, 30, + 47, 30, + 94, 30, + -2, 67, }; -# define YYNPROD 103 -# define YYLAST 351 +# define YYNPROD 100 +# define YYLAST 311 int yyact[]={ - 64, 62, 6, 63, 152, 65, 7, 64, 62, 145, - 63, 120, 65, 92, 64, 62, 89, 63, 57, 65, - 58, 64, 62, 87, 63, 57, 65, 58, 64, 62, - 24, 63, 57, 65, 58, 64, 62, 54, 63, 57, - 65, 58, 45, 10, 29, 142, 57, 171, 58, 30, - 29, 123, 66, 167, 14, 30, 160, 117, 15, 66, - 16, 162, 163, 173, 19, 131, 66, 138, 24, 28, - 112, 114, 130, 66, 74, 71, 8, 64, 66, 52, - 66, 86, 65, 51, 161, 83, 51, 66, 43, 136, - 27, 12, 64, 62, 26, 63, 133, 65, 49, 70, - 135, 119, 84, 125, 124, 42, 72, 122, 109, 32, - 53, 132, 79, 73, 85, 39, 75, 79, 47, 23, - 149, 91, 143, 31, 78, 20, 88, 38, 50, 66, - 11, 50, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 66, 48, 36, 129, 128, 158, - 113, 141, 94, 81, 79, 77, 18, 41, 40, 80, - 139, 13, 9, 118, 90, 93, 121, 25, 5, 4, - 3, 2, 22, 126, 111, 76, 82, 44, 134, 110, - 21, 46, 17, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 140, 0, 0, 0, 0, - 0, 0, 0, 0, 147, 148, 0, 151, 0, 150, - 0, 0, 153, 159, 0, 156, 0, 0, 0, 0, - 164, 107, 108, 0, 0, 0, 0, 0, 79, 116, - 170, 169, 55, 68, 69, 56, 59, 60, 61, 67, - 68, 69, 56, 59, 60, 61, 67, 68, 69, 56, - 59, 60, 61, 67, 68, 69, 56, 59, 60, 61, - 67, 177, 35, 56, 59, 60, 61, 67, 35, 137, - 127, 157, 0, 166, 67, 33, 34, 24, 0, 0, - 146, 33, 34, 115, 0, 0, 0, 37, 0, 0, - 0, 155, 0, 37, 0, 0, 0, 172, 0, 0, - 144, 0, 0, 0, 0, 0, 0, 165, 0, 0, - 0, 0, 0, 154, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 174, 0, 176, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 168, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 175 }; + 61, 59, 148, 60, 141, 62, 118, 61, 59, 90, + 60, 89, 62, 86, 84, 18, 42, 168, 54, 164, + 55, 61, 59, 156, 60, 54, 62, 55, 61, 59, + 115, 60, 73, 62, 157, 61, 59, 19, 60, 54, + 62, 55, 61, 59, 82, 60, 54, 62, 55, 158, + 159, 129, 63, 54, 91, 55, 111, 25, 121, 63, + 54, 109, 55, 127, 26, 61, 59, 26, 60, 27, + 62, 7, 27, 63, 71, 8, 33, 9, 11, 63, + 63, 12, 6, 80, 67, 18, 13, 63, 68, 7, + 48, 40, 4, 8, 63, 9, 24, 76, 138, 12, + 81, 133, 76, 18, 61, 59, 61, 60, 39, 62, + 20, 62, 146, 130, 117, 132, 69, 63, 123, 48, + 104, 105, 122, 70, 124, 120, 72, 106, 48, 50, + 29, 46, 17, 44, 128, 47, 85, 23, 83, 76, + 51, 28, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 88, 140, 63, 45, 63, 36, + 112, 14, 131, 139, 47, 35, 22, 151, 126, 134, + 125, 78, 137, 47, 153, 74, 38, 37, 75, 142, + 116, 5, 3, 154, 2, 49, 21, 147, 16, 87, + 152, 165, 163, 11, 110, 108, 76, 155, 145, 160, + 77, 79, 41, 171, 135, 107, 162, 173, 161, 136, + 15, 43, 10, 167, 143, 144, 1, 0, 169, 0, + 119, 149, 150, 0, 170, 0, 172, 0, 0, 0, + 0, 0, 0, 65, 66, 53, 56, 57, 58, 64, + 65, 66, 53, 56, 57, 58, 64, 17, 166, 0, + 114, 0, 0, 52, 65, 66, 53, 56, 57, 58, + 64, 65, 66, 53, 56, 57, 58, 64, 65, 66, + 53, 56, 57, 58, 64, 0, 14, 53, 56, 57, + 58, 64, 32, 0, 0, 32, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 30, 31, 18, 30, 31, + 113, 0, 0, 0, 64, 0, 0, 34, 0, 0, + 34 }; int yypact[]={ - -1000, -268, -1000, -1000, -1000, -1000, -230, -1000, 32, -205, - 36, -1000, -1000, -1000, 4, -1000, -1000, 44, -1000, -231, - -1000, 78, -1000, 40, -1000, 70, -236, -28, -1000, 4, - 4, -1000, 40, -1000, -1000, -1000, -1000, 4, -49, -1000, - 4, -1000, 4, -243, 41, -1000, -1000, 4, -1000, -250, - 4, -257, -1000, -260, -1000, -1000, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, -1000, -1000, - 67, -21, -16, -16, 10, -35, -209, -1000, 57, -1000, - -1000, 37, -1000, -262, 4, 66, 57, -1000, -42, -1000, - 63, 59, -1000, 70, -1000, -7, -7, -7, -7, -7, - -7, 35, 35, -16, -16, -16, 50, -1000, -1000, -1000, - -53, 52, 56, -21, -1000, 28, -1000, -1000, -223, -1000, - -1000, 57, -1000, -1000, -1000, -264, -1000, -1000, 4, 4, - -1000, -1000, -1000, 4, -1000, -269, 4, -1000, -1000, 4, - 32, -1000, -1000, 4, -211, -1000, -200, -14, -14, -269, - -21, -1000, 28, -21, -1000, -1000, -21, -1000, 4, -1000, - -1000, -214, -1000, -1000, 56, -220, 32, -1000, -1000, -197, - -1000, -1000, -1000, -1000, -1000, -1000, -200, -1000 }; + -1000, -188, -1000, -1000, 51, -1000, -258, 24, -1000, -1000, + 47, -1000, -257, -1000, -1000, 93, -1000, 73, -1000, -1000, + -1000, 89, -1000, 82, -7, -1000, 24, 24, -1000, 73, + -1000, -1000, -1000, -1000, 24, -49, -1000, 24, -1000, 24, + -258, 39, -1000, -1000, 24, -1000, -259, 24, -260, -1000, + -262, -264, -1000, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, -1000, -1000, 86, -21, -15, + -15, 27, -14, -236, -1000, 70, -1000, -1000, 44, -1000, + -267, 24, 84, 70, -1000, -35, -1000, 81, 74, -1000, + -1000, -1000, 23, 23, 23, 23, 23, 23, 64, 64, + -15, -15, -15, 62, -1000, -1000, -1000, -62, -1000, 69, + 71, -1000, -21, 40, -1000, 24, -170, -1000, -1000, 70, + -1000, -1000, -1000, -269, -1000, 24, 24, -1000, 53, -1000, + -271, -1000, 24, 24, -1000, -21, 51, -1000, 24, 24, + -244, -1000, -212, 0, 0, -1000, -271, -1000, 40, -21, + -21, -1000, -1000, -1000, 51, -1000, -1000, -248, -1000, 24, + -1000, 69, -250, -1000, -1000, -1000, -42, -1000, -1000, -1000, + -1000, -1000, -212, -1000 }; int yypgo[]={ - 0, 183, 152, 69, 114, 81, 182, 181, 180, 179, - 177, 176, 70, 174, 115, 172, 79, 171, 76, 130, - 170, 169, 168, 167, 165, 164, 175, 163, 162, 161, - 67, 160, 75, 84, 158, 157, 146, 155, 151, 149, - 123, 109, 148, 147, 127, 122, 121, 65, 120, 71 }; + 0, 216, 54, 44, 138, 76, 57, 212, 211, 210, + 205, 202, 201, 199, 61, 198, 195, 194, 189, 159, + 188, 186, 185, 184, 182, 92, 37, 181, 130, 32, + 180, 88, 34, 177, 176, 175, 172, 141, 170, 168, + 165, 163, 154, 134, 51, 56 }; int yyr1[]={ - 0, 1, 17, 1, 1, 1, 1, 23, 20, 24, - 21, 16, 27, 27, 19, 19, 28, 18, 31, 30, - 29, 34, 29, 35, 29, 29, 29, 29, 33, 33, - 33, 37, 26, 38, 39, 38, 2, 32, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 42, - 3, 43, 3, 44, 40, 36, 8, 8, 7, 7, - 4, 4, 5, 45, 5, 25, 25, 46, 46, 9, - 9, 9, 48, 9, 47, 47, 12, 12, 49, 13, - 13, 6, 6, 14, 14, 14, 15, 41, 10, 10, - 11, 11, 22 }; + 0, 1, 1, 1, 23, 23, 24, 21, 21, 22, + 30, 30, 26, 26, 25, 33, 25, 34, 25, 25, + 25, 25, 32, 32, 32, 35, 29, 36, 36, 2, + 31, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 38, 6, 39, 6, 40, 37, 5, 9, + 9, 8, 8, 3, 3, 4, 41, 4, 18, 18, + 42, 42, 43, 10, 10, 15, 15, 44, 44, 13, + 13, 14, 14, 45, 16, 16, 17, 17, 7, 7, + 19, 19, 19, 20, 28, 11, 11, 12, 12, 27 }; int yyr2[]={ - 0, 0, 1, 9, 4, 4, 4, 1, 9, 1, - 13, 11, 0, 6, 0, 2, 1, 4, 1, 4, - 17, 1, 17, 1, 13, 7, 3, 7, 0, 4, - 15, 1, 7, 0, 1, 9, 1, 3, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 5, 3, 3, 3, 3, 3, 3, 5, 1, - 11, 1, 11, 1, 9, 5, 3, 7, 7, 3, - 1, 3, 3, 1, 9, 1, 3, 3, 7, 1, - 5, 5, 1, 11, 0, 2, 3, 7, 7, 3, - 7, 3, 7, 3, 9, 7, 3, 3, 3, 7, - 1, 5, 3 }; + 0, 0, 4, 4, 4, 2, 7, 3, 7, 11, + 0, 6, 0, 2, 17, 1, 17, 1, 13, 7, + 2, 7, 0, 4, 15, 1, 7, 0, 7, 1, + 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 5, 3, 3, 3, 3, 3, + 3, 5, 1, 11, 1, 11, 1, 9, 5, 3, + 7, 7, 3, 1, 3, 3, 1, 9, 1, 3, + 3, 7, 1, 7, 5, 1, 5, 0, 2, 1, + 5, 3, 7, 7, 1, 5, 3, 7, 3, 7, + 3, 9, 7, 3, 3, 3, 7, 1, 5, 3 }; int yychk[]={ - -1000, -1, -17, -20, -21, -22, 270, 274, -18, -28, - 273, -19, 59, -29, 259, 263, 265, -6, -36, 269, - -14, -8, -15, -41, 273, -23, 58, -32, -3, 40, - 45, -40, -41, 271, 272, 258, -36, 283, -44, -14, - -34, -35, 61, 44, -10, 273, -7, 40, -40, 58, - 91, 46, -16, 40, 273, 260, 277, 60, 62, 278, - 279, 280, 43, 45, 42, 47, 94, 281, 275, 276, - -3, -32, -32, -32, 123, -32, -26, -37, -5, -3, - -14, -41, -11, 44, 61, -4, -5, 273, -32, 273, - -25, -46, 273, -24, -2, -32, -32, -32, -32, -32, - -32, -32, -32, -32, -32, -32, -32, -2, -2, 41, - -9, -13, -12, -32, -49, 273, 264, 266, -27, 44, - 273, -5, 41, 93, 41, 44, -16, -26, -42, -43, - 125, -47, 59, 44, -47, 44, 61, -2, -30, -31, - -18, -38, 268, -45, -26, 273, -2, -32, -32, -48, - -32, -49, 273, -32, -26, -2, -32, -19, -39, -3, - 267, -33, 261, 262, -12, -2, -4, 267, -26, -30, - -47, 267, -19, 260, -2, -26, -2, -33 }; + -1000, -1, -23, -24, -25, -27, 270, 259, 263, 265, + -7, -5, 269, 274, -19, -9, -20, -28, 273, -26, + 59, -21, -19, -28, -31, -6, 40, 45, -37, -28, + 271, 272, 258, -5, 283, -40, -19, -33, -34, 61, + 44, -11, 273, -8, 40, -37, 58, 91, 46, -22, + 40, 58, 260, 277, 60, 62, 278, 279, 280, 43, + 45, 42, 47, 94, 281, 275, 276, -6, -31, -31, + -31, 123, -31, -29, -35, -4, -6, -19, -28, -12, + 44, 61, -3, -4, 273, -31, 273, -18, -42, 273, + 273, -2, -31, -31, -31, -31, -31, -31, -31, -31, + -31, -31, -31, -31, -2, -2, 41, -10, -16, -14, + -17, -45, -31, 273, 264, 266, -30, 44, 273, -4, + 41, 93, 41, 44, -29, -38, -39, 125, -43, -44, + 44, -44, 44, 61, -2, -31, -25, -36, 268, -41, + -29, 273, -2, -31, -31, -15, 59, -45, 273, -31, + -31, -29, -2, -26, -3, -6, 267, -32, 261, 262, + -13, -14, -2, -26, 267, -29, -31, -44, 267, 260, + -2, -29, -2, -32 }; int yydef[]={ - 1, -2, 16, 4, 5, 6, 0, 102, 14, 0, - 7, 3, 15, 17, 63, 21, 23, 0, 26, 0, - -2, 63, 93, 66, 96, 0, 0, 0, 37, 63, - 63, 52, -2, 54, 55, 56, 57, 63, 0, 97, - 63, 31, 63, 0, 100, 98, 65, -2, 69, 0, - 63, 0, 8, 75, 9, 36, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63, 63, 36, 36, - 37, 0, 51, 58, -2, 0, 0, 12, 25, -2, - -2, 0, 27, 0, 63, 0, 71, 67, 0, 95, - 0, 76, 77, 0, 31, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 59, 61, 38, - 0, 84, 84, 89, 86, 96, 36, 18, -2, 73, - 99, 101, 68, 94, 31, 0, 10, 36, 63, 63, - 64, 80, 82, -2, 81, 85, 63, 31, 36, 63, - 14, 32, 34, 63, 0, 78, 28, 60, 62, 0, - 90, 87, 0, 88, 36, 24, 19, 13, -2, -2, - 11, 0, 31, 18, 84, 0, 14, 20, 29, 0, - 83, 22, 35, 36, 31, 36, 28, 30 }; + 1, -2, 2, 3, 12, 5, 0, 56, 15, 17, + 0, 20, 0, 99, -2, 56, 90, 59, 93, 4, + 13, 0, -2, 0, 0, 30, 56, 56, 45, -2, + 47, 48, 49, 50, 56, 0, 94, 56, 25, 56, + 0, 97, 95, 58, -2, 62, 0, 56, 0, 6, + 68, 0, 29, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 29, 29, 30, 0, 44, + 51, -2, 0, 0, 10, 19, -2, -2, 0, 21, + 0, 56, 0, 64, 60, 0, 92, 0, 69, 70, + 8, 25, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 52, 54, 31, 0, 72, 77, + 77, 81, 86, 93, 29, 56, 27, 66, 96, 98, + 61, 91, 25, 0, 29, 56, 56, 57, 75, 74, + 78, 85, -2, 56, 25, 29, 12, 26, -2, 56, + 0, 71, 22, 53, 55, 73, 79, 82, 0, 87, + 83, 29, 18, 11, 12, -2, 9, 0, 25, 56, + 76, 77, 0, 28, 14, 23, 0, 80, 16, 29, + 25, 29, 22, 24 }; typedef struct { char *t_name; int t_val; } yytoktype; #ifndef YYDEBUG # define YYDEBUG 0 /* don't allow debugging */ @@ -910,39 +935,32 @@ char * yyreds[] = { "-no such reduction-", "functionlist : /* empty */", - "functionlist : functionlist", - "functionlist : functionlist stat sc", + "functionlist : functionlist globalstat", "functionlist : functionlist function", - "functionlist : functionlist method", - "functionlist : functionlist setdebug", - "function : FUNCTION NAME", - "function : FUNCTION NAME body", - "method : FUNCTION NAME ':' NAME", - "method : FUNCTION NAME ':' NAME body", + "globalstat : stat sc", + "globalstat : setdebug", + "function : FUNCTION funcname body", + "funcname : var", + "funcname : varexp ':' NAME", "body : '(' parlist ')' block END", "statlist : /* empty */", "statlist : statlist stat sc", "sc : /* empty */", "sc : ';'", - "stat : /* empty */", - "stat : stat1", - "cond : /* empty */", - "cond : expr1", - "stat1 : IF expr1 THEN PrepJump block PrepJump elsepart END", - "stat1 : WHILE", - "stat1 : WHILE expr1 DO PrepJump block PrepJump END", - "stat1 : REPEAT", - "stat1 : REPEAT block UNTIL cond PrepJump", - "stat1 : varlist1 '=' exprlist1", - "stat1 : functioncall", - "stat1 : LOCAL localdeclist decinit", + "stat : IF expr1 THEN PrepJump block PrepJump elsepart END", + "stat : WHILE", + "stat : WHILE expr1 DO PrepJump block PrepJump END", + "stat : REPEAT", + "stat : REPEAT block UNTIL expr1 PrepJump", + "stat : varlist1 '=' exprlist1", + "stat : functioncall", + "stat : LOCAL localdeclist decinit", "elsepart : /* empty */", "elsepart : ELSE block", - "elsepart : ELSEIF cond THEN PrepJump block PrepJump elsepart", + "elsepart : ELSEIF expr1 THEN PrepJump block PrepJump elsepart", "block : /* empty */", "block : statlist ret", "ret : /* empty */", - "ret : RETURN", "ret : RETURN exprlist sc", "PrepJump : /* empty */", "expr1 : expr", @@ -987,16 +1005,20 @@ char * yyreds[] = "parlist : parlist1", "parlist1 : NAME", "parlist1 : parlist1 ',' NAME", - "fieldlist : /* empty */", - "fieldlist : lfieldlist1 lastcomma", + "fieldlist : lfieldlist", + "fieldlist : lfieldlist semicolonpart", "fieldlist : ffieldlist1 lastcomma", - "fieldlist : lfieldlist1 ';'", - "fieldlist : lfieldlist1 ';' ffieldlist1 lastcomma", + "semicolonpart : /* empty */", + "semicolonpart : ';' ffieldlist", "lastcomma : /* empty */", "lastcomma : ','", + "ffieldlist : /* empty */", + "ffieldlist : ffieldlist1 lastcomma", "ffieldlist1 : ffield", "ffieldlist1 : ffieldlist1 ',' ffield", "ffield : NAME '=' expr1", + "lfieldlist : /* empty */", + "lfieldlist : lfieldlist1 lastcomma", "lfieldlist1 : expr1", "lfieldlist1 : lfieldlist1 ',' expr1", "varlist1 : var", @@ -1507,118 +1529,90 @@ $vars */ switch( yytmp ) { -case 2: -# line 411 "lua.stx" -{ - pc=maincode; basepc=*initcode; maxcurr=maxmain; - nlocalvar=0; - } break; -case 3: -# line 416 "lua.stx" -{ - maincode=pc; *initcode=basepc; maxmain=maxcurr; - } break; -case 7: -# line 425 "lua.stx" -{ - init_function(yypvt[-0].pNode); - } break; -case 8: -# line 429 "lua.stx" +case 6: +# line 470 "lua.stx" { - Word func = luaI_findsymbol(yypvt[-2].pNode); - s_tag(func) = LUA_T_FUNCTION; - s_bvalue(func) = yypvt[-0].pByte; + code_byte(PUSHFUNCTION); + code_code(yypvt[-0].pFunc); + storesinglevar(yypvt[-1].vLong); } break; -case 9: -# line 437 "lua.stx" -{ - init_function(yypvt[-0].pNode); - localvar[nlocalvar]=luaI_findsymbolbyname("self"); - add_nlocalvar(1); - } break; -case 10: -# line 443 "lua.stx" +case 7: +# line 477 "lua.stx" +{ yyval.vLong =yypvt[-0].vLong; init_func(); } break; +case 8: +# line 479 "lua.stx" { - /* assign function to table field */ - pc=maincode; basepc=*initcode; maxcurr=maxmain; - nlocalvar=0; - lua_pushvar(luaI_findsymbol(yypvt[-4].pNode)+1); - code_byte(PUSHSTRING); - code_word(luaI_findconstant(yypvt[-2].pNode)); - code_byte(PUSHFUNCTION); - code_code(yypvt[-0].pByte); - code_byte(STOREINDEXED0); - maincode=pc; *initcode=basepc; maxmain=maxcurr; - } break; -case 11: -# line 458 "lua.stx" + code_byte(PUSHSTRING); + code_word(luaI_findconstant(yypvt[-0].pNode)); + yyval.vLong = 0; /* indexed variable */ + init_func(); + add_localvar(luaI_findsymbolbyname("self")); + } break; +case 9: +# line 489 "lua.stx" { codereturn(); - yyval.pByte = newvector(pc, Byte); - memcpy(yyval.pByte, basepc, pc*sizeof(Byte)); + yyval.pFunc = new(TFunc); + yyval.pFunc->size = pc; + yyval.pFunc->code = newvector(pc, Byte); + yyval.pFunc->fileName = lua_parsedfile; + yyval.pFunc->lineDefined = yypvt[-3].vInt; + memcpy(yyval.pFunc->code, basepc, pc*sizeof(Byte)); + /* save func values */ funcCode = basepc; maxcode=maxcurr; #if LISTING PrintCode(funcCode,funcCode+pc); #endif + change2main(); /* change back to main code */ } break; -case 16: -# line 475 "lua.stx" -{ codedebugline(); } break; -case 18: -# line 477 "lua.stx" -{ codedebugline(); } break; -case 20: -# line 480 "lua.stx" +case 14: +# line 513 "lua.stx" { codeIf(yypvt[-4].vLong, yypvt[-2].vLong); } break; -case 21: -# line 482 "lua.stx" +case 15: +# line 515 "lua.stx" {yyval.vLong=pc;} break; -case 22: -# line 483 "lua.stx" +case 16: +# line 516 "lua.stx" { basepc[yypvt[-3].vLong] = IFFJMP; code_word_at(basepc+yypvt[-3].vLong+1, pc - (yypvt[-3].vLong + sizeof(Word)+1)); basepc[yypvt[-1].vLong] = UPJMP; code_word_at(basepc+yypvt[-1].vLong+1, pc - (yypvt[-6].vLong)); } break; -case 23: -# line 490 "lua.stx" +case 17: +# line 523 "lua.stx" {yyval.vLong=pc;} break; -case 24: -# line 491 "lua.stx" +case 18: +# line 524 "lua.stx" { basepc[yypvt[-0].vLong] = IFFUPJMP; code_word_at(basepc+yypvt[-0].vLong+1, pc - (yypvt[-4].vLong)); } break; -case 25: -# line 497 "lua.stx" +case 19: +# line 530 "lua.stx" { { int i; - adjust_mult_assign(nvarbuffer, yypvt[-0].vInt, yypvt[-2].vInt * 2 + nvarbuffer); + adjust_mult_assign(nvarbuffer, yypvt[-0].vLong, yypvt[-2].vInt * 2 + nvarbuffer); for (i=nvarbuffer-1; i>=0; i--) lua_codestore (i); if (yypvt[-2].vInt > 1 || (yypvt[-2].vInt == 1 && varbuffer[0] != 0)) lua_codeadjust (0); } } break; -case 26: -# line 507 "lua.stx" -{ code_byte(0); } break; -case 27: -# line 509 "lua.stx" -{ add_nlocalvar(yypvt[-1].vInt); +case 21: +# line 542 "lua.stx" +{ nlocalvar += yypvt[-1].vInt; adjust_mult_assign(yypvt[-1].vInt, yypvt[-0].vInt, 0); - } break; -case 30: -# line 517 "lua.stx" + } break; +case 24: +# line 550 "lua.stx" { codeIf(yypvt[-3].vLong, yypvt[-1].vLong); } break; -case 31: -# line 520 "lua.stx" +case 25: +# line 553 "lua.stx" {yyval.vInt = nlocalvar;} break; -case 32: -# line 521 "lua.stx" +case 26: +# line 554 "lua.stx" { if (nlocalvar != yypvt[-2].vInt) { @@ -1626,247 +1620,263 @@ case 32: lua_codeadjust (0); } } break; -case 34: -# line 531 "lua.stx" -{ codedebugline(); } break; -case 35: -# line 532 "lua.stx" +case 28: +# line 565 "lua.stx" { - if (yypvt[-1].vInt < 0) code_byte(MULT_RET); + adjust_functioncall(yypvt[-1].vLong, MULT_RET); codereturn(); } break; -case 36: -# line 539 "lua.stx" +case 29: +# line 572 "lua.stx" { yyval.vLong = pc; code_byte(0); /* open space */ code_word (0); } break; +case 30: +# line 578 "lua.stx" +{ adjust_functioncall(yypvt[-0].vLong, 1); } break; +case 31: +# line 581 "lua.stx" +{ yyval.vLong = yypvt[-1].vLong; } break; +case 32: +# line 582 "lua.stx" +{ code_byte(EQOP); yyval.vLong = 0; } break; +case 33: +# line 583 "lua.stx" +{ code_byte(LTOP); yyval.vLong = 0; } break; +case 34: +# line 584 "lua.stx" +{ code_byte(GTOP); yyval.vLong = 0; } break; +case 35: +# line 585 "lua.stx" +{ code_byte(EQOP); code_byte(NOTOP); yyval.vLong = 0; } break; +case 36: +# line 586 "lua.stx" +{ code_byte(LEOP); yyval.vLong = 0; } break; case 37: -# line 545 "lua.stx" -{ if (yypvt[-0].vInt == 0) code_byte(1); } break; +# line 587 "lua.stx" +{ code_byte(GEOP); yyval.vLong = 0; } break; case 38: -# line 548 "lua.stx" -{ yyval.vInt = yypvt[-1].vInt; } break; +# line 588 "lua.stx" +{ code_byte(ADDOP); yyval.vLong = 0; } break; case 39: -# line 549 "lua.stx" -{ code_byte(EQOP); yyval.vInt = 1; } break; +# line 589 "lua.stx" +{ code_byte(SUBOP); yyval.vLong = 0; } break; case 40: -# line 550 "lua.stx" -{ code_byte(LTOP); yyval.vInt = 1; } break; +# line 590 "lua.stx" +{ code_byte(MULTOP); yyval.vLong = 0; } break; case 41: -# line 551 "lua.stx" -{ code_byte(GTOP); yyval.vInt = 1; } break; +# line 591 "lua.stx" +{ code_byte(DIVOP); yyval.vLong = 0; } break; case 42: -# line 552 "lua.stx" -{ code_byte(EQOP); code_byte(NOTOP); yyval.vInt = 1; } break; +# line 592 "lua.stx" +{ code_byte(POWOP); yyval.vLong = 0; } break; case 43: -# line 553 "lua.stx" -{ code_byte(LEOP); yyval.vInt = 1; } break; +# line 593 "lua.stx" +{ code_byte(CONCOP); yyval.vLong = 0; } break; case 44: -# line 554 "lua.stx" -{ code_byte(GEOP); yyval.vInt = 1; } break; +# line 594 "lua.stx" +{ code_byte(MINUSOP); yyval.vLong = 0;} break; case 45: -# line 555 "lua.stx" -{ code_byte(ADDOP); yyval.vInt = 1; } break; +# line 595 "lua.stx" +{ yyval.vLong = 0; } break; case 46: -# line 556 "lua.stx" -{ code_byte(SUBOP); yyval.vInt = 1; } break; +# line 596 "lua.stx" +{ yyval.vLong = 0;} break; case 47: -# line 557 "lua.stx" -{ code_byte(MULTOP); yyval.vInt = 1; } break; +# line 597 "lua.stx" +{ code_number(yypvt[-0].vFloat); yyval.vLong = 0; } break; case 48: -# line 558 "lua.stx" -{ code_byte(DIVOP); yyval.vInt = 1; } break; -case 49: -# line 559 "lua.stx" -{ code_byte(POWOP); yyval.vInt = 1; } break; -case 50: -# line 560 "lua.stx" -{ code_byte(CONCOP); yyval.vInt = 1; } break; -case 51: -# line 561 "lua.stx" -{ code_byte(MINUSOP); yyval.vInt = 1;} break; -case 52: -# line 562 "lua.stx" -{ yyval.vInt = 1; } break; -case 53: -# line 563 "lua.stx" -{ yyval.vInt = 1;} break; -case 54: -# line 564 "lua.stx" -{ code_number(yypvt[-0].vFloat); yyval.vInt = 1; } break; -case 55: -# line 566 "lua.stx" +# line 599 "lua.stx" { code_byte(PUSHSTRING); code_word(yypvt[-0].vWord); - yyval.vInt = 1; + yyval.vLong = 0; } break; -case 56: -# line 571 "lua.stx" -{code_byte(PUSHNIL); yyval.vInt = 1; } break; -case 57: -# line 572 "lua.stx" -{ yyval.vInt = 0; } break; -case 58: -# line 573 "lua.stx" -{ code_byte(NOTOP); yyval.vInt = 1;} break; -case 59: -# line 574 "lua.stx" +case 49: +# line 604 "lua.stx" +{code_byte(PUSHNIL); yyval.vLong = 0; } break; +case 50: +# line 605 "lua.stx" +{ yyval.vLong = yypvt[-0].vLong; } break; +case 51: +# line 606 "lua.stx" +{ code_byte(NOTOP); yyval.vLong = 0;} break; +case 52: +# line 607 "lua.stx" {code_byte(POP); } break; -case 60: -# line 575 "lua.stx" +case 53: +# line 608 "lua.stx" { basepc[yypvt[-2].vLong] = ONFJMP; code_word_at(basepc+yypvt[-2].vLong+1, pc - (yypvt[-2].vLong + sizeof(Word)+1)); - yyval.vInt = 1; + yyval.vLong = 0; } break; -case 61: -# line 580 "lua.stx" +case 54: +# line 613 "lua.stx" {code_byte(POP); } break; -case 62: -# line 581 "lua.stx" +case 55: +# line 614 "lua.stx" { basepc[yypvt[-2].vLong] = ONTJMP; code_word_at(basepc+yypvt[-2].vLong+1, pc - (yypvt[-2].vLong + sizeof(Word)+1)); - yyval.vInt = 1; + yyval.vLong = 0; } break; -case 63: -# line 589 "lua.stx" +case 56: +# line 622 "lua.stx" { code_byte(CREATEARRAY); yyval.vLong = pc; code_word(0); } break; -case 64: -# line 594 "lua.stx" +case 57: +# line 627 "lua.stx" { code_word_at(basepc+yypvt[-3].vLong, yypvt[-1].vInt); } break; -case 65: -# line 600 "lua.stx" -{ code_byte(CALLFUNC); code_byte(yypvt[-1].vInt+yypvt[-0].vInt); } break; -case 66: -# line 603 "lua.stx" +case 58: +# line 633 "lua.stx" +{ + code_byte(CALLFUNC); + code_byte(yypvt[-1].vInt+yypvt[-0].vInt); + yyval.vLong = pc; + code_byte(0); /* may be modified by other rules */ + } break; +case 59: +# line 641 "lua.stx" { yyval.vInt = 0; } break; -case 67: -# line 605 "lua.stx" +case 60: +# line 643 "lua.stx" { code_byte(PUSHSELF); code_word(luaI_findconstant(yypvt[-0].pNode)); yyval.vInt = 1; } break; +case 61: +# line 651 "lua.stx" +{ yyval.vInt = adjust_functioncall(yypvt[-1].vLong, 1); } break; +case 62: +# line 652 "lua.stx" +{ yyval.vInt = 1; } break; +case 63: +# line 655 "lua.stx" +{ yyval.vLong = 0; } break; +case 64: +# line 656 "lua.stx" +{ yyval.vLong = yypvt[-0].vLong; } break; +case 65: +# line 659 "lua.stx" +{ if (yypvt[-0].vLong != 0) yyval.vLong = yypvt[-0].vLong; else yyval.vLong = -1; } break; +case 66: +# line 660 "lua.stx" +{ yyval.vLong = adjust_functioncall(yypvt[-1].vLong, 1); } break; +case 67: +# line 661 "lua.stx" +{ + if (yypvt[-0].vLong == 0) yyval.vLong = -(yypvt[-1].vLong + 1); /* -length */ + else + { + adjust_functioncall(yypvt[-0].vLong, yypvt[-1].vLong); + yyval.vLong = yypvt[-0].vLong; + } + } break; case 68: -# line 613 "lua.stx" -{ if (yypvt[-1].vInt<0) { code_byte(1); yyval.vInt = -yypvt[-1].vInt; } else yyval.vInt = yypvt[-1].vInt; } break; +# line 671 "lua.stx" +{ lua_codeadjust(0); yyval.vInt = lua_linenumber; } break; case 69: -# line 614 "lua.stx" -{ yyval.vInt = 1; } break; +# line 672 "lua.stx" +{ lua_codeadjust(0); yyval.vInt = lua_linenumber; } break; case 70: -# line 617 "lua.stx" -{ yyval.vInt = 0; } break; +# line 676 "lua.stx" +{ + add_localvar(luaI_findsymbol(yypvt[-0].pNode)); + } break; case 71: -# line 618 "lua.stx" -{ yyval.vInt = yypvt[-0].vInt; } break; +# line 680 "lua.stx" +{ + add_localvar(luaI_findsymbol(yypvt[-0].pNode)); + } break; case 72: -# line 621 "lua.stx" -{ if (yypvt[-0].vInt == 0) yyval.vInt = -1; else yyval.vInt = 1; } break; +# line 686 "lua.stx" +{ flush_list(yypvt[-0].vInt/FIELDS_PER_FLUSH, yypvt[-0].vInt%FIELDS_PER_FLUSH); } break; case 73: -# line 622 "lua.stx" -{ if (yypvt[-1].vInt < 0) code_byte(1); } break; +# line 688 "lua.stx" +{ yyval.vInt = yypvt[-2].vInt+yypvt[-0].vInt; } break; case 74: -# line 623 "lua.stx" -{ - int r = yypvt[-3].vInt < 0 ? -yypvt[-3].vInt : yypvt[-3].vInt; - yyval.vInt = (yypvt[-0].vInt == 0) ? -(r+1) : r+1; - } break; +# line 690 "lua.stx" +{ yyval.vInt = yypvt[-1].vInt; flush_record(yypvt[-1].vInt%FIELDS_PER_FLUSH); } break; case 75: -# line 629 "lua.stx" -{ lua_codeadjust(0); } break; +# line 694 "lua.stx" +{ yyval.vInt = 0; } break; case 76: -# line 630 "lua.stx" -{ lua_codeadjust(0); } break; -case 77: -# line 634 "lua.stx" -{ - localvar[nlocalvar]=luaI_findsymbol(yypvt[-0].pNode); - add_nlocalvar(1); - } break; -case 78: -# line 639 "lua.stx" -{ - localvar[nlocalvar]=luaI_findsymbol(yypvt[-0].pNode); - add_nlocalvar(1); - } break; +# line 696 "lua.stx" +{ yyval.vInt = yypvt[-0].vInt; flush_record(yypvt[-0].vInt%FIELDS_PER_FLUSH); } break; case 79: -# line 645 "lua.stx" -{ yyval.vInt = 0; } break; +# line 703 "lua.stx" +{ yyval.vInt = 0; } break; case 80: -# line 647 "lua.stx" -{ yyval.vInt = yypvt[-1].vInt; flush_list(yypvt[-1].vInt/FIELDS_PER_FLUSH, yypvt[-1].vInt%FIELDS_PER_FLUSH); } break; +# line 704 "lua.stx" +{ yyval.vInt = yypvt[-1].vInt; } break; case 81: -# line 649 "lua.stx" -{ yyval.vInt = yypvt[-1].vInt; flush_record(yypvt[-1].vInt%FIELDS_PER_FLUSH); } break; -case 82: -# line 651 "lua.stx" -{ flush_list(yypvt[-1].vInt/FIELDS_PER_FLUSH, yypvt[-1].vInt%FIELDS_PER_FLUSH); } break; -case 83: -# line 653 "lua.stx" -{ yyval.vInt = yypvt[-4].vInt+yypvt[-1].vInt; flush_record(yypvt[-1].vInt%FIELDS_PER_FLUSH); } break; -case 86: -# line 660 "lua.stx" +# line 707 "lua.stx" {yyval.vInt=1;} break; -case 87: -# line 662 "lua.stx" +case 82: +# line 709 "lua.stx" { yyval.vInt=yypvt[-2].vInt+1; if (yyval.vInt%FIELDS_PER_FLUSH == 0) flush_record(FIELDS_PER_FLUSH); } break; -case 88: -# line 669 "lua.stx" +case 83: +# line 716 "lua.stx" { push_field(luaI_findconstant(yypvt[-2].pNode)); } break; -case 89: -# line 674 "lua.stx" +case 84: +# line 721 "lua.stx" +{ yyval.vInt = 0; } break; +case 85: +# line 722 "lua.stx" +{ yyval.vInt = yypvt[-1].vInt; } break; +case 86: +# line 725 "lua.stx" {yyval.vInt=1;} break; -case 90: -# line 676 "lua.stx" +case 87: +# line 727 "lua.stx" { yyval.vInt=yypvt[-2].vInt+1; if (yyval.vInt%FIELDS_PER_FLUSH == 0) flush_list(yyval.vInt/FIELDS_PER_FLUSH - 1, FIELDS_PER_FLUSH); } break; -case 91: -# line 684 "lua.stx" +case 88: +# line 735 "lua.stx" { nvarbuffer = 0; - varbuffer[nvarbuffer] = yypvt[-0].vLong; incr_nvarbuffer(); + add_varbuffer(yypvt[-0].vLong); yyval.vInt = (yypvt[-0].vLong == 0) ? 1 : 0; } break; -case 92: -# line 690 "lua.stx" +case 89: +# line 741 "lua.stx" { - varbuffer[nvarbuffer] = yypvt[-0].vLong; incr_nvarbuffer(); + add_varbuffer(yypvt[-0].vLong); yyval.vInt = (yypvt[-0].vLong == 0) ? yypvt[-2].vInt + 1 : yypvt[-2].vInt; } break; -case 93: -# line 696 "lua.stx" +case 90: +# line 747 "lua.stx" { yyval.vLong = yypvt[-0].vLong; } break; -case 94: -# line 698 "lua.stx" +case 91: +# line 749 "lua.stx" { yyval.vLong = 0; /* indexed variable */ } break; -case 95: -# line 702 "lua.stx" +case 92: +# line 753 "lua.stx" { code_byte(PUSHSTRING); code_word(luaI_findconstant(yypvt[-0].pNode)); yyval.vLong = 0; /* indexed variable */ } break; -case 96: -# line 710 "lua.stx" +case 93: +# line 761 "lua.stx" { Word s = luaI_findsymbol(yypvt[-0].pNode); int local = lua_localname (s); @@ -1875,27 +1885,27 @@ case 96: else yyval.vLong = -(local+1); /* return negative value */ } break; -case 97: -# line 720 "lua.stx" +case 94: +# line 771 "lua.stx" { lua_pushvar(yypvt[-0].vLong); } break; -case 98: -# line 723 "lua.stx" -{localvar[nlocalvar]=luaI_findsymbol(yypvt[-0].pNode); yyval.vInt = 1;} break; -case 99: -# line 725 "lua.stx" +case 95: +# line 774 "lua.stx" +{store_localvar(luaI_findsymbol(yypvt[-0].pNode), 0); yyval.vInt = 1;} break; +case 96: +# line 776 "lua.stx" { - localvar[nlocalvar+yypvt[-2].vInt]=luaI_findsymbol(yypvt[-0].pNode); + store_localvar(luaI_findsymbol(yypvt[-0].pNode), yypvt[-2].vInt); yyval.vInt = yypvt[-2].vInt+1; } break; -case 100: -# line 731 "lua.stx" +case 97: +# line 782 "lua.stx" { yyval.vInt = 0; } break; -case 101: -# line 732 "lua.stx" -{ yyval.vInt = yypvt[-0].vInt; } break; -case 102: -# line 735 "lua.stx" -{lua_debug = yypvt[-0].vInt;} break; +case 98: +# line 783 "lua.stx" +{ yyval.vInt = yypvt[-0].vLong; } break; +case 99: +# line 786 "lua.stx" +{ lua_debug = yypvt[-0].vInt; } break; } goto yystack; /* reset registers in driver code */ } diff --git a/src/parser.h b/src/parser.h index 4c125dad..ea815f11 100644 --- a/src/parser.h +++ b/src/parser.h @@ -1,4 +1,3 @@ - typedef union { int vInt; @@ -6,7 +5,7 @@ typedef union char *pChar; Word vWord; Long vLong; - Byte *pByte; + TFunc *pFunc; TreeNode *pNode; } YYSTYPE; extern YYSTYPE yylval; diff --git a/src/table.c b/src/table.c index cedbf31c..1a2ac96b 100644 --- a/src/table.c +++ b/src/table.c @@ -3,38 +3,34 @@ ** Module to control static tables */ -char *rcs_table="$Id: table.c,v 2.28 1995/01/18 20:15:54 celes Exp $"; +char *rcs_table="$Id: table.c,v 2.38 1995/11/03 15:30:50 roberto Exp $"; -#include <string.h> +/*#include <string.h>*/ #include "mem.h" #include "opcode.h" #include "tree.h" #include "hash.h" -#include "inout.h" #include "table.h" +#include "inout.h" #include "lua.h" #include "fallback.h" +#include "luadebug.h" #define BUFFER_BLOCK 256 -Symbol *lua_table; +Symbol *lua_table = NULL; static Word lua_ntable = 0; static Long lua_maxsymbol = 0; -TaggedString **lua_constant; +TaggedString **lua_constant = NULL; static Word lua_nconstant = 0; static Long lua_maxconstant = 0; - -#define MAXFILE 20 -char *lua_file[MAXFILE]; -int lua_nfile; - -#define GARBAGE_BLOCK 256 -#define MIN_GARBAGE_BLOCK 10 +#define GARBAGE_BLOCK 1024 +#define MIN_GARBAGE_BLOCK (GARBAGE_BLOCK/2) static void lua_nextvar (void); static void setglobal (void); @@ -117,9 +113,8 @@ Word luaI_findsymbolbyname (char *name) /* -** Given a name, search it at constant table and return its index. If not -** found, allocate it. -** On error, return -1. +** Given a tree node, check it is has a correspondent constant index. If not, +** allocate it. */ Word luaI_findconstant (TreeNode *t) { @@ -144,26 +139,38 @@ Word luaI_findconstant (TreeNode *t) } +Word luaI_findconstantbyname (char *name) +{ + return luaI_findconstant(lua_constcreate(name)); +} + + /* ** Traverse symbol table objects */ -void lua_travsymbol (void (*fn)(Object *)) +static char *lua_travsymbol (int (*fn)(Object *)) { Word i; for (i=0; i<lua_ntable; i++) - fn(&s_object(i)); + if (fn(&s_object(i))) + return luaI_nodebysymbol(i)->ts.str; + return NULL; } /* ** Mark an object if it is a string or a unmarked array. */ -void lua_markobject (Object *o) +int lua_markobject (Object *o) { if (tag(o) == LUA_T_STRING && !tsvalue(o)->marked) tsvalue(o)->marked = 1; else if (tag(o) == LUA_T_ARRAY) lua_hashmark (avalue(o)); + else if ((o->tag == LUA_T_FUNCTION || o->tag == LUA_T_MARK) + && !o->value.tf->marked) + o->value.tf->marked = 1; + return 0; } @@ -180,8 +187,10 @@ void lua_pack (void) lua_travstack(lua_markobject); /* mark stack objects */ lua_travsymbol(lua_markobject); /* mark symbol table objects */ luaI_travlock(lua_markobject); /* mark locked objects */ + luaI_travfallbacks(lua_markobject); /* mark fallbacks */ recovered += lua_strcollector(); recovered += lua_hashcollector(); + recovered += luaI_funccollector(); nentity = 0; /* reset counter */ block=(16*block-7*recovered)/12; /* adapt block size */ if (block < MIN_GARBAGE_BLOCK) block = MIN_GARBAGE_BLOCK; @@ -189,70 +198,39 @@ void lua_pack (void) /* -** Add a file name at file table, checking overflow. This function also set -** the external variable "lua_filename" with the function filename set. -** Return 0 on success or error message on error. -*/ -char *lua_addfile (char *fn) -{ - if (lua_nfile >= MAXFILE) - return "too many files"; - if ((lua_file[lua_nfile++] = luaI_strdup (fn)) == NULL) - return "not enough memory"; - return NULL; -} - -/* -** Delete a file from file stack -*/ -int lua_delfile (void) -{ - luaI_free(lua_file[--lua_nfile]); - return 1; -} - -/* -** Return the last file name set. -*/ -char *lua_filename (void) -{ - return lua_file[lua_nfile-1]; -} - -/* ** Internal function: return next global variable */ static void lua_nextvar (void) { - char *varname; - TreeNode *next; + Word next; lua_Object o = lua_getparam(1); if (o == LUA_NOOBJECT) - lua_reportbug("too few arguments to function `nextvar'"); + lua_error("too few arguments to function `nextvar'"); if (lua_getparam(2) != LUA_NOOBJECT) - lua_reportbug("too many arguments to function `nextvar'"); + lua_error("too many arguments to function `nextvar'"); if (lua_isnil(o)) - varname = NULL; + next = 0; else if (!lua_isstring(o)) { - lua_reportbug("incorrect argument to function `nextvar'"); + lua_error("incorrect argument to function `nextvar'"); return; /* to avoid warnings */ } else - varname = lua_getstring(o); - next = lua_varnext(varname); - if (next == NULL) + next = luaI_findsymbolbyname(lua_getstring(o)) + 1; + while (next < lua_ntable && s_tag(next) == LUA_T_NIL) next++; + if (next >= lua_ntable) { lua_pushnil(); lua_pushnil(); } else { + TreeNode *t = luaI_nodebysymbol(next); Object name; tag(&name) = LUA_T_STRING; - tsvalue(&name) = &(next->ts); + tsvalue(&name) = &(t->ts); luaI_pushobject(&name); - luaI_pushobject(&s_object(next->varindex)); + luaI_pushobject(&s_object(next)); } } @@ -262,7 +240,7 @@ static void setglobal (void) lua_Object name = lua_getparam(1); lua_Object value = lua_getparam(2); if (!lua_isstring(name)) - lua_reportbug("incorrect argument to function `setglobal'"); + lua_error("incorrect argument to function `setglobal'"); lua_pushobject(value); lua_storeglobal(lua_getstring(name)); } @@ -272,6 +250,33 @@ static void getglobal (void) { lua_Object name = lua_getparam(1); if (!lua_isstring(name)) - lua_reportbug("incorrect argument to function `getglobal'"); + lua_error("incorrect argument to function `getglobal'"); lua_pushobject(lua_getglobal(lua_getstring(name))); } + + +static Object *functofind; +static int checkfunc (Object *o) +{ + if (o->tag == LUA_T_FUNCTION) + return + ((functofind->tag == LUA_T_FUNCTION || functofind->tag == LUA_T_MARK) + && (functofind->value.tf == o->value.tf)); + if (o->tag == LUA_T_CFUNCTION) + return + ((functofind->tag == LUA_T_CFUNCTION || functofind->tag == LUA_T_CMARK) + && (functofind->value.f == o->value.f)); + return 0; +} + + +char *getobjname (lua_Object o, char **name) +{ /* try to find a name for given function */ + functofind = luaI_Address(o); + if ((*name = luaI_travfallbacks(checkfunc)) != NULL) + return "fallback"; + else if ((*name = lua_travsymbol(checkfunc)) != NULL) + return "global"; + else return ""; +} + diff --git a/src/table.h b/src/table.h index c25075c0..4e581401 100644 --- a/src/table.h +++ b/src/table.h @@ -1,7 +1,7 @@ /* ** Module to control static tables ** TeCGraf - PUC-Rio -** $Id: table.h,v 2.10 1994/12/20 21:20:36 roberto Exp $ +** $Id: table.h,v 2.13 1995/10/26 14:21:56 roberto Exp $ */ #ifndef table_h @@ -21,11 +21,9 @@ void lua_initconstant (void); Word luaI_findsymbolbyname (char *name); Word luaI_findsymbol (TreeNode *t); Word luaI_findconstant (TreeNode *t); -void lua_travsymbol (void (*fn)(Object *)); -void lua_markobject (Object *o); +Word luaI_findconstantbyname (char *name); +int lua_markobject (Object *o); void lua_pack (void); -char *lua_addfile (char *fn); -int lua_delfile (void); -char *lua_filename (void); + #endif @@ -3,7 +3,7 @@ ** TecCGraf - PUC-Rio */ -char *rcs_tree="$Id: tree.c,v 1.13 1995/01/12 14:19:04 roberto Exp $"; +char *rcs_tree="$Id: tree.c,v 1.14 1995/10/17 11:53:53 roberto Exp $"; #include <string.h> @@ -102,40 +102,22 @@ Long lua_strcollector (void) return counter; } + /* -** Return next variable. +** Traverse the constant tree looking for a specific symbol number */ -static TreeNode *tree_next (TreeNode *node, char *str) +static TreeNode *nodebysymbol (TreeNode *root, Word symbol) { - if (node == NULL) return NULL; - else if (str == NULL) return node; - else - { - int c = lua_strcmp(str, node->ts.str); - if (c == 0) - return node->left != NULL ? node->left : node->right; - else if (c < 0) - { - TreeNode *result = tree_next(node->left, str); - return result != NULL ? result : node->right; - } - else - return tree_next(node->right, str); - } + TreeNode *t; + if (root == NULL) return NULL; + if (root->varindex == symbol) return root; + t = nodebysymbol(root->left, symbol); + if (t) return t; + return nodebysymbol(root->right, symbol); } -TreeNode *lua_varnext (char *n) +TreeNode *luaI_nodebysymbol (Word symbol) { - TreeNode *result; - char *name = n; - while (1) - { /* repeat until a valid (non nil) variable */ - result = tree_next(constant_root, name); - if (result == NULL) return NULL; - if (result->varindex != NOT_USED && - s_tag(result->varindex) != LUA_T_NIL) - return result; - name = result->ts.str; - } + return nodebysymbol(constant_root, symbol); } @@ -1,7 +1,7 @@ /* ** tree.h ** TecCGraf - PUC-Rio -** $Id: tree.h,v 1.9 1995/01/12 14:19:04 roberto Exp $ +** $Id: tree.h,v 1.10 1995/10/17 11:53:53 roberto Exp $ */ #ifndef tree_h @@ -32,6 +32,6 @@ typedef struct TreeNode TaggedString *lua_createstring (char *str); TreeNode *lua_constcreate (char *str); Long lua_strcollector (void); -TreeNode *lua_varnext (char *n); +TreeNode *luaI_nodebysymbol (Word symbol); #endif diff --git a/src/yacc/Makefile b/src/yacc/Makefile deleted file mode 100644 index 284d4ab5..00000000 --- a/src/yacc/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -parser.c: - co -M lua.stx - yacc -d lua.stx ; mv -f y.tab.c ../parser.c ; mv -f y.tab.h ../parser.h diff --git a/test/README b/test/README new file mode 100644 index 00000000..625644d0 --- /dev/null +++ b/test/README @@ -0,0 +1,7 @@ +These are simple tests for Lua. Some of them contain useful code. +They are meant to be run to make sure Lua is ok and also to be read, to see +how Lua programs can look like. +In the directory examples/, there is more useful code, such as a library for +complex arithmetic (a good example of fallbacks for overloading and redefinition +of primitive functions), and a library for PostScript output. Both libraries +include simple examples. diff --git a/test/examples/complex/complex.lua b/test/examples/complex/complex.lua new file mode 100644 index 00000000..a213a746 --- /dev/null +++ b/test/examples/complex/complex.lua @@ -0,0 +1,82 @@ +-- complex.lua +-- complex arithmetic package for lua +-- Luiz Henrique de Figueiredo (lhf@csg.uwaterloo.ca) +-- 24 Oct 95 +$debug + +Complex={type="package"} + +function complex(x,y) + return { re=x, im=y, type="complex" } +end + +function Complex.conj(x,y) + return complex(x.re,-x.im) +end + +function Complex.norm2(x) + local n=Complex.mul(x,Complex.conj(x)) + return n.re +end + +function Complex.abs(x) + return sqrt(Complex.norm2(x)) +end + +function Complex.add(x,y) + return complex(x.re+y.re,x.im+y.im) +end + +function Complex.sub(x,y) + return complex(x.re-y.re,x.im-y.im) +end + +function Complex.mul(x,y) + return complex(x.re*y.re-x.im*y.im,x.re*y.im+x.im*y.re) +end + +function Complex.div(x,y) + local z=x*Complex.conj(y) + local t=Complex.norm2(y) + z.re=z.re/t + z.im=z.im/t + return z +end + +function Complex.fallback(x,y,op) + if type(x)=="number" then x=complex(x,0) end + if type(y)=="number" then y=complex(y,0) end + if type(x)=="complex" and type(y)=="complex" then + return Complex[op](x,y) + else + return Complex.oldfallback(x,y) + end +end + +function Complex.newtype(x) + local t=Complex.oldtype(x) + if t=="table" and x.type then return x.type else return t end +end + +function Complex.print(x) + if type(x)~="complex" then + Complex.oldprint(x) + else + local s + if x.im>=0 then s="+" else s="" end + Complex.oldprint(x.re..s..x.im.."I") + end +end + +function Complex.newabs(x) + if type(x)~="complex" then + return Complex.oldabs(x) + else + return Complex.abs(x) + end +end + +Complex.oldfallback=setfallback("arith",Complex.fallback) +Complex.oldtype=type type=Complex.newtype +Complex.oldprint=print print=Complex.print +Complex.oldabs=abs abs=Complex.abs diff --git a/test/examples/complex/mandel.lua b/test/examples/complex/mandel.lua new file mode 100644 index 00000000..5e3d3eb6 --- /dev/null +++ b/test/examples/complex/mandel.lua @@ -0,0 +1,25 @@ +dofile("complex.lua") + +xmin=-2 xmax=2 ymin=-2 ymax=2 +d=.125 + +function level(x,y) + local c=complex(x,y) + local l=0 + local z=c + repeat + z=z*z+c + l=l+1 + until abs(z)>2 or l>255 + return l-1 +end + +x=xmin +while x<xmax do + y=ymin + while y<ymax do + print(level(x,y)) + y=y+d + end + x=x+d +end diff --git a/test/examples/ps/hilbert.lua b/test/examples/ps/hilbert.lua new file mode 100644 index 00000000..b1042b57 --- /dev/null +++ b/test/examples/ps/hilbert.lua @@ -0,0 +1,44 @@ +-- hilbert.c +-- Hilbert curve +-- Luiz Henrique de Figueiredo (lhf@csg.uwaterloo.ca) +-- 10 Nov 95 + +$debug + +dofile("ps.lua") + +function p() + PS.lineto(x,y) +end + +function a(n) + if (n==0) then return else n=n-1 end + d(n); y=y+h; p(); a(n); x=x+h; p(); a(n); y=y-h; p(); b(n); +end + +function b(n) + if (n==0) then return else n=n-1 end + c(n); x=x-h; p(); b(n); y=y-h; p(); b(n); x=x+h; p(); a(n); +end + +function c(n) + if (n==0) then return else n=n-1 end + b(n); y=y-h; p(); c(n); x=x-h; p(); c(n); y=y+h; p(); d(n); +end + +function d(n) + if (n==0) then return else n=n-1 end + a(n); x=x+h; p(); d(n); y=y+h; p(); d(n); x=x-h; p(); c(n); +end + +function hilbert(n) + PS.open("hilbert curve") + h=2^(9-n) + x=0 + y=0 + PS.moveto(x,y) + a(n) + PS.close() +end + +hilbert(5) diff --git a/test/examples/ps/ps.lua b/test/examples/ps/ps.lua new file mode 100644 index 00000000..62b4e173 --- /dev/null +++ b/test/examples/ps/ps.lua @@ -0,0 +1,185 @@ +-- ps.lua +-- lua interface to postscript +-- Luiz Henrique de Figueiredo (lhf@csg.uwaterloo.ca) +-- 12 Nov 95 + +PS={} + +function P(x) + write(x.."\n") +end + +-------------------------------------------------------------------- control -- + +function PS.open(title) + local d,m,y=date() + local H,M,S=time() + if d<10 then d="0"..d end + if m<10 then m="0"..m end + if title==nil then title="(no title)" end + P("%!PS-Adobe-2.0 EPSF-1.2") + P("%%Title: "..title) + P("%%Creator: ps.lua from Lua 2.2") + P("%%CreationDate: "..y..m..d.." "..H..":"..M..":"..S) + P("%%Pages: (atend)") + P("%%BoundingBox: (atend)") + P("%%EndComments") + P("%%BeginProcSet: ps.lua") + P("/s { stroke } bind def") + P("/f { fill } bind def") + P("/m { moveto } bind def") + P("/l { lineto } bind def") + P("/L { moveto lineto stroke } bind def") + P("/t { show } bind def") + P("/o { 0 360 arc stroke } bind def") + P("/O { 0 360 arc fill } bind def") + P("/p { 3 0 360 arc fil } bind def") + P("/F { findfont exch scalefont setfont } bind def") + P("/LS { 0 setdash } bind def") + P("/LW { setlinewidth } bind def") + P("%%EndProcSet: ps.lua") + P("%%EndProlog") + P("%%BeginSetup") + P("0 setlinewidth") + P("1 setlinejoin") + P("1 setlinecap") + P("10 /Times-Roman F") + P("%%EndSetup\n") + P("%%Page: 1 1") +-- cxmin=dv.xmin; cxmax=dv.xmax; cymin=dv.ymin; cymax=dv.ymax + xmin=1000; xmax=-1000; ymin=1000; ymax=-1000 + page=1 +end + +function PS.close() + P("stroke") + P("showpage") + P("%%Trailer") + P("%%Pages: "..page) + P("%%BoundingBox: "..xmin.." "..ymin.." "..xmax.." "..ymax) + P("%%EOF") +end + +function PS.clear() + if (empty) then return end + page=page+1 + P("showpage") + P("%%Page: "..page.." "..page) + empty=1 +end + +function PS.comment(s) + P("% "..s) +end + +--------------------------------------------------------------- direct color -- + +function PS.rgbcolor(r,g,b) + P(r.." "..g.." "..b.." setrgbcolor") +end + +function PS.gray(g) + P(g.." setgray") +end + +---------------------------------------------------------------- named color -- + +function PS.color(c) + P("C"..c) +end + +function PS.defrgbcolor(c,r,g,b) + P("/C"..c.." { "..r.." "..g.." "..b.." setrgbcolor } def") +end + +function PS.defgraycolor(c,g) + P("/C"..c.." { "..g.." setgray } def") +end + +----------------------------------------------------------------------- line -- + +function PS.line(x1,y1,x2,y2) + P(x2.." "..y2.." "..x1.." "..y1.." L") + PS.update(x1,y1) + PS.update(x2,y2) +end + +function PS.moveto(x,y) + P(x.." "..y.." m") + PS.update(x,y) +end + +function PS.lineto(x,y) + P(x.." "..y.." l") + PS.update(x,y) +end + +function PS.linewidth(w) + P(w.." LW") +end + +function PS.linestyle(s) + P("["..s.."] LS") +end + +----------------------------------------------------------------------- text -- + +function PS.font(name,size) + if (size==nil) then size=10 end + P(size.." /"..name.." F") +end + +function PS.text(x,y,s) + P(x.." "..y.."m ("..s..") t") + PS.update(x,y) +end + +--------------------------------------------------------------------- circle -- + +function PS.circle(x,y,r) + P(x.." "..y.." "..r.." o") + PS.update(x-r,y-r) + PS.update(x+r,y+r) +end + +function PS.disk(x,y,r) + P(x.." "..y.." "..r.." O") + PS.update(x-r,y-r) + PS.update(x+r,y+r) +end + +function PS.dot(x,y) + P(x.." "..y.." p") + PS.update(x-r,y-r) + PS.update(x+r,y+r) +end + +------------------------------------------------------------------------ box -- + +function PS.rectangle(xmin,xmax,ymin,ymax) + P(xmin.." "..ymin.." m ".. + xmax.." "..ymin.." l ".. + xmax.." "..ymax.." l ".. + xmin.." "..ymax.." l s") + PS.update(xmin,ymin) + PS.update(xmax,ymax) +end + +function PS.box(xmin,xmax,ymin,ymax) + P(xmin.." "..ymin.." m ".. + xmax.." "..ymin.." l ".. + xmax.." "..ymax.." l ".. + xmin.." "..ymax.." l f") + PS.update(xmin,ymin) + PS.update(xmax,ymax) +end + +-------------------------------------------------------- update bounding box -- + +function PS.update(x,y) +-- if (x>=cxmin and x<=cxmax and y>=cxmin and y<=cxmax) then + if (x<xmin) then xmin=x elseif (x>xmax) then xmax=x end + if (y<ymin) then ymin=y elseif (y>ymax) then ymax=y end + empty=0 +-- end +end diff --git a/test/save.lua b/test/save.lua index 8c64c568..f16bdf20 100644 --- a/test/save.lua +++ b/test/save.lua @@ -1,39 +1,4 @@ - - -function savevar (n,v) - if v == nil then return end; - if type(v) == "number" then print(n.."="..v) return end - if type(v) == "string" then print(n.."='"..v.."'") return end - if type(v) == "table" then - if v.__visited__ ~= nil then - print(n .. "=" .. v.__visited__); - else - print(n.."=@()") - v.__visited__ = n; - local r,f; - r,f = next(v,nil); - while r ~= nil do - if r ~= "__visited__" then - if type(r) == 'string' then - savevar(n.."['"..r.."']",f) - else - savevar(n.."["..r.."]",f) - end - end - r,f = next(v,r) - end - end - end -end - -function save () -local n,v - n,v = nextvar(nil) - while n ~= nil do - savevar(n,v); - n,v = nextvar(n) - end -end +dofile("dump.lua") a = 3 x = {a = 4, b = "name", l={4,5,67}} diff --git a/test/type.lua b/test/type.lua index 3079391d..5bfc33e4 100644 --- a/test/type.lua +++ b/test/type.lua @@ -30,8 +30,8 @@ typeblock = {x = {default = 0, type = "number"}, function block(t) check(t,typeblock) end -@block{ x = 7, name = "3"} -@block{ x = "7", name = "3"} -@block{ x = 7, name = 3} -@block{ x = 7} -@block{ x = 7, name = "3", bogus=3.14} +block{ x = 7, name = "3"} +block{ x = "7", name = "3"} +block{ x = 7, name = 3} +block{ x = 7} +block{ x = 7, name = "3", bogus=3.14} |