(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:MY_DIR)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: <Id.Left_DollarParen '$('>
                child: (C {<dirname>} {($ Id.VSub_Number '$0')})
              )
            }
          spids: [4]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:BPF_CGRP2_ARRAY_NAME)
          op: assign_op.Equal
          rhs: {(SQ <test_cgrp2_array_pin>)}
          spids: [14]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:BPF_PROG)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$MY_DIR') <'/test_cgrp2_tc_kern.o'>)}
          spids: [19]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:BPF_SECTION)
          op: assign_op.Equal
          rhs: {(SQ <filter>)}
          spids: [25]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$TC'))} {<Id.Lit_RBracket ']'>})
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:TC)
              op: assign_op.Equal
              rhs: {(SQ <tc>)}
              spids: [43]
            )
          ]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$IP'))} {<Id.Lit_RBracket ']'>})
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:IP)
              op: assign_op.Equal
              rhs: {(SQ <ip>)}
              spids: [60]
            )
          ]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:HOST_IFC)
          op: assign_op.Equal
          rhs: {(SQ <ve>)}
          spids: [69]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:NS_IFC)
          op: assign_op.Equal
          rhs: {(SQ <vens>)}
          spids: [74]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:NS)
          op: assign_op.Equal
          rhs: {(SQ <ns>)}
          spids: [79]
        )
      ]
    )
    (command.ShFunction
      name: find_mnt
      body: 
        (BraceGroup
          children: [
            (command.Pipeline
              children: [
                (C {<cat>} {<'/proc/mounts'>})
                (C {<awk>} 
                  {(SQ <'{ if ($3 == "'>) ($ Id.VSub_Number '$1') 
                    (SQ <'" && mnt == "") { mnt = $2 }} END { print mnt }'>)
                  }
                )
              ]
              negated: F
            )
          ]
        )
    )
    (command.ShFunction
      name: init_cgrp2_vars
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:CGRP2_ROOT)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: (C {<find_mnt>} {<cgroup2>})
                      )
                    }
                  spids: [123]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$CGRP2_ROOT'))} 
                          {<Id.Lit_RBracket ']'>}
                        )
                      ]
                    )
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:CGRP2_ROOT)
                          op: assign_op.Equal
                          rhs: {(SQ <'/mnt/cgroup2'>)}
                          spids: [147]
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:MOUNT_CGRP2)
                          op: assign_op.Equal
                          rhs: {(DQ <yes>)}
                          spids: [153]
                        )
                      ]
                    )
                  ]
                  spids: [131 144]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:CGRP2_TC)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_DollarName '$CGRP2_ROOT') <'/tc'>)}
                  spids: [162]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:CGRP2_TC_LEAF)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_DollarName '$CGRP2_TC') <'/leaf'>)}
                  spids: [169]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: init_bpf_fs_vars
      body: 
        (BraceGroup
          children: [
            (C {<local>} 
              {<Id.Lit_VarLike 'bpf_fs_root='> 
                (command_sub
                  left_token: <Id.Left_DollarParen '$('>
                  child: (C {<find_mnt>} {<bpf>})
                )
              }
            )
            (command.AndOr
              ops: [Id.Op_DPipe]
              children: [
                (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$bpf_fs_root'))} 
                  {<Id.Lit_RBracket ']'>}
                )
                (command.ControlFlow
                  token: <Id.ControlFlow_Return return>
                  arg_word: {<-1>}
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:BPF_FS_TC_SHARE)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_DollarName '$bpf_fs_root') <'/tc/globals'>)}
                  spids: [215]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: setup_cgrp2
      body: 
        (BraceGroup
          children: [
            (command.Case
              to_match: {($ Id.VSub_Number '$1')}
              arms: [
                (case_arm
                  pat_list: [{<start>}]
                  action: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$MOUNT_CGRP2'))} 
                                  {<Id.Lit_Equals '='> <Id.Lit_Equals '='>} {(SQ <yes>)} {<Id.Lit_RBracket ']'>}
                                )
                              ]
                            )
                          action: [
                            (command.AndOr
                              ops: [Id.Op_DPipe]
                              children: [
                                (C {<Id.Lit_LBracket '['>} {<-d>} {($ Id.VSub_DollarName '$CGRP2_ROOT')} 
                                  {<Id.Lit_RBracket ']'>}
                                )
                                (C {<mkdir>} {<-p>} {($ Id.VSub_DollarName '$CGRP2_ROOT')})
                              ]
                            )
                            (command.AndOr
                              ops: [Id.Op_DPipe]
                              children: [
                                (C {<mount>} {<-t>} {<cgroup2>} {<none>} 
                                  {($ Id.VSub_DollarName '$CGRP2_ROOT')}
                                )
                                (command.ControlFlow
                                  token: <Id.ControlFlow_Return return>
                                  arg_word: {($ Id.VSub_QMark '$?')}
                                )
                              ]
                            )
                          ]
                          spids: [242 260]
                        )
                      ]
                    )
                    (C {<mkdir>} {<-p>} {($ Id.VSub_DollarName '$CGRP2_TC_LEAF')})
                  ]
                  spids: [238 239 307 -1]
                )
                (case_arm
                  pat_list: [{<Id.Lit_Star '*'>}]
                  action: [
                    (command.AndOr
                      ops: [Id.Op_DAmp]
                      children: [
                        (C {<rmdir>} {($ Id.VSub_DollarName '$CGRP2_TC_LEAF')})
                        (C {<rmdir>} {($ Id.VSub_DollarName '$CGRP2_TC')})
                      ]
                    )
                    (command.AndOr
                      ops: [Id.Op_DAmp]
                      children: [
                        (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$MOUNT_CGRP2'))} 
                          {<Id.Lit_Equals '='> <Id.Lit_Equals '='>} {(SQ <yes>)} {<Id.Lit_RBracket ']'>}
                        )
                        (C {<umount>} {($ Id.VSub_DollarName '$CGRP2_ROOT')})
                      ]
                    )
                  ]
                  spids: [310 311 347 -1]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: setup_bpf_cgrp2_array
      body: 
        (BraceGroup
          children: [
            (C {<local>} 
              {<Id.Lit_VarLike 'bpf_cgrp2_array='> 
                (DQ ($ Id.VSub_DollarName '$BPF_FS_TC_SHARE') <'/'> 
                  ($ Id.VSub_DollarName '$BPF_CGRP2_ARRAY_NAME')
                )
              }
            )
            (command.Case
              to_match: {($ Id.VSub_Number '$1')}
              arms: [
                (case_arm
                  pat_list: [{<start>}]
                  action: [
                    (C {($ Id.VSub_DollarName '$MY_DIR') <'/test_cgrp2_array_pin'>} {<-U>} 
                      {($ Id.VSub_DollarName '$bpf_cgrp2_array')} {<-v>} {($ Id.VSub_DollarName '$CGRP2_TC')}
                    )
                  ]
                  spids: [379 380 395 -1]
                )
                (case_arm
                  pat_list: [{<Id.Lit_Star '*'>}]
                  action: [
                    (command.AndOr
                      ops: [Id.Op_DAmp]
                      children: [
                        (C {<Id.Lit_LBracket '['>} {<-d>} 
                          {(DQ ($ Id.VSub_DollarName '$BPF_FS_TC_SHARE'))} {<Id.Lit_RBracket ']'>}
                        )
                        (C {<rm>} {<-f>} {($ Id.VSub_DollarName '$bpf_cgrp2_array')})
                      ]
                    )
                  ]
                  spids: [398 399 421 -1]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: setup_net
      body: 
        (BraceGroup
          children: [
            (command.Case
              to_match: {($ Id.VSub_Number '$1')}
              arms: [
                (case_arm
                  pat_list: [{<start>}]
                  action: [
                    (command.AndOr
                      ops: [Id.Op_DPipe]
                      children: [
                        (C {($ Id.VSub_DollarName '$IP')} {<link>} {<add>} 
                          {($ Id.VSub_DollarName '$HOST_IFC')} {<type>} {<veth>} {<peer>} {<name>} {($ Id.VSub_DollarName '$NS_IFC')}
                        )
                        (command.ControlFlow
                          token: <Id.ControlFlow_Return return>
                          arg_word: {($ Id.VSub_QMark '$?')}
                        )
                      ]
                    )
                    (command.AndOr
                      ops: [Id.Op_DPipe]
                      children: [
                        (C {($ Id.VSub_DollarName '$IP')} {<link>} {<set>} {<dev>} 
                          {($ Id.VSub_DollarName '$HOST_IFC')} {<up>}
                        )
                        (command.ControlFlow
                          token: <Id.ControlFlow_Return return>
                          arg_word: {($ Id.VSub_QMark '$?')}
                        )
                      ]
                    )
                    (C {<sysctl>} {<-q>} 
                      {<net.ipv6.conf.> ($ Id.VSub_DollarName '$HOST_IFC') <.accept_dad> 
                        <Id.Lit_Equals '='> <0>
                      }
                    )
                    (command.AndOr
                      ops: [Id.Op_DPipe]
                      children: [
                        (C {($ Id.VSub_DollarName '$IP')} {<netns>} {<add>} {<ns>})
                        (command.ControlFlow
                          token: <Id.ControlFlow_Return return>
                          arg_word: {($ Id.VSub_QMark '$?')}
                        )
                      ]
                    )
                    (command.AndOr
                      ops: [Id.Op_DPipe]
                      children: [
                        (C {($ Id.VSub_DollarName '$IP')} {<link>} {<set>} {<dev>} 
                          {($ Id.VSub_DollarName '$NS_IFC')} {<netns>} {<ns>}
                        )
                        (command.ControlFlow
                          token: <Id.ControlFlow_Return return>
                          arg_word: {($ Id.VSub_QMark '$?')}
                        )
                      ]
                    )
                    (command.AndOr
                      ops: [Id.Op_DPipe]
                      children: [
                        (C {($ Id.VSub_DollarName '$IP')} {<-n>} {($ Id.VSub_DollarName '$NS')} {<link>} 
                          {<set>} {<dev>} {($ Id.VSub_DollarName '$NS_IFC')} {<up>}
                        )
                        (command.ControlFlow
                          token: <Id.ControlFlow_Return return>
                          arg_word: {($ Id.VSub_QMark '$?')}
                        )
                      ]
                    )
                    (C {($ Id.VSub_DollarName '$IP')} {<netns>} {<exec>} {($ Id.VSub_DollarName '$NS')} 
                      {<sysctl>} {<-q>} {<net.ipv6.conf.> ($ Id.VSub_DollarName '$NS_IFC') <.accept_dad> <Id.Lit_Equals '='> <0>}
                    )
                    (command.AndOr
                      ops: [Id.Op_DPipe]
                      children: [
                        (C {($ Id.VSub_DollarName '$TC')} {<qdisc>} {<add>} {<dev>} 
                          {($ Id.VSub_DollarName '$HOST_IFC')} {<clsact>}
                        )
                        (command.ControlFlow
                          token: <Id.ControlFlow_Return return>
                          arg_word: {($ Id.VSub_QMark '$?')}
                        )
                      ]
                    )
                    (command.AndOr
                      ops: [Id.Op_DPipe]
                      children: [
                        (C {($ Id.VSub_DollarName '$TC')} {<filter>} {<add>} {<dev>} 
                          {($ Id.VSub_DollarName '$HOST_IFC')} {<egress>} {<bpf>} {<da>} {<obj>} {($ Id.VSub_DollarName '$BPF_PROG')} {<sec>} 
                          {($ Id.VSub_DollarName '$BPF_SECTION')}
                        )
                        (command.ControlFlow
                          token: <Id.ControlFlow_Return return>
                          arg_word: {($ Id.VSub_QMark '$?')}
                        )
                      ]
                    )
                  ]
                  spids: [443 444 631 -1]
                )
                (case_arm
                  pat_list: [{<Id.Lit_Star '*'>}]
                  action: [
                    (C {($ Id.VSub_DollarName '$IP')} {<netns>} {<del>} {($ Id.VSub_DollarName '$NS')})
                    (C {($ Id.VSub_DollarName '$IP')} {<link>} {<del>} 
                      {($ Id.VSub_DollarName '$HOST_IFC')}
                    )
                  ]
                  spids: [634 635 656 -1]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: run_in_cgrp
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:cmd)
                  op: assign_op.Equal
                  rhs: {(SQ <'echo $$ > '>)}
                  spids: [679]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:cmd)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ ($ Id.VSub_DollarName '$cmd') <' '> ($ Id.VSub_Number '$1') 
                        <'/cgroup.procs; exec '> ($ Id.VSub_Number '$2')
                      )
                    }
                  spids: [685]
                )
              ]
            )
            (C {<bash>} {<-c>} {(DQ ($ Id.VSub_DollarName '$cmd'))})
          ]
        )
    )
    (command.ShFunction
      name: do_test
      body: 
        (BraceGroup
          children: [
            (C {<run_in_cgrp>} {($ Id.VSub_DollarName '$CGRP2_TC_LEAF')} 
              {(DQ <'ping -6 -c3 ff02::1%'> ($ Id.VSub_DollarName '$HOST_IFC') <' >& /dev/null'>)}
            )
            (C {<local>} 
              {<Id.Lit_VarLike 'dropped='> 
                (command_sub
                  left_token: <Id.Left_DollarParen '$('>
                  child: 
                    (command.Pipeline
                      children: [
                        (C {($ Id.VSub_DollarName '$TC')} {<-s>} {<qdisc>} {<show>} {<dev>} 
                          {($ Id.VSub_DollarName '$HOST_IFC')}
                        )
                        (C {<tail>} {<-3>})
                        (C {<awk>} {(SQ <'/drop/{print substr($7, 0, index($7, ",")-1)}'>)})
                      ]
                      negated: F
                    )
                )
              }
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.DBracket
                          expr: 
                            (bool_expr.Binary
                              op_id: Id.BoolBinary_eq
                              left: {($ Id.VSub_DollarName '$dropped')}
                              right: {<0>}
                            )
                        )
                      ]
                    )
                  action: [
                    (C {<echo>} {(DQ <FAIL>)})
                    (command.ControlFlow
                      token: <Id.ControlFlow_Return return>
                      arg_word: {<1>}
                    )
                  ]
                  spids: [758 771]
                )
              ]
              else_action: [
                (C {<echo>} 
                  {(DQ <'Successfully filtered '> ($ Id.VSub_DollarName '$dropped') <' packets'>)}
                )
                (command.ControlFlow
                  token: <Id.ControlFlow_Return return>
                  arg_word: {<0>}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: do_exit
      body: 
        (BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.AndOr
                          ops: [Id.Op_DAmp]
                          children: [
                            (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$DEBUG'))} 
                              {<Id.Lit_Equals '='> <Id.Lit_Equals '='>} {(DQ <yes>)} {<Id.Lit_RBracket ']'>}
                            )
                            (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$MODE'))} 
                              {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(SQ <cleanuponly>)} {<Id.Lit_RBracket ']'>}
                            )
                          ]
                        )
                      ]
                    )
                  action: [
                    (C {<echo>} {(DQ <'------ DEBUG ------'>)})
                    (command.Sentence
                      child: (C {<echo>} {(DQ <'mount: '>)})
                      terminator: <Id.Op_Semi _>
                    )
                    (command.Sentence
                      child: 
                        (command.Pipeline
                          children: [(C {<mount>}) (C {<egrep>} {(SQ <'(cgroup2|bpf)'>)})]
                          negated: F
                        )
                      terminator: <Id.Op_Semi _>
                    )
                    (C {<echo>})
                    (command.Sentence
                      child: (C {<echo>} {(DQ ($ Id.VSub_DollarName '$CGRP2_TC_LEAF') <': '>)})
                      terminator: <Id.Op_Semi _>
                    )
                    (command.Sentence
                      child: (C {<ls>} {<-l>} {($ Id.VSub_DollarName '$CGRP2_TC_LEAF')})
                      terminator: <Id.Op_Semi _>
                    )
                    (C {<echo>})
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (C {<Id.Lit_LBracket '['>} {<-d>} 
                                  {(DQ ($ Id.VSub_DollarName '$BPF_FS_TC_SHARE'))} {<Id.Lit_RBracket ']'>}
                                )
                              ]
                            )
                          action: [
                            (command.Sentence
                              child: 
                                (C {<echo>} {(DQ ($ Id.VSub_DollarName '$BPF_FS_TC_SHARE') <': '>)})
                              terminator: <Id.Op_Semi _>
                            )
                            (command.Sentence
                              child: (C {<ls>} {<-l>} {($ Id.VSub_DollarName '$BPF_FS_TC_SHARE')})
                              terminator: <Id.Op_Semi _>
                            )
                            (C {<echo>})
                          ]
                          spids: [899 912]
                        )
                      ]
                    )
                    (C {<echo>} {(DQ <'Host net:'>)})
                    (C {($ Id.VSub_DollarName '$IP')} {<netns>})
                    (C {($ Id.VSub_DollarName '$IP')} {<link>} {<show>} {<dev>} 
                      {($ Id.VSub_DollarName '$HOST_IFC')}
                    )
                    (C {($ Id.VSub_DollarName '$IP')} {<-6>} {<a>} {<show>} {<dev>} 
                      {($ Id.VSub_DollarName '$HOST_IFC')}
                    )
                    (C {($ Id.VSub_DollarName '$TC')} {<-s>} {<qdisc>} {<show>} {<dev>} 
                      {($ Id.VSub_DollarName '$HOST_IFC')}
                    )
                    (C {<echo>})
                    (C {<echo>} {(DQ ($ Id.VSub_DollarName '$NS') <' net:'>)})
                    (C {($ Id.VSub_DollarName '$IP')} {<-n>} {($ Id.VSub_DollarName '$NS')} {<link>} 
                      {<show>} {<dev>} {($ Id.VSub_DollarName '$NS_IFC')}
                    )
                    (C {($ Id.VSub_DollarName '$IP')} {<-n>} {($ Id.VSub_DollarName '$NS')} {<-6>} 
                      {<link>} {<show>} {<dev>} {($ Id.VSub_DollarName '$NS_IFC')}
                    )
                    (C {<echo>} {(DQ <'------ DEBUG ------'>)})
                    (C {<echo>})
                  ]
                  spids: [815 850]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$MODE'))} 
                          {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(SQ <nocleanup>)} {<Id.Lit_RBracket ']'>}
                        )
                      ]
                    )
                  action: [
                    (C {<setup_net>} {<stop>})
                    (C {<setup_bpf_cgrp2_array>} {<stop>})
                    (C {<setup_cgrp2>} {<stop>})
                  ]
                  spids: [1042 1060]
                )
              ]
            )
          ]
        )
    )
    (C {<init_cgrp2_vars>})
    (C {<init_bpf_fs_vars>})
    (command.WhileUntil
      keyword: <Id.KW_While while>
      cond: 
        (condition.Shell
          commands: [
            (command.DBracket
              expr: (bool_expr.Binary op_id:Id.BoolBinary_ge left:{($ Id.VSub_Pound '$#')} right:{<1>})
            )
          ]
        )
      body: 
        (command.DoGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:a)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_Number '$1'))}
                  spids: [1103]
                )
              ]
            )
            (command.Case
              to_match: {($ Id.VSub_DollarName '$a')}
              arms: [
                (case_arm
                  pat_list: [{<debug>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:DEBUG)
                          op: assign_op.Equal
                          rhs: {(SQ <yes>)}
                          spids: [1120]
                        )
                      ]
                    )
                    (C {<shift>} {<1>})
                  ]
                  spids: [1116 1117 1131 -1]
                )
                (case_arm
                  pat_list: [{<cleanup-only>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:MODE)
                          op: assign_op.Equal
                          rhs: {(SQ <cleanuponly>)}
                          spids: [1138]
                        )
                      ]
                    )
                    (C {<shift>} {<1>})
                  ]
                  spids: [1134 1135 1149 -1]
                )
                (case_arm
                  pat_list: [{<no-cleanup>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:MODE)
                          op: assign_op.Equal
                          rhs: {(SQ <nocleanup>)}
                          spids: [1156]
                        )
                      ]
                    )
                    (C {<shift>} {<1>})
                  ]
                  spids: [1152 1153 1167 -1]
                )
                (case_arm
                  pat_list: [{<Id.Lit_Star '*'>}]
                  action: [
                    (C {<echo>} {(DQ <'test_cgrp2_tc [debug] [cleanup-only | no-cleanup]'>)})
                    (C {<echo>} 
                      {(DQ <'  debug: Print cgrp and network setup details at the end of the test'>)}
                    )
                    (C {<echo>} 
                      {
                        (DQ 
                          <
'  cleanup-only: Try to cleanup things from last test.  No test will be run'
                          >
                        )
                      }
                    )
                    (C {<echo>} {(DQ <'  no-cleanup: Run the test but don\'t do cleanup at the end'>)})
                    (C {<echo>} 
                      {
                        (DQ 
                          <
'[Note: If no arg is given, it will run the test and do cleanup at the end]'
                          >
                        )
                      }
                    )
                    (C {<echo>})
                    (command.ControlFlow
                      token: <Id.ControlFlow_Exit exit>
                      arg_word: {<-1>}
                    )
                  ]
                  spids: [1170 1171 1217 -1]
                )
              ]
            )
          ]
        )
    )
    (C {<trap>} {<do_exit>} {<0>})
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$MODE'))} 
          {<Id.Lit_Equals '='> <Id.Lit_Equals '='>} {(SQ <cleanuponly>)} {<Id.Lit_RBracket ']'>}
        )
        (command.ControlFlow token:<Id.ControlFlow_Exit exit>)
      ]
    )
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (C {<setup_cgrp2>} {<start>})
        (command.ControlFlow
          token: <Id.ControlFlow_Exit exit>
          arg_word: {($ Id.VSub_QMark '$?')}
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (C {<setup_net>} {<start>})
        (command.ControlFlow
          token: <Id.ControlFlow_Exit exit>
          arg_word: {($ Id.VSub_QMark '$?')}
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (C {<init_bpf_fs_vars>})
        (command.ControlFlow
          token: <Id.ControlFlow_Exit exit>
          arg_word: {($ Id.VSub_QMark '$?')}
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (C {<setup_bpf_cgrp2_array>} {<start>})
        (command.ControlFlow
          token: <Id.ControlFlow_Exit exit>
          arg_word: {($ Id.VSub_QMark '$?')}
        )
      ]
    )
    (C {<do_test>})
    (C {<echo>})
  ]
)