% Copyright 2018 by Till Tantau and Mark Wibrow
%
% This file may be distributed and/or modified
%
% 1. under the LaTeX Project Public License and/or
% 2. under the GNU Public License.
%
% See the file doc/generic/pgf/licenses/LICENSE for more details.

\ProvidesFileRCS{pgflibraryshapes.arrows.code.tex}


% keys for shape single arrow
%
% /pgf/single arrow tip angle
% /pgf/single arrow head extend
% /pgf/single arrow head indent

\pgfkeys{/pgf/.cd,
    single arrow tip angle/.initial=90,
    single arrow head extend/.initial=.25cm,
    single arrow head indent/.initial=0cm,
}%

% Shape single arrow
%
%
\pgfdeclareshape{single arrow}{%
    \savedmacro\getsinglearrowpoints{%
        %
        % Get the outer sep.
        %
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
        \edef\xoutersep{\the\pgf@x}%
        \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
        \edef\youtersep{\the\pgf@y}%
        %
        % Get the node dimensions.
        %
        \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/inner xsep}}%
        \advance\pgf@xa.5\wd\pgfnodeparttextbox%
        \advance\pgf@xa.5\pgflinewidth%
        \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/inner ysep}}%
        \advance\pgf@ya.5\ht\pgfnodeparttextbox%
        \advance\pgf@ya.5\dp\pgfnodeparttextbox%
        \advance\pgf@ya.5\pgflinewidth%
        \ifpgfshapeborderusesincircle%
            \ifdim\pgf@xa<\pgf@ya%
                \pgf@xa\pgf@ya%
            \fi%
            \pgf@xa1.41421\pgf@xa%
            \pgf@ya\pgf@xa%
            \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}%
            \ifdim\xoutersep>\youtersep\relax%
                \let\youtersep\xoutersep%
            \else%
                \let\xoutersep\youtersep%
            \fi%
        \else%
            %
            % Round the rotation.
            %
            \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}%
            \pgfmathmod@{\rotate}{360}%
            \afterassignment\pgfmath@gobbletilpgfmath@%
            \expandafter\c@pgf@counta\pgfmathresult\relax\pgfmath@%
            \advance\c@pgf@counta45\relax%
            \divide\c@pgf@counta90\relax%
            \multiply\c@pgf@counta90\relax%
            \ifnum\c@pgf@counta<0\relax%
                \advance\c@pgf@counta360\relax%
            \fi%
            \edef\rotate{\the\c@pgf@counta}%
            %
            % Calculate the width and height of the node
            % contents, according to any border rotation.
            %
            \ifnum\c@pgf@counta=90\relax%
                \pgf@x\pgf@xa%
                \pgf@xa\pgf@ya%
                \pgf@ya\pgf@x%
                \let\pgfmathresult\xoutersep%
                \let\xoutersep\youtersep%
                \let\youtersep\pgfmathresult%
            \else%
                \ifnum\c@pgf@counta=270\relax%
                    \pgf@x\pgf@xa%
                    \pgf@xa\pgf@ya%
                    \pgf@ya\pgf@x%
                    \let\pgfmathresult\xoutersep%
                    \let\xoutersep\youtersep%
                    \let\youtersep\pgfmathresult%
                \fi%
            \fi%
        \fi%
        \addtosavedmacro\rotate%
        %
        % Get some useful trig stuff.
        %
        \pgfmathdivide{\pgfkeysvalueof{/pgf/single arrow tip angle}}{2}%
        \let\halftipangle\pgfmathresult%
        \pgfmathcosec@{\halftipangle}%
        \let\cosechalftipangle\pgfmathresult%
        \pgfmathcos@{\halftipangle}%
        \pgfutil@tempdima\pgfmathresult pt\relax%
        \pgfutil@tempdima\cosechalftipangle\pgfutil@tempdima%
        \edef\cothalftipangle{\pgfmath@tonumber{\pgfutil@tempdima}}%
        \pgfmathreciprocal@{\pgfmathresult}%
        \let\sechalftipangle\pgfmathresult%
        \pgfmathsin@{\halftipangle}%
        \pgfutil@tempdima\pgfmathresult pt\relax%
        \pgfutil@tempdima\sechalftipangle\pgfutil@tempdima%
        \edef\tanhalftipangle{\pgfmath@tonumber{\pgfutil@tempdima}}%
        %
        % Get the single arrow head extend, and adjust for minimum width.
        %
        \pgf@xb\pgf@ya%
        \pgf@xb\cothalftipangle\pgf@xb%
        \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/single arrow head extend}}%
        \pgf@yc\pgf@xc%
        \advance\pgf@xc\pgf@ya%
        \pgfmathsetlength\pgfutil@tempdimb{\pgfkeysvalueof{/pgf/minimum width}}%
        \ifdim\pgf@xc<.5\pgfutil@tempdimb%
            \pgfutil@tempdimb.5\pgfutil@tempdimb%
            \pgfmathdivide@{\pgfmath@tonumber{\pgfutil@tempdimb}}{\pgfmath@tonumber{\pgf@xc}}%
            \pgf@ya\pgfmathresult\pgf@ya%
            \pgf@xc\pgfmathresult\pgf@xc%
            \pgf@yc\pgfmathresult\pgf@yc%
            \pgf@xb\pgfmathresult\pgf@xb%
        \fi%
        %
        % Now calculate the height of the arrow and adjust for minimum height.
        %
        \advance\pgf@xc-\pgf@ya%
        \pgf@xc\cothalftipangle\pgf@xc%
        \pgf@xa2.0\pgf@xa%
        \advance\pgf@xa\pgf@xb%
        \pgfmathsetlength\pgfutil@tempdimb{\pgfkeysvalueof{/pgf/minimum height}}%
        \ifdim\pgf@xa<\pgfutil@tempdimb%
            \pgf@xa\pgfutil@tempdimb%
        \fi%
        \advance\pgf@xa-\pgf@xb%
        \pgf@xa.5\pgf@xa%
        \pgfmathsetlength\pgfutil@tempdima{\pgfkeysvalueof{/pgf/single arrow head indent}}%
        %
        % Now:
        %
        % xa - .5 * width of the node minus xb.
        % ya - .5 * height of the node contents.
        % xb - distance from the end of the node contents to the arrow tip.
        % xc - distance from the end of the node contents to the back end of the arrow head.
        % yc - distance from the top of the node contents to the top end of the arrow head.
        %
        \pgfsavepgf@process\centerpoint{%
            \pgf@x.5\wd\pgfnodeparttextbox%
            \pgf@y.5\ht\pgfnodeparttextbox%
            \advance\pgf@y-.5\dp\pgfnodeparttextbox%
        }%
        \pgfsavepgf@process\basepoint{%
            \pgf@x.5\wd\pgfnodeparttextbox%
            \pgf@y0pt%
        }%
        \pgfsavepgf@process\midpoint{%
            \pgf@x.5\wd\pgfnodeparttextbox%
            \pgfmathsetlength\pgf@y{+.5ex}%
        }%
        %
        % As the arrow is symmetrical it can be described by only four points:
        %
        \pgfsavepgf@process\arrowtip{%
            \pgf@x\pgf@xa%
            \advance\pgf@x\pgf@xb%
            \pgf@y0pt\relax%
        }%
        \pgfsavepgf@process\beforearrowtip{%
            \pgf@x\pgf@xa%
            \advance\pgf@x-\pgf@xc%
            \pgf@y\pgf@ya%
            \advance\pgf@y\pgf@yc%
        }%
        \pgfsavepgf@process\beforearrowhead{%
            \pgf@x\pgf@xa%
            \advance\pgf@x-\pgf@xc%
            \advance\pgf@x\pgfutil@tempdima%
            \pgf@y\pgf@ya%
        }%
        \pgfsavepgf@process\afterarrowtail{%
            \pgf@x-\pgf@xa%
            \pgf@y\pgf@ya%
        }%
        %
        % Calculate the anchor point at the arrow tip...
        %
        \pgfsavepgf@process\arrowtipanchor{%
            \pgfpointadd{\centerpoint}{\arrowtip}%
            \pgf@xa\xoutersep\relax%
            \advance\pgf@x\cosechalftipangle\pgf@xa%
        }%
        \advance\pgf@x.5\wd\pgfnodeparttextbox%
        \edef\externalradius{\the\pgf@x}%
        \addtosavedmacro\externalradius%
        %
        % ...and the rest of the points.
        %
        \pgfmathanglebetweenlines{\beforearrowtip}{\beforearrowhead}{\beforearrowtip}{\arrowtip}%
        \pgf@xa\xoutersep\relax%
        \pgfutil@tempdima\pgfmathresult pt\relax%
        \pgfutil@tempdima.5\pgfutil@tempdima%
        \pgfmathcosec@{\pgfmath@tonumber{\pgfutil@tempdima}}%
        \pgf@xa\pgfmathresult\pgf@xa%
        \pgfutil@tempdima-\pgfutil@tempdima%
        \advance\pgfutil@tempdima180pt\relax%
        \advance\pgfutil@tempdima-\halftipangle pt\relax%
        %
        \pgfsavepgf@process\beforearrowtipanchor{%
            \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgf@xa}%
            \pgf@xb\pgf@x%
            \pgf@yb\pgf@y%
            \pgf@process{\pgfpointadd{\centerpoint}{\beforearrowtip}}%
            \advance\pgf@x\pgf@xb%
            \advance\pgf@y\pgf@yb%
        }%
        \pgfmathanglebetweenpoints{\beforearrowhead}{\beforearrowtip}%
        \pgfutil@tempdima-\pgfmathresult pt\relax%
        \advance\pgfutil@tempdima180pt\relax%
        \pgfutil@tempdima.5\pgfutil@tempdima%
        \pgfmathcosec@{\pgfmath@tonumber{\pgfutil@tempdima}}%
        \pgf@xa\xoutersep\relax%
        \pgf@xa\pgfmathresult\pgf@xa%
        \pgfutil@tempdima-\pgfutil@tempdima%
        \advance\pgfutil@tempdima180pt\relax%
        \pgfsavepgf@process\beforearrowheadanchor{%
            \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgf@xa}%
            \pgf@xb\pgf@x%
            \pgf@yb\pgf@y%
            \pgf@process{\pgfpointadd{\centerpoint}{\beforearrowhead}}%
            \advance\pgf@x\pgf@xb%
            \advance\pgf@y\pgf@yb%
        }%
        \pgfsavepgf@process\afterarrowtailanchor{%
            \pgfpointadd{\centerpoint}{\afterarrowtail}%
            \advance\pgf@x-\xoutersep\relax%
            \advance\pgf@y\youtersep\relax%
        }%
        %
        \pgfmathanglebetweenpoints{\centerpoint}{\beforearrowtipanchor}%
        \let\center@angle@beforearrowtip\pgfmathresult%
        \pgfmathanglebetweenpoints{\centerpoint}{\beforearrowheadanchor}%
        \let\center@angle@beforearrowhead\pgfmathresult%
        \pgfmathanglebetweenpoints{\centerpoint}{\afterarrowtailanchor}%
        \let\center@angle@afterarrowtail\pgfmathresult%
        \addtosavedmacro\center@angle@beforearrowtip%
        \addtosavedmacro\center@angle@beforearrowhead%
        \addtosavedmacro\center@angle@afterarrowtail%
        %
        \pgfmathanglebetweenpoints{\midpoint}{\beforearrowtipanchor}%
        \let\mid@angle@beforearrowtip\pgfmathresult%
        \pgfmathanglebetweenpoints{\midpoint}{\beforearrowheadanchor}%
        \let\mid@angle@beforearrowhead\pgfmathresult%
        \pgfmathanglebetweenpoints{\midpoint}{\afterarrowtailanchor}%
        \let\mid@angle@afterarrowtail\pgfmathresult%
        \addtosavedmacro\mid@angle@beforearrowtip%
        \addtosavedmacro\mid@angle@beforearrowhead%
        \addtosavedmacro\mid@angle@afterarrowtail%
        %
        \pgfmathanglebetweenpoints{\basepoint}{\beforearrowtipanchor}%
        \let\base@angle@beforearrowtip\pgfmathresult%
        \pgfmathanglebetweenpoints{\basepoint}{\beforearrowheadanchor}%
        \let\base@angle@beforearrowhead\pgfmathresult%
        \pgfmathanglebetweenpoints{\basepoint}{\afterarrowtailanchor}%
        \let\base@angle@afterarrowtail\pgfmathresult%
        \addtosavedmacro\base@angle@beforearrowtip%
        \addtosavedmacro\base@angle@beforearrowhead%
        \addtosavedmacro\base@angle@afterarrowtail%
        %
        \addtosavedmacro\arrowtipanchor%
        \addtosavedmacro\beforearrowtipanchor%
        \addtosavedmacro\beforearrowheadanchor%
        \addtosavedmacro\afterarrowtailanchor%
    }%
    \savedanchor\centerpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y.5\ht\pgfnodeparttextbox%
        \advance\pgf@y-.5\dp\pgfnodeparttextbox%
    }%
    \savedanchor\midpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgfmathsetlength\pgf@y{+0.5ex}%
    }%
    \savedanchor\basepoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y0pt%
    }%
    \anchor{center}{\centerpoint}%
    \anchor{mid}{\midpoint}%
    \anchor{mid east}{%
        \getsinglearrowpoints%
        \let\pgf@singlearrow@referencepoint\midpoint%
        \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
    }%
    \anchor{mid west}{%
        \getsinglearrowpoints%
        \let\pgf@singlearrow@referencepoint\midpoint%
        \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
    }%
    \anchor{base}{\basepoint}%
    \anchor{base east}{%
        \getsinglearrowpoints%
        \let\pgf@singlearrow@referencepoint\basepoint%
        \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
    }%
    \anchor{base west}{%
        \getsinglearrowpoints%
        \let\pgf@singlearrow@referencepoint\basepoint%
        \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
    }%
    \anchor{north}{%
        \getsinglearrowpoints%
        \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{0pt}{\externalradius}}%
    }%
    \anchor{south}{%
        \getsinglearrowpoints%
        \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{0pt}{-\externalradius}}%
    }%
    \anchor{east}{%
        \getsinglearrowpoints%
        \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
    }%
    \anchor{west}{%
        \getsinglearrowpoints%
        \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
    }%
    \anchor{north east}{%
        \getsinglearrowpoints%
        \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{\externalradius}{\externalradius}}%
    }%
    \anchor{south east}{%
        \getsinglearrowpoints%
        \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{\externalradius}{-\externalradius}}%
    }%
    \anchor{south west}{%
        \getsinglearrowpoints%
        \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{-\externalradius}{-\externalradius}}%
    }%
    \anchor{north west}{%
        \getsinglearrowpoints%
        \csname pgf@anchor@single arrow@border\endcsname{\pgfqpoint{-\externalradius}{\externalradius}}%
    }%
    \anchor{before head}{%
        \getsinglearrowpoints%
        \pgfmathrotatepointaround{\beforearrowheadanchor}{\centerpoint}{\rotate}%
    }%
    \anchor{before tip}{%
        \getsinglearrowpoints%
        \pgfmathrotatepointaround{\beforearrowtipanchor}{\centerpoint}{\rotate}%
    }%
    \anchor{tip}{%
        \getsinglearrowpoints%
        \pgfmathrotatepointaround{\arrowtipanchor}{\centerpoint}{\rotate}%
    }%
    \anchor{after tip}{%
        \getsinglearrowpoints%
        \pgfmathrotatepointaround{%
            \pgfpointadd{%
                \pgfpointdiff{\centerpoint}{\beforearrowtipanchor}%
                \pgf@y-\pgf@y%
            }{\centerpoint}}%
        {\centerpoint}{\rotate}%
    }%
    \anchor{after head}{%
        \getsinglearrowpoints%
        \pgfmathrotatepointaround{%
            \pgfpointadd{%
                \pgfpointdiff{\centerpoint}{\beforearrowheadanchor}%
                \pgf@y-\pgf@y%
            }{\centerpoint}}%
        {\centerpoint}{\rotate}%
    }%
    \anchor{before tail}{%
        \getsinglearrowpoints%
        \pgfmathrotatepointaround{%
            \pgfpointadd{%
                \pgfpointdiff{\centerpoint}{\afterarrowtailanchor}%
                \pgf@y-\pgf@y%
            }{\centerpoint}}%
        {\centerpoint}{\rotate}%
    }%
    \anchor{after tail}{%
        \getsinglearrowpoints%
        \pgfmathrotatepointaround{\afterarrowtailanchor}{\centerpoint}{\rotate}%
    }%
    \anchor{tail}{%
        \getsinglearrowpoints%
        \pgfpointlineattime{0.5}{%
            \pgfmathrotatepointaround{\afterarrowtailanchor}{\centerpoint}{\rotate}%
        }%
        {%
            \pgfmathrotatepointaround{%
            \pgfpointadd{%
                \pgfpointdiff{\centerpoint}{\afterarrowtailanchor}%
                \pgf@y-\pgf@y%
            }{\centerpoint}}%
            {\centerpoint}{\rotate}%
        }%
    }%
    \backgroundpath{%
        {%
            \pgftransformshift{\centerpoint}%
            \pgftransformrotate{\rotate}%
            \pgfpathmoveto{\arrowtip}%
            \pgfpathlineto{\beforearrowtip}%
            \pgfpathlineto{\beforearrowhead}%
            \pgfpathlineto{\afterarrowtail}%
            \pgfpathlineto{\afterarrowtail\pgf@y-\pgf@y}%
            \pgfpathlineto{\beforearrowhead\pgf@y-\pgf@y}%
            \pgfpathlineto{\beforearrowtip\pgf@y-\pgf@y}%
        }%
        \pgfpathclose%
    }%
    \anchorborder{%
        \pgfsavepgf@process\externalpoint{}%
        \getsinglearrowpoints%
        \pgfutil@ifundefined{pgf@singlearrow@referencepoint}{\let\referencepoint\centerpoint}%
            {\let\referencepoint\pgf@singlearrow@referencepoint}%
        \pgfsavepgf@process\externalpoint{%
            \externalpoint%
            \pgf@xa\pgf@x%
            \pgf@ya\pgf@y%
            \referencepoint%
            \advance\pgf@x\pgf@xa%
            \advance\pgf@y\pgf@ya}%
        \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
        \pgfmathsubtract@{\pgfmathresult}{\rotate}%
        \ifdim\pgfmathresult pt<0pt\relax%
            \pgfmathadd@{\pgfmathresult}{360}%
        \fi%
        \let\externalangle\pgfmathresult%
        \pgf@x\externalangle pt\relax%
        \ifx\referencepoint\midpoint%
            \pgf@xa\mid@angle@beforearrowtip pt\relax%
            \pgf@xb\mid@angle@beforearrowhead pt\relax%
            \pgf@xc\mid@angle@afterarrowtail pt\relax%
        \else%
            \ifx\referencepoint\basepoint%
                \pgf@xa\base@angle@beforearrowtip pt\relax%
                \pgf@xb\base@angle@beforearrowhead pt\relax%
                \pgf@xc\base@angle@afterarrowtail pt\relax%
            \else%
                \pgf@xa\center@angle@beforearrowtip pt\relax%
                \pgf@xb\center@angle@beforearrowhead pt\relax%
                \pgf@xc\center@angle@afterarrowtail pt\relax%
            \fi%
        \fi%
        \ifdim\pgf@x<\pgf@xa%
            \let\firstpoint\arrowtipanchor%
            \let\secondpoint\beforearrowtipanchor%
        \else%
            \ifdim\pgf@x<\pgf@xb%
                \ifdim\pgf@xb<\pgf@xa%
                    \let\firstpoint\arrowtipanchor%
                    \let\secondpoint\beforearrowtipanchor%
                \else%
                    \let\firstpoint\beforearrowheadanchor%
                    \let\secondpoint\beforearrowtipanchor%
                \fi%
            \else%
                \ifdim\pgf@x<\pgf@xc%
                    \let\firstpoint\beforearrowheadanchor%
                    \let\secondpoint\afterarrowtailanchor%
                \else%
                    \pgf@xc-\pgf@xc%
                    \advance\pgf@xc360pt\relax%
                    \ifdim\pgf@x<\pgf@xc%
                        \let\firstpoint\afterarrowtailanchor%
                        \pgfsavepgf@process\secondpoint{%
                            \pgfpointadd{%
                                \pgfpointdiff{\centerpoint}{\afterarrowtailanchor}%
                                \pgf@y-\pgf@y%
                            }{\centerpoint}%
                        }%
                    \else%
                        \pgf@xa-\pgf@xa%
                        \advance\pgf@xa360pt\relax%
                        \pgf@xb-\pgf@xb%
                        \advance\pgf@xb360pt\relax%
                        \ifdim\pgf@x<\pgf@xa%
                            \ifdim\pgf@x<\pgf@xb%
                                \pgfsavepgf@process\firstpoint{%
                                    \pgfpointadd{%
                                            \pgfpointdiff{\centerpoint}{\afterarrowtailanchor}%
                                            \pgf@y-\pgf@y%
                                    }{\centerpoint}%
                                }%
                                \pgfsavepgf@process\secondpoint{%
                                    \pgfpointadd{%
                                        \pgfpointdiff{\centerpoint}{\beforearrowheadanchor}%
                                        \pgf@y-\pgf@y%
                                    }{\centerpoint}%
                                }%
                            \else%
                                \ifdim\pgf@xb<\pgf@xa%
                                    \pgfsavepgf@process\firstpoint{%
                                        \pgfpointadd{%
                                                \pgfpointdiff{\centerpoint}{\beforearrowheadanchor}%
                                                \pgf@y-\pgf@y%
                                        }{\centerpoint}%
                                    }%
                                \else%
                                    \pgfsavepgf@process\firstpoint{%
                                        \pgfpointadd{%
                                                \pgfpointdiff{\centerpoint}{\arrowtipanchor}%
                                                \pgf@y-\pgf@y%
                                        }{\centerpoint}%
                                    }%
                                \fi%
                                \pgfsavepgf@process\secondpoint{%
                                        \pgfpointadd{%
                                            \pgfpointdiff{\centerpoint}{\beforearrowtipanchor}%
                                            \pgf@y-\pgf@y%
                                        }{\centerpoint}%
                                    }%
                            \fi%
                        \else%
                            \pgfsavepgf@process\firstpoint{%
                                \pgfpointadd{%
                                    \pgfpointdiff{\centerpoint}{\beforearrowtipanchor}%
                                    \pgf@y-\pgf@y%
                                }{\centerpoint}%
                            }%
                            \let\secondpoint\arrowtipanchor%
                        \fi%
                    \fi%
                \fi%
            \fi%
        \fi%
        \pgfsavepgf@process\firstpoint{%
            \pgfmathrotatepointaround{\firstpoint}{\centerpoint}{\rotate}%
        }%
        \pgfsavepgf@process\secondpoint{%
            \pgfmathrotatepointaround{\secondpoint}{\centerpoint}{\rotate}%
        }%
        \pgfpointintersectionoflines{\referencepoint}{\externalpoint}%
            {\firstpoint}{\secondpoint}%
    }%
}%







