Overhauled TN-000, and moved some content elsewhere (into TN-011)
authorMothy <troscoe@inf.ethz.ch>
Mon, 9 Dec 2013 12:05:26 +0000 (13:05 +0100)
committerMothy <troscoe@inf.ethz.ch>
Mon, 9 Dec 2013 12:05:26 +0000 (13:05 +0100)
--HG--
rename : doc/000-overview/LMP.pdf => doc/011-idc/figures/LMP.pdf
rename : doc/000-overview/UMP.pdf => doc/011-idc/figures/UMP.pdf

12 files changed:
doc/000-overview/Hakefile
doc/000-overview/Overview.tex
doc/000-overview/graffle/net-arch.odg [new file with mode: 0644]
doc/000-overview/net-arch.pdf [new file with mode: 0644]
doc/001-glossary/Main.hs
doc/011-idc/Hakefile
doc/011-idc/IDC.tex
doc/011-idc/figures/LMP.pdf [moved from doc/000-overview/LMP.pdf with 100% similarity]
doc/011-idc/figures/UMP.pdf [moved from doc/000-overview/UMP.pdf with 100% similarity]
doc/style/barrelfish.bib
doc/style/bftn.sty
doc/style/hyperref.sty [new file with mode: 0644]

index a09832f..26d4c46 100644 (file)
 --
 ----------------------------------------------------------------------
 
-[ buildTechNote "Overview.tex" "TN-000-Overview.pdf" False False
-                    [ "cap_heirarchy", "cap_translation",
-                      "dcb", "LMP", "os-arch", "UMP" ] 
+[ buildTechNote "Overview.tex" "TN-000-Overview.pdf" True False
+                    [ "cap_heirarchy", 
+                      "cap_translation",
+                      "dcb", 
+                      "os-arch" ] 
 ]
 
 
index 59f2e73..7dfd718 100644 (file)
 %
 \begin{versionhistory}
 \vhEntry{1.0}{24.06.2010}{ikuz, amarp}{Initial version}
+\vhEntry{2.0}{04.12.2013}{troscoe,shindep}{Extensively updated}
 \end{versionhistory}
 
 % \intro{Abstract}             % Insert abstract here
 % \intro{Acknowledgements}     % Uncomment (if needed) for acknowledgements
-% \tableofcontents             % Uncomment (if needed) for final draft
+\tableofcontents               % Uncomment (if needed) for final draft
 % \listoffigures               % Uncomment (if needed) for final draft
 % \listoftables                        % Uncomment (if needed) for final draft
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{Barrelfish Architecture Overview}
 
-We start with a high level overview of the architecture of the Barrelfish
-Operating System.
+This document is intended as an introduction to Barrelfish. 
+It presents a high level overview of the architecture of the Barrelfish
+Operating System, together with the most important concepts used
+inside the OS at various levels.  
+
+It does not provide a ``getting started'' guide to running Barrelfish
+on a PC, or in an emulation enviroment like Qemu or GEM5 - this is
+provided in other documentation.  
+
+\section{High level overview}\label{sec:overview}
+
+Barrelfish is ``multikernel'' operating
+system~\cite{barrelfish:sosp09}: it consists of a small kernel running on each core (one kernel per core), and while rest of the
+OS is structured as a distributed system of single-core processes atop
+these kernels.  Kernels share no memory, even on a machine with
+cache-coherent shared RAM, and the rest of the OS does not use shared
+memory except for transferring messages and data between cores, and
+booting other cores.  Applications can use multiple cores and share
+address spaces (and therefore cache-coherent shared memory) between
+cores, but this facility is provided by user-space runtime libraries. 
 
-\section{High level Architecture Overview}\label{sec:overview}
 Figure~\ref{fig:os-arch} shows an overview of the components of the OS.  Each
 core runs a kernel which is called a "CPU driver". The CPU driver maintains
 capabilities, executes syscalls on capabilities, schedules dispatchers, and
 processes interrupts, pagefaults, traps, and exceptions.
 
-The kernel schedules and runs "Dispatchers". Dispatchers are an implementation
-of scheduler activations, thus each dispatcher can run and schedule its own
-threads.  Multiple dispatchers can be combined into a domain. Typically this is
-used to combine related dispatchers running on different cores. Often
-dispatchers in a domain share (all or part of) their vspace. Unless dispatchers
-in a domain run on the same core (which is possible, but rare) they cannot share
-a cspace (since cspaces are core specific).
+The kernel schedules and runs "Dispatchers". Dispatchers are an
+implementation of a form of scheduler
+activations~\cite{Anderson:1991:SAE:121132.121151} (the term is
+borrowed from K42~\cite{k42:scheduling}), thus each dispatcher can run
+and schedule its own threads.  Multiple dispatchers can be combined
+into a domain. Typically this is used to combine related dispatchers
+running on different cores. Often dispatchers in a domain share (all
+or part of) their vspace. Unless dispatchers in a domain run on the
+same core (which is possible, but rare) they cannot share a cspace
+(since cspaces are core specific).
 
 Typically we refer to user level processes (or services or servers) as "user
-domains". Often these consist of single dispatchers running on a single core.
+domains". Often these consist of a single dispatcher running on a single core.
 
 \begin{figure}[hbt]
  \begin{center}
@@ -72,10 +93,84 @@ domains". Often these consist of single dispatchers running on a single core.
  \caption{High level overview of the Barrelfish OS architecture}\label{fig:os-arch}
 \end{figure}
 
+\section{CPU drivers}
+
+The kernel which runs on a given core in a Barrelfish machine is
+called a \emph{CPU driver}.  Each core runs a separate instance of the
+CPU driver, and there is no reason why these drivers have to be the
+same code.  
+
+In a heterogeneous Barrelfish system, CPU drivers will be different
+for each architecture.  However, even on a homogeneous machine, CPU
+drivers for different cores can be specialized for some purposes (for
+example, some might suppose virtualization extensions, while others
+might be optimized for running a single application).  
+
+CPU drivers are single-threaded and non-preemptible.
+They run with interrupts disabled on their core, and share no state
+with other cores.  CPU drivers can be thought of as serially executing
+exception handlers for events such as interrupts, faults, and system
+calls from user-space tasks.  Each such handler executes in bounded time
+and runs to completion.  If there are no such handlers to execute, the
+CPU driver executes a user-space task. 
+
+The functions of a CPU driver are to provide:
+\begin{itemize}
+\item Scheduling of different user-space \textit{dispatchers} on the
+  local core.
+\item Core-local communication of short messages between dispatchers
+  using a variant of Lightweight RPC~\cite{lrpc:tocs90} or L4
+  RPC~\cite{Liedtke:1993:IIK:168619.168633}. 
+\item Secure access to the core hardware, MMU, APIC, etc.
+\item Local access control to kernel objects and physical memory by
+  means of capabilities
+\end{itemize}
+
+CPU drivers do not provide kernel threads, for two reasons.  Firstly,
+the abstraction of the processor provided to user space programs is a
+dispatcher, rather than a thread.  Secondly, since the kernel is
+single-threaded and non-preemptible, it uses only a single, statically
+allocated stack for all operations. After executing a single exception
+handler, the contents of this stack are discarded and reset. 
+
+CPU drivers schedule dispatchers.  The scheduling algorithm employed
+by a given CPU driver binary is configurable at compile time, and two
+are currently implemented:
+\begin{itemize}
+\item A simple round-robin scheduler.  This is primarily used for
+  debugging purposes, since its behavior is easy to understand.
+\item A rate-based scheduler implementing a version of the RBED
+  algorithm~\cite{Brandt:2003:DIS:956418.956606}. This is the
+  preferred per-core scheduler for Barrelfish, and provides efficient
+  scheduling of tasks with a variety of hard and soft realtime jobs
+  with good support for best-effort processes as well. 
+\end{itemize}
+
+\section{Dispatchers}
+
+The dispatcher is the unit of kernel scheduling, and on a single core
+roughly corresponds to the concept of process in Unix.  
+
+A dispatcher can be thought of as the local component of an
+application (often called a \textit{domain} in Barrelfish) on a
+particular core.  An application which spans multiple cores (for
+example, an OpenMP program) has a dispatcher on each core that it
+might potentially execute on.  
 
-\section{Dispatcher}
-The dispatcher is unit of kernel scheduling, and it is responsible for managing
-its own threads.
+Operating system tasks in Barrelfish are always single-core by design,
+and therefore have only one dispatcher.  Applications, however,
+frequently have more, one on each core. 
+
+Dispatchers do not migrate between cores. 
+
+When a CPU driver decides to run a dispatcher as a result of a
+scheduling decision, it
+\emph{upcalls}~\cite{Clark:1985:SSU:323647.323645} into the dispatcher
+as an exit from kernel mode in the manner described below.  The
+user-level code associated with the dispatcher then executes
+user-space thread scheduling, as well as handling other events (such
+as a page fault signal from the kernel or the arrival of an
+inter-domain message). 
 
 \begin{figure}[hbt]
  \begin{center}
@@ -117,14 +212,50 @@ dispatcher that is in disabled state, it does not invoke \texttt{run()}. Instead
 it restores the registers stored in the disabled save area. This causes the
 dispatcher to resume execution from where it was preempted.
 
+\section{Runtime libraries}
+
+The basic runtime of any Barrelfish program is two libraries: a
+standard C library (currently a version of
+\texttt{newlib}~\cite{newlib}), and \texttt{libbarrelfish}.  In
+practice the two libraries are inter-dependent, though there is an
+ongoing effort to minimize truly cyclic dependencies.  The principal
+cycles involve \texttt{malloc()} and communication with the memory
+server. 
+
+The barrelfish library implements the following functionality:
+\begin{itemize}
+\item User-level thread scheduling, based on the upcall model of the
+  dispatcher.
+\item Physical memory management by communication with the memory
+  server. 
+\item Capability management (maintaining the domain's cspace),
+  including allocating new CNodes where necessary. 
+\item Construction of virtual address spaces using capability
+  invocations.
+\item User-level page fault handling.
+\item Communications using message channels, including blocking and
+  nonblocking calls on channels, and the implementation of
+  \texttt{waitset}s (analogous to Unix \texttt{select()} and
+  \texttt{epoll()}). 
+\end{itemize}
+
 \section{Capabilities}
 
-The Barrelfish capability model is similar to the seL4 model. Kernel objects are
-referenced by partitioned capabilities. The actual capability can only be
-directly accessed and manipulated by the kernel, while user level only has
-access to capability references (\texttt{struct capref}), which are addresses in
-a cspace. User level can only manipulate capabilities using kernel system calls
-(to which it passes capability references). In processing a system call the
+Barrelfish uses a single model of
+\emph{capabilities}~\cite{hank:capabilities} to control access to all
+physical memory, kernel objects, communication end-points, and other
+miscellaneous access rights. 
+
+The Barrelfish capability model is similar to the seL4
+model~\cite{sel4:iies08}, with a considerably larger type system and
+extensions for distributed capability management between cores. 
+
+Kernel objects are referenced by partitioned capabilities. The actual
+capability can only be directly accessed and manipulated by the
+kernel, while user level only has access to capability references
+(\texttt{struct capref}), which are addresses in a cspace. User level
+can only manipulate capabilities using kernel system calls (to which
+it passes capability references). In processing a system call the 
 kernel looks up the capability reference in the appropriate cspace to find the
 actual capability; this process is similar to the translation of a virtual
 address to a physical address (Figure~\ref{fig:cap_translation}). A capability
@@ -132,7 +263,6 @@ reference can be used to get \texttt{caddr\_t} and \texttt{valid bits} which are
 used in system calls (see \texttt{include/barrelfish/caddr.h}).  Valid bits are
 used when the user wants to access cnode type capabilities (else, the
 translation process would continue by looking at entries in the cnode).
-
  
 \begin{figure}
   \centering
@@ -145,362 +275,603 @@ translation process would continue by looking at entries in the cnode).
 
 A Dispatcher only has access to the capability references in its cspace. As in
 seL4, capabilities are typed, and there is a strictly defined derivation
-hierarchy (e.g. Figure~\ref{fig:cap_hierarchy}).
+hierarchy (e.g. Figure~\ref{fig:cap_hierarchy}).  The type system for
+capabilities is defined using a domain-specific language called
+Hamlet. 
 
-\section{Virtual Memory}
-Virtual memory in Barrelfish is similar to seL4. Frames are mapped into various
-(platform specific) page table data structures to create an address
-space. Shared memory is achieved by sharing Frames mapped into respective
-vspaces.
-
-\textbf{XXX: some more details needed}
-
-\section{Monitor}
-A monitor user domain runs on every core. It is special in that it is
-responsible for managing the kernel data structures on that core, as well as
-coordinating intra and inter core communication.
+\section{Physical Memory}
 
-There is an communication channel between every pair of monitors running on a
-system. This is set up automatically at startup time.
+All regions of physical address space are referred to by means of
+capabilities.  At present, a memory capability refers to a
+naturally-aligned, power-of-two-sized area of at least a physical page
+in size, though this restriction is likely to go away in the future. 
 
-\textbf{XXX: some more details needed}
+A memory capability can be split into smaller capabilities, and this
+basic mechanism is used for low-level physical memory allocation. 
 
-\section{Memory Server}
-The memory server is responsible for serving RAM capabilities. It receives all
-RAM capabilities at startup and distributes them to other dispatchers as
-requested.
+Memory capabilities are \emph{typed}, and each region type supports a
+limited set of operations.  Initially, memory consists of untyped RAM
+and \emph{device frames}, which are used to refer to memory-mapped I/O
+regions. 
 
-\textbf{XXX: some more details needed}
-
-\section{Boot sequence}
-Grub reads menu.lst and starts domains as specified in the file.  It first
-starts the "kernel" entry, which is typically the cpu driver, on core 0. The
-kernel starts init, which starts mem\_server and monitor. Monitor then starts all
-entries marked with "boot", which is typically: 
+RAM capabilities can be retyped into other types; the precise number
+is defined in the Hamlet language in a file currently located in
+\texttt{/capabilities/caps.hl}.  Some of the more common types of
+memory capability are:
 \begin{itemize}
-\item chips (the name server)
-\item skb (system knowledge base) 
-\item pci (hardware eval, as well as core enumeration, pci access, etc.)
-\item boot\_manager (starts up all other domains)
+\item \emph{Frame} capabilities are RAM capabilities which can be
+  mapped into a user's virtual address space.
+\item \emph{CNode} capabilities are used to hold the bit
+  representation of other capabilities, and construct a domain's
+  cspace.  CNodes can never be mapped as writeable virtual memory,
+  since this would remove the security of the capability system by
+  allowing an application to forge a capability.
+\item \emph{Dispatcher} capabilities hold dispatcher control blocks.
+\item \emph{Page table} capabilities refer to memory which holds page
+  table pages.  There is a different capability type for each level of
+  each type of MMU architecture.
 \end{itemize}
 
-When pci figures out what cores there are, then boot manager(?) starts up
-kernels and monitors on all cores.
-
-Boot manager starts up any other user domains. Extra parameters in menu.lst for
-grub specify which cores the domains start on. The menu.lst info is passed to
-the initial kernel by grub. The kernel passes this on to init, which passes it
-on to other domains as required.
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\chapter{Source Code}\label{chap:benchmarks}
-
-\section{Directory Structure Overview}
-Files related to the material covered in this document
-
-\begin{verbatim}
-
-barrelfish:
-kernel/dispatch.c
-      include/dispatch.h
-
-include/
-    barrelfish/
-        dispatch.h
-        dispatcher.h
-        lmp_chan.h
-        lmp_endpoints.h
-        ump_chan.h
-        ump_endpoint.h
-        ump_impl.h
-        waitset.h
-
-lib/
-    barrelfish/
-        lmp_chan.c
-        lmp_endpoints.c
-        ump_chan.c
-        ump_endpoint.c
-        arch/x86_64/
-            dispatch.c 
-
-if/
-    myapp.if
-
-usr/
-    myapp/
-        myapp.c
-        Hakefile
-build:
-    arch/usr/myapp/_for_app_myapp/ 
-        myappif_flounder_bindings.c
-
-arch/include/if
-        myappif_defs.h
-        myappif_lmp_defs.h
-        myappif_ump_defs.h
-
-\end{verbatim}
-
-
-\section{Writing A Sample Barrelfish Application}
-
-Here we show how to write a simple program on Barrelfish.  \textbf{XXX:} no
-error handling yet.  Refer to \texttt{usr/tests/idctest} for code with proper
-error handling.
-
-\subsection{A Simple Hello World Program}
-
-The source for user domains is stored under \begin{verbatim}/usr\end{verbatim}. 
-
-A simple hello world domain consists of a source file, and a Hakefile. e.g.,
-\begin{verbatim}
-usr/myapp
-    myapp.c
-    Hakefile
-\end{verbatim}
-
-For a simple hello world app, the source is trivial: a simple printf in main
-will suffice (note that for output printf either uses a debug syscall to print
-to the serial output, or a proper serial server if one is available).
-
-\begin{verbatim}
-#include <stdio.h> 
-int main(void) {
-    printf("Hello World\n");
-    return 0;
-}
-\end{verbatim}
-
-To build the domain, call hake.sh in the build directory. This will create a
-Config.hs, Makefile, and symbolic\_targets.mk. You can add myapp in the
-symbolic\_tagets, then run make to build everything. You can also explicitly ask
-make to build the domain. e.g.:
-\begin{verbatim}
-make x86_64/sbin/myapp
-\end{verbatim}
-
-After all is built, the menu.lst needs to be modified to add the domain and have
-it started. Run everything in a simulator using:
-
-\begin{verbatim}
-make sim
-\end{verbatim}
-
-\subsection{A Simple Hello World Program Using IDC}
+\section{Virtual Memory}
 
-Adding IDC (inter-dispatcher communication) is a bit more complicated. It
-requires defining an interface in Flounder IDL, updating the interfaces
-Hakefile, updating the domain's (myapp) Hakefile, and then adding initialization
-code as well as appropriate callbacks to the source file.
+Barrelfish applications are
+\emph{self-paging}~\cite{Hand:1999:SNO:296806.296812}: they securely
+construct and maintain their own page tables, and page faults are
+reflected back to the application by means of an upcall. 
+
+An application constructs its own virtual address space (generally
+abbreviated to \emph{vspace}) using the capability system.  It
+acquires RAM from a memory allocator in the form of RAM capabilities,
+and then retypes these to frames and page tables.  
+
+To take a 32-bit x86 machine without Physical Address Extensions (PAE)
+as a simple example, to map a frame into its vspace an application
+invokes the capability refering to a Page Table page using a system
+call.  The arguments to this capability invocation are (1) a
+capability for a 4kB frame, (2) a slot number (from 0 to 1023), and
+(3) a set of mapping flags.  This will cause the kernel to insert a
+Page Table Entry (PTE) with the appropriate flags into the
+corresponding slot in the Page Table.
+
+Note that, while the user determines exactly what mapping is entered
+in the page table, the process is secure: the user cannot map a frame
+that they do not already hold a capability for, that capability must
+refer to a frame (and not some other type of memory, such as a
+dispatcher control block or CNode), and they must also hold a
+capability for the page table itself. 
+
+Similarly, in this example, for the Page Table page to be useful it
+must itself be referenced from a Page Directory.  To ensure this, the
+user program must perform a similar invocation on the Page Directory
+capability, passing the slot number, flags, and the capability to the
+Page Table page.  As before, the capability type system allows neither
+the construction of an invalid page table for any architecture, nor
+the mapping of any page that the user has no authorization for. 
+
+This model also has the additional feature that any core can construct
+a valid page table for any other core, even if the cores have
+different MMU architectures.  An x86\_64 core can construct a valid
+and secure ARMv7 virtual address space, and pass a capability for the
+L1 Page Table of this vspace to an ARMv7 core for installation. 
+
+Furthermore, since the application is responsible for constructing
+page tables and allocating physical memory itself, it can handle page
+faults by changing its own mappings, potentially paging data to and
+from stable storage in the process. 
+
+Naturally, this pushes significant complexity into the application.
+Paging functionaly is generally hidden in the runtime
+\texttt{libbarrelfish} library, though is available for direct
+manipulation for non-common use cases. 
+
+\section{Inter-domain communication}
+
+Barrelfish provides a uniform interface for passing messages between
+domains, which handles message formating and marshalling, name
+lookup, and end-point binding.  
+
+This interface is \emph{channel-based}: for two domains to
+communicate, they must first establish a channel (which may involve
+agreeing on some shared state).  Messages are thereafter sent on this
+channel.  The process of establishing channel state is known as
+\emph{binding}.
+
+A channel is typed, and the type determines the kinds of messages that
+can be sent on it.  As with many RPC systems, channel types are
+defined using an \emph{interface definition language}, which in
+Barrelfish is known as Flounder.    Flounder interface types are
+generally found in the \texttt{/if} directory in the Barrelfish tree.
+Messages can pass both simple data types and, optionally,
+capabilities. 
+
+To establish a communications channel, a domain typically has to
+acquire an \emph{interface reference} from somewhere, which identifies
+the remote endpoint it will try to connect to.  In the common case,
+this is obtained from the System Knowledge Base, acting as a name
+server. After having bound an interface reference, the result is a
+local stub object at either end of the channel which can be called to
+send a message, and also implements dispatch of received messages. 
+
+In turn, an interface reference is created by a server creating a
+service (analogous to a listening socket) and registering this with a
+name service. 
+
+There are a variety of underlying implementations of message passing
+in Barrelfish, known as \emph{Message Transports}.  Each one is highly
+optimized for a particular hardware scenario.  In general, the binding
+process automatically selects the appropriate transport for a channel,
+though this process can also be overwritten. 
+
+A message transport itself consists of several components:
+\begin{enumerate}
+\item An \emph{interconnect driver} or ICD sends small, fixed-size
+  units of data between domains.  This is highly optimized: for
+  same-core message passing, the LMP (``local message passing'') ICD
+  is based on L4's RPC path, while between cache-coherent cores the
+  UMP (``user-level message passing'') ICD is similar to
+  URPC~\cite{urpc:tocs91} or
+  FastForward~\cite{Giacomoni:2008:FEP:1345206.1345215} and transfers
+  single cache lines without involving the kernel.  Other ICDs exist
+  for specialized messaging hardware, and/or network communication.
+
+  ICDs do \emph{not} export a standard interface; each one is
+  different. 
+\item \emph{Stubs} generated by Flounder from an interface
+  specification provide the uniform interface to clients and servers,
+  and perform the abstraction of ICDs, as well as handling message
+  fragmentation and reassembly in the cases where an application
+  message is larger than the unit transferred by the ICD.  Since
+  different ICDs do not export the same interface, there is a
+  different Flounder code generator for each ICD type, enabling
+  cross-layer optimizations not possible otherwise. 
+\item Finally, some stubs can also invoke separate \emph{Notification
+  Drivers}, which provide a synchronous signal to the receiving domain
+  in cases where the transfer of the message payload itself does not.
+  For example, UMP messages have to be polled by the reciever by
+  default, but on some architectures an additional notification driver
+  can be invoked by the stub to cause an inter-processor interrupt
+  (IPI) after some time if the other end of the channel appears to be
+  asleep. 
+\end{enumerate}
+
+In addition, stubs can also handle other areas of complexity resulting
+from the optimized nature of interconnect drivers.  For example,
+capabilities cannot be sent directly over a UMP channel, since their
+bit representations cannot be safely made available to user-space
+applications.  Instead, the stubs for UMP transport send capabilities
+over a separate, secure channel via the Monitors on the sending and
+receiving cores, which are themselves contacted using LMP (which can
+transfer capabilities) by the sending and receiving domains.  
+
+In this way, transfer of pure data over message transports can be
+extremely fast, at the cost of extra delay when transferring
+capabilities. 
+
+\section{System Knowledge Base}
+
+Barrelfish includes a system service called the System Knowledge Base,
+which is used to store, query, unify, and compute on a variety of data
+about the current running state of the system.  The SKB is widely used
+in Barrelfish; examples are:
 
-An example of hello world extended with an IDC. This will run on two cores (it
-can also be run on the same core), with the client dispatcher sending a message
-to the server who will print out "hello message received!" when it receives the
-message.
+\begin{itemize}
+\item The Octopus lock manager and pub/sub system is built as an
+  extension to the SKB (with a somewhat different interface
+  language). 
+\item Devices are discovered and entered into the SKB, and the SKB
+  contains rules to determine the appropriate driver for each device.
+  This forms device management (see below).
+\item The PCI driver uses constraint solving in the SKB to correctly
+  configure PCI devices and bridges.  The SKB contains a list of known
+  PCI quirks, bugs, and special cases that have to taken in to account
+  when allocating BAR values for address ranges.  Interrupt routing is
+  also performed in the SKB.
+\item The SKB functions as a general-purpose name server / interface
+  trader for the rest of the OS.
+\item The results of online hardware profiling are entered into the
+  SKB at boottime, and can be used to construct optimal communication
+  patterns in the system.
+\end{itemize}
 
+The SKB implemention for Intel architectures is currently based on a
+port of the eCLiPse constraint logic programming
+system~\cite{eclipse}.  This consists of a Prolog interpreter with
+constraint solving extensions, and has been extended with a fast
+key-value store which can also retain capabilities.  Aside from the
+Octopus interface, it is possible to communicate with the SKB by
+sending Prolog expressions as messages.
+
+\section{Device drivers}
+
+Device drivers in Barrelfish are implemented as individual dispatchers
+or domains.  When they start up, they are supplied with arguments
+which include various option variables, together with a set of
+capabilities which authorize the driver to access the hardware device.
+
+The capabilities a driver needs are generally:
+\begin{enumerate}
+\item \emph{Device frame} capabilities for regions of the physical
+  address space containing hardware registers; these regions are then
+  memory-mapped by the driver domain as part of its initialization
+  sequence. 
+\item \emph{Interrupt} capabilities, which can be used to direct the
+  local CPU driver to deliver particular interrupt vectors to the
+  driver domain. 
+\item On x86 machines, \emph{I/O capabilities} allow access to regions
+  of the I/O port space for the driver. 
+\item For message-based device interfaces, such as USB, there may be
+  \emph{communication end-point capabilities} which allow messages to
+  be sent between the driver domain and the driver for the host
+  interface adaptor itself. 
+\end{enumerate}
+
+Hardware interrupts are received by a core, demultiplexed if
+necessary, and then turned into local inter-domain messages which are
+dispatched to the appropriate driver domain.  Each first-level
+interrupt handler disables the interrupt as it is raised.  As in L4,
+interrupts are renabled by the driver domain sending a reply message
+back to the CPU driver. 
+
+Driver domains themselves then export their functionality to clients
+(such as file systems, or network stacks) via further message-passing
+interfaces. 
+
+\section{Device management}
+
+Device management in Barrelfish is performed by a combination of
+components:
+\begin{itemize}
+\item The System Knowledge Base is used to store information about all
+  discovered hardware in the system.  It also holds the information
+  about which driver binaries should be used with which devices, and
+  contains rules to determine on which core each device's driver domain
+  should run. 
+\item Octopus, the Barrelfish locking and pub/sub system built on top
+  of the SKB, is used to propagate events corresponding to device
+  discovery, hotplug, and driver startup and shutdown. 
+\item Kaluga is the Barrelfish device manager, and is responsible to
+  starting up driver domains based on information in the SKB and in
+  response to events disseminated by Octopus.  It handles passing the
+  appropriate authorizations (in the form of device, I/O, and
+  interrupt capabilities) to new driver domains. 
+\item The driver domains themselves populate the SKB with further
+  information about devices. For example, the PCI driver stores
+  information about enumerated buses and functions in the SKB, and USB
+  Host Adaptor drivers so something similar for enumerated devices.
+\end{itemize}
 
-The interface consists of a single message that carries no data payload.
+In newer versions of Barrelfish, the same framework is also used for
+booting (and suspending or shutting down) cores.  In addition to an
+appropriate CPU driver, each core other than the bootstrap core has a
+\emph{Boot Driver}, which is responsible for booting the new core and
+encapsules the protocol (usually platform-specific) for core startup. 
 
-The server exports the interface, providing callback functions that are invoked
-when the export completes, and when a client connects to the interface. After
-the binding is exported it is registered with the name service so that the
-client can find it. When a connection is made, and a binding created, the actual
-message callback handler is registered in the binding so that whenever a message
-is received on the binding it is invoked.
+\section{Monitor}
 
-The client uses the name service to look up the iref of the server, then uses
-this iref to bind (connect) to the server. It provides a callback that is
-invoked when the bind completes. In this example the callback sends a message
-over the newly formed channel.
+Each Barrelfish core runs a special process called the \emph{Monitor},
+which is responsible for distributed coordination between cores.  All
+monitors maintain a network of communication channels among
+themselves; any monitor can talk to (and identify) any other monitor.
+All dispatchers on a core have a local message-passing channel to
+their monitor. 
 
-After setting up connections, both client and server sit in a loop dispatching
-incoming events (causing the appropriate callbacks to be invoked).
+Monitors are trusted: they can fabricate capabilities. This is because
+they are responsible for transferring capabilities between cores, and
+so must be able to serialize a capability into bits and reconstruct it
+at the other end.  Monitors therefore posess a special capability (the
+\emph{Kernel capability}) which allows them to manipulate their local
+core's capability database. 
 
+The monitor performs many low-level OS functions which require
+inter-core communication (since CPU drivers by design do not
+communicate with each other, nor share any memory).  For example: 
 
+\begin{itemize}
+\item Monitors route inter-core bind requests for communication
+  channels between domains which have not previously communicated
+  directly. 
+\item They send capabilities along side channels, since regular
+  domains on different cores cannot send capabilities directly
+  themselves without involving the kernel. 
+\item Monitors help with domain startup by supplying dispatchers with
+  useful initial capabilities (such as a communication channel back
+  to the monitor, and ones to the memory allocator and SKB). 
+\item They perform distributed capability revocation, using a form of
+  two-phase commit protocol among themselves over the capability
+  database. 
+\end{itemize}
 
-\textbf{myappif.if}
-%\lstinputlisting{myapp/if/myappif.if}
-\verbatiminput{myapp/if/myappif.if}
+The monitor contains a distributed implementation of the functionality
+found in the lower-levels of a monolithic kernel.  The choice to make
+it into a user-space process rather than amalgamating it with the CPU
+driver was an engineering decision: it results in lower performance
+(many operations which would be a single syscall on Unix require two
+full context switches to and from the monitor on Barrelfish).
+However, running the monitor as a user-space process means it can be
+time-sliced along with other processes, can block when waiting for I/O
+(the CPU driver has no blocking operations), can be implemented using
+threads, and provides a useful degree of fault isolation (it is quite
+hard to crash the CPU driver in Barrelfish, since it performs no
+blocking operations and requires no dynamic memory allocation).
+
+\section{Memory Servers}
+
+Memory servers are responsible for serving RAM capabilities to
+domains.  A memory server is started with an initial (small) set of
+capabilities which list the regions of memory the server is
+responsible, and they respond to requests from other domains for RAM
+capabilities of different sizes. 
+
+At system startup, there is an initial Memory Server running on the
+bootstrap core which is created with a capability to the entire range
+of RAM addressable from that core.  However, the use of capabilities
+allows this to delegate management of subregions of this space to
+other servers.  This is desirable for two reasons:
+\begin{itemize}
+\item It allows core to have their own memory allocators, greatly
+  improving parallelism and scalability of the system. As in other
+  systems, Barrelfish's per-core allocators can also steal memory from
+  other cores if they become short. 
+\item It permits different allocators for different types of memory,
+  such as different NUMA nodes, or low-memory accessible to legacy DMA
+  devices.
+\end{itemize}
 
-\textbf{myapp.c}
-%\lstinputlisting{myapp/usr/myapp/myapp.c}
-\verbatiminput{myapp/usr/myapp/myapp.c}
+Each new dispatcher in Barrelfish is started with a bootstrapped
+message channel to its own local memory server. 
 
-\textbf{Hakefile}
-%\lstinputlisting{myapp/usr/myapp/Hakefile}
-\verbatiminput{myapp/usr/myapp/Hakefile}
+\section{Filing system}
 
+Barrelfish at present has no native file system.  However, runtime
+libraries do provide a Virtual File System (VFS) interface, and a
+number of backends to this exist (and are used in the system),
+including:
+\begin{itemize}
+\item An NFSv3 client.
+\item A simple RAM-based file system.
+\item Access to the OS multiboot image via the VFS interface.
+\item A FAT file system which can be used with the AHCI driver and ATA
+  library. 
+\end{itemize}
 
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\chapter{IDC: Inter Dispatcher Communication}
-
-
-IDC is performed over different underlying channels, depending on the
-communication mechanisms available. For example, for IDC between dispatchers on
-the same core, LMP is used, while for IDC between cores, UMP (or another
-mechanism depending on the architecture and what is available) is used. The
-mechanism used is determined at binding time. Code for all possible bindings is
-generated from the IDL descriptions.
-
-Performing IDC involves an interface specific binding struct, a waitset, and
-channels.
-
-The binding struct is channel-type specific. It includes an appropriate channel
-struct, and a channel-type independent, but interface specific, binding struct.
-
-For example, for LMP, the channel specific binding struct is: \\
-\texttt{struct myappif\_lmp\_binding (myappif\_lmp\_defs.h)}
-
-The generic binding struct is: \texttt{struct myappif\_binding (myappif\_defs.h)}
-
-The LMP specific channel struct is: \texttt{struct lmp\_chan in (lmp\_defs.h)}
-
-The generic binding struct contains pointers to the sending stubs (stored in a
-vtable filled in by the binder), the message handlers (provided by the client
-and also stored in a vtable), and the waitset associated with the binding.
-
-The channel struct contains all the channel-type specific data necessary to
-perform the actual communication.
-
-The waitset tracks the state of channels and threads waiting for messages
-(actually events, since it also tracks things like connection events, etc.) on
-those channels. It contains several queues of channel structs: the idle queue,
-which stores all channels that don't have any events ready for delivery, the
-pending queue, which stores the channels that have events available for
-delivery, and the polled queue, which stores channels that need to be
-polled. The waitset also keeps a queue of threads that are blocked waiting for
-something to happen on one of the channels.
-
-The way that channels in a waitset work is that a channel is 'triggered' when an
-event occurs (or is discovered during polling) and the channel is moved to the
-pending queue. Once a channel is in the pending queue, further events do not
-trigger it until it has been processed and put back in the idle or polled
-queues. The waitset's thread queue tracks threads that are blocked on the
-waitset. Every time an event triggers a channel and causes it to be moved to the
-pending queue, one thread from the waiting threads queue is unblocked, allowing
-it to process a channel from the pending queue. There should never be threads in
-the waiting queue if there is more than one channel in the pending queue.
-
-see: \texttt{struct waitset (waitset.h)}
-
-The \texttt{event\_dispatch()} function picks up the next pending channel and
-returns its handler. If there are no pending channels it polls any channels on
-the polled queue, triggering (and thus moving to the pending queue) any that has
-an event available. If no channels have events, and there is nothing to poll
-then it blocks.
-
-Sending messages is channel-type specific.
-
-\section{IDC\---LMP: Local Message Passing}
-IDC between dispatchers on the same core uses LMP (local message passing).  LMP
-uses endpoint capabilities for communication.  In this case the channel struct
-contains a reference to a remote endpoint cap (for the sender) and a local
-endpoint cap (for the receiver). It also contains a reference to an endpoint
-structure. This is a struct contained in the receiver's dispatcher and refers to
-a buffer that is used to store incoming messages. The dispatcher can have
-multiple such endpoint buffers.
+\section{Network stack}
 
-\begin{figure}
-  \begin{center}
-    \includegraphics[width=0.5\columnwidth]{LMP.pdf}
-  \end{center}
-  \caption{Local Message Passing}
-  \label{fig:lmp}
+\begin{figure}[hbt]
+ \begin{center}
+ \includegraphics[width=0.7\columnwidth]{net-arch.pdf}
+ \end{center}
+ \caption{High level overview of the Barrelfish network stack}\label{fig:net-arch}
 \end{figure}
 
+At time of writing, the Barrelfish network stack is evolving, but
+Figure~\ref{fig:net-arch} shows the high-level structure.  Barrelfish
+aims at removing as much OS code from the datapath as possible, and
+uses a design inspired by Nemesis~\cite{Black:1997:PIV:648046.745222}
+and Exokernel~\cite{Ganger:2002:FFA:505452.505455}. 
+
+Each physical network interface has a driver which is started by the
+Kaluga device manager service.  This driver is in turn capable of
+initiating a separate \emph{queue manager} for each hardware queue
+supported by the network hardware, and configuring the NIC hardware to
+demultiplex incoming packets to the appropriate queue.  
+
+Applications run their own network stack on a per-flow basis, either
+reading and writing packets directly to and from hardware queues (if
+possible), or with the queue manager performing an extra level of
+multiplexing on each queue.   The queue manager receives events from
+the NIC hardware signalling transmission and reception of packets. 
+
+An additional domain, the network daemon (\texttt{netd}), is
+responsible for non-application network traffic (such as ARP requests
+and responses, and ICMP packets).  This daemon also handles allocation
+of ports from talking to a given network interface. 
 
-The sender's remote endpoint cap is derived from the receiver's dispatcher cap,
-and contains a pointer back to the DCB and an offset into the associated
-endpoint buffer.
-
-When a message is sent, the sender invokes the remote endpoint cap with the
-message to send. This causes the kernel to copy the message into the associated
-endpoint buffer and then make the receiver dispatcher runnable (which will cause
-it's \texttt{run()} upcall to be invoked when it is scheduled). The run function
-then finds the endpoint with a message in it and invokes the trigger on the
-appropriate waitset. The channel's event handler is responsible for getting the
-rest of the message out of the buffer and invoking appropriate user-defined
-handlers.
-
-Sender: \texttt{lmp\_deliver\_payload (dispatch.c)}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{The Barrelfish source tree}\label{chap:sourcetree}
 
-Receiver: \texttt{disp\_run (dispatch.c)}
-          \texttt{lmp\_endpoints\_poll\_disabled (lmp\_endpoints.c)}
+\newenvironment{dirlist}{%
+\let\olditem\item% 
+\renewcommand\item[2][]{\olditem \texttt{##1}:\\[0.3\baselineskip]##2}%
+\begin{description}}{\end{description}%
+}
 
-Event handler: \texttt{myappif\_lmp\_rx\_handler (myappif\_flounder\_bindings.c)}
+The Barrelfish source tree is organized as follows:
+\begin{dirlist}
+\item[capabilities/] Definitions of the capability type system,
+  written in the Hamlet language.
+\item[devices/] Definitions of hardware devices, written in the
+  Mackerel language. 
+\item[doc/] \LaTeX Source code for the Barrelfish Technical Notes, including
+  this one.
+\item[errors/] Definitions of Barrelfish system error codes, written
+  in the Fugu language. 
+\item[hake/] Source code for the Hake build tool.
+\item[if/] Definitions of Barrelfish message-passing interface types,
+  written in the Flounder language. 
+\item[include/] Barrelfish general header files.
+\item[kernel/] Source code for Barrelfish CPU drivers.
+\item[kernel/include/] Header files internal to Barrelfish CPU drivers.
+\item[lib/] Source code for libraries. 
+\item[tools/] Source code for a variety of tools used during the build
+  process. 
+\item[trace\_definitions/] Constant definitions for use by the
+  Barrelfish tracing infrastructure, written in the Pleco language. 
+\item[usr/] Source code for Barrelfish binaries. 
+\item[usr/drivers/] Source code for Barrelfish device driver binaries.
+\end{dirlist}
 
-\textbf{Binding:} The process of binding for LMP involves the sender creating
-the endpoint capability and appropriate buffers, then invoking
-\texttt{lmp\_bind\_request} on the monitor. The monitor sends the request to the
-receiver, where it sets up its own endpoint cap and buffer and binding struct,
-and returns the cap through the monitor to the sender.
 
-\textbf{Passing capabilities - LMP:} When a capability is sent in a message, then
-the kernel must additionally copy the cap to the receiver's cspace (a slot for
-this is setup in the endpoint). The receive handler must ensure that it copies
-the cap out of this cspace slot in order to free it for future transfers.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{The Barrelfish build tree}\label{chap:buildtree}
+
+Successfully building Barrelfish results in a series of files and
+directories in the build directory.  Regardless of the architectures
+requested, the following are likely to be present:
+
+\begin{dirlist}
+\item[docs/] PDF files corresponding to the Barrelfish technical
+  notes, including this one.  Note that these files are probably not
+  built by default, you make have to invoke \texttt{make docs}. 
+\item[hake/] Build files and binary for \texttt{hake}, the Barrelfish
+  build tool.  You should not need to look in here unless you need to
+  edit \texttt{Config.hs}, the system-wide configuration file.
+\item[Hakefiles.hs] A very large Haskell source file containing all
+  the Hakefiles in the system, concatenated together along with some
+  dynamic information on the files in the build tree.  You should not
+  need to refer to this file unless you encounter a bug in Hake.
+\item[Makefile] A very large Makefile, which contains explicit rules
+  to build every file (including intermediate results) in the
+  Barrelfish build tree.  It is sometimes useful to search through
+  this file if the build is failing in some unexpected way.  The only
+  files this Makefile includes are \texttt{symbolic\_targets.mk} and
+  generated C dependency files; all other make information is in this
+  one file.
+\item[menu.lst] An initial file for booting Barrelfish via grub. 
+\item[skb\_ramfs.cpio.gz] A RAM filing system image in the form of a
+  CPIO archive containing support Prolog files for the Barrelfish
+  System Knowledge Base (SKB). 
+\item[sshd\_ramfs.cpio.gz]  A RAM filing system image in the form of a
+  CPIO archive containing support files for the Barrelfish port of the
+  OpenSSH server.
+\item[symbolic\_targets.mk] A file containing symbolic \texttt{make}
+  targets, since all rules in the main, generated Makefile are
+  explicit.  This file contains the definitions necessary to build
+  complete platform images of Barrelfish for various hardware
+  architectures. 
+\item[tools/bin/] Directory containing binaries (for the host system)
+  of various tools needed to building Barrelfish, such as
+  \texttt{flounder}, \texttt{fugu}, \texttt{hamlet}, and
+  \texttt{mackerel}.
+\item[tools/tools/] Intermediate object files for building the tools
+  binaries
+\item[tools/tmp/] Miscellaneous intermediate files, mostly from
+  building Technical Note PDF files.
+\end{dirlist}
+
+In addition, there will be a directory for each architecture for which
+this build was configured, such as \texttt{x86\_64}, \texttt{86\_32},
+\texttt{ARMv7}, etc.  This will contain the following items of
+interest (taking \texttt{x86\_64} as a concrete example):
+
+\begin{dirlist}
+\item[x86\_64/capabilities/] C code generated by Hamlet to encode the
+  capability type system. 
+\item[x86\_64/errors/] C code generated by Fugu to encode the core OS
+  error conditions. 
+\item[x86\_64/include/] Assorted include files, both generated and
+  copied from the source tree. 
+\item[x86\_64/include/dev] Device access function header files
+  generated by Mackerel.
+\item[x86\_64/include/if] Stub definition header files
+  generated by Flounder.
+\item[x86\_64/kernel/] Intermediate build files for all the CPU
+  drivers built for this architecture.
+\item[x86\_64/lib/] Static libraries for the system, together with
+  intermediate build files for the libraries.
+\item[x86\_64/sbin/] All the executable binaries built for this
+  architecture.  The CPU driver is generally known as
+  \texttt{/sbin/cpu}, or a similar name more specific to a given
+  core. 
+\item[x86\_64/tools/] Miscellaneous tools specific to a target
+  architecture.  Typically ELF code, bootloaders, and code to
+  calculate assembly offsets from C definitions. 
+\item[x86\_64/trace\_definitions/] Generated files giving constants
+  for the tracing system in C and JSON (for use by Aquarium2). 
+\item[x86\_64/usr/] Intermediate build files for all the executable
+  binaries whose source is in \texttt{/usr}. 
+\end{dirlist}
 
-\section{IDC\---UMP: Inter-core User-level Message Passing}
 
-IDC between dispatchers on different cores uses UMP (user-level message passing)
-(on x86).
 
-\begin{figure}
-  \begin{center}
-    \includegraphics[width=0.5\columnwidth]{UMP.pdf}
-  \end{center}
-  \caption{User-level Message Passing}
-  \label{fig:ump}
-\end{figure}
 
-UMP uses shared memory and polling and inter-processor interrupts for
-communication. The shared memory is split into a send buffer and a receive
-buffer (Figure~\ref{fig:ump}), with each entry in the buffers being the size of
-a cache line. The sender writes into the send buffer, and the receiver reads
-from it. The receiver polls to determine whether new messages have been
-received.
-
-The binding struct for a UMP channel contains UMP specific channel structs
-(nested within various included structs) which contain a reference to the shared
-memory, as well as a counter specifying the current read or write position.
-
-In order to detect whether the write position has been reached when reading, the
-channel also contains an epoch flag. Every buffer entry has an epoch bit that is
-flipped every time a new entry is added. When reading a new entry the channels's
-epoch is compared to the epoch bit of the buffer slot to be read. If it is the
-same, then the entry is valid, if it is different then it is not valid. The
-channel's epoch flag is flipped every time the counter wraps around.
-
-The sender also has to know whether it is going to run up against the
-receivers's read position. Rather than flip epoch bits on a read (in order to
-avoid bouncing cache lines the buffer is kept write-only for the sender and
-read-only for the receiver) each message has a sequence id. When replying to the
-sender the receiver sends its latest read sequence id. The sender then knows how
-many messages are outstanding and together with knowledge of the buffer size,
-can avoid overwriting messages that haven't been read yet.
-
-\textbf{Binding:} The UMP binding process involves the source creating the
-channel buffers, then sending a cap to the buffer along with a bind request
-through LMP to the monitor. The monitor serialises the cap and sends it through
-to the destination monitor. The destination monitor recreates the cap, and sends
-it on to the receiver. This sets up its channel struct accordingly and finalises
-the binding.
-
-\textbf{Passing capabilities - UMP:} UMP messages containing capabilities must
-be sent in two phases. The non-cap message is sent as normal. The capability
-must be sent through the monitor as only the monitor is able to invoke a syscall
-to serialise and deserialise a capability. The sender sends the capability with
-a request to the monitor, the monitor serialises it and sends it to the
-destination monitor, where it is deserialised, and send through LMP to the
-destination.
 
 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{An overview of Barrelfish documentation}\label{chap:docs}
+
+Barrelfish a rapidly-changing research operating system, and
+consequently it is difficult and resource-intensive to maintain
+coherent, up-to-date documentation at the same time.  However, efforts
+are made to document the system in a number of ways, summarized below.
+
+\section{Technical notes}
+
+The Barrelfish source contains a number of technical notes, which are
+rough-and-ready (and incomplete) documentation, tutorials, reference
+manuals, etc. for the system.  The documents evolve over time, but are
+often the best source of documentation for the system. 
+
+This document is Barrelfish Technical Note 0.  The remaining technical
+notes are as follows:
+\begin{enumerate}
+\item \textbf{Glossary:} A list of Barrelfish-specific terms with
+  definitions. 
+\item \textbf{Mackerel:} Reference manual for the Barrelfish language
+  for specifying hardware registers and in-memory datastructure
+  layouts. 
+\item \textbf{Hake:} A comprehensive manual for the Barrelfish build
+  utility. 
+\item \textbf{Virtual Memory in Barrelfish \textit{obsolete}:} A brief
+  description of virtual memory support in Barrelfish, now superceded
+  by Simon Gerber's dissertation ``Virtual Memory in a Multikernel''. 
+\item \textbf{Barrelfish on the Intel Single-chip Cloud Computer:} A
+  description of the Barrelfish support for the SCC (Rock Creek)
+  processor, together with some performance evaluations and discussion
+  of the hardware. 
+\item \textbf{Routing in Barrelfish:} An early design for routing
+  inter-core messages over multiple hops within the system.
+\item \textbf{The Beehive Processors \textit{obsolete:}} The
+  Barrelfish port to the Chuck Thacker's Beehive processor at
+  Microsoft Research; now removed. 
+\item \textbf{Tracing and Visualization:} The Barrelfish trace
+  infrastructure and associated tools.
+\item \textbf{Message notifications:} A discussion of the use of notification
+  drivers to mitigate the effect of polling when using UMP message
+  channels. 
+\item \textbf{Specification \textit{obsolete:}} An early attempt to
+  document the Barrelfish API, now superceded by other documentation.
+\item \textbf{Inter-dispatcher communication in Barrelfish:}
+  Documentation for the IDC system, including the Flounder interface
+  definition language, and some of the more commonly used interconnect
+  drivers and message transports.
+\item \textbf{Barrelfish OS Services:} A list of services running in a
+  typical Barrelfish machine, together with their interdependencies.
+\item \textbf{Capability Management in Barrelfish:} Documentation
+  for the user-level capability primitives for maniulating caprefs and
+  CNodes. 
+\item \textbf{Bulk Transfer:} A proposed design for transferring large
+  contiguous areas of memory between Barrelfish domains.
+\item \textbf{A Messaging interface to disks:} A comprehensive
+  description of the Barrelfish AHCI driver. 
+\item \textbf{Serial ports:} A discussion of how serial ports are
+  represented in Barrelfish, both inside the CPU driver and from user
+  space. 
+\end{enumerate}
+
+Barrelfish technical notes are built from the Barrelfish tree (using
+\texttt{make docs}), and are also available pre-built from the
+Barrelfish web site at \url{http://www.barrelfish.org/}.
+
+\section{The Barrelfish Wiki}
+
+The Barrelfish project public wiki (at
+\url{http://wiki.barrelfish.org/}) contains a variety of additional
+documentation, including many contributions from users outside the
+core Barrelfish team.
+
+\section{Academic publications}
+
+Many publications related to Barrelfish can be found on the Barrelfish
+web site.  They are not generally detailed documentation for the
+system, but often convey high-level design decisions, concepts, and
+rationales.
+
+\section{Doxygen}
+
+The Barrelfish libraries are annotated for use with Doxygen. 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\bibliographystyle{abbrvnat}
-\bibliography{paper}
+\bibliographystyle{abbrv}
+\bibliography{barrelfish}
 
 \end{document}
diff --git a/doc/000-overview/graffle/net-arch.odg b/doc/000-overview/graffle/net-arch.odg
new file mode 100644 (file)
index 0000000..8331fae
Binary files /dev/null and b/doc/000-overview/graffle/net-arch.odg differ
diff --git a/doc/000-overview/net-arch.pdf b/doc/000-overview/net-arch.pdf
new file mode 100644 (file)
index 0000000..22065d9
Binary files /dev/null and b/doc/000-overview/net-arch.pdf differ
index d5d0357..f5e26d4 100644 (file)
@@ -362,6 +362,15 @@ glossary = [ Entry "dispatcher control block" [ "DCB" ]
              "A tool used to build a boot image in the proprietary Intel \
              \``32.obj'' format, for booting on the Single-chip Cloud \
              \Computer.",
+             Entry "Pleco" []
+
+             "The Domain Specific Language used in Barrelfish to specify \
+             \constants for the tracing infrastructure.  The Pleco \
+             \compiler takes such description and outputs a \
+             \C header file containing the definitions, a C source \
+             \file with the constants, and a JSON file to be used by \
+             \host visualization tools.",
 
              Entry "ZZZ terms yet to be added" []
 
index 715db8c..6dd6f47 100644 (file)
@@ -10,5 +10,7 @@
 --
 ----------------------------------------------------------------------
 
-[ buildTechNote "IDC.tex" "TN-011-IDC.pdf" True False ["figures/ump_bind"]
+[ buildTechNote "IDC.tex" "TN-011-IDC.pdf" True False ["figures/ump_bind",
+                                                       "figures/UMP",
+                                                       "figures/LMP" ]
 ]
index 839b8b8..c6247f6 100644 (file)
@@ -977,6 +977,56 @@ The process of indirect transmission of capabilities is as follows:
 \section{LMP: local (intra-core) message passing}
 \label{sec:lmp_icd}
 
+IDC between dispatchers on the same core uses LMP (local message passing).  LMP
+uses endpoint capabilities for communication.  In this case the channel struct
+contains a reference to a remote endpoint cap (for the sender) and a local
+endpoint cap (for the receiver). It also contains a reference to an endpoint
+structure. This is a struct contained in the receiver's dispatcher and refers to
+a buffer that is used to store incoming messages. The dispatcher can have
+multiple such endpoint buffers.
+
+\begin{figure}
+  \begin{center}
+    \includegraphics[width=0.5\columnwidth]{LMP.pdf}
+  \end{center}
+  \caption{Local Message Passing}
+  \label{fig:lmp}
+\end{figure}
+
+
+The sender's remote endpoint cap is derived from the receiver's dispatcher cap,
+and contains a pointer back to the DCB and an offset into the associated
+endpoint buffer.
+
+When a message is sent, the sender invokes the remote endpoint cap with the
+message to send. This causes the kernel to copy the message into the associated
+endpoint buffer and then make the receiver dispatcher runnable (which will cause
+it's \texttt{run()} upcall to be invoked when it is scheduled). The run function
+then finds the endpoint with a message in it and invokes the trigger on the
+appropriate waitset. The channel's event handler is responsible for getting the
+rest of the message out of the buffer and invoking appropriate user-defined
+handlers.
+
+Sender: \texttt{lmp\_deliver\_payload (dispatch.c)}
+
+Receiver: \texttt{disp\_run (dispatch.c)}
+          \texttt{lmp\_endpoints\_poll\_disabled (lmp\_endpoints.c)}
+
+Event handler: \texttt{myappif\_lmp\_rx\_handler (myappif\_flounder\_bindings.c)}
+
+\textbf{Binding:} The process of binding for LMP involves the sender creating
+the endpoint capability and appropriate buffers, then invoking
+\texttt{lmp\_bind\_request} on the monitor. The monitor sends the request to the
+receiver, where it sets up its own endpoint cap and buffer and binding struct,
+and returns the cap through the monitor to the sender.
+
+\textbf{Passing capabilities - LMP:} When a capability is sent in a message, then
+the kernel must additionally copy the cap to the receiver's cspace (a slot for
+this is setup in the endpoint). The receive handler must ensure that it copies
+the cap out of this cspace slot in order to free it for future transfers.
+
+
+
 \subsection{Messaging with the local Monitor}
 \label{sec:monitor}
 
@@ -984,6 +1034,58 @@ The process of indirect transmission of capabilities is as follows:
 \section{UMP: user-level message passing with coherent shared memory}
 \label{sec:ump_icd}
 
+IDC between dispatchers on different cores uses UMP (user-level message passing)
+(on x86).
+
+\begin{figure}
+  \begin{center}
+    \includegraphics[width=0.5\columnwidth]{UMP.pdf}
+  \end{center}
+  \caption{User-level Message Passing}
+  \label{fig:ump}
+\end{figure}
+
+UMP uses shared memory and polling and inter-processor interrupts for
+communication. The shared memory is split into a send buffer and a receive
+buffer (Figure~\ref{fig:ump}), with each entry in the buffers being the size of
+a cache line. The sender writes into the send buffer, and the receiver reads
+from it. The receiver polls to determine whether new messages have been
+received.
+
+The binding struct for a UMP channel contains UMP specific channel structs
+(nested within various included structs) which contain a reference to the shared
+memory, as well as a counter specifying the current read or write position.
+
+In order to detect whether the write position has been reached when reading, the
+channel also contains an epoch flag. Every buffer entry has an epoch bit that is
+flipped every time a new entry is added. When reading a new entry the channels's
+epoch is compared to the epoch bit of the buffer slot to be read. If it is the
+same, then the entry is valid, if it is different then it is not valid. The
+channel's epoch flag is flipped every time the counter wraps around.
+
+The sender also has to know whether it is going to run up against the
+receivers's read position. Rather than flip epoch bits on a read (in order to
+avoid bouncing cache lines the buffer is kept write-only for the sender and
+read-only for the receiver) each message has a sequence id. When replying to the
+sender the receiver sends its latest read sequence id. The sender then knows how
+many messages are outstanding and together with knowledge of the buffer size,
+can avoid overwriting messages that haven't been read yet.
+
+\textbf{Binding:} The UMP binding process involves the source creating the
+channel buffers, then sending a cap to the buffer along with a bind request
+through LMP to the monitor. The monitor serialises the cap and sends it through
+to the destination monitor. The destination monitor recreates the cap, and sends
+it on to the receiver. This sets up its channel struct accordingly and finalises
+the binding.
+
+\textbf{Passing capabilities - UMP:} UMP messages containing capabilities must
+be sent in two phases. The non-cap message is sent as normal. The capability
+must be sent through the monitor as only the monitor is able to invoke a syscall
+to serialise and deserialise a capability. The sender sends the capability with
+a request to the monitor, the monitor serialises it and sends it to the
+destination monitor, where it is deserialised, and send through LMP to the
+destination.
+
 \section{RCK: message passing on the SCC}
 \label{sec:rck_icd}
 
index 07ec5b2..5566d8b 100644 (file)
@@ -549,14 +549,21 @@ doi = {http://doi.ieeecomputersociety.org/10.1109/MC.1982.1653859},
   year = 1975,
   month = nov
 }
-
-@inproceedings{liedtke:l4:sosp95,
-  author = {Jochen Liedtke},
-  title = {On {\(\mu\)}-kernel construction},
-  booktitle = sosp95,
-  pages = {237--250},
-  year = 1995,
-  month = dec
+@inproceedings{Liedtke:1993:IIK:168619.168633,
+ author = {Liedtke, Jochen},
+ title = {Improving {IPC} by Kernel Design},
+ booktitle = {Proceedings of the Fourteenth ACM Symposium on Operating Systems Principles},
+ series = {SOSP '93},
+ year = {1993},
+ isbn = {0-89791-632-8},
+ location = {Asheville, North Carolina, USA},
+ pages = {175--188},
+ numpages = {14},
+ url = {http://doi.acm.org/10.1145/168619.168633},
+ doi = {10.1145/168619.168633},
+ acmid = {168633},
+ publisher = {ACM},
+ address = {New York, NY, USA},
 }
 
 @inproceedings{lithe:pldi10,
@@ -601,6 +608,28 @@ Henry M. Levy},
   note = {\url{http://savannah.nongnu.org/projects/lwip/}}
 }
 
+@Book{hank:capabilities,
+  author =      {Henry M. Levy},
+  title =       {Capability-based Computer Systems},
+  publisher =   {Digital Press},
+  year =        1984}
+
+@inproceedings{Clark:1985:SSU:323647.323645,
+ author = {Clark, David D.},
+ title = {The Structuring of Systems Using Upcalls},
+ booktitle = {Proceedings of the Tenth ACM Symposium on Operating Systems Principles},
+ series = {SOSP '85},
+ year = {1985},
+ isbn = {0-89791-174-1},
+ location = {Orcas Island, Washington, USA},
+ pages = {171--180},
+ numpages = {10},
+ url = {http://doi.acm.org/10.1145/323647.323645},
+ doi = {10.1145/323647.323645},
+ acmid = {323645},
+ publisher = {ACM},
+ address = {New York, NY, USA},
+} 
 @inproceedings{marlow:runtime,
  author = {Marlow, Simon and Peyton Jones, Simon and Singh, Satnam},
  title = {Runtime support for multicore {H}askell},
@@ -868,6 +897,51 @@ multiprocessors},
   doi = {http://doi.acm.org/10.1145/103720.114701}
 }
 
+@inproceedings{Anderson:1991:SAE:121132.121151,
+ author = {Anderson, Thomas E. and Bershad, Brian N. and Lazowska, Edward D. and Levy, Henry M.},
+ title = {Scheduler Activations: Effective Kernel Support for the User-level Management of Parallelism},
+ booktitle = {Proceedings of the Thirteenth ACM Symposium on Operating Systems Principles},
+ series = {SOSP '91},
+ year = {1991},
+ isbn = {0-89791-447-3},
+ location = {Pacific Grove, California, USA},
+ pages = {95--109},
+ numpages = {15},
+ url = {http://doi.acm.org/10.1145/121132.121151},
+ doi = {10.1145/121132.121151},
+ acmid = {121151},
+ publisher = {ACM},
+ address = {New York, NY, USA},
+} 
+
+@inproceedings{Hand:1999:SNO:296806.296812,
+ author = {Hand, Steven M.},
+ title = {Self-paging in the Nemesis Operating System},
+ booktitle = {Proceedings of the Third Symposium on Operating Systems Design and Implementation},
+ series = {OSDI '99},
+ year = {1999},
+ isbn = {1-880446-39-1},
+ location = {New Orleans, Louisiana, USA},
+ pages = {73--86},
+ numpages = {14},
+ url = {http://dl.acm.org/citation.cfm?id=296806.296812},
+ acmid = {296812},
+ publisher = {USENIX Association},
+ address = {Berkeley, CA, USA},
+} 
+@inproceedings{Brandt:2003:DIS:956418.956606,
+ author = {Brandt, Scott A. and Banachowski, Scott and Lin, Caixue and Bisson, Timothy},
+ title = {Dynamic Integrated Scheduling of Hard Real-Time, Soft Real-Time and Non-Real-Time Processes},
+ booktitle = {Proceedings of the 24th IEEE International Real-Time Systems Symposium},
+ series = {RTSS '03},
+ year = {2003},
+ isbn = {0-7695-2044-8},
+ pages = {396--},
+ url = {http://dl.acm.org/citation.cfm?id=956418.956606},
+ acmid = {956606},
+ publisher = {IEEE Computer Society},
+ address = {Washington, DC, USA},
+}
 @inproceedings{walker:locus:sosp83,
   author = {Bruce Walker and Gerald Popek and Robert English and Charles Kline and Greg Thiel},
   title = {The {LOCUS} Distributed Operating System},
@@ -934,8 +1008,64 @@ D. E. Long and Carlos Maltzahn},
     title = {Optimizing Collective Communication on Multicores},
     year = {2009}
 }
-
-
+@inproceedings{Giacomoni:2008:FEP:1345206.1345215,
+ author = {Giacomoni, John and Moseley, Tipp and Vachharajani, Manish},
+ title = {FastForward for Efficient Pipeline Parallelism: A Cache-optimized Concurrent Lock-free Queue},
+ booktitle = {Proceedings of the 13th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming},
+ series = {PPoPP '08},
+ year = {2008},
+ isbn = {978-1-59593-795-7},
+ location = {Salt Lake City, UT, USA},
+ pages = {43--52},
+ numpages = {10},
+ url = {http://doi.acm.org/10.1145/1345206.1345215},
+ doi = {10.1145/1345206.1345215},
+ acmid = {1345215},
+ publisher = {ACM},
+ address = {New York, NY, USA},
+ keywords = {fastforward, linearizability, lock-free, multicore, multiprocessors, nonblocking synchronization, pipeline parallel, queue},
+} 
+@article{Ganger:2002:FFA:505452.505455,
+ author = {Ganger, Gregory R. and Engler, Dawson R. and Kaashoek, M. Frans and Brice\~{n}o, Hector M. and Hunt, Russell and Pinckney, Thomas},
+ title = {Fast and Flexible Application-level Networking on Exokernel Systems},
+ journal = {ACM Trans. Comput. Syst.},
+ issue_date = {February 2002},
+ volume = {20},
+ number = {1},
+ month = feb,
+ year = {2002},
+ issn = {0734-2071},
+ pages = {49--83},
+ numpages = {35},
+ url = {http://doi.acm.org/10.1145/505452.505455},
+ doi = {10.1145/505452.505455},
+ acmid = {505455},
+ publisher = {ACM},
+ address = {New York, NY, USA},
+ keywords = {Extensible systems, OS structure, fast servers, network services},
+} 
+@inproceedings{Black:1997:PIV:648046.745222,
+ author = {Black, Richard and Barham, Paul T. and Donnelly, Austin and Stratford, Neil},
+ title = {Protocol Implementation in a Vertically Structured Operating System},
+ booktitle = {Proceedings of the 22Nd Annual IEEE Conference on Local Computer Networks},
+ series = {LCN '97},
+ year = {1997},
+ isbn = {0-8186-8141-1},
+ pages = {179--188},
+ numpages = {10},
+ url = {http://dl.acm.org/citation.cfm?id=648046.745222},
+ acmid = {745222},
+ publisher = {IEEE Computer Society},
+ address = {Washington, DC, USA},
+} 
+
+
+@Misc{newlib,
+  author =      {Sourceware},
+  title =       {Newlib},
+  howpublished = {\url{http://www.sourceware.org/newlib/}},
+  month =       {November},
+  year =        2013}
 
 @TechReport{btn000-overview,
   author =      bft,
index 37e731e..0deabb7 100644 (file)
@@ -7,7 +7,7 @@
 
 \ProvidesPackage{bftn}
 
-\usepackage{times}
+\usepackage{palatino}
 \usepackage{fancyhdr}
 \usepackage{vhistory}
 \usepackage{url}
diff --git a/doc/style/hyperref.sty b/doc/style/hyperref.sty
new file mode 100644 (file)
index 0000000..28e62a5
--- /dev/null
@@ -0,0 +1,8169 @@
+%%
+%% This is file `hyperref.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% hyperref.dtx  (with options: `package')
+%% 
+%% File: hyperref.dtx Copyright 1995-2001 Sebastian Rahtz,
+%% with portions written by David Carlisle and Heiko Oberdiek,
+%% 2001-2012 Heiko Oberdiek.
+%%
+%% This file is part of the `Hyperref Bundle'.
+%% -------------------------------------------
+%%
+%% 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 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is Heiko Oberdiek.
+%%
+%% The list of all files belonging to the `Hyperref Bundle' is
+%% given in the file `manifest.txt'.
+%%
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesPackage{hyperref}
+  [2012/02/06 v6.82o %
+  Hypertext links for LaTeX]
+\begingroup
+  \@makeother\`%
+  \@makeother\=%
+  \edef\x{%
+    \edef\noexpand\x{%
+      \endgroup
+      \noexpand\toks@{%
+        \catcode 96=\noexpand\the\catcode`\noexpand\`\relax
+        \catcode 61=\noexpand\the\catcode`\noexpand\=\relax
+      }%
+    }%
+    \noexpand\x
+  }%
+\x
+\@makeother\`
+\@makeother\=
+\def\Hy@SetCatcodes{%
+  \@makeother\`%
+  \@makeother\=%
+  \catcode`\$=3 %
+  \catcode`\&=4 %
+  \catcode`\^=7 %
+  \catcode`\_=8 %
+  \@makeother\|%
+  \@makeother\:%
+  \@makeother\(%
+  \@makeother\)%
+  \@makeother\[%
+  \@makeother\]%
+  \@makeother\/%
+  \@makeother\!%
+  \@makeother\<%
+  \@makeother\>%
+  \@makeother\.%
+  \@makeother\;%
+  \@makeother\+%
+  \@makeother\-%
+  \@makeother\"%
+  \@makeother\'%
+}
+\begingroup
+  \def\x#1{\catcode`\noexpand#1=\the\catcode`#1\relax}%
+  \xdef\Hy@RestoreCatcodes{%
+    \the\toks@
+    \x\$%
+    \x\&%
+    \x\^%
+    \x\_%
+    \x\|%
+    \x\:%
+    \x\(%
+    \x\)%
+    \x\[%
+    \x\]%
+    \x\/%
+    \x\!%
+    \x\<%
+    \x\>%
+    \x\.%
+    \x\;%
+    \x\+%
+    \x\-%
+    \x\"%
+    \x\'%
+  }%
+\endgroup
+\Hy@SetCatcodes
+\IfFileExists{hobsub-hyperref.sty}{%
+  \RequirePackage{hobsub-hyperref}[2011/01/30]%
+}{}
+\RequirePackage{ltxcmds}[2010/10/25]
+\RequirePackage{ifpdf}[2006/02/20]
+\RequirePackage{pdftexcmds}[2009/04/10]
+\@ifpackagelater{pdftexcmds}{2010/11/04}{}{%
+  \ltx@IfUndefined{pdfdraftmode}{%
+    \let\pdf@ifdraftmode\ltx@secondoftwo
+  }{%
+    \ifpdf
+      \def\pdf@ifdraftmode{%
+        \ifnum\pdfdraftmode=\ltx@one
+          \expandafter\ltx@firstoftwo
+        \else
+          \expandafter\ltx@secondoftwo
+        \fi
+      }%
+    \else
+      \let\pdf@ifdraftmode\ltx@secondoftwo
+    \fi
+  }%
+}
+\RequirePackage{infwarerr}[2010/04/08]
+\RequirePackage{keyval}[1997/11/10]
+\RequirePackage{kvsetkeys}[2007/09/29]
+\RequirePackage{pdfescape}[2007/11/11]
+\RequirePackage{ifvtex}
+\RequirePackage{ifxetex}[2006/08/21]
+\RequirePackage{hycolor}
+\RequirePackage{letltxmacro}[2008/06/13]
+\def\Hy@Error{\@PackageError{hyperref}}
+\def\Hy@Warning{\@PackageWarning{hyperref}}
+\def\Hy@WarningNoLine{\@PackageWarningNoLine{hyperref}}
+\def\Hy@Info{\@PackageInfo{hyperref}}
+\def\Hy@InfoNoLine{\@PackageInfoNoLine{hyperref}}
+\def\Hy@Message#1{%
+  \GenericWarning{%
+    (hyperref)\@spaces\@spaces\@spaces\@spaces
+  }{%
+    Package hyperref Message: #1\ltx@gobble
+  }%
+}
+\chardef\Hy@VersionChecked=0 %
+\def\Hy@VersionCheck#1{%
+  \begingroup
+    \ltx@IfUndefined{ver@hyperref.sty}{%
+      \Hy@Error{%
+        This should not happen!\MessageBreak
+        Missing hyperref version%
+      }\@ehd
+    }{%
+      \ltx@IfUndefined{ver@#1}{%
+        \Hy@Error{%
+          This should not happen!\MessageBreak
+          Missing version of `#1'%
+        }\@ehd
+      }{%
+        \def\x##1##2##3{%
+          \expandafter\expandafter\expandafter\Hy@@VersionCheck
+          \expandafter\expandafter\expandafter##2%
+          \csname ver@##3\endcsname##1##1\@nil
+        }%
+        \x{ }\y{hyperref.sty}%
+        \x{ }\z{#1}%
+        \ifx\y\z
+        \else
+          \Hy@Error{%
+            Version mismatch!\MessageBreak
+            * \y: hyperref.sty\MessageBreak
+            * \z: #1%
+          }\@ehd
+        \fi
+      }%
+    }%
+  \endgroup
+  \chardef\Hy@VersionChecked=1 %
+}
+\def\Hy@@VersionCheck #1#2 #3 #4\@nil{%
+  \def#1{#2 #3}%
+}
+\ltx@IfUndefined{pdfmatch}{%
+  \let\Hy@Match\ltx@gobblefour
+}{%
+  \def\Hy@Match#1#2{%
+    \begingroup
+    \edef\^{\ltx@backslashchar\string^}%
+    \edef\.{\ltx@backslashchar.}%
+    \edef\[{\ltx@backslashchar[}% ]]
+    \edef\${\ltx@backslashchar$}%
+    \edef\({\ltx@backslashchar(}%
+    \edef\){\ltx@backslashchar)}%
+    \edef\|{\ltx@backslashchar|}%
+    \edef\*{\ltx@backslashchar*}%
+    \edef\+{\ltx@backslashchar+}%
+    \edef\?{\ltx@backslashchar?}%
+    \edef\{{\ltx@backslashchar\ltx@leftbracechar}%
+    \edef\}{\ltx@rightbracechar}%
+    \edef\\{\ltx@backslashchar\ltx@backslashchar}%
+    \let\ \ltx@space
+    \ifcase\pdfmatch{#2}{#1} %
+      \endgroup
+      \expandafter\ltx@secondoftwo
+    \or
+      \endgroup
+      \expandafter\ltx@firstoftwo
+    \else
+      \Hy@Warning{%
+        Internal error: Wrong pattern!\MessageBreak
+        --> #2 <--\MessageBreak
+        Pattern check ignored%
+      }%
+      \endgroup
+      \expandafter\ltx@firstoftwo
+    \fi
+  }%
+  \ltx@ifpackagelater{ltxcmds}{2010/09/11}{}{%
+    \begingroup
+      \lccode`0=`\{\relax
+    \lowercase{\endgroup
+      \def\ltx@leftbracechar{0}%
+    }%
+    \begingroup
+      \lccode`0=`\}\relax
+    \lowercase{\endgroup
+      \def\ltx@rightbracechar{0}%
+    }%
+  }%
+}
+\@ifundefined{AfterBeginDocument}{%
+  \def\AfterBeginDocument{\AtBeginDocument}%
+}{}%
+\def\Hy@AtBeginDocument{%
+  \ltx@LocalAppendToMacro\Hy@AtBeginDocumentHook
+}
+\def\Hy@AtEndOfPackage{%
+  \ltx@LocalAppendToMacro\Hy@AtEndOfPackageHook
+}
+\let\Hy@AtBeginDocumentHook\ltx@empty
+\let\Hy@AtEndOfPackageHook\ltx@empty
+\AtEndOfPackage{%
+  \Hy@AtEndOfPackageHook
+  \let\Hy@AtEndOfPackageHook\@undefined
+  \AfterBeginDocument{%
+    \Hy@AtBeginDocumentHook{}%
+    \let\Hy@AtBeginDocumentHook\@undefined
+  }%
+}
+\RequirePackage{kvoptions}[2009/07/21]
+\newif\ifHy@stoppedearly
+\newif\ifHy@typexml
+\newif\ifHy@activeanchor
+\newif\ifHy@backref
+\newif\ifHy@bookmarks
+\newif\ifHy@bookmarksnumbered
+\newif\ifHy@bookmarksopen
+\newif\ifHy@breaklinks
+\newif\ifHy@pdfcenterwindow
+\newif\ifHy@CJKbookmarks
+\newif\ifHy@colorlinks
+\newif\ifHy@draft
+\let\Hy@finaltrue\Hy@draftfalse
+\let\Hy@finalfalse\Hy@drafttrue
+\newif\ifHy@pdfescapeform
+\newif\ifHy@hyperfigures
+\newif\ifHy@pdffitwindow
+\newif\ifHy@frenchlinks
+\newif\ifHy@hyperfootnotes
+\newif\ifHy@hyperindex
+\newif\ifHy@hypertexnames
+\newif\ifHy@implicit
+\newif\ifHy@linktocpage
+\newif\ifHy@localanchorname
+\newif\ifHy@pdfmenubar
+\newif\ifHy@naturalnames
+\newif\ifHy@nesting
+\newif\ifHy@pdfnewwindowset
+\newif\ifHy@pdfnewwindow
+\newif\ifHy@ocgcolorlinks
+\newif\ifHy@pageanchor
+\newif\ifHy@pdfpagelabels
+\newif\ifHy@pdfpagehidden
+\newif\ifHy@pdfstring
+\newif\ifHy@plainpages
+\newif\ifHy@psize
+\newif\ifHy@raiselinks
+\newif\ifHy@seminarslides
+\newif\ifHy@setpagesize
+\newif\ifHy@texht
+\newif\ifHy@pdftoolbar
+\newif\ifHy@unicode
+\newif\ifHy@pdfusetitle
+\newif\ifHy@verbose
+\let\Hy@debugtrue\Hy@verbosetrue
+\let\Hy@debugfalse\Hy@verbosefalse
+\newif\ifHy@pdfwindowui
+\newif\ifHy@pdfdisplaydoctitle
+\newif\ifHy@pdfa
+\Hy@backreffalse
+\Hy@bookmarksnumberedfalse
+\Hy@bookmarksopenfalse
+\Hy@bookmarkstrue
+\Hy@breaklinksfalse
+\Hy@pdfcenterwindowfalse
+\Hy@CJKbookmarksfalse
+\Hy@pdfescapeformfalse
+\Hy@hyperfiguresfalse
+\Hy@pdffitwindowfalse
+\Hy@hyperfootnotestrue
+\Hy@hyperindextrue
+\Hy@hypertexnamestrue
+\Hy@implicittrue
+\Hy@linktocpagefalse
+\Hy@localanchornamefalse
+\Hy@pdfmenubartrue
+\Hy@naturalnamesfalse
+\Hy@nestingfalse
+\Hy@pdfnewwindowsetfalse
+\Hy@pdfnewwindowfalse
+\Hy@pageanchortrue
+\Hy@pdfpagelabelstrue
+\Hy@pdfpagehiddenfalse
+\Hy@pdfstringfalse
+\Hy@plainpagesfalse
+\Hy@raiselinksfalse
+\Hy@setpagesizetrue
+\Hy@texhtfalse
+\Hy@pdftoolbartrue
+\Hy@typexmlfalse
+\Hy@unicodefalse
+\Hy@pdfusetitlefalse
+\Hy@verbosefalse
+\Hy@pdfwindowuitrue
+\Hy@pdfdisplaydoctitlefalse
+\Hy@pdfafalse
+\def\Hy@StepCount#1{\advance#1 by 1 }%
+\def\Hy@GlobalStepCount#1{\global\advance#1 by 1 }%
+\newdimen\@linkdim
+\let\Hy@driver\ltx@empty
+\let\MaybeStopEarly\relax
+\newcount\Hy@linkcounter
+\newcount\Hy@pagecounter
+\Hy@linkcounter0
+\Hy@pagecounter0
+\let\Hy@ReturnEnd\@empty
+\long\def\Hy@ReturnAfterFiFiEnd#1\fi#2\Hy@ReturnEnd{\fi\fi#1}
+\long\def\Hy@ReturnAfterElseFiFiEnd#1\else#2\Hy@ReturnEnd{\fi\fi#1}
+\def\Hy@safe@activestrue{\csname @safe@activestrue\endcsname}
+\def\Hy@safe@activesfalse{\csname @safe@activesfalse\endcsname}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname dimexpr\endcsname\relax
+  \def\hypercalcbpdef#1#2{%
+    \begingroup
+      \toks@{}%
+      \HyCal@scan#2\hypercalcbp\@nil
+    \expandafter\endgroup
+    \expandafter\def\expandafter#1\expandafter{\the\toks@}%
+  }%
+  \def\HyCal@scan#1\hypercalcbp#2\@nil{%
+    \toks@\expandafter{\the\toks@ #1}%
+    \ifx\\#2\\%
+    \else
+      \ltx@ReturnAfterFi{%
+        \HyCal@do#2\@nil
+      }%
+    \fi
+  }%
+  \def\HyCal@do#1#2\@nil{%
+    \@ifpackageloaded{calc}{}{%
+      \Hy@Warning{%
+        For calculations \string\hypercalcbp\space needs\MessageBreak
+        package calc or e-TeX%
+      }%
+    }%
+    \setlength{\dimen@}{#1}%
+    \setlength{\dimen@}{0.99626401\dimen@}%
+    \edef\x{%
+      \toks@{%
+        \the\toks@
+        \strip@pt\dimen@
+      }%
+    }\x
+    \HyCal@scan#2\@nil
+  }%
+\else
+  \def\hypercalcbp#1{%
+    \strip@pt\dimexpr 0.99626401\dimexpr(#1)\relax\relax
+  }%
+  \def\hypercalcbpdef{\def}%
+\fi
+\def\pdfstringdef#1#2{%
+  \begingroup
+    \escapechar`\\%
+    \edef\0{\string\0}%
+    \edef\1{\string\1}%
+    \edef\2{\string\2}%
+    \edef\3{\string\3}%
+    \ifHy@unicode
+      \edef\8{\string\8}%
+      \edef\9{\string\9}%
+      \fontencoding{PU}%
+      \HyPsd@UTFviii
+      \def\ifpdfstringunicode##1##2{##1}%
+    \else
+      \fontencoding{PD1}%
+      \def\ifpdfstringunicode##1##2{##2}%
+    \fi
+    \let\utf@viii@undeferr\HyPsd@utf@viii@undeferr
+    \enc@update
+    \@inmathwarn\pdfstringdef
+    \let\@inmathwarn\HyPsd@inmathwarn
+    \let\add@accent\HyPsd@add@accent
+    \let\{\textbraceleft
+    \let\}\textbraceright
+    \let\\\textbackslash
+    \let\#\textnumbersign
+    \let\$\textdollar
+    \let\%\textpercent
+    \let\&\textampersand
+    \let\_\textunderscore
+    \let\P\textparagraph
+    \let\ldots\textellipsis
+    \let\dots\textellipsis
+    \def\\{\pdfstringdefWarn\\}%
+    \def\newline{\pdfstringdefWarn\newline}%
+    \def\TeX{TeX}%
+    \def\LaTeX{La\TeX}%
+    \def\LaTeXe{%
+      \LaTeX2%
+      \ifHy@unicode\textepsilon\else e\fi
+    }%
+    \def\eTeX{%
+      \ifHy@unicode\textepsilon\else e\fi
+      -\TeX%
+    }%
+    \def\SliTeX{Sli\TeX}%
+    \def\MF{Metafont}%
+    \def\MP{Metapost}%
+    \let\fontencoding\@gobble
+    \let\fontfamily\@gobble
+    \let\fontseries\@gobble
+    \let\fontshape\@gobble
+    \let\fontsize\@gobbletwo
+    \let\selectfont\@empty
+    \let\usefont\@gobblefour
+    \let\emph\@firstofone
+    \let\textnormal\@firstofone
+    \let\textrm\@firstofone
+    \let\textsf\@firstofone
+    \let\texttt\@firstofone
+    \let\textbf\@firstofone
+    \let\textmd\@firstofone
+    \let\textit\@firstofone
+    \let\textsc\@firstofone
+    \let\textsl\@firstofone
+    \let\textup\@firstofone
+    \let\normalfont\@empty
+    \let\rmfamily\@empty
+    \let\sffamily\@empty
+    \let\ttfamily\@empty
+    \let\bfseries\@empty
+    \let\mdseries\@empty
+    \let\itshape\@empty
+    \let\scshape\@empty
+    \let\slshape\@empty
+    \let\upshape\@empty
+    \let\em\@empty
+    \let\rm\@empty
+    \let\Huge\@empty
+    \let\LARGE\@empty
+    \let\Large\@empty
+    \let\footnotesize\@empty
+    \let\huge\@empty
+    \let\large\@empty
+    \let\normalsize\@empty
+    \let\scriptsize\@empty
+    \let\small\@empty
+    \let\tiny\@empty
+    \let\mathversion\@gobble
+    \let\phantom\@gobble
+    \let\vphantom\@gobble
+    \let\hphantom\@gobble
+    \def\begin#1{\csname#1\endcsname}%
+    \def\end#1{\csname end#1\endcsname}%
+    \def\textcolor##1##{\@secondoftwo}%
+    \def\MakeUppercase{\MakeUppercaseUnsupportedInPdfStrings}%
+    \def\MakeLowercase{\MakeLowercaseUnsupportedInPdfStrings}%
+    \let\foreignlanguage\@secondoftwo
+    \let\textlatin\@firstofone
+    \ltx@IfUndefined{language@group}{}{%
+      \csname HyPsd@babel@\language@group\endcsname
+    }%
+    \HyPsd@GreekPatch
+    \HyPsd@SpanishPatch
+    \HyPsd@RussianPatch
+    \HyPsd@BabelPatch
+    \let\@safe@activestrue\relax
+    \let\@safe@activesfalse\relax
+    \let\cyr\relax
+    \let\es@roman\@Roman
+    \let\glqq\textglqq
+    \let\grqq\textgrqq
+    \let\glq\textglq
+    \let\grq\textgrq
+    \let\flqq\textflqq
+    \let\frqq\textfrqq
+    \let\flq\textflq
+    \let\frq\textfrq
+    \let\if@mid@expandable\@firstoftwo
+    \HyPsd@AMSclassfix
+    \let\hspace\HyPsd@hspace
+    \let\label\@gobble
+    \let\index\@gobble
+    \let\glossary\@gobble
+    \let\href\HyPsd@href
+    \let\@mkboth\@gobbletwo
+    \let\ref\HyPsd@ref
+    \let\pageref\HyPsd@pageref
+    \let\nameref\HyPsd@nameref
+    \let\autoref\HyPsd@autoref
+    \let\leavevmode\@empty
+    \let\mbox\@empty
+    \def\halign{\pdfstringdefWarn\halign\@gobble}%
+    \let\ignorespaces\HyPsd@ignorespaces
+    \let\Hy@SectionAnchorHref\@gobble
+    \HyPsd@CJKhook
+    \Hy@pdfstringtrue
+    \pdfstringdefPreHook
+    \HyPsd@LetUnexpandableSpace\space
+    \HyPsd@LetUnexpandableSpace\ %
+    \HyPsd@LetUnexpandableSpace~%
+    \HyPsd@LetUnexpandableSpace\nobreakspace
+    \ltx@IfUndefined{@xspace}{%
+      \let\xspace\HyPsd@ITALCORR
+    }{%
+      \let\xspace\HyPsd@XSPACE
+    }%
+    \let\/\HyPsd@ITALCORR
+    \let\bgroup\/%
+    \let\egroup\/%
+    \let\discretionary\@gobbletwo
+    \def\@ifnextchar{\HyPsd@ifnextchar\@ifnextchar}%
+    \def\kernel@ifnextchar{\HyPsd@ifnextchar\kernel@ifnextchar}%
+    \def\new@ifnextchar{\HyPsd@ifnextchar\new@ifnextchar}%
+    \let\@protected@testopt\HyPsd@protected@testopt
+    \let\@protected@testopt@xargs\HyPsd@protected@testopt
+    \begingroup
+      \let\GenericError\@gobblefour
+      \let\GenericWarning\@gobbletwo
+      \let\GenericInfo\@gobbletwo
+      \ifx\nofrenchguillemets\@undefined
+      \else
+        \nofrenchguillemets
+      \fi
+      \let\Hy@temp\xdef
+      \let\def\HyPsd@DefCommand
+      \let\gdef\HyPsd@DefCommand
+      \let\edef\HyPsd@DefCommand
+      \let\xdef\HyPsd@DefCommand
+      \let\futurelet\HyPsd@LetCommand
+      \let\let\HyPsd@LetCommand
+      \Hy@temp#1{#2}%
+    \endgroup
+    \ifx#1\@empty
+    \else
+      \HyPsd@ProtectSpaces#1%
+      \let\HyPsd@String\@empty
+      \expandafter\HyPsd@RemoveBraces\expandafter{#1|}%
+      \global\let#1\HyPsd@String
+      \let\HyPsd@SPACEOPTI\relax
+      {%
+         \let\HyPsd@String\@empty
+         \expandafter\HyPsd@CheckCatcodes#1\HyPsd@End
+         \global\let#1\HyPsd@String
+      }%
+      \expandafter\HyPsd@RemoveMask\expandafter
+        |\expandafter\@empty#1\HyPsd@End#1%
+      \expandafter\HyPsd@Subst\expandafter{\HyPsd@GLYPHERR}{\relax}#1%
+      \let\HyPsd@String\@empty
+      \expandafter\HyPsd@GlyphProcess#1\relax\@empty
+      \global\let#1\HyPsd@String
+      \HyPsd@StringSubst{\\}{\textbackslash}#1%
+      \ifHy@unicode
+        \expandafter\HyPsd@StringSubst\csname 80\040\endcsname
+          \HyPsd@SPACEOPTI#1%
+        \edef\Hy@temp@A{\HyPsd@SPACEOPTI\HyPsd@SPACEOPTI\80\273}%
+        \expandafter\HyPsd@Subst\expandafter{\Hy@temp@A}%
+          {\HyPsd@SPACEOPTI\80\273}#1%
+      \else
+        \HyPsd@StringSubst{\040}\HyPsd@SPACEOPTI#1%
+        \expandafter\HyPsd@Subst\expandafter{%
+          \expandafter\HyPsd@SPACEOPTI\expandafter\HyPsd@SPACEOPTI
+          \string\273}{\HyPsd@SPACEOPTI\273}#1%
+      \fi
+      \ifHy@unicode
+        \HyPsd@StringSubst{\)}{\80\051}#1%
+        \HyPsd@Subst){\80\051}#1%
+        \let\HyPsd@empty\relax
+        \expandafter\HyPsd@StringSubst\csname 80\051\endcsname
+          {\HyPsd@empty\80\051}#1%
+      \else
+        \HyPsd@StringSubst{\)}{\051}#1%
+        \HyPsd@Subst){\051}#1%
+        \let\HyPsd@empty\relax
+        \HyPsd@StringSubst{\051}{\HyPsd@empty\string\)}#1%
+      \fi
+      \expandafter\HyPsd@Subst\expandafter{\/}\HyPsd@empty#1%
+      \ltx@IfUndefined{@xspace}{%
+      }{%
+        \let\HyPsd@xspace\relax
+        \expandafter\HyPsd@Subst\expandafter
+          {\HyPsd@XSPACE}\HyPsd@xspace#1%
+        \let\HyPsd@xspace\HyPsd@doxspace
+      }%
+      \xdef#1{#1\HyPsd@empty}%
+      \HyPsd@Subst{---}\textemdash#1%
+      \HyPsd@Subst{--}\textendash#1%
+      \HyPsd@Subst{!`}\textexclamdown#1%
+      \HyPsd@Subst{?`}\textquestiondown#1%
+      \let\HyPsd@empty\@empty
+      \ifHy@unicode
+        \HyPsd@StringSubst\(\textparenleft#1%
+        \HyPsd@Subst(\textparenleft#1%
+      \else
+        \HyPsd@StringSubst\({\050}#1%
+        \HyPsd@Subst({\050}#1%
+        \HyPsd@StringSubst{\050}{\string\(}#1%
+      \fi
+      \ifHy@unicode
+        \edef\HyPsd@SPACEOPTI{\80\040}%
+      \else
+        \let\HyPsd@SPACEOPTI\HyPsd@spaceopti
+      \fi
+      \xdef#1{#1\@empty}%
+    \fi
+  \endgroup
+  \begingroup
+    \ifHy@unicode
+      \HyPsd@ConvertToUnicode#1%
+      \ifx\HyPsd@pdfencoding\HyPsd@pdfencoding@auto
+        \ltx@IfUndefined{StringEncodingConvertTest}{%
+        }{%
+          \EdefUnescapeString\HyPsd@temp#1%
+          \ifxetex
+            \let\HyPsd@UnescapedString\HyPsd@temp
+            \StringEncodingConvertTest\HyPsd@temp\HyPsd@temp
+                                      {utf16be}{ascii-print}{%
+              \EdefEscapeString\HyPsd@temp\HyPsd@temp
+              \global\let#1\HyPsd@temp
+              \HyPsd@EscapeTeX#1%
+              \Hy@unicodefalse
+            }{%
+              \HyPsd@ToBigChars#1%
+            }%
+          \else
+            \StringEncodingConvertTest\HyPsd@temp\HyPsd@temp
+                                      {utf16be}{pdfdoc}{%
+              \EdefEscapeString\HyPsd@temp\HyPsd@temp
+              \global\let#1\HyPsd@temp
+              \HyPsd@EscapeTeX#1%
+              \Hy@unicodefalse
+            }{}%
+          \fi
+        }%
+      \fi
+    \fi
+    \HyPsd@XeTeXBigCharsfalse
+    \pdfstringdefPostHook#1%
+  \endgroup
+}
+\def\Hy@pdfstringdef#1#2{%
+  \pdfstringdef\Hy@gtemp{#2}%
+  \let#1\Hy@gtemp
+}
+\edef\Hy@temp{\catcode0=\the\catcode0\relax}
+\catcode\z@=12 %
+\ifxetex
+  \expandafter\@firstofone
+\else
+  \let\HyPsd@XeTeXBigCharstrue\@empty
+  \let\HyPsd@XeTeXBigCharsfalse\@empty
+  \expandafter\@gobble
+\fi
+{%
+  \newif\ifHyPsd@XeTeXBigChars
+  \def\HyPsd@XeTeXBigCharsfalse{%
+    \global\let\ifHyPsd@XeTeXBigChars\iffalse
+  }%
+  \def\HyPsd@XeTeXBigCharstrue{%
+    \global\let\ifHyPsd@XeTeXBigChars\iftrue
+  }%
+  \def\HyPsd@ToBigChars#1{%
+    \ifHyPsd@XeTeXBigChars
+      \EdefEscapeHex\HyPsd@UnescapedString{%
+        \expandafter\@gobbletwo\HyPsd@UnescapedString
+      }%
+      \begingroup
+        \toks@{}%
+        \escapechar=92\relax
+        \let\x\HyPsd@ToBigChar
+        \expandafter\HyPsd@ToBigChar\HyPsd@UnescapedString
+        \relax\relax\relax\relax\relax\relax\relax
+      \edef\x{%
+        \endgroup
+        \gdef\noexpand#1{\the\toks@}%
+      }%
+      \x
+    \fi
+  }%
+  \def\HyPsd@ToBigChar#1#2#3#4{%
+    \ifx\relax#1\relax
+      \let\x\relax
+    \else
+      \count@="#1#2#3#4\relax
+      \let\y\@empty
+      \lccode\z@=\count@
+      \ifnum\count@=40 % (
+        \let\y\@backslashchar
+      \else
+        \ifnum\count@=41 % )
+          \let\y\@backslashchar
+        \else
+          \ifnum\count@=92 % backslash
+            \let\y\@backslashchar
+          \else
+            \ifnum\count@=10 % newline
+              \edef\y##1{\string\n}%
+            \else
+              \ifnum\count@=13 % carriage return
+                \edef\y##1{\string\r}%
+              \fi
+            \fi
+          \fi
+        \fi
+      \fi
+      \lowercase{%
+        \toks@\expandafter{%
+          \the\expandafter\toks@
+          \y
+          ^^@%
+        }%
+      }%
+    \fi
+    \x
+  }%
+}
+\Hy@temp
+\@ifpackageloaded{linguex}{%
+  \let\HyLinguex@OrgB\b
+  \let\HyLinguex@OrgC\c
+  \let\HyLinguex@OrgD\d
+  \def\HyLinguex@Restore{%
+    \let\b\HyLinguex@OrgB
+    \let\c\HyLinguex@OrgC
+    \let\d\HyLinguex@OrgD
+  }%
+  \Hy@AtEndOfPackage{%
+    \pdfstringdefDisableCommands{%
+      \ltx@IfUndefined{oldb}{}{\let\b\oldb}%
+      \ltx@IfUndefined{oldc}{}{\let\c\oldc}%
+      \ltx@IfUndefined{oldd}{}{\let\d\oldd}%
+    }%
+  }%
+}{%
+  \let\HyLinguex@Restore\relax
+}%
+\@ifundefined{T@PD1}{%
+  \input{pd1enc.def}%
+  \HyLinguex@Restore
+}{}
+\DeclareFontFamily{PD1}{pdf}{}
+\DeclareFontShape{PD1}{pdf}{m}{n}{ <-> cmr10 }{}
+\DeclareFontSubstitution{PD1}{pdf}{m}{n}
+\def\HyPsd@InitUnicode{%
+  \@ifundefined{T@PU}{%
+    \input{puenc.def}%
+    \HyLinguex@Restore
+  }{}%
+  \DeclareFontFamily{PU}{pdf}{}%
+  \DeclareFontShape{PU}{pdf}{m}{n}{ <-> cmr10 }{}%
+  \DeclareFontSubstitution{PU}{pdf}{m}{n}%
+  \let\HyPsd@InitUnicode\relax
+}
+\def\texorpdfstring{%
+   \ifHy@pdfstring
+     \expandafter\@secondoftwo
+   \else
+     \expandafter\@firstoftwo
+   \fi
+}
+\@ifundefined{pdfstringdefPreHook}{%
+  \let\pdfstringdefPreHook\@empty
+}{}
+\@ifundefined{pdfstringdefPostHook}{%
+  \let\pdfstringdefPostHook\@gobble
+}{}
+\def\pdfstringdefDisableCommands{%
+  \begingroup
+    \makeatletter
+    \HyPsd@DisableCommands
+}
+\long\def\HyPsd@DisableCommands#1{%
+    \ltx@GlobalAppendToMacro\pdfstringdefPreHook{#1}%
+  \endgroup
+}
+\def\pdfstringdefWarn#1{%
+   \expandafter\noexpand\csname<>-\string#1\endcsname
+}
+\begingroup
+  \catcode0=12 %
+  \def\x{\endgroup
+    \def\HyPsd@ignorespaces{%
+      \romannumeral\expandafter`\expandafter^^@%
+      \romannumeral`^^@%
+    }%
+  }%
+\x
+\def\HyPsd@BabelPatch{%
+  \let\HyOrg@languageshorthands\languageshorthands
+  \let\languageshorthands\HyPsd@LanguageShorthands
+}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname pdf@strcmp\endcsname\relax
+  \let\HyPsd@langshort@system\@empty
+  \def\HyPsd@LanguageShorthands#1{%
+    \expandafter\ifx\csname HyPsd@langshort@#1\endcsname
+                    \HyPsd@langshort@system
+      \expandafter\@gobble
+    \else
+      \expandafter\@firstofone
+    \fi
+    {%
+      \HyOrg@languageshorthands{#1}%
+    }%
+  }%
+\else
+  \def\HyPsd@LanguageShorthands#1{%
+    \ifnum\pdf@strcmp{#1}{system}=\z@
+      \expandafter\@gobble
+    \else
+      \expandafter\@firstofone
+    \fi
+    {%
+      \HyOrg@languageshorthands{#1}%
+    }%
+  }%
+\fi
+\def\Hy@temp{%
+  \@ifpackageloaded{babel}{%
+    \@ifpackagelater{babel}{2008/03/16}{%
+      \let\Hy@temp\@empty
+    }{%
+      \def\HyPsd@BabelPatch{%
+        \let\HyOrg@languageshorthands\languageshorthands
+      }%
+    }%
+  }{}%
+}
+\Hy@temp
+\expandafter\Hy@AtBeginDocument\expandafter{\Hy@temp}
+\newif\ifHy@next
+\ltx@IfUndefined{danish@sh@"@sel}{}{%
+  \def\HyPsd@babel@danish{%
+    \declare@shorthand{danish}{"|}{}%
+    \declare@shorthand{danish}{"~}{-}%
+  }%
+}
+\ltx@IfUndefined{dutch@sh@"@sel}{}{%
+  \def\HyPsd@babel@dutch{%
+    \declare@shorthand{dutch}{"|}{}%
+    \declare@shorthand{dutch}{"~}{-}%
+  }%
+}
+\ltx@IfUndefined{finnish@sh@"@sel}{}{%
+  \def\HyPsd@babel@finnish{%
+    \declare@shorthand{finnish}{"|}{}%
+  }%
+}
+\ltx@IfUndefined{french@sh@:@sel}{}{%
+  \def\HyPsd@babel@frenchb{%
+    \def\guill@spacing{ }%
+  }%
+}
+\ltx@IfUndefined{german@sh@"@sel}{}{%
+  \def\HyPsd@babel@german{%
+    \declare@shorthand{german}{"f}{f}%
+    \declare@shorthand{german}{"|}{}%
+    \declare@shorthand{german}{"~}{-}%
+  }%
+}
+\ltx@IfUndefined{macedonian@sh@"@sel}{}{%
+  \def\HyPsd@babel@macedonian{%
+    \declare@shorthand{macedonian}{"|}{}%
+    \declare@shorthand{macedonian}{"~}{-}%
+  }%
+}{}
+\ltx@IfUndefined{ngerman@sh@"@sel}{}{%
+  \def\HyPsd@babel@ngerman{%
+    \declare@shorthand{ngerman}{"|}{}%
+    \declare@shorthand{ngerman}{"~}{-}%
+  }%
+}
+\ltx@IfUndefined{portuges@sh@"@sel}{}{%
+  \def\HyPsd@babel@portuges{%
+    \declare@shorthand{portuges}{"|}{}%
+  }%
+}
+\ltx@IfUndefined{russian@sh@"@sel}{}{%
+  \def\HyPsd@babel@russian{%
+    \declare@shorthand{russian}{"|}{}%
+    \declare@shorthand{russian}{"~}{-}%
+  }%
+}
+\ltx@IfUndefined{slovene@sh@"@sel}{}{%
+  \def\HyPsd@babel@slovene{%
+    \declare@shorthand{slovene}{"|}{}%
+  }%
+}
+\ltx@IfUndefined{spanish@sh@>@sel}{}{%
+  \def\HyPsd@babel@spanish{%
+    \declare@shorthand{spanish}{<<}{\guillemotleft}%
+    \declare@shorthand{spanish}{>>}{\guillemotright}%
+    \declare@shorthand{spanish}{"=}{-}%
+    \declare@shorthand{spanish}{"~}{-}%
+    \declare@shorthand{spanish}{"!}{\textexclamdown}%
+    \declare@shorthand{spanish}{"?}{\textquestiondown}%
+  }%
+}
+\ltx@IfUndefined{swedish@sh@"@sel}{}{%
+  \def\HyPsd@babel@swedish{%
+    \declare@shorthand{swedish}{"|}{}%
+    \declare@shorthand{swedish}{"~}{-}%
+  }%
+}
+\ltx@IfUndefined{ukrainian@sh@"@sel}{}{%
+  \def\HyPsd@babel@ukrainian{%
+    \declare@shorthand{ukrainian}{"|}{}%
+    \declare@shorthand{ukrainian}{"~}{-}%
+  }%
+}
+\ltx@IfUndefined{usorbian@sh@"@sel}{}{%
+  \def\HyPsd@babel@usorbian{%
+    \declare@shorthand{usorbian}{"f}{f}%
+    \declare@shorthand{usorbian}{"|}{}%
+  }%
+}
+\ltx@IfUndefined{greek@sh@\string~@sel}{%
+  \let\HyPsd@GreekPatch\@empty
+}{%
+  \def\HyPsd@GreekPatch{%
+    \let\greeknumeral\HyPsd@greeknumeral
+    \let\Greeknumeral\HyPsd@Greeknumeral
+  }%
+}
+\def\HyPsd@greeknumeral#1{%
+  \HyPsd@GreekNum\@firstoftwo{#1}%
+}
+\def\HyPsd@Greeknumeral#1{%
+  \HyPsd@GreekNum\@secondoftwo{#1}%
+}
+\def\HyPsd@GreekNum#1#2{%
+  \ifHy@unicode
+    \ifnum#2<\@ne
+      \@arabic{#2}%
+    \else
+      \ifnum#2<1000000 %
+        \HyPsd@@GreekNum#1{#2}%
+      \else
+        \@arabic{#2}%
+      \fi
+    \fi
+  \else
+    \@arabic{#2}%
+  \fi
+}
+\def\HyPsd@@GreekNum#1#2{%
+  \ifnum#2<\@m
+    \ifnum#2<10 %
+      \expandafter\HyPsd@GreekNumI
+          \expandafter\@gobble\expandafter#1\number#2%
+    \else
+      \ifnum#2<100 %
+        \expandafter\HyPsd@GreekNumII
+            \expandafter\@gobble\expandafter#1\number#2%
+      \else
+        \expandafter\HyPsd@GreekNumIII
+            \expandafter\@gobble\expandafter#1\number#2%
+      \fi
+    \fi
+    \ifnum#2>\z@
+      \textnumeralsigngreek
+    \fi
+  \else
+    \ifnum#2<\@M
+      \expandafter\HyPsd@GreekNumIV\expandafter#1\number#2%
+    \else
+      \ifnum#2<100000 %
+        \expandafter\HyPsd@GreekNumV\expandafter#1\number#2%
+      \else
+        \expandafter\HyPsd@GreekNumVI\expandafter#1\number#2%
+      \fi
+    \fi
+  \fi
+}
+\def\HyPsd@GreekNumI#1#2#3{%
+  #1{%
+    \ifnum#3>\z@
+      \textnumeralsignlowergreek
+    \fi
+  }%
+  \expandafter#2%
+  \ifcase#3 %
+    {}{}%
+  \or\textalpha\textAlpha
+  \or\textbeta\textBeta
+  \or\textgamma\textGamma
+  \or\textdelta\textDelta
+  \or\textepsilon\textEpsilon
+  \or\textstigmagreek\textStigmagreek
+  \or\textzeta\textZeta
+  \or\texteta\textEta
+  \or\texttheta\textTheta
+  \else
+    {}{}%
+  \fi
+}
+\def\HyPsd@GreekNumII#1#2#3#4{%
+  #1{%
+    \ifnum#3>\z@
+      \textnumeralsignlowergreek
+    \fi
+  }%
+  \expandafter#2%
+  \ifcase#3 %
+    {}{}%
+  \or\textiota\textIota
+  \or\textkappa\textKappa
+  \or\textlambda\textLambda
+  \or\textmu\textMu
+  \or\textnu\textNu
+  \or\textxi\textXi
+  \or\textomicron\textOmicron
+  \or\textpi\textPi
+  \or\textkoppagreek\textKoppagreek
+  \else
+    {}{}%
+  \fi
+  \HyPsd@GreekNumI#1#2#4%
+}
+\def\HyPsd@GreekNumIII#1#2#3#4#5{%
+  #1{%
+    \ifnum#3>\z@
+      \textnumeralsignlowergreek
+    \fi
+  }%
+  \expandafter#2%
+  \ifcase#3 %
+    {}{}%
+  \or\textrho\textRho
+  \or\textsigma\textSigma
+  \or\texttau\textTau
+  \or\textupsilon\textUpsilon
+  \or\textphi\textPhi
+  \or\textchi\textChi
+  \or\textpsi\textPsi
+  \or\textomega\textOmega
+  \or\textsampigreek\textSampigreek
+  \else
+    {}{}%
+  \fi
+  \HyPsd@GreekNumII#1#2#4#5%
+}
+\def\HyPsd@GreekNumIV#1#2#3#4#5{%
+  \HyPsd@GreekNumI\@firstofone#1#2%
+  \HyPsd@@GreekNum#1{#3#4#5}%
+}
+\def\HyPsd@GreekNumV#1#2#3#4#5#6{%
+  \HyPsd@GreekNumII\@firstofone#1#2#3%
+  \HyPsd@@GreekNum#1{#4#5#6}%
+}
+\def\HyPsd@GreekNumVI#1#2#3#4#5#6#7{%
+  \HyPsd@GreekNumIII\@firstofone#1#2#3#4%
+  \HyPsd@@GreekNum#1{#5#6#7}%
+}
+\def\HyPsd@SpanishPatch{%
+  \ltx@IfUndefined{es@save@dot}{%
+  }{%
+    \let\.\es@save@dot
+  }%
+}
+\def\HyPsd@RussianPatch{%
+  \ltx@IfUndefined{russian@sh@"@-@}{%
+  }{%
+    \@namedef{russian@sh@"@-@}{-}%
+  }%
+}
+\RequirePackage{intcalc}[2007/09/27]
+\def\HyPsd@CJKhook{%
+  \ltx@ifpackageloaded{CJK}{%
+    \let\CJK@kern\relax
+    \let\CJKkern\relax
+    \let\CJK@CJK\relax
+    \ifHy@CJKbookmarks
+      \HyPsd@CJKhook@bookmarks
+    \fi
+    \HyPsd@CJKhook@unicode
+  }{}%
+}
+\begingroup
+  \catcode"7F=\active
+  \toks@{%
+    \let\CJK@ignorespaces\empty
+    \def\CJK@char#1{\@gobbletwo}%
+    \let\CJK@charx\@gobblefour
+    \let\CJK@punctchar\@gobblefour
+    \def\CJK@punctcharx#1{\@gobblefour}%
+    \catcode"7F=\active
+    \def^^7f#1^^7f#2^^7f{%
+      \string #1\HyPsd@DecimalToOctal{#2}%
+    }%
+    % ... ?
+    \ifHy@unicode
+      \def\Hy@cjkpu{\80}%
+    \else
+      \let\Hy@cjkpu\@empty
+    \fi
+    \HyPsd@CJKActiveChars
+  }%
+  \count@=127 %
+  \@whilenum\count@<255 \do{%
+    \advance\count@ by 1 %
+    \lccode`\~=\count@
+    \lowercase{%
+      \toks@\expandafter{\the\toks@ ~}%
+    }%
+  }%
+  \toks@\expandafter{\the\toks@ !}%
+  \xdef\HyPsd@CJKhook@bookmarks{%
+    \the\toks@
+  }%
+\endgroup
+\def\HyPsd@CJKActiveChars#1{%
+  \ifx#1!%
+    \let\HyPsd@CJKActiveChars\relax
+  \else
+    \edef#1{\noexpand\Hy@cjkpu\string#1}%
+  \fi
+  \HyPsd@CJKActiveChars
+}
+\def\HyPsd@DecimalToOctal#1{%
+  \ifcase #1 %
+        \000\or \001\or \002\or \003\or \004\or \005\or \006\or \007%
+    \or \010\or \011\or \012\or \013\or \014\or \015\or \016\or \017%
+    \or \020\or \021\or \022\or \023\or \024\or \025\or \026\or \027%
+    \or \030\or \031\or \032\or \033\or \034\or \035\or \036\or \037%
+    \or \040\or \041\or \042\or \043\or \044\or \045\or \046\or \047%
+    \or \050\or \051\or \052\or \053\or \054\or \055\or \056\or \057%
+    \or    0\or    1\or    2\or    3\or    4\or    5\or    6\or    7%
+    \or    8\or    9\or \072\or \073\or \074\or \075\or \076\or \077%
+    \or    @\or    A\or    B\or    C\or    D\or    E\or    F\or    G%
+    \or    H\or    I\or    J\or    K\or    L\or    M\or    N\or    O%
+    \or    P\or    Q\or    R\or    S\or    T\or    U\or    V\or    W%
+    \or    X\or    Y\or    Z\or \133\or \134\or \135\or \136\or \137%
+    \or \140\or    a\or    b\or    c\or    d\or    e\or    f\or    g%
+    \or    h\or    i\or    j\or    k\or    l\or    m\or    n\or    o%
+    \or    p\or    q\or    r\or    s\or    t\or    u\or    v\or    w%
+    \or    x\or    y\or    z\or \173\or \174\or \175\or \176\or \177%
+    \or \200\or \201\or \202\or \203\or \204\or \205\or \206\or \207%
+    \or \210\or \211\or \212\or \213\or \214\or \215\or \216\or \217%
+    \or \220\or \221\or \222\or \223\or \224\or \225\or \226\or \227%
+    \or \230\or \231\or \232\or \233\or \234\or \235\or \236\or \237%
+    \or \240\or \241\or \242\or \243\or \244\or \245\or \246\or \247%
+    \or \250\or \251\or \252\or \253\or \254\or \255\or \256\or \257%
+    \or \260\or \261\or \262\or \263\or \264\or \265\or \266\or \267%
+    \or \270\or \271\or \272\or \273\or \274\or \275\or \276\or \277%
+    \or \300\or \301\or \302\or \303\or \304\or \305\or \306\or \307%
+    \or \310\or \311\or \312\or \313\or \314\or \315\or \316\or \317%
+    \or \320\or \321\or \322\or \323\or \324\or \325\or \326\or \327%
+    \or \330\or \331\or \332\or \333\or \334\or \335\or \336\or \337%
+    \or \340\or \341\or \342\or \343\or \344\or \345\or \346\or \347%
+    \or \350\or \351\or \352\or \353\or \354\or \355\or \356\or \357%
+    \or \360\or \361\or \362\or \363\or \364\or \365\or \366\or \367%
+    \or \370\or \371\or \372\or \373\or \374\or \375\or \376\or \377%
+  \fi
+}
+\def\HyPsd@CJKhook@unicode{%
+  \let\Unicode\HyPsd@CJK@Unicode
+  \let\CJKnumber\HyPsd@CJKnumber
+  \let\CJKdigits\HyPsd@CJKdigits
+}
+\def\HyPsd@CJK@Unicode#1#2{%
+  \ifnum#1<256 %
+    \HyPsd@DecimalToOctalFirst{#1}%
+    \HyPsd@DecimalToOctalSecond{#2}%
+  \else
+    \933%
+    \expandafter\expandafter\expandafter\HyPsd@HighA
+    \intcalcDiv{#1}{4}!%
+    \933%
+    \ifcase\intcalcMod{#1}{4} %
+      4\or 5\or 6\or 7%
+    \fi
+    \HyPsd@DecimalToOctalSecond{#2}%
+  \fi
+}
+\def\HyPsd@HighA#1!{%
+  \expandafter\expandafter\expandafter\HyPsd@HighB
+  \IntCalcDiv#1!64!!%
+  \expandafter\expandafter\expandafter\HyPsd@HighD
+  \IntCalcMod#1!64!!%
+}
+\def\HyPsd@HighB#1!{%
+  \expandafter\expandafter\expandafter\HyPsd@HighC
+  \IntCalcDec#1!!%
+}
+\def\HyPsd@HighC#1!{%
+  \IntCalcDiv#1!4!%
+  \@backslashchar
+  \IntCalcMod#1!4!%
+}
+\def\HyPsd@HighD#1!{%
+  \ifcase\IntCalcDiv#1!8! %
+    0\or 1\or 2\or 3\or 4\or 5\or 6\or 7%
+  \fi
+  \ifcase\IntCalcMod#1!8! %
+    0\or 1\or 2\or 3\or 4\or 5\or 6\or 7%
+  \fi
+}
+\def\HyPsd@DecimalToOctalFirst#1{%
+  \9%
+  \ifcase#1 %
+        000\or 001\or 002\or 003\or 004\or 005\or 006\or 007%
+    \or 010\or 011\or 012\or 013\or 014\or 015\or 016\or 017%
+    \or 020\or 021\or 022\or 023\or 024\or 025\or 026\or 027%
+    \or 030\or 031\or 032\or 033\or 034\or 035\or 036\or 037%
+    \or 040\or 041\or 042\or 043\or 044\or 045\or 046\or 047%
+    \or 050\or 051\or 052\or 053\or 054\or 055\or 056\or 057%
+    \or 060\or 061\or 062\or 063\or 064\or 065\or 066\or 067%
+    \or 070\or 071\or 072\or 073\or 074\or 075\or 076\or 077%
+    \or 100\or 101\or 102\or 103\or 104\or 105\or 106\or 107%
+    \or 120\or 111\or 112\or 113\or 114\or 115\or 116\or 117%
+    \or 120\or 121\or 122\or 123\or 124\or 125\or 126\or 127%
+    \or 130\or 131\or 132\or 133\or 134\or 135\or 136\or 137%
+    \or 140\or 141\or 142\or 143\or 144\or 145\or 146\or 147%
+    \or 150\or 151\or 152\or 153\or 154\or 155\or 156\or 157%
+    \or 160\or 161\or 162\or 163\or 164\or 165\or 166\or 167%
+    \or 170\or 171\or 172\or 173\or 174\or 175\or 176\or 177%
+    \or 200\or 201\or 202\or 203\or 204\or 205\or 206\or 207%
+    \or 210\or 211\or 212\or 213\or 214\or 215\or 216\or 217%
+    \or 220\or 221\or 222\or 223\or 224\or 225\or 226\or 227%
+    \or 230\or 231\or 232\or 233\or 234\or 235\or 236\or 237%
+    \or 240\or 241\or 242\or 243\or 244\or 245\or 246\or 247%
+    \or 250\or 251\or 252\or 253\or 254\or 255\or 256\or 257%
+    \or 260\or 261\or 262\or 263\or 264\or 265\or 266\or 267%
+    \or 270\or 271\or 272\or 273\or 274\or 275\or 276\or 277%
+    \or 300\or 301\or 302\or 303\or 304\or 305\or 306\or 307%
+    \or 310\or 311\or 312\or 313\or 314\or 315\or 316\or 317%
+    \or 320\or 321\or 322\or 323\or 324\or 325\or 326\or 327%
+    \or 330\or 331\or 332\or 333\or 334\or 335\or 336\or 337%
+    \or 340\or 341\or 342\or 343\or 344\or 345\or 346\or 347%
+    \or 350\or 351\or 352\or 353\or 354\or 355\or 356\or 357%
+    \or 360\or 361\or 362\or 363\or 364\or 365\or 366\or 367%
+    \or 370\or 371\or 372\or 373\or 374\or 375\or 376\or 377%
+  \fi
+}
+\def\HyPsd@DecimalToOctalSecond#1{%
+  \ifcase #1 %
+        \000\or \001\or \002\or \003\or \004\or \005\or \006\or \007%
+    \or \010\or \011\or \012\or \013\or \014\or \015\or \016\or \017%
+    \or \020\or \021\or \022\or \023\or \024\or \025\or \026\or \027%
+    \or \030\or \031\or \032\or \033\or \034\or \035\or \036\or \037%
+    \or \040\or \041\or \042\or \043\or \044\or \045\or \046\or \047%
+    \or \050\or \051\or \052\or \053\or \054\or \055\or \056\or \057%
+    \or \060\or \061\or \062\or \063\or \064\or \065\or \066\or \067%
+    \or \070\or \071\or \072\or \073\or \074\or \075\or \076\or \077%
+    \or \100\or \101\or \102\or \103\or \104\or \105\or \106\or \107%
+    \or \110\or \111\or \112\or \113\or \114\or \115\or \116\or \117%
+    \or \120\or \121\or \122\or \123\or \124\or \125\or \126\or \127%
+    \or \130\or \131\or \132\or \133\or \134\or \135\or \136\or \137%
+    \or \140\or \141\or \142\or \143\or \144\or \145\or \146\or \147%
+    \or \150\or \151\or \152\or \153\or \154\or \155\or \156\or \157%
+    \or \160\or \161\or \162\or \163\or \164\or \165\or \166\or \167%
+    \or \170\or \171\or \172\or \173\or \174\or \175\or \176\or \177%
+    \or \200\or \201\or \202\or \203\or \204\or \205\or \206\or \207%
+    \or \210\or \211\or \212\or \213\or \214\or \215\or \216\or \217%
+    \or \220\or \221\or \222\or \223\or \224\or \225\or \226\or \227%
+    \or \230\or \231\or \232\or \233\or \234\or \235\or \236\or \237%
+    \or \240\or \241\or \242\or \243\or \244\or \245\or \246\or \247%
+    \or \250\or \251\or \252\or \253\or \254\or \255\or \256\or \257%
+    \or \260\or \261\or \262\or \263\or \264\or \265\or \266\or \267%
+    \or \270\or \271\or \272\or \273\or \274\or \275\or \276\or \277%
+    \or \300\or \301\or \302\or \303\or \304\or \305\or \306\or \307%
+    \or \310\or \311\or \312\or \313\or \314\or \315\or \316\or \317%
+    \or \320\or \321\or \322\or \323\or \324\or \325\or \326\or \327%
+    \or \330\or \331\or \332\or \333\or \334\or \335\or \336\or \337%
+    \or \340\or \341\or \342\or \343\or \344\or \345\or \346\or \347%
+    \or \350\or \351\or \352\or \353\or \354\or \355\or \356\or \357%
+    \or \360\or \361\or \362\or \363\or \364\or \365\or \366\or \367%
+    \or \370\or \371\or \372\or \373\or \374\or \375\or \376\or \377%
+  \fi
+}
+\def\HyPsd@CJKnumber#1{%
+  \ifnum#1<\z@
+    \CJK@minus
+    \expandafter\HyPsd@@CJKnumber\expandafter{\number-\number#1}%
+  \else
+    \expandafter\HyPsd@@CJKnumber\expandafter{\number#1}%
+  \fi
+}
+\def\HyPsd@@CJKnumber#1{%
+  \ifcase#1 %
+    \CJK@zero\or\CJK@one\or\CJK@two\or\CJK@three\or\CJK@four\or
+    \CJK@five\or\CJK@six\or\CJK@seven\or\CJK@eight\or\CJK@nine\or
+    \CJK@ten\or\CJK@ten\CJK@one\or\CJK@ten\CJK@two\or
+    \CJK@ten\CJK@three\or\CJK@ten\CJK@four\or\CJK@ten\CJK@five\or
+    \CJK@ten\CJK@six\or\CJK@ten\CJK@seven\or\CJK@ten\CJK@eight\or
+    \CJK@ten\CJK@nine
+  \else
+    \ifnum#1<10000 %
+      \HyPsd@CJKnumberFour#1!\@empty{20}%
+      \@empty
+    \else
+      \ifnum#1<100000000 %
+        \expandafter\expandafter\expandafter\HyPsd@CJKnumberFour
+          \IntCalcDiv#1!10000!%
+        !{}{20}%
+        \CJK@tenthousand
+        \expandafter\expandafter\expandafter\HyPsd@CJKnumberFour
+          \IntCalcMod#1!10000!%
+        !\CJK@zero{10}%
+        \@empty
+      \else
+        \expandafter\HyPsd@CJKnumberLarge
+        \number\IntCalcDiv#1!100000000!\expandafter!%
+        \number\IntCalcMod#1!100000000!!%
+      \fi
+    \fi
+  \fi
+}
+\def\HyPsd@CJKnumberLarge#1!#2!{%
+  \HyPsd@CJKnumberFour#1!{}{20}%
+  \CJK@hundredmillion
+  \ifnum#2=\z@
+  \else
+    \expandafter\expandafter\expandafter\HyPsd@CJKnumberFour
+      \IntCalcDiv#2!10000!%
+    !\CJK@zero{10}%
+    \CJK@tenthousand
+    \expandafter\expandafter\expandafter\HyPsd@CJKnumberFour
+      \IntCalcMod#2!10000!%
+    !\CJK@zero{10}%
+    \@empty
+  \fi
+}
+\def\HyPsd@CJKnumberFour#1!#2#3{%
+  \ifnum#1=\z@
+    \expandafter\@gobble
+  \else
+    \ifnum#1<1000 %
+      #2%
+      \HyPsd@CJKnumberThree#1!{}{#3}%
+    \else
+      \HyPsd@@CJKnumber{\IntCalcDiv#1!1000!}%
+      \CJK@thousand
+      \expandafter\expandafter\expandafter\HyPsd@CJKnumberThree
+        \IntCalcMod#1!1000!%
+      !\CJK@zero{10}%
+    \fi
+  \fi
+}
+\def\HyPsd@CJKnumberThree#1!#2#3{%
+  \ifnum#1=\z@
+  \else
+    \ifnum#1<100 %
+      #2%
+      \HyPsd@CJKnumberTwo#1!{}{#3}%
+    \else
+      \HyPsd@@CJKnumber{\IntCalcDiv#1!100!}%
+      \CJK@hundred
+      \expandafter\expandafter\expandafter\HyPsd@CJKnumberTwo
+        \IntCalcMod#1!100!%
+      !\CJK@zero{10}%
+    \fi
+  \fi
+}
+\def\HyPsd@CJKnumberTwo#1!#2#3{%
+  \ifnum#1=\z@
+  \else
+    \ifnum#1<#3 %
+      #2%
+      \HyPsd@@CJKnumber{#1}%
+    \else
+      \HyPsd@@CJKnumber{\IntCalcDiv#1!10!}%
+      \CJK@ten
+      \ifnum\IntCalcMod#1!10!=\z@
+      \else
+        \HyPsd@@CJKnumber{\IntCalcMod#1!10!}%
+      \fi
+    \fi
+  \fi
+}
+\def\HyPsd@CJKdigits#1{%
+  \ifx*#1\relax
+    \expandafter\HyPsd@@CJKdigits\expandafter\CJK@zero
+  \else
+    \HyPsd@@CJKdigits\CJK@null{#1}%
+  \fi
+}
+\def\HyPsd@@CJKdigits#1#2{%
+  \ifx\\#2\\%
+  \else
+    \HyPsd@@@CJKdigits#1#2\@nil
+  \fi
+}%
+\def\HyPsd@@@CJKdigits#1#2#3\@nil{%
+  \HyPsd@CJKdigit#1{#2}%
+  \ifx\\#3\\%
+    \expandafter\@gobble
+  \else
+    \expandafter\@firstofone
+  \fi
+  {%
+    \HyPsd@@@CJKdigits#1#3\@nil
+  }%
+}
+\def\HyPsd@CJKdigit#1#2{%
+  \ifcase#2 %
+    #1\or
+    \CJK@one\or\CJK@two\or\CJK@three\or\CJK@four\or
+    \CJK@five\or\CJK@six\or\CJK@seven\or\CJK@eight\or\CJK@nine
+  \fi
+}
+\def\HyPsd@inmathwarn#1#2{%
+  \ifx#2\expandafter
+    \expandafter\ifx\csname\cf@encoding\string#1\endcsname\relax
+      \HyPsd@GLYPHERR
+      \expandafter\@gobble\string#1%
+      >%
+      \expandafter\expandafter\expandafter\HyPsd@EndWithElse
+    \else
+      \expandafter\expandafter\expandafter\HyPsd@GobbleFiFi
+    \fi
+  \else
+    \expandafter#2%
+  \fi
+}
+\def\HyPsd@GobbleFiFi#1\fi#2\fi{}
+\def\HyPsd@EndWithElse#1\else{\else}
+\def\HyPsd@add@accent#1#2{%
+  \HyPsd@GLYPHERR\expandafter\@gobble\string#1+\string#2>%
+  #2%
+}%
+\def\HyPsd@LetUnexpandableSpace#1{%
+  \expandafter\futurelet\expandafter#1\expandafter\@gobble\space\relax
+}
+\HyPsd@LetUnexpandableSpace\HyPsd@UnexpandableSpace
+\edef\HyPsd@XSPACE{\string#\string X}
+\edef\HyPsd@ITALCORR{\string#\string I}
+\edef\HyPsd@GLYPHERR{\string#\string G}
+\def\HyPsd@hspace#1{\HyPsd@@hspace#1*\END}
+\def\HyPsd@@hspace#1*#2\END{%
+  \ifx\\#2\\%
+    \HyPsd@hspacetest{#1}%
+  \else
+    \expandafter\HyPsd@hspacetest
+  \fi
+}
+\def\HyPsd@hspacetest#1{\ifdim#1>\z@\space\fi}
+\ltx@IfUndefined{tocsection}{%
+  \let\HyPsd@AMSclassfix\relax
+}{%
+  \def\HyPsd@AMSclassfix{%
+    \let\tocpart\HyPsd@tocsection
+    \let\tocchapter\HyPsd@tocsection
+    \let\tocappendix\HyPsd@tocsection
+    \let\tocsection\HyPsd@tocsection
+    \let\tocsubsection\HyPsd@tocsection
+    \let\tocsubsubsection\HyPsd@tocsection
+    \let\tocparagraph\HyPsd@tocsection
+  }%
+  \def\HyPsd@tocsection#1#2#3{%
+    \if @#2@\else\if @#1@\else#1 \fi#2. \fi
+    #3%
+  }%
+}
+\def\HyPsd@href#1#{\@secondoftwo}
+\def\HyPsd@ref#1{\HyPsd@@ref#1*\END}%
+\def\HyPsd@@ref#1*#2\END{%
+  \ifx\\#2\\%
+    \HyPsd@@@ref{#1}%
+  \else
+    \expandafter\HyPsd@@@ref
+  \fi
+}%
+\def\HyPsd@@@ref#1{%
+  \expandafter\ifx\csname r@#1\endcsname\relax
+    ??%
+  \else
+    \expandafter\expandafter\expandafter
+    \@car\csname r@#1\endcsname\@nil
+  \fi
+}
+\def\HyPsd@pageref#1{\HyPsd@@pageref#1*\END}
+\def\HyPsd@@pageref#1*#2\END{%
+  \ifx\\#2\\%
+    \HyPsd@@@pageref{#1}%
+  \else
+    \expandafter\HyPsd@@@pageref
+  \fi
+}
+\def\HyPsd@@@pageref#1{%
+  \expandafter\ifx\csname r@#1\endcsname\relax
+    ??%
+  \else
+    \expandafter\expandafter\expandafter\expandafter
+    \expandafter\expandafter\expandafter\@car
+    \expandafter\expandafter\expandafter\@gobble
+    \csname r@#1\endcsname{}\@nil
+  \fi
+}
+\def\HyPsd@nameref#1{\HyPsd@@nameref#1*\END}
+\def\HyPsd@@nameref#1*#2\END{%
+  \ifx\\#2\\%
+    \HyPsd@@@nameref{#1}%
+  \else
+    \expandafter\HyPsd@@@nameref
+  \fi
+}
+\def\HyPsd@@@nameref#1{%
+  \expandafter\ifx\csname r@#1\endcsname\relax
+    ??%
+  \else
+    \expandafter\expandafter\expandafter\expandafter
+    \expandafter\expandafter\expandafter\@car
+    \expandafter\expandafter\expandafter\@gobbletwo
+    \csname r@#1\endcsname{}{}\@nil
+  \fi
+}
+\def\HyPsd@autoref#1{\HyPsd@@autoref#1*\END}
+\def\HyPsd@@autoref#1*#2\END{%
+  \ifx\\#2\\%
+    \HyPsd@@@autoref{#1}%
+  \else
+    \expandafter\HyPsd@@@autoref
+  \fi
+}
+\def\HyPsd@@@autoref#1{%
+  \expandafter\ifx\csname r@#1\endcsname\relax
+    ??%
+  \else
+    \expandafter\expandafter\expandafter\HyPsd@autorefname
+        \csname r@#1\endcsname{}{}{}{}\@nil
+    \expandafter\expandafter\expandafter
+    \@car\csname r@#1\endcsname\@nil
+  \fi
+}
+\def\HyPsd@autorefname#1#2#3#4#5\@nil{%
+  \ifx\\#4\\%
+  \else
+    \HyPsd@@autorefname#4.\@nil
+  \fi
+}
+\def\HyPsd@@autorefname#1.#2\@nil{%
+  \ltx@IfUndefined{#1autorefname}{%
+    \ltx@IfUndefined{#1name}{%
+    }{%
+      \csname#1name\endcsname\space
+    }%
+  }{%
+    \csname#1autorefname\endcsname\space
+  }%
+}
+\begingroup
+  \def\x#1#2{%
+    \endgroup
+    \let#1\def
+    \def\HyPsd@DefCommand##1##2##{%
+      #1%
+      \expandafter\noexpand
+        \csname\expandafter\@gobble\string##1\@empty\endcsname
+      \@gobble
+    }%
+    \let#2\let
+    \def\HyPsd@@LetCommand##1{%
+      \expandafter\ifx\csname##1\expandafter\endcsname
+                      \csname iftrue\endcsname
+        \pdfstringdefWarn\let
+        \expandafter\@gobble
+      \else
+        \expandafter\ifx\csname##1\expandafter\endcsname
+                        \csname iffalse\endcsname
+          \pdfstringdefWarn\let
+          \expandafter\expandafter\expandafter\@gobble
+        \else
+          #2%
+          \expandafter\noexpand
+            \csname##1\expandafter\expandafter\expandafter\endcsname
+        \fi
+      \fi
+    }%
+  }%
+\expandafter\x\csname <def>-command\expandafter\endcsname
+              \csname <let>-command\endcsname
+\def\HyPsd@LetCommand#1{%
+  \expandafter\expandafter\expandafter\HyPsd@@LetCommand
+    \expandafter\expandafter\expandafter{%
+    \expandafter\@gobble\string#1\@empty
+  }%
+}
+\def\HyPsd@ifnextchar#1{%
+  \pdfstringdefWarn#1%
+  \expandafter\@gobbletwo\@gobble
+}
+\def\HyPsd@protected@testopt#1{%
+  \pdfstringdefWarn#1%
+  \@gobbletwo
+}
+\def\HyPsd@Warning#1{%
+  \begingroup
+    \let\space\ltx@space
+    \Hy@Warning{#1}%
+  \endgroup
+}
+\RequirePackage{etexcmds}[2007/09/09]
+\ifetex@unexpanded
+  \expandafter\@secondoftwo
+\else
+  \expandafter\@firstoftwo
+\fi
+{%
+  \def\HyPsd@ProtectSpaces#1{%
+    \iftrue
+      \expandafter\HyPsd@@ProtectSpacesFi
+        \expandafter|\expandafter\@empty#1| \HyPsd@End#1%
+    \fi
+  }%
+  \def\HyPsd@@ProtectSpacesFi#1 #2\HyPsd@End#3\fi{%
+    \fi
+    \ifx\scrollmode#2\scrollmode
+      \HyPsd@RemoveMask#1\HyPsd@End#3%
+    \else
+      \gdef#3{#1\HyPsd@UnexpandableSpace#2}%
+      \expandafter\HyPsd@@ProtectSpacesFi#3\HyPsd@End#3%
+    \fi
+  }%
+  \def\HyPsd@RemoveMask|#1|\HyPsd@End#2{%
+    \toks@\expandafter{#1}%
+    \xdef#2{\the\toks@}%
+  }%
+}{%
+  \let\HyPsd@fi\fi
+  \def\HyPsd@ProtectSpaces#1{%
+    \xdef#1{%
+      \iftrue
+        \expandafter\HyPsd@@ProtectSpacesFi
+          \expandafter|\expandafter\@empty#1| %
+      \HyPsd@fi
+    }%
+    \expandafter\HyPsd@RemoveMask#1\HyPsd@End#1%
+  }%
+  \def\HyPsd@@ProtectSpacesFi#1 #2\HyPsd@fi{%
+    \fi
+    \etex@unexpanded{#1}%
+    \ifx\scrollmode#2\scrollmode
+    \else
+      \HyPsd@@ProtectSpacesFi\HyPsd@UnexpandableSpace#2%
+    \HyPsd@fi
+  }%
+  \def\HyPsd@RemoveMask|#1|\HyPsd@End#2{%
+    \xdef#2{\etex@unexpanded\expandafter{#1}}%
+  }%
+}
+\def\HyPsd@RemoveBraces#1{%
+  \ifx\scrollmode#1\scrollmode
+  \else
+    \HyPsd@@RemoveBracesFi#1\HyPsd@End{#1}%
+  \fi
+}
+\def\HyPsd@@RemoveBracesFi#1#2\HyPsd@End#3\fi{%
+  \fi
+  \def\Hy@temp@A{#1#2}%
+  \def\Hy@temp@B{#3}%
+  \ifx\Hy@temp@A\Hy@temp@B
+    \expandafter\def\expandafter\HyPsd@String\expandafter{%
+      \HyPsd@String#1%
+    }%
+    \ifx\scrollmode#2\scrollmode
+    \else
+      \Hy@ReturnAfterFiFiEnd{%
+        \HyPsd@RemoveBraces{#2}%
+      }%
+    \fi
+  \else
+    \def\Hy@temp@A{#1}%
+    \HyPsd@AppendItalcorr\HyPsd@String
+    \ifx\Hy@temp@A\@empty
+      \Hy@ReturnAfterElseFiFiEnd{%
+        \HyPsd@RemoveBraces{#2}%
+      }%
+    \else
+      \HyPsd@ProtectSpaces\Hy@temp@A
+      \HyPsd@AppendItalcorr\Hy@temp@A
+      \Hy@ReturnAfterFiFiEnd{%
+        \expandafter\HyPsd@RemoveBraces\expandafter
+          {\Hy@temp@A#2}%
+      }%
+    \fi
+  \fi
+  \Hy@ReturnEnd
+}
+\def\HyPsd@AppendItalcorr#1{%
+  \expandafter\HyPsd@@AppendItalcorr\expandafter{\/}#1%
+}
+\def\HyPsd@@AppendItalcorr#1#2{%
+  \expandafter\def\expandafter#2\expandafter{#2#1}%
+}
+\def\HyPsd@CheckCatcodes#1#2\HyPsd@End{%
+  \global\let\HyPsd@Rest\relax
+  \ifcat\relax\noexpand#1\relax
+    \ifx#1\protect
+    \else
+      \ifx#1\penalty
+        \setbox\z@=\hbox{%
+          \afterassignment\HyPsd@AfterCountRemove
+          \count@=#2\HyPsd@End
+        }%
+      \else
+        \ifx#1\kern
+          \setbox\z@=\hbox{%
+            \afterassignment\HyPsd@AfterDimenRemove
+            \dimen@=#2\HyPsd@End
+          }%
+        \else
+          \ifx#1\hskip
+            \setbox\z@=\hbox{%
+              \afterassignment\HyPsd@AfterSkipRemove
+              \skip@=#2\HyPsd@End
+            }%
+          \else
+            \HyPsd@CatcodeWarning{#1}%
+          \fi
+        \fi
+      \fi
+    \fi
+  \else
+    \ifcat#1A% letter
+      \expandafter\def\expandafter\HyPsd@String\expandafter{%
+        \HyPsd@String#1%
+      }%
+    \else
+      \ifcat#1 % SPACE
+        \expandafter\def\expandafter\HyPsd@String\expandafter{%
+          \HyPsd@String\HyPsd@SPACEOPTI
+        }%
+      \else
+        \ifcat$#1%
+          \HyPsd@CatcodeWarning{math shift}%
+        \else
+          \ifcat&#1%
+            \HyPsd@CatcodeWarning{alignment tab}%
+          \else
+            \ifcat^#1%
+              \HyPsd@CatcodeWarning{superscript}%
+            \else
+              \ifcat_#1%
+                \HyPsd@CatcodeWarning{subscript}%
+              \else
+                \expandafter\def\expandafter\HyPsd@String\expandafter{%
+                  \HyPsd@String#1%
+                }%
+              \fi
+            \fi
+          \fi
+        \fi
+      \fi
+    \fi
+  \fi
+  \ifx\HyPsd@Rest\relax
+    \ifx\scrollmode#2\scrollmode
+    \else
+      \Hy@ReturnAfterFiFiEnd{%
+        \HyPsd@CheckCatcodes#2\HyPsd@End
+      }%
+    \fi
+  \else
+    \ifx\HyPsd@Rest\@empty
+    \else
+      \Hy@ReturnAfterFiFiEnd{%
+        \expandafter\HyPsd@CheckCatcodes\HyPsd@Rest\HyPsd@End
+      }%
+    \fi
+  \fi
+  \Hy@ReturnEnd
+}
+\def\HyPsd@AfterCountRemove#1\HyPsd@End{%
+  \gdef\HyPsd@Rest{#1}%
+}
+\def\HyPsd@AfterDimenRemove#1\HyPsd@End{%
+  \ifdim\ifx\HyPsd@String\@empty\z@\else\dimen@\fi>1ex %
+    \HyPsd@ReplaceSpaceWarning{\string\kern\space\the\dimen@}%
+    \gdef\HyPsd@Rest{\HyPsd@UnexpandableSpace #1}%
+  \else
+    \ifdim\dimen@=\z@
+    \else
+      \HyPsd@RemoveSpaceWarning{\string\kern\space\the\dimen@}%
+    \fi
+    \gdef\HyPsd@Rest{#1}%
+  \fi
+}
+\def\HyPsd@AfterSkipRemove#1\HyPsd@End{%
+  \ifdim\ifx\HyPsd@String\@empty\z@\else\skip@\fi>1ex %
+    \HyPsd@ReplaceSpaceWarning{\string\hskip\space\the\skip@}%
+    \gdef\HyPsd@Rest{\HyPsd@UnexpandableSpace #1}%
+  \else
+    \ifdim\skip@=\z@
+    \else
+      \HyPsd@RemoveSpaceWarning{\string\kern\space\the\skip@}%
+    \fi
+    \gdef\HyPsd@Rest{#1}%
+  \fi
+}
+\def\HyPsd@CatcodeWarning#1{%
+  \HyPsd@Warning{%
+    Token not allowed in a PDF string (%
+    \ifHy@unicode
+      Unicode%
+    \else
+      PDFDocEncoding%
+    \fi
+    ):%
+    \MessageBreak removing `\HyPsd@RemoveCmdPrefix#1'%
+  }%
+}
+\begingroup
+  \catcode`\|=0 %
+  \catcode`\\=12 %
+  |gdef|HyPsd@RemoveCmdPrefix#1{%
+    |expandafter|HyPsd@@RemoveCmdPrefix
+      |string#1|@empty\<>-|@empty|@empty
+  }%
+  |gdef|HyPsd@@RemoveCmdPrefix#1\<>-#2|@empty#3|@empty{#1#2}%
+|endgroup
+\def\HyPsd@RemoveSpaceWarning#1{%
+  \HyPsd@Warning{%
+    Token not allowed in a PDF string (%
+    \ifHy@unicode
+      Unicode%
+    \else
+      PDFDocEncoding%
+    \fi
+    ):%
+    \MessageBreak #1\MessageBreak
+    removed%
+  }%
+}
+\def\HyPsd@ReplaceSpaceWarning#1{%
+  \HyPsd@Warning{%
+    Token not allowed in a PDF string (%
+    \ifHy@unicode
+      Unicode%
+    \else
+      PDFDocEncoding%
+    \fi
+    ):%
+    \MessageBreak #1\MessageBreak
+    replaced by space%
+  }%
+}
+\def\HyPsd@GlyphProcess#1\relax#2\@empty{%
+  \expandafter\def\expandafter\HyPsd@String\expandafter{%
+    \HyPsd@String#1%
+  }%
+  \ifx\\#2\\%
+  \else
+    \ltx@ReturnAfterFi{%
+      \HyPsd@GlyphProcessWarning#2\@empty
+    }%
+  \fi
+}
+\def\HyPsd@GlyphProcessWarning#1>#2\@empty{%
+  \HyPsd@@GlyphProcessWarning#1++>%
+  \HyPsd@GlyphProcess#2\@empty
+}
+\def\HyPsd@@GlyphProcessWarning#1+#2+#3>{%
+  \ifx\\#2\\%
+    \HyPsd@Warning{%
+      Glyph not defined in %
+      P\ifHy@unicode U\else D1\fi\space encoding,\MessageBreak
+      removing `\@backslashchar#1'%
+    }%
+  \else
+    \HyPsd@Warning{%
+      Composite letter `\@backslashchar#1+#2'\MessageBreak
+      not defined in P\ifHy@unicode U\else D1\fi\space encoding,%
+      \MessageBreak
+      removing `\@backslashchar#1'%
+    }%
+  \fi
+}
+\def\HyPsd@spaceopti#1{ % first space
+  \ifx\HyPsd@spaceopti#1%
+    \040%
+  \else
+    #1%
+  \fi
+}%
+\def\HyPsd@Subst#1#2#3{%
+  \def\HyPsd@@ReplaceFi##1#1##2\END\fi{%
+    \fi
+    ##1%
+    \ifx\scrollmode##2\scrollmode
+    \else
+      #2%
+      \HyPsd@@ReplaceFi##2\END
+    \fi
+  }%
+  \xdef#3{%
+    \iftrue
+      \expandafter\HyPsd@@ReplaceFi#3#1\END
+    \fi
+  }%
+}
+\def\HyPsd@StringSubst#1{%
+  \expandafter\HyPsd@Subst\expandafter{\string#1}%
+}
+\begingroup
+  \lccode`\!=`\%%
+  \lccode`\|=`\\%
+  \lccode`\(=`\{%
+  \lccode`\)=`\}%
+  \lccode`0=\ltx@zero
+  \lccode`1=\ltx@zero
+  \lccode`3=\ltx@zero
+  \lccode`4=\ltx@zero
+  \lccode`5=\ltx@zero
+  \lccode`7=\ltx@zero
+\lowercase{\endgroup
+  \def\HyPsd@EscapeTeX#1{%
+    \HyPsd@Subst!{|045}#1%
+    \HyPsd@Subst({|173}#1%
+    \HyPsd@Subst){|175}#1%
+  }%
+}
+\def\HyPsd@doxspace#1{%
+  \ifx#1\relax\else
+   \ifx#1.\else
+    \ifx#1:\else
+     \ifx#1,\else
+      \ifx#1;\else
+       \ifx#1!\else
+        \ifx#1?\else
+         \ifx#1/\else
+          \ifx#1-\else
+           \ifx#1'\else
+             \HyPsd@SPACEOPTI
+           \fi
+          \fi
+         \fi
+        \fi
+       \fi
+      \fi
+     \fi
+    \fi
+   \fi
+  \fi
+  #1%
+}%
+\begingroup
+  \catcode`\|=0 %
+  \catcode`\\=12 %
+  |gdef|HyPsd@ConvertToUnicode#1{%
+    |xdef#1{%
+      |expandafter|HyPsd@DoConvert#1|@empty|@empty|@empty
+    }%
+    |ifx#1|@empty
+    |else
+      |xdef#1{%
+        \376\377%
+        #1%
+      }%
+    |fi
+  }%
+  |gdef|HyPsd@DoConvert#1{%
+    |ifx#1|@empty
+    |else
+      |ltx@ReturnAfterFi{%
+        |ifx#1\%%
+          \%%
+          |expandafter|HyPsd@DoEscape
+        |else
+          |HyPsd@Char{#1}%
+          |expandafter|HyPsd@DoConvert
+        |fi
+      }%
+    |fi
+  }%
+  |gdef|HyPsd@DoEscape#1{%
+    |ifx#19%
+      |expandafter|HyPsd@GetTwoBytes
+    |else
+      |ltx@ReturnAfterFi{%
+        |ifx#18%
+          00%
+          |expandafter|HyPsd@GetTwoBytes
+        |else
+          #1%
+          |expandafter|HyPsd@GetOneByte
+        |fi
+      }%
+    |fi
+  }%
+  |gdef|HyPsd@GetTwoBytes#1\#2#3#4{%
+    #1\#2#3#4%
+    |HyPsd@DoConvert
+  }%
+  |gdef|HyPsd@GetOneByte#1#2{%
+    #1#2%
+    |HyPsd@DoConvert
+  }%
+|endgroup
+\def\HyPsd@GetNextTwoTokens#1#2#3\END#4{%
+  \xdef#4{#4#1#2}%
+  \HyPsd@@ConvertToUnicode#3\END#4%
+}
+\begingroup
+  \catcode0=9 %
+  \catcode`\^=7 %
+  \catcode`\^^^=12 %
+  \def\x{^^^^0000}%
+\expandafter\endgroup
+\ifx\x\@empty
+  \def\HyPsd@Char#1{%
+    \ifnum`#1<128 %
+      \@backslashchar 000#1%
+    \else
+      \ifnum`#1<65536 %
+        \expandafter\HyPsd@CharTwoByte\number`#1!%
+      \else
+        \expandafter\expandafter\expandafter\HyPsd@CharSurrogate
+        \intcalcSub{`#1}{65536}!%
+      \fi
+    \fi
+  }%
+  \def\HyPsd@CharTwoByte#1!{%
+    \expandafter\expandafter\expandafter\HyPsd@CharOctByte
+    \IntCalcDiv#1!256!!%
+    \expandafter\expandafter\expandafter\HyPsd@CharOctByte
+    \IntCalcMod#1!256!!%
+  }%
+  \def\HyPsd@CharOctByte#1!{%
+    \@backslashchar
+    \IntCalcDiv#1!64!%
+    \intcalcDiv{\IntCalcMod#1!64!}{8}%
+    \IntCalcMod#1!8!%
+  }%
+  \def\HyPsd@CharSurrogate#1!{%
+    \@backslashchar 33%
+    \IntCalcDiv#1!262144!%
+    \expandafter\expandafter\expandafter\HyPsd@CharOctByte
+    \intcalcDiv{\IntCalcMod#1!262144!}{1024}!%
+    \@backslashchar 33%
+    \expandafter\expandafter\expandafter\IntCalcAdd
+    \intcalcDiv{\IntCalcMod#1!1024!}{256}!4!%
+    \expandafter\expandafter\expandafter\HyPsd@CharOctByte
+    \IntCalcMod#1!256!!%
+  }%
+\else
+  \def\HyPsd@Char#1{%
+    \@backslashchar 000#1%
+  }%
+\fi
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname numexpr\endcsname\relax
+  \let\HyPsd@UTFviii\relax
+\else
+  \begingroup
+    \lccode`\~=`^^f4\relax
+  \lowercase{\endgroup
+    \def\HyPsd@UTFviii{%
+      \let\UTFviii@two@octets\HyPsd@UTFviii@two
+      \let\UTFviii@three@octets\HyPsd@UTFviii@three
+      \let\UTFviii@four@octets\HyPsd@UTFviii@four
+      \ifx~\HyPsd@UTFviii@ccxliv@undef
+        \let~\HyPsd@UTFviii@ccxliv@def
+      \fi
+      \let\unichar\HyPsd@unichar
+    }%
+  }%
+  \def\HyPsd@UTFviii@ccxliv@undef{\@inpenc@undefined@{utf8}}%
+  \edef\HyPsd@UTFviii@ccxliv@def{%
+    \noexpand\UTFviii@four@octets\string ^^f4%
+  }%
+  \def\HyPsd@UTFviii@two#1#2{%
+    \expandafter\HyPsd@UTFviii@@two
+      \number\dimexpr.25\dimexpr`#1sp\expandafter\relax\expandafter|%
+      \number`#1\expandafter|%
+      \number\dimexpr.125\dimexpr`#2sp\expandafter\relax\expandafter|%
+      \number`#2 \@nil
+  }%
+  \def\HyPsd@UTFviii@@two#1|#2|#3|#4\@nil{%
+    \expandafter\8%
+    \number\numexpr #1-48\expandafter\relax
+    \csname\number\numexpr #2-4*#1\relax\expandafter\endcsname
+    \number\numexpr #3-8*%
+        \number\dimexpr.125\dimexpr#3sp\relax\relax\expandafter\relax
+    \number\numexpr #4-8*#3\relax
+  }%
+  \def\HyPsd@UTFviii@three#1#2#3{%
+    \expandafter\HyPsd@UTFviii@@three
+      \number\dimexpr.25\dimexpr`#1sp\expandafter\relax\expandafter|%
+      \number`#1\expandafter|%
+      \number\ifnum\numexpr`#2-128\relax <32 0\else 1\fi\expandafter|%
+      \number\dimexpr.25\dimexpr`#2sp\expandafter\relax\expandafter|%
+      \number`#2\expandafter|%
+      \number\dimexpr.125\dimexpr`#3sp\expandafter\relax\expandafter|%
+      \number`#3 \@nil
+  }%
+  \def\HyPsd@UTFviii@@three#1|#2|#3|#4|#5|#6|#7\@nil{%
+    \expandafter\9%
+    \number\numexpr #1-56\expandafter\relax
+    \number\numexpr 2*(#2-4*#1)+#3\expandafter\relax
+    \number\numexpr #4 - 32 -\ifcase#3 0\else 8\fi\expandafter\relax
+    \csname\number\numexpr #5-4*#4\relax\expandafter\endcsname
+    \number\numexpr #6-16\expandafter\relax
+    \number\numexpr #7-8*#6\relax
+  }%
+  \def\HyPsd@UTFviii@four#1#2{%
+    \expandafter\HyPsd@@UTFviii@four\number
+    \numexpr-1+(`#1-240)*4+\dimexpr.0625\dimexpr`#2sp-128sp%
+    \expandafter|\number
+    \numexpr`#2-16*\dimexpr.0625\dimexpr`#2sp|%
+  }%
+  \def\HyPsd@@UTFviii@four#1|#2|#3{%
+    \933\number\dimexpr.25\dimexpr#1sp\relax\relax
+    \csname\number\numexpr#1-4*\dimexpr.25\dimexpr#1sp\endcsname
+    \ifodd#2 %
+      \number\numexpr(#2-1)/2\relax
+    \else
+      \number\numexpr#2/2\relax
+    \fi
+    \number\numexpr\ifodd#2 4+\fi
+        \dimexpr.0625\dimexpr`#3sp-128sp\relax\relax\relax
+    \933%
+    \expandafter\HyPsd@@@UTFviii@four\number
+    \numexpr`#3-16*\dimexpr.0625\dimexpr`#3sp|%
+  }%
+  \def\HyPsd@@@UTFviii@four#1|#2{%
+    \number\numexpr4+\dimexpr.25\dimexpr#1sp\relax\relax\relax
+    \csname\number\numexpr#1-4*\dimexpr.25\dimexpr#1sp\endcsname
+    \number\dimexpr.125\dimexpr`#2sp-128sp\relax\relax
+    \number\numexpr`#2-8*\dimexpr.125\dimexpr`#2sp\relax\relax\relax
+  }%
+  \def\HyPsd@unichar#1{%
+    \ifHy@unicode
+      \ifnum#1>"10FFFF %
+        \HyPsd@UnicodeReplacementCharacter % illegal
+      \else
+        \ifnum#1>"FFFF %
+          \expandafter\HyPsd@unichar\expandafter{%
+            \number\numexpr 55296+%
+                \dimexpr.0009765625\dimexpr\number#1sp-\p@
+                \relax\relax\relax
+          }%
+          \expandafter\HyPsd@unichar\expandafter{%
+            \number\numexpr#1-9216%
+                -1024*\dimexpr.0009765625\dimexpr\number#1sp-\p@
+                \relax\relax\relax
+        }%
+        \else
+          \ifnum#1>"7FF %
+            \9%
+            \expandafter\HyPsd@unichar@first@byte\expandafter{%
+              \number
+              \dimexpr.00390625\dimexpr\number#1sp\relax\relax
+            }%
+          \else
+            \8%
+            \number\dimexpr.00390625\dimexpr\number#1sp\relax\relax
+          \fi
+          \expandafter\HyPsd@unichar@second@byte\expandafter{%
+            \number
+            \numexpr#1-256*\number
+                \dimexpr.00390625\dimexpr\number#1sp\relax\relax\relax
+          }%
+        \fi
+      \fi
+    \else
+      .% unsupported (Unicode -> PDF Doc Encoding)
+    \fi
+  }%
+  \def\HyPsd@UnicodeReplacementCharacter{\9377\375}%
+  \def\HyPsd@unichar@first@byte#1{%
+    \number\dimexpr.015625\dimexpr#1sp\relax\relax
+    \expandafter\HyPsd@unichar@octtwo\expandafter{%
+      \number
+      \numexpr#1-64*\number\dimexpr.015625\dimexpr#1sp%
+      \relax\relax\relax
+    }%
+  }%
+  \def\HyPsd@unichar@second@byte#1{%
+    \csname\number\dimexpr.015625\dimexpr#1sp\relax\relax\endcsname
+    \expandafter\HyPsd@unichar@octtwo\expandafter{%
+      \number
+      \numexpr#1-64*\number\dimexpr.015625\dimexpr#1sp%
+      \relax\relax\relax
+    }%
+  }%
+  \def\HyPsd@unichar@octtwo#1{%
+    \number\dimexpr.125\dimexpr#1sp\relax\relax
+    \number\numexpr#1-8*\number\dimexpr.125\dimexpr#1sp%
+    \relax\relax\relax
+  }%
+\fi
+\def\HyPsd@utf@viii@undeferr#1#2#3#4#5#6{%
+  \ifx\@gobble#1%
+  \else
+    [Please insert \textbackslash PrerenderUnicode%
+    \textbraceleft#1\textbraceright\space
+    into preamble]%
+  \fi
+}%
+\@ifclassloaded{memoir}{%
+  \Hy@AtEndOfPackage{\RequirePackage{memhfixc}}%
+}{}
+\@ifpackageloaded{subfigure}{%
+  \ltx@IfUndefined{sub@label}{%
+    \Hy@hypertexnamesfalse
+  }{%
+    \renewcommand*{\sub@label}[1]{%
+      \@bsphack
+      \subfig@oldlabel{#1}%
+      \if@filesw
+        \begingroup
+          \edef\@currentlabstr{%
+            \expandafter\strip@prefix\meaning\@currentlabelname
+          }%
+          \protected@write\@auxout{}{%
+            \string\newlabel{sub@#1}{%
+              {\@nameuse{@@thesub\@captype}}%
+              {\thepage}%
+              {%
+                \expandafter\strip@period\@currentlabstr
+                \relax.\relax\@@@%
+              }%
+              {\@currentHref}%
+              {}%
+            }%
+          }%
+        \endgroup
+      \fi
+      \@esphack
+    }%
+    \@ifpackagelater{subfigure}{2002/03/26}{}{%
+      \providecommand*{\toclevel@subfigure}{1}%
+      \providecommand*{\toclevel@subtable}{1}%
+    }%
+  }%
+}{}
+\ltx@IfUndefined{XR@addURL}{%
+}{%
+  \def\XR@addURL#1{\XR@@dURL#1{}{}{}{}\\}%
+  \def\XR@@dURL#1#2#3#4#5\\{%
+    {#1}{#2}%
+    \if!#4!%
+    \else
+      {#3}{#4}{\XR@URL}%
+    \fi
+  }%
+}
+\def\Hy@true{true}
+\def\Hy@false{false}
+\let\literalps@out\@gobble
+\newcommand\pdfbookmark[3][]{}
+\def\Acrobatmenu#1#2{\leavevmode#2}
+\def\Hy@writebookmark#1#2#3#4#5{}%
+\let\HyperRaiseLinkHook\@empty
+\def\HyperRaiseLinkDefault{\baselineskip}
+\newcount\Hy@SavedSpaceFactor
+\def\Hy@SaveSpaceFactor{%
+  \global\Hy@SavedSpaceFactor=\ifhmode\spacefactor\else\z@\fi
+}
+\def\Hy@RestoreSpaceFactor{%
+  \relax
+  \ifhmode
+    \ifnum\Hy@SavedSpaceFactor>\z@
+      \spacefactor=\Hy@SavedSpaceFactor
+    \fi
+  \fi
+}
+\def\Hy@SaveSavedSpaceFactor{%
+  \edef\Hy@RestoreSavedSpaceFactor{%
+    \global\Hy@SavedSpaceFactor=\the\Hy@SavedSpaceFactor\relax
+  }%
+}
+\def\Hy@raisedlink#1{%
+  \ifvmode
+    #1%
+  \else
+    \Hy@SaveSpaceFactor
+    \penalty\@M
+    \smash{%
+      \begingroup
+        \let\HyperRaiseLinkLength\@tempdima
+        \setlength\HyperRaiseLinkLength\HyperRaiseLinkDefault
+        \HyperRaiseLinkHook
+      \expandafter\endgroup
+      \expandafter\raise\the\HyperRaiseLinkLength\hbox{%
+        \Hy@RestoreSpaceFactor
+        #1%
+        \Hy@SaveSpaceFactor
+      }%
+    }%
+    \Hy@RestoreSpaceFactor
+  \fi
+}
+\def\Hy@SaveLastskip{%
+  \let\Hy@RestoreLastskip\relax
+  \ifvmode
+    \ifdim\lastskip=\z@
+      \let\Hy@RestoreLastskip\nobreak
+    \else
+      \begingroup
+        \skip@=-\lastskip
+        \edef\x{%
+          \endgroup
+          \def\noexpand\Hy@RestoreLastskip{%
+            \noexpand\ifvmode
+              \noexpand\nobreak
+              \vskip\the\skip@
+              \vskip\the\lastskip\relax
+            \noexpand\fi
+          }%
+        }%
+      \x
+    \fi
+  \else
+    \ifhmode
+      \ifdim\lastskip=\z@
+        \let\Hy@RestoreLastskip\nobreak
+      \else
+        \begingroup
+          \skip@=-\lastskip
+          \edef\x{%
+            \endgroup
+            \def\noexpand\Hy@RestoreLastskip{%
+              \noexpand\ifhmode
+                \noexpand\nobreak
+                \hskip\the\skip@
+                \hskip\the\lastskip\relax
+              \noexpand\fi
+            }%
+          }%
+        \x
+      \fi
+    \fi
+  \fi
+}%
+\SetupKeyvalOptions{%
+  family=Hyp,%
+  prefix=HyOpt%
+}
+\def\IfHyperBooleanExists#1{%
+  \ltx@ifundefined{Hy@#1false}\ltx@secondoftwo{%
+    \ltx@ifundefined{KV@Hyp@#1@default}\ltx@secondoftwo\ltx@firstoftwo
+  }%
+}
+\@namedef{KV@Hyp@stoppedearly@default}{}
+\def\IfHyperBoolean#1{%
+  \IfHyperBooleanExists{#1}{%
+    \csname ifHy@#1\endcsname
+      \expandafter\ltx@firstoftwo
+    \else
+      \expandafter\ltx@secondoftwo
+    \fi
+  }\ltx@secondoftwo
+}
+\def\Hy@boolkey#1#2{%
+  \edef\Hy@tempa{#2}%
+  \lowercase\expandafter{%
+    \expandafter\def\expandafter\Hy@tempa\expandafter{\Hy@tempa}%
+  }%
+  \ifx\Hy@tempa\@empty
+    \let\Hy@tempa\Hy@true
+  \fi
+  \ifx\Hy@tempa\Hy@true
+  \else
+    \ifx\Hy@tempa\Hy@false
+    \else
+      \let\Hy@tempa\relax
+    \fi
+  \fi
+  \ifx\Hy@tempa\relax
+    \Hy@WarnOptionValue{#2}{#1}{`true' or 'false'}%
+  \else
+    \Hy@Info{Option `#1' set `\Hy@tempa'}%
+    \csname Hy@#1\Hy@tempa\endcsname
+  \fi
+}
+\def\Hy@WarnOptionValue#1#2#3{%
+  \Hy@Warning{%
+    Unexpected value `#1'\MessageBreak
+    of option `#2' instead of\MessageBreak
+    #3%
+  }%
+}
+\def\Hy@DisableOption#1{%
+  \ltx@ifundefined{KV@Hyp@#1@default}{%
+    \define@key{Hyp}{#1}%
+  }{%
+    \define@key{Hyp}{#1}[]%
+  }%
+  {\Hy@WarnOptionDisabled{#1}}%
+}
+\def\Hy@WarnOptionDisabled#1{%
+  \Hy@Warning{%
+    Option `#1' has already been used,\MessageBreak
+    setting the option has no effect%
+  }%
+}
+\def\Hy@CheckOptionValue#1#2#3{%
+  \begingroup
+    \edef\x{#1}%
+    \@onelevel@sanitize\x
+    \let\y=y%
+    \def\do##1##2{%
+      \def\z{##1}%
+      \@onelevel@sanitize\z
+      \ifx\x\z
+        \let\y=n%
+        \let\do\@gobbletwo
+      \fi
+    }%
+    #3%
+    \ifx\y y%
+      \def\do##1##2{%
+        * `##1'%
+        \ifx\\##2\\\else\space(##2)\fi
+        \MessageBreak
+      }%
+      \Hy@Warning{%
+        Values of option `#2':\MessageBreak
+        #3%
+        * An empty value disables the option.\MessageBreak
+        Unknown value `\x'%
+      }%
+    \fi
+  \endgroup
+}
+\def\Hy@DefNameKey#1{%
+  \expandafter\Hy@@DefNameKey\csname @#1\endcsname{#1}%
+}
+\def\Hy@@DefNameKey#1#2#3{%
+  \define@key{Hyp}{#2}{%
+    \edef#1{##1}%
+    \ifx#1\@empty
+    \else
+      \Hy@CheckOptionValue{##1}{#2}{#3}%
+    \fi
+  }%
+  \let#1\@empty
+}
+\def\Hy@UseNameKey#1#2{%
+  \ifx#2\@empty
+  \else
+    /#1/#2%
+  \fi
+}
+\define@key{Hyp}{implicit}[true]{%
+  \Hy@boolkey{implicit}{#1}%
+}
+\define@key{Hyp}{draft}[true]{%
+  \Hy@boolkey{draft}{#1}%
+}
+\define@key{Hyp}{final}[true]{%
+  \Hy@boolkey{final}{#1}%
+}
+\let\KV@Hyp@nolinks\KV@Hyp@draft
+\def\Hy@ObsoletePaperOption#1{%
+  \Hy@WarningNoLine{%
+    Option `#1' is no longer used%
+  }%
+  \define@key{Hyp}{#1}[true]{}%
+}
+\def\Hy@temp#1{%
+  \define@key{Hyp}{#1}[true]{%
+    \Hy@ObsoletePaperOption{#1}%
+  }%
+}
+\Hy@temp{a4paper}
+\Hy@temp{a5paper}
+\Hy@temp{b5paper}
+\Hy@temp{letterpaper}
+\Hy@temp{legalpaper}
+\Hy@temp{executivepaper}
+\define@key{Hyp}{setpagesize}[true]{%
+  \Hy@boolkey{setpagesize}{#1}%
+}
+\define@key{Hyp}{debug}[true]{%
+  \Hy@boolkey{debug}{#1}%
+}
+\define@key{Hyp}{linktocpage}[true]{%
+  \Hy@boolkey{linktocpage}{#1}%
+  \ifHy@linktocpage
+    \let\Hy@linktoc\Hy@linktoc@page
+  \else
+    \let\Hy@linktoc\Hy@linktoc@section
+  \fi
+}
+\chardef\Hy@linktoc@none=0 %
+\chardef\Hy@linktoc@section=1 %
+\chardef\Hy@linktoc@page=2 %
+\chardef\Hy@linktoc@all=3 %
+\ifHy@linktocpage
+  \let\Hy@linktoc\Hy@linktoc@page
+\else
+  \let\Hy@linktoc\Hy@linktoc@section
+\fi
+\define@key{Hyp}{linktoc}{%
+  \@ifundefined{Hy@linktoc@#1}{%
+    \Hy@Warning{%
+      Unexpected value `#1' of\MessageBreak
+      option `linktoc' instead of `none',\MessageBreak
+      `section', `page' or `all'%
+    }%
+  }{%
+    \expandafter\let\expandafter\Hy@linktoc
+    \csname Hy@linktoc@#1\endcsname
+  }%
+}
+\define@key{Hyp}{extension}{\def\XR@ext{#1}}
+\let\XR@ext\relax
+\define@key{Hyp}{verbose}[true]{%
+  \Hy@boolkey{verbose}{#1}%
+}
+\define@key{Hyp}{typexml}[true]{%
+  \Hy@boolkey{typexml}{#1}%
+}
+\define@key{Hyp}{raiselinks}[true]{%
+  \Hy@boolkey{raiselinks}{#1}%
+}
+\def\Hy@setbreaklinks#1{%
+  \csname breaklinks#1\endcsname
+}
+\def\Hy@breaklinks@unsupported{%
+  \ifx\Hy@setbreaklinks\@gobble
+    \ifHy@breaklinks
+      \Hy@WarningNoLine{%
+        You have enabled option `breaklinks'.\MessageBreak
+        But driver `\Hy@driver.def' does not suppport this.\MessageBreak
+        Expect trouble with the link areas of broken links%
+      }%
+    \fi
+  \fi
+}
+\define@key{Hyp}{breaklinks}[true]{%
+  \Hy@boolkey{breaklinks}{#1}%
+  \let\Hy@setbreaklinks\@gobble
+}
+\define@key{Hyp}{localanchorname}[true]{%
+  \Hy@boolkey{localanchorname}{#1}%
+}
+\define@key{Hyp}{pageanchor}[true]{%
+  \Hy@boolkey{pageanchor}{#1}%
+}
+\define@key{Hyp}{plainpages}[true]{%
+  \Hy@boolkey{plainpages}{#1}%
+}
+\define@key{Hyp}{naturalnames}[true]{%
+  \Hy@boolkey{naturalnames}{#1}%
+}
+\define@key{Hyp}{hypertexnames}[true]{%
+  \Hy@boolkey{hypertexnames}{#1}%
+}
+\define@key{Hyp}{nesting}[true]{%
+  \Hy@boolkey{nesting}{#1}%
+}
+\define@key{Hyp}{unicode}[true]{%
+  \Hy@boolkey{unicode}{#1}%
+  \ifHy@unicode
+    \def\HyPsd@pdfencoding{unicode}%
+    \HyPsd@LoadUnicode
+  \else
+    \def\HyPsd@pdfencoding{pdfdoc}%
+  \fi
+}
+\def\HyPsd@LoadUnicode{%
+  \@ifundefined{T@PU}{%
+    \input{puenc.def}%
+    \HyLinguex@Restore
+  }{}%
+  \DeclareFontFamily{PU}{pdf}{}%
+  \DeclareFontShape{PU}{pdf}{m}{n}{ <-> cmr10 }{}%
+  \DeclareFontSubstitution{PU}{pdf}{m}{n}%
+  \global\let\HyPsd@LoadUnicode\relax
+}
+\Hy@AtBeginDocument{%
+  \ifx\HyPsd@LoadUnicode\relax
+  \else
+    \def\HyPsd@LoadUnicode{%
+      \Hy@Error{%
+        Unicode support for bookmarks is not available.\MessageBreak
+        Activate unicode support by using one of the options\MessageBreak
+        `unicode', `pdfencoding=unicode', `pdfencoding=auto'\MessageBreak
+        in the preamble%
+      }\@ehc
+      \global\let\HyPsd@LoadUnicode\relax
+      \global\Hy@unicodefalse
+      \global\let\Hy@unicodetrue\Hy@unicodefalse
+    }%
+  \fi
+}
+\define@key{Hyp}{pdfencoding}{%
+  \edef\HyPsd@temp{#1}%
+  \ifx\HyPsd@temp\HyPsd@pdfencoding@pdfdoc
+    \let\HyPsd@pdfencoding\HyPsd@temp
+    \Hy@unicodefalse
+  \else
+    \ifcase\ifx\HyPsd@temp\HyPsd@pdfencoding@unicode
+             \z@
+           \else
+             \ifx\HyPsd@temp\HyPsd@pdfencoding@auto
+               \z@
+             \else
+               \@ne
+             \fi
+           \fi
+      \let\HyPsd@pdfencoding\HyPsd@temp
+      \hypersetup{unicode}%
+      \ifHy@unicode
+        \def\HyPsd@pdfencoding{#1}%
+        \ifx\HyPsd@pdfencoding\HyPsd@pdfencoding@auto
+          \HyPsd@LoadStringEnc
+        \fi
+      \else
+        \Hy@Warning{Cannot switch to unicode bookmarks}%
+        \let\HyPsd@pdfencoding\HyPsd@pdfencoding@pdfdoc
+      \fi
+    \else
+      \@onelevel@sanitize\HyPsd@temp
+      \Hy@Warning{%
+        Values of option `pdfencoding':\MessageBreak
+        `pdfdoc', `unicode', `auto'.\MessageBreak
+        Ignoring unknown value `\HyPsd@temp'%
+      }%
+    \fi
+  \fi
+}
+\def\HyPsd@pdfencoding@auto{auto}
+\def\HyPsd@pdfencoding@pdfdoc{pdfdoc}
+\def\HyPsd@pdfencoding@unicode{unicode}
+\let\HyPsd@pdfencoding\Hy@pdfencoding@pdfdoc
+\def\HyPsd@LoadStringEnc{%
+  \RequirePackage{stringenc}[2009/12/15]%
+  \let\HyPsd@LoadStringEnc\relax
+}
+\Hy@AtBeginDocument{%
+  \@ifpackageloaded{stringenc}{%
+    \let\HyPsd@LoadStringEnc\relax
+  }{%
+    \def\HyPsd@LoadStringEnc{%
+      \Hy@WarningNoLine{%
+        Missing package `stringenc'. Use `pdfencoding=auto'\MessageBreak
+        in the preamble or load the package there%
+      }%
+    }%
+  }%
+}
+\def\hypersetup{\kvsetkeys{Hyp}}
+\newif\ifHy@setpdfversion
+\define@key{Hyp}{pdfversion}{%
+  \@ifundefined{Hy@pdfversion@#1}{%
+    \PackageWarning{hyperref}{%
+      Unsupported PDF version `#1'.\MessageBreak
+      Valid values: 1.2 until 1.9%
+    }%
+  }{%
+    \Hy@setpdfversiontrue
+    \edef\Hy@pdfversion{\@nameuse{Hy@pdfversion@#1}}%
+  }%
+}
+\@namedef{Hy@pdfversion@1.2}{2}%
+\@namedef{Hy@pdfversion@1.3}{3}%
+\@namedef{Hy@pdfversion@1.4}{4}%
+\@namedef{Hy@pdfversion@1.5}{5}%
+\@namedef{Hy@pdfversion@1.6}{6}%
+\@namedef{Hy@pdfversion@1.7}{7}%
+\@namedef{Hy@pdfversion@1.8}{8}%
+\@namedef{Hy@pdfversion@1.9}{9}%
+\def\Hy@pdfversion{2}
+\newif\ifHy@DviMode
+\let\Hy@DviErrMsg\ltx@empty
+\ifpdf
+  \def\Hy@DviErrMsg{pdfTeX or LuaTeX is running in PDF mode}%
+\else
+  \ifxetex
+    \def\Hy@DviErrMsg{XeTeX is running}%
+  \else
+    \ifvtex
+      \ifvtexdvi
+        \Hy@DviModetrue
+      \else
+        \def\Hy@DviErrMsg{VTeX is running, but not in DVI mode}%
+      \fi
+    \else
+      \Hy@DviModetrue
+    \fi
+  \fi
+\fi
+\def\HyOpt@CheckDvi#1{%
+  \ifHy@DviMode
+    \expandafter\ltx@firstofone
+  \else
+    \Hy@Error{%
+      Wrong DVI mode driver option `#1',\MessageBreak
+      because \Hy@DviErrMsg
+    }\@ehc
+    \expandafter\ltx@gobble
+  \fi
+}
+\DeclareVoidOption{tex4ht}{%
+  \Hy@texhttrue
+  \kvsetkeys{Hyp}{colorlinks=true}%
+  \def\BeforeTeXIVht{\RequirePackage{color}}%
+  \def\Hy@driver{htex4ht}%
+  \def\MaybeStopEarly{%
+    \Hy@Message{Stopped early}%
+    \Hy@AtBeginDocument{%
+      \PDF@FinishDoc
+      \gdef\PDF@FinishDoc{}%
+    }%
+    \endinput
+  }%
+}
+\DeclareVoidOption{pdftex}{%
+  \ifpdf
+    \def\Hy@driver{hpdftex}%
+  \else
+    \Hy@Error{%
+      Wrong driver option `pdftex',\MessageBreak
+      because pdfTeX in PDF mode is not detected%
+    }\@ehc
+  \fi
+}
+\DeclareVoidOption{nativepdf}{%
+  \HyOpt@CheckDvi{nativepdf}{%
+    \def\Hy@driver{hdvips}%
+  }%
+}
+\DeclareVoidOption{dvipdfm}{%
+  \HyOpt@CheckDvi{dvipdfm}{%
+    \def\Hy@driver{hdvipdfm}%
+  }%
+}
+\DeclareVoidOption{dvipdfmx}{%
+  \HyOpt@CheckDvi{dvipdfmx}{%
+    \def\Hy@driver{hdvipdfm}%
+  }%
+}
+\define@key{Hyp}{dvipdfmx-outline-open}[true]{%
+  \expandafter\ifx\csname if#1\expandafter\endcsname
+                  \csname iftrue\endcsname
+    \chardef\SpecialDvipdfmxOutlineOpen\@ne
+  \else
+    \chardef\SpecialDvipdfmxOutlineOpen\z@
+  \fi
+}
+\DeclareVoidOption{xetex}{%
+  \ifxetex
+    \def\Hy@driver{hxetex}%
+  \else
+    \Hy@Error{%
+      Wrong driver option `xetex',\MessageBreak
+      because XeTeX is not detected%
+    }\@ehc
+  \fi
+}
+\DeclareVoidOption{pdfmark}{%
+  \HyOpt@CheckDvi{pdfmark}{%
+    \def\Hy@driver{hdvips}%
+  }%
+}
+\DeclareVoidOption{dvips}{%
+  \HyOpt@CheckDvi{dvips}{%
+    \def\Hy@driver{hdvips}%
+  }%
+}
+\DeclareVoidOption{hypertex}{%
+  \HyOpt@CheckDvi{hypertex}{%
+    \def\Hy@driver{hypertex}%
+  }%
+}
+\let\Hy@MaybeStopNow\relax
+\DeclareVoidOption{vtex}{%
+  \ifvtex
+    \ifnum 0\ifnum\OpMode<1 1\fi \ifnum\OpMode>3 1\fi =0 %
+      \def\Hy@driver{hvtex}%
+    \else
+      \ifnum\OpMode=10\relax
+        \def\Hy@driver{hvtexhtm}%
+        \def\MaybeStopEarly{%
+           \Hy@Message{Stopped early}%
+           \Hy@AtBeginDocument{%
+             \PDF@FinishDoc
+             \gdef\PDF@FinishDoc{}%
+           }%
+           \endinput
+        }%
+      \else
+        \Hy@Error{%
+          Wrong driver option `vtex',\MessageBreak
+          because of wrong OpMode (\the\OpMode)%
+        }\@ehc
+      \fi
+    \fi
+  \else
+    \Hy@Error{%
+      Wrong driver option `vtex',\MessageBreak
+      because VTeX is not running%
+    }\@ehc
+  \fi
+}
+\DeclareVoidOption{vtexpdfmark}{%
+  \ifvtex
+    \ifnum 0\ifnum\OpMode<1 1\fi \ifnum\OpMode>3 1\fi =0 %
+      \def\Hy@driver{hvtexmrk}%
+    \else
+      \Hy@Error{%
+        Wrong driver option `vtexpdfmark',\MessageBreak
+        because of wrong OpMode (\the\OpMode)%
+      }\@ehc
+    \fi
+  \else
+    \Hy@Error{%
+      Wrong driver option `vtexpdfmark,\MessageBreak
+      because VTeX is not running%
+    }\@ehc
+  \fi
+}
+\DeclareVoidOption{dviwindo}{%
+  \HyOpt@CheckDvi{dviwindo}{%
+    \def\Hy@driver{hdviwind}%
+    \kvsetkeys{Hyp}{colorlinks}%
+    \PassOptionsToPackage{dviwindo}{color}%
+  }%
+}
+\DeclareVoidOption{dvipsone}{%
+  \HyOpt@CheckDvi{dvipsone}{%
+    \def\Hy@driver{hdvipson}%
+  }%
+}
+\DeclareVoidOption{textures}{%
+  \HyOpt@CheckDvi{textures}{%
+    \def\Hy@driver{htexture}%
+  }%
+}
+\DeclareVoidOption{latex2html}{%
+  \HyOpt@CheckDvi{latex2html}{%
+    \Hy@AtBeginDocument{\@@latextohtmlX}%
+  }%
+}
+\DeclareVoidOption{ps2pdf}{%
+  \HyOpt@CheckDvi{ps2pdf}{%
+    \def\Hy@driver{hdvips}%
+  }%
+}
+\let\HyOpt@DriverFallback\ltx@empty
+\define@key{Hyp}{driverfallback}{%
+  \ifHy@DviMode
+    \def\HyOpt@DriverFallback{#1}%
+    \Hy@Match\HyOpt@DriverFallback{%
+      ^(|dvipdfm|dvipdfmx|dvips|dvipsone|dviwindo|hypertex|ps2pdf|%
+       latex2html|tex4ht)$%
+    }{}{%
+      \let\HyOpt@DriverFallback\ltx@empty
+    }%
+  \fi
+}
+\define@key{Hyp}{hyperfigures}[true]{%
+  \Hy@boolkey{hyperfigures}{#1}%
+}
+\define@key{Hyp}{hyperfootnotes}[true]{%
+  \Hy@boolkey{hyperfootnotes}{#1}%
+}
+\def\back@none{none}
+\def\back@section{section}
+\def\back@page{page}
+\def\back@slide{slide}
+\define@key{Hyp}{backref}[section]{%
+  \lowercase{\def\Hy@tempa{#1}}%
+  \ifx\Hy@tempa\@empty
+    \let\Hy@tempa\back@section
+  \fi
+  \ifx\Hy@tempa\Hy@false
+    \let\Hy@tempa\back@none
+  \fi
+  \ifx\Hy@tempa\back@slide
+    \let\Hy@tempa\back@section
+  \fi
+  \ifx\Hy@tempa\back@page
+    \PassOptionsToPackage{hyperpageref}{backref}%
+    \Hy@backreftrue
+  \else
+    \ifx\Hy@tempa\back@section
+      \PassOptionsToPackage{hyperref}{backref}%
+      \Hy@backreftrue
+    \else
+      \ifx\Hy@tempa\back@none
+        \Hy@backreffalse
+      \else
+        \Hy@WarnOptionValue{#1}{backref}{%
+          `section', `slide', `page', `none',\MessageBreak
+          or `false'}%
+      \fi
+    \fi
+  \fi
+}
+\define@key{Hyp}{pagebackref}[true]{%
+  \edef\Hy@tempa{#1}%
+  \lowercase\expandafter{%
+    \expandafter\def\expandafter\Hy@tempa\expandafter{\Hy@tempa}%
+  }%
+  \ifx\Hy@tempa\@empty
+    \let\Hy@tempa\Hy@true
+  \fi
+  \ifx\Hy@tempa\Hy@true
+    \PassOptionsToPackage{hyperpageref}{backref}%
+    \Hy@backreftrue
+  \else
+    \ifx\Hy@tempa\Hy@false
+      \Hy@backreffalse
+    \else
+      \Hy@WarnOptionValue{#1}{pagebackref}{`true' or `false'}%
+    \fi
+  \fi
+}
+\define@key{Hyp}{hyperindex}[true]{%
+  \Hy@boolkey{hyperindex}{#1}%
+}
+\define@key{Hyp}{encap}[\|]{%
+  \def\HyInd@EncapChar{#1}%
+}
+\def\HyLang@afrikaans{%
+  \def\equationautorefname{Vergelyking}%
+  \def\footnoteautorefname{Voetnota}%
+  \def\itemautorefname{Item}%
+  \def\figureautorefname{Figuur}%
+  \def\tableautorefname{Tabel}%
+  \def\partautorefname{Deel}%
+  \def\appendixautorefname{Bylae}%
+  \def\chapterautorefname{Hoofstuk}%
+  \def\sectionautorefname{Afdeling}%
+  \def\subsectionautorefname{Subafdeling}%
+  \def\subsubsectionautorefname{Subsubafdeling}%
+  \def\paragraphautorefname{Paragraaf}%
+  \def\subparagraphautorefname{Subparagraaf}%
+  \def\FancyVerbLineautorefname{Lyn}%
+  \def\theoremautorefname{Teorema}%
+  \def\pageautorefname{Bladsy}%
+}
+\def\HyLang@english{%
+  \def\equationautorefname{Equation}%
+  \def\footnoteautorefname{footnote}%
+  \def\itemautorefname{item}%
+  \def\figureautorefname{Figure}%
+  \def\tableautorefname{Table}%
+  \def\partautorefname{Part}%
+  \def\appendixautorefname{Appendix}%
+  \def\chapterautorefname{chapter}%
+  \def\sectionautorefname{section}%
+  \def\subsectionautorefname{subsection}%
+  \def\subsubsectionautorefname{subsubsection}%
+  \def\paragraphautorefname{paragraph}%
+  \def\subparagraphautorefname{subparagraph}%
+  \def\FancyVerbLineautorefname{line}%
+  \def\theoremautorefname{Theorem}%
+  \def\pageautorefname{page}%
+}
+\def\HyLang@french{%
+  \def\equationautorefname{\'Equation}%
+  \def\footnoteautorefname{note}%
+  \def\itemautorefname{item}%
+  \def\figureautorefname{Figure}%
+  \def\tableautorefname{Tableau}%
+  \def\partautorefname{Partie}%
+  \def\appendixautorefname{Appendice}%
+  \def\chapterautorefname{chapitre}%
+  \def\sectionautorefname{section}%
+  \def\subsectionautorefname{sous-section}%
+  \def\subsubsectionautorefname{sous-sous-section}%
+  \def\paragraphautorefname{paragraphe}%
+  \def\subparagraphautorefname{sous-paragraphe}%
+  \def\FancyVerbLineautorefname{ligne}%
+  \def\theoremautorefname{Th\'eor\`eme}%
+  \def\pageautorefname{page}%
+}
+\def\HyLang@german{%
+  \def\equationautorefname{Gleichung}%
+  \def\footnoteautorefname{Fu\ss note}%
+  \def\itemautorefname{Punkt}%
+  \def\figureautorefname{Abbildung}%
+  \def\tableautorefname{Tabelle}%
+  \def\partautorefname{Teil}%
+  \def\appendixautorefname{Anhang}%
+  \def\chapterautorefname{Kapitel}%
+  \def\sectionautorefname{Abschnitt}%
+  \def\subsectionautorefname{Unterabschnitt}%
+  \def\subsubsectionautorefname{Unterunterabschnitt}%
+  \def\paragraphautorefname{Absatz}%
+  \def\subparagraphautorefname{Unterabsatz}%
+  \def\FancyVerbLineautorefname{Zeile}%
+  \def\theoremautorefname{Theorem}%
+  \def\pageautorefname{Seite}%
+}
+\def\HyLang@italian{%
+  \def\equationautorefname{Equazione}%
+  \def\footnoteautorefname{nota}%
+  \def\itemautorefname{punto}%
+  \def\figureautorefname{Figura}%
+  \def\tableautorefname{Tabella}%
+  \def\partautorefname{Parte}%
+  \def\appendixautorefname{Appendice}%
+  \def\chapterautorefname{Capitolo}%
+  \def\sectionautorefname{sezione}%
+  \def\subsectionautorefname{sottosezione}%
+  \def\subsubsectionautorefname{sottosottosezione}%
+  \def\paragraphautorefname{paragrafo}%
+  \def\subparagraphautorefname{sottoparagrafo}%
+  \def\FancyVerbLineautorefname{linea}%
+  \def\theoremautorefname{Teorema}%
+  \def\pageautorefname{Pag.\@}%
+}
+\def\HyLang@magyar{%
+  \def\equationautorefname{Egyenlet}%
+  \def\footnoteautorefname{l\'abjegyzet}%
+  \def\itemautorefname{Elem}%
+  \def\figureautorefname{\'Abra}%
+  \def\tableautorefname{T\'abl\'azat}%
+  \def\partautorefname{R\'esz}%
+  \def\appendixautorefname{F\"uggel\'ek}%
+  \def\chapterautorefname{fejezet}%
+  \def\sectionautorefname{szakasz}%
+  \def\subsectionautorefname{alszakasz}%
+  \def\subsubsectionautorefname{alalszakasz}%
+  \def\paragraphautorefname{bekezd\'es}%
+  \def\subparagraphautorefname{albekezd\'es}%
+  \def\FancyVerbLineautorefname{sor}%
+  \def\theoremautorefname{T\'etel}%
+  \def\pageautorefname{oldal}%
+}
+\def\HyLang@portuges{%
+  \def\equationautorefname{Equa\c c\~ao}%
+  \def\footnoteautorefname{Nota de rodap\'e}%
+  \def\itemautorefname{Item}%
+  \def\figureautorefname{Figura}%
+  \def\tableautorefname{Tabela}%
+  \def\partautorefname{Parte}%
+  \def\appendixautorefname{Ap\^endice}%
+  \def\chapterautorefname{Cap\'itulo}%
+  \def\sectionautorefname{Se\c c\~ao}%
+  \def\subsectionautorefname{Subse\c c\~ao}%
+  \def\subsubsectionautorefname{Subsubse\c c\~ao}%
+  \def\paragraphautorefname{par\'agrafo}%
+  \def\subparagraphautorefname{subpar\'agrafo}%
+  \def\FancyVerbLineautorefname{linha}%
+  \def\theoremautorefname{Teorema}%
+  \def\pageautorefname{P\'agina}%
+}
+\def\HyLang@russian{%
+  \def\equationautorefname{\cyr\cyrv\cyrery\cyrr.}%
+  \def\footnoteautorefname{%
+    \cyr\cyrp\cyro\cyrd\cyrs\cyrt\cyrr.\ \cyrp\cyrr\cyri\cyrm.%
+  }%
+  \def\itemautorefname{\cyr\cyrp.}%
+  \def\figureautorefname{\cyr\cyrr\cyri\cyrs.}%
+  \def\tableautorefname{\cyr\cyrt\cyra\cyrb\cyrl.}%
+  \def\partautorefname{\cyr\cyrch.}%
+  \def\chapterautorefname{\cyr\cyrg\cyrl.}%
+  \def\sectionautorefname{\cyr\cyrr\cyra\cyrz\cyrd.}%
+  \def\appendixautorefname{\cyr\cyrp\cyrr\cyri\cyrl.}%
+  \def\subsectionautorefname{\cyr\cyrr\cyra\cyrz\cyrd.}%
+  \def\subsubsectionautorefname{\cyr\cyrr\cyra\cyrz\cyrd.}%
+  \def\paragraphautorefname{\cyr\cyrp.}%
+  \def\subparagraphautorefname{\cyr\cyrp.}%
+  \def\FancyVerbLineautorefname{\cyr\cyrs\cyrt\cyrr.}%
+  \def\theoremautorefname{\cyr\cyrt\cyre\cyro\cyrr.}%
+  \def\pageautorefname{\cyr\cyrs.}%
+}
+\def\HyLang@spanish{%
+  \def\equationautorefname{Ecuaci\'on}%
+  \def\footnoteautorefname{Nota a pie de p\'agina}%
+  \def\itemautorefname{Elemento}%
+  \def\figureautorefname{Figura}%
+  \def\tableautorefname{Tabla}%
+  \def\partautorefname{Parte}%
+  \def\appendixautorefname{Ap\'endice}%
+  \def\chapterautorefname{Cap\'itulo}%
+  \def\sectionautorefname{Secci\'on}%
+  \def\subsectionautorefname{Subsecci\'on}%
+  \def\subsubsectionautorefname{Subsubsecci\'on}%
+  \def\paragraphautorefname{P\'arrafo}%
+  \def\subparagraphautorefname{Subp\'arrafo}%
+  \def\FancyVerbLineautorefname{L\'inea}%
+  \def\theoremautorefname{Teorema}%
+  \def\pageautorefname{P\'agina}%
+}
+\def\HyLang@vietnamese{%
+  \def\equationautorefname{Ph\uhorn{}\ohorn{}ng tr\`inh}%
+  \def\footnoteautorefname{Ch\'u th\'ich}%
+  \def\itemautorefname{m\d{u}c}%
+  \def\figureautorefname{H\`inh}%
+  \def\tableautorefname{B\h{a}ng}%
+  \def\partautorefname{Ph\`\acircumflex{}n}%
+  \def\appendixautorefname{Ph\d{u} l\d{u}c}%
+  \def\chapterautorefname{ch\uhorn{}\ohorn{}ng}%
+  \def\sectionautorefname{m\d{u}c}%
+  \def\subsectionautorefname{m\d{u}c}%
+  \def\subsubsectionautorefname{m\d{u}c}%
+  \def\paragraphautorefname{\dj{}o\d{a}n}%
+  \def\subparagraphautorefname{\dj{}o\d{a}n}%
+  \def\FancyVerbLineautorefname{d\`ong}%
+  \def\theoremautorefname{\DJ{}\d{i}nh l\'y}%
+  \def\pageautorefname{Trang}%
+}
+\def\HyLang@addto#1#2{%
+  #2%
+  \@temptokena{#2}%
+  \ifx#1\relax
+    \let#1\@empty
+  \fi
+  \ifx#1\@undefined
+    \edef#1{\the\@temptokena}%
+  \else
+    \toks@\expandafter{#1}%
+    \edef#1{\the\toks@\the\@temptokena}%
+  \fi
+  \@temptokena{}\toks@\@temptokena
+}
+\def\HyLang@DeclareLang#1#2#3{%
+  \@ifpackagewith{babel}{#1}{%
+    \expandafter\HyLang@addto
+        \csname extras#1\expandafter\endcsname
+        \csname HyLang@#2\endcsname
+    \begingroup
+      \edef\x{\endgroup
+        #3%
+      }%
+    \x
+    \@namedef{HyLang@#1@done}{}%
+  }{}%
+  \begingroup
+    \edef\x##1##2{%
+      \noexpand\ifx##2\relax
+        \errmessage{No definitions for language #2' found!}%
+      \noexpand\fi
+      \endgroup
+      \noexpand\define@key{Hyp}{#1}[]{%
+        \noexpand\@ifundefined{HyLang@#1@done}{%
+          \noexpand\HyLang@addto{\noexpand##1}{\noexpand##2}%
+          #3%
+          \noexpand\@namedef{HyLang@#1@done}{}%
+        }{}%
+      }%
+    }%
+  \expandafter\x\csname extras#1\expandafter\endcsname
+                \csname HyLang@#2\endcsname
+}
+\HyLang@DeclareLang{english}{english}{}
+\HyLang@DeclareLang{UKenglish}{english}{}
+\HyLang@DeclareLang{british}{english}{}
+\HyLang@DeclareLang{USenglish}{english}{}
+\HyLang@DeclareLang{american}{english}{}
+\HyLang@DeclareLang{german}{german}{}
+\HyLang@DeclareLang{austrian}{german}{}
+\HyLang@DeclareLang{ngerman}{german}{}
+\HyLang@DeclareLang{naustrian}{german}{}
+\HyLang@DeclareLang{russian}{russian}{\noexpand\hypersetup{unicode}}
+\HyLang@DeclareLang{brazil}{portuges}{}
+\HyLang@DeclareLang{brazilian}{portuges}{}
+\HyLang@DeclareLang{portuguese}{portuges}{}
+\HyLang@DeclareLang{spanish}{spanish}{}
+\HyLang@DeclareLang{afrikaans}{afrikaans}{}
+\HyLang@DeclareLang{french}{french}{}
+\HyLang@DeclareLang{frenchb}{french}{}
+\HyLang@DeclareLang{francais}{french}{}
+\HyLang@DeclareLang{acadian}{french}{}
+\HyLang@DeclareLang{canadien}{french}{}
+\HyLang@DeclareLang{italian}{italian}{}
+\HyLang@DeclareLang{magyar}{magyar}{}
+\HyLang@DeclareLang{hungarian}{magyar}{}
+\DeclareVoidOption{vietnamese}{%
+  \HyLang@addto\extrasvietnamese\HyLang@vietnamese
+  \Hy@AtEndOfPackage{%
+    \@ifundefined{T@PU}{}{%
+      \input{puvnenc.def}%
+    }%
+  }%
+}
+\DeclareVoidOption{vietnam}{%
+  \HyLang@addto\extrasvietnam\HyLang@vietnamese
+  \Hy@AtEndOfPackage{%
+    \@ifundefined{T@PU}{}{%
+      \input{puvnenc.def}%
+    }%
+  }%
+}
+\DeclareVoidOption{arabic}{%
+  \Hy@AtEndOfPackage{%
+    \@ifundefined{T@PU}{}{%
+      \input{puarenc.def}%
+    }%
+  }%
+}
+\define@key{Hyp}{colorlinks}[true]{%
+  \Hy@boolkey{colorlinks}{#1}%
+}
+\DeclareVoidOption{hidelinks}{%
+  \Hy@colorlinksfalse
+  \Hy@ocgcolorlinksfalse
+  \Hy@frenchlinksfalse
+  \def\Hy@colorlink##1{\begingroup}%
+  \def\Hy@endcolorlink{\endgroup}%
+  \def\@pdfborder{0 0 0}%
+  \let\@pdfborderstyle\ltx@empty
+}
+\define@key{Hyp}{ocgcolorlinks}[true]{%
+  \Hy@boolkey{ocgcolorlinks}{#1}%
+}
+\Hy@AtBeginDocument{%
+  \begingroup
+    \@ifundefined{OBJ@OCG@view}{%
+      \ifHy@ocgcolorlinks
+        \Hy@Warning{%
+          Driver does not support `ocgcolorlinks',\MessageBreak
+          using `colorlinks' instead%
+        }%
+      \fi
+    }{}%
+  \endgroup
+}
+\define@key{Hyp}{frenchlinks}[true]{%
+  \Hy@boolkey{frenchlinks}{#1}%
+}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname chapter\endcsname\relax
+  \def\toclevel@part{0}%
+\else
+  \def\toclevel@part{-1}%
+\fi
+\def\toclevel@chapter{0}
+\def\toclevel@section{1}
+\def\toclevel@subsection{2}
+\def\toclevel@subsubsection{3}
+\def\toclevel@paragraph{4}
+\def\toclevel@subparagraph{5}
+\def\toclevel@figure{0}
+\def\toclevel@table{0}
+\@ifpackageloaded{listings}{%
+  \providecommand*\theHlstlisting{\thelstlisting}%
+  \providecommand*\toclevel@lstlisting{0}%
+}{}
+\@ifpackageloaded{listing}{%
+  \providecommand*\theHlisting{\thelisting}%
+  \providecommand*\toclevel@listing{0}%
+}{}
+\define@key{Hyp}{bookmarks}[true]{%
+  \Hy@boolkey{bookmarks}{#1}%
+}
+\define@key{Hyp}{bookmarksopen}[true]{%
+  \Hy@boolkey{bookmarksopen}{#1}%
+}
+\let\Hy@bookmarksdepth\c@tocdepth
+\define@key{Hyp}{bookmarksdepth}[]{%
+  \begingroup
+    \edef\x{#1}%
+    \ifx\x\empty
+      \global\let\Hy@bookmarksdepth\c@tocdepth
+    \else
+      \@ifundefined{toclevel@\x}{%
+        \@onelevel@sanitize\x
+        \edef\y{\expandafter\@car\x\@nil}%
+        \ifcase 0\expandafter\ifx\y-1\fi
+                 \expandafter\ifnum\expandafter`\y>47 %
+                   \expandafter\ifnum\expandafter`\y<58 1\fi\fi\relax
+          \Hy@Warning{Unknown document division name (\x)}%
+        \else
+          \setbox\z@=\hbox{%
+            \count@=\x
+            \xdef\Hy@bookmarksdepth{\the\count@}%
+          }%
+        \fi
+      }{%
+        \setbox\z@=\hbox{%
+          \count@=\csname toclevel@\x\endcsname
+          \xdef\Hy@bookmarksdepth{\the\count@}%
+        }%
+      }%
+    \fi
+  \endgroup
+}
+\define@key{Hyp}{bookmarksopenlevel}{%
+  \def\@bookmarksopenlevel{#1}%
+}
+\def\@bookmarksopenlevel{\maxdimen}
+\define@key{Hyp}{bookmarkstype}{%
+  \def\Hy@bookmarkstype{#1}%
+}
+\def\Hy@bookmarkstype{toc}
+\define@key{Hyp}{bookmarksnumbered}[true]{%
+  \Hy@boolkey{bookmarksnumbered}{#1}%
+}
+\define@key{Hyp}{CJKbookmarks}[true]{%
+  \Hy@boolkey{CJKbookmarks}{#1}%
+}
+\def\Hy@temp#1{%
+  \expandafter\Hy@@temp\csname @#1color\endcsname{#1}%
+}
+\def\Hy@@temp#1#2#3{%
+  \define@key{Hyp}{#2color}{%
+    \HyColor@HyperrefColor{##1}#1%
+  }%
+  \def#1{#3}%
+}
+\Hy@temp{link}{red}
+\Hy@temp{anchor}{black}
+\Hy@temp{cite}{green}
+\Hy@temp{file}{cyan}
+\Hy@temp{url}{magenta}
+\Hy@temp{menu}{red}
+\Hy@temp{run}{\@filecolor}
+\define@key{Hyp}{pagecolor}{%
+  \Hy@WarningPageColor
+}
+\def\Hy@WarningPageColor{%
+  \Hy@WarningNoLine{Option `pagecolor' is not available anymore}%
+  \global\let\Hy@WarningPageColor\relax
+}
+\define@key{Hyp}{allcolors}{%
+  \HyColor@HyperrefColor{#1}\@linkcolor
+  \HyColor@HyperrefColor{#1}\@anchorcolor
+  \HyColor@HyperrefColor{#1}\@citecolor
+  \HyColor@HyperrefColor{#1}\@filecolor
+  \HyColor@HyperrefColor{#1}\@urlcolor
+  \HyColor@HyperrefColor{#1}\@menucolor
+  \HyColor@HyperrefColor{#1}\@runcolor
+}
+\def\hyperbaseurl#1{\def\@baseurl{#1}}
+\define@key{Hyp}{baseurl}{\hyperbaseurl{#1}}
+\let\@baseurl\@empty
+\def\hyperlinkfileprefix#1{\def\Hy@linkfileprefix{#1}}
+\define@key{Hyp}{linkfileprefix}{\hyperlinkfileprefix{#1}}
+\hyperlinkfileprefix{file:}
+\let\@pdfpagetransition\relax
+\define@key{Hyp}{pdfpagetransition}{%
+  \def\@pdfpagetransition{#1}%
+}
+\let\@pdfpageduration\relax
+\define@key{Hyp}{pdfpageduration}{%
+  \def\@pdfpageduration{#1}%
+  \Hy@Match\@pdfpageduration{%
+    ^(|[0-9]+\.?[0-9]*|[0-9]*\.?[0-9]+)$%
+  }{}{%
+    \Hy@Warning{%
+      Invalid value `\@pdfpageduration'\MessageBreak
+      of option `pdfpageduration'\MessageBreak
+      is replaced by an empty value%
+    }%
+    \let\@pdfpageduration\ltx@empty
+  }%
+}
+\newif\ifHy@useHidKey
+\Hy@useHidKeyfalse
+\define@key{Hyp}{pdfpagehidden}[true]{%
+  \Hy@boolkey{pdfpagehidden}{#1}%
+  \ifHy@pdfpagehidden
+    \global\Hy@useHidKeytrue
+  \fi
+}
+\def\Hy@ColorList{cite,file,link,menu,run,url}
+\@for\Hy@temp:=\Hy@ColorList\do{%
+  \edef\Hy@temp{%
+    \noexpand\define@key{Hyp}{\Hy@temp bordercolor}{%
+      \noexpand\HyColor@HyperrefBorderColor
+          {##1}%
+          \expandafter\noexpand\csname @\Hy@temp bordercolor\endcsname
+          {hyperref}%
+          {\Hy@temp bordercolor}%
+    }%
+  }%
+  \Hy@temp
+}
+\define@key{Hyp}{pagebordercolor}{%
+  \Hy@WarningPageBorderColor
+}
+\def\Hy@WarningPageBorderColor{%
+  \Hy@WarningNoLine{Option `pagebordercolor' is not available anymore}%
+  \global\let\Hy@WarningPageBorderColor\relax
+}
+\define@key{Hyp}{allbordercolors}{%
+  \def\Hy@temp##1##2{%
+    \HyColor@HyperrefBorderColor{#1}##1{hyperref}{##2bordercolor}%
+  }%
+  \Hy@temp\@citebordercolor{cite}%
+  \Hy@temp\@filebordercolor{file}%
+  \Hy@temp\@linkbordercolor{link}%
+  \Hy@temp\@menubordercolor{menu}%
+  \Hy@temp\@runbordercolor{run}%
+  \Hy@temp\@urlbordercolor{url}%
+}
+\define@key{Hyp}{pdfhighlight}{\def\@pdfhighlight{#1}}
+\Hy@DefNameKey{pdfhighlight}{%
+  \do{/I}{Invert}%
+  \do{/N}{None}%
+  \do{/O}{Outline}%
+  \do{/P}{Push}%
+}
+\define@key{Hyp}{pdfborder}{%
+  \let\Hy@temp\@pdfborder
+  \def\@pdfborder{#1}%
+  \Hy@Match\@pdfborder{%
+    ^\HyPat@NonNegativeReal/ %
+     \HyPat@NonNegativeReal/ %
+     \HyPat@NonNegativeReal/%
+     ( ?\[\HyPat@NonNegativeReal/( \HyPat@NonNegativeReal/)*])?$%
+  }{}{%
+    \Hy@Warning{%
+      Invalid value `\@pdfborder'\MessageBreak
+      for option `pdfborder'.\MessageBreak
+      Option setting is ignored%
+    }%
+    \let\@pdfborder\Hy@temp
+  }%
+}
+\define@key{Hyp}{pdfborderstyle}{%
+  \let\Hy@temp\@pdfborderstyle
+  \def\@pdfborderstyle{#1}%
+  \Hy@Match\@pdfborderstyle{%
+    ^%
+    ( */Type */Border%
+    | */W +\HyPat@NonNegativeReal/%
+    | */S */[SDBIU]%
+    | */D *\[ *(\HyPat@NonNegativeReal/( \HyPat@NonNegativeReal/)?)?]%
+    )* *$%
+  }{}{%
+    \Hy@Warning{%
+      Invalid value `\@pdfborderstyle'\MessageBreak
+      for option `pdfborderstyle'.\MessageBreak
+      Option setting is ignored%
+    }%
+    \let\@pdfborderstyle\Hy@temp
+  }%
+}
+\def\Hy@setpdfborder{%
+  \ifx\@pdfborder\@empty
+  \else
+    /Border[\@pdfborder]%
+  \fi
+  \ifx\@pdfborderstyle\@empty
+  \else
+    /BS<<\@pdfborderstyle>>%
+  \fi
+}
+\Hy@DefNameKey{pdfpagemode}{%
+  \do{UseNone}{}%
+  \do{UseOutlines}{}%
+  \do{UseThumbs}{}%
+  \do{FullScreen}{}%
+  \do{UseOC}{PDF 1.5}%
+  \do{UseAttachments}{PDF 1.6}%
+}
+\Hy@DefNameKey{pdfnonfullscreenpagemode}{%
+  \do{UseNone}{}%
+  \do{UseOutlines}{}%
+  \do{UseThumbs}{}%
+  \do{FullScreen}{}%
+  \do{UseOC}{PDF 1.5}%
+  \do{UseAttachments}{PDF 1.6}%
+}
+\Hy@DefNameKey{pdfdirection}{%
+  \do{L2R}{Left to right}%
+  \do{R2L}{Right to left}%
+}
+\Hy@DefNameKey{pdfviewarea}{%
+  \do{MediaBox}{}%
+  \do{CropBox}{}%
+  \do{BleedBox}{}%
+  \do{TrimBox}{}%
+  \do{ArtBox}{}%
+}
+\Hy@DefNameKey{pdfviewclip}{%
+  \do{MediaBox}{}%
+  \do{CropBox}{}%
+  \do{BleedBox}{}%
+  \do{TrimBox}{}%
+  \do{ArtBox}{}%
+}
+\Hy@DefNameKey{pdfprintarea}{%
+  \do{MediaBox}{}%
+  \do{CropBox}{}%
+  \do{BleedBox}{}%
+  \do{TrimBox}{}%
+  \do{ArtBox}{}%
+}
+\Hy@DefNameKey{pdfprintclip}{%
+  \do{MediaBox}{}%
+  \do{CropBox}{}%
+  \do{BleedBox}{}%
+  \do{TrimBox}{}%
+  \do{ArtBox}{}%
+}
+\Hy@DefNameKey{pdfprintscaling}{%
+  \do{AppDefault}{}%
+  \do{None}{}%
+}
+\Hy@DefNameKey{pdfduplex}{%
+  \do{Simplex}{}%
+  \do{DuplexFlipShortEdge}{}%
+  \do{DuplexFlipLongEdge}{}%
+}
+\Hy@DefNameKey{pdfpicktraybypdfsize}{%
+  \do{true}{}%
+  \do{false}{}%
+}
+\define@key{Hyp}{pdfprintpagerange}{%
+  \def\@pdfprintpagerange{#1}%
+}
+\Hy@DefNameKey{pdfnumcopies}{%
+  \do{2}{two copies}%
+  \do{3}{three copies}%
+  \do{4}{four copies}%
+  \do{5}{five copies}%
+}
+\define@key{Hyp}{pdfusetitle}[true]{%
+  \Hy@boolkey{pdfusetitle}{#1}%
+}
+\def\HyXeTeX@CheckUnicode{%
+  \ifxetex
+    \ifHy@unicode
+    \else
+      \Hy@WarningNoLine{%
+        XeTeX driver only supports unicode.\MessageBreak
+        Enabling option `unicode'%
+      }%
+      \kvsetkeys{Hyp}{unicode}%
+    \fi
+  \else
+    \let\HyXeTeX@CheckUnicode\relax
+  \fi
+}
+\def\HyPsd@PrerenderUnicode#1{%
+  \begingroup
+    \expandafter\ifx\csname PrerenderUnicode\endcsname\relax
+    \else
+      \sbox0{%
+        \let\GenericInfo\@gobbletwo
+        \let\GenericWarning\@gobbletwo
+        \let\GenericError\@gobblefour
+        \PrerenderUnicode{#1}%
+       }%
+    \fi
+  \endgroup
+}
+\define@key{Hyp}{pdftitle}{%
+  \HyXeTeX@CheckUnicode
+  \HyPsd@XeTeXBigCharstrue
+  \HyPsd@PrerenderUnicode{#1}%
+  \pdfstringdef\@pdftitle{#1}%
+}
+\define@key{Hyp}{pdfauthor}{%
+  \HyXeTeX@CheckUnicode
+  \HyPsd@XeTeXBigCharstrue
+  \HyPsd@PrerenderUnicode{#1}%
+  \pdfstringdef\@pdfauthor{#1}%
+}
+\define@key{Hyp}{pdfproducer}{%
+  \HyXeTeX@CheckUnicode
+  \HyPsd@XeTeXBigCharstrue
+  \HyPsd@PrerenderUnicode{#1}%
+  \pdfstringdef\@pdfproducer{#1}%
+}
+\define@key{Hyp}{pdfcreator}{%
+  \HyXeTeX@CheckUnicode
+  \HyPsd@XeTeXBigCharstrue
+  \HyPsd@PrerenderUnicode{#1}%
+  \pdfstringdef\@pdfcreator{#1}%
+}
+\define@key{Hyp}{pdfcreationdate}{%
+  \begingroup
+    \Hy@unicodefalse
+    \pdfstringdef\@pdfcreationdate{#1}%
+  \endgroup
+}
+\define@key{Hyp}{pdfmoddate}{%
+  \begingroup
+    \Hy@unicodefalse
+    \pdfstringdef\@pdfmoddate{#1}%
+  \endgroup
+}
+\define@key{Hyp}{pdfsubject}{%
+  \HyXeTeX@CheckUnicode
+  \HyPsd@XeTeXBigCharstrue
+  \HyPsd@PrerenderUnicode{#1}%
+  \pdfstringdef\@pdfsubject{#1}%
+}
+\define@key{Hyp}{pdfkeywords}{%
+  \HyXeTeX@CheckUnicode
+  \HyPsd@XeTeXBigCharstrue
+  \HyPsd@PrerenderUnicode{#1}%
+  \pdfstringdef\@pdfkeywords{#1}%
+}
+\define@key{Hyp}{pdftrapped}{%
+  \lowercase{\edef\Hy@temp{#1}}%
+  \ifx\Hy@temp\HyInfo@trapped@true
+    \def\@pdftrapped{True}%
+  \else
+    \ifx\Hy@temp\HyInfo@trapped@false
+      \def\@pdftrapped{False}%
+    \else
+      \ifx\Hy@temp\HyInfo@trapped@unknown
+        \def\@pdftrapped{Unknown}%
+      \else
+        \ifx\Hy@temp\@empty
+        \else
+          \Hy@Warning{%
+            Unsupported value `#1'\MessageBreak
+            for option `pdftrapped'%
+          }%
+        \fi
+        \def\@pdftrapped{}%
+      \fi
+    \fi
+  \fi
+}
+\def\HyInfo@trapped@true{true}
+\def\HyInfo@trapped@false{false}
+\def\HyInfo@trapped@unknown{unknown}
+\def\HyInfo@TrappedUnsupported{%
+  \ifx\@pdftrapped\@empty
+  \else
+    \Hy@WarningNoLine{`pdftrapped' is not supported by this driver}%
+    \gdef\HyInfo@TrappedUnsupported{}%
+  \fi
+}
+\define@key{Hyp}{pdfinfo}{%
+  \kvsetkeys{pdfinfo}{#1}%
+}
+\def\Hy@temp#1{%
+  \lowercase{\Hy@temp@A{#1}}{#1}%
+}
+\def\Hy@temp@A#1#2{%
+  \define@key{pdfinfo}{#2}{%
+    \hypersetup{pdf#1={##1}}%
+  }%
+}
+\Hy@temp{Title}
+\Hy@temp{Author}
+\Hy@temp{Keywords}
+\Hy@temp{Subject}
+\Hy@temp{Creator}
+\Hy@temp{Producer}
+\Hy@temp{CreationDate}
+\Hy@temp{ModDate}
+\Hy@temp{Trapped}
+\newif\ifHyInfo@AddonUnsupported
+\kv@set@family@handler{pdfinfo}{%
+  \HyInfo@AddonHandler{#1}{#2}%
+}
+\let\HyInfo@do\relax
+\def\HyInfo@AddonHandler#1#2{%
+  \ifx\kv@value\relax
+    \Hy@Warning{%
+      Option `pdfinfo': ignoring key `\kv@key' without value%
+    }%
+  \else
+    \EdefEscapeName\HyInfo@KeyEscaped{\kv@key}%
+    \EdefUnescapeName\HyInfo@Key{\HyInfo@KeyEscaped}%
+    \expandafter\ifx\csname KV@pdfinfo@\HyInfo@Key\endcsname\relax
+      \ifHyInfo@AddonUnsupported
+        \Hy@Warning{%
+          This driver does not support additional\MessageBreak
+          information entries, therefore\MessageBreak
+          `\kv@key' is ignored%
+        }%
+      \else
+        \define@key{pdfinfo}{\HyInfo@Key}{%
+          \HyXeTeX@CheckUnicode
+          \HyPsd@XeTeXBigCharstrue
+          \HyPsd@PrerenderUnicode{##1}%
+          \pdfstringdef\HyInfo@Value{##1}%
+          \expandafter\let\csname HyInfo@Value@\HyInfo@Key\endcsname
+              \HyInfo@Value
+        }%
+        \edef\HyInfo@AddonList{%
+          \HyInfo@AddonList
+          \HyInfo@do{\HyInfo@Key}%
+        }%
+        \kv@parse@normalized{%
+          \HyInfo@Key={#2}%
+        }{%
+          \kv@processor@default{pdfinfo}%
+        }%
+      \fi
+    \else
+      \kv@parse@normalized{%
+        \HyInfo@Key={#2}%
+      }{%
+        \kv@processor@default{pdfinfo}%
+      }%
+    \fi
+  \fi
+}
+\def\HyInfo@GenerateAddons{%
+  \ifHyInfo@AddonUnsupported
+    \def\HyInfo@Addons{}%
+  \else
+    \begingroup
+      \toks@{}%
+      \def\HyInfo@do##1{%
+        \EdefEscapeName\HyInfo@Key{##1}%
+        \edef\x{%
+          \toks@{%
+            \the\toks@
+            /\HyInfo@Key(\csname HyInfo@Value@##1\endcsname)%
+          }%
+        }%
+        \x
+      }%
+      \HyInfo@AddonList
+      \edef\x{\endgroup
+        \def\noexpand\HyInfo@Addons{\the\toks@}%
+      }%
+    \x
+  \fi
+}
+\let\HyInfo@AddonList\ltx@empty
+\define@key{Hyp}{pdfview}{\calculate@pdfview#1 \\}
+\define@key{Hyp}{pdflinkmargin}{\setpdflinkmargin{#1}}
+\let\setpdflinkmargin\@gobble
+\def\calculate@pdfview#1 #2\\{%
+  \def\@pdfview{#1}%
+  \ifx\\#2\\%
+    \def\@pdfviewparams{ -32768}%
+  \else
+    \def\@pdfviewparams{ #2}%
+  \fi
+}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname numexpr\endcsname\relax
+  \def\Hy@number#1{%
+    \expandafter\@firstofone\expandafter{\number#1}%
+  }%
+\else
+  \def\Hy@number#1{%
+    \the\numexpr#1\relax
+  }%
+\fi
+\define@key{Hyp}{pdfstartpage}{%
+  \ifx\\#1\\%
+    \let\@pdfstartpage\ltx@empty
+  \else
+    \edef\@pdfstartpage{\Hy@number{#1}}%
+  \fi
+}%
+\define@key{Hyp}{pdfstartview}{%
+  \ifx\\#1\\%
+    \let\@pdfstartview\ltx@empty
+  \else
+    \hypercalcbpdef\@pdfstartview{/#1}%
+  \fi
+}
+\def\HyPat@NonNegativeReal/{%
+  \ *([0-9]+\.?[0-9]*|[0-9]*\.?[0-9]+) *%
+}
+\define@key{Hyp}{pdfremotestartview}{%
+  \ifx\\#1\\%
+    \def\@pdfremotestartview{/Fit}%
+  \else
+    \hypercalcbpdef\@pdfremotestartview{#1}%
+    \edef\@pdfremotestartview{\@pdfremotestartview}%
+    \Hy@Match\@pdfremotestartview{%
+      ^(XYZ -?(null|\HyPat@NonNegativeReal/) %
+            -?(null|\HyPat@NonNegativeReal/) %
+            (null|\HyPat@NonNegativeReal/)|%
+        Fit(|B|%
+         (H|V|BH|BV) (null|\HyPat@NonNegativeReal/)|%
+         R \HyPat@NonNegativeReal/ \HyPat@NonNegativeReal/ %
+           \HyPat@NonNegativeReal/ \HyPat@NonNegativeReal/%
+      ))$%
+    }{}{%
+      \Hy@Warning{%
+         Invalid value `\@pdfremotestartview'\MessageBreak
+         of `pdfremotestartview'\MessageBreak
+         is replaced by `Fit'%
+      }%
+      \let\@pdfremotestartview\@empty
+    }%
+    \ifx\@pdfremotestartview\@empty
+      \def\@pdfremotestartview{/Fit}%
+    \else
+      \edef\@pdfremotestartview{/\@pdfremotestartview}%
+    \fi
+  \fi
+}
+\define@key{Hyp}{pdfpagescrop}{\edef\@pdfpagescrop{#1}}
+\define@key{Hyp}{pdftoolbar}[true]{%
+  \Hy@boolkey{pdftoolbar}{#1}%
+}
+\define@key{Hyp}{pdfmenubar}[true]{%
+  \Hy@boolkey{pdfmenubar}{#1}%
+}
+\define@key{Hyp}{pdfwindowui}[true]{%
+  \Hy@boolkey{pdfwindowui}{#1}%
+}
+\define@key{Hyp}{pdffitwindow}[true]{%
+  \Hy@boolkey{pdffitwindow}{#1}%
+}
+\define@key{Hyp}{pdfcenterwindow}[true]{%
+  \Hy@boolkey{pdfcenterwindow}{#1}%
+}
+\define@key{Hyp}{pdfdisplaydoctitle}[true]{%
+  \Hy@boolkey{pdfdisplaydoctitle}{#1}%
+}
+\define@key{Hyp}{pdfa}[true]{%
+  \Hy@boolkey{pdfa}{#1}%
+}
+\define@key{Hyp}{pdfnewwindow}[true]{%
+  \def\Hy@temp{#1}%
+  \ifx\Hy@temp\@empty
+    \Hy@pdfnewwindowsetfalse
+  \else
+    \Hy@pdfnewwindowsettrue
+    \Hy@boolkey{pdfnewwindow}{#1}%
+  \fi
+}
+\def\Hy@SetNewWindow{%
+  \ifHy@pdfnewwindowset
+    /NewWindow %
+    \ifHy@pdfnewwindow true\else false\fi
+  \fi
+}
+\Hy@DefNameKey{pdfpagelayout}{%
+  \do{SinglePage}{}%
+  \do{OneColumn}{}%
+  \do{TwoColumnLeft}{}%
+  \do{TwoColumnRight}{}%
+  \do{TwoPageLeft}{PDF 1.5}%
+  \do{TwoPageRight}{PDF 1.5}%
+}
+\define@key{Hyp}{pdflang}{%
+  \def\@pdflang{#1}%
+}
+\define@key{Hyp}{pdfpagelabels}[true]{%
+  \Hy@boolkey{pdfpagelabels}{#1}%
+}
+\define@key{Hyp}{pdfescapeform}[true]{%
+  \Hy@boolkey{pdfescapeform}{#1}%
+}
+\def\@linkbordercolor{1 0 0}
+\def\@urlbordercolor{0 1 1}
+\def\@menubordercolor{1 0 0}
+\def\@filebordercolor{0 .5 .5}
+\def\@runbordercolor{0 .7 .7}
+\def\@citebordercolor{0 1 0}
+\def\@pdfhighlight{/I}
+\let\@pdftitle\ltx@empty
+\let\@pdfauthor\ltx@empty
+\let\@pdfproducer\relax
+\def\@pdfcreator{LaTeX with hyperref package}
+\let\@pdfcreationdate\ltx@empty
+\let\@pdfmoddate\ltx@empty
+\let\@pdfsubject\ltx@empty
+\let\@pdfkeywords\ltx@empty
+\let\@pdftrapped\ltx@empty
+\let\@pdfpagescrop\ltx@empty
+\def\@pdfstartview{/Fit}
+\def\@pdfremotestartview{/Fit}
+\def\@pdfstartpage{1}
+\let\@pdfprintpagerange\ltx@empty
+\let\@pdflang\ltx@empty
+\let\PDF@SetupDoc\@empty
+\let\PDF@FinishDoc\@empty
+\let\phantomsection\@empty
+\let\special@paper\@empty
+\def\HyperDestNameFilter#1{#1}
+\Hy@AtBeginDocument{%
+  \begingroup
+    \edef\x{\@ifundefined{stockheight}\paperheight\stockheight}%
+    \dimen@=\x\relax
+    \ifdim\dimen@>\z@
+    \else
+      \dimen@=11in\relax
+      \Hy@WarningNoLine{%
+        Height of page (\expandafter\string\x) %
+        is invalid (\the\x),\MessageBreak
+        using 11in%
+      }%
+    \fi
+    \dimen@=0.99626401\dimen@
+    \xdef\Hy@pageheight{\strip@pt\dimen@}%
+  \endgroup
+}
+\def\HyInd@EncapChar{\|}
+\let\hyper@normalise\ExecuteOptions
+\let\ExecuteOptions\hypersetup
+\Hy@RestoreCatcodes
+\InputIfFileExists{hyperref.cfg}{}{}
+\Hy@SetCatcodes
+\let\ExecuteOptions\hyper@normalise
+\ifx\Hy@MaybeStopNow\relax
+\else
+  \Hy@stoppedearlytrue
+  \expandafter\Hy@MaybeStopNow
+\fi
+\Hy@stoppedearlyfalse
+\SetupKeyvalOptions{family=Hyp}
+\DeclareLocalOptions{%
+  a4paper,a5paper,b5paper,letterpaper,legalpaper,executivepaper%
+}
+\@ifpackageloaded{tex4ht}{%
+  \@ifpackagewith{hyperref}{tex4ht}{}{%
+    \PassOptionsToPackage{tex4ht}{hyperref}%
+  }%
+}{}
+\let\ReadBookmarks\relax
+\ProcessKeyvalOptions{Hyp}
+\def\Hy@xspace@end{}
+\ltx@IfUndefined{xspaceaddexceptions}{%
+  \Hy@AtBeginDocument{%
+    \ltx@IfUndefined{xspaceaddexceptions}{%
+    }{%
+      \def\Hy@xspace@end{%
+        \ltx@gobble{end for xspace}%
+      }%
+      \xspaceaddexceptions{\Hy@xspace@end,\hyper@linkend,\hyper@anchorend}%
+    }%
+  }%
+}{%
+  \def\Hy@xspace@end{%
+    \ltx@gobble{end for xspace}%
+  }%
+  \xspaceaddexceptions{\Hy@xspace@end,\hyper@linkend,\hyper@anchorend}%
+}
+\Hy@AtBeginDocument{%
+  \ifHy@draft
+    \let\hyper@@anchor\@gobble
+    \gdef\hyper@link#1#2#3{#3\Hy@xspace@end}%
+    \def\hyper@anchorstart#1#2{#2\Hy@xspace@end}%
+    \def\hyper@anchorend{\Hy@xspace@end}%
+    \let\hyper@linkstart\@gobbletwo
+    \def\hyper@linkend{\Hy@xspace@end}%
+    \def\hyper@linkurl#1#2{#1\Hy@xspace@end}%
+    \def\hyper@linkfile#1#2#3{#1\Hy@xspace@end}%
+    \def\hyper@link@[#1]#2#3#4{#4\Hy@xspace@end}%
+    \def\Acrobatmenu#1#2{\leavevmode#2\Hy@xspace@end}%
+    \let\PDF@SetupDoc\@empty
+    \let\PDF@FinishDoc\@empty
+    \let\@fifthoffive\@secondoftwo
+    \let\@secondoffive\@secondoftwo
+    \let\ReadBookmarks\relax
+    \let\WriteBookmarks\relax
+    \Hy@WarningNoLine{Draft mode on}%
+  \fi
+  \Hy@DisableOption{draft}%
+  \Hy@DisableOption{nolinks}%
+  \Hy@DisableOption{final}%
+}
+\Hy@DisableOption{pdfa}
+\ifHy@pdfa
+  \kvsetkeys{Hyp}{pdfversion=1.4}%
+  \def\Hy@Acrobatmenu#1#2{%
+    \leavevmode
+    \begingroup
+      \edef\x{#1}%
+      \@onelevel@sanitize\x
+      \ifx\x\Hy@NextPage
+        \let\y=Y%
+      \else
+        \ifx\x\Hy@PrevPage
+          \let\y=Y%
+        \else
+          \ifx\x\Hy@FirstPage
+            \let\y=Y%
+          \else
+            \ifx\x\Hy@LastPage
+              \let\y=Y%
+            \else
+              \let\y=N%
+            \fi
+          \fi
+        \fi
+      \fi
+    \expandafter\endgroup
+    \ifx\y Y%
+    \else
+      \Hy@Error{%
+        PDF/A: Named action `#1' is not permitted%
+      }\@ehc
+      {#2}%
+      \expandafter\@gobble
+    \fi
+  }%
+  \def\Hy@temp#1{%
+    \expandafter\def\csname Hy@#1\endcsname{#1}%
+    \expandafter\@onelevel@sanitize\csname Hy@#1\endcsname
+  }%
+  \Hy@temp{NextPage}%
+  \Hy@temp{PrevPage}%
+  \Hy@temp{FirstPage}%
+  \Hy@temp{LastPage}%
+\else
+  \def\Hy@Acrobatmenu#1#2{\leavevmode}%
+\fi
+\Hy@nextfalse
+\ltx@IfUndefined{spanish@sh@"@sel}{}{\Hy@nexttrue}
+\ltx@IfUndefined{galician@sh@"@sel}{}{\Hy@nexttrue}
+\ltx@IfUndefined{estonian@sh@"@sel}{}{\Hy@nexttrue}
+\ifHy@next
+  \let\texttilde\~%
+\fi
+\def\Hy@wrapper@babel#1#2{%
+  \begingroup
+    \Hy@safe@activestrue
+    \set@display@protect
+    \edef\x{#2}%
+    \@onelevel@sanitize\x
+    \toks@{#1}%
+    \edef\x{\endgroup\the\toks@{\x}}%
+  \x
+}
+\def\Hy@WrapperDef#1{%
+  \begingroup
+    \escapechar=\m@ne
+    \xdef\Hy@gtemp{%
+      \expandafter\noexpand\csname HyWrap@\string#1\endcsname
+    }%
+  \endgroup
+  \edef#1{%
+    \noexpand\Hy@wrapper@babel
+    \expandafter\noexpand\Hy@gtemp
+  }%
+  \expandafter\def\Hy@gtemp
+}
+\ifHy@hyperfigures
+  \Hy@Info{Hyper figures ON}%
+\else
+  \Hy@Info{Hyper figures OFF}%
+\fi
+\ifHy@nesting
+  \Hy@Info{Link nesting ON}%
+\else
+  \Hy@Info{Link nesting OFF}%
+\fi
+\ifHy@hyperindex
+  \Hy@Info{Hyper index ON}%
+\else
+  \Hy@Info{Hyper index OFF}%
+\fi
+\ifHy@plainpages
+  \Hy@Info{Plain pages ON}%
+\else
+  \Hy@Info{Plain pages OFF}%
+\fi
+\ifHy@backref
+  \Hy@Info{Backreferencing ON}%
+\else
+  \Hy@Info{Backreferencing OFF}%
+\fi
+\ifHy@typexml
+  \Hy@AtEndOfPackage{%
+    \RequirePackage{color}%
+    \RequirePackage{nameref}%
+  }%
+\fi
+\Hy@DisableOption{typexml}
+\ifHy@implicit
+  \Hy@InfoNoLine{Implicit mode ON; LaTeX internals redefined}%
+\else
+  \Hy@InfoNoLine{Implicit mode OFF; no redefinition of LaTeX internals}%
+  \def\MaybeStopEarly{%
+    \Hy@Message{Stopped early}%
+    \Hy@AtBeginDocument{%
+      \PDF@FinishDoc
+      \gdef\PDF@FinishDoc{}%
+    }%
+    \endinput
+  }%
+  \Hy@AtBeginDocument{%
+    \let\autoref\ref
+    \let\autopageref\pageref
+    \ifx\@pdfpagemode\@empty
+      \gdef\@pdfpagemode{UseNone}%
+    \fi
+    \global\Hy@backreffalse
+  }%
+  \Hy@AtEndOfPackage{%
+    \global\let\ReadBookmarks\relax
+    \global\let\WriteBookmarks\relax
+  }%
+\fi
+\Hy@DisableOption{implicit}
+\Hy@AtEndOfPackage{%
+  \@ifpackageloaded{tex4ht}{%
+    \def\Hy@driver{htex4ht}%
+    \Hy@texhttrue
+  }{}%
+  \ifx\Hy@driver\@empty
+  \else
+    \def\Hy@temp{hpdftex}%
+    \ifpdf
+      \ifx\Hy@driver\Hy@temp
+      \else
+        \Hy@WarningNoLine{%
+          Wrong driver `\Hy@driver.def';\MessageBreak
+          pdfTeX is running in PDF mode.\MessageBreak
+          Forcing driver `\Hy@temp.def'%
+        }%
+        \let\Hy@driver\Hy@temp
+      \fi
+    \else
+      \ifx\Hy@driver\Hy@temp
+        \Hy@WarningNoLine{%
+          Wrong driver `\Hy@driver.def';\MessageBreak
+          pdfTeX is not running in PDF mode.\MessageBreak
+          Using default driver%
+        }%
+        \let\Hy@driver\@empty
+      \fi
+    \fi
+  \fi
+  \ifHy@texht
+  \else
+    \ifx\Hy@driver\@empty
+    \else
+      \def\Hy@temp{hxetex}%
+      \ifxetex
+        \ifx\Hy@driver\Hy@temp
+        \else
+          \Hy@WarningNoLine{%
+            Wrong driver `\Hy@driver.def';\MessageBreak
+            XeTeX is running.\MessageBreak
+            Forcing driver `\Hy@temp.def' for XeTeX%
+          }%
+          \let\Hy@driver\Hy@temp
+        \fi
+      \fi
+    \fi
+  \fi
+  \ifx\Hy@driver\@empty
+  \else
+    \def\Hy@temp{hvtexhtm}%
+    \ifvtexhtml
+      \ifx\Hy@driver\Hy@temp
+      \else
+        \Hy@WarningNoLine{%
+          Wrong driver `\Hy@driver.def';\MessageBreak
+          VTeX is running in HTML mode.\MessageBreak
+          Forcing driver `\Hy@temp.def'%
+        }%
+        \let\Hy@driver\Hy@temp
+      \fi
+    \else
+      \ifx\Hy@driver\Hy@temp
+        \Hy@WarningNoLine{%
+          Wrong driver `\Hy@driver.def';\MessageBreak
+          VTeX is not running in HTML mode.\MessageBreak
+          Using default driver%
+        }%
+        \let\Hy@driver\@empty
+      \fi
+    \fi
+  \fi
+  \def\HyOpt@DriverType{}%
+  \ifx\Hy@driver\@empty
+    \def\HyOpt@DriverType{ (autodetected)}%
+    \providecommand*{\Hy@defaultdriver}{hypertex}%
+    \ifpdf
+      \def\Hy@driver{hpdftex}%
+    \else
+      \ifxetex
+        \def\Hy@driver{hxetex}%
+      \else
+        \ifvtexhtml
+          \def\Hy@driver{hvtexhtm}%
+          \def\MaybeStopEarly{%
+            \Hy@Message{Stopped early}%
+            \Hy@AtBeginDocument{%
+              \PDF@FinishDoc
+              \gdef\PDF@FinishDoc{}%
+            }%
+            \endinput
+          }%
+        \else
+          \ifvtexpdf
+            \def\Hy@driver{hvtex}%
+          \else
+            \ifvtexps
+              \def\Hy@driver{hvtex}%
+            \else
+              \ifx\HyOpt@DriverFallback\ltx@empty
+                \let\Hy@driver\Hy@defaultdriver
+                \def\HyOpt@DriverType{ (default)}%
+              \else
+                \begingroup
+                  \toks@\expandafter{\HyOpt@DriverFallback}%
+                  \edef\x{\endgroup
+                    \noexpand\kvsetkeys{Hyp}{\the\toks@}%
+                  }%
+                \x
+                \ifx\Hy@driver\ltx@empty
+                  \let\Hy@driver\Hy@defaultdriver
+                  \def\HyOpt@DriverType{ (default)}%
+                \else
+                  \def\HyOpt@DriverType{ (fallback)}%
+                \fi
+              \fi
+            \fi
+          \fi
+        \fi
+      \fi
+    \fi
+    \ifx\Hy@driver\Hy@defaultdriver
+      \def\Hy@temp{hdviwind}%
+      \ifx\Hy@temp\Hy@driver
+        \kvsetkeys{Hyp}{colorlinks}%
+        \PassOptionsToPackage{dviwindo}{color}%
+      \fi
+    \fi
+  \fi
+  \Hy@Message{Driver\HyOpt@DriverType: \Hy@driver}%
+  \chardef\Hy@VersionChecked=0 %
+  \input{\Hy@driver.def}%
+  \ifcase\Hy@VersionChecked
+    \Hy@VersionCheck{\Hy@driver.def}%
+  \fi
+  \let\@unprocessedoptions\relax
+  \Hy@RestoreCatcodes
+  \Hy@DisableOption{tex4ht}%
+  \Hy@DisableOption{pdftex}%
+  \Hy@DisableOption{nativepdf}%
+  \Hy@DisableOption{dvipdfm}%
+  \Hy@DisableOption{dvipdfmx}%
+  \Hy@DisableOption{dvipdfmx-outline-open}%
+  \Hy@DisableOption{pdfmark}%
+  \Hy@DisableOption{dvips}%
+  \Hy@DisableOption{hypertex}%
+  \Hy@DisableOption{vtex}%
+  \Hy@DisableOption{vtexpdfmark}%
+  \Hy@DisableOption{dviwindo}%
+  \Hy@DisableOption{dvipsone}%
+  \Hy@DisableOption{textures}%
+  \Hy@DisableOption{latex2html}%
+  \Hy@DisableOption{ps2pdf}%
+  \Hy@DisableOption{xetex}%
+  \Hy@DisableOption{pdfversion}%
+}
+\newif\ifHy@DvipdfmxOutlineOpen
+\ifxetex
+  \ifdim\number\XeTeXversion\XeTeXrevision in<0.9995in %
+  \else
+    \chardef\SpecialDvipdfmxOutlineOpen\@ne
+    \Hy@DvipdfmxOutlineOpentrue
+  \fi
+\fi
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname SpecialDvipdfmxOutlineOpen\endcsname\relax
+\else
+  \ifnum\SpecialDvipdfmxOutlineOpen>\z@
+    \Hy@DvipdfmxOutlineOpentrue
+  \fi
+\fi
+\def\WriteBookmarks{0}
+\def\@bookmarkopenstatus#1{%
+  \ifHy@bookmarksopen
+    \ifnum#1<\expandafter\@firstofone\expandafter
+             {\number\@bookmarksopenlevel} % explicit space
+    \else
+      -%
+    \fi
+  \else
+    -%
+  \fi
+}
+\ifHy@bookmarks
+  \Hy@Info{Bookmarks ON}%
+  \ifx\@pdfpagemode\@empty
+    \def\@pdfpagemode{UseOutlines}%
+  \fi
+\else
+  \let\@bookmarkopenstatus\ltx@gobble
+  \Hy@Info{Bookmarks OFF}%
+  \Hy@AtEndOfPackage{%
+    \global\let\ReadBookmarks\relax
+    \global\let\WriteBookmarks\relax
+  }%
+  \ifx\@pdfpagemode\@empty
+    \def\@pdfpagemode{UseNone}%
+  \fi
+\fi
+\Hy@DisableOption{bookmarks}
+\def\Hy@CatcodeWrapper#1{%
+  \let\Hy@EndWrap\ltx@empty
+  \def\TMP@EnsureCode##1##2{%
+    \edef\Hy@EndWrap{%
+      \Hy@EndWrap
+      \catcode##1 \the\catcode##1\relax
+    }%
+    \catcode##1 ##2\relax
+  }%
+  \TMP@EnsureCode{10}{12}% ^^J
+  \TMP@EnsureCode{33}{12}% !
+  \TMP@EnsureCode{34}{12}% "
+  \TMP@EnsureCode{36}{3}% $ (math)
+  \TMP@EnsureCode{38}{4}% & (alignment)
+  \TMP@EnsureCode{39}{12}% '
+  \TMP@EnsureCode{40}{12}% (
+  \TMP@EnsureCode{41}{12}% )
+  \TMP@EnsureCode{42}{12}% *
+  \TMP@EnsureCode{43}{12}% +
+  \TMP@EnsureCode{44}{12}% ,
+  \TMP@EnsureCode{45}{12}% -
+  \TMP@EnsureCode{46}{12}% .
+  \TMP@EnsureCode{47}{12}% /
+  \TMP@EnsureCode{58}{12}% :
+  \TMP@EnsureCode{59}{12}% ;
+  \TMP@EnsureCode{60}{12}% <
+  \TMP@EnsureCode{61}{12}% =
+  \TMP@EnsureCode{62}{12}% >
+  \TMP@EnsureCode{63}{12}% ?
+  \TMP@EnsureCode{91}{12}% [
+  \TMP@EnsureCode{93}{12}% ]
+  \TMP@EnsureCode{94}{7}% ^ (superscript)
+  \TMP@EnsureCode{95}{8}% _ (subscript)
+  \TMP@EnsureCode{96}{12}% `
+  \TMP@EnsureCode{124}{12}% |
+  \TMP@EnsureCode{126}{13}% ~ (active)
+  #1\relax
+  \Hy@EndWrap
+}
+\Hy@AtBeginDocument{%
+  \ifHy@ocgcolorlinks
+    \kvsetkeys{Hyp}{colorlinks}%
+    \ifHy@pdfa
+      \Hy@Warning{%
+        PDF/A: Optional Content Groups are prohibited,\MessageBreak
+        using `colorlinks' instead of `ocgcolorlinks'%
+      }%
+      \Hy@ocgcolorlinksfalse
+    \fi
+  \fi
+  \ifHy@ocgcolorlinks
+  \else
+    \Hy@DisableOption{ocgcolorlinks}%
+  \fi
+  \ifHy@colorlinks
+    \def\@pdfborder{0 0 0}%
+    \let\@pdfborderstyle\@empty
+    \ifHy@typexml
+    \else
+      \Hy@CatcodeWrapper{%
+        \RequirePackage{color}%
+      }%
+    \fi
+    \def\Hy@colorlink#1{%
+      \begingroup
+      \HyColor@UseColor#1%
+    }%
+    \def\Hy@endcolorlink{\endgroup}%
+    \Hy@Info{Link coloring ON}%
+  \else
+    \ifHy@frenchlinks
+      \def\Hy@colorlink#1{\begingroup\fontshape{sc}\selectfont}%
+      \def\Hy@endcolorlink{\endgroup}%
+      \Hy@Info{French linking ON}%
+    \else
+      \def\Hy@colorlink#1{\begingroup}%
+      \def\Hy@endcolorlink{\endgroup}%
+      \Hy@Info{Link coloring OFF}%
+    \fi
+  \fi
+  \Hy@DisableOption{colorlinks}%
+  \Hy@DisableOption{frenchlinks}%
+  \ifHy@texht
+    \long\def\@firstoffive#1#2#3#4#5{#1}%
+    \long\def\@secondoffive#1#2#3#4#5{#2}%
+    \long\def\@thirdoffive#1#2#3#4#5{#3}%
+    \long\def\@fourthoffive#1#2#3#4#5{#4}%
+    \long\def\@fifthoffive#1#2#3#4#5{#5}%
+    \providecommand*\@safe@activestrue{}%
+    \providecommand*\@safe@activesfalse{}%
+    \def\T@ref#1{%
+      \Hy@safe@activestrue
+      \expandafter\@setref\csname r@#1\endcsname\@firstoffive{#1}%
+      \Hy@safe@activesfalse
+    }%
+    \def\T@pageref#1{%
+      \Hy@safe@activestrue
+      \expandafter\@setref\csname r@#1\endcsname\@secondoffive{#1}%
+      \Hy@safe@activesfalse
+    }%
+  \else
+    \ifHy@typexml
+    \else
+      \Hy@CatcodeWrapper{%
+        \RequirePackage{nameref}%
+      }%
+    \fi
+  \fi
+  \DeclareRobustCommand\ref{%
+    \@ifstar\@refstar\T@ref
+  }%
+  \DeclareRobustCommand\pageref{%
+    \@ifstar\@pagerefstar\T@pageref
+  }%
+    \DeclareRobustCommand*{\nameref}{%
+      \@ifstar\@namerefstar\T@nameref
+    }%
+}
+\Hy@AtBeginDocument{%
+  \ifHy@texht
+  \else
+    \Hy@CatcodeWrapper\ReadBookmarks
+  \fi
+}
+\ifHy@backref
+  \RequirePackage{backref}%
+\else
+  \let\Hy@backout\@gobble
+\fi
+\Hy@DisableOption{backref}
+\Hy@DisableOption{pagebackref}
+\Hy@activeanchorfalse
+\begingroup
+  \endlinechar=-1 %
+  \catcode`\^^A=14 %
+  \catcode`\^^M\active
+  \catcode`\%\active
+  \catcode`\#\active
+  \catcode`\_\active
+  \catcode`\$\active
+  \catcode`\&\active
+  \gdef\hyper@normalise{^^A
+    \begingroup
+    \catcode`\^^M\active
+    \def^^M{ }^^A
+    \catcode`\%\active
+    \let%\@percentchar
+    \let\%\@percentchar
+    \catcode`\#\active
+    \def#{\hyper@hash}^^A
+    \def\#{\hyper@hash}^^A
+    \@makeother\&^^A
+    \edef&{\string&}^^A
+    \edef\&{\string&}^^A
+    \edef\textunderscore{\string_}^^A
+    \let\_\textunderscore
+    \catcode`\_\active
+    \let_\textunderscore
+    \let~\hyper@tilde
+    \let\~\hyper@tilde
+    \let\textasciitilde\hyper@tilde
+    \let\\\@backslashchar
+    \edef${\string$}^^A
+    \Hy@safe@activestrue
+    \hyper@n@rmalise
+  }^^A
+  \catcode`\#=6 ^^A
+  \gdef\Hy@ActiveCarriageReturn{^^M}^^A
+  \gdef\hyper@n@rmalise#1#2{^^A
+    \def\Hy@tempa{#2}^^A
+    \ifx\Hy@tempa\Hy@ActiveCarriageReturn
+      \ltx@ReturnAfterElseFi{^^A
+        \hyper@@normalise{#1}^^A
+      }^^A
+    \else
+      \ltx@ReturnAfterFi{^^A
+        \hyper@@normalise{#1}{#2}^^A
+      }^^A
+    \fi
+  }^^A
+  \gdef\hyper@@normalise#1#2{^^A
+    \edef\Hy@tempa{^^A
+      \endgroup
+      \noexpand#1{\Hy@RemovePercentCr#2%^^M\@nil}^^A
+    }^^A
+    \Hy@tempa
+  }^^A
+  \gdef\Hy@RemovePercentCr#1%^^M#2\@nil{^^A
+    #1^^A
+    \ifx\limits#2\limits
+    \else
+      \ltx@ReturnAfterFi{^^A
+        \Hy@RemovePercentCr #2\@nil
+      }^^A
+    \fi
+  }^^A
+\endgroup
+\providecommand*\hyper@chars{%
+  \let\#\hyper@hash
+  \let\%\@percentchar
+  \Hy@safe@activestrue
+}
+\def\hyperlink#1#2{%
+  \hyper@@link{}{#1}{#2}%
+}
+\def\Hy@VerboseLinkStart#1#2{%
+  \ifHy@verbose
+    \begingroup
+      \Hy@safe@activestrue
+      \xdef\Hy@VerboseGlobalTemp{(#1) `#2'}%
+      \Hy@Info{Reference \Hy@VerboseGlobalTemp}%
+      \xdef\Hy@VerboseGlobalTemp{%
+        \Hy@VerboseGlobalTemp, %
+        line \the\inputlineno
+      }%
+    \endgroup
+    \let\Hy@VerboseLinkInfo\Hy@VerboseGlobalTemp
+    \@onelevel@sanitize\Hy@VerboseLinkInfo
+  \fi
+}
+\def\Hy@VerboseLinkInfo{<VerboseLinkInfo>}
+\def\Hy@VerboseLinkStop{%
+  \ifHy@verbose
+    \begingroup
+      \edef\x{\endgroup
+        \write\m@ne{%
+          Package `hyperref' Info: %
+          End of reference \Hy@VerboseLinkInfo.%
+        }%
+      }%
+    \x
+  \fi
+}
+\def\Hy@VerboseAnchor#1{%
+  \ifHy@verbose
+    \begingroup
+      \Hy@safe@activestrue
+      \Hy@Info{Anchor `\HyperDestNameFilter{#1}'}%
+    \endgroup
+  \fi
+}
+\def\Hy@AllowHyphens{%
+  \relax
+  \ifhmode
+    \penalty\@M
+    \hskip\z@skip
+  \fi
+}
+\DeclareRobustCommand*{\href}[1][]{%
+  \begingroup
+  \setkeys{href}{#1}%
+  \@ifnextchar\bgroup\Hy@href{\hyper@normalise\href@}%
+}
+\def\Hy@href#{%
+  \hyper@normalise\href@
+}
+\begingroup
+  \catcode`\$=6 %
+  \catcode`\#=12 %
+  \gdef\href@$1{\expandafter\href@split$1##\\}%
+  \gdef\href@split$1#$2#$3\\$4{%
+    \hyper@@link{$1}{$2}{$4}%
+    \endgroup
+  }%
+\endgroup
+\define@key{href}{page}{%
+  \def\Hy@href@page{#1}%
+}
+\let\Hy@href@page\@empty
+\newcount\c@Hy@tempcnt
+\def\theHy@tempcnt{\the\c@Hy@tempcnt}
+\def\Hy@MakeRemoteAction{%
+  \ifx\Hy@href@page\@empty
+    \def\Hy@href@page{0}%
+  \else
+    \setcounter{Hy@tempcnt}{\Hy@href@page}%
+    \ifnum\c@Hy@tempcnt<\@ne
+      \Hy@Warning{%
+        Invalid page number (\theHy@tempcnt)\MessageBreak
+        for remote PDF file.\MessageBreak
+        Using page 1%
+      }%
+      \def\Hy@href@page{0}%
+    \else
+      \global\advance\c@Hy@tempcnt\m@ne
+      \edef\Hy@href@page{\theHy@tempcnt}%
+    \fi
+  \fi
+  \ifx\Hy@href@nextactionraw\@empty
+  \else
+    \Hy@pdfnewwindowsettrue
+    \Hy@pdfnewwindowtrue
+  \fi
+}
+\define@key{href}{pdfremotestartview}{%
+  \setkeys{Hyp}{pdfremotestartview={#1}}%
+}
+\let\KV@href@pdfnewwindow\KV@Hyp@pdfnewwindow
+\let\KV@href@pdfnewwindow@default\KV@Hyp@pdfnewwindow@default
+\newif\ifHy@href@ismap
+\define@key{href}{ismap}[true]{%
+  \ltx@IfUndefined{Hy@href@ismap#1}{%
+    \Hy@Error{%
+      Invalid value (#1) for key `ismap'.\MessageBreak
+      Permitted values are `true' or `false'.\MessageBreak
+      Ignoring `ismap'%
+    }\@ehc
+  }{%
+    \csname Hy@href@ismap#1\endcsname
+  }%
+}
+\let\Hy@href@nextactionraw\@empty
+\define@key{href}{nextactionraw}{%
+  \edef\Hy@href@nextactionraw{#1}%
+  \ifx\Hy@href@nextactionraw\@empty
+  \else
+    \Hy@Match\Hy@href@nextactionraw{%
+      ^(\HyPat@ObjRef/|<<.*/S[ /].+>>|%
+       \[( ?\HyPat@ObjRef/|<<.*/S[ /].+>>)+ ?])$%
+    }{}{%
+      \Hy@Warning{Invalid value for `nextactionraw':\MessageBreak
+        \Hy@href@nextactionraw\MessageBreak
+        The action is discarded%
+      }%
+    }%
+    \ifx\Hy@href@nextactionraw\@empty
+    \else
+      \edef\Hy@href@nextactionraw{/Next \Hy@href@nextactionraw}%
+    \fi
+  \fi
+}
+\def\HyPat@ObjRef/{.+}
+\RequirePackage{url}
+\let\HyOrg@url\url
+\def\Hurl{\begingroup \Url}
+\DeclareRobustCommand*{\nolinkurl}{\hyper@normalise\nolinkurl@}
+\def\nolinkurl@#1{\Hurl{#1}}
+\DeclareRobustCommand*{\url}{\hyper@normalise\url@}
+\def\url@#1{\hyper@linkurl{\Hurl{#1}}{#1}}
+\DeclareRobustCommand*{\hyperimage}{\hyper@normalise\hyper@image}
+\providecommand\hyper@image[2]{#2}
+\def\hypertarget#1#2{%
+  \ifHy@nesting
+    \hyper@@anchor{#1}{#2}%
+  \else
+    \hyper@@anchor{#1}{\relax}#2%
+  \fi
+}
+\DeclareRobustCommand*{\hyperref}{%
+  \@ifnextchar[{\Hy@babelnormalise\label@hyperref}\@hyperref
+}
+\def\Hy@babelnormalise#1[#2]{%
+  \begingroup
+    \Hy@safe@activestrue
+    \edef\Hy@tempa{%
+      \endgroup
+      \noexpand#1[{#2}]%
+    }%
+  \Hy@tempa
+}
+\def\@hyperref{\hyper@normalise\@@hyperref}
+\def\@@hyperref#1#2#3{%
+  \edef\ref@one{\ifx\\#2\\\else#2.\fi#3}%
+  \expandafter\tryhyper@link\ref@one\\{#1}%
+}
+\def\tryhyper@link#1\\#2{%
+  \hyper@@link{#2}{#1}%
+}
+\def\hyperdef{\@ifnextchar[{\label@hyperdef}{\@hyperdef}}
+\def\@hyperdef#1#2#3{%, category, name, text
+  \ifx\\#1\\%
+    \def\Hy@AnchorName{#2}%
+  \else
+    \def\Hy@AnchorName{#1.#2}%
+  \fi
+  \ifHy@nesting
+    \expandafter\hyper@@anchor\expandafter{\Hy@AnchorName}{#3}%
+  \else
+    \expandafter\hyper@@anchor\expandafter{\Hy@AnchorName}{\relax}#3%
+  \fi
+}
+\def\label@hyperref[#1]{%
+  \expandafter\label@@hyperref\csname r@#1\endcsname{#1}%
+}%
+\def\label@@hyperref#1#2#3{%
+  \ifx#1\relax
+    \protect\G@refundefinedtrue
+    \@latex@warning{%
+      Hyper reference `#2' on page \thepage \space undefined%
+    }%
+    \begingroup
+      #3%
+    \endgroup
+  \else
+    \hyper@@link{\expandafter\@fifthoffive#1}%
+      {\expandafter\@fourthoffive#1\@empty\@empty}{#3}%
+  \fi
+}
+\def\label@hyperdef[#1]#2#3#4{% label name, category, name,
+                                % anchor text
+  \@bsphack
+  \ifx\\#2\\%
+    \def\Hy@AnchorName{#3}%
+  \else
+    \def\Hy@AnchorName{#2.#3}%
+  \fi
+  \if@filesw
+    \protected@write\@auxout{}{%
+      \string\newlabel{#1}{{}{}{}{\Hy@AnchorName}{}}%
+    }%
+  \fi
+  \@esphack
+  \ifHy@nesting
+    \expandafter\hyper@@anchor\expandafter{\Hy@AnchorName}{#4}%
+  \else
+    \expandafter\hyper@@anchor\expandafter{\Hy@AnchorName}{\relax}#4%
+  \fi
+}
+\def\hyper@@link{\let\Hy@reserved@a\relax
+  \@ifnextchar[{\hyper@link@}{\hyper@link@[link]}%
+}
+\def\hyper@link@[#1]#2#3#4{%
+  \begingroup
+    \protected@edef\Hy@tempa{#2}%
+    \Hy@safe@activestrue
+    \edef\x{#3}%
+    \ifx\Hy@tempa\@empty
+      \toks0{\hyper@link{#1}}%
+    \else
+      \toks0{\expandafter\hyper@readexternallink#2\\{#1}}%
+    \fi
+    \toks2{%
+      \Hy@safe@activesfalse
+      #4%
+    }%
+    \edef\Hy@tempa{\the\toks2}%
+    \edef\x{\endgroup
+      \ifx\Hy@tempa\@empty
+        \noexpand\Hy@Warning{Suppressing empty link}%
+      \else
+        \the\toks0 {\x}{\the\toks2}%%
+      \fi
+    }%
+  \x
+}
+\def\hyper@readexternallink#1\\#2#3#4{%
+  \begingroup
+    \let\\\relax
+  \expandafter\endgroup
+  \expandafter\@@hyper@@readexternallink#1\\{#2}{#3}{#4}%
+}
+\def\@@hyper@@readexternallink#1\\#2#3#4{%
+  \@hyper@readexternallink{#2}{#3}{#4}#1::\\{#1}%
+}
+\def\@pdftempwordfile{file}%
+\def\@pdftempwordrun{run}%
+\def\@hyper@readexternallink#1#2#3#4:#5:#6\\#7{%
+  \ifx\\#6\\%
+    \@hyper@linkfile file:#7\\{#3}{#2}{#7}%
+  \else
+    \ifx\\#4\\%
+      \@hyper@linkfile file:#7\\{#3}{#2}{#7}%
+    \else
+      \def\@pdftempa{#4}%
+      \ifx\@pdftempa\@pdftempwordfile
+        \@hyper@linkfile#7\\{#3}{#2}{#7}%
+      \else
+        \ifx\@pdftempa\@pdftempwordrun
+          \ifHy@pdfa
+            \Hy@Error{%
+              PDF/A: Launch action is prohibited%
+            }\@ehc
+            \begingroup
+              \leavevmode
+              #2%
+            \endgroup
+          \else
+            \@hyper@launch#7\\{#3}{#2}%
+          \fi
+        \else
+          \hyper@linkurl{#3}{#7\ifx\\#2\\\else\hyper@hash#2\fi}%
+        \fi
+      \fi
+    \fi
+  \fi
+}
+\def\@hyper@launch run:#1\\#2#3{% filename, anchor text, linkname
+  \hyper@linkurl{#2}{%
+    \Hy@linkfileprefix
+    #1%
+    \ifx\\#3\\%
+    \else
+      \hyper@hash
+      #3%
+    \fi
+  }%
+}
+\def\@hyper@linkfile file:#1\\#2#3#4{%
+     %file url,link string, name, original uri
+  \filename@parse{#1}%
+  \ifx\filename@ext\relax
+    \edef\filename@ext{\XR@ext}%
+  \fi
+  \def\use@file{\filename@area\filename@base.\filename@ext}%
+  \Hy@IfStringEndsWith\filename@ext\XR@ext{%
+    \hyper@linkfile{#2}{\use@file}{#3}%
+  }{%
+    \ifx\@baseurl\@empty
+      \hyper@linkurl{#2}{%
+        #4\ifx\\#3\\\else\hyper@hash#3\fi
+      }%
+    \else
+      \hyper@linkurl{#2}{\use@file\ifx\\#3\\\else\hyper@hash#3\fi}%
+    \fi
+  }%
+}
+\def\Hy@IfStringEndsWith#1#2{%
+  \begingroup
+    \edef\x{#1}%
+    \@onelevel@sanitize\x
+    \edef\x{.\x$}%
+    \edef\y{#2}%
+    \@onelevel@sanitize\y
+    \edef\y{.\y$}%
+    \expandafter\def\expandafter\z\expandafter##\expandafter1\y##2\@nil{%
+      \endgroup
+      \ifx\relax##2\relax
+        \expandafter\ltx@secondoftwo
+      \else
+        \expandafter\ltx@firstoftwo
+      \fi
+    }%
+  \expandafter\expandafter\expandafter\z\expandafter\x\y\@nil
+}
+\def\Hy@StringLocalhost{localhost}
+\@onelevel@sanitize\Hy@StringLocalhost
+\def\Hy@CleanupFile#1{%
+  \edef#1{#1}%
+  \expandafter\Hy@@CleanupFile#1\hbox///\hbox\@nil{#1}%
+}
+\def\Hy@@CleanupFile#1//#2/#3\hbox#4\@nil#5{%
+  \begingroup
+    \toks@{\endgroup}%
+    \def\x{#1}%
+    \ifx\x\@empty
+      \def\x{#2}%
+      \ifx\x\@empty
+        \toks@{\endgroup\def#5{/#3}}%
+      \else
+        \@onelevel@sanitize\x
+        \ifx\x\Hy@StringLocalhost
+          \toks@{\endgroup\def#5{/#3}}%
+        \fi
+      \fi
+    \fi
+  \the\toks@
+}
+\long\def\hyper@@anchor#1#2{\@hyper@@anchor#1\relax#2\relax}
+\long\def\@hyper@@anchor#1\relax#2#3\relax{%
+  \ifx\\#1\\%
+    #2\Hy@Warning{Ignoring empty anchor}%
+  \else
+    \def\anchor@spot{#2#3}%
+    \let\put@me@back\@empty
+    \ifx\relax#2\relax
+    \else
+      \ifHy@nesting
+      \else
+        \ifcat a\noexpand#2\relax
+        \else
+          \ifcat 0\noexpand#2 \relax
+          \else
+            \let\anchor@spot\@empty
+            \def\put@me@back{#2#3}%
+          \fi
+        \fi
+      \fi
+    \fi
+    \ifHy@activeanchor
+      \anchor@spot
+    \else
+      \hyper@anchor{#1}%
+    \fi
+    \expandafter\put@me@back
+  \fi
+  \let\anchor@spot\@empty
+}
+\let\anchor@spot\ltx@empty
+\let\htmladdimg\hyperimage
+\def\htmladdnormallink#1#2{\href{#2}{#1}}
+\def\htmladdnormallinkfoot#1#2{\href{#2}{#1}\footnote{#2}}
+\def\htmlref#1#2{% anchor text, label
+  \label@hyperref[{#2}]{#1}%
+}
+\def\@@latextohtmlX{%
+  \let\hhyperref\hyperref
+  \def\hyperref##1##2##3##4{% anchor text for HTML
+                     % text to print before label in print
+                     % label
+                     % post-label text in print
+    ##2\ref{##4}##3%
+  }%
+}
+\RequirePackage{bitset}
+\def\HyField@NewFlag#1#2{%
+  \lowercase{\HyField@NewOption{#2}}%
+  \lowercase{\HyField@NewBitsetFlag{#2}}{#2}{#1}%
+}
+\def\HyField@NewFlagOnly#1#2{%
+  \lowercase{\HyField@NewBitsetFlag{#2}}{#2}{#1}%
+}
+\def\HyField@NewOption#1{%
+  \expandafter\newif\csname ifFld@#1\endcsname
+  \define@key{Field}{#1}[true]{%
+    \lowercase{\Field@boolkey{##1}}{#1}%
+  }%
+}
+\def\HyField@NewBitsetFlag#1#2#3#4{%
+  \begingroup
+    \count@=#4\relax
+    \advance\count@\m@ne
+    \def\x##1{%
+      \endgroup
+      \expandafter\def\csname HyField@#3@#1\endcsname{##1}%
+      \expandafter\ifx\csname HyField@#3@##1\endcsname\relax
+        \expandafter\edef\csname HyField@#3@##1\endcsname{%
+          (\number#4) #2%
+        }%
+      \else
+        \expandafter\edef\csname HyField@#3@##1\endcsname{%
+          \csname HyField@#3@##1\endcsname
+          /#2%
+        }%
+      \fi
+    }%
+  \expandafter\x\expandafter{\the\count@}%
+}
+\def\HyField@UseFlag#1#2{%
+  \lowercase{\HyField@@UseFlag{#2}}{#1}%
+}
+\def\HyField@@UseFlag#1#2{%
+  \bitsetSetValue{HyField@#2}{%
+    \csname HyField@#2@#1\endcsname
+  }{%
+    \csname ifFld@#1\endcsname 1\else 0\fi
+  }%
+}
+\def\HyField@SetFlag#1#2{%
+  \lowercase{\HyField@@SetFlag{#2}}{#1}%
+}
+\def\HyField@@SetFlag#1#2{%
+  \bitsetSetValue{HyField@#2}{%
+    \csname HyField@#2@#1\endcsname
+  }{1}%
+}
+\def\HyField@PrintFlags#1#2{%
+  \ifHy@verbose
+    \begingroup
+      \let\Hy@temp\@empty
+      \let\MessageBreak\relax
+      \expandafter\@for\expandafter\x\expandafter:\expandafter=%
+      \bitsetGetSetBitList{HyField@#1}\do{%
+        \edef\Hy@temp{%
+          \Hy@temp
+          \csname HyField@#1@\x\endcsname\MessageBreak
+        }%
+      }%
+    \edef\x{\endgroup
+      \noexpand\Hy@Info{%
+        Field flags: %
+          \expandafter\ifx\@car#1\@nil S\else/\fi
+          #1 %
+          \bitsetGetDec{HyField@#1} %
+          (0x\bitsetGetHex{HyField@#1}{32})\MessageBreak
+        \Hy@temp
+        for #2%
+      }%
+    }\x
+  \fi
+}
+\HyField@NewFlag{Ff}{ReadOnly}{1}
+\HyField@NewFlag{Ff}{Required}{2}
+\HyField@NewFlag{Ff}{NoExport}{3}
+\HyField@NewFlag{Ff}{NoToggleToOff}{15}
+\HyField@NewFlag{Ff}{Radio}{16}
+\HyField@NewFlag{Ff}{Pushbutton}{17}
+\HyField@NewFlag{Ff}{RadiosInUnison}{26}
+\HyField@NewFlag{Ff}{Multiline}{13}
+\HyField@NewFlag{Ff}{Password}{14}
+\HyField@NewFlag{Ff}{FileSelect}{21}% PDF 1.4
+\HyField@NewFlag{Ff}{DoNotSpellCheck}{23}% PDF 1.4
+\HyField@NewFlag{Ff}{DoNotScroll}{24}% PDF 1.4
+\HyField@NewFlag{Ff}{Comb}{25}% PDF 1.4
+\HyField@NewFlag{Ff}{RichText}{26}% PDF 1.5
+\HyField@NewFlag{Ff}{Combo}{18}
+\HyField@NewFlag{Ff}{Edit}{19}
+\HyField@NewFlag{Ff}{Sort}{20}
+\HyField@NewFlag{Ff}{MultiSelect}{22}% PDF 1.4
+\HyField@NewFlag{Ff}{CommitOnSelChange}{27}% PDF 1.5
+\newif\ifFld@popdown
+\define@key{Field}{popdown}[true]{%
+  \lowercase{\Field@boolkey{#1}}{popdown}%
+}
+\HyField@NewFlag{F}{Invisible}{1}
+\HyField@NewFlag{F}{Hidden}{2}% PDF 1.2
+\HyField@NewFlag{F}{Print}{3}% PDF 1.2
+\HyField@NewFlag{F}{NoZoom}{4}% PDF 1.2
+\HyField@NewFlag{F}{NoRotate}{5}% PDF 1.3
+\HyField@NewFlag{F}{NoView}{6}% PDF 1.3
+\HyField@NewFlag{F}{Locked}{8}% PDF 1.4
+\HyField@NewFlag{F}{ToggleNoView}{9}% PDF 1.5
+\HyField@NewFlag{F}{LockedContents}{10}% PDF 1.7
+\ifHy@pdfa
+  \def\HyField@PDFAFlagWarning#1#2{%
+    \Hy@Warning{%
+      PDF/A: Annotation flag `#1' must\MessageBreak
+      be set to `#2'%
+    }%
+  }%
+  \Fld@invisiblefalse
+  \def\Fld@invisibletrue{%
+    \HyField@PDFAFlagWarning{invisible}{false}%
+  }%
+  \Fld@hiddenfalse
+  \def\Fld@hiddentrue{%
+    \HyField@PDFAFlagWarning{hidden}{false}%
+  }%
+  \Fld@printtrue
+  \def\Fld@printfalse{%
+    \HyField@PDFAFlagWarning{print}{true}%
+  }%
+  \Fld@nozoomtrue
+  \def\Fld@nozoomfalse{%
+    \HyField@PDFAFlagWarning{nozoom}{true}%
+  }%
+  \Fld@norotatetrue
+  \def\Fld@norotatefalse{%
+    \HyField@PDFAFlagWarning{norotate}{true}%
+  }%
+  \Fld@noviewfalse
+  \def\Fld@noviewtrue{%
+    \HyField@PDFAFlagWarning{noview}{false}%
+  }%
+\fi
+\HyField@NewFlag{Submit}{IncludeNoValueFields}{2}
+\HyField@NewFlagOnly{Submit}{ExportFormat}{3}
+\HyField@NewFlag{Submit}{GetMethod}{4}
+\HyField@NewFlag{Submit}{SubmitCoordinates}{5}
+\HyField@NewFlagOnly{Submit}{XFDF}{6}
+\HyField@NewFlag{Submit}{IncludeAppendSaves}{7}
+\HyField@NewFlag{Submit}{IncludeAnnotations}{8}
+\HyField@NewFlagOnly{Submit}{SubmitPDF}{9}
+\HyField@NewFlag{Submit}{CanonicalFormat}{10}
+\HyField@NewFlag{Submit}{ExclNonUserAnnots}{11}
+\HyField@NewFlag{Submit}{ExclFKey}{12}
+\HyField@NewFlag{Submit}{EmbedForm}{14}
+\define@key{Field}{export}{%
+  \lowercase{\def\Hy@temp{#1}}%
+  \@ifundefined{Fld@export@\Hy@temp}{%
+    \@onelevel@sanitize\Hy@temp
+    \Hy@Error{%
+      Unknown export format `\Hy@temp'.\MessageBreak
+      Known formats are `FDF', `HTML', `XFDF', and `PDF'%
+    }\@ehc
+  }{%
+    \let\Fld@export\Hy@temp
+  }%
+}
+\def\Fld@export{fdf}
+\@namedef{Fld@export@fdf}{0}%
+\@namedef{Fld@export@html}{1}%
+\@namedef{Fld@export@xfdf}{2}%
+\@namedef{Fld@export@pdf}{3}%
+\def\HyField@FlagsSubmit{%
+  \bitsetReset{HyField@Submit}%
+  \ifcase\@nameuse{Fld@export@\Fld@export} %
+    % FDF
+    \HyField@UseFlag{Submit}{IncludeNoValueFields}%
+    \HyField@UseFlag{Submit}{SubmitCoordinates}%
+    \HyField@UseFlag{Submit}{IncludeAppendSaves}%
+    \HyField@UseFlag{Submit}{IncludeAnnotations}%
+    \HyField@UseFlag{Submit}{CanonicalFormat}%
+    \HyField@UseFlag{Submit}{ExclNonUserAnnots}%
+    \HyField@UseFlag{Submit}{ExclFKey}%
+    \HyField@UseFlag{Submit}{EmbedForm}%
+  \or % HTML
+    \HyField@SetFlag{Submit}{ExportFormat}%
+    \HyField@UseFlag{Submit}{IncludeNoValueFields}%
+    \HyField@UseFlag{Submit}{GetMethod}%
+    \HyField@UseFlag{Submit}{SubmitCoordinates}%
+    \HyField@UseFlag{Submit}{CanonicalFormat}%
+  \or % XFDF
+    \HyField@SetFlag{Submit}{XFDF}%
+    \HyField@UseFlag{Submit}{IncludeNoValueFields}%
+    \HyField@UseFlag{Submit}{SubmitCoordinates}%
+    \HyField@UseFlag{Submit}{CanonicalFormat}%
+  \or % PDF
+    \HyField@SetFlag{Submit}{SubmitPDF}%
+    \HyField@UseFlag{Submit}{GetMethod}%
+  \fi
+  \HyField@PrintFlags{Submit}{submit button field}%
+  \bitsetIsEmpty{HyField@Submit}{%
+    \let\Fld@submitflags\ltx@empty
+  }{%
+    \edef\Fld@submitflags{/Flags \bitsetGetDec{HyField@Submit}}%
+  }%
+}
+\def\HyField@FlagsAnnot#1{%
+  \bitsetReset{HyField@F}%
+  \HyField@UseFlag{F}{Invisible}%
+  \HyField@UseFlag{F}{Hidden}%
+  \HyField@UseFlag{F}{Print}%
+  \HyField@UseFlag{F}{NoZoom}%
+  \HyField@UseFlag{F}{NoRotate}%
+  \HyField@UseFlag{F}{NoView}%
+  \HyField@UseFlag{F}{Locked}%
+  \HyField@UseFlag{F}{ToggleNoView}%
+  \HyField@UseFlag{F}{LockedContents}%
+  \HyField@PrintFlags{F}{#1}%
+  \bitsetIsEmpty{HyField@F}{%
+    \let\Fld@annotflags\ltx@empty
+  }{%
+    \edef\Fld@annotflags{/F \bitsetGetDec{HyField@F}}%
+  }%
+}
+\def\HyField@FlagsPushButton{%
+  \HyField@FlagsAnnot{push button field}%
+  \bitsetReset{HyField@Ff}%
+  \HyField@UseFlag{Ff}{ReadOnly}%
+  \HyField@UseFlag{Ff}{Required}%
+  \HyField@UseFlag{Ff}{NoExport}%
+  \HyField@SetFlag{Ff}{Pushbutton}%
+  \HyField@PrintFlags{Ff}{push button field}%
+  \bitsetIsEmpty{HyField@Ff}{%
+    \let\Fld@flags\ltx@empty
+  }{%
+    \edef\Fld@flags{/Ff \bitsetGetDec{HyField@Ff}}%
+  }%
+}
+\def\HyField@FlagsCheckBox{%
+  \HyField@FlagsAnnot{check box field}%
+  \bitsetReset{HyField@Ff}%
+  \HyField@UseFlag{Ff}{ReadOnly}%
+  \HyField@UseFlag{Ff}{Required}%
+  \HyField@UseFlag{Ff}{NoExport}%
+  \HyField@PrintFlags{Ff}{check box field}%
+  \bitsetIsEmpty{HyField@Ff}{%
+    \let\Fld@flags\ltx@empty
+  }{%
+    \edef\Fld@flags{/Ff \bitsetGetDec{HyField@Ff}}%
+  }%
+}
+\def\HyField@FlagsRadioButton{%
+  \HyField@FlagsAnnot{radio button field}%
+  \bitsetReset{HyField@Ff}%
+  \HyField@UseFlag{Ff}{ReadOnly}%
+  \HyField@UseFlag{Ff}{Required}%
+  \HyField@UseFlag{Ff}{NoExport}%
+  \HyField@UseFlag{Ff}{NoToggleToOff}%
+  \HyField@SetFlag{Ff}{Radio}%
+  \HyField@UseFlag{Ff}{RadiosInUnison}%
+  \HyField@PrintFlags{Ff}{radio button field}%
+  \bitsetIsEmpty{HyField@Ff}{%
+    \let\Fld@flags\ltx@empty
+  }{%
+    \edef\Fld@flags{/Ff \bitsetGetDec{HyField@Ff}}%
+  }%
+}
+\def\HyField@FlagsText{%
+  \HyField@FlagsAnnot{text field}%
+  \bitsetReset{HyField@Ff}%
+  \HyField@UseFlag{Ff}{ReadOnly}%
+  \HyField@UseFlag{Ff}{Required}%
+  \HyField@UseFlag{Ff}{NoExport}%
+  \HyField@UseFlag{Ff}{Multiline}%
+  \HyField@UseFlag{Ff}{Password}%
+  \HyField@UseFlag{Ff}{FileSelect}%
+  \HyField@UseFlag{Ff}{DoNotSpellCheck}%
+  \HyField@UseFlag{Ff}{DoNotScroll}%
+  \ifFld@comb
+    \ifcase0\ifFld@multiline
+            \else\ifFld@password
+            \else\ifFld@fileselect
+            \else 1\fi\fi\fi\relax
+      \Hy@Error{%
+        Field option `comb' cannot used together with\MessageBreak
+        `multiline', `password', or `fileselect'%
+      }\@ehc
+    \else
+      \HyField@UseFlag{Ff}{Comb}%
+    \fi
+  \fi
+  \HyField@UseFlag{Ff}{RichText}%
+  \HyField@PrintFlags{Ff}{text field}%
+  \bitsetIsEmpty{HyField@Ff}{%
+    \let\Fld@flags\ltx@empty
+  }{%
+    \edef\Fld@flags{/Ff \bitsetGetDec{HyField@Ff}}%
+  }%
+}
+\def\HyField@FlagsChoice{%
+  \HyField@FlagsAnnot{choice field}%
+  \bitsetReset{HyField@Ff}%
+  \HyField@UseFlag{Ff}{ReadOnly}%
+  \HyField@UseFlag{Ff}{Required}%
+  \HyField@UseFlag{Ff}{NoExport}%
+  \HyField@UseFlag{Ff}{Combo}%
+  \ifFld@combo
+    \HyField@UseFlag{Ff}{Edit}%
+  \fi
+  \HyField@UseFlag{Ff}{Sort}%
+  \HyField@UseFlag{Ff}{MultiSelect}%
+  \ifFld@combo
+    \ifFld@edit
+      \HyField@UseFlag{Ff}{DoNotSpellCheck}%
+    \fi
+  \fi
+  \HyField@UseFlag{Ff}{CommitOnSelChange}%
+  \HyField@PrintFlags{Ff}{choice field}%
+  \bitsetIsEmpty{HyField@Ff}{%
+    \let\Fld@flags\ltx@empty
+  }{%
+    \edef\Fld@flags{/Ff \bitsetGetDec{HyField@Ff}}%
+  }%
+}
+\def\HyField@PDFChoices#1{%
+  \begingroup
+    \global\let\Fld@choices\ltx@empty
+    \let\HyTmp@optlist\ltx@empty
+    \let\HyTmp@optitem\relax
+    \count@=0 %
+    \kv@parse{#1}{%
+      \Hy@pdfstringdef\kv@key\kv@key
+      \ifx\kv@value\relax
+        \ifnum\Hy@pdfversion<3 % implementation note 122, PDF spec 1.7
+          \xdef\Fld@choices{\Fld@choices[(\kv@key)(\kv@key)]}%
+        \else
+          \xdef\Fld@choices{\Fld@choices(\kv@key)}%
+        \fi
+      \else
+        \Hy@pdfstringdef\kv@value\kv@value
+        \xdef\Fld@choices{\Fld@choices[(\kv@value)(\kv@key)]}%
+      \fi
+      \edef\HyTmp@optlist{%
+        \HyTmp@optlist
+        \HyTmp@optitem{\the\count@}{\kv@key}0%
+      }%
+      \advance\count@ by 1 %
+      \@gobbletwo
+    }%
+    \xdef\Fld@choices{/Opt[\Fld@choices]}%
+    \ifFld@multiselect
+      \HyField@@PDFChoices{DV}\Fld@default
+      \HyField@@PDFChoices{V}\Fld@value
+    \else
+      \ifx\Fld@default\relax
+      \else
+        \pdfstringdef\Hy@gtemp\Fld@default
+        \xdef\Fld@choices{\Fld@choices/DV(\Hy@gtemp)}%
+      \fi
+      \ifx\Fld@value\relax
+      \else
+        \pdfstringdef\Hy@gtemp\Fld@value
+        \xdef\Fld@choices{\Fld@choices/V(\Hy@gtemp)}%
+      \fi
+    \fi
+  \endgroup
+}
+\def\HyField@@PDFChoices#1#2{%
+  \ifx#2\relax
+  \else
+    \count@=0 %
+    \def\HyTmp@optitem##1##2##3{%
+      \def\HyTmp@key{##2}%
+      \ifx\HyTmp@key\Hy@gtemp
+        \expandafter\def\expandafter\HyTmp@optlist\expandafter{%
+          \HyTmp@optlist
+          \HyTmp@optitem{##1}{##2}1%
+        }%
+        \let\HyTmp@found=Y%
+      \else
+        \expandafter\def\expandafter\HyTmp@optlist\expandafter{%
+          \HyTmp@optlist
+          \HyTmp@optitem{##1}{##2}##3%
+        }%
+      \fi
+    }%
+    \expandafter\comma@parse\expandafter{#2}{%
+      \pdfstringdef\Hy@gtemp\comma@entry
+      \let\HyTmp@found=N %
+      \expandafter\let\expandafter\HyTmp@optlist\expandafter\@empty
+      \HyTmp@optlist
+      \ifx\HyTmp@found Y%
+        \advance\count@ by 1 %
+      \else
+        \@onelevel@sanitize\comma@entry
+        \PackageWarning{hyperref}{%
+          \string\ChoiceBox: Ignoring value `\comma@entry',%
+          \MessageBreak
+          it cannot be found in the choices%
+        }%
+      \fi
+      \@gobble
+    }%
+    \def\HyTmp@optitem##1##2##3{%
+      \ifnum##3=1 %
+        (##2)%
+      \fi
+    }%
+    \ifcase\count@
+    \or
+      \xdef\Fld@choices{\Fld@choices/#1\HyTmp@optlist}%
+    \else
+      \xdef\Fld@choices{\Fld@choices/#1[\HyTmp@optlist]}%
+      \ifx#1V%
+        \def\HyTmp@optitem##1##2##3{%
+          \ifnum##3=1 %
+            \@firstofone{ ##1}%
+          \fi
+        }%
+        \edef\HyTmp@optlist{\HyTmp@optlist}%
+        \xdef\Fld@choices{%
+          \Fld@choices
+          /I[\expandafter\@firstofone\HyTmp@optlist]%
+        }%
+      \fi
+    \fi
+  \fi
+}
+\def\HyField@SetKeys{%
+  \kvsetkeys{Field}%
+}
+\newif\ifFld@checked
+\newif\ifFld@disabled
+\Fld@checkedfalse
+\Fld@disabledfalse
+\newcount\Fld@menulength
+\newdimen\Field@Width
+\newdimen\Fld@charsize
+\Fld@charsize=10\p@
+\def\Fld@maxlen{0}
+\def\Fld@align{0}
+\def\Fld@color{0 0 0 rg}
+\def\Fld@bcolor{1 1 1}
+\def\Fld@bordercolor{1 0 0}
+\def\Fld@bordersep{1\p@}
+\def\Fld@borderwidth{1}
+\def\Fld@borderstyle{S}
+\def\Fld@cbsymbol{4}
+\def\Fld@radiosymbol{H}
+\def\Fld@rotation{0}
+\def\Form{\@ifnextchar[{\@Form}{\@Form[]}}
+\def\endForm{\@endForm}
+\newif\ifForm@html
+\Form@htmlfalse
+\def\Form@boolkey#1#2{%
+  \csname Form@#2\ifx\relax#1\relax true\else#1\fi\endcsname
+}
+\define@key{Form}{action}{%
+  \hyper@normalise\Hy@DefFormAction{#1}%
+}
+\def\Hy@DefFormAction{\def\Form@action}
+\def\enc@@html{html}
+\define@key{Form}{encoding}{%
+  \def\Hy@tempa{#1}%
+  \ifx\Hy@tempa\enc@@html
+    \Form@htmltrue
+    \def\Fld@export{html}%
+  \else
+    \Hy@Warning{%
+       Form `encoding' key with \MessageBreak
+       unknown value `#1'%
+    }%
+    \Form@htmlfalse
+  \fi
+}
+\define@key{Form}{method}{%
+  \lowercase{\def\Hy@temp{#1}}%
+  \@ifundefined{Form@method@\Hy@temp}{%
+    \@onelevel@sanitize\Hy@temp
+    \Hy@Error{%
+      Unknown method `\Hy@temp'.\MessageBreak
+      Known values are `post' and `get'%
+    }\@ehc
+  }{%
+    \let\Form@method\Hy@temp
+    \ifcase\@nameuse{Form@method@\Hy@temp} %
+      \Fld@getmethodfalse
+    \else
+      \Fld@getmethodtrue
+    \fi
+  }%
+}
+\def\Form@method{}
+\@namedef{Form@method@post}{0}
+\@namedef{Form@method@get}{1}
+\newif\ifHyField@NeedAppearances
+\def\HyField@NeedAppearancesfalse{%
+  \global\let\ifHyField@NeedAppearances\iffalse
+}
+\def\HyField@NeedAppearancestrue{%
+  \global\let\ifHyField@NeedAppearances\iftrue
+}
+\HyField@NeedAppearancestrue
+\define@key{Form}{NeedAppearances}[true]{%
+  \edef\Hy@tempa{#1}%
+  \ifx\Hy@tempa\Hy@true
+    \HyField@NeedAppearancestrue
+  \else
+    \ifx\Hy@tempa\Hy@false
+      \HyField@NeedAppearancesfalse
+    \else
+      \Hy@Error{%
+        Unexpected value `\Hy@tempa'\MessageBreak
+        of option `NeedAppearances' instead of\MessageBreak
+        `true' or `false'%
+      }\@ehc
+    \fi
+  \fi
+}
+\def\Field@boolkey#1#2{%
+  \csname Fld@#2\ifx\relax#1\relax true\else#1\fi\endcsname
+}
+\ifHy@texht
+  \newtoks\Field@toks
+  \Field@toks={ }%
+  \def\Field@addtoks#1#2{%
+    \edef\@processme{\Field@toks{\the\Field@toks\space #1="#2"}}%
+    \@processme
+  }%
+\else
+  \def\Hy@WarnHTMLFieldOption#1{%
+    \Hy@Warning{%
+      HTML field option `#1'\MessageBreak
+      is ignored%
+    }%
+  }%
+\fi
+\def\Fld@checkequals#1=#2=#3\\{%
+  \def\@currDisplay{#1}%
+  \ifx\\#2\\%
+    \def\@currValue{#1}%
+  \else
+    \def\@currValue{#2}%
+  \fi
+}
+\define@key{Field}{loc}{%
+  \def\Fld@loc{#1}%
+}
+\define@key{Field}{checked}[true]{%
+  \lowercase{\Field@boolkey{#1}}{checked}%
+}
+\define@key{Field}{disabled}[true]{%
+  \lowercase{\Field@boolkey{#1}}{disabled}%
+}
+\ifHy@texht
+  \define@key{Field}{accesskey}{%
+    \Field@addtoks{accesskey}{#1}%
+  }%
+  \define@key{Field}{tabkey}{%
+    \Field@addtoks{tabkey}{#1}%
+  }%
+\else
+  \define@key{Field}{accesskey}{%
+    \Hy@WarnHTMLFieldOption{accesskey}%
+  }%
+  \define@key{Field}{tabkey}{%
+    \Hy@WarnHTMLFieldOption{tabkey}%
+  }%
+\fi
+\define@key{Field}{name}{%
+  \def\Fld@name{#1}%
+}
+\let\Fld@altname\relax
+\define@key{Field}{altname}{%
+  \def\Fld@altname{#1}%
+}
+\let\Fld@mappingname\relax
+\define@key{Field}{mappingname}{%
+  \def\Fld@mappingname{#1}%
+}
+\define@key{Field}{width}{%
+  \def\Fld@width{#1}%
+  \Field@Width#1\setbox0=\hbox{m}%
+}
+\define@key{Field}{maxlen}{%
+  \def\Fld@maxlen{#1}%
+}
+\define@key{Field}{menulength}{%
+  \Fld@menulength=#1\relax
+}
+\define@key{Field}{height}{%
+  \def\Fld@height{#1}%
+}
+\define@key{Field}{charsize}{%
+  \setlength{\Fld@charsize}{#1}%
+}
+\define@key{Field}{borderwidth}{%
+  \Hy@defaultbp\Fld@borderwidth{#1}%
+}
+\def\Hy@defaultbp#1#2{%
+  \begingroup
+  \afterassignment\Hy@defaultbpAux
+  \dimen@=#2bp\relax{#1}{#2}%
+}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname dimexpr\endcsname\relax
+  \def\Hy@defaultbpAux#1\relax#2#3{%
+    \ifx!#1!%
+      \endgroup
+      \def#2{#3}%
+    \else
+      \dimen@=.99626\dimen@
+      \edef\x{\endgroup
+        \def\noexpand#2{%
+          \strip@pt\dimen@
+        }%
+      }\x
+    \fi
+  }%
+\else
+  \def\Hy@defaultbpAux#1\relax#2#3{%
+    \ifx!#1!%
+      \endgroup
+      \def#2{#3}%
+    \else
+      \edef\x{\endgroup
+        \def\noexpand#2{%
+          \strip@pt\dimexpr\dimen@*800/803\relax
+        }%
+      }\x
+    \fi
+  }%
+\fi
+\define@key{Field}{borderstyle}{%
+  \let\Hy@temp\Fld@borderstyle
+  \def\Fld@borderstyle{#1}%
+  \Hy@Match\Fld@borderstyle{%
+    ^[SDBIU]$%
+  }{}{%
+    \Hy@Warning{%
+      Invalid value `\@pdfborderstyle'\MessageBreak
+      for option `pdfborderstyle'. Valid values:\MessageBreak
+      \space\space S (Solid), D (Dashed), B (Beveled),\MessageBreak
+      \space\space I (Inset), U (Underline)\MessageBreak
+      Option setting is ignored%
+    }%
+    \let\Fld@borderstyle\Hy@temp
+  }%
+}
+\define@key{Field}{bordersep}{%
+  \def\Fld@bordersep{#1}%
+}
+\define@key{Field}{default}{%
+  \def\Fld@default{#1}%
+}
+\define@key{Field}{align}{%
+  \def\Fld@align{#1}%
+}
+\define@key{Field}{value}{%
+  \def\Fld@value{#1}%
+}
+\define@key{Field}{checkboxsymbol}{%
+  \Fld@DingDef\Fld@cbsymbol{#1}%
+}
+\define@key{Field}{radiosymbol}{%
+  \Fld@DingDef\Fld@radiosymbol{#1}%
+}
+\def\Fld@DingDef#1#2{%
+  \let\Fld@temp\ltx@empty
+  \Fld@@DingDef#2\ding{}\@nil
+  \let#1\Fld@temp
+}
+\def\Fld@@DingDef#1\ding#2#3\@nil{%
+  \expandafter\def\expandafter\Fld@temp\expandafter{%
+    \Fld@temp
+    #1%
+  }%
+  \ifx\\#3\\%
+    \expandafter\@gobble
+  \else
+    \begingroup
+      \lccode`0=#2\relax
+    \lowercase{\endgroup
+      \expandafter\def\expandafter\Fld@temp\expandafter{%
+        \Fld@temp
+        0%
+      }%
+    }%
+    \expandafter\@firstofone
+  \fi
+  {%
+    \Fld@@DingDef#3\@nil
+  }%
+}
+\define@key{Field}{rotation}{%
+  \def\Fld@rotation{#1}%
+}
+\define@key{Field}{backgroundcolor}{%
+  \HyColor@FieldBColor{#1}\Fld@bcolor{hyperref}{backgroundcolor}%
+}
+\define@key{Field}{bordercolor}{%
+  \HyColor@FieldBColor{#1}\Fld@bordercolor{hyperref}{bordercolor}%
+}
+\define@key{Field}{color}{%
+  \HyColor@FieldColor{#1}\Fld@color{hyperref}{color}%
+}
+\let\Fld@onclick@code\ltx@empty
+\let\Fld@format@code\ltx@empty
+\let\Fld@validate@code\ltx@empty
+\let\Fld@calculate@code\ltx@empty
+\let\Fld@keystroke@code\ltx@empty
+\let\Fld@onfocus@code\ltx@empty
+\let\Fld@onblur@code\ltx@empty
+\let\Fld@onmousedown@code\ltx@empty
+\let\Fld@onmouseup@code\ltx@empty
+\let\Fld@onenter@code\ltx@empty
+\let\Fld@onexit@code\ltx@empty
+\def\Hy@temp#1{%
+  \expandafter\Hy@@temp\csname Fld@#1@code\endcsname{#1}%
+}
+\def\Hy@@temp#1#2{%
+  \ifHy@pdfa
+    \define@key{Field}{#2}{%
+      \Hy@Error{%
+        PDF/A: Additional action `#2' is prohibited%
+      }\@ehc
+    }%
+  \else
+    \define@key{Field}{#2}{%
+      \def#1{##1}%
+    }%
+  \fi
+}
+\Hy@temp{keystroke}
+\Hy@temp{format}
+\Hy@temp{validate}
+\Hy@temp{calculate}
+\Hy@temp{onfocus}
+\Hy@temp{onblur}
+\Hy@temp{onenter}
+\Hy@temp{onexit}
+\ifHy@texht
+  \def\Hy@temp#1{%
+    \define@key{Field}{#1}{%
+      \Field@addtoks{#1}{##1}%
+    }%
+  }%
+\else
+  \def\Hy@temp#1{%
+    \define@key{Field}{#1}{%
+      \Hy@WarnHTMLFieldOption{#1}%
+    }%
+  }%
+\fi
+\Hy@temp{ondblclick}
+\Hy@temp{onmousedown}
+\Hy@temp{onmouseup}
+\Hy@temp{onmouseover}
+\Hy@temp{onmousemove}
+\Hy@temp{onmouseout}
+\Hy@temp{onkeydown}
+\Hy@temp{onkeyup}
+\Hy@temp{onselect}
+\Hy@temp{onchange}
+\Hy@temp{onkeypress}
+\ifHy@texht
+  \define@key{Field}{onclick}{%
+    \Field@addtoks{onclick}{#1}%
+  }%
+\else
+  \ifHy@pdfa
+    \define@key{Field}{onclick}{%
+      \Hy@Error{%
+        PDF/A: Action `onclick' is prohibited%
+      }\@ehc
+    }%
+  \else
+    \define@key{Field}{onclick}{%
+      \def\Fld@onclick@code{#1}%
+    }%
+  \fi
+\fi
+\DeclareRobustCommand\TextField{%
+  \@ifnextchar[{\@TextField}{\@TextField[]}%
+}
+\DeclareRobustCommand\ChoiceMenu{%
+  \@ifnextchar[{\@ChoiceMenu}{\@ChoiceMenu[]}%
+}
+\DeclareRobustCommand\CheckBox{%
+  \@ifnextchar[{\@CheckBox}{\@CheckBox[]}%
+}
+\DeclareRobustCommand\PushButton{%
+  \@ifnextchar[{\@PushButton}{\@PushButton[]}%
+}
+\DeclareRobustCommand\Gauge{%
+  \@ifnextchar[{\@Gauge}{\@Gauge[]}%
+}
+\DeclareRobustCommand\Submit{%
+  \@ifnextchar[{\@Submit}{\@Submit[]}%
+}
+\DeclareRobustCommand\Reset{%
+  \@ifnextchar[{\@Reset}{\@Reset[]}%
+}
+\def\LayoutTextField#1#2{% label, field
+  #1 #2%
+}
+\def\LayoutChoiceField#1#2{% label, field
+  #1 #2%
+}
+\def\LayoutCheckField#1#2{% label, field
+  #1 #2%
+}
+\def\LayoutPushButtonField#1{% button
+  #1%
+}
+\def\MakeRadioField#1#2{\vbox to #2{\hbox to #1{\hfill}\vfill}}
+\def\MakeCheckField#1#2{\vbox to #2{\hbox to #1{\hfill}\vfill}}
+\def\MakeTextField#1#2{\vbox to #2{\hbox to #1{\hfill}\vfill}}
+\def\MakeChoiceField#1#2{\vbox to #2{\hbox to #1{\hfill}\vfill}}
+\def\MakeButtonField#1{%
+  \sbox0{%
+    \hskip\Fld@borderwidth bp#1\hskip\Fld@borderwidth bp%
+  }%
+  \@tempdima\ht0 %
+  \advance\@tempdima by \Fld@borderwidth bp %
+  \advance\@tempdima by \Fld@borderwidth bp %
+  \ht0\@tempdima
+  \@tempdima\dp0 %
+  \advance\@tempdima by \Fld@borderwidth bp %
+  \advance\@tempdima by \Fld@borderwidth bp %
+  \dp0\@tempdima
+  \box0\relax
+}
+\def\DefaultHeightofSubmit{14pt}
+\def\DefaultWidthofSubmit{2cm}
+\def\DefaultHeightofReset{14pt}
+\def\DefaultWidthofReset{2cm}
+\def\DefaultHeightofCheckBox{\baselineskip}
+\def\DefaultWidthofCheckBox{\baselineskip}
+\def\DefaultHeightofChoiceMenu{\baselineskip}
+\def\DefaultWidthofChoiceMenu{\baselineskip}
+\def\DefaultHeightofText{\baselineskip}
+\def\DefaultHeightofTextMultiline{4\baselineskip}
+\def\DefaultWidthofText{3cm}
+\def\DefaultOptionsofSubmit{print,name=Submit,noexport}
+\def\DefaultOptionsofReset{print,name=Reset,noexport}
+\def\DefaultOptionsofPushButton{print}
+\def\DefaultOptionsofCheckBox{print}
+\def\DefaultOptionsofText{print}
+\def\DefaultOptionsofListBox{print}
+\def\DefaultOptionsofComboBox{print,edit,sort}
+\def\DefaultOptionsofPopdownBox{print}
+\def\DefaultOptionsofRadio{print,notoggletooff}
+\ifHy@hyperfigures
+  \Hy@Info{Hyper figures ON}%
+\else
+  \Hy@Info{Hyper figures OFF}%
+\fi
+\ifHy@nesting
+  \Hy@Info{Link nesting ON}%
+\else
+  \Hy@Info{Link nesting OFF}%
+\fi
+\ifHy@hyperindex
+  \Hy@Info{Hyper index ON}%
+\else
+  \Hy@Info{Hyper index OFF}%
+\fi
+\ifHy@backref
+  \Hy@Info{backreferencing ON}%
+\else
+  \Hy@Info{backreferencing OFF}%
+\fi
+\ifHy@colorlinks
+  \Hy@Info{Link coloring ON}%
+\else
+  \Hy@Info{Link coloring OFF}%
+\fi
+\ifHy@ocgcolorlinks
+  \Hy@Info{Link coloring with OCG ON}%
+\else
+  \Hy@Info{Link coloring with OCG OFF}%
+\fi
+\ifHy@pdfa
+  \Hy@Info{PDF/A mode ON}%
+\else
+  \Hy@Info{PDF/A mode OFF}%
+\fi
+\edef\hyper@hash{\string#}
+\edef\hyper@tilde{\string~}
+\edef\hyper@quote{\string"}
+\def\@currentHref{Doc-Start}
+\let\Hy@footnote@currentHref\@empty
+\Hy@AtBeginDocument{%
+  \Hy@pdfstringtrue
+  \PDF@SetupDoc
+  \let\PDF@SetupDoc\@empty
+  \Hy@DisableOption{pdfpagescrop}%
+  \Hy@DisableOption{pdfpagemode}%
+  \Hy@DisableOption{pdfnonfullscreenpagemode}%
+  \Hy@DisableOption{pdfdirection}%
+  \Hy@DisableOption{pdfviewarea}%
+  \Hy@DisableOption{pdfviewclip}%
+  \Hy@DisableOption{pdfprintarea}%
+  \Hy@DisableOption{pdfprintclip}%
+  \Hy@DisableOption{pdfprintscaling}%
+  \Hy@DisableOption{pdfduplex}%
+  \Hy@DisableOption{pdfpicktraybypdfsize}%
+  \Hy@DisableOption{pdfprintpagerange}%
+  \Hy@DisableOption{pdfnumcopies}%
+  \Hy@DisableOption{pdfstartview}%
+  \Hy@DisableOption{pdfstartpage}%
+  \Hy@DisableOption{pdftoolbar}%
+  \Hy@DisableOption{pdfmenubar}%
+  \Hy@DisableOption{pdfwindowui}%
+  \Hy@DisableOption{pdffitwindow}%
+  \Hy@DisableOption{pdfcenterwindow}%
+  \Hy@DisableOption{pdfdisplaydoctitle}%
+  \Hy@DisableOption{pdfpagelayout}%
+  \Hy@DisableOption{pdflang}%
+  \Hy@DisableOption{baseurl}%
+  \ifHy@texht\else\hyper@anchorstart{Doc-Start}\hyper@anchorend\fi
+  \Hy@pdfstringfalse
+}
+
+\LetLtxMacro\NoHy@OrgRef\ref
+\DeclareRobustCommand*{\ref}{%
+  \@ifstar\NoHy@OrgRef\NoHy@OrgRef
+}
+\LetLtxMacro\NoHy@OrgPageRef\pageref
+\DeclareRobustCommand*{\pageref}{%
+  \@ifstar\NoHy@OrgPageRef\NoHy@OrgPageRef
+}
+\def\NoHyper{%
+  \def\hyper@link@[##1]##2##3##4{##4\Hy@xspace@end}%
+  \def\hyper@@anchor##1##2{##2\Hy@xspace@end}%
+  \global\let\hyper@livelink\hyper@link
+  \gdef\hyper@link##1##2##3{##3\Hy@xspace@end}%
+  \let\hyper@anchor\ltx@gobble
+  \let\hyper@anchorstart\ltx@gobble
+  \def\hyper@anchorend{\Hy@xspace@end}%
+  \let\hyper@linkstart\ltx@gobbletwo
+  \def\hyper@linkend{\Hy@xspace@end}%
+  \def\hyper@linkurl##1##2{##1\Hy@xspace@end}%
+  \def\hyper@linkfile##1##2##3{##1\Hy@xspace@end}%
+  \let\Hy@backout\@gobble
+}
+\def\stop@hyper{%
+  \def\hyper@link@[##1]##2##3##4{##4\Hy@xspace@end}%
+  \let\Hy@backout\@gobble
+  \let\hyper@@anchor\ltx@gobble
+  \def\hyper@link##1##2##3{##3\Hy@xspace@end}%
+  \let\hyper@anchor\ltx@gobble
+  \let\hyper@anchorstart\ltx@gobble
+  \def\hyper@anchorend{\Hy@xspace@end}%
+  \let\hyper@linkstart\ltx@gobbletwo
+  \def\hyper@linkend{\Hy@xspace@end}%
+  \def\hyper@linkurl##1##2{##1\Hy@xspace@end}%
+  \def\hyper@linkfile##1##2##3{##1\Hy@xspace@end}%
+}
+\def\endNoHyper{%
+  \global\let\hyper@link\hyper@livelink
+}
+\Hy@AtBeginDocument{%
+  \if@filesw
+    \ifHy@typexml
+      \immediate\closeout\@mainaux
+      \immediate\openout\@mainaux\jobname.aux\relax
+      \immediate\write\@auxout{<relaxxml>\relax}%
+    \fi
+    \immediate\write\@auxout{%
+      \string\providecommand\string\HyperFirstAtBeginDocument{%
+        \string\AtBeginDocument}^^J%
+      \string\HyperFirstAtBeginDocument{%
+        \string\ifx\string\hyper@anchor\string\@undefined^^J%
+          \string\global\string\let\string\oldcontentsline\string\contentsline^^J%
+          \string\gdef\string\contentsline%
+            \string#1\string#2\string#3\string#4{%
+            \string\oldcontentsline%
+              {\string#1}{\string#2}{\string#3}}^^J%
+          \string\global\string\let\string\oldnewlabel\string\newlabel^^J%
+          \string\gdef\string\newlabel\string#1\string#2{%
+             \string\newlabelxx{\string#1}\string#2}^^J%
+          \string\gdef\string\newlabelxx%
+             \string#1\string#2\string#3\string#4\string#5\string#6{%
+             \string\oldnewlabel{\string#1}{{\string#2}{\string#3}}}^^J%
+          \string\AtEndDocument{%
+            \string\ifx\string\hyper@anchor\string\@undefined^^J%
+              \string\let\string\contentsline\string\oldcontentsline^^J%
+              \string\let\string\newlabel\string\oldnewlabel^^J%
+            \string\fi%
+          }^^J%
+        \string\fi%
+      }^^J%
+      \string\global\string\let\string\hyper@last\relax^^J%
+      \string\gdef\string\HyperFirstAtBeginDocument\string#1{\string#1}%
+    }%
+  \fi
+  \let\HyperFirstAtBeginDocument\ltx@firstofone
+  \ifx\hyper@last\@undefined
+    \def\@starttoc#1{%
+      \begingroup
+        \makeatletter
+        \IfFileExists{\jobname.#1}{%
+          \Hy@WarningNoLine{%
+            old #1 file detected, not used; run LaTeX again%
+          }%
+        }{}%
+        \if@filesw
+          \expandafter\newwrite\csname tf@#1\endcsname
+          \immediate\openout\csname tf@#1\endcsname \jobname.#1\relax
+        \fi
+        \@nobreakfalse
+      \endgroup
+    }%
+    \def\newlabel#1#2{\@newl@bel r{#1}{#2{}{}{}{}}}%
+  \fi
+}
+\ifHy@pdfusetitle
+  \let\HyOrg@title\title
+  \let\HyOrg@author\author
+  \def\title{\@ifnextchar[{\Hy@scanopttitle}{\Hy@scantitle}}%
+  \def\Hy@scanopttitle[#1]{%
+    \gdef\Hy@title{#1}%
+    \HyOrg@title[{#1}]%
+  }%
+  \def\Hy@scantitle#1{%
+    \gdef\Hy@title{#1}%
+    \HyOrg@title{#1}%
+  }%
+  \def\author{\@ifnextchar[{\Hy@scanoptauthor}{\Hy@scanauthor}}%
+  \def\Hy@scanoptauthor[#1]{%
+    \gdef\Hy@author{#1}%
+    \HyOrg@author[{#1}]%
+  }%
+  \def\Hy@scanauthor#1{%
+    \gdef\Hy@author{#1}%
+    \HyOrg@author{#1}%
+  }%
+  \begingroup
+    \def\process@me#1\@nil#2{%
+      \expandafter\let\expandafter\x\csname @#2\endcsname
+      \edef\y{\expandafter\strip@prefix\meaning\x}%
+      \def\c##1#1##2\@nil{%
+        \ifx\\##1\\%
+        \else
+         \expandafter\gdef\csname Hy@#2\expandafter\endcsname
+              \expandafter{\x}%
+        \fi
+      }%
+      \expandafter\c\y\relax#1\@nil
+    }%
+    \expandafter\process@me\string\@latex@\@nil{title}%
+    \expandafter\process@me\string\@latex@\@nil{author}%
+  \endgroup
+\fi
+\Hy@DisableOption{pdfusetitle}
+\def\Hy@UseMaketitleString#1{%
+  \ltx@IfUndefined{Hy@#1}{}{%
+    \begingroup
+      \let\Hy@saved@hook\pdfstringdefPreHook
+      \pdfstringdefDisableCommands{%
+        \expandafter\let\expandafter\\\csname Hy@newline@#1\endcsname
+        \let\newline\\%
+      }%
+      \expandafter\ifx\csname @pdf#1\endcsname\@empty
+        \expandafter\pdfstringdef\csname @pdf#1\endcsname{%
+          \csname Hy@#1\endcsname\@empty
+        }%
+      \fi
+      \global\let\pdfstringdefPreHook\Hy@saved@hook
+    \endgroup
+  }%
+}
+\def\Hy@newline@title#1{ #1}
+\def\Hy@newline@author#1{, #1}
+\def\Hy@UseMaketitleInfos{%
+  \Hy@UseMaketitleString{title}%
+  \Hy@UseMaketitleString{author}%
+}
+\RequirePackage{atbegshi}[2007/09/09]
+\let\Hy@EveryPageHook\ltx@empty
+\let\Hy@EveryPageBoxHook\ltx@empty
+\let\Hy@FirstPageHook\ltx@empty
+\AtBeginShipout{%
+  \Hy@EveryPageHook
+  \ifx\Hy@EveryPageBoxHook\ltx@empty
+  \else
+    \setbox\AtBeginShipoutBox=\vbox{%
+      \offinterlineskip
+      \Hy@EveryPageBoxHook
+      \box\AtBeginShipoutBox
+    }%
+  \fi
+}
+\AtBeginShipoutFirst{%
+  \Hy@FirstPageHook
+}
+\g@addto@macro\Hy@FirstPageHook{%
+  \PDF@FinishDoc
+  \global\let\PDF@FinishDoc\ltx@empty
+}
+\ifHy@pdfpagelabels
+  \begingroup\expandafter\expandafter\expandafter\endgroup
+  \expandafter\ifx\csname thepage\endcsname\relax
+    \Hy@pdfpagelabelsfalse
+    \Hy@WarningNoLine{%
+      Option `pdfpagelabels' is turned off\MessageBreak
+      because \string\thepage\space is undefined%
+    }%
+    \csname fi\endcsname
+    \csname iffalse\expandafter\endcsname
+  \fi
+  \def\thispdfpagelabel#1{%
+    \gdef\HyPL@thisLabel{#1}%
+  }%
+  \global\let\HyPL@thisLabel\relax
+  \let\HyPL@Labels\ltx@empty
+  \newcount\Hy@abspage
+  \Hy@abspage=0 %
+  \def\HyPL@LastType{init}%
+  \def\HyPL@LastNumber{0}%
+  \let\HyPL@LastPrefix\ltx@empty
+  \def\HyPL@arabic{D}%
+  \def\HyPL@Roman{R}%
+  \def\HyPL@roman{r}%
+  \def\HyPL@Alph{A}%
+  \def\HyPL@alph{a}%
+  \let\HyPL@SlidesSetPage\ltx@empty
+  \ltx@ifclassloaded{slides}{%
+    \def\HyPL@SlidesSetPage{%
+      \advance\c@page\ltx@one
+      \ifnum\value{page}>\ltx@one
+        \protected@edef\HyPL@SlidesOptionalPage{%
+          \Hy@SlidesFormatOptionalPage{\thepage}%
+        }%
+      \else
+        \let\HyPL@SlidesOptionalPage\ltx@empty
+      \fi
+      \advance\c@page-\ltx@one
+      \def\HyPL@page{%
+        \csname the\Hy@SlidesPage\endcsname
+        \HyPL@SlidesOptionalPage
+      }%
+    }%
+  }{}%
+  \def\HyPL@EveryPage{%
+    \begingroup
+      \ifx\HyPL@thisLabel\relax
+        \let\HyPL@page\thepage
+        \HyPL@SlidesSetPage
+      \else
+        \let\HyPL@page\HyPL@thisLabel
+        \global\let\HyPL@thisLabel\relax
+      \fi
+      \let\HyPL@Type\relax
+      \ifnum\c@page>0 %
+        \ifx\HyPL@SlidesSetPage\ltx@empty
+          \expandafter\HyPL@CheckThePage\HyPL@page\@nil
+        \fi
+      \fi
+      \let\Hy@temp Y%
+      \ifx\HyPL@Type\HyPL@LastType
+      \else
+        \let\Hy@temp N%
+      \fi
+      \ifx\HyPL@Type\relax
+         \pdfstringdef\HyPL@Prefix{\HyPL@page}%
+      \else
+         \pdfstringdef\HyPL@Prefix\HyPL@Prefix
+      \fi
+      \ifx\HyPL@Prefix\HyPL@LastPrefix
+      \else
+        \let\Hy@temp N%
+      \fi
+      \if Y\Hy@temp
+        \advance\c@page by -1 %
+        \ifnum\HyPL@LastNumber=\the\c@page\relax
+        \else
+          \let\Hy@temp N%
+        \fi
+        \Hy@StepCount\c@page
+      \fi
+      \if N\Hy@temp
+        \ifx\HyPL@Type\relax
+          \HyPL@StorePageLabel{/P(\HyPL@Prefix)}%
+        \else
+          \HyPL@StorePageLabel{%
+            \ifx\HyPL@Prefix\@empty
+            \else
+              /P(\HyPL@Prefix)%
+            \fi
+            /S/\csname HyPL\HyPL@Type\endcsname
+            \ifnum\the\c@page=1 %
+            \else
+              \space/St \the\c@page
+            \fi
+          }%
+        \fi
+      \fi
+      \xdef\HyPL@LastNumber{\the\c@page}%
+      \global\let\HyPL@LastType\HyPL@Type
+      \global\let\HyPL@LastPrefix\HyPL@Prefix
+    \endgroup
+    \Hy@GlobalStepCount\Hy@abspage
+  }%
+  \def\HyPL@CheckThePage#1\@nil{%
+    \HyPL@@CheckThePage{#1}#1\csname\endcsname\c@page\@nil
+  }%
+  \def\HyPL@@CheckThePage#1#2\csname#3\endcsname\c@page#4\@nil{%
+    \def\Hy@tempa{#4}%
+    \def\Hy@tempb{\csname\endcsname\c@page}%
+    \ifx\Hy@tempa\Hy@tempb
+      \expandafter\ifx\csname HyPL#3\endcsname\relax
+      \else
+        \def\HyPL@Type{#3}%
+        \def\HyPL@Prefix{#2}%
+      \fi
+    \else
+      \begingroup
+        \let\Hy@next\endgroup
+        \let\HyPL@found\@undefined
+        \def\arabic{\HyPL@Format{arabic}}%
+        \def\Roman{\HyPL@Format{Roman}}%
+        \def\roman{\HyPL@Format{roman}}%
+        \def\Alph{\HyPL@Format{Alph}}%
+        \def\alph{\HyPL@Format{alph}}%
+        \protected@edef\Hy@temp{#1}%
+        \ifx\HyPL@found\relax
+          \toks@\expandafter{\Hy@temp}%
+          \edef\Hy@next{\endgroup
+            \noexpand\HyPL@@@CheckThePage\the\toks@
+               \noexpand\HyPL@found\relax\noexpand\@nil
+          }%
+        \fi
+      \Hy@next
+    \fi
+  }%
+  \def\HyPL@Format#1#2{%
+    \ifx\HyPL@found\@undefined
+      \expandafter\ifx\csname c@#2\endcsname\c@page
+        \expandafter\noexpand\csname HyPL@found\endcsname{#1}%
+      \else
+        \expandafter\noexpand\csname#1\endcsname{#2}%
+      \fi
+    \else
+      \expandafter\noexpand\csname#1\endcsname{#2}%
+    \fi
+  }%
+  \def\HyPL@@@CheckThePage#1\HyPL@found#2#3\@nil{%
+    \def\Hy@tempa{#3}%
+    \def\Hy@tempb{\HyPL@found\relax}%
+    \ifx\Hy@tempa\Hy@tempb
+      \def\HyPL@Type{@#2}%
+      \def\HyPL@Prefix{#1}%
+    \fi
+  }%
+  \providecommand*{\HyPL@StorePageLabel}[1]{}%
+  \def\HyPL@Useless{0<</S/D>>}%
+  \@onelevel@sanitize\HyPL@Useless
+  \def\HyPL@SetPageLabels{%
+    \@onelevel@sanitize\HyPL@Labels
+    \ifx\HyPL@Labels\@empty
+    \else
+      \ifx\HyPL@Labels\HyPL@Useless
+      \else
+        \Hy@PutCatalog{/PageLabels<</Nums[\HyPL@Labels]>>}%
+      \fi
+    \fi
+  }%
+  \g@addto@macro\Hy@EveryPageHook{\HyPL@EveryPage}%
+\fi
+\Hy@DisableOption{pdfpagelabels}
+\ifx\MaybeStopEarly\relax
+\else
+  \Hy@stoppedearlytrue
+  \expandafter\MaybeStopEarly
+\fi
+\Hy@stoppedearlyfalse
+\def\Hy@CounterExists#1{%
+  \begingroup\expandafter\expandafter\expandafter\endgroup
+  \expandafter\ifx\csname c@#1\endcsname\relax
+    \expandafter\@gobble
+  \else
+    \begingroup\expandafter\expandafter\expandafter\endgroup
+    \expandafter\ifx\csname the#1\endcsname\relax
+      \expandafter\expandafter\expandafter\@gobble
+    \else
+      \expandafter\expandafter\expandafter\@firstofone
+    \fi
+  \fi
+}
+\Hy@CounterExists{section}{%
+  \providecommand\theHequation{\theHsection.\arabic{equation}}%
+}
+\Hy@CounterExists{part}{%
+  \providecommand\theHpart{\arabic{part}}%
+}
+\ltx@IfUndefined{thechapter}{%
+  \providecommand\theHsection    {\arabic{section}}%
+  \providecommand\theHfigure     {\arabic{figure}}%
+  \providecommand\theHtable      {\arabic{table}}%
+}{%
+  \providecommand\theHchapter    {\arabic{chapter}}%
+  \providecommand\theHfigure     {\theHchapter.\arabic{figure}}%
+  \providecommand\theHtable      {\theHchapter.\arabic{table}}%
+  \providecommand\theHsection    {\theHchapter.\arabic{section}}%
+}
+\providecommand\theHsubsection   {\theHsection.\arabic{subsection}}
+\providecommand\theHsubsubsection{\theHsubsection.\arabic{subsubsection}}
+\providecommand\theHparagraph    {\theHsubsubsection.\arabic{paragraph}}
+\providecommand\theHsubparagraph {\theHparagraph.\arabic{subparagraph}}
+\providecommand\theHtheorem      {\theHsection.\arabic{theorem}}
+\providecommand\theHthm          {\theHsection.\arabic{thm}}
+\let\H@item\item
+\newcounter{Item}
+\def\theHItem{\arabic{Item}}
+\def\item{%
+  \@hyper@itemfalse
+  \if@nmbrlist\@hyper@itemtrue\fi
+  \H@item
+}
+\providecommand\theHenumi     {\theHItem}
+\providecommand\theHenumii    {\theHItem}
+\providecommand\theHenumiii   {\theHItem}
+\providecommand\theHenumiv    {\theHItem}
+\providecommand\theHHfootnote {\arabic{Hfootnote}}
+\providecommand\theHmpfootnote{\arabic{mpfootnote}}
+\@ifundefined{theHHmpfootnote}{%
+  \let\theHHmpfootnote\theHHfootnote
+}{}
+\let\H@refstepcounter\refstepcounter
+\edef\name@of@eq{equation}%
+\edef\name@of@slide{slide}%
+\newif\if@hyper@item
+\newif\if@skiphyperref
+\@hyper@itemfalse
+\@skiphyperreffalse
+\def\refstepcounter#1{%
+  \ifHy@pdfstring
+  \else
+    \H@refstepcounter{#1}%
+    \edef\This@name{#1}%
+    \ifx\This@name\name@of@slide
+    \else
+      \if@skiphyperref
+      \else
+        \if@hyper@item
+          \stepcounter{Item}%
+          \hyper@refstepcounter{Item}%
+          \@hyper@itemfalse
+        \else
+          \hyper@refstepcounter{#1}%
+        \fi
+      \fi
+    \fi
+  \fi
+}
+\let\Hy@saved@refstepcounter\refstepcounter
+\@ifpackageloaded{amsmath}{}{\newif\ifmeasuring@\measuring@false}
+\def\hyper@refstepcounter#1{%
+  \edef\This@name{#1}%
+  \ifx\This@name\name@of@eq
+    \@ifundefined{theHequation}{%
+      \make@stripped@name{\theequation}%
+      \let\theHequation\newname
+    }{}%
+  \fi
+  \@ifundefined{theH#1}{%
+    \expandafter\def\csname theH#1\endcsname{\arabic{#1}}%
+  }{}%
+  \hyper@makecurrent{#1}%
+  \ifmeasuring@
+  \else
+    \Hy@raisedlink{%
+      \hyper@anchorstart{\@currentHref}\hyper@anchorend
+    }%
+  \fi
+}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname chapter\endcsname\relax
+  \def\Hy@chapterstring{section}%
+\else
+  \def\Hy@chapterstring{chapter}%
+\fi
+\def\Hy@appendixstring{appendix}
+\def\Hy@chapapp{\Hy@chapterstring}
+\ltx@IfUndefined{appendix}{%
+}{%
+  \let\HyOrg@appendix\appendix
+  \def\Hy@AlphNoErr#1{%
+    \ifnum\value{#1}>26 %
+      Alph\number\value{#1}%
+    \else
+      \ifnum\value{#1}<1 %
+        Alph\number\value{#1}%
+      \else
+        \Alph{#1}%
+      \fi
+    \fi
+  }%
+  \def\appendix{%
+    \ltx@IfUndefined{chapter}{%
+      \gdef\theHsection{\Hy@AlphNoErr{section}}%
+    }{%
+      \gdef\theHchapter{\Hy@AlphNoErr{chapter}}%
+    }%
+    \xdef\Hy@chapapp{\Hy@appendixstring}%
+    \HyOrg@appendix
+  }%
+}
+\def\Hy@Test@alph#1{%
+  \ifcase#1\or
+    a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or
+    k\or l\or m\or n\or o\or p\or q\or r\or s\or t\or
+    u\or v\or w\or x\or y\or z%
+  \else
+    \@ctrerr
+  \fi
+}
+\def\Hy@Test@Alph#1{%
+  \ifcase#1\or
+    A\or B\or C\or D\or E\or F\or G\or H\or I\or J\or
+    K\or L\or M\or N\or O\or P\or Q\or R\or S\or T\or
+    U\or V\or W\or X\or Y\or Z%
+  \else
+    \@ctrerr
+  \fi
+}
+\def\hyper@makecurrent#1{%
+  \begingroup
+    \edef\Hy@param{#1}%
+    \ifx\Hy@param\Hy@chapterstring
+      \let\Hy@param\Hy@chapapp
+    \fi
+    \ifHy@hypertexnames
+      \let\@number\@firstofone
+      \def\@fnsymbol##1{fnsymbol\number##1}%
+      \def\@arabic##1{\number##1}%
+      \ifx\@alph\Hy@Test@alph
+      \else
+        \def\@alph{alph\number}%
+      \fi
+      \ifx\@Alph\Hy@Test@Alph
+      \else
+        \def\@Alph{Alph\number}%
+      \fi
+      \ifHy@naturalnames
+        \let\textlatin\@firstofone
+        \xdef\HyperGlobalCurrentHref{\csname the#1\endcsname}%
+      \else
+        \xdef\HyperGlobalCurrentHref{%
+          \csname
+            the%
+            \expandafter\ifx\csname theH#1\endcsname\relax\else H\fi
+            #1%
+          \endcsname
+        }%
+      \fi
+      \xdef\HyperGlobalCurrentHref{%
+        \Hy@param.\expandafter\strip@prefix\meaning\HyperGlobalCurrentHref
+      }%
+    \else
+      \Hy@GlobalStepCount\Hy@linkcounter
+      \xdef\HyperGlobalCurrentHref{\Hy@param.\the\Hy@linkcounter}%
+    \fi
+  \endgroup
+  \let\HyperLocalCurrentHref\HyperGlobalCurrentHref
+  \ifHy@localanchorname
+    \let\@currentHref\HyperLocalCurrentHref
+  \else
+    \global\let\@currentHref\HyperGlobalCurrentHref
+  \fi
+}
+\def\Hy@MakeCurrentHref#1{%
+  \edef\HyperLocalCurrentHref{#1}%
+  \@onelevel@sanitize\HyperLocalCurrentHref
+  \global\let\HyperGlobalCurrentHref\HyperLocalCurrentHref
+  \let\HyperLocalCurrentHref\HyperGlobalCurrentHref
+  \ifHy@localanchorname
+    \let\@currentHref\HyperLocalCurrentHref
+  \else
+    \global\let\@currentHref\HyperGlobalCurrentHref
+  \fi
+}
+\def\Hy@MakeCurrentHrefAuto#1{%
+  \Hy@GlobalStepCount\Hy@linkcounter
+  \Hy@MakeCurrentHref{#1.\the\Hy@linkcounter}%
+}
+\def\@currentHlabel{\@currentHref}
+\@ifpackageloaded{fancyvrb}{%
+  \@ifpackagelater{fancyvrb}{1998/05/20}{}{%
+    \def\FV@StepLineNo{%
+      \FV@SetLineNo
+      \def\FV@StepLineNo{\H@refstepcounter{FancyVerbLine}}%
+      \FV@StepLineNo
+    }%
+  }%
+}{}
+\Hy@AtBeginDocument{%
+  \@ifclassloaded{revtex4}{%
+    \@namedef{ver@lastpage.sty}{1994/06/25}%
+  }{}%
+  \@ifpackageloaded{lastpage}{%
+    \ifHy@pageanchor
+    \else
+      \Hy@WarningNoLine{%
+        The \string\pageref{LastPage} link doesn't work\MessageBreak
+        with disabled option `pageanchor'%
+      }%
+    \fi
+    \def\lastpage@putlabel{%
+      \addtocounter{page}{-1}%
+      \if@filesw
+        \begingroup
+          \let\@number\@firstofone
+          \ifHy@pageanchor
+            \ifHy@hypertexnames
+              \ifHy@plainpages
+                \def\Hy@temp{\arabic{page}}%
+              \else
+                \Hy@unicodefalse
+                \pdfstringdef\Hy@temp{\thepage}%
+              \fi
+            \else
+              \def\Hy@temp{\the\Hy@pagecounter}%
+            \fi
+          \fi
+          \immediate\write\@auxout{%
+            \string\newlabel
+              {LastPage}{{}{\thepage}{}{%
+                \ifHy@pageanchor page.\Hy@temp\fi}{}}%
+          }%
+        \endgroup
+      \fi
+      \addtocounter{page}{1}%
+    }%
+    \@ifclassloaded{revtex4}{%
+      \begingroup
+        \toks@\expandafter{\lastpage@putlabel}%
+        \edef\x{\endgroup
+          \def\noexpand\lastpage@putlabel{%
+            \noexpand\stepcounter{page}%
+            \the\toks@
+            \noexpand\addtocounter{page}\noexpand\m@ne
+          }%
+        }%
+      \x
+    }{}%
+  }{}%
+}
+\def\hypergetref#1{\getrefbykeydefault{#1}{}{??}}
+\def\hypergetpageref#1{\getrefbykeydefault{#1}{page}{0}}
+\@ifpackageloaded{titlesec}{%
+  \def\ttl@Hy@steplink#1{%
+    \Hy@MakeCurrentHrefAuto{#1*}%
+    \edef\ttl@Hy@saveanchor{%
+      \noexpand\Hy@raisedlink{%
+        \noexpand\hyper@anchorstart{\@currentHref}%
+        \noexpand\hyper@anchorend
+        \def\noexpand\ttl@Hy@SavedCurrentHref{\@currentHref}%
+        \noexpand\ttl@Hy@PatchSaveWrite
+      }%
+    }%
+  }%
+  \def\ttl@Hy@PatchSaveWrite{%
+    \begingroup
+      \toks@\expandafter{\ttl@savewrite}%
+      \edef\x{\endgroup
+        \def\noexpand\ttl@savewrite{%
+          \let\noexpand\@currentHref
+              \noexpand\ttl@Hy@SavedCurrentHref
+          \the\toks@
+        }%
+      }%
+    \x
+  }%
+  \def\ttl@Hy@refstepcounter#1{%
+    \let\ttl@b\Hy@raisedlink
+    \def\Hy@raisedlink##1{%
+      \def\ttl@Hy@saveanchor{\Hy@raisedlink{##1}}%
+    }%
+    \refstepcounter{#1}%
+    \let\Hy@raisedlink\ttl@b
+  }%
+}{}
+\@ifpackageloaded{titletoc}{%
+  \def\ttl@gobblecontents#1#2#3#4{\ignorespaces}%
+}{}
+\def\Hy@varioref@undefined{{??}{??}{}{}{}}
+\@ifpackageloaded{varioref}{%
+  \def\vref@pagenum#1#2{%
+    \@ifundefined{r@#2}{%
+      \expandafter\let\csname r@#2\endcsname\Hy@varioref@undefined
+    }{}%
+    \edef#1{\getpagerefnumber{#2}}%
+  }%
+}{}
+\def\Hy@varioref@refstepcounter#1{%
+  \stepcounter{#1}%
+  \protected@edef\@currentlabel{%
+    \csname p@#1\expandafter\endcsname\csname the#1\endcsname
+  }%
+}
+\AtBeginDocument{%
+  \ifx\refstepcounter\Hy@varioref@refstepcounter
+    \let\H@refstepcounter\refstepcounter
+    \let\refstepcounter\Hy@saved@refstepcounter
+  \fi
+}
+\@ifpackageloaded{longtable}{%
+  \begingroup
+    \def\y{\LT@array}%
+    \@ifundefined{scr@LT@array}{%
+      \@ifundefined{adl@LT@array}{}{\def\y{\adl@LT@array}}%
+    }{\def\y{\scr@LT@array}}%
+    \long\def\x\refstepcounter#1#2\@sharp#3#4\@nil{%
+      \expandafter\endgroup
+      \expandafter\def\y[##1]##2{%
+        \H@refstepcounter{#1}%
+        \hyper@makecurrent{table}%
+        \let\Hy@LT@currentHref\@currentHref
+        #2\@sharp#####4%
+      }%
+    }%
+  \expandafter\expandafter\expandafter\x\y[{#1}]{#2}\@nil
+  \begingroup
+    \def\x#1\ifvoid\LT@foot#2\fi#3\@nil{%
+      \endgroup
+      \def\LT@start{%
+        #1%
+        \ifvoid\LT@foot#2\fi
+        \let\@currentHref\Hy@LT@currentHref
+        \Hy@raisedlink{%
+          \hyper@anchorstart{\@currentHref}\hyper@anchorend
+        }%
+        #3%
+      }%
+    }%
+  \expandafter\x\LT@start\@nil
+}{}
+\let\new@refstepcounter\refstepcounter
+\let\H@equation\equation
+\let\H@endequation\endequation
+\@ifpackageloaded{amsmath}{%
+  \long\def\Hy@temp{%
+    \incr@eqnum
+    \mathdisplay@push
+    \st@rredfalse \global\@eqnswtrue
+    \mathdisplay{equation}%
+  }%
+  \ifx\Hy@temp\equation
+    \expandafter\ifx\csname if@fleqn\expandafter\endcsname
+                    \csname iftrue\endcsname
+    \else
+      \long\def\equation{%
+        \mathdisplay@push
+        \st@rredfalse \global\@eqnswtrue
+        \mathdisplay{equation}%
+        \incr@eqnum
+      }%
+    \fi
+  \fi
+}{%
+  \def\equation{%
+    \let\refstepcounter\H@refstepcounter
+    \H@equation
+    \@ifundefined{theHequation}{%
+      \make@stripped@name{\theequation}%
+      \let\theHequation\newname
+    }{}%
+    \hyper@makecurrent{equation}%
+    \mathopen{%
+      \Hy@raisedlink{\hyper@anchorstart{\@currentHref}}%
+    }%
+    \let\refstepcounter\new@refstepcounter
+  }%
+  \def\endequation{%
+    \ifx\Hy@raisedlink\ltx@empty
+      \hyper@anchorend
+    \else
+      \mathclose{\Hy@raisedlink{\hyper@anchorend}}%
+    \fi
+    \H@endequation
+  }%
+}
+\newif\if@eqnstar
+\@eqnstarfalse
+\let\H@eqnarray\eqnarray
+\let\H@endeqnarray\endeqnarray
+\def\eqnarray{%
+  \let\Hy@reserved@a\relax
+  \def\@currentHref{}%
+  \H@eqnarray
+  \if@eqnstar
+  \else
+    \ifx\\\@currentHref\\%
+    \else
+      \@ifundefined{theHequation}{%
+        \make@stripped@name{\theequation}%
+        \let\theHequation\newname
+      }{}%
+      \hyper@makecurrent{equation}%
+      \mathopen{%
+        \Hy@raisedlink{%
+          \hyper@anchorstart{\@currentHref}\hyper@anchorend
+        }%
+      }%
+    \fi
+  \fi
+}
+\def\endeqnarray{%
+  \H@endeqnarray
+}
+\@namedef{eqnarray*}{%
+  \def\@eqncr{\nonumber\@seqncr}\@eqnstartrue\eqnarray
+}
+\@namedef{endeqnarray*}{%
+  \nonumber\endeqnarray\@eqnstarfalse
+}
+\ltx@IfUndefined{subeqnarray}{}{%
+  \let\H@subeqnarray\subeqnarray
+  \let\H@endsubeqnarray\endsubeqnarray
+  \def\subeqnarray{%
+    \let\Hy@reserved@a\relax
+    \H@subeqnarray
+    \@ifundefined{theHequation}{%
+      \make@stripped@name{\theequation}%
+      \let\theHequation\newname
+    }{}%
+    \hyper@makecurrent{equation}%
+    \hyper@anchorstart{\@currentHref}{}\hyper@anchorend
+  }%
+  \def\endsubeqnarray{%
+    \H@endsubeqnarray
+  }%
+  \providecommand\theHsubequation{\theHequation\alph{subequation}}%
+}
+\def\make@stripped@name#1{%
+  \begingroup
+    \escapechar\m@ne
+    \global\let\newname\@empty
+    \protected@edef\Hy@tempa{#1}%
+    \edef\@tempb{%
+      \noexpand\@tfor\noexpand\Hy@tempa:=%
+        \expandafter\strip@prefix\meaning\Hy@tempa
+    }%
+    \@tempb\do{%
+      \if{\Hy@tempa\else
+        \if}\Hy@tempa\else
+          \xdef\newname{\newname\Hy@tempa}%
+        \fi
+      \fi
+    }%
+  \endgroup
+}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname subequations\endcsname\relax
+\else
+  \let\HyOrg@subequations\subequations
+  \def\subequations{%
+    \stepcounter{equation}%
+    \protected@edef\theHparentequation{%
+      \@ifundefined{theHequation}\theequation\theHequation
+    }%
+    \addtocounter{equation}{-1}%
+    \HyOrg@subequations
+    \def\theHequation{\theHparentequation\alph{equation}}%
+    \ignorespaces
+  }%
+\fi
+\@ifpackageloaded{amsthm}{%
+  \def\Hy@temp#1#2#3{%
+    \ifhmode\unskip\unskip\par\fi
+    \normalfont
+    \trivlist
+    \let\thmheadnl\relax
+    \let\thm@swap\@gobble
+    \let\thm@indent\indent % indent
+    \thm@headfont{\scshape}% heading font small caps
+    \thm@notefont{\fontseries\mddefault\upshape}%
+    \thm@headpunct{.}% add period after heading
+    \thm@headsep 5\p@ plus\p@ minus\p@\relax
+    \thm@space@setup
+    #1% style overrides
+    \@topsep \thm@preskip               % used by thm head
+    \@topsepadd \thm@postskip           % used by \@endparenv
+    \def\@tempa{#2}\ifx\@empty\@tempa
+      \def\@tempa{\@oparg{\@begintheorem{#3}{}}[]}%
+    \else
+      \refstepcounter{#2}%
+      \def\@tempa{\@oparg{\@begintheorem{#3}{\csname the#2\endcsname}}[]}%
+    \fi
+    \@tempa
+  }%
+  \ifx\Hy@temp\@thm
+    \def\@thm#1#2#3{%
+      \ifhmode
+        \unskip\unskip\par
+      \fi
+      \normalfont
+      \trivlist
+      \let\thmheadnl\relax
+      \let\thm@swap\@gobble
+      \let\thm@indent\indent % indent
+      \thm@headfont{\scshape}% heading font small caps
+      \thm@notefont{\fontseries\mddefault\upshape}%
+      \thm@headpunct{.}% add period after heading
+      \thm@headsep 5\p@ plus\p@ minus\p@\relax
+      \thm@space@setup
+      #1% style overrides
+      \@topsep \thm@preskip               % used by thm head
+      \@topsepadd \thm@postskip           % used by \@endparenv
+      \def\dth@counter{#2}%
+      \ifx\@empty\dth@counter
+        \def\@tempa{%
+          \@oparg{\@begintheorem{#3}{}}[]%
+        }%
+      \else
+        \H@refstepcounter{#2}%
+        \hyper@makecurrent{#2}%
+        \let\Hy@dth@currentHref\@currentHref
+        \def\@tempa{%
+          \@oparg{\@begintheorem{#3}{\csname the#2\endcsname}}[]%
+        }%
+      \fi
+      \@tempa
+    }%
+  \else
+    \def\@thm#1#2#3{%
+      \ifhmode
+        \unskip\unskip\par
+      \fi
+      \normalfont
+      \trivlist
+      \let\thmheadnl\relax
+      \let\thm@swap\@gobble
+      \thm@notefont{\fontseries\mddefault\upshape}%
+      \thm@headpunct{.}% add period after heading
+      \thm@headsep 5\p@ plus\p@ minus\p@\relax
+      \thm@space@setup
+      #1% style overrides
+      \@topsep \thm@preskip               % used by thm head
+      \@topsepadd \thm@postskip           % used by \@endparenv
+      \def\dth@counter{#2}%
+      \ifx\@empty\dth@counter
+        \def\@tempa{%
+          \@oparg{\@begintheorem{#3}{}}[]%
+        }%
+      \else
+        \H@refstepcounter{#2}%
+        \hyper@makecurrent{#2}%
+        \let\Hy@dth@currentHref\@currentHref
+        \def\@tempa{%
+          \@oparg{\@begintheorem{#3}{\csname the#2\endcsname}}[]%
+        }%
+      \fi
+      \@tempa
+    }%
+  \fi
+  \dth@everypar={%
+    \@minipagefalse
+    \global\@newlistfalse
+    \@noparitemfalse
+    \if@inlabel
+      \global\@inlabelfalse
+      \begingroup
+        \setbox\z@\lastbox
+        \ifvoid\z@
+          \kern-\itemindent
+        \fi
+      \endgroup
+      \ifx\@empty\dth@counter
+      \else
+        \Hy@raisedlink{%
+          \hyper@anchorstart{%
+            \ltx@ifundefined{Hy@dth@currentHref}%
+            \@currentHref\Hy@dth@currentHref
+          }\hyper@anchorend
+        }%
+      \fi
+      \unhbox\@labels
+    \fi
+    \if@nobreak
+      \@nobreakfalse \clubpenalty\@M
+    \else
+      \clubpenalty\@clubpenalty \everypar{}%
+    \fi
+  }%
+}{}
+\ifHy@hyperfootnotes
+  \newcounter{Hfootnote}%
+  \let\H@@footnotetext\@footnotetext
+  \let\H@@footnotemark\@footnotemark
+  \def\@xfootnotenext[#1]{%
+    \begingroup
+      \csname c@\@mpfn\endcsname #1\relax
+      \unrestored@protected@xdef\@thefnmark{\thempfn}%
+    \endgroup
+    \ifx\@footnotetext\@mpfootnotetext
+      \expandafter\H@@mpfootnotetext
+    \else
+      \expandafter\H@@footnotetext
+    \fi
+  }%
+  \def\@xfootnotemark[#1]{%
+    \begingroup
+      \c@footnote #1\relax
+      \unrestored@protected@xdef\@thefnmark{\thefootnote}%
+    \endgroup
+    \H@@footnotemark
+  }%
+  \let\H@@mpfootnotetext\@mpfootnotetext
+  \long\def\@mpfootnotetext#1{%
+    \H@@mpfootnotetext{%
+      \ifHy@nesting
+        \expandafter\ltx@firstoftwo
+      \else
+        \expandafter\ltx@secondoftwo
+      \fi
+      {%
+        \expandafter\hyper@@anchor\expandafter{%
+          \Hy@footnote@currentHref
+         }{#1}%
+      }{%
+        \Hy@raisedlink{%
+          \expandafter\hyper@@anchor\expandafter{%
+            \Hy@footnote@currentHref
+          }{\relax}%
+        }#1%
+      }%
+    }%
+  }%
+  \long\def\@footnotetext#1{%
+    \H@@footnotetext{%
+      \ifHy@nesting
+        \expandafter\ltx@firstoftwo
+      \else
+        \expandafter\ltx@secondoftwo
+      \fi
+      {%
+        \expandafter\hyper@@anchor\expandafter{%
+          \Hy@footnote@currentHref
+        }{#1}%
+      }{%
+        \Hy@raisedlink{%
+          \expandafter\hyper@@anchor\expandafter{%
+            \Hy@footnote@currentHref
+          }{\relax}%
+        }%
+        \let\@currentHref\Hy@footnote@currentHref
+        \let\@currentlabelname\@empty
+        #1%
+      }%
+    }%
+  }%
+  \def\@footnotemark{%
+    \leavevmode
+    \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi
+    \stepcounter{Hfootnote}%
+    \global\let\Hy@saved@currentHref\@currentHref
+    \hyper@makecurrent{Hfootnote}%
+    \global\let\Hy@footnote@currentHref\@currentHref
+    \global\let\@currentHref\Hy@saved@currentHref
+    \hyper@linkstart{link}{\Hy@footnote@currentHref}%
+    \@makefnmark
+    \hyper@linkend
+    \ifhmode\spacefactor\@x@sf\fi
+    \relax
+  }%
+  \@ifpackageloaded{tabularx}{%
+    \let\HyOrg@TX@endtabularx\TX@endtabularx
+    \def\Hy@tabularx@hook{%
+      \let\@footnotetext\H@@footnotetext
+      \let\@footnotemark\H@@footnotemark
+      \let\@mpfootnotetext\H@@mpfootnotetext
+    }%
+    \begingroup
+      \toks@\expandafter{\TX@endtabularx}%
+      \xdef\Hy@gtemp{%
+        \noexpand\Hy@tabularx@hook
+        \the\toks@
+      }%
+    \endgroup
+    \let\TX@endtabularx\Hy@gtemp
+  }{}%
+  \@ifpackageloaded{longtable}{%
+    \CheckCommand*{\LT@p@ftntext}[1]{%
+      \edef\@tempa{%
+        \the\LT@p@ftn
+        \noexpand\footnotetext[\the\c@footnote]%
+      }%
+      \global\LT@p@ftn\expandafter{\@tempa{#1}}%
+    }%
+    \long\def\LT@p@ftntext#1{%
+      \edef\@tempa{%
+        \the\LT@p@ftn
+        \begingroup
+          \noexpand\c@footnote=\the\c@footnote\relax
+          \noexpand\protected@xdef\noexpand\@thefnmark{%
+            \noexpand\thempfn
+          }%
+          \noexpand\Hy@LT@footnotetext{%
+            \Hy@footnote@currentHref
+          }%
+      }%
+      \global\LT@p@ftn\expandafter{%
+          \@tempa{#1}%
+        \endgroup
+      }%
+    }%
+    \long\def\Hy@LT@footnotetext#1#2{%
+      \H@@footnotetext{%
+        \ifHy@nesting
+          \hyper@@anchor{#1}{#2}%
+        \else
+          \Hy@raisedlink{%
+            \hyper@@anchor{#1}{\relax}%
+          }%
+          \def\@currentHref{#1}%
+          \let\@currentlabelname\@empty
+          #2%
+        \fi
+      }%
+    }%
+  }{}%
+  \@ifpackageloaded{fancyvrb}{%
+    \def\V@@footnotetext{%
+      \insert\footins\bgroup
+      \csname reset@font\endcsname
+      \footnotesize
+      \interlinepenalty\interfootnotelinepenalty
+      \splittopskip\footnotesep
+      \splitmaxdepth\dp\strutbox
+      \floatingpenalty \@MM
+      \hsize\columnwidth
+      \@parboxrestore
+      \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}%
+      \@makefntext{}%
+      \rule{\z@}{\footnotesep}%
+      \bgroup
+      \aftergroup\V@@@footnotetext
+      \Hy@raisedlink{%
+        \expandafter\hyper@@anchor\expandafter{%
+          \Hy@footnote@currentHref
+        }{\relax}%
+      }%
+      \let\@currentHref\Hy@footnote@currentHref
+      \let\@currentlabelname\@empty
+      \ignorespaces
+    }%
+  }{}%
+  \def\Hy@temp#1{%
+    \begingroup
+      \unrestored@protected@xdef\@thefnmark{\ref{#1}}%
+    \endgroup
+    \@footnotemark
+  }%
+  \ifx\Hy@temp\footref
+    \def\footref#1{%
+    \begingroup
+      \unrestored@protected@xdef\@thefnmark{\ref{#1}}%
+    \endgroup
+    \H@@footnotemark
+    }%
+  \fi
+  \let\HyOrg@maketitle\maketitle
+  \def\maketitle{%
+    \let\Hy@saved@footnotemark\@footnotemark
+    \let\Hy@saved@footnotetext\@footnotetext
+    \let\@footnotemark\H@@footnotemark
+    \let\@footnotetext\H@@footnotetext
+    \@ifnextchar[\Hy@maketitle@optarg{% ]
+      \HyOrg@maketitle
+      \Hy@maketitle@end
+    }%
+  }%
+  \def\Hy@maketitle@optarg[#1]{%
+    \HyOrg@maketitle[{#1}]%
+    \Hy@maketitle@end
+  }%
+  \def\Hy@maketitle@end{%
+    \ifx\@footnotemark\H@@footnotemark
+      \let\@footnotemark\Hy@saved@footnotemark
+    \fi
+    \ifx\@footnotetext\H@@footnotetext
+      \let\@footnotetext\Hy@saved@footnotetext
+    \fi
+  }%
+  \def\realfootnote{%
+    \@ifnextchar[\@xfootnote{%
+      \stepcounter{\@mpfn}%
+      \protected@xdef\@thefnmark{\thempfn}%
+      \H@@footnotemark\H@@footnotetext
+    }%
+  }%
+\fi
+\Hy@DisableOption{hyperfootnotes}
+\def\caption{%
+  \ifx\@captype\@undefined
+    \@latex@error{\noexpand\caption outside float}\@ehd
+    \expandafter\@gobble
+  \else
+    \H@refstepcounter\@captype
+    \let\Hy@tempa\@caption
+    \@ifundefined{float@caption}{%
+    }{%
+      \expandafter\ifx\csname @float@c@\@captype\endcsname
+                      \float@caption
+        \let\Hy@tempa\Hy@float@caption
+      \fi
+    }%
+    \expandafter\@firstofone
+  \fi
+  {\@dblarg{\Hy@tempa\@captype}}%
+}
+\long\def\@caption#1[#2]#3{%
+  \expandafter\ifx\csname if@capstart\expandafter\endcsname
+                  \csname iftrue\endcsname
+    \global\let\@currentHref\hc@currentHref
+  \else
+    \hyper@makecurrent{\@captype}%
+  \fi
+  \@ifundefined{NR@gettitle}{%
+    \def\@currentlabelname{#2}%
+  }{%
+    \NR@gettitle{#2}%
+  }%
+  \par\addcontentsline{\csname ext@#1\endcsname}{#1}{%
+    \protect\numberline{\csname the#1\endcsname}{\ignorespaces #2}%
+  }%
+  \begingroup
+    \@parboxrestore
+    \if@minipage
+      \@setminipage
+    \fi
+    \normalsize
+    \expandafter\ifx\csname if@capstart\expandafter\endcsname
+                    \csname iftrue\endcsname
+      \global\@capstartfalse
+      \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces#3}%
+    \else
+      \@makecaption{\csname fnum@#1\endcsname}{%
+        \ignorespaces
+        \ifHy@nesting
+          \expandafter\hyper@@anchor\expandafter{\@currentHref}{#3}%
+        \else
+          \Hy@raisedlink{%
+            \expandafter\hyper@@anchor\expandafter{%
+              \@currentHref
+            }{\relax}%
+          }%
+          #3%
+        \fi
+      }%
+    \fi
+    \par
+  \endgroup
+}
+\let\Hy@float@caption\@caption
+\@ifpackageloaded{float}{%
+  \def\Hy@float@caption{%
+    \ifx\Hy@float@currentHref\@undefined
+      \hyper@makecurrent{\@captype}%
+      \global\let\Hy@float@currentHref\@currentHref
+    \else
+      \let\@currentHref\Hy@float@currentHref
+    \fi
+    \float@caption
+  }%
+  \let\HyOrg@float@makebox\float@makebox
+  \renewcommand{\float@makebox}[1]{%
+    \HyOrg@float@makebox{%
+      #1\relax
+      \ifx\Hy@float@currentHref\@undefined
+      \else
+        \expandafter\hyper@@anchor\expandafter{%
+          \Hy@float@currentHref
+        }{\relax}%
+        \global\let\Hy@float@currentHref\@undefined
+      \fi
+    }%
+  }%
+}{}
+\def\hyper@natlinkstart#1{%
+  \Hy@backout{#1}%
+  \hyper@linkstart{cite}{cite.#1}%
+  \def\hyper@nat@current{#1}%
+}
+\def\hyper@natlinkend{%
+  \hyper@linkend
+}
+\def\hyper@natlinkbreak#1#2{%
+  \hyper@linkend#1\hyper@linkstart{cite}{cite.#2}%
+}
+\def\hyper@natanchorstart#1{%
+  \Hy@raisedlink{\hyper@anchorstart{cite.#1}}%
+}
+\def\hyper@natanchorend{\hyper@anchorend}
+\ltx@IfUndefined{NAT@parse}{%
+  \providecommand*\@extra@binfo{}%
+  \providecommand*\@extra@b@citeb{}%
+  \def\bibcite#1#2{%
+    \@newl@bel{b}{#1\@extra@binfo}{%
+      \hyper@@link[cite]{}{cite.#1\@extra@b@citeb}{#2}%
+    }%
+  }%
+  \gdef\@extra@binfo{}%
+  \let\Hy@bibcite\bibcite
+  \begingroup
+    \@ifundefined{bbl@cite@choice}{}{%
+      \g@addto@macro\bbl@cite@choice{%
+        \let\bibcite\Hy@bibcite
+      }%
+    }%
+  \endgroup
+  \providecommand*{\@BIBLABEL}{\@biblabel}%
+  \def\@lbibitem[#1]#2{%
+    \@skiphyperreftrue
+    \H@item[%
+      \ifx\Hy@raisedlink\@empty
+        \hyper@anchorstart{cite.#2\@extra@b@citeb}%
+          \@BIBLABEL{#1}%
+        \hyper@anchorend
+      \else
+        \Hy@raisedlink{%
+          \hyper@anchorstart{cite.#2\@extra@b@citeb}\hyper@anchorend
+        }%
+        \@BIBLABEL{#1}%
+      \fi
+      \hfill
+    ]%
+    \@skiphyperreffalse
+    \if@filesw
+      \begingroup
+        \let\protect\noexpand
+        \immediate\write\@auxout{%
+          \string\bibcite{#2}{#1}%
+        }%
+      \endgroup
+    \fi
+    \ignorespaces
+  }%
+  \def\@bibitem#1{%
+    \@skiphyperreftrue\H@item\@skiphyperreffalse
+    \Hy@raisedlink{%
+      \hyper@anchorstart{cite.#1\@extra@b@citeb}\relax\hyper@anchorend
+    }%
+    \if@filesw
+      \begingroup
+        \let\protect\noexpand
+        \immediate\write\@auxout{%
+          \string\bibcite{#1}{\the\value{\@listctr}}%
+        }%
+      \endgroup
+    \fi
+    \ignorespaces
+  }%
+}{}
+\@ifclassloaded{revtex}{%
+  \Hy@Info{*** compatibility with revtex **** }%
+  \def\revtex@checking#1#2{%
+    \expandafter\let\expandafter\T@temp\csname b@#1\endcsname
+    \expandafter\def\csname b@#1\endcsname{#2}%
+    \@SetMaxRnhefLabel{#1}%
+    \expandafter\let\csname b@#1\endcsname\T@temp
+  }%
+  \@ifundefined{@CITE}{\def\@CITE{\@cite}}{}%
+  \providecommand*{\@extra@b@citeb}{}%
+  \def\@CITEX[#1]#2{%
+    \let\@citea\@empty
+    \leavevmode
+    \unskip
+    $^{%
+      \scriptstyle
+      \@CITE{%
+        \@for\@citeb:=#2\do{%
+          \@citea
+          \def\@citea{,\penalty\@m\ }%
+          \edef\@citeb{\expandafter\@firstofone\@citeb}%
+          \if@filesw
+            \immediate\write\@auxout{\string\citation{\@citeb}}%
+          \fi
+          \@ifundefined{b@\@citeb\extra@b@citeb}{%
+            \mbox{\reset@font\bfseries ?}%
+            \G@refundefinedtrue
+            \@latex@warning{%
+              Citation `\@citeb' on page \thepage \space undefined%
+            }%
+          }{%
+            {\csname b@\@citeb\@extra@b@citeb\endcsname}%
+          }%
+        }%
+      }{#1}%
+    }$%
+  }%
+  \def\@citex[#1]#2{%
+    \let\@citea\@empty
+    \@cite{%
+      \@for\@citeb:=#2\do{%
+        \@citea
+        \def\@citea{,\penalty\@m\ }%
+        \edef\@citeb{\expandafter\@firstofone\@citeb}%
+        \if@filesw
+          \immediate\write\@auxout{\string\citation{\@citeb}}%
+        \fi
+        \@ifundefined{b@\@citeb\@extra@b@citeb}{%
+          \mbox{\reset@font\bfseries ?}%
+          \G@refundefinedtrue
+          \@latex@warning{%
+            Citation `\@citeb' on page \thepage \space undefined%
+          }%
+        }{%
+          \hbox{\csname b@\@citeb\@extra@b@citeb\endcsname}%
+        }%
+      }%
+    }{#1}%
+  }%
+}{}
+\@ifpackageloaded{harvard}{%
+  \Hy@AtBeginDocument{%
+    \Hy@Info{*** compatibility with harvard **** }%
+    \Hy@raiselinksfalse
+    \def\harvardcite#1#2#3#4{%
+      \global\@namedef{HAR@fn@#1}{\hyper@@link[cite]{}{cite.#1}{#2}}%
+      \global\@namedef{HAR@an@#1}{\hyper@@link[cite]{}{cite.#1}{#3}}%
+      \global\@namedef{HAR@yr@#1}{\hyper@@link[cite]{}{cite.#1}{#4}}%
+      \global\@namedef{HAR@df@#1}{\csname HAR@fn@#1\endcsname}%
+    }%
+    \def\HAR@citetoaux#1{%
+      \if@filesw\immediate\write\@auxout{\string\citation{#1}}\fi%
+      \ifHy@backref
+        \ifx\@empty\@currentlabel
+        \else
+          \@bsphack
+          \if@filesw
+            \protected@write\@auxout{}{%
+              \string\@writefile{brf}{%
+                \string\backcite{#1}{%
+                  {\thepage}{\@currentlabel}{\@currentHref}%
+                }%
+              }%
+            }%
+          \fi
+          \@esphack
+        \fi
+      \fi
+    }%
+    \def\harvarditem{%
+      \@ifnextchar[{\@harvarditem}{\@harvarditem[\null]}%
+    }%
+    \def\@harvarditem[#1]#2#3#4#5\par{%
+      \item[]%
+      \hyper@anchorstart{cite.#4}\relax\hyper@anchorend
+      \if@filesw
+        \begingroup
+          \def\protect##1{\string ##1\space}%
+          \ifthenelse{\equal{#1}{\null}}%
+            {\def\next{{#4}{#2}{#2}{#3}}}%
+            {\def\next{{#4}{#2}{#1}{#3}}}%
+          \immediate\write\@auxout{\string\harvardcite\codeof\next}%
+       \endgroup
+      \fi
+      \protect\hspace*{-\labelwidth}%
+      \protect\hspace*{-\labelsep}%
+      \ignorespaces
+      #5%
+      \ifHy@backref
+        \newblock
+        \backref{\csname br@#4\endcsname}%
+      \fi
+      \par
+    }%
+    \long\def\HAR@checkcitations#1#2#3#4{%
+      \def\HAR@tempa{\hyper@@link[cite]{}{cite.#1}{#2}}%
+      \expandafter\ifx\csname HAR@fn@#1\endcsname\HAR@tempa
+        \def\HAR@tempa{\hyper@@link[cite]{}{cite.#1}{#3}}%
+        \expandafter\ifx\csname HAR@an@#1\endcsname\HAR@tempa
+          \def\HAR@tempa{\hyper@@link[cite]{}{cite.#1}{#4}}%
+          \expandafter\ifx\csname HAR@yr@#1\endcsname\HAR@tempa
+          \else
+            \@tempswatrue
+          \fi
+        \else
+          \@tempswatrue
+        \fi
+      \else
+        \@tempswatrue
+      \fi
+    }%
+  }%
+}{}
+\@ifpackageloaded{chicago}{%
+  \def\citeN{%
+    \def\@citeseppen{-1000}%
+    \def\@cite##1##2{##1}%
+    \def\citeauthoryear##1##2##3{##1 (##3\@cite@opt)}%
+    \@citedata@opt
+  }%
+  \def\shortciteN{%
+    \def\@citeseppen{-1000}%
+    \def\@cite##1##2{##1}%
+    \def\citeauthoryear##1##2##3{##2 (##3\@cite@opt)}%
+    \@citedata@opt
+  }%
+  \def\@citedata@opt{%
+    \let\@cite@opt\@empty
+    \@ifnextchar [{%
+      \@tempswatrue
+      \@citedatax@opt
+    }{%
+      \@tempswafalse
+      \@citedatax[]%
+    }%
+  }%
+  \def\@citedatax@opt[#1]{%
+    \def\@cite@opt{, #1}%
+    \@citedatax[{#1}]%
+  }%
+}{}
+\ltx@ifclassloaded{slides}{%
+  \def\Hy@SlidesFormatOptionalPage#1{(#1)}%
+  \def\Hy@PageAnchorSlidesPlain{%
+    \advance\c@page\ltx@one
+    \edef\Hy@TempPageAnchor{%
+      \noexpand\hyper@@anchor{%
+        page.\the\c@slide.\the\c@overlay.\the\c@note%
+        \ifnum\c@page=\ltx@one
+        \else
+          .\the\c@page
+        \fi
+      }%
+    }%
+    \advance\c@page-\ltx@one
+  }%
+  \def\Hy@PageAnchorSlide{%
+    \advance\c@page\ltx@one
+    \ifnum\c@page>\ltx@one
+      \ltx@IfUndefined{theHpage}{%
+        \protected@edef\Hy@TheSlideOptionalPage{%
+          \Hy@SlidesFormatOptionalPage{\thepage}%
+        }%
+      }{%
+        \protected@edef\Hy@TheSlideOptionalPage{%
+          \Hy@SlidesFormatOptionalPage{\theHpage}%
+        }%
+      }%
+    \else
+      \def\Hy@TheSlideOptionalPage{}%
+    \fi
+    \advance\c@page-\ltx@one
+    \pdfstringdef\@the@H@page{%
+      \csname
+        the%
+        \ltx@ifundefined{theH\Hy@SlidesPage}{}{H}%
+        \Hy@SlidesPage
+      \endcsname
+      \Hy@TheSlideOptionalPage
+    }%
+    \ltx@gobblethree
+  }%
+  \def\Hy@SlidesPage{slide}%
+  \g@addto@macro\slide{%
+    \def\Hy@SlidesPage{slide}%
+  }%
+  \g@addto@macro\overlay{%
+    \def\Hy@SlidesPage{overlay}%
+  }%
+  \g@addto@macro\note{%
+    \def\Hy@SlidesPage{note}%
+  }%
+}{%
+  \def\Hy@PageAnchorSlidesPlain{}%
+  \def\Hy@PageAnchorSlide{}%
+}
+\def\Hy@EveryPageAnchor{%
+  \Hy@DistillerDestFix
+  \ifHy@pageanchor
+    \ifHy@hypertexnames
+      \ifHy@plainpages
+        \def\Hy@TempPageAnchor{\hyper@@anchor{page.\the\c@page}}%
+        \Hy@PageAnchorSlidesPlain
+      \else
+        \begingroup
+          \let\@number\@firstofone
+          \Hy@unicodefalse
+          \Hy@PageAnchorSlide
+          \pdfstringdef\@the@H@page{\thepage}%
+        \endgroup
+        \EdefUnescapeString\@the@H@page{\@the@H@page}%
+        \def\Hy@TempPageAnchor{\hyper@@anchor{page.\@the@H@page}}%
+      \fi
+    \else
+      \Hy@GlobalStepCount\Hy@pagecounter
+      \def\Hy@TempPageAnchor{%
+        \hyper@@anchor{page.\the\Hy@pagecounter}%
+      }%
+    \fi
+    \vbox to 0pt{%
+      \kern\voffset
+      \kern\topmargin
+      \kern-1bp\relax
+      \hbox to 0pt{%
+        \kern\hoffset
+        \kern\ifodd\value{page}%
+               \oddsidemargin
+             \else
+               \evensidemargin
+             \fi
+        \kern-1bp\relax
+        \Hy@TempPageAnchor\relax
+        \hss
+      }%
+      \vss
+    }%
+  \fi
+}
+\g@addto@macro\Hy@EveryPageBoxHook{%
+  \Hy@EveryPageAnchor
+}
+\def\addcontentsline#1#2#3{% toc extension, type, tag
+  \begingroup
+    \let\label\@gobble
+    \ifx\@currentHref\@empty
+      \Hy@Warning{%
+        No destination for bookmark of \string\addcontentsline,%
+        \MessageBreak destination is added%
+      }%
+      \phantomsection
+    \fi
+    \expandafter\ifx\csname toclevel@#2\endcsname\relax
+      \begingroup
+        \def\Hy@tempa{#1}%
+        \ifx\Hy@tempa\Hy@bookmarkstype
+          \Hy@WarningNoLine{%
+            bookmark level for unknown #2 defaults to 0%
+          }%
+        \else
+          \Hy@Info{bookmark level for unknown #2 defaults to 0}%
+        \fi
+      \endgroup
+      \expandafter\gdef\csname toclevel@#2\endcsname{0}%
+    \fi
+    \edef\Hy@toclevel{\csname toclevel@#2\endcsname}%
+    \Hy@writebookmark{\csname the#2\endcsname}%
+      {#3}%
+      {\@currentHref}%
+      {\Hy@toclevel}%
+      {#1}%
+    \ifHy@verbose
+      \begingroup
+        \def\Hy@tempa{#3}%
+        \@onelevel@sanitize\Hy@tempa
+        \let\temp@online\on@line
+        \let\on@line\@empty
+        \Hy@Info{%
+          bookmark\temp@online:\MessageBreak
+          thecounter {\csname the#2\endcsname}\MessageBreak
+          text {\Hy@tempa}\MessageBreak
+          reference {\@currentHref}\MessageBreak
+          toclevel {\Hy@toclevel}\MessageBreak
+          type {#1}%
+        }%
+      \endgroup
+    \fi
+    \addtocontents{#1}{%
+      \protect\contentsline{#2}{#3}{\thepage}{\@currentHref}%
+    }%
+  \endgroup
+}
+\def\contentsline#1#2#3#4{%
+  \ifx\\#4\\%
+    \csname l@#1\endcsname{#2}{#3}%
+  \else
+    \ifcase\Hy@linktoc % none
+      \csname l@#1\endcsname{#2}{#3}%
+    \or % section
+      \csname l@#1\endcsname{%
+        \hyper@linkstart{link}{#4}{#2}\hyper@linkend
+      }{#3}%
+    \or % page
+      \csname l@#1\endcsname{{#2}}{%
+        \hyper@linkstart{link}{#4}{#3}\hyper@linkend
+      }%
+    \else % all
+      \csname l@#1\endcsname{%
+        \hyper@linkstart{link}{#4}{#2}\hyper@linkend
+      }{%
+        \hyper@linkstart{link}{#4}{#3}\hyper@linkend
+      }%
+    \fi
+  \fi
+}
+\let\H@definecounter\@definecounter
+\def\@definecounter#1{%
+  \H@definecounter{#1}%
+  \expandafter\def\csname theH#1\endcsname{\arabic{#1}}%
+}
+\let\H@newctr\@newctr
+\def\@newctr#1[#2]{%
+  \H@newctr#1[{#2}]%
+  \expandafter\def\csname theH#1\endcsname{%
+    \csname the\@ifundefined{theH#2}{}{H}#2\endcsname.\arabic{#1}%
+  }%
+}
+\@ifpackageloaded{amsmath}{%
+  \def\Hy@make@anchor{%
+    \Hy@MakeCurrentHrefAuto{AMS}%
+    \Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
+  }%
+  \def\Hy@make@df@tag@@#1{%
+    \gdef\df@tag{%
+      \maketag@@@{\Hy@make@anchor#1}%
+      \def\@currentlabel{#1}%
+    }%
+  }%
+  \def\Hy@make@df@tag@@@#1{%
+    \gdef\df@tag{%
+      \tagform@{\Hy@make@anchor#1}%
+      \toks@\@xp{\p@equation{#1}}%
+      \edef\@currentlabel{\the\toks@}%
+    }%
+  }%
+  \let\HyOrg@make@df@tag@@\make@df@tag@@
+  \let\HyOrg@make@df@tag@@@\make@df@tag@@@
+  \let\make@df@tag@@\Hy@make@df@tag@@
+  \let\make@df@tag@@@\Hy@make@df@tag@@@
+}{}
+\@ifpackagewith{hyperref}{pdftex}{%
+   \let\H@seteqlabel\@seteqlabel
+   \def\@seteqlabel#1{%
+     \H@seteqlabel{#1}%
+     \xdef\@currentHref{AMS.\the\Hy@linkcounter}%
+     \Hy@raisedlink{%
+       \hyper@anchorstart{\@currentHref}\hyper@anchorend
+     }%
+   }%
+}{}
+\let\HyOrg@addtoreset\@addtoreset
+\def\@addtoreset#1#2{%
+  \HyOrg@addtoreset{#1}{#2}%
+  \expandafter\xdef\csname theH#1\endcsname{%
+    \expandafter\noexpand
+        \csname the\@ifundefined{theH#2}{}H#2\endcsname
+    .\noexpand\the\noexpand\value{#1}%
+  }%
+}
+\@ifpackageloaded{amsmath}{%
+  \@ifpackagelater{amsmath}{1999/12/14}{%
+    \renewcommand*{\numberwithin}[3][\arabic]{%
+      \@ifundefined{c@#2}{\@nocounterr{#2}}{%
+        \@ifundefined{c@#3}{\@nocnterr{#3}}{%
+          \HyOrg@addtoreset{#2}{#3}%
+          \@xp\xdef\csname the#2\endcsname{%
+            \@xp\@nx\csname the#3\endcsname .\@nx#1{#2}%
+          }%
+          \@xp\xdef\csname theH#2\endcsname{%
+            \@xp\@nx
+            \csname the\@ifundefined{theH#3}{}H#3\endcsname
+            .\@nx#1{#2}%
+          }%
+        }%
+      }%
+    }%
+  }{%
+    \Hy@WarningNoLine{%
+      \string\numberwithin\space of package `amsmath' %
+      only fixed\MessageBreak
+      for version 2000/06/06 v2.12 or newer%
+    }%
+  }%
+}{}
+\ifHy@hyperfigures
+  \let\Hy@Gin@setfile\Gin@setfile
+  \def\Gin@setfile#1#2#3{%
+    \hyperimage{#3}{\Hy@Gin@setfile{#1}{#2}{#3}}%
+  }%
+\fi
+\Hy@DisableOption{hyperfigures}
+\ifHy@hyperindex
+  \def\HyInd@ParenLeft{(}%
+  \def\HyInd@ParenRight{)}%
+  \def\hyperindexformat#1#2{%
+    \let\HyOrg@hyperpage\hyperpage
+    \let\hyperpage\@firstofone
+    #1{\HyOrg@hyperpage{#2}}%
+    \let\hyperpage\HyOrg@hyperpage
+  }%
+  \Hy@nextfalse
+  \@ifpackageloaded{multind}{\Hy@nexttrue}{}%
+  \@ifpackageloaded{index}{\Hy@nexttrue}{}%
+  \@ifpackageloaded{amsmidx}{\Hy@nexttrue}{}%
+  \begingroup
+    \lccode`\|=\expandafter`\HyInd@EncapChar\relax
+    \lccode`\/=`\\\relax
+  \lowercase{\endgroup
+    \ifHy@next
+      \let\HyInd@org@wrindex\@wrindex
+      \def\@wrindex#1#2{\HyInd@@wrindex{#1}#2||\\}%
+      \def\HyInd@@wrindex#1#2|#3|#4\\{%
+        \ifx\\#3\\%
+          \HyInd@org@wrindex{#1}{#2|hyperpage}%
+        \else
+          \HyInd@@@wrindex{#1}{#2}#3\\%
+        \fi
+      }%
+      \def\HyInd@@@wrindex#1#2#3#4\\{%
+        \def\Hy@temp@A{#3}%
+        \ifcase0\ifx\Hy@temp@A\HyInd@ParenLeft 1\fi
+                \ifx\Hy@temp@A\HyInd@ParenRight 1\fi
+                \relax
+          \HyInd@org@wrindex{#1}{%
+            #2|hyperindexformat{/#3#4}%
+          }%
+        \else
+          \ifx\\#4\\%
+            \ifx\Hy@temp@A\HyInd@ParenRight
+              \HyInd@org@wrindex{#1}{#2|#3}%
+            \else
+              \HyInd@org@wrindex{#1}{#2|#3hyperpage}%
+            \fi
+          \else
+            \HyInd@org@wrindex{#1}{%
+              #2|#3hyperindexformat{/#4}%
+            }%
+          \fi
+        \fi
+      }%
+    \else
+      \def\@wrindex#1{\@@wrindex#1||\\}%
+      \def\@@wrindex#1|#2|#3\\{%
+        \if@filesw
+          \ifx\\#2\\%
+            \protected@write\@indexfile{}{%
+              \string\indexentry{#1|hyperpage}{\thepage}%
+            }%
+          \else
+            \HyInd@@@wrindex{#1}#2\\%
+          \fi
+        \fi
+        \endgroup
+        \@esphack
+      }%
+      \def\HyInd@@@wrindex#1#2#3\\{%
+        \def\Hy@temp@A{#2}%
+        \ifcase0\ifx\Hy@temp@A\HyInd@ParenLeft 1\fi
+                \ifx\Hy@temp@A\HyInd@ParenRight 1\fi
+                \relax
+          \protected@write\@indexfile{}{%
+            \string\indexentry{%
+              #1|hyperindexformat{/#2#3}%
+            }{\thepage}%
+          }%
+        \else
+          \ifx\\#3\\%
+            \ifx\Hy@temp@A\HyInd@ParenRight
+              \protected@write\@indexfile{}{%
+                 \string\indexentry{#1|#2}{\thepage}%
+              }%
+            \else
+              \protected@write\@indexfile{}{%
+                 \string\indexentry{#1|#2hyperpage}{\thepage}%
+              }%
+            \fi
+          \else
+            \protected@write\@indexfile{}{%
+               \string\indexentry{%
+                 #1|#2hyperindexformat{/#3}%
+               }{\thepage}%
+            }%
+          \fi
+        \fi
+      }%
+    \fi
+  }%
+\fi
+\Hy@DisableOption{hyperindex}
+\Hy@DisableOption{encap}
+\def\nohyperpage#1{#1}
+\def\hyperpage#1{%
+  \HyInd@hyperpage#1\nohyperpage{}\@nil
+}
+\def\HyInd@hyperpage#1\nohyperpage#2#3\@nil{%
+  \HyInd@@hyperpage{#1}%
+  #2%
+  \def\Hy@temp{#3}%
+  \ifx\Hy@temp\@empty
+  \else
+    \ltx@ReturnAfterFi{%
+      \HyInd@hyperpage#3\@nil
+    }%
+  \fi
+}
+\def\HyInd@@hyperpage#1{\@hyperpage#1----\\}
+\def\@hyperpage#1--#2--#3\\{%
+  \ifx\\#2\\%
+    \@commahyperpage{#1}%
+  \else
+    \HyInd@pagelink{#1}--\HyInd@pagelink{#2}%
+  \fi
+}
+\def\@commahyperpage#1{\@@commahyperpage#1, ,\\}
+\def\@@commahyperpage#1, #2,#3\\{%
+  \ifx\\#2\\%
+    \HyInd@pagelink{#1}%
+  \else
+    \HyInd@pagelink{#1}, \HyInd@pagelink{#2}%
+  \fi
+}
+\def\HyInd@pagelink#1{%
+  \begingroup
+    \toks@={}%
+    \HyInd@removespaces#1 \@nil
+  \endgroup
+}
+\def\HyInd@removespaces#1 #2\@nil{%
+  \toks@=\expandafter{\the\toks@#1}%
+  \ifx\\#2\\%
+    \edef\x{\the\toks@}%
+    \ifx\x\@empty
+    \else
+      \hyperlink{page.\the\toks@}{\the\toks@}%
+    \fi
+  \else
+    \ltx@ReturnAfterFi{%
+      \HyInd@removespaces#2\@nil
+    }%
+  \fi
+}
+\@ifclassloaded{foils}{%
+  \providecommand*\ext@table{lot}%
+  \providecommand*\ext@figure{lof}%
+}{}
+\@ifclassloaded{seminar}{%
+  \Hy@seminarslidestrue
+  \providecommand\theHslide{\arabic{slide}}%
+}{%
+  \Hy@seminarslidesfalse
+}
+\@ifpackageloaded{slidesec}{%
+  \providecommand\theHslidesection   {\arabic{slidesection}}%
+  \providecommand\theHslidesubsection{%
+    \theHslidesection.\arabic{slidesubsection}%
+  }%
+  \def\slide@heading[#1]#2{%
+    \H@refstepcounter{slidesection}%
+    \@addtoreset{slidesubsection}{slidesection}%
+    \addtocontents{los}{%
+      \protect\l@slide{\the\c@slidesection}{\ignorespaces#1}%
+        {\@SCTR}{slideheading.\theslidesection}%
+    }%
+    \def\Hy@tempa{#2}%
+    \ifx\Hy@tempa\@empty
+    \else
+      {%
+        \edef\@currentlabel{%
+          \csname p@slidesection\endcsname\theslidesection
+        }%
+        \makeslideheading{#2}%
+      }%
+    \fi
+    \gdef\theslideheading{#1}%
+    \gdef\theslidesubheading{}%
+    \ifHy@bookmarksnumbered
+      \def\Hy@slidetitle{\theslidesection\space #1}%
+    \else
+      \def\Hy@slidetitle{#1}%
+    \fi
+    \ifHy@hypertexnames
+       \ifHy@naturalnames
+         \hyper@@anchor{slideheading.\theslidesection}{\relax}%
+         \Hy@writebookmark
+           {\theslidesection}%
+           {\Hy@slidetitle}%
+           {slideheading.\theslidesection}%
+           {1}%
+           {toc}%
+       \else
+         \hyper@@anchor{slideheading.\theHslidesection}{\relax}%
+         \Hy@writebookmark
+           {\theslidesection}%
+           {\Hy@slidetitle}%
+           {slideheading.\theHslidesection}%
+           {1}%
+           {toc}%
+       \fi
+    \else
+      \Hy@GlobalStepCount\Hy@linkcounter
+      \hyper@@anchor{slideheading.\the\Hy@linkcounter}{\relax}%
+      \Hy@writebookmark
+        {\theslidesection}%
+        {\Hy@slidetitle}%
+        {slideheading.\the\Hy@linkcounter}%
+        {1}%
+        {toc}%
+    \fi
+  }%
+  \def\slide@subheading[#1]#2{%
+    \H@refstepcounter{slidesubsection}%
+    \addtocontents{los}{%
+      \protect\l@subslide{\the\c@slidesubsection}{\ignorespaces#1}%
+        {\@SCTR}{slideheading.\theslidesubsection}%
+    }%
+    \def\Hy@tempa{#2}%
+    \ifx\Hy@tempa\@empty
+    \else
+      {%
+        \edef\@currentlabel{%
+          \csname p@slidesubsection\endcsname\theslidesubsection
+        }%
+        \makeslidesubheading{#2}%
+      }%
+    \fi
+    \gdef\theslidesubheading{#1}%
+    \ifHy@bookmarksnumbered
+      \def\Hy@slidetitle{\theslidesubsection\space #1}%
+    \else
+      \def\Hy@slidetitle{#1}%
+    \fi
+    \ifHy@hypertexnames
+      \ifHy@naturalnames
+        \hyper@@anchor{slideheading.\theslidesubsection}{\relax}%
+        \Hy@writebookmark
+          {\theslidesubsection}%
+          {\Hy@slidetitle}%
+          {slideheading.\theslidesubsection}%
+          {2}%
+          {toc}%
+      \else
+        \hyper@@anchor{slideheading.\theHslidesubsection}{\relax}%
+        \Hy@writebookmark
+          {\theslidesubsection}%
+          {\Hy@slidetitle}%
+          {slideheading.\theHslidesubsection}%
+          {2}%
+          {toc}%
+      \fi
+    \else
+      \Hy@GlobalStepCount\Hy@linkcounter
+      \hyper@@anchor{slideheading.\the\Hy@linkcounter}{\relax}%
+      \Hy@writebookmark
+        {\theslidesubsection}%
+        {\Hy@slidetitle}%
+        {slideheading.\the\Hy@linkcounter}%
+        {1}%
+        {toc}%
+    \fi
+  }%
+  \providecommand*{\listslidename}{List of Slides}%
+  \def\listofslides{%
+    \section*{%
+      \listslidename
+      \@mkboth{%
+        \expandafter\MakeUppercase\listslidename
+      }{%
+        \expandafter\MakeUppercase\listslidename
+      }%
+    }%
+    \def\l@slide##1##2##3##4{%
+      \slide@undottedcline{%
+        \slidenumberline{##3}{\hyperlink{##4}{##2}}%
+      }{}%
+    }%
+    \let\l@subslide\l@slide
+    \@startlos
+  }%
+  \def\slide@contents{%
+    \def\l@slide##1##2##3##4{%
+      \slide@cline{\slidenumberline{##3}{\hyperlink{##4}{##2}}}{##3}%
+    }%
+    \let\l@subslide\@gobblefour
+    \@startlos
+  }%
+  \def\Slide@contents{%
+    \def\l@slide##1##2##3##4{%
+      \ifcase\lslide@flag
+        \message{##1 ** \the\c@slidesection}%
+        \ifnum##1>\c@slidesection
+          \def\lslide@flag{1}%
+          {%
+            \large
+            \slide@cline{%
+              \slidenumberline{$\Rightarrow\bullet$}%
+                {\hyperlink{##4}{##2}}%
+            }{##3}%
+          }%
+        \else
+          {%
+            \large
+            \slide@cline{%
+              \slidenumberline{$\surd\;\bullet$}%
+                {\hyperlink{##4}{##2}}%
+            }{##3}%
+          }%
+        \fi
+      \or
+        \def\lslide@flag{2}%
+        {%
+          \large
+          \slide@cline{%
+            \slidenumberline{$\bullet$}%
+              {\hyperlink{##4}{##2}}%
+          }{##3}%
+        }%
+      \or
+        {%
+          \large
+          \slide@cline{%
+            \slidenumberline{$\bullet$}%
+             {\hyperlink{##4}{##2}}%
+          }{##3}%
+        }%
+      \fi
+    }%
+    \def\l@subslide##1##2##3##4{%
+      \ifnum\lslide@flag=1 %
+        \@undottedtocline{2}{3.8em}{3.2em}{\hyperlink{##4}{##2}}{}%
+      \fi
+    }%
+    \def\lslide@flag{0}%
+    \@startlos
+  }%
+}{}
+\ifHy@texht
+  \expandafter\endinput
+\fi
+\let\real@setref\@setref
+\def\@setref#1#2#3{% csname, extract group, refname
+  \ifx#1\relax
+    \protect\G@refundefinedtrue
+    \nfss@text{\reset@font\bfseries ??}%
+    \@latex@warning{%
+      Reference `#3' on page \thepage \space undefined%
+    }%
+  \else
+    \expandafter\Hy@setref@link#1\@empty\@empty\@nil{#2}%
+  \fi
+}
+\def\Hy@setref@link#1#2#3#4#5#6\@nil#7{%
+  \begingroup
+    \toks0={\hyper@@link{#5}{#4}}%
+    \toks1=\expandafter{#7{#1}{#2}{#3}{#4}{#5}}%
+    \edef\x{\endgroup
+      \the\toks0 {\the\toks1 }%
+    }%
+  \x
+}
+\def\@pagesetref#1#2#3{% csname, extract macro, ref
+  \ifx#1\relax
+    \protect\G@refundefinedtrue
+    \nfss@text{\reset@font\bfseries ??}%
+    \@latex@warning{%
+      Reference `#3' on page \thepage \space undefined%
+    }%
+  \else
+    \protect\hyper@@link
+      {\expandafter\@fifthoffive#1}%
+      {page.\expandafter\@secondoffive#1}%
+      {\expandafter\@secondoffive#1}%
+  \fi
+}
+\def\HyRef@StarSetRef#1{%
+  \begingroup
+    \Hy@safe@activestrue
+    \edef\x{#1}%
+    \@onelevel@sanitize\x
+    \edef\x{\endgroup
+      \noexpand\HyRef@@StarSetRef
+        \expandafter\noexpand\csname r@\x\endcsname{\x}%
+    }%
+  \x
+}
+\def\HyRef@@StarSetRef#1#2#3{%
+  \ifx#1\@undefined
+    \let#1\relax
+  \fi
+  \real@setref#1#3{#2}%
+}
+\def\@refstar#1{%
+  \HyRef@StarSetRef{#1}\@firstoffive
+}
+\def\@pagerefstar#1{%
+  \HyRef@StarSetRef{#1}\@secondoffive
+}
+\def\@namerefstar#1{%
+  \HyRef@StarSetRef{#1}\@thirdoffive
+}
+\Hy@AtBeginDocument{%
+  \@ifpackageloaded{varioref}{%
+    \def\@Refstar#1{%
+      \HyRef@StarSetRef{#1}\HyRef@MakeUppercaseFirstOfFive
+    }%
+    \def\HyRef@MakeUppercaseFirstOfFive#1#2#3#4#5{%
+      \MakeUppercase#1%
+    }%
+    \DeclareRobustCommand*{\Ref}{%
+      \@ifstar\@Refstar\HyRef@Ref
+    }%
+    \def\HyRef@Ref#1{%
+      \hyperref[{#1}]{\Ref*{#1}}%
+    }%
+    \def\Vr@f#1{%
+      \leavevmode\unskip\vref@space
+      \hyperref[{#1}]{%
+        \Ref*{#1}%
+        \let\vref@space\nobreakspace
+        \@vpageref[\unskip]{#1}%
+      }%
+    }%
+    \def\vr@f#1{%
+      \leavevmode\unskip\vref@space
+      \begingroup
+        \let\T@pageref\@pagerefstar
+        \hyperref[{#1}]{%
+          \ref*{#1}%
+          \vpageref[\unskip]{#1}%
+        }%
+      \endgroup
+    }%
+  }{}%
+}
+\DeclareRobustCommand*{\autopageref}{%
+  \@ifstar{%
+    \HyRef@autopagerefname\pageref*%
+  }\HyRef@autopageref
+}
+\def\HyRef@autopageref#1{%
+  \hyperref[{#1}]{\HyRef@autopagerefname\pageref*{#1}}%
+}
+\def\HyRef@autopagerefname{%
+  \ltx@IfUndefined{pageautorefname}{%
+    \ltx@IfUndefined{pagename}{%
+      \Hy@Warning{No autoref name for `page'}%
+    }{%
+      \pagename\nobreakspace
+    }%
+  }{%
+    \pageautorefname\nobreakspace
+  }%
+}
+\DeclareRobustCommand*{\autoref}{%
+  \leavevmode
+  \@ifstar{\HyRef@autoref\@gobbletwo}{\HyRef@autoref\hyper@@link}%
+}
+\def\HyRef@autoref#1#2{%
+  \begingroup
+    \Hy@safe@activestrue
+    \expandafter\HyRef@autosetref\csname r@#2\endcsname{#2}{#1}%
+  \endgroup
+}
+\def\HyRef@autosetref#1#2#3{% link command, csname, refname
+  \HyRef@ShowKeysRef{#2}%
+  \ifcase 0\ifx#1\relax 1\fi\ifx#1\Hy@varioref@undefined 1\fi\relax
+    \edef\HyRef@thisref{%
+      \expandafter\@fourthoffive#1\@empty\@empty\@empty
+    }%
+    \expandafter\HyRef@testreftype\HyRef@thisref.\\%
+    \Hy@safe@activesfalse
+    #3{%
+      \expandafter\@fifthoffive#1\@empty\@empty\@empty
+    }{%
+      \expandafter\@fourthoffive#1\@empty\@empty\@empty
+    }{%
+      \HyRef@currentHtag
+      \expandafter\@firstoffive#1\@empty\@empty\@empty
+      \null
+    }%
+  \else
+    \protect\G@refundefinedtrue
+    \nfss@text{\reset@font\bfseries ??}%
+    \@latex@warning{%
+      Reference `#2' on page \thepage\space undefined%
+    }%
+  \fi
+}
+\def\HyRef@testreftype#1.#2\\{%
+  \ltx@IfUndefined{#1autorefname}{%
+    \ltx@IfUndefined{#1name}{%
+      \HyRef@StripStar#1\\*\\\@nil{#1}%
+      \ltx@IfUndefined{\HyRef@name autorefname}{%
+        \ltx@IfUndefined{\HyRef@name name}{%
+          \def\HyRef@currentHtag{}%
+          \Hy@Warning{No autoref name for `#1'}%
+        }{%
+          \edef\HyRef@currentHtag{%
+            \expandafter\noexpand\csname\HyRef@name name\endcsname
+            \noexpand~%
+          }%
+        }%
+      }{%
+        \edef\HyRef@currentHtag{%
+          \expandafter\noexpand
+          \csname\HyRef@name autorefname\endcsname
+          \noexpand~%
+        }%
+      }%
+    }{%
+      \edef\HyRef@currentHtag{%
+        \expandafter\noexpand\csname#1name\endcsname
+        \noexpand~%
+      }%
+    }%
+  }{%
+    \edef\HyRef@currentHtag{%
+      \expandafter\noexpand\csname#1autorefname\endcsname
+      \noexpand~%
+    }%
+  }%
+}
+\def\HyRef@StripStar#1*\\#2\@nil#3{%
+  \def\HyRef@name{#2}%
+  \ifx\HyRef@name\HyRef@CaseStar
+    \def\HyRef@name{#1}%
+  \else
+    \def\HyRef@name{#3}%
+  \fi
+}
+\def\HyRef@CaseStar{*\\}
+\def\HyRef@currentHtag{}
+\let\HyRef@ShowKeysRef\@gobble
+\def\HyRef@ShowKeysInit{%
+  \begingroup\expandafter\expandafter\expandafter\endgroup
+  \expandafter\ifx\csname SK@@label\endcsname\relax
+  \else
+    \ifx\SK@ref\@empty
+    \else
+      \def\HyRef@ShowKeysRef{%
+        \SK@\SK@@ref
+      }%
+    \fi
+  \fi
+}
+\@ifpackageloaded{showkeys}{%
+  \HyRef@ShowKeysInit
+}{%
+  \Hy@AtBeginDocument{%
+    \@ifpackageloaded{showkeys}{%
+      \HyRef@ShowKeysInit
+    }{}%
+  }%
+}
+\providecommand*\AMSautorefname{\equationautorefname}
+\providecommand*\Hfootnoteautorefname{\footnoteautorefname}
+\providecommand*\Itemautorefname{\itemautorefname}
+\providecommand*\itemautorefname{item}
+\providecommand*\equationautorefname{Equation}
+\providecommand*\footnoteautorefname{footnote}
+\providecommand*\itemautorefname{item}
+\providecommand*\figureautorefname{Figure}
+\providecommand*\tableautorefname{Table}
+\providecommand*\partautorefname{Part}
+\providecommand*\appendixautorefname{Appendix}
+\providecommand*\chapterautorefname{chapter}
+\providecommand*\sectionautorefname{section}
+\providecommand*\subsectionautorefname{subsection}
+\providecommand*\subsubsectionautorefname{subsubsection}
+\providecommand*\paragraphautorefname{paragraph}
+\providecommand*\subparagraphautorefname{subparagraph}
+\providecommand*\FancyVerbLineautorefname{line}
+\providecommand*\theoremautorefname{Theorem}
+\providecommand*\pageautorefname{page}
+\providecommand*{\Hy@DistillerDestFix}{}
+\def\phantomsection{%
+  \Hy@MakeCurrentHrefAuto{section*}%
+  \Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
+}
+\endinput
+%%
+%% End of file `hyperref.sty'.