All files

src/compiler/driver.panack

Green: covered; red: known zero; amber: unavailable. Blank lines are outside the executable-start-line denominator.

    1 import "explanations.panack"
    2 import "coverage_session.panack"
    3 
    4 record PreparedProject {
    5   valid: Bool,
    6   program: Program,
    7   message: Str
    8 }
    9 
   10 pure diagnostic_messages(diagnostics: [Diagnostic], sources: Map[Str,Str]): Str {
   11   mut output: Str = ""
   12   mut first: Bool = true
   13   for diagnostic in diagnostics {
   14     if first { first = false; } else { output = output + "\n"; }
   15     output = output + diagnostic_with_source(diagnostic, sources)
   16   }
   17   output
   18 }
   19 
   20 prepare_project(path: Str): PreparedProject {
   21   loaded: LoadedProject = load_project(path)
   22   if len(loaded.diagnostics) == 0 {
   23     PreparedProject(true, loaded.program, "")
   24   } else {
   25     PreparedProject(false, loaded.program, diagnostic_messages(loaded.diagnostics, loaded.sources))
   26   }
   27 }
   28 
   29 report_driver_error(message: Str): Nat {
   30   eprint("error: ${message}")
   31   1
   32 }
   33 
   34 pure driver_usage(): Str {
   35   "usage: panack coverage-run ARTIFACT.bc INVENTORY RAW [arguments...]\n       panack coverage-session DIRECTORY ARTIFACT INVENTORY [ARTIFACT INVENTORY ...] -- [arguments...]\n       panack coverage-aggregate --source SOURCE INVENTORY [--source SOURCE INVENTORY ...] --session DIRECTORY [--session DIRECTORY ...]\n       panack coverage-report SOURCE.panack --inventory FILE --coverage RAW\n       panack inventory SOURCE.panack -o FILE [--include SOURCE.panack]\n       panack inventory-check SOURCE.panack --inventory FILE [--include SOURCE.panack]\n       panack FILE | panack {check,compile,run,disasm} FILE\n       panack explain SOURCE.panack --function NAME\n       panack compile SOURCE.panack -o ARTIFACT.bc --source-map MAP\n       panack locate ARTIFACT.bc --source SOURCE.panack --source-map MAP --function NAME --instruction PC"
   36 }
   37 
   38 pure without_final_newline(text: Str): Str {
   39   end: Nat = len(text)
   40   if end > 0 {
   41     last: Nat = end - 1
   42     if text[last] == "\n" { slice(text, 0, last) } else { text }
   43   } else {
   44     text
   45   }
   46 }
   47 
   48 run_source_command(command: Str, path: Str, output: Str, program_arguments: [Str]): Nat {
   49   prepared: PreparedProject = prepare_project(path)
   50   if !prepared.valid {
   51     report_driver_error(prepared.message)
   52   } else {
   53     if command == "check" {
   54       print("ok")
   55       0
   56     } else {
   57       bytecode: BytecodeProgram = compile_program(prepared.program)
   58       if command == "compile" {
   59         destination: Str = if len(output) > 0 { output } else { path_with_suffix(path, ".bc") }
   60         if path_resolve(destination) == path_resolve(path) {
   61           report_driver_error("bytecode output cannot overwrite the source file")
   62         } else {
   63           write_bytes(destination, serialize_bytecode(bytecode))
   64           print("wrote ${destination}")
   65           0
   66         }
   67       } else {
   68         if command == "disasm" {
   69           print(without_final_newline(render_bytecode(bytecode)))
   70           0
   71         } else {
   72           run_bytecode_args(serialize_bytecode(bytecode), program_arguments)
   73           0
   74         }
   75       }
   76     }
   77   }
   78 }
   79 
   80 run_explain_command(values: [Str]): Nat {
   81   if len(values) != 4 {
   82     report_driver_error("explain usage: explain SOURCE.panack --function NAME")
   83   } else {
   84     if path_suffix(values[1]) != ".panack" || values[2] != "--function" || values[3] == "" {
   85       report_driver_error("explain usage: explain SOURCE.panack --function NAME")
   86     } else {
   87       loaded: LoadedProject = load_project_explained(values[1])
   88       name: Str = values[3]
   89       valid: Bool = len(loaded.diagnostics) == 0
   90       if !function_type(loaded.program, name).found && valid {
   91         report_driver_error("explain: unknown function " + source_map_escape(name))
   92       } else {
   93         stdlib_root: Str = if environment_has("PANACKELTY_STDLIB_PATH") {
   94           path_resolve(environment_get("PANACKELTY_STDLIB_PATH"))
   95         } else { "" }
   96         print(render_function_explanations(loaded, name, path_parent(path_resolve(values[1])), stdlib_root))
   97         if valid { 0 } else { report_driver_error(diagnostic_messages(loaded.diagnostics, loaded.sources)) }
   98       }
   99     }
  100   }
  101 }
  102 
  103 run_artifact_command(command: Str, path: Str, program_arguments: [Str]): Nat {
  104   data: Bytes = read_bytes(path)
  105   validation: Str = validate_bytecode(data)
  106   if validation != "ok" {
  107     report_driver_error(validation)
  108   } else {
  109     if command == "check" {
  110       print("ok")
  111       0
  112     } else {
  113       if command == "disasm" {
  114         print(without_final_newline(disassemble_bytecode(data)))
  115         0
  116       } else {
  117         run_bytecode_args(data, program_arguments)
  118         0
  119       }
  120     }
  121   }
  122 }
  123 
  124 pure source_map_argument_present(arguments: [Str]): Bool {
  125   mut present: Bool = false
  126   for argument in arguments { if argument == "--source-map" { present = true; } }
  127   present
  128 }
  129 
  130 record SourceMapArguments {
  131   valid: Bool,
  132   source: Str,
  133   artifact: Str,
  134   sidecar: Str,
  135   function_name: Str,
  136   instruction: Nat
  137 }
  138 
  139 pure source_map_instruction(text: Str): Option[Nat] {
  140   mut valid: Bool = len(text) > 0 && len(text) <= 10
  141   for index in 0..len(text) {
  142     if text[index] < "0" || text[index] > "9" { valid = false; }
  143   }
  144   if valid {
  145     value: Nat = nat_from_str(text)
  146     if value <= 4294967295 { Some(value) } else { None() }
  147   } else { None() }
  148 }
  149 
  150 pure source_map_arguments(values: [Str], locating: Bool): SourceMapArguments {
  151   mut source: Str = ""
  152   mut artifact: Str = ""
  153   mut sidecar: Str = ""
  154   mut function_name: Str = ""
  155   mut instruction: Option[Nat] = None()
  156   mut valid: Bool = len(values) >= 2
  157   if valid {
  158     if locating { artifact = values[1]; } else { source = values[1]; }
  159   }
  160   mut index: Nat = 2
  161   while index < len(values) && valid {
  162     if index + 1 >= len(values) { valid = false; }
  163     else {
  164       option: Str = values[index]
  165       value: Str = values[index + 1]
  166       if option == "--source-map" && sidecar == "" { sidecar = value; }
  167       else { if option == "-o" && !locating && artifact == "" { artifact = value; }
  168       else { if option == "--source" && locating && source == "" { source = value; }
  169       else { if option == "--function" && locating && function_name == "" { function_name = value; }
  170       else { if option == "--instruction" && locating {
  171         match instruction {
  172           Some(previous) => { valid = false; },
  173           None() => {
  174             instruction = source_map_instruction(value)
  175             match instruction { Some(pc) => {}, None() => { valid = false; } }
  176           }
  177         }
  178       } else { valid = false; } } } } }
  179       if value == "" { valid = false; }
  180       index = index + 2
  181     }
  182   }
  183   valid = valid && source != "" && artifact != "" && sidecar != "" &&
  184     path_suffix(source) == ".panack" && path_suffix(artifact) == ".bc"
  185   mut pc: Nat = 0
  186   if locating {
  187     valid = valid && function_name != ""
  188     match instruction { Some(value) => { pc = value; }, None() => { valid = false; } }
  189   }
  190   SourceMapArguments(valid, source, artifact, sidecar, function_name, pc)
  191 }
  192 
  193 run_source_map_command(values: [Str], locating: Bool): Nat {
  194   args: SourceMapArguments = source_map_arguments(values, locating)
  195   if !args.valid {
  196     report_driver_error("source-map usage: compile SOURCE.panack -o ARTIFACT.bc --source-map MAP | locate ARTIFACT.bc --source SOURCE.panack --source-map MAP --function NAME --instruction PC")
  197   } else {
  198     entry: Str = path_resolve(args.source)
  199     artifact_path: Str = path_resolve(args.artifact)
  200     map_path: Str = path_resolve(args.sidecar)
  201     if !locating && (artifact_path == map_path ||
  202         !source_map_destination_available(artifact_path) || !source_map_destination_available(map_path)) {
  203       report_driver_error("source-map compilation requires two distinct, nonexistent output files")
  204     } else {
  205       loaded: LoadedProject = load_project_for_source_map(entry)
  206       if len(loaded.diagnostics) > 0 {
  207         if locating { print("source-map: unavailable"); 0 }
  208         else { report_driver_error(diagnostic_messages(loaded.diagnostics, loaded.sources)) }
  209       } else {
  210         root: Str = path_parent(entry)
  211         stdlib_root: Str = path_resolve(environment_get("PANACKELTY_STDLIB_PATH"))
  212         mapped: SourceMappedProgram = compile_program_with_sources(loaded.program)
  213         artifact: Bytes = serialize_bytecode(mapped.bytecode)
  214         sidecar: Bytes = serialize_source_map(loaded, mapped, artifact, entry, root, stdlib_root)
  215         valid: Bool = byte_len(sidecar) > 0 && validate_bytecode(artifact) == "ok" && source_snapshots_unchanged(loaded)
  216         if locating {
  217           if valid && source_map_matches(artifact_path, artifact) && source_map_matches(map_path, sidecar) {
  218             print(source_map_location(loaded, mapped, args.function_name, args.instruction, root, stdlib_root))
  219           } else { print("source-map: unavailable"); }
  220           0
  221         } else {
  222           if !valid { report_driver_error("source-map limit exceeded, invalid artifact, or source changed during compilation") }
  223           else {
  224             if !source_map_destination_available(artifact_path) || !source_map_destination_available(map_path) {
  225               report_driver_error("source-map output appeared during compilation")
  226             } else {
  227               // The first write can reveal directory-symlink or case aliases.
  228               if !source_map_write(artifact_path, artifact) ||
  229                   !source_map_destination_available(map_path) || !source_map_write(map_path, sidecar) ||
  230                   !source_map_matches(artifact_path, artifact) || !source_map_matches(map_path, sidecar) {
  231                 report_driver_error("could not write source-map output pair; discard any partial output")
  232               } else {
  233                 print("wrote " + args.artifact)
  234                 print("wrote source map " + args.sidecar)
  235                 0
  236               }
  237             }
  238           }
  239         }
  240       }
  241     }
  242   }
  243 }
  244 
  245 run_compiler_command(arguments: [Str]): Nat {
  246   mut values: [Str] = arguments
  247   if len(values) > 0 && values[0] == "--" {
  248     mut trimmed: [Str] = []
  249     mut cursor: Nat = 1
  250     while cursor < len(values) {
  251       trimmed = append(trimmed, values[cursor])
  252       cursor = cursor + 1
  253     }
  254     values = trimmed
  255   } else {}
  256   if len(values) == 0 || values[0] == "--help" {
  257     print(driver_usage())
  258     0
  259   } else {
  260     if values[0] == "coverage-report" || values[0] == "coverage-aggregate" {
  261       if values[0] == "coverage-report" { run_coverage_report(values) } else { run_coverage_aggregate(values) }
  262     } else {
  263       if values[0] == "inventory" || values[0] == "inventory-check" {
  264         run_inventory_command(values, values[0] == "inventory-check")
  265       } else {
  266         if values[0] == "explain" {
  267           run_explain_command(values)
  268         } else {
  269           if values[0] == "locate" {
  270             run_source_map_command(values, true)
  271           } else {
  272             if values[0] == "compile" && source_map_argument_present(values) {
  273               run_source_map_command(values, false)
  274             } else {
  275               mut command: Str = values[0]
  276               mut file_index: Nat = 1
  277               if command != "check" && command != "compile" && command != "run" && command != "disasm" {
  278                 command = "run"
  279                 file_index = 0
  280               } else {}
  281               if file_index >= len(values) {
  282                 report_driver_error("missing input file")
  283               } else {
  284                 path: Str = values[file_index]
  285                 suffix: Str = path_suffix(path)
  286                 mut output: Str = ""
  287                 mut program_arguments: [Str] = []
  288                 mut argument_index: Nat = file_index + 1
  289                 while argument_index < len(values) {
  290                   program_arguments = append(program_arguments, values[argument_index])
  291                   argument_index = argument_index + 1
  292                 }
  293                 if command == "compile" && file_index + 2 < len(values) && values[file_index + 1] == "-o" {
  294                   output = values[file_index + 2]
  295                 } else {}
  296                 if command == "compile" && suffix != ".panack" {
  297                   report_driver_error("compile expects a .panack source file")
  298                 } else {
  299                   if suffix != ".panack" && suffix != ".bc" {
  300                     report_driver_error("expected a .panack source or .bc bytecode file")
  301                   } else {
  302                     if suffix == ".panack" {
  303                       run_source_command(command, path, output, program_arguments)
  304                     } else {
  305                       if command == "compile" { report_driver_error("compile expects a .panack source file") }
  306                       else { run_artifact_command(command, path, program_arguments) }
  307                     }
  308                   }
  309                 }
  310               }
  311             }
  312           }
  313         }
  314       }
  315     }
  316   }
  317 }
  318 
  319 compiler_main(): Void {
  320   status: Nat = run_compiler_command(command_args())
  321   if status != 0 { process_exit(status); } else {}
  322 }
  323 

