SGML Functions for AthenaMuse 2 by James C. Gentry SUBMITTED TO THE DEPARTMENT OF ELECTRICAL ENGINEERING AND COMPUTER SCIENCE IN PARTIAL FULFILLMENT OF THE REQUIREMENTS FOR THE DEGREE OF MASTER OF SCIENCE IN COMPUTER SCIENCE AND ENGINEERING AT THE MASSACHUSETTS INSTITUTE OF TECHNOLOGY JUNE 1996 © 1996 James C. Gentry. All Rights Reserved The author hereby grants MIT permission to reproduce and to distribute publicly paper and electronic copies of this thesis document in whole or in part. . ..... . .................................................................................................. Signature of A uthor ...... " 1"epartment of Electrical Engineering and Computer Science May 28, 1996 Certified by....-. .............. .... ............................... Si Accepted by ............ .................................................................. Steven Lerman Professor of Civil and Environmental Engineering Director, Center for Educational Computing Initiatives t Thesis Supervisor .. . ....... .... ... .... .... .............................................................................. NJFrederic R. Morgenthaler Graduate Officer, Depart ent of Electrical Engineering and Computer Science OF TEC-HNOLOGY JUN 1 1 1996 LIUBRARIES Eng. SGML Functions for AthenaMuse 2 by James C. Gentry Submitted to the Department of Electrical Engineering and Computer Science on May 28, 1996 in partial fulfillment of the requirements for the Degree of Master of Science in Computer Science and Engineering ABSTRACT The Standard Generalized Markup Language provides a way to specify markup languages. With these markup languages, diverse types of information can be organized. SGML makes the storage and sharing of information easier, and it is being used by an increasingly large number of publishers. AthenaMuse 2 is a tool used to create multimedia computer programs, which is currently being developed at the Center for Educational Computing Initiatives of the Massachusetts Institute of Technology. AM2 uses an object-oriented language called the Application Description Language (ADL) to script multimedia programs. This paper describes a group of classes, written for the ADL, which can parse and dissect SGML documents. These classes, collectively called AM2SGML, will enable the AM2 application developer to use SGML in his applications, and in the future will possibly provide the base for a new set of ADL Hypertext Markup Language (HTML) classes. Thesis Supervisor: Steven Lerman Title: Professor of Civil and Environmental Engineering; Director, Center for Educational Computing Initiatives Acknowledgments There are many people I would like to acknowledge for helping me complete this paper. First, I would like to thank everyone at the Center for Educational Computing Initiatives. I especially thank Professor Steven Lerman for his guidance through every stage in this project. I also thank Ana Beatriz Chiquito for first introducing me to CECI. I would like to thank my Brothers and friends at Pi Lambda Phi, Massachusetts Theta, for giving me support at the times when I did not happen to be working on this or any other projects. And finally, I would like to thank my family, for reasons which go without saying. Table Of Contents 1 M otivation ..................................................................................................................... 13 1.1 SGM L .................................................................................................................... 13 1.2 AM 2 ....................................................................................................................... 14 1.2.1 1.2.2 14 15 1.3 Better HTML Functions .................................................................................................... The Current State of HTML in AM2 ................................................................................ SGM L in AM 2 ....................................................................................................... 2 Specifications ................................................................................................................ 2.1 Purpose...................................................................................................................17 2.2 Class Specifications ............................................................................................... 2.2.1 2.2.2 17 17 The DTD Classes .............................................................................................................. 20 2.2.1.1 The MMdtd Class................................................................................................ 20 2.2.1.2 The MMdtdDocumentType Class................................................................... 22 2.2.1.3 The MMdtdElement Class ............................................................................... 26 2.2.1.4 The MMdtdContentModel Class................................................................... 29 2.2.1.5 The MMdtdAttribute Class .......................................................................... 32 2.2.1.6 The MMdtdEntity Class ................................................................................. 36 2.2.1.7 The MMdtdNotation Class ............................................................................ 38 2.2.1.8 The MMsgmlSectionMark Class................................................................... 40 2.2.1.9 The MMsgmlComment Class ............................................................................ 41 The Document Instance Classes........................................................................................ 42 2.2.2.1 The MMsgmlDocument Class .......................................................................... 42 2.2.2.2 The MMsgmlElement Class ............................................................................ 44 2.2.2.3 The MMsgmlPCData Class............................................................................... 45 2.2.2.4 The MMsgmlEmpty Class.................................................................................46 2.2.2.5 The MMsgmlAttribute Class........................................................................ 47 3 The AM 2SGM L C++ Classes ..................................................................................... 3.1 16 49 YASP......................................................................................................................49 3.1.1 3.1.2 Why YASP? ....................................................................................................................... An Overview of YASP ...................................................................................................... 49 50 3.2 Overview of the AM 2SGM L C++ Functions ........................................................ 3.3 AM 2SGM L M odule Descriptions ......................................................................... 52 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 50 The Test Function.............................................................................................................. 52 The parseSGMLFile Function ..................................................................................... 52 The dispatch Function ................................................................................................. 54 The SGMLObj ect Class and its Subclasses .................................................................... 56 3.3.4.1 The SGMLDocument Class............................................................................... 56 3.3.4.2 The SGMLElement Class .............................................................................. 57 The Service Functions.......................................................................................................58 3.3.5.1 The eltSt Function .......................................................................................... 58 3.3.5.2 The eltNd Function .......................................................................................... 59 3.3.5.3 The text Function ............................................................................................ 59 3.3.5.4 3.3.5.5 3.3.5.6 3.3.5.7 3.3.5.8 3.3.5.9 3.3.5.10 3.3.5.11 3.3.5.12 3.3.5.13 3.3.5.14 3.3.5.15 3.3.5.16 60 The msg Function.............................................................................................. The sGet and sFre Functions..........................................................................61 61 The find Function ........................................................................................... 62 The xEnOp Function .......................................................................................... The utOpR and utOpW Functions................................................................... 63 63 The utWrt Function .......................................................................................... 63 The utRd Function ........................................................................................... The utCl and xEnCl Functions......................................................................... 64 64 The xEnRd Function .......................................................................................... 64 The proSt Function ....................................................................................... 65 The docNd Function .......................................................................................... 65 The DTDSt Function ....................................................................................... The unimp 1 Fn Function.................................................................................. 65 3.3.6 The MessageHandler Object ...................................................................................... 3.3.7 The File Class ........................................................ 65 .................................................. 66 4 The Future of SGM L and AM 2 .................................................................................. 67 Appendix A -A Sam ple DTD ......................................................................................... 69 Appendix B - Code for AM 2SGM L .............................................................................. 71 B.1 72 test.cc ........................................................ B.2 AM2YASP. h ......................................................................................................... B.3 B.4 72 parseSGMLFile h ................................................. 73 parseSGMLFile.cc ............................................... B.5 74 dispatch h .......................................................... B.6 75 dispatch .cc .................................................... B.7 SGMLObject. h .................................................................................................. 77 B.8 77 SGMLObject.cc .................................................. B.9 78 SGMLDocument. h. ..................................................... B.10 78 SGMLDocument.cc ..................................................... B.11 78 SGMLElement.h ...................................................... B.12 B.13 80 SGMLElement.cc ................................................. 81 DTD.h ................................................................................................................... B.14 DTD.cc ................................................................................................................ 81 B.15 eltSt.h .............................................................................................................. 81 B.16 eltSt.cc ........................................................................................................... 81 B.17 eltNd.h .............................................................................................................. 82 B.18 eltNd.cc ........................................................................................................... 82 B.19 re.h ..................................................................................................................... 82 72 B.20 text.h ................................................................................................................ 83 B.21 pi .h ..................................................................................................................... 83 B.22 msg .h ................................................................................................................... 83 B.23 msg .cc ................................................................................................................ 83 B.24 sGet.h ................................................................................................................ 85 B.25 sGet.cc .............................................................................................................. 85 B.26 sFre .h ................................................................................................................ 85 B.27 find .h ................................................................................................................ 85 B.28 find . cc .............................................................................................................. 86 B.29 xEnOp . h .............................................................................................................. 88 B.30 xEnOp .cc ........................................................................................................... 88 B.31 utOpR . h .............................................................................................................. 88 B.32 utOpW .h .............................................................................................................. 89 B.33 utOpW .cc ........................................................................................................... 89 B.34 utWrt.h .............................................................................................................. 89 B.35 utWrt.cc ........................................................................................................... 89 B.36 utRd .h ................................................................................................................ 90 B.37 utRd .cc .............................................................................................................. 90 B.38 utCl.h ................................................................................................................ 90 B.39 xEnRd .h .............................................................................................................. 91 B.40 xEnRd .cc ........................................................................................................... 91 B.41 xEnCl. h .............................................................................................................. 92 B.42 xEnCl. cc ........................................................................................................... 92 B.43 proSt.h .............................................................................................................. 92 B.44 proSt.cc ........................................................................................................... 92 B.45 proNd .h .............................................................................................................. 92 B.46 docNd .h .............................................................................................................. 93 B.47 etySt.h .............................................................................................................. 93 B.48 etySt.cc ........................................................................................................... 93 B.49 etyNd .h .............................................................................................................. 93 B.50 skip .h ................................................................................................................. 94 B.51 decSt. h .............................................................................................................. 94 B .52 DTDSt . h .............................................................................................................. 94 B .53 DTDSt .cc ........................................................................................................... 94 B .54 DTDNd . h .............................................................................................................. 94 B .55 dapNd . h .............................................................................................................. 95 95 B .56 unimp lFn .h .......................................................... B .57 unimplFn .cc .................................................................................................... 95 95 B .58 MessageHandler .h ................................................... 96 B .59 MessageHandler .cc ................................................... 99 B .60 File .h ................................................................................................................ B .61 File .cc ............................................................................................................ 101 B .62 notify .h ......................................................................................................... 103 B .63 notify .cc ....................................................................................................... 103 B .64 publDFileName h ......................................................................................... 103 B .65 publDFileName .cc ...................................................................................... 103 104 B .66 charsetID .h ........................................................ 104 B .67 charsetID .cc ........................................................ B .68 random .h ......................................................................................................... 104 B .69 random .cc ....................................................................................................... 106 B .70 Makefile ......................................................................................................... 107 A ppendix C - Sample Run ............................................................................................ 109 List of Tables TABLE TABLE TABLE TABLE 1. 2. 3. 4. The AM 2SGM L Classes............................................................................19 M embers of MMdtd...................................................................................22 Members of MMdtdDocumentType ...................................................... 26 Members of MMdtdE lement .................................................................. 29 TABLE 5. Members of MMdtdContentModel ...................................................... 31 TABLE 6. TABLE 7. TABLE 8. Possible Types of hDe f aul tVa l ............................................................ 34 Members of MMdtdContentModel ...................................................... 35 Members of MMdtdEntity.....................................................................38 TABLE 9. Members of MMdtdNotation ................................................................ 39 TABLE TABLE TABLE TABLE TABLE TABLE TABLE Members of MMsgmlSectionMark ...................................................... 41 Members of MMsgmlComment................................................................42 Members of MMsgmlDocument ............................................................. 43 Members of MMsgmlElement ................................................................ 45 Members of MMsgmlPCData .................................................................. 46 Members of MMsgmlPCData .................................................................. 48 The Service Functions................................................................................54 10. 11. 12. 13. 14. 15. 16. TABLE 17. YASP M essage Severities .......................................................................... TABLE 18. YASP File Classes......................................................................................62 60 1 Motivation AthenaMuse 2®is an authoring tool for creating multimedia computer programs currently being developed at the Massachusetts Institute of Technology's Center for Educational Computing Initiatives.'1 This paper describes the design and partial implementation of a set of classes for AM2 which can be used to manipulate Standard Generalized Markup Language (SGML) documents. This set of classes is collectively called AM2SGML. 1.1 SGML SGML is an international standard introduced in 1986, described by International Organization for Standardization standard ISO 8879. Because of SGML's many benefits, it is becoming increasingly popular. Today, it is used by such various organizations as the Department of Defense, the Association of American Publishers, and the American Trucking Association. It is gaining widespread acceptance both in the United States and abroad.2 SGML can be used to define the formats of certain types of data using a Document Type Definition (DTD), by specifying which types of elements the data can contain. The data can then be marked up, so that the location and arrangements of the elements in the data are made explicit. SGML allows for more efficient storage of information, it increases the ease of sharing information, and it allows for the easy storage and maintenance of information in databases. 3 In addition, 1. AthenaMuse is a registered trademark of MIT. 2. "Getting Started with SGML: A Guide to the Standard Generalized Markup Language and Its Role in Information Management," ArborText, 1995. 3. "Getting Started." SGML is used to define the Hypertext Markup Language (HTML), which is in wide use in the World Wide Web. 1.2 AM2 AM2 is designed to make the implementation of multimedia applications simpler. One way in which it does this is through its use of the Application Description Language. The ADL has classes to display and manipulate a variety of media types, including images, sounds, movies, and HTML pages. Currently, the ADL has no functionality for manipulating SGML documents besides classes which can display HTML pages. While AM2 would be greatly improved with the addition of classes to handle SGML in general, the original reason for creating these classes was so that AM2's ability to manipulate HTML pages would be improved. 1.2.1 Better HTML Functions While AM2 provides basic functions for displaying HTML pages, following links, and so forth; but it is missing more advanced functions which would be quite useful when writing applications involving HTML. A major problem with the current implementation of the HTML functions is that it is based on software written by a third party. Therefore, the types of functions dealing with HTML which are available to the application programmer are largely limited to those that are provided in thee third party library. It is difficult if not impossible to add to or modify these functions. To change this, the implementation of HTML functions for AM2 needs to be redesigned and re-implemented. 1.2.2 The CurrentState of HTML in AM2 The display of an HTML page can be divided into two stages. First, the HTML source document is parsed into some sort of data structure. In the current HTML functions, this structure is a linked list. Once the parsing is complete, the structure is passed to a function which displays the page in a region of a window on the screen. There are drawbacks in the current implementation of both of these stages. The linked list structure currently used is not especially convenient to manipulate; because of this, accessing information about the HTML page is not as simple and possibly not as efficient as it could be. Creating a better data structure would not only help with this problem, but would have numerous other benefits as well. Since third-party software would no longer be relied on to parse HTML into a structure, an HTML file could be parsed the same way as any other SGML document. By changing the DTD used for HTML, extra features could even be added to HTML. For example, the idea of defining AM2 classes in HTML has been considered; this would be easier to implement if we handled our own HTML parsing. Also, parts of the HTML structure could be made visible to ADL application programmers as ADL classes. This would allow programmers an easy way to dynamically manipulate and define HTML pages in applications. There are also drawbacks in the current functions used to display the HTML data structures. Right now it is difficult or impossible to change the way that an HTML page is displayed. For example, properties such as image and text positions and default colors cannot be set by the application programmer. These problem would be solved if custom functions to display HTML were written. There would be additional benefits as well. For example, arbitrary ADL objects could be displayed within an HTML page. Also, other types of SGML documents could be displayed using the HTML display functions. Unfortunately, due to time constraints, the display of these HTML structures is not in the scope of this project. 1.3 SGML in AM2 Instead of limiting this project to the parsing and display of HTML documents, it made sense to go one step further, and include within its scope the parsing of general SGML documents also. With basic SGML support built in to the ADL, the ADL application developer would be able to make use of SGML in his applications. Due to the large amount of work involved with the parsing of SGML documents, a full implementation of the AM2SGML specifications has not been completed. However, a "bare bones" implementation has been done. The AM2SGML specifications and a description of the implementation so far are described in this report. Hopefully, the implementation can some day be completed, and AM2SGML will prove to be a valuable addition to AM2. 2 Specifications This chapter describes the user interface for the ADL classes which make up AM2SGML. For a description of AM2 and the ADL, please consult the MIT AthenaMuse Software Consortium's AthenaMuse 2.1 Documentation.1 2.1 Purpose The classes defined below represent two types of entities - DTDs, and files written in marked-up text defined by a DTD, which we will call document instances. There is a group of classes defined for each of these entities. The top-level class MMsgmlDocument represents an SGML document instance, while MMdtd represents a DTD. A sample DTD has been defined in Appendix A. This DTD represents a subset of the definition of HTML. 2 2.2 Class Specifications The specifications of the DTD classes and the SGML document instance classes are given below. There are a few things to note. First, unless a class is described as immutable, the programmer can set any members of the class at any time, unless otherwise specified. If a class is immutable, then once an object of that class is created, it cannot be changed. As such, members of immutable classes can be set only when an object of that class is created. Also, all class members are readable. 1. Margaret Meehan et al., AthenaMuse 2.1 Documentation, Cambridge, MIT AthenaMuse Software Consortium, 1995. 2. Note that this DTD may contain inconsistencies with actual HTML. Second, none of the classes have any activities. An activity is the way that the ADL programmer can handle events generated by user actions, clock ticks, incoming messages, or other such outside stimuli. For example, the ADL programmer could speficy that a certain function be called whenever the user clicks the right mouse button in a certain region of the screen. Due to the nature of the AM2SGML classes, none of them need to handle events. Note also that most of the classes have an element hMark. In SGML, a certain section of text can be marked with the status keywords INCLUDE or IGNORE. These keywords are used when a document contains sections which should sometimes be ignored, and at other times be included. For example, assume that we had a textbook expressed as an SGML document. Also assume that we want to print the student's version and the teacher's version of the textbook from the same document. A part of the SGML file might look like the following. Problem 69. What is the Capital of Louisiana? <![INCLUDE [Baton Rouge]]> In the teacher's version of the textbook, we want the answer to the question to be printed. Therefore, we use the SGML fragment given above, and since Baton Rouge is marked with INCLUDE, it will be printed. In the student's version of the textbook, we do not want the answer to be there. Therefore, before printing the student's version, we would change INCLUDE to IGNORE in the above fragment. 3 A marked section looks as follows: <! [ status-keyword [ marked-section ] ]> 3. "The SGML Primer," SoftQuad, 1995. Note that this and other SGML samples are expressed as a Backus-Naur Form grammar. Here, status-keyword is INCLUDE, IGNORE, or a parameter entity which represents INCLUDE or IGNORE. If a class represents an item that is inside a section marked INCLUDE, then hMark is a handle to an MMsgmlSectionMark object representing "include." If a class represents an item that is inside a section marked IGNORE, then hMark is a handle to an MMsgmlSectionMark object representing "ignore." If a class represents an item that is inside a section marked with a parameter entity, then hMark is a handle to an MMsgmlSectionMark object representing this parameter entity. If an item is not in a marked section, then the object which represents it has hMark equal to an MMsgmlSectionMark object signifying "no mark." Table 1 gives an listing of all the AM2SGML classes. It also gives a brief description of each, and tells where each is described in this chapter. TABLE 1. The AM2SGML Classes Class Name Description Where Described DTD Classes MMdtd Represents an entire DTD. This can contain comments (MMsgmlComment objects) or DOCTYPE definitions (MMdtdDocumentType objects). Section 2.2.1.1 on page 20 MMdtdDocumentType Represents a DOCTYPE definition in a DTD. This can contain entities (MMdtdEntity object), notations (MMdtdNotation objects), attribute lists (MMdtdAttribute objects), element declarations (MMdtdElement objects), and comments (MMsgmlComment objects). Section 2.2.1.2 on page 22 MMdtdElement Represents a DTD ELEMENT declaration. It includes a content model, represented by an MMdtdCommentModel object. Section 2.2.1.3 on page 26 MMdtdContentModel Represents a content model for an ELEMENT declaration. Section 2.2.1.4 on page 29 MMdtdAttribute Represents one attribute of an ELEMENT declaration. Note that each MMdtdAttribute object represents one item in an ATTLIST declaration. Section 2.2.1.5 on page 32 MMdtdEntity Represents an ENTITY declaration in a DTD. Section 2.2.1.6 on page 36 MMdtdNotation Represents a DTD NOTATION declaration. Section 2.2.1.7 on page 38 TABLE 1. The AM2SGML Classes Class Name Description Where Described Document Instance Classes MMsgmlDocument Represents an entire document instance. This corresponds to a DTD (MMdtd object) which describes the document instance. This contains a top-level element (MMdtdElement object). Section 2.2.2.1 on page 42 MMsgmlElement Represents an element in a document instance. This corresponds to an ELEMENT declaration (MMdtdElement object) in a DTD. This contains any number of sub-elements and text strings (MMsgmlPCData objects), or an MMsgmlEmpty object, which represents nothing at all. Section 2.2.2.2 on page 44 MMsgmlPCData Represents text data of type #PCDATA in an element. Section 2.2.2.3 on page 45 MMsgmlEmpty Represents the lack of data in a document instance element. In other words, this corresponds to the content model EMPTY. Section 2.2.2.4 on page 46 MMsgmlAttribute This represents an attribute of a document instance element. This corresponds to an item in a DTD ATTLIST declaration (an MMdtdAttribute object), which states which possible value this attribute can take. Section 2.2.2.5 on page 47 Classes Used in DTDs or Document Instances MMsgmlSectionMark MMsgmlComment Represents a section mark: INCLUDE, IGNORE, or none. Represents a comment in a DTD or document instance. Page 18; Section 2.2.1.8 on page 40 Section 2.2.1.9 on page 41 2.2.1 The DTD Classes Following are the classes used to describe various components of a DTD. Also described are the classes that can be used in both a DTD or a document instance. 2.2.1.1 The MMdtd Class This represents a DTD in its entirety. A DTD consists of one or more concurrent documenttype (DOCTYPE) declarations and possibly comments. 4 Therefore, the MMdtd class consists mainly of handles to MMdtdDocumentType classes, which represent DOCTYPE declarations, 4. Concurrent DOCTYPE definitions are different ways of organizing the same document. This is how one can specify overlapping tags in SGML document instances. and MMsgmlComment classes, which represent SGML comments. 5 The specification for MMdtd is given below. class MMdtd Overview MMdtd is a class of mutable objects which describe a group of concurrent DOCTYPE declarations. Methods upon Construct: list els, handle hMarkArg Requires: The elements in els are handles to either MMdtdDocumentType objects or MMsgmlComniment objects. els must contain at least one MMdtdDocumentType object. hMarkArg is a handle to an MMsgmlSectionMark object. Effects: Creates a new MMdtd object containing the DOCTYPE declarations given in els (as well as the comments), and with the marking specified by hMarkArg. upon ConstructFromFile: handle hFileStream Requires: hFileStream is a handle to a readable IOfile object. Effects: Creates an MMdtd object, from the DTD specified in the file in hFileStream. upon ConstructFromStream: handle hWebStream Requires: hWebStream is a handle to an IOwebStream subclass. Effects: Creates an MMdtd object, from the DTD specified by the stream IOwebStream. upon ConstructFromString: string s Effects: Creates an MMdtd object from string s. on DocTypes: return list Effects: Returns a list of handles to MMdtdDocumentType objects, representing the DOCTYPE declarations in sel f. on Comments: return list Effects: Returns a possibly empty list of handles to MMsgmlComment objects, representing the comments in sel f. on AddDocType: handle hNewDocType Requires: hNewDocType is a handle to an MMdtdDocumentType. Modifies: sel f. Effects: Adds the document type declaration corresponding to hNewDocType to the "end" of self. 5. C. M. Sperberg-McQueen, and Lou Burnard, editors, Guidelinesfor Electronic Text Encoding and Interchange: Draft Version 2, 1993, p. 23. on RemoveDocType: handle hDoc return boolean Requires: hDoc is a handle to an MMdtdDocumentType. Modifies: self, hDoc. Effects: Removes the document type hDoc from the DTD self. If hdoc was not present in self, does nothing and returns FALSE. Otherwise returns TRUE. on AddComment: handle hNewComment Requires: hNewComment is a handle to an MMsgmlComment. Modifies: sel f. Effects: Adds the comment corresponding to hNewComment to the "end" of self. on RemoveComment: handle hComment return boolean Requires: hComment is a handle to an MMsgmlComment. Modifies: self, hComment. Effects: Removes the comment hComment from the DTD self. If hComnment was not present in self, does nothing and returns FALSE. Otherwise returns TRUE. on Unparse: return string Effects: Returns a string representing self. Members The members of the class MMdtd are given in Table 2. TABLE 2. Members of MMdtd Member Type Description docTypeDecis list A list of handles to MMdtdDocumentType or MMsgmlConmment objects. Each of these represents a concurrent document-type declaration (or a comment); the order of these components in the list is the same as their order in the DTD. hMark handle A handle to MMsgmlSectionMark. The marking of the declara- tion. Activities none. 2.2.1.2 The MKdtdDocumentType Class This represents the information contained within a DOCTYPE declaration in a DTD. A DOCTYPE declaration has the following form: <! DOCTYPE name [ item+ ] > I <! DOCTYPE name [ system "file "] [item* ] > Each item is an entity, notation, attribute list, or element declaration. 6 Iffile is absent, then the document type is defined based on the items. Otherwise, it is defined based on the concatenation of the items and the declaration in file. In this case, there may be no items. The specification for MMdtdDocumentType is given below. class MMdtdDocumentType Overview An MMdtdDocumentType is a mutable object which represents a DOCTYPE declaration in a DTD. Methods upon Construct: string nameArg, handle hParentArg, list els, handle hMarkArg Requires: The elements in els are handles to MMdtdEntity, MMdtdNotation, MMdtdAttribute, MMdtdElement, or MMsgmlComment objects. els must contain at least one MMdtdElement object whose name is the same as the argument nameArg. hMarkArg is a handle to an MMsgmlSectionMark object. hParentArg is a handle to an MMdtd. Modifies: hParentArg. Effects: Creates a new MMdtdDocumentType object containing the components given in els and a mark corresponding to hMarkArg; ifhParentArg is not NULL, then self is treated as if it were declared in the DTD represented by hParentArg, and self is automatically added to hParentArg. upon ConstructFromDocType: handle hBaseDocType, handle hParentArg, list els, handle hMarkArg Requires: hBaseDocType is a handle to an MMdtdDocumentType object. hMarkArg is a handle to an MMsgmlSectionMark object. hParentArg is a handle to an MMdtd object or NULL. Modifies: hThisParent hParentArg. Effects: Creates an MMdtdDocument object, from hBaseDocType plus the elements in els and with a mark corresponding to hMarkArg. If hParentArg is not NULL, then self is treated as if it were declared in the DTD represented by hParentArg, and self is automatically added to hParentArg. 6. Sperberg-McQueen, pp. 23-24. upon ConstructFromString: string s, handle hContext Requires: hContext is a handle to an MMdtd object, or NULL. Modifies: hContext. Effects: Creates an MMdtdDocumentType object from string s. If hContext is not NULL, then self is treated as if it were declared in the context of the DTD corresponding to hContext. on AllItems: return list Effects: Returns a list of handles to all the items in the MMdtdDocumentType, including those declared in a file referenced by a SYSTEM reference. 7 Note that these can include handles to MMdtdEntity, MMdtdNotation, MMdtdAttribute, MMdtdElement, and MMsgmlComment objects. on Entities: return list Effects: Returns a list of handles to MMdtdEnt i ty objects, representing the ENTITY declarations in s e 1 f. on UnusedEntities: return list Effects: Returns a list of handles to MMdtdEntity object, representing the ENTITY declarations in self which are not used. An entity would not be used if there is another entity 8 within the DOCTYPE declaration with the same name. on Notations: return list Effects: Returns a list of handles to MMdtdNotation objects, representing the NOTATION declarations in s e 1 f. on Atts: return list Effects: Returns a list of handles to MMdtdAttribute objects, representing the ATTLIST declarations in sel f. on Els: return list Effects: Returns a list of handles to MMdtdElement objects, representing the ELEMENT declarations in s e 1 f. on RedundantElNames: return list Effects: Returns a list of strings, consisting of the names which are used for more than one element. on BaseEl: return handle Effects: Returns a handle to an MMdtdElement object, representing the highest-level element in sel f. This element must have the same name as sel f. on Comments: return list Effects: Returns a possibly empty list of handles to MMsgmlComment objects, representing the comments in sel f. 7. SYSTEM references are described on page 36. 8. If there are two ENTITY declaration with the same name, the first one is used. This means that if a given name is used for an ENTITY declaration in an explicitly declared entity as well as in an entity referenced with a SYSTEM clause, then the explicitly declared entity is used. on AddEntity: handle hNewEntity Requires: hNewEnt i ty is a handle to an MMdtdEnt i ty. Modifies: s e 1 f. Effects: Adds hNewEntity to the "end" of s e 1 f. on RemoveEntity: handle hEntity return boolean Requires: hEntity is a handle to an MMdtdEntity, and is an entity in the document type self. Modifies: self, hEntity Effects: Removes the entity hEnt i ty from document type sel f. If hEnt i ty was not present in self, does nothing and returns FALSE. Otherwise returns TRUE. on AddNotation: handle hNewNotation Requires: hNewNotation is a handle to an MMdtdNotation. Modifies: sel f. Effects: Adds hNewNotation to the "end" of self. on RemoveNotation: handle hNotation return boolean Requires: hNotation is a handle to an MMdtdNotation, and is a notation in the document type self. Modifies: self, hNotation Effects: Removes the notation hNotation from document type sel f. If hNotation was not present in self, does nothing and returns FALSE. Otherwise returns TRUE. on AddAtt: handle hNewAtt Requires: hNewAtt is a handle to an MMdtdAttribute. Modifies: s e 1 f. Effects: Adds hNewAtt to the "end" of sel f. on RemoveAtt: handle hAtt return boolean Requires: hAtt is a handle to an MMdtdAttribute, and is an attribute in the document type self. Modifies: self, hAtt Effects: Removes the attribute hAtt from document type self. If hAtt was not present in self, does nothing and returns FALSE. Otherwise returns TRUE. on AddEl: handle hNewEl Requires: hNewEl is a handle to an MMdtdElement. Modifies: s e 1 f. Effects: Adds hNewE1 to the "end" of self. on RemoveEl: handle hEl return boolean Requires: hEl is a handle to an MMdtdElement, and is an element in the document type self. Modifies: sel f , hEl Effects: Removes the element hEl from document type self. If hEl was not present in self, does nothing and returns FALSE. Otherwise returns TRUE. on AddComment: handle hNewComment Requires: hNewComment is a handle to an MMsgmlComment. Modifies: sel f. Effects: Adds hNewComment to the "end" of self. on RemoveComment: handle hComment return boolean Requires: hComment is a handle to an MMsgmlComment, and is a comment in the document type self. Modifies: self, hComment Effects: Removes the comment hComment from document type self. If hComment was not present in self, does nothing and returns FALSE. Otherwise returns TRUE. on Unparse: return string Effects: Returns a string representing self. Members The members of the class MMdtdDocumentType are given in Table 3. TABLE 3. Members of MMldtdDocumentType Member Type Description name string The name of the declaration. systemName string The "reference name" of this MMdtdDocumentType. This is the name that is used if this MMdtdDocumentType is referenced using the SYSTEM clause of another DOCTYPE declaration. hSystemRef handle A handle to an MMdtdDocumentType. If self contains a SYSTEM reference to another DOCTYPE declaration, then hSystemRef represents this declaration. items list A list of handles to the elements in the DOCTYPE declaration. This does not include elements referenced by a SYSTEM clause. hMark handle A handle to MMsgmlSectionMark. The marking of the declaration. hParent handle A handle to an MMdtd. The DTD object in which this declaration is found. Activities none. 2.2.1.3 The MMdtdElement Class The MMdtdElement class models an ELEMENT declaration in a DTD. An element decla9 ration has the following form: 9. "The SGML Primer." < ! ELEMENT element-type beginning-tag-optional?end-tag-optional?content-model [inclusion-list] [exclusion-list] > Here, element-type is the name of the element. beginning-tag-optional?and end-tagoptional?state whether the beginning and end tags respectively must be included in an element of this type in an SGML document instance. If the beginning tag is required, then beginning-tagoptional?is - (a dash); otherwise, it is O (the letter). end-tag-optional?works the same way. content-model specifies exactly what kinds of elements can be included in element-type, and in what order. inclusion-listand exclusion-listare exceptions; an inclusion exception is an element that can be included anywhere in the current content model, and an exclusion exception is an element that cannot be included in the content model. The two lists can appear in any order. An inclusion list has the form + ( inc-elt I inc-elt2 I inc-elt3 I... inc-elt, ) while an exclusion list has the form -( exc-elt, I exc-elt2 I exc-elt3 ... exc-eltm) where the inc-elts and exc-elts are element names. 10 For example, consider the following element declaration (taken from the sample DTD on line 19 on page 69). <!ELEMENT HTML 0 0 &HTMLContent; +(EM)> 10.Sperberg-McQueen, pp. 13-14. Both the beginning and end tags are optional. The content model is &HTMLContent, which is an entity representing the text (HEAD, BODY). The inclusion list consists of the element EM, and there is no exclusion list. Consider also the declaration of the the TITLE element (taken from the sample DTD on line 26 on page 69). <!ELEMENT TITLE - - #PCDATA -(EM)> Both the beginning and end tags are required, and the content model is #PCDATA; the exclusion list consists of the element EM. The specification for MMdtdElement is given below. class MMdtdElement Overview An MMdtdElement is a mutable object representing an ELEMENT declaration in a DTD. Methods upon Construct: string name, handle hParentArg, boolean isBeginOptional, boolean isEndOptional, handle hContentModelArg, list includeExs, list excludeExs, handle hMarkArg Requires: hParentArg is a handle to an MMdtdDocumentType object or is NULL. hContentModelArg is a handle to an MMdtdContentModel object, includeExs and excludeExs are lists of handles to MMdtdElement objects. hMarkArg is a handle to an MMsgmlSectionMark object. Modifies: hParentArg. Effects: Creates a new MMdtdElement object. The beginning and ending tags of the specified element can be omitted if isBeginOptional and isEndOptional are TRUE, respectively. The element specified can contain the data corresponding to hContentModelArg, and can include the elements in includeExs, but not this in excludeExs. The element declaration has the mark corresponding to hMarkArg. If hParentArg is not NULL, then the element declaration is defined in the context of the document type defined by hParentArg. upon ConstructFromString: string s, handle hContext Requires: hContext is a handle to an MMdtd object or NULL. Modifies: hContext. Effects: Creates an MMdtdElement object from s. If hContext is not NULL, then self is treated as if it were declared in the context of the DTD corresponding to hContext. on IsRedundant: return boolean Effects: Returns TRUE iff self is defined in a document type in which another element with the same name as self is defined. on Unparse: return string Effects: Returns a string representing self. Members The members of MMdtdElement are given in Table 4. TABLE 4. Members of MMdtdElement Member Type Description isBeginOpt boolean TRUE iff the beginning tag of an element defined by self is optional. isEndOpt boolean TRUE iff the ending tag of an element defined by self is optional. hContent- handle A handle to an MMdtdContentModel object. This specifies exactly what types of data an element defined by self can contain. Model hMark handle A handle to MMsgmlSectionMark. The marking of the declaration. hParent handle A handle to an MMdtdDocumentType, or NULL. The document type in which self is defined, if any. inclusionExs list A list of elements which can be included anywhere within the content model of self. exclusionExs list A list of elements which can be included anywhere within the content model of sel f. atts list The list of all attributes defined for self. Activities none. 2.2.1.4 The MMdtdContentModel Class An MMdtdContentModel element represents a content model in a DTD. A content model specifies exactly what type of data can be contained in an element. There are a couple of "base types" of data. These are denoted by EMPTY (which signifies no data), and #PCDATA, which signifies text. In addition to these base types, more complex types can be created by combining base types and elements with "operators." The following are the operators defined for content models (note that e can refer to a base type, an element, or a combination thereof). * e? " e* * e+ - This means that data of type e may or may not occur. In the MMdtdContent model class, this operator is called ' optional. - This means that any number of instances (including zero) of data of type e may occur. This element is called ' optionalRepeatable. - This means that one or more instances of data of type e must occur. This element is called ' requiredRepeatable. * el , e2 - This means that data of type e1 followed by data of type e2 must occur. This element is called ' sequential. * e1 &e2 - This means that data of type e1 and data of type e2 must occur, in any order. This element is called ' and. * el I e2 - This means that either data of type e1 or data of type e2 must occur. This element is called ' or. In addition to these operators, parentheses may be used for grouping. The specification for MMdtdContentModel is given below. class MMdtdContentModel Overview An MMdtdContent model is an immutable representation of an SGML content object. Methods upon ConstructEmpty Effects: Creates an MMdtdContentModel corresponding to EMPTY. upon ConstructPCData Effects: Creates an MMdtdContentModel corresponding to #PCDATA. upon ConstructEl: handle hEl Effects: Creates an MMdtdContentModel corresponding to the element hEl. upon ConstructComplex: string opArg, list args Requires: args is a list of handles to MMdtdContentModel objects. opArg is 'optional, 'optionalRepeatable, 'requiredRepeatable, 'sequential, ' and, or ' or. Effects: Creates an MMdtdContentModel object corresponding to the operator opArg applied to the arguments in args. If there are extra arguments in args (e.g. if opArg is ' and, and args has length greater than one) then the extra arguments are ignored. upon ConstructFromString: string s, handle hContext Requires: hContext is a handle to an MMdtd object, or NULL. Effects: Creates an MMdtdContentModel object from s. If hContext is not NULL, then self is treated as if it were declared in the context of the DTD corresponding to hContext. on IsEmpty: return boolean Effects: Returns TRUE iff self refers to the EMPTY content model. on IsPCData: return boolean Effects: Returns TRUE iff self refers to the #PCDATA content model. on IsEl: return boolean Effects: Returns TRUE iff self refers to an element. on IsComplex: return boolean Effects: Returns TRUE iff self refers to a complex content model, formed by an operator and one or more other content models. on GetEl: return handle Requires: ('IsEl => self) == TRUE. Effects: Returns a handle to an MMdtdElement, the element corresponding to self. on GetOp: return string Requires: ('IsComplex => self) == TRUE. Effects: Returns the operator of self, as a string. The possible values are the same as those which can be used for the string argument to ConstructComplex. on GetArgs: return list Requires: ('IsComplex => self) == TRUE. Effects: Returns the arguments of self, as a list of handles to MMdtdContentModel. on Unparse: return string Effects: Returns a string representing self. Members The members of MMdtdContentModel are given in Table 5. TABLE 5.Members of MMdtdContentModel Member Type Description modelType string This is the type of the content model - one of ' empty, ' PCData, ' el, or ' complex. Activities none. For example, in the code in Appendix A, on line 31, the content model for the BODY element is (HR I #PCDATA) *. In order to manually create an MMdtdContentModel object representing this, the following code segment could be used. 1 MMdtdContentModel 'ConstructPCData => PCDataModel; // Create the object for #PCDATA 2 3 MMdtdContentModel {'ConstructEl, hHR} => HRModel; // This assumes hHR is the handle to an MMdtdElement 4 // object representing the HR element 5 6 MMdtdContentModel {'ConstructEl, hP} => PModel; // This assumes hP is the handle to an MMdtdElement 7 // object representing the P element 8 9 MMdtdContentModel {'ConstructComplex, 'or, {&HRModel, &PCDataModel}} => 10 HROrPCDataModel; 11 #PCDATA) // This represents (HR 12 13MMdtdContentModel {'ConstructComplex, 'or, {&HROrPCDataModel, &PModel}} => 14 unrepeatedModel; 15 #PCDATA I P) // This represents (HR 16 17MMdtdContentModel {'ConstructComplex, 'optionalRepeatable, {&unrepeatedModel} } => bodyContentModel; 18 #PCDATA)* // This represents (HR 19 2.2.1.5 The MMdtdAttribute Class An MMdtdAttribute object represents an attribute of an element in a DTD. In a DTD, a list of attributes can be specified for each element. For example, in the DTD given in Appendix A, the ATTLIST declaration on line 39 describes the attributes for the element P: align and nowrap. There would be a separate MMdtdAttribute object for each of these. 11 An attribute declaration has the form <!ATTLIST element-type 11."The SGML Primer." attribute-name, attribute-value1 default-value1 attribute-name2 attribute-value2 default-value2 attribute-name3 attribute-value3 default-value3 attribute-namen attribute-valuen default-valuen Here, element-type is the element that the attribute corresponds to. Each attribute-nameis the name of the attribute. Each attribute-valuedescribes which values the attribute can take. This can be one of CDATA, ENTITY, ENTITIES, ID, IDREF, IDREFS, NAME, NAMES, NMTOKEN, NMTOKENS, NOTATION, NUMBER, NUMBERS, NUTOKEN, NUTOKENS, or a list of enumerated types. 12 Each default-value is the default value of the attribute. This can be one of the following: 13 * Data of the type described by the corresponding attribute-value. * # IMPLIED, which means that this attribute does not need to be specified when an instance of the element element-type is defined. * #REQUIRED, which means that when an element of type element-type is defined, the value of this attribute must be given. * #CURRENT, which means that when an element of type element-type is defined, the value of this attribute is the same as the value of the attribute in the most recently defined element of type element-type, unless otherwise specified. For example, in the sample DTD, the attribute align of element P can take the values lef t, center, right, or justify. By default it takes the value left. The specification for MMdtdAttribute is given below. 12."The SGML Primer." 13."The SGML Primer." class MMdtdAttribute Overview An MMdtdAttribute is an immutable representation of an attribute of an SGML class. Methods upon ConstructType: handle hEl, string nameArg, string attTypeArg, string defaultStat, any hDefaultVal Requires: hEl is a handle to an MMdtdElement. attTypeArg is one of ' cData, 'entity,'entities, 'ID, 'IDRef, 'IDRefs, 'name,'names,'nmToken, 'nmTokens,'notation,'number,'numbers, 'nuToken,or 'nuTokens. defaultStat isone of 'implied, 'required, 'current,or 'given.If defaultStat is 'given, then hDefaultVal is not NULL, and has type corresponding to the entry in Table 6. Modifies: hEl. Effects: Creates an MMdtdAttribute for element hE1. The attribute has name nameArg, and has type corresponding to attTypeArg. If defaultStat is 'given, then the attribute has the default value represented by hDe f aultVal, otherwise its default status is given by defaultStat. TABLE 6. Possible Types of hDefaultVal Type of value (e.g. Value of attType (or thisAttType) hDefaultVal) 'cData string 'entity string 'entities list 'ID string 'IDRef string 'IDRefs list 'name string 'names list 'nmToken string 'nmTokens list 'notation handle to MMdtdNotation 'number integer 'numbers list of integers 'nuToken string 'nuTokens list of strings of strings of strings of strings of strings upon ConstructEnum: handle hEl, string nameArg, list vals, string defaultStat, string defaultVal Requires: hEl is a handle to an MMdtdElement. defaultStat is one of ' implied, 'required, ' current, or ' given. vals is a list of strings. If defaultStat is 'given, then defaultVal is not empty, and is equal to an element of vals. Modifies: hEl. Effects: Creates an MMdtdAttribute for element hEl. The attribute has name nameArg, and can have a value of one of the elements of vals. If defaultStat is 'given, then the attribute has the default value defaultVal, otherwise its default status is given by defaultStat. upon ConstructFromString: string s, handle hContext Requires: hContext is a handle to an MMdtd object, or NULL. Effects: Creates an MMdtdAttribute object from s. If hContext is not NULL, then self is treated as if it were declared in the context of the DTD corresponding to hContext. on IsType: return boolean Effects: Returns TRUE iff self is not of an enumerated type. on IsEnum: return boolean Effects: Returns TRUE iff self is of an enumerated type. on Unparse: return string Effects: Returns a string representing self. Members The members of MMdtdContentModel are given in Table 7 on page 35. TABLE 7. Members of MMdtdContentModel Member Type Description hEl handle If self is not of an enumerated type and defaultStat is ' given, then this is the default value of self. It has the type given in Table 6 on page 34. name string The name of the attribute. attType string The type of the attribute; one of the values given in Table 6 on page 34. defaultStat string One of 'implied, 'required, 'current,or 'given. enumVals list If self is an enumerated type, then this is a list of the possible val- ues of self. Otherwise, it should be empty. defaultVal handle If self is not an enumerated type and defaultStat is ' given, the default value of self. It has the type given in Table 6 on page 34. If self is an enumerated type, this is a handle to a string, representing the default value of self. Activities none 2.2.1.6 The MMdtdEntity Class An MMdtdEntity represents an entity in SGML. An entity can be a parameter entity, which means that it can be used in SGML declarations, or not.14 15 An entity has the form < !ENTITY [%] entity-name [SYSTEM] "replacement-entity-text" [SUBDOC] [NDATA notation-name] > If the percent sign (%)is included, then the entity is a parameter entity. If SYSTEM is not included, then wherever "&entity-name;" appears in a document described by the DTD, it will be replaced by replacement-entity-text.If SYSTEM is included, then wherever "&entity-name; " appears in a document described by the DTD, it will be replaced by the contents of the file replacement-entity-text. If SUBDOC is included in addition to SYSTEM, 16 then replacement-entity-textrepresents an SGML document instance with its own DTD. If NDATA is included (along with SYSTEM), then notation-name represents a notation, which in turn represents a method for interpreting a file. This method would be used to interpret the file replacement-entity-text.17 The following is an example of such a declaration: <!NOTATION gif SYSTEM "/usr/bin/gifViewer"> <!ENTITY mePict SYSTEM "/mit/jcgentry/me.gif" NDATA gif> 14.Sperberg-McQueen, p. 22. 15."The SGML Primer." 16."The SGML Primer." 17."The SGML Primer." Wherever mePic t was found in a document instance, it would be taken to mean the file /mit / j cg entry/me . gif. Furthermore, it would be understood that this file can be read by the program /usr/bin/gifViewer. Examples of entity declarations are given starting on line 8 in the sample DTD in Appendix A. The specification of the MMdtdEntity class is given below. class MMdtdEntity Overview An MMdtdEntity object is an immutable representation of an SGML ENTITY declaration. Methods upon Construct: string nameArg, handle hParentArg, string hValArg, boolean isParameter, boolean isSystem, boolean isSubdoc, handle hNotationToUse Requires: hParentArg is NULL or a pointer to an MMdtdDocumentType object. hNotationToUse is NULL or a pointer to an MMdtdNotation object. Modifies: hParentArg. Effects: Creates an MMdtdEntity named nameArg, with value hValArg. If isParameter is TRUE, then it is a parameter entity; if isSystem is TRUE, then it is a system entity, with hValArg representing a file name. If hParentArg is not NULL, then the entity declaration is defined in the context of the document type defined by hParentArg. If isSystem and isSubdoc are both TRUE, then hValArg represents an SGML file with its own DTD. If hNotationToUse is not NULL, then it represents the notation which should be used to interpret the file represented by hValArg. upon ConstructFromString: string s, handle hContext Requires: hContext is a handle to an MMdtd object, or NULL. Effects: Creates an MMdtdAttribute object from s. If hContext is not NULL, then self is treated as if it were declared in the context of the DTD corresponding to hContext. on Unparse: return string Effects: Returns a string representation of self. Members The members of MMdtdEntity are given in Table 8 on page 38. TABLE 8. Members of Mdtfdntity Member Type Description isParameter bool- TRUE iff self is a parameter entity. ean isSystem boolean TRUE iff self isa system entity name string The name of the entity. isSubdoc boolean TRUE iff val represents an SGML file with its own DTD. val string the value of the entity. hNotation handle A handle to an MMdtdNotation (or NULL). The notation used to interpret val. Activities none For example, the entity on line 8 on page 69 could be created with MMdtdEntity {'Construct, 'HTMLContent, NULL, "(HEAD, BODY)" TRUE, FALSE, FALSE, NULL} => myEntity; The entity on line 13 on page 69 could be created with MMdtdEntity {'Construct, 'infoFile, NULL, "/usr/local/html.info", FALSE, TRUE, NULL} => myEntity2; 2.2.1.7 The MMdtdNotation Class The MMdtdNotation class represents an SGML notation. A notation is a technique used 18 to process a type of data which could be included in an SGML document. A notation has the following form: 19 18."The SGML Primer." 19."The SGML Primer." < !NOTATION notation-name SYSTEM "system-identifier" > For example, on line 48 of the sample DTD, a notation called eq is defined, and associated with the file /usr/bin/eqView. This presumably means that equation data can be included in a document instance of this DTD, and that data could be processed using the program /usr /bin/eqView. The specification for MMdtdNotat ion is given below. class MMdtdNotation Overview An MMdtdNotation object is an immutable represents a NOTATION declaration in an SGML DTD. Methods upon Construct: string nameArg, handle hParentArg, string valArg Requires: hParentArg is a handle to an MMdtdDocumentType object, or NULL. Modifies: hParentArg. Effects: Creates an MMdtdNotation with name nameArg and value valArg. If hParentArg is not NULL, then the notation declaration is defined in the context of the document type defined by hParentArg. upon ConstructFromString: string s, handle hContext Requires: hContext is a handle to an MMdtd object, or NULL. Effects: Creates an MMdtdNotation object from s. If hContext is not NULL, then self is treated as if it were declared in the context of the DTD corresponding to hContext. on Unparse: return string Effects: Returns a string representation of self. Members The members of MMdtdNotation are given in Table 9 on page 39. TABLE 9. Members of MKdtdNotation Member Type Description name string The name of the notation. val string The value of the notation. hParent handle A handle to an MMdtdDocumentType object. The document type in which the notation is declared. Activities none. 2.2.1.8 The MMsgmlSectionxark Class As described on page 18, sections of a DTD or a document instance can be marked. An MMsgmlSectionMark object represents one of these marks. The specification of MMsgmlSectionMark is given below. class MMsgmlSectionMark Overview An MMsgmlSectionMark object is an immutable representation of an SGML section mark. Methods upon ConstructIgnore Effects: Creates a section mark corresponding to IGNORE. upon ConstructInclude Effects: Creates a section mark corresponding to INCLUDE. upon ConstructEntity: handle hEntity Requires: hEnt i ty is a handle to an MMdtdEnt i ty object. Effects: Creates a section mark corresponding to the entity represented by hEntity. upon ConstructNone Effects: Creates a section mark corresponding to the absence of a section mark. i.e., if a section is marked with this section mark, then it is as if the section is not marked at all. (In effect, this is the same as marking the section with INCLUDE.) upon ConstructFromString: string s, handle hContext Requires: hContext is a handle to an MMdtd object, or NULL. Effects: Creates an MMsgmlSectionMark object from s. If hContext is not NULL, then self is treated as if it were declared in the context of the DTD corresponding to hContext. on IsIgnore: return boolean Effects: Returns TRUE iff s e 1 f corresponds to the IGNORE mark. on IsInclude: return boolean Effects: Returns TRUE iff s e 1 f corresponds to the INCLUDE mark. on IsEntity: return boolean Effects: Returns TRUE iff self corresponds to an entity. on Unparse: return string Effects: Returns a string representation of self. Members The members of MMsgmlSectionMark are given in Table 10. TABLE 10. Members of MMsgmlsectionmark Member Type Description markType string The type of mark this is. One of ' include, ' ignore, 'none, or ' ent i ty. markEntity handle If self corresponds to an entity, this is the MMdtdEntity object representing that entity. Activities none 2.2.1.9 The MMsgmlComment Class This class represents a comment in a DTD or in an SGML document instance. Its specification is given below. class MMsgmlComment Overview An MMsgmlComment is an immutable object representing an SGML comment. Methods upon Construct: string textArg Effects: Creates a comment with text textArg. upon ConstructFromString: string s Effects: Creates an MMsgmlComment from the string s. on Unparse: return string Effects: Returns the string representation of s e 1 f. Members The members of MMsgmlComment are given in Table 11. TABLE 11. Members of Magm1Coment Member Type Description text string The text of the comment. Activities none Note that MMsgmlComment has two similar constructors. Construct takes the body of a comment as its argument. For example, MMsgmlComment {'Construct, "This is my comment text"} => myComment The constructor ConstructFromString, on the other hand, takes the comment body plus the comment delimiters, as follows: MMsgmlComment { 'ConstructFromString, "<!-- This is my comment text -- >" } => myComment 2.2.2 The Document Instance Classes The following are the classes which represent an SGML document instance. 2.2.2.1 The MsgmlDocument Class This class represents a document instance as a whole. It consists mainly of a top-level element instance. An MMsgmlDocument object should also contain a pointer to an MMdtd which describes the object.The specification for MMsgmlDocument is given below. class MMsgmlDocument Overview An MMsgmlDocument is a mutable representation of an SGML document instance. Methods upon Construct: handle hDTDArg, handle hTopEl Requires: hDTDArg is a handle to an MMdtd object. hTopEl is a handle to an MMsgmlClass object. Effects: Creates an MMsgmlDocument with data correponding to hTopClass. upon ConstructFromFile: handle hFileStream Requires: hFileStream is a handle to a readable IOfile object. Effects: Creates an MMsgmlDocument from the data in hFileStream. upon ConstructFromStream: handle hWebStream Requires: hWebStream is a handle to an IOwebStream subclass. Effects: Creates an MMsgmlDocument object from the data in hWebStream. upon ConstructFromString: string s Effects: Creates an MMsgmlDocument object from s. on IsGood: return boolean Effects: Returns TRUE iff self is a valid document instance. (This means, in part, that the top-level element can be properly described by the DTD). on Unparse: return string Effects: Returns a string representation of self. Members The members of MMsgmlDocument are given in Table 12. TABLE 12. Members of MMsgmlDocument Member Type Description hDTD handle hTop handle A handle to an MMdtd object. The DTD describing the document instance. A handle to an MMdtdElement. The top-level element. Activities none 2.2.2.2 The MsgmlElement Class This represents a SGML element instance. It consists of a "list" consisting of items which can include other elements, text data represented by MMsgmlPCData objects, or nothing at all, which is represented by an MMsgmlEmpty object. An element can also contain a list of attributes. An attribute in an element instance is represented by an MMsgmlAttribute object. The specification for MMsgmlElement is given below. class MMsgmlElement Overview An MMsgmlElement object is a mutable representation of an SGML element instance. Methods upon Construct: handle hParentArg, handle hSpec, list itemsArg, list atts, handle hMarkArg Requires: hParentArg is a handle to an MMsgmlDocument or NULL. hSpec is a handle to an MMdtdElement. itemsArg is a list of handles to either MMsgmlElement, MMsgmlPCData, or MMsgmlEmpty objects. atts is a list of MMsgmlAttribute objects or empty. hMarkArg is a handle to an MMsgmlSectionMark object. Modifies: hParent. Effects: Creates an MMsgmlElement object, in the context of hParent if it is given. The element is described by hSpec, consists of items, and has mark hMarkArg. If the element has any attributes specified, they are given in atts. upon ConstructFromString: string s, handle hContext Requires: hContext is a handle to an MMsgmlDocument object. Modifies: hContext. Effects: Creates an MMsgmlElement from string s, in the context of hContext. on IsGood: return boolean Effects: Returns TRUE iff the items in self are properly described by the element specification corresponding to s e 1 f. on AttsNotGiven: return list Effects: Returns a list of MMdtdAttribute objects, which are the attributes for self which are not specified but need to be. on Unparse: return string Effects: Returns a string representation of sel f. Members The members of MMsgmlElement are given in table Table 13. TABLE 13. Members of MMagmlement Member Type Description items list A list of handles to MMsgmlElement, MMsgmlPCData, and MMsgmlEmpty objects. These are the data which make up the element. allAtts list A list of handles to MMsgmlAttribute objects. These are the values of all the attributes for this element. hParent handle A handle to an MMsgmlDocument. The document in which self is contained. hMark handle The mark of this element. Activities none 2.2.2.3 The MsgmlPCData Class This class represents text data. More specifically, it represents text data of the SGML type #PCDATA. Note that this data can include entities. The specification for this class is given below. class MMsgmlPCData Overview An MMsgmlPCData object is a mutable representation of SGML text data. Methods upon ConstructFromText: string text Effects: Creates an MMsgmlPCData object from text, which is assumed to have no entities. upon ConstructFromString: string s, handle hContext Requires: hContext is a handle to an MMsgmlDocument object. Effects: Creates an MMsgmlPCData object from s (which may include entities). It is created in the context hContext. on AddText: string newText Modifies: sel f. Effects: Adds the text newText to the end of self. on AddEntity: handle hNewEntity Requires: hNewEnt i ty is a handle to an MMdtdEnt i ty object. Modifies: sel f. Effects: Adds the entity represented by hNewEntity to the end of self. on AsText: return string Effects: Returns the contents of s e 1 f, with all entities replaced by the text they represent. on Entities: return list Effects: Returns a list of MMdtdEnt i ty object, representing the entities included in self (in order). on Unparse: return string Effects: Returns a string representation of s e 1 f. Members The members of MMsgmlPCData are given in Table 14. TABLE 14. Members of MMISglPCData Member Type Description data list A list of handles to strings or MMdtdEntity objects. This is the data represented by sel f. Activities none 2.2.2.4 The MMsgmlEmpty Class This class represents the EMPTY data content. class MMsgmlEmpty Overview An MMsgmlEmpty object is an immutable representation of the SGML EMPTY data construct. Methods upon Construct Effects: Creates an MMsgmlEmpty object. upon ConstructFromString: string s, handle hContext Requires: hContext is a handle to an MMsgmlDocument object. Effects: Creates an MMsgmlEmpty object from s (which may include entities). It is created in the context hContext. on Unparse: return string Effects: Returns a string representation of selif (i.e., 'EMPTY). Members none. Activities none. 2.2.2.5 The MMsgmlAttribute Class This class represents an attribute to an SGML element, with a given value. The value is expressed as a handle. The type of the object to which the handle points depends on what SGML type the attribute has. The possibilities are given in Table 6 on page 34. The specification for MMsgmlAttribute is given below. class MMsgmlAttribute Overview An MMsgmlAttribute is an immutable representation of an instance of an attribute in SGML. Methods upon Construct: handle hSpec, handle hValArg Requires: hSpec is a handle to an MMdtdAttribute; val has type specified in Table 6 on page 34. Effects: Creates an attribute instance with value hValArg for an attribute specified by hSpec. upon ConstructFromString: string s, handle hValArg Requires: hSpec is a handle to an MMdtdAttribute. Effects: Creates an MMsgmlAttribute object from s. It is created as an instance of the attribute specification MMdtdAttribute. on IsGood: return boolean Effects: Returns TRUE iff the value of self is an allowable value, given the possible values of the attribute. on IsDefaultValue: return boolean Effects: Returns TRUE iff the value of sel f is also the default value of sel f. on Unparse: return string Effects: Returns a string representation of self. Members The members of MMsgmlAttribute are given in Table 15 on page 48. TABLE 15. Members of MMagmlPCData Member Type Description hSpec handle A handle to MMdtdAttribute. The attribute corresponding to self. val handle The value of self. This has type given in Table 6 on page 34. Activities none 3 The AM2SGML C++ Classes A set of C++ classes, which form the basis of the AM2SGML ADL classes, has been partially implemented, and is described below. Once a full set of C++ classes has been written, they can be "wrapped." This will make them available to the ADL programmer as the ADL classes described in Chapter 2. Much more work needs to be done on the C++ classes. However, they currently provide a basic level of functionality. 3.1 YASP A decision was made early on to use a pre-existing SGML parser in the implementation of the AM2SGML C++ classes. There are numerous good SGML parsers available, both commercially and in the public domain, and it would have taken much redundant effort to write a new parser from scratch. For AM2SGML, the Yorktown Advanced SGML Parser (YASP) was used. 3.1.1 Why YASP? YASP was chosen because it meets two criteria. First, it is in the public domain. Second, it has a well-documented application programming interface (API). YASP was the only parser that could be found which meets both of these criteria. The parsers YAO and SP were also considered; both are in the public domain, but the APIs for both are seriously lacking in documentation. While the YASP documentation is in many ways far from ideal, the document The SGML Parser Interface: FunctionalSpecification Version 1.25 is much more thorough than the documentation 1 for the other two parsers. 3.1.2 An Overview of YASP YASP is designed to set up an interactive relation between the YASP parser itself, henceforth called the "Parser," and the client program which is using the parser, henceforth called the "Application." YASP was designed to be as platform-independent as possible. To accomplish this, the Application performs any platform-specific functions that are necessary. Examples of such functions are allocating memory and accessing files. The flow of control is passed back and forth between the parser and the Application. The Application calls the Parser main entry point (the PRSMAIN function) when it is ready to begin. The Parser then starts parsing an SGML document. Whenever the Parser needs the Application to perform a platform-dependentservice, or whenever the Parser comes to an interestingparsing event, it turns control over to the Application. Examples of interesting parsing events would be the start or end of an element, or the start or end of a DTD. The Application performs the platform-dependent service or acts on the interesting parsing event, and then passes control back to the Parser. Information is passed back and forth between the Parser and the Application in a Parser/Application Communication Structure, or PAC. 3.2 Overview of the AM2SGML C++ Functions Currently, AM2SGML consists of C++ functions which will read an SGML file, parse the file, and return a structure which represents the overall element structure of the SGML file. The top-level C++ function is parseSGMLFile. Among other parameters, this function takes the name of a text SGML file. parseSGMLFile sets up a PAC structure to be used with the YASP parser, and then calls the main YASP parser entry point, PRSMAIN. 1. Geoff Bartlett and Pierre Richard, The SGML ParserInterface: FunctionalSpecification Version 1.25, Yorktown Heights, IBM T. J. Watson Research Center, 1992. One of the fields of the PAC data structure is called ase. This field contains a pointer to the function that YASP calls whenever it needs a platform-dependent service or whenever YASP reaches an interesting parsing event. parseSGMLFile sets this field to the function dispatch. Another field is user__p. This is where AM2SGML stores the applicationdata. Also stored there is space for the structure that AM2SGML uses to represent the parsed SGML document. This structure has the type SGMLDocument. Whenever YASP calls dispatch, it passes to it the original PAC structure as an argument. The func field of this structure is set to a code which represents the platform-dependent service that YASP needs performed or the interesting parsing event that it has found. The dispatch function is basically a large switch statement. There are seperate functions to deal with each possible platform-dependent function and each possible interesting parsing event; these functions are called the service functions. dispatch calls the appropriate service function. Each of these returns 0 if it encounters no error, or an integer between 1 and 10 otherwise. When a service function returns, dispatch takes its return value, and returns it to YASP. Whenever YASP comes to an interesting parsing event and calls the appropriate service function, this service function modifies the SGMLDocument structure stored in the application data, if necessary. After YASP is finished parsing the entire SGML file, PRSMAIN returns control to the function parseSGMLFile, which called it. By this time, the SGMLDocument structure stored in the user information represents a totally parsed SGML document. parseSGMLFi le returns a pointer to this structure. This entire process is described in more detail below. 3.3 AM2SGML Module Descriptions Each C++ file and class of AM2SGML is described below. The function used to test AM2SGML is described also. All the code for AM2SGML is given in Appendix B. 3.3.1 The Test Function The test function, given in Section B. 1, takes four command line arguments. The first of these is the name of an SGML file to be parsed. The second is the name of a DTD file, which is optional if a DTD declaration is already in the SGML file. The third is the name of an OCS file (which is a parsed SGML declaration), and the fourth is the name of an ODT file (which is a parsed DTD). Only the first argument is necessary. If the second, third, or fourth arguments are not present, they should be replaced by the integer 0. The test function calls parseSGMLFile, and passes it the names of the files given on the command line. Once parseSGMLFile returns the SGMLDocument object, the test function calls the method SGMLDocument: :unparse, which return a text representation of the SGMLObj ect. This representation is then output to the screen. This representation can be checked against the original SGML file to see if the file was parsed correctly. 3.3.2 The parseSGMLFile Function This is the top-level AM2SGML function. It sets up the PAC, creates a message handler, creates the structure used for the user information, and calls PRSMAIN. These steps are explained in more detail below. The declaration for this function is given in Section B.3, and it is defined in Section B.4. First, a new PAC structure called pac is created. The following fields of pac are set: * id - This is the version of the current pac structure. Its value is the constant PAC_IDENTIFIER, which is stored in one of the included YASP header files. * ase - The function that YASP calls when it needs a platform-dependent service or it encounters an interesting parsing event. This function must take a pointer to a PAC structure as a parameter, and return an int. This field is set to the function dispatch, described in Section 3.3.3. * user_..p - This is where application data is kept. The application data is stored in a structure of type AppData. This structure is describer below. After pac is set up, parseSGMLFile creates a message handler. Whenever YASP encounters an error, it informs the Application by referring to an error number. The error numbers and their corresponding error messages are all stored in a file. The message handler is in charge of reading this file. It has a member function which will take an error number and return an error message. The message handler object is described in Section 3.3.6. After creating the message handler, parseSGMLFile creates a structure for application data of type AppData. This structure is called myData. The important fields of myData are as follows: * primaryEntity - The name of the SGML file being parsed. * DTDFi 1 e - The name of the DTD file being used, or NULL if none is given on the command line. * dtd - The name of a DTD object. This is the object that is returned after a DTD is parsed. At the current time, however, AM2SGML does not actually parse DTDs. * doc - The SGMLDocument object that is created during parsing. * current - The current element pointer.This is a pointer to the SGML element that is currently being parsed. This is initially set to NULL. * msgHandler - A pointer to the message handler being used. After setting up myData, parseSGMLFile is ready to call PRSMAIN. PRSMAIN returns 0 if it encounters no errors. If this is the case, then parseSGMLFile returns a pointer to the SGMLDocument structure created during parsing, which is stored in the doc field of myData. If PRSMAIN returns anything but 0, then parseSGMLFile returns NULL. 3.3.3 The dispatch Function This is the function that is called by YASP whenever it needs a platform-dependent service or it has an interesting parsing event to report. Its declaration is given in Section B.5 on page 74, and its implementation in Section B.6 on page 75. dispatch takes as an argument pac, which is a pointer to a PAC structure, and it returns an int. YASP expects dispatch to return 0 if it encounters no error, or an integer between 1 and 10 if it encounters an error. Exactly which integer is returned depends on why YASP called dispatch, and on what type of error dispatch encountered. YASP indicates what platform-dependent service it needs or what kind of interesting parsing event it has encountered by setting the func field of pac. This field has type PFC, which is an enumerated type whose values represent the different service functions. There should be a separate service function for each possible value of the func field. At the moment, the only functions which exist are those which correspond to the more frequently requested platform-dependent services and the more common parsing events. dispatch looks at the func field of pac, and calls the corresponding service function. It does this by using a switch statement. The service functions which are currently implemented are given in Table 16. Some of the service functions do not actually do anything yet; they simply return 0. The func values for these functions are given in italics TABLE 16. The Service Functions Value of func Name of Service Function Description of Service Function Interesting Parsing Events ELTST_PFC eltSt The start of an element Section 3.3.5.1 on page 58 ELTND_PFC eltNd The end of an element Section 3.3.5.2 on page 59 RE_PFC re Relevant record end (this is when a record is ended unexpectedly by the end of a file) TABLE 16. The Service Functions Value of func Name of Service Function Description of Service Function TEXT_PFC text Test data has been encountered Section 3.3.5.3 on page 59 PI_PFC pi A processing instruction has been encountered PROST_PFC proSt Section 3.3.5.13 on page 64 The beginning of the prolog has been encountered. The prolog consists of the SGML declaration and DTD PROND_PFC proNd The end of the prolog has been encountered DOCND_PFC docNd The end of a document has been reached Section 3.3.5.14 on page 65 ETYST_PFC etySt The start of an entity has been encountered (an entity in this case is the same as a file) ETYND_PFC etyNd The end of an entity has been encountered SKIP_PFC skip For some reason, data in the SGML file has been skipped DECST_PFC decSt The start of an SGML declaration has been encountered DTDSTPFC DTDSt The start of a DTD has been encountered Section 3.3.5.15 on page 65 DTDND_PFC DTDNd The end of a DTD has been encountered Section 3.3.5.16 on page 65 DAPND_PFC dapNd The end of the document has been encountered right after the end of the prolog Platform-Dependent Services MSG_PFC msgs Print a message Section 3.3.5.4 on page 60 SGET_PFC sGet Get storage Section 3.3.5.5 on pa ge 61 SFRE_PFC sFre Free storage Section 3.3.5.5 on pa ge 61 FIND_PFC find Create a file Section 3.3.5.6 on pa ge 61 XENOP_PFC xEnOp Open a text file Section 3.3.5.7 on pa ge 62 UTOPRPFC utOpR Open a binary (utility) file for reading Section 3.3.5.8 on pa ge 63 UTOPWPFC urOpW Open a binary file for writing Section 3.3.5.8 on pa ge 63 UTWRT_PFC utWrt Write to a binary file Section 3.3.5.9 on pa ge 63 UTRD_PFC utRd Section 3.3.5.10 on page 63 Read from a binary file TABLE 16. The Service Functions Value of func Name of Service Function Description of Service Function UTCL_PFC utCl Close a binary file Section 3.3.5.11 on page 64 XENRD_PFC xEnRd Read from a text file Section 3.3.5.12 on page 64 XENCLPFC xEnCl Close a text file Section 3.3.5.11 on page 64 3.3.4 The SGMLObj ect Class and its Subclasses The SGMLObj ec t class is intended to be a virtual base class for classes representing SGML objects. At the present time, it is a virtual base class for the classes SGMLDocument, SGMLElement, and DTD. (Currently, DTD does not do anything; its declaration is given in Section B.13 on page 81, and its trivial implementation is given in Section B.14 on page 81.) The declaration of SGMLObj ec t is given in Section B.7 on page 77, and the implementation is given in Section 1 on page 77. The SGMLObj ec t class handles error functions for its child classes. Any type of SGML object can have an error state. If any sort of error occurs during the parsing of an SGML object, then the error state for that object is set to something other than noError. At the present time, AM2SGML is not extremely robust, and it does not make much use of error states. The child classes of SGMLObj ect are described below. 3.3.4.1 The SGmLDocument Class An SGMLDocument object represents an entire SGML document instance. An SGMLDocument has a top-level element, which is the element that shares the name of the document instance. The member function setTopE1 sets the top element of the SGMLDocument, and the member function getTopEl returns a pointer to the top element. The unparse member function returns a string representation of the document instance. At present time, this consists of the string <Document>, a string representation of the top-level element, and the string </Document>. The declaration of SGMLDocument is given in Section B.9 on page 78, and its implementation in Section B. 10 on page 78. 3.3.4.2 The SGMLElement Class The SGMLElement class represents an element. Like SGMLDocument, it inherits from SGMLObj ect. In SGML, an element can consist of other elements, which in AM2SGML are called containees; text data, of type #PCDATA; or nothing at all., which in SGML has type EMPTY. In the future, objects representing #PCDATA and EMPTY should also be considered containees. But at the present time, #PCDATA and EMPTY within an element are ignored. An SGMLElement has a name. Pointers to the containees of an SGMLElement are stored in the member array containees. The member function addContainee adds a containee to this list, and the member function getNContainees returns the number of containees in this list. SGMLElement also has a member function unparse. If the name of an SGMLElement is elt, then unparse returns a string consisting of the following: * The string <elt> * Strings representing any elements contained in elt. Note that this does not include text data or EMPTY. * The string </elt> For example, if elt consisted of the elements elt2 and elt3, and if elt2 in turn consisted of the element e 1 t 4, than the string obtained by unparsing el t would be similar to the following: <elt> <elt2> <elt4> </elt4> </elt2> <elt3> </elt3> </elt> The declaration of SGMLElement is given in Section B. 11 on page 78, and its implementation is given in Section B. 12 on page 80. 3.3.5 The Service Functions There are 28 service functions currently implemented. The declarations and implementations of all of them are given in Section B.15 on page 81 through Section B.55 on page 95. The more important ones are described below. 3.3.5.1 The eltst Function The el tSt function, declared in Section B. 15 on page 81 and defined in Section B. 16 on page 81, is called whenever YASP encounters the beginning of an element in a document instance. YASP sets the dad field of the PAC structure to a pointer to a structure representing an element description called a document element descriptor (DED). At the moment, AM2SGML only looks at the part of the DED which represents the name of the element. The first thing that eltSt does is to get the application data from the PAC; it sets myData to point to it. Second, eltSt gets the DED structure from the PAC, and points ded to it. It then creates a new SGMLElement object, pointed to by newEl, which represents this new element. It figures out the name of the element from the DED (it is stored in ded->eltp->name .p), and calls the function newE 1- >s e tName to set the name of the new element. (In the future, it would be useful to have a constructor for SGMLElement which takes the element's name as an argument.) At this point, there are two possible situations. The first is that the new element that YASP encountered is the top-level element. If this is the case, then YASP calls myData->doc->setTopEl (newEl), which sets the top-level element of the object representing the document we are parsing to this new element. It then sets the current element pointer, myData->current, to the new element. The second situation is that the new element newEl is not the top-level element. In this case, newEl must be a containee of the current element. eltSt therefore calls myData->current->addContainee (newEl), which adds this new element to the list of containees of the current element. (addContainee also sets the container of newEl to be the current element.) eltSt then sets the current element pointer to the new element. As soon as the end of the new element is encountered (that is, when YASP calls the eltNd service function), then the current element pointer will be set back to its previous value. The eltNd function is described in Section 3.3.5.2. The eltSt function returns 0 unless there is a problem calling SGMLElement: : addContainee. In this case it returns the value 10. 3.3.5.2 The e1ltNd Function YASP calls this service function when it encounters the end of an element. e1ltNd sets the current element pointer to the container of itself, which is found by calling myData->current->getContainer (). eltNd always returns 0, as there is no way for it to fail. The declaration of e 1 tNd is given in Section B.17 on page 82, and its implementation is given in Section B.18 on page 82. 3.3.5.3 The text Function This function currently does nothing. YASP calls it whenever it encounters text data within an element. A new class should be implemented to represent SGML text data. This new class could inherit from SGMLElement. Then, when text was called, an instance of this class would be created and added to the current element much in the same fashion that a containee element would be. The trivial current implementation of text is given in Section B.20 on page 83. 3.3.5.4 The msg Function This service function is called whenever YASP wants to send a message. This happens when it encounters some sort of error, or when it has some kind of warning to give. Ideally, AM2SGML would look at the content of these messages, and act accordingly. In the current implementation, however, AM2SGML simply prints these messages to stderr. YASP usually sends a number of messages in a row; a group of messages is called a suite. Before AM2SGML calls the YASP entry point PRSMAIN, it creates a MessageHandler object. This object reads and stores all the possible messages and their numbers from a file. A pointer to the message handler is stored in the application data, in the field msgHandler. The YASP message file is actually a series of templates. These templates contain strings such as %1 and %2, which are supposed to be replaced by actual data when a message is sent. When YASP wants to send a message, it gives AM2SGML the following: * A list of data, to be "plugged in" to the message template. The first element in this list replaces %0, the second replaces %1, and so forth. This list is stored in the dad field of the PAC * The severity of this suite of messages. This is represented by an integer, which is given in the errsev field of the PAC. The possible error severities are given in Table 17. TABLE 17. YASP Message Severities Number Type of Message 0 Informational message 4 Warning 8 Error 12 Severe error 16 Terminating error * The message identifier. This is the integer that the message handler uses to find the proper message template. This is stored in the msgcod field of the PAC * Whether or not this is the last message in the suite. If it is, the msglast field of the PAC is set to true; otherwise, it is set to false. msg calls the get InstantiatedMessage method of the message handler, giving it the list of data and the message identifier. The method returns a string, which is the message with the data plugged in. msg then prints this string. If the severity of the message is above a certain value called autoQuit (which is defined in msg. h), then msg returns 10. Otherwise, it returns 0. The declaration for msg is given in Section B.22 on page 83, and its implementation in Section B.23 on page 83. 3.3.5.5 The sGet and sFre Functions This service function is called by YASP when it needs storage. The amount of storage that YASP needs if given in a structure called an ADLEN, found in the stg field of the PAC. An ADLEN contains a pointer and an integer. The integer in this case is the amount of storage (in bytes) requested. Once storage is allocated, it is returned in the pointer of the same ADLEN structure. If the memory was successfully allocated, sGet returns 0. Otherwise, it returns 10. sFre frees the storage in the stg field of the PAC. It always returns 0. The code for sGet and sFre is given in Section B.24 on page 85 through Section B.26 on page 85. 3.3.5.6 The find Function The find function is called by YASP whenever it needs to access a file. The Application is supposed to create a FilelDand return it to YASP. Whenever YASP needs to read from or write to the file, or when it wants to open or close the file, it gives the Application the FileID. AM2SGML has a class called File, which it uses for a FileID. The File class is described in Section 3.3.7 on page 66. When it calls find, YASP sets the asgn_c1s of a structure called an EXID, which is given in the dad field of the PAC, to a code which represents which type of file YASP needs to access. The different types of files are calledfile classes (not to be confused with C++ classes). The file classes which are currently handled by AM2SGML are given below. TABLE 18. YASP File Classes Name Description CAPACITY_XFC These represent capacity sets, notation data, and concrete syntaxes, respectively. These are all parts of an SGML declaration. Here, YASP gives the Application a code which represents a specific file. The code is stored in the dad field of the PAC. AM2SGML has a function publDFileName (given in Section B.64 and Section B.65) which takes this code and returns the name of a file. NOTATIONXFC SYNTAX_XFC CHARSETXFC This represents character data. Here, YASP gives the Application a string representing an SGML character set, and the Application returns a code representing that character set. AM2SGML uses the function charsetlD (given in Section B.66 and Section B.67) to determine these codes. UTODTW_XFC As YASP parses a DTD, it outputs a compiled form of the DTD. Here, YASP is requesting a binary file to which it can write the compiled DTD. It is up to the Application to determine the name of this file. AM2SGML takes the name of the SGML file being parsed, and replaces any suffix with odt. UTSYNU_XFC YASP similarly parses SMGL declarations. Here, YASP is requesting a binary file to which it can write the compiled declaration. AM2SGML uses the name of the SGML file, replacing its suffix with ocs. UTSYNL_XFC This means that YASP is parsing an SGML file without a declaration, so it is requesting a file which contains a parsed declaration. AM2SGML assumes that if a parsed declaration is needed, then the name of a file containing one was given on the command line. PRIMARYXFC This represents the SGML file to be parsed. The declaration for find is given in Section B.27 on page 85. The implementation is in Section B.28 on page 86. 3.3.5.7 The xEnOp Function This is the function that YASP calls when it needs to open a text file for reading. It sets the ahl field of the PAC to a FilelD that it has previously requested. Since in AM2SGML FileIDs are simply File objects, xEnOp only needs to call the File: : openRead method. If the file is successfully opened, xEnOp returns 0. Otherwise, it returns 6. The declaration for xEnOp is given in Section B.29 on page 88. The implementation is in Section B.30 on page 88. 3.3.5.8 The utOpR and utOpw Functions YASP calls these service functions when it needs to open a binary file for reading or writing, respectively. The AM2SGML File class does not differentiate between binary and text files (at least where opening and closing them is concerned), so utOpR just calls xEnOp. utOpW simply gets the File object from the ahl field of the PAC, makes sure it is not already open, and if not calls its File: : openWrite method. If the file was already opened, utOpW returns 4. If the file is not successfully opened, utOpW returns 6. Otherwise, it returns 0. The code for utOpR and utOpW is given in Section B.31 on page 88 through Section B.33 on page 89. 3.3.5.9 The utwrt Function This function is used by YASP to write to a binary file. The Fil e object is stored in the ahl field of the PAC, and the data to be written is stored in the dad field of the PAC, in an ADLEN structure. The pointer in the ADLEN structure points to the actual data, and the integer in the ADLEN structure is set to the length of the data. AM2SGML uses the File: :put method, which also takes a pointer and an integer, to write the data. The declaration for utWrt is given in Section B.34 on page 89, and its implementation in Section B.35 on page 89. 3.3.5.10 The utRd Function This function is used to read from a binary file. Once again, the FilelD is stored in the ahl field of the PAC, and the dad field contains an ADLEN structure. The integer part of the ADLEN structure is the amount of data that is to be read. Once the data is read, it is put into the pointer part of the ADLEN structure. utRd uses the File: : readLen method to read from the file. It returns 0 if successful, and 8 if the file was not opened for reading, or if there was a problem reading from the file. The declaration for utRd is given in Section B.36 on page 90, and its implementation in Section B.37 on page 90. 3.3.5.11 The utCl and xEnCl Functions These functions do exactly the same thing - close files. As the File object opens and closes text and binary files the same way, there is no difference between these functions. In fact, all utCl does is place a call to xEnC1. xEnCl simply gets the File object from the ahl field of the PAC, and calls its close method. These functions always return 0. The code for utCl is given in Section B.38 on page 90. The code for xEnCl is given in Section B.41 on page 92 and Section B.42 on page 92. 3.3.5.12 The xEnRd Function This function is used by YASP to read data from a text file, given in the ahl field of the PAC. YASP does not care how much data is read. xEnRd simply calls the File: :get method, which reads one line of data, and puts the line that was read in the dad field of the PAC. xEnRd returns 8 if the file is not open for reading, 4 if the file reaches the end, and 0 if everything goes okay. The code for xEnRd is given in Section B.39 on page 91 and Section B.40 on page 91. 3.3.5.13 The proSt Function YASP calls this function when it reaches the start of the SGML prolog. The SGML prolog consists of the SGML declaration and/or the DTD. It is at this time that AM2SGML creates a new SGMLDocument object, which represents the document instance. This object is stored in the doc field of the application data. (Since an SGMLDocument represents only a document instance, and a document instance does not include DTDs or declarations, the new SGMLDocument object should probably be created once the end of the prolog is reached, when YASP calls proNd, as opposed to when the start of the prolog is reached.) The declaration for proSt is given in Section B.43 on page 92, and its implementation in Section B.44 on page 92. 3.3.5.14 The docNd Function docNd is called when the end of the document is reached. Currently, this function does nothing, but in future versions of AM2SGML more "clean-up" work might be performed here. The current implementation is given in Section B.46 on page 93. 3.3.5.15 The DTDSt Function This service function is called by YASP when it reaches the start of a DTD. When this happens, AM2SGML creates a new DTD object to represent the DTD. As explained before, the DTD object currently does not do anything. DTDSt does cause one to be created, however. The DTD object is stored in the dtd field of the application data structure. The declaration for DTDSt is given in Section B.52 on page 94 and its implementation in Section B.53 on page 94. 3.3.5.16 The unimplFn Function This function is called by dispatch when it receives a request from YASP to perform a service function that is not yet implemented. In the final version of AM2SGML, all the service functions should obviously be implemented, and this function will be unnecessary. unimplFn simply ouputs an error message to the screen, telling the number of the service function that was requested. unimplFn always returns 10, since after it has been called, the parsing of the SGML file cannot go on. unimplFn uses the notify function to send the error message to the screen. Code for unimplFn is given in Section B.56 on page 95. 3.3.6 The MessageHandler Object The MessageHandler object is responsible for reading the YASP message template file, remembering the templates, and then instantiating a template with a variable list when necessary. The specification of MessageHandler is given in Section B.58 on page 95, and its implementation is given in Section B.59 on page 96. A MessageHandler can be "good" or "bad" - if there is a problem during creation (for example, when trying to read the template file) then a "bad" message handler is created. A MessageHandler has the unary operator ! which returns true if it is bad. The MessageHandler class has methods getMsg and getID which return the message template and a message ID string given a message number, as well as the method getInstantiatedMsg which takes an array of strings and a message number, and plugs the strings into the template corresponding to the message number. 3.3.7 The File Class The Fil e class is used for the YASP FileID. YASP needs a way to create a file object with a name before that file is opened; neither the C FILE type nor the C++ file stream classes seemed to be able to provide this functionality. A F i e can be opened in three modes - read, write, and append (which is not yet implemented). There are simple methods for doing various types of reads and writes to a file. The File class is implemented using the C FILE type. The declaration for the File class is given in Section B.60 on page 99; its implementation is in Section B.61 on page 101. 4 The Future of SGML and AM2 Quite obviously, there remains much work to be done on the implementation of AM2SGML. Many more C++ functions and classes need to be written. Roughly, there should be a C++ class for every ADL class described in specifications in Chapter 2. Also, the ADL classes themselves need to be written. This is accomplished by a process called wrapping,which makes certain parts of C++ classes visible to the ADL programmer as ADL classes. Classes which can parse SGML files will prove to be a useful addition to AM2. They will provide an easy, standardized way to store text information. Almost any AM2 application which needs to store or retrieve text data will be able to take advantage of AM2SGML. There are currently a few projects being developed at CECI which could use SGML. One of these is called OperacidnFuturo.One part of this application is an "electronic workbook." This is supposed to be similar to a regular textbook, except for the fact that it is entirely on line. The workbook is currently implemented as a group of HTML pages. However, it has become clear that HTML does not allow for much flexibility in the way that these workbook pages are designed. If SGML were used, a more specialized DTD for the workbook could be created. However, there still would need to be a way to display the workbook pages once they are parsed. The ability to parse SGML becomes much more useful when there is a way to use the resultant structures to display the content of the SGML. There currently exist a few standards for specifying the way SGML documents should be displayed; two of the more common ones are the Output Specification (OS), developed by the United States Department of Defense, and the Docu- ment Style Semantics and Specification Language (DSSSL). 1 It would be useful to examine these standards, to see if they could be used with AM2. AM2 is already able to manipulate and display an impressive array of media types, including images, movies, and sounds. With the development of AM2's SGML capabilities, text data would be added to this list. The ability to process different types of marked-up coupled with the ability to display them in a customized manner would prove to be one of AM2's more powerful features. 1. "Getting Started." Appendix A A Sample DTD The following DTD specifies a (quite small) subset of HTML. Note that in this DTD, SGML "keywords" are in bold, and comments are in i talics.Parts of this DTD are based on Dave Raggett's HTML DTD. 1 I <!-- A DTD for a simple subset of HTML -- > 2 3 <!-- The first DOCTYPE declaration will specify tags which we 4 normally associate with HTML. The second declaration tries to 5 split an HTML document into physical pages. -- > 6 7 <!DOCTYPE HTML [ <!-- Typical HTML tags --> 8 <!ENTITY % HTMLContent "(HEAD, BODY)"> 9 <!-- Wherever "&HTMLContent;" appears 10 in this DTD (or in a document 11 instance described by it), it will 12 be replaced with "(HEAD, BODY) " -- > 13 <!ENTITY infoFile SYSTEM "/usr/local/html.info"> 14 <!-- Wherever "&infoFile;" appears in 15 a document instance described by 16 this DTD, it will be replaced with 17 the contents of the file 18 "/usr/local/html.info' --> 19 <!ELEMENT HTML 0 0 &HTMLContent; +(EM)> 20 <!-- The beginning and end tags for an 21 "HTML' section are optional. 22 We want emphasized text to be able 23 to appear anywhere (except for in 24 a title) -- > 25 <!ELEMENT HEAD 0 0 TITLE> 26 <!ELEMENT TITLE - - #PCDATA -(EM)> 27 <!-- The beginning and end tags for a 28 title are necessary. 29 We do not want to allow emphasized 30 text in the title -- > 31 <!ELEMENT BODY 0 0 (HR I P #PCDATA)*> 32 <!-- The body of an HTML document can 33 consist of any number of horizontal 34 lines (HR), paragraphs (P), or 35 units of plain text (#PCDATA) -- > 36 <!ELEMENT EM - - #PCDATA> <!-- Emphasized text --> 37 <!ELEMENT HR - 0 EMPTY> <!-- A horizontal line -- > 38 <!ELEMENT P - 0 #PCDATA> <!-- A paragraph --> 39 <!ATTLIST P 1. Dave Raggett, "Document Type Definition for the HyperText Markup Language (HTML DTD)", 1995. 40 41 42 43 align (left I center I right I justify) nowrap (nowrap) #IMPLIED left -- The alignment of the paragraph by default, it is left-aligned --- Disable word wrap -- 44 > 45 ]> 46 47<! DOCTYPE p.HTML [<!-- An (unusual) page structure for HTML -- > 48 <!NOTATION eq SYSTEM "/usr/bin/eqView"> 49 <!-- Equations might appear in the 50 document.., these can be processed with "/usr/bin/eqView" -- > 51 52 <!ELEMENT page - 0 #PCDATA> <!-- This specifies a "page" --> 53 <!ATTLIST page pageNumber NUMBER #REQUIRED> 54 ]> Appendix B Code for AM2SGML On the following pages is all of the C++ code for AM2SGML, including the program used to test the AM2SGML functions. The makefile that was used is given in Section B.70 on page 107. It assumes that all the files are in the same directory, and that the YASP library yasp. a is in the directory stored in the variable 1 ibDir. A sample run of the overall program is given in Appendix C. U 0"lc a)W •) U) Z 0 0* rHrHo • 0O -)O 0 V 00d SOW QQ V O 0J -oW -H Q 41 a)v v v V V II V 0 -. ,rI 0 I~4 SO Q04 V -SV 4 W 4 0) -O O -r V Q) Vv VAv -I -V Q U ý 0k- 4-) U) >1 S 0 r-- >1 r34 ato a40 c~q >-4 - 04401I U) a) Ue '4 0 U o 4~4 U) ) ý4-H r0 (0 Wo 41 0LIQ 44 04 44 rdd ") rl 0 0 0 H 40 co) ,COW 0*-H0D 0 C0 O ý41 4-) to .4: a) -H 41 O 0 OW o 41 04 W41 Enrd a) -- I II -H 40W P4 *rI II (0 0 Q) 40 4; U) E12 E-4 -H -H : 1 --ý CIA r1r)'It V) ,c II II WW SW 4 01 II II II II 0 C) CD W ,-H CD U) HQ0)3 4**i -)> 44 -H : -)HO 0 w O 0 O1dH F- -H 4:: W00 Q p>6 0 rH 0 U)0))* 4a 41rH 0) Cd -Ic Q U4I i J rH-H 4 4 ~ 0 Q) Q) 0) -H -H V -H roQ) Q ou0 4#H -H Cd S 4-) -H II -H W 41 II 0 -H 4 V) )0 WdWri U 00rdi 4-Jrd rilHl 0 -P4-4 410 -4 -HO 0 > 0 0 0) W4W k - - WH ---I -H -Hi 44r 04 r 0 H U WOV \\-0 Q -H . ** II r-- ,-H -IU) -H I II- 41 U) 0) 1 0 O 41 4141C Cd41 4-) 0 0 C) 0 4 0 0*0 0- H 0 Q) WOO U)W 0 0 C ,41 (0 0 SC0 00 0 00 0 - 0 00410410 0 E--4 44 -H -H E- F v L r.-A r- ýX ,CdS-- . r-I ** 41 - 0-H r- A -H 4-) -H 0 * 4-) o c4 W a) rIZ 0> 1O4 0) Cd -- ---Y >00000 0 0 U 0 Cd -H r- ; u >1 a) 4-) 0 4-) 00 00 *0 - - 0 C,1 W)U) 4• 4j --- .-4HO 0 *0 0 41 S. -) 4- ,.. a Cd A 0>1 4- a4) -H u 4-) o, 0 .0 C". -H o*-SMC °I C-) U 4 *) S H 'a. 004-) -H a) ,I -H .r..4 :t.- -H rzi II II II II Ic: 0 0 0u 5 U)4- IU) SH P4 W 4-) -,-H o) 44 CdEd 4Z rý -H Q 00u-: On 40 -H f-d m -H Cd "0 -O ý- >12 4.-) -H- 0 ) •) HrU0(rl H ,-H a- ar-, H 0-, -H -4N rrM t k I O 0o <Z'ýN 00O N - - -) - - -rI- VN - - -oo -- 0 (z (NN , Na(f V. N\ -ý-ýN N N (4C4N 0 (N (oN 00 (0N (Z N ,I N C4r4 r ? y * nof r Cr (1) U) 44 rH -H - , Cd UO Cd 4 rz -a > 0 a )ýU Q) ) U) oU H 44 ý4-H O -I) U) -U) 0) 0 ro ro0) Fc: l U m) U)C 0) 0 *Q) UH) -H 00 0)U) Q4 CdrH Oc N (N (N (n (j (N (N o- rN C•C•-H 4 o 4Cd E-WU U) -- U) 0 U) CD - , Cd Q4 0 0 rO 4 0 *0 4 S-H LW0 0 > 4 U) '4-4 H 0N (Ný * m0 -H 0**'4H4U r:0 U) N- 0 0 S0 I,s Uo 0 r0r E-i U)4 CE o r4E-1 CO a ---U) Q o C-) U)EU)V Q -E-4 ro U) Q U) ('0 -H4 E-4 6 0 4-i H m-,i-'- UWH 0 4IJ U) 0-H C -H Q U 4. -QH Q 0 ,c: t- ý4 104 m -Cd -• o ,-t 00 OUO U U) 4-) U) '-0 E-, 04 io . -4 0 00U)O 0-• S00 -H . ) -H 44 fT FX4ýRj r.. --) 00) a) r- ii MUU) 0 .4 N "# 't ' tr- o '0 o ON' .e -- , N W W Q) -4II O W U 0 r. 04 0 04Z W WH .HO E-4 4-4 n 0 --0 E1--- :1 -H 0 -r 0 .1 II -09 II U) SrH O-H 4--) WE 0 400 o O-H E-1 (0 >j 0 M -r-4 04 ý (.d rd0 -H rHW d0)0 U -H -> II CA 0 (O A O-S E-Z S U) 0O 0 4 4H (-1) ý4aJ CM II F0 0J 0 0Ird Q)Wc$ .•t Wor 0 O W Ud 0 0 0444 SU) J0 O 1-4 44 u 0 •O 0 ro A •4 1 WQ >1 0 > S * 04 to 0 ) 44- 4 U,C - '--- .M r 04 H 4.) a.) u. 1--I ýj O W000 E-4 (1 W -H 04 A I" 0 - 1 onn ra .H4 *00 •-0 O 04d -H 0 00 00 00 00 000000 01.1 0\O0.1 0 .1o -Oro • 04,C Q)44 O 4 J U);WU) Cd 14 ,-4 4 W Q 0 -0 -H 4 U) r4 , U) .-H W -0 1)44 IZI -H 5 -0 -0 U)-H ,- - ,C 00 0.,se fl n I- C-,4 I '04rboN . 'l OO O 44 - t -0 0 0 -II I 0>4 W 1--i U) U)-H Oio t - 01 -0 -H -. r4 44 II II -0 -H N MZý )kr r mz (0 04 9 kýV 00045 04 -040 V ývý *H O 6 -II -0 uW 0 -H 0 0 rO 0 E-0• 04 04 0 II U) Z -H 040 04 -0 A 040 >41-0 -05 14W 4 -~ , 0 cl- ,ýD-H > 11 r40 U 0 - '--- II 0d 0 W X4 0 0-H-H .o4-0 W 14W 4U) 011--0 4 40 -U) Cd -HO~C 4 14 A Q)A 51-4 W1 Wi 0 m4J 0 W -H U) 4 0cd 2 -f 00 44> -H U 4-- II -H 0 .. U)Z 1-4 Z 14-) o 0 1-4 -0-0 Q0) -H WG N -~c ~0- 41Q) -H r-0 - - 1 - d0 :J40 WO W 0)- 44 000 0EU-I O- U) W04 .ý 0 S4 11 So 445 ý4 W 04 UC 0) rd -O1 - 0)3 U) 0- ul d 04Cd 44 U) -H -H \ -H ýD 4iJ ý4 0o - ca -H 041 (0 r-0 U) '0 U,.- ý4 J '0 4JW 04-H ,4 r 0 0 0 U) W0OO ~U) ý4 rW 0rd )- W•ii 04 04 "1 ý .H 0U) U) 00 -H '0 4-H ,Q v -H 1-4 O l 0 0H v 0*ýON O dU) CdU) >U) 1-4U) U• \OtNo •O 0 tm 0 U0 U) rmd mQ)-n rH 04 -H -H -0 8 ,C 40 4 rOF) - 00 °H 04 H I -0--- - O A ,C A 4404C 0 0 00O Oio 1% o 11 ll l ý L ý toýcNkO O L ý10 LO ýO 10 -Ir 't-o F=: 42 0 W 0ro V ý4 0 2; 0E 0) 0 U) 0) ) Cd 4ý 0 0r- .-H v o . ý4 2' -H tH4 U Cd | CO ,O0 04 ,- - P-4 :Q • -- 4ro ,C U) U)E-4 r-l 8 -H -H # * -H >i to W 0) Q)Q uI WW4 WW V0 u) (0 4J U) )-iQ (C 0 I 4-4 0a)a •:1 o (4 r4U U) -I Cd V Q " U) - c SI- F4 045I - 42 to 42 9 H- r-- fT 124--ý4 U):iW \ -HW 4U U) rH 04 D4 A • 04 ~04 .. ,-- C) ; O o -Co SUz C'44 C-) 4 co ---- Q)Cd .. to, N 00 0ý 0\ ". - t 00 94-1 0 W -H 1 4.4 rL- r-q -,-I -4 - ( 0> W U1) 4-4 -H -:4 4-442i 5 o0 P4 V4I 04 0) -H42 --(1) 4 At k 0 .. 0 U) U) ::I .S(-I 0 CL 4 S4-4 P W 4 4o 444 0*) ( >1 V 4W 0 U)- a) U) -Hl ,CdW 4-1 4-4V -H to$ 4-1 04-41 -- 0) (3 *ra - - -- - P4 r-c -- 5 HC 0 . r 4 5 4WJ 4-U) U) --H - -H tO V- to: ,0 ,i) ,0 42 to ,c5 U) 44 Z )a)Z a) XWX toh -H -H >1 WWW tototo :5:5:5 r--i 00 r-t - -HrH (1 U or E Cd-Hr-HHO Q04 T$ (1 r WW to toc * * ýj000u uJ ýý c-H rc-H y0 'I 41 0 0 n WW W rc- rcr-H-H OU -H -H -H -H -H Q) 44 444-) H 0.4 41r-I -- r--I 0o:3uofl V >-1 utoW W r- WWWWW -H -H -H z:4 * )O rH rH$ ý5 ; roýjj tHj cVVVVVV rH ro -r-H -H -H uu OQ -H -H -H -H -H -H -H -H # # #I- 1# =: -W H- :V o 0 \-zrýN(? t ) otr 00\ý - 0 U) 44 0 0 cd Co I-Il 0 U4 0 04 04 °o 4.-4 0 .r-°) 04 4-4 0 0 04 Q) °o 0 -H 43 -H U)) 4J m 0 °..O c. 4 0-D .. -.---- ,-, r1 4 ro >1 04 zoO 0 -) S0 °. 1... (NU UU) 0-- P4 O M a4 (z H Dm 1- O ý4 Q)Q ý4 C-) (1 0 O Cq rn Itt ~ U) 0 O u D u U -a(, nIt )Iotý OIo.o) 00 z ýC 000ý C) Q) lJ ý4) z Q uQ) .Wa n ' e)ý rc h o >ý( s loO )1ý ~,, -H- ý4 0 -,i 0 ý-q 4-, a) a) 0) O I0 0 -H 0) U) 0 04 -H o4o C) - ° 0- o - -H .- ; co~I ýD - P4 Uo U)m 4 0 O "N. N N N- N z EID E-1 a) U) 4EWa ýD H 00 0 t 00 0 ' 00 0 00 0 0 t " 0 00 0 C) HU °d r°°4~lx °°) Wa) °° 0 U) rH a) C) 41-ý4 U r* E~I °4 -•, cr.d co 0) P4 -H R4-W 0• -IJ 4 0\ 0\ ON 0- C o " 0 0 \ U) U) N 0\ I × U O o L1.1 0 o 0' 00 0 C2 IQ -'** 4C) U.) 0 04J -H ý4 °ci SU) o a) 0 u 42 rU Qi) 0 o**) r.0 0,U) ý4 0 u4 42 U) ci-H U) -90 ý444 0 -r U) j 'fýU) 0 -U ai) O 0--o O " " -4 (0 0C ( -HO () 0(n rd 0 4 C: rH Cd4-4 H -• -- -H -ON 0 0 U) 44) -H -- -. -ci °• 0 4J 0 0ci) U) En 00m>0 0If -r- 0 ~0 0 OW0 44 r 044 ~44 42 0 00ý4 -rc 0 O 0 00 U) 0. rH -H-I 42 0 U) 0 C ,- ci 0 -H Qý N ýo "I-) (ý,00 It -ý I- N Itt N-) I- 'tIt V) It 11r) Y)rn rn "*t rn tr) C'n'In rn Oý fn Q) rn -- ,Z) O --. N 4-)U) 0 -q U) -H 4.2 44 0(Di-)0 ~0 U)Q)0 Oc -HCdc 0Oc$ OO -H ,C >1 o 00 -- lO II U) 4 °4 44 0 .r 0 (o II 0 a c) ci II a)a Q) 4 rc$ 04 iH 04 J.) cri U 0 04 .1, EQ 0 0 U) '-~ Lr-~ Ir~ '~N (N~1 ~ LrN )r~ 'c>1 00 00 0 424 u r -0 *W 0 0 W0 LfN 0C0 0 0 -H 42W 0442 4 0 -r-1 WQ H w o OW rn1 0 a V) U) 'd -H E -HE 42 ~- U) 42 .i) S Fi ON ~ Cd SQ ) ý4 4-) U u 4242 cici -H -H 44W 4H r) ro 0 0 u00 S0 EU)0 U) -n 0 -m 42 "d 0• 0U0 04-i UD 0 "n (]) -H -H -H 0U) 41 U)r 4-)4-H4-)0 42c4 MCd 0 WU) r• -,-04 ,0-4 o I-I I1 U) 0 I-H 0 u 0 a U) 0 h4 (1) '4-4 4-4 ý4 Irl A 4--)i C') -H - 440 0 O / 41 M 0 A 4 - V ý4- 0 u * Uo 0 O U) (D F oJ u 4 0 C) 0)sU CdE >JF -H0i 4-4 r-I-H ýE: d 0 Q 0 -H 0d -H 0-i- 0 U) In, 0Om-U 0 04 0 Qý 41 U) 0 OQ - 0P -) U -*ý4 CJ) -4-4 Cd W r! SU) aH U 0P- O- p- 4A .,1 m -4 4-'-' 41 44H 0 0 0 0 O0O 7 UII 0 m A u -r H--m (: 5 - U) r, - S -Q) 0 04 u A **U) F 0 0 0 C) r **0 rl i r. 4-) CI) Q) C *. 0 4->1 v~ -H H I 0 0 nl-~ Q) Ci) S0) A 4-W -4 ~-4 - 4- 4- ýU q% ) Q) Q)% ) 0 (0 0 ý44 9 Cd . U Cd rcU M- 4 0VA 40 - U) 0- ý 0 C4 ~ l)C 00 ) IC U) O A)~ J..) U)1 43 -- o* DU q 0 O O 0D 0 O OOq Cd 0 H Q) 41 0 4- O *- 0U0 r- E-U4Q) rH H U) U) 0 Cl) O QQ)0 r 0Cxw QQ-4 44 U) ro a) : -ý * r u 0 4 4 41 ~ 4-) U) -H Q)UQ)44rH H 0 p Q) - -H U QH 44M -:3 - 04 U) Cl) CdU) In U* -0H 4J 4 rU) C/ -3, . 11 0 04 4J Q) 4- w 0 nQ4)r---. -H -H44 -3 -H w 41 U4.4 U) ;Hj U)) 44 -w4- 0 4- U) ) 00rd -0 -H 4 1-' 0U)CJ Q)r--4 0U4U)1 Q) 4U1U 0 U) W0 ** 0 0 E-4- -H14 >)H4 w U)H U)HU (0U)1d 0 0-4 41U1 U) ý-H 44 00 UO U) OQ)0 0 U) Su 0 i0 E 00 0 U) 0S4 U).'O U) 0 ,q)d U)U $J: 4-) r-- D -H 4-' Cl) 4- 0 01 0 -H Q U)3 0 U) U 44 4 J En q4 Q) U* - Z U) 0 C)4 -Q444) -U) HU H d-d 000 0 ~44-' r Q U)- a) c 0 O U) U) ) 0 0 -H UJ Q) Q) O U) 00 A.) -H * ooU 2 - o U) C04 :: Q O W O ý-t V) (D U) 4- Or 0 4-i OO 4-4 O O 0 O a 4I-4 0 CO 4-4 H a) U) O SU) 0 0 )0 4-i 40U) co 0 4-4 o 4-i 0.H 0 r. 0 -H UW d00 W 0 oOW W41l -H U ()00 4 4L-44 4 -H 0 5 9 Z4-i W M-H u 4. 4-i•C.) •4)4U).. 4-i b-OU zC P (D 4J r44 U, 44 H044 U) SU) U-.- JU U)U-) *~' H 0 o) 4HUo .-0 I '-4 4-)0 a) a oEI Il O U) ou 0 .- S41 4-4 -H WO W0 a 0 -H o 4-) -< OW U) W0 '-4 - 14 -H4 4-4 4-) -H 4-r-. ) U 0-H -H EU) 4-) U) O a)a L;4 44 '44 4-4,-I aU)W r0 OW 4) U) -H Idl 4-) 0D 0 Q U) ) 0 u U) O0 OW OU) 4- O O • 41- 4I-4 UA .O .,,, -H W0 - - - -H -1 -0 Z ý"o 'ýOz i:z P!ý2 ý)) S 'ýo O 0 O UO * a 4-I U) -Hr 0 -OH H- 0 -H -. I ul I0Fro o • -,-i Qn U) U)W 0H r.00 I) 0 0 -,-I O) H 0 0 D 0(13 0 ý4 -GH0 #-i EO • 04 4-i U) - ~ O EU) (n 44 a 0 rd) -H •4-J S4-4W -H (1) ** H H U UO OO 41U)U U U Ulri4 0 H4u -. 0 0 '-0 44 #O4-) IdU)l--- U 0O d 4-4 (n -H 0 4-)i U -H U) O L-U) 0 4J 0 4-i w U OU) 4-i O (a .. l U-U) OW UO-H m o Eaa o -,-t 0 rd ý 4 U-.* U) ro 4-I -H 0 -H -H rdrd 4 0 0 4 0 ~ .*H U) M 44 0 .0 Oi - 0 -HM Q) o-H 4-i C-H 0 a) 4J P -0 • 0 oo Q)) IQH - (n Urd - (d U) On U0 CO H wHH 4-U) 0\ *41: 0 U) E 4-) H44 -H -H 0a '4 H rU) 0 ý4 O -- • 4-4 -H 0 SU) >1 Id U) W U)-4 (d 4) 44 0 O) U) '-4 4-44-4 • # 0 S 4-) u AO40) 4-4H 4-4 -Hi 0 0dr1j •00 O -H 0 U 4-I0 rI - •- O a -iU)H OW 4- a) as U) U) 4-I - -H + + F. r4 U) S U) CD 04 " ) 0u u) U) H uý CU Q) S) ( U) -S0 U Q -H U) ,-"m -- r. 0 a H ro 0Q) u o0 -H 0 •CU C) 0SU) 0 r-CU 0.11 II 0IQ)I- 04 UCU S•U 0U) -H rH U) CD U) 04 Q) CU -r- ItoP < L-I 0 -H C) CU (0 10 A U A U * --(U 0U) o OC 4-) 0 t (0 4 04 S-H CU u -4 II - r II Q) U) -4-) - i0 -H CU -d U) - 4 oC -U II (0 04 4 W-H CU Q4C VU)C)U ,C -H II -HU) °° CD ..) ** U) -HI ,-' 0 II -H- Ui) OO-H --- U)0 UU) 0\0 VH -I m VQP U8P m) U) V U U) A-) 44 0 .0- *uO 0Q I wv 0 + + 41 - U) 4-) 4~J rd rd ý4 0 0 '- ýDU) 4--°• + + (d 4-) 0 1:0 40 -- 4)-) -H 14-4 0 Q) w U) , U, UOU U 4'i -H (9 CU S) U) •. U 14-) 0 0 vU) A U) 0Q C 0 U) 4 UI) C) U 0 o -HU) 4-) * 0U C)U) 41 0 OU)C F-I 4-) 0 A4-) ý -H 0u ýO 4U- 44 4-) °• 00 00 o o00 00 00 00 SU) - -1 - - '0U) 0- - 00 -- C- l -UOCO CDCU U h) .-H (i ro ro )CD o u:I~0 u -H -H #t= #t= fli rn"tO-ýýct, 1:4 U) S ~U) 4J U) f--H j 0z oC•1r-4 u i (Zý--ý " Q) Q) •J o • -H U 0 U)-HM U 4- -H U) 0 Q ) O o Q) v 14 -H 0 4-) 0CU I- U) C) U) S U) -H -,- O -O oH .44 -- 0 0 1'- '- 44 CD 0 C) C) 0ON U) 0 04) O a) to VU-H 0 U) U) II N U) S r- - -,U); U) -H 0 U C U) CD (9 mc C*D -->1 U) -HO 4-) 0 ,-U)N 'S -H ,-I StOH Ur) II ° o U) Vi)ý,c 00 C ý 'f I CNNCq qN'A" n \O- N4 , C) 0 -H U) d-H m ( HO -- 4•-H0 . 0 4- ~-U) O 0:OJ-) x4-1 >1U ý4 10 0 4 U) 0 H4-3 rO ()-, H 0 444 H -:0 cd3 0724 t: a) ~ -H (o 4>) U) \\-4 4-.-3 (a a) 0U)C) U-r -H -H ro >1 04 044UN L--rH S -o - ) >1 UH QL ) r,-) It N-. N t U ýA 00 u Ua) 00 () a) U] 4--) k4 -Hi J-) CJ) -H 4-4 0 0 o a QU :j ý drd 0o C) 4• 00 4H r o U) -H U) U) 0 4- FD 44-) rH0 00 -H -H -H 4=W ** -.--- (N4 >1 Q~ 0U] 0 4-) 40 U 4-H 04 -0 *ro -H -H CC o -r- -H (D a) a) FQ -H 0 -1 ro -,-4..) O Q) 0 0 O 4JC) C) V * -H Q) II O 4-I CN 4-) .- II A0 k 4J -HI .Cd• 4 4-4a 0 SO N-00 (ON >1 0 0 14 U] I) E-i Cd U) C) U) U S A ) 44-r-n OU") II C0 c 4-) -H Cd H - a) -) k U) r-A a) U) J- 0 ,CO .1- Q) ro h *S V 4-40 nO E-'C r-HI --I ro 0;0 r 1414 ~(- f "2 CD °4 -'C U) 4 -'C 0 0 --i a) oc• 0 4J 44 E--4 ý4 u H 0 44 ON 4I• 4 0 OH c o0 -14 • U) rl~~0 "1 >1 - 04 oo -H 0 o) ý -F8 >1 0-H441) S0 W * O4 .Q -H4M ri 4JW C) *- u 1 o >1 4 v - .. . U) $ J. Hf MS Q) r -H \\\ (D 0 4 0- HrH H W 4141 WD 00 14 H 4- -0 rl ## 4-) - -W >1 ý I UA0 O)UAM 4-3 . - C 4 rQs -\- • *- m W z ,m14-J UQ-0>1 0 -0-Q Q) 14 Hu Q )0 W)Wr W 1Q)ý 0 0 z 41 4 A I 4-) o ,-A QW wW - --- -i - ~ • UU0 \\ 0 4 O~ d 33 W 0 FI (d d oQ '-8 - r Z-iH 44 . rHM Wb 4- WQ II 0V O WW00L4 U 49 F:ý (d a) 0 W) '- 4H UWW• ( •0 U*1D ::: ** (d 4-) H A) 4 4-)4 4-) -HW ) HVtr-4 H 0 r4 tW ý2 En4 Z-Hr-I44 t ; r- 44WU -WWW H Q Q F I 4 . 4 W -H W •O -H IW A U)Cd Q ) 040 Q) WQ) L8 H Q 4 4-) H 4 a) -H4 S4 4 (z 04 U) V H 0 41-) F W 4 - • 04W 4-1 A ( d z U) A * U4 (d 04 tW U() W>-H > (d 0 0) (0 QW 4-) 0 4-) *- -4) Wi -H 4-:H J-) C: W-4 4 -0) U 0 - d 0 49 W 0 W -H 0 11 * ->1 0: "o Cd W -H t0 4' In H 0 W 0W 4-) Cd HW H W -~ - II 1it n04) S II 4 0(Cd ---l) t W 4C Cd 4- Cd r0 0 414 W W4-) 4W -) S WW 0414 Q ) o HU 61 W --Z4U) -In NH 0 S W4 C W4 Cd 5 Ir 0 A 4-I WH U)m' Q)4-0 -W 04~\ Wt0 -- 4H 1z W 4 - 0 A *I9 14 1H ,QA 6S 0o 4-) WW H4~ 4 t0 )t WZ 4-4e' Q' 0 W( 14H W 0t V 4-)II II 4-)- U U 44 SA Cd - 40) r014 Oo wSW >1Uw 0~ 0 W - Cd 0 -a--- H 414 W I -4 O H~ 1-43 1-_: H ~ 04-)4 W>1l)d~d WSE---0 >1> Cl- -H rd 0 -A 1Cd O Cd -Hi1 M tU 0 tk '- -4 C -- 4 H W A A W a)~~ W~~~ W ~~ r. -H4 14- W 0 W1 ý- - A I -*4--- W 40 '4-H >1 -- ý 44*H 4C Q ) C 4- W--1 U 4-H ) A II H 4-)4u AA wI I WEd 1 A ) 0I 0>W rO E-OýD04: Cd W ) U O 4 E-0IL 3W 4-) O 00 -HO U1A0 W O U)I4-)U)1 r-I ZHO pr4 0 U4)U-4)~ 4)j lAW IOW Q)~1 'I44 -H H C I0 04 ýA8r* W -X: C' 140 4i W 4z rý Cc O V -ý- J H - t W -H 4-4 H t 3 1 rH Wb -- H 0 U r U> Cl) a) U) ý44 J-3 -H C) > -H Uo) >10 roz1 o •- -H 44 Q) 4-)34 0 0 CO 4-3 QD -1F_ o v-i tm 0- W • 40 r0 a) U)4 ',.tIC HQ 0CCrd (0 -H 104 CU OCU * A ,CA U. *r- O4 H rzH CU> ro >1 4 'C S4 >1 0• U)Q 3J4-) -H C U 0 a (o > U -H --r-O) - 0 4 OCU 0 0 4-) 0C) *-H ý4- 0 CUCU (aq Sb H 00 0., -- - (N 'I - m 0 Q w -H 14 a >1 ý4 4-3 7 .U M -He 0 U)C * ***H 4 AM O . 'Crd 4J -- U -H .r-H 4-) H -0- CU 0 -4 en U A -H 4 Sn r0 Vs -H• u Ua) 00 0U) 0 0 U) UC 0 - S0 0 )5 r4 094 000 Sb 4L3 0 -0- I SU) V W *0C$40 4 rH -H -H W -4 ~U) v v ;: Q)0 MO0 -H OH -):3W!ý-4 CU 41 41 -H >1 w zU mU w)v0 4 -i H r5 U) 4-3CU a) IQ II -H 0p4 --H ) .U CU -H 0 0 m) C) a)C a) ) a -H-H -H H Z - H -H 'Cl o -H4 ý4 - O 0 DCU >1 :34Cý4J 04 OU 4-) >U CUOtU) 04 a) ca 41'C 4 4-34 A 4A * A 4 0 0 $ 0• U).4 ) H0 -H* 0 CUCU 0C4 4- 30 4-)C -4-4 O4 4J 44 3 4-• S04-1> C O -H -H ri -01U 9OCU m 4Q4 U-i 4H -H4 U)---- 4-1 H H 00 . Q) ,-- -H -H -H '-~ -H a4 HQ 0--* ý4 >1 4- H .H -H -04 -JI o0C v va) S U0 -H-H H 0 V V4 04>, -0 0 4U .4 0 •-Q • CUCU 0 A - H -V H A 0A .- 4-3 U) 4 0• H r-I CU kCUC CU 04h) -H V-0 e! Q0 -H -H -H -H H (N -- , , f t kN cr',00 0 >1 Iý4 U) UH 43 x ca) C%. 44 -H 4-3 ai) U)0 > b~) UF) 0 H t) Q H 4-) U) R . 0) U) 0 C0 U) 0 0 -H 4-J IIz-II 4.) O) -HAO4-)4-4 0i0 4-H0i 0 > M w P4 d HZ 4) r(c3) >a) 0A F H w H ý4 EnI ý4 u Cd O d V V tl 00 ONC, -- e U)U)0 tnci ý0)w ci Uoýo ino 0 > 4 a MU UQU)UU) Cd Cc U U -0)u a) c) Q C O4 0 4c: 0 4 - 0 ý4 4 LW ro ZII Srd$ b)0 LW4 0) 4 aCd -4 c UUd V)O4U rl -,\, - U Cd P4 S U - t) I r: 4 >1 0) 4( 0) 4d 0 4 4 - r ) -H dl U 4-1> -H-He \ 0 0 ro 0-- C4 En a) m) 4 4 U) -H- U 01 0 >C 0 U) U) 4 *U 4.. a) -.-H (z ý 00 "0en 00 4J -H0-44 N a -(0 ol 4 - 00 41 0 a - +40 U En ( E-4Il 0 -u44-H >C (a Cd II r) . >40)m oE a) 0 4 ##-K-HU d 4 -ULW -Cd 4j U)C 0) Q) E) U) .40 t3 U xH E-f 4 - Cd > 0a) E )0 > 0 LW 44 ri 0) rc -Ha)H Q 4-3 ) 40 :j r:3 0)-HU) .-90) ) E4 4 4 OO -- H ---- 44 E U) 4J u (a U) 4 U- C I LW 0 Ul 0 r 0)0) ,Ag-H H -.--- 1 I 0 A Cd H rddt) l a) -HE A r-4>1 ( ca)'d P4 CdCd 4 (d A C 0)4 -4 dl) nr 0)Cd E a) a d: 4n 0)d aQ o , 0 f U) 0) Cd > 0) 4 4 (nU 4 -4 U ri H- 4C0K C41 U d 4 H Cdb ) U - 0Cd '0 S4 A 0 C4 o 4 4d Cd 9ul 41 4-Hr4 4-) 0a)ju U)Cd 4J F-I 4 4 C 4 r-$ 41 0 40- 0) U Cdd 4 ( 0) H a C 4 U 4J s >-H 4 U) 0) -H 44 LW -i 4J >1 4 -a H 4> 4 (D-04J 0 U (a -H r-D Hd b rd 0U ci) ** 4-L4~ -H EnU (d d -H 4. 4-J U)lM )4 4 -Hrdod(dU) 4 q U)X x C -H0 Ua -H 0 H 44-) 41 0 -Hw-4- 0 4J1 If VI > a 4-) -U) 4-3 44) -Hm m 0 > -H Cd > -o > C 11 4 -H -H 0~d- U) U + 1 -X + 0 4 *-r (0 Cd U)i o 0)U)cK> 00Cd-K Cd ) C > w HMd>>4 d>> tn 000 0 * O LW 0 ý4 4-4 -.-H V) 0 0 - -H4 -'4-4 ca) V -( 4 4- -- Cd r-H E- A-W - 4 U) ()a H rz H a I-4Ul 0- 0b $>ic 4-Hr-I *U n S 0 'o ZR mu)U) -HU V rIU - 4a ý (V (0 U)1i -HQ - P4 rO -. ~ 0 V -HV 0r V- ý4 ), 0 U r4 * Q)Q) W C1 eo C( : 4 4( -H ) C Un - H 4-) -W Uit b) U)0 ca (0rIýJMrIv o 'd U) V V) ( 0 - tUn IS V ý0)w d -H * 0 -H4U) V ýl) d o b E-4ri 0 c U) V 0) 0)0 -H 0O 00 o 4 O0 04 dd 0 z d 0* O0 40 00 a)0 V v HM E-4 tin W)tA 0 0 HH 44 L-W U) J) 4 (d 00 ý (V r- ýU (Di we H a0)> o 0 QH 4 4-H d Un .H 4 a)V 04 V -H aU)UQPU) U Cod Cd -U)U U U u H w -r rC C) k (d 'd 4 v -U) ) 4 3) 4 W > W *H >1 4H >D 0H CaiO d 4 V -443H dCE4 w 0) MA H H z -HP *- H 0) -H 4O ) 0 4 *- 4- r 0 4. In 4-) -n b) -H r ci) 4-H - 0 D I 4- - *- U) A t3 U) 0 a) 0) U -. 1 0.00 ) 4 -HD ; U r~o $ oa) 0 ) H o L) Cd O U , -H -,Cl -H - O0 o M -a) 0 I [:4--FI -) o II A a) ..-4A 4A rH -H ,Q 04 ,Q m C -H a-) 0ý4 -- : M SCd ý4 4QaR A an -iD **rN~- (Z. -, -I o-t r- P~44a)-a) [-I -H to Li-Z cc 0 *4 0,a - [ILIA4 - H 0 41 4 >1 U V V V O a) I- N N (N N (N u(5Q) • 4 -i Q- U H -H (. r • A A C:) I N 0 U) -i 04 U a) (D ý40 Ca 0 m A I 0., aa) Q) 4 ,rO 4 5-mm 41 r-qCw -HrA ) w >1 4-) F 00m II- (1) 4: w 0 0) 0 440 ,)U,) • QH .Hq to ý4 QM) 0 04 4( ,c: ,Q 0- O 0 Q. 41 m ; 4 a4-) U oU 04 o* -HC C Co Ca ** Ca f ) 0 a)- -H [:14 -H 44 U Ca ýj -Hq a) .W a) 0 44 rQ)~- .H 000 -H -,"t Cb H -H -H cl --On Ns ',I 4-s o t,- 00sONs <Z4 00\O 0o rý4-i -rl g -H [: Q 41 0 -HoOOW .(0 H4 4-irdU O H U 4 0S a)-i0 UJ ma. >, )) Cd -) a) ;Uj-U 4-0 -4a 04 0 )-H 4 -4 U H4-) Ca -H 041 a) to J r-H - 0 A * A 0*-t 04 A >1 -4 a) 41 *0 -a) OCd V V [- -H-l 4 4J) -H- 4-4 U Q) ; -H a) - 0 U U -H -H "$ "o V Ca a) 0 U * 4-i0 -H O-H Cab d 441 44 ,C • **O 4 -H tH4 It .,. te' V UU 00O N 4 O .,, 0Q) toa C-) o 5ý q -H -H 4 0 4 ; ý4 O Q)-Q ++$ r H -H r- U ama) *:# = y( ,E ta) 40 Q A-) :1 1= 00 >1 a4 01 04 0 > a) oa) 0 Od Cab \• A 4-)0 )4- E-A0 04 H -r0 SC, - UQ HCa a)a[ CdrH0 O * *a 04Cd CU U 4 (~d Cd 4U.--.0 04 00 ýQ4 U 0C 0 -- -H 04 a) UH - El- 0A -H 04 0 Ca 4-i H -. 4- 4I 4-i U) -r-i -HA 44 44t Cd > ,Q a) a) u HU a) ,C ý4 4Cd-i --HCa) U) a) Cro > f: 04 H HAA A A I -:s04 0 I H- II II -0 - 4-JH U) U) >1 Q >1 M) 4-) U)U) 44C UE-A0 \4E4 -HMMU (21A H e 04 4Z Q) IV. ~4-4 Z - t o 0 a) -H -rl ý: a) ý-I II a w -0r; Qd HH 4 -- rN ý4 > In U m (n (0 r ~M 04- W0 4- 4 0 a) SQ) x - ,Qr. . 44 Zo I 0 U- a) II 0404 - -H~1>1 0 1 O) a) -H 4 044>- 0 O O X - U) -H r(U) PL4HU4 WrH 0 >1O U) U)04 S---00 F14 ýr Q)a) U) -HoC) (0 u 0• H HX U) U), Sa) Cd -H A - O H 0H H ý > > -H CFa) 0 C0 -Ho ; r-i OH 01- a) ** HU)ý4 -H C:) ;i QD A H° ° -- * 4-i) U) K4 ro a) .- H (0rU) 44 --r. PH 0 Ha) r. w OH-H U) 0D Cd-Ha) a0 -H ý i H -H >1 > 0 *° U) -H -H a) 0 00( 0 ** Cd r0 ::1 000 -Q0 0 S•H 0d a) - x 4- o (0 0 -H 44 Z C-i a)(o o S44 a) -H44 O 04ý- OH ro Cd a) ro 0O Co 04 U) 44 a)-H a n0d C) rr-H U U) (d 0 &a H -H 0 .-i 090 44 S 43 ,C .aa .- i A A O 0oo ro >1 A ,CA 04 rd 0 *d H 4j H04 a) 0S04 z ; I-OUU OHSr 7*0 -1440 - m ;-.i 04 U) CdH 0 a) 004U) -4QC 0 -H4 U048 -0 U) 0 *1 44 -H -H -H ro ýA -j~ rd -- 4 ) 0 -H W V W ý- 44 V - -H 0 -H 4 -H a) 01 OM 4 Q) -H HH HH r- -l -H r.r- -- i -HA- -i -\ - *- Q40 • KO I-H Cd-H 04 HU H04 #1 #1 1 +t Hc rH 000j Ho : u F.4u S; 44 0r Cd 04 -H Q) rizi 04 P4 4Cd H -H S a) Cd -H-H 0000 -H -H II H H 414 -H © a ro1 a) 4 m H I -Ot A• A * ~-- -HM 4 0 00 0v U) ul0dU) Q) ro H0 -H U) U) -I 4 xi za) a) - H 04 :: 00 $:.' 0 44- a)I -• 440I -C u 0 44 Cd (o4 Ii 04 4o - -H C 0 1 r2 r -H =ý 44 4-i -H -l 04 040 0 II --' 0 '-. a) SO 0)-U - d -I a) Z C o~ •) •-- O 0 ~U) Lý 3 II - II o4 II oU () 4 9--(1 r=; -UU- = 1 Fý0 4-4 ri04) -H CdZo coo z -Hri r UUO -J0U 0 J a * (0 O - 0 04 )---- - A 0 00 O 0 0 0 0 U) 0 0i (( 0 --- T$ d -, 0 -q '- - ~-0 _ a-H .) U)4 u r 4 0 C -4 *-41 r--I ---4-i 4 -H U) Q C)> >1 -0 + U 0 4 Cw ci* HW H U U) U) U)C) ro r-a - r 0 0 0 Pir4 U -HQ) < ci-Pk U1 Q -. 0 04 '0 -- 00 Oq 0y ''-0'-'0 ' 0 ' '0 -- u0 a) a) r ý4 -- -4r- -S4 Q U)-•• t - 00 0 c.- r r. 04 Q ** UC H r-4 a) r--i 4-i-Hq -r-1 X- I I U 0C 0 0 E-i Q 0 Oc r-4& a) ý4 -H )4-4 O 0*E-4 E- O z 0 (4 - Q - \ --04 - a) Cd S )--4 ý0 U) mC ri 4-i U) Z EQ 0- 0 U) E--, -H - -H ) 3 1 UU U) ) Sý -4 4J U) SQ d II U)CdZ -HZ: EQ 0 4-r 0 41 U) * - >1 04 rCr 4 01 UU)c Q 0 a) U) -r-H i - ()C) 0 -- 44Uc) F-L4 0) 4W C0 0 S14ZE-4~ U) -- 0 _- a• U•, U) -HH -4 -H - 1 1 u-i a) U) 4- U) 4-)4 0 0 U U)U - -,( CU)-H>,U)c (0 4 (N f. -4 ON (N - ,- -- -4 Q -ri w --- 1cc C r4O H d>. -- E U (N 1-~' -c~ dCo -- 4-i 04 L -rH 04H r-1H -H04 H *- -U - $ý * H l Q N4 N -H a H UuU1 ) a)- r-- 40 U)C 0d4 c 0(C - ii (o 1 '4 4I-i •--H : Z 4 4 ) U 40 E4-- - -- IIFZIr- I ;4O r-Q)4r54 C F44. 4l -U) 4c$ -l > 4CU01 U--- ci ( , J (0 + 0 U - dc-- - k "0 (N (N H rH-H -H c-ic -- i o 4 (a :: Cd- -U 't (N4 N • >,4 Cd 0i 4' N >1 : - 4-i f: m r--i 4 Cd . 4-4 -HAi A -u 4I4• cid .- F•)"Q U) -4- -I I -H r-i Q) k 4 -Hr-1H -- Ci Q ro* - * -- U U-H U U)U • -x (0 U) O (-H 3: A I ) E Sc I0 u - Q) N~ . d ) ,' II -C > II U II 4-'U ,--I I 0 -H -1 rU)41 U)UnQ (-5dciUU)a Q) Q 0 O .-- a))>1 - 0r t -s .4 4 -,4 -H < i(- -- - CDý 1 00 " r"-1r-) '- T$ 0 u O0A * 0) ,44 .uX. () Q ) r * U d 4 U) -H F•~~~ S Z ' -- >I O 4-04 a) --H 4 4 U) ) U 4-IC-U)Q -H * Q) CE 4 - >1 II E --- -H i rl -a-4 r-H . X4 o•U) 4oi T0 IIi cir ) U4 ) -H Cd U-04 r- • - , u - U) >U rSu -H r -0 O --- -,r-i 4 U 3 -H OI * >1 U r-i w U 0 a) U W U D i - • .. ) Od 0 -H .cx 44 0-4 E 44 C-*-, 0 0 0 U 0O O H -U) 3--I 1 4-H ) 4m -H 4-4 En --r. ----- H 4-4 H Q4 " CH ) .r- U)4 H 01-aU) 04 Q ) *-Q- r o -0 ~ 1. ) U . 4- 0 rH >1 Z0 5 F Q-) r-i -4H --. - -( () >1r 0 A I U)I1-H i U) Q-i) r-I 04 4-4 0 C-) > - -- -H -Hci S (1) (C U ) *-Q --,-i r--4-J) () Q) S U) Aj U) -- S U) .>1) ,- U -I--) -H U U)4> - -A -~ - u I Cd -- J-1 CO F U) -H + -HU)U) W-4 4. ..H• ) -H• C U) E- U 0 rH O) t r-44 -:H 44 U -H 0 > U) --- 1- Cdi 4C U - II II 0 rO - 0 > rC J04 --44U CU0 -,H U) 4) H 4Cd Z 4- -- En 0- rl. , 4-) a) r Cd r U 0I OoII-ii 44 C U)Eiu) 4 Q ) Cd 0 M - 1- J- Uo ) U Q) ro UU) U) *- Q) QC O < 1 rQ U ~-tt -t- -- N- t-Nr, - '-) tc N-- 00, N-N- -N- (0c -) (N '-c- '1-) ýo r-, 00 0-ý (z '-.( - "I- k -0 N 00 ON Q) 00 00 00 00 00 00 00 00 00 00 ON. 0-. O-N ON. all C-. ON. 0-. ON. ON -H km -q4 d 44 rO • 0 - rl C Q >,U) Q- 0 0 -0 0 4JU A. 0 "O -H4 4J00 ou co 00U U - •0-R 04 U)0 - Q• - a ---v- -a m -4-H 0 M.,-- rO Z) R 0 U) r H--0 -44 -11 44-4U) i j 4 H . ) I Ho) H 4-4 - 0 H ý:~ (1) I)I A 4 -H,•i "o. '• UI O Uo Cd ý4 • 44 -- 41 4U) -ý4 44 -H H o4 ,-I .0 C9 cON C\ OI Ný rC A 0 ,4 J¶-yJ . u* 0 • r-I - .4 \ rHri vý r 04 0 ro o >1 U Ar 00>1 A C ** a) * - Hrdi roX ýri r-C. ' Cd• (. ) (1) r i a) -H HL U)C s (o.d 00 uw -c 040 a 0 Q0 ~U ;o5U ) , -I) W Hr -O4 4-) rC 4--' U 4-- w0 ( 4 x Q) (DC -. ) 4 (4 rO4-4U --rU U \ -H -H - N ON F O )-H 41 r-4l U) 0 -H-H mo u -H -H 0-H U)ý4r b)U) ý4 (d - 00 LWQ Oi riý 44 0 0 "Hv 4 >1 (0 ( CH 4- 4-)Q 4 40V > 0U) )Q 4() U) 44 rg. 4 O-HQM4UQ 0 4 04 ~~ ~ ~ ~ ~ ~ --- t - -- U)U) LV 4U)ý44-) 0 -Hi4-4 U 1 oL Pý(1) x0LW4-4ri -H-H - -U) - 4 ) Q) U RC Q)QM O)H CD Q 0 I -rd U) Mr r.d Q)n - C r4 U)v r-U F- 04;J ý d i U)Cd0U) -W U) ý4J u XF 4-4 0- u** 0 r-4rHA rn4 Hr r-C -C ý: OU) U 0c~ 4 U) C) 0) rT4~ d * )* ko U) 4 ~4 44< 4-)~ 044-4 H -H * -Q roU) A Oi -IO r, Q) H 4-4 -H 00 -H -H C- -HU) i 4 eo U)-H H4- )Q Q UUrU U ( o ,C (0 Q) Q Q) ý444- M Hr ý4 q H -H 44 0 -4 ýQC)~ r 10 ro, Z M O ýý U) apHirCw i o O••• *HU )- -rO-H . J - 4r - a 04 U-H 0 -(0 Q4>1 wX . H 0 .0 ,-4 a) Q)rQ• -• U -U •M 0 r4 -• Q) 04 - %4 )C UQ)4-4 - H u U)*HI ()* - (0 Cd Ld U -, V -,•0 ,C 4Q ) r-ir-4 U) . -U 04 A C -H O :4 rJ"J• UrH (0drH 9FA 0ýH 0 Q o -1 0 0 o -,I (o 04 i U)0 4H IQ-C. ,rdUw .j FZ 04 - 0- - -A I * ro> U 04~ • 0U) U1) ro- U • 0 Q -u O• 0 -H S ri~ ~ ~- r )Q)-H4 0 U 0 o 0 U *dF4 g3 0r 4 >1 1 U 4U) 4 -0 0U0r 0r04-) X 00 X O r4 (1)U uu - i -H-H 0 41 o0 (HH 0 Co k 0 (* ,4 IU ¢j0) ,Q m -4 -- A -o H• O. kO • "-,,.a --H A H Q -H V t-, 00 C)k4 - (1 04 ) -,-0 .. U) & 0,, )4) 04 )(0) u4-1 0 -H a) l:: A -0 .• -,(0 0-H ,• A . 0 >1 (o a) 4-)-0 4 4-) rl 41 H HH r U)-r-- 0 J 43 U)4 HH Ld 04 OMR C: ý4 )U)C W 00 M O 43 F: k Ok 4o--H-4 4 Y k -4 Q4>1 va) a)) 4a) ) ao U) -H U) 4-) 4 .) .1. r4k ul . Q 0 >1(( A44 4 • U) 0 0 0• • • Il * '0H rm U)U,0 *'0 Q) -H ** -• 4(0 U)* rU) < A A 0 - ~M 0 r4 -0 4 0k0 u ) 0 04-H0H r-H ý v m,- A-H-A. 4-4 4- U) --H-H r-4 tO4-4 -H -H -0 0 04-- kH -H, ý: CD ( U .H) 0 JJ 0 -H (0 04 O (1 lO " 4(0 4'1 Q O 0 ()0 , >i 0 a) 0 00 -H 4 '-H A 0 o 4 A 0 * ' - 'H 0 u ro (:) -r- 0k4 4-) 4Q -1> 04U)) A-H 00)o:- (1-H1 ' H' U 00uF k4 "-4 00 00 ->1 04 ** U* 44 'Hr U)(0 4Q)'HU 04 O,-H4(0 040M U) 0,C*r 04 U)0 -HCA 4 -H ;: G) 4 -H)d,& Ok) -H WHQ 'r J-) a) ýJ MA Of 0-4 '0 a) -H J-) 44- ) 0 0 O-W - >1 k400)4 0U0 > k HEn H4w w R 4H 4-) O r-H04U) 04' - 0 )0j4-H Q) 0 J.) Q 4 -H (1) 4( -. 04 4 U'0 H0 0 % -'0'-'(1 ()Q 2I o t*0000\ ONF -ý- - 0 0( U k <u -. rH -H-H 0k 404 04 00) O 'o 00 4 NM 004 U) *0 & 0) *O--H ri 4-3* O 0 .- -4 Sl0 U) 'H• 004 4- b) r - l y \I r OtýOn O s 4-i 4 -'H H( 40) 0 0-4 -H-H H -- 0)44I a)- 'H-) -.. H -4-4 Cxr2 - ri Uo u0 • '-cd. tc, Z 0) X1 - * V0 4.* -o 4" >1 -Hrdr S4 * r -r r -) -O- 14O-$ F (0 -H MD U)o V % cd 04 i q11 • -i-I I O* -IO) II U) ro 0 4- U) Q tm 0x 4s ;j 0Qr H U) -H 5 U)U)U Q) rororc r 000 rd - H r-A r--4 u u u U,• r rd - U) - -H S4c P4- ---- i4 0 - 11 AI 4- 44 -* OW -U 1-H 4 44 9 >1 4 -* I -• --. C) * ) 4 U-4 --* - ~4--) 40A - dv 0I I1- " *0 AN U d 4414 U0 - 1 c4 'C' -O 4 ) - ( 44 A 11 *) A ý-_ --T- $ HO 41 0 -H4riU ItN -- J U) 0rl - 4 U) H 41 00 0\01 NV-) -H ro ro 7$ ;1 r-ir- r-I (0 U)U 0 u o r aV w H Hj 00 >1 (0n 04 v v P4 cU W U) 0 1 0 -H-H 04 H -H 44 071a) OO ; D r -H H)i- 4 04 - M 1 Q ir U) c H - 00 Cd 0 0 0z) F-: O o 41- (0 0 u , u* ý-H0 Q) 4- a)4 -U) 0 O0 0- u d4- a 0 0 U)UP 4 O H -H -H 1X -H . 4 Q)ý ,Q H- 0* U0. -HAi ii 04 0 4A)ci4 -a) A - u 0 0 VV 4 H 1o - - 00-H4 04 0n - • U *4 ' O n• U) U) :: R t0 • (1}OdH-H r >, 0 r$ * 4 o., - 4-o co ( 0 0U -4cd* . 0 04 r - 0 A1 Q -0 a ,C R V ; (o ri •r -H cn • U) I U d dC 0Ot 75*4- -H0--U cd 0U* 4-4 0> 41 z 0 ro C 00 V (Z a) a)0 u --H a) 44 -*1-)3 0I) rHH .J ) N 4 0 -)0 a) --- c •I- II' r -4 .• 4u U)- -- 1- A404 0 r5 .-- - u 0 -H 4 C) r OH --. 0 U4 -H --- - A - I 4-4 o r-I U) ro.Q 41 44 4 C A -H -- -. c 404 U--4m n - 4I )0 ) U) - 0 4-4 U - r-H -- r d 04 00 4 A n 4- 4- rd c-d 00\ * --U) H U O -U -H " ) Q) L-8 U) 0 0- -H 0 A • 0 -d 4- - u i -4-4 r-r- Itw 0 (4 d 04- 00 ro 44~ -H cd R (• U Uo 0 c4JI :j * ,-- N- o -H 4444 u (0 -.ti --1 N U) 4 aUZ ) 4 Z: U U) 44 --d Q) U) o 0 Q)Q A oo M 0d " r Q) ro 'H 0 04 w S--HA -W- ()004,Q-H U) ý ZC -H R o 4U) 0 O4 '4-4 (d C U) 0 W -H >1- II 0 Wo 0 q II U) 01m ,0 f'- 4-4 0 4i -H 'H - CO* o'd 4 rl 00 .0 Cd t A ~ 0 U) E) 0) 0 0 Cd r-I r-I • ;-I -H U) w XA FX ( 0 4-4 M 00+ (I; S0'd 'd' U H U Hi rH ::) -H -0000 H -- r-H '- 4-I o -* •on m U)o 0- A I 1OD o 4-4) -.4- 4 H SoS4-O 1:4- ,n --0 - 0J-) 1-I A O1-ý SH vC A 00 44-i 42Cd A JI i 4-4 - >142 ý4 0 0 00 - 04- H Ou Cd 0•0 SdO -H -4 Qi) v4 C OH0 41 4-4 -H ---- -- '- *H- -H -H -H -H 4##$- -W * --4 N -4 rý-)It tr) ýo N 00 0\ (Zý -4 --- - V) t'ý' 00 t'ý rv-) ry) fý') ry)I\t ry)V) ryl ýo ry-ý N Oý N (Z -) --ý rn N r-4 "o N N 4-4 U) 0 -H U) 4 W -C *'d4 4N *Cd ro c) rcl 0• - C 0) i c- 1-t. 4-i 42' ) -H 4- a -rH 4-4 1-4 4-4 U) A-i • R0 a 04 -H 1 41 Q -H W) 0 W' 1-4 Cd • • 'd4 UU) -H 04'do(0 404 00 S4 > C 0 'Ho' ro 0), Q U) 0 U)-H CO 42 r1'44 ( 0 4404 Q 4- ý4 ~FZ 4 r'O 14 4-4 O4 04 -H r 4 ro ,Q -) U 4- • Cd -H H uU) l Hci OO O 'd U) W 4-)• U C0 >,O ci)L .r0 H(1 ( 40 .0 4 4240 W00 Q) U) -I 0 0042 • oo0 • .-i -H 43 -H 4,-I OHrci)q. T;'d 44 Q) 0 4-4 4c 0 'H U 41 C m 04 0 -H 'd • .X eiC0 ---- >1 A 4A •MU)C --04 * -'d ' OW Cd'H >1 1-4 4-2 420 - J': 0 aW4-44-41 ,0 *4 Q) 0 >4 o '>1 4o 42W42 U) r ,4'rO d 0 U) ' J-) ,4 () S'H'drc$ O 0044' -W -U) -HW 00c) -WW 4-4 44 r44 -4> 42 -HH 4) c) (Cd ci) C 0CdH O QW1-U) 4C c 0 0 * 'H-H 40 Or v vF U04 0 0 ci -HO r-W 04 U) ) >1W ( u0 ' a) dc) -H U 0 4 U) U) -W ci) U) 'd ý1-i 4-H)4 Wci) x m b-H U) W420-H3:20-H mU)4'Hk ro -mr -H 04 *V V 4-) 04 Cd<C:ý: d-H d - -H 'dW 4-4 ý: -H i c- o* Qc) 04-4 4-2 -H -H -,--t * (Z NN V O0 C'N w Cd U 4-)4 U)) u 1 0 -H..,-i o 04a 4 U04 AE SA -H * ,C 0 0 u .4 1 S)A (0 -- E w 0r 0 0 , ) rI Vj 71 Od ý4 V r: 44 oz-.. O 0) 44 U U -" 5ý 0 U) 0 r4 - UZ O 04 ý 0N (O ~ ~td" ki I) UU -H- H\ -- - o P CH U H -00-) •, II 0 o 4 (0 d -W 4 Q U) 0 4 +0 4-) 0-gd4 U) V: ýj* ý: ý4 + r-H040+Cd o -H-H- - pi ,CJ O 4r k0- >1 - z 04. >U, w AI 0 0N ON -04 -HH I ,I r-i'ItUUU V) :I IC (b 04 --- - \ 4 ul u u Fi - 04 II Q_ 0 A1-H O - O E r -, U0 ,Q -i 4 4-c U 0 mr- **4 -04o -Cdu Z: XC 0- (w0 -H 4 ý ---. • m m) z 4 (0CQA Cd Q-- U) _ --- 0 A a) w VO• V 04(1 0 t R vv I-- H- -H-4 C\ b UU -- *-* H -C *0 C) U (0 Om >,U CdC Q Q4 >1 0 r.0 ,C o ,.. :: a)o 4- 0W4-) ub (0 04 U r)-:U 04 U) 0U) -H U (I)0 Q4 a >1 Q) Uo-Hi 4 0-) H) ::; 4 Cd -4 U)a) C Cd) 04$ t U) -H A4 U . rU)A41 () r-I OWO LI-HU rrf H Ui -H tu) A 4C 0*, (A4 --U rH-H -u ) -4 ) 0 C4UG8H 0 ýQ04 U U) > (dr -HU u QU> * - E U U) UA -4 ,C(d Cd UU4 * 04 r- d- -H > H 0dz 4 >1 -)04 0C O-d Q)m a)uos - C10 C vv ; II) 04> rHW U4 * a W FU) rH4 4b UU1-- q44 *-* I- 4-- U V -U) r- -4r-1- rý U-HU XU-4 rA a H UU Q rU UCd Xb 00 UD ' X C4H- s a) 0).) -- - 44 Hi 44 'ý I-* ot 0CI-V * o - c 0 - () )ý4 - ý 0O 0O -S - (1) d b -HI C) * U w -H 0 Q) 000) '4-i AU) U 4-) 44 0T X U - -) r14 Cn 1 OC Ul) 4-4 0 Cd 1 -H -H Lý 0 01 4J Cd 04 -Cd 04 -H H 0 4-) Q) Q) -H >1 ro >1 ai) -- H oo • • C) - H 0- H H 4 -H ,A 0 riý A I 0 (0 0 ý4 1-1 04 J 4- >1 o-a 4-i ý4- Uc ) ci) Cl 0 -H a4 0 0 40 >1 4 0 -H NEW 0004 O- A ow 4. 0 4J -H Cl 0 0 -H v -H °) -I- -I -W -H 4-)C VC/2*Q-4 l -Ha-Ci) '- 0.r C) U) 4-i J0) VVV4 V WW H-H z wD v ý4- ) ; o , - Lrý ýo tC-, 00 0, r 14 Q) U) O -H Q) X4 CDU U) 0 -H CW , 41 rc 4-W 4C rfl Q4 -H >1 C 0 4-i ý4ý4I ( 04 4vi CH H r-i :• * ýJ d) O u* H 0 , Or0 14- ro to 0 -H 0oH 0~00Cd 0 4-) >I I.Q rQ ro ro 00O ri00 4 U) - () l 00 u QH 4 H0 n0 -U ý4 u ,- ci)C >1 r4- 4 -1 -H. I-Q) 44 -0 ro) ZO 0Cd 4-i ad I-- th4 ,- Q) -. *0 ro ;: 04 1 4-H 4 > 4 0 -H > ý0) 4 0A >1 O 44 0tHV002 Cd L> ý4- 0C )Cd C) 0 I--i -H- 0 A 4A ~ 44 -H0 4-0 0H 0-H 00 -, O U) >,Cl2-H ) 9-: 4 (D 0-d I-EQ 11, I-H rN 4-i r 0 4>oto 0 rdiU 4J C4 H0 00 "r-\ 'l4 0 ., u tH u 0 0 -Hi -rl =#17##= d) 14 ,- - - - - - 14 I--i 4 rd -H 14 -H Q- r4 yO'INt o N00 , A0 43 ril >1 03 CD 40 C• ,-C 4d) Cl)O -H 4- C duh Q) -) 4 Li 4 E-' Uww >1 0 0 ~ 0) ) rH r-o Cd O (U).- 4-4-HO U 0 4-) 0 -4 4U) 0 ) - 04 -4 0. 4 o co u - - 4-)r u i Q4 ()-o41U) U) U)0I 4-) -•(1 r m H4 9H 0- 0 r 0m (o u 4 0- 0H-0 ** 04e Q) ro ~~-U)4- C04 H 0 (d 0l E- 044 Q U U U m- _Q ýfQ c) l) 0 ) OU U ) u) rn-HQr E-4 ~ 1I Ifl v r, 4- tý 0 • O r-J$i H (0 1 J, ,r4 UýJ0 0C4 AO Q)riz -H 0 40 (0 1 41 *0 V O . (d Q)> U)U -H **4H Q V 44 00 1 Z Q)uW H v v-HO -i rr,-1 04 )4 d rob U 4-1 1 r--i C 4M (b 1--i -H - (0 - 0 (Ur lU) :J u- -4 41-)4J Q) U) 114 ) 04 U) H En U4-)r--i 0 0Q), Qý HU 41 14 44Q C *-H (0 4)04 Q~)> H41) Zd~ >1;: * U)~ HH -H H ýrrH *-) 4H -) Q) 0 rdo 43~ U)Cd0Q U t c Ed C) U 04 o 4iý -H -A ( 04J4) Cd U) 00CdH4- 0" -0 U)0 04 n0 r-i r- l1d --a U)= 4U) 41A > r-OQ- 0>1Cd0 rn It< HMd -0 U d En Q o >1 QQ) 0 44 -0 1 1-4 4-) >1 i u Cd 4 P -HM 41 v- 0 0 0 \W U) ; VAV , -- C4 -0 .Z4J -1-) U1Q(0H LS (d rH -H U ( A0 0 r1 (o UU) Ird b aH 4-3~~~- . r.-H C04 r4 t •C II Q >1 E4 • -r- 4 %: zC 00 . II Q--C 04 0 C 410 >1 OZ •••• kE • 4. -. 4 U)OOO r0U) 0 U) U) ) WHQO41 4-ý 4- B)U) H M -0 ~ . 0 i Q z 04' 0 4 4- 0;j~ 4JHl 0ý-H >i #.-r u Qd A - H..Q 0 * -rd) r oU)ýj .. ) >131 >1.4 W In H ;j U) 0u- H Q)(o0 -4 O >1 4 - U) U) Q)U)>1 41 0 U E--- o(d *,C 00 1-** ,Q - - -O 0 J 4 *4 -U o 0 0 ) u u r-i (1 r. - - -H -Hi o ý* H z v vV ) 4 ro0 0 ý4 Qu -H -ir 04 *_ ý- O 0 0k 0 r--t -rl A-) U) r-' U) -,--I 0CUU) - -H- u 0 .0 X: 0ro 4-i 0 -H uI0 w u0rU .13U)y a(-i 00 F: H o 0 0a) - ,-)Q E- ',l I) OO ,0U)rHiW H 4-i -H or- 5 0 rH Ord 4-) -H 1= U) i ~00 E S -H u H (7 0C ZH 04 0 U) 0 () H o- -H 0 k ,C1 '- 0 A PS rC! H C-) 04 0 U)0C >1 04- ý4 4fý -r- H ýJ (3 -ol W -) 4-4 1:4 w Q4 Q*) r4l I* -H 4 -H 0O-HD 4 0 04 44 41i~ S -H -H C-) N * roro ro 4OW 44i--H04 04 u El -H4 -000 u -- q -H -H -H #t #I-=#ýo-4-l \ It tr)> -H U) 4J U)Cu 04 - rHU) 0 U)4-i) 4 M M- 00 - 0 $ )0 CU ) 4-iWU 04U) (0 a)Q (nQ :e ) -H NM) Q) ro -H 0 Uj H 0U 0) y "> >- O - N lz -- 0 4 91 4,- W -H C4- ib -4-) ~-4- 4j 4J 4-i U)4U 0C0 d CU z -H e 01 >lH4U) 4-* >10 -H -i -u ý4 -H Q)UQ) 0q 4-i S0 O)C-H ro X4 0O ýj 0 U) OI 0H -H • ¢ -n U) -rH4 U) mw H A 4A >1 E-1-r Uw 0 C) o -m4 U)4 S-H rd 0 0OW 04 X .4 4U). r--Hcdrd 40 o 0 0r-- -c Q Um 04J ý U) ý4- 0 Q 4-i4-iW4- 04 ý4 -.. ro Q aU) U O 04 >1 V ~H -H UJ) 4-4--H ý vv O >1 °D rH 44 04 * - 4- -H a) 045 1. -r-I rH U) CU U) - -H CZ -. N r rcd$ rH 0 0 Toh - - **I ý4 U) (N ri -Hco r.E- U) • ,. . -r• - 4-) 02$ z fo 00 0 S4-30 o( 0 d >1 -,f 4- C-Hrd 0 4- • - ) Ha) a t-gU) QO -3H ) -HO o > Cd ;j a) a) 4-) (d0 Q -)0 Cd .C a) 04-) -ri > (d 0 024 U)( 0 U) -~-H > P) a) -H rd a) 02 U) -" . ,--H 02 a) 9 H rul 00 U)4t.)0 a -H 0Cd02C4 -Hd>-) 02 4-)02U) (L) a) rg fl -HV S-H 021 z ED -H-H 4- 4-3 4-4 to U) a) 02 b) X 4r-i ý-4 (d r: ,- rd 0 0 -H 2lr-4 U) a) .,i T (d 0*' 0 U. 0 tI to r-4 0 ,4 Q) U A ACd A ,* Ag ro ý _ •0 -Hi 4-3 4-3 02 02 4-3 4-3 C '-' u ~U)02- U) od -Cc rI 02 4-3 V QU) -H -H02 (D -H r-I I mE a-3) V V 0202 v v r•H rH 020 02 EU)C U U -H-H ri- -H -I •=W=W= :j 0 ý4 0) 0) 4-4 H U -HQ f 0Ord U) (ar-4 ý4 >1 1 0a 4-)0 uCd 0• Cd ,Q Cd ) t)tr 0C Cd -- z-iU)0m w In a)A9>1 Cd-IU) d Cd -H b) 02 gH 0d w )r; (a U)3 ~ U) y (a t-o U)4 u4d rd4 Cd02-H 4-3 0 o 44& u 40Cd 02 04-3 01-4 02 - U - W - 0 Sj >1 a 0 02 a) 02 02 U) r=; 4-QU) U) 4 4 a 4-)02 RS4-) o4U U) P °° rq °-l 4-1 r:-H 4 >1 P4 0 U) E-1 :J )r -- ~U) 0 ý40 P4 O ( -H 4) U0 ý4 a) W4 4-3 u 4-) -02 4-3U --H 0 0 44 U)U wu a) M a) r=C 00-4Q 00U) -H- -0) fl-H z-r U)C a a 41.4b o 4-) U rC$ H- U r- U410 rQo C0** > U Oz 0 0 4-4 -- 0 -4 " 0 02 a U) 4-)34-) Cd Q)4-4 40 U) 4- r-i 02 -HE -4Z 0 ý-i O UH00 r 0) - 10 U)( .,w -H (d :j U) :j H4-4 ) r-H 4d U H U)c-C P4 44U Ora4 -DU)02 4-3 4-) ) 44 0C(a U1)C(d 02U) ý4 u U)-HU 0 o Cd 02 0~ d L) U)U)0 U) 0u 4-4 0 w u r4 a)l Co 0 p0 0 U) ) a)~ a) 0 a ) Cd0 020 02 ~ rd 4- -H J-) 02 Cd 4 4-4 02 U) ~4-) 0 it 044I Cd 02 -H 02 -H r--I UU Q.) Ud n ,-)(a 4-a) -,4 - (a1 4-3 U) i-i U) $ OIq4- ~r U) 0-- U Cd-H 024 bU)( U C>-H 0-U)4-4 -ic • -* Cd--V44 u, #U • 0• MM u Q-H - )4-4 - 0-~ - 1-4 -H -- -- -- ' -- , p 0 (44 C* II O / u) Q)U-- 0 0 >1 0 C) ro W- -i II ,H -I ul •1) 0 00E --- H 0 U) .0" + 0,4 U W 0 °,--0 wUr) 0 0 -II U) (d --- 1 -H -j a) 11 U 6) (a E0 0 r-I*H *d r-H 0 UCd 0-- ri r' I U) H -H u) : U -H W)W)t U) * -H U)r - 4-I -. -H Ea ** r-- >1 b gW m0> W cn- .li4-4 N E a) rl NO --0 0 r uO 0 a) -H -d cOa* 4-) 14 •U)-H "-" -r' .i U) H II + U) Q) U)l U) II Uj) II tCd S-r-'-- .- U 0 0 ý43 U)r4 U) ( 4-I ) 44 -H 4 n ntnt bobýoýo t 0a ýoilý o KNo o Oo *oNo no Il tooOQ oootooooc00 0 0 11 9 o0 o O Cd) o-- -i 0 -H Ua SA 0 O -Ha :44 b)U 0 ca Im En ul En1U)S4 r./ U)( b) u U) Do >1O0 4- U) II .r-l II OH• 01~U U)H 44U r1 r-II- I U) r34 U)1 D 44 H - " 04 U) 0 Cd II 0C U) U) 4U U) E4 - 4 (:ý --I --Nm On 'It tn ýo -- " 114 "-4 -" ccw4 ON (Z "-4 N o 44 ro 0 ,o. (d C e o -- U) U a U) a) m a) II -H-I H 0 U) II -r-H 4 -, -H 41:1 U) 4J 041 S4-I U)U U)O U) -I H b) (d U) j) -I II ,-i -H U ( -Hl 0ý I-N -_4 Im "Cd U)U044 44I ýCd wd Oz -,-I U) 0In O 0 C--- HU) ;E-H SEa -(a r-H Cd U)E 0 0 U 00 i II Elr--4 --- ri0 4-14 .- U C4 On 'IW) %0 00 as (Z N N N c "4 N N N m , 4I -L-H bH r44bl CdO U)H U eq m It In ýo t" 00 0%(z en C,n en m m en fy. ý en -I- 0 -H U)- N on "t -I- lý4 x a) r- 0 U) o0C N 4-3 -H Ua) C0 N + 1 413 U) dpd -..11 o II * $- N I- 11 rd M "" *.441). A 0 C) i-I R c * .1 . 0 0 H - 4 II Q) 0 O 0-' ý4 II II 0 H 4I 0D HD 04 N- N 11 r-H -H Cd Q) -I 4-343 w 1 rd H a) ý r • ... -0N N 4) N U) 4r- U) H U) ,- + Q) CIPU) U) -44 + + a)Oiu'41 14 a) fj U) -, a) w 0Q (aU) Cd U) 1 II 4-4 rl Uw CO P) 4-4 Iý4 II 43 -O 4-) U) II )OO + U A -H S 443 4-J -4 H o4J --+ ItU +*- 13 U) I-4 U) - rwU)w l 4-3 1-4 0 4-4 a~ 04"1- N q4 00 o C I- S-H -H A x u N -H 1-4 4-4 r-H 1-4 •_• . 0 II + -H o-3 00 ON 4 N N IV 00 a-, ý4 a) u w 4-3 0 H N -H - H4) 4-J -4 a)r -)Ic 4-)C o4J 4 0414U0) Ul > H 0 II II 41 Cd m w 4-1 -H >1 04 If OH0 r- )14 Cd> -0 -0 - U 1 ' r" u ON (a. 0 J J w~O 4-4 -H I., c CN ON Ch 01t- 0\ 4-3 . -H-0 4j) O U N N -H -H -4 -- 4 riP U) 4-30 Oi 4 -0 4-) 1 U)14 0 II ý4 ) Cd I1 ~01 gE1 4JC U. ) II *.. . -,-H + + 9 + + 14 0 E-- ) 0 4- 114 U) -H CdI 4-3 Y)-,4 tce( 'o t~ 0 R> 2 000 Z "f- 0 0 a)a 0 0 ,Cd be oC4ch oN -I CdII Cd 0 1-4 00 go 4--C 4 I .C •) --U)1 , NIg"-- ý4- 001 1U) 41 0 '--• 0 1 1-4 443 0 S) Ni--4 4-3 s- o0 0-- --- O O S1 4-3 4r-3 C) II a- Cd ul a) - ,.- 4-) a) 4-) 0 U)- u ,-t Co r. 4-4 (a .C 4-3 En -H CO (0 ) -rl4-0 U) I_: a) 413 .,r 1`4i -H 4-3 - 41-0 U)0 ý4II - a U) P -H C c0CooZN 0 z-, -" -" ýý6Cl -4 ft 0V WOU 4 oo n-. "4 " -- ' - j,4C ' C)-l ' 4"N "- ci) H -•ll Q2) r-H lc: 0-0- 04 0 10 4I-4 44 >120 •-4-) i (120 12 ) x 0 -H -0 4 4(4-) 0- Q) (9 U 001 0 04 -H - O-'. C"q IN- ý+ 1-4- ý -ý Vi) - 4 °" S0CO HI *H -H H '0 0 ci) 04 -rl4 -0-I 2U 90-* 4- -H H \ -. -\ \ -H - H -Hi (1 H -H ;I ,r,4-4 A-) U2 -H -H - '-. - 04 n0(1 0( 00 Q4-0' rO 4-1 -I-) U) -H '0 L04 4 C 0 -H 4-12) H - 4-4 -H U) -(1(1--0 -H r U) 41) -H44 0 S.. 4- 4-H 0o -H Ok 0 4-) ý . SH 4-4 H xi 0 o • C-I 4-)* O) -0 O Q) 4-) Q)44 04w -H) 00 104 0 0a - 0 U) 0 -(12(* Z44 4-)0 0 O ý4 02 -H** -H °• 4(12 - -- r-A -H 04 U) (12 -H 44 U U) 2.U Q) 04 0 U) U)4~ ro E -ci >1 m 4Q) F (ci 4-4 (12 0 04 20 u (d H o 4-) 1) -H $ 4000 4-) U) (12 O -H >1 4-4 0. *4 0 41 -HM m o( 0 4-) 0 q) 0 -H -412) 0i-H -H ý4 01 0 O0 01 0 '- (1) 44 44 Cx - -H -H \0 -, r -ý 00 ON (Z -- -- (N (N N " (N N -H ýo 'O t 00 ON (Z ( N(N N (N (n : 'V, -H -- N. -) cfr4 N-) f'f2 "Itc~r V) cy N 00 2 (If 'ý-2 rn ý-o -H 0\ (z f tI. - N -- ' -) I. "- "ýt V-'2 ý II- I- \ N 00 0ý I- I. I. + o >1 01 A o 4-1 .c.4-) 0U)- 41 ,- >II + )04 ON >, (N0 '-o -o N o '- M~' -v II + + + 4-4 4-4 '---- 00 A 0 0 k4 N > 4-)I 04ri N U) II 1 U) °n N -H +C 44C.H \0 0 4-4 4-4 CLI -H xi C-U U) RZ N N U) U) S v -iA x N N 0 - 00 0 0 kn '- N 00 00 '0 01 0 '0 )-) 0000 00 00 04 a) 0 0 04 4-) Ha2) ~-N ~cN N -H II 44 -I 44-) 0-H -H(1200 4 4 0 ro -H * .H 0 -H tr o U) 44 -4 -H ý4 r *-d 00 W UW4-O U) W)U) -: r-4 4-) 4-4 ~ -H -H ý4 Q) 44 0 -u - (. U) -HI OW4~4 ,.e W 0 -4 W -w 4.. U) -,ro -O - "o 00 0\ (Z:) Cý4 rn 4-) Wa)::jQ X-.4 ,a ~ -- -H 00 ýz (ýq rn Iýt kn ýc t", C',4 rq cq ("I C14 r,4 rý4 O 0 O ý4 ro H-W ý4 H SHS 4 -4 rd -H (I WW 0 d Q)rHUQ o CO o4o) U) -H -H H 0-, asý0-, 0\ 0\ 0\ 0,ý -rI ro 4 E-4) \ Cý --ý ,4 N E - 03 W W -HW (U) 44I 4W O~ H °d 0 0 :4c EO 4-) ,' 04 -H - 00 0\ -ri E-H W W-4W O 0 443 04 t• 4-4 04 ) 0-4 -H-. 4J) 04W 4-J4 . -H r74r r) U) -H 4-4 H 4dU) J 44(1) r-H 1) '-4 -Hj H *. 4-4WQ Mrx-r- U 4( '-4 I O• 4~40 O -r-i Cd 03ý-:4-4 00 -HM 4 H j U) U) 0 0 ýýJ *4ý4 Q) rU) r co 0O~ 4-4 r-i 0 U) 40)U)U -H -W W -H 0 - u 04 -H U) U) U) -H- S-HM -) -H 44 U ) -H W4 0 r-4 -HI oz U) -H 4-- 4) - - - Q) Wriw tn )) ý4) -4 0 - rýV) Ic 10 r)W) o No 0 o ý 11 00. ý4~ - ° -1U)a)l Q~) 0. N -H W-HU) 0 U-H4- M -rH0 H044 ;: n H 4: 4(1 Jr Q 4 0-C-*C -He U 4- -H d)-H S0 0 U -~ t-l " - - - - - - - - - - l-ltI -C-U) I ) O-HW M-H U) W 00 44 4-) -H N-H LIOd .. Cd 4:: - I) Ic •-• 1,4 O 04 0O (9 -H - £4 W OO WU) .)-W44 -H- '-4 4-4 r-H 0• 4-) -H -H4 w ,-•0 O o 0 U) 0 0W -H -U) -Hi 4-4 - U) WO 0W) 0 0 4U1 41-1W C O- -H - Ajr 0 CO W -H r--i Q) ý4Q '-4 (13 Cd 0 4Cd CQd io r4~ Q) @ 04 On o UO) 4-) -H r.U01W I-4 0i4J -4-4 W1)4-4 r1 0 4l -Q4) 4-)U) 0 ro U) 0 q-00 0 rl W 41 o ý -i.-0 iW - , ( -HH 4-U) ri 41-4 U) -H 4-4 0 ý4 Wr 71a U)C O4 WdtH 0)) >1 W HW 0 0 U) 4-4 ad4( U) tzn t-lt-ýtoO o t w 0 -. z w - 000000 00 00 00 00 00 4-4 0 N -H ,D U]Z a-. (0H D4-- CdH 0-- II S--U 4-) -I I 44 4-4 0 N -H 44 ýl II a) Q U 44 44 04-4 0 4rH r-Q 0 a) *-- H L44 I-I -I -r- -. (ýH C Y) a) II a) r-H 0 a) rH H* U) 0 '-t r1 J oa) -H -H 0 4-4 aUO H 0 W '44 ro H -H a) ~-ý ý ' v *4 II ,-t r-A (. r-l -,-I (I rH - H av U C-4 . 00tO.c 04 SII 4-4 04) $4-H 0 II -H a C a) -H II II a)r 04 ,I-~In II II .) II 00 ON <z N ~ 4 ~ 'ýo 00 Oý -H 0 ) S-H (N CA (Zý '-' c - 00 ON ~~N( Ci-1 04'4 0 •) 0 v* '--4a •* ,.• -H• a) •U]H S- -H (H Cd -H 41 a) -H H -- H-I ,-I-----H 4-4a A ,C SA • 0 UO Iwi P4- -H .IJ -H- S44 0 0 4 A 00 S1 *0 4.a) a) -H-H v v aV a) ro rH ro oc ro H "H 0 000 Cd r=4 ,w N--CN 111) tr) rH -H IC N - k -H -1' a)- N a) -H ~44r-iU S -H -I -H C hQ ) i- o I- a -H **rA ý -Hf ) Q Cd 4 zS f-.. H 0 )--- 0I C Q) .1U S ,--I -H CII Cd0 4 a) w 0 r-*) 0(] --- oaR -4 OrH rHa Cd O05 .0S0d Co 0a) a) 004 -H .u ) 4ii -H a) a) r---- *d 04 a)0 M 04 04D 4 4- -H F4 0-0 H0 0 0 4- 0 -H -H -H -H -H #- # 00 ON 0 4-4 -H } 4 Ci) 4j U])>14 - r -H a)a ) I-- - o --W u 4 0 -H,-4-} -"A UI) -H rH 0 * 4- -H -H U 0 04 ( 0 -- Hr----"a4) -H - -H Urd .4i II II a) -Iro-H 0 + + .0 - r~ o )H r-J II II 4-) H -H . . 44II II 44 4-4 - II 14 a) 4-I 4-4 + - - 4-4 C/4) a) (1) 44a 4H-I .- ý44-4 . ri •Q .- r-H 4-I -, Cl) H a) cO 04 -) 4-4 II 4-4 0 4 ý .- a) .-H C) 0) aa) 4-4 rT4 rd :ý4 a) H -H4 4,4 o0 -a 44. 4-)J 4,-i a) ..J .- -r-I ,00 ,, , ,,, , ,N , •N N C,4 ,, C) N (Y, q a) 04 >a 0 O * 4-1 ) 0- d a)---, .,4 Q) 0 - 4-. II a) a) O 04 H r-H ,-4 -IC Hr4 .0 U) -r-I a0 -H 9 Cl) -H O5 - >U) -H ~-a) 4-4 -H . --- t" o000 Q"-oN'l tl:coo too 00 o o0 -- \0 00 o00 -H -H, N ** No ** 0 .i.J-) 0- ro 0 -H. Sk" C0 1 mr ro • U) O3 N -,A Cl -H ro -rd W oF 0U 0- -H w() U)C Q4 r 1$ Cl) rd 4-0 U) --- ) 0H U 6 ro \U\ aU0i090 Cl) C) 00od 4 o0 -1 *• D 4J 4-4 F=:E)U a) o 0 U) o04Q (0 )H -•) k5 4-4 U -H 4J 4J 44 U) U) z -- 4) - r-I C) -n rU)~ 44. 1:4--U) CO ** ,-I -, U U)0 0**4-Q 0 Cl H "•, Q Ob ý E. C C/) -H4 00 -H C, 0o ro 4j rU r ) U z rI J-) r-4 C.) -- -j J ý4 U) Q) rH win 4 4-) T$ ,Q ý44 H Q 4 -HO AQ V C/ \ HH \ (15 H: U)Cl H -H) U -rJ '- r ,QH 4 41 S-,-t ý4 CdU) kH -H H 0 )Ej ý U1) (13 4-j) U) 0 co 4-)co 4i >. 41 k 0 "CO U -Q) N- O r -H r-I U) r, -r-I -H, 00 °° l• ) oa) MC k 4) P±4 H "° a) -H 44 -X ) 4-4 Cd F) ~-o C---~ ~ ~ t .rl :4 H 0 Cl) rCl O rc$ 0 ý dU) r--f 41i CU) + V(LI + -H -H. v Cl) Clro v ,C v U)4 40 4 O• *l) 5k o IrH;Cd -H II II >1 .i- >1 >1 4-4Ua) -H q4- -H 41 -H -H, I 0 4-i U) \\ '- eN) 4 r W'-0tN O4 0 0 co or H0 -0 N S0 " ý4 U Uri 4.) C) 0 0u ) .0 >1 144 U oo O .i.. U) 14-4 o\ \\ >1 41i ký4 -H -H 0- 0~ 4-4 0 \\ r.(d \-\ ( M. 0 -H .- i r-I V V #I--#I,--I U U rdW 0 va) >l SA Cli-) .rr -;X14 C-) U) -H 0 0 44 44 -H A 41 kU) 0 ro 4-j O 0 VU) rc$ - r-4 0 -H ",- -H "- 5 -i -- 0 0 Cd 0 4-i v v v v 0o -• 0 Vkk u 0 0 +a +6 -N u4 A -41 4 *HH -1 ,•s C) 0 ,C 04 ---* •-V -He-- ~: U) -H - A .C 4-44-4 u > U 4 Wa)a 0 ý4 U) U >1 U) - *0'r( U) HQa -H V HU 4-) -H- a) (o ý0 u a) U) a) ý-I -Hi o . u - Ub -H II --) rd U -H -'l -H t * A .1A O A ,C. 0. oA -H Q04 Cd ,rc . o M Q) d00 S0 ý- ý 0 0 QQ) 4J 04 -H-I- 04 *4 Qm2 U~ 0) tt 0 - 04 -•1 . -H 1 M v v v v S O*o WH w w w w Cd O00 4-J4. rb - (4 : - Cd 14 ro -: 4 -H ** q) 3 ; U 3 U 3 :3 :1 H UUi -Ir- a) -H -H -H -H ****: . - H I S r-d 0 II zZ Ea C4 + ) - 4 04-Cd A S Cd ~0 04 -* Cd H ,Q P ,, A ý4 -M 0 ý4Q U) SW 04 -H V U)~ 0 -Q p• H :1 II - 0• 04- -4 4) -H, U -,- U)4-, -H -H) 0 4-4 H 4.) --0 41 a) ý-4J U) P4 d ý4U) 0 ý4rU U) Ma) 40 -H 0 U': U -a) H -H **0-H E -H -r- 3 94 *• 4• Q) ý4 ro *H 4 I H C',3 m H 0H U) a) rWo Q UW-N U) o) 7 O) 0 44ClV rO cd4-4 U) (0 HHO01 Q-C) 0D 4jO H 0 U) 4-4 O)44 H H 4 U)-H 4 04 v>1 V Ha) 0 9;-I >1 Q) ý- o b Q)4 41U) H •4 --- H a)) A -r4 4,-4 U o -aH U P4U4 0 U a) a) 04 44 a) 41 .l 0 4a) -AU) z U) 0 ý4 04 :•*R C) H" (0 rc -H0 ýD O H SII Q4 CO U -H H '~. r~ •-- ~c-. U) ) 000ý -H C4 H {9 -,- U ,, (D ** 0 0 0.X•,x .l 0 c ltx • A O Qi) CS O 0 0 z c)z SA o • 4 D1-w A -H I 0 A U -- I I oo 0 o o o 0 0 0 0 H o 10 ýo H 4I rd H --- o C U 0 ) Q) *4r- I ~AI 4I -H -- J ' -- 0 o U) HA r-H I-i ý4 '- i : + 0 H A 0C 0 ) a) -H H -H - UA ) * C -H S H z H -H 0 --H A- ONON ONCN0ý ON -I U) H U) I 4 Q -H -)Od -H A I A I-I 4' C wC -*H 1Q~ C C -- r -I 0 0C -r -H -H -I-)O 0 -H >c H - - 0) >0 -H (a r-H 4H 4-) 4-) ) 00 0o 4- - A 0 H0 V Cd 0 -H U 0C 0 4J 00 A I ) 0 04 -H r-H A - C-H 9-IJD U l 0 H I -- - -* vd O Cd H4 -H Cd U)z 0 -H H H 0H0 A N -*R A 4) ) H N zU) 0 0 0 -Hl ~r.0-e H-I A -H U 41 ) k 0 -H - 41 4J -- I 0 -i 4- 0 0 I 0 4-) S 00 C -H ) 0 0 0 0 Z o . l- 0 Z '-r-H 4-) (a w C -H iH 0 4O -H H (a rl -q ý4 -- -H o >1 -u a IO u r U) 00 -H • >1 00 00) S 40 ro" 0 -H r.) 0)r -H ClE -)-H m ,CU 0 O• .1 . -HU) (oC ,u 0U nc u U r• .1 0 .104 >1 0 -44 r r-4 )Hr 44U -H0 Cl C 04 0 oo -H 0) 04 )4 ) 4U) - 14-1 4 1 O ~4-34d d 0)~2(0 ý4 E -H J-HI 0).. -i -H 4. u U).. (1) U) 4-) ) Um t 000\( 14-4 O0 O 0 >1 04 0C-) 0o U - - U)..- 44-0 4-) 4- U) -H V 4c - U gCd U)4- -H 4-) lu U)) S4- tr)• O 4- U IC 0~0 4-) -H. 9 U) u U)144 4-) U U)NU 04 (o -H Q)C) 4-H4-) -HU ( u) 44) U) rH 4C ý--I U) - 1j r- U) ý 4ý zCdNl0U) w 0w ;ý• r0 r i 41 rMm l 1)-4 QýD 4- 4- U -W4m) U) U) U 4 C-) Q) 4-3 (0 z4-) U) r H U 4Om u 0 • Q 4 000 U) C U1 4-) u U)• 0)4 r Cd-HM 04 4-)Q CCOU 4-) )-W U 41 U)H H-I4-) U 4 'I- 4 UA *ot \) - Cd I-) 04 4 U ICj 4 44 U -H- %4 4-) ý4 U) a) 4 0 U) U A -II 44 .U rr 4) 14-H M 14 H C 41 T$ r- >1-0 F-: 4- U) 0H m w0 jiU) 40)0 -H0 (0 n U oo-- 4 .U)D ý4 0 w -> O0*41 4 WU *- H U) ro 14AU) 0 4-) U) 4) -H -H -H0 U0 -HU ) 4-A 4U 0 Q -u)U)rH 0)-H 4 Q) U)Uq ) Q)AU NA PU)$4 4 4-) -H U 0- U~ H) 0r -H4 U)Uq 0 0 C U) 4 ri U)-O d 044U) -U H4- 4HrI-i u C - 4-) U 4 U) U Cd ~ *U)0)ri cl 0 0F Ur F O )- 0 -U 4 ICu I 4J 44-) 0a) -H 14 4 4- )-I 4Cd U 0 ) 40 04 )Q - m 0 11I 40 ;-H 0EU) CdAO ) +-H IQ U) U -H -4 U)14-J ý -)U) 0 0 01U) U) 4-) ý -H ý4 C F U) - rP 0U) 04U)-:U~204-1 0 ý4 ý4H (0 01 0 -r-ý4ý 0 4 W:) W H I~n-10 O o0) 4 0 M > >j0 U)0 0 -H 0U0I o 0 -0 - U4d Ur U)44-)d >1U)0U00 O-H0) >1 U04U)C 4En 0U 4-) 4-D ý- + IUCr-H - 0w U 0)wdw rH wU U0) F-1 04 I U -H 0 U) 1-0 U)U0dUU)-H q U) 0 0 4-j U 4-i.. mr1.I J -w0)udo-Z0) r 4ý -q -M (0- )-HUO ý0 X OCW 4*-H 0 -H--T J 04 0U)S ) 44-H) 0)U4 - U UIn1 CO u ~U.. Z O ~ 0 4-U HU-C MOO0O 0 C0 CU)* IU)C 4U 0 -H -HU)U U 4j-A- UEn J U) 4 -- \4 n-i V- U) 00U)0 I4 U) 00U 40) d 0 041 Fd04 :1-)A u U4 0 U * 4** -H4 U144-) 0 0 -HUU0 C MO U u Cd ) - ~ - - , 4- °° 0) U)14-4 -H ý4- L~U)4-4 -ý , - ~- -H 010 -H4 n d - CdUA 0 4-) 4-) 1-1 ON ON 00 UO01144 CdU)4 - Cd 44 OU)U-H14 U)0 -ý-- Ul)4-4 -44 0) -H 011- -H)U 0 O0 44-HQ ** 4-) U)4- U -HU 4-)-H U) Qi) -H ::j 440 U4D 00 Cd 4-4 U) -H 0 W 14-4 dU)> U)Pýr 0) U -U)441-H-4 -H 1 4 4--)UCd U QU)U)U T OU -, -ý -ý - ý 1-- tý, 00 0\ Qý -" cl-Irn "t Vý ýc rn ýY)ýn C'n 00 o 0Cl 00 0;04 4-) 00)Q C ** >i r-4• 4-) 0 4- H r0 0 ) 0 00 S 0004 0U) rJ U) 0 .r* 04 0 CO-• -044-ofl O W Cs U) . * -rA~~~ 4 0 04 0 44*Z4 0)U w -C r4 44 O ~ OU 0 0 0 S0 fT4 -- cd 0 H WE-r-l 0) M. - Q 11 U) -H 04 04E ý 4 U)-I 0 0•1 0 #I- 0. 0 • 04 -H 0 -d 0 U) 04 U) (0-riU)U( 00 T$ r. X 4 - -1 *do 0 ;40 4> 444- )X 41 ) 4- 0 04 HHa)Z04 -- 0 U#) *U) . Q) 4*HU ( 00 *H4~d )U =*v-H #1 +4-)+ u -4 ) .4 4 04-)"" - 00)d00 U) 04 U) u 0 + a --- U 0040 u 0 4 .- 000) V--.. 0 44 4 C-) UQ4r 040 E-I Q * [ 04~ Q0 O 1 04d r-q -HOUH 0 0 40 44-44(:1 #I4 P rU) Cd 0 O rT Q) rHAU) 000-H r-A -2 *c - 04 -rI 11 4-)*) U Q)-H i rJ 040 _ H H- - A ý.9 a) 0n U) O 4 M Cd0U00) 0d >14-) 0 4-U) -4J-) 4 r-q 0 M-r 0 -H 0 U)0 r-A r- 4 -4 H0-H Q4-) 41 (0 044, U) U) d-OQ r-I 0 =- ,• $ r OH4-1t 0 r-*HE : QV -HI r. -4 4. 0)F- 04 0- 4 0• 4 00ý 3o4-) . O 4 i n . 0) r-Q5 -HE4) 4> O~~ ;J E-1 -HW 44 . E04 0U) 0 4•4 *4CC f 4rH I FnS4-)UU) wH Q 5 .4 q E-40 r-1fl - )U) ,QU)-HA O 00 )0 ZC U)ZXXfl0 ) ~ 0 4 0 000 0-H Uo U) r o :R) 10 4-)Q0) 0 V V1 u - IQ H 04-) 1-40) O U) 00 ) U) 4-) Q () f, 00 U udQ0 0 o -H-H0 . l Q, 3-)E-4 4ýA ) 4, (r 1 )0 Q0 - ZE40,. -U)04-)$ r04 • - . *4 .4r0 H 44- 4-H 4}:U F * -Q ) *-) . (14) - )(-l 1) H )(_U0 -i 4-)4iCOH -H 4-) O 01 w --)r- 04,Q ,r- Q) 4 -- 0 U) 0 H -l 0•r 0. OH * llA H *DIc444 - U) U) ) 4-) U 1-- r)- 4- 04- U)* 4c + + Cd 441- 4U) + 0 + 0 -H + 4) 71 U) ++ + II 40O 0-, 'H-Hq F-* ýD 04 - 1 > "0 S b0 -H 14 U) -) Cd 0 ZU) 0) 4-) U) - - 4q ýo t Cd 0-1oo ON 0 ', U + ,rHA 14 -4 - 4.44-) U) U) 4c -4 IIiII C -H -4 41 U - . 41-4 I-I d 404-H rq nr (N .- + o +1 0 V Vl (N(N -*n .4 -H -* *--H ( C -n r 0 cq aU) Irr-A r.4 -H -H :I- W) '-0 tN 1-4 4-- fn M M 4 0 00 0\ (Z 4-1 ) 14 -4 0 4 '-- H U) j 4-) 14-H -HHH 4-) ýD0) 1- 4 O4 0 4 (N rn 'I-t V) 'C ) 'H U) -H -H 41 I ~ 1-I 0 - N. - 0 r(q C)- U) U) II V -H-H H -H II II 41 *- .4 * 1- 4-) 4, 1--i a) + + + -H TV c-I) 14 Cd o ) 14 U+ 0 C 4- 4 Ic U141 41 *. 0 4-) - II 114-) U)) 0) S4-- 11434 * + -U•) 0 0 0d 10-- • - I U•4- 1 c-H-- Q140) A 1-414 4U) -0 - 04 ,C4 0 ti-) 57: I -- I r+ *-H 4 - j1 -(p >1 H. 4-) + 14 'H U) r-4 - 4-) 0) 1I (Do ON~Q) 00 (. . cN U) - 0( 44 0 4D 4-) 14 W 'HO W -H 4-40) 1-- 4-1) 0C -Q~ ry(N ) 0)-H ,:S E U) 0a) . -H 4-0 -H 41 n U00) 0)D1--ý k -4 -Hr 0)0 -H 0O r 4 4ý O U -H d 4) 5 41 * ro E-4 0 0 rO 0 0 0 Fro 400 ~ E--4 04 0 0R U) 0 5 . u 0C i)40 Q U) - E-4 4i) (0 r-4F'04 00)0 Oi F'I 0 aU- *W 0 Q) ) 0 QH 4 4UF) r -* 0m * 10 0* 4 4Q) TO CS0 0\ 4: C 0 U 4i * )4 O. z C I 0-l 04 U -ýFi * 4 0 rH 04 0 Q) Ua 0 -#14 *- O A-) 0 0 -ii U) 0 41 U) 40) C) rF' 41 ra U) "o 0t 01 - 0\ 0 rCc: + C 4Uj)- #1-- H~U *. -LU 0 . 0 0 a) U) 0 Cd C) 00 4 0 4 00 U)OS -15 4 4 04 FW4 ýJ ou 4 044 TO U) -H 4o Sr- I *a H * Cd' Q) (C 0 F4 a) Q ro -H* F a) 40 rH -H z04a o c1 TO 004 04ORf:Hp S0 o o0 U0 4 • Q 4H -Q a ro o ,C4 0 Fý4 Co 0 .H4 -H4 OH -H 0O0 O)TO *)F2 S0 0L 04 * St,, 00c-, ý 4 (,n q-V)oo * T TO -H C 0o0N <o -, Cq )tN 0'O UO ,C U 4U T04 U) 0 -H S>1 U) 0 >1 x 00 a) 00 U) S>1 0 O 0 rc: r4 S 4 *d Cd H: Cd a) 0x m a) O INO ýc H 00 ,- 4 0 --- 9 4C HO* Cl F'H0 00 Cd U) U) 0 4 o O S4 -r't 0• -HO 0 S) a4 5 0 Z4 4 Ca) H 9- 0 a rH 0 C.0 -•o a -LiU) O.04 0L) rH -H rO 0 -•i H 04 U) -A 04 r.a) 04 -H-H * QC F4 a) -H 0a 0i a) t, t0l0r0ý 0O 00 00 00 00 Sample Run Appendix C The following is a sample run of the AM2SGML program. The SGML document instance and DTD used is the following, taken from the "Guidelines for Electronic Text Encoding and Interchange." ' I <!DOCTYPE anth [ <!ELEMENT anth 2 3 <!ELEMENT poem <!ELEMENT title 4 <!ELEMENT stanza 5 6 <!ELEMENT line 0 0 O 0 (poem+)> (title?, stanza+)> (#PCDATA)> (line+)> (#PCDATA)> 7 ]> 8 9 <anth> <poem> 10 <title>The SICK ROSE 11 <stanza> 12 <line>O Rose thou art sick. 13 <line>The invisible worm, 14 <line>That flies in the night 15 <line>In the howling storm: 16 <stanza> 17 <line>Has found out thy bed 18 <line>Of crimson joy: 19 20 <line>And his dark secret love 21 <line>Does thy life destroy </poem> 22 23 <!-- This is taken from the TEI guide -- > 24 </anth> The following is the command line used to parse the file: test testDir/myTest7.sgml 0 init.ocs 0 0 where testDir/myTest7 . sgml is the name of the file given above, and init. ocs is a compiled SGML declaration produced from a previous execution of AM2SGML. The results are as follows: 1. Sperberg-McQueen, pp. 16-17. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ---------<Document> <ANTH> <POEM> <TITLE> </TITLE><STANZA> <LINE> </LINE><LINE> </LINE><LINE> </LINE><LINE> </LINE></STANZA><STANZA> <LINE> </LINE><LINE> </LINE><LINE> </LINE><LINE> </LINE></STANZA></POEM></ANTH> </Document> 18---------- These are the expected results.