(command.CommandList
  children: [
    (C {(set)} {(-o)} {(pipefail)})
    (C {(shopt)} {(-s)} {(extglob)})
    (command.FuncDef
      name: main
      body: 
        (command.BraceGroup
          children: [
            (C {(Lit_Other ':')} 
              {
                (DQ 
                  (word_part.BracedVarSub
                    token: <VSub_Name WEBDRIVER_URL>
                    suffix_op: 
                      (suffix_op.StringUnary
                        op_id: VTest_ColonEquals
                        arg_word: 
                          {('http:') (Lit_Slash /) (Lit_Slash /) ('127.0.0.1:4444') (Lit_Slash /) (wd) 
                            (Lit_Slash /) (hub)
                          }
                      )
                    spids: [103 114]
                  )
                )
              }
            )
            (command.Sentence
              child: 
                (command.Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:cmd spids:[119])
                      op: Equal
                      rhs: {($ VSub_Number '$1')}
                      spids: [119]
                    )
                  ]
                  spids: [119]
                )
              terminator: <Op_Semi ';'>
            )
            (C {(shift)})
            (command.Case
              to_match: {($ VSub_DollarName '$cmd')}
              arms: [
                (case_arm
                  pat_list: [{(new-session)}]
                  action: [(C {(wd-new-session)})]
                  spids: [133 134 139 16777215]
                )
                (case_arm
                  pat_list: [{(delete-session)}]
                  action: [(C {(wd-delete-session)})]
                  spids: [142 143 148 16777215]
                )
                (case_arm
                  pat_list: [{(go)}]
                  action: [(C {(wd-go)} {(DQ ($ VSub_At '$@'))})]
                  spids: [152 153 162 16777215]
                )
                (case_arm
                  pat_list: [{(back)}]
                  action: [(C {(wd-post-session)} {(/back)})]
                  spids: [165 166 173 16777215]
                )
                (case_arm
                  pat_list: [{(forward)}]
                  action: [(C {(wd-post-session)} {(/forward)})]
                  spids: [176 177 184 16777215]
                )
                (case_arm
                  pat_list: [{(refresh)}]
                  action: [(C {(wd-post-session)} {(/refresh)})]
                  spids: [187 188 195 16777215]
                )
                (case_arm
                  pat_list: [{(get-current-url)}]
                  action: [(C {(wd-get-current-url)})]
                  spids: [199 200 205 16777215]
                )
                (case_arm
                  pat_list: [{(get-title)}]
                  action: [(C {(wd-get-title)})]
                  spids: [208 209 214 16777215]
                )
                (case_arm
                  pat_list: [{(get-page-source)} {(page-source)}]
                  action: [(C {(wd-get-page-source)} {(DQ ($ VSub_At '$@'))})]
                  spids: [217 222 231 16777215]
                )
                (case_arm
                  pat_list: [{(get-window-handle)}]
                  action: [(C {(wd-get-window-handle)})]
                  spids: [235 236 241 16777215]
                )
                (case_arm
                  pat_list: [{(get-window-handles)}]
                  action: [(C {(wd-get-window-handles)})]
                  spids: [244 245 250 16777215]
                )
                (case_arm
                  pat_list: [{(switch-to-window)}]
                  action: [(C {(wd-switch-to-window)} {(DQ ($ VSub_At '$@'))})]
                  spids: [254 255 264 16777215]
                )
                (case_arm
                  pat_list: [{(switch-to-frame)}]
                  action: [(C {(wd-switch-to-frame)} {(DQ ($ VSub_At '$@'))})]
                  spids: [267 268 277 16777215]
                )
                (case_arm
                  pat_list: [{(switch-to-parent-frame)}]
                  action: [(C {(wd-post-session)} {(/frame/parent)})]
                  spids: [280 281 288 16777215]
                )
                (case_arm
                  pat_list: [{(get-window-size)}]
                  action: [(C {(wd-get-window-size)})]
                  spids: [292 293 298 16777215]
                )
                (case_arm
                  pat_list: [{(set-window-size)}]
                  action: [(C {(wd-set-window-size)} {(DQ ($ VSub_At '$@'))})]
                  spids: [301 302 311 16777215]
                )
                (case_arm
                  pat_list: [{(maximize)}]
                  action: [(C {(wd-maximize)})]
                  spids: [314 315 320 16777215]
                )
                (case_arm
                  pat_list: [{(find-element)} {(find)}]
                  action: [(C {(wd-find-element)} {(DQ ($ VSub_At '$@'))})]
                  spids: [324 329 338 16777215]
                )
                (case_arm
                  pat_list: [{(find-elements)} {(find-all)}]
                  action: [(C {(wd-find-elements)} {(DQ ($ VSub_At '$@'))})]
                  spids: [341 346 355 16777215]
                )
                (case_arm
                  pat_list: [{(find-element-in)} {(find-in)} {(find-element-from-element)}]
                  action: [(C {(wd-find-element-from-element)} {(DQ ($ VSub_At '$@'))})]
                  spids: [358 367 376 16777215]
                )
                (case_arm
                  pat_list: [{(find-elements-in)} {(find-all-in)} {(find-elements-from-element)}]
                  action: [(C {(wd-find-elements-from-element)} {(DQ ($ VSub_At '$@'))})]
                  spids: [379 388 397 16777215]
                )
                (case_arm
                  pat_list: [{(get-element-attribute)} {(attr)} {(attribute)}]
                  action: [(C {(wd-get-element-attribute)} {(DQ ($ VSub_At '$@'))})]
                  spids: [401 410 419 16777215]
                )
                (case_arm
                  pat_list: [{(get-element-css-value)} {(css-value)}]
                  action: [(C {(wd-get-element-css-value)} {(DQ ($ VSub_At '$@'))})]
                  spids: [422 427 436 16777215]
                )
                (case_arm
                  pat_list: [{(get-element-text)} {(text)}]
                  action: [(C {(wd-get-element-text)} {(DQ ($ VSub_At '$@'))})]
                  spids: [439 444 453 16777215]
                )
                (case_arm
                  pat_list: [{(get-element-tag-name)} {(tag-name)}]
                  action: [(C {(wd-get-element-tag-name)} {(DQ ($ VSub_At '$@'))})]
                  spids: [456 461 470 16777215]
                )
                (case_arm
                  pat_list: [{(is-element-selected)} {(is-selected)}]
                  action: [(C {(wd-is-element-selected)} {(DQ ($ VSub_At '$@'))})]
                  spids: [474 479 488 16777215]
                )
                (case_arm
                  pat_list: [{(is-element-enabled)} {(is-enabled)}]
                  action: [(C {(wd-is-element-enabled)} {(DQ ($ VSub_At '$@'))})]
                  spids: [491 496 505 16777215]
                )
                (case_arm
                  pat_list: [{(element-click)} {(click)}]
                  action: [(C {(wd-element-click)} {(DQ ($ VSub_At '$@'))})]
                  spids: [509 514 523 16777215]
                )
                (case_arm
                  pat_list: [{(element-clear)} {(clear)}]
                  action: [(C {(wd-element-clear)} {(DQ ($ VSub_At '$@'))})]
                  spids: [526 531 540 16777215]
                )
                (case_arm
                  pat_list: [{(element-send-keys)} {(send-keys)}]
                  action: [(C {(wd-element-send-keys)} {(DQ ($ VSub_At '$@'))})]
                  spids: [543 548 557 16777215]
                )
                (case_arm
                  pat_list: [{(execute-script)} {(execute)} {(exec)}]
                  action: [(C {(wd-execute-script-sync)} {(DQ ($ VSub_At '$@'))})]
                  spids: [561 570 579 16777215]
                )
                (case_arm
                  pat_list: [{(execute-script-async)} {(execute-async)} {(exec-async)}]
                  action: [(C {(wd-execute-script-async)} {(DQ ($ VSub_At '$@'))})]
                  spids: [582 591 600 16777215]
                )
                (case_arm
                  pat_list: [{(get-all-cookies)} {(cookies)}]
                  action: [(C {(wd-get-all-cookies)})]
                  spids: [604 609 614 16777215]
                )
                (case_arm
                  pat_list: [{(get-named-cookie)} {(cookie)}]
                  action: [(C {(wd-get-named-cookie)} {(DQ ($ VSub_At '$@'))})]
                  spids: [617 622 631 16777215]
                )
                (case_arm
                  pat_list: [{(add-cookie)}]
                  action: [(C {(wd-add-cookie)} {(DQ ($ VSub_At '$@'))})]
                  spids: [634 635 644 16777215]
                )
                (case_arm
                  pat_list: [{(delete-cookie)}]
                  action: [(C {(wd-delete-cookie)} {(DQ ($ VSub_At '$@'))})]
                  spids: [647 648 657 16777215]
                )
                (case_arm
                  pat_list: [{(delete-cookies)}]
                  action: [(C {(wd-delete-cookies)})]
                  spids: [660 661 666 16777215]
                )
                (case_arm
                  pat_list: [{(take-screenshot)} {(screenshot)}]
                  action: [(C {(wd-take-screenshot)})]
                  spids: [670 675 680 16777215]
                )
                (case_arm
                  pat_list: [{(take-element-screenshot)} {(element-screenshot)}]
                  action: [(C {(wd-take-element-screenshot)} {(DQ ($ VSub_At '$@'))})]
                  spids: [683 688 697 16777215]
                )
                (case_arm
                  pat_list: [{(help)}]
                  action: [(C {(print-help)})]
                  spids: [701 702 707 16777215]
                )
                (case_arm
                  pat_list: [{(Lit_Other '*')}]
                  action: [
                    (command.SimpleCommand
                      words: [{(cat)}]
                      redirects: [
                        (redir.Redir
                          op: <Redir_GreatAnd '>&'>
                          fd: 16777215
                          arg_word: {(2)}
                        )
                        (redir.HereDoc
                          op: <Redir_DLess '<<'>
                          fd: 16777215
                          here_begin: {(.)}
                          here_end_span_id: 726
                          stdin_parts: [('Usage: wd <command> [arguments]\n') ('Help:  wd help\n')]
                        )
                      ]
                    )
                    (command.ControlFlow
                      token: <ControlFlow_Exit exit>
                      arg_word: {(1)}
                    )
                  ]
                  spids: [711 712 733 16777215]
                )
              ]
              spids: [126 130 736]
            )
          ]
          spids: [97]
        )
      spids: [93 96]
    )
    (command.FuncDef
      name: die
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:rc spids:[748])
                      op: Equal
                      rhs: {($ VSub_Number '$1')}
                      spids: [748]
                    )
                  ]
                  spids: [748]
                )
              terminator: <Op_Semi ';'>
            )
            (command.Sentence child:(C {(shift)}) terminator:<Op_Semi ';'>)
            (command.Sentence
              child: 
                (command.SimpleCommand
                  words: [{(echo)} {(DQ ($ VSub_Number '$0') (':'))} {(DQ ($ VSub_At '$@'))}]
                  redirects: [(redir.Redir op:<Redir_GreatAnd '>&'> fd:16777215 arg_word:{(2)})]
                )
              terminator: <Op_Semi ';'>
            )
            (command.ControlFlow
              token: <ControlFlow_Exit exit>
              arg_word: {(DQ ($ VSub_DollarName '$rc'))}
            )
          ]
          spids: [745]
        )
      spids: [741 744]
    )
    (command.FuncDef
      name: json-obj
      body: 
        (command.BraceGroup
          children: [
            (C {(perl)} {(-mJSON) (Lit_Other ':') (Lit_Other ':') (PP)} {(-e)} 
              {
                (SQ <'\n'> <'    use List::Util qw(pairmap);\n'> 
                  <'    $j = JSON::PP->new->allow_nonref;\n'> <'    print "{", join(",", pairmap { $j->encode($a) .":". $b } @ARGV), "}"\n'> <'  '>
                )
              } {(DQ ($ VSub_At '$@'))}
            )
          ]
          spids: [783]
        )
      spids: [779 782]
    )
    (command.FuncDef
      name: json-arr
      body: 
        (command.BraceGroup
          children: [
            (C {(perl)} {(-e)} {(SQ <'\n'> <'    print "[", join(",", @ARGV), "]"\n'> <'  '>)} 
              {(DQ ($ VSub_At '$@'))}
            )
          ]
          spids: [814]
        )
      spids: [810 813]
    )
    (command.FuncDef
      name: json-str
      body: 
        (command.BraceGroup
          children: [
            (C {(perl)} {(-mJSON) (Lit_Other ':') (Lit_Other ':') (PP)} {(-e)} 
              {(SQ <'print JSON::PP->new->allow_nonref->encode($ARGV[0])'>)} {(DQ ($ VSub_Number '$1'))}
            )
          ]
          spids: [838]
        )
      spids: [834 837]
    )
    (command.FuncDef
      name: json-get
      body: 
        (command.BraceGroup
          children: [
            (C {(perl)} {(-mJSON) (Lit_Other ':') (Lit_Other ':') (PP)} {(-e)} 
              {
                (SQ <'\n'> <'    local $/; my $s = <STDIN> || exit 1;\n'> 
                  <'    my $j = JSON::PP->new->allow_nonref;\n'> <'    my $data = $j->decode($s);\n'> <'    my $x = $data;\n'> <'    foreach (@ARGV) {\n'> 
                  <'      if (ref($x) eq "ARRAY") {\n'> <'        # convert array to k=>v hash\n'> <'        my %h = map { $_ => $x->[$_] } 0..$#$x;\n'> 
                  <'        $x = \\%h;\n'> <'      }\n'> <'      exists $x->{$_} or die "invalid JSON index";\n'> <'      $x = $x->{$_};\n'> 
                  <'    }\n'> <'    print $j->encode($x), "\\n";\n'> <'  '>
                )
              } {(DQ ($ VSub_At '$@'))}
            )
          ]
          spids: [865]
        )
      spids: [861 864]
    )
    (command.FuncDef
      name: json-raw
      body: 
        (command.BraceGroup
          children: [
            (C {(perl)} {(-mJSON) (Lit_Other ':') (Lit_Other ':') (PP)} {(-e)} 
              {
                (SQ <'\n'> <'    local $/; my $s = <STDIN> || exit 1;\n'> 
                  <'    my $j = JSON::PP->new->allow_nonref;\n'> <'    sub flat {\n'> <'      my $x = shift;\n'> <'      if (ref($x) eq "ARRAY") {\n'> 
                  <'        flat($_) foreach @$x;\n'> <'      } elsif (ref($x) eq "HASH") {\n'> <'        flat($_) foreach values %$x;\n'> 
                  <'      } else {\n'> <'        print $x, "\\n";\n'> <'      }\n'> <'    }\n'> <'    flat $j->decode($s);\n'> <'  '>
                )
              }
            )
          ]
          spids: [907]
        )
      spids: [903 906]
    )
    (command.FuncDef
      name: json-raw-nonnull
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_Local
              pairs: [(assign_pair lhs:(lhs_expr.LhsName name:x spids:[949]) op:Equal spids:[949])]
              spids: [947]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:x spids:[952])
                  op: Equal
                  rhs: 
                    {
                      (word_part.CommandSubPart
                        command_list: (command.CommandList children:[(C {(cat)})])
                        left_token: <Left_CommandSub '$('>
                        spids: [953 955]
                      )
                    }
                  spids: [952]
                )
              ]
              spids: [952]
            )
            (command.Case
              to_match: {($ VSub_DollarName '$x')}
              arms: [
                (case_arm
                  pat_list: [{(null)}]
                  action: [(C {(false)})]
                  spids: [965 966 970 16777215]
                )
                (case_arm
                  pat_list: [{(Lit_Other '*')}]
                  action: [
                    (command.SimpleCommand
                      words: [{(json-raw)}]
                      redirects: [
                        (redir.Redir
                          op: <Redir_TLess '<<<'>
                          fd: 16777215
                          arg_word: {(DQ ($ VSub_DollarName '$x'))}
                        )
                      ]
                    )
                  ]
                  spids: [973 974 983 16777215]
                )
              ]
              spids: [958 962 986]
            )
          ]
          spids: [944]
        )
      spids: [940 943]
    )
    (command.FuncDef
      name: json-get-raw
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Pipeline
                  children: [(C {(json-get)} {(DQ ($ VSub_At '$@'))}) (C {(json-raw)})]
                  negated: F
                )
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [995]
        )
      spids: [991 994]
    )
    (command.FuncDef
      name: json-get-raw-nonnull
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Pipeline
                  children: [(C {(json-get)} {(DQ ($ VSub_At '$@'))}) (C {(json-raw-nonnull)})]
                  negated: F
                )
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [1014]
        )
      spids: [1010 1013]
    )
    (command.FuncDef
      name: decode-base64
      body: 
        (command.BraceGroup
          children: [
            (C {(perl)} {(-MMIME) (Lit_Other ':') (Lit_Other ':') (Base64)} {(-e)} 
              {(SQ <'print decode_base64(<STDIN>)'>)}
            )
          ]
          spids: [1034]
        )
      spids: [1030 1033]
    )
    (command.FuncDef
      name: hush
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.SimpleCommand
                  words: [{(DQ ($ VSub_At '$@'))}]
                  redirects: [(redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(/dev/null)})]
                )
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [1057]
        )
      spids: [1053 1056]
    )
    (command.FuncDef
      name: wd-post
      body: 
        (command.BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DBracket
                          expr: 
                            (bool_expr.BoolBinary
                              op_id: BoolBinary_eq
                              left: {($ VSub_Pound '$#')}
                              right: {(2)}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(curl)} {(-sSL)} {(-H)} {(DQ ('Content-Type: application/json'))} {(--data-raw)} 
                      {(DQ ($ VSub_Number '$2'))} {(DQ ($ VSub_DollarName '$WEBDRIVER_URL')) (DQ ($ VSub_Number '$1'))}
                    )
                  ]
                  spids: [16777215 1090]
                )
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DBracket
                          expr: 
                            (bool_expr.BoolBinary
                              op_id: BoolBinary_eq
                              left: {($ VSub_Pound '$#')}
                              right: {(1)}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(curl)} {(-sSL)} {(-XPOST)} 
                      {(DQ ($ VSub_DollarName '$WEBDRIVER_URL')) (DQ ($ VSub_Number '$1'))}
                    )
                  ]
                  spids: [1119 1132]
                )
              ]
              else_action: [(C {(die)} {(127)} {(internal)} {(error)})]
              spids: [1149 1161]
            )
          ]
          spids: [1074]
        )
      spids: [1070 1073]
    )
    (command.FuncDef
      name: wd-new-session
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:capabilities spids:[1175])
                  op: Equal
                  spids: [1175]
                )
              ]
              spids: [1173]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DBracket
                          expr: 
                            (bool_expr.BoolUnary
                              op_id: BoolUnary_n
                              child: {(DQ ($ VSub_DollarName '$WEBDRIVER_CAPABILITIES'))}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:capabilities spids:[1194])
                          op: Equal
                          rhs: {(DQ ($ VSub_DollarName '$WEBDRIVER_CAPABILITIES'))}
                          spids: [1194]
                        )
                      ]
                      spids: [1194]
                    )
                  ]
                  spids: [16777215 1191]
                )
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DBracket
                          expr: 
                            (bool_expr.BoolUnary
                              op_id: BoolUnary_n
                              child: {(DQ ($ VSub_DollarName '$WEBDRIVER_BROWSER'))}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:capabilities spids:[1216])
                          op: Equal
                          rhs: 
                            {
                              (DQ 
                                (word_part.CommandSubPart
                                  command_list: 
                                    (command.CommandList
                                      children: [
                                        (C {(json-obj)} {(browserName)} 
                                          {
                                            (DQ 
                                              (word_part.CommandSubPart
                                                command_list: 
                                                  (command.CommandList
                                                    children: [
                                                      (C {(json-str)} 
                                                        {
                                                          (DQ 
                                                            ($ VSub_DollarName '$WEBDRIVER_BROWSER')
                                                          )
                                                        }
                                                      )
                                                    ]
                                                  )
                                                left_token: <Left_CommandSub '$('>
                                                spids: [1224 1230]
                                              )
                                            )
                                          }
                                        )
                                      ]
                                    )
                                  left_token: <Left_CommandSub '$('>
                                  spids: [1218 1232]
                                )
                              )
                            }
                          spids: [1216]
                        )
                      ]
                      spids: [1216]
                    )
                  ]
                  spids: [1200 1213]
                )
              ]
              else_action: [
                (C {(die)} {(1)} {(DQ ('neither WEBDRIVER_CAPABILITIES nor WEBDRIVER_BROWSER set'))})
              ]
              spids: [1236 1248]
            )
            (command.Pipeline
              children: [
                (C {(wd-post)} {(/session)} 
                  {
                    (DQ 
                      (word_part.CommandSubPart
                        command_list: 
                          (command.CommandList
                            children: [
                              (C {(json-obj)} {(desiredCapabilities)} 
                                {(DQ ($ VSub_DollarName '$capabilities'))}
                              )
                            ]
                          )
                        left_token: <Left_CommandSub '$('>
                        spids: [1256 1264]
                      )
                    )
                  }
                )
                (C {(json-get-raw-nonnull)} {(sessionId)})
              ]
              negated: F
            )
          ]
          spids: [1170]
        )
      spids: [1166 1169]
    )
    (command.FuncDef
      name: wd-assert-session
      body: 
        (command.BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DBracket
                          expr: 
                            (bool_expr.BoolUnary
                              op_id: BoolUnary_z
                              child: {(DQ ($ VSub_DollarName '$WEBDRIVER_SESSION'))}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [(C {(die)} {(1)} {(WEBDRIVER_SESSION)} {(not)} {(defined)})]
                  spids: [16777215 1297]
                )
              ]
              spids: [16777215 1311]
            )
          ]
          spids: [1281]
        )
      spids: [1277 1280]
    )
    (command.FuncDef
      name: wd-get-session
      body: 
        (command.BraceGroup
          children: [
            (C {(wd-assert-session)})
            (C {(curl)} {(-sSL)} 
              {(DQ ($ VSub_DollarName '$WEBDRIVER_URL')) (/session/) 
                (DQ ($ VSub_DollarName '$WEBDRIVER_SESSION')) (DQ ($ VSub_Number '$1'))
              }
            )
          ]
          spids: [1320]
        )
      spids: [1316 1319]
    )
    (command.FuncDef
      name: wd-checked-result
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:result spids:[1353])
                  op: Equal
                  spids: [1353]
                )
              ]
              spids: [1351]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:result spids:[1356])
                  op: Equal
                  rhs: 
                    {
                      (word_part.CommandSubPart
                        command_list: (command.CommandList children:[(C {(cat)})])
                        left_token: <Left_CommandSub '$('>
                        spids: [1357 1359]
                      )
                    }
                  spids: [1356]
                )
              ]
              spids: [1356]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:status spids:[1362])
                  op: Equal
                  rhs: 
                    {
                      (DQ 
                        (word_part.CommandSubPart
                          command_list: 
                            (command.CommandList
                              children: [
                                (command.SimpleCommand
                                  words: [{(json-get)} {(status)}]
                                  redirects: [
                                    (redir.Redir
                                      op: <Redir_TLess '<<<'>
                                      fd: 16777215
                                      arg_word: {(DQ ($ VSub_DollarName '$result'))}
                                    )
                                  ]
                                )
                              ]
                            )
                          left_token: <Left_CommandSub '$('>
                          spids: [1364 1373]
                        )
                      )
                    }
                  spids: [1362]
                )
              ]
              spids: [1362]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DBracket
                          expr: 
                            (bool_expr.BoolBinary
                              op_id: BoolBinary_ne
                              left: {($ VSub_DollarName '$status')}
                              right: {(0)}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(die)} {(1)} 
                      {
                        (DQ 
                          (word_part.CommandSubPart
                            command_list: 
                              (command.CommandList
                                children: [
                                  (command.SimpleCommand
                                    words: [{(json-get-raw)} {(value)} {(message)}]
                                    redirects: [
                                      (redir.Redir
                                        op: <Redir_TLess '<<<'>
                                        fd: 16777215
                                        arg_word: {(DQ ($ VSub_DollarName '$result'))}
                                      )
                                    ]
                                  )
                                ]
                              )
                            left_token: <Left_CommandSub '$('>
                            spids: [1398 1409]
                          )
                        )
                      }
                    )
                  ]
                  spids: [16777215 1390]
                )
              ]
              else_action: [
                (command.SimpleCommand
                  words: [{(json-get)} {(value)}]
                  redirects: [
                    (redir.Redir
                      op: <Redir_TLess '<<<'>
                      fd: 16777215
                      arg_word: {(DQ ($ VSub_DollarName '$result'))}
                    )
                  ]
                )
              ]
              spids: [1413 1426]
            )
          ]
          spids: [1348]
        )
      spids: [1344 1347]
    )
    (command.FuncDef
      name: wd-post-session-value
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Pipeline
                  children: [(C {(wd-post-session)} {(DQ ($ VSub_At '$@'))}) (C {(wd-checked-result)})]
                  negated: F
                )
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [1435]
        )
      spids: [1431 1434]
    )
    (command.FuncDef
      name: wd-get-session-simple
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Pipeline
                  children: [
                    (C {(wd-get-session)} {(DQ ($ VSub_At '$@'))})
                    (C {(json-get-raw-nonnull)} {(value)})
                  ]
                  negated: F
                )
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [1454]
        )
      spids: [1450 1453]
    )
    (command.FuncDef
      name: wd-get-session-value
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Pipeline
                  children: [(C {(wd-get-session)} {(DQ ($ VSub_At '$@'))}) (C {(wd-checked-result)})]
                  negated: F
                )
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [1475]
        )
      spids: [1471 1474]
    )
    (command.FuncDef
      name: wd-get-session-value-raw
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Pipeline
                  children: [
                    (C {(wd-get-session-value)} {(DQ ($ VSub_At '$@'))})
                    (C {(json-raw-nonnull)})
                  ]
                  negated: F
                )
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [1494]
        )
      spids: [1490 1493]
    )
    (command.FuncDef
      name: wd-get-element-value
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (C {(wd-get-session-value-raw)} 
                  {(/element/) (DQ ($ VSub_Number '$1')) (/) (DQ ($ VSub_Number '$2'))}
                )
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [1513]
        )
      spids: [1509 1512]
    )
    (command.FuncDef
      name: wd-get-current-url
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-get-session-simple)} {(/url)})
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [1534]
        )
      spids: [1530 1533]
    )
    (command.FuncDef
      name: wd-get-title
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-get-session-simple)} {(/title)})
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [1547]
        )
      spids: [1543 1546]
    )
    (command.FuncDef
      name: wd-get-window-handle
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-get-session-simple)} {(/window)})
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [1560]
        )
      spids: [1556 1559]
    )
    (command.FuncDef
      name: wd-get-page-source
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Pipeline
                  children: [(C {(wd-get-session-value)} {(/source)}) (C {(json-raw)})]
                  negated: F
                )
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [1573]
        )
      spids: [1569 1572]
    )
    (command.FuncDef
      name: wd-delete-session
      body: 
        (command.BraceGroup
          children: [
            (C {(wd-assert-session)})
            (C {(curl)} {(-sSL)} {(-XDELETE)} 
              {(DQ ($ VSub_DollarName '$WEBDRIVER_URL')) (/session/) 
                (DQ ($ VSub_DollarName '$WEBDRIVER_SESSION')) (DQ ($ VSub_Number '$1'))
              }
            )
          ]
          spids: [1591]
        )
      spids: [1587 1590]
    )
    (command.FuncDef
      name: wd-post-session
      body: 
        (command.BraceGroup
          children: [
            (C {(wd-assert-session)})
            (command.Sentence
              child: 
                (command.Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:url spids:[1627])
                      op: Equal
                      rhs: {($ VSub_Number '$1')}
                      spids: [1627]
                    )
                  ]
                  spids: [1627]
                )
              terminator: <Op_Semi ';'>
            )
            (C {(shift)})
            (command.Pipeline
              children: [
                (C {(wd-post)} 
                  {(/session/) (DQ ($ VSub_DollarName '$WEBDRIVER_SESSION')) 
                    (DQ ($ VSub_DollarName '$url'))
                  } {(DQ ($ VSub_At '$@'))}
                )
                (C {(wd-checked-result)})
              ]
              negated: F
            )
          ]
          spids: [1621]
        )
      spids: [1617 1620]
    )
    (command.FuncDef
      name: wd-go
      body: 
        (command.BraceGroup
          children: [
            (C {(hush)} {(wd-post-session)} {(/url)} 
              {
                (DQ 
                  (word_part.CommandSubPart
                    command_list: 
                      (command.CommandList
                        children: [
                          (C {(json-obj)} {(url)} 
                            {
                              (DQ 
                                (word_part.CommandSubPart
                                  command_list: 
                                    (command.CommandList
                                      children: [(C {(json-str)} {(DQ ($ VSub_Number '$1'))})]
                                    )
                                  left_token: <Left_CommandSub '$('>
                                  spids: [1675 1681]
                                )
                              )
                            }
                          )
                        ]
                      )
                    left_token: <Left_CommandSub '$('>
                    spids: [1669 1683]
                  )
                )
              }
            )
          ]
          spids: [1659]
        )
      spids: [1655 1658]
    )
    (command.FuncDef
      name: wd-close-window
      body: 
        (command.BraceGroup
          children: [(C {(hush)} {(wd-delete-session)} {(/window)})]
          spids: [1693]
        )
      spids: [1689 1692]
    )
    (command.FuncDef
      name: wd-switch-to-window
      body: 
        (command.BraceGroup
          children: [
            (C {(hush)} {(wd-post-session)} {(/window)} 
              {
                (DQ 
                  (word_part.CommandSubPart
                    command_list: 
                      (command.CommandList
                        children: [
                          (C {(json-obj)} {(handle)} 
                            {
                              (DQ 
                                (word_part.CommandSubPart
                                  command_list: 
                                    (command.CommandList
                                      children: [(C {(json-str)} {(DQ ($ VSub_Number '$1'))})]
                                    )
                                  left_token: <Left_CommandSub '$('>
                                  spids: [1725 1731]
                                )
                              )
                            }
                          )
                        ]
                      )
                    left_token: <Left_CommandSub '$('>
                    spids: [1719 1733]
                  )
                )
              }
            )
          ]
          spids: [1709]
        )
      spids: [1705 1708]
    )
    (command.FuncDef
      name: wd-get-window-handles
      body: 
        (command.BraceGroup
          children: [
            (command.Pipeline
              children: [(C {(wd-get-session)} {(/window/handles)}) (C {(json-get-raw)} {(value)})]
              negated: F
            )
          ]
          spids: [1743]
        )
      spids: [1739 1742]
    )
    (command.FuncDef
      name: wd-switch-to-frame
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_Local
              pairs: [(assign_pair lhs:(lhs_expr.LhsName name:id spids:[1768]) op:Equal spids:[1768])]
              spids: [1766]
            )
            (command.Case
              to_match: {($ VSub_Number '$1')}
              arms: [
                (case_arm
                  pat_list: [{(Lit_Other '[') (0-9) (Lit_Other ']')}]
                  action: [
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:id spids:[1784])
                          op: Equal
                          rhs: {($ VSub_Number '$1')}
                          spids: [1784]
                        )
                      ]
                      spids: [1784]
                    )
                  ]
                  spids: [1778 1782 1787 16777215]
                )
                (case_arm
                  pat_list: [{(Lit_Other '*')}]
                  action: [
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:id spids:[1794])
                          op: Equal
                          rhs: 
                            {
                              (DQ 
                                (word_part.CommandSubPart
                                  command_list: 
                                    (command.CommandList
                                      children: [(C {(json-str)} {(DQ ($ VSub_Number '$1'))})]
                                    )
                                  left_token: <Left_CommandSub '$('>
                                  spids: [1796 1802]
                                )
                              )
                            }
                          spids: [1794]
                        )
                      ]
                      spids: [1794]
                    )
                  ]
                  spids: [1790 1792 1805 16777215]
                )
              ]
              spids: [1771 1775 1808]
            )
            (C {(hush)} {(wd-post-session)} {(/frame)} 
              {
                (DQ 
                  (word_part.CommandSubPart
                    command_list: 
                      (command.CommandList
                        children: [(C {(json-obj)} {(id)} {(DQ ($ VSub_DollarName '$id'))})]
                      )
                    left_token: <Left_CommandSub '$('>
                    spids: [1818 1826]
                  )
                )
              }
            )
          ]
          spids: [1763]
        )
      spids: [1759 1762]
    )
    (command.FuncDef
      name: wd-switch-to-top-level-frame
      body: 
        (command.BraceGroup
          children: [
            (C {(hush)} {(wd-post-session)} {(frame)} 
              {
                (DQ 
                  (word_part.CommandSubPart
                    command_list: (command.CommandList children:[(C {(json-obj)} {(id)} {(null)})])
                    left_token: <Left_CommandSub '$('>
                    spids: [1846 1852]
                  )
                )
              }
            )
          ]
          spids: [1836]
        )
      spids: [1832 1835]
    )
    (command.FuncDef
      name: wd-get-window-size
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:result spids:[1867])
                  op: Equal
                  spids: [1867]
                )
              ]
              spids: [1865]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:result spids:[1870])
                  op: Equal
                  rhs: 
                    {
                      (word_part.CommandSubPart
                        command_list: 
                          (command.CommandList
                            children: [(C {(wd-get-session)} {(/window/size)})]
                          )
                        left_token: <Left_CommandSub '$('>
                        spids: [1871 1875]
                      )
                    }
                  spids: [1870]
                )
              ]
              spids: [1870]
            )
            (command.Pipeline
              children: [
                (C {(echo)} {(DQ ($ VSub_DollarName '$result'))})
                (C {(json-get-raw)} {(value)} {(width)})
              ]
              negated: F
            )
            (command.Pipeline
              children: [
                (C {(echo)} {(DQ ($ VSub_DollarName '$result'))})
                (C {(json-get-raw)} {(value)} {(height)})
              ]
              negated: F
            )
          ]
          spids: [1862]
        )
      spids: [1858 1861]
    )
    (command.FuncDef
      name: wd-set-window-size
      body: 
        (command.BraceGroup
          children: [
            (C {(hush)} {(wd-post-session)} {(/window/size)} 
              {
                (DQ 
                  (word_part.CommandSubPart
                    command_list: 
                      (command.CommandList
                        children: [
                          (C {(json-obj)} {(width)} {(DQ ($ VSub_Number '$1'))} {(height)} 
                            {(DQ ($ VSub_Number '$2'))}
                          )
                        ]
                      )
                    left_token: <Left_CommandSub '$('>
                    spids: [1924 1938]
                  )
                )
              }
            )
          ]
          spids: [1914]
        )
      spids: [1910 1913]
    )
    (command.FuncDef
      name: wd-maximize
      body: 
        (command.BraceGroup
          children: [(C {(hush)} {(wd-post-session)} {(/window/maximize)})]
          spids: [1948]
        )
      spids: [1944 1947]
    )
    (command.FuncDef
      name: wd-parse-strategy
      body: 
        (command.BraceGroup
          children: [
            (command.Case
              to_match: {($ VSub_Number '$1')}
              arms: [
                (case_arm
                  pat_list: [{(id)}]
                  action: [(C {(json-str)} {(DQ (id))})]
                  spids: [1974 1975 1983 16777215]
                )
                (case_arm
                  pat_list: [{(name)}]
                  action: [(C {(json-str)} {(DQ (name))})]
                  spids: [1986 1987 1995 16777215]
                )
                (case_arm
                  pat_list: [{(class) (Lit_Other '*')}]
                  action: [(C {(json-str)} {(DQ ('class name'))})]
                  spids: [1998 2000 2008 16777215]
                )
                (case_arm
                  pat_list: [{(tag) (Lit_Other '*')}]
                  action: [(C {(json-str)} {(DQ ('tag name'))})]
                  spids: [2011 2013 2021 16777215]
                )
                (case_arm
                  pat_list: [{(css) (Lit_Other '*')}]
                  action: [(C {(json-str)} {(DQ ('css selector'))})]
                  spids: [2024 2026 2034 16777215]
                )
                (case_arm
                  pat_list: [{(link) (Lit_Other '*')}]
                  action: [(C {(json-str)} {(DQ ('link text'))})]
                  spids: [2037 2039 2047 16777215]
                )
                (case_arm
                  pat_list: [{(partial) (Lit_Other '*')}]
                  action: [(C {(json-str)} {(DQ ('partial link text'))})]
                  spids: [2050 2052 2060 16777215]
                )
                (case_arm
                  pat_list: [{(xpath) (Lit_Other '*')}]
                  action: [(C {(json-str)} {(xpath)})]
                  spids: [2063 2065 2071 16777215]
                )
                (case_arm
                  pat_list: [{(Lit_Other '*')}]
                  action: [
                    (C {(die)} {(1)} {(unknown)} {(element)} {(location)} {(strategy) (Lit_Other ':')} 
                      {(DQ ($ VSub_Number '$1'))}
                    )
                  ]
                  spids: [2074 2075 16777215 2095]
                )
              ]
              spids: [1967 1971 2095]
            )
          ]
          spids: [1964]
        )
      spids: [1960 1963]
    )
    (command.FuncDef
      name: wd-general-element-find
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Assignment
                  keyword: Assign_Local
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:path spids:[2109])
                      op: Equal
                      rhs: {(DQ ($ VSub_Number '$1'))}
                      spids: [2109]
                    )
                  ]
                  spids: [2107]
                )
              terminator: <Op_Semi ';'>
            )
            (C {(shift)})
            (command.Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:strategy spids:[2120])
                  op: Equal
                  spids: [2120]
                )
              ]
              spids: [2118]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:strategy spids:[2123])
                  op: Equal
                  rhs: 
                    {
                      (DQ 
                        (word_part.CommandSubPart
                          command_list: 
                            (command.CommandList
                              children: [(C {(wd-parse-strategy)} {(DQ ($ VSub_Number '$1'))})]
                            )
                          left_token: <Left_CommandSub '$('>
                          spids: [2125 2131]
                        )
                      )
                    }
                  spids: [2123]
                )
              ]
              spids: [2123]
            )
            (command.AndOr
              ops: [Op_DPipe]
              children: [
                (command.DBracket
                  expr: 
                    (bool_expr.BoolBinary
                      op_id: BoolBinary_eq
                      left: {($ VSub_QMark '$?')}
                      right: {(0)}
                    )
                )
                (command.ControlFlow
                  token: <ControlFlow_Exit exit>
                  arg_word: {($ VSub_QMark '$?')}
                )
              ]
            )
            (C {(shift)})
            (command.Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:value spids:[2157])
                  op: Equal
                  spids: [2157]
                )
              ]
              spids: [2155]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:value spids:[2160])
                  op: Equal
                  rhs: 
                    {
                      (word_part.CommandSubPart
                        command_list: 
                          (command.CommandList
                            children: [(C {(json-str)} {(DQ ($ VSub_Star '$*'))})]
                          )
                        left_token: <Left_CommandSub '$('>
                        spids: [2161 2167]
                      )
                    }
                  spids: [2160]
                )
              ]
              spids: [2160]
            )
            (command.Pipeline
              children: [
                (C {(wd-post-session)} {(DQ ($ VSub_DollarName '$path'))} 
                  {
                    (DQ 
                      (word_part.CommandSubPart
                        command_list: 
                          (command.CommandList
                            children: [
                              (C {(json-obj)} {(using)} {(DQ ($ VSub_DollarName '$strategy'))} {(value)} 
                                {(DQ ($ VSub_DollarName '$value'))}
                              )
                            ]
                          )
                        left_token: <Left_CommandSub '$('>
                        spids: [2177 2191]
                      )
                    )
                  }
                )
                (C {(json-raw)})
              ]
              negated: F
            )
          ]
          spids: [2104]
        )
      spids: [2100 2103]
    )
    (command.FuncDef
      name: wd-find-element
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-general-element-find)} {(/element)} {(DQ ($ VSub_At '$@'))})
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [2206]
        )
      spids: [2202 2205]
    )
    (command.FuncDef
      name: wd-find-elements
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-general-element-find)} {(/elements)} {(DQ ($ VSub_At '$@'))})
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [2223]
        )
      spids: [2219 2222]
    )
    (command.FuncDef
      name: wd-find-element-from-element
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Assignment
                  keyword: Assign_Local
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:element spids:[2246])
                      op: Equal
                      rhs: {($ VSub_Number '$1')}
                      spids: [2246]
                    )
                  ]
                  spids: [2244]
                )
              terminator: <Op_Semi ';'>
            )
            (C {(shift)})
            (C {(wd-general-element-find)} {(/element/) (DQ ($ VSub_DollarName '$element')) (/element)} 
              {(DQ ($ VSub_At '$@'))}
            )
          ]
          spids: [2241]
        )
      spids: [2237 2240]
    )
    (command.FuncDef
      name: wd-find-elements-from-element
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Assignment
                  keyword: Assign_Local
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:element spids:[2277])
                      op: Equal
                      rhs: {($ VSub_Number '$1')}
                      spids: [2277]
                    )
                  ]
                  spids: [2275]
                )
              terminator: <Op_Semi ';'>
            )
            (C {(shift)})
            (C {(wd-general-element-find)} 
              {(/element/) (DQ ($ VSub_DollarName '$element')) (/elements)} {(DQ ($ VSub_At '$@'))}
            )
          ]
          spids: [2272]
        )
      spids: [2268 2271]
    )
    (command.FuncDef
      name: wd-get-element-attribute
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_Local
              pairs: [(assign_pair lhs:(lhs_expr.LhsName name:x spids:[2308]) op:Equal spids:[2308])]
              spids: [2306]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:x spids:[2311])
                  op: Equal
                  rhs: 
                    {
                      (word_part.CommandSubPart
                        command_list: 
                          (command.CommandList
                            children: [
                              (C {(wd-get-session-value-raw)} 
                                {(/element/) (DQ ($ VSub_Number '$1')) (/attribute/) 
                                  (DQ ($ VSub_Number '$2'))
                                }
                              )
                            ]
                          )
                        left_token: <Left_CommandSub '$('>
                        spids: [2312 2323]
                      )
                    }
                  spids: [2311]
                )
              ]
              spids: [2311]
            )
            (command.AndOr
              ops: [Op_DPipe]
              children: [
                (command.DBracket
                  expr: 
                    (bool_expr.BoolBinary
                      op_id: BoolBinary_eq
                      left: {($ VSub_QMark '$?')}
                      right: {(0)}
                    )
                )
                (C {(die)} {(1)} {(DQ ('attribute not found'))})
              ]
            )
            (C {(echo)} {(DQ ($ VSub_DollarName '$x'))})
          ]
          spids: [2303]
        )
      spids: [2299 2302]
    )
    (command.FuncDef
      name: wd-get-element-css-value
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_Local
              pairs: [(assign_pair lhs:(lhs_expr.LhsName name:x spids:[2365]) op:Equal spids:[2365])]
              spids: [2363]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:x spids:[2368])
                  op: Equal
                  rhs: 
                    {
                      (word_part.CommandSubPart
                        command_list: 
                          (command.CommandList
                            children: [
                              (C {(wd-get-session-value-raw)} 
                                {(/element/) (DQ ($ VSub_Number '$1')) (/css/) 
                                  (DQ ($ VSub_Number '$2'))
                                }
                              )
                            ]
                          )
                        left_token: <Left_CommandSub '$('>
                        spids: [2369 2380]
                      )
                    }
                  spids: [2368]
                )
              ]
              spids: [2368]
            )
            (command.AndOr
              ops: [Op_DPipe]
              children: [
                (command.DBracket
                  expr: 
                    (bool_expr.BoolBinary
                      op_id: BoolBinary_eq
                      left: {($ VSub_QMark '$?')}
                      right: {(0)}
                    )
                )
                (C {(die)} {(1)} {(DQ ('CSS property not found'))})
              ]
            )
            (C {(echo)} {(DQ ($ VSub_DollarName '$x'))})
          ]
          spids: [2360]
        )
      spids: [2356 2359]
    )
    (command.FuncDef
      name: wd-get-element-text
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-get-element-value)} {(DQ ($ VSub_Number '$1'))} {(text)})
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [2417]
        )
      spids: [2413 2416]
    )
    (command.FuncDef
      name: wd-get-element-tag-name
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-get-element-value)} {(DQ ($ VSub_Number '$1'))} {(name)})
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [2434]
        )
      spids: [2430 2433]
    )
    (command.FuncDef
      name: wd-is-element-enabled
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.DBracket
                  expr: 
                    (bool_expr.BoolBinary
                      op_id: BoolBinary_eq
                      left: {(1)}
                      right: 
                        {
                          (word_part.CommandSubPart
                            command_list: 
                              (command.CommandList
                                children: [
                                  (C {(wd-get-element-value)} {(DQ ($ VSub_Number '$1'))} {(enabled)})
                                ]
                              )
                            left_token: <Left_CommandSub '$('>
                            spids: [2460 2468]
                          )
                        }
                    )
                )
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [2452]
        )
      spids: [2448 2451]
    )
    (command.FuncDef
      name: wd-is-element-selected
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.DBracket
                  expr: 
                    (bool_expr.BoolBinary
                      op_id: BoolBinary_eq
                      left: {(1)}
                      right: 
                        {
                          (word_part.CommandSubPart
                            command_list: 
                              (command.CommandList
                                children: [
                                  (C {(wd-get-element-value)} {(DQ ($ VSub_Number '$1'))} {(selected)})
                                ]
                              )
                            left_token: <Left_CommandSub '$('>
                            spids: [2487 2495]
                          )
                        }
                    )
                )
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [2479]
        )
      spids: [2475 2478]
    )
    (command.FuncDef
      name: wd-element-simple-action
      body: 
        (command.BraceGroup
          children: [
            (C {(hush)} {(wd-post-session)} 
              {(/element/) (DQ ($ VSub_Number '$1')) (/) (DQ ($ VSub_Number '$2'))}
            )
          ]
          spids: [2507]
        )
      spids: [2503 2506]
    )
    (command.FuncDef
      name: wd-element-click
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-element-simple-action)} {(DQ ($ VSub_Number '$1'))} {(click)})
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [2530]
        )
      spids: [2526 2529]
    )
    (command.FuncDef
      name: wd-element-clear
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-element-simple-action)} {(DQ ($ VSub_Number '$1'))} {(clear)})
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [2547]
        )
      spids: [2543 2546]
    )
    (command.FuncDef
      name: wd-element-send-keys
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:element spids:[2570])
                  op: Equal
                  spids: [2570]
                )
              ]
              spids: [2568]
            )
            (command.Sentence
              child: 
                (command.Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:element spids:[2573])
                      op: Equal
                      rhs: {($ VSub_Number '$1')}
                      spids: [2573]
                    )
                  ]
                  spids: [2573]
                )
              terminator: <Op_Semi ';'>
            )
            (C {(shift)})
            (C {(wd-element-simple-action)} {(DQ ($ VSub_DollarName '$element'))} {(value)} 
              {
                (DQ 
                  (word_part.CommandSubPart
                    command_list: 
                      (command.CommandList
                        children: [
                          (C {(json-obj)} {(value)} 
                            {
                              (DQ 
                                (word_part.CommandSubPart
                                  command_list: 
                                    (command.CommandList
                                      children: [(C {(json-str)} {(DQ ($ VSub_Star '$*'))})]
                                    )
                                  left_token: <Left_CommandSub '$('>
                                  spids: [2595 2601]
                                )
                              )
                            }
                          )
                        ]
                      )
                    left_token: <Left_CommandSub '$('>
                    spids: [2589 2603]
                  )
                )
              }
            )
          ]
          spids: [2565]
        )
      spids: [2561 2564]
    )
    (command.FuncDef
      name: wd-execute-script-sync
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Assignment
                  keyword: Assign_Local
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:script spids:[2618])
                      op: Equal
                      rhs: {(DQ ($ VSub_Number '$1'))}
                      spids: [2618]
                    )
                  ]
                  spids: [2616]
                )
              terminator: <Op_Semi ';'>
            )
            (C {(shift)})
            (C {(wd-post-session)} {(/execute/sync)} 
              {
                (DQ 
                  (word_part.CommandSubPart
                    command_list: 
                      (command.CommandList
                        children: [
                          (C {(json-obj)} {(script)} 
                            {
                              (DQ 
                                (word_part.CommandSubPart
                                  command_list: 
                                    (command.CommandList
                                      children: [(C {(json-str)} {(DQ ($ VSub_DollarName '$script'))})]
                                    )
                                  left_token: <Left_CommandSub '$('>
                                  spids: [2640 2646]
                                )
                              )
                            } {(args)} 
                            {
                              (DQ 
                                (word_part.CommandSubPart
                                  command_list: 
                                    (command.CommandList
                                      children: [(C {(json-arr)} {(DQ ($ VSub_At '$@'))})]
                                    )
                                  left_token: <Left_CommandSub '$('>
                                  spids: [2654 2660]
                                )
                              )
                            }
                          )
                        ]
                      )
                    left_token: <Left_CommandSub '$('>
                    spids: [2632 2665]
                  )
                )
              }
            )
          ]
          spids: [2613]
        )
      spids: [2609 2612]
    )
    (command.FuncDef
      name: wd-execute-script-async
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: 
                (command.Assignment
                  keyword: Assign_Local
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:script spids:[2680])
                      op: Equal
                      rhs: {(DQ ($ VSub_Number '$1'))}
                      spids: [2680]
                    )
                  ]
                  spids: [2678]
                )
              terminator: <Op_Semi ';'>
            )
            (C {(shift)})
            (C {(wd-post-session)} {(/execute/async)} 
              {
                (DQ 
                  (word_part.CommandSubPart
                    command_list: 
                      (command.CommandList
                        children: [
                          (C {(json-obj)} {(script)} 
                            {
                              (DQ 
                                (word_part.CommandSubPart
                                  command_list: 
                                    (command.CommandList
                                      children: [(C {(json-str)} {(DQ ($ VSub_DollarName '$script'))})]
                                    )
                                  left_token: <Left_CommandSub '$('>
                                  spids: [2702 2708]
                                )
                              )
                            } {(args)} 
                            {
                              (DQ 
                                (word_part.CommandSubPart
                                  command_list: 
                                    (command.CommandList
                                      children: [(C {(json-arr)} {(DQ ($ VSub_At '$@'))})]
                                    )
                                  left_token: <Left_CommandSub '$('>
                                  spids: [2716 2722]
                                )
                              )
                            }
                          )
                        ]
                      )
                    left_token: <Left_CommandSub '$('>
                    spids: [2694 2727]
                  )
                )
              }
            )
          ]
          spids: [2675]
        )
      spids: [2671 2674]
    )
    (command.FuncDef
      name: wd-get-all-cookies
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-get-session-value)} {(/cookie)})
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [2737]
        )
      spids: [2733 2736]
    )
    (command.FuncDef
      name: wd-get-named-cookie
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-get-session-value)} {(/cookie/) (DQ ($ VSub_Number '$1'))})
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [2750]
        )
      spids: [2746 2749]
    )
    (command.FuncDef
      name: wd-add-cookie
      body: 
        (command.BraceGroup
          children: [
            (C {(hush)} {(wd-post-session)} {(/cookie)} 
              {
                (DQ 
                  (word_part.CommandSubPart
                    command_list: 
                      (command.CommandList
                        children: [
                          (C {(json-obj)} {(cookie)} 
                            {
                              (DQ 
                                (word_part.CommandSubPart
                                  command_list: 
                                    (command.CommandList
                                      children: [(C {(json-obj)} {(DQ ($ VSub_At '$@'))})]
                                    )
                                  left_token: <Left_CommandSub '$('>
                                  spids: [2783 2789]
                                )
                              )
                            }
                          )
                        ]
                      )
                    left_token: <Left_CommandSub '$('>
                    spids: [2777 2791]
                  )
                )
              }
            )
          ]
          spids: [2767]
        )
      spids: [2763 2766]
    )
    (command.FuncDef
      name: wd-delete-cookie
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-delete-session)} {(/cookie/) (DQ ($ VSub_Number '$1'))})
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [2801]
        )
      spids: [2797 2800]
    )
    (command.FuncDef
      name: wd-delete-cookies
      body: 
        (command.BraceGroup
          children: [
            (command.Sentence
              child: (C {(wd-delete-session)} {(/cookie)})
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [2817]
        )
      spids: [2813 2816]
    )
    (command.FuncDef
      name: wd-take-screenshot
      body: 
        (command.BraceGroup
          children: [
            (command.Pipeline
              children: [
                (C {(wd-get-session-value)} {(/screenshot)})
                (C {(json-raw)})
                (C {(decode-base64)})
              ]
              negated: F
            )
          ]
          spids: [2831]
        )
      spids: [2827 2830]
    )
    (command.FuncDef
      name: wd-take-element-screenshot
      body: 
        (command.BraceGroup
          children: [
            (command.Pipeline
              children: [
                (C {(wd-get-session-value)} {(/element/) (DQ ($ VSub_Number '$1')) (/screenshot)})
                (C {(json-raw)})
                (C {(decode-base64)})
              ]
              negated: F
            )
          ]
          spids: [2853]
        )
      spids: [2849 2852]
    )
    (command.FuncDef
      name: print-help
      body: 
        (command.BraceGroup
          children: [
            (command.SimpleCommand
              words: [{(cat)}]
              redirects: [
                (redir.HereDoc
                  op: <Redir_DLess '<<'>
                  fd: 16777215
                  here_begin: {(SQ <.>)}
                  here_end_span_id: 3165
                  stdin_parts: [
                    ('# wd -- WebDriver command line tool\n')
                    ('\n')
                    ('`wd` is a simple tool for interacting with servers that implement the\n')
                    ('W3C WebDriver API.\n')
                    ('\n')
                    ('It can be used for web automation tasks such as testing and scraping.\n')
                    ('\n')
                    (
'You can use [Selenium](http://www.seleniumhq.org/) as the WebDriver server\n'
                    )
                    ('to control browsers on your own machine.\n')
                    ('\n')
                    ('There are commercial services that offer the WebDriver API remotely; see\n')
                    ('"Functional Test Services" [here](http://www.seleniumhq.org/ecosystem/).\n')
                    ('\n')
                    (
'See [the WebDriver spec](https://w3c.github.io/webdriver/webdriver-spec.html)\n'
                    )
                    ('for details about the protocol and behavior.\n')
                    ('\n')
                    ('## Dependencies\n')
                    ('\n')
                    ('  - `bash`\n')
                    ('  - `perl` (5.14 or greater)\n')
                    ('  - `curl`\n')
                    ('\n')
                    ('## Example session\n')
                    ('\n')
                    ('    $ export WEBDRIVER_BROWSER=chrome\n')
                    ('    $ export WEBDRIVER_SESSION="$(wd new-session)"\n')
                    ('    $ wd go https://github.com/mbrock/wd\n')
                    ('    $ wd screenshot > /tmp/wd.png\n')
                    ('    $ wd click "$(wd find css .user-mention)"\n')
                    ("    $ wd exec 'return document.title'\n")
                    ('\n')
                    ('## Configuration\n')
                    ('\n')
                    (
'  - `WEBDRIVER_URL`: WebDriver API URL (default `http://127.0.0.1:4444/wd/hub`)\n'
                    )
                    ('\n')
                    ('## Command reference\n')
                    ('\n')
                    ('### Managing sessions\n')
                    ('\n')
                    ('#### `wd new-session`\n')
                    ('\n')
                    ('Prints the new session ID.\n')
                    ('\n')
                    ('All other commands expect this ID to be in `WEBDRIVER_SESSION`, so\n')
                    ('\n')
                    ('    export WEBDRIVER_SESSION="$(wd new-session)"\n')
                    ('\n')
                    ('is a useful pattern.\n')
                    ('\n')
                    ('You must configure desired capabilities by setting either\n')
                    ('\n')
                    ('  - `WEBDRIVER_CAPABILITIES` to a stringified JSON object, or\n')
                    ('  - `WEBDRIVER_BROWSER` to a browser name (`chrome`, `firefox`, etc).\n')
                    ('\n')
                    ('#### `wd delete-session`\n')
                    ('\n')
                    ('Deletes the current session.\n')
                    ('\n')
                    ('### Navigation\n')
                    ('\n')
                    ('#### `wd go <url>`\n')
                    ('\n')
                    ('Opens `<url>` in the current window.\n')
                    ('\n')
                    ('#### `wd back`\n')
                    ('\n')
                    ('Navigates back in the current window.\n')
                    ('\n')
                    ('#### `wd forward`\n')
                    ('\n')
                    ('Navigates forward in the current window.\n')
                    ('\n')
                    ('#### `wd refresh`\n')
                    ('\n')
                    ('Refreshes the page of the current window.\n')
                    ('\n')
                    ('### Element finding\n')
                    ('\n')
                    ('#### `wd find <strategy> <selector> ...`\n')
                    ('\n')
                    ('Finds one matching element and prints its element ID.\n')
                    ('\n')
                    ('The `<strategy>` can be one of:\n')
                    ('\n')
                    ('  - `css` (CSS selector)\n')
                    ('  - `xpath` (XPath selector)\n')
                    ('  - `id` (element ID)\n')
                    ('  - `name` (element name)\n')
                    ('  - `class` (element class name)\n')
                    ('  - `tag` (element tag name)\n')
                    ('  - `link` (element link text)\n')
                    ('  - `partial` (partial element link text)\n')
                    ('\n')
                    ('The `<selector>` values are concatenated for convenience.\n')
                    ('\n')
                    ('Example:\n')
                    ('\n')
                    ('    $ wd find css article header img.avatar\n')
                    ('\n')
                    ('#### `wd find-all <strategy> <selector> ...`\n')
                    ('\n')
                    ('See `wd find`; finds all matching elements.\n')
                    ('\n')
                    ('#### `wd find-in <element-id> <strategy> <selector> ...`\n')
                    ('\n')
                    ('See `wd find`; finds one matching sub-element.\n')
                    ('\n')
                    ('#### `wd find-all-in <element-id> <strategy> <selector> ...`\n')
                    ('\n')
                    ('See `wd find`; finds all matching sub-elements.\n')
                    ('\n')
                    ('### Element information\n')
                    ('\n')
                    ('#### `wd is-selected <element-id>`\n')
                    ('\n')
                    ('Exits with a non-zero status if the element is not a selected or\n')
                    ('checked `input` or `option`.\n')
                    ('\n')
                    ('#### `wd is-enabled <element-id>`\n')
                    ('\n')
                    ('Exits with a non-zero status if the element is not an enabled\n')
                    ('form control.\n')
                    ('\n')
                    ('#### `wd attribute <element-id> <attribute-name>`\n')
                    ('\n')
                    ('Prints an element attribute value.\n')
                    ('\n')
                    ('Exits with non-zero status if the given attribute does not exist.\n')
                    ('\n')
                    ('#### `wd css-value <element-id> <css-property-name>`\n')
                    ('\n')
                    ('Prints an element CSS property value.\n')
                    ('\n')
                    ('Exits with non-zero status if the given style property does not exist.\n')
                    ('\n')
                    ('#### `wd text <element-id>`\n')
                    ('\n')
                    ("Prints an element's `innerText`.\n")
                    ('\n')
                    ('#### `wd tag-name <element-id>`\n')
                    ('\n')
                    ('Prints the tag name of an element.\n')
                    ('\n')
                    ('### Element actions\n')
                    ('\n')
                    ('#### `wd click <element-id>`\n')
                    ('\n')
                    ('Clicks an element.\n')
                    ('\n')
                    ('#### `wd clear <element-id>`\n')
                    ('\n')
                    ('Clears the value, checkedness, or text content of an element.\n')
                    ('\n')
                    ('#### `wd send-keys <element-id> [keys] ...`\n')
                    ('\n')
                    ('Sends keys to an element.\n')
                    ('\n')
                    ('Key arguments are concatenated for convenience.\n')
                    ('\n')
                    ('Example:\n')
                    ('\n')
                    ('    $ wd send-keys "$(wd find id search)" webdriver json api\n')
                    ('\n')
                    ('### JavaScript execution\n')
                    ('\n')
                    ('#### `wd execute <body> [argument] ...`\n')
                    ('\n')
                    ('Evaluates the JavaScript code `<body>` as a function called with the\n')
                    ('given arguments.\n')
                    ('\n')
                    ('Prints the return value of the specified function.\n')
                    ('\n')
                    ('#### `wd execute-async <body> [argument] ...`\n')
                    ('\n')
                    (
'Evaluates as in `wd execute` but waiting for the script to invoke a callback\n'
                    )
                    (
'which is passed as an additional final argument to the specified function.\n'
                    )
                    ('\n')
                    ('Prints the value finally passed to the callback.\n')
                    ('\n')
                    ('### Page information\n')
                    ('\n')
                    ('#### `wd get-current-url`\n')
                    ('\n')
                    ('Prints the URL of the page in the current window.\n')
                    ('\n')
                    ('#### `wd get-title`\n')
                    ('\n')
                    ('Prints the title of the page in the current window.\n')
                    ('\n')
                    ('#### `wd get-page-source`\n')
                    ('\n')
                    ('Prints the raw HTML source of the page in the current window.\n')
                    ('\n')
                    ('### Windows\n')
                    ('\n')
                    ('#### `wd get-window-size`\n')
                    ('\n')
                    ("Prints the current window's width and height on separate lines.\n")
                    ('\n')
                    ('#### `wd set-window-size <width> <height>`\n')
                    ('\n')
                    ('Changes the size of the current window.\n')
                    ('\n')
                    ('#### `wd maximize`\n')
                    ('\n')
                    ('Maximizes the current window.\n')
                    ('\n')
                    ('#### `wd get-window-handle`\n')
                    ('\n')
                    ('Prints the window handle of the current window.\n')
                    ('\n')
                    ('#### `wd get-window-handles`\n')
                    ('\n')
                    ('Prints a list of all window handles in the current session.\n')
                    ('\n')
                    ('#### `wd switch-to-window <window-handle>`\n')
                    ('\n')
                    ('Changes which window is the current window.\n')
                    ('\n')
                    ('### Frames\n')
                    ('\n')
                    ('#### `wd switch-to-frame <frame-id>`\n')
                    ('\n')
                    ('Changes the current frame.\n')
                    ('\n')
                    ('`<frame-id>` can be either a number or an element ID.\n')
                    ('\n')
                    ('See [the specification](https://www.w3.org/TR/webdriver/#switch-to-frame)\n')
                    ('for exact details.\n')
                    ('\n')
                    ('#### `wd switch-to-top-level-frame`\n')
                    ('\n')
                    ('Resets the current frame to the top level.\n')
                    ('\n')
                    ('#### `wd switch-to-parent-frame`\n')
                    ('\n')
                    ('Sets the current frame to the parent of the current frame.\n')
                    ('\n')
                    ('### Cookies\n')
                    ('\n')
                    (
'See [the spec](https://w3c.github.io/webdriver/webdriver-spec.html#cookies)\n'
                    )
                    ('for details on cookie JSON serialization.\n')
                    ('\n')
                    ('#### `wd cookies`\n')
                    ('\n')
                    ('Prints the currently set cookies as a JSON array.\n')
                    ('\n')
                    ('#### `wd cookie <name>`\n')
                    ('\n')
                    ('Prints the cookie named `<name>` as JSON.\n')
                    ('\n')
                    ('#### `wd add-cookie <key> <value> <key> <value> ...`\n')
                    ('\n')
                    ('Adds a cookie according to the given keys/values.\n')
                    ('\n')
                    ('Example: `wd add-cookie name \'"user"\' value \'"mbrock"\'`\n')
                    ('\n')
                    ('#### `wd delete-cookie <name>`\n')
                    ('\n')
                    ('Deletes the cookie whose name is `<name>`.\n')
                    ('\n')
                    ('#### `wd delete-cookies`\n')
                    ('\n')
                    ('Deletes all cookies.\n')
                    ('\n')
                    ('### Screenshots\n')
                    ('\n')
                    ('#### `wd screenshot`\n')
                    ('\n')
                    ('Prints a binary PNG screenshot to stdout.\n')
                    ('\n')
                    ('#### `wd element-screenshot <element-id>`\n')
                    ('\n')
                    ('Prints a binary PNG screenshot of a specific element to stdout.\n')
                    ('\n')
                    ('(Not supported by Chrome.)\n')
                  ]
                )
              ]
            )
          ]
          spids: [2879]
        )
      spids: [2875 2878]
    )
    (C {(main)} {(DQ ($ VSub_At '$@'))})
  ]
)