%% pstricks.tex
%% COPYRIGHT 1993, 1994, 1999 by Timothy Van Zandt
%% COPYRIGHT 2000-2003 by Denis Girou.
%% Copyright 2004-     by  Herbert Voss <hvoss@tug.org>
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2003/12/01 or later.
%
% This work has the LPPL maintenance status "maintained".
% 
% This Current Maintainer of this work is Herbert Voss
%
\csname PSTricksLoaded\endcsname
\let\PSTricksLoaded\endinput  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% !! loading additional TeX packages see line 43,44 and 77ff
%% !! loading config file pstricks.con    line 445 
%% !! loading pro files                   line 458ff 
%% !! fileversion and date see            line 84f 
%% !! loaded arrow stuff                  line 1482
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
\edef\PstAtCode{\the\catcode`\@}
\catcode`\@=11\relax

\newif\if@pstLaTeX
\@pstLaTeXtrue
%
%\if@check@engine
  \ifx\c@lor@to@ps\@undefined
    \def\c@lor@to@ps{\PSTricks_Not_Configured_For_This_Format}%  message for a pdflatex run
  \fi
%\fi
\expandafter\ifx\csname @latexerr\endcsname\relax %	do we have TeX? then @latexerr isn't defined
  \@pstLaTeXfalse
  \input pstricks-tex.def
\fi

\let\ifpstUndefined\@ifundefined

%\catcode`\@=\PstAtCode\relax
\ifx\PSTXKeyLoaded\endinput\else\input pst-xkey.tex \fi
\ifx\PSTFPloaded\endinput\else\input pst-fp.tex\fi
%
%\catcode`\@=11\relax
\def\XKV@ch@ckch@ice#1#2#3{%  bugfix for xkeyval
  \def\XKV@tempa{#1}%
  \ifx\XKV@tempa\@nnil\let\XKV@tempa\@empty\else
    \def\XKV@tempa{\def#1{#2}}%
  \fi
%  \in@{,#2,}{,#3,}%
\begingroup\edef\x{\endgroup\noexpand\in@{,#2,}}\x{,#3,}%
%\expandafter\in@\expandafter{\expandafter,#2,}{,#3,}% --- hv 2012-04-27
  \ifin@
    \ifXKV@pl
      \XKV@addtomacro@n\XKV@tempa\@firstoftwo
    \else
      \XKV@addtomacro@n\XKV@tempa\@firstofone
    \fi
  \else
    \ifXKV@pl
      \XKV@addtomacro@n\XKV@tempa\@secondoftwo
    \else
      \XKV@toks{#2}%
      \XKV@err{value `\the\XKV@toks' is not allowed}%
      \XKV@addtomacro@n\XKV@tempa\@gobble
    \fi
  \fi
  \XKV@tempa
}
%
\def\ProvidesPackageRCS#1{\typeout{Loading #1}}%  needed for the pgf packages
%\@ifnextchar[\ProvidesPackageRCS@i{\ProvidesPackageRCS@i[] }}%$
%\def\ProvidesPackageRCS@i[#1]#2{}

\ifx\pgfkeysloaded\relax\else
  \if@pstLaTeX
    \RequirePackage{pgffor} % pgffor depends on pgfkeys
  \else % format is plaintex
    \input pgffor.tex
  \fi
\fi

\let\pgfforeach\foreach
%
\def\fileversion{3.20}
\def\filedate{2024/07/09}
\pst@addfams{pstricks}
%
%\define@boolkey[psset]{pstricks}[Pst@]{useURWfonts}[true]{}
%\psset{useURWfonts}
%
% stolen from latex.ltx to make it TeX compatible
\newcount\psLoopIndex
\long\def\@fornoop#1\@@#2#3{}
\long\def\@for#1:=#2\do#3{%
  \pst@cntm=0
  \expandafter\def\expandafter\@fortmp\expandafter{#2}%
  \ifx\@fortmp\@empty \else
    \expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}\fi}
%
\long\def\@forloop#1,#2,#3\@@#4#5{\def#4{#1}\ifx#4\@nnil \else
       #5\def#4{#2}\ifx#4\@nnil \else\global\advance\psLoopIndex by \@ne\relax
       #5\@iforloop #3\@@#4{#5}\fi\fi}
%
\long\def\@iforloop#1,#2\@@#3#4{\global\advance\psLoopIndex by \@ne\relax%
   \def#3{#1}\ifx #3\@nnil
     \expandafter\@fornoop \else
     #4\relax\expandafter\@iforloop\fi#2\@@#3{#4}}
%
\long\def\psforeach#1#2#3{%
  \global\psLoopIndex=0\relax
  \if$\ifnum9<1#2$\else\fi\psforeach@ii{#1}{#2}{#3}%
  \else                      \expandafter\psforeach@i#2,..,,..,\@nil{#1}{#3}\fi}
\long\def\psforeach@i#1,#2,..,#3,..,#4\@nil#5#6{% 
  \ifx\relax#3\relax\psforeach@ii{#5}{#1,#2}{#6}%
  \else\psforeach@iii{#5}{#1}{#2}{#3}{#6}\fi}
\long\def\psforeach@ii#1#2#3{%
  \begingroup
  \edef\reserved@a{#2}%
  \@for#1:=\reserved@a\do{#3}%
  \endgroup}
\long\def\psforeach@iii#1#2#3#4#5{%
  \pstFPsub\pst@tempA{#3}{#2}%
  \pst@dimm=\pst@tempA pt%
  \pstFPstripZeros{\pst@tempA}\pst@tempB%
  \def\pst@tempA{#2}%
  \def\pst@tempa{#2}%
  \pst@dimn=#4pt%
  \loop
    \pst@dimm=\pst@tempA pt
    \ifdim\pst@dimm<\pst@dimn
      \pstFPadd\pst@tempA{\pst@tempA}{\pst@tempB}%
      \pstFPstripZeros{\pst@tempA}\pst@tempA%
      \edef\pst@tempa{\pst@tempa,\pst@tempA}%
  \repeat%
  \psforeach@ii{#1}{\pst@tempa}{#5}}
%
\long\def\psForeach#1#2#3{%  without grouping the contents
  \global\psLoopIndex=0\relax%
  \if$\ifnum9<1#2$\else\fi\psforeach@ii{#1}{#2}{#3}%
  \else                   \expandafter\psForeach@i#2,..,,..,\@nil{#1}{#3}\fi}
\long\def\psForeach@i#1,#2,..,#3,..,#4\@nil#5#6{% 
  \ifx\relax#3\relax\psForeach@ii{#5}{#1,#2}{#6}%
  \else\psForeach@iii{#5}{#1}{#2}{#3}{#6}\fi%
}
\long\def\psForeach@ii#1#2#3{%
  \edef\reserved@a{#2}%
  \@for#1:=\reserved@a\do{#3}}
\long\def\psForeach@iii#1#2#3#4#5{%
  \pstFPsub\pst@tempA{#3}{#2}%
  \pst@dimm=\pst@tempA pt%
  \pstFPstripZeros{\pst@tempA}\pst@tempB%
  \def\pst@tempA{#2}%
  \def\pst@tempa{#2}%
  \pst@dimn=#4pt%
  \loop%
    \pst@dimm=\pst@tempA pt%
    \ifdim\pst@dimm<\pst@dimn%
      \pstFPadd\pst@tempA{\pst@tempA}{\pst@tempB}%
      \pstFPstripZeros{\pst@tempA}\pst@tempA
      \edef\pst@tempa{\pst@tempa,\pst@tempA}%
  \repeat%
  \psForeach@ii{#1}{\pst@tempa}{#5}
}
  
\def\psrecur@i#1{\csname ps@rn#1\psrecur@i} 
\long\def\ps@rnm#1{\endcsname{#1}#1\global\advance\psLoopIndex by \@ne}
\long\def\ps@rn#1{}
\def\psLoop#1{\global\psLoopIndex=0\relax%
  \csname ps@rn\expandafter\psrecur@i
  \romannumeral\number\number#1 000\endcsname\endcsname}

%
% hv 2007-10-16 to fix the bug in pst-node with \\[name=...]
% hv fix bug with empty fnodes in psmatrix
\def\ps@ifnextchar#1#2#3{%
  \let\reserved@d= #1%
  \def\reserved@a{#2}\def\reserved@b{#3}%
  \futurelet\@let@token\ps@ifnch}
\def\ps@ifnch{%
  \ifx\@let@token\reserved@d \let\reserved@b\reserved@a \fi
  \reserved@b
}
\def\pshskip#1{\vrule \@width\z@\nobreak \hskip #1\hskip \z@skip}
% end bugfix
\typeout{`PSTricks' v\fileversion\space\space <\filedate> (tvz,hv)}
\def\@pstrickserr#1#2{%
  \begingroup
  \newlinechar`\^^J
  \edef\pst@tempc{#2}%
  \expandafter\errhelp\expandafter{\pst@tempc}%
  \typeout{%
    PSTricks error. \space See User's Guide for further information.^^J
    \@spaces\@spaces\@spaces\@spaces
    Type \space H <return> \space for immediate help.}%
  \errmessage{#1}%
  \endgroup}
\def\@ehpa{%
  Your command was ignored. Default value substituted.^^J
  Type \space <return> \space to procede.}
\def\@ehpb{%
  Your command was ignored. Will recover best I can.^^J
  Type \space <return> \space to procede.}
\def\@ehpc{%
  You better fix this before proceding.^^J
  See the PSTricks User's Guide or ask your system administrator for help.^^J
  Type \space X <return> \space to quit.}
\def\@ehpd{%
  Not allowed optional argument.^^J
  Will proceed with the default setting.^^J
  Type \space X <return> \space to quit.}
\def\pst@misplaced#1{\@pstrickserr{Misplaced \string#1 command}\@ehpb}
\newdimen\pst@dima
\newdimen\pst@dimb
\newdimen\pst@dimc
\newdimen\pst@dimd
\newdimen\pst@dimg
\newdimen\pst@dimh
\newdimen\pst@dimm
\newdimen\pst@dimn
\newdimen\pst@dimo
\newdimen\pst@dimp
\chardef\f@ur=4
%
\newbox\pst@hbox
\newbox\pst@ibox
\newbox\pst@boxg
\newcount\pst@cnta
\newcount\pst@cntb
\newcount\pst@cntc
\newcount\pst@cntd
\newcount\pst@cntg
\newcount\pst@cnth
\newcount\pst@cntm
\newcount\pst@cntn
\newcount\pst@cnto
\newcount\pst@cntp
\newcount\@zero\@zero=0\relax
%
\newif\ifPst@SpecialLength
\Pst@SpecialLengthfalse
%
\newif\if@pst
\newtoks\pst@toks
\newif\if@star
\def\pst@ifstar#1{%
  \@ifnextchar*{\@startrue\def\ps@next*{#1}\ps@next}{\@starfalse#1}}
%
\def\pst@expandafter#1#2{%
  \def\ps@next{#1}%
  \edef\@tempa{#2}%
  \ifx\@tempa\@empty
    \@pstrickserr{Unexpected empty argument!}\@ehpb
    \def\@tempa{\@empty}%
  \fi
  \expandafter\ps@next\@tempa}
%
\def\pst@dimtonum#1#2{\edef#2{\pst@@dimtonum#1}}
\def\pst@@dimtonum#1{\expandafter\pst@@@dimtonum\the#1}
{\catcode`\p=12 \catcode`\t=12 \global\@namedef{pst@@@dimtonum}#1pt{#1}}
%
\def\pst@getdimdim#1 #2 #3\@nil{%
  \def\pst@tempA{#2}%
  \ifx\pst@tempA\@empty
    \pssetlength\pst@dimn{#1}%
    \pst@dimm=\z@%
  \else%
    \pssetlength\pst@dimm{#1}%
    \pssetlength\pst@dimn{#2}%
  \fi%
}
\def\pst@getxdimdim#1 #2 #3\@nil{%
  \def\pst@tempA{#2}%
  \ifx\pst@tempA\@empty
    \pssetxlength\pst@dimn{#1}%
    \pst@dimm=\z@
  \else%
    \pssetxlength\pst@dimm{#1}%
    \pssetxlength\pst@dimn{#2}%
  \fi%
}
\def\pst@getydimdim#1 #2 #3\@nil{%
  \def\pst@tempA{#2}%
  \ifx\pst@tempA\@empty
    \pssetylength\pst@dimn{#1}%
    \pst@dimm=\z@%
  \else
    \pssetylength\pst@dimm{#1}%
    \pssetylength\pst@dimn{#2}%
  \fi}
%
% A modulo macro for integer values
% \pst@mod{34}{6}\value ==> \value is 4
%
\def\pst@mod#1#2#3{%
  \begingroup%
  \pst@cntm=#1\pst@cntn=#2\relax%
  \pst@cnto=\pst@cntm%
  \divide\pst@cntm by \pst@cntn%
  \multiply\pst@cntn by \pst@cntm%
  \advance\pst@cnto by -\pst@cntn%
  \edef\value{\endgroup\def\noexpand#3{\number\pst@cnto}}\value%
}
\def\pst@max#1#2#3{%
  \begingroup%
  \pst@cntm=#1\pst@cntn=#2\relax%
  \ifnum\pst@cntm<\pst@cntn\pst@cntm=\pst@cntn\fi
  \global#3=\the\pst@cntm%
  \endgroup%
}
\def\pst@maxdim#1#2#3{%
  \begingroup%
  \pst@dimm=#1\pst@dimn=#2\relax%
  \ifdim\pst@dimm<\pst@dimn\pst@dimm=\pst@dimn\fi
  \global#3=\the\pst@dimm%
  \endgroup%
}
\def\pst@mindim#1#2#3{%
  \begingroup%
  \pst@dimm=#1\pst@dimn=#2\relax%
  \ifdim\pst@dimm>\pst@dimn\pst@dimm=\pst@dimn\fi
  \global#3=\the\pst@dimm%
  \endgroup%
}
\def\pst@abs#1#2{%
  \begingroup%
  \pst@cntm=#1\relax%
  \ifnum\pst@cntm<\z@\pst@cntm=-\pst@cntm\fi%
  \global#2=\the\pst@cntm
  \endgroup%
}
\def\pst@absdim#1#2{%
  \begingroup%
  \pst@dimm=#1\relax%
  \ifdim\pst@dimm<\z@\pst@dimm=-\pst@dimm\fi%
  \global#2=\the\pst@dimm%
  \endgroup%
}
%
\def\pst@pyth#1#2#3{% from pst-3d
  \begingroup
    \pst@dima=#1\relax
    \ifnum\pst@dima<\z@ \pst@dima=-\pst@dima\fi% dima=abs(x)
    \pst@dimb=#2\relax
    \ifnum\pst@dimb<\z@ \pst@dimb=-\pst@dimb\fi% dimb=abs(y)
    \advance\pst@dimb\pst@dima         % dimb=s=abs(x)+abs(y)
    \ifnum\pst@dimb=\z@
      \global\pst@dimg=\z@             % dimg=z=sqrt(x^2+y^2)
    \else
      \multiply\pst@dima 8\relax              % dima= 8abs(x)
      \pst@@divide\pst@dima\pst@dimb     % dimg =8t=8abs(x)/s
      \advance\pst@dimg -4pt            % dimg = 4tau = (8t-4)
      \multiply\pst@dimg 2
      \pst@dimtonum\pst@dimg\pst@tempa
      \pst@dima=\pst@tempa\pst@dimg           % dima=(8tau)^2
      \advance\pst@dima 64pt         % dima=u=[64+(8tau)^2]/2
      \divide\pst@dima 2\relax                      % =(8f)^2
      \pst@dimd=7pt                % initial guess at sqrt(u)
      \pst@@pyth\pst@@pyth\pst@@pyth            % dimd=sqrt(u)
      \pst@dimtonum\pst@dimd\pst@tempa
      \global\pst@dimg=\pst@tempa\pst@dimb
      \global\divide\pst@dimg 8             % dimg=z=(8f)*s/8
    \fi
  \endgroup
  #3=\pst@dimg}
%
\def\pst@@pyth{%                      dimd = g <-- (g + u/g)/2
  \pst@@divide\pst@dima\pst@dimd
  \advance\pst@dimd\pst@dimg
  \divide\pst@dimd 2\relax}
%
% ----- the old pst@pyth begin -----  did not use dimens
\def\pst@Pyth#1#2#3{\ifdim#1>#2\pst@@Pyth#1#2#3\else\pst@@Pyth#2#1#3\fi}
\def\pst@@Pyth#1#2#3{%
  \ifdim4#1>9#2\relax
    #3=#1\advance#3 .2122#2%
  \else
    #3=.8384#1\advance#3 .5758#2%
  \fi%
}
% ----- the old pst@pyth end -----
%
%------ new version \pst@divide ̣-------- by Michael Sharpe
\def\pst@divide#1#2#3{%
  \pst@@divide{#1}{#2}%
  \advance\pst@dimg \pst@cnta pt%
  \pst@dimtonum\pst@dimg{#3}%
}
\def\pst@@divide#1#2{%
  \pst@dimg=#1\relax%
  \pst@dimh=#2\relax%
  \pst@cnth=\pst@dimh%
  \pst@cntg=\pst@dimg%
  \pst@cnta=\pst@cntg%
  \divide\pst@cnta\pst@cnth%
  \advance\pst@dimg -\pst@cnta\pst@dimh%
  \pst@cntm=67108863\relax %2^26 -1
  \pst@@@divide\pst@@@divide\pst@@@divide\pst@@@divide%
  \divide\pst@dimg\pst@cnth%
}%
\def\pst@@@divide{%
  \ifnum%
    \ifnum\pst@dimg<\z@-\fi\pst@dimg<\pst@cntm%
      \multiply\pst@dimg\sixt@@n%
  \else%
    \divide\pst@cnth\sixt@@n%
  \fi%
}%
%
%-------------- the old version ----------
\iffalse
\def\pst@divide#1#2#3{%
  \pst@@divide{#1}{#2}%
  \pst@dimtonum\pst@dimg{#3}%
}
\def\pst@@divide#1#2{%
  \pst@dimg=#1\relax
  \pst@dimh=#2\relax
  \pst@cntg=\pst@dimh
  \pst@cnth=67108863
  \pst@@@divide\pst@@@divide\pst@@@divide\pst@@@divide
  \divide\pst@dimg\pst@cntg%
}
\def\pst@@@divide{%
  \ifnum
    \ifnum\pst@dimg<\z@-\fi\pst@dimg<\pst@cnth
      \multiply\pst@dimg\sixt@@n
    \else
      \divide\pst@cntg\sixt@@n
    \fi%
}
\fi
%-------------- end old version ---------------
%
\def\pst@configerr#1{\@pstrickserr{\string#1 not defined in pstricks.con}\@ehpc}

\newif\ifPSTlualatex

\ifdefined\directlua
  \ifdefined\app@cmd@latex % do we have auto-pst-pdf-lua loaded?
    \PSTlualatexfalse  % 
    \typeout{--- We are running lualatex or dvilualatex with auto-pst-pdf-lua ---}%
  \else  
    \ifnum\outputmode=1
      \PSTlualatextrue  % 
      \typeout{--- We are running lualatex with luapstricks ---}%
    \else
      \PSTlualatexfalse  % 
      \typeout{--- We are running dvilualatex without luapstricks ---}%
    \fi
  \fi
\else
  \typeout{--- We are running latex or xelatex ---}%
  \PSTlualatexfalse    
\fi
\ifPSTlualatex
  \directlua{require'luapstricks'}%
  \def\pstdriver{LuaLaTeX}%
  \def\pstverb{\luaPST}%
  \def\pstVerb{\luaPST direct}%
  \def\pstunit{1bp}%
  \def\pstverbscale{}%
  \def\pstnodescale{}%
  \def\pstheader{\luaPST immediate file}%
  \def\c@lor@to@ps#1\@@{\luaPSTcolor{#1}}
%  \AltClipMode   % now done after the definition of \AltClipMode, see below
  % Not sure if we need ``neg'' here or not
  % \def\pstrotate{CP CP translate 3 -1 roll neg rotate \tx@NET}
\else
  \def\pstVerb#1{\pst@configerr\pstVerb}%
  \def\pstverb#1{\pst@configerr\pstverb}%
  \def\pstverbscale{\pst@configerr\pstverbscale}%
  \def\pstrotate{\pst@configerr\pstrotate}%
  \def\pstheader#1{\pst@configerr\pstheader}%
  \def\pstdriver{\pst@configerr\pstdriver}%
  \@ifundefined{pstcustomize}%
    {\def\pstcustomize{\endinput\let\pstcustomize\relax}}{}%
  \input pstricks.con		% local config file
\fi
%
\newif\ifPSTricks
\PSTrickstrue
\def\PSTricksOff{%
  \def\pstheader##1{}%
  \def\pstverb##1{}%
  \def\pstVerb##1{}%
  \PSTricksfalse%
}
\@ifundefined{pst@def}{\def\pst@def#1<#2>{\@namedef{tx@#1}{#2 }}}{}
\@ifundefined{pst@ATH}{\def\pst@ATH<#1>{}}{}
%
\pstheader{pstricks.pro}
\pstheader{pst-algparser.pro}
\pstheader{pst-tools.pro}
%
\def\pst@dict{tx@Dict begin }
\def\pst@theheaders{pstricks.pro, pst-algparser.pro}
\def\pst@Verb#1{\pstVerb{\pst@dict #1 end}}
\def\tx@Atan{Atan }
\def\tx@Div{Div }
\def\tx@NET{NET }
\def\tx@Pyth{Pyth }
\def\tx@PtoC{PtoC }
\def\tx@PathLength@{PathLength@ }
\def\tx@PathLength{PathLength }
\pst@dimg=\pstunit\relax
\ifdim\pst@dimg=1bp
\def\pst@stp{.996264 dup scale}
\else
\edef\pst@stp{1 \pst@@dimtonum\pst@dimg\space div dup scale}
\fi
\def\tx@STP{STP }
\def\tx@STV{STV }
%
%--------------------------------------- PS stuff ---------------------------------
% on stack x y 
\pst@def{UserCoor}< \pst@number\psyunit div exch \pst@number\psxunit div exch >
\pst@def{ScreenCoor}< \pst@number\psyunit mul exch \pst@number\psxunit mul exch >
%--------------------------------------- PS stuff end -----------------------------
%
\def\pst@number#1{\pst@@dimtonum#1\space}
%
%-----------------------% hv 20100413
\def\pst@strip@dot#1{\expandafter\pst@strip@dot@i#1..\@nil}
\def\pst@strip@dot@i#1.#2.#3\@nil{%
  \ifnum1#2>10\relax #1.#2\else#1\fi}
%-----------------------% hv 20100413
\def\pst@checknum#1#2{%
  \edef\ps@next{#1}%
  \ifx\ps@next\@empty
    \let\pst@num\z@
  \else
    \expandafter\pst@@checknum\ps@next..\@nil
  \fi
  \ifcase\pst@num\relax
    \@pstrickserr{Bad number: `#1'. 0 substituted.}\@ehpa
    \def#2{0 }%
  \or%              1
    \edef#2{\ifnum\pst@num=\tw@-\fi\the\pst@cntg.%
      \expandafter\@gobble\the\pst@cnth\space}%
  \or%              2
    \edef#2{\ifnum\pst@num=\tw@-\fi\the\pst@cntg.%
      \expandafter\@gobble\the\pst@cnth\space}%
  \or%              3
    \edef#2{\pst@tempA\space}%
  \fi}
\def\pst@@checknum{%
  \@ifnextchar-%
  {\let\pst@num\tw@\expandafter\pst@@@checknum\@gobble}%
  {\@ifnextchar !%
    {\def\pst@num{3}\pst@@@@@checknum}
    {\let\pst@num\@ne\pst@@@checknum}}%
}
\def\pst@@@checknum#1.#2.#3\@nil{%
\afterassignment\pst@@@@checknum\pst@cntg=0#1\relax\@nil%
\afterassignment\pst@@@@checknum\pst@cnth=1#2\relax\@nil}
\def\pst@@@@checknum#1\relax\@nil{\ifx\@nil#1\@nil\else\let\pst@num\z@\fi}
%
\def\pst@@@@@checknum#1#2.#3\@nil{\def\pst@tempA{#2}}% PostScript Notation with !<code>
%
\def\pst@getnumii#1 #2 #3\@nil{%
  \pst@checknum{#1}\pst@tempg%
  \ifx\relax#2\relax\let\pst@temph\pst@tempg\else\pst@checknum{#2}\pst@temph\fi}
\def\pst@getnumiii#1 #2 #3 #4\@nil{%
\pst@checknum{#1}\pst@tempg%
\pst@checknum{#2}\pst@temph%
\pst@checknum{#3}\pst@tempi}
\def\pst@getnumiv#1 #2 #3 #4 #5\@nil{%
\pst@checknum{#1}\pst@tempg%
\pst@checknum{#2}\pst@temph%
\pst@checknum{#3}\pst@tempi%
\pst@checknum{#4}\pst@tempj}
%
\def\pst@getdimnum#1 #2 #3\@nil{%
  \pssetlength\pst@dimg{#1}%
  \pst@checknum{#2}\pst@tempg%
}
\def\pst@getscale#1#2{%	read and check a scale input x [y]
  \edef\pst@tempg{#1}%
  \ifx\pst@tempg\@none
    \def#2{}%
  \else
    \pst@expandafter\pst@getnumii{#1 #1} {} {} {}\@nil
    \ifdim\pst@tempg\p@=\z@
      \@pstrickserr{Bad scaling argument `#1'}\@ehpa
      \def#2{}%
    \else
      \ifdim\pst@temph\p@=\z@
        \@pstrickserr{Bad scaling argument `#1'}\@ehpa
        \def#2{}%
      \else
        \edef#2{\pst@tempg\space \pst@temph\space scale }%
      \fi
    \fi
  \fi%
}
\def\pst@getint#1#2{%	read and check an integer
  \pst@cntg=#1\relax
  \edef#2{\the\pst@cntg\space}%
}
\begingroup
\catcode`\{=12
\catcode`\}=12
\catcode`\[=1
\catcode`\]=2
\gdef\pslbrace[{ ]
\gdef\psrbrace[} ]
\endgroup
%
%
\input pstricks-color
%
%
\def\pst@grestore{
  currentpoint
  matrix currentmatrix
  currentfont
  grestore
  setfont
  setmatrix
  moveto
}
\define@boolkey[psset]{pstricks}[Pst@]{draft}[true]{}
\define@key[psset]{pstricks}{bgcolor}{\def\pst@bgcolor{#1}}% background for pspicture
\psset[pstricks]{bgcolor={},draft=false}% \pst@bgcolor is \@empty

\define@key[psset]{pstricks}{style}{%
  \@ifundefined{pscs@#1}%
    {\@pstrickserr{Custom style `#1' undefined}\@ehpa}%
    {\@nameuse{pscs@#1}}%
}
\def\newpsstyle{\@ifnextchar[\newpsstyle@ii{\newpsstyle@ii[]}}%% hv 2016-12-23
%
%\def\newpsstyle@i#1#2{\@namedef{pscs@#1}{%
%  \def\pst@tempA{#2}%
%  \ifx\pst@tempA\@empty\else\psset{#2}\fi}}
%
\def\newpsstyle@ii[#1]#2#3{%
  \@namedef{pscs@#2}{\if$#1$\psset{#3}\else\psset[#1]{#3}\fi}}%% end
%
\def\addto@psstyle#1#2{%
    \pst@toks=\expandafter{#1#2}%
    \edef#1{\the\pst@toks}}
\def\addtopsstyle#1#2{%
  \def\pst@tempA{#2}%
  \ifx\pst@tempA\@empty\else
    \@ifundefined{pscs@#1}%
      {\newpsstyle{#1}{#2}}%
      {\expandafter\addto@psstyle\csname pscs@#1\endcsname{\psset{#2}}}%
  \fi}
%------------ hv 1.16 end -------------------
%
\def\@none{none}
%
\newdimen\psunit \psunit 1cm
\newdimen\psxunit \psxunit 1cm
\newdimen\psyunit \psyunit 1cm
\let\psrunit\psunit
%
\def\pstunit@off{\let\@psunit\ignorespaces\ignorespaces}
%
\def\pssetlength#1#2{%
  \let\@psunit\psunit
  \afterassignment\pstunit@off
  #1 #2\@psunit%
}
\def\psaddtolength#1#2{%
  \let\@psunit\psunit
  \afterassignment\pstunit@off
  \advance#1 #2\@psunit%
}
\def\pssetxlength#1#2{%
  \let\@psunit\psxunit
  \ifpst@useCalc
    \edef\@@temp{\pscalculate{#2}}%
    \afterassignment\pstunit@off
      #1 \@@temp\@psunit
  \else
    \afterassignment\pstunit@off
    #1 #2\@psunit
  \fi
}
\def\pssetylength#1#2{%
  \let\@psunit\psyunit
  \ifpst@useCalc
    \edef\@@temp{\pscalculate{#2}}%
    \afterassignment\pstunit@off
    #1 \@@temp\@psunit
  \else
    \afterassignment\pstunit@off
    #1 #2\@psunit
  \fi
}
\define@key[psset]{pstricks}{unit}[1cm]{%
  \pssetlength\psunit{#1}%
  \psxunit=\psunit%
  \psyunit=\psunit%
}
\define@key[psset]{pstricks}{runit}[1cm]{\pssetlength\psrunit{#1}}
\define@key[psset]{pstricks}{xunit}[1cm]{\pssetxlength\psxunit{#1}}
\define@key[psset]{pstricks}{yunit}[1cm]{\pssetylength\psyunit{#1}}
%
\define@key[psset]{pstricks}{PstDebug}[0]{\pst@getint{#1}\Pst@Debug}% hv 2004-06-22
\psset[pstricks]{PstDebug=0}
\def\psDEBUG{\@ifnextchar[\psDEBUG@i{\psDEBUG@i[PSTricks]}}%
\def\psDEBUG@i[#1]#2{\ifnum\Pst@Debug>0 \expandafter\typeout{<#1>: #2}\fi}%
%
\def\pst@getlength#1#2{%
  \pssetlength\pst@dimg{#1}%
  \edef#2{\pst@number\pst@dimg}%
}
\def\pst@@getlength#1#2{%
  \pssetlength\pst@dimg{#1}%
  \edef#2{\number\pst@dimg sp}%
}
\def\pst@getcoor#1#2{\pst@@getcoor{#1}\let#2\pst@coor}
\def\pst@coor{0 0 }
%
\def\pst@getcoors#1#2{%
  \def\pst@aftercoors{\addto@pscode{#1 \pst@coors }#2}%
  \def\pst@coors{}%
  \pst@@getcoors
}
\def\pst@@getcoors(#1){%
  \pst@@getcoor{#1}%
  \edef\pst@coors{\pst@coor\pst@coors}%
  \@ifnextchar({\pst@@getcoors}{\pst@aftercoors}%
}
%
\newcount\pst@C@@rType% 0: default cartesian coordinates and angles
%
\def\pst@getangle#1#2{\pst@@getangle{#1}\let#2\pst@angle}
\def\pst@angle{0 }
%
\def\cartesian@coor#1,#2,#3\@nil{%
  \pssetxlength\pst@dimg{#1}%
  \pssetylength\pst@dimh{#2}%
  \edef\pst@coor{\pst@number\pst@dimg \pst@number\pst@dimh}%
}
\def\NormalCoor{%
  \def\pst@@getcoor##1{\pst@expandafter\cartesian@coor{##1},\relax,\@nil}%
  \def\pstCheckCoorType##1{\global\pst@C@@rType=0}%
  \Pst@SpecialLengthfalse
  \def\pssetlength##1##2{%
    \let\@psunit\psunit
    \afterassignment\pstunit@off
    ##1 ##2\@psunit%
  }%
  \def\pst@@getangle##1{%
    \pst@checknum{##1}\pst@angle%
    \edef\pst@angle{\pst@angle \pst@angleunit}%
  }%
  \def\psput@##1{\pst@@getcoor{##1}\leavevmode\psput@cartesian}%
}
%\NormalCoor% set to normal read of coors, angles and lengths
%
\def\degrees{\@ifnextchar[{\@degrees}{\def\pst@angleunit{}}}
\def\@degrees[#1]{%
  \pst@checknum{#1}\pst@tempg
  \edef\pst@angleunit{360 \pst@tempg div mul }%
  \pstVerb{tx@Dict begin startGlobal /pst@angleunit {\pst@angleunit} def endGlobal end}%
  \ignorespaces}
%
\def\radians{\def\pst@angleunit{57.2956 mul }%
  \pstVerb{tx@Dict begin startGlobal /pst@angleunit {\pst@angleunit} def endGlobal end}}%
\def\pst@angleunit{}%
%
\def\SpecialCoor{%
  \def\pst@@getcoor##1{%
    \begingroup%
      \pst@activecoor
      \xdef\pst@tempg{##1}%
    \endgroup
    \expandafter\special@coor\pst@tempg||\@nil}%
  \def\pstCheckCoorType##1{%
    \begingroup
      \pst@activecoor
      \xdef\pst@tempg{##1}%
    \endgroup
    \psDEBUG[pstCheckCoorType]{:Checking coor \pst@tempg:}%
    \expandafter\pst@CheckCoorType\pst@tempg||\@nil%
    \psDEBUG[pstCheckCoorType]{::Coor type=\the\pst@C@@rType::}%
  }%
  \def\pssetlength##1##2{%
    \begingroup%
      \pst@activecoor%
      \xdef\pst@tempg{##2}%
    \endgroup%
    \expandafter\special@length\pst@tempg\@nil{##1}%
  \ignorespaces}%
  \def\pst@@getangle##1{%
    \begingroup%
      \pst@activecoor%
      \xdef\pst@tempg{##1}%
    \endgroup%
    \expandafter\special@angle\pst@tempg\@empty)\@nil%
  }%
  \def\psput@##1{\pst@@getcoor{##1}\leavevmode\psput@special}%
}
\SpecialCoor% set to special read of coors, angles and lengths
%
\define@key[psset]{}{precode}{\def\pst@prepscode{#1 }}
\define@key[psset]{}{postcode}{\def\pst@postpscode{#1 }}
\psset{precode={},postcode={}}% For use in other packages
%
%
\begingroup
\catcode`\|=13
\catcode`\;=13
\catcode`\!=13
\catcode`\*=13
\catcode`\>=13
\catcode`\+=13
\gdef\pst@activecoor{%
  \def|{\string|}%
  \def;{\string;}%
  \def!{\string!}%
  \def*{\string*}%			algebraic expression hv 2007-11-17
  \def>{\string>}%
  \def+{\string+}%			pure algebaric 2013-04-23
}
\endgroup
% \pst@C@@rType = 0 cartesian (x,y)
%               = 1 polar     (r;phi)
%               = 2 PS        (! x y)
%               = 3 mixed     ((x,y)|(x,y))
%               = 4 algebraic (*x f(x))   x in PostScript notation
%               = 5 node      (A)
%               = 6 special node ([...]A)
%               = 7 node      (>A)
%               = 8 algebraic (+x,f(x))   _both_ algebraic
\def\pst@CheckCoorType#1|#2|#3\@nil{%
  \ifx#3|\relax 
    \global\pst@C@@rType=3\relax
  \else 
    \expandafter\pst@@CheckCoorType#1;;\@nil%
  \fi}
%
\def\pst@@CheckCoorType#1#2;#3;#4\@nil{%
  \ifx#1>\relax%			node with special rotation for \uput
    \global\pst@C@@rType=7
  \else
    \ifcat#1a\relax%			node names should start with a letter
      \global\pst@C@@rType=5
    \else
      \ifx#1[\relax%			special node coor: [..]A
        \global\pst@C@@rType=6
      \else
        \ifx#1!\relax%			PostScript code: x y
          \global\pst@C@@rType=2
        \else
          \ifx#1*\relax%			algebraic PostScript code: x f(x)
            \global\pst@C@@rType=4
          \else
            \ifx#1+\relax%			algebraic algebraic: x, f(x)
              \global\pst@C@@rType=8
  	    \else
              \ifx#4;\relax%		polar coordinates
                \global\pst@C@@rType=1
              \else
                \global\pst@C@@rType=0
              \fi
            \fi
          \fi
	\fi
      \fi
    \fi
  \fi
  \psDEBUG[pstCheckCoorType]{::\the\pst@C@@rType::}%
  }%
%
%
\def\special@coor#1|#2|#3\@nil{%
  \ifx#3|\relax
    \mixed@coor{#1}{#2}%
  \else
    \special@@coor#1;;\@nil%
  \fi}
%
\def\special@@coor#1{%
  \ifcat#1a\relax%			node names should start with a letter
    \def\ps@next{\node@coor#1}%
  \else
    \ifx#1[\relax%			special node coor: [..]A
      \def\ps@next{\Node@coor[}%
    \else
      \ifx#1>\relax%			PostScript code: x y
        \def\ps@next{\special@@@@coor}%
    \else
      \ifx#1!\relax%			PostScript code: x y
        \def\ps@next{\raw@coor}%
      \else
        \ifx#1*\relax%			PostScript/algebraic code: x f(x)
          \def\ps@next{\alg@coor}%
        \else
          \ifx#1+\relax%		algebraic code: x,f(x)
            \def\ps@next{\algalg@coor}%
	  \else%
            \def\ps@next{\special@@@coor#1}%
          \fi%
	\fi%
      \fi%
    \fi\fi%
  \fi%
  \ps@next%
}
\def\special@@@coor#1;#2;#3\@nil{%
  \ifx#3;\relax
    \polar@coor{#1}{#2}%
  \else
    \cartesian@coor#1,\relax,\@nil
  \fi%
}
\def\special@@@@coor#1#2;#3;#4\@nil{%
  \def\ps@A{A}\def\ps@B{#1}%
  \ifcat\ps@A\ps@B\relax%
    \node@coor#1#2;;\@nil%
  \else%
    \cartesian@coor#1#2,\relax,\@nil
  \fi%
}
\def\mixed@coor#1#2{%
  \begingroup%
% DG/SR modification begin - Oct. 27, 1997 - Patch 6
%\specialcoor@ii#1;;\@nil
%\let\pst@tempa\pst@coor
%\specialcoor@ii#2;;\@nil
    \special@@coor#1;;\@nil%
    \let\pst@tempa\pst@coor%
    \special@@coor#2;;\@nil%
% DG/SR modification end
    \xdef\pst@tempg{\pst@tempa pop \pst@coor exch pop }%
  \endgroup%
  \let\pst@coor\pst@tempg%
}
%
\def\polar@coor#1#2{%
%  \pssetlength\pst@dimg{#1}%
  \pssetlength\pst@dimb{#1}%	hv 2007-10-16  g is already used in get@@angle
  \pst@@getangle{#2}%
%  \edef\pst@coor{\pst@number\pst@dimg \pst@angle \tx@PtoC}%  dito
  \edef\pst@coor{\pst@number\pst@dimb \pst@angle \tx@PtoC }%
}
%
\def\raw@coor{\@ifnextchar !\raw@@coor\raw@@@coor}
\def\raw@@coor!#1;#2\@nil{%		PostScript code without using \tx@ScreenCoor 
  \edef\pst@coor{#1 }}
\def\raw@@@coor#1;#2\@nil{%		PostScript code 
  \edef\pst@coor{ #1 \tx@ScreenCoor }}
%
\def\alg@coor{\@ifnextchar*{\alg@@coor}{\alg@@@@coor}}
\def\alg@@coor*#1;#2\@nil{\expandafter\alg@@@coor#1\@nil}
\def\alg@@@coor#1 #2\@nil{%			algebraic PostScript code 
%\typeout{Nummer1: #1}%
%\typeout{Nummer2: #2}%
  \edef\pst@coor{%
    /Func (#1) AlgParser cvx def    
    /y #2 def
    y Func exch \tx@ScreenCoor }}
%
\def\alg@@@@coor#1;#2\@nil{\expandafter\alg@@@@@coor#1\@nil}
\def\alg@@@@@coor#1 #2\@nil{%			algebraic PostScript code 
  \edef\pst@coor{%
    /x #1 def
    /Func (#2) AlgParser cvx def 
    x Func \tx@ScreenCoor }}
%
\define@boolkey[psset]{}[Pst@]{exchange}[true]{}
\psset{exchange=false}
%
\def\algalg@coor#1;#2\@nil{\expandafter\algalg@@@coor#1\@nil}
\def\algalg@@@coor#1,#2\@nil{%			algebraic algebraic code 
  \edef\pst@coor{%
    /x (#1) AlgParser cvx def    
    /Func (#2) AlgParser cvx def    
    x Func \tx@ScreenCoor  }}
%
\def\node@coor#1\@nil{%
  \@pstrickserr{You must load `pst-node.tex' to use node coordinates.}\@ehps
  \def\pst@coor{0 0 }%
}
\def\Node@coor{\node@coor}
%
\def\special@angle#1#2)#3\@nil{%
  \ifx !#1\relax
    \edef\pst@angle{#2\space \pst@angleunit}%
  \else\ifx(#1\relax
    \pst@@getcoor{#2}%
    \edef\pst@angle{\pst@coor exch \tx@Atan}%
  \else
    \pst@checknum{#1#2}\pst@angle
    \edef\pst@angle{\pst@angle \pst@angleunit}%
  \fi\fi}
%
\def\special@length#1#2\@nil#3{%
  \ifx !#1\relax
    \edef\pst@SpecialLength{ #2 \pst@number\psunit mul }%
    \Pst@SpecialLengthtrue
  \else
    \let\@psunit\psunit
    \afterassignment\pstunit@off
    #3 #1#2\@psunit
    \Pst@SpecialLengthfalse
  \fi
}
%
\def\Cartesian{%
  \def\cartesian@coor##1,##2,##3\@nil{%
    \pssetxlength\pst@dimg{##1}%
    \pssetylength\pst@dimh{##2}%
    \edef\pst@coor{\pst@number\pst@dimg \pst@number\pst@dimh}%
  }%
  \@ifnextchar({\Cartesian@}{}%
}
\def\Cartesian@(#1,#2){%
  \pssetxlength\psxunit{#1}%
  \pssetylength\psyunit{#2}%
  \ignorespaces
}
\def\Polar{%
  \def\psput@cartesian{\psput@special}%
  \def\cartesian@coor##1,##2,##3\@nil{\polar@coor{##1}{##2}}%
}%
\define@key[psset]{pstricks}{origin}[]{%
  \pst@@getcoor{#1}%
  \edef\psk@origin{\pst@coor T }}
\def\psk@origin{}
%
\define@boolkey[psset]{pstricks}[Pst@]{algebraic}[true]{}
\psset{algebraic=false}
%
\define@boolkey[psset]{pstricks}[]{swapaxes}[true]{%	\if@pst
  \@nameuse{@pst#1}%
  \if@pst\def\psk@swapaxes{-90 rotate -1 1 scale }%
  \else\def\psk@swapaxes{}%
  \fi
}
\psset[pstricks]{swapaxes=false}
%
\define@boolkey[psset]{pstricks}[]{showpoints}[true]{}
\psset[pstricks]{showpoints=false}
%
\let\pst@setrepeatarrowsflag\relax
%
\define@key[psset]{pstricks}{border}[0pt]{\pst@getlength{#1}\psk@border \pst@setrepeatarrowsflag}
\psset[pstricks]{border=0pt}
\define@key[psset]{pstricks}{bordercolor}[white]{\pst@getcolor{#1}\psbordercolor}
\psset[pstricks]{bordercolor=white}
\define@boolkey[psset]{pstricks}[ps]{doubleline}[true]{\pst@setrepeatarrowsflag}
\psset[pstricks]{doubleline=false}
\define@key[psset]{pstricks}{doublesep}[1.25\pslinewidth]{\def\psdoublesep{#1}}
\psset[pstricks]{doublesep=1.25\pslinewidth}
\define@key[psset]{pstricks}{doublecolor}[white]{\pst@getcolor{#1}\psdoublecolor}
\psset[pstricks]{doublecolor=white}

\let\pst@setrepeatarrowsflag\relax
%
\define@boolkey[psset]{pstricks}[ps]{shadow}[true]{\pst@setrepeatarrowsflag}
\psset[pstricks]{shadow=false}
\define@key[psset]{pstricks}{shadowsize}[3pt]{\pst@getlength{#1}\psk@shadowsize}
\psset[pstricks]{shadowsize=3pt}
\define@key[psset]{pstricks}{shadowangle}[-45]{\pst@getangle{#1}\psk@shadowangle}
\psset[pstricks]{shadowangle=-45}
\define@key[psset]{pstricks}{shadowcolor}[darkgrey]{\pst@getcolor{#1}\psshadowcolor}
\psset[pstricks]{shadowcolor=darkgray}
%
\def\psls@none{}
\def\psls@solid{ \psk@linejoin\space setlinejoin \psk@linecap\space setlinecap stroke }
\def\psls@coloreddashed{ \psls@solid grestore gsave \pst@usecolor\psdashcolor \tx@setlinejoin \psls@dashed }
%
\newdimen\pslinewidth
\define@key[psset]{pstricks}{linewidth}[0.8pt]{\pssetlength\pslinewidth{#1}}
\psset[pstricks]{linewidth=.8pt}
\define@key[psset]{pstricks}{linecolor}[black]{\pst@getcolor{#1}\pslinecolor}
\psset[pstricks]{linecolor=black}
\define@key[psset]{pstricks}{kitecolor}[red]{\pst@getcolor{#1}\ps@kitecolor}
\define@key[psset]{pstricks}{dartcolor}[blue]{\pst@getcolor{#1}\ps@dartcolor}
\psset[pstricks]{kitecolor,dartcolor}
%
\newif\ifPst@coloreddashed
\define@key[psset]{pstricks}{dashcolor}[white]{%
  \ifx\relax#1\relax\Pst@coloreddashedfalse%
  \else\Pst@coloreddashedtrue\pst@getcolor{#1}\psdashcolor
  \fi}
\psset{dashcolor=\relax}
%\define@key[psset]{pstricks}{linecap}[0]{\pst@getint{#1}\psk@linecap}%	hv 2007-12-01
%\psset[pstricks]{linecap=0}  >>>>>>>>>>>>> siehe unten
\define@key[psset]{pstricks}{linejoin}[0]{\pst@getint{#1}\psk@linejoin}%	hv 2007-10-13
\psset[pstricks]{linejoin=0}
\def\tx@setlinejoin{\psk@linejoin\space setlinejoin }%	hv 2007-10-13
%
\def\pst@missing{%
  \z@
  \@pstrickserr{Missing number or dimension. 0 substituted}\@ehpa}
%
%%------------------- begin patch 15 HV 2004-05-15 -------------
\def\pst@empty{\z@}

\define@key[psset]{pstricks}{dash}[5pt 3pt 0pt 0pt]{%	defined in pstricks.tex
  \pst@expandafter\psset@@dash{#1}\@nil}% Error handling for empty argument.
\define@key[psset]{pstricks}{maxdashes}[11]{\def\psk@maxdashes{#1}}
\psset[pstricks]{maxdashes=11}
%
\def\psset@@dash#1\@nil{%
 \def\psk@dash{}%
 \pst@cntm0
 \def\next##1 ##2\relax{%
   \expandafter\ifnum\psk@maxdashes>\pst@cntm\relax  % 04-08-07
     \edef\@tempa{##1}%
     \ifx\@tempa\@empty\else% gobble leading spaces
       \pssetlength\pst@dimc{##1}%
       \advance\pst@cntm by 1
       \edef\psk@dash{\psk@dash\space\pst@number\pst@dimc}%
     \fi%
     \edef\@tempa{##2}%
     \ifx\@tempa\@empty\else% detect end
       \ifx\@tempa\space\else% gobble trailing spaces
         \next##2\relax%
     \fi\fi%
   \else% 04-08-07
     \@pstrickserr{Number of dashes > \psk@maxdashes. Increasing 
        'maxdashes' might work.}\@ehpa% 04-08-07
   \fi% 04-08-07
 }%
 \expandafter\next#1 \relax}
\psset[pstricks]{dash=5pt 3pt 0pt 0pt}% black white black white 
%%------------------- end patch 15 HV 2004-05-15 -------------
\define@boolkey[psset]{pstricks}[ps]{dashadjust}[true]{}
\psset[pstricks]{dashadjust}
\def\tx@DashLine{DashLine }
%
\def\psls@dashed{
  \ifPst@coloreddashed \psls@solid grestore gsave \pst@usecolor\psdashcolor \tx@setlinejoin \fi
  \psk@linecap\space setlinecap 
  \ifpsdashadjust
    [ \psk@dash ] \pst@linetype\space \tx@DashLine
  \else
    [ \psk@dash ] 0 setdash stroke
  \fi}
%% End patch TN; Date (YY-MM-DD): 04-07-17; 2nd part
%
\define@key[psset]{pstricks}{dotsep}[3pt]{\pst@getlength{#1}\psk@dotsep}
\psset[pstricks]{dotsep=3pt}
\def\tx@DotLine{DotLine }
\def\psls@dotted{
  \ifpsdashadjust
    \psk@dotsep \pst@linetype\space \tx@DotLine
  \else
    [ 0 \psk@dotsep CLW add ] 0 setdash 1 setlinecap stroke
  \fi
}
%
\define@key[psset]{pstricks}{linestyle}[solid]{%
  \@ifundefined{psls@#1}%
    {\@pstrickserr{Line style `#1' not defined}\@eha}%
    {\def\pslinestyle{#1}}}
\psset[pstricks]{linestyle=solid}
%
\define@key[psset]{pstricks}{linecap}[0]{%
  \def\psk@linecap{0}%
  \ifnum#1>-1
    \ifnum#1<3
      \pst@getint{#1}\psk@linecap%
  \fi\fi}
\psset{linecap=0}
%------------------------- Transparency modes ----------------------------
\pst@def{setTransparency}< \psk@opacityalpha .setopacityalpha >
\pst@def{setStrokeTransparency}< \psk@strokeopacityalpha revision 952 gt { .setstrokeconstantalpha }{ .setopacityalpha } ifelse >
\pst@def{setBlendmode}<
    \ifcase\psk@blendmode
      /Normal \or
      /Compatible \or
      /Screen \or
      /Multiply \or
      /HardLight \or
      /Darken \or
      /Lighten \or
      /Difference\or
      /ColorDodge\or
      /ColorBurn\or
      /SoftLight\or
      /Hue\or
      /Saturation\or
      /Luminosity\or
      /Overlay\or
      /Exclusion\or
      /Color
    \else
      /Normal 
    \fi
    .setblendmode \psk@shapealpha .setshapealpha >
%
%--------------------------------- hv 2007-09-09 begin ---------------------
% transparency needs a run through latex -> dvips -> ps2pdf14(!) 
%
\def\e@fill@inverse{oefill}
\define@key[psset]{pstricks}{fillcolor}[white]{%
  \ifx\psk@fillstylename\e@fill@inverse
    \pst@getcolor{#1}\psk@oefillcolor
    \pst@getcolor{white}\psfillcolor
  \else \pst@getcolor{white}\psk@oefillcolor
        \pst@getcolor{#1}\psfillcolor
  \fi}

\psset[pstricks]{fillcolor=white}
\define@key[psset]{pstricks}{strokeopacity}[1]{\pst@checknum{#1}\psk@strokeopacityalpha }% for lines
\psset[pstricks]{strokeopacity=1}
\define@key[psset]{pstricks}{opacity}[1]{\pst@checknum{#1}\psk@opacityalpha }% for filled areas 
\psset[pstricks]{opacity=1}
\define@key[psset]{pstricks}{shapealpha}[0.6]{\pst@checknum{#1}\psk@shapealpha }
\psset[pstricks]{shapealpha=0.6}
\define@key[psset]{pstricks}{blendmode}[0]{\pst@getint{#1}\psk@blendmode }% must be one of 
% /Normal     0
% /Compatible 1
% /Screen     2
% /Multiply   3
% /HardLight  4
\psset[pstricks]{blendmode=0}
\define@key[psset]{pstricks}{fsAngle}[137.50775]{\pst@getangle{#1}\pst@fsAngle }
\define@key[psset]{pstricks}{fsOrigin}[(0,0)]{%
  \pst@@getcoor{#1}\edef\pst@fsOrigin{\pst@coor T }}
\psset[pstricks]{fsOrigin={0,0},fsAngle=137.50775}
%
\def\tx@LineFill{LineFill }
\def\tx@DotFill{DotFill }
\def\tx@PenroseFill{PenroseFill }
\def\tx@PenroseFillA{PenroseFillA }
\def\tx@TruchetFill{TruchetFill }
%
\def\psfs@none{}
\def\psfs@solid{\pst@fill{\pst@usecolor\psfillcolor \tx@setTransparency fill }}
\def\psfs@eofill{\pst@fill{\pst@usecolor\psfillcolor \tx@setTransparency eofill}}
\def\psfs@oefill{\pst@fill{\pst@usecolor\psk@oefillcolor \tx@setTransparency fill }\psfs@eofill }
\def\psfs@shape{\pst@fill{\pst@usecolor\psfillcolor \tx@setBlendmode fill }}
\def\psfs@spiral{\pst@fill{\pst@fsOrigin \pst@usecolor\psfillcolor clip newpath
    0 .1 500 { dup dup sqrt 4 div 0 360 arc fill \pst@fsAngle rotate } for }}
%
\define@key[psset]{pstricks}{hatchwidth}[0.8pt]{\pst@getlength{#1}\psk@hatchwidth}
\psset[pstricks]{hatchwidth=.8pt}
\define@key[psset]{pstricks}{hatchsep}[4pt]{\pst@getlength{#1}\psk@hatchsep}
\psset[pstricks]{hatchsep=4pt}
\define@key[psset]{pstricks}{hatchcolor}[black]{\pst@getcolor{#1}\pshatchcolor}
\psset[pstricks]{hatchcolor=black}
\define@key[psset]{pstricks}{hatchangle}[45]{\pst@getangle{#1}\psk@hatchangle}
\psset[pstricks]{hatchangle=45}
\define@key[psset]{pstricks}{hatchsepinc}[0pt]{\pst@getlength{#1}\psk@hatchsepinc}
\define@key[psset]{pstricks}{hatchwidthinc}[0pt]{\pst@getlength{#1}\psk@hatchwidthinc}
\psset[pstricks]{hatchwidthinc=0pt,hatchsepinc=0pt}
%
\def\pst@linefill#1{
  /clipType { \ifx\relax#1\relax clip \else#1\fi} def 
  \psk@hatchangle rotate
  \psk@hatchwidth SLW
  \pst@usecolor\pshatchcolor
  \psk@hatchsep 
  \psk@hatchsepinc
  \psk@hatchwidthinc
  \tx@LineFill }
%
\def\psfs@vlines{\pst@fill{\pst@linefill{}}}
\def\psfs@eovlines{\pst@fill{\pst@linefill{eoclip}}}
\@namedef{psfs@vlines*}{\psfs@solid \psfs@vlines}
\@namedef{psfs@eovlines*}{\psfs@eofill \psfs@eovlines}
\def\psfs@hlines{\pst@fill{90 rotate \pst@linefill{}}}
\def\psfs@eohlines{\pst@fill{90 rotate \pst@linefill{eoclip}}}
\@namedef{psfs@hlines*}{\psfs@solid \psfs@hlines}
\@namedef{psfs@eohlines*}{\psfs@eofill \psfs@eohlines}
\def\psfs@crosshatch{\psfs@vlines \psfs@hlines}
\@namedef{psfs@crosshatch*}{\psfs@solid \psfs@vlines \psfs@hlines}
\@namedef{psfs@eocrosshatch*}{\psfs@eofill \psfs@eovlines \psfs@eohlines}
%
\define@key[psset]{pstricks}{psscale}[1]{%
  \def\psk@@psscale{#1}%   for use with \psscalebox
  \pst@checknum{#1}\psk@psscale}
\psset[pstricks]{psscale=1}
%
\def\pst@dotFill[#1]{%
  /clipType { \ifx\relax#1\relax clip \else #1 \fi } def 
  gsave
  \pst@number\pslinewidth SLW
  \pst@usecolor\pshatchcolor
%  /DotLineColor { \pst@usecolor\pslinecolor } def
  \psk@hatchsep 
  \psk@hatchwidth
  \tx@DotFill }

\def\psfs@dots{\pst@fill{ /SolidDot false def \pst@dotFill[] }}
\def\psfs@eodots{\pst@fill{ /SolidDot false def \pst@dotFill[eoclip] }}
\@namedef{psfs@dots*}{\pst@fill{ /SolidDot true def \pst@dotFill[] }}
\@namedef{psfs@eodots*}{\pst@fill{ /SolidDot true def \pst@dotFill[eoclip] }}
%
\def\pst@penroseFill{%
%  gsave					% restore in PenroseFill
  \pst@number\pslinewidth SLW
  \pst@usecolor\pshatchcolor
  \psk@psscale 
  \tx@PenroseFill }
\def\psfs@penrose{\pst@fill\pst@penroseFill}
\@namedef{psfs@penrose*}{\psfs@solid \psfs@penrose}
%
\def\pst@penroseFillA{%
%  gsave					% restore in PenroseFillA
  \pst@number\pslinewidth SLW
%  \pst@usecolor\pshatchcolor
%  on stack: scaling factor, border color, kite color, dart color
%  dup dup scale
%  /border_colour ED % 
%  /kite_colour ED %
%  /dart_colour 
  { \pst@usecolor\ps@dartcolor }
  { \pst@usecolor\ps@kitecolor }
  { \pst@usecolor\pshatchcolor }
  \psk@psscale 
  \tx@PenroseFillA }
\def\psfs@penroseA{\pst@fill\pst@penroseFillA}
\@namedef{psfs@penroseA*}{\psfs@solid \psfs@penroseA}
%
\def\pst@truchetFill{%
  gsave					% restore in PenroseFill
  \pst@number\pslinewidth SLW
  \pst@usecolor\pshatchcolor
  \psk@psscale 
  \tx@TruchetFill }
\def\psfs@truchet{ \pst@fill\pst@truchetFill }
\@namedef{psfs@truchet*}{\psfs@solid \psfs@truchet}
%
\define@key[psset]{pstricks}{fillstyle}[none]{%
  \def\psk@fillstylename{#1}%  needed for inverse eofill
  \edef\pst@tempg{#1}\def\pst@temph{none}%
  \ifx\pst@tempg\pst@temph
     \let\psk@fillstyle\relax
  \else
    \@ifundefined{psfs@#1}%
    {\@pstrickserr{Undefined fill style: `#1'}\@eha}%
    {\edef\psk@fillstyle{\expandafter\noexpand\csname psfs@#1\endcsname}}%
  \fi%
}
\define@key[psset]{pstricks}{addfillstyle}[]{%
  \@ifundefined{psfs@#1}%
    {\@pstrickserr{Undefined fill style: `#1'}\@eha}%
    {\edef\psk@fillstyle{%
      \expandafter\noexpand\psk@fillstyle
      \expandafter\noexpand\csname psfs@#1\endcsname}%
    }}
\psset[pstricks]{fillstyle=none}
%
%--------------------------- continous linewidth -------------------
\newdimen\psk@startLW
\newdimen\psk@endLW
\define@key[psset]{pstricks}{startLW}[\pslinewidth]{\pssetlength{\psk@startLW}{#1}}%
\define@key[psset]{pstricks}{endLW}[\pslinewidth]{\pssetlength{\psk@endLW}{#1}}%
\define@key[psset]{pstricks}{startWL}[380]{\pst@getint{#1}\psk@startWL}%
\define@key[psset]{pstricks}{endWL}[780]{\pst@getint{#1}\psk@endWL}%
\define@boolkey[psset]{pstricks}[Pst@]{variableLW}[true]{}
\define@boolkey[psset]{pstricks}[Pst@]{variableColor}[true]{}
\define@key[psset]{pstricks}{setflat}[0.1]{\pst@checknum{#1}\psk@setflat}%
\psset[pstricks]{startLW=\pslinewidth,endLW=\pslinewidth,variableColor=false,
  variableLW=false,startWL=380,endWL=770,setflat=0.1}
%
\def\pst@flattenpath{
  20 dict begin
  /Coors [] def
  /Cmds [] def
  /NoOfSteps 0 def
  /add2Values { Coors aload length 2 add array astore /Coors exch def } def
  /add6Values { Coors aload length 6 add array astore /Coors exch def } def
  /addmoveto { -1 Cmds aload length 1 add array astore /Cmds exch def } def
  /addlineto { 0 Cmds aload length 1 add array astore /Cmds exch def } def
  /addcurveto { 1 Cmds aload length 1 add array astore /Cmds exch def } def
  \psk@setflat\space setflat      % the value for the line snippets
  flattenpath                     % flatten the existing path into line segments
  { add2Values addmoveto}         % what to do with moveto
  { NoOfSteps 1 add /NoOfSteps ED add2Values addlineto}         % what to do with lineto 
  { NoOfSteps 1 add /NoOfSteps ED add6Values addcurveto}          % what to do with curveto (not needed here) 
  { }                             % nothing for closepath
  pathforall
%
  /dLW \pst@number\psk@endLW \pst@number\psk@startLW sub NoOfSteps div def % the step for the linewidth
  \ifPst@variableColor
    /dColor \psk@endWL\space \psk@startWL\space sub NoOfSteps div def      % same for color
  \fi
%%%  
  \pst@number\psk@startLW setlinewidth
  \tx@setlinejoin
  \psk@linecap\space setlinecap
  /lambda \psk@startWL def
  Cmds length /Ncmds ED    % number of the commands is the length of the array
  /CoorIndex 0 def
  Ncmds 1 sub -1 0 {
    % on stack is the loop index 
    Cmds exch get /cmdNo ED      % get command as nuber -1, 0, 1 | moveto, lineto, curveto
    cmdNo 0 eq { Coors CoorIndex 2 getinterval aload pop lineto CoorIndex 2 add /CoorIndex ED }
      { cmdNo 0 lt { Coors CoorIndex 2 getinterval aload pop moveto CoorIndex 2 add /CoorIndex ED }
        { Coors CoorIndex 6 getinterval aload pop curveto CoorIndex 6 add /CoorIndex ED } ifelse } ifelse  % else is curveto
    \ifPst@variableColor
      lambda dColor add dup /lambda ED 
      tx@addDict begin wavelengthToRGB Red Green Blue end setrgbcolor
    \else
      \pst@usecolor\pslinecolor
    \fi
    currentlinewidth dLW add setlinewidth
    CP /yCurr ED /xCurr ED
    stroke               % draw the line segment
    xCurr yCurr moveto   % go to the last point
  } for
  end
}
%
%--------------------------- A R R O W S ---------------------------

\input pstricks-arrows

%% ---------------------- end arrow part ----------------------
%
\def\tx@SD{ \tx@setTransparency SD }
\def\tx@EndDot{ EndDot }
%
\def\pst@par{}
\def\addto@par#1{%
  \ifx\pst@par\@empty
    \def\pst@par{#1}%
  \else
    \expandafter\def\expandafter\pst@par\expandafter{\pst@par,#1}%
  \fi%
}
\def\addbefore@par#1{%
  \ifx\pst@par\@empty
    \def\pst@par{#1}%
  \else
    \toks@{#1}%
    \pst@toks\expandafter{\pst@par}%
    \edef\pst@par{\the\toks@,\the\pst@toks}%
  \fi%
}
\def\use@par{%
  \ifx\pst@par\@empty\else
    \expandafter\@psset\pst@par,\@nil
    \def\pst@par{}%
  \fi
}
\def\use@keep@par{%			same as \use@par, but keeps the values
  \ifx\pst@par\@empty\else
    \expandafter\@psset\pst@par,\@nil
%    \def\pst@par{}%
  \fi}
%
\def\pst@object#1{%
  \def\pst@par{}%
  \pst@ifstar{%
    \@ifnextchar[{\pst@@object{#1}}{\@nameuse{#1@i}}}%
}
\def\pst@@object#1[#2]{%
  \def\pst@par{#2}%
  \@ifnextchar+{\@nameuse{#1@i}}{\@nameuse{#1@i}}%
}
\def\newpsobject#1#2#3{%
\@ifundefined{#2@i}%
{\@pstrickserr{Graphics object `#2' not defined}\@eha}{%
\@namedef{#1}{\pst@object{#1}}%
\@namedef{#1@i}{\addbefore@par{#3}\@nameuse{#2@i}}}%
\ignorespaces}
%
\def\begin@ClosedObj{%
  \leavevmode
  \pst@killglue
  \begingroup
  \use@par
  \solid@star
  \ifpsdoubleline\pst@setdoublesep\fi
  \pst@addarrowdef% DG addition
  \init@pscode}
%
\def\end@ClosedObj{%
  \ifpsshadow \pst@closedshadow \fi
  \ifdim\psk@border\p@>\z@ \pst@addborder \fi
  \psk@fillstyle
  \pst@stroke
  \ifpsdoubleline \pst@doublestroke \fi
  \ifshowpoints
% DG modification begin - Mar. 4, 1995
%\addto@pscode{Points aload length 2 div cvi /N ED \psdots@iii}%
  \pst@OpenShowPoints
% DG modification end
  \fi
  \use@pscode
  \endgroup
  \ignorespaces%
}
\def\begin@OpenObj{%
  \begin@ClosedObj
  \let\pst@linetype\pst@arrowtype
  \pst@addarrowdef
}
\def\begin@AltOpenObj{%
  \begin@ClosedObj
  \def\pst@repeatarrowsflag{\z@}%
  \def\pst@linetype{0}}
%
\def\end@OpenObj{%
  \ifpsshadow \pst@openshadow \fi
  \ifdim\psk@border\p@>\z@ \pst@addborder \fi
  \psk@fillstyle
  \pst@stroke
  \ifpsdoubleline \pst@doublestroke \fi
  \ifnum\pst@repeatarrowsflag>\z@ \pst@repeatarrows \fi
  \ifshowpoints \pst@OpenShowPoints \fi
  \use@pscode
  \endgroup
  \ignorespaces}
%
\def\begin@SpecialObj{%
  \leavevmode
  \pst@killglue
  \begingroup
  \use@par
  \init@pscode}
%
\def\end@SpecialObj{%
  \use@pscode
  \endgroup
  \ignorespaces}
%
\def\pst@code{}%
%
\def\init@pscode{%
  \addto@pscode{%
    \pst@number\pslinewidth SLW
    \pst@usecolor\pslinecolor}%
}
\def\addto@pscode#1{\xdef\pst@code{\pst@code#1\space}}
%
\def\use@pscode{%
  \pstverb{
    \pst@dict
    \tx@STP
    \pst@newpath
    \psk@origin
    \psk@swapaxes
    \pst@code
    end
  }%
  \gdef\pst@code{}%
}
\def\use@psCode{%
  \pstVerb{
    \pst@dict
    \tx@STP
    \pst@newpath
    \psk@origin
    \psk@swapaxes
    \pst@code
    end
  }%
  \gdef\pst@code{}%
}
\def\pst@newpath{newpath }
%
\def\pst@@killglue{\unskip\ifdim\lastskip>\z@\expandafter\pst@@killglue\fi}
\def\KillGlue{\let\pst@killglue\pst@@killglue}
\def\DontKillGlue{\let\pst@killglue\relax}
\DontKillGlue
%
\def\solid@star{%
  \if@star
    \pslinewidth=\z@
    \psdoublelinefalse
    \def\pslinestyle{none}%
    \def\psk@fillstyle{\psfs@solid}%
    \let\psfillcolor\pslinecolor
  \fi}
%
\def\pst@setdoublesep{%
\pst@getlength\psdoublesep\psdoublesep
\pslinewidth=2\pslinewidth
\advance\pslinewidth\psdoublesep\p@
\let\pst@setdoublesep\relax}
\def\tx@Shadow{Shadow }
\def\pst@closedshadow{%
  \addto@pscode{%
    gsave
    \psk@shadowsize \psk@shadowangle \tx@PtoC
    \tx@Shadow
    \pst@usecolor\psshadowcolor
    gsave fill grestore
    stroke
    grestore
    gsave
    \pst@usecolor\psfillcolor
    gsave fill grestore
    stroke
    grestore}}
%
\def\pst@openshadow{%
  \addto@pscode{%
    gsave
    \psk@shadowsize \psk@shadowangle \tx@PtoC
    \tx@Shadow
    \pst@usecolor\psshadowcolor
    \ifx\psk@fillstyle\relax\else
      gsave fill grestore
    \fi
    stroke}%
  \pst@repeatarrows%
  \addto@pscode{grestore}%
  \ifx\psk@fillstyle\relax\else
    \addto@pscode{%
      gsave
      \pst@usecolor\psfillcolor
      gsave fill grestore
      stroke
      grestore}%
  \fi}
%
\def\pst@addborder{%
  \addto@pscode{%
    gsave
    \psk@border 2 mul
    CLW add SLW
    \pst@usecolor\psbordercolor
    stroke
    grestore}}
%
\def\pst@stroke{%
  \ifx\pslinestyle\@none\else
    \addto@pscode{%
      gsave
      \pst@number\pslinewidth SLW
      \pst@usecolor\pslinecolor
      \tx@setStrokeTransparency % hv 2008-01-13
      \@nameuse{psls@\pslinestyle}
      grestore}%
  \fi}
%
\def\pst@fill#1{\addto@pscode{gsave #1 grestore}}%
%
\def\pst@doublestroke{%
    \addto@pscode{%
      gsave
      \psdoublesep SLW
      \pst@usecolor\psdoublecolor
      \tx@setStrokeTransparency % hv 2016-09-23
      stroke
      grestore
}}
%
\def\pst@OpenShowPoints{%
  \addto@pscode{%
    gsave
    \psk@dotsize
    \@nameuse{psds@\psk@dotstyle}
    newpath
    Points aload length 2 div 2 sub cvi /N ED
    N 0 ge
      { \ifx\psk@arrowA\@empty Dot \else pop pop \fi 
        N { Dot } repeat 
	\ifx\psk@arrowB\@empty Dot \else pop pop \fi }
      { N 2 mul { pop } repeat } ifelse
    grestore
}}
%
\newif\ifPst@custom\Pst@customfalse
\define@boolkey[psset]{pstricks}[Pst@]{noCurrentPoint}[true]{}
\psset[pstricks]{noCurrentPoint=false}
%
%
\def\pscustom{\pst@object{pscustom}}
\long\def\pscustom@i#1{%
  \begin@SpecialObj%
  \solid@star%
  \let\pst@ifcustom\iftrue%
  \Pst@customtrue%
  \let\begin@ClosedObj\begin@CustomObj%
  \let\end@ClosedObj\endgroup%
  \def\begin@OpenObj{\begin@CustomObj\pst@addarrowdef}%
  \let\end@OpenObj\endgroup%
  \let\begin@AltOpenObj\begin@CustomObj%
  \def\begin@SpecialObj{%
    \begingroup%
    \pst@misplaced{special graphics object}%
    \def\addto@pscode####1{}%
    \let\end@SpecialObj\endgroup}%
  \def\@multips(##1)(##2)##3##4{\pst@misplaced\multips}%
  \def\psclip##1{\pst@misplaced\psclip}%
  \def\pst@repeatarrowsflag{\z@}%
  \let\pst@setrepeatarrowsflag\relax%
  \showpointsfalse%
  \def\pst@linetype{\pslinetype}%
  \def\psk@liftpen{\z@}%
%  \psset{liftpen=0}%
  \def\pst@cp{/currentpoint load stopped pop }%
  \def\pst@oplineto{/lineto load stopped { moveto } if }%
  \def\pst@optcp##1##2{\ifnum##1=\z@\def##2{/currentpoint load stopped { 0 0 } if }\fi}%
  \let\caddto@pscode\addto@pscode%
  \def\cuse@par##1{{\use@par##1}}%
  \the\pst@customdefs%
  \setbox\pst@hbox=\hbox{#1}%
  \psk@fillstyle
  \pst@stroke
  \end@SpecialObj
  \let\pst@ifcustom\iffalse
  \ignorespaces
}
%
\let\pst@ifcustom\iffalse
%
\def\begin@CustomObj{%
  \begingroup%
  \use@par%
  \addto@pscode{
    \pst@number\pslinewidth SLW
    \pst@usecolor\pslinecolor
  }%
}
\def\pst@oplineto{moveto }
\def\pst@cp{}
\def\pst@optcp#1#2{}
\define@key[psset]{pstricks}{liftpen}[0]{%
  \ifPst@custom%
  \ifcase#1\relax%
    \def\psk@liftpen{\z@}%
    \def\pst@cp{/currentpoint load stopped pop }%
    \def\pst@oplineto{/lineto load stopped { moveto } if }%
  \or%
    \def\psk@liftpen{1}%
    \def\pst@cp{}%
    \def\pst@oplineto{/lineto load stopped { moveto } if }%
  \or%
    \def\psk@liftpen{2}%
    \def\pst@cp{}%
    \def\pst@oplineto{moveto }%
  \fi\fi%
}
\psset[pstricks]{liftpen=0}
\def\psk@liftpen{-1}
%
\define@key[psset]{pstricks}{linetype}[2]{%
  \pst@getint{#1}\pslinetype
  \ifnum\pst@cntg<-3
    \@pstrickserr{linetype must be greater than -3}\@ehpa
    \def\pslinetype{2}%
  \fi}
\psset[pstricks]{linetype=2}% otherwise there is a problem when using e.g.
%                     \psaxes[axesstyle=frame,linestyle=dashed]{->}(3,-2)
%
\def\caddto@pscode#1{%
    \@pstrickserr{Command can only be used in \string\pscustom}\@ehpa}
\let\cuse@par\caddto@pscode
%
\def\tx@MSave{%
     /msavematrx
         [ tx@Dict /msavematrx known % does msavematrix exists?
             { msavematrx aload pop } if
             CM % matrix currentmatrix
         ]
     def
%----------------- hv begin 2004-05-07 ------------- patch 15
    msavematrx
%----------------- hv end 2004-05-07 ------------- patch 15
}
\def\tx@MRestore{% a typo in pstricks with msavematrx
     tx@Dict /msavematrx known { length 0 gt } { false } ifelse
         { msavematrx aload pop setmatrix } if
}
%
\newtoks\pst@customdefs
\pst@customdefs{%
  \def\newpath{\addto@pscode{newpath}}%
  \def\reversepath{\addto@pscode{ reversepath }}%                      20131209  hv
  \def\moveto(#1){\pst@@getcoor{#1}\addto@pscode{\pst@coor moveto}}%
  \def\rmoveto(#1){\pst@@getcoor{#1}\addto@pscode{\pst@coor rmoveto}}%
  \def\closepath{\addto@pscode{closepath}}%
  \def\gsave{\begingroup\addto@pscode{gsave}}%
  \def\grestore{\endgroup\addto@pscode{grestore}}%
  \def\translate(#1){\pst@@getcoor{#1}\addto@pscode{\pst@coor translate}}%
  \def\rotate#1{\pst@@getangle{#1}\addto@pscode{\pst@angle rotate}}%
  \def\scale#1{\pst@getscale{#1}\pst@tempg\addto@pscode{\pst@tempg}}%
  \def\msave{\addto@pscode{\tx@MSave}}%
  \def\mrestore{\addto@pscode{\tx@MRestore}}%
  \def\swapaxes{\addto@pscode{-90 rotate -1 1 scale}}%
  \def\stroke{\def\pst@par{}\pst@object{stroke}}%
  \def\fill{\def\pst@par{}\pst@object{fill}}%
  \def\openshadow{\def\pst@par{}\pst@object{openshadow}}%
  \def\closedshadow{\def\pst@par{}\pst@object{closedshadow}}%
  \def\movepath(#1){\pst@@getcoor{#1}\addto@pscode{\pst@coor \tx@Shadow}}%
  \def\lineto{\pst@onecoor{lineto}}%
  \def\rlineto{\pst@onecoor{rlineto}}%
  \def\curveto{\pst@threecoor{curveto}}%
  \def\rcurveto{\pst@threecoor{rcurveto}}%
  \def\code#1{\addto@pscode{#1}}%
  \def\coor(#1){\pst@@getcoor{#1}\addto@pscode\pst@coor\@ifnextchar({\coor}{}}%
  \def\rcoor{\pst@getcoors{}{}}%
  \def\dim#1{\pssetlength\pst@dimg{#1}\addto@pscode{\pst@number\pst@dimg}}%
  \def\setcolor#1{%
    \@ifundefined{\string\color@#1}{}{\addto@pscode{\pst@usecolor{#1}}}}%  hv 1.14  2005-12-17
  \def\arrows#1{{\psset[pstricks]{arrows=#1}\pst@addarrowdef}}%
  \let\file\pst@rawfile%
} % END \pst@customdefs
%
\def\closedshadow@i{\cuse@par\pst@closedshadow}
\def\openshadow@i{\cuse@par\pst@openshadow}
\def\stroke@i{\cuse@par\pst@stroke}%
\def\fill@i{\cuse@par\psk@fillstyle}%
\def\pst@onecoor#1(#2){%
\pst@@getcoor{#2}%
\addto@pscode{\pst@coor #1}}
\def\pst@threecoor#1(#2)#3(#4)#5(#6){%
  \begingroup
    \pst@getcoor{#2}\pst@tempa
    \pst@getcoor{#4}\pst@tempb
% DG/SR modification begin - Aug.  4, 1999 - Patch 11
%\pst@getcoor{#6}\pst@tembc
    \pst@getcoor{#6}\pst@tempc
% DG/SR modification end
    \addto@pscode{\pst@tempa \pst@tempb \pst@tempc #1}%
  \endgroup}
%
\def\pst@rawfile#1{%
  \begingroup
  \def\do##1{\catcode`##1=12\relax}"
  \dospecials
  \catcode`\%=14
  \pst@@rawfile{#1}%
  \endgroup}
%
\def\pst@@rawfile#1{%
  \immediate\openin1 #1
  \ifeof1
    \@pstrickserr{File `#1' not found}\@ehpa
  \else
    \immediate\read1 to \pst@tempg
    \loop
      \ifeof1 \@pstfalse\else\@psttrue\fi
      \if@pst
      \addto@pscode\pst@tempg
      \immediate\read1 to \pst@tempg
    \repeat
  \fi
  \immediate\closein1\relax}
%
\def\tx@NArray{NArray }
\def\tx@Line{Line }
\def\tx@Arcto{Arcto }
\def\tx@CheckClosed{CheckClosed }
\def\tx@Polygon{Polygon }
\define@key[psset]{pstricks}{gangle}[0]{\pst@getangle{#1}\psk@gangle}
\define@boolkey[psset]{pstricks}[Pst@]{trueAngle}[true]{}
\psset[pstricks]{trueAngle=false,gangle=0}
%
\def\tx@Diamond{Diamond }
\def\psdiamond{\def\pst@par{}\pst@object{psdiamond}}
\def\psdiamond@i(#1){\@ifnextchar({\psdiamond@ii(#1)}{\psdiamond@ii(0,0)(#1)}}
\def\psdiamond@ii(#1)(#2){%
  \begin@ClosedObj
  \pst@getcoor{#1}\pst@tempa
  \pst@getcoor{#2}\pst@tempb
  \addto@pscode{%
    \psline@iii
    pop
    \psk@dimen
    \pst@tempb
    \psk@gangle
    \pst@tempa
    \tx@Diamond
  }%
  \def\pst@linetype{4}%
  \end@ClosedObj}
%
\def\tx@Triangle{Triangle }
\def\pstriangle{\def\pst@par{}\pst@object{pstriangle}}
\def\pstriangle@i(#1){\@ifnextchar({\pstriangle@ii(#1)}{\pstriangle@ii(0,0)(#1)}}
\def\pstriangle@ii(#1)(#2){%
  \begin@ClosedObj
  \pst@getcoor{#1}\pst@tempa%	the center of the baseline
  \pst@getcoor{#2}\pst@tempb%	the height of the triangle
  \addto@pscode{%
    \psline@iii
    pop			    %	no showpoints option
    \psk@dimen		    %	outer/inner/middle
    \pst@tempb
    \psk@gangle		    %	rotating angle
    \pst@tempa
    \tx@Triangle
  }%
  \def\pst@linetype{2}%
  \end@ClosedObj}
%
\def\tx@CCA{CCA }
\def\tx@CCA{CCA }
\def\tx@CC{CC }
\def\tx@IC{IC }
\def\tx@BOC{BOC }
\def\tx@NC{NC }
\def\tx@EOC{EOC }
\def\tx@BAC{BAC }
\def\tx@NAC{NAC }
\def\tx@EAC{EAC }
\def\tx@OpenCurve{OpenCurve }
\def\tx@AltCurve{AltCurve }
\def\tx@ClosedCurve{ClosedCurve }
%
\define@key[psset]{pstricks}{curvature}[1 0.1 0]{%
  \edef\pst@tempg{#1 }%
  \expandafter\psset@@curvature\pst@tempg * * * \@nil}
\def\psset@@curvature#1 #2 #3 #4\@nil{%
  \pst@checknum{#1}\pst@tempg
  \pst@checknum{#2}\pst@temph
  \pst@checknum{#3}\pst@tempi
  \edef\psk@curvature{\pst@tempg \pst@temph \pst@tempi}}
%
\psset[pstricks]{curvature=1 .1 0}
%
\def\pscurve{\pst@object{pscurve}}
\def\pscurve@i{%
  \pst@getarrows{%
    \begin@OpenObj
      \pst@getcoors[\pscurve@ii%
    }%
}
\def\pscurve@ii{%
  \addto@pscode{
    \ifPst@noCurrentPoint\else\pst@cp\fi		% current point
    \psk@curvature\space /c ED /b ED /a ED
    \ifshowpoints true \else false \fi
    \ifx\pslinestyle\psls@@symbol \psls@symbol OpenSymbolCurve \else \tx@OpenCurve \fi
    \ifPst@variableLW \pst@flattenpath \fi
  }%
  \ifx\pslinestyle\psls@@symbol\def\pslinestyle{none}\fi%
  \end@OpenObj%
}
\def\psecurve{\pst@object{psecurve}}
\def\psecurve@i{\pst@getarrows{\begin@OpenObj\pst@getcoors[\psecurve@ii}}
\def\psecurve@ii{%
  \addto@pscode{
    \psk@curvature\space /c ED /b ED /a ED
    \ifshowpoints true \else false \fi
    \ifx\pslinestyle\psls@@symbol \psls@symbol AltOpenSymbolCurve \else \tx@AltCurve \fi
  }%
  \ifx\pslinestyle\psls@@symbol\def\pslinestyle{none}\fi%
  \end@OpenObj}
%
\def\psccurve{\pst@object{psccurve}}
\def\psccurve@i{\begin@ClosedObj\pst@getcoors[\psccurve@ii}
\def\psccurve@ii{%
  \addto@pscode{%
    \psk@curvature\space /c ED /b ED /a ED
    \ifshowpoints true \else false \fi
    \ifx\pslinestyle\psls@@symbol \psls@symbol ClosedSymbolCurve \else \tx@ClosedCurve \fi
  }%
  \def\pst@linetype{1}%
  \ifx\pslinestyle\psls@@symbol\def\pslinestyle{none}\fi%
  \end@ClosedObj}
%
\def\pscspline{\pst@object{pscspline}}%  Christoph Bersch
\def\pscspline@i{%
  \pst@getarrows{%
    \begin@OpenObj
    \pst@getcoors[\pscspline@ii
  }%
}
\def\tx@Spline{Spline }
\def\pscspline@ii{%
  \addto@pscode{
    \ifPst@noCurrentPoint\else\pst@cp\fi
    \tx@setlinejoin
    \ifshowpoints true \else false \fi
    \ifx\pslinestyle\psls@@symbol 
      \psls@symbol OpenSymbolSpline
    \else
      \tx@Spline
    \fi
  }%      
  \end@OpenObj
}
%
%--------------------------- PSTricks dots -----------------------
\input{pstricks-dots}
%--------------------------- PSTricks dots end -------------------
%
\newdimen\pslinearc
\define@key[psset]{pstricks}{linearc}[0pt]{\pssetlength\pslinearc{#1}}
\psset[pstricks]{linearc=0pt}
%
\def\psline{\pst@object{psline}}
\def\psline@i{%
  \pst@getarrows{%
    \begin@OpenObj
    \pst@getcoors[\psline@ii
  }%
}
\def\psline@ii{%
  \ifx\pslinestyle\psls@@symbol\addto@pscode{ \psls@symbol SymbolLine }%
  \else
    \addto@pscode{
      \ifPst@noCurrentPoint\else\pst@cp\fi 	  % current point?
      \psline@iii % arc and lineto type
      \tx@Line	  % .pro function
    }%
  \fi
  \end@OpenObj
}
\def\psline@iii{%
  \ifdim\pslinearc>\z@
    /r \pst@number\pslinearc def
    /Lineto { \tx@Arcto } def
  \else
    /Lineto /lineto load def
  \fi
  \tx@setlinejoin 			% hv 2007-10-13
  \ifshowpoints true \else false \fi
}
%
\def\psLine{\pst@object{psLine}}
\def\psLine@i{%
  \pst@getarrows{%
    \begin@OpenObj
    \psLine@ii}}
\def\psLine@ii(#1){\@ifnextchar({\psLine@iii(#1)}{\psLine@iii(0,0)(#1)}}%
\def\psLine@iii(#1)(#2){%
  \pst@getcoor{#1}\pst@tempA
  \pst@getcoor{#2}\pst@tempB
  \addto@pscode{
    \ifPst@noCurrentPoint\else\pst@cp\fi 	  % current point?
    [ % start for coordinate array
    \pst@tempB 
    \pst@tempA  % order vice versa
    4 copy Pyth2 \psk@arrowlength ge 
      { \psline@iii \tx@Line } 
      { pop pop pop pop pop } ifelse
    }%
  \end@OpenObj
  \ignorespaces
}
\def\psLineSegments{\leavevmode\pst@killglue\pst@object{psLineSegments}}
\def\psLineSegments@i{\pst@getarrows{\psLineSegments@ii}}
\def\psLineSegments@ii(#1)(#2){%
  \begingroup
  \use@keep@par
  \solid@star
  \ifpsdoubleline\pst@setdoublesep\fi
  \init@pscode
  \let\pst@linetype\pst@arrowtype
  \pst@addarrowdef
  \pst@getcoor{#1}\pst@tempA
  \pst@getcoor{#2}\pst@tempB
  \addto@pscode{
    \ifPst@noCurrentPoint\else\pst@cp\fi 	  % current point?
    [ % start for coordinate array
    \pst@tempB 
    \pst@tempA  % order vice versa
    4 copy Pyth2 \psk@arrowlength ge 
      { \psline@iii \tx@Line } 
      { pop pop pop pop pop } ifelse
    }%
  \end@OpenObj
  \ignorespaces
  \@ifnextchar(\psLineSegments@ii{}%
}%
\def\pst@isnum#1{\pst@isnum@i\zap@space#1 \@empty\@nil}%
\def\pst@isnum@i#1\@nil{%
  \if!\ifnum9<1#1!\else_\fi%
      \expandafter\@firstoftwo%
  \else%
      \expandafter\@secondoftwo%
  \fi}
%
\def\psset@@symbol#1#2#3#4\@nil{%
  \ifx\relax#4\relax\def\psk@symbol{(#1)}%
  \else%
    \pst@isnum{#1#2#3}{%
      \pst@cnta='#1#2#3\relax%
      \ifnum\pst@cnta>'377\relax%
        \@pstrickserr{Number too large!}\@ehpb%
      \else%
        \def\psk@symbol{(\@backslashchar#1#2#3)}%
      \fi%
}{\@pstrickserr{Not a number!}\@ehpb}%
  \fi}
%
\define@key[psset]{pstricks}{symbol}[a]{\expandafter\psset@@symbol#1!!\@nil}
\psset[pstricks]{symbol=a}
%
\newdimen\pst@symbolStep
\define@key[psset]{pstricks}{symbolStep}[20pt]{\pst@expandafter\pst@@symbolStep#1\@nil}
\def\pst@@symbolStep#1#2\@nil{\if-#1\pssetlength\pst@symbolStep{-#2pt}\else\pssetlength\pst@symbolStep{#1#2}\fi}
\psset[pstricks]{symbolStep=20pt}

\newdimen\pst@symbolWidth
\newdimen\pst@symbolLinewidth
\define@key[psset]{pstricks}{symbolWidth}[10pt]{\pssetlength\pst@symbolWidth{#1}}
\define@key[psset]{pstricks}{symbolLinewidth}[0.5pt]{\pssetlength\pst@symbolLinewidth{#1}}
\psset[pstricks]{symbolWidth=10pt,symbolLinewidth=0.5pt}

\define@key[psset]{pstricks}{symbolFont}[Dingbats]{\def\psk@symbolFont{/#1 }}
\psset[pstricks]{symbolFont=Dingbats}
\define@boolkey[psset]{pstricks}[Pst@]{rotateSymbol}[true]{}
\psset[pstricks]{rotateSymbol=false}
\define@key[psset]{pstricks}{startAngle}[0]{\pst@getangle{#1}\psk@startAngle}
\define@key[psset]{pstricks}{tickAngle}[0]{\pst@getangle{#1}\psk@tickAngle}
\psset[pstricks]{startAngle=0,tickAngle=0}
\define@boolkey[psset]{pstricks}[Pst@]{curveticks}[true]{}
\psset[pstricks]{curveticks=false}

%
\def\psls@symbol{
  /Symbol \psk@symbol def
  /SymbolWidth \pst@number\pst@symbolWidth def
  /SymbolLinewidth \pst@number\pst@symbolLinewidth def
  /SymStep \pst@number\pst@symbolStep def
  \psk@symbolFont findfont %0. [1.0 0.0 0.0 1.0 0.0 0.0]
  \pst@number\pst@symbolWidth scalefont %dup 
  setfont 
  /rotateSymbol \ifPst@rotateSymbol true \else false \fi def
  /tickAngle \psk@tickAngle\space def
  /startAngle \psk@startAngle\space def
  /CorrAngle \ifx\psk@rot\@empty 0 \else \psk@rot \fi def
  /curveticks \ifPst@curveticks true \else false \fi def
  \pst@number\pslinewidth SLW
}
\def\psls@@symbol{symbol}
%
\def\psPline{\def\pst@par{}\pst@object{psPline}}% perpendicular to another line B-C
\def\psPline@i{%
  \pst@getarrows{%
    \begin@OpenObj
    \pst@getcoors[\psPline@ii}%   \pst@coors on stack
}
\def\psPline@ii{%
  \addto@pscode{ % [ pC pB pA  is on stack
    /yA ED /xA ED
    /yB ED /xB ED
    yB sub exch xB sub div /mBC ED		% the slope
    /mA 1 mBC neg div def			% orthogonal
    /xS yA yB sub mBC xB mul add mA xA mul sub mBC mA sub div def
    /yS mBC xS xB sub mul yB add def
    xS yS xA yA 
    \ifPst@noCurrentPoint\else\pst@cp\fi 	% current point
    \psline@iii % arc and lineto type
    \tx@Line	% .pro function
  }%
  \end@OpenObj%
  \ignorespaces%
}
%
\def\qline(#1)(#2){%
  \def\pst@par{}%
  \begin@SpecialObj
  \def\pst@linetype{0}%
  \pst@getcoor{#1}\pst@tempa
  \pst@@getcoor{#2}%
  \addto@pscode{%
    \pst@tempa moveto \pst@coor L
    \@nameuse{psls@\pslinestyle}%
  }%
  \end@SpecialObj}
%
\def\pspolygon{\pst@object{pspolygon}}
\def\pspolygon@i{%
  \begin@ClosedObj%
  \def\pst@cp{}%
  \pst@getcoors[\pspolygon@ii%
}
\def\pspolygon@ii{%
  \ifx\pslinestyle\psls@@symbol\addto@pscode{ \psls@symbol SymbolPolygon }%
  \else                        \addto@pscode{\psline@iii \tx@Polygon}%
  \fi%
  \def\pst@linetype{1}%
  \end@ClosedObj}
%
\define@key[psset]{pstricks}{framearc}[0]{\pst@checknum{#1}\psk@framearc}
\psset[pstricks]{framearc=0}
%
\define@key[psset]{pstricks}{cornersize}[relative]{\pst@expandafter\psset@@cornersize{#1}\@nil}
\def\psset@@cornersize#1#2\@nil{%
  \if #1a\relax
    \def\psk@cornersize{\pst@number\pslinearc false }%
  \else\def\psk@cornersize{\psk@framearc true }%
  \fi}
\psset[pstricks]{cornersize=relative}
%
\def\tx@Rect{Rect }
\def\tx@OvalFrame{OvalFrame }
\def\tx@Frame{Frame }
%
\define@key[psset]{pstricks}{dimen}[outer]{\pst@expandafter\psset@@dimen{#1}\@nil}
\def\psset@@dimen#1#2\@nil{%
  \if #1o\relax%	outer
    \def\psk@dimen{.5 }%
  \else
    \if #1m\relax%	middle
      \def\psk@dimen{0 }%
    \else
      \if #1i\relax%	inner
        \def\psk@dimen{-.5 }%
  \fi\fi\fi}
\psset[pstricks]{dimen=outer}
%
\def\psframe{\pst@object{psframe}}
\def\psframe@i(#1){%
  \@ifnextchar({\psframe@ii(#1)}{\psframe@ii(0,0)(#1)}}
\def\psframe@ii(#1)(#2){%
  \begin@ClosedObj
    \pst@getcoor{#1}\pst@tempa
    \pst@@getcoor{#2}%
    \addto@pscode{ \psk@cornersize \pst@tempa \pst@coor \psk@dimen \tx@Frame }%
    \def\pst@linetype{2}%
    \showpointsfalse
  \end@ClosedObj
}

\iffalse
\def\psSquare{\pst@object{psSquare}}
\def\psSquare@i(#1)(#2){%
  \begin@ClosedObj
    \pst@getcoor{#1}\pst@tempa
    \pst@getcoor{#2}\pst@tempb
    \addto@pscode{ \psk@cornersize 
      \pst@tempa /yA ED /xA ED 
      \pst@tempb /yB ED /xB ED
      xA yA moveto xB yB L
      xA xB sub yA yB sub atan /Angle ED
      xA yA xB yB Pyth2 dup xA add exch yA add 
      \psk@dimen 
      \tx@Frame 
%      grestore
    }%
    \def\pst@linetype{2}%
    \showpointsfalse
  \end@ClosedObj
}
\fi
%
\def\psTextFrame{\pst@object{psTextFrame}}
\def\psTextFrame@i(#1)(#2)#3{%
  \addbefore@par{ref=c}%	to prevent an empty value
  \leavevmode%
  \pst@killglue
  \begingroup
  \use@par
  \ifx\psk@yref\relax \def\psk@yref{0}\fi% no Baseline possible
  \SpecialCoor
  \pst@getcoor{#1}\pst@tempA
  \pst@getcoor{#2}\pst@tempB
  \if@star\psframe*(#1)(#2)\else\psframe(#1)(#2)\fi
  \rput(! \pst@tempA \pst@tempB % x1 y1 x2 y2
    exch 4 -1 roll 		% y1 y2 x2 x1
    dup /x1 ED			% y1 y2 x2 x1
    sub /dx ED			% y1 y2 
    exch dup /y1 ED 		% y2 y1
    sub /dy ED	
    x1 dx \psk@xref\space mul add \pst@number\psxunit div 
    y1 dy \psk@yref\space mul add \pst@number\psyunit div ){#3}
  \endgroup
  \ignorespaces}
%
\def\tx@BezierNArray{ BezierNArray }
\def\tx@OpenBezier{ OpenBezier }
\def\tx@ClosedBezier{ ClosedBezier }
\def\tx@BezierShowPoints{ BezierShowPoints }
\def\tx@BezierCurve{ BezierCurve }
\def\pst@BezierType{2 }	% the default
%
\def\psbezier{\pst@object{psbezier}}
\def\psbezier@i{%
  \pst@getarrows{%
    \begin@OpenObj
      \pst@getcoors[\psbezier@ii%
  }%
}
\def\psbezier@ii{%
  \addto@pscode{
    \ifPst@noCurrentPoint\else\pst@cp\fi
    \ifshowpoints true \else false \fi
    \ifx\pslinestyle\psls@@symbol \psls@symbol OpenSymbolBezier 
    \else 
      \tx@OpenBezier 
      \ifshowpoints \tx@BezierShowPoints \fi
    \fi
  }%
  \def\pst@linetype{1}%
  \ifx\pslinestyle\psls@@symbol\def\pslinestyle{none}\fi%
  \end@OpenObj}
%
\def\pscbezier{\def\pst@par{}\pst@object{pscbezier}}
\def\pscbezier@i{%
  \begin@ClosedObj
  \pst@getcoors[\pscbezier@ii}
%
\def\pscbezier@ii{%
  \addto@pscode{%
    \ifshowpoints true \else false \fi
    \ifx\pslinestyle\psls@@symbol \psls@symbol ClosedSymbolBezier 
    \else 
      \tx@ClosedBezier
      \ifshowpoints \tx@BezierShowPoints \fi
    \fi}%
%  \chardef\pst@linetype=1
  \def\pst@linetype{1}%
  \ifx\pslinestyle\psls@@symbol\def\pslinestyle{none}\fi%
  \end@ClosedObj}
%
\iffalse
\define@key[psset]{pstricks}{epsilon}[0.005]{\pst@checknum{#1}\psk@epsilon}
\psset[pstricks]{epsilon=0.005}		% 200 steps for one curve
%
\def\psBezier#1{%		% allowed order is 1 ... 9
  \ifnum#1>0 \ifnum#1<10 \def\pst@BezierType{#1 }\fi\fi%
  \def\pst@par{}\pst@object{psBezier}}
\def\psBezier@i{%
  \pst@getarrows{%
    \begin@OpenObj
    \pst@getcoors[\psBezier@ii%
}}
\def\psBezier@ii{%
  \addto@pscode{%
    \psk@epsilon	    	% step for Bezier T=0,0+epsilon,0+i*epsilon,...,1
    \pst@BezierType 		% type of the Bezier curve 2,3,4,... 
    \tx@BezierCurve
    \ifshowpoints \tx@BezierShowPoints \fi
  }%
  \end@OpenObj}
\fi
%
\define@key[psset]{pstricks}{pType}[0]{\pst@cntg=#1\relax\edef\psk@pType{\the\pst@cntg}}
\psset[pstricks]{pType=0}
\def\tx@Parab{Parab }%	 given by 1 point and the min/max
\def\tx@Parabo{Parab1 }% given by 2 points for y-a=(x-b)^2
%
\def\psparabola{\pst@object{psparabola}}%  2009-05-19 (hv)
\def\psparabola@i{\pst@getarrows\psparabola@ii}
\def\psparabola@ii#1(#2)#3(#4){%  #2 P #4 SP
  \begin@OpenObj
  \pst@getcoor{#2}\pst@tempa
  \pst@@getcoor{#4}%
  \addto@pscode{\pst@tempa \pst@coor 
    \ifcase\psk@pType
      \tx@Parab \or
      \tx@Parabo
    \fi}%
  \end@OpenObj}
\let\parabola\psparabola% compatibility  (hv)
%
%
\define@key[psset]{pstricks}{gridwidth}[0.8pt]{\pst@getlength{#1}\psk@gridwidth}
\psset[pstricks]{gridwidth=.8pt}
\define@key[psset]{pstricks}{griddots}[0]{%
  \pst@cntg=#1\relax
  \edef\psk@griddots{\the\pst@cntg}}
\psset[pstricks]{griddots=0}
\define@key[psset]{pstricks}{gridcolor}[black]{\pst@getcolor{#1}\psgridcolor}
\psset[pstricks]{gridcolor=black}
\define@key[psset]{pstricks}{subgridwidth}[0.4pt]{\pst@getlength{#1}\psk@subgridwidth}
\psset[pstricks]{subgridwidth=0.4pt}
\define@key[psset]{pstricks}{subgridcolor}[gray]{\pst@getcolor{#1}\pssubgridcolor}
\psset[pstricks]{subgridcolor=gray}
\define@key[psset]{pstricks}{subgriddots}[0]{%
  \pst@cntg=#1\relax\edef\psk@subgriddots{\the\pst@cntg}}
\psset[pstricks]{subgriddots=0}
\define@key[psset]{pstricks}{subgriddiv}[5]{%
  \pst@cntg=#1\relax\edef\psk@subgriddiv{\the\pst@cntg}}
\psset[pstricks]{subgriddiv=5}
%
\define@key[psset]{pstricks}{gridfont}[NimbusSanL-Regu]{%
  \ifPSTlualatex
    \ifx\relax#1\relax
       \def\psk@gridfont{\fontid\font\space .findfontid }%
    \else
      \def\psk@gridfont{/#1 findfont }%   hv 2007-11-13
     \fi
  \else
     \def\psk@gridfont{/#1 findfont }%   hv 2007-11-13
  \fi
}%
   
\ifpst@psfonts
  \psset[pstricks]{gridfont=Helvetica}%
\else
  \psset[pstricks]{gridfont=NimbusSanL-Regu}%
\fi
%
\define@key[psset]{pstricks}{gridlabels}[10pt]{\pst@getlength{#1}\psk@gridlabels}
\psset[pstricks]{gridlabels=10pt}
\define@key[psset]{pstricks}{gridlabelcolor}[black]{\pst@getcolor{#1}\psgridlabelcolor}
\psset[pstricks]{gridlabelcolor=black}
\define@key[psset]{pstricks}{griddx}[1]{\def\psk@xgridDX{#1 }}
\define@key[psset]{pstricks}{griddy}[1]{\def\psk@ygridDY{#1 }}
\define@key[psset]{pstricks}{xgridoffset}[0]{\pst@getlength{#1}\psk@xgridoffset}
\define@key[psset]{pstricks}{ygridoffset}[0]{\pst@getlength{#1}\psk@ygridoffset}
\psset[pstricks]{xgridoffset=0,ygridoffset=0,griddx=1,griddy=1}

\def\tx@Grid{Grid }

\def\psgrid{\pst@object{psgrid}}
\def\psgrid@i{\@ifnextchar({\psgrid@ii}{\expandafter\psgrid@iv\pic@coor}}
\def\psgrid@ii(#1){\@ifnextchar({\psgrid@iii(#1)}{\psgrid@iv(0,0)(0,0)(#1)}}
\def\psgrid@iii(#1)(#2){\@ifnextchar({\psgrid@iv(#1)(#2)}{\psgrid@iv(#1)(#1)(#2)}}
\def\psgrid@iv(#1)(#2)(#3){%
  \begin@SpecialObj
    \pst@getcoor{#1}\pst@tempA%  hv 1.11
    \pst@getcoor{#2}\pst@tempB%  hv 1.11
    \pst@@getcoor{#3}%
    \ifnum\psk@subgriddiv>1\relax
      \addto@pscode{
        /xGridOffset \psk@xgridoffset\space def
        /yGridOffset \psk@ygridoffset\space def
        /GridDX \psk@xgridDX def
        /GridDY \psk@ygridDY def
        gsave
        \tx@setStrokeTransparency
        \psk@subgridwidth SLW 
        \pst@usecolor\pssubgridcolor
        \pst@tempB \pst@coor \pst@tempA                 % hv 1.11
%        \pst@number\psxunit \pst@number\psyunit        % hv 1.11
        \pst@number\psxunit abs \pst@number\psyunit abs % hv 1.11
        \psk@subgriddiv\space \psk@subgriddots\space
        {} 0 
        \psk@gridfont 0 scalefont setfont      % hv 1.16
	\tx@Grid 
	grestore
      }%
    \fi
    \addto@pscode{
      gsave
      /xGridOffset \psk@xgridoffset def
      /yGridOffset \psk@ygridoffset def
      /GridDX \psk@xgridDX def
      /GridDY \psk@ygridDY def
      \tx@setStrokeTransparency
      \psk@gridwidth SLW 
      \pst@usecolor\psgridcolor
      \pst@tempB \pst@coor \pst@tempA                 % hv 1.11
      \pst@number\psxunit abs \pst@number\psyunit abs % hv 1.11
%      \pst@number\psxunit \pst@number\psyunit        % hv 1.11
      1 \psk@griddots\space { \pst@usecolor\psgridlabelcolor }
      \psk@gridlabels 
      \psk@gridfont \psk@gridlabels scalefont setfont  % hv 1.16
      \tx@Grid 
      grestore
    }%
  \end@SpecialObj
  \ignorespaces}
%
\newif\ifpsmathbox
\psmathboxtrue
\def\pst@mathflag{\z@}
\newtoks\everypsbox
\let\pst@thisbox\relax
%
\long\def\pst@makenotverbbox#1#2{%
  \edef\pst@mathflag{%
  \ifpsmathbox\ifmmode\ifinner 1\else 2\fi\else\z@\fi\else\z@\fi}%
  \setbox\pst@hbox=\hbox{%
    \ifcase\pst@mathflag\or$\m@th\textstyle\or$\m@th\displaystyle\fi%
    {\pst@thisbox\the\everypsbox#2}%
    \ifnum\pst@mathflag>\z@$\fi%                                     $
  }%
  #1}
%
\def\pst@makeverbbox#1{%
  \def\pst@afterbox{#1}%
  \edef\pst@mathflag{\ifpsmathbox\ifmmode\ifinner1\else2\fi\else\z@\fi\else\z@\fi}%
  \afterassignment\pst@beginbox%
  \setbox\pst@hbox\hbox%
}
\def\pst@beginbox{%
  \ifcase\pst@mathflag\or$\m@th\or$\m@th\displaystyle\fi%
  \bgroup\aftergroup\pst@endbox%
  \pst@thisbox%
  \the\everypsbox%
}
\def\pst@endbox{%
  \ifnum\pst@mathflag>\z@\relax$\fi%                      $
  \egroup%
  \pst@afterbox%
}
\def\pst@makebox{\pst@@makebox}
\def\psverbboxtrue{\def\pst@@makebox{\pst@makeverbbox}}
\def\psverbboxfalse{\def\pst@@makebox{\pst@makenotverbbox}}
\psverbboxfalse
\def\pst@longbox{%
  \def\pst@makebox{%
    \gdef\pst@makebox{\pst@@makebox}%
    \pst@makelongbox%
  }%
}
\def\pst@makelongbox#1{%
  \def\pst@afterbox{#1}%
  \edef\pst@mathflag{%
    \ifpsmathbox\ifmmode\ifinner 1\else 2\fi\else \z@\fi\else \z@\fi%
  }%
  \setbox\pst@hbox\hbox\bgroup
  \aftergroup\pst@afterbox
  \ifcase\pst@mathflag\or$\m@th\or$\m@th\displaystyle\fi
  \begingroup
  \pst@thisbox
  \the\everypsbox%
}
\def\pst@endlongbox{%
  \endgroup
  \ifnum\pst@mathflag>\z@$\fi		%$
  \egroup%
}
\def\pslongbox#1#2{%
  \@namedef{#1}{\pst@longbox#2}%
  \@namedef{end#1}{\pst@endlongbox}}
%
\newdimen\psframesep
\define@key[psset]{pstricks}{framesep}[3pt]{\pssetlength\psframesep{#1}}
\psset[pstricks]{framesep=3pt}
%
\define@boolkey[psset]{pstricks}[ps]{boxsep}[true]{}
\psset[pstricks]{boxsep}
%
\def\pst@useboxpar{%
  \use@par
  \if@star
    \let\pslinecolor\psfillcolor
    \solid@star
    \let\solid@star\relax
  \fi
  \ifpsdoubleline \pst@setdoublesep \fi}
%
\def\psframebox{\def\pst@par{}\pst@object{psframebox}}
\def\psframebox@i{\pst@makebox\psframebox@ii}
\def\psframebox@ii{%
  \begingroup
  \pst@useboxpar
  \pst@dima=\pslinewidth
  \advance\pst@dima by \psframesep
  \pst@dimc=\wd\pst@hbox\advance\pst@dimc by \pst@dima
  \pst@dimb=\dp\pst@hbox\advance\pst@dimb by \pst@dima
  \pst@dimd=\ht\pst@hbox\advance\pst@dimd by \pst@dima
  \setbox\pst@hbox=\hbox{%
    \ifpsboxsep\kern\pst@dima\fi
    \begin@ClosedObj
    \addto@pscode{%
      \psk@cornersize % arcradius boolean
      \pst@number\pst@dima neg
      \pst@number\pst@dimb neg
      \pst@number\pst@dimc
      \pst@number\pst@dimd
      .5
      \tx@Frame%
    }%
    \def\pst@linetype{2}%
    \showpointsfalse
    \end@ClosedObj
    \box\pst@hbox
    \ifpsboxsep\kern\pst@dima\fi%
  }%
  \ifpsboxsep\dp\pst@hbox=\pst@dimb\ht\pst@hbox=\pst@dimd\fi
  \leavevmode\box\pst@hbox
  \endgroup}
%
\def\psdblframebox{\def\pst@par{}\pst@object{psdblframebox}}
\def\psdblframebox@i{\addto@par{doubleline=true}\psframebox@i}
%
\define@key[psset]{pstricks}{clipcommand}[clip]{\def\pst@clipcommand{#1 }}
\psset[pstricks]{clipcommand=clip}% alternative is eoclip
%
\def\psclip{\@ifnextchar[\psclip@i{\psclip@i[]}}%
\def\psclip@i[#1]#2{%
  \leavevmode%
  \begingroup%
    \ifx\relax#1\relax\else\psset{#1}\fi%
    \begin@psclip%
      \begingroup%
        \def\use@pscode{%
          \pstVerb{
            \pst@dict
            /mtrxc CM def
            CP CP T
            \tx@STV
            \psk@origin
            \psk@swapaxes
            newpath
            \pst@code
            \pst@clipcommand
            newpath
            mtrxc setmatrix
            moveto
            0 setgray
            end
	  }%
          \gdef\pst@code{}}%
  \def\@multips(##1)(##2)##3##4{\pst@misplaced\multips}%
  \def\nc@object##1##2##3##4{\pst@misplaced{node connection}}%
  \hbox to\z@{#2}%
  \endgroup%
  \def\endpsclip{%
    \end@psclip%
    \endgroup}%
  \ignorespaces}
%
\def\endpsclip{\pst@misplaced\endpsclip}
\let\begin@psclip\relax
\def\end@psclip{\pstVerb{currentpoint initclip moveto}}
%
\def\AltClipMode{%
  \def\end@psclip{\pstVerb{\pst@grestore}}%
  \def\begin@psclip{\pstVerb{gsave}}}

\ifPSTlualatex
  \AltClipMode
\fi

\def\psclipbox{\@ifnextchar[{\psclipbox@}{\psclipbox@[\z@]}}
% DG modification begin - Apr. 3, 1997
% From paulus@immd5.informatik.uni-erlangen.de (Dietrich Paulus)
%\def\clipbox@[#1]{\pst@makebox\clipbox@@{#1}}
\def\psclipbox@[#1]{\pst@makebox{\psclipbox@@{#1}}}
% DG modification end
\def\psclipbox@@#1{%
  \pssetlength\pst@dimg{#1}%
  \leavevmode\hbox{%
  \begin@psclip%
  \pst@Verb{
    CM \tx@STV CP T newpath
    /a \pst@number\pst@dimg def
    /w \pst@number{\wd\pst@hbox}a add def
    /d \pst@number{\dp\pst@hbox}a add neg def
    /h \pst@number{\ht\pst@hbox}a add def
    a neg d moveto
    a neg h L
    w h L
    w d L
    closepath
    \pst@clipcommand
    newpath
    0 0 moveto
    setmatrix}%
  \unhbox\pst@hbox%
  \end@psclip}}
%
\def\psshadowbox{\def\pst@par{}\pst@object{psshadowbox}}
\def\psshadowbox@i{\pst@makebox\psshadowbox@ii}
\def\psshadowbox@ii{%
\begingroup
\pst@useboxpar
\psshadowtrue
\psboxseptrue
\def\psk@shadowangle{-45 }%
\setbox\pst@hbox=\hbox{\psframebox@ii}%
\pst@dimh=\psk@shadowsize\p@
\pst@dimh=.7071\pst@dimh
\pst@dimg=\dp\pst@hbox
\advance\pst@dimg\pst@dimh
\dp\pst@hbox=\pst@dimg
\pst@dimg=\wd\pst@hbox
\advance\pst@dimg\pst@dimh
\wd\pst@hbox=\pst@dimg
\leavevmode
\box\pst@hbox
\endgroup}
%
\def\pscirclebox{\pst@object{pscirclebox}}
\def\pscirclebox@i{\pst@makebox\pscirclebox@ii}
\def\pscirclebox@ii{%
  \begingroup
  \pst@useboxpar
  \setbox\pst@hbox=\hbox{%
    \pst@nodehook
    \pscirclebox@iii
    \box\pst@hbox}%
  \ifpsboxsep\pscirclebox@sep\fi
  \leavevmode
  \box\pst@hbox
  \endgroup
  \ignorespaces
}
\def\pscirclebox@iii{%
\if@star
    \pslinewidth\z@
    \pstverb{\pst@dict \tx@STP \pst@usecolor\psfillcolor
             newpath \pscirclebox@iv \tx@SD end}%
\else
    \begin@ClosedObj
    \def\pst@linetype{4}\showpointsfalse
    \addto@pscode{ \pscirclebox@iv\space CLW 2 div add 0 360 arc closepath}%
    \end@ClosedObj
\fi
}
%
\def\pscirclebox@iv{
  \pst@number{\wd\pst@hbox} 2 div
  \pst@number{\ht\pst@hbox} \pst@number{\dp\pst@hbox} add 2 div
  2 copy \pst@number{\dp\pst@hbox} sub 4 2 roll
  \tx@Pyth \pst@number\psframesep add }
%
\def\pscirclebox@sep{%
  \pst@dimn=\ht\pst@hbox%			% the height of the box
  \advance\pst@dimn by \dp\pst@hbox%		% the depth  of the box added to \pst@dimn
  \divide\pst@dimn by 2%			% \pst@dimn/2
  \pst@dimm=0.5\wd\pst@hbox%			% the half of the width
  \pst@Pyth\pst@dimm\pst@dimn\pst@dimo%		% the diameter
  \advance\pst@dimo by \pslinewidth%
  \advance\pst@dimo by \psframesep%
  \advance\pst@dimn by -\pst@dimo%
  \setbox\pst@hbox=\hbox to 2\pst@dimo{\hss\vbox{\kern-\pst@dimn\box\pst@hbox}\hss}%
  \advance\pst@dimn by -\dp\pst@hbox%
  \dp\pst@hbox=-\pst@dimn}
%  
\let\pst@nodehook\relax
%
\def\psCirclebox{\def\pst@par{}\pst@object{psCirclebox}}
\def\psCirclebox@i{\pst@makebox\psCirclebox@ii}
\def\psCirclebox@ii{%
  \begingroup
  \pst@useboxpar
  \pst@dima=\ht\pst@hbox
  \advance\pst@dima by -\dp\pst@hbox
  \divide\pst@dima\tw@
  \pssetlength\pst@dimb\psk@radius
  \setbox\pst@hbox=\hbox{%
    \pst@nodehook
    \pscircle(.5\wd\pst@hbox,\pst@dima){\pst@dimb}%
    \box\pst@hbox}%
  \ifpsboxsep \psCirclebox@sep \fi
  \leavevmode
  \box\pst@hbox
  \endgroup
}
%
\def\psCirclebox@sep{%
  \pst@dimc=\pst@dimb
  \advance\pst@dimb-\pst@dima
  \advance\pst@dima\pst@dimc
  \setbox\pst@hbox=\hbox to\tw@\pst@dimc{%
    \hss\vrule width \z@ depth \pst@dimb height \pst@dima
    \box\pst@hbox\hss}}
%
\def\psovalbox{\def\pst@par{}\pst@object{psovalbox}}
\def\psovalbox@i{\pst@makebox{\psovalbox@ii}}
\def\psovalbox@ii{%
  \begingroup
  \pst@useboxpar
  \psovalbox@iii
  \ifpsboxsep\psovalbox@sep\fi
  \leavevmode
  \box\pst@hbox
  \endgroup}
%
\def\psovalbox@iii{%
  \psovalbox@iv
  \setbox\pst@hbox=\hbox{%
    \begin@ClosedObj
    \addto@pscode{%
      0 360
      \pst@number\pst@dimc CLW 2 div sub
      \pst@number\pst@dimd CLW 2 div sub
      \pst@number\pst@dima
      \pst@number\pst@dimb
      \tx@Ellipse
      closepath }%
    \def\pst@linetype{2}%
    \end@ClosedObj
    \unhbox\pst@hbox}}
%
\def\psovalbox@iv{%
  \pst@dimc=\pslinewidth\advance\pst@dimc\psframesep
  \pst@dimd=\ht\pst@hbox\advance\pst@dimd\dp\pst@hbox
  \pst@dima=.5\wd\pst@hbox
  \pst@dimb=.5\pst@dimd\advance\pst@dimb-\dp\pst@hbox
  \pst@dimd=.707\pst@dimd
  \advance\pst@dimd\pst@dimc
  \advance\pst@dimc.707\wd\pst@hbox}
%
\def\psovalbox@sep{%
  \setbox\pst@hbox\hbox to 2\pst@dimc{\hss\unhbox\pst@hbox\hss}%
  \pst@dimg=\pst@dimd
  \advance\pst@dimg-\pst@dimb
  \dp\pst@hbox=\pst@dimg
  \advance\pst@dimd\pst@dimb
  \ht\pst@hbox=\pst@dimd}
%
\def\psdiabox{\def\pst@par{}\pst@object{psdiabox}}
\def\psdiabox@i{\pst@makebox{\psdiabox@ii}}
\def\psdiabox@ii{%
\begingroup
\pst@useboxpar
\psdiabox@iii
\ifpsboxsep\psdiabox@sep\fi
\leavevmode
\box\pst@hbox
\endgroup}
\def\psdiabox@iv{%
\pst@dimg=.707\pslinewidth
\advance\pst@dimg.707\psframesep
\pst@dima=\wd\pst@hbox
\divide\pst@dima 2
\pst@dimc=\pst@dima
\advance\pst@dimc\pst@dimg
\pst@dimd=\ht\pst@hbox
\advance\pst@dimd\dp\pst@hbox
\divide\pst@dimd 2
\pst@dimb=\pst@dimd
\advance\pst@dimb-\dp\pst@hbox
\advance\pst@dimd\pst@dimg}
\def\psdiabox@iii{%
\psdiabox@iv
\setbox\pst@hbox=\hbox{%
\begin@ClosedObj
\addto@pscode{%
\psline@iii
pop
.5
\pst@number\pst@dimc 2 mul \pst@number\pst@dimd 2 mul
0
\pst@number\pst@dima \pst@number\pst@dimb
\tx@Diamond}%
\def\pst@linetype{4}%
\end@ClosedObj
\box\pst@hbox}}
\def\psdiabox@sep{%
\setbox\pst@hbox\hbox to 4\pst@dimc{\hss\unhbox\pst@hbox\hss}%
\multiply\pst@dimd 2
\advance\pst@dimd\pst@dimb
\ht\pst@hbox\pst@dimd
\advance\pst@dimd-2\pst@dimb
\dp\pst@hbox\pst@dimd}
%
\define@key[psset]{pstricks}{trimode}[U]{\pst@expandafter\psset@@trimode{#1}\@empty\@empty\@nil}
\def\psset@@trimode#1#2#3\@nil{%
  \let\pst@tempg#1\relax
  \ifx\pst@tempg*
    \let\psk@@trimode\@empty
    \let\pst@tempg#2\relax
  \else
    \let\psk@@trimode\relax
  \fi
  \edef\psk@trimode{%
    \ifx R\pst@tempg 1 % Right
    \else
      \ifx D\pst@tempg 2 % Down
      \else
        \ifx L\pst@tempg 3 % Left
        \else 
          \ifx l\pst@tempg 4 % |_
          \else
            \ifx r\pst@tempg 5 % _|
            \else 0 \fi     % Up
          \fi
        \fi
      \fi
    \fi}%
}
\psset[pstricks]{trimode=U}
%
\def\pstribox{\pst@object{pstribox}}
\def\pstribox@i{\pst@makebox{\pstribox@ii}}
\def\pstribox@ii{%
  \begingroup
  \pst@useboxpar
  \pstribox@iii
  \ifpsboxsep\pstribox@sep\fi
  \leavevmode
  \box\pst@hbox
  \endgroup}
%
\def\pstribox@iii{%
  \pstribox@iv
  \setbox\pst@hbox=\hbox{%
    \begin@ClosedObj
    \addto@pscode{
      \psline@iii
      pop
      0.5
      \pst@number\pst@dimc % Width
      \pst@number\pst@dimd % Height
      \ifcase\psk@trimode  
             \or  %% 0
        exch \or  %% 1
             \or  %% 2
        exch \or  %% 3
             \or  %% 4
             \or  %% 5
      \fi
      \psk@trimode -90 mul
      \pst@number\pst@dima % x coor for text
      \pst@number\pst@dimb % y coor for text
      \tx@Triangle}%
    \def\pst@linetype{2}%
    \end@ClosedObj
    \box\pst@hbox}%
}
%
\def\pstribox@iv{%
  \pst@dimh=\pslinewidth
  \advance\pst@dimh\psframesep
  \pst@dimg=\ht\pst@hbox
  \advance\pst@dimg-\dp\pst@hbox         % totalheight
  \divide\pst@dimg 2                     % 0.5 totalheight
  \edef\pst@tempa{\number\pst@dimg sp}%  % For use by nodes.
  \ifodd\psk@trimode                     % 
    \pst@dimb\pst@dimg
  \else
    \pst@dima=\wd\pst@hbox
    \divide\pst@dima 2
  \fi
  \ifcase\psk@trimode
    \pst@dimb=-\dp\pst@hbox
    \advance\pst@dimb-\pst@dimh
  \or\pst@dima=-\pst@dimh
  \or\pst@dimb=\ht\pst@hbox
     \advance\pst@dimb\pst@dimh
  \or\pst@dima=\wd\pst@hbox
     \advance\pst@dima\pst@dimh
  \fi
  \pst@dimd=\dp\pst@hbox
  \advance\pst@dimd\ht\pst@hbox
  \ifx\psk@@trimode\relax% no star for trimode=
    \pst@dimc=\wd\pst@hbox
    \advance\pst@dimc\ifodd\psk@trimode 1.447\else 1.789\fi\pst@dimh
    \multiply\pst@dimc 2
    \advance\pst@dimd\ifodd\psk@trimode 1.789\else 1.447\fi\pst@dimh
    \multiply\pst@dimd 2
  \else% trimode=R*,L*,U*,D*
    \ifodd\psk@trimode
      \advance\pst@dimd 1.1547\wd\pst@hbox
      \advance\pst@dimd 3.4641\pst@dimh
      \pst@dimc=.866\pst@dimd
    \else
      \advance\pst@dimd .866\wd\pst@hbox %.866=(sqrt(3)/2)
      \advance\pst@dimd 3\pst@dimh 
      \pst@dimc=1.1547\pst@dimd % 1.1547=(2/sqrt(3))
    \fi
  \fi}
%
\def\pstribox@sep{%
\ifodd\psk@trimode
\advance\pst@dimb.5\pst@dimd
\ht\pst@hbox=\pst@dimb
\advance\pst@dimd-\pst@dimb
\dp\pst@hbox=\pst@dimd
\else
\setbox\pst@hbox\hbox to \pst@dimc{\hss\unhbox\pst@hbox\hss}%
\global\pst@dimg=.5\pst@dimc
\fi
\ifcase\psk@trimode
\dp\pst@hbox-\pst@dimb
\advance\pst@dimd\pst@dimb
\ht\pst@hbox\pst@dimd
\or
\pst@dimg=.5\wd\pst@hbox
\global\advance\pst@dimg-\pst@dima
\setbox\pst@hbox\hbox to \pst@dimc{\kern-\pst@dima\box\pst@hbox\hss}%
\or
\ht\pst@hbox\pst@dimb
\advance\pst@dimd-\pst@dimb
\dp\pst@hbox\pst@dimd
\or
\pst@dimg=\pst@dimc
\advance\pst@dimg-\pst@dima
\global\advance\pst@dimg.5\wd\pst@hbox
\setbox\pst@hbox\hbox to \pst@dimc{%
\hss\box\pst@hbox\kern\psframesep\kern\pslinewidth}%
\fi}
%
\define@key[psset]{pstricks}{arcsepA}[0]{\pst@getlength{#1}\psk@arcsepA}
\define@key[psset]{pstricks}{arcsepB}[0]{\pst@getlength{#1}\psk@arcsepB}
\define@key[psset]{pstricks}{arcsep}[0]{%
  \pst@getlength{#1}\psk@arcsepA\let\psk@arcsepB\psk@arcsepA}
\psset[pstricks]{arcsep=0}
\def\tx@ArcArrow{ArcArrow }
%
\def\psarc{\pst@object{psarc}}
\def\psarc@i{\@ifnextchar({\psarc@iii}{\psarc@ii}}
\def\psarc@ii#1{\addto@par{arrows=#1}\@ifnextchar(\psarc@iii{\psarc@iii(0,0)}}
\def\psarc@iii(#1)#2#3#4{%
  \pst@getangle{#3}\pst@tempa
  \pst@getangle{#4}\pst@tempb
  \ifx\pst@tempa\pst@tempb
  \else
    \begin@OpenObj
      \pst@@getcoor{#1}%
      \pssetlength\pst@dima{#2}%
      \addto@pscode{\psarc@iv \psarc@v
        \ifPst@variableLW \pst@flattenpath \fi
      }%
      \gdef\psarc@type{0}%
      \showpointsfalse
    \end@OpenObj
  \fi
}
%
\def\psarcOA{\pst@object{psarcOA}}% \psarcOA[..](O)(A){angle1}{angle2}
\def\psarcOA@i{\@ifnextchar({\psarcOA@iii}{\psarcOA@ii}}
\def\psarcOA@ii#1{\addto@par{arrows=#1}\@ifnextchar(\psarcOA@iii{\psarcOA@iii(0,0)}}
\def\psarcOA@iii(#1)(#2)#3#4{%
  \pst@getangle{#3}\pst@tempa
  \pst@getangle{#4}\pst@tempb
  \ifx\pst@tempa\pst@tempb
  \else
    \begin@OpenObj
      \pst@getcoor{#1}\pst@tempA
      \pst@getcoor{#2}\pst@tempB
      \addto@pscode{
        \pst@tempA 2 copy /y ED /x ED \pst@tempB Pyth2 /r ED 
        x y translate
        /c 57.2957 r \tx@Div def
        /angleA
          \pst@tempa
          \psk@arcsepA c mul 2 div
          \ifcase\psarc@type add \or sub \fi def
       /angleB
         \pst@tempb
         \psk@arcsepB c mul 2 div
         \ifcase\psarc@type sub \or add \fi def
       \ifshowpoints\psarc@showpoints\fi
       \ifx\psk@arrowA\@empty
         \ifnum\psk@liftpen=2
           r angleA \tx@PtoC moveto
         \fi
       \fi
  /angleAtoB angleB angleA gt { true }{ false } ifelse def
  0 0 r
  angleA
  \ifx\psk@arrowA\@empty\else
    { ArrowA CP }
    r 0 gt \pslbrace
    { \ifcase\psarc@type add \or sub \fi } \psrbrace\pslbrace
    { \ifcase\psarc@type sub \or add \fi } \psrbrace ifelse
%    { \ifcase\psarc@type add \or sub \fi }
    \tx@ArcArrow
%    dup AngleA gt AngleAtoB exor { neg } fi
  \fi
  angleB
  \ifx\psk@arrowB\@empty\else
    { ArrowB }
    r 0 gt \pslbrace
      { \ifcase\psarc@type sub \or add \fi } \psrbrace\pslbrace
      { \ifcase\psarc@type add \or sub \fi } \psrbrace ifelse
%      { \ifcase\psarc@type sub \or add \fi }
    \tx@ArcArrow
    dup angleA gt angleAtoB xor { pop angleA } if
  \fi
  \ifcase\psarc@type arc \or arcn \fi
       \ifPst@variableLW \pst@flattenpath \fi
     x neg  y neg translate
     }%
     \gdef\psarc@type{0}%
     \showpointsfalse
    \end@OpenObj
  \fi
}
\def\psarc@iv{%
  \pst@coor /y ED /x ED
  /r \ifPst@SpecialLength \pst@SpecialLength \else \pst@number\pst@dima \fi def
  /c 57.2957 r \tx@Div def
  /angleA
    \pst@tempa
    \psk@arcsepA c mul 2 div
    \ifcase\psarc@type add \or sub \fi
  def
  /angleB
    \pst@tempb
    \psk@arcsepB c mul 2 div
    \ifcase\psarc@type sub \or add \fi
  def
  \ifshowpoints\psarc@showpoints\fi
  \ifx\psk@arrowA\@empty
    \ifnum\psk@liftpen=2
      r angleA \tx@PtoC
      y add exch x add exch moveto
    \fi
  \fi}
% hv ---- 1.10 2005-05-05 ----------------------> hv begin
\def\psarc@v{%
  /angleAtoB angleB angleA gt { true }{ false } ifelse def
  x y r
  angleA
  \ifx\psk@arrowA\@empty\else
    { ArrowA CP }
    r 0 gt \pslbrace
    { \ifcase\psarc@type add \or sub \fi } \psrbrace\pslbrace
    { \ifcase\psarc@type sub \or add \fi } \psrbrace ifelse
%    { \ifcase\psarc@type add \or sub \fi }
    \tx@ArcArrow
%    dup AngleA gt AngleAtoB exor { neg } fi
  \fi
  angleB
  \ifx\psk@arrowB\@empty\else
    { ArrowB }
    r 0 gt \pslbrace
      { \ifcase\psarc@type sub \or add \fi } \psrbrace\pslbrace
      { \ifcase\psarc@type add \or sub \fi } \psrbrace ifelse
%      { \ifcase\psarc@type sub \or add \fi }
    \tx@ArcArrow
    dup angleA gt angleAtoB xor { pop angleA } if
  \fi
  \ifcase\psarc@type arc \or arcn \fi
}
% hv ----- 1.10 2005-05-05 ------------------------> end
%
\def\psarc@type{0}
\def\psarc@showpoints{%
  gsave
  newpath
  x y moveto
  x y r \pst@tempa \pst@tempb
  \ifcase\psarc@type arc \or arcn \fi
  closepath
  CLW 2 div SLW
  [ \psk@dash\space ] 0 setdash stroke
  grestore }
\def\psarcn{\def\pst@par{}\pst@object{psarcn}}
\def\psarcn@i{\def\psarc@type{1}\psarc@i}
%
\def\psarcAB{\pst@object{psarcAB}}%		hv 2008-11-26
\def\psarcAB@i{%
  \addbefore@par{psscale=1}% be sure, that it is defined
  \pst@getarrows{%
    \begin@OpenObj%
      \pst@getcoors{}%
      \psarcAB@ii
    }%
}
\def\psarcAB@ii{%
  \addto@pscode{
  /y ED /x ED /yA ED /xA ED /yB ED /xB ED 
  /r xB yB x y Pyth2 \psk@psscale\space mul def
  /c 57.2957 r \tx@Div def
  /angleA
    yA y sub xA x sub atan
    \psk@arcsepA c mul 2 div
    \ifcase\psarc@type add \else sub \fi
  def
  /angleB
    yB y sub xB x sub atan
    \psk@arcsepB c mul 2 div
    \ifcase\psarc@type sub \else add \fi 
  def
  \ifx\psk@arrowA\@empty
    \ifnum\psk@liftpen=2
      r angleA \tx@PtoC
      y add exch x add exch moveto
    \fi
  \fi
  \psarc@v}%
  \gdef\psarc@type{0}%
  \showpointsfalse%
  \end@OpenObj%
}
\def\psarcnAB{\def\pst@par{}\pst@object{psarcnAB}}
\def\psarcnAB@i{\def\psarc@type{1}\psarcAB@i}
%
%------------------ tvz/DG/hv (2004-05-10) begin -------------------%%
% from Denis Giroux: http://www.tug.org/pipermail/pstricks/2001/000507.html
%
% I - Definition of \psellipticwedge, a generalization of \pswedge for wedges
%     of ellipses (from the code of \pswedge and \psellipse)
%
\def\psellipticwedge{\pst@object{psellipticwedge}}
\def\psellipticwedge@i(#1){%
  \@ifnextchar({\psellipticwedge@ii(#1)}{\psellipticwedge@ii(0,0)(#1)}}
\def\psellipticwedge@ii(#1)(#2)#3#4{%
  \begin@ClosedObj
    \pst@getangle{#3}\pst@tempa
    \pst@getangle{#4}\pst@tempb
    \pst@getcoor{#1}\pst@tempc
    \pst@@getcoor{#2}%
    \def\pst@linetype{1}%
    \addto@pscode{%
      \pst@coor /ry ED /rx ED
      \ifx\psk@rot\@empty \else \psk@rot\space rotate \fi
      \pst@tempa 
      \ifPst@correctAngle
       cvi 90 mod 0 eq { \pst@tempa } 
         { rx abs ry abs sub cvi 0 eq { \pst@tempa }{ rx ry
           \tx@UserCoor exch \pst@tempa tan mul exch atan 
            \pst@tempa 180 div 0.5 add floor 
            180 mul sub } ifelse } ifelse
      \fi
      \pst@tempb
      \ifPst@correctAngle
       cvi 90 mod 0 eq { \pst@tempb } 
         { rx abs ry abs sub cvi 0 eq { \pst@tempb }{ rx ry
           \tx@UserCoor exch \pst@tempb tan mul exch atan 
            \pst@tempb 180 div 0.5 add floor 
            180 mul sub } ifelse } ifelse
      \fi
      rx ry
      \pst@tempc moveto
      \ifdim\psk@dimen\p@=\z@\else
        \psk@dimen CLW mul dup 3 1 roll
        sub 3 1 roll sub exch
      \fi
      \pst@tempc
      \tx@Ellipse
      closepath
    }%
  \showpointsfalse
  \end@ClosedObj%
}
%
% Code mainly from "pstricks.tex'' 0.94 beta (TvZ)
%
\def\psellipticarcn{\pst@object{psellipticarcn}}
\def\psellipticarcn@i{\let\if@psarcn\iftrue\psellipticarc@ii}
%
\def\psellipticarc{\pst@object{psellipticarc}}
\def\psellipticarc@i{\let\if@psarcn\iffalse\psellipticarc@ii}

\define@boolkey[psset]{pstricks}[Pst@]{correctAngle}[true]{}
\psset{correctAngle}

\let\if@psarcn\iffalse

\def\psellipticarc@ii{\pst@getarrows\psellipticarc@iii}
\def\psellipticarc@iii(#1){%
  \@ifnextchar({\psellipticarc@iv(#1)}{\psellipticarc@iv(0,0)(#1)}}
\def\psellipticarc@iv(#1)(#2)#3#4{%
%  \addbefore@par{correctAngle=false}
  \pst@getangle{#3}\pst@tempc	%	start angle
  \pst@getangle{#4}\pst@tempd	% 	end angle
  \ifx\pst@tempc\pst@tempd
  \else % same angles? then do nothing
    \begin@OpenObj
    \pst@getcoor{#1}\pst@tempa    %	origin
    \pst@getcoor{#2}\pst@tempb	%	a b
      \addto@pscode{ 
        \psellipticarc@definearg \psellipticarc@draw
        \ifPst@variableLW \pst@flattenpath \fi 
      \ifshowpoints{}
          gsave
          xOrig yOrig T % set origin to ellipse origin
          \ifx\psk@rot\@empty \else \psk@rot\space rotate \fi
          rx ry scale   % now we draw a circle :-)
          1 \pst@tempc  % start angle
          \ifPst@correctAngle
            cvi 90 mod 0 eq { \pst@tempc } 
             { rx abs ry abs sub cvi 0 eq { \pst@tempc }{ rx ry
               \tx@UserCoor exch \pst@tempc tan mul exch atan 
               \pst@tempc 180 div 0.5 add floor 
               180 mul sub } ifelse } ifelse
          \fi
        PtoC moveto 
        0 0 lineto 
        1 \pst@tempd % end angle
        \ifPst@correctAngle
          cvi 90 mod 0 eq { \pst@tempd } 
           { rx ry \tx@UserCoor exch \pst@tempd tan mul exch atan 
             \pst@tempd 180 div .5 add floor 180 mul sub } ifelse 
        \fi
        PtoC lineto 0 0 lineto 
        closepath
   %  \ifcase\psarc@type arc \or arcn \fi
        CLW 3 div \pst@number\psunit div SLW 
        [ 1 1 \tx@UserCoor 2 mul ] 0 setdash 
        stroke
        grestore 
      \fi
    }%
      \showpointsfalse
    \end@OpenObj
  \fi
}
\def\psellipticarc@definearg{%
%  \ifx\psk@rot\@empty \else \psk@rot\space rotate \fi
  \pst@tempa /yOrig ED /xOrig ED  % Origin
  \pst@tempb                      % radii. Now adjust:
  \ifdim\psk@dimen\p@=\z@\else
    \psk@dimen CLW mul dup 3 1 roll
    sub 3 1 roll sub exch
  \fi
  /ry ED /rx ED		% a b
  /angleA
    /d { \if@psarcn sub \else add \fi } def
%    \pst@tempc 
% the angle in the parameter equation is not proportional to the real angle!
% phi=atan(b*tan(angle)/a)+floor(angle/180+0.5)*180
   \pst@tempc 
   \ifPst@correctAngle 
     cvi 90 mod 0 eq { \pst@tempc } 
       { rx ry \tx@UserCoor exch \pst@tempc tan mul exch atan 
          \pst@tempc 180 div .5 add floor 180 mul sub } ifelse 
    \fi
    \psk@arcsepA 2 div
    ArcAdjust
  def
  /angleB
    /d { \if@psarcn add \else sub \fi } def
%    \pst@tempd 
  \pst@tempd 
  \ifPst@correctAngle
     cvi 90 mod 0 eq { \pst@tempd } 
       { rx ry \tx@UserCoor exch \pst@tempd tan mul exch atan 
          \pst@tempd 180 div .5 add floor 180 mul sub } ifelse 
  \fi
  \psk@arcsepB 2 div ArcAdjust  def
%  \ifshowpoints\psellipticarc@showpoints\fi
  \ifx\psk@arrowA\@empty
    \ifnum\psk@liftpen=2
      angleA cos rx mul xOrig add
      angleA sin ry mul yOrig add
      moveto
    \fi%
  \fi%
}
\def\psellipticarc@draw{%
  0 0 1
  angleA
  \ifx\psk@arrowA\@empty\else
    { ArrowA CP }
    { \if@psarcn sub \else add \fi }
    EllipticArcArrow
  \fi
  angleB
  \ifx\psk@arrowB\@empty\else
    { ArrowB }
    { \if@psarcn add \else sub \fi }
    EllipticArcArrow
  \fi
  /mtrx CM def
  xOrig yOrig T
  \ifx\psk@rot\@empty \else \psk@rot\space rotate \fi
  rx ry scale
  \pst@ifcustom\else
    0 0 moveto 
    exch dup dup               % end start start start
    cos exch sin moveto        % end start
    exch                       % start end 
  \fi
%%  \if@star 0 0 moveto \fi	% for filling
  \if@psarcn arcn \else arc \fi
%%  \if@star 0 0 moveto \fi
  mtrx setmatrix%
}
\def\psellipticarc@showpoints{%
  gsave
  /mtrx CM def
  xOrig yOrig T
  rx ry scale
  0 0 moveto
  0 0 1 
  \pst@tempc % start angle
  \ifPst@correctAngle
     cvi 90 mod 0 eq { \pst@tempc } 
       { rx abs ry abs sub cvi 0 eq { \pst@tempc }{ rx ry
         \tx@UserCoor exch \pst@tempc tan mul exch atan 
          \pst@tempc 180 div 0.5 add floor 
          180 mul sub } ifelse } ifelse
    \fi
  \pst@tempd % end angle
   \ifPst@correctAngle
     cvi 90 mod 0 eq { \pst@tempd } 
       { rx abs ry abs sub cvi 0 eq { \pst@tempd } { rx ry 
         \tx@UserCoor exch \pst@tempd tan mul exch atan 
          \pst@tempd 180 div 0.5 add floor 
          180 mul sub } ifelse } ifelse
    \fi
  \ifcase\psarc@type arc \or arcn \fi
  closepath
  mtrx setmatrix
  CLW 2 div SLW
  [ \psk@dash\space ] 0 setdash 
  stroke
  grestore %
}
\def\pscircle{\def\pst@par{}\pst@object{pscircle}}
\def\pscircle@i{\@ifnextchar({\pscircle@do}{\pscircle@do(0,0)}}
\def\pscircle@do(#1)#2{%
  \if@star{\use@par\qdisk(#1){#2}}%   	qdisk does not allow
  \else%				to use opacity option
%    \addbefore@par{dimen=middle}%     20220109 hv
    \begin@ClosedObj
    \pst@@getcoor{#1}%
    \pssetlength\pst@dimc{#2}%
    \def\pst@linetype{4}%
    \addto@pscode{
      \pst@coor 2 copy moveto
      \ifPst@SpecialLength \pst@SpecialLength \else \pst@number\pst@dimc \fi 
      \psk@dimen CLW mul round % prevent rounding errors
      sub 
      dup 0 rmoveto
      0 360 arc
      \ifPst@variableLW \pst@flattenpath \fi
      closepath
    }%
    \showpointsfalse
    \end@ClosedObj
  \fi
  \ignorespaces}
%
\def\pscircleOA{\def\pst@par{}\pst@object{pscircleOA}}%	hv 2008-04-14
\def\pscircleOA@i(#1)(#2){%
%  \addbefore@par{dimen=middle}%     20220109  hv
  \begin@ClosedObj
  \pst@getcoor{#1}\pst@tempA
  \pst@@getcoor{#2}%
  \def\pst@linetype{4}%
  \addto@pscode{
    \pst@tempA			% x0 y0
    2 copy			% xO yO xO yO 
    \pst@coor			% xO yO xO yO xA yA 
    Pyth2			% xO yO radius
    \psk@dimen CLW mul sub
    \if@star \tx@SD \else
      0 360 arc
      closepath 
    \fi }%
  \showpointsfalse
  \end@ClosedObj
  \ignorespaces}
%
\def\qdisk(#1)#2{%
  \def\pst@par{}%
  \begin@SpecialObj
  \pst@@getcoor{#1}%
  \pssetlength\pst@dimg{#2}%
  \addto@pscode{ 
    \pst@coor 
    \ifPst@SpecialLength \pst@SpecialLength \else \pst@number\pst@dimg \fi
%    \pst@number\pst@dimg 
    \tx@SD }%
  \end@SpecialObj}
%
\define@key[psset]{pstricks}{radius}[0.25cm]{\pst@@getlength{#1}\psk@radius}
\psset[pstricks]{radius=.25cm}
%
\def\psCircle{\pst@object{psCircle}}% same as \pscircle, but uses \psk@radius
\def\psCircle@i{\@ifnextchar({\psCircle@ii}{\psCircle@ii(0,0)}}
\def\psCircle@ii(#1){\pscircle@do(#1){\psk@radius}}
%
\def\psRing{\def\pst@par{}\pst@object{psRing}}%% hv 20130405
\def\psRing@i{\@ifnextchar({\psRing@ii}{\psRing@ii(0,0)}}
\def\psRing@ii(#1){%
  \pst@@getcoor{#1}%
  \@ifnextchar[{\psRing@iii}{\psRing@iii[0,360]}}
\def\psRing@iii[#1,#2]#3#4{%   origin, inner radius, outer radius
  \begin@ClosedObj
  \pssetlength\pst@dimc{#3}%
  \edef\pst@tempA{\ifPst@SpecialLength \pst@SpecialLength \else \pst@number\pst@dimc \fi}%
  \pssetlength\pst@dimd{#4}%
  \edef\pst@tempB{\ifPst@SpecialLength \pst@SpecialLength \else \pst@number\pst@dimd \fi}%
  \pst@getangle{#1}\pst@tempa
  \pst@getangle{#2}\pst@tempb
  \def\pst@linetype{4}%
  \addto@pscode{
    \pst@coor translate 
%    \pst@number\pst@dimc \psk@dimen CLW mul sub /InnerRadius ED
%    \pst@number\pst@dimd \psk@dimen CLW mul sub /OuterRadius ED
    \pst@tempA\space \psk@dimen CLW mul sub /InnerRadius ED
    \pst@tempB\space \psk@dimen CLW mul sub /OuterRadius ED
    InnerRadius 0 moveto newpath
    0 0 InnerRadius \pst@tempa\space \pst@tempb\space arc 
    OuterRadius \pst@tempb\space PtoC 
    \pst@tempb\space \pst@tempa\space sub abs 360 eq { moveto }{ lineto } ifelse % whole circle or not??
    0 0 OuterRadius \pst@tempb\space \pst@tempa\space arcn 
    closepath
  }%
  \showpointsfalse
  \end@ClosedObj
  \ignorespaces}
%
\def\pswedge{\def\pst@par{}\pst@object{pswedge}}
\def\pswedge@i{\@ifnextchar({\pswedge@ii}{\pswedge@ii(0,0)}}
\def\pswedge@ii(#1)#2#3#4{%
  \begin@ClosedObj
  \pssetlength\pst@dimc{#2}%
  \pst@getangle{#3}\pst@tempa
  \pst@getangle{#4}\pst@tempb
  \pst@@getcoor{#1}%
  \def\pst@linetype{1}%
  \addto@pscode{
    \ifx\psk@rot\@empty 0 \else \psk@rot \fi rotate
    \pst@coor
    2 copy
    moveto
    \ifPst@SpecialLength \pst@SpecialLength \else \pst@number\pst@dimc \fi
    \psk@dimen CLW mul sub % Adjusted radius
    \pst@tempa \pst@tempb
    arc
    closepath}%
  \showpointsfalse
  \end@ClosedObj
}
\def\tx@ellipse#1{ \ifx\psk@rot\@empty 0 \else \psk@rot \fi #1  Ellipse }
\def\tx@Ellipse{ \ifx\psk@rot\@empty 0 \else \psk@rot \fi Ellipse }
%
\def\psellipse{\def\pst@par{}\pst@object{psellipse}}
\def\psellipse@i(#1){\@ifnextchar({\psellipse@ii(#1)}{\psellipse@ii(0,0)(#1)}}
\def\psellipse@ii(#1)(#2){%
  \begin@ClosedObj
  \pst@getcoor{#1}\pst@tempa
  \pst@@getcoor{#2}%
  \addto@pscode{
    0 360
    \pst@coor 
    \ifdim\psk@dimen\p@=\z@\else
      \psk@dimen CLW mul
      dup 4 -1 roll sub neg 3 1 roll sub
    \fi
    \pst@tempa 
    \tx@ellipse{true}
    \ifPst@variableLW \pst@flattenpath \fi
    closepath
  }%
  \def\pst@linetype{2}%
  \end@ClosedObj%
}
\def\psellipseAB{\def\pst@par{}\pst@object{psellipseAB}}
\def\psellipseAB@i(#1)(#2)#3{%
  \begin@ClosedObj
  \pst@getcoor{#1}\pst@tempa
  \pst@getcoor{#2}\pst@tempb
  \addto@pscode{
    0 360
    #3 \pst@number\psxunit mul
    \pst@tempa /yA ED /xA ED
    \pst@tempb /yB ED /xB ED
    xA xB sub dup mul
    yA yB sub dup mul add sqrt 2 div
    \ifdim\psk@dimen\p@=\z@\else
      \psk@dimen CLW mul
      dup 4 -1 roll sub neg 3 1 roll sub
    \fi
    xA xB add 2 div yA yB add 2 div
    translate 0 0
    xB xA sub yA yB sub atan 
    Ellipse  % on stack is rotate coordinates
    \ifPst@variableLW \pst@flattenpath \fi
    closepath
  }%
  \def\pst@linetype{2}%
  \end@ClosedObj
}
\def\multips{\@ifnextchar({\def\pst@par{}\multips@ii}{\multips@i}}
\def\multips@i#1{\def\pst@par{rot=#1}\multips@ii}
\def\multips@ii(#1){\@ifnextchar({\multips@iii(#1)}{\multips@iii(\z@,\z@)(#1)}}
\long\def\multips@iii(#1)(#2)#3#4{%
  \begingroup
%----------------- hv 1.10 ------------------
  \pst@killglue
%----------------- hv 1.10 ------------------
  \use@par
  \pst@getcoor{#1}\pst@tempa
  \pst@@getcoor{#2}%
  \pst@cnta=#3\relax
  \init@pscode
  \addto@pscode{%
    \pst@tempa T \the\pst@cnta\space \pslbrace
    gsave \ifx\psk@rot\@empty\else\psk@rot rotate \fi}%
  \hbox to\z@{%
    \def\init@pscode{%
      \addto@pscode{%
        gsave
        \pst@number\pslinewidth SLW
        \pst@usecolor\pslinecolor}}%
    \def\use@pscode{\addto@pscode{grestore}}%
    \def\psclip##1{\pst@misplaced\psclip}%
    \def\nc@object##1##2##3##4{\pst@misplaced{node connection}}%
    #4%
  }%
  \addto@pscode{grestore \pst@coor T \psrbrace repeat}%
  \leavevmode
  \use@pscode
  \endgroup
  \ignorespaces}
\def\psscalebox#1{\pst@makebox{\ps@scalebox{#1}}}
\def\ps@scalebox#1{%
  \begingroup%
  \pst@getscale{#1}\pst@tempa%
  \let\pst@tempc\pst@tempg%
  \let\pst@tempd\pst@temph%
  \ps@@scalebox%
  \endgroup}
\def\ps@@scalebox{%
  \leavevmode%
  \hbox{%
    \ifdim\pst@tempd\p@<\z@%
      \pst@dimg=\pst@tempd\ht\pst@hbox%
      \pst@dimh=\pst@tempd\dp\pst@hbox%
      \dp\pst@hbox=-\pst@dimg%
      \ht\pst@hbox=-\pst@dimh%
    \else%
      \ht\pst@hbox=\pst@tempd\ht\pst@hbox%
      \dp\pst@hbox=\pst@tempd\dp\pst@hbox%
    \fi%
    \pst@dima=\pst@tempc\wd\pst@hbox%
    \ifdim\pst@dima<\z@\kern-\pst@dima\fi%
    \pst@Verb{CP CP translate \pst@tempa \tx@NET}%
    \hbox to \z@{\box\pst@hbox\hss}%
    \pst@Verb{
      CP CP translate
      1 \pst@tempc div 1 \pst@tempd div scale
      \tx@NET}%
    \ifdim\pst@dima>\z@\kern\pst@dima\fi%
  }%
}
\pslongbox{Scalebox}{\psscalebox}
%
\def\psscaleboxto(#1,#2){\pst@makebox{\ps@scaleboxto(#1,#2)}}
\def\ps@scaleboxto(#1,#2){%
  \begingroup
  \pssetlength\pst@dima{#1}%
  \pssetlength\pst@dimb{#2}%
  \ifdim\pst@dima=\z@\else
    \pst@divide{\pst@dima}{\wd\pst@hbox}\pst@tempc
    \edef\pst@tempc{\pst@tempc\space}%
  \fi
  \ifdim\pst@dimb=\z@
    \ifdim\pst@dima=\z@
      \@pstrickserr{%
        \string\psscaleboxto\space dimensions cannot both be zero}\@ehpa
      \def\pst@tempa{}%
      \def\pst@tempc{1 }%
      \def\pst@tempd{1 }% 
    \else
      \let\pst@tempd\pst@tempc
    \fi
  \else
    \pst@dimc=\ht\pst@hbox
    \advance\pst@dimc\dp\pst@hbox
    \pst@divide{\pst@dimb}{\pst@dimc}\pst@tempd
    \edef\pst@tempd{\pst@tempd\space}%
    \ifdim\pst@dima=\z@ \let\pst@tempc\pst@tempd \fi
  \fi
  \edef\pst@tempa{\pst@tempc \pst@tempd scale }%
  \ps@@scalebox
  \endgroup}
\pslongbox{Scaleboxto}{\psscaleboxto}
%
\def\tx@Rot{Rot }
\def\psrotateleft{%
  \ifPSTlualatex
    \def\pst@tempA{-90 }%
    \def\pst@tempB{90 }%
  \else
    \def\pst@tempA{90 }%
    \def\pst@tempB{-90 }%
  \fi
  \pst@makebox{\ps@rotateleft\pst@hbox}}
\def\ps@rotateleft#1{%
  \leavevmode\hbox{\hskip\ht#1\hskip\dp#1\vbox{\vskip\wd#1%
    \pst@Verb{\pst@tempA \tx@Rot}%
    \vbox to \z@{\vss\hbox to \z@{\box#1\hss}\vskip\z@}%
      \pst@Verb{\pst@tempB \tx@Rot}}}}
%
\def\psrotateright{%
  \ifPSTlualatex
    \def\pst@tempA{90 }%
    \def\pst@tempB{-90 }%
  \else
    \def\pst@tempA{-90 }%
    \def\pst@tempB{90 }%
  \fi
  \pst@makebox{\ps@rotateright\pst@hbox}}
\def\ps@rotateright#1{%
% ----------- hv begin 2004-05-07 ----------- patch 15
%    \hbox{%
  \leavevmode\hbox{%
% ----------- hv end 2004-05-07 ----------- patch 15
  \hskip\ht#1\hskip\dp#1\vbox{\vskip\wd#1%
  \pst@Verb{\pst@tempA \tx@Rot}
  \vbox to \z@{\hbox to \z@{\hss\box#1}\vss}%
  \pst@Verb{\pst@tempB \tx@Rot}}}}
\def\psrotatedown{\pst@makebox{\ps@rotatedown\pst@hbox}}
\def\ps@rotatedown#1{%
\hbox{\hskip\wd#1\vbox{\vskip\ht#1\vskip\dp#1%
\pst@Verb{180 \tx@Rot}%
\vbox to \z@{\hbox to \z@{\box#1\hss}\vss}%
\pst@Verb{-180 \tx@Rot}}}}
\pslongbox{Rotateleft}{\psrotateleft}
\pslongbox{Rotateright}{\psrotateright}
\pslongbox{Rotatedown}{\psrotatedown}
% ----------- hv begin 2004-09-23 ----------- 1.11
% compatibility stuff 
\let\rotateleft\psrotateleft
\let\rotateright\psrotateright
\let\rotatedown\psrotatedown
% ----------- hv end 2005-09-23 ----------- 1.11
\def\pst@starbox{%
\setbox\pst@hbox\hbox{\psframebox*[boxsep=false]{\unhbox\pst@hbox}}}
\def\pst@@makesmall#1{%
\setbox#1=\hbox to\z@{\hss\vbox to \z@{\vss\box#1\vss}\hss}}
\def\pst@@@makesmall#1{%
\pst@dimh=\psk@xref\wd#1%
\ifx\psk@yref\relax
\pst@dimg=\dp#1%
\else
\pst@dimg=\psk@yref\ht#1%
\advance\pst@dimg\psk@yref\dp#1%
\fi
\setbox#1=\hbox to\z@{%
\kern-\pst@dimh\vbox to\z@{\vss\box#1\kern-\pst@dimg}\hss}}
%
\define@key[psset]{pstricks}{ref}[c]{\pst@expandafter\psset@@ref{#1}\@empty,,\@nil}
\def\psset@@ref#1#2,#3,#4\@nil{%
  \def\psk@xref{.5}%
  \def\psk@yref{.5}%
  \let\pst@makesmall\pst@@@makesmall
  \ifx\@empty#3\@empty
    \@nameuse{getref@#1}%
    \@nameuse{getref@#2}%
  \else
    \pst@checknum{#1#2}\psk@xref
    \pst@checknum{#3}\psk@yref
  \fi}
%
\def\getref@c{\let\pst@makesmall\pst@@makesmall}
\def\getref@t{\def\psk@yref{1}}
\def\getref@b{\def\psk@yref{0}}
\def\getref@B{\let\psk@yref\relax}
\def\getref@l{\def\psk@xref{0}}
\def\getref@r{\def\psk@xref{1}}
\psset[pstricks]{ref=c}
%
%
%  U Up 0 
%  L Left 90 
%  D Down 180 
%  R Right 270
%  
%  N North *0 
%  W West *90 
%  S South *180 
%  E East *270
%
\ifPSTlualatex
  \def\pst@rotlist{ mark RAngle /ps@a ED cleartomark ps@a }%
\else
  \def\pst@rotlist{ mark RAngle /ps@a ED cleartomark ps@a neg }%
\fi

\def\pst@rottable{%
@0=%
@U=%
@L=90 %
@D=180 %
@R=-90 %
@N=\pst@rotlist
@W=\pst@rotlist 90 add %
@S=\pst@rotlist 180 add %
@E=\pst@rotlist 90 sub }
%
\define@key[psset]{pstricks}{rot}[0]{%
  \pst@expandafter{\@ifnextchar*{\psset@@@rot}{\psset@@rot}}{#1}\@nil}
\def\psset@@rot#1\@nil{%
  \def\next##1@#1=##2@##3\@nil{%
    \ifx##2\relax\pst@getangle{#1}\psk@rot \else\def\psk@rot{##2}\fi%
    \pst@Verb{ gsave  STV CP T /ps@rot \ifx\psk@rot\@empty 0 \else \psk@rot \fi def grestore }% (MJS)
  }%
  \expandafter\next\pst@rottable @#1=\relax @\@nil}
%
\def\psset@@@rot#1#2\@nil{%
  \psset@@rot#2\@nil%
  \edef\psk@rot{\pst@rotlist \ifx\psk@rot\@empty\else\space ps@rot add \fi}%
  \pst@Verb{ gsave  STV CP T /ps@rot \ifx\psk@rot\@empty 0 \else \psk@rot \fi def grestore }}% (MJS)
%
%\def\psset@@rot#1\@nil{%
%\def\ps@next##1@#1=##2@##3\@nil{%
%\ifx\relax##2\pst@getangle{#1}\psk@rot\else\def\psk@rot{##2}\fi}%
%\expandafter\ps@next\pst@rottable @#1=\relax @\@nil}
%
%\def\psset@@@rot#1#2\@nil{%
%\psset@@rot#2\@nil
%\edef\psk@rot{\pst@rotlist \ifx\psk@rot\@empty\else\psk@rot add \fi}}
\psset[pstricks]{rot=0}
%
\def\tx@RotBegin{ RotBegin }
\def\tx@RotEnd{ RotEnd }

\def\pst@rotate#1#2{%
  \ifx\relax#1\relax\else  
    \setbox#2=\hbox{\pst@Verb{%  check for empty #1 
      (#1) /strAngle ED strAngle length 0 eq { 0 }{ #1 } ifelse 
	 %\ifPSTlualatex neg \fi 
    \tx@RotBegin}\box#2\pst@Verb{\tx@RotEnd}}%
  \fi
 }%

%    \setbox#2=\hbox{\pst@Verb{%  check for empty #1 
%      (#1) /strAngle ED strAngle length 0 eq { 0 }{ #1 } ifelse 
%	 %\ifPSTlualatex neg \fi 
%    \tx@RotBegin}\box#2\pst@Verb{\tx@RotEnd}}%

\def\psput@cartesian#1{%
\hbox to \z@{\kern\pst@dimg{\vbox to \z@{\vss\box#1\vskip\pst@dimh}\hss}}%
}
\def\psput@special#1{%
  \hbox{%
    \pst@Verb{{ \pst@coor \pstnodescale } \tx@PutCoor \tx@PutBegin }%  20150911 hv
    \box#1%
    \pst@Verb{ \tx@PutEnd }%
  }%
}
\def\tx@PutCoor{PutCoor }
\def\tx@PutBegin{PutBegin }
\def\tx@PutEnd{PutEnd }
\def\rput{\def\pst@par{}\pst@ifstar{\@ifnextchar[{\rput@i}{\rput@ii}}}
\def\rput@i[#1]{%
  \test@for@options#1=\@nil
  \ifnum\the\pst@cntm=\z@ 
    \addto@par{ref={#1}}%
  \else
    \expandafter\addto@par\expandafter{#1}%
  \fi
  \rput@ii
}
\def\test@for@options#1=#2\@nil{%
  \if$#2$%        #2 is empty -> old syntax
    \pst@cntm=\z@
  \else           % something like foo=bar
    \pst@cntm=\@ne
  \fi
}

\def\rput@ii{\@ifnextchar({\rput@iv}{\rput@iii}}
\def\rput@iii#1{\addto@par{rot={#1}}\@ifnextchar({\rput@iv}{\rput@iv(\z@,\z@)}}
\def\rput@iv(#1){\pst@killglue\pst@makebox{\rput@v{#1}}}
\def\rput@v#1{%
    \begingroup
    \use@par
    \if@star\pst@starbox\fi
    \pst@makesmall\pst@hbox
    \ifx\psk@rot\@empty\else\pst@rotate{ ps@rot \ifPSTlualatex neg \fi  }\pst@hbox\fi% (MJS)
%    \pst@rotate\psk@rot\pst@hbox%
    \psput@{#1}\pst@hbox%
  \endgroup
  \ignorespaces}
%
\def\multirput{%
  \def\pst@par{}%
  \pst@ifstar{\@ifnextchar[{\multirput@i}{\multirput@ii}}}
\def\multirput@i[#1]{\addto@par{ref={#1}}\multirput@ii}
\def\multirput@ii{\@ifnextchar({\multirput@iv}{\multirput@iii}}
\def\multirput@iii#1{\addto@par{rot={#1}}\multirput@iv}
\def\multirput@iv(#1){%
  \@ifnextchar({\multirput@v(#1)}{\multirput@v(\z@,\z@)(#1)}}
\def\multirput@v(#1,#2)(#3,#4)#5{%
  \pst@makebox{\multirput@vi(#1,#2)(#3,#4){#5}}}
\def\multirput@vi(#1,#2)(#3,#4)#5{%
  \pst@killglue%
  \global\psLoopIndex=\@ne\relax
  \begingroup
    \use@par
    \if@star\pst@starbox\fi
    \pst@makesmall\pst@hbox
    \ifx\psk@rot\@empty\else\pst@rotate{ps@rot }\pst@hbox\fi% (MJS)
%    \pst@rotate\psk@rot\pst@hbox
    \pssetxlength\pst@dima{#1}%
    \pssetylength\pst@dimb{#2}%
    \pssetxlength\pst@dimc{#3}%
    \pssetylength\pst@dimd{#4}%
    \pst@cntg=#5\relax
    \leavevmode
    \loop
      \vbox to \z@{%
        \vss
        \hbox to \z@{\kern\pst@dima\copy\pst@hbox\hss}%
        \vskip\pst@dimb%
      }%
      \ifnum\pst@cntg>\psLoopIndex
        \advance\pst@dima\pst@dimc
        \advance\pst@dimb\pst@dimd
        \global\advance\psLoopIndex by \@ne
    \repeat 
  \endgroup
  \ignorespaces%
}
%
\newif\if@fixedradius
\def\cput{\def\pst@par{}\pst@object{cput}}
\def\cput@i{\@fixedradiusfalse\cput@ii}
\def\cput@ii{\pst@killglue\@ifnextchar({\cput@iv}{\cput@iii}}
\def\cput@iii#1{%
  \addto@par{rot={#1}}%
  \@ifnextchar({\cput@iv}{\cput@iv(\z@,\z@)}%
}
\def\cput@iv(#1){\pst@makebox{\cput@v{#1}}}
\def\cput@v#1{%
  \begingroup
    \use@par
    \setbox\pst@hbox=\hbox{%
      \psboxsepfalse
      \if@fixedradius\psCirclebox@ii\else\pscirclebox@ii\fi%
    }%
    \pst@@makesmall\pst@hbox
    \ifx\psk@rot\@empty\else\pst@rotate{ps@rot }\pst@hbox\fi% (MJS)
%    \pst@rotate\psk@rot\pst@hbox
    \psput@{#1}\pst@hbox
  \endgroup
  \ignorespaces%
}
%
\def\Cput{\def\pst@par{}\pst@object{Cput}}
\def\Cput@i{\@fixedradiustrue\cput@ii}
\newdimen\pslabelsep
\define@key[psset]{pstricks}{labelsep}[5pt]{%
  \pssetlength\pslabelsep{#1}%
  \ifx\PSTplotLoaded\endinput% Set labels for pst-plot, if laoded
    \let\psxlabelsep\pslabelsep%
    \let\psylabelsep\pslabelsep%
  \fi}
\psset[pstricks]{labelsep=5pt}
%
\define@key[psset]{pstricks}{refangle}[0]{\pst@expandafter\psset@@refangle{#1}\@nil}
\def\psset@@refangle#1\@nil{%
  \def\next##1@#1=##2"##3@##4\@nil{%
    \ifx\relax##2%
      \pst@getangle{#1}\psk@refangle
      \def\psk@uputref{}%
    \else
      \def\psk@refangle{##2 }%
      \def\psk@uputref{##3}%
    \fi}%
  \expandafter\next\pst@refangletable @#1=\relax"@\@nil%
  \pst@Verb{ gsave STV CP T /ps@refangle \psk@refangle\space def grestore }%ADDED (MJS)
}
%
\def\pst@refangletable{%
@r=0"20%
@u=90"02%
@l=180"10%
@d=-90"01%
@ur=45"22%
@ul=135"12%
@dr=-135"21%
@dl=-45"11}
\psset[pstricks]{refangle=0}

% DG/SR modification begin - Mar. 24, 1999 - Patch 10
%\def\uput{\def\pst@par{}\@ifnextchar[{\uput@ii}{\uput@i}}
\def\uput{\def\pst@par{}\pst@ifstar{\@ifnextchar[{\uput@ii}{\uput@i}}} 
% DG/SR modification end
\def\uput@i#1{\addto@par{labelsep=#1}\uput@ii}
%
\def\uput@ii[#1]{%
  \addto@par{refangle={#1}}%
  \@ifnextchar({\uput@iv}{\uput@iii}}
%
\def\uput@iii#1{%
  \addto@par{rot={#1}}%
  \@ifnextchar({\uput@iv}{\uput@iv(\z@,\z@)}}
%
\def\uput@iv(#1){\pst@killglue\pst@makebox{\uput@v{#1}}}
%
\def\uput@v#1{%
  \begingroup
  \use@par
  \if@star\pst@starbox\fi
  \pstCheckCoorType{#1}% needed for \uput@vii
  \uput@vi
  \psput@{#1}\pst@hbox
  \endgroup
  \ignorespaces}
%
\def\uput@vi{%
  \ifx\psk@uputref\@empty\uput@vii\tx@UUput{}%
  \else
    \ifx\psk@rot\@empty\expandafter\uput@viii\psk@uputref
    \else\uput@vii\tx@UUput{}\fi
  \fi}
% 
\def\uput@vii#1#2{%
  \edef\pst@coor{%
    \ifPst@SpecialLength\pst@SpecialLength\else\pst@number\pslabelsep\fi
%    \pst@number\pslabelsep % \ifdim\pslabelsep<\z@  neg \fi
    #2%
    \pst@number{\wd\pst@hbox}%
    \pst@number{\ht\pst@hbox}%
    \pst@number{\dp\pst@hbox}%
    \ifnum\pst@C@@rType=7
      ps@refangle % CHANGED (MJS) FROM \psk@refangle\space
      \ifx\psk@rot\@empty\else ps@rot\space sub \fi
    \else
      \psk@refangle\space 
      \ifx\psk@rot\@empty\else \psk@rot\space sub \fi
    \fi
    \tx@Uput #1}%
    %\show\pst@coor
  \setbox\pst@hbox=\hbox to\z@{\hss\vbox to\z@{\vss\box\pst@hbox\vss}\hss}%
  \setbox\pst@hbox=\psput@special\pst@hbox
  \ifPSTlualatex
    \ifnum\pst@C@@rType=7
      \ifx\psk@rot\@empty\else\pst@rotate{ps@rot neg}\pst@hbox\fi% CHANGED FROM \psk@rot (MJS)
    \else
      \ifx\psk@rot\@empty\else\pst@rotate{\psk@rot\space neg}\pst@hbox\fi% 
    \fi
  \else
    \ifnum\pst@C@@rType=7
      \ifx\psk@rot\@empty\else\pst@rotate{ps@rot }\pst@hbox\fi% CHANGED FROM \psk@rot (MJS)
    \else
      \ifx\psk@rot\@empty\else\pst@rotate{\psk@rot}\pst@hbox\fi% 
    \fi
  \fi
}
%
%
\def\uput@viii#1#2{%
  \ifnum#1>\z@\relax\ifnum#2>\z@\relax\pslabelsep=.707\pslabelsep\fi\fi
  \setbox\pst@hbox=\vbox to\z@{%
    \ifnum#2=1\relax\vskip\pslabelsep\else\vss\fi
    \hbox to\z@{%
      \ifnum#1=2\relax\hskip\pslabelsep \else\hss\fi
      \box\pst@hbox%
      \ifnum#1=1\relax\hskip\pslabelsep\else\hss\fi}%
    \ifnum#2=2\relax\vskip\pslabelsep\else\vss\fi}}
%
\def\tx@Uput{Uput }
\def\tx@UUput{UUput }
%
\def\Rput{\def\pst@par{}\pst@ifstar{\@ifnextchar[{\Rput@ii}{\Rput@i}}}
\def\Rput@i#1{\addto@par{labelsep=#1}\Rput@ii}
\def\Rput@ii[#1]{\addto@par{ref={#1}}\@ifnextchar({\Rput@iv}{\Rput@iii}}
\def\Rput@iii#1{\addto@par{rot={#1}}\@ifnextchar({\Rput@iv}{\Rput@iv(\z@,\z@)}}
\def\Rput@iv(#1){\pst@killglue\pst@makebox{\Rput@v{#1}}}
\def\Rput@v#1{%
  \begingroup
  \use@par
  \if@star\pst@starbox\fi
  \Rput@vi
  \pst@makesmall\pst@hbox
  \ifx\psk@rot\@empty\else\pst@rotate{ps@rot }\pst@hbox\fi% (MJS)
%  \pst@rotate\psk@rot\pst@hbox
  \psput@{#1}\pst@hbox
  \endgroup
  \ignorespaces}
%
\def\Rput@vi{%
  \pst@dimg=\dp\pst@hbox
  \advance\pst@dimg\pslabelsep
  \dp\pst@hbox=\pst@dimg
  \pst@dimg=\ht\pst@hbox
  \advance\pst@dimg\pslabelsep
  \ht\pst@hbox=\pst@dimg
  \setbox\pst@hbox\hbox{\kern\pslabelsep\box\pst@hbox\kern\pslabelsep}}%
%
\def\oldpsput{\def\pst@par{}\pst@ifstar{\@ifnextchar[{\oldpsput@i}{\oldpsput@ii}}}
\def\oldpsput@i[#1]{\addto@par{ref={#1}}\oldpsput@ii}
\def\oldpsput@ii{\@ifnextchar<{\oldpsput@iii}{\oldpsput@iv}}
\def\oldpsput@iii<#1>{\rput@iii{#1}}
\def\OldPsput{\let\psput\oldpsput}
\def\NewPsput{\let\psput\rput}
%
% -----------  hv 20120219 -------------------
\newpsstyle{gridstyle}{subgriddiv=0,gridcolor=lightgray,griddots=10,gridlabels=8pt}
\newpsstyle{gridstyleA}{subgriddiv=5,gridcolor=red!30,subgridcolor=green!20!black!10,gridlabels=0pt}
\newif\ifshowgrid
\newdimen\sh@wgridXunit
\newdimen\sh@wgridYunit

\def\pst@@showgrid#1#2#3\@nil{%                            hv 20130403
  \def\showgridp@s{0}%
  \ifx#1b\showgridtrue\else%                               bottom
    \ifx#1f\showgridfalse\else
      \ifx#1t
        \ifx#2r \showgridtrue\else%  			   true->bottom
                \showgridtrue\def\showgridp@s{1}\fi%        top
  \fi\fi\fi
  \ifnum\showgridp@s>0\relax
    \sh@wgridXunit=\psxunit
    \sh@wgridYunit=\psyunit
  \fi
}

\define@key[psset]{pstricks}{showgrid}[b]{\expandafter\pst@@showgrid#1!!\@nil}
\define@boolkey[psset]{pstricks}[Pst@]{showframe}[true]{}
\define@boolkey[psset]{pstricks}[Pst@]{calcframe}[true]{}
\psset[pstricks]{showgrid=f,showframe=false,calcframe=false}

\define@boolkey[psset]{pstricks}[Pst@]{pgffunctions}[true]{}
\psset[pstricks]{pgffunctions=false}
%
\newdimen\pst@shift
\newif\ifPst@shift@star
\define@key[psset]{pstricks}{shift}[0]{%
  \ifx#1*
    \global\Pst@shift@startrue
    \pst@shift=\p@
  \else
    \global\Pst@shift@starfalse
    \pssetlength\pst@dimg{#1}
    \global\pst@shift\pst@dimg%   only the outer pspicture env can have a shift
  \fi}
\psset[pstricks]{shift=0}
%
%------------------------------- pspicture ------------------------------
%
\def\ps@readmargin#1,#2,#3,#4,#5\@nil{%
  \ifx\\#2\\
%    \typeout{>>> Case 1 para}%
    \pst@getlength{#1}\ps@margin@left
    \let\ps@margin@right\ps@margin@left
    \let\ps@margin@top\ps@margin@left
    \let\ps@margin@bottom\ps@margin@left
  \else
    \ifx\\#3\\%
%        \typeout{>>> Case 2 para: #1,#2}%
        \pst@getlength{#1}\ps@margin@left
        \def\ps@margin@right{0}%        
        \pst@getlength{#2}\ps@margin@bottom
        \def\ps@margin@top{0}
    \else
%        \typeout{>>> Case 4 para: #1,#2,#3,#4}%
        \pst@getlength{#1}\ps@margin@left
        \pst@getlength{#2}\ps@margin@bottom
        \pst@getlength{#3}\ps@margin@right
        \pst@getlength{#4}\ps@margin@top
    \fi\fi
%\typeout{>>>>>>>>>\ps@margin@left,\ps@margin@bottom,\ps@margin@right,\ps@margin@top}%
}%
\define@key[psset]{pstricks}{margin}[0pt]{\ps@readmargin#1,,,,\@nil}
\psset[pstricks]{margin=0pt}
%
\newcount\ps@imagectr
\ps@imagectr=0
%\newif\ifPst@findcoor
%\Pst@findcoorfalse
%

\def\pspicture{\begingroup\pst@ifstar\pst@picture}
\def\pst@picture{\@ifnextchar[{\pst@@picture}{\pst@@picture[]}}
\def\pst@@picture[#1]{\@ifnextchar({\pst@@picture@i[#1]}{\pst@@picture@@i[#1]}}%
\def\pst@@picture@@i[#1]{%
  \def\pic@coor{(0,0)(0,0)}%
%  \gdef\pscoor{(10,10)}%
  \ifPst@calcframe
    \typeout{>>>Check for file \jobname-\the\numexpr\ps@imagectr+1.psaux}%
    \IfFileExists{\jobname-\the\numexpr\ps@imagectr+1.psaux}
      {\input{\jobname-\the\numexpr\ps@imagectr+1.psaux}%
       \xdef\pic@coor{(0,0)\pscoor}%
       \typeout{----->>\pic@coor}%
       \typeout{----->>\pscoor}%
      }
      {%\gdef\pscoor{(10,10)}
       %\def\pic@coor{(0,0)(0,0)(10,10)}
       }%
    %  \typeout{>>>\pscoor}%
  \fi
  \edef\@temp{[\noexpand#1]\pscoor}%
  \expandafter\pst@@picture@i\@temp}
%
\def\pst@@picture@i[#1]#2(#3,#4){\@ifnextchar(%   ignore anything between [] and ()
  {\pst@@@picture[#1](#3,#4)}%
  {\pst@@@picture[#1](0,0)(#3,#4)}}
%
\def\pst@@@picture[#1](#2,#3)(#4,#5){%
  \pssetxlength\pst@dima{#2}%
  \pssetylength\pst@dimb{#3}%
  \pssetxlength\pst@dimc{#4}%
  \pssetylength\pst@dimd{#5}%
  \pstVerb{/xCanvasLeft \pst@number\pst@dima def
           /yCanvasLeft \pst@number\pst@dimb def
           /xCanvasRight \pst@number\pst@dimc def
           /yCanvasRight \pst@number\pst@dimd def 
  }%
  \ifdim\pst@dima>\pst@dimc
    \pst@dimg=\pst@dima 
    \pst@dima=\pst@dimc
    \pst@dimc=\pst@dimg
  \fi
  \ifdim\pst@dimb>\pst@dimd
    \pst@dimg=\pst@dimb
    \pst@dimb=\pst@dimd
    \pst@dimd=\pst@dimg
  \fi
  \setbox\pst@hbox=\hbox\bgroup
  \begingroup\KillGlue
  \@ifundefined{@latexerr}{}{\let\unitlength\psunit}%
  \edef\pic@coor{(#2,#3)(#2,#3)(#4,#5)}%
% ----------- 1.10/12 beg hv -------------------
  \psset{showgrid=false}%                % for nested pspicture environemnets
  \def\pst@tempA{#1}%
  \ifx\pst@tempA\@empty\else\psset{#1}\fi% sets the shift and grid option
  \ifx\pst@bgcolor\@empty\else\psframe*[linecolor=\pst@bgcolor](#2,#3)(#4,#5)\fi
  \ifshowgrid\ifnum\showgridp@s=0\psgrid[style=gridstyle]\fi\fi
% ----------- 1.10/12 end hv -------------------
  \ignorespaces%			% 2008-12-07
  \ifPst@calcframe\pstVerb{ .trackbbox }\global\advance\ps@imagectr by 1 \fi
  \ifPst@pgffunctions\pstVerb{ pgffunctions }\fi% hv 2013-04-17
}

%\def\pic@coor{(0,0)(0,0)(10,10)}
\def\endpspicture{%
  \ifPst@calcframe
    \ifPSTlualatex   
     \pstVerb{
     .trackedbbox        % xmin ymin xmax ymax
     % Die Koordinaten sind relativ zur Seite, also verschieben wir sie
     % zum aktuellen Punkt.
     currentpoint matrix translate dup invertmatrix dup 4 1 roll
     transform
     /YMAX exch def /XMAX exch def
     transform
     /YMIN exch def /XMIN exch def
     % Now we have all absolute coordinates
     \ifPst@showframe
       % Um jetzt an diesen Koordinaten zu zeichnen, ist das natürlich
       % ungünstig und wir müssen zurück schieben... (Oder den Code
       % umordnen, aber warum einfach wenns auch kompliziert geht ;P)
       XMIN YMIN XMAX XMIN sub YMAX YMIN sub    % lower left, width, height
       4 copy
       gsave 
       currentpoint translate newpath rectstroke 
       newpath 0 0 moveto                                            % x0 y0 x1 y1
       \ps@margin@top\space add \ps@margin@bottom\space add 4 1 roll % y1 x0 y0 x1 
       \ps@margin@right\space add \ps@margin@left\space add 4 1 roll % x1 y1 x0 y0
       \ps@margin@bottom\space sub 4 1 roll                          % y0 x1 y1 x0 
       \ps@margin@left\space sub   4 1 roll                          % x0 y0 x1 y1
       [3 3] 0 setdash rectstroke 
       grestore 
     \fi
     (\jobname-\the\ps@imagectr.psaux) (w) file /CoorFile exch def
     (\\gdef\\pscoor{\string\() CoorFile exch writestring
     XMIN %\pst@number\psxunit div 
     \ps@margin@left\space sub 20 string cvs CoorFile exch writestring
     (pt, ) CoorFile exch writestring
     YMIN %\pst@number\psyunit div 
     \ps@margin@bottom\space sub 20 string cvs CoorFile exch writestring
     (pt\string\)\string\() CoorFile exch writestring
     XMAX %\pst@number\psxunit div 
     \ps@margin@right\space add 20 string cvs CoorFile exch writestring
     (pt, ) CoorFile exch writestring
     YMAX %\pst@number\psyunit div 
     \ps@margin@top\space add 20 string cvs CoorFile exch writestring
     (pt\string\)}\% ) CoorFile exch writestring
     %(Unit is \pst@number\psyunit/\pst@number\psyunit) 40 string cvs CoorFile exch writestring
     CoorFile closefile
     }%  
  \else
    \global\Pst@calcframefalse
    \PackageError{PSTricks}{You need to run lualatex for calculating the bounding box or set calcframe=false}{}%\@ehpa
  \fi
  \fi
  \ifshowgrid\ifnum\showgridp@s>0
    \psgrid[xunit=\sh@wgridXunit,yunit=\sh@wgridYunit,style=gridstyle]\fi\fi
  \pst@killglue
  \endgroup
  \egroup
  \ht\pst@hbox=\pst@dimd
  \dp\pst@hbox=-\pst@dimb
  \setbox\pst@hbox=\hbox{%
    \kern-\pst@dima
    \ifPst@shift@star%\typeout{==pstricks== old behaviour of the shift option}%     shift=*
      \advance\pst@dimd-\pst@dimb
      \pst@dimd=0.5\pst@dimd
    \else\pst@dimd-\pst@shift\fi
    \advance\pst@dimd\pst@dimb
    \lower\pst@dimd\box\pst@hbox
    \kern\pst@dimc}%
  \if@star\setbox\pst@hbox=\hbox{\psclipbox@@\z@}\fi
  \leavevmode
  \ifPst@draft
    \expandafter\ifx\csname @latexerr\endcsname\relax
      \box\pst@hbox
    \else%	do we have LaTeX? 
      \fboxsep=0pt
      \fbox{\rule[-\pst@shift]{0pt}{\ht\pst@hbox}\rule{\wd\pst@hbox}{0pt}}%
    \fi
  \else
    \box\pst@hbox
  \fi
  \endgroup
  \psset[pstricks]{shift=0}% reset value
}
%
\@namedef{pspicture*}{\pspicture*}
\@namedef{endpspicture*}{\endpspicture}
%
\ifx\pstcustomize\relax \input pstricks.con \fi
%%% changed 20230430 by hv, confuses otherwise the dvi color handling
\ifluatex\pstVerb{0.8 setlinewidth 0 setgray}\fi%    default setting (needed for lualatex)
%%%
\catcode`\@=\PstAtCode\relax
%
\endinput
%%
%% END: pstricks.tex
