(CommandList
  children: [
    (C {(set)} {(-euo)} {(pipefail)})
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:XVFB_PID) op:Equal rhs:{(DQ )} spids:[59])]
      spids: [59]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:RUN_SELENIUM)
          op: Equal
          rhs: 
            {
              (DQ 
                (BracedVarSub
                  token: <VSub_Name RUN_SELENIUM>
                  suffix_op: (StringUnary op_id:VTest_ColonHyphen arg_word:{(true)})
                  spids: [65 69]
                )
              )
            }
          spids: [63]
        )
      ]
      spids: [63]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:BUNDLE_PATH) op:Equal rhs:{(DQ )} spids:[72])]
      spids: [72]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:THIS_DIR)
          op: Equal
          rhs: 
            {
              (CommandSubPart
                command_list: 
                  (CommandList
                    children: [
                      (C {(dirname)} 
                        {
                          (DQ 
                            (CommandSubPart
                              command_list: 
                                (CommandList
                                  children: [
                                    (C {(readlink)} {(-f)} 
                                      {
                                        (DQ 
                                          (BracedVarSub
                                            token: <VSub_Name BASH_SOURCE>
                                            bracket_op: (ArrayIndex expr:(ArithWord w:{(Lit_Digits 0)}))
                                            spids: [87 92]
                                          )
                                        )
                                      }
                                    )
                                  ]
                                )
                              left_token: <Left_CommandSub "$(">
                              spids: [81 94]
                            )
                          )
                        }
                      )
                    ]
                  )
                left_token: <Left_CommandSub "$(">
                spids: [77 96]
              )
            }
          spids: [76]
        )
      ]
      spids: [76]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:METEOR_DEV_BUNDLE)
          op: Equal
          rhs: 
            {
              (CommandSubPart
                command_list: 
                  (CommandList
                    children: [(C {(DQ ($ VSub_Name "$THIS_DIR") (/../find-meteor-dev-bundle.sh))})]
                  )
                left_token: <Left_CommandSub "$(">
                spids: [99 104]
              )
            }
          spids: [98]
        )
      ]
      spids: [98]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:NODEJS)
          op: Equal
          rhs: {(DQ ($ VSub_Name "$METEOR_DEV_BUNDLE") (/bin/node))}
          spids: [106]
        )
      ]
      spids: [106]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:NPM)
          op: Equal
          rhs: {(DQ ($ VSub_Name "$METEOR_DEV_BUNDLE") (/bin/npm))}
          spids: [112]
        )
      ]
      spids: [112]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:SELENIUM_JAR)
          op: Equal
          rhs: {(DQ (selenium-server-standalone-2.53.0.jar))}
          spids: [118]
        )
      ]
      spids: [118]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:SELENIUM_JAR_SHA256)
          op: Equal
          rhs: {(DQ (67b88cbfd3b130de6ff3770948f56cc485fd1abb5b7a769397d9050a59b1e036))}
          spids: [123]
        )
      ]
      spids: [123]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:SELENIUM_DOWNLOAD_URL)
          op: Equal
          rhs: 
            {
              (DQ ("https://selenium-release.storage.googleapis.com/2.53/") 
                ($ VSub_Name "$SELENIUM_JAR")
              )
            }
          spids: [128]
        )
      ]
      spids: [128]
    )
    (FuncDef
      name: cleanExit
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:rc)
                  op: Equal
                  rhs: {($ VSub_Number "$1")}
                  spids: [143]
                )
              ]
              spids: [143]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (C {(Lit_Other "[")} {($ VSub_Name "$rc")} {(-ne)} {(0)} {(Lit_Other "]")})
                      terminator: <Op_Semi ";">
                    )
                  ]
                  action: [
                    (C {(echo)} {(DQ ("Log output: "))})
                    (C {(cat)} {(DQ ($ VSub_Name "$SANDSTORM_DIR") (/var/log/sandstorm.log))})
                  ]
                  spids: [-1 161]
                )
              ]
              spids: [-1 179]
            )
            (C {(DQ ($ VSub_Name "$SANDSTORM_DIR") (/sandstorm))} {(stop)})
            (C {(sleep)} {(1)})
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (C {(Lit_Other "[")} {($ VSub_Name "$rc")} {(-eq)} {(0)} {(Lit_Other "]")})
                      terminator: <Op_Semi ";">
                    )
                  ]
                  action: [(C {(rm)} {(-rf)} {(DQ ($ VSub_Name "$SANDSTORM_DIR"))})]
                  spids: [-1 210]
                )
              ]
              spids: [-1 234]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (C {(Lit_Other "[")} {(-n)} {(DQ ($ VSub_Name "$XVFB_PID"))} {(Lit_Other "]")})
                      terminator: <Op_Semi ";">
                    )
                  ]
                  action: [
                    (C {(kill)} 
                      {
                        (CommandSubPart
                          command_list: 
                            (CommandList
                              children: [
                                (C {(pgrep)} {(--parent)} {($ VSub_Name "$XVFB_PID")} {(java)})
                              ]
                            )
                          left_token: <Left_CommandSub "$(">
                          spids: [269 277]
                        )
                      }
                    )
                    (C {(wait)} {($ VSub_Name "$XVFB_PID")})
                  ]
                  spids: [-1 252]
                )
              ]
              spids: [-1 285]
            )
            (C {(exit)} {($ VSub_Name "$rc")})
          ]
          spids: [140]
        )
      spids: [135 139]
    )
    (FuncDef
      name: cacheSeleniumJar
      body: 
        (BraceGroup
          children: [
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (LogicalNot
                              child: 
                                (BoolUnary
                                  op_id: BoolUnary_e
                                  child: {(./) ($ VSub_Name "$SELENIUM_JAR")}
                                )
                            )
                        )
                      terminator: <Op_Semi ";">
                    )
                  ]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:DOWNLOAD)
                          op: Equal
                          rhs: 
                            {
                              (CommandSubPart
                                command_list: 
                                  (CommandList
                                    children: [(C {(mktemp)} {(selenium-download.XXXXXX)})]
                                  )
                                left_token: <Left_CommandSub "$(">
                                spids: [321 325]
                              )
                            }
                          spids: [320]
                        )
                      ]
                      spids: [320]
                    )
                    (C {(curl)} {(-o)} {($ VSub_Name "$DOWNLOAD")} 
                      {($ VSub_Name "$SELENIUM_DOWNLOAD_URL")}
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:DOWNLOAD_SHASUM)
                          op: Equal
                          rhs: 
                            {
                              (CommandSubPart
                                command_list: 
                                  (CommandList
                                    children: [
                                      (Pipeline
                                        children: [
                                          (C {(sha256sum)} {($ VSub_Name "$DOWNLOAD")})
                                          (C {(cut)} {(-f)} {(1)} {(-d)} {(SQ <" ">)})
                                        ]
                                        negated: False
                                      )
                                    ]
                                  )
                                left_token: <Left_CommandSub "$(">
                                spids: [338 356]
                              )
                            }
                          spids: [337]
                        )
                      ]
                      spids: [337]
                    )
                    (If
                      arms: [
                        (if_arm
                          cond: [
                            (Sentence
                              child: 
                                (DBracket
                                  expr: 
                                    (BoolBinary
                                      op_id: BoolBinary_GlobEqual
                                      left: {(DQ ($ VSub_Name "$DOWNLOAD_SHASUM"))}
                                      right: {(DQ ($ VSub_Name "$SELENIUM_JAR_SHA256"))}
                                    )
                                )
                              terminator: <Op_Semi ";">
                            )
                          ]
                          action: [
                            (C {(mv)} {($ VSub_Name "$DOWNLOAD")} {(./) ($ VSub_Name "$SELENIUM_JAR")})
                          ]
                          spids: [-1 377]
                        )
                      ]
                      else_action: [
                        (C {(echo)} 
                          {
                            (DQ 
                              (
"Selenium jar download didn't match expected checksum.  Discarding."
                              )
                            )
                          }
                        )
                        (C {(exit)} {(1)})
                      ]
                      spids: [388 403]
                    )
                  ]
                  spids: [-1 317]
                )
              ]
              spids: [-1 406]
            )
          ]
          spids: [299]
        )
      spids: [295 298]
    )
    (FuncDef
      name: checkInstalled
      body: 
        (BraceGroup
          children: [
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (Pipeline
                          children: [
                            (C 
                              {
                                (CommandSubPart
                                  command_list: 
                                    (CommandList
                                      children: [
                                        (SimpleCommand
                                          words: [{(which)} {($ VSub_Number "$1")}]
                                          redirects: [
                                            (Redir
                                              op_id: Redir_Great
                                              fd: -1
                                              arg_word: {(/dev/null)}
                                              spids: [427]
                                            )
                                            (Redir
                                              op_id: Redir_Great
                                              fd: 2
                                              arg_word: {(/dev/null)}
                                              spids: [430]
                                            )
                                          ]
                                        )
                                      ]
                                    )
                                  left_token: <Left_CommandSub "$(">
                                  spids: [422 432]
                                )
                              }
                            )
                          ]
                          negated: True
                        )
                      terminator: <Op_Semi ";">
                    )
                  ]
                  action: [
                    (C {(echo)} 
                      {
                        (DQ ("Couldn't find executable '") ($ VSub_Number "$1") 
                          ("' - try installing the ") ($ VSub_Number "$2") (" package?")
                        )
                      }
                    )
                    (C {(exit)} {(1)})
                  ]
                  spids: [-1 436]
                )
              ]
              spids: [-1 455]
            )
          ]
          spids: [415]
        )
      spids: [411 414]
    )
    (While
      cond: [
        (Sentence
          child: (C {(Lit_Other "[")} {($ VSub_Pound "$#")} {(-gt)} {(0)} {(Lit_Other "]")})
          terminator: <Op_Semi ";">
        )
      ]
      body: 
        (DoGroup
          children: [
            (Case
              to_match: {($ VSub_Number "$1")}
              arms: [
                (case_arm
                  pat_list: [{(--no-selenium)}]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:RUN_SELENIUM)
                          op: Equal
                          rhs: {(DQ (false))}
                          spids: [491]
                        )
                      ]
                      spids: [491]
                    )
                  ]
                  spids: [487 488 497 -1]
                )
                (case_arm
                  pat_list: [{(Lit_Other "*")}]
                  action: [
                    (If
                      arms: [
                        (if_arm
                          cond: [
                            (Sentence
                              child: 
                                (C {(Lit_Other "[")} {(-n)} {(DQ ($ VSub_Name "$BUNDLE_PATH"))} 
                                  {(Lit_Other "]")}
                                )
                              terminator: <Op_Semi ";">
                            )
                          ]
                          action: [
                            (C {(echo)} 
                              {(DQ ("Multiple bundle paths specified, please name only one."))}
                            )
                            (C {(exit)} {(1)})
                          ]
                          spids: [-1 517]
                        )
                      ]
                      spids: [-1 532]
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:BUNDLE_PATH)
                          op: Equal
                          rhs: 
                            {
                              (CommandSubPart
                                command_list: 
                                  (CommandList
                                    children: [(C {(readlink)} {(-f)} {(DQ ($ VSub_Number "$1"))})]
                                  )
                                left_token: <Left_CommandSub "$(">
                                spids: [536 544]
                              )
                            }
                          spids: [535]
                        )
                      ]
                      spids: [535]
                    )
                  ]
                  spids: [500 501 547 -1]
                )
              ]
              spids: [480 484 550]
            )
            (C {(shift)})
          ]
          spids: [477 555]
        )
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: (C {(Lit_Other "[")} {(-z)} {(DQ ($ VSub_Name "$BUNDLE_PATH"))} {(Lit_Other "]")})
              terminator: <Op_Semi ";">
            )
          ]
          action: [
            (C {(echo)} 
              {
                (DQ ("No bundle path specified; perhaps you meant to write '") ($ VSub_Number "$0") 
                  (" sandstorm-0-fast.tar.xz'?")
                )
              }
            )
            (C {(exit)} {(1)})
          ]
          spids: [-1 572]
        )
      ]
      spids: [-1 588]
    )
    (C {(cd)} {(DQ ($ VSub_Name "$THIS_DIR"))})
    (C {(checkInstalled)} {(firefox)} {(firefox)})
    (C {(DQ ($ VSub_Name "$NPM"))} {(install)})
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: 
                (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$RUN_SELENIUM"))} 
                  {(KW_Bang "!") (Lit_Other "=")} {(DQ (false))} {(Lit_Other "]")}
                )
              terminator: <Op_Semi ";">
            )
          ]
          action: [
            (C {(checkInstalled)} {(java)} {(default-jre-headless)})
            (C {(checkInstalled)} {(xvfb-run)} {(Xvfb)})
            (C {(checkInstalled)} {(pgrep)} {(procps)})
            (C {(cacheSeleniumJar)})
            (Sentence
              child: 
                (C {(xvfb-run)} {(--server-args) (Lit_Other "=") (DQ ("-screen 0, 1280x1024x24"))} 
                  {(java)} {(-jar)} {(./) ($ VSub_Name "$SELENIUM_JAR")}
                )
              terminator: <Op_Amp "&">
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:XVFB_PID)
                  op: Equal
                  rhs: {($ VSub_Bang "$!")}
                  spids: [676]
                )
              ]
              spids: [676]
            )
          ]
          spids: [-1 631]
        )
      ]
      spids: [-1 679]
    )
    (C {(export)} {(Lit_VarLike "SANDSTORM_DIR=") ($ VSub_Name "$THIS_DIR") (/tmp-sandstorm)})
    (C {(export)} {(Lit_VarLike "OVERRIDE_SANDSTORM_DEFAULT_DIR=") ($ VSub_Name "$SANDSTORM_DIR")})
    (C {(export)} {(Lit_VarLike "PORT=") (9000)})
    (C {(export)} {(Lit_VarLike "MONGO_PORT=") (9001)})
    (C {(export)} {(Lit_VarLike "SMTP_LISTEN_PORT=") (9002)})
    (C {(export)} {(Lit_VarLike "SMTP_OUTGOING_PORT=") (9003)})
    (C {(export)} {(Lit_VarLike "IP_INTERFACE_TEST_PORT=") (9004)})
    (C {(export)} 
      {(Lit_VarLike "LAUNCH_URL=") (DQ ("http://local.sandstorm.io:") ($ VSub_Name "$PORT"))}
    )
    (C {(rm)} {(-rf)} {(DQ ($ VSub_Name "$SANDSTORM_DIR"))})
    (C {(../install.sh)} {(-d)} {(-u)} {(DQ ($ VSub_Name "$BUNDLE_PATH"))})
    (SimpleCommand
      words: [
        {(echo)}
        {
          (DQ ("IS_TESTING=true\n") ("ALLOW_DEMO_ACCOUNTS=true\n") 
            ("BASE_URL=http://local.sandstorm.io:") ($ VSub_Name "$PORT") ("\n") ("WILDCARD_HOST=*.local.sandstorm.io:") ($ VSub_Name "$PORT") ("\n") 
            ("PORT=") ($ VSub_Name "$PORT") ("\n") ("MONGO_PORT=") ($ VSub_Name "$MONGO_PORT") ("\n") ("SMTP_LISTEN_PORT=") 
            (${ VSub_Name SMTP_LISTEN_PORT) ("\n") ("MAIL_URL=smtp://127.0.0.1:") (${ VSub_Name SMTP_OUTGOING_PORT) ("\n") ("UPDATE_CHANNEL=none\n")
          )
        }
      ]
      redirects: [
        (Redir
          op_id: Redir_DGreat
          fd: -1
          arg_word: {(DQ ($ VSub_Name "$SANDSTORM_DIR") (/sandstorm.conf))}
          spids: [782]
        )
      ]
    )
    (C {(DQ ($ VSub_Name "$SANDSTORM_DIR") (/sandstorm))} {(start)})
    (C {(echo)} {(-n)} {(DQ ("Waiting for sandstorm to start."))})
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:COUNT) op:Equal rhs:{(0)} spids:[805])]
      spids: [805]
    )
    (Sentence
      child: 
        (While
          cond: [
            (Sentence
              child: 
                (Pipeline
                  children: [
                    (SimpleCommand
                      words: [{(curl)} {(-s)} {(localhost) (Lit_Other ":") ($ VSub_Name "$PORT")}]
                      redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(/dev/null)} spids:[820])]
                    )
                  ]
                  negated: True
                )
              terminator: <Op_Semi ";">
            )
          ]
          body: 
            (DoGroup
              children: [
                (If
                  arms: [
                    (if_arm
                      cond: [
                        (Sentence
                          child: 
                            (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$COUNT"))} {(-gt)} {(600)} 
                              {(Lit_Other "]")}
                            )
                          terminator: <Op_Semi ";">
                        )
                      ]
                      action: [(C {(echo)} {(DQ ("Sandstorm failed to start"))}) (C {(cleanExit)} {(1)})]
                      spids: [-1 843]
                    )
                  ]
                  spids: [-1 861]
                )
                (Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (LhsName name:COUNT)
                      op: Equal
                      rhs: 
                        {
                          (ArithSubPart
                            anode: 
                              (ArithBinary
                                op_id: Arith_Plus
                                left: (ArithWord w:{($ VSub_Name "$COUNT")})
                                right: (ArithWord w:{(Lit_Digits 1)})
                              )
                            spids: [865 870]
                          )
                        }
                      spids: [864]
                    )
                  ]
                  spids: [864]
                )
                (C {(echo)} {(-n)} {(.)})
                (C {(sleep)} {(.1)})
              ]
              spids: [825 884]
            )
        )
      terminator: <Op_Semi ";">
    )
    (C {(echo)})
    (C {(set)} {(Lit_Other "+") (e)})
    (C {(export)} {(Lit_VarLike "DISABLE_DEMO=") (true)})
    (C {(DQ ($ VSub_Name "$NPM"))} {(test)})
    (C {(cleanExit)} {($ VSub_QMark "$?")})
  ]
)