%%
%% This is file `hgeneric-testphase.def',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% hyperref-generic.dtx  (with options: `package')
%% 
%% Copyright (C) 2019-2021 The LaTeX Project
%% 
%% It may be distributed and/or modified under the conditions of
%% the LaTeX Project Public License (LPPL), either version 1.3c of
%% this license or (at your option) any later version.  The latest
%% version of this license is in the file:
%% 
%%    https://www.latex-project.org/lppl.txt
%% 
%% This file is part of the "LaTeX PDF management testphase bundle" (The Work in LPPL)
%% and all files in that bundle must be distributed together.
%% 
%% File: hyperref-generic.dtx

\ProvidesFile{hgeneric-testphase.def}[2022-09-26 v0.95s %
  generic Hyperref driver for the LaTeX PDF management testphase bundle]

\RequirePackage{etoolbox} %why?
\ExplSyntaxOn
\file_input:n {hyperref-colorschemes.def}
\ExplSyntaxOff
\ExplSyntaxOn
\prop_gput:Nnn \g_msg_module_name_prop { hyp }{ hyperref }
\cs_if_exist:NTF \DocumentMetadata
  {
   \msg_new:nnnn
      { hyp }
      { missing-resource-management }
      { The~PDF~resource~management~is~required~for~this~hyperref~driver! }
      {
         Activate~it~with \\
         \tl_to_str:n{\DocumentMetadata{<options>}}\\
         before~\tl_to_str:n{\documentclass}
      }
  }
  {
    \msg_new:nnnn
      { hyp }
      { missing-resource-management }
      { The~PDF~resource~management~is~required~for~this~hyperref~driver! }
      {
         Activate~it~with \\
         \tl_to_str:n{\RequirePackage{pdfmanagement-testphase}}\\
         \tl_to_str:n{\DocumentMetadata{<options>}}\\
         before~\tl_to_str:n{\documentclass}
      }
   }
\msg_new:nnnn
  { hyp }
  { pdfversion-disabled }
  {
    This~hyperref~driver~ignores~the~pdfversion~key!\\
    Set~the~pdfversion~in~\token_to_str:N \DocumentMetadata
  }
  {
    For example:\\
    \tl_to_str:n
     {
      \DocumentMetadata { pdfversion=1.7 }
     }
  }
\msg_new:nnn
  { hyp }
  { key-dropped }
  {
    This~hyperref~driver~ignores~the~key~#1!\\
    Please~check~the~documentation.
  }
\msg_new:nnn
  { hyp }
  { pdfa-no-push-button }
  { PDF/A:~Push~button~with~JavaScript~is~prohibited }

\msg_new:nnn
  { hyp }
  { pdfa-no-reset-button }
  { PDF/A:~Reset~action~is~prohibited }