% keys for shape double arrow
%
% /pgf/double arrow tip angle
% /pgf/double arrow head sep

\pgfkeys{/pgf/.cd,
    double arrow tip angle/.initial=90,
    double arrow head extend/.initial=.25cm,
    double arrow head indent/.initial=0cm,
}%

% Shape double arrow
%
%
\pgfdeclareshape{double arrow}{%
    \savedmacro\getdoublearrowpoints{%
        %
        % Get the outer sep.
        %
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
        \edef\xoutersep{\the\pgf@x}%
        \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
        \edef\youtersep{\the\pgf@y}%
        %
        % Get the node dimensions.
        %
        \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/inner xsep}}%
        \advance\pgf@xa.5\wd\pgfnodeparttextbox%
        \advance\pgf@xa.5\pgflinewidth%
        \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/inner ysep}}%
        \advance\pgf@ya.5\ht\pgfnodeparttextbox%
        \advance\pgf@ya.5\dp\pgfnodeparttextbox%
        \advance\pgf@ya.5\pgflinewidth%
        \ifpgfshapeborderusesincircle%
            \ifdim\pgf@xa<\pgf@ya%
                \pgf@xa\pgf@ya%
            \fi%
            \pgf@xa1.41421\pgf@xa%
            \pgf@ya\pgf@xa%
            \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}%
            \ifdim\xoutersep>\youtersep\relax%
                \let\youtersep\xoutersep%
            \else%
                \let\xoutersep\youtersep%
            \fi%
        \else%
            %
            % Round the rotation.
            %
            \pgfmathsetmacro\rotate{\pgfkeysvalueof{/pgf/shape border rotate}}
            \pgfmathmod@{\rotate}{360}%
            \afterassignment\pgfmath@gobbletilpgfmath@%
            \expandafter\c@pgf@counta\pgfmathresult\relax\pgfmath@%
            \advance\c@pgf@counta45\relax%
            \divide\c@pgf@counta90\relax%
            \multiply\c@pgf@counta90\relax%
            \ifnum\c@pgf@counta<0\relax%
                \advance\c@pgf@counta360\relax%
            \fi%
            \edef\rotate{\the\c@pgf@counta}%
            %
            % Calculate the width and height of the node
            % contents, according to any border rotation.
            %
            \ifnum\c@pgf@counta=90\relax%
                \pgf@x\pgf@xa%
                \pgf@xa\pgf@ya%
                \pgf@ya\pgf@x%
                \let\pgfmathresult\xoutersep%
                \let\xoutersep\youtersep%
                \let\youtersep\pgfmathresult%
            \else%
                \ifnum\c@pgf@counta=270\relax%
                    \pgf@x\pgf@xa%
                    \pgf@xa\pgf@ya%
                    \pgf@ya\pgf@x%
                    \let\pgfmathresult\xoutersep%
                    \let\xoutersep\youtersep%
                    \let\youtersep\pgfmathresult%
                \fi%
            \fi%
        \fi%
        \addtosavedmacro\rotate%
        %
        % Get some useful trig stuff.
        %
        \pgfmathdivide{\pgfkeysvalueof{/pgf/double arrow tip angle}}{2}%
        \let\halftipangle\pgfmathresult%
        \pgfmathcosec@{\halftipangle}%
        \let\cosechalftipangle\pgfmathresult%
        \pgfmathcos@{\halftipangle}%
        \pgfutil@tempdima\pgfmathresult pt\relax%
        \pgfutil@tempdima\cosechalftipangle\pgfutil@tempdima%
        \edef\cothalftipangle{\pgfmath@tonumber{\pgfutil@tempdima}}%
        \pgfmathreciprocal@{\pgfmathresult}%
        \let\sechalftipangle\pgfmathresult%
        \pgfmathsin@{\halftipangle}%
        \pgfutil@tempdima\pgfmathresult pt\relax%
        \pgfutil@tempdima\sechalftipangle\pgfutil@tempdima%
        \edef\tanhalftipangle{\pgfmath@tonumber{\pgfutil@tempdima}}%
        %
        % Get the double arrow head extend, and adjust for minimum width.
        %
        \pgf@xb\pgf@ya%
        \pgf@xb\cothalftipangle\pgf@xb%
        \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/double arrow head extend}}%
        \pgf@yc\pgf@xc%
        \advance\pgf@xc\pgf@ya%
        \pgfmathsetlength\pgfutil@tempdimb{\pgfkeysvalueof{/pgf/minimum width}}%
        \ifdim\pgf@xc<.5\pgfutil@tempdimb%
            \pgfutil@tempdimb.5\pgfutil@tempdimb%
            \pgfmathdivide@{\pgfmath@tonumber{\pgfutil@tempdimb}}{\pgfmath@tonumber{\pgf@xc}}%
            \pgf@ya\pgfmathresult\pgf@ya%
            \pgf@xc\pgfmathresult\pgf@xc%
            \pgf@yc\pgfmathresult\pgf@yc%
            \pgf@xb\pgfmathresult\pgf@xb%
        \fi%
        %
        % Now calculate the height of the arrow and adjust for minimum height.
        %
        \advance\pgf@xc-\pgf@ya%
        \pgf@xc\cothalftipangle\pgf@xc%
        \advance\pgf@xa\pgf@xb%
        \pgf@xa2.0\pgf@xa%
        \pgfmathsetlength\pgfutil@tempdimb{\pgfkeysvalueof{/pgf/minimum height}}%
        \ifdim\pgf@xa<\pgfutil@tempdimb%
            \pgf@xa\pgfutil@tempdimb%
        \fi%
        \pgf@xa.5\pgf@xa%
        \advance\pgf@xa-\pgf@xb%
        \pgfmathsetlength\pgfutil@tempdima{\pgfkeysvalueof{/pgf/double arrow head indent}}%
        %
        % Now:
        %
        % xa - .5 * width of the node minus xb.
        % ya - .5 * height of the node contents.
        % xb - distance from the end of the node contents to the arrow tip.
        % xc - distance from the end of the node contents to the back end of the arrow head.
        % yc - distance from the top of the node contents to the top end of the arrow head.
        %
        \pgfsavepgf@process\centerpoint{%
            \pgf@x.5\wd\pgfnodeparttextbox%
            \pgf@y.5\ht\pgfnodeparttextbox%
            \advance\pgf@y-.5\dp\pgfnodeparttextbox%
        }%
        \pgfsavepgf@process\basepoint{%
            \pgf@x.5\wd\pgfnodeparttextbox%
            \pgf@y0pt%
        }%
        \pgfsavepgf@process\midpoint{%
            \pgf@x.5\wd\pgfnodeparttextbox%
            \pgfmathsetlength\pgf@y{+.5ex}%
        }%
        %
        % As the arrow is symmetrical it can be described by only 3 points:
        %
        \pgfsavepgf@process\arrowtip{%
            \pgf@x\pgf@xa%
            \advance\pgf@x\pgf@xb%
            \pgf@y0pt\relax%
        }%
        \pgfsavepgf@process\beforearrowtip{%
            \pgf@x\pgf@xa%
            \advance\pgf@x-\pgf@xc%
            \pgf@y\pgf@ya%
            \advance\pgf@y\pgf@yc%
        }%
        \pgfsavepgf@process\beforearrowhead{%
            \pgf@x\pgf@xa%
            \advance\pgf@x-\pgf@xc%
            \advance\pgf@x\pgfutil@tempdima%
            \pgf@y\pgf@ya%
        }%
        %
        % Calculate the anchor point at the arrow tip.
        %
        \pgfsavepgf@process\arrowtipanchor{%
            \pgfpointadd{\centerpoint}{\arrowtip}%
            \pgf@xa\xoutersep\relax%
            \advance\pgf@x\cosechalftipangle\pgf@xa%
        }%
        \advance\pgf@x.5\wd\pgfnodeparttextbox%
        \edef\externalradius{\the\pgf@x}%
        \addtosavedmacro\externalradius%
        %
        %
        \pgfmathanglebetweenlines{\beforearrowtip}{\beforearrowhead}{\beforearrowtip}{\arrowtip}%
        \pgf@xa\xoutersep\relax%
        \pgfutil@tempdima\pgfmathresult pt\relax%
        \pgfutil@tempdima.5\pgfutil@tempdima%
        \pgfmathcosec@{\pgfmath@tonumber{\pgfutil@tempdima}}%
        \pgf@xa\pgfmathresult\pgf@xa%
        \pgfutil@tempdima-\pgfutil@tempdima%
        \advance\pgfutil@tempdima180pt\relax%
        \advance\pgfutil@tempdima-\halftipangle pt\relax%
        \pgfsavepgf@process\beforearrowtipanchor{%
            \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgf@xa}%
            \pgf@xb\pgf@x%
            \pgf@yb\pgf@y%
            \pgf@process{\pgfpointadd{\centerpoint}{\beforearrowtip}}%
            \advance\pgf@x\pgf@xb%
            \advance\pgf@y\pgf@yb%
        }%
        \pgfmathanglebetweenpoints{\beforearrowhead}{\beforearrowtip}%
        \pgfutil@tempdima-\pgfmathresult pt\relax%
        \advance\pgfutil@tempdima180pt\relax%
        \pgfutil@tempdima.5\pgfutil@tempdima%
        \pgfmathcosec@{\pgfmath@tonumber{\pgfutil@tempdima}}%
        \pgf@xa\xoutersep\relax%
        \pgf@xa\pgfmathresult\pgf@xa%
        \pgfutil@tempdima-\pgfutil@tempdima%
        \advance\pgfutil@tempdima180pt\relax%
        \pgfsavepgf@process\beforearrowheadanchor{%
            \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgf@xa}%
            \pgf@xb\pgf@x%
            \pgf@yb\pgf@y%
            \pgf@process{\pgfpointadd{\centerpoint}{\beforearrowhead}}%
            \advance\pgf@x\pgf@xb%
            \advance\pgf@y\pgf@yb%
        }%
        %
        \pgfmathanglebetweenpoints{\centerpoint}{\beforearrowtipanchor}%
        \let\center@angle@beforearrowtip\pgfmathresult%
        \addtosavedmacro\center@angle@beforearrowtip%
        %
        \pgfmathanglebetweenpoints{\midpoint}{\beforearrowtipanchor}%
        \let\mid@angle@beforearrowtip\pgfmathresult%
        \addtosavedmacro\mid@angle@beforearrowtip%
        %
        \pgfmathanglebetweenpoints{\basepoint}{\beforearrowtipanchor}%
        \let\base@angle@beforearrowtip\pgfmathresult%
        \addtosavedmacro\base@angle@beforearrowtip%
        %
        \addtosavedmacro\arrowtipanchor%
        \addtosavedmacro\beforearrowtipanchor%
        \addtosavedmacro\beforearrowheadanchor%
    }%
    \savedanchor\centerpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y.5\ht\pgfnodeparttextbox%
        \advance\pgf@y-.5\dp\pgfnodeparttextbox%
    }%
    \savedanchor\midpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgfmathsetlength\pgf@y{+0.5ex}%
    }%
    \savedanchor\basepoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y0pt%
    }%
    \anchor{center}{\centerpoint}%
    \anchor{mid}{\midpoint}%
    \anchor{mid east}{%
        \getdoublearrowpoints%
        \let\pgf@singlearrow@referencepoint\midpoint%
        \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
    }%
    \anchor{mid west}{%
        \getdoublearrowpoints%
        \let\pgf@singlearrow@referencepoint\midpoint%
        \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
    }%
    \anchor{base}{\basepoint}%
    \anchor{base east}{%
        \getdoublearrowpoints%
        \let\pgf@singlearrow@referencepoint\basepoint%
        \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
    }%
    \anchor{base west}{%
        \getdoublearrowpoints%
        \let\pgf@singlearrow@referencepoint\basepoint%
        \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
    }%
    \anchor{north}{%
        \getdoublearrowpoints%
        \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{0pt}{\externalradius}}%
    }%
    \anchor{south}{%
        \getdoublearrowpoints%
        \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{0pt}{-\externalradius}}%
    }%
    \anchor{east}{%
        \getdoublearrowpoints%
        \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{\externalradius}{0pt}}%
    }%
    \anchor{west}{%
        \getdoublearrowpoints%
        \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{-\externalradius}{0pt}}%
    }%
    \anchor{north east}{%
        \getdoublearrowpoints%
        \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{\externalradius}{\externalradius}}%
    }%
    \anchor{south east}{%
        \getdoublearrowpoints%
        \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{\externalradius}{-\externalradius}}%
    }%
    \anchor{south west}{%
        \getdoublearrowpoints%
        \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{-\externalradius}{-\externalradius}}%
    }%
    \anchor{north west}{%
        \getdoublearrowpoints%
        \csname pgf@anchor@double arrow@border\endcsname{\pgfqpoint{-\externalradius}{\externalradius}}%
    }%
    \anchor{before head 1}{%
        \getdoublearrowpoints%
        \pgfmathrotatepointaround{\beforearrowheadanchor}{\centerpoint}{\rotate}%
    }%
    \anchor{before tip 1}{%
        \getdoublearrowpoints%
        \pgfmathrotatepointaround{\beforearrowtipanchor}{\centerpoint}{\rotate}%
    }%
    \anchor{tip 1}{%
        \getdoublearrowpoints%
        \pgfmathrotatepointaround{\arrowtipanchor}{\centerpoint}{\rotate}%
    }%
    \anchor{after tip 1}{%
        \getdoublearrowpoints%
        \pgfmathrotatepointaround{%
            \pgfpointadd{%
                \pgfpointdiff{\centerpoint}{\beforearrowtipanchor}%
                \pgf@y-\pgf@y%
            }{\centerpoint}}%
        {\centerpoint}{\rotate}%
    }%
    \anchor{after head 1}{%
        \getdoublearrowpoints%
        \pgfmathrotatepointaround{%
            \pgfpointadd{%
                \pgfpointdiff{\centerpoint}{\beforearrowheadanchor}%
                \pgf@y-\pgf@y%
            }{\centerpoint}}%
        {\centerpoint}{\rotate}%
    }%
    \anchor{before head 2}{%
        \getdoublearrowpoints%
        \pgfmathrotatepointaround{%
            \pgfpointadd{%
                \pgfpointdiff{\centerpoint}{\beforearrowheadanchor}%
                \pgf@x-\pgf@x%
                \pgf@y-\pgf@y%
            }{\centerpoint}}%
        {\centerpoint}{\rotate}%
    }%
    \anchor{before tip 2}{%
        \getdoublearrowpoints%
        \pgfmathrotatepointaround{%
            \pgfpointadd{%
                \pgfpointdiff{\centerpoint}{\beforearrowtipanchor}%
                \pgf@x-\pgf@x%
                \pgf@y-\pgf@y%
            }{\centerpoint}}%
        {\centerpoint}{\rotate}%
    }%
    \anchor{tip 2}{%
        \getdoublearrowpoints%
        \pgfmathrotatepointaround{%
            \pgfpointadd{%
                \pgfpointdiff{\centerpoint}{\arrowtipanchor}%
                \pgf@x-\pgf@x%
            }{\centerpoint}}%
        {\centerpoint}{\rotate}%
    }%
    \anchor{after tip 2}{%
        \getdoublearrowpoints%
        \pgfmathrotatepointaround{%
            \pgfpointadd{%
                \pgfpointdiff{\centerpoint}{\beforearrowtipanchor}%
                \pgf@x-\pgf@x%
            }{\centerpoint}}%
        {\centerpoint}{\rotate}%
    }%
    \anchor{after head 2}{%
        \getdoublearrowpoints%
        \pgfmathrotatepointaround{%
            \pgfpointadd{%
                \pgfpointdiff{\centerpoint}{\beforearrowheadanchor}%
                \pgf@x-\pgf@x%
            }{\centerpoint}}%
        {\centerpoint}{\rotate}%
    }%
    \backgroundpath{%
        {%
            \pgftransformshift{\centerpoint}%
            \pgftransformrotate{\rotate}%
            \pgfpathmoveto{\arrowtip}%
            \pgfpathlineto{\beforearrowtip}%
            \pgfpathlineto{\beforearrowhead}%
            \pgfpathlineto{\beforearrowhead\pgf@x-\pgf@x}%
            \pgfpathlineto{\beforearrowtip\pgf@x-\pgf@x}%
            \pgfpathlineto{\arrowtip\pgf@x-\pgf@x}%
            \pgfpathlineto{\beforearrowtip\pgf@x-\pgf@x\pgf@y-\pgf@y}%
            \pgfpathlineto{\beforearrowhead\pgf@x-\pgf@x\pgf@y-\pgf@y}%
            \pgfpathlineto{\beforearrowhead\pgf@y-\pgf@y}%
            \pgfpathlineto{\beforearrowtip\pgf@y-\pgf@y}%
        }%
        \pgfpathclose%
    }%
    \anchorborder{%
        \pgfsavepgf@process\externalpoint{}%
        \getdoublearrowpoints%
        \pgfutil@ifundefined{pgf@singlearrow@referencepoint}{\let\referencepoint\centerpoint}%
            {\let\referencepoint\pgf@singlearrow@referencepoint}%
        \pgfsavepgf@process\externalpoint{%
            \externalpoint%
            \pgf@xa\pgf@x%
            \pgf@ya\pgf@y%
            \referencepoint%
            \advance\pgf@x\pgf@xa%
            \advance\pgf@y\pgf@ya}%
        \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
        \pgfmathsubtract@{\pgfmathresult}{\rotate}%
        \ifdim\pgfmathresult pt<0pt\relax%
            \pgfmathadd@{\pgfmathresult}{360}%
        \fi%
        \let\externalangle\pgfmathresult%
        \pgf@x\externalangle pt\relax%
        \ifx\referencepoint\midpoint%
            \pgf@xa\mid@angle@beforearrowtip pt\relax%
        \else%
            \ifx\referencepoint\basepoint%
                \pgf@xa\base@angle@beforearrowtip pt\relax%
            \else%
                \pgf@xa\center@angle@beforearrowtip pt\relax%
            \fi%
        \fi%
        \ifdim\pgf@x<180pt\relax%
            \ifdim\pgf@x<\pgf@xa%
                \let\firstpoint\arrowtipanchor%
                \let\secondpoint\beforearrowtipanchor%
            \else%
                \pgf@xa-\pgf@xa%
                \advance\pgf@xa180pt\relax%
                \ifdim\pgf@x<\pgf@xa%
                    \let\firstpoint\beforearrowheadanchor%
                    \pgfsavepgf@process\secondpoint{%
                        \pgfpointadd{%
                            \pgfpointdiff{\centerpoint}{\beforearrowheadanchor}%
                            \pgf@x-\pgf@x
                            }{\centerpoint}}%
                \else%
                    \pgfsavepgf@process\firstpoint{%
                        \pgfpointadd{%
                            \pgfpointdiff{\centerpoint}{\beforearrowtipanchor}%
                            \pgf@x-\pgf@x
                            }{\centerpoint}}%
                    \pgfsavepgf@process\secondpoint{%
                        \pgfpointadd{%
                            \pgfpointdiff{\centerpoint}{\arrowtipanchor}%
                            \pgf@x-\pgf@x%
                            \pgf@y-\pgf@y%
                        }{\centerpoint}}%
                \fi%
            \fi%
        \else%
            \pgf@xa-\pgf@xa%
            \advance\pgf@xa360pt\relax%
            \ifdim\pgf@x<\pgf@xa%
                \pgf@xa-\pgf@xa%
                \advance\pgf@xa540pt\relax%
                \ifdim\pgf@x<\pgf@xa%
                    \pgfsavepgf@process\firstpoint{%
                        \pgfpointadd{%
                            \pgfpointdiff{\centerpoint}{\arrowtipanchor}%
                            \pgf@x-\pgf@x%
                        }{\centerpoint}}%
                    \pgfsavepgf@process\secondpoint{%
                        \pgfpointadd{%
                            \pgfpointdiff{\centerpoint}{\beforearrowtipanchor}%
                            \pgf@x-\pgf@x%
                            \pgf@y-\pgf@y%
                        }{\centerpoint}}%
                \else%
                    \pgfsavepgf@process\firstpoint{%
                        \pgfpointadd{%
                            \pgfpointdiff{\centerpoint}{\beforearrowheadanchor}%
                            \pgf@x-\pgf@x%
                            \pgf@y-\pgf@y%
                        }{\centerpoint}}%
                    \pgfsavepgf@process\secondpoint{%
                        \pgfpointadd{%
                            \pgfpointdiff{\centerpoint}{\beforearrowheadanchor}%
                            \pgf@y-\pgf@y%
                        }{\centerpoint}}%
                \fi%
            \else%
                \pgfsavepgf@process\firstpoint{%
                        \pgfpointadd{%
                            \pgfpointdiff{\beforearrowtipanchor}{\centerpoint}%
                            \pgf@x-\pgf@x%
                        }{\centerpoint}}%
                \let\secondpoint\arrowtipanchor%
            \fi%
        \fi%
        \pgfsavepgf@process\firstpoint{%
            \pgfmathrotatepointaround{\firstpoint}{\centerpoint}{\rotate}%
        }%
        \pgfsavepgf@process\secondpoint{%
            \pgfmathrotatepointaround{\secondpoint}{\centerpoint}{\rotate}%
        }%
        \pgfpointintersectionoflines{\referencepoint}{\externalpoint}%
            {\firstpoint}{\secondpoint}%
    }%
}%




