<div dir="ltr">Got it !! Thank you Steven :)<br><br>On Friday, 6 March 2015 17:12:38 UTC+5:30, Steven Arzt  wrote:<blockquote class="gmail_quote" style="margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">    <div><p><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Hi Monika,</span></p><p><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">&nbsp;</span></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">You get these warnings because your APK file references classes which are not included in your Android JAR file. This is usually not a problem as long as you do not wish to analyze the code of the Android operating system itself.</span></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">&nbsp;</span></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Best regards,</span></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">&nbsp; Steven</span></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">&nbsp;</span></p><p><b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">Von:</span></b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;"> <a href="javascript:" target="_blank" gdf-obfuscated-mailto="-gS5Elur2lEJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">soot-lis...@CS.McGill.CA</a> [mailto:<a href="javascript:" target="_blank" gdf-obfuscated-mailto="-gS5Elur2lEJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">soot-lis...@CS.<wbr>McGill.CA</a>] <b>Im Auftrag von </b>Monika Mashalkar<br><b>Gesendet:</b> Mittwoch, 25. Februar 2015 13:51<br><b>An:</b> Steven Arzt<br><b>Cc:</b> <a href="javascript:" target="_blank" gdf-obfuscated-mailto="-gS5Elur2lEJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">soot...@CS.McGill.CA</a>; <a href="javascript:" target="_blank" gdf-obfuscated-mailto="-gS5Elur2lEJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">soot...@sable.mcgill.ca</a>; <a href="javascript:" target="_blank" gdf-obfuscated-mailto="-gS5Elur2lEJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">soot...@googlegroups.com</a><br><b>Betreff:</b> Re: [Soot-list] Generating Android APK CallFlowGraph</span></p><p>&nbsp;</p><div><p>Hi Steven,</p><div><p>&nbsp;</p></div><div><p>Thanks for your quick reply. I am able to run the code now. But I am getting the warnings as follow :</p></div><div><p>&nbsp;</p></div><div><div><p>Warning: java.lang.ref.Finalizer is a phantom class!</p></div><div><p>Warning: android.graphics.pdf.<wbr>PdfDocument$Page is a phantom class!</p></div><div><p>Warning: android.graphics.pdf.<wbr>PdfDocument$PageInfo is a phantom class!</p></div><div><p>Warning: android.graphics.pdf.<wbr>PdfDocument is a phantom class!</p></div><div><p>Warning: android.media.<wbr>RemoteControlClient$<wbr>OnGetPlaybackPositionListener is a phantom class!</p></div><div><p>Warning: android.media.<wbr>RemoteControlClient$<wbr>OnPlaybackPositionUpdateListen<wbr>er is a phantom class!</p></div><div><p>Warning: android.print.PageRange is a phantom class!</p></div><div><p>Warning: android.print.PrintAttributes$<wbr>Builder is a phantom class!</p></div><div><p>Warning: android.print.PrintAttributes$<wbr>MediaSize is a phantom class!</p></div><div><p>Warning: android.print.PrintAttributes is a phantom class!</p></div><div><p>Warning: android.print.<wbr>PrintDocumentAdapter$<wbr>LayoutResultCallback is a phantom class!</p></div><div><p>Warning: android.print.<wbr>PrintDocumentAdapter$<wbr>WriteResultCallback is a phantom class!</p></div><div><p>Warning: android.print.<wbr>PrintDocumentAdapter is a phantom class!</p></div><div><p>Warning: android.print.<wbr>PrintDocumentInfo$Builder is a phantom class!</p></div><div><p>Warning: android.print.<wbr>PrintDocumentInfo is a phantom class!</p></div><div><p>Warning: android.print.PrintJob is a phantom class!</p></div><div><p>Warning: android.print.PrintManager is a phantom class!</p></div><div><p>Warning: android.print.pdf.<wbr>PrintedPdfDocument is a phantom class!</p></div><div><p>Warning: android.view.ViewTreeObserver$<wbr>OnWindowAttachListener is a phantom class!</p></div><div><p>Warning: android.view.ViewTreeObserver$<wbr>OnWindowFocusChangeListener is a phantom class!</p></div></div><div><p>&nbsp;</p></div><div><p>May I know the reason, why I am getting these warnings ?</p></div><div><p>&nbsp;</p></div><div><p>The command that I am using to run the program is :</p></div><div><p>&nbsp;</p></div><div><p>monika@monika-OptiPlex-990:~$ java -cp .:soot-trunk.jar:soot-<wbr>infoflow.jar:soot-infoflow-<wbr>android.jar:slf4j-api-1.7.5.<wbr>jar:slf4j-simple-1.7.5.jar:<wbr>axml-2.0.jar:/usr/lib/jvm/<wbr>java-7-openjdk-i386/jre/lib/<wbr>rt.jar CFG</p></div><div><p>&nbsp;</p></div><div><p>I am attaching the output file with this mail. Please, tell me I am getting it correct or not.</p></div><div><p>&nbsp;</p></div><div><p>Thanks and regards,</p></div><div><p>Monika</p></div></div><div><p>&nbsp;</p><div><p>On Wed, Feb 25, 2015 at 3:51 PM, Steven Arzt &lt;<a href="javascript:" target="_blank" gdf-obfuscated-mailto="-gS5Elur2lEJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">Steve...@cased.de</a>&gt; wrote:</p><div><div><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Hi Monika,</span></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">&nbsp;</span></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">The CFG class is not part of Soot. It was just written as an example. You need to compile it on your own.</span></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">&nbsp;</span></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">Best regards,</span></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">&nbsp; Steven</span></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">&nbsp;</span></p><p><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">&nbsp;</span></p><p><span lang="EN-US" style="font-size:13.5pt;font-family:&quot;Courier New&quot;;color:black">M.Sc. M.Sc. Steven Arzt</span></p><p><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">Secure Software Engineering Group (SSE)</span></p><p><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">European Center for Security and Privacy by Design (EC SPRIDE) </span></p><p><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">Rheinstraße 75</span></p><p><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">D-64293 Darmstadt</span></p><p><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">Phone: +49 61 51 869-336</span></p><p><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">Fax: +49 61 51 16-72118</span></p><p><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">eMail: </span><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black"><a href="javascript:" target="_blank" gdf-obfuscated-mailto="-gS5Elur2lEJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;"><span lang="EN-US">steven.arzt@ec-spride.de</span></a></span></p><p><span style="font-size:10.0pt;font-family:&quot;Courier New&quot;;color:black">Web: <a href="http://sse.ec-spride.de/" target="_blank" rel="nofollow" onmousedown="this.href='http://www.google.com/url?q\75http%3A%2F%2Fsse.ec-spride.de%2F\46sa\75D\46sntz\0751\46usg\75AFQjCNGigQaO_uOHvandnthTpq57clh04g';return true;" onclick="this.href='http://www.google.com/url?q\75http%3A%2F%2Fsse.ec-spride.de%2F\46sa\75D\46sntz\0751\46usg\75AFQjCNGigQaO_uOHvandnthTpq57clh04g';return true;">http://sse.ec-spride.de</a></span></p><p><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">&nbsp;</span></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">&nbsp;</span></p><p><span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">&nbsp;</span></p><p><b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">Von:</span></b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;"> Monika Mashalkar [mailto:<a href="javascript:" target="_blank" gdf-obfuscated-mailto="-gS5Elur2lEJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">monikam...@gmail.<wbr>com</a>] <br><b>Gesendet:</b> Mittwoch, 25. Februar 2015 05:30<br><b>An:</b> <a href="javascript:" target="_blank" gdf-obfuscated-mailto="-gS5Elur2lEJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">soot...@googlegroups.com</a><br><b>Cc:</b> <a href="javascript:" target="_blank" gdf-obfuscated-mailto="-gS5Elur2lEJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">soot...@sable.mcgill.ca</a>; <a href="javascript:" target="_blank" gdf-obfuscated-mailto="-gS5Elur2lEJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">soot...@cs.mcgill.ca</a>; <a href="javascript:" target="_blank" gdf-obfuscated-mailto="-gS5Elur2lEJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">Steve...@cased.de</a><br><b>Betreff:</b> Re: [Soot-list] Generating Android APK CallFlowGraph</span></p><p>&nbsp;</p><div><p>Hi Lokesh,</p><div><p>&nbsp;</p></div><div><p>I am very new to the SOOT Framework and Flow-droid. I want to find the flow graph from android apk in my project and I am trying to run the code posted in this thread to do the same. I am trying to run the following command on Ubuntu&nbsp;<br><br>Command :&nbsp;java -cp soot-trunk.jar:soot-infoflow.<wbr>jar:soot-infoflow-android.jar:<wbr>slf4j-api-1.7.5.jar:slf4j-<wbr>simple-1.7.5.jar:axml-2.0.jar -cp .:/usr/lib/jvm/java-7-openjdk-<wbr>i386/jre/lib/rt.jar CFG</p></div><div><p>&nbsp;</p></div><div><p>but I am getting Error as :&nbsp;Error: Could not find or load main class CFG</p></div><div><p>&nbsp;</p></div><div><p>Could you please tell me the command to execute the CFG program.</p></div><div><p>&nbsp;</p></div><div><p>Thank you,</p></div><div><p>Monika</p></div><div><p><br>On Monday, 21 July 2014 13:46:37 UTC+5:30, LOKESH JAIN wrote:</p><div><p>Hi all,</p><div><p>&nbsp;</p></div><div><p>I resolved the issue and finally i am getting the call graph. Thank you all of you for your time and help. :)</p></div><div><p>&nbsp;</p></div><div><p>1. But Stevan I am still curious to know how to work with QueueReader Object for generating dot format.</p></div><div><p>2. And why the size of call graph for RV2013.apk is 54. And is there any way to remove unnecessary size.</p></div><div><p>&nbsp;</p></div><div><p>Thanks&amp;Regards</p></div><div><p>Lokesh</p></div></div><div><p style="margin-bottom:12.0pt">&nbsp;</p><div><p>On Mon, Jul 21, 2014 at 11:38 AM, LOKESH JAIN &lt;<a>lokesh...@gmail.com</a>&gt; wrote:</p><div><div><div><div><p>Hi all,</p></div><div><p>Steven I still couldn't figure it out how to work with queuereader object for generating dot format.</p></div><div><p>&nbsp;</p></div><div><p>I have used dot graph class manually as suggested to me by Stefan but,</p></div><div><div><div><p>I am getting NullPointerException. I don't know why. I have pasted the complete code.</p></div><div><p>Please help me out.</p></div><div><p>&nbsp;</p></div><div><p>Exception in thread "main" java.lang.NullPointerException</p></div><div><p>at DotGraph.getNode(DotGraph.<wbr>java:53)</p></div><div><p>at DotGraph.drawNode(DotGraph.<wbr>java:61)</p></div><div><p>at CFG.visit(CFG.java:114)</p></div><div><p>at CFG.main(CFG.java:94)</p></div><div><p>&nbsp;</p></div><div><p>&nbsp;</p></div><div><p>CFG.java</p></div><div><p>&nbsp;</p></div><div><p>import java.io.BufferedOutputStream;</p></div><div><p>import java.io.FileOutputStream;</p></div><div><div><p>import java.io.IOException;</p></div><div><p>import java.io.OutputStream;</p></div><div><p>import java.util.Collections;</p></div></div><div><p>import java.util.HashMap;</p></div><div><p>import java.util.HashSet;</p></div><div><p>import java.util.Iterator;</p></div><div><div><p>import java.util.LinkedList;</p></div><div><p>import java.util.List;</p></div><div><p>&nbsp;</p></div><div><p>import org.xmlpull.v1.<wbr>XmlPullParserException;</p></div><div><p>&nbsp;</p></div></div><div><p>import soot.MethodOrMethodContext;</p></div><div><div><p>import soot.PackManager;</p></div><div><p>import soot.Scene;</p></div><div><p>import soot.SootMethod;</p></div><div><p>import soot.jimple.infoflow.android.<wbr>SetupApplication;</p></div></div><div><p>import soot.jimple.toolkits.<wbr>callgraph.CallGraph;</p></div><div><p>import soot.jimple.toolkits.<wbr>callgraph.Targets;</p></div><div><div><p>import soot.options.Options;</p></div><div><p>import soot.util.dot.DotGraphUtility;</p></div><div><p>import soot.util.dot.Renderable;</p></div><div><p>public class CFG {</p></div></div><div><p>private static DotGraph dot = new DotGraph("callgraph");</p></div></div></div><div><p>private static&nbsp;HashMap &lt;String,Boolean&gt; visited = new HashMap&lt;String,Boolean&gt;(); </p></div><div><div><div><p>public CFG() {</p></div><div><div><div><p>&nbsp;</p></div><div><p>&nbsp;</p></div><div><p>}</p></div><div><p>&nbsp;</p></div><div><p>public static void main(String[] args) {</p></div><div><p>&nbsp;</p></div><div><p>// TODO Auto-generated method stub</p></div><div><p>&nbsp;</p></div><div><p>SetupApplication app = new SetupApplication("/home/<wbr>lokesh/Desktop/android-sdk-<wbr>linux/platforms/android-19/<wbr>android.jar","/home/lokesh/<wbr>Desktop/android-<wbr>instrumentation-tutorial-<wbr>master/app-example/RV2013/bin/<wbr>RV2013.apk");</p></div><div><p>try {</p></div><div><p>&nbsp;</p></div><div><p>app.<wbr>calculateSourcesSinksEntrypoin<wbr>ts("/home/lokesh/Downloads/<wbr>soot-infoflow-android-develop/<wbr>SourcesAndSinks.txt");</p></div><div><p>&nbsp;</p></div><div><p>&nbsp;</p></div><div><p>} catch (IOException e) {</p></div><div><p>&nbsp;</p></div><div><p>// TODO Auto-generated catch block</p></div><div><p>&nbsp;</p></div><div><p>e.printStackTrace();</p></div><div><p>&nbsp;</p></div><div><p>} catch (XmlPullParserException e) {</p></div><div><p>&nbsp;</p></div><div><p>// TODO Auto-generated catch block</p></div><div><p>&nbsp;</p></div><div><p>e.printStackTrace();</p></div><div><p>&nbsp;</p></div><div><p>}</p></div><div><p>&nbsp;</p></div><div><p>soot.G.reset();</p></div><div><p>&nbsp;</p></div><div><p>Options.v().set_src_prec(<wbr>Options.src_prec_apk);</p></div><div><p>&nbsp;</p></div><div><p>Options.v().set_process_dir(<wbr>Collections.singletonList("/<wbr>home/lokesh/Desktop/android-<wbr>instrumentation-tutorial-<wbr>master/app-example/RV2013/bin/<wbr>RV2013.apk"));</p></div><div><p>&nbsp;</p></div><div><p>Options.v().set_force_android_<wbr>jar("/home/lokesh/Desktop/<wbr>android-sdk-linux/platforms/<wbr>android-19/android.jar");</p></div><div><p>&nbsp;</p></div><div><p>Options.v().set_whole_program(<wbr>true);</p></div><div><p>&nbsp;</p></div><div><p>Options.v().set_allow_phantom_<wbr>refs(true);</p></div><div><p>&nbsp;</p></div><div><p>Options.v().set_output_format(<wbr>Options.output_format_none);</p></div><div><p>&nbsp;</p></div><div><p>Options.v().setPhaseOption("<wbr>cg.spark verbose:true", "on");</p></div><div><p>&nbsp;</p></div><div><p>Scene.v().<wbr>loadNecessaryClasses();</p></div><div><p>&nbsp;</p></div><div><p>SootMethod entryPoint = app.getEntryPointCreator().<wbr>createDummyMain();</p></div><div><p>&nbsp;</p></div><div><p>Options.v().set_main_class(<wbr>entryPoint.getSignature());</p></div><div><p>&nbsp;</p></div><div><p>Scene.v().setEntryPoints(<wbr>Collections.singletonList(<wbr>entryPoint));</p></div><div><p>&nbsp;</p></div><div><p>System.out.println("..........<wbr>.."+entryPoint.getActiveBody()<wbr>);</p></div><div><p>&nbsp;</p></div><div><p>PackManager.v().runPacks();</p></div><div><p>&nbsp;</p></div><div><p>System.out.println(Scene.v().<wbr>getCallGraph().size());</p></div></div></div><div><div><p>CallGraph cg = Scene.v().getCallGraph();</p></div><div><p>&nbsp;</p></div><div><p>visit(cg, entryPoint);</p></div></div><div><p>dot.plot("/home/lokesh/<wbr>Desktop/soot1"+ dot.DOT_EXTENSION);</p></div><div><div><p>&nbsp;</p></div><div><p>}</p></div><div><p>private static void visit(CallGraph cg, SootMethod k)</p></div><div><p>{</p></div><div><p>String identifier = k.getName();</p></div></div><div><p>&nbsp;</p></div></div></div><div><div><div><p>visited.put(k.getSignature(),<wbr>true);</p></div><div><div><p>&nbsp;</p></div><div><p>&nbsp;</p></div><div><p>dot.drawNode(identifier);</p></div><div><p>&nbsp;</p></div><div><p>&nbsp;</p></div><div><p>//iterate over unvisited parents</p></div><div><p>Iterator&lt;<wbr>MethodOrMethodContext&gt; ptargets = new Targets(cg.edgesInto(k));</p></div><div><p>&nbsp;</p></div><div><p>&nbsp;</p></div><div><p>if(ptargets != null){</p></div><div><p>while(ptargets.hasNext())</p></div><div><p>{</p></div><div><p>SootMethod p = (SootMethod) ptargets.next();</p></div><div><p>&nbsp;</p></div><div><p>&nbsp;</p></div><div><p>if(p == null) System.out.println("p is null");</p></div><div><p>&nbsp;</p></div><div><p>&nbsp;</p></div><div><p>if(!visited.containsKey(p.<wbr>getSignature()))</p></div><div><p>visit(cg,p);</p></div><div><p>}</p></div><div><p>}</p></div><div><p>&nbsp;</p></div><div><p>&nbsp;</p></div><div><p>//iterate over unvisited children</p></div><div><p>Iterator&lt;<wbr>MethodOrMethodContext&gt; ctargets = new Targets(cg.edgesOutOf(k));</p></div><div><p>&nbsp;</p></div><div><p>&nbsp;</p></div><div><p>if(ctargets != null){</p></div><div><p>while(ctargets.hasNext())</p></div><div><p>{</p></div><div><p>SootMethod c = (SootMethod) ctargets.next();</p></div><div><p>if(c == null) System.out.println("c is null");</p></div><div><p>dot.drawEdge(identifier, c.getName());</p></div><div><p>&nbsp;</p></div><div><p>&nbsp;</p></div><div><p>if(!visited.containsKey(c.<wbr>getSignature()))</p></div><div><p>visit(cg,c);</p></div><div><p>}</p></div><div><p>}</p></div><div><p>}</p></div><div><p>}</p></div><div><p>&nbsp;</p></div><div><p>&nbsp;</p></div><div><p>&nbsp;</p></div><div><p>&nbsp;</p></div></div><div><p>DotGraph.java</p></div><div><p>&nbsp;</p></div><div><p>import java.io.BufferedOutputStream;</p></div><div><p>import java.io.FileOutputStream;</p></div><div><p>import java.io.IOException;</p></div><div><p>import java.io.OutputStream;</p></div><div><p>import java.util.HashMap;</p></div><div><p>import java.util.LinkedList;</p></div><div><p>import java.util.List;</p></div><div><p>&nbsp;</p></div><div><p>import soot.util.dot.DotGraphEdge;</p></div><div><p>import soot.util.dot.DotGraphNode;</p></div><div><div><p>import soot.util.dot.DotGraphUtility;</p></div><div><p>import soot.util.dot.Renderable;</p></div><div><p>&nbsp;</p></div><div><p>public class DotGraph implements Renderable</p></div><div><p>{</p></div></div><div><p>public final static String DOT_EXTENSION = ".dot";</p></div><div><p>private HashMap&lt;String, DotGraphNode&gt; nodes;</p></div><div><div><p>private boolean isSubGraph;</p></div><div><p>private List&lt;Renderable&gt; drawElements;</p></div><div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div>  ...</blockquote></div>