(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:NEEDED_PROGRAMS)
          op: Equal
          rhs: {(ArrayLiteralPart words:[{(curl)} {(git)} {(rsync)} {(ssh)}])}
          spids: [3]
        )
      ]
      spids: [3]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:FAILED) op:Equal rhs:{(0)} spids:[16])]
      spids: [16]
    )
    (ForEach
      iter_name: binary
      iter_words: [
        {
          (BracedVarSub
            token: <VSub_Name NEEDED_PROGRAMS>
            bracket_op: (WholeArray op_id:Lit_At)
            spids: [25 30]
          )
        }
      ]
      do_arg_iter: False
      body: 
        (DoGroup
          children: [
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (Pipeline
                          children: [
                            (SimpleCommand
                              words: [{(which)} {($ VSub_Name '$binary')}]
                              redirects: [
                                (Redir
                                  op_id: Redir_Great
                                  fd: 16777215
                                  arg_word: {(/dev/null)}
                                  spids: [44]
                                )
                              ]
                            )
                          ]
                          negated: True
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [(assign_pair lhs:(LhsName name:FAILED) op:Equal rhs:{(1)} spids:[51])]
                      spids: [51]
                    )
                    (SimpleCommand
                      words: [
                        {(echo)}
                        {(DQ ('Unable to locate ') ($ VSub_Name '$binary') (' on the path.'))}
                      ]
                      redirects: [(Redir op_id:Redir_GreatAnd fd:16777215 arg_word:{(2)} spids:[63])]
                    )
                  ]
                  spids: [16777215 48]
                )
              ]
              spids: [16777215 67]
            )
          ]
          spids: [33 69]
        )
      spids: [24 31]
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: 
                (DBracket
                  expr: 
                    (BoolBinary
                      op_id: BoolBinary_GlobNEqual
                      left: {($ VSub_Name '$FAILED')}
                      right: {(0)}
                    )
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (SimpleCommand
              words: [
                {(echo)}
                {
                  (DQ 
                    (
'Please see above error output to determine which programs you need to install or make available on your path. Aborting.'
                    )
                  )
                }
              ]
              redirects: [(Redir op_id:Redir_GreatAnd fd:16777215 arg_word:{(2)} spids:[94])]
            )
            (C {(exit)} {(1)})
          ]
          spids: [16777215 85]
        )
      ]
      spids: [16777215 102]
    )
  ]
)