dotar240100755000076400007640000000066207665051737010446 0ustar jwbjwb# rm -f xjdic24.tar rm -f xjdic24.tar.gz rm -f xjdic24.tgz tar cvf xjdic24.tar dotar24 .xjdicrc.skel Makefile xjdic24.inf xjdic24.WHATSNEW xjdic23.WHATSNEW xjdic22.WHATSNEW xjdic24.install xjdic.h xjdclient.c xjdcomm.c xjdfrontend.c xjdsa.c xjdservcomm.c xjdserver.c xjdxgen.c exjdxgen.c xjdrad.c makekanjstroke.c vconj romkana.cnv radicals.tm radkfile kanjstroke gnu_licence xjdic.1 gzip -9 xjdic24.tar mv xjdic24.tar.gz xjdic24.tgz .xjdicrc.skel0100644000076400007640000000203606573511447011616 0ustar jwbjwb# # Sample .xjdicrc file # # (remove comments from lines below if you want to activate the # option) # # server (default is localhost) # server daneel.dgs.monash.edu.au dicdir /home/jwb/nihongo/dics kdicfile kanjidic_b # note that I use "kanjidic_b", because I have joined the kanjidic & # kanjd212 files # dicfile (default is edict alone) dicfile edict dicfile jddict dicfile compdic # kdnosho (no default) kdnoshow YELUQMKZ # filt (no defaults) # # I don't use these filters, now that names have been moved # to the ENAMDICT file #filt 0 2 off "Exclude proper names" (pl, (pn pl) pn) #filt 1 1 off "Exclude all place names" (pl, pl) #filt 2 1 off "Exclude all person names" (pn pn) #filt 3 0 off "Show only person names" (pn pn) #filt 4 0 off "Show only place names" (pl, pl) #filt 5 0 off "Show only place & person names" (pl, (pn pl) pn) # extfile (default is edictext) #extfile edictexx # exlist (no default excluded words for xjdxgen) exlist abbr col vul vulg then and conj int pron pref suf syn ant from exlist adv adj hon hum pol jap japanese Makefile0100644000076400007640000001143007665052017010664 0ustar jwbjwb######################################################################## # # X J D I C # ####################################################################### # This is the makefile for xjdic/xjdserver/xjdxgen V2.4 # # to use this file, you have several options: # make all - does all the binaries # make client - just makes the xjdic_cl binary # make server - just makes the xjdserver server # make stand - just makes the xjdic_sa stand-alone version # make xjdxgen - just makes the xjdxgen index generator # make exjdxgen - just makes the exjdxgen extension file index generator # make clean - just tidies up, removing the .o files. # make realclean - deletes everything compiled, not just .o files. # # This Makefile is set to use the gcc compiler. If you want cc instead # you will need to alter the "CC=gcc" below, or use CC=cc on the command # line. # # If you want strict BSD ioctls used (which seems to be the case # for Suns) add -D__STRICT_BSD___ to the SACFLAGS and CLCFLAGS macros. # # You need to select one of three dictionary and index file # access options by uncommenting the appropriate SACFLAGS and # SVCFLAGS macros: # # memory-mapped I/O use -DMMAP # demand-paging use -DDEMAND_PAGING # load into RAM use -DRAM_LOAD # # Memory-mapped I/O does not appear to function correctly # under Ultrix. It works with Solaris and Linux. # # Note that it is assumed that window-size ioctls are available. # If you want to use curses instead, delete the -DWINSIZE...., # and compile the client and/or the stand-alone programs with # the "-lcurses -ltermcap". # # Expect some compilation warnings about "qsort". No-one seems # able to remove them. # # For DEC Ultrix, you will probably need to alter the comments # on the SACFLAGS and SVCFLAGS macros to remove MMAP, as this # appears not to work on that OS. # # For Sun and Linux, you may need to include the "unistd.h" file. # # For Solaris 2.x, you will probably need to uncomment the following # if you want to use the server/client operation. Also be prepared # for some complaining about pointer mismatches in routines like # `recv'. They can be ignored. # #LIBS= -lsocket -lnsl # CC=gcc -g all: xjdic_sa xjdic_cl xjdserver xjdxgen exjdxgen client: xjdic_cl server: xjdserver stand: xjdic_sa # # X J D X G E N # JDXOBJECTS = xjdxgen.o xjdxgen: $(JDXOBJECTS) $(CC) $(JDXOBJECTS) -o xjdxgen xjdxgen.o: xjdxgen.c $(CC) -c xjdxgen.c # # E X J D X G E N # EJDXOBJECTS = exjdxgen.o exjdxgen: $(EJDXOBJECTS) $(CC) $(EJDXOBJECTS) -o exjdxgen exjdxgen.o: exjdxgen.c $(CC) -c exjdxgen.c # # S T A N D _ A L O N E # SAOBJECTS = xjdsa.o xjdcomm_sa.o xjdservcomm_sa.o xjdfrontend_sa.o #SACFLAGS = -DXJDFRONTEND -DXJDDIC -DDEMAND_PAGING SACFLAGS = -DXJDFRONTEND -DXJDDIC -DMMAP #SACFLAGS = -DXJDFRONTEND -DXJDDIC -DRAM_LOAD xjdic_sa: $(SAOBJECTS) $(CC) $(SAOBJECTS) -o xjdic_sa xjdsa.o: xjdsa.c $(CC) -c $(SACFLAGS) xjdsa.c xjdcomm_sa.o: xjdcomm.c $(CC) -c $(SACFLAGS) xjdcomm.c -o xjdcomm_sa.o xjdservcomm_sa.o: xjdservcomm.c $(CC) -c $(SACFLAGS) xjdservcomm.c -o xjdservcomm_sa.o xjdfrontend_sa.o: xjdfrontend.c $(CC) -c $(SACFLAGS) xjdfrontend.c -o xjdfrontend_sa.o $(SAOBJECTS): xjdic.h # # C L I E N T # CLOBJECTS = xjdclient.o xjdcomm_cl.o xjdfrontend_cl.o CLCFLAGS = -DXJDFRONTEND -DXJDCLSERV xjdic_cl: $(CLOBJECTS) $(CC) $(CLOBJECTS) $(LIBS) -o xjdic_cl xjdclient.o: xjdclient.c $(CC) -c $(CLCFLAGS) xjdclient.c xjdcomm_cl.o: xjdcomm.c $(CC) -c $(CLCFLAGS) xjdcomm.c -o xjdcomm_cl.o xjdfrontend_cl.o: xjdfrontend.c $(CC) -c $(CLCFLAGS) xjdfrontend.c -o xjdfrontend_cl.o $(CLOBJECTS): xjdic.h # # S E R V E R # SVOBJECTS = xjdcomm_sv.o xjdservcomm_sv.o xjdserver.o #SVCFLAGS = -DXJDDIC -DXJDCLSERV -DDEMAND_PAGING SVCFLAGS = -DXJDDIC -DXJDCLSERV -DMMAP #SVCFLAGS = -DXJDDIC -DXJDCLSERV -DRAM_LOAD xjdserver: $(SVOBJECTS) $(CC) $(SVOBJECTS) $(LIBS) -o xjdserver xjdcomm_sv.o: xjdcomm.c $(CC) -c $(SVCFLAGS) xjdcomm.c -o xjdcomm_sv.o xjdservcomm_sv.o: xjdservcomm.c $(CC) -c $(SVCFLAGS) xjdservcomm.c -o xjdservcomm_sv.o xjdserver.o: xjdserver.c $(CC) -c $(SVCFLAGS) xjdserver.c $(SVOBJECTS): xjdic.h # clean: rm -f *.o realclean: clean rm -f xjdic_sa xjdic_cl xjdserver xjdxgen exjdxgen # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 1, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ xjdic24.inf0100644000076400007640000016155307665057361011214 0ustar jwbjwb X J D I C V 2 . 4 / X J D S E R V E R V 2 . 4 (Copyright: J.W. Breen - 2003) INDEX A. INTRODUCTION B. INVOCATION C. MODES OF OPERATION D. ENTERING SEARCH KEYS E. EXITING F. ON-LINE HELP G. ROMAJI-TO-KANA CONVERSION H. JAPANESE CODES I. DICTIONARIES J. MULTIPLE DICTIONARIES K. FILTERS L. LOGGING M. CONTROL FILE N. OTHER FILES O. INSTALLATION P. AUTHOR'S COMMENT Q. REVISIONS APPENDICES A. COMMAND SUMMARY B. XJDSERVER PROTOCOL C. JIS X 0212-1990 KANJI A. INTRODUCTION XJDIC is an electronic Japanese-English dictionary program designed to operate in the X11 window environment. In particular, it must run in an "xterm" environment which has Japanese language support such as provided by "kterm" or internationalized xterm, aixterm, etc. It is based on JDIC and JREADER which were developed to run under MS-DOS on IBM PCs or clones. XJDIC functions as: (a) an English to Japanese dictionary (eiwa jiten), searching for and displaying entries for key-words entered in English; (b) a Japanese to English dictionary (waei jiten), searching for and displaying entries for keywords or phrases entered in Japanese (kanji, hiragana or katakana); (c) a Japanese-English Character dictionary (kanei jiten), capable of selecting kanji characters by JIS code, radical, stroke count, Nelson Index number or reading, and displaying compounds containing that kanji. XJDIC is typically run in a window of its own. The user can then use it as a free-standing on-line dictionary. It can also be used as an accessory when reading or writing text in another window (e.g. reading the "fj" Japanese news groups.) Strings of text, either English or Japanese, can be moved to and from XJDIC using X11's mouse "cut-and-paste" operations. From V2.0, XJDIC is available in two forms: a stand-alone program, and a client/server pair of programs. In the latter case, XJDIC becomes a client sending dictionary search requests to another program: XJDSERVER, which may be on the same system, or may be on another host machine altogether. One copy of XJDSERVER may support any number of copies of XJDIC. See the XJDIC24.INSTALL file for more details. The source code and documentation of XJDIC are hereby released under the terms of the GNU General Public License (GPL). All usage of this program is at the user's risk, and there is no warranty on its performance. Copies may be distributed by any means which conforms to the terms of the GPL. The EDICT and KANJIDIC files are also freely available, but are covered by their own copyright and licence statements, and are not under the GPL. All the Japanese displayed by XJDIC is in kana and kanji, so if you cannot read at least hiragana and katakana, this is not the program for you. The author has no intention whatsoever of producing a version using romanized Japanese. B. INVOCATION The invocation of XJDIC is: xjdic The command line options are: [SA: Stand-alone, CL: Client, SV: Server] -d dictionary-path_and_filename [SA,SV] the path and file-name of the Japanese-English dictionary files to use. If more than one dictionary file is to be used, you must use multiple "-d" options. If this option is not present, the single dictionary file "EDICT" will be used, along with the index file "EDICT.XJDX". These must be either in the current directory, or the directory specified in the XJDIC environment variable. The dictionary can also be specified in the .xjdicrc file (see below). -k kanji_dictionary-path_and_filename [SA,SV] the path and file-name of the Kanji dictionary to use. If not present, the dictionary file "KANJIDIC" will be used, along with the index file "KANJIDIC.XJDX". These must be either in the current directory, or the directory specified in the XJDIC environment variable. The dictionary can also be specified in the .xjdicrc file (see below). -j Japanese_output_code_type (j, e or s) [SA,CL] XJDIC uses "New-JIS" codes as its default output method. This is quite acceptable if you are running under kterm. Some other environments which are internationalized (e.g. aixterm) can only handle EUC or Shift-JIS codes. XJDIC can be made to output in these codes by the "-j e" or "-j s" command-line options. "-j j" sets it to New-JIS (the default). -v [SA,CL] To disable the verb de-inflection function. -K [SV] To prevent the server from establishing itself as a daemon, i.e. a background program not dependent on a terminal. (This option is mainly for debugging purposes.) -P nnnnn [CL,SV] To instruct the client/server version to use UDP port nnnnn, instead of the default port (47512). (This port number can alternatively be set in the .xjdicrc file.) -S server_address [CL] To instruct the client that the server is to be found at the specified network address. (This address can alternatively be set in the .xjdicrc file.) -E [CL,SA] To instruct the program that it is in EUC mode, and refrain from interpreting the 3-byte kanji of the JIS X 0212 set, which starts with a hex 8F, as Shift-JIS. -h [CL,SV,SA] this option results in the display of a simple summary of command-line options. -c [CL,SV,SA] To specify the path and name of a control file to be used instead of the default ".xjdicrc" file. -C [CL,SA] To specify the name of a clipboard file to use instead of the default "clipboard". -V [CL,SA] To disable the use of reverse-video in the display of matches. C. MODES OF OPERATION As described below, XJDIC's default prompt is set to receive search keywords. It will also react to certain non-alphabetic keystrokes, and treat them as instructions to change an operating mode, or to carry out some special function. These commands are described below as they appear in the text, and a summary of these commands is at Appendix A. D. ENTERING SEARCH KEYS (a) Japanese-English Dictionary XJDIC operates in two modes: Japanese-English Dictionary, and Kanji Dictionary. In the case of the Japanese-English Dictionary, search keys are entered in response to the "XJDIC [name] SEARCH KEY:" prompt. The "[name]" is either the name of the current dictionary file, or "[GLOBAL]" in the case of the global searching option. Search keys can be either in English (typically entered from the keyboard) or kana and/or kanji (entered via a "front-end" program such as kinput2, entered using XJDIC's internal romaji/kana converter (see below), or cut from another window using X11 mouse operations.) To invoke the romaji/kana converter, you have two options: (i) begin a search key with either "@" for hiragana or "#" for katakana. Then as you type the key, it will be converted to the selected kana. (See below for details of the romaji-to-kana conversion.) (ii) you can set the program to assume that input will be in kana (hiragana), either by toggling the "kana input mode" on with the "&" command, or by setting the "kanamode" directive in the .xjdicrc file. In this case if you want to enter katakana, you still must use the "#" prefix. You can still input English search keys without changing mode by prefixing the key with the letter "l" to signal a temporary reversion to non-kana mode. A multi-line display will be produced of all the dictionary entries which contain matches with the search key. The display format is: match-length: KANJI (yomikata) English_1; English_2; etc with the matched key in reverse-video. "Match-length" indicates the number of characters in the key-word which matched entries in the dictionary file. XJDIC will find the longest possible match, unless the exact_match mode is engaged using the "[" command, in which case only entries which exactly match the keyword will be displayed. The use of reverse-video can be disabled at startup by the "-V" command-line option, and toggled during operation by the "}" command. (An alternative display format is available, in which the "raw" EDICT format is used. This mode, which is most useful when carrying out dictionary maintenance, is toggled with the "|" command.) A line is only displayed once per search, regardless of the number of matches which occur within it. If the search resulted in more entries than will fit on a screen, a further prompt occurs at the bottom of the screen giving you the option of requesting the next screen-full. Once all the matches on a key are exhausted, the keyword is shortened by one character, and the display is continued. The matching of kana keys is insensitive to whether they are in katakana or hiragana, however note that the convention for long vowels differs between Japanese words and gairaigo. Matching of English keywords is insensitive to case. The display is in "dictionary" order for the words matched, i.e. alphabetical for the English search, and JIS code order for the Japanese search. JIS order is very close to the "gojuuon" kana order used in Japanese dictionaries except that it separates the syllables with the nigori and maru diacritic marks. If the word being used to search the dictionary consists of a kanji followed by two or more hiragana, the kana is matched against common verb and adjective inflections. If a match is found, the search is initially made for the plain or "dictionary form" of the word. The possible combinations of inflections or conjugations is taken from the VCONJ file. The verb de-inflection function can be toggled on and off with the ":" key. It is possible to set up a number of "filters" which either restrict the display to dictionary entries which contain certain strings of characters, or suppress the display of entries with certain strings. This feature is useful if the user wants to avoid the large number of proper nouns in the dictionary. See the section FILTERS below for details of how to set up such filter strings. Individual filters can be activated or deactivated using the ";" command. In addition, it is possible to set or clear a "one-off" filter string which must be present for a line to be displayed. This is done with the "'" (single right quote) command. This string can be English, kana or kanji. Thus, for example, it is possible to search for entries which have a particular kanji with a specified reading by setting the reading as the filter and searching for the kanji. (Note that some caution should is necessary when using filters, particularly with a search key which will result in many potential matches, as the program can run very slowly as it examines the entries for the presence or absence of the filter.) As a further option, it is possible to restrict a search for an English keyword to ones which have been flagged in the dictionary file as being of a higher priority. This flagging is done by prepending a "@" to such words. The "priority search" mode is toggled on and off by the "+" key. The display of "priority" English words is done in reverse-video. Note that it is possible to use multiple dictionaries, as specified in the command-line or .xjdicrc file, and to select which dictionary to use in a search by using the "=", "^" or "_" commands. See the section below on alternative dictionaries. Since V2.3, XJDIC has a "clipboard" option, invoked by the "{" command. When in clipboard mode, XJDIC reads a file called "clipboard" (default, another file may be specified in the command-line or control file), and if this file has changed since it was last read, the first string in the file is used as the key. XJDIC does not respond at all to the keyboard whilst in this mode; to exit from the mode, the clipboard file must contain the string "quit". (b) Kanji Dictionaries XJDIC has the capability to select individual kanji characters by a variety of techniques, and to display information about that character. The character can then be "cut" into the main dictionary search to display all dictionary entries starting with or containing that particular character. The main Kanji Dictionary used by XJDIC is the KANJIDIC file, some details of which are included below. This file supports the 6,355 kanji of the JIS X 0208-1990 set. In addition, the KANJD212 file is available for the 5,801 supplementary kanji in the JIS X 0212-1990 set. The two files can be combined and used as a single file. The search of the Kanji Dictionary is triggered by entering "\", which causes the "KANJI LOOKUP TYPE:" prompt to appear. The kanji lookup types are specified by entering a further single character: J - by its "JIS" code. This is the standard 4-digit hexadecimal code used to identify each Japanese character. Alternatively the 4-digit Kuten code may be entered preceded by a "k", and the 4-digit Shift-JIS code may be entered preceded by a "s". (If you have the KANJD212 entries in your kanji file, you can specify these by placing an `h' in front of the JIS or Kuten code. JIS X 0212 kanji do not have Shift-JIS codes.) C - by one of the identifying codes within the Kanji Dictionary. The codes presently in KANJIDIC are: Nnnnn - the "Nelson" index number. This refers the kanji index numbers used by the late Professor Andrew N. Nelson in his famous "Japanese-English Character Dictionary", published by Tuttle. Over 5000 kanji in XJDIC's files have Nelson numbers. (Now known as the "Classic" Nelson".) Vnnnn - the "New Nelson" index number, from the 1997 and later edition edited by John Haig. Snn - the stroke count. A display of all the characters with that stroke count is produced. As above, the desired character can be selected for the display of its compounds. Bnn - the primary radical (Bushu). The Bushu numbers used by XJDIC are those from Nelson (as depicted inside the front cover of Nelson's "Japanese English Character Dictionary"). To use this method, you will either need to have a copy of the Nelson radical table with you, or be prepared to use the "R" command to display the radical numbers. As an alternative to keying the Bushu number, you can cut the kanji from the radical display into the response, i.e. respond with "B" followed by the kanji. The kanji will be detected, and provided it is one of the kanji identifying the Bushu in the "R" display, the appropriate Bushu number will be derived. (For the Bushu search, you will also be asked for a stroke count, and only the kanji with that bushu/stroke combination will be displayed. If you want a display of all the kanji for that bushu number, enter a stroke count of 0, or just press "Enter".) Cnn - the "classical" radical, where this is listed. As with the Bnn search, you be asked for a stroke count. Hnnnn - the Halpern number, which is the index in Jack Halpern's Character Dictionary. About 3000 characters in KANJIDIC have Halpern numbers assigned. Pn-n-n - the SKIP code used by Halpern to find kanji. Unnnn - the Unicode code for the kanji. (Other codes may be added, so check the kanjidic.doc file.) K - by the reading (or yomikata) of a character. Both on and kun readings are used for this search. A display of all kanji with that particular yomikata is produced, and the desired character can be selected using the mouse. A kanji can also be entered if its characteristics are to be examined. As with the other mode of usage, an automatic romaji/kana conversion can be invoked by beginning the key with either "@" or "#". M - by its English "meaning". L - initiates the multi-radical kanji search technique, in which the user specifies up to 10 radical components of the kanji. See (d) below. R - initiates a display of all the Bushu along with their numbers. If no identifying code is entered, XJDIC assumes it is searching for a kanji or yomikata. Once the search criteria for a kanji has been provided by any of the techniques described above, XJDIC displays the kanji which meet those criteria. The display can be in one of two forms: (i) a short-form, in which all the kanji which meet the criteria are displayed in a block, sorted by stroke count and bushu; (ii) a long-form, in which a complete line of information is displayed for each kanji (as described below.) (The short-form/long-form modes can be toggled using the "-" command.) If only one kanji meets the criteria, e.g. if the search is for the kanji itself, then the long-form display is invoked. In the long-form display, the following information about the kanji is displayed: KANJI character KUTEN code in decimal ([nnnn]) JIS code in hexadecimal [Kuten-code:Shift-JIS-code] Unicode code in hexadecimal (Uxxxx) (classic) Nelson No (Nnnnn) (new) Nelson No (Vnnnn) Bushu No (Bnn, and Cnn if the "classical radical differs) Stroke Count (Snn) Halpern No (Hnnnn) SKIP code (Pn-n-n) Grade (G1 to G6 if taught in those grades, G8 for Joyo kanji, and G9 for the supplementary Jinmeiyou kanji.) Other codes available in the KANJIDIC file, each with their distinguishing first letter. "on" readings of the character in katakana "kun" readings in hiragana meanings ascribed to the kanji (such as are found in the popular kanji dictionaries, such as Nelson, Heisig, Halpern and Spahn & Hadamitzky.) NB: The KANJIDIC file is under continuous revision. The above information is certain to be incomplete. Please consult the "kanjidic.doc" file for the current format and fields. Note that it is possible to suppress the display of certain fields through use of the "kdnoshow" directive in the .xjdicrc file. (This feature was accidently dropped from V2.3, but re-instated in V2.4.) At this stage, the user can request a display of all the compounds containing that character by using the mouse to select the kanji and entering it as the search key for a main dictionary search. XJDIC has two modes for displaying compounds containing a particular sequence of one or more kanji. Either the display is restricted to only those compounds which begin with the sequence, or all compounds containing the sequence can be displayed. When XJDIC loads it is in the more limited mode, however the mode can be toggled using the "/" key. (c) Dictionary Extension File [Note: this may not yet be available.] Associated with the main EDICT dictionary file is the EDICTEXT extension file, which contains further information about a selection of EDICT entries. Typically the EDICTEXT file contains a paragraph or two of further information, including examples of the use of the Japanese words or phrases. The EDICT file has the tag: "[qv]" appearing in the entry to indicate that there is further information available. It is possible to select and display information from the EDICTEXT file from within XJDIC, provided the appropriate EDICTEXT.XJDX index file is available. To display information from the EDICTEXT file, you need to invoke the appropriate mode by pressing "]", and cutting the kanji or kana head-word into the prompt. If there is an entry in the EDICTEXT file that matches the EDICT head-word, it will be displayed. (d) Multi-Radical Kanji Selection The multi-radical kanji selection system uses a massive file of kanji identified by all their radical components. This file was painstakingly prepared by Michael Raine in 1994/1995 with the intention of facilitating the selection of kanji by this technique. Michael's file, and the basic technique of identifying more than one radical per kanji has been used by Derc Yamasaki to add this function to JWP (from Version 1.2), and has been used also by Dan Crevier for his Unidict program (unreleased at the time of writing.) This technique is only available for the 6,355 JIS X 0208 kanji. Note that the "radicals" used in this classification of the kanji consist of most of the "classical" radicals, plus a number of other commonly-occurring elements. To use this technique effectively, familiarity with the radicals and elements is necessary. One method of operation is to run the "xjdrad" program, which is included in the XJDIC distribution, in another window. This program displays all the radicals and elements, and may be use as a source of the elements to click on and drop into the XJDIC prompt. Pressing "L" at the "KANJI LOOKUP TYPE:" prompt puts XJDIC into Radical Lookup Mode, and initiates the "Lookup Code:" prompt. The program stays in this mode until the user requests return to the normal mode by pressing "X". The items that can be entered at the "Lookup Code:" prompt are: (i) the "R" command, which triggers the display of the table of radicals. This table differs from the "classical" bushu table resulting from the "\r" command, in that it does not include all the classical radicals (some of which only occur rarely), and it includes some other common elements which are not classical radicals. As this table is rather large, users may prefer to have it permanently displayed in another window, and the "xjdrad.c" program will simply display the radicals for this purpose. (ii) a radical element. These may be selected from the table mentioned in (i) above. Each time a radical is entered, the program displays the current radicals in its search set, and the number of kanji which meet the progressive selection criteria. If the number of matching kanji does not exceed 20, those kanji are displayed. (iii) the "Dn" command, which tells the program to remove the nth radical from the search set. Each radical is preceded in the display by its number. (iv) the "Sn" command, which tells the program to restrict the search to kanji consisting of a certain number of strokes. "Sn" will restrict the search to kanji of exactly "n" strokes; "S+n" will restrict the search to kanji with a stroke-count greater than or equal to "n"; and "S-n" will restrict the search to kanji with a stroke-count less than or equal to "n". "S0" will restore the default condition, which is that stroke counts are ignored. (v) the "L" command, which tells the program to display all the kanji which currently match the search criteria, even if there are more than 20. (vi) the "C" command, which clears the set of search radicals. (vii) the "V" command, which enables the user to examine which radical elements are identified for a kanji. This command triggers a further prompt for the kanji to be examined. (viii) the "X" command, to request return to normal mode. Once the desired kanji is identified, the user will usually return to normal mode to examine that kanji, or to search for its compounds. E. EXITING To exit XJDIC, type Ctrl-D. Ctrl-C will work, but may leave echo turned off. Entering Ctrl-Z at the "SEARCH KEY:" prompt will cause the program to suspend. It may be resumed by typing "fg" at the Unix command-line prompt. (The program will also exit on the command "bye" to retain compatibility with earlier versions.) F. ON-LINE HELP Basic operating information can be obtained by typing "?". A summary of the command-line options can be obtained by invoking XJDIC with the "-h" option. The GNU Public Licence can be displayed by typing "!". G. ROMAJI-TO-KANA CONVERSION To enter a search key in kana, initiate it with either "@" (hiragana) or "#" (katakana), then type it in romaji and it will be converted to kana as you type. The romaji->kana translation is almost identical to that used in "front-end-processors" such as kinput, and MOKE and other Japanese word processors, i.e. for a small "tsu" you can type either a double consonant, e.g. "shippai", or "t-", e.g. shit-pai, and for "n" you can type n' if necessary (e.g. as in "hon'ya"). Most of the time just typing ordinary Hepburn or kunrei romaji works. Note that the romaji must follow the kana style for long vowels. Tokyo must be toukyou, NOT tookyoo. The actual romaji to kana conversions are specified in the file "romkana.cnv". This file provides the capability for inputting all the kana characters. It may, however, be edited if you want to add extra mappings, e.g. some of the modern katakana mora constructions. H. JAPANESE CODES Kterm can operate with the JIS, EUC or Shift-JIS code sets (as specified by the command-line, or by Ctrl-middle_mouse_button). XJDIC uses EUC internally and displays in (new) JIS, EUC or Shift-JIS. New-JIS is the default, and the others can be specified by command-line option or in the .xjdicrc file. It will accept input in any code type. In fact, XJDIC's operation is smoothest in JIS mode. This is because it detects the closing "shift-out" sequence which is present in this code, and immediately invokes the dictionary search. Thus it is possible to cut a string from a document being read, and initiate a dictionary scan, solely by using the mouse. (Entering a kana/kanji string in response to almost all of XJDIC's prompts will result in a dictionary search on that string.) Note that if you are using kanji from the JIS X 0212-1990 supplementary set, you must use an appropriate environment, such as the patched X11R6 kterm. In such an environment, only JIS and EUC coding is available, as Shift-JIS cannot represent the JIS X 0212 kanji. I. DICTIONARIES XJDIC depends for its performance on a number of dictionary files, typically one or more Japanese <-> English dictionaries and a Kanji dictionary. It has been designed to work with the EDICT dictionary, which is the author's extension of MOKE's EDICT, and the KANJIDIC character dictionary file, compiled by the author from various sources. EDICT has now over 100,000 entries, while KANJIDIC has an entry for each of the kanji in the JIS X 0208-1990 standard. (In addition there are a number of data files, including a file of radicals: RADICALS.TM, compiled by Theresa Martin for the earlier JDIC program; the ROMKANA.CNV file of romaji-kana mappings and the VCONJ file of verb inflections which were compiled by the author, the former partly from one of the .hlp files in MOKE.) The format each entry of EDICT is: Kanji [kana] /English_1/English_2/..../ or kana /English_1/English_2/..../ For full information about EDICT, see the edict.doc file. KANJIDIC is a compilation of information about each of the kanji in the JIS X 0208 standard. It has the format: Kanji hex_JIS_code Unnnn Bnnn Snn on_reading(s) kun_reading(s) {meaning(s)} where N, H, B, S and G flag the Nelson number, Halpern number, Bushu number, stroke count and (school) grade respectively. The Pn-n-n codes are Halpern's SKIP codes for finding kanji. On readings are in katakana and kun readings in hiragana. For full information about this file, see the kanjidic.doc file. J. MULTIPLE DICTIONARIES XJDIC has the option of handling multiple dictionary files. To use this option, the alternative dictionary files must be available with appropriate .xjdx files, and identified to XJDIC via the "-d" command- line option, or the "dicfile" lines in the .xjdicrc file. Note that if you are specifying additional dictionaries, you must tell XJDIC about *all* the dictionary files you are using, including EDICT, and you must provide the fully qualified path-names with the files. The multiple dictionary files can be accessed in the following manner: (a) by selecting one of the files by pressing the "=" key (which cycles front-wards through the available dictionaries), the "^" key which cycles backwards through the list, or the "_" key (which lists the dictionary files available, and asks the user to select one). The alternative dictionary files are searched and displayed in exactly the same way as the default EDICT dictionary. (b) by using the "global search" option. In this option, several dictionary files are examined during a search, and the longest match is reported, preceded by the dictionary number. The "$" command invokes a request for the dictionary file numbers to include in the global search, and the "%" command toggles the global search mode on and off. (The dictionary numbers are entered in a line with either spaces or commas between them.) When in global-search mode, there is another option invoked by the "`" command (single left quotation mark). This replaces the display of the longest match of all files, with the longest match from *each* file. The alternative dictionaries suitable for use with XJDIC include JDDICT (a Japanese-German file), EDICLSD3 (Life Sciences Dictionary), WSKTOK.DAT (reverse-henkan file of compounds and readings, but no English translations), LAWGLEDT (the University of Washington Law Glossary), COMPDIC (file of computing & telecommunications terms) and ENAMDICT (file of place and person names.) K. FILTERS Up to 10 sets of filters can be specified using "filt" lines in .xjdicrc. These allow the option of only displaying dictionary entries which contain, or do not contain certain text strings. There are three types of filters: (a) inclusion filters (Type 0). If one of these is active, only those entries which contain one of the specified text strings will be displayed. (b) exclusion filters (Type 1 & 2). If one or more of these is active, lines which contain the specified text strings will not be displayed. In the case of Type 2 filters, they only function if the dictionary entry has just ONE English entry. The format of the filter lines in xjdicrc is; filt f t on|off "filter name" string_1 string_2 .... where: f - the filter number (0 to 9) t - the filter type (0, 1 or 2) on|off - sets the initial state of the filter "filter name" - the " " delimited name of the filter, up to 50 characters long string_n - the space-separated strings which are to be matched as part of the filter operation. Up to 10 strings per filter, each up to 10 characters. Here are some sample filter entries: filt 0 2 "Suppress proper name entries" (pl, (pn pn) pl) [This filter, if activated, would prevent the display of entries which only relate to proper names.] filt 1 0 "Show only place names" (pl, pl) [This filter would enable XJDIC to be used as a place-name dictionary.] filt 2 1 "Suppress colloquialisms" (col) (col.) The ";" command initiates a dialogue in which individual filters to be activated or deactivated. Use caution when setting up filters, as their operation may make XJDIC examine many dictionary entries, resulting in a slow display of information. Note that once a filter condition has been met for a dictionary entry, no further testing is carried out for that entry. As mentioned above, it is possible to set or clear a "one-off" filter string which must be present for a line to be displayed. This is done with the "'" (single right quote) command. This string can be English, kana or kanji. Thus, for example, it is possible to search for compounds of two kanji, by setting one as the filter and searching for the other. This filter is effectively a Type 0 filter. L. LOGGING Users of the author's JREADER program will notice that XJDIC has no logging facilities. This is because the X11 environment makes logging possible via another window running an editor such as jstevie or nemacs against a log-file. JREADER also has a facility to look up kanji compounds which are not in EDICT in MOKE's Kanji->Kana file (WSKTOK.DAT). If you wish to have this capability in XJDIC, obtain the file WSKTOK.DAT and use it as an alternative dictionary. M. CONTROL FILE XJDIC uses a control file called ".xjdicrc". XJDIC will look for this file in the directory identified by the XJDIC environment variable, in the HOME directory, and finally in the current directory. Alternatively, a file-name can be specified in the "-c" command-line option. XJDIC will function quite well without a .xjdicrc file, but it is a useful way of setting various options, and it is the only way to set up search filters and to suppress the display of KANJIDIC fields. .xjdicrc contains lines of text which consist of: line_type The line_types are: [SA: Stand-alone, CL: Client, SV: Server] filt [SA,CL] set up filter details (see the FILTERS section) omode e|j|s [SA,CL] set the screen output codes to EUC, JIS or Shift-JIS kanamode [SA,CL] set the initial default input mode to hiragana exactmatch [SA,CL] turns the exact match option on at startup dicdir path_name [SA,SV,CL] set the location of the dictionary and data files. The program will try this directory first, followed by the local operating directory. Affects all files except the clipboard and the control file itself. Note that this line should occur *before* any dicfile, etc. lines. dicfile path_name [SA,SV] dictionary name (default: edict) kdicfile path_name [SA,SV] kanji dictionary name (default: kanjidic) romfile path_name [SA,CL] romaji conversion file (default: romkana.cnv) verbfile path_name [SA,CL] conjugation file (default: vconj) radfile path_name [SA,CL] radical/bushu no. file (default: radicals.tm) radkfile path_name [SA,CL] radical/kanji file for the multi-radical search (default: radkfile) jverb on|off [SA,CL] enable or disable the verb de-inflection function kdnoshow ABCDE... [SA,CL] declaration of the KANJIDIC fields to be suppressed from the display. For example, "kdnoshow YMQ" will prevent the display of the Pin-Yin information and the Four-Corner and Morohashi indices. exlist and from but .... .... declaration of common words of 3 or more letters to be excluded from the XJDXGEN generation of an .xjdx file. There can be more than one "exlist" line in the file. clipfile [SA,CL] specify the name of a clipboard file to use. gnufile [SA,CL] specify the name of GNU Public Licence file (default is "gnu_licence".) rvdisplay on | off [SA,CL] specify the initial setting of the reverse video display of matches. (Default is ON) Note that some of these are also command-line options. If both are used, the control-file request takes precedence. N. OTHER FILES Apart from the .xjdicrc control file, XJDIC requires five other files: radicals.tm - the list of bushu numbers and descriptive kanji, originally prepared by Theresa Martin for JDIC. romkana.cnv - the list of romaji to kana mappings used in the input conversion routines. vconj - the verb/adjective inflections used to identify the dictionary forms of words prior to lookup. radkfile - the file of radicals used in the multi-radical kanji search function, and the kanji matching each radical. kanjstroke - file of kanji and their stroke-counts, extracted from the kanjidic file. These five files are available free of charge, and can be modified by the user. Exercise extreme caution if you do change these files, particularly if you change the order of entries. O. INSTALLATION See the document XJDIC24.INSTALL for information on compiling the XJDIC program and setting up the dictionary files and index files. Note that there are two compilation options with XJDIC. You can operate it as a single stand-alone program, or as a client server pair. You can also specify whether the module that searches the dictionary files, i.e. the stand-alone program or the server, holds all the dictionary files and index files in RAM, uses memory-mapped I/O (default) or operates a demand-paging mechanism on these files. The former obviously takes more RAM and swap space, but will usually execute more quickly, whereas the latter will run more slowly but will coexist more easily with other programs and will run on smaller configurations. See XJDIC24.INSTALL for details of these options. Make sure you have the XJDIC executable in your path, and that the dictionary, index and radical files are in your current directory or in the places specified by the .xjdicrc file. P. AUTHOR'S COMMENT XJDIC began as a rework of my earlier JDIC/JREADER programs which were written for PCs or clones. Most of the code came from JREADER. It has since been extended, but generally XJDIC has been kept in step with equivalent releases of JDIC/JREADER. In producing XJDIC I have relied heavily on the Japanese environment such as is provided by kterm, with the result that XJDIC is smaller than either JDIC or JREADER. Also I took a different approach with the kanji dictionary. Whereas in JDIC/JREADER I use a compressed kanji dictionary file with separate index files for Nelson number, stroke count, yomikata, etc. (originally devised by Stephen Chung for his JWP Word Processor package), in XJDIC I have used the same indexing and lookup approach as with the main dictionary. XJDIC's output format is perhaps not quite as elegant as that in JDIC and JREADER, largely because it does not have as much control over essential aspects such as window and font size. This is more than compensated for by the inherent advantages of the windowing environment. XJDIC will not win any prizes for user-friendliness, as it is totally devoid of pop-up/pull-down/click-on-this-and-that features, and relies on the user using a slew of single-character commands which are mostly devoid of mnemonic attributes. There are a couple of reasons for this: (a) to implement a friendlier environment I would have had to program it in a GUI environment, which would have taken much more time and effort, and thus it probably never would have been finished. (b) I wanted to have a program that could be operated as simply as possible, with an absolute minimum of user interaction. I think it is quite successful in this respect, as I find one of my most common uses of it is the gloss Japanese text I am reading, which I can achieve without touching the keyboard at all. Even when I am carrying out other tasks such as searching for a kanji, I find the repertoire of single-character commands simple to use, and certainly economical of effort. My thanks to the many people who helped and gave advice to me, and particularly to Lars Huttar, Scott Trent, Philip Moore, Ken Lunde and the other XJDIC beta-testers for V1.0 and 1.1, and more recently Nate Bailey, Ben Bullock and Hank Cohen who tested V2.0, Michael Raine for the data that went in the "radkfile", plus those many people whose suggestions and critical comments have played a considerable part in the package's development. Cameron Blackwood helped me with the cbreak code, Paul Burchard provided the pure BSD versions of this, Hitoshi Doi (who ran it on the 64-bit DEC Alpha) pointed out my invalid assumption that long integers were invariably 4 bytes long, Hank Cohen showed me how to detect the window size. Much valuable help in later versions came from William Maton, who carried out very extensive testing, and suggested many performance improvements. I was greatly assisted in converting the code to operate in client/server mode by Comer & Steven's excellent "Internetworking with TCP/IP Vol III (BSD Sockets)" book. A special mention to Andrew Moore, my former Department's sysadmin, who laboured long and hard way back in 1992 to install wnn/kterm/kinput on our DEC5000/3000/2000 (Ultrix) network without knowing a word of Japanese. As this was possibly the first Ultrix installation of kterm/wnn outside Japan, it was quite an achievement. Times changed, and much of the V2.0 and later work was done on "marvin", my 486 at home running Linux. Linux's JE (Japanese Environment) runs out-of-the-box, and is a joy to use. V2.3 was finished off using Redhat Linux 5.0, which forced me to come to grips with a more POSIX environment. V2.4 was polished of on "hanako", an IBM Thinkpad T23 running RedHat 7.3. The source is now available to the world, subject to the GPL restrictions. It has successfully been installed on many Unix platforms. A highly successful Macintosh KanjiTalk port/rework has been undertaken by Dan Crevier to produce the popular MacJdic program which was recently placed in the top 100 Mac programs in Japan. As ever comments and constructive criticism are welcome. Q. REVISIONS (a) VERSION 1.1 The additions in Version 1.1 include: o the built-in romaji to kana code, which was in JDIC, but not included in the original XJDIC. o backspacing on the English, kana and kanji input lines. o the filter system* o the verb de-inflection function* o a more flexible kanji index selection o the ability to specify a stroke count/bushu combination o the .xjdicrc control file o the alternative dictionary option * these features also became available in V2.3 of JDIC & JREADER (b) VERSION 2.0 o the split between stand-alone & client/server operation o the Priority English keyword feature+ o the EDICT extension file support+ o the automatic detection of the screen size, and the folding of display lines o the one-shot filter facility o the short-form kanji display option o the "kdnoshow" feature to suppress unwanted KANJIDIC fields o recognizing Ctrl-Z and suspending, and Ctrl-D to exit o exact-match display mode o raw EDICT display mode. o the optional setting of kana input mode, and the "kanamode" directive. o extension of the "alternative dictionary" function to include up to 9 files. o words excluded from the index are now in the .xjdicrc file. + these features are also included in V2.5 of JDIC/JREADER (c) Version 2.1 o the compile-time option to use demand-paging of the dictionary and index files, instead of holding them all in RAM. This effectively introduced into xjdic the memory management used in JDIC/JREADER. o the multi-radical lookup technique for kanji, using Michael Raine's files. (d) Version 2.2 o the handling of kanji in the JIS X 0212-1990 set. These 5,801 kanji are coded in 3-byte EUC, so a few fiddles were needed to xjdic and xjdxgen. o the global search option. (e) Version 2.3 o integration of KANJD212 into the formal kanji dictionary o the "clipboard" option. (If you are curious, I added this option because for some unexplained reason Japanese text strings cut from Netscape [running on a Sun] cannot be pasted into a kterm window [under Ultrix]. To get around this, I run a simple program in an xterm window which copies any keystrokes into a "clipboard" file.) o reformatted display (this was done partly because I liked what I saw in Dan Crevier's Unidict, and partly because the existing code was a mess and needed reworking.) o scrolling *upwards* through the list of dictionaries. o better handling of the .xjdicrc file, and a "dicdir" directive to allow central location of the key files. o memory-mapped I/O as a compile option for the dictionary and index files. o inclusion of the dictionary file name in the prompt, and the numbers in the global search notification. o display of the GPL document. o the "man" page. (f) Version 2.4 o a few bugs fixed o expansion of the global search option to allow the report of the search for all files. o addition of the "exactmatch" startup option to the .xjdicrc file o re-instatement of the accidently dropped "kdnoshow" option. Jim Breen School of Computer Science & Software Engineering Monash University Melbourne, Australia (jwb@csse.monash.edu.au) May 2003 APPENDIX A - COMMAND SUMMARY (This Appendix contains a copy of the information displayed by xjdic as a result of the _?_ command.) XJDIC USAGE SUMMARY At the XJDIC SEARCH KEY: respond with a string of ASCII, kana and/or kanji to look up in the current dictionary (prefix with @ or # to invoke conversion of romaji to hiragana or katakana) SINGLE CHARACTER COMMANDS \ enter Kanji Dictionary mode ? get this Help display _ select dictionary files =/^ cycle up/down dictionary files ' set/clear one-off filter ; activate/deactivate general filters / toggle kanji_within_compound - toggle long kanji display on/off $ set global dictionaries % toggle global search mode on/off ] display Dictionary Extension : toggle verb deinflection on/off + toggle priority English keys | toggle unedited display mode on/off [ toggle exact_match on/off & toggle kana input mode on/off { switch to clipboard input } toggle reverse video of matches ` toggle multiple global disp. Ctrl-D to exit ! display gnu licence Ctrl-Z to suspend Kanji Dictionary mode - prompt is KANJI LOOKUP TYPE:. Responses: a single kanji or a kana reading (default) j followed by the 4-digit hexadecimal JIS code for a kanji j followed by k and the 4-digit KUTEN code for a kanji (precede code with `h' for JIS X 0212 kanji.) j followed by s and the 4-digit hexadecimal Shift-JIS code for a kanji m followed by an (English) kanji meaning c followed by an index code such as Nnnn (Nelson), Bnn (Bushu), etc r initiates a display of all radicals and their numbers l switches the program into the Radical Lookup mode APPENDIX B - XJDSERVER PROTOCOL INTRODUCTION This appendix explains the message protocol used by the client/server version of xjdic V2.0 and later. It is documented here in case any other software developer wants to develop client programs which call upon the dictionary file search facility provided by the server program (xjdserver). This narrative only describes the protocol. For a complete understanding, the reader must examine the code in the xjdserver.c and xjdclient.c modules. SERVER PROTOCOL OVERVIEW The xjdserver program is a stateless dictionary search engine. It retains no information whatsoever about previous requests or searches, and it is up to the client software to keep track of what it is about, and to provide all the details for each request. Each transaction by the server is triggered by a request message sent by a client. The server processes the request, and returns a response message. The messages in the xjdserver protocol are carried between the client and server via the UDP (User Datagram Protocol), which is one of the Internet protocols. The server uses the BSD Socket library, via which it maintains a passive UDP socket listening for requests on its port number. The default port number is 47512, but the installer can modify this, and both the client and server can select a port number by command-line parameter. The format of the REQUEST and RESPONSE messages is shown below. typedef struct { long xjdreq_checksum; short xjdreq_type; short xjdreq_seq; short xjdreq_dicno; long xjdreq_indexpos; short xjdreq_schlen; unsigned char xjdreq_schstr[21]; } REQ_PDU; typedef struct { long xjdrsp_checksum; short xjdrsp_type; short xjdrsp_seq; long xjdrsp_resindex; short xjdrsp_hitposn; short xjdrsp_reslen; long xjdrsp_dicloc; unsigned char xjdrsp_resstr[512]; } RSP_PDU; (All the short and long integer fields have their bytes in "network order.") The check-sum field consists simply of the arithmetic summation of all the fields in the message, except the check-sum itself. If the server receives a message with an incorrect check-sum, it is ignored. The sequence number field is returned to the client, thus uniquely identifying request/response message pairs. The Message Types, as defined in xjdic.h, are: #define XJ_FIND 1 /* find entry */ #define XJ_ENTRY 2 /* get this entry according to index */ #define XJ_OK 3 /* find/entry_get succeeded */ #define XJ_NBG 4 /* find/entry_get failed */ #define XJ_PROTE 5 /* protocol error - server only */ #define XJ_HULLO 6 /* just send back an XJ_OK */ #define XJ_GET 7 /* get this entry, wo checking any match*/ The XJD_HULLO message is typically used by a client at initialization to check if the server is available. On receipt of this message, the server will return an XJD_OK response. In this message it will return the number of dictionary files it has available in its xjdrsp_hitposn field, and in the xjdrsp_resstr string it will return the names of the dictionary files in the following format: #0file_name0#1file_name1#2........ The XJD_FIND instructs the server to find the entry in dictionary xjdreq_dicno which contains the *first* occurrence (in the ordered list of tokens) of the key identified by the initial xjdreq_schlen characters of the xjdreq_schstr string. If no match against the key can be found, the XJD_NBG message is returned. If a match is found, an XJD_OK message is returned with the first 511 characters of the entry in xjdrsp_resstr, the position of the key within the entry in xjdrsp_hitposn, and the index number of the entry in the .xjdx index file in xjdrsp_resindex. The XJD_ENTRY request is similar to the XJD_FIND request, except that it specifies in xjdreq_indexpos the index number of the entry it wants; typically 1 greater than the last entry returned. If the token associated with this entry matches the key, an XJD_OK message containing the entry is returned, and if not an XJD_NBG message is returned. Also, this call returns the character position of the entry in the dictionary in the xjdrsp_resindex field, to allow the client to suppress the display of entries with multiple matches. CLIENT PROTOCOL OVERVIEW As described above, the client sends requests to the server and receives responses. As the UDP protocol has no error handling, the client and server software must carry out this task. In the xjdserver protocol, as is almost invariably the case with stateless servers, most of the detection and recovery from communication errors is carried out by the client. In particular, the client must deal with the problems associated with the length of time it takes messages to traverse the network. In a local area network this will typically be a very short time, but may extend considerably if the client is using a congested wide-area network to communicate with the server. In the protocol described below, the client uses time-outs to detect if request or response messages have been lost or corrupted in the network. As the setting of too high a time-out value will result in a slow recovery from errors, and too short a time-out value will result in unnecessary retransmissions, the client protocol detects the round-trip delay of the request/response message pairs, and adjusts the time-out values accordingly. The basic error handling is performed as follows: (a) each message has a checksum, and each request/response pair has a unique sequence number. (b) if either the client or server receives a message with an invalid checksum, it ignores it. The server continues to wait for the next message, and the client reactivates its "select" socket call. Similarly, if the client receives a message with an incorrect sequence number, it is ignored. (c) when the client sends a request message, it waits for the return of the matching response message, or the expiry of a time-out. The time-out value is set initially to the time it took for the original socket-bind to be completed, or to one second, whichever is greater. (d) if the client times out while waiting for a response, it retransmits the request. After 10 consecutive timeouts, it asks the user if he/she wishes to continue. (e) if two consecutive time-outs occur, i.e. genuine timeouts, and not replies with bad checksums, the time-out value is doubled, with a maximum value of 30 seconds. Once the maximum is reached, the user is informed that the communication with the server appears to be lost, and waits for instruction to continue or exit. (f) each time a valid response message is received, the time-out value for the next request is set to two seconds longer than the time it took to obtain the response. The protocol described here was devised by the author, but is based on other protocols, e.g. NFS, which are associated with stateless servers and datagram communications. The retransmission time-out algorithm is crudely related to that employed in TCP and TP4. In August 1995 the client/server protocol was successfully tested between a client in Australia and a server in Canada, and vice versa. It worked reliably, albeit rather slowly, which is not too surprising given the round-trip delays. Other internation trials have been carried out at later dates. APPENDIX C - JIS X 0212-1990 KANJI From V2.2 on XJDIC supports, as an option, the additional kanji of the JIS X 0212-1990 standard. These notes are to assist users who which to utilize this option. To use JIS212 kanji, you need to operate XJDIC inside a kterm which has been modified to support this set. A special patch to the X11/R6 kterm is available which does this. The patch is available from several Japanese ftp sites. The .bdf font file for this character set is also required. This kterm version also supports Korean and Chinese codes, but will not support Japanese in Shift-JIS encoding. Internally XJDIC uses the EUC-3 coding to store and manipulate the JIS212 characters. this is a 3-byte code with the first byte as 0x8F. XJDXGEN has been modified to generate the correct indices for this code. As part of the general support for the JIS212 kanji, the KANJD212 file of kanji information has been prepared. This file is in the same format as the main JIS208 KANJIDIC file. Since V2.3, XJDIC's kanji dictionary function has been extended to support JIS212 kanji. To use it, concatenate the KANJIDIC and KANJD212 files into a single file, index it using XJDXGEN, and specify this larger file as the kanji dictionary file. In the display of kanji entries, JIS212 kanji have their JIS and Kuten codes prefixed by "1-". There is no Shift-JIS code for a JIS212 kanji. When selecting a JIS212 kanji using the JIS or Kuten codes, key an "h" before the code. A small EDICT-format dictionary file: EDICTH, has been released, which contains entries which contain JIS212 kanji. There are limited facilities for editing JIS212 kanji. I understand that MULE handles these kanji, although I cannot confirm this. I have modified the "jstevie" vi-clone to handle EUC-encoded files containing JIS212 kanji. At present I have no facilities for printing text with JIS212 kanji. xjdic24.WHATSNEW0100644000076400007640000000133407665056560011666 0ustar jwbjwb W H A T ' S N E W XJDIC V2.4 ========== These are just a few notes on changes introduced in V2.4 of xjdic. Make sure you read the xjdic24.install document, and preferably also the xjdic24.inf document before installing and running V2.4. These notes assume some familiarity with earlier versions of xjdic. In fact very little has changed in V2.4. A few bugs were fixed, and one new feature, namely the display of multiple results in a multi-dictionary lookup, was added. One bug-fix was to re-instate a feature that was accidently dropped out in the V2.2 -> V2.3 update. (Only one user noticed....) Jim Breen May 2003 xjdic23.WHATSNEW0100644000076400007640000000453606577753526011703 0ustar jwbjwb W H A T ' S N E W XJDIC V2.3 ========== These are just a few notes on changes introduced in V2.3 of xjdic. Make sure you read the xjdic23.install document, and preferably also the xjdic23.inf document before installing and running V2.3. These notes assume some familiarity with earlier versions of xjdic. V2.2 of xjdic was a relatively minor upgrade mainly to enable handling of the kanji of the JIS X 0212-1990 set, and to introduce the global (simultaneous) search of several dictionaries. V2.3 introduced further support for the JIS X 0212-1990 set by enabling single kanji dictionary to be used which contains both the JIS X 0208 and JIS X 0212 kanji. Also changed were the way in which dictionary, etc. files were handled, in particular by enabling the control-file to be specified in the command-line, and introducing the "dicdir" directory in the control-file to allow all the data and dictionary files to be in the one directory. A *real* man page is included for the first time. Some other minor features were introduced: - upward stepping of dictionary files - the clipboard option. - memory-mapped I/O as a compile option. The layout of the dictionary display was also revised, and the Help screen redesigned. Some bugs which were impeding operation on some platforms were removed. The key points of introduced in V2.3 are: A. Adjusting the (kanjidic) kanji dictionary support so that it can operate on a file containing *both* the KANJIDIC and KANJD212 files. B. Reformatting the output display, so that the matched key appears in reverse video instead of being extracted to the front of the line. C. Allowing the set of dictionaries to be stepped through backwards instead of just forwards. D. Introducing the "clipboard" option in which search keys come from a file. E. Reformatted "help" page. F. control-file (.xjdicrc) location on command-line G. directive in the control file to locate dictionary & data files. H. Compile-time option of enabling memory-mapped I/O, as well as the previous built-in demand-paged method. I. Some bug fixes, particularly removing the problem of segfaults with some libraries when there was no .xjdicrc file. J. A "man" page has been developed from the .inf file. Jim Breen September 1998 xjdic22.WHATSNEW0100644000076400007640000001156406534252622011661 0ustar jwbjwb W H A T ' S N E W XJDIC V2.2 ========== These are just a few notes on changes introduced in V2.0, 2.1 & 2.2 of xjdic. Make sure you read the xjdic22.install document, and preferably also the xjdic22.doc document before installing and running V2.2. These notes assume some familiarity with V1.0 and/or V1.1 of xjdic. V2.2 of xjdic is a relatively minor upgrade mainly to enable handling of the kanji of the JIS X 0212-1990 set, and to introduce the global (simultaneous) search of several dictionaries. The key points of introduced in V2.0 to 2.2 are: A. A slightly better distribution format, with a makefile and an expanded installation guide. B. compile-time options to produce either a single stand-alone program (as was the case with V1.0 and 1.1) or a client/server pair. The client/server option is very useful if several users on the one site use xjdic. C. User definable filter. The _'_ key triggers a request for a string which will be used as a filter for all following dictionary searches. Only entries which contain that string will be displayed. The string can be kanji, kana or ASCII. Pressing _'_ again clears the filter. D. Field suppression in kanjidic displays. The "kdnoshow" directive in the .xjdicrc file enables selected fields in kanjidic to be supressed. My .xjdicrc contains: kdnoshow YELUQMKZ, as I rarely need to see these fields. E. Priority Fields for ASCII (English) search keys. This is part of a longer-range project to make JDIC/xjdic more useful as a E->J dictionary. I am planning to prepend the most important English words in a selection of main entries in EDICT with a "@" character, e.g. "UCHI [uchi] /@house/" _+_ toggles the English search between all_strings and priority_ strings_only. "priority" words will display in reverse video. F. Short-form kanji display. The "-" command toggles a short-form kanji display mode on and off. When in the short-form mode, a kanji search which results in more than one match will produce a display of just the kanji that match, without any of the other details. This appears as a block of kanji, sorted by stroke count and bushu. If only one kanji matches the search criterion, the long-form display results. G. Automatic Window-size detection xjdic now detects the number of rows and columns available in the kterm/xterm window, and stops a multi-line display before it exceeds a complete screen-full. It will prompt for continuation of the display. It now also folds long lines on a white-space between words. H. Raw EDICT display mode The _|_ command toggles the "raw output" mode. In this mode, the EDICT entries are displayed without any reformatting. This mode is particularly useful when one is preparing corrections and updates for the EDICT file. I. The EDICT Extension File. This release of xjdic supports access to the EDICT Extension file. The _]_ command triggers a prompt for the desired keyword for for the Extension file, and xjdic will then display the matching Extension entry. J. Exact Match mode Normally xjdic displays the best possible matches with the search key, starting with the longest. The _[_ command toggles on and off an "exact match" mode, which will force the display to show only those entries which fully match the search key. K. Multiple Dictionary files. The feature introduced in V1.1 enabling an alternative dictionary has been replaced with the capability od having up to 9 dictionary files. The "=" command now cycles around the available dictionaries, and the new "_" command prompts for a dictionary selection. L. Extra Bushu Option. It is now possible to cut a kanji from the "\r" bushu display into the "\cb" prompt, instead of typing the bushu number. M. Exclusion Words The list of words for exlusion from the index is now in the .xjdicrc file. N. Kana Input Mode It is now possible to make hiragana to default input mode. The "kanamode" directive in the .xjdicrc file makes xjdic start in this mode, and the _&_ command taggles it on and off. O. Ctrl-Z & Ctrl-D The program now responds to Ctrl-Z (suspend) and Ctrl-D (exit) commands. The former "bye" command is still supported. P. Demand-Paging The compile time option of using demand-paging of the dictionary & index files instead of holding them in RAM. Q. Multi-Radical Kanji Selection Michael Raines' wonderful multi-radical kanji selection system. R. JIS X 0212-1990 Support Support for the additional 5,801 kanji in the JIS X 0212-1990 standard. S. Global Searches Facility to request a search of several dictionary files. Jim Breen June 1996 xjdic24.install0100644000076400007640000002715107665051605012074 0ustar jwbjwbX J D I C V2.4 INSTALLATION GUIDE INTRODUCTION xjdic is an electronic Japanese-English dictionary program designed to operate in a windowed environment with Japanese font support, such as X11 with kterm/kinput2. It is based on JDIC & JREADER which were developed to run under MS-DOS on IBM PCs or clones. Starting with V2.2, xjdic supports kanji from the JIS X 0212-1990 set. To handle these kanji, you will need a suitable environment, such as kterm 6.2.2. See the document xjdic24.inf for general information. DISTRIBUTION The xjdic distribution is in the file xjdic24.tar.gz (or xjdic24.tgz). This contains: .xjdicrc.skel Makefile xjdic24.inf xjdic24.WHATSNEW xjdic23.WHATSNEW xjdic22.WHATSNEW xjdic24.install xjdic.h xjdclient.c xjdcomm.c xjdfrontend.c xjdsa.c xjdservcomm.c xjdserver.c xjdxgen.c exjdxgen.c xjdrad.c makekanjstroke.c vconj romkana.cnv radicals.tm radkfile kanjstroke gnu_licence xjdic.1 In addition, you will need to obtain the Japanese/English and Kanji dictionary files (edict and kanjidic). These are distributed separately as they are continuously being updated. The master distribution site is the ftp directory /pub/nihongo on ftp.cc.monash.edu.au, but there are also mirrors in several other countries. You can also obtain other dictionary files such as: enamdict (Japanese names), compdic (computing & telecomms terms), ediclsd3 (bio-medical terms), etc, etc. If you are using the supplementary kanji from the JIS X 0212-1990 set, you may like to obtain the kanjd212 file. It can be used by adding its information to the kanjidic file, making a single large file. (I do this and call the combined file "kanjidic_b".) There is no directory structure included with the programs on the xjdic24.tar file, as it is left up to users how this aspect of the installation is to proceed. Some users install the xjdic binaries locally, e.g. on ~/bin, while others have them installed more centrally, e.g. in /usr/local/bin. INSTALLATION PROCEDURE xjdic V2.4 can operate as a single, stand-alone program, or as a client/server pair. (The stand-alone version requires the installation of the whole distribution, whereas the client accesses the dictionary information from the server in the client/server version.) The module that searches the dictionary files, i.e. the stand-alone program or the server, can operate holding all the files in RAM, use memory-mapped i/o, or can use a dynamic demand-paging system. The following procedure describes the most simple installation, suitable for a user installing the package for personal use. (a) create a directory for holding the xjdic files, e.g. "mkdir xjdic" (b) decompress and untar the files from the archive. For example the following may be used: gzip -d xjdic24.tar.gz tar xvf xjdic24.tar (c) choose where you are going to locate the dictionary and data files. (I use a directory called "dics" for this.) (d) obtain and decompress at least the EDICT and KANJIDIC files in the data directory. Move the gnu_licence, radicals.tm, vconj, kanjstroke, radkfile and romkana.cnv files to the same directory. You may also add to this directory any other dictionary files, such as the ENAMDICT and COMPDIC. (e) make any modifications necessary to the compilation settings in the makefile. The comments in the file itself indicate some of these options. As distributed, the software should be suitable for most Unix variants. (f) create the binaries as follows: make stand (stand-alone version. If you are going to use the client/server version, you need to do "make client" and "make server" instead.) make xjdxgen (program to index the dictionary files) make clean (removes the compilation object files) (You can use the GNU compiler by invoking gmake instead of make, or by running make with the "CC=gcc" command-line option.) This will have created the binary program files "xjdxgen" and either "xjdic_sa" or the "xjdic_cl" and "xjdserver" pair. Depending on whether you wish to run a stand-alone version, or the client/server version, rename either "xjdic_sa" or "xjdic_cl" simply "xjdic". (g) arrange for the binary files to be accessed for execution. This could mean: (i) moving them to a directory like ~/bin. If you are (ii) placing symbolic links to the files in the current directory (iii) executing them directly in the current directory. (h) create the .xjdx index files for the dictionary files: xjdxgen /pathname/edict xjdxgen /pathname/kanjidic etc. xjdxgen has a single command-line argument: the name of the dictionary file for which it is generating an index. It defaults to "edict". (i) create a .xjdicrc file according to taste. This may have entries designating the identities and locations of the dictionary and data files. Perhaps the best option is to set the "dicdir" directive pointing at the location of your dictionary and data files (I have the line "dicdir dics" for this purpose.) A sample file, .xjdicrc.skel is included in the distribution. (j) if the user(s) want to have the facility to match against dictionary entries which do not yet have English translations, obtain the wsktok.Z file, unpack it to get the wsktok.dat file. Run xjdxgen to produce wsktok.dat.xjdx, and specify it as the alternative dictionary, either in the command line, or in the .xjdicrc file. (k) copy the "man" page (xjdic.1) to /usr/man/man1 or wherever your system has such files. That is about it. If you have trouble with the compilation, feel free to fiddle with the code (sorry about the relative lack of comments), and send me details of what you had to do. Don't be too critical of the program: it shows a lot of scars from its port from the MS-DOS/Borland Graphics original, and I wrote while I was still teaching myself C. CLIENT/SERVER OPTION In the client/server option, the dictionary search software is operated in a separate program which operates in the background as a daemon. The user-oriented front-end functions are in a separate client program which communicates with the server using the UDP/IP Internet communications protocols. Thus it is possible to have the client and server programs on different machines, even (the mind boggles) in different countries. A typical use of the client/server mode of operation is when there are several xjdic users in the one organization, as it saves having to run the large dictionary-search process on more than one workstation. Compilation of the client and server programs is achieved by: make client make server make clean The same UDP port number must be used by both programs. The default is 47512 (the author's DOB), but another default can be set in the xjdic.h file. Alternatively the port number can be set in the .xjdicrc file or on the command-line. The same .xjdicrc file can be used by both the client and server programs, although the installer may want to have separate versions. The main special directive is the "server" specification, e.g. server daneel.dgs.monash.edu.au which must be in the .xjdic file used by the client to tell it the host address of the server. If this is not present, it defaults to "localhost". DICTIONARY ACCESS METHOD There is a compilation-time option to specify whether the module that searches the dictionary files, i.e. the stand-alone program or the server: (a) holding all the dictionary files and index files in RAM; (b) operating a demand-paging mechanism on these files; (c) accessing the files directly using memory-mapped I/O. The first obviously takes more RAM and swap space, but will usually execute more quickly on a system with plenty of RAM, whereas the latter two may run more slowly but will coexist more easily with other programs and will run on smaller configurations. The demand-paging method was the default until V2.3, when memory-mapped became the dafault. With demand-paging, the size of the page buffers (VBUFFSIZE default 4096) and the number of page buffers (NOVB default 1000) set in the xjdic.h file. To modify either of these, amend the #define lines in that file. To turn off demand-paging, compile without the -DDEMAND_PAGING option in the Makefile. XJDXGEN xjdxgen is a utility program that parses the dictionary file and produces a file .xjdx containing the index table (see below). If you make any changes to the dictionary, you must run xjdxgen before operating xjdic again. xjdxgen stores the length of the dictionary file and the xjdic version in the .xjdx file, and if xjdic detects a mismatch, it will refuse to operate. This ensures that xjdxgen is run every time the dictionary is modified. The index table generated by xjdxgen contains a long integer entry marking the starting byte of each "word" in the dictionary, and is sorted in alpha/kana/JIS order of the "words" indexed. This enables a fast binary search to be done, and for the display to be in alphabetical/etc. order by keyword. The "words" indexed by xjdxgen are defined as any sequence of one or more kana characters, any occurrence of a kanji character or any sequence of three or more ascii alphabetic or numeric characters. Common words like: "of", "to", "the", etc. and grammatical terms like: "adj", "vi", "vt", etc. are not indexed. Words encapsulated in braces ({...}) are not indexed either. XJDRAD The xjdrad.c program is available for users who wish to maintain a display in a seperate window of the radicals used in the multi-radical kanji lookup sub-system. MAKEKANJSTROKE Supplied with the distribution is the "kanjstroke" file, which is an extract from the master KANJIDIC file of the stroke-counts. It is used in conjunction with the multi-radical kanji lookup sub-system. The makekanjstroke.c program is also supplied in case a user wishes to regenerate the "kanjstroke" file. Jim Breen School of Computer Science & Software Engineering Monash University Melbourne, Australia (jwb@csse.monash.edu.au) May 2003 APPENDIX - MODULE & FILE MAP The following is a map of the modules in the various binaries; STAND-ALONE CLIENT SERVER xjdic.h Y Y Y xjdfrontend.c Y Y N xjdsa.c Y N N xjdcomm.c (xjdicrc & stringcomp) Y Y Y xjdservcomm.c (DicSet, dbchar, etc) Y N Y xjdserver.c N N Y xjdclient.c N Y N and the following indicates which files are needed at run-time. STAND-ALONE CLIENT SERVER .xjdicrc Y Y Y edict, edict.xjdx (& others) Y N Y kanjidic, kanjidic.xjdx Y N Y romkana.cnv Y Y N radicals.tm Y Y N vconj Y Y N radkfile Y Y N kanjstroke Y Y N clipboard Y Y N edictext, edictext.xjdx (*) Y Y N (* this file is not yet available.) gnu_licence Y Y N xjdic.h0100644000076400007640000000430107665047425010504 0ustar jwbjwb#define MAXLINES 24 /* default lines per display */ #define MAXCOLS 80 /* default cols per display */ #define NRKANA 250*2 /* size of the romaji to kana tables*/ #define NOFILT 10 /* maximum number of general filters */ #define VMAX 350 /* maximum entries in the verb table */ #define DEFAULT_DICDIR "" /* could be: "/usr/local/lib/xjdic" */ #define NOHITS 1000 /* size of hittab */ #define SPTAG '@' /* character that flags priority entries */ #define KFBUFFSIZE 2000 /* size of the KFlush buffer */ #define KANJARRAYSIZE 2000 /* size of the kanji sorting array */ #define SVER "2.4" #define TINITVAL 2 #define TMAXVAL 30 #define TMAXREP 1 #define VBUFFSIZE 4096 /* size in bytes for each virtual buffer */ #define NOVB 1000 /* maximum number of virtual buffers */ #define RADPERLINE 20 /* No of radicals to display per line */ #define RADLOOKLIM 2*20 /*threshold for displaying results of radical lookup (default 20) */ #define MAXITER 40 /*maximum binary search iterations*/ /* The following is for Solarises */ #ifndef SEEK_END #define SEEK_END 2 #endif #ifndef SEEK_SET #define SEEK_SET 0 #endif #ifndef INADDR_NONE #define INADDR_NONE -1 #endif #define TRUE 1 #define FALSE 0 /* type fields for PDUs and server calls */ #define XJ_FIND 1 /* find entry */ #define XJ_ENTRY 2 /* get this entry according to index */ #define XJ_OK 3 /* find/entry_get succeeded */ #define XJ_NBG 4 /* find/entry_get failed */ #define XJ_PROTERR 5 /* protocol error - server only */ #define XJ_HULLO 6 /* just send back an XJ_OK and # dics */ #define XJ_GET 7 /* get this entry, wo checking any match*/ #define XJ_PORTNO 47512 /* server's "well-known" port no */ /* PDU structures */ typedef struct { long xjdreq_checksum; short xjdreq_type; short xjdreq_seq; short xjdreq_dicno; long xjdreq_indexpos; short xjdreq_schlen; unsigned char xjdreq_schstr[21]; } REQ_PDU; typedef struct { long xjdrsp_checksum; short xjdrsp_type; short xjdrsp_seq; long xjdrsp_resindex; short xjdrsp_hitposn; short xjdrsp_reslen; long xjdrsp_dicloc; unsigned char xjdrsp_resstr[512]; } RSP_PDU; xjdclient.c0100644000076400007640000002101606572500570011353 0ustar jwbjwb/************************************************************************** * X J D C L I E N T * * * Code for Interfacing the Client with the server * * Japanese-English Dictionary program (X11 version) * * Author: Jim Breen * ***************************************************************************/ /* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* for Solaris 2.5, which doesn't have INADDR_NONE in its */ #ifdef SOLARIS #define INADDR_NONE -1 #endif #include #include #include #include #include #include #include #include #include #include #include #include #include "xjdic.h" #define CVERBOSE 0 int chk_cnt=0; extern int errno; unsigned char host[51] = {"localhost"}; unsigned char yn[2]; unsigned int portno = XJ_PORTNO; char protocol[4] = {"udp"}; int s, elapse; struct timeval timeout; int txno = 0; REQ_PDU pdu_out; RSP_PDU pdu_in; int pduseq = 0; int curr_timer = TINITVAL; int rep_count; struct timezone tz; long timeofday_st,timeofday_en; fd_set fildesc; int nfds; unsigned char *sptr; int NoDics,CurrDic; char Dnamet[10][100]; void xjdserver (int type, int dic_no, long index_posn, int sch_str_len, unsigned char *sch_str, int *sch_resp, long *res_index, int *hit_posn, int *res_len, unsigned char *res_str, long *dic_loc ); void DicSet(); int connectsock(int portno, char *host); void reqchecksum(); int respchecksum(); void DicSet() { /* In the Client version, DicSet() establishes the connection with the server. */ int i,schresp, dumint, trying,hullodic; long dumlong,dumlong0 = 0; char dummy[2],dnamelist[512]; connectsock(portno, host); nfds = getdtablesize(); FD_SET(s, &fildesc); trying = TRUE; while (trying) { xjdserver(XJ_HULLO, 0, dumlong0, 0, dummy, &schresp, &dumlong, &hullodic, &dumint, dnamelist, &dumlong); if (schresp == XJ_OK) { printf("Server: %s detected\n", host); NoDics = hullodic; sptr = strtok(dnamelist,"#"); while (sptr != NULL) { i = sptr[0] - '0'; if (i <= NoDics) { strcpy(Dnamet[i],sptr+1); printf ("Dictionary: %d [%s]\n",i,Dnamet[i]); } sptr = strtok(NULL,"#"); } CurrDic = 1; return; } printf("Server not responding.(%d) Try again? (y/n)",schresp); scanf("%c",dummy); printf("\n"); if ((dummy[0] | 0x20) == 'n') exit(1); } } int connectsock(int portno, char *host) { struct protoent *ppe; struct hostent *phe; struct sockaddr_in sin; bzero((char *)&sin, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(portno); if (phe = gethostbyname(host)) bcopy(phe->h_addr, (char *)&sin.sin_addr, phe->h_length); else if ((sin.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE) { printf ("Cannot Get Host Entry!!\n"); exit(1); } if ((ppe = getprotobyname("udp")) == 0) { printf ("Cannot set up UDP!!\n"); exit(1); } s = socket(PF_INET, SOCK_DGRAM, ppe->p_proto); if (s < 0) { printf ("Cannot create socket!!: %s\n",strerror(errno)); exit(1); } if (connect (s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { printf ("Cannot connect to host: %s, port: %d\n",host,portno); exit(1); } return (s); } int respchecksum() { long temp; int i; char yn[5]; if (CVERBOSE) printf("PDU: %d %d %d %d %d %d %s %d\n", ntohs(pdu_in.xjdrsp_type), ntohs(pdu_in.xjdrsp_seq), ntohl(pdu_in.xjdrsp_resindex), ntohl(pdu_in.xjdrsp_dicloc), ntohs(pdu_in.xjdrsp_hitposn), ntohs(pdu_in.xjdrsp_reslen), pdu_in.xjdrsp_resstr, ntohl(pdu_in.xjdrsp_checksum)); temp = ntohs(pdu_in.xjdrsp_type); temp+= ntohs(pdu_in.xjdrsp_seq); temp+= ntohl(pdu_in.xjdrsp_resindex); temp+= ntohl(pdu_in.xjdrsp_dicloc); temp+= ntohs(pdu_in.xjdrsp_hitposn); temp+= ntohs(pdu_in.xjdrsp_reslen); for (i = 0; i < strlen(pdu_in.xjdrsp_resstr); i++) temp+= pdu_in.xjdrsp_resstr[i]; if (ntohl(pdu_in.xjdrsp_checksum) == temp) { chk_cnt = 0; return (TRUE); } if (CVERBOSE) printf("Cal checksum: %d PDU checksum: %d\n",temp,ntohl(pdu_in.xjdrsp_checksum)); if (chk_cnt++ > 20) { printf("20 consecutive checksum failures: Try again? "); scanf("%s",&yn); printf("\n"); if((yn[0] | 0x20) == 'y') { chk_cnt = 0; return(FALSE); } else { exit(1); } } return (FALSE); } void reqchecksum() { long temp; int i; temp = ntohs(pdu_out.xjdreq_type); temp+= ntohs(pdu_out.xjdreq_seq); temp+= ntohs(pdu_out.xjdreq_dicno); temp+= ntohl(pdu_out.xjdreq_indexpos); temp+= ntohs(pdu_out.xjdreq_schlen); for (i = 0; i < strlen(pdu_out.xjdreq_schstr); i++) temp+= pdu_out.xjdreq_schstr[i]; pdu_out.xjdreq_checksum = htonl(temp); } void xjdserver (int type, int dic_no, long index_posn, int sch_str_len, unsigned char *sch_str, int *sch_resp, long *res_index, int *hit_posn, int *res_len, unsigned char *res_str, long *dic_loc ) { int i, ares, sendit; gettimeofday((struct timeval *)&timeout,(struct timezone *)&tz); timeofday_st = timeout.tv_sec; pdu_out.xjdreq_type = htons(type); pdu_out.xjdreq_seq = htons(++pduseq); pdu_out.xjdreq_dicno = htons(dic_no); pdu_out.xjdreq_indexpos = htonl(index_posn); pdu_out.xjdreq_schlen = htons(sch_str_len); strcpy(pdu_out.xjdreq_schstr,sch_str); reqchecksum(); sendit = TRUE; while (TRUE) { timeout.tv_sec = curr_timer; timeout.tv_usec = 0; if (sendit) { txno++; (void) write (s, &pdu_out,sizeof(REQ_PDU)); if (CVERBOSE) printf("txno %d (seq: %d)\n",txno,pduseq); } if ((ares = select(nfds, &fildesc, (fd_set *)0, (fd_set *)0, (struct timeval *)&timeout) )< 0) { printf("Select error: %s\n", strerror(errno)); exit(1); } sendit = TRUE; if (ares == 0) { if (CVERBOSE) printf("Timeout: %d secs (seq: %d)\n",curr_timer,pduseq); FD_SET(s, &fildesc); if (rep_count < TMAXREP) { rep_count++; continue; } else { if (curr_timer >= TMAXVAL) { rep_count = 0; printf("Cannot contact Server: %s Try again? ",host); scanf("%s",&yn); printf("\n"); if((yn[0] | 0x20) == 'y') { curr_timer = TINITVAL; continue; } else { exit(1); } } else { curr_timer*=2; rep_count = 0; continue; } } } if (CVERBOSE) printf("Something in!\n"); gettimeofday((struct timeval *)&timeout,(struct timezone *)&tz); timeofday_en = timeout.tv_sec; elapse = timeofday_en - timeofday_st; if (elapse < 1) elapse = 1; if (elapse > curr_timer) { curr_timer = elapse << 1; } else { if (curr_timer - elapse > 2) curr_timer = elapse+2; } if (recv(s, &pdu_in, sizeof(RSP_PDU), 0) < 0) { if (errno == 111) { printf("Cannot contact Server: %s Try again?\n",host); scanf("%s",&yn); if((yn[0] | 0x20) == 'y') { continue; } else { exit(1); } } printf("UDP recv error: %d %s\n",errno,strerror(errno)); exit(1); } if (!respchecksum()) { if (CVERBOSE) printf("PDU checksum error (seq: %d)\n",pduseq); continue; } if (ntohs(pdu_in.xjdrsp_seq) != pduseq) { if (CVERBOSE) printf("PDU sequence error. Rec: %d Exp: %d\n",ntohs(pdu_in.xjdrsp_seq),pduseq); sendit = FALSE; continue; } if (CVERBOSE) printf("Valid PDU: %d %ld %d %d\n",ntohs(pdu_in.xjdrsp_type), ntohl(pdu_in.xjdrsp_resindex), ntohs(pdu_in.xjdrsp_hitposn), ntohs(pdu_in.xjdrsp_reslen)); *sch_resp = ntohs(pdu_in.xjdrsp_type); *res_index = ntohl(pdu_in.xjdrsp_resindex); *hit_posn = ntohs(pdu_in.xjdrsp_hitposn); *res_len = ntohs(pdu_in.xjdrsp_reslen); *dic_loc = ntohl(pdu_in.xjdrsp_dicloc); for (i = 0; i < *res_len; i++) { res_str[i] = pdu_in.xjdrsp_resstr[i]; res_str[i+1] = 0; } return; } } xjdcomm.c0100644000076400007640000002717007665046177011053 0ustar jwbjwb/************************************************************************** * X J D C O M M * * some common routines * * Japanese-English Dictionary program (X11 version) * * Author: Jim Breen * ***************************************************************************/ /* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include #include #include #include #ifdef MMAP #include #endif #include "xjdic.h" #define FALSE 0 #define TRUE 1 #ifdef XJDCLSERV extern int portno; extern unsigned char host[]; #endif extern unsigned char Dnamet[10][100]; int stringcomp(unsigned char *s1, unsigned char *s2); struct stat buf; #ifdef MMAP /*+++++++++ xopen +++ does a open, but tries the dicdir first +++*/ /* xopen generalizes the dictionary and other file opening, by: trying the "dicdir", and then current directories returning the file length as well as the pointer to FILE Note that it is read-only. */ int xopen(char *file_name, int *xfilelen) { int fx; extern char DicDir[]; char *fnbuff; fnbuff = (char *)malloc(strlen(DicDir) + strlen(file_name)+10); if (fnbuff == NULL) { printf("malloc failure opening: %s\n",file_name); exit(1); } strcpy(fnbuff,DicDir); if (fnbuff[strlen(fnbuff)-1] != '/') strcat (fnbuff,"/"); strcat(fnbuff,file_name); fx = open(fnbuff,O_RDONLY); if (fx >= 0) { if(stat(fnbuff, &buf) != 0) { printf ("Stat() error (l)for %s [%s]\n",fnbuff,strerror(errno)); exit(1); } *xfilelen = (buf.st_size); free(fnbuff); return(fx); } fx = open(file_name,O_RDONLY); if (fx >= 0) { if(stat(file_name, &buf) != 0) { printf ("Stat() error (s) for %s [%s]\n",file_name,strerror(errno)); exit(1); } *xfilelen = buf.st_size; return(fx); } printf("Unable to open: %s\n",file_name); exit(1); } #endif /*+++++++++ xfopen +++ does a fopen, but tries the dicdir first +++*/ /* xfopen generalizes the dictionary and other file opening, by: trying the "dicdir", and then current directories returning the file length as well as the pointer to FILE */ FILE *xfopen(char *file_name, char *file_mode, int *xfilelen) { FILE *fx, *fopen(); extern char DicDir[]; char *fnbuff; /* printf ("XFOPEN: fn=%s mode=%s stream_p=%p\n",file_name,file_mode,fx); */ fnbuff = (char *)malloc(strlen(DicDir) + strlen(file_name)+10); if (fnbuff == NULL) { printf("malloc failure opening: %s\n",file_name); exit(1); } strcpy(fnbuff,DicDir); if (fnbuff[strlen(fnbuff)-1] != '/') strcat (fnbuff,"/"); strcat(fnbuff,file_name); fx = fopen(fnbuff,file_mode); if (fx != NULL) { if(stat(fnbuff, &buf) != 0) { printf ("Stat() error (l)for %s [%s]\n",fnbuff,strerror(errno)); exit(1); } *xfilelen = (buf.st_size); free(fnbuff); /* printf ("XFOPEN: stream_p=%p addr = %p\n",fx,&fx); */ return(fx); } fx = fopen(file_name,file_mode); if (fx != NULL) { if(stat(file_name, &buf) != 0) { printf ("Stat() error (s) for %s [%s]\n",file_name,strerror(errno)); exit(1); } *xfilelen = buf.st_size; /* printf ("XFOPEN: stream_p=%p addr = %p\n",fx,&fx); */ return(fx); } printf("Unable to open: %s\n",file_name); exit(1); } /*=========DicName====returns name of dictionary================*/ unsigned char *DicName(int dn) { register unsigned char *dp,*dp2; dp = Dnamet[dn]; if((dp2 = strrchr(dp,'/')) == NULL) return(dp); return (dp2+1); } /*=====xjdicrc - access and analyze "xjdicrc" file (if any)==============*/ void xjdicrc() { unsigned char xjdicdir[128],rcstr[80],*rcwd; int ft,fn; extern int thisdic; extern char DicDir[]; FILE *fm,*fopen(); #ifdef XJDDIC extern unsigned char Dnamet[10][100],XJDXnamet[10][100]; extern unsigned char *dicbufft[10]; extern unsigned long diclent[10], indkent[10],indptrt[10]; extern int NoDics; #endif extern unsigned char ENVname[], KDNSlist[]; extern unsigned char EXTJDXname[], EXTname[], Rname[], Vname[], ROMname[]; extern unsigned char RKname[]; extern unsigned char filtnames[NOFILT][50],filtcodes[NOFILT][10][10]; extern int Omode, Jverb, nofilts, filtact[], filtcoden[], filttype[], filton[]; extern int RVACTIVE; extern unsigned char cl_rcfile[]; #ifdef XJDFRONTEND extern unsigned char GPL_File[]; extern unsigned char Clip_File[]; extern int KImode; #endif strcpy(DicDir,ENVname); /* added by nakahara@debian.org */ while(TRUE) { if (strlen(cl_rcfile) > 0) { fm = fopen(cl_rcfile,"r"); if (fm != NULL) break; else { printf("Control file: %s cannot be accessed!\n",cl_rcfile); } } xjdicdir[0] = '\0'; if (strlen(ENVname) > 2) { strcpy(xjdicdir,ENVname); strcat(xjdicdir,"/"); } else { strcpy(xjdicdir,getenv("HOME")); strcat(xjdicdir,"/"); } strcat(xjdicdir,".xjdicrc"); fm = fopen(xjdicdir,"r"); if (fm != NULL) break; strcpy(xjdicdir,".xjdicrc"); fm = fopen(xjdicdir,"r"); if (fm != NULL) break; if (getenv("HOME") != NULL) { strcpy(xjdicdir,getenv("HOME")); strcat(xjdicdir,"/"); strcat(xjdicdir,".xjdicrc"); fm = fopen(xjdicdir,"r"); if (fm != NULL) break; } printf("No control file detected!\n"); return; } if (fm != NULL) { while(fgets(rcstr,79,fm) != NULL) { rcwd = (unsigned char *)strtok(rcstr," \t"); /* dicdir works for all modes */ if( stringcomp((unsigned char *)"dicdir",rcwd) == 0) { rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); strcpy(DicDir,rcwd); continue; } #ifdef XJDCLSERV if( stringcomp((unsigned char *)"port",rcwd) == 0) { rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); portno = atoi(rcwd); continue; } if( stringcomp((unsigned char *)"server",rcwd) == 0) { rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); strcpy(host,rcwd); continue; } #endif #ifdef XJDFRONTEND if( stringcomp((unsigned char *)"omode",rcwd) == 0) { rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); rcwd[0] = rcwd[0] | 0x20; if(rcwd[0] == 'j') Omode = 0; if(rcwd[0] == 'e') Omode = 1; if(rcwd[0] == 's') Omode = 2; continue; } if( stringcomp((unsigned char *)"kanamode",rcwd) == 0) { KImode = 0; continue; } if( stringcomp((unsigned char *)"exactmatch",rcwd) == 0) { EMtoggle (); continue; } #endif #ifdef XJDDIC if( stringcomp((unsigned char *)"dicfile",rcwd) == 0) { if (thisdic == 0) { thisdic = 1; } else { thisdic++; NoDics++; } rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); strcpy(Dnamet[thisdic],rcwd); strcpy(XJDXnamet[thisdic],rcwd); strcat(XJDXnamet[thisdic],".xjdx"); continue; } #endif #ifdef XJDFRONTEND if( stringcomp((unsigned char *)"gnufile",rcwd) == 0) { rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); strcpy(GPL_File,rcwd); continue; } #endif #ifdef XJDFRONTEND if( stringcomp((unsigned char *)"clipfile",rcwd) == 0) { rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); strcpy(Clip_File,rcwd); continue; } #endif #ifdef XJDFRONTEND if( stringcomp((unsigned char *)"extfile",rcwd) == 0) { rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); strcpy(EXTname,rcwd); strcpy(EXTJDXname,rcwd); strcat(EXTJDXname, ".xjdx"); continue; } #endif #ifdef XJDFRONTEND if( stringcomp((unsigned char *)"rvdisplay",rcwd) == 0) { rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); if( stringcomp((unsigned char *)"on",rcwd) == 0) RVACTIVE = TRUE; if( stringcomp((unsigned char *)"off",rcwd) == 0) RVACTIVE = FALSE; continue; } #endif #ifdef XJDFRONTEND if( stringcomp((unsigned char *)"kdnoshow",rcwd) == 0) { rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); strcpy(KDNSlist,rcwd); continue; } #endif #ifdef XJDDIC if( stringcomp((unsigned char *)"kdicfile",rcwd) == 0) { rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); strcpy(Dnamet[0],rcwd); strcpy(XJDXnamet[0],rcwd); strcat(XJDXnamet[0],".xjdx"); continue; } #endif #ifdef XJDFRONTEND if( stringcomp((unsigned char *)"radkfile",rcwd) == 0) { rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); strcpy(RKname,rcwd); continue; } if( stringcomp((unsigned char *)"radfile",rcwd) == 0) { rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); strcpy(Rname,rcwd); continue; } if( stringcomp((unsigned char *)"verbfile",rcwd) == 0) { rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); strcpy(Vname,rcwd); continue; } if( stringcomp((unsigned char *)"romfile",rcwd) == 0) { rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); strcpy(ROMname,rcwd); continue; } if( stringcomp((unsigned char *)"jverb",rcwd) == 0) { rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); if(stringcomp(rcwd,(unsigned char *)"on") == 0) Jverb = TRUE; if(stringcomp(rcwd,(unsigned char *)"off") == 0) Jverb = FALSE; continue; } if( stringcomp((unsigned char *)"filt",rcwd) == 0) { rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); sscanf(rcwd,"%d",&fn); if ((fn < 0)||(fn > NOFILT)) continue; rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); sscanf(rcwd,"%d",&ft); if (ft > 2) continue; filttype[fn] = ft; rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); filton[fn] = FALSE; if(stringcomp((unsigned char *)"on",rcwd) == 0) { filton[fn] = TRUE; nofilts = TRUE; } rcwd = (unsigned char *)strtok(NULL,"\""); strcpy(filtnames[fn],rcwd); ft=0; rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); while(rcwd != NULL) { strcpy(filtcodes[fn][ft],rcwd); ft++; rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); } if(ft==0)continue; filtcoden[fn] = ft; filtact[fn] = TRUE; continue; } #endif } } else { printf("No .xjdicrc file detected\n"); return; } fclose(fm); } /*====stringcomp==stricmp & strcasecmp pulled together=========*/ /* (my own routine, because different systems need one or the other */ int stringcomp(unsigned char *s1, unsigned char *s2) { int i; unsigned char c1,c2; for(i = 0; i < strlen(s1);i++) { c1 = s1[i]; if (c1 < 0x60) c1 = (c1|0x20); c2 = s2[i]; if (c2 < 0x60) c2 = (c2|0x20); if (c1 != c2) return(1); } return (0); } /*====SeekErr==Common error routine for seeking==================*/ void SeekErr(int iores) { printf("\nSeek error %d\n",iores); exit(1); } xjdfrontend.c0100644000076400007640000021763607665060725011742 0ustar jwbjwb/************************************************************************** * X J D F R O N T E N D * * Common Frontend Routines for client & stand-alone vers. * * Japanese-English Dictionary program (X11 version) * * Author: Jim Breen * ***************************************************************************/ /* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include #include #include #include "xjdic.h" /* Paul Burchard supplied a patch to provide BSD compatibility for xjdic (it uses the appropriate BSD ioctls in place of the SVR4 stuff). In order to enable this, people should compile with the option -D__STRICT_BSD___ . */ #ifdef __STRICT_BSD__ #include #else #ifdef __POSIX__ #include #else #include #endif #endif #define WINSIZE_IOCTL_AVAILABLE static enum { IOCTL_ORIG, IOCTL_RAW } myi_status = IOCTL_ORIG; #ifdef __STRICT_BSD__ static struct sgttyb orig,new; #else static struct termio orig,new; #endif extern unsigned char CBname[100]; extern unsigned char Dnamet[10][100],XJDXnamet[10][100]; extern unsigned char *dicbufft[10]; extern unsigned long diclent[10], indkent[10],indptrt[10]; extern int NoDics,CurrDic; int thisdic = 0; int gdicnos[10],gdicmax=0,GDmode=FALSE,gdiclen; int GDALLmode=FALSE; FILE *fe, *fex, *fclip, *fopen(); #ifdef XJDCLSERV extern int portno; extern unsigned char host[]; #endif #ifdef XJDDIC extern unsigned long dichits[10],dicmiss[10]; extern unsigned long indhits[10],indmiss[10]; extern unsigned long vbkills; #endif char DicDir[100]; int xfilelen; pid_t pid; int sig=SIGTSTP; int ShiftJIS = FALSE,NoSJIS=FALSE; unsigned char instr[256],radkanj[250][2]; int radnos[250]; unsigned char kanatab[NRKANA*2][7]; int Omode = 0,Smode = 0,Dmode = 0,AKanaMode; int DRow,DCol,MaxY=MAXLINES,MaxX=MAXCOLS-1,KFlushRes,nok; unsigned long hittab[NOHITS]; int verblen,DispHit,ksp,hitind,FirstKanj = 0,prieng = FALSE,Extopen=FALSE,NoSkip; int extlen,extjdxlen; unsigned char kmodes[2][10] = {"ON","OFF"}; unsigned char kmodes_r[2][10] = {"OFF","ON"}; unsigned long chline,chpos,it; unsigned char strfilt[10],tempout[80]; unsigned char KSname[50] = {"kanjstroke"}; unsigned char RKname[50] = {"radkfile"}; unsigned char Rname[50] = {"radicals.tm"}; unsigned char ROMname[60] = {"romkana.cnv"}; unsigned char EXTJDXname[80] = {"edictext.xjdx"}; unsigned char EXTname[80] = {"edictext"}; unsigned char Vname[60] = {"vconj"}; unsigned char ENVname[100]; unsigned char cl_rcfile[100]; unsigned char Clip_File[100] = {"clipboard"}; unsigned char GPL_File[100] = {"gnu_licence"}; unsigned char KDNSlist[50]; int jiver = 14; /*The last time the index structure changed was Version1.4*/ unsigned char sver[] = {SVER}; unsigned char fbuff[512],KLine[KFBUFFSIZE],karray[KANJARRAYSIZE][5]; unsigned char LogLine[200]; unsigned char ksch[50],ktarg[50]; /* The following Help table has "~" to force spaces */ unsigned char Help[40][81] = { "\n~~~~~~~~~~~~~~~~~~XJDIC USAGE SUMMARY ", "At the SEARCH KEY prompt respond with a string of ascii, kana and/or ", "kanji to look up in the current dictionary (prefix with @ or # to invoke ", "conversion of romaji to hiragana or katakana)", "~~~~~~~~~~~~~~~~~~SINGLE CHARACTER COMMANDS", "~~\\ enter Kanji Dictionary mode~~~? ~~get this Help display", "~~_ select dictionary files ~~~~~~=/^ cycle up/down dictionary files", "~~\' set/clear one-off filter~~~~~~; activate/deactivate general filters", "~~/ toggle kanji_within_compound~~- toggle long kanji display on/off", "~~$ set global dictionaries ~~~~~~% toggle global search mode on/off", "~~] display Dictionary Extension ~: toggle verb deinflection on/off", "~~+ toggle priority English keys~~| toggle unedited display mode on/off", "~~[ toggle exact_match on/off~~~~~& toggle kana input mode on/off", "~~{ switch to clipboard input ~~~~} toggle reverse video of matches", "~~` toggle multiple global disp.~~Ctrl-D to exit", "~~! display gnu licence~~~~~~~~~~~Ctrl-Z to suspend", "~~~~~~Kanji Dictionary mode - prompt is KANJI LOOKUP TYPE:. Responses:", "~~a single kanji or a kana reading (default)", "~~j followed by the 4-digit hexadecimal JIS code for a kanji", "~~j followed by k and the 4-digit KUTEN code for a kanji", "~~~~~~~(precede code with `h' for JIS X 0212 kanji.)", "~~j followed by s and the 4-digit hexadecimal Shift-JIS code for a kanji", "~~m followed by an (English) kanji meaning", "~~c followed by an index code such as Nnnn (Nelson), Bnn (Bushu), etc", "~~r initiates a display of all radicals and their numbers", "~~l switches the program into the Radical Lookup mode", "$$$" }; unsigned char RVon[] = {0x1b,'[','7','m',0}; unsigned char RVoff[] = {0x1b,'[','m',0}; int nofilts=FALSE,filton[NOFILT],filtact[NOFILT],filttype[NOFILT],filtcoden[NOFILT]; unsigned char filtnames[NOFILT][50],filtcodes[NOFILT][10][10]; unsigned char testline[1025],SingleFilter[50]; unsigned char vdicf[VMAX][7],vinfl[VMAX][21],vcomms[41][50]; int strf,Jverb = TRUE,SFFlag=FALSE,vcommno[VMAX]; int ROmode = 1,EMmode = 1,KLmode = 1,KImode = 1,KLRmode,KLcount; unsigned char vline[250],vstr[13]; unsigned char RadK1[300],RadK2[300],*RKanj1,*RKanj2,*RKSet[10]; unsigned char RKTarg[21]; int rmax,NoSets=0,NoRads,RKStart[300],RKCnt[300]; unsigned char ops[3],kstrokes[7000]; int kstrokelim,kstroketype; int clipmode=FALSE; unsigned char clipstring1[51]; unsigned char clipstring2[51]={"XXXX"}; int RVACTIVE = TRUE; int DicNum; long DicLoc; /*====== Prototypes========================================================*/ FILE *xfopen(char *file_name, char *file_mode, int *xfilelen); int getcharxx(); void RadDisp(); void RadBuild(); int FindRad(unsigned char char1, unsigned char char2); void DoLOOKUP(); void RadLoad(); void KSLoad(); void xjdserver (int type, int dic_no, long index_posn, int sch_str_len, unsigned char *sch_str, int *sch_resp, long *res_index, int *hit_posn, int *res_len, unsigned char *res_str, long *dic_loc ); void OneShot(); void RadSet(); void Verbtoggle(); void FiltSet(); void xjdicrc(); void DoRADICALS(); int Vlookup(); void AppKanji(unsigned char c1,unsigned char c2); void Verbinit(); void KOut(unsigned char *sout); void LoadKana(); void DoRomaji(unsigned char kc); int kanaconv(int rpos, int rlen); void togglemode(); void engpritoggle(); void altdic(int dicincr); void DoKANJI(); void DoJIS(); int addhit(long spot); void GetEUC(unsigned char *eucline); void cbreakon(); void cbreakoff(); void ioctlorig(); void ioctlraw(); void Lookup(); void Lookup2(); void DicSet(); void sjis2jis(int *p1,int *p2);/* Ken Lunde's routine */ void jis2sjis(unsigned char *p1,unsigned char *p2);/* Ken Lunde's routine */ int stringcomp(unsigned char *s1, unsigned char *s2); void FixSJIS(unsigned char *jline); void GetKBStr(unsigned char *prompt); void ExtFileDisp(); void SeekErr(int iores); void KOutc(int c); void KLookup(); int KFlush(unsigned char *msg); int KEOS (unsigned char *msg); void NewWinSize(); int kcmp (unsigned char *t1, unsigned char *t2); unsigned char *DicName(int dn); /*====== end of prototypes==================================================*/ /* ==== ioctl routines supplied by Cameron Blackwood=======================*/ /* ==== BSD compatibility hacked in by Paul Burchard ==============*/ /* These routines are to disable/re-enable "cbreak", when I want to switch in & out of canonical input processing. Mostly xjdic does not use canonical input, as I want to react immediately to most key-presses */ void ioctlraw() { if (myi_status == IOCTL_ORIG) { #ifdef __STRICT_BSD__ ioctl(0, TIOCGETP, &orig); ioctl(0, TIOCGETP, &new); new.sg_flags |= CBREAK; new.sg_flags &= ~ECHO; ioctl(0, TIOCSETP, &new); #else ioctl(0, TCGETA, &orig); ioctl(0, TCGETA, &new); new.c_lflag &= ~ICANON; new.c_lflag &= ~ISIG; new.c_lflag &= ~ECHO; new.c_lflag &= ~IXON; new.c_cc[4] = 1; new.c_cc[5] = 0; ioctl(0, TCSETA, &new); #endif myi_status=IOCTL_RAW; } else return; } void ioctlorig() { #ifdef __STRICT_BSD__ ioctl(0, TIOCSETP, &orig); #else ioctl(0, TCSETA, &orig); #endif myi_status = IOCTL_ORIG; } void cbreakoff() { ioctlorig(); /*system("stty -cbreak echo");*/ } void cbreakon() { ioctlraw(); /*system("stty cbreak -echo");*/ } int getcharxx() { if (clipmode) { return('n'); } else { return(getchar()); } } /*====GetWinSize==== Hank Cohen's routine for getting the (new) window size==*/ /* * (The following was supplied by Hank Cohen) * We would like to use the Berkeley winsize structure to determine * the number of lines and columns in the window. If that's not * available we can use termcap. * If using termcap, you will need to compile with "-lcurses -ltermcap". */ char termcap_buf[1024]; void GetWinSize() { char *term_name; #ifdef WINSIZE_IOCTL_AVAILABLE struct winsize window; signal(SIGWINCH, NewWinSize); ioctl(0,TIOCGWINSZ,&window); MaxX = window.ws_col; MaxX--; MaxY = window.ws_row; #else /* Use termcap */ if ((term_name = getenv("TERM")) == 0){ fprintf(stderr,"No TERM in environment!\n"); } else if (tgetent(termcap_buf, term_name) != 1) { fprintf(stderr,"No termcap entry for %s!\n", term_name); } else { MaxX = tgetnum("co"); MaxY = tgetnum("li"); } #endif /* termcap */ } void NewWinSize() { struct winsize window; ioctl(0,TIOCGWINSZ,&window); MaxX = window.ws_col; MaxX--; MaxY = window.ws_row; } /*=====KSLoad===Load file of kanji/stroke data==========================*/ void KSLoad() { int i,j,k,lno; FILE *fk,*fopen(); fk = xfopen(KSname,"r",&xfilelen); lno=0; while(!feof(fk)) { fgets(testline,9,fk); if(feof(fk)) break; testline[3] = 0; lno++; i = ((testline[0] & 0x7f)-0x30)*94 + ((testline[1] & 0x7f) - 0x21); if ((i < 0) || (i > 6999)) { printf("Bad kanji in %s at line %d (%s)\n",KSname,lno,testline); i = 6999; } kstrokes[i] = testline[2]-'0'; } fclose(fk); } /*=====RadLoad===Load file of Radical Data==============================*/ void RadLoad() { int i,j,k; FILE *fk,*fopen(); fk = xfopen(RKname,"r", &xfilelen); k = xfilelen/2; RKanj1 = malloc(k*sizeof(char)); if (RKanj1==NULL) { printf("malloc failed for radical tables!\n"); exit(1); } RKanj2 = malloc(k*sizeof(char)); if (RKanj2==NULL) { printf("malloc failed for radical tables!\n"); exit(1); } i = -1; j = 0; rmax = 0; while(!feof(fk)) { fgets(testline,199,fk); if(feof(fk)) break; if (testline[0] == '$') { i++; RadK1[i] = testline[2]; RadK2[i] = testline[3]; RKStart[i] = j; RKCnt[i] = 0; if (i != 0) { if (RKCnt[i-1] > rmax) rmax = RKCnt[i-1]; } } else { for (k = 0; k < strlen(testline); k++) { if (testline[k] < 127) continue; RKanj1[j] = testline[k]; RKanj2[j] = testline[k+1]; RKCnt[i]++; j++; k++; } } } fclose(fk); NoRads = i; for (i=0; i<10;i++) { RKSet[i] = malloc(2*rmax+1); if (RKSet[i] == NULL) { printf("malloc() failed for Radical set(s)!\n"); } } } /*=====DoRomaji==collect search key from keyboard. Convert to kana.======*/ /* Code originally from JDIC */ void DoRomaji(unsigned char kc) { int is; unsigned char c; /* collect the search string */ Smode = 1; if(kc == '#') Smode = 2; is = 0; ksp = 0; c = 0; ktarg[0] = 0; printf("\r \r%sROMAJI ENTRY:%s ",RVon,RVoff); while (c != 0x0a) /* loop until Enter is pressed */ { c = getcharxx(); if ((c == 0x8)||(c == 0x7f)) /* backspace */ { if (is != ksp) /* kana mode - back over a romaji */ { ksch[is-1] = '\0'; is--; sprintf(tempout,"\r \r%sROMAJI ENTRY:%s %s%s",RVon,RVoff,ktarg,ksch+ksp); KOut(tempout); continue; } else { if (strlen(ktarg) != 0) /* kana mode - back over a kana */ { ktarg[strlen(ktarg)-2] = '\0'; sprintf(tempout,"\r \r%sROMAJI ENTRY:%s %s%s",RVon,RVoff,ktarg,ksch+ksp); KOut(tempout); continue; } } } if (c > 32) /* ordinary character - store and display */ { ksch[is] = c | 0x20; ksch[is+1] = '\0'; is++; sprintf(tempout,"\r \r%sROMAJI ENTRY:%s %s%s",RVon,RVoff,ktarg,ksch+ksp); KOut(tempout); } if (ksp != is) { /* the input string so far is now parsed for romaji -> kana conversions. function "kanaconv" is used for the various sub-strings */ /* if there is an "nn", "nm" or "mm", convert to first to "q" to force it to be converted to a kana "n" */ if ((ksch[ksp] == 'n')&&(ksch[ksp+1] == 'n')) ksch[ksp] = 'q'; if ((ksch[ksp] == 'm')&&(ksch[ksp+1] == 'm')) ksch[ksp] = 'q'; if ((ksch[ksp] == 'n')&&(ksch[ksp+1] == 'm')) ksch[ksp] = 'q'; /* if there is "nx", where "x" is not a vowel or a "y", force the "n". */ if (((ksch[ksp] == 'n')||(ksch[ksp] == 'm'))&&(ksch[ksp+1] != 0)) { c = ksch[ksp+1]; if((c!='y')&&(c!='a')&&(c!='e')&&(c!='i')&&(c!='o')&&(c!='u')&&(c!='\'')) { ksch[ksp] = 'q'; } } if(kanaconv(ksp,1)) /* match on a,e,i,o,u,q or - ? */ { continue; } if(ksch[ksp] == '\'') { ksp++; continue; } if (ksch[ksp] == ksch[ksp+1]) /* double consonant - force small "tsu" */ { ksch[ksp] = '*'; kanaconv(ksp,1); continue; } if(kanaconv(ksp,2)) /* match on two letter syllable */ { continue; } if(kanaconv(ksp,3)) /*match on 3 letter syllable */ { continue; } if(kanaconv(ksp,4)) /*match on 4 letter syllable */ { continue; } } /* end of rom->kana */ } /* end of while loop */ if (ksch[ksp] =='n') /*flush out a trailing "n"*/ { ksch[ksp] = 'q'; kanaconv(ksp,1); } strcpy(instr,ktarg); } /*========kanaconv==convert romaji to kana==============================*/ /* More code from JDIC */ int kanaconv(int rpos, int rlen) { /* rpos and rlen are the start and length of the romaji characters in array ksch. Smode specifies hira or kata. If found, the kana is appended to ktarg and TRUE returned. */ int koff,ki; unsigned char targ[50]; koff = (Smode-1)*NRKANA; for(ki = 0; ki < rlen; ki++) { targ[ki] = ksch[rpos+ki]; } targ[rlen] = 0; for (ki = koff; ki < koff+NRKANA; ki+=2) { if (strlen(targ) != strlen(kanatab[ki])) continue; if (stringcomp(targ,kanatab[ki]) != 0) continue; strcat(ktarg,kanatab[ki+1]); ksp = ksp+rlen; sprintf(tempout,"\r \r%sROMAJI ENTRY:%s %s%s",RVon,RVoff,ktarg,ksch+ksp); KOut(tempout); return (TRUE); } return(FALSE); } /* ==== LoadKana=== Load the romaji to kana conversion file============*/ void LoadKana() { int i,ih,mode; FILE *fp,*fopen(); unsigned char LKin[80],*ptr; for (i = 0; i < NRKANA*2; i++) strcpy(kanatab[i]," "); fp = xfopen(ROMname,"r", &xfilelen); mode = 0; while (!feof(fp)) { fgets(LKin,79,fp); if (feof(fp))break; /*LKin[strlen(LKin)-1] = '\0';*/ if(LKin[0] == '#')continue; if((LKin[0] == '$')&&((LKin[1]|0x20) == 'h')) { mode = 0; ih = 0; continue; } if((LKin[0] == '$')&&((LKin[1]|0x20) == 'k')) { mode = 1; ih = 0; continue; } ptr = (unsigned char *)strtok(LKin," \t"); if ( ptr != NULL ) strcpy(kanatab[mode*NRKANA+ih*2+1],ptr); ptr = (unsigned char *)strtok(NULL," \t\r\n"); if ( ptr != NULL ) strcpy(kanatab[mode*NRKANA+ih*2],ptr); ih++; if(ih == NRKANA) { printf("Too many romaji table entries!"); exit(1); } } fclose(fp); } /*======jis2sjis (from Ken Lunde) =====================================*/ void jis2sjis(unsigned char *p1,unsigned char *p2) /* courtesy of Ken Lunde */ { register unsigned char c1 = *p1; register unsigned char c2 = *p2; register int rowOffset = c1 < 95 ? 112 : 176; register int cellOffset = c1 % 2 ? 31 + (c2 > 95) : 126; *p1 = ((c1 + 1) >> 1) + rowOffset; *p2 = c2 + cellOffset; } /*====KEOS===End of screen processing for KFlush==================*/ int KEOS (unsigned char *msg) { unsigned char ck; if (DRow < MaxY-2) return(TRUE); DRow = 0; if (strlen(msg) == 0) return (TRUE); printf("%s\n",msg); ck = getcharxx(); if ((ck == 'n')||(ck == 'N')) return (FALSE); if ((ck == 'y')||(ck == 'Y')) return (TRUE); if ((ck != 0xa) && (ck != 0xd)) ungetc(ck,stdin); return (FALSE); } /*====KFlush==== Output a line, folding if necessary===============*/ /* This is now the main screen output routine. An array "KLine" is built up of text to be output. KFlush() sends it to the screen, folding the line at white-space if it is about to hit the RHS. It also tests for end of screen, and prompts for continuation, using the KEOS(). Returns TRUE for continue, and FALSE for stopping. Called with the prompt measseage. */ int KFlush(unsigned char *msg) { unsigned char *kptr,ktemp[512]; int retf,it,j; int Test; if (strlen(KLine) == 0) return (TRUE); kptr = (unsigned char *)strtok(KLine," "); while (kptr != NULL) { Test = MaxX; strcpy(ktemp,kptr); if (ktemp[0] == '\t') { it = DCol % 10; if (it != 0) { DCol = DCol+10-it; if (DCol <= Test-1) { for (j = 0;j < 10-it;j++) KOut(" "); } } strcpy(ktemp,ktemp+1); } it = strlen(ktemp); if (DCol+it < Test) { DCol = DCol+it+1; } else { KOut("\n"); DRow++; DCol=it+1; retf = KEOS(msg); if (!retf) return (FALSE); } KOut(ktemp); if (DCol <= MAXCOLS) KOut(" "); kptr = (unsigned char *)strtok(NULL," "); } KOut("\n"); DRow++; retf = KEOS(msg); DCol = 0; if (!retf) return (FALSE); return (TRUE); } /*====KOutc===add a character to KLine=============================*/ void KOutc(int c) { unsigned char tmp[2]; tmp[0] = c; tmp[1] = 0; strcat(KLine,tmp); return; } /*=====KOut===output kana/kanji according to selected mode===========*/ /* Mostly called from KFlush. Outputs the parameter string, in the specified JIS mode. */ void KOut(unsigned char *sout) { int i; unsigned char c1,c2; for (i = 0; i < strlen(sout); i++) { c1 = sout[i]; c2 = sout[i+1]; if (c1 < 127) { if (c1 == '~') c1 = ' '; printf("%c",c1); continue; } switch(Omode) { case 0 : /* JIS (default) */ if (c1 == 0x8f) { printf("%c$(D%c%c%c(B",0x1b,c2&0x7f,sout[i+2]&0x7f,0x1b); i+=2; break; } printf("%c$B%c%c%c(B",0x1b,c1&0x7f,c2&0x7f,0x1b); i++; break; case 1 : /* EUC (internal format) */ if (c1 == 0x8f) { printf("%c%c%c",c1,c2,sout[i+2]); i+=2; break; } printf("%c%c",c1,c2); i++; break; case 2 : /* Shift-JIS */ c1 -= 128; c2 -= 128; jis2sjis(&c1,&c2); printf("%c%c",c1,c2); i++; break; } } } /*======function to test if this entry has already been displayed=====*/ int addhit(long spot) { int i; if (spot == 0) return(TRUE); for (i=0;i<=hitind;i++) { if(hittab[i] == spot) return(FALSE); } if(hitind < NOHITS) hitind++; hittab[hitind] = spot; return(TRUE); } /*====GetEUC - ensures that any JIS in the string is EUC ============*/ /* Based on the GetEUC in JREADER, this routine examines the string "instr" and converts any JIS or SJIS to EUC. The result is placed in the specified string. */ void GetEUC(unsigned char *eucline) { int i,j,SI,J212,J212sw; J212 = FALSE; eucline[0] = '\0'; chline = 0; chpos = 0; SI = FALSE; ShiftJIS = FALSE; j = 0; for (i = 0; i < strlen(instr); i++) { if((instr[i]==0x1b)&&(instr[i+1]=='$')&&(instr[i+2]=='(')&&(instr[i+3]=='D')) { SI = TRUE; J212 = TRUE; J212sw = 0; NoSJIS = TRUE; i+=3; continue; } if((instr[i]==0x1b)&&(instr[i+1]=='$')&&(instr[i+2]=='B')) { SI = TRUE; J212 = FALSE; i+=2; continue; } if((instr[i]==0x1b)&&(instr[i+1]=='$')&&(instr[i+2]=='@')) { SI = TRUE; J212 = FALSE; i+=2; continue; } if((instr[i]==0x1b)&&(instr[i+1]=='(')&&(instr[i+2]=='J')) { SI = FALSE; J212 = FALSE; i+=2; continue; } if((instr[i]==0x1b)&&(instr[i+1]=='(')&&(instr[i+2]=='B')) { SI = FALSE; J212 = FALSE; i+=2; continue; } if (instr[i] == '\0')break; if (SI) { if (J212 && (J212sw == 0)) eucline[j++] = 0x8f; eucline[j] = instr[i] | 0x80; J212sw = (J212sw+1) % 2; } else { eucline[j] = instr[i]; } j++; eucline[j] = '\0'; } /* fix up SHIFT-JIS, if present */ if (!NoSJIS) FixSJIS(eucline); } /*====FixSJIS=== convert any SJIS to EUC in a string==================*/ void FixSJIS(unsigned char *jline) { int i,p1,p2,ShiftJIS; ShiftJIS = FALSE; for (i = 0; i < strlen(jline); i++) { p1 = jline[i]; if (p1 < 127)continue; p2 = jline[i+1]; if ((p1 >= 129) && (p1 <= 159)) ShiftJIS = TRUE; if (((p1 >= 224) && (p1 <= 239))&& ((p2 >= 64) && (p2 <= 158))) ShiftJIS = TRUE; if (ShiftJIS) { sjis2jis (&p1,&p2); p1 += 128; p2 += 128; jline[i] = p1; jline[i+1] = p2; } i++; } } /*===sjis2jis - convert ShiftJIS to JIS ===========================*/ void sjis2jis (int *p1,int *p2) /* Ken Lunde's routine */ { register unsigned char c1 = *p1; register unsigned char c2 = *p2; register int adjust = c2 < 159; register int rowOffset = c1 < 160 ? 112 : 176; register int cellOffset = adjust ? (31 + (c2 > 127)) : 126; *p1 = ((c1 - rowOffset) << 1) - adjust; *p2 -= cellOffset; } /*====ExtFileDisp===Display from EDICTEXT file=======================*/ void ExtFileDisp() { unsigned extrec[2],seekoff,iores,hi,lo,mid,ejdxtest[2]; unsigned char Ssch[20]; int bsres,i; printf("%sExtension Key:%s ",RVon,RVoff); GetKBStr("Extension Key:"); if(fbuff[0] < 128) { printf("\nThe extension file has Kanji & Kana keys\n"); return; } if(!Extopen) { fe = xfopen(EXTname,"rb", &extlen); fex = xfopen(EXTJDXname,"rb", &extjdxlen); Extopen = TRUE; extlen++; fread(ejdxtest,sizeof(long),1,fex); if (ejdxtest[0] != (extlen+jiver)) { printf("\nEDICT Extension file & Index Mismatch! %ld %ld\n",ejdxtest[0],extlen+jiver); exit(1); } } lo = 0; hi = (extjdxlen/(2*sizeof(long)))-1; while(TRUE) { mid = (lo+hi)/2; seekoff = mid; seekoff *= (2*sizeof(long)); seekoff+=sizeof(long); if((iores = fseek(fex,seekoff,SEEK_SET)) != 0)SeekErr(iores); iores = fread(&extrec,sizeof(long),2,fex); seekoff = extrec[0]; if((iores = fseek(fe,seekoff,SEEK_SET)) != 0)SeekErr(iores); iores = fread(&Ssch,sizeof(char),19,fe); Ssch[19] = 0; i = 0; bsres = 0; for (i = 0; Ssch[i] != 0 ;i++) { if (Ssch[i] < 128) break; if (fbuff[i] < 128) break; if (fbuff[i] < Ssch[i]) { bsres = -1; break; } if (fbuff[i] > Ssch[i]) { bsres = 1; break; } } if ((bsres != 0) && ((lo + hi) == 0)) break; if(bsres < 0) { if (mid == 0) break; hi = mid-1; } else { lo = mid+1; } if (bsres == 0) break; if (lo > hi) break; if (hi < 0) break; } if (bsres == 0) { printf("\n%sDictionary Extension Display%s\n",RVon,RVoff); seekoff = extrec[1]; if((iores = fseek(fe,seekoff,SEEK_SET)) != 0)SeekErr(iores); strcpy (KLine," <"); DRow = 0; DCol = 0; while(!feof(fe)) { fgets(LogLine,199,fe); if (feof(fe)) break; if ((LogLine[0] == '<') && (LogLine[1] > 128)) break; for (i = strlen(LogLine); i >= 0; i--) { if (LogLine[i] < 0x20) LogLine[i] = 0; } strcat(KLine,LogLine); if (!KFlush("Continue displaying extension information? (y/n)")) break; DCol = 0; strcpy (KLine," "); } return; } if (bsres != 0) { printf("\nNot found in Extension file!\n"); return; } } /*====kcmp === comparison routine for qsort for kanji table==========*/ int kcmp (unsigned char *t1, unsigned char *t2) { int i,cmp; for (i=0;i<4;i++) { cmp = t1[i] - t2[i]; if (cmp == 0) continue; return(cmp); } return(0); } /*==== Verbinit===Load & initialize verb inflection details==========*/ void Verbinit() { unsigned char tempstr[512],*vptr; int vmode,i; FILE *fi,*fopen(); for (i = 0;i< VMAX;i++) { vdicf[i][0] = 0; vinfl[i][0] = 0; vcommno[i] = 40; } for (i = 0;i<40;i++) { vcomms[i][0] = 0; } vmode = 1; strcpy(vcomms[40],"Unknown type"); verblen = 0; fi = xfopen(Vname,"r", &xfilelen); while(TRUE) { fgets(tempstr,511,fi); if(feof(fi))break; if (tempstr[0] == '#')continue; if (tempstr[0] == '$') { vmode = 2; continue; } switch (vmode) { case 1 : vptr = (unsigned char *)strtok(tempstr," \t\n\r"); i = atoi(vptr); if ((i < 0) || (i > 39)) break; vptr = (unsigned char *)strtok(NULL,"\t\n\r"); strcpy(vcomms[i],vptr); break; case 2 : vptr = (unsigned char *)strtok(tempstr," \t\n\r"); strcpy(vinfl[verblen],vptr); vptr = (unsigned char *)strtok(NULL," \t\n\r"); strcpy(vdicf[verblen],vptr); vptr = (unsigned char *)strtok(NULL," \t\n\r"); i = atoi(vptr); if ((i >= 0)&&(i <= 40)) vcommno[verblen] = i; verblen++; if (verblen==VMAX) { printf("Verb data overflow. Ignoring following entries\n"); verblen--; fclose(fi); return; } break; } } verblen--; fclose(fi); } /*=== append a kana/kanji to the verb display line================*/ void AppKanji(unsigned char c1,unsigned char c2) { unsigned char ops[3]; ops[0] = c1; ops[1] = c2; ops[2] = 0; strcat(vline,ops); } /*=======Vlookup== look up plain form verb in dictionary=============*/ int Vlookup() { int xjresp,roff,rlen; unsigned char repstr[512]; long respos; int hit,schix; unsigned char khi,klo,cc,ops[4]; long it; DicNum = CurrDic; khi = 0; klo = 0; vline[0] = 0; xjdserver (XJ_FIND, DicNum,it, strlen(vstr), vstr, &xjresp, &respos, &roff, &rlen, repstr, &DicLoc); if (xjresp != XJ_OK) return (FALSE); it = respos; while (xjresp == XJ_OK) { if (roff != 0) { it++; xjdserver (XJ_ENTRY, DicNum, it, strlen(vstr), vstr, &xjresp, &respos, &roff, &rlen, repstr, &DicLoc); continue; } schix = 0; /* now work forwards, displaying the line */ hit = FALSE; /* If the first word has already been displayed, skip it. Otherwise, put braces around the first word (kanji) */ while (TRUE) { cc = repstr[schix]; if (cc < 32) break; /* put a () around the yomikata in an ascii or Kanji search */ if (cc=='[') { AppKanji(0xa1,0xcA); /* EUC ( */ schix++; continue; } if (cc==']') { AppKanji(0xA1,0xCB); /* EUC ) */ schix++; continue; } if (cc < 128) /* non-Japanese, display it (fix up the "/") */ { ops[0]= cc; ops[1] = '\0'; if (ops[0] == '/') { if (hit) { ops[0] = ','; ops[1] = ' '; ops[2] = '\0'; } else { hit = TRUE; ops[0] = '\0'; } } strcat(vline,ops); } else { if (cc == 0x8f) { AppKanji(cc,0); schix++; continue; } if (khi == 0) { khi = cc; } else { klo = cc; AppKanji(khi,klo); khi = 0; klo = 0; } } schix++; } if(strlen(vline) > 0) break; } if(strlen(vline) <=1) return(FALSE); return(TRUE); } /*=========== slencal - calculate the actual search string length ===*/ /* This routine exists to sort out the actual length of the search string when there is a mix of 2 and 3-byte EUC characters */ int slencal (int noch, unsigned char *targ) { int i,j; if (targ[0] < 127) return(noch+1); i = 0; j = 0; while(i <= noch) { if (targ[j] == 0x8f) j++; i++; j+=2; } return(j); } /*=========== Lookup - global frontend to dictionary search ========*/ void Lookup() { int gi,dicsav,gdiclenbest; unsigned char retsave[KFBUFFSIZE],rethdr[5]; retsave[0] = 0; gdiclen = 0; gdiclenbest = 0; if ((!GDmode) || (Dmode == 1)) { Lookup2(); return; } if (gdicmax == 0) { printf("\nNo global dictionaries specified - disabling!\n"); GDmode = FALSE; Lookup2(); return; } dicsav = CurrDic; for (gi=0;gi<=gdicmax;gi++) { CurrDic = gdicnos[gi]; Lookup2(); if (GDALLmode) { strcpy(retsave,KLine); strcpy(rethdr,"[X] "); rethdr[1] = '0'+gdicnos[gi]; strcpy(KLine,rethdr); strcat(KLine,retsave); KFlush(""); continue; } if ((gdiclen > gdiclenbest) || ((strlen(KLine) > strlen(retsave)) && (gdiclen == gdiclenbest))) { strcpy(retsave,KLine); strcpy(rethdr,"[X] "); rethdr[1] = '0'+gdicnos[gi]; gdiclenbest = gdiclen; } } if (GDALLmode) { CurrDic = dicsav; return; } strcpy(KLine,rethdr); strcat(KLine,retsave); KFlush(""); CurrDic = dicsav; } /*=========== Lookup2 - carry out dictionary search ================*/ void Lookup2() { /* Carries out a search for matches with the string "fbuff" in the specified dictionary. It matches the full string, then progressively shortens it. */ int schix,schiy,schiz,j,dind,hit,skip,brace,engrv; int EngFirst; int slk,slen,slenx,i,srchlen,srchlenok; unsigned int khi,klo,cc; unsigned long zz,bshit[20]; unsigned char *kptr,*kptr2, k1,k2,kanj1,kanj2,kanj3; int FiltOK; unsigned char vlast[11],temp[11],ops[80]; int vi,vok,prevch,KDNSflag,KDskip,KTest; int xjresp,roff,rlen; unsigned char repstr[512]; unsigned long respos; vlast[0] = 0; KLcount = 0; DRow = 3; if (!GDmode && (Dmode == 0)&&Jverb&&(fbuff[0] > 0xa8) && (fbuff[2] < 0xa5) && (fbuff[4] < 0xa5)) { /* possible inflected verb or adjective, so look up the verb table for a matching plain form, and serch the dictionary for it */ vstr[0] = fbuff[0]; vstr[1] = fbuff[1]; vstr[2] = 0; for(i=0;i<11;i++) temp[i] = fbuff[i]; for (vi = 0;vi <= verblen;vi++) { vok = TRUE; vstr[2] = 0; for (i = 0;i < strlen(vinfl[vi]);i++) { if (fbuff[2+i] != vinfl[vi][i]) { vok = FALSE; break; } } if (!vok) continue; strcat(vstr,vdicf[vi]); if(strcmp(vstr,temp) == 0) continue; if (strcmp(vstr,vlast) == 0)continue; if (Vlookup()) { strcpy(vlast,vstr); printf(" Possible inflected verb or adjective: (%s)\n",vcomms[vcommno[vi]]); strcpy(KLine,vline); DCol = 0; KFlush(""); printf("Continue with this search (y/n)\n"); cc = getcharxx(); if ((cc == 'n')||(cc == 'N')) return; if ((cc != 'y')&&(cc != 'Y')) { ungetc(cc,stdin); return; } DRow = 1; } } } /* do a binary search through the index table looking for a match */ KLine[0] = 0; DCol = 0; nok = 0; DispHit = FALSE; khi = 0; klo = 0; DicNum = CurrDic; if(Dmode !=0) DicNum = 0; if (fbuff[strlen(fbuff)-1] < 32) fbuff[strlen(fbuff)-1] = 0; for (slenx = 1; slenx < 20; slenx++) { if (slencal(slenx-1,fbuff) >= strlen(fbuff)) break; } Smode = 0; if ((fbuff[0] == 0xa4)||(fbuff[0] == 0xa5)) { Smode = 1; for (i = 0; i < strlen(fbuff); i+=2) { if (fbuff[i] > 0xa5) { Smode = 0; break; } } } srchlenok = 0; for ( slen = 0; slen =0xa4) && (repstr[roff+srchlenok] > 127))) { printf("No Match Found (Exact Test)\n"); return; } } hitind = 0; hittab[0] = -1; gdiclen = slen*2; /* loop for each possible string length */ for (dind = slen-1; dind >= 0 ; dind--) { /* this is the display loop - usually one line per entry */ it = bshit[dind]; while (TRUE) /* display as long as there are matches*/ { srchlen = slencal(dind,fbuff); xjdserver (XJ_ENTRY, DicNum, it, srchlen, fbuff, &xjresp, &respos, &roff, &rlen, repstr, &DicLoc); /* printf("E: Returning: %d %ld %d %d %ld %s\n",xjresp,respos,roff,rlen,DicLoc,repstr); */ if (xjresp != XJ_OK) break; schix = 0; schiy = roff; /* make copy of line for filter testing */ slk=0; for(schiz=0;repstr[schiz]>=0x20;schiz++) { testline[schiz] = repstr[schiz]; if(testline[schiz]=='/')slk++; } testline[schiz] = '\0'; kanj1 = testline[0]; kanj2 = testline[1]; FiltOK = TRUE; /* now if filters are active, check the line for a match */ if((Dmode == 0)&& nofilts && (!GDmode)) { if(nofilts>0) { for (i=0;i=0xa4) && (repstr[roff+srchlenok] > 127)))) { FiltOK = FALSE; } KFlushRes = TRUE; /* now work forwards, displaying the line */ KTest = TRUE; if (((fbuff[0] > 0xa5) || (fbuff[0] == 0x8f)) && (roff != 0)) KTest = FALSE; if ((Dmode == 0) && GDmode) KTest = TRUE; if (roff != 0) gdiclen--; if (FiltOK && addhit(DicLoc) && (!FirstKanj || (FirstKanj && KTest))) { DispHit = TRUE; if ((Dmode == 0) &&(ROmode == 0)) { /* We are in "raw output mode, so just splat out the EDICT line. Note that this block does its own "end-of display" processing */ for(schiz=0;repstr[schiz]>=0x20;schiz++) { KLine[schiz] = repstr[schiz]; } KLine[schiz] = '\0'; KFlushRes = KFlush("Continue displaying matches? (y/n)"); it++; if (!KFlushRes) return; continue; } engrv = FALSE; EngFirst = TRUE; if((Dmode == 0) || ((Dmode ==1)&&(KLRmode == 0))) KLine[0] = 0; if (Dmode == 0) { if (fbuff[0] == SPTAG) { sprintf(ops,"%d: ",dind); strcpy(KLine,ops); } else { sprintf(ops,"%d: ",dind+1); strcpy(KLine,ops); } DCol = 0; } strcat(KLine," "); if (Dmode == 1) { KDNSflag = TRUE; prevch = 0; ops[0] = 0xa1; ops[1] = 0xda; kanj1 = repstr[0]; kanj2 = repstr[1]; kanj3 = repstr[2]; ops[2] = repstr[0]; ops[3] = repstr[1]; ops[4] = repstr[2]; ops[5] = 0; if (ops[2] != 0x8f) ops[4] = 0; instr[0] = 0xa1; instr[1] = 0xdb; instr[2] = 0; strcat (ops,instr); if (KLRmode == 0) { if (ops[2] == 0x8f) { sprintf (instr,"%s 1-%x%x [1-%d]",ops,kanj2&0x7f,kanj3&0x7f,((kanj2&0x7f)-0x20)*100+(kanj3&0x7f)-0x20); schix+=8; } else { k1 = kanj1 & 0x7f; k2 = kanj2 & 0x7f; jis2sjis(&k1,&k2); sprintf (instr,"%s %x%x [%d:%x%x]",ops,kanj1&0x7f,kanj2&0x7f,((kanj1&0x7f)-0x20)*100+(kanj2&0x7f)-0x20,k1,k2); schix+=7; } strcat(KLine,instr); } else { KLine[0] = 0; karray[nok][2] = kanj1; karray[nok][3] = kanj2; karray[nok][4] = kanj3; kptr = strstr(testline,"S"); if (kptr == NULL) { karray[nok][0] = 0; } else { karray[nok][0] = atoi(kptr+1); } kptr = strstr(testline,"B"); if (kptr == NULL) { karray[nok][1] = 0; } else { karray[nok][1] = atoi(kptr+1); } KLcount++; if (nok < KANJARRAYSIZE) nok++; continue; } } KDskip = FALSE; while ((cc = repstr[schix]) != 0x0a) { if (cc == 0x0d) break; if (RVACTIVE && (schix == roff)) strcat (KLine,RVon); if (RVACTIVE && (schix == roff+srchlen)) strcat (KLine,RVoff); if ((Dmode == 0) && (cc == '[')) { ops[0] = 0xa1; ops[1] = 0xca; ops[2] = 0; /* JIS ( */ strcat(KLine,ops); schix++; continue; } if ((Dmode == 0) && (cc == ']')) { ops[0] = 0xa1; ops[1] = 0xcb; ops[2] = 0; /* JIS ( */ strcat(KLine,ops); schix++; continue; } if (KDskip) { if (cc == ' ')KDskip = FALSE; schix++; continue; } if (cc < 128) /* non-Japanese, display it (fix up the EDICT "/") */ { ops[0]= cc; ops[1] = '\0'; if (cc == SPTAG) { if (prieng) { strcat (KLine,RVon); engrv = TRUE; } schix++; continue; } if (!isalnum(cc) && engrv) { engrv = FALSE; strcat (KLine,RVoff); } if (KDNSflag && (prevch == ' ') && (Dmode != 0)) { if (strstr(KDNSlist,ops) != NULL) { KDskip = TRUE; schix++; continue; } } prevch = cc; if ((Dmode == 1) && (cc == '}')) /* { */ { ops[0] = ';'; if ((repstr[schix+2] == 0x0a) && (ops[0] == ';')) ops[0] = '\0'; } if ((Dmode == 1) && (cc == '{')) { KDNSflag = FALSE; schix++; continue; } if ((Dmode == 0) && (ops[0] == '/')) { if (!EngFirst) { ops[0] = ';'; ops[1] = ' '; ops[2] = 0; } else { EngFirst = FALSE; ops[0] = 0; } } if ((repstr[schix+1] == 0x0a) && (ops[0] == ';')) ops[0] = '\0'; if ((repstr[schix+1] == 0x0d) && (ops[0] == ';')) ops[0] = '\0'; strcat(KLine,ops); } else /* kana or kanji */ { if (cc == 0x8f) { KOutc(0x8f); schix++; continue; } if (khi == 0) { khi = cc; } else { klo = cc; KOutc(khi); KOutc(klo); khi = 0; } } schix++; } /* end of line display loop */ if (GDmode && (Dmode == 0)) return; /* early return from global*/ if (Dmode == 0) KFlushRes = KFlush("Continue displaying matches? (y/n)"); if ((Dmode == 1)&&(KLRmode == 0)) KFlushRes = KFlush("Continue displaying matches? (y/n)"); } /* of "once-per-line" test */ it++; if ((Dmode == 0)||((Dmode ==1)&&(KLRmode == 0))) { if (!KFlushRes) return; } } /* end of the "while it matches loop */ if (!DispHit) printf("No display for this key (filtered or non-initial kanji)\n"); if ((Dmode == 1)&&(KLRmode == 1)) { if (nok >= KANJARRAYSIZE) printf("\nWarning! Kanji table overflow!\n"); if (nok == 0) return; /* Thanks to Bruce Raup for the casting which fixed the compilation * warning in the following qsort() call */ qsort(&karray,nok,sizeof(karray[0]),(int (*) (const void *, const void *)) kcmp); for (i = 0; i < nok; i++) { if ((i != 0) && (karray[i][2] == karray[i-1][2]) && (karray[i][3] == karray[i-1][3]) && (karray[i][4] == karray[i-1][4])) continue; KOutc(karray[i][2]); KOutc(karray[i][3]); if (karray[i][2] == 0x8f) KOutc(karray[i][4]); KOutc(' '); } KFlushRes = KFlush("Continue displaying kanji (y/n)"); } if ((Dmode != 0) || (dind == 0)) return; if (EMmode == 0) return; printf("End of %d character matches. Continue for shorter matches? (y/n)\n\r",dind+1); ops[0] = getcharxx(); DRow = 1; fflush(stdin); if ((ops[0] == 'y')||(ops[0] == 'Y')) continue; if ((ops[0] != 'n')&&(ops[0] != 'N')) { if ((ops[0] != 0x0a) && (ops[0] != 0x0d)) ungetc(ops[0],stdin); } break; } /* end of the dind loop */ } /* end of lookup */ /*======RadSet=== set up Radicals for bushu search=================*/ void RadSet() { int i,errf; unsigned char rstr[20]; FILE *fpr, *fopen(); fpr = xfopen(Rname,"r", &xfilelen); i = 0; while(TRUE) { errf = (fgets(rstr,19,fpr) == NULL); if (feof(fpr)||errf) break; while(rstr[strlen(rstr)-1] < 0x20) rstr[strlen(rstr)-1] = 0; if (rstr[3] == '0') continue; radkanj[i][0] = rstr[0]; radkanj[i][1] = rstr[1]; if (rstr[3] == '(') { radnos[i] = atoi(rstr+4); } else { radnos[i] = atoi(rstr+3); } i++; } fclose(fpr); return; } /*=====DispLic======display GPL ==============================*/ void DispLic() { FILE *flic,*fopen(); flic = xfopen(GPL_File,"r", &xfilelen); DRow = 1; DCol = 0; while (!feof(flic)) { fgets(KLine,81,flic); if (feof(flic)) { KFlush(""); return; } KLine[strlen(KLine)-1] = 0; if(!KFlush("Continue Licence Display? (y/n)")) return; } } /*=====DoRADICALS===display Theresa's Radical File================*/ void DoRADICALS() { int errf,j; unsigned char rstr[20]; FILE *fpr, *fopen(); fpr = xfopen(Rname,"r", &xfilelen); printf("\n RADICAL DISPLAY \n"); DRow = 3; DCol = 0; KLine[0] = 0; fseek(stdin,0L,SEEK_END); /*kill any leftovers*/ j = 0; while(TRUE) { errf = (fgets(rstr,19,fpr) == NULL); if (feof(fpr)||errf) { KFlush(""); fseek(stdin,0L,SEEK_END); /*kill any leftovers*/ return; } while(rstr[strlen(rstr)-1] < 0x20) rstr[strlen(rstr)-1] = 0; if ((rstr[strlen(rstr)-2] == ' ')&&(rstr[strlen(rstr)-1] == '0')) { KFlushRes = KFlush("Continue displaying radicals? (y/n)"); if (!KFlushRes) return; strcpy(KLine," "); KFlushRes = KFlush("Continue displaying radicals? (y/n)"); if (!KFlushRes) return; rstr[2] = 0; sprintf(tempout,"%s Stroke Radicals ",rstr); strcpy(KLine,tempout); KFlushRes = KFlush("Continue displaying radicals? (y/n)"); if (!KFlushRes) return; strcpy(KLine," "); KFlushRes = KFlush("Continue displaying radicals? (y/n)"); if (!KFlushRes) return; continue; } strcat(KLine,"\t"); KOutc(rstr[0]); KOutc(rstr[1]); KOutc(0xa1); KOutc(0xa1); sprintf(tempout,"%s ",rstr+3); strcat(KLine,tempout); } KFlush(""); } /*=========KLookup=== Special front-end to Lookup for Kanji searches==========*/ void KLookup() { if (KLmode == 0) /* Long display mode, just pass on call */ { KLRmode = 0; Lookup(); return; } /* Short display mode - see how many there */ KLRmode = 1; Lookup(); if (KLcount == 1) /* only one - force long display */ { KLRmode = 0; Lookup(); } return; } /*=========DoJIS === JIS kanji lookup==========================================*/ void DoJIS() { int i,ktf,sjf,hojof,i1,i2; unsigned char cj; ktf = FALSE; sjf = FALSE; hojof = FALSE; cbreakoff(); scanf("%s",instr); cbreakon(); fflush(stdin); cj = instr[0]; if ((cj == '-') || (cj == 'k') || (cj == 'K')) { ktf = TRUE; strcpy(instr,instr+1); } else if ((cj == 's')||(cj == 'S')) { sjf = TRUE; strcpy(instr,instr+1); } cj = instr[0]; if ((cj == 'h') || (cj == 'H')) { hojof = TRUE; strcpy(instr,instr+1); } if (ktf) { for (i = 0;i <4; i++) { if ((instr[i] >= '0') && (instr[i] <= '9'))instr[i] = instr[i] - '0'; } instr[0] = (instr[0]*10+instr[1]+0x20) | 0x80; instr[1] = (instr[2]*10+instr[3]+0x20) | 0x80; instr[2] = 0; } else { for (i = 0;i <4; i++) { if ((instr[i] >= '0') && (instr[i] <= '9'))instr[i] = instr[i] - '0'; if ((instr[i] >= 'a') && (instr[i] <= 'f'))instr[i] = instr[i]-'a'+0x0a; if ((instr[i] >= 'A') && (instr[i] <= 'F'))instr[i] = instr[i]-'A'+0x0a; } if(sjf) { i1 = (instr[0] << 4) + instr[1]; i2 = (instr[2] << 4) + instr[3]; sjis2jis(&i1,&i2); instr[0] = i1 | 0x80; instr[1] = i2 | 0x80; instr[2] = 0; } else { instr[0] = ((instr[0] << 4) + instr[1]) | 0x80; instr[1] = ((instr[2] << 4) + instr[3]) | 0x80; instr[2] = 0; } } Dmode =1; fbuff[0] = 0; fbuff[1] = 0; if (hojof) fbuff[0] = 0x8f; strcat(fbuff,instr); fseek(stdin,0L,SEEK_END); /*kill any leftovers*/ KLookup(); instr[0] = 0; } /*===== GetKBStr=== Collect ASCII or JIS string from keyboard=========*/ void GetKBStr(unsigned char *prompt) { int ShowIt,escf,bit8,i; unsigned char c; escf = FALSE; bit8 = FALSE; c='x'; /*keep lint happy*/ ShowIt = FALSE; for (i = 0; (c != 0xd) && (c != 0xa); i++) { instr[i+1] = 0; c = getcharxx(); if (!bit8 && !escf && ((c == '@') || (c == '#'))) { DoRomaji(c); break; } if (c == 0x1b) escf = TRUE; if (c > 0x7f) bit8 = TRUE; if ((c == 0x7f) || (c == 8)) { if(bit8) i--; if( i > 0) instr[--i] = 0; i--; strcpy(fbuff,instr); if (!NoSJIS) FixSJIS(fbuff); printf("\r \r"); printf("%s%s%s ",RVon,prompt,RVoff); KOut(fbuff); continue; } instr[i] = c; if (!escf) { if (!bit8) { printf("\r \r"); printf("%s%s%s %s",RVon,prompt,RVoff,instr); } else { strcpy(fbuff,instr); if ((strlen(fbuff) % 2) > 0) fbuff[strlen(fbuff)-1] = 0; printf("\r \r"); printf("%s%s%s ",RVon,prompt,RVoff); if (!NoSJIS) FixSJIS(fbuff); KOut(fbuff); } } if ((instr[i] == 'B')&&(instr[i-1] == '(')&&(instr[i-2] == 0x1b)) { ShowIt = TRUE; break; } } fseek(stdin,0L,SEEK_END); /*kill any leftovers*/ fflush(stdin); GetEUC(fbuff); if ( fbuff[strlen(fbuff)-1] < 0x20) fbuff[strlen(fbuff)-1] = 0; if (ShowIt) { printf("\r \r"); printf("%s%s%s ",RVon,prompt,RVoff); KOut(fbuff); } printf("\n\r"); } /*===== OneShot === Collect and set single filter=============*/ void OneShot() { printf("\nFilter inactivated. Enter new filter, or press return\n\n"); printf("%sFILTER:%s ",RVon,RVoff); SFFlag = FALSE; GetKBStr("FILTER:"); strcpy(SingleFilter,fbuff); if (strlen(fbuff) >= 2) { SFFlag = TRUE; printf("Filter set to: "); KOut(fbuff); printf("\n"); } else { printf("No filter set\n"); } } /*====FindRad=== finds the spot in the table for a radical==========*/ int FindRad(unsigned char char1, unsigned char char2) { int i,j,k,Found; Found = FALSE; for (i = 0; i <= NoRads; i++) { if ((char1 == RadK1[i]) && (char2 == RadK2[i])) { Found = TRUE; break; } } if (!Found) return(-1); return(i); } /*===RadBuild==Extracts the kanji that meet the multi-radical selection===*/ void RadBuild() { /* RKTarg will contain the string of target "radicals" The RKSet tables are progressively loaded with the kanji that meet the radical criteria */ int stest,jtest,i,j,k,l,m,n,lind,hitcount; /* the first radical has all its kanji loaded (which meet any stroke count test) */ i = FindRad((unsigned char)RKTarg[0],(unsigned char)RKTarg[1]); if (i < 0) { printf("Invalid Radical!\n"); RKTarg[0] = 0; return; } k = 0; hitcount = 0; for (j = RKStart[i]; j < RKStart[i]+RKCnt[i]; j++) { if (kstrokelim > 0) { n = ((RKanj1[j] & 0x7f)-0x30)*94 + ((RKanj2[j] & 0x7f) - 0x21); if ((kstroketype == 0) && (kstrokelim != kstrokes[n])) continue; if ((kstroketype == 1) && (kstrokelim > kstrokes[n])) continue; if ((kstroketype == 2) && (kstrokelim < kstrokes[n])) continue; } RKSet[0][k] = RKanj1[j]; RKSet[0][k+1] = RKanj2[j]; RKSet[0][k+2] = 0; hitcount++; k+=2; } ops[0] = RKTarg[0]; ops[1] = RKTarg[1]; ops[2] = 0; printf("Target Radicals: 0 "); KOut(ops); printf(" (%d) ",hitcount); NoSets = 1; if (strlen(RKTarg) <= 2) { printf("\n"); return; } /* The second and subsequent radicals only have their matching kanji loaded if they are a member of the previous set */ for (l=2; l< strlen(RKTarg); l+=2) { lind = (l/2)-1; i = FindRad((unsigned char)RKTarg[l],(unsigned char)RKTarg[l+1]); ops[0] = RKTarg[l]; ops[1] = RKTarg[l+1]; ops[2] = 0; printf(" %d ",NoSets); KOut(ops); if (i < 0) { printf("\nInvalid Radical!\n"); RKTarg[l] = 0; return; } k = 0; RKSet[lind+1][k] = 0; jtest = RKStart[i]+RKCnt[i]; for (j = RKStart[i]; j < jtest; j++) { for (n = 0; RKSet[lind][n] != 0; n+=2) { if ((RKSet[lind][n] == RKanj1[j]) && (RKSet[lind][n+1] == RKanj2[j])) { RKSet[lind+1][k] = RKanj1[j]; RKSet[lind+1][k+1] = RKanj2[j]; RKSet[lind+1][k+2] = 0; k+=2; break; } } } NoSets++; printf(" (%d) ",strlen(RKSet[NoSets-1])/2); } printf("\n"); } /*=====RadDisp===Display Radical Data==============================*/ void RadDisp() { FILE *fk,*fopen(); int j,k,l,n; unsigned char *ptr; fk = xfopen(RKname,"r", &xfilelen); j = 0; printf("RADICAL TABLE FOR USE WITH THE XJDIC RADICAL LOOKUP FUNCTION\n"); DRow = 0; DCol = 0; k = 99; KLine[0] = 0; while(!feof(fk)) { fgets(testline,199,fk); if(feof(fk)) break; if (testline[0] != '$') continue; ptr = strtok(testline+4," "); l = atoi(ptr); if (l != k) { k = l; for (n = 0; n < strlen(ptr); n++) { if (ptr[n] < 32) break; KOutc(0xa3); KOutc(ptr[n] | 0x80); } KOutc(' '); } KOutc(testline[2]); KOutc(testline[3]); KOutc(' '); } fclose(fk); KFlush(""); } /*===KanjRad=== Display which "radicals" are used to imdex this kanji=====*/ void KanjRad() { int i,j; printf("%sWhich Kanji:%s",RVon,RVoff); GetKBStr("Which Kanji:"); if (fbuff[0] < 127) return; strcpy(KLine,"Kanji: "); KOutc(fbuff[0]); KOutc(fbuff[1]); strcat(KLine," Elements: "); DRow = 0; DCol = 0; for (i = 0; i <= NoRads; i++) { for (j = RKStart[i]; j < RKStart[i]+RKCnt[i]; j++) { if ((fbuff[0] == RKanj1[j]) && (fbuff[1] == RKanj2[j])) { KOutc(RadK1[i]); KOutc(RadK2[i]); KOutc(' '); } } } KFlush(""); } /*====RadKDisp=====display selected kanji============================*/ void RadKDisp() { int i; if (RKTarg[0] == 0) return; if (NoSets == 0) return; printf("Selected Kanji: "); for (i = 0; i < strlen(RKSet[NoSets-1]); i+=2) { ops[0] = RKSet[NoSets-1][i]; ops[1] = RKSet[NoSets-1][i+1]; ops[2] = 0; KOut(ops); printf(" "); } printf("\n"); } /*====DoLOOKUP=====driver routine for the multi-radical lookup=======*/ void DoLOOKUP() { int i; printf("\nRadical Lookup Mode\n"); RKTarg[0] = 0; while(TRUE) { printf("%sLookup Code:%s",RVon,RVoff); GetKBStr("Lookup Code:"); if (fbuff[0] > 127) { ops[0] = fbuff[0]; ops[1] = fbuff[1]; ops[2] = 0; if (strlen(RKTarg) == 20) { printf("\nToo many radicals!\n"); continue; } strcat(RKTarg,ops); RadBuild(); if(NoSets == 0) continue; if (strlen(RKSet[NoSets-1]) == 0) continue; if (strlen(RKSet[NoSets-1]) <=RADLOOKLIM) RadKDisp(); continue; } if ((fbuff[0] | 0x20) == 'r') { RadDisp(); continue; } if ((fbuff[0] | 0x20) == 'v') { KanjRad(); continue; } if ((fbuff[0] | 0x20) == 'x') { instr[0] = 0; fflush(stdin); return; } if ((fbuff[0] | 0x20) == 'c') { RKTarg[0] = 0; kstrokelim = 0; printf("Cleared\n"); continue; } if ((fbuff[0] | 0x20) == 's') { kstroketype = 0; i = 1; testline[0] = 0; if (fbuff[1] == '+') { kstroketype = 1; strcat(testline," >= "); i = 2; } if (fbuff[1] == '-') { kstroketype = 2; strcat(testline," <= "); i = 2; } kstrokelim = atoi(fbuff+i); if (kstrokelim == 0) { printf("Stroke-count cleared\n"); } else { printf("Stroke-count set to %s%d\n",testline,kstrokelim); } if (strlen(RKTarg) > 0) RadBuild(); if (NoSets <= 0) continue; if (strlen(RKSet[NoSets-1]) <=RADLOOKLIM) RadKDisp(); continue; } if ((fbuff[0] | 0x20) == 'd') { i = fbuff[1]-'0'; if (i >= strlen(RKTarg)/2) { printf("Out of Range!\n"); continue; } strcpy(RKTarg+i*2,RKTarg+i*2+2); if(strlen(RKTarg) > 0) RadBuild(); if (strlen(RKSet[NoSets-1]) <=RADLOOKLIM) RadKDisp(); continue; } if ((fbuff[0] | 0x20) == 'l') RadKDisp(); } } /*===== DoKANJI === Kanji single lookup ======================*/ void DoKANJI() { GetKBStr("KANJI/KANA:"); Dmode =1; KLookup(); instr[0] = 0; } /*===EMtoggle==alternate between match display modes===============*/ void EMtoggle() { EMmode = (EMmode+1) % 2; printf("Exact Match Display Mode: %s\n",kmodes[EMmode]); } /*===togglekana==alternate between kana input modes===============*/ void togglekana() { KImode = (KImode+1) % 2; printf("Kana Default Input Mode: %s\n",kmodes[KImode]); } /*===togglekanji==alternate between kanji display modes===============*/ void togglekanji() { KLmode = (KLmode+1) % 2; printf("Long Kanji Display Mode: %s\n",kmodes[KLmode]); } /*===toggleraw===alternate between raw/edited output modes===============*/ void toggleraw() { ROmode = (ROmode+1) % 2; printf("Unedited Output Mode: %s\n",kmodes[ROmode]); } /*===RVtoggle===alternate between reverse video modes===============*/ void RVtoggle() { RVACTIVE = (RVACTIVE +1) % 2; printf("Reverse Video Match Display Mode: %s\n",kmodes_r[RVACTIVE ]); } /*===togglemode===alternate between kanji compound modes===============*/ void togglemode() { FirstKanj = (FirstKanj+1) % 2; printf("Display All Kanji Mode: %s\n",kmodes[FirstKanj]); } /*=====engpritoggle=====alternate between English priorities=======*/ void engpritoggle() { if(prieng == FALSE) { prieng = TRUE; printf("English search will now only select priority keys\n"); return; } prieng = FALSE; printf("English search will now select all keys\n"); } /*=====seldic=====select dictionary file =====================*/ void seldic() { int i; char c; if (NoDics == 1) { printf("No alternative dictionary active!\n"); return; } for (i = 1; i <= NoDics; i++) { printf("Dictionary: %d [%s]\n",i,DicName(i)); } printf ("Select a dictionary file (1-%d)\n",NoDics); c = getcharxx(); if ((c == 0x1b)||(c == 0xa)||(c == 0xd)) return; i = c-'0'; if ((i <0)||(i >NoDics)) { printf("INVALID!\n"); return; } CurrDic = i; printf("Active Dictionary is now #%d (%s)\n",CurrDic,DicName(CurrDic)); } /*=====BuffStats=====report on page buffer stats=====================*/ void BuffStats() { int i; #ifdef XJDDIC printf("DEMAND-PAGING STATISTICS:\n\n"); printf("Dic Hits: "); for (i=0;i<=NoDics;i++) printf("\t%ld ",dichits[i]); printf("\n"); printf("Dic Miss: "); for (i=0;i<=NoDics;i++) printf("\t%ld ",dicmiss[i]); printf("\n"); printf("Ind Hits: "); for (i=0;i<=NoDics;i++) printf("\t%ld ",indhits[i]); printf("\n"); printf("Ind Miss: "); for (i=0;i<=NoDics;i++) printf("\t%ld ",indmiss[i]); printf("\n"); printf("Buffer overwrites: \t%ld\n",vbkills); #else printf("CLIENT! NO BUFFER STATISTICS\n"); #endif } /*=====altdic=====rotate around dictionaries=======*/ void altdic(int dicincr) { if (NoDics == 1) { printf("No alternative dictionary active!\n"); return; } CurrDic = CurrDic + dicincr; if (CurrDic == NoDics+1) CurrDic = 1; if (CurrDic == 0) CurrDic = NoDics; printf("Switching to dictionary: %d [%s]\n",CurrDic,DicName(CurrDic)); } /*====GDicSet====== initialize the global dictionary list===============*/ void GDicSet() { char gdtemp[100],*gdp; if (NoDics == 1) { printf("No alternative dictionary active!\n"); return; } gdicmax = 0; printf("\nEnter the list of dictionary numbers for the global search\n"); printf("%sDictionary Numbers:%s",RVon,RVoff); GetKBStr("Dictionary Numbers:"); strcpy(gdtemp,fbuff); gdp = strtok(gdtemp," ,\t"); while(gdp!=NULL) { gdicnos[gdicmax] = atoi(gdp); gdp = strtok(NULL," ,\t"); gdicmax++; if (gdicmax > 9) { printf("Too many dictionary numbers!\n"); gdicmax--; break; } if (gdicnos[gdicmax-1] > NoDics) { printf("Illegal Dictionary number!\n"); gdicmax--; } } gdicmax--; if (gdicmax <1) { printf("Warning! Insufficient dictionaries set!\n"); } } /*====GDictoggle=== alternate between single & global dics==============*/ void GDictoggle() { int gi; if (GDmode) { GDmode = FALSE; printf("Global dictionary searching is now OFF\n"); } else { if (gdicmax <1) { printf("Insufficient dictionaries set!\n"); return; } GDmode = TRUE; printf("Global dictionary searching is now ON ["); for (gi=0;gi<=gdicmax;gi++) { printf("%d",gdicnos[gi]); if (gi != gdicmax) printf(" "); } printf("]\n"); } } /*====GDicALLtoggle=== alternate between single & multiple global dic disp====*/ void GDicALLtoggle() { if(GDALLmode) { GDALLmode = FALSE; printf("Multiple Global Display is now OFF\n"); } else { GDALLmode = TRUE; printf("Multiple Global Display is now ON\n"); } } /*====Verbtoggle=== alternate between deinflection on/off===============*/ void Verbtoggle() { if (Jverb) { Jverb = FALSE; printf("Verb deinflection is now OFF\n"); } else { Jverb = TRUE; printf("Verb deinflection is now ON\n"); } } /*=== FiltSet=== turn filters on & off==============================*/ void FiltSet() { unsigned char c,fff[10]; int anyfilt,j,k; anyfilt = FALSE; printf("%sFilter Setting%s\n",RVon,RVoff); for(j = 0;j < NOFILT;j++) { if(!filtact[j])continue; anyfilt = TRUE; strcpy(fff,"OFF"); if(filton[j])strcpy(fff,"ON "); printf("No: %d Type: %d Status: %s Name: %s\n",j,filttype[j],fff,filtnames[j]); } if (!anyfilt) { printf("No filters are loaded!\n"); return; } printf("Modify which Filter?\n"); c = getcharxx(); if ((c == 0x1b)||(c == 0xa)||(c == 0xd)) return; k = c-'0'; if ((k <0)||(k >NOFILT)) { printf("INVALID!\n"); return; } if (!filtact[k]) { printf("Filter %c is not active!\n",c); return; } printf("Filter %c OFF (0) or ON (1)\n",c); c = getcharxx(); if ((c != '0') && (c != '1'))return; if(c == '0') { filton[k] = FALSE; printf("Filter %d Turned OFF\n",k); } if(c == '1') { filton[k] = TRUE; printf("Filter %d Turned ON\n",k); } nofilts = FALSE; for(j = 0;j < NOFILT;j++)if(filton[j])nofilts=TRUE; return; } /* M A I N */ main(argc,argv) int argc; unsigned char **argv; { int i,j,ip,cmdmode,bit8,escf; unsigned char *dicenv,strtmp[50]; unsigned char c; unsigned char xap[50]; unsigned char kbprompt[99]; unsigned char kbprompt2[99]; printf("XJDIC Version %s (Japanese Dictionary) Copyright J.W.Breen 2003.\n",sver); #ifdef XJDDIC printf(" Stand-alone mode\n"); #else printf(" Client mode\n"); #endif for (i=0;i 1) { for (i = 1; i < argc; i++) { strcpy(xap,argv[i]); if ((xap[0] == '-') && (xap[1] == 'c')) { if(xap[2] != 0) { strcpy(strtmp,xap+2); } else { i++; strcpy(xap,argv[i]); strcpy (strtmp,xap); } strcpy (cl_rcfile,strtmp); printf ("Using control-file: %s\n",cl_rcfile); } if ((xap[0] == '-') && (xap[1] == 'j')) { if(xap[2] != 0) { strcpy(strtmp,xap+2); } else { i++; strcpy(xap,argv[i]); strcpy (strtmp,xap); } if (strtmp[0] == 'j') { Omode = 0; printf("Output mode set to JIS\n"); } if (strtmp[0] == 's') { Omode = 2; printf("Output mode set to Shift-JIS\n"); } if (strtmp[0] == 'e') { Omode = 1; printf("Output mode set to EUC\n"); } continue; } #ifdef XJDCLSERV if ((xap[0] == '-') && (xap[1] == 'S')) { if(xap[2] != 0) { strcpy(host,xap+2); } else { i++; strcpy(xap,argv[i]); strcpy(host,xap); } printf("Command-line request to use server: %s\n",host); continue; } if ((xap[0] == '-') && (xap[1] == 'P')) { if(xap[2] != 0) { portno = atoi(xap+2); } else { i++; strcpy(xap,argv[i]); portno = atoi(xap); } printf("Command-line request to use port: %d\n",portno); continue; } #endif #ifdef XJDDIC if ((xap[0] == '-') && (xap[1] == 'C')) { if(xap[2] != 0) { strcpy(strtmp,xap+2); } else { i++; strcpy(xap,argv[i]); strcpy (strtmp,xap); } strcpy (Clip_File,strtmp); printf ("Using clipboard-file: %s\n",Clip_File); } if ((xap[0] == '-') && (xap[1] == 'd')) { if (thisdic == 0) { thisdic = 1; } else { thisdic++; NoDics++; } if(xap[2] != 0) { strcpy(strtmp,xap+2); } else { i++; strcpy(xap,argv[i]); strcpy (strtmp,xap); } strcpy (Dnamet[thisdic],strtmp); strcpy (XJDXnamet[thisdic],strtmp); strcat (XJDXnamet[thisdic],".xjdx"); printf("Command-line request to use dictionary files (%d): %s and %s\n", thisdic,Dnamet[thisdic],XJDXnamet[thisdic]); continue; } if ((xap[0] == '-') && (xap[1] == 'k')) { if(xap[2] != 0) { strcpy(strtmp,xap+2); } else { i++; strcpy(xap,argv[i]); strcpy (strtmp,xap); } strcpy (Dnamet[0],strtmp); strcpy (XJDXnamet[0],strtmp); strcat (XJDXnamet[0],".xjdx"); printf("Command-line request to use kanji dictionary files: %s and %s\n",Dnamet[0],XJDXnamet[0]); continue; } #endif if ((xap[0] == '-') && (xap[1] == 'V')) { RVACTIVE = FALSE; printf("Reverse-video match display disabled\n"); } if ((xap[0] == '-') && (xap[1] == 'E')) { NoSJIS = TRUE; printf("EUC (No Shift-JIS) operation enforced\n"); } if ((xap[0] == '-') && (xap[1] == 'v')) { Jverb = FALSE; printf("Verb deinflection turned OFF\n"); } if ((xap[0] == '-') && (xap[1] == 'h')) { printf("\nUSAGE: xjdic \n\nwhere options are:\n\n"); printf(" -h this information\n"); printf(" -c control-file\n"); #ifdef XJDCLSERV printf(" -P port-no\n"); printf(" -S server\n"); #else printf(" -d dictionary file_path\n"); printf(" -k kanji-dictionary file_path\n"); #endif printf(" -v disable verb function\n"); printf(" -j x (where x is Output code: e = EUC, s = Shift-JIS, j = JIS)\n"); printf(" -V disable reverse video display\n"); printf(" -C clipboard-file\n"); printf("\nSee xjdic24.inf for full information\n"); exit(0); } } } xjdicrc(); #ifdef XJDDIC printf ("Loading Dictionary and Index files. Please wait...\n"); #endif Verbinit(); DicSet (); RadSet(); RadLoad(); KSLoad(); LoadKana(); togglemode(); togglekanji(); cbreakon(); printf("\n(Enter ? for a summary of operating instructions)\n"); /* From here on, the code loops endlessly, reading commands from the keyboard. This code decodes any kana/kanji/romaji itself, rather than using the "GetKBStr" function, as it has to sort out special commands as well. */ while (TRUE) { GetWinSize(); /* Just in case the screen has changed */ sprintf(kbprompt,"%sXJDIC [%d:%s] SEARCH KEY:%s ",RVon,CurrDic,DicName(CurrDic),RVoff); sprintf(kbprompt2,"XJDIC [%d:%s] SEARCH KEY: ",CurrDic,DicName(CurrDic)); if (GDmode) { sprintf(kbprompt,"%sXJDIC [GLOBAL] SEARCH KEY:%s ",RVon,RVoff); sprintf(kbprompt2,"XJDIC [GLOBAL] SEARCH KEY: "); } printf("\n\r%s",kbprompt); c = 0; cmdmode = FALSE; strf = FALSE; escf = FALSE; bit8 = FALSE; AKanaMode = FALSE; if (KImode == 0) AKanaMode = TRUE; for (i = 0; (c != 0xd) && (c != 0xa); i++) { instr[i+1] = 0; if (clipmode) break; c = getcharxx(); if (c == 0x1b) { escf = TRUE; AKanaMode = FALSE; } if (c > 0x7f) { bit8 = TRUE; AKanaMode = FALSE; } if (!bit8 && !escf && (c == 0x04)) /* Simulate ^D */ { cbreakoff(); exit(0); } if (!bit8 && !escf && (c == 0x1a)) /* Simulate ^Z */ { cbreakoff(); printf("\nSuspending XJDIC. Type `fg' to resume.\n"); pid = getpid(); kill(pid,sig); cbreakon(); break; } /* Romaji Input */ if (!bit8 && !escf && ((c == '@') || (c == '#'))) { DoRomaji(c); break; } /* On-line Help Summmary */ if ((c == '?') && (!escf) && (!bit8)) { DRow = 0; for (ip = 0; strcmp(Help[ip],"$$$")!=0;ip++) { strcpy(KLine,Help[ip]); if(!KFlush("Continue Help Display? (y/n)")) break; } break; } /* Turn on cmd mode for special characters */ if ((!escf) && (!bit8) && (strchr("!{}$%*&^=/-:\'+\\;][|_`",c) != NULL)) { cmdmode = TRUE; break; } /* backspace or rubout - shrink i/p buffer and redisplay */ if ((c == 0x7f) || (c == 8)) { if(bit8) i--; if( i > 0) instr[--i] = 0; i--; strcpy(fbuff,instr); if (!NoSJIS) FixSJIS(fbuff); printf("\r \r"); printf("%s",kbprompt); KOut(fbuff); continue; } /* Actually an input character */ instr[i] = c; if (AKanaMode) { if ((c == 'l') || (c == 'L')) { AKanaMode = FALSE; GetKBStr(kbprompt2); break; } if (c < 128) { ungetc(c,stdin); DoRomaji('@'); break; } } if (!escf) { if (!bit8) { printf("\r \r"); printf("%s%s",kbprompt,instr); } else { strcpy(fbuff,instr); if ((strlen(fbuff) % 2) > 0) fbuff[strlen(fbuff)-1] = 0; printf("\r \r"); printf("%s",kbprompt); if (!NoSJIS) FixSJIS(fbuff); KOut(fbuff); } } /* JIS ShiftOUT, so terminate input */ if ((instr[i] == 'B')&&(instr[i-1] == '(')&&(instr[i-2] == 0x1b)) break; } fseek(stdin,0L,SEEK_END); /*kill any leftovers*/ /* "bye" is the end of the run */ if ((instr[2] == 'e')&&(instr[1] == 'y')&&(instr[0] == 'b')) { cbreakoff(); exit(0); } /* sort out the special commands */ if(cmdmode) { if (c == '{') /* } to balance {} */ { printf("\r \r"); printf("Now in Clipboard Mode\n"); clipmode = TRUE; continue; } if (c == '}') /* matching { */ { printf("\r \r"); RVtoggle(); continue; } if (c == '/') { printf("\r \r"); togglemode(); continue; } if (c == '!') { printf("\r \r"); DispLic(); continue; } if (c == '|') { printf("\r \r"); toggleraw(); continue; } if (c == '+') { printf("\r \r"); engpritoggle(); continue; } if (c == '&') { printf("\r \r"); togglekana(); continue; } if (c == '-') { printf("\r \r"); togglekanji(); continue; } if (c == ']') { printf("\r \r"); ExtFileDisp(); continue; } if (c == '=') { printf("\r \r"); altdic(+1); continue; } if (c == '^') { printf("\r \r"); altdic(-1); continue; } if (c == '_') { printf("\r \r"); seldic(); continue; } if (c == '\'') { printf("\r \r"); OneShot(); continue; } if (c == ';') { printf("\r \r"); FiltSet(); continue; } if (c == ':') { printf("\r \r"); Verbtoggle(); continue; } if (c == '[') { printf("\r \r"); EMtoggle(); continue; } if (c == '$') { printf("\r \r"); GDicSet(); continue; } if (c == '`') { printf("\r \r"); GDicALLtoggle(); continue; } if (c == '%') { printf("\r \r"); GDictoggle(); continue; } if (c == '*') { #ifdef DEMAND_PAGING printf("\r \r"); BuffStats(); #else printf("\nNo statistics in this mode!\n"); #endif continue; } /* none of the above, so it must be a Kanji search */ printf("\r \r"); printf("%sKANJI LOOKUP TYPE:%s ",RVon,RVoff); c = getcharxx(); switch (c) { case 'c' : /* a KANJIDIC Index Code */ case 'C' : printf("\r \r"); printf("%sINDEX CODE:%s",RVon,RVoff); GetKBStr("INDEX CODE:"); fflush(stdin); Dmode =1; strcat(fbuff," "); /* For bushu or classical radical, ask for stroke count */ if (((fbuff[0] | 0x20) == 'b')||((fbuff[0] | 0x20) == 'c')) { if (fbuff[1] >= 0xb0) /* test for "bKANJI" */ { for (i=0;i<250;i++) { if((fbuff[1] != radkanj[i][0]) || (fbuff[2] != radkanj[i][1])) continue; sprintf(strtmp,"%d",radnos[i]); strcpy(fbuff+1,strtmp); strcat(fbuff," "); printf("Bushu: %s\n",strtmp); break; } if (i == 250) { printf("Invalid Bushu. Assuming B1 \n"); strcpy(fbuff,"B1 "); } } printf("\r \r"); printf("%sSTROKE COUNT (0 selects all):%s",RVon,RVoff); cbreakoff(); fgets(instr,3,stdin); i = atoi(instr); sprintf(strfilt,"S%d",i); cbreakon(); fflush(stdin); fseek(stdin,0L,SEEK_END); /*kill any leftovers*/ strf = TRUE; if (atoi(strfilt+1) == 0) strf = FALSE; } KLookup(); instr[0] = 0; break; case 'm' : /* "meaning" */ case 'M' : printf("\r \r"); printf("%sMEANING:%s",RVon,RVoff); cbreakoff(); scanf("%s",instr); cbreakon(); fflush(stdin); Dmode =1; strcpy(fbuff,instr); fseek(stdin,0L,SEEK_END); /*kill any leftovers*/ KLookup(); instr[0] = 0; break; case 'j' : /* JIS code */ case 'J' : printf("\r \r"); printf("%sJIS CODE:%s",RVon,RVoff); DoJIS(); break; case 'r' : case 'R' : DoRADICALS(); break; case 'l' : case 'L' : DoLOOKUP(); break; case 'k' : case 'K' : DoKANJI(); break; default : ungetc(c,stdin); DoKANJI(); break; } } if (clipmode) { while(TRUE) { sleep(2); fclip = fopen(Clip_File,"r"); if (fclip == NULL) { printf("\nNo Clipboard file! (returning to normal mode.)\n"); strcpy(clipstring1,"XXXX"); strcpy(clipstring2,"XXXX"); clipmode = FALSE; break; } fgets(clipstring1,50,fclip); fclose(fclip); if (clipstring1[strlen(clipstring1)-1] < 32) clipstring1[strlen(clipstring1)-1] = 0; if (strcmp(clipstring1,"quit") == 0) { clipmode = FALSE; printf("\nLeaving Clipboard mode\n"); break; } if (strcmp(clipstring1,clipstring2) == 0) { continue; } else { strcpy(clipstring2,clipstring1); strcpy(instr,clipstring1); break; } } } if(strlen(instr) < 2) continue; GetEUC(fbuff); if (escf) KOut(fbuff); sprintf(tempout,"\nSearching for: %s%s%s\n",RVon,fbuff,RVoff); KOut(tempout); Dmode = 0; if (prieng && (fbuff[0] < 128)) /* if priority English key only */ { j = strlen(fbuff); fbuff[j+1] = 0; for (i=0 ; i < j ; i++) fbuff[i+1] = fbuff[i]; fbuff[0] = SPTAG; } Lookup(); } } xjdsa.c0100644000076400007640000001216006572116530010477 0ustar jwbjwb/************************************************************************** * X J D S A * * * * This is the bit that emulates a server for the stand-alone * * version * * * * Japanese-English Dictionary program (X11 version) * * Author: Jim Breen * ***************************************************************************/ /* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include #include #include "xjdic.h" unsigned char Dnamet[10][100],XJDXnamet[10][100]; unsigned char CBname[100]; unsigned char *dicbufft[10]; unsigned long diclent[10], indlent[10],indptrt[10]; int NoDics,CurrDic; int iterlimit; /* extern int TRIGGER; */ void xjdserver (int type, int dic_no, long index_posn, int sch_str_len, unsigned char *sch_str, int *sch_resp, long *res_index, int *hit_posn, int *res_len, unsigned char *res_str, long *dic_loc ); /*===xjserver===front-end routine for the dictionary lookup engine========*/ void xjdserver (int type, int dic_no, long index_posn, int sch_str_len, unsigned char *sch_str, int *sch_resp, long *res_index, int *hit_posn, int *res_len, unsigned char *res_str, long *dic_loc ) /* This function handles all access to the dictionary files and indices. The accesses have been consolidated here to cater for an alternative function which makes requests on a server. If called with type == XJ_FIND, it searches in the indicated dictionary for the first occurrence of the matching string, and returns the entry and its location, Return code is XJ_OK. If called with type == XJ_ENTRY, it returns the entry and its location, provided that entry matches the string. If called with type == XJ_GET, it returns the entry and its location. All failing calls result in a return code of XJ_NBG. */ { long lo, hi, itok, lo2, hi2, schix, schiy; extern long it; int res, i; hi = indptrt[dic_no]; if (type == XJ_FIND) { lo = 1; iterlimit = MAXITER; while(TRUE) { if (!iterlimit--) break; it = (lo+hi)/2; /* if (TRIGGER) printf("Calling KSTRCMP - 1\n"); */ res = Kstrcmp(sch_str_len,sch_str); if (res == 0) { itok = it; lo2 = lo; hi2 = it; while (TRUE) { if(lo2+1 >= hi2) break; it = (lo2+hi2)/2; /* if (TRIGGER) printf("Calling KSTRCMP - 1.5\n"); */ res = Kstrcmp(sch_str_len,sch_str); if (res == 0) { hi2 = it; itok = it; continue; } else { lo2 = it+1; } } it = itok; res = 0; break; } if (res < 0) { hi = it-1; } else { lo = it+1; } if (lo > hi) break; } if (res != 0) { *sch_resp = XJ_NBG; return; } /* as the above sometimes misses the first matching entry, step back to the first */ while (TRUE) { /* if (TRIGGER) printf("Calling KSTRCMP - 2\n"); */ if(Kstrcmp(sch_str_len,sch_str) == 0) { it--; if (it == 0) { it = 1; break; } continue; } else { it++; break; } } } /* Get next entry. Check (a) if the caller hasn't gone off the end of the table, and (b) if the (next) entry matches. */ if (type == XJ_ENTRY) { if (index_posn > hi) { *sch_resp = XJ_NBG; return; } it = index_posn; /* if (TRIGGER) printf("Calling KSTRCMP - 3\n"); */ res = Kstrcmp(sch_str_len,sch_str); if (res != 0) { *sch_resp = XJ_NBG; return; } } if (type == XJ_GET) { if (index_posn > hi) { *sch_resp = XJ_NBG; return; } it = index_posn; } /* Common code to set up the return parameters for both call types */ schix = jindex(it); schiy = schix; *res_index = it; /* back off to the start of this line */ while ((dbchar(schix) != 0x0a) && (schix >= 0)) schix--; schix++; *hit_posn = schiy - schix; *dic_loc = schix; for (i = 0; dbchar(schix+i) != 0x0a; i++) { if (i == 512) { printf ("Reply overrun\n"); exit(1); } res_str[i] = dbchar(schix+i); } res_str[i+0] = 0x0a; /* NL tells user s/w that it is the end of an entry */ res_str[i+1] = 0; *res_len = strlen(res_str); /* if (TRIGGER) printf("STR: %s\n",res_str); */ *sch_resp = XJ_OK; return; } xjdservcomm.c0100644000076400007640000002726407665046300011743 0ustar jwbjwb/************************************************************************** * X J D S E R V C O M M (V2.0) * * Japanese-English Dictionary program (X11 version) * * * * These are the common server routines for incorporation * * into the stand-alone and remote server versions. * * Author: Jim Breen * ***************************************************************************/ /* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include #include #ifdef MMAP #include #endif #include "xjdic.h" #ifndef MAP_FILE #define MAP_FILE 0 #endif #ifndef MAP_FAILED #define MAP_FAILED (void *)-1 #endif unsigned long dbyte; unsigned char Dnamet[10][100],XJDXnamet[10][100]; unsigned char *dicbufft[10],dntemp[100]; unsigned long *jdxbufft[10]; unsigned long dichits[10],dicmiss[10]; unsigned long indhits[10],indmiss[10]; unsigned long vbkills=0; unsigned long diclent[10], indlent[10],indptrt[10]; int i,NoDics,CurrDic; int xfilelen; /*====== Prototypes========================================================*/ FILE *xfopen (char *name, char *mode, int *xfilelen); int xopen (char *name, int *xfilelen); unsigned long jindex(unsigned long xit); unsigned char dbchar(unsigned long xit); void DicSet (); int Kstrcmp(int klen,unsigned char *str1); void DicLoad(int dn); unsigned char *DicName(int dn); void DicTest(int dn); void getvbuff (int *offp, FILE *fp, long vbo); void SeekErr(int iores); #ifdef MMAP FILE *fpd[10],*fpi[10],*fopen(); int fdd[10],fdi[10]; #endif #ifdef DEMAND_PAGING /*************************************************************************** * paging routines for Jim's Japanese software * for use with jdic, jreader, etc ***************************************************************************/ void *vbuffs[NOVB]; void *vbres; int *vbptr[NOVB]; long usebuff[NOVB], vbusage = 1; int *doffp[10],*joffp[10]; int MAXDIC,MAXJDX; /* formerly defines, now set dynamically */ int MAXDICTAB,MAXJDXTAB; int novbmax = NOVB,vbread = 0; FILE *fpd[10],*fpi[10],*fopen(); /* int TRIGGER = FALSE; int indordic; int gof,dbck=0; */ /*=====dbchar====returns specified character from dictionary===============*/ unsigned char dbchar(unsigned long it) { int vbo, vbc,ibuff; char *myp; long it2; extern int DicNum; it2 = it-1; /* indordic=0; dbck++; */ if ((it2 < 0)||(it2 > diclent[DicNum])) return(10); vbo = it2/VBUFFSIZE; /*page number*/ vbc = it2 % VBUFFSIZE; /*offset within page */ /* printf("dbchar - DN: %d vbo: %d vbc: %d\n",DicNum,vbo,vbc); */ if (doffp[DicNum][vbo] == -1) { getvbuff(&(doffp[DicNum][vbo]),fpd[DicNum],vbo); /*not resident - get it */ dicmiss[DicNum]++; } else { dichits[DicNum]++; } ibuff = doffp[DicNum][vbo]; /*page is (now) resident */ usebuff[ibuff] = vbusage++; /* flag this buffer as most recently used */ myp = vbuffs[ibuff]; /* printf("dbchar - returns %c\n",myp[vbc]); */ return(myp[vbc]); } /*======jindex returns specified entry from .jdx file========*/ unsigned long jindex(unsigned long it) { int vbo, vbl,ibuff; long *myp; long it2; extern int DicNum; /* indordic=1; */ it2 = it*sizeof(long); vbo = it2/VBUFFSIZE; /*page number*/ vbl = (it2 % VBUFFSIZE) / sizeof(long); /*offset within page */ /* printf("jindex - DN: %d it: %ld vbo: %d vbl: %d\n",it,DicNum,vbo,vbl); */ if (joffp[DicNum][vbo] == -1) { getvbuff(&(joffp[DicNum][vbo]),fpi[DicNum],vbo); /*not resident - get it */ indmiss[DicNum]++; } else { indhits[DicNum]++; } ibuff = joffp[DicNum][vbo]; /*page is (now) resident */ usebuff[ibuff] = vbusage++; /* flag this buffer as most recently used */ myp = vbuffs[ibuff]; /* printf("jindex - returns %ld\n",myp[vbl]); */ return(myp[vbl]); } /*=====getvbuff===allocates a free virtual buffer and reads in the page===*/ void getvbuff (int *offp, FILE *fp, long vbo) { int ibuff,i,iores; long maxu,seekoff; extern int DicNum; /* printf("getvbuff - DN: %d offp: %d vbo: %ld\n",DicNum,offp,vbo); */ /* find a free buffer, or free the LRU one */ vbread++; maxu = usebuff[0]; ibuff = 0; for (i = 0; i < NOVB; i++) { if (usebuff[i] == -1) { ibuff = i; /*free buffer available */ /* printf("getvbuff - buffer %d is free\n",ibuff); */ break; } else { if( usebuff[i] < maxu) /*look for LRU buffer */ { maxu = usebuff[i]; ibuff = i; } } } /* read page into buffer */ /* printf("getvbuff - buffer %d being loaded\n",ibuff); */ if(usebuff[ibuff] >= 0) { *vbptr[ibuff] = -1; vbkills++; /* TRIGGER = TRUE; printf("getvbuff - buffer %d being loaded, Dic = %d %d Offset = %d LRUs %d %d %d\n",ibuff,DicNum,indordic,vbo,vbusage,maxu,dbck); scanf ("%d",&gof); */ } vbptr[ibuff] = offp; *vbptr[ibuff] = ibuff; seekoff = vbo; seekoff *= VBUFFSIZE; if((iores = fseek(fp,seekoff,SEEK_SET)) != 0)SeekErr(iores); iores = fread(vbuffs[ibuff],1,VBUFFSIZE,fp); } #endif /*====DicSet===Multiple Dictionary and index file Loader=======*/ void DicSet() { int i; #ifdef DEMAND_PAGING vbres = malloc(NOVB * VBUFFSIZE); if (vbres == NULL) { printf("malloc failed for virtual buffers!\n"); exit(1); } for (i = 0; i < NOVB; i++) { vbuffs[i] = vbres; usebuff[i] = -1; vbres+=VBUFFSIZE; } #endif for (i = 0; i<=NoDics; i++) DicTest(i); for (i = 0; i<=NoDics; i++) DicLoad(i); } /*====DicTest check Dictionary and index files=======*/ void DicTest(int dn) { long testwd[1]; int diclenx; extern int jiver; FILE *fpd,*fopen(); dichits[dn] = 0; dicmiss[dn] = 0; indhits[dn] = 0; indmiss[dn] = 0; fpd = xfopen(Dnamet[dn],"rb", &diclenx); diclenx++; fclose(fpd); fpd = xfopen(XJDXnamet[dn],"rb", &xfilelen); fread(&testwd[0],sizeof(long),1,fpd); if (testwd[0] != (diclenx+jiver)) { printf ("The %s dictionary and index files do not match! \n",Dnamet[dn]); exit(1); } fclose(fpd); } #ifdef RAM_LOAD /*====DicLoad check & load Dictionary and index files=======*/ /* (Old version; load everything in RAM) */ void DicLoad(int dn) { int nodread; /* struct stat *buf; no longer used here */ extern int jiver; FILE *fpd,*fopen(); printf("Loading Dictionary: %d [%s]\n",dn,DicName(dn)); fpd = xfopen(Dnamet[dn],"rb", &xfilelen); diclent[dn] = xfilelen; diclent[dn]++; dicbufft[dn] = (unsigned char *)malloc(((diclent[dn]+100) * sizeof(unsigned char))); if(dicbufft[dn] == NULL) { fprintf(stderr,"malloc() for dictionary failed.\n"); fclose(fpd); exit(1); } nodread = diclent[dn]/1024; dbyte = fread((unsigned char *)dicbufft[dn]+1, 1024, nodread, fpd); nodread = diclent[dn] % 1024; dbyte = fread((unsigned char *)(dicbufft[dn]+(diclent[dn]/1024)*1024)+1, nodread,1, fpd); fclose(fpd); dicbufft[dn][0] = 0xa; dbyte = diclent[dn]; fpd = xfopen(XJDXnamet[dn],"rb", &xfilelen); indlent[dn] = xfilelen; jdxbufft[dn] = (unsigned long *)malloc((indlent[dn]+1024) * sizeof(unsigned char)); if(jdxbufft[dn] == NULL) { fprintf(stderr,"malloc() for index failed.\n"); fclose(fpd); exit(1); } indptrt[dn] = indlent[dn]/sizeof(long)-1; nodread = indlent[dn]/1024+1; fread((long *)jdxbufft[dn],1024,nodread,fpd); if (jdxbufft[dn][0] != (diclent[dn]+jiver)) { printf ("The dictionary and index files do not match! \n"); exit(1); } fclose(fpd); } #endif #ifdef DEMAND_PAGING /*====DicLoad check & load Dictionary and index files=======*/ /* (Paging version) */ void DicLoad(int dn) { int i,len; #ifndef QUIET printf("Initializing Dictionary: %d [%s]\n",dn,DicName(dn)); #endif fpd[dn] =xfopen(Dnamet[dn],"rb", &xfilelen); diclent[dn] = xfilelen; diclent[dn]++; len = (diclent[dn]/VBUFFSIZE)+1; doffp[dn] = (int *)malloc(len * sizeof(int)); if(doffp[dn] == NULL) { fprintf(stderr,"malloc() for dictionary page-table failed.\n"); exit(1); } for (i = 0; i < len; i++) doffp[dn][i] = -1; fpi[dn] = xfopen(XJDXnamet[dn],"rb", &xfilelen); indlent[dn] = xfilelen; indptrt[dn] = indlent[dn]/sizeof(long)-1; len = (indlent[dn]/VBUFFSIZE)+1; joffp[dn] = (int *)malloc(len * sizeof(int)); if(joffp[dn] == NULL) { fprintf(stderr,"malloc() for index page-table failed.\n"); exit(1); } for (i = 0; i < len; i++) joffp[dn][i] = -1; } #endif #ifdef MMAP /*====DicLoad check & load Dictionary and index files=======*/ /* (Memory-mapped I/O version) */ void DicLoad(int dn) { int i,len; #ifndef QUIET printf("Initializing Dictionary: %d [%s]\n",dn,DicName(dn)); #endif fdd[dn] =xopen(Dnamet[dn],&xfilelen); diclent[dn] = xfilelen; if ((dicbufft[dn] = mmap(0, xfilelen, PROT_READ, MAP_FILE | MAP_SHARED, fdd[dn],0)) == MAP_FAILED) { printf ("Unable to map %s! [%s]\n",DicName(dn),strerror(errno)); exit(1); } diclent[dn]++; fdi[dn] = xopen(XJDXnamet[dn],&xfilelen); indlent[dn] = xfilelen; indptrt[dn] = indlent[dn]/sizeof(long)-1; if ((jdxbufft[dn] = (long *) mmap(0, xfilelen, PROT_READ, MAP_FILE | MAP_SHARED, fdi[dn],0)) == MAP_FAILED) { printf ("Unable to map %s.xjdx! [%s]\n",DicName(dn),strerror(errno)); exit(1); } } #endif #ifdef RAM_LOAD /*=====dbchar====returns specified character from a dictionary===============*/ /* This routine looks funny, because it is the remnant of much more complex code in JDIC/JREADER which did demand-paging at this point */ unsigned char dbchar(unsigned long xit) { extern int DicNum; return(dicbufft[DicNum][xit]); } #endif #ifdef MMAP /*=====dbchar====returns specified character from a dictionary===============*/ /* This routine looks funny, because it is the remnant of much more complex code in JDIC/JREADER which did demand-paging at this point */ unsigned char dbchar(unsigned long xit) { extern int DicNum; long it2; it2 = xit-1; if ((it2 < 0)||(it2 > diclent[DicNum])) return(10); return(dicbufft[DicNum][it2]); } #endif #if defined (RAM_LOAD) || defined (MMAP) /*======jindex returns specified entry from .xjdx file========*/ unsigned long jindex(unsigned long xit) { extern int DicNum; return(jdxbufft[DicNum][xit]); } #endif /*=========string comparison function used in binary search ==========*/ /* This one is used by the main dictionary search */ int Kstrcmp(int klen,unsigned char *str1) { unsigned c1,c2; int i,rc1,rc2; extern long it; /* effectively does a strnicmp on two "strings" except it will make katakana and hiragana match (EUC A4 & A5) */ /* if (TRIGGER) printf("KSTRCMP called: %d %c%c\n",klen,str1[0],str1[1]); */ for (i = 0; i= 'A') && (c1 <= 'Z')) c1 |= 0x20; /*fix ucase*/ if ((c2 >= 'A') && (c2 <= 'Z')) c2 |= 0x20; if (c1 != c2 ) { rc1 = c1; rc2 = c2; return(rc1-rc2); } } return(0); } xjdserver.c0100644000076400007640000002620007665047752011417 0ustar jwbjwb/************************************************************************** * X J D S E R V E R * * Dictionary Server Program * * Japanese-English Dictionary program (X11 version) * * Author: Jim Breen * ***************************************************************************/ /* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include #include #include #include #include #include "xjdic.h" #define SVERBOSE 0 void xjdicrc(); void DicSet (); unsigned char *DicName(int dn); int portno=XJ_PORTNO; int DontFork = FALSE; int alen; char host[51]; REQ_PDU pdu_in; RSP_PDU pdu_out; struct sockaddr_in fsin; int sock; long lo, hi, itok, lo2, hi2, schix, schiy; int res, i; long it; unsigned char ENVname[50]; unsigned char cl_rcfile[100]; int jiver = 14; int thisdic = 0; int DicNum; extern int errno; extern unsigned char Dnamet[10][100],XJDXnamet[10][100]; extern unsigned char *dicbufft[10]; extern unsigned long diclent[10], indlent[10],indptrt[10]; extern int NoDics,CurrDic; char DicDir[100]; int passiveUDP(int portno) { struct protoent *ppe; struct sockaddr_in sin; int s; bzero((char *)&sin, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = htons(portno); if ((ppe = getprotobyname("udp")) == 0) { printf ("Cannot set up UDP!!\n"); exit(1); } s = socket(PF_INET, SOCK_DGRAM, ppe->p_proto); if (s < 0) { printf ("Cannot create socket!!: %s\n",strerror(errno)); exit(1); } if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { printf ("Cannot bind to port: %d\n",portno); exit(1); } return (s); } int checksum_in() { long temp; temp = ntohs(pdu_in.xjdreq_type); temp+= ntohs(pdu_in.xjdreq_seq); temp+= ntohs(pdu_in.xjdreq_dicno); temp+= ntohl(pdu_in.xjdreq_indexpos); temp+= ntohs(pdu_in.xjdreq_schlen); for (i = 0; i < strlen(pdu_in.xjdreq_schstr); i++) temp+= pdu_in.xjdreq_schstr[i]; if (temp == ntohl(pdu_in.xjdreq_checksum)) return(TRUE); return(FALSE); } void sendresponse() { long temp; temp = ntohs(pdu_out.xjdrsp_type); temp+= ntohs(pdu_out.xjdrsp_seq); temp+= ntohl(pdu_out.xjdrsp_resindex); temp+= ntohl(pdu_out.xjdrsp_dicloc); temp+= ntohs(pdu_out.xjdrsp_hitposn); temp+= ntohs(pdu_out.xjdrsp_reslen); for (i = 0; i < strlen(pdu_out.xjdrsp_resstr); i++) temp+= pdu_out.xjdrsp_resstr[i]; pdu_out.xjdrsp_checksum = htonl(temp); if (SVERBOSE) printf("PDU sent: %d %d %d %d %d %d %s %d\n", ntohs(pdu_out.xjdrsp_type), ntohs(pdu_out.xjdrsp_seq), ntohl(pdu_out.xjdrsp_resindex), ntohl(pdu_out.xjdrsp_dicloc), ntohs(pdu_out.xjdrsp_hitposn), ntohs(pdu_out.xjdrsp_reslen), pdu_out.xjdrsp_resstr, temp); i = sendto (sock, (RSP_PDU *) &pdu_out, sizeof(pdu_out)-512+strlen(pdu_out.xjdrsp_resstr)+1, 0, (struct sockaddr *)&fsin, sizeof(fsin)); if (i < 0) { printf ("sendto error!: %s\n",strerror(errno)); } } /* M A I N */ main(argc,argv) int argc; unsigned char **argv; { int iterlimit,i; unsigned char *dicenv,strtmp[50]; unsigned char xap[50]; printf("XJDSERVER Version %s (Japanese Dictionary Server) Copyright J.W.Breen 2003.\n",SVER); dicenv = (unsigned char *)getenv("XJDIC"); if (!dicenv) dicenv = (unsigned char *)DEFAULT_DICDIR; if (strlen(dicenv) <= 2) { dicenv = (unsigned char *)getcwd(ENVname,sizeof(ENVname)); if (dicenv == NULL) { printf("Cannot extract working directory!\n"); exit(1); } } else { strcpy (ENVname,dicenv); } strcpy (Dnamet[0], "kanjidic"); strcpy (Dnamet[1], "edict"); strcpy (XJDXnamet[0], "kanjidic.xjdx"); strcpy (XJDXnamet[1], "edict.xjdx"); NoDics = 1; cl_rcfile[0] = 0; /* process command-line options*/ if (argc > 1) { for (i = 1; i < argc; i++) { strcpy(xap,argv[i]); if ((xap[0] == '-') && (xap[1] == 'h')) { printf("Command-line options:\n"); printf("\t -c control_file\n"); printf("\t -K (do not create daemon)\n"); printf("\t -P nnnn (use UDP port nnnn\n"); printf("\t -k kanji_dic_file\n"); printf("\t -d dictionary_file (up to 9)\n"); printf("\t -h (this information)\n"); exit(0); } if ((xap[0] == '-') && (xap[1] == 'c')) { if(xap[2] != 0) { strcpy(strtmp,xap+2); } else { i++; strcpy(xap,argv[i]); strcpy (strtmp,xap); } strcpy (cl_rcfile,strtmp); printf ("Using control-file: %s\n",cl_rcfile); } if ((xap[0] == '-') && (xap[1] == 'd')) { if (thisdic == 0) { thisdic = 1; } else { thisdic++; NoDics++; } if(xap[2] != 0) { strcpy(strtmp,xap+2); } else { i++; strcpy(xap,argv[i]); strcpy (strtmp,xap); } strcpy (Dnamet[thisdic],strtmp); strcpy (XJDXnamet[thisdic],strtmp); strcat (XJDXnamet[thisdic],".xjdx"); printf("Command-line request to use dictionary files: %s and %s\n",Dnamet[thisdic],XJDXnamet[thisdic]); continue; } if ((xap[0] == '-') && (xap[1] == 'K')) { DontFork = TRUE; continue; } if ((xap[0] == '-') && (xap[1] == 'P')) { if(xap[2] != 0) { portno = atoi(xap+2); } else { i++; strcpy(xap,argv[i]); portno = atoi(xap); } printf("Command-line request to use port: %d\n",portno); continue; } if ((xap[0] == '-') && (xap[1] == 'k')) { if(xap[2] != 0) { strcpy(strtmp,xap+2); } else { i++; strcpy(xap,argv[i]); strcpy (strtmp,xap); } strcpy (Dnamet[0],strtmp); strcpy (XJDXnamet[0],strtmp); strcat (XJDXnamet[0],".xjdx"); printf("Command-line request to use kanji dictionary files: %s and %s\n",Dnamet[0],XJDXnamet[0]); continue; } } } xjdicrc(); printf ("Loading Dictionary and Index files. Please wait...\n"); /* printf("TEST! NoDics = %d\n",NoDics); */ /* for(i = 0;i <= NoDics; i++) printf("TEST! Dnamet[] = %s\n",Dnamet[i]); */ if (!DontFork) { i = fork(); if (i < 0) { printf("error when forking: %s\n",strerror(errno)); exit(1); } if (i) exit(0); } DicSet (); sock = passiveUDP(portno); printf ("Server Loaded & Ready\n"); /* From here on, the code loops endlessly, reading requests from the UDP port, looking up the dictionary, and sending back the answers. */ while (TRUE) { alen = sizeof(fsin); if (recvfrom(sock, (REQ_PDU *) &pdu_in, sizeof(pdu_in), 0, (struct sockaddr *)&fsin, &alen) < 0) { fprintf (stderr,"recvfrom failure: %s\n",strerror(errno)); continue; } if (!checksum_in) continue; /* ignore requests with bad checksums*/ pdu_out.xjdrsp_seq = pdu_in.xjdreq_seq; pdu_out.xjdrsp_resindex = htonl(0); pdu_out.xjdrsp_dicloc = htonl(0); pdu_out.xjdrsp_hitposn = htons(0); pdu_out.xjdrsp_reslen= htons(0); pdu_out.xjdrsp_resstr[0] = 0; pdu_in.xjdreq_type = ntohs(pdu_in.xjdreq_type); pdu_in.xjdreq_dicno = ntohs(pdu_in.xjdreq_dicno); pdu_in.xjdreq_schlen = ntohs(pdu_in.xjdreq_schlen); pdu_in.xjdreq_indexpos = ntohl(pdu_in.xjdreq_indexpos); /* printf ("PDU: %d received\n",pdu_in.xjdreq_type);*/ if (pdu_in.xjdreq_type == XJ_HULLO) { pdu_out.xjdrsp_type = htons(XJ_OK); pdu_out.xjdrsp_hitposn = htons(NoDics); pdu_out.xjdrsp_resstr[0] = 0; for (i = 0; i<=NoDics;i++) { sprintf(strtmp,"#%d%s",i,DicName(i)); strcat(pdu_out.xjdrsp_resstr,strtmp); } pdu_out.xjdrsp_reslen = htons(strlen(pdu_out.xjdrsp_resstr)); sendresponse(); continue; } if (pdu_in.xjdreq_dicno > NoDics) { pdu_out.xjdrsp_type = htons(XJ_PROTERR); sendresponse(); continue; } DicNum = pdu_in.xjdreq_dicno; hi = indptrt[pdu_in.xjdreq_dicno]; if (pdu_in.xjdreq_type == XJ_FIND) { lo = 1; iterlimit = MAXITER; while(TRUE) { if (!iterlimit--) break; it = (lo+hi)/2; res = Kstrcmp(pdu_in.xjdreq_schlen,pdu_in.xjdreq_schstr); if (res == 0) { itok = it; lo2 = lo; hi2 = it; while (TRUE) { if(lo2+1 >= hi2) break; it = (lo2+hi2)/2; res = Kstrcmp(pdu_in.xjdreq_schlen,pdu_in.xjdreq_schstr); if (res == 0) { hi2 = it; itok = it; continue; } else { lo2 = it+1; } } it = itok; res = 0; break; } if (res < 0) { hi = it-1; } else { lo = it+1; } if (lo > hi) break; } if (res != 0) { pdu_out.xjdrsp_type = htons(XJ_NBG); sendresponse(); continue; } /* as the above sometimes misses the first matching entry, step back to the first */ while (TRUE) { if(Kstrcmp(pdu_in.xjdreq_schlen,pdu_in.xjdreq_schstr) == 0) { it--; if (it == 0) { it = 1; break; } continue; } else { it++; break; } } } /* Get next entry. Check (a) if the caller hasn't gone off the end of the table, and (b) if the (next) entry matches. */ if (pdu_in.xjdreq_type == XJ_ENTRY) { if (pdu_in.xjdreq_indexpos > hi) { pdu_out.xjdrsp_type = htons(XJ_NBG); sendresponse(); continue; } it = pdu_in.xjdreq_indexpos; res = Kstrcmp(pdu_in.xjdreq_schlen,pdu_in.xjdreq_schstr); if (res != 0) { pdu_out.xjdrsp_type = htons(XJ_NBG); sendresponse(); continue; } } if (pdu_in.xjdreq_type == XJ_GET) { if (pdu_in.xjdreq_indexpos > hi) { pdu_out.xjdrsp_type = htons(XJ_NBG); sendresponse(); continue; } it = pdu_in.xjdreq_indexpos; } /* Common code to set up the return parameters for both call types */ schix = jindex(it); schiy = schix; pdu_out.xjdrsp_resindex = htonl(it); /* back off to the start of this line */ while ((dbchar(schix) != 0x0a) && (schix >= 0)) schix--; schix++; pdu_out.xjdrsp_dicloc = htonl(schix); pdu_out.xjdrsp_hitposn = htons(schiy - schix); if (pdu_in.xjdreq_type == XJ_ENTRY) { pdu_out.xjdrsp_resindex = htonl(schix); } if (pdu_in.xjdreq_type == XJ_GET) { pdu_out.xjdrsp_resindex = htonl(schix); } for (i = 0; dbchar(schix+i) != 0x0a; i++) { pdu_out.xjdrsp_resstr[i] = dbchar(schix+i); } pdu_out.xjdrsp_resstr[i+0] = 0x0a; /* NL tells user s/w that it is the end of an entry */ pdu_out.xjdrsp_resstr[i+1] = 0; pdu_out.xjdrsp_reslen = htons(strlen(pdu_out.xjdrsp_resstr)); pdu_out.xjdrsp_type = htons(XJ_OK); sendresponse(); continue; } } xjdxgen.c0100644000076400007640000002470207665050005011040 0ustar jwbjwb/************************************************************************** * X J D X G E N * Author: Jim Breen * Index (.xjdx) generator program fron XJDIC * * V2.3 - indexes JIS X 0212 (3-byte EUC) kanji ***************************************************************************/ /* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include /*#include */ #include #include #include "xjdic.h" #define TRUE 1 #define FALSE 0 #define SPTAG '@' #define EXLIM 100 #define TOKENLIM 40 unsigned char *db; unsigned char ENVname[50]; unsigned char *dicenv; struct stat *buf; unsigned long dbyte; unsigned long *jindex; unsigned long indptr,llone; unsigned char ctl_file[80] = {".xjdicrc"}; unsigned char Dname[80] = {"edict"}; unsigned char JDXname[80] = {"edict.xjdx"}; unsigned char EDname[80] = {"edict"}; unsigned char EJDXname[80] = {"edict.xjdx"}; unsigned char exlist[EXLIM][11]; /* list of words to be excluded */ int excount,exlens[EXLIM]; int jiver = 14; /*The last time the index structure changed was Version1.4*/ /*====== prototypes=================================================*/ int stringcomp(unsigned char *s1, unsigned char *s2); void jqsort(long i, long j); int Kstrcmp(unsigned long lhs, unsigned long rhs); void xjdicrc(); int alphaoreuc(unsigned char x); int stringcomp(unsigned char *s1, unsigned char *s2) { int i; unsigned char c1,c2; for(i = 0; i < strlen(s1);i++) { c1 = s1[i]; if (c1 < 0x60) c1 = (c1|0x20); c2 = s2[i]; if (c2 < 0x60) c2 = (c2|0x20); if (c1 != c2) return(1); } return (0); } /*====function to Load Dictionary and load/create index table=======*/ main(argc,argv) int argc; unsigned char **argv; { FILE *fp,*fopen(); unsigned long possav,schi,diclen,indlen; int i,inwd,cstrp,saving,isc,nodread; int arg_c; unsigned char c; unsigned char currstr[TOKENLIM],strtmp[50]; unsigned char **ap; printf("\nXJDXGEN V2.4 Index Table Generator for XJDIC. \n Copyright J.W. Breen, 2003\n"); ap = argv; arg_c = argc; while (arg_c > 1) { ap++; if(strcmp(*ap,"-h") == 0) { printf("\nThe command-line options are:\n"); printf(" -h this display\n"); printf(" -c control file\n"); printf(" filename - file to be indexed\n\n"); exit(0); } if(strcmp(*ap,"-c") == 0) { ap++; strcpy(ctl_file,*ap); printf("Commandline request to use control file %s\n",ctl_file); arg_c-=2; continue; } strcpy(strtmp,*ap); strcpy(Dname,*ap); strcpy(JDXname,*ap); strcat(JDXname,".xjdx"); printf("Commandline request to use files %s and %s \n",Dname,JDXname); ap++; arg_c--; } xjdicrc(); inwd = FALSE; indptr = 1; llone = 1; buf = (void *)malloc(1000); if(stat(Dname, buf) != 0) { perror(NULL); printf("Cannot stat: %s \n",Dname); exit(1); } diclen = buf->st_size; printf("\nWARNING!! This program may take a long time to run .....\n"); puts ("\nLoading Dictionary file. Please wait.....\n"); fp=fopen(Dname,"rb"); if (fp==NULL ) { printf("\nCannot open dictionary file\n"); exit(1); } db = (unsigned char *)malloc((diclen+100) * sizeof(unsigned char)); if(db == NULL) { fprintf(stderr,"malloc() for dictionary failed.\n"); fclose(fp); exit(1); } nodread = diclen/1024; dbyte = fread((unsigned char *)db+1, 1024, nodread, fp); nodread = diclen % 1024; dbyte = fread((unsigned char *)(db+(diclen/1024)*1024)+1, nodread,1, fp); fclose(fp); diclen++; dbyte = diclen; db[diclen] = 10; db[0] = 10; printf("Dictionary size: %ld bytes.\n",dbyte); indlen = (diclen * sizeof(long))/4; jindex = (unsigned long *)malloc(indlen); if(jindex == NULL) { fprintf(stderr,"malloc() for index table failed.\n"); fclose(fp); exit(1); } printf("Parsing.... \n"); /*this is the dictionary parser. It places an entry in jindex for every kana/kanji string and every alphabetic string it finds which is >=3 characters and is not on the "exclude" list */ indptr = 1; saving = FALSE; cstrp = 0; for (schi =0; schi < dbyte; schi++) /* scan whole dictionary */ { c = db[schi]; if (inwd) { if ((alphaoreuc(c))||(c == '-')||(c == '.')||((c >= '0') && (c <= '9'))) { currstr[cstrp] = c; if(cstrp < TOKENLIM-1) cstrp++; } else { currstr[cstrp] = '\0'; inwd = FALSE; if ((strlen(currstr) <= 2) && (currstr[0] < 127))saving = FALSE; if ((strlen(currstr) == 2) && (currstr[1] <= '9'))saving = TRUE; if (saving && (currstr[0] > 127)) { possav = jindex[indptr]; indptr++; if (indptr > indlen/sizeof(long)) { printf("Index table overflow. Dictionary too large?\n"); exit(1); } /* generate index for *every* kanji in key */ i = 2; if (currstr[0] == 0x8f) i++; for ( ; i < strlen(currstr); i+=2) { if((currstr[i] >= 0xb0) || (currstr[i] == 0x8f)) { jindex[indptr] = possav+i; indptr++; if (indptr > indlen/sizeof(long)) { printf("Index table overflow. Dictionary too large?\n"); exit(1); } } if (currstr[i] == 0x8f) i++; } } if (saving && (currstr[0] < 127)) { indptr++; if (indptr > indlen/sizeof(long)) { printf("Index table overflow. Dictionary too large?\n"); exit(1); } /* If this is non-Japanese, and has a 'SPTAGn' tag, generate two indices */ if ( currstr[0] == SPTAG) { jindex[indptr] = jindex[indptr-1]+1; strcpy(currstr,currstr+1); indptr++; if (indptr > indlen/sizeof(long)) { printf("Index table overflow. Dictionary too large?\n"); exit(1); } } if (currstr[0] < 128) { for (isc = 0; isc <= excount; isc++) { if (( exlens[isc] == strlen(currstr)) && (stringcomp(currstr,exlist[isc]) == 0) ) { indptr--; break; } } } } } } else { if (alphaoreuc(c) || c == SPTAG) { inwd = TRUE; jindex[indptr] = schi; cstrp = 1; currstr[0] = c; currstr[1] = '\0'; saving = TRUE; } } } indptr--; printf("Index entries: %ld \nSorting (this is slow)......\n",indptr); jqsort(llone,indptr); printf("Sorted\nWriting index file ....\n"); fp = fopen(JDXname,"wb"); if (fp==NULL ) { printf("\nCannot open %s output file\n",JDXname); exit(1); } jindex[0] = diclen+jiver; fwrite(jindex,sizeof(long),indptr+1,fp); i = fclose(fp); if (i != 0) { printf("\nDictionary Index File Close Failure\n"); exit(1); } exit (0); } /*======function to sort jindex table====================*/ void jqsort(long lhs, long rhs) { long i,last,midp; unsigned long temp; if (lhs >= rhs) return; /* Swap ( lhs , (lhs+rhs)/2);*/ midp = (lhs+rhs)/2; temp = jindex[lhs]; jindex[lhs] = jindex[midp]; jindex[midp] = temp; last = lhs; for (i = lhs+1;i <= rhs; i++) { if (Kstrcmp(jindex[i],jindex[lhs]) < 0) { /* Swap(++last,i);*/ last++; temp = jindex[i]; jindex[i] = jindex[last]; jindex[last] = temp; } } /* Swap (lhs,last);*/ temp = jindex[lhs]; jindex[lhs] = jindex[last]; jindex[last] = temp; jqsort(lhs,last-1); jqsort(last+1,rhs); } /*=====string comparison used by jqsort==========================*/ int Kstrcmp(unsigned long lhs, unsigned long rhs) { int i,c1,c2; /* effectively does a strnicmp on two "strings" within the dictionary, except it will make katakana and hirgana match (EUC A4 & A5) */ for (i = 0; i<20 ; i++) { c1 = db[lhs+i]; c2 = db[rhs+i]; if ((i % 2) == 0) { if (c1 == 0xA5) { c1 = 0xA4; } if (c2 == 0xA5) { c2 = 0xA4; } } if ((c1 >= 'A') && (c1 <= 'Z')) c1 |= 0x20; if ((c2 >= 'A') && (c2 <= 'Z')) c2 |= 0x20; if (c1 != c2 ) break; } return(c1-c2); } /*=====xjdicrc - access and analyze "xjdicrc" file (if any)==============*/ void xjdicrc() { unsigned char xjdicdir[128],rcstr[80],*rcwd; int iex; FILE *fm,*fopen(); iex = 0; xjdicdir[0] = '\0'; dicenv = (unsigned char *)getenv("XJDIC"); if (!dicenv) dicenv = (unsigned char *)DEFAULT_DICDIR; if (strlen(dicenv) <= 2) { dicenv = (unsigned char *)getcwd(ENVname,sizeof(ENVname)); if (dicenv == NULL) { printf("Cannot extract working directory!\n"); exit(1); } } else { strcpy (ENVname,dicenv); } if (strlen(ENVname) > 2) { strcpy(xjdicdir,ENVname); strcat(xjdicdir,"/"); } else { strcpy(xjdicdir,(unsigned char *)getenv("HOME")); strcat(xjdicdir,"/"); } strcat(xjdicdir,ctl_file); fm = fopen(xjdicdir,"r"); if (fm == NULL) { strcpy(xjdicdir,ctl_file); fm = fopen(xjdicdir,"r"); } if (fm != NULL) { while(fgets(rcstr,79,fm) != NULL) { rcwd = (unsigned char *)strtok(rcstr," \t"); if( stringcomp((unsigned char *)"exlist",rcwd) == 0) { while (TRUE) { rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); if (rcwd == NULL) break; strcpy(exlist[iex],rcwd); exlens[iex] = strlen(rcwd); if (iex < EXLIM) iex++; } excount = iex-1; continue; } } } if (fm == NULL) { printf("No control file detected!\n"); return; } else { fclose(fm); return; } } /*=======function to test a character for alpha or kana/kanji====*/ int alphaoreuc(unsigned char x) { int c; c = x & 0xff; if(((c >= 65) && (c <= 90)) || ((c >= 97) && (c <= 122))) { return (TRUE); } if ((c >= '0') && (c <= '9')) { return(TRUE); } if ((c & 0x80) > 0) { return(TRUE); } return (FALSE); } exjdxgen.c0100644000076400007640000001573406532040051011202 0ustar jwbjwb/************************************************************************** * E X J D X G E N * Author: Jim Breen * * This is the Unix version of EJDXGEN, ported from MS-DOS ***************************************************************************/ /* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include /*#include */ #include #include #include "xjdic.h" #define TRUE 1 #define FALSE 0 #define EXLIM 100 unsigned char *db; unsigned char ENVname[50]; unsigned char *dicenv; struct stat *buf; unsigned long dbyte; unsigned long *jindex; unsigned long indptr,llone,charno,recpos,charnost; int State; unsigned char Dname[80] = {"edictext"}; unsigned char JDXname[80] = {"edictext.xjdx"}; int jiver = 14; /*The last time the index structure changed was Version1.4*/ /*====== prototypes=================================================*/ int stringcomp(unsigned char *s1, unsigned char *s2); void jqsort(long i, long j); int Kstrcmp(unsigned long lhs, unsigned long rhs); /*====== end prototypes=================================================*/ int stringcomp(unsigned char *s1, unsigned char *s2) { int i; unsigned char c1,c2; for(i = 0; i < strlen(s1);i++) { c1 = s1[i]; if (c1 < 0x60) c1 = (c1|0x20); c2 = s2[i]; if (c2 < 0x60) c2 = (c2|0x20); if (c1 != c2) return(1); } return (0); } /*====function to Load Dictionary and load/create index table=======*/ main(argc,argv) int argc; unsigned char **argv; { FILE *fp,*fopen(); unsigned long schi,diclen,indlen; int i,inwd,saving,nodread; unsigned char c; unsigned char **ap; printf("\nEXJDXGEN V2.0 Extension Index Table Generator for XJDIC. \n Copyright J.W. Breen, 1995\n"); if (argc > 1) { ap = argv; ap++; if(strcmp(*ap,"-h") == 0) { printf("\nThere are two command-line options:\n"); printf(" -h this display\n"); printf(" filename - file to be indexed\n\n"); exit(0); } strcpy(Dname,*ap); strcpy(JDXname,*ap); strcat(JDXname,".xjdx"); printf("Commandline request to use files %s and %s \n",Dname,JDXname); } inwd = FALSE; indptr = 1; llone = 1; buf = (void *)malloc(1000); if(stat(Dname, buf) != 0) { perror(NULL); printf("Cannot stat: %s \n",Dname); exit(1); } diclen = buf->st_size; printf("\nWARNING!! This program may take a long time to run .....\n"); puts ("\nLoading Dictionary file. Please wait.....\n"); fp=fopen(Dname,"rb"); if (fp==NULL ) { printf("\nCannot open dictionary file\n"); exit(1); } db = (unsigned char *)malloc((diclen+100) * sizeof(unsigned char)); if(db == NULL) { fprintf(stderr,"malloc() for dictionary failed.\n"); fclose(fp); exit(1); } nodread = diclen/1024; dbyte = fread((unsigned char *)db+1, 1024, nodread, fp); nodread = diclen % 1024; dbyte = fread((unsigned char *)(db+(diclen/1024)*1024)+1, nodread,1, fp); fclose(fp); diclen++; dbyte = diclen; db[diclen] = 10; db[0] = 10; printf("Dictionary size: %ld bytes.\n",dbyte); indlen = diclen / 2; jindex = (unsigned long *)malloc(indlen); if(jindex == NULL) { fprintf(stderr,"malloc() for index table failed.\n"); fclose(fp); exit(1); } printf("Parsing.... \n"); indptr = 1; saving = FALSE; charno = -1; State = 0; for (schi =0; schi < dbyte; schi++) /* scan whole dictionary */ { c = db[schi]; charno++; if (c == 0x0a) { recpos = charno+1; continue; } switch (State) { case 0 : /* Looking for < */ if (c == '<') State = 1; break; case 1 : /* Inside <..>, but nothing started yet */ if (c >= 127) { saving = TRUE; charnost = charno-1; State = 2; break; } else { State = 3; schi--; charno--; break; } case 2 : /* storing keywords */ if (c >= 127) { break; } else { jindex[indptr] = charnost; jindex[indptr+1] = recpos; indptr+=2; if (indptr > indlen/sizeof(long)) { printf("Index table overflow. Dictionary too large?\n"); exit(1); } saving = FALSE; schi--; charno--; State = 3; break; } case 3 : /* encountered non-JIS */ if (c == '>') { State = 0; break; } if (c == '[') { State = 4; break; } if (c >= 127) { schi--; charno--; State = 1; } break; case 4 : /* skip all until ] */ if (c == ']') State = 1; break; } } indptr-=2; printf("Index entries: %ld \nSorting (this is slow)......\n",indptr); jqsort(llone,(indptr/2)+1); printf("Sorted\nWriting index file ....\n"); fp = fopen(JDXname,"wb"); if (fp==NULL ) { printf("\nCannot open %s output file\n",JDXname); exit(1); } jindex[0] = diclen+jiver; fwrite(jindex,sizeof(long),indptr+2,fp); fclose(fp); } /*======function to sort jindex table====================*/ void jqsort(long lhsr, long rhsr) { long i,last,midp,lhs,rhs; unsigned long temp,temp2; lhs = ((lhsr-1)*2)+1; rhs = ((rhsr-1)*2)+1; if (lhs >= rhs) return; /* Swap ( lhs , (lhs+rhs)/2);*/ midp = (lhs+rhs)/2; if (!(midp & 1)) midp--; temp = jindex[lhs]; temp2 = jindex[lhs+1]; jindex[lhs] = jindex[midp]; jindex[lhs+1] = jindex[midp+1]; jindex[midp] = temp; jindex[midp+1] = temp2; last = lhs; for (i = lhs+2;i <= rhs; i+=2) { if (Kstrcmp(jindex[i],jindex[lhs]) < 0) { /* Swap(++last,i);*/ last+=2; temp = jindex[i]; jindex[i] = jindex[last]; jindex[last] = temp; temp = jindex[i+1]; jindex[i+1] = jindex[last+1]; jindex[last+1] = temp; } } /* Swap (lhs,last);*/ temp = jindex[lhs]; jindex[lhs] = jindex[last]; jindex[last] = temp; temp = jindex[lhs+1]; jindex[lhs+1] = jindex[last+1]; jindex[last+1] = temp; jqsort((lhs/2)+1,last/2); jqsort((last/2)+2,(rhs/2)+1); } /*=====string comparison used by jqsort==========================*/ int Kstrcmp(unsigned long lhs, unsigned long rhs) { int i,c1,c2; /* effectively does a strnicmp on two "strings" within the dictionary, except it will make katakana and hirgana match (EUC A4 & A5) */ for (i = 0; i<20 ; i++) { c1 = db[lhs+i+1]; c2 = db[rhs+i+1]; if ((i % 2) == 0) { if (c1 == 0xA5) { c1 = 0xA4; } if (c2 == 0xA5) { c2 = 0xA4; } } if ((c1 >= 'A') && (c1 <= 'Z')) c1 |= 0x20; if ((c2 >= 'A') && (c2 <= 'Z')) c2 |= 0x20; if (c1 != c2 ) break; } return(c1-c2); } xjdrad.c0100644000076400007640000001364507665047715010667 0ustar jwbjwb/************************************************************************** * X J D R A D * * Displays Radical Table for Lookup Usage * * Japanese-English Dictionary program (X11 version) * * Author: Jim Breen * ***************************************************************************/ /* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include #include #include #include #include "xjdic.h" #define RADPERLINE 20 struct stat *xbuf; unsigned char RKname[50] = {"radkfile"}; unsigned char IRKname[50] = {"radkfile"}; unsigned char DicDir[100]; unsigned char sver[] = {SVER}; unsigned char ENVname[50]; unsigned char testline[200]; unsigned char RVon[] = {0x1b,'[','7','m',0}; unsigned char RVoff[] = {0x1b,'[','m',0}; FILE *xfopen(char *file_name, char *file_mode, int *xfilelen); void xjdicrc(); void RadDisp(); /*====stringcomp==stricmp & strcasecmp pulled together=========*/ /* (my own routine, because different systems need one or the other */ int stringcomp(unsigned char *s1, unsigned char *s2) { int i; unsigned char c1,c2; for(i = 0; i < strlen(s1);i++) { c1 = s1[i]; if (c1 < 0x60) c1 = (c1|0x20); c2 = s2[i]; if (c2 < 0x60) c2 = (c2|0x20); if (c1 != c2) return(1); } return (0); } /*=====RadDisp===Display Radical Data==============================*/ void RadDisp() { int i,j,k,l,flen; FILE *fk,*fopen(); unsigned char *ptr; fk = xfopen(RKname,"r",&flen); k=99; j = 0; printf("RADICAL TABLE FOR USE WITH XJDIC RADICAL LOOKUP FUNCTION\n\n"); while(!feof(fk)) { fgets(testline,199,fk); if(feof(fk)) break; testline[strlen(testline)-1] = 0; if (testline[0] != '$') continue; ptr = strtok(testline+4," "); l = atoi(ptr); if (l != k) { k = l; printf(" %s%s%s ",RVon,ptr,RVoff); if (k < 10) printf(" "); if(++j % RADPERLINE == 0) printf("\n"); } printf(" %c%c ",testline[2],testline[3]); if(++j % RADPERLINE == 0) printf("\n"); } fclose(fk); printf("\n"); } /*+++++++++ xfopen +++ does a fopen, but tries the dicdir first +++*/ /* xfopen generalizes the dictionary and other file opening, by: trying the "dicdir", and then current directories returning the file length as well as the pointer to FILE */ FILE *xfopen(char *file_name, char *file_mode, int *xfilelen) { FILE *fx, *fopen(); char *fnbuff; /* printf ("XFOPEN: fn=%s mode=%s stream_p=%p\n",file_name,file_mode,fx); */ fnbuff = (char *)malloc(strlen(DicDir) + strlen(file_name)+10); if (fnbuff == NULL) { printf("malloc failure opening: %s\n",file_name); exit(1); } strcpy(fnbuff,DicDir); if (fnbuff[strlen(fnbuff)-1] != '/') strcat (fnbuff,"/"); strcat(fnbuff,file_name); fx = fopen(fnbuff,file_mode); if (fx != NULL) { if(stat(fnbuff, xbuf) != 0) { printf ("Stat() error (l)for %s [%s]\n",fnbuff,strerror(errno)); exit(1); } *xfilelen = (xbuf->st_size); free(fnbuff); /* printf ("XFOPEN: stream_p=%p addr = %p\n",fx,&fx); */ return(fx); } fx = fopen(file_name,file_mode); if (fx != NULL) { if(stat(file_name, xbuf) != 0) { printf ("Stat() error (s) for %s [%s]\n",file_name,strerror(errno)); exit(1); } *xfilelen = xbuf->st_size; /* printf ("XFOPEN: stream_p=%p addr = %p\n",fx,&fx); */ return(fx); } printf("Unable to open: %s\n",file_name); exit(1); } /*=====xjdicrc - access and analyze "xjdicrc" file (if any)==============*/ void xjdicrc() { unsigned char xjdicdir[128],rcstr[80],*rcwd; int ft,fn; FILE *fm,*fopen(); xjdicdir[0] = '\0'; if (strlen(ENVname) > 2) { strcpy(xjdicdir,ENVname); strcat(xjdicdir,"/"); } else { strcpy(xjdicdir,getenv("HOME")); strcat(xjdicdir,"/"); } strcat(xjdicdir,".xjdicrc"); fm = fopen(xjdicdir,"r"); if (fm == NULL) { strcpy(xjdicdir,".xjdicrc"); fm = fopen(xjdicdir,"r"); } if (fm == NULL) { strcpy(xjdicdir,getenv("HOME")); strcat(xjdicdir,"/"); strcat(xjdicdir,".xjdicrc"); fm = fopen(xjdicdir,"r"); } if (fm != NULL) { while(fgets(rcstr,79,fm) != NULL) { rcwd = (unsigned char *)strtok(rcstr," \t"); if( stringcomp((unsigned char *)"dicdir",rcwd) == 0) { rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); strcpy(DicDir,rcwd); continue; } if( stringcomp((unsigned char *)"radkfile",rcwd) == 0) { rcwd = (unsigned char *)strtok(NULL," \t\f\r\n"); strcpy(RKname,rcwd); continue; } } } else { printf("No .xjdicrc file detected\n"); return; } fclose(fm); } /* M A I N */ main() { int i,j; unsigned char *dicenv,strtmp[50]; printf("XJDRAD version %s (Japanese Dictionary) Copyright J.W.Breen 2003.\n",sver); xbuf = (void *)malloc(sizeof(struct stat)); dicenv = (unsigned char *)getenv("XJDIC"); if (!dicenv) dicenv = (unsigned char *)DEFAULT_DICDIR; if (strlen(dicenv) <= 2) { dicenv = (unsigned char *)getcwd(ENVname,sizeof(ENVname)); if (dicenv == NULL) { printf("Cannot extract working directory!\n"); exit(1); } } else { strcpy (ENVname,dicenv); } sprintf(RKname, "%s/%s", dicenv, IRKname); xjdicrc(); RadDisp(); } makekanjstroke.c0100644000076400007640000000110306100077726012372 0ustar jwbjwb#include #include #include FILE *fi,*fo,*fopen(); unsigned char instr[1000],*ptr; int i; main() { fo = fopen("kanjstroke","w"); if (fo == NULL) { printf("Unable to open output file: kanjstroke\n"); exit(1); } fi = fopen("kanjidic","r"); if (fi == NULL) { printf("Unable to open input file: kanjidic\n"); exit(1); } while(!feof(fi)) { fgets(instr,999,fi); if (feof(fi)) break; if (instr[0] < 127) continue; ptr = strstr(instr," S"); i = atoi(ptr+2); fprintf(fo,"%c%c%c\n",instr[0],instr[1],i+'0'); } fclose(fo); } vconj0100644000076400007640000001404507665046714010302 0ustar jwbjwb# # V C O N J - control file for verb and adjective deinflection # # the following section sets up the labels which are used for the # various inflections. These are displayed by the program. # The initial labels can be edited by the user. # # First there are the labels for the types of conjugations # 0 plain, negative, nonpast 1 polite, non-past 2 conditional 3 volitional 4 te-form 5 plain, past 6 plain, negative, past 7 passive 8 causative 9 potential or imperative 10 imperative 11 polite, past 12 polite, negative, non-past 13 polite, negative, past 14 polite, volitional 15 adj. -> adverb 16 adj., past 17 polite 18 polite, volitional 19 passive or potential 20 passive (or potential if Grp 2) 21 adj., negative 22 adj., negative, past 23 adj., past 24 plain verb 25 desire 26 desire, past # # and these are the conjugations/inflections, and their dictionary forms # (please note that these are scanned from the top, so the order is # critical if the correct guess is to be made.) # $ this line flags the start of them # ¤Æ ¤ë 4 ¤«¤Ê¤¤ ¤¯ 0 ¤«¤Ê¤« ¤¯ 6 ¤­¤Þ¤¹ ¤¯ 1 ¤­¤Þ¤·¤¿ ¤¯ 11 # NB: the order of the two following must not change, as the scan is downwards ¤­¤Þ¤»¤ó¤Ç¤·¤¿ ¤¯ 13 ¤­¤Þ¤»¤ó ¤¯ 12 ¤­¤Þ¤·¤ç¤¦ ¤¯ 18 ¤­¤¿¤¤ ¤¯ 25 ¤­¤¿¤«¤Ã¤¿ ¤¯ 26 ¤±¤Ð ¤¯ 2 ¤³¤¦ ¤¯ 3 ¤¤¤Æ ¤¯ 4 ¤Ã¤Æ ¤¯ 4 ¤¤¤¿ ¤¯ 5 ¤Ã¤¿ ¤¯ 5 ¤«¤ì ¤¯ 7 ¤«¤» ¤¯ 8 ¤± ¤¯ 9 ¤µ¤Ê¤¤ ¤¹ 0 ¤µ¤Ê¤« ¤¹ 6 ¤·¤Þ¤¹ ¤¹ 1 ¤·¤Þ¤·¤¿ ¤¹ 11 ¤·¤Þ¤»¤ó¤Ç¤·¤¿ ¤¹ 13 ¤·¤Þ¤»¤ó ¤¹ 12 ¤·¤Þ¤·¤ç¤¦ ¤¹ 18 ¤»¤Ð ¤¹ 2 ¤½¤¦ ¤¹ 3 ¤·¤Æ ¤¹ 4 ¤·¤¿ ¤¹ 5 ¤µ¤ì ¤¹ 7 ¤µ¤» ¤¹ 8 ¤«¤µ¤Ê¤¤ ¤«¤¹ 0 ¤«¤µ¤Ê¤« ¤«¤¹ 6 ¤«¤·¤Þ¤¹ ¤«¤¹ 1 ¤«¤·¤Þ¤·¤¿ ¤«¤¹ 11 ¤«¤·¤Þ¤»¤ó¤Ç¤·¤¿ ¤«¤¹ 13 ¤«¤·¤Þ¤»¤ó ¤«¤¹ 12 ¤«¤·¤Þ¤·¤ç¤¦ ¤«¤¹ 18 ¤«¤»¤Ð ¤«¤¹ 2 ¤«¤½¤¦ ¤«¤¹ 3 ¤«¤·¤Æ ¤«¤¹ 4 ¤«¤·¤¿ ¤«¤¹ 5 ¤«¤µ¤ì ¤«¤¹ 7 ¤«¤µ¤» ¤«¤¹ 8 ¤¿¤Ê¤¤ ¤Ä 0 ¤¿¤Ê¤« ¤Ä 6 ¤Á¤Þ¤¹ ¤Ä 1 ¤Á¤Þ¤·¤¿ ¤Ä 11 ¤Á¤Þ¤»¤ó¤Ç¤·¤¿ ¤Ä 13 ¤Á¤Þ¤»¤ó ¤Ä 12 ¤Á¤Þ¤·¤ç¤¦ ¤Ä 18 ¤Æ¤Ð ¤Ä 2 ¤È¤¦ ¤Ä 3 ¤Ã¤Æ ¤Ä 4 ¤Ã¤¿ ¤Ä 5 ¤¿¤ì ¤Ä 7 ¤¿¤» ¤Ä 8 ¤Æ ¤Ä 9 ¤Ê¤Ê¤¤ ¤Ì 0 ¤Ê¤Ê¤« ¤Ì 6 ¤Ë¤Þ¤¹ ¤Ì 1 ¤Ë¤Þ¤·¤¿ ¤Ì 11 ¤Ë¤Þ¤»¤ó¤Ç¤·¤¿ ¤Ì 13 ¤Ë¤Þ¤»¤ó ¤Ì 12 ¤Ë¤Þ¤·¤ç¤¦ ¤Ë 18 ¤Í¤Ð ¤Ì 2 ¤Î¤¦ ¤Ì 3 ¤ó¤Ç ¤Ì 4 ¤ó¤À ¤Ì 5 ¤Ê¤ì ¤Ì 7 ¤Ê¤» ¤Ì 8 ¤Í ¤Ì 9 ¤Þ¤Ê¤¤ ¤à 0 ¤Þ¤Ê¤« ¤à 6 ¤ß¤Þ¤¹ ¤à 1 ¤ß¤Þ¤·¤¿ ¤à 11 ¤ß¤Þ¤»¤ó¤Ç¤·¤¿ ¤à 13 ¤ß¤Þ¤»¤ó ¤à 12 ¤ß¤Þ¤·¤ç¤¦ ¤à 18 ¤á¤Ð ¤à 2 ¤â¤¦ ¤à 3 ¤ó¤Ç ¤à 4 ¤ó¤À ¤à 5 ¤Þ¤ì ¤à 7 ¤Þ¤» ¤à 8 ¤á ¤à 9 ¤é¤Ê¤¤ ¤ë 0 ¤é¤Ê¤« ¤ë 6 ¤ê¤Þ¤¹ ¤ë 1 ¤ê¤Þ¤·¤¿ ¤ë 11 ¤ê¤Þ¤»¤ó¤Ç¤·¤¿ ¤ë 13 ¤ê¤Þ¤»¤ó ¤ë 12 ¤ê¤Þ¤·¤ç¤¦ ¤ë 18 ¤ì¤Ð ¤ë 2 ¤í¤¦ ¤ë 3 ¤Ã¤Æ ¤ë 4 ¤Ã¤¿ ¤ë 5 ¤é¤ì ¤ë 20 ¤é¤» ¤ë 8 ¤¿¤é¤Ê¤¤ ¤¿¤ë 0 ¤¿¤é¤Ê¤« ¤¿¤ë 6 ¤¿¤ê¤Þ¤¹ ¤¿¤ë 1 ¤¿¤ê¤Þ¤·¤¿ ¤¿¤ë 11 ¤¿¤ê¤Þ¤»¤ó¤Ç¤·¤¿ ¤¿¤ë 13 ¤¿¤ê¤Þ¤»¤ó ¤¿¤ë 12 ¤¿¤ê¤Þ¤·¤ç¤¦ ¤¿¤ë 18 ¤¿¤ì¤Ð ¤¿¤ë 2 ¤¿¤í¤¦ ¤¿¤ë 3 ¤¿¤Ã¤Æ ¤¿¤ë 4 ¤¿¤Ã¤¿ ¤¿¤ë 5 ¤¿¤é¤ì ¤¿¤ë 20 ¤¿¤é¤» ¤¿¤ë 8 # ¤ì ¤ë 9 moved below ¤ï¤é¤Ê¤¤ ¤ï¤ë 0 ¤ï¤ê¤Þ¤¹ ¤ï¤ë 1 ¤ï¤ê¤Þ¤»¤ó ¤ï¤ë 12 ¤ï¤Ã¤¿ ¤ï¤ë 5 ¤ï¤ê¤Þ¤·¤¿ ¤ï¤ë 11 ¤ï¤é¤Ê¤«¤Ã¤¿ ¤ï¤ë 6 ¤ï¤Ã¤Æ ¤ï¤ë 4 ¤ï¤é¤Ê ¤ï¤ë 2 ¤ï¤Ê¤¤ ¤¦ 0 ¤ï¤Ê¤« ¤¦ 6 ¤¤¤Þ¤¹ ¤¦ 1 ¤¤¤Þ¤·¤¿ ¤¦ 11 ¤¤¤Þ¤»¤ó¤Ç¤·¤¿ ¤¦ 13 ¤¤¤Þ¤»¤ó ¤¦ 12 ¤¤¤Þ¤·¤ç¤¦ ¤¦ 18 ¤¨¤Ð ¤¦ 2 ¤ª¤¦ ¤¦ 3 ¤Ã¤Æ ¤¦ 4 ¤Ã¤¿ ¤¦ 5 ¤ï¤ì ¤¦ 7 ¤ï¤» ¤¦ 8 ¤¨ ¤¦ 9 ¤¬¤Ê¤¤ ¤° 0 ¤¬¤Ê¤« ¤° 6 ¤®¤Þ¤¹ ¤° 1 ¤®¤Þ¤·¤¿ ¤° 11 ¤®¤Þ¤»¤ó¤Ç¤·¤¿ ¤° 13 ¤®¤Þ¤»¤ó ¤° 12 ¤®¤Þ¤·¤ç¤¦ ¤° 18 ¤²¤Ð ¤° 2 ¤´¤¦ ¤° 3 ¤¤¤Ç ¤° 4 ¤¤¤À ¤° 5 ¤¬¤ì ¤° 7 ¤¬¤» ¤° 8 ¤² ¤° 9 ¤Ð¤Ê¤¤ ¤Ö 0 ¤Ð¤Ê¤« ¤Ö 6 ¤Ó¤Þ¤¹ ¤Ö 1 ¤Ó¤Þ¤·¤¿ ¤Ö 11 ¤Ó¤Þ¤»¤ó¤Ç¤·¤¿ ¤Ö 13 ¤Ó¤Þ¤»¤ó ¤Ö 12 ¤Ó¤Þ¤·¤ç¤¦ ¤Ö 18 ¤Ù¤Ð ¤Ö 2 ¤Ü¤¦ ¤Ö 3 ¤ó¤Ç ¤Ö 4 ¤ó¤À ¤Ö 5 ¤Ð¤ì ¤Ö 7 ¤Ð¤» ¤Ö 8 ¤Ù ¤Ö 9 ¤Ê¤¤ ¤ë 0 ¤Ê¤« ¤ë 6 ¤Þ¤¹ ¤ë 1 ¤Þ¤·¤¿ ¤ë 11 ¤Þ¤»¤ó¤Ç¤·¤¿ ¤ë 13 ¤Þ¤»¤ó ¤ë 12 ¤Þ¤·¤ç¤¦ ¤ë 18 ¤ì¤Ð ¤ë 2 ¤è¤¦ ¤ë 3 ¤Æ ¤ë 4 ¤¿ ¤ë 5 ¤é¤ì ¤ë 20 ¤µ¤» ¤ë 8 ¤í ¤ë 10 ¤é¤Þ ¤ë 17 ¤¯¤Ê¤« ¤¤ 22 ¤¯¤Ê ¤¤ 21 ¤«¤Ã¤¿ ¤¤ 23 ¤¬¤Ã¤¿ ¤¬¤ë 5 ¤¯ ¤¯ 24 ¤¯ ¤¤ 15 ¤·¤« ¤·¤¤ 16 ¤±¤Þ¤¹ ¤±¤ë 1 ¤±¤Þ¤·¤¿ ¤±¤ë 11 ¤±¤Þ¤»¤ó¤Ç¤· ¤±¤ë 13 ¤±¤Þ¤»¤ó ¤±¤ë 12 ¤±¤Þ¤·¤ç¤¦ ¤±¤ë 18 ¤±¤Ê¤¤ ¤±¤ë 0 ¤±¤Ê¤« ¤±¤ë 6 ¤±¤ì ¤±¤ë 2 ¤±¤è ¤±¤ë 3 ¤±¤Æ ¤±¤ë 4 ¤±¤¿ ¤±¤ë 5 ¤±¤é ¤±¤ë 19 ¤±¤µ ¤±¤ë 8 ¤±¤í ¤±¤ë 10 ¤²¤Þ¤¹ ¤²¤ë 1 ¤²¤Þ¤·¤¿ ¤²¤ë 11 ¤²¤Þ¤»¤ó¤Ç¤· ¤²¤ë 13 ¤²¤Þ¤»¤ó ¤²¤ë 12 ¤²¤Þ¤·¤ç¤¦ ¤²¤ë 18 ¤²¤Ê¤¤ ¤²¤ë 0 ¤²¤Ê¤« ¤²¤ë 6 ¤²¤Æ ¤²¤ë 4 ¤²¤ì ¤²¤ë 2 ¤²¤è ¤²¤ë 3 ¤²¤¿ ¤²¤ë 5 ¤²¤é ¤²¤ë 19 ¤²¤µ ¤²¤ë 8 ¤²¤í ¤²¤ë 10 ¤Ù¤Þ¤¹ ¤Ù¤ë 1 ¤Ù¤Þ¤·¤¿ ¤Ù¤ë 11 ¤Ù¤Þ¤»¤ó¤Ç¤· ¤Ù¤ë 13 ¤Ù¤Þ¤»¤ó ¤Ù¤ë 12 ¤Ù¤Þ¤·¤ç¤¦ ¤Ù¤ë 18 ¤Ù¤Ê¤¤ ¤Ù¤ë 0 ¤Ù¤Ê¤« ¤Ù¤ë 6 ¤Ù¤ì ¤Ù¤ë 2 ¤Ù¤è ¤Ù¤ë 3 ¤Ù¤Æ ¤Ù¤ë 4 ¤Ù¤¿ ¤Ù¤ë 5 ¤Ù¤é ¤Ù¤ë 19 ¤Ù¤µ ¤Ù¤ë 8 ¤Ù¤í ¤Ù¤ë 10 ¤á¤Þ¤¹ ¤á¤ë 1 ¤á¤Þ¤·¤¿ ¤á¤ë 11 ¤á¤Þ¤»¤ó¤Ç¤· ¤á¤ë 13 ¤á¤Þ¤»¤ó ¤á¤ë 12 ¤á¤Þ¤·¤ç¤¦ ¤á¤ë 18 ¤á¤Ê¤¤ ¤á¤ë 0 ¤á¤Ê¤« ¤á¤ë 6 ¤á¤ì ¤á¤ë 2 ¤á¤è ¤á¤ë 3 ¤á¤Æ ¤á¤ë 4 ¤á¤¿ ¤á¤ë 5 ¤á¤é ¤á¤ë 19 ¤á¤µ ¤á¤ë 8 ¤á¤í ¤á¤ë 10 ¤¨¤Þ¤¹ ¤¨¤ë 1 ¤¨¤Þ¤·¤¿ ¤¨¤ë 11 ¤¨¤Þ¤»¤ó¤Ç¤· ¤¨¤ë 13 ¤¨¤Þ¤»¤ó ¤¨¤ë 12 ¤¨¤Þ¤·¤ç¤¦ ¤¨¤ë 18 ¤¨¤Ê¤¤ ¤¨¤ë 0 ¤¨¤Ê¤« ¤¨¤ë 6 ¤¨¤ì ¤¨¤ë 2 ¤¨¤è ¤¨¤ë 3 ¤¨¤Æ ¤¨¤ë 4 ¤¨¤¿ ¤¨¤ë 5 ¤¨¤é ¤¨¤ë 19 ¤¨¤µ ¤¨¤ë 8 ¤¨¤í ¤¨¤ë 10 ¤ì¤Þ¤¹ ¤ì¤ë 1 ¤ì¤Þ¤·¤¿ ¤ì¤ë 11 ¤ì¤Þ¤»¤ó¤Ç¤· ¤ì¤ë 13 ¤ì¤Þ¤»¤ó ¤ì¤ë 12 ¤ì¤Þ¤·¤ç¤¦ ¤ì¤ë 18 ¤ì¤Ê¤¤ ¤ì¤ë 0 ¤ì¤Ê¤« ¤ì¤ë 6 ¤ì¤ì ¤ì¤ë 2 ¤ì¤è ¤ì¤ë 3 ¤ì¤Æ ¤ì¤ë 4 ¤ì¤¿ ¤ì¤ë 5 ¤ì¤é ¤ì¤ë 19 ¤ì¤µ ¤ì¤ë 8 ¤ì¤í ¤ì¤ë 10 ¤ì ¤ë 9 ¤Í¤Þ¤¹ ¤Í¤ë 1 ¤Í¤Þ¤·¤¿ ¤Í¤ë 11 ¤Í¤Þ¤»¤ó¤Ç¤· ¤Í¤ë 13 ¤Í¤Þ¤»¤ó ¤Í¤ë 12 ¤Í¤Þ¤·¤ç¤¦ ¤Í¤ë 18 ¤Í¤Ê¤¤ ¤Í¤ë 0 ¤Í¤Ê¤« ¤Í¤ë 6 ¤Í¤ì ¤Í¤ë 2 ¤Í¤è ¤Í¤ë 3 ¤Í¤Æ ¤Í¤ë 4 ¤Í¤¿ ¤Í¤ë 5 ¤Í¤é ¤Í¤ë 19 ¤Í¤µ ¤Í¤ë 8 ¤Í¤í ¤Í¤ë 10 ¤»¤Þ¤¹ ¤»¤ë 1 ¤»¤Þ¤·¤¿ ¤»¤ë 11 ¤»¤Þ¤»¤ó¤Ç¤· ¤»¤ë 13 ¤»¤Þ¤»¤ó ¤»¤ë 12 ¤»¤Þ¤·¤ç¤¦ ¤»¤ë 18 ¤»¤Ê¤¤ ¤»¤ë 0 ¤»¤Ê¤« ¤»¤ë 6 ¤»¤ì ¤»¤ë 2 ¤»¤è ¤»¤ë 3 ¤»¤Æ ¤»¤ë 4 ¤»¤¿ ¤»¤ë 5 ¤»¤é ¤»¤ë 19 ¤»¤µ ¤»¤ë 8 ¤»¤í ¤»¤ë 10 ¤» ¤¹ 9 ¤¼¤Þ¤¹ ¤¼¤ë 1 ¤¼¤Þ¤·¤¿ ¤¼¤ë 11 ¤¼¤Þ¤»¤ó¤Ç¤· ¤¼¤ë 13 ¤¼¤Þ¤»¤ó ¤¼¤ë 12 ¤¼¤Þ¤·¤ç¤¦ ¤¼¤ë 18 ¤¼¤Ê¤¤ ¤¼¤ë 0 ¤¼¤Ê¤« ¤¼¤ë 6 ¤¼¤ì ¤¼¤ë 2 ¤¼¤è ¤¼¤ë 3 ¤¼¤Æ ¤¼¤ë 4 ¤¼¤¿ ¤¼¤ë 5 ¤¼¤é ¤¼¤ë 19 ¤¼¤µ ¤¼¤ë 8 ¤¼¤í ¤¼¤ë 10 ¤Æ¤Þ¤¹ ¤Æ¤ë 1 ¤Æ¤Þ¤·¤¿ ¤Æ¤ë 11 ¤Æ¤Þ¤»¤ó¤Ç¤· ¤Æ¤ë 13 ¤Æ¤Þ¤»¤ó ¤Æ¤ë 12 ¤Æ¤Þ¤·¤ç¤¦ ¤Æ¤ë 18 ¤Æ¤Ê¤¤ ¤Æ¤ë 0 ¤Æ¤Ê¤« ¤Æ¤ë 6 ¤Æ¤ì ¤Æ¤ë 2 ¤Æ¤è ¤Æ¤ë 3 ¤Æ¤Æ ¤Æ¤ë 4 ¤Æ¤¿ ¤Æ¤ë 5 ¤Æ¤é ¤Æ¤ë 19 ¤Æ¤µ ¤Æ¤ë 8 ¤Æ¤í ¤Æ¤ë 10 ¤Ç¤Þ¤¹ ¤Ç¤ë 1 ¤Ç¤Þ¤·¤¿ ¤Ç¤ë 11 ¤Ç¤Þ¤»¤ó¤Ç¤· ¤Ç¤ë 13 ¤Ç¤Þ¤»¤ó ¤Ç¤ë 12 ¤Ç¤Þ¤·¤ç¤¦ ¤Ç¤ë 18 ¤Ç¤Ê¤¤ ¤Ç¤ë 0 ¤Ç¤Ê¤« ¤Ç¤ë 6 ¤Ç¤ì ¤Ç¤ë 2 ¤Ç¤è ¤Ç¤ë 3 ¤Ç¤Æ ¤Ç¤ë 4 ¤Ç¤¿ ¤Ç¤ë 5 ¤Ç¤é ¤Ç¤ë 19 ¤Ç¤µ ¤Ç¤ë 8 ¤Ç¤í ¤Ç¤ë 10 ¤Ê¤Ã¤¿ ¤Ê¤¦ 5 ¤Þ¤é¤Ê¤¤ ¤Þ¤ë 0 ¤Þ¤é¤Ê¤« ¤Þ¤ë 6 ¤Þ¤ê¤Þ¤¹ ¤Þ¤ë 1 ¤Þ¤ê¤Þ¤·¤¿ ¤Þ¤ë 11 ¤Þ¤ê¤Þ¤»¤ó¤Ç¤·¤¿ ¤Þ¤ë 13 ¤Þ¤ê¤Þ¤»¤ó ¤Þ¤ë 12 ¤Þ¤ê¤Þ¤·¤ç¤¦ ¤Þ¤ë 18 ¤Þ¤ì¤Ð ¤Þ¤ë 2 ¤Þ¤è¤¦ ¤Þ¤ë 3 ¤Þ¤Ã¤Æ ¤Þ¤ë 4 ¤Þ¤Ã¤¿ ¤Þ¤ë 5 ¤Þ¤é¤ì ¤Þ¤ë 20 ¤Þ¤µ¤» ¤Þ¤ë 8 ¤Þ¤í ¤Þ¤ë 10 ¤Þ¤é¤Þ ¤Þ¤ë 17 ¤Þ¤·¤Þ¤¹ ¤Þ¤¹ 1 ¤Þ¤µ¤Ê¤¤ ¤Þ¤¹ 0 ¤Þ¤·¤Þ¤»¤ó ¤Þ¤¹ 12 ¤Þ¤·¤¿ ¤Þ¤¹ 5 ¤Þ¤·¤Þ¤·¤¿ ¤Þ¤¹ 11 ¤Þ¤µ¤Ê¤«¤Ã¤¿ ¤Þ¤¹ 6 ¤Þ¤·¤Þ¤»¤ó¤Ç¤·¤¿ ¤Þ¤¹ 13 ¤Þ¤·¤Æ ¤Þ¤¹ 4 romkana.cnv0100644000076400007640000000756606100077730011373 0ustar jwbjwb# This is the Romaji to Kana conversion file for JDIC and XJDIC # Any line beginning with a # is a comment. # Each data line must contain a kana/romaji pair, separated by one or # more spaces, the rest of the line is a comment. # Each entry can have at most 6 ascii or 3 kana characters. # Order doesn't matter. # # As distributed, the file should handle most of the common Hepburn and # Kunrei moras. Note that some mappings are commented out. These can # modified according to user taste. # Feel free to add to this file, but don't delete the "*" or "q" lines # # The original version of this file was obtained from a couple of MOKE's # .hlp files. Thanks Mark. # $HIRAGANA TABLE (don't delete this line) ¡¼ - ¡¦ . ¤¡ xa ¤¢ a ¤£ xi ¤¤ i ¤¥ xu ¤¦ u ¤§ xe ¤¨ e ¤¨ ye ¤© xo ¤ª o ¤« ka ¤¬ ga ¤­ ki ¤­¤ã kya ¤­¤å kyu ¤­¤§ kye ¤­¤ç kyo ¤® gi ¤®¤ã gya ¤®¤å gyu ¤®¤§ gye ¤®¤ç gyo ¤¯ ku ¤° gu ¤± ke ¤² ge ¤³ ko ¤´ go ¤µ sa ¤¶ za ¤· shi ¤· si ¤· syi ¤·¤ã sha ¤·¤ã sya ¤·¤å shu ¤·¤å syu ¤·¤§ she ¤·¤§ sye ¤·¤ç sho ¤·¤ç syo ¤¸ ji ¤¸ zi ¤¸ jyi ¤¸¤ã ja ¤¸¤ã jya ¤¸¤å ju ¤¸¤å jyu ¤¸¤§ je ¤¸¤§ jye ¤¸¤ç jo ¤¸¤ç jyo ¤¹ su ¤º zu # ¤º¤£ zi ¤» se ¤¼ ze ¤½ so ¤¾ zo ¤¿ ta ¤À da ¤Á chi ¤Á cyi ¤Á ti ¤Á tyi ¤Á¤ã cha ¤Á¤ã cya ¤Á¤ã tya ¤Á¤å chu ¤Á¤å cyu ¤Á¤å tyu ¤Á¤§ che ¤Á¤§ cye ¤Á¤§ tye ¤Á¤ç cho ¤Á¤ç cyo ¤Á¤ç tyo ¤Â dzi ¤Â dji ¤Â¤ã dza ¤Â¤ã dja # ¤Â¤å dzu ¤Â¤å dju ¤Â¤§ dze ¤Â¤§ dje ¤Â¤ç dzo ¤Â¤ç djo ¤Ã * note that * = small-tsu is necessary ¤Ã t- ¤Ã¤Á tchi ¤Ã¤Á¤ã tcha ¤Ã¤Á¤å tchu ¤Ã¤Á¤§ tche ¤Ã¤Á¤ç tcho ¤Ä tsu ¤Ä tu ¤Ä¤¡ tsa ¤Ä¤§ tse ¤Ä¤© tso ¤Å dzu ¤Æ te #¤Æ¤£ ti (not used because kunrei ti=chi above) #¤Æ¤ã tya #¤Æ¤å tyu #¤Æ¤ç tyo ¤Ç de ¤Ç¤£ di ¤Ç¤ã dya ¤Ç¤å dyu ¤Ç¤§ dye ¤Ç¤ç dyo ¤È to ¤É do ¤É¤¥ du ¤Ê na ¤Ë ni ¤Ë¤ã nya ¤Ë¤å nyu ¤Ë¤§ nye ¤Ë¤ç nyo ¤Ì nu ¤Í ne ¤Î no ¤Ï ha ¤Ð ba ¤Ñ pa ¤Ò hi ¤Ò¤ã hya ¤Ò¤å hyu ¤Ò¤§ hye ¤Ò¤ç hyo ¤Ó bi ¤Ó¤ã bya ¤Ó¤å byu ¤Ó¤§ bye ¤Ó¤ç byo ¤Ô pi ¤Ô¤ã pya ¤Ô¤å pyu ¤Ô¤§ pye ¤Ô¤ç pyo ¤Õ fu ¤Õ hu ¤Õ¤¡ fa ¤Õ¤£ fi ¤Õ¤§ fe ¤Õ¤© fo ¤Õ¤ã fya ¤Õ¤å fyu ¤Õ¤§ fye ¤Õ¤ç fyo ¤Ö bu ¤× pu ¤Ø he ¤Ù be ¤Ú pe ¤Û ho ¤Ü bo ¤Ý po ¤Þ ma ¤ß mi ¤ß¤ã mya ¤ß¤å myu ¤ß¤§ mye ¤ß¤ç myo ¤à mu ¤á me ¤â mo ¤ã xya ¤ä ya ¤å xyu ¤æ yu ¤ç xyo ¤è yo ¤é ra ¤ê ri ¤ê¤ã rya ¤ê¤å ryu ¤ê¤§ rye ¤ê¤ç ryo ¤ë ru ¤ì re ¤í ro ¤î xwa ¤ï wa ¤ð wi ¤ñ we ¤ò wo ¤ó n' ¤ó q note that q = n is necessary $KATAKANA (DON'T delete this line!) ¡¼ - ¡¦ . ¥¡ xa ¥¢ a ¥£ xi ¥¤ i ¥¥ xu ¥¦ u ¥§ xe ¥¨ e ¥¨ ye ¥© xo ¥ª o ¥« ka ¥¬ ga ¥­ ki ¥­¥ã kya ¥­¥å kyu ¥­¥§ kye ¥­¥ç kyo ¥® gi ¥®¥ã gya ¥®¥å gyu ¥®¥§ gye ¥®¥ç gyo ¥¯ ku ¥° gu ¥± ke ¥² ge ¥³ ko ¥´ go ¥µ sa ¥¶ za ¥· shi ¥· si ¥· syi ¥·¥ã sha ¥·¥ã sya ¥·¥å shu ¥·¥å syu ¥·¥§ she ¥·¥§ sye ¥·¥ç sho ¥·¥ç syo ¥¸ ji ¥¸ zi ¥¸ jyi ¥¸¥ã ja ¥¸¥ã jya ¥¸¥å ju ¥¸¥å jyu ¥¸¥§ je ¥¸¥§ jye ¥¸¥ç jo ¥¸¥ç jyo ¥¹ su ¥º zu # ¥º¥£ zi ¥» se ¥¼ ze ¥½ so ¥¾ zo ¥¿ ta ¥À da ¥Á chi ¥Á cyi ¥Á ti ¥Á tyi ¥Á¥ã cha ¥Á¥ã cya ¥Á¥ã tya ¥Á¥å chu ¥Á¥å cyu ¥Á¥å tyu ¥Á¥§ che ¥Á¥§ cye ¥Á¥§ tye ¥Á¥ç cho ¥Á¥ç cyo ¥Á¥ç tyo ¥Â dzi ¥Â dji ¥Â¥ã dza ¥Â¥ã dja # ¥Â¥å dzu ¥Â¥å dju ¥Â¥§ dze ¥Â¥§ dje ¥Â¥ç dzo ¥Â¥ç djo ¥Ã * note that *=small-tsu is necessary ¥Ã t- ¥Ã¥Á tchi ¥Ã¥Á¥ã tcha ¥Ã¥Á¥å tchu ¥Ã¥Á¥§ tche ¥Ã¥Á¥ç tcho ¥Å dzu # ¥¸ dzu ¥Ä tsu ¥Ä tu ¥Ä¥¡ tsa ¥Ä¥§ tse ¥Ä¥© tso ¥Æ te #¥Æ¥£ ti (not used because kunrei ti=chi above) #¥Æ¥ã tya #¥Æ¥å tyu #¥Æ¥ç tyo ¥Ç de ¥Ç¥£ di ¥Ç¥ã dya ¥Ç¥å dyu ¥Ç¥§ dye ¥Ç¥ç dyo ¥È to ¥É do ¥É¥¥ du ¥Ê na ¥Ë ni ¥Ë¥ã nya ¥Ë¥å nyu ¥Ë¥§ nye ¥Ë¥ç nyo ¥Ì nu ¥Í ne ¥Î no ¥Ï ha ¥Ð ba ¥Ñ pa ¥Ò hi ¥Ò¥ã hya ¥Ò¥å hyu ¥Ò¥§ hye ¥Ò¥ç hyo ¥Ó bi ¥Ó¥ã bya ¥Ó¥å byu ¥Ó¥§ bye ¥Ó¥ç byo ¥Ô pi ¥Ô¥ã pya ¥Ô¥å pyu ¥Ô¥§ pye ¥Ô¥ç pyo ¥Õ fu ¥Õ hu ¥Õ¥¡ fa ¥Õ¥£ fi ¥Õ¥§ fe ¥Õ¥© fo ¥Õ¥ã fya ¥Õ¥å fyu ¥Õ¥§ fye ¥Õ¥ç fyo ¥Ö bu ¥× pu ¥Ø he ¥Ù be ¥Ú pe ¥Û ho ¥Ü bo ¥Ý po ¥Þ ma ¥ß mi ¥ß¥ã mya ¥ß¥å myu ¥ß¥§ mye ¥ß¥ç myo ¥à mu ¥á me ¥â mo ¥ã xya ¥ä ya ¥å xyu ¥æ yu ¥ç xyo ¥è yo ¥é ra ¥ê ri ¥ê¥ã rya ¥ê¥å ryu ¥ê¥§ rye ¥ê¥ç ryo ¥ë ru ¥ì re ¥í ro ¥î xwa ¥ï wa ¥ð wi ¥ñ we ¥ò wo ¥ó n' ¥ó q note that q = n is necessary ¥ô vu ¥ô¥¡ va ¥ô¥£ vi ¥ô¥§ ve ¥ô¥© vo ¥õ xka ¥ö xke radicals.tm0100644000076400007640000000335607665046741011367 0ustar jwbjwb£± 0 °ì 1 ¡Ã 2 Ц 3 ¥Î 4 ²µ 5 Э 6 £² 0 Æó 7 е 8 ¿Í 9 ²½ (9) Ф (9) ѹ 10 Æþ 11 Ȭ 12 ÑÄ 13 ÑÌ 14 ÑÒ 15 ÑÜ 16 Ñá 17 Åá 18 ´¢ (18) 3331 ÎÏ 19 Ò± 20 Ò¸ 21 Ò¹ 22 ½½ 24 ËÎ 25 ÒÇ 26 ÒÌ 27 ÒÓ 28 Ëô 29 ¹þ (162) £³ 0 ¸ý 30 Óø 31 ÅÚ 32 »Î 33 Ôé 34 ͼ 36 Âç 37 ½÷ 38 »Ò 39 Õß 40 À£ 41 ¾® 42 ¾° (42) Õ÷ 43 Õù 44 Ö¥ 45 »³ 46 Àî 47 Öß 47 ¹© 48 Öá 49 ̦ 49 ¶Ò 50 ´³ 51 Öö 52 Öø 53 ×® 54 ×° 55 ×µ 56 µÝ 57 ×À 58 ¥è 58 ×Á (58) ×Ä 59 ׯ 60 Ë» (61) 3D38 Ù© (64) 3F37 ½Á (85) 4653 ÈÈ (94) 4A6D çè 140 íé (162) 6134 Ë® (163) ïô (170) 6644 £´ 0 ¿´ 61 ÚÁ (61) Øù 62 ¸Í 63 ¼ê 64 »Ù 65 Ú½ 66 Ú¾ [66] ʸ 67 ÅÍ 68 ¶Ô 69 Êý 70 ÚÛ 71 ÚÜ [71] Æü 72 Û© 73 ·î 74 ÌÚ 75 ·ç 76 »ß 77 ÝÆ 78 ÝÕ 79 Êì [80] ÝÙ 80 Èæ 81 ÌÓ 82 »á 83 Ýã 84 ¿å 85 ²Ð 86 Û¿ (86) 4944 ÄÞ 87 Éã 88 à« 89 à­ 90 ÊÒ 91 ²ç 92 µí 93 ¸¤ 94 ²¦ [96] Îé (113) 504B Ï· (125) Ͼ (130) £µ 0 ¸¼ 95 ¶Ì 96 ±» 97 ´¤ 98 ´Å 99 À¸ 100 ÍÑ 101 ÅÄ 102 É¥ 103 áË 104 ⢠105 Çò 106 Èé 107 »® 108 ÌÜ 109 Ì· 110 Ìð 111 ÀÐ 112 ¼¨ 113 ã» 114 ²Ó 115 ·ê 116 Ω 117 æ© (122) 5474 ½é (145) 5C33 £¶ 0 ÃÝ 118 ÊÆ 119 »å 120 ´Ì 121 æ¦ 122 ÍÓ 123 ±© 124 Ï· 125 ¼© 126 æÐ 127 ¼ª 128 ææ 129 Æù 130 ¼« 132 »ê 133 ±± 134 Àå 135 Á¤ 136 ½® 137 º± 138 ¿§ 139 çç (140) éÈ 141 Ãî 142 ·ì 143 ¹Ô 144 °á 145 À¾ 146 £· 0 ¿Ã 131 ¸« 147 ³Ñ 148 ¸À 149 ë 150 Ʀ 151 ìµ 152 ì¸ 153 ³­ 154 ÀÖ 155 Áö 156 ­ 157 ¿È 158 ¼Ö 159 ¿É 160 ä 161 ͸ (163) ÆÓ 164 ÈÐ 165 Τ 166 Çþ 199 £¸ 0 ¶â 167 Ĺ 168 Ìç 169 Éì 170 Îì 171 ð² 172 ±« 173 ÀÄ 174 Èó 175 ÀÆ [210] £¹ 0 ÌÌ 176 ³× 177 ðê 178 Ç£ 179 ²» 180 ÊÇ 181 É÷ 182 Èô 183 ¿© 184 ¼ó 185 ¹á 186 10 0 ÇÏ 187 ¹ü 188 ¹â 189 ñõ 190 ò¨ 191 ò® 192 ò¯ 193 µ´ 194 ε 212 11 0 µû 195 Ä» 196 óà 197 ¼¯ 198 óÎ (199) Ëã 200 µµ [213] 12 0 ²« 201 µÐ 202 ¹õ 203 óã 204 13 0 óæ 205 Ť 206 ¸Ý 207 ÁÍ 208 14 0 É¡ 209 éµ 210 15 0 »õ 211 16 0 ζ 212 óý 213 17 0 óþ 214 radkfile0100644000076400007640000014273407665046724010754 0ustar jwbjwb# # R A D K F I L E # # Copyright 2001 Michael Raine, J. W. Breen # # This is the data file that drives the multi-radical lookup method in XJDIC, # WWWJDIC and possibly other dictionary and related software. # # The file is based on work done in 1994/1995 by Michael Raine in which he # analyzed all the JIS1/2 kanji and identified the constituent radicals and # other common elements, with the intention of facilitating the selection of # kanji within a dictionary program by identifying multiple elements. # The file was revised by Jim Breen in September 1995. Further revisions were # done in 1998/9 at the suggestion of Wolfgang Conrath, then a revision was # carried out in 2001 using suggestions from Yutaka Ohno based on a similar # decomposition made by Kobayashi. Further amendmenst were made in July # 2001 after suggestions from Hendrik. # # # The format of the file is as follows: # # (a) all lines starting with a # are comments # (b) all lines starting with a $ identify a kanji element, followed by its # stroke-count and optionally the JIS X 0212 code of the kanji whose glyph # better depicts the element in question. # (c) all other lines with kanji in them are associated with the previously # identified element. # # The file can, of course, be modified by users to suit their preferences. # Note that this file has been automatically compiled from another file, # "kradfile", in which each of the JIS1/2 kanji is listed, along with its # elements. # # Jim Breen, Tokyo, January 2001 # Melbourne, July 2001 # $ °ì 1 °¡°¢°¨°­°¿°Ð°Ø°Ú°Û°ä°æ°ê°ì°ò±¦±®±¯±¾±À±Î±×±Ý±ä±ø±û²¬²¼²Ä²Æ²É²Ï²Ñ²×²Ù²Ú²Þ ²è³«³·³À³Ä³Ö³Ù³à³î³ò³ø³ü³þ´¤´¨´³´¼´Á´Ä´Ç´Ë´Ô´ð´ñ´ó´õ´þµ©µ®µ³µ·µ¹µ¾µÁµÂµÃ µÄµÖµàµáµõ¶¡¶°¶½¶Æ¶È¶Ë¶Í¶æ¶ñ·®·¯·°·²·´·Ã·Å·ó·ô·ö·÷·ý·þ¸¯¸Ã¸Þ¸ß¸à¸ã¸ç¸è¸ë ¸ì¸ð¸÷¹¡¹¨¹ª¹±¹¸¹¹¹¼¹½¹¿¹Â¹Å¹É¹Ë¹Ï¹Ö¹Ø¹æº´º¸ºººÆºÇºÉºÊºÍºÔºßºàºâºèºêºëºì ºôºý»°»²»´»¹»½»Ç»È»Ê»Ì»Ó»Õ»Ü»à»ê»ì»ö»ü¼¢¼¤¼¥¼§¼¶¼Ì¼×¼ã¼æ¼÷½Å½Õ¾É¾Î¾Ú¾Ý¾à ¾å¾æ¾ç¾è¾ê¾ñ¾ó¾ö¾ø¿µ¿¸¿º¿¿¿Á¿Ó¿Ú¿â¿ç¿ê¿î¿ï¿ñÀ¤À¬À¯À°ÀµÀËÀÎÀÒÀëÀùÀýÁ°Á»Á¼ ÁÀÁÂÁÄÁÅÁÆÁÈÁËÁÓÁÕÁÖÁâÁåÁæÁèÁìÁòÁ÷ÁøÁü«®µ¶·¸ÂÃÂÄÂÆÂÊÂÎÂÓÂ×ÂÙÂðÂñÂ÷ Âúâçðòóôö÷ùÃÀÃÅÃÇÃÈÃÉÃÍÃâÃëÃ÷ÃùÃúģĪĮIJĺļľĿÄÃÄÄÄÐÄØÄÛÄõÄû ţŤųŵŷŸÅÂÅÃÅ×ÅàÅâÅäÅìÅïÅòÅôơƢƣƥƯưƱƶƹƼƽÆÀÆÌÆãÆõÆûǩǫǯǰ DZǵǹǻǿÇÀÇÁÇÑÇÒÇÕÇÖÇøÇúȡȭȱÈÔÈÝɭɯɳɴɾÉÂÉÈÉÍÉÔÉÛÉÝÉáÉèÉïÉñÉóÉûÉý ʡʥʵʺʻʼʽÊÁÊÂÊÄÊÐÊÓÊÔÊ×ÊØÊÜÊðÊôÊöÊ÷Êû˥˩˪˭˯˽ËÀËÛËÜËîËïËõËöËüËþ ̵̫̬̿ÌÈÌßÌðÌúͤͥͧͨͫͭʹ͹ͺͽ;ͿÍÀÍÂÍÈÍÌÍÛÍãÍóÍöÍùηλξÎÈÎÌÎÑÎØ ÎáÎâÎäÎçÎèÎêÎëÎíÎîÎïÎûϣϬϹÏÀÏÄÏÅÏÊÏËСТУЯгийÐÒÐÔÐáѬѺÑÀÑÆÑÇÑÊÑÔ ÑðÑòÒ¶ÒÁÒÄÒÏÒÚÒòÒüÓ§Ó©ÓªÓÃÓÎÓßÓëÓïÓüÔ¨Ô¯ÔÁÔÅÔÒÔÝÔáÔäÔçÔèÔôÕ«Õ²Õ´Õ½ÕÁÕÐÕÚ ÕÞÕéÕîÕóÕúÖ¬Ö¸Ö¼Ö¿ÖÆÖÇÖâÖèÖüק׬׷׻׽×Í×Ù×ß×ã×ñ×øØ¨ØªØÓØ×ØÚØðØþ١٨ٶٸ ÙÊÙÏÙÖÙëÙìÚªÚµÚËÚßÚæÚéÚëÚìÚíÚ÷ÚøÚúÛ¡Û¨Û®Û²Û³Û½ÛÉÛßÛáÛòÛóÛ÷ܧܮܰܲÜÍÜìÜó ݤݦݸݺÝÃÝÏÝìÞ³Þ¾ÞÂÞÇÞÍÞÓÞÞÞàÞü߱߾߯ßÐßÛßßßáßëà©à³à¼à½àÈàÙàåà÷á©á´á¶áÁ áÃáÅáÇáËáÕáÝáÞáçáñâ½âÀâÖâØâàã¬ã­ã±ã¸ã¹ãºã½ãÁãÂãÊãÕãÛãàãîäÀäÂäÃäÊäÍäÎäÏäà äåäéäøå°åºåÅåÌåÑåÖåßåäæ¨æ©æÈæÉæÛæõç¡ç¢ç»çÐçÝçòçóçöçýè¨è³è´èÀèÁèåèîèóèôèø èýé¨é®é´éÉéËéÍéÐéÓéßéüéþê³êÅêÈêìêíêïê÷êúë²ëÅëæëèëéëëëöì¤ì§ìªì¹ìÏìÐìéìíí¡ í¨íªí«í½íÉíÒíÔíèíîíôî©î®îÄîÌîÏîÔîÖîæîûï¯ï»ïÐïÙïâïúð¤ðÇñ¼ñ¿ñÕñÙñÚñðñòñùò¥ òÆó§óºô¡ô¢ $ ¡Ã 1 °¡°¢°©°­°Ê°Ë°æ°ð°õ°ú±­±¯±²±ë±ð²¡²£²­²¼²Ì²Ú²Þ³Á³Ñ³ò³û´µ´Ò´Ùµ®µêµì¶¡¶«¶È¶Ê ¶Ò¶ú¶þ·¡·¢·®·°·Å·Ñ·ó·ù¸¦¸¬¸¯¸ë¸õ¹¿¹Ã¹Ì¹Øº¥º¾ºÁºÂºÃºÆºÊºÑºÔºØºÞºßºçºêºëºì ºîºðºñºòºôºõºöºøºý»µ»¶»¹»É»Ì»Õ»â»ù¼¤¼¥¼´¼¶¼¾¼Ä¼ë¼ì¼î¼ï¼ð¼ý½£½¤½§½«½·½Å½Í ½Ð¾×¾á¾è¾ê¿­¿½¿À¿Â¿Ý¿â¿ã¿ç¿î¿ûÀ¤À¥À°ÀÆÀËÀÎÀÒÀÛÀñÁªÁ»Á¼ÁÀÁÂÁÄÁÅÁÆÁÈÁËÁÓÁÕ ÁÜÁÞÁâÁåÁæÁìÁøÂ«Â®ÂµÂ¸ÂÃÂÓÂ×ÂÙÂüçùÃÇÃÊÃÍÃæÃçÃèÃéÃêĤĪļľÄÄÄÈÄÉÄÊÄÛÄÝ ÄæÄïÄðÄôÄþŤūųŵŸÅÂÅÃÅÆÅÑÅàÅâÅäÅìÅïÅòơƢƣƥƯưƽÆËÆÌÆÏÆãÆûǩǰDZǵ ǹǻǿÇÀÇÒÇÕÇêÇøÇúȼȽȾÈÊÈÔÈñÈýɭɳɾÉÔÉÖÉáÉèÉïÉñÉóʥʦʨʵʻʽÊÀÊÂÊÃÊÍ ÊÐÊÓÊÔÊ×ÊØÊðÊôÊöÊ÷Êû˥˩˪˭˯˽ËÀËÙËåËæËõËöË÷ËüËþ̵̨̣̤̥ÌÈÌ×ÌßÌéÌúÌý ͩͪͮͳ͹ÍãÍèÍéÍêÍóÍöηξÎÑÎØÎîÎ÷ÎûÎüÎýϣϬϹÏÀÏÄУФХЧЮÐÇÐÔÐßÐãÐïÐñ ѯÑÀÑÇÑÊÑÕÑìÑïÑôÒ®ÒºÒÁÒÂÒÄÒßÒîÒñÒôÒüÓÃÓÉÓÖÓßÓâÔ¯ÔºÔÅÔÒÔÝÔáÕ«Õ²Õ»Õ½Õ¿ÕÄÕÉ ÕÏÕÐÕÞÖ¢Ö­Ö°Ö¼ÖÁÖÆÖÇÖËקׯ׼׽×Ê×Ò×Ù×ã×ç×ñ×þتØÄØÖØÛØßØðØñ٥٨ٸٻÙÂÙÄÙÊ ÙÓÙÙÙãÙëÙìÚªÚÀÚÁÚÅÚÉÚËÚÒÛ¡Û¨Û¬Û²Û³ÛÐÛÓÛùܧܮܰܲÜÍÜìݻݾެ޸޽ÞÇÞÍÞãÞïß± ߲߾߯ßÏßÐßÑßÚßâßíßîßþà¥à½à¾àÀàÁàåàìà÷á¸á¹áÎáÝáñâÆâÉâÌâÖâØâàã®ã¯ã¸ã¹ãºã½ ãÂãÊãÕã×ãàãðãüä¢ä«ä¬äÀäÊäÍäÏäÔäÝäàäüå«å³åÅåÇåËåÑå×åßåäåëæ©æÉæÑæÒæÓæÔæÕæÛ æðæòæôæõæöæýç¢ç¦çØçÝçïçòçýè¥èÁèÆèÓèÛèåèûé«é­é®é´é¹éÁéÉéÎéÓéØéßéáéþê³êÅêÈ êÛêìêíêïê÷êúë²ëÏëÑëÝëæëéëöì¤ìªìÐìÑìÙìßìâìéìóìûí¡í«í¼í½íÑíÒíÙíåíéíìíîíþî¢ î©îÂîÌîÔîÕîÖîØîÚîæîèîóîûï¨ï¯ï»ïÐïÞïâïìð¤ðÇðÜðäðùñ¶ñ¼ñ¿ñÂñÒñÕñØñÙñÚñçñèñð ñóñùñüñþòªò´ò¸òÑòÙòÝòÞòàòçó§ó©óªóÙóìô¢ $ Ц 1 °Ê±º±Ê±Ë±Ó±ý²¤²¥²ª³÷³ø³ù´¨´Ýµ¡µ¤µ©µ¶µÚµßµáµå¶¤¶§¶²¶´¶¹¶»¶Ì¶Ù¶è¶í¶î¸¤¹ñºµ ºè»¦»·»Ä»÷¼¶¼¹¼Û¼Ü¼Ý¼Þ¼à¼á¼ç½¢½£½§½³½·½»½Î½Ï½Ñ½Ò¾æ¿Ï¿Ô¿ÙÀªÀÍÀõÁ¨Á©Á¬ÁÊÁÐ ÂÀÂÁÂÌðÃÛÃÞÃëÃìÃíÃðÃóÄÏÄàÅªÅÆÅÑÅßǦǧǬǮǷÇîÇöÇûÈÁÈÆÈçÈëɢɹɿÉÔÉßÊÞÊß ÊàÊáÊãÊäÊåÊíÊõ˳ËÞ̩̪ÌàÌâÌèÌóÌõͲÍñÍùÎÂÏÄÏÉÏÊУЦЧÐÀÐÁÐøÐüѽÑÍÑùÑúÑûÒ² ÒµÒÍÒéÓ®ÓôÔ¯Ô¾Õ¢ÕÙÕÛÕãÕøÖÚ×ä×êØ»ØÉØû٭ٮٶٸپÙÕÙóÙõÚäÛ²ÛÑÛðÜÔÜéÜêÜëÝÜÝû ÞðߡߨßÊßÕà»àîáÏáÖáÝã°ã±ãÁãóä¡äÌ广¦æ©æÀæïæõæ÷æýç®çÔçéçôè»èàèäéºéÞêªê¯êÉ êäêøëíëøìÒìÓìíìïíóíùîßîàðÖðßñ°ñÀñÒñÛò±òÄó¹óÇóäóåô£ô¤ $ ¥Î 1 °ª°Ð°Ò°Ù°æ°ê°ë°ï°ü±£±¦±­±¯±Ç±Ì±Í±Î±Ñ±ç±û²¤²¥²ª²·²Ó³ç³è³ø³ù´«´¶´¸´Ç´õ´öµ¡ µ¤µ©µÏµ×µÛµâµèµéµö¶£¶¤¶§¶¬¶¶¶º¶»¶¾¶Ù¶è¶í¶î·®·¯·°·¸·º·¿·Á·È·Ï·Õ·ü¸¦¸Ã¸Æ¸á ¸æ¸ð¹¡¹¤¹¨¹¹¹¼¹À¹Å¹É¹Ï¹ð¹ó¹ôº´º·º¸º¹º»º¼º½º¾ºÀºÍºÐºÑºÔºÕºØºÝºÞºßºàºâºèºî ºðºñºòºõ»¡»¤»¦»§»·»º»Ä»È»Ë»Ü¼·¼¹¼º¼½¼Ó¼ã¼æ¼ë¼ì¼î¼÷½«½³½Å½Í½Õ½ý¾£¾¯¾µ¾¶¾º ¾Ä¾Ê¾Î¾æ¾ç¾è¾ê¾ë¾ó¾ø¾þ¿º¿Á¿Ñ¿Ö¿Ý¿â¿ç¿î¿ï¿ñ¿ýÀ©À®À¹À¿ÀÆÀÌÀèÀéÀóÀõÀöÁ¨Á©Á¬ Á­ÁÒÁÕÁÞÁóÁù¡¢¤°¸¹½ÂÃÂÄÂÆÂÊÂÙÂðÂñÂ÷ÂúðòÃÂÃÈÃáÃåÃòĽĨĿÄïÄðÄôų Å´ÅºÅÆÅîÅóÅøÆ©Æ¿ÆÖÆÝÆãÆöǤǥǪǯǵÇÕÇÖÈÝÈçÈëɫɬɲÉÃÉÎÉÐÉÑÉÔÉÛÉÝÉïÉñÉóÉö É÷ʦʨʻʽÊÄÊÎÊØÊÜÊâÊêÊðÊôÊûˮ˳ËÀËÛËíËîËòËü̵̩̪̫̯ÌÇÌÐÌÞÌßÌèÌïÌðͤͧ ͨͭͲʹ͹ͺÍÅÍàÍñÍôÍõÍ÷ÍùιÎ×ÎôÏÄÏÅÏÊÏÍУХЧШЩЪЫилпÐÂÐÅÐÇÐÍÐÎÐÒ ÐßÑÓÑßÑäÑìÑþÒÁÒéÒùÓ£Ó©Ó«Ó¿ÓÍÓßÓâÓüÔ¯Ô±ÔºÔÀÔðÔüÕ«Õ¬Õ°ÕµÕÈÕÍÕõÕöÕúÖ¢Ö¨Ö¸Öå Öõ×Êר×Û×ß×ã×ä×ç×ìØ»ØÓØÖØ×ØûØüÙ¶Ù¸ÙÁÙÄÙÆÙÏÙÙÙçÙõÙþÚ¯ÚÁÚÑÚæÚëÚîÚðÚøÛ´Û½ÛÂ ÛÆÛÐÛáÛçܳÜÌÜéÜêÜóݧݸݽÝÈÝÏÝÒÝÛÞ¢Þ¬Þ³Þ·Þ¸Þ½ÞÂÞÓÞÝßÀßÏßÖßÚßçßëßìßíßîà©à´ à¼àÁàîá¤á¸á¹áÇáÌáÎáÝáçâ«â»â¼â¿âÉã¯ã°ã±ã»ã½ãÁãÒã×ãÛãÜãèãôä¢ä¤ä§ä«ä­ä¾äÔäë å°å²å³åÄåÈåÍåÏåïåþæ¦æ©æ·æºæòæõç¡ç¦ç¶ç»çÇçÉçËçÎçèçûè¥è¨è¯èµè¼é«é¶éÀéÉéÍéá éãéééîéüê£êÙêåêéë¤ë¼ëÏëÕëíë÷ì­ì¹ìÊìÕìÛìëìíìñìûí¦í¾íÅíÔíÝíÞíþî®îÏîÕîäîóîö îøïªïÓïôïúïþð¢ð£ð¤ð­ðÐðÑðéðþñ¬ñËñÒñØñáñòñüò¦ò¸òÁòÂòÆòÈòÒòÚóÄóú $ ²µ 1 ±È±Ì±â±æ²µ²¶´¥µµµÉ¸ð¹¦»¥¼·½³ÂðÂñÂ÷ÅÅÆÖÆìÆýÇ·ÇÃÇèÈÅÈÈÈÏ˳ËíËøÌéÍðεÎéÏÍЬ иÐÎÒãÓ£Ö¦Ö¨Ù©ÛôÞ¢Þ»ßéàÚäýå§æ¬è¿éÍéüë¿ìÊíÂíÌïæ $ Э 1 °¤°Ø±§±ª²¿²Ä²Î²Ï²Ñ²×²Ù²ä²å²æ²ë²î³Ç³Ô´ñ´óµ³µ·µ¾µÁµÂµÄ¸¦¸º¸Á¸Ã¸Æ¹¡¹¤¹ÌºÍºà ºâºôºöºý»¹»Ç»É»Ê»Ì»ì»ô»ö½ø¾µ¾ç¾ô¾ø¿ÚÀÅÁèÂÇðÃ÷ÃùÃúģĮĺÄâÄäÄõÄûÅ£ÅÉÅÓÅô ÆÔÇ«ÇÁÊÄË£ËòÌîÌïͽ;ÍÂλÎÑЭЮЯавÐÊÐáÑðÒÚÒÞÒêÓ§Ó¨ÔôÕ®Õ´ÕçÖ¶Ö¿ÖÄÖÔ×»Ù³ ÙÖÛ§ÛÁÛÉÝ¦ÝºÞÆÞÑÞÛß¿ßßà§à¼àÈàØá¶áÃáËáÞâ³âÀã¦ã¬ãìä·ä¸äþåªåºæ¡æ´æäç×çßè°è¸ é±éëëÅëÚëèì¹íÆíñîÄï£ð±ð´ðÐñ±òªó¡ó¢ $ Æó 2 °©°ª°æ°þ±¡±¢±ª±¾±À²£²ñ²÷³¨³Ü´¬´°´Æ´Ç´Ï´Ð´Õ´Ø´á´è¶¡¶¢¶®¶´¶¹¶Ñ·Ý·è·í·ô·÷¸µ ¸Ó¸Ø¸Ù¸Þ¸ë¹¿º²º³ºÔºé»©»ª»¬»°»¾»¿¼³¼º¼ë¼ì¼î¼÷½Õ¾¡¾µ¾ð¿º¿Á¿ÎÀ©À²À¶ÀºÀÁÀÄÀË ÀÎÀÔÀñÁªÁ¼ÁÕÂ×ÂØÂÙçÃôÄ×ÄØÄþŴŸžÅÁÅÂÅÃÆÞÆáÆóÆõȮȯȰȼȽȾÈÊɰɾÉ×ÉÞÉá ÉçÉèÉñʵʻʽÊÂÊðÊôÊûˮ˽ËÀËËËåËæËóË÷Ëþ̣̤̥̫ÌßÌ÷;ÍãÍèÍéÍôÍõÍ÷ÎâÎìÎîÏÊ ÏËÏÌЧбвгдÐÅÐêѬѰÑÃÑÉÑËÑÎÑÔÑêÑìÒ¥Ò·ÒËÒÞÒßÒøÒüÓôÔ¡ÔºÔÁÔÝÔàÔçÔïÔòÕ¤Õ« Õ±Õ½ÕäÕçÖ¢Ö°ÖåÖõ×ÂØ¨Ø«Ø³Ø¶ØºÙ±ÙÂÙÊÙÙÙäÙëÙûÚªÚ·ÚºÚéÚ÷Û¡ÛÝÛëÛóÛûÜÝÜ÷ݣݴެ Þ±Þ¼ÞÓÞî߯ßâàÊá¹áºáÇáóáûâ£âªâ³âÆâÇâÍâÒâúã¡ã×ä¢äÀäÇä×äÛäÜäþå¢å«å¬å³å¼åÖåØ åâåäåñåóåûåüåþæ¡æ¤æÑæîæöæøç¦ç·çËçÎçåçëè¥è¸èÁèÇèÕèÖè×èíé¨é´éºéÌéÓéßéáéëéð éñêÁêÖêÛë¢ëÏëàëãëüì¶ìÈìçìëíÅíÓíÔíÙíþî¿îÌîÚîóîûï±ï¼ïÈïÔïâïöð£ðÇðÌðÏðÐñ±ñ¼ ñÂñØñçñèòªòÖòðó­óÏóÐóû $ е 2 °¥°º°Í°á°ç°é±Æ±Õ±ß³¯³±³²³º³¼³Á³Ç³Ë³Ó³Ô³ä³í´é´þµ£µÊµüµýµþ¶¢¶®¶´¶¹¶Ù·À·Ê·ß ·é·û¸£¸¹¸¼¸¾¸¿¸Á¸é¸ò¸ó¸ö¸ú¹£¹¬¹²¹³¹º¹»¹Æ¹Ê¹Ñ¹Ò¹Ù¹â¹è¹ê¹ë¹í¹ïºÄºÛ»§»ª»¬»­ »º»¾»¿»Ð»Ô¼µ¼¹¼Ç¼Ê½¢½³½¼½Æ½Î½Ï½ß½æ¾¦¾í¾î¾ð¾÷¾ù¾ú¿é¿ê¿óÀ¦À²À¶ÀºÀÁÀÄÀÅÀÑÀÒ ÀÓÀÕÀ×ÀØÁÁÁÇÁÖÂ´ÂØÂøÃÅÃÉÃÜÃßÃäÃòÄÒÄâÄäÄëÄùÄüÄýŦŨũŬŭŰűŲÅîÅóÅøÅýÆÇ ÆÔÆ×ÆØÆçÆñǷǹÇÙȴȹÈÚɧÊÑÊóˣ˫˳˴˵˺˻ËåËæËòËõËöË÷̣̤̥̬̺̽ÌÑÌÕÌë Ì÷ÍÊÍèÍéÍþ΢ΥΨΫήΰβμÎÃÎÊÎøÏ»ÏÉÏÎÏÑежзийÐÄÐæÐêÐôÐûѨѱÑÚÑÛÑýÒ§ ÒªÒÆÒâÒìÒûÓÁÓÆÓÉÓÊÓÔÓåÓòÓ÷ÓþÔ¶ÔÃÔÕÔÙÔáÔôÔõÕÐÕØÕÙÖ¿Öíשױ׿×ÂØ¬ØÕØÝØäØçØî Ù·ÙÕÙüÚ¢Ú£Ú¤Ú¥Ú«Ú·Ú¹ÚÃÚÊÚÕÚØÚùÚýÛ¢Û¨ÛËÛàÛöÛùܧܸܼÜÂÜÉÜÕÜÖÜÚÜãÝÚÝÜÝÝÝáÝï Þ¢ÞÃÞÛÞñÞòÞøß¢ß³ß·ß»ß÷ßùßýà·àÄàÊàÌá¯á±á¼áÒáááûâ©âÁâÍâÐâÒâÔâìâüã¡ã¢ã´ãºã ãÈãÉãÌãÕäÂäÃäÇäáäïåçåèåóåöåûæ¨æ¿æëæþç¯ç¹çêçýè¥èÄèÇèÜèæèðèöéµéàéñê¦ê«ê¯êÊ êÑêÝêäêçêñê÷êøëÙëîëóì£ìªì¯ìÊìÓìÚí³íñíóíýîÍîÑîÖîÙîëîýï®ï¾ïÁïßïòð¶ð¸ð¾ðÉðÐ ðÜðíðîðòðüñ­ñÏñÐñãñèñëñôò©òµòúó¨ó¬ó¹ó¾óÐó×óÝóöô¥ $ ¿Í 2 °ª°Ê°ç²é²÷³¯³±³º³¼³Ë´Ø¶¢¶®¶´¶¹·Ì·Ü·ç·è·í·ð·ô·õ·÷¸¡¸±¸³¸´¹®ºÁºé»±»¾»¿»÷¼º ¼ü¾¡¿º¿Í¿éÀøÁ®ÁÖÂ´ÂØÃáÄ¿ÄÐÆâÆùǼÉÂÉ×ÉÞÉçʺÊÁÊðÊôÊûËÀËËËÐкмÐÅÐÔÐÙÐæÐïÑ¡ ѩѭÑÓÑåÑøÑùÑúÑûÒ¥Ò½ÒËÒåÒëÓãÓòÔ¡Ô§Ô¶ÔÃÔÖÔëÔïÔóÕ©ÕÑÖ·ÖÕÖàÖå×Ï×Ò×騬ØÈØÛØò Ù±ÙÑÙäÙüÚ¹ÚÌÚàÚõÜýÜþÝÂÝÊÝÓÝöÝúÞ¦ÞµÞ¼ÞÃÞàÞîßÒßÛà¯àÅàÌàùáºáØááâÇâÛâìã¿ãÑä© ä®äºäÕäÛäÜäÞäïå¼åÔåØåóåùåþæ¾æíç«ç¹çÀçÌçàçåçïè²èÄèÐèèé¬éÒéðêÕêÖë®ëÄëØëçëü ì«ì¶ìÏìçìëí¤í®íÅíÓíÔîÍîîî÷ï±ïÔïûïýð¡ðªð¸ðÍðØðÙðÝñÏñäòÖòÛòðó¥óµóÏóÐóïóô $ ²½ 2 °Ë°Ì°Í°Î±Á±Õ²¯²¶²½²¾²¿²À²Á²Â²Ö²Ù²ß²ä³ñ´¦´æ´ç´ìµ¶µ·µØµÙ¶¡¶¢¶£¶Ä¶Ï¶æ¶ö·¤·¸ ·¹·æ·ï·ð·ñ·ò¸Ä¸à¸ó¸ô¸õ¸ö¹¢º´ºÄºÅºî»Å»Æ»Ç»È»÷»ø¼Ä¼Å¼Ú¼ô½¤½º½»½É½Ì½Ó½ý½þ¿­ ¿®¿¯¿ÎÀçÁÎÁü¥¦¯¾ÂÎÂÒÂÞÂßÂãÂåÂëâÃÍÃçÄÂÄÑÄãÄäÄåÅÁÅÝÆ¯Ç¤ÇÐÇÜÇìȲȵȶȼ È÷ɶÉÕÉÜÉäÉåÉíÉîÉúʩʫʻÊÈÊÐÊØÊÜÊÝÊïÊð˫˵ËÍËóËùÌÙÌëͤͥͪÍÃηνÎÑÎãÏÁл нопÐÀÐÁÐÂÐÃÐÄÐÅÐÆÐÇÐÈÐÉÐÊÐËÐÌÐÍÐÎÐÏÐÐÐÑÐÒÐÓÐÖÐ×ÐØÐÚÐÛÐÜÐÝÐÞÐßÐàÐáÐâÐã ÐäÐåÐæÐçÐèÐéÐêÐëÐìÐíÐîÐïÐðÐñÐóÐôÐõÐöÐ÷ÐøÐùÐúÐûÐüÐýÐþѢѣѤѥѦѧѨѩѪѫ ѬѭѮѯѰѱѲѳѴѵѶѷѸÑßÒõÓùÔ²Ô´ÔÂÔÈÕ¤Õ¥Õ¬×ì×îØàØæÙÃÙÕÛÕÛêÜ­ÞþßÁßÞàÇ àÍàÞâíä«ä¬ä¼äñå¶åÔæûæþç¥ç¿çøèªè®èÞèëèòêÔêàêðëÂì¼íÀíÁíÓï¦ïµòÀòî $ Ф 2 °¨°¶°Á°þ±¢±Ô±÷²ð²ñ³¦³¨³©³æ´´´Í´Ü´Þ´ëµë¶×¶Ù¶Þ¶ã·ð·õ¸¡¸±¸³¸´¸é¹Þ¹çº£º×»±»ô ¼¿¼Ë¼Î¼Ð½¦½ö½ù½ü¿¾¿ÇÀÔÀòÁ§ÁÏÁÒÁäÁóÁù¯ëÃãÄÁÅÉÅÓÅãÅëÅúǰDZȣȺɨɰɵÊÞÌ­ Ì¿ÌûÌüÌþÍ¡Í¢ÍµÍ¾ÍÆÍÏÍÐÍÖÍÝÍßÍáÎÀÎÅÎÆÎËÎÎÎÑÎØÎáÎäÎæÎçÎèÎêÎëÎíÎðÏÀФаÐÃÐÕ ÐòÐùѡѭÑÁÑõÑøÑùÑúÑûÒ­Ò½ÒÔÒýÓ°Ó¹ÓÈÓúÔÛÕìÖªÖ´Ö»ÖÆÖÇÖÕסØÎ٤ٽÙÞÙéÙïÙ÷Ú¢ÚÆ ÚÇÚÌÛØÜ¬Ü²ÜÀÜ×ÜÜÜýÝ»ÝÀÝÂÝÉÞªÞËÞÍÞáÞëߵߺ߽ßËßÒàÖàñá¸á»áÂáÎáÙáèáëáìâ¶âÏâÛ ââãÎä¥ä´äÕäàäæåÅåÙåéæ¹æÅæÙç±çºçÀçÒçÔçÚè©è±è¸èúé§é¼éÙéëê¡êÐê×ë°ì®ì¯ì°ìÅìã ìüí£íÇíúî§î¼îÒîôî÷ï¦ï«ï°ïµï¹ïÐïäðªðåð÷ñ±ñ¸ñäòÍòÎòÐòæòùòûó¾óØóôóüóþ $ ѹ 2 °½°ï°ô°ý±¡±¹±Ô±Ù±Ü²ô³¡³¦³©³Ö³õ³ö´§´ª´­´®´°´¹´Ð´á´å´èµ±µ´µÌµæµç¶¤¶¥¶­¶·¶À ¶Æ¶Ç¶õ·¢·¦·»¸«¸µ¸×¸÷¹µ¹¸¹Ð¹îº²º¶ºæºñºõ»À»Í»ù¼ö½¯½¹½¼½Æ½Ë½Ó½Ô½×½Ù¾¦¾Æ¿¼¿Ó ÀªÀÇÀàÀâÀèÀöÀüÁ­Áë³æõùÃâÃûĩĝķďŻůÅÑÅÞÅíÅýƨÆÂÆÅÆÉÆÍÇ®ÇÑÇäȮȯȰ ÈÔÈÕɤɩɷÊÙÊÚËÆËÓËÚËâÌ¥ÌÈÍ»ÍÒÍÔΦμοÎÇÎÍÐÃÐÏÐÛÐäÐåÐúѧѹѺѻѼѽѾѿÑÈ ÑËÑÍÑÎÑ×ÑîÒäÓ³ÓÊÓôÓûÔöÕ­ÕãÕäÕñÕöÖÅÖÌÖÒÖÚÖÛÖè×¥×Ú×òآؤØÃØë٢ٿÙúÙûÚ¸ÚÐÚè ÚêÚüÛ²ÛèܤܻÜÇÜöÜùÝ×ÝùÞ«Þ±ÞÌÞÒÞæÞüߤ߫ߏߨßåßöà±à¹àÉàÛàèàóáäáóâ¦âªâ¯âËâÝ âôã£ãµãÍãÖã×ãØãÙãÚãÛãÜãÞãßãàãáãâãããäãåãæä¦ä³äÓäóäøå­åååôåøæ§æµæËæùç­ç´ç¼ çëè¹èÑè×èøèýé³é¸éºéËéèê´ê¹êãêõë¶ëÐëìëùëþì¦ì©ì­ì¿ìÕìØìÞìñí·íÎíõíüîªî­î´ï¬ ï¿ïÇïÓïÔïöð©ð¿ðïðòñ¹ñÁñÃñÊñâò«ò¯ò°ò±ò²ò³ò´òµò¶òÉòÏó»óÌóâô¡ $ Æþ 2 µ×¹þºÁºÂºÃÆþÑÀÑÁÒÝÔ©ØðÛµÛÍÞàáÌâÖãÝäûêìíªíÑð¡ò´òì $ Ȭ 2 °Û°î±­±®±½±Ã±Ô±×±Ù±Ü±è±é±ð±ô²£²§²«²¬²É²ð³­³®³»³ø³ù´¨´¬´Ø´é´î´ð´ò´ú´ü´ýµ· µ½µ¾µÁµÂµÄµÕµó¶¡¶¢¶¦¶®¶³¶´¶¹¶½¶È¶æ¶ñ¶ó·²·ê·ó·ô·÷·ù·ý·þ¸¥¸¬¸Á¸Ã¸Æ¸Ý¸â¸ä¸ë ¸í¸ø¹«¹¿¹Á¹Ë¹Ì¹Ý¹ä¹ùº·º¹º¼ºÉºæºéºóºö»§»º»À»É»Û»ü¼¢¼¤¼¥¼§¼µ¼ë¼ì¼î¼ó¼ù½¶½¾ ½Ä½å¾¡¾¦¾¾¾Í¾Ù¾Ü¾è¾í¾î¾÷¾ù¾ú¿µ¿·¿¿¿Å¿Æ¿ß¿à¿ëÀ¡ÀÇÀÒÀâÀñÀùÀýÁ¡Á¢Á¥ÁªÁ¯Á°Á± Á´Á¶Á·Á¹ÁºÁ½Á¾ÁÌÁÎÁÑÁØÁíÁïÁ÷ÁýÁþ£«®¯¶·ºÂ×ÂâÂþãæçëîûÃÙÃäÃåÄ¿ ÄÃÄÆÄÚÄæÄëÄïÄðÄôÄùÄüÄýŢŦŨũŬŭŵŶſÅÂÅÃÅÉÅÐÅÓÅõÅ÷ƦƪƬƭƮƳƻÆÒÆê ÆîÆïǹÇéÇøÇúȣȬȸȼȽȾÈÀÈÊÈÒÈþɧɾɯÉÍÉÏÉÓÉáÉèʬʱʴʵʶʷʻʼʽʾʿÊÀ ÊÂÊÃÊÍ˭˵˽ËÄËËËÍËÐËßËåËæËêËðËòËõËöË÷̧̣̤̥̽ÌÖÌ×Ìßͱ͵;ÍÀÍÁÍÆÍÍÍÎÍÏ ÍÐÍÒÍÓÍÖÍÜÍÝÍßÍáÍãÍêÎÀÎÅÎÆÎËÎ÷ÎøÎûÎüÎýϣϻÏÏЫЯÐÍÐÓÐÔÐßÐôѥѼÑÂÑÃÑìÑïÑò ÑóÒ¥ÒÊÒËÒÐÒÑÒÜÒæÒüÓ¡ÓÁÓÆÓÇÓÉÓÍÓÑÓÖÓÙÓÝÓïÓõÔ¡ÔºÔÒÔÓÔÛÔÝÔåÔôÔõÔûÕªÕÄÕÏÕÚÕç ÕôÖ¢Ö«Ö°Ö»Ö¾Ö¿ÖÍÖÓÖÔÖÙÖÜÖíÖõÖùעףפ״׽׿×Å×Ò×Ý×è×ù×ü×þثرØÄØÆØÇØÑØÚØÛ ØñØôÙ¦ÙÂÙÊÙãÙëÙìÙíÙùÙüÚ©ÚªÚ±Ú²Ú³ÚµÚ·ÚÅÚÉÚÍÚÕÚùÚþÛ¢Û¥Û§Û¨Û®Û³ÛÀÛÃÛËÛÌÛîÛ÷ ÛùÛûÛüܧܮܼܰÜÂÜÈÜÌÜÍÜÎÜÕÜÖÜ×ÜâÜëÜïÜôÜ÷ݰݾÝÁÝÃÝÐÝäÝðÞ¤Þ¬Þ´Þ¸Þ¼Þ¿ÞÄÞãÞê ÞîÞñÞòÞøß¡ß°ß²ß³ß½ß¾ßÁ߯ßÇßÐßôßùßüßýà¥à¦àºàÕàùá¥á§áÚáõáøáýâ¡â­âµâ½âÃâÆâÇ âÉâÏâÓâÔâÜâèâöâøâüã¤ã¦ã²ã¶ã¹ãºã½ãÂãÅãÎãäãéãðäÐäÙäÛäÜäÝäíå«å³å¼åÐåÓåØåçæ¡ æ¨æµæ¶æ·æ¸æ¹æºæ»æ¼æ½æ¾æ¿æÀæÁæÆæÈæÑæÒæÔæÕæàæöç¢ç¦ç¯ç½çÐçÕçßçæçîçùçýè¥è´è¸ èºèÅèÌèÜèãèåèðèûé¤é´é¹éÁéÅéÏéßéáéåéèéðê¦êÑêÛêçê÷ë§ë±ë»ëÏëÝëéëêëëëîëóëúì¥ ì®ì¯ì°ì±ì²ì³ì´ì¶ìÏìÐìÑìóí¡í¢í§í¬í­í®í¶í½í¿íîíñíúíþî¤î¨îµî¼îÔî×îÚîÜîÝîóï­ ï¯ï°ï±ïÁïÅïÊïØïâïìïíð§ð«ðÜðçðèðóñ§ñ±ñ¾ñÂñÄñÅñÖñØñÚñçñèñóò¢òªò¬ò³ò¹òÕòÙòå òèòòó©óªó°ó²ó¶ó·ó¾óÉóÊóÔóãóäóåóéóê $ ÑÄ 2 ±²±ß±ü²¨²¬²Ò²á³¼³Á³Ö³ê´­´¹µÌ¶£¶¬¶¶¶º¶½¶¾¶Í¶Ò¶Ù¶ò¶ö¶÷¶ø¶ù¸¥¸é¸þ¹½¹Â¹Æ¹Ë¹Ö ¹Ø¹Ý¹â¹ä¹üºÆºôºöºý»¹»É»Ì¼¤¼¥¼Ê¼þ½µ¾¦¾°¾³¿óÀóÂäÂüÃäÃüĦĴŦŨũŬŭÅûƱƶ ƹƼÆÌÆâÆéÆîÆïÆùǩǼȹÉÂÉöÉ÷ʺʾÊÀÊÁÊÃÊÍÊÏÊÐÊÓÊÔÊ×ËúËþÌÖͻξÎïÏÎЬÐÕÐïѶ ÑÀÑÄÑÅÑÆÑÇÑÈÑÉÑÊÑËÑèÒÒÒåÓ¥ÓÃÓÇÓåÓìÔÆÔÔÔëÔöÔüÕ½ÕÈÕÞÖ¾Öò×½×é×øØ¯Ø±ØÙØåØðÙ¨ ÙìÚ¸ÚÈÚÉÚÊÚÍÚÓÚõÚþÛ³ÛùÛüܧÜÉÝÊÝöÞÅÞÒÞàß´ß¾ßÐßÓß×ߨßÛßåßúà¦à·àÑàÛàðàûâÖâ÷ ã¥ã»ã¼ã¿ãÇãÊãÌãÝãåãæäÀäÉäéäøå¥åÂæ¦æ¨æíæîç¢ç­çòèßèâèæèûéÒéóé÷êÕêãêìë²ëÄëó ëùìéíªíÑíÒíÝíæíêíîî¨î©î×ï®ïÐïûð´ðºðÄðØðÙðÝñ®ñÙñáñëñìñíñîñïñðñññòñóñôñùò¯ ò³ò´òÞó³ó»óãóäóåóèóú $ ÑÌ 2 °¦°í±¿±Ã±Ä±É±û²©³¼³É³Ì³Ð³Ø³ê´§´øµ¢µ±·³·Ä·Ö¸£¹Ñ¹è¹ê¹ë¹ò¹üº÷¼Ì¼õ¼ø¼ú½Ö½Ø½þ ¾¨¾¸¾Ø¾Þ¾é¾ï¾ñ¾ö¿¯¿²¿»¿¼¿ñÁݳÂÓÂÚõÄÍÄÛÄâÄäÄëÄùÄüÄýÅÞÆ²ÆÂÆÉǹÇäÉØÉÚ˵ËÖ ËíÌ´Ì½ÌØÍ¥Í«Î¼Ï«Ð¸Ñ³Ñ¸ÑÌÑÍÑÎÑÏÑÐÑÑÒ©ÓÁÓÆÓÊÓÙÓÛÓéÓêÔÊÔÛÔäÔåÔçÕÖÕÜÕêÖäÖèÖí ×Ã×ÚØ£ØÂØôÙ¡ÙýÚ¬ÚÕÚôÚöÚùÛ£Û¤Û¯Ü«Ü¼ÜÆÜËÜÕÜÖݨݵÝÅÝÐÝ×ÝÝÞÕÞÛÞßÞñÞòÞüß½ßÂßé à¦à¸àÑàíàòá°á³áÄáÈáÊáôâ°â±âÏâÔâÕâÙâÞâ÷âüã§ä¶æ§ç¯çÊçáèÈè×èØèÜèðèøèüéªé·ê¥ ê¦ê¬ê°ê»ê¾êÅêÆêîêýë´ëäëîíØîµïÆðÏñ¾ñÔñìñíñîñïñðñññòñóòôó®ó³ó¿óÔóÞ $ ÑÒ 2 °ñ°ó±©²§³Ú´Í´å¶Å¶Ñºã»Ñ»ð»ñ¼¡¼å½¬½Â½Ú¿éÀ¢À¨ÀÝÀðÀúÃûÃüĩįķĸŮÅàÅíÅðƨɵ ËÝÌêÌôÍâÍãΨοÎÝÎäÐÏÑÒÑÓÑÔÑÕÑÖÑ×ÑØÑÙÑÚÑÛÒ­ÒÅÒþÓ°Õ­Õ¾ÕìÖÎס×óØÒØáØôÙ¤ÙËÙî ÙòÙ÷Ú¶ÚêÛÛÜÐÜÜݬÝÀÞËßËà£áªáÊáÖãªãÚäçåÙæÂæÃæÄæÅæÆæÇæÈæÉæÊæËæÜç±çÉèãèêèúê« êùëÐìÛí¤íÄíàîÒîâï¹ïËïäðññÈò¼òÎòÝó°ó´óµóêô¥ $ ÑÜ 2 ³®³¾³Ì´ùµ£µ²µò¶²¹£¹³¹º¹Ò½È½è¾é¿ÖÂüÃÛÃÞÆäÈ©ÈÁÈÆË±ËÞÎÄϹжÐÄÐÐÑÜÑÝÑÞÑßÑàÒâ ÒðÛðßÊàãæÀé¯éÞëåìïðßðøòêòë $ Ñá 2 ±ú²è´Ì´þ¶¤¶§¶»¶Ù»õÅñÆÌÆÖÆûǺǾȡͩÍÉÍØÍÚÍþÎ¥ÎðÑáÑâÒ³Ó²ÓëÓ÷ÕïÕüÖ¾Öè×Ô×ïØð ÙÚÙÛÙêÚ¢ÚÔÛüܤݵި޾ÞàÞüߢàöâÖãßäáåÃåýåþæ¡æ¢æ£æ¤æ¥æ´çÃçæèîèôèøëïì§ì´í¨íª íÒïÇð´ðÙðÜðäò®òµó¸óºó×óïóðóñóòóóóôóõóöó÷óøóùóúóû $ Åá 2 ²É²ò²ý³ªµÊ·À·é·ô½é¾¤¾·¾¼¾Â¾È¾Ò¾Û¿Ï¿ÙÀÚÀàĶÅáÆáǦǧÈÒÉÏʬʱʴʶʷÊÕËÇËßÌâ ίαÎÂÎÜÐÀÐÁѱÑãÑçÑìÑòÑùÑúÑûÑüÒ¡Ò£ÒÛÒæÓ÷Óúձ֧֫ר״×ÝØèÙ®ÙÍÛ·ÛÃÛÊÛë܏ܨ ÝäÝðߨá§áîâæã´ãéäÌäÚäíå¹çîè­è»éµê·êÉìºíëî°îºî×îÛîßðÅð×ððñúòßóóóö $ ´¢ 2 3331 °¢³Ä³ä´¢´£´©µ¢·º·¿·Õ·à·õ¹ä¹ïºÞºïºþ»«»É¾êÀ©À½ÀùÀýÁ°ÁÏÂ¦Â§Â¬Â·ÄæÅÝÅþÇíȳȽ ÉûÊÌ˶ÌûÌüÌþÍ¡Í¢ÍøÍüΡέÎãÎóÎõÎöÐÞÐùÑØÑäÑåÑæÑèÑéÑêÑëÑíÑîÑïÑðÑñÑòÑóÑôÑõÑö Ñ÷ÑøÑýÒÎÓÈÓÉÓèÖúئؼÙÚÙéڱܱÜÀÞ°Þ¼ÞáÞãßÈàµàñáèä´æÈè½é©éíê¡ë°ìüî§ï«òÅ $ ÎÏ 2 ±ù²À²Ã²Å²Í²Ø²à²ì²ï³¯´ª´«¶¨¶¼¶Ð¶Ú·®·¶¸ù¸ú¹å»«½õ½û¾¡ÀªÃËÄ¼ÅØÆ¯Æ°ÊÌÊÙÊçËÖ̳ ̸ͦͯÍÄκÎÏÎåÎôÏ«Ï¾ÏÆÐ¾Ò¢Ò£Ò¤Ò¥Ò¦Ò§Ò¨Ò©ÒªÒ«Ò¬Ò­Ò®Ò¯Ò°Õ³ÕËÕÌ×ðØÖØéÙ¹ÙÆÙý Û¶ÛÈÛûÝóÞßàÝáÐáôãØã÷æÔçÏè¶ìèìýîÞðÕóÛ $ Ò± 2 °¼°×°ï±Ú±ë±ð³Ã³Ñ³Ü³ã³å³é³ë³ì³ó´­´¹´Ù´íµµµÅµÆµÇµÞµà¶»¶Ã¶Ñ¶ç¶é¶ð·Ç·É·Ù·ç¸Ó ¸Ø¸Ù¸û¹ª¹´¹Õ¹æ¹í¹ú¼Ì¼Û¼Ý¼Þ¼à½Ü½Þ¾Ý¾ô¿¤¿§¿ö¿÷ÀÅÀÈÁèÁüÂùÃôÄ×ÄàŪÅÑÅñƫƺÆË Æ÷É¿ÉéÉòʪʭÊñÊùÊúˢˤ˦˰ÌÈÌÞÌèÌóÍ¿ÏÌЮÐÈÐõÑÐÑæÑêÒ¢Ò±Ò²Ò³Ò´ÒµÒ¶Ò·ÒöÒøÓ¸ ÓöÔµÔëÔòÔöÕ¢Õ²ÕíÖ¤ÖÚ×Î×á×ä×ï×öسØÓØëÙÛÚøÛ«ÛÎÛÔÛÝÛÞÛøÜûݼÝÇÞ¨Þ­ßÃßÜßèà×á× áçâ®â²â»â¼â½âÝâáâòãñãôä£ä¸äååÃæ»æÛæøç¼çÅçéçíçñçúè¦èÍèÕèÖèÚèàèçèùé¼é½éËéÌ éÛéæéùê¸êÜë½ëÎëàëëëñëþìîí±î¡îÀîâîìîðïåïüð»ðËðÒðâðññÕñññýòºòÈó­óÆóÒóñóû $ Ò¸ 2 °í±³±¸±Ï±Ð±Ú±í²½²Ö²ß²ô³å³é³ë³ì³ñµ´µºµ¼µ¿µÔµõ¶Å¶ó·¤·§·¹·Ç·Î·Ø·à¸×º¡º¢º²º³ ºÖºü»Ó»Ø»Ý»à»ç»é»ó¼·¼¸¼Æ¼Ø½¯½¹¾¨ÀÚÀàÁòÂÂÂÈÂÉÂËÂÖťƾÆôÆ÷Ç½ÇØÈ§ÈíɦɷɿËÌ ËâÌ¥ÌÆÌéθκЪЫÐÉÐõÐúÑÃÑÝÑôÒ¸ÒïÓÜÓëÓùÔ±ÔÂÔÒÕàÖÌÖØÖÛת×âØÃØÆÙ¦Ú¡Ú´ÚÍÚãÛ« ÛôÜÇݵݼÝÁÝýÞóßÎà¤àÛàèàóáÓáêá÷â¥âºâÂâÃâÄâÅâæâíâòã¨ãñäñæ¡æ±æ»æççÃçÅçÆçãè¹ èáéªé½éÃéÈéÊéËéÌéùê¸êõë¹ëÂëâì§ìÇíâî¡îªî±îÓîáîíï¦ï¯ïÌïÎð©ðËðâñ¡ñ¹ñÃñÌñæñç ñöò®ò°ò±ò²ò³òµò¶ò¿òÏòéòøó¶óð $ Ò¹ 2 °å±á²¤²¥²ª´ª´®µÔµðµñµôµ÷¶©¶è¶í¶î¾¢¿õÁÙùƿÈÛɤÐðÐýÒ¹ÒºÒ»Ò¼Ò½Ò¾Ò¿ÓÒÔþÕÂÕö ÖÏØ×Ù¢ÚÐÛÍÛÚÜ»ÜÒÜäÝ¤Ý¿ÝØßÙßæá®âôãþä¡ä²äºäóåëæÊëâëðîÐï¬ðõñÜô¦¿Ã $ ½½ 2 °´°¶±º²Õ²õ²û³×³ç³è³ð³÷´¥´³´´´Í´Ú´ì´ôµ¸µ»µÏµêµïµöµø¶¨¶«¶Æ¶Ç¶Î¶ì·×·á¸¥¸´¸Ä ¸Å¸Ç¸È¸Î¸Ï¸Ð¸Ò¸Õ¸Ú¸Ý¸á¸ê¸ï¸ö¹¬¹½¹Â¹Ö¹Ø¹ß¹îºËºÔºÕº÷»©»±»Ù»Þ»è¼­¼¹½º½½½Á½Ñ ½Ò½Û½Ý½à½â¾£¾´¾º¾À¾Æ¾Ï¾ã¾ý¿¢¿£¿µ¿·¿¿¿Å¿Æ¿É¿Ë¿×¿è¿é¿ì¿ø¿þÀ¨À³ÀæÀéÀìÀïÁµÁÞ ÁáÁð±´ÂÍÂîÂøÃ±Ã½ÃÆÃÍÃÖÃäÃïīĬİľÄÃÄÔÄÙŦŨũŬŭŶſÅ鯾ÆÁÆÛÆîÆïÇ×Çî ÇöÇûȸȻȼȽȾÈÊÈÜÈêÈòÉ£ÉÀÉÖÉßÉìÉòʮʯʰÊÈÊÉÊÊÊÞÊßÊàÊáÊãÊäÊåÊæÊíÊóËÄËÖËÛ ËêΨÏÈЪЫÐÂÐÆÐÔÐâÐæÐçÐëÐìÐöѤѥѾÑÙÑäÑîÑüÑþÒ¡Ò°ÒµÒÀÒÁÒÂÒÃÒÄÒÅÒ×Ó®Ó¶ÓÅÓÇ ÓÑÓÞÓéÓêÓóÓþÔ¥Ô¾ÔÃÔñÕ¹ÕÉÕÊÕÖÕñÕóÖ¡ÖÑÖÜ׬׭׼ר×Ü×àØ£Ø¬Ø­ØÉØÕØßØäØõÙ¥ÙÂÙÓ ÙÜÙçÙóÙõÙöÚ¤Ú¥Ú¦ÛÆÜªÜµÜÔÜÞÜßÜçÜïݡݢݱݶݽÝÄÝÑÝøÞÁÞÃÞßÞèÞìÞðÞõߣ߬߰ߵ߷ ß¹ßËßéßôàÌàøàúá¢á£á¤á¯á²áàáááãáäáïâ¡â¨âÎâÐâÓâÜâàâìã¢ã¶ãÆãçãèäÉäÒäâäïå«å¿ åÒåèåðæ­æÂæÃæåæöæýç£ç®ç¹ç¾çÔèÄèÙèþé­é°éÖéúê«ê¯ê¼êÛêëêûêüêþë©ë·ëÆëóëýì¢ì£ ì¬ìÄìÌìÒìÓìåì÷í²íÛíãíäíåíæíçíùíýî¨îÂîÍîÙîþï½ïÑïñïòïóïôðÈðþñ¢ñ°ñ·ñãñéñïòÄ òãòåòõó«ó·ó¹óÁóÃóÅóåóê $ ËÎ 2 °¾±³±Ã²¼³°³ÝµºµÎµÔµõ¶ó·µ·Ó·à¸×¼ä½Ç½Ê¾åÀÌÀêÂîÄ¡ÄåÄçÄ÷ŹŽÅÀÅ鯽ÆÄÆÑǴȧɷ ÉæÉëËÎËÑÍ¿ÍñθκнÐèÐëÑÎÑÝÒÆÓ¶ÔªÔ»ÔÒÔÛÕäÖ³Öìת٦ٷÙÀÙÜÚ¡ÛòܥܪÜåÝÁÝþߣ߽ ßÉßÎà¤àÛàèáêâºâÏâóãæãëãøäìå¿æ¡æ­çÆçãèÃéÃéÈéÊéËéÌêáêèêõë­ë¾ëâí¦íâííî¦îªî± îÓïÌïÎïÚðÁðàñ¡ñ¤ñÃñæòÏòéóÄóÖóÚ $ ÒÇ 2 °¸°õ±¬±å±ñ±õ²·µÑµÓµú¶ª¶Ä¶û·Þ¸æ¹·Àá¨áÈÅÈÈÈÏÉþÊóÌ¿ÌñÌøÍÞÎÎÎáÎäÎæÎçÎèÎêÎë ÎíÎðÏÐÏÒÏÓÒÇÒÈÒÉÒÊÒËÓ²ÓÄÔ¡Õ¶ÕÛÙ¯ÙÞÚåߺßçãû乿¹æØæÙç÷çûéÙéïëÌì²ìîíÃîöîüïõ ñºò¾òùóô $ ÒÌ 2 °µ°Ò±³±¹±Þ²¾²ú³¥³³³¶³Â´ß´à´æ´ç´é´ê´íµºµÔµõ¶ó·à¸¶¸·¸»¸×¸ü¹¡¹¤ºäºå»§»º½Û½Ý ½â¿«¿°¿±¿¶¿Ì¿ßÀÈÁ¸Ã¤ÃºÄþÅ×ÆÊÆÛǻǿÇÀÇÉȧȿÈÀÈÄÈÇÈÉÈÎÈÓÈ÷ɧɷɿÊÖÌ®Ìñθκ ÎÒÎåÎñÎòÏÏмÐôÑ·ÑÝÒ¯ÒÈÒÌÒÍÒÎÒÏÒÐÒÑÒÒÓ±ÓîÔÒÔÚÔßÕâÖ½ÖÞÖâתØÅØ×ØàØë٦ٯٿڡ ÚàÛéÜùÝ®ÝÁÝÖÝò߸ßÉßÍßÎà¤àÕàÛàèá­áêáüâ§âºâÊâÝâêãòäÓäõäúåõæ¡ç¼çÆçãéÃéÈéÉéÊ éËéÌéÚê¹êõëËëÌëÍëâëþìÄìØìîí¬íÀíÃíáíâíðîªî±îÓîÚîçïÌïÎïõðÎðÔðæðúñ¡ñÃñæò¶ò¾ òÏòéòîòïóá $ ÒÓ 2 °§°®°¯°³°»°é°ô°þ±¢±»±¾±À²§²°²ñ²ô³¡³¨³¸³Ã³È´þµ´µÑµÓµî¶¯¶±¶Ù¶ò¶ö¶÷¶ø¶ù·§·Ý ¸£¸é¸ø¸û¹¨¹­¹°¹É¹Ï¹Û¹Ü¹åº²º¶ºÛ»²»´»À»Ï»ä»ê¼£¼¼½¼½Æ½Ó½Ô½×½Ù¾¾¾ÙÁÁÁëÁíÁïÂÕ ÂÖÂÛÂÝÂæÃ×ÃâŰűŲžÅÁÅÝÅåÅýÅþÆÞǽÈíɰÉÈʧʩÊÛË¡ËÇËÈËØÌ¶ÌÅÌêͺέήίΰα βÎÜÐ¬ÐØÐúÑ£ÑçÒÓÒÔÒÕÒäÒúÓèÓóÓôÔ¥Ô¹Ô¼ÔàÕóÖ²Öê×±×ÞØ¢ØªØÎØÕÙöÚ¬Ú­Ú´ÚØÚéÛ¦ÛÀ ÛßÛàÛâÛèܱÜÃÜØÜçÝ·ÝÚÝ÷Þ³Þ´ÞÄÞåÞúàëá¥á¼á½áîâ¯â´âÈâãã¢ãæãïãúäÚå¢å¦å©åÌåÖåÚ åâæ¤æ±æÏæÑæèç´çµçÊçËçÕèÅèãèõèöé·éºéÏêöëÈìÆíÉíõîÑïîðÅðÌðÏðóñ¦ñºñÍñÝñùñþò¢ ò´òÍòßò÷òüó°óù $ Ëô 2 ±·±Ã±Î±ç²¾²Ë²Ü²â²ø³¾³Í³Ï³ß³ï´ì´ôµ¸µ»¶Ë¶Û·¬·Â·Ð·Ô·Ú·Û·ø¸­¸Ý¸îºµºÇºäºå»£»¸ »Á»Ù»Þ»è¼ä¼è¼ñ¼õ¼ø¼ú¼ý½Ç½Ê½ö¿¯¿²¿»¿Õ¿Û¿üÀÉÁÐÁÑÁÜÁßÁéÁûèÃÈÄÖÅÏÅÕÅØÅÙÅÛÅÜ ÆÄÆíÇÂÇÈÇËÇÌÈ´È¿ÈÀÈÄÈÇÈÎÈÓÈàÈäÈèÈéÈïÈöɲÉþÊÖÊóËôËý̡̢ͧдÐèÐñÑÎÑâÒÖÒ×ÒØ ÒÙÒóÓµÔ³ÔÛÕ·Õ¸Õ¿Õ×ÕäÕêÖ¡ÖæÖï׸ØÌ٭ټÙÓÙØÚ¼Ü¥Ü³ÜðÝÇÝòÝóÞÓÞìßëà©àààìâ§â®â¯ â°â±â²âÜâßâîä¹äìåÜæÂæÜçÛèÃèÊèÓéÆê¿ëôì³ìßìåììíÍíÐíæî¢îàîçï¤ï¨ï³ï¸ï×ïøð¥ðÖ ðÛñ½ñÇñÎñÔñÛñåñûò£òÑóê $ ¥Þ 2 ²³µ¼µ¿¶Å½À¾µ¾ç¾øÁÁÄËÄÌÈõ̷ͦͯͰͽÍÂÍÙЮаÐÜÔÐØÊØìÙ³Ù¿Ùæââã¨äòéììúìýðäòü $ ¶å 2 °°´Ýµ°µØµæ¶åºÕ»¨¼¹½Î½Ï¿¬¿è¿ìÀªÀ÷ǮȷÏÈÐçÒÀÓôÕÙØ­ÙÆÙõãóæÃéºê¯êøìÓñÄó¹ $ ¥æ 2 ÑÓÑåÔïÙ±ä¼ $ ǵ 2 µÚ·È½¨Æ©Í¶Ð»ÕÔ۴ܳí¾îø $ ¹þ 3 6134 °©°ã°ä°ï±ª±¿±ó²à²á´ÔµÕ¶á¶ø·Þ¸¯¹þ¼×½µ½Ò½ä½å¿Ê¿×¿à¿ë¿ï¿ñÀÂÁªÁ«ÁÌÁ÷ÁøÂ¤Â®Â½ ÂÜÂàÂáãéÃÙÃàÄÈÄÉÄÊÄÌÄÔÄþŬųÅÓÆ¨Æ©Æ³Æ»ÆÛÆæÆöÇçÇ÷ÈòÈõɯÊÕÊÖÊ×Ë¥Ë©ËøÌÂÌú Í·ÍÚÎËÎúÏ¡Ï¢ÓØØÔÚ¥ÚûßüßýãääËå×åáç»êôì¤íèíéíêíëíìíííîíïíðíñíòíóíôíõíöí÷íø íùíúíûíüíýíþî¡î¢î£î¤î¥î¦î§î¨î©îªî«î¬î­î¯î°î±î²î³î´îµî¶ï±ïºïòð«ðÌðçðèñòô£ $ ¸ý 3 °¡°¢°¤°¥°¨°­°±°»°¾°¿°Á°É°Î°Ø°Þ°ã°ä°è°ë°ö°÷±¤±¥±¦±°±²±³±´±½±Ä±Æ±Ò±Ô±Ù±Ü±à ±è±í±î±ð±ò±ó±ô±ö²­²¿²À²Ã²Ä²Å²Í²Î²Ï²Ñ²Ò²Õ²×²Ø²Ù²Ü²Þ²à²á²ì²ï²ó²ö²ý³®³±³²³· ³»³Å³Æ³Ç³Ê³Î³Ô³Õ³Ö³×³Û³Ü³ä³å³æ³ç³è³í³ð³ú´¦´­´±´µ´¶´¸´½´Á´Ä´É´Ô´Ú´Û´Ü´Þ´â ´ä´î´ï´ñ´ò´óµ®µ³µÈµÉµÊµËµÌµÍµÎµÒµÛµÜµëµïµ÷µøµüµýµþ¶£¶¥¶«¶¬¶¶¶·¶º¶½¶¾¶Ã¶É ¶Ë¶Í¶Ï¶Ð¶à¶ã¶ç¶é¶ì¶ð¶ó¶ô¶ú·¥·«·¯·²·´·¶·»·¼·Æ·É·Ê·Ù·ß·ë·ð·õ·ö¸¡¸¦¸§¸¨¸¯¸± ¸³¸´¸º¸Ä¸Å¸Æ¸Ç¸È¸Î¸Ï¸Ð¸Ò¸Õ¸Ù¸Ú¸Ý¸â¸ã¸ä¸ç¸è¸ê¸ë¸ì¸í¸ï¸þ¹¡¹¢¹¤¹´¹À¹Å¹Æ¹Ñ¹Ü ¹Þ¹â¹æ¹ç¹è¹ê¹ë¹î¹ð¹ó¹ôº¶º½ºÈºÕºÖºéºêºëºìºíºð»«»Ç»È»Ê»Ë»Ì»Ï»Õ»â»ì»ð»ô»ö¼£ ¼§¼­¼¸¼Ã¼Ê¼Ë¼Î¼ã¼æ¼ö¼ù¼þ½¢½¦½³½´½µ½Ã½Ë½Î½Ï½ß½æ½ú½þ¾¤¾¥¾¦¾§¾¨¾°¾³¾·¾¸¾¼¾Â ¾È¾Ë¾Ì¾Ò¾Ø¾Û¾Ý¾Þ¾ï¾ü¿°¿Ò¿Ú¿ß¿à¿á¿ã¿ó¿ø¿û¿þÀ¡À°À»ÀÇÀÐÀ×ÀØÀÙÀâÀåÀêÁ¥Á©Á±Á¶ Á·Á¹ÁÂÁÃÁÏÁÒÁÓÁàÁäÁçÁóÁôÁùÁü¤¥ª«­®¯»ÂÃÂÕÂÛÂÝÂäÂæÂïÂóÂúÂþáæëò ÷ûÃÅÃÉÃÎÃÒÃÔÃØÃäÃæÃçÃéÃïÃüÃýġĦĴĶķļÄÈÄÉÄÊÄÓÄ×ÄÙÄÛÄßÄâÄäÄèÄöÄøÄýŦ ŨũŬŭůŹżŽÅÀÅÆÅÇÅÊÅÐÅÑÅÖÅ×ÅÞÅâÅãÅäÅæÅëÅõÅ÷ÅúÅûÅüƦƧƪƬƮƱƲƶƹ ƼƿÆËÆÑÆÕÆ×ÆØÆÝÆçÆéÆñǡǴǹÇÁÇËÇÜÇÝÇåÇæÈ£È¦È¸È¹ÈºÈØÈÝÈêÈòɯÉÊÉÖÉÙÉÚÉôÉø ÉùÉûÉýʡʭʮÊÈÊÉÊÊÊËÊÌÊÝÊÞÊîÊòˣˤ˫˭˶ËÄËÊËÕËØËáËéËóËụ̱̲̺̂̾̿ÌÃÌÄ ÌÈÌäÌêÌöÌúÍ£Í¤Í¬Í´ÍµÍ¸Í»ÍÆÍÏÍÐÍÖÍÙÍÝÍßÍáÍêÍìÍíÍîÍïÍðÍùΫάβημÎÃÎÊÎ×Ϥ ϨϩϪϬÏÂÏÃÏÇÏÉÏÌÏÎÏÒÐ®Ð°Ð´Ð¸Ð¹ÐÆÐÈÐËÐáÐâÐöÐýѡѥѭѲѷѸѼѾÑÈÑÕÑ×ÑÙÑÚ ÑÛÑâÑéÑîÑïÑðÑóÑõÑøÑùÑúÑûÑüÒ¢Ò£Ò¤Ò§Ò°Ò¶Ò½Ò¿ÒÊÒÒÒÚÒÛÒÜÒÝÒÞÒßÒàÒáÒâÒãÒäÒåÒæ ÒçÒèÒéÒêÒëÒìÒíÒîÒïÒðÒñÒòÒóÒôÒõÒöÒ÷ÒøÒùÒúÒûÒüÒýÒþÓ¡Ó¢Ó£Ó¤Ó¥Ó¦Ó§Ó¨Ó©ÓªÓ«Ó¬ Ó­Ó®Ó¯Ó°Ó±Ó²Ó³Ó´ÓµÓ¶Ó·Ó¸Ó¹ÓºÓ»Ó¼Ó½Ó¾Ó¿ÓÀÓÁÓÂÓÃÓÄÓÅÓÆÓÇÓÈÓÉÓÊÓËÓÌÓÍÓÎÓÏÓÐ ÓÑÓÒÓÓÓÔÓÕÓÖÓ×ÓØÓÙÓÚÓÛÓÜÓÝÓÞÓßÓàÓáÓâÓãÓäÓåÓæÓçÓèÓéÓêÓëÓìÓíÓîÓïÓðÓñÓòÓóÓô ÓõÓöÓ÷ÓýÔ¢Ô£Ô¤Ô¦Ô§Ô¨ÔÆÔÈÔÖÔÛÔáÔåÔèÔôÔþÕ¯Õ´ÕÂÕÃÕÄÕÈÕÉÕÊÕÏÕÐÕÙÕèÕîÕñÖ±Ö³Ö´ Ö»Ö¿ÖÉÖÏÖÓÖÕÖÚÖÞÖëÖîÖòפש׫׻׼×Å×Ë×Þ×à×á×í×÷×ø×ú×þإادسؾØÈØÔØ×ØÚØÜ ØÝØßØêØîØñØôØõ٥٦٫ٽÙÀÙÈÙÉÙÐÙÖÙÞÙïÙþÚ£Ú¦Ú¨Ú¬Ú­Ú®Ú¸ÚÅÚÈÚÊÚËÚÌÚÑÚíÚîÚýÛÈ ÛÉÛÊÛÌÛÎÛçÛíÛñÛõÛöܩܫܷܵÜÈÜÉÜËÜ×ÜÚÜÞÜäÜìÜïÜôÜûÜýÜþݡݢݭݱݲݶݺݿÝÀÝ ÝÄÝÅÝÍÝÎÝÐÝÑÝØÝÝÝáÝâÝøÝþÞ£ÞªÞ®Þ²Þ¹ÞÁÞÅÞÑÞÛÞãÞëÞïÞõÞöÞøÞûߩ߰߶ßÊßÒß×ߨßà ßäßèßôß÷à¦à¯à³à·à¾àÂàÆàÈàÙàÚàÛàÜàÝàäàéà÷àúá®á²á³áÀáÃáÄáÆáÐáÝáÞáàáìáñáúáþ â«â­â¶âÒâÕâØâÛâÜâåâæâçâèâéâêâëâìâíâîâïâðâñâòâóâôâõâöâ÷âøâùâúâûâüâýâþã¡ã¢ ã£ã¤ã¥ã¦ã§ã¨ã©ãªã¬ã¶ã¸ã¹ãÇãÈãÉãÌãÎãÑãÕãÛãÜãÝãàãëãðã÷ãøãúä¨ä´ä¾äÁäÂäÃäÉäÍ äÏäÕäÖäÝäàäæäéäøå¥å©å±å¸åºåÂåÇåÈåÉåÎå×åßåòæ¥æªæ«æ°æ´æºæ¿æÀæÅæÓæÚæÝç­ç²ç¾ çÀçÃçÊçÒçÓçÔç×çÚçàçæçñè¢è£è§è©è¬è±è´èºèÁèÕèÖèÙèÞèâèæèçèùé¡é¬é­é®é°é·éÁéË éÖéÜéÝéåéèéóéõé÷éúê¬ê­ê°ê³êºê»êÅêÆêËêÌêÏêÑêãêåêðêñêúêûêýêþë£ë­ë±ë·ëÅëÆëÈ ëÍëÕëÝëàëáëèëðëóëùëúì¡ì¢ì¤ì§ì©ìªì¬ì®ì¯ì°ì±ì²ì³ì´ìºì»ìÆì×ìßìåìæìçìèìéìêìë ìììíìîìïìðìñìòìóìôìõìöì÷ìøìùìúìûìüìýìþí¡í¢í£í¤í¥í¦í§í¨í©íªí«í¬í­í®í¯í°í± í²í³í´íµí¶í·í¸í¹íºí½íÆíÊíÕí×íÝíÞíãíäíåíéíêíëíïíðí÷íúî¢îµîºî»î¼î½î¿îÁîÂîÉ îËîÏîÔîÖîìîñîõîýîþïªï®ï°ï»ïÂïÄïÅïÆïÉïÐïÑïãïçïèïéïñïóð¨ðªðºðÁðÈðÍðÑðÙðÜðä ðåðêðëðððöð÷ðüñ¢ñ¦ñ®ñ·ñ¾ñ¿ñÃñÅñËñÍñÑñÜñáñäñéñîñðñóñôñúò¡ò¥ò¬ò¯ò»òÑòÒòÙòÞ òåòõòûó¤ó¨óªó­ó»óÁóÄóÉóÖóÚóÜóÝóÞóéóêóñóóó÷óøóûóüóþô¥ô¦ $ Óø 3 °Ï°ö°ø°ù±à±ò²¸²Õ²ó²ö¶Ý·÷¸´¸Ä¸Ç¸ý¹ñº¤º­»Í¼ü¿ÞÃÄÃÅÄÏÊàйÑÙÑÛÓøÓùÓúÓûÓüÓýÓþ Ô¡Ô¢Ô£Ô¤Ô¥Ô¦Ô§Ô¨ÔÖÖîש×Ë×ýؽØîÚ£ÛúÜþÝáÝåÝùÝúÞÁÞÞÞçߣßÝà¯à±à¹àïáàâõãÈãÉãÑ ãÙä°äÄäååÁåôæ¿æâçªç²çÄçàè¡è¢èïé¬éÜë¶ëÙì¦ìÀìÞíïîÁîþï¾ïÍðüñÊò§òÛóÃóÄóÅóËóâ $ ÅÚ 3 °£°®°¯°µ°½°è±Û±à±á±ì±î±ò±ó±ö²°²´²Â²ô²õ²ø³²³³³¶³¸³¹³½³¿³À³Å³Ò³Ý³ß³ä³í³ï³ö ´®´ðµ¬µ¯µÊµÑµÓµî¶­¶±¶Ï¶Ð¶Ñ¶à·¦·µ·½·¾·¿·À·Â·Ë·Ì·Í·Ð·Ó·Ô·Ú·Û·Ü·é·ø·û¹£¹¤¹À ¹Ì¹å¹è¹í¹ð¹ó¹ôº¥º¦ºÁºÂºÃºÄºÈºÉºÏºÛºÜºßºäºæºëºú»ª»¬»ê»í»ø»û»ý»þ¼¦¼¬¼¹¼¼¼Ë ¼Î¼Ï¼Ò¼ñ¼ù¼þ½µ½Î¾±¾Ñ¾ë¾ì¾í¾ð¾ý¿Ð¿öÀªÀ²À¶ÀºÀÁÀÄÀÅÀÑÀÒÀÓÀÕÀÖÀØÀèÀöÀøÁ¡Á­Áº ÁÇÁöÁý¤ÂÄÂÏÂÔÂ×ÂäãóÃÅÃÏÃ×ÃáÃâÃòÃüĦĴĶįÄÍÄÒÄÚÄéŶŻÅÇÅÈÅÉÅÌÅÎÅÚÅÝÅã ÅäÅîÅóÅøÅùÅþƲÆÃÆÇÆÔǮǸÇÝȹÈÉÉ©ÉÈÉÖÉëÉõʯʽÊÅÊÉÊÞÊèÊóˡ˷ËÄËÏËÓËÙËäÌÅÌ÷ ΦοÎÇÎÍÎÝÐêÐþѧѩÑçÒªÒ÷ÒúÓ±ÓÓÓÔÓôÓ÷ÓþÔ§Ô©ÔªÔ«Ô¬Ô­Ô®Ô¯Ô°Ô±Ô²Ô³Ô´ÔµÔ¶Ô·Ô¸ Ô¹ÔºÔ»Ô¼Ô½Ô¾Ô¿ÔÀÔÁÔÂÔÃÔÄÔÅÔÆÔÇÔÈÔÉÔÊÔËÔÌÔÍÔÎÔÏÔÐÔÑÔÒÔÓÔÔÔÕÔÖÔ×ÔØÔÙÔÚÔÛÔÜ ÔÝÔÞÔßÔàÔáÔâÔæÔ÷ÕüÖµÖ½ÖÅÖÒÖêÖó×¥×Â×Å×ß×ë×ôدØÌØÔØäØóÙ£ÙÌÙÍÙÔÙúÚ¤Ú¥Ú¬Ú¹ÚÄ ÚîÚüÛßÛçܱܸÜÃÜÝÜöÜþÝÔÝ×ÝéÞ¬ÞºÞÌÞÐÞåߤ߫߰߷ßòßößýà¯àÊàëá«á¿áÅáûâ«â´âÊâÌ âÍâÐâÒâÕâëã¡ã£ã´ãÇãÑãÜãÞä¦äÇäßåÂåÌåÔåååèåõåúåûæËæÏæìç´çµçÊçËçàèÁèÇèÑèèèý é¬é³é·éºéñéóê¨ê®ê°ê´êÏêßêèêøë£ë³ëÕì£ì­ì¯ìÔìÕìÜìßìàìáìâìãìäìëìñìõí·íÅíÉí× íüî«î­ï³ï¿ïÄïÅïÓïáïîïòïþð£ðÐðÑðÞðçñÁñâòâò÷óÐóçóöóùô¡ $ »Î 3 °í°ü±Á²Å³¾³Ì´¾´î´òµÈµËµÍ·ë¸Ý¹ò»Å»Î»Ö»ï¼Â¿ÑÀ¼ÁÔÁñÁõ³ÄÛÄîÆÂÆÉÆÉǤǥÇäɶɽ Ì×ÎâÎìÐËѥѲÑßÒ¤ÓÙÔãÔäÔåÔçÔèÔùÕ¬ÕµÕÖÕüפײ×ìØÂØÚØôÙÉÚ¬Ú®ÛíÜïÝÐÞ¹ßôà±à¹áÆ áÜâÜâþã¶ãåäÖåòåôæªæáçÊè·é·êÆêÓêæë¶ëòì¦ìÎìÞí´íØïÉðºðöñ¾ò¡òåóÜóâóéóê $ Ôé 3 °¦°©°½±Ý²Æ³Æ³Ê³Õ³Û´Ëµ«µÒµò¶Ã·Ä·Ù¸å¹ß¹íº¶ºí»µ»À½ª½Ó½Ô½×½Ù½è¾ñ¾òÅßÇþȱȴɢ É©ÉùÉüʢʣʤÊÑÊöÊ÷˥˩˪˯̸̳ÌÍÌùͥͪͫÍìÍíÍîÍïÍúάδοÎÇÎÍϨϩϪÑÝÒÏÒë Ó½Ó¾ÓÎÔéÔêÔëÖÅÖ×Öü×Õ×íØ¢Ø¿ÙÈÙÕÚ¨Û£Ûèܤ޴ßàßâàÂàÇàäàûáÀáÖâ¯âÙãµãÍããäËå¬å¶ åÁæâçôè£èÑé³éýêªëìì»íÊíÖíõïÇðÏñÆñÑñîò¼òØóÎóÏóÐóÑóÒóê $ ͼ 3 °¸°Ü±Õ±å±ñ±õ³°·æ»¢»¸»Á»Ó»à¼®½Ö½ØÁ¤Á³Áò¿DzdzÉñËñ̴̾ÌÃÌëͼÎÕÎÙÎÚÎÛÎùÏÐÏÒ ÏÓÐÌѳÒÉÔìÔíÔîÔýÕ¶Õò×ÔÙÕÙêÚÍÛÜÞùßÕàÒâùãÙãßäìæþè¬èüéªéïëïì²ííîÃîÉîüï¶ó¬ó¸ ô£ô¤ $ Âç 3 °ª°³°Ã°Ð°Ø°ö°ø°ù±®±Ç±Í±Ñ±â±æ±û±ü²¨²¶²¸²÷´¬´­´¹´Á´Ø´ï´ñ´óµ¬µ³µÊ¶¢¶£¶¬¶®¶´ ¶¹¶º¶¾·À·Ü·è·í·ñ·ô·ô·÷·÷·ý·þ¸¤¸Ó¸Ø¸Ù¹Õºéºêºëºì»½»¾»¿¼º¼Â½­¾¡¾©¾ÐÀíÁ«ÁÕÁ÷ ÂÀÂÁÂÌÂØÂçå÷ÃáÄ¿ÄÐŢųŴŷźÅåÆÍÆÝÆàÆçÆèÆñÇùÇüÈþÉ×ÉÞÉçʳÊçÊèÊéÊëÊðÊôÊû ËÀËÛËëËìËóÌ«ÌÎÌÏÌáÌðÍÅÍàÎÞÎàÐÅÐáÑ¢ÑÑÑÓÑåÑêÑðÒ¥Ò·ÒËÒÕÓºÓÌÔ¡ÔÔÔïÔðÔñÔòÔóÔõ ÔöÔ÷ÔøÔùÔúÔûÔüÔýÔþÕ©ÕÈÕëÖ·Ö¿Öå×Û×éØ«Ø¶ØåÙ±ÙÑÙÖÙàÙäÙüÚ³ÚµÚ¹ÚßÚõÛ¢ÛÝÛûܸݺ ÝÈÝÊÝåÝöÞ¦ÞµÞ»Þ¼ÞÒÞäÞîÞú߳ߴßÁßÝßåßùßúàÅàÈàÓá¡áºá½áÃáØâ£â¨âÇã¥ã©ã´ã¿ä©äº äÛäÜä÷åºå¼åÆåØåçåóåþæ¬æ²æ´æ½æ¾æøçËçÎçåè¡è²è¿èÏèäèíèõéðê±ê²ê¼ê½êÁêÖëõëüì° ì¶ìÂìçìëìþí¶í¿íÅíÓíÔíÝîîî÷ï±ïÁïÔïæïýð¡ðÄðÙñ¬ñÝñÞñáòÖòðòóó±óÐ $ ½÷ 3 °£°¨°¹°Â°Ä°Æ°È°Ñ°Ò°à°ù±¸±Å±á±ã²Ç´¯´òµ¸·ù¸È¸ä¹¥¹øº§ºÊºù»Ï»Ð»Ñ¼»¼È½÷½ú¾ª¾« ¾î¿±¿ôÀ¨À«À³ÀÜÂÅÃäÄÜÅÊÅØÅÛÅÜÆòǡǥÇÌÇÞÈÞɱɲɨÊÚ˸Ëå̯̻̼ÌÅÌÑÌùÍÅÍ×Ϭϰ ÏÁÐðѤÒóÓíÕ¡Õ¢Õ£Õ¤Õ¥Õ¦Õ§Õ¨Õ©ÕªÕ«Õ¬Õ­Õ®Õ¯Õ°Õ±Õ²Õ³Õ´ÕµÕ¶Õ·Õ¸Õ¹ÕºÕ»Õ¼Õ½Õ¾Õ¿ ÕÀÕÁÕÂÕÃÕÄÕÅÕÆÕÇÕÈÕÉÕÊÕËÕÌÕÍÕÎÕÏÕÐÕÑÕÒÕ×Ö¬ÖÛÖæ×¸Ø®Ù¼ÚËÚçܦÜìݯޮÞÇßÊàýàþ áßáñâäãàäÍäØå±å·åÏåßå÷è§èÆé®ê³êíêúíûï»ðÀñ¯ñÎñðò²ò½òÚóÀ $ »Ò 3 ³Ç³Ô³Øµ¨µý¶µ¸É¸Ö¸ü¹¥¹¦¹§¹Ú»Æ»Ò»Ú»ú½Î½Ï½ß½æ½øÂ¸Â¹Â½Æ×ÆØÆýÉâËÖÌÒÌÔÍ·ÍûÐÚÒã Ó¬ÕÓÕÔÕÕÕÖÕ×ÕØÕÙÕÚÕÛÕÜÕÝÕÞ֣أةÙÏÚýÛáÛïÛöÜÚÝËÞßÞâߥß÷çÙè¨éêê¢ëÙî¾ï¾ó¨ $ Õß 3 °¸°Â°Ä°Æ°È±¡±§±®±ã±é²Ç²È²É²Ô³²³Î³Û³ä³í³ö³þ´¨´°´±´²´½´É´Ð´Û´Ü´óµ¹µÃµÒµÜµæ µç¶õ¶÷·¢·¦·ê·ö·û¹¨¹µ¹ÐºÉºËºñºõ»¡»¤»ú¼µ¼¼¼Â¼Ø¼ä¼é¼í½¡½É½Ì¾¬¾û¿²¿³¿ò¿ûÀàÀë ÀüÁ×ÁëÁîÂÂÂÈÂÉÂËÂðþÃâÃèÃ÷ÃùÃþÄáÄêÄöÅæÆÍÆÒÇ«ÉÐÉÙÊõÌ©ÌªÍ¨ÍÆÍÏÍÐÍÒÍÖÍäÎÀÏ´ ÏÍÏÐÏÒÏÓÐÉÐÊÐÎÐåÓ£Ó³Ó½ÓæÕ¶ÕÍÕßÕàÕáÕâÕãÕäÕåÕæÕçÕèÕéÕêÕëÕìÕíÕîÕïÕðغÙÝÙëÚ¯ ÚçÚ÷Ü£ÜÃÜÍÜ×ÜéÜêݦݧÝÒÝýÞ±Þ³ÞÊÞèß¿ßÀßÃßÄàØáÉâªâÒãÎãÖã×ãØãÙãÚãÛãÜãÝãÞãßãà ãáãâãããäãåãæãìä³äðäôåªåÇåÒåïæÞæäç´çµèÀèòéïëÜëãëéì¯ì²ìÐí¡í©î´îíîüï°ïµñÌñÚ ò¦ò½òòòø $ À£ 3 °Ó°Ö±¥±µ±¶±½³·´§»í»ø»û»ý»þ¼¦¼¬¼Í¼Õ¼ß¼é¼í¼÷¼ù½å¾©¾­¾Õ¾ß¿«¿Ò¿ßÀ£À캼ÂÐÂÑ ÂÔåîÃÄÃñÃòÅîÅóÅøÅùƤƮƳÆÀÆÃÇîÇöÇûɪÉÕÉÜÉäÉåÉíÉõÊ«ÊíËðÐíÐüѣѲÒõÓðÓóÔ¥ Ô´Ô¿ÔÀÔÍÔÓÔèÔýÕñÕòÕóÕôÖµÖóפ×Ö×ôØÉØÕÙÃÙóÙöÚ®ÛÕÛíÜ­ÜÔÜçÞ¹ÞéÞðÞùß©ßñàÒá¯á¿ áÆáÇã¢äÖå¡åÕæ¯æÕç¥ç®çøè×èìèóé¡êóìÒí­í´íÛï¶ïÉð£ò¬óÍ $ ¾® 3 ±Æ´êµþ·Ê·ß·ä·ü¸©¸¶¸»º»º½ºÀºÐ»å¼Ó¼ä½¢½³½Ç½Ê¾®¾¯¾¶¾Ä¾Ê¾Î¿ýÀÌÀíĽÆÄÆöǪÉÃÉÎ ÉÐÉÑÊâË«ËÔ̯̺ÌïΫνÎÀÎÃÎÅÎÆÎÊÎËÎâÎìÎôÏÉзÐèÑÚÒ§Õ°ÕÍÕðÕõÕöØÅØÝÙüÚ¯ÚÆÚÇÚÍ ÚþÛ¢ÛÂÜ¥ÜåݧÝÒÝÛÞÝß³ßÀßÖßùàßáÂâ¿ã·ãÒåÍåÑåçåïåûèµè¸èÃéÀéëêÙí¦îäîýïÁð¢ð­ðþ ò¦òÂó¾óÝóè $ ¾° 3 °î±£±Ä±É²©³É³Ð³Ø´àµ±µó¶ý·Ö¸·¸÷¹¸º¿ºïºù½Ã½þ¾¥¾¨¾¬¾°¾³¾¸¾¿¾Ã¾Ë¾Ó¾Ø¾Þ¾ä¾ïÀæ ÀïÁµÁãÂÍÂýÃ±Ã½ÃÆÅÞÅöƲǺǾÊÀÊÃÊÍËÚÍÀÍÔÎÄϫϹѸÑöÒ«ÒÒÕÃÖ¹Öò×òØ¡ÙÂÚÈÚÉÚÍÚè ÚþÛãÜ«ÜæÝ°Þ«ÞÅÞæàôàþá³á·áÄâÕã§ãÄå­æùê¬ê°ê»êüêýë§ë×ìäíöîùïÆð¼ðÐòÃóÞóè $ Õ÷ 3 ½¢½³Ã¿ÄÀËíÌàÏÉÒÍÕ÷Õø×Úà»áÏâ¾æïîÅòñ $ Õù 3 °®°¯°Ó°Ö±¶±Ø²°³áµïµø¶É¶ý¶þ·¡·¢ºÔºþ»Ó¼È¼Ü¼á¾ü¿¬¿Ô¿ø¿þÀ¼ÁØÂ°ÂòÂôÃÙÃëťŸÅ ÅÃÅËÆÏÆôÇ¢ÈòÈøÈýʽÊÈÊÉÊÊËÙËùÌõÍúϳÐâÐãÑüÒèÓ¡ÓöÕ»ÕÊÕùÕûÕüÕýÕþÖ¡Ö¢Ö£Ö¤ÖÁÖÄ ÖËÖê×âÚ¦ÚãÛõݡݢߥßñàªàúá²áìáõâÂâáâúâþãÐæáç½ç¾çÚé°êåêþëòì¢ìòì÷í£í²íÙíäî¯ îåïóðÈóù $ Ö¥ 3 µÕºó¿ö¿÷ÁºÁÌÏÏÒÐÖ¥ØÇÜÎÞêàÕâ²çççíèÚéÐí¬îÀïí $ »³ 3 ²¬²å³®³³³»³Ù´Ì´ß´à´â´ä´ôµ«¶®¶þ·¡·¢¹Ë¹Ý¹äº·ºÅºê»³½Ð½Ô¿ð¿ò¿óÀÛÀçÁ»ÂÒéúü ħĨÅçÅèÆ½ÈùÊöÊ÷ÊøËÙËþ̨̩ÍòÎ¾ÎæÐãÑóÒÂÒôÓÃÓÐÔ«Ö¦Ö§Ö¨Ö©ÖªÖ«Ö¬Ö­Ö®Ö¯Ö°Ö±Ö² Ö³Ö´ÖµÖ¶Ö·Ö¸Ö¹ÖºÖ»Ö¼Ö½Ö¾Ö¿ÖÀÖÁÖÂÖÃÖÄÖÅÖÆÖÇÖÈÖÉÖÊÖËÖÌÖÍÖÎÖÏÖÐÖÑÖÒÖÓÖÔÖÕÖÖ Ö×ÖØÖÙÖÚÖÛÖÜÖÝÖÞØ¸ÙåÙñÙôÚ¸Û¬Û¼ÛÓÛüÜÈÜÏÜéÝèÞÚß­àÎáÍâ­âÀâöã®äüåÞçæé¯éÐë±ì± ì´ïÛóÙóà $ Àî 3 ´¦¶ü·±¹²¹ÓºÒ»¢½£½§½·½ä½çÀîÁÁÆëήΰβÑíÒ¦ÒÁÖß׫×ÍØ½ÚØÛàÝÚàÚàïáÛáþâõå´å¾æú çªçÄè³èöíËíÏíôîÑï¡ïÍðôñÒòË $ ¹© 3 ¶²¶õ¸ù¹©¹ª¹µ¹¶¹¾¹È¹Ð¹×¹à¹ãº´º·º¸º¹º¼»î¼°¿¡¿ÒÂÆÂÊÃÛÃÞÆúÌÝÐåѲÑíÒ¦Ó³ÓÍÓÚÓã ÔØÔèÖÍÖà×¶×ÍØ±Ù¬ÙíÚ®ÛºÛíÛýÜÊÜÌÜóÝç޹ߩßðáÂáÆáÛâåâøãÓä®ä³äÖå´åÓåýæêæúç¡ç» è³é¡éÞë®ëÁëØìïí¢í´íÈíËíôî®ïÉð¬ðÍðßðôñòó¥ $ Öá 3 ²þ³ó´¬´÷µªµ­µ¯·ñ·÷·þ¸Ê¹«¹ÁÀñÁªÁ«Ã§ÇÃÇÛÈÞÊñÊùÊúˢˤ˦˰̦ѢÑÅÒ·ÒöÔµÖáØ«Û¹ ÛÔßÜßæßçà¨á×â®ã«å¼çúèÍéÛéðêÜîðð»ðÒðèñÂñýòºóÒô¦ $ ¶Ò 3 ³Á´õµ¢µ©¶Ò¶Óºöºþ»É»Ð»Ô»Õ»â¾ï¾þ¿ãÀ©À½ÀÊÁÙÁÝÂÓÂÚÂüġĢÄßÄëÄùÄüÄýÄþÇÙȨÈÁÉØ ÉÛÉÝÉýʾÊÀÊÃÊÍ˹ËÚËëÌÉÌÊÐÐÑÑÓ©ÓÁÓÆÕÃÖãÖäÖåÖæÖçÖèÖéÖêÖëÖìÖíÖîÖïÖðÖñÖòÖóÙÚ ÚÉÚÍÚÔÚëÚþÛËÛùܧܼÜÂݸÝÅÝïÞüàãä²ä¶äÁåÄæ²èÈèÜèîèøéÉê¬êÌïßð¾ò©òÆòÞ $ ´³ 3 °ò±§±ª³ø´©´³´´´À´È´Î´Ü´ßµÏµö¶Î¸¥¸®¸áÄÚÆîÆïǯÇÒÇéÊ¿ÍÉÍØÍÚаÓÇÓþÕ¡Ö°ÖôÖõר ×è×ûÙªÙÁÙÂÙÒÚÆÚÇÚÔÚÝÛ¸ÛÙÛåÞ¤ÞÜÞ÷ßµãÃæ§çùèÌëÀî¨ïØñ±ñ¶ñÓñìò¹óí $ Öö 3 °ë°ý´öµ¡µ¦¶¿¶Á¶Â¸¸¸¹¸¼¸¾¸¿¸å»å»ü¼¢¼§ÃÜÃßÍ©ÍÄΨÎþÒìÔøÕÚÖöÖ÷Ù¹ÚÒÜÛÝ«Þä߼ᱠáÒâÁãØåëæßè¤é»ê«êÊëøì°ìþîÊîëïðð®ð¶ðýñÀó±óÛ $ Öø 3 °Ã±þ³Ç³È·Ä¸Ë¹­¹®¹¯¹Ç¹Û¹Ü¹÷ºÂ¼¯¼×½î½ø¾±¾²¾³¾Ñ¿ÐÀÊÁ¦ÂëÄ£ÄìÄ폯ÅÏÅÕÅÙÅâÅä ÅüÇÑÈßÉÀÉÜÉåÊùËàËáËâËãËûÍÃÍÇÎÛÎïÎñÎòÎ÷ÎüϭϼÐíѶÓ×ÔÝÖ÷ÖøÖùÖúÖûÖüÖýÖþסע ףפץצקרשת׫׬׭ØÍØÙØæÚ²Û¥Û¦Ü­ÝàÞïß²ßÓâèäöå¦åÛç¥ç¿èèèîèôìÜí¨í·íÁíÜ ï²ïÊñëòáóºóÆóÇóÈóÉóÊóËóÌóÍóÓ $ ×® 3 ±ä²ö·ò·ú¸°ÃÂÄíÄîÄòÄúǶǷ׮ׯÛìÞ·ä§ç§è¯éãééð½ $ ×° 3 ²£²ü³£³«³×¶Æ¶Ç·º·¿·Á·Õ¸¦ºÑºØºÞºý»»¾£¾ºÀÆÁòɡʻʽÊÀÊÛËÛÌßϮЧÐÕÑìÒÃÓ¯ÓçÔº Õ«ÕÎÖ¢Ö²×°×±×²×³×´ÛÆÛÇä¢å³æßç¦çÍèÏê¼ê½ëÓíþïþñØóí $ ×µ 3 »î¼°¿¡ÂÒÂÞÂßÂãÂåÆÐÆõÉÌÉêÉð̹СбԲ׵׶۪ۻàÞç·ìÈìÉíÈ $ µÝ 3 °Ð°ó°ú±­´¡µÝµç¶¯¶°¸¹¸Ì¹°¼åÂèÃÆÃÐĤĥĿÄïÄðÄôÅ®ÇêÈñɫʦʨÌïÏÑТÐÇÐßÑÂÕ©Õ¾ ÖÎצ׷׸׹׺׻׼׽׾׿×Ê×çÙÄÙîÝ÷Þ¦Þ¸ÞýßÐßÔàÁáÅáØâ¤âÉãÖäøåÚèêéÎêöí»îîñüó´ $ ¥è 3 °Ë±£±ï²º³ùµ¢µÞ·Å·ó·ù¸¬¸ß¹®¹¯¹ÇºÊ»ö½«½Í¾¹¾ô¿¯¿²¿»¿ÒÀ¨À³ÀÅÀãÁÝÁèÂáÂõíŧÅâ ÅäÅöÆÔÇíÉØÌöÍÃÍÇÍËÍÔÎÐÎâÎìÎ÷ÎüϽϿЯÐÖÓ¼ÓâÔÜÔìÕêÕúÖÄÖä׳״×À×Â×ÃØ®ØÄØÍØÙ Ù§ÙáÛãÛõܨܽݥݩݾÝÅÝìÞÆÞÇÞïߩ߲ßÏßþà¢à§áÉâ¸âÌâñã½ãÓãÛä¤ä¶ä·ä¸äÔäûäüæ·æº æéç³çÜèÆèÈèåé¡é«êåêíëÚìÑìÙíÚï£ð¬ð°ð±ðÌðÐñÔòá $ ×À 3 ¸ß׳״×À×Á×Ã×ñÝìã³ä¿ê $ ×Ä 3 °³±Æ´é·Á¸ÁºÌ»²»´½¤¾´¿¾¿Ç¿Ü¿ùĦÄÁȱɦɧɵɷÉËËÄËÔÐôÒ­ÒÍÒÔÕìոס×Ä×ÅØÎÙ¤Ù÷ ÜÜݵÝÉÞúß°á»äÉåÙç±èëèõèúêÎê×ìãíÇîÒï¹ðúñ¸ñÝñõñöñ÷ñøñùñúñûñüñýñþò¡ò¢ò£ò¤ò¥ ò¦ò§òÍ $ ׯ 3 ±Ò±ý³¹µ«µú·Â·å¸å¸æ¹Ô¹Õ½¾½Ä½Ñ½Û½ù¾×À¬ÂÔħĨŰÅÌÆÀÆÁÈàÈùÉüʤÌòÍúΧΪӦԸ֡ ׯ×Ç×È×É×Ê×Ë×Ì×Í×Î×Ï×Ð×Ñ×Ò×Ó×Ô×ÕØ´ØÑÜâÞ§å®åÔæàé¯êÊêËêÌêÍêâí§í×îòòýóà $ Ë» 3 3D38 °Ô±Ù²±²÷²ø²ù²ú²û³´³æ´·´¸¶±¸ç¹±¹²¹ûº¨»´¾ð¿µÀ­ÀËÁþÂÆÄðÅ鯴Æ×ǺÉÝʰ˻ËýÌûÎç Îù×Ö××ר×Ù×Ú×Þ×ß×à×á×â×å׿×ç×è×é×ê×í×ï×ð×ñ×ò×ô×õ×ö×÷×ø×ú×û×ü×ý×þءآأؤ إئاةثجحخدذرزسصطظعغػؼؽؿØÁØÃØÄØÆØÈØÉØËØÌØÍØÎØÐØÒØÓØÔ ØÕØÖØØØÙØÝØÞØßØâØãØäØåØçØèØêØëØíØîØïØñØòØóØõØöØ÷ $ Ù© 3 3F37 °§°®°·°Ä±æ±ç²¡²ý³È³É³Ý³ç´¹´øµ»µ¼µÅµñµò¶´·¡·Ç·È·þ¹³¹´¹µ¹éºÃºÎºñ»¢»£»¤»«»µ »Ø»ý¼Î¼ø½¦¾¶¾·¾¹¾ñ¿¡¿¶¿ä¿øÀ¢ÀÀÀÂÀÛÀÜÀÝÀÞÀñÁ¼ÁÜÁÝÁÞÁßÁષ»ÂÇÂñÂòÂóôõ ÃêĩĽÄÏÄñÄòÄóŦŧůűÅêÅëÆµÆèDZDzÇÄÇÅÇÒÇÓÇïÈ´ÈÂÈÔÈãÈäÉÁÉÞÉïʧʱÊáÊúÊûËÐ ËõÌÎͬÍÈÍÉÍÊÍÞΫ٩٪٫٬٭ٮٯٰٱٲٳٴٵٶٷٸٹٺٻپٿÙÀÙÁÙÂÙÃÙÄÙÅÙÆ ÙÇÙÈÙÉÙÊÙËÙÌÙÎÙÏÙÐÙÑÙÒÙÓÙÔÙÕÙÖÙ×ÙØÙÙÙÛÙÜÙÝÙÞÙßÙàÙáÙâÙãÙäÙåÙæÙçÙèÙéÙêÙìÙí ÙîÙïÙðÙñÙòÙóÙôÙöÙ÷ÙøÙùÙúÙûÙüÙýÙþÚ¡Ú¢Ú£Ú¤Ú¥Ú§Ú¨Ú«Ú¬Ú­Ú®Ú¯Ú°Ú±Ú²Ú³Ú´Ú¶Ú·Ú¸ Ú¹ÚºÚ¼Úñݰ޶ÞÜä¯ä²äÚ $ ½Á 3 4653 °¯°î°ü±²±º±Ë±Ì±Õ±è±é±ø²­²¹²Ï³¤³¶³½³ã³è³é³ê³÷´À´Á´Â´Ãµ¥µâµãµôµù¶··¦·Ì·ã·è ·é¸º¸»¸Ð¹¾¹¿¹À¹Á¹Â¹ã¹ê¹÷º®º»ºÀºÑ¼¢¼£¼®¼¾¼¿¼ò½§½Á½Â½Ê½ß½à½á½í¾Â¾Ã¾Ä¾Å¾ô¿» ¿¼À¡À¥À¶ÀõÀöÀ÷ÀøÁ¢Á²ÁæÁô¬ÂÁÂÚÂìÂíÂôÂõÂùøùÃÓÃíÃõĬÄÀÄÅÄÒÄÙÄõťũŮźÅà ÅÉÅÏÅñÅòÅ󯢯¶ÆÂÆÔÆÙÆçÆòǨǻÇÈÇÉÇÌÇñÇóÇöÇùÈ®ÈÅÈÆÈÍÈçɺÉÍÉÎÉâʥʨÊíˡˢË× Ë÷Ëþ̡̫ÌÇÌýͯͰÍÎÍÏÍàÍáÍäÍìÍîÍôήίÎÂÎÃÎÔÎÞÎúϲϳÏÑÒ»ÔËÕ°Ø´ØÊØðݹÝèÝéÝê ÝëÝìÝíÝîÝïÝðÝñÝòÝóÝôÝõÝöÝ÷ÝøÝùÝúÝûÝüÝýÝþÞ¡Þ¢Þ£Þ¤Þ¥Þ¦Þ§Þ¨Þ©ÞªÞ«Þ¬Þ­Þ®Þ¯Þ° Þ±Þ²Þ³Þ´ÞµÞ¶Þ·Þ¸Þ¹ÞºÞ»Þ¼Þ½Þ¾Þ¿ÞÀÞÁÞÂÞÃÞÄÞÅÞÆÞÇÞÈÞÉÞÊÞËÞÌÞÍÞÎÞÏÞÐÞÑÞÒÞÓÞÔ ÞÕÞÖÞ×ÞØÞÙÞÚÞÛÞÜÞÝÞÞÞßÞàÞáÞâÞãÞäÞåÞæÞçÞèÞéÞêÞëÞìÞíÞïÞðÞñÞòÞôÞõÞöÞ÷ÞøÞúÞû ÞüÞýÞþߡߢߣߤߥߦߧߨߩߪ߲߫߬߭߮߯߰߱߳ߴߵ߶߷߸߹ߺ߻߼߽߾߿ßÀßÁ ßÂßÃßÄßÅ߯ßÇßÈßÉßÊßËßÌßÍßÎßÏßÐßÑßÒßÓßÔàëâ»â¼âîãûäÌäíç÷è«èµèÊèÌèÍèÑé¥ïèïé ð¾ðÁðÆò $ ÈÈ 3 4A6D ±î²®³Í¶¸¶¹¶é¸Ñ¹ö¹ýº¦º©»â¼íÁÀìÃöÆÈÇ­ÇâÈÈÌÔͱÎÄϵßÌà»à¼à½à¾à¿àÀàÁàÂàÃàÄàÅ àÆàÈàÉàÊàËàÌàÍàÎàÏàÐàÑàÓàÕàÖà×àØàÚàÜé¤ëÔíø $ çè 3 °ª°«°±°²°à°ñ°ò°þ±¶±Á±Í±Ñ±í±ñ±ò²®²Ö²×²Ø²Ù²Ú²Û²Þ²ê³©³¸³Í³Ï³ë³ñ³ò³÷³ý³þ´£´² ´Á´ÐµÆ¶¾¶Ã¶Ï¶Ð¶Ü¶Ý¶à¶ì·°·É·Ô·Õ·Ù·Ý¸Ö¸î¹²¹ÓºÚ»§¼¬¼Ã¼Ç¼É¼ã¼æ½¯½ò½ó¾Ô¾Õ¾Ö¾ø ¿Ä¿Å¿ûÁ¦ÁÉÁðÁñÁòÁóÁô¡¢ÂÝÂúÂûò÷ÃßÃãÃ÷ÃøÄÕÅÑÅãÅëÆ¡Æ¢Æ£ÆºÆ¿ÆÑÆåÆçÆñǣǬ Ç­ÇÎÇëÇöÇùÇüÈÍÈÙÈ÷É©ÉÁÉÄÉÅÉÇÉçÉòÉóÉøÉùʮʯʰÊÃÊÎÊçÊèÊéÊëÊî˧˨˩ËëËìËúÌ¢ ̴̬ÌÎÌÏÌÐÌØÌôÌùÍÕÍÖÍéÍîÍõÍöΪÎêÏ¡ÏÎÏÏѳѵÑÑÑõÒ°ÓåÓôÔÂÔ×ÕëØ×ØàØéØõÚºÚõÛ¡ Û¤Û¯ÜÝÜÞÜûݢݨݱݶÝÄÞÑÞõß¹ßÂßÏàÓà÷á°áöâ¼âÞâêâíäñäõä÷äúæ¥æ²ç¹çÅçÇçÑçáçåçç çèçéçêçëçìçíçîçïçðçñçòçóçôçõçöç÷çøçùçúçûçüçýçþè¡è¢è£è¤è¥è¦è§è¨è©èªè«è¬è­ è®è¯è°è±è²è³è´èµè¶è·è¸è¹èºè»è¼è½è¾è¿èÀèÁèÂèÃèÄèÅèÆèÇèÈèÉèÊèËèÌèÍèÎèÏèÐèÑ èÒèÓèÔèÕèÖè×èØèÙèÚèÛèÜèÝèÞèßèàèáèâèãèäèåèæèçèèèéèêèëèìèíèîèïèðèñèòèóèôèõ èöè÷èøèùèúèûèüèýèþé¡é¢é£é¤é¥é¦é§é¨é©éªé«é¬é­é®é¯é°é±é²é³é´éµé¶é·é¸é¹éºé» é¼é½é¾é¿éÀéÁéÂéÃéÄéÅéÆéÇéÚéßê±ê²ê¼ê½ê¿ë¤ë³ë·ëõëöì¬ìÂìÌí°í¹î²îÀîúï¥ï¦ïÑðÄ ðåðæðéñ¢ñ³ñ¼ñÞñéóÁ $ Ë® 3 °ê³Ç³Ô¶¿¶Á¶Â·´··¹Ù¼Ã¼ÙšŢÅÔÆáÉôË®ÌìÌí͹ϭϱϺÓìÕ±ÙèÚ³ÛëÜ¿ÜÚàçê§í¶î·î¸î¹ îºî»î¼î½î¾î¿îÀîÁîÂîà $ ïô 3 °¤°þ±¡±¢±£³¬³Ö´Ù¶ù·¨·ä¸±¸Â¹ßºÝºå»§½ü¾ã¿Ø¿ïÁËÂÄÂËÂâÄÄÄÆÆ«ÇæÉÖÉìÉíÊÅËÉÍÛΦ δÎÍÎÙÔØÕ´Ö×ÜóáÞããç¡î®ïôïõïöï÷ïøïùïúïûïüïýïþð¡ð¢ð£ð¤ð¥ð¦ð§ð¨ð©ðªð«ð¬ð­ð® ð¯ $ Ìé 3 »Ü¾ÃÏÃÐÃÓÃÚÌéèáîáñö $ Ë´ 3 °º¹Ó˴˺˻˾ÌÑÌÕÌÖÕ¥ÝâßÊæ¨æÀæëçêè«ì×îúò³ $ µÚ 3 °·µÚµÛµâµèµéÖ© $ µ× 3 µä¶ê·©À¦ÛÍáÌ $ Ï· 4 ±¸¶µ¹§¹Í¹Ú¹é¼Ñ¼Ô½ë½ì½í½ï½ð½ò½ó½ôÃõÃöÃøÅÈÅËÅÒÅÔȤÉÉÌÙÏ·Ð÷Ó¤Ó¬ÓÏÔ×ÔúÛÞܺßÌ âÑæÍæÎæÏèééâë¯ì·ìàí°ïë $ ¿´ 4 °¦°­°Õ°Ö±£±å±þ²¯²±²²²¸²º´µ´¶´¸´÷µÞ¶²¶³¶ò·Ã·Ä·Å·Æ·û·ü¹ú¹ûº©»Ö»×»ï»ü¼½¼Å¼É ¼æ½¥½ú¾ñ¿´¿ÄÁÚÁÛÁëÁíÁï©ÂÕÂÖÃÑÃéĨİźÅÜÆÁǦǧǫǬǰDZÈáÈçÈëÉ¬ÊæÊé˺̩̪ Ì­ÌåÌüÌþͥͪͫÍÝÎ¸ÎøÏÇÐøÓ¹Óàӿ׬׭×Û×Ü×Ý×ã×ä×ë×ì×î×ó×ùبتشضػؾØÀØÂØÅ ØÇØÊØÏØÑØ×ØÚØÛØÜØàØáØæØéØìØðØôØøÙþۣܬÜéÜêÜúݦÝîß¿ßÉßïàØàîáÜâÙã°ãÏãÓå¹åÁ æâæäæåç¨è»é¢ê©ëííÁíÞï¼ïÌð¬ðÏðûòÐòÔ $ Øù 4 °¿°Ò°è°ë±Û²ä²å²æ²ë²î²ü³£´¶´¸´öµ¡µ¦µ·µºµ¾µÁµÂµÄ·á¸ººÈºÏºÐºÛºÜ¼±½¿¾ë¿¥¿¦À® À¹À¿ÀÌÀïÁ¡Â¡Â¢Â±Â×ȲȵȶÊÎÊê̹ÌÇÌÐÏÇÒùÓ¨Ó¿Ô¢Õ®ÕÑÖ¶ÖÔÖîÖðØòØóØùØúØûØüØýØþ ١٢٣٤٥٦٧ٲÙþÚðÛ§Ü¢ÜåÝÌÝÓÝÔÞÉßÅßõà°àºâ·ã¦ãÒä­äµä¾äÞäßå°åÀåÈåÏåùåúæ¼ ç²çÇçÉçßè°é¶ë¤ëÓëøì«ìÃìÍìÖìÛìøí¦íÈíÞîèï¢ï§ïªïÄïÅïçðéñ´ñÀñÅòÒòÚó¡ó¢óÄ $ ¸Í 4 °²·¼¸ª¸Í¸Û¸Ü½êÀðÀúÈ¥ÈâÊÐÊÓÊÔÊ×˼ÌáÎÞϧӺØÈÙ¨ÙàÙïÛÅÞëÞöääå»åÆæÉçäéþêïëæî½ ïÏñÙ $ ¼ê 4 ²ä²å²æ²ë²î´Çµ·µ¾µÁµÂµÄµó·â·ý¼ê¾µ¾¸ËàټٽÙÍÙÚÙëÙõÚ¦Ú©ÚµÚ»ë§ $ »Ù 4 ´ì´ôµ¸µ»¸Ý»Ù»Þ»èÒ×Ö¡ÙÓÞìâÜæÂçÛìåóê $ Ú¾ 4 ±Õ²þ³Æ´º´àµß¶µ¶Ã·¼·É·Ù·ã¸·¸Î¹¶»µ»¶»Ú¼Ä¼Ï½¤½è¾³¾ò¿ôÀ¯À°Ã×ħĨŨŰűŲÅßÆØ ÇÔÈ¥ÈËÈùÉÒÉßʾÊÀÊÃÊÍÊïÊüËÒËçÌùͪÐöÐûÐþÑ·ÒÒÓÓÓîÔéÕÄÖÞÖòؾڽھڿÚÀÚÁÚÂÚÃÚÄ ÚÅÚÆÚÇÚÈÚÉÚÊÚËÚÌÚÍÚÎÚýÚþÛêÜíÜûÜüÞþß­ßÒßòß÷àÇâ×ãáä¬äØå¶å»åÌåäæûèëé®é¯ê¨ê® ëªìÔìíî«î³îÚï¾ðÇñûò±òâó¯óàóäóçóè $ ʸ 4 ²ãºÑºØºÞÀÆÂÐÈÃÈåÉÌÊ¸ÌæÒçÕÝØ§ØâÚáå¤éÊìÖïÜðúñÉ $ ÅÍ 4 °¶²Ê³¡¼Ð¿ÞÅÍÎÁÙµÚÏÚÐÜßÜàèÔéÑéø $ ¶Ô 4 ³Â³Ùµ§µÖ¶Ô¶Õ¶Ü¶á¶ï¹¡¹¤»Â»Ã»Û¼Á½Û½Ý½â½ê¾¢¿·¿ÅÀÀÀÂÀÍÀÏÀÞÁ²ÁÊÃÇůÅ×ÆÊÆÛÇÉȸ ÉÆÉÍÉàʼ̮ÎåÒÑÒáÓÝÔ­ÔÏÖÐ×£××ØÏØÐÙ¾Ù×ÙùÚÑÚÒÚñÚòÛÑÛîÜáÝëÝûÞ¶ÞÈâ¬éÕéòíµî¹îã ï´ $ Êý 4 ±÷´ú·ã»ÜÀû²ÉßÊïÊüÊý˧ˬ˵˷˸˼ËÂËÃËÉͷιÐþÓ°ÓÓÓÕÓû×Ç×ÕÚÄÚÓÚÔÚÕÚÖÚ×ÚØÚÙ ÚÚÛÄÜÁÜÖÜüÞËÞâÞñßòâüãáäÈäÙç¯ç°çÖèáèðè÷ê¢ê¨ëªëîìÔî«î³î´ï¥ï·ïäñ³ñ÷ò·òÎòâóç $ ÚÛ 4 ѨÖýÚÛÚÜÚúÞôߪäÑêÄëû $ Æü 4 °°°¶°¼°Å°Ç°Õ°×°ð±¤±·±Æ±Ç±È±Ì±Ú±Þ±á±â±ã±æ±ë±ð²¡²¢²£²¯²±²²²¹²»²Ë³¢³·³¾³À³å ³é³ë³ì³û³þ´¥´´´»´¼´Â´Ê´Í´Ò´Ö´Ù´Úµì¶­¶À¶Á¶Ç¶Ê¶ù·£·®·¯·°·Ç·Ê·Î·Ø·á·ä·ö¸²¸ü ¹±¹·¹¸¹¹¹¼¹Ã¹Å¹á¹ùº¥º§ºªº«º®ºÇºçºòºøºü»£»¯»Ã»Ø»Ý»é»ò»ù»þ¼¬¼±¼´¼¾¼Ñ¼Ô¼Ú¼â ¼ï¼ð½Å½Õ½Ü½Þ½ë½ì½í½ï½ð½ñ½ò½ó½ô½ý¾§¾¨¾«¾´¾º¾»¾¼¾½¾À¾È¾Ï¾Ô¾×¾á¾ã¾ì¿¥¿¦¿­¿¸ ¿½¿À¿Â¿úÀ§À±À²ÀÃÀËÀÎÀÒÀëÀøÁ¹Á¼Á½Á¾ÁÎÁØÁÜÁÞÁáÁâÁåÁæÁìÁðÁøÁýÁþÂ£ÂØÂéÂêÂîâ óôöÃÀÃÅÃÈÃÉÃÒÃèÃêÃëÃõÃöÃøÄªÄ«Ä¬Ä²ÄÄÄØÄÝÄéÄóūŵÅÈÅËÅÒÅÔÅàÅéÅìÅïÅòơƢ ƧƯưÆÀÆÏÆÞÆüǻǿÇÀÇøÇùÇúÇüȤÈÕÉÀÉÉÉáÉèÉüÊ¢Ê£Ê¤ÊØÊÜÊçÊèÊéÊë˨˭˹˽ËÁËÚ ËæËëËìËý̡̢̨̽ÌÀÌÁÌÎÌÏÌÙÌôÌýͮͳÍÈÍËÍÌÍÛÍóÍöÍúνÎÀÎÅÎÆÎÈÎËÎÌÎñÎûÎýϣϥ ϦÏËзйÐéÐëÐðÐòÐõÐ÷ѨѩѿÑÑÑñÒ¨ÒØÓ¶ÓÏÓÞÓàÓõÔÇÔÍÔÑÔ×ÔÚÔàÔúÕ§Õ¼ÕÆÕæÕëÖÂÖÑ ÖíÖïÖðׯ×Î×å×ö×ûتزضعغؿØÀØÓØÕØÖØÝÙ»ÙÒÙÔÙÜÙãÙòÙöÙüÚ£ÚÝÚÞÚßÚàÚáÚâÚãÚä ÚåÚæÚçÚèÚéÚêÚëÚìÚíÚîÚïÚðÚñÚòÚóÚôÚõÚöÚ÷ÚøÚùÚúÚûÚüÚýÚþÛ¡Û¢Û£Û¤Û¥Û¦Û§Û¨Û«ÛØ ÛåÛþܡܪܰܺÜÅÜÐÜÕÜçÜðÜñÜúݼÝÏÝñÞ­ÞºÞ»ÞæÞìÞòßªß«ß¬ß³ßµß¼ßÆßËßÌßÑßãßèßìßí ßîßóßõßùà¥àÀàËàÏàÓàÖàøá¯á´áÕáçáéáïáòâ»â¼âÑâÔâòã¢ã¸ã¹ã¼ãÃãÏãñä£ä±äÊäÑäÒäë ä÷å²å¿åÎåÖåÜåãåçåéæ¤æ¬æ­æ²æ»æ¿æÍæÐæÑæÒæÓæÔæÕæÛæðæôç¢ç©ç«ç¬ç®ç¶çºçÅçØçÛçÝ çâè¦è¿èÂèÐèßèéèóèþé¥é§é´é¸é¹é½é¾éÆéØéîéùéýê£ê¦ê±ê²ê¸êÁêÄêÒêØêéêòë¦ë©ë¯ë¼ ëÎëÞëãëçëôëõëûëüëýì·ìÂìàí°í½íÖíìî¡îÌîÔîØï¸ï½ïÁïÞïæïëïìð®ðËðÔðÚðáðâðïðððñ ðùðüðýñ»ñ½ñÆñÓñÕñÞñóñþò£ò¶ò¿òÈòÊòÖòØòÜòãòæòçó§ó©ó¾óßóáóì $ Û© 4 ÐëÖÑÙÜ۩۪۫߬àøáïäÒèþëýï½ $ ·î 4 °ß°â°é°ê°ý±Þ²²³¼³Ñ³ê´Î´üµÓ¶»¶¼¶Ú¶ý·§·î¸¨¸ª¸Ð¸Ò¸Ô¸Õ¸ê¸ï¹Î¹Ï¹Ð¹Ñ¹ø¹üºèºïºó »ª»¬»µ»¶»è»é¼ð½±¾¡¾¥¾¬¾¿¾Ã¾Ë¾Ó¾ä¾ð¿Õ¿ï¿ñÀ²À¶ÀºÀÁÀÄÀÅÀÈÀÔÀùÀýÁ£Á°Á·ÁºÁÌ¡ ·ÂÄÂÆÂÊÂÖÂÛÂÜÂíÂýæêÃÀÃþīĬıIJĿŰűŲƣƥƭƹÆÔÆÚÇ½Ç¾Ç¿ÇÆÇØÇÙÈ©ÈíÈî ɨɪÉÀÉæÉþÊ¢ÊøÊþ˦˨˲˾ËÃËÄËìËî̮̻ÌÀÌÁÌ÷ÌûÌüÌþͨͭ͢͡ζϯϸϾÏÅÏÆÏÓÐÒ ÐêÐùÑÁÑÉÑËÑòÓÀÓÈÓÞÓüÔÄÔØÔÚÔâÔæÕ¯Ö¹×º×úØ¡ØÇÙÐÙéڱڴۭ۬ۮۯ۰۱ܵÜÀÜËÜÎÜó Þ²ÞÂÞÏÞáÞêÞîߦßÊàÆàÊàÑàñàüáèáëâÍâïâ÷ãÄä¹äÆäÛäÜåØåÞåäæ°æ±æÀæÈæêæëæìæíæîæï æðæñæòæóæôæõæöæ÷æøæùæúæûæüæýæþç¡ç¢ç£ç¤ç¥ç¦ç§ç¨ç©çªç«ç¬ç­ç®ç¯ç°ç±ç²ç³ç´çµ ç¶ç·ç¸ç¹çºç»ç¼ç½ç½ç¾ç¿çÀçÁçÂçÃçÄçÅçÆçÇèÇèÎèÙéÄéñéöéúê¡ë°ë×ì×ìäìüí¤íöî§î¬ î®îÊîùï«ïúð¯ð¼ðÇðÐñ·ñìñíñîñïñðñññòñóò¶òÃó¤ó³óµóü $ ÌÚ 4 °´°Æ°É°Ø±µ±É±Ý²£²³²Ì²Í²Ó²Û²Ý³£³µ³Á³Ê³Ë³Ú³ß³à³á³ñ³ò³ô³ü´»´¼´½´Ò´×´ù´ý´þµ¡ µËµÌµÏµÙµàµô¶¶¶È¶Ë¶Í¶Ø¶ß¶û·ª·«·¬·Ë·å·æ¸¡¸¢¸Ï¸è¸é¹º¹»¹¼¹½¹Ìº¤º¬º­ºººÌºÎºÏ ºÓºÚºàºçºôºöºù»¥»¦»¨»·»É»Þ¼¿¼Ä¼Æ¼Ý¼ë¼ì¼î¼ù½¸½À½Ñ½Ò½Ý¾²¾¾¾¿¾À¾Á¾Å¾ò¾ó¿¢¿· ¿¹¿º¿¼¿Å¿Æ¿õ¿ù¿úÀ°À³À´ÀÏÀÒÀòÀóÀ÷Á¿ÁÂÁÃÁ×ÁÛÁàÁãÁäÁåÁçÁêÁôÁú«®¼ÂÈÂÊÂÎê îõÃÉÃÛÃãÃìÃôÃýĭijĵļÄÄÄÇÄÈÄÎÄÐÄÓÄØÄôÅÉÅÎÅÓÅàÅìÅíÅîÅïÆÊÆËÆÎÆêÆïǸÇÇÇÕ ÇÞÇßÇàÇáÇðȢȧȭȸÈÄÈõÈúɢɨɰɸÉËÉöʲÊÁÊÝÊòË¿ËÀËÅËÑËÜËàËáËâËãËåËæËçËêËí ËïËñËõËöË÷Ëụ̤̥̺̂ÌÉÌÏÌ×ÌÚÌÝÌôÌøÍ®ÍÌÍÍÍÕÍçÍèÍéÍêÍóÍöÍûÍüÎÂÎÓÎÔÎÖÎñÎòÎû ÎýϣϦϰϱϼÏÈÏÎÏÐÐÍÐÔÑÞÑëÑïÑöÒ«ÓÉÓÖÓ×ÓáÓäÓòÔÈÔíÔîÕºÕÄÕÇÕÏÕÒÖ÷Öû×¶×Ã×Ò×î ×ý×þØËØÛØêØìØñÙãÙæÚµÚ¶ÚÅÚÞÚâÚòÛ²Û³Û´ÛµÛ¶Û·Û¸Û¹ÛºÛ»Û¼Û½Û¾Û¿ÛÀÛÁÛÂÛÃÛÄÛÅÛÆ ÛÇÛÈÛÉÛÊÛËÛÌÛÍÛÎÛÏÛÐÛÑÛÒÛÓÛÔÛÕÛÖÛ×ÛØÛÙÛÚÛÛÛÜÛÝÛÞÛßÛàÛáÛâÛãÛäÛåÛæÛçÛèÛéÛê ÛëÛìÛíÛîÛïÛðÛñÛòÛóÛôÛõÛöÛ÷ÛøÛùÛúÛûÛüÛýÛþܡܢܣܤܥܦܧܨܩܪܫܬܭܮܯܰ ܱܴܷܸܹܻܼܾܲܳܵܶܺܽܿÜÀÜÁÜÂÜÃÜÄÜÅÜÆÜÇÜÈÜÉÜÊÜËÜÌÜÍÜÎÜÏÜÐÜÑÜÒÜÓÜÔ ÜÕÜÖÜ×ÜØÜÙÜÚÜÛÜÜÜÝÜÞÜßÜàÜáÜâÜãÜäÜåÜæÜçÜèÜéÜêÜëÜìÜíÜîÜïÜðÜñÜòÜóÜôÜõÜöÜ÷Üø ÜùÜúÜûÜüÜýÜþݡݢݣݤݥݦݧݨݩݪݫݬݭݮݯݰݱݲݳݴݵݶÝàÝôÞ¬ÞÄÞÈÞÖÞØÞã ÞûÞþߦ߶ßÍßÑßÞà£à¥à¦à®àÜáäáåáúáüâ¬âÆâùã©ãªãÂãðãüäÅäÌäÝäòäöå§å½åÊåÛæ®æÐæÑ æÒæÓæÔæÕçýè¥èÅèÒèÞèûé¢é´é¹é»éÁéáéòê¾êçêðêñë¥ë¦ëÏëÑëÝì¡ì¼ìÏìóìöìúí¯í¼í¾íà íáíåîÎîÚîóïËïìð±ð·ð¸ðÃðÎðÜðäðùñôò¢òÀò×òÙó©óªóÓô¢ $ ·ç 4 °ñ°û²¤²Î´¾´¿µ½¶Õ¶Ö·ç»Ñ»ð»ñ¼¡¿á¿æÁ¢Ã·ÅðÆðÍÂÍÝÍßÏÏÒÐÒþÓÖÔ¬ÖÈ×óØôÙ×ݷݸݹݺ ݻݼݽݾݿÝÀÝÁÝÂÝÃÝÄÞûàÕáªä½äçê¸í¬ïí $ »ß 4 ±ä²·³ú´ëµú¸æ¹Îº¡º³ºÐºÖ»ß»ã»ç»ó»õ¼Æ½Â¾Ä¾É¾Ú¾àÀ¬À¯À°ÀµÀ×ÁÁÁÂÃÂĽÆäɦÉÌÉÎÉÑ ÉêÉðÊâËï̹ÎðÎòÏÄТÒïÓ²ÓÜÓ÷Ô®ÔÎÕÁ×ÐÝ®ÝÅÝí޷ߧߨßÍßááÓáüâÄâÅãÒä§äÎæ×è¯èöé£ éÀéãééë¹ìÇìÖìæíáï§ï÷ð¢ðÎðþóÑóïóðóñóòóóóôóõóöó÷óøóùóúóû $ ÝÆ 4 »Ä»Ó»à¼ì½È½Þ¿£ËØÎãÎóÎõÎöÑØÝÆÝÇÝÈÝÉÝÊÝËÝÌÝÍÝÎÝÏÝÐÝÑÝÒÝÓÝÔÞ°é¦ñ¸ $ ÝÕ 4 ±Ö²¥³Ìµ£·Ò·â¸Ô¹ò»¦ÀßÃÃÃÊÅÂÅÃÅêÆÎÈÂÈÌÈ×ÈØË×ÌòÔÌÖþצØÀØÂÜÑÝÕÝÖÝ×ÝØßûáíáõ⤠âþåËæÊæáç½çìèÛëòíØîÆîÐïØñí $ Êì 4 ²ù³¢³¤´·´ÓÄÎÆÇÇßÈËÉÒÉîÊìËèÔËÕ¨ÙÅÝÙÝÚåûçõçöêÞëÒ $ Èæ 4 ³§³¬¹÷º«º®¼¯¿ÐÈßÈãÈæÈúÈûÈüÊÅÊÏÎÛÎïϼÐóѶզÕûÖÂÖÚÙâÛþÜ´ßÓßãâçã¾ä±äÄäãå£åø èÂèïëßì©ìÀìÁíÜï²ñëòÊóÆóÇóÈóÉóÊóËóÌóÍ $ ÌÓ 4 ³á»·»ÄÀõÁ¨Á©Á¬ÈøÌ°ÌÓÌ×ÚÖÜòÝÛÝÜÝÝÝÞÝßÝàÝáá¨ãêæÎñø $ »á 4 µÀº§ºª»á»æÄãÄìÄñÅ¡ÅÖֱ̱̲֮ÖãØ¾ÛÒÜ¡ÝâÞ£à²ã­åÎæ«æ¸æóçÓëºëÉòö $ Ýã 4 µ¤µ¥ØÁÝãÝäÝåÝæ $ ¿å 4 ±Ê±Ë±ÓµÐµßµáµå·£¹¯¹Ç¼¿½«½Í¿åÀôÀþÁ£ÂÙÂáÆ£Æ§Ç¢ÇíÇøÇúȡɨɹ˽ÍÍÎÐÎâÎìϽϿÑÖ ÒéÓâ×êØÍÙÎÚäܨܹÜëÝÜÝçÞ¾ÞÙÞîÞóÞùߡ߯ßÏßßâ¹âñã³äÔäÛæ÷é¼êäíóî¯ïÝð°ð±ðÌðáòá $ ²Ð 4 ±ê±ë±ì²®²Ð²ú³¥³âµä·­ºÒ»¸¼Þ½¥½©¾Æ¿¤¿æÀúÁçøúÃÌÅôÅõdzÇáÇëÇúȪÈÑʲÌÇÍÐÎÕÎû ϧҩÒÙÓ·ÓÂÓÛÔÊØ·ÙýܶܯÜÓÝßÞ×ßÕßÖß×ߨßÙßÚßÛßÜßÝßàßâßãßäßåßéßêßëßìßîßïßðßñ ßóßõßöß÷ßøßùßúßûßüßýßþà¡à¢à£à¤à¥à¦à¸à¿àòá¬áâáôæÖê¥ê¾ëËíøðãñµòô $ Û¿ 4 4944 °³°Ù°ó±¨±­±·±í±õ²©²ª³â³ã³ï³ûµ¶µùµû·§·®·°·ß¸ñ¹ã¹ô¹õºíºú»ª»­¼²¼Ñ¼×½Ï½î¾Á¾Ç ¾È¾Ì¾Ö¾øÀùÁ¦Á¯Á³ÁÉÂãÂäÂëíĻÄÕÄáÅÀÅèÆ¾ÆÆÆÐÆëǮDzdzȷÉÉÉïÉóʫˣ˱˲ËÏËîËð ̵̹ÌÄÌÛÍÒÎÚÎõϥϦÏÉÏÌÐÖѦѸÑÐÒ®ÓËÓßÓëÔÉÔÜÔßÕÁÕíֺקØÞØãÛ¿Üøß¼ßÃßÞßßßáßæ ßçßèßíßòßôßþàªàÔäÎåõæ±æ¶æ½æ¾çÃçâèôé©é¿éÅë÷ì§ìÙí¨îÕð®ðýò·ò¸ò¹òºò»ò¼ò½ò¾ò¿ òÀòÁòÂòÃòÄòÅòÆòÇòÈòÉòÊòËòÌòÍòÎòÏòÐòÑòÒòÓòÔòÕòÖò×òØòÙòÚòÛòÜòÝòÞòßòàòáòâòã òäòåòæòçòèòéòêòìòíòîòïòðòñòòòóòôòõòöò÷òøòùòúòûòüòýòþó¡ó¢ó£ó¤ó¥ó¦ó¨ó©óªó« ó¬ó­ó®ó¯ó°ó±ó²ó³ó´óµó¶ó·ó¸ó¹óºó»ó¼ó½ó¾ó¿óÀóÁóÂóØóÙóÚóÛóÜóÝóÞóßóàóáóâô¦ $ ÄÞ 4 °¦°ð°ü±ç²º´Ë·Ì·Üº¦º©ºÌºÎºÓºÚ¼ß¼õ¼ø¼ú½Ö½Ø¾©¾­¾Õ¾ßÂÅÃÈÄÞÆýɲÉâÍÉÍØÍÚЬÐÚѦ ÓðÔ¿ÔøÕµÕÕÕÛÖÄÙ´Û£ÛïÝËÞÆÞÓÞäÞíßëà§à¨à©àªàöâÙãÊãËãÓãõä·å·å½çÙèüéêë¬ëÚë÷ì° ìþí¥íæî¾ï£ð¬ðÆðÏðÐðëñ¯ó± $ Éã 4 ³Ó³ø¸ò¸ó¸ú¹»¹Ê¹Ù»­ÉàÉãÌìÐûÒûÚÃàÄâ©åöéàñ­ñÐòú $ à« 4 ¼¤¼¥Ç©Çý׽ڵ߾ßÐà«à¬ã©ë´íîó¿óÔ $ à­ 4 ±í¾©¾­¾Õ¾ß¾õ¿²ÁÔÁñÁõÅ¤ÇØËÌЪЫÑÃÑôÓëÔ±ÔãÔùÔýÕ£ÕçÕèÕêÕòײÞùà­à®à¯àÒæéçÃè· é¶êæì§ï¶ñç $ ÊÒ 4 ĭŤÇ×ÈÇÊÒà°à±æé $ ²ç 4 ±¹²ç²ê²í³´³µ´ûºã¼ÙÀüÒàëÃì®òí $ µí 4 ²´²ò³ª³ôµ¾µí·ï¸£¼ë¼ì¼î½Ö½ØÀ©À·À½ÁÚųÆÃʪËÈËÒÌ¶ÌÆÏ´ÐÍÒßרØèÙÚÛâÞ¬à²à³à´àµ à¶à·à¸à¹àºâÈãÐè¥éáê·ëÏî¯î°îóòü $ ¸¤ 4 ±Þ¸¤¸¥¹ö½Ã¾õÁ³Ç²Ç³ÉúËÊÌÛͲӭÔÚÖÖØÛàÇàÒàÔàÙàÛèªêàïêðÔñªò¶óá $ Îé 4 504B ²Òµ§µÀ··ºç»ã»ë¼Ò½Ë¾Í¿ÀÁµÁÄÄ÷ÅøÇ©ÇªÇÕʡʹÎéϽã«ã¬ã­ã¯ã°ã±ã²ã³ã´ãµã¶ã¸ã¹ãº òà $ ¸¼ 4 ¸¹¸¼¸¾¸¿ÃÜÃßΨÒìáÒâÁê«êÊîë $ ²¦ 4 °ü±¼±Í±ý²¢²¦²Ñ³ø³ù´Ä´áµ·µ¾µÁµÂµÄµå¶©¶¸¶È¶Ì¶×¶ê·²·¾¸½¸ê¹Ä¹ñº·º¹º¼ºÆ»¹¼¥¼ç ¼î½»½á¾Í¾Ü¿ðÀ»ÀòÁ¢Á§Á¯Á±Á´Á¶Á·ÁÑÂöãÃÙÃåÃìÃíÃðÃóħĨÄÁÄÂÄÏÄèÄíÄîÄòÄøÄúǤ Ç¥ÇÊÈÃÈÉÈüÈþÊËÊõ˾ËÍËÐÍÍÍÎÍÒÍÓÍÜÍýÍþΰÎÖÎÜÎèÏ®ÐÓÑàÓ¯ÓÍÕªÕïÕðÕôÖÍÖÔÖù׬×Ó ×ùصٰÙíÚ¥Û§Û¾ÛÚÛìÛúÜÌÜëÝêÞÔߡ߭ßÁßÇßêßûàºàÝàÞàßàààáàâàãàäàåàæàçàèàéàêàë àìàíàîàïàðàñàòàóàôàõàöà÷àøàùàúàûàüàýàþáÙáÚáøáýâµâøã¦ãþä¡ä¥ä»åÓæµæ¶æ·æ¸æ¹ æºæ»æ¼æ½æ¾æ¿æÀæÁæåçßéÅéûêºêÓêÔë»ëÔí¢í®í¿í÷î£î»îËîôï©ïÄïàïòð¦ð½ðÆðçòÓòèóÇ ô¤ $ ¸µ 4 ±¡´°´Ð´á´å´è¸µÕäâªã·çëè×ïö $ °æ 4 °Ï°Û°æ´¨¶³¹«¹Á¹ÌÇúʵ˽ÍãЧá¹ã× $ ÌÞ 4 °×¹ú¹û»ò¼â½ý¾ìÁÚĪIJÅòƢǬʪʭÌÞÍÈÍÌÍÛÐøÑæÑñÒ²ÔÇ×äØ»ÚæÚøÝÏßìà´ãôåµç¶éîê£ êéë¼óÕ $ Ìà 4 ·Î½¢½³ÌàÏÉÒÍÕøà»áÏæï $ ¸Þ 4 ¸ãÓªÓýÕèÚíà³êËó÷ $ ÆÖ 4 ½ãÆÕÆÖÆÙÆÜÆßá¦î·ñ« $ Çà 4 ¿§ÇÃÇÄÇÇÇÊÇÎÈî͸Öâ׫إÛéÞöà¨áþãöæÒèÝî½ $ ±» 5 ±»¸É¸Ì¸Ñ¸ÖÉ»ÒíÛ×á¡á¢ë¸ $ ´¤ 5 ´¤¹ùÉÓá£á¤á¥á¦á§á¨á©áªá«á¬á­á®á¯á°á±á² $ ´Å 5 ´ª´®´»´Å´ð´ú´ü´ýµ½º°»Û¿Ó¶ùżÇÞÇàÇáÈöË¿ËÅ̧ÒÑÓÝÔ°ÕöÖÈ×£ØÜ٢ٺÙùÚÐÛ®Û÷Ü» Þ¿á³áÑâôã²ãÅä¯ä½äÙäóéÔî¸îÇîéï¬ñÖóÊ $ À¸ 5 ±ù»§»ºÀ«À­À±À·À¸ÀÃδÖ××ÈØ¹Ú×àÏá´ãããùç© $ ÍÑ 5 ±º²³³÷ÄËÄÌÈõÈ÷ÉòÊÞÊßÊàÊáÊãÊäÊåͰÍÃÍÇÍÑÍÙÎÄϹÐÜÒµÓ®Ô¾ØÊØÙØàáµäõæýçÔéìëÖíù ðæñ°òÄòÇóå $ ÅÄ 5 °³°¾°Ã°Ú°Û°ß°â°ó±·±é±ù²¡²£²«²Ì²Û²Ý²è²ô³¡³¦³½³Ä³à³â³ï³û´Òµ¦µ´µµµùµû¶°¶ò¶ö ¶÷¶ø¶ù·¨·®·Ã·Í·ß¸ñ¹Ã¹Õ¹ùº¥º²ºÙºæºçºú»ª»­»×¼²¼´¼Å½¯½¹½Ã¾ö¿­¿³¿½¿À¿ÂÀ¦ÀæÀì ÀïÁ¯ÁµÁ¹Á¾ÁÉÁÎÁØÁÜÁÞÁãÁýÁþ£µÂÍÂ×ÂäÂìÃ­Ã±Ã½ÃÆÃËÃÜÃßÃèÃêĪĮÄÄÄÑÄÝÅ«ÅÄÅÅ ÅàÅìÅïÆÏÆÒÆìÆíÇ­ÇÅÇ×ÇèÇîÇöÇûȧȨȪȫÈÊÈÍÈÖÈÙÈÜÈêÈûɡɣɭɯÉÁÉÄÉÅÉÉÉÙÉÚÉß ÉæÉûÉýÊ¡Ê«Ê³ÊµÊØÊÜÊæÊíËÝËâËîËð̨̥ÌýͦͮͯͳÍãÍæÍçÍëÍóάίαεθκÎÚÎÜÎÝ ÎßÎûÎýϣϥϦÏÌÐìÐúÐüѣѬѴÑÃÑÉÑöÒ«Ò¯Ò´Ò¶ÒºÒîÒñÓ«ÓÀÓÅÓçÓéÓêÓóÓõÔÝÔÞÔîÕ²Õ³ Õ¹Õ¿ÕÉÕËÕÌÕÎÕéÕóÖ­Ö¸ÖÊÖÌÖÛעת׼×ÃØÃØÉØß٥ٻÙóÚ§Ú²ÚÂÚÙÚÚÛ¥ÜÇÜÔÜØÜæÜîݪÝÑ Þ¡ÞÏÞð߯߱ßÄßÉßÎßÑßíßîßøà¤àÀàÐàÙàåàóá¶á·á¸á¹áºá»á¼á½á¾á¿áÀáÁáÂáÃáÄáÅáÆáÇ áÈáÉáÊáãáîáðáöâºâÎâèâêã§ãµã¸ã¼ãÍäÊäÐäÚäúå¾åàåææ£æÌæðæôç£ç¨ç®ç¸çÆçÏçØçâçã èßèùé¨é©é²é¹é¿éÃéÅéØéÚéõéöê¶ê»êçêëêûêüêýëììÒìöìûìýí«í·íÏíÕíÛíâíìî²îÂîØîï ï¡ïÀïÆïÊïÌïÎïÞïñð©ðÅðùðûðþñ¡ñ¹ñºñÕñàñæñçñïò°ò±ò²ò³ò´òµò¶ò·ò¸ò¹òºò»ò¼ò½ò¾ ò¿òÀòÁòÂòÃòÄòÅòÆòÇòÈòÉòÊòËòÌòÍòÎòÏòÐòÑòÒòÓòÔòÕòÖò×òØòÙòÚòÛòÜòÝòÞòßòàòáòâ òãòäòåòæòçòèòéó©ó«ó½óÔóìóí $ É¥ 5 µ¼µ¿¶Å½¾½Ä¾¹¾ûÀ§ÀûÁ¿ÁÁÁÂÁÃÂéÂêþÃÁÄéÄêÄóÄöɥ̻ÍäТÓéÓêÔæÕæÖØ×Ï×ÐØÑÙÝÜâá÷ ã¨æÞæàæñèöëÜí§óÑ $ áË 5 4D46 ±Ö´âº¯¼¦¼»¼À¾É¿¾ÁéÃÔÄËÅ÷ÈèÉÂÊÊÌþΡÎÅáËáÌáÍáÎáÏáÐáÑáÒáÓáÔáÕáÖá×áØáÙáÚáÛáÜ áÝáÞáßáàáááâáãáäáåáæáçáèáéáêáëáìáíáîáïáðáñáòáóáôáõáöá÷áøáùáúáûáüáýáþâ¡çÉ ìÛ $ ⢠5 °ªº×ºÝ»¡»¤À¡ÀÔÅÐÅõƪÇÑȮȯȰÖÓצÙäÙûÜôáëáóâ¢â£â¤ã¤èñëúí¤ $ Çò 5 ³§³¬³Ú³õ³ü´å´ê¶Ó·ã¸¶¸»¹Ä¹ý»©½¬½É½Ì¾ñÀ¢ÀôÀþÁ£ÅªÅçÇìÇïÇðÇñÇòÇóÇôÇõÇ÷ȫɫɴ ÊËËÆËÔÌÉÌÊÍ¥ÐÑÐóÑàÖ¯Öç×Ó×Õ×æØµØÅØÒØþÙâÚ¶ÛôܴܹÜÛÜßÜüݫݬÞÔÞÙßêà£àáá©â¥â¦ â§â¨â©âªâ«â¬â­ãªãáãîä»äêåÄèÝèòé»éûêÚêùëªëßì½íàî£î³ï©ïµïËïùð¦ò°òÓ $ Èé 5 ¿üÇÈÇËÇÌÈàÈäÈèÈéÈïÈöÔ³ààâ®â¯â°â±â²âîèÊììïøðÛóé $ »® 5 °î±Î±×±ö²¹³¸´Æ´Ï´Õ·ì»®½°À¹ÅðÇÖȧÈ×ËßÌÁÌÒÌÔÍôÍõÐÖѰÔÜռת×õزܳÜÅݣݹީÞå ßÎßþà¤áéâ³â´âµâ¶â·â¸â¹âºâ»â¼ä×åÐåñç¬çÆçãèäé¥é¾éÃêÃêÈêÉêòë¢ëêëëëíìÙíâîÏîÑ ï­ïÎïîð§ñ¡ñ»ñæòÛòÜòéó²óÅ $ ÌÜ 5 °¹±Ã±Ý³­³î´Ç´ãµ¹µÃ¶æ¶ñ·ü¸©¸«ºº»»»¼¼ó½Ö½Û½Ý½â½õ½û¾Å¾Ê¾ý¿¢¿£¿µ¿¿¿çÁ»ÁÀÁÄÁÅ ÁÆÁÈÁËÁÛÁêÁúÃÍÃÖÃåįľÄÃŤŶſƷÆÄÆÛÈ¢ÈýÊÍ˹ËÁËÓËê̲ÌÕÌÜÎÆÐÙÒ¨ÒÕÒòÓÑÔëÕ» ÕÎÕÒÖËÖÜÖû×É×Ü×üØÆØöÚ¼ÛÏÝáÝüÞ¥ÞÖÞÝß½à¬àðàûáÈáÊáÔâ¡â½â¾â¿âÀâÁâÂâÃâÄâÅâÆâÇ âÈâÉâÊâËâÌâÍâÎâÏâÐâÑâÒâÓâÔâÕâÖâ×âØâÙâÚâÛâÜâÝâÞâßâàâáâéãÆåÍåÑåûæÔçóçüè¶èÀ é×êÍëÇï¯ï×ïêð³ðÔñ§ñÄñÅó¶ó·óíóòô¢ $ Ì· 5 ³ýµÌ½À̷̸̳ÌîЮаØìÙ³ÙæÛÁܾââäòé±êÝëùìúðäó¯ó» $ Ìð 5 °§°å´«´¿´Ã´Ñµ¼µ¿¶º¶Å¶ë¸¢¸ô¸õ¹¢¼»¼À²ûÃÎÃÒÃÔÃØÅ³Å´ÆåÇêÐØÓÕÔ¼ÖØÜ©Ý·àÍá÷âã âäã¨ãïãýä¼äÈæÊæÝæçè÷ìùîÐï·ðµ $ ÀÐ 5 °ë±°³·³Î´äµÎ¸¦¸§¸ë¹Å¹Üº½ºÕºÖºì¼§¾Ë¾ÌÀÐÀÙÁÃÂóÄÓÄöÅÊÅÖÅ×ÅæÇËÈ£ÈØÈêÊËˤËáβ ÏÒÚÑâåâæâçâèâéâêâëâìâíâîâïâðâñâòâóâôâõâöâ÷âøâùâúâûâüâýâþã¡ã¢ã£ã¤ã¥ã¦ã§ã¨ ã©ãªêÅêÆìêîñò» $ ¼¨ 5 °Ó°Ö±¶±Ð´¾µú¶Ø¶ßº×ºØºÝ»¡»¤¼¨½¡¿òÁîÆàÆèɸɺɻɼÉÇ;ÑÛÑ÷ÓáÕÅØØÜ£ÞÊßñã®ãÉäð åÝèñí©ð±ñ¨ñ©ñßòä $ ã» 5 ¶Ù¶ò¶ö¶÷¶ø¶ù¸é¾ü°ÍþÎ¥Ò¯ÖÊڢߢáöâêã»ã¼ãæäáäúèßé¹éÚíæî²òµó×óú $ ²Ó 5 °¬°Ñ°Ü°à°ð±Ï²º²Ê²Ó²Ô³¾³Ï³âµ¨µ©µÐ¶Ý·­·Î¹Æ¹á¹ò»ä¼Ð¼ï½¥½¨½©½ö½ù½ü¾Î¾Ð¾è¾÷¿º ¿ÁÀÇÀÑÁÅÁÉÁÕÃÕÃáÄøÆ©ÆÅÇéÇëÈëÉ£ÉÃÊæËÔÌ­Í¶ÍøÍüΡÎÇÏÁÏÂÐÞÓ»ÓÂÖÛשئةطØîܶ Þ×à´àµàºá¬áßáûâäã½ã¾ã¿ãÀãÁãÂãÃãÄãÅãÆãÇãÈãÊãËãÌãÍãÎãÏãÐãÑãÒãÓãÔãÕä°åµæ¼çË è¼è½èÔèíé³é¼é¿éíéøíûîÈîøðãðøñÆò²òÅóËô¥ $ ·ê 5 ±®³öµæµç¶õ·¢·¦·ê¹µ¹ÐºñºõÀàÀüÁëÃâÆÍÍÆÍÏÍÐÍÒÍÖÐåÓ³ÛýÜ×ãÎãÖã×ãØãÙãÚãÛãÜãÝãÞ ãßãàãáãâãããäãåãæä³ç´î´ï°òò $ Ω 5 °´°Å°Ç°Ì°Õ±¤²¯²±²²²»³Þ´éµ£µã¶¥¶­¶À¶Á¸Á¸ö¹¬ºË»§»º¼­¼±¼¹¼Ã½±½×¾¦¾ª¾´¾À¾Ï¾â ¾ã¿¥¿¦¿·¿Å¿Æ¿ÉÀÜÂìÂíÂøÃ¨Ã¼ÃäÃþÄëÄùÄüÄýŦŨũŬŭƴƵƷƸÇÜÇÝÇåÇæÈ¸ÈòɧÉô ÊÈÊÉÊÊÊîÊó˵˶Ì÷ÍâΩγεζ϶ϸÐôѪѿÑüÑþÒ¡ÓÁÓÆÓàÓþÔâÔôÕÊÖ¿ÖÑÖðÖñØäÙÇÙõÚ¤ Ú¥Ú¦ÚÕÛ°ÛÖܦܼÜÖÜÙÜõÜúݡݢݱÝÍÞèÞñ߮߷ßäßõßýàøàúàüá¢á²áïâÐâðâüãçãèãéãêãë ãìãíãîãïãðãñãòäÆåÒåèåðæÄç¯ç¾çÞçþè®èÜèçèðé­é°éÄê¯êþë¥ëÞëîëóì¢ì£ìÓí²íãíäíå íæíçíýîÙïòïóð¯ðÀðÈðïðððññ¥ñãòãó¹óßóü $ ½é 5 5C33 °Á²¨³ì¶Þ¶ß¸Ó½é¿þµÈïÊ£Êä͵ÍçΣêÎêÒêÓêÔêÕêÖê×êØêÙêÚêÛêÜêßêàêáêâêåêèêéêëêì êíêîêïêðêòêóêôêõêöêùêúêûêüêýë¡ë¢ë£ë¤ë¥ë¦ë§ð· $ À¤ 5 ºûÀ¤ÃýĭijĵÌãÍÕÜÄÝõÞØå¨åÊò× $ µð 5 µðµñµôµ÷¶ëßÙãÀçðîê $ ºý 5 ºô»¹ÊÐÊÓÊÔÊ×ÎÑÎØÏÀÐÕÑèÖÆÖÇ٨ܲÞÍäàåÅæÉéþêïëæìéïÐñÙóþ $ Çã 5 5474 ±µ±·²õ²û´Ä´Ô·Ó·ûºá¼ß½ì½ð½ò¿¤ÂøÂùÃÖİÆÁÇ«ÇÍÇãȳÈíÊÎËý̴̡̢ÍåÐòÑ³ÒØÓæÓðÓö Ô¨ÔÎÔÕÕîÖ¤Öï׬׭ØäØçØíÚ¤Ú´ÛØÜÁݦ߷߿àÖà×àØá°âÐâáåÜåèåéæ©æªæ«æ¬æ­æ®æ¯æ°æ± æ²æ³æ´æäæåçºé§éªéÆéÇéæë¤ëµë½ëÊëÝëôì£ìÎí±î¶îÙï¸ïÂïÈïÕðéñ½ñãññò£ò¥òÙòÝòæóª $ ÃÝ 6 ²Õ³Þ´È´É´Êµè¶Ú¶ûºöºû»»»¼¼³¼Ä¾Ð¿ÚÀÒÀáÀýÂèýÃÛÃÝÃÞÅ«ÅùÅúÅûÆÆÇóȢȤȦȵÈÏÈö É®ÉäÊÏÊÓÊí̧Îü϶ÒÕÓãÚ±ãóãôãõãöã÷ãøãùãúãûãüãýãþä¡ä¢ä£ä¤ä¥ä¦ä§ä¨ä©äªä«ä¬ä­ ä®ä¯ä°ä±ä²ä³ä´äµä¶ä·ä¸ä¹äºä»ä¼ä½ä¾ä¿äÀäÁäÂäÃäÄäÅäÆäÇäÈäÉäÊäËäÌäÍäÎäÏäÐäÑ äÒäÓäÔäÕäÖä×äØäÙäÚäÛäÜäÝäÞäßäàäá $ ÊÆ 6 °À±ü²¨³ú´¡µÅµÆµÇ¶Î·©·Ñ¸Ò¹Ç¹í»¸»õ¼½¼È¼á½Í¾Ñ¿³¿è¿ôÀºÁ¸ÁÆÁìÃÇÅüÆæÇ´ÇÅÇôȨÈÍ ÈÐÈÖÈÙÊ´ÊµÊÆËÝ̰ÌÂÌâÌùÍèÍéγÎÁÎÈÎÕÎÙÎÚÎÛÎàÎðÎùϰÓâÓ÷ÔÔÔüÕý׳״ØÁØåÚÙÚÚÛø ÝæÞ½ß¯ß´ßÄßøßúã¥ãæäØäâäãäääåäæäçäèäéäêäëäìäíäîäïäðäñäòäóäôäõäöä÷äøäùäúäû äüåææÌç¸é«ê©ê¶îÃîØîÙïÀó½óÈóðóñóòóóóõóöó÷óøóùóúóû $ »å 6 °¼°½°Ý°Þ±ï³¨´Ëµªµ«µéµêµë¶Û·¥·«·¸·Ï·Ð·Ñ·Ò·é·ë·ü¸¨¸¾¹È¹É¹Ê¹Ëº°ºÙº÷»¼»å»æ»ç ¼Ê¼Ó¼ú½ª½«½Ä½Ì½ã½ï¾Ò¿¥¿ÂÀÓÀäÀþÁ¡Á¶ÁÇÁÈÁíÁî³¹½þÄÖÄÝÄùÅ»ÅýÆìǼÇûÈËÈìɳ ʶÊÔË¥ËÂËúÌÊÌËÌÖÌæÌóÍåÍæÍíÎÐÎßÎýÖÝ×³×¾ØøÚ»ÚÎݩݳßÔáðäÜäýäþå¡å¢å£å¤å¥å¦å§ å¨å©åªå«å¬å­å®å¯å°å±å²å³å´åµå¶å·å¸å¹åºå»å¼å½å¾å¿åÀåÁåÂåÃåÄåÅåÆåÇåÈåÉåÊåË åÌåÍåÎåÏåÐåÑåÒåÓåÔåÕåÖå×åØåÙåÚåÛåÜåÝåÞåßåàåáåâåãåäåååæåçåèåéåêåëåìåíåîåï åðåñåòåóåôåõåöå÷åøåùåúåûåüæ°çÈèàé¾éÆéÇêÇî¶ïÕïÖñàòÁó $ ´Ì 6 ´ÌÅñƫƺÍÉÍØÍÚÓ²Õï×ÔÙÚÙÛÙêÚÔݵàöãßåÃåýåþæ¡æ¢æ£æ¤æ¥ëïó¸ô£ô¤ $ ÍÓ 6 µ·µ¾µÁµÂµÄ¶È·²º·º¹º¼¾Í¾ÜÁ¢Á¯Á±Á¶Á·ÁÑãÃÙÃåÈþËÍËÐÍÍÍÎÍÒÍÓÍÜÐÓÓÍÕªÕôÖÍÖÔÖù ×ùÙíÚ¥Û§ÜÌÜëÜ÷ß¡ßÁßÇàºàùáÚáøáýâµâøã¦åÓæµæ¶æ·æ¸æ¹æºæ»æ¼æ½æ¾æ¿æÀæÁæÆçßéÅë» í¢í®í¿ïòðçòè $ ±© 6 ±©²§´Í´å½¬¿éÀ¢ÀðÀúɵËÝÍâÍãÒ­ÕìסØÒÙ¤ÙËÙòÙ÷ÛÛÜÐÜÜÝÀßËåÙæÂæÃæÄæÅæÆæÇæÈæÉæÊ æËç±èãèúêùîÒï¹ó° $ ¼© 6 ¼©¼ô¼û¿ðÂÑüÄÜǨÓÃÕÞØ¸ØïÙåÞÚàÎäèäùåìçÂêÀë¡íß $ æÐ 6 ¶È¹ÌÀÒÌ×æÐæÑæÒæÓæÔæÕé´é¹ëÑ $ ¼ª 6 ±Â´º´à¸·ºÇ»£¼ª¼è¼ñ½´¿¦¿ÛÀ»ÀÝÁÑÁïÂûÿÃÑÄ°ÉøÊ¹ÌìÌíͬÎþϸѷÓîÓñÕ·Õ¸ÖÞ׬׭׹ Ø÷ÙØÙèÙðÜ·Ü¿ÜíÜðàââ×åÉæÖæ×æØæÙæÚæÛæÜæÝæÞæßæàæáæâæãæäæåêºíºíÌíÍïÒð¥ñ£ñåòþ $ ææ 6 ³Ä·ò·ú¸°½ñÄÅȥɮÍÇΧΪÓâÔÜØÙÚìßþáÁâ¸äÔæææçæèæéç§é« $ Æù 6 ÆùÉåçÈ $ ¼« 6 ±Ý²Æ²É·Æ¼«¼ó½­Â©Æ³Æ»É¡Í«ÒÏÓÌÓÎÓçÓïÕÎÖüØþÙ¡ßïî´îµñÄñÅóí $ »ê 6 °®°¯²°»ê¼¼Ã×ÃâÅÝÅþÉÈÌÅÒúÔ¹ÖêÚ¬ÛßܱÜÃåÌæÏç´çµçÊçËé·íÉò÷óù $ ±± 6 ±±³ã¶½ÁÍÍÁÐäÑ»ÑÐÒ×Ó¸ÔÌÕÜÕíÖÙÙÓÙçÙøÚ©ÚªÝ½ÝÃÞíßÃßûàÉàÚâ¹âËãËãâç«çÄçÌçÍçÎçÏ çÐçÑèÐë´ëÛëçì¥ì¿í¥î×ïÍïØïåïüð¿ðëñ²ò§ò«òÉó¿óÌóÔóëóì $ Àå 6 ³ç³è·Æ¼­ÀåżȦÍðÏÃаÑé×÷ØÜæÚçÒçÓçÔéÝîõïèïé $ Á¤ 6 ·æ½Ö½ØÁ¤ÉñËñÎÕÎÙÎÚÎÛÎùÛÜâùèüîà $ ½® 6 ´Ï¸¿¹Ò½®Á¥ÂÉÄúÇõÈÂÈÌÈ×ÈØÜÑáíçÕçÖç×çØçÙçÚçÛçÜçÝçÞçßçàçáçâçãçä $ º± 6 ±µ±¹±Â³´³µ´ã´û¶ª¶¿¶Á¶Â¶ä¶û¸Âº¦º¨º©º¬º¯º±»ô¼ßÀá¨ÂÜÂà̼ÎÉϭϯϱϲϵϺÓÄÓì ÓðÔ·ÖýÖþ×ÌÚúÛ­ÞôàÃàæàçäîçåè¾ê§êôìðìôòèóõ $ ¿§ 6 ±ð¿§Àäçæ $ éÈ 6 ±³µºµÔµõ¶ó·à¸×È§É·ÉæÎ¸ÎºÑÝÔÒת٦ڡÝÁßÎà¤àÛàèáêâºæ¡çÆçãéÃéÈéÊéËéÌêõëâíâîª î±îÓïÌïÎñ¡ñÃñæòÏòé $ Ãî 6 °º²Ü²ã²ë³ª³¿³ÂµÂ¶¯·Ö»½¼Ø¿¤¿¨¿ªÀæÁßÁûÂùÂýÃÁÃØÃîijÆÈÆúÇÂÇèȺÈÚÉÈÉöÉ÷˪Ëú̪ Í»ÍæÏ¹ÓÐÓöÕó֤تØÕÙöÜçÜêà×á¯âáã¢ã»ãÏåÚèóéÍéÎéÏéÐéÑéÒéÓéÔéÕéÖé×éØéÙéÚéÛéÜ éÝéÞéßéàéáéâéãéäéåéæéçéèéééêéëéìéíéîéïéðéñéòéóéôéõéöé÷éøéùéúéûéüéýéþê¡ê¢ ê£ê¤ê¥ê¦ê§ê¨ê©êªê«ê¬ê­ê®ê¯ê°ê±ê²ê³ê´êµê¶ê·ê¸ê¹êºê»ê¼ê½ê¾ê¿êÀêÁêÂêÃêÄêÅêÆ êÇêöë½ëåí±íÛñÛññóú $ ·ì 6 ·ì½°×õÞ©êÈêÉ $ ¹Ô 6 ±Ò³¹·å¹Ô¹Õ½Ñ¾×ӦԸشާå®êÊêËêÌêÍêâí×îòòý $ °á 6 °¥°Í°Ú°á±à±î±ò±ó²õ²û´Ä´Ô·¨·¶ºÀºÛ½±¾Ø¾í¾î¾÷¾ù¾ú¿«¿°¿±¿¶¿Ì¿êÀ½ÁÓÁõÂÞäÃïŸ ǹǻǿÇÀɶɽ˫̬΢ÎöÔ¨ÔÕÔáÕÐÕâÕîØçÚ·Û¨ÜãÞøàÐá¾âúãºãÕäÂäÃç°êÏêÐêÑêÝêÞêãêä êæêçêêêñê÷êøêþìªí×íÙîÖïÂñåñèò¥ó¬ $ À¾ 6 °«°À±½±ì²Á·ª¹ø»¯À´À¾Á«Ç¶ÇÆÉ¸ÉºÉ»É¼Ê¤Í×ѢѫÑ÷Ó¢ÔÅÕÅØËØØÜÓÞ¯ÞÐ߬á«äÅäÒåÝèþ ë¨ë©ëªë«ëýìËíòï½ðèñ¨ñ©ñßòä $ ¸« 7 ±®³É³Ð´²´Ñµ¬¸§¸«¸½»ë¿ÆÄÐÇÁÍ÷Ð×ÙøÚ°Ý´Ý¶äªåüéäë¥ë¬ë­ë®ë¯ë°ë±ë²ë³ë´ëµë¶ë·ðÓ $ ³Ñ 7 ²ò³ª³Ñ¿¨ÓÜԽרØèÚÏÛäÜàê·ë¸ë¹ëºë»ë¼ë½î°ó£ $ ¸À 7 °â±Ó±Ú²Ý³º´Òµ­µÃµÄµÍµö¶à·±·×·Ø·Ù·í¸¬¸À¸Á¸Ø¸ì¸í¸î¹Ö¹öº¾»¾»ì»í»î»ï»ð¼±¼Õ½² ½ó½ô¾Ù¾Ú¾Û¾Ü¾ù¿®¿Ç¿Ö¿ÛÀ¿ÀÀÀÁÀßÀâÁ§ÁÊÂÂÂ÷ÂúïÃÂÃÌÃðĴĵÄûÄüƤƥÆÉÆæÇ§Ççȳ ÈðɵɾÉèˬËÅÌÙÌõ͡ͶÍÀÍØÎÊÏÀÏÃÏÍÒÙÖÖÖÝ×¾ØëØøÙ¿Ú»ÚÎÜùݳÞ÷߸ßÔâÝäÓæ¯æÁç¼çÈ é½ê¹êÇë¾ë¿ëÀëÁëÂëÃëÄëÅëÆëÇëÈëÉëÊëËëÌëÍëÎëÏëÐëÑëÒëÓëÔëÕëÖë×ëØëÙëÚëÛëÜëÝëÞ ëßëàëáëâëãëäëåëæëçëèëéëêëëëìëíëîëïëðëñëòëóëôëõëöë÷ëøëùëúëûëüëýëþì¡ì¢ì£ì¤ ì¥ì¦ì§ì¨ì©ìªì«ì¬ì­ìØíçïÖðËó $ ë 7 Â¯Ã«È£ÍµÍÆÍÏÍÐÍÖÍÝÍßÍáÒÊÖ»ì®ì¯ì°íúî¼ï° $ Ʀ 7 ±ð³®³»´î´ò¸Ý¼ù¿ß¿àÀ¡Ã»ÅÐÅõÅ÷ƦƪƬƮ˭ËÄÑ¥ÑóÓÙÔåÖÓפ×ÅØÚØôÙ¦ÜÈÜïÜôÝÐß°ßô â­âÜâöã¤ã¶ã¹çæèºë±ëúì±ì²ì³ì´í½îÔïÅñ¾ñóò¬òåòç $ ìµ 7 ±ï²Ç²È²Ôµ£·à¹è¹ê¹ë¾Ý¿ëÁüÂâÂïÂöÃàÃõÄÆÄÍÆËÆÚÌØÐ®ÑÏÓ¼×ÁÙáڡۤۯܽݨݩÞçßÂßü à¡âÞãää¿äôçáêÂìµì¶ì·î¬î±îÓð« $ ì¸ 7 º¦º©É¿ËÆé¸ì¸ì¹ìºì»ì¼ì½ì¾ì¿ìÀìÁìÂðÊ $ ³­ 7 °ä°÷±¤±´±Å±Ï±Ð²ß²ì³­³Û³Ü´·´Ó´æ´è´é´êµ®·¹·Û¸­¸²¸Ü¹×¹Ø¹àº¢º¿ºÄºâ»¾»¿»ñ»ò¼Á ½ç½þ¾Þ¿Ü¿üÀ¥ÀÑÀÓÀÕÀØÀÙÁ¨Â£Â¦Â§Â¬Â±Â»ÂßÂêÃùĺÄÂÄÒÄÙÄåÄçÄ÷ŽſÅÒÆ¬ÆÕÆÜÆøÇÔ ÇâÇãÇåÈÎÈÑÈÒÈñÉÎÉÏÉÐÉÑÉéÉêʮʯʰÊÇËÇËËÌãÍÂÍêÎÎÎàÎæÏ¨ÏÅѫҪҼÒÎÓÔÓíÓõÔ¤ÕÍ ÕÏÕéÕïÕðÕþÖÜÖìÖúؼØñÚ¯Ú¹ÜÊÜîݤݧݯÝÎÝÒÞóß¹ßÀßÅßðà±à¹àÜàôàýáúáûâ¡âØâóã¡ãå äÇäÏäÝäêåïåòåóåôåöå÷æ¢ç·é±éÀéÁë£ë¶ì¦ì­ìÃìÄìÅìÆìÇìÈìÉìÊìËìÌìÍìÎìÏìÐìÑìÒìÓ ìÔìÕìÖì×ìØìÙìÚìÛìÜìÝìÞíµî¦ïÓïÔð¨ðòðóðôðõðöð÷ðøðùðúðûðüðýðþñ¡ñ¢ñ£ñ¿ò¤ò¦ó¦ óÀóâô¢ $ ÀÖ 7 ³Å³Ò¼ÏÀÖÀ×Ôõ׿ê®ìßìàíñ $ Áö 7 ±Ûµ¯¼ñ¿öÁöĶÅÌÉëâÌåÔìáìâìãìäìõ $ ­ 7 µ÷¸Ùºí½³À×ÀØÁ©Â¥ÂªÂ­Ä·ÄýƧÉùÌöÍÙϩϪìåìæìçìèìéìêìëìììíìîìïìðìñìòìóìôìõìö ì÷ìøìùìúìûìüìýìþí¡í¢í£í¤í¥í¦í§í¨í©íªí«í¬í­í®í¯í°í±í²í³í´íµí¶í·í¸í¹íºóø $ ¿È 7 µç¶í¼Í¼Õ¿Èí»í¼í½í¾í¿íÀíÁóÍ $ ¼Ö 7 ±¿³Ó³í´øµ°µ±·¥·³·Ò·Ú·â¸®¸Ë¹ìºÜ»Â»Ã¼´¼Ö½´¿ØÁ²Å²Å¾ÆðÇÚÈÏÊåÍ¢ÍÁÎØÎúϡϢÐàÓØ ÓóÔÏÖÐØÏØÐÚôÚöÜáÞÕàíâ°â±åáèØêîëäíÂíÃíÄíÅíÆíÇíÈíÉíÊíËíÌíÍíÎíÏíÐíÑíÒíÓíÔíÕ íÖí×íØíÙíÚíÛíÜíÝíÞíßíàíáíâï´ïºó® $ ¿É 7 °´¸ö¹¬ºË¼­¼¹¿·¿Å¿Æ¿ÉÂøÈ¸ÈòÊÈÊÉÊÊÊóÑüÑþÒ¡ÓþÕÊØäÙõڤڥڦݡݢݱÞèß·àúá¢á²âÐ åÒåèåðç¾é­é°ê¯êþì¢ì£ìÓí²íãíäíåíæíçíýîÙïòïóðÈñãó¹ $ ä 7 ¿«¿°¿±¿¶¿ÌÃ¤ÆøÇ»Ç¿ÇÀѯÕâÚïÞéåÕæÕæüèìéçêó $ ÆÓ 7 ¸ï¹Ú¹ó»À¼à¼ò½¶½·½¹½å½æ¾ß¾ú¿Ý¿ìÀúÂéîÃñÅ¢ÆÓÆêÇÛȰËðͱͲÍïÔÓÔûÚ³é¤í­í¶î¤ î¥îÄîÅîÆîÇîÈîÉîÊîËîÌîÍîÎîÏîÐîÑîÒîÓîÔîÕîÖî×òÕ $ ÈÐ 7 ¼½¼á¿³ÇÅȨÈÍÈÐÈÖÈÙËÝÚÙÚÚ߯ßÄßøãæåææÌç¸ê©ê¶îØîÙïÀó½ $ Τ 7 ³½¸ñ¹õ¼ï¼ð½Å¾×¾á¾âÁ¸ÂãìŻơưƴƵƷƸËÏËäËéÌÛÌîÍý΢ΣΤÎÈÎÌÎÒÐÝѪѸÔÐÔß Öñ×¥Üõß®àÔá­ãòåõçÞì¾ìûîÚðÊóØóÙóÚóÛóÜóÝóÞóßóàóáóâ $ ¿Ã 7 ²é³ß³ï´Æ´Ï´Õ¶Û·ø¸­¿Ã¿Õ¡¢èɱÍôÍõÍ÷Î×ѰÕáØÌÚ°Ý£Ý´ßæßçä×åñåüçÇçÉé¶ë¢ëµì³ ìÛï³ïÈðõóÅ $ ¶â 8 ±Ô±ô³»³Ã³ø³ù´Õµø¶À¶Ó¶Ö¶â¶ä¶ü·­¸°¸Ú¹Û¹Ýº¿ºø»¬¼â½Æ½û¾à¾á¾â¾û¿Ë¿í¿îÁ¬Á­ÁùÂø ÃÃÃòĸÄÃÄÊÄ×ÄàţŭŴÅÕÆªÆ¼ÆßÆéÈ­ÉÅÉÆÊß˯ËÈËÕÌÃÌúέÎëϣϿÓèÖÀÞÀßÈîÛîÜîÝîÞ îßîàîáîâîãîäîåîæîçîèîéîêîëîìîíîîîïîðîñîòîóîôîõîöî÷îøîùîúîûîüîýîþï¡ï¢ï£ï¤ ï¥ï¦ï§ï¨ï©ïªï«ï¬ï­ï®ï¯ï°ï±ï²ï³ï´ïµï¶ï·ï¸ï¹ïºï»ï¼ï½ï¾ï¿ïÀïÁïÂïÃïÄïÅïÆïÇïÈ ïÉïÊïËïÌïÍïÎïÏïÐïÑïÒïÓïÔïÕïÖï×ïØ $ Ĺ 8 ĢĥıĹÅåȱɦذÞýæèèÉñõñöñ÷ñøñùñúñûñüñýñþò¡ò¢ò£ò¤ò¥ò¦ò§ $ Ìç 8 °Ç±¼±Ü³«³Õ´Â´Ê´Ö´×´Ø¹Þ½áÁ®Æ®È¶Ê¹ÊÄÌäÌåÌçÍóÍöÐîÔÑÕÆÕÇØâÙßڨܯݭßÑßóà¥áòåã éÂë¦í¸í¹ïÙïÚïÛïÜïÝïÞïßïàïáïâïãïäïåïæïçïèïéïêïëïìïíïîïïïðïñïòïó $ ð° 8 ¹¯¹Ç½«½ÍÂáÎÐÎìϽϿÓâØÍܨâñã³äÔð°ð±ðÌòá $ ð² 8 °Ô°Ý±°²í³Í³Î³Ï´«´¿´Ã´Ñ´æ´ç·È¸¢¸Û¸Ü¸îºÅ»¨»ó½²½¸½Ú½à¾Á¾Ç¾Ì¾Ö¿Ê¿ä¿í¿÷¿ýÀÉÂÏ ÂëÂõåïÃÕÄÇÄáŧÆåÆçÆñȻʳÌöͣͺÍÊÍËÍÔÍåΥѮѵҰһÒÅÒÖÓ´ÓòÔÙÕåÖÃÖé׫ØÞØæ ØíØõØöÙ£Ù§ÙôÚ¸ÚºÚ¼ÚûÜÞݥݶÝÄÞÎÞõà¢á±áùáþâÚâßäáäûäüæ¥ç¿çÑéÂéÇéÌê­ê¿êÍë·ì¨ ì¬í¸í¹íÀíÁî¶ïÃïÑïÕï×ð²ð³ð´ðµð¶ð·ð¸ð¹ðºñ¢ñ×ñéò¾ó¼óÁ $ ±« 8 ±«±À²â¼¶¼ô¼û¿ÌÀãÁúíÃôÄÜÅÅÆÞǨʷ̸ÍëÎíÎîϪϳÔàÕÒÕÞØïڧ۱ݲߺáùäùåâåìæ¤ç³ çÂçÜé²êÀë¡íÚíßð¹ð»ð¼ð½ð¾ð¿ðÀðÁðÂðÃðÄðÅðÆðÇðÈðÉðÊðËðÌðÍðÎðÏ $ ÀÄ 8 »ª»¬¾ðÀ²À¶ÀºÀÁÀÄÀÅÆÔÌ÷ÐêàÊâÍèÇéñðÐ $ Èó 8 ºáÇÐÇÓÇÚÈÛÈáÈâÈåÈìÈðÈó×ÑÚóÜÒàêæÇç¤èËéôêêðÂðÑòÌóÓ $ ±â 8 ±â±æ²¶Þ»æ¬è¿ïæ $ ²¬ 8 ²¬¹Ë¹Ý¹äÖ¾Ûü $ ÌÈ 8 °ïÈÔÈÕÊÙÊÚÌÈÐÛѽÑËÑÍÕãØ¤íÎ $ ÌÌ 9 ÌËÌÌÌÍÞÞðÒðÓðÔ $ ³× 9 °È³×³óµÇ·¤¾ä¿ÙÇÆÊÜÛ±æ³æ´ë«ëñðÕðÖð×ðØðÙðÚðÛðÜðÝðÞðßðàðáðâðãðäðåðæðçðèðé $ ðê 9 °±°Î°Þ°ã±Ò´ÚÔ£Öëëáðêðë $ ðì 9 Ç£ÕÑØòØóÝÓÝÔäÞäßåùåúé¦ì«ðìðíðî $ ²» 9 °Å°Ç°Õ±¤²¯²±²²²»¶­¶À¶Á¼±¾´¾À¾Ï¾ã¿¥¿¦Ñ¿ÓàÖÑÖðÜúßõàøáïëÞðïðððñòãóß $ ÊÇ 9 ±Ï±Ð³Û³Ü´è´é´ê·¹·Û¸²¸Ü¹àº¢½ç¿Ü¿üÀ¥ÀÙÂêĺſƬÆÕÆÜÈÑÈÒÉÎÉÑÊÇËËÍÂÍêÎÎÎàÎæÕÏ ÖÜØñÞóàÜáúâ¡äÝäêåòåöé±éÀéÁë£ðòðóðôðõðöð÷ðøðùðúðûðüðýðþñ¡ñ¢ñ£ò¤ $ É÷ 9 ÉöÉ÷ËúÍòáæëåñ¤ñ¥ñ¦ñ§ñ¨ñ©ñª $ Èô 9 ÈôæÌ $ ¿© 9 °»°û±Â²î´Ûµ²¶Â¶ô»Á»ô¾þ¿©¿ªÈÓ˰ÌßÍÜҬݻßÇáøñ«ñ¬ñ­ñ®ñ¯ñ°ñ±ñ²ñ³ñ´ñµñ¶ñ·ñ¸ñ¹ ñºñ»ñ¼ñ½ñ¾ñ¿ñÀñÁñÂñÃòè $ ¼ó 9 ¼óÆ»ñÄñÅ $ ¹á 9 ³¾¹áñÆ $ ÉÊ 9 ´â·«ÁàÁçÁôÉÊÎ×ÐýÒ¿ÓÒÓäÔþÕÂÖÉÖÏØêÜäÝ¿ÝØèÖëðì¡í¯ñÜñô $ ÇÏ 10 ±Ø²ïµ³¶Ã¶î¶ï¶ð¸³½ÙÁûÂÌÂÍÃÚÃóÆ­ÆÆÆëÇÍÇÏÇýÕÀØáàõâûæ³ë«ïïð­ñÇñÈñÉñÊñËñÌñÍñÎ ñÏñÐñÑñÒñÓñÔñÕñÖñ×ñØñÙñÚñÛñÜñÝñÞñßñàñáñâñãñäñåñæñçñèñéñêñë $ ¹ü 10 ³¼³ê¿ñÜËàÑâ÷ñìñíñîñïñðñññòñóó³ $ ¹â 10 ¹Æ¹Ñ¹â¼Ê¿óȹÏÎÓåÚÊÜÉà·ãÌèæï®ñô $ ñõ 10 ȱɦñõñöñ÷ñøñùñúñûñüñýñþò¡ò¢ò£ò¤ò¥ò¦ò§ $ ò¨ 10 ò¨ò©òªò«ò¬ò­ $ ò® 10 ò® $ ò¯ 10 ³ÖÍ»àÛäøç­ò¯ $ µ´ 10 ²ô³¡µ´º²½¯½¹ËâÌ¥ÐúÖÌÖÛØÃÜÇàóè¹ð©ñ¹ò°ò±ò²ò³ò´òµò¶ $ ε 10 Âìε϶ÜÙ $ µû 11 °³°¾°ó±·³â³ïµùµû·ß¸ñºú»ª»­Á¯ÁÉÂäíÉÉÊ«ËîËðÎÚϥϦÏÌáýçâé©é¿éÅò·ò¸ò¹òºò»ò¼ ò½ò¾ò¿òÀòÁòÂòÃòÄòÅòÆòÇòÈòÉòÊòËòÌòÍòÎòÏòÐòÑòÒòÓòÔòÕòÖò×òØòÙòÚòÛòÜòÝòÞòßòà òáòâòãòäòåòæòçòèòé $ Ä» 11 ±¨±­±õ²©²ª³û·Ü¹ã¹ôºí¼²ÂëÄ»ÄÕÄáÅçÅèÆ¾ÆÆÆÐÆëȷ˱˲̹ÌÄÏÉÓËÔÉÕÁÖºÙñÛæÜÏÜøäÎ òêòëòìòíòîòïòðòñòòòóòôòõòöò÷òøòùòúòûòüòýòþó¡ó¢ó£ó¤ó¥ó¦ó§ó¨ó©óªó«ó¬ó­ó®ó¯ ó°ó±ó²ó³ó´óµó¶ó·ó¸ó¹óºó»ó¼ó½ó¾ó¿óÀóÁó $ óà 11 ¸´ß£óÃóÄóÅ $ ¼¯ 11 ¹÷¼¯¿ÐÎÛÎïϼѶßÓíÜï²ñëóÆóÇóÈóÉóÊóËóÌóÍ $ Çþ 11 ¹íÇþÌÍóÎóÏóÐóÑóÒ $ Ëã 11 ËàËáËâËãËûÎñÎòÓ×Ö÷ÝàäöåÛóÓ $ µµ 11 °¬³öµµÆìÇèãÔò­óý $ Å© 11 ÃäŦŨũŬŭëó $ ²« 12 ²£²«ÔÝ×¢ÙìÚ²Û¥âèäÐïÊóÔ $ µÐ 12 µÐé¼óÕóÖó× $ ¹õ 12 ¹õÂãËÏÌÛѸÔßàÔåõóØóÙóÚóÛóÜóÝóÞóßóàóáóâ $ óã 12 óãóäóå $ ̵ 12 ÉïÉñÉó̵Óß×§Øã $ óæ 13 ãÞåêê¤óæóçóè $ Ť 13 Ť $ ¸Ý 13 âÜóéóê $ ÁÍ 13 ÁÍàÚãâçÄïÍò§óì $ É¡ 14 ÓçÕÎóí $ éµ 14 ºÑºØºÞÀÆÑ±ÑýÚ«ß»ã·åíåîçÁèÄéµìÚí³ðÉðíðîóî $ »õ 15 ³ú»õÎðÓ÷óïóðóñóòóóóôóõóöó÷óøóùóúóû $ óþ 17 äàïÐóþ kanjstroke0100644000076400007640000006151406100077725011326 0ustar jwbjwb°¡7 °¢: °£9 °¤8 °¥9 °¦= °§: °¨9 °©: °ª< °«9 °¬@ °­; °®< °¯< °°6 °±< °²7 °³C °´; °µ5 °¶> °·6 °¸8 °¹8 °º9 °»= °¼< °½> °¾@ °¿8 °À< °Á; °Â6 °Ã; °Ä9 °Å= °Æ: °ÇA °È? °É7 °Ê5 °Ë6 °Ì7 °Í8 °Î< °Ï7 °Ð6 °Ñ8 °Ò9 °Ó; °Ô; °Õ= °Ö? °×8 °Ø< °Ù9 °Ú9 °Û; °Ü; °Ý> °Þ@ °ß9 °à; °á6 °â@ °ã= °ä? °å7 °æ4 °ç6 °è; °é8 °ê9 °ëA °ì1 °í7 °î= °ï; °ð> °ñ9 °ò6 °óE °ô4 °õ6 °ö9 °÷: °ø6 °ù9 °ú4 °û< °ü; °ý9 °þ> ±¡: ±¢; ±£> ±¤C ±¥6 ±¦5 ±§6 ±¨: ±©6 ±ª6 ±«8 ±¬5 ±­B ±®@ ±¯4 ±°= ±±6 ±²< ±³? ±´: ±µJ ±¶> ±·F ±¸9 ±¹= ±º: ±»5 ±¼< ±½? ±¾4 ±¿< ±À< ±Á9 ±Â> ±Ã@ ±Ä< ±ÅA ±Æ? ±Ç9 ±È6 ±É9 ±Ê5 ±Ë8 ±Ì9 ±Í< ±Î9 ±Ï@ ±Ð@ ±Ñ8 ±Ò@ ±Ó< ±Ô? ±Õ; ±Ö9 ±×: ±Ø> ±Ù: ±Ú? ±Û< ±Ü? ±Ý> ±Þ> ±ß4 ±à= ±á< ±â8 ±ã: ±ä8 ±å9 ±æ; ±ç< ±è8 ±é> ±ê8 ±ë; ±ì= ±í? ±î= ±ï? ±ðC ±ñ8 ±ò@ ±ó= ±ô= ±õ@ ±ö= ±÷8 ±ø6 ±ù< ±ú5 ±û5 ±ü< ±ý8 ±þ7 ²¡8 ²¢8 ²£? ²¤8 ²¥8 ²¦4 ²§: ²¨B ²©@ ²ª? ²«; ²¬8 ²­7 ²®: ²¯? ²°9 ²±@ ²²A ²³; ²´7 ²µ1 ²¶: ²·9 ²¸: ²¹< ²º@ ²»9 ²¼3 ²½4 ²¾6 ²¿7 ²À7 ²Á8 ²Â8 ²Ã5 ²Ä5 ²Å> ²Æ: ²Ç= ²È: ²É> ²Ê9 ²Ë= ²Ì8 ²Í9 ²Î> ²Ï8 ²Ð4 ²Ñ9 ²Ò= ²Ó5 ²Ô? ²Õ> ²Ö7 ²×8 ²Ø8 ²Ù: ²Ú: ²Û; ²Ü? ²Ý? ²Þ= ²ß; ²à8 ²á< ²âA ²ã: ²ä9 ²å: ²æ7 ²ç4 ²è8 ²é9 ²ê8 ²ë= ²ì< ²í= ²î? ²ï? ²ð4 ²ñ6 ²ò= ²ó6 ²ô= ²õ@ ²ö9 ²÷7 ²ø8 ²ù9 ²ú9 ²û@ ²ü7 ²ý8 ²þ7 ³¡> ³¢: ³£; ³¤9 ³¥6 ³¦9 ³§9 ³¨< ³©7 ³ªC ³«< ³¬< ³­7 ³®< ³¯8 ³°5 ³±9 ³²: ³³; ³´= ³µ> ³¶; ³·= ³¸= ³¹< ³º= ³»B ³¼@ ³½: ³¾D ³¿< ³À9 ³Á9 ³Â; ³Ã< ³Ä> ³ÅA ³Æ6 ³Ç> ³È8 ³É? ³Ê: ³Ë: ³Ì; ³Í@ ³Î? ³ÏB ³Ð< ³Ñ7 ³Ò> ³Ó= ³Ô; ³Õ> ³Ö= ³×9 ³Ø8 ³Ù8 ³Ú= ³ÛB ³Ü@ ³Ý; ³Þ; ³ß? ³àA ³á; ³âD ³ã? ³ä< ³å; ³æ9 ³ç9 ³è9 ³é; ³ê= ³ë< ³ì= ³íA ³î5 ³ïG ³ð5 ³ñ; ³ò> ³ó> ³ô: ³õ; ³öA ³÷= ³ø: ³ùB ³ú? ³û@ ³ü: ³ý8 ³þ< ´¡< ´¢4 ´£7 ´¤5 ´¥; ´¦8 ´§9 ´¨< ´©5 ´ª; ´«= ´¬9 ´­< ´®< ´¯9 ´°7 ´±8 ´²= ´³3 ´´= ´µ; ´¶= ´·> ´¸@ ´¹< ´º< ´»9 ´¼: ´½< ´¾< ´¿? ´À6 ´Á= ´Â? ´Ã> ´ÄA ´Å5 ´Æ? ´Ç9 ´È9 ´É> ´ÊB ´Ë? ´Ì6 ´Í@ ´Î7 ´ÏE ´Ð: ´ÑB ´Ò@ ´Ó; ´Ô@ ´ÕG ´Ö< ´×< ´Ø> ´Ù: ´ÚA ´Û@ ´Ü@ ´Ý3 ´Þ7 ´ß8 ´àD ´á8 ´âA ´ã; ´ä8 ´å? ´æC ´ç< ´è= ´éB ´êC ´ë6 ´ì6 ´í6 ´î< ´ï? ´ð; ´ñ8 ´ò? ´ó; ´ô7 ´õ7 ´ö< ´÷7 ´ø< ´ù6 ´ú> ´û: ´ü< ´ý< ´þ= µ¡@ µ¢: µ£? µ¤6 µ¥7 µ¦? µ§8 µ¨8 µ©< µª9 µ«A µ¬; µ­: µ®< µ¯: µ°9 µ±? µ²: µ³B µ´: µµ; µ¶; µ·? µ¸7 µ¹8 µº? µ»7 µ¼A µ½< µ¾A µ¿> µÀ8 µÁ= µÂC µÃ? µÄD µÅ; µÆ; µÇA µÈ6 µÉ6 µÊ< µË: µÌ@ µÍ= µÎ: µÏ8 µÐ< µÑ7 µÒ9 µÓ; µÔ9 µÕ9 µÖ5 µ×3 µØ4 µÙ6 µÚ3 µÛ6 µÜ: µÝ3 µÞ9 µß; µà6 µá7 µâ7 µã8 µä7 µå; µæ7 µç? µè: µé9 µê9 µë< µì5 µí4 µî5 µï8 µð5 µñ8 µò8 µó: µô; µõ; µö; µ÷< µø@ µù> µú@ µû; µü7 µý8 µþ8 ¶¡8 ¶¢8 ¶£> ¶¤6 ¶¥D ¶¦6 ¶§4 ¶¨8 ¶©6 ¶ª< ¶«6 ¶¬< ¶­> ¶®9 ¶¯; ¶°@ ¶±8 ¶²: ¶³: ¶´9 ¶µ; ¶¶@ ¶·8 ¶¸7 ¶¹9 ¶ºA ¶»: ¶¼: ¶½@ ¶¾? ¶¿; ¶ÀC ¶ÁD ¶ÂF ¶ÃF ¶Ä6 ¶Å@ ¶Æ8 ¶Ç< ¶È= ¶É7 ¶Ê6 ¶Ë= ¶Ì5 ¶Í: ¶Î9 ¶Ï= ¶Ð< ¶Ñ7 ¶Ò3 ¶Ó@ ¶Ô4 ¶Õ8 ¶Ö< ¶×< ¶Ø= ¶Ù= ¶Ú< ¶Û? ¶Ü7 ¶Ý; ¶Þ9 ¶ßB ¶àA ¶á7 ¶â8 ¶ã7 ¶ä> ¶å2 ¶æ: ¶ç5 ¶è4 ¶é8 ¶ê7 ¶ë: ¶ì8 ¶í; ¶î> ¶ï? ¶ð? ¶ñ8 ¶ò= ¶ó= ¶ô< ¶õ8 ¶ö; ¶÷< ¶ø< ¶ù< ¶ú7 ¶ûB ¶ü; ¶ý: ¶þ8 ·¡; ·¢= ·£8 ·¤= ·¥F ·¦> ·§> ·¨< ·©9 ·ª: ·«C ·¬: ·­A ·®? ·¯7 ·°@ ·±: ·²= ·³9 ·´: ·µ8 ·¶; ··7 ·¸9 ·¹= ·º6 ·»5 ·¼; ·½6 ·¾: ·¿9 ·À9 ·Á7 ·Â8 ·Ã: ·Ä? ·Å? ·Æ@ ·Ç; ·È= ·É< ·Ê< ·Ë: ·Ì; ·Í; ·Î@ ·Ï7 ·Ð; ·Ñ= ·ÒC ·Ó= ·Ô8 ·Õ9 ·Ö; ·×9 ·Ø= ·ÙC ·Ú< ·Û> ·ÜC ·Ý7 ·Þ7 ·ßC ·à? ·á< ·â? ·ã@ ·ä= ·å: ·æ= ·ç4 ·è7 ·é? ·ê5 ·ë< ·ì6 ·í; ·î4 ·ï6 ·ð: ·ñ: ·ò; ·ó: ·ô8 ·õ: ·ö< ·÷< ·ø< ·ù= ·ú9 ·û@ ·üD ·ý: ·þ; ¸¡< ¸¢? ¸£; ¸¤4 ¸¥= ¸¦9 ¸§< ¸¨= ¸©9 ¸ª8 ¸«7 ¸¬A ¸­@ ¸®: ¸¯= ¸°A ¸±; ¸²B ¸³B ¸´C ¸µ4 ¸¶: ¸·A ¸¸4 ¸¹8 ¸º< ¸»= ¸¼5 ¸½; ¸¾; ¸¿; ¸À7 ¸Á@ ¸Â9 ¸Ã5 ¸Ä: ¸Å5 ¸Æ8 ¸Ç8 ¸È8 ¸É9 ¸Ê3 ¸Ë: ¸Ì9 ¸Í4 ¸Î9 ¸Ï9 ¸Ð< ¸Ñ8 ¸Ò? ¸Ó; ¸Ô8 ¸Õ9 ¸Ö; ¸×8 ¸Ø= ¸Ù= ¸Ú= ¸Û< ¸ÜE ¸Ý= ¸Þ4 ¸ß4 ¸à6 ¸á4 ¸â7 ¸ã7 ¸ä: ¸å9 ¸æ< ¸ç: ¸è; ¸éA ¸ê= ¸ë= ¸ì> ¸í> ¸îD ¸ï@ ¸ð3 ¸ñB ¸ò6 ¸ó8 ¸ô9 ¸õ: ¸ö: ¸÷6 ¸ø4 ¸ù5 ¸ú8 ¸û4 ¸ü9 ¸ý3 ¸þ6 ¹¡6 ¹¢< ¹£7 ¹¤9 ¹¥6 ¹¦4 ¹§7 ¹¨7 ¹©3 ¹ª5 ¹«9 ¹¬8 ¹­5 ¹®8 ¹¯; ¹°5 ¹±9 ¹²< ¹³7 ¹´8 ¹µ; ¹¶7 ¹·8 ¹¸: ¹¹7 ¹º8 ¹»: ¹¼; ¹½> ¹¾6 ¹¿9 ¹À: ¹Á< ¹Â= ¹Ã5 ¹Ä9 ¹Å< ¹Æ? ¹ÇA ¹È9 ¹É: ¹Ê< ¹Ë> ¹Ì: ¹Í6 ¹Î8 ¹Ï8 ¹Ð< ¹Ñ> ¹Ò: ¹Ó9 ¹Ô6 ¹Õ@ ¹ÖA ¹×: ¹ØA ¹Ù9 ¹Ú> ¹Û= ¹Ü: ¹Ý@ ¹Þ> ¹ß: ¹à< ¹á9 ¹â: ¹ãA ¹ä: ¹å7 ¹æ5 ¹ç6 ¹èA ¹é9 ¹êA ¹ë> ¹ìE ¹í? ¹î7 ¹ï8 ¹ð7 ¹ñ8 ¹ò> ¹ó> ¹ôB ¹õ; ¹ö> ¹÷> ¹ø= ¹ù@ ¹ú8 ¹û; ¹ü: ¹ý8 ¹þ5 º¡6 º¢; º£4 º¤7 º¥8 º¦@ º§; º¨9 º©A ºª8 º«8 º¬: º­; º®; º¯; º°; º±6 º²> º³8 º´7 ºµ3 º¶: º·= º¸5 º¹: ºº9 º»7 º¼> º½9 º¾< º¿B ºÀ= ºÁ7 ºÂ: ºÃ; ºÄ= ºÅ= ºÆ6 ºÇ< ºÈ9 ºÉ= ºÊ8 ºË: ºÌ; ºÍ3 ºÎ; ºÏ: ºÐ= ºÑ; ºÒ7 ºÓ8 ºÔ< ºÕ9 ºÖ; º×; ºØ; ºÙ; ºÚ; ºÛ< ºÜ= ºÝ> ºÞ: ºß6 ºà7 ºá= ºâ: ºã7 ºä7 ºå7 ºæ< ºç= ºè8 ºé9 ºê; ºë; ºì= ºíH ºî7 ºï9 ºð8 ºñ= ºò9 ºó: ºô9 ºõ: ºö< º÷: ºø@ ºù: ºúA ºû; ºü; ºý5 ºþ8 »¡> »¢9 »£? »¤A »¥5 »¦: »§A »¨> »©; »ªC »«: »¬@ »­A »®5 »¯: »°3 »±< »²8 »³3 »´; »µ? »¶< »·: »¸A »¹9 »º; »»> »¼D »½: »¾F »¿? »À> »Á@ »Â; »Ã? »Ä: »Å5 »Æ5 »Ç7 »È8 »É8 »Ê5 »Ë5 »Ì= »Í5 »Î3 »Ï8 »Ð8 »Ñ9 »Ò3 »Ó9 »Ô5 »Õ: »Ö7 »×9 »Ø9 »Ù4 »Ú7 »Û< »Ü9 »Ý6 »Þ8 »ß4 »à6 »á4 »â= »ã8 »ä7 »å6 »æ: »ç< »è8 »é: »ê6 »ë; »ì< »í= »î= »ï> »ð@ »ñ= »ò? »ó> »ô= »õ< »ö8 »÷7 »ø8 »ù7 »ú6 »û6 »ü= »ý9 »þ: ¼¡6 ¼¢< ¼£8 ¼¤> ¼¥C ¼¦; ¼§> ¼¨5 ¼©6 ¼ª6 ¼«6 ¼¬= ¼­= ¼®6 ¼¯; ¼°6 ¼±C ¼²@ ¼³8 ¼´< ¼µ7 ¼¶; ¼·2 ¼¸5 ¼¹; ¼º5 ¼»= ¼¼9 ¼½; ¼¾< ¼¿> ¼À: ¼Á? ¼Â8 ¼Ã> ¼Ä@ ¼Å; ¼Æ: ¼Ç6 ¼È< ¼É? ¼Ê@ ¼Ë8 ¼Ì5 ¼Í: ¼Î; ¼Ï; ¼Ð; ¼Ñ< ¼Ò7 ¼Ó: ¼Ô8 ¼ÕA ¼Ö7 ¼×> ¼Ø; ¼Ù8 ¼Ú: ¼Û3 ¼Ü4 ¼Ý7 ¼Þ7 ¼ßA ¼à: ¼á; ¼â@ ¼ã8 ¼ä; ¼å: ¼æ< ¼ç5 ¼è8 ¼é6 ¼ê4 ¼ë6 ¼ì: ¼í9 ¼î: ¼ï> ¼ð= ¼ñ? ¼ò: ¼ó9 ¼ô@ ¼õ8 ¼ö8 ¼÷7 ¼ø; ¼ù@ ¼ú> ¼û> ¼ü5 ¼ý5 ¼þ8 ½¡8 ½¢< ½£6 ½¤: ½¥= ½¦9 ½§9 ½¨7 ½©9 ½ª; ½«A ½¬; ½­9 ½®6 ½¯= ½°< ½±F ½²G ½³C ½´@ ½µ; ½¶9 ½·= ½¸< ½¹A ½º4 ½»7 ½¼6 ½½2 ½¾: ½¿6 ½À9 ½Á5 ½Â; ½Ã@ ½Ä@ ½Å9 ½Æ> ½Ç8 ½È6 ½É; ½Ê; ½Ë9 ½ÌA ½Í; ½Î> ½Ï? ½Ð5 ½Ñ; ½Ò8 ½Ó9 ½Ô: ½Õ9 ½ÖB ½×< ½Ø= ½ÙA ½Ú: ½Û< ½Ü6 ½Ý= ½Þ: ½ß; ½à= ½á? ½â9 ½ã: ½ä6 ½å? ½æ? ½ç< ½è5 ½é7 ½ê8 ½ë< ½ìB ½í; ½î; ½ï> ½ð= ½ñ: ½òA ½óB ½ô? ½õ7 ½ö9 ½÷3 ½ø7 ½ù: ½ú: ½û> ½ü: ½ý= ½þA ¾¡< ¾¢6 ¾£4 ¾¤5 ¾¥: ¾¦; ¾§; ¾¨> ¾©= ¾ª8 ¾«; ¾¬: ¾­: ¾®3 ¾¯4 ¾°8 ¾±6 ¾²7 ¾³? ¾´> ¾µ8 ¾¶7 ¾·8 ¾¸< ¾¹; ¾º8 ¾»8 ¾¼9 ¾½< ¾¾8 ¾¿; ¾À? ¾Á@ ¾Â8 ¾Ã: ¾Ä; ¾Å< ¾Æ< ¾Ç< ¾È= ¾É: ¾Ê9 ¾Ë< ¾ÌA ¾Í: ¾Î: ¾Ï; ¾Ð: ¾Ñ< ¾Ò; ¾Ó7 ¾Ô; ¾Õ= ¾Ö? ¾×? ¾Ø> ¾Ù; ¾Ú< ¾Û< ¾Ü= ¾Ý< ¾Þ? ¾ßA ¾à= ¾áA ¾âD ¾ã> ¾ä@ ¾å3 ¾æ3 ¾ç6 ¾è9 ¾é4 ¾ê; ¾ë9 ¾ì< ¾í@ ¾î@ ¾ï; ¾ð; ¾ñB ¾ò7 ¾ó7 ¾ô9 ¾õ7 ¾ö< ¾÷B ¾ø= ¾ùD ¾úD ¾û@ ¾ü? ¾ý; ¾þ= ¿¡9 ¿¢< ¿£< ¿¤A ¿¥B ¿¦B ¿§6 ¿¨= ¿©9 ¿ª> ¿«: ¿¬5 ¿­7 ¿®9 ¿¯9 ¿°: ¿±: ¿²= ¿³? ¿´4 ¿µ= ¿¶: ¿·= ¿¸: ¿¹< ¿º> ¿»: ¿¼; ¿½5 ¿¾: ¿¿: ¿À9 ¿Á: ¿Â; ¿Ã7 ¿Ä7 ¿Å@ ¿Æ@ ¿Ç< ¿È7 ¿É7 ¿Ê; ¿Ë: ¿Ì? ¿Í2 ¿Î4 ¿Ï3 ¿Ð> ¿Ñ4 ¿Ò< ¿Ó9 ¿Ô6 ¿Õ= ¿Ö: ¿×6 ¿Ø: ¿Ù< ¿Ú; ¿Û? ¿Ü< ¿Ý< ¿Þ7 ¿ß< ¿à: ¿á7 ¿â8 ¿ã9 ¿ä; ¿å4 ¿æ8 ¿ç= ¿è: ¿é> ¿ê: ¿ë< ¿ì; ¿í@ ¿î@ ¿ï< ¿ð= ¿ñC ¿ò; ¿ó= ¿ô= ¿õ8 ¿öA ¿÷B ¿ø; ¿ù7 ¿ú< ¿û; ¿ü> ¿ý; ¿þ= À¡? À¢> À£3 À¤5 À¥C À¦: À§9 À¨: À©8 Àª= À«8 À¬8 À­8 À®6 À¯9 À°@ À±9 À²< À³< À´: Àµ5 À¶; À·9 À¸5 À¹; Àº> À»= À¼7 À½> À¾6 À¿= ÀÀ> ÀÁ? ÀÂ: ÀÃ@ ÀÄ8 ÀÅ> ÀÆ8 ÀÇ< ÀÈ: ÀÉ: ÀÊ: ÀË; ÀÌ; ÀÍ5 ÀÎ8 ÀÏ8 ÀÐ5 ÀÑ@ ÀÒD ÀÓA ÀÔ: ÀÕ; ÀÖ7 À×= ÀØB ÀÙ> ÀÚ4 ÀÛ8 ÀÜ; ÀÝ= ÀÞ7 Àß; Àà9 Àá= Àâ> Àã; Àä< Àå6 Àæ? Àç5 Àè6 Àé3 Àê5 Àë9 Àì9 Àí6 Àî3 Àï= Àð: Àñ? Àò: Àó: Àô9 Àõ9 Àö9 À÷9 Àø? Àù= Àú> Àû; Àü9 Àý? Àþ? Á¡A Á¢= Á£= Á¤7 Á¥; Á¦@ Á§= Á¨= Á©= Áª? Á«? Á¬> Á­> Á®: Á¯A Á°9 Á±< Á²> Á³< Á´6 Áµ= Á¶B Á·@ Á¸? Á¹> Áº= Á»8 Á¼; Á½< Á¾; Á¿= ÁÀ8 ÁÁ< ÁÂ< ÁÃB ÁÄ9 ÁÅ: ÁÆ; ÁÇ: ÁÈ; ÁÉC ÁÊ< ÁË8 ÁÌ= ÁÍ= ÁÎ= ÁÏ< ÁÐ4 ÁÑB ÁÒ: ÁÓ< ÁÔ6 ÁÕ9 ÁÖ; Á×7 ÁØ> ÁÙ5 ÁÚ< ÁÛ= ÁÜ: ÁÝ; ÁÞ: Áß; Áà@ Áá6 Áâ; Áã; Áä> Áå? Áæ> ÁçA Áè6 Áé? Áê9 Áë; ÁìA Áí> Áî> Áï> Áð9 Áñ9 Áò< Áó= ÁôC Áõ< Áö7 Á÷9 Áø> ÁùB ÁúA ÁûB Áü> Áý> Áþ> ¡C ¢? £B ¤: Â¥9 ¦; §9 ¨7 ©: ª: «7 ¬< ­7 ®: ¯9 °< ±= ²; ³= ´8 µ: ¶8 ·< ¸6 ¹: º< »= ¼7 ½= ¾5 ¿6 ÂÀ4 ÂÁ7 ÂÂ< ÂÃ; ÂÄ< ÂÅ7 ÂÆ< ÂÇ5 ÂÈ9 ÂÉ; ÂÊ= ÂË8 ÂÌ> ÂÍC ÂÎ7 ÂÏ; ÂÐ7 ÂÑ9 ÂÒ8 ÂÓ: ÂÔ9 ÂÕ9 ÂÖ> Â×B ÂØ< ÂÙ: ÂÚ= ÂÛ9 ÂÜ= ÂÝ8 ÂÞ; Âß< Âà9 Âá; Ââ< Âã@ ÂäC Âå5 Âæ5 Âç3 Âè; Âé@ ÂêB ÂëH Âì= ÂíC Âî8 Âï: Âð6 Âñ6 Âò7 Âó8 Âô7 ÂõA Âö; Â÷: ÂøE Âù@ Âú? Âû9 Âü5 Âý@ Âþ5 á5 â7 ã< ä7 Ã¥> æ; ç< è> é6 ê< ë7 ì: íF î@ ï? ð4 ñ9 ò= ó8 ô8 õ; ö5 ÷? ø; ù< ú9 û< ü> ýB þ> ÿ: ÃÀ9 ÃÁ; ÃÂ? ÃÃA ÃÄ6 ÃÅ@ ÃÆ< ÃÇ; ÃÈ= ÃÉA ÃÊ9 ÃË7 ÃÌ? ÃÍ: ÃÎ8 ÃÏ6 ÃÐ6 ÃÑ: ÃÒ< ÃÓ6 ÃÔ= ÃÕ= ÃÖ= Ã×: ÃØ> ÃÙ< ÃÚ= ÃÛ@ ÃÜ: ÃÝ6 ÃÞ< Ãß= Ãà: Ãá: Ãâ; Ãã9 Ãä> Ãå< Ãæ4 Ãç6 Ãè8 Ãé8 Ãê8 Ãë9 Ãì9 Ãí8 Ãî6 Ãï9 Ãð< Ãñ: Ãò? Ãó? Ãô? ÃõB Ãö; Ã÷8 Ãø; Ãù< Ãú2 Ãû6 Ãü: Ãý< ÃþC Ä¡8 Ä¢; Ä£5 Ĥ4 Ä¥; Ħ; ħ> ĨB Ä©9 Ī> Ä«< Ĭ? Ä­= Ä®7 į; İA ı< IJ= ij? Ä´? ĵ@ Ķ< Ä·= ĸ> Ĺ8 ĺ; Ä»; ļ9 Ľ: ľ8 Ä¿: ÄÀ7 ÄÁ9 ÄÂ= ÄÃB ÄÄ; ÄÅ9 ÄÆ? ÄÇ< ÄÈ= ÄÉ9 ÄÊA ÄË< ÄÌ: ÄÍ< ÄÎ9 ÄÏ> ÄÐ? ÄÑ7 ÄÒ> ÄÓ9 ÄÔ5 ÄÕ> ÄÖ> Ä×A ÄØ= ÄÙ? ÄÚ8 ÄÛ; ÄÜA ÄÝ; ÄÞ4 Äß6 Äà; ÄáE Äâ9 Äã7 Ää; Äå; Äæ9 Äç9 Äè7 Äé< Äê8 Äë9 Äì8 Äí: Äî7 Äï7 Äð: Äñ8 Äò: Äó< Äô; Äõ5 Äö= Ä÷= Äø< Äù? Äú= Äû9 Äü@ Äý@ Äþ: Å¡8 Å¢? Å£: Ť= Å¥8 Ŧ> ŧA Ũ? Å©> Ū8 Å«; Ŭ> Å­C Å®= ů: Ű? ű? ŲC ų8 Å´= ŵ8 Ŷ= Å·4 Ÿ: Ź8 ź; Å»E ż; Ž< ž; Å¿C ÅÀ9 ÅÁ6 ÅÂ= ÅÃ@ ÅÄ5 ÅÅ= ÅÆ7 ÅÇ6 ÅÈ< ÅÉ= ÅÊ8 ÅË< ÅÌ: ÅÍ4 ÅÎ7 ÅÏ< ÅÐ< ÅÑ; ÅÒ@ ÅÓ: ÅÔ; ÅÕA ÅÖ: Å×: ÅØ7 ÅÙ9 ÅÚ3 ÅÛ5 ÅÜ9 ÅÝ: ÅÞ: Åß5 Åà: Åá2 Åâ: Åã< Åä= Åå: Åæ8 Åç: Åè> Åé; Åê7 Åë< Åì8 Åí: Åî; Åï< Åð; Åñ; Åò< Åó: Åô6 Åõ@ Åö6 Å÷< Åø< Åù< Åú< Åû< Åü@ Åý< Åþ8 Æ¡< Æ¢? Æ£B Ƥ: Æ¥A Ʀ7 Ƨ? ƨ9 Æ©: ƪD Æ«; Ƭ@ Æ­D Æ®B Ư= ư; Ʊ6 Ʋ; Ƴ? Æ´? Ƶ? ƶ9 Æ·A Ƹ< ƹ: ƺ; Æ»< Ƽ> ƽ9 ƾ? Æ¿: ÆÀ; ÆÁ> ÆÂ: ÆÃ: ÆÄ= ÆÅ7 ÆÆ@ ÆÇ8 ÆÈ9 ÆÉ> ÆÊ9 ÆË@ ÆÌ5 ÆÍ8 ÆÎ= ÆÏ8 ÆÐ> ÆÑ8 ÆÒ; ÆÓ7 ÆÔC ÆÕ@ ÆÖ4 Æ×; ÆØ< ÆÙ7 ÆÚ; ÆÛ< ÆÜ= ÆÝ7 ÆÞ@ Æß< Æà8 Æá7 Æâ4 Æã5 Æä6 Æå@ Ææ@ ÆçF Æè; ÆéA Æê= Æë= Æì? Æí= Æî9 Æï= Æð; ÆñB Æò6 Æó2 Æô5 Æõ6 Æö8 Æ÷4 Æø> Æù6 Æú9 Æû4 Æü4 Æý8 Æþ2 Ç¡6 Ç¢7 Ç£< Ǥ6 Ç¥7 Ǧ7 ǧ> ǨA Ç©B Ǫ9 Ç«> Ǭ< Ç­; Ç®? ǯ6 ǰ8 DZ; Dz? dz@ Ç´; ǵ2 Ƕ9 Ç·3 Ǹ; ǹF Ǻ: Ç»@ Ǽ: ǽ: Ǿ; Ç¿A ÇÀ= ÇÁ< ÇÂ: ÇÃ4 ÇÄ7 ÇÅ? ÇÆC ÇÇ8 ÇÈ8 ÇÉ9 ÇÊ< ÇË: ÇÌ; ÇÍ@ ÇÎ7 ÇÏ: ÇÐ: ÇÑ< ÇÒ8 ÇÓ; ÇÔ; ÇÕ8 ÇÖ9 Ç×< ÇØ9 ÇÙ9 ÇÚ? ÇÛ: ÇÜ: ÇÝ; ÇÞ< Çß: Çà= Çá= Çâ: Çã< Çä7 Çå? Çæ; Çç: Çè? Çé: Çê9 Çë< Çì7 Çí: Çî< Çï8 Çð9 Çñ8 Çò5 Çó> Çô; Çõ; Çö@ Ç÷8 ÇøC Çù= ÇúC Çû@ Çü: Çý> Çþ7 È¡8 È¢? È£< Ȥ? È¥> Ȧ< ȧD Ȩ? È©6 Ȫ9 È«: Ȭ2 È­= È®? ȯ9 ȰC ȱ> Ȳ6 ȳ> È´7 ȵ< ȶ> È·= ȸ@ ȹ= Ⱥ< È»: ȼ7 Ƚ7 Ⱦ5 È¿4 ÈÀ9 ÈÁ6 ÈÂ= ÈÃ< ÈÄ8 ÈÅ5 ÈÆ6 ÈÇ8 ÈÈ5 ÈÉ: ÈÊ: ÈË@ ÈÌ: ÈÍB ÈÎ; ÈÏ? ÈÐ7 ÈÑ= ÈÒ= ÈÓ< ÈÔ: ÈÕ< ÈÖ< È×? ÈØ? ÈÙ? ÈÚ< ÈÛ: ÈÜ9 ÈÝ7 ÈÞ6 Èß7 Èà8 Èá< Èâ< Èã7 Èä8 Èå< Èæ4 Èç8 Èè: Èé5 Èê> Èë: Èì> Èí? Èî8 Èï: Èð? Èñ< Èò@ Èó8 Èô9 Èõ; ÈöC È÷< Èø7 Èù= Èú8 Èû9 Èü< Èý9 Èþ9 É¡> É¢9 É£= ɤ4 É¥5 ɦ@ ɧ9 ɨ? É©; ɪ7 É«< ɬ5 É­; É®< ɯ< ɰ: ɱ: ɲ< ɳ: É´6 ɵB ɶ: É·; ɸ? ɹ5 ɺ> É»@ ɼ; ɽ8 ɾ< É¿: ÉÀ? ÉÁ; ÉÂ: ÉÃ9 ÉÄ8 ÉÅ@ ÉÆ? ÉÇ= ÉÈ< ÉÉE ÉÊ9 ÉË; ÉÌ< ÉÍ: ÉÎC ÉÏ; ÉÐ? ÉÑA ÉÒ: ÉÓ; ÉÔ4 ÉÕ5 ÉÖ; É×4 ÉØ; ÉÙ< ÉÚ; ÉÛ5 ÉÜ8 ÉÝ8 ÉÞ7 Éß? Éà8 Éá< Éâ: Éã4 Éä; Éå> Éæ? Éç7 ÉèC Éé9 Éê? Éë9 Éì8 Éí8 Éî8 Éï? Éð8 Éñ? Éò< Éó? Éô; Éõ9 Éö= É÷9 Éø< Éù@ Éú6 Éû; Éü< Éý< Éþ8 Ê¡= Ê¢= Ê£> ʤB Ê¥< ʦ5 ʧ5 ʨ8 Ê©4 ʪ8 Ê«@ ʬ4 Ê­7 Ê®? ʯ? ʰ? ʱ7 ʲ< ʳ@ Ê´: ʵA ʶ: Ê·< ʸ4 ʹ> ʺ5 Ê»8 ʼ7 ʽ< ʾ? Ê¿5 ÊÀ? ÊÁ9 ÊÂ8 ÊÃ? ÊÄ; ÊÅ: ÊÆ6 ÊÇ9 ÊÈ? ÊÉ@ ÊÊB ÊË> ÊÌ7 ÊÍA ÊÎ> ÊÏ> ÊÐ; ÊÑ9 ÊÒ4 ÊÓ? ÊÔ? ÊÕ5 ÊÖ7 Ê×< ÊØ9 ÊÙ: ÊÚ; ÊÛ5 ÊÜB ÊÝ9 ÊÞ? Êß? Êà: Êá: Êâ8 Êã7 Êä< Êå> Êæ? Êç< Êè= Êé> Êê5 Êë> Êì5 ÊíC Êî; Êï: Êð: Êñ5 Êò7 Êó< Êô8 Êõ8 Êö: Ê÷: Êø; Êù8 Êú8 Êû; Êü8 Êý4 Êþ8 Ë¡8 Ë¢8 Ë£; ˤ: Ë¥@ ˦9 ˧7 ˨; Ë©> ˪= Ë«? ˬ; Ë­= Ë®7 ˯? ˰= ˱> ˲C ˳4 Ë´3 ˵< ˶: Ë·7 ˸7 ˹< ˺7 Ë»6 ˼8 ˽? ˾; Ë¿9 ËÀ< ËÁ9 ËÂ: ËÃ8 ËÄ@ ËÅ@ ËÆ> ËÇ< ËÈ> ËÉ7 ËÊ7 ËË? ËÌ5 ËÍ> ËÎ2 ËÏ> ËÐ? ËÑ6 ËÒ8 ËÓ= ËÔA ËÕ; ËÖ9 Ë×7 ËØ9 ËÙ; ËÚ= ËÛ8 ËÜ5 ËÝB ËÞ3 Ëß9 Ëà? Ëá@ ËâE Ëã; Ëä: Ëå8 Ëæ9 Ëç8 Ëè6 Ëé: Ëê> Ëë= Ëì> Ëí8 ËîA Ëï9 ËðG Ëñ: Ëò6 Ëó9 Ëô2 Ëõ8 Ëö5 Ë÷8 Ëø6 Ëù8 ËúB ËûB Ëü3 Ëý> Ëþ< Ì¡> Ì¢> Ì£8 ̤5 Ì¥? ̦3 ̧> ̨8 Ì©; ̪> Ì«< ̬= Ì­= Ì®: ̯7 ̰: ̱5 ̲: ̳; Ì´= ̵< ̶6 Ì·5 ̸C ̹C ̺< Ì»< ̼: ̽: ̾6 Ì¿8 ÌÀ8 ÌÁ= ÌÂ9 ÌÃ> ÌÄ> ÌÅ9 ÌÆ6 ÌÇ= ÌÈ8 ÌÉ< ÌÊ> ÌË? ÌÌ9 ÌÍ@ ÌÎ> ÌÏ> ÌÐ8 ÌÑ6 ÌÒ8 ÌÓ4 ÌÔ; ÌÕ8 ÌÖ> Ì×: ÌØ= ÌÙB ÌÚ4 ÌÛ? ÌÜ5 ÌÝ7 ÌÞ4 Ìß> Ìà4 Ìá7 Ìâ9 Ìã< Ìä; Ìå< Ìæ: Ìç8 Ìè4 Ìé3 Ìê7 Ìë8 Ìì< Ìí9 Ìî; Ìï8 Ìð5 Ìñ4 Ìò7 Ìó9 Ìô@ Ìõ; ÌöE Ì÷= Ìø9 Ìù@ ÌúE Ìû< Ìü= Ìý8 ÌþB Í¡@ Í¢@ Í£; ͤ7 Í¥A ͦ9 ͧ4 ͨ9 Í©9 ͪ; Í«? ͬ< Í­6 Í®9 ͯ< Ͱ: ͱ< Ͳ= ͳ5 Í´9 ͵< Ͷ> Í·< ͸7 ͹; ͺ< Í»@ ͼ3 ͽ4 ;7 Í¿3 ÍÀ= ÍÁA ÍÂ= ÍÃ= ÍÄ5 ÍÅ7 ÍÆ: ÍÇ; ÍÈ< ÍÉ< ÍÊ@ ÍËB ÍÌ= ÍÍ> ÍÎ9 ÍÏ= ÍÐ> ÍÑ5 ÍÒ? ÍÓ6 ÍÔD ÍÕ< ÍÖ= Í×9 ÍØ@ ÍÙ> ÍÚ< ÍÛ< ÍÜ? ÍÝ? ÍÞ7 Íß; Íà7 Íá: Íâ; ÍãA Íä; ÍåC Íæ@ Íç= Íè7 Íé: Íê@ Íë= Íì9 Íí< Íî< Íï= Íð7 Íñ7 Íò< ÍóD ÍôB ÍõB ÍöC Í÷A Íø7 Íù6 Íú? Íû7 Íü; Íý; Íþ> Ρ< ΢= Σ< Τ7 Î¥B Φ; Χ9 Ψ; Ω5 Ϊ< Ϋ; ά; έ? ή: ί= ΰ; α: β< γ; δ; ε: ζ@ η9 θ? ι: κ= λ2 μ9 ν> ξ6 ο: ÎÀ? ÎÁ: ÎÂ; ÎÃ; ÎÄ; ÎÅA ÎÆA ÎÇ= ÎÈB ÎÉ7 ÎÊ? ÎË? ÎÌ< ÎÍ; ÎÎ> ÎÏ2 ÎÐ> ÎÑ: ÎÒ9 ÎÓ8 ÎÔ; ÎÕ@ ÎÖ< Î×B ÎØ? ÎÙ@ ÎÚG ÎÛH ÎÜ> ÎÝ< ÎÞ: Îß; ÎàB Îá5 Îâ7 Îã8 Îä7 Îå7 ÎæA Îç8 Îè9 Îé5 Îê8 Îë= Îì@ Îí= Îî? ÎïC ÎðA Îñ> Îò> Îó6 Îô6 Îõ: Îö< Î÷= Îø: Îù? Îú= Îû= ÎüC Îý> ÎþA Ï¡= Ï¢: Ï£@ Ϥ7 Ï¥? ϦC ϧ8 Ϩ= Ï©= ϪE Ï«7 Ϭ; Ï­< Ï®7 ϯ: ϰ= ϱ= ϲ: ϳ> Ï´7 ϵ: ϶@ Ï·6 ϸF Ϲ> Ϻ9 Ï»4 ϼC Ͻ< Ͼ6 Ï¿@ ÏÀ? ÏÁ: ÏÂ8 ÏÃ= ÏÄ9 ÏÅ= ÏÆ: ÏÇ< ÏÈ8 ÏÉG ÏÊ6 ÏË6 ÏÌD ÏÍ= ÏÎA ÏÏ? ÏÐ8 ÏÑ< ÏÒ= ÏÓ< С4 Т4 У5 Ф3 Ð¥5 Ц1 Ч5 Ш1 Щ2 Ъ8 Ы: Ь= Э1 Ю@ Я7 а< б5 в3 г8 д8 е2 ж4 з9 и: й= к4 л4 м4 н4 о4 п5 ÐÀ5 ÐÁ5 ÐÂ5 ÐÃ6 ÐÄ6 ÐÅ7 ÐÆ7 ÐÇ7 ÐÈ7 ÐÉ7 ÐÊ7 ÐË8 ÐÌ8 ÐÍ8 ÐÎ8 ÐÏ8 ÐÐ8 ÐÑ8 ÐÒ8 ÐÓ8 ÐÔ8 ÐÕ8 ÐÖ@ Ð×9 ÐØ9 ÐÙ9 ÐÚ9 ÐÛ9 ÐÜ9 ÐÝ9 ÐÞ9 Ðß9 Ðà9 Ðá: Ðâ: Ðã: Ðä: Ðå: Ðæ: Ðç6 Ðè: Ðé: Ðê: Ðë: Ðì: Ðí: Ðî: Ðï: Ðð; Ðñ; Ðò= Ðó; Ðô; Ðõ; Ðö; Ð÷; Ðø; Ðù; Ðú< Ðû< Ðü< Ðý= Ðþ= Ñ¡= Ñ¢= Ñ£= Ѥ= Ñ¥> Ѧ> ѧ> Ѩ> Ñ©> Ѫ> Ñ«? Ѭ? Ñ­? Ñ®? ѯ? Ѱ@ ѱ@ Ѳ@ ѳ@ Ñ´A ѵE ѶE Ñ·F ѸF ѹ2 Ѻ3 Ñ»8 Ѽ7 ѽ8 Ѿ> Ñ¿F ÑÀ8 ÑÁ9 ÑÂ4 ÑÃ@ ÑÄ2 ÑÅ5 ÑÆ5 ÑÇ5 ÑÈ7 ÑÉ9 ÑÊ: ÑË; ÑÌ2 ÑÍ: ÑÎ: ÑÏ: ÑÐ> ÑÑ@ ÑÒ2 ÑÓ6 ÑÔ6 ÑÕ6 ÑÖ6 Ñ×7 ÑØ8 ÑÙ: ÑÚ: ÑÛ? ÑÜ2 ÑÝ; ÑÞ6 Ñß8 Ñà; Ñá2 Ñâ9 Ñã3 Ñä5 Ñå6 Ñæ6 Ñç7 Ñè7 Ñé8 Ñê8 Ñë8 Ñì9 Ñí9 Ñî9 Ñï9 Ñð: Ññ: Ñò; Ñó< Ñô< Ñõ< Ñö= Ñ÷= Ñø? Ñù@ Ñú@ Ñû; Ñü? Ñý@ Ñþ@ Ò¡@ Ò¢7 Ò£7 Ò¤8 Ò¥8 Ò¦9 Ò§: Ò¨; Ò©< Òª= Ò«= Ò¬= Ò­= Ò®@ Ò¯A Ò°D Ò±2 Ò²5 Ò³6 Ò´7 Òµ9 Ò¶; Ò·; Ò¸2 Ò¹2 Òº7 Ò»= Ò¼> Ò½? Ò¾2 Ò¿; ÒÀ4 ÒÁ4 ÒÂ5 ÒÃ5 ÒÄ6 ÒÅ< ÒÆ4 ÒÇ2 ÒÈ5 ÒÉ5 ÒÊ9 ÒË8 ÒÌ2 ÒÍ9 ÒÎ; ÒÏ< ÒÐ< ÒÑ> ÒÒ> ÒÓ2 ÒÔ; ÒÕA ÒÖB Ò×: ÒØ; ÒÙA ÒÚ5 ÒÛ5 ÒÜ5 ÒÝ5 ÒÞ6 Òß7 Òà7 Òá7 Òâ7 Òã7 Òä7 Òå7 Òæ7 Òç7 Òè7 Òé8 Òê8 Òë8 Òì8 Òí8 Òî8 Òï9 Òð8 Òñ8 Òò8 Òó8 Òô8 Òõ8 Òö8 Ò÷9 Òø9 Òù9 Òú9 Òû9 Òü9 Òý9 Òþ9 Ó¡9 Ó¢9 Ó£9 Ó¤9 Ó¥9 Ó¦9 Ó§: Ó¨: Ó©: Óª: Ó«: Ó¬: Ó­: Ó®: Ó¯: Ó°; Ó±; Ó²; Ó³; Ó´; Óµ; Ó¶; Ó·; Ó¸; Ó¹; Óº; Ó»; Ó¼< Ó½< Ó¾9 Ó¿< ÓÀ< ÓÁ< ÓÂ< ÓÃ< ÓÄ< ÓÅ< ÓÆ< ÓÇ< ÓÈ< ÓÉ< ÓÊ< ÓË= ÓÌ= ÓÍ= ÓÎ= ÓÏ= ÓÐ= ÓÑ= ÓÒ> ÓÓ> ÓÔ> ÓÕ> ÓÖ> Ó×> ÓØ> ÓÙ? ÓÚ? ÓÛA ÓÜ? ÓÝ? ÓÞ? Óß? Óà@ Óá@ Óâ@ Óã@ Óä@ ÓåA ÓæA ÓçA ÓèB ÓéA ÓêA ÓëC ÓìC ÓíD ÓîD ÓïE ÓðE ÓñE ÓòE ÓóE ÓôF ÓõF ÓöH Ó÷H Óø3 Óù7 Óú8 Óû9 Óü9 Óý: Óþ; Ô¡; Ô¢; Ô£< Ô¤= Ô¥> Ô¦> Ô§= Ô¨@ Ô©5 Ôª6 Ô«6 Ô¬7 Ô­7 Ô®7 Ô¯7 Ô°8 Ô±: Ô²9 Ô³8 Ô´8 Ôµ8 Ô¶9 Ô·9 Ô¸9 Ô¹9 Ôº9 Ô»9 Ô¼: Ô½: Ô¾: Ô¿: ÔÀ: ÔÁ; ÔÂ: ÔÃ; ÔÄ; ÔÅ< ÔÆ< ÔÇ> ÔÈ< ÔÉ= ÔÊ= ÔË= ÔÌ= ÔÍ= ÔÎ< ÔÏ> ÔÐ> ÔÑ? ÔÒ? ÔÓ? ÔÔ@ ÔÕC ÔÖA Ô×? ÔØ? ÔÙ@ ÔÚA ÔÛA ÔÜA ÔÝB ÔÞB ÔßD ÔàC ÔáD ÔâC Ôã7 Ôä< Ôå< Ôæ< Ôç= Ôè> Ôé3 Ôê3 Ôë> Ôì6 Ôí; Ôî> Ôï4 Ôð4 Ôñ5 Ôò6 Ôó7 Ôô9 Ôõ9 Ôö9 Ô÷9 Ôø: Ôù: Ôú< Ôû< Ôü= Ôý> Ôþ> Õ¡6 Õ¢6 Õ£7 Õ¤7 Õ¥8 Õ¦7 Õ§8 Õ¨8 Õ©9 Õª9 Õ«7 Õ¬9 Õ­9 Õ®: Õ¯: Õ°: Õ±: Õ²: Õ³: Õ´; Õµ; Õ¶; Õ·; Õ¸; Õ¹; Õº; Õ»< Õ¼= Õ½= Õ¾= Õ¿= ÕÀ= ÕÁ> ÕÂ> ÕÃ> ÕÄ> ÕÅ> ÕÆ? ÕÇ? ÕÈ? ÕÉ? ÕÊ@ ÕËA ÕÌ= ÕÍA ÕÎA ÕÏC ÕÐD ÕÑD ÕÒD ÕÓ3 ÕÔ5 ÕÕ7 ÕÖ7 Õ×8 ÕØ9 ÕÙ; ÕÚ= ÕÛ> ÕÜ@ ÕÝ7 ÕÞA Õß3 Õà5 Õá: Õâ: Õã; Õä; Õå; Õæ< Õç< Õè> Õé> Õê> Õë> Õì> Õí? Õî@ ÕïD ÕðC Õñ: Õò; Õó; Õô> Õõ5 Õö= Õ÷3 Õø7 Õù3 Õú4 Õû7 Õü8 Õý9 Õþ: Ö¡: Ö¢9 Ö£< Ö¤E Ö¥3 Ö¦4 Ö§5 Ö¨6 Ö©7 Öª7 Ö«7 Ö¬7 Ö­8 Ö®8 Ö¯8 Ö°8 Ö±8 Ö²8 Ö³8 Ö´9 Öµ9 Ö¶: Ö·: Ö¸: Ö¹: Öº> Ö»: Ö¼; Ö½; Ö¾; Ö¿< ÖÀ; ÖÁ; ÖÂ; ÖÃ; ÖÄ; ÖÅ; ÖÆ; ÖÇ; ÖÈ< ÖÉ< ÖÊ< ÖË< ÖÌ= ÖÍ= ÖÎ= ÖÏ> ÖÐ> ÖÑ> ÖÒ? ÖÓ? ÖÔ@ ÖÕ@ ÖÖA Ö×? ÖØA ÖÙA ÖÚD ÖÛE ÖÜF ÖÝF ÖÞG Öß3 Öà7 Öá3 Öâ7 Öã7 Öä8 Öå8 Öæ8 Öç8 Öè; Öé; Öê< Öë< Öì< Öí= Öî> Öï> Öð? Öñ? Öò? Öó< Öô6 Öõ6 Öö3 Ö÷> Öø3 Öù9 Öú< Öû< Öü= Öý> Öþ> ס> ×¢? ×£? פ? ×¥? צ? ×§? ר@ ש@ תC ׫E ׬I ×­D ×®3 ׯ8 ×°3 ×±7 ײ: ׳B ×´@ ×µ3 ×¶< ×·4 ׸8 ×¹9 ׺; ×»= ×¼? ×½A ×¾F ׿9 ×À3 ×Á9 ×Â; ×Ã= ×Ä3 ×Å< ׯ3 ×Ç7 ×È8 ×É8 ×Ê8 ×Ë9 ×Ì9 ×Í: ×Î9 ×Ï; ×Ð; ×Ñ; ×Ò; ×Ó< ×Ô= ×Õ@ ×Ö6 ××7 ר7 ×Ù7 ×Ú7 ×Û8 ×Ü< ×Ý8 ×Þ8 ×ß9 ×à8 ×á8 ×â8 ×ã9 ×ä9 ×å8 ׿8 ×ç8 ×è8 ×é8 ×ê8 ×ë: ×ì: ×í9 ×î: ×ï9 ×ð9 ×ñ9 ×ò9 ×ó: ×ô9 ×õ9 ×ö9 ×÷9 ×ø9 ×ù: ×ú: ×û: ×ü; ×ý: ×þ: Ø¡: Ø¢: Ø£: ؤ: Ø¥: ئ: ا: ب< Ø©; ت< Ø«; ج; Ø­7 Ø®; د; ذ; ر; ز= س< Ø´= ص< ض= Ø·< ظ< ع< غ< Ø»< ؼ< ؽ< ؾ= Ø¿< ØÀ> ØÁ= ØÂ> ØÃ= ØÄ= ØÅ> ØÆ= ØÇ> ØÈ= ØÉ= ØÊ> ØË= ØÌ> ØÍ> ØÎ> ØÏ? ØÐ> ØÑ? ØÒ> ØÓ> ØÔ> ØÕ> ØÖ> Ø×? ØØ> ØÙ> ØÚ@ ØÛ@ ØÜ? ØÝ? ØÞ? Øß? Øà@ Øá@ Øâ? Øã? Øä@ Øå@ ØæA ØçC Øè@ ØéA Øê@ Øë@ ØìA Øí@ Øî@ ØïA ØðB ØñC ØòD ØóB ØôF ØõE ØöE Ø÷E ØøG Øù4 Øú5 Øû6 Øü6 Øý8 Øþ; Ù¡< Ù¢= Ù£> Ù¤? Ù¥@ Ù¦A Ù§B Ù¨9 Ù©4 Ùª6 Ù«6 Ù¬6 Ù­6 Ù®6 Ù¯7 Ù°7 Ù±7 Ù²7 Ù³7 Ù´7 Ùµ7 Ù¶8 Ù·7 Ù¸7 Ù¹8 Ùº8 Ù»8 Ù¼9 Ù½: Ù¾8 Ù¿@ ÙÀ8 ÙÁ9 ÙÂ8 ÙÃ8 ÙÄ8 ÙÅ8 ÙÆ8 ÙÇ8 ÙÈ9 ÙÉ9 ÙÊ9 ÙË9 ÙÌ9 ÙÍ: ÙÎ9 ÙÏ9 ÙÐ: ÙÑ: ÙÒ: ÙÓ= ÙÔ: ÙÕ; ÙÖ; Ù×; ÙØ; ÙÙ; ÙÚ< ÙÛ; ÙÜ; ÙÝ; ÙÞ; Ùß; Ùà; Ùá< Ùâ< Ùã< Ùä< Ùå< Ùæ< Ùç< Ùè< Ùé< Ùê= Ùë> Ùì= Ùí= Ùî= Ùï= ÙðE Ùñ= Ùò= Ùó= Ùô> Ùõ? Ùö> Ù÷> ÙøG Ùù? Ùú? Ùû? Ùü? Ùý? Ùþ@ Ú¡@ Ú¢@ Ú£@ Ú¤@ Ú¥@ Ú¦A Ú§@ Ú¨A Ú©A Úª@ Ú«A Ú¬A Ú­8 Ú®A Ú¯A Ú°H Ú±B Ú²B Ú³B Ú´B ÚµC Ú¶B Ú·D Ú¸E Ú¹B ÚºF Ú»G Ú¼G Ú½4 Ú¾4 Ú¿6 ÚÀ6 ÚÁ7 ÚÂ9 ÚÃ: ÚÄ; ÚÅ; ÚÆ; ÚÇ; ÚÈ< ÚÉ< ÚÊ> ÚË? ÚÌA ÚÍB ÚÎG ÚÏ; ÚÐ= ÚÑ9 ÚÒB ÚÓ: ÚÔ: ÚÕ: ÚÖ: Ú×; ÚØ= ÚÙB ÚÚ@ ÚÛ4 ÚÜ5 ÚÝ7 ÚÞ8 Úß8 Úà8 Úá8 Úâ8 Úã9 Úä9 Úå9 Úæ9 Úç: Úè: Úé: Úê: Úë; Úì; Úí; Úî; Úï; Úð; Úñ; Úò< Úó< Úô= Úõ= Úö= Ú÷= Úø= Úù> Úú@ Úû@ Úü@ Úý@ Úþ@ Û¡@ Û¢@ Û£A Û¤B Û¥C Û¦9 Û§D Û¨E Û©4 Ûª7 Û«9 Û¬9 Û­; Û®< Û¯B Û°D Û±E Û²5 Û³6 Û´6 Ûµ6 Û¶6 Û·6 Û¸7 Û¹7 Ûº7 Û»7 Û¼7 Û½7 Û¾8 Û¿8 ÛÀ8 ÛÁ8 ÛÂ8 ÛÃ8 ÛÄ8 ÛÅ8 ÛÆ8 ÛÇ8 ÛÈ9 ÛÉ9 ÛÊ9 ÛË9 ÛÌ9 ÛÍ9 ÛÎ9 ÛÏ9 ÛÐ9 ÛÑ9 ÛÒ9 ÛÓ9 ÛÔ9 ÛÕ9 ÛÖ9 Û×9 ÛØA ÛÙ: ÛÚ: ÛÛ: ÛÜ: ÛÝ: ÛÞ: Ûß: Ûà; Ûá: Ûâ: Ûã: Ûä; Ûå; Ûæ; Ûç; Ûè; Ûé; Ûê; Ûë; Ûì; ÛíB Ûî; Ûï; Ûð; Ûñ; Ûò; Ûó< Ûô; Ûõ; Ûö< Û÷< Ûø< Ûù< Ûú< Ûû< Ûü< Ûý< Ûþ< Ü¡< Ü¢< Ü£< ܤ= Ü¥< ܦ< ܧ< ܨ< Ü©< ܪ< Ü«< ܬ< Ü­< Ü®< ܯ< ܰ< ܱ< ܲ< ܳ= Ü´= ܵ= ܶ= Ü·= ܸ= ܹ= ܺ= Ü»= ܼ= ܽ= ܾ= Ü¿= ÜÀ= ÜÁ= ÜÂ= ÜÃ= ÜÄ= ÜÅ> ÜÆ> ÜÇ> ÜÈ> ÜÉ> ÜÊ> ÜË> ÜÌ> ÜÍ> ÜÎ> ÜÏ> ÜÐ> ÜÑ> ÜÒ> ÜÓ> ÜÔ> ÜÕ> ÜÖ> Ü×> ÜØ> ÜÙ> ÜÚ? ÜÛ? ÜÜ? ÜÝ? ÜÞF Üß? Üà? Üá? Üâ? Üã> Üä? Üå? Üæ? Üç? Üè? Üé? ÜêB Üë? Üì? Üí@ Üî? Üï@ Üð@ Üñ@ Üò@ Üó? Üô@ Üõ@ Üö@ Ü÷@ Üø? ÜùA ÜúA ÜûA ÜüA ÜýA ÜþA Ý¡A Ý¢D Ý£B ݤB Ý¥B ݦB ݧB ݨB Ý©C ݪC Ý«C ݬA Ý­C Ý®D ݯE ݰE ݱD ݲE ݳG Ý´I ݵM ݶM Ý·; ݸ; ݹ< ݺ< Ý»= ݼ= ݽ= ݾ> Ý¿? ÝÀ@ ÝÁ@ ÝÂA ÝÃB ÝÄF ÝÅB ÝÆ4 ÝÇ8 ÝÈ8 ÝÉ9 ÝÊ9 ÝË; ÝÌ< ÝÍ< ÝÎ> ÝÏ? ÝÐ@ ÝÑ@ ÝÒB ÝÓE ÝÔC ÝÕ4 ÝÖ: Ý×< ÝØ? ÝÙ4 ÝÚ> ÝÛ8 ÝÜ; ÝÝ; ÝÞ< Ýß< Ýà? ÝáA Ýâ8 Ýã4 Ýä8 Ýå: Ýæ: Ýç7 Ýè6 Ýé6 Ýê7 Ýë7 Ýì7 Ýí7 Ýî7 Ýï7 Ýð7 Ýñ7 Ýò7 Ýó7 Ýô7 Ýõ8 Ýö8 Ý÷8 Ýø8 Ýù8 Ýú8 Ýû8 Ýü8 Ýý8 Ýþ8 Þ¡8 Þ¢7 Þ£8 Þ¤8 Þ¥8 Þ¦9 Þ§9 Þ¨9 Þ©9 Þª9 Þ«9 Þ¬9 Þ­9 Þ®9 Þ¯9 Þ°9 Þ±: Þ²: Þ³: Þ´: Þµ: Þ¶: Þ·: Þ¸: Þ¹A Þº: Þ»; Þ¼; Þ½; Þ¾; Þ¿; ÞÀ; ÞÁ; ÞÂ; ÞÃ; ÞÄ; ÞÅ; ÞÆ; ÞÇ; ÞÈ; ÞÉ; ÞÊ; ÞË; ÞÌ; ÞÍ; ÞÎ; ÞÏ< ÞÐ< ÞÑ< ÞÒ< ÞÓ< ÞÔ< ÞÕ< ÞÖ< Þ×< ÞØ< ÞÙ< ÞÚ< ÞÛ< ÞÜ< ÞÝ< ÞÞ< Þß< Þà> Þá< Þâ< Þã< Þä= Þå= Þæ= Þç= Þè= Þé= Þê= Þë= Þì= Þí= Þî? Þï= Þð= Þñ= Þò= Þó? Þô> ÞõE Þö> Þ÷> Þø> Þù? Þú> Þû> Þü> Þý> Þþ> ß¡> ߢ> ߣ> ߤ? ߥ? ߦ? ß§? ߨ? ß©? ߪ? ß«C ߬? ß­? ß®? ߯? ß°? ß±? ß²@ ß³? ß´@ ßµ@ ß¶@ ß·@ ߸@ ß¹@ ߺ@ ß»A ß¼A ß½A ß¾A ß¿A ßÀA ßÁA ßÂA ßÃB ßÄB ßÅB ߯B ßÇB ßÈB ßÉB ßÊC ßËC ßÌ? ßÍC ßÎC ßÏD ßÐD ßÑD ßÒD ßÓF ßÔI ßÕ8 ßÖ8 ß×9 ߨ; ßÙ9 ßÚ9 ßÛ9 ßÜ9 ßÝ: ßÞ: ßß: ßà: ßá; ßâ; ßã< ßä< ßå= ßæ= ßç> ßè= ßé= ßê= ßë= ßì= ßí> ßîB ßï> ßð> ßñ? ßò? ßó@ ßô@ ßõ@ ßö@ ß÷@ ßø@ ßù@ ßúA ßûA ßüA ßýA ßþB à¡B à¢B à£C à¤D à¥E à¦M à§8 à¨8 à©9 àª< à«4 à¬9 à­4 à®8 à¯A à°< à±C à²9 à³; à´< àµ; à¶< à·> à¸> à¹C àºD à»7 à¼6 à½7 à¾7 à¿7 àÀ8 àÁ8 àÂ9 àÃ9 àÄ9 àÅ: àÆ: àÇ; àÈ; àÉ; àÊ; àË; àÌ; àÍ< àÎ< àÏ< àÐ< àÑ= àÒ? àÓ> àÔ@ àÕ? àÖ@ à×@ àØA àÙC àÚB àÛD àÜC àÝ9 àÞ9 àß9 àà9 àá9 àâ: àã: àä: àå@ àæ; àç> àè< àé; àê< àë< àì= àí= àî= àï= àð= àñ= àò? àó> àô> àõ> àö= à÷? àø? àù@ àúB àûC àüD àýE àþ: á¡; á¢C á£7 á¤8 á¥9 á¦9 á§9 á¨9 á©; áª; á«> á¬> á­> á®@ á¯@ á°? á±B á²B á³= á´< áµ7 á¶7 á·8 á¸9 á¹9 áº9 á»: á¼9 á½: á¾; á¿; áÀ; áÁ< áÂ< áÃ= áÄ= áÅC áÆC áÇ< áÈF áÉF áÊ@ áË7 áÌ8 áÍ8 áÎ9 áÏ9 áÐ: áÑ: áÒ: áÓ; áÔ: áÕ: áÖ: á×: áØ; áÙ; áÚ; áÛ< áÜ< áÝ< áÞ= áß= áà= áá= áâ= áã= áä= áå= áæ> áç> áè> áé? áê? áë? áì? áí? áî? áï@ áð@ áñ@ áòA áóA áôA áõB áöB á÷C áøD áùE áúE áûE áüE áýF áþG â¡H â¢5 â£9 â¤< â¥7 â¦7 â§9 â¨: â©; âª< â«< â¬= â­? â®: â¯< â°> â±> â²? â³8 â´: âµ; â¶; â·= â¸> â¹@ âº@ â»A â¼D â½9 â¾9 â¿9 âÀ9 âÁ: âÂ: âÃ: âÄ; âÅ; âÆ: âÇ; âÈ; âÉ< âÊ= âË= âÌ= âÍ= âÎ= âÏ> âÐ> âÑ> âÒ? âÓ? âÔ? âÕ@ âÖ@ â×A âØA âÙA âÚB âÛB âÜB âÝB âÞC âßD âàH âáJ ââ9 âã7 âä= âå8 âæ9 âç9 âèD âé: âêD âë; âì= âí< âî= âï= âð= âñ= âò> âó> âô> âõ> âö? â÷? âø? âù? âú? âû? âü? âý? âþ@ ã¡@ ã¢@ ã£A ã¤A ã¥B ã¦B ã§B ã¨C ã©D ãªD ã«8 ã¬: ã­: ã®: ã¯: ã°: ã±9 ã²= ã³= ã´> ãµ? ã¶A ã·A ã¸A ã¹B ãºF ã»9 ã¼9 ã½8 ã¾9 ã¿: ãÀ: ãÁ: ãÂ: ãÃ< ãÄ< ãÅ= ãÆ= ãÇ= ãÈ= ãÉ= ãÊ> ãË? ãÌ? ãÍ? ãÎ? ãÏA ãÐA ãÑB ãÒB ãÓC ãÔE ãÕF ãÖ8 ã×9 ãØ: ãÙ< ãÚ; ãÛ< ãÜ< ãÝ> ãÞE ãß? ãà@ ãáB ãâB ãã? ãäB ãåD ãæF ãç7 ãè8 ãé9 ãê9 ãë: ãì: ãí: ãî; ãï< ãð< ãñ> ãò> ãó9 ãô: ãõ: ãö: ã÷; ãø; ãù; ãú; ãû; ãü; ãý; ãþ< ä¡= ä¢< ä£< ä¤: ä¥< ä¦< ä§= ä¨= ä©= äª= ä«= ä¬= ä­= ä®= ä¯> ä°> ä±> ä²> ä³> ä´> äµ> ä¶> ä·> ä¸< ä¹> äº? ä»? ä¼? ä½> ä¾? ä¿? äÀ@ äÁ@ äÂ@ äÃA äÄ@ äÅ@ äÆF äÇA äÈA äÉA äÊA äËA äÌA äÍA äÎA äÏB äÐB äÑB äÒB äÓC äÔC äÕC äÖD ä×E äØE äÙD äÚC äÛE äÜF äÝF äÞG äßE äàG äáI äâ8 äã: ää: äå< äæ< äç< äè< äé< äê< äë= äì= äí= äî= äï> äð> äñ> äò? äó? äô@ äõ@ äöA ä÷A äøF äùD äúE äûF äüI äý7 äþ9 å¡9 å¢: å£: å¤: å¥; å¦; å§; å¨; å©; åª; å«; å¬< å­< å®< å¯< å°< å±< å²< å³< å´= åµ= å¶= å·= å¸= å¹= åº> å»> å¼> å½> å¾> å¿> åÀ> åÁA åÂ> åÃ> åÄ? åÅ> åÆ> åÇ> åÈ? åÉ? åÊ? åË? åÌ? åÍ? åÎ? åÏ? åÐ@ åÑ@ åÒ@ åÓ@ åÔA åÕ@ åÖ@ å×@ åØ@ åÙA åÚA åÛA åÜA åÝA åÞA åßA åàA åáA åâB åãB åäB ååB åæB åçB åèC åéC åêC åëD åìD åíD åî> åïD åðD åñD åòE åóE åôE åõF åöE å÷G åøH åùG åúE åûI åüF åý9 åþ: æ¡A æ¢D æ£E æ¤F æ¥H æ¦6 æ§7 æ¨8 æ©9 æª: æ«: æ¬= æ­= æ®= æ¯? æ°B æ±C æ²C æ³H æ´F æµ8 æ¶: æ·; æ¸; æ¹; æº= æ»? æ¼@ æ½C æ¾? æ¿C æÀC æÁD æÂ: æÃ: æÄ; æÅ< æÆ< æÇ> æÈ? æÉ? æÊA æËB æÌE æÍ: æÎ: æÏ< æÐ6 æÑ: æÒ: æÓ; æÔ= æÕ@ æÖ: æ×: æØ; æÙ; æÚ< æÛ= æÜ> æÝ> æÞ> æß? æàA æáA æâA æãB æäD æåF ææ6 æç= æè= æé= æê7 æë7 æì7 æí8 æî8 æï8 æð9 æñ9 æò9 æó9 æô9 æõ9 æö9 æ÷9 æø: æù: æú; æû; æü; æý; æþ< ç¡= ç¢< ç£< ç¤< ç¥< ç¦: ç§= ç¨= ç©= çª= ç«= ç¬> ç­> ç®> ç¯> ç°> ç±? ç²? ç³? ç´? çµ= ç¶? ç·@ ç¸@ ç¹@ çºA ç»A ç¼A ç½A ç¾A ç¿A çÀA çÁB çÂB çÃD çÄC çÅA çÆD çÇG çÈI çÉ? çÊ> çË@ çÌ9 çÍ9 çÎ; çÏ= çÐ= çÑB çÒ8 çÓ: çÔ? çÕ: çÖ: ç×; çØ; çÙ= çÚ@ çÛ@ çÜA çÝA çÞB çßC çàC çáD çâE çãF çä: çåA çæH çç6 çè5 çé6 çê6 çë7 çì7 çí: çî7 çï8 çð8 çñ8 çò8 çó8 çô8 çõ8 çö: ç÷8 çø8 çù8 çú8 çû8 çü8 çý8 çþ8 è¡9 è¢9 è£9 è¤: è¥9 è¦9 è§9 è¨9 è©9 èª9 è«9 è¬9 è­9 è®: è¯: è°: è±: è²: è³: è´: èµ: è¶: è·: è¸: è¹: èº: è»: è¼: è½: è¾: è¿; èÀ; èÁ; èÂ; èÃ; èÄ; èÅ; èÆ; èÇ; èÈ; èÉ; èÊ; èË; èÌ; èÍ; èÎ; èÏ: èÐ= èÑ? èÒ< èÓ= èÔ= èÕ= èÖ@ è×< èØ< èÙ< èÚ= èÛ< èÜ< èÝ< èÞ< èß< èà< èá< èâ< èã= èä< èå= èæ= èç= èè= èé= èê= èë= èì= èí= èî= èï= èð= èñ> èò> èó> èô> èõ> èö? è÷> èø> èù> èú? èû@ èü@ èý@ èþ@ é¡@ é¢C é£? é¤? é¥@ é¦@ é§@ é¨@ é©@ éª@ é«@ é¬@ é­@ é®B é¯@ é°@ é±@ é²@ é³@ é´A éµ> é¶B é·A é¸A é¹B éºB é»B é¼B é½C é¾C é¿C éÀC éÁC éÂC éÃC éÄC éÅD éÆD éÇF éÈ6 éÉ7 éÊ: éË= éÌA éÍ8 éÎ: éÏ: éÐ: éÑ: éÒ: éÓ: éÔ; éÕ; éÖ; é×; éØ; éÙ; éÚE éÛ; éÜ< éÝ< éÞ< éß< éà< éá< éâ< éã= éä= éå= éæ= éç= éè= éé= éê= éë= éì= éí= éî> éï> éð> éñ> éò> éó> éô> éõ? éö? é÷? éø? éù? éú? éû? éü? éý? éþ? ê¡? ê¢? ê£? ê¤C ê¥@ ê¦@ ê§@ ê¨A ê©A êªA ê«A ê¬A ê­A ê®A ê¯A ê°A ê±@ ê²A ê³A ê´B êµB ê¶B ê·C ê¸C ê¹C êºC ê»C ê¼C ê½B ê¾D ê¿D êÀD êÁE êÂE êÃG êÄH êÅH êÆF êÇI êÈ: êÉ9 êÊ; êË= êÌ@ êÍH êÎ8 êÏ: êÐ: êÑ; êÒ9 êÓ9 êÔ; êÕ9 êÖ9 ê×: êØ: êÙ: êÚ: êÛ: êÜ: êÝ; êÞ; êß; êà; êá; êâ; êã= êä= êå< êæ= êç> êè= êé= êê> êë= êì= êí= êî> êï> êð> êñA êò? êó? êô? êõ? êö@ ê÷A êøA êù@ êú@ êûA êü> êýB êþC ë¡C ë¢D ë£D ë¤D ë¥E ë¦F ë§F ë¨6 ë©< ëªC ë«I ë¬; ë­< ë®> ë¯@ ë°@ ë±A ë²A ë³B ë´D ëµF ë¶F ë·I ë¸< ë¹= ëº< ë»= ë¼B ë½D ë¾9 ë¿: ëÀ: ëÁ: ëÂ; ëÃ; ëÄ; ëÅ< ëÆ< ëÇ< ëÈ< ëÉ< ëÊ< ëË= ëÌ= ëÍ= ëÎ= ëÏ= ëÐ= ëÑ= ëÒ> ëÓ> ëÔ> ëÕ> ëÖ> ë×> ëØ> ëÙ? ëÚ? ëÛ? ëÜ? ëÝ? ëÞ@ ëß@ ëà@ ëá@ ëâ@ ëã@ ëä@ ëå@ ëæ@ ëç@ ëèA ëéA ëêA ëë@ ëìA ëíA ëîA ëïA ëðB ëñB ëòB ëóB ëôB ëõB ëöC ë÷C ëøC ëùC ëúC ëûC ëüC ëýC ëþD ì¡D ì¢D ì£D ì¤E ì¥D ì¦F ì§G ì¨G ì©H ìªH ì«H ì¬I ì­J ì®; ì¯A ì°A ì±: ì²? ì³@ ì´B ìµ7 ì¶= ì·@ ì¸7 ì¹: ìº< ì»= ì¼= ì½= ì¾> ì¿? ìÀA ìÁ; ìÂB ìÃ; ìÄ; ìÅ; ìÆ< ìÇ= ìÈ< ìÉ; ìÊ; ìË= ìÌ< ìÍ? ìÎ? ìÏ? ìÐA ìÑA ìÒA ìÓB ìÔB ìÕC ìÖC ì×D ìØD ìÙE ìÚE ìÛF ìÜ= ìÝE ìÞF ìß< ìà@ ìá7 ìâ: ìã< ìä> ìå; ìæ; ìç; ìè< ìé< ìê< ìë< ìì< ìí< ìî= ìï= ìð= ìñ= ìò> ìó> ìô> ìõ> ìö? ì÷? ìø? ìù? ìú@ ìû@ ìü@ ìý@ ìþA í¡A í¢A í£A í¤A í¥A í¦B í§B í¨B í©? íªB í«B í¬C í­C í®C í¯D í°D í±D í²D í³E í´E íµF í¶F í·F í¸G í¹K íºI í»: í¼< í½D í¾= í¿@ íÀC íÁH íÂ8 íÃ; íÄ; íÅ< íÆ< íÇ< íÈ= íÉ= íÊ= íË> íÌ> íÍ? íÎ> íÏ? íÐ? íÑ? íÒ= íÓ? íÔ@ íÕ@ íÖ@ í×A íØA íÙA íÚB íÛB íÜB íÝC íÞD íßE íàF íáG íâG íã< íä= íå> íæC íçE íè5 íé8 íê9 íë9 íì8 íí9 íîB íï: íð: íñ: íò: íó; íô; íõ; íö; í÷; íø; íù; íú; íû< íü< íý< íþ: î¡< î¢= î£= î¤= î¥; î¦= î§= î¨= î©> îª> î«? î¬? î­@ î®@ î¯@ î°A î±A î²A î³A î´C îµB î¶G î·7 î¸8 î¹8 îº8 î»: î¼: î½; î¾: î¿< îÀ= îÁ> îÂ? îÃ? îÄ9 îÅ; îÆ; îÇ< îÈ< îÉ= îÊ> îË> îÌ? îÍ? îÎ? îÏA îÐB îÑB îÒB îÓD îÔD îÕE îÖH î×I îØ< îÙD îÚB îÛ: îÜ: îÝ: îÞ: îß; îà; îá; îâ< îã< îä< îå< îæ< îç< îè= îé= îê= îë= îì= îí= îî> îï= îð= îñ= îò> îó> îô> îõ> îö= î÷? îø? îù? îú? îû@ îü@ îý@ îþ@ ï¡@ ï¢@ ï£@ ï¤@ ï¥@ ï¦@ ï§@ ï¨A ï©A ïªA ï«A ï¬A ï­B ï®B ï¯B ï°B ï±B ï²C ï³C ï´C ïµC ï¶C ï·C ï¸C ï¹C ïºC ï»C ï¼D ï½D ï¾D ï¿D ïÀD ïÁD ïÂE ïÃE ïÄE ïÅD ïÆE ïÇF ïÈF ïÉF ïÊG ïËG ïÌG ïÍG ïÎH ïÏ< ïÐI ïÑJ ïÒJ ïÓK ïÔG ïÕK ïÖK ï×L ïØL ïÙ9 ïÚ; ïÛ; ïÜ< ïÝ< ïÞ= ïß= ïà= ïá> ïâ> ïã? ïä@ ïå@ ïæ@ ïç@ ïèA ïéA ïêA ïëA ïìA ïíB ïîB ïïB ïðC ïñD ïòE ïóE ïô6 ïõ7 ïö7 ï÷7 ïø8 ïù9 ïú9 ïû9 ïü; ïý; ïþ: ð¡; ð¢; ð£; ð¤< ð¥< ð¦= ð§> ð¨> ð©> ðª@ ð«A ð¬A ð­B ð®B ð¯D ð°8 ð±A ð²8 ð³= ð´< ðµ= ð¶= ð·A ð¸B ð¹@ ðº@ ð»= ð¼? ð½? ð¾? ð¿@ ðÀ@ ðÁ@ ðÂ@ ðÃ@ ðÄA ðÅB ðÆC ðÇD ðÈE ðÉF ðÊF ðËH ðÌH ðÍH ðÎH ðÏI ðÐ@ ðÑ? ðÒ> ðÓ@ ðÔG ðÕ; ðÖ< ð×< ðØ= ðÙ> ðÚ> ðÛ> ðÜ> ðÝ> ðÞ? ðß? ðà? ðáA ðâB ðãB ðäB ðåC ðæC ðçF ðèH ðéH ðê9 ðëC ðì9 ðíG ðîC ðï; ðð> ðñ= ðò= ðó= ðô@ ðõ? ðö? ð÷@ ðø@ ðùA ðúB ðûB ðüF ðýG ðþH ñ¡I ñ¢K ñ£K ñ¤< ñ¥> ñ¦> ñ§A ñ¨D ñ©D ñªE ñ«= ñ¬= ñ­? ñ®? ñ¯@ ñ°@ ñ±@ ñ²A ñ³A ñ´A ñµA ñ¶A ñ·B ñ¸B ñ¹C ñºC ñ»C ñ¼D ñ½D ñ¾E ñ¿E ñÀE ñÁE ñÂE ñÃF ñÄ; ñÅA ñÆB ñÇ< ñÈ< ñÉ> ñÊ? ñË? ñÌ? ñÍ? ñÎ? ñÏ@ ñÐ@ ñÑ@ ñÒ@ ñÓA ñÔA ñÕA ñÖB ñ×B ñØ@ ñÙC ñÚD ñÛD ñÜE ñÝE ñÞD ñßE ñàE ñáF ñâF ñãG ñäG ñåH ñæJ ñçK ñèK ñéL ñêN ñëM ñì= ñí> ñî@ ñïB ñðE ññG ñòG ñóG ñôG ñõ: ñö= ñ÷> ñø> ñù? ñú? ñû? ñü? ñý? ñþ@ ò¡@ ò¢B ò£E ò¤F ò¥G ò¦H ò§I ò¨: ò©? òª@ ò«B ò¬D ò­J ò®: ò¯: ò°? ò±? ò²B ò³B ò´B òµE ò¶H ò·? ò¸@ ò¹@ òº@ ò»@ ò¼@ ò½A ò¾A ò¿A òÀA òÁB òÂB òÃB òÄB òÅB òÆB òÇB òÈC òÉC òÊC òËC òÌC òÍF òÎC òÏC òÐC òÑD òÒD òÓD òÔD òÕD òÖD ò×D òØD òÙD òÚD òÛE òÜD òÝE òÞE òßE òàE òáF òâF òãF òäF òåG òæH òçH òèJ òéK òê= òë9 òì= òí? òî? òï= òð? òñ? òò@ òó@ òôE òõ@ òö@ ò÷A òø@ òù@ òúA òûA òüA òýA òþA ó¡B ó¢B ó£B ó¤B ó¥B ó¦B ó§C ó¨C ó©C óªD ó«C ó¬C ó­D ó®D ó¯D ó°E ó±E ó²E ó³E ó´E óµE ó¶E ó·E ó¸E ó¹F óºF ó»G ó¼G ó½G ó¾G ó¿H óÀL óÁM óÂN óÃ; óÄD óÅI óÆ= óÇ@ óÈA óÉB óÊC óËC óÌC óÍE óÎ; óÏ? óÐ; óÑ; óÒ< óÓC óÔI óÕ? óÖA ó×G óØ@ óÙA óÚA óÛA óÜB óÝD óÞD óßE óàG óáJ óâK óã< óäA óåC óæ= óçH óèI óé> óêB óë8 óìB óíA óî> óï? óðA óñD óòD óóD óôD óõE óöE ó÷F óøF óùH óúH óûH óüF óýB óþA ô¡< ô¢> ô£> ô¤> ô¥? ô¦> gnu_licence0100664000076400007640000004265607667226567011461 0ustar jwbjwb The GNU General Public License (GPL) Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION *0*. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what theProgram does. *1*. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. *2*. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. *3*. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. *4*. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. *5*. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. *6*. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. *7*. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. *8*. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. *9*. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. *10*. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. *NO WARRANTY* *11*. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. *12*. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS * How to Apply These Terms to Your New Programs* If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. one line to give the program's name and a brief idea of what it does. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. xjdic.10100644000076400007640000002551007665050462010415 0ustar jwbjwb.de Ap .PD 0 .IP .PD .. .de At .PP .. .TH XJDIC 1 "MAY 2003" UNIX "XJDIC" .SH NAME XJDIC \- an electronic Japanese-English dictionary program (V2.4) .B NB: this man page contains a summary of the information in the .B xjdic24.inf file. .SH SYNOPSIS .B xjdic [ options ] - The .B XJDIC stand-alone program, or client which allows a user to connect to the .B xjdserver via a network. .B xjdserver [ options ] - The .BR XJDIC server, which carries out dictionary searches on behalf of clients. .B xjdxgen [ options ] dictionary_file - creates the .xjdx index file for dictionary files. .SH DESCRIPTION .BR XJDIC is an electronic Japanese-English dictionary program designed to operate in the X11 window environment. In particular, it must run in an "xterm" environment which has Japanese language support such as provided by "kterm" or internationalized xterm, aixterm, etc. .PP It is based on .BR JDIC and .BR JREADER which were developed to run under MS-DOS on IBM PCs or clones. .PP .BR XJDIC functions as: .PP (a) an English to Japanese dictionary (eiwa jiten), searching for and displaying entries for key-words entered in English; .PP (b) a Japanese to English dictionary (waei jiten), searching for and displaying entries for keywords or phrases entered in Japanese (kanji, hiragana or katakana); .PP (c) a Japanese-English Character dictionary (kanei jiten), capable of selecting kanji characters by JIS code, radical, stroke count, Nelson Index number or reading, and displaying compounds containing that kanji. .PP .BR XJDIC is typically run in a window of its own. The user can then use it as a free-standing on-line dictionary. It can also be used as an accessory when reading or writing text in another window (e.g. reading the "fj" Japanese news groups.) Strings of text, either English or Japanese, can be moved to and from .BR XJDIC using X11's mouse "cut-and-paste" operations. .PP All the Japanese displayed by XJDIC is in kana and kanji, so if you cannot read at least hiragana and katakana, this is not the program for you. The author has no intention whatsoever of producing a version using romanized Japanese. .SH COMMAND LINE OPTIONS Each option begins with a separate "-" identifier. Options are tagged: CL, SA or SV according to whether they are applicable to the Client, Stand-alone or Server versions. Many of the options can also be set in the .B .xjdicrc file. .BR -h [CL,SV,SA] .Ap display list of options and exit. .At .B -E [CL,SA] .Ap instruct the program that it is in EUC mode, and refrain from interpreting the 3-byte kanji of the JIS X 0212 set, which starts with a hex 8F, as Shift-JIS. .At .B -v [CL,SA] .Ap disable the verb de-inflection function. .At .B -V [CL,SA] .Ap disable the use of reverse-video in the display of matches. .At .B -c control_file [CL,SV,SA] .Ap specify the path and name of a control file to be used instead of the default ".xjdicrc" file. .At .B -d dictionary_file [SV,SA] .Ap specify a dictionary file to use (up to 9 may be specified.) .At .B -k kanji_file [SV,SA] .Ap specify a kanji data file to use. .At .B -j j/e/s [CL,SA] .Ap Specify the output coding for Japanese text (j=JIS, e=EUC, s=Shift-JIS) .At .B -P port_no [CL,SV] .Ap instruct the client/server version to use UDP port nnnnn, instead of the default port (47512). .At .B -S server_address [CL] .Ap instruct the client that the server is to be found at the specified network address. .At .B -C clipboard_file [CL,SA] .Ap the name of the file to use as the clipboard. .At .B -K [SV] .Ap prevent the server from establishing itself as a daemon. .SH KEYBOARD COMMANDS .B XJDIC operates by entering text strings of English or Japanese, upon which the matching dictionary entries are displayed. As well, a range of single-character control commands are available to modify the program operation. The commands are: .B ? .Ap display a summary of the keyboard commands .At .B ! .Ap display the GNU GPL document. .At .B # .Ap engage the romaji to katakana conversion feature for the subsequent input. .At .B @ .Ap engage the romaji to hiragana conversion feature for the subsequent input. .At .B & .Ap toggle kana-input mode. .At .B / .Ap toggle the display jukugo with a kanji in a non-initial position mode. .At .B \e\ .Ap go into kanji dictionary mode (see below.) .At .B | .Ap toggle unedited output mode. .At .B = .Ap switch the active dictionary to the next in the list. .At .B ^ .Ap switch the active dictionary to the previous one in the list. .At .B _ .Ap select an active dictionary by number. .At .B $ .Ap specify a list of dictionary numbers to use in global-search mode. .At .B % .Ap toggle global search mode. .At .B ` .Ap toggle multiple dictionary display within global search mode. .At .B * .Ap display buffer-usage statistics (only for the stand-alone version with paged I/O) .At .B [ .Ap toggle exact-match mode. .At .B } .Ap toggle reverse-video display of matched strings mode. .At .B + .Ap toggle selection of priority keys in the dictionary. .At .B ] .Ap initiate search of the extension file (none available yet!). .At .B ' .Ap clear the current one-off filter (if any) and prompt for another. .At .B ; .Ap set/clear general filters (as specified in the control file.) .At .B { .Ap enter clipboard mode (all search keys will now be taken from the clipboard file.) .At .B : .Ap toggle verb-deinflection mode .At .B - .Ap toggle long kanji display mode. .At .SH Kanji Search Mode Kanji Search Mode is entered using the `\' command. In this mode, keys are entered which match against fields in the Kanji database. The keys are: .B kana .Ap (use the @ or # prefixes to key hiragana or katakana.) .At .B jxxxx .Ap a hex JIS code for a kanji .At .B jhxxxx .Ap a hex JIS code for a kanji from the JIS X 212-1990 supplementary kanji. .At .B jknnnn .Ap a numeric .B kuten code for a kanji. .At .B jknnnn .Ap a numeric .B kuten code for a kanji from the JIS X 212-1990 supplementary kanji. .At .B jsxxxx .Ap a hex Shift-JIS code for a kanji. .At .b c followed by one of the .B KANJIDIC codes, such as Snn, Bnn, Vnnnn, etc. .At .B m .Ap followed by the English "sense" or "meaning" of the kanji. .At .B r .Ap to initiate a display of the radicals and their numbers. .At .B l .Ap to enter the multi-radical selection mode. .At .SH Multi-Radical Mode This is a sub-mode with the kanji selection mode. Radical elements are entered, and the kanji which match that combination of elements are either displayed, or their number reported. The commands in the mode are: .B r .Ap display the table of radical elements .At .B radical .Ap add this element to the table. .At .B dn .Ap remove the nth element from the table. .At .B sn .Ap restrict the selection to kanji with n strokes .At .B s-n .Ap restrict the selection to kanji with <= n strokes .At .B s+n .Ap restrict the selection to kanji with >= n strokes .At .B s0 .Ap remove the kanji stroke restriction. .At .B c .Ap clear the elements in the table .At .B l .Ap force the display of currently matching kanji .At .B v kanji .Ap display the elements of the specified kanji .At .B x .Ap exit this mode. .At .SH CONTROL FILE Configuration of the XJDIC system is accomplished via the use of the .BR .xjdicrc(1) file, or the file specified in the .B -c option. The control-file contains a number of directives which establish the working dictionaries and files, and also set some of the operating modes. The control file directives are: .B filt [SA,CL] .Ap set up filter details (see the FILTERS section in the xjdic24.inf file.) .At .B omode e/j/s [SA,CL] .Ap set the screen output codes to EUC, JIS or Shift-JIS .At .B kanamode [SA,CL] .Ap set the initial default input mode to hiragana .At .B dicdir path_name [SA,SV,CL] .Ap set the location of the dictionary and data files. The program will try this directory first, followed by the local operating directory. Affects all files except the clipboard and the control file itself. Note that this line should occur *before* any dicfile, etc. lines. .At .B dicfile path_name [SA,SV] .Ap dictionary name (default: edict) .At .B kdicfile path_name [SA,SV] .Ap kanji dictionary name (default: kanjidic) .At .B romfile path_name [SA,CL] .Ap romaji conversion file (default: romkana.cnv) .At .B verbfile path_name [SA,CL] .Ap conjugation file (default: vconj) .At .B radfile path_name [SA,CL] .Ap radical/bushu no. file (default: radicals.tm) .At .B radkfile path_name [SA,CL] .Ap radical/kanji file for the multi-radical search (default: radkfile) .At .B jverb on|off [SA,CL] .Ap enable or disable the verb de-inflection function .At .B kdnoshow ABCDE... [SA,CL] .Ap declaration of the KANJIDIC fields to be suppressed from the display. For example, "kdnoshow YMQ" will prevent the display of the Pin-Yin information and the Four-Corner and Morohashi indices. .At .B exlist and from but .... .... .Ap declaration of common words of 3 or more letters to be excluded from the XJDXGEN generation of an .xjdx file. There can be more than one "exlist" line in the file. .At .B clipfile [SA,CL] .Ap specify the name of a clipboard file to use. .At .B gnufile [SA,CL] .Ap specify the name of GNU Public Licence file (default is "gnu_licence".) .At .B rvdisplay on | off [SA,CL] .Ap specify the initial setting of the reverse video display of matches. (Default is ON) .At Note that some of these are also command-line options. If both are used, the control-file request takes precedence. .SH FILES Apart from the .xjdicrc control file, .B XJDIC requires five other files: .B radicals.tm .Ap the list of bushu numbers and descriptive kanji .At .B romkana.cnv .Ap the list of romaji to kana mappings used in the input conversion routines. .At .B vconj .Ap the verb/adjective inflections used to identify the dictionary forms of words prior to lookup. .At .B radkfile .Ap the file of radicals used in the multi-radical kanji search function, and the kanji matching each radical. .At .B kanjstroke .Ap file of kanji and their stroke-counts, extracted from the kanjidic file. .At .SH ENVIRONMENT The file .BR .xjdicrc(1) defines the locations of the files above. The programs all seek this file in the current working directory, the HOME directory, or in the directory specified by the XJDIC environment variable. .SH INPUT METHOD As well as having its own romaji conversion facility, .B XJDIC can receive Japanese input from IM systems such as .B kinput2. .SH BUGS Any spotted should be sent to the author. .SH AUTHOR Jim Breen . This man page initially created by William F. Maton with material taken from xjdic24.inf, and extended by Jim. .SH ACKNOWLEDGMENTS Many, many people have assisted with .B xjdic since it first appeared as 1.0 in 1992. They are mentioned in the .B xjdic24.inf file.