Program: 27138
Project: 27138
Buggy source:
@Override @SuppressWarnings({"String_Node_Str","String_Node_Str"}) List<FlowScope> branchedFlowThrough(Node source,FlowScope input){
  FlowScope output=flowThrough(source,input);
  Node condition=null;
  FlowScope conditionFlowScope=null;
  BooleanOutcomePair conditionOutcomes=null;
  List<DiGraphEdge<Node,Branch>> branchEdges=getCfg().getOutEdges(source);
  List<FlowScope> result=new ArrayList<>(branchEdges.size());
  for (  DiGraphEdge<Node,Branch> branchEdge : branchEdges) {
    Branch branch=branchEdge.getValue();
    FlowScope newScope=output;
switch (branch) {
case ON_TRUE:
      if (source.isForIn() || source.isForOf()) {
        Node item=source.getFirstChild();
        Node obj=item.getNext();
        FlowScope informed=traverse(obj,output.createChildFlowScope());
        if (item.isVar()) {
          item=item.getFirstChild();
        }
        if (source.isForIn()) {
          if (item.isName()) {
            JSType iterKeyType=getNativeType(STRING_TYPE);
            ObjectType objType=getJSType(obj).dereference();
            JSType objIndexType=objType == null ? null : objType.getTemplateTypeMap().getResolvedTemplateType(registry.getObjectIndexKey());
            if (objIndexType != null && !objIndexType.isUnknownType()) {
              JSType narrowedKeyType=iterKeyType.getGreatestSubtype(objIndexType);
              if (!narrowedKeyType.isEmptyType()) {
                iterKeyType=narrowedKeyType;
              }
            }
            redeclareSimpleVar(informed,item,iterKeyType);
          }
        }
 else {
          ObjectType objType=getJSType(obj).dereference();
          if (objType.isSubtypeOf(getNativeType(JSTypeNative.ITERABLE_TYPE))) {
            if (objType.isTemplatizedType()) {
              JSType newType=objType.getTemplateTypes().get(0);
              redeclareSimpleVar(informed,item,newType);
            }
          }
        }
        newScope=informed;
        break;
      }
case ON_FALSE:
    if (condition == null) {
      condition=NodeUtil.getConditionExpression(source);
      if (condition == null && source.isCase()) {
        condition=source;
        if (conditionFlowScope == null) {
          conditionFlowScope=traverse(condition.getFirstChild(),output.createChildFlowScope());
        }
      }
    }
  if (condition != null) {
    if (condition.isAnd() || condition.isOr()) {
      if (conditionOutcomes == null) {
        conditionOutcomes=condition.isAnd() ? traverseAnd(condition,output.createChildFlowScope()) : traverseOr(condition,output.createChildFlowScope());
      }
      newScope=reverseInterpreter.getPreciserScopeKnowingConditionOutcome(condition,conditionOutcomes.getOutcomeFlowScope(condition.getToken(),branch == Branch.ON_TRUE),branch == Branch.ON_TRUE);
    }
 else {
      if (conditionFlowScope == null) {
        conditionFlowScope=traverse(condition,output.createChildFlowScope());
      }
      newScope=reverseInterpreter.getPreciserScopeKnowingConditionOutcome(condition,conditionFlowScope,branch == Branch.ON_TRUE);
    }
  }
break;
default :
break;
}
result.add(newScope.optimize());
}
return result;
}

Fixed version (ground truth):
@Override @SuppressWarnings({"String_Node_Str","String_Node_Str"}) List<FlowScope> branchedFlowThrough(Node source,FlowScope input){
  FlowScope output=flowThrough(source,input);
  Node condition=null;
  FlowScope conditionFlowScope=null;
  BooleanOutcomePair conditionOutcomes=null;
  List<DiGraphEdge<Node,Branch>> branchEdges=getCfg().getOutEdges(source);
  List<FlowScope> result=new ArrayList<>(branchEdges.size());
  for (  DiGraphEdge<Node,Branch> branchEdge : branchEdges) {
    Branch branch=branchEdge.getValue();
    FlowScope newScope=output;
switch (branch) {
case ON_TRUE:
      if (source.isForIn() || source.isForOf()) {
        Node item=source.getFirstChild();
        Node obj=item.getNext();
        FlowScope informed=traverse(obj,output.createChildFlowScope());
        if (item.isVar()) {
          item=item.getFirstChild();
        }
        if (source.isForIn()) {
          if (item.isName()) {
            JSType iterKeyType=getNativeType(STRING_TYPE);
            ObjectType objType=getJSType(obj).dereference();
            JSType objIndexType=objType == null ? null : objType.getTemplateTypeMap().getResolvedTemplateType(registry.getObjectIndexKey());
            if (objIndexType != null && !objIndexType.isUnknownType()) {
              JSType narrowedKeyType=iterKeyType.getGreatestSubtype(objIndexType);
              if (!narrowedKeyType.isEmptyType()) {
                iterKeyType=narrowedKeyType;
              }
            }
            redeclareSimpleVar(informed,item,iterKeyType);
          }
        }
 else {
          ObjectType objType=getJSType(obj).dereference();
          if (objType.isSubtypeOf(getNativeType(JSTypeNative.ITERABLE_TYPE))) {
            if (objType.isTemplatizedType()) {
              JSType newType=objType.getTemplateTypeMap().getResolvedTemplateType(registry.getIterableTemplate());
              redeclareSimpleVar(informed,item,newType);
            }
          }
        }
        newScope=informed;
        break;
      }
case ON_FALSE:
    if (condition == null) {
      condition=NodeUtil.getConditionExpression(source);
      if (condition == null && source.isCase()) {
        condition=source;
        if (conditionFlowScope == null) {
          conditionFlowScope=traverse(condition.getFirstChild(),output.createChildFlowScope());
        }
      }
    }
  if (condition != null) {
    if (condition.isAnd() || condition.isOr()) {
      if (conditionOutcomes == null) {
        conditionOutcomes=condition.isAnd() ? traverseAnd(condition,output.createChildFlowScope()) : traverseOr(condition,output.createChildFlowScope());
      }
      newScope=reverseInterpreter.getPreciserScopeKnowingConditionOutcome(condition,conditionOutcomes.getOutcomeFlowScope(condition.getToken(),branch == Branch.ON_TRUE),branch == Branch.ON_TRUE);
    }
 else {
      if (conditionFlowScope == null) {
        conditionFlowScope=traverse(condition,output.createChildFlowScope());
      }
      newScope=reverseInterpreter.getPreciserScopeKnowingConditionOutcome(condition,conditionFlowScope,branch == Branch.ON_TRUE);
    }
  }
break;
default :
break;
}
result.add(newScope.optimize());
}
return result;
}