(command.If
  arms: [
    (if_arm
      cond: [
        (command.Sentence
          child: 
            (command.DBracket
              expr: (bool_expr.Unary op_id:Id.BoolUnary_z child:{(DQ ($ Id.VSub_DollarName '$VBM'))})
            )
          terminator: <Id.Op_Semi _>
        )
      ]
      action: [
        (command.If
          arms: [
            (if_arm
              cond: [
                (command.Sentence
                  child: 
                    (command.Pipeline
                      children: [
                        (command.Simple
                          words: [{<command>} {<-v>} {<VBoxManage>}]
                          redirects: [
                            (redir.Redir
                              op: <Id.Redir_GreatAnd '>&'>
                              fd: -1
                              arg_word: {</dev/null>}
                            )
                          ]
                        )
                      ]
                      negated: T
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
              action: [
                (command.Simple
                  words: [{<echo>} {(DQ <'VBoxManage not found!'>)}]
                  redirects: [(redir.Redir op:<Id.Redir_GreatAnd '>&'> fd:-1 arg_word:{<2>})]
                )
                (command.Simple
                  words: [
                    {<echo>}
                    {
                      (DQ 
                        <
'  Please ensure VirtualBox is installed and VBoxManage is on your system PATH.'
                        >
                      )
                    }
                  ]
                  redirects: [(redir.Redir op:<Id.Redir_GreatAnd '>&'> fd:-1 arg_word:{<2>})]
                )
                (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
              ]
              spids: [31 46]
            )
          ]
        )
        (command.ShFunction
          name: check_version
          body: 
            (command.BraceGroup
              children: [
                (C {<local>} {<Id.Lit_VarLike 'MIN_MAJOR='> <4>})
                (C {<local>} {<Id.Lit_VarLike 'MIN_MINOR='> <3>})
                (C {<local>} {<Id.Lit_VarLike 'IFS='> (SQ <.>)})
                (C {<local>} 
                  {<Id.Lit_VarLike 'version='> 
                    (DQ 
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        command_list: 
                          (command.CommandList
                            children: [(C {<VBoxManage>} {<--version>})]
                          )
                      )
                    )
                  }
                )
                (C {<local>} {<version_array>})
                (command.Simple
                  words: [{<read>} {<-a>} {<version_array>}]
                  redirects: [
                    (redir.Redir
                      op: <Id.Redir_TLess '<<<'>
                      fd: -1
                      arg_word: {(DQ ($ Id.VSub_DollarName '$version'))}
                    )
                  ]
                )
                (command.If
                  arms: [
                    (if_arm
                      cond: [
                        (command.Pipeline
                          children: [
                            (command.DBracket
                              expr: 
                                (bool_expr.LogicalOr
                                  left: 
                                    (bool_expr.Binary
                                      op_id: Id.BoolBinary_gt
                                      left: 
                                        {
                                          (DQ 
                                            (braced_var_sub
                                              token: <Id.VSub_Name version_array>
                                              bracket_op: 
                                                (bracket_op.ArrayIndex
                                                  expr: (arith_expr.ArithWord w:{<Id.Lit_Digits 0>})
                                                )
                                            )
                                          )
                                        }
                                      right: {(DQ ($ Id.VSub_DollarName '$MIN_MAJOR'))}
                                    )
                                  right: 
                                    (bool_expr.LogicalAnd
                                      left: 
                                        (bool_expr.Binary
                                          op_id: Id.BoolBinary_ge
                                          left: 
                                            {
                                              (DQ 
                                                (braced_var_sub
                                                  token: <Id.VSub_Name version_array>
                                                  bracket_op: 
                                                    (bracket_op.ArrayIndex
                                                      expr: 
                                                        (arith_expr.ArithWord
                                                          w: {<Id.Lit_Digits 0>}
                                                        )
                                                    )
                                                )
                                              )
                                            }
                                          right: {(DQ ($ Id.VSub_DollarName '$MIN_MAJOR'))}
                                        )
                                      right: 
                                        (bool_expr.Binary
                                          op_id: Id.BoolBinary_ge
                                          left: 
                                            {
                                              (DQ 
                                                (braced_var_sub
                                                  token: <Id.VSub_Name version_array>
                                                  bracket_op: 
                                                    (bracket_op.ArrayIndex
                                                      expr: 
                                                        (arith_expr.ArithWord
                                                          w: {<Id.Lit_Digits 1>}
                                                        )
                                                    )
                                                )
                                              )
                                            }
                                          right: {(DQ ($ Id.VSub_DollarName '$MIN_MINOR'))}
                                        )
                                    )
                                )
                            )
                          ]
                          negated: T
                        )
                      ]
                      action: [
                        (command.Simple
                          words: [
                            {<echo>}
                            {
                              (DQ <'ERROR: VirtualBox '> ($ Id.VSub_DollarName '$version') 
                                <' is less than '> ($ Id.VSub_DollarName '$MIN_MAJOR') <.> ($ Id.VSub_DollarName '$MIN_MINOR') <'.x!'>
                              )
                            }
                          ]
                          redirects: [(redir.Redir op:<Id.Redir_GreatAnd '>&'> fd:-1 arg_word:{<2>})]
                        )
                        (command.Simple
                          words: [
                            {<echo>}
                            {
                              (DQ <'  Only VirtualBox >= '> ($ Id.VSub_DollarName '$MIN_MAJOR') <.> 
                                ($ Id.VSub_DollarName '$MIN_MINOR') <'.x is officially supported.'>
                              )
                            }
                          ]
                          redirects: [(redir.Redir op:<Id.Redir_GreatAnd '>&'> fd:-1 arg_word:{<2>})]
                        )
                        (command.ControlFlow
                          token: <Id.ControlFlow_Exit exit>
                          arg_word: {<1>}
                        )
                      ]
                      spids: [137 199]
                    )
                  ]
                )
              ]
            )
        )
        (C {<check_version>})
        (C {<unset>} {<-f>} {<check_version>})
        (C {<export>} {<Id.Lit_VarLike 'VBM='> <VBoxManage>})
      ]
      spids: [14 27]
    )
  ]
)