Functions

[
  {
    "id": "declaration/3",
    "name": "diagnostic_messages",
    "line": 10,
    "state": "covered",
    "entries": "6"
  },
  {
    "id": "declaration/4",
    "name": "prepare_project",
    "line": 20,
    "state": "covered",
    "entries": "3"
  },
  {
    "id": "declaration/5",
    "name": "report_driver_error",
    "line": 29,
    "state": "zero",
    "entries": "0"
  },
  {
    "id": "declaration/6",
    "name": "driver_usage",
    "line": 34,
    "state": "zero",
    "entries": "0"
  },
  {
    "id": "declaration/7",
    "name": "without_final_newline",
    "line": 38,
    "state": "covered",
    "entries": "1"
  },
  {
    "id": "declaration/8",
    "name": "run_source_command",
    "line": 48,
    "state": "covered",
    "entries": "3"
  },
  {
    "id": "declaration/9",
    "name": "run_explain_command",
    "line": 80,
    "state": "zero",
    "entries": "0"
  },
  {
    "id": "declaration/10",
    "name": "run_artifact_command",
    "line": 103,
    "state": "zero",
    "entries": "0"
  },
  {
    "id": "declaration/11",
    "name": "source_map_argument_present",
    "line": 124,
    "state": "covered",
    "entries": "1"
  },
  {
    "id": "declaration/13",
    "name": "source_map_instruction",
    "line": 139,
    "state": "covered",
    "entries": "12"
  },
  {
    "id": "declaration/14",
    "name": "source_map_arguments",
    "line": 150,
    "state": "covered",
    "entries": "8"
  },
  {
    "id": "declaration/15",
    "name": "run_source_map_command",
    "line": 193,
    "state": "zero",
    "entries": "0"
  },
  {
    "id": "declaration/16",
    "name": "run_compiler_command",
    "line": 245,
    "state": "covered",
    "entries": "3"
  },
  {
    "id": "declaration/17",
    "name": "compiler_main",
    "line": 319,
    "state": "covered",
    "entries": "3"
  }
]