\msg_new:nnn
  { hyp }
  { pdfa-no-named-action }
  { PDF/A:~Named~action~#1~is~prohibited }
\msg_new:nnn
  { hyp }
  { empty-destination-name }
  {
    Empty~destination~name,\\
            using~'#1'
  }
\msg_new:nnn
  { hyp }
  { invalid-destination-value }
  {
    Invalid~value~'#1'~of~'#2'  \\
    is~replaced~by~'Fit'~\msg_line_context:.
  }
\msg_new:nnn
  { hyp }
  { ignore-deprecated-or-unknown-option-in-pdf-version }
  {
    Option~'#1'~is~unknown~or~deprecated~in\\
    pdf~version~#2.~Ignored.
  }
\msg_new:nnn
  { hyp }
  { ignore-deprecated-or-unknown-value-in-pdf-version }
  {
    Value~'#1'~is~unknown~or~deprecated~in\\
    pdf~version~#2.~Ignored.
  }
\msg_new:nnn
  { hyp }
  { replace-deprecated-or-unknown-value-in-pdf-version }
  {
    Value~'#1'~is~unknown~or~deprecated~in\\
    pdf~version~#2. Value~'#3'~is used instead.
  }
\msg_new:nnn
  { hyp }
  { unknown-key }
  {
    unknown~key~#2~of~module~'#1'~set~to~'#3'.
  }
\msg_new:nnn
  { hyp }
  { unknown-key-to-Hyp }
  {
    ignored~in~family~Hyp~unknown~key~#1.
  }
\cs_new:Npn \__hyp_clist_display:n #1 {*~#1\\}
\msg_new:nnn
  { hyp }
  { unknown-choice }
  {
    Value~'#3'~is~invalid~for~key~'#1'.\\
    The~key~accepts~only~the~choices\\
    \clist_map_function:nN { #2 }\__hyp_clist_display:n
  }

\msg_new:nnn
  { hyp }
  { unknown-choice+empty }
  {
    Value~'#3'~is~invalid~for~key~'#1'.\\
    The~key~accepts~only~the~choices\\
    \clist_map_function:nN { #2 }\__hyp_clist_display:n
    An~empty~value~removes~the~setting.
  }

\msg_new:nnn
  { hyp }
  { no-bool }
  {
    Value~'#2'~is~invalid~for~key~'#1'.\\
    The~key~accepts~only~the~choices\\
    *~true\\
    *~false \\
    *~and~an~empty~value~which~removes~the~setting.\\
    No~value~is~equivalent~to~using~'true'.
  }
\msg_new:nnn
  { hyp }
  { empty-info-value }
  {
    Empty~value~for~key~#1.\\
    This~isn't~honored~by~all~backends.
  }
\cs_generate_variant:Nn\pdf_destination:nn {nf}
\cs_generate_variant:Nn\pdf_object_ref:n {e}
\chardef\Hy@VersionChecked=1 %don't check the version!
\cs_set_eq:NN \hypercalcbp \dim_to_decimal_in_bp:n
\providecommand\@pdfborder{}
\providecommand\@pdfborderstyle{}
\newcommand\OBJ@OCG@view {} % needed in hyperref
\def\Hy@numberline#1{#1\c_space_tl}   %needed by bookmark
\cs_set_eq:NN \Hy@pdfminorversion \pdf_version_minor:
\cs_set_eq:NN \Hy@pdfmajorversion \pdf_version_major:
\legacy_if:nT { Hy@setpdfversion }
 {
    \msg_warning:nn { hyp }{ pdfversion-disabled }
 }
\Hy@DisableOption{pdfversion}
\RenewDocumentCommand \Acrobatmenu { m m }
  {
    \hyper@linknamed {#1} {#2}
  }
\cs_set_protected:Npn \hypersetup #1
  {
     %\kvsetkeys{Hyp} {#1}
     \keys_set:nn { hyp / setup }{ #1 }
  }
\keys_define:nn { hyp / setup }
  {
    unknown .code:n =
    {
      \msg_warning:nnxxx { hyp } { unknown-key }
      { hyp~/~setup }{ \l_keys_key_str } { #1 }
    }
  }
\keys_define:nn { hyp / setup }
  {
    next-anchor .code:n =
    {
      \AddToHookNext{__hyp/dest/make}
       {\Hy@MakeCurrentHref{#1}}
    }
  }

\bool_new:N \l__hyp_href_url_encode_bool
\bool_new:N \l__hyp_href_url_ismap_bool
\tl_new:N   \l__hyp_href_url_protocol_tl
\tl_new:N   \l__hyp_href_pdf_destination_tl
\tl_new:N   \l__hyp_href_pdf_page_tl
\tl_new:N   \l__hyp_href_run_parameter_tl
\cs_new_protected:Npn \__hyp_href_url_format: {\begingroup\Url}

\keys_define:nn { hyp / href }
  {
    ,urlencode  .bool_set:N =  \l__hyp_href_url_encode_bool
    ,format     .code:n = { \cs_set:Nn \__hyp_href_url_format: {#1} },
    ,protocol  .tl_set:N   =  \l__hyp_href_url_protocol_tl
    ,destination .tl_set:N = \l__hyp_href_pdf_destination_tl
    ,pdfremotestartview .code:n =
      {
        \keys_set:nn { hyp / setup }
          { pdfremotestartview = #1 }
      }
    ,page .code:n =
      {
       \tl_set:Nn \l__hyp_href_pdf_page_tl {#1}
       \tl_set:Nn \Hy@href@page {#1}
      }
    ,ismap  .bool_set:N  = \l__hyp_href_url_ismap_bool
    ,run-parameter .tl_set:N = \l__hyp_href_run_parameter_tl
    ,nextactionraw .code:n =
     { %perhaps some safety match later, see hyperref code
       \tl_if_empty:nTF {#1}
         {
           \pdfdict_remove:nn{l_hyp/annot/A}{Next}
         }
         {
           \pdfdict_put:nnn{l_hyp/annot/A}{Next}{#1}
           \tl_set:Nn \Hy@href@nextactionraw {/Next~#1}
           \keys_set:nn {hyp / setup }{ pdfnewwindow = true}
         }
     }
    ,afrelationship .code:n =
      {
        \pdfdict_put:nnx
          { l_pdffile/Filespec}{AFRelationship}{ \pdf_name_from_unicode_e:n {#1}}
      }

  }

\keys_define:nn { hyp / setup }
  {
    ,href / urlencode .bool_set:N =  \l__hyp_href_url_encode_bool
    ,href / urlencode .default:n  = {true}
    ,href / urlencode .initial:n  = {false}
    ,href / protocol  .tl_set:N   =   \l__hyp_href_url_protocol_tl
    ,href / destination .tl_set:N = \l__hyp_href_pdf_destination_tl
    ,href / format  .code:n = { \cs_set:Nn \__hyp_href_url_format:{#1} }
  }

\hook_new_pair:nn{cmd/href/before}{cmd/href/after}

\DeclareRobustCommand*{\href}[1][]{%
  \mode_leave_vertical:
  \hook_use:n{cmd/href/before}
  \group_begin:
  \keys_set:nn { hyp / href } {#1}
  \bool_if:NTF \l__hyp_href_url_encode_bool
    {
      \tl_set:Nn \l__hyp_text_enc_uri_print_tl {utf8/URI}
    }
    {
      \tl_set:Nn \l__hyp_text_enc_uri_print_tl {utf8/string}
    }
  \@ifnextchar\bgroup\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}%<---__hyp-docstrip doubling!
    \endgroup
    \hook_use:n{cmd/href/after}
  }%
\endgroup

\hook_new_pair:nn{cmd/hrefurl/before}{cmd/hrefurl/after}

\DeclareRobustCommand*{\hrefurl}[1][]
 {
   \mode_leave_vertical:
   \hook_use:n{cmd/href/before}
   \group_begin:
   \keys_set:nn { hyp / href } {#1}
   \bool_if:NTF \l__hyp_href_url_encode_bool
    {
      \tl_set:Nn \l__hyp_text_enc_uri_print_tl {utf8/URI}
    }
    {
      \tl_set:Nn \l__hyp_text_enc_uri_print_tl {utf8/string}
    }
  \hyper@normalise\__hyp_href_url_aux:nn}

\cs_new_protected:Npn \__hyp_href_url_aux:nn #1 #2
  {
    \exp_args:Nno\hyper@linkurl{#2}{\l__hyp_href_url_protocol_tl#1}
    \group_end:
    \hook_use:n{cmd/href/after}
  }

\hook_new_pair:nn{cmd/hrefpdf/before}{cmd/hrefpdf/after}
\DeclareRobustCommand*{\hrefpdf}[1][]
 {
  \mode_leave_vertical:
  \hook_use:n{cmd/hrefpdf/before}
  \group_begin:
  \keys_set:nn { hyp / href } {#1}
  \hyper@normalise\__hyp_href_pdf_aux:nn
 }

\cs_new_protected:Npn \__hyp_href_pdf_aux:nn #1 #2
  {
    \exp_args:Nnno\hyper@linkfile{#2}{#1}{\l__hyp_href_pdf_destination_tl}
    \group_end:
    \hook_use:n{cmd/hrefpdf/after}
  }

\hook_new_pair:nn{cmd/hrefrun/before}{cmd/hrefrun/after}
\DeclareRobustCommand*{\hrefrun}[1][]
 {
  \mode_leave_vertical:
  \hook_use:n{cmd/hrefrun/before}
  \group_begin:
  \keys_set:nn { hyp / href } {#1}
  \hyper@normalise\__hyp_href_run_aux:nn
 }

\cs_new_protected:Npn \__hyp_href_run_aux:nn #1 #2
  {
    \exp_args:Nnno\hyper@linklaunch{#1}{#2}{\l__hyp_href_run_parameter_tl}
    \group_end:
    \hook_use:n{cmd/hrefrun/after}
  }

\hook_new_pair:nn{cmd/url/before}{cmd/url/after}

\DeclareRobustCommand*{\url}[1][]
  {
   \mode_leave_vertical:
   \hook_use:n{cmd/url/before}
   \group_begin:
   \keys_set:nn {hyp / href } {#1}
    \bool_if:NTF \l__hyp_href_url_encode_bool
    {
      \tl_set:Nn \l__hyp_text_enc_uri_print_tl {utf8/URI}
    }
    {
      \tl_set:Nn \l__hyp_text_enc_uri_print_tl {utf8/string}
    }
   \hyper@normalise\__hyp_href_url_aux:n
  }

\cs_new_protected:Npn \__hyp_href_url_aux:n #1
 {
   \exp_args:Nno
     \hyper@linkurl{\__hyp_href_url_format: {#1}}
     {\l__hyp_href_url_protocol_tl#1}
   \group_end:
   \hook_use:n{cmd/url/after}
 }


\def\urldef#1#2{\begingroup\def\url{\hyper@normalise\url@}\setbox\z@\hbox\bgroup
  \def\Url@HyperHook##1\endgroup{\Url@def{#1}{#2}}%
  % Because hyperref breaks \urldef and does not define its own (Grrrr!)...
  \def\url@##1{\egroup\endgroup\DeclareRobustCommand#1{#2{##1}}}%
 #2}

\NewExpandableDocumentCommand\__hyp_secondoftwowithopt:wnn {omm}{#3}
\pdfstringdefDisableCommands{\let\hrefurl\__hyp_secondoftwowithopt:wnn}
\pdfstringdefDisableCommands{\let\hrefpdf\__hyp_secondoftwowithopt:wnn}
\pdfstringdefDisableCommands{\let\hrefrun\__hyp_secondoftwowithopt:wnn}
\cs_new_protected:Npn \__hyp_store_metadata:nn #1 #2 %#1 key, #2 value.
  {
    %\tl_set:cn {@#1}{#2}
    \AddToDocumentProperties[hyperref]{#1}{#2}
  }
\cs_generate_variant:Nn \__hyp_store_metadata:nn {xn,nx,xx}
\hook_new:n{hyp/link/cite}
\keys_define:nn { hyp / setup }
  {
    ,citecolor .code:n = {\__hyp_color_set:ne {hyp/color/cite}{#1}\__hyp_citecolor_hook_init:}
    ,citebordercolor
      .code:n = {\__hyp_color_set:ne {hyp/color/citeborder}{#1}\__hyp_citebordercolor_hook_init:}
  }
\cs_new_protected:Npn \__hyp_citecolor_hook_init:
 {
   \hook_gput_code:nnn { hyp/link/cite }{hyp/cite}
     {
       \keys_set:nn { hyp / setup }
         {
           linkcolor      = hyp/color/cite
         }
     }
  \cs_gset_eq:NN \__hyp_citecolor_hook_init: \prg_do_nothing:
  }
\cs_new_protected:Npn \__hyp_citebordercolor_hook_init:
 {
   \hook_gput_code:nnn { hyp/link/cite }{hyp/citeborder}
     {
       \keys_set:nn { hyp / setup }
         {
           linkbordercolor      = hyp/color/citeborder
         }
     }
  \cs_gset_eq:NN \__hyp_citebordercolor_hook_init: \prg_do_nothing:
  }

\bool_lazy_and:nnF
  { \cs_if_exist_p:N \pdfmanagement_if_active_p: }{ \pdfmanagement_if_active_p: }
  { \msg_error:nn { hyp}{ missing-resource-management } }
\AddToHook { package/bookmark/after}
 {
   \define@key{BKM}{color}
     {
       \__hyp_color_set:ne {__hyp/tmpa}{#1}
       \color_export:nVN
         {__hyp/tmpa}
         \g__hyp_bordercolormodel_str
         \BKM@color
     }
 }
\legacy_if:nT { Hy@bookmarks }
  {
    \AddToHook{begindocument/before}[hyperref/bookmark]
     {
       \RequirePackage{bookmark}
     }
  }
\legacy_if:nT {Hy@draft}
  {
    \PassOptionsToPackage{draft}{bookmark}
  }
\cs_new_protected:Npn \__hyp_ref_label:nn #1 #2 %label/attributes
  {
    \@bsphack
      \ref_label:nn{#1}{#2}
    \@esphack
  }
\cs_generate_variant:Nn \__hyp_ref_label:nn {en}
\prg_new_eq_conditional:NNn \__hyp_ref_if_exist:nn \ref_if_exist:nn { p , T , F,  TF }
\prg_generate_conditional_variant:Nnn \__hyp_ref_if_exist:nn  {en}  { p , T , F, TF }
\cs_new_protected:Npn \__hyp_ref_check:nn #1 #2 %label/attribute
  {
    \__hyp_ref_if_exist:nnF {#1}{#2}
      {
        \protect\G@refundefinedtrue
        \@latex@warning
          {
            Reference~'\tl_to_str:n {#1}'~with~attribute~'\tl_to_str:n {#2}'~
            on~page~\thepage~\space undefined
          }
      }
  }
\cs_generate_variant:Nn \__hyp_ref_check:nn {en}
\cs_new:Npn \__hyp_ref_value:nn #1 #2
  {
    \ref_value:nn{#1}{#2}
  }
\cs_generate_variant:Nn \__hyp_ref_value:nn {en}
\box_new:N \l__hyp_tmpa_box
\tl_new:N  \l__hyp_tmpa_tl
\seq_new:N \l__hyp_tmpa_seq
\int_new:N \l__hyp_tmpa_int
\str_new:N \l__hyp_tmpa_str
\tl_new:N  \l__hyp_dest_name_tmpa_tl
\tl_new:N  \l__hyp_uri_tmpa_tl
\tl_new:N  \l__hyp_filename_tmpa_tl
\tl_new:N  \l__hyp_para_tmpa_tl
\str_new:N \l__hyp_text_tmpa_str
\str_new:N \g__hyp_text_tmpa_str
\tl_const:Nn \c__hyp_dest_undefined_tl {UNDEFINED}
\seq_const_from_clist:Nn \c__hyp_annot_types_seq
 {url,link,file,menu,run}
\prop_const_from_keyval:Nn \c__hyp_map_annot_hyp_prop
  {
    URI   = url,
    GoTo  = link,
    GoToR = file,
    Named = menu,
    Launch= run
  }
\prop_const_from_keyval:Nn \c__hyp_map_hyp_annot_prop
  {
    url   = URI,
    link  = GoTo,
    file  = GoToR,
    menu  = Named,
    run   = Launch
  }

\tl_new:N  \g__hyp_dest_pdfstartpage_tl
\tl_new:N  \g__hyp_dest_pdfstartview_tl
\tl_new:N  \l__hyp_dest_pdfremotestartview_tl
\tl_new:N  \l__hyp_text_enc_uri_print_tl
\tl_new:N  \l__hyp_text_enc_info_print_tl
\tl_new:N  \l__hyp_text_enc_dest_tl
\tl_new:N  \l__hyp_text_enc_dest_print_tl
\tl_new:N  \l__hyp_text_enc_file_print_tl
\tl_new:N  \l__hyp_text_enc_para_print_tl

\tl_set:Nn \l__hyp_text_enc_uri_print_tl  {utf8/URI}
\tl_set:Nn \l__hyp_text_enc_info_print_tl {utf16/hex}
\tl_set:Nn \l__hyp_text_enc_dest_tl       {utf8/string-raw}
\tl_set:Nn \l__hyp_text_enc_dest_print_tl {utf8/string}
\tl_set:Nn \l__hyp_text_enc_file_print_tl {utf8/string}
\tl_set:Nn \l__hyp_text_enc_para_print_tl {utf8/string}
\tl_new:N  \l__hyp_dest_pdfview_tl
\str_new:N \g__hyp_bordercolormodel_str
\seq_map_inline:Nn \c__hyp_annot_types_seq
  {
    \bool_new:c {l_hyp_annot_color#1_bool}
  }
\seq_map_inline:Nn \c__hyp_annot_types_seq
  {
    \bool_new:c {l_hyp_annot_ocgcolor#1_bool}
  }
\seq_map_inline:Nn \c_pdfannot_link_types_seq
  {
    \bool_new:c {l__hyp_annot_#1_bool}
    \bool_set_true:c {l__hyp_annot_#1_bool}
  }
\box_new:N  \l__hyp_dest_box

\regex_const:Nn \c__hyp_dest_startview_regex
  {
    \A\ *
     (?:
      (?:XYZ (?:\ +(?:(?:\d+|\d*\.\d+)|null)){3}\ )
      |
      (?:Fit\b|FitB\b)
      |
      (?:(?:FitH|FitV|FitBH|FitBV)(?:\ +(?:\d+|\d*\.\d+)|\ +null){1})
      |
      (?:FitR (?:\ +\d+|\ +\d*\.\d+){4}\ )
     )
  }
\pdfdict_new:n   {l__hyp_page/Trans}
\pdfdict_put:nnn {l__hyp_page/Trans}{Type}{/Trans}

\hook_new:n {hyp/text/pdfstring}
\cs_new_protected:Npn \__hyp_text_purify:nN #1 #2 %#1 input, #2  str command
  {
     \str_set:Nx #2 {\text_purify:n { #1 } }
  }
\cs_new_protected:Npn \__hyp_text_cleanup:N #1
 {

 }
\cs_new_protected:Npn \__hyp_text_string_from_unicode:nN #1 #2
  {
     \pdf_string_from_unicode:nVN { #1 } #2 #2
  }
\cs_new_protected:Npn \__hyp_text_pdfstring:nnN #1 #2 #3
  {
    \group_begin:
    \Hy@pdfstringtrue
    \hook_use:n {hyp/text/pdfstring}
    \__hyp_text_purify:nN  { #1 } \l__hyp_text_tmpa_str
    \__hyp_text_cleanup:N         \l__hyp_text_tmpa_str
    \__hyp_text_string_from_unicode:nN { #2 } \l__hyp_text_tmpa_str
    \str_gset_eq:NN \g__hyp_text_tmpa_str\l__hyp_text_tmpa_str
    \group_end:
    \str_set_eq:NN #3 \g__hyp_text_tmpa_str
 }
\cs_generate_variant:Nn \__hyp_text_pdfstring:nnN {xnN,onN,xoN,ooN,noN}
\cs_new_protected:Npn\Hy@pstringdef #1 #2
  { \__hyp_text_pdfstring:xnN {#2} {utf8/string-raw}#1 }
\cs_new_protected:Npn \__hyp_text_pdfstring_info:nN #1 #2
  {
    \__hyp_text_pdfstring:noN  { #1 }{ \l__hyp_text_enc_info_print_tl } #2
  }
\cs_new_protected:Npn\__hyp_PageLabels_gpush:
  {
    \pdfmanagement_add:nnx {Catalog} {PageLabels}{<</Nums[\HyPL@Labels]>>}
  }

\def\Hy@PutCatalog #1 {}

\legacy_if:nT { Hy@pdfpagelabels }
  {
    \cs_set_protected:Npn \HyPL@StorePageLabel #1
      {
        \tl_gput_right:Nx \HyPL@Labels { \the\Hy@abspage<<#1>> }
        \__hyp_PageLabels_gpush:
      }
  }
\Hy@WrapperDef \__hyp_destination:nn #1 #2
  {
    \mode_if_horizontal:T { \@savsf\spacefactor }
    \Hy@SaveLastskip      %defined in hyperref
    \Hy@VerboseAnchor{#1} %defined in hyperref, for debugging
    \__hyp_text_pdfstring:xoN
      { \HyperDestNameFilter{#1}  }
      { \l__hyp_text_enc_dest_tl }
      \l__hyp_tmpa_tl
    \str_if_eq:nnTF  {#2} {fitrbox}
      {
        \exp_args:NV
        \pdf_destination:nnnn \l__hyp_tmpa_tl
         { \box_wd:N \l__hyp_dest_box }
         { \box_ht:N \l__hyp_dest_box }
         { \box_dp:N \l__hyp_dest_box }
      }
      {
        \exp_args:NV
          \pdf_destination:nf
          { \l__hyp_tmpa_tl }
          { #2 }
      }
    \Hy@RestoreLastskip   %defined in hyperref
    \mode_if_horizontal:T { \spacefactor\@savsf }
  }
\tl_new:N\l_hyp_current_dest_name_tl
\hook_new:n{hyp/anchor}
\cs_new_protected:Npn \hyper@anchor #1
  {
    \exp_args:NnV
      \__hyp_destination:nn {#1} \l__hyp_dest_pdfview_tl
    \tl_set:Nn \l_hyp_current_dest_name_tl {#1}
    \hook_use:n{hyp/anchor}
  }

\cs_new_protected:Npn \hyper@anchorstart #1
  {
    \Hy@activeanchortrue
    \exp_args:NnV
      \__hyp_destination:nn {#1} \l__hyp_dest_pdfview_tl
    \tl_set:Nn \l_hyp_current_dest_name_tl {#1}
    \hook_use:n{hyp/anchor}
  }

\cs_new_protected:Npn \hyper@anchorend
  {
    \Hy@activeanchorfalse
  }
\cs_new_protected:Npn \__hyp_link_goto_begin:nw #1
  {
    \mode_leave_vertical:
    \protected@edef \l__hyp_dest_name_tmpa_tl { #1 }
    \tl_if_empty:NTF \l__hyp_dest_name_tmpa_tl
      {
        \msg_warning:nnx
          { hyp }
          { empty-destination-name }
          { \c__hyp_dest_undefined_tl }
        \tl_set_eq:NN \l__hyp_dest_name_tmpa_tl \c__hyp_dest_undefined_tl
      }
      {
        \__hyp_text_pdfstring:xoN
          { \exp_args:No \HyperDestNameFilter { \l__hyp_dest_name_tmpa_tl } }
          { \l__hyp_text_enc_dest_tl }
          \l__hyp_dest_name_tmpa_tl
      }
    \exp_args:No
      \pdfannot_link_goto_begin:nw  { \l__hyp_dest_name_tmpa_tl }
  }

\cs_new_protected:Npn \__hyp_link_goto_end:
  {
    \pdfannot_link_goto_end:
  }


\cs_new_protected:Npn \hyper@link #1 #2 #3 %#1 context, #2=destination name, #3 content
  {
    \bool_if:NTF \l__hyp_annot_GoTo_bool
      {
        \Hy@VerboseLinkStart{#1}{#2}
        \group_begin:
        \tl_set:Nn \l_hyp_current_dest_name_tl {#2}
        \hook_use:n {hyp/link/#1}
        \__hyp_link_goto_begin:nw {#2}#3\Hy@xspace@end
        \__hyp_link_goto_end:
        \group_end:
        \Hy@VerboseLinkStop
      }
      {{\let\protect\relax#3}}
  }

\cs_new_protected:Npn \hyper@linkstart #1 #2 %#1 context, #2=destination name
  {
    \bool_if:NT \l__hyp_annot_GoTo_bool
      {
        \Hy@VerboseLinkStart{#1}{#2}% only for debug
        \group_begin:
        \tl_set:Nn \l_hyp_current_dest_name_tl {#2}
        \hook_use:n {hyp/link/#1}
        \__hyp_link_goto_begin:nw {#2}
      }
  }

\cs_new_protected:Npn \hyper@linkend
  {
    \bool_if:NT \l__hyp_annot_GoTo_bool
      {
        \__hyp_link_goto_end:
        \group_end:
        \Hy@VerboseLinkStop
      }
  }
\pdfdict_new:n   {l_hyp/annot/A/URI}
\pdfdict_put:nnn {l_hyp/annot/A/URI}{Type}{/Action}
\pdfdict_put:nnn {l_hyp/annot/A/URI}{S}{/URI}

\cs_new_protected:Npn \hyper@linkurl #1 #2  %#1:link text #2: URI,
  {
    \bool_if:NTF \l__hyp_annot_URI_bool
      {
        \group_begin:
         \__hyp_text_pdfstring:xoN
           { #2}
           { \l__hyp_text_enc_uri_print_tl }
           \l__hyp_uri_tmpa_tl
         \pdfdict_put:nno{l_hyp/annot/A/URI}{URI}{\l__hyp_uri_tmpa_tl}
         \bool_if:NT \l__hyp_href_url_ismap_bool
           {
            \pdfdict_put:nnn{l_hyp/annot/A/URI}{IsMap}{true}
           }
         \cs_set_eq:NN \# \c_hash_str
         \cs_set_eq:NN \% \c_percent_str
         \Hy@safe@activestrue
         \mode_leave_vertical:
         \pdfannot_dict_put:nnx {link/URI}{A}{<<\pdfdict_use:n {l_hyp/annot/A/URI}>>}
         \pdfannot_link:nxn { URI }
           {
           }
           {
             \let\protect\relax
             #1
             \Hy@xspace@end
             \Hy@VerboseLinkStop %where is the start??
           }
         \group_end:
      }
      {{\let\protect\relax#1}}
  }

\pdfdict_new:n   {l_hyp/annot/A/GoToR}
\pdfdict_put:nnn {l_hyp/annot/A/GoToR}{Type}{/Action}
\pdfdict_put:nnn {l_hyp/annot/A/GoToR}{S}{/GoToR}

\cs_new_protected:Npn \hyper@linkfile #1 #2 #3 % link text, filename, destname
  {
   \bool_if:NTF \l__hyp_annot_GoToR_bool
     {
        \group_begin:
        \tl_set:Nx \l__hyp_filename_tmpa_tl { \text_expand:n { #2 } }
        \exp_args:Nx
          \pdf_object_if_exist:nF { __hyp_file_\tl_to_str:N \l__hyp_filename_tmpa_tl }
            {
              \pdfdict_put:nnx { l_pdffile/Filespec}{Subtype}{\pdf_name_from_unicode_e:n {application/pdf}}
              \exp_args:Nnox
              \pdffile_embed_file:nnn
                {}
                {\l__hyp_filename_tmpa_tl }
                {__hyp_file_\tl_to_str:N \l__hyp_filename_tmpa_tl }
            }
        \pdfdict_put:nnx
           {l_hyp/annot/A/GoToR}
           {F}
           {\pdf_object_ref:e {__hyp_file_\tl_to_str:N \l__hyp_filename_tmpa_tl}}
        \__hyp_text_pdfstring:nnN
          { #3 }
          { \l__hyp_text_enc_dest_print_tl }
          \l__hyp_dest_name_tmpa_tl
        \tl_if_blank:eTF {#3}
          {
            \pdfdict_put:nnx {l_hyp/annot/A/GoToR}{D}
              {
               [
                 \int_eval:n
                  { \int_max:nn {0}{ 0\l__hyp_href_pdf_page_tl - 1 }}
                 /\l__hyp_dest_pdfremotestartview_tl
               ]
              }
          }
          {
            \pdfdict_put:nno {l_hyp/annot/A/GoToR}{D}{\l__hyp_dest_name_tmpa_tl}
          }
        \mode_leave_vertical:
        \pdf_object_unnamed_write:nx{dict}{\pdfdict_use:n {l_hyp/annot/A/GoToR}}
        \pdfannot_dict_put:nnx {link/GoToR}{A}{\pdf_object_ref_last:}
        \pdfannot_link:nxn %expansion??
          { GoToR }
          {
          }
          {
           \let\protect\relax
            #1\Hy@xspace@end
            \Hy@VerboseLinkStop %where is the start??
          }
        \group_end:
     }
     {{\let\protect\relax#1}}
  }
\pdfdict_new:n   {l_hyp/annot/A/Launch}
\pdfdict_put:nnn {l_hyp/annot/A/Launch}{Type}{/Action}
\pdfdict_put:nnn {l_hyp/annot/A/Launch}{S}{/Launch}

\cs_new_protected:Npn \hyper@linklaunch #1 #2 #3 % filename, link text, Parameters
  {
   \bool_if:NTF \l__hyp_annot_Launch_bool
     {
        \group_begin:
          \__hyp_text_pdfstring:nnN
            { #1 }
            { \l__hyp_text_enc_file_print_tl }
            \l__hyp_filename_tmpa_tl
          \pdfdict_put:nno {l_hyp/annot/A/Launch}{F}{\l__hyp_filename_tmpa_tl}
          \__hyp_text_pdfstring:noN
            { #3 }
            { \l__hyp_text_enc_para_print_tl }
            \l__hyp_para_tmpa_tl
          \bool_if:nTF
            {
              \str_if_eq_p:Vn \l__hyp_para_tmpa_tl {()}
              ||
              \pdf_version_compare_p:Nn > {1.9}
            }
            {
              \pdfdict_remove:nn {l_hyp/annot/A/Launch}{Win}
            }
            {
              \pdfdict_put:nnx {l_hyp/annot/A/Launch}{Win}
                {<</P \l__hyp_para_tmpa_tl /F \l__hyp_filename_tmpa_tl >>}
            }
          \mode_leave_vertical:
          \pdfannot_dict_put:nnx {link/Launch}{A}{<<\pdfdict_use:n {l_hyp/annot/A/Launch}>>}
          \pdfannot_link:nxn
            { Launch }
            {
  %            /A
            }
            {
              \let\protect\relax
              #2\Hy@xspace@end
              \Hy@VerboseLinkStop %where is the start??
            }
        \group_end:
      }
      {{\let\protect\relax#2}}
  }
\use:x
  { % filename, anchor text, linkname
    \cs_set_protected:Npn \exp_not:N \@hyper@launch run \c_colon_str ##1 \exp_not:N \\ ##2 ##3
  }
  {
    \hyper@linklaunch {#1}{#2}{#3}
  }
\pdfdict_new:n   {l_hyp/annot/A/Named}
\pdfdict_put:nnn {l_hyp/annot/A/Named}{Type}{/Action}
\pdfdict_put:nnn {l_hyp/annot/A/Named}{S}{/Named}

\cs_new_protected:Npn \hyper@linknamed #1 #2 %#1 action, #2 link text
  {
    \bool_if:NTF \l__hyp_annot_Named_bool
      {
         \group_begin:
         \pdfmeta_standard_verify:nnTF {named_actions}{#1}
           {
             \mode_leave_vertical:
             \pdfdict_put:nnx {l_hyp/annot/A/Named}{N}
               {\pdf_name_from_unicode_e:n{#1}}
             \pdfannot_dict_put:nnx {link/Named}{A}{<<\pdfdict_use:n {l_hyp/annot/A/Named}>>}
             \pdfannot_link:nxn { Named }
              {
              }
              {
                #2
                \Hy@xspace@end
                \Hy@VerboseLinkStop
              }
           }
           {
             \msg_warning:nnn { hyp } { pdfa-no-named-action }{#1}
             #2
           }
        \group_end:
      }
      {{\let\protect\relax#2}}
  }

\cs_generate_variant:Nn \color_export:nnN {nVN}
\cs_new_protected:Npn \__hyp_color_select:n #1
 {
   \tl_if_head_eq_charcode:nNTF {#1}[ %]
    {
      \__hyp_color_select_aux:wn  #1
    }
    {
      \color_select:n {#1}
    }
 }

\cs_new_protected:Npn \__hyp_color_select_aux:wn  [#1] #2
  {
     \color_select:nn {#1}{#2}
  }

\cs_generate_variant:Nn \__hyp_color_select:n {e}
\cs_new_protected:Npn \__hyp_color_set:nn #1 #2
 {
   \tl_if_head_eq_charcode:nNTF {#2}[ %]
    {
      \__hyp_color_set_aux:nwn  { #1 } #2
    }
    {
      \color_set:nn {#1} {#2}
    }
 }

\cs_new_protected:Npn \__hyp_color_set_aux:nwn #1 [#2] #3
  {
     \color_set:nnn {#1}{#2}{#3}
  }

\cs_generate_variant:Nn \__hyp_color_set:nn {ne}
\prop_map_inline:Nn \c__hyp_map_hyp_annot_prop
  {
     \hook_gput_code:nnn
       {pdfannot/link/#2/begin}
       {hyp/color}
       {
         \bool_if:cT { l_hyp_annot_color#1_bool }
           {
             \group_begin:
             \color_select:n { hyp/color/#1}
           }
       }
     \hook_gput_code:nnn
       {pdfannot/link/#2/end}
       {hyp/color}
       {
         \bool_if:cT { l_hyp_annot_color#1_bool }
           {
             \group_end:
           }
       }
  }
\keys_define:nn { hyp / setup }
  {
    ,colorlinks .meta:n =
      {
        ,pdfborder={0~0~0}
        ,pdfborderstyle=
        ,colorurl  =#1
        ,colorlink =#1
        ,colorrun  =#1
        ,colormenu =#1
        ,colorfile =#1
        }
    ,colorlinks .default:n = {true}
  }
\seq_map_inline:Nn \c__hyp_annot_types_seq
  {
     \keys_define:nn { hyp / setup }
       {
         ,color#1 .bool_set:c = { l_hyp_annot_color#1_bool }
         ,#1color .code:n =     { \__hyp_color_set:ne {hyp/color/#1}{##1} }
       }
  }

\keys_define:nn { hyp / setup }
  {
    ,allcolors .meta:n =
      {
        ,urlcolor=#1
        ,linkcolor=#1
        ,runcolor=#1
        ,filecolor=#1
        ,menucolor=#1
      }
    ,allcolors .value_required:n = true
  }
\keys_define:nn { hyp / setup }
  {
    ,bordercolormodel .choices:nn =
     {rgb,cmyk}
     { \str_gset:Nn \g__hyp_bordercolormodel_str {space-sep-#1}}
    ,bordercolormodel .initial:n ={rgb}
  }
\prop_map_inline:Nn \c__hyp_map_hyp_annot_prop
  {
    \keys_define:nn { hyp / setup }
      {
        #1bordercolor .code:n =
          {
             \tl_if_empty:nTF { ##1 }
               {
                 \pdfannot_dict_remove:nn
                  {link/#2}
                  { C }
               }
               {
                 \__hyp_color_set:ne {hyp/color/#1border}{##1}
                 \color_export:nVN
                   {hyp/color/#1border}
                   \g__hyp_bordercolormodel_str
                   \l__hyp_tmpa_tl
                 \pdfannot_dict_put:nnx
                   {link/#2}
                   { C }
                   { [\l__hyp_tmpa_tl] }
               }
          }
      }
  }

\keys_define:nn { hyp / setup }
  {
    ,allbordercolors .meta:n =
      {
        ,linkbordercolor=#1
        ,urlbordercolor =#1
        ,filebordercolor=#1
        ,menubordercolor=#1
        ,runbordercolor =#1
      }
    ,allbordercolors .value_required:n = true
  }

\prop_map_inline:Nn \c__hyp_map_hyp_annot_prop
  {
    \keys_define:nn { hyp / setup }
      {
        #1border .code:n =
          {
             \tl_if_empty:nTF { ##1 }
               {
                 \pdfannot_dict_remove:nn
                  {link/#2}
                  { Border }
               }
               {
                 \pdfannot_dict_put:nnn
                   {link/#2}
                   { Border }
                   { [##1] }
               }
          }
      }
  }
\keys_define:nn { hyp / setup }
  {
    ,pdfborder  .code:n =
      {
        \tl_if_empty:nTF { #1 }
         {
           \prop_map_inline:Nn \c__hyp_map_hyp_annot_prop
             {
               \pdfannot_dict_remove:nn
                  {link/##2}
                  { Border }
             }
         }
         {
           \prop_map_inline:Nn \c__hyp_map_hyp_annot_prop
             {
               \pdfannot_dict_put:nnn
                 {link/##2}
                 { Border }
                 { [#1] }
             }
         }
      }
    ,pdfborder .initial:n = {0~0~1},
  }
\prop_map_inline:Nn \c__hyp_map_hyp_annot_prop
  {
    \keys_define:nn { hyp / setup }
      {
        #1borderstyle .code:n =
          {
             \tl_if_empty:nTF { ##1 }
               {
                 \pdfannot_dict_remove:nn
                  {link/#2}
                  { BS }
               }
               {
                 \pdfannot_dict_put:nnn
                   {link/#2}
                   { BS }
                   { <<##1>> }
               }
          }
      }
  }
\keys_define:nn { hyp / setup }
  {
    ,pdfborderstyle  .code:n =
      {
        \tl_if_empty:nTF { #1 }
         {
           \prop_map_inline:Nn \c__hyp_map_hyp_annot_prop
             {
               \pdfannot_dict_remove:nn
                  {link/##2}
                  { BS }
             }
         }
         {
           \prop_map_inline:Nn \c__hyp_map_hyp_annot_prop
             {
               \pdfannot_dict_put:nnn
                 {link/##2}
                 { BS }
                 { <<#1>> }
             }
         }
      }
    ,pdfborderstyle .initial:n = {},
  }
\cs_new_protected:Npn \__hyp_ocg_init:
  {
     \pdf_object_new:n   { __hyp/OCG/View }
     \pdf_object_new:n   { __hyp/OCG/Print }
     \pdf_object_new:n   { __hyp/OCG/config }
     \pdf_object_new:n   { __hyp/OCG/refarray }
        \pdf_object_write:nnx { __hyp/OCG/refarray } { array }
          {
            \pdf_object_ref:n { __hyp/OCG/View }
            \c_space_tl
            \pdf_object_ref:n { __hyp/OCG/Print }
          }
        \pdf_object_write:nnn { __hyp/OCG/View } { dict }
          {
            /Type/OCG
            /Name(View)
            /Usage
             <<
              /Print <</PrintState/OFF>>~
              /View  <</ViewState/ON  >>~
             >>
          }
        \pdf_object_write:nnn { __hyp/OCG/Print } { dict }
          {
            /Type/OCG
            /Name(Print)
            /Usage
             <<
              /Print <</PrintState/ON>>~
              /View  <</ViewState/OFF>>~
             >>
          }
       \pdfmanagement_add:nnx { Catalog / OCProperties }{OCGs }{ \pdf_object_ref:n {__hyp/OCG/View} }
       \pdfmanagement_add:nnx { Catalog / OCProperties }{OCGs }{ \pdf_object_ref:n {__hyp/OCG/Print} }
       \pdf_object_write:nnx { __hyp/OCG/config } { dict }
         {
           /OFF[\pdf_object_ref:n { __hyp/OCG/Print }]
           /AS[
             <<
              /Event/View
              /OCGs\c_space_tl \pdf_object_ref:n { __hyp/OCG/refarray }
              /Category[/View]
             >>
             <<
              /Event/Print
              /OCGs\c_space_tl \pdf_object_ref:n { __hyp/OCG/refarray }
              /Category[/Print]
             >>
             <<
              /Event/Export
              /OCGs\c_space_tl \pdf_object_ref:n { __hyp/OCG/refarray }
              /Category[/Print]
             >>
              ]
         }
       \pdfmanagement_add:nnx { Catalog / OCProperties }{ D }{ \pdf_object_ref:n { __hyp/OCG/config} }
       \cs_gset:Npn \__hyp_ocg_init: {}
  }
\prop_map_inline:Nn \c__hyp_map_hyp_annot_prop
  {
     \hook_gput_code:nnn
       {pdfannot/link/#2/begin}
       {hyp/ocg}
       {
         \bool_if:cT { l_hyp_annot_ocgcolor#1_bool }
           {
             \__hyp_ocg_init:
             \group_begin:
             \hbox_set:Nw \l__hyp_tmpa_box
           }
       }
     \hook_gput_code:nnn
       {pdfannot/link/#2/end}
       {hyp/ocg}
       {
         \bool_if:cT { l_hyp_annot_ocgcolor#1_bool }
           {
             \hbox_set_end:
               \mbox
                 {
                   \pdf_bdcobject:nn {OC}{__hyp/OCG/Print}
                   \hbox_overlap_right:n { \box_use:N \l__hyp_tmpa_box }
                   \pdf_emc:
                   \pdf_bdcobject:nn {OC}{__hyp/OCG/View}
                   \group_begin:
                   \color_select:n { hyp/color/#1 }
                   \box_use_drop:N \l__hyp_tmpa_box
                   \group_end:
                   \pdf_emc:
                 }
             \group_end:
           }
       }
  }
\bool_lazy_or:nnTF
  { \pdf_version_compare_p:Nn > {1.4} }
  { \str_if_eq_p:ee{\pdf_version_major:}{-1} }
  {
     \keys_define:nn { hyp / setup }
       {
         ,_ocgcolorlinks .meta:n =
            {
              ocgcolorlink=#1,
              ocgcolorurl=#1,
              ocgcolorfile=#1,
              ocgcolorrun=#1,
              ocgcolormenu=#1
            }
         ,_ocgcolorlinks .default:n = true
       }
  }
  {
    \keys_define:nn { hyp / setup }
      {
        ,_ocgcolorlinks .code:n =
          {
            \msg_warning:nnxx
              { hyp }
              { ignore-deprecated-or-unknown-option-in-pdf-version }
              { ocgcolorlinks } { \pdf_version_major:.\pdf_version_minor: }
          }
      }
  }

\keys_define:nn { hyp / setup }
  {
    ,ocgcolorlinks .choice:
    ,ocgcolorlinks / true .meta:n =
      {
        pdfborder      ={0~0~0},
        pdfborderstyle ={},
        colorlinks     = false,
        _ocgcolorlinks = true
      }
    ,ocgcolorlinks / false .meta:n =
      {
        _ocgcolorlinks = false
      }
    ,ocgcolorlinks .default:n = {true}
  }

\seq_map_inline:Nn \c__hyp_annot_types_seq
  {
    \bool_lazy_or:nnTF
      { \pdf_version_compare_p:Nn > {1.4} }
      { \str_if_eq_p:ee{\pdf_version_major:}{-1} }
      {
        \keys_define:nn { hyp / setup }
          {
            ,ocgcolor#1 .bool_set:c = { l_hyp_annot_ocgcolor#1_bool }
          }
      }
      {
        \keys_define:nn { hyp / setup }
          {
            ,ocgcolor#1 .code:n=
              {
                \msg_warning:nnxx
                  { hyp }
                  { ignore-deprecated-or-unknown-option-in-pdf-version }
                  { ocgcolor#1 }
                  { \pdf_version_major:.\pdf_version_minor: }
              }
          }
      }
  }
\prop_map_inline:Nn \c__hyp_map_hyp_annot_prop
  {
    \keys_define:nn { hyp / setup }
      {
        ,#1highlight .choices:nn =
          { /I, /N, /O, /P}
          {
                \pdfannot_dict_put:nnn
                  {link/#2}
                  { H }
                  { ##1 }

          }
        ,#1highlight / .code:n =
         {
           \pdfannot_dict_remove:nn
             {link/#2}
             { H }

          }
        ,#1highlight / unknown .code:n =
          {
           \msg_warning:nnxxx { hyp } { unknown-choice+empty }
             { pdfhighlight }
             { /I~(inverse), /N~(no effect), /O~(outline), /P~(inset) }
             { \exp_not:n {##1} }
          }
      }
  }

\keys_define:nn { hyp / setup }
  {
    ,pdfhighlight .choices:nn =
      { /I, /N, /O, /P}
      {
        \prop_map_inline:Nn \c__hyp_map_hyp_annot_prop
          {
            \pdfannot_dict_put:nnn
              {link/####2}
              { H }
              { #1  }
          }
      }
    ,pdfhighlight / .code:n =
     {
        \prop_map_inline:Nn \c__hyp_map_hyp_annot_prop
          {
            \pdfannot_dict_remove:nn
              {link/##2}
              { H }
          }
      }
    ,pdfhighlight .initial:n = {/I},
    ,pdfhighlight / unknown .code:n =
      {
       \msg_warning:nnxxx { hyp } { unknown-choice+empty }
         { pdfhighlight }
         { /I~(inverse), /N~(no effect), /O~(outline), /P~(inset) }
         { \exp_not:n {#1} }
      }
  }
\keys_define:nn { hyp / setup }
  {
    hidelinks .meta:n =
      {
        ,colorlinks    = false
        ,ocgcolorlinks = false
        ,pdfborder     = { 0~0~0 }
        ,pdfborderstyle=
      }
  }

\seq_map_inline:Nn \c__hyp_annot_types_seq
  {
    \keys_define:nn { hyp / setup }
      {
        hide#1 .meta:n =
          {
             ,color#1       = false
             ,ocgcolor#1    = false
             ,#1border      = { 0~0~0 }
             ,#1borderstyle =
          }
      }
  }
\keys_define:nn { hyp / setup }
  {
    colorscheme .code:n =
      {
        \prop_map_inline:cn { c__hyp_colorscheme_#1_prop }
          {
            \keys_set:nn { hyp /setup }
              {
                 ##1 = ##2
              }
          }
      }
  }
\keys_set:nn { hyp / setup } {colorscheme=phelype}
\keys_define:nn { hyp / setup }
  {
    ,unicode     .code:n = {}
    ,pdfencoding .code:n = {}
    ,pdfversion .code:n =
      {
         \msg_warning:nn { hyp }{ pdfversion-disabled }
      }
   }
\keys_define:nn { hyp / setup }
 {
   ,verbose   .legacy_if_set:n  = {Hy@verbose}
   ,debug     .legacy_if_set:n  = {Hy@verbose}
 }
\keys_define:nn { hyp / setup }
  {
   ,draft .code:n =
     {
       \Hy@drafttrue
       \PassOptionsToPackage{draft}{bookmark}
     }
   ,final .code:n =
     {
       \Hy@finaltrue
       \PassOptionsToPackage{final}{bookmark}
     }
  }
\keys_define:nn { hyp / setup }
 {
   ,extension .tl_set:N = \XR@ext
   ,extension .initial:n= pdf
   ,hypertexnames .legacy_if_set:n = {Hy@hypertexnames}
   ,linkfileprefix .tl_set:N  = \Hy@linkfileprefix
   ,localanchorname .legacy_if_set:n = {Hy@localanchorname}
   ,naturalnames .legacy_if_set:n = {Hy@naturalnames}
   ,pageanchor   .legacy_if_set:n = {Hy@pageanchor}
   ,plainpages   .legacy_if_set:n = {Hy@plainpages}
 }

\keys_define:nn { hyp / setup }
 {
   ,linktoc .choices:nn = { none, section, all, page }
     {
       \cs_set_eq:Nc \Hy@linktoc { Hy@linktoc@#1 }
     }
   ,linktoc / unknown .code:n =
     {
       \msg_warning:nnxxx { hyp } { unknown-choice }
         { linktoc }
         { none, section, all, page }
         { \exp_not:n {#1} }
     }
   ,linktocpage .choice:
   ,linktocpage / true  .meta:n = {linktoc=page}
   ,linktocpage / false .meta:n = {linktoc=section}
   ,linktocpage .default:n = true
 }

\prop_map_inline:Nn \c__hyp_map_hyp_annot_prop
  {
    \keys_define:nn { hyp / setup }
     {
       ,#1 .bool_set:c = {l__hyp_annot_#2_bool}
     }
  }
\keys_define:nn { hyp / setup }
 {
   ,baseurl       .code:n =
     {
       \__hyp_text_pdfstring:ooN  { #1 } {\l__hyp_text_enc_uri_print_tl} \l__hyp_tmpa_tl
        \tl_if_empty:NTF \l__hyp_tmpa_tl
          {
             \pdfmanagement_remove:nn {Catalog} { URI }
          }
          {
             \pdfmanagement_add:nnx {Catalog} { URI }{ <</Base \l__hyp_tmpa_tl>> }
          }
        \__hyp_store_metadata:nn {baseurl}{#1}
     }
   %only false does something ...
   ,bookmarks .choice:
   ,bookmarks / false .code:n = {\RemoveFromHook {begindocument/before}[hyperref/bookmark]}
   ,bookmarks / true .code:n = {}
   ,bookmarks .default:n = {true}
   ,bookmarksnumbered .legacy_if_set:n  = {Hy@bookmarksnumbered}
   ,bookmarksopen .legacy_if_set:n = {Hy@bookmarksopen}
   ,bookmarksopenlevel .tl_set:N = \@bookmarksopenlevel
   ,bookmarkstype .tl_set:N = \Hy@bookmarkstype
   ,pdfcenterwindow    .choice:
   ,pdfcenterwindow / false .code:n =
     {
       \pdfmanagement_remove:nn {Catalog / ViewerPreferences }{ CenterWindow }
     }
   ,pdfcenterwindow / true .code:n =
     {
       \pdfmanagement_add:nnn {Catalog / ViewerPreferences } { CenterWindow }{ true }
     }
   ,pdfcenterwindow /  .code:n =
     {
       \pdfmanagement_remove:nn {Catalog / ViewerPreferences }{ CenterWindow }
     }
   ,pdfcenterwindow / unknown .code:n =
     {
       \msg_warning:nnxx { hyp } { no-bool }
         { pdfcenterwindow }
         { \exp_not:n {#1} }
     }
   ,pdfcenterwindow    .default:n = true
   ,pdfdirection    .choice:
   ,pdfdirection / L2R .code:n =
     {
       \pdfmanagement_add:nnn {Catalog / ViewerPreferences } { Direction }{ /L2R }
     }
   ,pdfdirection / R2L .code:n =
     {
       \pdfmanagement_add:nnn {Catalog / ViewerPreferences } { Direction }{ /R2L }
     }
   ,pdfdirection /  .code:n =
     {
       \pdfmanagement_remove:nn {Catalog / ViewerPreferences } { Direction }
     }
   ,pdfdirection / unknown .code:n =
     {
       \msg_warning:nnxxx { hyp } { unknown-choice+empty }
         { pdfdirection }
         { L2R , R2L }
         { \exp_not:n {#1} }
     }
   ,pdfdisplaydoctitle    .choice:
   ,pdfdisplaydoctitle / false .code:n =
     {
       \pdfmanagement_remove:nn {Catalog / ViewerPreferences } { DisplayDocTitle }
     }
   ,pdfdisplaydoctitle / true .code:n =
     {
       \pdfmanagement_add:nnn {Catalog / ViewerPreferences } { DisplayDocTitle } { true }
     }
   ,pdfdisplaydoctitle    .default:n = true
   ,pdfduplex    .choices:nn =
     {Simplex, DuplexFlipShortEdge, DuplexFlipLongEdge}
     {
       \pdf_version_compare:NnTF > {1.6}
         {
           \pdfmanagement_add:nnn {Catalog / ViewerPreferences }
             { PrintDuplex } { /#1 }
         }
         {
           \msg_warning:nnxx
             {hyp}
             {ignore-deprecated-or-unknown-option-in-pdf-version}
             {pdfduplex}
             {\pdf_version:}
         }
     }%
   ,pdfduplex /  .code:n =
     {
       \pdfmanagement_remove:nn {Catalog / ViewerPreferences } { PrintDuplex }
     }
   ,pdfduplex / unknown .code:n =
     {
       \msg_warning:nnxxx { hyp } { unknown-choice+empty }
         { pdfduplex }
         { Simplex, DuplexFlipShortEdge, DuplexFlipLongEdge }
         { \exp_not:n {#1} }
     }
   ,pdffitwindow    .choice:
   ,pdffitwindow / false .code:n =
     {
       \pdfmanagement_remove:nn {Catalog / ViewerPreferences }  { FitWindow }
     }
   ,pdffitwindow / true .code:n =
     {
       \pdfmanagement_add:nnn {Catalog / ViewerPreferences } { FitWindow } { true }
     }
   ,pdffitwindow /  .code:n =
     {
       \pdfmanagement_remove:nn {Catalog / ViewerPreferences } { FitWindow }
     }
   ,pdffitwindow    .default:n = true
   ,pdffitwindow / unknown .code:n =
     {
       \msg_warning:nnxx { hyp } { no-bool }
         { pdffitwindow }
         { \exp_not:n {#1} }
     }
   ,pdflinkmargin .code:n = { \pdfannot_link_margin:n { #1 } }
   ,pdflinkmargin .initial:n = {1pt}
   ,pdfmenubar    .choice:
   ,pdfmenubar / true .code:n =
     {
       \pdfmanagement_remove:nn {Catalog / ViewerPreferences } { HideMenubar }
     }
   ,pdfmenubar / false .code:n =
     {
       \pdfmanagement_add:nn {Catalog / ViewerPreferences }
          { HideMenubar } { true }
     }
   ,pdfmenubar /  .code:n =
     {
       \pdfmanagement_remove:nn {Catalog / ViewerPreferences } { HideMenubar }
     }
   ,pdfmenubar    .default:n = true
   ,pdfmenubar / unknown .code:n =
     {
       \msg_warning:nnxx { hyp } { no-bool }
         { pdfmenubar }
         { \exp_not:n {#1} }
     }
   ,pdfnewwindow .choice:
   ,pdfnewwindow / true .code:n =
     {
       \pdfdict_put:nnn {l_hyp/annot/A/GoToR}{/NewWindow}{true}
       \pdfdict_put:nnn {l_hyp/annot/A/Launch}{/NewWindow}{true}
     }
   ,pdfnewwindow / false .code:n =
     {
       \pdfdict_put:nnn {l_hyp/annot/A/GoToR}{/NewWindow}{false}
       \pdfdict_put:nnn {l_hyp/annot/A/Launch}{/NewWindow}{false}
     }
   ,pdfnewwindow /  .code:n =
     {
       \pdfdict_remove:nn {l_hyp/annot/A/GoToR}{/NewWindow}
       \pdfdict_remove:nn {l_hyp/annot/A/Launch}{/NewWindow}
     }
   ,pdfnonfullscreenpagemode   .choices:nn =
     { UseNone, UseOutlines, UseThumbs, FullScreen, UseOC } %pdf 1.5
     {
       \pdfmanagement_add:nnx {Catalog / ViewerPreferences }
         { NonFullScreenPageMode} {/#1}
     }
   ,pdfnonfullscreenpagemode / UseAttachments .code:n =
     {
       \pdf_version_compare:NnTF < {1.6}
         {
           %message
         }
         {
           \pdfmanagement_add:nnx {Catalog / ViewerPreferences }
             {NonFullScreenPageMode}{/UseAttachments}
         }
     }
   ,pdfnonfullscreenpagemode /  .code:n =
     {
       \pdfmanagement_remove:nn {Catalog / ViewerPreferences } { NonFullScreenPageMode }
     }
   ,pdfnonfullscreenpagemode / unknown .code:n =
     {
       \msg_warning:nnxxx { hyp } { unknown-choice+empty }
         { pdfnonfullscreenpagemode }
         { UseNone, UseOutlines, UseThumbs, FullScreen, UseOC, UseAttachments (PDF 1.6) }
         { \exp_not:n {#1} }
     }
   ,pdfnumcopies .code:n =
     {
       \pdf_version_compare:NnTF > {1.6}
         {
           \tl_if_empty:nTF {#1}
             {
               \pdfmanagement_remove:nn {Catalog / ViewerPreferences } { NumCopies }
             }
             {
               \pdfmanagement_add:nnx {Catalog / ViewerPreferences }
                 {NumCopies}{#1}
             }
         }
         {
           \msg_warning:nnxx
             {hyp}
             {ignore-deprecated-or-unknown-option-in-pdf-version}
             {pdfnumcopies}
             {\pdf_version:}
         }
     }
   ,pdfpagelayout .choices:nn =
     { SinglePage, OneColumn, TwoColumnLeft, TwoColumnRight, TwoPageLeft, TwoPageRight}
     { \pdfmanagement_add:nnx {Catalog} { PageLayout }{ /#1 } }
   ,pdfpagelayout / .code:n =
     { \pdfmanagement_remove:nn {Catalog} { PageLayout } }
   ,pdfpagelayout / unknown .code:n =
     {
       \msg_warning:nnxxx { hyp } { unknown-choice+empty }
         { pdfpagelayout }
         { SinglePage, OneColumn, TwoColumnLeft, TwoColumnRight, TwoPageLeft, TwoPageRight }
         { \exp_not:n {#1} }
     }
   ,pdfpagemode   .choices:nn =
     { UseNone, UseOutlines, UseThumbs, FullScreen, UseOC } %pdf 1.5
     { \pdfmanagement_add:nnx {Catalog} { PageMode }{ /#1 } }
   ,pdfpagemode / UseAttachments .code:n =
     {
       \pdf_version_compare:NnTF > {1.5}
         {
           \pdfmanagement_add:nnx {Catalog} { PageMode }{ /UseAttachments }
         }
         {
           \msg_warning:nnxx
             {hyp}
             {ignore-deprecated-or-unknown-value-in-pdf-version}
             {UseAttachments}
             {\pdf_version:}
         }
     }
   ,pdfpagemode   .initial:n  = { UseOutlines } %for now ...
   ,pdfpagemode / unknown .code:n =
     {
       \msg_warning:nnxxx { hyp } { unknown-choice+empty }
         { pdfpagemode }
         { UseNone, UseOutlines, UseThumbs, FullScreen, UseOC, UseAttachments (PDF 1.6) }
         { \exp_not:n {#1} }
     }
   ,pdfpagescrop  .code:n =
     {
       \tl_if_empty:nTF {#1} %or blank?
         {
           \pdfmanagement_remove:nn {Pages} { CropBox }
         }
         {
           \pdfmanagement_add:nnx {Pages} { CropBox } { [#1] }
         }
     }
   ,pdfpicktraybypdfsize    .choice:
   ,pdfpicktraybypdfsize / true .code:n =
     {
       \pdf_version_compare:NnTF > {1.6}
         {
           \pdfmanagement_add:nnn {Catalog / ViewerPreferences }
             { PickTrayByPDFSize } { true }
         }
         {
           \msg_warning:nnxx
             {hyp}
             {ignore-deprecated-or-unknown-option-in-pdf-version}
             {pdfpicktraybypdfsize}
             {\pdf_version:}
         }
     }
   ,pdfpicktraybypdfsize / false .code:n =
     {
       \pdf_version_compare:NnTF > {1.6}
         {
           \pdfmanagement_add:nnn {Catalog / ViewerPreferences }
             { PickTrayByPDFSize } { false }
         }
         {
           \msg_warning:nnxx
             {hyp}
             {ignore-deprecated-or-unknown-option-in-pdf-version}
             {pdfpicktraybypdfsize}
             {\pdf_version:}
         }
     }
   ,pdfpicktraybypdfsize /  .code:n =
     {
       \pdfmanagement_remove:nn {Catalog / ViewerPreferences } { PickTrayByPDFSize }
     }
   ,pdfpicktraybypdfsize / unknown .code:n =
     {
       \msg_warning:nnxx { hyp } { no-bool }
         { picktraybypdfsize }
         { \exp_not:n {#1} }
     }
   ,pdfprintarea    .choices:nn =
     { MediaBox, CropBox, BleedBox, TrimBox, ArtBox }
     {
       \pdf_version_compare:NnTF < {2.0}
         {
           \pdfmanagement_add:nnx {Catalog / ViewerPreferences }
             { PrintArea } { /#1 }
         }
         {
           \msg_warning:nnxx
             {hyp}
             {ignore-deprecated-or-unknown-option-in-pdf-version}
             {pdfprintarea}
             {\pdf_version:}
         }
     }%
   ,pdfprintarea /  .code:n =
     { \pdfmanagement_remove:nn {Catalog / ViewerPreferences } { PrintArea } }
   ,pdfprintarea / unknown .code:n =
     {
       \msg_warning:nnxxx { hyp } { unknown-choice+empty }
         { pdfprintarea }
         { MediaBox, CropBox, BleedBox, TrimBox, ArtBox }
         { \exp_not:n {#1} }
     }
   ,pdfprintclip    .choices:nn =
     { MediaBox, CropBox, BleedBox, TrimBox, ArtBox }
     {
       \pdf_version_compare:NnTF < {2.0}
         {
           \pdfmanagement_add:nnx {Catalog / ViewerPreferences }
             { PrintClip } { /#1 }
         }
         {
           \msg_warning:nnxx
             {hyp}
             {ignore-deprecated-or-unknown-option-in-pdf-version}
             {pdfprintclip}
             {\pdf_version:}
         }
     }%
   ,pdfprintclip /  .code:n =
     {
       \pdfmanagement_remove:nn {Catalog / ViewerPreferences } { PrintClip }
     }
   ,pdfprintclip / unknown .code:n =
     {
       \msg_warning:nnxxx { hyp } { unknown-choice+empty }
         { pdfprintclip }
         { MediaBox, CropBox, BleedBox, TrimBox, ArtBox }
         { \exp_not:n {#1} }
     }
   ,pdfprintpagerange .code:n =
     {
       \pdf_version_compare:NnTF > {1.6}
         {
           \tl_if_empty:nTF { #1}
             {
               \pdfmanagement_remove:nn {Catalog / ViewerPreferences }
                 { PrintPageRange }
             }
             {
              \pdfmanagement_add:nnx {Catalog / ViewerPreferences }
                 {PrintPageRange}{[#1]}
             }
         }
         {
            \msg_warning:nnxx
              {hyp}
              {ignore-deprecated-or-unknown-option-in-pdf-version}
              {pdfprintpagerange}
              {\pdf_version:}
         }
     }
   ,pdfprintscaling    .choices:nn =
     { None, AppDefault }
     {
       \pdf_version_compare:NnTF > {1.5}
         {
           \pdfmanagement_add:nnx {Catalog / ViewerPreferences }
             { PrintScaling } { /#1 }
         }
         {
           \msg_warning:nnxx
             {hyp}
             {ignore-deprecated-or-unknown-option-in-pdf-version}
             {pdfprintscaling}
             {\pdf_version:}
         }
     }%
   ,pdfprintscaling /  .code:n =
     {
       \pdfmanagement_remove:nn {Catalog / ViewerPreferences } {PrintScaling }
     }
   ,pdfprintscaling / unknown .code:n =
     {
       \msg_warning:nnxxx { hyp } { unknown-choice+empty }
         { pdfprintarea }
         { None, AppDefault }
         { \exp_not:n {#1} }
     }
   ,pdfremotestartview .code:n =
     {
       \tl_set:Nx \l__hyp_tmpa_tl {#1~null~null~null~}
       \exp_args:NNV
       \regex_extract_once:NnNTF \c__hyp_dest_startview_regex \l__hyp_tmpa_tl  \l__hyp_tmpa_seq
         {
           \tl_set:Nx \l__hyp_dest_pdfremotestartview_tl {\seq_item:Nn \l__hyp_tmpa_seq {1}}
         }
         {
           \msg_warning:nnnn {hyp}{invalid-destination-value}{#1}{pdfremotestartview}
           \tl_set:Nn \l__hyp_dest_pdfremotestartview_tl {Fit}
         }
     }
   ,pdfremotestartview .initial:n = {Fit}
   % pdfstartpage is special as it shares code with pdfstartview
   ,pdfstartpage .code:n =
     {
       \tl_gset:Nx \g__hyp_dest_pdfstartpage_tl { #1 }
       \bool_if:nTF
         { \tl_if_empty_p:N \g__hyp_dest_pdfstartpage_tl || \tl_if_empty_p:N \g__hyp_dest_pdfstartview_tl }
         {
           \pdfmanagement_remove:nn {Catalog} { OpenAction }
         }
         {
           \pdfmanagement_add:nnx {Catalog} { OpenAction }
             {
               [\pdf_pageobject_ref:n {\g__hyp_dest_pdfstartpage_tl}~/\g__hyp_dest_pdfstartview_tl]
             }
         }
     }
   ,pdfstartpage .initial:n =1
   ,pdfstartview .code:n =
     {
       \tl_set:Nx \l__hyp_tmpa_tl {#1~null~null~null~}
       \exp_args:NNV
       \regex_extract_once:NnNTF \c__hyp_dest_startview_regex \l__hyp_tmpa_tl  \l__hyp_tmpa_seq
         {
           \tl_gset:Nx \g__hyp_dest_pdfstartview_tl {\seq_item:Nn \l__hyp_tmpa_seq {1}}
         }
         {
           \msg_warning:nnnn {hyp}{invalid-destination-value}{#1}{pdfstartview}
           \tl_gset:Nn \g__hyp_dest_pdfstartview_tl {Fit}
         }
       \bool_if:nTF
         { \tl_if_empty_p:N \g__hyp_dest_pdfstartpage_tl || \tl_if_empty_p:N \g__hyp_dest_pdfstartview_tl }
         {
           \pdfmanagement_remove:nn {Catalog} { OpenAction }
         }
         {
           \pdfmanagement_add:nnx {Catalog} { OpenAction }
             {
               [\pdf_pageobject_ref:n {\g__hyp_dest_pdfstartpage_tl}~/\g__hyp_dest_pdfstartview_tl]
             }
         }
     }
   ,pdfstartview .initial:n = Fit
   ,pdftoolbar    .choice:
   ,pdftoolbar / true .code:n =
     {
       \pdfmanagement_remove:nn {Catalog / ViewerPreferences } { HideToolbar }
     }
   ,pdftoolbar / false .code:n =
     {
       \pdfmanagement_add:nnn {Catalog / ViewerPreferences }
         { HideToolbar } { true }
     }
   ,pdftoolbar / true .code:n =
     {
       \pdfmanagement_remove:nn {Catalog / ViewerPreferences } { HideToolbar }
     }
   ,pdftoolbar    .default:n = true
   ,pdftoolbar / unknown .code:n =
     {
       \msg_warning:nnxx { hyp } { no-bool }
         { pdftoolbar }
         { \exp_not:n {#1} }
     }
   % pdfview see below.
   ,pdfviewarea    .choices:nn =
     { MediaBox, CropBox, BleedBox, TrimBox, ArtBox }
     {
       \pdf_version_compare:NnTF < {2.0}
         {
           \pdfmanagement_add:nnn {Catalog / ViewerPreferences }
             { ViewArea } { /#1 }
         }
         {
           \msg_warning:nnxx
             {hyp}
             {ignore-deprecated-or-unknown-option-in-pdf-version}
             {pdfviewarea}
             {\pdf_version:}
         }
     }%
   ,pdfviewarea /  .code:n =
     {
       \pdfmanagement_remove:nn {Catalog / ViewerPreferences } { ViewArea }
     }
   ,pdfviewarea / unknown .code:n =
     {
       \msg_warning:nnxxx { hyp } { unknown-choice+empty }
         { pdfviewarea }
         { MediaBox, CropBox, BleedBox, TrimBox, ArtBox }
         { \exp_not:n {#1} }
     }
   ,pdfviewclip    .choices:nn =
     { MediaBox, CropBox, BleedBox, TrimBox, ArtBox }
     {
       \pdf_version_compare:NnTF < {2.0}
         {
           \pdfmanagement_add:nnn {Catalog / ViewerPreferences }
             { ViewClip } { /#1 }
         }
         {
           \msg_warning:nnxx
             {hyp}
             {ignore-deprecated-or-unknown-option-in-pdf-version}
             {pdfviewclip}
             {\pdf_version:}
         }
     }%
   ,pdfviewclip /  .code:n =
     {
       \pdfmanagement_remove:nn {Catalog / ViewerPreferences } { ViewClip }
     }
   ,pdfviewclip / unknown .code:n =
     {
       \msg_warning:nnxxx { hyp } { unknown-choice+empty }
         { pdfviewclip }
         { MediaBox, CropBox, BleedBox, TrimBox, ArtBox }
         { \exp_not:n {#1} }
     }
   ,pdfwindowui    .choice:
   ,pdfwindowui / true .code:n =
     {
       \pdfmanagement_remove:nn {Catalog / ViewerPreferences } { HideWindowUI }
     }
   ,pdfwindowui / false .code:n =
     {
       \pdfmanagement_add:nnn {Catalog / ViewerPreferences }
          { HideWindowUI } { true }
     }
   ,pdfwindowui /  .code:n =
     {
       \pdfmanagement_remove:nn {Catalog / ViewerPreferences } {HideWindowUI }
     }
   ,pdfwindowui / unknown .code:n =
     {
       \msg_warning:nnxx { hyp } { no-bool }
         { pdfwindowui }
         { \exp_not:n {#1} }
     }
   ,pdfwindowui    .default:n = true
 }
\keys_define:nn { hyp / setup }
  {
    ,pdfview .code:n =
      {
        \seq_set_split:Nnn \l__hyp_tmpa_seq {~}{#1}
        \str_case_e:nnF { \str_lowercase:f{ \seq_item:Nn \l__hyp_tmpa_seq {1} } }
           {
             { xyz }
               {
                 \int_compare:nNnTF {\seq_count:N \l__hyp_tmpa_seq } > { 1 }
                   {
                     \seq_get_right:NN \l__hyp_tmpa_seq \l__hyp_tmpa_tl
                     \tl_if_eq:NnTF \l__hyp_tmpa_tl {null}
                       {
                         \tl_set:Nn \l__hyp_dest_pdfview_tl {xyz}
                       }
                       {
                         \tl_set:Nx \l__hyp_dest_pdfview_tl
                            {
                               \fp_eval:n { \l__hyp_tmpa_tl * 100 }
                            }
                       }
                   }
                   {
                     \tl_set:Nn \l__hyp_dest_pdfview_tl {xyz}
                   }
               }
             { fit }   { \tl_set:Nn \l__hyp_dest_pdfview_tl {fit}  }
             { fitb }  { \tl_set:Nn \l__hyp_dest_pdfview_tl {fitb} }
             { fitbh } { \tl_set:Nn \l__hyp_dest_pdfview_tl {fitbh}}
             { fitbv } { \tl_set:Nn \l__hyp_dest_pdfview_tl {fitbv}}
             { fith }  { \tl_set:Nn \l__hyp_dest_pdfview_tl {fith} }
             { fitv }  { \tl_set:Nn \l__hyp_dest_pdfview_tl {fitv} }
             { fitr }
               {
                 \int_compare:nNnTF {\seq_count:N \l__hyp_tmpa_seq } = {1}
                   {
                     \tl_set:Nn \l__hyp_dest_pdfview_tl {fitr}
                   }
                   {
                      %ensure 4 values ...
                     \tl_set:Nn \l__hyp_dest_pdfview_tl {fitrbox}
                     \seq_put_right:Nn \l__hyp_tmpa_seq  {0}
                     \seq_put_right:Nn \l__hyp_tmpa_seq  {0}
                     \seq_put_right:Nn \l__hyp_tmpa_seq  {0}
                     \hbox_set_to_wd:Nnn \l__hyp_dest_box
                       {
                         \fp_eval:n
                          {
                            round
                             (
                               abs
                                (
                                  \seq_item:Nn\l__hyp_tmpa_seq{4}
                                  -
                                  (\seq_item:Nn\l__hyp_tmpa_seq{2})
                                 ),
                                3
                             )
                          }bp
                       }{}
                     \box_set_dp:Nn \l__hyp_dest_box
                       {
                         \fp_eval:n
                           {
                             round(0 - (\seq_item:Nn\l__hyp_tmpa_seq{3}),3)
                           }bp
                       }
                     \box_set_ht:Nn \l__hyp_dest_box
                       {
                         \seq_item:Nn\l__hyp_tmpa_seq{5}bp
                       }
                   }
               }
           }
           {
              \msg_warning:nnnn {hyp}{invalid-destination-value}{#1}{pdfview}
              \tl_set:Nn \l__hyp_dest_pdfview_tl {fit}
           }
      }
    ,pdfview .initial:n  = {xyz}
  }
\keys_define:nn { hyp / setup }
  {
   ,pdflang       .code:n =
          {
            \tl_if_empty:nF { #1 }
              {
                \pdfmanagement_add:nnx {Catalog} { Lang } { (#1) }
                \AddToDocumentProperties[document]{lang}{#1}
              }
          }
   }
\regex_new:N\l__hyp_optlang_regex
\regex_set:Nn\l__hyp_optlang_regex {\A\[([A-Za-z\-]+)\](.*)}
\cs_new_protected:Npn \__hyp_setup_info_key:nn #1 #2
  {
    \keys_define:nn { hyp / setup }
      {
        pdf#1  .code:n =
          {
            \tl_if_blank:nTF {##1}
              {
                \str_case:nnF { #1 }
                 {
                   {creator}
                   {
                     \msg_info:nnn { hyp }{ empty-info-value } { pdfcreator }
                     \pdfmanagement_add:nnx {Info}{Creator}{()}
                   }
                   {producer}
                   {
                     \msg_info:nnn { hyp }{ empty-info-value } { pdfproducer }
                     \pdfmanagement_add:nnx {Info}{Producer}{()}
                   }
                 }
                 {
                   \pdfmanagement_remove:nn {Info}{#2}
                 }
              }
              {
                \tl_set:Nx\l__hyp_tmpa_tl {\clist_item:nn{##1}{1}}
                \exp_args:NNV
                 \regex_extract_once:NnN \l__hyp_optlang_regex \l__hyp_tmpa_tl\l__hyp_tmpa_seq
                \seq_if_empty:NTF\l__hyp_tmpa_seq
                 {
                   \__hyp_text_pdfstring_info:nN {##1}\l__hyp_tmpa_str
                 }
                 {
                   \exp_args:Nx
                   \__hyp_text_pdfstring_info:nN {\seq_item:Nn \l__hyp_tmpa_seq{3}}\l__hyp_tmpa_str
                 }
                \str_if_eq:VnF\l__hyp_tmpa_str{<FEFF>}
                  {
                    \pdfmanagement_add:nnx {Info}{#2}{\l__hyp_tmpa_str}
                  }
              }
             \__hyp_store_metadata:nn {pdf#1}{##1}
          }
      }
    \keys_define:nn { hyp / info }
      {
        #2  .code:n =
          {
            \tl_if_blank:nTF {##1}
              {
                \pdfmanagement_remove:nn {Info}{#2}
              }
              {
                \__hyp_text_pdfstring_info:nN {##1}\l__hyp_tmpa_str
                \str_if_eq:VnF\l__hyp_tmpa_str{<FEFF>}
                  {
                    \pdfmanagement_add:nnx {Info}{#2}{\l__hyp_tmpa_str}
                  }
              }
            \exp_args:Nx \__hyp_store_metadata:nn {pdf\str_lowercase:n{#1}}{##1}
          }
        ,unknown .code:n =
         {
            \__hyp_text_pdfstring_info:nN {##1}\l__hyp_tmpa_str
            \str_if_eq:VnF\l__hyp_tmpa_str{<FEFF>}
              {
                \exp_args:Nno
                \pdfmanagement_add:nnx {Info}
                    { \l_keys_key_str } {\l__hyp_tmpa_str}
              }
         }
      }
  }
\__hyp_setup_info_key:nn {author}   {Author}
\__hyp_setup_info_key:nn {title}    {Title}
\__hyp_setup_info_key:nn {producer} {Producer}
\__hyp_setup_info_key:nn {creator}  {Creator}
\__hyp_setup_info_key:nn {subject}  {Subject}
\__hyp_setup_info_key:nn {keywords}  {Keywords}
\cs_new_protected:Npn \__hyp_setup_info_date_key:nn #1 #2
  {
    \keys_define:nn { hyp / setup }
      {
        pdf#1  .code:n =
          {
            \tl_if_blank:nTF {##1}
              {
                \pdfmanagement_remove:nn {Info}{#2}
              }
              {
                \pdfmanagement_add:nnx {Info}{#2}{(##1)}
              }
             \__hyp_store_metadata:nn {pdf#1}{##1}
             \AddToDocumentProperties[document]{#1}{#2}
          }
      }
    \keys_define:nn { hyp / info }
      {
        #2  .code:n =
          {
            \tl_if_blank:nTF {##1}
              {
                \pdfmanagement_remove:nn {Info}{#2}
              }
              {
                \pdfmanagement_add:nnx {Info}{#2}{(##1)}
              }
            \exp_args:Nx \__hyp_store_metadata:nn {pdf\str_lowercase:n{#1}}{##1}
          }
      }
  }

\__hyp_setup_info_date_key:nn {creationdate}  {CreationDate}
\__hyp_setup_info_date_key:nn {moddate}  {ModDate}
\keys_define:nn { hyp / setup }
      {
        pdfmetadate  .code:n = { \__hyp_store_metadata:nn {pdfmetadate}{#1} }
      }
\keys_define:nn { hyp / setup }
  {
    ,pdftrapped .code:n =
      {
        \exp_args:Nne
          \keys_set:nn { hyp / setup } { _pdftrapped = \str_uppercase:n { #1 } }
      }
    ,_pdftrapped  .choices:nn = {TRUE,FALSE,UNKNOWN}
       {
         \pdfmanagement_add:nnx {Info}{Trapped}
           {/
             \str_uppercase:f { \str_head:n { #1 } }
             \str_lowercase:f { \str_tail:n { #1 } }
           }
         \__hyp_store_metadata:nx {pdftrapped}
           {
             \str_uppercase:f { \str_head:n { #1 } }
             \str_lowercase:f { \str_tail:n { #1 } }
           }
       }
    ,_pdftrapped / unknown .code:n =
       {
         \msg_warning:nnxxx { hyp } { unknown-choice }
           { pdftrapped }
           { true~(case~insensitive), false~(case~insensitive), unknown~(case~insensitive) }
           { \exp_not:n {#1} }
       }
  }
\keys_define:nn { hyp / setup }
  {
    pdfinfo .code:n =
      {
        \keys_set:nn { hyp / info } { #1 }
      }
  }
\keys_set:nn { hyp / setup} {pdfcreator = LaTeX~with~hyperref}
\keys_set:nn { hyp / setup} {pdfauthor  = }
\keys_set:nn { hyp / setup} {pdftitle   = }
\keys_set:nn { hyp / setup} {pdfsubject  = }
\clist_map_inline:nn
  {
   ,pdfcopyright
   ,pdftype
   ,pdflicenseurl
   ,pdfauthortitle
   ,pdfcaptionwriter
   ,pdfmetalang
   ,pdfsource
   ,pdfdocumentid
   ,pdfinstanceid
   ,pdfversionid
   ,pdfrendition
   ,pdfpublication
   ,pdfpubtype
   ,pdfbytes
   ,pdfnumpages
   ,pdfissn
   ,pdfeissn
   ,pdfisbn
   ,pdfbookedition
   ,pdfpublisher
   ,pdfvolumenum
   ,pdfissuenum
   ,pdfpagerange
   ,pdfdoi
   ,pdfurl
   ,pdfidentifier
   ,pdfsubtitle
   ,pdfpubstatus
   ,pdfcontactaddress
   ,pdfcontactcity
   ,pdfcontactregion
   ,pdfcontactpostcode
   ,pdfcontactcountry
   ,pdfcontactphone
   ,pdfcontactemail
   ,pdfcontacturl
   ,pdfdate
  }
  {
    \keys_define:nn { hyp / setup }
      {
        #1 .code:n= { \__hyp_store_metadata:nn {#1}{##1}}
      }
  }

\keys_define:nn { hyp / setup }
  {
    pdfpageduration .code:n =
     {
        \tl_if_blank:nTF { #1 }
          {
            \pdfmanagement_remove:nn {Page}{Dur}
          }
          {
            \pdfmanagement_add:nnn {Page}{Dur}{#1}
          }
     }
  }
\keys_define:nn { hyp / setup }
  {
    pdfpagetransition .code:n =
     {
       \tl_if_blank:nTF {#1}
         {
           \pdfmanagement_remove:nn {Page}{Trans}
         }
         {
           \group_begin:
           \keys_set:nn { hyp / trans }{style=R,#1}
           \pdf_object_unnamed_write:nx { dict }
             {
               \pdfdict_use:n {l__hyp_page/Trans}
             }
           \pdfmanagement_add:nnx {Page}{Trans}{\pdf_object_ref_last:}
           \group_end:
         }
     }
  }
\keys_define:nn { hyp / trans }
  {
    ,style .choices:nn =
      {Split,Blinds,Box,Wipe,Dissolve,Glitter,R,Fly,Push,Cover,Uncover,Fade}
      { \pdfdict_put:nnn {l__hyp_page/Trans}{ S }{/#1} }
    ,style / unknown .code:n =
      {
        \msg_warning:nnxxx { hyp } { unknown-choice }
           { trans / style }
           { Split,Blinds,Box,Wipe,Dissolve,Glitter,R,Fly,Push,Cover,Uncover,Fade }
           { \exp_not:n {#1} }
      }
    ,duration .code:n  =
      {
        \pdfdict_put:nnn {l__hyp_page/Trans}{ D }{#1}
      }
    ,direction .choices:nn =
      {H,V}
      { \pdfdict_put:nnn {l__hyp_page/Trans}{ Dm }{/#1} }
    ,direction .choices:nn =
      {0,90,180,270,315}
      { \pdfdict_put:nnn {l__hyp_page/Trans}{ Di }{ #1 } }
    ,direction / None .code:n =
      { \pdfdict_put:nnn {l__hyp_page/Trans}{ Di }{ /None } }
    ,direction / unknown .code:n =
      {
        \msg_warning:nnxxx { hyp } { unknown-choice }
           { trans / direction }
           {
             H~(horizontal,~only~Split,~Blinds),
             V~(vertical,~only~Split,~Blinds),
             0~(left~to~right,~only~Wipe,~Glitter,~Fly,~Cover,~Uncover,~Push),
             90~(bottom~to~top,~only~Wipe),
             180~(right~to~left,~only~Wipe),
             270~(top~to~bottom,~only~Wipe,~Glitter,~Fly,~Cover,~Uncover,~Push),
             315~(top~left~to~bottom,~only~Glitter),
             None~(only~Fly)
           }
           { \exp_not:n {#1} }
      }
    ,motion .choices:nn =
     {I,O}
     { \pdfdict_put:nnn {l__hyp_page/Trans}{ M }{/#1} }
    ,motion / unknown .code:n =
      {
        \msg_warning:nnxxx { hyp } { unknown-choice }
           { trans / motion }
           { I~(inwards) , O~(outwards) }
           { \exp_not:n {#1} }
      }
     ,scale .code:n =
       { \pdfdict_put:nnn { l__hyp_page/Trans }{ SS }{ #1 } }
     ,opaque .choices:nn = {true,false}
       { \pdfdict_put:nnn { l__hyp_page/Trans }{ B } { #1} }
     ,opaque / unknown .code:n =
       {
          \msg_warning:nnxxx { hyp } { unknown-choice }
           { trans / B }
           { true~(opaque~back,~only~Fly), false~(opaque~back,~only~Fly) }
           { \exp_not:n {#1} }
       }
     % try to set unknown keys as style
     ,unknown .code:n =
       {
         % warning ...
         \exp_args:Nnx\keys_set:nn {hyp/trans}{ style=\l_keys_key_str }
       }
  }
\keys_set_known:nv{hyp/setup}{opt@hyperref.sty}
%% Form field code
\NewDocumentCommand \MakeFieldObject { m m }
  {
    \pdfxform_new:nnn { #2 }{} { #1 }
  }

\prop_new:N   \g__hyp_AcroForm_CoFields_prop
\prop_new:N   \g__hyp_AcroForm_Fields_prop

\let\HyField@afields\ltx@empty
\let\HyField@cofields\ltx@empty
%% UF test for old pdftex removed
\def\HyField@AfterAuxOpen{\Hy@AtBeginDocument}%

\def\HyField@AuxAddToFields#1
  {
    \prop_gput:Nnn \g__hyp_AcroForm_Fields_prop {#1}{F}
  }%

\def\HyField@AuxAddToCoFields #1 #2
  {
    \prop_gput:Nnn \g__hyp_AcroForm_CoFields_prop {a#1}{#2}
  }

\Hy@AtBeginDocument
  {
    \if@filesw
      \immediate\write\@mainaux{%
        \string\providecommand\string\HyField@AuxAddToFields[1]{}%
       }%
      \immediate\write\@mainaux{%
        \string\providecommand\string\HyField@AuxAddToCoFields[2]{}%
      }%
    \fi
    \let\HyField@AfterAuxOpen\@firstofone
  }%

\def\HyField@AddToFields
  {
    \exp_args:Nx\HyField__hypAddToFields
      {
        \pdfannot_box_ref_last:
      }
    \ifx\Fld@calculate@code\ltx@empty
    \else
      \begingroup
        \Hy@safe@activestrue
        \edef\Hy@temp{%
          \endgroup
          \if@filesw
            \write\@mainaux
             {
              \string\HyField@AuxAddToCoFields
               {
                \Fld@calculate@sortkey
               }
               {
                 \pdfannot_box_ref_last:
               }
            }
          \fi
        }%
      \Hy@temp
    \fi
  }%

\def\HyField__hypAddToFields#1{
  \HyField@AfterAuxOpen{%
    \if@filesw
      \write\@mainaux{%
        \string\HyField@AuxAddToFields{#1}%
        }%
      \fi
    }%
  }%

\ExplSyntaxOff
\ExplSyntaxOn

\def\@Form[#1]
  {
    \kvsetkeys{Form}{#1}
    \pdf@ifdraftmode{}
      {
        \Hy@FormObjects
        \prop_map_inline:Nn \g__hyp_AcroForm_Fields_prop
          {
            \pdfmanagement_add:nnx { Catalog / AcroForm } { Fields }{##1}
            %\pdfmanagement_show:n { Catalog / AcroForm }
          }
        \prop_if_empty:NF \g__hyp_AcroForm_CoFields_prop
          {
            \prop_map_inline:Nn \g__hyp_AcroForm_CoFields_prop
              {
                \seq_put_right:Nn \l__hyp_tmpa_seq {##1}
              }
            \seq_sort:Nn \l__hyp_tmpa_seq
              {
                \str_compare:nNnTF {##1} > {##2}
                  { \sort_return_swapped: }
                  { \sort_return_same: }
              }
            \seq_map_inline:Nn \l__hyp_tmpa_seq
             {
                \pdfmanagement_add:nnx { Catalog / AcroForm }
                  { CO }
                  {
                    \prop_item:Nn \g__hyp_AcroForm_CoFields_prop {##1}
                  }
             }
          }
       \pdfmanagement_add:nnx {Catalog / AcroForm/DR/Font }
         {ZaDb} {\pdf_object_ref:n {__hyp/Font/ZaDb} }
       \pdfmanagement_add:nnx {Catalog / AcroForm/DR/Font }
         {Helv} {\pdf_object_ref:n {__hyp/Font/Helv} }
       \pdfmanagement_add:nnx {Catalog /AcroForm}
         {DA}{(/Helv~10~Tf~0~g)}
       \pdfmeta_standard_verify:nTF {form_no_NeedAppearance}
         {
           \legacy_if:nT { HyField@NeedAppearances }
             {
               \pdfmanagement_add:nnn {Catalog / AcroForm }{NeedAppearances}{true}
             }
         }
         {
           \pdfmanagement_remove:nn {Catalog / AcroForm }{NeedAppearances}
         }
       }
  }
\ExplSyntaxOff
\let\@endForm\ltx@empty
\let\HyAnn@AbsPageLabel\ltx@empty
\let\Fld@pageobjref\ltx@empty

\ExplSyntaxOn
\newcount\HyAnn@Count
\HyAnn@Count=\ltx@zero
\def\HyAnn@AbsPageLabel
  {
    \global\advance\HyAnn@Count by\ltx@one
    %\zref@labelbyprops{HyAnn@\the\HyAnn@Count}{abspage}%
    %\zref@labelbylist {HyAnn@\the\HyAnn@Count} {l3pdf}
    %\zref@refused{HyAnn@\the\HyAnn@Count}%
    \__hyp_ref_label:en {HyAnn@\the\HyAnn@Count}{abspage}
    \__hyp_ref_check:en {HyAnn@\the\HyAnn@Count}{abspage}
  }%
\def\Fld@pageobjref
  {
    \__hyp_ref_if_exist:enT {HyAnn@\the\HyAnn@Count}{abspage}
      {
        /P~\pdf_pageobject_ref:n
          {
            \__hyp_ref_value:en{HyAnn@\the\HyAnn@Count}{abspage}
          }
      }
  }
\ExplSyntaxOff
\ExplSyntaxOn
%% check if the attr should be set through
%% hooks.
%% check if options are missing.
\def\@TextField[#1]#2{% parameters, label
  \def\Fld@name{#2}%
  \let\Fld@default\ltx@empty
  \let\Fld@value\@empty
  \def\Fld@width{\DefaultWidthofText}%
  \def\Fld@height{%
    \ifFld@multiline
      \DefaultHeightofTextMultiline
    \else
      \DefaultHeightofText
    \fi
  }%
  \begingroup
    \expandafter\HyField@SetKeys\expandafter{%
      \DefaultOptionsofText,#1%
    }%
    \PDFForm@Name
    \HyField@FlagsText
    \ifFld@hidden\def\Fld@width{1sp}\fi
    \ifx\Fld@value\@empty\def\Fld@value{\Fld@default}\fi
    \LayoutTextField{#2}{%
      \leavevmode
      \HyAnn@AbsPageLabel
      \Hy@escapeform\PDFForm@Text
      \pdfannot_box:nnnn
          {\Fld@width}
          {\Fld@height}
          {0pt} %is this correct?
          {\PDFForm@Text}
      \MakeTextField{\Fld@width}{\Fld@height}
      \HyField@AddToFields
    }%
  \endgroup
}
\providecommand\@curropt{}
\def\@ChoiceMenu[#1]#2#3{% parameters, label, choices
  \def\Fld@name{#2}
  \let\Fld@default\relax
  \let\Fld@value\relax
  \def\Fld@width{\DefaultWidthofChoiceMenu}
  \def\Fld@height{\DefaultHeightofChoiceMenu}
  \begingroup
    \Fld@menulength=0 %
    \@tempdima\z@
    \clist_map_variable:nNn { #3 } \@curropt
    %\@for\@curropt:=#3\do
      {%
        \expandafter\Fld@checkequals\@curropt==\\%
        \Hy@StepCount\Fld@menulength
        \settowidth{\@tempdimb}{\@currDisplay}%
        \ifdim\@tempdimb>\@tempdima\@tempdima\@tempdimb\fi
      }%
    \advance\@tempdima by~15\p@
    \begingroup
      \HyField@SetKeys{#1}
    \edef\x{\endgroup
      \noexpand\expandafter
      \noexpand\HyField@SetKeys
      \noexpand\expandafter{%
        \expandafter\noexpand\csname DefaultOptionsof%
          \ifFld@radio
            Radio%
          \else
            \ifFld@combo
              \ifFld@popdown
                PopdownBox%
              \else
                ComboBox%
              \fi
            \else
              ListBox%
            \fi
          \fi
        \endcsname
      }%
    }\x
    \HyField@SetKeys{#1}%
    \PDFForm@Name
    \ifFld@hidden\def\Fld@width{1sp}\fi
    \ifx\Fld@value\relax
      \let\Fld@value\Fld@default
    \fi
    \LayoutChoiceField{#2}{%
      \ifFld@radio
        \HyField@FlagsRadioButton
        \__hypRadio{#3}%
      \else
        \begingroup
          \HyField@FlagsChoice
          \ifdim\Fld@width<\@tempdima
            \ifdim\@tempdima<1cm\@tempdima1cm\fi
            \edef\Fld@width{\the\@tempdima}%
          \fi
          \ifFld@combo
          \else
            \@tempdima=\the\Fld@menulength\Fld@charsize
            \advance\@tempdima by~\Fld@borderwidth bp %
            \advance\@tempdima by~\Fld@borderwidth bp %
            \edef\Fld@height{\the\@tempdima}%
          \fi
          \__hypListbox{#3}%
        \endgroup
      \fi
    }%
  \endgroup
}

\def\__hypRadio#1{%
  \Fld@listcount=0~%
  %\show\Fld@default
  \EdefEscapeName\Fld@default{\Fld@default}%
  \clist_map_variable:nNn { #1 } \@curropt
  %\@for\@curropt:=#1\do
   {%
    \expandafter\Fld@checkequals\@curropt==\\%
    \EdefEscapeName\@currValue{\@currValue}%
    \Hy@StepCount\Fld@listcount
    \@currDisplay\space
    \leavevmode
    \HyAnn@AbsPageLabel
    \Hy@escapeform\PDFForm@Radio
    \pdfxform_if_exist:nF { __hyp_xform_Ding }
      {
        \pdfxform_new:nnn { __hyp_xform_Ding } {}
         {
           \group_begin:
           \fontfamily{pzd}
           \fontencoding{U}
           \fontseries{m}
           \fontshape{n}
           \selectfont
           \char123
           \group_end:
         }
      }
    \pdfannot_box:nnnx
      {\Fld@width}
      {\Fld@height}
      {0pt} %is this correct?
      {
        \PDFForm@Radio
        /AP
         <<
         /N
          <<
          /\@currValue\c_space_tl \pdfxform_ref:n {__hyp_xform_Ding}
          %/Off \c_space_tl \pdfxform_ref:n {__hyp_xform_DingOff} %hm
          >>
         >>
      }
      {\fbox{  \MakeRadioField{\Fld@width}{\Fld@height}} }
     \int_compare:nNnT { \Fld@listcount} = { 1 }
      { \HyField@AddToFields }
    \c_space_tl % deliberate space between radio buttons
                % to do: --> should be configurable
  }%
}

\newcount\Fld@listcount
\def\__hypListbox#1
 {
  \HyField@PDFChoices{#1}
  \mode_leave_vertical:
  \HyAnn@AbsPageLabel
  \Hy@escapeform\PDFForm@List
  \pdf_link_user:nnn
       {widget} %perhaps we need more types??
       {\PDFForm@List}
       {\MakeChoiceField{\Fld@width}{\Fld@height}}
  \HyField@AddToFields
 }

\def\@PushButton[#1]#2{% parameters, label
  \def\Fld@name{#2}%
  \group_begin:
    \exp_args:No\HyField@SetKeys
     {
      \DefaultOptionsofPushButton,#1
     }
    \PDFForm@Name
    \pdfmeta_standard_verify:nnTF {annot_action_A}{JavaScript}
      {
        \HyField@FlagsPushButton
        \legacy_if:nT {Fld@hidden}
          {
            \def\Fld@width{1sp}
          }
        \LayoutPushButtonField
          {
            \mode_leave_vertical:
            \HyAnn@AbsPageLabel
            \Hy@escapeform\PDFForm@Push
            \hbox_set:Nn \l_tmpa_box { \MakeButtonField {#2}}
            \pdfannot_box:nnnn
              {\box_wd:N\l_tmpa_box}
              {\box_ht:N\l_tmpa_box}
              {\box_dp:N\l_tmpa_box} %is this correct?
              {\PDFForm@Push}
             {\box_use:N\l_tmpa_box}
            \HyField@AddToFields
          }
      }
      {
        \msg_error:nn { hyp }{ pdfa-no-push-button }
        \LayoutPushButtonField
          {
            \mode_leave_vertical:
            \MakeButtonField{#2}
          }
      }
  \group_end:
}

\def\@Submit[#1]#2
 {
   \def\Fld@width {\DefaultWidthofSubmit}
   \def\Fld@height{\DefaultHeightofSubmit}
   \group_begin:
     \exp_args:No\HyField@SetKeys
       {
         \DefaultOptionsofSubmit,#1
       }
   \HyField@FlagsPushButton
   \HyField@FlagsSubmit
   \legacy_if:nT { Fld@hidden }
     {
       \def\Fld@width{1sp}
     }
    \mode_leave_vertical:
    \HyAnn@AbsPageLabel
    \Hy@escapeform\PDFForm@Submit
    \hbox_set:Nn \l_tmpa_box { \MakeButtonField {#2}}
    \pdfxform_if_exist:nF
     { __hyp_xform_Submit }
     {
       \pdfxform_new:nnn { __hyp_xform_Submit }{}
        {
          \fbox{\color_select:n{yellow}\textsf{Submit}}
        }
       \pdfxform_new:nnn { __hyp_xform_SubmitP }{}
        {
          \fbox{\color_select:n{yellow}\textsf{SubmitP}}
        }
     }
    \pdfannot_box:nnnn
      {\box_wd:N\l_tmpa_box}
      {\box_ht:N\l_tmpa_box}
      {\box_dp:N\l_tmpa_box} %is this correct?
      {
        \PDFForm@Submit
        /AP<<
          /N~\pdfxform_ref:n {__hyp_xform_Submit}~
          /D~\pdfxform_ref:n {__hyp_xform_SubmitP}
         >>
       }
      \HyField@AddToFields
      \box_use:N\l_tmpa_box

    \group_end:
 }

\def\@Reset[#1]#2
 {
   \def\Fld@width {\DefaultWidthofReset}
   \def\Fld@height{\DefaultHeightofReset}
   \group_begin:
     \exp_args:No\HyField@SetKeys
       {
         \DefaultOptionsofReset,#1
       }
     \mode_leave_vertical:
     \pdfmeta_standard_verify:nnTF {annot_action_A}{ResetForm}
       {
         \HyField@FlagsPushButton
         \legacy_if:nT { Fld@hidden }
           { \def\Fld@width{1sp} }
         \HyAnn@AbsPageLabel
         \Hy@escapeform\PDFForm@Reset
         \hbox_set:Nn \l_tmpa_box { \MakeButtonField {#2}}
         \pdfannot_box:nnnn
           {\box_wd:N\l_tmpa_box}
           {\box_ht:N\l_tmpa_box}
           {\box_dp:N\l_tmpa_box} %is this correct?
           { \PDFForm@Reset }
         \HyField@AddToFields
         \box_use:N \l_tmpa_box
       }
       {
         \msg_error:nn { hyp }{ pdfa-no-reset-button }
         \MakeButtonField{#2}
       }
    \group_end:
  }

\def\@CheckBox[#1]#2
  {% parameters, label
    \def\Fld@name{#2}
    \def\Fld@default{0}
    \group_begin:
      \def\Fld@width {\DefaultWidthofCheckBox}
      \def\Fld@height{\DefaultHeightofCheckBox}
      \exp_args:No\HyField@SetKeys
        {
          \DefaultOptionsofCheckBox,#1
        }
      \PDFForm@Name
      \HyField@FlagsCheckBox
      \legacy_if:nT { Fld@hidden }
        {
          \def\Fld@width{1sp}
        }
      \LayoutCheckField{#2}
        {
          \mode_leave_vertical:
          \HyAnn@AbsPageLabel
          \Hy@escapeform\PDFForm@Check
          \pdfxform_if_exist:nF { __hyp_xform_CheckMarkYes }
             {
               \pdfxform_new:nnn
                {__hyp_xform_CheckMarkYes}{}
                {
                  \group_begin:
                  \fontfamily{pzd}
                  \fontencoding{U}
                  \fontseries{m}
                  \fontshape{n}
                  \selectfont
                  \char51
                  \group_end:
                }
               \pdfxform_new:nnn
                {__hyp_xform_CheckMarkOff}{}
                {
                  \group_begin:
                  \fontfamily{pzd}
                  \fontencoding{U}
                  \fontseries{m}
                  \fontshape{n}
                  \selectfont
                  \phantom{\char51} %perhaps xetex needs some small glyph ..
                  \group_end:
                }
             }
          \pdfannot_box:nnnn
            {\Fld@width}
            {\Fld@height}
            {0pt} %is this correct?
            {\PDFForm@Check}
          \HyField@AddToFields %check if this works with xelatex ...
        }
    \group_end:
  }
\ExplSyntaxOff

\ExplSyntaxOn
\def\Hy@FormObjects
  {
    \pdf_object_new:n   {__hyp/Encoding/pdfdoc }
    \pdf_object_new:n   {__hyp/Font/ZaDb }
    \pdf_object_new:n   {__hyp/Font/Helv }
    \pdf_object_write:nnx {__hyp/Encoding/pdfdoc } { dict }
      {
        /Type/Encoding
        /Differences[
          24/breve/caron/circumflex/dotaccent/hungarumlaut/ogonek
          /ring/tilde
          \c_space_tl
          39/quotesingle
          \c_space_tl
          96/grave %
          \iow_newline:
          128/bullet/dagger/daggerdbl/ellipsis/emdash/endash/florin
          /fraction/guilsinglleft/guilsinglright/minus/perthousand
          /quotedblbase/quotedblleft/quotedblright/quoteleft
          /quoteright/quotesinglbase/trademark/fi/fl/Lslash/OE
          /Scaron/Ydieresis/Zcaron/dotlessi/lslash/oe/scaron/zcaron
          \iow_newline:
          164/currency
          \c_space_tl
          166/brokenbar
          \c_space_tl
          168/dieresis/copyright/ordfeminine
          \c_space_tl
          172/logicalnot/.notdef/registered/macron/degree/plusminus
          /twosuperior/threesuperior/acute/mu
          \c_space_tl
          183/periodcentered/cedilla/onesuperior/ordmasculine
          \c_space_tl
          188/onequarter/onehalf/threequarters
          \iow_newline:
          192/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE
          /Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave
          /Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute
          /Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave
          /Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls
          /agrave/aacute/acircumflex/atilde/adieresis/aring/ae
          /ccedilla/egrave/eacute/ecircumflex/edieresis/igrave
          /iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute
          /ocircumflex/otilde/odieresis/divide/oslash/ugrave
          /uacute/ucircumflex/udieresis/yacute/thorn/ydieresis
         ]
      }
    \pdf_object_write:nnn {__hyp/Font/ZaDb } { dict }
      {
        /Type/Font
        /Subtype/Type1
        /Name/ZaDb
        /BaseFont/ZapfDingbats
      }
    \pdf_object_write:nnx {__hyp/Font/Helv } { dict }
      {
        /Type/Font
        /Subtype/Type1
        /Name/Helv
        /BaseFont/Helvetica
        /Encoding~\pdf_object_ref:n { __hyp/Encoding/pdfdoc }
      }
  \global\let\Hy@FormObjects\relax
  }
\ExplSyntaxOff
\providecommand*{\Fld@pageobjref}{}
\ifcsname pdf@escapestring\endcsname
  \def\Hy@escapeform#1{%
    \ifHy@pdfescapeform
      \let\Hy@escapestring\pdfescapestring
    \else
      \let\Hy@escapestring\@firstofone
    \fi
  }%
  \Hy@escapeform{}%
\else
  \let\Hy@escapestring\@firstofone
  \def\Hy@escapeform#1{%
    \ifHy@pdfescapeform
      \def\Hy@escapestring##1{%
        \noexpand\Hy@escapestring{\noexpand##1}%
      }%
      \edef\Hy@temp{#1}%
      \expandafter\Hy__hypescapeform\Hy@temp\Hy@escapestring{}\@nil
      \def\Hy@escapestring##1{%
        \@ifundefined{Hy@esc@\string##1}{%
          ##1%
          \ThisShouldNotHappen
        }{%
          \csname Hy@esc@\string##1\endcsname
        }%
      }%
    \else
      \let\Hy@escapestring\@firstofone
    \fi
  }%
  \def\Hy__hypescapeform#1\Hy@escapestring#2#3\@nil{%
    \ifx\\#3\\%
    \else
      \expandafter
      \Hy@pstringdef\csname Hy@esc@\string#2\endcsname{#2}% probably string-hex
      \ltx@ReturnAfterFi{%
        \Hy__hypescapeform#3\@nil
      }%
    \fi
  }%
\fi
\def\PDFForm@Name{%
  \PDFForm__hypName\Fld@name
  \ifx\Fld@altname\relax
  \else
    \PDFForm__hypName\Fld@altname
  \fi
  \ifx\Fld@mappingname\relax
  \else
    \PDFForm__hypName\Fld@mappingname
  \fi
}
\def\PDFForm__hypName#1{%
  \begingroup
    \ifnum\Hy@pdfversion<5 % implementation note 117, PDF spec 1.7
      \ifHy@unicode
        \Hy@unicodefalse
      \fi
    \fi
    \pdfstringdef\Hy@gtemp#1%
  \endgroup
  \let#1\Hy@gtemp
}
\def\Fld@X@additionalactions{%
  \ifx\Fld@keystroke@code\@empty
  \else
    /K<</S/JavaScript/JS(\Hy@escapestring{\Fld@keystroke@code})>>%
  \fi
  \ifx\Fld@format@code\@empty
  \else
    /F<</S/JavaScript/JS(\Hy@escapestring{\Fld@format@code})>>%
  \fi
  \ifx\Fld@validate@code\@empty
  \else
    /V<</S/JavaScript/JS(\Hy@escapestring{\Fld@validate@code})>>%
  \fi
  \ifx\Fld@calculate@code\@empty
  \else
    /C<</S/JavaScript/JS(\Hy@escapestring{\Fld@calculate@code})>>%
  \fi
  \ifx\Fld@onfocus@code\@empty
  \else
    /Fo<</S/JavaScript/JS(\Hy@escapestring{\Fld@onfocus@code})>>%
  \fi
  \ifx\Fld@onblur@code\@empty
  \else
    /Bl<</S/JavaScript/JS(\Hy@escapestring{\Fld@onblur@code})>>%
  \fi
  \ifx\Fld@onmousedown@code\@empty
  \else
    /D<</S/JavaScript/JS(\Hy@escapestring{\Fld@onmousedown@code})>>%
  \fi
  \ifx\Fld@onmouseup@code\@empty
  \else
    /U<</S/JavaScript/JS(\Hy@escapestring{\Fld@onmouseup@code})>>%
  \fi
  \ifx\Fld@onenter@code\@empty
  \else
    /E<</S/JavaScript/JS(\Hy@escapestring{\Fld@onenter@code})>>%
  \fi
  \ifx\Fld@onexit@code\@empty
  \else
    /X<</S/JavaScript/JS(\Hy@escapestring{\Fld@onexit@code})>>%
  \fi
}
\ExplSyntaxOn
\def\Fld@additionalactions
 {%
  \exp_args:Ne\str_if_eq:nnF {\Fld@X@additionalactions}{}
    {
      \pdfmeta_standard_verify:nT {annot_widget_no_AA}
        {/AA<<\Fld@X@additionalactions>>}
    }
 }
\ExplSyntaxOff
\def\Fld@annotnames{%
  /T(\Fld@name)%
  \ifx\Fld@altname\relax
  \else
    /TU(\Fld@altname)%
  \fi
  \ifx\Fld@mappingname\relax
  \else
    /TM(\Fld@mappingname)%
  \fi
}
\ExplSyntaxOn
\def\PDFForm@Check
  {
    /Subtype/Widget
    ~\Fld@annotflags
    ~\Fld@pageobjref
    ~\Fld@annotnames
    /FT/Btn
   \Fld@flags
   /Q~\Fld@align
   /BS<</W~\Fld@borderwidth /S/\Fld@borderstyle>>
   /AP
     <<
      /N
        <<
          /Yes~\pdfxform_ref:n{__hyp_xform_CheckMarkYes}
          /Off~\pdfxform_ref:n{__hyp_xform_CheckMarkOff}
        >>
    >>
  /MK<<
    \int_compare:nNnF {\Fld@rotation}={0}
      {
        /R~\Fld@rotation
      }
    \tl_if_empty:NF\Fld@bordercolor
      {
        /BC[\Fld@bordercolor]
      }
    \tl_if_empty:NF\Fld@bcolor
      {
        /BG[\Fld@bcolor]
      }
    /CA(\Hy@escapestring{\Fld@cbsymbol})%
  >>
  /DA
    (
      /ZaDb~\strip@pt\Fld@charsize\c_space_tl Tf
      \tl_if_empty:NF \Fld@color
        {
          \c_space_tl \Fld@color
        }
    )
  /H/P
  \legacy_if:nTF {Fld@checked}
    {
      /V/Yes /AS/Yes
    }
    {
      /V/Off /AS/Off
    }
  \Fld@additionalactions
}
\ExplSyntaxOff
\ExplSyntaxOn
   \def\PDFForm@Push
     {
       /Subtype/Widget
       ~\Fld@annotflags
       ~\Fld@pageobjref
       ~\Fld@annotnames
       /FT/Btn
       ~\Fld@flags
       /H/P
       /BS<</W~\Fld@borderwidth/S/\Fld@borderstyle>>
       \bool_if:nT
         {
           !\int_compare_p:nNn {\Fld@rotation} = {0}
          ||
           \tl_if_exist_p:N \Fld@bordercolor
         }
         {
           /MK
             <<
               \int_compare:nNnF {\Fld@rotation} = {0}
                 {
                   /R~\Fld@rotation
                 }
               \tl_if_exist:NT \Fld@bordercolor
                 {
                   /BC[\Fld@bordercolor]
                 }
             >>
          }
       /A<</S/JavaScript/JS(\Hy@escapestring{\Fld@onclick@code})>>
       \Fld@additionalactions
     }

\ExplSyntaxOff
\def\PDFForm@List{%
  /Subtype/Widget%
  \Fld@annotflags
  \Fld@pageobjref
  \Fld@annotnames
  /FT/Ch%
  \Fld@flags
  /Q \Fld@align
  /BS<</W \Fld@borderwidth/S/\Fld@borderstyle>>%
  \ifcase0\ifnum\Fld@rotation=\z@   \else 1\fi
          \ifx\Fld@bordercolor\relax\else 1\fi
          \ifx\fld@bcolor\relax     \else 1\fi
          \space
  \else
    /MK<<%
      \ifnum\Fld@rotation=\z@
      \else
        /R \Fld@rotation
      \fi
      \ifx\Fld@bordercolor\relax
      \else
        /BC[\Fld@bordercolor]%
      \fi
      \ifx\Fld@bcolor\relax
      \else
        /BG[\Fld@bcolor]%
      \fi
    >>%
  \fi
  /DA(/Helv \strip@pt\Fld@charsize\space Tf%
      \ifx\Fld@color\@empty\else\space\Fld@color\fi)%
  \Fld@choices
  \Fld@additionalactions
}
\ExplSyntaxOn
\def\PDFForm@Radio
  {
    /Subtype/Widget
    ~\Fld@annotflags
    ~\Fld@pageobjref
    ~\Fld@annotnames
    /FT/Btn
   \Fld@flags
   /H/P
   /BS<</W~\Fld@borderwidth/S/\Fld@borderstyle>>
   /MK<<
    \ifnum\Fld@rotation=\z@
    \else
      /R~\Fld@rotation
    \fi
    \ifx\Fld@bordercolor\relax
    \else
      /BC[\Fld@bordercolor]%
    \fi
    \ifx\Fld@bcolor\relax
    \else
      /BG[\Fld@bcolor]%
    \fi
     /CA(\Hy@escapestring{\Fld@radiosymbol})%
    >>
    /DA(/ZaDb~\strip@pt\Fld@charsize\space Tf%
      \ifx\Fld@color\@empty\else\space\Fld@color\fi)%
   \ifx\Fld@default\@empty
    /V/Off%
    /DV/Off%
   \else
    /V/\Fld@default
    /DV/\Fld@default
   \fi
   \Fld@additionalactions
 }
\ExplSyntaxOff
\ExplSyntaxOn
\def\PDFForm@Text
  {
    /Subtype/Widget
    ~\Fld@annotflags
    ~\Fld@pageobjref
    ~\Fld@annotnames
    /FT/Tx
    ~\Fld@flags
    /Q~\Fld@align
    /BS<</W~\Fld@borderwidth\c_space_tl /S /\Fld@borderstyle>>
   \bool_if:nT
     {
        !\int_compare_p:nNn {\Fld@rotation} = {0}
       ||
        \tl_if_exist_p:N \Fld@bordercolor
       ||
        \tl_if_exist_p:N \Fld@bcolor
     }
     {
       /MK
         <<
           \int_compare:nNnF {\Fld@rotation} = {0}
             {
               /R~\Fld@rotation
             }
           \tl_if_exist:NT \Fld@bordercolor
             {
               /BC[\Fld@bordercolor]
             }
           \tl_if_exist:NT \Fld@bcolor
             {
               /BG[\Fld@bcolor]
             }
        >>
     }
   /DA
     (
       /Helv~\strip@pt\Fld@charsize\c_space_tl Tf
       \tl_if_empty:NF {\c_space_tl\Fld@color}
     )
   /DV(\Hy@escapestring{\Fld@default})
   /V(\Hy@escapestring{\Fld@value})
   ~\Fld@additionalactions
   \int_compare:nNnT { \Fld@maxlen}>{0}
     {
       /MaxLen~\Fld@maxlen
     }
  }
\ExplSyntaxOff

\def\PDFForm@Submit{%
  /Subtype/Widget%
  \Fld@annotflags
  \Fld@pageobjref
  \Fld@annotnames
  /FT/Btn%
  \Fld@flags
  /H/P%
  /BS<</W \Fld@borderwidth/S/\Fld@borderstyle>>%
  \ifcase0\ifnum\Fld@rotation=\z@   \else 1\fi
          \ifx\Fld@bordercolor\relax\else 1\fi
          \space
  \else
    /MK<<%
      \ifnum\Fld@rotation=\z@
      \else
        /R \Fld@rotation
      \fi
      \ifx\Fld@bordercolor\relax
      \else
        /BC[\Fld@bordercolor]%
      \fi
    >>%
  \fi
  /A<<%
    /S/SubmitForm%
    /F<<%
      /FS/URL%
      /F(\Hy@escapestring{\Form@action})%
    >>%
    \Fld@submitflags
  >>%
  \Fld@additionalactions
}
\ExplSyntaxOn
       \def\PDFForm@Reset{%
         /Subtype/Widget%
         \Fld@annotflags
         \Fld@pageobjref
         \Fld@annotnames
         /FT/Btn%
         \Fld@flags
         /H/P%
         /DA(/Helv~\strip@pt\Fld@charsize\space Tf~0~0~1~rg)%
         \ifcase0\ifnum\Fld@rotation=\z@   \else 1\fi
                 \ifx\Fld@bordercolor\relax\else 1\fi
                 \space
         \else
           /MK<<%
             \ifnum\Fld@rotation=\z@
             \else
               /R~\Fld@rotation
             \fi
             \ifx\Fld@bordercolor\relax
             \else
               /BC[\Fld@bordercolor]%
             \fi
           >>%
         \fi
         /BS<</W \Fld@borderwidth/S/\Fld@borderstyle>>%
         /A<</S/ResetForm>>%
         \Fld@additionalactions
       }%

 %these patterns are used in hyperref checks.
\str_case:VnF \c_sys_backend_str
 {
   { pdfmode }
   {
     \def\HyPat@ObjRef
      {
       [0-9]*[1-9][0-9]*~0~R
      }
   }
   { dvipdfmx }
   {
     \def\HyPat@ObjRef
      {
        @[^~]+
      }
   }
   { xdvipdfmx }
   {
     \def\HyPat@ObjRef
      {
        @[^~]+
      }
   }
 }
 { %also set in hyperref sty, so probably not needed.
   \def\HyPat@ObjRef/{.+}
 }

\ExplSyntaxOff
%% \RequirePackage{rerunfilecheck}[2009/12/10]
%% removed \Hy@OutlineRerunCheck, unneeded with bookmark
%% removed \ReadBookmarks / unneeded with bookmark.
%% removed \Hy@OutlineName
%% removed \check@bm@number
%% removed \calc@bm@number

\ifHy@implicit
\else
  \expandafter\endinput
\fi
\newlength\Hy@SectionHShift
\def\Hy@SectionAnchorHref#1{%
  \ifx\protect\@typeset@protect
    \Hy__hypSectionAnchor{#1}%
  \fi
}
\DeclareRobustCommand*{\Hy__hypSectionAnchor}[1]{%
  \leavevmode
  \hbox to 0pt{%
    \kern-\Hy@SectionHShift
    \Hy@raisedlink{%
      \hyper@anchorstart{#1}\hyper@anchorend
    }%
    \hss
  }%
}
\@ifundefined{hyper@nopatch@sectioning}
{
\let\H@old@ssect\@ssect
\def\@ssect#1#2#3#4#5{%
  \Hy@MakeCurrentHrefAuto{section*}%
  \setlength{\Hy@SectionHShift}{#1}%
  \begingroup
    \toks@{\H@old@ssect{#1}{#2}{#3}{#4}}%
    \toks\tw@\expandafter{%
      \expandafter\Hy@SectionAnchorHref\expandafter{\@currentHref}%
      #5%
    }%
  \edef\x{\endgroup
    \the\toks@{\the\toks\tw@}%
  }\x
}
\let\H@old@schapter\@schapter
\def\@schapter#1{%
  \begingroup
    \let\@mkboth\@gobbletwo
    \Hy@MakeCurrentHrefAuto{\Hy@chapapp*}%
    \Hy@raisedlink{%
      \hyper@anchorstart{\@currentHref}\hyper@anchorend
    }%
  \endgroup
  \H@old@schapter{#1}%
}
\ltx@IfUndefined{@chapter}{}{%
  \let\Hy@org@chapter\@chapter
  \def\@chapter{%
    \def\Hy@next{%
      \Hy@MakeCurrentHrefAuto{\Hy@chapapp*}%
      \Hy@raisedlink{%
        \hyper@anchorstart{\@currentHref}\hyper@anchorend
      }%
    }%
    \ifnum\c@secnumdepth>\m@ne
      \ltx@IfUndefined{if@mainmatter}%
      \iftrue{\csname if@mainmatter\endcsname}%
        \let\Hy@next\relax
      \fi
    \fi
    \Hy@next
    \Hy@org@chapter
  }%
}
\let\H@old@part\@part
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname chapter\endcsname\relax
  \let\Hy@secnum@part\z@
\else
  \let\Hy@secnum@part\m@ne
\fi
\def\@part{%
  \ifnum\Hy@secnum@part>\c@secnumdepth
    \phantomsection
  \fi
  \H@old@part
}
\let\H@old@spart\@spart
\def\@spart#1{%
  \Hy@MakeCurrentHrefAuto{part*}%
  \Hy@raisedlink{%
    \hyper@anchorstart{\@currentHref}\hyper@anchorend
  }%
  \H@old@spart{#1}%
}
\let\H@old@sect\@sect
\def\@sect#1#2#3#4#5#6[#7]#8{%
  \ifnum #2>\c@secnumdepth
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
  {%
    \Hy@MakeCurrentHrefAuto{section*}%
    \setlength{\Hy@SectionHShift}{#3}%
    \begingroup
      \toks@{\H@old@sect{#1}{#2}{#3}{#4}{#5}{#6}[{#7}]}%
      \toks\tw@\expandafter{%
        \expandafter\Hy@SectionAnchorHref\expandafter{\@currentHref}%
        #8%
      }%
    \edef\x{\endgroup
      \the\toks@{\the\toks\tw@}%
    }\x
  }{%
    \H@old@sect{#1}{#2}{#3}{#4}{#5}{#6}[{#7}]{#8}%
  }%
}
}{}
\expandafter\def\csname Parent-4\endcsname{}
\expandafter\def\csname Parent-3\endcsname{}
\expandafter\def\csname Parent-2\endcsname{}
\expandafter\def\csname Parent-1\endcsname{}
\expandafter\def\csname Parent0\endcsname{}
\expandafter\def\csname Parent1\endcsname{}
\expandafter\def\csname Parent2\endcsname{}
\expandafter\def\csname Parent3\endcsname{}
\expandafter\def\csname Parent4\endcsname{}
%%
%% End of file 'hgeneric-testphase.def'.
%% 
%%
%% End of file `hgeneric-testphase.def'.
