egg4r000 egg4r000
authorakr <akr>
Sat, 27 Jan 2001 18:45:24 +0000 (18:45 +0000)
committerakr <akr>
Sat, 27 Jan 2001 18:45:24 +0000 (18:45 +0000)
37 files changed:
AUTHORS [new file with mode: 0644]
ChangeLog [new file with mode: 0644]
Makefile [new file with mode: 0644]
PROBLEMS [new file with mode: 0644]
README [new file with mode: 0644]
TODO [new file with mode: 0644]
docomp.el [new file with mode: 0644]
egg-cnv.el [new file with mode: 0644]
egg-com.el [new file with mode: 0644]
egg-dotemacs [new file with mode: 0644]
egg-edep.el [new file with mode: 0644]
egg-mlh.el [new file with mode: 0644]
egg.el [new file with mode: 0644]
egg/canna.el [new file with mode: 0644]
egg/cannarpc.el [new file with mode: 0644]
egg/sj3.el [new file with mode: 0644]
egg/sj3rpc.el [new file with mode: 0644]
egg/wnn.el [new file with mode: 0644]
egg/wnnrpc.el [new file with mode: 0644]
eggrc [new file with mode: 0644]
its-keydef.el [new file with mode: 0644]
its.el [new file with mode: 0644]
its/ascii.el [new file with mode: 0644]
its/bixing.el [new file with mode: 0644]
its/erpin.el [new file with mode: 0644]
its/hangul.el [new file with mode: 0644]
its/hankata.el [new file with mode: 0644]
its/hira.el [new file with mode: 0644]
its/jeonkak.el [new file with mode: 0644]
its/kata.el [new file with mode: 0644]
its/pinyin.el [new file with mode: 0644]
its/quanjiao.el [new file with mode: 0644]
its/thai.el [new file with mode: 0644]
its/zenkaku.el [new file with mode: 0644]
its/zhuyin.el [new file with mode: 0644]
leim-list-egg.el [new file with mode: 0644]
menudiag.el [new file with mode: 0644]

diff --git a/AUTHORS b/AUTHORS
new file mode 100644 (file)
index 0000000..d72efb7
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,31 @@
+KAWABATA, Taichi  <kawabata@exa.onlab.ntt.co.jp>
+       Menudiag improvement.
+
+MORIOKA Tomohiko  <tomo@etl.go.jp>
+       Use of custom.
+
+NIIBE Yutaka <gniibe@chroot.org>
+       Design a part of ITS programming.
+       Wrote ITS:
+           its.el
+           its/hira.el
+       Wrote tamago.el, menudiag.el, tamago-cnv.el, tamago-comm.el,
+       and tamago-mlh.el.
+       Wrote backend conversion engine interface:
+           SJ3: tamago-lib/sj3.el, tamago-lib/sj3rpc.el,
+           WNN: tamago-lib/wnn.el, and tamago-lib/wnnrpc.el.
+
+KATAYAMA Yoshio <kate@pfu.co.jp>
+       Design ITS programming.
+       Wrote its/hangul.el, its/erpin.el, its/pinyin.el, 
+       its/thai.el, and its/zhuyin.el.
+
+Satoru Tomura <tomura@etl.go.jp>
+       Designer/Implementor/Maintainer of EGG through V3.0.
+       Discussion/Design around ITS.
+       Suggestion around how to write code in LISP.
+
+Hisashi Miyashita <himi@bird.scphys.kyoto-u.ac.jp>
+       Wrote CCL routines in tamago-com.el.
+
+
diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..4fcbdbb
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,2311 @@
+1998-07-12  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * egg-mlh.el (mlh-space-bar-backward-henkan): Don't test against
+       egg-conversion-backend-alist.
+
+       * egg/wnn.el (wnn-fini-lang): Reneme from wnn-fini.
+       (wnn-fini): New implementation calling wnn-fini-lang.
+
+       (wnn-close): Call wnn-fini-lang.
+       (wnn-dictionary-save): Ditto.
+
+       * egg/canna.el (canna-fini): Delete LANG argument.
+       * egg/sj3.el (sj3-fini): Ditto.
+
+       * egg-cnv.el (egg-set-conversion-backend): Removed.
+
+       * egg/sj3.el (sj3-start-conversion): Signal error on non-supported
+       language.
+       * egg/canna.el (canna-start-conversion): Likewise.
+       * egg/wnn.el (wnn-start-conversion): Likewise.
+
+       * egg-cnv.el (egg-convert-region): Add handler for
+       lang-not-supported.
+
+       * egg/wnn.el (egg-activate-wnn): load wnnrpc here conditionally.
+       * egg/sj3.el: Likewise.
+       * egg/canna.el: Likewise.
+
+       * egg.el (egg-support-languages, egg-set-support-languages): Removed.
+       (egg-mode): Don't call egg-set-conversion-backend.
+       * egg/{canna.el, wnn.el, sj3.el}: Don't call egg-support-languages.
+
+       * egg-cnv.el (egg-set-current-backend): Removed.
+       (egg-initialize-backend, egg-start-conversion,
+       egg-start-reverse-conversion): Don't call egg-set-current-backend.
+       (egg-conversion-backend-null): Rename from *-other-languages.
+       (egg-conversion-backend-alist): Removed.
+       (egg-conversion-backend): Not buffer local.
+       (egg-finalize-backend-alist): Removed.
+
+1998-07-10  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * egg-cnv.el (egg-start-conversion-failure-hook): New Variable.
+       (egg-start-conversion-failure-fallback): New Function.
+       (egg-convert-region): Handle error and hook on failure.
+
+       * egg/sj3.el (sj3-open): Remove bogus setq-s of sj3-sys-dict-list,
+       sj3-user-dict-list.
+
+       * egg-mlh.el (mlh-space-bar-backward-henkan): Don't emit message
+       "converting...", as it may flush out error message.
+
+       * egg/sj3rpc.el ("egg-com", "egg/sj3"): Require on compilation.
+       (sj3rpc-open): Failure when version is different.
+
+1998-07-03  KATAYAMA Yoshio <kate@pfu.co.jp>
+
+       * its/erpin.el, its/hangul.el, its/hankata.el, its/hira.el,
+       its/jeonkak.el, its/kata.el, its/pinyin.el, its/quanjiao.el,
+       its/thai.el, its/zenkaku.el: Updated using new its-*.
+
+       * its.el (define-its-state-machine): Rewritten.
+       (define-its-compiled-map): Deleted.
+       (define-its-state-machine-append): Rewritten.
+       (its-defrule): Rewritten.
+       (its-defrule*): Rewritten.
+       (its-parent-states): New Variable.
+       (its-goto-state): Remove 2nd optional argument INITIAL-STATE.
+       (its-set-interim-terminal-state): New Function.
+       (its-make-next-state): Remove 2nd argument KEYSEQ.
+
+1998-07-01  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * egg-mlh.el (mlh-hira-to-kata): Removed.  Doesn't work any more.
+       (mlh-katakana): Use japanese-katakana-region.
+
+       * egg-cnv.el (egg-conversion-map): Add again mapping for "/".
+
+1998-06-27  KATAYAMA Yoshio <kate@pfu.co.jp>
+
+       * egg-cnv.el (egg-abort-conversion): Bug fix.
+
+1998-06-27  NIIBE Yutaka  <gniibe@akebono>
+
+       * egg/wnn.el (wnn-dictionary-specification-list): Don' specify
+       for gerodic/g-jinmei.
+       Suggested by SAKAI Kiyotaka <ksakai@netwk.ntt-at.co.jp>.
+
+1998-06-26  KATAYAMA Yoshio <kate@pfu.co.jp>
+
+       * its.el (its-cancel-input): Bug fix.
+
+1998-06-26  SAKAI Kiyotaka <ksakai@netwk.ntt-at.co.jp>
+
+       * egg-cnv.el (egg-conversion-mode, egg-help-command): New
+       functions for help string.
+       * its.el (its-mode, its-mode-help-command): Likewise.
+
+1998-06-26  KATAYAMA Yoshio <kate@pfu.co.jp>
+
+       * egg-cnv.el (egg-convert-region): Bug fix.
+       * egg.el (egg-default-language): Don't use string.
+
+       * its/hankata.el (its-han-kata-enable-double-n, and others):
+       Variable name change (-han-) to distingush kata.el.
+
+       * its/erpin.el (its-erpin-tw-enable-quanjioao-alphabet,
+       its-erpin-cn-enable-quanjioao-alphabet): 
+       See its-enable-fullwidth-alphabet.
+       * its/kata.el (its-kata-enable-zenkaku-alphabet): Likewise.
+       * its/pinyin.el (its-pinyin-cn-enable-quanjioao-alphabet): Likewise.
+       * its/zenkaku.el (its-zenkaku-down-map): Likewise.
+
+       * its/erpin.el (its-erpin-tw-map): Bug fix for "\\", "{", "}", and
+       "/".
+       * its/pinyin.el (its-pinyin-cn-map): Ditto.
+       * its/quanjiao.el (its-quanjiao-down-tw-map): Ditto.
+       * its/zhuyin.el (its-zhuyin-cn-enable-quanjioao-alphabet): Ditto.
+
+       * its/hira.el (its-hira-enable-zenkaku-alphabet): Follow changes
+       of its.el.
+       * its/ascii.el (its-up-map, its-down-map): Ditto.
+       * its/jeonkak.el (its-jeonkak-up-map): Ditto.
+
+       * its/hira.el (its-hira-enable-zenkaku-alphabet): 
+       See its-enable-fullwidth-alphabet.
+
+       * egg/wnn.el (wnn-save-dictionaries): Rewritten.
+
+       * egg/canna.el (egg-edep): Required.
+       (canna-support-languages): Use symbol.
+       * egg/sj3.el (egg-edep): Likewise.
+
+       * egg/wnn.el (egg-edep): Likewise.      
+       * egg/wnnrpc.el: Use symbol.
+
+       * menudiag.el (menudiag-mode-map): Bug fix for boundary conditions.
+       (menudiag-make-selection-list): Bug fix in case of many items.
+
+       (menudiag-forward-item, menudiag-backward-item,
+       menudiag-goto-line): Change so that it wraps.
+
+       * its.el (egg-edep): Required.
+       (its-keydef): Require unconditioanlly.
+       (its-mode-map): Don't call its-define-select-keys here.
+       (its-mode-map): Use of symbol as keymap.
+       (its-fence-invisible): New variable.
+       (its-put-cursor): Don't call its-define-select-keys.
+       (its-setup-fence-mode): invisible handling and its-define-select-keys.
+       (its-keyseq-acceptable-p): if (CDR SYL) is number, return NIL.
+       (define-its-state-machine): Introduce its-temporaly-map.
+       (define-its-state-machine-append): Likewise.
+
+       (its-goto-state): Use symbol as keymap, not directly.
+
+       (its-set-part-1,its-set-part-2): New function.
+       (its-delete-backward-within-SYL): Conditionalize.
+
+       * egg.el (egg-edep): Required.
+       (egg-mode): Add remove-hook call.
+       Supply NIL as first argument to egg-set-conversion-backend.
+       make-local-hook for input-method-activate-hook.
+       (egg-set-face): Add optional argument OBJECT.
+       (egg-redraw-face): Bind inhibit-point-motion-hooks.
+
+       * egg.el (set-buffer-multibyte): Move to egg-edep.el.
+
+       * egg-mlh.el (mlh-space-bar-backward-henkan): Use assq.
+
+       * egg-com.el (egg-zhuyin-syllable): compatibility change.
+       (encode-fixed-euc-china-region): Removed maxlen.
+
+       Really Needed? -- gN.
+       * egg-com.el (egg-pinyin-syllable): Check exact match.
+       (egg-zhuyin-syllable): Likewise.
+
+       * egg-cnv.el (egg-edep): Required.
+       (its-keydef): Not required.
+       (egg-conversion-map): Don't call its-define-select-keys here.
+       Fset it to use symbol instead of the map directly.
+
+       (egg-get-bunsetsu-info): Add new optional argument for getting
+       property.
+       (egg-start-conversion-other-languages): set egg-conversion-backend.
+       (egg-set-current-backend): Use assq instead of assoc.
+       (egg-get-conversion-face): Likewise.
+       (egg-conversion-invisible): New variable.
+       (egg-convert-region): Change for open/close delimiter.
+       (egg-chinese-sisheng-regexp): New function.
+       (egg-separate-languages): Use egg-chinese-sisheng-regexp,
+       use symbol for language specifier (instead of string).
+
+       (egg-charset-to-language): Use symbol for language specifier
+       (instead of string).
+       (egg-next-chinese-lang): Likewise.
+
+       (egg-next-part-lang): Change the arguments.
+
+       (egg-make-bunsetsu): New function changing egg-insert-bunsetsu.
+
+       (egg-separate-characters): compatibility changes.
+
+       (egg-conversion-wrap-select): New Variable.
+
+       (egg-next-candidate): Can wrap around.
+
+       (egg-decide-before-point): Rewritten.
+       (egg-abort-conversion): Back to previous one.
+       (egg-select-candidate): Use egg-make-bunsetsu.
+
+       * egg-edep.el: New File for handling differences between Emacs version.
+       * its/thai.el: New File.
+       * its/hangul.el: Updated.
+
+1998-06-26  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * Makefile (install): Don't touch .emacs and leim-list.el
+       directly.  User should do it by her hand.
+       Reported by SAKAI Kiyotaka <ksakai@netwk.ntt-at.co.jp>
+
+1998-06-25  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * egg/canna.el (canna-dictionary-specification): "user" instead of
+       ("user").  Should chnage canna-filename later.
+       Reported by Akio Morita <amorita@bird.scphys.kyoto-u.ac.jp>.
+
+1998-04-02  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * egg-com.el (comm-unpack-u16-string): Call string-as-multibyte.
+       (comm-unpack-mb-string): Likewise.
+
+       * egg.el (set-buffer-multibyte): Function for Emacs 20.2.
+
+       * egg/wnn.el (wnn-open): Call set-buffer-multibyte.
+       * egg/sj3.el (sj3-open): Ditto.
+       * egg/canna.el (canna-open): Ditto.
+
+1998-04-02  KATAYAMA Yoshio <kate@pfu.co.jp>
+
+       Implement hilight.
+       * egg.el (egg-mark-list, egg-suppress-marking): New Variables.
+       (egg-set-face, egg-mark-modification, egg-redraw-face): New
+       Functions.
+       * its.el (its-buffer-ins/del-SYL): Call egg-set-face.
+       (its-setup-yanked-portion): Likewise.
+       * egg-cnv.el (egg-insert-bunsetsu): Call egg-set-face.
+
+       * egg.el (egg-mode): set default backend.
+       * egg-mlh.el (mlh-space-bar-backward-henkan): activate input
+       method.
+
+1998-04-02  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * egg-cnv.el (egg-decide-bunsetsu): Undo changes of 03-16.
+       (egg-abort-conversion): Call egg-end-conversion.
+       (egg-decide-before-point): Call egg-end-conversion widh ABORT=NIL.
+
+1998-03-16  NIIBE Yutaka  <gniibe@chroot.org>
+
+       CANNA Support.
+       * egg/canna.el, egg/cannarpc.el: New file.
+       * Makefile (SRCS): Added.
+
+       * egg-cnv.el (egg-end-conversion): Add argument ABORT.
+
+       * egg/wnn.el (wnn-end-conversion): Follow the change of 
+       EGG-END-CONVERSION.
+       * egg/sj3.el (sj3-end-conversion): Likewise.
+
+1998-03-15  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * Makefile: Add dependencies for its-keydef.elc.
+       * egg/sj3rpc.el (sj3-open): Don't support list of hosts.
+       * its.el (its-exit-mode, its-kick-convert-region): Bug fix.  Call
+       its-input-end and its-put-cursor.
+       (its-exit-mode-off-input-method): Removed. 
+
+1998-03-14  KATAYAMA Yoshio <kate@pfu.co.jp>
+
+       * docomp.el (its-keydef): Undo the changes of 03-09.  its.el
+       is fixed.
+
+       * egg-cnv.el (egg-current-language): New valiable.
+       (egg-bunsetsu-info): Separate bunsetsu-info and lunguage.
+       (egg-conversion-backend-other-languages
+       egg-init-other-languages
+       egg-start-conversion-other-languages
+       egg-get-bunsetsu-converted-other-languages
+       egg-get-bunsetsu-source-other-languages
+       egg-list-candidates-other-languages
+       egg-get-number-of-candidates-other-languages
+       egg-get-current-candidate-number-other-languages
+       egg-get-all-candidates-other-languages
+       egg-decide-candidate-other-languages
+       egg-change-bunsetsu-length-other-languages
+       egg-end-conversion-other-languages
+       egg-fini-other-languages): New valiable and functions for
+       handling unknown language.
+       (egg-set-current-backend): Set egg-conversion-backend-other-languages
+       when backend for specified language isn't found.
+       (egg-start-reverse-conversion): New function for reverse conversion.
+       (egg-set-conversion-backend-internal): Removed.
+       (egg-set-conversion-backend): Args are changed.
+       (egg-get-conversion-face): New function for different face for
+       every language.
+       (egg-convert-region): Make converting text read-only. Handle
+       unknown laguages and backend opening error. Rename its-lang to
+       egg-lang.
+       (egg-separate-languages): Argument use-context is added to
+       utilize context when called by its-yank. Rename its-lang to
+       egg-lang Improve speed.
+       (egg-charset-to-language): Renamed from egg-char-to-language.
+       (egg-next-part-lang egg-next-chinese-lang): Rename its-lang to
+       egg-lang.
+       (egg-conversion-map): Unbind C-\ and /. Bind C-X RET XXX to
+       its-select-XXX.
+       (egg-insert-bunsetsu): Make conversion text read-only. Separate
+       bunsetsu-info and conversion-backend. 
+       (egg-insert-bunsetsu-list): Remove redundant variables.
+       (egg-beginning-of-conversion-buffer): New function.
+       (egg-end-of-conversion-buffer): New function.
+       (egg-enlarge-bunsetsu): Handle read-only text.
+       (egg-next-candidate): Handle read-only text. Bug on no candidate
+       bunsetsu is fiexed.
+       (egg-reconvert-bunsetsu-internal egg-reverse-convert-bunsetu
+       egg-reconvert-bunsetsu): New functions for reverse conversion and
+       re-conversion.
+       (egg-decide-before-point egg-abort-conversion): Handle read-only
+       text. Bug on pinyin and zhuyin mixed conversion is fixed. Allow
+       long fence.
+       (egg-select-candidate): Handle read-only text. Bug on no candidate
+       bunsetsu is fiexed.
+
+       * egg-com.el: Change coding-system from internal to iso-2022-7bit.
+
+       * egg-mlh.el (mlh-space-bar-backward-henkan): Disable temporally
+       mode selection.
+
+       * egg.el (egg-mode): Set cureent lang to conversion backend.
+       (egg-set-mode-line-title): Renamed to its-set-mode-line-title
+       and moved to its.el.
+       (egg-check-language): Removed.
+
+       * egg/sj3.el (sj3-server-port): Change from defconst to defver for
+       user customization.
+       (sj3-open sj3-get-environment): Try opening alternate servers.
+       (sj3-start-conversion): Make second argument LANGUAGE optional.
+       (egg-activate-sj3): Parameters of egg-set-conversion-backend is
+       changed.
+
+       * egg/sj3rpc.el (sj3rpc-error-message): New constant (Not yet
+       completed).
+       (sj3rpc-get-error-message): Check range of errno to avoid
+       args-out-ou-range error.
+
+       * egg/wnn.el (wnn-jport wnn-cport wnn-tport wnn-kport): New
+       variables for user customization.
+       (wnn-server-info-list wnn-server-port): Type of fourth element
+       is changed from integer to symbol.
+       (wnn-start-reverse-conversion): New function.
+       (wnn-open wnn-get-environment): Try opening alternate servers.
+       (egg-activate-wnn): Parameters of egg-set-conversion-backend is
+       changed.
+
+       * its-keydef.el (its-current-language): Moved to its.el.
+       (its-make-select-func): Remove language check (egg-check-language).
+       Add temporally mode selection.
+       (its-do-list-make-select-func): Binding of zhuyin-tw is changed to
+       `C' because conflicting zenkaku-upcase.
+
+       * its.el (its-current-select-func its-previous-select-func): New
+       variables for temporally mode selection.
+       (its-keydef requiring): Use eval-when to avoid error on using
+       compiled file.
+       (its-get-fence-face): New function for different face for
+       every language.
+       (its-put-cursor its-setup-fence-mode): Make fence read-only.
+       (its-start): Remove force-mode-line-update calling.
+       (its-restart): Add optional argument set-prop.
+       (its-self-insert-char its-backward-SYL its-forward-SYL
+       its-delete-SYL its-delete-backward-SYL its-exit-mode
+       its-delete-backward-SYL-by-keystroke its-transpose-chars
+       its-kick-convert-region its-end-of-input-buffer): Handle read-only
+       fence.
+       (its-state-machine): Accept special actions to handle temporally
+       mode selection.
+       (its-buffer-ins/del-SYL its-ins/del-SYL-batch): Handle read-only
+       fence. Property its-lang is renamed to egg-lang.
+       (its-get-next-state its-make-next-state): Add type check to avoid
+       wrong-type-argument error.
+       (its-keyseq-acceptable-p): Save informations of its-map to avoid
+       confusing on temporally mode selection.
+       (its-defrule-select-mode-temporally): New macro.
+       (its-kill-line its-cancel-input): New function.
+       (its-delete-backward-within-SYL): Bind its-current-language to
+       avoid confusing when undo is done beyond language change.
+       (its-yank its-yank-pop its-setup-yanked-portion): New functions.
+       (its-exit-mode-internal): Reset temporally selected mode. Allow
+       long fence.
+       (its-kick-convert-region-or-self-insert): New function.
+       (its-translate-region): Remove text properties completly.
+       (its-set-mode-line-title): Moved from egg.el and renamed.
+       (its-select-mode-temporally its-select-previous-mode): New functions
+       for temporally mode selection.
+
+       * leim-list-egg.el: Secondary argument for egg-activate-sj3/wnn
+       is no longer needed.
+
+       * its/hira.el: Remove the rule for "~" which destroies the rules
+       with its-hankaku-escape.
+
+       * its/pinyin.el: Implement its-pinyin-cn-enable-quanjioao-alphabet
+       and its-pinyin-tw-enable-quanjioao-alphabet.
+
+       * its/hangul.el: Implement its-hangul-enable-quanjioao-alphabet.
+
+       * its/ascii.el: New file.
+       * its/erpin.el: New file.
+       * its/hankata.el: New file.
+       * its/jeonkak.el: New file.
+       * its/kata.el: New file.
+       * its/quanjiao.el: New file.
+       * its/zenkaku.el: New file.
+       * its/zhuyin.el: New file.
+
+1998-03-14  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * egg/sj3rpc.el (sj3rpc-close): New function.
+
+       * egg/sj3.el (sj3bunsetsu-[sg]et-kugiri-changed): Rename from
+       sj3bunsetsu-get-stdy-down.
+       (sj3-end-conversion): Implement CLSTDY.
+       (sj3-fini): Implemented.
+
+1998-03-10  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * egg/sj3.el (sj3-end-conversion): Implement bunsetsu study.
+       CLSTDY not yet.
+
+       * egg/sj3rpc.el (sj3rpc-get-bunsetsu-candidates-sub): Bug fix.
+       Always add hiragana and katakana candidates.
+       (sj3-const: CLSTDY, CLSTDY_EUC): Renamed from END and END_EUC
+       according to "sj3cmd.h" of SJ3 distribution.
+       (sj3rpc-bunsetsu-stdy, sj3rpc-kugiri-stdy): New functions.
+
+       * egg-com.el (comm-format-u8-vector): New substitution.
+       (comm-format): New format 'v'.
+
+1998-03-09  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * docomp.el (its-keydef): Require its-keydef when compile.
+       Not so good.  Just a work around.
+       (its-mode-map): Undo the changes of 03-04.
+       
+1998-03-09  KATAYAMA Yoshio <kate@pfu.co.jp>
+
+       * its.el (its-translate-region): Make it command.
+       (its-translate-region-internal): Make it function.
+
+1998-03-04  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * its.el (its-define-select-keys of its-mode-map): Comment it out.
+       * its-keydef.el (its-make-select-func): Add eval-when to compile this.
+
+       * egg-cnv.el (egg-decide-bunsetsu): Deleted.
+       * its.el (its-restart): Call its-setup-fence-mode with no argument.
+
+       * its.el (its-keyseq-acceptable-p): Bug fix.
+
+1998-03-03  KATAYAMA Yoshio <kate@pfu.co.jp>
+
+       *its.el (its-get-keyseq-syl): Compensate when DSYL has back.
+       (its-DSYL-with-back-p): New function. Return t when DSYL has back.
+       (its-concrete-DSYL-p): New function. Return t when DSYL is cons
+       form which means input is not continued after DSYL was created.
+       (its-make-concrete-DSYL): New function.
+       (its-self-insert-char): Make DSYL to ``concrete-DSYL'' if cursor
+       is t which means input is not continued.
+       (its-input): Test input key is whether acceptable or not when
+       its-barf-on-invalid-keyseq is non-nil.
+       (its-input-to-vsyl): Set cursor status, not just returning it.
+       (its-state-machine its-state-machine-keyseq): Make sure to issue
+       ``DSYL-with-back'' when syllable is decided by the rule with back.
+       ``test mode'' is added.
+       (its-keyseq-acceptable-p): New function.
+       (its-forward-SYL): The args order of put-text-property was wrong.
+       (its-delete-backward-SYL-by-keystroke): New function.
+       (its-delete-backward-within-SYL): ``delete-by-keystroke'' mode
+       did not work when syllable is decided by the rule with back.
+       Deletion limit is extended to outside of SYL (meaning of
+       ``within-SYL'' is changed to ``deletion starts within SYL).
+       (its-transpose-chars): Fixed up.
+       (its-in-fence-p): Confuse at openning fence.
+
+1998-02-25  KATAYAMA Yoshio <kate@pfu.co.jp>
+
+       * its.el (its-put-cursor): Enable its-map change in fence mode.
+
+       * its-keydef.el (its-make-select-func): Same as above.
+
+1998-02-25  KATAYAMA Yoshio <kate@pfu.co.jp>
+
+       * its.el (its-set-cursor-status): New function.
+       (its-setup-fence-mode): New function.
+       (its-insert-fence-open its-insert-fence-close): Deleted.
+       (its-start, its-restart, its-self-insert-char): Avoid fence
+       destruction on its-barf.
+       (its-input-to-vsyl, its-state-machine, its-state-machine-keyseq,
+       its-buffer-ins/del-SYL, its-ins/del-SYL-batch): Update cursor
+       status on updating syllables.
+       (its-input-error): New function to realize doc-string of
+       its-barf-on-invalid-keyseq.
+
+       * egg.el (egg-mode): Don't use egg-mode-line-title which cause
+       wrong-type-argument at isearch.  Bind its-select-XXX to key only
+       when modefull is select.
+
+       * egg-mlh.el (mlh-hangul, mlh-zhongwen, mlh-zhongwen-tw): Same
+       as above.
+
+       * its-keydef.el (its-make-select-func): Same as above.
+
+       * leim-list-egg.el: Same as above.
+
+1998-02-24  KATAYAMA Yoshio <kate@pfu.co.jp>
+
+       * its.el (its-state-machine-keyseq): Remove binding
+       its-barf-on-invalid-keyseq to nil.
+       (its-ins/del-SYL-batch): Avoide altering its-XXX-map.
+       (its-translate-region-internal): its-translation-result's data
+       type is changed to string.
+
+       * egg-cnv.el (egg-convert-region): Gather contiguous same
+       language part.
+
+1998-02-21  KATAYAMA Yoshio <kate@pfu.co.jp>
+
+       * its.el (its-ins/del-SYL-batch): Set its-lang property.
+       (its-translate-region): Remove its-lang property from translated
+       text.
+       (its-translate-region-internal): New function.  Retain its-lang
+       property on translated text.
+
+       * egg-mlh.el (mlh-space-bar-backward-henkan): Force base language
+       to Japanese.
+
+       (mlh-hangul mlh-zhongwen-tw mlh-zhongwen): New functions for
+       conversion functions.
+
+1998-02-20  KATAYAMA Yoshio <kate@pfu.co.jp>
+
+       * its.el (its-restart): New function.
+       (its-insert-fence-open, its-insert-fence-close): New function.
+       (its-start): Rewritten.  Use its-insert-fence-open and
+       its-insert-fence-close.
+       (its-exit-mode-internal): Leave its-syl property.
+       (its-exit-mode-internal): Delete the property in this case.
+       (its-keydef): Require it.
+
+       * its-keydef.el: Provide the feature.
+
+       * egg-cnv.el (egg-convert-region): Add egg-source property to save 
+       the source string.
+       (egg-conversion-map, \C-c): New keybind.
+       (egg-get-previous-bunsetsu): Bug fix.
+       (egg-decide-before-point): New implementation.
+       (egg-exit-conversion): Use gg-decide-before-point.
+       (egg-abort-conversion): New command.
+
+1998-02-20  NIIBE Yutaka  <gniibe@akebono>
+
+       * Makefile (SRCS), Egg.prj: Remove euc-china.el.
+       * egg-com.el: Include egg-china.el.
+       * egg-china.el: Removed.
+
+1998-02-18  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * Egg.prj: Use PRCS.
+
+       * Makefile (SRCS): Rename euc-cn.el to euc-china.el
+       * egg-mlh.el (mlh-space-bar-backward-henkan): Put "Japanese"
+       language property for text.
+
+1998-02-18  KATAYAMA Yoshio <kate@pfu.co.jp>
+
+       * euc-china.el: Rename from euc-cn.el.  Update.
+
+       * egg.el (egg-mode): Bug fix.  Call get-exit-conversion.
+       * leim-list-egg.el ("japanese-egg-wnn", "japanese-egg-sj3"): 
+       Use new definition (with language argument).
+       * egg/wnn.el (egg-activate-wnn): 
+       * egg/sj3.el (egg-activate-sj3): 
+       
+1998-02-17  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * Makefile (SRCS): Add its/pinyin.el, its/hangul.el and
+       its-keydef.el.
+
+       * egg-com.el (ccl-encode-fixed-euc-kr): Fixed the name.
+       
+1998-02-17  KATAYAMA Yoshio <kate@pfu.co.jp>
+       
+       * its-keydef.el: New file.
+       * its/hangul.el, its/pinyin.el: New version.
+
+       * egg/wnnrpc.el (load-library "egg/wnn"): Comment it out.
+       (wnnrpc-get-error-message): Support multiple languages.
+       (wnnrpc-call-with-environment): Chinese support.
+
+       * egg/wnn.el (wnn-support-languages): New const.
+       (<env>): Add <server-type>, <dic-set>, and <rev-flag>.
+       (wnnenv-get-server-type, wnnenv-get-dictionary-set,
+        wnnenv-get-reverse-flag): New substs.
+       (wnnenv-get-daibunsetsu-info, wnnenv-set-daibunsetsu-info): Changed.
+       (wnn-server): Removed.
+       (wnn-jserver, wnn-cserver, wnn-tserver, wnn-kserver): New custom.
+       (wnn-server-info-list): New const.
+       (wnn-get-server-info): New function.
+       (wnn-server-locale, wnn-server-type, wnn-server-port,
+        wnn-server-stream-name, wnn-server-buffer-name,
+        wnn-server-coding-system, wnn-server-hostname): New substs.
+       (wnn-start-conversion): Add new arguments.
+       (wnn-uniq-candidates): Initialize 'n'.
+       (wnn-change-bunsetsu-length): Simplefied.
+       (wnn-change-bunsetsu-length): Call renbunsetsu-conversion,
+       instead.
+       (wnn-fini, wnn-comm-sentinel): back to 971009 version.
+       (wnn-jserver-port): Removed.
+       (wnn-open): Argument change.  Support languages.
+
+       (wnn-dictionary-specification): Removed.
+       (wnn-dictionary-specification-list): New variable.
+       (wnn-get-dic-spec, wnn-dic-spec-dic-set, wnn-dic-spec-reverse,
+       wnn-dic-spec-name, wnn-dic-spec-param, wnn-dic-spec-fuzokugo,
+        wnn-dic-spec-dic-list): New substs.
+       (wnn-get-environment): Rewrite.
+       (wnn-create-environment): Rewrite.
+
+       (egg-activate-wnn): Support languages.
+
+       * egg/sj3rpc.el (load-library "egg/sj3"): Don't load it.
+
+       * egg/sj3.el (sj3-support-languages): New const.
+       (sj3-start-conversion, sj3-fini): Add lang.
+       (sj3-change-bunsetsu-length): Simplified.
+       (egg-activate-sj3): Support language.
+
+       * its/hira.el (its/hira): Packagefy. (?)
+       (its-hira-map): Add language spec.  Move here the escape keys
+       ("Z", "~").
+
+       * leim-list-egg.el ("chinese-gb-egg-wnn-py", "chinese-gb-egg-wnn-zy",
+        "chinese-cns-egg-wnn-py", "chinese-cns-egg-wnn-zy",
+        "korean-egg-wnn"): New input methods.
+
+       * its.el (its-current-language): New Local Variables.
+       <map>: Change the structure.  Add <language>.
+       (its-get-language): New substitution.
+       (its-set-indicator): Removed.
+       (its-get-indicator, its-get-start-state): New implementation.
+       (its-reset-start-state): Removed.
+       (its-buffer-ins/del-SYL): Add new properties, its-map and its-lang.
+       (its-exit-mode-internal): Change for its-map and its-lang.
+       (its-in-fence-p): New function.
+
+       ("its-keydef.el"): Load it.
+
+       (its-select-map-menu): Removed.
+       (its-select-map-from-menu): Removed.
+       (its-select-hiragana, its-select-katakana, its-select-downcase,
+       its-select-upcase, its-select-zenkaku-downcase,
+       its-select-zenkaku-upcase, its-select-map, its-zenkaku-escape,
+       its-hankaku-escape): Removed.
+
+       (define-its-state-machine): Rewrite.
+       (define-its-compiled-map): New macro.
+       (its-define-state-machine): Removed.
+
+       (its-forward-SYL): Cleanup.
+
+       (its-beginning-of-input-buffer): Fix.
+       (its-end-of-input-buffer): Likewise.
+
+       * egg-com.el (egg-fixed-euc, egg-mb-euc): New Local Variables.
+       (ccl-decode-fixed-euc-kr, ccl-encode-fixed-euc-kr): New CCLs.
+       (fixed-euc-kr): New coding system.
+       (comm-format-mb-string, comm-format-u16-string): Support EUC-KR.
+       (comm-unpack-u16-string, comm-unpack-mb-string): Likewise.
+
+       * egg-cnv.el (egg-get-bunsetsu-info): New function.
+       (egg-conversion-backend-alist, egg-finalize-backend-alist): 
+       New Variables.
+       Make egg-conversion-backend buffer local.
+       (egg-set-current-backend): New function.
+       (egg-initialize-backend): Call egg-set-current-backend.
+       (egg-start-conversion): Add new argument LANGUAGE.
+       (egg-finalize-backend): Finalize for all backend(s).
+       (egg-set-conversion-backend-internal): New Macro.
+       (egg-convert-region): Support multiple languages in the region.
+       (egg-separate-languages, egg-char-to-language, egg-next-part-lang,
+       egg-next-chinese-lang): New functions.
+       (egg-insert-bunsetsu-list): Change the meaning of last argument.
+       (egg-shrink-bunsetsu): Simplified.  Just call egg-enlarge-bunsetsu.
+       (egg-enlarge-bunsetsu): Support shrink.
+
+       (egg-decide-bunsetsu, egg-next-candidate, egg-select-candidate): 
+       Use egg-get-bunsetsu-info.
+
+       (egg-insert-bunsetsu): The property now includes
+       egg-conversion-backend.
+
+       * egg.el: Don't load its/hira and don't set its-current-map.
+
+       * egg.el (egg-default-language, egg-support-languages): New Variables.
+       (egg-last-method-name, egg-mode-line-title): New Local Variables.
+       (egg-set-mode-line-title, egg-check-language): New functions.
+       (egg-set-support-languages): New function.
+       (egg-mode): Final processing: call its-exit-mode, call
+       egg-exit-conversion.
+       Changing the arguments, remember last input method.
+
+       Bug fix. Don't set its-hira-period and its-hira-comma.
+
+1998-02-17  KAWABATA, Taichi
+
+       * menudiag.el (menudiag-mode-map): New binds for new commands.
+       (menudiag-beginning-of-items, menudiag-end-of-items): New commands.
+       (menudiag-make-menu-formatted-string): Bug fix.  Use 
+       menudiag-item-num-to-char.
+       (menudiag-goto-item): Rewrite.  Better user interface.
+       (menudiag-char-to-item-num, menudiag-item-num-to-char): New
+       functions.
+
+1998-02-07  MORIOKA Tomohiko  <morioka@jaist.ac.jp>
+
+       * leim-list-egg.el: Delete autoload setting for `egg-mode'.
+       Delete input method registration for "japanese-egg".
+
+       * egg.el: Comment out setting for Wnn.
+
+       * leim-list-egg.el: Add autoload setting for
+       `egg-activate-{wnn|sj3}'.
+
+       * egg/sj3.el (egg-activate-sj3): Add DOC-string.
+
+       * egg/sj3.el (egg-activate-sj3): New function.
+       Require egg.
+       Load egg/sj3rpc.el.
+
+       * egg/wnn.el (egg-activate-wnn): New function.
+       Require egg.
+       Load egg/wnnrpc.el.
+
+1998-02-07  MORIOKA Tomohiko  <morioka@jaist.ac.jp>
+
+       * leim-list-egg.el (japanese-egg-wnn): New input method.
+       (japanese-egg-sj3): New input method.
+
+1997-11-20  MORIOKA Tomohiko  <morioka@jaist.ac.jp>
+
+       * leim-list-egg.el: Rename `egg-ja' -> `japanese-egg'.
+
+1997-11-20  MORIOKA Tomohiko  <morioka@jaist.ac.jp>
+
+       * egg/wnn.el (wnn): New group.
+       (wnn-server): Use `defcustom'.
+       (wnn-usr-dic-dir): Use `defcustom'.
+
+       * egg.el (egg): New group.
+
+1997-11-20  MORIOKA Tomohiko  <morioka@jaist.ac.jp>
+
+       * menudiag.el (menudiag-mode-map): Swap binding for left and
+       right.
+
+       * egg.el (egg-toroku-region): `wnn-get-environment' requires
+       dictionary-specification.
+
+       * leim-list-egg.el: add autoload setting for egg-mode.
+
+1997-11-03  KATAYAMA Yoshio <kate@pfu.co.jp>
+
+       * euc-cn.el: New file.  Original name was yincoding.el.
+       Adopted by NIIBE Yutaka  <gniibe@chroot.org>.
+       
+1997-11-03  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * its.el (its-start): Add INVISIBLE property if ITS-FENCE-FACE.
+       * egg-cnv.el (egg-decide-before-point): Ditto.
+       Based on patch by Kenichi HANDA <handa@etl.go.jp>.
+
+       Once, I thought that we need many environments which correspond to
+       outstanding CONVERSION buffre.  However, I've learned that WNN4
+       protocol is completely independent.  It's no use to maintain each
+       environment.  Share the one environment.
+       * egg/wnn.el (wnn-environments): Removed.  
+       (wnn-environment): New variable.
+       (wnn-comm-sentinel): Follow the change.  Let users know the close.
+       (wnn-fini): Likewise.
+
+       <env>: Remove the member <in-use>.
+       (wnnenv-create): Follow the structure change.
+       (wnn-end-conversion): Likewise.
+       (wnnenv-get-in-use-flag, wnnenv-set-in-use-flag): Removed.
+       (wnn-find-env-not-in-use): Removed.
+       (wnn-get-environment): Use wnn-environment instead of wnn-environments.
+       Take one argument.
+
+       * egg-cnv.el (egg-decide-before-point): Signal error on first SYL.
+       Reported by KATAYAMA Yoshio <kate@pfu.co.jp>.  Changes of 1997-09-07
+       was not enough.
+       Set-marker M to NIL after PUT-TEXT-PROPERTY.
+
+       Because the name of identifier begins egg-*, change the file names.
+       * tamago: Rename from tamago.
+       * egg.el, egg-mlh.el, egg-com.el, egg-cnv.el: Rename from tamago-*.el
+       * Makefile: Follow the changes.
+
+1997-10-05  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * tamago/wnn.el (wnn-uniq-candidates): Add new argument BUNSETSU.
+       Call WNN-BUNSETSU-SET-ZENKOUHO-POS, WNN-BUNSETSU-SET-ZENKOUHO in
+       this function.  Handle the case where BUNSETSU is not the first
+       element of BUNSETSU-LIST.
+       (wnn-list-candidates): Use new API of WNN-UNIQ-CANDIDATES.
+
+       * tamago-cnv.el (egg-next-candidate): Handle the case where
+       EGG-LIST-CANDIDATES returns non zero value.
+
+1997-10-04  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * Makefile (install): Install to SITEDIR.
+
+1997-09-26  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * its/hira.el (its-hira-enable-zenkaku-alphabet): New variable.
+       (its-hira-map): Use it.
+
+1997-09-19  NIIBE Yutaka  <gniibe@chroot.org>
+
+       Arrange for LEIM.  Use tamago/ subdirectory.
+       * tamago/: Rename from tamago-lib.
+
+1997-09-18  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * tamago-cnv.el (egg-select-candidate): menu-select -->
+       menudiag-select. 
+       * tamago.el (egg-toroku-region, egg-hinshi-select): Likewise.
+
+       * tamago-cnv.el (egg-exit-conversion): Run hook of
+       input-method-after-insert-chunk-hook.
+       * its.el (its-exit-mode-internal): Ditto.
+
+       * tamago-mlh.el (mlh-comma-period-style): Deleted.
+
+       * its/, tamago-lib/: New directory.
+       * its/: Move its-*.el files here.
+       * tamago-lib/: Move sj3.el, sj3rpc.el, wnn.el and wnnrpc.el here.
+
+       * tamago-com.el: Rename from comm.el.
+       * tamago-mlh.el: Rename from mlh.el.
+       * tamago-cnv.el: Rename from convert.el.
+
+       * menudiag.el: Rename from menu.el.
+       (Throughout): Rename menu-* to menudiag-*.
+
+1997-09-07  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * egg.el (egg-insert-after-hook, egg-exit-hook): Removed.
+       (egg-sai-henkan-start, egg-sai-henkan-end, egg-old-bunsetu-suu):
+       Removed.
+
+       * wnn.el (WNN-const): New macro.
+       (wnn-start-conversion, wnn-open-dictionary, wnn-open-frequency,
+       wnn-set-dictionary-sub, wnn-update-frequency): Use it.
+
+       * wnnrpc.el (wnn-const): New macro.
+       Throughout: Use wnn-const.
+
+       * convert.el (egg-decide-before-point): Bug fix.  Handle the case
+       where all bunsetsu are decided.
+       Reported by KATAYAMA Yoshio <kate@pfu.co.jp>.
+
+       * convert.el (egg-exit-conversion): Call egg-end-conversion at end.
+       (egg-decide-before-point): Ditto.
+
+       * wnn.el (wnn-environments): Change the structure of enviromnents.
+       (wnn-fini): Handle errors.
+       (wnn-open): Set sentinel.  Delete buffer on failure.
+       (wnn-comm-sentinel): New function.
+       (wnn-find-env-not-in-use): Return nil when not found.
+
+       (wnn-create-environment): Take username as argument.
+       (wnn-get-environment): Follow the change.
+
+       (wnnenv-create): Remove useless serial no.
+       (wnnenv-get-in-use-flag, wnnenv-set-in-use-flag): Follow the change.
+       (wnnenv-get-daibunsetsu-info, wnnenv-set-daibunsetsu-info): Likewise.
+       (wnn-create-environment, wnn-get-environment): Likewise.
+
+1997-09-04  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * its.el (its-state-machine-keyseq): Bug fix.  Handle VSYL.
+
+       * sj3.el, sj3rpc.el: New files.
+
+       * comm.el (comm-call-with-proc, comm-call-with-proc-1): New macros.
+       * wnnrpc.el (wnnrpc-call-with-proc, wnnrpc-call-with-proc-1): Deleted.
+       Throughout: Use comm-call-with-proc and comm-call-with-proc-1.
+
+1997-09-03  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * wnnrpc.el (wnnrpc-call-with-proc-1): Bug fix.  let --> progn.
+
+       * convert.el (egg-conversion-backend): Initail value is NIL.
+
+       * wnn.el (wnn-conversion-backend): New constant.
+
+       * comm.el (comm-format,comm-unpack): Support multibyte string.
+       (comm-format-mb-string): New substitution.
+       (comm-unpack-mb-string): New substitution.
+
+       * wnn.el (wnn-fini): Handle the case where wnn-environments is nil.
+       Reported by Hisashi Miyashita <himi@bird.scphys.kyoto-u.ac.jp>.
+
+1997-09-03  Hiroshi Ogata <hiroshi@nereid.rim.or.jp>
+
+       * mlh.el (mlh-zenkaku): Use new API of Emacs-20,
+       japanese-zenkaku-region.
+
+1997-09-02  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * egg.el (egg-toroku-region): New function.
+
+       * wnn.el (wnn-list-dictionaries): New function.
+       (wnnenv-get-proc): New function.
+
+       * wnnrpc.el (wnndic-get-id, wnndic-get-comment, wnndic-get-dictname): 
+       New substitution.
+       (wnnrpc-get-writable-dictionary-id-list): Rename from
+       wnnrpc-get-writable-dictionary-list.
+
+1997-09-01  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * convert.el (egg-decide-bunsetsu): New function.
+       (egg-decide-before-point): New command.
+       (egg-exit-conversion): Use egg-decide-bunsetsu.
+
+       * its.el (its-start): Divide the fence buffer into two parts and
+       make them intangible, so that point goes appropriate position.
+       (its-put-cursor): The cursor belongs to part-2.
+       (its-buffer-ins/del-SYL): The new SYL belongs to part-1.
+       (its-exit-mode-internal): Remove the property on exit.
+       (its-beginning-of-input-buffer): Make SYLs have property of "part 2".
+       (its-backward-SYL): Likewise.
+       (its-forward-SYL): Make SYLs have property of "part 1".
+       (its-end-of-input-buffer): Likewise.
+
+       (its-input-end): Delete useless argument.
+       (its-beginning-of-input-buffer, its-exit-mode,
+       its-exit-mode-off-input-method, its-kick-convert-region,
+       its-end-of-input-buffer, its-backward-SYL, its-forward-SYL,
+       its-delete-SYL): Follow the change.
+
+1997-08-31  NIIBE Yutaka  <gniibe@chroot.org>
+
+       For egg-mode, don't use minor mode, override local map instead.
+       For its-mode and egg-conversion-mode, don't use minor mode,
+       instead use local-map of text property.
+
+       Although overriding local map is not good, using local-map of
+       property is natural thing.  Besides, point-left/point-entered
+       don't work as I expected (yet).
+
+       * egg.el (egg-mode: variable): Removed.
+       * egg.el (egg-modefull-map, egg-modeless-map): Make them functions.
+       Generate overriding local map.
+       * egg.el (egg-mode): use overriding local map.
+
+       * its.el, convert.el: Undo changes of 1997-08-28 for minor mode
+       and local map of text properties.
+
+       * its.el (its-exit-mode-off-input-method): New function.
+
+1997-08-29  NIIBE Yutaka  <gniibe@chroot.org>
+
+       Let Undo work correctly.
+       * its.el (its-self-insert-char): Delete/Insert cursor.
+
+       * its.el (its-put-cursor): Remove useless first argument.
+       (its-start, its-beginning-of-input-buffer, its-end-of-input-buffer,
+       its-backward-SYL, its-forward-SYL, its-delete-SYL, its-delete-SYL,
+       its-delete-backward-SYL-internal, its-delete-backward-within-SYL): 
+       Follow the change.
+
+1997-08-28  KATAYAMA Yoshio <kate@pfu.co.jp>
+
+       * its-erpin.el: New file.
+       * its-pinyin.el: New file.
+       * its-zhuyin.el: New file.
+
+1997-08-28  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * its.el (its-exit-mode-no-egg): Removed.
+       (its-exit-mode-internal): Remove first argument.
+       (its-kick-convert-region, its-delete-SYL,
+       its-delete-backward-SYL-internal, its-delete-backward-within-SYL):
+       Follow the change.
+
+       Don't use local map of text properties, instead use minor mode.
+       * convert.el (egg-conversion-mode): New minor mode.
+       (egg-conversion-left, egg-conversion-enter): New functions.
+       (egg-insert-bunsetsu): remove local-map, add point-entered and
+       point-left properties.
+       (egg-exit-conversion): Likewise.
+       (egg-exit-conversion): Exit minor mode.
+
+       * its.el (its-put-cursor): remove local-map, add point-entered and
+       point-left properties.
+       (its-enter, its-left): New functions.
+       (its-mode): New variable.  New minor mode.
+
+1997-08-27  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * convert.el (egg-exit-conversion-no-egg): Removed.
+       (egg-exit-conversion): No argument, no egg-mode.
+
+       * convert.el (egg-convert-region): No egg-flag.
+       * its.el (its-exit-mode-internal): Follow it.
+       * mlh.el (mlh-space-bar-backward-henkan): Ditto.
+
+1997-08-26  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * wnn.el (wnn-change-bunsetsu-length): Don't use magic #3.
+
+       * convert.el (egg-insert-bunsetsu-list): Add optional argument
+       CONTIN.
+
+1997-08-25  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * convert.el (egg-insert-bunsetsu): Include seperator.  Add
+       intangible property to bunsetsu.
+       (egg-insert-bunsetsu-list): Follow the change.
+       (egg-backward-bunsetsu, egg-forward-bunsetsu, 
+       egg-select-candidate, egg-next-candidate, 
+       egg-shrink-bunsetsu, egg-enlarge-bunsetsu, 
+       egg-exit-conversion): Ditto.
+
+       * mlh.el (mlh-space-bar-backward-henkan): Call egg-convert-region
+       with last argument t.  Turn of egg-mode.
+
+1997-08-24  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * its.el (its-exit-mode-internal): Inactivate input method.
+
+       * wnn.el (wnn-end-conversion): Change the interface.
+       (wnn-update-frequency): Follow the change.
+       * convert.el (egg-exit-conversion): Follow the change.
+
+       * wnn.el (wnn-start-conversion): Change the return value interface.
+       * convert.el (egg-convert-region): Follow the change.
+
+       * wnn.el (wnnenv-get-bunsetsu-pos, wnnenv-set-bunsetsu-pos): Removed.
+       (wnn-get-bunsetsu-source-afterwards): Removed.
+       (wnn-get-number-of-bunsetsu, wnn-get-bunsetsu-info): Removed.
+       (wnnenv-get-bunsetsu-list, wnnenv-set-bunsetsu-list): Removed.
+       (wnn-start-conversion): Don't call wnnenv-set-bunsetsu-list.
+       (wnn-end-conversion): Ditto.
+
+1997-08-23  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * convert.el (egg-change-bunsetsu-length): Change the interface.
+       (egg-shrink-bunsetsu,egg-enlarge-bunsetsu): Follow it.
+
+       (egg-source-maxlen-from-here): Removed.
+       (egg-get-previous-bunsetsu): New function.
+       (egg-select-candidate, egg-shrink-bunsetsu, egg-enlarge-bunsetsu,
+       egg-next-candidate): Use egg-get-previous-bunsetsu.
+
+1997-08-20  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * egg.el (minor-mode-alist): Don't show " EGG" in mode line.
+       (egg-mode): Use input method indicator instead.
+
+1997-07-20  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * convert.el (egg-next-candidate): Rename from egg-next-conversion.
+       (egg-previous-candidate): Rename from egg-previous-conversion.
+       (egg-select-candidate): Follow the change of new interface.
+       (egg-source-maxlen-from-here): Likewise.
+
+1997-07-19  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * wnn.el (wnn-start-conversion): Change the interface.  Return ENV
+       and the list of bunsetsu.  Fix the documentation string too.
+       * convert.el (egg-convert-region): Follow the change.
+       (egg-insert-converted-result): Change the argument.
+       (egg-insert-bunsetsu-list): Rename from egg-insert-converted-result.
+       (egg-insert-bunsetsu): New function.
+       (egg-get-number-of-bunsetsu,egg-get-bunsetsu-info): Removed.
+       (egg-backward-bunsetsu): Don't use bunsetsu-pos.
+
+       * wnn.el (wnn-get-bunsetsu-converted): Change the interface.  Take
+       BUNSETSU as the argument instead of ENV and POS.
+       * convert.el (egg-get-bunsetsu-converted): Follow the change.
+
+       * wnn.el (wnn-bunsetsu-create): Take ENV as the first argument.
+       (wnn-list-candidates): Dont take ENV.
+       (wnn-bunsetsu-get-env): New substitution.
+
+       * wnnrpc.el (wnnrpc-receive-sho-bunsetsu-list-sub): Take the argument
+       for ENV, and use it for the argument of wnn-bunsetsu-create.
+       (wnnrpc-receive-sho-bunsetsu-list): Take ENV as the first argument.
+       (wnnrpc-renbunsetsu-conversion): Follow the change.
+
+1997-07-17  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * convert.el (egg-decide-candidate):  Change the interface.
+       Take the argument bunsetsu-info instead of conversion-engine.
+
+       * wnn.el (wnn-get-candidate): Deleted.
+
+       * convert.el (egg-get-all-candidates): Change the interface.
+       Take an argument bunsetsu-info instead of conversion-engine.
+       (egg-select-candidate): Follow the change.
+
+       * convert.el (egg-set-bunsetsu-pos,egg-get-bunsetsu-pos): Deleted.
+       (egg-list-candidates,egg-get-current-candidate-number): New stub.
+       * wnn.el (wnn-bunsetsu-create): Add new member zenkouho-pos.
+       (wnn-bunsetsu-get-zenkouho-pos,wnn-bunsetsu-set-zenkouho-pos): New
+       functions.
+       (wnn-list-candidates,wnn-get-current-candidate-number): New functions.
+       (wnn-set-bunsetsu-pos,wnn-get-bunsetsu-pos): Deleted.
+
+       * convert.el (egg-get-number-of-candidates): Change the interface.
+       Take an argument bunsetsu-info instead of conversion-engine.
+       (egg-next-conversion,egg-select-candidate): Follow the change.
+       * wnn.el (wnn-get-number-of-candidates): Follow the change.
+
+       * wnn.el (wnn-get-bunsetsu-source-afterwards): New function.
+       (wnn-change-bunsetsu-length): Use it.
+
+       * convert.el (egg-get-bunsetsu-source): Change the interface.
+       Take an argument bunsetsu-info instead of conversion-engine.
+       (egg-enlarge-bunsetsu,egg-shrink-bunsetsu,egg-source-maxlen-from-here):
+       Follow the change.
+       * wnn.el (wnn-get-bunsetsu-source): Follow the change.
+
+       Put bunsetsu information on text property.
+       * wnn.el (wnn-get-bunsetsu-info): New function.
+
+       * convert.el (egg-insert-converted-result): Put it on text property.
+       (egg-conversion-backend): Add new interface
+       wnn-get-bunsetsu-info.
+       (egg-get-bunsetsu-info): New stub.
+
+1997-07-17  KATAYAMA Yoshio <kate@pfu.co.jp>
+
+       * its.el (its-state-machine-keyseq, its-state-machine): Handle
+       end-of-input correctly when going backward.
+
+1997-07-16  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * wnn.el (wnn-create-directory): Bug fix.  Really make directory.
+
+1997-07-15  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * its-hangul.el (its-define-hangul): Use its-defrule-otherwise.
+
+1997-07-15  KATAYAMA Yoshio <kate@pfu.co.jp>
+
+       * its-hangul.el: Updated.
+
+1997-06-19  NIIBE Yutaka  <gniibe@akebono.etl.go.jp>
+
+       * its-hira.el: its-hira-hankaku-escape --> its-hankaku-escape.
+       its-hira-zenkaku-escape --> its-zenkaku-escape.
+
+1997-06-14  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * its.el: Change the data structure of <expr-output-back-list> so
+       that it can encourage sharing same structure and it can use same
+       structure of SYL.
+       (its-ins/del-SYL-batch): Follow the change of data structure.
+       (its-define-otherwise): Change the argument.
+       (its-defrule-otherwise): New function.
+       (its-eob-keyexpr, its-eob-back, its-make-class+back,
+       its-make-otherwise): New substitutions.
+
+1997-06-13  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * its-kana.el: New file.  Taken from its/kanainput.el of Mule-2.3.
+
+       * its-hira.el: Use `define-its-state-machine'.
+
+       * its.el (its-zenkaku-escape, its-hankaku-escape): Make them
+       defconst.
+       (define-its-state-machine, define-its-state-machine-append): New
+       macro.
+
+1997-06-13  NIIBE Yutaka  <gniibe@akebono.etl.go.jp>
+
+       * its-hira.el ("n'"): Added.
+
+1997-06-12  NIIBE Yutaka  <gniibe@akebono.etl.go.jp>
+
+       its-zenkaku-escape and its-hankaku-escape are also used in hangul.
+       * its.el (its-zenkaku-escape, its-hankaku-escape): Moved to here
+       and rename them.
+       * its-hira.el (its-hira-hankaku-escape, its-hira-zenkaku-escape): 
+       Removed.
+
+       * its.el (its-read-current-its-string): Removed.  There's the
+       function `read-multilingual-string' already.
+
+1997-06-12  KATAYAMA Yoshio <kate@pfu.co.jp>
+
+       * its-hangul.el: New file.
+
+1997-06-10  NIIBE Yutaka  <gniibe@chroot.org>
+
+       Miscellaneous cosmetic changes.
+       * comm.el: New file.  Move communication related funcitons from
+       wnnrpc.el.
+       (comm-format-u32c, and others): Rename from wnnrpc-*.
+       * wnnrpc.el (Throughout): Follow the rename.
+
+       * wnn.el (wnnenv-get-in-use-flag): Rename from wnn-e-get-in-use.
+       (wnnenv-set-in-use-flag): Rename from wnn-e-set-in-use.
+       (Others): Rename from wnn-e-*.
+       (wnn-bunsetsu-*): Rename from wnnrpc-b-*, and moved from wnnrpc.el.
+
+       * convert.el (egg-exit-conversion): Call egg-do-auto-fill.
+
+       * its.el (its-translate-region): Bug fix.  End of input.
+       (its-state-machine): Bug fix.  Generate error if
+       its-barf-on-invalid-keyseq.
+       (its-exit-mode-internal): Call egg-do-auto-fill.
+
+       * wnnrpc.el (ccl-decode-fixed-euc-jp): Bug fix for ASCII.
+
+       * mlh.el (mlh-space-bar-backward-henkan): Call egg-do-auto-fill.
+
+       * egg.el: Comment out definition of C-\ in global-map.
+
+1997-06-09  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * its.el (its-kick-convert-region): Rename from its-convert-region.
+       (its-mode-map): Follow the change.
+
+       (its-make-next-state): Use list instead of cons.
+
+       (its-get-kst/t): Make it substitution.
+       (its-set-kst, its-get-keyseq, its-set-keyseq, its-kst-p, 
+       its-get-output, its-set-output, its-get-keyseq-syl): Likewise.
+       (its-new-state, its-new-map, its-get-indicator, its-set-indicator,  
+       its-get-start-state, its-reset-start-state): Likewise.
+
+       (its-get-next-state): Use assq instead of assoc.
+
+       (its-goto-state): Tune up.
+
+1997-06-08  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * mlh.el: Merge mlh-nihongo.el.
+       * mlh-nihongo.el: Removed.
+
+       * its-hira.el: Moved from its/hira.el.  Move comments to HISTORY.
+       (its-hira-enable-double-n, its-hira-period, its-hira-comma,
+       its-hira-open-bracket, its-hira-close-bracket,
+       its-hira-horizontal): New variables.
+       Use the variables to define the state-machine.
+
+       Implement non-interactive translation in ITS.
+       * its.el (its-translate-region): New function.
+       (its-latest-SYL): New Variable.
+       (its-state-machine-keyseq): Use it.
+       (its-update-latest-SYL): New function.
+       (its-buffer-ins/del-SYL): Use it.
+       (its-translation-result): New variable.
+       (its-ins/del-SYL-batch): New function.
+       (its-enable-double-n-syntax, its-use-kuten-for-period,
+       its-use-touten-for-comma, its-zenkaku-escape, its-hankaku-escape):
+       Removed.
+
+       Use ITS, delete mlh's own implementation of automata.
+       * mlh.el (mlh-start-state, mlh-set-of-chars, mlh-start-state-sym,
+       mlh-set-of-chars-sym, mlh-define-automata, mlh-end-of-definition,
+       mlh-defrule, mlh-next-state, mlh-roma-kana-backward): Removed.
+       (mlh-cause-error-when-unknown-romaji-sequence): Removed.
+       (mlh-atoi): Removed.
+       (mlh-white-space, mlh-zenkaku-white): Use string-to-int.
+       * mlh-nihongo.el (mlh-hira-start-state, mlh-hira-chars, and all
+       rules of definition which defines the automaton): Removed.
+       (mlh-kanji-with-henkan-region-function): Use its-translate-region.
+       (mlh-hiragana, mlh-katakana): Likewise.
+
+       Fix of CCL.
+       * wnnrpc.el (ccl-decode-fixed-euc-jp): Bug fix for jisx0212.
+       Add missing parens.
+
+       Speed up of unpacking.
+       * wnnrpc.el (wnnrpc-following-char-or-wait): Tune up.
+       (wnnrpc-following+forward-char): New function.
+       (wnnrpc-unpack-u32c, wnnrpc-unpack-u32, wnnrpc-unpack-u16,
+       wnnrpc-unpack-u8): Use it.
+       (wnnrpc-accept-process-output): New function.
+       (wnnrpc-unpack-u16-string, wnnrpc-unpack-u8-string,
+       wnnrpc-unpack-bytes): Use it.  Use search-forward.
+       (wnnrpc-unpack-u16-string): Use decode-coding-region.
+
+1997-06-07  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * wnn.el (wnn-get-all-candidates): New function.
+       (wnn-set-bunsetsu-pos): Return 0 (instead of -1).
+
+       * convert.el (egg-get-candidate): Removed.
+       (egg-get-all-candidates): New entry function.
+       (egg-conversion-backend): Entry for egg-get-all-candidates.
+       (egg-select-candidate): New function.
+       (egg-conversion-map): Bind "\M-s" and egg-select-candidate.
+
+1997-06-05  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * bushu.el: Renamed from busyu.el.
+       (bushu-break-string, etc): Renamed from busyu*.
+
+       * menu.el: Completely rewritten.
+
+1997-06-03  NIIBE Yutaka  <gniibe@akebono.etl.go.jp>
+
+       * its.el (its-reset-start-state): Bug fix.  Delete a CDR.
+
+       Implement "class of key" transition.
+       Change the structure of <state>, the last member is
+       <key-state-table/terminal> instead of <key-state-alist/terminal>.
+       * its.el (its-kst-p): Rename from its-ksa-p.
+       (its-get-next-state): Follow the change of the data structure.
+       (its-state-machine): Likewise.
+       (its-make-next-state): Likewise.
+       (its-set-kst): New function.
+       (its-get-otherwise): New function.
+       (its-otherwise-match): New function.
+       (its-define-otherwise-terminate-here): Removed.
+       (its-define-otherwise): New function.
+       (its-defrule*): Use its-define-otherwise.
+
+       * its/hira.el (n): Use its-define-otherwise.
+
+1997-06-02  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * wnnrpc.el (wnnrpc-receive-sho-bunsetsu-list-sub,
+       wnnrpc-receive-sho-bunsetsu-list-sub-2): Splited from
+       wnnrpc-receive-sho-bunsetsu-list.
+       (wnnrpc-receive-dai-bunsetsu-list): New function.
+       (wnnrpc-daibunsetsu-conversion, wnnrpc-get-daibunsetsu-candidate): 
+       New function.
+
+1997-06-01  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * wnnrpc.el (ccl-decode-fixed-euc-jp): Clean it up.
+       (wnnrpc-file-attribute): Rename from wnnrpc-stat-file.
+       (wnnrpc-get-dictionary-list-with-environment): Rename from
+       wnnrpc-get-dictionary-list-with-environment.
+
+       Implement RPC more.
+       * wnnrpc.el (wnnrpc-who, wnnrpc-get-env-list, wnnrpc-kill,
+       wnnrpc-delete-dictionary, wnnrpc-set-flag-on-dictionary,
+       wnnrpc-get-dictionary-list, wnnrpc-delete-word,
+       wnnrpc-receive-word, wnnrpc-search-word,
+       wnnrpc-search-word-in-dictionary, wnnrpc-get-word-info,
+       wnnrpc-set-comment-on-word, wnnrpc-get-dictionary-info,
+       wnnrpc-set-file-comment, wnnrpc-hinshi-name,
+       wnnrpc-set-file-password, wnnrpc-set-hinshi-table): New functions.
+
+1997-05-31  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * wnnrpc.el (wnnrpc-format-u32c, wnnrpc-unpack-u32c): New
+       substitutions.  Support 32-bit number represented in cons cell of
+       a pair of 16-bit integer.
+       (wnnrpc-format, wnnrpc-unpack): Handle u32c (U).
+
+       (wnnrpc-format-bytes, wnnrpc-unpack-bytes): New substitutions.
+       Support byte stream end with 255(-1).
+       (wnnrpc-format, wnnrpc-unpack):  Handle bytes (B).
+
+       (wnnrpc-local-file-loaded): New function.
+       (wnnrpc-call-with-proc-1): New macro.  Assume the buffer is the one
+       of process.
+
+1997-05-29  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * wnnrpc.el (wnnrpc-get-conversion-parameters, wnnrpc-file-loaded,
+       wnnrpc-write-file, wnnrpc-get-fuzokugo-file, wnnrpc-get-file-list,
+       wnnrpc-get-file-list-with-env, wnnrpc-stat-file,
+       wnnrpc-get-file-info): New functions.
+       wnnrpc-receive-file-list): New subst.
+
+1997-05-29  Kenichi Handa  <handa@etl.go.jp>
+
+       * wnnrpc.el (ccl-decode-fixed-euc-jp): Tune it up.
+
+1997-05-29  Hisashi Miyashita  <himi@bird.scphys.kyoto-u.ac.jp>
+
+       * wnnrpc.el (fixed-euc-jp, ccl-decode-fixed-euc-jp,
+       ccl-encode-fixed-euc): New private coding system.  Encode/decode
+       CCL for it.
+
+1997-05-27  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * wnnrpc.el (wnnrpc-tanbunsetsu-conversion): Change the argument.
+       (wnnrpc-get-bunsetsu-candidates): Likewise.
+       (wnnrpc-renbunsetsu-conversion): Likewise.
+
+       * wnn.el (wnn-change-bunsetsu-length): Follow the change.
+       (wnn-set-bunsetsu-pos): Likewise.
+       (wnn-change-bunsetsu-length, wnn-start-conversion): Likewise.
+
+1997-05-25  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * wnnrpc.el (wnnrpc-add-word, wnnrpc-get-dictionary-list,
+       wnnrpc-receive-dictionary-list, wnnrpc-get-writable-dictionary-list,
+       wnnrpc-get-hinshi-list, wnnrpc-hinshi-number): New functions.
+       (wnnrpc-unpack-u16-string): Bug fix for the case of ASCII string.
+
+       * wnn.el (wnn-dictionary-specification): Add dictionaries of
+       gerodic and ones of WNN consortium.
+
+       Implement a false path.
+       * wnnrpc.el (wnnrpc-renbunsetsu-conversion): Generate an error on
+       failure.
+       (wnnrpc-get-bunsetsu-candidates): Ditto.
+       (wnnrpc-tanbunsetsu-conversion): Ditto.
+
+       Implement a false path.  Error recovery.
+       * wnn.el (wnn-create-directory, wnn-open-dictionary,
+       wnn-open-frequency, wnn-query-del/create-frequency): New function.
+       (wnn-set-dictionary-sub): New function.
+
+1997-05-24  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * wnnrpc.el (wnnrpc-version, wnnrpc-access, wnnrpc-mkdir,
+       wnnrpc-create-dictionary, wnnrpc-create-frequency, 
+       wnnrpc-discard-file, wnnrpc-remove-file): New functions.
+       (wnnrpc-test-result-and-get-error): New subst.
+
+       Implement a false path from wnnrpc-set-fuzokugo-file.
+       * wnnrpc.el (wnnrpc-set-fuzokugo-file): Return negate-encoded
+       error code on failure.
+       * wnn.el (wnn-create-environment): Generate an error message.
+
+       Implement a false path from wnnrpc-open-file.
+       * wnnrpc.el (wnnrpc-open-file): Change the interface.  Return
+       negate-encoded error code on failure.
+       * wnn.el (wnn-open-file): New function.
+       (wnn-create-environment): Handle return value, and generate
+       an error message for wnnrpc-set-fuzokugo-file on failure.
+       (wnn-set-dictionary): Handle return value.
+
+1997-05-17  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * wnnrpc.el (wnnrpc-error-message): Error strings taken from
+       Wnn-4.2 distribution.
+       (wnnrpc-errono): Removed.
+
+       Implement a false path from wnnrpc-open.
+       * wnnrpc.el (wnnrpc-open): Change the interface.  Return NIL on
+       success, error code on failure.
+       * wnn.el (wnn-open): Delete process and buffer.
+       Generate an error on failure.
+       (wnn-get-environment): Follow the change (none).
+       (wnn-start-conversion): Follow the change (none).
+       * convert.el (egg-convert-region): Follow the change.  Call
+       delete-region after egg-start-conversion.
+
+       Implement a false path from wnnrpc-connect.
+       * wnnrpc.el (wnnrpc-connect): Change the interface.  Return
+       negate-encoded error code on failure.
+       * wnn.el (wnn-create-environment): Generate an error on failure.
+       (wnn-get-environment): Follow the change.  On failure, don't
+       register the environment to wnn-environments.
+
+1997-05-16  NIIBE Yutaka  <gniibe@akebono.etl.go.jp>
+
+       Dynamically allocate environment arbitrarily.
+       * wnn.el (wnn-create-environment): Change the structure of ENV.
+       (wnn-e-get-in-use, wnn-e-set-in-use): New subst.
+       (wnn-end-conversion): Call wnn-e-set-in-use.
+       (wnn-get-environment, wnn-find-env-not-in-use): New function.
+       (wnn-start-conversion): Call wnn-get-environment.
+
+       * wnn.el (wnn-fini): Implemented.
+
+1997-05-15  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * convert.el (egg-start-conversion): Change the interface.
+       (egg-convert-region): Follow the change.
+       (egg-open-if-not): Removed.
+       * wnn.el (wnn-start-conversion): Follow the change.
+
+       * wnn.el (wnn-environment-list): Removed.
+       (wnn-environment-serial): Removed.
+       (wnn-connect-and-init): Removed.
+       (wnn-environments): New variable which holds all environments.
+
+1997-05-15  NIIBE Yutaka  <gniibe@akebono.etl.go.jp>
+
+       * wnn.el (wnn-change-bunsetsu-length): Bug fix.  Last argument to
+       wnnrpc-b-set-freq-down is list of bunsetsu.
+
+       * mlh.el (mlh-do-spacing): Emacs 20 related changes.  
+       Use category-set-mnemonics, and char-category-set.
+       According to suggestion by Kenichi Handa <handa@etl.go.jp>.
+
+1997-05-15  MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+       * wnn.el (wnn-usr-dic-dir): New variable.
+       (wnn-filename): Use wnn-usr-dic-dir.
+
+       * its.el (its-defrule): New argument `enable-overwrite'.
+
+1997-05-14  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * convert.el (egg-exit-conversion-unread-char): Use newer variable
+       unread-command-events, as unread-command-char is obsolete.
+       (egg-shrink-bunsetsu, egg-source-maxlen-from-here,
+       egg-enlarge-bunsetsu, egg-next-conversion, egg-exit-conversion,
+       egg-exit-conversion, egg-insert-converted-result): New property
+       EGG-CONVERSION-ENGINE, which specifis backend.
+
+       (egg-start-conversion, egg-get-number-of-bunsetsu,
+       egg-get-bunsetsu-converted, egg-set-bunsetsu-pos,
+       egg-get-bunsetsu-pos, egg-get-number-of-candidates,
+       egg-get-candidate, egg-decide-candidate,
+       egg-change-bunsetsu-length, egg-get-bunsetsu-source,
+       egg-end-conversion): Change the interface, new argument c.
+       * wnn.el (wnn-start-conversion, wnn-get-number-of-bunsetsu,
+       wnn-get-bunsetsu-converted, wnn-set-bunsetsu-pos, 
+       wnn-get-bunsetsu-pos, wnn-get-number-of-candidates, 
+       wnn-get-candidate, wnn-decide-candidate, 
+       wnn-change-bunsetsu-length, wnn-get-bunsetsu-source, 
+       wnn-end-conversion): Likewise.
+
+       * convert.el (egg-open-if-not): Change the interface.  Return
+       conversion backend.
+
+       * wnnrpc.el (wnnrpc-following-char-or-wait, wnnrpc-unpack-u32,
+       wnnrpc-unpack-u16, wnnrpc-unpack-u8, wnnrpc-unpack-u16-string,
+       wnnrpc-unpack-u8-string): Change the interface to avoid
+       compilation warnings.
+       (wnnrpc-unpack): Use new interface.
+
+       * wnn.el (wnn-open): Change the name of WNN buffer as debug has
+       been done.
+
+1997-05-11  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * wnnrpc.el (wnnrpc-following-char-or-wait): Rename from
+       wnn-following-char-or-wait.
+       (wnnrpc-following-char-or-wait): Declare with DEFUN instead of
+       DEFSUBST.
+
+1997-05-10  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * Throughout: Use JUNET coding system for file format.
+
+       * mlh.el: Move some comments to HISTORY.
+       (mlh-version): Removed.
+       Remove all autoload entries.
+       (henkan-region-function): Removed.
+       (member): Don't need any more.
+
+       * mlh-nihongo.el: Renamed from nihongo.el.
+
+       * mlh.el (mlh-space-bar-backward-henkan): call egg-convert-region
+       directly.
+       (mlh-space-bar-backward-henkan): Fix for Emacs 20.
+       Don't call egg:do-auto-fill.
+       (mlh-backward-henkan): Use set-marker-insertion-type.
+       (mlh-do-spacing): Char-category.
+
+       * mlh.el, nihongo.el: Taken from mlh-1.002 distribution.
+
+1997-05-07  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * convert.el (egg-update-frequency): Removed.
+       (egg-conversion-backend): Remove entry for update-frequency.
+
+       * wnn.el (wnn-dictionary-specification): Change parameters
+       according to suggestion by Tomoko Yoshida in mule-jp@etl.go.jp.
+       Original had been taken from wnn-4.2.
+
+1997-05-06  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * convert.el (egg-next-conversion): Bug fix.  It's max+ instead of n.
+
+1997-05-05  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * wnnfns.c (Fwnn_get_bunsetsu_converted): Rename from
+       get-converted-bunsetsu.
+       (Fwnn_get_bunsetsu_source): Ditto.
+       * convert.el (egg-get-bunsetsu-converted): Ditto.
+       (egg-get-bunsetsu-source): Ditto.
+
+       * wnn.el (wnn-create-environment): New file which mimics API of
+       wnnfns.c.
+
+1997-04-29  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * wnnrpc.el: New file which implements Remote Procedure Calls of WNN.
+
+1997-04-16  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * its/kanainput.el (normal-pair): Use its-defrule*.
+
+       * its.el (its-defrule*): Rewritten.
+
+       * its/hira.el ("n"): Alternative implementation using 'otherwise'.
+
+       * its.el (its-processing-map): Removed.
+       (its-register-map): Rename from its-set-map.
+       (its-register-map): Remove first argumet NAME.
+       (its-defrule): Remove last optional argument END.
+       (its-define-otherwise-terminate-here): New function.
+       (its-goto-state): New function.
+       (its-defrule, its-defoutput): Use its-goto-state.
+
+1997-04-12  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * its.el: Enhance meaning of ITS state machine.  Now, <key>
+       includes representation of "ANY of key stroke" (-2).
+       (its-defrule): New feature end=='otherwise.
+       (its-defrule*): New function.
+       (its-state-machine): Implement otherwise-terminate-before-this-key.
+
+       * its/kanainput.el (its-k-zenkaku-escape, its-k-hankaku-escape,
+       its-k-symbols-escape): Add prefix its-.  Let them defconst.
+       "W": Move the definition beginning to avoid error.
+
+1997-03-26  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * convert.el (egg-next-conversion): -1 goes to end of bunsetsu.
+
+1997-03-25  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * egg.el (egg-mode-on, egg-input-mode, egg-in-fence-mode): Deleted.
+       (egg-fence-face-on, egg-fence-face-off): Deleted.
+       (egg-region-start, egg-region-end): Deleted.
+
+1997-03-24  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * its/hira.el ("n"): Add "z" and "?" for prefetch char of "n".
+
+       Implement conversion mode.
+       * convert.el: New file.
+
+1997-03-23  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * its.el (its-mode-map): As "\C-g" is used in global-map, use
+       "\C-]" instead (for its-cancel-input).
+
+1997-03-22  NIIBE Yutaka  <gniibe@chroot.org>
+
+       Introduce new scheme to specify server.
+       * wnnfns.c (Qjserver, Qcserver, Qtserver, Qkserver): Removed.
+       (Vwnn_server_type): Integer variable.
+       (wnn_get_server_type): Renamed from wnn_check_server_type.
+       (charset_wnn_server_type): Renamed from lc_wnn_server_type.
+
+       Introduce new scheme to specify uniqueness.
+       * wnnfns.c (Qwnn_no_uniq, Qwnn_uniq, Qwnn_uniq_kanji): Removed.
+       (Vwnn_uniqueness_specifier): Integer variable.  Renamed from
+       wnn_uniq_level.
+
+1997-03-21  NIIBE Yutaka  <gniibe@chroot.org>
+
+       Cosmetic changes.
+       * wnnfnc.c (Throughout): Change Lisp function name to follow the
+       format of wnn-VERB-OBJECT.
+       Use XFASTINT instead of XINT, if appropriate.
+       
+       * wnnfns.c (Fwnn_fuzokugo_set): Merged with wnn-set-fuzokugo of
+       wnn-egg.el.
+
+       * wnn-egg.el (wnn-set-fuzokugo): Deleted.
+
+       * wnnfns.c (Fwnn_dict_add): Merged with wnn-add-dict of wnn-egg.el.
+       * wnn-egg.el (wnn-add-dict): Deleted.
+
+       * wnn-egg-msg.el (wnn-msg-get): Renamed from egg-msg-get.
+       (wnn-message-alist): Renamed from egg-message-alist.
+       Use defconst.
+
+       * wnnfns.c (wnn_check_server_type): Renemed from
+       check_wnn_server_type.
+
+       * wnn-egg-msg.el (egg-error): Deleted.  Not useful enough.
+       * wnn-egg.el (Throughout): Replace egg-error by error.
+
+       * egg.el (egg-sai-henkan-start, egg-sai-henkan-end,
+       egg-old-bunsetu-suu): Moved from wnn-egg.el.
+
+       * wnn-egg.el (Throughout): Change variable name and function name.
+       Added wnn- prefix, egg- prefix.
+       * wnn-egg.el: Delete historical defaliases.  Only support 
+       wnn-set-[cjk]server-hostname.
+
+       * wnn6.el: New file.  Discriminate Wnn6 related functions.
+       * eggrc-wnn6: New file.  Discriminate Wnn6 related setting.
+
+       * egg-fence.el: Removed.
+
+1997-03-20  NIIBE Yutaka  <gniibe@chroot.org>
+
+       Distingush continuation of egg-mode and turn off of egg-mode.
+       * its.el (its-mode-map): Bind "\C-\\" to its-exit-mode-no-egg.
+       (its-exit-mode-internal): New argument egg-mode-flag.
+       (its-exit-mode-no-egg): New Function.
+
+       Rethink about keymap.  Once, the intention of egg-mode-map has
+       been to override ALL of the keymap.  That's so selfish, and not
+       friendly to other parts of Emacs.  This implementation intend to
+       be more friendly with other keymaps.
+       * its.el (its-mode-map): Remove definition of "\C-c" for
+       its-cancel-input, as C-c has special meaning in Emacs.  We should
+       not re-define it.  
+       Remove definition of "\C-q" for its-select-previous-map.  
+       Remove definition of "\C-_" for egg-jis-code-input.  
+       Remove definition of "\C-w", "\C-@", [?\C-\ ] for
+       egg-henkan-fence-region.
+
+       Implement START/CURSOR/END scheme.
+       * its.el (its-input-to-vsyl): New function.
+       (its-beginning-of-input-buffer): New function.
+       (its-end-of-input-buffer): New function.
+       (its-backward-SYL): New function.
+       (its-forward-SYL): New function.
+       (its-delete-SYL): New function.
+       (its-delete-backward-SYL): New function.
+       (its-delete-backward-SYL-internal): New function.
+       (its-delete-backward-within-SYL): New function.
+       (its-delete-by-keystroke): New Variable.
+       (its-exit-mode): New function.
+       (its-exit-mode-internal): New function.
+
+       * its.el (its-standard-map-list, its-find, its-next-map,
+       its-previous-map): Deleted.
+       (its-get-indicator): Delete duplicated definition.  Leave one which
+       takes <map> argument.
+       (its-input): Rename from its-input-subsubsub.
+
+       * egg.el (egg-mode-map): Don't include SPACE.
+
+       Introduce CURSOR.
+       * its.el (its-state-machine): Add new argument EMIT.  Return CURSOR.
+       (its-state-machine-keyseq): Likewise.
+       (its-input-subsubsub): Return CURSOR.
+       (its-input-subsub): Deleted.
+       (its-DSYL-p): Deleted.
+       (its-buffer-insert-SYL-list): Deleted.
+       (its-buffer-ins/del-SYL): New function.
+       (its-input-end): Change the argument to P of point, and return VOID.
+
+       Change structure of <map>.  <start-state> is normal <state>.
+       (its-new-map): Follow the change of structure.
+       (its-get-indicator, its-set-indicator, its-reset-start-state): 
+       Likewise.
+       (its-reset-start-state): Renamed from its-reset-start.
+
+       Don't use <input-buffer>, but introduce new scheme of SYL property.
+       (its-change-t-to-nil, its-nil-index, its-bytes-between,
+       its-delete-between, its-move-nil--->, its-move-nil-<--,
+       its-move-nil-<--sub, its-move-nil-to-last, its-move-nil-to-first):
+       Deleted.
+
+1997-03-19  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * its.el: Change the structure of DSYL.  Same as <state>.
+       (its-input-subsub): Follow the change of structure.
+       (its-make-DSYL): Deleted.
+       (its-get-keyseq-cooked): New function.
+
+       Swap the meaning of T/NIL of <SYL>.
+
+       Delete the structure of <input-buffer>.
+       (its-new-input-buffer): Deleted.
+       (its-input-subsub): Remove the argument SYLP.
+       (its-input, its-input-sub, its-init-text-properties): Deleted.
+
+       Introduce START, END and CURSOR.
+
+1997-03-19  NIIBE Yutaka  <gniibe@akebono.etl.go.jp>
+
+       Global-map should be used, for key sequence not defined by
+       its-mode-map and/or egg-mode-map.   Don't mask other maps.
+       * its.el (its-mode-esc-map): Deleted.
+       (its-mode-map): Include define-key of the esc-map here.
+       * egg.el (egg-mode-esc-map): Deleted.
+       (egg-mode-map): Include define-key of the esc-map here.
+       
+1997-03-18  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * its.el (its-input): Rename from its-input-input-buffer.
+       (its-state-machine): Handle END of input (key == -1).
+
+       ITS minor mode deleted.  It's implemented by local-map of text
+       properties.
+       (its-mode): Remove the variable.
+       (its-mode): Remove the function.
+
+       * its.el (<input-buffer>): Change the order of <SYL> list.  
+       (car sylp) is last entry of the list.
+       (its-input-buffer): Deleted.  It's now a member of text
+       properties.
+       (<map>): Change the structure.  Start state should have "" for keyseq.
+       (its-get-start-state): Follow chage of the <map> structure.
+       (its-reset-start, its-set-indicator, its-get-indicator): Likewise.
+       (its-new-state, its-new-map): Split from its-new-state/map.
+       (its-make-map): Deleted.
+
+1997-03-17  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * its.el (its-buffer-insert-SYL-list): Use insert-and-inherit to
+       inherit properties.
+       (its-fence-overlay): Removed. Don't use overlay, as it has no
+       information in undo-list.
+
+1997-03-16  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * its/hira.el ("n"): Use new feature END.
+       ("ppy", "bby", "ddy", "jjy", "zzy", "ggy", "lly", "rry", "hhy",
+       "cch", "tts", "tty", "ssh", "ssy", "kky"): its-defoutput.
+
+       * its.el (its-defrule): Add argument END.
+       (its-buffer-delete-SYL): Bug fix. Use length instead of string-width.
+
+1997-03-15  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * its.el (its-input-input-buffer): Implement the case of DSYL.
+
+1997-03-14  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * its.el (its-buffer-delete-SYL): Handle the case of NIL.
+
+       * its/hira.el: Implement "kka" and others.  Implemlement "N".
+       (digit-characters, symbol-characters, downcase-alphabets,
+       upcase-alphabets): Delete useless defvar-s.  
+
+1997-03-14  NIIBE Yutaka  <gniibe@akebono.etl.go.jp>
+
+       * its/hira.el ("roma-kana"): Follow change of implementation of
+       state machine.
+
+       Correct the abuse of the word "MODE".  It seems that it's direct
+       influence of "mode" in Emacs, but it's not mode at all.
+       * its.el (its-map-alist): Renamed from its-mode-alist.
+       (its-get-map): Renamed from its-get-mode-map.
+       (its-set-map): Renamed from its-set-mode-map.
+       (its-define-state-machine): Renamed from its-define-mode.
+       (its-select-map-menu): Renamed from its-select-mode-menu.
+       (its-select-map-from-menu): Renamed from its-select-mode-from-menu.
+       (its-standard-map-list): Renamed from its-standard-modes.
+       (its-next-map): Renamed from its-next-mode.
+       (its-previous-map): Renamed from its-previous-mode.
+       (its-select-map): Renamed from its-select-mode.
+       (its-get-indicator): Renamed from its-get-mode-indicator.
+
+       (its-select-map-from-menu): As it's not mode, don't need offer hooks.
+       (its-next-map): Likewise.
+       (its-previous-map): Likewise.
+       (its-select-map): Likewise.
+
+       Change the implementation of its-mode-alist.  Name is in <map> now.
+       * its.el (its-get-mode-map): Just do assoc.
+       (its-set-mode-map): Simplified.
+
+       * its.el (its-get-indicator): Renamed from its-map-indicator.
+       (its-set-indicator): Renamed from its-map-set-indicator.
+       (its-get-start-state): Renamed from its-map-start.
+       (its-new-state): Change the argunents.
+       (its-map-set-start): Removed.
+       (its-reset-start): New function.
+
+       Remove old implemantation of translator.
+       * its.el (its-resize, its-maps, its-actions, its-inputs,
+       its-level, its-maxlevel, its-char-from-buff, its-interactive):
+       Removed.
+       (its-make-action, its-reset-maps, its-current-map,
+       its-previous-map, its-level, its-enter-newlevel, its-reset-input,
+       its-flush-input-before-point, its-peek-char, its-read-char):
+       Removed.
+       (its-push-char, its-ordinal-charp, its-delete-charp): Removed.
+       (its-translate-region): Removed.
+       (its-buff-s, its-buff-e): Removed.
+       (its-state-terminalp): Removed.
+
+       Remove selection of candidates in map, it's questionable to
+       implement this feature with SYL.  Might rethink in future.
+       (its-make-menu-from-map-result, its-make-alist-from-map-result):
+       Removed.
+       (its-make-menu-from-map, its-make-menu-from-map*): Removed.
+       (its-make-alist-from-map, its-make-alist-from-map*): Removed.
+       (its-completing-read): Removed.
+       (its-minibuffer-local-must-match-map,
+       its-minibuffer-local-completion-map): Removed.
+       (its-minibuffer-completion-help, car-string-lessp,
+       its-temp-echo-area-contents): Removed.
+
+       Implement SYL-based state machine.
+       * its.el (its-input-buffer, its-barf-on-invalid-keyseq): New variables.
+       (its-new-input-buffer): New function.
+       (its-self-insert-char): New command.
+       (its-initial-ISYL, its-make-DSYL, its-make-VSYL,
+       its-input-input-buffer, its-input-input-buffer-sub,
+       its-state-machine, its-state-machine-keyseq, 
+       its-buffer-delete-SYL, its-buffer-insert-SYL-list,
+       its-get-next-state, its-get-ksa/b, its-get-keyseq, its-ksa-p,
+       its-get-output): New function.
+       (its-get-KAS): Removed.
+       (its-get-state, its-get-action, its-set-action): Removed.
+       (its-make-KAS, its-get-KAS): Removed.
+
+       * its.el (its-defrule-sub): Merged into its-defrule.
+
+1997-03-13  NIIBE Yutaka  <gniibe@akebono.etl.go.jp>
+
+       * its.el: (its-define-mode): Change the arguments.
+       * its/zhuyin.el ("zhuyin"): Follow the changes of its-define-mode.
+       * its/zenkaku.el ("zenkaku-downcase"): Likewise.
+       * its/pinyin.el ("PinYin"): Likewise.
+       * its/kata.el ("roma-kata"): Likewise.
+       * its/kanainput.el ("kanainput"): Likewise.
+       * its/hira.el ("roma-kana"): Likewise.
+       * its/hankaku.el ("downcase"): Likewise.
+       * its/hangul.el ("hangul"): Likewise.
+       * its/han-kata.el ("roma-han-kata"): Likewise.
+
+       * its.el (its-action-output, its-action-next, its-get-next-map,
+       its-set-next-map): Removed.
+       (its-make-next-state): New function.
+       (its-make-state): Removed.
+
+       * its.el (its-defrule-sub): Renamed from `its-defrule**'.
+
+       * wnnfns.h: New file.  Macros for WNN6 are defined here.
+       * wnn6fns.c: New file.  Moved from wnnfns.c for WNN6 specific
+       functions.
+
+1997-03-12  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * wnnfns.c: cosmetic changes (indentation, commenting-out-style,
+       and compare to Qnil, etc).
+       Get rid of "register" qualifier.
+
+1997-03-05  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * its.el (its-define-mode): Change internal structure.  Completely
+       rewritten.
+       (its-make-map): Function to make map.
+       (its-make-state): New function.  Make new state.
+       (its-make-KAS): New function.  Make Key-Action-State triad.
+       (its-state-terminalp): New function.  True when the state is
+       terminal.
+       (its-map-indicator, its-map-set-indicator,): Changed.
+       (its-map-terminalp, its-map-incrementalp,
+       its-map-set-incrementalp, its-map-alist, its-map-set-alist,
+       its-map-action, its-map-set-action): Removed.
+
+       (its-defrule-verbose): Deleted.  Seems debug purpose variable.
+
+       (its-make-map): Removed <state>.  It was useless space eater.
+       (its-map-indicator, its-map-set-indicator, its-map-alist,
+       its-map-set-alist, its-map-action, its-map-set-action): Follow the
+       change.
+       (its-define-mode): Likewise.
+       (its-defrule**): Change the argument.  Delete STATE.
+       (its-defrule): Likewise.
+       (its-map-state, its-map-set-state): Removed.
+
+       <topmap>: Changed the structure.  Introduce <incrementalp>, which
+       is t on hangul-map, zhuyin-map, and kanainput-map.
+       (its-define-mode): Change the arguments.  INDICATOR and RESET is 
+       always required.  Add new argument INCREMENTALP.
+       * its/kanainput.el ("kanainput"): Use new API of its-define-mode.
+       * its/hangul.el ("hangul"): Likewise.
+       * its/zhuyin.el ("zhuyin"): Likewise.
+       * its.el (its-make-terminal-state-sofar): Removed.
+       (its-default-make-terminal-state): Removed.
+       (its-make-terminal-state): Removed
+       (its-make-non-terminal-state): Removed.  Not used.
+       (its-map-incrementalp, its-map-set-incrementalp): New functions.
+       
+1997-03-04  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * its.el (its-defrule-conditional, its-defrule-conditional*):
+       Removed.  Evaluating cond clause at runtime is stupid.  Rules
+       should be determined at compile time, not at run time.
+       (its-get-action): Simplified.  It's always standard.
+       (its-make-terminal-state-sofar): Likewise.
+       (its-make-action): Renamed from its-make-standard-action.
+       (its-standard-actionp): Removed.  No use.
+       (its-translate-region): Simplified.
+
+       (its-map-topmap-p): Removed.  No use.
+
+       (its-simple-actionp, its-collect-simple-action): Removed. No use.
+
+       (its-insert-output-string, its-display-status-string): Removed.
+       It seemd these variables is to debug ITS itself.
+       (its-translate-region): Simplified.
+       
+       * its/hira.el (".", ",", "n", "nn"): Rules should be determined at
+       compile time.
+       * its/han-kata.el: Likewise.
+       * its/kata.el: Likewise.
+
+       * its.el (its-make-standard-action): Simplified.
+       (its-make-standard-action): Remove alternative output.
+       (its-standard-actionp): Simplified.
+       (its-action-next): Simplified.
+       (its-select-alternative-output-menu): Removed.  Not used at all.
+       (its-select-alternative-output): Ditto.
+
+       * its/han-kata.el, its/zenkaku.el, its/kata.el, its/kanainput.el,
+       its/hira.el, its/hankaku.el: Add (require cl).
+
+       * its.el (its-enable-double-n-syntax, its-use-kuten-for-period,
+       its-use-touten-for-comma, its-zenkaku-escape, its-hankaku-escape):
+       Declare here.  Add prefix `its-'.  ):
+
+       (its-defrule, its-defrule*): Remove MAP argument.
+       Merged into its-defrule.
+
+1997-03-04  NIIBE Yutaka  <gniibe@akebono.etl.go.jp>
+
+       * its.el (its-completing-input-menu): Removed.  Not used.
+       (its-completing-input): Ditto.
+       (its-translate-region): Remove (null action) clause.  It's identical
+       to 't' case.
+
+       (its-map-supers): Deleted.
+       (its-map-set-supers): Ditto.
+       (its-get-next-map-locally): Deleted.
+
+       (its-define-mode): Remove supers.
+       (its-make-map): Likewise.
+
+       (its-simulate-input): sref -> aref. add char-bytes -> +1.
+       (its-defrule**): Likewise.
+
+       (its-flush-input-before-point): Delete useless save-excursion.
+       (its-push-char): Likewise.
+       (its-translate-region): Likewise.
+
+       * its/zhuyin.el (its-make-terminal-state):
+       * its/kanainput.el (its-make-terminal-state):
+       * its/hangul.el (its-make-terminal-state):
+       Use its-make-terminal-state-sofar.
+
+       * its/kanainput.el (its-make-terminal-state-kanainput): Removed.
+
+       * its.el (its-make-terminal-state-sofar): Renamed.
+       (was: its-make-terminal-state-hangul)
+
+       * its/han-kata.el (its-select-hankaku-katakana): Renamed.
+       (was: its:select-hankaku-katakana).
+
+       * its.el (its-map-topmap-p, its-map-supers, its-map-set-supers,
+       its-map-terminalp, its-map-state, its-map-set-state,
+       its-map-indicator, its-map-set-indicator, its-map-action,
+       its-map-set-action, its-map-alist, its-map-set-alist,
+       its-get-action, its-action-output, its-action-next,
+       its-get-next-map, its-get-next-map-locally, its-set-next-map,
+       its-collect-simple-action, its-read-current-its-string,
+       its-make-map): Add prefix 'its-'.
+
+       * its.el (its-defrule-select-mode-temporally): Deleted.
+       (its-select-mode-temporally): Deleted.
+       (its-select-previous-mode): Deleted.
+
+       * its/hira.el ("q", "Q"): Removed.
+
+       * its.el (its-defrule**): Don't call coerce-internal-string.
+       (map-state-string): Removed.
+       (its-default-make-standard-non-terminal-state): Don't call
+       map-state-string.
+
+       * egg.el (characterp, coerce-internal-string, coerce-string): Removed.
+
+       * its.el (its-insert-char): Deleted.
+       (its-internal-mode-alist): Removed.
+       (its-set-mode-map, its-define-mode): Remove internalp.
+       (its-set-mode-indicator): Removed.
+
+       * egg-fence.el (egg-fence-self-insert-command): Add prefix 'egg-'.
+
+       * its.el (fence-self-insert-command): Move to egg-fence.el.
+
+       * egg-fence.el (egg-exit-fence-mode): Renamed (egg-fence-exit-mode).
+       (egg-enter-fence-mode-and-self-insert): Deleted.
+
+       * egg.el (egg-quit-egg-mode): Deleted.
+
+       * egg-misc.el (egg-fence-toggle-egg-mode): Add prefix 'egg-'.
+       (egg-fence-toggle-egg-mode): beep -> ding.
+       (global-map): bind C-\ to egg-enter-fence-mode.
+
+1997-03-02  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * egg-henkan.el: New file.
+
+       Use new API (egg-get-bunsetu-kanji, egg-get-bunsetu-yomi,
+       egg-is-dai-bunsetu, bunsetu-suu, egg-hindo-update,
+       egg-get-bunsetu-end).
+
+       * wnn-egg.el: Move egg-henkan-* to egg-henkan.el.
+
+       * wnn-egg.el (egg-startup-file-search-path): Remove current
+       directory.
+       (egg-open-wnn): Renamed from EGG-open-wnn.
+       (bunsetu-suu): New function.
+       (egg-get-bunsetu-kanji, egg-get-bunsetu-yomi): New function.
+       (egg-is-dai-bunsetu): New function.
+       (egg-hindo-update): New function.
+       (egg-get-bunsetu-end): New function.
+       
+       (egg-henkan-region, egg-gyaku-henkan-region,
+       egg-henkan-region-internal, egg-henkan-paragraph,
+       egg-gyaku-henkan-paragraph, egg-henkan-sentence,
+       egg-gyaku-henkan-sentence, egg-henkan-word, egg-gyaku-henkan-word,
+       egg-henkan-insert-kouho, egg-henkan-kakutei,
+       egg-henkan-kakutei-first-char, egg-henkan-kakutei-before-point,
+       egg-sai-henkan, egg-henkan-goto-bunsetu,
+       egg-henkan-forward-bunsetu, egg-henkan-backward-bunsetu,
+       egg-henkan-first-bunsetu, egg-henkan-last-bunsetu,
+       egg-henkan-hiragana, egg-henkan-katakana, egg-henkan-next-kouho,
+       egg-henkan-next-kouho-dai, egg-henkan-next-kouho-sho,
+       egg-henkan-previous-kouho, egg-henkan-previous-kouho-dai,
+       egg-henkan-previous-kouho-sho, egg-henkan-goto-kouho,
+       egg-henkan-bunsetu-chijime-dai, egg-henkan-bunsetu-chijime-sho,
+       egg-henkan-bunsetu-nobasi-dai, egg-henkan-saishou-bunsetu,
+       egg-henkan-saichou-bunsetu, egg-bunsetu-length-henko,
+       egg-henkan-quit, egg-henkan-select-kouho,
+       egg-henkan-select-kouho-dai, egg-henkan-select-kouho-sho,
+       egg-henkan-word-off, egg-henkan-kakutei-and-self-insert,
+       egg-henkan-mode-map, egg-henkan-mode-esc-prefix,
+       egg-henkan-help-command, egg-henkan-inspect-bunsetu):
+       Add prefix `egg-'.
+
+       (egg-henkan-mode-in-use): Deleted.
+       (set-egg-henkan-mode-format): Deleted.  Don't need.
+
+       (disconnect-wnn): Let it be normal function, instead of command.
+       (close-wnn): Ditto.
+
+       (set-jserver-host-name, set-kserver-host-name,
+       set-cserver-host-name): Use defalias.
+
+       (close-wnn): Take an argument of wnn-server-type.
+       (wnn-egg-kill-emacs-function, set-wnn-host-name,
+       set-cwnn-host-name, set-kwnn-host-name): Likewise.
+
+       * egg.el (egg-global-map-backup): Deleted.
+       (egg-local-map-backup): Deleted.
+       (egg-insert-after-hook): it's global variable, nod buffer-local.
+
+       * egg-fence.el (egg-henkan-fence-region, egg-enter-fence-mode,
+       egg-fence-katakana, egg-fence-hiragana, egg-fence-hankaku,
+       egg-fence-zenkaku, egg-fence-backward-char,
+       egg-fence-forward-char, egg-fence-beginning-of-line,
+       egg-fence-end-of-line, egg-fence-transpose-chars,
+       egg-fence-delete-char, egg-fence-backward-delete-char,
+       egg-fence-kill-line, egg-fence-exit-mode, egg-fence-cancel-input,
+       egg-fence-mode-help-command): Add Prefix `egg-'.
+
+       (egg-fence-mode-map): Remove binding to eval-expression (C-z).
+
+       (egg-self-insert-non-undo-count): Removed.
+       (egg-self-insert-command): Removed.
+
+       (egg-fence-backward-char, egg-fence-forward-char,
+       egg-fence-transpose-chars, egg-fence-delete-char,
+       egg-fence-backward-delete-char): beep -> ding.
+       wnn-egg.el (egg-henkan-select-kouho): Likewise.
+
+1997-02-27  NIIBE Yutaka  <gniibe@chroot.org>
+
+       * wnn-egg.el (push-end, push-end-internal): Removed.
+
+       * its.el (dolist): Removed.  It's in CL package.
+       (for-each, for-each*): Removed.
+
+       * egg-keymap.el: Removed.  I guess noone use it.
+
+       * egg-jsymbol.el (*-alist): Declare by defconst.
+
+       * egg-misc.el (toggle-egg-mode): Removed.
+
+       * All files: Change the identifier XXX:YYYY --> XXX-YYYY,
+       and *YYY* ---> YYY.
+
+       * egg-fence.el (enter-fence-mode): Use new API for marker
+       insertion `set-marker-insertion-type'.
+       * its.el (its-*buff-e*): Likewise.
+
+       * egg-jsymbol.el: lc-jp --> (charset-id 'japanese-jisx0208)
+       lc-jp2 --> (charset-id 'japanese-jisx0212).
+
+1997-02-26  NIIBE Yutaka  <gniibe@akebono.etl.go.jp>
+
+       * egg-fence.el (egg:fence-mode-map): Renamed from fence-mode-map.
+       (egg:fence-mode-esc-prefix): Renamed from egg:fence-mode-esc-map.
+       (henkan-fence-region-or-single-space): Removed.
+
+       * egg-misc.el (toggle-egg-mode): mc-flag
+               -> enable-multibyte-characters.
+
+       * its.el (read-current-its-string): New function.  Moved from
+       wnn-egg-misc.el.
+       (In meny functions): beep --> ding.
+
+       * egg-misc.el (read-hiragana-string): Removed.
+       (read-kanji-string): Removed.
+       (egg:special-symbol-input): Renamed from special-symbol-input.
+       (egg:special-symbol-input-point): Renamed from
+       special-symbol-input-point.
+       (si:*global-map*): Remeved.
+       Removed 'Changes on Global map'.
+       (its-mode-map): Renamed from mule-keymap.
+
+       * wnn-egg.el (henkan-region-internal): Use new API for undo.
+       (henkan-kakutei): Likewise.
+       (henkan-kakutei-first-char): Likewise.
+       (henkan-kakutei-before-point): Likewise.
+       (sai-henkan): Likewise.
+       * egg.el (egg:quit-egg-mode): Likewise.
+
+       * egg-fence.el (egg:*fence-open*, egg:*fence-close*,
+       egg:*fence-face*): Let them be declared by defvar.
+       (egg:*fence-open-in-cont*, egg:*fence-close-in-cont*,
+       egg:*fence-face-in-cont*): Likewise.
+
+       (set-egg-fence-mode-format): Removed.  Useless.  Don't need to be
+       interactive.
+       (set-egg-fence-mode-format-in-cont): Removed.
+       (egg:*face-alist*): Removed.
+
+       * wnn-egg-misc.el (its:select-mode, its:select-mode-from-menu,
+       its:next-mode, its:previous-mode): 
+       Removed (Merged into its.el).  
+
+       * its.el (its:select-mode, its:select-mode-from-menu,
+       its:next-mode, its:previous-mode): Call hook of
+       `its:select-mode-hook'.
+
+       * diced.el: Removed.  This depends on wnn.  Functions are moved to
+       wnn-egg-dict.el.
+
+       * wnn-egg-dict.el (remove-regexp-in-string): Removed.
+       (toroku-region): Don't call `remove-regexp-in-string'.  Removing
+       invalid sequence (TAB?) automatically is not good idea.  It should
+       notify user.  Currently, just don't remove.
+
+       * busyu.el (busyu-table): defconst instead of defvar.
+       (busyu-kaku-alist): defconst instead of defvar.
+
+       * its.el (egg:member): Removed.  Not used.
+
+       * wnn-egg-msg.el (*egg-message-alist*): Include asking string in
+       register-notify and remove-notify.  Should also change Korean and
+       Chinese.
+
+       * egg.el: Removed "Tamago Notification System".
+       It is useless, as we have *Messages* buffer in GNU Emacs 19.
+
+       * diced.el (diced-execute): Don't use `notify' but `message'.
+       (set-dict-comment): Likewise.
+       * its.el (its-defrule**): Likewise.
+       * wnn-egg-dict.el (egg:toroku-word): Likewise.
+       * wnn-egg-msg.el (egg:error): Likewise.
+       * wnn-egg.el (set-wnn-param): Likewise.
+       (EGG:open-wnn): Likewise.
+       (close-wnn): Likewise.
+       (henkan-word-off): Likewise.
+       (henkan-inspect-bunsetu): Likewise.
+
+       * diced.el (diced-execute): Don't use `notify-yes-or-no-p' but use
+       plain `yes-or-no-p' and format.
+       * wnn-egg-dict.el (egg:toroku-word): Likewise.
+
+       * egg.el (notify-yes-or-no-p-internal): IIDESUKA is not good.
+       it should get the message through egg:get-msg.  Currently, use
+       "OK?".
+       (notify-y-or-n-p-internal): Likewise.
+
+       * wnn-egg.el: Split into wnn-egg-dict.el, wnn-egg-misc.el, and
+       wnn-egg-msg.el.
+       (many functions): remove commented out line of
+               (open-wnn-if-disconnected).
+
+       * egg.el: Split into egg.el, egg-fence.el, egg-misc.el,
+       jis-input.el, and modeline.el.
+
+       * wnn-egg.el (egg-default-startup-file): change to eggrc-wnn from
+       eggrc.
+       (henkan-region-internal): Use new API for marker insertion
+       `set-marker-insertion-type'.
+
+1997-02-13  NIIBE Yutaka  <gniibe@akebono.etl.go.jp>
+
+       * menu.el (menu:select-from-menu): Rewritten.
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..9e1a711
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,144 @@
+# Makefile --- Makefile of EGG V4.0
+
+# Copyright (C) 1999, 2000 Free Software Foundation, Inc
+# Author: NIIBE Yutaka <gniibe@chroot.org>
+#        TOMURA Satoru <tomura@etl.go.jp>
+# Maintaner: Satoru Tomura <tomura@etl.go.jp>
+
+#---------------------------------------
+# (1) make
+#      ;; compile *.el files and make leim-list.el
+# (2) make install-system
+#      ;; install files into ${INSDIR} and ${LEIMDIR}
+# (3) make install-user
+#      ;; install your initialization files at your home directory
+#------------------------------------------------
+#  Configuration parameters
+#------------------------------------------------
+# Emacs initialization file at your home directory
+       DOTEMACS= ${HOME}/.emacs
+# egg initialization file at your home directory
+       STARTUP = .eggrc
+       EGGRC   = ${HOME}/${START}
+# emacs you use
+       EMACS   = /usr/local/bin/emacs
+# Egg does not depend on the emacs version (We hope...)
+       INSDIR  = /usr/local/share/emacs/site-lisp/egg
+# The directory where there is leim-list.el in it.
+       LEIMDIR = /usr/local/share/emacs/20.4/leim
+# Programs
+       INSTALL = /usr/sbin/install
+       CP      = /bin/cp
+       MV      = /bin/mv
+       RM      = /bin/rm
+       MKDIR   = /usr/bin/mkdir
+#------------------------------------------------
+
+
+DEPS = -l ./docomp.el
+BATCHFLAGS = -batch -q -no-site-file
+
+.SUFFIXES: .el .elc
+
+ETCS = Makefile docomp.el eggrc leim-list-egg.el egg-dotemacs \
+       AUTHORS ChangeLog README TODO PROBLEMS
+
+SRCS = menudiag.el its.el egg-edep.el \
+       its/ascii.el \
+       its/bixing.el \
+       its/erpin.el \
+       its/hankata.el \
+       its/hira.el \
+       its/jeonkak.el \
+       its/pinyin.el \
+       its/hangul.el \
+       its/kata.el \
+       its/thai.el \
+       its/quanjiao.el \
+       its/zenkaku.el \
+       its/zhuyin.el \
+       its-keydef.el \
+       egg-mlh.el egg-cnv.el egg-com.el \
+       egg.el \
+       egg/cannarpc.el egg/canna.el \
+       egg/sj3rpc.el egg/sj3.el \
+       egg/wnnrpc.el egg/wnn.el 
+
+ELCS = ${SRCS:.el=.elc}
+
+DIST = ${ETCS} ${SRCS}
+
+.el.elc:
+       ${EMACS} ${BATCHFLAGS} ${DEPS} -f batch-byte-compile $<
+
+all: ${ELCS} leim-list.el
+
+leim-list.el: leim-list-egg.el
+       @if (grep ";;; leim-list-egg.el" \
+                 ${LEIMDIR}/leim-list.el 2>&1) >/dev/null; then \
+         echo Egg setup already exists in ${LEIMDIR}/leim-list.el; \
+         cat ${LEIMDIR}/leim-list.el  >leim-list.el; \
+       else \
+         cat ${LEIMDIR}/leim-list.el leim-list-egg.el >leim-list.el; \
+       fi
+
+clean: 
+       ${RM} -f ${ELCS} leim-list.el
+
+install: install-system
+
+install-system: all
+       if [ ! -d ${INSDIR} ]; then mkdir -p ${INSDIR}; fi
+       tar cf - ${SRCS} ${ELCS} | (cd ${INSDIR} && tar xvf -)
+       ${CP} leim-list.el ${INSDIR}
+
+uninstall-system:
+       if [ -d ${INSDIR} ]; then \
+         ${RM} -rf ${INSDIR}; \
+       fi
+
+
+install-user: dotemacs ${EGGRC}
+
+dotemacs: egg-dotemacs
+       @if (grep "^;;; Emacs/Egg Configuration" \
+                  $(DOTEMACS) 2>&1) >/dev/null; then \
+          echo Emacs/Egg setup already exists in $(DOTEMACS); \
+       else \
+         cat egg-dotemacs >> ${DOTEMACS} ; \
+         echo "(setq egg-startup-file \"${STARTUP}\")" >>${DOTEMACS} ; \
+         echo "Added Emacs/Egg setup to $(DOTEMACS)"; \
+       fi
+
+${EGGRC}: eggrc
+       $(CP) eggrc ${EGGRC}
+
+# DEPENDENCIES
+egg/sj3rpc.elc: egg-com.elc egg/sj3.elc
+egg/wnnrpc.elc: egg-com.elc egg/wnn.elc
+
+egg.elc its/ascii.elc its/erpin.elc its/hankata.elc \
+       its/hira.elc its/jeonkak.elc its/pinyin.elc \
+       its/hangul.elc its/kata.elc its/quanjiao.elc \
+       its/zenkaku.elc its/zhuyin.elc: its-keydef.elc
+
+distclean:
+       rm -f ${ELCS} leim-list.el *~
+
+###  Source code maintainance
+DATE=$(shell date "+%y%m%d")
+
+dist: distclean
+       rm -rf ../egg-${DATE}
+       mkdir ../egg-${DATE}
+       tar -c -f - ${DIST} | tar Cxf ../egg-${DATE} -
+       (cd ../egg-${DATE}; \
+        sed "/^### Source code maintainance/,\$$d" <Makefile >Makefile.dist; \
+        mv -f Makefile.dist Makefile)
+       (cd ..; tar cvzf egg-${DATE}.tar.gz egg-${DATE})
+
+working-ss: distclean
+       rm -rf ../egg-snap-${DATE}
+       mkdir ../egg-snap-${DATE}
+       tar -c -f - . | tar Cxf ../egg-snap-${DATE} -
+       (cd ..; tar cvzf egg-snap-${DATE}.tar.gz egg-snap-${DATE})
diff --git a/PROBLEMS b/PROBLEMS
new file mode 100644 (file)
index 0000000..fc620bb
--- /dev/null
+++ b/PROBLEMS
@@ -0,0 +1,6 @@
+* describe-bindings
+
+* C-k (egg-decide-before-point)
+
+* HIRAGANA & KATAKANA candidates
+
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..9d47a40
--- /dev/null
+++ b/README
@@ -0,0 +1,13 @@
+
+             EGG Versio 4.0 --- Code name "Tamagotchy"
+
+               NIIBE Yutaka <gniibe@chroot.org>
+
+We've started this project with the code of EGG V3.0 in the beginning.
+However, we chose to rewrite whole of them, while referring the design
+and interface of EGG V3.0.
+
+In original version of EGG (to V3.0), it seems for me that there's no
+copyright notice.  But it has been widely distributed on the Internet
+under the licence of GPL:
+    <URL:ftp://etlport.etl.go.jp/pub/mule/mule-2.3.tar.gz>
diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..6e4572d
--- /dev/null
+++ b/TODO
@@ -0,0 +1,77 @@
+backend assoc-list
+toroku-region
+
+(1) Use customize.
+(2) Implement user entries which were defined in EGG V3.
+(3) Packaging
+(4) Modeless Framework
+(5) LEIM
+(7) Portability (Implementation)
+       Event/Char/Integer is different.
+(8) Quail Integration
+
+Something like egg-use-backend, its-use-package
+
+MENU:
+       Incrementally generate <selection-list>.
+       Provide programming interface of the data structure <menu>.
+
+MLH:
+       Rewrite & clean up.
+
+Emacs/Quail Interface:
+       Restrict switching language
+       Synchronize backend/frontend language
+
+ITS:
+       Kill, yank, delete with kill-ring in INPUT-BUFFER.
+       Editing within a VSYL.
+       transpose-chars
+       Use of macro/subst.
+
+       Implement following functions.
+       its-cancel-input
+       its-mode-help-command
+       its-kill-line
+       its-hiragana (input-buffer)
+       its-katakana
+       its-hankaku
+       its-zenkaku
+
+       its-read-current-its-string
+
+       overwrite-mode, fill, vi emulator
+
+       The way of customizing its-mode-map.
+
+       Help-command
+
+       muhenkan
+
+EGG/ITS:
+       Katakana input support.
+       Kanainput support.
+       Chinese/Korean support.
+       map change --> server select.
+       Consider about API
+
+CONVERT:
+       Semantics of open and close
+
+       decide-first-char
+
+       Consistency with other commands (delete, yank...)
+
+       Help command
+
+WNN:
+       Support Wnn6 when it becomes Free Software.
+
+WNNRPC:
+       Chinese/Korean support.
+
+BUG:
+       convert.el
+
+       |xxxxxxx|
+               ^---- when cursor comes on this fence-end.
diff --git a/docomp.el b/docomp.el
new file mode 100644 (file)
index 0000000..7a423c3
--- /dev/null
+++ b/docomp.el
@@ -0,0 +1,44 @@
+;;; docomp.el --- compile Egg files
+
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc
+
+;; Author: NIIBE Yutaka <gniibe@chroot.org>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+
+(setq load-path (append (list (expand-file-name "./") )
+                       load-path))
+
+(setq max-specpdl-size (* 10 max-specpdl-size)
+      max-lisp-eval-depth (* 10 max-lisp-eval-depth))
+
+(load "bytecomp" t t nil)
+(setq byte-compile-warnings '(obsolete redefine callargs); free-vars unresolved
+      byte-optimize t
+      )
+
+(require 'cl)
diff --git a/egg-cnv.el b/egg-cnv.el
new file mode 100644 (file)
index 0000000..f790937
--- /dev/null
@@ -0,0 +1,1155 @@
+;;; egg-cnv.el --- Conversion Backend in Egg Input Method Architecture
+
+;; Copyright (C) 1999,2000 PFU LIMITED
+
+;; Author: NIIBE Yutaka <gniibe@chroot.org>
+;;         KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+
+;;; Code:
+
+(require 'egg-edep)
+
+(defgroup egg-conv nil
+  "Conversion backend Interface of Tamagotchy"
+  :group 'egg)
+
+(defcustom egg-conversion-wrap-select nil
+  "*Candidate selection wraps around to first candidate, if non-NIL.
+Otherwise stop at the last candidate."
+  :group 'egg-conv :type 'boolean)
+
+(defcustom egg-conversion-auto-candidate-menu 0
+  "*Automatically enter the candidate selectionmenu mode at N times
+next/previous-candidate, if positive number N."
+  :group 'egg-conv :type 'integer)
+
+(defcustom egg-conversion-fence-invisible nil
+  "*Make fence marks invisible, if non-NIL."
+  :group 'egg-conv :type 'boolean)
+
+(defcustom egg-conversion-fence-open "|"
+  "*String of conversion fence start mark. (should not be null string)"
+  :group 'egg-conv :type '(string :valid-regexp ".+"))
+
+(defcustom egg-conversion-fence-close "|"
+  "*String of conversion fence end mark. (should not be null string)"
+  :group 'egg-conv :type '(string :valid-regexp ".+"))
+
+(defcustom egg-conversion-face nil
+  "*Face (or alist of languages and faces) of text in conversion fences."
+  :group 'egg-conv
+  :type '(choice face
+                (repeat :tag "Language-Face alist"
+                        (cons :tag "Language-Face"
+                              (choice :tag "Language"
+                                      (const Japanese)
+                                      (const Chinese-GB)
+                                      (const Chinese-CNS)
+                                      (const Korean)
+                                      (const :tag "Default" t)
+                                      (symbol :tag "Other"))
+                              face))))
+
+(defcustom egg-conversion-major-separator " "
+  "*Major clause seperator"
+  :group 'egg-conv :type 'string)
+
+(defcustom egg-conversion-minor-separator "-"
+  "*Minor clause seperator"
+  :group 'egg-conv :type 'string)
+
+(defcustom egg-startup-file ".eggrc"
+  "*Egg startup file name."
+  :group 'egg-conv :type 'string)
+
+(defcustom egg-startup-file-search-path '("~")
+  "*List of directories to search for egg-startup-file (default .eggrc)."
+  :group 'egg-conv :type '(repeat string))
+
+(egg-add-message
+ '((nil
+    (no-rcfile     "no egg-startup-file on %S")
+    (rcfile-error  "error occured in egg-startup-file")
+    (candidate     "candidates:")
+    (register-str  "Chinese character:")
+    (register-yomi "word registration ``%s''  pronunciation:")
+    (registered    "dictionary entry ``%s''(%s: %s) is registerd at %s"))
+   (Japanese
+    (no-rcfile     "%S \e$B>e$K\e(B egg-startup-file \e$B$,$"$j$^$;$s\e(B")
+    (rcfile-error  "egg-startup-file \e$B$G%(%i!<$,$"$j$^$7$?\e(B")
+    (candidate     "\e$B8uJd\e(B:")
+    (register-str  "\e$B4A;z\e(B:")
+    (register-yomi "\e$B<-=qEPO?!X\e(B%s\e$B!Y\e(B  \e$BFI$_\e(B:")
+    (registered    "\e$B<-=q9`L\!X\e(B%s\e$B!Y\e(B(%s: %s)\e$B$r\e(B %s \e$B$KEPO?$7$^$7$?\e(B"))
+   (Chinese-GB
+    (no-rcfile     "\e$ATZ\e(B %S \e$AIOC;SP\e(B egg-startup-file")
+    (rcfile-error  "\e$ATZ6AH!\e(B egg-startup-file \e$AJ1#,SP3v4m7"IzAK\e(B")
+    (candidate     "\e$A:r29\e(B:")
+    (register-str  "\e$A::WV\e(B:")
+    (register-yomi "\e$A4G5d5GB<!:\e(B%s\e$A!;\e(B \e$A6A7(\e(B:")
+    (registered    "\e$A4G5dOnD?!:\e(B%s\e$A!;\e(B(%s: %s)\e$ARQ1;5GB<5=\e(B %s \e$AVPAK\e(B"))
+   (Chinese-CNS
+    (no-rcfile     "\e$(GGc\e(B %S \e$(GD8JtH4\e(B egg-startup-file")
+    (rcfile-error  "\e$(GGc{tL=\e(B egg-startup-file \e$(GUk!"H4Exrc`uFmD'\e(B")
+    (register-str  "\e$(GiGGs\e(B:")
+    (candidate     "\e$(GT7fP\e(B:")
+    (register-yomi "\e$(Gy0L(`trg!Z\e(B%s\e$(G![\e(B  \e$(G{tNN\e(B:")
+    (registered    "\e$(Gy0L(bzFx!Z\e(B%s\e$(G![\e(B(%s: %s)\e$(GDX]7`trgL/\e(B %s \e$(GDcD'\e(B"))
+   (Korean
+    (no-rcfile     "%S \e$(C?!\e(B egg-startup-file \e$(C@L\e(B \e$(C>x@>4O4Y\e(B")
+    (rcfile-error  "egg-startup-file \e$(C?!\e(B \e$(C?!7/0!\e(B \e$(C9_;}G_@>4O4Y\e(B")
+    (candidate     "\e$(CHD:8\e(B:")
+    (register-str  "\e$(CGQ@Z\e(B:")
+    (register-yomi "\e$(C;g@|5n7O!:\e(B%s\e$(C!;\e(B  \e$(C569}\e(B:")
+    (registered    "\e$(C;g@|GW8q!:\e(B%s\e$(C!;\e(B(%s: %s)\e$(C@;\e(B %s\e$(C?!\e(B \e$(C5n7OG_@>4O4Y\e(B"))))
+
+;;
+;; <backend-alist> ::= ( ( <language> ( <stage>... )... )... )
+;; <stage> ::= ( <backend> <backend-for-reconvert>... )
+;; <backend-for-reconvert> ::= <backend>
+;; <backend> ::= symbol
+;;
+
+(defvar egg-conversion-backend-alist nil)
+(make-variable-buffer-local 'egg-conversion-backend-alist)
+(put 'egg-conversion-backend-alist 'permanent-local t)
+
+(defun egg-set-conversion-backend (backend-alist &optional force)
+  (let (pair lang backend-set)
+    (while backend-alist
+      (setq lang (caar backend-alist)
+           backend-set (cdar backend-alist)
+           backend-alist (cdr backend-alist)
+           pair (assq lang egg-conversion-backend-alist))
+      (cond
+       ((null pair)
+       (setq egg-conversion-backend-alist 
+             (cons (cons lang backend-set) egg-conversion-backend-alist)))
+       (force
+       (setcdr pair backend-set))))))
+
+(defun egg-get-conversion-backend (language n use-default)
+  (let (backend)
+    (cond ((null n) (setq n 0))
+         ((null (integerp n)) (setq n 1)))
+    (setq backend (nth (1+ n) (assq language egg-conversion-backend-alist)))
+    (if backend
+       (and backend (cons 0 (mapcar 'copy-sequence backend)))
+      (and use-default (cons 0 egg-default-conversion-backend)))))
+
+(defsubst egg-default-conversion-backend-p (backend)
+  (eq (cdr backend) egg-default-conversion-backend))
+
+(defsubst egg-get-current-backend (backend)
+  (car (nth (car backend) (cdr backend))))
+
+(defsubst egg-get-reconvert-backend (backend &optional n)
+  (cond ((null n) (setq n 0))
+       ((null (integerp n)) (setq n 1)))
+  (nth (1+ n) (nth (car backend) (cdr backend))))
+
+(defmacro egg-bunsetsu-info () ''intangible)
+
+(defsubst egg-get-bunsetsu-info (p &optional object)
+  (get-text-property p (egg-bunsetsu-info) object))
+
+(defsubst egg-get-backend (p &optional object)
+  (get-text-property p 'egg-backend object))
+
+(defsubst egg-get-language (p &optional object)
+  (get-text-property p 'egg-lang object))
+
+(defsubst egg-get-bunsetsu-last (p &optional object)
+  (get-text-property p 'egg-bunsetsu-last object))
+
+(defsubst egg-get-major-continue (p &optional object)
+  (get-text-property p 'egg-major-continue object))
+
+(defsubst egg-get-char-size (p &optional object)
+  (get-text-property p 'egg-char-size object))
+
+;; <bunsetsu-info> ::= ( <backend> . <backend-dependent-info> )
+
+(defsubst egg-bunsetsu-create (backend info)
+  (cons backend info))
+
+(defsubst egg-bunsetsu-get-backend (bunsetsu)
+  (car bunsetsu))
+(defsubst egg-bunsetsu-set-backend (bunsetsu backend)
+  (setcar bunsetsu backend))
+
+(defsubst egg-bunsetsu-get-info (bunsetsu)
+  (cdr bunsetsu))
+(defsubst egg-bunsetsu-set-info (bunsetsu info)
+  (setcdr bunsetsu info))
+
+(defvar egg-finalize-backend-list nil)
+
+(defun egg-set-finalize-backend (func-list)
+  (mapcar (lambda (func)
+           (if (and func
+                    (null (memq func egg-finalize-backend-list)))
+               (setq egg-finalize-backend-list
+                     (cons func egg-finalize-backend-list))))
+         func-list))
+
+(defmacro egg-define-backend-functions (list)
+  (cons 'progn
+       (mapcar
+        (lambda (def)
+          (let* ((func (car def))
+                 (args (nth 1 def))
+                 (backend (car args)))
+            (cond ((eq backend 'bunsetsu)
+                   (setq backend `(egg-bunsetsu-get-backend ,backend)))
+                  ((eq backend 'bunsetsu-list)
+                   (setq backend `(egg-bunsetsu-get-backend (car ,backend)))))
+            `(defun ,func ,args
+               (let ((func (get ,backend ',func)))
+                 (and func
+                      (funcall func ,@args))))))
+        list)))
+
+(egg-define-backend-functions
+ ((egg-start-conversion (backend source-string context))
+  (egg-get-bunsetsu-source (bunsetsu))
+  (egg-get-bunsetsu-converted (bunsetsu))
+  (egg-get-source-language (bunsetsu))
+  (egg-get-converted-language (bunsetsu))
+  (egg-major-bunsetsu-continue-p (bunsetsu))
+  (egg-list-candidates (bunsetsu-list prev-b next-b major))
+  (egg-decide-candidate (bunsetsu-list candidate-pos prev-b next-b))
+  (egg-change-bunsetsu-length (bunsetsu-list prev-b next-b length major))
+  (egg-bunsetsu-combinable-p (bunsetsu next-b)) 
+  (egg-end-conversion (bunsetsu-list abort))
+  (egg-word-inspection (bunsetsu))
+  (egg-word-registration (backend source converted))))
+
+(defun egg-finalize-backend ()
+  (run-hooks 'egg-finalize-backend-list))
+
+(setplist 'egg-conversion-backend-noconv
+         '(egg-start-conversion          egg-start-conversion-noconv
+           egg-get-bunsetsu-source       egg-get-bunsetsu-source-noconv
+           egg-get-bunsetsu-converted    egg-get-bunsetsu-converted-noconv
+           egg-get-source-language       egg-get-source-language-noconv
+           egg-get-converted-language    egg-get-converted-language-noconv
+           egg-end-conversion            egg-end-conversion-noconv))
+
+(defun egg-start-conversion-noconv (backend yomi-string context)
+  (let ((string (copy-sequence yomi-string))
+       (language (egg-get-language 0 yomi-string)))
+    (set-text-properties 0 (length string) nil string)
+    (list (egg-bunsetsu-create backend (vector string language)))))
+
+(defun egg-get-bunsetsu-source-noconv (bunsetsu)
+  (aref (egg-bunsetsu-get-info bunsetsu) 0))
+(defun egg-get-bunsetsu-converted-noconv (bunsetsu)
+  (aref (egg-bunsetsu-get-info bunsetsu) 0))
+(defun egg-get-source-language-noconv (bunsetsu)
+  (aref (egg-bunsetsu-get-info bunsetsu) 1))
+(defun egg-get-converted-language-noconv (bunsetsu)
+  (aref (egg-bunsetsu-get-info bunsetsu) 1))
+(defun egg-end-conversion-noconv (bunsetsu-list abort)
+  nil)
+
+(defconst egg-default-conversion-backend '((egg-conversion-backend-noconv)))
+\f
+(defun egg-convert-region (start end &optional context nth-backend)
+  (interactive "r\ni\nP")
+  (let ((source (buffer-substring start end))
+       backend backend-source-list converted converted-list
+       lang len s success abort)
+    (if (>= start end)
+       ;; nothing to do
+       nil
+      (delete-region start end)
+      (let ((inhibit-read-only t))
+       (its-define-select-keys egg-conversion-map)
+       (goto-char start)
+       (setq s (copy-sequence egg-conversion-fence-open)
+             len (length s)
+             start (+ start len)
+             end (+ end len))
+       (set-text-properties 0 len (list 'read-only t
+                                        'egg-start t
+                                        'egg-source source)
+                            s)
+       (if context
+           (put-text-property 0 len 'egg-context context s))
+       (if egg-conversion-fence-invisible
+           (put-text-property 0 len 'invisible t s))
+       (insert s)
+       (setq s (copy-sequence egg-conversion-fence-close)
+             len (length s))
+       (set-text-properties 0 len '(read-only t rear-nonsticky t egg-end t) s)
+       (if egg-conversion-fence-invisible
+           (put-text-property 0 len 'invisible t s))
+       (insert s)
+       (goto-char start)
+       (insert source)
+       (goto-char start)
+       (setq source (copy-sequence source))
+       (egg-separate-languages source)
+       (setq backend-source-list (egg-assign-backend source nth-backend))
+       (while (and (null abort) backend-source-list)
+         (setq backend (car (car backend-source-list))
+               lang (nth 1 (car backend-source-list))
+               source (nth 2 (car backend-source-list))
+               backend-source-list (cdr backend-source-list))
+         (condition-case error
+             (progn
+               (setq converted (egg-start-conversion
+                                (egg-get-current-backend backend)
+                                source context))
+               (if (null converted)
+                   (egg-error "no conversion result"))
+               (setq converted-list (nconc converted-list
+                                           (list (cons backend converted)))
+                     context 'continued)
+               (or (egg-default-conversion-backend-p backend)
+                   (setq success t)))
+           ((egg-error quit)
+            (cond
+             ((null (or success
+                        (delq t (mapcar (lambda (s)
+                                          (egg-default-conversion-backend-p
+                                           (cdr (car s))))
+                                        backend-source-list))))
+              (message "egg %s backend: %s"
+                       (if (cdr lang) lang (car lang))
+                       (nth (if (eq (car error) 'quit) 0 1) error))
+              (ding)
+              (setq abort t))
+             ((condition-case err
+                  (y-or-n-p
+                   (format "egg %s backend %s: continue? "
+                           lang (nth (if (eq (car error) 'quit) 0 1) error)))
+                ((error quit) nil))
+              (setq backend (egg-get-conversion-backend nil 0 t)
+                    converted (egg-start-conversion
+                               (egg-get-current-backend backend)
+                               source context)
+                    converted-list (nconc converted-list
+                                          (list (cons backend converted)))
+                     context 'continued))
+             (t
+              (setq abort t))))))
+       (delete-region start end)
+       (while converted-list
+         (egg-insert-bunsetsu-list (caar converted-list) (cdar converted-list)
+                                   (or (null (cdr converted-list)) 'continue))
+         (setq converted-list (cdr converted-list)))
+       (goto-char start)
+       (cond (abort
+              (egg-abort-conversion))
+             ((null success)
+              (egg-exit-conversion)))))))
+
+(defun egg-separate-languages (str &optional last-lang)
+  (let (lang last-chinese
+       (len (length str)) i j l)
+    ;; 1st pass -- mark undefined Chinese part
+    (if (or (eq last-lang 'Chinese-GB) (eq last-lang 'Chinese-CNS))
+       (setq last-chinese last-lang))
+    (setq i 0)
+    (while (< i len)
+      (setq j (egg-next-single-property-change i 'egg-lang str len))
+      (if (null (egg-get-language i str))
+         (progn
+           (setq c (egg-string-to-char-at str i)
+                 cset (char-charset c))
+           (cond
+            ((eq cset 'chinese-sisheng)
+             (egg-string-match-charset 'chinese-sisheng str i)
+             (setq l (match-end 0)
+                   j (min j l)
+                   lang 'Chinese))
+            ((setq l (egg-chinese-syllable str i))
+             (setq j (+ i l)
+                   lang 'Chinese))
+            ((eq cset 'ascii)
+             (if (eq (string-match "[\0-\177\240-\377]+" str (1+ i)) (1+ i))
+                 (setq j (match-end 0))
+               (setq j (1+ i)))
+             (if (and (< j len)
+                      (eq (char-charset (egg-string-to-char-at str j))
+                          'chinese-sisheng))
+                 (setq j (max (1+ i) (- j 6))))
+             (setq lang nil))
+            ((eq cset 'composition)
+             (setq j (+ i (egg-char-bytes c))
+                   lang (egg-charset-to-language
+                         (char-charset
+                          (car (decompose-composite-char c 'list))))))
+            (t
+             (egg-string-match-charset cset str i)
+             (setq j (match-end 0)
+                   lang (egg-charset-to-language cset))))
+           (if lang
+               (put-text-property i j 'egg-lang lang str))))
+      (setq i j))
+    ;; 2nd pass -- set language property
+    (setq i 0)
+    (while (< i len)
+      (setq lang (egg-get-language i str))
+      (cond
+       ((null lang)
+       (setq lang (or last-lang
+                      (egg-next-part-lang str i))))
+       ((equal lang 'Chinese)
+       (setq lang (or last-chinese
+                      (egg-next-chinese-lang str i)))))
+      (setq last-lang lang)
+      (if (or (eq lang 'Chinese-GB) (eq lang 'Chinese-CNS))
+         (setq last-chinese lang))
+      (setq j i
+           i (egg-next-single-property-change i 'egg-lang str len))
+      (set-text-properties j i (list 'egg-lang lang) str))))
+
+;;; Should think again the interface to language-info-alist
+(defun egg-charset-to-language (charset)
+  (let ((list language-info-alist))
+    (while (and list
+               (null (memq charset (assq 'charset (car list)))))
+      (setq list (cdr list)))
+    (if list
+       (intern (car (car list))))))
+
+(defun egg-next-part-lang (str pos)
+  (let ((lang (get-text-property
+              (egg-next-single-property-change pos 'egg-lang str (length str))
+              'egg-lang str)))
+    (if (eq lang 'Chinese)
+       (egg-next-chinese-lang str pos)
+      (or lang
+         its-current-language
+         egg-default-language))))
+
+(defun egg-next-chinese-lang (str pos)
+  (let ((len (length str)) lang)
+    (while (and (< pos len) (null lang))
+      (setq pos (egg-next-single-property-change pos 'egg-lang str len)
+           lang (egg-get-language pos str))
+      (if (null (or (eq lang 'Chinese-GB)
+                   (eq lang 'Chinese-CNS)))
+         (setq lang nil)))
+    (cond
+     (lang lang)
+     ((eq its-current-language 'Chinese-GB)  'Chinese-GB)
+     ((eq its-current-language 'Chinese-CNS) 'Chinese-CNS)
+     ((eq egg-default-language 'Chinese-GB)  'Chinese-GB)
+     ((eq egg-default-language 'Chinese-CNS) 'Chinese-CNS)
+     (t 'Chinese-GB))))
+
+;;
+;; return value ::= ( (<backend> ( <lang>... ) <source string> )... )
+;;
+(defun egg-assign-backend (source n)
+  (let ((len (length source))
+       (i 0)
+       j s lang backend retval)
+    (while (< i len)
+      (setq j (egg-next-single-property-change i 'egg-lang source len)
+           s (substring source i j)
+           lang (egg-get-language 0 s)
+           backend (egg-get-conversion-backend lang n t))
+      (set-text-properties 0 (- j i) (list 'egg-lang lang) s)
+      (setq retval (nconc retval (list (list backend (list lang) s)))
+           i j))
+    (prog1
+       retval
+      (while retval
+       (if (or (egg-default-conversion-backend-p (car (car retval)))
+               (null (equal (car (car retval)) (car (nth 1 retval)))))
+           (setq retval (cdr retval))
+         (nconc (nth 1 (car retval)) (nth 1 (nth 1 retval)))
+         (setcar (nthcdr 2 (car retval))
+                 (concat (nth 2 (car retval)) (nth 2 (nth 1 retval))))
+         (setcdr retval (cddr retval)))))))
+
+(defun egg-search-file (filename path)
+  (let (file)
+    (if (file-name-directory filename)
+       (setq file (substitute-in-file-name (expand-file-name filename))
+             file (and (file-readable-p file) file))
+      (while (and (null file) path)
+       (if (stringp (car path))
+           (setq file (substitute-in-file-name 
+                       (expand-file-name filename (car path)))
+                 file (and (file-exists-p file) file)))
+       (setq path (cdr path)))
+      file)))
+
+(defvar egg-default-startup-file "eggrc"
+  "Egg startup file name (system default)")
+
+(defun egg-load-startup-file (backend lang)
+  (let ((eggrc (or (egg-search-file egg-startup-file
+                                   egg-startup-file-search-path)
+                  (egg-search-file egg-default-startup-file load-path))))
+    (if eggrc
+       (condition-case error
+           (let ((egg-backend-type backend) (egg-language lang))
+             (load-file eggrc))
+         (error
+          (message "%s: %s" (car error)
+                   (mapconcat (lambda (s) (format "%S" s)) (cdr error) ", "))
+          (egg-error 'rcfile-error))
+         (quit
+          (egg-error 'rcfile-error)))
+      (egg-error 'no-rcfile egg-startup-file-search-path))))
+
+(defun egg-get-conversion-face (lang)
+  (if (null (consp egg-conversion-face))
+      egg-conversion-face
+    (cdr (or (assq lang egg-conversion-face)
+            (assq t egg-conversion-face)))))
+\f
+(defvar egg-conversion-map
+  (let ((map (make-sparse-keymap))
+       (i 33))
+    (while (< i 127)
+      (define-key map (vector i) 'egg-exit-conversion-unread-char)
+      (setq i (1+ i)))
+    (define-key map "\C-@"   'egg-decide-first-char)
+    (define-key map [?\C-\ ] 'egg-decide-first-char)
+    (define-key map "\C-a"   'egg-beginning-of-conversion-buffer)
+    (define-key map "\C-b"   'egg-backward-bunsetsu)
+    (define-key map "\C-c"   'egg-abort-conversion)
+    (define-key map "\C-e"   'egg-end-of-conversion-buffer)
+    (define-key map "\C-f"   'egg-forward-bunsetsu)
+    (define-key map "\C-h"   'egg-help-command)
+    (define-key map "\C-i"   'egg-shrink-bunsetsu-major)
+    (define-key map "\C-k"   'egg-decide-before-point)
+;;    (define-key map "\C-l"   'egg-exit-conversion)  ; Don't override C-L
+    (define-key map "\C-m"   'egg-exit-conversion)
+    (define-key map "\C-n"   'egg-next-candidate-major)
+    (define-key map "\C-o"   'egg-enlarge-bunsetsu-major)
+    (define-key map "\C-p"   'egg-previous-candidate-major)
+    (define-key map "\C-r"   'egg-reconvert-bunsetsu)
+    (define-key map "\C-t"   'egg-toroku-bunsetsu)
+    (define-key map "\C-v"   'egg-inspect-bunsetsu)
+    (define-key map "\M-i"   'egg-shrink-bunsetsu-minor)
+    (define-key map "\M-n"   'egg-next-candidate-minor)
+    (define-key map "\M-o"   'egg-enlarge-bunsetsu-minor)
+    (define-key map "\M-p"   'egg-previous-candidate-minor)
+    (define-key map "\M-r"   'egg-reconvert-bunsetsu-from-source)
+    (define-key map "\M-s"   'egg-select-candidate-major)
+    (define-key map "\M-v"   'egg-toggle-inspect-mode)
+    (define-key map "\M-z"   'egg-select-candidate-minor)
+    (define-key map "\e\C-s" 'egg-select-candidate-list-all-major)
+    (define-key map "\e\C-z" 'egg-select-candidate-list-all-minor)
+    (define-key map [return] 'egg-exit-conversion)
+    (define-key map [right]  'egg-forward-bunsetsu)
+    (define-key map [left]   'egg-backward-bunsetsu)
+    (define-key map " "      'egg-next-candidate)
+    (define-key map "/"      'egg-exit-conversion)
+    map)
+  "Keymap for EGG Conversion mode.")
+
+(fset 'egg-conversion-map egg-conversion-map)
+
+(defun egg-exit-conversion-unread-char ()
+  (interactive)
+  (setq unread-command-events (list last-command-event)
+       this-command 'egg-use-context)
+  (setq egg-context (egg-exit-conversion)))
+
+(defun egg-make-bunsetsu (backend bunsetsu last)
+  (let* ((converted (copy-sequence (egg-get-bunsetsu-converted bunsetsu)))
+        (language (egg-get-converted-language bunsetsu))
+        (continue (and (null last) (egg-major-bunsetsu-continue-p bunsetsu)))
+        (face (egg-get-conversion-face language))
+        len len1)
+    (setq len1 (length converted))
+    (or (eq last t)
+       (setq converted (concat converted
+                               (if continue
+                                   egg-conversion-minor-separator
+                                 egg-conversion-major-separator))))
+    (setq len (length converted))
+    (set-text-properties 0 len
+                        (list 'read-only          t
+                              (egg-bunsetsu-info) bunsetsu
+                              'egg-backend        backend
+                              'egg-lang           language
+                              'egg-bunsetsu-last  last
+                              'egg-major-continue continue
+                              'local-map          'egg-conversion-map)
+                        converted)
+    (if face
+       (egg-set-face 0 len1 face converted))
+    converted))
+
+(defun egg-insert-bunsetsu-list (backend bunsetsu-list &optional last)
+  (let ((len (length bunsetsu-list)))
+    (insert
+     (mapconcat
+      (lambda (b)
+       (setq len (1- len))
+       (egg-make-bunsetsu backend b (and (= len 0) last)))
+      bunsetsu-list ""))))
+
+(defun egg-beginning-of-conversion-buffer (n)
+  (interactive "p")
+  (cond
+   ((<= n 0)
+    (egg-end-of-conversion-buffer 1))
+   ((null (get-text-property (1- (point)) 'egg-start))
+    (goto-char (previous-single-property-change (point) 'egg-start)))))
+
+(defun egg-end-of-conversion-buffer(n)
+  (interactive "p")
+  (cond
+   ((<= n 0)
+    (egg-beginning-of-conversion-buffer 1))
+   (t
+    (goto-char (next-single-property-change (point) 'egg-end))
+    (backward-char))))
+
+(defun egg-backward-bunsetsu (n)
+  (interactive "p")
+  (while (and (> n 0)
+             (null (get-text-property (1- (point)) 'egg-start)))
+    (backward-char)
+    (setq n (1- n)))
+  (if (> n 0)
+      (signal 'beginning-of-buffer nil)))
+
+(defun egg-forward-bunsetsu (n)
+  (interactive "p")
+  (while (and (>= n 0)
+             (null (get-text-property (point) 'egg-end)))
+    (forward-char)
+    (setq n (1- n)))
+  (backward-char)
+  (if (>= n 0)
+      (signal 'end-of-buffer nil)))
+\f
+(defun egg-get-bunsetsu-tail (b)
+  (nth (1- (length b)) b))
+
+(defun egg-previous-bunsetsu-point (p &optional n obj lim)
+  (or n (setq n 1))
+  (while (> n 0)
+    (setq p (previous-single-property-change p (egg-bunsetsu-info) obj lim)
+         n (1- n)))
+  p)
+
+(defun egg-next-bunsetsu-point (p &optional n obj lim)
+  (or n (setq n 1))
+  (while (> n 0)
+    (setq p (egg-next-single-property-change p (egg-bunsetsu-info) obj lim)
+         n (1- n)))
+  p)
+
+(defun egg-get-previous-bunsetsu (p)
+  (and (null (egg-get-bunsetsu-last (1- p)))
+       (egg-get-bunsetsu-info (1- p))))
+
+(defun egg-get-previous-major-bunsetsu (p)
+  (let ((p (point))
+       (prev (egg-get-previous-bunsetsu p))
+       bunsetsu)
+    (while prev
+      (setq bunsetsu (cons prev bunsetsu)
+           p (egg-previous-bunsetsu-point p)
+           prev (and (egg-get-major-continue (1- p))
+                     (egg-get-bunsetsu-info (1- p)))))
+    bunsetsu))
+
+(defun egg-get-next-bunsetsu (p)
+  (and (null (egg-get-bunsetsu-last p))
+       (egg-get-bunsetsu-info (egg-next-bunsetsu-point p))))
+
+(defun egg-get-major-bunsetsu (p)
+  (let ((next (egg-get-bunsetsu-info p))
+       bunsetsu)
+    (while next
+      (setq bunsetsu (cons next bunsetsu)
+           p (egg-next-bunsetsu-point p)
+           next (and (egg-get-major-continue (1- p))
+                     (egg-get-bunsetsu-info p))))
+    (nreverse bunsetsu)))
+
+(defsubst egg-get-major-bunsetsu-source (list)
+  (mapconcat (lambda (b) (egg-get-bunsetsu-source b)) list ""))
+
+(defvar egg-inspect-mode nil
+  "*Display clause information on candidate selection, if non-NIL.")
+
+(defun egg-toggle-inspect-mode ()
+  (interactive)
+  (if (setq egg-inspect-mode (not egg-inspect-mode))
+      (egg-inspect-bunsetsu t)))
+
+(defun egg-inspect-bunsetsu (&optional quiet)
+  (interactive)
+  (or (egg-word-inspection (egg-get-bunsetsu-info (point)))
+      quiet
+      (beep)))
+
+(defvar egg-candidate-selection-info nil)
+(make-variable-buffer-local 'egg-candidate-selection-info)
+
+(defvar egg-candidate-selection-major t)
+(make-variable-buffer-local 'egg-candidate-selection-major)
+
+(defsubst egg-set-candsel-info (b prev-b next-b major)
+  (setq egg-candidate-selection-info (list b prev-b next-b major)))
+
+(defsubst egg-candsel-last-bunsetsu () (car egg-candidate-selection-info))
+(defsubst egg-candsel-last-prev-b () (nth 1 egg-candidate-selection-info))
+(defsubst egg-candsel-last-next-b () (nth 2 egg-candidate-selection-info))
+(defsubst egg-candsel-last-major () (nth 3 egg-candidate-selection-info))
+
+(defun egg-major-bunsetsu-head-p (head bunsetsu)
+  (while (and head (eq (car head) (car bunsetsu)))
+    (setq head (cdr head)
+         bunsetsu (cdr bunsetsu)))
+  (null head))
+
+(defun egg-major-bunsetsu-tail-p (tail bunsetsu)
+  (egg-major-bunsetsu-head-p
+   tail (nthcdr (- (length bunsetsu) (length tail)) bunsetsu)))
+
+(defun egg-get-candsel-target-major ()
+  (let ((bunsetsu (egg-get-major-bunsetsu (point)))
+       next-b prev-b next)
+    (setq prev-b (egg-get-previous-major-bunsetsu (point))
+         next (egg-next-bunsetsu-point (point) (length bunsetsu)))
+    (cond
+     ((and (egg-candsel-last-major)
+          (egg-major-bunsetsu-tail-p (egg-candsel-last-prev-b) prev-b)
+          (egg-major-bunsetsu-head-p (append (egg-candsel-last-bunsetsu)
+                                             (egg-candsel-last-next-b))
+                                     bunsetsu))
+      (setq bunsetsu (egg-candsel-last-bunsetsu)
+           prev-b (egg-candsel-last-prev-b)
+           next-b (egg-candsel-last-next-b))
+      (setq next (egg-next-bunsetsu-point (point) (length bunsetsu))))
+     ((null (egg-get-bunsetsu-last (1- next)))
+      (setq next-b (egg-get-major-bunsetsu next))))
+    (setq egg-candidate-selection-major t)
+    (list bunsetsu prev-b next-b next t)))
+
+(defun egg-get-candsel-target-minor ()
+  (let* ((bunsetsu (list (egg-get-bunsetsu-info (point))))
+        (prev-b (egg-get-previous-bunsetsu (point)))
+        (next-b (egg-get-next-bunsetsu (point))))
+    (and prev-b (setq prev-b (list prev-b)))
+    (and next-b (setq next-b (list next-b)))
+    (setq egg-candidate-selection-major nil)
+    (list bunsetsu prev-b next-b (egg-next-bunsetsu-point (point)) nil)))
+
+(defun egg-insert-new-bunsetsu (b prev-b next-b next end)
+  (let ((backend (egg-get-backend (point)))
+       start last)
+    (setq start (egg-previous-bunsetsu-point (point) (length prev-b)))
+    (setq end (or end (egg-next-bunsetsu-point next (length next-b))))
+    (setq last (egg-get-bunsetsu-last (1- end)))
+    (delete-region start end)
+    (egg-insert-bunsetsu-list backend (append prev-b (append b next-b)) last)
+    (goto-char (egg-next-bunsetsu-point start (length prev-b)))
+    (if egg-inspect-mode
+       (egg-inspect-bunsetsu t))))
+
+(defun egg-next-candidate (n)
+  (interactive "p")
+  (if egg-candidate-selection-major
+      (egg-next-candidate-major n)
+    (egg-next-candidate-minor n)))
+
+(defun egg-next-candidate-major (n)
+  (interactive "p")
+  (apply 'egg-next-candidate-internal n (egg-get-candsel-target-major)))
+
+(defun egg-next-candidate-minor (n)
+  (interactive "p")
+  (apply 'egg-next-candidate-internal n (egg-get-candsel-target-minor)))
+
+(defun egg-previous-candidate (n)
+  (interactive "p")
+  (if egg-candidate-selection-major
+      (egg-previous-candidate-major n)
+    (egg-previous-candidate-minor n)))
+
+(defun egg-previous-candidate-major (n)
+  (interactive "p")
+  (apply 'egg-next-candidate-internal (- n) (egg-get-candsel-target-major)))
+
+(defun egg-previous-candidate-minor (n)
+  (interactive "p")
+  (apply 'egg-next-candidate-internal (- n) (egg-get-candsel-target-minor)))
+
+(defvar egg-candidate-select-counter 1)
+
+(defun egg-next-candidate-internal (n b prev-b next-b next major)
+  (if (eq last-command (if major 'egg-candidate-major 'egg-candidate-minor))
+      (setq egg-candidate-select-counter (1+ egg-candidate-select-counter))
+    (setq egg-candidate-select-counter 1))
+  (if (= egg-candidate-select-counter egg-conversion-auto-candidate-menu)
+      (egg-select-candidate-internal nil b prev-b next-b next major)
+    (setq this-command (if major 'egg-candidate-major 'egg-candidate-minor))
+    (let ((inhibit-read-only t)
+         candidates nitem i beep)
+      (setq candidates (egg-list-candidates b prev-b next-b major))
+      (if (null candidates)
+         (setq beep t)
+       (setq i (+ n (car candidates))
+             nitem (length (cdr candidates)))
+       (cond
+        ((< i 0)                       ; go backward as if it is ring
+         (while (< i 0)
+           (setq i (+ i nitem))))
+        ((< i nitem))                  ; OK
+        (egg-conversion-wrap-select    ; go backward as if it is ring
+         (while (>= i nitem)
+           (setq i (- i nitem))))
+        (t                             ; don't go forward 
+         (setq i (1- nitem)
+               beep t)))
+       (setq b (egg-decide-candidate b i prev-b next-b)
+             prev-b (nth 1 b)
+             next-b (nth 2 b)
+             b (car b))
+       (egg-set-candsel-info b prev-b next-b major)
+       (egg-insert-new-bunsetsu b prev-b next-b next nil))
+      (if beep
+         (ding)))))
+
+(defun egg-numbering-item (list)
+  (let ((n -1))
+    (mapcar (lambda (item) (cons item (setq n (1+ n)))) list)))
+
+(defun egg-select-candidate-major ()
+  (interactive)
+  (apply 'egg-select-candidate-internal nil (egg-get-candsel-target-major)))
+
+(defun egg-select-candidate-minor ()
+  (interactive)
+  (apply 'egg-select-candidate-internal nil (egg-get-candsel-target-minor)))
+
+(defun egg-select-candidate-list-all-major ()
+  (interactive)
+  (apply 'egg-select-candidate-internal t (egg-get-candsel-target-major)))
+
+(defun egg-select-candidate-list-all-minor ()
+  (interactive)
+  (apply 'egg-select-candidate-internal t (egg-get-candsel-target-minor)))
+
+(defun egg-select-candidate-internal (all b prev-b next-b next major)
+  (let ((inhibit-read-only t)
+       (prompt (egg-get-message 'candidate))
+       candidates item-list new i)
+    (setq candidates (egg-list-candidates b prev-b next-b major))
+    (if (null candidates)
+       (ding)
+      (setq all (and all '(menudiag-list-all))
+           item-list (egg-numbering-item (cdr candidates))
+           i (menudiag-select (list 'menu prompt item-list)
+                              (cons (nth (car candidates) item-list) all))
+           new (egg-decide-candidate b i prev-b next-b)
+           prev-b (nth 1 new)
+           next-b (nth 2 new)
+           new (car new))
+      (egg-set-candsel-info new prev-b next-b major)
+      (egg-insert-new-bunsetsu new prev-b next-b next nil))))
+
+(defun egg-separate-characters (str)
+  (let* ((v (egg-string-to-vector str))
+        (len (length v))
+        (i 0) (j 0) m n (nchar 0))
+    (while (< i len)
+      (if (setq n (egg-chinese-syllable str j))
+         (setq m (egg-chars-in-period str j n))
+       (setq m 1 n (egg-char-bytes (aref v i))))
+      (put-text-property j (+ j n) 'egg-char-size n str)
+      (setq nchar (1+ nchar) i (+ i m) j (+ j n)))
+    nchar))
+
+(defun egg-enlarge-bunsetsu-major (n)
+  (interactive "p")
+  (egg-enlarge-bunsetsu-internal n t))
+
+(defun egg-enlarge-bunsetsu-minor (n)
+  (interactive "p")
+  (egg-enlarge-bunsetsu-internal n nil))
+
+(defun egg-shrink-bunsetsu-major (n)
+  (interactive "p")
+  (egg-enlarge-bunsetsu-internal (- n) t))
+
+(defun egg-shrink-bunsetsu-minor (n)
+  (interactive "p")
+  (egg-enlarge-bunsetsu-internal (- n) nil))
+
+(defun egg-enlarge-bunsetsu-internal (n major)
+  (let ((inhibit-read-only t)
+       b prev-b next-b s1 s1len s2 s2len nchar i last next end beep)
+    (if major
+       (setq b (egg-get-major-bunsetsu (point))
+             prev-b (egg-get-previous-major-bunsetsu (point)))
+      (setq b (list (egg-get-bunsetsu-info (point)))
+           prev-b (egg-get-previous-bunsetsu (point))
+           prev-b (and prev-b (list prev-b))))
+    (setq end (egg-next-bunsetsu-point (point) (length b))
+         last (egg-get-bunsetsu-last (1- end)))
+    (while (null last)
+      (setq next-b (cons (egg-get-bunsetsu-info end) next-b)
+           last (egg-get-bunsetsu-last end)
+           end (egg-next-bunsetsu-point end)))
+    (setq next-b (nreverse next-b)
+         s1 (egg-get-major-bunsetsu-source b)
+         s2 (concat s1 (egg-get-major-bunsetsu-source next-b))
+         s1len (egg-separate-characters s1)
+         s2len (egg-separate-characters s2)
+         n (+ n s1len))
+    (cond
+     ((<= n 0)
+      (setq beep t nchar (and (/= s1len 1) (egg-get-char-size 0 s1))))
+     ((> n s2len)
+      (setq beep t nchar (and (/= s2len 0) (length s2))))
+     (t
+      (setq nchar 0)
+      (while (> n 0)
+       (setq nchar (+ nchar (egg-get-char-size nchar s2))
+             n (1- n)))))
+    (if nchar
+       (progn
+         (setq next-b (nconc b next-b)
+               i (length (egg-get-bunsetsu-source (car next-b))))
+         (while (< i nchar)
+           (setq next-b (cdr next-b)
+                 i (+ i (length (egg-get-bunsetsu-source (car next-b))))))
+         (setq next-b (prog1 (cdr next-b) (setcdr next-b nil))
+               next (egg-next-bunsetsu-point (point) (length b))
+               b (egg-change-bunsetsu-length b prev-b next-b nchar major))
+         (if (null b)
+             (setq beep t)
+           (setq prev-b (nth 1 b)
+                 next-b (nth 2 b)
+                 b (car b))
+           (egg-insert-new-bunsetsu b prev-b next-b next (and next-b end)))))
+    (if beep
+       (ding))))
+
+(defun egg-reconvert-bunsetsu (n)
+  (interactive "P")
+  (egg-reconvert-bunsetsu-internal n 'egg-get-bunsetsu-converted))
+
+(defun egg-reconvert-bunsetsu-from-source (n)
+  (interactive "P")
+  (egg-reconvert-bunsetsu-internal n 'egg-get-bunsetsu-source))
+
+(defun egg-reconvert-bunsetsu-internal (n func)
+  (let* ((inhibit-read-only t)
+        (backend (egg-get-backend (point)))
+        (source (funcall func (egg-get-bunsetsu-info (point))))
+        (reconv-backend (egg-get-reconvert-backend backend n))
+        (p (point))
+        (last (egg-get-bunsetsu-last (point)))
+        new prev-b next-b)
+    (if (or (null reconv-backend)
+           (null (setq new (egg-start-conversion reconv-backend source nil))))
+       (ding)
+      (delete-region p (egg-next-bunsetsu-point p))
+      (setq next-b (egg-get-bunsetsu-info (point)))
+      (if (and (equal (egg-get-backend p) backend)
+              (eq (egg-bunsetsu-get-backend next-b)
+                  (egg-bunsetsu-get-backend (car new)))
+              (egg-bunsetsu-combinable-p (egg-get-bunsetsu-tail new) next-b))
+         (setq last nil)
+       (setq last (or (eq last t) 'continue)))
+      (egg-insert-bunsetsu-list backend new last)
+      (goto-char p)
+      (setq prev-b (egg-get-bunsetsu-info (1- p)))
+      (if prev-b
+         (progn
+           (if (and (equal (egg-get-backend (1- p)) backend)
+                    (eq (egg-bunsetsu-get-backend prev-b)
+                        (egg-bunsetsu-get-backend (car new)))
+                    (egg-bunsetsu-combinable-p prev-b (car new)))
+               (setq last nil)
+             (setq last (or (eq last t) 'continue)))
+           (setq backend (egg-get-backend (1- p)))
+           (delete-region (egg-previous-bunsetsu-point p) p)
+           (egg-insert-bunsetsu-list backend (list prev-b) last))))))
+
+(defun egg-decide-before-point ()
+  (interactive)
+  (let* ((inhibit-read-only t)
+        (start (if (get-text-property (1- (point)) 'egg-start)
+                   (point)
+                 (previous-single-property-change (point) 'egg-start)))
+        (end (if (get-text-property (point) 'egg-end)
+                 (point)
+               (next-single-property-change (point) 'egg-end)))
+        (decided (buffer-substring start (point)))
+        (undecided (buffer-substring (point) end))
+        i len bunsetsu source context)
+    (delete-region
+     (previous-single-property-change start 'egg-start nil (point-min))
+     (next-single-property-change end 'egg-end nil (point-max)))
+    (setq i 0
+         len (length decided))
+    (while (< i len)
+      (setq bunsetsu (nconc bunsetsu (list (egg-get-bunsetsu-info i decided)))
+           i (egg-next-bunsetsu-point i 1 decided len))
+      (if (or (= i len)
+             (egg-get-bunsetsu-last (1- i) decided))
+         (progn
+           (apply 'insert (mapcar
+                           (lambda (b) (egg-get-bunsetsu-converted b))
+                           bunsetsu))
+           (setq context (cons (cons (egg-bunsetsu-get-backend (car bunsetsu))
+                                     (egg-end-conversion bunsetsu nil))
+                               context)
+                 bunsetsu nil))))
+    (setq len (length undecided))
+    (if (= len 0)
+       (progn
+         (egg-do-auto-fill)
+         (run-hooks 'input-method-after-insert-chunk-hook)
+         context)
+      (setq i 0)
+      (while (< i len)
+       (setq bunsetsu (egg-get-bunsetsu-info i undecided)
+             source (cons (egg-get-bunsetsu-source bunsetsu)
+                          source))
+       (put-text-property 0 (length (car source))
+                          'egg-lang
+                          (egg-get-source-language bunsetsu)
+                          (car source))
+       (setq i (egg-next-bunsetsu-point i 1 undecided len)))
+      (its-restart (apply 'concat (nreverse source)) t t context))))
+
+(defun egg-decide-first-char ()
+  (interactive)
+  (let* ((inhibit-read-only t)
+        (start (if (get-text-property (1- (point)) 'egg-start)
+                   (point)
+                 (previous-single-property-change (point) 'egg-start)))
+        (end (if (get-text-property (point) 'egg-end)
+                 (point)
+               (next-single-property-change (point) 'egg-end)))
+        (bunsetsu (egg-get-bunsetsu-info start)))
+    (delete-region
+     (previous-single-property-change start 'egg-start nil (point-min))
+     (next-single-property-change end 'egg-end nil (point-max)))
+    (egg-end-conversion (list bunsetsu) nil)
+    (insert (egg-string-to-char-at (egg-get-bunsetsu-converted bunsetsu) 0))))
+
+(defun egg-exit-conversion ()
+  (interactive)
+  (if (egg-get-bunsetsu-info (point))
+      (progn
+       (goto-char (next-single-property-change (point) 'egg-end))
+       (egg-decide-before-point))))
+
+(defun egg-abort-conversion ()
+  (interactive)
+  (let ((inhibit-read-only t)
+       source context)
+    (goto-char (previous-single-property-change
+               (if (get-text-property (1- (point)) 'egg-start)
+                   (point)
+                 (previous-single-property-change (point) 'egg-start))
+               'egg-start nil (point-min)))
+    (setq source (get-text-property (point) 'egg-source)
+         context (get-text-property (point) 'egg-context))
+    (delete-region (point) (next-single-property-change
+                           (next-single-property-change (point) 'egg-end)
+                           'egg-end nil (point-max)))
+    (its-restart source nil nil context)))
+
+(defun egg-toroku-bunsetsu ()
+  (interactive)
+  (let* ((p (point))
+        (lang (egg-get-source-language (egg-get-bunsetsu-info p)))
+        (egg-mode-hook (or (cdr (assq lang its-select-func-alist))
+                           (cdr (assq lang its-select-func-default-alist))))
+        (s "")
+        bunsetsu str yomi last)
+    (while (null last)
+      (setq bunsetsu (egg-get-bunsetsu-info p)
+           str (concat str (egg-get-bunsetsu-converted bunsetsu))
+           yomi (concat yomi (egg-get-bunsetsu-source bunsetsu))
+           last (egg-get-bunsetsu-last p)
+           p (egg-next-bunsetsu-point p)))
+    (while (equal s "")
+      (setq s (read-multilingual-string (egg-get-message 'register-str)
+                                       str egg-last-method-name))
+      (and (equal s "") (ding)))
+    (egg-toroku-string s nil yomi lang (egg-bunsetsu-get-backend bunsetsu))))
+
+(defun egg-toroku-region (start end &optional nth-backend)
+  (interactive "r\nP")
+  (egg-toroku-string (buffer-substring start end) nil nil nil nil nth-backend))
+
+(defun egg-toroku-string (str &optional yomi guess lang backend nth-backend)
+  (let (egg-mode-hook result)
+    (if (= (length str) 0)
+       (egg-error "Egg word registration: null string"))
+    (egg-separate-languages str lang)
+    (setq lang (egg-get-language 0 str)
+         egg-mode-hook (or (cdr (assq lang its-select-func-alist))
+                           (cdr (assq lang its-select-func-default-alist))))
+    (or yomi (setq yomi ""))
+    (while (equal yomi "")
+      (setq yomi (read-multilingual-string
+                 (format (egg-get-message 'register-yomi) str)
+                 guess egg-last-method-name))
+      (and (equal yomi "") (ding)))
+    (egg-separate-languages yomi lang)
+    (if (null backend)
+       (progn
+         (setq backend (egg-assign-backend str nth-backend))
+         (if (cdr backend)
+             (egg-error "Egg word registration: cannot decide backend"))
+         (setq backend (egg-get-current-backend (caar backend)))))
+    (setq result (egg-word-registration backend str yomi))
+    (if result
+       (apply 'message (egg-get-message 'registered) str yomi result)
+      (beep))))
+\f
+(defun egg-conversion-mode ()
+  "\\{egg-conversion-map}"
+  ;; dummy function to get docstring
+  )
+
+(defun egg-help-command ()
+  "Display documentation for EGG Conversion mode."
+  (interactive)
+  (with-output-to-temp-buffer "*Help*"
+    (princ "EGG Conversion mode:\n")
+    (princ (documentation 'egg-conversion-mode))
+    (help-setup-xref (cons #'help-xref-mode (current-buffer)) (interactive-p))))
+
+(provide 'egg-cnv)
+;;; egg-cnv.el ends here.
diff --git a/egg-com.el b/egg-com.el
new file mode 100644 (file)
index 0000000..d36e5f6
--- /dev/null
@@ -0,0 +1,900 @@
+;;; egg-com.el --- Communication Routines in Egg Input Method Architecture
+
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc
+
+;; Author: Hisashi Miyashita <himi@bird.scphys.kyoto-u.ac.jp>
+;;         NIIBE Yutaka <gniibe@chroot.org>
+;;        KATAYAMA Yoshio <kate@pfu.co.jp>  ; Korean, Chinese support.
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+
+(require 'egg-edep)
+
+(defvar egg-fixed-euc '(fixed-euc-jp))
+(make-variable-buffer-local 'egg-fixed-euc)
+(put 'egg-fixed-euc 'permanent-local t)
+
+(defvar egg-mb-euc 'euc-japan)
+(make-variable-buffer-local 'egg-mb-euc)
+(put 'egg-mb-euc 'permanent-local t)
+
+;; Japanese
+
+(eval-and-compile
+(define-ccl-program ccl-decode-fixed-euc-jp
+  `(2
+    ((r2 = ,(charset-id 'japanese-jisx0208))
+     (r3 = ,(charset-id 'japanese-jisx0212))
+     (r4 = ,(charset-id 'katakana-jisx0201))
+     (read r0)
+     (loop
+      (read r1)
+      (if (r0 < ?\x80)
+         ((r0 = r1)
+          (if (r1 < ?\x80)
+              (write-read-repeat r0))
+          (write r4)
+          (write-read-repeat r0))
+       ((if (r1 > ?\x80)
+            ((write r2 r0)
+             (r0 = r1)
+             (write-read-repeat r0))
+          ((write r3 r0)
+           (r0 = (r1 | ?\x80))
+           (write-read-repeat r0)))))))))
+
+(define-ccl-program ccl-encode-fixed-euc-jp
+  `(2
+    ((read r0)
+     (loop
+      (if (r0 == ,(charset-id 'latin-jisx0201))                   ; Unify
+         ((read r0)
+          (r0 &= ?\x7f)))
+      (if (r0 < ?\x80)                                            ;G0
+         ((write 0)
+          (write-read-repeat r0)))
+      (r6 = (r0 == ,(charset-id 'japanese-jisx0208)))
+      (r6 |= (r0 == ,(charset-id 'japanese-jisx0208-1978)))
+      (if r6                                                      ;G1
+         ((read r0)
+          (write r0)
+          (read r0)
+          (write-read-repeat r0)))
+      (if (r0 == ,(charset-id 'katakana-jisx0201))                ;G2
+         ((read r0)
+          (write 0)
+          (write-read-repeat r0)))
+      (if (r0 == ,(charset-id 'japanese-jisx0212))                ;G3
+         ((read r0)
+          (write r0)
+          (read r0)
+          (r0 &= ?\x7f)
+          (write-read-repeat r0)))
+      (read r0)
+      (repeat)))))
+)
+
+(make-coding-system 'fixed-euc-jp 4 ?W "Coding System for fixed EUC Japanese"
+                   (cons ccl-decode-fixed-euc-jp ccl-encode-fixed-euc-jp))
+
+;; Korean
+
+(eval-and-compile
+(define-ccl-program ccl-decode-fixed-euc-kr
+  `(2
+    ((r2 = ,(charset-id 'korean-ksc5601))
+     (read r0)
+     (loop
+      (read r1)
+      (if (r0 < ?\x80)
+         (r0 = r1 & ?\x7f)
+       ((write r2 r0)
+        (r0 = r1 | ?\x80)))
+      (write-read-repeat r0)))))
+
+(define-ccl-program ccl-encode-fixed-euc-kr
+  `(2
+    ((read r0)
+     (loop
+      (if (r0 < ?\x80)
+         ((write 0)
+          (write-read-repeat r0)))
+      (if (r0 == ,(charset-id 'korean-ksc5601))
+         ((read r0)
+          (write r0)
+          (read r0)
+          (write-read-repeat r0)))
+      (read r0)
+      (repeat)))))
+)
+
+(make-coding-system 'fixed-euc-kr 4 ?W "Coding System for fixed EUC Korean"
+                   (cons ccl-decode-fixed-euc-kr ccl-encode-fixed-euc-kr))
+
+;; Chinese
+(defconst egg-pinyin-shengmu
+  '((""  . 0)  ("B" . 1)  ("C"  . 2)  ("Ch" . 3)  ("D" . 4)
+    ("F" . 5)  ("G" . 6)  ("H"  . 7)  ("J"  . 8)  ("K" . 9)
+    ("L" . 10) ("M" . 11) ("N"  . 12) ("P"  . 13) ("Q" . 14)
+    ("R" . 15) ("S" . 16) ("Sh" . 17) ("T"  . 18) ("W" . 19)
+    ("X" . 20) ("Y" . 21) ("Z"  . 22) ("Zh" . 23)))
+
+(defconst egg-pinyin-yunmu
+  '(("\e(0@\e(B"      0 0) ("\e(0@\e(B"      0 1) ("\e(0@\e(B"      0 3) ("\e(0@\e(B"      0 5) ("\e(0@\e(B"      0 7)
+    ("a\e(0@\e(B"     1 0) ("\e(0!@\e(B"     1 1) ("\e(0"@\e(B"     1 3) ("\e(0#@\e(B"     1 5) ("\e(0$@\e(B"     1 7)
+    ("ai\e(0@\e(B"    2 0) ("\e(0!\e(Bi\e(0@\e(B"    2 1) ("\e(0"\e(Bi\e(0@\e(B"    2 3) ("\e(0#\e(Bi\e(0@\e(B"    2 5) ("\e(0$\e(Bi\e(0@\e(B"    2 7)
+    ("an\e(0@\e(B"    3 0) ("\e(0!\e(Bn\e(0@\e(B"    3 1) ("\e(0"\e(Bn\e(0@\e(B"    3 3) ("\e(0#\e(Bn\e(0@\e(B"    3 5) ("\e(0$\e(Bn\e(0@\e(B"    3 7)
+    ("ang\e(0@\e(B"   4 0) ("\e(0!\e(Bng\e(0@\e(B"   4 1) ("\e(0"\e(Bng\e(0@\e(B"   4 3) ("\e(0#\e(Bng\e(0@\e(B"   4 5) ("\e(0$\e(Bng\e(0@\e(B"   4 7)
+    ("ao\e(0@\e(B"    5 0) ("\e(0!\e(Bo\e(0@\e(B"    5 1) ("\e(0"\e(Bo\e(0@\e(B"    5 3) ("\e(0#\e(Bo\e(0@\e(B"    5 5) ("\e(0$\e(Bo\e(0@\e(B"    5 7)
+    ("e\e(0@\e(B"     6 0) ("\e(0%@\e(B"     6 1) ("\e(0&@\e(B"     6 3) ("\e(0'@\e(B"     6 5) ("\e(0(@\e(B"     6 7)
+    ("ei\e(0@\e(B"    7 0) ("\e(0%\e(Bi\e(0@\e(B"    7 1) ("\e(0&\e(Bi\e(0@\e(B"    7 3) ("\e(0'\e(Bi\e(0@\e(B"    7 5) ("\e(0(\e(Bi\e(0@\e(B"    7 7)
+    ("en\e(0@\e(B"    8 0) ("\e(0%\e(Bn\e(0@\e(B"    8 1) ("\e(0&\e(Bn\e(0@\e(B"    8 3) ("\e(0'\e(Bn\e(0@\e(B"    8 5) ("\e(0(\e(Bn\e(0@\e(B"    8 7)
+    ("eng\e(0@\e(B"   9 0) ("\e(0%\e(Bng\e(0@\e(B"   9 1) ("\e(0&\e(Bng\e(0@\e(B"   9 3) ("\e(0'\e(Bng\e(0@\e(B"   9 5) ("\e(0(\e(Bng\e(0@\e(B"   9 7)
+    ("er\e(0@\e(B"   10 0) ("\e(0%\e(Br\e(0@\e(B"   10 1) ("\e(0&\e(Br\e(0@\e(B"   10 3) ("\e(0'\e(Br\e(0@\e(B"   10 5) ("\e(0(\e(Br\e(0@\e(B"   10 7)
+    ("i\e(0@\e(B"    11 0) ("\e(0)@\e(B"    11 1) ("\e(0*@\e(B"    11 3) ("\e(0+@\e(B"    11 5) ("\e(0,@\e(B"    11 7)
+    ("ia\e(0@\e(B"   12 0) ("i\e(0!@\e(B"   12 1) ("i\e(0"@\e(B"   12 3) ("i\e(0#@\e(B"   12 5) ("i\e(0$@\e(B"   12 7)
+    ("ian\e(0@\e(B"  13 0) ("i\e(0!\e(Bn\e(0@\e(B"  13 1) ("i\e(0"\e(Bn\e(0@\e(B"  13 3) ("i\e(0#\e(Bn\e(0@\e(B"  13 5) ("i\e(0$\e(Bn\e(0@\e(B"  13 7)
+    ("iang\e(0@\e(B" 14 0) ("i\e(0!\e(Bng\e(0@\e(B" 14 1) ("i\e(0"\e(Bng\e(0@\e(B" 14 3) ("i\e(0#\e(Bng\e(0@\e(B" 14 5) ("i\e(0$\e(Bng\e(0@\e(B" 14 7)
+    ("iao\e(0@\e(B"  15 0) ("i\e(0!\e(Bo\e(0@\e(B"  15 1) ("i\e(0"\e(Bo\e(0@\e(B"  15 3) ("i\e(0#\e(Bo\e(0@\e(B"  15 5) ("i\e(0$\e(Bo\e(0@\e(B"  15 7)
+    ("ie\e(0@\e(B"   16 0) ("i\e(0%@\e(B"   16 1) ("i\e(0&@\e(B"   16 3) ("i\e(0'@\e(B"   16 5) ("i\e(0(@\e(B"   16 7)
+    ("in\e(0@\e(B"   17 0) ("\e(0)\e(Bn\e(0@\e(B"   17 1) ("\e(0*\e(Bn\e(0@\e(B"   17 3) ("\e(0+\e(Bn\e(0@\e(B"   17 5) ("\e(0,\e(Bn\e(0@\e(B"   17 7)
+    ("ing\e(0@\e(B"  18 0) ("\e(0)\e(Bng\e(0@\e(B"  18 1) ("\e(0*\e(Bng\e(0@\e(B"  18 3) ("\e(0+\e(Bng\e(0@\e(B"  18 5) ("\e(0,\e(Bng\e(0@\e(B"  18 7)
+    ("iong\e(0@\e(B" 19 0) ("i\e(0-\e(Bng\e(0@\e(B" 19 1) ("i\e(0.\e(Bng\e(0@\e(B" 19 3) ("i\e(0/\e(Bng\e(0@\e(B" 19 5) ("i\e(00\e(Bng\e(0@\e(B" 19 7)
+    ("iu\e(0@\e(B"   20 0) ("i\e(01@\e(B"   20 1) ("i\e(02@\e(B"   20 3) ("i\e(03@\e(B"   20 5) ("i\e(04@\e(B"   20 7)
+    ("m\e(0@\e(B"    21 0) ("m\e(0@\e(B"    21 1) ("m\e(0@\e(B"    21 3) ("m\e(0@\e(B"    21 5) ("m\e(0@\e(B"    21 7)
+    ("n\e(0@\e(B"    22 0) ("n\e(0@\e(B"    22 1) ("\e(0=@\e(B"    22 3) ("\e(0>@\e(B"    22 5) ("\e(0?@\e(B"    22 7)
+    ("ng\e(0@\e(B"   23 0) ("ng\e(0@\e(B"   23 1) ("ng\e(0@\e(B"   23 3) ("ng\e(0@\e(B"   23 5) ("ng\e(0@\e(B"   23 7)
+    ("o\e(0@\e(B"    24 0) ("\e(0-@\e(B"    24 1) ("\e(0.@\e(B"    24 3) ("\e(0/@\e(B"    24 5) ("\e(00@\e(B"    24 7)
+    ("ong\e(0@\e(B"  25 0) ("\e(0-\e(Bng\e(0@\e(B"  25 1) ("\e(0.\e(Bng\e(0@\e(B"  25 3) ("\e(0/\e(Bng\e(0@\e(B"  25 5) ("\e(00\e(Bng\e(0@\e(B"  25 7)
+    ("ou\e(0@\e(B"   26 0) ("\e(0-\e(Bu\e(0@\e(B"   26 1) ("\e(0.\e(Bu\e(0@\e(B"   26 3) ("\e(0/\e(Bu\e(0@\e(B"   26 5) ("\e(00\e(Bu\e(0@\e(B"   26 7)
+    ("u\e(0@\e(B"    27 0) ("\e(01@\e(B"    27 1) ("\e(02@\e(B"    27 3) ("\e(03@\e(B"    27 5) ("\e(04@\e(B"    27 7)
+    ("ua\e(0@\e(B"   28 0) ("u\e(0!@\e(B"   28 1) ("u\e(0"@\e(B"   28 3) ("u\e(0#@\e(B"   28 5) ("u\e(0$@\e(B"   28 7)
+    ("uai\e(0@\e(B"  29 0) ("u\e(0!\e(Bi\e(0@\e(B"  29 1) ("u\e(0"\e(Bi\e(0@\e(B"  29 3) ("u\e(0#\e(Bi\e(0@\e(B"  29 5) ("u\e(0$\e(Bi\e(0@\e(B"  29 7)
+    ("uan\e(0@\e(B"  30 0) ("u\e(0!\e(Bn\e(0@\e(B"  30 1) ("u\e(0"\e(Bn\e(0@\e(B"  30 3) ("u\e(0#\e(Bn\e(0@\e(B"  30 5) ("u\e(0$\e(Bn\e(0@\e(B"  30 7)
+    ("uang\e(0@\e(B" 31 0) ("u\e(0!\e(Bng\e(0@\e(B" 31 1) ("u\e(0"\e(Bng\e(0@\e(B" 31 3) ("u\e(0#\e(Bng\e(0@\e(B" 31 5) ("u\e(0$\e(Bng\e(0@\e(B" 31 7)
+    ("ue\e(0@\e(B"   32 0) ("u\e(0%@\e(B"   32 1) ("u\e(0&@\e(B"   32 3) ("u\e(0'@\e(B"   32 5) ("u\e(0(@\e(B"   32 7)
+    ("ui\e(0@\e(B"   33 0) ("u\e(0)@\e(B"   33 1) ("u\e(0*@\e(B"   33 3) ("u\e(0+@\e(B"   33 5) ("u\e(0,@\e(B"   33 7)
+    ("un\e(0@\e(B"   34 0) ("\e(01\e(Bn\e(0@\e(B"   34 1) ("\e(02\e(Bn\e(0@\e(B"   34 3) ("\e(03\e(Bn\e(0@\e(B"   34 5) ("\e(04\e(Bn\e(0@\e(B"   34 7)
+    ("uo\e(0@\e(B"   35 0) ("u\e(0-@\e(B"   35 1) ("u\e(0.@\e(B"   35 3) ("u\e(0/@\e(B"   35 5) ("u\e(00@\e(B"   35 7)
+    ("\e(09@\e(B"    36 0) ("\e(05@\e(B"    36 1) ("\e(06@\e(B"    36 3) ("\e(07@\e(B"    36 5) ("\e(08@\e(B"    36 7)
+    ("\e(09\e(Be\e(0@\e(B"   37 0) ("\e(09%@\e(B"   37 1) ("\e(09&@\e(B"   37 3) ("\e(09'@\e(B"   37 5) ("\e(09(@\e(B"   37 7)
+    ("0\e(0@\e(B"    38 0) ("1\e(0@\e(B"    38 1) ("2\e(0@\e(B"    38 3) ("3\e(0@\e(B"    38 5) ("4\e(0@\e(B"    38 7)))
+
+(defconst egg-pinyin-table
+  [
+   0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+   0 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+   0 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 1 1 0 0 1
+   0 1 1 1 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1 0 0 1
+   0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 0 1 0 0 0 0 1 1 1 0 0 1 0 0 1 1 1 0 0 1
+   0 1 0 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1
+   0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1 0 0 1
+   0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 1 1 0 1 1 1 0 0 1
+   0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 1
+   0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1 0 0 1
+   0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 0 0 0 1 1 1 1 0 0 1 0 0 0 1 1 1 1 1
+   0 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 1 1 1 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1
+   0 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 0 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 1 1 1 1
+   0 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1
+   0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 1
+   0 0 0 1 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 1 1 1 0 0 1
+   0 1 1 1 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 1 1 0 0 1
+   0 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 1 0 0 1
+   0 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 1 1 0 0 1
+   0 1 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+   0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 1
+   0 1 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 1 0 0 1 0 1 0 1 0 0 0 1
+   0 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 1 1 0 0 1
+   0 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1 0 0 1
+   ])
+
+(defconst egg-zhuyin-shengmu
+  '((""  .  0) ("\e(0E\e(B" .  1) ("\e(0X\e(B" .  2) ("\e(0T\e(B" .  3) ("\e(0I\e(B" .  4)
+    ("\e(0H\e(B" .  5) ("\e(0M\e(B" .  6) ("\e(0O\e(B" .  7) ("\e(0P\e(B" .  8) ("\e(0N\e(B" .  9)
+    ("\e(0L\e(B" . 10) ("\e(0G\e(B" . 11) ("\e(0K\e(B" . 12) ("\e(0F\e(B" . 13) ("\e(0Q\e(B" . 14)
+    ("\e(0V\e(B" . 15) ("\e(0Y\e(B" . 16) ("\e(0U\e(B" . 17) ("\e(0J\e(B" . 18) ("\e(0h\e(B" . 19)
+    ("\e(0R\e(B" . 20) ("\e(0g\e(B" . 21) ("\e(0W\e(B" . 22) ("\e(0S\e(B" . 23)))
+
+(defconst egg-zhuyin-yunmu
+  '(("\e(0@\e(B"    0 0) ("\e(0A\e(B"    0 1) ("\e(0B\e(B"    0 3) ("\e(0C\e(B"    0 5) ("\e(0D\e(B"    0 7) ; i
+    ("\e(0Z@\e(B"   1 0) ("\e(0ZA\e(B"   1 1) ("\e(0ZB\e(B"   1 3) ("\e(0ZC\e(B"   1 5) ("\e(0ZD\e(B"   1 7) ; a
+    ("\e(0^@\e(B"   2 0) ("\e(0^A\e(B"   2 1) ("\e(0^B\e(B"   2 3) ("\e(0^C\e(B"   2 5) ("\e(0^D\e(B"   2 7) ; ai
+    ("\e(0b@\e(B"   3 0) ("\e(0bA\e(B"   3 1) ("\e(0bB\e(B"   3 3) ("\e(0bC\e(B"   3 5) ("\e(0bD\e(B"   3 7) ; an
+    ("\e(0d@\e(B"   4 0) ("\e(0dA\e(B"   4 1) ("\e(0dB\e(B"   4 3) ("\e(0dC\e(B"   4 5) ("\e(0dD\e(B"   4 7) ; ang
+    ("\e(0`@\e(B"   5 0) ("\e(0`A\e(B"   5 1) ("\e(0`B\e(B"   5 3) ("\e(0`C\e(B"   5 5) ("\e(0`D\e(B"   5 7) ; ao
+    ("\e(0\@\e(B"   6 0) ("\e(0\A\e(B"   6 1) ("\e(0\B\e(B"   6 3) ("\e(0\C\e(B"   6 5) ("\e(0\D\e(B"   6 7) ; e
+    ("\e(0_@\e(B"   7 0) ("\e(0_A\e(B"   7 1) ("\e(0_B\e(B"   7 3) ("\e(0_C\e(B"   7 5) ("\e(0_D\e(B"   7 7) ; ei
+    ("\e(0c@\e(B"   8 0) ("\e(0cA\e(B"   8 1) ("\e(0cB\e(B"   8 3) ("\e(0cC\e(B"   8 5) ("\e(0cD\e(B"   8 7) ; en
+    ("\e(0e@\e(B"   9 0) ("\e(0eA\e(B"   9 1) ("\e(0eB\e(B"   9 3) ("\e(0eC\e(B"   9 5) ("\e(0eD\e(B"   9 7) ; eng
+    ("\e(0f@\e(B"  10 0) ("\e(0fA\e(B"  10 1) ("\e(0fB\e(B"  10 3) ("\e(0fC\e(B"  10 5) ("\e(0fD\e(B"  10 7) ; er
+    ("\e(0g@\e(B"  11 0) ("\e(0gA\e(B"  11 1) ("\e(0gB\e(B"  11 3) ("\e(0gC\e(B"  11 5) ("\e(0gD\e(B"  11 7) ; i
+    ("\e(0gZ@\e(B" 12 0) ("\e(0gZA\e(B" 12 1) ("\e(0gZB\e(B" 12 3) ("\e(0gZC\e(B" 12 5) ("\e(0gZD\e(B" 12 7) ; ia
+    ("\e(0gb@\e(B" 13 0) ("\e(0gbA\e(B" 13 1) ("\e(0gbB\e(B" 13 3) ("\e(0gbC\e(B" 13 5) ("\e(0gbD\e(B" 13 7) ; ian
+    ("\e(0gd@\e(B" 14 0) ("\e(0gdA\e(B" 14 1) ("\e(0gdB\e(B" 14 3) ("\e(0gdC\e(B" 14 5) ("\e(0gdD\e(B" 14 7) ; iang
+    ("\e(0g`@\e(B" 15 0) ("\e(0g`A\e(B" 15 1) ("\e(0g`B\e(B" 15 3) ("\e(0g`C\e(B" 15 5) ("\e(0g`D\e(B" 15 7) ; iao
+    ("\e(0g]@\e(B" 16 0) ("\e(0g]A\e(B" 16 1) ("\e(0g]B\e(B" 16 3) ("\e(0g]C\e(B" 16 5) ("\e(0g]D\e(B" 16 7) ; ie
+    ("\e(0gc@\e(B" 17 0) ("\e(0gcA\e(B" 17 1) ("\e(0gcB\e(B" 17 3) ("\e(0gcC\e(B" 17 5) ("\e(0gcD\e(B" 17 7) ; in
+    ("\e(0ge@\e(B" 18 0) ("\e(0geA\e(B" 18 1) ("\e(0geB\e(B" 18 3) ("\e(0geC\e(B" 18 5) ("\e(0geD\e(B" 18 7) ; ing
+    ("\e(0ie@\e(B" 19 0) ("\e(0ieA\e(B" 19 1) ("\e(0ieB\e(B" 19 3) ("\e(0ieC\e(B" 19 5) ("\e(0ieD\e(B" 19 7) ; iong
+    ("\e(0ga@\e(B" 20 0) ("\e(0gaA\e(B" 20 1) ("\e(0gaB\e(B" 20 3) ("\e(0gaC\e(B" 20 5) ("\e(0gaD\e(B" 20 7) ; iu
+    ("\e(0G@\e(B"  21 0) ("\e(0GA\e(B"  21 1) ("\e(0GB\e(B"  21 3) ("\e(0GC\e(B"  21 5) ("\e(0GD\e(B"  21 7) ; m
+    ("\e(0K@\e(B"  22 0) ("\e(0KA\e(B"  22 1) ("\e(0KB\e(B"  22 3) ("\e(0KC\e(B"  22 5) ("\e(0KD\e(B"  22 7) ; n
+    ("@\e(0@\e(B"  23 0) ("@\e(0A\e(B"  23 1) ("@\e(0B\e(B"  23 3) ("@\e(0C\e(B"  23 5) ("@\e(0D\e(B"  23 7) ; ng
+    ("\e(0[@\e(B"  24 0) ("\e(0[A\e(B"  24 1) ("\e(0[B\e(B"  24 3) ("\e(0[C\e(B"  24 5) ("\e(0[D\e(B"  24 7) ; o
+    ("\e(0he@\e(B" 25 0) ("\e(0heA\e(B" 25 1) ("\e(0heB\e(B" 25 3) ("\e(0heC\e(B" 25 5) ("\e(0heD\e(B" 25 7) ; ong
+    ("\e(0a@\e(B"  26 0) ("\e(0aA\e(B"  26 1) ("\e(0aB\e(B"  26 3) ("\e(0aC\e(B"  26 5) ("\e(0aD\e(B"  26 7) ; ou
+    ("\e(0h@\e(B"  27 0) ("\e(0hA\e(B"  27 1) ("\e(0hB\e(B"  27 3) ("\e(0hC\e(B"  27 5) ("\e(0hD\e(B"  27 7) ; u
+    ("\e(0hZ@\e(B" 28 0) ("\e(0hZA\e(B" 28 1) ("\e(0hZB\e(B" 28 3) ("\e(0hZC\e(B" 28 5) ("\e(0hZD\e(B" 28 7) ; ua
+    ("\e(0h^@\e(B" 29 0) ("\e(0h^A\e(B" 29 1) ("\e(0h^B\e(B" 29 3) ("\e(0h^C\e(B" 29 5) ("\e(0h^D\e(B" 29 7) ; uai
+    ("\e(0hb@\e(B" 30 0) ("\e(0hbA\e(B" 30 1) ("\e(0hbB\e(B" 30 3) ("\e(0hbC\e(B" 30 5) ("\e(0hbD\e(B" 30 7) ; uan
+    ("\e(0hd@\e(B" 31 0) ("\e(0hdA\e(B" 31 1) ("\e(0hdB\e(B" 31 3) ("\e(0hdC\e(B" 31 5) ("\e(0hdD\e(B" 31 7) ; uang
+    ("\e(0i]@\e(B" 37 0) ("\e(0i]A\e(B" 37 1) ("\e(0i]B\e(B" 37 3) ("\e(0i]C\e(B" 37 5) ("\e(0i]D\e(B" 37 7) ; ue
+    ("\e(0h_@\e(B" 33 0) ("\e(0h_A\e(B" 33 1) ("\e(0h_B\e(B" 33 3) ("\e(0h_C\e(B" 33 5) ("\e(0h_D\e(B" 33 7) ; ui
+    ("\e(0hc@\e(B" 34 0) ("\e(0hcA\e(B" 34 1) ("\e(0hcB\e(B" 34 3) ("\e(0hcC\e(B" 34 5) ("\e(0hcD\e(B" 34 7) ; un
+    ("\e(0h[@\e(B" 35 0) ("\e(0h[A\e(B" 35 1) ("\e(0h[B\e(B" 35 3) ("\e(0h[C\e(B" 35 5) ("\e(0h[D\e(B" 35 7) ; uo
+    ("\e(0i@\e(B"  36 0) ("\e(0iA\e(B"  36 1) ("\e(0iB\e(B"  36 3) ("\e(0iC\e(B"  36 5) ("\e(0iD\e(B"  36 7) ; \e(09\e(B
+    ("\e(0i]@\e(B" 37 0) ("\e(0i]A\e(B" 37 1) ("\e(0i]B\e(B" 37 3) ("\e(0i]C\e(B" 37 5) ("\e(0i]D\e(B" 37 7) ; \e(09\e(Be
+    ("0\e(0@\e(B"  38 0) ("1\e(0A\e(B"  38 1) ("2\e(0B\e(B"  38 3) ("3\e(0C\e(B"  38 5) ("4\e(0D\e(B"  38 7) ; undefined
+    ("\e(0ib@\e(B" 39 0) ("\e(0ibA\e(B" 39 1) ("\e(0ibB\e(B" 39 3) ("\e(0ibC\e(B" 39 5) ("\e(0ibD\e(B" 39 7) ; \e(09\e(Ban
+    ("\e(0ic@\e(B" 40 0) ("\e(0icA\e(B" 40 1) ("\e(0icB\e(B" 40 3) ("\e(0icC\e(B" 40 5) ("\e(0icD\e(B" 40 7) ; \e(09\e(Bn
+    ))
+
+(defconst egg-zhuyin-table
+  [
+   ;; empty ShengMu
+   ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
+   ?\x8000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x9586 ?\x0000 ?\x9592 ?\x9599
+   ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x0000 ?\x0000 ?\x0000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x959b ?\x95a0 ?\x0000 ?\x959e
+   ?\x95a2
+   ;; ShengMu B
+   ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000
+   ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000 ?\x0000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
+   ?\x0000
+   ;; ShengMu C
+   ?\x828b ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
+   ?\x0000 ?\x0280 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000
+   ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
+   ?\x0000
+   ;; ShengMu Ch
+   ?\x838b ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000
+   ?\x0000 ?\x0380 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
+   ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
+   ?\x0000
+   ;; ShengMu D
+   ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
+   ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x0000
+   ?\x8000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000
+   ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
+   ?\x0000
+   ;; ShengMu F
+   ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x0000 ?\x0000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
+   ?\x0000
+   ;; ShengMu G
+   ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
+   ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
+   ?\x0000
+   ;; ShengMu H
+   ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
+   ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
+   ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
+   ?\x0000
+   ;; ShengMu J
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
+   ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
+   ?\x8000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x08a4 ?\x0000 ?\x0000
+   ?\x08a7 ?\x0000 ?\x08a5 ?\x0000 ?\x08a8 ?\x0000 ?\x889b ?\x88a0 ?\x8000 ?\x889e
+   ?\x88a2
+   ;; ShengMu K
+   ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
+   ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
+   ?\x0000
+   ;; ShengMu L
+   ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x8000
+   ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000
+   ?\x8000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000
+   ?\x8000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000
+   ?\x0000
+   ;; ShengMu M
+   ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
+   ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000
+   ?\x8000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x0000 ?\x0000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
+   ?\x0000
+   ;; ShengMu N
+   ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
+   ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000
+   ?\x8000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000
+   ?\x8000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000
+   ?\x0000
+   ;; ShengMu P
+   ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000
+   ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x0000 ?\x0000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
+   ?\x0000 
+   ;; ShengMu Q
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
+   ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
+   ?\x8000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0ea4 ?\x0000 ?\x0000
+   ?\x0ea7 ?\x0000 ?\x0ea5 ?\x0000 ?\x0ea8 ?\x0000 ?\x8e9b ?\x8ea0 ?\x8000 ?\x8e9e
+   ?\x8ea2
+   ;; ShengMu R
+   ?\x8f8b ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000
+   ?\x0000 ?\x0f80 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000
+   ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
+   ?\x0000
+   ;; ShengMu S
+   ?\x908b ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000
+   ?\x0000 ?\x1080 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000
+   ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
+   ?\x0000
+   ;; ShengMu Sh
+   ?\x918b ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
+   ?\x0000 ?\x1180 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
+   ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
+   ?\x0000
+   ;; ShengMu T
+   ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x8000
+   ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x0000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000
+   ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
+   ?\x0000
+   ;; ShengMu W
+   ?\x939b ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0000 ?\x0000 ?\x1380 ?\x0000 ?\x0000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
+   ?\x0000
+   ;; ShengMu X
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
+   ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
+   ?\x8000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x14a4 ?\x0000 ?\x0000
+   ?\x14a7 ?\x0000 ?\x14a5 ?\x0000 ?\x14a8 ?\x0000 ?\x949b ?\x94a0 ?\x8000 ?\x949e
+   ?\x94a2
+   ;; ShengMu Y 
+   ?\x958b ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0090 ?\x0000 ?\x9591 ?\x9592
+   ?\x0000 ?\x1580 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x1588 ?\x1589 ?\x0000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0093 ?\x8000 ?\x00a4 ?\x0000 ?\x0000
+   ?\x00a7 ?\x0000 ?\x00a5 ?\x0000 ?\x00a8 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
+   ?\x0000
+   ;; ShengMu Z
+   ?\x968b ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
+   ?\x0000 ?\x1680 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000
+   ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
+   ?\x0000
+   ;; ShengMu Zh 
+   ?\x978b ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
+   ?\x0000 ?\x1780 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000
+   ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x8000 ?\x8000
+   ?\x8000 ?\x8000 ?\x0000 ?\x8000 ?\x8000 ?\x8000 ?\x0000 ?\x0000 ?\x8000 ?\x0000
+   ?\x0000
+   ])
+
+(defconst egg-chinese-syllable-max-len
+  (max (length "Zhu\e(0!\e(Bng\e(0@\e(B") (length "\e(0ShdA\e(B")))
+
+(defun egg-chinese-syllable (str pos)
+  (setq str (substring str pos (min (length str)
+                                   (+ pos egg-chinese-syllable-max-len))))
+  (or (car (egg-pinyin-syllable str))
+      (car (egg-zhuyin-syllable str))))
+
+(defsubst egg-make-fixed-euc-china-code (s y)
+  (cons
+   (+ (* 2 (nth 1 y)) (logand (nth 2 y) 1) 32)
+   (+ (* 4 (if (= s 0) 20 s)) (lsh (nth 2 y) -1) 156)))
+
+(defun egg-pinyin-syllable (str)
+  (if (eq (string-match "^[A-Za-z\e(0!\e(B-\e(0?\e(B]+\e(0@\e(B" str) 0)
+      (let (s y end)
+       (setq end (match-end 0))
+       (cond
+        ((setq s (cdr (assoc (substring str 0 2) egg-pinyin-shengmu)))
+         (setq y (substring str 2 end)))
+        ((setq s (cdr (assoc (substring str 0 1) egg-pinyin-shengmu)))
+         (setq y (substring str 1 end)))
+        (t
+         (setq s 0 y (substring str 0 end))))
+       (if (and (setq y (assoc y egg-pinyin-yunmu))
+                (= (aref egg-pinyin-table (+ (* 39 s) (nth 1 y))) 1))
+           (cons end (egg-make-fixed-euc-china-code s y))))))
+
+(defun egg-zhuyin-syllable (str)
+  (if (eq (string-match "^[\e(0E\e(B-\e(0i\e(B@0-4]+[\e(0@ABCD\e(B]" str) 0)
+      (let (end s y c z (zhuyin-len (length "\e(0E\e(B")))
+       (setq end (match-end 0)
+             c (substring str 0 zhuyin-len)
+             s (cdr (assoc c egg-zhuyin-shengmu))
+             y (assoc (substring str zhuyin-len end) egg-zhuyin-yunmu))
+       (if (or (null (and s y))
+               (and (or (eq s 11) (eq s 12)) (eq (nth 1 y) 0))) ; [\e(0GK\e(B][\e(0@ABCD\e(B]
+           (setq s 0
+                 y (assoc (substring str 0 end) egg-zhuyin-yunmu)))
+       (if (and y
+                (setq z (aref egg-zhuyin-table (+ (* 41 s) (nth 1 y))))
+                (/= (logand z ?\x8000) 0))
+           (if (/= (logand z ?\x80) 0)
+               (cons end (egg-make-fixed-euc-china-code
+                          (logand (lsh z -8) ?\x7f)
+                          (list nil (logand z ?\x7f) (nth 2 y))))
+             (cons end (egg-make-fixed-euc-china-code s y)))))))
+
+(defun encode-fixed-euc-china-region (beg end type)
+  "Encode the text in the region to EUC-CN/TW."
+  (let (s syl c cset)
+    (save-excursion
+      (save-restriction
+       (narrow-to-region beg end)
+       (goto-char (point-min))
+       (while (< (point) (point-max))
+         (setq s (buffer-substring
+                  (point)
+                  (min (point-max) (+ (point) egg-chinese-syllable-max-len))))
+         (cond
+          ((setq syl (egg-pinyin-syllable s))
+           (delete-region (point) (+ (point) (car syl)))
+           (insert (car (cdr syl)) (cdr (cdr syl))))
+          ((setq syl (egg-zhuyin-syllable s))
+           (delete-region (point) (+ (point) (car syl)))
+           (insert (car (cdr syl)) (cdr (cdr syl))))
+          (t
+           (setq c (split-char (following-char))
+                 cset (car c))
+           (cond
+            ((or (and (eq cset 'chinese-gb2312) (eq type 'cn))
+                 (and (eq cset 'chinese-cns11643-1) (eq type 'tw)))
+             (delete-char 1)
+             (insert (+ (nth 1 c) 128) (+ (nth 2 c) 128)))
+            ((and (eq cset 'chinese-cns11643-2) (eq type 'tw))
+             (delete-char 1)
+             (insert (+ (nth 1 c) 128) (nth 2 c)))
+            ((eq cset 'chinese-sisheng)
+             (delete-char 1)
+             (insert 0 (+ (nth 1 c) 128)))
+            ((eq cset 'ascii)
+             (delete-char 1)
+             (insert 0 (nth 1 c)))
+            (t
+             (delete-char 1))))))
+       (- (point-max) (point-min))))))
+
+(defun pre-write-encode-fixed-euc-china (from to type)
+  (let ((buf (current-buffer))
+       (work (get-buffer-create " *pre-write-encoding-work*")))
+    (set-buffer work)
+    (erase-buffer)
+    (if (null (stringp from))
+       (save-excursion
+         (set-buffer buf)
+         (setq from (buffer-substring from to))))
+    (insert (string-as-multibyte from))
+    (encode-fixed-euc-china-region 1 (point-max) type)
+    nil))
+
+(defun pre-write-encode-euc-cn (from to)
+  (pre-write-encode-fixed-euc-china from to 'cn))
+
+(defun pre-write-encode-euc-tw (from to)
+  (pre-write-encode-fixed-euc-china from to 'tw))
+
+(defun decode-fixed-euc-china-region (beg end type zhuyin)
+  "Decode EUC-CN/TW encoded text in the region.
+Return the length of resulting text."
+  (prog1
+      (let ((str (string-as-unibyte (buffer-substring beg end)))
+           (i 0)
+           l c0 c1 s y ss)
+       (delete-region beg end)
+       (setq l (1- (length str)))
+       (while (< i l)
+         (setq c0 (aref str i)
+               c1 (aref str (1+ i))
+               i  (+ i 2))
+         (cond
+          ((eq c0 0)
+           (if (> c1 ?\xa0)
+               (insert leading-code-private-11
+                       (charset-id 'chinese-sisheng)
+                       c1)
+             (insert c1)))
+          ((>= c0 ?\x80)
+           (cond
+            ((eq type 'cn)
+             (insert (charset-id 'chinese-gb2312) c0 (logior c1 ?\x80)))
+            ((>= c1 ?\x80)
+             (insert (charset-id 'chinese-cns11643-1) c0 c1))
+            (t
+             (insert (charset-id 'chinese-cns11643-2) c0 (+ c1 ?\x80)))))
+          (t
+           (setq c1 (logand c1 ?\x7f))
+           (setq s (- (lsh c1 -2) 7);;(+ (lsh (- c1 32) -2) 1)
+                 y (- (lsh c0 -1) 16);;(lsh (- c0 32) -1)
+                 ss (+ (logand c0 1) (logand c1 3)))
+           (if (and (eq s 20)
+                    (eq (aref egg-pinyin-table (+ (* 39 20) y)) 0))
+               (setq s 0))
+           (if (null zhuyin)
+               (setq s (car (nth s egg-pinyin-shengmu))
+                     y (car (nth (+ (* 5 y) ss) egg-pinyin-yunmu)))
+             (setq c0 (aref egg-zhuyin-table (+ (* 41 s) y)))
+             (if (eq (logand c0 ?\x8080) ?\x80)
+                 (setq s (lsh c0 -8)
+                       y (logand c0 ?\x7f)))
+             (setq s (car (nth s egg-zhuyin-shengmu))
+                   y (car (nth (+ (* 5 y) ss) egg-zhuyin-yunmu))))
+           (if enable-multibyte-characters
+               (insert s y)
+             (insert (string-as-unibyte s) (string-as-unibyte y))))))
+       (- (point) beg))
+    (if (looking-at "\0\0") (forward-char 2))))
+
+(defun post-read-decode-fixed-euc-china (len type zhuyin)
+  (let ((pos (point))
+       (buffer-modified-p (buffer-modified-p)))
+    (prog1
+       (decode-fixed-euc-china-region pos (+ pos len) type zhuyin)
+      (set-buffer-modified-p buffer-modified-p))))
+
+(defun post-read-decode-euc-py-cn (len)
+  (post-read-decode-fixed-euc-china len 'cn nil))
+
+(defun post-read-decode-euc-zy-cn (len)
+  (post-read-decode-fixed-euc-china len 'cn t))
+
+(defun post-read-decode-euc-py-tw (len)
+  (post-read-decode-fixed-euc-china len 'tw nil))
+
+(defun post-read-decode-euc-zy-tw (len)
+  (post-read-decode-fixed-euc-china len 'tw t))
+
+(make-coding-system 'fixed-euc-py-cn 0 ?W
+                   "Coding System for fixed EUC Chinese-gb2312")
+(coding-system-put 'fixed-euc-py-cn
+                  'pre-write-conversion 'pre-write-encode-euc-cn)
+(coding-system-put 'fixed-euc-py-cn
+                  'post-read-conversion 'post-read-decode-euc-py-cn)
+
+(make-coding-system 'fixed-euc-zy-cn 0 ?W
+                   "Coding System for fixed EUC Chinese-gb2312")
+(coding-system-put 'fixed-euc-zy-cn
+                  'pre-write-conversion 'pre-write-encode-euc-cn)
+(coding-system-put 'fixed-euc-zy-cn
+                  'post-read-conversion 'post-read-decode-euc-zy-cn)
+
+(make-coding-system 'fixed-euc-py-tw 0 ?W
+                   "Coding System for fixed EUC Chinese-cns11643")
+(coding-system-put 'fixed-euc-py-tw
+                  'pre-write-conversion 'pre-write-encode-euc-tw)
+(coding-system-put 'fixed-euc-py-tw
+                  'post-read-conversion 'post-read-decode-euc-py-tw)
+
+(make-coding-system 'fixed-euc-zy-tw 0 ?W
+                   "Coding System for fixed EUC Chinese-cns11643")
+(coding-system-put 'fixed-euc-zy-tw
+                  'pre-write-conversion 'pre-write-encode-euc-tw)
+(coding-system-put 'fixed-euc-zy-tw
+                  'post-read-conversion 'post-read-decode-euc-zy-tw)
+
+;; Binary data
+
+(eval-and-compile
+(define-ccl-program ccl-decode-egg-binary
+  `(2
+    ((read r0)
+     (loop
+      (if (r0 == ?\xff)
+         (read r1))                    ; toss out
+      (write-read-repeat r0)))))
+
+(define-ccl-program ccl-encode-egg-binary
+  `(1
+    ((read r0)
+     (loop
+      (if (r0 == ?\xff)
+         ((write r0)
+          (r0 = 0)))
+      (write-read-repeat r0))))))
+
+(make-coding-system 'egg-binary 4 ?W "Coding System for binary data"
+                   (cons ccl-decode-egg-binary ccl-encode-egg-binary))
+
+\f
+(defun comm-format-u32c (uint32c)
+  (insert-char (logand (lsh (car uint32c) -8) 255) 1)
+  (insert-char (logand (car uint32c) 255) 1)
+  (insert-char (logand (lsh (nth 1 uint32c) -8) 255) 1)
+  (insert-char (logand (nth 1 uint32c) 255) 1))
+
+(defun comm-format-u32 (uint32)
+  (insert-char (logand (lsh uint32 -24) 255) 1)
+  (insert-char (logand (lsh uint32 -16) 255) 1)
+  (insert-char (logand (lsh uint32 -8) 255) 1)
+  (insert-char (logand uint32 255) 1))
+
+(defun comm-format-i32 (int32)
+  (insert-char (logand (ash int32 -24) 255) 1)
+  (insert-char (logand (ash int32 -16) 255) 1)
+  (insert-char (logand (ash int32 -8) 255) 1)
+  (insert-char (logand int32 255) 1))
+
+(defun comm-format-u16 (uint16)
+  (insert-char (logand (lsh uint16 -8) 255) 1)
+  (insert-char (logand uint16 255) 1))
+
+(defun comm-format-u8 (uint8)
+  (insert-char (logand uint8 255) 1))
+
+(defun comm-format-truncate-after-null (s)
+  (if (string-match "\0" s)
+      (substring s 0 (match-beginning 0))
+    s))
+
+(defun comm-format-u16-string (s)
+  (insert (encode-coding-string (comm-format-truncate-after-null s)
+                               egg-fixed-euc))
+  (insert-char 0 2))
+
+(defun comm-format-mb-string (s)
+  (insert (encode-coding-string  (comm-format-truncate-after-null s)
+                                egg-mb-euc))
+  (insert-char 0 1))
+
+(defun comm-format-u8-string (s)
+  (insert (comm-format-truncate-after-null s))
+  (insert-char 0 1))
+
+(defun comm-format-binary-data (s)
+  (insert (encode-coding-string s 'egg-binary))
+  (insert-char ?\377 2))
+
+(defun comm-format-fixlen-string (s len)
+  (setq s (comm-format-truncate-after-null s))
+  (insert (if (< (length s) len) s (substring s 0 (1- len))))
+  (insert-char 0 (max (- len (length s)) 1)))
+
+(defun comm-format-vector (s len)
+  (setq s (concat s))
+  (insert (if (<= (length s) len) s (substring s 0 len)))
+  (insert-char 0 (- len (length s))))
+
+(defmacro comm-format (format &rest args)
+  "Format a string out of a control-list and arguments into the buffer.
+The formated datas are network byte oder (i.e. big endian)..
+U: 32-bit integer.  The argument is 2 element 16-bit unsigned integer list.
+u: 32-bit integer.  The argument is treat as unsigned integer.
+   (Note:  Elisp's integer may be less than 32 bits)
+i: 32-bit integer.
+w: 16-bit integer.
+b: 8-bit integer.
+S: 16-bit wide-character EUC string (0x0000 terminated).
+E: Multibyte EUC string (0x00 terminated).
+s: 8-bit string (0x00 terminated).
+B: Binary data (0xff terminated).
+v: 8-bit vector (no terminator).  This takes 2 args (data length).
+V: Fixed length string (0x00 terminated).  This takes 2 args (data length)."
+  (let ((p args)
+       (form format)
+       (result (list 'progn))
+       f arg)
+    (while (and form p)
+      (setq f (car form)
+           arg (car p))
+      (nconc result
+            (list
+             (cond ((eq f 'U) (list 'comm-format-u32c arg))
+                   ((eq f 'u) (list 'comm-format-u32 arg))
+                   ((eq f 'i) (list 'comm-format-i32 arg))
+                   ((eq f 'w) (list 'comm-format-u16 arg))
+                   ((eq f 'b) (list 'comm-format-u8 arg))
+                   ((eq f 'S) (list 'comm-format-u16-string arg))
+                   ((eq f 'E) (list 'comm-format-mb-string arg))
+                   ((eq f 's) (list 'comm-format-u8-string arg))
+                   ((eq f 'B) (list 'comm-format-binary-data arg))
+                   ((eq f 'V) (setq p (cdr p))
+                              (list 'comm-format-fixlen-string arg (car p)))
+                   ((eq f 'v) (setq p (cdr p))
+                              (list 'comm-format-vector arg (car p))))))
+      (setq form (cdr form)
+           p (cdr p)))
+    (if (or form p)
+       (error "comm-format %s: arguments mismatch" format))
+    result))
+\f
+(defvar comm-accept-timeout nil)
+
+;; Assume PROC is bound to the process of current buffer
+;; Do not move the point, leave it where it was.
+(defmacro comm-accept-process-output ()
+  `(let ((p (point)))
+     (if (null (accept-process-output proc comm-accept-timeout))
+        (egg-error "backend timeout"))
+     (goto-char p)))
+
+(defmacro comm-require-process-output (n)
+  `(if (< (point-max) (+ (point) ,n))
+       (comm-wait-for-space proc ,n)))
+
+(defun comm-wait-for-space (proc n)
+  (let ((p (point))
+       (r (+ (point) n)))
+    (while (< (point-max) r)
+      (if (null (accept-process-output proc comm-accept-timeout))
+         (egg-error "backend timeout"))
+      (goto-char p))))
+
+(defmacro comm-following+forward-char ()
+  `(prog1
+       (following-char)
+     (forward-char 1)))
+
+(defun comm-unpack-u32c ()
+  (progn
+    (comm-require-process-output 4)
+    (list (+ (lsh (comm-following+forward-char) 8)
+            (comm-following+forward-char))
+         (+ (lsh (comm-following+forward-char) 8)
+            (comm-following+forward-char)))))
+
+(defun comm-unpack-u32 ()
+  (progn
+    (comm-require-process-output 4)
+    (+ (lsh (comm-following+forward-char) 24)
+       (lsh (comm-following+forward-char) 16)
+       (lsh (comm-following+forward-char) 8)
+       (comm-following+forward-char))))
+
+(defun comm-unpack-u16 ()
+  (progn
+    (comm-require-process-output 2)
+    (+ (lsh (comm-following+forward-char) 8)
+       (comm-following+forward-char))))
+
+(defun comm-unpack-u8 ()
+  (progn
+    (comm-require-process-output 1)
+    (comm-following+forward-char)))
+
+(defun comm-unpack-u16-string ()
+  (let ((start (point)))
+    (while (not (search-forward "\0\0" nil t))
+      (comm-accept-process-output))
+    (decode-coding-string (buffer-substring start (- (point) 2))
+                         egg-fixed-euc)))
+
+(defun comm-unpack-mb-string ()
+  (let ((start (point)))
+    (while (not (search-forward "\0" nil t))
+      (comm-accept-process-output))
+    (decode-coding-string (buffer-substring start (1- (point)))
+                         egg-mb-euc)))
+
+(defun comm-unpack-u8-string ()
+  (let ((start (point)))
+    (while (not (search-forward "\0" nil 1))
+      (comm-accept-process-output))
+    (buffer-substring start (1- (point)))))
+
+(defun comm-unpack-binary-data ()
+  (let ((start (point)))
+    (while (not (search-forward "\377\377" nil 1))
+      (comm-accept-process-output))
+    (string-as-unibyte
+     (decode-coding-string (buffer-substring start (- (point) 2))
+                          'egg-binary))))
+
+(defun comm-unpack-fixlen-string (len)
+  (let (s)
+    (comm-require-process-output len)
+    (goto-char (+ (point) len))
+    (setq s (buffer-substring (- (point) len) (point)))
+    (if (string-match "\0" s)
+       (setq s (substring s 0 (match-beginning 0))))
+    s))
+
+(defun comm-unpack-vector (len)
+  (progn
+    (comm-require-process-output len)
+    (goto-char (+ (point) len))
+    (buffer-substring (- (point) len) (point))))
+
+(defmacro comm-unpack (format &rest args)
+  "Unpack a string out of a control-string and set arguments.
+See `comm-format' for FORMAT."
+  (let ((p args)
+       (form format)
+       (result (list 'progn))
+       arg f)
+    (while (and form p)
+      (setq f (car form)
+           arg (car p))
+      (nconc result
+            (list
+             (cond ((eq f 'U) `(setq ,arg (comm-unpack-u32c)))
+                   ((eq f 'u) `(setq ,arg (comm-unpack-u32)))
+                   ((eq f 'i) `(setq ,arg (comm-unpack-u32)))
+                   ((eq f 'w) `(setq ,arg (comm-unpack-u16)))
+                   ((eq f 'b) `(setq ,arg (comm-unpack-u8)))
+                   ((eq f 'S) `(setq ,arg (comm-unpack-u16-string)))
+                   ((eq f 'E) `(setq ,arg (comm-unpack-mb-string)))
+                   ((eq f 's) `(setq ,arg (comm-unpack-u8-string)))
+                   ((eq f 'B) `(setq ,arg (comm-unpack-binary-data)))
+                   ((eq f 'V) (setq p (cdr p))
+                              `(setq ,arg (comm-unpack-fixlen-string ,(car p))))
+                   ((eq f 'v) (setq p (cdr p))
+                              `(setq ,arg (comm-unpack-vector ,(car p)))))))
+      (setq form (cdr form)
+           p (cdr p)))
+    (if (or form p)
+       (error "comm-unpack %s: arguments mismatch" format))
+    result))
+\f
+(defmacro comm-call-with-proc (proc vlist send-expr &rest receive-exprs)
+  (let ((euc-select
+        (and (eq (car-safe (car vlist)) 'zhuyin)
+             '((egg-fixed-euc (nth (if zhuyin 1 0) egg-fixed-euc))))))
+  `(let* ((proc ,proc)
+         (buffer (process-buffer proc))
+         ,@vlist)
+     (if (and (eq (process-status proc) 'open)
+             (buffer-live-p buffer))
+        (save-excursion
+          (set-buffer buffer)
+          (let ,euc-select
+            (erase-buffer)
+            ,send-expr
+            (goto-char (point-max))
+            (process-send-region proc (point-min) (point-max))
+            ,@receive-exprs))
+       (egg-error "process %s was killed" proc)))))
+
+(defmacro comm-call-with-proc-1 (proc vlist send-expr &rest receive-exprs)
+  `(let ,vlist
+     (erase-buffer)
+     ,send-expr
+     (goto-char (point-max))
+     (process-send-region proc (point-min) (point-max))
+     ,@receive-exprs))
+
+(provide 'egg-com)
+;;; egg-com.el ends here.
diff --git a/egg-dotemacs b/egg-dotemacs
new file mode 100644 (file)
index 0000000..e0ac692
--- /dev/null
@@ -0,0 +1,31 @@
+;;; Emacs/Egg Configuration
+
+;; <Egg>
+
+(set-language-info "Japanese"    'input-method "japanese-egg-wnn")
+
+(defvar its-hira-enable-double-n t
+  "*Enable \"nn\" input for \"\e$B$s\e(B\" ")
+
+(defvar its-hira-period "\e$B!#\e(B" ;;; ". " "\e$B!%\e(B"
+  "*\e$B%T%j%*%I\e(B")
+
+(defvar its-hira-comma  "\e$B!"\e(B" ;;; ", " "\e$B!$\e(B"
+  "*\e$B%3%s%^\e(B") 
+
+(defvar its-hira-open-bracket  "\e$B!V\e(B" ;;; "\e$B!N\e(B"
+  "*[") 
+
+(defvar its-hira-close-bracket  "\e$B!W\e(B" ;;; "\e$B!O\e(B"
+  "*]") 
+
+(defvar its-hira-horizontal  "\e$B!<\e(B" ;;; "\e$B!]\e(B"
+  "*-")
+
+(set-language-info "Chinese-GB"  'input-method "chinese-gb-egg-wnn-py")
+(set-language-info "Chinese-CNS" 'input-method "chinese-cns-egg-wnn-py")
+(set-language-info "Korean"      'input-method "korean-egg-wnn")
+
+(require 'egg)
+
+;; </Egg>
diff --git a/egg-edep.el b/egg-edep.el
new file mode 100644 (file)
index 0000000..8a93a96
--- /dev/null
@@ -0,0 +1,96 @@
+;; egg-edep.el --- This file serves Emacs version dependent definitions
+
+;; Copyright (C) 1999,2000 PFU LIMITED
+
+;; Author: NIIBE Yutaka <gniibe@chroot.org>
+;;         KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+
+(if (and (fboundp 'set-buffer-multibyte)
+        (subrp (symbol-function 'set-buffer-multibyte)))
+    ;; Emacs 20.3
+    (progn
+      (defun egg-char-bytes (x) 1)
+      (defun egg-charset-bytes (x) 1)
+      (defun egg-char-bytes-at (str pos) 1)
+      (defun egg-chars-in-period (str pos len) len)
+      (defalias 'egg-string-to-vector 'identity)
+      (defalias 'egg-string-to-char-at 'aref)
+      )
+  ;; Emacs 20.2
+  (defun set-buffer-multibyte (flag)
+    (setq enable-multibyte-characters flag))
+  (defalias 'string-as-unibyte 'identity)
+  (defalias 'string-as-multibyte 'identity)
+  (defalias 'coding-system-put 'put)
+
+  (defalias 'egg-char-bytes 'char-bytes)
+  (defalias 'egg-charset-bytes 'charset-bytes)
+  (defun egg-char-bytes-at (str pos)
+    (char-bytes (egg-string-to-char-at str pos)))
+  (defun egg-chars-in-period (str pos len)
+    (chars-in-string (substring str pos (+ pos len))))
+  (defalias 'egg-string-to-vector 'string-to-vector)
+  (defalias 'egg-string-to-char-at 'sref)
+  )
+
+;; Elisp bug fix
+
+(defun egg-next-single-property-change (pos prop &optional object limit)
+  (if limit
+      (min limit (next-single-property-change pos prop object (1+ limit)))
+    (next-single-property-change pos prop object)))
+
+(defun egg-string-match-charset (charset string &optional start)
+  (let ((cur-ct (category-table))
+       category)
+    (unwind-protect
+       (progn
+         (set-category-table (copy-category-table))
+         (setq category (get-unused-category))
+         (define-category category "")
+         (modify-category-entry (make-char charset) category)
+         (string-match (concat "\\c" (list category) "+") string start))
+      (set-category-table cur-ct))))
+
+(unless (egg-string-match-charset 'japanese-jisx0208 "\e$B!#\e(B")
+  (defun egg-string-match-charset (charset string &optional start)
+    (let (min max)
+      (if (= (charset-chars charset) 94)
+          (setq min 33 max 126)
+        (setq min 32 max 127))
+      (string-match (if (= (charset-dimension charset) 1)
+                        (concat "[" (list (make-char charset min))
+                                "-" (list (make-char charset max))
+                                "]+")
+                      (concat "[" (list (make-char charset min min))
+                              "-" (list (make-char charset max max))
+                              "]+"))
+                    string start))))
+
+(provide 'egg-edep)
diff --git a/egg-mlh.el b/egg-mlh.el
new file mode 100644 (file)
index 0000000..bb87d28
--- /dev/null
@@ -0,0 +1,550 @@
+;;; egg-mlh.el --- Modeless Conversion Facility in Egg Input
+;;;                   Method Architecture
+
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc
+
+;; Author: NIIBE Yutaka <gniibe@chroot.org>
+;;         KATAYAMA Yoshio <kate@pfu.co.jp>      ; Multilingual Enhancement
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+
+;;; Code:
+
+
+(defvar mlh-default-backend "wnn")
+
+(defun mlh-space-bar-backward-henkan ()
+  "If the character preceding point is / (slash),
+Do `mlh-backward-henkan'.  Then, invoke appropriate conversion, if needed.
+Or else, execute command that space-bar invokes usually."
+  (interactive)
+  (let ((henkan-begin nil)
+        (inhibit-henkan t)
+        (its-disable-special-action t))
+    (if (null (assq 'Japanese egg-conversion-backend-alist))
+       (progn
+          (setq egg-mode-preference nil)
+          (activate-input-method (concat "japanese-egg-" mlh-default-backend)))
+      ;; force to Japanese
+      (its-select-hiragana))
+    (mlh-backward-henkan)
+    (if henkan-begin
+        (if (or inhibit-henkan (= henkan-begin (point)))
+            (egg-do-auto-fill)
+          (progn
+            (message "Converting...")
+            (sit-for 0)
+           (egg-convert-region henkan-begin (point))
+            (message "") ))
+      (setq this-command 'self-insert-command)
+      (call-interactively 'self-insert-command))))
+
+(defvar mlh-punctuations nil)
+(if mlh-punctuations
+    ()
+  (setq mlh-punctuations "!()?;:"))
+
+(defvar mlh-conversion-scheme-table
+  '(
+    (?- . mlh-kanji)
+;    (?` . mlh-ltn)
+;    (?' . mlh-ltn)
+;    (?, . mlh-ltn)
+    (?, . mlh-kanji)
+    (?. . mlh-kanji)
+;    (?^ . mlh-ltn)
+;    (?~ . mlh-ltn)
+;    (?\". mlh-ltn)
+;    (?@ . mlh-ltn)
+;    (?< . mlh-ltn)
+;    (?> . mlh-ltn)
+    (?a . mlh-kanji)
+;    (?b . mlh-)
+    (?c . mlh-capitalize)
+    (?d . mlh-user-defined-conversion)
+    (?e . mlh-kanji)
+    (?f . mlh-hiragana)
+    (?g . mlh-greek)
+    (?h . mlh-hangul)
+    (?i . mlh-kanji)
+    (?j . mlh-jis-code)
+    (?k . mlh-katakana)
+;    (?l . mlh-ligature)
+;    (?m . mlh-)
+    (?n . mlh-kanji)
+;    (?n . mlh-no-conversion)
+    (?o . mlh-kanji)
+    (?p . mlh-upcase-letter)
+    (?q . mlh-quit)
+;    (?r . mlh-)
+    (?s . mlh-small-letter)
+    (?t . mlh-zhongwen-tw)
+    (?u . mlh-kanji)
+;    (?v . mlh-)
+    (?w . mlh-white-space)
+    (?x . mlh-execute)
+;    (?y . mlh-)
+    (?z . mlh-zhongwen)
+    (?H . mlh-hiragana-to-kanji)
+    (?L . mlh-lisp-expression)
+    (?W . mlh-zenkaku-white)
+    (?X . mlh-exit)
+    (?Z . mlh-zenkaku)
+))
+\f
+(defun mlh-zenkaku-white ()
+  (forward-char -1)
+  (skip-chars-backward "0-9")
+  (mlh-backward-henkan)
+  (setq beg (point))
+  (goto-char end-marker)
+  (backward-delete-char 2)
+  (let* ((str (buffer-substring beg (point)))
+         (val (string-to-int str)))
+    (delete-region beg (point))
+    (if (= val 0)
+        (setq val 1))
+    (while (> val 0)
+      (insert "\e$B!!\e(B")
+      (setq val (1- val))))
+  (if (null henkan-begin)
+      (setq henkan-begin beg)))
+
+(defun mlh-exit ()
+  (goto-char end-marker)
+  (backward-delete-char 2)
+  (insert " ")
+  (setq henkan-begin (point)))
+
+(defun mlh-upcase-letter ()
+  (forward-char -1)
+  (skip-chars-backward "a-zA-Z0-9")
+  (mlh-backward-henkan)
+  (setq beg (point))
+  (goto-char end-marker)
+  (backward-delete-char 2)
+  (upcase-region beg (point))
+  (if (null henkan-begin)
+      (setq henkan-begin beg)))
+
+(defun mlh-capitalize ()
+  (forward-char -1)
+  (skip-chars-backward "a-zA-Z1-9")
+  (mlh-backward-henkan)
+  (setq beg (point))
+  (goto-char end-marker)
+  (backward-delete-char 2)
+  (capitalize-region beg (point))
+  (if (null henkan-begin)
+      (setq henkan-begin beg)))
+
+(defun mlh-jis-code ()
+  (forward-char -1)
+  (skip-chars-backward "0-9a-fA-F")
+  (mlh-backward-henkan)
+  (if (/= (- end-marker (point)) 6)
+      (error "invalid length"))
+  (setq beg (point))
+  (let ((val (car (read-from-string
+                  (concat "?\\x" (buffer-substring beg (- end-marker 2)))))))
+    (insert (make-char 'japanese-jisx0208 (/ val 256) (% val 256)))
+    (delete-region (point) end-marker))
+  (if (null henkan-begin)
+      (setq henkan-begin beg)))
+
+(defun mlh-lisp-expression ()
+  (forward-char -1)
+  (let ((stab (syntax-table)))
+    (unwind-protect
+        (progn
+          (set-syntax-table emacs-lisp-mode-syntax-table)
+          (forward-sexp -1))
+      (set-syntax-table stab)))
+  (mlh-backward-henkan)
+  (setq beg (point))
+  (goto-char end-marker)
+  (backward-delete-char 2)
+  (let* ((exp-str
+          (buffer-substring beg (point)))
+         (exp (car (read-from-string exp-str)))
+         (result (eval exp)))
+    (delete-region beg (point))
+    (insert (format "%s" result)))
+  (if (null henkan-begin)
+      (setq henkan-begin beg)))
+
+(defun mlh-quit ()
+  (goto-char end-marker)
+  (backward-delete-char 2)
+  (setq henkan-begin (point)))
+  
+(defun mlh-no-conversion ()
+  (forward-char -1)
+  (skip-chars-backward "\041-\056\060-\176")
+  (mlh-backward-henkan)
+  (setq beg (point))
+  (goto-char end-marker)
+  (backward-delete-char 2)
+  (if (null henkan-begin)
+      (setq henkan-begin beg)))
+
+(fset 'mlh-small-letter (symbol-function 'mlh-no-conversion))
+
+(defun mlh-white-space ()
+  (forward-char -1)
+  (skip-chars-backward "0-9")
+  (mlh-backward-henkan)
+  (setq beg (point))
+  (goto-char end-marker)
+  (backward-delete-char 2)
+  (let* ((str (buffer-substring beg (point)))
+         (val (string-to-int str)))
+    (delete-region beg (point))
+    (if (= val 0)
+        (setq val 1))
+    (insert (make-string val ?\ )))
+  (if (null henkan-begin)
+      (setq henkan-begin beg)))
+
+(defun mlh-execute ()
+  (forward-char -1)
+  (if (fboundp 'mlh-userdef-function)
+      (mlh-userdef-function)
+    (mlh-backward-henkan)
+    (setq beg (point))
+    (goto-char end-marker)
+    (backward-delete-char 2)
+    (if (null henkan-begin)
+        (setq henkan-begin beg))))
+\f
+(defun mlh-backward-henkan ()
+  "For each words seperated by / (slash), do conversion.
+Accoding to a character preceding slash, conversion scheme are selected.
+
+CHAR.  MNEMONIC             CONVERSION SCHEME
+
+  H    Hiragana to kanji    Convert Hiragana to Kanji
+  L    Lisp                 Evaluate as Emacs-Lisp expression
+  W    zenkaku White space  Insert Zenkaku spaces
+  X    eXit                 Quit going backward, insert space
+  Z    Zenkaku              Convert to Zenkaku
+  c    Capitalize           Capitalize
+  d    user Definition      Convert with user definition table
+  f    Firagana ??          Convert to Hiragana
+  g    Greek letter         Convert to single greek letter
+  h    Hangul               Convert to Hangul
+  j    Jis-code             Convert to character which has code
+  k    Katakana             Convert to Katakana
+  l    Ligature             Ligature (not implemented yet)
+  p    uPcase letter        uPcase
+  q    Quit                 Quit going backward
+  s    Small letter         No conversion
+  w    White space          Insert spaces
+  x    eXecute              Call user defined function
+  z    Zhongwen             Convert to Zhongwen
+    OTHERWISE               Convert to KANJI
+"
+  (if (eq (preceding-char) ?/)
+      (let ((end-marker (point-marker))
+            (char nil)
+            (beg nil))
+        (set-marker-insertion-type end-marker t)
+        (unwind-protect
+            (let (scheme)
+              (backward-char 1)
+              (setq char (preceding-char))
+              (cond 
+               ((setq scheme (assq char mlh-conversion-scheme-table))
+                (funcall (cdr scheme)))
+               (t
+                (goto-char end-marker)))
+              (if beg
+                  (progn
+                    (goto-char beg)
+                    (mlh-do-spacing)
+                    (goto-char end-marker))))
+          (set-marker end-marker nil)))))
+
+\f
+(defvar mlh-syntax-table nil
+  "Syntax table of mlh, which are used to determine spacing.")
+(if mlh-syntax-table
+    ()
+  (setq mlh-syntax-table (copy-syntax-table emacs-lisp-mode-syntax-table))
+  (modify-syntax-entry ?! "." mlh-syntax-table)
+  (modify-syntax-entry ?$ "'" mlh-syntax-table)
+  (modify-syntax-entry ?% "'" mlh-syntax-table)
+  (modify-syntax-entry ?& "'" mlh-syntax-table)
+  (modify-syntax-entry ?{ "(}" mlh-syntax-table)
+  (modify-syntax-entry ?} "){" mlh-syntax-table)
+)
+
+;;; XXX RTFM, gniibe!
+(defvar mlh-space-control
+  '(
+    (("al".?w).("al".?w))
+    (("al".?w).("al".?_))
+    (("al".?w).("Hj|".?e))
+    (("al".?w).("Cj|".?e))
+    (("al".?_).("al".?w))
+    (("al".?_).("al".?_))
+    (("al".?_).("Hj|".?e))
+    (("al".?_).("Cj|".?e))
+    (("al".?.).("al".?w))
+    (("al".?.).("al".?_))
+    (("al".?_).("Hj|".?e))
+    (("al".?_).("Cj|".?e))
+    (("Hj|".?e).("al".?w))
+    (("Cj|".?e).("al".?w))
+    (("Hj|".?e).("al".?_))
+    (("Cj|".?e).("al".?_))
+    )
+  "Alist that determines inserting space.")
+
+(defun mlh-do-spacing ()
+  "Arrange spacing as you like."
+  (if (bobp)
+      ()
+    (let ((s-tab (syntax-table))
+          s-pc s-fc
+          c-pc c-fc)
+      (unwind-protect
+          (progn
+            (set-syntax-table mlh-syntax-table)
+            (setq s-pc (char-syntax (preceding-char))
+                  s-fc (char-syntax (following-char))))
+        (set-syntax-table s-tab))
+      (setq c-pc (category-set-mnemonics (char-category-set (preceding-char)))
+           c-fc (category-set-mnemonics (char-category-set (following-char))))
+      (if (member (cons (cons c-pc s-pc) (cons c-fc s-fc)) mlh-space-control)
+          (progn
+            (and henkan-begin
+                 (>= henkan-begin (point))
+                 (setq henkan-begin (1+ henkan-begin)))
+            (insert " "))))))
+\f
+(defvar mlh-select-mode-map (make-keymap))
+
+;;; acutually this map is not necessary now. for future extention
+(defvar mlh-select-mode-esc-map (make-keymap))
+
+(define-key mlh-select-mode-map [t] 'undefined)
+(define-key mlh-select-mode-esc-map [t] 'undefined)
+
+(let ((ch 32))
+  (while (< ch 127)
+    (define-key mlh-select-mode-map (char-to-string ch)
+      'mlh-select-kakutei-and-self-insert)
+    (setq ch (1+ ch))))
+
+(define-key mlh-select-mode-map "\C-m" 'mlh-select-kakutei-and-self-insert)
+(define-key mlh-select-mode-map "\C-b" 'mlh-select-prev-candidate)
+(define-key mlh-select-mode-map "\C-f" 'mlh-select-next-candidate)
+(define-key mlh-select-mode-map "\177" 'mlh-select-prev-candidate)
+(define-key mlh-select-mode-map " " 'mlh-select-next-candidate)
+(define-key mlh-select-mode-map "/" 'mlh-select-kakutei)
+
+(if (eq window-system 'x)
+    (let ()
+      (define-key mlh-select-mode-map [return] 'mlh-select-kakutei-and-self-insert)
+      (define-key mlh-select-mode-map [delete] 'mlh-select-prev-candidate)
+      ))
+
+(defun mlh-select-insert-candidate (n)
+  (delete-region beg (point))
+  (insert (nth n candidates)))
+
+(defun mlh-select-prev-candidate ()
+  (interactive)
+  (setq current-candidate (1- current-candidate))
+  (if (< current-candidate 0)
+      (setq current-candidate (1- number-of-candidates)))
+  (mlh-select-insert-candidate current-candidate))
+
+(defun mlh-select-next-candidate ()
+  (interactive)
+  (setq current-candidate (1+ current-candidate))
+  (if (>= current-candidate number-of-candidates)
+      (setq current-candidate 0))
+  (mlh-select-insert-candidate current-candidate))
+
+(defun mlh-recursive-edit-select (beg end candidates)
+  (mlh-select-insert-candidate 0)
+  (and (boundp 'disable-undo) (setq disable-undo t))
+  (let ((old-local-map (current-local-map))
+       (number-of-candidates (length candidates))
+       (current-candidate 0))
+    (use-local-map mlh-select-mode-map)
+    (recursive-edit)
+    (use-local-map old-local-map)))
+
+(defun mlh-select-kakutei-and-self-insert ()
+  (interactive)
+  (setq unread-command-events (list last-command-event))
+  (mlh-select-kakutei))
+
+(defun mlh-select-kakutei ()
+  (interactive)
+  (and (boundp 'disable-undo) (setq disable-undo nil))
+  (exit-recursive-edit))
+\f
+(defun mlh-user-defined-conversion ()
+  (forward-char -1)
+  (skip-chars-backward "-a-zA-Z")
+  (mlh-backward-henkan)
+  (setq beg (point))
+  (goto-char end-marker)
+  (backward-delete-char 2)
+  (let* ((str (buffer-substring beg (point)))
+         (userdef (mlh-userdef<==string str)))
+    (cond ((stringp userdef)
+          (delete-region beg (point))
+          (insert userdef))
+         ((null userdef)
+          (delete-region beg (point))
+          ;; (add-userdef) (insert new-userdef)
+          (insert "?udef?"))
+         ((consp userdef)
+          (mlh-recursive-edit-select beg (point) userdef))))
+  (if (null henkan-begin)
+      (setq henkan-begin beg)))
+
+(defvar mlh-userdef-table nil
+  "Convertion table of words(string) to another words(string).")
+
+(defun mlh-userdef<==string (str)
+  "Convert string to another string with `mlh-userdef-table'"
+  (cdr (assoc str mlh-userdef-table)))
+\f
+(defvar mlh-kanji-function 'mlh-kanji-with-henkan-region-function)
+
+(defun mlh-kanji ()
+  (funcall mlh-kanji-function))
+
+(defun mlh-kanji-with-henkan-region-function ()
+  (skip-chars-backward "-a-z,.'N[]")
+  (mlh-backward-henkan)
+  (setq inhibit-henkan nil)
+  (setq beg (point))
+  (goto-char end-marker)
+  (forward-char -1)
+  (its-translate-region-internal beg (point))
+  (delete-region (point) end-marker)
+  (if (null henkan-begin)
+      (setq henkan-begin beg)))
+
+(defun mlh-hiragana ()
+  (forward-char -1)
+  (skip-chars-backward "-a-z,.'N[]")
+  (mlh-backward-henkan)
+  (setq beg (point))
+  (goto-char end-marker)
+  (forward-char -2)
+  (its-translate-region-internal beg (point))
+  (delete-region (point) end-marker)
+  (setq henkan-begin (point)))
+
+(defun mlh-hiragana-to-kanji ()
+  (forward-char -1)
+  (skip-chars-backward "\e$B$!\e(B-\e$B$s!<\e(B")
+  (mlh-backward-henkan)
+  (setq beg (point))
+  (setq inhibit-henkan nil)
+  (goto-char end-marker)
+  (backward-delete-char 2)
+  (if (null henkan-begin)
+      (setq henkan-begin beg)))
+
+(defun mlh-katakana ()
+  (forward-char -1)
+  (skip-chars-backward "-a-z,.'N[]")
+  (mlh-backward-henkan)
+  (setq beg (point))
+  (goto-char end-marker)
+  (forward-char -2)
+  (its-translate-region-internal beg (point))
+  (japanese-katakana-region beg (point))
+  (delete-region (point) end-marker)
+  (if (null henkan-begin)
+      (setq henkan-begin beg)))
+
+(defun mlh-zenkaku ()
+  (forward-char -1)
+  (skip-chars-backward "\041-\056\060-\176")
+  (mlh-backward-henkan)
+  (setq beg (point))
+  (goto-char end-marker)
+  (backward-delete-char 2)
+  (japanese-zenkaku-region beg (point))
+  (if (null henkan-begin)
+      (setq henkan-begin beg)))
+
+(defun mlh-hangul ()
+  (forward-char -1)
+  (skip-chars-backward "a-zEO-RTW,.[]")
+  (mlh-backward-henkan)
+  (setq beg (point))
+  (setq inhibit-henkan nil)
+  (goto-char end-marker)
+  (forward-char -2)
+  (let (its-current-map its-current-language)
+    (its-select-hangul nil t)
+    (its-translate-region-internal beg (point)))
+  (delete-region (point) end-marker)
+  (if (null henkan-begin)
+      (setq henkan-begin beg)))
+
+(defun mlh-zhongwen ()
+  (forward-char -1)
+  (skip-chars-backward "a-z0-4 ,.[]")
+  (mlh-backward-henkan)
+  (setq beg (point))
+  (setq inhibit-henkan nil)
+  (goto-char end-marker)
+  (forward-char -2)
+  (let (its-current-map its-current-language)
+    (its-select-pinyin-cn nil t)
+    (its-translate-region-internal beg (point)))
+  (delete-region (point) end-marker)
+  (if (null henkan-begin)
+      (setq henkan-begin beg)))
+
+(defun mlh-zhongwen-tw ()
+  (forward-char -1)
+  (skip-chars-backward "a-z0-4,.[]")
+  (mlh-backward-henkan)
+  (setq beg (point))
+  (setq inhibit-henkan nil)
+  (goto-char end-marker)
+  (forward-char -2)
+  (let (its-current-map its-current-language)
+    (its-select-pinyin-tw nil t)
+    (its-translate-region-internal beg (point)))
+  (delete-region (point) end-marker)
+  (if (null henkan-begin)
+      (setq henkan-begin beg)))
+
+(provide 'egg-mlh)
+;;; egg-mlh.el ends here.
diff --git a/egg.el b/egg.el
new file mode 100644 (file)
index 0000000..43465ba
--- /dev/null
+++ b/egg.el
@@ -0,0 +1,281 @@
+;;; egg.el --- EGG Input Method Architecture
+
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc
+
+;; Author: NIIBE Yutaka <gniibe@chroot.org>
+;;         KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'cl)
+(require 'egg-edep)
+
+(defgroup egg nil
+  "Tamagotchy --- EGG Versio 4.0")
+
+(defcustom egg-mode-preference t
+  "*Make Egg as modefull input method, if non-NIL."
+  :group 'egg :type 'boolean)
+
+(defvar egg-default-language)
+
+(defvar egg-last-method-name)
+(make-variable-buffer-local 'egg-last-method-name)
+(put 'egg-last-method-name 'permanent-local t)
+
+(defvar egg-current-keymap nil)
+(make-variable-buffer-local 'egg-current-keymap)
+(put 'egg-current-keymap 'permanent-local t)
+
+;;;###autoload
+(defun egg-mode (&rest arg)
+  "Toggle EGG  mode.
+\\[describe-bindings]
+"
+  (interactive "P")
+  (if (null arg)
+      ;; Turn off
+      (unwind-protect
+         (progn
+           (its-exit-mode)
+           (egg-exit-conversion))
+       (setq describe-current-input-method-function nil)
+       (if (eq (current-local-map) egg-current-keymap)
+           (use-local-map (keymap-parent (current-local-map))))
+       (remove-hook 'input-method-activate-hook 'its-set-mode-line-title t)
+       (force-mode-line-update))
+    ;; Turn on
+    (if (null (string= (car arg) egg-last-method-name))
+       (progn
+         (funcall (nth 1 arg))
+         (setq egg-default-language its-current-language)))
+    (egg-set-conversion-backend (nthcdr 2 arg))
+    (egg-set-conversion-backend
+     (list (assq its-current-language (nthcdr 2 arg))) t)
+    (setq egg-last-method-name (car arg))
+    (setq egg-current-keymap (if egg-mode-preference
+                                (egg-modefull-map)
+                              (egg-modeless-map)))
+    (use-local-map egg-current-keymap)
+    (setq inactivate-current-input-method-function 'egg-mode)
+    (setq describe-current-input-method-function 'egg-help)
+    (make-local-hook 'input-method-activate-hook)
+    (add-hook 'input-method-activate-hook 'its-set-mode-line-title nil t)
+    (if (eq (selected-window) (minibuffer-window))
+       (add-hook 'minibuffer-exit-hook 'egg-exit-from-minibuffer))
+    (run-hooks 'egg-mode-hook)))
+
+(defun egg-exit-from-minibuffer ()
+  (inactivate-input-method)
+  (if (<= (minibuffer-depth) 1)
+      (remove-hook 'minibuffer-exit-hook 'egg-exit-from-minibuffer)))
+
+(defun egg-modefull-map ()
+  "Generate modefull keymap for EGG mode."  
+  (let ((map (make-sparse-keymap))
+       (i 33))
+    (define-key map "\C-_" 'egg-jis-code-input)
+    (while (< i 127)
+      (define-key map (vector i) 'egg-self-insert-char)
+      (setq i (1+ i)))
+    (its-define-select-keys map)
+    (set-keymap-parent map (current-local-map))
+    map))
+
+(defun egg-modeless-map ()
+  "Generate modeless keymap for EGG mode."
+  (let ((map (make-sparse-keymap)))
+    (define-key map " " 'mlh-space-bar-backward-henkan)
+    (define-key map "\C-_" 'egg-jis-code-input)
+    (set-keymap-parent map (current-local-map))
+    map))
+
+(defvar egg-context nil)
+
+(defun egg-self-insert-char ()
+  (interactive)
+  (its-start last-command-char (and (eq last-command 'egg-use-context)
+                                   egg-context)))
+\f
+(defvar egg-mark-list nil)
+(defvar egg-suppress-marking nil)
+
+(defun egg-set-face (beg eng face &optional object)
+  (put face 'face face)
+  (add-text-properties beg eng
+                      (list 'category face
+                            'egg-face t
+                            'modification-hooks '(egg-mark-modification))
+                      object))
+
+(defun egg-mark-modification (beg end)
+  (if (and (null egg-suppress-marking)
+          (or (get-text-property beg 'egg-face)
+              (setq beg (next-single-property-change beg 'egg-face)))
+          (or (get-text-property (1- end) 'egg-face)
+              (setq end (previous-single-property-change end 'egg-face)))
+          (< beg end))
+      (let ((list egg-mark-list)
+           (found 0)
+           pair mb me b e)
+       (add-hook 'post-command-hook 'egg-redraw-face t)
+       (setq list egg-mark-list)
+       (while (and list (< found 2))
+         (setq pair (car list)
+               list (cdr list)
+               mb (car pair)
+               me (cdr pair)
+               b (marker-position mb)
+               e (marker-position me))
+         (cond
+          ;; no overwrapping -- SKIP
+          ((or (null (eq (marker-buffer mb) (current-buffer)))
+               (or (> beg e) (< end b))))
+          ;; completely included
+          ((and (>= beg b) (<= end e))
+           (setq found 3))
+          ;; partially overwrapping
+          (t
+           (set-marker mb nil)
+           (set-marker me nil)
+           (setq egg-mark-list (delete pair egg-mark-list)
+                 beg (min beg b)
+                 end (max end e)
+                 found (1+ found)))))
+       (if (< found 3)
+           (progn
+             (setq b (make-marker)
+                   e (make-marker)
+                   egg-mark-list (cons (cons b e) egg-mark-list))
+             (set-marker b beg)
+             (set-marker e end))))))
+
+(defun egg-redraw-face ()
+  (let ((inhibit-read-only t)
+       (inhibit-point-motion-hooks t)
+       (egg-suppress-marking t)
+       (list egg-mark-list)
+       (org-buffer (current-buffer))
+       (org-point (point))
+       mb me b e p)
+    (setq egg-mark-list nil)
+    (remove-hook 'post-command-hook 'egg-redraw-face)
+    (while list
+      (setq mb (car (car list))
+           me (cdr (car list))
+           list (cdr list))
+      (when (marker-buffer mb)
+       (set-buffer (marker-buffer mb))
+       (let ((before-change-functions nil) (after-change-functions nil))
+         (save-restriction
+           (widen)
+           (setq b (max mb (point-min))
+                 e (min me (point-max)))
+           (set-marker mb nil)
+           (set-marker me nil)
+           (while (< b e)
+             (if (null (get-text-property b 'egg-face))
+                 (setq b (next-single-property-change b 'egg-face nil e)))
+             (setq p (next-single-property-change b 'egg-face nil e))
+             (when (< b p)
+               (goto-char b)
+               (setq str (buffer-substring b p))
+               (delete-region b p)
+               (remove-text-properties 0 (- p b) '(face) str)
+               (insert str)
+               (setq b p)))))))
+    (set-buffer org-buffer)
+    (goto-char org-point)))
+\f
+(defvar egg-messages nil)
+(defvar egg-message-language-alist nil)
+
+(defun egg-get-message (message)
+  (let ((lang (or (cdr (assq egg-default-language egg-message-language-alist))
+                 egg-default-language)))
+    (or (nth 1 (assq message (cdr (assq lang egg-messages))))
+       (nth 1 (assq message (cdr (assq nil egg-messages))))
+       (error "EGG internal error: no such message: %s (%s)"
+              message egg-default-language))))
+
+(defun egg-add-message (list)
+  (let (l msg-l)
+    (while list
+      (setq l (car list))
+      (or (setq msg-l (assq (car l) egg-messages))
+         (setq egg-messages (cons (list (car l)) egg-messages)
+               msg-l (car egg-messages)))
+      (mapcar
+       (lambda (msg)
+        (setcdr msg-l (cons msg (delq (assq (car msg) msg-l) (cdr msg-l)))))
+       (cdr l))
+      (setq list (cdr list)))))
+
+(defun egg-set-message-language-alist (alist)
+  (let ((a alist))
+    (while a
+      (setq egg-message-language-alist
+           (delq (assq (caar a) egg-message-language-alist)
+                 egg-message-language-alist))
+      (setq a (cdr a)))
+    (setq egg-message-language-alist
+         (append alist egg-message-language-alist))))
+
+(put 'egg-error 'error-conditions '(error egg-error))
+(put 'egg-error 'error-message "EGG error")
+
+(defun egg-error (message &rest args)
+  (if (symbolp message)
+      (setq message (egg-get-message message)))
+  (signal 'egg-error (list (apply 'format message args))))
+\f
+;;;
+;;; auto fill controll
+;;;
+
+(defun egg-do-auto-fill ()
+  (if (and auto-fill-function (> (current-column) fill-column))
+      (let ((ocolumn (current-column)))
+       (funcall auto-fill-function)
+       (while (and (< fill-column (current-column))
+                   (< (current-column) ocolumn))
+         (setq ocolumn (current-column))
+         (funcall auto-fill-function)))))
+
+(eval-when (eval load)
+  (require 'its)
+  (require 'menudiag)
+  (require 'egg-mlh)
+  (require 'egg-cnv)
+  (require 'egg-com))
+
+(add-hook 'kill-emacs-hook 'egg-kill-emacs-function)
+(defun egg-kill-emacs-function ()
+  (egg-finalize-backend))
+
+(provide 'egg)
+
+;;; egg.el ends here
diff --git a/egg/canna.el b/egg/canna.el
new file mode 100644 (file)
index 0000000..78ded66
--- /dev/null
@@ -0,0 +1,286 @@
+;;; egg/canna.el --- Canna Support (high level interface) in
+;;;                  Egg Input Method Architecture
+
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc
+
+;; Author: NIIBE Yutaka <gniibe@chroot.org>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+
+(require 'egg-edep)
+
+(eval-when-compile
+  (defmacro CANNA-const (c)
+    (cond ((eq c 'FileNotExist) xxxxxxxxxxxxxx)
+         )))
+
+(defconst canna-conversion-backend
+  [ canna-init
+
+    canna-start-conversion
+      canna-get-bunsetsu-converted
+      canna-get-bunsetsu-source
+      canna-list-candidates
+          canna-get-number-of-candidates
+          canna-get-current-candidate-number
+          canna-get-all-candidates
+          canna-decide-candidate
+      canna-change-bunsetsu-length
+    canna-end-conversion
+    nil
+
+    canna-fini
+ ])
+
+(defconst canna-server-port 5680 "Port number of Canna server")
+(defvar canna-hostname "localhost"
+  "Hostname of Canna server")
+
+(defun canna-open (hostname)
+  "Establish the connection to CANNA server.  Return environment object."
+  (let* ((buf (generate-new-buffer " *CANNA*"))
+        (proc (open-network-stream "CANNA" buf hostname canna-server-port))
+        result)
+    (process-kill-without-query proc)
+    (set-process-coding-system proc 'no-conversion 'no-conversion)
+    (set-marker-insertion-type (process-mark proc) t)
+    (save-excursion
+      (set-buffer buf)
+      (erase-buffer)
+      (buffer-disable-undo)
+      (set-buffer-multibyte nil))
+    (setq result (cannarpc-open proc (user-login-name)))
+    (if (< result 0)
+       (let ((msg (cannarpc-get-error-message (- result))))
+         (delete-process proc)
+         (kill-buffer buf)
+         (error "Can't open CANNA session (%s): %s" hostname msg)))
+    (vector proc result)))
+
+;; XXX: Should support multiple outstanding context
+;; <env> ::= [ <proc> <context> ]
+(defvar canna-environment nil
+  "Environment for CANNA kana-kanji conversion")
+
+(defsubst cannaenv-get-proc (env)
+  (aref env 0))
+(defsubst cannaenv-get-context (env)
+  (aref env 1))
+
+;; <bunsetsu> ::=
+;;  [ <env> <converted> <bunsetsu-pos>
+;;    <source> <zenkouho-pos> <zenkouho> ]
+(defsubst canna-make-bunsetsu (env converted bunsetsu-pos)
+  (vector env converted bunsetsu-pos nil nil nil))
+
+(defsubst cannabunsetsu-get-env (b)
+  (aref b 0))
+(defsubst cannabunsetsu-get-converted (b)
+  (aref b 1))
+(defsubst cannabunsetsu-get-bunsetsu-pos (b)
+  (aref b 2))
+(defsubst cannabunsetsu-get-source (b)
+  (aref b 3))
+(defsubst cannabunsetsu-set-source (b s)
+  (aset b 3 s))
+(defsubst cannabunsetsu-get-zenkouho-pos (b)
+  (aref b 4))
+(defsubst cannabunsetsu-set-zenkouho-pos (b p)
+  (aset b 4 p))
+(defsubst cannabunsetsu-get-zenkouho (b)
+  (aref b 5))
+(defsubst cannabunsetsu-set-zenkouho (b z)
+  (aset b 5 z))
+
+(defun canna-get-bunsetsu-source (b)
+  (let ((s (cannabunsetsu-get-source b)))
+    (or s
+       (let* ((env (cannabunsetsu-get-env b))
+              (bp (cannabunsetsu-get-bunsetsu-pos b))
+              (s (cannarpc-get-bunsetsu-source env bp)))
+         (cannabunsetsu-set-source b s)))))
+
+(defun canna-get-bunsetsu-converted (b)
+  (cannabunsetsu-get-converted b))
+
+(defconst canna-dictionary-specification
+  '("iroha"
+    "fuzokugo"
+    "hojomwd"
+    "hojoswd"
+    "bushu"
+    "user"
+    )
+  "Dictionary specification of CANNA.")
+
+(defun canna-filename (p)
+  ""
+  (cond ((consp p) (concat (car p) "/" (user-login-name)))
+       (t p)))
+
+(defun canna-get-environment ()
+  "Return the backend of CANNA environment."
+  (if canna-environment
+      canna-environment
+    (let* ((env (canna-open canna-hostname))
+          (l canna-dictionary-specification)
+          dict-list)
+      (while l
+       (let ((dic (car l))
+             result)
+         (setq result
+               (canna-open-dictionary env (canna-filename dic)))
+         (if (= result 255)
+             (error "Damedamedame")            ; XXX
+           (setq l (cdr l)))))
+      (setq canna-environment env))))
+
+(defun canna-open-dictionary (env name)
+  (let ((trying t)
+       ret)
+    (while trying
+      (setq ret (cannarpc-open-dictionary env name 0)) ; XXX MODE=0
+      (if (= ret 0)
+         (setq trying nil)
+       (message "\e$B<-=q%U%!%$%k\e(B(%s)\e$B$,$"$j$^$;$s\e(B" name)
+       (setq ret (- ret))              ; Get error code.
+       (if (and (y-or-n-p
+                 (format "\e$B<-=q%U%!%$%k\e(B(%s)\e$B$,$"$j$^$;$s!#:n$j$^$9$+\e(B? "
+                         name))
+                (= (cannarpc-make-dictionary env name) 0))
+           (message "\e$B<-=q%U%!%$%k\e(B(%s)\e$B$r:n$j$^$7$?\e(B" name)
+         (error "Fatal"))))
+    ret))
+
+(defun canna-init ()
+  )
+
+(defun canna-start-conversion (yomi lang)
+  "Convert YOMI string to kanji, and enter conversion mode.
+Return the list of bunsetsu."
+  (if (eq lang 'Japanese)
+      (let ((env (canna-get-environment)))
+       (cannarpc-begin-conversion env yomi))
+    (signal 'lang-not-supported)))    
+
+(defun canna-end-conversion (bunsetsu-list abort)
+  (let* ((env (cannabunsetsu-get-env (car bunsetsu-list)))
+        (l bunsetsu-list)
+        (len (length bunsetsu-list))
+        (zenkouho-pos-vector (make-vector (* 2 len) 0))
+        (i 0)
+        (mode 1) ;XXX MODE=1 attru?
+        bunsetsu zenkouho-pos)
+    (if abort
+       (setq mode 0))
+    (while l
+      (setq bunsetsu (car l))
+      (setq l (cdr l))
+      (setq zenkouho-pos (cannabunsetsu-get-zenkouho-pos bunsetsu))
+      (if (null zenkouho-pos)
+         () ; XXX: NIL--> 0 atteru???
+       (aset zenkouho-pos-vector i 0)  ; XXX Don't support >=256
+       (aset zenkouho-pos-vector (1+ i) zenkouho-pos))
+      (setq i (+ i 2)))
+    (cannarpc-end-conversion env len zenkouho-pos-vector 0)))
+
+(defun canna-list-candidates (bunsetsu prev-bunsetsu)
+  (let* ((env (cannabunsetsu-get-env bunsetsu))
+        (bunsetsu-pos (cannabunsetsu-get-bunsetsu-pos bunsetsu))
+        (z (cannarpc-get-bunsetsu-candidates env bunsetsu-pos)))
+    (cannabunsetsu-set-zenkouho bunsetsu z)
+    (cannabunsetsu-set-zenkouho-pos bunsetsu 0)
+    0))
+
+(defun canna-get-number-of-candidates (bunsetsu)
+  (let ((l (cannabunsetsu-get-zenkouho bunsetsu)))
+    (if l
+       (length l)
+      nil)))
+
+(defun canna-decide-candidate (bunsetsu candidate-pos)
+  (let* ((candidate-list (cannabunsetsu-get-zenkouho bunsetsu))
+        (candidate (nth candidate-pos candidate-list)))
+    (cannabunsetsu-set-zenkouho candidate candidate-list)
+    (cannabunsetsu-set-zenkouho-pos candidate candidate-pos)
+    candidate))
+
+(defun canna-get-current-candidate-number (bunsetsu)
+  (cannabunsetsu-get-zenkouho-pos bunsetsu))
+
+(defun canna-get-all-candidates (bunsetsu)
+  (let* ((l (cannabunsetsu-get-zenkouho bunsetsu))
+        (result (cons nil nil))
+        (r result))
+    (catch 'break
+      (while t
+       (let ((candidate (car l)))
+         (setcar r (cannabunsetsu-get-converted candidate))
+         (if (null (setq l (cdr l)))
+             (throw 'break nil)
+           (setq r (setcdr r (cons nil nil)))))))
+    result))
+
+;;;;;;;;;;;;;;;;;;;;;;; MADAMADA zenzendame, just copy from SJ3
+(defun canna-change-bunsetsu-length (b0 b1 b2 len)
+  (let ((yomi (concat
+              (cannabunsetsu-get-source b1)
+              (if b2 (cannabunsetsu-get-source b2))))
+       (env (cannabunsetsu-get-env b1))
+       yomi1 yomi2
+       bunsetsu1 bunsetsu2)
+    (setq yomi1 (substring yomi 0 len)
+         yomi2 (substring yomi len))
+    (setq bunsetsu1
+         (cannarpc-tanbunsetsu-conversion env yomi1))
+    ;; Only set once (memory original length of the bunsetsu).
+    (cannabunsetsu-set-kugiri-changed bunsetsu1
+                                   (or (cannabunsetsu-get-kugiri-changed b1)
+                                       (length (cannabunsetsu-get-source b1))))
+    (if (< 0 (length yomi2))
+       (setq bunsetsu2 (cannarpc-tanbunsetsu-conversion env yomi2))
+      (setq bunsetsu2 nil))
+    (if bunsetsu2
+       (list bunsetsu1 bunsetsu2)
+      (list bunsetsu1))))
+
+;;;;;;;;;;;;;; MADAMADA
+(defun canna-fini ()
+)
+
+;;; setup
+(require 'egg)
+
+;;;###autoload
+(defun egg-activate-canna (&rest arg)
+  "Activate CANNA backend of Tamagotchy."
+  (setq egg-conversion-backend canna-conversion-backend)
+  (if (not (fboundp 'cannarpc-open))
+      (load-library "egg/canna"))
+  (apply 'egg-mode arg))
+
+;;; egg/canna.el ends here.
diff --git a/egg/cannarpc.el b/egg/cannarpc.el
new file mode 100644 (file)
index 0000000..8cd2aa0
--- /dev/null
@@ -0,0 +1,205 @@
+;;; egg/cannarpc.el --- Canna Support (low level interface) in
+;;;                     Egg Input Method Architecture
+
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc
+
+;; Author: NIIBE Yutaka <gniibe@chroot.org>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+
+;;; Code:
+
+
+
+(eval-when-compile
+  (require 'egg-com)
+;;  (load-library "egg/canna")
+  (defmacro canna-const (c)
+    (cond ((eq c 'Initialize)            1)
+         ((eq c 'Finalize)              2)
+         ((eq c 'CreateContext)         3)
+         ((eq c 'CloseContext)          5)
+         ((eq c 'GetDictionaryList)     6)
+         ((eq c 'GetDirectoryList)      7)
+         ((eq c 'MountDictionary)       8)
+         ((eq c 'UnmountDictionary)       9)
+         ((eq c 'BeginConvert)         15)
+         ((eq c 'EndConvert)           16)
+         ((eq c 'GetCandidacyList)     17)
+         ((eq c 'GetYomi)              18)
+         ((eq c 'ResizePause)          26)
+
+         ((eq c 'CreateDictionary)      3)
+         (t (error "No such constant")))))
+
+(defun cannarpc-get-error-message (errno)
+  (or (aref cannarpc-error-message errno) (format "#%d" errno)))
+
+(defmacro cannarpc-call-with-environment (e vlist send-expr &rest receive-exprs)
+  (let ((v (append
+           `((proc (cannaenv-get-proc ,e))
+             (context (cannaenv-get-context ,e)))
+           vlist)))
+    (list
+     'let v
+     (append
+       `(save-excursion
+          (set-buffer (process-buffer proc))
+          (erase-buffer)
+          ,send-expr
+          (process-send-region proc (point-min) (point-max))
+          (goto-char (prog1 (point) (accept-process-output proc))))
+       receive-exprs))))
+\f
+(defconst canna-version-fmt "2.0:%s")
+
+(defun cannarpc-open (proc username)
+  "Open the session.  Return 0 on success, error code on failure."
+  (let ((verusr (format canna-version-fmt username)))
+    (comm-call-with-proc proc (result)
+      (comm-format (u u v) (canna-const Initialize) (length verusr) verusr)
+      (comm-unpack (u) result)
+      result)))
+
+(defun cannarpc-close (proc)
+  (comm-call-with-proc proc (dummy result)
+    (comm-format (b b w) (canna-const Finalize) 0 0)
+    (comm-unpack (b b w b) dummy dummy dummy result)
+    result))
+
+(defun cannarpc-create-context (proc)
+  (comm-call-with-proc proc (dummy result)
+    (comm-format (b b w) (canna-const CreateContext) 0 0)
+    (comm-unpack (b b w w) dummy dummy dummy result)
+    result))
+
+(defun cannarpc-close-context (proc context)
+  (comm-call-with-proc proc (dummy result)
+    (comm-format (b b w w) (canna-const CloseContext) 0 2 context)
+    (comm-unpack (b b w b) dummy dummy dummy result)
+    result))
+
+;; XXX: Not implemented fully
+(defun cannarpc-get-dictionary-list (env)
+  (cannarpc-call-with-environment env (dymmy result)
+    (comm-format (b b w w w) (canna-const GetDictionaryList) 0 4
+                context 1024)
+    (comm-unpack (u w) dummy result)
+    ;; follow list of dictionaries
+    result))
+
+;; XXX: Not implemented fully
+(defun cannarpc-get-directory-list (env)
+  (cannarpc-call-with-environment env (dymmy result)
+    (comm-format (b b w w w) (canna-const GetDirectoryList) 0 4
+                context 1024)
+    (comm-unpack (u w) dummy result)
+    ;; follow list of directories
+    result))
+
+(defun cannarpc-open-dictionary (env dict-file-name mode)
+  (cannarpc-call-with-environment env (dymmy result)
+    (comm-format (b b w u w s) (canna-const MountDictionary) 0
+                (+ (length dict-file-name) 7)
+                mode context dict-file-name)
+    (comm-unpack (u b) dummy result)
+    result))
+
+(defun cannarpc-close-dictionary (env dict-file-name mode)
+  (cannarpc-call-with-environment env (dymmy result)
+    (comm-format (b b w u w s) (canna-const UnmountDictionary) 0
+                (+ (length dict-file-name) 6)
+                mode context dict-file-name)
+    (comm-unpack (u b) dummy result)
+    result))
+
+(defun cannarpc-begin-conversion (env yomi)
+  "Begin conversion."
+  (let ((yomi-ext (encode-coding-string yomi 'euc-japan))
+       (i 0)
+       converted bunsetsu-list bl)
+    (cannarpc-call-with-environment env (dummy result)
+      (comm-format (b b w u w S) (canna-const BeginConvert) 0
+                  (+ (length yomi-ext) 8) 0 context yomi)
+      (comm-unpack (u w) dummy result)
+      (if (= result 65535)
+         -1                            ; failure
+       (while (< i result)
+         (comm-unpack (S) converted)
+         (let ((bl1 (cons (canna-make-bunsetsu env converted i)
+                          nil)))
+           (if bl
+               (setq bl (setcdr bl bl1))
+             (setq bunsetsu-list (setq bl bl1))))
+         (setq i (1+ i)))
+       bunsetsu-list))))
+
+(defun cannarpc-end-conversion (env len zenkouho-pos-vector mode)
+  "End conversion."
+  (cannarpc-call-with-environment env (dummy result)
+    (comm-format (b b w w w u v) (canna-const EndConvert) 0
+                (+ (* len 2) 8) context len mode zenkouho-pos-vector)
+    (comm-unpack (u b) dummy result)
+    (if (= result 255)
+       -1                              ; failure
+      result)))
+
+(defun cannarpc-make-dictionary (env dict-name)
+  (cannarpc-call-with-environment env (dummy result)
+    (comm-format (b b w u w s) (canna-const CreateDictionary) 1
+                (+ (length dict-name) 7) 0 context dict-name)
+    (comm-unpack (u b) dummy result)
+    result))
+
+(defun cannarpc-get-bunsetsu-source (env bunsetsu-pos)
+  (cannarpc-call-with-environment env (dummy result)
+    (comm-format (b b w w w w) (canna-const GetYomi) 0 6 context
+                bunsetsu-pos 1024)
+    (comm-unpack (u w) dummy result)
+    (if (= result 65535)
+       -1
+      (comm-unpack (S) result)
+      result)))
+
+(defun cannarpc-get-bunsetsu-candidates (env bunsetsu-pos)
+  (let ((i 0)
+       converted bunsetsu-list bl)
+    (cannarpc-call-with-environment env (dummy result)
+      (comm-format (b b w w w w) (canna-const GetCandidacyList) 0 6 context
+                  bunsetsu-pos 1024)
+      (comm-unpack (u w) dymmy result)
+      (if (= result 65535)
+         -1                            ; failure
+       (while (< i result)
+         (comm-unpack (S) converted)
+         (let ((bl1 (cons (canna-make-bunsetsu env converted bunsetsu-pos)
+                          nil)))
+           (if bl
+               (setq bl (setcdr bl bl1))
+             (setq bunsetsu-list (setq bl bl1))))
+         (setq i (1+ i)))
+       bunsetsu-list))))
+
+;;; egg/cannarpc.el ends here.
diff --git a/egg/sj3.el b/egg/sj3.el
new file mode 100644 (file)
index 0000000..d1d1f56
--- /dev/null
@@ -0,0 +1,372 @@
+;;; egg/sj3.el --- SJ3 Support (high level interface) in Egg
+;;;                Input Method Architecture
+
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc
+
+;; Author: NIIBE Yutaka <gniibe@chroot.org>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+
+;;; Code:
+
+
+(require 'egg-edep)
+
+(eval-when-compile
+  (defmacro SJ3-const (c)
+    (cond ((eq c 'FileNotExist) 35)
+         )))
+
+(setplist 'sj3-conversion-backend
+         '(egg-start-conversion          sj3-start-conversion
+           egg-get-bunsetsu-source       sj3-get-bunsetsu-source
+           egg-get-bunsetsu-converted    sj3-get-bunsetsu-converted
+           egg-get-source-language       sj3-get-source-language
+           egg-get-converted-language    sj3-get-converted-language
+           egg-list-candidates           sj3-list-candidates
+           egg-decide-candidate          sj3-decide-candidate
+           egg-change-bunsetsu-length    sj3-change-bunsetsu-length
+           egg-end-conversion            sj3-end-conversion))
+
+(defconst sj3-backend-alist '((Japanese ((sj3-conversion-backend)))))
+
+(egg-set-finalize-backend '(sj3-finalize-backend))
+
+(defvar sj3-server-port 3086 "Port number of SJ3 server")
+(defvar sj3-stdy-size 0 "STDYSIZE of SJ3 server")
+(defvar sj3-hostname "localhost"
+  "Hostname of SJ3 server")
+
+(defvar sj3-open-message)
+
+(defun sj3-open (hostname)
+  "Establish the connection to SJ3 server.  Return process object."
+  (let* ((buf (generate-new-buffer " *SJ3*"))
+        proc result)
+    (condition-case err
+       (setq proc (open-network-stream "SJ3" buf hostname sj3-server-port))
+      ((error quit)
+       (egg-error "failed to connect sj3 server")))
+    (process-kill-without-query proc)
+    (set-process-coding-system proc 'no-conversion 'no-conversion)
+    (set-marker-insertion-type (process-mark proc) t)
+    (save-excursion
+      (set-buffer buf)
+      (erase-buffer)
+      (buffer-disable-undo)
+      (set-buffer-multibyte nil))
+    ;; Initialize dictionaries
+    (setq sj3-sys-dict-list nil)
+    (setq sj3-user-dict-list nil)
+    (setq result (sj3rpc-open proc (system-name) (user-login-name)))
+    (if (< result 0)
+       (let ((msg (sj3rpc-get-error-message (- result))))
+         (delete-process proc)
+         (kill-buffer buf)
+         (egg-error "Can't open SJ3 session (%s): %s" hostname msg)))
+    (setq result (sj3rpc-get-stdy-size proc))
+    (if (< result 0)
+       (let ((msg (sj3rpc-get-error-message (- result))))
+         (delete-process proc)
+         (kill-buffer buf)
+         (egg-error "Can't get SJ3 STDYSIZE: %s"msg)))
+    (setq sj3-stdy-size result)
+    proc))
+
+;; (defun sj3-open (hostname-list)
+;;   "Establish the connection to SJ3 server.  Return process object."
+;;   (let* ((buf (generate-new-buffer " *SJ3*"))
+;;      (msg-form "SJ3: connecting to sj3serv at %s...")
+;;      hostname proc result msg)
+;;     (save-excursion
+;;       (set-buffer buf)
+;;       (erase-buffer)
+;;       (buffer-disable-undo)
+;;       (setq enable-multibyte-characters nil))
+;;     (cond
+;;      ((null hostname-list)
+;;       (setq hostname-list '("localhost")))
+;;      ((null (listp hostname-list))
+;;       (setq hostname-list (list hostname-list))))
+;;     (while (and hostname-list (null proc))
+;;       (setq hostname (car hostname-list)
+;;         hostname-list (cdr hostname-list))
+;;       (message msg-form hostname)
+;;       (sit-for 0)
+;;       (condition-case result
+;;       (setq proc (open-network-stream "SJ3" buf hostname sj3-server-port))
+;;     (error nil))
+;;       (if proc
+;;       (progn
+;;         (process-kill-without-query proc)
+;;         (set-process-coding-system proc 'no-conversion 'no-conversion)
+;;         (set-marker-insertion-type (process-mark proc) t)
+;;         ;; Initialize dictionaries
+;;         (setq sj3-sys-dict-list nil)
+;;         (setq sj3-user-dict-list nil)
+;;         (setq result (sj3rpc-open proc (system-name) (user-login-name)))
+;;         (if (< result 0)
+;;             (progn
+;;               (delete-process proc)
+;;               (setq proc nil
+;;                     msg (format "Can't open SJ3 session (%s): %s"
+;;                                 hostname msg)))
+;;           (setq result (sj3rpc-get-stdy-size proc))
+;;           (if (< result 0)
+;;               (progn
+;;                 (delete-process proc)
+;;                 (setq proc nil
+;;                       msg (format "Can't get SJ3 STDYSIZE: %s"
+;;                                   (sj3rpc-get-error-message (- result)))))
+;;             (setq sj3-stdy-size result))))))
+;;     (if proc
+;;     (progn
+;;       (setq sj3-open-message (format (concat msg-form "done") hostname))
+;;       proc)
+;;       (kill-buffer buf)
+;;       (error "%s" (or msg "no sj3serv available")))))
+
+;; <env> ::= [ <proc> <dictionary-list> ]
+(defvar sj3-environment nil
+  "Environment for SJ3 kana-kanji conversion")
+
+(defsubst sj3env-get-proc (env)
+  (aref env 0))
+(defsubst sj3env-get-dictionary-list (env)
+  (aref env 1))
+
+;; <sj3-bunsetsu> ::=
+;;  [ <env> <source> <converted> <rest> <stdy>
+;;    <zenkouho> <zenkouho-pos> <zenkouho-converted>
+;;    <kugiri-changed> ]
+(defsubst sj3-make-bunsetsu (env source converted rest stdy)
+  (egg-bunsetsu-create
+   'sj3-conversion-backend
+   (vector env source converted rest stdy nil nil nil nil nil)))
+
+(defsubst sj3bunsetsu-get-env (b)
+  (aref (egg-bunsetsu-get-info b) 0))
+(defsubst sj3bunsetsu-get-source (b)
+  (aref (egg-bunsetsu-get-info b) 1))
+(defsubst sj3bunsetsu-get-converted (b)
+  (aref (egg-bunsetsu-get-info b) 2))
+(defsubst sj3bunsetsu-get-rest (b)
+  (aref (egg-bunsetsu-get-info b) 3))
+(defsubst sj3bunsetsu-get-stdy (b)
+  (aref (egg-bunsetsu-get-info b) 4))
+
+(defsubst sj3bunsetsu-get-zenkouho (b)
+  (aref (egg-bunsetsu-get-info b) 5))
+(defsubst sj3bunsetsu-set-zenkouho (b z)
+  (aset (egg-bunsetsu-get-info b) 5 z))
+
+(defsubst sj3bunsetsu-get-zenkouho-pos (b)
+  (aref (egg-bunsetsu-get-info b) 6))
+(defsubst sj3bunsetsu-set-zenkouho-pos (b zp)
+  (aset (egg-bunsetsu-get-info b) 6 zp))
+
+(defsubst sj3bunsetsu-get-zenkouho-converted (b)
+  (aref (egg-bunsetsu-get-info b) 7))
+(defsubst sj3bunsetsu-set-zenkouho-converted (b zc)
+  (aset (egg-bunsetsu-get-info b) 7 zc))
+
+(defsubst sj3bunsetsu-get-kugiri-changed (b)
+  (aref (egg-bunsetsu-get-info b) 8))
+(defsubst sj3bunsetsu-set-kugiri-changed (b s)
+  (aset (egg-bunsetsu-get-info b) 8 s))
+
+(defun sj3-get-bunsetsu-source (b)
+  (sj3bunsetsu-get-source b))
+
+(defun sj3-get-bunsetsu-converted (b)
+  (concat (sj3bunsetsu-get-converted b) (sj3bunsetsu-get-rest b)))
+
+(defun sj3-get-source-language (b) 'Japanese)
+(defun sj3-get-converted-language (b) 'Japanese)
+(defun sj3-get-bunsetsu-stdy (b) (sj3bunsetsu-get-stdy b))
+
+(defvar sj3-dictionary-specification
+  '(("study.dat")
+    ["sj3main.dic" ""]
+    [("private.dic") ""])
+  "Dictionary specification of SJ3.")
+
+(defvar sj3-usr-dic-dir (concat "user/" (user-login-name))
+  "*Directory of user dictionary for SJ3.")
+
+(defun sj3-filename (p)
+  ""
+  (cond ((consp p) (concat sj3-usr-dic-dir "/" (car p)))
+       (t p)))
+
+(defun sj3-get-environment ()
+  "Return the backend of SJ3 environment."
+  (if sj3-environment
+      sj3-environment
+    (let* ((proc (sj3-open sj3-hostname))
+          (freq-info-name (sj3-filename (car sj3-dictionary-specification)))
+          (l (cdr sj3-dictionary-specification))
+          dict-list)
+      (sj3-open-freq-info proc freq-info-name)
+      (while l
+       (let ((dic (car l))
+             dic-id)
+         (setq dic-id
+               (sj3-open-dictionary proc (sj3-filename (aref dic 0))
+                                    (aref dic 1)))
+         (if (< dic-id 0)
+             (egg-error "Dame2")       ; XXX
+           (setq dict-list (cons dic-id dict-list)
+                 l (cdr l)))))
+      (setq sj3-environment (vector proc dict-list)))))
+
+(defun sj3-open-freq-info (proc name)
+  (let ((trying t)
+       ret)
+    (while trying
+      (setq ret (sj3rpc-open-stdy proc name))
+      (if (= ret 0)
+         (setq trying nil)
+       (message "\e$B3X=,%U%!%$%k\e(B(%s)\e$B$,$"$j$^$;$s\e(B" name)
+       (if (/= ret (SJ3-const FileNotExist))
+           (egg-error "Fatal1")        ; XXX
+         (if (and (y-or-n-p
+                   (format "\e$B3X=,%U%!%$%k\e(B(%s)\e$B$,$"$j$^$;$s!#:n$j$^$9$+\e(B? "
+                           name))
+                  (sj3rpc-make-directory proc
+                                         (file-name-directory name))
+                  ;; ignore error
+                  (= (sj3rpc-make-stdy proc name) 0))
+             (message "\e$B3X=,%U%!%$%k\e(B(%s)\e$B$r:n$j$^$7$?\e(B" name)
+           (egg-error "Fatal2")))))))  ; XXX
+
+(defun sj3-open-dictionary (proc name passwd)
+  (let ((trying t)
+       ret)
+    (while trying
+      (setq ret (sj3rpc-open-dictionary proc name passwd))
+      (if (>= ret 0)
+         (setq trying nil)
+       (message "\e$B<-=q%U%!%$%k\e(B(%s)\e$B$,$"$j$^$;$s\e(B" name)
+       (setq ret (- ret))              ; Get error code.
+       (if (/= ret (SJ3-const FileNotExist))
+           (egg-error "Fatal3 %d" ret) ; XXX
+         (if (and (y-or-n-p
+                   (format "\e$B<-=q%U%!%$%k\e(B(%s)\e$B$,$"$j$^$;$s!#:n$j$^$9$+\e(B? "
+                           name))
+                  (= (sj3rpc-make-dictionary proc name) 0))
+             (message "\e$B<-=q%U%!%$%k\e(B(%s)\e$B$r:n$j$^$7$?\e(B" name)
+           (egg-error "Fatal4")))))    ; XXX
+    ret))
+
+(defun sj3-start-conversion (backend yomi &optional context)
+  "Convert YOMI string to kanji, and enter conversion mode.
+Return the list of bunsetsu."
+  (let ((env (sj3-get-environment)))
+    (sj3rpc-begin env yomi)))
+
+(defun sj3-end-conversion (bunsetsu-list abort)
+  (if abort
+      ()
+    (let ((env (sj3bunsetsu-get-env (car bunsetsu-list)))
+         (l bunsetsu-list)
+         bunsetsu stdy kugiri-changed)
+      (while l
+       (setq bunsetsu (car l))
+       (setq l (cdr l))
+       (setq stdy (sj3bunsetsu-get-stdy bunsetsu))
+       (if stdy
+           (sj3rpc-bunsetsu-stdy env stdy))
+       (if (setq kugiri-changed (sj3bunsetsu-get-kugiri-changed bunsetsu))
+           (let ((yomi1 (sj3bunsetsu-get-source bunsetsu))
+                 (yomi2 (sj3bunsetsu-get-source (car l))))
+             (if (/= kugiri-changed (length yomi1))
+                 (sj3rpc-kugiri-stdy env yomi1 yomi2
+                                     (sj3bunsetsu-get-stdy (car l))))))))))
+
+(defun sj3-list-candidates (bunsetsu prev-bunsetsu next-bunsetsu major)
+  (setq bunsetsu (car bunsetsu))
+  (if (sj3bunsetsu-get-zenkouho bunsetsu)
+      (cons (sj3bunsetsu-get-zenkouho-pos bunsetsu)
+           (sj3bunsetsu-get-zenkouho-converted bunsetsu))
+    (let* ((env (sj3bunsetsu-get-env bunsetsu))
+          (yomi (sj3bunsetsu-get-source bunsetsu))
+          (z (sj3rpc-get-bunsetsu-candidates env yomi)))
+      (sj3bunsetsu-set-zenkouho bunsetsu z)
+      (cons (sj3bunsetsu-set-zenkouho-pos bunsetsu 0)
+           (sj3bunsetsu-set-zenkouho-converted
+            bunsetsu
+            (mapcar 'sj3bunsetsu-get-converted z))))))
+
+(defun sj3-decide-candidate (bunsetsu candidate-pos prev-b next-b)
+  (setq bunsetsu (car bunsetsu))
+  (let* ((candidate-list (sj3bunsetsu-get-zenkouho bunsetsu))
+        (candidate (nth candidate-pos candidate-list)))
+    (sj3bunsetsu-set-zenkouho candidate candidate-list)
+    (sj3bunsetsu-set-zenkouho-pos candidate candidate-pos)
+    (sj3bunsetsu-set-zenkouho-converted
+     candidate (sj3bunsetsu-get-zenkouho-converted bunsetsu))
+    (list (list candidate))))
+
+(defun sj3-change-bunsetsu-length (bunsetsu prev-b next-b len major)
+  (let ((yomi (apply 'concat (mapcar 'sj3bunsetsu-get-source bunsetsu)))
+       (env (sj3bunsetsu-get-env (car bunsetsu)))
+       (old (car bunsetsu))
+       new yomi1 yomi2)
+    (setq yomi1 (substring yomi 0 len)
+         yomi2 (substring yomi len))
+    (setq new (sj3rpc-tanbunsetsu-conversion env yomi1))
+    ;; Only set once (memory original length of the bunsetsu).
+    (sj3bunsetsu-set-kugiri-changed new 
+                                   (or (sj3bunsetsu-get-kugiri-changed old)
+                                       (length (sj3bunsetsu-get-source old))))
+    (if (> (length yomi2) 0)
+       (list (list new (sj3rpc-tanbunsetsu-conversion env yomi2)))
+      (list (list new)))))
+
+(defun sj3-finalize-backend ()
+  (if sj3-environment
+      (let ((proc (sj3env-get-proc sj3-environment))
+           (dict-list (sj3env-get-dictionary-list sj3-environment))
+           dict)
+       (while dict-list
+         (setq dict (car dict-list))
+         (setq dict-list (cdr dict-list))
+         (sj3rpc-close-dictionary proc dict)) ; XXX: check error
+       (sj3rpc-close-stdy proc)
+       (sj3rpc-close proc)
+       (setq sj3-environment nil))))
+
+;;; setup
+
+(load "egg/sj3rpc")
+(run-hooks 'sj3-load-hook)
+
+;;;###autoload
+(defun egg-activate-sj3 (&rest arg)
+  "Activate SJ3 backend of Tamagotchy."
+  (apply 'egg-mode (append arg sj3-backend-alist)))
+
+;;; egg/sj3.el ends here.
diff --git a/egg/sj3rpc.el b/egg/sj3rpc.el
new file mode 100644 (file)
index 0000000..f3ad8b2
--- /dev/null
@@ -0,0 +1,292 @@
+;;; egg/sj3rpc.el --- SJ3 Support (low level interface) in Egg
+;;;                   Input Method Architecture
+
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc
+
+;; Author: NIIBE Yutaka <gniibe@chroot.org>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+
+;;; Code:
+
+
+
+;; Only support SJ3 version 2.
+
+(eval-when-compile
+  (require 'egg-com)
+;;  (load-library "egg/sj3")
+  (defmacro sj3-const (c)
+    (cond ((eq c 'OPEN)            1)
+         ((eq c 'CLOSE)           2)
+         ((eq c 'DICADD)         11)
+         ((eq c 'DICDEL)         12)
+         ((eq c 'OPENSTDY)       21)
+         ((eq c 'CLOSESTDY)      22)
+         ((eq c 'STDYSIZE)       23)
+         ((eq c 'LOCK)           31)
+         ((eq c 'UNLOCK)         32)
+         ((eq c 'BEGIN)          41)
+         ((eq c 'BEGIN_EUC)     111)
+         ((eq c 'TANCONV)        51)
+         ((eq c 'TANCONV_EUC)   112)
+         ((eq c 'KOUHO)          54)
+         ((eq c 'KOUHO_EUC)     115)
+         ((eq c 'KOUHOSU)        55)
+         ((eq c 'KOUHOSU_EUC)   116)
+         ((eq c 'STDY)           61)
+         ((eq c 'CLSTDY)         62)
+         ((eq c 'CLSTDY_EUC)    117)
+         ((eq c 'WREG)           71)
+         ((eq c 'WREG_EUC)      118)
+         ((eq c 'WDEL)           72)
+         ((eq c 'WDEL_EUC)      119)
+         ((eq c 'MKDIC)          81)
+         ((eq c 'MKSTDY)         82)
+         ((eq c 'MKDIR)          83)
+         ((eq c 'ACCESS)         84)
+         ((eq c 'WSCH)           91)
+         ((eq c 'WSCH_EUC)      120)
+         ((eq c 'WNSCH)          92)
+         ((eq c 'WNSCH_EUC)     121)
+         ((eq c 'VERSION)       103)
+         (t (error "No such constant")))))
+
+;; XXX
+(defconst sj3rpc-error-message (vector ))
+
+(defun sj3rpc-get-error-message (errno)
+  (or (and (>= errno 0)
+          (< errno (length sj3rpc-error-message))
+          (aref sj3rpc-error-message errno))
+      (format "#%d" errno)))
+
+(defmacro sj3rpc-call-with-environment (e vlist send-expr &rest receive-exprs)
+  (let ((v (append
+           `((proc (sj3env-get-proc ,e)))
+           vlist)))
+    (list
+     'let v
+     (append
+       `(save-excursion
+          (set-buffer (process-buffer proc))
+          (erase-buffer)
+          ,send-expr
+          (process-send-region proc (point-min) (point-max))
+          (goto-char (prog1 (point) (accept-process-output proc))))
+       receive-exprs))))
+\f
+(defun sj3rpc-open (proc myhostname username)
+  "Open the session.  Return 0 on success, error code on failure."
+  (comm-call-with-proc proc (result)
+    (comm-format (u u s s s) (sj3-const OPEN) 2 ; Server version
+                myhostname username
+                ;; program name
+                (format "%d.emacs-egg" (emacs-pid)))
+    (comm-unpack (u) result)
+    (if (= result -2)
+       0
+      result)))
+
+(defun sj3rpc-close (proc)
+  (comm-call-with-proc proc (result)
+    (comm-format (u) (sj3-const CLOSE))
+    (comm-unpack (u) result)
+    result))
+
+(defun sj3rpc-get-stdy-size (proc)
+  "Return STDYSIZE of SJ3 server.  On failure, return error code."
+  (comm-call-with-proc proc (result)
+    (comm-format (u) (sj3-const STDYSIZE))
+    (comm-unpack (u) result)
+    (if (/= result 0)
+       (- result)                      ; failure
+      (comm-unpack (u) result)
+      result)))
+
+(defsubst sj3rpc-get-stdy (proc)
+  (let ((n 0)
+       (stdy (make-vector sj3-stdy-size 0)))
+    (while (< n sj3-stdy-size)
+      (comm-unpack (b) r)
+      (aset stdy n r)
+      (setq n (1+ n)))
+    stdy))
+
+(defun sj3rpc-begin (env yomi)
+  "Begin conversion."
+  (let ((yomi-ext (encode-coding-string yomi 'euc-japan))
+       (p 0)
+       len source converted stdy bunsetsu-list bl)
+    (sj3rpc-call-with-environment env (result)
+      (comm-format (u s) (sj3-const BEGIN_EUC) yomi-ext)
+      (comm-unpack (u) result)
+      (if (/= result 0)
+         (- result)                    ; failure
+       (comm-unpack (u) result)        ; skip
+       (while (progn
+                (comm-unpack (b) len)
+                (> len 0))
+         (setq stdy (sj3rpc-get-stdy proc))
+         (comm-unpack (E) converted)
+         (setq source
+               (decode-coding-string (substring yomi-ext p (+ p len))
+                                     'euc-japan)
+               p (+ p len))
+         (let ((bl1 (cons (sj3-make-bunsetsu env
+                                             source converted nil stdy) nil)))
+           (if bl
+               (setq bl (setcdr bl bl1))
+             (setq bunsetsu-list (setq bl bl1)))))
+       bunsetsu-list))))
+
+(defun sj3rpc-open-dictionary (proc dict-file-name password)
+  (comm-call-with-proc proc (result)
+    (comm-format (u s s) (sj3-const DICADD) dict-file-name password)
+    (comm-unpack (u) result)
+    (if (/= result 0)
+       (- result)                      ; failure
+      (comm-unpack (u) result)
+      result)))
+
+(defun sj3rpc-close-dictionary (proc dict-no)
+  (comm-call-with-proc proc (result)
+    (comm-format (u u) (sj3-const DICDEL) dict-no)
+    (comm-unpack (u) result)
+    result))
+
+(defun sj3rpc-make-dictionary (proc dict-name)
+  (comm-call-with-proc proc (result)
+    (comm-format (u s u u u) (sj3-const MKDIC) dict-name
+                2048  ; Index length
+                2048  ; Length
+                256   ; Number
+                )
+    (comm-unpack (u) result)
+    result))
+
+(defun sj3rpc-open-stdy (proc stdy-name)
+  (comm-call-with-proc proc (result)
+    (comm-format (u s s) (sj3-const OPENSTDY) stdy-name "")
+    (comm-unpack (u) result)
+    result))
+
+(defun sj3rpc-close-stdy (proc)
+  (comm-call-with-proc proc (result)
+    (comm-format (u) (sj3-const CLOSESTDY))
+    (comm-unpack (u) result)
+    result))
+
+(defun sj3rpc-make-stdy (proc stdy-name)
+  (comm-call-with-proc proc (result)
+    (comm-format (u s u u u) (sj3-const MKSTDY) stdy-name
+                2048  ; Number
+                1     ; Step
+                2048  ; Length
+                )
+    (comm-unpack (u) result)
+    result))
+
+(defun sj3rpc-make-directory (proc name)
+  (comm-call-with-proc proc (result)
+    (comm-format (u s) (sj3-const MKDIR) name)
+    (comm-unpack (u) result)
+    result))
+
+(defun sj3rpc-get-bunsetsu-candidates-sub (proc env yomi yomi-ext len n)
+  (let ((i 0)
+       stdy converted bunsetsu bl bunsetsu-list cylen rest)
+    (comm-call-with-proc-1 proc (result)
+      (comm-format (u u s) (sj3-const KOUHO_EUC) len yomi-ext)
+      (comm-unpack (u) result)
+      (if (/= result 0)
+         (- result)                    ; failure
+       (while (< i n)
+         (comm-unpack (u) cylen)
+         (setq stdy (sj3rpc-get-stdy proc))
+         (comm-unpack (E) converted)
+         (setq rest (decode-coding-string
+                     (substring yomi-ext cylen) 'euc-japan))
+         (setq bunsetsu (sj3-make-bunsetsu env yomi converted rest stdy))
+         (if bl
+             (setq bl (setcdr bl (cons bunsetsu nil)))
+           (setq bunsetsu-list (setq bl (cons bunsetsu nil))))
+         (setq i (1+ i)))
+       (setq bunsetsu (sj3-make-bunsetsu env yomi yomi nil nil))
+       (setq bl (setcdr bl (cons bunsetsu nil)))
+       (setq bunsetsu
+             (sj3-make-bunsetsu env yomi (japanese-katakana yomi) nil nil))
+       (setq bl (setcdr bl (cons bunsetsu nil)))
+       bunsetsu-list))))
+
+(defun sj3rpc-get-bunsetsu-candidates (env yomi)
+  (let* ((yomi-ext (encode-coding-string yomi 'euc-japan))
+        (len (length yomi-ext)))
+    (sj3rpc-call-with-environment env (result)
+      (comm-format (u u s) (sj3-const KOUHOSU_EUC) len yomi-ext)
+      (comm-unpack (u) result)
+      (if (/= result 0)
+         (- result)                    ; failure
+       (comm-unpack (u) result)
+       (if (= result 0)
+           (list (sj3-make-bunsetsu env yomi yomi nil nil)) ; XXX
+         (sj3rpc-get-bunsetsu-candidates-sub proc env
+                                             yomi yomi-ext len result))))))
+
+(defun sj3rpc-tanbunsetsu-conversion (env yomi)
+  (let* ((yomi-ext (encode-coding-string yomi 'euc-japan))
+        (len (length yomi-ext)) cylen stdy converted rest)
+    (sj3rpc-call-with-environment env (result)
+      (comm-format (u u s) (sj3-const TANCONV_EUC) len yomi-ext)
+      (comm-unpack (u) result)
+      (if (/= result 0)
+         (- result)
+       (comm-unpack (u) cylen)
+       (setq stdy (sj3rpc-get-stdy proc))
+       (comm-unpack (E) converted)
+       (setq rest (decode-coding-string
+                   (substring yomi-ext cylen) 'euc-japan))
+       (setq bunsetsu (sj3-make-bunsetsu env yomi converted rest stdy))))))
+
+(defun sj3rpc-bunsetsu-stdy (env stdy)
+  (sj3rpc-call-with-environment env (result)
+     (comm-format (u v) (sj3-const STDY) stdy (length stdy))
+     (comm-unpack (u) result)
+      (if (/= result 0)
+         (- result)
+       0)))
+
+(defun sj3rpc-kugiri-stdy (env yomi1 yomi2 stdy)
+  (let* ((yomi1-ext (encode-coding-string yomi1 'euc-japan))
+        (yomi2-ext (encode-coding-string yomi2 'euc-japan)))
+    (sj3rpc-call-with-environment env (result)
+      (comm-format (u s s v) (sj3-const CLSTDY_EUC)
+                  yomi1-ext yomi2-ext stdy (length stdy))
+      (comm-unpack (u) result)
+      (if (/= result 0)
+         (- result)
+       0))))
+
+;;; egg/sj3rpc.el ends here.
diff --git a/egg/wnn.el b/egg/wnn.el
new file mode 100644 (file)
index 0000000..c2cb2c0
--- /dev/null
@@ -0,0 +1,2096 @@
+;;; egg/wnn.el --- WNN Support (high level interface) in Egg
+;;;                Input Method Architecture
+
+;; Copyright (C) 1999,2000 PFU LIMITED
+
+;; Author: NIIBE Yutaka <gniibe@chroot.org>
+;;         KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+
+;;; Code:
+
+(require 'egg)
+(require 'egg-edep)
+
+(defgroup wnn nil
+  "Wnn interface for Tamagotchy"
+  :group 'egg)
+
+(defcustom wnn-auto-save-dictionaries 0
+  "*Save dictionaries automatically after N-th end conversion, if positive"
+  :group 'wnn :type 'integer)
+
+(defcustom wnn-use-v3-eggrc nil
+  "*Enable old style eggrc, if non-NIL"
+  :group 'wnn :type 'boolean)
+
+(defcustom wnn-use-bixing (not wnn-use-v3-eggrc)
+  "*Enable bixing (stroke) input-method, if non-NIL"
+  :group 'wnn :type 'boolean)
+
+(defcustom wnn-force-set-environment nil
+  "*Regardless the existence of the Wnn environment in the server,
+reset the environment, if non-NIL.  Otherwise, reset the environment
+only when it is created."
+  :group 'wnn :type 'boolean)
+
+(defcustom wnn-one-level-conversion nil
+  "*Don't use major clause (dai bunsetu/da wenjie/dae munjeol), if non-NIL."
+  :group 'wnn :type 'boolean)
+
+(defcustom wnn-usr-dic-dir (concat "usr/" (user-login-name))
+  "*Directory of user dictionary for Wnn."
+  :group 'wnn
+  :type 'string)
+
+(defcustom wnn-user-name (or (getenv "WNNUSER") (user-login-name))
+  "User name at Wnn server.  Default value is login name or
+WNNUSER evironment variable, if it is defined."
+  :group 'wnn :type 'string)
+
+(defcustom wnn-uniq-level 'wnn-uniq
+  "Uniq level for candidate selection.
+wnn-no-uniq:    Use all candidates.
+wnn-uniq-entry: Use only one among same dictionary entry candidates.
+wnn-uniq:       Use only one among same hinshi candidates. (default)
+wnn-uniq-kanji: Use only one among same kanji candidates."
+  :group 'wnn :type '(choice (const wnn-no-uniq)
+                            (const wnn-uniq-entry)
+                            (const wnn-uniq)
+                            (const wnn-uniq-kanji)))
+
+(defcustom wnn-jserver nil
+  "jserver hostname list.  Use N-th port, if hostname is followed
+by ':' and digit N."
+  :group 'wnn :type '(repeat string))
+(defcustom wnn-cserver nil
+  "cserver hostname list.  Use N-th port, if hostname is followed
+by ':' and digit N."
+  :group 'wnn :type '(repeat string))
+(defcustom wnn-tserver nil
+  "tserver hostname list.  Use N-th port, if hostname is followed
+by ':' and digit N."
+  :group 'wnn :type '(repeat string))
+(defcustom wnn-kserver nil
+  "kserver hostname list.  Use N-th port, if hostname is followed
+ by ':' and digit N."
+  :group 'wnn :type '(repeat string))
+
+(defcustom wnn-jport 22273 "jserver port number" :group 'wnn :type 'integer)
+(defcustom wnn-cport 22289 "cserver port number" :group 'wnn :type 'integer)
+(defcustom wnn-tport 22321 "tserver port number" :group 'wnn :type 'integer)
+(defcustom wnn-kport 22305 "kserver port number" :group 'wnn :type 'integer)
+
+(defmacro wnn-backend-plist ()
+  ''(egg-initialize-backend        wnn-init
+     egg-start-conversion          wnn-start-conversion
+     egg-get-bunsetsu-source       wnn-get-bunsetsu-source
+     egg-get-bunsetsu-converted    wnn-get-bunsetsu-converted
+     egg-get-source-language       wnn-get-source-language
+     egg-get-converted-language    wnn-get-converted-language
+     egg-major-bunsetsu-continue-p wnn-major-bunsetsu-continue-p
+     egg-list-candidates           wnn-list-candidates
+     egg-decide-candidate          wnn-decide-candidate
+     egg-change-bunsetsu-length    wnn-change-bunsetsu-length
+     egg-bunsetsu-combinable-p     wnn-bunsetsu-combinable-p
+     egg-end-conversion            wnn-end-conversion
+     egg-word-inspection           wnn-word-inspection
+     egg-word-registration         wnn-word-registration))
+
+(defun wnn-backend-func-name (name lang &optional env)
+  (intern (concat name "-" (symbol-name lang)
+                 (and env "-") (and env (symbol-name env)))))
+
+(defun wnn-make-backend (lang env &optional source-lang converted-lang)
+  (let ((finalize (wnn-backend-func-name "wnn-finalize-backend" lang))
+       (backend (wnn-backend-func-name "wnn-backend" lang env)))
+    (if (null (fboundp finalize))
+       (progn
+         (fset finalize `(lambda () (wnn-finalize-backend ',lang)))
+         (egg-set-finalize-backend (list finalize))))
+    (if (null (get backend 'egg-start-conversion))
+       (setplist backend (apply 'list
+                                'language lang
+                                'source-language (or source-lang lang)
+                                'converted-language (or converted-lang lang)
+                                (wnn-backend-plist))))
+    backend))
+
+(defun wnn-define-backend (lang env-name-list)
+  (mapcar (lambda (env)
+           (if (consp env)
+               (wnn-define-backend lang env)
+             (wnn-make-backend lang env)))
+         env-name-list))
+
+(wnn-make-backend 'Chinese-GB 'Q  'QianMa 'Chinese-GB)
+(wnn-make-backend 'Chinese-GB 'QR 'Chinese-GB 'QianMa)
+(wnn-make-backend 'Chinese-GB 'W  'WuBi 'Chinese-GB)
+(wnn-make-backend 'Chinese-GB 'WR 'Chinese-GB 'WuBi)
+
+(defconst wnn-backend-language-alist '((QianMa . Chinese-GB)
+                                      (WuBi . Chinese-GB)))
+
+(defvar wnn-backend-alist nil)
+
+(defun wnn-define-backend-alist (deflist)
+  (setq wnn-backend-alist
+       (mapcar (lambda (slot)
+                 (let* ((lang (car slot))
+                        (alt (cdr (assq lang wnn-backend-language-alist))))
+                   (cons lang (wnn-define-backend (or alt lang) (cdr slot)))))
+               deflist)))
+
+(defcustom wnn-backend-define-list
+  (if wnn-use-bixing
+      '((Japanese    ((nil nil R))   ((R   nil R)))
+       (Chinese-GB  ((PZ  PZ  PZR)) ((PZR PZ  PZR))
+                    ((QR  Q   QR))  ((WR  W   WR)))
+       (Chinese-CNS ((PZ  PZ  PZR)) ((PZR PZ  PZR)))
+       (Korean      ((nil nil R))   ((R   nil R)))
+       (QianMa      ((Q Q QR)))
+       (WuBi        ((W W WR))))
+    '((Japanese    ((nil nil R))   ((R   nil R)))
+      (Chinese-GB  ((PZ  PZ  PZR)) ((PZR PZ  PZR)))
+      (Chinese-CNS ((PZ  PZ  PZR)) ((PZR PZ  PZR)))
+      (Korean      ((nil nil R))   ((R   nil R)))))
+  "Alist of language and lists of the Wnn backend suffixes."
+  :group 'wnn
+  :set (lambda (sym value)
+        (set-default sym value)
+        (wnn-define-backend-alist value))
+  :type '(repeat
+         (cons
+          :tag "Language - Backend"
+          (choice :tag "Language"
+                  (const Japanese)
+                  (const Chinese-GB)
+                  (const Chinese-CNS)
+                  (const Korean)
+                  (const QianMa)
+                  (const WuBi)
+                  (symbol :tag "Other"))
+          (repeat
+           (cons
+            :tag "Backend Sequece"
+            (cons :tag "First Conversion Stage"
+                  (symbol :tag "Backend for Start Conversion")
+                  (repeat :tag "Backends for Reconvert"
+                          (symbol :tag "Backend")))
+            (repeat
+             :tag "Following Conversion Stages"
+             (cons
+              :tag "N-th Stage"
+              (symbol :tag "Backend for This Stage")
+              (repeat :tag "Backends for Reconvert"
+                      (symbol :tag "Backend")))))))))
+
+(eval-when-compile
+  (defmacro WNN-const (c)
+    (cond ((eq c 'BUN_SENTOU)    -1)
+         ((eq c 'NO_EXIST)       1)
+         ((eq c 'NO_MATCH)      10)
+         ((eq c 'IMA_OFF)       -4)
+         ((eq c 'IMA_ON)        -3)
+         ((eq c 'CONNECT)        1)
+         ((eq c 'CONNECT_BK)     1)
+         ((eq c 'HIRAGANA)      -1)
+         ((eq c 'KATAKANA)     -11)
+         ((eq c 'IKEIJI_ENTRY) -50)
+         ((eq c 'LEARNING_LEN)   3)
+         ((eq c 'MUHENKAN_DIC)  -3)
+         ((eq c 'HINDO_NOP)     -2)
+         ((eq c 'HINDO_INC)     -3)
+         ((eq c 'DIC_RW)         0)
+         ((eq c 'DIC_RDONLY)     1)
+         ((eq c 'DIC_GROUP)      3)
+         ((eq c 'DIC_MERGE)      4)
+         ((eq c 'NOTRANS_LEARN)  1)
+         ((eq c 'BMODIFY_LEARN)  2)
+         ((eq c 'DIC_NO_TEMPS)   ?\x3f))))
+\f
+;; Retern value of system-name may differ from hostname.
+(defconst wnn-system-name
+  (or (with-temp-buffer
+       (condition-case nil
+           (call-process "hostname"
+                         nil `(,(current-buffer) nil) "hostname")
+         (error))
+       (goto-char (point-min))
+       (if (re-search-forward "[\0- ]" nil 0)
+           (goto-char (1- (point))))
+       (if (> (point) 1)
+           (buffer-substring 1 (point))))
+      (system-name)))
+
+(egg-add-message
+ '((nil
+    (wnn-connect-error  "cannot connect to the server")
+    (wnn-fail-make-env  "cannot make the Wnn environment")
+    (wnn-dict-saving    "saving %s's frequency/dictionary information")
+    (wnn-dict-saved     "finish to save %s's frequency/dictionary information")
+    (wnn-dir-missing    "directory %s missing. Create it? ")
+    (wnn-dir-failed     "failed to create directory %s")
+    (wnn-dir-created    "directory %s created")
+    (wnn-dict-missing-1 "dictionary file %s is missing: %s")
+    (wnn-dict-missing-2 "dictionary file %s is missing. Create it? ")
+    (wnn-dict-created   "dictionary file %s is created")
+    (wnn-freq-missing-1 "frequency file %s is missing: %s")
+    (wnn-freq-missing-2 "frequency file %s is missing. Create it? ")
+    (wnn-freq-created   "frequency file %s is created")
+    (wnn-no-match       "unmatch dictionary and freq. file %s. Re-create it? ")
+    (wnn-re-create-freq "frequency file %s is re-created")
+    (wnn-pseud-bunsetsu "pseud clause")
+    (wnn-register-1     "dictionary name:")
+    (wnn-register-2     "clause class name")
+    (wnn-no-writable-d  "no writable dictionary"))
+   (Japanese
+    (wnn-connect-error  "\e$B%5!<%P$H@\B3$G$-$^$;$s$G$7$?\e(B")
+    (wnn-fail-make-env  "\e$B4D6-$r:n$k$3$H$O$G$-$^$;$s$G$7$?\e(B")
+    (wnn-dict-saving    "%s \e$B$NIQEY>pJs!&<-=q>pJs$rB`Hr$7$F$$$^$9\e(B")
+    (wnn-dict-saved     "%s \e$B$NIQEY>pJs!&<-=q>pJs$rB`Hr$7$^$7$?\e(B")
+    (wnn-dir-missing    "\e$B%G%#%l%/%H%j\e(B %s \e$B$,$"$j$^$;$s!#:n$j$^$9$+\e(B? ")
+    (wnn-dir-failed     "\e$B%G%#%l%/%H%j\e(B %s \e$B$N:n@.$K<:GT$7$^$7$?\e(B")
+    (wnn-dir-created    "\e$B%G%#%l%/%H%j\e(B %s \e$B$r:n$j$^$7$?\e(B")
+    (wnn-dict-missing-1 "\e$B<-=q%U%!%$%k\e(B %s \e$B$,$"$j$^$;$s\e(B: %s")
+    (wnn-dict-missing-2 "\e$B<-=q%U%!%$%k\e(B %s \e$B$,$"$j$^$;$s!#:n$j$^$9$+\e(B? ")
+    (wnn-dict-created   "\e$B<-=q%U%!%$%k\e(B %s \e$B$r:n$j$^$7$?\e(B")
+    (wnn-freq-missing-1 "\e$BIQEY%U%!%$%k\e(B %s \e$B$,$"$j$^$;$s\e(B: %s")
+    (wnn-freq-missing-2 "\e$BIQEY%U%!%$%k\e(B %s \e$B$,$"$j$^$;$s!#:n$j$^$9$+\e(B? ")
+    (wnn-freq-created   "\e$BIQEY%U%!%$%k\e(B %s \e$B$r:n$j$^$7$?\e(B")
+    (wnn-no-match       "\e$B<-=q$HIQEY\e(B %s \e$B$N@09g@-$,$"$j$^$;$s!#:n$jD>$7$^$9$+\e(B? ")
+    (wnn-re-create-freq "\e$BIQEY%U%!%$%k\e(B %s \e$B$r:n$jD>$7$^$7$?\e(B")
+    (wnn-pseud-bunsetsu "\e$B5?;wJ8@a\e(B")
+    (wnn-register-1     "\e$BEPO?<-=qL>\e(B:")
+    (wnn-register-2     "\e$BIJ;lL>\e(B")
+    (wnn-no-writable-d  "\e$BEPO?2DG=$J<-=q$,$"$j$^$;$s\e(B"))
+   (Chinese-GB
+    (wnn-connect-error  "\e$A2;D\:M\e(Bserver\e$AA,=S\e(B")
+    (wnn-fail-make-env  "\e$A;7>32;D\44=(\e(B")
+    (wnn-dict-saving    "%s \e$A5DF56HND<~:M4G5dPEO"U}TZMK3v\e(B")
+    (wnn-dict-saved     "%s \e$A5DF56HND<~:M4G5dPEO"RQ>-MK3vAK\e(B")
+    (wnn-dir-missing    "\e$AD?B<\e(B %s \e$AC;SP!#R*=(A"Bp\e(B? ")
+    (wnn-dir-failed     "\e$AD?B<\e(B %s \e$A=(A"J'0\AK\e(B")
+    (wnn-dir-created    "\e$AD?B<\e(B %s \e$A=(A"AK\e(B")
+    (wnn-dict-missing-1 "\e$AWV5dND<~\e(B %s \e$AC;SP\e(B: %s")
+    (wnn-dict-missing-2 "\e$AWV5dND<~\e(B %s \e$AC;SP!#R*=(A"Bp\e(B? ")
+    (wnn-dict-created   "\e$AWV5dND<~\e(B %s \e$A=(A"AK\e(B")
+    (wnn-freq-missing-1 "\e$AF56HND<~\e(B %s \e$AC;SP\e(B: %s")
+    (wnn-freq-missing-2 "\e$AF56HND<~\e(B %s \e$AC;SP!#R*=(A"Bp\e(B? ")
+    (wnn-freq-created   "\e$AF56HND<~\e(B %s \e$A=(A"AK\e(B")
+    (wnn-no-match       "\e$AWV5d:MF56H\e(B %s \e$A5DU{:OPTC;SP!#R*TY=(A"Bp\e(B? ")
+    (wnn-re-create-freq "\e$AF56HND<~\e(B %s \e$ATY=(A"AK\e(B")
+    (wnn-pseud-bunsetsu "\e$ARIKFND=Z\e(B")
+    (wnn-register-1     "\e$A5GB<4G5dC{\e(B:")
+    (wnn-register-2     "\e$A4JPTC{\e(B")
+    (wnn-no-writable-d  "\e$AC;SP?ID\5GB<5D4G5d\e(B"))
+   (Chinese-CNS
+    (wnn-connect-error  "\e$(GDbWdLO\e(Bserver\e$(G]YZY\e(B")
+    (wnn-fail-make-env  "\e$(Gt?h:DbWd^6Pz\e(B")
+    (wnn-dict-saving    "%s \e$(GN{s"PyEFG5LOy0L(OjUIF_GcXMEx\e(B")
+    (wnn-dict-saved     "%s \e$(GN{s"PyEFG5LOy0L(OjUIDXenXMExD'\e(B")
+    (wnn-dir-missing    "\e$(GFxrg\e(B %s \e$(GJtH4!$SQPzG!cC\e(B? ")
+    (wnn-dir-failed     "\e$(GFxrg\e(B %s \e$(GPzG!FBZuD'\e(B")
+    (wnn-dir-created    "\e$(GFxrg\e(B %s \e$(GPzG!D'\e(B")
+    (wnn-dict-missing-1 "\e$(GGsL(EFG5\e(B %s \e$(GJtH4\e(B: %s")
+    (wnn-dict-missing-2 "\e$(GGsL(EFG5\e(B %s \e$(GJtH4!$SQPzG!cC\e(B? ")
+    (wnn-dict-created   "\e$(GGsL(EFG5\e(B %s \e$(GPzG!D'\e(B")
+    (wnn-freq-missing-1 "\e$(Gs"PyEFG5\e(B %s \e$(GJtH4\e(B: %s")
+    (wnn-freq-missing-2 "\e$(Gs"PyEFG5\e(B %s \e$(GJtH4!$SQPzG!cC\e(B? ")
+    (wnn-freq-created   "\e$(Gs"PyEFG5\e(B %s \e$(GPzG!D'\e(B")
+    (wnn-no-match       "\e$(GGsL(LOs"Py\e(B %s \e$(GN{plLOMLJtH4!$SQGBPzG!cC\e(B? ")
+    (wnn-re-create-freq "\e$(Gs"PyEFG5\e(B %s \e$(GGBPzG!D'\e(B")
+    (wnn-pseud-bunsetsu "\e$(GijH}EFeg\e(B")
+    (wnn-register-1     "\e$(G`trgy0L(GX\e(B:")
+    (wnn-register-2     "\e$(Gb$MLGX\e(B")
+    (wnn-no-writable-d  "\e$(GJtH4F+Wd`trgN{GsL(\e(B"))
+   (Korean
+    (wnn-connect-error  "\e$(C<-9v\e(B(Server) \e$(C?M\e(B \e$(CA"CKGR\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B")
+    (wnn-fail-make-env  "\e$(CH/0f@;\e(B \e$(C@[<:GR\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B")
+    (wnn-dict-saving    "%s \e$(C@G\e(B \e$(C:s55A$:8?M\e(B \e$(C;g@|A$:88&\e(B \e$(C<<@L:jGO0m\e(B \e$(C@V=@4O4Y\e(B")
+    (wnn-dict-saved     "%s \e$(C@G\e(B \e$(C:s55A$:8?M\e(B \e$(C;g@|A$:88&\e(B \e$(C<<@L:jG_=@4O4Y\e(B")
+    (wnn-dir-missing    "\e$(C5p7:Ed8.\e(B %s \e$(C@L\e(B \e$(C>x@>4O4Y#.@[<:GO0Z=@4O1n\e(B? ")
+    (wnn-dir-failed     "\e$(C5p7:Ed8.\e(B %s \e$(C@;\e(B \e$(C@[<:GR\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B")
+    (wnn-dir-created    "\e$(C5p7:Ed8.\e(B %s \e$(C@;\e(B \e$(C@[<:G_=@4O4Y\e(B")
+    (wnn-dict-missing-1 "\e$(C;g@|H-@O\e(B %s \e$(C@L\e(B \e$(C>x@>4O4Y\e(B: %s")
+    (wnn-dict-missing-2 "\e$(C;g@|H-@O\e(B %s \e$(C@L\e(B \e$(C>x@>4O4Y#.4Y=C\e(B \e$(C@[<:GO0Z=@4O1n\e(B? ")
+    (wnn-dict-created   "\e$(C;g@|H-@O\e(B %s \e$(C@;\e(B \e$(C@[<:G_=@4O4Y\e(B")
+    (wnn-freq-missing-1 "\e$(C:s55H-@O\e(B %s \e$(C@L\e(B \e$(C>x@>4O4Y\e(B: %s")
+    (wnn-freq-missing-2 "\e$(C:s55H-@O\e(B %s \e$(C@L\e(B \e$(C>x@>4O4Y#.4Y=C\e(B \e$(C@[<:GO0Z=@4O1n\e(B? ")
+    (wnn-freq-created   "\e$(C:s55H-@O\e(B %s \e$(C@;\e(B \e$(C@[<:G_=@4O4Y\e(B")
+    (wnn-no-match       "\e$(C;g@|0z\e(B \e$(C:s55\e(B %s \e$(C0!\e(B \e$(C8BAv\e(B \e$(C>J=@4O4Y#.4Y=C\e(B \e$(C@[<:GO0Z=@4O1n\e(B? ")
+    (wnn-re-create-freq "\e$(C:s55H-@O\e(B %s \e$(C@;\e(B \e$(C4Y=C\e(B \e$(C@[<:G_=@4O4Y\e(B")
+    (wnn-pseud-bunsetsu "\e$(C@G;g9.@}\e(B")
+    (wnn-register-1     "\e$(C5n7O;g@|8m\e(B:")
+    (wnn-register-2     "\e$(CG0;g8m\e(B")
+    (wnn-no-writable-d  "\e$(C5n7O\e(B \e$(C0!4IGQ\e(B \e$(CAvA$@L\e(B \e$(C>F4U4O4Y\e(B"))))
+\f
+;; <env> ::= [ <proc> <env-id> <lang> <server-type> <wnn-version>
+;;             <backend> <tankan> <env-name> <auto-learn> <hinshi> ]
+
+(defun wnnenv-create (proc env-id &optional server-type wnn-version
+                     backend tankan name)
+  (if name
+      (set (setq name (make-symbol name)) (make-vector 5 nil)))
+  (vector proc env-id server-type wnn-version backend tankan name
+         (make-vector 2 (WNN-const DIC_RDONLY))))
+
+(defsubst wnnenv-get-proc (env)        (aref env 0))
+(defsubst wnnenv-get-env-id (env)      (aref env 1))
+(defsubst wnnenv-get-server-type (env) (aref env 2))
+(defsubst wnnenv-get-wnn-version (env) (aref env 3))
+(defsubst wnnenv-get-backend (env)     (aref env 4))
+(defsubst wnnenv-get-tankan (env)      (aref env 5))
+
+(defun wnnenv-get-client-file (env name)
+  (let ((hash (intern-soft name (symbol-value (aref env 6)))))
+    (and hash (symbol-value hash))))
+
+(defun wnnenv-set-client-file (env name)
+  (set (intern (concat wnn-system-name "!" name) (symbol-value (aref env 6)))
+       name))
+
+(defsubst wnnenv-get-hinshi (env h)    (or (get (aref env 6) h) -1))
+(defsubst wnnenv-set-hinshi (env h v)  (put (aref env 6) h v))
+
+(defsubst wnnenv-get-auto-learn (env)  (aref env 7))
+(defsubst wnnenv-get-notrans (env)     (aref (wnnenv-get-auto-learn env) 0))
+(defsubst wnnenv-get-bmodify (env)     (aref (wnnenv-get-auto-learn env) 1))
+(defsubst wnnenv-set-notrans (env v)   (aset (wnnenv-get-auto-learn env) 0 v))
+(defsubst wnnenv-set-bmodify (env v)   (aset (wnnenv-get-auto-learn env) 1 v))
+
+(defsubst wnnenv-is-wnn6 (env)         (eq (wnnenv-get-wnn-version env) 'wnn6))
+
+(defvar wnn-environments nil
+  "Environment for Wnn conversion server")
+
+;; <wnn-bunsetsu> ::= [ <env>
+;;                      <jirilen> <dic-no> <entry> <freq> <right-now> <hinshi>
+;;                             <status> <status-backward> <kangovect> <evaluation>
+;;                             <converted> <yomi> <fuzokugo>
+;;                             <dai-evaluation> <dai-continue> <change-top>
+;;                             <zenkouho-info> <freq-down> <fi-rel> <context> ]
+;;
+;; <zenkouho-info> ::= [ <pos> <list> <converted> <dai> <prev-b> <nxet-b> ]
+;;                    
+
+(defsubst wnn-bunsetsu-create (env jirilen dic-no entry freq right-now hinshi
+                              status status-backward kangovect evaluation)
+  (egg-bunsetsu-create (wnnenv-get-backend env)
+                      (vector env jirilen dic-no entry freq right-now hinshi
+                              status status-backward kangovect evaluation
+                              nil nil nil nil nil nil nil nil nil nil)))
+
+(defsubst wnn-bunsetsu-get-env (b)
+  (aref (egg-bunsetsu-get-info b) 0))
+(defsubst wnn-bunsetsu-get-jirilen (b)
+  (aref (egg-bunsetsu-get-info b) 1))
+(defsubst wnn-bunsetsu-get-dic-no (b)
+  (aref (egg-bunsetsu-get-info b) 2))
+(defsubst wnn-bunsetsu-set-dic-no (b dic)
+  (aset (egg-bunsetsu-get-info b) 2 dic))
+(defsubst wnn-bunsetsu-get-entry (b)
+  (aref (egg-bunsetsu-get-info b) 3))
+(defsubst wnn-bunsetsu-set-entry (b ent)
+  (aset (egg-bunsetsu-get-info b) 3 ent))
+(defsubst wnn-bunsetsu-get-freq (b)
+  (aref (egg-bunsetsu-get-info b) 4))
+(defsubst wnn-bunsetsu-get-right-now (b)
+  (aref (egg-bunsetsu-get-info b) 5))
+(defsubst wnn-bunsetsu-get-hinshi (b)
+  (aref (egg-bunsetsu-get-info b) 6))
+(defsubst wnn-bunsetsu-get-status (b)
+  (aref (egg-bunsetsu-get-info b) 7))
+(defsubst wnn-bunsetsu-get-status-backward (b)
+  (aref (egg-bunsetsu-get-info b) 8))
+(defsubst wnn-bunsetsu-get-kangovect (b)
+  (aref (egg-bunsetsu-get-info b) 9))
+(defsubst wnn-bunsetsu-get-evaluation (b)
+  (aref (egg-bunsetsu-get-info b) 10))
+
+(defsubst wnn-bunsetsu-get-converted (b)
+  (aref (egg-bunsetsu-get-info b) 11))
+(defsubst wnn-bunsetsu-set-converted (b cvt)
+  (aset (egg-bunsetsu-get-info b) 11 cvt))
+
+(defsubst wnn-bunsetsu-get-yomi (b)
+  (aref (egg-bunsetsu-get-info b) 12))
+(defsubst wnn-bunsetsu-set-yomi (b yomi)
+  (aset (egg-bunsetsu-get-info b) 12 yomi))
+
+(defsubst wnn-bunsetsu-get-fuzokugo (b)
+  (aref (egg-bunsetsu-get-info b) 13))
+(defsubst wnn-bunsetsu-set-fuzokugo (b fuzokugo)
+  (aset (egg-bunsetsu-get-info b) 13 fuzokugo))
+
+(defsubst wnn-bunsetsu-get-dai-evaluation (b)
+  (aref (egg-bunsetsu-get-info b) 14))
+(defsubst wnn-bunsetsu-set-dai-evaluation (b de)
+  (aset (egg-bunsetsu-get-info b) 14 de))
+
+(defsubst wnn-bunsetsu-get-dai-continue (b)
+  (aref (egg-bunsetsu-get-info b) 15))
+(defsubst wnn-bunsetsu-set-dai-continue (b dc)
+  (aset (egg-bunsetsu-get-info b) 15 dc))
+
+(defsubst wnn-bunsetsu-get-change-top (b)
+  (aref (egg-bunsetsu-get-info b) 16))
+(defsubst wnn-bunsetsu-set-change-top (b top)
+  (aset (egg-bunsetsu-get-info b) 16 top))
+
+(defsubst wnn-bunsetsu-get-zenkouho (b)
+  (aref (egg-bunsetsu-get-info b) 17))
+(defsubst wnn-bunsetsu-set-zenkouho (b z)
+  (aset (egg-bunsetsu-get-info b) 17 z))
+
+(defsubst wnn-bunsetsu-get-freq-down (b)
+  (aref (egg-bunsetsu-get-info b) 18))
+(defsubst wnn-bunsetsu-set-freq-down (b fd)
+  (aset (egg-bunsetsu-get-info b) 18 fd))
+
+(defsubst wnn-bunsetsu-get-fi-rel (b)
+  (aref (egg-bunsetsu-get-info b) 19))
+(defsubst wnn-bunsetsu-set-fi-rel (b fr)
+  (aset (egg-bunsetsu-get-info b) 19 fr))
+
+(defsubst wnn-bunsetsu-get-context (b)
+  (aref (egg-bunsetsu-get-info b) 20))
+(defsubst wnn-bunsetsu-set-context (b c)
+  (aset (egg-bunsetsu-get-info b) 20 c))
+
+(defsubst wnn-zenkouho-create (pos list converted dai prev-b nxet-b)
+  (vector pos list converted dai prev-b nxet-b))
+
+(defsubst wnn-bunsetsu-get-zenkouho-pos (b)
+  (aref (wnn-bunsetsu-get-zenkouho b) 0))
+(defsubst wnn-bunsetsu-set-zenkouho-pos (b p)
+  (aset (wnn-bunsetsu-get-zenkouho b) 0 p))
+
+(defsubst wnn-bunsetsu-get-zenkouho-list (b)
+  (aref (wnn-bunsetsu-get-zenkouho b) 1))
+(defsubst wnn-bunsetsu-get-zenkouho-converted (b)
+  (aref (wnn-bunsetsu-get-zenkouho b) 2))
+(defsubst wnn-bunsetsu-get-zenkouho-dai (b)
+  (aref (wnn-bunsetsu-get-zenkouho b) 3))
+(defsubst wnn-bunsetsu-get-zenkouho-prev-b (b)
+  (aref (wnn-bunsetsu-get-zenkouho b) 4))
+(defsubst wnn-bunsetsu-get-zenkouho-next-b (b)
+  (aref (wnn-bunsetsu-get-zenkouho b) 5))
+
+(defsubst wnn-bunsetsu-connect-prev (bunsetsu)
+  (= (wnn-bunsetsu-get-status bunsetsu) (WNN-const CONNECT)))
+(defsubst wnn-bunsetsu-connect-next (bunsetsu)
+  (= (wnn-bunsetsu-get-status-backward bunsetsu) (WNN-const CONNECT_BK)))
+
+(defsubst wnn-context-create (dic-no entry jirilen hinshi fuzokugo
+                             converted freq right-now)
+  (vector dic-no entry jirilen hinshi fuzokugo
+         converted freq right-now
+         (egg-chars-in-period converted 0 (length converted))))
+
+(defsubst wnn-context-dic-no (context)          (aref context 0))
+(defsubst wnn-context-entry (context)           (aref context 1))
+(defsubst wnn-context-jirilen (context)         (aref context 2))
+(defsubst wnn-context-hinshi (context)          (aref context 3))
+(defsubst wnn-context-fuzokugo (context)        (aref context 4))
+(defsubst wnn-context-converted (context)       (aref context 5))
+(defsubst wnn-context-right-now (context)       (aref context 6))
+(defsubst wnn-context-set-right-now (context r) (aset context 6 r))
+(defsubst wnn-context-freq (context)            (aref context 7))
+(defsubst wnn-context-set-freq (context f)      (aset context 7 f))
+(defsubst wnn-context-length (context)          (aref context 8))
+
+(defun wnn-null-context ()
+  (list (wnn-context-create -2 0 0 0 "" "" 0 0)
+       (wnn-context-create -2 0 0 0 "" "" 0 0)))
+
+(defun wnn-major-bunsetsu-set-context (bunsetsu-list context)
+  (while bunsetsu-list
+    (wnn-bunsetsu-set-context (car bunsetsu-list) context)
+    (setq bunsetsu-list (cdr bunsetsu-list))))
+
+(defsubst wnn-bunsetsu-equal (bunsetsu-1 bunsetsu-2)
+  (and (= (wnn-bunsetsu-get-dic-no bunsetsu-1)
+         (wnn-bunsetsu-get-dic-no bunsetsu-2))
+       (= (wnn-bunsetsu-get-entry bunsetsu-1)
+         (wnn-bunsetsu-get-entry bunsetsu-2))
+       (= (wnn-bunsetsu-get-kangovect bunsetsu-1)
+         (wnn-bunsetsu-get-kangovect bunsetsu-2))
+       (equal (wnn-bunsetsu-get-converted bunsetsu-1)
+             (wnn-bunsetsu-get-converted bunsetsu-2))
+       (equal (wnn-bunsetsu-get-fuzokugo bunsetsu-1)
+             (wnn-bunsetsu-get-fuzokugo bunsetsu-2))))
+
+(defun wnn-bunsetsu-list-equal (b1 b2)
+  (while (and b1 b2 (wnn-bunsetsu-equal (car b1) (car b2)))
+    (setq b1 (cdr b1)
+         b2 (cdr b2)))
+  (and (null b1) (null b2)))
+
+(defun wnn-bunsetsu-list-copy (bunsetsu)
+  (mapcar (lambda (b)
+           (egg-bunsetsu-create (egg-bunsetsu-get-backend b)
+                                (copy-sequence (egg-bunsetsu-get-info b))))
+         bunsetsu))
+\f
+(defconst wnn-server-info-list
+  ;; language    server  port      hostname    proc   coding-system
+  '((Japanese    jserver wnn-jport wnn-jserver "Wnn"  (fixed-euc-jp    fixed-euc-jp))
+    (Chinese-GB  cserver wnn-cport wnn-cserver "cWnn" (fixed-euc-py-cn fixed-euc-zy-cn))
+    (Chinese-CNS tserver wnn-tport wnn-tserver "tWnn" (fixed-euc-py-tw fixed-euc-zy-tw))
+    (Korean      kserver wnn-kport wnn-kserver "kWnn" (fixed-euc-kr    fixed-euc-kr))))
+
+(defsubst wnn-server-get-info (lang)
+  (or (assq lang wnn-server-info-list)
+      (egg-error "unsupported language: %s" lang)))
+
+(defsubst wnn-server-language (info)
+  (car info))
+(defsubst wnn-server-type (info)
+  (nth 1 info))
+(defsubst wnn-server-port (info)
+  (symbol-value (nth 2 info)))
+(defsubst wnn-server-hostname (info)
+  (symbol-value (nth 3 info)))
+(defsubst wnn-server-proc-name (info)
+  (nth 4 info))
+(defsubst wnn-server-buffer-name (info)
+  (concat " *" (wnn-server-proc-name info) "*"))
+(defsubst wnn-server-coding-system (info)
+  (nth 5 info))
+
+(defconst wnn-accept-charset-alist
+  '((Chinese-CNS ascii chinese-sisheng chinese-cns11643-1 chinese-cns11643-2)))
+
+(defsubst wnn-backend-get-language (backend)
+  (get backend 'language))
+
+(defsubst wnn-backend-get-source-language (backend)
+  (get backend 'source-language))
+
+(defsubst wnn-backend-get-converted-language (backend)
+  (get backend 'converted-language))
+
+(defvar wnn-prev-context nil)
+
+(defun wnn-start-conversion (backend yomi &optional context)
+  "Convert YOMI string to kanji, and enter conversion mode.
+Return the list of bunsetsu."
+  (let ((accepts (cdr (assq (wnn-backend-get-source-language backend)
+                           wnn-accept-charset-alist)))
+       env hinshi fuzokugo result)
+    (if accepts
+       (let ((charsets (mapcar 'char-charset (string-to-list yomi))))
+         (while accepts
+            (setq charsets (delq (car accepts) charsets)
+                  accepts (cdr accepts)))
+         (if charsets
+             (egg-error "cannot handle %s" (car charsets)))))
+    (setq env (wnn-get-environment backend))
+    (cond ((eq (car (car-safe  context)) backend)
+          (setq wnn-prev-context (car context)
+                context (cdr wnn-prev-context)
+                hinshi (wnn-context-hinshi (nth 1 context))
+                fuzokugo (wnn-context-fuzokugo (nth 1 context))))
+         ((listp context)
+          (setq wnn-prev-context (cons nil (wnn-null-context))
+                context (cdr wnn-prev-context)
+                hinshi (WNN-const BUN_SENTOU)
+                fuzokugo ""))
+         ((eq (car wnn-prev-context) backend)
+          (setq context (cdr wnn-prev-context)
+                hinshi (wnnenv-get-hinshi env 'noun)
+                fuzokugo ""))
+         (t
+          (setq context (wnn-null-context)
+                hinshi (wnnenv-get-hinshi env 'noun)
+                fuzokugo "")))
+    (setq result (wnn-renbunsetsu-conversion env yomi hinshi fuzokugo nil
+                                            context))
+    (if (numberp result)
+       (egg-error "%s" (wnnrpc-get-error-message (- result))))
+    result))
+
+(defun wnn-get-source-language (bunsetsu)
+  (wnn-backend-get-source-language (egg-bunsetsu-get-backend bunsetsu)))
+
+(defun wnn-get-converted-language (bunsetsu)
+  (wnn-backend-get-converted-language (egg-bunsetsu-get-backend bunsetsu)))
+
+(defun wnn-get-bunsetsu-converted (bunsetsu)
+  (concat (wnn-bunsetsu-get-converted bunsetsu)
+         (wnn-bunsetsu-get-fuzokugo  bunsetsu)))
+
+(defun wnn-get-bunsetsu-source (bunsetsu)
+  (concat (wnn-bunsetsu-get-yomi bunsetsu)
+         (wnn-bunsetsu-get-fuzokugo bunsetsu)))
+
+(defun wnn-get-major-bunsetsu-converted (bunsetsu)
+  (mapconcat 'wnn-get-bunsetsu-converted bunsetsu ""))
+
+(defun wnn-get-major-bunsetsu-source (bunsetsu)
+  (mapconcat 'wnn-get-bunsetsu-source bunsetsu ""))
+
+(defun wnn-major-bunsetsu-continue-p (bunsetsu)
+  (wnn-bunsetsu-get-dai-continue bunsetsu))
+
+(defun wnn-uniq-hash (bunsetsu hash-table)
+  (intern (mapconcat (lambda (b)
+                      (concat (cond
+                               ((eq wnn-uniq-level 'wnn-uniq) 
+                                (wnn-bunsetsu-get-hinshi b))
+                               ((eq wnn-uniq-level 'wnn-uniq-entry)
+                                (concat (wnn-bunsetsu-get-dic-no b)
+                                        "+"
+                                        (wnn-bunsetsu-get-entry b))))
+                              (concat "\0"
+                                      (wnn-bunsetsu-get-converted b)
+                                      "\0"
+                                      (wnn-bunsetsu-get-fuzokugo b))))
+                    bunsetsu "\0")
+         hash-table))
+
+(defun wnn-uniq-candidates (candidates)
+  (if (eq wnn-uniq-level 'wnn-no-uniq)
+      candidates
+    (let ((hash-table (make-vector (length candidates) 0)))
+      (delq nil (mapcar (lambda (b)
+                         (let ((sym (wnn-uniq-hash b hash-table)))
+                           (if (null (boundp sym))
+                               (set sym b))))
+                       candidates)))))
+
+(defsubst wnn-uniq-bunsetsu-equal (bunsetsu-1 bunsetsu-2)
+  (and (or (eq wnn-uniq-level 'wnn-uniq-kanji)
+          (and (eq wnn-uniq-level 'wnn-uniq)
+               (= (wnn-bunsetsu-get-hinshi bunsetsu-1)
+                  (wnn-bunsetsu-get-hinshi bunsetsu-2)))
+          (and (= (wnn-bunsetsu-get-dic-no bunsetsu-1)
+                  (wnn-bunsetsu-get-dic-no bunsetsu-2))
+               (= (wnn-bunsetsu-get-entry bunsetsu-1)
+                  (wnn-bunsetsu-get-entry bunsetsu-2))
+               (or (eq wnn-uniq-level 'wnn-uniq-entry)
+                   (= (wnn-bunsetsu-get-kangovect bunsetsu-1)
+                      (wnn-bunsetsu-get-kangovect bunsetsu-2)))))
+       (equal (wnn-bunsetsu-get-converted bunsetsu-1)
+             (wnn-bunsetsu-get-converted bunsetsu-2))
+       (equal (wnn-bunsetsu-get-fuzokugo bunsetsu-1)
+             (wnn-bunsetsu-get-fuzokugo bunsetsu-2))))
+
+(defun wnn-uniq-bunsetsu-list-equal (b1 b2)
+  (while (and b1 b2 (wnn-uniq-bunsetsu-equal (car b1) (car b2)))
+    (setq b1 (cdr b1)
+         b2 (cdr b2)))
+  (and (null b1) (null b2)))
+
+(defun wnn-candidate-pos (bunsetsu candidates)
+  (let ((n 0)
+       pos)
+    (while (and (null pos) candidates)
+      (if (wnn-uniq-bunsetsu-list-equal (car candidates) bunsetsu)
+         (setq pos n)
+       (setq candidates (cdr candidates)
+             n (1+ n))))
+    (or pos -1)))
+
+(defun wnn-get-candidates-converted (candidates)
+  (mapcar 'wnn-get-major-bunsetsu-converted candidates))
+
+(defun wnn-set-candidate-info (bunsetsu zenkouho)
+  (wnn-bunsetsu-set-zenkouho (car bunsetsu) zenkouho)
+  (mapcar (lambda (b) (wnn-bunsetsu-set-zenkouho b t)) (cdr bunsetsu)))
+
+(defun wnn-list-candidates (bunsetsu prev-b next-b major)
+  (let* ((head (car bunsetsu))
+        (backend (egg-bunsetsu-get-backend head))
+        (env (wnn-bunsetsu-get-env head))
+        (yomi (wnn-get-major-bunsetsu-source bunsetsu))
+        (continue (eq (wnn-bunsetsu-get-zenkouho head) t))
+        pos cand converted hinshi fuzokugo v)
+    (if prev-b
+       (setq prev-b (egg-get-bunsetsu-tail prev-b)
+             hinshi (wnn-bunsetsu-get-hinshi prev-b)
+             fuzokugo (wnn-bunsetsu-get-fuzokugo prev-b))
+      (setq hinshi -1
+           fuzokugo ""))
+    (if next-b
+       (setq next-b (car next-b)
+             v (wnn-bunsetsu-get-kangovect next-b)))
+    (if (vectorp (wnn-bunsetsu-get-zenkouho head))
+       (setq pos (wnn-bunsetsu-get-zenkouho-pos head)
+             cand (wnn-bunsetsu-get-zenkouho-list head)))
+    (if (and pos
+            (wnn-bunsetsu-list-equal bunsetsu (nth pos cand))
+            (eq major (wnn-bunsetsu-get-zenkouho-dai head))
+            (eq prev-b (wnn-bunsetsu-get-zenkouho-prev-b head))
+            (eq next-b (wnn-bunsetsu-get-zenkouho-next-b head)))
+       (cons pos (wnn-bunsetsu-get-zenkouho-converted head))
+      (setq cand (wnn-get-bunsetsu-candidates env yomi hinshi fuzokugo v major))
+      (if (numberp cand)
+         (egg-error "%s" (wnnrpc-get-error-message (- cand))))
+      (setq pos (wnn-candidate-pos bunsetsu cand))
+      (cond ((< pos 0)
+            (setq cand (cons (wnn-bunsetsu-list-copy bunsetsu) cand)))
+           ((and (> pos 0)
+                 (null (eq (wnn-bunsetsu-get-zenkouho head) t)))
+            (setq cand (cons (nth pos cand) (delq (nth pos cand) cand)))))
+      (setq cand (wnn-uniq-candidates cand)
+           pos (wnn-candidate-pos bunsetsu cand)
+           converted (wnn-get-candidates-converted cand))
+      (wnn-set-candidate-info bunsetsu
+                             (wnn-zenkouho-create pos cand converted
+                                                  major prev-b next-b))
+      (wnn-add-freq-down head cand)
+      (cons pos converted))))
+
+(defun wnn-decide-candidate (bunsetsu pos prev-b next-b)
+  (let* ((head (car bunsetsu))
+        (cand-list (wnn-bunsetsu-get-zenkouho-list head))
+        (cand (nth pos cand-list))
+        (c-head (car cand)))
+    (wnn-bunsetsu-set-zenkouho-pos head pos)
+    (wnn-bunsetsu-set-change-top c-head (wnn-bunsetsu-get-change-top head))
+    (wnn-bunsetsu-set-freq-down c-head (wnn-bunsetsu-get-freq-down head))
+    (wnn-merge-fi-rel c-head bunsetsu)
+    (wnn-major-bunsetsu-set-context cand (wnn-bunsetsu-get-context head))
+    (wnn-set-candidate-info cand (wnn-bunsetsu-get-zenkouho head))
+    (if (and prev-b (null wnn-one-level-conversion))
+       (progn
+         (setq prev-b (list (egg-get-bunsetsu-tail prev-b)))
+         (wnn-bunsetsu-set-dai-continue (car prev-b)
+                                        (wnn-bunsetsu-connect-prev c-head))))
+    (if next-b
+       (setq next-b (list (car next-b))))
+    (list cand prev-b next-b)))
+
+(defun wnn-change-bunsetsu-length (bunsetsu prev-b next-b len major)
+  (let ((backend (egg-bunsetsu-get-backend (car bunsetsu)))
+       (env (wnn-bunsetsu-get-env (car bunsetsu)))
+       (tail (egg-get-bunsetsu-tail prev-b))
+       (yomi (wnn-get-major-bunsetsu-source bunsetsu))
+       (context (wnn-bunsetsu-get-context (car bunsetsu)))
+       yomi1 yomi2 hinshi fuzokugo new)
+    (if tail
+       (setq hinshi (wnn-bunsetsu-get-hinshi tail)
+             fuzokugo (wnn-bunsetsu-get-fuzokugo tail))
+      (setq hinshi -1
+           fuzokugo ""))
+    (setq yomi1 (substring yomi 0 len)
+         yomi2 (concat (substring yomi len)
+                       (wnn-get-major-bunsetsu-source next-b)))
+    (setq new (wnn-tanbunsetsu-conversion env yomi1 hinshi fuzokugo nil major))
+    (if (numberp new)
+       (egg-error "%s" (wnnrpc-get-error-message (- new))))
+    (if (and prev-b (null wnn-one-level-conversion))
+       (wnn-bunsetsu-set-dai-continue tail
+                                      (wnn-bunsetsu-connect-prev (car new))))
+    (wnn-bunsetsu-set-change-top (car new) t)
+    (wnn-merge-freq-down (car new) bunsetsu)
+    (wnn-merge-fi-rel (car new) bunsetsu)
+    (wnn-merge-fi-rel (car new) next-b)
+    (wnn-major-bunsetsu-set-context new context)
+    (if (= (length yomi2) 0)
+       (setq next-b nil)
+      (setq tail (egg-get-bunsetsu-tail new)
+           next-b (wnn-renbunsetsu-conversion env yomi2
+                                              (wnn-bunsetsu-get-hinshi tail)
+                                              (wnn-bunsetsu-get-fuzokugo tail)
+                                              nil context))
+      (if (numberp next-b)
+         (egg-error "%s" (wnnrpc-get-error-message (- next-b))))
+      (if (and (null major) (null wnn-one-level-conversion))
+         (wnn-bunsetsu-set-dai-continue
+          tail
+          (wnn-bunsetsu-connect-prev (car next-b)))))
+    (list new prev-b next-b)))
+
+(defun wnn-add-freq-down (bunsetsu down-list)
+  (let ((freq-down (wnn-bunsetsu-get-freq-down bunsetsu))
+       b-list b pair)
+    (while down-list
+      (setq b-list (car down-list)
+           down-list (cdr down-list))
+      (while b-list
+       (setq b (car b-list)
+             b-list (cdr b-list)
+             pair (cons (wnn-bunsetsu-get-dic-no b)
+                        (wnn-bunsetsu-get-entry b)))
+       (if (and (/= (wnn-bunsetsu-get-right-now b) 0)
+                (/= (car pair) -1)
+                (null (member pair freq-down)))
+           (setq freq-down (cons pair freq-down)))))
+    (wnn-bunsetsu-set-freq-down bunsetsu freq-down)))
+
+(defun wnn-merge-freq-down (bunsetsu b-list)
+  (let ((freq-down0 (wnn-bunsetsu-get-freq-down bunsetsu))
+       freq-down1)
+    (while b-list
+      (setq freq-down1 (wnn-bunsetsu-get-freq-down (car b-list))
+           b-list (cdr b-list))
+      (while freq-down1
+       (if (null (member (car freq-down1) freq-down0))
+           (setq freq-down0 (cons (car freq-down1) freq-down0)))
+       (setq freq-down1 (cdr freq-down1)))
+    (wnn-bunsetsu-set-freq-down bunsetsu freq-down0))))
+
+(defun wnn-merge-fi-rel (bunsetsu b-list)
+  (let ((fi-rel (cons nil (wnn-bunsetsu-get-fi-rel bunsetsu))))
+    (if (eq bunsetsu (car b-list))
+       (setq b-list (cdr b-list)))
+    (while b-list
+      (nconc fi-rel (wnn-bunsetsu-get-fi-rel (car b-list)))
+      (wnn-bunsetsu-set-fi-rel (car b-list) nil)
+      (setq b-list (cdr b-list)))
+    (wnn-bunsetsu-set-fi-rel bunsetsu (cdr fi-rel))))
+
+(defun wnn-bunsetsu-combinable-p (bunsetsu1 bunsetsu2)
+  (eq (wnn-bunsetsu-get-env bunsetsu1)
+      (wnn-bunsetsu-get-env bunsetsu2)))
+
+(defvar wnn-auto-save-dic-count 0)
+
+(defun wnn-end-conversion (bunsetsu-list abort)
+  (unless abort
+    (let* ((head (car bunsetsu-list))
+          (env (wnn-bunsetsu-get-env head)))
+      (prog1
+         (if (wnnenv-is-wnn6 env)
+             (progn
+               (wnn-clear-now-flag bunsetsu-list)
+               (wnn-merge-fi-rel head (cdr bunsetsu-list))
+               (wnnrpc-set-fi-priority env (wnn-bunsetsu-get-fi-rel head))
+               (wnn-optimize-in-local bunsetsu-list)
+               (wnn-optimize-in-server bunsetsu-list))
+           (wnn-clear-now-flag bunsetsu-list)
+           (wnn-count-up-frequency bunsetsu-list))
+       (setq wnn-auto-save-dic-count (1+ wnn-auto-save-dic-count))
+       (when (eq wnn-auto-save-dic-count wnn-auto-save-dictionaries)
+         (wnn-save-dictionaries env)
+         (setq wnn-auto-save-dic-count 0))))))
+
+(defun wnn-clear-now-flag (bunsetsu-list)
+  (let ((env (wnn-bunsetsu-get-env (car bunsetsu-list))))
+    (while bunsetsu-list
+      (setq fd (wnn-bunsetsu-get-freq-down (car bunsetsu-list))
+           bunsetsu-list (cdr bunsetsu-list))
+      (while fd
+       (wnnrpc-set-frequency env (caar fd) (cdar fd)
+                             (WNN-const IMA_OFF) (WNN-const HINDO_NOP))
+       (setq fd (cdr fd))))))
+
+(defun wnn-count-up-frequency (bunsetsu-list)
+  (let ((env (wnn-bunsetsu-get-env (car bunsetsu-list)))
+       (context (wnn-null-context))
+       dic-no entry b)
+    (while bunsetsu-list
+      (setq b (car bunsetsu-list)
+           bunsetsu-list (cdr bunsetsu-list)
+           dic-no (wnn-bunsetsu-get-dic-no b)
+           entry (wnn-bunsetsu-get-entry b)
+           context (cons (wnn-context-create dic-no entry
+                                             (wnn-bunsetsu-get-jirilen b)
+                                             (wnn-bunsetsu-get-hinshi b)
+                                             (wnn-bunsetsu-get-fuzokugo b)
+                                             (wnn-bunsetsu-get-converted b)
+                                             (wnn-bunsetsu-get-right-now b)
+                                             (wnn-bunsetsu-get-freq b))
+                         context))
+      (wnnrpc-set-frequency env dic-no entry 
+                           (WNN-const IMA_ON) (WNN-const HINDO_INC)))
+    (list (car context) (nth 1 context))))
+
+(defun wnn-optimize-in-local (bunsetsu-list)
+  (let ((env (wnn-bunsetsu-get-env (car bunsetsu-list)))
+       b prev-b next-b major-top entry hinshi)
+    (setq next-b (car bunsetsu-list)
+         bunsetsu-list (cdr bunsetsu-list))
+    (cond
+     ((eq (wnnenv-get-server-type env) 'jserver)
+      (while next-b
+       (setq major-top (null (and b (wnn-bunsetsu-get-dai-continue b)))
+             prev-b b
+             b next-b
+             next-b (car bunsetsu-list)
+             bunsetsu-list (cdr bunsetsu-list)
+             hinshi (wnn-bunsetsu-get-hinshi b))
+       (when (or
+              (and (/= (wnnenv-get-notrans env) (WNN-const DIC_RDONLY))
+                   (= (wnn-bunsetsu-get-dic-no b) -1)
+                   (or (= (wnn-bunsetsu-get-entry b) (WNN-const HIRAGANA))
+                       (= (wnn-bunsetsu-get-entry b) (WNN-const KATAKANA)))
+                   (>= (wnn-bunsetsu-get-jirilen b) (WNN-const LEARNING_LEN)))
+              (= (wnn-bunsetsu-get-entry b) (WNN-const IKEIJI_ENTRY)))
+         (setq entry (wnn-notrans-auto-learning b))
+         (when (/= entry -1)
+           (wnn-bunsetsu-set-dic-no b (WNN-const MUHENKAN_DIC))
+           (wnn-bunsetsu-set-entry b entry)))
+       (cond
+        ((and next-b
+              major-top
+              (wnn-bunsetsu-get-dai-continue b))
+         (wnn-adjacent-learning b next-b))
+        ((and prev-b
+              (= hinshi (wnnenv-get-hinshi env 'rendaku))
+              (equal (wnn-bunsetsu-get-fuzokugo prev-b) ""))
+         (wnn-adjacent-learning prev-b b))
+        ((and next-b
+              (= hinshi (wnnenv-get-hinshi env 'settou)))
+         (wnn-adjacent-learning b next-b))
+        ((and (/= (wnnenv-get-bmodify env) (WNN-const DIC_RDONLY))
+              (wnn-bunsetsu-get-change-top b)
+              next-b
+              (/= (wnn-bunsetsu-get-hinshi next-b)
+                  (wnnenv-get-hinshi env 'rendaku))
+              (/= hinshi (wnnenv-get-hinshi env 'settou)))
+         (wnn-bmodify-learning b next-b)))))
+     ((eq (wnnenv-get-server-type env) 'kserver)
+      ;; Soory, not implemented
+      nil))))
+
+(defun wnn-notrans-auto-learning (bunsetsu)
+  (let ((env (wnn-bunsetsu-get-env bunsetsu)))
+    (wnnrpc-auto-learning env (WNN-const NOTRANS_LEARN)
+                         (wnn-bunsetsu-get-yomi bunsetsu)
+                         (wnn-bunsetsu-get-converted bunsetsu)
+                         ""
+                         (if (= (wnn-bunsetsu-get-entry bunsetsu)
+                                (WNN-const IKEIJI_ENTRY))
+                             (wnn-bunsetsu-get-hinshi bunsetsu)
+                           (wnnenv-get-hinshi env 'noun))
+                         0)))
+
+(defun wnn-adjacent-learning (bunsetsu1 bunsetsu2)
+  (let ((env (wnn-bunsetsu-get-env bunsetsu1))
+       (yomi (concat (wnn-bunsetsu-get-yomi bunsetsu1)
+                     (wnn-bunsetsu-get-yomi bunsetsu2)))
+       (kanji (concat (wnn-bunsetsu-get-converted bunsetsu1)
+                      (wnn-bunsetsu-get-converted bunsetsu2)))
+       (hinshi (wnnenv-get-hinshi env 'noun)))
+    (if (= (wnnenv-get-bmodify env) (WNN-const DIC_RW))
+       (wnnrpc-auto-learning env (WNN-const BMODIFY_LEARN)
+                             yomi kanji "" hinshi 0)
+      (wnnrpc-temporary-learning env yomi kanji "" hinshi 0))))
+
+(defun wnn-bmodify-learning (bunsetsu1 bunsetsu2)
+  (let ((env (wnn-bunsetsu-get-env bunsetsu1))
+       (yomi (concat (wnn-bunsetsu-get-yomi bunsetsu1)
+                     (wnn-bunsetsu-get-fuzokugo bunsetsu1)
+                     (wnn-bunsetsu-get-yomi bunsetsu2)))
+       (kanji (concat (wnn-bunsetsu-get-converted bunsetsu1)
+                      (wnn-bunsetsu-get-fuzokugo bunsetsu1)
+                      (wnn-bunsetsu-get-converted bunsetsu2)))
+       (hinshi (wnn-bunsetsu-get-hinshi bunsetsu2)))
+    (wnnrpc-auto-learning env (WNN-const BMODIFY_LEARN)
+                         yomi kanji "" hinshi 0)))
+
+(defun wnn-optimize-in-server (bunsetsu-list)
+  (let ((env (wnn-bunsetsu-get-env (car bunsetsu-list)))
+       (context (wnn-bunsetsu-get-context (car bunsetsu-list)))
+       b)
+    (when (eq (wnnenv-get-server-type env) 'jserver)
+      (wnn-context-set-right-now (car context) (WNN-const HINDO_NOP))
+      (wnn-context-set-freq (car context) (WNN-const HINDO_NOP))
+      (wnn-context-set-right-now (nth 1 context) (WNN-const HINDO_NOP))
+      (wnn-context-set-freq (nth 1 context) (WNN-const HINDO_NOP))
+      (while bunsetsu-list
+       (setq b (car bunsetsu-list)
+             bunsetsu-list (cdr bunsetsu-list)
+             context (cons (wnn-context-create (wnn-bunsetsu-get-dic-no b)
+                                               (wnn-bunsetsu-get-entry b)
+                                               (wnn-bunsetsu-get-jirilen b)
+                                               (wnn-bunsetsu-get-hinshi b)
+                                               (wnn-bunsetsu-get-fuzokugo b)
+                                               (wnn-bunsetsu-get-converted b)
+                                               (WNN-const IMA_ON)
+                                               (WNN-const HINDO_INC))
+                           context)))
+      (prog1
+         (list (car context) (nth 1 context))
+       (wnnrpc-optimize-fi env (nreverse context))))))
+
+(defun wnn-finalize-backend (lang &optional action)
+  (let* ((save-inhibit-quit inhibit-quit)
+        (inhibit-quit t)
+        (server-info (wnn-server-get-info lang))
+        (server-type (wnn-server-type server-info))
+        (env-list wnn-environments)
+        env proc-list saved)
+    (when server-type
+      (while env-list
+       (setq env (car env-list)
+             env-list (cdr env-list))
+       (if (eq (wnnenv-get-server-type env) server-type)
+           (condition-case err
+               (progn
+                 (unless (memq (wnnenv-get-proc env) proc-list)
+                   (setq proc-list (cons (wnnenv-get-proc env) proc-list)))
+                 (unless (eq action 'disconnect-only)
+                   (unless saved
+                     (setq saved t)
+                     (message (egg-get-message 'wnn-dict-saving)
+                              (wnn-server-proc-name server-info)))
+                   (let ((inhibit-quit save-inhibit-quit))
+                     (wnn-save-dictionaries env)))
+                 (unless (eq action 'save-only)
+                   (wnnrpc-disconnect env)))
+             ((error quit)
+              (message "signal %S occured when dictionary saving" err)))))
+      (if saved
+         (message (egg-get-message 'wnn-dict-saved)
+                  (wnn-server-proc-name server-info)))
+      (unless (eq action 'save-only)
+       (while proc-list
+         (if (and (car proc-list)
+                  (eq (process-status (car proc-list)) 'open))
+             (wnnrpc-close (car proc-list)))
+         (setq proc-list (cdr proc-list)))))))
+
+(defun wnn-close (lang)
+  "Save dictionaries and close the Wnn session."
+  (interactive (list (wnn-read-active-lang)))
+  (or (listp lang)
+      (setq lang (list lang)))
+  (while lang
+    (wnn-finalize-backend (car lang))
+    (setq lang (cdr lang))))
+
+(defun wnn-disconnect (lang)
+  "Disconnect the Wnn session without dictionary saving."
+  (interactive (list (wnn-read-active-lang)))
+  (or (listp lang)
+      (setq lang (list lang)))
+  (while lang
+    (wnn-finalize-backend (car lang) 'disconnect-only)
+    (setq lang (cdr lang))))
+
+(defun wnn-dictionary-save (lang)
+  "Save Wnn dictionaries."
+  (interactive (list (wnn-read-active-lang)))
+  (or (listp lang)
+      (setq lang (list lang)))
+  (while lang
+    (wnn-finalize-backend (car lang) 'save-only)
+    (setq lang (cdr lang))))
+
+(defun wnn-read-active-lang ()
+  (let ((completion-ignore-case t)
+       (env wnn-environments)
+       langs server server-list)
+    (while env
+      (setq server (wnnenv-get-server-type (car env))
+           env (cdr env))
+      (if (null (memq server server-list))
+         (setq server-list (cons server server-list))))
+    (setq langs (delq nil
+                     (mapcar (lambda (info)
+                               (if (memq (wnn-server-type info) server-list)
+                                   (wnn-server-language info)))
+                             wnn-server-info-list)))
+    (if (<= (length langs) 1)
+       langs
+      (setq langs (cons (cons "All" langs)
+                       (mapcar (lambda (lang) (cons (symbol-name lang) lang))
+                               langs)))
+      (cdr (assoc (completing-read "language? " langs nil t nil nil "All")
+                 langs)))))
+\f
+;;
+(defun wnn-comm-sentinel (proc reason) ; assume it is close
+  (let ((inhibit-quit t))
+    (kill-buffer (process-buffer proc))
+    ;; delete env from the list.
+    (setq wnn-environments
+         (delq nil (mapcar (lambda (env)
+                             (if (null (eq (wnnenv-get-proc env) proc))
+                                 env))
+                             wnn-environments)))))
+
+(defun wnn-open (server-info)
+  "Establish the connection to WNN server.  Return process object."
+  ;; Open the session to WNN server,
+  (let ((save-inhibit-quit inhibit-quit)
+       (inhibit-quit t)
+       (server-type (wnn-server-type server-info))
+       (port (wnn-server-port server-info))
+       (hostname-list (wnn-server-hostname server-info))
+       (proc-name (wnn-server-proc-name server-info))
+       (msg-form "Wnn: connecting to %S at %s...")
+       (user-name (user-login-name))
+       buf hostname myname port-off proc result msg)
+    (unwind-protect
+       (progn
+         (setq buf (generate-new-buffer (wnn-server-buffer-name server-info)))
+         (save-excursion
+           (set-buffer buf)
+           (erase-buffer)
+           (buffer-disable-undo)
+           (set-buffer-multibyte nil)
+           (setq egg-fixed-euc (wnn-server-coding-system server-info)))
+         (or (consp hostname-list)
+             (setq hostname-list (list hostname-list)))
+         (while (and hostname-list (null proc))
+           (setq hostname (or (car hostname-list) "")
+                 hostname-list (cdr hostname-list)
+                 myname (if (equal hostname "") "unix" wnn-system-name))
+           (if (null (string-match ":" hostname))
+               (setq port-off 0)
+             (setq port-off (string-to-int (substring hostname (match-end 0)))
+                   hostname (substring hostname 0 (match-beginning 0))))
+           (and (equal hostname "") (setq hostname "localhost"))
+           (let ((inhibit-quit save-inhibit-quit))
+             (if (and msg
+                      (null (y-or-n-p (format "%s failed. Try to %s? "
+                                              msg hostname))))
+                 (egg-error "abort connect")))
+           (setq msg (format "Wnn: connecting to %S at %s..."
+                             server-type hostname))
+           (message "%s" msg)
+           (let ((inhibit-quit save-inhibit-quit))
+             (condition-case nil
+                 (setq proc (open-network-stream proc-name buf hostname
+                                                 (+ port port-off)))
+               ((error quit))))
+           (when proc
+             (process-kill-without-query proc)
+             (set-process-coding-system proc 'no-conversion 'no-conversion)
+             (set-process-sentinel proc 'wnn-comm-sentinel)
+             (set-marker-insertion-type (process-mark proc) t)
+             (setq result (wnnrpc-open proc myname user-name))
+             (when (numberp result)
+               (delete-process proc)
+               (setq proc nil))))
+         (cons proc result))
+      (if proc
+         (message (concat msg "done"))
+       (if buf (kill-buffer buf))
+       (egg-error 'wnn-connect-error)))))
+
+(defvar wnn-envspec-list nil)
+(defvar wnn-current-envspec nil)
+(defvar wnn-current-envspec-reverse nil)
+(defvar wnn-server-type nil)
+(defvar wnn-wnn6-server nil)
+
+(defmacro wnn-envspec-conv-param-name-list ()
+  ''(last-is-first complex okuri-learn okuri
+     prefix-learn prefix suffix-learn common-learn freq-func
+     numeric alphabet symbol yuragi rendaku bunsetsugiri muhenkan
+     fi-relation-learn fi-freq-func))
+
+(defmacro wnn-envspec-conv-param-length ()
+  (length (wnn-envspec-conv-param-name-list)))
+
+(defun wnn-envspec-create (env-name tankan stickey)
+  (vector (and env-name (setq env-name (intern env-name)))
+         (wnn-make-backend egg-language env-name)
+         tankan stickey nil nil
+         0 (make-vector (wnn-envspec-conv-param-length) 0)
+         (list nil) (list nil) (list nil)))
+
+(defsubst wnn-envspec-env-type (spec)           (aref spec 0))
+(defsubst wnn-envspec-backend (spec)            (aref spec 1))
+(defsubst wnn-envspec-tankan (spec)             (aref spec 2))
+(defsubst wnn-envspec-sticky (spec)             (aref spec 3))
+(defsubst wnn-envspec-param (spec)              (aref spec 4))
+(defsubst wnn-envspec-fuzokugo (spec)           (aref spec 5))
+(defsubst wnn-envspec-conv-vmask (spec)         (aref spec 6))
+(defsubst wnn-envspec-conv-param (spec)         (aref spec 7))
+(defsubst wnn-envspec-dic-list (spec)           (cdr (aref spec 8)))
+(defsubst wnn-envspec-fi-dic-list (spec)        (cdr (aref spec 9)))
+(defsubst wnn-envspec-autolearn-dic-list (spec) (cdr (aref spec 10)))
+
+(defsubst wnn-envspec-set-param (spec param)
+  (aset spec 4 param))
+(defsubst wnn-envspec-set-fuzokugo (spec fzk)
+  (aset spec 5 fzk))
+(defsubst wnn-envspec-set-conv-vmask (spec val)
+  (aset spec 6 val))
+(defsubst wnn-envspec-set-conv-param (spec num val)
+  (aset (aref spec 7) num val))
+(defsubst wnn-envspec-add-dic-list (spec &rest dic)
+  (nconc (aref spec 8) (list (apply 'vector dic))))
+(defsubst wnn-envspec-add-fi-dic-list (spec &rest dic)
+  (nconc (aref spec 9) (list (apply 'vector dic))))
+(defsubst wnn-envspec-add-autolearn-dic-list (spec type &rest dic)
+  (nconc (aref spec 10) (list (cons type (apply 'vector dic)))))
+
+(eval-when-compile
+  (defun wnn-conv-param (param)
+    (- (wnn-envspec-conv-param-length)
+       (length (memq param (wnn-envspec-conv-param-name-list))))))
+
+(defmacro define-wnn-conv-param-func ()
+  (let ((name-list (wnn-envspec-conv-param-name-list))
+       (defs (list 'progn))
+       n set get)
+    (while name-list
+      (setq n (car name-list)
+           name-list (cdr name-list)
+           set (intern (format "wnn-envspec-set-conv-param-%s" n))
+           get (intern (format "wnn-get-conv-param-%s" n)))
+      (nconc defs `((defsubst ,set (spec val)
+                     (wnn-envspec-set-conv-param spec ,(wnn-conv-param n) val)
+                     (wnn-envspec-set-conv-vmask
+                      spec (logior (wnn-envspec-conv-vmask spec)
+                                   ,(lsh 1 (wnn-conv-param n)))))
+                   (defsubst ,get (param)
+                     (aref param ,(wnn-conv-param n))))))
+    defs))
+
+(define-wnn-conv-param-func)
+
+(defmacro wnn-arg-type-error (func)
+  `(egg-error ,(format "%s: Wrong type argument" func)))
+
+(defun wnn-define-environment (reverse &optional env-name tankan stickey)
+  "Define a Wnn environment for normal/reverse conversion according
+to REVERSE.  ENV-NAME specifies suffix of the Wnn environment name.
+Make single character conversion (Tan-Kanji conversion) environment,
+if tankan is non-NIL.  Make the environment as sticky, if STICKEY
+is non-NIL."
+  (if (and env-name (null (stringp env-name)))
+      (wnn-arg-type-error wnn-define-environment))
+  (setq env-name (if reverse (concat env-name "R") env-name)
+       wnn-current-envspec (wnn-envspec-create env-name tankan stickey)
+       wnn-current-envspec-reverse reverse
+       wnn-envspec-list (nconc wnn-envspec-list 
+                               (list wnn-current-envspec))))
+
+(defun wnn-set-fuzokugo (filename)
+  (cond ((equal filename "")
+        (setq filename nil))
+       ((null (stringp filename))
+        (wnn-arg-type-error wnn-set-fuzokugo)))
+  (wnn-envspec-set-fuzokugo wnn-current-envspec filename))
+
+(defmacro wnn-add-dict-param-check (func
+                                   dict &optional freq prior drw dmax frw fmax
+                                   dpass fpass rev)
+  `(progn
+     (if (or (and (null (stringp ,dict)) (null (stringp (car-safe ,dict))))
+            ,@(if freq
+                  `((and ,freq (null (stringp ,freq))
+                         (null (stringp (car-safe ,freq))))))
+            ,@(if prior `((null (integerp ,prior))))
+            ,@(if drw
+                  `((null (or (eq ,drw nil) (eq ,drw t)
+                              (eq ,drw 0) (eq ,drw 1)
+                              ,@(if dmax
+                                    `((and wnn-wnn6-server
+                                           ,@(let ((x `((eq ,drw 2))))
+                                               (when (>= dmax 3)
+                                                 (nconc x `((eq ,drw 3))))
+                                               (when (>= dmax 4)
+                                                 (nconc x `((eq ,drw 4))))
+                                               x))))))))
+            ,@(if frw
+                  `((null (or (eq ,frw nil) (eq ,frw t)
+                              (eq ,frw 0) (eq ,frw 1)
+                              ,@(if fmax
+                                    `((and wnn-wnn6-server
+                                           ,@(let ((x `((eq ,frw 2))))
+                                               (when (>= fmax 3)
+                                                 (nconc x `((eq ,frw 3))))
+                                               (when (>= fmax 4)
+                                                 (nconc x `((eq ,frw 4))))
+                                               x))))))))
+            ,@(if dpass `((and ,dpass (null (stringp ,dpass)))))
+            ,@(if fpass `((and ,fpass (null (stringp ,fpass))))))
+        (wnn-arg-type-error ,func))
+     (if (or (equal ,dict "") (equal (car-safe ,dict) ""))
+        (egg-error ,(format "%s: Dictionary name should not be null." func)))
+     ,@(if freq
+          `((if (or (equal ,freq "") (equal (car-safe ,freq) ""))
+                (setq ,freq nil))))
+     ,@(if rev
+          `((setq ,rev (if ,rev (car ,rev) wnn-current-envspec-reverse))))))
+
+(defmacro wnn-wnn6-env-func (func)
+  `(or wnn-wnn6-server
+       (egg-error ,(format "%s is available only on Wnn6" func))))
+
+(defun wnn-add-dict (dict freq priority dict-rw freq-rw
+                    &optional dict-passwd freq-passwd &rest reverse)
+  (wnn-add-dict-param-check wnn-add-dict
+                           dict freq priority dict-rw 4 freq-rw 2
+                           dict-passwd freq-passwd reverse)
+  (wnn-envspec-add-dic-list wnn-current-envspec
+                           dict freq priority dict-rw freq-rw
+                           dict-passwd freq-passwd reverse))
+
+(defun wnn-add-fisys-dict (dict freq freq-rw &optional freq-passwd)
+  (wnn-wnn6-env-func wnn-add-fisys-dict)
+  (wnn-add-dict-param-check wnn-add-fisys-dict
+                           dict freq nil nil nil freq-rw 3
+                           nil freq-passwd)
+  (wnn-envspec-add-fi-dic-list wnn-current-envspec
+                              dict freq t nil freq-rw nil freq-passwd nil))
+
+(defun wnn-add-fiusr-dict (dict freq dict-rw freq-rw
+                          &optional dict-passwd freq-passwd)
+  (wnn-wnn6-env-func wnn-add-fiusr-dict)
+  (wnn-add-dict-param-check wnn-add-fiusr-dict
+                           dict freq nil dict-rw 3 freq-rw 3
+                           dict-passwd freq-passwd)
+  (wnn-envspec-add-fi-dic-list wnn-current-envspec
+                              dict freq nil dict-rw freq-rw
+                              dict-passwd freq-passwd nil))
+
+(defun wnn-add-notrans-dict (dict priority dict-rw 
+                            &optional dict-passwd &rest reverse)
+  (wnn-wnn6-env-func wnn-add-notrans-dict)
+  (wnn-add-dict-param-check wnn-add-notrans-dict
+                           dict nil priority dict-rw nil nil nil
+                           dict-passwd nil reverse)
+  (wnn-envspec-add-autolearn-dic-list wnn-current-envspec
+                                     (WNN-const NOTRANS_LEARN)
+                                     dict nil priority dict-rw nil
+                                     dict-passwd nil reverse))
+
+(defun wnn-add-bmodify-dict (dict priority dict-rw
+                            &optional dict-passwd &rest reverse)
+  (wnn-wnn6-env-func wnn-add-notrans-dict)
+  (wnn-add-dict-param-check wnn-add-bmodify-dict
+                           dict nil priority dict-rw nil nil nil
+                           dict-passwd nil reverse)
+  (wnn-envspec-add-autolearn-dic-list wnn-current-envspec
+                                     (WNN-const BMODIFY_LEARN)
+                                     dict nil priority dict-rw nil
+                                     dict-passwd nil reverse))
+
+(defun wnn-set-param (&rest args)
+  (if (/= (length args) 17)
+      (egg-error "wnn-set-param: Wrong number of arguments"))
+  (mapcar (lambda (n)
+           (if (null (integerp n))
+               (wnn-arg-type-error wnn-set-param)))
+         args)
+  (wnn-envspec-set-param wnn-current-envspec (apply 'vector args)))
+
+(defmacro wnn-boolean-param-check (func flag)
+  `(setq ,flag (cond ((or (eq ,flag 0) (eq ,flag nil)) 0)
+                    ((or (eq ,flag 1) (eq ,flag t))   1)
+                    (t (wnn-arg-type-error ,func)))))
+
+(defun wnn-set-last-is-first-mode (flag)
+  (wnn-wnn6-env-func wnn-set-last-is-first-mode)
+  (wnn-boolean-param-check wnn-set-last-is-first-mode flag)
+  (wnn-envspec-set-conv-param-last-is-first wnn-current-envspec flag))
+
+(defun wnn-set-complex-conv-mode (flag)
+  (wnn-wnn6-env-func wnn-set-complex-conv-mode)
+  (wnn-boolean-param-check wnn-set-complex-conv-mode flag)
+  (wnn-envspec-set-conv-param-complex wnn-current-envspec flag))
+
+(defun wnn-set-okuri-learn-mode (flag)
+  (wnn-wnn6-env-func wnn-set-okuri-learn-mode)
+  (wnn-boolean-param-check wnn-set-okuri-learn-mode flag)
+  (wnn-envspec-set-conv-param-okuri-learn wnn-current-envspec flag))
+
+(defun wnn-set-okuri-flag (mode)
+  (wnn-wnn6-env-func wnn-set-okuri-flag)
+  (setq mode (cond ((or (eq mode -1) (eq mode 'regulation)) -1)
+                  ((or (eq mode  0) (eq mode 'no))          0)
+                  ((or (eq mode  1) (eq mode 'yes))         1)
+                  (t (wnn-arg-type-error wnn-set-okuri-flag))))
+  (wnn-envspec-set-conv-param-okuri wnn-current-envspec mode))
+
+(defun wnn-set-prefix-learn-mode (flag)
+  (wnn-wnn6-env-func wnn-set-prefix-learn-mode)
+  (wnn-boolean-param-check wnn-set-prefix-learn-mode flag)
+  (wnn-envspec-set-conv-param-prefix-learn wnn-current-envspec flag))
+
+(defun wnn-set-prefix-flag (mode)
+  (wnn-wnn6-env-func wnn-set-prefix-flag)
+  (setq mode (cond ((or (eq mode 0) (eq mode 'hiragana)) 0)
+                  ((or (eq mode 1) (eq mode 'kanji))    1)
+                  (t (wnn-arg-type-error wnn-set-prefix-flag))))
+  (wnn-envspec-set-conv-param-prefix wnn-current-envspec mode))
+
+(defun wnn-set-suffix-learn-mode (flag)
+  (wnn-wnn6-env-func wnn-set-suffix-learn-mode)
+  (wnn-boolean-param-check wnn-set-suffix-learn-mode flag)
+  (wnn-envspec-set-conv-param-suffix-learn wnn-current-envspec flag))
+
+(defun wnn-set-common-learn-mode (flag)
+  (wnn-wnn6-env-func wnn-set-common-learn-mode)
+  (wnn-boolean-param-check wnn-set-common-learn-mode flag)
+  (wnn-envspec-set-conv-param-common-learn wnn-current-envspec flag))
+
+(defun wnn-set-freq-func-mode (mode)
+  (wnn-wnn6-env-func wnn-set-freq-func-mode)
+  (setq mode (cond ((or (eq mode 0) (eq mode 'not))    0)
+                  ((or (eq mode 1) (eq mode 'always)) 1)
+                  ((or (eq mode 2) (eq mode 'high))   2)
+                  ((or (eq mode 3) (eq mode 'normal)) 3)
+                  ((or (eq mode 4) (eq mode 'low))    4)
+                  (t (wnn-arg-type-error wnn-set-freq-func-mode))))
+  (wnn-envspec-set-conv-param-freq-func wnn-current-envspec mode))
+
+(defun wnn-set-numeric-mode (mode)
+  (wnn-wnn6-env-func wnn-set-numeric-mode)
+  (setq mode (cond ((or (eq mode  -2) (eq mode 'han))       -2)
+                  ((or (eq mode -12) (eq mode 'zen))      -12)
+                  ((or (eq mode -13) (eq mode 'kan))      -13)
+                  ((or (eq mode -15) (eq mode 'kansuuji)) -15)
+                  ((or (eq mode -16) (eq mode 'kanold))   -16)
+                  ((or (eq mode -17) (eq mode 'hancan))   -17)
+                  ((or (eq mode -18) (eq mode 'zencan))   -18)
+                  (t (wnn-arg-type-error wnn-set-numeric-mode))))
+  (wnn-envspec-set-conv-param-numeric wnn-current-envspec mode))
+
+(defun wnn-set-alphabet-mode (mode)
+  (wnn-wnn6-env-func wnn-set-alphabet-mode)
+  (setq mode (cond ((or (eq mode  -4) (eq mode 'han))  -4)
+                  ((or (eq mode -30) (eq mode 'zen)) -30)
+                  (t (wnn-arg-type-error wnn-set-alphabet-mode))))
+  (wnn-envspec-set-conv-param-alphabet wnn-current-envspec mode))
+
+(defun wnn-set-symbol-mode (mode)
+  (wnn-wnn6-env-func wnn-set-symbol-mode)
+  (setq mode (cond ((or (eq mode  -5) (eq mode 'han))  -5)
+                  ((or (eq mode -40) (eq mode 'jis)) -40)
+                  ((or (eq mode -41) (eq mode 'asc)) -41)
+                  (t (wnn-arg-type-error wnn-set-symbol-mode))))
+  (wnn-envspec-set-conv-param-symbol wnn-current-envspec mode))
+
+(defun wnn-set-yuragi-mode (flag)
+  (wnn-wnn6-env-func wnn-set-yuragi-mode)
+  (wnn-boolean-param-check wnn-set-yuragi-mode flag)
+  (wnn-envspec-set-conv-param-yuragi wnn-current-envspec flag))
+
+(defun wnn-set-rendaku-mode (flag)
+  (wnn-wnn6-env-func wnn-set-rendaku-mode)
+  (wnn-boolean-param-check wnn-set-rendaku-mode flag)
+  (wnn-envspec-set-conv-param-rendaku wnn-current-envspec flag))
+\f
+(defun wnn-renbunsetsu-conversion (env yomi hinshi fuzokugo v context)
+  (let ((result
+        (cond
+         ((wnnenv-get-tankan env)
+          (wnnrpc-tanbunsetsu-conversion env yomi hinshi fuzokugo v))
+         ((wnnenv-is-wnn6 env)
+          (wnnrpc-fi-renbunsetsu-conversion env yomi hinshi fuzokugo v
+                                            context))
+         (t
+          (wnnrpc-renbunsetsu-conversion env yomi hinshi fuzokugo v)))))
+    (prog1
+       result
+      (if wnn-one-level-conversion
+         (while (consp result)
+           (wnn-bunsetsu-set-dai-continue (car result) nil)
+           (setq result (cdr result)))))))
+
+(defun wnn-tanbunsetsu-conversion (env yomi hinshi fuzokugo v major)
+  (if (or (null major)
+         wnn-one-level-conversion
+         (wnnenv-get-tankan env))
+      (wnnrpc-tanbunsetsu-conversion env yomi hinshi fuzokugo v)
+    (wnnrpc-daibunsetsu-conversion env yomi hinshi fuzokugo v)))
+
+(defun wnn-get-bunsetsu-candidates (env yomi hinshi fuzokugo v major)
+  (cond
+   ((or wnn-one-level-conversion
+       (wnnenv-get-tankan env))
+    (let ((result (wnnrpc-get-bunsetsu-candidates env yomi hinshi fuzokugo v)))
+      (prog1
+         result
+       (while (consp result)
+         (wnn-bunsetsu-set-dai-continue (caar result) nil)
+         (setq result (cdr result))))))
+   ((null major)
+    (wnnrpc-get-bunsetsu-candidates env yomi hinshi fuzokugo v))
+   (t
+    (wnnrpc-get-daibunsetsu-candidates env yomi hinshi fuzokugo v))))
+
+(defsubst wnn-filename (p)
+  (substitute-in-file-name
+   (if (consp p) (concat wnn-usr-dic-dir "/" (car p)) p)))
+
+(defsubst wnn-client-file-p (filename)
+  (and (stringp filename)
+       (= (aref filename 0) ?!)))
+
+(defsubst wnn-client-filename (filename)
+  (substitute-in-file-name (expand-file-name (substring filename 1) "~")))
+
+(defun wnn-open-file (env filename)
+  "Open the file FILENAME on the environment ENV.
+Return file ID.  NIL means NO-file.
+On failure, return negative error code."
+  (and filename
+       (if (wnn-client-file-p filename)
+          (wnnrpc-file-send env (wnn-client-filename filename))
+        (wnnrpc-file-read env (wnn-filename filename)))))
+
+(defun wnn-create-directory (env path noquery)
+  "Create directory to the path.  Retun non-NIL value on success."
+  (if (wnn-client-file-p path)
+      (let ((local-name (directory-file-name (file-name-directory
+                                             (wnn-client-filename path)))))
+       (cond
+        ((file-directory-p local-name) t)
+        ((or noquery
+             (y-or-n-p (format (egg-get-message 'wnn-dir-missing)
+                               (file-name-directory path))))
+         (make-directory local-name t)
+         (if (file-directory-p local-name)
+             (progn
+               (message (egg-get-message 'wnn-dir-created) path)
+               t)
+           (message (egg-get-message 'wnn-dir-failed) path)
+           nil))))
+    (let ((name (directory-file-name (file-name-directory
+                                     (wnn-filename path))))
+         create-list)
+      (setq path name)
+      (while (and name (/= (wnnrpc-access env name 0) 0))
+       (setq create-list (cons name create-list)
+             name (file-name-directory name)
+             name (and name (directory-file-name name))))
+      (or (null create-list)
+         (if (or noquery
+                 (y-or-n-p (format (egg-get-message 'wnn-dir-missing) path)))
+             (let ((result 0))
+               (while (and (>= result 0) create-list)
+                 (setq result (wnnrpc-mkdir env (car create-list))
+                       create-list (cdr create-list)))
+               (if (>= result 0)
+                   (progn
+                     (message (egg-get-message 'wnn-dir-created) path)
+                     t)
+                 (message (egg-get-message 'wnn-dir-failed) path)
+                 nil)))))))
+
+(defun wnn-file-remove (proc filename passwd)
+  (let ((result (if (wnn-client-file-p filename)
+                   (wnnrpc-file-remove-client
+                    proc (wnn-client-filename filename) passwd)
+                 (wnnrpc-file-remove proc (wnn-filename filename) passwd))))
+    (or (= result 0)
+       (progn
+         (message (wnnrpc-get-error-message (- result)))
+         nil))))
+
+(defun wnn-open-dictionary (env fi name rw comment dpasswd fpasswd
+                               &optional noquery)
+  (let ((dic-id (wnn-open-file env name)))
+    (cond
+     ((null dic-id)
+      (message "Wnn: cannot omit dictionary name")
+      nil)
+     ((>= dic-id 0) dic-id)
+     ((or (null rw) (/= dic-id (- (WNN-const NO_EXIST))))
+      (message (egg-get-message 'wnn-dict-missing-1)
+              name (wnnrpc-get-error-message (- dic-id)))
+      nil)
+     ((and (or noquery
+              (y-or-n-p (format (egg-get-message 'wnn-dict-missing-2) name)))
+          (wnn-create-directory env name noquery)
+          (wnn-create-dictionary env name (wnnrpc-writable-dic-type env fi rw)
+                                 comment dpasswd fpasswd))
+      (message (egg-get-message 'wnn-dict-created) name)
+      (setq dic-id (wnn-open-file env name))
+      (if (>= dic-id 0)
+         dic-id
+       (message "%s" (wnnrpc-get-error-message (- dic-id)))
+       nil)))))
+
+(defun wnn-create-dictionary (env name type comment dpasswd fpasswd)
+  "Create a dictionary file on the server or the client depending on name."
+  (let ((result (if (wnn-client-file-p name)
+                   (wnnrpc-dic-file-create-client
+                    env (wnn-client-filename name) type
+                    comment dpasswd fpasswd)
+                 (wnnrpc-dic-file-create
+                  env (wnn-filename name) type comment dpasswd fpasswd))))
+    (or (= result 0)
+       (progn
+         (message (wnnrpc-get-error-message (- result)))
+         nil))))
+
+(defun wnn-open-frequency (env fi dic-id name rw comment passwd)
+  (let ((freq-id (wnn-open-file env name)))
+    (cond
+     ((null freq-id) -1)
+     ((>= freq-id 0) freq-id)
+     ((or (null rw) (/= freq-id (- (WNN-const NO_EXIST))))
+      (message (egg-get-message 'wnn-freq-missing-1)
+              name (wnnrpc-get-error-message (- freq-id)))
+      nil)
+     ((and (y-or-n-p
+           (format (egg-get-message 'wnn-freq-missing-2) name))
+          (wnn-create-directory env name nil)
+          (wnn-create-frequency env fi dic-id name comment passwd))
+      (message (egg-get-message 'wnn-freq-created) name)
+      (setq freq-id (wnn-open-file env name))
+      (if (>= freq-id 0)
+         freq-id
+       (message "%s" (wnnrpc-get-error-message (- dic-id)))
+       nil)))))
+
+(defun wnn-create-frequency (env fi dic-id name comment passwd)
+  "Create a frequency file on the server or the client depending on name."
+  (let ((result (if (wnn-client-file-p name)
+                   (wnnrpc-hindo-file-create-client
+                    env fi dic-id (wnn-client-filename name) comment passwd)
+                 (wnnrpc-hindo-file-create
+                  env fi dic-id (wnn-filename name) comment passwd))))
+    (or (= result 0)
+       (progn
+         (message (wnnrpc-get-error-message (- result)))
+         nil))))
+
+(defun wnn-set-dictionary (env fi dic-spec)
+  ""
+  (let ((dname (aref dic-spec 0))
+       (fname (aref dic-spec 1))
+       (prior (aref dic-spec 2))
+       (drw   (aref dic-spec 3))
+       (frw   (aref dic-spec 4))
+       (dpass (aref dic-spec 5))
+       (fpass (aref dic-spec 6))
+       (rev   (aref dic-spec 7))
+       did fid result)
+    (cond
+     ((numberp (setq dpass (wnnrpc-read-passwd-file dpass)))
+      (message "%s" (wnnrpc-get-error-message (- dpass)))
+      nil)
+     ((numberp (setq fpass (if fname (wnnrpc-read-passwd-file fpass) "")))
+      (message "%s" (wnnrpc-get-error-message (- fpass)))
+      nil)
+     ((and (setq did (wnn-open-dictionary env fi dname drw "" dpass fpass))
+          (setq fid (wnn-open-frequency env fi did fname frw "" fpass)))
+      (if fi
+         (setq result (wnnrpc-set-fi-dictionary env did fid prior drw frw
+                                                dpass fpass))
+       (setq drw (cond ((eq drw (WNN-const DIC_GROUP)) (WNN-const DIC_RW))
+                       ((eq drw (WNN-const DIC_MERGE)) (WNN-const DIC_RDONLY))
+                       (t drw))
+             result (wnnrpc-set-dictionary env did fid prior drw frw
+                                           dpass fpass rev)))
+      (cond
+       ((>= result 0) t)
+       ((or (null frw) (/= result (- (WNN-const NO_MATCH))))
+       (message "%s (%s): %s"
+                dname (if fname fname "")
+                (wnnrpc-get-error-message (- result)))
+       nil)
+       ((and (y-or-n-p (format (egg-get-message 'wnn-no-match) fname))
+            (>= (wnnrpc-file-discard env fid) 0)
+            (wnn-file-remove proc fname fpass)
+            (wnn-create-frequency env fi did fname "" fpass))
+       (message (egg-get-message 'wnn-re-create-freq) fname)
+       (and (>= (setq fid (wnn-open-file env fname)) 0)
+            (>= (wnnrpc-set-dictionary env 
+                                       did fid prior drw frw
+                                       dpass fpass rev)
+                0))))))))
+
+(defun wnn-temporary-dic-add (env rev)
+  (let ((result (wnnrpc-temporary-dic-loaded env)))
+    (if (= result 0)
+       (wnnrpc-temporary-dic-add env rev)
+      result)))
+
+(defun wnn-set-autolearn-dictionary (env type dic-spec)
+  (let ((dname (aref dic-spec 0))
+       (prior (aref dic-spec 2))
+       (drw   (aref dic-spec 3))
+       (dpass (aref dic-spec 5))
+       (rev   (aref dic-spec 7))
+       (did (wnnrpc-get-autolearning-dic env type))
+       result)
+    (or (numberp drw)
+       (setq drw (if drw 0 1)))
+    (cond
+     ((< did 0)
+      (message "%s" (wnnrpc-get-error-message (- did)))
+      nil)
+     ((> did 0)
+      (setq result (wnn-temporary-dic-add env rev))
+      (if (>= result 0)
+         drw
+       (message "%s" (wnnrpc-get-error-message (- result)))
+       nil))
+     ((numberp (setq dpass (wnnrpc-read-passwd-file dpass)))
+      (message "%s" (wnnrpc-get-error-message (- dpass)))
+      nil)
+     ((setq did (wnn-open-dictionary env nil dname t "" dpass "" t))
+      (if (and (>= (setq did (wnnrpc-set-dictionary env did -1 prior drw drw
+                                                   dpass "" rev))
+                  0)
+              (>= (setq did (wnnrpc-set-autolearning-dic env type did)) 0)
+              (>= (setq did (wnn-temporary-dic-add env rev)) 0))
+         drw
+       (message "%s" (wnnrpc-get-error-message (- did)))
+       nil)))))
+
+(defun wnn-search-environment (backend)
+  (let ((env-list wnn-environments)
+       env)
+    (while (and (null env) env-list)
+      (setq env (and (eq (wnnenv-get-backend (car env-list)) backend)
+                    (car env-list))
+           env-list (cdr env-list)))
+    env))
+
+(defun wnn-v3-eggrc-defines ()
+  (if (null (fboundp 'set-wnn-reverse))
+      (progn
+       (fset 'set-wnn-reverse
+             (lambda (arg)
+               (wnn-define-environment arg
+                                       (and (or (eq wnn-server-type 'cserver)
+                                                (eq wnn-server-type 'tserver))
+                                            "PZ"))))
+       (fset 'is-wnn6-server (lambda () wnn-wnn6-server))
+       (fset 'set-wnn-fuzokugo 'wnn-set-fuzokugo)
+       (fset 'add-wnn-dict 'wnn-add-dict)
+       (fset 'set-wnn-param 'wnn-set-param)
+       (fset 'add-wnn-fisys-dict 'wnn-add-fisys-dict)
+       (fset 'add-wnn-fiusr-dict 'wnn-add-fiusr-dict)
+       (fset 'add-wnn-notrans-dict 'wnn-add-notrans-dict)
+       (fset 'add-wnn-bmodify-dict 'wnn-add-bmodify-dict)
+       (fset 'set-last-is-first-mode 'wnn-set-last-is-first-mode)
+       (fset 'set-complex-conv-mode 'wnn-set-complex-conv-mode)
+       (fset 'set-okuri-flag 'wnn-set-okuri-flag)
+       (fset 'set-prefix-learn-mode 'wnn-set-prefix-learn-mode)
+       (fset 'set-suffix-learn-mode 'wnn-set-suffix-learn-mode)
+       (fset 'set-common-learn-mode 'wnn-set-common-learn-mode)
+       (fset 'set-yuragi-mode 'wnn-set-yuragi-mode)
+       (fset 'set-freq-func-mode 'wnn-set-freq-func-mode)
+       (fset 'set-numeric-mode 'wnn-set-numeric-mode)
+       (fset 'set-alphabet-mode 'wnn-set-alphabet-mode)
+       (fset 'set-symbol-mode 'wnn-set-symbol-mode)
+       (setq wnn-v3-defined t))))
+
+(defun wnn-get-environment (backend)
+  "Return Wnn Environemt for BACKEND.  If none, create new
+environment."
+  (let ((env (wnn-search-environment backend))
+       proc error)
+    (or env
+       (unwind-protect
+           (let* ((language (wnn-backend-get-language backend))
+                  (server-info (wnn-server-get-info language))
+                  (server-type (wnn-server-type server-info))
+                  version specs)
+             (setq proc (wnn-open server-info)
+                   version (cdr proc)
+                   proc (car proc)
+                   wnn-envspec-list nil)
+             (condition-case err
+                 (let ((wnn-server-type server-type)
+                       (wnn-wnn6-server (eq version 'wnn6)))
+                   (if wnn-use-v3-eggrc
+                       (wnn-v3-eggrc-defines))
+                   (egg-load-startup-file 'wnn language))
+               (egg-error
+                (setq error err)
+                (signal (car error) (cdr error))))
+             (setq specs wnn-envspec-list)
+             (while specs
+               (wnn-create-environment proc server-type version (car specs))
+               (setq specs (cdr specs)))
+             (setq env (wnn-search-environment backend)))
+         (if (and proc (null env))
+             (progn
+               (wnnrpc-close proc)
+               (if error
+                   (signal (car error) (cdr error))
+                 (egg-error 'wnn-fail-make-env))))))))
+
+;; Create a new environment in the conversion server, if necessary.
+(defun wnn-create-environment (proc server-type version spec)
+  (let* ((save-inhibit-quit inhibit-quit)
+        (inhibit-quit t)
+        (name (wnn-make-env-name spec))
+        (backend (wnn-envspec-backend spec))
+        (tankan (wnn-envspec-tankan spec))
+        (sticky (wnn-envspec-sticky spec))
+        (parameter (wnn-envspec-param spec))
+        (fzk (wnn-envspec-fuzokugo spec))
+        (dic-list (wnn-envspec-dic-list spec))
+        (fi-dic-list (wnn-envspec-fi-dic-list spec))
+        (autolearn-dic-list (wnn-envspec-autolearn-dic-list spec))
+        exist env-id env fid cvmask param mode type dic-spec)
+    (condition-case err
+       (progn
+         (setq exist (wnnrpc-env-exist proc name)
+               env-id (wnnrpc-connect proc name))
+         (if (< env-id 0)
+             (egg-error "%s" (wnnrpc-get-error-message (- env-id))))
+         (setq env (wnnenv-create proc env-id server-type version
+                                  backend tankan name))
+         (cond
+          ((or wnn-force-set-environment (= exist 0))
+           (let ((inhibit-quit save-inhibit-quit))
+             (and fzk
+                  (or (< (setq fid (wnn-open-file env fzk)) 0)
+                      (< (setq fid (wnnrpc-set-fuzokugo-file env fid)) 0))
+                  (message "%s" (wnnrpc-get-error-message (- fid))))
+             (while fi-dic-list
+               (wnn-set-dictionary env t (car fi-dic-list))
+               (setq fi-dic-list (cdr fi-dic-list)))
+             (while dic-list
+               (wnn-set-dictionary env nil (car dic-list))
+               (setq dic-list (cdr dic-list)))
+             (while autolearn-dic-list
+               (setq type (caar autolearn-dic-list)
+                     dic-spec (cdar autolearn-dic-list)
+                     autolearn-dic-list (cdr autolearn-dic-list)
+                     mode (wnn-set-autolearn-dictionary env type dic-spec))
+               (if mode
+                   (if (eq type (WNN-const NOTRANS_LEARN))
+                       (progn
+                         (wnnenv-set-notrans env mode)
+                         (wnn-envspec-set-conv-param-muhenkan spec mode))
+                     (wnnenv-set-bmodify env mode)
+                     (wnn-envspec-set-conv-param-bunsetsugiri spec mode))))
+             (if parameter
+                 (wnnrpc-set-conversion-parameter env parameter))
+             (setq cvmask (wnn-envspec-conv-vmask spec)
+                   param (wnn-envspec-conv-param spec))
+             (if (/= cvmask 0)
+                 (wnnrpc-set-conversion-env-param env cvmask param))))
+          ((eq version 'wnn6)
+           (wnnenv-set-bmodify env (wnn-get-autolearning-dic-mode
+                                    env (WNN-const BMODIFY_LEARN)))
+           (wnnenv-set-notrans env (wnn-get-autolearning-dic-mode
+                                    env (WNN-const NOTRANS_LEARN)))))
+         (cond
+          ((eq (wnnenv-get-server-type env) 'jserver)
+           (wnn-set-hinshi env 'noun "\e$BL>;l\e(B")
+           (when (wnnenv-is-wnn6 env)
+             (wnn-set-hinshi env 'settou "\e$B@\F,8l\e(B(\e$B$*\e(B)")
+             (wnn-set-hinshi env 'rendaku "\e$BO"By\e(B")))
+          ((eq (wnnenv-get-server-type env) 'cserver)
+           (wnn-set-hinshi env 'noun "\e$AFUM(C{\e(B"))
+          ((eq (wnnenv-get-server-type env) 'tserver)
+           (wnn-set-hinshi env 'noun "\e$(G_[]WGX\e(B"))
+          ((eq (wnnenv-get-server-type env) 'kserver)
+           (wnn-set-hinshi env 'noun "\e$(CY#^r\e(B")))
+         (if sticky
+             (wnnrpc-make-env-sticky env)
+           (wnnrpc-make-env-unsticky env))
+         (setq wnn-environments (nconc wnn-environments (list env))))
+      ((egg-error quit)
+       (if (eq (car err) 'egg-error)
+          (message "%s" (nth 1 err)))
+       (if env
+          (progn
+            (wnnrpc-disconnect env)
+            (setq wnn-environments (delq env wnn-environments))))
+       (if (eq (car err) 'quit)
+          (signal 'quit (cdr err)))))))
+
+(defun wnn-make-env-name (spec)
+  (let ((env-type (wnn-envspec-env-type spec)))
+    (concat wnn-user-name (if env-type (symbol-name env-type) ""))))
+
+(defun wnn-set-hinshi (env sym name)
+  (let ((hinshi (wnnrpc-hinshi-number (wnnenv-get-proc env) name)))
+    (if (>= hinshi 0)
+       (wnnenv-set-hinshi env sym hinshi))))
+
+(defsubst wnn-dicinfo-entry (info)       (aref info 0))
+(defsubst wnn-dicinfo-id (info freq)     (aref info (+ 1 freq)))
+(defsubst wnn-dicinfo-mode (info freq)   (aref info (+ 3 freq)))
+(defsubst wnn-dicinfo-enable (info)      (aref info 5))
+(defsubst wnn-dicinfo-nice (info)        (aref info 6))
+(defsubst wnn-dicinfo-reverse (info)     (aref info 7))
+(defsubst wnn-dicinfo-comment (info)     (aref info 8))
+(defsubst wnn-dicinfo-name (info freq)   (aref info (+ 9 freq)))
+(defsubst wnn-dicinfo-passwd (info freq) (aref info (+ 11 freq)))
+(defsubst wnn-dicinfo-type (info)        (aref info 13))
+(defsubst wnn-dicinfo-words (info)       (aref info 14))
+(defsubst wnn-dicinfo-local (info freq)  (aref info (+ 15 freq)))
+
+(defun wnn-get-autolearning-dic-mode (env type)
+  (let* ((dic (wnnrpc-get-autolearning-dic env type))
+        (info (and (> dic 0) (wnnrpc-get-dictionary-info env (1- dic)))))
+    (if (vectorp (car-safe info))
+       (wnn-dicinfo-mode (car info) 0)
+      (WNN-const DIC_RDONLY))))
+
+(defun wnn-get-dictionary-list-with-environment (env)
+  (if (wnnenv-is-wnn6 env)
+      (wnnrpc-get-fi-dictionary-list-with-environment env
+                                                     (WNN-const DIC_NO_TEMPS))
+    (wnnrpc-get-dictionary-list-with-environment env)))
+
+(defun wnn-save-dictionaries (env)
+  (let ((dic-list (wnn-get-dictionary-list-with-environment env))
+       (result 0) info freq fid name local-name)
+    (while dic-list
+      (setq info (car dic-list)
+           dic-list (cdr dic-list)
+           freq 0)
+      (while (<= freq 1)
+       (setq fid (wnn-dicinfo-id info freq)
+             name (wnn-dicinfo-name info freq))
+       (if (and (> fid 0) (= (wnn-dicinfo-mode info freq) 0))
+           (cond
+            ((= (wnn-dicinfo-local info freq) 1)
+             (wnnrpc-write-file env fid name))
+            ((setq local-name (wnnenv-get-client-file env name))
+             (wnnrpc-file-receive env fid local-name))
+            ((and (setq local-name (wnn-file-loaded-client env name fid))
+                  (file-writable-p local-name))
+             (wnnrpc-file-receive env fid local-name))))
+       (setq freq (1+ freq))))))
+
+(defun wnn-file-loaded-client (env name fid)
+  (let ((len (length wnn-system-name))
+       local-name)
+    (and (> (length name) len)
+        (equal (substring name 0 len) wnn-system-name)
+        (prog1
+            (wnn-client-file-p (substring name len))
+          (setq local-name (wnn-client-filename (substring name len))))
+        (= (wnnrpc-file-loaded-local (wnnenv-get-proc env) local-name t) fid)
+        local-name)))
+
+(defun wnn-word-inspection (bunsetsu)
+  (let ((env (wnn-bunsetsu-get-env bunsetsu))
+       (converted (wnn-get-bunsetsu-converted bunsetsu))
+       (yomi (wnn-bunsetsu-get-yomi bunsetsu))
+       (fuzokugo (wnn-bunsetsu-get-fuzokugo bunsetsu))
+       (hinshi-no (wnn-bunsetsu-get-hinshi bunsetsu))
+       (dic-no (wnn-bunsetsu-get-dic-no bunsetsu))
+       (entry (wnn-bunsetsu-get-entry bunsetsu))
+       (now (wnn-bunsetsu-get-right-now bunsetsu))
+       (freq (wnn-bunsetsu-get-freq bunsetsu))
+       (evaluation (wnn-bunsetsu-get-evaluation bunsetsu))
+       (evaluation-dai (or (wnn-bunsetsu-get-dai-evaluation bunsetsu) "---"))
+       (kangovect (wnn-bunsetsu-get-kangovect bunsetsu))
+       hinsi dic)
+    (setq hinshi (wnnrpc-hinshi-name (wnnenv-get-proc env) hinshi-no))
+    (setq dic (if (>= dic-no 0)
+                 (wnn-dict-name (car (wnnrpc-get-dictionary-info env dic-no)))
+               (egg-get-message 'wnn-pseud-bunsetsu)))
+    (message "%s %s+%s(%s %s:%s Freq:%s%s) S:%s D:%s V:%s "
+            converted yomi fuzokugo hinshi dic entry
+            (if (= now 1) "*" " ") freq evaluation evaluation-dai kangovect)))
+\f
+;;; not implemented yet (NIY)
+(defun wnn-delete-dictionary ()
+  (dj-delete-dic XXX))
+
+;;; NIY, might never be implemented
+(defun wnn-server-inspect ())
+
+;;; NIY
+(defun wnn-get-conversion-parameter ()
+  (js-get-parameter))
+
+;;; Dictionary management (word registration) is not implemented yet.
+
+(defun wnn-find-dictionary-by-id (id dic-list)
+  (catch 'return
+    (while dic-list
+      (let ((dic (car dic-list)))
+       (if (= (wnndic-get-id dic) id)
+           (throw 'return dic)
+         (setq dic-list (cdr dic-list)))))))
+
+(defun wnn-dict-name (dic-info)
+  (let ((comment (wnndic-get-comment dic-info))
+       (name (wnndic-get-dictname dic-info)))
+    (cond ((null (string= comment "")) comment)
+         ((wnn-client-file-p name) name)
+         (t (file-name-nondirectory name)))))
+
+(defun wnn-list-writable-dictionaries-byname (env)
+  (let ((dic-list (wnn-get-dictionary-list-with-environment env))
+       (w-id-list (wnnrpc-get-writable-dictionary-id-list env)))
+    (cond ((numberp w-id-list)
+          (egg-error "%s" (wnnrpc-get-error-message (- w-id-list))))
+         ((null w-id-list)
+          (egg-error 'wnn-no-writable-d))
+         (t
+          (delq nil
+                (mapcar (lambda (id)
+                          (let ((dic (wnn-find-dictionary-by-id id dic-list)))
+                            (and dic (cons (wnn-dict-name dic) dic))))
+                        w-id-list))))))
+
+(defun wnn-word-registration (backend kanji yomi)
+  (let (env dic dic-id hinshi result)
+    (if (or (null (eq (egg-get-language 0 kanji)
+                     (wnn-backend-get-converted-language backend)))
+           (next-single-property-change 0 'egg-lang kanji)
+           (null (eq (egg-get-language 0 yomi)
+                     (wnn-backend-get-source-language backend)))
+           (next-single-property-change 0 'egg-lang yomi))
+       (egg-error "word registration: invalid character")
+      (setq env (wnn-get-environment backend)
+           dic (wnn-dictionary-select env)
+           dic-id (wnndic-get-id dic)
+           hinshi (wnn-hinshi-select env dic-id)
+           result (wnnrpc-hinshi-number (wnnenv-get-proc env) hinshi))
+      (or (< result 0)
+         (setq result (wnnrpc-add-word env dic-id yomi kanji "" result 0)))
+      (if (>= result 0)
+         (list hinshi (wnn-dict-name dic))
+       (egg-error (wnnrpc-get-error-message (- result)))))))
+
+(defun wnn-dictionary-select (env)
+  (menudiag-select (list 'menu
+                        (egg-get-message 'wnn-register-1)
+                        (wnn-list-writable-dictionaries-byname env))))
+
+(defun wnn-hinshi-select (env dic-id)
+  (menudiag-select (wnn-make-hinshi-menu
+                   env dic-id "/"
+                   (egg-get-message 'wnn-register-2))))
+
+(defun wnn-make-hinshi-menu (env dic-id hinshi prompt)
+  (let ((hinshi-list (wnnrpc-get-hinshi-list env dic-id hinshi)))
+    (if (numberp hinshi-list)
+       (egg-error "%s" (wnnrpc-get-error-message (- hinshi-list)))
+      (list 'menu
+           (format (if (equal hinshi "/") "%s:" "%s[%s]:")
+                   prompt
+                   (substring hinshi 0 (1- (length hinshi))))
+           (mapcar (lambda (h)
+                     (if (= (aref h (1- (length h))) ?/)
+                         (cons h (wnn-make-hinshi-menu env dic-id h prompt))
+                       h))
+                   hinshi-list)))))
+
+;;; setup
+
+(load "egg/wnnrpc")
+(run-hooks 'wnn-load-hook)
+
+;;;###autoload
+(defun egg-activate-wnn (&rest arg)
+  "Activate Wnn backend of Tamagotchy."
+  (apply 'egg-mode (append arg wnn-backend-alist)))
+
+;;; egg/wnn.el ends here.
diff --git a/egg/wnnrpc.el b/egg/wnnrpc.el
new file mode 100644 (file)
index 0000000..f09fcdc
--- /dev/null
@@ -0,0 +1,1762 @@
+;;; egg/wnnrpc.el --- WNN Support (low level interface) in Egg
+;;;                   Input Method Architecture
+
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc
+
+;; Author: NIIBE Yutaka <gniibe@chroot.org>
+;;         KATAYAMA Yoshio <kate@pfu.co.jp> ; Korean, Chinese support.
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+
+;;; Code:
+
+
+(eval-when-compile
+  (require 'egg-com)
+  (defmacro wnn-file-string ()
+    (string-as-unibyte (decode-coding-string "\e$B#W#n#n$N%U%!%$%k\e(B" 'euc-jp)))
+  (defmacro wnn-const (c)
+    "Macro for WNN constants."
+    (cond ((eq c 'JS_VERSION)               0)
+         ((eq c 'JS_OPEN)                  1)
+         ((eq c 'JS_CLOSE)                 3)
+         ((eq c 'JS_CONNECT)               5)
+         ((eq c 'JS_DISCONNECT)            6)
+         ((eq c 'JS_ENV_EXIST)             7)
+         ((eq c 'JS_ENV_STICKY)            8)
+         ((eq c 'JS_ENV_UNSTICKY)          9)
+         ((eq c 'JS_KANREN)               17)
+         ((eq c 'JS_KANTAN_SHO)           18)
+         ((eq c 'JS_KANZEN_SHO)           19)
+         ((eq c 'JS_KANTAN_DAI)           20)
+         ((eq c 'JS_KANZEN_DAI)           21)
+         ((eq c 'JS_HINDO_SET)            24)
+         ((eq c 'JS_DIC_ADD)              33)
+         ((eq c 'JS_DIC_DELETE)           34)
+         ((eq c 'JS_DIC_USE)              35)
+         ((eq c 'JS_DIC_LIST)             36)
+         ((eq c 'JS_DIC_INFO)             37)
+         ((eq c 'JS_FUZOKUGO_SET)         41)
+         ((eq c 'JS_FUZOKUGO_GET)         48)
+         ((eq c 'JS_WORD_ADD)             49)
+         ((eq c 'JS_WORD_DELETE)          50)
+         ((eq c 'JS_WORD_SEARCH)          51)
+         ((eq c 'JS_WORD_SEARCH_BY_ENV)   52)
+         ((eq c 'JS_WORD_INFO)            53)
+         ((eq c 'JS_WORD_COMMENT_SET)     54)
+         ((eq c 'JS_PARAM_SET)            65)
+         ((eq c 'JS_PARAM_GET)            66)
+         ((eq c 'JS_MKDIR)                81)
+         ((eq c 'JS_ACCESS)               82)
+         ((eq c 'JS_WHO)                  83)
+         ((eq c 'JS_ENV_LIST)             85)
+         ((eq c 'JS_FILE_LIST_ALL)        86)
+         ((eq c 'JS_DIC_LIST_ALL)         87)
+         ((eq c 'JS_FILE_READ)            97)
+         ((eq c 'JS_FILE_WRITE)           98)
+         ((eq c 'JS_FILE_SEND)            99)
+         ((eq c 'JS_FILE_RECEIVE)        100)
+         ((eq c 'JS_HINDO_FILE_CREATE)   101)
+         ((eq c 'JS_DIC_FILE_CREATE)     102)
+         ((eq c 'JS_FILE_REMOVE)         103)
+         ((eq c 'JS_FILE_LIST)           104)
+         ((eq c 'JS_FILE_INFO)           105)
+         ((eq c 'JS_FILE_LOADED)         106)
+         ((eq c 'JS_FILE_LOADED_LOCAL)   107)
+         ((eq c 'JS_FILE_DISCARD)        108)
+         ((eq c 'JS_FILE_COMMENT_SET)    109)
+         ((eq c 'JS_FILE_PASSWORD_SET)   110)
+         ((eq c 'JS_FILE_STAT)           111)
+         ((eq c 'JS_KILL)                112)
+         ((eq c 'JS_HINSI_LIST)          114)
+         ((eq c 'JS_HINSI_NAME)          115)
+         ((eq c 'JS_HINSI_NUMBER)        116)
+         ((eq c 'JS_HINSI_DICTS)         117)
+         ((eq c 'JS_HINSI_TABLE_SET)     118)
+         ((eq c 'JS_ACCESS_ADD_HOST)         ?\xf00011)
+         ((eq c 'JS_ACCESS_ADD_USER)         ?\xf00012)
+         ((eq c 'JS_ACCESS_REMOVE_HOST)      ?\xf00013)
+         ((eq c 'JS_ACCESS_REMOVE_USER)      ?\xf00014)
+         ((eq c 'JS_ACCESS_ENABLE)           ?\xf00015)
+         ((eq c 'JS_ACCESS_DISABLE)          ?\xf00016)
+         ((eq c 'JS_ACCESS_GET_INFO)         ?\xf00017)
+         ((eq c 'JS_TEMPORARY_DIC_ADD)       ?\xf00021)
+         ((eq c 'JS_TEMPORARY_DIC_DELETE)    ?\xf00022)
+         ((eq c 'JS_AUTOLEARNING_WORD_ADD)   ?\xf00023)
+         ((eq c 'JS_SET_AUTOLEARNING_DIC)    ?\xf00024)
+         ((eq c 'JS_GET_AUTOLEARNING_DIC)    ?\xf00025)
+         ((eq c 'JS_IS_LOADED_TEMPORARY_DIC) ?\xf00026)
+         ((eq c 'JS_TEMPORARY_WORD_ADD)      ?\xf00027)
+         ((eq c 'JS_SET_HENKAN_ENV)          ?\xf00031)
+         ((eq c 'JS_GET_HENKAN_ENV)          ?\xf00032)
+         ((eq c 'JS_SET_HENKAN_HINSI)        ?\xf00033)
+         ((eq c 'JS_GET_HENKAN_HINSI)        ?\xf00034)
+         ((eq c 'JS_HENKAN_WITH_DATA)        ?\xf00035)
+         ((eq c 'JS_FI_DIC_ADD)              ?\xf00061)
+         ((eq c 'JS_FI_HINDO_FILE_CREATE)    ?\xf00062)
+         ((eq c 'JS_FI_KANREN)               ?\xf00065)
+         ((eq c 'JS_SET_FI_PRIORITY)         ?\xf00066)
+         ((eq c 'JS_OPTIMIZE_FI)             ?\xf00067)
+         ((eq c 'JS_HENKAN_IKEIJI)           ?\xf0006f)
+         ((eq c 'JS_LOCK)                    ?\xf00071)
+         ((eq c 'JS_UNLOCK)                  ?\xf00072)
+         ((eq c 'JS_FI_DIC_LIST)             ?\xf00081)
+         ((eq c 'JS_FI_DIC_LIST_ALL)         ?\xf00082)
+         ((eq c 'JS_FUZOKUGO_LIST)           ?\xf00083)
+
+         ((eq c 'JLIB_VERSION)       ?\x4003)
+         ((eq c 'JLIB_VERSION_WNN6)  ?\x4f00)
+
+         ((eq c 'WNN_C_LOCAL)            "!")
+         ((eq c 'WNN_FT_DICT_FILE)         1)
+         ((eq c 'WNN_FT_HINDO_FILE)        2)
+         ((eq c 'WNN_FILE_STRING)       (encode-coding-string
+                                         "\e$B#W#n#n$N%U%!%$%k\e(B" 'euc-jp))
+         ((eq c 'WNN_FILE_STRING_LEN)     16)
+         ((eq c 'WNN_PASSWD_LEN)          16)
+         ((eq c 'WNN_HOST_LEN)            16)
+         ((eq c 'WNN_UNIQ_LEN)            28)
+         ((eq c 'WNN_FILE_HEADER_LEN)    128)
+         ((eq c 'WNN_FILE_HEADER_PAD)     36)
+         ((eq c 'WNN_FILE_BODY_PAD)      116)
+         ((eq c 'WNN_ENVNAME_LEN)         32)
+         ((eq c 'WNN_MAX_ENV_OF_A_CLIENT) 32)
+         ((eq c 'WNN_MAX_DIC_OF_AN_ENV)   30)
+         ((eq c 'WNN_MAX_FILE_OF_AN_ENV)  60)
+
+         ((eq c 'WNN_ACK)                  0)
+         ((eq c 'WNN_NAK)                 -1)
+
+         ((eq c 'WNN_NO_EXIST)             1)
+         ((eq c 'WNN_OPENF_ERR)           16)
+         ((eq c 'WNN_JSERVER_DEAD)        70)
+         ((eq c 'WNN_BAD_VERSION)         73)
+         ((eq c 'WNN_FILE_READ_ERROR)     90)
+         ((eq c 'WNN_FILE_WRITE_ERROR)    91)
+         ((eq c 'WNN_INCORRECT_PASSWD)    94)
+         ((eq c 'WNN_FILE_IN_USE)         95)
+         ((eq c 'WNN_UNLINK)              96)
+         ((eq c 'WNN_FILE_CREATE_ERROR)   97)
+         ((eq c 'WNN_NOT_A_FILE)          98)
+         ((eq c 'WNN_INODE_CHECK_ERROR)   99)
+
+         ((eq c 'WNN_UD_DICT)              2)
+         ((eq c 'WNN_REV_DICT)             3)
+         ((eq c 'CWNN_REV_DICT)       ?\x103)
+         ((eq c 'BWNN_REV_DICT)       ?\x203)
+         ((eq c 'WNN_COMPACT_DICT)         5)
+         ((eq c 'WNN_FI_SYSTEM_DICT)       6)
+         ((eq c 'WNN_FI_USER_DICT)         7)
+         ((eq c 'WNN_FI_HINDO_FILE)        8)
+         ((eq c 'WNN_GROUP_DICT)           9)
+         ((eq c 'WNN_MERGE_DICT)          10)
+         ((eq c 'WNN_VECT_NO)             -1)
+         ((eq c 'WNN_VECT_BUNSETSU)        2)
+         ((eq c 'WNN_VECT_KANREN)          0)
+         ((eq c 'WNN_VECT_KANZEN)          1)
+         ((eq c 'WNN_VECT_KANTAN)          1))))
+
+(defconst wnnrpc-error-message
+  '((Japanese .
+     [
+      nil
+      "\e$B%U%!%$%k$,B8:_$7$^$;$s\e(B"
+      nil
+      "\e$B%a%b%j\e(B allocation \e$B$G<:GT$7$^$7$?\e(B"
+      nil
+      "\e$B<-=q$G$O$"$j$^$;$s\e(B"
+      "\e$BIQEY%U%!%$%k$G$O$"$j$^$;$s\e(B"
+      "\e$BIUB08l%U%!%$%k$G$O$"$j$^$;$s\e(B"
+      nil
+      "\e$B<-=q%F!<%V%k$,0lGU$G$9\e(B"
+      "\e$BIQEY%U%!%$%k$,;XDj$5$l$?<-=q$NIQEY%U%!%$%k$G$O$"$j$^$;$s\e(B"
+      nil
+      nil
+      nil
+      nil
+      nil
+      "\e$B%U%!%$%k$,%*!<%W%s$G$-$^$;$s\e(B"
+      "\e$B@5$7$$IQEY%U%!%$%k$G$O$"$j$^$;$s\e(B"
+      "\e$B@5$7$$IUB08l%U%!%$%k$G$O$"$j$^$;$s\e(B"
+      "\e$BIUB08l$N8D?t\e(B, \e$B%Y%/%?D9$5$J$I$,B?2a$.$^$9\e(B"
+      "\e$B$=$NHV9f$N<-=q$O;H$o$l$F$$$^$;$s\e(B"
+      nil
+      nil
+      nil
+      "\e$BIUB08l%U%!%$%k$NFbMF$,@5$7$/$"$j$^$;$s\e(B"
+      "\e$B5?;wIJ;lHV9f$,0[>o$G$9\e(B(hinsi.data \e$B$,@5$7$/$"$j$^$;$s\e(B)"
+      "\e$BL$Dj5A$NIJ;l$,A0C<IJ;l$H$7$FDj5A$5$l$F$$$^$9\e(B"
+      "\e$BIUB08l%U%!%$%k$,FI$_9~$^$l$F$$$^$;$s\e(B"
+      nil
+      nil
+      "\e$B<-=q$N%(%$%s%H%j$,B?2a$.$^$9\e(B"
+      "\e$BJQ49$7$h$&$H$9$kJ8;zNs$,D92a$.$^$9\e(B"
+      "\e$BIUB08l2r@ONN0h$,ITB-$7$F$$$^$9\e(B"
+      nil
+      "\e$B<!8uJdNN0h$,ITB-$7$F$$$^$9\e(B"
+      "\e$B8uJd$,\e(B 1 \e$B$D$b:n$l$^$;$s$G$7$?\e(B"
+      nil
+      nil
+      nil
+      nil
+      "\e$BFI$_$,D92a$.$^$9\e(B"
+      "\e$B4A;z$,D92a$.$^$9\e(B"
+      "\e$B;XDj$5$l$?<-=q$OEPO?2DG=$G$O$"$j$^$;$s\e(B"
+      "\e$BFI$_$ND9$5$,\e(B 0 \e$B$G$9\e(B"
+      "\e$B;XDj$5$l$?<-=q$O5U0z$-2DG=$G$O$"$j$^$;$s\e(B"
+      "\e$B%j!<%I%*%s%j!<$N<-=q$KEPO?\e(B/\e$B:o=|$7$h$&$H$7$^$7$?\e(B"
+      "\e$B4D6-$KB8:_$7$J$$<-=q$KEPO?$7$h$&$H$7$^$7$?\e(B"
+      nil
+      nil
+      "\e$B%j!<%I%*%s%j!<$NIQEY$rJQ99$7$h$&$H$7$^$7$?\e(B"
+      "\e$B;XDj$5$l$?C18l$,B8:_$7$^$;$s\e(B"
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      "\e$B%a%b%j\e(B allocation \e$B$G<:GT$7$^$7$?\e(B"
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      "\e$B2?$+$N%(%i!<$,5/$3$j$^$7$?\e(B"
+      "\e$B%P%0$,H/@8$7$F$$$kLOMM$G$9\e(B"
+      "\e$B%5!<%P$,;`$s$G$$$^$9\e(B"
+      "allocation \e$B$K<:GT$7$^$7$?\e(B"
+      "\e$B%5!<%P$H@\B3$G$-$^$;$s$G$7$?\e(B"
+      "\e$BDL?.%W%m%H%3%k$N%P!<%8%g%s$,9g$C$F$$$^$;$s\e(B"
+      "\e$B%/%i%$%"%s%H$N@8@.$7$?4D6-$G$O$"$j$^$;$s\e(B"
+      nil
+      nil
+      nil
+      nil
+      nil
+      "\e$B%G%#%l%/%H%j$r:n$k$3$H$,$G$-$^$;$s\e(B"
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      "\e$B%U%!%$%k$rFI$_9~$`$3$H$,$G$-$^$;$s\e(B"
+      "\e$B%U%!%$%k$r=q$-=P$9$3$H$,$G$-$^$;$s\e(B"
+      "\e$B%/%i%$%"%s%H$NFI$_9~$s$@%U%!%$%k$G$O$"$j$^$;$s\e(B"
+      "\e$B$3$l0J>e%U%!%$%k$rFI$_9~$`$3$H$,$G$-$^$;$s\e(B"
+      "\e$B%Q%9%o!<%I$,4V0c$C$F$$$^$9\e(B"
+      "\e$B%U%!%$%k$,FI$_9~$^$l$F$$$^$9\e(B"
+      "\e$B%U%!%$%k$,:o=|$G$-$^$;$s\e(B"
+      "\e$B%U%!%$%k$,:n@.=PMh$^$;$s\e(B"
+      "WNN \e$B$N%U%!%$%k$G$"$j$^$;$s\e(B"
+      "\e$B%U%!%$%k$N\e(B inode \e$B$H\e(B FILE_UNIQ \e$B$r0lCW$5$;$k;v$,$G$-$^$;$s\e(B"
+      "\e$BIJ;l%U%!%$%k$,Bg$-2a$.$^$9\e(B"
+      "\e$BIJ;l%U%!%$%k$,Bg$-2a$.$^$9\e(B"
+      "\e$BIJ;l%U%!%$%k$,B8:_$7$^$;$s\e(B"
+      "\e$BIJ;l%U%!%$%k$NFbMF$,4V0c$C$F$$$^$9\e(B"
+      nil
+      "\e$BIJ;l%U%!%$%k$,FI$_9~$^$l$F$$$^$;$s\e(B"
+      "\e$BIJ;lL>$,4V0c$C$F$$$^$9\e(B"
+      "\e$BIJ;lHV9f$,4V0c$C$F$$$^$9\e(B"
+      nil
+      "\e$B$=$NA`:n$O%5%]!<%H$5$l$F$$$^$;$s\e(B"
+      "\e$B%Q%9%o!<%I$NF~$C$F$$$k%U%!%$%k$,%*!<%W%s$G$-$^$;$s\e(B"
+      "uumrc \e$B%U%!%$%k$,B8:_$7$^$;$s\e(B"
+      "uumrc \e$B%U%!%$%k$N7A<0$,8m$C$F$$$^$9\e(B"
+      "\e$B$3$l0J>e4D6-$r:n$k$3$H$O$G$-$^$;$s\e(B"
+      "\e$B$3$N%/%i%$%"%s%H$,FI$_9~$s$@%U%!%$%k$G$"$j$^$;$s\e(B"
+      "\e$B<-=q$KIQEY%U%!%$%k$,$D$$$F$$$^$;$s\e(B"
+      "\e$B%Q%9%o!<%I$N%U%!%$%k$,:n@.=PMh$^$;$s\e(B"
+      ])
+    (Chinese-GB .
+     [
+      nil
+      "\e$AND<~2;4fTZ\e(B"
+      nil
+      "\e$ADZ4f\e(Balloc\e$AJ'0\\e(B"
+      nil
+      "\e$A2;JGWV5d\e(B"
+      "\e$A2;JGF56HND<~\e(B"
+      "\e$A2;JGND7(ND<~\e(B"
+      nil
+      "\e$AWV5d1m8qBz\e(B"
+      "\e$AF56HND<~#:2;JGV86(5DWV5d5DF56HND<~\e(B"
+      nil
+      nil
+      nil
+      nil
+      nil
+      "\e$AND<~2;D\4r?*\e(B"
+      "\e$A2;JGU}H75DF56HND<~\e(B"
+      "\e$A2;JGU}H75DND7(ND<~\e(B"
+      "\e$A8=JtSo5D8vJ}!"OrA?3$6H5H3,9}\e(B"
+      "\e$AUb8v:EBk5DWV5d!"C;SPJ9SC\e(B"
+      nil
+      nil
+      nil
+      "\e$AND7(ND<~5DDZH]2;U}H7\e(B"
+      "\e$APiDb4JPT:EBkRl3#\e(Bcixing.data\e$A2;U}H7\e(B"
+      "\e$AN46(Re5D4JPT!"6(ReAKG06K4JPT\e(B"
+      "\e$AND7(ND<~2;D\6AH!\e(B"
+      nil
+      nil
+      "\e$AWV5d5DOnJ}3,9}\e(B"
+      "\e$A1d;;:sWV7{4.5D3$6H3,9}\e(B"
+      "\e$A8=JtSo=bNvSr2;9;\e(B"
+      nil
+      "\e$A4N:n29Sr2;9;\e(B"
+      "\e$A:n29\e(B 1\e$A8vR2C;SP\e(B"
+      nil
+      nil
+      nil
+      nil
+      "\e$A6ARt3$6H3,9}\e(B"
+      "\e$A::WV3$6H3,9}\e(B"
+      "\e$AV86(5DWV5d!"2;D\5GB<\e(B"
+      "\e$A6ARt5D3$6HJG\e(B 0"
+      "\e$AV86(5DWV5d!"2;D\Df2i\e(B"
+      "\e$AV;6A5DWV5d!"5GB<\e(B/\e$AO{3}AK\e(B"
+      "\e$A;7>3VP2;4fTZ5DWV5d!"5GB<AK\e(B"
+      nil
+      nil
+      "\e$AV;6A5DF56H!"1d8|AK\e(B"
+      "\e$AV86(5D5%WV2;4fTZ\e(B"
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      "\e$ADZ4f\e(Balloc\e$AJ'0\\e(B"
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      "\e$ASP3v4m7"Iz\e(B"
+      "\e$A:COsSP#b#u#g7"Iz\e(B"
+      "server\e$AK@AK\e(B"
+      "alloc\e$AJ'0\AK\e(B"
+      "\e$A2;D\:M\e(Bserver\e$AA,=S\e(B"
+      "\e$AM(PE9f3L5D0f1>2;7{\e(B"
+      "\e$A2;JG#c#W#n#nSC;'Iz3I5D;7>3\e(B"
+      nil
+      nil
+      nil
+      nil
+      nil
+      "\e$AWSD?B<2;D\44=(\e(B"
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      "\e$AND<~2;D\6AH!\e(B"
+      "\e$AND<~2;D\P43v\e(B"
+      "\e$A2;JG#c#W#n#nSC;'?I6AH!5DND<~\e(B"
+      "\e$ARTIO5DND<~2;D\6AH!\e(B"
+      "password\e$A2;6T\e(B"
+      "\e$AND<~U}TZ6AH!\e(B"
+      "\e$AND<~2;D\O{3}\e(B"
+      "\e$AND<~C;SP44=(3v@4\e(B"
+      "\e$A2;JG#c#W#n#n5DND<~\e(B"
+      "\e$AND<~5D\e(BI-node\e$A:M\e(BFILE_UNIQ\e$A2;D\R;VB\e(B"
+      "\e$A4JPTND<~L+4s\e(B"
+      "\e$A4JPTND<~L+4s\e(B"
+      "\e$A4JPTND<~2;4fTZ\e(B"
+      "\e$A4JPTND<~5DDZH]2;6T\e(B"
+      nil
+      "\e$A4JPTND<~2;D\6AH!\e(B"
+      "\e$A4JPTC{2;6T\e(B"
+      "\e$A4JPT:EBk2;6T\e(B"
+      nil
+      "\e$AUb8v2YWw2;V'3V\e(B"
+      "password\e$A5DJdHkND<~2;D\4r?*\e(B"
+      "uumrc\e$AND<~2;4fTZ\e(B"
+      "uumrc\e$AND<~5DPNJ=4mNs\e(B"
+      "\e$ARTIO;7>32;D\44=(\e(B"
+      "\e$AUb8v#c#W#n#nSC;'!"6AH!5DND<~C;SP\e(B"
+      "\e$AWV5d5DF56HND<~C;SP\e(B"
+      "password\e$A5DND<~C;SP44=(3v@4\e(B"
+      ])
+    (Chinese-CNS .
+     [
+      nil
+      "\e$(GEFG5DbGtGc\e(B"
+      nil
+      "\e$(GDyGt\e(Balloc\e$(GFBZu\e(B"
+      nil
+      "\e$(GDbQRGsL(\e(B"
+      "\e$(GDbQRs"PyEFG5\e(B"
+      "\e$(GDbQREFNNEFG5\e(B"
+      nil
+      "\e$(GGsL(OPV*iH\e(B"
+      "\e$(Gs"PyEFG5!3DbQRQ@LyN{GsL(N{s"PyEFG5\e(B"
+      nil
+      nil
+      nil
+      nil
+      nil
+      "\e$(GEFG5DbWdFTbd\e(B"
+      "\e$(GDbQRF_m}N{s"PyEFG5\e(B"
+      "\e$(GDbQRF_m}N{EFNNEFG5\e(B"
+      "\e$(GOazhk#N{T6m0!#GWbXO[Pya+b>g4\e(B"
+      "\e$(G]UT6f@n#N{GsL(!#JtH4KpFn\e(B"
+      nil
+      nil
+      nil
+      "\e$(GEFNNEFG5N{DyU)DbF_m}\e(B"
+      "\e$(Gapsib$MLf@n#\,Z&\e(Bcixing.data\e$(GDbF_m}\e(B"
+      "\e$(GF\LyexN{b$ML!#LyexD'P)j&b$ML\e(B"
+      "\e$(GEFNNEFG5DbWd{tL=\e(B"
+      nil
+      nil
+      "\e$(GGsL(N{bzm0b>g4\e(B"
+      "\e$(G|H_PG[Gs\JHkN{O[Pyb>g4\e(B"
+      "\e$(GOazhk#fXN5YQDbY\\e(B"
+      nil
+      "\e$(GH9OlfPYQDbY\\e(B"
+      "\e$(GOlfP\e(B 1\e$(GT6D>JtH4\e(B"
+      nil
+      nil
+      nil
+      nil
+      "\e$(G{tSvO[Pyb>g4\e(B"
+      "\e$(GiGGsO[Pyb>g4\e(B"
+      "\e$(GQ@LyN{GsL(!#DbWd`trg\e(B"
+      "\e$(G{tSvN{O[PyQR\e(B 0"
+      "\e$(GQ@LyN{GsL(!#DbWdXKQg\e(B"
+      "\e$(GF7{tN{GsL(!#`trg\e(B/\e$(GV<XfD'\e(B"
+      "\e$(Gt?h:DcDbGtGcN{GsL(!#`trgD'\e(B"
+      nil
+      nil
+      "\e$(GF7{tN{s"Py!#|HJUD'\e(B"
+      "\e$(GQ@LyN{^LGsDbGtGc\e(B"
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      "\e$(GDyGt\e(Balloc\e$(GFBZu\e(B"
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      "\e$(GH4Exrc`uFm\e(B"
+      "\e$(GGob/H4$\$o$a`uFm\e(B"
+      "server\e$(GH;D'\e(B"
+      "alloc\e$(GFBZuD'\e(B"
+      "\e$(GDbWdLO\e(Bserver\e$(G]YZY\e(B"
+      "\e$(G]WOj]=a#N{NjF[Db\J\e(B"
+      "\e$(GDbQR$]$q$h$hFnEBFmH)N{t?h:\e(B"
+      nil
+      nil
+      nil
+      nil
+      nil
+      "\e$(GDMFxrgDbWd^6Pz\e(B"
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      "\e$(GEFG5DbWd{tL=\e(B"
+      "\e$(GEFG5DbWdlQEx\e(B"
+      "\e$(GDbQR$]$q$h$hFnEBF+{tL=N{EFG5\e(B"
+      "\e$(GEhD8N{EFG5DbWd{tL=\e(B"
+      "password\e$(GDbhW\e(B"
+      "\e$(GEFG5F_Gc{tL=\e(B"
+      "\e$(GEFG5DbWdV<Xf\e(B"
+      "\e$(GEFG5JtH4^6PzExKt\e(B"
+      "\e$(GDbQR$C$W$h$hN{EFG5\e(B"
+      "\e$(GEFG5N{\e(BI-node\e$(GLO\e(BFILE_UNIQ\e$(GDbWdD!S3\e(B"
+      "\e$(Gb$MLEFG5E4DK\e(B"
+      "\e$(Gb$MLEFG5E4DK\e(B"
+      "\e$(Gb$MLEFG5DbGtGc\e(B"
+      "\e$(Gb$MLEFG5N{DyU)DbhW\e(B"
+      nil
+      "\e$(Gb$MLEFG5DbWd{tL=\e(B"
+      "\e$(Gb$MLGXDbhW\e(B"
+      "\e$(Gb$MLf@n#DbhW\e(B"
+      nil
+      "\e$(G]UT6pgI"DbEEQ=\e(B"
+      "password\e$(GN{rSD+EFG5DbWdFTbd\e(B"
+      "cwnnrc\e$(GEFG5DbGtGc\e(B"
+      "cwnnrc\e$(GEFG5N{J0H"rck(\e(B"
+      "\e$(GEhD8t?h:DbWd^6Pz\e(B"
+      "\e$(G]UT6$C$W$h$hFnEB!#{tL=N{EFG5JtH4\e(B"
+      "\e$(GGsL(N{s"PyEFG5JtH4\e(B"
+      "password\e$(GN{EFG5JtH4^6PzExKt\e(B"
+      ])
+    (Korean .
+     [
+      nil
+      "\e$(CH-@O@L\e(B \e$(CA8@gGOAv\e(B \e$(C>J=@4O4Y\e(B"
+      nil
+      "\e$(C8^8p8.\e(B alloc \e$(C?!<-\e(B \e$(C=GFPG_@>4O4Y\e(B"
+      nil
+      "\e$(C;g@|@L\e(B \e$(C>F4U4O4Y\e(B"
+      "\e$(C:s55\e(B \e$(CH-@O@L\e(B \e$(C>F4U4O4Y\e(B"
+      "\e$(C:N<S>n\e(B \e$(CH-@O@L\e(B \e$(C>F4U4O4Y\e(B"
+      nil
+      "\e$(C;g@|\e(B \e$(CEW@L:m@L\e(B \e$(C2K\e(B \e$(CC!@>4O4Y\e(B"
+      "\e$(CAvA$5H\e(B \e$(C;g@|@G\e(B \e$(C:s55\e(B \e$(CH-@O@L\e(B \e$(C>F4U4O4Y\e(B"
+      nil
+      nil
+      nil
+      nil
+      nil
+      "\e$(CH-@O@;\e(B \e$(C?-\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B"
+      "\e$(C8B4B\e(B \e$(C:s55\e(B \e$(CH-@O@L\e(B \e$(C>F4U4O4Y\e(B"
+      "\e$(C8B4B\e(B \e$(C:N<S>n\e(B \e$(CH-@O@L\e(B \e$(C>F4U4O4Y\e(B"
+      "\e$(C:N<S>n@G\e(B \e$(C09<v0!\e(B \e$(C3J9+\e(B \e$(C890E3*\e(B \e$(C:$EM@G\e(B \e$(C1f@L0!\e(B \e$(C3J9+\e(B \e$(C1i4O4Y\e(B"
+      "\e$(C1W\e(B \e$(C9xH#@G\e(B \e$(C;g@|@:\e(B \e$(C;g?k5G0m\e(B \e$(C@VAv\e(B \e$(C>J=@4O4Y\e(B"
+      nil
+      nil
+      nil
+      "\e$(C:N<S>n\e(B \e$(CH-@O@G\e(B \e$(C3;?k@L\e(B \e$(C8BAv\e(B \e$(C>J=@4O4Y\e(B"
+      "\e$(C0!;s\e(B \e$(CG0;g@G\e(B \e$(C9xH#0!\e(B \e$(CF2834O4Y\e(B. hinsi.data \e$(C0!\e(B \e$(C8BAv\e(B \e$(C>J=@4O4Y\e(B"
+      "\e$(C9LA$@G@G\e(B \e$(CG0;g0!\e(B \e$(C@|4\\e(B \e$(CG0;g7N\e(B \e$(CA$@G5G>n\e(B \e$(C@V=@4O4Y\e(B"
+      "\e$(C:N<S>n\e(B \e$(CH-@O@L\e(B \e$(C@PGtA.\e(B \e$(C@VAv\e(B \e$(C>J=@4O4Y\e(B"
+      nil
+      nil
+      "\e$(C;g@|@G\e(B \e$(C?#F.8.0!\e(B \e$(C3J9+\e(B \e$(C89=@4O4Y\e(B"
+      "\e$(C:/H/GO7A4B\e(B \e$(C9.@Z?-@L\e(B \e$(C3J9+\e(B \e$(C1i4O4Y\e(B"
+      "\e$(C:N<S>n\e(B \e$(CGX<.\e(B \e$(C?5?*@L\e(B \e$(C:NA7GU4O4Y\e(B"
+      nil
+      "\e$(C4Y@=\e(B \e$(CHD:8\e(B \e$(C?5?*@L\e(B \e$(C:NA7GU4O4Y\e(B"
+      "\e$(CHD:80!\e(B \e$(C>x@>4O4Y\e(B"
+      nil
+      nil
+      nil
+      nil
+      "\e$(CGQ1[@L\e(B \e$(C3J9+\e(B \e$(C1i4O4Y\e(B"
+      "\e$(CGQ@Z0!\e(B \e$(C3J9+\e(B \e$(C1i4O4Y\e(B"
+      "\e$(CAvA$5H\e(B \e$(C;g@|@:\e(B \e$(C5n7O\e(B \e$(C:R0!4I@T4O4Y\e(B"
+      "\e$(CGQ1[@G\e(B \e$(C1f@L0!\e(B 0 \e$(C@T4O4Y\e(B"
+      "\e$(CAvA$5H\e(B \e$(C;g@|@:\e(B \e$(C?*B|A6\e(B \e$(C:R0!4I@T4O4Y\e(B"
+      "\e$(C@P1b@|?k\e(B \e$(C;g@|?!\e(B \e$(C5n7O\e(B/\e$(C<R0E\e(B \e$(CGO7A0m\e(B \e$(CG_@>4O4Y\e(B"
+      "\e$(CA8@gGOAv\e(B \e$(C>J4B\e(B \e$(C;g@|?!\e(B \e$(C5n7O\e(B \e$(CGO7A0m\e(B \e$(CG_@>4O4Y\e(B"
+      nil
+      nil
+      "\e$(C@P1b@|?k\e(B \e$(C:s558&\e(B \e$(C0f=E\e(B \e$(CGO7A0m\e(B \e$(CG_@>4O4Y\e(B"
+      "\e$(CAvA$5H\e(B \e$(C4\>n4B\e(B \e$(CA8@gGOAv\e(B \e$(C>J=@4O4Y\e(B"
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      "\e$(C8^8p8.\e(B alloc \e$(C?!\e(B \e$(C=GFPG_@>4O4Y\e(B"
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      "\e$(C?!7/0!\e(B \e$(C9_;}G_@>4O4Y\e(B"
+      "\e$(C9v1W\e(B(Bug)\e$(C0!\e(B \e$(C9_;}G_@>4O4Y\e(B"
+      "\e$(C<-9v\e(B(Server)\e$(C0!\e(B \e$(CAW>n\e(B \e$(C@V@>4O4Y\e(B"
+      "alloc\e$(C?!\e(B \e$(C=GFPG_@>4O4Y\e(B"
+      "\e$(C<-9v\e(B(Server) \e$(C?M\e(B \e$(CA"CKGR\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B"
+      "\e$(CEk=E\e(B \e$(CGA7NEdD]@G\e(B \e$(C9vA/@L\e(B \e$(C8BAv\e(B \e$(C>J=@4O4Y\e(B"
+      "\e$(CE,6s@L>HF.0!\e(B \e$(C;}<:GQ\e(B \e$(CH/0f@L\e(B \e$(C>F4U4O4Y\e(B"
+      nil
+      nil
+      nil
+      nil
+      nil
+      "\e$(C5p7:Ed8.8&\e(B \e$(C885i\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B"
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      nil
+      "\e$(CH-@O\e(B \e$(C@P1b?!\e(B \e$(C=GFPG_@>4O4Y\e(B"
+      "\e$(CH-@O\e(B \e$(C>21b?!\e(B \e$(C=GFPG_@>4O4Y\e(B"
+      "\e$(CE,6s@L>HF.0!\e(B \e$(C@P>n\e(B \e$(C5e80\e(B \e$(CH-@O@L\e(B \e$(C>F4U4O4Y\e(B"
+      "\e$(C4u\e(B \e$(C@L;s@G\e(B \e$(CH-@O@;\e(B \e$(C@P>n\e(B \e$(C5e81\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B"
+      "\e$(CFP=:?v5e0!\e(B \e$(CF2834O4Y\e(B"
+      "\e$(CH-@O@L\e(B \e$(C@PGtA.\e(B \e$(C@V@>4O4Y\e(B"
+      "\e$(CH-@O@;\e(B \e$(C<R0EGR\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B"
+      "\e$(CH-@O@;\e(B \e$(C@[<:GR\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B"
+      "kWnn\e$(C@G\e(B \e$(CH-@O@L\e(B \e$(C>F4U4O4Y\e(B"
+      "\e$(CH-@O@G\e(B I-node \e$(C?M\e(B FILE_UNIQ \e$(C8&\e(B \e$(C@OD!=CE3\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B"
+      "\e$(CG0;g\e(B \e$(CH-@O@G\e(B \e$(CE)1b0!\e(B \e$(C3J9+\e(B \e$(CE.4O4Y\e(B"
+      "\e$(CG0;g\e(B \e$(CH-@O@G\e(B \e$(CE)1b0!\e(B \e$(C3J9+\e(B \e$(CE.4O4Y\e(B"
+      "\e$(CG0;g\e(B \e$(CH-@O@L\e(B \e$(CA8@gGOAv\e(B \e$(C>J=@4O4Y\e(B"
+      "\e$(CG0;g\e(B \e$(CH-@O@G\e(B \e$(C3;?k@L\e(B \e$(CF2834O4Y\e(B"
+      nil
+      "\e$(CG0;g\e(B \e$(CH-@O@L\e(B \e$(C@PGtA.\e(B \e$(C@VAv\e(B \e$(C>J=@4O4Y\e(B"
+      "\e$(CG0;g\e(B \e$(C@L8'@L\e(B \e$(CF2834O4Y\e(B"
+      "\e$(CG0;g\e(B \e$(C9xH#0!\e(B \e$(CF2834O4Y\e(B"
+      nil
+      "\e$(C1W\e(B \e$(CA6@[@:\e(B \e$(CAv?x5GAv\e(B \e$(C>J=@4O4Y\e(B"
+      "\e$(CFP=:?v5e0!\e(B \e$(C5i>n@V4B\e(B \e$(CH-@O@;\e(B \e$(C?-\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B"
+      "uumrc \e$(C@L\e(B \e$(CA8@gGOAv\e(B \e$(C>J=@4O4Y\e(B"
+      "uumrc \e$(C@G\e(B \e$(CG|=D@L\e(B \e$(CF2834O4Y\e(B"
+      "\e$(C@L\e(B \e$(C@L;s\e(B \e$(CH/0f@;\e(B \e$(C@[<:GR\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B"
+      "\e$(CE)6s@L>HF.0!\e(B \e$(C@P>n\e(B \e$(C5e80\e(B \e$(CH-@O@L\e(B \e$(C>F4U4O4Y\e(B"
+      "\e$(C;g@|?!\e(B \e$(C:s55\e(B \e$(CH-@O@L\e(B \e$(CA8@gGOAv\e(B \e$(C>J=@4O4Y\e(B"
+      "\e$(CFP=:?v5e\e(B \e$(CH-@O@;\e(B \e$(C@[<:GR\e(B \e$(C<v\e(B \e$(C>x@>4O4Y\e(B"
+      ]))
+  "Array of WNN error messages.  Indexed by error code.")
+
+(defvar wnnrpc-timeout 10)
+
+(defun wnnrpc-message-language (lang)
+  (or (cdr (assq lang egg-message-language-alist)) lang))
+
+(defun wnnrpc-get-error-message (errno)
+  "Return error message string specified by ERRNO."
+  (let ((msg (cdr (or (assq (wnnrpc-message-language egg-default-language)
+                           wnnrpc-error-message)
+                     (assq (wnnrpc-message-language its-current-language)
+                           wnnrpc-error-message)
+                     (assq 'Japanese wnnrpc-error-message)))))
+    (or (and (< errno (length msg)) (aref msg errno))
+       (format "#%d" errno))))
+
+(defmacro wnnrpc-call-with-proc (proc vlist send-expr &rest receive-exprs)
+  `(comm-call-with-proc ,proc
+       ((zhuyin its-zhuyin)
+       (comm-accept-timeout wnnrpc-timeout)
+       ,@vlist)
+     ,send-expr ,@receive-exprs))
+
+(defmacro wnnrpc-call-with-environment (env vlist send-expr &rest rcv-exprs)
+  `(comm-call-with-proc (wnnenv-get-proc ,env)
+       ((zhuyin its-zhuyin)
+       (comm-accept-timeout wnnrpc-timeout)
+       (env-id (wnnenv-get-env-id ,env))
+       ,@vlist)
+     ,send-expr ,@rcv-exprs))
+
+(defmacro wnnrpc-get-result (&rest body)
+  `(let (result)
+     (comm-unpack (u) result)
+     (if (< result 0)
+       (progn
+        (comm-unpack (u) result)
+        (- result))
+     ,@(or body '(result)))))
+\f
+(defun wnnrpc-open-internal (proc version myhostname username)
+  "Open the session.  Return 0 on success, error code on failure."
+  (comm-call-with-proc proc ()
+    (comm-format (u u s s)
+                (wnn-const JS_OPEN)
+                version myhostname username)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-open (proc myhostname username)
+  "Open the session.  Return wnn4 or wnn6 on success, NIL on failure."
+  (let ((type-list `((wnn6 . ,(wnn-const JLIB_VERSION_WNN6))
+                    (wnn4 . ,(wnn-const JLIB_VERSION))))
+       (result (- (wnn-const WNN_BAD_VERSION)))
+       type version)
+    (while (and type-list (= result (- (wnn-const WNN_BAD_VERSION))))
+      (setq type (caar type-list)
+           version (cdar type-list)
+           type-list (cdr type-list)
+           result (wnnrpc-open-internal proc version myhostname username)))
+    (if (zerop result)
+       type
+      result)))
+
+(defun wnnrpc-connect (proc envname)
+  "Establish new `connection' and make an environment.
+Return the identitifation of the environment on success, 
+or negative error code on failure."
+  (comm-call-with-proc proc ()
+    (comm-format (u s) (wnn-const JS_CONNECT) envname)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-file-read (env filename)
+  "Read the file FILENAME on the environment ENV
+Return non-negative file ID on success, or negative error code on failure."
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u s) (wnn-const JS_FILE_READ) env-id filename)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-set-fuzokugo-file (env fid)
+  "For PROC, on environment ENV-ID, 
+Set Fuzokugo file specified by FID.
+Return 0 on success, negate-encoded error code on failure."
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u i) (wnn-const JS_FUZOKUGO_SET) env-id fid)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-set-dictionary (env dic-id freq-id priority dic-rw freq-rw
+                                 dic-passwd freq-passwd reverse)
+  "Set dictionary on server.
+Return dictionary number on success, negate-encoded error code on faiulure."
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u i i i u u s s u) (wnn-const JS_DIC_ADD)
+                env-id dic-id freq-id
+                priority
+                (if (numberp dic-rw) dic-rw (if dic-rw 0 1))
+                (if (numberp freq-rw) freq-rw (if freq-rw 0 1))
+                dic-passwd freq-passwd
+                (if reverse 1 0))
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-set-fi-dictionary (env dic-id freq-id sys dic-rw freq-rw
+                                    dic-passwd freq-passwd)
+  "Set FI dictionary on the server.
+Return 0 on success, negate-encoded error code on faiulure."
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u i i u u u s s) (wnn-const JS_FI_DIC_ADD)
+                env-id dic-id freq-id
+                (if sys
+                    (wnn-const WNN_FI_SYSTEM_DICT)
+                  (wnn-const WNN_FI_USER_DICT))
+                (if (numberp dic-rw) dic-rw (if dic-rw 0 1))
+                (if (numberp freq-rw) freq-rw (if freq-rw 0 1))
+                dic-passwd freq-passwd)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-get-autolearning-dic (env type)
+  "Get id of auto learning dictionary on the server.
+Return dictionary id + 1 on success, 0 on no dictionary, negate-encoded
+error code on faiulure."
+  (wnnrpc-call-with-environment env (result)
+    (comm-format (u u u) (wnn-const JS_GET_AUTOLEARNING_DIC)
+                env-id type)
+    (wnnrpc-get-result
+      (comm-unpack (u) result)
+      (1+ result))))
+
+(defun wnnrpc-set-autolearning-dic (env type dic-id)
+  "Set auto learning dictionary on the server.
+Return 0 on success, negate-encoded error code on faiulure."
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u u i) (wnn-const JS_SET_AUTOLEARNING_DIC)
+                env-id type dic-id)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-version (proc)
+  "Return the version number of WNN server."
+  (comm-call-with-proc proc (result)
+    (comm-format (u) (wnn-const JS_VERSION))
+    (comm-unpack (u) result)
+    result))
+
+(defun wnnrpc-access (env path mode) 
+  "Check the accessibility of file in the environment ENV.
+Return 0 when the remote file (dictionary/frequency) of PATH on server
+can be accessed in mode MODE.  Return Non-zero otherwise."
+  (wnnrpc-call-with-environment env (result)
+    (comm-format (u u u s) (wnn-const JS_ACCESS) env-id mode path)
+    (comm-unpack (u) result)
+    result))
+
+(defun wnnrpc-mkdir (env path)
+  "Create directory specified by PATH."
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u s) (wnn-const JS_MKDIR) env-id path)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-writable-dic-type (env fi rw)
+  (let ((server (wnnenv-get-server-type env)))
+    (cond (fi                        (wnn-const WNN_FI_USER_DICT))
+         ((or (eq server 'cserver)
+              (eq server 'tserver)) (wnn-const CWNN_REV_DICT))
+         ((eq rw 3)                 (wnn-const WNN_GROUP_DICT))
+         ((eq rw 4)                 (wnn-const WNN_MERGE_DICT))
+         (t                         (wnn-const WNN_REV_DICT)))))
+
+(defun wnnrpc-dic-file-create (env dicname type comment passwd hpasswd)
+  "Create a dictionary on the server."
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u s S s s u) (wnn-const JS_DIC_FILE_CREATE)
+                env-id dicname comment
+                passwd hpasswd type)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-hindo-file-create (env fi dic-id freqname comment passwd)
+  "Create a frequency file on the server."
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u u s S s)
+                (if fi
+                    (wnn-const JS_FI_HINDO_FILE_CREATE)
+                  (wnn-const JS_HINDO_FILE_CREATE))
+                env-id dic-id freqname comment passwd)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-file-discard (env fid)
+  "Discard a file specified by FID.  Call this for already-opened file
+before remove and create new file."
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u i) (wnn-const JS_FILE_DISCARD)
+                env-id fid)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-file-remove (proc filename passwd)
+  "Remove the file."
+  (comm-call-with-proc proc ()
+    (comm-format (u s s) (wnn-const JS_FILE_REMOVE)
+                filename (or passwd ""))
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-set-conversion-parameter (env v)
+  "Set conversion parameter."
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u i i i i i i i i i i i i i i i i i)
+                (wnn-const JS_PARAM_SET)
+                env-id
+                (aref v  0) (aref v  1) (aref v  2) (aref v  3) (aref v  4)
+                (aref v  5) (aref v  6) (aref v  7) (aref v  8) (aref v  9)
+                (aref v 10) (aref v 11) (aref v 12) (aref v 13) (aref v 14)
+                (aref v 15) (aref v 16))
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-set-conversion-env-param (env mask v)
+  "Set Wnn6 conversion parameter."
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u u i i i i i i i i i i i i i i i i i i)
+                (wnn-const JS_SET_HENKAN_ENV)
+                env-id mask
+                (aref v  0) (aref v  1) (aref v  2) (aref v  3) (aref v  4)
+                (aref v  5) (aref v  6) (aref v  7) (aref v  8) (aref v  9)
+                (aref v 10) (aref v 11) (aref v 12) (aref v 13) (aref v 14)
+                (aref v 15) (aref v 16) (aref v 17))
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-temporary-dic-loaded (env)
+  "Ask to the server whether the temporary dictionary is loaded or not.
+Return positive if loaded, zero if not, negative on failure."
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u) (wnn-const JS_IS_LOADED_TEMPORARY_DIC)
+                env-id)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-temporary-dic-add (env reverse)
+  "Add temporary dictionary on the server."
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u u) (wnn-const JS_TEMPORARY_DIC_ADD)
+                env-id (if reverse 1 0))
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-receive-sho-bunsetsu-list (env n-bunsetsu)
+  (let ((proc (wnnenv-get-proc env))
+       slist
+       end start jiritsugo-end dic-no entry freq right-now
+       hinshi status status-backward kangovect evaluation
+       result source fuzokugo)
+    (while (> n-bunsetsu 0)
+      (comm-unpack (u u u u u u u u u u u u)
+                  end start jiritsugo-end
+                  dic-no entry freq right-now hinshi
+                  status status-backward kangovect evaluation)
+      (setq slist
+           (cons
+            (wnn-bunsetsu-create env (1+ (- jiritsugo-end start))
+                                 dic-no entry freq right-now hinshi
+                                 status status-backward kangovect evaluation)
+            slist))
+      (setq n-bunsetsu (1- n-bunsetsu)))
+    (prog1
+       (setq slist (nreverse slist))
+      (while slist
+       (comm-unpack (S S S) result source fuzokugo)
+       (wnn-bunsetsu-set-converted (car slist) result)
+       (wnn-bunsetsu-set-yomi (car slist) source)
+       (wnn-bunsetsu-set-fuzokugo (car slist) fuzokugo)
+       (setq slist (cdr slist))))))
+
+(defun wnnrpc-receive-dai-bunsetsu-list (env n-dai separate)
+  (let ((proc (wnnenv-get-proc env))
+       n-bunstsu kanji-length dlist slist
+       end start n-sho evaluation
+       n retval)
+    (comm-unpack (u u) n-bunstsu kanji-length)
+    (while (> n-dai 0)
+      (comm-unpack (u u u u) end start n-sho evaluation)
+      (setq dlist (cons (cons n-sho evaluation) dlist)
+           n-dai (1- n-dai)))
+    (setq dlist (nreverse dlist)
+         slist (wnnrpc-receive-sho-bunsetsu-list env n-bunstsu))
+    (if (null separate)
+       (prog1
+           slist
+         (while dlist
+           (setq n (caar dlist))
+           (while (> n 0)
+             (wnn-bunsetsu-set-dai-evaluation (car slist) (cdar dlist))
+             (wnn-bunsetsu-set-dai-continue (car slist) (> n 1))
+             (setq slist (cdr slist)
+                   n (1- n)))
+           (setq dlist (cdr dlist))))
+      (while dlist
+       (setq retval (cons slist retval)
+             n (caar dlist))
+       (while (> n 1)
+         (wnn-bunsetsu-set-dai-evaluation (car slist) (cdar dlist))
+         (wnn-bunsetsu-set-dai-continue (car slist) t)
+         (setq slist (cdr slist)
+               n (1- n)))
+       (wnn-bunsetsu-set-dai-evaluation (car slist) (cdar dlist))
+       (wnn-bunsetsu-set-dai-continue (car slist)
+                                      (wnn-bunsetsu-connect-next (car slist)))
+       (setq slist (prog1 (cdr slist) (setcdr slist nil))
+             dlist (cdr dlist)))
+      (nreverse retval))))
+
+(defun wnnrpc-renbunsetsu-conversion (env yomi hinshi fuzokugo v)
+  "Convert YOMI string into Kanji.
+HINSHI and FUZOKUGO are information of preceding bunsetsu."
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u S i S i i i) (wnn-const JS_KANREN)
+                env-id yomi hinshi fuzokugo
+                (or v (wnn-const WNN_VECT_KANREN))
+                (if v (wnn-const WNN_VECT_KANREN) (wnn-const WNN_VECT_NO))
+                (wnn-const WNN_VECT_BUNSETSU))
+     (wnnrpc-get-result
+      (wnnrpc-receive-dai-bunsetsu-list env result nil))))
+
+(defun wnnrpc-fi-renbunsetsu-conversion (env yomi hinshi fuzokugo v context)
+  "Convert YOMI string into Kanji.
+HINSHI and FUZOKUGO are information of preceding bunsetsu."
+  (wnnrpc-call-with-environment env (result)
+    (comm-format (u u S i S i i i i i i i S i i i i S) (wnn-const JS_FI_KANREN)
+                env-id yomi hinshi fuzokugo
+                (or v (wnn-const WNN_VECT_KANREN))
+                (if v (wnn-const WNN_VECT_KANREN) (wnn-const WNN_VECT_NO))
+                (wnn-const WNN_VECT_BUNSETSU)
+                (wnn-context-dic-no (car context))
+                (wnn-context-entry (car context))
+                (wnn-context-jirilen (car context))
+                (wnn-context-hinshi (car context))
+                (wnn-context-fuzokugo (car context))
+                (wnn-context-dic-no (nth 1 context))
+                (wnn-context-entry (nth 1 context))
+                (wnn-context-jirilen (nth 1 context))
+                (wnn-context-hinshi (nth 1 context))
+                (wnn-context-fuzokugo (nth 1 context)))
+    (setq result (wnnrpc-get-result
+                  (wnnrpc-receive-dai-bunsetsu-list env result nil)))
+    (prog1
+       result
+      (unless (numberp result)
+       (wnn-bunsetsu-set-fi-rel (car result)
+                                (wnnrpc-get-fi-relation-data env))
+       (while result
+         (wnn-bunsetsu-set-context (car result) context)
+         (setq result (cdr result)))))))
+
+(defun wnnrpc-get-fi-relation-data (env)
+  "Receive FI relation data from the server."
+  (let ((proc (wnnenv-get-proc env))
+       fi-dic dic entry offset num result)
+    (comm-unpack (i) num)
+    (while (> num 0)
+      (comm-unpack (u u u u) fi-dic dic entry offset)
+      (setq result (cons (vector fi-dic dic entry offset -2 -4) result)
+           num (1- num)))
+    (nreverse result)))
+
+(defun wnnrpc-tanbunsetsu-conversion (env yomi hinshi fuzoku v)
+  ""
+  (wnnrpc-call-with-environment env (kanji-length)
+    (comm-format (u u S i S i i) (wnn-const JS_KANTAN_SHO)
+                env-id yomi hinshi fuzoku
+                (or v (wnn-const WNN_VECT_KANTAN))
+                (if v (wnn-const WNN_VECT_KANTAN) (wnn-const WNN_VECT_NO)))
+    (wnnrpc-get-result
+      (comm-unpack (u) kanji-length)   ; ignore kanji-length
+      (wnnrpc-receive-sho-bunsetsu-list env result))))
+
+(defun wnnrpc-get-bunsetsu-candidates (env yomi hinshi fuzoku v)
+  ""
+  (wnnrpc-call-with-environment env (kanji-length)
+    (comm-format (u u S i S i i) (wnn-const JS_KANZEN_SHO)
+                env-id yomi hinshi fuzoku
+                (or v (wnn-const WNN_VECT_KANZEN))
+                (if v (wnn-const WNN_VECT_KANZEN) (wnn-const WNN_VECT_NO)))
+    (wnnrpc-get-result
+      (comm-unpack (u) kanji-length)   ; ignore kanji-length
+      (mapcar (lambda (b)
+               (wnn-bunsetsu-set-dai-continue b (wnn-bunsetsu-connect-next b))
+               (list b))
+             (wnnrpc-receive-sho-bunsetsu-list env result)))))
+
+(defun wnnrpc-daibunsetsu-conversion (env yomi hinshi fuzoku v)
+  ""
+  (wnnrpc-call-with-environment env (n-sho-bunsetsu kanji-size)
+    (comm-format (u u S i S i i) (wnn-const JS_KANTAN_DAI)
+                env-id yomi hinshi fuzoku
+                (or v (wnn-const WNN_VECT_KANTAN))
+                (if v (wnn-const WNN_VECT_KANTAN) (wnn-const WNN_VECT_NO)))
+    (wnnrpc-get-result
+      (wnnrpc-receive-dai-bunsetsu-list env result nil))))
+
+(defun wnnrpc-get-daibunsetsu-candidates (env yomi hinshi fuzoku v)
+  ""
+  (wnnrpc-call-with-environment env (n-sho-bunsetsu kanji-size)
+    (comm-format (u u S i S i i) (wnn-const JS_KANZEN_DAI)
+                env-id yomi hinshi fuzoku
+                (or v (wnn-const WNN_VECT_KANZEN))
+                (if v (wnn-const WNN_VECT_KANZEN) (wnn-const WNN_VECT_NO)))
+    (wnnrpc-get-result
+      (wnnrpc-receive-dai-bunsetsu-list env result t))))
+
+(defun wnnrpc-set-frequency (env dicno entry ima hindo)
+  ""
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u i i i i) (wnn-const JS_HINDO_SET)
+                env-id dicno entry ima hindo)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-set-fi-priority (env fi-rel)
+  ""
+  (wnnrpc-call-with-environment env ()
+    (progn
+      (comm-format (u u u) (wnn-const JS_SET_FI_PRIORITY)
+                  env-id (length fi-rel))
+      (while fi-rel
+       (comm-format (i i i i i i)
+                    (aref (car fi-rel) 0) (aref (car fi-rel) 1)
+                    (aref (car fi-rel) 2) (aref (car fi-rel) 3)
+                    (aref (car fi-rel) 4) (aref (car fi-rel) 5))
+       (setq fi-rel (cdr fi-rel))))
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-optimize-fi (env context)
+  ""
+  (wnnrpc-call-with-environment env (c)
+    (progn
+      (comm-format (u u u) (wnn-const JS_OPTIMIZE_FI)
+                  env-id (length context))
+      (while context
+       (setq c (car context)
+             context (cdr context))
+       (comm-format (i i i i i S)
+                    (wnn-context-dic-no c)
+                    (wnn-context-entry c)
+                    (wnn-context-right-now c)
+                    (wnn-context-freq c)
+                    (wnn-context-length c)
+                    (concat (wnn-context-converted c)
+                            (wnn-context-fuzokugo c)))))
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-close (proc)
+  ""
+  (comm-call-with-proc proc ()
+    (comm-format (u) (wnn-const JS_CLOSE))
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-env-exist (proc envname)
+  ""
+  (comm-call-with-proc proc (result)
+    (comm-format (u s) (wnn-const JS_ENV_EXIST) envname)
+    (comm-unpack (u) result)
+    result))
+
+(defun wnnrpc-make-env-sticky (env)
+  ""
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u) (wnn-const JS_ENV_STICKY) env-id)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-make-env-unsticky (env)
+  ""
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u) (wnn-const JS_ENV_UNSTICKY) env-id)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-disconnect (env)
+  ""
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u) (wnn-const JS_DISCONNECT) env-id)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-add-word (env dictionary yomi kanji comment hinshi initial-freq)
+  ""
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u u S S S u u) (wnn-const JS_WORD_ADD)
+                env-id dictionary yomi kanji comment hinshi initial-freq)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-auto-learning (env type yomi kanji comment hinshi initial-freq)
+  ""
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u u S S S u u) (wnn-const JS_AUTOLEARNING_WORD_ADD)
+                env-id type yomi kanji comment hinshi initial-freq)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-temporary-learning (env yomi kanji comment hinshi initial-freq)
+  ""
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u S S S u u) (wnn-const JS_AUTOLEARNING_WORD_ADD)
+                env-id yomi kanji comment hinshi initial-freq)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-get-dictionary-list-with-environment (env)
+  ""
+  (wnnrpc-call-with-environment env (n-dic)
+    (comm-format (u u) (wnn-const JS_DIC_LIST) env-id)
+    (comm-unpack (u) n-dic)
+    (wnnrpc-receive-dictionary-list proc n-dic)))
+
+(defun wnnrpc-get-fi-dictionary-list-with-environment (env mask)
+  ""
+  (wnnrpc-call-with-environment env (n-dic)
+    (comm-format (u u u) (wnn-const JS_FI_DIC_LIST) env-id mask)
+    (comm-unpack (u) n-dic)
+    (wnnrpc-receive-dictionary-list proc n-dic)))
+
+(defun wnnrpc-receive-dictionary-list (proc n-dic)
+  (let (entry dic freq dic-mode freq-mode enable-flag nice
+       rev comment dicname freqname dic-passwd freq-passwd
+       type gosuu dic-local-flag freq-local-flag retval)
+    (while (> n-dic 0)
+      (comm-unpack (u u u u u u u u S s s s s u u u u)
+                  entry dic freq dic-mode freq-mode enable-flag nice
+                  rev comment dicname freqname dic-passwd freq-passwd
+                  type gosuu dic-local-flag freq-local-flag)
+      (setq retval (cons
+                   (vector entry dic freq dic-mode freq-mode enable-flag nice
+                           rev comment dicname freqname dic-passwd freq-passwd
+                           type gosuu dic-local-flag freq-local-flag)
+                   retval)
+           n-dic (1- n-dic)))
+    (nreverse retval)))
+
+(defsubst wnndic-get-id (dic) (aref dic 0))
+(defsubst wnndic-get-comment (dic) (aref dic 8))
+(defsubst wnndic-get-dictname (dic) (aref dic 9))
+
+(defun wnnrpc-get-writable-dictionary-id-list (env)
+  ""
+  (wnnrpc-call-with-environment env (dic-list dic)
+    (comm-format (u u i) (wnn-const JS_HINSI_DICTS) env-id -1)
+    (wnnrpc-get-result
+      (while (> result 0)
+       (comm-unpack (u) dic)
+       (setq dic-list (nconc dic-list (list dic))
+             result (1- result)))
+      dic-list)))
+
+(defun wnnrpc-get-hinshi-list (env dic name)
+  ""
+  (wnnrpc-call-with-environment env (hinshi hinshi-list str-size)
+    (comm-format (u u u S) (wnn-const JS_HINSI_LIST) env-id dic name)
+    (wnnrpc-get-result
+      (comm-unpack (u) str-size)       ; ignore
+      (while (> result 0)
+       (comm-unpack (S) hinshi)
+       (setq hinshi-list (nconc hinshi-list (list hinshi))
+             result (1- result)))
+      hinshi-list)))
+
+(defun wnnrpc-hinshi-number (proc name)
+  ""
+  (wnnrpc-call-with-proc proc ()
+    (comm-format (u S) (wnn-const JS_HINSI_NUMBER) name)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-get-conversion-parameter (env)
+  ""
+  (wnnrpc-call-with-environment env (n nsho p1 p2 p3 p4 p5 p6 p7 p8 p9
+                                    p10 p11 p12 p13 p14 p15)
+    (comm-format (u u) (wnn-const JS_PARAM_GET) env-id)
+    (wnnrpc-get-result
+      (comm-unpack (u u  u u u u u  u u u u u  u u u u u)
+                  n nsho p1 p2 p3 p4 p5 p6 p7 p8 p9
+                  p10 p11 p12 p13 p14 p15)
+      (vector n nsho p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15))))
+
+(defun wnnrpc-get-conversion-env-param (env)
+  ""
+  (wnnrpc-call-with-environment env (p1 p2 p3 p4 p5 p6 p7 p8 p9
+                                   p10 p11 p12 p13 p14 p15 p16 p17 p18)
+    (comm-format (u u) (wnn-const JS_GET_HENKAN_ENV) env-id)
+    (wnnrpc-get-result
+      (comm-unpack (i i i i i i i i i i i i i i i i i i)
+                  p1 p2 p3 p4 p5 p6 p7 p8 p9
+                  p10 p11 p12 p13 p14 p15 p16 p17 p18)
+      (vector p1 p2 p3 p4 p5 p6 p7 p8 p9
+             p10 p11 p12 p13 p14 p15 p16 p17 p18))))
+
+(defun wnnrpc-file-loaded (proc path)
+  ""
+  (comm-call-with-proc proc (result)
+    (comm-format (u s) (wnn-const JS_FILE_LOADED) path)
+    (comm-unpack (u) result)
+    result))
+
+(defun wnnrpc-write-file (env fid filename)
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u u s) (wnn-const JS_FILE_WRITE) env-id fid filename)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-get-fuzokugo-file (env)
+  ""
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u) (wnn-const JS_FUZOKUGO_GET) env-id)
+    (wnnrpc-get-result)))
+
+(defsubst wnnrpc-receive-file-list (proc)
+  (let ((i 0)
+       flist
+       nfiles fid local ref-count type name)
+    (comm-unpack (u) nfiles)
+    (while (> nfiles 0)
+      (comm-unpack (u u u u s) fid local ref-count type name)
+      (setq flist (nconc flist (list (vector fid local ref-count type name)))
+           nfiles (1- nfiles)))
+    flist))
+
+(defun wnnrpc-get-file-list (proc)
+  ""
+  (comm-call-with-proc proc ()
+    (comm-format (u) (wnn-const JS_FILE_LIST_ALL))
+    (wnnrpc-receive-file-list proc)))
+
+(defun wnnrpc-get-file-list-with-env (env)
+  ""
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u) (wnn-const JS_FILE_LIST) env-id)
+    (wnnrpc-receive-file-list proc)))
+
+(defun wnnrpc-file-attribute (env path)
+  "3: dictionary, 4: hindo file, 5: fuzokugo-file"
+  (wnnrpc-call-with-environment env (result)
+    (comm-format (u u s) (wnn-const JS_FILE_STAT) env-id path)
+    (comm-unpack (u) result)
+    result))
+
+(defun wnnrpc-get-file-info (env fid)
+  ""
+  (wnnrpc-call-with-environment env (name local ref-count type)
+    (comm-format (u u u) (wnn-const JS_FILE_INFO) env-id fid)
+    (wnnrpc-get-result
+      (comm-unpack (s u u u) name local ref-count type)
+      (vector name local ref-count type))))
+
+(defmacro wnnrpc-receive-vector (n)
+  `(let ((v (make-vector ,n -1))
+        (i 0)
+        j)
+     (while (< i ,n)
+       (comm-unpack (u) j)
+       (aset v i j)
+       (setq i (1+ i)))
+     v))
+
+(defun wnnrpc-who (proc)
+  ""
+  (comm-call-with-proc proc (who socket username hostname)
+    (comm-format (u) (wnn-const JS_WHO))
+    (wnnrpc-get-result
+      (while (> result 0)
+       (comm-unpack (u s s) socket username hostname)
+       (setq who (nconc who
+                        (list (vector socket username hostname
+                                      (wnnrpc-receive-vector
+                                       (wnn-const WNN_MAX_ENV_OF_A_CLIENT)))))
+             result (1- result)))
+      who)))
+
+(defun wnnrpc-get-env-list (proc)
+  (comm-call-with-proc proc (envs id name count fuzokugo dic-max)
+    (comm-format (u) (wnn-const JS_ENV_LIST))
+    (wnnrpc-get-result
+      (while (> result 0)
+       (comm-unpack (u s u u u) id name count fuzokugo dic-max)
+       (setq envs (nconc envs
+                         (list (vector id name count fuzokugo dic-max
+                                       (wnnrpc-receive-vector
+                                        (wnn-const WNN_MAX_DIC_OF_AN_ENV))
+                                       (wnnrpc-receive-vector
+                                        (wnn-const WNN_MAX_FILE_OF_AN_ENV)))))
+             result (1- result)))
+       envs)))
+
+(defun wnnrpc-kill (proc)
+  ""
+  (comm-call-with-proc proc (result)
+    (comm-format (u) (wnn-const JS_KILL))
+    (comm-unpack (u) result)
+    result))
+
+(defun wnnrpc-delete-dictionary (env dic)
+  ""
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u u) (wnn-const JS_DIC_DELETE) env-id dic)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-set-flag-on-dictionary (env dic flag)
+  ""
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u u u) (wnn-const JS_DIC_USE) env-id dic flag)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-get-dictionary-list (proc)
+  ""
+  (wnnrpc-call-with-proc proc (n-dic)
+    (comm-format (u) (wnn-const JS_DIC_LIST_ALL))
+    (comm-unpack (u) n-dic)
+    (wnnrpc-receive-dictionary-list proc n-dic)))
+
+(defun wnnrpc-delete-word (env dic entry)
+  ""
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u u u) (wnn-const JS_WORD_DELETE) env-id dic entry)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-receive-word (proc yomi)
+  (let (dic serial hinshi hindo right-now internal-hindo internal-right-now
+       kanji comment l l1)
+    (comm-unpack (u) dic)
+    (while (>= dic 0)
+      (comm-unpack (u u u u u u) serial hinshi hindo right-now
+                  internal-hindo internal-right-now)
+      (setq l (cons (vector dic serial hinshi hindo right-now
+                           internal-hindo internal-right-now
+                           yomi nil nil)
+                   l))
+      (comm-unpack (u) dic))
+    (setq l (nreverse l)
+         l1 l)
+    (while l1
+      (comm-unpack (S S) kanji comment)
+      (aset (car l1) 8 kanji)
+      (aset (car l1) 9 comment)
+      (setq l1 (cdr l1)))
+    l))
+
+(defun wnnrpc-search-word-in-dictionary (env dic yomi)
+  ""
+  (wnnrpc-call-with-environment env (n-entries len)
+    (comm-format (u u u S) (wnn-const JS_WORD_SEARCH) env-id dic yomi)
+    (comm-unpack (u u) n-entries len)  ; ignore
+    (wnnrpc-receive-word proc yomi)))
+
+(defun wnnrpc-search-word (env yomi)
+  ""
+  (wnnrpc-call-with-environment env (n-entries len)
+    (comm-format (u u S) (wnn-const JS_WORD_SEARCH_BY_ENV) env-id yomi)
+    (comm-unpack (u u) n-entries len)  ; ignore
+    (wnnrpc-receive-word proc yomi)))
+
+(defun wnnrpc-get-word-info (env dic entry)
+  ""
+  (wnnrpc-call-with-environment env (n-entries len yomi)
+    (comm-format (u u u u) (wnn-const JS_WORD_INFO) env-id dic entry)
+    (wnnrpc-get-result
+      (comm-unpack (S) yomi)
+      (comm-unpack (u u) n-entries len)        ; ignore
+      (wnnrpc-receive-word proc yomi))))
+
+(defun wnnrpc-set-comment-on-word (env dic entry comment)
+  ""
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u u u S) (wnn-const JS_WORD_COMMENT_SET)
+                env-id dic entry comment)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-get-dictionary-info (env dic)
+  ""
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u u) (wnn-const JS_DIC_INFO) env-id dic)
+    (wnnrpc-get-result
+      (wnnrpc-receive-dictionary-list proc 1))))
+
+(defun wnnrpc-set-file-comment (env fid comment)
+  ""
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u u S) (wnn-const JS_FILE_COMMENT_SET) env-id fid comment)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-hinshi-name (proc hinshi)
+  ""
+  (wnnrpc-call-with-proc proc ()
+    (comm-format (u u) (wnn-const JS_HINSI_NAME) hinshi)
+    (wnnrpc-get-result
+      (comm-unpack (S) result)
+      result)))
+
+(defun wnnrpc-set-file-password (env fid which old new)
+  "WHICH: 1: DIC, 2: HINDO, 3(0): Both"
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u u u s s) (wnn-const JS_FILE_PASSWORD_SET)
+                env-id fid which old new)
+    (wnnrpc-get-result)))
+
+(defun wnnrpc-set-hinshi-table (env dic hinshi-table)
+  ""
+  (wnnrpc-call-with-environment env ()
+    (comm-format (u u u S) (wnn-const JS_HINSI_TABLE_SET)
+                env-id dic hinshi-table)
+    (wnnrpc-get-result)))
+\f
+(defmacro wnnrpc-with-temp-buffer (&rest body)
+  `(with-temp-buffer
+     (let ((coding-system-for-read 'no-conversion)
+          (coding-system-for-write 'no-conversion))
+       (set-buffer-multibyte nil)
+       ,@body)))
+
+(defmacro wnnrpc-with-write-file (filename error-handler &rest body)
+  `(condition-case error
+       (with-temp-file ,filename
+        (let ((coding-system-for-read 'no-conversion)
+              (coding-system-for-write 'no-conversion))
+          (set-buffer-multibyte nil)
+          ,@body))
+     (file-error ,error-handler)))
+
+(defmacro wnnrpc-terminate-current-command (errno)
+  `(progn
+     (comm-call-with-proc-1 proc ()
+       (comm-format (i) (wnn-const WNN_NAK)))
+     (- (wnn-const ,errno))))
+
+(defun wnnrpc-get-local-filename (name)
+  (if (and (string-match (wnn-const WNN_C_LOCAL) name)
+          (string= (substring name 0 (match-beginning 0)) wnn-system-name))
+      (substring name (match-end 0))
+    name))
+
+;; <header> ::= (<type> <uniq> <uniq> <passwd>)
+;; <uniq>   ::= string
+;; <passwd> ::= string
+
+(defun wnnrpc-scan-file-header ()
+  (let ((proc nil)
+       type uniq1 uniq2 passwd)
+    (if (and (> (point-max) (wnn-const WNN_FILE_HEADER_LEN))
+            (equal (buffer-substring 1 (1+ (wnn-const WNN_FILE_STRING_LEN)))
+                   (wnn-const WNN_FILE_STRING)))
+       (progn
+         (goto-char (1+ (wnn-const WNN_FILE_STRING_LEN)))
+         (comm-unpack (u v v v)
+                      type
+                      uniq1 (wnn-const WNN_UNIQ_LEN)
+                      uniq2 (wnn-const WNN_UNIQ_LEN)
+                      passwd (wnn-const WNN_PASSWD_LEN))
+         (list type uniq1 uniq2 passwd)))))
+
+(defun wnnrpc-get-file-header (filename)
+  (wnnrpc-with-temp-buffer
+    (if (null (file-readable-p filename))
+       (list nil (make-string (wnn-const WNN_UNIQ_LEN) 0) "" "")
+      (insert-file-contents filename nil 0 (wnn-const WNN_FILE_HEADER_LEN))
+      (wnnrpc-scan-file-header))))
+
+(defun wnnrpc-check-local-file (path &optional preserve)
+  (let ((header (wnnrpc-get-file-header path)))
+    (cond ((null header)
+          (- (wnn-const WNN_NOT_A_FILE)))
+         ((null (car header))
+          (if (file-exists-p path) 
+              (- (wnn-const WNN_OPENF_ERR))
+            (- (wnn-const WNN_NO_EXIST))))
+         (t
+          (if (wnnrpc-check-inode header path)
+              header
+            (if preserve
+                (- (wnn-const WNN_INODE_CHECK_ERROR))
+              (wnnrpc-change-file-uniq header path)
+              (wnnrpc-check-local-file path t)))))))
+
+(defsubst wnnrpc-get-inode (uniq)
+  (+ (lsh (aref uniq 8) 24)
+     (lsh (aref uniq 9) 16)
+     (lsh (aref uniq 10) 8)
+     (aref uniq 11)))
+
+(defun wnnrpc-check-inode (header path)
+  (let ((inode (nth 10 (file-attributes path))))
+    (and inode (= inode (wnnrpc-get-inode (nth 1 header))))))
+
+(defun wnnrpc-make-uniq (attributes)
+  (wnnrpc-with-temp-buffer
+    (comm-format (U i u V)
+                (nth 6 attributes) (nth 11 attributes) (nth 10 attributes)
+                wnn-system-name (wnn-const WNN_HOST_LEN))
+    (buffer-string)))
+
+(defun wnnrpc-change-file-uniq (header path &optional new)
+  (wnnrpc-with-write-file path
+      nil
+    (insert-file-contents path)
+    (if (wnnrpc-scan-file-header)
+       (let ((uniq (wnnrpc-make-uniq (file-attributes path))))
+         (goto-char (1+ (wnn-const WNN_FILE_STRING_LEN)))
+         (delete-region (point) (1+ (wnn-const WNN_FILE_HEADER_LEN)))
+         (comm-format (u v v v v)
+                      (car header)
+                      uniq (wnn-const WNN_UNIQ_LEN)
+                      (if new uniq (nth 1 header)) (wnn-const WNN_UNIQ_LEN)
+                      (nth 3 header) (wnn-const WNN_PASSWD_LEN)
+                      "" (wnn-const WNN_FILE_HEADER_PAD))
+         t))))
+
+(defun wnnrpc-check-passwd (proc passwd header)
+  (let ((env-id -1))
+    (unwind-protect
+       (if (>= (setq env-id (wnnrpc-connect proc "")) 0)
+           (wnnrpc-call-with-environment (wnnenv-create proc env-id)
+               (file-id)
+             (comm-format (u u v) (wnn-const JS_FILE_SEND)
+                          env-id
+                          (nth 1 header) (wnn-const WNN_UNIQ_LEN))
+             (comm-unpack (u) file-id)
+             (if (>= file-id 0)
+                 (progn
+                   (wnnrpc-get-result) ; ignore result code
+                   (- (wnn-const WNN_FILE_IN_USE)))
+               (wnnrpc-get-result
+                 (comm-call-with-proc-1 proc ()
+                   (comm-format (s B)
+                                (concat wnn-system-name "!TEMPFILE")
+                                (wnnrpc-make-dummy-dictionary header))
+                   (wnnrpc-get-result
+                     (let ((egg-fixed-euc (list egg-fixed-euc egg-fixed-euc)))
+                       (wnnrpc-set-dictionary (wnnenv-create proc env-id)
+                                              result -1 1 t t
+                                              passwd "" nil))))))))
+      (if (>= env-id 0)
+         (wnnrpc-disconnect (wnnenv-create proc env-id))))))
+
+(defun wnnrpc-make-dummy-dictionary (header)
+  (wnnrpc-with-temp-buffer
+    (comm-format (v u v v v v u v)
+                (wnn-const WNN_FILE_STRING) (wnn-const WNN_FILE_STRING_LEN)
+                (wnn-const WNN_FT_DICT_FILE)
+                (nth 1 header) (wnn-const WNN_UNIQ_LEN)
+                (nth 1 header) (wnn-const WNN_UNIQ_LEN)
+                (nth 3 header) (wnn-const WNN_PASSWD_LEN)
+                "" (wnn-const WNN_FILE_HEADER_PAD)
+                (wnn-const WNN_REV_DICT)
+                "" (wnn-const WNN_FILE_BODY_PAD))
+    (buffer-string)))
+
+(defun wnnrpc-file-loaded-local (proc path &optional preserve)
+  ""
+  (let ((header (wnnrpc-check-local-file path preserve)))
+    (if (numberp header)
+       -1
+      (comm-call-with-proc proc (result)
+       (comm-format (u v) (wnn-const JS_FILE_LOADED_LOCAL)
+                    (nth 1 header) (wnn-const WNN_UNIQ_LEN))
+       (comm-unpack (u) result)
+       result))))
+
+(defun wnnrpc-file-receive (env fid local-filename)
+  ""
+  (condition-case err
+      (wnnrpc-call-with-environment env (filename)
+       (comm-format (u u u) (wnn-const JS_FILE_RECEIVE)
+                    env-id fid)
+       (comm-unpack (s) filename)
+       (if (null local-filename)
+           (setq local-filename (wnnrpc-get-local-filename filename)))
+       (let ((header (wnnrpc-get-file-header local-filename))
+             contents)
+         (if (null header)
+             (wnnrpc-terminate-current-command WNN_NOT_A_FILE)
+           (comm-call-with-proc-1 proc ()
+             (comm-format (u v) (wnn-const WNN_ACK)
+                          (nth 1 header) (wnn-const WNN_UNIQ_LEN)))
+           (wnnrpc-get-result
+             (cond
+              ((= result 0) 0)
+              ((null (file-writable-p local-filename))
+               (wnnrpc-terminate-current-command WNN_FILE_WRITE_ERROR))
+              (t
+               (wnnrpc-with-write-file local-filename
+                   (- (wnn-const WNN_FILE_WRITE_ERROR))            
+                 (comm-call-with-proc proc ()
+                   (comm-format (u) (wnn-const WNN_ACK))
+                   (comm-unpack (B) contents))
+                 (insert contents)
+                 (if (= result 2)
+                     (insert-file-contents local-filename nil (1- (point))))
+                 (save-excursion
+                   (set-buffer (process-buffer proc))
+                   (wnnrpc-get-result)))))))))
+    ((quit error)
+     (wnnrpc-call-with-environment env ()
+       (comm-format (i) (wnn-const WNN_NAK)))
+     (signal (car err) (cdr err)))))
+
+(defun wnnrpc-file-send (env filename)
+  ""
+  (let ((header (wnnrpc-check-local-file filename)))
+    (if (numberp header)
+       header
+      (condition-case err
+         (wnnrpc-call-with-environment env (file-id)
+           (comm-format (u u v) (wnn-const JS_FILE_SEND)
+                        env-id
+                        (nth 1 header) (wnn-const WNN_UNIQ_LEN))
+           (comm-unpack (u) file-id)
+           (if (>= file-id 0)
+               (wnnrpc-get-result
+                 (wnnenv-set-client-file env filename)
+                 file-id)
+             (wnnrpc-get-result
+               (comm-call-with-proc-1 proc ()
+                 (comm-format (s B)
+                              (concat wnn-system-name "!" filename)
+                              (wnnrpc-with-temp-buffer
+                                (insert-file-contents filename)
+                                (buffer-string)))
+                 (wnnrpc-get-result
+                   (wnnenv-set-client-file env filename)
+                   result)))))
+       ((quit error)
+        (wnnrpc-call-with-environment env ()
+          (comm-format (s B B B B B B) "" "" "" "" "" "" ""))
+        (signal (car err) (cdr err)))))))
+
+(defun wnnrpc-file-remove-client (proc name passwd)
+  (let (header)
+    (cond
+     ((/= (wnnrpc-file-loaded-local proc name) -1)
+      (- (wnn-const WNN_FILE_IN_USE)))
+     ((null (file-readable-p name))
+      (- (wnn-const WNN_FILE_READ_ERROR)))
+     ((null (numberp (car (setq header (wnnrpc-get-file-header name)))))
+      (- (wnn-const WNN_NOT_A_FILE)))
+     ((< (wnnrpc-check-passwd proc passwd header) 0)
+      (- (wnn-const WNN_INCORRECT_PASSWD)))
+     (t
+      (condition-case nil
+         (progn
+           (delete-file name)
+           0)
+       (error (- (wnn-const WNN_UNLINK))))))))
+
+(defun wnnrpc-dic-file-create-client (env dicname type comment passwd hpasswd)
+  (if (and (null (file-exists-p dicname))
+          (file-writable-p dicname)
+          (or (eq type (wnn-const WNN_REV_DICT))
+              (eq type (wnn-const CWNN_REV_DICT))
+              (eq type (wnn-const BWNN_REV_DICT))
+              (eq type (wnn-const WNN_UD_DICT))
+              (and (wnnenv-is-wnn6 env)
+                   (eq type (wnn-const WNN_FI_USER_DICT))))
+          (wnnrpc-create-and-move-to-client env nil dicname type
+                                            comment passwd hpasswd))
+      0
+    (- (wnn-const WNN_FILE_CREATE_ERROR))))
+         
+
+(defun wnnrpc-hindo-file-create-client (env fi dic-id freqname comment passwd)
+  (if (and (null (file-exists-p freqname))
+          (file-writable-p freqname)
+          (wnnrpc-create-and-move-to-client env dic-id freqname fi
+                                            comment passwd nil))
+      0
+    (- (wnn-const WNN_FILE_CREATE_ERROR))))
+
+(defun wnnrpc-make-temp-name (env)
+  (let ((n 0)
+       (temp-form "usr/temp"))
+    (while (= (wnnrpc-access env (concat temp-form n) 0) 0)
+      (setq n (1+ n)))
+    (concat temp-form n)))
+
+(defun wnnrpc-create-and-move-to-client (env dic-id filename type
+                                            comment passwd hpasswd)
+  (let ((tempfile (wnnrpc-make-temp-name env))
+       (created -1)
+       (fid -1))
+    (unwind-protect
+       (progn
+         (if (numberp type)
+             (setq created (wnnrpc-dic-file-create env tempfile type
+                                                   comment passwd hpasswd))
+           (setq created (wnnrpc-hindo-file-create env type dic-id tempfile
+                                                   comment passwd)))
+         (if (and (>= created 0)
+                  (>= (setq fid (wnnrpc-file-read env tempfile)) 0)
+                  (>= (wnnrpc-file-receive env fid filename) 0))
+             (wnnrpc-change-file-uniq (wnnrpc-get-file-header filename)
+                                      filename t)
+           (condition-case nil (delete-file filename) (error))
+           nil))
+      (if (>= fid 0)
+         (wnnrpc-file-discard env fid))
+      (if (>= created 0)
+         (wnnrpc-file-remove (wnnenv-get-proc env) tempfile passwd)))))
+
+(defun wnnrpc-read-passwd-file (filename)
+  (cond
+   ((null filename) "")
+   ((null (file-readable-p filename)) (- (wnn-const WNN_FILE_READ_ERROR)))
+   (t 
+    (wnnrpc-with-temp-buffer
+      (insert-file-contents filename nil 0 (1- (wnn-const WNN_PASSWD_LEN)))
+      (goto-char 1)
+      (if (and (search-forward-regexp "[\0\n]" nil 0)
+              (= (preceding-char) 0))
+         (backward-char))
+      (buffer-substring 1 (point))))))
+
+;;; egg/wnnrpc.el ends here.
diff --git a/eggrc b/eggrc
new file mode 100644 (file)
index 0000000..965083d
--- /dev/null
+++ b/eggrc
@@ -0,0 +1,196 @@
+;;; eggrc --- EGG Input Method Startup File
+
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc
+
+;; Author: KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(defun wnn4-jserver-setup ()
+  (wnn-define-environment nil)
+  (wnn-set-fuzokugo "pubdic/full.fzk")
+  (wnn-add-dict "pubdic/kihon.dic"     '("kihon.h")    5 nil t)
+  (wnn-add-dict "pubdic/setsuji.dic"   '("setsuji.h")  5 nil t)
+  (wnn-add-dict "pubdic/koyuu.dic"     '("koyuu.h")    1 nil t)
+  (wnn-add-dict "pubdic/chimei.dic"    '("chimei.h")   1 nil t)
+  (wnn-add-dict "pubdic/jinmei.dic"    '("jinmei.h")   1 nil t)
+  (wnn-add-dict "pubdic/special.dic"   '("special.h")  5 nil t)
+  (wnn-add-dict "pubdic/computer.dic"  '("computer.h") 5 nil t)
+  (wnn-add-dict "pubdic/symbol.dic"    '("symbol.h")   1 nil t)
+  (wnn-add-dict "pubdic/tankan.dic"    nil             1 nil nil)
+  (wnn-add-dict "pubdic/bio.dic"       '("bio.h")      1 nil t)
+  (wnn-add-dict '("ud")                nil             5 t   t)
+  (wnn-add-dict "wnncons/tankan2.dic"  nil             1 nil nil)
+  (wnn-add-dict "wnncons/tankan3.dic"  nil             1 nil nil)
+;  (wnn-add-dict "gerodic/g-jinmei.dic" '("g-jinmei.h") 1 nil t)
+  (wnn-set-param 2 10 2 45 100 200 5 1 40 -100 200 -100 200 80 200 200 200)
+
+  (wnn-define-environment t)
+  (wnn-set-fuzokugo "pubdic/full.fzk")
+  (wnn-add-dict "pubdic/kihon.dic"     '("kihon.h")    5 nil t)
+  (wnn-add-dict "pubdic/setsuji.dic"   '("setsuji.h")  5 nil t)
+  (wnn-add-dict "pubdic/koyuu.dic"     '("koyuu.h")    1 nil t)
+  (wnn-add-dict "pubdic/chimei.dic"    '("chimei.h")   1 nil t)
+  (wnn-add-dict "pubdic/jinmei.dic"    '("jinmei.h")   1 nil t)
+  (wnn-add-dict "pubdic/special.dic"   '("special.h")  5 nil t)
+  (wnn-add-dict "pubdic/computer.dic"  '("computer.h") 5 nil t)
+  (wnn-add-dict "pubdic/symbol.dic"    '("symbol.h")   1 nil t)
+  (wnn-add-dict "pubdic/tankan.dic"    nil             1 nil nil)
+  (wnn-add-dict "pubdic/bio.dic"       '("bio.h")      1 nil t)
+  (wnn-add-dict '("ud")                nil             5 t   t)
+  (wnn-add-dict "wnncons/tankan2.dic"  nil             1 nil nil)
+  (wnn-add-dict "wnncons/tankan3.dic"  nil             1 nil nil)
+;  (wnn-add-dict "gerodic/g-jinmei.dic" '("g-jinmei.h") 1 nil t)
+  (wnn-set-param 2 10 2 45 100 200 5 1 40 -100 200 -100 200 80 200 200 200))
+
+(defun wnn6-jserver-setup ()
+  (wnn-define-environment nil)
+  (wnn-set-fuzokugo "iwanami/kougo.fzk")
+  (wnn-add-fisys-dict "iwanami/fisd"   '("fisd.h")       t)
+  (wnn-add-fiusr-dict '("fiud")        nil               t   nil)
+  (wnn-add-dict "iwanami/kihon.dic"    '("kihon.h")    6 nil t)
+  (wnn-add-dict "iwanami/symbol.dic"   '("symbol.h")   1 nil t)
+  (wnn-add-dict "iwanami/tankan.dic"   nil             1 nil nil)
+  (wnn-add-dict "iwanami/tankan2.dic"  nil             1 nil nil)
+  (wnn-add-dict "iwanami/tel.dic"      nil             1 nil nil)
+  (wnn-add-dict "iwanami/zip.dic"      nil             1 nil nil)
+  (wnn-add-dict '("ud")                nil            15 t   t)
+;  (wnn-add-dict "wnncons/tankan2.dic"  nil            1 nil nil)
+;  (wnn-add-dict "wnncons/tankan3.dic"  nil            1 nil nil)
+  (wnn-set-param  5 10 2 45 0  80 5 1 20  0 400 -100 400   80 200 2 200)
+
+  (wnn-add-notrans-dict '("katakana") 15 t)
+  (wnn-add-bmodify-dict '("bunsetsu") 15 t)
+
+  (wnn-set-last-is-first-mode t)
+  (wnn-set-complex-conv-mode nil)
+;  (wnn-set-okuri-flag -1)
+  (wnn-set-prefix-flag 0)
+
+  (wnn-set-okuri-learn-mode t)
+  (wnn-set-prefix-learn-mode t)
+  (wnn-set-suffix-learn-mode t)
+  (wnn-set-common-learn-mode t)
+  (wnn-set-yuragi-mode nil)
+
+  (wnn-set-freq-func-mode 4)
+
+;  (wnn-set-numeric-mode -12)
+;  (wnn-set-alphabet-mode -30)
+;  (wnn-set-symbol-mode -40)
+
+  (wnn-define-environment t)
+  (wnn-set-fuzokugo "iwanami/kougo.fzk")
+  (wnn-add-dict '("ud") "" 15 t t)
+  (wnn-set-param  2 10 2 45 1 80 5 1 50 -20 400 -10  100  -100 200 0 200))
+
+(cond
+ ((eq egg-backend-type 'wnn)
+  (cond
+   ((eq wnn-server-type 'jserver)
+    (if wnn-wnn6-server
+       (wnn6-jserver-setup)
+      (wnn4-jserver-setup)))
+
+   ((eq wnn-server-type 'cserver)
+    (if wnn-use-bixing
+       (progn
+         (wnn-define-environment nil "Q")
+         (wnn-set-fuzokugo "sys/full.con")
+         (wnn-add-dict "sys/QianMa.dic"     nil         1 nil nil)
+
+         (wnn-define-environment nil "W")
+         (wnn-set-fuzokugo "sys/full.con")
+         (wnn-add-dict "sys/WuBi.dic"       nil         1 nil nil)))
+
+    (wnn-define-environment nil "PZ")
+    (wnn-set-fuzokugo "sys/full.con")
+    (wnn-add-dict "sys/level_1.dic"      '("level_1.h")  4 nil t)
+    (wnn-add-dict "sys/level_2.dic"      '("level_2.h")  1 nil t)
+    (wnn-add-dict "sys/basic.dic"        '("basic.h")    7 nil t)
+    (wnn-add-dict "sys/computer.dic"     '("computer.h") 4 nil t)
+    (wnn-add-dict "sys/cwnn.dic"         '("cwnn.h")     4 nil t)
+    (wnn-add-dict '("ud")                nil             5 t   t)
+    (wnn-set-param 1 5 2 750 10 80 10 5 1000 50 0 -200 0 0 0 16 0)
+
+    (if wnn-use-bixing
+       (progn
+         (wnn-define-environment t "Q")
+         (wnn-set-fuzokugo "sys/full.conR")
+         (wnn-add-dict "sys/QianMa.dic"     nil         1 nil nil)
+
+         (wnn-define-environment t "W")
+         (wnn-set-fuzokugo "sys/full.conR")
+         (wnn-add-dict "sys/WuBi.dic"       nil         1 nil nil)))
+
+    (wnn-define-environment t "PZ")
+    (wnn-set-fuzokugo "sys/full.conR")
+    (wnn-add-dict "sys/level_1.dic"      '("level_1.h")  4 nil t)
+    (wnn-add-dict "sys/level_2.dic"      '("level_2.h")  1 nil t)
+    (wnn-add-dict "sys/basic.dic"        '("basic.h")    7 nil t)
+    (wnn-add-dict "sys/computer.dic"     '("computer.h") 4 nil t)
+    (wnn-add-dict "sys/cwnn.dic"         '("cwnn.h")     4 nil t)
+    (wnn-add-dict '("ud")                nil             5 t   t)
+    (wnn-set-param 1 5 2 750 10 80 10 5 1000 50 0 -200 0 0 0 16 0))
+
+   ((eq wnn-server-type 'tserver)
+    (wnn-define-environment nil "PZ")
+    (wnn-set-fuzokugo "sys/full.con")
+    (wnn-add-dict "sys/cns_ch.dic"       '("cns_ch.h")   4 nil t)
+    (wnn-add-dict "sys/cns_wd.dic"       '("cns_wd.h")   1 nil t)
+    (wnn-add-dict '("ud")                nil             5 t   t)
+    (wnn-set-param 1 5 2 750 10 80 10 5 1000 50 0 -200 0 0 0 16 0)
+
+    (wnn-define-environment t "PZ")
+    (wnn-set-fuzokugo "sys/full.conR")
+    (wnn-add-dict "sys/cns_ch.dic"       '("cns_ch.h")   4 nil t)
+    (wnn-add-dict "sys/cns_wd.dic"       '("cns_wd.h")   1 nil t)
+    (wnn-add-dict '("ud")                nil             5 t   t)
+    (wnn-set-param 1 5 2 750 10 80 10 5 1000 50 0 -200 0 0 0 16 0))
+
+   ((eq wnn-server-type 'kserver)
+    (wnn-define-environment nil)
+    (wnn-set-fuzokugo "sys/full.fzk")
+    (wnn-add-dict "sys/hword.dic"        '("hword.h")    5 nil t)
+    (wnn-add-dict "sys/single.dic"       '("single.h")   1 nil t)
+    (wnn-add-dict '("ud")                nil             2 t   t)
+    (wnn-set-param 2 5 2 45 200 80 5 1 40 0 400 -100 400 80 200 2 200)
+
+    (wnn-define-environment t)
+    (wnn-set-fuzokugo "sys/full.fzk")
+    (wnn-add-dict "sys/hword.dic"        '("hword.h")    5 nil t)
+    (wnn-add-dict "sys/single.dic"       '("single.h")   1 nil t)
+    (wnn-add-dict '("ud")                nil             2 t   t)
+    (wnn-set-param 2 5 2 45 200 80 5 1 40 0 400 -100 400 80 200 2 200))))
+
+ ((eq egg-backend-type 'sj3)
+;  (sj3-set-default-sys-dic-directory "/usr/sony/dict/sj3")
+;  (sj3-set-default-usr-dic-directory "/usr/sony/dict/sj3/user/$USER")
+
+  (sj3-setsysdic "sj3main.dic")
+
+  (sj3-setusrdic "private.dic")
+  (sj3-setusrstdy "study.dat")))
diff --git a/its-keydef.el b/its-keydef.el
new file mode 100644 (file)
index 0000000..6814fc1
--- /dev/null
@@ -0,0 +1,146 @@
+;;; its-keydef.el
+
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc
+
+;; Author: NIIBE Yutaka <gniibe@chroot.org>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; Project Leader: Satoru Tomura <tomura@etl.go.jp>
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+
+;;; Code:
+
+
+
+(eval-when-compile
+  (require 'cl))
+
+(defvar its-zhuyin nil)
+(make-variable-buffer-local 'its-zhuyin)
+(put 'its-zhuyin 'permanent-local t)
+
+(defvar its-select-alist nil)
+(make-variable-buffer-local 'its-select-func-alist)
+(put 'its-select-alist 'permanent-local t)
+
+(defvar its-select-func-default-alist nil)
+
+(eval-when-compile
+  (defmacro its-set-select-func-alist (list)
+    `'(setq ,list (cons (cons lang func)
+                      (delq (assq lang ,list) ,list)))))
+
+(eval-and-compile
+  (defun its-make-select-func (key1 key2 func file map &optional zhuyin)
+    (setq func (intern (concat "its-select-" (symbol-name func)))
+         file (intern (concat "its/" (symbol-name file)))
+         map (intern (concat "its-" (symbol-name map) "-map")))
+    (cons
+     `(defun ,func (&optional temporally mode-line-unchange)
+       (interactive "P")
+       (let ((inhibit-read-only t)
+             (func ',func)
+             lang)
+         (if temporally
+             (its-select-mode-temporally func)
+           (require ',file)
+           (cond
+            ((its-in-fence-p)
+             (its-input-end)
+             (its-put-cursor t))
+            ((egg-get-bunsetsu-info (point))
+             (egg-exit-conversion)))
+           (setq its-current-select-func func
+                 its-current-map ',map
+                 lang (its-get-language ,map))
+           (when lang
+             (setq its-current-language lang)
+             ;; avoid overwriting when select temporally
+             (when (and (null its-previous-select-func)
+                        (null (assq lang its-select-func-default-alist)))
+               ,(its-set-select-func-alist its-select-func-alist)
+               ,(its-set-select-func-alist its-select-func-default-alist)))
+           ,(if zhuyin `(setq its-zhuyin ,(eq zhuyin 'T)))
+           (if (null mode-line-unchange)
+               (its-set-mode-line-title)))))
+     `(,func ,(concat "\C-x\C-m" key1) ,(concat "\e" key2)))))
+
+(defmacro its-do-list-make-select-func (list)
+  (let (funcs keydefs pair)
+    (while list
+      (setq pair (apply 'its-make-select-func (car list))
+           funcs (cons (car pair) funcs)
+           keydefs (cons (cdr pair) keydefs)
+           list (cdr list)))
+    `(progn
+       ,@funcs
+       (defvar its-define-select-key-list ',keydefs))))
+
+(defmacro its-add-select-funcs (list)
+  (let (funcs keydefs pair)
+    (while list
+      (setq pair (apply 'its-make-select-func (car list))
+           funcs (cons (car pair) funcs)
+           keydefs (cons (cdr pair) keydefs)
+           list (cdr list)))
+    `(progn
+       ,@funcs
+       (setq its-define-select-key-list
+            (append ',keydefs its-define-select-key-list)))))
+
+(defun its-define-select-keys (map &optional fence)
+  (let ((key-list its-define-select-key-list))
+    (while key-list
+      (define-key map (nth 1 (car key-list)) (car (car key-list)))
+      (if fence
+         (define-key map (nth 2 (car key-list)) (car (car key-list))))
+      (setq key-list (cdr key-list)))))
+
+(its-do-list-make-select-func
+ (("Q"    "Q"    upcase               ascii    up)
+  ("q"    "q"    downcase             ascii    down)
+  ("h"    "\C-h" hiragana             hira     hira)
+  ("k"    "\C-k" katakana             kata     kata)
+  ("x"    "\C-x" hankaku-katakana     hankata  han-kata)
+  ("Z"    "Z"    zenkaku-upcase       zenkaku  zenkaku-up)
+  ("z"    "z"    zenkaku-downcase     zenkaku  zenkaku-down)
+  ("\C-e" "\C-e" erpin-cn             erpin    erpin-cn          NIL)
+  ("\C-p" "\C-p" pinyin-cn            pinyin   pinyin-cn         NIL)
+  ("\C-z" "\C-z" zhuyin-cn            zhuyin   zhuyin-cn         T)
+  ("\C-q" "\C-q" qianma               bixing   qianma)
+  ("\C-w" "\C-w" wubi                 bixing   wubi)
+  ("\C-u" "\C-u" quanjiao-upcase-cn   quanjiao quanjiao-up-cn)
+  ("\C-d" "\C-d" quanjiao-downcase-cn quanjiao quanjiao-down-cn)
+  ("E"    "E"    erpin-tw             erpin    erpin-tw          NIL)
+  ("P"    "P"    pinyin-tw            pinyin   pinyin-tw         NIL)
+  ("C"    "C"    zhuyin-tw            zhuyin   zhuyin-tw         T)
+  ("U"    "U"    quanjiao-upcase-tw   quanjiao quanjiao-up-tw)
+  ("D"    "D"    quanjiao-downcase-tw quanjiao quanjiao-down-tw)
+  ("H"    "H"    hangul               hangul   hangul)
+  ("J"    "J"    jeonkak-upcase       jeonkak  jeonkak-up)
+  ("j"    "j"    jeonkak-downcase     jeonkak  jeonkak-down)))
+
+(provide 'its-keydef)
diff --git a/its.el b/its.el
new file mode 100644 (file)
index 0000000..5145c15
--- /dev/null
+++ b/its.el
@@ -0,0 +1,1325 @@
+;;; its.el --- Input Translation Systam AKA "ITS(uDekirunDa!)"
+
+;; Copyright (C) 1999,2000 PFU LIMITED
+
+;; Author: NIIBE Yutaka <gniibe@chroot.org>
+;;         KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+
+;;; Code:
+
+(require 'cl)
+(require 'egg-edep)
+
+(defgroup its nil
+  "Input Translation System of Tamagotchy"
+  :group 'egg)
+
+(defcustom its-enable-fullwidth-alphabet t
+  "*Enable fullwidth symbol input."
+  :group 'its :type 'boolean)
+
+(defcustom its-barf-on-invalid-keyseq nil
+  "*Don't allow invalid key sequence in input buffer, if non-NIL."
+  :group 'its :type 'boolean)
+
+(defcustom its-delete-by-keystroke nil
+  "*Delete characters as if cancele input keystroke, if nin-NIL."
+  :group 'its :type 'boolean)
+
+(defcustom its-fence-invisible nil
+  "*Make fences invisible, if nin-NIL."
+  :group 'its :type 'boolean)
+
+(defcustom its-fence-open "|"
+  "*String of fence start mark. (should not be null string)"
+  :group 'its :type '(string :valid-regexp ".+"))
+
+(defcustom its-fence-continue "+"
+  "*String of fence start mark. (should not be null string)"
+  :group 'its :type '(string :valid-regexp ".+"))
+
+(defcustom its-fence-close "|"
+  "*String of fence end mark. (should not be null string)"
+  :group 'its :type '(string :valid-regexp ".+"))
+
+(defcustom its-fence-face nil
+  "*Face (or alist of languages and faces) of text in fences."
+  :group 'its
+  :type '(choice face
+                (repeat :tag "Language-Face alist"
+                        (cons :tag "Language-Face"
+                              (choice :tag "Language"
+                                      (const Japanese)
+                                      (const Chinese-GB)
+                                      (const Chinese-CNS)
+                                      (const Korean)
+                                      (const :tag "Default" t)
+                                      (symbol :tag "Other"))
+                              face))))
+
+(defvar its-current-map nil)
+(make-variable-buffer-local 'its-current-map)
+(put 'its-current-map 'permanent-local t)
+
+(defvar its-current-select-func nil)
+(make-variable-buffer-local 'its-current-select-func)
+(put 'its-current-select-func 'permanent-local t)
+
+(defvar its-previous-select-func nil)
+(make-variable-buffer-local 'its-previous-select-func)
+(put 'its-previous-select-func 'permanent-local t)
+
+(defvar its-current-language)
+(make-variable-buffer-local 'its-current-language)
+(put 'its-current-language 'permanent-local t)
+\f
+;; Data structure in ITS
+;; (1) SYL and CURSOR
+;;
+;; "SYL" stands for something like a syllable.
+;;
+;; <SYL> ::= ( <output> . ( <keyseq> . <terminal> ))   ; Determined:   DSYL
+;;        |  <state>                            ; Intermediate: ISYL
+;;        |  ( <output> . <point> )             ; Verbatim:     VSYL
+;;        |  nil                                ; None
+;;
+;; ;<state> ::=
+;; ;          ( <output> . ( <keyseq> . <key-state-table/terminal> ))
+;;
+;; <keyseq> ::= "string" of key sequence
+;; <output> ::= "string"
+;;
+;; <point> ::= integer which specifies point
+;;
+;; <cursor> ::= nil        ; Previous SYL is active (input will go that SYL)
+;;           |  t          ; input makes new SYL.  DEL deletes previous SYL
+;;           |  its-cursor ; DEL breaks previous SYL, input makes new SYL
+
+;; Data structures in ITS
+;; (2) State machine which recognizes SYL
+;;
+;; <state> ::= ( <output> <keyseq> . <key-state-table/terminal> )
+;;
+;; <key-state-table/terminal> ::= <key-state-table> ; intermediate state
+;;                             |  <terminal>        ; terminal state
+;;
+;; <key-state-table> ::= ( <key-state-alist> . <expr-output-back-list> )
+;; <key-state-alist> ::= ( <key-state> ... )
+;; <key-state> ::= ( <key> . <state> )
+;; <key> ::= Positive INTEGER which specifies KEY STROKE
+;;        |  -1 ; means END of key stroke
+;;
+;; Only applicable for last transition.
+;; <expr-output-back-list> ::= ( (<output> . (<keyexpr> . <howmanyback>))... )
+;; <keyexpr> ::= something like "[a-z]" which specifies class of key.
+;;            |  NIL; means ANY of key (except END of the key stroke)
+;;
+;;
+;; <keyseq> ::= "string"
+;;
+;; <terminal> ::= nil
+;;             |  <howmanyback>
+;;
+;; <howmanyback> ::= integer which specifies how many key strokes we go back
+;;
+;; <output> ::= "string"
+
+;; Data structure in ITS (3) Map
+;;
+;; <map>         ::= ( <name> <indicator> <language> . <start-state> )
+;; <name>        ::= "string"
+;; <indicator>   ::= "string"
+;; <language>    ::= "string"
+;; <start-state> ::= <state>
+;;
+\f
+(defsubst its-new-state (output keyseq back)
+  (cons output (cons keyseq back)))
+
+(defsubst its-new-map (name indicator language)
+  (cons name (cons indicator (cons language (its-new-state "" "" nil)))))
+
+(defsubst its-get-indicator (map)
+  (nth 1 map))
+
+(defsubst its-get-language (map)
+  (nth 2 map))
+
+(defsubst its-get-start-state (map)
+  (nthcdr 3 map))
+
+(defsubst its-get-kst/t (state)
+  (cdr (cdr state)))
+
+(defsubst its-set-kst (state kst)
+  (setcdr (cdr state) kst))
+
+(defsubst its-get-keyseq (state)
+  (car (cdr state)))
+
+(defsubst its-set-keyseq (state keyseq)
+  (setcar (cdr state) keyseq))
+
+(defun its-get-keyseq-cooked (state)
+  (let ((keyseq (its-get-keyseq state))
+       (back (its-get-kst/t state)))
+    (if back
+       (substring keyseq 0 back)
+      keyseq)))
+
+(defsubst its-kst-p (kst/t)
+  (not (or (numberp kst/t) (null kst/t))))
+
+(defsubst its-get-output (syl/state)
+  (car syl/state))
+
+(defsubst its-set-output (state output)
+  (setcar state output))
+
+(defsubst its-get-keyseq-syl (syl)
+  (let ((l (cdr syl)))
+    (cond ((stringp l)                 ; DSYL
+          l)
+         ((numberp l)                  ; VSYL
+          (car syl))
+         ((numberp (cdr l))
+          (substring (car l) 0 (cdr l)))
+         (t
+          (car l)))))
+
+(defsubst its-eob-keyexpr (eob)
+  (car (cdr eob)))
+(defsubst its-eob-back (eob)
+  (cdr (cdr eob)))
+
+(defsubst its-make-class+back (class back)
+  (cons class back))
+(defsubst its-make-otherwise (output class+back)
+  (cons output class+back))
+
+(defsubst its-DSYL-with-back-p (syl)
+  (and (consp (cdr syl))
+       (numberp (its-get-kst/t syl))))
+
+(defsubst its-concrete-DSYL-p (syl)
+  (stringp (cdr syl)))
+
+(defsubst its-make-concrete-DSYL (syl)
+  (if (consp (cdr syl))
+      (cons (its-get-output syl) (its-get-keyseq-syl syl))
+    syl))
+    
+;;
+;;
+
+(require 'its-keydef)
+
+(defvar its-mode-map
+  (let ((map (make-sparse-keymap))
+       (i 33))
+    (define-key map "\C-a" 'its-beginning-of-input-buffer)
+    (define-key map "\C-b" 'its-backward-SYL)
+    (define-key map "\C-c" 'its-cancel-input)
+    (define-key map "\C-d" 'its-delete-SYL)
+    (define-key map "\C-e" 'its-end-of-input-buffer)
+    (define-key map "\C-f" 'its-forward-SYL)
+    (define-key map "\C-g" 'its-select-previous-mode)
+    (define-key map "\C-]" 'its-cancel-input)
+    (define-key map "\C-h" 'its-mode-help-command)
+    (define-key map "\C-k" 'its-kill-line)
+;;    (define-key map "\C-l" 'its-exit-mode)
+    (define-key map "\C-m" 'its-exit-mode)     ; RET
+    (define-key map [return] 'its-exit-mode)
+    (define-key map "\C-t" 'its-transpose-chars)
+    (define-key map "\C-w" 'its-kick-convert-region)
+    (define-key map "\C-y" 'its-yank)
+    (define-key map "\M-y" 'its-yank-pop)
+    (define-key map [backspace] 'its-delete-backward-SYL)
+    (define-key map [delete] 'its-delete-backward-SYL)
+    (define-key map [M-backspace] 'its-delete-backward-SYL-by-keystroke)
+    (define-key map [M-delete] 'its-delete-backward-SYL-by-keystroke)
+    (define-key map [right] 'its-forward-SYL)
+    (define-key map [left] 'its-backward-SYL)
+    (while (< i 127)
+      (define-key map (vector i) 'its-self-insert-char)
+      (setq i (1+ i)))
+    (define-key map " "    'its-kick-convert-region-or-self-insert)
+    (define-key map "\177" 'its-delete-backward-SYL)
+    ;;
+    (define-key map "\M-p" 'its-previous-map)
+    (define-key map "\M-n" 'its-next-map)
+    (define-key map "\M-h" 'its-hiragana) ; hiragana-region for input-buffer
+    (define-key map "\M-k" 'its-katakana)
+    (define-key map "\M-<" 'its-hankaku)
+    (define-key map "\M->" 'its-zenkaku)
+    map)
+  "Keymap for ITS mode.")
+
+(fset 'its-mode-map its-mode-map)
+
+(defconst its-setup-fence-before-insert-SYL nil)
+
+(defun its-get-fence-face (lang)
+  (if (null (consp its-fence-face))
+      its-fence-face
+    (cdr (or (assq lang its-fence-face)
+            (assq t its-fence-face)))))
+
+(defun its-put-cursor (cursor)
+  (if (null (eq its-barf-on-invalid-keyseq 'its-keyseq-test))
+      (let ((p (point)))
+       (insert "!")
+       (add-text-properties p (point) (list 'local-map 'its-mode-map
+                                            'read-only t
+                                            'invisible t
+                                            'intangible 'its-part-2
+                                            'its-cursor cursor))
+       (goto-char p))))
+
+(defsubst its-set-cursor-status (cursor)
+  (put-text-property (point) (1+ (point)) 'its-cursor cursor)
+  cursor)
+
+(defvar its-context nil)
+
+;;
+;;  +-- START property
+;;  |          --- CURSOR Property
+;;  |         /
+;;  v        v    v-- END Property
+;;  |SYL SYL ^ SYL|
+;;   ^^^ ^^^   ^^^------ SYL Property
+;;  <-------><---->
+;; intangible intangible
+;;     1       2
+;;
+(defun its-setup-fence-mode ()
+  (let ((open-props '(its-start t intangible its-part-1))
+       (close-props '(rear-nonsticky t its-end t intangible its-part-2))
+       (p (point)) p1)
+    (if (or (null (stringp its-fence-open)) (zerop (length its-fence-open))
+           (null (stringp its-fence-continue)) (zerop (length its-fence-continue))
+           (null (stringp its-fence-close)) (zerop (length its-fence-close)))
+       (error "invalid fence"))
+    ;; Put open-fence before inhibit-read-only to detect read-only
+    (insert (if its-context its-fence-continue its-fence-open))
+    (let ((inhibit-read-only t))
+      (setq p1 (point))
+      (add-text-properties p p1 open-props)
+      (if its-context
+         (put-text-property p p1 'its-context its-context))
+      (insert its-fence-close)
+      (add-text-properties p1 (point) close-props)
+      (if its-fence-invisible
+         (put-text-property p (point) 'invisible t))
+      (put-text-property p (point) 'read-only t)
+      (goto-char p1)
+      (its-define-select-keys its-mode-map t)
+      (its-put-cursor t))))
+
+(defun its-start (key context)
+  (let ((its-setup-fence-before-insert-SYL t)
+       (its-context context))
+    (its-input nil key)))
+
+(defun its-restart (str set-prop beginning context)
+  (let ((its-context context)
+       p)
+    (its-setup-fence-mode)
+    (setq p (point))
+    (put-text-property 0 (length str) 'intangible 'its-part-1 str)
+    (insert str)
+    (if set-prop
+       (progn
+         (delete-region (point) (1+ (point)))
+         (its-setup-yanked-portion p (point))))
+    (if beginning
+       (its-beginning-of-input-buffer))))
+
+(defun its-self-insert-char ()
+  (interactive)
+  (let ((inhibit-read-only t)
+       (key last-command-char)
+       (cursor (get-text-property (point) 'its-cursor))
+       (syl (get-text-property (1- (point)) 'its-syl)))
+    (cond
+     ((or (eq cursor t)
+         (not (eq (get-text-property (1- (point)) 'its-map) its-current-map)))
+      (put-text-property (- (point) (length (its-get-output syl))) (point)
+                        'its-syl (its-make-concrete-DSYL syl))
+      (setq syl nil))
+    (cursor
+     (setq syl nil)))
+    (its-input syl key)))
+
+(defun its-current-language-length ()
+  (+ (if (eq (get-text-property (1- (point)) 'egg-lang) its-current-language)
+        (- (point) (previous-single-property-change (point) 'egg-lang))
+       0)
+     (if (eq (get-text-property (1+ (point)) 'egg-lang) its-current-language)
+        (- (next-single-property-change (1+ (point)) 'egg-lang) (point) 1)
+       0)))
+
+(defun its-initial-ISYL ()
+  (its-get-start-state (symbol-value its-current-map)))
+
+(defun its-make-VSYL (keyseq)
+  (cons keyseq (length keyseq)))
+
+(defun its-input-error ()
+  (error "Invalid Romaji Sequence"))
+
+(defvar its-stroke-input-alist nil)
+
+(defun its-input (syl key)
+  (let ((output (car syl))
+       (k/kk/s (cdr syl))
+       (stroke (assq its-current-language its-stroke-input-alist)))
+    (or syl (setq syl (its-initial-ISYL)))
+    (cond
+     ((numberp k/kk/s)
+       ;; k/kk/s is "point in keyseq"
+       (its-input-to-vsyl syl key k/kk/s output))
+     ((and (or its-barf-on-invalid-keyseq stroke)
+          (null (its-keyseq-acceptable-p (vector key) syl)))
+      ;; signal before altering
+      (its-input-error))
+     (t
+      ;; It's ISYL
+      (its-state-machine syl key 'its-buffer-ins/del-SYL)
+      (if (and stroke (>= (its-current-language-length) (cdr stroke)))
+         (its-kick-convert-region))))))
+
+(defun its-input-to-vsyl (syl key point output)
+  (if (< key 0)
+      (its-set-cursor-status t)
+    (let ((len (length output)))
+      (if (= len point)
+         ;; point is at end of VSYL.  Don't need to call state machine.
+         (its-buffer-ins/del-SYL
+          (its-make-VSYL (concat output (vector key))) syl nil)
+       ;; point is at middle of VSYL.
+       (let ((new-keyseq (concat (substring output 0 point)
+                                 (vector key)
+                                 (substring output point))))
+         (its-state-machine-keyseq new-keyseq 'its-buffer-ins/del-SYL))))))
+\f
+;;;
+;;; ITS State Machine
+;;;
+
+(defvar its-disable-special-action nil)
+
+;; Return CURSOR
+(defun its-state-machine (state key emit)
+  (let ((next-state (its-get-next-state state key))
+       expr-output-back kst/t output keyseq back)
+    (cond
+     ;; proceed to next status
+     ((and next-state
+           (not (and its-disable-special-action
+                     (eq (its-get-kst/t next-state) t))))
+      (setq kst/t (its-get-kst/t next-state)
+           output (its-get-output next-state)
+           keyseq (its-get-keyseq next-state))
+      (cond
+       ;; Special actions.
+       ((eq kst/t t)
+       (if (stringp output)
+           (let ((its-current-language t))
+             (funcall emit (cons output keyseq) state 'its-cursor))
+         (funcall emit (cons "" keyseq) state 'its-cursor)
+         (apply (car output) (cdr output))))
+
+       ;; Still, it's a intermediate state.
+       ((its-kst-p kst/t)
+       (funcall emit next-state state nil))
+
+       ;; It's negative integer which specifies how many
+       ;; characters we go backwards
+       (kst/t
+       (funcall emit next-state state 'its-cursor)
+       (its-state-machine-keyseq (substring keyseq kst/t) emit (< key 0)))
+
+       ;; Here we arrive to a terminal state.
+       ;; Emit a DSYL, and go ahead.
+       (t
+       (funcall emit next-state state 'its-cursor))))
+
+     ;; push back by otherwise status
+     ((and (>= key 0)
+          (setq expr-output-back (its-get-otherwise state key)))
+      (setq keyseq (concat (its-get-keyseq state) (vector key))
+           back (its-eob-back expr-output-back))
+      (funcall emit
+              (cons (or (its-get-output expr-output-back)
+                        (its-get-output
+                         (its-goto-state (substring keyseq 0 back))))
+                    (cons keyseq back))
+              state t)
+      (its-state-machine-keyseq
+       (substring keyseq back) emit))
+
+     ((eq its-barf-on-invalid-keyseq 'its-keyseq-test)
+      'its-keyseq-test-failed)
+
+     ;; No next state for KEY.  It's invalid sequence.
+     (its-barf-on-invalid-keyseq
+      (its-input-error))
+
+     (t
+      ;; XXX Should make DSYL (instead of VSYL)?
+      (setq keyseq (concat (its-get-keyseq state) (if (> key 0) (vector key))))
+      (funcall emit (its-make-VSYL keyseq) state nil)))))
+
+(defvar its-latest-SYL nil "The latest SYL inserted.")
+
+(defsubst its-update-latest-SYL (syl)
+  (setq its-latest-SYL syl))
+
+;; Return CURSOR
+(defun its-state-machine-keyseq (keyseq emit &optional eol)
+  (let ((i 0)
+       (len (length keyseq))
+       (syl (its-initial-ISYL))
+       cursor)
+    (while (< i len)
+      (cond
+       ((numberp (cdr syl))
+       ;; VSYL - no need looping
+       (funcall emit
+                (its-make-VSYL (concat (car syl) (substring keyseq i)))
+                syl nil)
+       (setq cursor nil
+             i len))
+       (t
+       (setq cursor (its-state-machine syl (aref keyseq i) emit))))
+      (if (eq cursor 'its-keyseq-test-failed)
+         (setq i len)
+       (setq syl (if cursor (its-initial-ISYL) its-latest-SYL)
+             i (1+ i))))
+    (if (and eol (not (eq cursor 'its-keyseq-test-failed)))
+       (its-state-machine syl -1 emit)
+      cursor)))
+
+(defun its-buffer-ins/del-SYL (newsyl oldsyl cursor)
+  (if its-setup-fence-before-insert-SYL
+      (progn
+       (setq its-setup-fence-before-insert-SYL nil)
+       (its-setup-fence-mode)))
+  (let ((inhibit-read-only t)
+       (output (copy-sequence (its-get-output newsyl)))
+       (face (its-get-fence-face its-current-language)))
+    (its-buffer-delete-SYL oldsyl)
+    (its-update-latest-SYL newsyl)
+    (add-text-properties 0 (length output)
+                        (list 'its-map its-current-map
+                              'its-syl newsyl
+                              'egg-lang its-current-language
+                              'read-only t
+                              'intangible 'its-part-1)
+                        output)
+    (if face
+       (egg-set-face 0 (length output) face output))
+    (insert output)
+    (its-set-cursor-status cursor)))
+
+(defun its-buffer-delete-SYL (syl)
+  (let ((len (length (its-get-output syl))))
+    (delete-region (- (point) len) (point))))
+
+(defun its-get-next-state (state key)
+  (let ((kst/t (its-get-kst/t state)))
+    (and (listp kst/t)
+        (cdr (assq key (car kst/t))))))
+
+;; XXX XXX XXX
+(defun its-otherwise-match (expr key)
+  (or (null expr)                      ; <expr>::= NIL means "ANY"
+      (let ((case-fold-search nil))
+       (string-match expr (char-to-string key)))))
+
+(defun its-get-otherwise (state key)
+  (let* ((kst/t (its-get-kst/t state))
+        (ebl (cdr kst/t))
+        expr-output-back)
+      (while ebl
+       (setq expr-output-back (car ebl))
+       (let ((expr (its-eob-keyexpr expr-output-back)))
+         (if (its-otherwise-match expr key)
+             (setq ebl nil)
+           (setq ebl (cdr ebl)))))
+      expr-output-back))
+
+(defun its-keyseq-acceptable-p (keyseq &optional syl eol)
+  (let ((i 0)
+       (len (length keyseq))
+       (its-barf-on-invalid-keyseq 'its-keyseq-test)
+       (its-latest-SYL nil)
+       (emit (lambda (nsyl osyl cursor)
+               (its-update-latest-SYL nsyl)
+               cursor))
+       (its-current-map its-current-map)
+       (its-current-select-func its-current-select-func)
+       (its-current-language its-current-language)
+       (its-zhuyin its-zhuyin)
+       (its-previous-select-func its-previous-select-func)
+       cursor)
+    (if (null syl)
+       (setq syl (its-initial-ISYL)))
+    (if (numberp (cdr syl))
+       nil
+      (while (and syl (< i len))
+       (setq cursor (its-state-machine syl (aref keyseq i) emit))
+       (cond
+        ((eq cursor 'its-keyseq-test-failed)
+         (setq syl nil))
+        (cursor
+         (setq syl (its-initial-ISYL)))
+        (t
+         its-latest-SYL))
+       (setq i (1+ i)))
+      (if (and syl eol)
+         (setq cursor (its-state-machine syl -1 emit)))
+      (not (eq cursor 'its-keyseq-test-failed)))))
+\f
+;;;
+;;; Name --> map
+;;;
+;;; ITS name: string
+
+(defvar its-map-alist nil)
+
+(defun its-get-map (name)
+  (assoc name its-map-alist))
+
+(defun its-register-map (map)
+  (let* ((name (car map))
+        (place (assoc name its-map-alist)))
+    (if place
+       (setcdr place (cdr map))
+      (setq its-map-alist (cons map its-map-alist)))
+    map))
+
+(defmacro define-its-state-machine (map name indicator lang doc &rest exprs)
+  (let ((its-current-map map))
+    (set map (its-new-map name indicator
+                          (if (eq (car-safe lang) 'quote) (nth 1 lang) lang)))
+    (eval (cons 'progn exprs))
+    (set map (its-map-compaction (symbol-value map))))
+  `(defconst ,map (its-map-rebuild ',(symbol-value map)) ,doc))
+
+(defmacro define-its-state-machine-append (map &rest exprs)
+  `(let ((func (lambda () (let ((its-current-map ',map)) ,@exprs)))
+        (hook ',(intern (concat (symbol-name map) "-hook"))))
+     (if (null (boundp ',map))
+        (add-hook hook func t)
+       (funcall func)
+       (run-hooks hook)
+       (setq hook nil))))
+
+;; Data structure for map compaction
+;;  <node> ::= (<count> <node#> <original node>)   ; atom
+;;          |  (<count> <node#> (<node> . <node>)) ; cons cell
+;;
+;;  <count> ::= integer  ; 0 or negative - usage count
+;;                       ; psotive       - generated common sub-tree
+;;
+;;  <node#> ::= integer  ; subject to compaction
+;;           |  nil      ; not subject to compaction
+
+(defvar its-compaction-enable nil)
+(defvar its-compaction-hash-table)
+(defvar its-compaction-integer-table)
+(defvar its-compaction-counter-1)
+(defvar its-compaction-counter-2)
+(defvar its-compaction-list)
+
+(defun its-map-compaction (map)
+  (if its-compaction-enable
+      (let ((its-compaction-hash-table (make-vector 1000 nil))
+           (its-compaction-integer-table (make-vector 138 nil))
+           (its-compaction-counter-1 1)
+           (its-compaction-counter-2 0)
+           (its-compaction-list nil))
+       (its-map-compaction-internal map nil nil)
+       (cons (vconcat (nreverse its-compaction-list)) map))
+    map))
+
+(defmacro its-compaction-set-lr (node lr val)
+  `(if (eq ,lr 'car) (setcar ,node ,val) (setcdr ,node ,val)))
+
+(defmacro its-compaction-new-node ()
+  '(1- (setq its-compaction-counter-1 (1+ its-compaction-counter-1))))
+
+(defmacro its-compaction-new-cse (node)
+  `(1- (setq its-compaction-list (cons ,node its-compaction-list)
+            its-compaction-counter-2 (1+ its-compaction-counter-2))))
+
+(defmacro its-compaction-hash (name node parent lr type)
+  (if (null type)
+      `(let ((hash (intern (concat ,@name) its-compaction-hash-table)))
+        (if (null (boundp hash))
+            (car (set hash (list* (its-compaction-new-node) ,parent ,lr)))
+          (setq hash (symbol-value hash))
+          (if (consp (cdr hash))
+              (setcdr hash (its-compaction-set-lr
+                            (cadr hash) (cddr hash)
+                            (its-compaction-new-cse ,node))))
+          (its-compaction-set-lr ,parent ,lr (cdr hash))
+          (car hash)))
+    `(let ((hash ,(if (eq type 'integer)
+                     `(intern (concat ,@name) its-compaction-hash-table)
+                   `(aref its-compaction-integer-table (+ ,node 10)))))
+       (if (null ,(if (eq type 'integer) '(boundp hash) 'hash))
+          (setq hash (,@(if (eq type 'integer)
+                            '(set hash)
+                          `(aset its-compaction-integer-table (+ ,node 10)))
+                        (cons (its-compaction-new-node)
+                              (its-compaction-new-cse ,node))))
+        ,(if (eq type 'integer) '(setq hash (symbol-value hash))))
+       (its-compaction-set-lr ,parent ,lr (cdr hash))
+       (car hash))))
+
+(defun its-map-compaction-internal (map parent lr)
+  (cond
+   ((consp map)    (let ((candidate (or (null (stringp (car map))) (cdr map)))
+                        (l (its-map-compaction-internal (car map) map 'car))
+                        (r (its-map-compaction-internal (cdr map) map 'cdr)))
+                    (if (and candidate l r)
+                        (its-compaction-hash (l " " r) map parent lr nil))))
+   ((stringp map)  (its-compaction-hash ("STR" map) map parent lr nil))
+   ((integerp map) (if (and (>= map -10) (< map 128))
+                      (its-compaction-hash nil map parent lr small-int)
+                    (its-compaction-hash ("INT" map) map parent lr integer)))
+   ((null map)     0)))
+
+(defvar its-map-rebuild-subtrees)
+
+(defun its-map-rebuild (map)
+  (if (vectorp (car map))
+      (let ((its-map-rebuild-subtrees (car map))
+           (len (length (car map)))
+           (i 0)
+           node)
+       (while (< i len)
+         (setq node (aref its-map-rebuild-subtrees i))
+         (if (consp node)
+             (its-map-rebuild-1 node))
+         (setq i (1+ i)))
+       (its-map-rebuild-1 (cdr map))
+       (cdr map))
+    map))
+
+(defun its-map-rebuild-1 (map)
+  (let (lr)
+    (while (consp map)
+      (if (consp (setq lr (car map)))
+         (its-map-rebuild-1 lr)
+       (if (integerp lr)
+           (setcar map (aref its-map-rebuild-subtrees lr))))
+      (setq lr map
+           map (cdr map)))
+    (if (integerp map)
+         (setcdr lr (aref its-map-rebuild-subtrees map)))))
+\f
+;;
+;; Construct State Machine
+;;
+(defun its-defrule (input output &optional back enable-overwrite)
+  "\e$BF~NO\e(B INPUT \e$B$rG'<1$7\e(B, OUTPUT \e$B$r=PNO$9$k$h$&$K%9%F!<%H%^%7%s$r9=@.$9$k!#\e(B
+BACK \e$B$,\e(B(\e$BIi$N\e(B)\e$B@0?t$N;~$O\e(B, OUTPUT \e$B$r=PNO$7$?8e\e(B, BACK \e$B$NJ,\e(B key stroke \e$B$r\e(B
+\e$BLa$C$FF0$/$b$N$H$9$k!#JQ495,B'$O$b$C$H$b:G6a$K\e(B its-define-state-machine
+\e$B$5$l$?JQ49I=$KEPO?$5$l$k!#\e(B
+Return last state."
+  (let ((state (its-goto-state input (if enable-overwrite t 'dup-check))))
+    (its-set-output state output)
+    (its-set-kst state back)
+    state))
+
+(defun its-defrule* (input output &optional interim-output enable-overwrite)
+  (let* ((state (its-goto-state input (if enable-overwrite t 'dup-check))))
+    (its-set-kst state nil)
+    (its-set-interim-terminal-state state output)
+    (if interim-output
+       (its-set-output state interim-output))
+    state))
+
+(defvar its-parent-states)
+
+(defun its-goto-state (input &optional build-if-none)
+  (let ((len (length input))
+       (i 0)
+       (state (its-initial-ISYL))
+       brand-new next-state key)
+    (setq its-parent-states nil)
+    (while (< i len)
+      (setq its-parent-states (cons state its-parent-states)
+           key (aref input i)
+           i (1+ i)
+           next-state (its-get-next-state state key))
+      (cond
+       (next-state
+       (setq state next-state))
+       ((null build-if-none)
+       (error "No such state (%s)" input))
+       (t 
+       (if (not (or brand-new (= i 1) (its-get-kst/t state)))
+           (its-set-interim-terminal-state state))
+       (setq state (its-make-next-state state key
+                                        (concat (its-get-output state)
+                                                (list key)))
+             brand-new t))))
+    (if (and (eq build-if-none 'dup-check) (null brand-new))
+       (error "Duplicated definition (%s)" input))
+    state))
+
+(defun its-set-interim-terminal-state (state &optional output)
+  (its-make-next-state state -1 (or output (its-get-output state)))
+  (its-defrule-otherwise state output))
+
+(defun its-defoutput (input display)
+  (let ((state (its-goto-state input)))
+    (its-set-output state display)))
+
+(defun its-define-otherwise (state otherwise)
+  (let ((kst (its-get-kst/t state)))
+    (if kst
+       (setcdr kst (cons otherwise (cdr kst)))
+      (its-set-kst state (cons nil (cons otherwise nil))))))
+
+(defun its-defrule-otherwise (state output &optional class back)
+  (its-define-otherwise
+   state
+   (its-make-otherwise output (its-make-class+back class (or back -1)))))
+
+(defun its-make-next-state (state key output &optional back)
+  (let ((next-state (its-new-state output
+                                  (concat (its-get-keyseq state)
+                                          (if (> key 0) (list key)))
+                                  back))
+       (kst (its-get-kst/t state)))
+    (cond
+     ((null kst)
+      (its-set-kst state (list (list (cons key next-state)))))
+     ((consp kst)
+      (setcar kst (cons (cons key next-state) (car kst))))
+     (t
+      (error "Can't make new state after %S" (its-get-keyseq state))))
+    next-state))
+
+(defmacro its-defrule-select-mode-temporally (input select-func)
+  `(its-defrule ,input '(its-select-mode-temporally
+                        ,(intern (concat "its-select-"
+                                         (symbol-name select-func))))
+               t))
+\f
+;;;
+(defun its-set-part-1 (beg end)
+  (let ((inhibit-point-motion-hooks t)
+       (str (buffer-substring beg end)))
+    (goto-char beg)
+    (delete-region beg end)
+    (put-text-property 0 (- end beg) 'intangible 'its-part-1 str)
+    (insert str)))
+
+(defun its-set-part-2 (beg end)
+  (let ((inhibit-point-motion-hooks t)
+       (str (buffer-substring beg end)))
+    (goto-char beg)
+    (delete-region beg end)
+    (put-text-property 0 (- end beg) 'intangible 'its-part-2 str)
+    (insert str)))
+
+(defun its-beginning-of-input-buffer ()
+  (interactive)
+  (let ((inhibit-read-only t))
+    (its-input-end)
+    (if (not (get-text-property (1- (point)) 'its-start))
+       (let ((begpos (previous-single-property-change (point) 'its-start)))
+         ;; Make SYLs have property of "part 2"
+         (its-set-part-2 begpos (point))
+         (goto-char begpos)))
+    (its-put-cursor t)))
+
+(defun its-end-of-input-buffer ()
+  (interactive)
+  (let ((inhibit-read-only t))
+    (its-input-end)
+    (if (not (get-text-property (point) 'its-end))
+       (let ((endpos (next-single-property-change (point) 'its-end)))
+         ;; Make SYLs have property of "part 1"
+         (its-set-part-1 (point) endpos)
+         (goto-char endpos)))
+    (its-put-cursor t)))
+
+(defun its-kill-line (n)
+  (interactive "p")
+  (let ((inhibit-read-only t)
+       (p (point)))
+    (its-input-end)
+    (if (> n 0)
+       (cond
+        ((get-text-property (1- (point)) 'its-start)
+         (its-cancel-input))
+        ((get-text-property (point) 'its-end)
+         (its-put-cursor t))
+        (t
+         (delete-region (next-single-property-change (point) 'its-end)
+                        (point))
+         (its-put-cursor t)))
+      (cond
+       ((get-text-property (point) 'its-end)
+       (its-cancel-input))
+       ((get-text-property (1- (point)) 'its-start)
+       (its-put-cursor t))
+       (t
+       (delete-region (point)
+                      (previous-single-property-change (point) 'its-start))
+       (its-put-cursor t))))))
+
+(defun its-cancel-input ()
+  (interactive)
+  (let ((inhibit-read-only t))
+    (delete-region (if (get-text-property (1- (point)) 'its-start)
+                      (point)
+                    (previous-single-property-change (point) 'its-start))
+                  (if (get-text-property (point) 'its-end)
+                      (point)
+                    (next-single-property-change (point) 'its-end)))
+    (its-put-cursor t)
+    (its-exit-mode-internal)))
+
+;; TODO: move in VSYL
+(defun its-backward-SYL (n)
+  (interactive "p")
+  (let ((inhibit-read-only t)
+       syl p old-point)
+    (its-input-end)
+    (setq syl (get-text-property (1- (point)) 'its-syl)
+         p (point)
+         old-point (point))
+    (while (and syl (> n 0))
+      (setq p (- p (length (its-get-output syl))))
+      (setq syl (get-text-property (1- p) 'its-syl))
+      (setq n (1- n)))
+    ;; Make SYLs have property of "part 2"
+    (its-set-part-2 p old-point)
+    (goto-char p)
+    (its-put-cursor t)
+    (if (> n 0)
+       (signal 'beginning-of-buffer nil))))
+
+;; TODO: move in VSYL
+(defun its-forward-SYL (n)
+  (interactive "p")
+  (let ((inhibit-read-only t)
+       syl p old-point)
+    (its-input-end)
+    (setq syl (get-text-property (point) 'its-syl)
+         p (point)
+         old-point (point))
+    (while (and syl (> n 0))
+      (setq p (+ p (length (its-get-output syl))))
+      (setq syl (get-text-property p 'its-syl))
+      (setq n (1- n)))
+    ;; Make SYLs have property of "part 1"
+    (its-set-part-1 old-point p)
+    (goto-char p)
+    (its-put-cursor t)
+    (if (> n 0)
+       (signal 'end-of-buffer nil))))
+
+;; TODO: handle VSYL.  KILLFLAG
+(defun its-delete-SYL (n killflag)
+  (interactive "p\nP")
+  (let ((inhibit-read-only t)
+       syl p)
+    (its-input-end)
+    (setq syl (get-text-property (point) 'its-syl)
+         p (point))
+    (while (and syl (> n 0))
+      (setq p (+ p (length (its-get-output syl))))
+      (setq syl (get-text-property p 'its-syl))
+      (setq n (1- n)))
+    (if (> n 0)
+       (progn
+         (its-put-cursor t)
+         (signal 'end-of-buffer nil))
+      (delete-region (point) p)
+      (its-put-cursor t)
+      (its-exit-mode-if-empty))))
+
+;; TODO: killflag
+(defun its-delete-backward-SYL (n killflag)
+  (interactive "p\nP")
+  (let ((inhibit-read-only t)
+       (syl (get-text-property (1- (point)) 'its-syl))
+       (cursor (get-text-property (point) 'its-cursor)))
+    (if (null syl)
+       (signal 'beginning-of-buffer nil)
+      (if (eq cursor t)
+         (its-delete-backward-SYL-internal n killflag)
+       (its-delete-backward-within-SYL syl n killflag)))))
+
+;; TODO: killflag
+(defun its-delete-backward-SYL-internal (n killflag)
+  (let ((syl (get-text-property (1- (point)) 'its-syl))
+       (p (point)))
+    (while (and syl (> n 0))
+      (setq p (- p (length (its-get-output syl))))
+      (setq syl (get-text-property (1- p) 'its-syl))
+      (setq n (1- n)))
+    (if (> n 0)
+       (signal 'beginning-of-buffer nil)
+      (delete-region p (1+ (point)))   ; also delete cursor
+      (its-put-cursor t)
+      (its-exit-mode-if-empty))))
+
+(defun its-delete-backward-SYL-by-keystroke (n killflag)
+  (interactive "p\nP")
+  (let ((inhibit-read-only t)
+       (its-delete-by-keystroke t))
+    (its-delete-backward-SYL n killflag)))
+
+;; TODO: killflag
+(defun its-delete-backward-within-SYL (syl n killflag)
+  (let* ((keyseq (its-get-keyseq-syl syl))
+        (len (length keyseq))
+        (p (- (point) (length (its-get-output syl))))
+        (its-current-map (get-text-property (1- (point)) 'its-map))
+        (its-current-language (get-text-property (1- (point)) 'egg-lang))
+        back pp)
+    (if (< n 0)
+       (signal 'args-out-of-range (list (- (point) n) (point))))
+    (if its-delete-by-keystroke
+       (while (null (or (eq p pp) (its-concrete-DSYL-p syl)))
+         (setq pp p)
+         (while (and (setq syl (get-text-property (1- p) 'its-syl))
+                     (its-DSYL-with-back-p syl)
+                     (<= (setq back (- (its-get-kst/t syl))) len)
+                     (> back (- len n))
+                     (equal (substring (its-get-keyseq syl) (- back))
+                            (substring keyseq 0 back)))
+           (setq keyseq (concat (its-get-keyseq-syl syl) keyseq)
+                 len (length keyseq)
+                 p (- p (length (its-get-output syl)))))
+         (if (and (eq p pp) syl (> n len))
+             (setq n (- n len)
+                   keyseq (its-get-keyseq-syl syl)
+                   len (length keyseq)
+                   p (- p (length (its-get-output syl))))))
+      (if (and (> n len) (its-concrete-DSYL-p syl))
+         (setq len 1)))
+    (if (> n len)
+       (setq n (- n len)
+             len 0))
+    (while (and (> n len) (setq syl (get-text-property (1- p) 'its-syl)))
+      (setq n (1- n)
+           p (- p (length (its-get-output syl)))))
+    (if (> n len)
+       (signal 'beginning-of-buffer nil))
+    (delete-region p (point))
+    (if (> len n)
+       (its-state-machine-keyseq (substring keyseq 0 (- len n)) 
+                                 'its-buffer-ins/del-SYL)
+      (its-set-cursor-status
+       (if (or (null its-delete-by-keystroke)
+              (its-concrete-DSYL-p (get-text-property (1- p) 'its-syl)))
+          t
+        'its-cursor))))
+  ;; exit its mode after unbind variables
+  (its-exit-mode-if-empty))
+
+(defun its-transpose-chars (n)
+  (interactive "p")
+  (let ((inhibit-read-only t)
+       (syl (get-text-property (1- (point)) 'its-syl))
+       (cursor (get-text-property (point) 'its-cursor))
+       keyseq len)
+    (cond
+     ((null syl)
+      (signal 'beginning-of-buffer nil))
+     ((eq cursor t)
+      (if (and (= n 1) (get-text-property (1+ (point)) 'its-end))
+         (progn
+           (its-backward-SYL 1)
+           (setq syl (get-text-property (1- (point)) 'its-syl))
+           (if (null syl)
+               (signal 'beginning-of-buffer nil))))
+      (its-buffer-delete-SYL syl)
+      (while (> n 0)
+       (if (get-text-property (1+ (point)) 'its-end)
+           (progn
+             (its-buffer-ins/del-SYL syl nil t)
+             (signal 'end-of-buffer nil)))
+       (its-forward-SYL 1)
+       (setq n (1- n)))
+      (while (< n 0)
+       (if (get-text-property (1- (point)) 'its-start)
+           (progn
+             (its-buffer-ins/del-SYL syl nil t)
+             (signal 'beginning-of-buffer nil)))
+       (its-backward-SYL 1)
+       (setq n (1+ n)))
+      (its-buffer-ins/del-SYL syl nil t))
+     (t
+      (setq keyseq (its-get-keyseq-syl syl)
+           len (length keyseq))
+      (cond
+       ((or (> n 1) (<= len 1))
+       (signal 'end-of-buffer nil))
+       ((>= (- n) len)
+       (signal 'beginning-of-buffer nil))
+       (t
+       (setq n (if (> n 0) (- -1 n) (1- n)))
+       (setq keyseq (concat (substring keyseq 0 n)
+                            (substring keyseq -1)
+                            (substring keyseq n -1)))
+       (if (and its-barf-on-invalid-keyseq
+                (null (its-keyseq-acceptable-p keyseq)))
+           (its-input-error))
+       (delete-region (- (point) (length (its-get-output syl))) (point))
+       (its-state-machine-keyseq keyseq 'its-buffer-ins/del-SYL)))))))
+
+(defun its-yank (&optional arg)
+  (interactive "*P")
+  (let ((inhibit-read-only t))
+    (its-input-end)
+    (yank arg)
+    (its-setup-yanked-portion (region-beginning) (region-end))))
+
+(defun its-yank-pop (arg)
+  (interactive "*p")
+  (let ((inhibit-read-only t))
+    (its-input-end)
+    (yank-pop arg)
+    (its-setup-yanked-portion (region-beginning) (region-end))))
+
+(defun its-setup-yanked-portion (start end)
+  (let ((yank-before (eq (point) end))
+       syl face lang source no-prop-source len i j l)
+    (setq source (buffer-substring start end)
+         no-prop-source (buffer-substring-no-properties start end)
+         len (length source))
+    (remove-text-properties 0 len '(intangible nil) source)
+    (egg-separate-languages source (get-text-property (1- start) 'egg-lang))
+    (setq i 0)
+    (while (< i len)
+      (setq lang (get-text-property i 'egg-lang source))
+      (if (and
+          (or (eq lang 'Chinese-GB) (eq lang 'Chinese-CNS))
+          (setq l (egg-chinese-syllable source i)))
+         (setq j (+ i l))
+       (setq j (+ i (egg-char-bytes (egg-string-to-char-at source i)))))
+      (setq syl (substring no-prop-source i j))
+      (put-text-property i j 'its-syl (cons syl syl) source)
+      (setq i j))
+    (if its-fence-face
+       (progn
+         (setq i 0)
+         (while (< i len)
+           (setq j (egg-next-single-property-change i 'egg-lang source len)
+                 face (its-get-fence-face
+                       (get-text-property i 'egg-lang source)))
+           (if face
+               (egg-set-face i j face source))
+           (setq i j))))
+    (delete-region start end)
+    (if yank-before
+       (progn
+         (add-text-properties 0 len '(read-only t intangible its-part-1) source)
+         (insert source))
+      (add-text-properties 0 len '(read-only t intangible its-part-2) source)
+      (insert source)
+      (set-marker (mark-marker) (point) (current-buffer))
+      (goto-char start))
+    (its-put-cursor t)))
+
+;; Return VOID
+(defun its-input-end ()
+  (if (null (eq its-barf-on-invalid-keyseq 'its-keyseq-test))
+      (let ((cursor (get-text-property (point) 'its-cursor)))
+       ;; key "END"
+       (if (null cursor)
+           (let ((its-current-language (get-text-property (1- (point))
+                                                          'egg-lang)))
+             (its-input (get-text-property (1- (point)) 'its-syl) -1)))
+       (delete-region (point) (1+ (point))))))
+
+(defun its-exit-mode ()
+  "Exit ITS mode."
+  (interactive)
+  (if (its-in-fence-p)
+      (let ((inhibit-read-only t))
+       (its-input-end)
+       (its-put-cursor t)
+       (its-exit-mode-internal))
+    (its-select-previous-mode t)))
+
+(defun its-exit-mode-if-empty ()
+  (and (get-text-property (1- (point)) 'its-start)
+       (get-text-property (1+ (point)) 'its-end)
+       (its-exit-mode-internal)))
+
+;; TODO: handle overwrite-mode, insertion-hook, fill...
+(defun its-exit-mode-internal (&optional proceed-to-conversion n)
+  (let (start end s context)
+    (its-select-previous-mode t)
+    ;; Delete CURSOR
+    (delete-region (point) (1+ (point)))
+    ;; Delete open fence
+    (setq s (if (get-text-property (1- (point)) 'its-start)
+               (point)
+             (previous-single-property-change (point) 'its-start))
+        start (previous-single-property-change s 'its-start nil (point-min))
+        context (get-text-property start 'its-context))
+    (delete-region start s)
+    ;; Delete close fence
+    (setq end (if (get-text-property (point) 'its-end)
+                 (point)
+               (next-single-property-change (point) 'its-end)))
+    (delete-region end
+                  (next-single-property-change end 'its-end nil (point-max)))
+    (if proceed-to-conversion
+       (egg-convert-region start end context n)
+      ;; Remove all properties
+      (goto-char start)
+      (insert (prog1
+                 (buffer-substring-no-properties start end)
+               (delete-region start end)))
+      (egg-do-auto-fill)
+      (run-hooks 'input-method-after-insert-chunk-hook))))
+
+(defun its-kick-convert-region (&optional n)
+  (interactive "P")
+  (let ((inhibit-read-only t))
+    (its-input-end)
+    (its-put-cursor t)
+    (its-exit-mode-internal t n)))
+
+(defun its-kick-convert-region-or-self-insert (&optional n)
+  (interactive "P")
+  (let ((syl (and (null (get-text-property (point) 'its-cursor))
+                 (get-text-property (1- (point)) 'its-syl))))
+    (if (its-keyseq-acceptable-p (vector last-command-char) syl)
+       (its-self-insert-char)
+      (its-kick-convert-region n))))
+
+(defun its-in-fence-p ()
+  (eq (get-text-property (point) 'intangible) 'its-part-2))
+\f
+(defvar its-translation-result "" "")
+
+(defun its-ins/del-SYL-batch (newsyl oldsyl cursor)
+  (its-update-latest-SYL newsyl)
+  (if (and newsyl
+          (consp (cdr newsyl))
+          (not (its-kst-p (its-get-kst/t newsyl))))
+      ;; DSYL
+      (let ((output (its-get-output newsyl))
+           (oldlen (length its-translation-result)))
+       (setq its-translation-result (concat its-translation-result output))
+       (put-text-property oldlen (length its-translation-result)
+                          'egg-lang its-current-language
+                          its-translation-result)))
+  cursor)
+
+(defun its-translate-region (start end)
+  (interactive "r")
+  (its-translate-region-internal start end)
+  (set-text-properties start (point) nil))
+
+(defun its-translate-region-internal (start end)
+  (setq its-translation-result "")
+  (goto-char start)
+  (let ((i 0)
+       (syl (its-initial-ISYL))
+       ;; temporally enable DING
+       (its-barf-on-invalid-keyseq t)
+       cursor)
+    (while (< (point) end)
+      (let ((key (following-char)))
+       (setq cursor (its-state-machine syl key 'its-ins/del-SYL-batch))
+       (forward-char 1)
+       (if cursor
+           (setq syl (its-initial-ISYL))
+         (setq syl its-latest-SYL))))
+    (if (eq syl its-latest-SYL)
+       (its-state-machine syl -1 'its-ins/del-SYL-batch))
+    (delete-region start end)
+    (insert its-translation-result)))
+\f
+(defun its-set-mode-line-title ()
+  (let ((title (its-get-indicator (symbol-value its-current-map))))
+    (setq current-input-method-title (if its-previous-select-func
+                                        (concat "<" title ">")
+                                      title))
+    (force-mode-line-update)))
+
+(defun its-select-mode-temporally (func)
+  (let ((select-func its-current-select-func))
+    (let ((its-previous-select-func t))
+      (funcall func))
+    (if (null its-previous-select-func)
+       (setq its-previous-select-func select-func))
+    (its-set-mode-line-title)))
+
+(defun its-select-previous-mode (&optional quiet)
+  (interactive)
+  (if (null its-previous-select-func)
+      (if (null quiet)
+         (beep))
+    (funcall its-previous-select-func)
+    (setq its-previous-select-func nil)
+    (its-set-mode-line-title)))
+
+(defun its-set-stroke-input (alist)
+  (let ((a alist))
+    (while a
+      (setq its-stroke-input-alist
+           (delq (assq (caar a) its-stroke-input-alist)
+                 its-stroke-input-alist))
+      (setq a (cdr a)))
+    (setq its-stroke-input-alist
+         (append alist its-stroke-input-alist))))
+
+(defun its-mode ()
+  "\\{its-mode-map}"
+  ;; dummy function to get docstring
+  )
+
+(defun its-mode-help-command ()
+  "Display documentation for ITS mode."
+  (interactive)
+  (with-output-to-temp-buffer "*Help*"
+    (princ "ITS mode:\n")
+    (princ (documentation 'its-mode))
+    (help-setup-xref (cons #'help-xref-mode (current-buffer)) (interactive-p))))
+
+(provide 'its)
+;;; its.el ends here.
diff --git a/its/ascii.el b/its/ascii.el
new file mode 100644 (file)
index 0000000..b7c16ca
--- /dev/null
@@ -0,0 +1,61 @@
+;;; its/ascii.el --- ASCII Input in Egg Input Method Architecture
+
+;; Copyright (C) 1999,2000 PFU LIMITED
+
+;; Author: KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+;;
+;; Symbol input is desined by jiro@math.keio.ac.jp (TANAKA Jiro)
+;; This file is based on the rules of its/hira.el in Mule-2.3 distribution.
+;;
+
+;;; Code:
+
+(eval-when-compile
+  (require 'its))
+
+(define-its-state-machine its-up-map
+  "upcase" "aA" nil
+  "Map for upcase input."
+
+  (let ((i ? ))
+    (while (<= i ?~)
+      (its-defrule (char-to-string i) (upcase (char-to-string i)))
+      (setq i (1+ i)))))
+
+(define-its-state-machine-append its-up-map)
+
+(define-its-state-machine its-down-map
+  "downcase" "aa" nil
+  "Map for downcase input."
+
+  (let ((i ? ))
+    (while (<= i ?~)
+      (its-defrule (char-to-string i) (char-to-string i))
+      (setq i (1+ i)))))
+
+(define-its-state-machine-append its-down-map)
+
+(provide 'its/ascii)
diff --git a/its/bixing.el b/its/bixing.el
new file mode 100644 (file)
index 0000000..b623515
--- /dev/null
@@ -0,0 +1,235 @@
+;;; its/bixing.el --- Bixing (stroke) Input in Egg Input Method Architecture
+
+;; Copyright (C) 1999,2000 PFU LIMITED
+
+;; Author: KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+
+;;; Code:
+
+
+(eval-when-compile
+  (require 'its)
+  (require 'cl))
+
+(defvar its-qianma-enable-quanjioao-alphabet
+  (if (boundp 'its-enable-fullwidth-alphabet)
+      its-enable-fullwidth-alphabet
+    t)
+  "*Enable Quanjiao alphabet")
+
+(defvar its-qianma-open-braket  "\e$A!8\e(B" "*[") ; "\e$A#[\e(B"
+(defvar its-qianma-close-braket "\e$A!9\e(B" "*]") ; "\e$A#]\e(B"
+
+(defvar its-wubi-enable-quanjioao-alphabet
+  (if (boundp 'its-enable-fullwidth-alphabet)
+      its-enable-fullwidth-alphabet
+    t)
+  "*Enable Quanjiao alphabet")
+
+(defvar its-wubi-open-braket  "\e$A!8\e(B" "*[") ; "\e$A#[\e(B"
+(defvar its-wubi-close-braket "\e$A!9\e(B" "*]") ; "\e$A#]\e(B"
+
+(its-set-stroke-input '((QianMa . 3) (WuBi . 4)))
+
+(egg-set-message-language-alist '((QianMa . Chinese-GB) (WuBi . Chinese-GB)))
+
+(define-its-state-machine its-qianma-map
+  "qinama" "\e$AG.\e(B" QianMa
+  "Map for QianMa input. (Chinese-GB)"
+
+  (defconst its-quanjiao-escape "Z")
+  (defconst its-banjiao-escape  "X")
+
+  (its-defrule-select-mode-temporally "B" downcase)
+  (its-defrule-select-mode-temporally "Q" quanjiao-downcase-cn)
+
+  (let ((ch (string-to-list "0123456789abcdefghijklmnopqrstuvwxyz;=@[]")))
+    (while ch
+      (its-defrule (char-to-string (car ch)) (char-to-string (car ch)))
+      (setq ch (cdr ch))))
+
+  (dolist (ascii '(("0" . "\e$A#0\e(B")  ("1" . "\e$A#1\e(B")  ("2" . "\e$A#2\e(B")  ("3" . "\e$A#3\e(B")
+                  ("4" . "\e$A#4\e(B")  ("5" . "\e$A#5\e(B")  ("6" . "\e$A#6\e(B")  ("7" . "\e$A#7\e(B")
+                  ("8" . "\e$A#8\e(B")  ("9" . "\e$A#9\e(B") 
+                  (" " . "\e$A!!\e(B")  ("!" . "\e$A#!\e(B")  ("@" . "\e$A#@\e(B")  ("#" . "\e$A##\e(B")
+                  ("$" . "\e$A!g\e(B")  ("%" . "\e$A#%\e(B")  ("^" . "\e$A#^\e(B")  ("&" . "\e$A#&\e(B")
+                  ("*" . "\e$A#*\e(B")  ("(" . "\e$A#(\e(B")  (")" . "\e$A#)\e(B")
+                  ("-" . "\e$A#-\e(B")  ("=" . "\e$A#=\e(B")  ("`" . "\e$A#`\e(B")  ("\\" . "\e$A#\\e(B")
+                  ("|" . "\e$A#|\e(B")  ("_" . "\e$A#_\e(B")  ("+" . "\e$A#+\e(B")  ("~" . "\e$A!+\e(B")
+                  ("[" . "\e$A#[\e(B")  ("]" . "\e$A#]\e(B")  ("{" . "\e$A#{\e(B")  ("}" . "\e$A#}\e(B")
+                  (":" . "\e$A#:\e(B")  (";" . "\e$A#;\e(B")  ("\"" . "\e$A#"\e(B") ("'" . "\e$A#'\e(B")
+                  ("<" . "\e$A#<\e(B")  (">" . "\e$A#>\e(B")  ("?" . "\e$A#?\e(B")  ("/" . "\e$A#/\e(B")
+                  ("," . "\e$A#,\e(B")  ("." . "\e$A#.\e(B")
+                  ("a" . "\e$A#a\e(B")  ("b" . "\e$A#b\e(B")  ("c" . "\e$A#c\e(B")  ("d" . "\e$A#d\e(B")
+                  ("e" . "\e$A#e\e(B")  ("f" . "\e$A#f\e(B")  ("g" . "\e$A#g\e(B")  ("h" . "\e$A#h\e(B")
+                  ("i" . "\e$A#i\e(B")  ("j" . "\e$A#j\e(B")  ("k" . "\e$A#k\e(B")  ("l" . "\e$A#l\e(B")
+                  ("m" . "\e$A#m\e(B")  ("n" . "\e$A#n\e(B")  ("o" . "\e$A#o\e(B")  ("p" . "\e$A#p\e(B")
+                  ("q" . "\e$A#q\e(B")  ("r" . "\e$A#r\e(B")  ("s" . "\e$A#s\e(B")  ("t" . "\e$A#t\e(B")
+                  ("u" . "\e$A#u\e(B")  ("v" . "\e$A#v\e(B")  ("w" . "\e$A#w\e(B")  ("x" . "\e$A#x\e(B")
+                  ("y" . "\e$A#y\e(B")  ("z" . "\e$A#z\e(B")
+                  ("A" . "\e$A#A\e(B")  ("B" . "\e$A#B\e(B")  ("C" . "\e$A#C\e(B")  ("D" . "\e$A#D\e(B")
+                  ("E" . "\e$A#E\e(B")  ("F" . "\e$A#F\e(B")  ("G" . "\e$A#G\e(B")  ("H" . "\e$A#H\e(B")
+                  ("I" . "\e$A#I\e(B")  ("J" . "\e$A#J\e(B")  ("K" . "\e$A#K\e(B")  ("L" . "\e$A#L\e(B")
+                  ("M" . "\e$A#M\e(B")  ("N" . "\e$A#N\e(B")  ("O" . "\e$A#O\e(B")  ("P" . "\e$A#P\e(B")
+                  ("Q" . "\e$A#Q\e(B")  ("R" . "\e$A#R\e(B")  ("S" . "\e$A#S\e(B")  ("T" . "\e$A#T\e(B")
+                  ("U" . "\e$A#U\e(B")  ("V" . "\e$A#V\e(B")  ("W" . "\e$A#W\e(B")  ("X" . "\e$A#X\e(B")
+                  ("Y" . "\e$A#Y\e(B")  ("Z" . "\e$A#Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule (concat its-banjiao-escape in) in t)
+      (its-defrule (concat its-quanjiao-escape in) out t)))
+
+  (its-defrule ","     "\e$A#,\e(B"      t)
+  (its-defrule "."     "\e$A!#\e(B"      t)
+  (its-defrule "/"     "\e$A!"\e(B"      t)
+  (its-defrule ":"     "\e$A#:\e(B"      t)
+  (its-defrule "?"     "\e$A#?\e(B"      t)
+  (its-defrule "!"     "\e$A#!\e(B"      t))
+
+(define-its-state-machine its-wubi-map
+  "wubi" "\e$ANe\e(B" WuBi
+  "Map for WuBi input. (Chinese-GB)"
+
+  (defconst its-quanjiao-escape "Z")
+  (defconst its-banjiao-escape  "X")
+
+  (its-defrule-select-mode-temporally "B" downcase)
+  (its-defrule-select-mode-temporally "Q" quanjiao-downcase-cn)
+
+  (let ((ch (string-to-list "abcdefghijklmnopqrstuvwxy")))
+    (while ch
+      (its-defrule (char-to-string (car ch)) (char-to-string (car ch)))
+      (setq ch (cdr ch))))
+
+  (dolist (ascii '(("0" . "\e$A#0\e(B")  ("1" . "\e$A#1\e(B")  ("2" . "\e$A#2\e(B")  ("3" . "\e$A#3\e(B")
+                  ("4" . "\e$A#4\e(B")  ("5" . "\e$A#5\e(B")  ("6" . "\e$A#6\e(B")  ("7" . "\e$A#7\e(B")
+                  ("8" . "\e$A#8\e(B")  ("9" . "\e$A#9\e(B") 
+                  (" " . "\e$A!!\e(B")  ("!" . "\e$A#!\e(B")  ("@" . "\e$A#@\e(B")  ("#" . "\e$A##\e(B")
+                  ("$" . "\e$A!g\e(B")  ("%" . "\e$A#%\e(B")  ("^" . "\e$A#^\e(B")  ("&" . "\e$A#&\e(B")
+                  ("*" . "\e$A#*\e(B")  ("(" . "\e$A#(\e(B")  (")" . "\e$A#)\e(B")
+                  ("-" . "\e$A#-\e(B")  ("=" . "\e$A#=\e(B")  ("`" . "\e$A#`\e(B")  ("\\" . "\e$A#\\e(B")
+                  ("|" . "\e$A#|\e(B")  ("_" . "\e$A#_\e(B")  ("+" . "\e$A#+\e(B")  ("~" . "\e$A!+\e(B")
+                  ("[" . "\e$A#[\e(B")  ("]" . "\e$A#]\e(B")  ("{" . "\e$A#{\e(B")  ("}" . "\e$A#}\e(B")
+                  (":" . "\e$A#:\e(B")  (";" . "\e$A#;\e(B")  ("\"" . "\e$A#"\e(B") ("'" . "\e$A#'\e(B")
+                  ("<" . "\e$A#<\e(B")  (">" . "\e$A#>\e(B")  ("?" . "\e$A#?\e(B")  ("/" . "\e$A#/\e(B")
+                  ("," . "\e$A#,\e(B")  ("." . "\e$A#.\e(B")
+                  ("a" . "\e$A#a\e(B")  ("b" . "\e$A#b\e(B")  ("c" . "\e$A#c\e(B")  ("d" . "\e$A#d\e(B")
+                  ("e" . "\e$A#e\e(B")  ("f" . "\e$A#f\e(B")  ("g" . "\e$A#g\e(B")  ("h" . "\e$A#h\e(B")
+                  ("i" . "\e$A#i\e(B")  ("j" . "\e$A#j\e(B")  ("k" . "\e$A#k\e(B")  ("l" . "\e$A#l\e(B")
+                  ("m" . "\e$A#m\e(B")  ("n" . "\e$A#n\e(B")  ("o" . "\e$A#o\e(B")  ("p" . "\e$A#p\e(B")
+                  ("q" . "\e$A#q\e(B")  ("r" . "\e$A#r\e(B")  ("s" . "\e$A#s\e(B")  ("t" . "\e$A#t\e(B")
+                  ("u" . "\e$A#u\e(B")  ("v" . "\e$A#v\e(B")  ("w" . "\e$A#w\e(B")  ("x" . "\e$A#x\e(B")
+                  ("y" . "\e$A#y\e(B")  ("z" . "\e$A#z\e(B")
+                  ("A" . "\e$A#A\e(B")  ("B" . "\e$A#B\e(B")  ("C" . "\e$A#C\e(B")  ("D" . "\e$A#D\e(B")
+                  ("E" . "\e$A#E\e(B")  ("F" . "\e$A#F\e(B")  ("G" . "\e$A#G\e(B")  ("H" . "\e$A#H\e(B")
+                  ("I" . "\e$A#I\e(B")  ("J" . "\e$A#J\e(B")  ("K" . "\e$A#K\e(B")  ("L" . "\e$A#L\e(B")
+                  ("M" . "\e$A#M\e(B")  ("N" . "\e$A#N\e(B")  ("O" . "\e$A#O\e(B")  ("P" . "\e$A#P\e(B")
+                  ("Q" . "\e$A#Q\e(B")  ("R" . "\e$A#R\e(B")  ("S" . "\e$A#S\e(B")  ("T" . "\e$A#T\e(B")
+                  ("U" . "\e$A#U\e(B")  ("V" . "\e$A#V\e(B")  ("W" . "\e$A#W\e(B")  ("X" . "\e$A#X\e(B")
+                  ("Y" . "\e$A#Y\e(B")  ("Z" . "\e$A#Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule (concat its-banjiao-escape in) in t)
+      (its-defrule (concat its-quanjiao-escape in) out t)))
+
+  (its-defrule ","     "\e$A#,\e(B"      t)
+  (its-defrule "."     "\e$A!#\e(B"      t)
+  (its-defrule "/"     "\e$A!"\e(B"      t)
+  (its-defrule ";"     "\e$A#;\e(B"      t)
+  (its-defrule ":"     "\e$A#:\e(B"      t)
+  (its-defrule "?"     "\e$A#?\e(B"      t)
+  (its-defrule "!"     "\e$A#!\e(B"      t))
+
+(define-its-state-machine-append its-qianma-map
+  (its-defrule "{" its-qianma-open-braket)
+  (its-defrule "}" its-qianma-close-braket)
+
+  (if its-qianma-enable-quanjioao-alphabet
+      (progn
+       (its-defrule "#"  "\e$A##\e(B"  t)  (its-defrule "$"  "\e$A!g\e(B"  t)
+       (its-defrule "%"  "\e$A#%\e(B"  t)  (its-defrule "^"  "\e$A#^\e(B"  t)
+       (its-defrule "&"  "\e$A#&\e(B"  t)  (its-defrule "*"  "\e$A#*\e(B"  t)
+       (its-defrule "("  "\e$A#(\e(B"  t)  (its-defrule ")"  "\e$A#)\e(B"  t)
+       (its-defrule "-"  "\e$A#-\e(B"  t)  (its-defrule "~"  "\e$A!+\e(B"  t)
+       (its-defrule "`"  "\e$A#`\e(B"  t)
+       (its-defrule "\\" "\e$A#\\e(B"  t)  (its-defrule "|"  "\e$A#|\e(B"  t)
+       (its-defrule "_"  "\e$A#_\e(B"  t)  (its-defrule "+"  "\e$A#+\e(B"  t)
+       (its-defrule "\"" "\e$A#"\e(B"  t)  (its-defrule "'"  "\e$A#'\e(B"  t)
+       (its-defrule "<"  "\e$A#<\e(B"  t)  (its-defrule ">"  "\e$A#>\e(B"  t))
+    (progn
+      (its-defrule "#"  "#"  t)  (its-defrule "$"  "$"  t)
+      (its-defrule "%"  "%"  t)  (its-defrule "^"  "^"  t)
+      (its-defrule "&"  "&"  t)  (its-defrule "*"  "*"  t)
+      (its-defrule "("  "("  t)  (its-defrule ")"  ")"  t)
+      (its-defrule "-"  "-"  t)  (its-defrule "~"  "~"  t)
+      (its-defrule "`"  "`"  t)
+      (its-defrule "\\" "\\" t)  (its-defrule "|"  "|"  t)
+      (its-defrule "_"  "_"  t)  (its-defrule "+"  "+"  t)
+      (its-defrule "\"" "\"" t)  (its-defrule "'"  "'"  t)
+      (its-defrule "<"  "<"  t)  (its-defrule ">"  ">"  t))))
+
+(define-its-state-machine-append its-wubi-map
+  (its-defrule "[" its-wubi-open-braket)
+  (its-defrule "]" its-wubi-close-braket)
+
+  (if its-wubi-enable-quanjioao-alphabet
+      (progn
+       (its-defrule "1"  "\e$A#1\e(B"  t)  (its-defrule "2"  "\e$A#2\e(B"  t)
+       (its-defrule "3"  "\e$A#3\e(B"  t)  (its-defrule "4"  "\e$A#4\e(B"  t)
+       (its-defrule "5"  "\e$A#5\e(B"  t)  (its-defrule "6"  "\e$A#6\e(B"  t)
+       (its-defrule "7"  "\e$A#7\e(B"  t)  (its-defrule "8"  "\e$A#8\e(B"  t)
+       (its-defrule "9"  "\e$A#9\e(B"  t)  (its-defrule "0"  "\e$A#0\e(B"  t)
+       (its-defrule "@"  "\e$A#@\e(B"  t)
+       (its-defrule "#"  "\e$A##\e(B"  t)  (its-defrule "$"  "\e$A!g\e(B"  t)
+       (its-defrule "%"  "\e$A#%\e(B"  t)  (its-defrule "^"  "\e$A#^\e(B"  t)
+       (its-defrule "&"  "\e$A#&\e(B"  t)  (its-defrule "*"  "\e$A#*\e(B"  t)
+       (its-defrule "("  "\e$A#(\e(B"  t)  (its-defrule ")"  "\e$A#)\e(B"  t)
+       (its-defrule "-"  "\e$A#-\e(B"  t)  (its-defrule "~"  "\e$A!+\e(B"  t)
+       (its-defrule "="  "\e$A#=\e(B"  t)  (its-defrule "`"  "\e$A#`\e(B"  t)
+       (its-defrule "\\" "\e$A#\\e(B"  t)  (its-defrule "|"  "\e$A#|\e(B"  t)
+       (its-defrule "_"  "\e$A#_\e(B"  t)  (its-defrule "+"  "\e$A#+\e(B"  t)
+       (its-defrule "{"  "\e$A#{\e(B"  t)  (its-defrule "}"  "\e$A#}\e(B"  t)
+       (its-defrule "\"" "\e$A#"\e(B"  t)  (its-defrule "'"  "\e$A#'\e(B"  t)
+       (its-defrule "<"  "\e$A#<\e(B"  t)  (its-defrule ">"  "\e$A#>\e(B"  t))
+    (progn
+      (its-defrule "1"  "1"  t)  (its-defrule "2"  "2"  t)
+      (its-defrule "3"  "3"  t)  (its-defrule "4"  "4"  t)
+      (its-defrule "5"  "5"  t)  (its-defrule "6"  "6"  t)
+      (its-defrule "7"  "7"  t)  (its-defrule "8"  "8"  t)
+      (its-defrule "9"  "9"  t)  (its-defrule "0"  "0"  t)
+      (its-defrule "@"  "@"  t)
+      (its-defrule "#"  "#"  t)  (its-defrule "$"  "$"  t)
+      (its-defrule "%"  "%"  t)  (its-defrule "^"  "^"  t)
+      (its-defrule "&"  "&"  t)  (its-defrule "*"  "*"  t)
+      (its-defrule "("  "("  t)  (its-defrule ")"  ")"  t)
+      (its-defrule "-"  "-"  t)  (its-defrule "~"  "~"  t)
+      (its-defrule "="  "="  t)  (its-defrule "`"  "`"  t)
+      (its-defrule "\\" "\\" t)  (its-defrule "|"  "|"  t)
+      (its-defrule "_"  "_"  t)  (its-defrule "+"  "+"  t)
+      (its-defrule "{"  "{"  t)  (its-defrule "}"  "}"  t)
+      (its-defrule "\"" "\"" t)  (its-defrule "'"  "'"  t)
+      (its-defrule "<"  "<"  t)  (its-defrule ">"  ">"  t))))
+
+(provide 'its/bixing)
diff --git a/its/erpin.el b/its/erpin.el
new file mode 100644 (file)
index 0000000..6fa8d15
--- /dev/null
@@ -0,0 +1,425 @@
+;;; its/erpin.el --- Erpin Input in Egg Input Method Architecture
+
+;; Copyright (C) 1999,2000 PFU LIMITED
+
+;; Author: KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+
+;;; Code:
+
+
+(eval-when-compile
+  (require 'its)
+  (require 'cl))
+
+(eval-when (compile)
+  (defconst its-compaction-enable t))
+
+(defvar its-erpin-cn-enable-quanjioao-alphabet
+  (if (boundp 'its-enable-fullwidth-alphabet)
+      its-enable-fullwidth-alphabet
+    t)
+  "*Enable Quanjiao alphabet")
+
+(defvar its-erpin-cn-open-braket  "\e$A!8\e(B" "*[") ; "\e$A#[\e(B"
+(defvar its-erpin-cn-close-braket "\e$A!9\e(B" "*]") ; "\e$A#]\e(B"
+
+(defvar its-erpin-tw-enable-quanjioao-alphabet
+  (if (boundp 'its-enable-fullwidth-alphabet)
+      its-enable-fullwidth-alphabet
+    t)
+  "*Enable Quanjiao alphabet")
+
+(defvar its-erpin-tw-open-braket  "\e$(G!V\e(B" "*[") ; "\e$(G!b\e(B "
+(defvar its-erpin-tw-close-braket "\e$(G!W\e(B" "*]") ; "\e$(G!c\e(B"
+
+(eval-when-compile
+  (defun its-define-erpin-qingsheng (shengmu yunmu &optional y)
+    (let ((input (concat (car shengmu) yunmu))
+         (output (concat (cdr shengmu) (if y y yunmu) "\e(0@\e(B")))
+      (prog1
+         (its-defrule input output)
+       (its-defrule (concat input " ") output)
+       (its-defrule (concat input "0") output))))
+
+  (defmacro its-do-erpin-table (list)
+    `(progn
+       ,@(mapcar (lambda (syl)
+                  `(its-define-erpin ,(car syl) ,(cdr syl)))
+                list)))
+
+  (defmacro its-define-erpin (shengmu yunmu)
+    `(let ((y1 (nth 1 ,yunmu)) (y2 (nth 2 ,yunmu)) (y3 (nth 3 ,yunmu))
+          (y4 (nth 4 ,yunmu)) (y5 (nth 5 ,yunmu)) (y (car ,yunmu))
+          (ss (list ,@shengmu)) sa sd state)
+       (while ss
+        (setq sa (caar ss) sd (cdar ss) 
+              state (its-define-erpin-qingsheng (car ss) y y5))
+        (its-make-next-state state ?1 (concat sd y1 "\e(0@\e(B"))
+        (its-make-next-state state ?2 (concat sd y2 "\e(0@\e(B"))
+        (its-make-next-state state ?3 (concat sd y3 "\e(0@\e(B"))
+        (its-make-next-state state ?4 (concat sd y4 "\e(0@\e(B"))
+        (setq ss (cdr ss)))))
+
+  (defmacro its-define-erpin-table ()
+    '(let ((O '("o" . ""))  (B '("b" . "B")) (C '("c" . "C")) (D '("d" . "D"))
+          (F '("f" . "F")) (G '("g" . "G")) (H '("h" . "H")) (J '("j" . "J"))
+          (K '("k" . "K")) (L '("l" . "L")) (M '("m" . "M")) (N '("n" . "N"))
+          (P '("p" . "P")) (Q '("q" . "Q")) (R '("r" . "R")) (S '("s" . "S"))
+          (T '("t" . "T")) (W '("w" . "W")) (X '("x" . "X")) (Y '("y" . "Y"))
+          (Z '("z" . "Z"))
+          (I '("i" . "Ch")) (U '("u" . "Sh")) (V '("v" . "Zh"))
+
+          (a    '("a"  "\e(0!\e(B"    "\e(0"\e(B"    "\e(0#\e(B"    "\e(0$\e(B"    "a"   ))
+          (ai   '("s"  "\e(0!\e(Bi"   "\e(0"\e(Bi"   "\e(0#\e(Bi"   "\e(0$\e(Bi"   "ai"  ))
+          (an   '("f"  "\e(0!\e(Bn"   "\e(0"\e(Bn"   "\e(0#\e(Bn"   "\e(0$\e(Bn"   "an"  ))
+          (ang  '("g"  "\e(0!\e(Bng"  "\e(0"\e(Bng"  "\e(0#\e(Bng"  "\e(0$\e(Bng"  "ang" ))
+          (ao   '("d"  "\e(0!\e(Bo"   "\e(0"\e(Bo"   "\e(0#\e(Bo"   "\e(0$\e(Bo"   "ao"  ))
+          (e    '("e"  "\e(0%\e(B"    "\e(0&\e(B"    "\e(0'\e(B"    "\e(0(\e(B"    "e"   ))
+          (ei   '("w"  "\e(0%\e(Bi"   "\e(0&\e(Bi"   "\e(0'\e(Bi"   "\e(0(\e(Bi"   "ei"  ))
+          (en   '("r"  "\e(0%\e(Bn"   "\e(0&\e(Bn"   "\e(0'\e(Bn"   "\e(0(\e(Bn"   "en"  ))
+          (eng  '("t"  "\e(0%\e(Bng"  "\e(0&\e(Bng"  "\e(0'\e(Bng"  "\e(0(\e(Bng"  "eng" ))
+          (er   '("y"  "\e(0%\e(Br"   "\e(0&\e(Br"   "\e(0'\e(Br"   "\e(0(\e(Br"   "er"  ))
+          (i    '("i"  "\e(0)\e(B"    "\e(0*\e(B"    "\e(0+\e(B"    "\e(0,\e(B"    "i"   ))
+          (ia   '("p"  "i\e(0!\e(B"   "i\e(0"\e(B"   "i\e(0#\e(B"   "i\e(0$\e(B"   "ia"  ))
+          (ian  '("h"  "i\e(0!\e(Bn"  "i\e(0"\e(Bn"  "i\e(0#\e(Bn"  "i\e(0$\e(Bn"  "ian" ))
+          (iang '("j"  "i\e(0!\e(Bng" "i\e(0"\e(Bng" "i\e(0#\e(Bng" "i\e(0$\e(Bng" "iang"))
+          (iao  '("k"  "i\e(0!\e(Bo"  "i\e(0"\e(Bo"  "i\e(0#\e(Bo"  "i\e(0$\e(Bo"  "iao" ))
+          (ie   '("l"  "i\e(0%\e(B"   "i\e(0&\e(B"   "i\e(0'\e(B"   "i\e(0(\e(B"   "ie"  ))
+          (in   '("m"  "\e(0)\e(Bn"   "\e(0*\e(Bn"   "\e(0+\e(Bn"   "\e(0,\e(Bn"   "in"  ))
+          (ing  '("n"  "\e(0)\e(Bng"  "\e(0*\e(Bng"  "\e(0+\e(Bng"  "\e(0,\e(Bng"  "ing" ))
+          (iong '("b"  "i\e(0-\e(Bng" "i\e(0.\e(Bng" "i\e(0/\e(Bng" "i\e(00\e(Bng" "iong"))
+          (iu   '("y"  "i\e(01\e(B"   "i\e(02\e(B"   "i\e(03\e(B"   "i\e(04\e(B"   "iu"  ))
+          (o    '("o"  "\e(0-\e(B"    "\e(0.\e(B"    "\e(0/\e(B"    "\e(00\e(B"    "o"   ))
+          (ong  '("b"  "\e(0-\e(Bng"  "\e(0.\e(Bng"  "\e(0/\e(Bng"  "\e(00\e(Bng"  "ong" ))
+          (ou   '("q"  "\e(0-\e(Bu"   "\e(0.\e(Bu"   "\e(0/\e(Bu"   "\e(00\e(Bu"   "ou"  ))
+          (u    '("u"  "\e(01\e(B"    "\e(02\e(B"    "\e(03\e(B"    "\e(04\e(B"    "u"   ))
+          (v    '("v"  "\e(05\e(B"    "\e(06\e(B"    "\e(07\e(B"    "\e(08\e(B"    "\e(09\e(B"   ))
+          (ua   '("p"  "u\e(0!\e(B"   "u\e(0"\e(B"   "u\e(0#\e(B"   "u\e(0$\e(B"   "ua"  ))
+          (uai  '("k"  "u\e(0!\e(Bi"  "u\e(0"\e(Bi"  "u\e(0#\e(Bi"  "u\e(0$\e(Bi"  "uai" ))
+          (uan  '("x"  "u\e(0!\e(Bn"  "u\e(0"\e(Bn"  "u\e(0#\e(Bn"  "u\e(0$\e(Bn"  "uan" ))
+          (uang '("j"  "u\e(0!\e(Bng" "u\e(0"\e(Bng" "u\e(0#\e(Bng" "u\e(0$\e(Bng" "uang"))
+          (ue   '("c"  "u\e(0%\e(B"   "u\e(0&\e(B"   "u\e(0'\e(B"   "u\e(0(\e(B"   "ue"  ))
+          (ve   '("c"  "\e(09%\e(B"   "\e(09&\e(B"   "\e(09'\e(B"   "\e(09(\e(B"   "\e(09\e(Be"  ))
+          (ui   '("c"  "u\e(0)\e(B"   "u\e(0*\e(B"   "u\e(0+\e(B"   "u\e(0,\e(B"   "ui"  ))
+          (un   '("z"  "\e(01\e(Bn"   "\e(02\e(Bn"   "\e(03\e(Bn"   "\e(04\e(Bn"   "un"  ))
+          (uo   '("o"  "u\e(0-\e(B"   "u\e(0.\e(B"   "u\e(0/\e(B"   "u\e(00\e(B"   "uo"  )))
+
+       (its-do-erpin-table
+       (((O B C D F G H   K L M N P     S T W   Y Z I U V) . a)
+        ((O B C D   G H   K L M N P     S T W     Z I U V) . ai)
+        ((O B C D F G H   K L M N P   R S T W   Y Z I U V) . an)
+        ((O B C D F G H   K L M N P   R S T W   Y Z I U V) . ang)
+        ((O B C D   G H   K L M N P   R S T     Y Z I U V) . ao)
+        ((O   C D   G H   K L M N     R S T     Y Z I U V) . e)
+        ((O B C D F G H   K L M N P       T W     Z   U V) . ei)
+        ((O B C D F G H   K   M N P   R S   W     Z I U V) . en)
+        ((O B C D F G H   K L M N P   R S T W     Z I U V) . eng)
+        ((O                                              ) . er)
+        ((  B C D       J   L M N P Q R S T   X Y Z I U V) . i)
+        ((      D       J   L       Q         X          ) . ia)
+        ((  B   D       J   L M N P Q     T   X          ) . ian)
+        ((              J   L   N   Q         X          ) . iang)
+        ((  B   D       J   L M N P Q     T   X          ) . iao)
+        ((  B   D       J   L M N P Q     T   X          ) . ie)
+        ((  B           J   L M N P Q         X Y        ) . in)
+        ((  B   D       J   L M N P Q     T   X Y        ) . ing)
+        ((              J           Q         X          ) . iong)
+        ((      D       J   L M N   Q         X          ) . iu)
+        ((O B     F           M   P         W   Y        ) . o)
+        ((    C D   G H   K L   N     R S T     Y Z I   V) . ong)
+        ((O   C D F G H   K L M N P   R S T     Y Z I U V) . ou)
+        ((  B C D F G H J K L M N P Q R S T W X Y Z I U V) . u)
+        ((                  L   N                        ) . v)
+        ((          G H   K           R             I U V) . ua)
+        ((          G H   K                         I U V) . uai)
+        ((    C D   G H J K L   N   Q R S T   X Y Z I U V) . uan)
+        ((          G H   K                         I U V) . uang)
+        ((              J           Q         X Y        ) . ue)
+        ((                  L   N                        ) . ve)
+        ((    C D   G H   K           R S T       Z I U V) . ui)
+        ((    C D   G H J K L       Q R S T   X Y Z I U V) . un)
+        ((    C D   G H   K L   N     R S T       Z I U V) . uo)
+
+        (('("" . "")) . (cons "er" (cdr er)))
+
+        ((J Q X) . (cons "a" (cdr ia  )))
+        ((J Q X) . (cons "s" (cdr ia  )))
+        ((J Q X) . (cons "f" (cdr ian )))
+        ((J Q X) . (cons "g" (cdr iang)))
+        ((J Q X) . (cons "d" (cdr iao )))
+        ((J Q X) . (cons "e" (cdr ie  )))
+        ((J Q X) . (cons "w" (cdr ie  )))
+        ((J Q X) . (cons "r" (cdr in  )))
+        ((J Q X) . (cons "t" (cdr ing )))
+        ((J Q X) . (cons "q" (cdr iu  )))))
+
+       (dolist (SHENG (list B C D F G H J K L M N P Q R S T W X Y Z I U V))
+        (its-defoutput (car SHENG) (cdr SHENG)))
+
+       (its-define-erpin-qingsheng     H        "m")
+       (its-define-erpin-qingsheng     H        "n"    "ng")
+       (its-define-erpin-qingsheng     O        "m")
+       (its-define-erpin-qingsheng     O        "n")
+
+       (its-defrule    "on5"   "ng\e(0@\e(B")
+       (its-defrule    "on2"   "\e(0=@\e(B")
+       (its-defrule    "on3"   "\e(0>@\e(B")
+       (its-defrule    "on4"   "\e(0?@\e(B"))))
+
+(define-its-state-machine its-erpin-cn-map
+  "erpin-cn" "\e$A6~\e(BG" Chinese-GB
+  "Map for Erpin input. (Chinese-GB)"
+
+  (defconst its-quanjiao-escape "Z")
+  (defconst its-banjiao-escape  "X")
+
+  (its-defrule-select-mode-temporally "B" downcase)
+  (its-defrule-select-mode-temporally "Q" quanjiao-downcase-cn)
+
+  (its-define-erpin-table)
+  (its-defrule "b "    "\e$A2;\e(B")
+  (its-defrule "c "    "\e$A2E\e(B")
+  (its-defrule "ch "   "\e$A3v\e(B")
+  (its-defrule "d "    "\e$A5D\e(B")
+  (its-defrule "f "    "\e$A74\e(B")
+  (its-defrule "g "    "\e$A8v\e(B")
+  (its-defrule "h "    "\e$A:M\e(B")
+  (its-defrule "i "    "\e$AR;\e(B")
+  (its-defrule "j "    "\e$A>M\e(B")
+  (its-defrule "k "    "\e$A?I\e(B")
+  (its-defrule "l "    "\e$AAK\e(B")
+  (its-defrule "m "    "\e$AC?\e(B")
+  (its-defrule "n "    "\e$ADj\e(B")
+  (its-defrule "p "    "\e$AEz\e(B")
+  (its-defrule "q "    "\e$AH%\e(B")
+  (its-defrule "r "    "\e$AHU\e(B")
+  (its-defrule "s "    "\e$AJG\e(B")
+  (its-defrule "u "    "\e$AIO\e(B")
+  (its-defrule "t "    "\e$AK{\e(B")
+  (its-defrule "w "    "\e$ANR\e(B")
+  (its-defrule "x "    "\e$AOr\e(B")
+  (its-defrule "y "    "\e$ASV\e(B")
+  (its-defrule "z "    "\e$ATZ\e(B")
+  (its-defrule "v "    "\e$AWE\e(B")
+
+  (dolist (ascii '(("0" . "\e$A#0\e(B")  ("1" . "\e$A#1\e(B")  ("2" . "\e$A#2\e(B")  ("3" . "\e$A#3\e(B")
+                  ("4" . "\e$A#4\e(B")  ("5" . "\e$A#5\e(B")  ("6" . "\e$A#6\e(B")  ("7" . "\e$A#7\e(B")
+                  ("8" . "\e$A#8\e(B")  ("9" . "\e$A#9\e(B") 
+                  (" " . "\e$A!!\e(B")  ("!" . "\e$A#!\e(B")  ("@" . "\e$A#@\e(B")  ("#" . "\e$A##\e(B")
+                  ("$" . "\e$A!g\e(B")  ("%" . "\e$A#%\e(B")  ("^" . "\e$A#^\e(B")  ("&" . "\e$A#&\e(B")
+                  ("*" . "\e$A#*\e(B")  ("(" . "\e$A#(\e(B")  (")" . "\e$A#)\e(B")
+                  ("-" . "\e$A#-\e(B")  ("=" . "\e$A#=\e(B")  ("`" . "\e$A#`\e(B")  ("\\" . "\e$A#\\e(B")
+                  ("|" . "\e$A#|\e(B")  ("_" . "\e$A#_\e(B")  ("+" . "\e$A#+\e(B")  ("~" . "\e$A!+\e(B")
+                  ("[" . "\e$A#[\e(B")  ("]" . "\e$A#]\e(B")  ("{" . "\e$A#{\e(B")  ("}" . "\e$A#}\e(B")
+                  (":" . "\e$A#:\e(B")  (";" . "\e$A#;\e(B")  ("\"" . "\e$A#"\e(B") ("'" . "\e$A#'\e(B")
+                  ("<" . "\e$A#<\e(B")  (">" . "\e$A#>\e(B")  ("?" . "\e$A#?\e(B")  ("/" . "\e$A#/\e(B")
+                  ("," . "\e$A#,\e(B")  ("." . "\e$A#.\e(B")
+                  ("a" . "\e$A#a\e(B")  ("b" . "\e$A#b\e(B")  ("c" . "\e$A#c\e(B")  ("d" . "\e$A#d\e(B")
+                  ("e" . "\e$A#e\e(B")  ("f" . "\e$A#f\e(B")  ("g" . "\e$A#g\e(B")  ("h" . "\e$A#h\e(B")
+                  ("i" . "\e$A#i\e(B")  ("j" . "\e$A#j\e(B")  ("k" . "\e$A#k\e(B")  ("l" . "\e$A#l\e(B")
+                  ("m" . "\e$A#m\e(B")  ("n" . "\e$A#n\e(B")  ("o" . "\e$A#o\e(B")  ("p" . "\e$A#p\e(B")
+                  ("q" . "\e$A#q\e(B")  ("r" . "\e$A#r\e(B")  ("s" . "\e$A#s\e(B")  ("t" . "\e$A#t\e(B")
+                  ("u" . "\e$A#u\e(B")  ("v" . "\e$A#v\e(B")  ("w" . "\e$A#w\e(B")  ("x" . "\e$A#x\e(B")
+                  ("y" . "\e$A#y\e(B")  ("z" . "\e$A#z\e(B")
+                  ("A" . "\e$A#A\e(B")  ("B" . "\e$A#B\e(B")  ("C" . "\e$A#C\e(B")  ("D" . "\e$A#D\e(B")
+                  ("E" . "\e$A#E\e(B")  ("F" . "\e$A#F\e(B")  ("G" . "\e$A#G\e(B")  ("H" . "\e$A#H\e(B")
+                  ("I" . "\e$A#I\e(B")  ("J" . "\e$A#J\e(B")  ("K" . "\e$A#K\e(B")  ("L" . "\e$A#L\e(B")
+                  ("M" . "\e$A#M\e(B")  ("N" . "\e$A#N\e(B")  ("O" . "\e$A#O\e(B")  ("P" . "\e$A#P\e(B")
+                  ("Q" . "\e$A#Q\e(B")  ("R" . "\e$A#R\e(B")  ("S" . "\e$A#S\e(B")  ("T" . "\e$A#T\e(B")
+                  ("U" . "\e$A#U\e(B")  ("V" . "\e$A#V\e(B")  ("W" . "\e$A#W\e(B")  ("X" . "\e$A#X\e(B")
+                  ("Y" . "\e$A#Y\e(B")  ("Z" . "\e$A#Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule (concat its-banjiao-escape in) in)
+      (its-defrule (concat its-quanjiao-escape in) out)))
+
+  (its-defrule ","     "\e$A#,\e(B")
+  (its-defrule "."     "\e$A!#\e(B")
+  (its-defrule "/"     "\e$A!"\e(B")
+  (its-defrule ":"     "\e$A#:\e(B")
+  (its-defrule ";"     "\e$A#;\e(B")
+  (its-defrule "?"     "\e$A#?\e(B")
+  (its-defrule "!"     "\e$A#!\e(B"))
+
+(define-its-state-machine its-erpin-tw-map
+  "erpin-tw" "\e$(GD(\e(BC" Chinese-CNS
+  "Map for Erpin input."
+
+  (defconst its-quanjiao-escape "Z")
+  (defconst its-banjiao-escape  "X")
+
+  (its-defrule-select-mode-temporally "B" downcase)
+  (its-defrule-select-mode-temporally "Q" quanjiao-downcase-cn)
+
+  (its-define-erpin-table)
+  (its-defrule "b "    "\e$(GDb\e(B")
+  (its-defrule "c "    "\e$(GD_\e(B")
+  (its-defrule "ch "   "\e$(GEx\e(B")
+  (its-defrule "d "    "\e$(GN{\e(B")
+  (its-defrule "f "    "\e$(GE0\e(B")
+  (its-defrule "g "    "\e$(GT6\e(B")
+  (its-defrule "h "    "\e$(GLO\e(B")
+  (its-defrule "i "    "\e$(GD!\e(B")
+  (its-defrule "j "    "\e$(G^s\e(B")
+  (its-defrule "k "    "\e$(GF+\e(B")
+  (its-defrule "l "    "\e$(GD'\e(B")
+  (its-defrule "m "    "\e$(GJd\e(B")
+  (its-defrule "n "    "\e$(GH!\e(B")
+  (its-defrule "p "    "\e$(GJG\e(B")
+  (its-defrule "q "    "\e$(GF*\e(B")
+  (its-defrule "r "    "\e$(GEJ\e(B")
+  (its-defrule "s "    "\e$(GQR\e(B")
+  (its-defrule "u "    "\e$(GD8\e(B")
+  (its-defrule "t "    "\e$(GEl\e(B")
+  (its-defrule "w "    "\e$(GJ<\e(B")
+  (its-defrule "x "    "\e$(GGW\e(B")
+  (its-defrule "y "    "\e$(GD4\e(B")
+  (its-defrule "z "    "\e$(GGc\e(B")
+  (its-defrule "v "    "\e$(Gaa\e(B")
+
+  (dolist (ascii '(("0" . "\e$(G$!\e(B")  ("1" . "\e$(G$"\e(B")  ("2" . "\e$(G$#\e(B")  ("3" . "\e$(G$$\e(B")
+                  ("4" . "\e$(G$%\e(B")  ("5" . "\e$(G$&\e(B")  ("6" . "\e$(G$'\e(B")  ("7" . "\e$(G$(\e(B")
+                  ("8" . "\e$(G$)\e(B")  ("9" . "\e$(G$*\e(B") 
+                  (" " . "\e$(G!!\e(B")  ("!" . "\e$(G!*\e(B")  ("@" . "\e$(G"i\e(B")  ("#" . "\e$(G!l\e(B")
+                  ("$" . "\e$(G"c\e(B")  ("%" . "\e$(G"h\e(B")  ("^" . "\e$(G!T\e(B")  ("&" . "\e$(G!m\e(B")
+                  ("*" . "\e$(G!n\e(B")  ("(" . "\e$(G!>\e(B")  (")" . "\e$(G!?\e(B")
+                  ("-" . "\e$(G"1\e(B")  ("=" . "\e$(G"8\e(B")  ("`" . "\e$(G!j\e(B")  ("\\" . "\e$(G"`\e(B")
+                  ("|" . "\e$(G"^\e(B")  ("_" . "\e$(G"%\e(B")  ("+" . "\e$(G"0\e(B")  ("~" . "\e$(G"D\e(B")
+                  ("[" . "\e$(G!b\e(B")  ("]" . "\e$(G!c\e(B")  ("{" . "\e$(G!B\e(B")  ("}" . "\e$(G!C\e(B")
+                  (":" . "\e$(G!(\e(B")  (";" . "\e$(G!'\e(B")  ("\"" . "\e$(G!i\e(B") ("'" . "\e$(G!k\e(B")
+                  ("<" . "\e$(G"6\e(B")  (">" . "\e$(G"7\e(B")  ("?" . "\e$(G!)\e(B")  ("/" . "\e$(G"_\e(B")
+                  ("," . "\e$(G!"\e(B")  ("." . "\e$(G!%\e(B")
+                  ("a" . "\e$(G$[\e(B")  ("b" . "\e$(G$\\e(B")  ("c" . "\e$(G$]\e(B")  ("d" . "\e$(G$^\e(B")
+                  ("e" . "\e$(G$_\e(B")  ("f" . "\e$(G$`\e(B")  ("g" . "\e$(G$a\e(B")  ("h" . "\e$(G$b\e(B")
+                  ("i" . "\e$(G$c\e(B")  ("j" . "\e$(G$d\e(B")  ("k" . "\e$(G$e\e(B")  ("l" . "\e$(G$f\e(B")
+                  ("m" . "\e$(G$g\e(B")  ("n" . "\e$(G$h\e(B")  ("o" . "\e$(G$i\e(B")  ("p" . "\e$(G$j\e(B")
+                  ("q" . "\e$(G$k\e(B")  ("r" . "\e$(G$l\e(B")  ("s" . "\e$(G$m\e(B")  ("t" . "\e$(G$n\e(B")
+                  ("u" . "\e$(G$o\e(B")  ("v" . "\e$(G$p\e(B")  ("w" . "\e$(G$q\e(B")  ("x" . "\e$(G$r\e(B")
+                  ("y" . "\e$(G$s\e(B")  ("z" . "\e$(G$t\e(B")
+                  ("A" . "\e$(G$A\e(B")  ("B" . "\e$(G$B\e(B")  ("C" . "\e$(G$C\e(B")  ("D" . "\e$(G$D\e(B")
+                  ("E" . "\e$(G$E\e(B")  ("F" . "\e$(G$F\e(B")  ("G" . "\e$(G$G\e(B")  ("H" . "\e$(G$H\e(B")
+                  ("I" . "\e$(G$I\e(B")  ("J" . "\e$(G$J\e(B")  ("K" . "\e$(G$K\e(B")  ("L" . "\e$(G$L\e(B")
+                  ("M" . "\e$(G$M\e(B")  ("N" . "\e$(G$N\e(B")  ("O" . "\e$(G$O\e(B")  ("P" . "\e$(G$P\e(B")
+                  ("Q" . "\e$(G$Q\e(B")  ("R" . "\e$(G$R\e(B")  ("S" . "\e$(G$S\e(B")  ("T" . "\e$(G$T\e(B")
+                  ("U" . "\e$(G$U\e(B")  ("V" . "\e$(G$V\e(B")  ("W" . "\e$(G$W\e(B")  ("X" . "\e$(G$X\e(B")
+                  ("Y" . "\e$(G$Y\e(B")  ("Z" . "\e$(G$Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule (concat its-banjiao-escape in) in)
+      (its-defrule (concat its-quanjiao-escape in) out)))
+
+  (its-defrule ","     "\e$(G!"\e(B")
+  (its-defrule "."     "\e$(G!$\e(B")
+  (its-defrule "/"     "\e$(G!#\e(B")
+  (its-defrule ":"     "\e$(G!(\e(B")
+  (its-defrule ";"     "\e$(G!'\e(B")
+  (its-defrule "?"     "\e$(G!)\e(B")
+  (its-defrule "!"     "\e$(G!*\e(B"))
+
+(define-its-state-machine-append its-erpin-cn-map
+  (its-defrule "[" its-erpin-cn-open-braket)
+  (its-defrule "]" its-erpin-cn-close-braket)
+
+  (if its-erpin-cn-enable-quanjioao-alphabet
+      (progn
+       (its-defrule "1"  "\e$A#1\e(B")  (its-defrule "2"  "\e$A#2\e(B")
+       (its-defrule "3"  "\e$A#3\e(B")  (its-defrule "4"  "\e$A#4\e(B")
+       (its-defrule "5"  "\e$A#5\e(B")  (its-defrule "6"  "\e$A#6\e(B")
+       (its-defrule "7"  "\e$A#7\e(B")  (its-defrule "8"  "\e$A#8\e(B")
+       (its-defrule "9"  "\e$A#9\e(B")  (its-defrule "0"  "\e$A#0\e(B")
+       (its-defrule "@"  "\e$A#@\e(B")
+       (its-defrule "#"  "\e$A##\e(B")  (its-defrule "$"  "\e$A!g\e(B")
+       (its-defrule "%"  "\e$A#%\e(B")  (its-defrule "^"  "\e$A#^\e(B")
+       (its-defrule "&"  "\e$A#&\e(B")  (its-defrule "*"  "\e$A#*\e(B")
+       (its-defrule "("  "\e$A#(\e(B")  (its-defrule ")"  "\e$A#)\e(B")
+       (its-defrule "-"  "\e$A#-\e(B")  (its-defrule "~"  "\e$A!+\e(B")
+       (its-defrule "="  "\e$A#=\e(B")  (its-defrule "`"  "\e$A#`\e(B")
+       (its-defrule "\\" "\e$A#\\e(B")  (its-defrule "|"  "\e$A#|\e(B")
+       (its-defrule "_"  "\e$A#_\e(B")  (its-defrule "+"  "\e$A#+\e(B")
+       (its-defrule "{"  "\e$A#{\e(B")  (its-defrule "}"  "\e$A#}\e(B")
+       (its-defrule "\"" "\e$A#"\e(B")  (its-defrule "'"  "\e$A#'\e(B")
+       (its-defrule "<"  "\e$A#<\e(B")  (its-defrule ">"  "\e$A#>\e(B"))
+    (progn
+      (its-defrule "1"  "1")  (its-defrule "2"  "2")
+      (its-defrule "3"  "3")  (its-defrule "4"  "4")
+      (its-defrule "5"  "5")  (its-defrule "6"  "6")
+      (its-defrule "7"  "7")  (its-defrule "8"  "8")
+      (its-defrule "9"  "9")  (its-defrule "0"  "0")
+      (its-defrule "@"  "@")
+      (its-defrule "#"  "#")  (its-defrule "$"  "$")
+      (its-defrule "%"  "%")  (its-defrule "^"  "^")
+      (its-defrule "&"  "&")  (its-defrule "*"  "*")
+      (its-defrule "("  "(")  (its-defrule ")"  ")")
+      (its-defrule "-"  "-")  (its-defrule "~"  "~")
+      (its-defrule "="  "=")  (its-defrule "`"  "`")
+      (its-defrule "\\" "\\") (its-defrule "|"  "|")
+      (its-defrule "_"  "_")  (its-defrule "+"  "+")
+      (its-defrule "{"  "{")  (its-defrule "}"  "}")
+      (its-defrule "\"" "\"") (its-defrule "'"  "'")
+      (its-defrule "<"  "<")  (its-defrule ">"  ">"))))
+
+(define-its-state-machine-append its-erpin-tw-map
+  (its-defrule "[" its-erpin-tw-open-braket)
+  (its-defrule "]" its-erpin-tw-close-braket)
+
+  (if its-erpin-tw-enable-quanjioao-alphabet
+      (progn
+       (its-defrule "1"  "\e$(G$"\e(B")  (its-defrule "2"  "\e$(G$#\e(B")
+       (its-defrule "3"  "\e$(G$$\e(B")  (its-defrule "4"  "\e$(G$%\e(B")
+       (its-defrule "5"  "\e$(G$&\e(B")  (its-defrule "6"  "\e$(G$'\e(B")
+       (its-defrule "7"  "\e$(G$(\e(B")  (its-defrule "8"  "\e$(G$)\e(B")
+       (its-defrule "9"  "\e$(G$*\e(B")  (its-defrule "0"  "\e$(G$!\e(B")
+       (its-defrule "@"  "\e$(G"i\e(B")
+       (its-defrule "#"  "\e$(G!l\e(B")  (its-defrule "$"  "\e$(G"c\e(B")
+       (its-defrule "%"  "\e$(G"h\e(B")  (its-defrule "^"  "\e$(G!T\e(B")
+       (its-defrule "&"  "\e$(G!m\e(B")  (its-defrule "*"  "\e$(G!n\e(B")
+       (its-defrule "("  "\e$(G!>\e(B")  (its-defrule ")"  "\e$(G!?\e(B")
+       (its-defrule "-"  "\e$(G"1\e(B")  (its-defrule "~"  "\e$(G"D\e(B")
+       (its-defrule "="  "\e$(G"8\e(B")  (its-defrule "`"  "\e$(G!j\e(B")
+       (its-defrule "\\" "\e$(G"b\e(B")  (its-defrule "|"  "\e$(G"^\e(B")
+       (its-defrule "_"  "\e$(G"%\e(B")  (its-defrule "+"  "\e$(G"0\e(B")
+       (its-defrule "{"  "\e$(G!B\e(B")  (its-defrule "}"  "\e$(G!C\e(B")
+       (its-defrule "\"" "\e$(G!i\e(B")  (its-defrule "'"  "\e$(G!k\e(B")
+       (its-defrule "<"  "\e$(G"6\e(B")  (its-defrule ">"  "\e$(G"7\e(B"))
+    (progn
+      (its-defrule "1"  "1")  (its-defrule "2"  "2")
+      (its-defrule "3"  "3")  (its-defrule "4"  "4")
+      (its-defrule "5"  "5")  (its-defrule "6"  "6")
+      (its-defrule "7"  "7")  (its-defrule "8"  "8")
+      (its-defrule "9"  "9")  (its-defrule "0"  "0")
+      (its-defrule "@"  "@")
+      (its-defrule "#"  "#")  (its-defrule "$"  "$")
+      (its-defrule "%"  "%")  (its-defrule "^"  "^")
+      (its-defrule "&"  "&")  (its-defrule "*"  "*")
+      (its-defrule "("  "(")  (its-defrule ")"  ")")
+      (its-defrule "-"  "-")  (its-defrule "~"  "~")
+      (its-defrule "="  "=")  (its-defrule "`"  "`")
+      (its-defrule "\\" "\\") (its-defrule "|"  "|")
+      (its-defrule "_"  "_")  (its-defrule "+"  "+")
+      (its-defrule "{"  "{")  (its-defrule "}"  "}")
+      (its-defrule "\"" "\"") (its-defrule "'"  "'")
+      (its-defrule "<"  "<")  (its-defrule ">"  ">"))))
+
+(provide 'its/erpin)
diff --git a/its/hangul.el b/its/hangul.el
new file mode 100644 (file)
index 0000000..934f44a
--- /dev/null
@@ -0,0 +1,2933 @@
+;;; its/hangul.el --- Hangul Input in Egg Input Method Architecture
+
+;; Copyright (C) 1999,2000 PFU LIMITED
+
+;; Author: NIIBE Yutaka <gniibe@chroot.org>
+;;         KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+
+;;; Code:
+
+
+(eval-when-compile
+  (require 'its)
+  (require 'cl))
+
+(eval-when (compile)
+  (defconst its-compaction-enable t))
+
+(defvar its-hangul-enable-jeonkak-alphabet
+  (if (boundp 'its-enable-fullwidth-alphabet)
+      its-enable-fullwidth-alphabet
+    t)
+  "*Enable Jeonkak alphabet")
+
+(defvar        its-hangul-period ". " "*\e$(C#.\e(B")    ; ". " "\e$(C#.\e(B"
+(defvar        its-hangul-comma  ", " "*\e$(C#,\e(B")    ; ", " "\e$(C#,\e(B"
+(defvar its-hangul-open-bracket  "\e$(C!8\e(B" "*[")  ; "\e$(C#[\e(B"
+(defvar its-hangul-close-bracket "\e$(C!9\e(B" "*]")  ; "\e$(C#]\e(B"
+
+(eval-when-compile
+  (defconst its-hangul-key-alist nil)
+  (defconst its-hangul-successor-list nil)
+
+  (defsubst its-hangul-sequence-to-key (seq)
+    (concat (mapcar (lambda (c)
+                     (cdr (assq c its-hangul-key-alist)))
+                   (string-to-list seq))))
+
+  (defsubst its-hangul-make-successor (init keyseq)
+    (concat (if init (substring init 0 (1- (length init))) "[")
+           (list (aref keyseq 1))
+           "]")))
+
+(eval-when-compile
+  (defun its-define-hangul-key (key output)
+    (setq its-hangul-key-alist
+         (cons (cons (string-to-char output)
+                     (string-to-char key))
+               its-hangul-key-alist))
+    (its-defrule key output))
+
+  (defun its-define-hangul-successor-list (keyseq)
+    (let ((pair (assq (aref keyseq 0) its-hangul-successor-list)))
+      (if (null pair)
+         (setq its-hangul-successor-list
+               (cons (cons (aref keyseq 0)
+                           (its-hangul-make-successor nil keyseq))
+                     its-hangul-successor-list))
+       (if (null (string-match (cdr pair) keyseq 1))
+           (setcdr pair (its-hangul-make-successor (cdr pair) keyseq))))))
+
+  (defun its-defrule-hangul (input output)
+    (let* ((state (its-defrule input output nil nil))
+          (prev-out (its-get-output (car its-parent-states)))
+          pair)
+     (if (and (= (length (string-to-list prev-out)) 1)
+             (> (string-to-char prev-out) ?\377)
+             (setq pair (assq (string-to-char (substring input -1))
+                              its-hangul-successor-list)))
+        (progn
+          (its-set-interim-terminal-state state)
+          (its-defrule-otherwise state nil (cdr pair) -2)))))
+
+  (defmacro its-define-hangul (&rest list)
+    (cons 'progn
+         (mapcar (lambda (l)
+                   (let ((case-fold-search nil)
+                         (keyseq (its-hangul-sequence-to-key (car l))))
+                     (if (>= (length keyseq) 2)
+                         (its-define-hangul-successor-list keyseq))
+                     (list 'its-defrule-hangul keyseq (nth 1 l))))
+                 list))))
+
+(define-its-state-machine its-hangul-map
+  "hangul" "\e$(CGQ\e(B" Korean
+  "Map for Hangul input. (Korean)"
+
+  (defconst its-jeonkak-escape "Z")
+  (defconst its-pankak-escape  "X")
+
+  (its-defrule-select-mode-temporally "B" downcase)
+  (its-defrule-select-mode-temporally "J" jeonkak-downcase)
+
+  (its-define-hangul-key       "r"     "\e$(C$!\e(B")
+  (its-define-hangul-key       "s"     "\e$(C$$\e(B")
+  (its-define-hangul-key       "e"     "\e$(C$'\e(B")
+  (its-define-hangul-key       "f"     "\e$(C$)\e(B")
+  (its-define-hangul-key       "a"     "\e$(C$1\e(B")
+  (its-define-hangul-key       "q"     "\e$(C$2\e(B")
+  (its-define-hangul-key       "t"     "\e$(C$5\e(B")
+  (its-define-hangul-key       "d"     "\e$(C$7\e(B")
+  (its-define-hangul-key       "w"     "\e$(C$8\e(B")
+  (its-define-hangul-key       "c"     "\e$(C$:\e(B")
+  (its-define-hangul-key       "z"     "\e$(C$;\e(B")
+  (its-define-hangul-key       "x"     "\e$(C$<\e(B")
+  (its-define-hangul-key       "v"     "\e$(C$=\e(B")
+  (its-define-hangul-key       "g"     "\e$(C$>\e(B")
+  (its-define-hangul-key       "R"     "\e$(C$"\e(B")
+  (its-define-hangul-key       "E"     "\e$(C$(\e(B")
+  (its-define-hangul-key       "Q"     "\e$(C$3\e(B")
+  (its-define-hangul-key       "T"     "\e$(C$6\e(B")
+  (its-define-hangul-key       "W"     "\e$(C$9\e(B")
+
+  (its-define-hangul-key       "k"     "\e$(C$?\e(B")
+  (its-define-hangul-key       "i"     "\e$(C$A\e(B")
+  (its-define-hangul-key       "j"     "\e$(C$C\e(B")
+  (its-define-hangul-key       "u"     "\e$(C$E\e(B")
+  (its-define-hangul-key       "h"     "\e$(C$G\e(B")
+  (its-define-hangul-key       "y"     "\e$(C$K\e(B")
+  (its-define-hangul-key       "n"     "\e$(C$L\e(B")
+  (its-define-hangul-key       "b"     "\e$(C$P\e(B")
+  (its-define-hangul-key       "m"     "\e$(C$Q\e(B")
+  (its-define-hangul-key       "l"     "\e$(C$S\e(B")
+  (its-define-hangul-key       "o"     "\e$(C$@\e(B")
+  (its-define-hangul-key       "p"     "\e$(C$D\e(B")
+  (its-define-hangul-key       "O"     "\e$(C$B\e(B")
+  (its-define-hangul-key       "P"     "\e$(C$F\e(B")
+
+  (its-define-hangul
+   ("\e$(C$!$?\e(B"      "\e$(C0!\e(B")
+   ("\e$(C$!$?$!\e(B"    "\e$(C0"\e(B")
+   ("\e$(C$!$?$$\e(B"    "\e$(C0#\e(B")
+   ("\e$(C$!$?$'\e(B"    "\e$(C0$\e(B")
+   ("\e$(C$!$?$)\e(B"    "\e$(C0%\e(B")
+   ("\e$(C$!$?$)$!\e(B"  "\e$(C0&\e(B")
+   ("\e$(C$!$?$)$1\e(B"  "\e$(C0'\e(B")
+   ("\e$(C$!$?$1\e(B"    "\e$(C0(\e(B")
+   ("\e$(C$!$?$2\e(B"    "\e$(C0)\e(B")
+   ("\e$(C$!$?$2$5\e(B"  "\e$(C0*\e(B")
+   ("\e$(C$!$?$5\e(B"    "\e$(C0+\e(B")
+   ("\e$(C$!$?$6\e(B"    "\e$(C0,\e(B")
+   ("\e$(C$!$?$7\e(B"    "\e$(C0-\e(B")
+   ("\e$(C$!$?$8\e(B"    "\e$(C0.\e(B")
+   ("\e$(C$!$?$:\e(B"    "\e$(C0/\e(B")
+   ("\e$(C$!$?$<\e(B"    "\e$(C00\e(B")
+   ("\e$(C$!$?$=\e(B"    "\e$(C01\e(B")
+   ("\e$(C$!$?$>\e(B"    "\e$(C02\e(B")
+
+   ("\e$(C$!$@\e(B"      "\e$(C03\e(B")
+   ("\e$(C$!$@$!\e(B"    "\e$(C04\e(B")
+   ("\e$(C$!$@$$\e(B"    "\e$(C05\e(B")
+   ("\e$(C$!$@$)\e(B"    "\e$(C06\e(B")
+   ("\e$(C$!$@$1\e(B"    "\e$(C07\e(B")
+   ("\e$(C$!$@$2\e(B"    "\e$(C08\e(B")
+   ("\e$(C$!$@$5\e(B"    "\e$(C09\e(B")
+   ("\e$(C$!$@$6\e(B"    "\e$(C0:\e(B")
+   ("\e$(C$!$@$7\e(B"    "\e$(C0;\e(B")
+
+   ("\e$(C$!$A\e(B"      "\e$(C0<\e(B")
+   ("\e$(C$!$A$!\e(B"    "\e$(C0=\e(B")
+   ("\e$(C$!$A$$\e(B"    "\e$(C0>\e(B")
+   ("\e$(C$!$A$)\e(B"    "\e$(C0?\e(B")
+   ("\e$(C$!$A$5\e(B"    "\e$(C0@\e(B")
+   ("\e$(C$!$A$7\e(B"    "\e$(C0A\e(B")
+
+   ("\e$(C$!$B\e(B"      "\e$(C0B\e(B")
+   ("\e$(C$!$B$$\e(B"    "\e$(C0C\e(B")
+   ("\e$(C$!$B$)\e(B"    "\e$(C0D\e(B")
+
+   ("\e$(C$!$C\e(B"      "\e$(C0E\e(B")
+   ("\e$(C$!$C$!\e(B"    "\e$(C0F\e(B")
+   ("\e$(C$!$C$$\e(B"    "\e$(C0G\e(B")
+   ("\e$(C$!$C$'\e(B"    "\e$(C0H\e(B")
+   ("\e$(C$!$C$)\e(B"    "\e$(C0I\e(B")
+   ("\e$(C$!$C$)$1\e(B"  "\e$(C0J\e(B")
+   ("\e$(C$!$C$1\e(B"    "\e$(C0K\e(B")
+   ("\e$(C$!$C$2\e(B"    "\e$(C0L\e(B")
+   ("\e$(C$!$C$5\e(B"    "\e$(C0M\e(B")
+   ("\e$(C$!$C$6\e(B"    "\e$(C0N\e(B")
+   ("\e$(C$!$C$7\e(B"    "\e$(C0O\e(B")
+   ("\e$(C$!$C$8\e(B"    "\e$(C0P\e(B")
+   ("\e$(C$!$C$<\e(B"    "\e$(C0Q\e(B")
+   ("\e$(C$!$C$=\e(B"    "\e$(C0R\e(B")
+   ("\e$(C$!$C$>\e(B"    "\e$(C0S\e(B")
+
+   ("\e$(C$!$D\e(B"      "\e$(C0T\e(B")
+   ("\e$(C$!$D$$\e(B"    "\e$(C0U\e(B")
+   ("\e$(C$!$D$)\e(B"    "\e$(C0V\e(B")
+   ("\e$(C$!$D$1\e(B"    "\e$(C0W\e(B")
+   ("\e$(C$!$D$2\e(B"    "\e$(C0X\e(B")
+   ("\e$(C$!$D$5\e(B"    "\e$(C0Y\e(B")
+   ("\e$(C$!$D$6\e(B"    "\e$(C0Z\e(B")
+   ("\e$(C$!$D$7\e(B"    "\e$(C0[\e(B")
+
+   ("\e$(C$!$E\e(B"      "\e$(C0\\e(B")
+   ("\e$(C$!$E$!\e(B"    "\e$(C0]\e(B")
+   ("\e$(C$!$E$"\e(B"    "\e$(C0^\e(B")
+   ("\e$(C$!$E$$\e(B"    "\e$(C0_\e(B")
+   ("\e$(C$!$E$'\e(B"    "\e$(C0`\e(B")
+   ("\e$(C$!$E$)\e(B"    "\e$(C0a\e(B")
+   ("\e$(C$!$E$1\e(B"    "\e$(C0b\e(B")
+   ("\e$(C$!$E$2\e(B"    "\e$(C0c\e(B")
+   ("\e$(C$!$E$5\e(B"    "\e$(C0d\e(B")
+   ("\e$(C$!$E$6\e(B"    "\e$(C0e\e(B")
+   ("\e$(C$!$E$7\e(B"    "\e$(C0f\e(B")
+   ("\e$(C$!$E$<\e(B"    "\e$(C0g\e(B")
+
+   ("\e$(C$!$F\e(B"      "\e$(C0h\e(B")
+   ("\e$(C$!$F$$\e(B"    "\e$(C0i\e(B")
+   ("\e$(C$!$F$)\e(B"    "\e$(C0j\e(B")
+   ("\e$(C$!$F$2\e(B"    "\e$(C0k\e(B")
+   ("\e$(C$!$F$5\e(B"    "\e$(C0l\e(B")
+
+   ("\e$(C$!$G\e(B"      "\e$(C0m\e(B")
+   ("\e$(C$!$G$!\e(B"    "\e$(C0n\e(B")
+   ("\e$(C$!$G$$\e(B"    "\e$(C0o\e(B")
+   ("\e$(C$!$G$'\e(B"    "\e$(C0p\e(B")
+   ("\e$(C$!$G$)\e(B"    "\e$(C0q\e(B")
+   ("\e$(C$!$G$)$1\e(B"  "\e$(C0r\e(B")
+   ("\e$(C$!$G$)$5\e(B"  "\e$(C0s\e(B")
+   ("\e$(C$!$G$)$>\e(B"  "\e$(C0t\e(B")
+   ("\e$(C$!$G$1\e(B"    "\e$(C0u\e(B")
+   ("\e$(C$!$G$2\e(B"    "\e$(C0v\e(B")
+   ("\e$(C$!$G$5\e(B"    "\e$(C0w\e(B")
+   ("\e$(C$!$G$7\e(B"    "\e$(C0x\e(B")
+   ("\e$(C$!$G$8\e(B"    "\e$(C0y\e(B")
+
+   ("\e$(C$!$G$?\e(B"    "\e$(C0z\e(B")
+   ("\e$(C$!$G$?$!\e(B"  "\e$(C0{\e(B")
+   ("\e$(C$!$G$?$$\e(B"  "\e$(C0|\e(B")
+   ("\e$(C$!$G$?$)\e(B"  "\e$(C0}\e(B")
+   ("\e$(C$!$G$?$)$1\e(B"        "\e$(C0~\e(B")
+   ("\e$(C$!$G$?$1\e(B"  "\e$(C1!\e(B")
+   ("\e$(C$!$G$?$2\e(B"  "\e$(C1"\e(B")
+   ("\e$(C$!$G$?$5\e(B"  "\e$(C1#\e(B")
+   ("\e$(C$!$G$?$7\e(B"  "\e$(C1$\e(B")
+
+   ("\e$(C$!$G$@\e(B"    "\e$(C1%\e(B")
+   ("\e$(C$!$G$@$$\e(B"  "\e$(C1&\e(B")
+   ("\e$(C$!$G$@$)\e(B"  "\e$(C1'\e(B")
+   ("\e$(C$!$G$@$2\e(B"  "\e$(C1(\e(B")
+   ("\e$(C$!$G$@$6\e(B"  "\e$(C1)\e(B")
+   ("\e$(C$!$G$@$7\e(B"  "\e$(C1*\e(B")
+
+   ("\e$(C$!$G$S\e(B"    "\e$(C1+\e(B")
+   ("\e$(C$!$G$S$!\e(B"  "\e$(C1,\e(B")
+   ("\e$(C$!$G$S$$\e(B"  "\e$(C1-\e(B")
+   ("\e$(C$!$G$S$)\e(B"  "\e$(C1.\e(B")
+   ("\e$(C$!$G$S$1\e(B"  "\e$(C1/\e(B")
+   ("\e$(C$!$G$S$2\e(B"  "\e$(C10\e(B")
+   ("\e$(C$!$G$S$5\e(B"  "\e$(C11\e(B")
+   ("\e$(C$!$G$S$7\e(B"  "\e$(C12\e(B")
+
+   ("\e$(C$!$K\e(B"      "\e$(C13\e(B")
+   ("\e$(C$!$K$$\e(B"    "\e$(C14\e(B")
+   ("\e$(C$!$K$)\e(B"    "\e$(C15\e(B")
+   ("\e$(C$!$K$2\e(B"    "\e$(C16\e(B")
+   ("\e$(C$!$K$5\e(B"    "\e$(C17\e(B")
+
+   ("\e$(C$!$L\e(B"      "\e$(C18\e(B")
+   ("\e$(C$!$L$!\e(B"    "\e$(C19\e(B")
+   ("\e$(C$!$L$$\e(B"    "\e$(C1:\e(B")
+   ("\e$(C$!$L$'\e(B"    "\e$(C1;\e(B")
+   ("\e$(C$!$L$)\e(B"    "\e$(C1<\e(B")
+   ("\e$(C$!$L$)$!\e(B"  "\e$(C1=\e(B")
+   ("\e$(C$!$L$)$1\e(B"  "\e$(C1>\e(B")
+   ("\e$(C$!$L$)$>\e(B"  "\e$(C1?\e(B")
+   ("\e$(C$!$L$1\e(B"    "\e$(C1@\e(B")
+   ("\e$(C$!$L$2\e(B"    "\e$(C1A\e(B")
+   ("\e$(C$!$L$5\e(B"    "\e$(C1B\e(B")
+   ("\e$(C$!$L$7\e(B"    "\e$(C1C\e(B")
+   ("\e$(C$!$L$8\e(B"    "\e$(C1D\e(B")
+
+   ("\e$(C$!$L$C\e(B"    "\e$(C1E\e(B")
+   ("\e$(C$!$L$C$!\e(B"  "\e$(C1F\e(B")
+   ("\e$(C$!$L$C$$\e(B"  "\e$(C1G\e(B")
+   ("\e$(C$!$L$C$)\e(B"  "\e$(C1H\e(B")
+   ("\e$(C$!$L$C$6\e(B"  "\e$(C1I\e(B")
+   ("\e$(C$!$L$C$7\e(B"  "\e$(C1J\e(B")
+
+   ("\e$(C$!$L$D\e(B"    "\e$(C1K\e(B")
+   ("\e$(C$!$L$D$5\e(B"  "\e$(C1L\e(B")
+
+   ("\e$(C$!$L$S\e(B"    "\e$(C1M\e(B")
+   ("\e$(C$!$L$S$!\e(B"  "\e$(C1N\e(B")
+   ("\e$(C$!$L$S$$\e(B"  "\e$(C1O\e(B")
+   ("\e$(C$!$L$S$)\e(B"  "\e$(C1P\e(B")
+   ("\e$(C$!$L$S$1\e(B"  "\e$(C1Q\e(B")
+   ("\e$(C$!$L$S$2\e(B"  "\e$(C1R\e(B")
+   ("\e$(C$!$L$S$5\e(B"  "\e$(C1S\e(B")
+
+   ("\e$(C$!$P\e(B"      "\e$(C1T\e(B")
+   ("\e$(C$!$P$$\e(B"    "\e$(C1U\e(B")
+   ("\e$(C$!$P$)\e(B"    "\e$(C1V\e(B")
+
+   ("\e$(C$!$Q\e(B"      "\e$(C1W\e(B")
+   ("\e$(C$!$Q$!\e(B"    "\e$(C1X\e(B")
+   ("\e$(C$!$Q$$\e(B"    "\e$(C1Y\e(B")
+   ("\e$(C$!$Q$'\e(B"    "\e$(C1Z\e(B")
+   ("\e$(C$!$Q$)\e(B"    "\e$(C1[\e(B")
+   ("\e$(C$!$Q$)$!\e(B"  "\e$(C1\\e(B")
+   ("\e$(C$!$Q$1\e(B"    "\e$(C1]\e(B")
+   ("\e$(C$!$Q$2\e(B"    "\e$(C1^\e(B")
+   ("\e$(C$!$Q$5\e(B"    "\e$(C1_\e(B")
+   ("\e$(C$!$Q$7\e(B"    "\e$(C1`\e(B")
+
+   ("\e$(C$!$Q$S\e(B"    "\e$(C1a\e(B")
+
+   ("\e$(C$!$S\e(B"      "\e$(C1b\e(B")
+   ("\e$(C$!$S$!\e(B"    "\e$(C1c\e(B")
+   ("\e$(C$!$S$$\e(B"    "\e$(C1d\e(B")
+   ("\e$(C$!$S$'\e(B"    "\e$(C1e\e(B")
+   ("\e$(C$!$S$)\e(B"    "\e$(C1f\e(B")
+   ("\e$(C$!$S$)$1\e(B"  "\e$(C1g\e(B")
+   ("\e$(C$!$S$1\e(B"    "\e$(C1h\e(B")
+   ("\e$(C$!$S$2\e(B"    "\e$(C1i\e(B")
+   ("\e$(C$!$S$5\e(B"    "\e$(C1j\e(B")
+   ("\e$(C$!$S$7\e(B"    "\e$(C1k\e(B")
+   ("\e$(C$!$S$8\e(B"    "\e$(C1l\e(B")
+   ("\e$(C$!$S$=\e(B"    "\e$(C1m\e(B")
+
+   ("\e$(C$"$?\e(B"      "\e$(C1n\e(B")
+   ("\e$(C$"$?$!\e(B"    "\e$(C1o\e(B")
+   ("\e$(C$"$?$"\e(B"    "\e$(C1p\e(B")
+   ("\e$(C$"$?$$\e(B"    "\e$(C1q\e(B")
+   ("\e$(C$"$?$)\e(B"    "\e$(C1r\e(B")
+   ("\e$(C$"$?$)$1\e(B"  "\e$(C1s\e(B")
+   ("\e$(C$"$?$1\e(B"    "\e$(C1t\e(B")
+   ("\e$(C$"$?$2\e(B"    "\e$(C1u\e(B")
+   ("\e$(C$"$?$5\e(B"    "\e$(C1v\e(B")
+   ("\e$(C$"$?$6\e(B"    "\e$(C1w\e(B")
+   ("\e$(C$"$?$7\e(B"    "\e$(C1x\e(B")
+   ("\e$(C$"$?$<\e(B"    "\e$(C1y\e(B")
+
+   ("\e$(C$"$@\e(B"      "\e$(C1z\e(B")
+   ("\e$(C$"$@$!\e(B"    "\e$(C1{\e(B")
+   ("\e$(C$"$@$$\e(B"    "\e$(C1|\e(B")
+   ("\e$(C$"$@$)\e(B"    "\e$(C1}\e(B")
+   ("\e$(C$"$@$1\e(B"    "\e$(C1~\e(B")
+   ("\e$(C$"$@$2\e(B"    "\e$(C2!\e(B")
+   ("\e$(C$"$@$5\e(B"    "\e$(C2"\e(B")
+   ("\e$(C$"$@$6\e(B"    "\e$(C2#\e(B")
+   ("\e$(C$"$@$7\e(B"    "\e$(C2$\e(B")
+
+   ("\e$(C$"$A\e(B"      "\e$(C2%\e(B")
+   ("\e$(C$"$A$!\e(B"    "\e$(C2&\e(B")
+   ("\e$(C$"$A$)\e(B"    "\e$(C2'\e(B")
+
+   ("\e$(C$"$C\e(B"      "\e$(C2(\e(B")
+   ("\e$(C$"$C$!\e(B"    "\e$(C2)\e(B")
+   ("\e$(C$"$C$"\e(B"    "\e$(C2*\e(B")
+   ("\e$(C$"$C$$\e(B"    "\e$(C2+\e(B")
+   ("\e$(C$"$C$)\e(B"    "\e$(C2,\e(B")
+   ("\e$(C$"$C$1\e(B"    "\e$(C2-\e(B")
+   ("\e$(C$"$C$2\e(B"    "\e$(C2.\e(B")
+   ("\e$(C$"$C$5\e(B"    "\e$(C2/\e(B")
+   ("\e$(C$"$C$6\e(B"    "\e$(C20\e(B")
+   ("\e$(C$"$C$7\e(B"    "\e$(C21\e(B")
+
+   ("\e$(C$"$D\e(B"      "\e$(C22\e(B")
+   ("\e$(C$"$D$!\e(B"    "\e$(C23\e(B")
+   ("\e$(C$"$D$$\e(B"    "\e$(C24\e(B")
+   ("\e$(C$"$D$1\e(B"    "\e$(C25\e(B")
+   ("\e$(C$"$D$5\e(B"    "\e$(C26\e(B")
+   ("\e$(C$"$D$7\e(B"    "\e$(C27\e(B")
+
+   ("\e$(C$"$E\e(B"      "\e$(C28\e(B")
+   ("\e$(C$"$E$$\e(B"    "\e$(C29\e(B")
+   ("\e$(C$"$E$)\e(B"    "\e$(C2:\e(B")
+   ("\e$(C$"$E$5\e(B"    "\e$(C2;\e(B")
+   ("\e$(C$"$E$6\e(B"    "\e$(C2<\e(B")
+   ("\e$(C$"$E$<\e(B"    "\e$(C2=\e(B")
+
+   ("\e$(C$"$F\e(B"      "\e$(C2>\e(B")
+
+   ("\e$(C$"$G\e(B"      "\e$(C2?\e(B")
+   ("\e$(C$"$G$!\e(B"    "\e$(C2@\e(B")
+   ("\e$(C$"$G$$\e(B"    "\e$(C2A\e(B")
+   ("\e$(C$"$G$$$>\e(B"  "\e$(C2B\e(B")
+   ("\e$(C$"$G$)\e(B"    "\e$(C2C\e(B")
+   ("\e$(C$"$G$1\e(B"    "\e$(C2D\e(B")
+   ("\e$(C$"$G$2\e(B"    "\e$(C2E\e(B")
+   ("\e$(C$"$G$5\e(B"    "\e$(C2F\e(B")
+   ("\e$(C$"$G$7\e(B"    "\e$(C2G\e(B")
+   ("\e$(C$"$G$8\e(B"    "\e$(C2H\e(B")
+   ("\e$(C$"$G$:\e(B"    "\e$(C2I\e(B")
+
+   ("\e$(C$"$G$?\e(B"    "\e$(C2J\e(B")
+   ("\e$(C$"$G$?$!\e(B"  "\e$(C2K\e(B")
+   ("\e$(C$"$G$?$)\e(B"  "\e$(C2L\e(B")
+   ("\e$(C$"$G$?$6\e(B"  "\e$(C2M\e(B")
+   ("\e$(C$"$G$?$7\e(B"  "\e$(C2N\e(B")
+
+   ("\e$(C$"$G$@\e(B"    "\e$(C2O\e(B")
+   ("\e$(C$"$G$@$!\e(B"  "\e$(C2P\e(B")
+   ("\e$(C$"$G$@$7\e(B"  "\e$(C2Q\e(B")
+
+   ("\e$(C$"$G$S\e(B"    "\e$(C2R\e(B")
+   ("\e$(C$"$G$S$$\e(B"  "\e$(C2S\e(B")
+   ("\e$(C$"$G$S$)\e(B"  "\e$(C2T\e(B")
+   ("\e$(C$"$G$S$1\e(B"  "\e$(C2U\e(B")
+   ("\e$(C$"$G$S$2\e(B"  "\e$(C2V\e(B")
+   ("\e$(C$"$G$S$7\e(B"  "\e$(C2W\e(B")
+
+   ("\e$(C$"$K\e(B"      "\e$(C2X\e(B")
+
+   ("\e$(C$"$L\e(B"      "\e$(C2Y\e(B")
+   ("\e$(C$"$L$!\e(B"    "\e$(C2Z\e(B")
+   ("\e$(C$"$L$$\e(B"    "\e$(C2[\e(B")
+   ("\e$(C$"$L$)\e(B"    "\e$(C2\\e(B")
+   ("\e$(C$"$L$)$>\e(B"  "\e$(C2]\e(B")
+   ("\e$(C$"$L$1\e(B"    "\e$(C2^\e(B")
+   ("\e$(C$"$L$2\e(B"    "\e$(C2_\e(B")
+   ("\e$(C$"$L$5\e(B"    "\e$(C2`\e(B")
+   ("\e$(C$"$L$7\e(B"    "\e$(C2a\e(B")
+   ("\e$(C$"$L$8\e(B"    "\e$(C2b\e(B")
+
+   ("\e$(C$"$L$C\e(B"    "\e$(C2c\e(B")
+   ("\e$(C$"$L$C$)\e(B"  "\e$(C2d\e(B")
+   ("\e$(C$"$L$C$6\e(B"  "\e$(C2e\e(B")
+   ("\e$(C$"$L$C$7\e(B"  "\e$(C2f\e(B")
+
+   ("\e$(C$"$L$D\e(B"    "\e$(C2g\e(B")
+   ("\e$(C$"$L$D$!\e(B"  "\e$(C2h\e(B")
+   ("\e$(C$"$L$D$$\e(B"  "\e$(C2i\e(B")
+   ("\e$(C$"$L$D$)\e(B"  "\e$(C2j\e(B")
+   ("\e$(C$"$L$D$1\e(B"  "\e$(C2k\e(B")
+   ("\e$(C$"$L$D$2\e(B"  "\e$(C2l\e(B")
+   ("\e$(C$"$L$D$6\e(B"  "\e$(C2m\e(B")
+
+   ("\e$(C$"$L$S\e(B"    "\e$(C2n\e(B")
+   ("\e$(C$"$L$S$$\e(B"  "\e$(C2o\e(B")
+   ("\e$(C$"$L$S$)\e(B"  "\e$(C2p\e(B")
+   ("\e$(C$"$L$S$1\e(B"  "\e$(C2q\e(B")
+   ("\e$(C$"$L$S$2\e(B"  "\e$(C2r\e(B")
+
+   ("\e$(C$"$P\e(B"      "\e$(C2s\e(B")
+
+   ("\e$(C$"$Q\e(B"      "\e$(C2t\e(B")
+   ("\e$(C$"$Q$!\e(B"    "\e$(C2u\e(B")
+   ("\e$(C$"$Q$$\e(B"    "\e$(C2v\e(B")
+   ("\e$(C$"$Q$$$>\e(B"  "\e$(C2w\e(B")
+   ("\e$(C$"$Q$)\e(B"    "\e$(C2x\e(B")
+   ("\e$(C$"$Q$)$1\e(B"  "\e$(C2y\e(B")
+   ("\e$(C$"$Q$)$>\e(B"  "\e$(C2z\e(B")
+   ("\e$(C$"$Q$1\e(B"    "\e$(C2{\e(B")
+   ("\e$(C$"$Q$2\e(B"    "\e$(C2|\e(B")
+   ("\e$(C$"$Q$5\e(B"    "\e$(C2}\e(B")
+   ("\e$(C$"$Q$7\e(B"    "\e$(C2~\e(B")
+   ("\e$(C$"$Q$<\e(B"    "\e$(C3!\e(B")
+
+   ("\e$(C$"$S\e(B"      "\e$(C3"\e(B")
+   ("\e$(C$"$S$!\e(B"    "\e$(C3#\e(B")
+   ("\e$(C$"$S$$\e(B"    "\e$(C3$\e(B")
+   ("\e$(C$"$S$)\e(B"    "\e$(C3%\e(B")
+   ("\e$(C$"$S$1\e(B"    "\e$(C3&\e(B")
+   ("\e$(C$"$S$2\e(B"    "\e$(C3'\e(B")
+   ("\e$(C$"$S$5\e(B"    "\e$(C3(\e(B")
+   ("\e$(C$"$S$7\e(B"    "\e$(C3)\e(B")
+
+   ("\e$(C$$$?\e(B"      "\e$(C3*\e(B")
+   ("\e$(C$$$?$!\e(B"    "\e$(C3+\e(B")
+   ("\e$(C$$$?$"\e(B"    "\e$(C3,\e(B")
+   ("\e$(C$$$?$$\e(B"    "\e$(C3-\e(B")
+   ("\e$(C$$$?$'\e(B"    "\e$(C3.\e(B")
+   ("\e$(C$$$?$)\e(B"    "\e$(C3/\e(B")
+   ("\e$(C$$$?$)$!\e(B"  "\e$(C30\e(B")
+   ("\e$(C$$$?$)$1\e(B"  "\e$(C31\e(B")
+   ("\e$(C$$$?$1\e(B"    "\e$(C32\e(B")
+   ("\e$(C$$$?$2\e(B"    "\e$(C33\e(B")
+   ("\e$(C$$$?$5\e(B"    "\e$(C34\e(B")
+   ("\e$(C$$$?$6\e(B"    "\e$(C35\e(B")
+   ("\e$(C$$$?$7\e(B"    "\e$(C36\e(B")
+   ("\e$(C$$$?$8\e(B"    "\e$(C37\e(B")
+   ("\e$(C$$$?$:\e(B"    "\e$(C38\e(B")
+   ("\e$(C$$$?$<\e(B"    "\e$(C39\e(B")
+   ("\e$(C$$$?$>\e(B"    "\e$(C3:\e(B")
+
+   ("\e$(C$$$@\e(B"      "\e$(C3;\e(B")
+   ("\e$(C$$$@$!\e(B"    "\e$(C3<\e(B")
+   ("\e$(C$$$@$$\e(B"    "\e$(C3=\e(B")
+   ("\e$(C$$$@$)\e(B"    "\e$(C3>\e(B")
+   ("\e$(C$$$@$1\e(B"    "\e$(C3?\e(B")
+   ("\e$(C$$$@$2\e(B"    "\e$(C3@\e(B")
+   ("\e$(C$$$@$5\e(B"    "\e$(C3A\e(B")
+   ("\e$(C$$$@$6\e(B"    "\e$(C3B\e(B")
+   ("\e$(C$$$@$7\e(B"    "\e$(C3C\e(B")
+
+   ("\e$(C$$$A\e(B"      "\e$(C3D\e(B")
+   ("\e$(C$$$A$!\e(B"    "\e$(C3E\e(B")
+   ("\e$(C$$$A$$\e(B"    "\e$(C3F\e(B")
+   ("\e$(C$$$A$)\e(B"    "\e$(C3G\e(B")
+   ("\e$(C$$$A$1\e(B"    "\e$(C3H\e(B")
+   ("\e$(C$$$A$7\e(B"    "\e$(C3I\e(B")
+
+   ("\e$(C$$$C\e(B"      "\e$(C3J\e(B")
+   ("\e$(C$$$C$!\e(B"    "\e$(C3K\e(B")
+   ("\e$(C$$$C$!$5\e(B"  "\e$(C3L\e(B")
+   ("\e$(C$$$C$$\e(B"    "\e$(C3M\e(B")
+   ("\e$(C$$$C$)\e(B"    "\e$(C3N\e(B")
+   ("\e$(C$$$C$)$1\e(B"  "\e$(C3O\e(B")
+   ("\e$(C$$$C$)$2\e(B"  "\e$(C3P\e(B")
+   ("\e$(C$$$C$1\e(B"    "\e$(C3Q\e(B")
+   ("\e$(C$$$C$2\e(B"    "\e$(C3R\e(B")
+   ("\e$(C$$$C$5\e(B"    "\e$(C3S\e(B")
+   ("\e$(C$$$C$6\e(B"    "\e$(C3T\e(B")
+   ("\e$(C$$$C$7\e(B"    "\e$(C3U\e(B")
+   ("\e$(C$$$C$>\e(B"    "\e$(C3V\e(B")
+
+   ("\e$(C$$$D\e(B"      "\e$(C3W\e(B")
+   ("\e$(C$$$D$!\e(B"    "\e$(C3X\e(B")
+   ("\e$(C$$$D$$\e(B"    "\e$(C3Y\e(B")
+   ("\e$(C$$$D$)\e(B"    "\e$(C3Z\e(B")
+   ("\e$(C$$$D$1\e(B"    "\e$(C3[\e(B")
+   ("\e$(C$$$D$2\e(B"    "\e$(C3\\e(B")
+   ("\e$(C$$$D$5\e(B"    "\e$(C3]\e(B")
+   ("\e$(C$$$D$6\e(B"    "\e$(C3^\e(B")
+   ("\e$(C$$$D$7\e(B"    "\e$(C3_\e(B")
+
+   ("\e$(C$$$E\e(B"      "\e$(C3`\e(B")
+   ("\e$(C$$$E$!\e(B"    "\e$(C3a\e(B")
+   ("\e$(C$$$E$$\e(B"    "\e$(C3b\e(B")
+   ("\e$(C$$$E$)\e(B"    "\e$(C3c\e(B")
+   ("\e$(C$$$E$1\e(B"    "\e$(C3d\e(B")
+   ("\e$(C$$$E$2\e(B"    "\e$(C3e\e(B")
+   ("\e$(C$$$E$6\e(B"    "\e$(C3f\e(B")
+   ("\e$(C$$$E$7\e(B"    "\e$(C3g\e(B")
+   ("\e$(C$$$E$;\e(B"    "\e$(C3h\e(B")
+
+   ("\e$(C$$$F\e(B"      "\e$(C3i\e(B")
+   ("\e$(C$$$F$$\e(B"    "\e$(C3j\e(B")
+
+   ("\e$(C$$$G\e(B"      "\e$(C3k\e(B")
+   ("\e$(C$$$G$!\e(B"    "\e$(C3l\e(B")
+   ("\e$(C$$$G$$\e(B"    "\e$(C3m\e(B")
+   ("\e$(C$$$G$)\e(B"    "\e$(C3n\e(B")
+   ("\e$(C$$$G$)$1\e(B"  "\e$(C3o\e(B")
+   ("\e$(C$$$G$1\e(B"    "\e$(C3p\e(B")
+   ("\e$(C$$$G$2\e(B"    "\e$(C3q\e(B")
+   ("\e$(C$$$G$5\e(B"    "\e$(C3r\e(B")
+   ("\e$(C$$$G$7\e(B"    "\e$(C3s\e(B")
+   ("\e$(C$$$G$=\e(B"    "\e$(C3t\e(B")
+   ("\e$(C$$$G$>\e(B"    "\e$(C3u\e(B")
+
+   ("\e$(C$$$G$?\e(B"    "\e$(C3v\e(B")
+   ("\e$(C$$$G$?$$\e(B"  "\e$(C3w\e(B")
+   ("\e$(C$$$G$?$)\e(B"  "\e$(C3x\e(B")
+   ("\e$(C$$$G$?$6\e(B"  "\e$(C3y\e(B")
+
+   ("\e$(C$$$G$S\e(B"    "\e$(C3z\e(B")
+   ("\e$(C$$$G$S$$\e(B"  "\e$(C3{\e(B")
+   ("\e$(C$$$G$S$)\e(B"  "\e$(C3|\e(B")
+   ("\e$(C$$$G$S$1\e(B"  "\e$(C3}\e(B")
+   ("\e$(C$$$G$S$2\e(B"  "\e$(C3~\e(B")
+   ("\e$(C$$$G$S$5\e(B"  "\e$(C4!\e(B")
+
+   ("\e$(C$$$K\e(B"      "\e$(C4"\e(B")
+   ("\e$(C$$$K$!\e(B"    "\e$(C4#\e(B")
+   ("\e$(C$$$K$$\e(B"    "\e$(C4$\e(B")
+   ("\e$(C$$$K$)\e(B"    "\e$(C4%\e(B")
+   ("\e$(C$$$K$2\e(B"    "\e$(C4&\e(B")
+   ("\e$(C$$$K$5\e(B"    "\e$(C4'\e(B")
+   ("\e$(C$$$K$7\e(B"    "\e$(C4(\e(B")
+
+   ("\e$(C$$$L\e(B"      "\e$(C4)\e(B")
+   ("\e$(C$$$L$!\e(B"    "\e$(C4*\e(B")
+   ("\e$(C$$$L$$\e(B"    "\e$(C4+\e(B")
+   ("\e$(C$$$L$'\e(B"    "\e$(C4,\e(B")
+   ("\e$(C$$$L$)\e(B"    "\e$(C4-\e(B")
+   ("\e$(C$$$L$1\e(B"    "\e$(C4.\e(B")
+   ("\e$(C$$$L$2\e(B"    "\e$(C4/\e(B")
+   ("\e$(C$$$L$5\e(B"    "\e$(C40\e(B")
+   ("\e$(C$$$L$7\e(B"    "\e$(C41\e(B")
+
+   ("\e$(C$$$L$C\e(B"    "\e$(C42\e(B")
+   ("\e$(C$$$L$C$6\e(B"  "\e$(C43\e(B")
+
+   ("\e$(C$$$L$D\e(B"    "\e$(C44\e(B")
+
+   ("\e$(C$$$L$S\e(B"    "\e$(C45\e(B")
+   ("\e$(C$$$L$S$$\e(B"  "\e$(C46\e(B")
+   ("\e$(C$$$L$S$)\e(B"  "\e$(C47\e(B")
+   ("\e$(C$$$L$S$1\e(B"  "\e$(C48\e(B")
+   ("\e$(C$$$L$S$2\e(B"  "\e$(C49\e(B")
+
+   ("\e$(C$$$P\e(B"      "\e$(C4:\e(B")
+   ("\e$(C$$$P$!\e(B"    "\e$(C4;\e(B")
+   ("\e$(C$$$P$)\e(B"    "\e$(C4<\e(B")
+   ("\e$(C$$$P$1\e(B"    "\e$(C4=\e(B")
+   ("\e$(C$$$P$2\e(B"    "\e$(C4>\e(B")
+   ("\e$(C$$$P$7\e(B"    "\e$(C4?\e(B")
+
+   ("\e$(C$$$Q\e(B"      "\e$(C4@\e(B")
+   ("\e$(C$$$Q$!\e(B"    "\e$(C4A\e(B")
+   ("\e$(C$$$Q$$\e(B"    "\e$(C4B\e(B")
+   ("\e$(C$$$Q$)\e(B"    "\e$(C4C\e(B")
+   ("\e$(C$$$Q$)$!\e(B"  "\e$(C4D\e(B")
+   ("\e$(C$$$Q$)$1\e(B"  "\e$(C4E\e(B")
+   ("\e$(C$$$Q$1\e(B"    "\e$(C4F\e(B")
+   ("\e$(C$$$Q$2\e(B"    "\e$(C4G\e(B")
+   ("\e$(C$$$Q$5\e(B"    "\e$(C4H\e(B")
+   ("\e$(C$$$Q$7\e(B"    "\e$(C4I\e(B")
+   ("\e$(C$$$Q$8\e(B"    "\e$(C4J\e(B")
+   ("\e$(C$$$Q$=\e(B"    "\e$(C4K\e(B")
+
+   ("\e$(C$$$Q$S\e(B"    "\e$(C4L\e(B")
+   ("\e$(C$$$Q$S$$\e(B"  "\e$(C4M\e(B")
+   ("\e$(C$$$Q$S$)\e(B"  "\e$(C4N\e(B")
+
+   ("\e$(C$$$S\e(B"      "\e$(C4O\e(B")
+   ("\e$(C$$$S$!\e(B"    "\e$(C4P\e(B")
+   ("\e$(C$$$S$$\e(B"    "\e$(C4Q\e(B")
+   ("\e$(C$$$S$)\e(B"    "\e$(C4R\e(B")
+   ("\e$(C$$$S$)$1\e(B"  "\e$(C4S\e(B")
+   ("\e$(C$$$S$1\e(B"    "\e$(C4T\e(B")
+   ("\e$(C$$$S$2\e(B"    "\e$(C4U\e(B")
+   ("\e$(C$$$S$5\e(B"    "\e$(C4V\e(B")
+   ("\e$(C$$$S$7\e(B"    "\e$(C4W\e(B")
+   ("\e$(C$$$S$=\e(B"    "\e$(C4X\e(B")
+
+   ("\e$(C$'$?\e(B"      "\e$(C4Y\e(B")
+   ("\e$(C$'$?$!\e(B"    "\e$(C4Z\e(B")
+   ("\e$(C$'$?$"\e(B"    "\e$(C4[\e(B")
+   ("\e$(C$'$?$$\e(B"    "\e$(C4\\e(B")
+   ("\e$(C$'$?$'\e(B"    "\e$(C4]\e(B")
+   ("\e$(C$'$?$)\e(B"    "\e$(C4^\e(B")
+   ("\e$(C$'$?$)$!\e(B"  "\e$(C4_\e(B")
+   ("\e$(C$'$?$)$1\e(B"  "\e$(C4`\e(B")
+   ("\e$(C$'$?$)$2\e(B"  "\e$(C4a\e(B")
+   ("\e$(C$'$?$)$>\e(B"  "\e$(C4b\e(B")
+   ("\e$(C$'$?$1\e(B"    "\e$(C4c\e(B")
+   ("\e$(C$'$?$2\e(B"    "\e$(C4d\e(B")
+   ("\e$(C$'$?$5\e(B"    "\e$(C4e\e(B")
+   ("\e$(C$'$?$6\e(B"    "\e$(C4f\e(B")
+   ("\e$(C$'$?$7\e(B"    "\e$(C4g\e(B")
+   ("\e$(C$'$?$8\e(B"    "\e$(C4h\e(B")
+   ("\e$(C$'$?$:\e(B"    "\e$(C4i\e(B")
+   ("\e$(C$'$?$>\e(B"    "\e$(C4j\e(B")
+
+   ("\e$(C$'$@\e(B"      "\e$(C4k\e(B")
+   ("\e$(C$'$@$!\e(B"    "\e$(C4l\e(B")
+   ("\e$(C$'$@$$\e(B"    "\e$(C4m\e(B")
+   ("\e$(C$'$@$)\e(B"    "\e$(C4n\e(B")
+   ("\e$(C$'$@$1\e(B"    "\e$(C4o\e(B")
+   ("\e$(C$'$@$2\e(B"    "\e$(C4p\e(B")
+   ("\e$(C$'$@$5\e(B"    "\e$(C4q\e(B")
+   ("\e$(C$'$@$6\e(B"    "\e$(C4r\e(B")
+   ("\e$(C$'$@$7\e(B"    "\e$(C4s\e(B")
+
+   ("\e$(C$'$A\e(B"      "\e$(C4t\e(B")
+
+   ("\e$(C$'$C\e(B"      "\e$(C4u\e(B")
+   ("\e$(C$'$C$!\e(B"    "\e$(C4v\e(B")
+   ("\e$(C$'$C$"\e(B"    "\e$(C4w\e(B")
+   ("\e$(C$'$C$$\e(B"    "\e$(C4x\e(B")
+   ("\e$(C$'$C$'\e(B"    "\e$(C4y\e(B")
+   ("\e$(C$'$C$)\e(B"    "\e$(C4z\e(B")
+   ("\e$(C$'$C$)$1\e(B"  "\e$(C4{\e(B")
+   ("\e$(C$'$C$)$2\e(B"  "\e$(C4|\e(B")
+   ("\e$(C$'$C$1\e(B"    "\e$(C4}\e(B")
+   ("\e$(C$'$C$2\e(B"    "\e$(C4~\e(B")
+   ("\e$(C$'$C$5\e(B"    "\e$(C5!\e(B")
+   ("\e$(C$'$C$7\e(B"    "\e$(C5"\e(B")
+   ("\e$(C$'$C$:\e(B"    "\e$(C5#\e(B")
+   ("\e$(C$'$C$=\e(B"    "\e$(C5$\e(B")
+
+   ("\e$(C$'$D\e(B"      "\e$(C5%\e(B")
+   ("\e$(C$'$D$!\e(B"    "\e$(C5&\e(B")
+   ("\e$(C$'$D$$\e(B"    "\e$(C5'\e(B")
+   ("\e$(C$'$D$)\e(B"    "\e$(C5(\e(B")
+   ("\e$(C$'$D$1\e(B"    "\e$(C5)\e(B")
+   ("\e$(C$'$D$2\e(B"    "\e$(C5*\e(B")
+   ("\e$(C$'$D$5\e(B"    "\e$(C5+\e(B")
+   ("\e$(C$'$D$6\e(B"    "\e$(C5,\e(B")
+   ("\e$(C$'$D$7\e(B"    "\e$(C5-\e(B")
+
+   ("\e$(C$'$E\e(B"      "\e$(C5.\e(B")
+   ("\e$(C$'$E$$\e(B"    "\e$(C5/\e(B")
+   ("\e$(C$'$E$)\e(B"    "\e$(C50\e(B")
+   ("\e$(C$'$E$6\e(B"    "\e$(C51\e(B")
+   ("\e$(C$'$E$7\e(B"    "\e$(C52\e(B")
+
+   ("\e$(C$'$F\e(B"      "\e$(C53\e(B")
+   ("\e$(C$'$F$$\e(B"    "\e$(C54\e(B")
+
+   ("\e$(C$'$G\e(B"      "\e$(C55\e(B")
+   ("\e$(C$'$G$!\e(B"    "\e$(C56\e(B")
+   ("\e$(C$'$G$$\e(B"    "\e$(C57\e(B")
+   ("\e$(C$'$G$'\e(B"    "\e$(C58\e(B")
+   ("\e$(C$'$G$)\e(B"    "\e$(C59\e(B")
+   ("\e$(C$'$G$)$1\e(B"  "\e$(C5:\e(B")
+   ("\e$(C$'$G$)$5\e(B"  "\e$(C5;\e(B")
+   ("\e$(C$'$G$1\e(B"    "\e$(C5<\e(B")
+   ("\e$(C$'$G$2\e(B"    "\e$(C5=\e(B")
+   ("\e$(C$'$G$5\e(B"    "\e$(C5>\e(B")
+   ("\e$(C$'$G$7\e(B"    "\e$(C5?\e(B")
+   ("\e$(C$'$G$:\e(B"    "\e$(C5@\e(B")
+   ("\e$(C$'$G$<\e(B"    "\e$(C5A\e(B")
+
+   ("\e$(C$'$G$?\e(B"    "\e$(C5B\e(B")
+   ("\e$(C$'$G$?$$\e(B"  "\e$(C5C\e(B")
+   ("\e$(C$'$G$?$)\e(B"  "\e$(C5D\e(B")
+
+   ("\e$(C$'$G$@\e(B"    "\e$(C5E\e(B")
+   ("\e$(C$'$G$@$6\e(B"  "\e$(C5F\e(B")
+
+   ("\e$(C$'$G$S\e(B"    "\e$(C5G\e(B")
+   ("\e$(C$'$G$S$$\e(B"  "\e$(C5H\e(B")
+   ("\e$(C$'$G$S$)\e(B"  "\e$(C5I\e(B")
+   ("\e$(C$'$G$S$1\e(B"  "\e$(C5J\e(B")
+   ("\e$(C$'$G$S$2\e(B"  "\e$(C5K\e(B")
+   ("\e$(C$'$G$S$5\e(B"  "\e$(C5L\e(B")
+
+   ("\e$(C$'$K\e(B"      "\e$(C5M\e(B")
+
+   ("\e$(C$'$L\e(B"      "\e$(C5N\e(B")
+   ("\e$(C$'$L$!\e(B"    "\e$(C5O\e(B")
+   ("\e$(C$'$L$$\e(B"    "\e$(C5P\e(B")
+   ("\e$(C$'$L$)\e(B"    "\e$(C5Q\e(B")
+   ("\e$(C$'$L$1\e(B"    "\e$(C5R\e(B")
+   ("\e$(C$'$L$2\e(B"    "\e$(C5S\e(B")
+   ("\e$(C$'$L$5\e(B"    "\e$(C5T\e(B")
+   ("\e$(C$'$L$7\e(B"    "\e$(C5U\e(B")
+
+   ("\e$(C$'$L$C\e(B"    "\e$(C5V\e(B")
+   ("\e$(C$'$L$C$6\e(B"  "\e$(C5W\e(B")
+
+   ("\e$(C$'$L$D\e(B"    "\e$(C5X\e(B")
+   ("\e$(C$'$L$D$7\e(B"  "\e$(C5Y\e(B")
+
+   ("\e$(C$'$L$S\e(B"    "\e$(C5Z\e(B")
+   ("\e$(C$'$L$S$$\e(B"  "\e$(C5[\e(B")
+   ("\e$(C$'$L$S$)\e(B"  "\e$(C5\\e(B")
+   ("\e$(C$'$L$S$2\e(B"  "\e$(C5]\e(B")
+   ("\e$(C$'$L$S$5\e(B"  "\e$(C5^\e(B")
+   ("\e$(C$'$L$S$7\e(B"  "\e$(C5_\e(B")
+
+   ("\e$(C$'$P\e(B"      "\e$(C5`\e(B")
+   ("\e$(C$'$P$$\e(B"    "\e$(C5a\e(B")
+   ("\e$(C$'$P$)\e(B"    "\e$(C5b\e(B")
+   ("\e$(C$'$P$1\e(B"    "\e$(C5c\e(B")
+   ("\e$(C$'$P$7\e(B"    "\e$(C5d\e(B")
+
+   ("\e$(C$'$Q\e(B"      "\e$(C5e\e(B")
+   ("\e$(C$'$Q$!\e(B"    "\e$(C5f\e(B")
+   ("\e$(C$'$Q$$\e(B"    "\e$(C5g\e(B")
+   ("\e$(C$'$Q$'\e(B"    "\e$(C5h\e(B")
+   ("\e$(C$'$Q$)\e(B"    "\e$(C5i\e(B")
+   ("\e$(C$'$Q$)$1\e(B"  "\e$(C5j\e(B")
+   ("\e$(C$'$Q$1\e(B"    "\e$(C5k\e(B")
+   ("\e$(C$'$Q$2\e(B"    "\e$(C5l\e(B")
+   ("\e$(C$'$Q$5\e(B"    "\e$(C5m\e(B")
+   ("\e$(C$'$Q$7\e(B"    "\e$(C5n\e(B")
+
+   ("\e$(C$'$Q$S\e(B"    "\e$(C5o\e(B")
+
+   ("\e$(C$'$S\e(B"      "\e$(C5p\e(B")
+   ("\e$(C$'$S$!\e(B"    "\e$(C5q\e(B")
+   ("\e$(C$'$S$$\e(B"    "\e$(C5r\e(B")
+   ("\e$(C$'$S$'\e(B"    "\e$(C5s\e(B")
+   ("\e$(C$'$S$)\e(B"    "\e$(C5t\e(B")
+   ("\e$(C$'$S$1\e(B"    "\e$(C5u\e(B")
+   ("\e$(C$'$S$2\e(B"    "\e$(C5v\e(B")
+   ("\e$(C$'$S$5\e(B"    "\e$(C5w\e(B")
+   ("\e$(C$'$S$6\e(B"    "\e$(C5x\e(B")
+   ("\e$(C$'$S$7\e(B"    "\e$(C5y\e(B")
+   ("\e$(C$'$S$8\e(B"    "\e$(C5z\e(B")
+
+   ("\e$(C$($?\e(B"      "\e$(C5{\e(B")
+   ("\e$(C$($?$!\e(B"    "\e$(C5|\e(B")
+   ("\e$(C$($?$$\e(B"    "\e$(C5}\e(B")
+   ("\e$(C$($?$)\e(B"    "\e$(C5~\e(B")
+   ("\e$(C$($?$1\e(B"    "\e$(C6!\e(B")
+   ("\e$(C$($?$2\e(B"    "\e$(C6"\e(B")
+   ("\e$(C$($?$5\e(B"    "\e$(C6#\e(B")
+   ("\e$(C$($?$6\e(B"    "\e$(C6$\e(B")
+   ("\e$(C$($?$7\e(B"    "\e$(C6%\e(B")
+   ("\e$(C$($?$>\e(B"    "\e$(C6&\e(B")
+
+   ("\e$(C$($@\e(B"      "\e$(C6'\e(B")
+   ("\e$(C$($@$!\e(B"    "\e$(C6(\e(B")
+   ("\e$(C$($@$$\e(B"    "\e$(C6)\e(B")
+   ("\e$(C$($@$)\e(B"    "\e$(C6*\e(B")
+   ("\e$(C$($@$1\e(B"    "\e$(C6+\e(B")
+   ("\e$(C$($@$2\e(B"    "\e$(C6,\e(B")
+   ("\e$(C$($@$5\e(B"    "\e$(C6-\e(B")
+   ("\e$(C$($@$6\e(B"    "\e$(C6.\e(B")
+   ("\e$(C$($@$7\e(B"    "\e$(C6/\e(B")
+
+   ("\e$(C$($C\e(B"      "\e$(C60\e(B")
+   ("\e$(C$($C$!\e(B"    "\e$(C61\e(B")
+   ("\e$(C$($C$$\e(B"    "\e$(C62\e(B")
+   ("\e$(C$($C$)\e(B"    "\e$(C63\e(B")
+   ("\e$(C$($C$)$1\e(B"  "\e$(C64\e(B")
+   ("\e$(C$($C$)$2\e(B"  "\e$(C65\e(B")
+   ("\e$(C$($C$1\e(B"    "\e$(C66\e(B")
+   ("\e$(C$($C$2\e(B"    "\e$(C67\e(B")
+   ("\e$(C$($C$5\e(B"    "\e$(C68\e(B")
+   ("\e$(C$($C$6\e(B"    "\e$(C69\e(B")
+   ("\e$(C$($C$7\e(B"    "\e$(C6:\e(B")
+   ("\e$(C$($C$>\e(B"    "\e$(C6;\e(B")
+
+   ("\e$(C$($D\e(B"      "\e$(C6<\e(B")
+   ("\e$(C$($D$!\e(B"    "\e$(C6=\e(B")
+   ("\e$(C$($D$$\e(B"    "\e$(C6>\e(B")
+   ("\e$(C$($D$)\e(B"    "\e$(C6?\e(B")
+   ("\e$(C$($D$1\e(B"    "\e$(C6@\e(B")
+   ("\e$(C$($D$2\e(B"    "\e$(C6A\e(B")
+   ("\e$(C$($D$5\e(B"    "\e$(C6B\e(B")
+   ("\e$(C$($D$6\e(B"    "\e$(C6C\e(B")
+   ("\e$(C$($D$7\e(B"    "\e$(C6D\e(B")
+
+   ("\e$(C$($E\e(B"      "\e$(C6E\e(B")
+   ("\e$(C$($E$6\e(B"    "\e$(C6F\e(B")
+
+   ("\e$(C$($G\e(B"      "\e$(C6G\e(B")
+   ("\e$(C$($G$!\e(B"    "\e$(C6H\e(B")
+   ("\e$(C$($G$$\e(B"    "\e$(C6I\e(B")
+   ("\e$(C$($G$)\e(B"    "\e$(C6J\e(B")
+   ("\e$(C$($G$7\e(B"    "\e$(C6K\e(B")
+
+   ("\e$(C$($G$?\e(B"    "\e$(C6L\e(B")
+   ("\e$(C$($G$?$)\e(B"  "\e$(C6M\e(B")
+
+   ("\e$(C$($G$@\e(B"    "\e$(C6N\e(B")
+
+   ("\e$(C$($G$S\e(B"    "\e$(C6O\e(B")
+   ("\e$(C$($G$S$$\e(B"  "\e$(C6P\e(B")
+
+   ("\e$(C$($L\e(B"      "\e$(C6Q\e(B")
+   ("\e$(C$($L$!\e(B"    "\e$(C6R\e(B")
+   ("\e$(C$($L$$\e(B"    "\e$(C6S\e(B")
+   ("\e$(C$($L$)\e(B"    "\e$(C6T\e(B")
+   ("\e$(C$($L$)$>\e(B"  "\e$(C6U\e(B")
+   ("\e$(C$($L$1\e(B"    "\e$(C6V\e(B")
+   ("\e$(C$($L$7\e(B"    "\e$(C6W\e(B")
+
+   ("\e$(C$($L$D\e(B"    "\e$(C6X\e(B")
+
+   ("\e$(C$($L$S\e(B"    "\e$(C6Y\e(B")
+   ("\e$(C$($L$S$$\e(B"  "\e$(C6Z\e(B")
+   ("\e$(C$($L$S$)\e(B"  "\e$(C6[\e(B")
+   ("\e$(C$($L$S$1\e(B"  "\e$(C6\\e(B")
+   ("\e$(C$($L$S$2\e(B"  "\e$(C6]\e(B")
+   ("\e$(C$($L$S$7\e(B"  "\e$(C6^\e(B")
+
+   ("\e$(C$($Q\e(B"      "\e$(C6_\e(B")
+   ("\e$(C$($Q$!\e(B"    "\e$(C6`\e(B")
+   ("\e$(C$($Q$$\e(B"    "\e$(C6a\e(B")
+   ("\e$(C$($Q$'\e(B"    "\e$(C6b\e(B")
+   ("\e$(C$($Q$)\e(B"    "\e$(C6c\e(B")
+   ("\e$(C$($Q$1\e(B"    "\e$(C6d\e(B")
+   ("\e$(C$($Q$2\e(B"    "\e$(C6e\e(B")
+   ("\e$(C$($Q$5\e(B"    "\e$(C6f\e(B")
+
+   ("\e$(C$($Q$S\e(B"    "\e$(C6g\e(B")
+   ("\e$(C$($Q$S$$\e(B"  "\e$(C6h\e(B")
+   ("\e$(C$($Q$S$)\e(B"  "\e$(C6i\e(B")
+   ("\e$(C$($Q$S$1\e(B"  "\e$(C6j\e(B")
+   ("\e$(C$($Q$S$2\e(B"  "\e$(C6k\e(B")
+
+   ("\e$(C$($S\e(B"      "\e$(C6l\e(B")
+   ("\e$(C$($S$$\e(B"    "\e$(C6m\e(B")
+   ("\e$(C$($S$)\e(B"    "\e$(C6n\e(B")
+   ("\e$(C$($S$1\e(B"    "\e$(C6o\e(B")
+   ("\e$(C$($S$2\e(B"    "\e$(C6p\e(B")
+   ("\e$(C$($S$5\e(B"    "\e$(C6q\e(B")
+   ("\e$(C$($S$7\e(B"    "\e$(C6r\e(B")
+
+   ("\e$(C$)$?\e(B"      "\e$(C6s\e(B")
+   ("\e$(C$)$?$!\e(B"    "\e$(C6t\e(B")
+   ("\e$(C$)$?$$\e(B"    "\e$(C6u\e(B")
+   ("\e$(C$)$?$)\e(B"    "\e$(C6v\e(B")
+   ("\e$(C$)$?$1\e(B"    "\e$(C6w\e(B")
+   ("\e$(C$)$?$2\e(B"    "\e$(C6x\e(B")
+   ("\e$(C$)$?$5\e(B"    "\e$(C6y\e(B")
+   ("\e$(C$)$?$6\e(B"    "\e$(C6z\e(B")
+   ("\e$(C$)$?$7\e(B"    "\e$(C6{\e(B")
+   ("\e$(C$)$?$8\e(B"    "\e$(C6|\e(B")
+   ("\e$(C$)$?$=\e(B"    "\e$(C6}\e(B")
+   ("\e$(C$)$?$>\e(B"    "\e$(C6~\e(B")
+
+   ("\e$(C$)$@\e(B"      "\e$(C7!\e(B")
+   ("\e$(C$)$@$!\e(B"    "\e$(C7"\e(B")
+   ("\e$(C$)$@$$\e(B"    "\e$(C7#\e(B")
+   ("\e$(C$)$@$)\e(B"    "\e$(C7$\e(B")
+   ("\e$(C$)$@$1\e(B"    "\e$(C7%\e(B")
+   ("\e$(C$)$@$2\e(B"    "\e$(C7&\e(B")
+   ("\e$(C$)$@$5\e(B"    "\e$(C7'\e(B")
+   ("\e$(C$)$@$6\e(B"    "\e$(C7(\e(B")
+   ("\e$(C$)$@$7\e(B"    "\e$(C7)\e(B")
+
+   ("\e$(C$)$A\e(B"      "\e$(C7*\e(B")
+   ("\e$(C$)$A$!\e(B"    "\e$(C7+\e(B")
+   ("\e$(C$)$A$$\e(B"    "\e$(C7,\e(B")
+   ("\e$(C$)$A$5\e(B"    "\e$(C7-\e(B")
+   ("\e$(C$)$A$7\e(B"    "\e$(C7.\e(B")
+
+   ("\e$(C$)$C\e(B"      "\e$(C7/\e(B")
+   ("\e$(C$)$C$!\e(B"    "\e$(C70\e(B")
+   ("\e$(C$)$C$$\e(B"    "\e$(C71\e(B")
+   ("\e$(C$)$C$)\e(B"    "\e$(C72\e(B")
+   ("\e$(C$)$C$1\e(B"    "\e$(C73\e(B")
+   ("\e$(C$)$C$2\e(B"    "\e$(C74\e(B")
+   ("\e$(C$)$C$5\e(B"    "\e$(C75\e(B")
+   ("\e$(C$)$C$6\e(B"    "\e$(C76\e(B")
+   ("\e$(C$)$C$7\e(B"    "\e$(C77\e(B")
+   ("\e$(C$)$C$>\e(B"    "\e$(C78\e(B")
+
+   ("\e$(C$)$D\e(B"      "\e$(C79\e(B")
+   ("\e$(C$)$D$!\e(B"    "\e$(C7:\e(B")
+   ("\e$(C$)$D$$\e(B"    "\e$(C7;\e(B")
+   ("\e$(C$)$D$)\e(B"    "\e$(C7<\e(B")
+   ("\e$(C$)$D$1\e(B"    "\e$(C7=\e(B")
+   ("\e$(C$)$D$2\e(B"    "\e$(C7>\e(B")
+   ("\e$(C$)$D$5\e(B"    "\e$(C7?\e(B")
+   ("\e$(C$)$D$7\e(B"    "\e$(C7@\e(B")
+
+   ("\e$(C$)$E\e(B"      "\e$(C7A\e(B")
+   ("\e$(C$)$E$!\e(B"    "\e$(C7B\e(B")
+   ("\e$(C$)$E$$\e(B"    "\e$(C7C\e(B")
+   ("\e$(C$)$E$)\e(B"    "\e$(C7D\e(B")
+   ("\e$(C$)$E$1\e(B"    "\e$(C7E\e(B")
+   ("\e$(C$)$E$2\e(B"    "\e$(C7F\e(B")
+   ("\e$(C$)$E$5\e(B"    "\e$(C7G\e(B")
+   ("\e$(C$)$E$6\e(B"    "\e$(C7H\e(B")
+   ("\e$(C$)$E$7\e(B"    "\e$(C7I\e(B")
+
+   ("\e$(C$)$F\e(B"      "\e$(C7J\e(B")
+   ("\e$(C$)$F$$\e(B"    "\e$(C7K\e(B")
+   ("\e$(C$)$F$2\e(B"    "\e$(C7L\e(B")
+   ("\e$(C$)$F$5\e(B"    "\e$(C7M\e(B")
+
+   ("\e$(C$)$G\e(B"      "\e$(C7N\e(B")
+   ("\e$(C$)$G$!\e(B"    "\e$(C7O\e(B")
+   ("\e$(C$)$G$$\e(B"    "\e$(C7P\e(B")
+   ("\e$(C$)$G$)\e(B"    "\e$(C7Q\e(B")
+   ("\e$(C$)$G$1\e(B"    "\e$(C7R\e(B")
+   ("\e$(C$)$G$2\e(B"    "\e$(C7S\e(B")
+   ("\e$(C$)$G$5\e(B"    "\e$(C7T\e(B")
+   ("\e$(C$)$G$7\e(B"    "\e$(C7U\e(B")
+
+   ("\e$(C$)$G$?\e(B"    "\e$(C7V\e(B")
+   ("\e$(C$)$G$?$$\e(B"  "\e$(C7W\e(B")
+   ("\e$(C$)$G$?$7\e(B"  "\e$(C7X\e(B")
+
+   ("\e$(C$)$G$@$6\e(B"  "\e$(C7Y\e(B")
+
+   ("\e$(C$)$G$S\e(B"    "\e$(C7Z\e(B")
+   ("\e$(C$)$G$S$$\e(B"  "\e$(C7[\e(B")
+   ("\e$(C$)$G$S$)\e(B"  "\e$(C7\\e(B")
+   ("\e$(C$)$G$S$1\e(B"  "\e$(C7]\e(B")
+   ("\e$(C$)$G$S$2\e(B"  "\e$(C7^\e(B")
+   ("\e$(C$)$G$S$5\e(B"  "\e$(C7_\e(B")
+   ("\e$(C$)$G$S$7\e(B"  "\e$(C7`\e(B")
+
+   ("\e$(C$)$K\e(B"      "\e$(C7a\e(B")
+   ("\e$(C$)$K$$\e(B"    "\e$(C7b\e(B")
+   ("\e$(C$)$K$)\e(B"    "\e$(C7c\e(B")
+   ("\e$(C$)$K$2\e(B"    "\e$(C7d\e(B")
+   ("\e$(C$)$K$5\e(B"    "\e$(C7e\e(B")
+   ("\e$(C$)$K$7\e(B"    "\e$(C7f\e(B")
+
+   ("\e$(C$)$L\e(B"      "\e$(C7g\e(B")
+   ("\e$(C$)$L$!\e(B"    "\e$(C7h\e(B")
+   ("\e$(C$)$L$$\e(B"    "\e$(C7i\e(B")
+   ("\e$(C$)$L$)\e(B"    "\e$(C7j\e(B")
+   ("\e$(C$)$L$1\e(B"    "\e$(C7k\e(B")
+   ("\e$(C$)$L$2\e(B"    "\e$(C7l\e(B")
+   ("\e$(C$)$L$5\e(B"    "\e$(C7m\e(B")
+   ("\e$(C$)$L$7\e(B"    "\e$(C7n\e(B")
+
+   ("\e$(C$)$L$C\e(B"    "\e$(C7o\e(B")
+   ("\e$(C$)$L$C$6\e(B"  "\e$(C7p\e(B")
+
+   ("\e$(C$)$L$D\e(B"    "\e$(C7q\e(B")
+
+   ("\e$(C$)$L$S\e(B"    "\e$(C7r\e(B")
+   ("\e$(C$)$L$S$!\e(B"  "\e$(C7s\e(B")
+   ("\e$(C$)$L$S$$\e(B"  "\e$(C7t\e(B")
+   ("\e$(C$)$L$S$)\e(B"  "\e$(C7u\e(B")
+   ("\e$(C$)$L$S$1\e(B"  "\e$(C7v\e(B")
+   ("\e$(C$)$L$S$5\e(B"  "\e$(C7w\e(B")
+   ("\e$(C$)$L$S$7\e(B"  "\e$(C7x\e(B")
+
+   ("\e$(C$)$P\e(B"      "\e$(C7y\e(B")
+   ("\e$(C$)$P$!\e(B"    "\e$(C7z\e(B")
+   ("\e$(C$)$P$$\e(B"    "\e$(C7{\e(B")
+   ("\e$(C$)$P$)\e(B"    "\e$(C7|\e(B")
+   ("\e$(C$)$P$1\e(B"    "\e$(C7}\e(B")
+   ("\e$(C$)$P$2\e(B"    "\e$(C7~\e(B")
+   ("\e$(C$)$P$5\e(B"    "\e$(C8!\e(B")
+   ("\e$(C$)$P$7\e(B"    "\e$(C8"\e(B")
+
+   ("\e$(C$)$Q\e(B"      "\e$(C8#\e(B")
+   ("\e$(C$)$Q$!\e(B"    "\e$(C8$\e(B")
+   ("\e$(C$)$Q$$\e(B"    "\e$(C8%\e(B")
+   ("\e$(C$)$Q$)\e(B"    "\e$(C8&\e(B")
+   ("\e$(C$)$Q$1\e(B"    "\e$(C8'\e(B")
+   ("\e$(C$)$Q$2\e(B"    "\e$(C8(\e(B")
+   ("\e$(C$)$Q$5\e(B"    "\e$(C8)\e(B")
+   ("\e$(C$)$Q$7\e(B"    "\e$(C8*\e(B")
+   ("\e$(C$)$Q$8\e(B"    "\e$(C8+\e(B")
+   ("\e$(C$)$Q$<\e(B"    "\e$(C8,\e(B")
+   ("\e$(C$)$Q$=\e(B"    "\e$(C8-\e(B")
+
+   ("\e$(C$)$S\e(B"      "\e$(C8.\e(B")
+   ("\e$(C$)$S$!\e(B"    "\e$(C8/\e(B")
+   ("\e$(C$)$S$$\e(B"    "\e$(C80\e(B")
+   ("\e$(C$)$S$)\e(B"    "\e$(C81\e(B")
+   ("\e$(C$)$S$1\e(B"    "\e$(C82\e(B")
+   ("\e$(C$)$S$2\e(B"    "\e$(C83\e(B")
+   ("\e$(C$)$S$5\e(B"    "\e$(C84\e(B")
+   ("\e$(C$)$S$7\e(B"    "\e$(C85\e(B")
+
+   ("\e$(C$1$?\e(B"      "\e$(C86\e(B")
+   ("\e$(C$1$?$!\e(B"    "\e$(C87\e(B")
+   ("\e$(C$1$?$$\e(B"    "\e$(C88\e(B")
+   ("\e$(C$1$?$$$>\e(B"  "\e$(C89\e(B")
+   ("\e$(C$1$?$'\e(B"    "\e$(C8:\e(B")
+   ("\e$(C$1$?$)\e(B"    "\e$(C8;\e(B")
+   ("\e$(C$1$?$)$!\e(B"  "\e$(C8<\e(B")
+   ("\e$(C$1$?$)$1\e(B"  "\e$(C8=\e(B")
+   ("\e$(C$1$?$1\e(B"    "\e$(C8>\e(B")
+   ("\e$(C$1$?$2\e(B"    "\e$(C8?\e(B")
+   ("\e$(C$1$?$5\e(B"    "\e$(C8@\e(B")
+   ("\e$(C$1$?$7\e(B"    "\e$(C8A\e(B")
+   ("\e$(C$1$?$8\e(B"    "\e$(C8B\e(B")
+   ("\e$(C$1$?$<\e(B"    "\e$(C8C\e(B")
+   ("\e$(C$1$?$>\e(B"    "\e$(C8D\e(B")
+
+   ("\e$(C$1$@\e(B"      "\e$(C8E\e(B")
+   ("\e$(C$1$@$!\e(B"    "\e$(C8F\e(B")
+   ("\e$(C$1$@$$\e(B"    "\e$(C8G\e(B")
+   ("\e$(C$1$@$)\e(B"    "\e$(C8H\e(B")
+   ("\e$(C$1$@$1\e(B"    "\e$(C8I\e(B")
+   ("\e$(C$1$@$2\e(B"    "\e$(C8J\e(B")
+   ("\e$(C$1$@$5\e(B"    "\e$(C8K\e(B")
+   ("\e$(C$1$@$6\e(B"    "\e$(C8L\e(B")
+   ("\e$(C$1$@$7\e(B"    "\e$(C8M\e(B")
+   ("\e$(C$1$@$8\e(B"    "\e$(C8N\e(B")
+
+   ("\e$(C$1$A\e(B"      "\e$(C8O\e(B")
+   ("\e$(C$1$A$!\e(B"    "\e$(C8P\e(B")
+   ("\e$(C$1$A$)\e(B"    "\e$(C8Q\e(B")
+   ("\e$(C$1$A$7\e(B"    "\e$(C8R\e(B")
+
+   ("\e$(C$1$C\e(B"      "\e$(C8S\e(B")
+   ("\e$(C$1$C$!\e(B"    "\e$(C8T\e(B")
+   ("\e$(C$1$C$$\e(B"    "\e$(C8U\e(B")
+   ("\e$(C$1$C$)\e(B"    "\e$(C8V\e(B")
+   ("\e$(C$1$C$)$1\e(B"  "\e$(C8W\e(B")
+   ("\e$(C$1$C$1\e(B"    "\e$(C8X\e(B")
+   ("\e$(C$1$C$2\e(B"    "\e$(C8Y\e(B")
+   ("\e$(C$1$C$5\e(B"    "\e$(C8Z\e(B")
+   ("\e$(C$1$C$7\e(B"    "\e$(C8[\e(B")
+   ("\e$(C$1$C$8\e(B"    "\e$(C8\\e(B")
+   ("\e$(C$1$C$>\e(B"    "\e$(C8]\e(B")
+
+   ("\e$(C$1$D\e(B"      "\e$(C8^\e(B")
+   ("\e$(C$1$D$!\e(B"    "\e$(C8_\e(B")
+   ("\e$(C$1$D$$\e(B"    "\e$(C8`\e(B")
+   ("\e$(C$1$D$)\e(B"    "\e$(C8a\e(B")
+   ("\e$(C$1$D$1\e(B"    "\e$(C8b\e(B")
+   ("\e$(C$1$D$2\e(B"    "\e$(C8c\e(B")
+   ("\e$(C$1$D$5\e(B"    "\e$(C8d\e(B")
+   ("\e$(C$1$D$6\e(B"    "\e$(C8e\e(B")
+   ("\e$(C$1$D$7\e(B"    "\e$(C8f\e(B")
+
+   ("\e$(C$1$E\e(B"      "\e$(C8g\e(B")
+   ("\e$(C$1$E$!\e(B"    "\e$(C8h\e(B")
+   ("\e$(C$1$E$$\e(B"    "\e$(C8i\e(B")
+   ("\e$(C$1$E$)\e(B"    "\e$(C8j\e(B")
+   ("\e$(C$1$E$5\e(B"    "\e$(C8k\e(B")
+   ("\e$(C$1$E$6\e(B"    "\e$(C8l\e(B")
+   ("\e$(C$1$E$7\e(B"    "\e$(C8m\e(B")
+   ("\e$(C$1$E$:\e(B"    "\e$(C8n\e(B")
+
+   ("\e$(C$1$F\e(B"      "\e$(C8o\e(B")
+
+   ("\e$(C$1$G\e(B"      "\e$(C8p\e(B")
+   ("\e$(C$1$G$!\e(B"    "\e$(C8q\e(B")
+   ("\e$(C$1$G$!$5\e(B"  "\e$(C8r\e(B")
+   ("\e$(C$1$G$$\e(B"    "\e$(C8s\e(B")
+   ("\e$(C$1$G$)\e(B"    "\e$(C8t\e(B")
+   ("\e$(C$1$G$)$1\e(B"  "\e$(C8u\e(B")
+   ("\e$(C$1$G$1\e(B"    "\e$(C8v\e(B")
+   ("\e$(C$1$G$2\e(B"    "\e$(C8w\e(B")
+   ("\e$(C$1$G$5\e(B"    "\e$(C8x\e(B")
+   ("\e$(C$1$G$7\e(B"    "\e$(C8y\e(B")
+
+   ("\e$(C$1$G$?\e(B"    "\e$(C8z\e(B")
+   ("\e$(C$1$G$?$$\e(B"  "\e$(C8{\e(B")
+   ("\e$(C$1$G$?$6\e(B"  "\e$(C8|\e(B")
+   ("\e$(C$1$G$?$7\e(B"  "\e$(C8}\e(B")
+
+   ("\e$(C$1$G$S\e(B"    "\e$(C8~\e(B")
+   ("\e$(C$1$G$S$$\e(B"  "\e$(C9!\e(B")
+   ("\e$(C$1$G$S$)\e(B"  "\e$(C9"\e(B")
+   ("\e$(C$1$G$S$2\e(B"  "\e$(C9#\e(B")
+   ("\e$(C$1$G$S$5\e(B"  "\e$(C9$\e(B")
+   ("\e$(C$1$G$S$7\e(B"  "\e$(C9%\e(B")
+
+   ("\e$(C$1$K\e(B"      "\e$(C9&\e(B")
+   ("\e$(C$1$K$$\e(B"    "\e$(C9'\e(B")
+   ("\e$(C$1$K$)\e(B"    "\e$(C9(\e(B")
+   ("\e$(C$1$K$2\e(B"    "\e$(C9)\e(B")
+   ("\e$(C$1$K$5\e(B"    "\e$(C9*\e(B")
+
+   ("\e$(C$1$L\e(B"      "\e$(C9+\e(B")
+   ("\e$(C$1$L$!\e(B"    "\e$(C9,\e(B")
+   ("\e$(C$1$L$"\e(B"    "\e$(C9-\e(B")
+   ("\e$(C$1$L$$\e(B"    "\e$(C9.\e(B")
+   ("\e$(C$1$L$'\e(B"    "\e$(C9/\e(B")
+   ("\e$(C$1$L$)\e(B"    "\e$(C90\e(B")
+   ("\e$(C$1$L$)$!\e(B"  "\e$(C91\e(B")
+   ("\e$(C$1$L$)$1\e(B"  "\e$(C92\e(B")
+   ("\e$(C$1$L$1\e(B"    "\e$(C93\e(B")
+   ("\e$(C$1$L$2\e(B"    "\e$(C94\e(B")
+   ("\e$(C$1$L$5\e(B"    "\e$(C95\e(B")
+   ("\e$(C$1$L$7\e(B"    "\e$(C96\e(B")
+   ("\e$(C$1$L$<\e(B"    "\e$(C97\e(B")
+   ("\e$(C$1$L$>\e(B"    "\e$(C98\e(B")
+
+   ("\e$(C$1$L$C\e(B"    "\e$(C99\e(B")
+   ("\e$(C$1$L$C$$\e(B"  "\e$(C9:\e(B")
+   ("\e$(C$1$L$C$)\e(B"  "\e$(C9;\e(B")
+   ("\e$(C$1$L$C$2\e(B"  "\e$(C9<\e(B")
+   ("\e$(C$1$L$C$5\e(B"  "\e$(C9=\e(B")
+
+   ("\e$(C$1$L$D\e(B"    "\e$(C9>\e(B")
+
+   ("\e$(C$1$L$S\e(B"    "\e$(C9?\e(B")
+   ("\e$(C$1$L$S$$\e(B"  "\e$(C9@\e(B")
+   ("\e$(C$1$L$S$)\e(B"  "\e$(C9A\e(B")
+
+   ("\e$(C$1$P\e(B"      "\e$(C9B\e(B")
+   ("\e$(C$1$P$$\e(B"    "\e$(C9C\e(B")
+   ("\e$(C$1$P$)\e(B"    "\e$(C9D\e(B")
+   ("\e$(C$1$P$1\e(B"    "\e$(C9E\e(B")
+   ("\e$(C$1$P$5\e(B"    "\e$(C9F\e(B")
+
+   ("\e$(C$1$Q\e(B"      "\e$(C9G\e(B")
+   ("\e$(C$1$Q$$\e(B"    "\e$(C9H\e(B")
+   ("\e$(C$1$Q$)\e(B"    "\e$(C9I\e(B")
+   ("\e$(C$1$Q$1\e(B"    "\e$(C9J\e(B")
+   ("\e$(C$1$Q$5\e(B"    "\e$(C9K\e(B")
+
+   ("\e$(C$1$S\e(B"      "\e$(C9L\e(B")
+   ("\e$(C$1$S$!\e(B"    "\e$(C9M\e(B")
+   ("\e$(C$1$S$$\e(B"    "\e$(C9N\e(B")
+   ("\e$(C$1$S$'\e(B"    "\e$(C9O\e(B")
+   ("\e$(C$1$S$)\e(B"    "\e$(C9P\e(B")
+   ("\e$(C$1$S$)$1\e(B"  "\e$(C9Q\e(B")
+   ("\e$(C$1$S$1\e(B"    "\e$(C9R\e(B")
+   ("\e$(C$1$S$2\e(B"    "\e$(C9S\e(B")
+   ("\e$(C$1$S$5\e(B"    "\e$(C9T\e(B")
+   ("\e$(C$1$S$6\e(B"    "\e$(C9U\e(B")
+   ("\e$(C$1$S$7\e(B"    "\e$(C9V\e(B")
+   ("\e$(C$1$S$:\e(B"    "\e$(C9W\e(B")
+   ("\e$(C$1$S$<\e(B"    "\e$(C9X\e(B")
+
+   ("\e$(C$2$?\e(B"      "\e$(C9Y\e(B")
+   ("\e$(C$2$?$!\e(B"    "\e$(C9Z\e(B")
+   ("\e$(C$2$?$!$5\e(B"  "\e$(C9\\e(B")
+   ("\e$(C$2$?$"\e(B"    "\e$(C9[\e(B")
+   ("\e$(C$2$?$$\e(B"    "\e$(C9]\e(B")
+   ("\e$(C$2$?$'\e(B"    "\e$(C9^\e(B")
+   ("\e$(C$2$?$)\e(B"    "\e$(C9_\e(B")
+   ("\e$(C$2$?$)$!\e(B"  "\e$(C9`\e(B")
+   ("\e$(C$2$?$)$1\e(B"  "\e$(C9a\e(B")
+   ("\e$(C$2$?$)$2\e(B"  "\e$(C9b\e(B")
+   ("\e$(C$2$?$1\e(B"    "\e$(C9c\e(B")
+   ("\e$(C$2$?$2\e(B"    "\e$(C9d\e(B")
+   ("\e$(C$2$?$5\e(B"    "\e$(C9e\e(B")
+   ("\e$(C$2$?$7\e(B"    "\e$(C9f\e(B")
+   ("\e$(C$2$?$<\e(B"    "\e$(C9g\e(B")
+
+   ("\e$(C$2$@\e(B"      "\e$(C9h\e(B")
+   ("\e$(C$2$@$!\e(B"    "\e$(C9i\e(B")
+   ("\e$(C$2$@$$\e(B"    "\e$(C9j\e(B")
+   ("\e$(C$2$@$)\e(B"    "\e$(C9k\e(B")
+   ("\e$(C$2$@$1\e(B"    "\e$(C9l\e(B")
+   ("\e$(C$2$@$2\e(B"    "\e$(C9m\e(B")
+   ("\e$(C$2$@$5\e(B"    "\e$(C9n\e(B")
+   ("\e$(C$2$@$6\e(B"    "\e$(C9o\e(B")
+   ("\e$(C$2$@$7\e(B"    "\e$(C9p\e(B")
+   ("\e$(C$2$@$<\e(B"    "\e$(C9q\e(B")
+
+   ("\e$(C$2$A\e(B"      "\e$(C9r\e(B")
+   ("\e$(C$2$A$!\e(B"    "\e$(C9s\e(B")
+   ("\e$(C$2$A$$\e(B"    "\e$(C9t\e(B")
+   ("\e$(C$2$A$2\e(B"    "\e$(C9u\e(B")
+
+   ("\e$(C$2$C\e(B"      "\e$(C9v\e(B")
+   ("\e$(C$2$C$!\e(B"    "\e$(C9w\e(B")
+   ("\e$(C$2$C$$\e(B"    "\e$(C9x\e(B")
+   ("\e$(C$2$C$'\e(B"    "\e$(C9y\e(B")
+   ("\e$(C$2$C$)\e(B"    "\e$(C9z\e(B")
+   ("\e$(C$2$C$)$1\e(B"  "\e$(C9{\e(B")
+   ("\e$(C$2$C$1\e(B"    "\e$(C9|\e(B")
+   ("\e$(C$2$C$2\e(B"    "\e$(C9}\e(B")
+   ("\e$(C$2$C$5\e(B"    "\e$(C9~\e(B")
+   ("\e$(C$2$C$7\e(B"    "\e$(C:!\e(B")
+   ("\e$(C$2$C$8\e(B"    "\e$(C:"\e(B")
+
+   ("\e$(C$2$D\e(B"      "\e$(C:#\e(B")
+   ("\e$(C$2$D$!\e(B"    "\e$(C:$\e(B")
+   ("\e$(C$2$D$$\e(B"    "\e$(C:%\e(B")
+   ("\e$(C$2$D$'\e(B"    "\e$(C:&\e(B")
+   ("\e$(C$2$D$)\e(B"    "\e$(C:'\e(B")
+   ("\e$(C$2$D$1\e(B"    "\e$(C:(\e(B")
+   ("\e$(C$2$D$2\e(B"    "\e$(C:)\e(B")
+   ("\e$(C$2$D$5\e(B"    "\e$(C:*\e(B")
+   ("\e$(C$2$D$6\e(B"    "\e$(C:+\e(B")
+   ("\e$(C$2$D$7\e(B"    "\e$(C:,\e(B")
+
+   ("\e$(C$2$E\e(B"      "\e$(C:-\e(B")
+   ("\e$(C$2$E$!\e(B"    "\e$(C:.\e(B")
+   ("\e$(C$2$E$$\e(B"    "\e$(C:/\e(B")
+   ("\e$(C$2$E$)\e(B"    "\e$(C:0\e(B")
+   ("\e$(C$2$E$2\e(B"    "\e$(C:1\e(B")
+   ("\e$(C$2$E$5\e(B"    "\e$(C:2\e(B")
+   ("\e$(C$2$E$6\e(B"    "\e$(C:3\e(B")
+   ("\e$(C$2$E$7\e(B"    "\e$(C:4\e(B")
+   ("\e$(C$2$E$<\e(B"    "\e$(C:5\e(B")
+
+   ("\e$(C$2$F\e(B"      "\e$(C:6\e(B")
+   ("\e$(C$2$F$$\e(B"    "\e$(C:7\e(B")
+
+   ("\e$(C$2$G\e(B"      "\e$(C:8\e(B")
+   ("\e$(C$2$G$!\e(B"    "\e$(C:9\e(B")
+   ("\e$(C$2$G$"\e(B"    "\e$(C::\e(B")
+   ("\e$(C$2$G$$\e(B"    "\e$(C:;\e(B")
+   ("\e$(C$2$G$)\e(B"    "\e$(C:<\e(B")
+   ("\e$(C$2$G$1\e(B"    "\e$(C:=\e(B")
+   ("\e$(C$2$G$2\e(B"    "\e$(C:>\e(B")
+   ("\e$(C$2$G$5\e(B"    "\e$(C:?\e(B")
+   ("\e$(C$2$G$7\e(B"    "\e$(C:@\e(B")
+
+   ("\e$(C$2$G$?\e(B"    "\e$(C:A\e(B")
+   ("\e$(C$2$G$?$$\e(B"  "\e$(C:B\e(B")
+   ("\e$(C$2$G$?$6\e(B"  "\e$(C:C\e(B")
+
+   ("\e$(C$2$G$@\e(B"    "\e$(C:D\e(B")
+   ("\e$(C$2$G$@$6\e(B"  "\e$(C:E\e(B")
+
+   ("\e$(C$2$G$S\e(B"    "\e$(C:F\e(B")
+   ("\e$(C$2$G$S$!\e(B"  "\e$(C:G\e(B")
+   ("\e$(C$2$G$S$$\e(B"  "\e$(C:H\e(B")
+   ("\e$(C$2$G$S$)\e(B"  "\e$(C:I\e(B")
+   ("\e$(C$2$G$S$1\e(B"  "\e$(C:J\e(B")
+   ("\e$(C$2$G$S$2\e(B"  "\e$(C:K\e(B")
+
+   ("\e$(C$2$K\e(B"      "\e$(C:L\e(B")
+   ("\e$(C$2$K$$\e(B"    "\e$(C:M\e(B")
+
+   ("\e$(C$2$L\e(B"      "\e$(C:N\e(B")
+   ("\e$(C$2$L$!\e(B"    "\e$(C:O\e(B")
+   ("\e$(C$2$L$$\e(B"    "\e$(C:P\e(B")
+   ("\e$(C$2$L$'\e(B"    "\e$(C:Q\e(B")
+   ("\e$(C$2$L$)\e(B"    "\e$(C:R\e(B")
+   ("\e$(C$2$L$)$!\e(B"  "\e$(C:S\e(B")
+   ("\e$(C$2$L$)$1\e(B"  "\e$(C:T\e(B")
+   ("\e$(C$2$L$1\e(B"    "\e$(C:U\e(B")
+   ("\e$(C$2$L$2\e(B"    "\e$(C:V\e(B")
+   ("\e$(C$2$L$5\e(B"    "\e$(C:W\e(B")
+   ("\e$(C$2$L$7\e(B"    "\e$(C:X\e(B")
+   ("\e$(C$2$L$<\e(B"    "\e$(C:Y\e(B")
+   ("\e$(C$2$L$=\e(B"    "\e$(C:Z\e(B")
+
+   ("\e$(C$2$L$C\e(B"    "\e$(C:[\e(B")
+   ("\e$(C$2$L$C$)\e(B"  "\e$(C:\\e(B")
+   ("\e$(C$2$L$C$6\e(B"  "\e$(C:]\e(B")
+
+   ("\e$(C$2$L$D\e(B"    "\e$(C:^\e(B")
+
+   ("\e$(C$2$L$S\e(B"    "\e$(C:_\e(B")
+   ("\e$(C$2$L$S$!\e(B"  "\e$(C:`\e(B")
+   ("\e$(C$2$L$S$$\e(B"  "\e$(C:a\e(B")
+   ("\e$(C$2$L$S$)\e(B"  "\e$(C:b\e(B")
+   ("\e$(C$2$L$S$7\e(B"  "\e$(C:c\e(B")
+
+   ("\e$(C$2$P\e(B"      "\e$(C:d\e(B")
+   ("\e$(C$2$P$$\e(B"    "\e$(C:e\e(B")
+   ("\e$(C$2$P$)\e(B"    "\e$(C:f\e(B")
+   ("\e$(C$2$P$1\e(B"    "\e$(C:g\e(B")
+   ("\e$(C$2$P$5\e(B"    "\e$(C:h\e(B")
+   ("\e$(C$2$P$7\e(B"    "\e$(C:i\e(B")
+
+   ("\e$(C$2$Q\e(B"      "\e$(C:j\e(B")
+   ("\e$(C$2$Q$!\e(B"    "\e$(C:k\e(B")
+   ("\e$(C$2$Q$$\e(B"    "\e$(C:l\e(B")
+   ("\e$(C$2$Q$)\e(B"    "\e$(C:m\e(B")
+   ("\e$(C$2$Q$1\e(B"    "\e$(C:n\e(B")
+   ("\e$(C$2$Q$2\e(B"    "\e$(C:o\e(B")
+   ("\e$(C$2$Q$5\e(B"    "\e$(C:p\e(B")
+
+   ("\e$(C$2$S\e(B"      "\e$(C:q\e(B")
+   ("\e$(C$2$S$!\e(B"    "\e$(C:r\e(B")
+   ("\e$(C$2$S$$\e(B"    "\e$(C:s\e(B")
+   ("\e$(C$2$S$)\e(B"    "\e$(C:t\e(B")
+   ("\e$(C$2$S$)$1\e(B"  "\e$(C:u\e(B")
+   ("\e$(C$2$S$1\e(B"    "\e$(C:v\e(B")
+   ("\e$(C$2$S$2\e(B"    "\e$(C:w\e(B")
+   ("\e$(C$2$S$5\e(B"    "\e$(C:x\e(B")
+   ("\e$(C$2$S$7\e(B"    "\e$(C:y\e(B")
+   ("\e$(C$2$S$8\e(B"    "\e$(C:z\e(B")
+   ("\e$(C$2$S$:\e(B"    "\e$(C:{\e(B")
+
+   ("\e$(C$3$?\e(B"      "\e$(C:|\e(B")
+   ("\e$(C$3$?$!\e(B"    "\e$(C:}\e(B")
+   ("\e$(C$3$?$$\e(B"    "\e$(C:~\e(B")
+   ("\e$(C$3$?$)\e(B"    "\e$(C;!\e(B")
+   ("\e$(C$3$?$)$1\e(B"  "\e$(C;"\e(B")
+   ("\e$(C$3$?$1\e(B"    "\e$(C;#\e(B")
+   ("\e$(C$3$?$2\e(B"    "\e$(C;$\e(B")
+   ("\e$(C$3$?$5\e(B"    "\e$(C;%\e(B")
+   ("\e$(C$3$?$6\e(B"    "\e$(C;&\e(B")
+   ("\e$(C$3$?$7\e(B"    "\e$(C;'\e(B")
+   ("\e$(C$3$?$>\e(B"    "\e$(C;(\e(B")
+
+   ("\e$(C$3$@\e(B"      "\e$(C;)\e(B")
+   ("\e$(C$3$@$!\e(B"    "\e$(C;*\e(B")
+   ("\e$(C$3$@$$\e(B"    "\e$(C;+\e(B")
+   ("\e$(C$3$@$)\e(B"    "\e$(C;,\e(B")
+   ("\e$(C$3$@$1\e(B"    "\e$(C;-\e(B")
+   ("\e$(C$3$@$2\e(B"    "\e$(C;.\e(B")
+   ("\e$(C$3$@$5\e(B"    "\e$(C;/\e(B")
+   ("\e$(C$3$@$6\e(B"    "\e$(C;0\e(B")
+   ("\e$(C$3$@$7\e(B"    "\e$(C;1\e(B")
+
+   ("\e$(C$3$A\e(B"      "\e$(C;2\e(B")
+   ("\e$(C$3$A$!\e(B"    "\e$(C;3\e(B")
+   ("\e$(C$3$A$1\e(B"    "\e$(C;4\e(B")
+
+   ("\e$(C$3$C\e(B"      "\e$(C;5\e(B")
+   ("\e$(C$3$C$!\e(B"    "\e$(C;6\e(B")
+   ("\e$(C$3$C$$\e(B"    "\e$(C;7\e(B")
+   ("\e$(C$3$C$'\e(B"    "\e$(C;8\e(B")
+   ("\e$(C$3$C$)\e(B"    "\e$(C;9\e(B")
+   ("\e$(C$3$C$1\e(B"    "\e$(C;:\e(B")
+   ("\e$(C$3$C$5\e(B"    "\e$(C;;\e(B")
+   ("\e$(C$3$C$6\e(B"    "\e$(C;<\e(B")
+   ("\e$(C$3$C$7\e(B"    "\e$(C;=\e(B")
+
+   ("\e$(C$3$D\e(B"      "\e$(C;>\e(B")
+   ("\e$(C$3$D$7\e(B"    "\e$(C;?\e(B")
+
+   ("\e$(C$3$E\e(B"      "\e$(C;@\e(B")
+   ("\e$(C$3$E$!\e(B"    "\e$(C;A\e(B")
+   ("\e$(C$3$E$1\e(B"    "\e$(C;B\e(B")
+   ("\e$(C$3$E$2\e(B"    "\e$(C;C\e(B")
+   ("\e$(C$3$E$5\e(B"    "\e$(C;D\e(B")
+   ("\e$(C$3$E$6\e(B"    "\e$(C;E\e(B")
+   ("\e$(C$3$E$7\e(B"    "\e$(C;F\e(B")
+
+   ("\e$(C$3$G\e(B"      "\e$(C;G\e(B")
+   ("\e$(C$3$G$!\e(B"    "\e$(C;H\e(B")
+   ("\e$(C$3$G$$\e(B"    "\e$(C;I\e(B")
+   ("\e$(C$3$G$)\e(B"    "\e$(C;J\e(B")
+   ("\e$(C$3$G$1\e(B"    "\e$(C;K\e(B")
+   ("\e$(C$3$G$2\e(B"    "\e$(C;L\e(B")
+   ("\e$(C$3$G$7\e(B"    "\e$(C;M\e(B")
+
+   ("\e$(C$3$G$S\e(B"    "\e$(C;N\e(B")
+
+   ("\e$(C$3$K\e(B"      "\e$(C;O\e(B")
+   ("\e$(C$3$K$7\e(B"    "\e$(C;P\e(B")
+
+   ("\e$(C$3$L\e(B"      "\e$(C;Q\e(B")
+   ("\e$(C$3$L$!\e(B"    "\e$(C;R\e(B")
+   ("\e$(C$3$L$$\e(B"    "\e$(C;S\e(B")
+   ("\e$(C$3$L$)\e(B"    "\e$(C;T\e(B")
+   ("\e$(C$3$L$1\e(B"    "\e$(C;U\e(B")
+   ("\e$(C$3$L$5\e(B"    "\e$(C;V\e(B")
+   ("\e$(C$3$L$7\e(B"    "\e$(C;W\e(B")
+
+   ("\e$(C$3$P\e(B"      "\e$(C;X\e(B")
+   ("\e$(C$3$P$7\e(B"    "\e$(C;Y\e(B")
+
+   ("\e$(C$3$Q\e(B"      "\e$(C;Z\e(B")
+   ("\e$(C$3$Q$$\e(B"    "\e$(C;[\e(B")
+   ("\e$(C$3$Q$)\e(B"    "\e$(C;\\e(B")
+   ("\e$(C$3$Q$1\e(B"    "\e$(C;]\e(B")
+   ("\e$(C$3$Q$2\e(B"    "\e$(C;^\e(B")
+
+   ("\e$(C$3$S\e(B"      "\e$(C;_\e(B")
+   ("\e$(C$3$S$!\e(B"    "\e$(C;`\e(B")
+   ("\e$(C$3$S$$\e(B"    "\e$(C;a\e(B")
+   ("\e$(C$3$S$)\e(B"    "\e$(C;b\e(B")
+   ("\e$(C$3$S$1\e(B"    "\e$(C;c\e(B")
+   ("\e$(C$3$S$2\e(B"    "\e$(C;d\e(B")
+   ("\e$(C$3$S$5\e(B"    "\e$(C;e\e(B")
+   ("\e$(C$3$S$7\e(B"    "\e$(C;f\e(B")
+
+   ("\e$(C$5$?\e(B"      "\e$(C;g\e(B")
+   ("\e$(C$5$?$!\e(B"    "\e$(C;h\e(B")
+   ("\e$(C$5$?$!$5\e(B"  "\e$(C;i\e(B")
+   ("\e$(C$5$?$$\e(B"    "\e$(C;j\e(B")
+   ("\e$(C$5$?$'\e(B"    "\e$(C;k\e(B")
+   ("\e$(C$5$?$)\e(B"    "\e$(C;l\e(B")
+   ("\e$(C$5$?$)$!\e(B"  "\e$(C;m\e(B")
+   ("\e$(C$5$?$)$1\e(B"  "\e$(C;n\e(B")
+   ("\e$(C$5$?$1\e(B"    "\e$(C;o\e(B")
+   ("\e$(C$5$?$2\e(B"    "\e$(C;p\e(B")
+   ("\e$(C$5$?$5\e(B"    "\e$(C;q\e(B")
+   ("\e$(C$5$?$5$6\e(B"  "\e$(C;r\e(B")
+   ("\e$(C$5$?$7\e(B"    "\e$(C;s\e(B")
+   ("\e$(C$5$?$<\e(B"    "\e$(C;t\e(B")
+
+   ("\e$(C$5$@\e(B"      "\e$(C;u\e(B")
+   ("\e$(C$5$@$!\e(B"    "\e$(C;v\e(B")
+   ("\e$(C$5$@$$\e(B"    "\e$(C;w\e(B")
+   ("\e$(C$5$@$)\e(B"    "\e$(C;x\e(B")
+   ("\e$(C$5$@$1\e(B"    "\e$(C;y\e(B")
+   ("\e$(C$5$@$2\e(B"    "\e$(C;z\e(B")
+   ("\e$(C$5$@$5\e(B"    "\e$(C;{\e(B")
+   ("\e$(C$5$@$6\e(B"    "\e$(C;|\e(B")
+   ("\e$(C$5$@$7\e(B"    "\e$(C;}\e(B")
+
+   ("\e$(C$5$A\e(B"      "\e$(C;~\e(B")
+   ("\e$(C$5$A$!\e(B"    "\e$(C<!\e(B")
+   ("\e$(C$5$A$$\e(B"    "\e$(C<"\e(B")
+   ("\e$(C$5$A$)\e(B"    "\e$(C<#\e(B")
+   ("\e$(C$5$A$1\e(B"    "\e$(C<$\e(B")
+   ("\e$(C$5$A$2\e(B"    "\e$(C<%\e(B")
+   ("\e$(C$5$A$5\e(B"    "\e$(C<&\e(B")
+   ("\e$(C$5$A$7\e(B"    "\e$(C<'\e(B")
+
+   ("\e$(C$5$B\e(B"      "\e$(C<(\e(B")
+   ("\e$(C$5$B$$\e(B"    "\e$(C<)\e(B")
+   ("\e$(C$5$B$)\e(B"    "\e$(C<*\e(B")
+   ("\e$(C$5$B$1\e(B"    "\e$(C<+\e(B")
+   ("\e$(C$5$B$7\e(B"    "\e$(C<,\e(B")
+
+   ("\e$(C$5$C\e(B"      "\e$(C<-\e(B")
+   ("\e$(C$5$C$!\e(B"    "\e$(C<.\e(B")
+   ("\e$(C$5$C$!$5\e(B"  "\e$(C<0\e(B")
+   ("\e$(C$5$C$"\e(B"    "\e$(C</\e(B")
+   ("\e$(C$5$C$$\e(B"    "\e$(C<1\e(B")
+   ("\e$(C$5$C$'\e(B"    "\e$(C<2\e(B")
+   ("\e$(C$5$C$)\e(B"    "\e$(C<3\e(B")
+   ("\e$(C$5$C$)$1\e(B"  "\e$(C<4\e(B")
+   ("\e$(C$5$C$)$2\e(B"  "\e$(C<5\e(B")
+   ("\e$(C$5$C$1\e(B"    "\e$(C<6\e(B")
+   ("\e$(C$5$C$2\e(B"    "\e$(C<7\e(B")
+   ("\e$(C$5$C$5\e(B"    "\e$(C<8\e(B")
+   ("\e$(C$5$C$6\e(B"    "\e$(C<9\e(B")
+   ("\e$(C$5$C$7\e(B"    "\e$(C<:\e(B")
+   ("\e$(C$5$C$=\e(B"    "\e$(C<;\e(B")
+
+   ("\e$(C$5$D\e(B"      "\e$(C<<\e(B")
+   ("\e$(C$5$D$!\e(B"    "\e$(C<=\e(B")
+   ("\e$(C$5$D$$\e(B"    "\e$(C<>\e(B")
+   ("\e$(C$5$D$)\e(B"    "\e$(C<?\e(B")
+   ("\e$(C$5$D$1\e(B"    "\e$(C<@\e(B")
+   ("\e$(C$5$D$2\e(B"    "\e$(C<A\e(B")
+   ("\e$(C$5$D$5\e(B"    "\e$(C<B\e(B")
+   ("\e$(C$5$D$6\e(B"    "\e$(C<C\e(B")
+   ("\e$(C$5$D$7\e(B"    "\e$(C<D\e(B")
+
+   ("\e$(C$5$E\e(B"      "\e$(C<E\e(B")
+   ("\e$(C$5$E$!\e(B"    "\e$(C<F\e(B")
+   ("\e$(C$5$E$$\e(B"    "\e$(C<G\e(B")
+   ("\e$(C$5$E$)\e(B"    "\e$(C<H\e(B")
+   ("\e$(C$5$E$1\e(B"    "\e$(C<I\e(B")
+   ("\e$(C$5$E$2\e(B"    "\e$(C<J\e(B")
+   ("\e$(C$5$E$5\e(B"    "\e$(C<K\e(B")
+   ("\e$(C$5$E$6\e(B"    "\e$(C<L\e(B")
+   ("\e$(C$5$E$7\e(B"    "\e$(C<M\e(B")
+
+   ("\e$(C$5$F\e(B"      "\e$(C<N\e(B")
+   ("\e$(C$5$F$$\e(B"    "\e$(C<O\e(B")
+   ("\e$(C$5$F$)\e(B"    "\e$(C<P\e(B")
+   ("\e$(C$5$F$7\e(B"    "\e$(C<Q\e(B")
+
+   ("\e$(C$5$G\e(B"      "\e$(C<R\e(B")
+   ("\e$(C$5$G$!\e(B"    "\e$(C<S\e(B")
+   ("\e$(C$5$G$"\e(B"    "\e$(C<T\e(B")
+   ("\e$(C$5$G$$\e(B"    "\e$(C<U\e(B")
+   ("\e$(C$5$G$)\e(B"    "\e$(C<V\e(B")
+   ("\e$(C$5$G$)$1\e(B"  "\e$(C<W\e(B")
+   ("\e$(C$5$G$1\e(B"    "\e$(C<X\e(B")
+   ("\e$(C$5$G$2\e(B"    "\e$(C<Y\e(B")
+   ("\e$(C$5$G$5\e(B"    "\e$(C<Z\e(B")
+   ("\e$(C$5$G$7\e(B"    "\e$(C<[\e(B")
+   ("\e$(C$5$G$<\e(B"    "\e$(C<\\e(B")
+
+   ("\e$(C$5$G$?\e(B"    "\e$(C<]\e(B")
+   ("\e$(C$5$G$?$!\e(B"  "\e$(C<^\e(B")
+   ("\e$(C$5$G$?$$\e(B"  "\e$(C<_\e(B")
+   ("\e$(C$5$G$?$)\e(B"  "\e$(C<`\e(B")
+   ("\e$(C$5$G$?$7\e(B"  "\e$(C<a\e(B")
+
+   ("\e$(C$5$G$@\e(B"    "\e$(C<b\e(B")
+   ("\e$(C$5$G$@$$\e(B"  "\e$(C<c\e(B")
+   ("\e$(C$5$G$@$)\e(B"  "\e$(C<d\e(B")
+   ("\e$(C$5$G$@$1\e(B"  "\e$(C<e\e(B")
+   ("\e$(C$5$G$@$5\e(B"  "\e$(C<f\e(B")
+   ("\e$(C$5$G$@$6\e(B"  "\e$(C<g\e(B")
+
+   ("\e$(C$5$G$S\e(B"    "\e$(C<h\e(B")
+   ("\e$(C$5$G$S$$\e(B"  "\e$(C<i\e(B")
+   ("\e$(C$5$G$S$)\e(B"  "\e$(C<j\e(B")
+   ("\e$(C$5$G$S$1\e(B"  "\e$(C<k\e(B")
+   ("\e$(C$5$G$S$2\e(B"  "\e$(C<l\e(B")
+   ("\e$(C$5$G$S$5\e(B"  "\e$(C<m\e(B")
+
+   ("\e$(C$5$K\e(B"      "\e$(C<n\e(B")
+   ("\e$(C$5$K$!\e(B"    "\e$(C<o\e(B")
+   ("\e$(C$5$K$$\e(B"    "\e$(C<p\e(B")
+   ("\e$(C$5$K$)\e(B"    "\e$(C<q\e(B")
+   ("\e$(C$5$K$1\e(B"    "\e$(C<r\e(B")
+   ("\e$(C$5$K$2\e(B"    "\e$(C<s\e(B")
+   ("\e$(C$5$K$5\e(B"    "\e$(C<t\e(B")
+   ("\e$(C$5$K$7\e(B"    "\e$(C<u\e(B")
+
+   ("\e$(C$5$L\e(B"      "\e$(C<v\e(B")
+   ("\e$(C$5$L$!\e(B"    "\e$(C<w\e(B")
+   ("\e$(C$5$L$$\e(B"    "\e$(C<x\e(B")
+   ("\e$(C$5$L$'\e(B"    "\e$(C<y\e(B")
+   ("\e$(C$5$L$)\e(B"    "\e$(C<z\e(B")
+   ("\e$(C$5$L$1\e(B"    "\e$(C<{\e(B")
+   ("\e$(C$5$L$2\e(B"    "\e$(C<|\e(B")
+   ("\e$(C$5$L$5\e(B"    "\e$(C<}\e(B")
+   ("\e$(C$5$L$7\e(B"    "\e$(C<~\e(B")
+   ("\e$(C$5$L$:\e(B"    "\e$(C=!\e(B")
+   ("\e$(C$5$L$<\e(B"    "\e$(C="\e(B")
+   ("\e$(C$5$L$=\e(B"    "\e$(C=#\e(B")
+
+   ("\e$(C$5$L$C\e(B"    "\e$(C=$\e(B")
+   ("\e$(C$5$L$C$6\e(B"  "\e$(C=%\e(B")
+
+   ("\e$(C$5$L$D\e(B"    "\e$(C=&\e(B")
+   ("\e$(C$5$L$D$!\e(B"  "\e$(C='\e(B")
+   ("\e$(C$5$L$D$$\e(B"  "\e$(C=(\e(B")
+   ("\e$(C$5$L$D$)\e(B"  "\e$(C=)\e(B")
+   ("\e$(C$5$L$D$1\e(B"  "\e$(C=*\e(B")
+   ("\e$(C$5$L$D$7\e(B"  "\e$(C=+\e(B")
+
+   ("\e$(C$5$L$S\e(B"    "\e$(C=,\e(B")
+   ("\e$(C$5$L$S$!\e(B"  "\e$(C=-\e(B")
+   ("\e$(C$5$L$S$$\e(B"  "\e$(C=.\e(B")
+   ("\e$(C$5$L$S$)\e(B"  "\e$(C=/\e(B")
+   ("\e$(C$5$L$S$1\e(B"  "\e$(C=0\e(B")
+   ("\e$(C$5$L$S$2\e(B"  "\e$(C=1\e(B")
+   ("\e$(C$5$L$S$5\e(B"  "\e$(C=2\e(B")
+   ("\e$(C$5$L$S$7\e(B"  "\e$(C=3\e(B")
+
+   ("\e$(C$5$P\e(B"      "\e$(C=4\e(B")
+   ("\e$(C$5$P$!\e(B"    "\e$(C=5\e(B")
+   ("\e$(C$5$P$)\e(B"    "\e$(C=6\e(B")
+   ("\e$(C$5$P$1\e(B"    "\e$(C=7\e(B")
+   ("\e$(C$5$P$5\e(B"    "\e$(C=8\e(B")
+   ("\e$(C$5$P$7\e(B"    "\e$(C=9\e(B")
+
+   ("\e$(C$5$Q\e(B"      "\e$(C=:\e(B")
+   ("\e$(C$5$Q$!\e(B"    "\e$(C=;\e(B")
+   ("\e$(C$5$Q$$\e(B"    "\e$(C=<\e(B")
+   ("\e$(C$5$Q$)\e(B"    "\e$(C==\e(B")
+   ("\e$(C$5$Q$)$!\e(B"  "\e$(C=>\e(B")
+   ("\e$(C$5$Q$1\e(B"    "\e$(C=?\e(B")
+   ("\e$(C$5$Q$2\e(B"    "\e$(C=@\e(B")
+   ("\e$(C$5$Q$5\e(B"    "\e$(C=A\e(B")
+   ("\e$(C$5$Q$7\e(B"    "\e$(C=B\e(B")
+
+   ("\e$(C$5$S\e(B"      "\e$(C=C\e(B")
+   ("\e$(C$5$S$!\e(B"    "\e$(C=D\e(B")
+   ("\e$(C$5$S$$\e(B"    "\e$(C=E\e(B")
+   ("\e$(C$5$S$'\e(B"    "\e$(C=F\e(B")
+   ("\e$(C$5$S$)\e(B"    "\e$(C=G\e(B")
+   ("\e$(C$5$S$)$>\e(B"  "\e$(C=H\e(B")
+   ("\e$(C$5$S$1\e(B"    "\e$(C=I\e(B")
+   ("\e$(C$5$S$2\e(B"    "\e$(C=J\e(B")
+   ("\e$(C$5$S$5\e(B"    "\e$(C=K\e(B")
+   ("\e$(C$5$S$7\e(B"    "\e$(C=L\e(B")
+   ("\e$(C$5$S$=\e(B"    "\e$(C=M\e(B")
+
+   ("\e$(C$6$?\e(B"      "\e$(C=N\e(B")
+   ("\e$(C$6$?$!\e(B"    "\e$(C=O\e(B")
+   ("\e$(C$6$?$!$5\e(B"  "\e$(C=P\e(B")
+   ("\e$(C$6$?$$\e(B"    "\e$(C=Q\e(B")
+   ("\e$(C$6$?$)\e(B"    "\e$(C=R\e(B")
+   ("\e$(C$6$?$1\e(B"    "\e$(C=S\e(B")
+   ("\e$(C$6$?$2\e(B"    "\e$(C=T\e(B")
+   ("\e$(C$6$?$6\e(B"    "\e$(C=U\e(B")
+   ("\e$(C$6$?$7\e(B"    "\e$(C=V\e(B")
+   ("\e$(C$6$?$>\e(B"    "\e$(C=W\e(B")
+
+   ("\e$(C$6$@\e(B"      "\e$(C=X\e(B")
+   ("\e$(C$6$@$!\e(B"    "\e$(C=Y\e(B")
+   ("\e$(C$6$@$$\e(B"    "\e$(C=Z\e(B")
+   ("\e$(C$6$@$)\e(B"    "\e$(C=[\e(B")
+   ("\e$(C$6$@$1\e(B"    "\e$(C=\\e(B")
+   ("\e$(C$6$@$2\e(B"    "\e$(C=]\e(B")
+   ("\e$(C$6$@$6\e(B"    "\e$(C=^\e(B")
+   ("\e$(C$6$@$7\e(B"    "\e$(C=_\e(B")
+
+   ("\e$(C$6$A$7\e(B"    "\e$(C=`\e(B")
+
+   ("\e$(C$6$C\e(B"      "\e$(C=a\e(B")
+   ("\e$(C$6$C$!\e(B"    "\e$(C=b\e(B")
+   ("\e$(C$6$C$$\e(B"    "\e$(C=c\e(B")
+   ("\e$(C$6$C$)\e(B"    "\e$(C=d\e(B")
+   ("\e$(C$6$C$)$2\e(B"  "\e$(C=e\e(B")
+   ("\e$(C$6$C$1\e(B"    "\e$(C=f\e(B")
+   ("\e$(C$6$C$2\e(B"    "\e$(C=g\e(B")
+   ("\e$(C$6$C$6\e(B"    "\e$(C=h\e(B")
+   ("\e$(C$6$C$7\e(B"    "\e$(C=i\e(B")
+
+   ("\e$(C$6$D\e(B"      "\e$(C=j\e(B")
+   ("\e$(C$6$D$$\e(B"    "\e$(C=k\e(B")
+   ("\e$(C$6$D$)\e(B"    "\e$(C=l\e(B")
+
+   ("\e$(C$6$F$$\e(B"    "\e$(C=m\e(B")
+
+   ("\e$(C$6$G\e(B"      "\e$(C=n\e(B")
+   ("\e$(C$6$G$!\e(B"    "\e$(C=o\e(B")
+   ("\e$(C$6$G$$\e(B"    "\e$(C=p\e(B")
+   ("\e$(C$6$G$'\e(B"    "\e$(C=q\e(B")
+   ("\e$(C$6$G$)\e(B"    "\e$(C=r\e(B")
+   ("\e$(C$6$G$)$1\e(B"  "\e$(C=s\e(B")
+   ("\e$(C$6$G$1\e(B"    "\e$(C=t\e(B")
+   ("\e$(C$6$G$2\e(B"    "\e$(C=u\e(B")
+   ("\e$(C$6$G$7\e(B"    "\e$(C=v\e(B")
+
+   ("\e$(C$6$G$?\e(B"    "\e$(C=w\e(B")
+   ("\e$(C$6$G$?$!\e(B"  "\e$(C=x\e(B")
+   ("\e$(C$6$G$?$$\e(B"  "\e$(C=y\e(B")
+   ("\e$(C$6$G$?$6\e(B"  "\e$(C=z\e(B")
+
+   ("\e$(C$6$G$@\e(B"    "\e$(C={\e(B")
+   ("\e$(C$6$G$@$6\e(B"  "\e$(C=|\e(B")
+
+   ("\e$(C$6$G$S\e(B"    "\e$(C=}\e(B")
+   ("\e$(C$6$G$S$$\e(B"  "\e$(C=~\e(B")
+   ("\e$(C$6$G$S$)\e(B"  "\e$(C>!\e(B")
+   ("\e$(C$6$G$S$1\e(B"  "\e$(C>"\e(B")
+   ("\e$(C$6$G$S$2\e(B"  "\e$(C>#\e(B")
+
+   ("\e$(C$6$K\e(B"      "\e$(C>$\e(B")
+
+   ("\e$(C$6$L\e(B"      "\e$(C>%\e(B")
+   ("\e$(C$6$L$!\e(B"    "\e$(C>&\e(B")
+   ("\e$(C$6$L$$\e(B"    "\e$(C>'\e(B")
+   ("\e$(C$6$L$)\e(B"    "\e$(C>(\e(B")
+   ("\e$(C$6$L$1\e(B"    "\e$(C>)\e(B")
+   ("\e$(C$6$L$2\e(B"    "\e$(C>*\e(B")
+   ("\e$(C$6$L$7\e(B"    "\e$(C>+\e(B")
+
+   ("\e$(C$6$L$C\e(B"    "\e$(C>,\e(B")
+   ("\e$(C$6$L$C$6\e(B"  "\e$(C>-\e(B")
+
+   ("\e$(C$6$L$D\e(B"    "\e$(C>.\e(B")
+
+   ("\e$(C$6$L$S\e(B"    "\e$(C>/\e(B")
+   ("\e$(C$6$L$S$$\e(B"  "\e$(C>0\e(B")
+
+   ("\e$(C$6$P$7\e(B"    "\e$(C>1\e(B")
+
+   ("\e$(C$6$Q\e(B"      "\e$(C>2\e(B")
+   ("\e$(C$6$Q$!\e(B"    "\e$(C>3\e(B")
+   ("\e$(C$6$Q$$\e(B"    "\e$(C>4\e(B")
+   ("\e$(C$6$Q$)\e(B"    "\e$(C>5\e(B")
+   ("\e$(C$6$Q$)$1\e(B"  "\e$(C>6\e(B")
+   ("\e$(C$6$Q$)$>\e(B"  "\e$(C>7\e(B")
+   ("\e$(C$6$Q$1\e(B"    "\e$(C>8\e(B")
+   ("\e$(C$6$Q$2\e(B"    "\e$(C>9\e(B")
+
+   ("\e$(C$6$Q$S\e(B"    "\e$(C>:\e(B")
+   ("\e$(C$6$Q$S$$\e(B"  "\e$(C>;\e(B")
+   ("\e$(C$6$Q$S$)\e(B"  "\e$(C><\e(B")
+   ("\e$(C$6$Q$S$1\e(B"  "\e$(C>=\e(B")
+
+   ("\e$(C$6$S\e(B"      "\e$(C>>\e(B")
+   ("\e$(C$6$S$!\e(B"    "\e$(C>?\e(B")
+   ("\e$(C$6$S$$\e(B"    "\e$(C>@\e(B")
+   ("\e$(C$6$S$)\e(B"    "\e$(C>A\e(B")
+   ("\e$(C$6$S$1\e(B"    "\e$(C>B\e(B")
+   ("\e$(C$6$S$2\e(B"    "\e$(C>C\e(B")
+   ("\e$(C$6$S$5\e(B"    "\e$(C>D\e(B")
+   ("\e$(C$6$S$7\e(B"    "\e$(C>E\e(B")
+
+   ("\e$(C$7$?\e(B"      "\e$(C>F\e(B")
+   ("\e$(C$7$?$!\e(B"    "\e$(C>G\e(B")
+   ("\e$(C$7$?$$\e(B"    "\e$(C>H\e(B")
+   ("\e$(C$7$?$$$8\e(B"  "\e$(C>I\e(B")
+   ("\e$(C$7$?$$$>\e(B"  "\e$(C>J\e(B")
+   ("\e$(C$7$?$)\e(B"    "\e$(C>K\e(B")
+   ("\e$(C$7$?$)$!\e(B"  "\e$(C>L\e(B")
+   ("\e$(C$7$?$)$1\e(B"  "\e$(C>M\e(B")
+   ("\e$(C$7$?$)$>\e(B"  "\e$(C>N\e(B")
+   ("\e$(C$7$?$1\e(B"    "\e$(C>O\e(B")
+   ("\e$(C$7$?$2\e(B"    "\e$(C>P\e(B")
+   ("\e$(C$7$?$5\e(B"    "\e$(C>Q\e(B")
+   ("\e$(C$7$?$6\e(B"    "\e$(C>R\e(B")
+   ("\e$(C$7$?$7\e(B"    "\e$(C>S\e(B")
+   ("\e$(C$7$?$<\e(B"    "\e$(C>T\e(B")
+   ("\e$(C$7$?$=\e(B"    "\e$(C>U\e(B")
+
+   ("\e$(C$7$@\e(B"      "\e$(C>V\e(B")
+   ("\e$(C$7$@$!\e(B"    "\e$(C>W\e(B")
+   ("\e$(C$7$@$$\e(B"    "\e$(C>X\e(B")
+   ("\e$(C$7$@$)\e(B"    "\e$(C>Y\e(B")
+   ("\e$(C$7$@$1\e(B"    "\e$(C>Z\e(B")
+   ("\e$(C$7$@$2\e(B"    "\e$(C>[\e(B")
+   ("\e$(C$7$@$5\e(B"    "\e$(C>\\e(B")
+   ("\e$(C$7$@$6\e(B"    "\e$(C>]\e(B")
+   ("\e$(C$7$@$7\e(B"    "\e$(C>^\e(B")
+
+   ("\e$(C$7$A\e(B"      "\e$(C>_\e(B")
+   ("\e$(C$7$A$!\e(B"    "\e$(C>`\e(B")
+   ("\e$(C$7$A$$\e(B"    "\e$(C>a\e(B")
+   ("\e$(C$7$A$)\e(B"    "\e$(C>b\e(B")
+   ("\e$(C$7$A$)$2\e(B"  "\e$(C>c\e(B")
+   ("\e$(C$7$A$1\e(B"    "\e$(C>d\e(B")
+   ("\e$(C$7$A$2\e(B"    "\e$(C>e\e(B")
+   ("\e$(C$7$A$5\e(B"    "\e$(C>f\e(B")
+   ("\e$(C$7$A$7\e(B"    "\e$(C>g\e(B")
+   ("\e$(C$7$A$<\e(B"    "\e$(C>h\e(B")
+   ("\e$(C$7$A$>\e(B"    "\e$(C>i\e(B")
+
+   ("\e$(C$7$B\e(B"      "\e$(C>j\e(B")
+   ("\e$(C$7$B$$\e(B"    "\e$(C>k\e(B")
+   ("\e$(C$7$B$)\e(B"    "\e$(C>l\e(B")
+   ("\e$(C$7$B$2\e(B"    "\e$(C>m\e(B")
+
+   ("\e$(C$7$C\e(B"      "\e$(C>n\e(B")
+   ("\e$(C$7$C$!\e(B"    "\e$(C>o\e(B")
+   ("\e$(C$7$C$$\e(B"    "\e$(C>p\e(B")
+   ("\e$(C$7$C$$$8\e(B"  "\e$(C>q\e(B")
+   ("\e$(C$7$C$'\e(B"    "\e$(C>r\e(B")
+   ("\e$(C$7$C$)\e(B"    "\e$(C>s\e(B")
+   ("\e$(C$7$C$)$!\e(B"  "\e$(C>t\e(B")
+   ("\e$(C$7$C$)$1\e(B"  "\e$(C>u\e(B")
+   ("\e$(C$7$C$1\e(B"    "\e$(C>v\e(B")
+   ("\e$(C$7$C$2\e(B"    "\e$(C>w\e(B")
+   ("\e$(C$7$C$2$5\e(B"  "\e$(C>x\e(B")
+   ("\e$(C$7$C$5\e(B"    "\e$(C>y\e(B")
+   ("\e$(C$7$C$6\e(B"    "\e$(C>z\e(B")
+   ("\e$(C$7$C$7\e(B"    "\e$(C>{\e(B")
+   ("\e$(C$7$C$8\e(B"    "\e$(C>|\e(B")
+   ("\e$(C$7$C$;\e(B"    "\e$(C>}\e(B")
+   ("\e$(C$7$C$=\e(B"    "\e$(C>~\e(B")
+
+   ("\e$(C$7$D\e(B"      "\e$(C?!\e(B")
+   ("\e$(C$7$D$!\e(B"    "\e$(C?"\e(B")
+   ("\e$(C$7$D$$\e(B"    "\e$(C?#\e(B")
+   ("\e$(C$7$D$)\e(B"    "\e$(C?$\e(B")
+   ("\e$(C$7$D$1\e(B"    "\e$(C?%\e(B")
+   ("\e$(C$7$D$2\e(B"    "\e$(C?&\e(B")
+   ("\e$(C$7$D$5\e(B"    "\e$(C?'\e(B")
+   ("\e$(C$7$D$7\e(B"    "\e$(C?(\e(B")
+
+   ("\e$(C$7$E\e(B"      "\e$(C?)\e(B")
+   ("\e$(C$7$E$!\e(B"    "\e$(C?*\e(B")
+   ("\e$(C$7$E$"\e(B"    "\e$(C?+\e(B")
+   ("\e$(C$7$E$$\e(B"    "\e$(C?,\e(B")
+   ("\e$(C$7$E$)\e(B"    "\e$(C?-\e(B")
+   ("\e$(C$7$E$)$1\e(B"  "\e$(C?.\e(B")
+   ("\e$(C$7$E$)$2\e(B"  "\e$(C?/\e(B")
+   ("\e$(C$7$E$1\e(B"    "\e$(C?0\e(B")
+   ("\e$(C$7$E$2\e(B"    "\e$(C?1\e(B")
+   ("\e$(C$7$E$2$5\e(B"  "\e$(C?2\e(B")
+   ("\e$(C$7$E$5\e(B"    "\e$(C?3\e(B")
+   ("\e$(C$7$E$6\e(B"    "\e$(C?4\e(B")
+   ("\e$(C$7$E$7\e(B"    "\e$(C?5\e(B")
+   ("\e$(C$7$E$<\e(B"    "\e$(C?6\e(B")
+   ("\e$(C$7$E$=\e(B"    "\e$(C?7\e(B")
+   ("\e$(C$7$E$>\e(B"    "\e$(C?8\e(B")
+
+   ("\e$(C$7$F\e(B"      "\e$(C?9\e(B")
+   ("\e$(C$7$F$$\e(B"    "\e$(C?:\e(B")
+   ("\e$(C$7$F$)\e(B"    "\e$(C?;\e(B")
+   ("\e$(C$7$F$1\e(B"    "\e$(C?<\e(B")
+   ("\e$(C$7$F$2\e(B"    "\e$(C?=\e(B")
+   ("\e$(C$7$F$5\e(B"    "\e$(C?>\e(B")
+   ("\e$(C$7$F$6\e(B"    "\e$(C??\e(B")
+
+   ("\e$(C$7$G\e(B"      "\e$(C?@\e(B")
+   ("\e$(C$7$G$!\e(B"    "\e$(C?A\e(B")
+   ("\e$(C$7$G$$\e(B"    "\e$(C?B\e(B")
+   ("\e$(C$7$G$)\e(B"    "\e$(C?C\e(B")
+   ("\e$(C$7$G$)$!\e(B"  "\e$(C?D\e(B")
+   ("\e$(C$7$G$)$1\e(B"  "\e$(C?E\e(B")
+   ("\e$(C$7$G$)$5\e(B"  "\e$(C?F\e(B")
+   ("\e$(C$7$G$)$>\e(B"  "\e$(C?G\e(B")
+   ("\e$(C$7$G$1\e(B"    "\e$(C?H\e(B")
+   ("\e$(C$7$G$2\e(B"    "\e$(C?I\e(B")
+   ("\e$(C$7$G$5\e(B"    "\e$(C?J\e(B")
+   ("\e$(C$7$G$7\e(B"    "\e$(C?K\e(B")
+   ("\e$(C$7$G$:\e(B"    "\e$(C?L\e(B")
+
+   ("\e$(C$7$G$?\e(B"    "\e$(C?M\e(B")
+   ("\e$(C$7$G$?$!\e(B"  "\e$(C?N\e(B")
+   ("\e$(C$7$G$?$$\e(B"  "\e$(C?O\e(B")
+   ("\e$(C$7$G$?$)\e(B"  "\e$(C?P\e(B")
+   ("\e$(C$7$G$?$1\e(B"  "\e$(C?Q\e(B")
+   ("\e$(C$7$G$?$2\e(B"  "\e$(C?R\e(B")
+   ("\e$(C$7$G$?$5\e(B"  "\e$(C?S\e(B")
+   ("\e$(C$7$G$?$6\e(B"  "\e$(C?T\e(B")
+   ("\e$(C$7$G$?$7\e(B"  "\e$(C?U\e(B")
+
+   ("\e$(C$7$G$@\e(B"    "\e$(C?V\e(B")
+   ("\e$(C$7$G$@$!\e(B"  "\e$(C?W\e(B")
+   ("\e$(C$7$G$@$$\e(B"  "\e$(C?X\e(B")
+   ("\e$(C$7$G$@$1\e(B"  "\e$(C?Y\e(B")
+   ("\e$(C$7$G$@$5\e(B"  "\e$(C?Z\e(B")
+   ("\e$(C$7$G$@$7\e(B"  "\e$(C?[\e(B")
+
+   ("\e$(C$7$G$S\e(B"    "\e$(C?\\e(B")
+   ("\e$(C$7$G$S$!\e(B"  "\e$(C?]\e(B")
+   ("\e$(C$7$G$S$$\e(B"  "\e$(C?^\e(B")
+   ("\e$(C$7$G$S$)\e(B"  "\e$(C?_\e(B")
+   ("\e$(C$7$G$S$1\e(B"  "\e$(C?`\e(B")
+   ("\e$(C$7$G$S$2\e(B"  "\e$(C?a\e(B")
+   ("\e$(C$7$G$S$5\e(B"  "\e$(C?b\e(B")
+   ("\e$(C$7$G$S$7\e(B"  "\e$(C?c\e(B")
+
+   ("\e$(C$7$K\e(B"      "\e$(C?d\e(B")
+   ("\e$(C$7$K$!\e(B"    "\e$(C?e\e(B")
+   ("\e$(C$7$K$$\e(B"    "\e$(C?f\e(B")
+   ("\e$(C$7$K$)\e(B"    "\e$(C?g\e(B")
+   ("\e$(C$7$K$1\e(B"    "\e$(C?h\e(B")
+   ("\e$(C$7$K$2\e(B"    "\e$(C?i\e(B")
+   ("\e$(C$7$K$5\e(B"    "\e$(C?j\e(B")
+   ("\e$(C$7$K$7\e(B"    "\e$(C?k\e(B")
+
+   ("\e$(C$7$L\e(B"      "\e$(C?l\e(B")
+   ("\e$(C$7$L$!\e(B"    "\e$(C?m\e(B")
+   ("\e$(C$7$L$$\e(B"    "\e$(C?n\e(B")
+   ("\e$(C$7$L$)\e(B"    "\e$(C?o\e(B")
+   ("\e$(C$7$L$)$!\e(B"  "\e$(C?p\e(B")
+   ("\e$(C$7$L$)$1\e(B"  "\e$(C?q\e(B")
+   ("\e$(C$7$L$1\e(B"    "\e$(C?r\e(B")
+   ("\e$(C$7$L$2\e(B"    "\e$(C?s\e(B")
+   ("\e$(C$7$L$5\e(B"    "\e$(C?t\e(B")
+   ("\e$(C$7$L$7\e(B"    "\e$(C?u\e(B")
+
+   ("\e$(C$7$L$C\e(B"    "\e$(C?v\e(B")
+   ("\e$(C$7$L$C$!\e(B"  "\e$(C?w\e(B")
+   ("\e$(C$7$L$C$$\e(B"  "\e$(C?x\e(B")
+   ("\e$(C$7$L$C$)\e(B"  "\e$(C?y\e(B")
+   ("\e$(C$7$L$C$1\e(B"  "\e$(C?z\e(B")
+   ("\e$(C$7$L$C$2\e(B"  "\e$(C?{\e(B")
+   ("\e$(C$7$L$C$6\e(B"  "\e$(C?|\e(B")
+   ("\e$(C$7$L$C$7\e(B"  "\e$(C?}\e(B")
+
+   ("\e$(C$7$L$D\e(B"    "\e$(C?~\e(B")
+   ("\e$(C$7$L$D$!\e(B"  "\e$(C@!\e(B")
+   ("\e$(C$7$L$D$$\e(B"  "\e$(C@"\e(B")
+   ("\e$(C$7$L$D$)\e(B"  "\e$(C@#\e(B")
+   ("\e$(C$7$L$D$1\e(B"  "\e$(C@$\e(B")
+   ("\e$(C$7$L$D$2\e(B"  "\e$(C@%\e(B")
+   ("\e$(C$7$L$D$7\e(B"  "\e$(C@&\e(B")
+
+   ("\e$(C$7$L$S\e(B"    "\e$(C@'\e(B")
+   ("\e$(C$7$L$S$!\e(B"  "\e$(C@(\e(B")
+   ("\e$(C$7$L$S$$\e(B"  "\e$(C@)\e(B")
+   ("\e$(C$7$L$S$)\e(B"  "\e$(C@*\e(B")
+   ("\e$(C$7$L$S$1\e(B"  "\e$(C@+\e(B")
+   ("\e$(C$7$L$S$2\e(B"  "\e$(C@,\e(B")
+   ("\e$(C$7$L$S$5\e(B"  "\e$(C@-\e(B")
+   ("\e$(C$7$L$S$7\e(B"  "\e$(C@.\e(B")
+
+   ("\e$(C$7$P\e(B"      "\e$(C@/\e(B")
+   ("\e$(C$7$P$!\e(B"    "\e$(C@0\e(B")
+   ("\e$(C$7$P$$\e(B"    "\e$(C@1\e(B")
+   ("\e$(C$7$P$)\e(B"    "\e$(C@2\e(B")
+   ("\e$(C$7$P$1\e(B"    "\e$(C@3\e(B")
+   ("\e$(C$7$P$2\e(B"    "\e$(C@4\e(B")
+   ("\e$(C$7$P$5\e(B"    "\e$(C@5\e(B")
+   ("\e$(C$7$P$7\e(B"    "\e$(C@6\e(B")
+   ("\e$(C$7$P$:\e(B"    "\e$(C@7\e(B")
+
+   ("\e$(C$7$Q\e(B"      "\e$(C@8\e(B")
+   ("\e$(C$7$Q$!\e(B"    "\e$(C@9\e(B")
+   ("\e$(C$7$Q$$\e(B"    "\e$(C@:\e(B")
+   ("\e$(C$7$Q$)\e(B"    "\e$(C@;\e(B")
+   ("\e$(C$7$Q$)$=\e(B"  "\e$(C@<\e(B")
+   ("\e$(C$7$Q$1\e(B"    "\e$(C@=\e(B")
+   ("\e$(C$7$Q$2\e(B"    "\e$(C@>\e(B")
+   ("\e$(C$7$Q$5\e(B"    "\e$(C@?\e(B")
+   ("\e$(C$7$Q$7\e(B"    "\e$(C@@\e(B")
+   ("\e$(C$7$Q$8\e(B"    "\e$(C@A\e(B")
+   ("\e$(C$7$Q$:\e(B"    "\e$(C@B\e(B")
+   ("\e$(C$7$Q$;\e(B"    "\e$(C@C\e(B")
+   ("\e$(C$7$Q$<\e(B"    "\e$(C@D\e(B")
+   ("\e$(C$7$Q$=\e(B"    "\e$(C@E\e(B")
+   ("\e$(C$7$Q$>\e(B"    "\e$(C@F\e(B")
+
+   ("\e$(C$7$Q$S\e(B"    "\e$(C@G\e(B")
+   ("\e$(C$7$Q$S$$\e(B"  "\e$(C@H\e(B")
+   ("\e$(C$7$Q$S$)\e(B"  "\e$(C@I\e(B")
+   ("\e$(C$7$Q$S$1\e(B"  "\e$(C@J\e(B")
+   ("\e$(C$7$Q$S$5\e(B"  "\e$(C@K\e(B")
+
+   ("\e$(C$7$S\e(B"      "\e$(C@L\e(B")
+   ("\e$(C$7$S$!\e(B"    "\e$(C@M\e(B")
+   ("\e$(C$7$S$$\e(B"    "\e$(C@N\e(B")
+   ("\e$(C$7$S$)\e(B"    "\e$(C@O\e(B")
+   ("\e$(C$7$S$)$!\e(B"  "\e$(C@P\e(B")
+   ("\e$(C$7$S$)$1\e(B"  "\e$(C@Q\e(B")
+   ("\e$(C$7$S$)$>\e(B"  "\e$(C@R\e(B")
+   ("\e$(C$7$S$1\e(B"    "\e$(C@S\e(B")
+   ("\e$(C$7$S$2\e(B"    "\e$(C@T\e(B")
+   ("\e$(C$7$S$5\e(B"    "\e$(C@U\e(B")
+   ("\e$(C$7$S$6\e(B"    "\e$(C@V\e(B")
+   ("\e$(C$7$S$7\e(B"    "\e$(C@W\e(B")
+   ("\e$(C$7$S$8\e(B"    "\e$(C@X\e(B")
+   ("\e$(C$7$S$=\e(B"    "\e$(C@Y\e(B")
+
+   ("\e$(C$8$?\e(B"      "\e$(C@Z\e(B")
+   ("\e$(C$8$?$!\e(B"    "\e$(C@[\e(B")
+   ("\e$(C$8$?$$\e(B"    "\e$(C@\\e(B")
+   ("\e$(C$8$?$$$>\e(B"  "\e$(C@]\e(B")
+   ("\e$(C$8$?$'\e(B"    "\e$(C@^\e(B")
+   ("\e$(C$8$?$)\e(B"    "\e$(C@_\e(B")
+   ("\e$(C$8$?$)$1\e(B"  "\e$(C@`\e(B")
+   ("\e$(C$8$?$1\e(B"    "\e$(C@a\e(B")
+   ("\e$(C$8$?$2\e(B"    "\e$(C@b\e(B")
+   ("\e$(C$8$?$5\e(B"    "\e$(C@c\e(B")
+   ("\e$(C$8$?$6\e(B"    "\e$(C@d\e(B")
+   ("\e$(C$8$?$7\e(B"    "\e$(C@e\e(B")
+   ("\e$(C$8$?$8\e(B"    "\e$(C@f\e(B")
+
+   ("\e$(C$8$@\e(B"      "\e$(C@g\e(B")
+   ("\e$(C$8$@$!\e(B"    "\e$(C@h\e(B")
+   ("\e$(C$8$@$$\e(B"    "\e$(C@i\e(B")
+   ("\e$(C$8$@$)\e(B"    "\e$(C@j\e(B")
+   ("\e$(C$8$@$1\e(B"    "\e$(C@k\e(B")
+   ("\e$(C$8$@$2\e(B"    "\e$(C@l\e(B")
+   ("\e$(C$8$@$5\e(B"    "\e$(C@m\e(B")
+   ("\e$(C$8$@$6\e(B"    "\e$(C@n\e(B")
+   ("\e$(C$8$@$7\e(B"    "\e$(C@o\e(B")
+
+   ("\e$(C$8$A\e(B"      "\e$(C@p\e(B")
+   ("\e$(C$8$A$!\e(B"    "\e$(C@q\e(B")
+   ("\e$(C$8$A$$\e(B"    "\e$(C@r\e(B")
+   ("\e$(C$8$A$$$>\e(B"  "\e$(C@s\e(B")
+   ("\e$(C$8$A$)\e(B"    "\e$(C@t\e(B")
+   ("\e$(C$8$A$1\e(B"    "\e$(C@u\e(B")
+   ("\e$(C$8$A$7\e(B"    "\e$(C@v\e(B")
+
+   ("\e$(C$8$B\e(B"      "\e$(C@w\e(B")
+   ("\e$(C$8$B$$\e(B"    "\e$(C@x\e(B")
+   ("\e$(C$8$B$)\e(B"    "\e$(C@y\e(B")
+
+   ("\e$(C$8$C\e(B"      "\e$(C@z\e(B")
+   ("\e$(C$8$C$!\e(B"    "\e$(C@{\e(B")
+   ("\e$(C$8$C$$\e(B"    "\e$(C@|\e(B")
+   ("\e$(C$8$C$)\e(B"    "\e$(C@}\e(B")
+   ("\e$(C$8$C$)$1\e(B"  "\e$(C@~\e(B")
+   ("\e$(C$8$C$1\e(B"    "\e$(CA!\e(B")
+   ("\e$(C$8$C$2\e(B"    "\e$(CA"\e(B")
+   ("\e$(C$8$C$5\e(B"    "\e$(CA#\e(B")
+   ("\e$(C$8$C$7\e(B"    "\e$(CA$\e(B")
+   ("\e$(C$8$C$8\e(B"    "\e$(CA%\e(B")
+
+   ("\e$(C$8$D\e(B"      "\e$(CA&\e(B")
+   ("\e$(C$8$D$!\e(B"    "\e$(CA'\e(B")
+   ("\e$(C$8$D$$\e(B"    "\e$(CA(\e(B")
+   ("\e$(C$8$D$)\e(B"    "\e$(CA)\e(B")
+   ("\e$(C$8$D$1\e(B"    "\e$(CA*\e(B")
+   ("\e$(C$8$D$2\e(B"    "\e$(CA+\e(B")
+   ("\e$(C$8$D$5\e(B"    "\e$(CA,\e(B")
+   ("\e$(C$8$D$7\e(B"    "\e$(CA-\e(B")
+
+   ("\e$(C$8$E\e(B"      "\e$(CA.\e(B")
+   ("\e$(C$8$E$$\e(B"    "\e$(CA/\e(B")
+   ("\e$(C$8$E$)\e(B"    "\e$(CA0\e(B")
+   ("\e$(C$8$E$1\e(B"    "\e$(CA1\e(B")
+   ("\e$(C$8$E$2\e(B"    "\e$(CA2\e(B")
+   ("\e$(C$8$E$6\e(B"    "\e$(CA3\e(B")
+   ("\e$(C$8$E$7\e(B"    "\e$(CA4\e(B")
+
+   ("\e$(C$8$F\e(B"      "\e$(CA5\e(B")
+
+   ("\e$(C$8$G\e(B"      "\e$(CA6\e(B")
+   ("\e$(C$8$G$!\e(B"    "\e$(CA7\e(B")
+   ("\e$(C$8$G$$\e(B"    "\e$(CA8\e(B")
+   ("\e$(C$8$G$)\e(B"    "\e$(CA9\e(B")
+   ("\e$(C$8$G$)$1\e(B"  "\e$(CA:\e(B")
+   ("\e$(C$8$G$1\e(B"    "\e$(CA;\e(B")
+   ("\e$(C$8$G$2\e(B"    "\e$(CA<\e(B")
+   ("\e$(C$8$G$5\e(B"    "\e$(CA=\e(B")
+   ("\e$(C$8$G$7\e(B"    "\e$(CA>\e(B")
+   ("\e$(C$8$G$8\e(B"    "\e$(CA?\e(B")
+   ("\e$(C$8$G$:\e(B"    "\e$(CA@\e(B")
+   ("\e$(C$8$G$>\e(B"    "\e$(CAA\e(B")
+
+   ("\e$(C$8$G$?\e(B"    "\e$(CAB\e(B")
+   ("\e$(C$8$G$?$!\e(B"  "\e$(CAC\e(B")
+   ("\e$(C$8$G$?$)\e(B"  "\e$(CAD\e(B")
+   ("\e$(C$8$G$?$2\e(B"  "\e$(CAE\e(B")
+   ("\e$(C$8$G$?$5\e(B"  "\e$(CAF\e(B")
+   ("\e$(C$8$G$?$7\e(B"  "\e$(CAG\e(B")
+
+   ("\e$(C$8$G$@\e(B"    "\e$(CAH\e(B")
+   ("\e$(C$8$G$@$6\e(B"  "\e$(CAI\e(B")
+   ("\e$(C$8$G$@$7\e(B"  "\e$(CAJ\e(B")
+
+   ("\e$(C$8$G$S\e(B"    "\e$(CAK\e(B")
+   ("\e$(C$8$G$S$$\e(B"  "\e$(CAL\e(B")
+   ("\e$(C$8$G$S$)\e(B"  "\e$(CAM\e(B")
+   ("\e$(C$8$G$S$1\e(B"  "\e$(CAN\e(B")
+   ("\e$(C$8$G$S$2\e(B"  "\e$(CAO\e(B")
+   ("\e$(C$8$G$S$5\e(B"  "\e$(CAP\e(B")
+   ("\e$(C$8$G$S$7\e(B"  "\e$(CAQ\e(B")
+
+   ("\e$(C$8$K\e(B"      "\e$(CAR\e(B")
+   ("\e$(C$8$K$!\e(B"    "\e$(CAS\e(B")
+   ("\e$(C$8$K$$\e(B"    "\e$(CAT\e(B")
+   ("\e$(C$8$K$7\e(B"    "\e$(CAU\e(B")
+
+   ("\e$(C$8$L\e(B"      "\e$(CAV\e(B")
+   ("\e$(C$8$L$!\e(B"    "\e$(CAW\e(B")
+   ("\e$(C$8$L$$\e(B"    "\e$(CAX\e(B")
+   ("\e$(C$8$L$)\e(B"    "\e$(CAY\e(B")
+   ("\e$(C$8$L$)$!\e(B"  "\e$(CAZ\e(B")
+   ("\e$(C$8$L$)$1\e(B"  "\e$(CA[\e(B")
+   ("\e$(C$8$L$1\e(B"    "\e$(CA\\e(B")
+   ("\e$(C$8$L$2\e(B"    "\e$(CA]\e(B")
+   ("\e$(C$8$L$5\e(B"    "\e$(CA^\e(B")
+   ("\e$(C$8$L$7\e(B"    "\e$(CA_\e(B")
+
+   ("\e$(C$8$L$C\e(B"    "\e$(CA`\e(B")
+   ("\e$(C$8$L$C$6\e(B"  "\e$(CAa\e(B")
+
+   ("\e$(C$8$L$D\e(B"    "\e$(CAb\e(B")
+
+   ("\e$(C$8$L$S\e(B"    "\e$(CAc\e(B")
+   ("\e$(C$8$L$S$!\e(B"  "\e$(CAd\e(B")
+   ("\e$(C$8$L$S$$\e(B"  "\e$(CAe\e(B")
+   ("\e$(C$8$L$S$)\e(B"  "\e$(CAf\e(B")
+   ("\e$(C$8$L$S$1\e(B"  "\e$(CAg\e(B")
+   ("\e$(C$8$L$S$2\e(B"  "\e$(CAh\e(B")
+   ("\e$(C$8$L$S$5\e(B"  "\e$(CAi\e(B")
+
+   ("\e$(C$8$P\e(B"      "\e$(CAj\e(B")
+   ("\e$(C$8$P$$\e(B"    "\e$(CAk\e(B")
+   ("\e$(C$8$P$)\e(B"    "\e$(CAl\e(B")
+   ("\e$(C$8$P$1\e(B"    "\e$(CAm\e(B")
+
+   ("\e$(C$8$Q\e(B"      "\e$(CAn\e(B")
+   ("\e$(C$8$Q$!\e(B"    "\e$(CAo\e(B")
+   ("\e$(C$8$Q$$\e(B"    "\e$(CAp\e(B")
+   ("\e$(C$8$Q$)\e(B"    "\e$(CAq\e(B")
+   ("\e$(C$8$Q$1\e(B"    "\e$(CAr\e(B")
+   ("\e$(C$8$Q$2\e(B"    "\e$(CAs\e(B")
+   ("\e$(C$8$Q$5\e(B"    "\e$(CAt\e(B")
+   ("\e$(C$8$Q$7\e(B"    "\e$(CAu\e(B")
+
+   ("\e$(C$8$S\e(B"      "\e$(CAv\e(B")
+   ("\e$(C$8$S$!\e(B"    "\e$(CAw\e(B")
+   ("\e$(C$8$S$$\e(B"    "\e$(CAx\e(B")
+   ("\e$(C$8$S$'\e(B"    "\e$(CAy\e(B")
+   ("\e$(C$8$S$)\e(B"    "\e$(CAz\e(B")
+   ("\e$(C$8$S$)$1\e(B"  "\e$(CA{\e(B")
+   ("\e$(C$8$S$1\e(B"    "\e$(CA|\e(B")
+   ("\e$(C$8$S$2\e(B"    "\e$(CA}\e(B")
+   ("\e$(C$8$S$5\e(B"    "\e$(CA~\e(B")
+   ("\e$(C$8$S$7\e(B"    "\e$(CB!\e(B")
+   ("\e$(C$8$S$8\e(B"    "\e$(CB"\e(B")
+   ("\e$(C$8$S$<\e(B"    "\e$(CB#\e(B")
+   ("\e$(C$8$S$=\e(B"    "\e$(CB$\e(B")
+
+   ("\e$(C$9$?\e(B"      "\e$(CB%\e(B")
+   ("\e$(C$9$?$!\e(B"    "\e$(CB&\e(B")
+   ("\e$(C$9$?$$\e(B"    "\e$(CB'\e(B")
+   ("\e$(C$9$?$$$>\e(B"  "\e$(CB(\e(B")
+   ("\e$(C$9$?$)\e(B"    "\e$(CB)\e(B")
+   ("\e$(C$9$?$)$2\e(B"  "\e$(CB*\e(B")
+   ("\e$(C$9$?$1\e(B"    "\e$(CB+\e(B")
+   ("\e$(C$9$?$2\e(B"    "\e$(CB,\e(B")
+   ("\e$(C$9$?$5\e(B"    "\e$(CB-\e(B")
+   ("\e$(C$9$?$6\e(B"    "\e$(CB.\e(B")
+   ("\e$(C$9$?$7\e(B"    "\e$(CB/\e(B")
+
+   ("\e$(C$9$@\e(B"      "\e$(CB0\e(B")
+   ("\e$(C$9$@$!\e(B"    "\e$(CB1\e(B")
+   ("\e$(C$9$@$$\e(B"    "\e$(CB2\e(B")
+   ("\e$(C$9$@$)\e(B"    "\e$(CB3\e(B")
+   ("\e$(C$9$@$1\e(B"    "\e$(CB4\e(B")
+   ("\e$(C$9$@$2\e(B"    "\e$(CB5\e(B")
+   ("\e$(C$9$@$5\e(B"    "\e$(CB6\e(B")
+   ("\e$(C$9$@$6\e(B"    "\e$(CB7\e(B")
+   ("\e$(C$9$@$7\e(B"    "\e$(CB8\e(B")
+
+   ("\e$(C$9$A\e(B"      "\e$(CB9\e(B")
+   ("\e$(C$9$A$$\e(B"    "\e$(CB:\e(B")
+   ("\e$(C$9$A$7\e(B"    "\e$(CB;\e(B")
+
+   ("\e$(C$9$C\e(B"      "\e$(CB<\e(B")
+   ("\e$(C$9$C$!\e(B"    "\e$(CB=\e(B")
+   ("\e$(C$9$C$$\e(B"    "\e$(CB>\e(B")
+   ("\e$(C$9$C$)\e(B"    "\e$(CB?\e(B")
+   ("\e$(C$9$C$1\e(B"    "\e$(CB@\e(B")
+   ("\e$(C$9$C$2\e(B"    "\e$(CBA\e(B")
+   ("\e$(C$9$C$5\e(B"    "\e$(CBB\e(B")
+   ("\e$(C$9$C$6\e(B"    "\e$(CBC\e(B")
+   ("\e$(C$9$C$7\e(B"    "\e$(CBD\e(B")
+
+   ("\e$(C$9$D\e(B"      "\e$(CBE\e(B")
+   ("\e$(C$9$D$7\e(B"    "\e$(CBF\e(B")
+
+   ("\e$(C$9$E\e(B"      "\e$(CBG\e(B")
+   ("\e$(C$9$E$6\e(B"    "\e$(CBH\e(B")
+
+   ("\e$(C$9$G\e(B"      "\e$(CBI\e(B")
+   ("\e$(C$9$G$!\e(B"    "\e$(CBJ\e(B")
+   ("\e$(C$9$G$$\e(B"    "\e$(CBK\e(B")
+   ("\e$(C$9$G$)\e(B"    "\e$(CBL\e(B")
+   ("\e$(C$9$G$1\e(B"    "\e$(CBM\e(B")
+   ("\e$(C$9$G$2\e(B"    "\e$(CBN\e(B")
+   ("\e$(C$9$G$5\e(B"    "\e$(CBO\e(B")
+   ("\e$(C$9$G$7\e(B"    "\e$(CBP\e(B")
+   ("\e$(C$9$G$:\e(B"    "\e$(CBQ\e(B")
+
+   ("\e$(C$9$G$?\e(B"    "\e$(CBR\e(B")
+   ("\e$(C$9$G$?$!\e(B"  "\e$(CBS\e(B")
+   ("\e$(C$9$G$?$)\e(B"  "\e$(CBT\e(B")
+   ("\e$(C$9$G$?$6\e(B"  "\e$(CBU\e(B")
+
+   ("\e$(C$9$G$@\e(B"    "\e$(CBV\e(B")
+   ("\e$(C$9$G$@$6\e(B"  "\e$(CBW\e(B")
+
+   ("\e$(C$9$G$S\e(B"    "\e$(CBX\e(B")
+   ("\e$(C$9$G$S$$\e(B"  "\e$(CBY\e(B")
+   ("\e$(C$9$G$S$)\e(B"  "\e$(CBZ\e(B")
+   ("\e$(C$9$G$S$1\e(B"  "\e$(CB[\e(B")
+   ("\e$(C$9$G$S$2\e(B"  "\e$(CB\\e(B")
+
+   ("\e$(C$9$K$7\e(B"    "\e$(CB]\e(B")
+
+   ("\e$(C$9$L\e(B"      "\e$(CB^\e(B")
+   ("\e$(C$9$L$!\e(B"    "\e$(CB_\e(B")
+   ("\e$(C$9$L$$\e(B"    "\e$(CB`\e(B")
+   ("\e$(C$9$L$)\e(B"    "\e$(CBa\e(B")
+   ("\e$(C$9$L$1\e(B"    "\e$(CBb\e(B")
+   ("\e$(C$9$L$2\e(B"    "\e$(CBc\e(B")
+   ("\e$(C$9$L$7\e(B"    "\e$(CBd\e(B")
+
+   ("\e$(C$9$L$C\e(B"    "\e$(CBe\e(B")
+   ("\e$(C$9$L$C$6\e(B"  "\e$(CBf\e(B")
+   ("\e$(C$9$L$C$7\e(B"  "\e$(CBg\e(B")
+
+   ("\e$(C$9$L$S\e(B"    "\e$(CBh\e(B")
+
+   ("\e$(C$9$P\e(B"      "\e$(CBi\e(B")
+
+   ("\e$(C$9$Q\e(B"      "\e$(CBj\e(B")
+   ("\e$(C$9$Q$1\e(B"    "\e$(CBk\e(B")
+   ("\e$(C$9$Q$5\e(B"    "\e$(CBl\e(B")
+   ("\e$(C$9$Q$7\e(B"    "\e$(CBm\e(B")
+
+   ("\e$(C$9$S\e(B"      "\e$(CBn\e(B")
+   ("\e$(C$9$S$!\e(B"    "\e$(CBo\e(B")
+   ("\e$(C$9$S$$\e(B"    "\e$(CBp\e(B")
+   ("\e$(C$9$S$)\e(B"    "\e$(CBq\e(B")
+   ("\e$(C$9$S$1\e(B"    "\e$(CBr\e(B")
+   ("\e$(C$9$S$2\e(B"    "\e$(CBs\e(B")
+   ("\e$(C$9$S$7\e(B"    "\e$(CBt\e(B")
+   ("\e$(C$9$S$8\e(B"    "\e$(CBu\e(B")
+   ("\e$(C$9$S$>\e(B"    "\e$(CBv\e(B")
+
+   ("\e$(C$:$?\e(B"      "\e$(CBw\e(B")
+   ("\e$(C$:$?$!\e(B"    "\e$(CBx\e(B")
+   ("\e$(C$:$?$$\e(B"    "\e$(CBy\e(B")
+   ("\e$(C$:$?$$$>\e(B"  "\e$(CBz\e(B")
+   ("\e$(C$:$?$)\e(B"    "\e$(CB{\e(B")
+   ("\e$(C$:$?$1\e(B"    "\e$(CB|\e(B")
+   ("\e$(C$:$?$2\e(B"    "\e$(CB}\e(B")
+   ("\e$(C$:$?$5\e(B"    "\e$(CB~\e(B")
+   ("\e$(C$:$?$6\e(B"    "\e$(CC!\e(B")
+   ("\e$(C$:$?$7\e(B"    "\e$(CC"\e(B")
+   ("\e$(C$:$?$8\e(B"    "\e$(CC#\e(B")
+
+   ("\e$(C$:$@\e(B"      "\e$(CC$\e(B")
+   ("\e$(C$:$@$!\e(B"    "\e$(CC%\e(B")
+   ("\e$(C$:$@$$\e(B"    "\e$(CC&\e(B")
+   ("\e$(C$:$@$)\e(B"    "\e$(CC'\e(B")
+   ("\e$(C$:$@$1\e(B"    "\e$(CC(\e(B")
+   ("\e$(C$:$@$2\e(B"    "\e$(CC)\e(B")
+   ("\e$(C$:$@$5\e(B"    "\e$(CC*\e(B")
+   ("\e$(C$:$@$6\e(B"    "\e$(CC+\e(B")
+   ("\e$(C$:$@$7\e(B"    "\e$(CC,\e(B")
+
+   ("\e$(C$:$A\e(B"      "\e$(CC-\e(B")
+   ("\e$(C$:$A$$\e(B"    "\e$(CC.\e(B")
+   ("\e$(C$:$A$$$>\e(B"  "\e$(CC/\e(B")
+   ("\e$(C$:$A$)\e(B"    "\e$(CC0\e(B")
+   ("\e$(C$:$A$1\e(B"    "\e$(CC1\e(B")
+   ("\e$(C$:$A$7\e(B"    "\e$(CC2\e(B")
+
+   ("\e$(C$:$C\e(B"      "\e$(CC3\e(B")
+   ("\e$(C$:$C$!\e(B"    "\e$(CC4\e(B")
+   ("\e$(C$:$C$$\e(B"    "\e$(CC5\e(B")
+   ("\e$(C$:$C$)\e(B"    "\e$(CC6\e(B")
+   ("\e$(C$:$C$1\e(B"    "\e$(CC7\e(B")
+   ("\e$(C$:$C$2\e(B"    "\e$(CC8\e(B")
+   ("\e$(C$:$C$5\e(B"    "\e$(CC9\e(B")
+   ("\e$(C$:$C$6\e(B"    "\e$(CC:\e(B")
+   ("\e$(C$:$C$7\e(B"    "\e$(CC;\e(B")
+
+   ("\e$(C$:$D\e(B"      "\e$(CC<\e(B")
+   ("\e$(C$:$D$!\e(B"    "\e$(CC=\e(B")
+   ("\e$(C$:$D$$\e(B"    "\e$(CC>\e(B")
+   ("\e$(C$:$D$)\e(B"    "\e$(CC?\e(B")
+   ("\e$(C$:$D$1\e(B"    "\e$(CC@\e(B")
+   ("\e$(C$:$D$2\e(B"    "\e$(CCA\e(B")
+   ("\e$(C$:$D$5\e(B"    "\e$(CCB\e(B")
+   ("\e$(C$:$D$7\e(B"    "\e$(CCC\e(B")
+
+   ("\e$(C$:$E\e(B"      "\e$(CCD\e(B")
+   ("\e$(C$:$E$$\e(B"    "\e$(CCE\e(B")
+   ("\e$(C$:$E$6\e(B"    "\e$(CCF\e(B")
+
+   ("\e$(C$:$F\e(B"      "\e$(CCG\e(B")
+   ("\e$(C$:$F$$\e(B"    "\e$(CCH\e(B")
+   ("\e$(C$:$F$7\e(B"    "\e$(CCI\e(B")
+
+   ("\e$(C$:$G\e(B"      "\e$(CCJ\e(B")
+   ("\e$(C$:$G$!\e(B"    "\e$(CCK\e(B")
+   ("\e$(C$:$G$$\e(B"    "\e$(CCL\e(B")
+   ("\e$(C$:$G$)\e(B"    "\e$(CCM\e(B")
+   ("\e$(C$:$G$1\e(B"    "\e$(CCN\e(B")
+   ("\e$(C$:$G$2\e(B"    "\e$(CCO\e(B")
+   ("\e$(C$:$G$5\e(B"    "\e$(CCP\e(B")
+   ("\e$(C$:$G$7\e(B"    "\e$(CCQ\e(B")
+
+   ("\e$(C$:$G$?\e(B"    "\e$(CCR\e(B")
+   ("\e$(C$:$G$?$$\e(B"  "\e$(CCS\e(B")
+   ("\e$(C$:$G$?$)\e(B"  "\e$(CCT\e(B")
+   ("\e$(C$:$G$?$7\e(B"  "\e$(CCU\e(B")
+
+   ("\e$(C$:$G$S\e(B"    "\e$(CCV\e(B")
+   ("\e$(C$:$G$S$$\e(B"  "\e$(CCW\e(B")
+   ("\e$(C$:$G$S$)\e(B"  "\e$(CCX\e(B")
+   ("\e$(C$:$G$S$1\e(B"  "\e$(CCY\e(B")
+   ("\e$(C$:$G$S$2\e(B"  "\e$(CCZ\e(B")
+   ("\e$(C$:$G$S$5\e(B"  "\e$(CC[\e(B")
+   ("\e$(C$:$G$S$7\e(B"  "\e$(CC\\e(B")
+
+   ("\e$(C$:$K\e(B"      "\e$(CC]\e(B")
+   ("\e$(C$:$K$1\e(B"    "\e$(CC^\e(B")
+
+   ("\e$(C$:$L\e(B"      "\e$(CC_\e(B")
+   ("\e$(C$:$L$!\e(B"    "\e$(CC`\e(B")
+   ("\e$(C$:$L$$\e(B"    "\e$(CCa\e(B")
+   ("\e$(C$:$L$)\e(B"    "\e$(CCb\e(B")
+   ("\e$(C$:$L$1\e(B"    "\e$(CCc\e(B")
+   ("\e$(C$:$L$2\e(B"    "\e$(CCd\e(B")
+   ("\e$(C$:$L$5\e(B"    "\e$(CCe\e(B")
+   ("\e$(C$:$L$7\e(B"    "\e$(CCf\e(B")
+
+   ("\e$(C$:$L$C\e(B"    "\e$(CCg\e(B")
+   ("\e$(C$:$L$C$6\e(B"  "\e$(CCh\e(B")
+
+   ("\e$(C$:$L$D\e(B"    "\e$(CCi\e(B")
+   ("\e$(C$:$L$D$$\e(B"  "\e$(CCj\e(B")
+
+   ("\e$(C$:$L$S\e(B"    "\e$(CCk\e(B")
+   ("\e$(C$:$L$S$$\e(B"  "\e$(CCl\e(B")
+   ("\e$(C$:$L$S$)\e(B"  "\e$(CCm\e(B")
+   ("\e$(C$:$L$S$1\e(B"  "\e$(CCn\e(B")
+   ("\e$(C$:$L$S$2\e(B"  "\e$(CCo\e(B")
+   ("\e$(C$:$L$S$5\e(B"  "\e$(CCp\e(B")
+   ("\e$(C$:$L$S$7\e(B"  "\e$(CCq\e(B")
+
+   ("\e$(C$:$P\e(B"      "\e$(CCr\e(B")
+   ("\e$(C$:$P$$\e(B"    "\e$(CCs\e(B")
+   ("\e$(C$:$P$)\e(B"    "\e$(CCt\e(B")
+   ("\e$(C$:$P$1\e(B"    "\e$(CCu\e(B")
+   ("\e$(C$:$P$7\e(B"    "\e$(CCv\e(B")
+
+   ("\e$(C$:$Q\e(B"      "\e$(CCw\e(B")
+   ("\e$(C$:$Q$!\e(B"    "\e$(CCx\e(B")
+   ("\e$(C$:$Q$$\e(B"    "\e$(CCy\e(B")
+   ("\e$(C$:$Q$)\e(B"    "\e$(CCz\e(B")
+   ("\e$(C$:$Q$1\e(B"    "\e$(CC{\e(B")
+   ("\e$(C$:$Q$2\e(B"    "\e$(CC|\e(B")
+   ("\e$(C$:$Q$5\e(B"    "\e$(CC}\e(B")
+   ("\e$(C$:$Q$7\e(B"    "\e$(CC~\e(B")
+
+   ("\e$(C$:$S\e(B"      "\e$(CD!\e(B")
+   ("\e$(C$:$S$!\e(B"    "\e$(CD"\e(B")
+   ("\e$(C$:$S$$\e(B"    "\e$(CD#\e(B")
+   ("\e$(C$:$S$'\e(B"    "\e$(CD$\e(B")
+   ("\e$(C$:$S$)\e(B"    "\e$(CD%\e(B")
+   ("\e$(C$:$S$)$!\e(B"  "\e$(CD&\e(B")
+   ("\e$(C$:$S$1\e(B"    "\e$(CD'\e(B")
+   ("\e$(C$:$S$2\e(B"    "\e$(CD(\e(B")
+   ("\e$(C$:$S$5\e(B"    "\e$(CD)\e(B")
+   ("\e$(C$:$S$7\e(B"    "\e$(CD*\e(B")
+
+   ("\e$(C$;$?\e(B"      "\e$(CD+\e(B")
+   ("\e$(C$;$?$!\e(B"    "\e$(CD,\e(B")
+   ("\e$(C$;$?$$\e(B"    "\e$(CD-\e(B")
+   ("\e$(C$;$?$)\e(B"    "\e$(CD.\e(B")
+   ("\e$(C$;$?$1\e(B"    "\e$(CD/\e(B")
+   ("\e$(C$;$?$2\e(B"    "\e$(CD0\e(B")
+   ("\e$(C$;$?$5\e(B"    "\e$(CD1\e(B")
+   ("\e$(C$;$?$7\e(B"    "\e$(CD2\e(B")
+
+   ("\e$(C$;$@\e(B"      "\e$(CD3\e(B")
+   ("\e$(C$;$@$!\e(B"    "\e$(CD4\e(B")
+   ("\e$(C$;$@$$\e(B"    "\e$(CD5\e(B")
+   ("\e$(C$;$@$)\e(B"    "\e$(CD6\e(B")
+   ("\e$(C$;$@$1\e(B"    "\e$(CD7\e(B")
+   ("\e$(C$;$@$2\e(B"    "\e$(CD8\e(B")
+   ("\e$(C$;$@$5\e(B"    "\e$(CD9\e(B")
+   ("\e$(C$;$@$6\e(B"    "\e$(CD:\e(B")
+   ("\e$(C$;$@$7\e(B"    "\e$(CD;\e(B")
+
+   ("\e$(C$;$A\e(B"      "\e$(CD<\e(B")
+   ("\e$(C$;$A$!\e(B"    "\e$(CD=\e(B")
+   ("\e$(C$;$A$7\e(B"    "\e$(CD>\e(B")
+
+   ("\e$(C$;$C\e(B"      "\e$(CD?\e(B")
+   ("\e$(C$;$C$!\e(B"    "\e$(CD@\e(B")
+   ("\e$(C$;$C$$\e(B"    "\e$(CDA\e(B")
+   ("\e$(C$;$C$'\e(B"    "\e$(CDB\e(B")
+   ("\e$(C$;$C$)\e(B"    "\e$(CDC\e(B")
+   ("\e$(C$;$C$1\e(B"    "\e$(CDD\e(B")
+   ("\e$(C$;$C$2\e(B"    "\e$(CDE\e(B")
+   ("\e$(C$;$C$5\e(B"    "\e$(CDF\e(B")
+   ("\e$(C$;$C$6\e(B"    "\e$(CDG\e(B")
+   ("\e$(C$;$C$7\e(B"    "\e$(CDH\e(B")
+
+   ("\e$(C$;$D\e(B"      "\e$(CDI\e(B")
+   ("\e$(C$;$D$!\e(B"    "\e$(CDJ\e(B")
+   ("\e$(C$;$D$$\e(B"    "\e$(CDK\e(B")
+   ("\e$(C$;$D$)\e(B"    "\e$(CDL\e(B")
+   ("\e$(C$;$D$1\e(B"    "\e$(CDM\e(B")
+   ("\e$(C$;$D$2\e(B"    "\e$(CDN\e(B")
+   ("\e$(C$;$D$5\e(B"    "\e$(CDO\e(B")
+   ("\e$(C$;$D$7\e(B"    "\e$(CDP\e(B")
+
+   ("\e$(C$;$E\e(B"      "\e$(CDQ\e(B")
+   ("\e$(C$;$E$$\e(B"    "\e$(CDR\e(B")
+   ("\e$(C$;$E$)\e(B"    "\e$(CDS\e(B")
+   ("\e$(C$;$E$1\e(B"    "\e$(CDT\e(B")
+   ("\e$(C$;$E$2\e(B"    "\e$(CDU\e(B")
+   ("\e$(C$;$E$5\e(B"    "\e$(CDV\e(B")
+   ("\e$(C$;$E$6\e(B"    "\e$(CDW\e(B")
+   ("\e$(C$;$E$7\e(B"    "\e$(CDX\e(B")
+
+   ("\e$(C$;$F\e(B"      "\e$(CDY\e(B")
+
+   ("\e$(C$;$G\e(B"      "\e$(CDZ\e(B")
+   ("\e$(C$;$G$!\e(B"    "\e$(CD[\e(B")
+   ("\e$(C$;$G$$\e(B"    "\e$(CD\\e(B")
+   ("\e$(C$;$G$)\e(B"    "\e$(CD]\e(B")
+   ("\e$(C$;$G$1\e(B"    "\e$(CD^\e(B")
+   ("\e$(C$;$G$2\e(B"    "\e$(CD_\e(B")
+   ("\e$(C$;$G$5\e(B"    "\e$(CD`\e(B")
+   ("\e$(C$;$G$7\e(B"    "\e$(CDa\e(B")
+
+   ("\e$(C$;$G$?\e(B"    "\e$(CDb\e(B")
+   ("\e$(C$;$G$?$!\e(B"  "\e$(CDc\e(B")
+   ("\e$(C$;$G$?$$\e(B"  "\e$(CDd\e(B")
+   ("\e$(C$;$G$?$)\e(B"  "\e$(CDe\e(B")
+   ("\e$(C$;$G$?$1\e(B"  "\e$(CDf\e(B")
+   ("\e$(C$;$G$?$7\e(B"  "\e$(CDg\e(B")
+
+   ("\e$(C$;$G$@\e(B"    "\e$(CDh\e(B")
+   ("\e$(C$;$G$@$7\e(B"  "\e$(CDi\e(B")
+
+   ("\e$(C$;$G$S\e(B"    "\e$(CDj\e(B")
+   ("\e$(C$;$G$S$)\e(B"  "\e$(CDk\e(B")
+
+   ("\e$(C$;$K\e(B"      "\e$(CDl\e(B")
+
+   ("\e$(C$;$L\e(B"      "\e$(CDm\e(B")
+   ("\e$(C$;$L$!\e(B"    "\e$(CDn\e(B")
+   ("\e$(C$;$L$)\e(B"    "\e$(CDp\e(B")
+   ("\e$(C$;$L$1\e(B"    "\e$(CDq\e(B")
+   ("\e$(C$;$L$2\e(B"    "\e$(CDr\e(B")
+   ("\e$(C$;$L$5\e(B"    "\e$(CDs\e(B")
+   ("\e$(C$;$L$7\e(B"    "\e$(CDt\e(B")
+
+   ("\e$(C$;$L$C\e(B"    "\e$(CDu\e(B")
+   ("\e$(C$;$L$C$$\e(B"  "\e$(CDv\e(B")
+   ("\e$(C$;$L$C$)\e(B"  "\e$(CDw\e(B")
+   ("\e$(C$;$L$C$7\e(B"  "\e$(CDx\e(B")
+
+   ("\e$(C$;$L$D\e(B"    "\e$(CDy\e(B")
+   ("\e$(C$;$L$D$7\e(B"  "\e$(CDz\e(B")
+
+   ("\e$(C$;$L$S\e(B"    "\e$(CD{\e(B")
+   ("\e$(C$;$L$S$!\e(B"  "\e$(CD|\e(B")
+   ("\e$(C$;$L$S$$\e(B"  "\e$(CD}\e(B")
+   ("\e$(C$;$L$S$)\e(B"  "\e$(CD~\e(B")
+   ("\e$(C$;$L$S$1\e(B"  "\e$(CE!\e(B")
+   ("\e$(C$;$L$S$2\e(B"  "\e$(CE"\e(B")
+   ("\e$(C$;$L$S$5\e(B"  "\e$(CE#\e(B")
+   ("\e$(C$;$L$S$7\e(B"  "\e$(CE$\e(B")
+
+   ("\e$(C$;$P\e(B"      "\e$(CE%\e(B")
+   ("\e$(C$;$P$$\e(B"    "\e$(CE&\e(B")
+   ("\e$(C$;$P$)\e(B"    "\e$(CE'\e(B")
+   ("\e$(C$;$P$1\e(B"    "\e$(CE(\e(B")
+
+   ("\e$(C$;$Q\e(B"      "\e$(CE)\e(B")
+   ("\e$(C$;$Q$!\e(B"    "\e$(CE*\e(B")
+   ("\e$(C$;$Q$$\e(B"    "\e$(CE+\e(B")
+   ("\e$(C$;$Q$)\e(B"    "\e$(CE,\e(B")
+   ("\e$(C$;$Q$1\e(B"    "\e$(CE-\e(B")
+   ("\e$(C$;$Q$2\e(B"    "\e$(CE.\e(B")
+   ("\e$(C$;$Q$7\e(B"    "\e$(CE/\e(B")
+
+   ("\e$(C$;$S\e(B"      "\e$(CE0\e(B")
+   ("\e$(C$;$S$!\e(B"    "\e$(CE1\e(B")
+   ("\e$(C$;$S$$\e(B"    "\e$(CE2\e(B")
+   ("\e$(C$;$S$)\e(B"    "\e$(CE3\e(B")
+   ("\e$(C$;$S$1\e(B"    "\e$(CE4\e(B")
+   ("\e$(C$;$S$2\e(B"    "\e$(CE5\e(B")
+   ("\e$(C$;$S$5\e(B"    "\e$(CE6\e(B")
+   ("\e$(C$;$S$7\e(B"    "\e$(CE7\e(B")
+
+   ("\e$(C$<$?\e(B"      "\e$(CE8\e(B")
+   ("\e$(C$<$?$!\e(B"    "\e$(CE9\e(B")
+   ("\e$(C$<$?$$\e(B"    "\e$(CE:\e(B")
+   ("\e$(C$<$?$)\e(B"    "\e$(CE;\e(B")
+   ("\e$(C$<$?$)$!\e(B"  "\e$(CE<\e(B")
+   ("\e$(C$<$?$1\e(B"    "\e$(CE=\e(B")
+   ("\e$(C$<$?$2\e(B"    "\e$(CE>\e(B")
+   ("\e$(C$<$?$5\e(B"    "\e$(CE?\e(B")
+   ("\e$(C$<$?$6\e(B"    "\e$(CE@\e(B")
+   ("\e$(C$<$?$7\e(B"    "\e$(CEA\e(B")
+
+   ("\e$(C$<$@\e(B"      "\e$(CEB\e(B")
+   ("\e$(C$<$@$!\e(B"    "\e$(CEC\e(B")
+   ("\e$(C$<$@$$\e(B"    "\e$(CED\e(B")
+   ("\e$(C$<$@$)\e(B"    "\e$(CEE\e(B")
+   ("\e$(C$<$@$1\e(B"    "\e$(CEF\e(B")
+   ("\e$(C$<$@$2\e(B"    "\e$(CEG\e(B")
+   ("\e$(C$<$@$5\e(B"    "\e$(CEH\e(B")
+   ("\e$(C$<$@$6\e(B"    "\e$(CEI\e(B")
+   ("\e$(C$<$@$7\e(B"    "\e$(CEJ\e(B")
+
+   ("\e$(C$<$A\e(B"      "\e$(CEK\e(B")
+   ("\e$(C$<$A$7\e(B"    "\e$(CEL\e(B")
+
+   ("\e$(C$<$C\e(B"      "\e$(CEM\e(B")
+   ("\e$(C$<$C$!\e(B"    "\e$(CEN\e(B")
+   ("\e$(C$<$C$$\e(B"    "\e$(CEO\e(B")
+   ("\e$(C$<$C$)\e(B"    "\e$(CEP\e(B")
+   ("\e$(C$<$C$)$1\e(B"  "\e$(CEQ\e(B")
+   ("\e$(C$<$C$1\e(B"    "\e$(CER\e(B")
+   ("\e$(C$<$C$2\e(B"    "\e$(CES\e(B")
+   ("\e$(C$<$C$5\e(B"    "\e$(CET\e(B")
+   ("\e$(C$<$C$6\e(B"    "\e$(CEU\e(B")
+   ("\e$(C$<$C$7\e(B"    "\e$(CEV\e(B")
+
+   ("\e$(C$<$D\e(B"      "\e$(CEW\e(B")
+   ("\e$(C$<$D$!\e(B"    "\e$(CEX\e(B")
+   ("\e$(C$<$D$$\e(B"    "\e$(CEY\e(B")
+   ("\e$(C$<$D$)\e(B"    "\e$(CEZ\e(B")
+   ("\e$(C$<$D$1\e(B"    "\e$(CE[\e(B")
+   ("\e$(C$<$D$2\e(B"    "\e$(CE\\e(B")
+   ("\e$(C$<$D$5\e(B"    "\e$(CE]\e(B")
+   ("\e$(C$<$D$7\e(B"    "\e$(CE^\e(B")
+
+   ("\e$(C$<$E\e(B"      "\e$(CE_\e(B")
+   ("\e$(C$<$E$$\e(B"    "\e$(CE`\e(B")
+   ("\e$(C$<$E$6\e(B"    "\e$(CEa\e(B")
+
+   ("\e$(C$<$F\e(B"      "\e$(CEb\e(B")
+   ("\e$(C$<$F$$\e(B"    "\e$(CEc\e(B")
+
+   ("\e$(C$<$G\e(B"      "\e$(CEd\e(B")
+   ("\e$(C$<$G$!\e(B"    "\e$(CEe\e(B")
+   ("\e$(C$<$G$$\e(B"    "\e$(CEf\e(B")
+   ("\e$(C$<$G$)\e(B"    "\e$(CEg\e(B")
+   ("\e$(C$<$G$1\e(B"    "\e$(CEh\e(B")
+   ("\e$(C$<$G$2\e(B"    "\e$(CEi\e(B")
+   ("\e$(C$<$G$5\e(B"    "\e$(CEj\e(B")
+   ("\e$(C$<$G$7\e(B"    "\e$(CEk\e(B")
+   ("\e$(C$<$G$=\e(B"    "\e$(CEl\e(B")
+
+   ("\e$(C$<$G$?\e(B"    "\e$(CEm\e(B")
+   ("\e$(C$<$G$?$$\e(B"  "\e$(CEn\e(B")
+
+   ("\e$(C$<$G$@\e(B"    "\e$(CEo\e(B")
+
+   ("\e$(C$<$G$S\e(B"    "\e$(CEp\e(B")
+   ("\e$(C$<$G$S$$\e(B"  "\e$(CEq\e(B")
+   ("\e$(C$<$G$S$5\e(B"  "\e$(CEr\e(B")
+   ("\e$(C$<$G$S$7\e(B"  "\e$(CEs\e(B")
+
+   ("\e$(C$<$K\e(B"      "\e$(CEt\e(B")
+
+   ("\e$(C$<$L\e(B"      "\e$(CEu\e(B")
+   ("\e$(C$<$L$!\e(B"    "\e$(CEv\e(B")
+   ("\e$(C$<$L$$\e(B"    "\e$(CEw\e(B")
+   ("\e$(C$<$L$)\e(B"    "\e$(CEx\e(B")
+   ("\e$(C$<$L$1\e(B"    "\e$(CEy\e(B")
+   ("\e$(C$<$L$2\e(B"    "\e$(CEz\e(B")
+   ("\e$(C$<$L$5\e(B"    "\e$(CE{\e(B")
+   ("\e$(C$<$L$7\e(B"    "\e$(CE|\e(B")
+
+   ("\e$(C$<$L$C\e(B"    "\e$(CE}\e(B")
+   ("\e$(C$<$L$C$6\e(B"  "\e$(CE~\e(B")
+
+   ("\e$(C$<$L$D\e(B"    "\e$(CF!\e(B")
+
+   ("\e$(C$<$L$S\e(B"    "\e$(CF"\e(B")
+   ("\e$(C$<$L$S$!\e(B"  "\e$(CF#\e(B")
+   ("\e$(C$<$L$S$$\e(B"  "\e$(CF$\e(B")
+   ("\e$(C$<$L$S$)\e(B"  "\e$(CF%\e(B")
+   ("\e$(C$<$L$S$1\e(B"  "\e$(CF&\e(B")
+   ("\e$(C$<$L$S$2\e(B"  "\e$(CF'\e(B")
+   ("\e$(C$<$L$S$7\e(B"  "\e$(CF(\e(B")
+
+   ("\e$(C$<$P\e(B"      "\e$(CF)\e(B")
+   ("\e$(C$<$P$$\e(B"    "\e$(CF*\e(B")
+   ("\e$(C$<$P$)\e(B"    "\e$(CF+\e(B")
+   ("\e$(C$<$P$1\e(B"    "\e$(CF,\e(B")
+   ("\e$(C$<$P$7\e(B"    "\e$(CF-\e(B")
+
+   ("\e$(C$<$Q\e(B"      "\e$(CF.\e(B")
+   ("\e$(C$<$Q$!\e(B"    "\e$(CF/\e(B")
+   ("\e$(C$<$Q$$\e(B"    "\e$(CF0\e(B")
+   ("\e$(C$<$Q$'\e(B"    "\e$(CF1\e(B")
+   ("\e$(C$<$Q$)\e(B"    "\e$(CF2\e(B")
+   ("\e$(C$<$Q$)$1\e(B"  "\e$(CF3\e(B")
+   ("\e$(C$<$Q$1\e(B"    "\e$(CF4\e(B")
+   ("\e$(C$<$Q$2\e(B"    "\e$(CF5\e(B")
+   ("\e$(C$<$Q$5\e(B"    "\e$(CF6\e(B")
+
+   ("\e$(C$<$Q$S\e(B"    "\e$(CF7\e(B")
+   ("\e$(C$<$Q$S$$\e(B"  "\e$(CF8\e(B")
+   ("\e$(C$<$Q$S$)\e(B"  "\e$(CF9\e(B")
+   ("\e$(C$<$Q$S$1\e(B"  "\e$(CF:\e(B")
+   ("\e$(C$<$Q$S$2\e(B"  "\e$(CF;\e(B")
+
+   ("\e$(C$<$S\e(B"      "\e$(CF<\e(B")
+   ("\e$(C$<$S$!\e(B"    "\e$(CF=\e(B")
+   ("\e$(C$<$S$$\e(B"    "\e$(CF>\e(B")
+   ("\e$(C$<$S$)\e(B"    "\e$(CF?\e(B")
+   ("\e$(C$<$S$1\e(B"    "\e$(CF@\e(B")
+   ("\e$(C$<$S$2\e(B"    "\e$(CFA\e(B")
+   ("\e$(C$<$S$5\e(B"    "\e$(CFB\e(B")
+   ("\e$(C$<$S$7\e(B"    "\e$(CFC\e(B")
+
+   ("\e$(C$=$?\e(B"      "\e$(CFD\e(B")
+   ("\e$(C$=$?$!\e(B"    "\e$(CFE\e(B")
+   ("\e$(C$=$?$"\e(B"    "\e$(CFF\e(B")
+   ("\e$(C$=$?$$\e(B"    "\e$(CFG\e(B")
+   ("\e$(C$=$?$)\e(B"    "\e$(CFH\e(B")
+   ("\e$(C$=$?$)$1\e(B"  "\e$(CFI\e(B")
+   ("\e$(C$=$?$1\e(B"    "\e$(CFJ\e(B")
+   ("\e$(C$=$?$2\e(B"    "\e$(CFK\e(B")
+   ("\e$(C$=$?$5\e(B"    "\e$(CFL\e(B")
+   ("\e$(C$=$?$6\e(B"    "\e$(CFM\e(B")
+   ("\e$(C$=$?$7\e(B"    "\e$(CFN\e(B")
+   ("\e$(C$=$?$<\e(B"    "\e$(CFO\e(B")
+
+   ("\e$(C$=$@\e(B"      "\e$(CFP\e(B")
+   ("\e$(C$=$@$!\e(B"    "\e$(CFQ\e(B")
+   ("\e$(C$=$@$$\e(B"    "\e$(CFR\e(B")
+   ("\e$(C$=$@$)\e(B"    "\e$(CFS\e(B")
+   ("\e$(C$=$@$1\e(B"    "\e$(CFT\e(B")
+   ("\e$(C$=$@$2\e(B"    "\e$(CFU\e(B")
+   ("\e$(C$=$@$5\e(B"    "\e$(CFV\e(B")
+   ("\e$(C$=$@$6\e(B"    "\e$(CFW\e(B")
+   ("\e$(C$=$@$7\e(B"    "\e$(CFX\e(B")
+
+   ("\e$(C$=$A\e(B"      "\e$(CFY\e(B")
+   ("\e$(C$=$A$!\e(B"    "\e$(CFZ\e(B")
+
+   ("\e$(C$=$C\e(B"      "\e$(CF[\e(B")
+   ("\e$(C$=$C$!\e(B"    "\e$(CF\\e(B")
+   ("\e$(C$=$C$$\e(B"    "\e$(CF]\e(B")
+   ("\e$(C$=$C$1\e(B"    "\e$(CF_\e(B")
+   ("\e$(C$=$C$2\e(B"    "\e$(CF`\e(B")
+   ("\e$(C$=$C$5\e(B"    "\e$(CFa\e(B")
+   ("\e$(C$=$C$6\e(B"    "\e$(CFb\e(B")
+   ("\e$(C$=$C$7\e(B"    "\e$(CFc\e(B")
+
+   ("\e$(C$=$D\e(B"      "\e$(CFd\e(B")
+   ("\e$(C$=$D$!\e(B"    "\e$(CFe\e(B")
+   ("\e$(C$=$D$$\e(B"    "\e$(CFf\e(B")
+   ("\e$(C$=$D$)\e(B"    "\e$(CFg\e(B")
+   ("\e$(C$=$D$1\e(B"    "\e$(CFh\e(B")
+   ("\e$(C$=$D$2\e(B"    "\e$(CFi\e(B")
+   ("\e$(C$=$D$5\e(B"    "\e$(CFj\e(B")
+   ("\e$(C$=$D$7\e(B"    "\e$(CFk\e(B")
+
+   ("\e$(C$=$E\e(B"      "\e$(CFl\e(B")
+   ("\e$(C$=$E$$\e(B"    "\e$(CFm\e(B")
+   ("\e$(C$=$E$)\e(B"    "\e$(CFn\e(B")
+   ("\e$(C$=$E$1\e(B"    "\e$(CFo\e(B")
+   ("\e$(C$=$E$2\e(B"    "\e$(CFp\e(B")
+   ("\e$(C$=$E$6\e(B"    "\e$(CFq\e(B")
+   ("\e$(C$=$E$7\e(B"    "\e$(CFr\e(B")
+
+   ("\e$(C$=$F\e(B"      "\e$(CFs\e(B")
+   ("\e$(C$=$F$)\e(B"    "\e$(CFt\e(B")
+   ("\e$(C$=$F$2\e(B"    "\e$(CFu\e(B")
+   ("\e$(C$=$F$5\e(B"    "\e$(CFv\e(B")
+
+   ("\e$(C$=$G\e(B"      "\e$(CFw\e(B")
+   ("\e$(C$=$G$!\e(B"    "\e$(CFx\e(B")
+   ("\e$(C$=$G$$\e(B"    "\e$(CFy\e(B")
+   ("\e$(C$=$G$)\e(B"    "\e$(CFz\e(B")
+   ("\e$(C$=$G$1\e(B"    "\e$(CF{\e(B")
+   ("\e$(C$=$G$2\e(B"    "\e$(CF|\e(B")
+   ("\e$(C$=$G$5\e(B"    "\e$(CF}\e(B")
+   ("\e$(C$=$G$7\e(B"    "\e$(CF~\e(B")
+
+   ("\e$(C$=$G$?\e(B"    "\e$(CG!\e(B")
+   ("\e$(C$=$G$?$7\e(B"  "\e$(CG"\e(B")
+
+   ("\e$(C$=$G$S\e(B"    "\e$(CG#\e(B")
+   ("\e$(C$=$G$S$$\e(B"  "\e$(CG$\e(B")
+
+   ("\e$(C$=$K\e(B"      "\e$(CG%\e(B")
+   ("\e$(C$=$K$$\e(B"    "\e$(CG&\e(B")
+   ("\e$(C$=$K$)\e(B"    "\e$(CG'\e(B")
+   ("\e$(C$=$K$2\e(B"    "\e$(CG(\e(B")
+   ("\e$(C$=$K$5\e(B"    "\e$(CG)\e(B")
+
+   ("\e$(C$=$L\e(B"      "\e$(CG*\e(B")
+   ("\e$(C$=$L$!\e(B"    "\e$(CG+\e(B")
+   ("\e$(C$=$L$$\e(B"    "\e$(CG,\e(B")
+   ("\e$(C$=$L$'\e(B"    "\e$(CG-\e(B")
+   ("\e$(C$=$L$)\e(B"    "\e$(CG.\e(B")
+   ("\e$(C$=$L$)$1\e(B"  "\e$(CG/\e(B")
+   ("\e$(C$=$L$1\e(B"    "\e$(CG0\e(B")
+   ("\e$(C$=$L$2\e(B"    "\e$(CG1\e(B")
+   ("\e$(C$=$L$5\e(B"    "\e$(CG2\e(B")
+   ("\e$(C$=$L$7\e(B"    "\e$(CG3\e(B")
+
+   ("\e$(C$=$L$C\e(B"    "\e$(CG4\e(B")
+   ("\e$(C$=$L$C$7\e(B"  "\e$(CG5\e(B")
+
+   ("\e$(C$=$L$S\e(B"    "\e$(CG6\e(B")
+   ("\e$(C$=$L$S$$\e(B"  "\e$(CG7\e(B")
+   ("\e$(C$=$L$S$)\e(B"  "\e$(CG8\e(B")
+   ("\e$(C$=$L$S$1\e(B"  "\e$(CG9\e(B")
+   ("\e$(C$=$L$S$5\e(B"  "\e$(CG:\e(B")
+
+   ("\e$(C$=$P\e(B"      "\e$(CG;\e(B")
+   ("\e$(C$=$P$$\e(B"    "\e$(CG<\e(B")
+   ("\e$(C$=$P$)\e(B"    "\e$(CG=\e(B")
+   ("\e$(C$=$P$1\e(B"    "\e$(CG>\e(B")
+   ("\e$(C$=$P$5\e(B"    "\e$(CG?\e(B")
+   ("\e$(C$=$P$7\e(B"    "\e$(CG@\e(B")
+
+   ("\e$(C$=$Q\e(B"      "\e$(CGA\e(B")
+   ("\e$(C$=$Q$$\e(B"    "\e$(CGB\e(B")
+   ("\e$(C$=$Q$)\e(B"    "\e$(CGC\e(B")
+   ("\e$(C$=$Q$1\e(B"    "\e$(CGD\e(B")
+   ("\e$(C$=$Q$2\e(B"    "\e$(CGE\e(B")
+   ("\e$(C$=$Q$5\e(B"    "\e$(CGF\e(B")
+
+   ("\e$(C$=$S\e(B"      "\e$(CGG\e(B")
+   ("\e$(C$=$S$!\e(B"    "\e$(CGH\e(B")
+   ("\e$(C$=$S$$\e(B"    "\e$(CGI\e(B")
+   ("\e$(C$=$S$)\e(B"    "\e$(CGJ\e(B")
+   ("\e$(C$=$S$1\e(B"    "\e$(CGK\e(B")
+   ("\e$(C$=$S$2\e(B"    "\e$(CGL\e(B")
+   ("\e$(C$=$S$5\e(B"    "\e$(CGM\e(B")
+   ("\e$(C$=$S$7\e(B"    "\e$(CGN\e(B")
+
+   ("\e$(C$>$?\e(B"      "\e$(CGO\e(B")
+   ("\e$(C$>$?$!\e(B"    "\e$(CGP\e(B")
+   ("\e$(C$>$?$$\e(B"    "\e$(CGQ\e(B")
+   ("\e$(C$>$?$)\e(B"    "\e$(CGR\e(B")
+   ("\e$(C$>$?$)$<\e(B"  "\e$(CGS\e(B")
+   ("\e$(C$>$?$1\e(B"    "\e$(CGT\e(B")
+   ("\e$(C$>$?$2\e(B"    "\e$(CGU\e(B")
+   ("\e$(C$>$?$5\e(B"    "\e$(CGV\e(B")
+   ("\e$(C$>$?$7\e(B"    "\e$(CGW\e(B")
+
+   ("\e$(C$>$@\e(B"      "\e$(CGX\e(B")
+   ("\e$(C$>$@$!\e(B"    "\e$(CGY\e(B")
+   ("\e$(C$>$@$$\e(B"    "\e$(CGZ\e(B")
+   ("\e$(C$>$@$)\e(B"    "\e$(CG[\e(B")
+   ("\e$(C$>$@$1\e(B"    "\e$(CG\\e(B")
+   ("\e$(C$>$@$2\e(B"    "\e$(CG]\e(B")
+   ("\e$(C$>$@$5\e(B"    "\e$(CG^\e(B")
+   ("\e$(C$>$@$6\e(B"    "\e$(CG_\e(B")
+   ("\e$(C$>$@$7\e(B"    "\e$(CG`\e(B")
+
+   ("\e$(C$>$A\e(B"      "\e$(CGa\e(B")
+   ("\e$(C$>$A$7\e(B"    "\e$(CGb\e(B")
+
+   ("\e$(C$>$C\e(B"      "\e$(CGc\e(B")
+   ("\e$(C$>$C$!\e(B"    "\e$(CGd\e(B")
+   ("\e$(C$>$C$$\e(B"    "\e$(CGe\e(B")
+   ("\e$(C$>$C$)\e(B"    "\e$(CGf\e(B")
+   ("\e$(C$>$C$)$1\e(B"  "\e$(CGg\e(B")
+   ("\e$(C$>$C$1\e(B"    "\e$(CGh\e(B")
+   ("\e$(C$>$C$2\e(B"    "\e$(CGi\e(B")
+   ("\e$(C$>$C$5\e(B"    "\e$(CGj\e(B")
+   ("\e$(C$>$C$7\e(B"    "\e$(CGk\e(B")
+
+   ("\e$(C$>$D\e(B"      "\e$(CGl\e(B")
+   ("\e$(C$>$D$!\e(B"    "\e$(CGm\e(B")
+   ("\e$(C$>$D$$\e(B"    "\e$(CGn\e(B")
+   ("\e$(C$>$D$)\e(B"    "\e$(CGo\e(B")
+   ("\e$(C$>$D$1\e(B"    "\e$(CGp\e(B")
+   ("\e$(C$>$D$2\e(B"    "\e$(CGq\e(B")
+   ("\e$(C$>$D$5\e(B"    "\e$(CGr\e(B")
+   ("\e$(C$>$D$7\e(B"    "\e$(CGs\e(B")
+
+   ("\e$(C$>$E\e(B"      "\e$(CGt\e(B")
+   ("\e$(C$>$E$!\e(B"    "\e$(CGu\e(B")
+   ("\e$(C$>$E$$\e(B"    "\e$(CGv\e(B")
+   ("\e$(C$>$E$)\e(B"    "\e$(CGw\e(B")
+   ("\e$(C$>$E$1\e(B"    "\e$(CGx\e(B")
+   ("\e$(C$>$E$2\e(B"    "\e$(CGy\e(B")
+   ("\e$(C$>$E$5\e(B"    "\e$(CGz\e(B")
+   ("\e$(C$>$E$6\e(B"    "\e$(CG{\e(B")
+   ("\e$(C$>$E$7\e(B"    "\e$(CG|\e(B")
+
+   ("\e$(C$>$F\e(B"      "\e$(CG}\e(B")
+   ("\e$(C$>$F$$\e(B"    "\e$(CG~\e(B")
+   ("\e$(C$>$F$)\e(B"    "\e$(CH!\e(B")
+   ("\e$(C$>$F$2\e(B"    "\e$(CH"\e(B")
+
+   ("\e$(C$>$G\e(B"      "\e$(CH#\e(B")
+   ("\e$(C$>$G$!\e(B"    "\e$(CH$\e(B")
+   ("\e$(C$>$G$$\e(B"    "\e$(CH%\e(B")
+   ("\e$(C$>$G$)\e(B"    "\e$(CH&\e(B")
+   ("\e$(C$>$G$)$<\e(B"  "\e$(CH'\e(B")
+   ("\e$(C$>$G$1\e(B"    "\e$(CH(\e(B")
+   ("\e$(C$>$G$2\e(B"    "\e$(CH)\e(B")
+   ("\e$(C$>$G$5\e(B"    "\e$(CH*\e(B")
+   ("\e$(C$>$G$7\e(B"    "\e$(CH+\e(B")
+   ("\e$(C$>$G$<\e(B"    "\e$(CH,\e(B")
+
+   ("\e$(C$>$G$?\e(B"    "\e$(CH-\e(B")
+   ("\e$(C$>$G$?$!\e(B"  "\e$(CH.\e(B")
+   ("\e$(C$>$G$?$$\e(B"  "\e$(CH/\e(B")
+   ("\e$(C$>$G$?$)\e(B"  "\e$(CH0\e(B")
+   ("\e$(C$>$G$?$5\e(B"  "\e$(CH1\e(B")
+   ("\e$(C$>$G$?$7\e(B"  "\e$(CH2\e(B")
+
+   ("\e$(C$>$G$@\e(B"    "\e$(CH3\e(B")
+   ("\e$(C$>$G$@$!\e(B"  "\e$(CH4\e(B")
+   ("\e$(C$>$G$@$$\e(B"  "\e$(CH5\e(B")
+   ("\e$(C$>$G$@$5\e(B"  "\e$(CH6\e(B")
+   ("\e$(C$>$G$@$7\e(B"  "\e$(CH7\e(B")
+
+   ("\e$(C$>$G$S\e(B"    "\e$(CH8\e(B")
+   ("\e$(C$>$G$S$!\e(B"  "\e$(CH9\e(B")
+   ("\e$(C$>$G$S$$\e(B"  "\e$(CH:\e(B")
+   ("\e$(C$>$G$S$)\e(B"  "\e$(CH;\e(B")
+   ("\e$(C$>$G$S$2\e(B"  "\e$(CH<\e(B")
+   ("\e$(C$>$G$S$5\e(B"  "\e$(CH=\e(B")
+   ("\e$(C$>$G$S$7\e(B"  "\e$(CH>\e(B")
+
+   ("\e$(C$>$K\e(B"      "\e$(CH?\e(B")
+   ("\e$(C$>$K$$\e(B"    "\e$(CH@\e(B")
+   ("\e$(C$>$K$)\e(B"    "\e$(CHA\e(B")
+   ("\e$(C$>$K$2\e(B"    "\e$(CHB\e(B")
+   ("\e$(C$>$K$5\e(B"    "\e$(CHC\e(B")
+
+   ("\e$(C$>$L\e(B"      "\e$(CHD\e(B")
+   ("\e$(C$>$L$!\e(B"    "\e$(CHE\e(B")
+   ("\e$(C$>$L$$\e(B"    "\e$(CHF\e(B")
+   ("\e$(C$>$L$)\e(B"    "\e$(CHG\e(B")
+   ("\e$(C$>$L$)$<\e(B"  "\e$(CHH\e(B")
+   ("\e$(C$>$L$1\e(B"    "\e$(CHI\e(B")
+   ("\e$(C$>$L$5\e(B"    "\e$(CHJ\e(B")
+   ("\e$(C$>$L$7\e(B"    "\e$(CHK\e(B")
+
+   ("\e$(C$>$L$C\e(B"    "\e$(CHL\e(B")
+   ("\e$(C$>$L$C$$\e(B"  "\e$(CHM\e(B")
+   ("\e$(C$>$L$C$)\e(B"  "\e$(CHN\e(B")
+   ("\e$(C$>$L$C$1\e(B"  "\e$(CHO\e(B")
+   ("\e$(C$>$L$C$7\e(B"  "\e$(CHP\e(B")
+
+   ("\e$(C$>$L$D\e(B"    "\e$(CHQ\e(B")
+   ("\e$(C$>$L$D$!\e(B"  "\e$(CHR\e(B")
+   ("\e$(C$>$L$D$$\e(B"  "\e$(CHS\e(B")
+   ("\e$(C$>$L$D$)\e(B"  "\e$(CHT\e(B")
+   ("\e$(C$>$L$D$7\e(B"  "\e$(CHU\e(B")
+
+   ("\e$(C$>$L$S\e(B"    "\e$(CHV\e(B")
+   ("\e$(C$>$L$S$!\e(B"  "\e$(CHW\e(B")
+   ("\e$(C$>$L$S$$\e(B"  "\e$(CHX\e(B")
+   ("\e$(C$>$L$S$)\e(B"  "\e$(CHY\e(B")
+   ("\e$(C$>$L$S$1\e(B"  "\e$(CHZ\e(B")
+   ("\e$(C$>$L$S$2\e(B"  "\e$(CH[\e(B")
+   ("\e$(C$>$L$S$5\e(B"  "\e$(CH\\e(B")
+   ("\e$(C$>$L$S$7\e(B"  "\e$(CH]\e(B")
+
+   ("\e$(C$>$P\e(B"      "\e$(CH^\e(B")
+   ("\e$(C$>$P$!\e(B"    "\e$(CH_\e(B")
+   ("\e$(C$>$P$$\e(B"    "\e$(CH`\e(B")
+   ("\e$(C$>$P$)\e(B"    "\e$(CHa\e(B")
+   ("\e$(C$>$P$1\e(B"    "\e$(CHb\e(B")
+   ("\e$(C$>$P$5\e(B"    "\e$(CHc\e(B")
+   ("\e$(C$>$P$7\e(B"    "\e$(CHd\e(B")
+
+   ("\e$(C$>$Q\e(B"      "\e$(CHe\e(B")
+   ("\e$(C$>$Q$!\e(B"    "\e$(CHf\e(B")
+   ("\e$(C$>$Q$$\e(B"    "\e$(CHg\e(B")
+   ("\e$(C$>$Q$$$>\e(B"  "\e$(CHh\e(B")
+   ("\e$(C$>$Q$'\e(B"    "\e$(CHi\e(B")
+   ("\e$(C$>$Q$)\e(B"    "\e$(CHj\e(B")
+   ("\e$(C$>$Q$)$!\e(B"  "\e$(CHk\e(B")
+   ("\e$(C$>$Q$1\e(B"    "\e$(CHl\e(B")
+   ("\e$(C$>$Q$2\e(B"    "\e$(CHm\e(B")
+   ("\e$(C$>$Q$5\e(B"    "\e$(CHn\e(B")
+   ("\e$(C$>$Q$7\e(B"    "\e$(CHo\e(B")
+   ("\e$(C$>$Q$<\e(B"    "\e$(CHp\e(B")
+
+   ("\e$(C$>$Q$S\e(B"    "\e$(CHq\e(B")
+   ("\e$(C$>$Q$S$$\e(B"  "\e$(CHr\e(B")
+   ("\e$(C$>$Q$S$)\e(B"  "\e$(CHs\e(B")
+   ("\e$(C$>$Q$S$1\e(B"  "\e$(CHt\e(B")
+   ("\e$(C$>$Q$S$2\e(B"  "\e$(CHu\e(B")
+   ("\e$(C$>$Q$S$7\e(B"  "\e$(CHv\e(B")
+
+   ("\e$(C$>$S\e(B"      "\e$(CHw\e(B")
+   ("\e$(C$>$S$!\e(B"    "\e$(CHx\e(B")
+   ("\e$(C$>$S$$\e(B"    "\e$(CHy\e(B")
+   ("\e$(C$>$S$)\e(B"    "\e$(CHz\e(B")
+   ("\e$(C$>$S$1\e(B"    "\e$(CH{\e(B")
+   ("\e$(C$>$S$2\e(B"    "\e$(CH|\e(B")
+   ("\e$(C$>$S$5\e(B"    "\e$(CH}\e(B")
+   ("\e$(C$>$S$7\e(B"    "\e$(CH~\e(B"))
+
+  (dolist (ascii '(("1" . "\e$(C#1\e(B")  ("2" . "\e$(C#2\e(B")  ("3" . "\e$(C#3\e(B")  ("4" . "\e$(C#4\e(B")
+                    ("5" . "\e$(C#5\e(B")  ("6" . "\e$(C#6\e(B")  ("7" . "\e$(C#7\e(B")  ("8" . "\e$(C#8\e(B")
+                    ("9" . "\e$(C#9\e(B")  ("0" . "\e$(C#0\e(B")
+                    (" " . "\e$(C!!\e(B")  ("!" . "\e$(C#!\e(B")  ("@" . "\e$(C#@\e(B")  ("#" . "\e$(C##\e(B")
+                    ("$" . "\e$(C#$\e(B")  ("%" . "\e$(C#%\e(B")  ("^" . "\e$(C#^\e(B")  ("&" . "\e$(C#&\e(B")
+                    ("*" . "\e$(C#*\e(B")  ("(" . "\e$(C#(\e(B")  (")" . "\e$(C#)\e(B")
+                    ("-" . "\e$(C#-\e(B")  ("=" . "\e$(C#=\e(B")  ("`" . "\e$(C#`\e(B")  ("\\" . "\e$(C#\\e(B")
+                    ("|" . "\e$(C#|\e(B")  ("_" . "\e$(C#_\e(B")  ("+" . "\e$(C#+\e(B")  ("~" . "\e$(C#~\e(B")
+                    ("[" . "\e$(C!8\e(B")  ("]" . "\e$(C!9\e(B")  ("{" . "\e$(C#{\e(B")  ("}" . "\e$(C#}\e(B")
+                    (":" . "\e$(C#:\e(B")  (";" . "\e$(C#;\e(B")  ("\"" . "\e$(C#"\e(B") ("'" . "\e$(C#'\e(B")
+                    ("<" . "\e$(C#<\e(B")  (">" . "\e$(C#>\e(B")  ("?" . "\e$(C#?\e(B")  ("/" . "\e$(C#/\e(B")
+                    ("," . "\e$(C#,\e(B")  ("." . "\e$(C#.\e(B")
+                    ("a" . "\e$(C#a\e(B")  ("b" . "\e$(C#b\e(B")  ("c" . "\e$(C#c\e(B")  ("d" . "\e$(C#d\e(B")
+                    ("e" . "\e$(C#e\e(B")  ("f" . "\e$(C#f\e(B")  ("g" . "\e$(C#g\e(B")  ("h" . "\e$(C#h\e(B")
+                    ("i" . "\e$(C#i\e(B")  ("j" . "\e$(C#j\e(B")  ("k" . "\e$(C#k\e(B")  ("l" . "\e$(C#l\e(B")
+                    ("m" . "\e$(C#m\e(B")  ("n" . "\e$(C#n\e(B")  ("o" . "\e$(C#o\e(B")  ("p" . "\e$(C#p\e(B")
+                    ("q" . "\e$(C#q\e(B")  ("r" . "\e$(C#r\e(B")  ("s" . "\e$(C#s\e(B")  ("t" . "\e$(C#t\e(B")
+                    ("u" . "\e$(C#u\e(B")  ("v" . "\e$(C#v\e(B")  ("w" . "\e$(C#w\e(B")  ("x" . "\e$(C#x\e(B")
+                    ("y" . "\e$(C#y\e(B")  ("z" . "\e$(C#z\e(B")
+                    ("A" . "\e$(C#A\e(B")  ("B" . "\e$(C#B\e(B")  ("C" . "\e$(C#C\e(B")  ("D" . "\e$(C#D\e(B")
+                    ("E" . "\e$(C#E\e(B")  ("F" . "\e$(C#F\e(B")  ("G" . "\e$(C#G\e(B")  ("H" . "\e$(C#H\e(B")
+                    ("I" . "\e$(C#I\e(B")  ("J" . "\e$(C#J\e(B")  ("K" . "\e$(C#K\e(B")  ("L" . "\e$(C#L\e(B")
+                    ("M" . "\e$(C#M\e(B")  ("N" . "\e$(C#N\e(B")  ("O" . "\e$(C#O\e(B")  ("P" . "\e$(C#P\e(B")
+                    ("Q" . "\e$(C#Q\e(B")  ("R" . "\e$(C#R\e(B")  ("S" . "\e$(C#S\e(B")  ("T" . "\e$(C#T\e(B")
+                    ("U" . "\e$(C#U\e(B")  ("V" . "\e$(C#V\e(B")  ("W" . "\e$(C#W\e(B")  ("X" . "\e$(C#X\e(B")
+                    ("Y" . "\e$(C#Y\e(B")  ("Z" . "\e$(C#Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+       (its-defrule (concat its-pankak-escape in) in)
+       (its-defrule (concat its-jeonkak-escape in) out))))
+
+(define-its-state-machine-append its-hangul-map
+  (its-defrule "[" its-hangul-open-bracket)
+  (its-defrule "]" its-hangul-close-bracket)
+  (its-defrule "." its-hangul-period)
+  (its-defrule "," its-hangul-comma)
+
+  (if its-hangul-enable-jeonkak-alphabet
+       (progn
+         (its-defrule   "1"   "\e$(C#1\e(B")  (its-defrule   "2"   "\e$(C#2\e(B")
+         (its-defrule   "3"   "\e$(C#3\e(B")  (its-defrule   "4"   "\e$(C#4\e(B")
+         (its-defrule   "5"   "\e$(C#5\e(B")  (its-defrule   "6"   "\e$(C#6\e(B")
+         (its-defrule   "7"   "\e$(C#7\e(B")  (its-defrule   "8"   "\e$(C#8\e(B")
+         (its-defrule   "9"   "\e$(C#9\e(B")  (its-defrule   "0"   "\e$(C#0\e(B")
+         (its-defrule   "!"   "\e$(C#!\e(B")  (its-defrule   "@"   "\e$(C#@\e(B")
+         (its-defrule   "#"   "\e$(C##\e(B")  (its-defrule   "$"   "\e$(C#$\e(B")
+         (its-defrule   "%"   "\e$(C#%\e(B")  (its-defrule   "^"   "\e$(C#^\e(B")
+         (its-defrule   "&"   "\e$(C#&\e(B")  (its-defrule   "*"   "\e$(C#*\e(B")
+         (its-defrule   "("   "\e$(C#(\e(B")  (its-defrule   ")"   "\e$(C#)\e(B")
+         (its-defrule   "-"   "\e$(C#-\e(B")  (its-defrule   "~"   "\e$(C#~\e(B")
+         (its-defrule   "="   "\e$(C#=\e(B")  (its-defrule   "`"   "\e$(C#`\e(B")
+         (its-defrule   "\\"  "\e$(C#\\e(B")  (its-defrule   "|"   "\e$(C#|\e(B")
+         (its-defrule   "_"   "\e$(C#_\e(B")  (its-defrule   "+"   "\e$(C#+\e(B")
+         (its-defrule   "{"   "\e$(C#{\e(B")  (its-defrule   "}"   "\e$(C#}\e(B")
+         (its-defrule   ":"   "\e$(C#:\e(B")  (its-defrule   ";"   "\e$(C#;\e(B")
+         (its-defrule   "\""  "\e$(C#"\e(B")  (its-defrule   "'"   "\e$(C#'\e(B")
+         (its-defrule   "<"   "\e$(C#<\e(B")  (its-defrule   ">"   "\e$(C#>\e(B")
+         (its-defrule   "?"   "\e$(C#?\e(B")  (its-defrule   "/"   "\e$(C#/\e(B"))
+    (progn
+       (its-defrule   "1"   "1")  (its-defrule   "2"   "2")
+       (its-defrule   "3"   "3")  (its-defrule   "4"   "4")
+       (its-defrule   "5"   "5")  (its-defrule   "6"   "6")
+       (its-defrule   "7"   "7")  (its-defrule   "8"   "8")
+       (its-defrule   "9"   "9")  (its-defrule   "0"   "0")
+       (its-defrule   "!"   "!")  (its-defrule   "@"   "@")
+       (its-defrule   "#"   "#")  (its-defrule   "$"   "$")
+       (its-defrule   "%"   "%")  (its-defrule   "^"   "^")
+       (its-defrule   "&"   "&")  (its-defrule   "*"   "*")
+       (its-defrule   "("   "(")  (its-defrule   ")"   ")")
+       (its-defrule   "-"   "-")  (its-defrule   "~"   "~")
+       (its-defrule   "="   "=")  (its-defrule   "`"   "`")
+       (its-defrule   "\\"  "\\") (its-defrule   "|"   "|")
+       (its-defrule   "_"   "_")  (its-defrule   "+"   "+")
+       (its-defrule   "{"   "{")  (its-defrule   "}"   "}")
+       (its-defrule   ":"   ":")  (its-defrule   ";"   ";")
+       (its-defrule   "\""  "\"") (its-defrule   "'"   "'")
+       (its-defrule   "<"   "<")  (its-defrule   ">"   ">")
+       (its-defrule   "?"   "?")  (its-defrule   "/"   "/"))))
+
+(provide 'its/hangul)
diff --git a/its/hankata.el b/its/hankata.el
new file mode 100644 (file)
index 0000000..73618f2
--- /dev/null
@@ -0,0 +1,291 @@
+;;; its/hankata.el --- Hnakaku Katakana Input in Egg Input Method Architecture
+
+;; Copyright (C) 1995 Electrotechnical Laboratory, JAPAN.
+;; Licensed to the Free Software Foundation.
+
+;; Author: Satoru Tomura <tomura@etl.go.jp>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+;;
+;; Symbol input is desined by jiro@math.keio.ac.jp (TANAKA Jiro)
+;; This file is based on the rules of its/kata.el in Mule-2.3 distribution.
+;;
+
+;;; Code:
+
+(eval-when-compile
+  (require 'its)
+  (require 'cl))
+
+(eval-when (compile)
+  (defconst its-compaction-enable t))
+
+(defvar its-han-kata-enable-double-n nil "*Enable \"nn\" input for \"\e$B%s\e(B\" ")
+(defvar its-han-kata-enable-zenkaku-alphabet t "*Enable Zenkaku alphabet")
+(defvar its-han-kata-period "\e(I!\e(B" "*\e$B%T%j%*%I\e(B")  ; ". " "\e$B!%\e(B"
+(defvar its-han-kata-comma  "\e(I$\e(B" "*\e$B%3%s%^\e(B")    ; ", " "\e$B!$\e(B"
+(defvar its-han-kata-open-bracket  "\e(I"\e(B" "*[")  ; "\e$B!N\e(B"
+(defvar its-han-kata-close-bracket  "\e(I#\e(B" "*]") ; "\e$B!O\e(B"
+(defvar its-han-kata-horizontal  "\e(I0\e(B" "*-")    ; "\e$B!]\e(B"
+
+(define-its-state-machine its-han-kata-map
+  "roma-han-kata" "\e(I11\e(B" Japanese
+  "Map for Romaji-Hankaku-Katakana translation. (Japanese)"
+
+  (defconst its-hankaku-escape "~")  ;; Escape character to Hankaku inputs
+
+  (its-defrule-select-mode-temporally "q" downcase)
+
+;;; k      k
+;;; kk     \e$B%C\e(Bk
+;;; kka    \e$B%C%+\e(B
+;;;
+;;; kkk    \e$B%C\e(Bk DING!
+
+  (its-defrule "tch"  "\e(I/\e(B" -2)
+
+;;; \e$B!V%s!W$NF~NO\e(B
+
+  (dolist (q1 '("b" "m" "p"))
+    (its-defrule (concat "m" q1) "\e(I]\e(B" -1))
+
+  (its-defrule* "n"  "\e(I]\e(B")
+  (its-defrule  "n'" "\e(I]\e(B")
+  (its-defrule  "N"  "\e(I]\e(B")
+
+  (let ((small '"x" ))
+    (its-defrule (concat small "a") "\e(I'\e(B")
+    (its-defrule (concat small "i") "\e(I(\e(B")
+    (its-defrule (concat small "u") "\e(I)\e(B")
+    (its-defrule (concat small "e") "\e(I*\e(B")
+    (its-defrule (concat small "o") "\e(I+\e(B")
+    (its-defrule (concat small "ya") "\e(I,\e(B")
+    (its-defrule (concat small "yu") "\e(I-\e(B")
+    (its-defrule (concat small "yo") "\e(I.\e(B")
+    (its-defrule (concat small "tu") "\e(I/\e(B")
+    (its-defrule (concat small "tsu") "\e(I/\e(B")
+    (its-defrule (concat small "wa") "\e(I\\e(B")
+    )
+
+  (its-defrule   "a"    "\e(I1\e(B")
+  (its-defrule   "i"    "\e(I2\e(B")
+  (its-defrule   "u"    "\e(I3\e(B")
+  (its-defrule   "e"    "\e(I4\e(B")
+  (its-defrule   "o"    "\e(I5\e(B")
+
+  (dolist (k '(("ka"  "\e(I6\e(B") ("ki"  "\e(I7\e(B") ("ku"  "\e(I8\e(B") ("ke"  "\e(I9\e(B") ("ko"  "\e(I:\e(B")
+              ("kya" "\e(I7,\e(B") ("kyu"  "\e(I7-\e(B") ("kye"  "\e(I7*\e(B") ("kyo"  "\e(I7.\e(B")))
+    (its-defrule (car k) (cadr k))
+    (its-defrule (concat "k" (car k)) (concat "\e(I/\e(B" (cadr k))))
+  (its-defoutput "kk" "\e(I/\e(Bk")
+  (its-defoutput "kky" "\e(I/\e(Bky")
+
+  (dolist (s '(("sa"  "\e(I;\e(B") ("si"  "\e(I<\e(B") ("su"  "\e(I=\e(B") ("se"  "\e(I>\e(B") ("so"  "\e(I?\e(B")
+              ("sya"  "\e(I<,\e(B") ("syu"  "\e(I<-\e(B") ("sye"  "\e(I<*\e(B") ("syo"  "\e(I<.\e(B")
+              ("sha"  "\e(I<,\e(B") ("shi"  "\e(I<\e(B") ("shu"  "\e(I<-\e(B") ("she"  "\e(I<*\e(B")
+              ("sho"  "\e(I<.\e(B")))
+    (its-defrule (car s) (cadr s))
+    (its-defrule (concat "s" (car s)) (concat "\e(I/\e(B" (cadr s))))
+  (its-defoutput "ss" "\e(I/\e(Bs")
+  (its-defoutput "ssy" "\e(I/\e(Bsy")
+  (its-defoutput "ssh" "\e(I/\e(Bsh")
+
+  (dolist (T '(("ta"  "\e(I@\e(B") ("ti"  "\e(IA\e(B") ("tu"  "\e(IB\e(B") ("te"  "\e(IC\e(B") ("to"  "\e(ID\e(B")
+              ("tya"  "\e(IA,\e(B") ("tyi"  "\e(IC(\e(B") ("tyu"  "\e(IA-\e(B") ("tye"  "\e(IA*\e(B")
+              ("tyo"  "\e(IA.\e(B") ("tsu"  "\e(IB\e(B")))
+    (its-defrule (car T) (cadr T))
+    (its-defrule (concat "t" (car T)) (concat "\e(I/\e(B" (cadr T))))
+  (its-defoutput "tt" "\e(I/\e(Bt")
+  (its-defoutput "tty" "\e(I/\e(Bty")
+  (its-defoutput "tts" "\e(I/\e(Bts")
+
+  (dolist (c '(("cha"  "\e(IA,\e(B") ("chi"  "\e(IA\e(B") ("chu"  "\e(IA-\e(B")
+              ("che"  "\e(IA*\e(B") ("cho"  "\e(IA.\e(B")))
+    (its-defrule (car c) (cadr c))
+    (its-defrule (concat "c" (car c)) (concat "\e(I/\e(B" (cadr c))))
+  (its-defoutput "cc" "\e(I/\e(Bc")
+  (its-defoutput "cch" "\e(I/\e(Bch")
+
+  (dolist (h '(("ha"  "\e(IJ\e(B") ("hi"  "\e(IK\e(B") ("hu"  "\e(IL\e(B") ("he"  "\e(IM\e(B") ("ho"  "\e(IN\e(B")
+              ("hya"  "\e(IK,\e(B") ("hyu"  "\e(IK-\e(B") ("hye"  "\e(IK*\e(B") ("hyo"  "\e(IK.\e(B")))
+    (its-defrule (car h) (cadr h))
+    (its-defrule (concat "h" (car h)) (concat "\e(I/\e(B" (cadr h))))
+  (its-defoutput "hh" "\e(I/\e(Bh")
+  (its-defoutput "hhy" "\e(I/\e(Bhy")
+
+  (dolist (f '(("fa"  "\e(IL'\e(B") ("fi"  "\e(IL(\e(B") ("fu"  "\e(IL\e(B") ("fe"  "\e(IL*\e(B")
+              ("fo"  "\e(IL+\e(B")))
+    (its-defrule (car f) (cadr f))
+    (its-defrule (concat "f" (car f)) (concat "\e(I/\e(B" (cadr f))))
+  (its-defoutput "ff" "\e(I/\e(Bf")
+
+  (dolist (r '(("ra"  "\e(IW\e(B") ("ri"  "\e(IX\e(B") ("ru"  "\e(IY\e(B") ("re"  "\e(IZ\e(B") ("ro"  "\e(I[\e(B")
+              ("rya"  "\e(IX,\e(B") ("ryu"  "\e(IX-\e(B") ("rye"  "\e(IX*\e(B") ("ryo"  "\e(IX.\e(B")))
+    (its-defrule (car r) (cadr r))
+    (its-defrule (concat "r" (car r)) (concat "\e(I/\e(B" (cadr r))))
+  (its-defoutput "rr" "\e(I/\e(Br")
+  (its-defoutput "rry" "\e(I/\e(Bry")
+
+  (dolist (l '(("la"  "\e(IW\e(B") ("li"  "\e(IX\e(B") ("lu"  "\e(IY\e(B") ("le"  "\e(IZ\e(B") ("lo"  "\e(I[\e(B")
+              ("lya"  "\e(IX,\e(B") ("lyu"  "\e(IX-\e(B") ("lye"  "\e(IX*\e(B") ("lyo"  "\e(IX.\e(B")))
+    (its-defrule (car l) (cadr l))
+    (its-defrule (concat "l" (car l)) (concat "\e(I/\e(B" (cadr l))))
+  (its-defoutput "ll" "\e(I/\e(Bl")
+  (its-defoutput "lly" "\e(I/\e(Bly")
+
+  (dolist (g '(("ga"  "\e(I6^\e(B") ("gi"  "\e(I7^\e(B") ("gu"  "\e(I8^\e(B") ("ge"  "\e(I9^\e(B") ("go"  "\e(I:^\e(B")
+              ("gya"  "\e(I7^,\e(B") ("gyu"  "\e(I7^-\e(B") ("gye"  "\e(I7^*\e(B") ("gyo"  "\e(I7^.\e(B")))
+    (its-defrule (car g) (cadr g))
+    (its-defrule (concat "g" (car g)) (concat "\e(I/\e(B" (cadr g))))
+  (its-defoutput "gg" "\e(I/\e(Bg")
+  (its-defoutput "ggy" "\e(I/\e(Bgy")
+
+  (dolist (z '(("za"  "\e(I;^\e(B") ("zi"  "\e(I<^\e(B") ("zu"  "\e(I=^\e(B") ("ze"  "\e(I>^\e(B") ("zo"  "\e(I?^\e(B")
+              ("zya"  "\e(I<^,\e(B") ("zyu"  "\e(I<^-\e(B") ("zye"  "\e(I<^*\e(B") ("zyo"  "\e(I<^.\e(B")))
+    (its-defrule (car z) (cadr z))
+    (its-defrule (concat "z" (car z)) (concat "\e(I/\e(B" (cadr z))))
+  (its-defoutput "zz" "\e(I/\e(Bz")
+  (its-defoutput "zzy" "\e(I/\e(Bzy")
+
+  (dolist (j '(("ja"  "\e(I<^,\e(B") ("ji"  "\e(I<^\e(B") ("ju"  "\e(I<^-\e(B") ("je"  "\e(I<^*\e(B")
+              ("jo"  "\e(I<^.\e(B") ("jya"  "\e(I<^,\e(B") ("jyu"  "\e(I<^-\e(B") ("jye"  "\e(I<^*\e(B")
+              ("jyo"  "\e(I<^.\e(B")))
+    (its-defrule (car j) (cadr j))
+    (its-defrule (concat "j" (car j)) (concat "\e(I/\e(B" (cadr j))))
+  (its-defoutput "jj" "\e(I/\e(Bj")
+  (its-defoutput "jjy" "\e(I/\e(Bjy")
+
+  (dolist (d '(("da"  "\e(I@^\e(B") ("di"  "\e(IA^\e(B") ("du"  "\e(IB^\e(B") ("de"  "\e(IC^\e(B") ("do"  "\e(ID^\e(B")
+              ("dya"  "\e(IA^,\e(B") ("dyi"  "\e(IC^(\e(B") ("dyu"  "\e(IA^-\e(B") ("dye"  "\e(IA^*\e(B")
+              ("dyo"  "\e(IA^.\e(B")))
+    (its-defrule (car d) (cadr d))
+    (its-defrule (concat "d" (car d)) (concat "\e(I/\e(B" (cadr d))))
+  (its-defoutput "dd" "\e(I/\e(Bd")
+  (its-defoutput "ddy" "\e(I/\e(Bdy")
+
+  (dolist (b '(("ba"  "\e(IJ^\e(B") ("bi"  "\e(IK^\e(B") ("bu"  "\e(IL^\e(B") ("be"  "\e(IM^\e(B") ("bo"  "\e(IN^\e(B")
+              ("bya"  "\e(IK^,\e(B") ("byu"  "\e(IK^-\e(B") ("bye"  "\e(IK^*\e(B") ("byo"  "\e(IK^.\e(B")))
+    (its-defrule (car b) (cadr b))
+    (its-defrule (concat "b" (car b)) (concat "\e(I/\e(B" (cadr b))))
+  (its-defoutput "bb" "\e(I/\e(Bb")
+  (its-defoutput "bby" "\e(I/\e(Bby")
+
+  (dolist (p '(("pa"  "\e(IJ_\e(B") ("pi"  "\e(IK_\e(B") ("pu"  "\e(IL_\e(B") ("pe"  "\e(IM_\e(B") ("po"   "\e(IN_\e(B")
+              ("pya"  "\e(IK_,\e(B") ("pyu"  "\e(IK_-\e(B") ("pye"  "\e(IK_*\e(B") ("pyo"  "\e(IK_.\e(B")))
+    (its-defrule (car p) (cadr p))
+    (its-defrule (concat "p" (car p)) (concat "\e(I/\e(B" (cadr p))))
+  (its-defoutput "pp" "\e(I/\e(Bp")
+  (its-defoutput "ppy" "\e(I/\e(Bpy")
+
+  (dolist (v '(("va" "\e(I3^'\e(B") ("vi" "\e(I3^(\e(B") ("vu" "\e(I3^\e(B") ("ve" "\e(I3^*\e(B")
+              ("vo" "\e(I3^+\e(B")))
+    (its-defrule (car v) (cadr v))
+    (its-defrule (concat "v" (car v)) (concat "\e(I/\e(B" (cadr v))))
+  (its-defoutput "vv" "\e(I/\e(Bv")
+
+  (its-defrule   "ma"   "\e(IO\e(B")
+  (its-defrule   "mi"   "\e(IP\e(B")
+  (its-defrule   "mu"   "\e(IQ\e(B")
+  (its-defrule   "me"   "\e(IR\e(B")
+  (its-defrule   "mo"   "\e(IS\e(B")
+  (its-defrule   "mya"  "\e(IP,\e(B")
+  (its-defrule   "myu"  "\e(IP-\e(B")
+  (its-defrule   "mye"  "\e(IP*\e(B")
+  (its-defrule   "myo"  "\e(IP.\e(B")
+  (its-defrule   "ya"   "\e(IT\e(B")
+  (its-defrule   "yi"   "\e(I2\e(B")
+  (its-defrule   "yu"   "\e(IU\e(B")
+  (its-defrule   "yo"   "\e(IV\e(B")
+  (its-defrule   "ye"   "\e(I2*\e(B")
+  (its-defrule   "wa"   "\e(I\\e(B")
+  (its-defrule   "wi"   "\e(I(\e(B")
+  (its-defrule   "wu"   "\e(I3\e(B")
+  (its-defrule   "we"   "\e(I*\e(B")
+  (its-defrule   "wo"   "\e(I&\e(B")
+
+  (its-defrule   "kwa"  "\e(I8\\e(B")
+  (its-defrule   "kwi"  "\e(I8(\e(B")
+  (its-defrule   "kwu"  "\e(I8\e(B")
+  (its-defrule   "kwe"  "\e(I8*\e(B")
+  (its-defrule   "kwo"  "\e(I8+\e(B")
+  (its-defrule   "gwa"  "\e(I8^\\e(B")
+  (its-defrule   "gwi"  "\e(I8^(\e(B")
+  (its-defrule   "gwu"  "\e(I8^\e(B")
+  (its-defrule   "gwe"  "\e(I8^*\e(B")
+  (its-defrule   "gwo"  "\e(I8^+\e(B")
+  (its-defrule   "tsa"  "\e(IB'\e(B")
+  (its-defrule   "tsi"  "\e(IB(\e(B")
+  (its-defrule   "tse"  "\e(IB*\e(B")
+  (its-defrule   "tso"  "\e(IB+\e(B")
+
+  (its-defrule   "na"   "\e(IE\e(B")
+  (its-defrule   "ni"   "\e(IF\e(B")
+  (its-defrule   "nu"   "\e(IG\e(B")
+  (its-defrule   "ne"   "\e(IH\e(B")
+  (its-defrule   "no"   "\e(II\e(B")
+  (its-defrule   "nya"  "\e(IF,\e(B")
+  (its-defrule   "nyu"  "\e(IF-\e(B")
+  (its-defrule   "nye"  "\e(IF*\e(B")
+  (its-defrule   "nyo"  "\e(IF.\e(B")
+
+  (its-defrule   "xti"  "\e(IC(\e(B")
+  (its-defrule   "xdi"  "\e(IC^(\e(B")
+  (its-defrule   "xdu"  "\e(ID^)\e(B")
+  (its-defrule   "xde"  "\e(IC^*\e(B")
+  (its-defrule   "xdo"  "\e(ID^+\e(B")
+  (its-defrule   "xwi"  "\e(I3(\e(B")
+  (its-defrule   "xwe"  "\e(I3*\e(B")
+  (its-defrule   "xwo"  "\e(I3+\e(B")
+
+;;;
+;;; Symbol inputs
+;;;
+
+  (dolist (digit '( "1"  "2"  "3"  "4" "5"  "6"  "7"  "8"  "9"  "0" ))
+    (its-defrule (concat its-hankaku-escape digit)  digit))
+
+  (dolist (symbol '( " "  "!"  "@"  "#"  "$"  "%"  "^"  "&"  "*"  "("  ")"
+                    "-"  "="  "`"  "\\" "|"  "_"  "+"  "~" "["  "]"  "{"  "}"
+                    ":"  ";"  "\"" "'"  "<"  ">"  "?"  "/"  ","  "." ))
+    (its-defrule (concat its-hankaku-escape symbol) symbol))
+
+  (dolist (downcase '("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"
+                     "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"))
+    (its-defrule (concat its-hankaku-escape downcase) downcase))
+
+  (dolist (upcase    '("A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N"
+                      "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"))
+    (its-defrule (concat its-hankaku-escape upcase) upcase)))
+
+(define-its-state-machine-append its-han-kata-map
+  (if its-han-kata-enable-double-n
+      (its-defrule "nn" "\e(I]\e(B"))
+
+  (its-defrule "-" its-han-kata-horizontal)
+  (its-defrule "[" its-han-kata-open-bracket)
+  (its-defrule "]" its-han-kata-close-bracket)
+  (its-defrule "." its-han-kata-period)
+  (its-defrule "," its-han-kata-comma)
+  )
+
+(provide 'its/hankata)
+;;; its/kata.el ends here.
diff --git a/its/hira.el b/its/hira.el
new file mode 100644 (file)
index 0000000..502c362
--- /dev/null
@@ -0,0 +1,494 @@
+;;; its/hira.el --- Hiragana Input in Egg Input Method Architecture
+
+;; Copyright (C) 1995 Electrotechnical Laboratory, JAPAN.
+;; Licensed to the Free Software Foundation.
+
+;; Author: Satoru Tomura <tomura@etl.go.jp>
+;;         jiro@math.keio.ac.jp (TANAKA Jiro)
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+;;
+;; Symbol input is desined by jiro@math.keio.ac.jp (TANAKA Jiro)
+;; This file is based on the rules of its/hira.el in Mule-2.3 distribution.
+;;
+
+;;; Code:
+
+(eval-when-compile
+  (require 'its)
+  (require 'cl))
+
+(eval-when (compile)
+  (defconst its-compaction-enable t))
+
+(defvar its-hira-enable-zenkaku-alphabet
+  (if (boundp 'its-enable-fullwidth-alphabet)
+      its-enable-fullwidth-alphabet
+    t)
+  "*Enable Zenkaku alphabet")
+
+(defvar its-hira-enable-double-n nil "*Enable \"nn\" input for \"\e$B$s\e(B\" ")
+(defvar its-hira-period "\e$B!#\e(B" "*\e$B%T%j%*%I\e(B")  ; ". " "\e$B!%\e(B"
+(defvar its-hira-comma  "\e$B!"\e(B" "*\e$B%3%s%^\e(B")    ; ", " "\e$B!$\e(B"
+(defvar its-hira-open-bracket  "\e$B!V\e(B" "*[")  ; "\e$B!N\e(B"
+(defvar its-hira-close-bracket  "\e$B!W\e(B" "*]") ; "\e$B!O\e(B"
+(defvar its-hira-horizontal  "\e$B!<\e(B" "*-")    ; "\e$B!]\e(B"
+
+(define-its-state-machine its-hira-map
+  "roma-kana" "\e$B$"\e(B" Japanese
+  "Map for Romaji-Hiragana translation. (Japanese)"
+
+  (defconst its-zenkaku-escape "Z")  ;; Escape character to Zenkaku inputs
+  (defconst its-hankaku-escape "~")  ;; Escape character to Hankaku inputs
+
+  (its-defrule-select-mode-temporally "q" downcase)
+  (its-defrule-select-mode-temporally "Q" zenkaku-downcase)
+
+;;; k      k
+;;; kk     \e$B$C\e(Bk
+;;; kka    \e$B$C$+\e(B
+;;;
+;;; kkk    \e$B$C\e(Bk DING!
+
+  (its-defrule "tch"  "\e$B$C\e(B" -2)
+
+;;; \e$B!V$s!W$NF~NO\e(B
+
+  (dolist (q1 '("b" "m" "p"))
+    (its-defrule (concat "m" q1) "\e$B$s\e(B" -1))
+
+  (its-defrule* "n"  "\e$B$s\e(B")
+  (its-defrule  "n'" "\e$B$s\e(B")
+  (its-defrule  "N"  "\e$B$s\e(B")
+
+  (let ((small '"x" ))
+    (its-defrule (concat small "a") "\e$B$!\e(B")
+    (its-defrule (concat small "i") "\e$B$#\e(B")
+    (its-defrule (concat small "u") "\e$B$%\e(B")
+    (its-defrule (concat small "e") "\e$B$'\e(B")
+    (its-defrule (concat small "o") "\e$B$)\e(B")
+    (its-defrule (concat small "ya") "\e$B$c\e(B")
+    (its-defrule (concat small "yu") "\e$B$e\e(B")
+    (its-defrule (concat small "yo") "\e$B$g\e(B")
+    (its-defrule (concat small "tu") "\e$B$C\e(B")
+    (its-defrule (concat small "tsu") "\e$B$C\e(B")
+    (its-defrule (concat small "wa") "\e$B$n\e(B")
+    )
+
+  (its-defrule   "a"    "\e$B$"\e(B")
+  (its-defrule   "i"    "\e$B$$\e(B")
+  (its-defrule   "u"    "\e$B$&\e(B")
+  (its-defrule   "e"    "\e$B$(\e(B")
+  (its-defrule   "o"    "\e$B$*\e(B")
+
+  (dolist (k '(("ka"  "\e$B$+\e(B") ("ki"  "\e$B$-\e(B") ("ku"  "\e$B$/\e(B") ("ke"  "\e$B$1\e(B") ("ko"  "\e$B$3\e(B")
+              ("kya" "\e$B$-$c\e(B") ("kyu"  "\e$B$-$e\e(B") ("kye"  "\e$B$-$'\e(B") ("kyo"  "\e$B$-$g\e(B")))
+    (its-defrule (car k) (cadr k))
+    (its-defrule (concat "k" (car k)) (concat "\e$B$C\e(B" (cadr k))))
+  (its-defoutput "kk" "\e$B$C\e(Bk")
+  (its-defoutput "kky" "\e$B$C\e(Bky")
+
+  (dolist (s '(("sa"  "\e$B$5\e(B") ("si"  "\e$B$7\e(B") ("su"  "\e$B$9\e(B") ("se"  "\e$B$;\e(B") ("so"  "\e$B$=\e(B")
+              ("sya"  "\e$B$7$c\e(B") ("syu"  "\e$B$7$e\e(B") ("sye"  "\e$B$7$'\e(B") ("syo"  "\e$B$7$g\e(B")
+              ("sha"  "\e$B$7$c\e(B") ("shi"  "\e$B$7\e(B") ("shu"  "\e$B$7$e\e(B") ("she"  "\e$B$7$'\e(B")
+              ("sho"  "\e$B$7$g\e(B")))
+    (its-defrule (car s) (cadr s))
+    (its-defrule (concat "s" (car s)) (concat "\e$B$C\e(B" (cadr s))))
+  (its-defoutput "ss" "\e$B$C\e(Bs")
+  (its-defoutput "ssy" "\e$B$C\e(Bsy")
+  (its-defoutput "ssh" "\e$B$C\e(Bsh")
+
+  (dolist (T '(("ta"  "\e$B$?\e(B") ("ti"  "\e$B$A\e(B") ("tu"  "\e$B$D\e(B") ("te"  "\e$B$F\e(B") ("to"  "\e$B$H\e(B")
+              ("tya"  "\e$B$A$c\e(B") ("tyi"  "\e$B$F$#\e(B") ("tyu"  "\e$B$A$e\e(B") ("tye"  "\e$B$A$'\e(B")
+              ("tyo"  "\e$B$A$g\e(B") ("tsu"  "\e$B$D\e(B")))
+    (its-defrule (car T) (cadr T))
+    (its-defrule (concat "t" (car T)) (concat "\e$B$C\e(B" (cadr T))))
+  (its-defoutput "tt" "\e$B$C\e(Bt")
+  (its-defoutput "tty" "\e$B$C\e(Bty")
+  (its-defoutput "tts" "\e$B$C\e(Bts")
+
+  (dolist (c '(("cha"  "\e$B$A$c\e(B") ("chi"  "\e$B$A\e(B") ("chu"  "\e$B$A$e\e(B")
+              ("che"  "\e$B$A$'\e(B") ("cho"  "\e$B$A$g\e(B")))
+    (its-defrule (car c) (cadr c))
+    (its-defrule (concat "c" (car c)) (concat "\e$B$C\e(B" (cadr c))))
+  (its-defoutput "cc" "\e$B$C\e(Bc")
+  (its-defoutput "cch" "\e$B$C\e(Bch")
+
+  (dolist (h '(("ha"  "\e$B$O\e(B") ("hi"  "\e$B$R\e(B") ("hu"  "\e$B$U\e(B") ("he"  "\e$B$X\e(B") ("ho"  "\e$B$[\e(B")
+              ("hya"  "\e$B$R$c\e(B") ("hyu"  "\e$B$R$e\e(B") ("hye"  "\e$B$R$'\e(B") ("hyo"  "\e$B$R$g\e(B")))
+    (its-defrule (car h) (cadr h))
+    (its-defrule (concat "h" (car h)) (concat "\e$B$C\e(B" (cadr h))))
+  (its-defoutput "hh" "\e$B$C\e(Bh")
+  (its-defoutput "hhy" "\e$B$C\e(Bhy")
+
+  (dolist (f '(("fa"  "\e$B$U$!\e(B") ("fi"  "\e$B$U$#\e(B") ("fu"  "\e$B$U\e(B") ("fe"  "\e$B$U$'\e(B")
+              ("fo"  "\e$B$U$)\e(B")))
+    (its-defrule (car f) (cadr f))
+    (its-defrule (concat "f" (car f)) (concat "\e$B$C\e(B" (cadr f))))
+  (its-defoutput "ff" "\e$B$C\e(Bf")
+
+  (dolist (r '(("ra"  "\e$B$i\e(B") ("ri"  "\e$B$j\e(B") ("ru"  "\e$B$k\e(B") ("re"  "\e$B$l\e(B") ("ro"  "\e$B$m\e(B")
+              ("rya"  "\e$B$j$c\e(B") ("ryu"  "\e$B$j$e\e(B") ("rye"  "\e$B$j$'\e(B") ("ryo"  "\e$B$j$g\e(B")))
+    (its-defrule (car r) (cadr r))
+    (its-defrule (concat "r" (car r)) (concat "\e$B$C\e(B" (cadr r))))
+  (its-defoutput "rr" "\e$B$C\e(Br")
+  (its-defoutput "rry" "\e$B$C\e(Bry")
+
+  (dolist (l '(("la"  "\e$B$i\e(B") ("li"  "\e$B$j\e(B") ("lu"  "\e$B$k\e(B") ("le"  "\e$B$l\e(B") ("lo"  "\e$B$m\e(B")
+              ("lya"  "\e$B$j$c\e(B") ("lyu"  "\e$B$j$e\e(B") ("lye"  "\e$B$j$'\e(B") ("lyo"  "\e$B$j$g\e(B")))
+    (its-defrule (car l) (cadr l))
+    (its-defrule (concat "l" (car l)) (concat "\e$B$C\e(B" (cadr l))))
+  (its-defoutput "ll" "\e$B$C\e(Bl")
+  (its-defoutput "lly" "\e$B$C\e(Bly")
+
+  (dolist (g '(("ga"  "\e$B$,\e(B") ("gi"  "\e$B$.\e(B") ("gu"  "\e$B$0\e(B") ("ge"  "\e$B$2\e(B") ("go"  "\e$B$4\e(B")
+              ("gya"  "\e$B$.$c\e(B") ("gyu"  "\e$B$.$e\e(B") ("gye"  "\e$B$.$'\e(B") ("gyo"  "\e$B$.$g\e(B")))
+    (its-defrule (car g) (cadr g))
+    (its-defrule (concat "g" (car g)) (concat "\e$B$C\e(B" (cadr g))))
+  (its-defoutput "gg" "\e$B$C\e(Bg")
+  (its-defoutput "ggy" "\e$B$C\e(Bgy")
+
+  (dolist (z '(("za"  "\e$B$6\e(B") ("zi"  "\e$B$8\e(B") ("zu"  "\e$B$:\e(B") ("ze"  "\e$B$<\e(B") ("zo"  "\e$B$>\e(B")
+              ("zya"  "\e$B$8$c\e(B") ("zyu"  "\e$B$8$e\e(B") ("zye"  "\e$B$8$'\e(B") ("zyo"  "\e$B$8$g\e(B")))
+    (its-defrule (car z) (cadr z))
+    (its-defrule (concat "z" (car z)) (concat "\e$B$C\e(B" (cadr z))))
+  (its-defoutput "zz" "\e$B$C\e(Bz")
+  (its-defoutput "zzy" "\e$B$C\e(Bzy")
+
+  (dolist (j '(("ja"  "\e$B$8$c\e(B") ("ji"  "\e$B$8\e(B") ("ju"  "\e$B$8$e\e(B") ("je"  "\e$B$8$'\e(B")
+              ("jo"  "\e$B$8$g\e(B") ("jya"  "\e$B$8$c\e(B") ("jyu"  "\e$B$8$e\e(B") ("jye"  "\e$B$8$'\e(B")
+              ("jyo"  "\e$B$8$g\e(B")))
+    (its-defrule (car j) (cadr j))
+    (its-defrule (concat "j" (car j)) (concat "\e$B$C\e(B" (cadr j))))
+  (its-defoutput "jj" "\e$B$C\e(Bj")
+  (its-defoutput "jjy" "\e$B$C\e(Bjy")
+
+  (dolist (d '(("da"  "\e$B$@\e(B") ("di"  "\e$B$B\e(B") ("du"  "\e$B$E\e(B") ("de"  "\e$B$G\e(B") ("do"  "\e$B$I\e(B")
+              ("dya"  "\e$B$B$c\e(B") ("dyi"  "\e$B$G$#\e(B") ("dyu"  "\e$B$B$e\e(B") ("dye"  "\e$B$B$'\e(B")
+              ("dyo"  "\e$B$B$g\e(B")))
+    (its-defrule (car d) (cadr d))
+    (its-defrule (concat "d" (car d)) (concat "\e$B$C\e(B" (cadr d))))
+  (its-defoutput "dd" "\e$B$C\e(Bd")
+  (its-defoutput "ddy" "\e$B$C\e(Bdy")
+
+  (dolist (b '(("ba"  "\e$B$P\e(B") ("bi"  "\e$B$S\e(B") ("bu"  "\e$B$V\e(B") ("be"  "\e$B$Y\e(B") ("bo"  "\e$B$\\e(B")
+              ("bya"  "\e$B$S$c\e(B") ("byu"  "\e$B$S$e\e(B") ("bye"  "\e$B$S$'\e(B") ("byo"  "\e$B$S$g\e(B")))
+    (its-defrule (car b) (cadr b))
+    (its-defrule (concat "b" (car b)) (concat "\e$B$C\e(B" (cadr b))))
+  (its-defoutput "bb" "\e$B$C\e(Bb")
+  (its-defoutput "bby" "\e$B$C\e(Bby")
+
+  (dolist (p '(("pa"  "\e$B$Q\e(B") ("pi"  "\e$B$T\e(B") ("pu"  "\e$B$W\e(B") ("pe"  "\e$B$Z\e(B") ("po"   "\e$B$]\e(B")
+              ("pya"  "\e$B$T$c\e(B") ("pyu"  "\e$B$T$e\e(B") ("pye"  "\e$B$T$'\e(B") ("pyo"  "\e$B$T$g\e(B")))
+    (its-defrule (car p) (cadr p))
+    (its-defrule (concat "p" (car p)) (concat "\e$B$C\e(B" (cadr p))))
+  (its-defoutput "pp" "\e$B$C\e(Bp")
+  (its-defoutput "ppy" "\e$B$C\e(Bpy")
+
+  (dolist (v '(("va" "\e$B%t$!\e(B") ("vi" "\e$B%t$#\e(B") ("vu" "\e$B%t\e(B") ("ve" "\e$B%t$'\e(B")
+              ("vo" "\e$B%t$)\e(B")))
+    (its-defrule (car v) (cadr v))
+    (its-defrule (concat "v" (car v)) (concat "\e$B$C\e(B" (cadr v))))
+  (its-defoutput "vv" "\e$B$C\e(Bv")
+
+  (its-defrule   "ma"   "\e$B$^\e(B")
+  (its-defrule   "mi"   "\e$B$_\e(B")
+  (its-defrule   "mu"   "\e$B$`\e(B")
+  (its-defrule   "me"   "\e$B$a\e(B")
+  (its-defrule   "mo"   "\e$B$b\e(B")
+  (its-defrule   "mya"  "\e$B$_$c\e(B")
+  (its-defrule   "myu"  "\e$B$_$e\e(B")
+  (its-defrule   "mye"  "\e$B$_$'\e(B")
+  (its-defrule   "myo"  "\e$B$_$g\e(B")
+  (its-defrule   "ya"   "\e$B$d\e(B")
+  (its-defrule   "yi"   "\e$B$$\e(B")
+  (its-defrule   "yu"   "\e$B$f\e(B")
+  (its-defrule   "yo"   "\e$B$h\e(B")
+  (its-defrule   "ye"   "\e$B$$$'\e(B")
+  (its-defrule   "wa"   "\e$B$o\e(B")
+  (its-defrule   "wi"   "\e$B$p\e(B")
+  (its-defrule   "wu"   "\e$B$&\e(B")
+  (its-defrule   "we"   "\e$B$q\e(B")
+  (its-defrule   "wo"   "\e$B$r\e(B")
+
+  (its-defrule   "kwa"  "\e$B$/$n\e(B")
+  (its-defrule   "kwi"  "\e$B$/$#\e(B")
+  (its-defrule   "kwu"  "\e$B$/\e(B")
+  (its-defrule   "kwe"  "\e$B$/$'\e(B")
+  (its-defrule   "kwo"  "\e$B$/$)\e(B")
+  (its-defrule   "gwa"  "\e$B$0$n\e(B")
+  (its-defrule   "gwi"  "\e$B$0$#\e(B")
+  (its-defrule   "gwu"  "\e$B$0\e(B")
+  (its-defrule   "gwe"  "\e$B$0$'\e(B")
+  (its-defrule   "gwo"  "\e$B$0$)\e(B")
+  (its-defrule   "tsa"  "\e$B$D$!\e(B")
+  (its-defrule   "tsi"  "\e$B$D$#\e(B")
+  (its-defrule   "tse"  "\e$B$D$'\e(B")
+  (its-defrule   "tso"  "\e$B$D$)\e(B")
+
+  (its-defrule   "na"   "\e$B$J\e(B")
+  (its-defrule   "ni"   "\e$B$K\e(B")
+  (its-defrule   "nu"   "\e$B$L\e(B")
+  (its-defrule   "ne"   "\e$B$M\e(B")
+  (its-defrule   "no"   "\e$B$N\e(B")
+  (its-defrule   "nya"  "\e$B$K$c\e(B")
+  (its-defrule   "nyu"  "\e$B$K$e\e(B")
+  (its-defrule   "nye"  "\e$B$K$'\e(B")
+  (its-defrule   "nyo"  "\e$B$K$g\e(B")
+
+  (its-defrule   "xka"  "\e$B%u\e(B")
+  (its-defrule   "xke"  "\e$B%v\e(B")
+  (its-defrule   "xti"  "\e$B$F$#\e(B")
+  (its-defrule   "xdi"  "\e$B$G$#\e(B")
+  (its-defrule   "xdu"  "\e$B$I$%\e(B")
+  (its-defrule   "xde"  "\e$B$G$'\e(B")
+  (its-defrule   "xdo"  "\e$B$I$)\e(B")
+  (its-defrule   "xwi"  "\e$B$&$#\e(B")
+  (its-defrule   "xwe"  "\e$B$&$'\e(B")
+  (its-defrule   "xwo"  "\e$B$&$)\e(B")
+
+;;;
+;;; Zenkaku inputs
+;;;
+
+  (its-defrule (concat its-zenkaku-escape "0") "\e$B#0\e(B")
+  (its-defrule (concat its-zenkaku-escape "1") "\e$B#1\e(B")
+  (its-defrule (concat its-zenkaku-escape "2") "\e$B#2\e(B")
+  (its-defrule (concat its-zenkaku-escape "3") "\e$B#3\e(B")
+  (its-defrule (concat its-zenkaku-escape "4") "\e$B#4\e(B")
+  (its-defrule (concat its-zenkaku-escape "5") "\e$B#5\e(B")
+  (its-defrule (concat its-zenkaku-escape "6") "\e$B#6\e(B")
+  (its-defrule (concat its-zenkaku-escape "7") "\e$B#7\e(B")
+  (its-defrule (concat its-zenkaku-escape "8") "\e$B#8\e(B")
+  (its-defrule (concat its-zenkaku-escape "9") "\e$B#9\e(B")
+
+  (its-defrule (concat its-zenkaku-escape "A") "\e$B#A\e(B")
+  (its-defrule (concat its-zenkaku-escape "B") "\e$B#B\e(B")
+  (its-defrule (concat its-zenkaku-escape "C") "\e$B#C\e(B")
+  (its-defrule (concat its-zenkaku-escape "D") "\e$B#D\e(B")
+  (its-defrule (concat its-zenkaku-escape "E") "\e$B#E\e(B")
+  (its-defrule (concat its-zenkaku-escape "F") "\e$B#F\e(B")
+  (its-defrule (concat its-zenkaku-escape "G") "\e$B#G\e(B")
+  (its-defrule (concat its-zenkaku-escape "H") "\e$B#H\e(B")
+  (its-defrule (concat its-zenkaku-escape "I") "\e$B#I\e(B")
+  (its-defrule (concat its-zenkaku-escape "J") "\e$B#J\e(B")
+  (its-defrule (concat its-zenkaku-escape "K") "\e$B#K\e(B")
+  (its-defrule (concat its-zenkaku-escape "L") "\e$B#L\e(B")
+  (its-defrule (concat its-zenkaku-escape "M") "\e$B#M\e(B")
+  (its-defrule (concat its-zenkaku-escape "N") "\e$B#N\e(B")
+  (its-defrule (concat its-zenkaku-escape "O") "\e$B#O\e(B")
+  (its-defrule (concat its-zenkaku-escape "P") "\e$B#P\e(B")
+  (its-defrule (concat its-zenkaku-escape "Q") "\e$B#Q\e(B")
+  (its-defrule (concat its-zenkaku-escape "R") "\e$B#R\e(B")
+  (its-defrule (concat its-zenkaku-escape "S") "\e$B#S\e(B")
+  (its-defrule (concat its-zenkaku-escape "T") "\e$B#T\e(B")
+  (its-defrule (concat its-zenkaku-escape "U") "\e$B#U\e(B")
+  (its-defrule (concat its-zenkaku-escape "V") "\e$B#V\e(B")
+  (its-defrule (concat its-zenkaku-escape "W") "\e$B#W\e(B")
+  (its-defrule (concat its-zenkaku-escape "X") "\e$B#X\e(B")
+  (its-defrule (concat its-zenkaku-escape "Y") "\e$B#Y\e(B")
+  (its-defrule (concat its-zenkaku-escape "Z") "\e$B#Z\e(B")
+
+  (its-defrule (concat its-zenkaku-escape "a") "\e$B#a\e(B")
+  (its-defrule (concat its-zenkaku-escape "b") "\e$B#b\e(B")
+  (its-defrule (concat its-zenkaku-escape "c") "\e$B#c\e(B")
+  (its-defrule (concat its-zenkaku-escape "d") "\e$B#d\e(B")
+  (its-defrule (concat its-zenkaku-escape "e") "\e$B#e\e(B")
+  (its-defrule (concat its-zenkaku-escape "f") "\e$B#f\e(B")
+  (its-defrule (concat its-zenkaku-escape "g") "\e$B#g\e(B")
+  (its-defrule (concat its-zenkaku-escape "h") "\e$B#h\e(B")
+  (its-defrule (concat its-zenkaku-escape "i") "\e$B#i\e(B")
+  (its-defrule (concat its-zenkaku-escape "j") "\e$B#j\e(B")
+  (its-defrule (concat its-zenkaku-escape "k") "\e$B#k\e(B")
+  (its-defrule (concat its-zenkaku-escape "l") "\e$B#l\e(B")
+  (its-defrule (concat its-zenkaku-escape "m") "\e$B#m\e(B")
+  (its-defrule (concat its-zenkaku-escape "n") "\e$B#n\e(B")
+  (its-defrule (concat its-zenkaku-escape "o") "\e$B#o\e(B")
+  (its-defrule (concat its-zenkaku-escape "p") "\e$B#p\e(B")
+  (its-defrule (concat its-zenkaku-escape "q") "\e$B#q\e(B")
+  (its-defrule (concat its-zenkaku-escape "r") "\e$B#r\e(B")
+  (its-defrule (concat its-zenkaku-escape "s") "\e$B#s\e(B")
+  (its-defrule (concat its-zenkaku-escape "t") "\e$B#t\e(B")
+  (its-defrule (concat its-zenkaku-escape "u") "\e$B#u\e(B")
+  (its-defrule (concat its-zenkaku-escape "v") "\e$B#v\e(B")
+  (its-defrule (concat its-zenkaku-escape "w") "\e$B#w\e(B")
+  (its-defrule (concat its-zenkaku-escape "x") "\e$B#x\e(B")
+  (its-defrule (concat its-zenkaku-escape "y") "\e$B#y\e(B")
+  (its-defrule (concat its-zenkaku-escape "z") "\e$B#z\e(B")
+
+  (its-defrule (concat its-zenkaku-escape " ")  "\e$B!!\e(B")
+  (its-defrule (concat its-zenkaku-escape "!")  "\e$B!*\e(B")
+  (its-defrule (concat its-zenkaku-escape "@")  "\e$B!w\e(B")
+  (its-defrule (concat its-zenkaku-escape "#")  "\e$B!t\e(B")
+  (its-defrule (concat its-zenkaku-escape "$")  "\e$B!p\e(B")
+  (its-defrule (concat its-zenkaku-escape "%")  "\e$B!s\e(B")
+  (its-defrule (concat its-zenkaku-escape "^")  "\e$B!0\e(B")
+  (its-defrule (concat its-zenkaku-escape "&")  "\e$B!u\e(B")
+  (its-defrule (concat its-zenkaku-escape "*")  "\e$B!v\e(B")
+  (its-defrule (concat its-zenkaku-escape "(")  "\e$B!J\e(B")
+  (its-defrule (concat its-zenkaku-escape ")")  "\e$B!K\e(B")
+  (its-defrule (concat its-zenkaku-escape "-")  "\e$B!]\e(B")
+  (its-defrule (concat its-zenkaku-escape "=")  "\e$B!a\e(B")
+  (its-defrule (concat its-zenkaku-escape "`")  "\e$B!.\e(B")
+  (its-defrule (concat its-zenkaku-escape "\\") "\e$B!o\e(B")
+  (its-defrule (concat its-zenkaku-escape "|")  "\e$B!C\e(B")
+  (its-defrule (concat its-zenkaku-escape "_")  "\e$B!2\e(B")
+  (its-defrule (concat its-zenkaku-escape "+")  "\e$B!\\e(B")
+  (its-defrule (concat its-zenkaku-escape "~")  "\e$B!1\e(B")
+  (its-defrule (concat its-zenkaku-escape "[")  "\e$B!N\e(B")
+  (its-defrule (concat its-zenkaku-escape "]")  "\e$B!O\e(B")
+  (its-defrule (concat its-zenkaku-escape "{")  "\e$B!P\e(B")
+  (its-defrule (concat its-zenkaku-escape "}")  "\e$B!Q\e(B")
+  (its-defrule (concat its-zenkaku-escape ":")  "\e$B!'\e(B")
+  (its-defrule (concat its-zenkaku-escape ";")  "\e$B!(\e(B")
+  (its-defrule (concat its-zenkaku-escape "\"") "\e$B!I\e(B")
+  (its-defrule (concat its-zenkaku-escape "'")  "\e$B!G\e(B")
+  (its-defrule (concat its-zenkaku-escape "<")  "\e$B!c\e(B")
+  (its-defrule (concat its-zenkaku-escape ">")  "\e$B!d\e(B")
+  (its-defrule (concat its-zenkaku-escape "?")  "\e$B!)\e(B")
+  (its-defrule (concat its-zenkaku-escape "/")  "\e$B!?\e(B")
+  (its-defrule (concat its-zenkaku-escape ",")  "\e$B!$\e(B")
+  (its-defrule (concat its-zenkaku-escape ".")  "\e$B!%\e(B")
+
+;;;
+;;; Hankaku inputs
+;;;
+
+  (dolist (digit '( "1"  "2"  "3"  "4" "5"  "6"  "7"  "8"  "9"  "0" ))
+    (its-defrule (concat its-hankaku-escape digit)  digit))
+
+  (dolist (symbol '( " "  "!"  "@"  "#"  "$"  "%"  "^"  "&"  "*"  "("  ")"
+                    "-"  "="  "`"  "\\" "|"  "_"  "+"  "~" "["  "]"  "{"  "}"
+                    ":"  ";"  "\"" "'"  "<"  ">"  "?"  "/"  ","  "." ))
+    (its-defrule (concat its-hankaku-escape symbol) symbol))
+
+  (dolist (downcase '("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"
+                     "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"))
+    (its-defrule (concat its-hankaku-escape downcase) downcase))
+
+  (dolist (upcase    '("A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N"
+                      "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"))
+    (its-defrule (concat its-hankaku-escape upcase) upcase))
+
+;; SYMBOL Input
+  (its-defrule   "z1"   "\e$B!{\e(B")    (its-defrule   "z!"   "\e$B!|\e(B")
+  (its-defrule   "z2"   "\e$B"&\e(B")    (its-defrule   "z@"   "\e$B"'\e(B")
+  (its-defrule   "z3"   "\e$B"$\e(B")    (its-defrule   "z#"   "\e$B"%\e(B")
+  (its-defrule   "z4"   "\e$B""\e(B")    (its-defrule   "z$"   "\e$B"#\e(B")
+  (its-defrule   "z5"   "\e$B!~\e(B")    (its-defrule   "z%"   "\e$B"!\e(B")
+  (its-defrule   "z6"   "\e$B!y\e(B")    (its-defrule   "z^"   "\e$B!z\e(B")
+  (its-defrule   "z7"   "\e$B!}\e(B")    (its-defrule   "z&"   "\e$B!r\e(B")
+  (its-defrule   "z8"   "\e$B!q\e(B")    (its-defrule   "z*"   "\e$B!_\e(B")
+  (its-defrule   "z9"   "\e$B!i\e(B")    (its-defrule   "z("   "\e$B!Z\e(B")
+  (its-defrule   "z0"   "\e$B!j\e(B")    (its-defrule   "z)"   "\e$B![\e(B")
+  (its-defrule   "z-"   "\e$B!A\e(B")    (its-defrule   "z_"   "\e$B!h\e(B")
+  (its-defrule   "z="   "\e$B!b\e(B")    (its-defrule   "z+"   "\e$B!^\e(B")
+  (its-defrule   "z\\"  "\e$B!@\e(B")    (its-defrule   "z|"   "\e$B!B\e(B")
+  (its-defrule   "z`"   "\e$B!-\e(B")    (its-defrule   "z~"   "\e$B!/\e(B")
+
+  (its-defrule   "zq"   "\e$B!T\e(B")    (its-defrule   "zQ"   "\e$B!R\e(B")
+  (its-defrule   "zw"   "\e$B!U\e(B")    (its-defrule   "zW"   "\e$B!S\e(B")
+                                       ; e
+  (its-defrule   "zr"   "\e$B!9\e(B")    (its-defrule   "zR"   "\e$B!8\e(B")
+  (its-defrule   "zt"   "\e$B!:\e(B")    (its-defrule   "zT"   "\e$B!x\e(B")
+                                       ; y u i o
+  (its-defrule   "zp"   "\e$B")\e(B")    (its-defrule   "zP"   "\e$B",\e(B")
+  (its-defrule   "z["   "\e$B!X\e(B")    (its-defrule   "z{"   "\e$B!L\e(B")
+  (its-defrule   "z]"   "\e$B!Y\e(B")    (its-defrule   "z}"   "\e$B!M\e(B")
+
+                                       ; a
+  (its-defrule   "zs"   "\e$B!3\e(B")    (its-defrule   "zS"   "\e$B!4\e(B")
+  (its-defrule   "zd"   "\e$B!5\e(B")    (its-defrule   "zD"   "\e$B!6\e(B")
+  (its-defrule   "zf"   "\e$B!7\e(B")    (its-defrule   "zF"   "\e$B"*\e(B")
+  (its-defrule   "zg"   "\e$B!>\e(B")    (its-defrule   "zG"   "\e$B!=\e(B")
+  (its-defrule   "zh"   "\e$B"+\e(B")
+  (its-defrule   "zj"   "\e$B"-\e(B")
+  (its-defrule   "zk"   "\e$B",\e(B")
+  (its-defrule   "zl"   "\e$B"*\e(B")
+  (its-defrule   "z;"   "\e$B!+\e(B")    (its-defrule   "z:"   "\e$B!,\e(B")
+  (its-defrule   "z\'"  "\e$B!F\e(B")    (its-defrule   "z\""  "\e$B!H\e(B")
+
+                                       ; z
+  (its-defrule   "zx"   ":-")  (its-defrule   "zX"   ":-)")
+  (its-defrule   "zc"   "\e$B!;\e(B")    (its-defrule   "zC"   "\e$B!n\e(B")
+  (its-defrule   "zv"   "\e$B"(\e(B")    (its-defrule   "zV"   "\e$B!`\e(B")
+  (its-defrule   "zb"   "\e$B!k\e(B")    (its-defrule   "zB"   "\e$B"+\e(B")
+  (its-defrule   "zn"   "\e$B!l\e(B")    (its-defrule   "zN"   "\e$B"-\e(B")
+  (its-defrule   "zm"   "\e$B!m\e(B")    (its-defrule   "zM"   "\e$B".\e(B")
+  (its-defrule   "z,"   "\e$B!E\e(B")    (its-defrule   "z<"   "\e$B!e\e(B")
+  (its-defrule   "z."   "\e$B!D\e(B")    (its-defrule   "z>"   "\e$B!f\e(B")
+  (its-defrule   "z/"   "\e$B!&\e(B")    (its-defrule   "z?"   "\e$B!g\e(B")
+  )
+
+(define-its-state-machine-append its-hira-map
+  (if its-hira-enable-double-n
+      (its-defrule "nn" "\e$B$s\e(B"))
+
+  (its-defrule "-" its-hira-horizontal)
+  (its-defrule "[" its-hira-open-bracket)
+  (its-defrule "]" its-hira-close-bracket)
+  (its-defrule "." its-hira-period)
+  (its-defrule "," its-hira-comma)
+
+  (if its-hira-enable-zenkaku-alphabet
+      (progn
+       (its-defrule   "1"   "\e$B#1\e(B")  (its-defrule   "2"   "\e$B#2\e(B")
+       (its-defrule   "3"   "\e$B#3\e(B")  (its-defrule   "4"   "\e$B#4\e(B")
+       (its-defrule   "5"   "\e$B#5\e(B")  (its-defrule   "6"   "\e$B#6\e(B")
+       (its-defrule   "7"   "\e$B#7\e(B")  (its-defrule   "8"   "\e$B#8\e(B")
+       (its-defrule   "9"   "\e$B#9\e(B")  (its-defrule   "0"   "\e$B#0\e(B")
+       (its-defrule   "!"   "\e$B!*\e(B")  (its-defrule   "@"   "\e$B!w\e(B")
+       (its-defrule   "#"   "\e$B!t\e(B")  (its-defrule   "$"   "\e$B!p\e(B")
+       (its-defrule   "%"   "\e$B!s\e(B")  (its-defrule   "^"   "\e$B!0\e(B")
+       (its-defrule   "&"   "\e$B!u\e(B")  (its-defrule   "*"   "\e$B!v\e(B")
+       (its-defrule   "("   "\e$B!J\e(B")  (its-defrule   ")"   "\e$B!K\e(B")
+       (its-defrule   "="   "\e$B!a\e(B")  (its-defrule   "`"   "\e$B!.\e(B")
+       (its-defrule   "\\"  "\e$B!o\e(B")  (its-defrule   "|"   "\e$B!C\e(B")
+       (its-defrule   "_"   "\e$B!2\e(B")  (its-defrule   "+"   "\e$B!\\e(B")
+       (its-defrule   "{"   "\e$B!P\e(B")  (its-defrule   "}"   "\e$B!Q\e(B")
+       (its-defrule   ":"   "\e$B!'\e(B")  (its-defrule   ";"   "\e$B!(\e(B")
+       (its-defrule   "\""  "\e$B!I\e(B")  (its-defrule   "'"   "\e$B!G\e(B")
+       (its-defrule   "<"   "\e$B!c\e(B")  (its-defrule   ">"   "\e$B!d\e(B")
+       (its-defrule   "?"   "\e$B!)\e(B")  (its-defrule   "/"   "\e$B!?\e(B"))
+    (progn
+      (its-defrule   "1"   "1")  (its-defrule   "2"   "2")
+      (its-defrule   "3"   "3")  (its-defrule   "4"   "4")
+      (its-defrule   "5"   "5")  (its-defrule   "6"   "6")
+      (its-defrule   "7"   "7")  (its-defrule   "8"   "8")
+      (its-defrule   "9"   "9")  (its-defrule   "0"   "0")
+      (its-defrule   "!"   "!")  (its-defrule   "@"   "@")
+      (its-defrule   "#"   "#")  (its-defrule   "$"   "$")
+      (its-defrule   "%"   "%")  (its-defrule   "^"   "^")
+      (its-defrule   "&"   "&")  (its-defrule   "*"   "*")
+      (its-defrule   "("   "(")  (its-defrule   ")"   ")")
+      (its-defrule   "="   "=")  (its-defrule   "`"   "`")
+      (its-defrule   "\\"  "\\") (its-defrule   "|"   "|")
+      (its-defrule   "_"   "_")  (its-defrule   "+"   "+")
+      (its-defrule   "{"   "{")  (its-defrule   "}"   "}")
+      (its-defrule   ":"   ":")  (its-defrule   ";"   ";")
+      (its-defrule   "\""  "\"") (its-defrule   "'"   "'")
+      (its-defrule   "<"   "<")  (its-defrule   ">"   ">")
+      (its-defrule   "?"   "?")  (its-defrule   "/"   "/")))
+  )
+
+(provide 'its/hira)
+;;; its/hira.el ends here.
diff --git a/its/jeonkak.el b/its/jeonkak.el
new file mode 100644 (file)
index 0000000..2775e3b
--- /dev/null
@@ -0,0 +1,111 @@
+;;; its/jeonkak.el --- Jeonkak ASCII Input in Egg Input Method Architecture
+
+;; Copyright (C) 1999,2000 PFU LIMITED
+
+;; Author: KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+;;
+;; Symbol input is desined by jiro@math.keio.ac.jp (TANAKA Jiro)
+;; This file is based on the rules of its/hira.el in Mule-2.3 distribution.
+;;
+
+;;; Code:
+
+
+
+(eval-when-compile
+  (require 'its))
+
+(define-its-state-machine its-jeonkak-up-map
+  "jeonkak-upcase" "\e$(C#A\e(B" Korean
+  "Map for jeonkak-upcase input."
+
+  (dolist (ascii '(("1" . "\e$(C#1\e(B")  ("2" . "\e$(C#2\e(B")  ("3" . "\e$(C#3\e(B")  ("4" . "\e$(C#4\e(B")
+                  ("5" . "\e$(C#5\e(B")  ("6" . "\e$(C#6\e(B")  ("7" . "\e$(C#7\e(B")  ("8" . "\e$(C#8\e(B")
+                  ("9" . "\e$(C#9\e(B")  ("0" . "\e$(C#0\e(B")
+                  (" " . "\e$(C!!\e(B")  ("!" . "\e$(C#!\e(B")  ("@" . "\e$(C#@\e(B")  ("#" . "\e$(C##\e(B")
+                  ("$" . "\e$(C#$\e(B")  ("%" . "\e$(C#%\e(B")  ("^" . "\e$(C#^\e(B")  ("&" . "\e$(C#&\e(B")
+                  ("*" . "\e$(C#*\e(B")  ("(" . "\e$(C#(\e(B")  (")" . "\e$(C#)\e(B")
+                  ("-" . "\e$(C#-\e(B")  ("=" . "\e$(C#=\e(B")  ("`" . "\e$(C#`\e(B")  ("\\" . "\e$(C#\\e(B")
+                  ("|" . "\e$(C#|\e(B")  ("_" . "\e$(C#_\e(B")  ("+" . "\e$(C#+\e(B")  ("~" . "\e$(C#~\e(B")
+                  ("[" . "\e$(C!8\e(B")  ("]" . "\e$(C!9\e(B")  ("{" . "\e$(C#{\e(B")  ("}" . "\e$(C#}\e(B")
+                  (":" . "\e$(C#:\e(B")  (";" . "\e$(C#;\e(B")  ("\"" . "\e$(C#"\e(B") ("'" . "\e$(C#'\e(B")
+                  ("<" . "\e$(C#<\e(B")  (">" . "\e$(C#>\e(B")  ("?" . "\e$(C#?\e(B")  ("/" . "\e$(C#/\e(B")
+                  ("," . "\e$(C#,\e(B")  ("." . "\e$(C#.\e(B")
+                  ("a" . "\e$(C#A\e(B")  ("b" . "\e$(C#B\e(B")  ("c" . "\e$(C#C\e(B")  ("d" . "\e$(C#D\e(B")
+                  ("e" . "\e$(C#E\e(B")  ("f" . "\e$(C#F\e(B")  ("g" . "\e$(C#G\e(B")  ("h" . "\e$(C#H\e(B")
+                  ("i" . "\e$(C#I\e(B")  ("j" . "\e$(C#J\e(B")  ("k" . "\e$(C#K\e(B")  ("l" . "\e$(C#L\e(B")
+                  ("m" . "\e$(C#M\e(B")  ("n" . "\e$(C#N\e(B")  ("o" . "\e$(C#O\e(B")  ("p" . "\e$(C#P\e(B")
+                  ("q" . "\e$(C#Q\e(B")  ("r" . "\e$(C#R\e(B")  ("s" . "\e$(C#S\e(B")  ("t" . "\e$(C#T\e(B")
+                  ("u" . "\e$(C#U\e(B")  ("v" . "\e$(C#V\e(B")  ("w" . "\e$(C#W\e(B")  ("x" . "\e$(C#X\e(B")
+                  ("y" . "\e$(C#Y\e(B")  ("z" . "\e$(C#Z\e(B")
+                  ("A" . "\e$(C#A\e(B")  ("B" . "\e$(C#B\e(B")  ("C" . "\e$(C#C\e(B")  ("D" . "\e$(C#D\e(B")
+                  ("E" . "\e$(C#E\e(B")  ("F" . "\e$(C#F\e(B")  ("G" . "\e$(C#G\e(B")  ("H" . "\e$(C#H\e(B")
+                  ("I" . "\e$(C#I\e(B")  ("J" . "\e$(C#J\e(B")  ("K" . "\e$(C#K\e(B")  ("L" . "\e$(C#L\e(B")
+                  ("M" . "\e$(C#M\e(B")  ("N" . "\e$(C#N\e(B")  ("O" . "\e$(C#O\e(B")  ("P" . "\e$(C#P\e(B")
+                  ("Q" . "\e$(C#Q\e(B")  ("R" . "\e$(C#R\e(B")  ("S" . "\e$(C#S\e(B")  ("T" . "\e$(C#T\e(B")
+                  ("U" . "\e$(C#U\e(B")  ("V" . "\e$(C#V\e(B")  ("W" . "\e$(C#W\e(B")  ("X" . "\e$(C#X\e(B")
+                  ("Y" . "\e$(C#Y\e(B")  ("Z" . "\e$(C#Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule in out))))
+
+(define-its-state-machine-append its-jeonkak-up-map)
+
+(define-its-state-machine its-jeonkak-down-map
+  "jeonkak-downcase" "\e$(C#a\e(B" Korean
+  "Map for jeonkak-downcase input."
+
+  (dolist (ascii '(("1" . "\e$(C#1\e(B")  ("2" . "\e$(C#2\e(B")  ("3" . "\e$(C#3\e(B")  ("4" . "\e$(C#4\e(B")
+                  ("5" . "\e$(C#5\e(B")  ("6" . "\e$(C#6\e(B")  ("7" . "\e$(C#7\e(B")  ("8" . "\e$(C#8\e(B")
+                  ("9" . "\e$(C#9\e(B")  ("0" . "\e$(C#0\e(B")
+                  (" " . "\e$(C!!\e(B")  ("!" . "\e$(C#!\e(B")  ("@" . "\e$(C#@\e(B")  ("#" . "\e$(C##\e(B")
+                  ("$" . "\e$(C#$\e(B")  ("%" . "\e$(C#%\e(B")  ("^" . "\e$(C#^\e(B")  ("&" . "\e$(C#&\e(B")
+                  ("*" . "\e$(C#*\e(B")  ("(" . "\e$(C#(\e(B")  (")" . "\e$(C#)\e(B")
+                  ("-" . "\e$(C#-\e(B")  ("=" . "\e$(C#=\e(B")  ("`" . "\e$(C#`\e(B")  ("\\" . "\e$(C#\\e(B")
+                  ("|" . "\e$(C#|\e(B")  ("_" . "\e$(C#_\e(B")  ("+" . "\e$(C#+\e(B")  ("~" . "\e$(C#~\e(B")
+                  ("[" . "\e$(C!8\e(B")  ("]" . "\e$(C!9\e(B")  ("{" . "\e$(C#{\e(B")  ("}" . "\e$(C#}\e(B")
+                  (":" . "\e$(C#:\e(B")  (";" . "\e$(C#;\e(B")  ("\"" . "\e$(C#"\e(B") ("'" . "\e$(C#'\e(B")
+                  ("<" . "\e$(C#<\e(B")  (">" . "\e$(C#>\e(B")  ("?" . "\e$(C#?\e(B")  ("/" . "\e$(C#/\e(B")
+                  ("," . "\e$(C#,\e(B")  ("." . "\e$(C#.\e(B")
+                  ("a" . "\e$(C#a\e(B")  ("b" . "\e$(C#b\e(B")  ("c" . "\e$(C#c\e(B")  ("d" . "\e$(C#d\e(B")
+                  ("e" . "\e$(C#e\e(B")  ("f" . "\e$(C#f\e(B")  ("g" . "\e$(C#g\e(B")  ("h" . "\e$(C#h\e(B")
+                  ("i" . "\e$(C#i\e(B")  ("j" . "\e$(C#j\e(B")  ("k" . "\e$(C#k\e(B")  ("l" . "\e$(C#l\e(B")
+                  ("m" . "\e$(C#m\e(B")  ("n" . "\e$(C#n\e(B")  ("o" . "\e$(C#o\e(B")  ("p" . "\e$(C#p\e(B")
+                  ("q" . "\e$(C#q\e(B")  ("r" . "\e$(C#r\e(B")  ("s" . "\e$(C#s\e(B")  ("t" . "\e$(C#t\e(B")
+                  ("u" . "\e$(C#u\e(B")  ("v" . "\e$(C#v\e(B")  ("w" . "\e$(C#w\e(B")  ("x" . "\e$(C#x\e(B")
+                  ("y" . "\e$(C#y\e(B")  ("z" . "\e$(C#z\e(B")
+                  ("A" . "\e$(C#A\e(B")  ("B" . "\e$(C#B\e(B")  ("C" . "\e$(C#C\e(B")  ("D" . "\e$(C#D\e(B")
+                  ("E" . "\e$(C#E\e(B")  ("F" . "\e$(C#F\e(B")  ("G" . "\e$(C#G\e(B")  ("H" . "\e$(C#H\e(B")
+                  ("I" . "\e$(C#I\e(B")  ("J" . "\e$(C#J\e(B")  ("K" . "\e$(C#K\e(B")  ("L" . "\e$(C#L\e(B")
+                  ("M" . "\e$(C#M\e(B")  ("N" . "\e$(C#N\e(B")  ("O" . "\e$(C#O\e(B")  ("P" . "\e$(C#P\e(B")
+                  ("Q" . "\e$(C#Q\e(B")  ("R" . "\e$(C#R\e(B")  ("S" . "\e$(C#S\e(B")  ("T" . "\e$(C#T\e(B")
+                  ("U" . "\e$(C#U\e(B")  ("V" . "\e$(C#V\e(B")  ("W" . "\e$(C#W\e(B")  ("X" . "\e$(C#X\e(B")
+                  ("Y" . "\e$(C#Y\e(B")  ("Z" . "\e$(C#Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule in out))))
+
+(define-its-state-machine-append its-jeonkak-down-map)
+
+(provide 'its/jeonkak)
diff --git a/its/kata.el b/its/kata.el
new file mode 100644 (file)
index 0000000..28e1dcd
--- /dev/null
@@ -0,0 +1,494 @@
+;;; its/kata.el --- Katakana Input in Egg Input Method Architecture
+
+;; Copyright (C) 1995 Electrotechnical Laboratory, JAPAN.
+;; Licensed to the Free Software Foundation.
+
+;; Author: Satoru Tomura <tomura@etl.go.jp>
+;;         jiro@math.keio.ac.jp (TANAKA Jiro)
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+;;
+;; Symbol input is desined by jiro@math.keio.ac.jp (TANAKA Jiro)
+;; This file is based on the rules of its/hira.el in Mule-2.3 distribution.
+;;
+
+;;; Code:
+
+(eval-when-compile
+  (require 'its)
+  (require 'cl))
+
+(eval-when (compile)
+  (defconst its-compaction-enable t))
+
+(defvar its-kata-enable-zenkaku-alphabet
+  (if (boundp 'its-enable-fullwidth-alphabet)
+      its-enable-fullwidth-alphabet
+    t)
+  "*Enable Zenkaku alphabet")
+
+(defvar its-kata-enable-double-n nil "*Enable \"nn\" input for \"\e$B%s\e(B\" ")
+(defvar its-kata-period "\e$B!#\e(B" "*\e$B%T%j%*%I\e(B")  ; ". " "\e$B!%\e(B"
+(defvar its-kata-comma  "\e$B!"\e(B" "*\e$B%3%s%^\e(B")    ; ", " "\e$B!$\e(B"
+(defvar its-kata-open-bracket  "\e$B!V\e(B" "*[")  ; "\e$B!N\e(B"
+(defvar its-kata-close-bracket  "\e$B!W\e(B" "*]") ; "\e$B!O\e(B"
+(defvar its-kata-horizontal  "\e$B!<\e(B" "*-")    ; "\e$B!]\e(B"
+
+(define-its-state-machine its-kata-map
+  "roma-kata" "\e$B%"\e(B" Japanese
+  "Map for Romaji-Katakana translation. (Japanese)"
+
+  (defconst its-zenkaku-escape "Z")  ;; Escape character to Zenkaku inputs
+  (defconst its-hankaku-escape "~")  ;; Escape character to Hankaku inputs
+
+  (its-defrule-select-mode-temporally "q" downcase)
+  (its-defrule-select-mode-temporally "Q" zenkaku-downcase)
+
+;;; k      k
+;;; kk     \e$B%C\e(Bk
+;;; kka    \e$B%C%+\e(B
+;;;
+;;; kkk    \e$B%C\e(Bk DING!
+
+  (its-defrule "tch"  "\e$B%C\e(B" -2)
+
+;;; \e$B!V%s!W$NF~NO\e(B
+
+  (dolist (q1 '("b" "m" "p"))
+    (its-defrule (concat "m" q1) "\e$B%s\e(B" -1))
+
+  (its-defrule* "n"  "\e$B%s\e(B")
+  (its-defrule  "n'" "\e$B%s\e(B")
+  (its-defrule  "N"  "\e$B%s\e(B")
+
+  (let ((small '"x" ))
+    (its-defrule (concat small "a") "\e$B%!\e(B")
+    (its-defrule (concat small "i") "\e$B%#\e(B")
+    (its-defrule (concat small "u") "\e$B%%\e(B")
+    (its-defrule (concat small "e") "\e$B%'\e(B")
+    (its-defrule (concat small "o") "\e$B%)\e(B")
+    (its-defrule (concat small "ya") "\e$B%c\e(B")
+    (its-defrule (concat small "yu") "\e$B%e\e(B")
+    (its-defrule (concat small "yo") "\e$B%g\e(B")
+    (its-defrule (concat small "tu") "\e$B%C\e(B")
+    (its-defrule (concat small "tsu") "\e$B%C\e(B")
+    (its-defrule (concat small "wa") "\e$B%n\e(B")
+    )
+
+  (its-defrule   "a"    "\e$B%"\e(B")
+  (its-defrule   "i"    "\e$B%$\e(B")
+  (its-defrule   "u"    "\e$B%&\e(B")
+  (its-defrule   "e"    "\e$B%(\e(B")
+  (its-defrule   "o"    "\e$B%*\e(B")
+
+  (dolist (k '(("ka"  "\e$B%+\e(B") ("ki"  "\e$B%-\e(B") ("ku"  "\e$B%/\e(B") ("ke"  "\e$B%1\e(B") ("ko"  "\e$B%3\e(B")
+              ("kya" "\e$B%-%c\e(B") ("kyu"  "\e$B%-%e\e(B") ("kye"  "\e$B%-%'\e(B") ("kyo"  "\e$B%-%g\e(B")))
+    (its-defrule (car k) (cadr k))
+    (its-defrule (concat "k" (car k)) (concat "\e$B%C\e(B" (cadr k))))
+  (its-defoutput "kk" "\e$B%C\e(Bk")
+  (its-defoutput "kky" "\e$B%C\e(Bky")
+
+  (dolist (s '(("sa"  "\e$B%5\e(B") ("si"  "\e$B%7\e(B") ("su"  "\e$B%9\e(B") ("se"  "\e$B%;\e(B") ("so"  "\e$B%=\e(B")
+              ("sya"  "\e$B%7%c\e(B") ("syu"  "\e$B%7%e\e(B") ("sye"  "\e$B%7%'\e(B") ("syo"  "\e$B%7%g\e(B")
+              ("sha"  "\e$B%7%c\e(B") ("shi"  "\e$B%7\e(B") ("shu"  "\e$B%7%e\e(B") ("she"  "\e$B%7%'\e(B")
+              ("sho"  "\e$B%7%g\e(B")))
+    (its-defrule (car s) (cadr s))
+    (its-defrule (concat "s" (car s)) (concat "\e$B%C\e(B" (cadr s))))
+  (its-defoutput "ss" "\e$B%C\e(Bs")
+  (its-defoutput "ssy" "\e$B%C\e(Bsy")
+  (its-defoutput "ssh" "\e$B%C\e(Bsh")
+
+  (dolist (T '(("ta"  "\e$B%?\e(B") ("ti"  "\e$B%A\e(B") ("tu"  "\e$B%D\e(B") ("te"  "\e$B%F\e(B") ("to"  "\e$B%H\e(B")
+              ("tya"  "\e$B%A%c\e(B") ("tyi"  "\e$B%F%#\e(B") ("tyu"  "\e$B%A%e\e(B") ("tye"  "\e$B%A%'\e(B")
+              ("tyo"  "\e$B%A%g\e(B") ("tsu"  "\e$B%D\e(B")))
+    (its-defrule (car T) (cadr T))
+    (its-defrule (concat "t" (car T)) (concat "\e$B%C\e(B" (cadr T))))
+  (its-defoutput "tt" "\e$B%C\e(Bt")
+  (its-defoutput "tty" "\e$B%C\e(Bty")
+  (its-defoutput "tts" "\e$B%C\e(Bts")
+
+  (dolist (c '(("cha"  "\e$B%A%c\e(B") ("chi"  "\e$B%A\e(B") ("chu"  "\e$B%A%e\e(B")
+              ("che"  "\e$B%A%'\e(B") ("cho"  "\e$B%A%g\e(B")))
+    (its-defrule (car c) (cadr c))
+    (its-defrule (concat "c" (car c)) (concat "\e$B%C\e(B" (cadr c))))
+  (its-defoutput "cc" "\e$B%C\e(Bc")
+  (its-defoutput "cch" "\e$B%C\e(Bch")
+
+  (dolist (h '(("ha"  "\e$B%O\e(B") ("hi"  "\e$B%R\e(B") ("hu"  "\e$B%U\e(B") ("he"  "\e$B%X\e(B") ("ho"  "\e$B%[\e(B")
+              ("hya"  "\e$B%R%c\e(B") ("hyu"  "\e$B%R%e\e(B") ("hye"  "\e$B%R%'\e(B") ("hyo"  "\e$B%R%g\e(B")))
+    (its-defrule (car h) (cadr h))
+    (its-defrule (concat "h" (car h)) (concat "\e$B%C\e(B" (cadr h))))
+  (its-defoutput "hh" "\e$B%C\e(Bh")
+  (its-defoutput "hhy" "\e$B%C\e(Bhy")
+
+  (dolist (f '(("fa"  "\e$B%U%!\e(B") ("fi"  "\e$B%U%#\e(B") ("fu"  "\e$B%U\e(B") ("fe"  "\e$B%U%'\e(B")
+              ("fo"  "\e$B%U%)\e(B")))
+    (its-defrule (car f) (cadr f))
+    (its-defrule (concat "f" (car f)) (concat "\e$B%C\e(B" (cadr f))))
+  (its-defoutput "ff" "\e$B%C\e(Bf")
+
+  (dolist (r '(("ra"  "\e$B%i\e(B") ("ri"  "\e$B%j\e(B") ("ru"  "\e$B%k\e(B") ("re"  "\e$B%l\e(B") ("ro"  "\e$B%m\e(B")
+              ("rya"  "\e$B%j%c\e(B") ("ryu"  "\e$B%j%e\e(B") ("rye"  "\e$B%j%'\e(B") ("ryo"  "\e$B%j%g\e(B")))
+    (its-defrule (car r) (cadr r))
+    (its-defrule (concat "r" (car r)) (concat "\e$B%C\e(B" (cadr r))))
+  (its-defoutput "rr" "\e$B%C\e(Br")
+  (its-defoutput "rry" "\e$B%C\e(Bry")
+
+  (dolist (l '(("la"  "\e$B%i\e(B") ("li"  "\e$B%j\e(B") ("lu"  "\e$B%k\e(B") ("le"  "\e$B%l\e(B") ("lo"  "\e$B%m\e(B")
+              ("lya"  "\e$B%j%c\e(B") ("lyu"  "\e$B%j%e\e(B") ("lye"  "\e$B%j%'\e(B") ("lyo"  "\e$B%j%g\e(B")))
+    (its-defrule (car l) (cadr l))
+    (its-defrule (concat "l" (car l)) (concat "\e$B%C\e(B" (cadr l))))
+  (its-defoutput "ll" "\e$B%C\e(Bl")
+  (its-defoutput "lly" "\e$B%C\e(Bly")
+
+  (dolist (g '(("ga"  "\e$B%,\e(B") ("gi"  "\e$B%.\e(B") ("gu"  "\e$B%0\e(B") ("ge"  "\e$B%2\e(B") ("go"  "\e$B%4\e(B")
+              ("gya"  "\e$B%.%c\e(B") ("gyu"  "\e$B%.%e\e(B") ("gye"  "\e$B%.%'\e(B") ("gyo"  "\e$B%.%g\e(B")))
+    (its-defrule (car g) (cadr g))
+    (its-defrule (concat "g" (car g)) (concat "\e$B%C\e(B" (cadr g))))
+  (its-defoutput "gg" "\e$B%C\e(Bg")
+  (its-defoutput "ggy" "\e$B%C\e(Bgy")
+
+  (dolist (z '(("za"  "\e$B%6\e(B") ("zi"  "\e$B%8\e(B") ("zu"  "\e$B%:\e(B") ("ze"  "\e$B%<\e(B") ("zo"  "\e$B%>\e(B")
+              ("zya"  "\e$B%8%c\e(B") ("zyu"  "\e$B%8%e\e(B") ("zye"  "\e$B%8%'\e(B") ("zyo"  "\e$B%8%g\e(B")))
+    (its-defrule (car z) (cadr z))
+    (its-defrule (concat "z" (car z)) (concat "\e$B%C\e(B" (cadr z))))
+  (its-defoutput "zz" "\e$B%C\e(Bz")
+  (its-defoutput "zzy" "\e$B%C\e(Bzy")
+
+  (dolist (j '(("ja"  "\e$B%8%c\e(B") ("ji"  "\e$B%8\e(B") ("ju"  "\e$B%8%e\e(B") ("je"  "\e$B%8%'\e(B")
+              ("jo"  "\e$B%8%g\e(B") ("jya"  "\e$B%8%c\e(B") ("jyu"  "\e$B%8%e\e(B") ("jye"  "\e$B%8%'\e(B")
+              ("jyo"  "\e$B%8%g\e(B")))
+    (its-defrule (car j) (cadr j))
+    (its-defrule (concat "j" (car j)) (concat "\e$B%C\e(B" (cadr j))))
+  (its-defoutput "jj" "\e$B%C\e(Bj")
+  (its-defoutput "jjy" "\e$B%C\e(Bjy")
+
+  (dolist (d '(("da"  "\e$B%@\e(B") ("di"  "\e$B%B\e(B") ("du"  "\e$B%E\e(B") ("de"  "\e$B%G\e(B") ("do"  "\e$B%I\e(B")
+              ("dya"  "\e$B%B%c\e(B") ("dyi"  "\e$B%G%#\e(B") ("dyu"  "\e$B%B%e\e(B") ("dye"  "\e$B%B%'\e(B")
+              ("dyo"  "\e$B%B%g\e(B")))
+    (its-defrule (car d) (cadr d))
+    (its-defrule (concat "d" (car d)) (concat "\e$B%C\e(B" (cadr d))))
+  (its-defoutput "dd" "\e$B%C\e(Bd")
+  (its-defoutput "ddy" "\e$B%C\e(Bdy")
+
+  (dolist (b '(("ba"  "\e$B%P\e(B") ("bi"  "\e$B%S\e(B") ("bu"  "\e$B%V\e(B") ("be"  "\e$B%Y\e(B") ("bo"  "\e$B%\\e(B")
+              ("bya"  "\e$B%S%c\e(B") ("byu"  "\e$B%S%e\e(B") ("bye"  "\e$B%S%'\e(B") ("byo"  "\e$B%S%g\e(B")))
+    (its-defrule (car b) (cadr b))
+    (its-defrule (concat "b" (car b)) (concat "\e$B%C\e(B" (cadr b))))
+  (its-defoutput "bb" "\e$B%C\e(Bb")
+  (its-defoutput "bby" "\e$B%C\e(Bby")
+
+  (dolist (p '(("pa"  "\e$B%Q\e(B") ("pi"  "\e$B%T\e(B") ("pu"  "\e$B%W\e(B") ("pe"  "\e$B%Z\e(B") ("po"   "\e$B%]\e(B")
+              ("pya"  "\e$B%T%c\e(B") ("pyu"  "\e$B%T%e\e(B") ("pye"  "\e$B%T%'\e(B") ("pyo"  "\e$B%T%g\e(B")))
+    (its-defrule (car p) (cadr p))
+    (its-defrule (concat "p" (car p)) (concat "\e$B%C\e(B" (cadr p))))
+  (its-defoutput "pp" "\e$B%C\e(Bp")
+  (its-defoutput "ppy" "\e$B%C\e(Bpy")
+
+  (dolist (v '(("va" "\e$B%t%!\e(B") ("vi" "\e$B%t%#\e(B") ("vu" "\e$B%t\e(B") ("ve" "\e$B%t%'\e(B")
+              ("vo" "\e$B%t%)\e(B")))
+    (its-defrule (car v) (cadr v))
+    (its-defrule (concat "v" (car v)) (concat "\e$B%C\e(B" (cadr v))))
+  (its-defoutput "vv" "\e$B%C\e(Bv")
+
+  (its-defrule   "ma"   "\e$B%^\e(B")
+  (its-defrule   "mi"   "\e$B%_\e(B")
+  (its-defrule   "mu"   "\e$B%`\e(B")
+  (its-defrule   "me"   "\e$B%a\e(B")
+  (its-defrule   "mo"   "\e$B%b\e(B")
+  (its-defrule   "mya"  "\e$B%_%c\e(B")
+  (its-defrule   "myu"  "\e$B%_%e\e(B")
+  (its-defrule   "mye"  "\e$B%_%'\e(B")
+  (its-defrule   "myo"  "\e$B%_%g\e(B")
+  (its-defrule   "ya"   "\e$B%d\e(B")
+  (its-defrule   "yi"   "\e$B%$\e(B")
+  (its-defrule   "yu"   "\e$B%f\e(B")
+  (its-defrule   "yo"   "\e$B%h\e(B")
+  (its-defrule   "ye"   "\e$B%$%'\e(B")
+  (its-defrule   "wa"   "\e$B%o\e(B")
+  (its-defrule   "wi"   "\e$B%p\e(B")
+  (its-defrule   "wu"   "\e$B%&\e(B")
+  (its-defrule   "we"   "\e$B%q\e(B")
+  (its-defrule   "wo"   "\e$B%r\e(B")
+
+  (its-defrule   "kwa"  "\e$B%/%n\e(B")
+  (its-defrule   "kwi"  "\e$B%/%#\e(B")
+  (its-defrule   "kwu"  "\e$B%/\e(B")
+  (its-defrule   "kwe"  "\e$B%/%'\e(B")
+  (its-defrule   "kwo"  "\e$B%/%)\e(B")
+  (its-defrule   "gwa"  "\e$B%0%n\e(B")
+  (its-defrule   "gwi"  "\e$B%0%#\e(B")
+  (its-defrule   "gwu"  "\e$B%0\e(B")
+  (its-defrule   "gwe"  "\e$B%0%'\e(B")
+  (its-defrule   "gwo"  "\e$B%0%)\e(B")
+  (its-defrule   "tsa"  "\e$B%D%!\e(B")
+  (its-defrule   "tsi"  "\e$B%D%#\e(B")
+  (its-defrule   "tse"  "\e$B%D%'\e(B")
+  (its-defrule   "tso"  "\e$B%D%)\e(B")
+
+  (its-defrule   "na"   "\e$B%J\e(B")
+  (its-defrule   "ni"   "\e$B%K\e(B")
+  (its-defrule   "nu"   "\e$B%L\e(B")
+  (its-defrule   "ne"   "\e$B%M\e(B")
+  (its-defrule   "no"   "\e$B%N\e(B")
+  (its-defrule   "nya"  "\e$B%K%c\e(B")
+  (its-defrule   "nyu"  "\e$B%K%e\e(B")
+  (its-defrule   "nye"  "\e$B%K%'\e(B")
+  (its-defrule   "nyo"  "\e$B%K%g\e(B")
+
+  (its-defrule   "xka"  "\e$B%u\e(B")
+  (its-defrule   "xke"  "\e$B%v\e(B")
+  (its-defrule   "xti"  "\e$B%F%#\e(B")
+  (its-defrule   "xdi"  "\e$B%G%#\e(B")
+  (its-defrule   "xdu"  "\e$B%I%%\e(B")
+  (its-defrule   "xde"  "\e$B%G%'\e(B")
+  (its-defrule   "xdo"  "\e$B%I%)\e(B")
+  (its-defrule   "xwi"  "\e$B%&%#\e(B")
+  (its-defrule   "xwe"  "\e$B%&%'\e(B")
+  (its-defrule   "xwo"  "\e$B%&%)\e(B")
+
+;;;
+;;; Zenkaku inputs
+;;;
+
+  (its-defrule (concat its-zenkaku-escape "0") "\e$B#0\e(B")
+  (its-defrule (concat its-zenkaku-escape "1") "\e$B#1\e(B")
+  (its-defrule (concat its-zenkaku-escape "2") "\e$B#2\e(B")
+  (its-defrule (concat its-zenkaku-escape "3") "\e$B#3\e(B")
+  (its-defrule (concat its-zenkaku-escape "4") "\e$B#4\e(B")
+  (its-defrule (concat its-zenkaku-escape "5") "\e$B#5\e(B")
+  (its-defrule (concat its-zenkaku-escape "6") "\e$B#6\e(B")
+  (its-defrule (concat its-zenkaku-escape "7") "\e$B#7\e(B")
+  (its-defrule (concat its-zenkaku-escape "8") "\e$B#8\e(B")
+  (its-defrule (concat its-zenkaku-escape "9") "\e$B#9\e(B")
+
+  (its-defrule (concat its-zenkaku-escape "A") "\e$B#A\e(B")
+  (its-defrule (concat its-zenkaku-escape "B") "\e$B#B\e(B")
+  (its-defrule (concat its-zenkaku-escape "C") "\e$B#C\e(B")
+  (its-defrule (concat its-zenkaku-escape "D") "\e$B#D\e(B")
+  (its-defrule (concat its-zenkaku-escape "E") "\e$B#E\e(B")
+  (its-defrule (concat its-zenkaku-escape "F") "\e$B#F\e(B")
+  (its-defrule (concat its-zenkaku-escape "G") "\e$B#G\e(B")
+  (its-defrule (concat its-zenkaku-escape "H") "\e$B#H\e(B")
+  (its-defrule (concat its-zenkaku-escape "I") "\e$B#I\e(B")
+  (its-defrule (concat its-zenkaku-escape "J") "\e$B#J\e(B")
+  (its-defrule (concat its-zenkaku-escape "K") "\e$B#K\e(B")
+  (its-defrule (concat its-zenkaku-escape "L") "\e$B#L\e(B")
+  (its-defrule (concat its-zenkaku-escape "M") "\e$B#M\e(B")
+  (its-defrule (concat its-zenkaku-escape "N") "\e$B#N\e(B")
+  (its-defrule (concat its-zenkaku-escape "O") "\e$B#O\e(B")
+  (its-defrule (concat its-zenkaku-escape "P") "\e$B#P\e(B")
+  (its-defrule (concat its-zenkaku-escape "Q") "\e$B#Q\e(B")
+  (its-defrule (concat its-zenkaku-escape "R") "\e$B#R\e(B")
+  (its-defrule (concat its-zenkaku-escape "S") "\e$B#S\e(B")
+  (its-defrule (concat its-zenkaku-escape "T") "\e$B#T\e(B")
+  (its-defrule (concat its-zenkaku-escape "U") "\e$B#U\e(B")
+  (its-defrule (concat its-zenkaku-escape "V") "\e$B#V\e(B")
+  (its-defrule (concat its-zenkaku-escape "W") "\e$B#W\e(B")
+  (its-defrule (concat its-zenkaku-escape "X") "\e$B#X\e(B")
+  (its-defrule (concat its-zenkaku-escape "Y") "\e$B#Y\e(B")
+  (its-defrule (concat its-zenkaku-escape "Z") "\e$B#Z\e(B")
+
+  (its-defrule (concat its-zenkaku-escape "a") "\e$B#a\e(B")
+  (its-defrule (concat its-zenkaku-escape "b") "\e$B#b\e(B")
+  (its-defrule (concat its-zenkaku-escape "c") "\e$B#c\e(B")
+  (its-defrule (concat its-zenkaku-escape "d") "\e$B#d\e(B")
+  (its-defrule (concat its-zenkaku-escape "e") "\e$B#e\e(B")
+  (its-defrule (concat its-zenkaku-escape "f") "\e$B#f\e(B")
+  (its-defrule (concat its-zenkaku-escape "g") "\e$B#g\e(B")
+  (its-defrule (concat its-zenkaku-escape "h") "\e$B#h\e(B")
+  (its-defrule (concat its-zenkaku-escape "i") "\e$B#i\e(B")
+  (its-defrule (concat its-zenkaku-escape "j") "\e$B#j\e(B")
+  (its-defrule (concat its-zenkaku-escape "k") "\e$B#k\e(B")
+  (its-defrule (concat its-zenkaku-escape "l") "\e$B#l\e(B")
+  (its-defrule (concat its-zenkaku-escape "m") "\e$B#m\e(B")
+  (its-defrule (concat its-zenkaku-escape "n") "\e$B#n\e(B")
+  (its-defrule (concat its-zenkaku-escape "o") "\e$B#o\e(B")
+  (its-defrule (concat its-zenkaku-escape "p") "\e$B#p\e(B")
+  (its-defrule (concat its-zenkaku-escape "q") "\e$B#q\e(B")
+  (its-defrule (concat its-zenkaku-escape "r") "\e$B#r\e(B")
+  (its-defrule (concat its-zenkaku-escape "s") "\e$B#s\e(B")
+  (its-defrule (concat its-zenkaku-escape "t") "\e$B#t\e(B")
+  (its-defrule (concat its-zenkaku-escape "u") "\e$B#u\e(B")
+  (its-defrule (concat its-zenkaku-escape "v") "\e$B#v\e(B")
+  (its-defrule (concat its-zenkaku-escape "w") "\e$B#w\e(B")
+  (its-defrule (concat its-zenkaku-escape "x") "\e$B#x\e(B")
+  (its-defrule (concat its-zenkaku-escape "y") "\e$B#y\e(B")
+  (its-defrule (concat its-zenkaku-escape "z") "\e$B#z\e(B")
+
+  (its-defrule (concat its-zenkaku-escape " ")  "\e$B!!\e(B")
+  (its-defrule (concat its-zenkaku-escape "!")  "\e$B!*\e(B")
+  (its-defrule (concat its-zenkaku-escape "@")  "\e$B!w\e(B")
+  (its-defrule (concat its-zenkaku-escape "#")  "\e$B!t\e(B")
+  (its-defrule (concat its-zenkaku-escape "$")  "\e$B!p\e(B")
+  (its-defrule (concat its-zenkaku-escape "%")  "\e$B!s\e(B")
+  (its-defrule (concat its-zenkaku-escape "^")  "\e$B!0\e(B")
+  (its-defrule (concat its-zenkaku-escape "&")  "\e$B!u\e(B")
+  (its-defrule (concat its-zenkaku-escape "*")  "\e$B!v\e(B")
+  (its-defrule (concat its-zenkaku-escape "(")  "\e$B!J\e(B")
+  (its-defrule (concat its-zenkaku-escape ")")  "\e$B!K\e(B")
+  (its-defrule (concat its-zenkaku-escape "-")  "\e$B!]\e(B")
+  (its-defrule (concat its-zenkaku-escape "=")  "\e$B!a\e(B")
+  (its-defrule (concat its-zenkaku-escape "`")  "\e$B!.\e(B")
+  (its-defrule (concat its-zenkaku-escape "\\") "\e$B!o\e(B")
+  (its-defrule (concat its-zenkaku-escape "|")  "\e$B!C\e(B")
+  (its-defrule (concat its-zenkaku-escape "_")  "\e$B!2\e(B")
+  (its-defrule (concat its-zenkaku-escape "+")  "\e$B!\\e(B")
+  (its-defrule (concat its-zenkaku-escape "~")  "\e$B!1\e(B")
+  (its-defrule (concat its-zenkaku-escape "[")  "\e$B!N\e(B")
+  (its-defrule (concat its-zenkaku-escape "]")  "\e$B!O\e(B")
+  (its-defrule (concat its-zenkaku-escape "{")  "\e$B!P\e(B")
+  (its-defrule (concat its-zenkaku-escape "}")  "\e$B!Q\e(B")
+  (its-defrule (concat its-zenkaku-escape ":")  "\e$B!'\e(B")
+  (its-defrule (concat its-zenkaku-escape ";")  "\e$B!(\e(B")
+  (its-defrule (concat its-zenkaku-escape "\"") "\e$B!I\e(B")
+  (its-defrule (concat its-zenkaku-escape "'")  "\e$B!G\e(B")
+  (its-defrule (concat its-zenkaku-escape "<")  "\e$B!c\e(B")
+  (its-defrule (concat its-zenkaku-escape ">")  "\e$B!d\e(B")
+  (its-defrule (concat its-zenkaku-escape "?")  "\e$B!)\e(B")
+  (its-defrule (concat its-zenkaku-escape "/")  "\e$B!?\e(B")
+  (its-defrule (concat its-zenkaku-escape ",")  "\e$B!$\e(B")
+  (its-defrule (concat its-zenkaku-escape ".")  "\e$B!%\e(B")
+
+;;;
+;;; Hankaku inputs
+;;;
+
+  (dolist (digit '( "1"  "2"  "3"  "4" "5"  "6"  "7"  "8"  "9"  "0" ))
+    (its-defrule (concat its-hankaku-escape digit)  digit))
+
+  (dolist (symbol '( " "  "!"  "@"  "#"  "$"  "%"  "^"  "&"  "*"  "("  ")"
+                    "-"  "="  "`"  "\\" "|"  "_"  "+"  "~" "["  "]"  "{"  "}"
+                    ":"  ";"  "\"" "'"  "<"  ">"  "?"  "/"  ","  "." ))
+    (its-defrule (concat its-hankaku-escape symbol) symbol))
+
+  (dolist (downcase '("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"
+                     "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"))
+    (its-defrule (concat its-hankaku-escape downcase) downcase))
+
+  (dolist (upcase    '("A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N"
+                      "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"))
+    (its-defrule (concat its-hankaku-escape upcase) upcase))
+
+;; SYMBOL Input
+  (its-defrule   "z1"   "\e$B!{\e(B")    (its-defrule   "z!"   "\e$B!|\e(B")
+  (its-defrule   "z2"   "\e$B"&\e(B")    (its-defrule   "z@"   "\e$B"'\e(B")
+  (its-defrule   "z3"   "\e$B"$\e(B")    (its-defrule   "z#"   "\e$B"%\e(B")
+  (its-defrule   "z4"   "\e$B""\e(B")    (its-defrule   "z$"   "\e$B"#\e(B")
+  (its-defrule   "z5"   "\e$B!~\e(B")    (its-defrule   "z%"   "\e$B"!\e(B")
+  (its-defrule   "z6"   "\e$B!y\e(B")    (its-defrule   "z^"   "\e$B!z\e(B")
+  (its-defrule   "z7"   "\e$B!}\e(B")    (its-defrule   "z&"   "\e$B!r\e(B")
+  (its-defrule   "z8"   "\e$B!q\e(B")    (its-defrule   "z*"   "\e$B!_\e(B")
+  (its-defrule   "z9"   "\e$B!i\e(B")    (its-defrule   "z("   "\e$B!Z\e(B")
+  (its-defrule   "z0"   "\e$B!j\e(B")    (its-defrule   "z)"   "\e$B![\e(B")
+  (its-defrule   "z-"   "\e$B!A\e(B")    (its-defrule   "z_"   "\e$B!h\e(B")
+  (its-defrule   "z="   "\e$B!b\e(B")    (its-defrule   "z+"   "\e$B!^\e(B")
+  (its-defrule   "z\\"  "\e$B!@\e(B")    (its-defrule   "z|"   "\e$B!B\e(B")
+  (its-defrule   "z`"   "\e$B!-\e(B")    (its-defrule   "z~"   "\e$B!/\e(B")
+
+  (its-defrule   "zq"   "\e$B!T\e(B")    (its-defrule   "zQ"   "\e$B!R\e(B")
+  (its-defrule   "zw"   "\e$B!U\e(B")    (its-defrule   "zW"   "\e$B!S\e(B")
+                                       ; e
+  (its-defrule   "zr"   "\e$B!9\e(B")    (its-defrule   "zR"   "\e$B!8\e(B")
+  (its-defrule   "zt"   "\e$B!:\e(B")    (its-defrule   "zT"   "\e$B!x\e(B")
+                                       ; y u i o
+  (its-defrule   "zp"   "\e$B")\e(B")    (its-defrule   "zP"   "\e$B",\e(B")
+  (its-defrule   "z["   "\e$B!X\e(B")    (its-defrule   "z{"   "\e$B!L\e(B")
+  (its-defrule   "z]"   "\e$B!Y\e(B")    (its-defrule   "z}"   "\e$B!M\e(B")
+
+                                       ; a
+  (its-defrule   "zs"   "\e$B!3\e(B")    (its-defrule   "zS"   "\e$B!4\e(B")
+  (its-defrule   "zd"   "\e$B!5\e(B")    (its-defrule   "zD"   "\e$B!6\e(B")
+  (its-defrule   "zf"   "\e$B!7\e(B")    (its-defrule   "zF"   "\e$B"*\e(B")
+  (its-defrule   "zg"   "\e$B!>\e(B")    (its-defrule   "zG"   "\e$B!=\e(B")
+  (its-defrule   "zh"   "\e$B"+\e(B")
+  (its-defrule   "zj"   "\e$B"-\e(B")
+  (its-defrule   "zk"   "\e$B",\e(B")
+  (its-defrule   "zl"   "\e$B"*\e(B")
+  (its-defrule   "z;"   "\e$B!+\e(B")    (its-defrule   "z:"   "\e$B!,\e(B")
+  (its-defrule   "z\'"  "\e$B!F\e(B")    (its-defrule   "z\""  "\e$B!H\e(B")
+
+                                       ; z
+  (its-defrule   "zx"   ":-")  (its-defrule   "zX"   ":-)")
+  (its-defrule   "zc"   "\e$B!;\e(B")    (its-defrule   "zC"   "\e$B!n\e(B")
+  (its-defrule   "zv"   "\e$B"(\e(B")    (its-defrule   "zV"   "\e$B!`\e(B")
+  (its-defrule   "zb"   "\e$B!k\e(B")    (its-defrule   "zB"   "\e$B"+\e(B")
+  (its-defrule   "zn"   "\e$B!l\e(B")    (its-defrule   "zN"   "\e$B"-\e(B")
+  (its-defrule   "zm"   "\e$B!m\e(B")    (its-defrule   "zM"   "\e$B".\e(B")
+  (its-defrule   "z,"   "\e$B!E\e(B")    (its-defrule   "z<"   "\e$B!e\e(B")
+  (its-defrule   "z."   "\e$B!D\e(B")    (its-defrule   "z>"   "\e$B!f\e(B")
+  (its-defrule   "z/"   "\e$B!&\e(B")    (its-defrule   "z?"   "\e$B!g\e(B")
+  )
+
+(define-its-state-machine-append its-kata-map
+  (if its-kata-enable-double-n
+      (its-defrule "nn" "\e$B%s\e(B"))
+
+  (its-defrule "-" its-kata-horizontal)
+  (its-defrule "[" its-kata-open-bracket)
+  (its-defrule "]" its-kata-close-bracket)
+  (its-defrule "." its-kata-period)
+  (its-defrule "," its-kata-comma)
+
+  (if its-kata-enable-zenkaku-alphabet
+      (progn
+       (its-defrule   "1"   "\e$B#1\e(B")  (its-defrule   "2"   "\e$B#2\e(B")
+       (its-defrule   "3"   "\e$B#3\e(B")  (its-defrule   "4"   "\e$B#4\e(B")
+       (its-defrule   "5"   "\e$B#5\e(B")  (its-defrule   "6"   "\e$B#6\e(B")
+       (its-defrule   "7"   "\e$B#7\e(B")  (its-defrule   "8"   "\e$B#8\e(B")
+       (its-defrule   "9"   "\e$B#9\e(B")  (its-defrule   "0"   "\e$B#0\e(B")
+       (its-defrule   "!"   "\e$B!*\e(B")  (its-defrule   "@"   "\e$B!w\e(B")
+       (its-defrule   "#"   "\e$B!t\e(B")  (its-defrule   "$"   "\e$B!p\e(B")
+       (its-defrule   "%"   "\e$B!s\e(B")  (its-defrule   "^"   "\e$B!0\e(B")
+       (its-defrule   "&"   "\e$B!u\e(B")  (its-defrule   "*"   "\e$B!v\e(B")
+       (its-defrule   "("   "\e$B!J\e(B")  (its-defrule   ")"   "\e$B!K\e(B")
+       (its-defrule   "="   "\e$B!a\e(B")  (its-defrule   "`"   "\e$B!.\e(B")
+       (its-defrule   "\\"  "\e$B!o\e(B")  (its-defrule   "|"   "\e$B!C\e(B")
+       (its-defrule   "_"   "\e$B!2\e(B")  (its-defrule   "+"   "\e$B!\\e(B")
+       (its-defrule   "{"   "\e$B!P\e(B")  (its-defrule   "}"   "\e$B!Q\e(B")
+       (its-defrule   ":"   "\e$B!'\e(B")  (its-defrule   ";"   "\e$B!(\e(B")
+       (its-defrule   "\""  "\e$B!I\e(B")  (its-defrule   "'"   "\e$B!G\e(B")
+       (its-defrule   "<"   "\e$B!c\e(B")  (its-defrule   ">"   "\e$B!d\e(B")
+       (its-defrule   "?"   "\e$B!)\e(B")  (its-defrule   "/"   "\e$B!?\e(B"))
+    (progn
+      (its-defrule   "1"   "1")  (its-defrule   "2"   "2")
+      (its-defrule   "3"   "3")  (its-defrule   "4"   "4")
+      (its-defrule   "5"   "5")  (its-defrule   "6"   "6")
+      (its-defrule   "7"   "7")  (its-defrule   "8"   "8")
+      (its-defrule   "9"   "9")  (its-defrule   "0"   "0")
+      (its-defrule   "!"   "!")  (its-defrule   "@"   "@")
+      (its-defrule   "#"   "#")  (its-defrule   "$"   "$")
+      (its-defrule   "%"   "%")  (its-defrule   "^"   "^")
+      (its-defrule   "&"   "&")  (its-defrule   "*"   "*")
+      (its-defrule   "("   "(")  (its-defrule   ")"   ")")
+      (its-defrule   "="   "=")  (its-defrule   "`"   "`")
+      (its-defrule   "\\"  "\\") (its-defrule   "|"   "|")
+      (its-defrule   "_"   "_")  (its-defrule   "+"   "+")
+      (its-defrule   "{"   "{")  (its-defrule   "}"   "}")
+      (its-defrule   ":"   ":")  (its-defrule   ";"   ";")
+      (its-defrule   "\""  "\"") (its-defrule   "'"   "'")
+      (its-defrule   "<"   "<")  (its-defrule   ">"   ">")
+      (its-defrule   "?"   "?")  (its-defrule   "/"   "/")))
+  )
+
+(provide 'its/kata)
+;;; its/kata.el ends here.
diff --git a/its/pinyin.el b/its/pinyin.el
new file mode 100644 (file)
index 0000000..1fb9df3
--- /dev/null
@@ -0,0 +1,434 @@
+;;; its/pinyin.el --- Pinyin Input in Egg Input Method Architecture
+
+;; Copyright (C) 1999,2000 PFU LIMITED
+
+;; Author: KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>\ 1
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+
+;;; Code:
+
+(eval-when-compile
+  (require 'its)
+  (require 'cl))
+
+(eval-when (compile)
+  (defconst its-compaction-enable t))
+
+(defvar its-pinyin-cn-enable-quanjioao-alphabet
+  (if (boundp 'its-enable-fullwidth-alphabet)
+      its-enable-fullwidth-alphabet
+    t)
+  "*Enable Quanjiao alphabet")
+
+(defvar its-pinyin-cn-open-braket  "\e$A!8\e(B" "*[") ; "\e$A#[\e(B"
+(defvar its-pinyin-cn-close-braket "\e$A!9\e(B" "*]") ; "\e$A#]\e(B"
+
+(defvar its-pinyin-tw-enable-quanjioao-alphabet
+  (if (boundp 'its-enable-fullwidth-alphabet)
+      its-enable-fullwidth-alphabet
+    t)
+  "*Enable Quanjiao alphabet")
+
+(defvar its-pinyin-tw-open-braket  "\e$(G!V\e(B" "*[") ; "\e$(G!b\e(B "
+(defvar its-pinyin-tw-close-braket "\e$(G!W\e(B" "*]") ; "\e$(G!c\e(B"
+
+(eval-when-compile
+  (defun its-prev-terminal-state (state-list)
+    (while (and state-list
+               (null (its-get-next-state (car state-list) -1)))
+      (setq state-list (cdr state-list)))
+    (car state-list))
+
+  (defun its-define-qingsheng (shengmu yunmu &optional s y)
+    (let ((input (concat shengmu yunmu))
+         (output (concat (if s s (capitalize shengmu)) (if y y yunmu) "\e(0@\e(B"))
+         state term-state)
+      (setq state (its-defrule* input output))
+      (its-make-next-state state ?  output)
+      (its-make-next-state state ?0 output)
+      (setq term-state (its-prev-terminal-state its-parent-states))
+      (if term-state
+         (let ((back (- (length (its-get-keyseq term-state)) (length input)))
+               (output (its-get-output (its-get-next-state term-state -1)))
+               (parents its-parent-states))
+           (while (null (eq (car parents) term-state))
+             (its-make-next-state (car parents) -1 output (1+ back))
+             (its-defrule-otherwise (car parents) output nil back)
+             (setq back (1+ back)
+                   parents (cdr parents)))))
+      state))
+
+  (defmacro its-do-sisheng-table (list)
+    `(progn
+       ,@(mapcar (lambda (syl)
+                  `(its-define-sisheng ,@syl))
+                list)))
+
+  (defmacro its-define-sisheng (shengmu yunmu)
+    `(let ((qing (nth 5 ,yunmu)) (y (car ,yunmu))
+          (ss (list ,@shengmu)) s cs state i)
+       (while ss
+        (setq s (car ss)
+              ss (cdr ss)
+              cs (capitalize s)
+              state (its-define-qingsheng s y cs qing))
+        (its-make-next-state state ?1 (concat cs (nth 1 ,yunmu) "\e(0@\e(B"))
+        (its-make-next-state state ?2 (concat cs (nth 2 ,yunmu) "\e(0@\e(B"))
+        (its-make-next-state state ?3 (concat cs (nth 3 ,yunmu) "\e(0@\e(B"))
+        (its-make-next-state state ?4 (concat cs (nth 4 ,yunmu) "\e(0@\e(B")))))
+
+  (defmacro its-define-pinyin-table ()
+    '(let ((- "")  (B "b") (C "c") (D "d") (F "f") (G "g") (H "h")
+          (J "j") (K "k") (L "l") (M "m") (N "n") (P "p") (Q "q")
+          (R "r") (S "s") (T "t") (W "w") (X "x") (Y "y") (Z "z")
+          (CH "ch") (SH "sh") (ZH "zh")
+
+          (A    '("a"    "\e(0!\e(B"    "\e(0"\e(B"    "\e(0#\e(B"    "\e(0$\e(B"    "a"   ))
+          (AI   '("ai"   "\e(0!\e(Bi"   "\e(0"\e(Bi"   "\e(0#\e(Bi"   "\e(0$\e(Bi"   "ai"  ))
+          (AN   '("an"   "\e(0!\e(Bn"   "\e(0"\e(Bn"   "\e(0#\e(Bn"   "\e(0$\e(Bn"   "an"  ))
+          (ANG  '("ang"  "\e(0!\e(Bng"  "\e(0"\e(Bng"  "\e(0#\e(Bng"  "\e(0$\e(Bng"  "ang" ))
+          (AO   '("ao"   "\e(0!\e(Bo"   "\e(0"\e(Bo"   "\e(0#\e(Bo"   "\e(0$\e(Bo"   "ao"  ))
+          (E    '("e"    "\e(0%\e(B"    "\e(0&\e(B"    "\e(0'\e(B"    "\e(0(\e(B"    "e"   ))
+          (EI   '("ei"   "\e(0%\e(Bi"   "\e(0&\e(Bi"   "\e(0'\e(Bi"   "\e(0(\e(Bi"   "ei"  ))
+          (EN   '("en"   "\e(0%\e(Bn"   "\e(0&\e(Bn"   "\e(0'\e(Bn"   "\e(0(\e(Bn"   "en"  ))
+          (ENG  '("eng"  "\e(0%\e(Bng"  "\e(0&\e(Bng"  "\e(0'\e(Bng"  "\e(0(\e(Bng"  "eng" ))
+          (ER   '("er"   "\e(0%\e(Br"   "\e(0&\e(Br"   "\e(0'\e(Br"   "\e(0(\e(Br"   "er"  ))
+          (I    '("i"    "\e(0)\e(B"    "\e(0*\e(B"    "\e(0+\e(B"    "\e(0,\e(B"    "i"   ))
+          (IA   '("ia"   "i\e(0!\e(B"   "i\e(0"\e(B"   "i\e(0#\e(B"   "i\e(0$\e(B"   "ia"  ))
+          (IAN  '("ian"  "i\e(0!\e(Bn"  "i\e(0"\e(Bn"  "i\e(0#\e(Bn"  "i\e(0$\e(Bn"  "ian" ))
+          (IANG '("iang" "i\e(0!\e(Bng" "i\e(0"\e(Bng" "i\e(0#\e(Bng" "i\e(0$\e(Bng" "iang"))
+          (IAO  '("iao"  "i\e(0!\e(Bo"  "i\e(0"\e(Bo"  "i\e(0#\e(Bo"  "i\e(0$\e(Bo"  "iao" ))
+          (IE   '("ie"   "i\e(0%\e(B"   "i\e(0&\e(B"   "i\e(0'\e(B"   "i\e(0(\e(B"   "ie"  ))
+          (IN   '("in"   "\e(0)\e(Bn"   "\e(0*\e(Bn"   "\e(0+\e(Bn"   "\e(0,\e(Bn"   "in"  ))
+          (ING  '("ing"  "\e(0)\e(Bng"  "\e(0*\e(Bng"  "\e(0+\e(Bng"  "\e(0,\e(Bng"  "ing" ))
+          (IONG '("iong" "i\e(0-\e(Bng" "i\e(0.\e(Bng" "i\e(0/\e(Bng" "i\e(00\e(Bng" "iong"))
+          (IU   '("iu"   "i\e(01\e(B"   "i\e(02\e(B"   "i\e(03\e(B"   "i\e(04\e(B"   "iu"  ))
+          (O    '("o"    "\e(0-\e(B"    "\e(0.\e(B"    "\e(0/\e(B"    "\e(00\e(B"    "o"   ))
+          (ONG  '("ong"  "\e(0-\e(Bng"  "\e(0.\e(Bng"  "\e(0/\e(Bng"  "\e(00\e(Bng"  "ong" ))
+          (OU   '("ou"   "\e(0-\e(Bu"   "\e(0.\e(Bu"   "\e(0/\e(Bu"   "\e(00\e(Bu"   "ou"  ))
+          (U    '("u"    "\e(01\e(B"    "\e(02\e(B"    "\e(03\e(B"    "\e(04\e(B"    "u"   ))
+          (V    '("v"    "\e(05\e(B"    "\e(06\e(B"    "\e(07\e(B"    "\e(08\e(B"    "\e(09\e(B"   ))
+          (UA   '("ua"   "u\e(0!\e(B"   "u\e(0"\e(B"   "u\e(0#\e(B"   "u\e(0$\e(B"   "ua"  ))
+          (UAI  '("uai"  "u\e(0!\e(Bi"  "u\e(0"\e(Bi"  "u\e(0#\e(Bi"  "u\e(0$\e(Bi"  "uai" ))
+          (UAN  '("uan"  "u\e(0!\e(Bn"  "u\e(0"\e(Bn"  "u\e(0#\e(Bn"  "u\e(0$\e(Bn"  "uan" ))
+          (UANG '("uang" "u\e(0!\e(Bng" "u\e(0"\e(Bng" "u\e(0#\e(Bng" "u\e(0$\e(Bng" "uang"))
+          (UE   '("ue"   "u\e(0%\e(B"   "u\e(0&\e(B"   "u\e(0'\e(B"   "u\e(0(\e(B"   "ue"  ))
+          (VE   '("ve"   "\e(09%\e(B"   "\e(09&\e(B"   "\e(09'\e(B"   "\e(09(\e(B"   "\e(09\e(Be"  ))
+          (UI   '("ui"   "u\e(0)\e(B"   "u\e(0*\e(B"   "u\e(0+\e(B"   "u\e(0,\e(B"   "ui"  ))
+          (UN   '("un"   "\e(01\e(Bn"   "\e(02\e(Bn"   "\e(03\e(Bn"   "\e(04\e(Bn"   "un"  ))
+          (UO   '("uo"   "u\e(0-\e(B"   "u\e(0.\e(B"   "u\e(0/\e(B"   "u\e(00\e(B"   "uo"  )))
+
+       (its-define-qingsheng   "hm"    "")
+       (its-define-qingsheng   "hng"   "")
+       (its-defrule*           "m"     "m\e(0@\e(B")
+       (its-defrule            "m0"    "m\e(0@\e(B")
+       (its-defrule*           "n"     "n\e(0@\e(B")
+       (its-defrule            "n0"    "n\e(0@\e(B")
+       (its-defrule            "n2"    "\e(0=@\e(B")
+       (its-defrule            "n3"    "\e(0>@\e(B")
+       (its-defrule            "n4"    "\e(0?@\e(B")
+       (its-define-qingsheng   ""      "ng")
+
+       (its-do-sisheng-table
+       (((- B C D F G H   K L M N P     S T W   Y Z CH SH ZH ) A)
+        ((- B C D   G H   K L M N P     S T W     Z CH SH ZH ) AI)
+        ((- B C D F G H   K L M N P   R S T W   Y Z CH SH ZH ) AN)
+        ((- B C D F G H   K L M N P   R S T W   Y Z CH SH ZH ) ANG)
+        ((- B C D   G H   K L M N P   R S T     Y Z CH SH ZH ) AO)
+        ((-   C D   G H   K L M N     R S T     Y Z CH SH ZH ) E)
+        ((- B C D F G H   K L M N P       T W     Z    SH ZH ) EI)
+        ((- B C D F G H   K   M N P   R S   W     Z CH SH ZH ) EN)
+        ((- B C D F G H   K L M N P   R S T W     Z CH SH ZH ) ENG)
+        ((-                                                  ) ER)
+        ((  B C D       J   L M N P Q R S T   X Y Z CH SH ZH ) I)
+        ((      D       J   L       Q         X              ) IA)
+        ((  B   D       J   L M N P Q     T   X              ) IAN)
+        ((              J   L   N   Q         X              ) IANG)
+        ((  B   D       J   L M N P Q     T   X              ) IAO)
+        ((  B   D       J   L M N P Q     T   X              ) IE)
+        ((  B           J   L M N P Q         X Y            ) IN)
+        ((  B   D       J   L M N P Q     T   X Y            ) ING)
+        ((              J           Q         X              ) IONG)
+        ((      D       J   L M N   Q         X              ) IU)
+        ((- B     F         L M   P         W   Y            ) O)
+        ((    C D   G H   K L   N     R S T     Y Z CH    ZH ) ONG)
+        ((-   C D F G H   K L M N P   R S T     Y Z CH SH ZH ) OU)
+        ((  B C D F G H J K L M N P Q R S T W X Y Z CH SH ZH ) U)
+        ((                  L   N                            ) V)
+        ((          G H   K           R             CH SH ZH ) UA)
+        ((          G H   K                         CH SH ZH ) UAI)
+        ((    C D   G H J K L   N   Q R S T   X Y Z CH SH ZH ) UAN)
+        ((          G H   K                         CH SH ZH ) UANG)
+        ((              J           Q         X Y            ) UE)
+        ((                  L   N                            ) VE)
+        ((    C D   G H   K           R S T       Z CH SH ZH ) UI)
+        ((    C D   G H J K L       Q R S T   X Y Z CH SH ZH ) UN)
+        ((    C D   G H   K L   N     R S T       Z CH SH ZH ) UO)
+
+        ((J Q X) (cons "a"   (cdr IA  )))
+        ((J Q X) (cons "ai"  (cdr IA  )))
+        ((J Q X) (cons "an"  (cdr IAN )))
+        ((J Q X) (cons "ang" (cdr IANG)))
+        ((J Q X) (cons "ao"  (cdr IAO )))
+        ((J Q X) (cons "e"   (cdr IE  )))
+        ((J Q X) (cons "ei"  (cdr IE  )))
+        ((J Q X) (cons "en"  (cdr IN  )))
+        ((J Q X) (cons "eng" (cdr ING )))
+        ((J Q X) (cons "ou"  (cdr IU  ))))))))
+
+(define-its-state-machine its-pinyin-cn-map
+  "pinyin-cn" "\e$AF4\e(BG" Chinese-GB
+  "Map for Pinyin input. (Chinese-GB)"
+
+  (defconst its-quanjiao-escape "Z")
+  (defconst its-banjiao-escape  "X")
+
+  (its-defrule-select-mode-temporally "B" downcase)
+  (its-defrule-select-mode-temporally "Q" quanjiao-downcase-cn)
+
+  (its-define-pinyin-table)
+  (its-defrule "b "    "\e$A2;\e(B")
+  (its-defrule "c "    "\e$A2E\e(B")
+  (its-defrule "ch "   "\e$A3v\e(B")
+  (its-defrule "d "    "\e$A5D\e(B")
+  (its-defrule "f "    "\e$A74\e(B")
+  (its-defrule "g "    "\e$A8v\e(B")
+  (its-defrule "h "    "\e$A:M\e(B")
+  (its-defrule "i "    "\e$AR;\e(B")
+  (its-defrule "j "    "\e$A>M\e(B")
+  (its-defrule "k "    "\e$A?I\e(B")
+  (its-defrule "l "    "\e$AAK\e(B")
+  (its-defrule "m "    "\e$AC?\e(B")
+  (its-defrule "n "    "\e$ADj\e(B")
+  (its-defrule "p "    "\e$AEz\e(B")
+  (its-defrule "q "    "\e$AH%\e(B")
+  (its-defrule "r "    "\e$AHU\e(B")
+  (its-defrule "s "    "\e$AJG\e(B")
+  (its-defrule "sh "   "\e$AIO\e(B")
+  (its-defrule "t "    "\e$AK{\e(B")
+  (its-defrule "w "    "\e$ANR\e(B")
+  (its-defrule "x "    "\e$AOr\e(B")
+  (its-defrule "y "    "\e$ASV\e(B")
+  (its-defrule "z "    "\e$ATZ\e(B")
+  (its-defrule "zh "   "\e$AWE\e(B")
+
+  (dolist (ascii '(("0" . "\e$A#0\e(B")  ("1" . "\e$A#1\e(B")  ("2" . "\e$A#2\e(B")  ("3" . "\e$A#3\e(B")
+                  ("4" . "\e$A#4\e(B")  ("5" . "\e$A#5\e(B")  ("6" . "\e$A#6\e(B")  ("7" . "\e$A#7\e(B")
+                  ("8" . "\e$A#8\e(B")  ("9" . "\e$A#9\e(B") 
+                  (" " . "\e$A!!\e(B")  ("!" . "\e$A#!\e(B")  ("@" . "\e$A#@\e(B")  ("#" . "\e$A##\e(B")
+                  ("$" . "\e$A!g\e(B")  ("%" . "\e$A#%\e(B")  ("^" . "\e$A#^\e(B")  ("&" . "\e$A#&\e(B")
+                  ("*" . "\e$A#*\e(B")  ("(" . "\e$A#(\e(B")  (")" . "\e$A#)\e(B")
+                  ("-" . "\e$A#-\e(B")  ("=" . "\e$A#=\e(B")  ("`" . "\e$A#`\e(B")  ("\\" . "\e$A#\\e(B")
+                  ("|" . "\e$A#|\e(B")  ("_" . "\e$A#_\e(B")  ("+" . "\e$A#+\e(B")  ("~" . "\e$A!+\e(B")
+                  ("[" . "\e$A#[\e(B")  ("]" . "\e$A#]\e(B")  ("{" . "\e$A#{\e(B")  ("}" . "\e$A#}\e(B")
+                  (":" . "\e$A#:\e(B")  (";" . "\e$A#;\e(B")  ("\"" . "\e$A#"\e(B") ("'" . "\e$A#'\e(B")
+                  ("<" . "\e$A#<\e(B")  (">" . "\e$A#>\e(B")  ("?" . "\e$A#?\e(B")  ("/" . "\e$A#/\e(B")
+                  ("," . "\e$A#,\e(B")  ("." . "\e$A#.\e(B")
+                  ("a" . "\e$A#a\e(B")  ("b" . "\e$A#b\e(B")  ("c" . "\e$A#c\e(B")  ("d" . "\e$A#d\e(B")
+                  ("e" . "\e$A#e\e(B")  ("f" . "\e$A#f\e(B")  ("g" . "\e$A#g\e(B")  ("h" . "\e$A#h\e(B")
+                  ("i" . "\e$A#i\e(B")  ("j" . "\e$A#j\e(B")  ("k" . "\e$A#k\e(B")  ("l" . "\e$A#l\e(B")
+                  ("m" . "\e$A#m\e(B")  ("n" . "\e$A#n\e(B")  ("o" . "\e$A#o\e(B")  ("p" . "\e$A#p\e(B")
+                  ("q" . "\e$A#q\e(B")  ("r" . "\e$A#r\e(B")  ("s" . "\e$A#s\e(B")  ("t" . "\e$A#t\e(B")
+                  ("u" . "\e$A#u\e(B")  ("v" . "\e$A#v\e(B")  ("w" . "\e$A#w\e(B")  ("x" . "\e$A#x\e(B")
+                  ("y" . "\e$A#y\e(B")  ("z" . "\e$A#z\e(B")
+                  ("A" . "\e$A#A\e(B")  ("B" . "\e$A#B\e(B")  ("C" . "\e$A#C\e(B")  ("D" . "\e$A#D\e(B")
+                  ("E" . "\e$A#E\e(B")  ("F" . "\e$A#F\e(B")  ("G" . "\e$A#G\e(B")  ("H" . "\e$A#H\e(B")
+                  ("I" . "\e$A#I\e(B")  ("J" . "\e$A#J\e(B")  ("K" . "\e$A#K\e(B")  ("L" . "\e$A#L\e(B")
+                  ("M" . "\e$A#M\e(B")  ("N" . "\e$A#N\e(B")  ("O" . "\e$A#O\e(B")  ("P" . "\e$A#P\e(B")
+                  ("Q" . "\e$A#Q\e(B")  ("R" . "\e$A#R\e(B")  ("S" . "\e$A#S\e(B")  ("T" . "\e$A#T\e(B")
+                  ("U" . "\e$A#U\e(B")  ("V" . "\e$A#V\e(B")  ("W" . "\e$A#W\e(B")  ("X" . "\e$A#X\e(B")
+                  ("Y" . "\e$A#Y\e(B")  ("Z" . "\e$A#Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule (concat its-banjiao-escape in) in)
+      (its-defrule (concat its-quanjiao-escape in) out)))
+
+  (its-defrule ","     "\e$A#,\e(B")
+  (its-defrule "."     "\e$A!#\e(B")
+  (its-defrule "/"     "\e$A!"\e(B")
+  (its-defrule ":"     "\e$A#:\e(B")
+  (its-defrule ";"     "\e$A#;\e(B")
+  (its-defrule "?"     "\e$A#?\e(B")
+  (its-defrule "!"     "\e$A#!\e(B"))
+
+(define-its-state-machine its-pinyin-tw-map
+  "pinyin-tw" "\e$(GQ;\e(BC" Chinese-CNS
+  "Map for Pinyin input."
+
+  (defconst its-quanjiao-escape "Z")
+  (defconst its-banjiao-escape  "X")
+
+  (its-defrule-select-mode-temporally "B" downcase)
+  (its-defrule-select-mode-temporally "Q" quanjiao-downcase-tw)
+
+  (its-define-pinyin-table)
+  (its-defrule "b "    "\e$(GDb\e(B")
+  (its-defrule "c "    "\e$(GD_\e(B")
+  (its-defrule "ch "   "\e$(GEx\e(B")
+  (its-defrule "d "    "\e$(GN{\e(B")
+  (its-defrule "f "    "\e$(GE0\e(B")
+  (its-defrule "g "    "\e$(GT6\e(B")
+  (its-defrule "h "    "\e$(GLO\e(B")
+  (its-defrule "i "    "\e$(GD!\e(B")
+  (its-defrule "j "    "\e$(G^s\e(B")
+  (its-defrule "k "    "\e$(GF+\e(B")
+  (its-defrule "l "    "\e$(GD'\e(B")
+  (its-defrule "m "    "\e$(GJd\e(B")
+  (its-defrule "n "    "\e$(GH!\e(B")
+  (its-defrule "p "    "\e$(GJG\e(B")
+  (its-defrule "q "    "\e$(GF*\e(B")
+  (its-defrule "r "    "\e$(GEJ\e(B")
+  (its-defrule "s "    "\e$(GQR\e(B")
+  (its-defrule "sh "   "\e$(GD8\e(B")
+  (its-defrule "t "    "\e$(GEl\e(B")
+  (its-defrule "w "    "\e$(GJ<\e(B")
+  (its-defrule "x "    "\e$(GGW\e(B")
+  (its-defrule "y "    "\e$(GD4\e(B")
+  (its-defrule "z "    "\e$(GGc\e(B")
+  (its-defrule "zh "   "\e$(Gaa\e(B")
+
+  (dolist (ascii '(("0" . "\e$(G$!\e(B")  ("1" . "\e$(G$"\e(B")  ("2" . "\e$(G$#\e(B")  ("3" . "\e$(G$$\e(B")
+                  ("4" . "\e$(G$%\e(B")  ("5" . "\e$(G$&\e(B")  ("6" . "\e$(G$'\e(B")  ("7" . "\e$(G$(\e(B")
+                  ("8" . "\e$(G$)\e(B")  ("9" . "\e$(G$*\e(B") 
+                  (" " . "\e$(G!!\e(B")  ("!" . "\e$(G!*\e(B")  ("@" . "\e$(G"i\e(B")  ("#" . "\e$(G!l\e(B")
+                  ("$" . "\e$(G"c\e(B")  ("%" . "\e$(G"h\e(B")  ("^" . "\e$(G!T\e(B")  ("&" . "\e$(G!m\e(B")
+                  ("*" . "\e$(G!n\e(B")  ("(" . "\e$(G!>\e(B")  (")" . "\e$(G!?\e(B")
+                  ("-" . "\e$(G"1\e(B")  ("=" . "\e$(G"8\e(B")  ("`" . "\e$(G!j\e(B")  ("\\" . "\e$(G"`\e(B")
+                  ("|" . "\e$(G"^\e(B")  ("_" . "\e$(G"%\e(B")  ("+" . "\e$(G"0\e(B")  ("~" . "\e$(G"D\e(B")
+                  ("[" . "\e$(G!b\e(B")  ("]" . "\e$(G!c\e(B")  ("{" . "\e$(G!B\e(B")  ("}" . "\e$(G!C\e(B")
+                  (":" . "\e$(G!(\e(B")  (";" . "\e$(G!'\e(B")  ("\"" . "\e$(G!i\e(B") ("'" . "\e$(G!k\e(B")
+                  ("<" . "\e$(G"6\e(B")  (">" . "\e$(G"7\e(B")  ("?" . "\e$(G!)\e(B")  ("/" . "\e$(G"_\e(B")
+                  ("," . "\e$(G!"\e(B")  ("." . "\e$(G!%\e(B")
+                  ("a" . "\e$(G$[\e(B")  ("b" . "\e$(G$\\e(B")  ("c" . "\e$(G$]\e(B")  ("d" . "\e$(G$^\e(B")
+                  ("e" . "\e$(G$_\e(B")  ("f" . "\e$(G$`\e(B")  ("g" . "\e$(G$a\e(B")  ("h" . "\e$(G$b\e(B")
+                  ("i" . "\e$(G$c\e(B")  ("j" . "\e$(G$d\e(B")  ("k" . "\e$(G$e\e(B")  ("l" . "\e$(G$f\e(B")
+                  ("m" . "\e$(G$g\e(B")  ("n" . "\e$(G$h\e(B")  ("o" . "\e$(G$i\e(B")  ("p" . "\e$(G$j\e(B")
+                  ("q" . "\e$(G$k\e(B")  ("r" . "\e$(G$l\e(B")  ("s" . "\e$(G$m\e(B")  ("t" . "\e$(G$n\e(B")
+                  ("u" . "\e$(G$o\e(B")  ("v" . "\e$(G$p\e(B")  ("w" . "\e$(G$q\e(B")  ("x" . "\e$(G$r\e(B")
+                  ("y" . "\e$(G$s\e(B")  ("z" . "\e$(G$t\e(B")
+                  ("A" . "\e$(G$A\e(B")  ("B" . "\e$(G$B\e(B")  ("C" . "\e$(G$C\e(B")  ("D" . "\e$(G$D\e(B")
+                  ("E" . "\e$(G$E\e(B")  ("F" . "\e$(G$F\e(B")  ("G" . "\e$(G$G\e(B")  ("H" . "\e$(G$H\e(B")
+                  ("I" . "\e$(G$I\e(B")  ("J" . "\e$(G$J\e(B")  ("K" . "\e$(G$K\e(B")  ("L" . "\e$(G$L\e(B")
+                  ("M" . "\e$(G$M\e(B")  ("N" . "\e$(G$N\e(B")  ("O" . "\e$(G$O\e(B")  ("P" . "\e$(G$P\e(B")
+                  ("Q" . "\e$(G$Q\e(B")  ("R" . "\e$(G$R\e(B")  ("S" . "\e$(G$S\e(B")  ("T" . "\e$(G$T\e(B")
+                  ("U" . "\e$(G$U\e(B")  ("V" . "\e$(G$V\e(B")  ("W" . "\e$(G$W\e(B")  ("X" . "\e$(G$X\e(B")
+                  ("Y" . "\e$(G$Y\e(B")  ("Z" . "\e$(G$Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule (concat its-banjiao-escape in) in)
+      (its-defrule (concat its-quanjiao-escape in) out)))
+
+  (its-defrule ","     "\e$(G!"\e(B")
+  (its-defrule "."     "\e$(G!$\e(B")
+  (its-defrule "/"     "\e$(G!#\e(B")
+  (its-defrule ":"     "\e$(G!(\e(B")
+  (its-defrule ";"     "\e$(G!'\e(B")
+  (its-defrule "?"     "\e$(G!)\e(B")
+  (its-defrule "!"     "\e$(G!*\e(B"))
+
+(define-its-state-machine-append its-pinyin-cn-map
+  (its-defrule "[" its-pinyin-cn-open-braket)
+  (its-defrule "]" its-pinyin-cn-close-braket)
+
+  (if its-pinyin-cn-enable-quanjioao-alphabet
+      (progn
+       (its-defrule "1"  "\e$A#1\e(B")  (its-defrule "2"  "\e$A#2\e(B")
+       (its-defrule "3"  "\e$A#3\e(B")  (its-defrule "4"  "\e$A#4\e(B")
+       (its-defrule "5"  "\e$A#5\e(B")  (its-defrule "6"  "\e$A#6\e(B")
+       (its-defrule "7"  "\e$A#7\e(B")  (its-defrule "8"  "\e$A#8\e(B")
+       (its-defrule "9"  "\e$A#9\e(B")  (its-defrule "0"  "\e$A#0\e(B")
+       (its-defrule "@"  "\e$A#@\e(B")
+       (its-defrule "#"  "\e$A##\e(B")  (its-defrule "$"  "\e$A!g\e(B")
+       (its-defrule "%"  "\e$A#%\e(B")  (its-defrule "^"  "\e$A#^\e(B")
+       (its-defrule "&"  "\e$A#&\e(B")  (its-defrule "*"  "\e$A#*\e(B")
+       (its-defrule "("  "\e$A#(\e(B")  (its-defrule ")"  "\e$A#)\e(B")
+       (its-defrule "-"  "\e$A#-\e(B")  (its-defrule "~"  "\e$A!+\e(B")
+       (its-defrule "="  "\e$A#=\e(B")  (its-defrule "`"  "\e$A#`\e(B")
+       (its-defrule "\\" "\e$A#\\e(B")  (its-defrule "|"  "\e$A#|\e(B")
+       (its-defrule "_"  "\e$A#_\e(B")  (its-defrule "+"  "\e$A#+\e(B")
+       (its-defrule "{"  "\e$A#{\e(B")  (its-defrule "}"  "\e$A#}\e(B")
+       (its-defrule "\"" "\e$A#"\e(B")  (its-defrule "'"  "\e$A#'\e(B")
+       (its-defrule "<"  "\e$A#<\e(B")  (its-defrule ">"  "\e$A#>\e(B"))
+    (progn
+      (its-defrule "1"  "1")  (its-defrule "2"  "2")
+      (its-defrule "3"  "3")  (its-defrule "4"  "4")
+      (its-defrule "5"  "5")  (its-defrule "6"  "6")
+      (its-defrule "7"  "7")  (its-defrule "8"  "8")
+      (its-defrule "9"  "9")  (its-defrule "0"  "0")
+      (its-defrule "@"  "@")
+      (its-defrule "#"  "#")  (its-defrule "$"  "$")
+      (its-defrule "%"  "%")  (its-defrule "^"  "^")
+      (its-defrule "&"  "&")  (its-defrule "*"  "*")
+      (its-defrule "("  "(")  (its-defrule ")"  ")")
+      (its-defrule "-"  "-")  (its-defrule "~"  "~")
+      (its-defrule "="  "=")  (its-defrule "`"  "`")
+      (its-defrule "\\" "\\") (its-defrule "|"  "|")
+      (its-defrule "_"  "_")  (its-defrule "+"  "+")
+      (its-defrule "{"  "{")  (its-defrule "}"  "}")
+      (its-defrule "\"" "\"") (its-defrule "'"  "'")
+      (its-defrule "<"  "<")  (its-defrule ">"  ">"))))
+
+(define-its-state-machine-append its-pinyin-tw-map
+  (its-defrule "[" its-pinyin-tw-open-braket)
+  (its-defrule "]" its-pinyin-tw-close-braket)
+
+  (if its-pinyin-tw-enable-quanjioao-alphabet
+      (progn
+       (its-defrule "1"  "\e$(G$"\e(B")  (its-defrule "2"  "\e$(G$#\e(B")
+       (its-defrule "3"  "\e$(G$$\e(B")  (its-defrule "4"  "\e$(G$%\e(B")
+       (its-defrule "5"  "\e$(G$&\e(B")  (its-defrule "6"  "\e$(G$'\e(B")
+       (its-defrule "7"  "\e$(G$(\e(B")  (its-defrule "8"  "\e$(G$)\e(B")
+       (its-defrule "9"  "\e$(G$*\e(B")  (its-defrule "0"  "\e$(G$!\e(B")
+       (its-defrule "@"  "\e$(G"i\e(B")
+       (its-defrule "#"  "\e$(G!l\e(B")  (its-defrule "$"  "\e$(G"c\e(B")
+       (its-defrule "%"  "\e$(G"h\e(B")  (its-defrule "^"  "\e$(G!T\e(B")
+       (its-defrule "&"  "\e$(G!m\e(B")  (its-defrule "*"  "\e$(G!n\e(B")
+       (its-defrule "("  "\e$(G!>\e(B")  (its-defrule ")"  "\e$(G!?\e(B")
+       (its-defrule "-"  "\e$(G"1\e(B")  (its-defrule "~"  "\e$(G"D\e(B")
+       (its-defrule "="  "\e$(G"8\e(B")  (its-defrule "`"  "\e$(G!j\e(B")
+       (its-defrule "\\" "\e$(G"b\e(B")  (its-defrule "|"  "\e$(G"^\e(B")
+       (its-defrule "_"  "\e$(G"%\e(B")  (its-defrule "+"  "\e$(G"0\e(B")
+       (its-defrule "{"  "\e$(G!B\e(B")  (its-defrule "}"  "\e$(G!C\e(B")
+       (its-defrule "\"" "\e$(G!i\e(B")  (its-defrule "'"  "\e$(G!k\e(B")
+       (its-defrule "<"  "\e$(G"6\e(B")  (its-defrule ">"  "\e$(G"7\e(B"))
+    (progn
+      (its-defrule "1"  "1")  (its-defrule "2"  "2")
+      (its-defrule "3"  "3")  (its-defrule "4"  "4")
+      (its-defrule "5"  "5")  (its-defrule "6"  "6")
+      (its-defrule "7"  "7")  (its-defrule "8"  "8")
+      (its-defrule "9"  "9")  (its-defrule "0"  "0")
+      (its-defrule "@"  "@")
+      (its-defrule "#"  "#")  (its-defrule "$"  "$")
+      (its-defrule "%"  "%")  (its-defrule "^"  "^")
+      (its-defrule "&"  "&")  (its-defrule "*"  "*")
+      (its-defrule "("  "(")  (its-defrule ")"  ")")
+      (its-defrule "-"  "-")  (its-defrule "~"  "~")
+      (its-defrule "="  "=")  (its-defrule "`"  "`")
+      (its-defrule "\\" "\\") (its-defrule "|"  "|")
+      (its-defrule "_"  "_")  (its-defrule "+"  "+")
+      (its-defrule "{"  "{")  (its-defrule "}"  "}")
+      (its-defrule "\"" "\"") (its-defrule "'"  "'")
+      (its-defrule "<"  "<")  (its-defrule ">"  ">"))))
+
+(provide 'its/pinyin)
diff --git a/its/quanjiao.el b/its/quanjiao.el
new file mode 100644 (file)
index 0000000..a127083
--- /dev/null
@@ -0,0 +1,179 @@
+;;; its/quanjiao.el --- Quanjiao ASCII Input in Egg Input Method Architecture
+
+;; Copyright (C) 1999,2000 PFU LIMITED
+
+;; Author: KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+;;
+;; Symbol input is desined by jiro@math.keio.ac.jp (TANAKA Jiro)
+;; This file is based on the rules of its/hira.el in Mule-2.3 distribution.
+;;
+
+;;; Code:
+
+(eval-when-compile
+  (require 'its))
+
+(define-its-state-machine its-quanjiao-up-cn-map
+  "quanjiao-upcase-cn" "\e$A#A\e(B" Chinese-GB
+  "Map for quanjiao-upcase input. (Chinese-GB)"
+
+  (dolist (ascii '(("0" . "\e$A#0\e(B")  ("1" . "\e$A#1\e(B")  ("2" . "\e$A#2\e(B")  ("3" . "\e$A#3\e(B")
+                  ("4" . "\e$A#4\e(B")  ("5" . "\e$A#5\e(B")  ("6" . "\e$A#6\e(B")  ("7" . "\e$A#7\e(B")
+                  ("8" . "\e$A#8\e(B")  ("9" . "\e$A#9\e(B") 
+                  (" " . "\e$A!!\e(B")  ("!" . "\e$A#!\e(B")  ("@" . "\e$A#@\e(B")  ("#" . "\e$A##\e(B")
+                  ("$" . "\e$A!g\e(B")  ("%" . "\e$A#%\e(B")  ("^" . "\e$A#^\e(B")  ("&" . "\e$A#&\e(B")
+                  ("*" . "\e$A#*\e(B")  ("(" . "\e$A#(\e(B")  (")" . "\e$A#)\e(B")
+                  ("-" . "\e$A#-\e(B")  ("=" . "\e$A#=\e(B")  ("`" . "\e$A#`\e(B")  ("\\" . "\e$A#\\e(B")
+                  ("|" . "\e$A#|\e(B")  ("_" . "\e$A#_\e(B")  ("+" . "\e$A#+\e(B")  ("~" . "\e$A!+\e(B")
+                  ("[" . "\e$A#[\e(B")  ("]" . "\e$A#]\e(B")  ("{" . "\e$A#{\e(B")  ("}" . "\e$A#}\e(B")
+                  (":" . "\e$A#:\e(B")  (";" . "\e$A#;\e(B")  ("\"" . "\e$A#"\e(B") ("'" . "\e$A#'\e(B")
+                  ("<" . "\e$A#<\e(B")  (">" . "\e$A#>\e(B")  ("?" . "\e$A#?\e(B")  ("/" . "\e$A#/\e(B")
+                  ("," . "\e$A#,\e(B")  ("." . "\e$A#.\e(B")
+                  ("a" . "\e$A#A\e(B")  ("b" . "\e$A#B\e(B")  ("c" . "\e$A#C\e(B")  ("d" . "\e$A#D\e(B")
+                  ("e" . "\e$A#E\e(B")  ("f" . "\e$A#F\e(B")  ("g" . "\e$A#G\e(B")  ("h" . "\e$A#H\e(B")
+                  ("i" . "\e$A#I\e(B")  ("j" . "\e$A#J\e(B")  ("k" . "\e$A#K\e(B")  ("l" . "\e$A#L\e(B")
+                  ("m" . "\e$A#M\e(B")  ("n" . "\e$A#N\e(B")  ("o" . "\e$A#O\e(B")  ("p" . "\e$A#P\e(B")
+                  ("q" . "\e$A#Q\e(B")  ("r" . "\e$A#R\e(B")  ("s" . "\e$A#S\e(B")  ("t" . "\e$A#T\e(B")
+                  ("u" . "\e$A#U\e(B")  ("v" . "\e$A#V\e(B")  ("w" . "\e$A#W\e(B")  ("x" . "\e$A#X\e(B")
+                  ("y" . "\e$A#Y\e(B")  ("z" . "\e$A#Z\e(B")
+                  ("A" . "\e$A#A\e(B")  ("B" . "\e$A#B\e(B")  ("C" . "\e$A#C\e(B")  ("D" . "\e$A#D\e(B")
+                  ("E" . "\e$A#E\e(B")  ("F" . "\e$A#F\e(B")  ("G" . "\e$A#G\e(B")  ("H" . "\e$A#H\e(B")
+                  ("I" . "\e$A#I\e(B")  ("J" . "\e$A#J\e(B")  ("K" . "\e$A#K\e(B")  ("L" . "\e$A#L\e(B")
+                  ("M" . "\e$A#M\e(B")  ("N" . "\e$A#N\e(B")  ("O" . "\e$A#O\e(B")  ("P" . "\e$A#P\e(B")
+                  ("Q" . "\e$A#Q\e(B")  ("R" . "\e$A#R\e(B")  ("S" . "\e$A#S\e(B")  ("T" . "\e$A#T\e(B")
+                  ("U" . "\e$A#U\e(B")  ("V" . "\e$A#V\e(B")  ("W" . "\e$A#W\e(B")  ("X" . "\e$A#X\e(B")
+                  ("Y" . "\e$A#Y\e(B")  ("Z" . "\e$A#Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule in out))))
+
+(define-its-state-machine-append its-quanjiao-up-cn-map)
+
+(define-its-state-machine its-quanjiao-down-cn-map
+  "quanjiao-downcase-cn" "\e$A#a\e(B" Chinese-GB
+  "Map for quanjiao-downcase input. (Chinese-GB)"
+
+  (dolist (ascii '(("0" . "\e$A#0\e(B")  ("1" . "\e$A#1\e(B")  ("2" . "\e$A#2\e(B")  ("3" . "\e$A#3\e(B")
+                  ("4" . "\e$A#4\e(B")  ("5" . "\e$A#5\e(B")  ("6" . "\e$A#6\e(B")  ("7" . "\e$A#7\e(B")
+                  ("8" . "\e$A#8\e(B")  ("9" . "\e$A#9\e(B") 
+                  (" " . "\e$A!!\e(B")  ("!" . "\e$A#!\e(B")  ("@" . "\e$A#@\e(B")  ("#" . "\e$A##\e(B")
+                  ("$" . "\e$A!g\e(B")  ("%" . "\e$A#%\e(B")  ("^" . "\e$A#^\e(B")  ("&" . "\e$A#&\e(B")
+                  ("*" . "\e$A#*\e(B")  ("(" . "\e$A#(\e(B")  (")" . "\e$A#)\e(B")
+                  ("-" . "\e$A#-\e(B")  ("=" . "\e$A#=\e(B")  ("`" . "\e$A#`\e(B")  ("\\" . "\e$A#\\e(B")
+                  ("|" . "\e$A#|\e(B")  ("_" . "\e$A#_\e(B")  ("+" . "\e$A#+\e(B")  ("~" . "\e$A!+\e(B")
+                  ("[" . "\e$A#[\e(B")  ("]" . "\e$A#]\e(B")  ("{" . "\e$A#{\e(B")  ("}" . "\e$A#}\e(B")
+                  (":" . "\e$A#:\e(B")  (";" . "\e$A#;\e(B")  ("\"" . "\e$A#"\e(B") ("'" . "\e$A#'\e(B")
+                  ("<" . "\e$A#<\e(B")  (">" . "\e$A#>\e(B")  ("?" . "\e$A#?\e(B")  ("/" . "\e$A#/\e(B")
+                  ("," . "\e$A#,\e(B")  ("." . "\e$A#.\e(B")
+                  ("a" . "\e$A#a\e(B")  ("b" . "\e$A#b\e(B")  ("c" . "\e$A#c\e(B")  ("d" . "\e$A#d\e(B")
+                  ("e" . "\e$A#e\e(B")  ("f" . "\e$A#f\e(B")  ("g" . "\e$A#g\e(B")  ("h" . "\e$A#h\e(B")
+                  ("i" . "\e$A#i\e(B")  ("j" . "\e$A#j\e(B")  ("k" . "\e$A#k\e(B")  ("l" . "\e$A#l\e(B")
+                  ("m" . "\e$A#m\e(B")  ("n" . "\e$A#n\e(B")  ("o" . "\e$A#o\e(B")  ("p" . "\e$A#p\e(B")
+                  ("q" . "\e$A#q\e(B")  ("r" . "\e$A#r\e(B")  ("s" . "\e$A#s\e(B")  ("t" . "\e$A#t\e(B")
+                  ("u" . "\e$A#u\e(B")  ("v" . "\e$A#v\e(B")  ("w" . "\e$A#w\e(B")  ("x" . "\e$A#x\e(B")
+                  ("y" . "\e$A#y\e(B")  ("z" . "\e$A#z\e(B")
+                  ("A" . "\e$A#A\e(B")  ("B" . "\e$A#B\e(B")  ("C" . "\e$A#C\e(B")  ("D" . "\e$A#D\e(B")
+                  ("E" . "\e$A#E\e(B")  ("F" . "\e$A#F\e(B")  ("G" . "\e$A#G\e(B")  ("H" . "\e$A#H\e(B")
+                  ("I" . "\e$A#I\e(B")  ("J" . "\e$A#J\e(B")  ("K" . "\e$A#K\e(B")  ("L" . "\e$A#L\e(B")
+                  ("M" . "\e$A#M\e(B")  ("N" . "\e$A#N\e(B")  ("O" . "\e$A#O\e(B")  ("P" . "\e$A#P\e(B")
+                  ("Q" . "\e$A#Q\e(B")  ("R" . "\e$A#R\e(B")  ("S" . "\e$A#S\e(B")  ("T" . "\e$A#T\e(B")
+                  ("U" . "\e$A#U\e(B")  ("V" . "\e$A#V\e(B")  ("W" . "\e$A#W\e(B")  ("X" . "\e$A#X\e(B")
+                  ("Y" . "\e$A#Y\e(B")  ("Z" . "\e$A#Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule in out))))
+
+(define-its-state-machine-append its-quanjiao-down-cn-map)
+
+(define-its-state-machine its-quanjiao-up-tw-map
+  "quanjiao-upcase-tw" "\e$(G$A\e(B" Chinese-CNS
+  "Map for quanjiao-upcase input. (Chinese-CNS)"
+
+  (dolist (ascii '(("0" . "\e$(G$!\e(B")  ("1" . "\e$(G$"\e(B")  ("2" . "\e$(G$#\e(B")  ("3" . "\e$(G$$\e(B")
+                  ("4" . "\e$(G$%\e(B")  ("5" . "\e$(G$&\e(B")  ("6" . "\e$(G$'\e(B")  ("7" . "\e$(G$(\e(B")
+                  ("8" . "\e$(G$)\e(B")  ("9" . "\e$(G$*\e(B") 
+                  (" " . "\e$(G!!\e(B")  ("!" . "\e$(G!*\e(B")  ("@" . "\e$(G"i\e(B")  ("#" . "\e$(G!l\e(B")
+                  ("$" . "\e$(G"c\e(B")  ("%" . "\e$(G"h\e(B")  ("^" . "\e$(G!T\e(B")  ("&" . "\e$(G!m\e(B")
+                  ("*" . "\e$(G!n\e(B")  ("(" . "\e$(G!>\e(B")  (")" . "\e$(G!?\e(B")
+                  ("-" . "\e$(G"1\e(B")  ("=" . "\e$(G"8\e(B")  ("`" . "\e$(G!j\e(B")  ("\\" . "\e$(G"b\e(B")
+                  ("|" . "\e$(G"^\e(B")  ("_" . "\e$(G"%\e(B")  ("+" . "\e$(G"0\e(B")  ("~" . "\e$(G"D\e(B")
+                  ("[" . "\e$(G!b\e(B")  ("]" . "\e$(G!c\e(B")  ("{" . "\e$A#{\e(B")  ("}" . "\e$(G!a\e(B")
+                  (":" . "\e$(G!(\e(B")  (";" . "\e$(G!'\e(B")  ("\"" . "\e$(G!i\e(B") ("'" . "\e$(G!k\e(B")
+                  ("<" . "\e$(G"6\e(B")  (">" . "\e$(G"7\e(B")  ("?" . "\e$(G!)\e(B")  ("/" . "\e$(G"a\e(B")
+                  ("," . "\e$(G!"\e(B")  ("." . "\e$(G!%\e(B")
+                  ("a" . "\e$(G$A\e(B")  ("b" . "\e$(G$B\e(B")  ("c" . "\e$(G$C\e(B")  ("d" . "\e$(G$D\e(B")
+                  ("e" . "\e$(G$E\e(B")  ("f" . "\e$(G$F\e(B")  ("g" . "\e$(G$G\e(B")  ("h" . "\e$(G$H\e(B")
+                  ("i" . "\e$(G$I\e(B")  ("j" . "\e$(G$J\e(B")  ("k" . "\e$(G$K\e(B")  ("l" . "\e$(G$L\e(B")
+                  ("m" . "\e$(G$M\e(B")  ("n" . "\e$(G$N\e(B")  ("o" . "\e$(G$O\e(B")  ("p" . "\e$(G$P\e(B")
+                  ("q" . "\e$(G$Q\e(B")  ("r" . "\e$(G$R\e(B")  ("s" . "\e$(G$S\e(B")  ("t" . "\e$(G$T\e(B")
+                  ("u" . "\e$(G$U\e(B")  ("v" . "\e$(G$V\e(B")  ("w" . "\e$(G$W\e(B")  ("x" . "\e$(G$X\e(B")
+                  ("y" . "\e$(G$Y\e(B")  ("z" . "\e$(G$Z\e(B")
+                  ("A" . "\e$(G$A\e(B")  ("B" . "\e$(G$B\e(B")  ("C" . "\e$(G$C\e(B")  ("D" . "\e$(G$D\e(B")
+                  ("E" . "\e$(G$E\e(B")  ("F" . "\e$(G$F\e(B")  ("G" . "\e$(G$G\e(B")  ("H" . "\e$(G$H\e(B")
+                  ("I" . "\e$(G$I\e(B")  ("J" . "\e$(G$J\e(B")  ("K" . "\e$(G$K\e(B")  ("L" . "\e$(G$L\e(B")
+                  ("M" . "\e$(G$M\e(B")  ("N" . "\e$(G$N\e(B")  ("O" . "\e$(G$O\e(B")  ("P" . "\e$(G$P\e(B")
+                  ("Q" . "\e$(G$Q\e(B")  ("R" . "\e$(G$R\e(B")  ("S" . "\e$(G$S\e(B")  ("T" . "\e$(G$T\e(B")
+                  ("U" . "\e$(G$U\e(B")  ("V" . "\e$(G$V\e(B")  ("W" . "\e$(G$W\e(B")  ("X" . "\e$(G$X\e(B")
+                  ("Y" . "\e$(G$Y\e(B")  ("Z" . "\e$(G$Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule in out))))
+
+(define-its-state-machine-append its-quanjiao-up-tw-map)
+
+(define-its-state-machine its-quanjiao-down-tw-map
+  "quanjiao-downcase-tw" "\e$(G$[\e(B" Chinese-CNS
+  "Map for quanjiao-downcase input. (Chinese-CNS)"
+
+  (dolist (ascii '(("0" . "\e$(G$!\e(B")  ("1" . "\e$(G$"\e(B")  ("2" . "\e$(G$#\e(B")  ("3" . "\e$(G$$\e(B")
+                  ("4" . "\e$(G$%\e(B")  ("5" . "\e$(G$&\e(B")  ("6" . "\e$(G$'\e(B")  ("7" . "\e$(G$(\e(B")
+                  ("8" . "\e$(G$)\e(B")  ("9" . "\e$(G$*\e(B") 
+                  (" " . "\e$(G!!\e(B")  ("!" . "\e$(G!*\e(B")  ("@" . "\e$(G"i\e(B")  ("#" . "\e$(G!l\e(B")
+                  ("$" . "\e$(G"c\e(B")  ("%" . "\e$(G"h\e(B")  ("^" . "\e$(G!T\e(B")  ("&" . "\e$(G!m\e(B")
+                  ("*" . "\e$(G!n\e(B")  ("(" . "\e$(G!>\e(B")  (")" . "\e$(G!?\e(B")
+                  ("-" . "\e$(G"1\e(B")  ("=" . "\e$(G"8\e(B")  ("`" . "\e$(G!j\e(B")  ("\\" . "\e$(G"`\e(B")
+                  ("|" . "\e$(G"^\e(B")  ("_" . "\e$(G"%\e(B")  ("+" . "\e$(G"0\e(B")  ("~" . "\e$(G"D\e(B")
+                  ("[" . "\e$(G!b\e(B")  ("]" . "\e$(G!c\e(B")  ("{" . "\e$(G!B\e(B")  ("}" . "\e$(G!C\e(B")
+                  (":" . "\e$(G!(\e(B")  (";" . "\e$(G!'\e(B")  ("\"" . "\e$(G!i\e(B") ("'" . "\e$(G!k\e(B")
+                  ("<" . "\e$(G"6\e(B")  (">" . "\e$(G"7\e(B")  ("?" . "\e$(G!)\e(B")  ("/" . "\e$(G"_\e(B")
+                  ("," . "\e$(G!"\e(B")  ("." . "\e$(G!%\e(B")
+                  ("a" . "\e$(G$[\e(B")  ("b" . "\e$(G$\\e(B")  ("c" . "\e$(G$]\e(B")  ("d" . "\e$(G$^\e(B")
+                  ("e" . "\e$(G$_\e(B")  ("f" . "\e$(G$`\e(B")  ("g" . "\e$(G$a\e(B")  ("h" . "\e$(G$b\e(B")
+                  ("i" . "\e$(G$c\e(B")  ("j" . "\e$(G$d\e(B")  ("k" . "\e$(G$e\e(B")  ("l" . "\e$(G$f\e(B")
+                  ("m" . "\e$(G$g\e(B")  ("n" . "\e$(G$h\e(B")  ("o" . "\e$(G$i\e(B")  ("p" . "\e$(G$j\e(B")
+                  ("q" . "\e$(G$k\e(B")  ("r" . "\e$(G$l\e(B")  ("s" . "\e$(G$m\e(B")  ("t" . "\e$(G$n\e(B")
+                  ("u" . "\e$(G$o\e(B")  ("v" . "\e$(G$p\e(B")  ("w" . "\e$(G$q\e(B")  ("x" . "\e$(G$r\e(B")
+                  ("y" . "\e$(G$s\e(B")  ("z" . "\e$(G$t\e(B")
+                  ("A" . "\e$(G$A\e(B")  ("B" . "\e$(G$B\e(B")  ("C" . "\e$(G$C\e(B")  ("D" . "\e$(G$D\e(B")
+                  ("E" . "\e$(G$E\e(B")  ("F" . "\e$(G$F\e(B")  ("G" . "\e$(G$G\e(B")  ("H" . "\e$(G$H\e(B")
+                  ("I" . "\e$(G$I\e(B")  ("J" . "\e$(G$J\e(B")  ("K" . "\e$(G$K\e(B")  ("L" . "\e$(G$L\e(B")
+                  ("M" . "\e$(G$M\e(B")  ("N" . "\e$(G$N\e(B")  ("O" . "\e$(G$O\e(B")  ("P" . "\e$(G$P\e(B")
+                  ("Q" . "\e$(G$Q\e(B")  ("R" . "\e$(G$R\e(B")  ("S" . "\e$(G$S\e(B")  ("T" . "\e$(G$T\e(B")
+                  ("U" . "\e$(G$U\e(B")  ("V" . "\e$(G$V\e(B")  ("W" . "\e$(G$W\e(B")  ("X" . "\e$(G$X\e(B")
+                  ("Y" . "\e$(G$Y\e(B")  ("Z" . "\e$(G$Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule in out))))
+
+(define-its-state-machine-append its-quanjiao-down-tw-map)
+
+(provide 'its/quanjiao)
diff --git a/its/thai.el b/its/thai.el
new file mode 100644 (file)
index 0000000..1a1f6cb
--- /dev/null
@@ -0,0 +1,145 @@
+;;; its/thai.el --- Inputting Thai characters in Egg Input Method Architecture
+
+;; Copyright (C) 1999,2000 PFU LIMITED
+
+;; Author: KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+
+;;; Code:
+
+
+(eval-when-compile
+  (require 'its)
+  (require 'cl))
+
+(eval-when (compile)
+  (defconst its-compaction-enable t))
+
+(eval-when-compile
+  (defmacro define-its-thai-keymap (&rest rule)
+    (let (input output type list)
+      (while rule
+       (setq input  (car (car rule))
+             output (nth 1 (car rule))
+             type   (nth 2 (car rule))
+             rule   (cdr rule)
+             list   (cons `(its-defrule ,input ,output) list))
+       (if type
+           (setq list (cons `(setq ,type (cons (cons ,input ,output) ,type))
+                            list))))
+      `(let (consonant vowel tone)
+        ,@list
+        (its-thai-composit consonant vowel tone))))
+
+  (defun its-thai-composit (consonant vowel tone)
+    (let (keyseq output)
+      (while consonant
+       (setq keyseq (car (car consonant))
+              output (cdr (car consonant))
+             consonant (cdr consonant))
+       (its-thai-add-vowel keyseq output vowel tone)
+       (its-thai-add-tone keyseq output tone))))
+
+  (defun its-thai-add-vowel (keyseq output vowel tone)
+    (let (next-keyseq next-output)
+      (while vowel
+       (setq next-keyseq (concat keyseq (car (car vowel)))
+             next-output (concat output (cdr (car vowel)))
+             vowel (cdr vowel))
+        (its-defrule next-keyseq (compose-string next-output))
+       (its-thai-add-tone next-keyseq next-output tone))))
+
+  (defun its-thai-add-tone (keyseq output tone)
+    (let (next-keyseq next-output)
+      (while tone
+       (setq next-keyseq (concat keyseq (car (car tone)))
+             next-output (concat output (cdr (car tone)))
+              tone (cdr tone))
+        (its-defrule next-keyseq (compose-string next-output))))))
+
+;; Thai Kesmanee keyboard support.
+
+(define-its-state-machine its-thai-kesmanee-map
+  "kesmanee" "\e,T!!\e(B" Thai
+  "Map for Thai Kesmanee input method with TIS620 keyboard. (Thai)"
+
+  (define-its-thai-keymap
+    ("1"  "\e,TE\e(B" consonant)    ("!"  "#")
+    ("2"  "/")              ("@"  "\e,Tq\e(B")
+    ("3"  "_")              ("#"  "\e,Tr\e(B")
+    ("4"  "\e,T@\e(B" consonant)    ("$"  "\e,Ts\e(B")
+    ("5"  "\e,T6\e(B" consonant)    ("%"  "\e,Tt\e(B")
+    ("6"  "\e,TX\e(B" vowel)        ("^"  "\e,TY\e(B" vowel)
+    ("7"  "\e,TV\e(B" vowel)        ("&"  "\e0\e,TQi\e(B\e1" vowel)
+    ("8"  "\e,T$\e(B" consonant)    ("*"  "\e,Tu\e(B")
+    ("9"  "\e,T5\e(B" consonant)    ("("  "\e,Tv\e(B")
+    ("0"  "\e,T(\e(B" consonant)    (")"  "\e,Tw\e(B")
+    ("-"  "\e,T"\e(B" consonant)    ("_"  "\e,Tx\e(B")
+    ("="  "\e,T*\e(B" consonant)    ("+"  "\e,Ty\e(B")
+    ("\\" "\e,T_\e(B")              ("|"  "\e,To\e(B")
+    ("`"  "\e,T#\e(B" consonant)    ("~"  "\e,T%\e(B" consonant)
+
+    ("q"  "\e,Tf\e(B")              ("Q"  "\e,Tp\e(B")
+    ("w"  "\e,Td\e(B")              ("W"  "\"")
+    ("e"  "\e,TS\e(B")              ("E"  "\e,T.\e(B" consonant)
+    ("r"  "\e,T>\e(B" consonant)    ("R"  "\e,T1\e(B" consonant)
+    ("T"  "\e,T8\e(B" consonant)    ("t"  "\e,TP\e(B")
+    ("y"  "\e,TQ\e(B" vowel)        ("Y"  "\e,Tm\e(B" tone)
+    ("u"  "\e,TU\e(B" vowel)        ("U"  "\e,Tj\e(B" tone)
+    ("i"  "\e,TC\e(B" consonant)    ("I"  "\e,T3\e(B" consonant)
+    ("o"  "\e,T9\e(B" consonant)    ("O"  "\e,TO\e(B")
+    ("p"  "\e,TB\e(B" consonant)    ("P"  "\e,T-\e(B" consonant)
+    ("["  "\e,T:\e(B" consonant)    ("{"  "\e,T0\e(B" consonant)
+    ("]"  "\e,TE\e(B" consonant)    ("}"  ",")
+
+    ("a"  "\e,T?\e(B" consonant)    ("A"  "\e,TD\e(B")
+    ("s"  "\e,TK\e(B" consonant)    ("S"  "\e,T&\e(B" consonant)
+    ("d"  "\e,T!\e(B" consonant)    ("D"  "\e,T/\e(B" consonant)
+    ("f"  "\e,T4\e(B" consonant)    ("F"  "\e,Tb\e(B")
+    ("g"  "\e,T`\e(B")              ("G"  "\e,T,\e(B" consonant)
+    ("h"  "\e,Ti\e(B" tone)         ("H"  "\e,Tg\e(B" vowel)
+    ("j"  "\e,Th\e(B" tone)         ("J"  "\e,Tk\e(B" tone)
+    ("k"  "\e,TR\e(B")              ("K"  "\e,TI\e(B" consonant)
+    ("l"  "\e,TJ\e(B" consonant)    ("L"  "\e,TH\e(B" consonant)
+    (";"  "\e,TG\e(B" consonant)    (":"  "\e,T+\e(B" consonant)
+    ("'"  "\e,T'\e(B" consonant)    ("\"" "\e,TF\e(B")
+
+    ("z"  "\e,T<\e(B" consonant)    ("Z"  "(")
+    ("x"  "\e,T;\e(B" consonant)    ("X"  ")")
+    ("c"  "\e,Ta\e(B")              ("C"  "\e,T)\e(B" consonant)
+    ("v"  "\e,TM\e(B" consonant)    ("V"  "\e,TN\e(B" consonant)
+    ("b"  "\e,TT\e(B" vowel)        ("B"  "\e,TZ\e(B" vowel)
+    ("n"  "\e,TW\e(B" vowel)        ("N"  "\e,Tl\e(B" tone)
+    ("m"  "\e,T7\e(B" consonant)    ("M"  "\e,Tn\e(B" vowel)
+    (","  "\e,TA\e(B" consonant)    ("<"  "\e,T2\e(B" consonant)
+    ("."  "\e,Tc\e(B")              (">"  "\e,TL\e(B" consonant)
+    ("/"  "\e,T=\e(B" consonant)    ("?"  "?")))
+
+(define-its-state-machine-append its-thai-kesmanee-map)
+
+(provide 'its/thai)
+
+;;; its/thai.el ends here
diff --git a/its/zenkaku.el b/its/zenkaku.el
new file mode 100644 (file)
index 0000000..a5ccff9
--- /dev/null
@@ -0,0 +1,109 @@
+;;; its/zenkau.el --- Zenkaku ASCII Input in Egg Input Method Architecture
+
+;; Copyright (C) 1999,2000 PFU LIMITED
+
+;; Author: KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+;;
+;; Symbol input is desined by jiro@math.keio.ac.jp (TANAKA Jiro)
+;; This file is based on the rules of its/hira.el in Mule-2.3 distribution.
+;;
+
+;;; Code:
+
+(eval-when-compile
+  (require 'its))
+
+(define-its-state-machine its-zenkaku-up-map
+  "zenkaku-upcase" "\e$B#A\e(B" Japanese
+  "Map for zenkaku-upcase input."
+
+  (dolist (ascii '(("0" . "\e$B#0\e(B")  ("1" . "\e$B#1\e(B")  ("2" . "\e$B#2\e(B")  ("3" . "\e$B#3\e(B")
+                  ("4" . "\e$B#4\e(B")  ("5" . "\e$B#5\e(B")  ("6" . "\e$B#6\e(B")  ("7" . "\e$B#7\e(B")
+                  ("8" . "\e$B#8\e(B")  ("9" . "\e$B#9\e(B") 
+                  (" " . "\e$B!!\e(B")  ("!" . "\e$B!*\e(B")  ("@" . "\e$B!w\e(B")  ("#" . "\e$B!t\e(B")
+                  ("$" . "\e$B!p\e(B")  ("%" . "\e$B!s\e(B")  ("^" . "\e$B!0\e(B")  ("&" . "\e$B!u\e(B")
+                  ("*" . "\e$B!v\e(B")  ("(" . "\e$B!J\e(B")  (")" . "\e$B!K\e(B")
+                  ("-" . "\e$B!]\e(B")  ("=" . "\e$B!a\e(B")  ("`" . "\e$B!.\e(B")  ("\\" . "\e$B!@\e(B")
+                  ("|" . "\e$B!C\e(B")  ("_" . "\e$B!2\e(B")  ("+" . "\e$B!\\e(B")  ("~" . "\e$B!A\e(B")
+                  ("[" . "\e$B!N\e(B")  ("]" . "\e$B!O\e(B")  ("{" . "\e$B!P\e(B")  ("}" . "\e$B!Q\e(B")
+                  (":" . "\e$B!'\e(B")  (";" . "\e$B!(\e(B")  ("\"" . "\e$B!I\e(B") ("'" . "\e$B!-\e(B")
+                  ("<" . "\e$B!c\e(B")  (">" . "\e$B!d\e(B")  ("?" . "\e$B!)\e(B")  ("/" . "\e$B!?\e(B")
+                  ("," . "\e$B!$\e(B")  ("." . "\e$B!%\e(B")
+                  ("a" . "\e$B#A\e(B")  ("b" . "\e$B#B\e(B")  ("c" . "\e$B#C\e(B")  ("d" . "\e$B#D\e(B")
+                  ("e" . "\e$B#E\e(B")  ("f" . "\e$B#F\e(B")  ("g" . "\e$B#G\e(B")  ("h" . "\e$B#H\e(B")
+                  ("i" . "\e$B#I\e(B")  ("j" . "\e$B#J\e(B")  ("k" . "\e$B#K\e(B")  ("l" . "\e$B#L\e(B")
+                  ("m" . "\e$B#M\e(B")  ("n" . "\e$B#N\e(B")  ("o" . "\e$B#O\e(B")  ("p" . "\e$B#P\e(B")
+                  ("q" . "\e$B#Q\e(B")  ("r" . "\e$B#R\e(B")  ("s" . "\e$B#S\e(B")  ("t" . "\e$B#T\e(B")
+                  ("u" . "\e$B#U\e(B")  ("v" . "\e$B#V\e(B")  ("w" . "\e$B#W\e(B")  ("x" . "\e$B#X\e(B")
+                  ("y" . "\e$B#Y\e(B")  ("z" . "\e$B#Z\e(B")
+                  ("A" . "\e$B#A\e(B")  ("B" . "\e$B#B\e(B")  ("C" . "\e$B#C\e(B")  ("D" . "\e$B#D\e(B")
+                  ("E" . "\e$B#E\e(B")  ("F" . "\e$B#F\e(B")  ("G" . "\e$B#G\e(B")  ("H" . "\e$B#H\e(B")
+                  ("I" . "\e$B#I\e(B")  ("J" . "\e$B#J\e(B")  ("K" . "\e$B#K\e(B")  ("L" . "\e$B#L\e(B")
+                  ("M" . "\e$B#M\e(B")  ("N" . "\e$B#N\e(B")  ("O" . "\e$B#O\e(B")  ("P" . "\e$B#P\e(B")
+                  ("Q" . "\e$B#Q\e(B")  ("R" . "\e$B#R\e(B")  ("S" . "\e$B#S\e(B")  ("T" . "\e$B#T\e(B")
+                  ("U" . "\e$B#U\e(B")  ("V" . "\e$B#V\e(B")  ("W" . "\e$B#W\e(B")  ("X" . "\e$B#X\e(B")
+                  ("Y" . "\e$B#Y\e(B")  ("Z" . "\e$B#Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule in out))))
+
+(define-its-state-machine-append its-zenkaku-up-map)
+
+(define-its-state-machine its-zenkaku-down-map
+  "zenkaku-downcase" "\e$B#a\e(B" Japanese
+  "Map for zenkaku-downcase input."
+
+  (dolist (ascii '(("0" . "\e$B#0\e(B")  ("1" . "\e$B#1\e(B")  ("2" . "\e$B#2\e(B")  ("3" . "\e$B#3\e(B")
+                  ("4" . "\e$B#4\e(B")  ("5" . "\e$B#5\e(B")  ("6" . "\e$B#6\e(B")  ("7" . "\e$B#7\e(B")
+                  ("8" . "\e$B#8\e(B")  ("9" . "\e$B#9\e(B") 
+                  (" " . "\e$B!!\e(B")  ("!" . "\e$B!*\e(B")  ("@" . "\e$B!w\e(B")  ("#" . "\e$B!t\e(B")
+                  ("$" . "\e$B!p\e(B")  ("%" . "\e$B!s\e(B")  ("^" . "\e$B!0\e(B")  ("&" . "\e$B!u\e(B")
+                  ("*" . "\e$B!v\e(B")  ("(" . "\e$B!J\e(B")  (")" . "\e$B!K\e(B")
+                  ("-" . "\e$B!]\e(B")  ("=" . "\e$B!a\e(B")  ("`" . "\e$B!.\e(B")  ("\\" . "\e$B!@\e(B")
+                  ("|" . "\e$B!C\e(B")  ("_" . "\e$B!2\e(B")  ("+" . "\e$B!\\e(B")  ("~" . "\e$B!A\e(B")
+                  ("[" . "\e$B!N\e(B")  ("]" . "\e$B!O\e(B")  ("{" . "\e$B!P\e(B")  ("}" . "\e$B!Q\e(B")
+                  (":" . "\e$B!'\e(B")  (";" . "\e$B!(\e(B")  ("\"" . "\e$B!I\e(B") ("'" . "\e$B!-\e(B")
+                  ("<" . "\e$B!c\e(B")  (">" . "\e$B!d\e(B")  ("?" . "\e$B!)\e(B")  ("/" . "\e$B!?\e(B")
+                  ("," . "\e$B!$\e(B")  ("." . "\e$B!%\e(B")
+                  ("a" . "\e$B#a\e(B")  ("b" . "\e$B#b\e(B")  ("c" . "\e$B#c\e(B")  ("d" . "\e$B#d\e(B")
+                  ("e" . "\e$B#e\e(B")  ("f" . "\e$B#f\e(B")  ("g" . "\e$B#g\e(B")  ("h" . "\e$B#h\e(B")
+                  ("i" . "\e$B#i\e(B")  ("j" . "\e$B#j\e(B")  ("k" . "\e$B#k\e(B")  ("l" . "\e$B#l\e(B")
+                  ("m" . "\e$B#m\e(B")  ("n" . "\e$B#n\e(B")  ("o" . "\e$B#o\e(B")  ("p" . "\e$B#p\e(B")
+                  ("q" . "\e$B#q\e(B")  ("r" . "\e$B#r\e(B")  ("s" . "\e$B#s\e(B")  ("t" . "\e$B#t\e(B")
+                  ("u" . "\e$B#u\e(B")  ("v" . "\e$B#v\e(B")  ("w" . "\e$B#w\e(B")  ("x" . "\e$B#x\e(B")
+                  ("y" . "\e$B#y\e(B")  ("z" . "\e$B#z\e(B")
+                  ("A" . "\e$B#A\e(B")  ("B" . "\e$B#B\e(B")  ("C" . "\e$B#C\e(B")  ("D" . "\e$B#D\e(B")
+                  ("E" . "\e$B#E\e(B")  ("F" . "\e$B#F\e(B")  ("G" . "\e$B#G\e(B")  ("H" . "\e$B#H\e(B")
+                  ("I" . "\e$B#I\e(B")  ("J" . "\e$B#J\e(B")  ("K" . "\e$B#K\e(B")  ("L" . "\e$B#L\e(B")
+                  ("M" . "\e$B#M\e(B")  ("N" . "\e$B#N\e(B")  ("O" . "\e$B#O\e(B")  ("P" . "\e$B#P\e(B")
+                  ("Q" . "\e$B#Q\e(B")  ("R" . "\e$B#R\e(B")  ("S" . "\e$B#S\e(B")  ("T" . "\e$B#T\e(B")
+                  ("U" . "\e$B#U\e(B")  ("V" . "\e$B#V\e(B")  ("W" . "\e$B#W\e(B")  ("X" . "\e$B#X\e(B")
+                  ("Y" . "\e$B#Y\e(B")  ("Z" . "\e$B#Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule in out))))
+
+(define-its-state-machine-append its-zenkaku-down-map)
+
+(provide 'its/zenkaku)
diff --git a/its/zhuyin.el b/its/zhuyin.el
new file mode 100644 (file)
index 0000000..09ee3a3
--- /dev/null
@@ -0,0 +1,295 @@
+;;; its/zhuyin.el --- Zhuyin Input in Egg Input Method Architecture
+
+;; Copyright (C) 1999,2000 PFU LIMITED
+
+;; Author: KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+
+;;; Code:
+
+
+(eval-when-compile
+  (require 'its)
+  (require 'cl))
+
+(eval-when (compile)
+  (defconst its-compaction-enable t))
+
+(defvar its-zhuyin-cn-enable-quanjioao-alphabet
+  (if (boundp 'its-enable-fullwidth-alphabet)
+      its-enable-fullwidth-alphabet
+    t)
+  "*Enable Quanjiao alphabet")
+
+(defvar its-zhuyin-cn-open-braket  "\e$A!8\e(B" "*[") ; "\e$A#[\e(B"
+(defvar its-zhuyin-cn-close-braket "\e$A!9\e(B" "*]") ; "\e$A#]\e(B"
+
+(defvar its-zhuyin-tw-enable-quanjioao-alphabet
+  (if (boundp 'its-enable-fullwidth-alphabet)
+      its-enable-fullwidth-alphabet
+    t)
+  "*Enable Quanjiao alphabet")
+
+(defvar its-zhuyin-tw-open-braket  "\e$(G!V\e(B" "*[") ; "\e$(G!b\e(B "
+(defvar its-zhuyin-tw-close-braket "\e$(G!W\e(B" "*]") ; "\e$(G!c\e(B"
+
+(eval-when-compile
+  (defmacro its-do-zhuyin-table (list)
+    `(progn
+       ,@(mapcar (lambda (syl) `(its-define-zhuyin ,@syl))
+                list)))
+
+  (defmacro its-define-zhuyin (shengmu yunmu1 &optional yunmu2 qingsheng)
+    `(let ((s (list ,@shengmu))
+          (yi (concat (car ,yunmu1) (car ,yunmu2)))
+          (yo (concat (nth 1 ,yunmu1) (nth 1 ,yunmu2)))
+          (tone ,(if qingsheng "\e(0A\e(B" "\e(0@\e(B"))
+          in out out1 state)
+       (while s
+        (setq in (concat (car (car s)) yi)
+              out (concat (nth 1 (car s)) yo)
+              out1 (concat out tone)
+              state (its-defrule* in out1 out)
+              s (cdr s))
+        (its-defrule (concat in " ") out1)
+        ,@(if (null qingsheng)
+              '((its-make-next-state state ?1 (concat out "\e(0A\e(B"))
+                (its-make-next-state state ?2 (concat out "\e(0B\e(B"))
+                (its-make-next-state state ?3 (concat out "\e(0C\e(B"))
+                (its-make-next-state state ?4 (concat out "\e(0D\e(B")))))))
+
+  (defmacro its-define-zhuyin-table ()
+    '(let ((-  '(""  ""))
+          (B  '("b" "\e(0E\e(B")) (P  '("p" "\e(0F\e(B")) (M  '("m" "\e(0G\e(B")) (F '("f" "\e(0H\e(B"))
+          (D  '("d" "\e(0I\e(B")) (T  '("t" "\e(0J\e(B")) (N  '("n" "\e(0K\e(B")) (L '("l" "\e(0L\e(B"))
+          (G  '("v" "\e(0M\e(B")) (K  '("k" "\e(0N\e(B")) (H  '("h" "\e(0O\e(B"))
+          (J  '("g" "\e(0P\e(B")) (Q  '("7" "\e(0Q\e(B")) (X  '("c" "\e(0R\e(B"))
+          (ZH '("," "\e(0S\e(B")) (CH '("." "\e(0T\e(B")) (SH '("/" "\e(0U\e(B")) (R '("j"  "\e(0V\e(B"))
+          (Z  '(";" "\e(0W\e(B")) (C  '(":" "\e(0X\e(B")) (S  '("s" "\e(0Y\e(B"))
+
+          (A   '("a" "\e(0Z\e(B")) (O   '("o" "\e(0[\e(B")) (e   '("r" "\e(0\\e(B")) (E   '("w" "\e(0]\e(B"))
+          (AI  '("i" "\e(0^\e(B")) (EI  '("q" "\e(0_\e(B")) (AO  '("z" "\e(0`\e(B")) 
+          (AN  '("8" "\e(0b\e(B")) (EN  '("9" "\e(0c\e(B")) (ANG '("0" "\e(0d\e(B")) (ENG '("-" "\e(0e\e(B"))
+          (ER  '("^" "\e(0f\e(B")) (OU  '("y" "\e(0a\e(B"))
+          (I   '("e" "\e(0g\e(B")) (U   '("x" "\e(0h\e(B")) (V   '("u" "\e(0i\e(B")))
+
+       (its-define-zhuyin (- H) M nil t)
+       (its-define-zhuyin (- H) '("@" "@") nil t)
+       (its-define-zhuyin (-  ) N nil t)
+
+       (its-do-zhuyin-table
+       (((                              ZH CH SH R Z C S ) -)
+        ((- B P M F D T N L G K H       ZH CH SH   Z C S ) A)
+        ((- B P M F       L                              ) O)
+        ((-     M   D T N L G K H       ZH CH SH R Z C S ) e)
+        ((- B P M   D T N L G K H       ZH CH SH   Z C S ) AI)
+        ((- B P M F D T N L G K H       ZH    SH   Z C   ) EI)
+        ((- B P M   D T N L G K H       ZH CH SH R Z C S ) AO)
+        ((- B P M F D T N L G K H       ZH CH SH R Z C S ) AN)
+        ((- B P M F D   N   G K H       ZH CH SH R Z C S ) EN)
+        ((- B P M F D T N L G K H       ZH CH SH R Z C S ) ANG)
+        ((- B P M F D T N L G K H       ZH CH SH R Z C S ) ENG)
+        ((-                                              ) ER)
+        ((-   P M F D T N L G K H       ZH CH SH R Z C S ) OU)
+        ((- B P M   D T N L       J Q X                  ) I)
+        ((-         D     L       J Q X                  ) I A)
+        ((-                                              ) I O)
+        ((- B P M   D T N L       J Q X                  ) I E)
+        ((- B P M   D T N L       J Q X                  ) I AO)
+        ((-     M   D   N L       J Q X                  ) I OU)
+        ((- B P M   D T N L       J Q X                  ) I AN)
+        ((- B P M       N L       J Q X                  ) I EN)
+        ((-             N L       J Q X                  ) I ANG)
+        ((- B P M   D T N L       J Q X                  ) I ENG)
+        ((- B P M F D T N L G K H       ZH CH SH R Z C S ) U)
+        ((-                 G K H       ZH CH SH R       ) U A)
+        ((-         D T N L G K H       ZH CH SH R Z C S ) U O)
+        ((-                 G K H       ZH CH SH         ) U AI)
+        ((-         D T     G K H       ZH CH SH R Z C S ) U EI)
+        ((-         D T N L G K H       ZH CH SH R Z C S ) U AN)
+        ((-         D T   L G K H       ZH CH SH R Z C S ) U EN)
+        ((-                 G K H       ZH CH SH         ) U ANG)
+        ((-         D T N L G K H       ZH CH    R Z C S ) U ENG)
+        ((-             N L       J Q X                  ) V)
+        ((-             N L       J Q X                  ) V E)
+        ((-                       J Q X                  ) V AN)
+        ((-                       J Q X                  ) V EN)
+        ((-                       J Q X                  ) V ENG)))
+
+       (mapcar (lambda (s) (its-defoutput (car s) (nth 1 s)))
+              (list B P M F D T N L G K H J Q X))
+
+       (its-defrule (concat (car N) 2) (concat (nth 1 N) "\e(0B\e(B"))
+       (its-defrule (concat (car N) 3) (concat (nth 1 N) "\e(0C\e(B"))
+       (its-defrule (concat (car N) 4) (concat (nth 1 N) "\e(0D\e(B")))))
+
+(define-its-state-machine its-zhuyin-cn-map
+  "zhuyin-cn" "\e$AW"\e(BG" Chinese-GB
+  "Map for Zhuyin input. (Chinese-GB)"
+
+  (defconst its-quanjiao-escape "Z")
+  (defconst its-banjiao-escape  "X")
+
+  (its-defrule-select-mode-temporally "B" downcase)
+  (its-defrule-select-mode-temporally "Q" quanjiao-downcase-cn)
+
+  (its-define-zhuyin-table)
+  (dolist (ascii '(("0" . "\e$A#0\e(B")  ("1" . "\e$A#1\e(B")  ("2" . "\e$A#2\e(B")  ("3" . "\e$A#3\e(B")
+                  ("4" . "\e$A#4\e(B")  ("5" . "\e$A#5\e(B")  ("6" . "\e$A#6\e(B")  ("7" . "\e$A#7\e(B")
+                  ("8" . "\e$A#8\e(B")  ("9" . "\e$A#9\e(B") 
+                  (" " . "\e$A!!\e(B")  ("!" . "\e$A#!\e(B")  ("@" . "\e$A#@\e(B")  ("#" . "\e$A##\e(B")
+                  ("$" . "\e$A!g\e(B")  ("%" . "\e$A#%\e(B")  ("^" . "\e$A#^\e(B")  ("&" . "\e$A#&\e(B")
+                  ("*" . "\e$A#*\e(B")  ("(" . "\e$A#(\e(B")  (")" . "\e$A#)\e(B")
+                  ("-" . "\e$A#-\e(B")  ("=" . "\e$A#=\e(B")  ("`" . "\e$A#`\e(B")  ("\\" . "\e$A#\\e(B")
+                  ("|" . "\e$A#|\e(B")  ("_" . "\e$A#_\e(B")  ("+" . "\e$A#+\e(B")  ("~" . "\e$A!+\e(B")
+                  ("[" . "\e$A#[\e(B")  ("]" . "\e$A#]\e(B")  ("{" . "\e$A#{\e(B")  ("}" . "\e$A#}\e(B")
+                  (":" . "\e$A#:\e(B")  (";" . "\e$A#;\e(B")  ("\"" . "\e$A#"\e(B") ("'" . "\e$A#'\e(B")
+                  ("<" . "\e$A#<\e(B")  (">" . "\e$A#>\e(B")  ("?" . "\e$A#?\e(B")  ("/" . "\e$A#/\e(B")
+                  ("," . "\e$A#,\e(B")  ("." . "\e$A#.\e(B")
+                  ("a" . "\e$A#a\e(B")  ("b" . "\e$A#b\e(B")  ("c" . "\e$A#c\e(B")  ("d" . "\e$A#d\e(B")
+                  ("e" . "\e$A#e\e(B")  ("f" . "\e$A#f\e(B")  ("g" . "\e$A#g\e(B")  ("h" . "\e$A#h\e(B")
+                  ("i" . "\e$A#i\e(B")  ("j" . "\e$A#j\e(B")  ("k" . "\e$A#k\e(B")  ("l" . "\e$A#l\e(B")
+                  ("m" . "\e$A#m\e(B")  ("n" . "\e$A#n\e(B")  ("o" . "\e$A#o\e(B")  ("p" . "\e$A#p\e(B")
+                  ("q" . "\e$A#q\e(B")  ("r" . "\e$A#r\e(B")  ("s" . "\e$A#s\e(B")  ("t" . "\e$A#t\e(B")
+                  ("u" . "\e$A#u\e(B")  ("v" . "\e$A#v\e(B")  ("w" . "\e$A#w\e(B")  ("x" . "\e$A#x\e(B")
+                  ("y" . "\e$A#y\e(B")  ("z" . "\e$A#z\e(B")
+                  ("A" . "\e$A#A\e(B")  ("B" . "\e$A#B\e(B")  ("C" . "\e$A#C\e(B")  ("D" . "\e$A#D\e(B")
+                  ("E" . "\e$A#E\e(B")  ("F" . "\e$A#F\e(B")  ("G" . "\e$A#G\e(B")  ("H" . "\e$A#H\e(B")
+                  ("I" . "\e$A#I\e(B")  ("J" . "\e$A#J\e(B")  ("K" . "\e$A#K\e(B")  ("L" . "\e$A#L\e(B")
+                  ("M" . "\e$A#M\e(B")  ("N" . "\e$A#N\e(B")  ("O" . "\e$A#O\e(B")  ("P" . "\e$A#P\e(B")
+                  ("Q" . "\e$A#Q\e(B")  ("R" . "\e$A#R\e(B")  ("S" . "\e$A#S\e(B")  ("T" . "\e$A#T\e(B")
+                  ("U" . "\e$A#U\e(B")  ("V" . "\e$A#V\e(B")  ("W" . "\e$A#W\e(B")  ("X" . "\e$A#X\e(B")
+                  ("Y" . "\e$A#Y\e(B")  ("Z" . "\e$A#Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule (concat its-banjiao-escape in) in)
+      (its-defrule (concat its-quanjiao-escape in) out)))
+
+    (its-defrule "<" "\e$A#,\e(B")
+    (its-defrule ">" "\e$A!#\e(B")
+    (its-defrule "?" "\e$A!"\e(B"))
+
+(define-its-state-machine its-zhuyin-tw-map
+  "zhuyin-tw" "\e$(GNC\e(BC" Chinese-CNS
+  "Map for Zhuyin input."
+
+  (defconst its-quanjiao-escape "Z")
+  (defconst its-banjiao-escape  "X")
+
+  (its-defrule-select-mode-temporally "B" downcase)
+  (its-defrule-select-mode-temporally "Q" quanjiao-downcase-tw)
+
+  (its-define-zhuyin-table)
+  (dolist (ascii '(("0" . "\e$(G$!\e(B")  ("1" . "\e$(G$"\e(B")  ("2" . "\e$(G$#\e(B")  ("3" . "\e$(G$$\e(B")
+                  ("4" . "\e$(G$%\e(B")  ("5" . "\e$(G$&\e(B")  ("6" . "\e$(G$'\e(B")  ("7" . "\e$(G$(\e(B")
+                  ("8" . "\e$(G$)\e(B")  ("9" . "\e$(G$*\e(B") 
+                  (" " . "\e$(G!!\e(B")  ("!" . "\e$(G!*\e(B")  ("@" . "\e$(G"i\e(B")  ("#" . "\e$(G!l\e(B")
+                  ("$" . "\e$(G"c\e(B")  ("%" . "\e$(G"h\e(B")  ("^" . "\e$(G!T\e(B")  ("&" . "\e$(G!m\e(B")
+                  ("*" . "\e$(G!n\e(B")  ("(" . "\e$(G!>\e(B")  (")" . "\e$(G!?\e(B")
+                  ("-" . "\e$(G"1\e(B")  ("=" . "\e$(G"8\e(B")  ("`" . "\e$(G!j\e(B")  ("\\" . "\e$(G"`\e(B")
+                  ("|" . "\e$(G"^\e(B")  ("_" . "\e$(G"%\e(B")  ("+" . "\e$(G"0\e(B")  ("~" . "\e$(G"D\e(B")
+                  ("[" . "\e$(G!b\e(B")  ("]" . "\e$(G!c\e(B")  ("{" . "\e$(G!B\e(B")  ("}" . "\e$(G!C\e(B")
+                  (":" . "\e$(G!(\e(B")  (";" . "\e$(G!'\e(B")  ("\"" . "\e$(G!i\e(B") ("'" . "\e$(G!k\e(B")
+                  ("<" . "\e$(G"6\e(B")  (">" . "\e$(G"7\e(B")  ("?" . "\e$(G!)\e(B")  ("/" . "\e$(G"_\e(B")
+                  ("," . "\e$(G!"\e(B")  ("." . "\e$(G!%\e(B")
+                  ("a" . "\e$(G$[\e(B")  ("b" . "\e$(G$\\e(B")  ("c" . "\e$(G$]\e(B")  ("d" . "\e$(G$^\e(B")
+                  ("e" . "\e$(G$_\e(B")  ("f" . "\e$(G$`\e(B")  ("g" . "\e$(G$a\e(B")  ("h" . "\e$(G$b\e(B")
+                  ("i" . "\e$(G$c\e(B")  ("j" . "\e$(G$d\e(B")  ("k" . "\e$(G$e\e(B")  ("l" . "\e$(G$f\e(B")
+                  ("m" . "\e$(G$g\e(B")  ("n" . "\e$(G$h\e(B")  ("o" . "\e$(G$i\e(B")  ("p" . "\e$(G$j\e(B")
+                  ("q" . "\e$(G$k\e(B")  ("r" . "\e$(G$l\e(B")  ("s" . "\e$(G$m\e(B")  ("t" . "\e$(G$n\e(B")
+                  ("u" . "\e$(G$o\e(B")  ("v" . "\e$(G$p\e(B")  ("w" . "\e$(G$q\e(B")  ("x" . "\e$(G$r\e(B")
+                  ("y" . "\e$(G$s\e(B")  ("z" . "\e$(G$t\e(B")
+                  ("A" . "\e$(G$A\e(B")  ("B" . "\e$(G$B\e(B")  ("C" . "\e$(G$C\e(B")  ("D" . "\e$(G$D\e(B")
+                  ("E" . "\e$(G$E\e(B")  ("F" . "\e$(G$F\e(B")  ("G" . "\e$(G$G\e(B")  ("H" . "\e$(G$H\e(B")
+                  ("I" . "\e$(G$I\e(B")  ("J" . "\e$(G$J\e(B")  ("K" . "\e$(G$K\e(B")  ("L" . "\e$(G$L\e(B")
+                  ("M" . "\e$(G$M\e(B")  ("N" . "\e$(G$N\e(B")  ("O" . "\e$(G$O\e(B")  ("P" . "\e$(G$P\e(B")
+                  ("Q" . "\e$(G$Q\e(B")  ("R" . "\e$(G$R\e(B")  ("S" . "\e$(G$S\e(B")  ("T" . "\e$(G$T\e(B")
+                  ("U" . "\e$(G$U\e(B")  ("V" . "\e$(G$V\e(B")  ("W" . "\e$(G$W\e(B")  ("X" . "\e$(G$X\e(B")
+                  ("Y" . "\e$(G$Y\e(B")  ("Z" . "\e$(G$Z\e(B")))
+    (let ((in (car ascii)) (out (cdr ascii)))
+      (its-defrule (concat its-banjiao-escape in) in)
+      (its-defrule (concat its-quanjiao-escape in) out)))
+
+    (its-defrule "<" "\e$(G!"\e(B")
+    (its-defrule ">" "\e$(G!$\e(B")
+    (its-defrule "?" "\e$(G!#\e(B"))
+
+(define-its-state-machine-append its-zhuyin-cn-map
+  (its-defrule "[" its-zhuyin-cn-open-braket)
+  (its-defrule "]" its-zhuyin-cn-close-braket)
+
+(if its-zhuyin-cn-enable-quanjioao-alphabet
+      (progn
+       (its-defrule "#"  "\e$A##\e(B")  (its-defrule "$"  "\e$A!g\e(B")
+       (its-defrule "%"  "\e$A#%\e(B")
+       (its-defrule "&"  "\e$A#&\e(B")  (its-defrule "*"  "\e$A#*\e(B")
+       (its-defrule "("  "\e$A#(\e(B")  (its-defrule ")"  "\e$A#)\e(B")
+       (its-defrule "~"  "\e$A!+\e(B")
+       (its-defrule "="  "\e$A#=\e(B")  (its-defrule "`"  "\e$A#`\e(B")
+       (its-defrule "\\" "\e$A#\\e(B")  (its-defrule "|"  "\e$A#|\e(B")
+       (its-defrule "_"  "\e$A#_\e(B")  (its-defrule "+"  "\e$A#+\e(B")
+       (its-defrule "{"  "\e$A#{\e(B")  (its-defrule "}"  "\e$A#}\e(B")
+       (its-defrule "\"" "\e$A#"\e(B")  (its-defrule "'"  "\e$A#'\e(B"))
+    (progn
+      (its-defrule "#"  "#")  (its-defrule "$"  "$")
+      (its-defrule "%"  "%")
+      (its-defrule "&"  "&")  (its-defrule "*"  "*")
+      (its-defrule "("  "(")  (its-defrule ")"  ")")
+      (its-defrule "~"  "~")
+      (its-defrule "="  "=")  (its-defrule "`"  "`")
+      (its-defrule "\\" "\\") (its-defrule "|"  "|")
+      (its-defrule "_"  "_")  (its-defrule "+"  "+")
+      (its-defrule "{"  "{")  (its-defrule "}"  "}")
+      (its-defrule "\"" "\"") (its-defrule "'"  "'"))))
+
+(define-its-state-machine-append its-zhuyin-tw-map
+  (its-defrule "[" its-zhuyin-tw-open-braket)
+  (its-defrule "]" its-zhuyin-tw-close-braket)
+
+  (if its-zhuyin-tw-enable-quanjioao-alphabet
+      (progn
+       (its-defrule "#"  "\e$(G!l\e(B")  (its-defrule "$"  "\e$(G"c\e(B")
+       (its-defrule "%"  "\e$(G"h\e(B")
+       (its-defrule "&"  "\e$(G!m\e(B")  (its-defrule "*"  "\e$(G!n\e(B")
+       (its-defrule "("  "\e$(G!>\e(B")  (its-defrule ")"  "\e$(G!?\e(B")
+       (its-defrule "~"  "\e$(G"D\e(B")
+       (its-defrule "="  "\e$(G"8\e(B")  (its-defrule "`"  "\e$(G!j\e(B")
+       (its-defrule "\\" "\e$(G"`\e(B")  (its-defrule "|"  "\e$(G"^\e(B")
+       (its-defrule "_"  "\e$(G"%\e(B")  (its-defrule "+"  "\e$(G"0\e(B")
+       (its-defrule "{"  "\e$(G!B\e(B")  (its-defrule "}"  "\e$(G!C\e(B")
+       (its-defrule "\"" "\e$(G!i\e(B")  (its-defrule "'"  "\e$(G!k\e(B"))
+    (progn
+      (its-defrule "#"  "#")  (its-defrule "$"  "$")
+      (its-defrule "%"  "%")
+      (its-defrule "&"  "&")  (its-defrule "*"  "*")
+      (its-defrule "("  "(")  (its-defrule ")"  ")")
+      (its-defrule "~"  "~")
+      (its-defrule "="  "=")  (its-defrule "`"  "`")
+      (its-defrule "\\" "\\") (its-defrule "|"  "|")
+      (its-defrule "_"  "_")  (its-defrule "+"  "+")
+      (its-defrule "{"  "{")  (its-defrule "}"  "}")
+      (its-defrule "\"" "\"") (its-defrule "'"  "'"))))
+
+(provide 'its/zhuyin)
diff --git a/leim-list-egg.el b/leim-list-egg.el
new file mode 100644 (file)
index 0000000..ac70a92
--- /dev/null
@@ -0,0 +1,84 @@
+;;; leim-list-egg.el --- Egg setup for leim API
+
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc
+
+;; Author: NIIBE Yutaka <gniibe@chroot.org>
+;;         KATAYAMA Yoshio <kate@pfu.co.jp>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+;;; leim-list-egg.el --- Egg setup for leim API
+;;; CAUTION: Don't delete the above line.
+
+(autoload 'egg-activate-wnn "egg/wnn" "Activate Wnn backend of Tamagotchy." t)
+(autoload 'egg-activate-sj3 "egg/sj3" "Activate SJ3 backend of Tamagotchy." t)
+
+(register-input-method
+ "japanese-egg-wnn" "Japanese" 'egg-activate-wnn
+ "\e$B$"\e(B.."  "Romaji -> Hiragana -> Kanji&Kana"
+ 'its-select-hiragana)
+
+(register-input-method
+ "japanese-egg-sj3" "Japanese" 'egg-activate-sj3
+ "\e$B$"\e(B.."  "Romaji -> Hiragana -> Kanji&Kana"
+ 'its-select-hiragana)
+
+(register-input-method
+ "chinese-gb-egg-wnn-py" "Chinese-GB" 'egg-activate-wnn
+ "\e$AF4\e(BG"  "Pinyin -> Simplified Hanzi"
+ 'its-select-pinyin-cn)
+
+(register-input-method
+ "chinese-gb-egg-wnn-zy" "Chinese-GB" 'egg-activate-wnn
+ "\e$AW"\e(BG"  "Zhunyin -> Simplified Hanzi"
+ 'its-select-zhuyin-cn)
+
+(register-input-method
+ "chinese-gb-egg-wnn-qm" "Chinese-GB" 'egg-activate-wnn
+ "\e$AG.\e(B"  "QianMa Simplified Hanzi inputmethod"
+ 'its-select-qianma)
+
+(register-input-method
+ "chinese-gb-egg-wnn-wb" "Chinese-GB" 'egg-activate-wnn
+ "\e$ANe\e(B"  "WuBi Simplified Hanzi inputmethod"
+ 'its-select-wubi)
+
+(register-input-method
+ "chinese-cns-egg-wnn-py" "Chinese-CNS" 'egg-activate-wnn
+ "\e$(GQ;\e(BC"  "Pinyin -> Traditional Hanzi"
+ 'its-select-pinyin-tw)
+
+(register-input-method
+ "chinese-cns-egg-wnn-zy" "Chinese-CNS" 'egg-activate-wnn
+ "\e$(GNC\e(BC"  "Zhunyin -> Traditional Hanzi"
+ 'its-select-zhuyin-tw)
+
+(register-input-method
+ "korean-egg-wnn" "Korean" 'egg-activate-wnn
+ "\e$(CGQ\e(B"  "Hangul -> Hanja"
+ 'its-select-hangul)
+
+(autoload 'egg-mode "egg" "Toggle EGG  mode." t)
diff --git a/menudiag.el b/menudiag.el
new file mode 100644 (file)
index 0000000..50d50b8
--- /dev/null
@@ -0,0 +1,507 @@
+;;; menudiag.el --- Minibuffer Menu System
+
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc
+
+;; Author: NIIBE Yutaka <gniibe@chroot.org>
+
+;; Maintainer: TOMURA Satoru <tomura@etl.go.jp>
+
+;; Keywords: mule, multilingual, input method
+
+;; This file is part of EGG.
+
+;; EGG 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, or (at your option)
+;; any later version.
+
+;; EGG 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 GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+;; Inspired by the menu subsystem of EGG V3.0
+;;
+;; Completely different implementation, using keymap and recursive edit.
+
+;;; Code:
+
+;;
+;; Data structure of MENU
+;;
+;; <menu> ::= ( menu <prompt> <item-list> )
+;; <prompt> ::= STRING
+;; <item-list> ::= ( <item> ... )
+;; <item> ::= <string> | ( <string> . <value> )
+;;
+;; <value> ::=  <menu> | INTEGER | STRING  (Must *NOT* cons cell)
+;;
+;;
+;
+;;
+;; <selection-list> ::= ( <line>... )
+;; <line>  ::= ( <item>... )
+;;
+
+(defgroup menudiag nil
+  "Input Translation System of Tamagotchy"
+  :group 'egg)
+
+(defcustom menudiag-select-without-return nil
+  "*Number keys not only goes the item, but also select the item, if non-NIL."
+  :group 'menudiag :type 'boolean)
+
+(defvar menudiag-mode-map
+  (let ((map (make-sparse-keymap))
+       ch)
+    (setq ch ?0)
+    (while (<= ch ?9)
+      (define-key map (char-to-string ch) 'menudiag-goto-item)
+      (setq ch (1+ ch)))
+    (setq ch ?a)
+    (while (<= ch ?z)
+      (define-key map (char-to-string ch) 'menudiag-goto-item)
+      (setq ch (1+ ch)))
+    (setq ch ?A)
+    (while (<= ch ?Z)
+      (define-key map (char-to-string ch) 'menudiag-goto-item)
+      (setq ch (1+ ch)))
+    (define-key map "\C-a" 'menudiag-beginning-of-line)
+    (define-key map "\C-e" 'menudiag-end-of-line)
+    (define-key map "\M-<" 'menudiag-beginning-of-items)
+    (define-key map "\M->" 'menudiag-end-of-items)
+    (define-key map "\C-f" 'menudiag-forward-item)
+    (define-key map "\C-b" 'menudiag-backward-item)
+    (define-key map "\C-n" 'menudiag-next-line)
+    (define-key map "\C-p" 'menudiag-previous-line)
+    (define-key map "\C-]" 'menudiag-exit)
+    (define-key map "\C-g" 'menudiag-exit-one-level)
+    (define-key map "\C-l" 'menudiag-redraw)
+    (define-key map "\C-m" 'menudiag-select-this-item)
+    (define-key map "?"    'menudiag-list-other-window)
+    (define-key map [return] 'menudiag-select-this-item)
+    (define-key map [left] 'menudiag-backward-item)
+    (define-key map [right] 'menudiag-forward-item)
+    (define-key map [up] 'menudiag-previous-line)
+    (define-key map [down] 'menudiag-next-line)
+    (define-key map [menudiag-continuation] 'menudiag-follow-continuation)
+    (define-key map [t] 'undefined)
+    map)
+  "Keymap for MENU.")
+
+(defun menudiag-menu-p (item)
+  (and (consp item) (eq 'menu (car item))))
+
+(defun menudiag-item-string (item)
+  (if (stringp item)
+      item
+    (format "%s" (car item))))
+
+(defun menudiag-item-value (item)
+  (if (stringp item)
+      item
+    (cdr item)))
+
+(defsubst menudiag-item-width (item)
+  (+ 4 (string-width (menudiag-item-string item))))
+
+(defvar menudiag-window-conf nil)
+
+(defun menudiag-make-selection-list (item-list line-width)
+  (let ((l nil)
+       (line nil)
+       (width 0)
+       (i 0))
+    (while item-list
+      (let* ((item (car item-list))
+            (item-width (menudiag-item-width item)))
+       (if (and line (or (>= (+ width item-width) line-width)
+                          (>= i 36)))
+           (setq l (cons (reverse line) l)
+                 line nil
+                 width 0
+                 i 0))
+       (setq line (cons item line)
+             width (+ width (menudiag-item-width item))
+             i (1+ i)
+             item-list (cdr item-list))))
+    (if line
+       (reverse (cons (reverse line) l))
+      (reverse l))))
+
+;; Entry function
+(defun menudiag-select (menu &optional menudiag-continuation return-contin)
+  (let ((enable-recursive-minibuffers t)
+       value done)
+    (setq menudiag-window-conf nil)
+    (if menudiag-continuation
+       (setq unread-command-events (cons 'menudiag-continuation
+                                         unread-command-events)))
+    (if (not return-contin)
+       (setq value t))
+    (menudiag-select-internal menu)
+    (if (eq done t)
+       value
+      (signal 'quit ""))))
+
+;; Entry function
+(defun menudiag-get-value (continuation)
+  (menudiag-item-value (nth (1- (length continuation)) continuation)))
+
+(defun menudiag-follow-continuation ()
+  (interactive)
+  (let ((item (car menudiag-continuation)))
+    (setq menudiag-continuation (cdr menudiag-continuation))
+    (if menudiag-continuation
+       (setq unread-command-events (cons 'menudiag-continuation
+                                         unread-command-events)))
+    (if (eq item 'menudiag-list-all)
+       (menudiag-list-other-window)
+      (let ((in-loop t))
+       (while in-loop
+         (if (eq item (nth pos-in-line line))
+             (setq in-loop nil)
+           (menudiag-forward-item)
+           (if (and (= linepos 0) (= pos-in-line 0))
+               (error "no such item: %s" (menudiag-item-string item))))))
+      (let ((v (menudiag-item-value item)))
+       (if (menudiag-menu-p v)
+           (unwind-protect
+               (progn
+                 (menudiag-select-internal v)
+                 (menudiag-redraw))
+             (if (consp value)
+                 (setq value (cons item value)))
+             (if done (menudiag-exit-minibuffer))))))))
+
+(defun menudiag-select-internal (menu)
+  (let* ((minibuf-prompt (nth 1 menu))
+        (current-items (nth 2 menu))
+        (selection-list
+         (menudiag-make-selection-list current-items
+                                       (- (window-width (minibuffer-window))
+                                          (string-width minibuf-prompt))))
+        (line (car selection-list))
+        (minibuf-contents
+         (menudiag-make-menu-formatted-string line)))
+    (let ((linepos 0)
+         (pos-in-line 0))
+      (read-from-minibuffer minibuf-prompt
+                           (cons minibuf-contents 3)
+                           menudiag-mode-map))))
+
+(defun menudiag-make-menu-formatted-string (item-list)
+  (let ((i -1))
+    (mapconcat
+     (function (lambda (item)
+                (setq i (1+ i))
+                (format "  %c.%s" (menudiag-item-num-to-char i) 
+                           (menudiag-item-string item))))
+     item-list "")))
+
+
+;; ITEM No --> Character
+(defun menudiag-item-num-to-char (num)
+  (let ((char))
+    (cond ((<= num 9)
+           (setq char (+ ?0 num)))
+          (t
+           (setq char (+ ?a (- num 10))))
+          )
+    char))
+
+;; Character --> ITEM No
+(defun menudiag-char-to-item-num (char)
+  (let ((num))
+    (cond ((and (<= ?0 ch) (<= ch ?9))
+           (setq num (- ch ?0)))
+          ((and (<= ?a ch) (<= ch ?z))
+           (setq num (+ 10 (- ch ?a))))
+          ((and (<= ?A ch) (<= ch ?Z))
+           (setq num (+ 10 (- ch ?A))))
+          (t (setq num 1000)))
+    num))
+
+(defun menudiag-goto-item ()
+  (interactive)
+  (let ((ch last-command-char)
+       (n 0))
+    (setq n (menudiag-char-to-item-num ch))
+    (if (>= n (length line))
+       (error "No such item")
+      (menudiag-goto-item-internal n)
+      (if menudiag-select-without-return
+         (menudiag-select-this-item)))))
+
+(defun menudiag-goto-item-internal (n)
+  (let ((old-pos-in-line pos-in-line)
+       (p 3)
+       (i 0))
+    (setq pos-in-line n)
+    (while (< i pos-in-line)
+      (setq p (+ p (length (menudiag-item-string (nth i line))) 4))
+      (setq i (1+ i)))
+    (goto-char p)))
+
+(defun menudiag-beginning-of-items ()
+  (interactive)
+  (menudiag-goto-line 0)
+  (menudiag-beginning-of-line))
+
+(defun menudiag-end-of-items ()
+  (interactive)
+  (menudiag-goto-line (1- (length selection-list)))
+  (menudiag-end-of-line))
+
+(defun menudiag-beginning-of-line ()
+  (interactive)
+  (menudiag-goto-item-internal 0))
+
+(defun menudiag-end-of-line ()
+  (interactive)
+  (menudiag-goto-item-internal (1- (length line))))
+
+;; Should retain compatibility.  Must.
+;;
+;;(defun menudiag-forward-item ()
+;;  (interactive)
+;;  (if (< pos-in-line (1- (length line)))
+;;      (menudiag-goto-item-internal (1+ pos-in-line))
+;;    (if (>= linepos (1- (length selection-list)))
+;;     (signal 'end-of-buffer "")
+;;      (menudiag-goto-line (1+ linepos))
+;;      (menudiag-beginning-of-line))))
+;;
+;;(defun menudiag-backward-item ()
+;;  (interactive)
+;;  (if (< 0 pos-in-line)
+;;      (menudiag-goto-item-internal (1- pos-in-line))
+;;    (if (< linepos 1)
+;;     (signal 'beginning-of-buffer "")
+;;      (menudiag-goto-line (1- linepos))
+;;      (menudiag-end-of-line))))
+;;
+;;(defun menudiag-goto-line (n)
+;;  (if (or (>= n (length selection-list)) (< n 0))
+;;      (ding)
+;;    (setq line (nth n selection-list)
+;;       linepos n)
+;;    (delete-region (point-min) (point-max))
+;;    (insert (menudiag-make-menu-formatted-string line))))
+;;
+
+(defun menudiag-forward-item ()
+  (interactive)
+  (if (< pos-in-line (1- (length line)))
+      (menudiag-goto-item-internal (1+ pos-in-line))
+    (if (>= linepos (1- (length selection-list)))
+       (menudiag-goto-line 0)
+      (menudiag-goto-line (1+ linepos)))
+    (menudiag-beginning-of-line)))
+
+(defun menudiag-backward-item ()
+  (interactive)
+  (if (< 0 pos-in-line)
+      (menudiag-goto-item-internal (1- pos-in-line))
+    (if (< linepos 1)
+        (menudiag-goto-line (1- (length selection-list)))
+      (menudiag-goto-line (1- linepos)))
+    (menudiag-end-of-line)))
+
+(defun menudiag-goto-line (n)
+  (cond
+   ((>= n (length selection-list))
+    (setq n 0))
+   ((< n 0)
+    (setq n (1- (length selection-list)))))
+  (setq line (nth n selection-list)
+        linepos n)
+  (delete-region (point-min) (point-max))
+  (insert (menudiag-make-menu-formatted-string line)))
+
+(defun menudiag-next-line ()
+  (interactive)
+  (menudiag-goto-line (1+ linepos))
+  (if (< pos-in-line (length line))
+      (menudiag-goto-item-internal pos-in-line)
+    (menudiag-end-of-line)))
+
+(defun menudiag-previous-line ()
+  (interactive)
+  (menudiag-goto-line (1- linepos))
+  (if (< pos-in-line (length line))
+      (menudiag-goto-item-internal pos-in-line)
+    (menudiag-end-of-line)))
+
+(defun menudiag-redraw ()
+  (interactive)
+  (menudiag-goto-line linepos)
+  (menudiag-goto-item-internal pos-in-line))
+
+(defun menudiag-exit-one-level ()
+  (interactive)
+  (menudiag-exit-minibuffer))
+
+(defun menudiag-exit ()
+  (interactive)
+  (setq done 'quit)
+  (menudiag-exit-minibuffer))
+
+(defun menudiag-select-this-item ()
+  (interactive)
+  (let* ((item (nth pos-in-line line))
+        (v (menudiag-item-value item)))
+    (if (menudiag-menu-p v)
+       (unwind-protect
+           (progn
+             (menudiag-restore-window)
+             (menudiag-select-internal v)
+             (menudiag-redraw))
+         (if (consp value)
+             (setq value (cons item value)))
+         (if done (menudiag-exit-minibuffer)))
+      (if (eq value t)
+         (setq value (menudiag-item-value item))
+       (setq value (cons item nil)))
+      (setq done t)
+      (menudiag-exit-minibuffer))))
+\f
+(defconst menudiag-selection-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [right]   'next-completion)
+    (define-key map [left]    'previous-completion)
+    (define-key map "\r"      'menudiag-choose-item)
+    (define-key map [mouse-2] 'menudiag-mouse-choose-item)
+    map))
+
+(defvar menudiag-selection-buffer nil)
+(make-variable-buffer-local 'menudiag-selection-buffer)
+(put 'menudiag-selection-buffer 'permanent-local t)
+
+(defvar menudiag-selection-main-buffer nil)
+(make-variable-buffer-local 'menudiag-selection-main-buffer)
+(put 'menudiag-selection-main-buffer 'permanent-local t)
+
+(defun menudiag-selection-mode ()
+  (interactive)
+  (kill-all-local-variables)
+  (make-local-variable 'inhibit-read-only)
+  (setq buffer-read-only t
+       inhibit-read-only nil)
+  (use-local-map menudiag-selection-map)
+  (setq mode-name "Menudiag Selection")
+  (setq major-mode 'menudiag-selection-mode))
+
+(defun menudiag-max-item-width (item-list)
+  (let ((max 0))
+    (while item-list
+      (setq max (max max (menudiag-item-width (car item-list)))
+           item-list (cdr item-list)))
+    max))
+
+(defun menudiag-buffer-show-function ()
+  (let* ((items current-items)
+        (digits (length (concat (length items))))
+        (columns (max 1 (/ (window-width (minibuffer-window))
+                           (+ digits (menudiag-max-item-width items)))))
+        (width (/ (window-width (minibuffer-window)) columns))
+        (col 0) (n 0) str)
+    (insert " ")
+    (while items
+      (setq p (point)
+           str (format (concat "%" digits "d. %s")
+                       n (menudiag-item-string (car items))))
+      (insert str)
+      (set-text-properties p (point) '(mouse-face highlight))
+      (setq col (1+ col)
+           n (1+ n)
+           items (cdr items))
+      (if items
+         (if (/= col columns)
+             (insert (make-string (- width (string-width str)) ?\ ))
+           (insert "\n ")
+           (setq col 0))))
+    (goto-char (point-min))
+    (set-buffer-modified-p nil)
+    (menudiag-selection-mode)))
+
+(defun menudiag-buffer-name (prompt)
+  (let ((len (1- (length prompt))))
+    (if (= (aref prompt len) ?:) (substring prompt 0 len) prompt)))
+
+(defun menudiag-list-other-window ()
+  (interactive)
+  (let ((temp-buffer-show-hook 'menudiag-buffer-show-function)
+       (main-buf (current-buffer)))
+    (setq menudiag-window-conf (current-window-configuration))
+    (with-output-to-temp-buffer (menudiag-buffer-name minibuf-prompt)
+      (setq menudiag-selection-buffer standard-output))
+    (set-buffer menudiag-selection-buffer)
+    (setq menudiag-selection-main-buffer main-buf)))
+
+(defun menudiag-choose-item ()
+  (interactive)
+  (let ((org-buf menudiag-selection-main-buffer)
+       (sel-buf (current-buffer))
+       (item-list selection-list)
+       (l 0)
+       tmp-buf n)
+    (with-temp-buffer
+      (setq tmp-buf (current-buffer))
+      (set-buffer sel-buf)
+      (setq completion-reference-buffer tmp-buf)
+      (choose-completion)
+      (set-buffer tmp-buf)
+      (setq n (string-to-int (buffer-string))))
+    (pop-to-buffer org-buf)
+    (while (and item-list (>= (- n (length (car item-list))) 0))
+      (setq l (1+ l)
+           n (- n (length (car item-list)))
+           item-list (cdr item-list)))
+    (menudiag-goto-line l)
+    (menudiag-goto-item-internal n)
+    (menudiag-select-this-item)))
+
+(defun menudiag-mouse-choose-item (event)
+  (interactive "e")
+  (set-buffer (window-buffer (car (nth 1 event))))
+  (let ((org-buf menudiag-selection-main-buffer)
+       (sel-buf (current-buffer))
+       (item-list selection-list)
+       (l 0)
+       tmp-buf n)
+    (with-temp-buffer
+      (setq tmp-buf (current-buffer))
+      (set-buffer sel-buf)
+      (setq completion-reference-buffer tmp-buf)
+      (mouse-choose-completion event)
+      (set-buffer tmp-buf)
+      (setq n (string-to-int (buffer-string))))
+    (pop-to-buffer org-buf)
+    (while (and item-list (>= (- n (length (car item-list))) 0))
+      (setq l (1+ l)
+           n (- n (length (car item-list)))
+           item-list (cdr item-list)))
+    (menudiag-goto-line l)
+    (menudiag-goto-item-internal n)
+    (menudiag-select-this-item)))
+
+(defun menudiag-restore-window ()
+  (if menudiag-window-conf
+      (progn
+       (set-window-configuration menudiag-window-conf)
+       (setq menudiag-window-conf nil)
+       (kill-buffer menudiag-selection-buffer))))
+
+(defun menudiag-exit-minibuffer ()
+  (and menudiag-window-conf (menudiag-restore-window))
+  (exit-minibuffer))
+
+(provide 'menudiag)
+;;; menudiag.el ends here.