Source branch outcomes

[
  {
    "id": "declaration/3/statement/2/decision/body",
    "outcome": "body",
    "line": 13,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/3/statement/2/decision/exit",
    "outcome": "exit",
    "line": 13,
    "state": "covered",
    "hits": "6"
  },
  {
    "id": "declaration/3/statement/2/body/statement/0/value/decision/true",
    "outcome": "true",
    "line": 14,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/3/statement/2/body/statement/0/value/decision/false",
    "outcome": "false",
    "line": 14,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/4/tail/decision/true",
    "outcome": "true",
    "line": 22,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/4/tail/decision/false",
    "outcome": "false",
    "line": 22,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/7/tail/decision/true",
    "outcome": "true",
    "line": 40,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/7/tail/decision/false",
    "outcome": "false",
    "line": 40,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/7/tail/true/tail/decision/true",
    "outcome": "true",
    "line": 42,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/7/tail/true/tail/decision/false",
    "outcome": "false",
    "line": 42,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/8/tail/decision/true",
    "outcome": "true",
    "line": 50,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/8/tail/decision/false",
    "outcome": "false",
    "line": 50,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/8/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 53,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/8/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 53,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/8/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 58,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/8/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 58,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/8/tail/false/tail/false/tail/true/statement/0/value/decision/true",
    "outcome": "true",
    "line": 59,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/8/tail/false/tail/false/tail/true/statement/0/value/decision/false",
    "outcome": "false",
    "line": 59,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/8/tail/false/tail/false/tail/true/tail/decision/true",
    "outcome": "true",
    "line": 60,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/8/tail/false/tail/false/tail/true/tail/decision/false",
    "outcome": "false",
    "line": 60,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/8/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 68,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/8/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 68,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/9/tail/decision/true",
    "outcome": "true",
    "line": 81,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/9/tail/decision/false",
    "outcome": "false",
    "line": 81,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/9/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 84,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/9/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 84,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/9/tail/false/tail/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 84,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/9/tail/false/tail/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 84,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/9/tail/false/tail/condition/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 84,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/9/tail/false/tail/condition/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 84,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/9/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 90,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/9/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 90,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/9/tail/false/tail/false/tail/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 90,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/9/tail/false/tail/false/tail/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 90,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/9/tail/false/tail/false/tail/false/statement/0/value/decision/true",
    "outcome": "true",
    "line": 93,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/9/tail/false/tail/false/tail/false/statement/0/value/decision/false",
    "outcome": "false",
    "line": 93,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/9/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 97,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/9/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 97,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/10/tail/decision/true",
    "outcome": "true",
    "line": 106,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/10/tail/decision/false",
    "outcome": "false",
    "line": 106,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/10/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 109,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/10/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 109,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/10/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 113,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/10/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 113,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/11/statement/1/decision/body",
    "outcome": "body",
    "line": 126,
    "state": "covered",
    "hits": "4"
  },
  {
    "id": "declaration/11/statement/1/decision/exit",
    "outcome": "exit",
    "line": 126,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/11/statement/1/body/tail/decision/true",
    "outcome": "true",
    "line": 126,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/11/statement/1/body/tail/decision/false",
    "outcome": "false",
    "line": 126,
    "state": "covered",
    "hits": "4"
  },
  {
    "id": "declaration/13/statement/0/value/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 140,
    "state": "covered",
    "hits": "11"
  },
  {
    "id": "declaration/13/statement/0/value/decision/skip-right",
    "outcome": "skip-right",
    "line": 140,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/13/statement/1/decision/body",
    "outcome": "body",
    "line": 141,
    "state": "covered",
    "hits": "44"
  },
  {
    "id": "declaration/13/statement/1/decision/exit",
    "outcome": "exit",
    "line": 141,
    "state": "covered",
    "hits": "12"
  },
  {
    "id": "declaration/13/statement/1/body/tail/decision/true",
    "outcome": "true",
    "line": 142,
    "state": "covered",
    "hits": "5"
  },
  {
    "id": "declaration/13/statement/1/body/tail/decision/false",
    "outcome": "false",
    "line": 142,
    "state": "covered",
    "hits": "39"
  },
  {
    "id": "declaration/13/statement/1/body/tail/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 142,
    "state": "covered",
    "hits": "41"
  },
  {
    "id": "declaration/13/statement/1/body/tail/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 142,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/13/tail/decision/true",
    "outcome": "true",
    "line": 144,
    "state": "covered",
    "hits": "5"
  },
  {
    "id": "declaration/13/tail/decision/false",
    "outcome": "false",
    "line": 144,
    "state": "covered",
    "hits": "7"
  },
  {
    "id": "declaration/13/tail/true/tail/decision/true",
    "outcome": "true",
    "line": 146,
    "state": "covered",
    "hits": "4"
  },
  {
    "id": "declaration/13/tail/true/tail/decision/false",
    "outcome": "false",
    "line": 146,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/14/statement/6/value/decision/true",
    "outcome": "true",
    "line": 157,
    "state": "covered",
    "hits": "8"
  },
  {
    "id": "declaration/14/statement/6/value/decision/false",
    "outcome": "false",
    "line": 157,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/14/statement/6/value/true/tail/decision/true",
    "outcome": "true",
    "line": 158,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/14/statement/6/value/true/tail/decision/false",
    "outcome": "false",
    "line": 158,
    "state": "covered",
    "hits": "6"
  },
  {
    "id": "declaration/14/statement/8/decision/body",
    "outcome": "body",
    "line": 161,
    "state": "covered",
    "hits": "22"
  },
  {
    "id": "declaration/14/statement/8/decision/exit",
    "outcome": "exit",
    "line": 161,
    "state": "covered",
    "hits": "8"
  },
  {
    "id": "declaration/14/statement/8/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 161,
    "state": "covered",
    "hits": "22"
  },
  {
    "id": "declaration/14/statement/8/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 161,
    "state": "covered",
    "hits": "8"
  },
  {
    "id": "declaration/14/statement/8/body/tail/decision/true",
    "outcome": "true",
    "line": 162,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/14/statement/8/body/tail/decision/false",
    "outcome": "false",
    "line": 162,
    "state": "covered",
    "hits": "22"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/decision/true",
    "outcome": "true",
    "line": 166,
    "state": "covered",
    "hits": "8"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/decision/false",
    "outcome": "false",
    "line": 166,
    "state": "covered",
    "hits": "14"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 166,
    "state": "covered",
    "hits": "9"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 166,
    "state": "covered",
    "hits": "13"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/decision/true",
    "outcome": "true",
    "line": 167,
    "state": "covered",
    "hits": "5"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/decision/false",
    "outcome": "false",
    "line": 167,
    "state": "covered",
    "hits": "9"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 167,
    "state": "covered",
    "hits": "5"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 167,
    "state": "covered",
    "hits": "9"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/condition/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 167,
    "state": "covered",
    "hits": "5"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/condition/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 167,
    "state": "covered",
    "hits": "9"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 168,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 168,
    "state": "covered",
    "hits": "7"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/false/tail/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 168,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/false/tail/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 168,
    "state": "covered",
    "hits": "7"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/false/tail/condition/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 168,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/false/tail/condition/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 168,
    "state": "covered",
    "hits": "7"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 169,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 169,
    "state": "covered",
    "hits": "5"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/false/tail/false/tail/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 169,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/false/tail/false/tail/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 169,
    "state": "covered",
    "hits": "5"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/false/tail/false/tail/condition/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 169,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/false/tail/false/tail/condition/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 169,
    "state": "covered",
    "hits": "4"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 170,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 170,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/false/tail/false/tail/false/tail/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 170,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/false/tail/false/tail/false/tail/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 170,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/false/tail/false/tail/false/tail/true/tail/arm/0",
    "outcome": "Some",
    "line": 172,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/false/tail/false/tail/false/tail/true/tail/arm/1",
    "outcome": "None",
    "line": 173,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/false/tail/false/tail/false/tail/true/tail/arm/1/body/block/tail/arm/0",
    "outcome": "Some",
    "line": 175,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/2/value/false/tail/false/tail/false/tail/false/tail/true/tail/arm/1/body/block/tail/arm/1",
    "outcome": "None",
    "line": 175,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/3/value/decision/true",
    "outcome": "true",
    "line": 179,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/14/statement/8/body/tail/false/statement/3/value/decision/false",
    "outcome": "false",
    "line": 179,
    "state": "covered",
    "hits": "21"
  },
  {
    "id": "declaration/14/statement/9/value/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 183,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/14/statement/9/value/decision/skip-right",
    "outcome": "skip-right",
    "line": 183,
    "state": "covered",
    "hits": "6"
  },
  {
    "id": "declaration/14/statement/9/value/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 183,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/14/statement/9/value/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 183,
    "state": "covered",
    "hits": "5"
  },
  {
    "id": "declaration/14/statement/9/value/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 183,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/14/statement/9/value/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 183,
    "state": "covered",
    "hits": "5"
  },
  {
    "id": "declaration/14/statement/9/value/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 183,
    "state": "covered",
    "hits": "4"
  },
  {
    "id": "declaration/14/statement/9/value/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 183,
    "state": "covered",
    "hits": "4"
  },
  {
    "id": "declaration/14/statement/9/value/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 183,
    "state": "covered",
    "hits": "4"
  },
  {
    "id": "declaration/14/statement/9/value/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 183,
    "state": "covered",
    "hits": "4"
  },
  {
    "id": "declaration/14/statement/11/value/decision/true",
    "outcome": "true",
    "line": 186,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/14/statement/11/value/decision/false",
    "outcome": "false",
    "line": 186,
    "state": "covered",
    "hits": "6"
  },
  {
    "id": "declaration/14/statement/11/value/true/statement/0/value/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 187,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/14/statement/11/value/true/statement/0/value/decision/skip-right",
    "outcome": "skip-right",
    "line": 187,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/14/statement/11/value/true/tail/arm/0",
    "outcome": "Some",
    "line": 188,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/14/statement/11/value/true/tail/arm/1",
    "outcome": "None",
    "line": 188,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/decision/true",
    "outcome": "true",
    "line": 195,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/decision/false",
    "outcome": "false",
    "line": 195,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 201,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 201,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 201,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 201,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/condition/right/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 201,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/condition/right/decision/skip-right",
    "outcome": "skip-right",
    "line": 201,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/condition/right/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 201,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/condition/right/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 201,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 206,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 206,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/true/tail/decision/true",
    "outcome": "true",
    "line": 207,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/true/tail/decision/false",
    "outcome": "false",
    "line": 207,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/statement/5/value/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 215,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/statement/5/value/decision/skip-right",
    "outcome": "skip-right",
    "line": 215,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/statement/5/value/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 215,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/statement/5/value/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 215,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 216,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 216,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/true/statement/0/value/decision/true",
    "outcome": "true",
    "line": 217,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/true/statement/0/value/decision/false",
    "outcome": "false",
    "line": 217,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/true/statement/0/value/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 217,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/true/statement/0/value/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 217,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/true/statement/0/value/condition/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 217,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/true/statement/0/value/condition/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 217,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 222,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 222,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 224,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 224,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 224,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 224,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 228,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 228,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 228,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 228,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/condition/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 228,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/condition/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 228,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/condition/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 228,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/condition/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 228,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/condition/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 228,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/15/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/condition/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 228,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/statement/1/value/decision/true",
    "outcome": "true",
    "line": 247,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/statement/1/value/decision/false",
    "outcome": "false",
    "line": 247,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/16/statement/1/value/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 247,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/16/statement/1/value/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 247,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/statement/1/value/true/statement/2/decision/body",
    "outcome": "body",
    "line": 250,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/statement/1/value/true/statement/2/decision/exit",
    "outcome": "exit",
    "line": 250,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/tail/decision/true",
    "outcome": "true",
    "line": 256,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/tail/decision/false",
    "outcome": "false",
    "line": 256,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/16/tail/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 256,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/16/tail/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 256,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 260,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 260,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/16/tail/false/tail/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 260,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/16/tail/false/tail/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 260,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/tail/false/tail/true/tail/decision/true",
    "outcome": "true",
    "line": 261,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/tail/false/tail/true/tail/decision/false",
    "outcome": "false",
    "line": 261,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 263,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 263,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 263,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 263,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 266,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 266,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 269,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 269,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 272,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 272,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 272,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 272,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/statement/2/value/decision/true",
    "outcome": "true",
    "line": 277,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/statement/2/value/decision/false",
    "outcome": "false",
    "line": 277,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/statement/2/value/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 277,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/statement/2/value/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 277,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/statement/2/value/condition/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 277,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/statement/2/value/condition/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 277,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/statement/2/value/condition/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 277,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/statement/2/value/condition/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 277,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 281,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 281,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/statement/5/decision/body",
    "outcome": "body",
    "line": 289,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/statement/5/decision/exit",
    "outcome": "exit",
    "line": 289,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/statement/6/value/decision/true",
    "outcome": "true",
    "line": 293,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/statement/6/value/decision/false",
    "outcome": "false",
    "line": 293,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/statement/6/value/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 293,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/statement/6/value/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 293,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/statement/6/value/condition/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 293,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/statement/6/value/condition/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 293,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 296,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 296,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 296,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 296,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 299,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 299,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 299,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 299,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 302,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 302,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 305,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 305,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/17/tail/decision/true",
    "outcome": "true",
    "line": 321,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/17/tail/decision/false",
    "outcome": "false",
    "line": 321,
    "state": "covered",
    "hits": "3"
  }
]

Reviewed declaration exclusions

[
  {
    "id": "declaration/0",
    "reason": "import",
    "line": 1
  },
  {
    "id": "declaration/1",
    "reason": "import",
    "line": 2
  },
  {
    "id": "declaration/2",
    "reason": "record-declaration",
    "line": 4
  },
  {
    "id": "declaration/12",
    "reason": "record-declaration",
    "line": 130
  }
]