%
% Internal macros for the arrow box/shape.
%
\def\pgf@lib@arrowbox@parsearrowlength#1#2#3{%
    \edef\pgf@lib@temp{#3}%
    \edef\pgf@lib@marshal{%
        \noexpand\pgfutil@in@{none}{\pgf@lib@temp}%
    }%
    \pgf@lib@marshal%
    \ifpgfutil@in@%
        #10pt\relax%
    \else%
        \afterassignment\pgfmath@gobbletilpgfmath@%
        \expandafter#1\pgf@lib@temp\relax\pgfmath@%
        %
        \edef\pgf@lib@marshal{%
            \noexpand\pgfutil@in@{from center}{\pgf@lib@temp}%
        }%
        \pgf@lib@marshal%
        \ifpgfutil@in@%
        \else%
            \ifdim#1>0pt\relax%
                \advance#1#2\relax%
            \fi%
        \fi%
    \fi}%

\def\pgf@lib@arrowbox@parsearrows#1{%
    \pgfkeys{/pgf/.cd,%
        arrow box west arrow=0pt,
        arrow box east arrow=0pt,
        arrow box south arrow=0pt,
        arrow box north arrow=0pt
    }%
    \def\pgf@lib@arrowbox@extend{0pt}%
    \edef\pgf@lib@temp{#1}%
    \expandafter\pgf@lib@arrowbox@@parsearrows\pgf@lib@temp,\pgf@lib@arrowbox@parsearrows,
}%


