\input miniltx
\def\settowidth#1#2{%
  \setbox\@tempboxa\hbox{{#2}}#1\wd\@tempboxa
  \setbox\@tempboxa\box\voidb@x}

\endlinechar \m@ne

\newif\ifxeCJK@checksingle
\newif\ifxeCJK@space@

\def\xeCJK@patch#1#2#3{
  \edef#1{\unexpanded{#2}\unexpanded\expandafter{#1}\unexpanded{#3}}}
\def\makexeCJKactive{\XeTeXinterchartokenstate=1\relax}
\def\makexeCJKinactive{\XeTeXinterchartokenstate=0\relax}
\makexeCJKactive
\def\xeCJKsetcharclass#1#2#3{
  \@tempcnta=#1
  \loop
    \XeTeXcharclass \@tempcnta #3\relax
    \advance\@tempcnta 1\relax
    \unless\ifnum\the\@tempcnta>#2 \repeat
  \xeCJK@setpunctcharclass}
\def\xeCJK@prePunct#1#2{\xeCJK@setPunct{2}{#1}{#2}}
\def\xeCJK@postPunct#1#2{\xeCJK@setPunct{3}{#1}{#2}}
\def\xeCJK@setPunct#1#2#3{
  \def\xeCJK@class{#1}
  \@tempcnta "#2\relax
  \multiply\@tempcnta 256\relax
  \xeCJK@setPunct@#3,,}
\def\xeCJK@setPunct@#1,{
  \edef\xeCJK@temp{#1}%
  \unless\ifx\xeCJK@temp\@empty
     \@tempcntb "#1\relax
     \advance\@tempcntb\@tempcnta\relax
     \XeTeXcharclass \@tempcntb=\xeCJK@class\relax
     \def\xeCJK@temp{\xeCJK@setPunct@}
  \fi
  \xeCJK@temp}
\def\xeCJK@setpunctcharclass{
  \xeCJK@prePunct{20}{18,1C}
  \xeCJK@postPunct{20}{19,1D,14,26}
  \xeCJK@postPunct{25}{00}
  \xeCJK@prePunct{30}{08,0A,0C,0E,10,12,14,16,18,1A,1D,1F,36}
  \xeCJK@postPunct{30}{01,02,05,06,09,0B,0D,0F,11,15,17,19,1B,1E,
                       41,43,45,47,49,63,83,85,87,8E,
                       9B,9C,9D,9E,A1,A3,A5,A7,A9,C3,E3,E5,E7,EE,F5,F6,FB,FC,FD,FE}
  \xeCJK@prePunct {FE}{59,5B,5D,5F,60,69,6B}
  \xeCJK@postPunct{FE}{50,51,52,54,55,56,57,5A,5C,5E,6A}
  \xeCJK@prePunct {FF}{03,04,08,20,3B,5B,E0,E1,E5,E6}
  \xeCJK@postPunct{FF}{01,05,09,0C,0E,1A,1B,1F,3D,5D,
                       61,63,64,65,67,68,69,6A,6B,6C,6D,6E,6F,70,9E,9F}
  \xeCJK@setPunct{1}{0}{B7}
  \xeCJK@setPunct{4}{0}{28,2D,5B,60,7B}
  \xeCJK@setPunct{5}{0}{21,22,25,27,29,2C,2E,3A,3B,3F,5D,7D}}
\xeCJKsetcharclass{"1100}{"11FF}{1}
\xeCJKsetcharclass{"2E80}{"2EFF}{1}
\xeCJKsetcharclass{"2F00}{"2FDF}{1}
\xeCJKsetcharclass{"2FF0}{"2FFF}{1}
\xeCJKsetcharclass{"3000}{"303F}{1}
\xeCJKsetcharclass{"3040}{"309F}{1}
\xeCJKsetcharclass{"30A0}{"30FF}{1}
\xeCJKsetcharclass{"3100}{"312F}{1}
\xeCJKsetcharclass{"3130}{"318F}{1}
\xeCJKsetcharclass{"3190}{"319F}{1}
\xeCJKsetcharclass{"31A0}{"31BF}{1}
\xeCJKsetcharclass{"31C0}{"31EF}{1}
\xeCJKsetcharclass{"31F0}{"31FF}{1}
\xeCJKsetcharclass{"3200}{"32FF}{1}
\xeCJKsetcharclass{"3300}{"33FF}{1}
\xeCJKsetcharclass{"3400}{"4DBF}{1}
\xeCJKsetcharclass{"4E00}{"9FFF}{1}
\xeCJKsetcharclass{"A000}{"A4CF}{1}
\xeCJKsetcharclass{"AC00}{"D7AF}{1}
\xeCJKsetcharclass{"F900}{"FAFF}{1}
\xeCJKsetcharclass{"FE30}{"FE4F}{1}
\xeCJKsetcharclass{"FF00}{"FFEF}{1}
\xeCJKsetcharclass{"20000}{"2A6DF}{1}
\xeCJKsetcharclass{"2A700}{"2B73F}{1}
\xeCJKsetcharclass{"2B740}{"2B81F}{1}
\xeCJKsetcharclass{"2F800}{"2FA1F}{1}
\def\CJK@stop{\CJK@stop}
\def\normalspacedchars#1{
  \xeCJK@setnormalspacedchar#1\CJK@stop}
\def\xeCJK@setnormalspacedchar#1{
  \unless\ifx#1\CJK@stop
    \XeTeXcharclass`#1=6
    \expandafter\xeCJK@setnormalspacedchar
  \fi}
\normalspacedchars{/}
\XeTeXinterchartoks 1 0{\egroup\CJKecglue}
\XeTeXinterchartoks 1 1{\xeCJK@i@i}
\XeTeXinterchartoks 1 2{\xeCJK@i@ii}
\XeTeXinterchartoks 1 3{\xeCJK@i@iii}
\XeTeXinterchartoks 1 4{\egroup\CJKecglue}
\XeTeXinterchartoks 1 5{\egroup}
\XeTeXinterchartoks 1 255{\xeCJK@i@cclv}
\XeTeXinterchartoks 2 0{\xeCJK@ii@}
\XeTeXinterchartoks 2 1{\xeCJK@ii@i}
\XeTeXinterchartoks 2 2{\xeCJK@ii@ii}
\XeTeXinterchartoks 2 3{\xeCJK@ii@iii}
\XeTeXinterchartoks 2 4{\xeCJK@ii@iv}
\XeTeXinterchartoks 2 5{\xeCJK@ii@v}
\XeTeXinterchartoks 2 255{\xeCJK@ii@cclv}
\XeTeXinterchartoks 3 0{\xeCJK@iii@}
\XeTeXinterchartoks 3 1{\xeCJK@iii@i}
\XeTeXinterchartoks 3 2{\xeCJK@iii@ii}
\XeTeXinterchartoks 3 3{\xeCJK@iii@iii}
\XeTeXinterchartoks 3 4{\xeCJK@iii@iv}
\XeTeXinterchartoks 3 5{\xeCJK@iii@v}
\XeTeXinterchartoks 3 255{\xeCJK@iii@cclv}
\XeTeXinterchartoks 0 1{\xeCJK@@i}
\XeTeXinterchartoks 0 2{\xeCJK@@ii}
\XeTeXinterchartoks 0 3{\xeCJK@@iii}
\XeTeXinterchartoks 0 255{\xeCJK@@cclv}
\XeTeXinterchartoks 4 1{\xeCJK@iv@i}
\XeTeXinterchartoks 4 2{\xeCJK@iv@ii}
\XeTeXinterchartoks 4 3{\xeCJK@iv@iii}
\XeTeXinterchartoks 5 1{\xeCJK@v@i}
\XeTeXinterchartoks 5 2{\xeCJK@v@ii}
\XeTeXinterchartoks 5 3{\xeCJK@v@iii}
\XeTeXinterchartoks 5 255{\xeCJK@v@cclv}
\XeTeXinterchartoks 255 0{\xeCJK@cclv@}
\XeTeXinterchartoks 255 1{\xeCJK@cclv@i}
\XeTeXinterchartoks 255 2{\xeCJK@cclv@ii}
\XeTeXinterchartoks 255 3{\xeCJK@cclv@iii}
\XeTeXinterchartoks 255 4{\xeCJK@cclv@iv}
\XeTeXinterchartoks 255 6{\xeCJK@cclv@vi}
\XeTeXinterchartoks 1 6{\xeCJK@i@vi}
\XeTeXinterchartoks 2 6{\xeCJK@ii@vi}
\XeTeXinterchartoks 3 6{\xeCJK@iii@vi}
\XeTeXinterchartoks 6 1{\xeCJK@vi@i}
\XeTeXinterchartoks 6 2{\xeCJK@vi@ii}
\XeTeXinterchartoks 6 3{\xeCJK@vi@iii}
\XeTeXinterchartoks 6 255{\xeCJK@vi@cclv}
\def\xeCJK@vi@i{
  \bgroup
  \xeCJK@emptyCJKtoks
  \xeCJK@setfont
  \CJKsymbol}
\def\xeCJK@i@vi{
  \egroup}
\let\xeCJK@ii@vi \xeCJK@i@vi
\let\xeCJK@iii@vi\xeCJK@i@vi
\let\xeCJK@vi@ii \xeCJK@vi@i
\let\xeCJK@vi@iii\xeCJK@vi@i
\def\xeCJK@i@i{
  \CJKglue
  \CJKsymbol}
\let\xeCJK@i@i@save\xeCJK@i@i
\def\xeCJK@i@ii#1{
  \xeCJK@punctrule{#1}{l}
  \hskip \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @lglue@#1\endcsname
    plus 0.1em minus 0.1 em
  \xeCJK@setprepunct{#1}}
\def\xeCJK@i@iii#1{
  \xeCJK@punctrule{#1}{r}
  \ifcsname xeCJK@specialpunct#1\endcsname
    \CJKglue % breakable
  \else
    \nobreak
  \fi
  \xdef\xeCJK@lastpunct{#1}
  \CJKpunctsymbol{#1}}
\def\xeCJK@setprepunct#1{
  \edef\xeCJK@lastpunct{#1}
  \vrule width \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname
    @lrule@#1\endcsname depth \z@ height \z@
  \CJKpunctsymbol{#1}}
\def\xeCJK@i@cclv{
  \egroup
  {\xeCJK@CJKkern}
  \xeCJK@ignorespaces}
\def\xeCJK@ii@i{
  \nobreak
  \CJKsymbol}
\def\xeCJK@ii@ii#1{
  \nobreak
  \xeCJK@punctrule{#1}{l}
  \xeCJK@setkern{\xeCJK@lastpunct}{#1}
  \kern \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @kern\xeCJK@lastpunct#1\endcsname
  \xeCJK@setprepunct{#1}}
\def\xeCJK@ii@iii#1{
  \nobreak
  \xeCJK@punctrule{#1}{r}
  \xeCJK@setkern{\xeCJK@lastpunct}{#1}
  \kern \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @kern\xeCJK@lastpunct#1\endcsname
  \nobreak
  \edef\xeCJK@lastpunct{#1}
  \CJKpunctsymbol{#1}}
\def\xeCJK@ii@{
  \nobreak
  \egroup}
\let\xeCJK@ii@iv\xeCJK@ii@
\let\xeCJK@ii@v\xeCJK@ii@
\def\xeCJK@ii@cclv{
  \nobreak
  \egroup
  \ignorespaces}
\def\xeCJK@iii@{
  \xeCJK@afterpostpunct
  \egroup}
\def\xeCJK@iii@i{
  \xeCJK@afterpostpunct
  \CJKsymbol}
\def\xeCJK@iii@ii#1{
  \vrule width \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname
     @rrule@\xeCJK@lastpunct\endcsname depth \z@ height \z@
  \xeCJK@punctrule{#1}{l}
  \xeCJK@setkern{\xeCJK@lastpunct}{#1}
  \kern \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @kern\xeCJK@lastpunct#1\endcsname
  \xeCJKpunctnobreak
  \xeCJK@setprepunct{#1}}
\def\xeCJK@iii@iii#1{
  \vrule width \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname
     @rrule@\xeCJK@lastpunct\endcsname depth \z@ height \z@
  \xeCJK@punctrule{#1}{r}
  \xeCJK@setkern{\xeCJK@lastpunct}{#1}
  \kern \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @kern\xeCJK@lastpunct#1\endcsname
  \nobreak
  \edef\xeCJK@lastpunct{#1}
  \CJKpunctsymbol{#1}}
\def\xeCJK@iii@iv{
  \xeCJK@afterpostpunct
  \egroup}
\def\xeCJK@afterpostpunct{
  \vrule width \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname
     @rrule@\xeCJK@lastpunct\endcsname depth \z@ height \z@
  \hskip \csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @rglue@\xeCJK@lastpunct\endcsname
    plus 0.1em minus 0.1 em}
\let\xeCJK@iii@v\xeCJK@iii@iv
\def\xeCJK@iii@cclv{
    \xeCJK@afterpostpunct
    \egroup
    \ignorespaces}
\def\xeCJK@@i{
  \CJKecglue
  \bgroup
  \xeCJK@setfont
  \xeCJK@emptyCJKtoks
  \CJKsymbol}
\def\xeCJK@@ii{
  \bgroup
  \xeCJK@setfont
  \XeTeXinterchartoks 0   2{\relax}
  \xeCJK@emptyCJKtoks
  \xeCJK@i@ii}
\def\xeCJK@@iii{
  \bgroup
  \xeCJK@setfont
  \XeTeXinterchartoks 0   3{\relax}
  \xeCJK@emptyCJKtoks
  \xeCJK@i@iii}
\def\xeCJK@iv@i{
  \bgroup
  \xeCJK@setfont
  \XeTeXinterchartoks 4 1{\relax}
  \xeCJK@emptyCJKtoks
  \CJKsymbol}
\def\xeCJK@iv@ii{
  \bgroup
  \xeCJK@setfont
  \XeTeXinterchartoks 4 2{\relax}
  \xeCJK@emptyCJKtoks
  \xeCJK@i@ii}
\def\xeCJK@iv@iii{
  \bgroup
  \xeCJK@setfont
  \XeTeXinterchartoks 4 3{\relax}
  \xeCJK@emptyCJKtoks
  \xeCJK@i@iii}
\def\xeCJK@v@i{
  \CJKecglue
  \bgroup
  \xeCJK@setfont
  \xeCJK@emptyCJKtoks
  \CJKsymbol}
\def\xeCJK@v@ii{
  \bgroup
  \xeCJK@setfont
  \XeTeXinterchartoks 5 2{\relax}
  \xeCJK@emptyCJKtoks
  \xeCJK@i@ii}
\def\xeCJK@v@iii{
  \bgroup
  \xeCJK@setfont
  \XeTeXinterchartoks 5 3{\relax}
  \xeCJK@emptyCJKtoks
  \xeCJK@i@iii}
\def\xeCJK@emptyCJKtoks{
  \XeTeXinterchartoks 255 1{\relax}
  \XeTeXinterchartoks 255 2{\relax}
  \XeTeXinterchartoks 255 3{\relax}}
\def\xeCJK@@cclv{
  \futurelet\xeCJK@nexttoken\xeCJK@zz@cclv}
\def\xeCJK@zz@cclv{
  \ifx\xeCJK@nexttoken\@sptoken
    {\xeCJK@spkern}
  \else
    {\xeCJK@zerokern}
  \fi}
\let\xeCJK@v@cclv\xeCJK@@cclv
\let\xeCJK@vi@cclv\xeCJK@@cclv
\def\xeCJK@cclv@{
  \ifnum\lastkern=\@ne
    \CJKecglue
  \fi}
\let\xeCJK@cclv@iv\xeCJK@cclv@
\let\xeCJK@cclv@vi\xeCJK@cclv@
\def\xeCJK@cclv@i{{
  \ifnum\lastkern=\@ne
    \CJKglue
  \else
    \ifnum\lastkern=\xeCJK@four
      \CJKecglue
    \else
      \ifnum\lastnodetype=\xeCJK@ten
        \CJKecglue
      \else
        \ifnum\lastnodetype=\xeCJK@eleven
          \settowidth\@tempdima\@sptoken
          \ifdim\lastskip=\@tempdima
            \@tempskipa=\lastskip
            \unskip
            \ifnum\lastkern=\tw@
              \CJKecglue
            \else
              \ifnum\lastnodetype=\xeCJK@ten
                \CJKecglue
              \else
                \ifnum\lastkern=\xeCJK@four
                  \CJKecglue
                \else
                  \hskip\@tempskipa
  \fi\fi\fi\fi\fi\fi\fi\fi}
  \bgroup
  \xeCJK@emptyCJKtoks
  \xeCJK@setfont
  \CJKsymbol}
\def\xeCJK@cclv@ii{
  \bgroup
  \xeCJK@emptyCJKtoks
  \xeCJK@setfont
  \xeCJK@i@ii}
\def\xeCJK@cclv@iii{
  \bgroup
  \xeCJK@emptyCJKtoks
  \xeCJK@setfont
  \xeCJK@i@iii}
\def\CJKglue{\hskip \z@ \@plus .08\baselineskip}
\def\CJK@nobreakglue{\nobreak\CJKglue\nobreak}
\edef\xeCJK@CJKkern{\kern -1sp\kern 1sp}
\edef\xeCJK@spkern{\kern -2sp\kern 2sp}
\edef\xeCJK@zerokern{\kern -4sp\kern 4sp}
\chardef\xeCJK@four=4
\chardef\xeCJK@ten=10
\chardef\xeCJK@eleven=11
\def\CJKspace{\let\xeCJK@ignorespaces\@empty}
\def\CJKnospace{\def\xeCJK@ignorespaces{\xeCJK@@ignorespaces}}
\ifxeCJK@space@
  \CJKspace
\else
  \CJKnospace
\fi
\def\xeCJK@@ignorespaces{
  \futurelet\xeCJK@nexttoken\xeCJK@checknext}
\def\xeCJK@checknext{
  \ifx\xeCJK@nexttoken\@sptoken
    \expandafter\xeCJK@@checknext
  \else
    \ifx $\xeCJK@nexttoken
      \CJKecglue
    \fi
  \fi}
{
  \def\:{\xeCJK@@checknext}
  \global\expandafter\def\: {\futurelet\@let@token\xeCJK@@@checknext}
}
\def\xeCJK@@@checknext{
  \ifx $\@let@token
    \CJKecglue
  \else
    \if\relax\noexpand\@let@token
      \unless\ifx\@let@token\xeCJK@par
        \CJKecglue
      \fi
    \fi
  \fi
  \let\xeCJK@nexttoken\relax}
\def\xeCJKenablechecksingle{\def\xeCJK@i@i{\xeCJK@checksingle}}
\def\xeCJKdisablechecksingle{\let\xeCJK@i@i\xeCJK@i@i@save}
\ifxeCJK@checksingle
  \AtEndOfPackage{\xeCJKenablechecksingle}
\fi
\def\xeCJK@checksingle#1{
  \def\xeCJK@setcurrentchar@i{
    \CJKglue
    \CJKsymbol{#1}}
  \def\xeCJK@setcurrentnobreakchar@i{
    \CJKsymbol{#1}}
  \futurelet\@let@token\xeCJK@@checksingle}
\def\xeCJK@@checksingle{
  \ifcat 。\noexpand\@let@token
    \expandafter\xeCJK@@@checksingle
  \else
    \expandafter\xeCJK@setcurrentchar@i
  \fi}
\def\xeCJK@@@checksingle#1{
  \def\xeCJK@setcurrentchar@ii{
    \xeCJK@setcurrentchar@i #1}
  \def\xeCJK@setcurrentchar@ii@s{
    \xeCJK@setcurrentchar@i #1 }
  \def\xeCJK@setcurrentnobreakchar@ii{
    \xeCJK@setcurrentnobreakchar@i #1}
  \futurelet\@let@token\xeCJK@@@@checksingle}
\def\xeCJK@@@@checksingle{
  \ifx\@let@token\@sptoken
    \expandafter\xeCJK@checkpar
  \else
    \expandafter\xeCJK@setcurrentchar@ii
  \fi}
\let\xeCJK@par\par
\def\xeCJK@checkpar{
  \@ifnextchar\xeCJK@par{\xeCJK@setcurrentnobreakchar@ii}{\xeCJK@setcurrentchar@ii@s}}
\def\xeCJKsetecglue#1{
    \def\CJK@ecglue{#1}
    \let\CJKecglue\CJK@ecglue}
\let\CJKsetecglue\xeCJKsetecglue
\CJKsetecglue{ }
\def\xeCJKallowbreakbetweenpuncts{
  \def\xeCJKpunctnobreak{
    \hskip \z@\relax}}
\def\xeCJKnobreakbetweenpuncts{
  \let\xeCJKpunctnobreak\nobreak}
\xeCJKnobreakbetweenpuncts
\let\xeCJK@itcorr\/
\def\/{%
  \relax
  \ifnum\lastkern=4 %
    \unkern\unkern
  \fi
  \xeCJK@itcorr}
\let\@@italiccorr=\/
\newcount\xeCJK@cnta
\newcount\xeCJK@cntb
\newcount\xeCJK@cntc
\newcount\xeCJK@cntd
\newcount\xeCJK@cnte
\newdimen\xeCJK@dima
\newif\ifxeCJK@dokerning
\def\xeCJK@punctrule#1#2{
  \xdef\xeCJK@bboxname{\xeCJK@fontname}
  \unless\ifcsname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @#2rule@#1\endcsname
    \unless\ifcsname xeCJK@\xeCJK@bboxname @lspace@#1\endcsname
      {\xeCJK@setfont\xeCJK@setpunctbounds{#1}}
    \fi
    \xeCJK@dokerningtrue
    \ifnum\xeCJK@punctstyle=\xeCJK@ps@plain\relax
      \xeCJK@dokerningfalse
    \else
      \ifcsname xeCJK@specialpunct#1\endcsname
        \xeCJK@dokerningfalse
      \fi
    \fi
    \ifxeCJK@dokerning
      \xeCJK@cnta=\csname xeCJK@\xeCJK@bboxname @#2space@#1\endcsname\relax
      \xeCJK@cntc=\xeCJK@cnta
      \ifcase\xeCJK@punctstyle
          % hangmobanjiao
      \or % quanjiao
      \or % banjiao
        \advance\xeCJK@cntc -50\relax
      \or % kaiming
        \ifcsname xeCJK@kaiming#1\endcsname
          \advance\xeCJK@cntc -20\relax
        \else
          \advance\xeCJK@cntc -50\relax
        \fi
      \or % CCT
        \ifcsname xeCJK@kaiming#1\endcsname
          \advance\xeCJK@cntc -20\relax
        \else
          \advance\xeCJK@cntc -30\relax
        \fi
      \fi
      \xeCJK@cntd=\xeCJK@cntc
      \ifnum\xeCJK@cntc<0\relax
        \xeCJK@cntc=0\relax
      \fi
    \else
      \xeCJK@cnta=0\relax
      \xeCJK@cntc=0\relax
      \xeCJK@cntd=0\relax
    \fi
    \xeCJK@numtodim{\xeCJK@cnta}
    \expandafter\xdef\csname
      xeCJK\xeCJK@punctstyle\xeCJK@bboxname @#2rule@#1\endcsname{
        -\xeCJK@temp em}
    \xeCJK@numtodim{\xeCJK@cntc}
    \expandafter\xdef\csname
      xeCJK\xeCJK@punctstyle\xeCJK@bboxname @#2glue@#1\endcsname{
        \xeCJK@temp em}
    \expandafter\xdef\csname
      xeCJK\xeCJK@punctstyle\xeCJK@bboxname @#2oglue@#1\endcsname{
        \the\xeCJK@cntd}
  \fi}
\def\xeCJK@numtodim#1{
  \xeCJK@cnte=#1\relax
  \ifnum\the\xeCJK@cnte<100\relax
    \def\xeCJK@temp{0}
  \else
    \advance\xeCJK@cnte -100\relax
    \def\xeCJK@temp{1}
  \fi
  \ifnum\the\xeCJK@cnte<10
    \edef\xeCJK@temp{\xeCJK@temp.0\the\xeCJK@cnte}
  \else
    \edef\xeCJK@temp{\xeCJK@temp.\the\xeCJK@cnte}
  \fi}
\expandafter\def\csname xeCJK@kaiming．\endcsname{}
\expandafter\def\csname xeCJK@kaiming。\endcsname{}
\expandafter\def\csname xeCJK@kaiming？\endcsname{}
\expandafter\def\csname xeCJK@kaiming！\endcsname{}
\expandafter\def\csname xeCJK@specialpunct—\endcsname{}% U+2014
\expandafter\def\csname xeCJK@specialpunct─\endcsname{}% U+2500
\expandafter\def\csname xeCJK@specialpunct…\endcsname{}
\def\xeCJK@setkern#1#2{
  \unless\ifcsname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @kern#1#2\endcsname
    \xeCJK@cnta=0\relax
    \ifcsname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @roglue@#1\endcsname
      \advance\xeCJK@cnta\csname
        xeCJK\xeCJK@punctstyle\xeCJK@bboxname @roglue@#1\endcsname
    \fi
    \ifcsname xeCJK\xeCJK@punctstyle\xeCJK@bboxname @loglue@#2\endcsname
      \advance\xeCJK@cnta\csname xeCJK\xeCJK@punctstyle\xeCJK@bboxname
        @loglue@#2\endcsname
    \fi
    \relax
    \ifcase\xeCJK@punctstyle
        % hangmobanjiao
    \or % quanjiao
      \advance\xeCJK@cnta -50\relax
    \or % banjiao
      \advance\xeCJK@cnta -50\relax
    \or % kaiming
      \advance\xeCJK@cnta -50\relax
    \or % CCT
      \advance\xeCJK@cnta -50\relax
    \fi
    \ifnum\xeCJK@cnta<0\relax
      \xeCJK@cnta=0\relax
    \fi
    \xeCJK@numtodim{\xeCJK@cnta}
    \expandafter\xdef\csname
      xeCJK\xeCJK@punctstyle\xeCJK@bboxname @kern#1#2\endcsname{
        \xeCJK@temp em}
  \fi}
\def\xeCJKsetkern#1#2#3{
  \xdef\xeCJK@bboxname{\xeCJK@fontname}
  \expandafter\xdef\csname
      xeCJK\xeCJK@punctstyle\xeCJK@bboxname @kern#1#2\endcsname{#3}}
\def\punctstyle#1{
  \ifcsname xeCJK@ps@#1\endcsname
    \edef\xeCJK@punctstyle{\csname xeCJK@ps@#1\endcsname}
    \ifnum\xeCJK@punctstyle=\xeCJK@ps@plain\relax
      \xeCJKallowbreakbetweenpuncts
    \fi
  \else
    \PackageWarning{xeCJK}{Punctstyle #1\space is not defined.}
  \fi}
\def\xeCJK@ps@hangmobanjiao{0}
\def\xeCJK@ps@marginkerning{0}
\def\xeCJK@ps@quanjiao{1}
\def\xeCJK@ps@fullwidth{1}
\def\xeCJK@ps@banjiao{2}
\def\xeCJK@ps@halfwidth{2}
\def\xeCJK@ps@kaiming{3}
\def\xeCJK@ps@mixedwidth{3}
\def\xeCJK@ps@CCT{4}
\def\xeCJK@ps@plain{5}
\punctstyle{quanjiao}
\def\xeCJKplainchr{\punctstyle{plain}}
\def\xeCJK@sidespace{10}
\def\xeCJK@getglyphbounds#1{
  \xeCJK@cnta=\number\XeTeXglyphbounds #1 \xeCJK@gid
  \xeCJK@dima 1em\relax
  \xeCJK@cntb=\number\xeCJK@dima
  \multiply\xeCJK@cnta 100\relax
  \divide\xeCJK@cnta\xeCJK@cntb
  \advance\xeCJK@cnta -15\relax
  \edef\xeCJK@temp{\the\xeCJK@cnta}
  \ifnum\xeCJK@temp<0\relax
    \def\xeCJK@temp{0}
  \fi}
\def\xeCJK@setpunctbounds#1{
  \edef\xeCJK@gid{\the\XeTeXcharglyph`#1}
  \xeCJK@getglyphbounds{1}
  \expandafter\xdef\csname xeCJK@\xeCJK@bboxname @lspace@#1\endcsname{
    \xeCJK@temp}
  \xeCJK@getglyphbounds{3}
  \expandafter\xdef\csname xeCJK@\xeCJK@bboxname @rspace@#1\endcsname{
    \xeCJK@temp}
  \ifcsname xeCJK@specialpunct#1\endcsname
    \unless\ifx#1…
      \xeCJK@cnta=\number\XeTeXglyphbounds 1 \xeCJK@gid
      \advance\xeCJK@cnta\number\XeTeXglyphbounds 3 \xeCJK@gid
      \xeCJK@dima 1em\relax
      \xeCJK@cntb=\number\xeCJK@dima
      \multiply\xeCJK@cnta 100\relax
      \divide\xeCJK@cnta\xeCJK@cntb
      \advance\xeCJK@cnta 1\relax
      \ifnum\xeCJK@cnta>9
        \edef\xeCJK@temp{-0.\the\xeCJK@cnta em}
      \else
        \ifnum\xeCJK@cnta>1
          \edef\xeCJK@temp{-0.0\the\xeCJK@cnta em}
        \else
          \edef\xeCJK@temp{-0.01 em}
        \fi
      \fi
      \xeCJK@cnta=0
      \loop
        \global\expandafter\edef\csname xeCJK\the\xeCJK@cnta\xeCJK@bboxname
          @kern#1#1\endcsname{\xeCJK@temp}
        \advance \xeCJK@cnta 1\relax
      \ifnum\xeCJK@cnta<6\repeat
    \fi
  \fi}
\unless\ifcsname XeTeXglyphbounds\endcsname
  \PackageError{xeCJK}{\string\XeTeXglyphbounds \space not defined.^^J
    You have to update XeTeX  to the version 0.9995.0 or later}{}
\fi

\def\CJKsymbol#1{#1}
\def\CJKpunctsymbol#1{#1}

% For pure plain TeX
\def\xeCJK@setfont{\CJKfont}
\def\xeCJK@fontname{\fontname\CJKfont}

\def\CJKfont{\errmessage{xeCJK Error: You must define \noexpand\CJKfont first}}

\endlinechar=`\^^M
\resetatcatcode
\endinput
% vim:ft=plaintex