\def\pgf@lib@arrowbox@@parsearrows#1,{%
    \ifx\pgf@lib@arrowbox@parsearrows#1%
        \let\pgflib@next\relax%
    \else%
        \pgfutil@in@:{#1}%
        \ifpgfutil@in@%
            \pgf@lib@arrowbox@getextend#1\pgf@lib%
        \else%
            \def\pgf@lib@arrowbox@direction{#1}%
        \fi%
        \edef\pgf@marshal{%
            \noexpand\pgfkeys{/pgf/arrow box  \pgf@lib@arrowbox@direction\space arrow=\pgf@lib@arrowbox@extend}%
        }%
        \pgf@marshal%
        \let\pgflib@next\pgf@lib@arrowbox@@@parsearrows%
    \fi%
    \pgflib@next%
}%
\def\pgf@lib@arrowbox@@@parsearrows{%
    \pgfutil@ifnextchar x{\relax\pgf@lib@arrowbox@@parsearrows}{\relax\pgf@lib@arrowbox@@parsearrows}%
}%

\def\pgf@lib@arrowbox@getextend#1:#2\pgf@lib{%
    \def\pgf@lib@arrowbox@direction{#1}%
    \def\pgf@lib@arrowbox@extend{#2}%
}%

%
% /pgf/arrow box north arrow
% /pgf/arrow box south arrow
% /pgf/arrow box west arrow
% /pgf/arrow box east arrow
% /pgf/arrow box arrows
% /pgf/arrow box shaft width
% /pgf/arrow box head extend
% /pgf/arrow box head indent
% /pgf/arrow box tip angle
%
\pgfkeys{/pgf/.cd,
    arrow box west arrow/.initial=.5cm,
    arrow box east arrow/.initial=.5cm,
    arrow box south arrow/.initial=.5cm,
    arrow box north arrow/.initial=.5cm,
    arrow box shaft width/.initial=.125cm,
    arrow box head extend/.initial=.125cm,
    arrow box head indent/.initial=0cm,
    arrow box tip angle/.initial=90,
}%

%
% arrow box/Shape.
%
\pgfdeclareshape{arrow box}{%
    \saveddimen\shaftwidth{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/arrow box shaft width}}%
    }%
    %
    % Calculate far the arrows extend from the center of the node.
    %
    \savedmacro\arrowboxpoints{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/inner xsep}}%
        \advance\pgf@x.5\wd\pgfnodeparttextbox%
        \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/minimum width}}%
        \ifdim\pgf@x<.5\pgf@xa%
            \pgf@x.5\pgf@xa%
        \fi%
        \pgfmathaddtolength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
        %
        \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/inner ysep}}%
        \advance\pgf@y.5\ht\pgfnodeparttextbox%
        \advance\pgf@y.5\dp\pgfnodeparttextbox%
        \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/minimum height}}%
        \ifdim\pgf@y<.5\pgf@ya%
            \pgf@y.5\pgf@ya%
        \fi%
        \pgfmathaddtolength\pgf@y{\pgfkeysvalueof{/pgf/outer ysep}}%
        %
        \edef\halfboxwidth{\the\pgf@x}%
        \edef\halfboxheight{\the\pgf@y}%
        \pgfextract@process\arrowboxcorner{}%
        \addtosavedmacro\arrowboxcorner%
        %
        \pgf@lib@arrowbox@parsearrowlength\pgf@x{\halfboxwidth}%
            {\pgfkeysvalueof{/pgf/arrow box west arrow}}%
        \edef\westextend{\the\pgf@x}%
        \addtosavedmacro\westextend%
        %
        \pgf@lib@arrowbox@parsearrowlength\pgf@x{\halfboxwidth}%
            {\pgfkeysvalueof{/pgf/arrow box east arrow}}%
        \edef\eastextend{\the\pgf@x}%
        \addtosavedmacro\eastextend%
        %
        \pgf@lib@arrowbox@parsearrowlength\pgf@x{\halfboxheight}%
            {\pgfkeysvalueof{/pgf/arrow box north arrow}}%
        \edef\northextend{\the\pgf@x}%
        \addtosavedmacro\northextend%
        %
        \pgf@lib@arrowbox@parsearrowlength\pgf@x{\halfboxheight}%
            {\pgfkeysvalueof{/pgf/arrow box south arrow}}%
        \edef\southextend{\the\pgf@x}%
        \addtosavedmacro\southextend%
    }%
    \saveddimen\arrowheadextend{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/arrow box head extend}}%
    }%
    \saveddimen\arrowheadindent{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/arrow box head indent}}%
    }%
    %
    % Calculate the `miter' angle for the outer sep at the arrow tip.
    %
    \savedmacro\arrowtipmiterangle{%
        \pgfmathparse{\pgfkeysvalueof{/pgf/arrow box tip angle}}%
        \pgfmathdivide@{\pgfmathresult}{2}%
        \let\arrowtipmiterangle\pgfmathresult%
    }%
    %
    % Calculate the `miter' angle for the outer sep at the point just
    % before the arrow tip.
    %
    \savedmacro\arrowheadangles{%
        %
        % Calculate the `miter' angle and its cosecant at the arrow tip...
        %
        \pgfmathparse{\pgfkeysvalueof{/pgf/arrow box tip angle}}%
        \pgfmathdivide@{\pgfmathresult}{2}%
        \let\arrowtipmiterangle\pgfmathresult%
        \addtosavedmacro\arrowtipmiterangle%
        \pgfmathcosec@{\arrowtipmiterangle}%
        \let\cosecarrowtipmiterangle\pgfmathresult%
        \addtosavedmacro\cosecarrowtipmiterangle%
        %
        % ...before the arrow head...
        %
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/arrow box head extend}}%
        \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/arrow box head indent}}%
        \ifdim\pgf@y=0pt\relax%
            \def\pgfmathresult{90}%
        \else%
            \ifdim\pgf@y<0pt\relax%
                \pgfmathdivide@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}%
                \pgfmathatan@{\pgfmathresult}%
                \pgfmathadd@{\pgfmathresult}{180}%
            \else%
                \pgfmathdivide@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}%
                \pgfmathatan@{\pgfmathresult}%
            \fi%
        \fi%
        \pgfmathdivide@{\pgfmathresult}{2}%
        \let\beforearrowheadmiterangle\pgfmathresult%
        \addtosavedmacro\beforearrowheadmiterangle%
        \pgfmathcosec@{\beforearrowheadmiterangle}%
        \let\cosecbeforearrowheadmiterangle\pgfmathresult%
        \addtosavedmacro\cosecbeforearrowheadmiterangle%
        %
        % ...and before the arrow tip.
        %
        \pgfutil@tempdima-\arrowtipmiterangle pt\relax%
        \advance\pgfutil@tempdima90pt\relax%
        \pgfutil@tempdimb\beforearrowheadmiterangle pt\relax%
        \pgfutil@tempdimb2.0\pgfutil@tempdimb%
        \advance\pgfutil@tempdimb-90pt\relax%
        \advance\pgfutil@tempdima\pgfutil@tempdimb%
        \divide\pgfutil@tempdima2\relax%
        \edef\beforearrowtipmiterangle{\pgfmath@tonumber{\pgfutil@tempdima}}%
        \addtosavedmacro\beforearrowtipmiterangle%
        \pgfmathcosec@{\beforearrowtipmiterangle}%
        \let\cosecbeforearrowtipmiterangle\pgfmathresult%
        \addtosavedmacro\cosecbeforearrowtipmiterangle%
    }%
    \saveddimen\outerxsep{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer xsep}}%
    }%
    \saveddimen\outerysep{%
        \pgfmathsetlength\pgf@x{\pgfkeysvalueof{/pgf/outer ysep}}%
    }%
    %
    % Calculate the (path) point immediately prior to an arrow tip.
    %
    \savedanchor\beforearrowtip{%
        \pgfmathparse{\pgfkeysvalueof{/pgf/arrow box tip angle}}%
        \pgfmathdivide@{\pgfmathresult}{2}%
        \pgfmathcot@{\pgfmathresult}%
        \let\cothalfangle\pgfmathresult%
        \pgfmathsetlength\pgf@y{\pgfkeysvalueof{/pgf/arrow box shaft width}}%
        \pgf@y.5\pgf@y%
        \pgfmathaddtolength\pgf@y{\pgfkeysvalueof{/pgf/arrow box head extend}}%
        \pgf@y\pgf@y%
        \pgf@x\cothalfangle\pgf@y%
    }%
    \savedanchor\centerpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y.5\ht\pgfnodeparttextbox%
        \advance\pgf@y-.5\dp\pgfnodeparttextbox%
    }%
    \savedanchor\basepoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgf@y0pt\relax%
    }%
    \savedanchor\midpoint{%
        \pgf@x.5\wd\pgfnodeparttextbox%
        \pgfmathsetlength\pgf@y{+.5ex}%
    }%
    \anchor{center}{\centerpoint}%
    \anchor{mid}{\midpoint}%
    \anchor{mid east}{%
        \arrowboxpoints%
        \ifdim\eastextend>0pt\relax%
            \let\pgf@lib@shapes@arrowbox@referencepoint\midpoint%
            \csname pgf@anchor@arrow box@border\endcsname{\pgfqpoint{\eastextend}{0pt}};
        \else%
            \arrowboxcorner%
            \pgf@xa\pgf@x%
            \midpoint%
            \advance\pgf@x\pgf@xa%
        \fi%
    }%
    \anchor{mid west}{%
        \arrowboxpoints%
        \ifdim\westextend>0pt\relax%
            \let\pgf@lib@shapes@arrowbox@referencepoint\midpoint%
            \csname pgf@anchor@arrow box@border\endcsname{\pgfqpoint{-\westextend}{0pt}};
        \else%
            \arrowboxcorner%
            \pgf@xa\pgf@x%
            \midpoint%
            \advance\pgf@x-\pgf@xa%
        \fi%
    }%
    \anchor{base}{\basepoint}%
    \anchor{base east}{%
        \arrowboxpoints%
        \ifdim\eastextend>0pt\relax%
            \let\pgf@lib@shapes@arrowbox@referencepoint\basepoint%
            \csname pgf@anchor@arrow box@border\endcsname{\pgfqpoint{\eastextend}{0pt}};
        \else%
            \arrowboxcorner%
            \pgf@xa\pgf@x%
            \basepoint%
            \advance\pgf@x\pgf@xa%
        \fi%
    }%
    \anchor{base west}{%
        \arrowboxpoints%
        \ifdim\westextend>0pt\relax%
            \let\pgf@lib@shapes@arrowbox@referencepoint\basepoint%
            \csname pgf@anchor@arrow box@border\endcsname{\pgfqpoint{-\westextend}{0pt}};
        \else%
            \arrowboxcorner%
            \pgf@xa\pgf@x%
            \basepoint%
            \advance\pgf@x-\pgf@xa%
        \fi%
    }%
    \anchor{north}{%
        \arrowboxpoints%
        \ifdim\northextend>0pt\relax%
            \csname pgf@anchor@arrow box@north arrow tip\endcsname%
        \else%
            \pgfpointadd{\centerpoint}{\arrowboxcorner}%
            \pgf@ya\pgf@y%
            \centerpoint%
            \pgf@y\pgf@ya%
        \fi%
    }%
    \anchor{south}{%
        \arrowboxpoints%
        \ifdim\southextend>0pt\relax%
            \csname pgf@anchor@arrow box@south arrow tip\endcsname%
        \else%
            \pgfpointadd{\centerpoint}{\arrowboxcorner\pgf@y-\pgf@y}%
            \pgf@ya\pgf@y%
            \centerpoint%
            \pgf@y\pgf@ya%
        \fi%
    }%
    \anchor{east}{%
        \arrowboxpoints%
        \ifdim\eastextend>0pt\relax%
            \csname pgf@anchor@arrow box@east arrow tip\endcsname%
        \else%
            \pgfpointadd{\centerpoint}{\arrowboxcorner}%
            \pgf@xa\pgf@x%
            \centerpoint%
            \pgf@x\pgf@xa%
        \fi%
    }%
    \anchor{west}{%
        \arrowboxpoints%
        \ifdim\westextend>0pt\relax%
            \csname pgf@anchor@arrow box@west arrow tip\endcsname%
        \else%
            \pgfpointadd{\centerpoint}{\arrowboxcorner\pgf@x-\pgf@x}%
            \pgf@xa\pgf@x%
            \centerpoint%
            \pgf@x\pgf@xa%
        \fi%
    }%
    \anchor{north east}{%
        \arrowboxpoints%
        \pgfpointadd{\centerpoint}{\arrowboxcorner}%
    }%
    \anchor{north west}{%
        \arrowboxpoints%
        \pgfpointadd{\centerpoint}{\arrowboxcorner\pgf@x-\pgf@x}%
    }%
    \anchor{south west}{%
        \arrowboxpoints%
        \pgfpointadd{\centerpoint}{\arrowboxcorner\pgf@x-\pgf@x\pgf@y-\pgf@y}%
    }%
    \anchor{south east}{%
        \arrowboxpoints%
        \pgfpointadd{\centerpoint}{\arrowboxcorner\pgf@y-\pgf@y}%
    }%
    \anchor{before east arrow}{%
        \arrowboxpoints%
        \ifdim\eastextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \arrowboxcorner%
                \pgf@y\shaftwidth\relax%
                \pgf@y.5\pgf@y%
                \advance\pgf@y\outerysep\relax%
            }%
        \else%
            \csname pgf@anchor@arrow box@east\endcsname%
        \fi%
    }%
    \anchor{before east arrow head}{%
        \arrowboxpoints%
        \ifdim\eastextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \pgfpointadd{%
                    \arrowheadangles%
                    \pgfutil@tempdima-\beforearrowheadmiterangle pt\relax%
                    \advance\pgfutil@tempdima180pt\relax%
                    \pgfutil@tempdimb\outerxsep\relax%
                    \pgfutil@tempdimb\cosecbeforearrowheadmiterangle\pgfutil@tempdimb%
                    \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
                }%
                {%
                    \beforearrowtip%
                    \pgf@x-\pgf@x%
                    \advance\pgf@x\eastextend\relax%
                    \advance\pgf@x\arrowheadindent\relax%
                    \pgf@y\shaftwidth\relax%
                    \pgf@y.5\pgf@y%
                }%
            }%
        \else%
            \csname pgf@anchor@arrow box@east\endcsname%
        \fi%
    }%
    \anchor{before east arrow tip}{%
        \arrowboxpoints%
        \ifdim\eastextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \pgfpointadd{%
                    \arrowheadangles%
                    \pgfutil@tempdima-\arrowtipmiterangle pt\relax%
                    \advance\pgfutil@tempdima-\beforearrowtipmiterangle pt\relax%
                    \advance\pgfutil@tempdima180pt\relax%
                    \pgfutil@tempdimb\outerysep\relax%
                    \pgfutil@tempdimb\cosecbeforearrowtipmiterangle\pgfutil@tempdimb%
                    \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
                }%
                {%
                    \beforearrowtip%
                    \pgf@x-\pgf@x%
                    \advance\pgf@x\eastextend\relax%
                }%
            }%
        \else%
            \csname pgf@anchor@arrow box@east\endcsname%
        \fi%
    }%
    \anchor{east arrow tip}{%
        \arrowboxpoints%
        \ifdim\eastextend>0pt\relax%
            \centerpoint%
            \advance\pgf@x\eastextend\relax%
            \pgf@xa\outerxsep\relax%
            \pgfmathcosec@{\arrowtipmiterangle}%
            \advance\pgf@x\pgfmathresult\pgf@xa%
        \else%
            \csname pgf@anchor@arrow box@east\endcsname%
        \fi%
    }%
    \anchor{after east arrow tip}{%
        \arrowboxpoints%
        \ifdim\eastextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \pgfpointadd{%
                    \arrowheadangles%
                    \pgfutil@tempdima-\arrowtipmiterangle pt\relax%
                    \advance\pgfutil@tempdima-\beforearrowtipmiterangle pt\relax%
                    \advance\pgfutil@tempdima180pt\relax%
                    \pgfutil@tempdimb\outerysep\relax%
                    \pgfutil@tempdimb\cosecbeforearrowtipmiterangle\pgfutil@tempdimb%
                    \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
                }%
                {%
                    \beforearrowtip%
                    \pgf@x-\pgf@x%
                    \advance\pgf@x\eastextend\relax%
                }%
                \pgf@y-\pgf@y%
            }%
        \else%
            \csname pgf@anchor@arrow box@east\endcsname%
        \fi%
    }%
    \anchor{after east arrow head}{%
        \arrowboxpoints%
        \ifdim\eastextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \pgfpointadd{%
                    \arrowheadangles%
                    \pgfutil@tempdima-\beforearrowheadmiterangle pt\relax%
                    \advance\pgfutil@tempdima180pt\relax%
                    \pgfutil@tempdimb\outerxsep\relax%
                    \pgfutil@tempdimb\cosecbeforearrowheadmiterangle\pgfutil@tempdimb%
                    \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
                }%
                {%
                    \beforearrowtip%
                    \pgf@x-\pgf@x%
                    \advance\pgf@x\eastextend\relax%
                    \advance\pgf@x\arrowheadindent\relax%
                    \pgf@y\shaftwidth\relax%
                    \pgf@y.5\pgf@y%
                }%
                \pgf@y-\pgf@y%
            }%
        \else%
            \csname pgf@anchor@arrow box@east\endcsname%
        \fi%
    }%
    \anchor{after east arrow}{%
        \arrowboxpoints%
        \ifdim\eastextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \arrowboxcorner%
                \pgf@y\shaftwidth\relax%
                \pgf@y.5\pgf@y%
                \advance\pgf@y\outerysep\relax%
                \pgf@y-\pgf@y%
            }%
        \else%
            \csname pgf@anchor@arrow box@east\endcsname%
        \fi%
    }%
    %
    \anchor{before west arrow}{%
        \arrowboxpoints%
        \ifdim\westextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \arrowboxcorner%
                \pgf@x-\pgf@x%
                \pgf@y\shaftwidth\relax%
                \pgf@y.5\pgf@y%
                \advance\pgf@y\outerysep\relax%
                \pgf@y-\pgf@y%
            }%
        \else%
            \csname pgf@anchor@arrow box@west\endcsname%
        \fi%
    }%
    \anchor{before west arrow head}{%
        \arrowboxpoints%
        \ifdim\westextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \pgfpointadd{%
                    \arrowheadangles%
                    \pgfutil@tempdima-\beforearrowheadmiterangle pt\relax%
                    \advance\pgfutil@tempdima180pt\relax%
                    \pgfutil@tempdimb\outerxsep\relax%
                    \pgfutil@tempdimb\cosecbeforearrowheadmiterangle\pgfutil@tempdimb%
                    \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
                }%
                {%
                    \beforearrowtip%
                    \pgf@x-\pgf@x%
                    \advance\pgf@x\westextend\relax%
                    \advance\pgf@x\arrowheadindent\relax%
                    \pgf@y\shaftwidth\relax%
                    \pgf@y.5\pgf@y%
                }%
                \pgf@x-\pgf@x%
                \pgf@y-\pgf@y%
            }%
        \else%
            \csname pgf@anchor@arrow box@west\endcsname%
        \fi%
    }%
    \anchor{before west arrow tip}{%
        \arrowboxpoints%
        \ifdim\westextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \pgfpointadd{%
                    \arrowheadangles%
                    \pgfutil@tempdima-\arrowtipmiterangle pt\relax%
                    \advance\pgfutil@tempdima-\beforearrowtipmiterangle pt\relax%
                    \advance\pgfutil@tempdima180pt\relax%
                    \pgfutil@tempdimb\outerysep\relax%
                    \pgfutil@tempdimb\cosecbeforearrowtipmiterangle\pgfutil@tempdimb%
                    \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
                }%
                {%
                    \beforearrowtip%
                    \pgf@x-\pgf@x%
                    \advance\pgf@x\westextend\relax%
                }%
                \pgf@x-\pgf@x%
                \pgf@y-\pgf@y%
            }%
        \else%
            \csname pgf@anchor@arrow box@west\endcsname%
        \fi%
    }%
    \anchor{west arrow tip}{%
        \arrowboxpoints%
        \ifdim\westextend>0pt\relax%
            \centerpoint%
            \advance\pgf@x-\westextend\relax%
            \pgf@xa\outerxsep\relax%
            \pgfmathcosec@{\arrowtipmiterangle}%
            \advance\pgf@x-\pgfmathresult\pgf@xa%
        \else%
            \csname pgf@anchor@arrow box@west\endcsname%
        \fi%
    }%
    \anchor{after west arrow tip}{%
        \arrowboxpoints%
        \ifdim\westextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \pgfpointadd{%
                    \arrowheadangles%
                    \pgfutil@tempdima-\arrowtipmiterangle pt\relax%
                    \advance\pgfutil@tempdima-\beforearrowtipmiterangle pt\relax%
                    \advance\pgfutil@tempdima180pt\relax%
                    \pgfutil@tempdimb\outerysep\relax%
                    \pgfutil@tempdimb\cosecbeforearrowtipmiterangle\pgfutil@tempdimb%
                    \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
                }%
                {%
                    \beforearrowtip%
                    \pgf@x-\pgf@x%
                    \advance\pgf@x\westextend\relax%
                }%
                \pgf@x-\pgf@x%
            }%
        \else%
            \csname pgf@anchor@arrow box@west\endcsname%
        \fi%
    }%
    \anchor{after west arrow head}{%
        \arrowboxpoints%
        \ifdim\westextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \pgfpointadd{%
                    \arrowheadangles%
                    \pgfutil@tempdima-\beforearrowheadmiterangle pt\relax%
                    \advance\pgfutil@tempdima180pt\relax%
                    \pgfutil@tempdimb\outerxsep\relax%
                    \pgfutil@tempdimb\cosecbeforearrowheadmiterangle\pgfutil@tempdimb%
                    \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
                }%
                {%
                    \beforearrowtip%
                    \pgf@x-\pgf@x%
                    \advance\pgf@x\westextend\relax%
                    \advance\pgf@x\arrowheadindent\relax%
                    \pgf@y\shaftwidth\relax%
                    \pgf@y.5\pgf@y%
                }%
                \pgf@x-\pgf@x%
            }%
        \else%
            \csname pgf@anchor@arrow box@west\endcsname%
        \fi%
    }%
    \anchor{after west arrow}{%
        \arrowboxpoints%
        \ifdim\westextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \arrowboxcorner%
                \pgf@y\shaftwidth\relax%
                \pgf@y.5\pgf@y%
                \advance\pgf@y\outerysep\relax%
                \pgf@x-\pgf@x%
            }%
        \else%
            \csname pgf@anchor@arrow box@west\endcsname%
        \fi%
    }%
    %
    \anchor{before north arrow}{%
        \arrowboxpoints%
        \ifdim\northextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \arrowboxcorner%
                \pgf@x-\shaftwidth\relax%
                \pgf@x.5\pgf@x%
                \advance\pgf@x-\outerxsep\relax%
            }%
        \else%
            \csname pgf@anchor@arrow box@north\endcsname%
        \fi%
    }%
    \anchor{before north arrow head}{%
        \arrowboxpoints%
        \ifdim\northextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \pgfpointadd{%
                    \arrowheadangles%
                    \pgfutil@tempdima-\beforearrowheadmiterangle pt\relax%
                    \advance\pgfutil@tempdima270pt\relax%
                    \pgfutil@tempdimb\outerysep\relax%
                    \pgfutil@tempdimb\cosecbeforearrowheadmiterangle\pgfutil@tempdimb%
                    \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
                }%
                {%
                    \beforearrowtip%
                    \pgf@y-\pgf@x%
                    \advance\pgf@y\northextend\relax%
                    \advance\pgf@y\arrowheadindent\relax%
                    \pgf@x-\shaftwidth\relax%
                    \pgf@x.5\pgf@x%
                }%
            }%
        \else%
            \csname pgf@anchor@arrow box@north\endcsname%
        \fi%
    }%
    \anchor{before north arrow tip}{%
        \arrowboxpoints%
        \ifdim\northextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \pgfpointadd{%
                    \arrowheadangles%
                    \pgfutil@tempdima\arrowtipmiterangle pt\relax%
                    \advance\pgfutil@tempdima\beforearrowtipmiterangle pt\relax%
                    \advance\pgfutil@tempdima-90pt\relax%
                    \pgfutil@tempdimb\outerxsep\relax%
                    \pgfutil@tempdimb\cosecbeforearrowtipmiterangle\pgfutil@tempdimb%
                    \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
                }%
                {%
                    \beforearrowtip%
                    \pgf@xa\pgf@x%
                    \pgf@x\pgf@y%
                    \pgf@y-\pgf@xa%
                    \advance\pgf@y\northextend\relax%
                }%
                \pgf@x-\pgf@x%
            }%
        \else%
            \csname pgf@anchor@arrow box@north\endcsname%
        \fi%
    }%
    \anchor{north arrow tip}{%
        \arrowboxpoints%
        \ifdim\northextend>0pt\relax%
            \centerpoint%
            \advance\pgf@y\northextend\relax%
            \pgf@ya\outerysep\relax%
            \pgfmathcosec@{\arrowtipmiterangle}%
            \advance\pgf@y\pgfmathresult\pgf@ya%
        \else%
            \csname pgf@anchor@arrow box@north\endcsname%
        \fi%
    }%
    \anchor{after north arrow tip}{%
        \arrowboxpoints%
        \ifdim\northextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \pgfpointadd{%
                    \arrowheadangles%
                    \pgfutil@tempdima\arrowtipmiterangle pt\relax%
                    \advance\pgfutil@tempdima\beforearrowtipmiterangle pt\relax%
                    \advance\pgfutil@tempdima-90pt\relax%
                    \pgfutil@tempdimb\outerxsep\relax%
                    \pgfutil@tempdimb\cosecbeforearrowtipmiterangle\pgfutil@tempdimb%
                    \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
                }%
                {%
                    \beforearrowtip%
                    \pgf@xa\pgf@x%
                    \pgf@x\pgf@y%
                    \pgf@y-\pgf@xa%
                    \advance\pgf@y\northextend\relax%
                }%
            }%
        \else%
            \csname pgf@anchor@arrow box@north\endcsname%
        \fi%
    }%
    \anchor{after north arrow head}{%
        \arrowboxpoints%
        \ifdim\northextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \pgfpointadd{%
                    \arrowheadangles%
                    \pgfutil@tempdima-\beforearrowheadmiterangle pt\relax%
                    \advance\pgfutil@tempdima270pt\relax%
                    \pgfutil@tempdimb\outerysep\relax%
                    \pgfutil@tempdimb\cosecbeforearrowheadmiterangle\pgfutil@tempdimb%
                    \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
                }%
                {%
                    \beforearrowtip%
                    \pgf@y-\pgf@x%
                    \advance\pgf@y\northextend\relax%
                    \advance\pgf@y\arrowheadindent\relax%
                    \pgf@x-\shaftwidth\relax%
                    \pgf@x.5\pgf@x%
                }%
                \pgf@x-\pgf@x%
            }%
        \else%
            \csname pgf@anchor@arrow box@north\endcsname%
        \fi%
    }%
    \anchor{after north arrow}{%
        \arrowboxpoints%
        \ifdim\northextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \arrowboxcorner%
                \pgf@x\shaftwidth\relax%
                \pgf@x.5\pgf@x%
                \advance\pgf@x\outerxsep\relax%
            }%
        \else%
            \csname pgf@anchor@arrow box@north\endcsname%
        \fi%
    }%
    %
    \anchor{before south arrow}{%
        \arrowboxpoints%
        \ifdim\southextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \arrowboxcorner%
                \pgf@x\shaftwidth\relax%
                \pgf@x.5\pgf@x%
                \advance\pgf@x\outerxsep\relax%
                \pgf@y-\pgf@y%
            }%
        \else%
            \csname pgf@anchor@arrow box@south\endcsname%
        \fi%
    }%
    \anchor{before south arrow head}{%
        \arrowboxpoints%
        \ifdim\northextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \pgfpointadd{%
                    \arrowheadangles%
                    \pgfutil@tempdima-\beforearrowheadmiterangle pt\relax%
                    \advance\pgfutil@tempdima270pt\relax%
                    \pgfutil@tempdimb\outerysep\relax%
                    \pgfutil@tempdimb\cosecbeforearrowheadmiterangle\pgfutil@tempdimb%
                    \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
                }%
                {%
                    \beforearrowtip%
                    \pgf@y-\pgf@x%
                    \advance\pgf@y\northextend\relax%
                    \advance\pgf@y\arrowheadindent\relax%
                    \pgf@x-\shaftwidth\relax%
                    \pgf@x.5\pgf@x%
                }%
                \pgf@x-\pgf@x%
                \pgf@y-\pgf@y%
            }%
        \else%
            \csname pgf@anchor@arrow box@south\endcsname%
        \fi%
    }%
    \anchor{before south arrow tip}{%
        \arrowboxpoints%
        \ifdim\northextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \pgfpointadd{%
                    \arrowheadangles%
                    \pgfutil@tempdima\arrowtipmiterangle pt\relax%
                    \advance\pgfutil@tempdima\beforearrowtipmiterangle pt\relax%
                    \advance\pgfutil@tempdima-90pt\relax%
                    \pgfutil@tempdimb\outerxsep\relax%
                    \pgfutil@tempdimb\cosecbeforearrowtipmiterangle\pgfutil@tempdimb%
                    \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
                }%
                {%
                    \beforearrowtip%
                    \pgf@xa\pgf@x%
                    \pgf@x\pgf@y%
                    \pgf@y-\pgf@xa%
                    \advance\pgf@y\northextend\relax%
                }%
                \pgf@y-\pgf@y%
            }%
        \else%
            \csname pgf@anchor@arrow box@south\endcsname%
        \fi%
    }%
    \anchor{south arrow tip}{%
        \arrowboxpoints%
        \ifdim\southextend>0pt\relax%
            \centerpoint%
            \advance\pgf@y-\southextend\relax%
            \pgf@ya\outerysep\relax%
            \pgfmathcosec@{\arrowtipmiterangle}%
            \advance\pgf@y-\pgfmathresult\pgf@ya%
        \else%
            \csname pgf@anchor@arrow box@east\endcsname%
        \fi%
    }%
    \anchor{after south arrow tip}{%
        \arrowboxpoints%
        \ifdim\northextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \pgfpointadd{%
                    \arrowheadangles%
                    \pgfutil@tempdima\arrowtipmiterangle pt\relax%
                    \advance\pgfutil@tempdima\beforearrowtipmiterangle pt\relax%
                    \advance\pgfutil@tempdima-90pt\relax%
                    \pgfutil@tempdimb\outerxsep\relax%
                    \pgfutil@tempdimb\cosecbeforearrowtipmiterangle\pgfutil@tempdimb%
                    \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
                }%
                {%
                    \beforearrowtip%
                    \pgf@xa\pgf@x%
                    \pgf@x\pgf@y%
                    \pgf@y-\pgf@xa%
                    \advance\pgf@y\northextend\relax%
                }%
                \pgf@x-\pgf@x%
                \pgf@y-\pgf@y%
            }%
        \else%
            \csname pgf@anchor@arrow box@south\endcsname%
        \fi%
    }%
    \anchor{after south arrow head}{%
        \arrowboxpoints%
        \ifdim\northextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \pgfpointadd{%
                    \arrowheadangles%
                    \pgfutil@tempdima-\beforearrowheadmiterangle pt\relax%
                    \advance\pgfutil@tempdima270pt\relax%
                    \pgfutil@tempdimb\outerysep\relax%
                    \pgfutil@tempdimb\cosecbeforearrowheadmiterangle\pgfutil@tempdimb%
                    \pgfqpointpolar{\pgfmath@tonumber{\pgfutil@tempdima}}{\the\pgfutil@tempdimb}%
                }%
                {%
                    \beforearrowtip%
                    \pgf@y-\pgf@x%
                    \advance\pgf@y\northextend\relax%
                    \advance\pgf@y\arrowheadindent\relax%
                    \pgf@x-\shaftwidth\relax%
                    \pgf@x.5\pgf@x%
                }%
                \pgf@y-\pgf@y%
            }%
        \else%
            \csname pgf@anchor@arrow box@south\endcsname%
        \fi%
    }%
    \anchor{after south arrow}{%
        \arrowboxpoints%
        \ifdim\southextend>0pt\relax%
            \pgfpointadd{\centerpoint}{%
                \arrowboxcorner%
                \pgf@x-\shaftwidth\relax%
                \pgf@x.5\pgf@x%
                \advance\pgf@x-\outerxsep\relax%
                \pgf@y-\pgf@y%
            }%
        \else%
            \csname pgf@anchor@arrow box@south\endcsname%
        \fi%
    }%
    %
    \backgroundpath{%
        \arrowboxpoints%
        \pgfextract@process\arrowboxcorner{%
            \arrowboxcorner%
            \pgfmathaddtolength\pgf@x{-\pgfkeysvalueof{/pgf/outer xsep}}%
            \pgfmathaddtolength\pgf@y{-\pgfkeysvalueof{/pgf/outer ysep}}%
        }%
        {%
            \pgftransformshift{\centerpoint}%
            \pgfpathmoveto{\arrowboxcorner}%
            \ifdim\eastextend>0pt\relax%
                \pgfpathlineto{%
                    \arrowboxcorner%
                    \pgf@y\shaftwidth\relax%
                    \pgf@y.5\pgf@y%
                }%
                \pgfpathlineto{%
                    \beforearrowtip%
                    \pgf@x-\pgf@x%
                    \advance\pgf@x\eastextend\relax%
                    \advance\pgf@x\arrowheadindent\relax%
                    \pgf@y\shaftwidth\relax%
                    \pgf@y.5\pgf@y%
                }%
                \pgfpathlineto{%
                    \beforearrowtip%
                    \pgf@x-\pgf@x%
                    \advance\pgf@x\eastextend\relax%
                }%
                \pgfpathlineto{%
                    \pgf@x\eastextend\relax%
                    \pgf@y0pt\relax%
                }%
                \pgfpathlineto{%
                    \beforearrowtip%
                    \pgf@x-\pgf@x%
                    \advance\pgf@x\eastextend\relax%
                    \pgf@y-\pgf@y%
                }%
                \pgfpathlineto{%
                    \beforearrowtip%
                    \pgf@x-\pgf@x%
                    \advance\pgf@x\eastextend\relax%
                    \advance\pgf@x\arrowheadindent\relax%
                    \pgf@y\shaftwidth\relax%
                    \pgf@y-.5\pgf@y%
                }%
                \pgfpathlineto{%
                    \arrowboxcorner%
                    \pgf@y\shaftwidth\relax%
                    \pgf@y-.5\pgf@y%
                }%
            \fi%
            \pgfpathlineto{\arrowboxcorner\pgf@y-\pgf@y}%
            \ifdim\southextend>0pt\relax%
                \pgfpathlineto{%
                    \arrowboxcorner%
                    \pgf@x\shaftwidth\relax%
                    \pgf@x.5\pgf@x%
                    \pgf@y-\pgf@y%
                }%
                \pgfpathlineto{%
                    \beforearrowtip%
                    \pgf@y\pgf@x%
                    \advance\pgf@y-\southextend\relax%
                    \advance\pgf@y-\arrowheadindent\relax%
                    \pgf@x\shaftwidth\relax%
                    \pgf@x.5\pgf@x%
                }%
                \pgfpathlineto{%
                    \beforearrowtip%
                    \pgf@xa\pgf@y%
                    \pgf@y\pgf@x%
                    \advance\pgf@y-\southextend\relax%
                    \pgf@x\pgf@xa%
                }%
                \pgfpathlineto{%
                    \pgf@x0pt\relax%
                    \pgf@y-\southextend\relax%
                }%
                \pgfpathlineto{%
                    \beforearrowtip%
                    \pgf@xa\pgf@y%
                    \pgf@y\pgf@x%
                    \advance\pgf@y-\southextend\relax%
                    \pgf@x-\pgf@xa%
                }%
                \pgfpathlineto{%
                    \beforearrowtip%
                    \pgf@y\pgf@x%
                    \advance\pgf@y-\southextend\relax%
                    \advance\pgf@y-\arrowheadindent\relax%
                    \pgf@x\shaftwidth\relax%
                    \pgf@x-.5\pgf@x%
                }%
                \pgfpathlineto{%
                    \arrowboxcorner%
                    \pgf@x\shaftwidth\relax%
                    \pgf@x-.5\pgf@x%
                    \pgf@y-\pgf@y%
                }%
            \fi%
            \pgfpathlineto{\arrowboxcorner\pgf@x-\pgf@x\pgf@y-\pgf@y}%
            \ifdim\westextend>0pt\relax%
                \pgfpathlineto{%
                    \arrowboxcorner%
                    \pgf@x-\pgf@x
                    \pgf@y\shaftwidth\relax%
                    \pgf@y-.5\pgf@y%
                }%
                \pgfpathlineto{%
                    \beforearrowtip%
                    \advance\pgf@x-\westextend\relax%
                    \advance\pgf@x-\arrowheadindent\relax%
                    \pgf@y\shaftwidth\relax%
                    \pgf@y-.5\pgf@y%
                }%
                \pgfpathlineto{%
                    \beforearrowtip%
                    \advance\pgf@x-\westextend\relax%
                    \pgf@y-\pgf@y%
                }%
                \pgfpathlineto{%
                    \pgf@x-\westextend\relax%
                    \pgf@y0pt\relax%
                }%
                \pgfpathlineto{%
                    \beforearrowtip%
                    \advance\pgf@x-\westextend\relax%
                }%
                \pgfpathlineto{%
                    \beforearrowtip%
                    \advance\pgf@x-\westextend\relax%
                    \advance\pgf@x-\arrowheadindent\relax%
                    \pgf@y\shaftwidth\relax%
                    \pgf@y.5\pgf@y%
                }%
                \pgfpathlineto{%
                    \arrowboxcorner%
                    \pgf@x-\pgf@x%
                    \pgf@y\shaftwidth\relax%
                    \pgf@y.5\pgf@y%
                }%
            \fi%
            \pgfpathlineto{\arrowboxcorner\pgf@x-\pgf@x}%
            \ifdim\northextend>0pt\relax%
                \pgfpathlineto{%
                    \arrowboxcorner%
                    \pgf@x\shaftwidth\relax%
                    \pgf@x-.5\pgf@x%
                }%
                \pgfpathlineto{%
                    \beforearrowtip%
                    \pgf@y-\pgf@x%
                    \advance\pgf@y\northextend\relax%
                    \advance\pgf@y\arrowheadindent\relax%
                    \pgf@x\shaftwidth\relax%
                    \pgf@x-.5\pgf@x%
                }%
                \pgfpathlineto{%
                    \beforearrowtip%
                    \pgf@xa\pgf@y%
                    \pgf@y-\pgf@x%
                    \advance\pgf@y\northextend\relax%
                    \pgf@x-\pgf@xa%
                }%
                \pgfpathlineto{%
                    \pgf@x0pt\relax%
                    \pgf@y\northextend\relax%
                }%
                \pgfpathlineto{%
                    \beforearrowtip%
                    \pgf@xa\pgf@y%
                    \pgf@y-\pgf@x%
                    \advance\pgf@y\northextend\relax%
                    \pgf@x\pgf@xa%
                }%
                \pgfpathlineto{%
                    \beforearrowtip%
                    \pgf@y-\pgf@x%
                    \advance\pgf@y\northextend\relax%
                    \advance\pgf@y\arrowheadindent\relax%
                    \pgf@x\shaftwidth\relax%
                    \pgf@x.5\pgf@x%
                }%
                \pgfpathlineto{%
                    \arrowboxcorner%
                    \pgf@x\shaftwidth\relax%
                    \pgf@x.5\pgf@x%
                }%
            \fi%
            \pgfpathclose%
        }%
    }%
    \anchorborder{%
        \pgfextract@process\externalpoint{}%
        \pgfutil@ifundefined{pgf@lib@shapes@arrowbox@referencepoint}%
            {\let\referencepoint\centerpoint}{\let\referencepoint\pgf@lib@shapes@arrowbox@referencepoint}%
        \pgfextract@process\externalpoint{%
            \pgfpointadd{\referencepoint}{\externalpoint}%
        }%
        \pgfmathanglebetweenpoints{\centerpoint}{\externalpoint}%
        \let\externalangle\pgfmathresult%
        \pgfmathanglebetweenpoints{\referencepoint}%
            {\csname pgf@anchor@arrow box@west\endcsname}%
        \ifdim\externalangle pt<\pgfmathresult pt\relax%
            \pgfmathanglebetweenpoints{\referencepoint}%
                {\csname pgf@anchor@arrow box@north\endcsname}%
            \ifdim\externalangle pt<\pgfmathresult pt\relax%
                \pgfmathanglebetweenpoints{\referencepoint}%
                    {\csname pgf@anchor@arrow box@north east\endcsname}%
                \ifdim\externalangle pt<\pgfmathresult pt\relax%
                    \pgfmathanglebetweenpoints{\referencepoint}%
                        {\csname pgf@anchor@arrow box@before east arrow tip\endcsname}%
                    \ifdim\externalangle pt<\pgfmathresult pt\relax%
                        \def\firstpoint{east arrow tip}%
                        \def\secondpoint{before east arrow tip}%
                    \else%
                        \pgfmathanglebetweenpoints{\referencepoint}%
                            {\csname pgf@anchor@arrow box@before east arrow\endcsname}%
                        \ifdim\externalangle pt<\pgfmathresult pt\relax%
                            \def\firstpoint{before east arrow head}%
                            \def\secondpoint{before east arrow}%
                        \else%
                            \def\firstpoint{before east arrow}%
                            \def\secondpoint{north east}%
                        \fi%
                    \fi%
                \else%
                    \pgfmathanglebetweenpoints{\referencepoint}%
                        {\csname pgf@anchor@arrow box@after north arrow tip\endcsname}%
                    \ifdim\externalangle pt<\pgfmathresult pt\relax%
                        \pgfmathanglebetweenpoints{\referencepoint}%
                            {\csname pgf@anchor@arrow box@after north arrow\endcsname}%
                        \ifdim\externalangle pt<\pgfmathresult pt\relax%
                            \def\firstpoint{north east}%
                            \def\secondpoint{after north arrow}%
                        \else%
                            \def\firstpoint{after north arrow}%
                            \def\secondpoint{after north arrow head}%
                        \fi%
                    \else%
                        \def\firstpoint{after north arrow tip}%
                        \def\secondpoint{north arrow tip}%
                    \fi%
                \fi%
            \else%
                \pgfmathanglebetweenpoints{\referencepoint}%
                    {\csname pgf@anchor@arrow box@north west\endcsname}%
                \ifdim\externalangle pt<\pgfmathresult pt\relax%
                    \pgfmathanglebetweenpoints{\referencepoint}%
                        {\csname pgf@anchor@arrow box@before north arrow tip\endcsname}%
                    \ifdim\externalangle pt<\pgfmathresult pt\relax%
                        \def\firstpoint{north arrow tip}%
                        \def\secondpoint{before north arrow tip}%
                    \else%
                        \pgfmathanglebetweenpoints{\referencepoint}%
                            {\csname pgf@anchor@arrow box@before north arrow\endcsname}%
                        \ifdim\externalangle pt<\pgfmathresult pt\relax%
                            \def\firstpoint{before north head}%
                            \def\secondpoint{before north arrow}%
                        \else%
                            \def\firstpoint{before north arrow}%
                            \def\secondpoint{north west}%
                        \fi%
                    \fi%
                \else%
                    \pgfmathanglebetweenpoints{\referencepoint}%
                        {\csname pgf@anchor@arrow box@after west arrow tip\endcsname}%
                    \ifdim\externalangle pt<\pgfmathresult pt\relax%
                        \pgfmathanglebetweenpoints{\referencepoint}%
                            {\csname pgf@anchor@arrow box@after west arrow\endcsname}%
                        \ifdim\externalangle pt<\pgfmathresult pt\relax%
                            \def\firstpoint{north west}%
                            \def\secondpoint{after west arrow}%
                        \else%
                            \def\firstpoint{after west arrow}%
                            \def\secondpoint{after west arrow head}%
                        \fi%
                    \else%
                        \def\firstpoint{after west arrow tip}%
                        \def\secondpoint{west arrow tip}%
                    \fi%
                \fi%
            \fi%
        \else%
            \pgfmathanglebetweenpoints{\referencepoint}%
                {\csname pgf@anchor@arrow box@south arrow tip\endcsname}%
            \ifdim\externalangle pt<\pgfmathresult pt\relax%
                \pgfmathanglebetweenpoints{\referencepoint}%
                    {\csname pgf@anchor@arrow box@south west\endcsname}%
                \ifdim\externalangle pt<\pgfmathresult pt\relax%
                    \pgfmathanglebetweenpoints{\referencepoint}%
                        {\csname pgf@anchor@arrow box@before west arrow tip\endcsname}%
                    \ifdim\externalangle pt<\pgfmathresult pt\relax%
                        \def\firstpoint{west arrow tip}%
                        \def\secondpoint{before west arrow tip}%
                    \else%
                        \pgfmathanglebetweenpoints{\referencepoint}%
                            {\csname pgf@anchor@arrow box@before west arrow\endcsname}%
                        \ifdim\externalangle pt<\pgfmathresult pt\relax%
                            \def\firstpoint{before west arrow head}%
                            \def\secondpoint{before west arrow}%
                        \else%
                            \def\firstpoint{before west arrow}%
                            \def\secondpoint{south west}%
                        \fi%
                    \fi%
                \else%
                    \pgfmathanglebetweenpoints{\referencepoint}%
                        {\csname pgf@anchor@arrow box@after south arrow tip\endcsname}%
                    \ifdim\externalangle pt<\pgfmathresult pt\relax%
                        \pgfmathanglebetweenpoints{\referencepoint}%
                            {\csname pgf@anchor@arrow box@after south arrow\endcsname}%
                        \ifdim\externalangle pt<\pgfmathresult pt\relax%
                            \def\firstpoint{south west}%
                            \def\secondpoint{after south arrow}%
                        \else%
                            \def\firstpoint{after south arrow}%
                            \def\secondpoint{after south arrow head}%
                        \fi%
                    \else%
                        \def\firstpoint{after south arrow tip}%
                        \def\secondpoint{south arrow tip}%
                    \fi%
                \fi%
            \else%
                \pgfmathanglebetweenpoints{\referencepoint}%
                    {\csname pgf@anchor@arrow box@south east\endcsname}%
                \ifdim\externalangle pt<\pgfmathresult pt\relax%
                    \pgfmathanglebetweenpoints{\referencepoint}%
                        {\csname pgf@anchor@arrow box@before south arrow tip\endcsname}%
                    \ifdim\externalangle pt<\pgfmathresult pt\relax%
                        \def\firstpoint{south arrow tip}%
                        \def\secondpoint{before south arrow tip}%
                    \else%
                        \pgfmathanglebetweenpoints{\referencepoint}%
                            {\csname pgf@anchor@arrow box@before south arrow\endcsname}%
                        \ifdim\externalangle pt<\pgfmathresult pt\relax%
                            \def\firstpoint{before south arrow head}%
                            \def\secondpoint{before south arrow}%
                        \else%
                            \def\firstpoint{before south arrow}%
                            \def\secondpoint{south east}%
                        \fi%
                    \fi%
                \else%
                    \pgfmathanglebetweenpoints{\referencepoint}%
                        {\csname pgf@anchor@arrow box@after east arrow tip\endcsname}%
                    \ifdim\externalangle pt<\pgfmathresult pt\relax%
                        \pgfmathanglebetweenpoints{\referencepoint}%
                            {\csname pgf@anchor@arrow box@after east arrow\endcsname}%
                        \ifdim\externalangle pt<\pgfmathresult pt\relax%
                            \def\firstpoint{south east}%
                            \def\secondpoint{after east arrow}%
                        \else%
                            \def\firstpoint{after east arrow}%
                            \def\secondpoint{after east arrow head}%
                        \fi%
                    \else%
                        \def\firstpoint{after east arrow tip}%
                        \def\secondpoint{east arrow tip}%
                    \fi%
                \fi%
            \fi%
        \fi%
        \pgfpointintersectionoflines{\referencepoint}{\externalpoint}%
            {\csname pgf@anchor@arrow box@\firstpoint\endcsname}%
            {\csname pgf@anchor@arrow box@\secondpoint\endcsname}%
    }%
}%




\endinput
