Explorar el Código

Text.Graphviz. Initial Import.

Brucey hace 9 meses
padre
commit
56764dd06e
Se han modificado 100 ficheros con 32857 adiciones y 0 borrados
  1. 35 0
      graphviz.mod/builtins/dot_builtins.c
  2. 26 0
      graphviz.mod/common.bmx
  3. 21 0
      graphviz.mod/examples/example_01.bmx
  4. 13 0
      graphviz.mod/glue.c
  5. 254 0
      graphviz.mod/graphviz.bmx
  6. 23 0
      graphviz.mod/graphviz/AUTHORS
  7. 3038 0
      graphviz.mod/graphviz/CHANGELOG.md
  8. 227 0
      graphviz.mod/graphviz/COPYING
  9. 1 0
      graphviz.mod/graphviz/ChangeLog
  10. 2746 0
      graphviz.mod/graphviz/Doxyfile
  11. 2746 0
      graphviz.mod/graphviz/Doxyfile.in
  12. 368 0
      graphviz.mod/graphviz/INSTALL
  13. 59 0
      graphviz.mod/graphviz/Makefile.am
  14. 1222 0
      graphviz.mod/graphviz/Makefile.in
  15. 4 0
      graphviz.mod/graphviz/NEWS
  16. 4 0
      graphviz.mod/graphviz/README
  17. 1440 0
      graphviz.mod/graphviz/aclocal.m4
  18. 1 0
      graphviz.mod/graphviz/builddate.h
  19. 7 0
      graphviz.mod/graphviz/cmd/Makefile.am
  20. 807 0
      graphviz.mod/graphviz/cmd/Makefile.in
  21. 130 0
      graphviz.mod/graphviz/cmd/dot/Makefile.am
  22. 1279 0
      graphviz.mod/graphviz/cmd/dot/Makefile.in
  23. 741 0
      graphviz.mod/graphviz/cmd/dot/dot.1
  24. 109 0
      graphviz.mod/graphviz/cmd/dot/dot.c
  25. 55 0
      graphviz.mod/graphviz/cmd/dot/dot_builtins.cpp
  26. 97 0
      graphviz.mod/graphviz/cmd/dot/dot_sandbox
  27. 29 0
      graphviz.mod/graphviz/cmd/dot/dot_sandbox.1
  28. 13 0
      graphviz.mod/graphviz/cmd/dot/no_builtins.c
  29. 458 0
      graphviz.mod/graphviz/cmd/dot/osage.1
  30. 464 0
      graphviz.mod/graphviz/cmd/dot/patchwork.1
  31. 39 0
      graphviz.mod/graphviz/cmd/edgepaint/Makefile.am
  32. 1040 0
      graphviz.mod/graphviz/cmd/edgepaint/Makefile.in
  33. 71 0
      graphviz.mod/graphviz/cmd/edgepaint/edgepaint.1
  34. 290 0
      graphviz.mod/graphviz/cmd/edgepaint/edgepaintmain.c
  35. 83 0
      graphviz.mod/graphviz/cmd/gvedit/Makefile.am
  36. 1330 0
      graphviz.mod/graphviz/cmd/gvedit/Makefile.in
  37. 1505 0
      graphviz.mod/graphviz/cmd/gvedit/attrs.txt
  38. 573 0
      graphviz.mod/graphviz/cmd/gvedit/csettings.cpp
  39. 65 0
      graphviz.mod/graphviz/cmd/gvedit/csettings.h
  40. 39 0
      graphviz.mod/graphviz/cmd/gvedit/gvedit.1
  41. 24 0
      graphviz.mod/graphviz/cmd/gvedit/gvedit.pro.in
  42. 6 0
      graphviz.mod/graphviz/cmd/gvedit/images/Makefile.am
  43. 630 0
      graphviz.mod/graphviz/cmd/gvedit/images/Makefile.in
  44. BIN
      graphviz.mod/graphviz/cmd/gvedit/images/copy.png
  45. BIN
      graphviz.mod/graphviz/cmd/gvedit/images/cut.png
  46. BIN
      graphviz.mod/graphviz/cmd/gvedit/images/export.png
  47. BIN
      graphviz.mod/graphviz/cmd/gvedit/images/icon.png
  48. BIN
      graphviz.mod/graphviz/cmd/gvedit/images/new.png
  49. BIN
      graphviz.mod/graphviz/cmd/gvedit/images/open.png
  50. BIN
      graphviz.mod/graphviz/cmd/gvedit/images/paste.png
  51. BIN
      graphviz.mod/graphviz/cmd/gvedit/images/run.png
  52. BIN
      graphviz.mod/graphviz/cmd/gvedit/images/save.png
  53. BIN
      graphviz.mod/graphviz/cmd/gvedit/images/save_as.png
  54. BIN
      graphviz.mod/graphviz/cmd/gvedit/images/settings.png
  55. 216 0
      graphviz.mod/graphviz/cmd/gvedit/imageviewer.cpp
  56. 77 0
      graphviz.mod/graphviz/cmd/gvedit/imageviewer.h
  57. 110 0
      graphviz.mod/graphviz/cmd/gvedit/main.cpp
  58. 588 0
      graphviz.mod/graphviz/cmd/gvedit/mainwindow.cpp
  59. 109 0
      graphviz.mod/graphviz/cmd/gvedit/mainwindow.h
  60. 13 0
      graphviz.mod/graphviz/cmd/gvedit/mdi.qrc
  61. 157 0
      graphviz.mod/graphviz/cmd/gvedit/mdichild.cpp
  62. 56 0
      graphviz.mod/graphviz/cmd/gvedit/mdichild.h
  63. 5 0
      graphviz.mod/graphviz/cmd/gvedit/ui/Makefile.am
  64. 628 0
      graphviz.mod/graphviz/cmd/gvedit/ui/Makefile.in
  65. 552 0
      graphviz.mod/graphviz/cmd/gvedit/ui/settings.ui
  66. 54 0
      graphviz.mod/graphviz/cmd/gvmap/Makefile.am
  67. 1049 0
      graphviz.mod/graphviz/cmd/gvmap/Makefile.in
  68. 104 0
      graphviz.mod/graphviz/cmd/gvmap/cluster.1
  69. 131 0
      graphviz.mod/graphviz/cmd/gvmap/cluster.c
  70. 161 0
      graphviz.mod/graphviz/cmd/gvmap/country_graph_coloring.c
  71. 17 0
      graphviz.mod/graphviz/cmd/gvmap/country_graph_coloring.h
  72. 167 0
      graphviz.mod/graphviz/cmd/gvmap/gvmap.1
  73. 449 0
      graphviz.mod/graphviz/cmd/gvmap/gvmap.c
  74. 106 0
      graphviz.mod/graphviz/cmd/gvmap/gvmap.sh
  75. 101 0
      graphviz.mod/graphviz/cmd/gvmap/gvmap.sh.1
  76. 1433 0
      graphviz.mod/graphviz/cmd/gvmap/make_map.c
  77. 45 0
      graphviz.mod/graphviz/cmd/gvmap/make_map.h
  78. 94 0
      graphviz.mod/graphviz/cmd/gvmap/power.c
  79. 15 0
      graphviz.mod/graphviz/cmd/gvmap/power.h
  80. 50 0
      graphviz.mod/graphviz/cmd/gvpr/Makefile.am
  81. 1132 0
      graphviz.mod/graphviz/cmd/gvpr/Makefile.in
  82. 1195 0
      graphviz.mod/graphviz/cmd/gvpr/gvpr.1
  83. 108 0
      graphviz.mod/graphviz/cmd/gvpr/gvprmain.c
  84. 688 0
      graphviz.mod/graphviz/cmd/gvpr/lib/Makefile
  85. 12 0
      graphviz.mod/graphviz/cmd/gvpr/lib/Makefile.am
  86. 688 0
      graphviz.mod/graphviz/cmd/gvpr/lib/Makefile.in
  87. 20 0
      graphviz.mod/graphviz/cmd/gvpr/lib/addedges
  88. 36 0
      graphviz.mod/graphviz/cmd/gvpr/lib/addranks
  89. 56 0
      graphviz.mod/graphviz/cmd/gvpr/lib/addrings
  90. 31 0
      graphviz.mod/graphviz/cmd/gvpr/lib/anon
  91. 7 0
      graphviz.mod/graphviz/cmd/gvpr/lib/attr
  92. 39 0
      graphviz.mod/graphviz/cmd/gvpr/lib/bb
  93. 20 0
      graphviz.mod/graphviz/cmd/gvpr/lib/bbox
  94. 45 0
      graphviz.mod/graphviz/cmd/gvpr/lib/binduce
  95. 27 0
      graphviz.mod/graphviz/cmd/gvpr/lib/bipart
  96. 28 0
      graphviz.mod/graphviz/cmd/gvpr/lib/chkclusters
  97. 40 0
      graphviz.mod/graphviz/cmd/gvpr/lib/chkedges
  98. 8 0
      graphviz.mod/graphviz/cmd/gvpr/lib/cliptree
  99. 54 0
      graphviz.mod/graphviz/cmd/gvpr/lib/clustg
  100. 24 0
      graphviz.mod/graphviz/cmd/gvpr/lib/col

+ 35 - 0
graphviz.mod/builtins/dot_builtins.c

@@ -0,0 +1,35 @@
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gvplugin.h"
+
+extern gvplugin_library_t *gvplugin_dot_layout_LTX_library;
+extern gvplugin_library_t *gvplugin_neato_layout_LTX_library;
+#ifdef HAVE_LIBGD
+extern gvplugin_library_t *gvplugin_gd_LTX_library;
+#endif
+#ifdef HAVE_PANGOCAIRO
+extern gvplugin_library_t *gvplugin_pango_LTX_library;
+#endif
+#ifdef __APPLE__
+extern gvplugin_library_t *gvplugin_quartz_LTX_library;
+#endif
+extern gvplugin_library_t *gvplugin_core_LTX_library;
+
+lt_symlist_t lt_preloaded_symbols[] = {
+	{ "gvplugin_dot_layout_LTX_library", (void*)(&gvplugin_dot_layout_LTX_library) },
+	{ "gvplugin_neato_layout_LTX_library", (void*)(&gvplugin_neato_layout_LTX_library) },
+#ifdef HAVE_PANGOCAIRO
+	{ "gvplugin_pango_LTX_library", (void*)(&gvplugin_pango_LTX_library) },
+#endif
+#ifdef HAVE_LIBGD
+	{ "gvplugin_gd_LTX_library", (void*)(&gvplugin_gd_LTX_library) },
+#endif
+#ifdef __APPLE__
+	{ "gvplugin_quartz_LTX_library", (void*)(&gvplugin_quartz_LTX_library) },
+#endif
+	{ "gvplugin_core_LTX_library", (void*)(&gvplugin_core_LTX_library) },
+	{ 0, 0 }
+};

+ 26 - 0
graphviz.mod/common.bmx

@@ -0,0 +1,26 @@
+SuperStrict
+
+Import Text.Expat
+
+Import "source.bmx"
+
+Extern
+
+	Function gvContext:Byte Ptr()
+	Function bmx_gvc_new:Byte Ptr()
+	Function gvFreeContext(handle:Byte Ptr)
+
+
+	Function agmemread:Byte Ptr(text:Byte Ptr)
+	Function agisdirected:Int(g:Byte Ptr)
+	Function agisundirected:Int(g:Byte Ptr)
+	Function agisstrict:Int(g:Byte Ptr)
+	Function agissimple:Int(g:Byte Ptr)
+
+	Function bmx_graphviz_unflatten(g:Byte Ptr, doFans:Int, maxMinlen:Int, chainLimit:Int)
+
+	Function gvLayout:Int(gvc:Byte Ptr, g:Byte Ptr, layout:Byte Ptr)
+
+	Function gvRenderData:Int(gvc:Byte Ptr, g:Byte Ptr, format:Byte Ptr, data:Byte Ptr Ptr, length:UInt Var)
+	Function gvFreeRenderData(data:Byte Ptr)
+End Extern

+ 21 - 0
graphviz.mod/examples/example_01.bmx

@@ -0,0 +1,21 @@
+SuperStrict
+
+Framework brl.standardio
+Import text.graphviz
+
+Local gvc:TGVGraphviz = New TGVGraphviz
+
+Local dot:String = """
+	digraph G {Hello->World}
+	"""
+
+Local graph:TAGraph = TAGraph.FromString(dot)
+
+If graph
+	Local res:Int = gvc.Layout(graph, "dot")
+	Print "Layout result: " + res
+End If
+
+Local svg:String = gvc.ToSvg(graph)
+
+Print svg

+ 13 - 0
graphviz.mod/glue.c

@@ -0,0 +1,13 @@
+
+#include "config.h"
+#include "gvc/gvc.h"
+#include "cgraph/cgraph.h"
+
+GVC_t * bmx_gvc_new() {
+    return gvContextPlugins(lt_preloaded_symbols, 0);
+}
+
+void bmx_graphviz_unflatten(Agraph_t * g, int doFans, int maxMinlen, int chainLimit) {
+    graphviz_unflatten_options_t opts = {doFans, maxMinlen, chainLimit};
+    graphviz_unflatten(g, &opts);
+}

+ 254 - 0
graphviz.mod/graphviz.bmx

@@ -0,0 +1,254 @@
+SuperStrict
+
+Rem
+bbdoc: Text / Graphviz
+End Rem
+Module Text.Graphviz
+
+ModuleInfo "Version: 1.00"
+ModuleInfo "License: Eclipse Public License 1.0"
+ModuleInfo "Copyright: AT&T Research"
+ModuleInfo "Copyright: Wrapper - 2024 Bruce A Henderson"
+
+ModuleInfo "History: 1.00 Initial Release"
+ModuleInfo "History: Graphviz 12.2.1"
+
+Import "common.bmx"
+
+Rem
+bbdoc: A Graphviz context.
+about: 
+End Rem
+Type TGVGraphviz
+
+	Field gvcPtr:Byte Ptr
+
+	Method New()
+		gvcPtr = bmx_gvc_new()
+	End Method
+
+	Rem
+	bbdoc: Lays out the graph.
+	End Rem
+	Method Layout:Int(graph:TAGraph, layout:String)
+		Local res:Int = -1
+		If gvcPtr Then
+			Local t:Byte Ptr = layout.ToUtf8String()
+			res = gvLayout(gvcPtr, graph.graphPtr, t)
+			MemFree(t)
+		End If
+		Return res
+	End Method
+
+	Rem
+	bbdoc: Converts the graph to SVG.
+	End Rem
+	Method ToSvg:String(graph:TAGraph)
+		Return RenderToString(graph, "svg")
+	End Method
+
+	Rem
+	bbdoc: Produces output in the DOT language.
+	about: It reproduces the input, along with layout information for the graph. In particular, a bb attribute is attached to the graph,
+	specifying the bounding box of the drawing. If the graph has a label, its position is specified by the lp attribute.
+
+	Each node gets pos, width and the record rectangles are given in the rects attribute. If the node is a polygon and the vertices
+	attribute is defined, this attribute contains the vertices of the node.
+
+	Every edge is assigned a pos attribute, and if the edge has a label, the label position is given in lp.
+	End Rem
+	Method ToDot:String(graph:TAGraph)
+		Return RenderToString(graph, "dot")
+	End Method
+
+	Rem
+	bbdoc: Produces output in the DOT language.
+	about: It extends the @dot format by providing much more detailed information about how graph components are drawn.
+	It relies on additional attributes for nodes, edges and graphs.
+	End Rem
+	Method ToXDot:String(graph:TAGraph)
+		Return RenderToString(graph, "xdot")
+	End Method
+
+	Rem
+	bbdoc: Produces a pretty printed version of the input, with no layout performed.
+	End Rem
+	Method Prettify:String(graph:TAGraph)
+		Return RenderToString(graph, "canon")
+	End Method
+
+	Rem
+	bbdoc: Produces output in JSON format that contains the same information produced by #ToDot
+	about: Assumes the graph has been processed by one of the layout algorithms.
+	End Rem
+	Method ToJson0:String(graph:TAGraph)
+		Return RenderToString(graph, "json0")
+	End Method
+
+	Rem
+	bbdoc: Produces output in JSON format that contains the same information produced by #ToXDot
+	about: Assumes the graph has been processed by one of the layout algorithms.
+	End Rem
+	Method ToJson:String(graph:TAGraph)
+		Return RenderToString(graph, "json")
+	End Method
+
+	Rem
+	bbdoc: Produces JSON output similar to #ToJson0, except it only uses the content of the graph on input.
+	about: Does not assume that the graph has been processed by any layout algorithm, and the only xdot information appearing in the
+	output was in the original input file.
+	End Rem
+	Method ToDotJson:String(graph:TAGraph)
+		Return RenderToString(graph, "dot_json")
+	End Method
+
+	Rem
+	bbdoc: Produces JSON output similar to #ToJson, except it only uses the content of the graph on input.
+	about: Does not assume that the graph has been processed by any layout algorithm, and the only xdot information appearing in the
+	output was in the original input file.
+	End Rem
+	Method ToXDotJson:String(graph:TAGraph)
+		Return RenderToString(graph, "xdot_json")
+	End Method
+
+	Rem
+	bbdoc: Produces output using a simple, line-based language.
+	End Rem
+	Method ToPlain:String(graph:TAGraph)
+		Return RenderToString(graph, "plain")
+	End Method
+
+	Rem
+	bbdoc: Produces output using a simple, line-based language.
+	about: On edges, it also provides port names on head and tail nodes when applicable.
+	see https://graphviz.org/docs/outputs/plain/
+	End Rem
+	Method ToPlainExt:String(graph:TAGraph)
+		Return RenderToString(graph, "plain-ext")
+	End Method
+
+	Rem
+	bbdoc: Produces output in the form of a text string.
+	about: The output is in the format specified by @format.
+
+	Note that this method assumes the specified format is a text-based format.
+	End Rem
+	Method RenderToString:String(graph:TAGraph, format:String)
+		Local res:Int
+		If gvcPtr Then
+			Local s:Byte Ptr
+			Local length:UInt
+			Local t:Byte Ptr = format.ToUtf8String()
+			res = gvRenderData(gvcPtr, graph.graphPtr, t, Varptr s, length)
+			MemFree(t)
+
+			If res <> 0 Then
+				Return Null
+			End If
+
+			Local render:String = String.FromUTF8Bytes(s, length)
+
+			gvFreeRenderData(s)
+
+			Return render
+		End If
+
+		Return Null
+	End Method
+
+	Rem
+	bbdoc: Frees the context.
+	End Rem
+	Method Free()
+		If gvcPtr
+			gvFreeContext(gvcPtr)
+			gvcPtr = Null
+		End If
+	End Method
+
+	Method Delete()
+		Free()
+	End Method
+
+End Type
+
+Rem
+bbdoc: A Graphviz graph.
+about: A graph is the fundamental data structure representing a set of nodes 
+and the connections (edges) between them. It may be directed or undirected, and 
+can contain attributes that influence layout, style, and labeling. In addition to 
+nodes and edges, graphs can also include subgraphs and clusters to group related 
+elements, helping to produce clear and visually informative diagrams when rendered 
+by Graphviz.
+End Rem
+Type TAGraph
+
+	Field graphPtr:Byte Ptr
+
+	Rem
+	bbdoc: Creates a new graph from a string.
+	about: @text is the string representation of the graph.
+	End Rem
+	Function FromString:TAGraph(text:String)
+		Local g:TAGraph = New TAGraph
+		Local t:Byte Ptr = text.ToUtf8String()
+		g.graphPtr = agmemread(t)
+		MemFree(t)
+		If Not g.graphPtr Then
+			Return Null
+		End If
+		Return g
+	End Function
+
+	Rem
+	bbdoc: Returns #True if the graph is directed.
+	End Rem
+	Method IsDirected:Int()
+		If graphPtr
+			Return agisdirected(graphPtr)
+		End If
+		Return False
+	End Method
+
+	Rem
+	bbdoc: Returns #True if the graph is undirected.
+	End Rem
+	Method IsUndirected:Int()
+		If graphPtr
+			Return agisundirected(graphPtr)
+		End If
+		Return False
+	End Method
+
+	Rem
+	bbdoc: Returns #True if the graph is a strict graph.
+	End Rem
+	Method IsStrict:Int()
+		If graphPtr
+			Return agisstrict(graphPtr)
+		End If
+		Return False
+	End Method
+
+	Rem
+	bbdoc: Returns #True if the graph is strict with no loops.
+	End Rem
+	Method IsSimple:Int()
+		If graphPtr
+			Return agissimple(graphPtr)
+		End If
+		Return False
+	End Method
+
+	Rem
+	bbdoc: Used to improve the aspect ratio of graphs having many leaves or disconnected nodes.
+	about: The usual layout for such a graph is generally very wide or tall.
+	Unflatten inserts invisible edges or adjusts the minlen on edges to improve layout compaction.
+	End Rem
+	Method Unflatten(maxMinlen:Int = 0, doFans:Int = False, chainLimit:Int = 0)
+		If graphPtr
+			bmx_graphviz_unflatten(graphPtr, doFans, maxMinlen, chainLimit)
+		End If
+	End Method
+
+End Type

+ 23 - 0
graphviz.mod/graphviz/AUTHORS

@@ -0,0 +1,23 @@
+Primary contact. Please submit patches or enhancements to
+https://gitlab.com/graphviz/graphviz
+
+---------------
+Primary Authors: (In alphabetical order.)
+
+    John Ellson  <[email protected]>
+    Emden Gansner <[email protected]>
+    Yifan Hu <[email protected]>
+    Stephen North <[email protected]>
+
+Auxiliary Authors: (In alphabetical order.)
+
+    Don Caldwell <[email protected]>
+    David Dobkin <[email protected]>
+    Tim Dwyer <[email protected]>
+    Eleftherios Koutsofios <[email protected]>
+    Kiem-Phong Vo <[email protected]>
+    Gordon Woodhull <[email protected]>
+
+---------------
+
+See https://graphviz.org/credits/ for further information.

+ 3038 - 0
graphviz.mod/graphviz/CHANGELOG.md

@@ -0,0 +1,3038 @@
+# Changelog
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [12.2.1] – 2024-12-07
+
+### Added
+
+- Support for building the SWIG-generated R language bindings has been
+  integrated into the CMake build system. This is controllable by the
+  `-DENABLE_R={AUTO|ON|OFF}` option.
+- A sandboxing wrapper, `dot_sandbox`, is now included with Graphviz. Users
+  should prefer their platform’s native security solutions, but if nothing
+  better is available this wrapper offers safe processing of untrusted inputs in
+  some scenarios.
+
+### Changed
+
+- JPEG images without an `APP0` leading segment are supported for use in `src`
+  fields and friends. Previously Graphviz was overly strict with the types of
+  JPEGs it would recognize. #2619
+
+### Fixed
+
+- The GVPR library program `depath` no longer acts on previously deleted nodes,
+  causing unpredictable results. #1702
+- Void-typed function parameters (`int foo(void bar)`) and variables `void baz;`
+  in GVPR are gracefully rejected. #2585
+- Input that induce a set node height but no set node width no longer crash with
+  the failure “Assertion failed: `(r->boundary[i] <= r->boundary[NUMDIMS + i])`,
+  function RTreeInsert”. It is typically not obvious to users when their input
+  falls into this situation, hence why the assertion message is quoted here.
+  This was a regression in Graphviz 12.0.0. #2613
+- Strings containing double quote characters preceded by escape sequences (e.g.
+  `\n"`) are once again correctly escaped in dot or canonical output. This was a
+  regression in Graphviz 9.0.0. #2614
+- `dot_builtins` no longer lists duplicate format options in its error messages.
+  #2604
+- A precision error that resulted in truncated edge lines has been corrected.
+  This was a regression in Graphviz 12.0.0. #2620
+- The xlib plugin (`-Tx11`) resets its initialization state during finalization.
+  This fixes a rare scenario where multiple input graphs are supplied and
+  initialization for one of the not-first graphs fails. In this scenario,
+  finalization would be unaware of this failure and act on invalid state.
+
+## [12.2.0] – 2024-11-04
+
+### Removed
+
+- Visual Studio build files have been removed. CMake is now the only supported
+  build system on Windows.
+
+### Added
+
+- Support for building the SWIG-generated PHP language bindings has been
+  integrated into the CMake build system. This is controllable by the
+  `-DENABLE_PHP={AUTO|ON|OFF}` option.
+- Support for building the SWIG-generated Python language bindings has been
+  integrated into the CMake build system. This is controllable by the
+  `-DENABLE_PYTHON={AUTO|ON|OFF}` option.
+
+### Changed
+
+- An algorithm closer to that described in RFC 1942 and/or the CSS 2.1
+  specification is now used for sizing table cells within HTML-like labels. This
+  is less scalable than the network simplex algorithm it replaces, but in
+  general produces more intuitive results. #2159
+- Tooltips on table elements within HTML-like labels are now propagated to SVGs
+  produced by the core plugin (`-Tsvg`) even when the elements do not have
+  `href` attributes. #1425
+- In the Autotools build system, `pkg-config` is the only supported way for
+  discovering Guile. Previous use of `guile-config*` has been removed. #2606
+- The Autotools release artifacts for macOS (`Darwin_*_graphviz-*.tar.gz`) now
+  use relative paths in links to dependent libraries and plugins. This should
+  make the tree relocatable instead of having to live at /Users/gitlab/builds.
+  #2501
+- `gml2gv` no longer maps GML `label` attributes to Graphviz `name` attributes.
+  These are now mapped to Graphviz `label` attributes. #2586
+
+### Fixed
+
+- In the Autotools build system, the core plugin links against libm, fixing some
+  unresolvable symbols. This was a regression in Graphviz 4.0.0. Though it would
+  primarily have affected non-Graphviz applications attempting to load this
+  plugin on Linux.
+- The osage layout engine now understands a cluster to be indicated by the
+  common rules, including the “cluster” prefix being case insensitive and the
+  `cluster=true` attribute as an alternative. #2187
+- `acyclic` once again produces its output on stdout. This was a regression in
+  Graphviz 10.0.1. #2600
+- When using the Tclpathplan module, created vgpanes can once again be named and
+  addressed. This was a regression in Graphviz 12.1.2.
+- Omitting a polygon identifier when running triangulation using the Tclpathplan
+  module (e.g. `vgpane0 triangulate` instead of `vgpane0 triangulate 42`) no
+  longer goes unnoticed and reads invalid memory. This bug seems to have existed
+  since the first revision of Graphviz.
+- When using the Tclpathplan module, defining a malformed &lt;3-point polygon
+  and then attempting to triangulate this polygon no longer reads invalid
+  memory. This case is now rejected with an error during triangulation. Like the
+  previous entry, this bug seems to have existed since the first revision of
+  Graphviz.
+- When using the Tclpathplan module, binding a pane’s triangulation callback to
+  a string ending in a trailing `%` (e.g. `vgpane0 bind triangle %`) no longer
+  causes later out-of-bounds reads during triangulation. Like the previous
+  entries, this bug seems to have existed since the first revision of Graphviz.
+  #2596
+- Mouse right-clicks in Smyrna are no longer sticky. In some contexts,
+  right-clicking the mouse would register a mouse down event but no mouse up
+  event, leading Smyrna to believe the user was dragging with the right button
+  held down.
+- Arrowhead missing from tail-end of edge #2437
+- The Ruby bindings package (libgv-ruby) is once again installable on Ubuntu.
+  This became uninstallable when Ruby 1.8 was no longer available on Ubuntu, as
+  it had a hard coded dependency of Ruby 1.8. This has now been relaxed to
+  depend on any Ruby version ≥ 1.8. #2607
+- Generated GIFs and JPEGs display the graphed image instead of a single solid
+  color. This was a regression in Graphviz 12.1.1. #2609
+- The CMake build system includes some supporting pieces of the SWIG-generated
+  language bindings that were previously missing. It also links further
+  dependencies that were previously missing.
+- In the CMake build system, linking of the Guile language bindings uses the
+  full path to libguile, fixing issues on macOS.
+- The provided release packages for Debian-based operating systems (only Ubuntu
+  currently) have corrected package dependencies. #2466
+- Discussion of `gvpr -c ""` in the `gvpr` man page has been removed. This
+  invocation did not do what was claimed. #2584
+
+## [12.1.2] – 2024-09-28
+
+### Changed
+
+- In the Autotools build system, the rsvg plugin is no longer built when
+  pangocairo is missing. Previously, when librsvg was found but pangocairo was
+  not, this plugin would be enabled and built but offer no functionality.
+- The RSVG plugin now requires librsvg ≥ 2.42.7.
+- The RSVG plugin uses newer librsvg APIs where available. #2206
+
+### Fixed
+
+- In the Autotools build system, fallback discovery of libANN when `pkg-config`
+  support is unavailable has been corrected to properly enable use of libANN.
+  This primarily affects `mingle` users on Debian-based operating systems or
+  macOS.
+- The RSVG plugin no longer dereferences a null pointer when failing to create
+  new RSVG handles.
+- The Pango plugin no longer assumes a little endian environment when loading PS
+  images.
+- Deleting a “vgpane” when using the Tclpathplan module no longer frees an
+  invalid pointer. This bug appears to have existed since the first revision of
+  Graphviz. That is, deleting a “vgpane” has always crashed the TCL interpreter
+  or silently corrupted the heap prior to this release.
+
+## [12.1.1] – 2024-09-09
+
+### Added
+
+- Support for building the SWIG-generated Guile language bindings has been
+  integrated into the CMake build system. This is controllable by the
+  `-DENABLE_GUILE={AUTO|ON|OFF}` option.
+- Support for building the SWIG-generated Java language bindings has been
+  integrated into the CMake build system. This is controllable by the
+  `-DENABLE_JAVA={AUTO|ON|OFF}` option.
+- Support for building the SWIG-generated Lua language bindings has been
+  integrated into the CMake build system. This is controllable by the
+  `-DENABLE_LUA={AUTO|ON|OFF}` option.
+- Support for building the SWIG-generated Perl language bindings has been
+  integrated into the CMake build system. This is controllable by the
+  `-DENABLE_PERL={AUTO|ON|OFF}` option.
+
+### Changed
+
+- Comparison against a plugin’s `knowncolors` array is now case-insensitive,
+  rather than requiring all entries of the array to be lower-cased. The
+  requirement that the `knowncolors` array is lexically ordered remains.
+- The Smyrna “Color Theme”, “Edge Attr. For Color”, and “Node Alpha” settings
+  have been removed. The values of these settings had no effect.
+- Graphviz libraries set close-on-exec on job output files being written and
+  user shape files being read. This should only affect applications using
+  Graphviz libraries that rely on a fork-and-exec-ed child subprocess being able
+  to access these open files. Applications with this requirement can regain the
+  old behavior by unsetting the close-on-exec flag immediately after creating
+  these objects. Graphviz libraries themselves are not affected by whether or
+  not this flag is set.
+- The Autotools build system no longer detects or uses the `-perl` option to
+  SWIG to build Perl language bindings. Only `-perl5` is used.
+
+### Fixed
+
+- A reference to the non-existent `colxlate` function in an error message has
+  been corrected to `colorxlate`.
+- `gvgen` no longer crashes sometimes when running random graph generation. This
+  was a regression in Graphviz 12.0.0. #2588
+- Dashed and dotted pen styles in VRML images loaded by the GD plugin have been
+  corrected.
+- `mm2gv` no longer crashes when reading various types of malformed Matrix
+  Market files.
+- The `edgepaint` `--color_scheme` command-line option is once again functional.
+  This was a regression in Graphviz 2.49.0. #2591
+- An incorrect deallocation call during OpenGL texture construction failure has
+  been corrected. This could previously have caused crashes or heap corruption.
+  This was a regression in Graphviz 2.26.0.
+- The CMake build on Windows no longer fails if TCL is detected. This was
+  technically a regression in 12.0.0 since building the Graphviz TCL bindings
+  was integrated into the CMake build system in that release. #2581
+- When its output file cannot be opened, `edgepaint` no longer dereferences a
+  null pointer when printing its error message.
+
+## [12.1.0] – 2024-08-12
+
+### Added
+
+- Enable the GNU Triangulated Surface Library (GTS) in Windows builds. #2557
+- `dot_builtins` now also includes the vt plugin (`-Tvt` output format).
+- The vt plugin gained new output formats, `-Tvt-4up`, `-Tvt-6up`, and
+  `-Tvt-8up`, for drawing monochrome 4-, 6-, and 8-pixel-per-character
+  visualizations, respectively.
+- The CMake build system now includes the WebP plugin also on Windows.
+- A Windows x64 `mingle` binary is now built with CMake.
+- Support for building the SWIG-generated D language bindings has been
+  integrated into the CMake build system. This is controllable by the
+  `-DENABLE_D={AUTO|ON|OFF}` option.
+- Support for building the SWIG-generated Go language bindings has been
+  integrated into the CMake build system. This is controllable by the
+  `-DENABLE_GO={AUTO|ON|OFF}` option. The target integer size can be set with
+  `-DINTGOSIZE=…` if it is not auto-detected correctly.
+- Support for building the SWIG-generated JavaScript language bindings has been
+  integrated into the CMake build system. This is controllable by the
+  `-DENABLE_JAVASCRIPT={AUTO|ON|OFF}` option.
+
+### Changed
+
+- The GTK plugin, for which build system support was removed in Graphviz 10.0.1,
+  has been removed from the portable source tarball. #1848
+- To build from source, the required C++ standard has been upgraded from C++11
+  to C++17. #2536
+- **Breaking**: the CMake variables `enable_ltdl`, `with_expat`, `with_gvedit`,
+  `with_smyrna`, `with_zlib`, `enable_tcl`, `enable_swig` and `enable_sharp`
+  have been renamed  to `ENABLE_LTDL`, `WITH_EXPAT`, `WITH_GVEDIT`,
+  `WITH_SMYRNA`, `WITH_ZLIB`, `ENABLE_TCL`, `ENABLE_SWIG` and `ENABLE_SHARP`,
+  respectively.
+- To build from source, the required Python version has been upgraded from 3.6
+  to 3.8. #2549
+- Build system discovery of GDK now looks for GDK 3.0 instead of GDK 2.0. #1848
+- Visual Studio build files are no longer distributed in the portable source
+  tarball. Builds on Windows must now use a repository clone.
+
+### Fixed
+
+- `ccomps`, `gc`, the fdp layout engine, the neato layout engine, and the
+  patchwork algorithm now understand a cluster to be indicated by the common
+  rules, including the “cluster” prefix being case insensitive and the
+  `cluster=true` attribute as an alternative. #2187
+- `overlap` values whose prefixes are themselves valid values (e.g.
+  `overlap=scalexy` where `overlap=scale` is also a valid setting) are once
+  again usable. Previously such values would silently select the shortest valid
+  prefix. This was a regression in Graphviz 2.24.0. #2563
+- Setting `overlap=ortho_xy` no longer also runs the constraint pass of
+  `overlap=porthoxy`. Setting `overlap=ortho` no longer also runs the constraint
+  passes of `overlap=ortho_xy` and `ortho=porthoxy`. This bug has existed ever
+  since these overlap modes were introduced in Graphviz 2.4. However its effect
+  was masked by the bug discussed in the prior CHANGELOG entry that made it not
+  possible to select `overlap=ortho_xy` or `overlap=porthoxy`.
+- `splines = true` merging multiedges together when using the neato engine.
+  #2241 (fixed on Windows by enabling GTS)
+- The GVC output writing APIs handle writes of compressed data `> UINT_MAX` more
+  correctly.
+- GVPR casts of strings to floats now produce the expected values. This was a
+  regression in Graphviz 2.30.
+- CMake builds do not support format png:gd #1786
+- The diffimg utility is not built in CMake builds #1788 (fixed also for
+  Windows x64 builds)
+- The Windows x86 `mingle` binary built with CMake no longer fails to start
+  because of missing `ANN.dll`.
+- The node and edge tags printed by the TK output format (`-Ttk`) are once again
+  usable for later referencing those same nodes and edges in TCL scripting. This
+  was likely broken in the transition from 32-bit to 64-bit hardware. #2568
+- Ubuntu 24.04 binaries incorrectly are ASan enabled and produce memory leak
+  errors. #2574
+- gvpr’s ability to handle empty string parameters to `printf` (e.g.
+  `printf("hello%s world", "")`) has been restored. This was a regression in
+  Graphviz 9.0.0. #2577
+- pkgIndex.tcl for the TCL bindings is constructed based on target system
+  properties instead of host system properties. Previously, cross-compilation
+  would result in potentially incorrect library loading directives in this file.
+- The Autotools build system no longer checks for the presence of php.h, which
+  previously caused spurious failures when trying to build the PHP bindings with
+  PHP 8.3. #2589
+- A `gvmap` crash due to out-of-bounds memory writes has been fixed. This was a
+  regression in Graphviz 8.0.1.
+
+## [12.0.0] – 2024-07-04
+
+### Added
+
+- Support for building the Graphviz TCL bindings has been integrated into the
+  CMake build system. This is controllable by the `-Denable_tcl={AUTO|ON|OFF}`
+  option.
+- Support for building the SWIG-generated TCL language bindings has been
+  integrated into the CMake build system. This is controllable by the
+  `-Denable_swig={AUTO|ON|OFF}` option.
+- Support for building the SWIG-generated C# language bindings has been
+  integrated into the CMake build system. This is controllable by the
+  `-Denable_sharp={AUTO|ON|OFF}` option.
+
+### Changed
+
+- The Catch2-based test suite in the CMake build system has been ported from
+  Catch2 v2 to Catch2 v3. Support for Catch2 v2 has been removed. #2465
+- The Windows release artifacts are now built on Windows 2022 and Visual Studio
+  2022 17 and toolset v143.
+- The macOS release artifacts are now built on macOS 13 (Ventura).
+- The CMake build system no longer links `dot_builtins` against libsocket.
+- The CMake build system now only compiles `dot_builtins` if building shared
+  libraries (`-DBUILD_SHARED_LIBS=ON`).
+- **Breaking**: the `polygon_t.style` member is now a struct.
+- **Breaking**: the `LEN` and `MAXDOUBLE` constants have been removed.
+- Accuracy in processing compass points has been improved.
+- **Breaking**: the `CMYK_BYTE` member of the `color_type_t` enum and the
+  corresponding `gvolor_t.u.cmyk` field have been removed. The color format this
+  mapped to was neither documented nor implemented correctly.
+- The Windows releases available for download on graphviz.org now only include
+  CMake-produced packages, not MS Build-produced packages. The MS Build packages
+  are available in the
+  [Gitlab package registry](https://gitlab.com/graphviz/graphviz/-/packages) if
+  needed.
+- The CMake build system more pervasively sets rpaths of compiled binaries,
+  libraries, and plugins, which should result in them more reliably finding
+  their supporting components.
+  without `$LD_LIBRARY_PATH`/`$DYLD_LIBRARY_PATH` tricks.
+- **Breaking**: the `Agraph_t.n_id` field is now an opaque pointer.
+- **Breaking**: the libpack functions `putGraphs`, `putRects`, and `shiftGraphs`
+  now operate on floating-point points (`pointf`) instead of integer points
+  (`point`).
+- **Breaking**: the `BF2B` macro has been removed.
+- **Breaking**: the undocumented `-Tmp` output format has been removed.
+- **Breaking**: the arith.h header defines neither `_GNU_SOURCE` nor `sincos`
+  any more. None of the build systems attempt to discover `sincos` any more.
+- The FIG output format (`-Tfig`) supports up to 512 custom colors. The previous
+  limit was 256, after which it would crash (see note in the “Fixed” section).
+- **Breaking**: The TCL binding’s `tcldot_layout` function no longer tries to
+  fallback to the `dot` layout engine if the requested engine is unavailable but
+  instead fails with an error message.
+- The TCL binding’s graph `render` command no longer ignores layout errors.
+- The TCL binding’s graph `write` command now does layout unconditionally,
+  regardless of what output renderer is selected.
+- The CMake build system builds cgraph++ and gvc++ as either shared or static
+  libraries, respecting the `BUILD_SHARED_LIBS` setting.
+- Discovery of the fcntl.h header has been removed from all build systems. This
+  header is now unconditionally assumed to exist.
+- **Breaking**: `obj_state_t.gradient_frac` is now a `double`.
+- **Breaking**: `path.nbox` is now a `size_t`.
+- The change described as “Some `routesplines` miscalculations that led to lost
+  edges and fatal errors have been avoided” in 11.0.0 has been reverted. The fix
+  for this caused other problems.
+- **Breaking**: the `d` and `disc` parameters have been removed from
+  `Dtcompar_f`.
+- CentOS packages are no longer provided.
+- In the CMake build system, the minimum required CMake version has been
+  increased to 3.14.1.
+- **Breaking**: the `disc` parameter has been removed from `Dtfree_f`.
+- Gvedit no longer depends on the getopt library.
+
+### Fixed
+
+- The CMake build system now uses absolute paths to PangoCairo libraries during
+  linking, resolving build problems on macOS.
+- The CMake build system’s path for third-party headers for the DevIL plugin has
+  been corrected.
+- Edges not rendering properly when using ports and the `crow` arrowhead/tail
+  with Windows `Release` builds. #2490
+- A duplicate prototype of `aghtmlstr` has been removed.
+- `agrelabel_node` (or equivalently, `agrename` when operating on a node) no
+  longer corrupts the node-by-id set, causing a crash. This bug was preventing
+  `gxl2gv` from processing inputs that used node `name` attributes. #2300
+- Accuracy improvements have fixed an assertion failure on macOS. #2538
+- The FIG output format (`-Tfig`) no longer crashes when handling more than 256
+  colors.
+- The `scale` operation implemented by the TCL binding’s tclpathplan scales
+  relative to the center of the points being scaled instead of reading
+  uninitialized memory.
+- The xlib plugin sets “close-on-exec” on the file descriptors it creates,
+  preventing them leaking into either web browsers it starts or other processes
+  created by the hosting application.
+- A sign confusion issue in neatogen’s weighting calculations was fixed. This
+  was a regression in Graphviz 11.0.0.
+- The CMake build system no longer attaches `dllimport`/`dllexport` annotations
+  when compiling static libraries on Windows and MinGW.
+- An issue with linking gvpack when building static libraries in the CMake build
+  system was fixed.
+- An sfdp use-after-free issue was fixed. #2556
+- Using `concentrate=true` once again works. This was a regression in Graphviz
+  11.0.0. #2559
+- `overlap="scale"` no longer causes nodes to be placed on top of one another.
+  This was a regression in Graphviz 7.0.5. #2564
+- libpack code now understands a cluster to be indicated by the common rules,
+  including the “cluster” prefix being case insensitive and the `cluster=true`
+  attribute as an alternative. #2187, #2555
+
+## [11.0.0] – 2024-04-28
+
+### Added
+
+- `gv2gml` gained a `-y` option to output the yWorks.com variant of GML instead
+  of the default.
+- A new command line option, `--filepath=…` has been added to perform the
+  function previously served by the `$GV_FILE_PATH` environment variable, use of
+  which was removed in Graphviz 6.0.1. Unlike the old `$GV_FILE_PATH` mechanism,
+  `--filepath=…` takes effect regardless of the setting of the `$SERVER_NAME`
+  environment variable. #2396
+
+### Changed
+
+- `gvpack`, in addition to recognizing a “cluster” name prefix as a mark of a
+  cluster, now recognizes this case insensitively as well as recognizing the
+  `cluster` attribute. This is more consistent with how the Graphviz libraries
+  work.
+- **Breaking**: `pkg-config` (.pc) files shipped with Graphviz now include
+  `${prefix}/include` in the include path in addition to
+  `${prefix}/include/graphviz`. Previously this missing path meant building
+  Graphviz demo examples against an installation of Graphviz in a non-system
+  path would not work. #2474
+- The core PostScript output format (`-Tps`) warns if using an
+  out-of-specification font name. To avoid this, use a more sophisticated output
+  format like Cairo (`-Tps:cairo`) that does font name lookup and translation.
+  #218
+- **Breaking**: The libpack functions `putRects`, `packRects`, `putGraphs`,
+  `packGraphs`, `packSubgraphs`, `pack_graph`, `shiftGraphs`, `ccomps`,
+  `cccomps`, and `pccomps` now take the number of items they are operating on
+  (`ng`) as a `size_t`.
+- **Breaking**: The `bsearch_cmpf` and `qsort_cmpf` typedefs have been removed.
+- `dot -c -v`, when constructing the config6 file, includes comments explaining
+  any attempted actions that failed during plugin loading. #2456
+- **Breaking**: The `Ndim` global is now a `unsigned short`.
+- fdpgen no longer truncates graph names when inferring new names for connected
+  component subgraphs.
+- **Breaking**: The `nodequeue` type has been removed.
+- **Breaking**: The field `Agraphinfo_t.n_nodes` has been removed. The function
+  `agnnodes` is a more robust way of retrieving the number of nodes.
+- The `-q` command line option will now suppress “no hard-coded metrics…”
+  and other font lookup warnings. #2379
+- **Breaking**: The `CMP` and `SGN` macros have been removed.
+- The CMake build system no longer early-binds all enabled plugins into
+  `dot`/`dot.exe`. This early binding was a change introduced in 10.0.1, but was
+  not noted in this changelog. Traditionally, of the three Graphviz build
+  systems (Autotools, CMake, MS Build), only changes to the Autotools build
+  system were noted in this changelog under the assumption that packaging
+  ecosystems making use of the other two build systems would need finer grained
+  details and would be monitoring the Git commit history instead. This seems to
+  not be the case, so in future side-effecting changes to any of the three build
+  systems will be included here. #2527, #2528
+- The precision of `sep`- and `esep`-based calculations has been improved.
+- **Breaking**: Defines `AGRAPH`, `AGNODE`, `AGOUTEDGE`, `AGINEDGE`, and `AGEDGE` are
+  replaced with `enum`.
+- **Breaking**: The `obj_state_t.url_bsplinemap_poly_n` field is now a `size_t`
+  and the `obj_state_t.url_bsplinemap_n` field is now a `size_t *`.
+- **Breaking**: The `Ppoly_t.pn` (`Ppolyline_t.pn`) field is now a `size_t`.
+- **Breaking**: The `Proutespline` function takes its `n_barriers` parameter as
+  a `size_t`.
+- **Breaking**: The `gvattr_t` type and the `GVJ_t.selected_obj_attributes` and
+  `GVJ_t.selected_obj_type_name` fields have been removed.
+- **Breaking**: The `gv_argvlist_t` type and functions that operate on it have
+  been removed.
+- Control characters in some error messages are escaped, preventing certain
+  types of text injection that could cause user confusion.
+- **Breaking**: `GVJ_t.numkeys` is a `size_t`.
+
+### Fixed
+
+- Indexing within `gvNextInputGraph` no longer incorrectly retains the index
+  from prior use of the GVC context. When using Graphviz libraries
+  programmatically, this could previously cause crashes or misbehavior. #2484
+- Color schemes, typically controlled through the `colorscheme` attribute are
+  now pushed and popped as they are applied and released. Previously processing
+  multiple graphs wherein the first uses color schemes but later ones do not
+  could result in color schemes being incorrectly retained and reapplied or
+  use-after-free memory accesses.
+- The GDI+ plugin, when asked to render a graphic metafile, no longer references
+  uninitialized memory. This bug was introduced in Graphviz 2.24.0.
+- A `free` of an invalid pointer in `edgepaint` was fixed. #2513
+- `gvmap` no longer references uninitialized variables when trying to process
+  triangles and encountering only 2 points.
+- Using the `point` shape in combination with `peripheries=0` no longer causes
+  out of bounds memory writes. This was a regression in Graphviz 7.0.0. #2497
+- Unsafe use of a dangling pointer in `ccomps` has been removed. This was a
+  regression in Graphviz 7.1.0.
+- `gvcolor` no longer crashes when processing color names longer than 127
+  characters.
+- Interleaving calls to `colorxlate` and `gvrender_resolve_color` no longer
+  confuse internal caching mechanisms. Callers should now get the correct color
+  back.
+- The `nop2` layout engine provided by the neato layout plugin is now equivalent
+  to `neato -n2` as intended instead of mistakenly being equivalent to
+  `nop`/`nop1`/`neato -n1`.
+- An off-by-one error in rank installation was corrected. Previously, an unusual
+  `rank=same` constraint could cause a crash when installing ranks. #1308
+- `gxl2gv` no longer crashes or misbehaves when symlinked to a non-ASCII file
+  name. This is a rare scenario that normal users should not encounter.
+- `mm2gv` no longer crashes or misbehaves when reading malformed Matrix Market
+  files with non-ASCII bytes in the header.
+- A stack buffer overflow in `mm2gv` when processing malformed Matrix Market
+  files has been fixed.
+- The `newrank` attribute is treated as a boolean instead of any value
+  (including `"false"`) being coerced into `"true"`. #2521
+- Crashes and misbehavior no longer occur when the `sides` attribute contains
+  non-ASCII characters.
+- Graphviz binaries like `dot.exe` and `neato.exe` no longer crash or misbehave
+  when symlinked to a non-ASCII file name on Windows. This is a rare scenario
+  that normal users should not encounter.
+- GVPR programs that use `tolower` or `toupper` on strings containing non-ASCII
+  characters no longer crash. These functions do not lowercase/uppercase
+  non-ASCII characters, so users probably still do not want to use non-ASCII
+  strings in a GVPR program.
+- Some `routesplines` miscalculations that led to lost edges and fatal errors
+  have been avoided. #2368
+- An inaccuracy involving an edge case when constructing lines within libpack
+  has been corrected.
+- A bug in the internal heap implementation used in the network simplex
+  algorithm has been corrected. This would previously cause certain runs to
+  infer incorrect ordering or subtrees. This was a regression in Graphviz
+  2.40.0. #2391, #2529
+- Compass points may be more accurately placed on the node boundary in some cases.
+- A very small random adjustment in the calculation of the space available for
+  edge routing around ellipse shaped nodes in fdp and neato layouts, has been
+  removed.
+- Incorrect edge splines for ellipse shaped nodes with ports using fdp or
+  neato. #2168
+- Incorrect edge splines for ellipse and polygon shaped nodes with ports and
+  large penwidths using fdp or neato, causing the same symptoms as #2168.
+- Incorrect edge splines for polygon shaped nodes with ports more than one
+  periphery using fdp or neato, causing the same symptoms as #2168.
+- Adjust the space available for edge routing based on penwidth when
+  using fdp or neato and `splines=ortho`.
+- Setting "mindist" graph attribute for circo layout causes GraphViz library to
+  crash with "access violation in cgraph.dll" on gvLayout (checked for Windows
+  only). #2356
+
+## [10.0.1] – 2024-02-11
+
+### Added
+
+- Releases now include packages for [Rocky Linux](https://rockylinux.org/) 8 and
+  9.
+- A new output format, `-Tsvg_inline`, has been added to generate a header-less
+  SVG suitable for inlining into HTML. #2285
+- The functionality of the `acyclic`, `tred` and `unflatten` command line tools
+  are now exposed via the `graphviz_acyclic`, `graphviz_tred` and
+  `graphviz_unflatten` API functions in libcgraph. #2194
+- `graphviz_node_induce` is available as a new API function in cgraph.h.
+- `tred` gained a `-o` command line option to redirect its output to a file.
+
+### Changed
+
+- The Criterion unit tests have been removed and migrated to Pytest. This is
+  primarily relevant to downstream packagers of Graphviz. #2443
+- **Breaking**: `Dtdisc_t.memoryf` and its associated macros has been removed.
+- **Breaking**: The `Dt_t.type` field has been removed.
+- **Breaking**: The `dtfound`, `DT_FOUND`, `dtleast`, and `dtmost` macros have
+  been removed.
+- The nrtmain.c test program has been removed from the portable tarball.
+- The TCL Graphviz packages for inter-release versions/snapshots report
+  themselves as `<next release>b<internal number>` instead of
+  `<next release>~dev.<internal number>`. This fixes a problem wherein TCL would
+  see `~dev` as being invalid characters to appear in a version. #2370
+- Support for discovering Lua via `lua-config*` has been removed from the
+  Autotools build system.
+- Lua discovery in the Autotools build system should now respect the location of
+  your Lua installation and not unconditionally attempt installation into
+  `/usr`. #2152
+- The GTK plugin is no longer built or distributed. This plugin relies on GTK 2
+  and X11. If you use this plugin, please contact the maintainers to let
+  them know it is worthwhile re-enabling this and forward porting it to GTK 3/4
+  and Wayland. #1848
+- In the Autotools build system, `LIBPOSTFIX=` can now be used to suppress `64`
+  being appended to the library installation path.
+- The `-m` command line option, whose functionality was disabled in Graphviz
+  3.0.0, has been removed.
+- Man page typography has been slightly improved.
+- macOS release artifacts no longer include `vimdot`. This may be restored in
+  future. #2423
+- macOS release artifacts no longer include `smyrna`. This may be restored in
+  future. #2422
+- The PDF output format, `-Tpdf`, respects the environment variable
+  `$SOURCE_DATE_EPOCH` for overriding `CreationDate` when built against Cairo
+  ≥ 1.16.0. #2473
+- The legacy C# viewer app is no longer distributed in the portable source
+  tarball.
+- Graphviz headers no longer define the `FALSE` and `TRUE` constants.
+- The Autotools build system no longer supports Darwin 9 (Mac OSX Leopard).
+- **Breaking**: `Agraph_t.link` has been split into `Agraph_t.id_link` and
+  `Agraph_t.seq_link`. `Agraph_t.g_dict` has been split into `Agraph_t.g_id`
+  and `Agraph_t.g_seq`.
+- **Breaking**: `gvpropts.n_outgraphs` is now a `size_t`.
+- The OCaml bindings have been removed. If you use these bindings, please contact
+  the maintainers to notify them of the existence of users.
+- **Breaking**: `polygon_t.sides` and `polygon_t.peripheries` are now `size_t`s.
+- **Breaking**: liblab_gamut is no longer included in a Graphviz installation.
+  This library had no accompanying header, so using it was not easy. If you are
+  using this library, please contact the maintainers to notify them of the
+  existence of users. #2489
+- **Breaking**: `bezier.size` and `splines.size` are now `size_t`s.
+- **Breaking**: the gv.i and gv.cpp SWIG inputs are no longer included in a
+  Graphviz installation. #2491
+- **Breaking**: the `gvrender_engine_t.beziercurve`,
+  `gvrender_engine_t.library_shape`, `gvrender_engine_t.polygon`,  and
+  `gvrender_engine_t.polyline` callbacks now take the number of points, `n`, as
+  a `size_t`.
+- **Breaking**: the `AVG` macro has been removed.
+- **Breaking**: the `inside_t.s` union member gained members `lastn`, `radius`,
+  `last_poly`, `last`, `outp`, `scalex`, `scaley`, `box_URx`, and `box_URy`.
+  Zero initialize these when you construct instances of this type. #2498
+
+### Fixed
+
+- The paper size for Doxygen docs generation in the Autotools build system has
+  been corrected to `a4`.
+- References to `eventf` and `hashf` data structures in the libcdt man page
+  have been removed. These data structures were removed in Graphviz 9.0.0.
+- References to `DTOFFSET` in the libcdt man page have been removed. This macro
+  was removed in Graphviz 2.40.0.
+- A number of further updates to the libcdt man page have been made to reflect
+  other changes that happened in Graphviz 9.0.0.
+- Use of the non-portable `PATH_MAX` constant has been removed. This was a
+  regression in Graphviz 7.0.1. In addition to fixing the regression, code has
+  been adjusted to remove assumptions on the maximum path length and treat it as
+  unbounded. #2452
+- Compilation on NetBSD has been repaired. This was a regression in Graphviz
+  9.0.0.
+- Compilation on SunOS has been repaired. This appears to have been broken since
+  the xlib plugin was added some time prior to Graphviz 2.38.0.
+- gvpr programs that attempt to close out of range file descriptors no longer
+  cause out of bounds memory accesses.
+- When large edge weights are used that cause an integer overflow when summing
+  them up, Graphviz now gracefully exits with an error message instead of
+  crashing. #2450
+- Support for the `%n` specifier in `scanf` in gvpr has been restored. This was
+  a regression in Graphviz 9.0.0. #2454
+- In the Autotools build system, `make dist` now processes cmd/gvedit correctly
+  when Qt is not installed. Generating Qt “mocables” is postponed from configure
+  time to build time. #2463
+- The Autotools build system correctly detects Ruby headers, even when
+  pkg-config support is unavailable. #2464
+- Escaped characters in xdot fields no longer lead to the containing text being
+  truncated. #2460
+- When building against a libgd that is configured with `!gif && (jpeg || png)`,
+  the GD plugin is once again compilable. This was a regression in Graphviz
+  2.46.0.
+- edgepaint spline intersection code would previously incorrectly use the second
+  spline in one instance where it should have used the first. #1464
+- In the Autotools build, libexpat discovery on macOS has been improved. #2477
+- A bug that caused compound edges to sometimes be drawn in the wrong direction
+  has been corrected. This was a regression in Graphviz 8.0.3. #2478
+- When operating on multiple graphs, `unflatten` no longer retains chain node
+  and size internal state across graphs.
+- Repeated runs of a graph with subgraphs now produce a stable subgraph
+  ordering. #2242
+- The `dot` and `gml2gv` tools are now built with case-insensitive parsing
+  by the CMake and MSBuild systems, as they always were by autotools, and
+  in accordance with the graphviz specification. #2481
+- Putting nodes in a subgraph no longer causes their layout order to be
+  reversed. #1585
+- Edges are no longer lost when using subgraphs and record shapes in
+  combination. #1624
+- A malformed config6 file that leads to plugin search failing no longer causes
+  out-of-bounds memory reads. This now causes an error message and graceful
+  failure. #2441
+- Discovery of `php` in the Autotools build system has been improved.
+- Text in the PIC output format is no longer forced to font size 1. This was a
+  regression in Graphviz 8.0.2. Even with this fix, the PIC output format is
+  limited in its utility. #2487
+- When encountering a syntactically invalid HTML-like label, Graphviz.app no
+  longer aborts. The abort was an intentional change in Graphviz 8.0.1 to avoid
+  invalid memory reads in `dot`, but had the undesirable side effect of the
+  graphical Graphviz.app exiting with no obvious cause. #2488
+- Use of an uninitialized variable in `poly_inside` has been corrected. #2498
+- Input containing UTF-8 data that is destined to appear as-is in the output
+  (e.g. UTF-8 characters in a label when using the `-Tdot` output format) is
+  once again processed correctly. On platforms with a signed `char` this could
+  previously crash. This was a regression in Graphviz 2.49.0. #2502
+
+## [9.0.0] - 2023-09-11
+
+### Added
+
+- On non-Windows platforms, new `-Tkitty` and `-Tkittyz` output formats are
+  available that render to the Kitty terminal emulator’s graphvics protocol.
+- HTML/CSS-style 3 letter hex colors are supported. Each R/G/B letter is
+  duplicated to form a 6 letter hex color. E.g. `#09c` is equivalent to
+  `#0099cc`. #2377
+
+### Changed
+
+- **Breaking**: The definition of `adjmatrix_t` is no longer exposed in public
+  headers.
+- **Breaking**: The upper limit for minimum edge length (`Agedgeinfo_t.minlen`)
+  has been expanded from `USHRT_MAX` to `INT_MAX`. #2413
+- **Breaking**: The libcdt macros `DTTREEMATCH`, `DTTREESEARCH`, `dtvnext`,
+  `dtvcount`, `dtvhere`, and `dtcharhash` have been removed.
+- **Breaking**: The libcgraph macros `AGHEADPOINTER`, `AGRIGHTPOINTER`,
+  `AGLEFTPOINTER`, `FIRSTNREF`, `NEXTNREF`, `PREVNREF`, `LASTNREF`, `NODEOF`,
+  `FIRSTOUTREF`, `LASTOUTREF`, `FIRSTINREF`, `NEXTEREF`, and `PREVEREF` have
+  been removed.
+- **Breaking**: The libcgraph types `Agnoderef_t` and `Agedgeref_t` have been
+  removed.
+- **Breaking**: The libcgraph function `agflatten` has been removed.
+- **Breaking**: The `Agdesc_s.flatlock` field has been removed.
+- **Breaking**: The `str` parameter from `gvPluginList` has been removed.
+- **Breaking**: The definition of the `elist_append` and `alloc_elist` macros
+  have been changed to use newer allocation functions. Users were/are not
+  expected to call these macros.
+- The functions `ageqedge`, `agtail`, `aghead`, `agopp`, `agmkout`, and `agmkin`
+  have been reintroduced. These were previously removed in Graphviz 3.0.0. #2433
+- **Breaking**: The first parameter `dt` to the `makef` and `freef` callbacks
+  defined in cdt.h has been removed.
+- Gvedit now identifies itself with organization name “Graphviz” and application
+  name “gvedit” when reading and writing Qt-based settings. It would previously
+  use organization name “Trolltech” and application name “MDI Example”. If you
+  have existing settings under the old identification, Gvedit will attempt to
+  migrate them to the new identification the first time it reads then writes
+  settings. #2383
+- **Breaking**: `gvprintf` is now tagged with
+  `__attribute__((format(printf, …)))` when compiling with Clang or GCC. This
+  enables the compiler to spot more misuses of this function. #2373
+- **Breaking**: The `hashf` and `eventf` members of `Dtdisc_t` have been
+  removed. Correspondingly, the `hshf` and `evf` parameters to the `DTDISC`
+  macro have been removed. Also the `_DTHSH` macro has been removed.
+- **Breaking**: The `Dtdata_t.minp` field has been removed.
+- The print functionality of the macOS Graphviz app scales the graph to fit the
+  output page size.
+- **Breaking**: The libcdt containers `Dtbag`, `Dthash`, `Dtlist`, `Dtorder`,
+  `Dtdeque`, and `Dtstack` have been removed.
+- **Breaking**: The libcdt `dtappend` and `dtattach`  macros have been removed.
+- Support for Lua 5.0 has been removed. Building the Graphviz Lua bindings now
+  requires Lua ≥ 5.1.
+- **Breaking**: The `Dt_t*` parameter to the callback for `dtwalk` has been
+  removed.
+- **Breaking**: The `POINTS_PER_PC` macro has been removed.
+- **Breaking**: The `INITIAL_XDOT_CAPACITY` macro has been removed.
+- **Breaking**: The `type` parameter to `dtdisc` has been removed.
+- **Breaking**: The `h` parameter to `dtstrhash` has been removed.
+- In addition to Guile 2.0 and Guile 2.2, Guile 3.0 is now supported by the
+  Graphviz Guile bindings.
+- **Breaking**: The concept of “memory allocator discipline” has been removed,
+  along with the type `Agmemdisc_t` and fields `Agdisc_t.mem` and
+  `Agdstate_t.mem`.
+- **Breaking**: The `agcallbacks` function and `Agclos_t.callbacks_enabled` have
+  been removed.
+- **Breaking**: `pack_info.doSplines` is now a C99 `bool`. Correspondingly, the
+  `doSplines` parameter to `shiftGraphs` is now a C99 `bool`.
+
+### Fixed
+
+- Processing large graphs that induce ranks containing more than 46340
+  (`floor(√INT_MAX)`) nodes no longer results in an integer overflow during
+  crossing matrix allocation. Ranks of up to `floor(√SIZE_MAX)` nodes are now
+  supported.
+- Double arrow head types like `invdot` and `onormalonormal` once again display
+  correctly. This was a regression in Graphviz 8.0.1. #2406
+- The `lvee` and `rvee` edge arrow shapes are slighty incorrect for
+  penwidths &gt; 1. #2399
+- Small gap between `lcurve` or `rcurve` arrow shaft and node. #2426
+- Failure of arrowhead and arrowtail to respect penwidth #372 \
+  Fixed also for the `normal` and `inv`
+  [edge arrow shapes](https://graphviz.org/doc/info/arrows.html)
+  when using the `l` or `r`
+  [arrow shape modifiers](https://graphviz.org/doc/info/arrows.html#shape-modifiers). \
+  Slightly improved for the `normal` and `inv`
+  [edge arrow shapes](https://graphviz.org/doc/info/arrows.html)
+  when not using any
+  [arrow shape modifier](https://graphviz.org/doc/info/arrows.html#shape-modifiers). \
+  Fixed also for the `crow` and `vee`
+  [edge arrow shapes](https://graphviz.org/doc/info/arrows.html#primitive-shapes)
+  and [record based nodes](https://graphviz.org/doc/info/shapes.html#record).
+- Various incorrect calls to `gvprintf` have been corrected. On some platforms
+  like x86-64, these problems were benign thanks to coincidences in the
+  Application Binary Interface (ABI). On other platforms, these problems may
+  have caused stack corruption and crashes. #2373
+- The font dictionary is now initialized even if a configuration file is not
+  found. Previously this situation could lead to a crash when using Graphviz
+  programmatically. This problem was present as least as far back as Graphviz
+  2.38.0. #1520
+- **Breaking**: The `vt100` output format has been renamed to `vt`. This fixes a
+  problem where it was not discoverable on macOS. #2429
+- Escape sequences like `\"` are recognized in strings and double escaping
+  (producing `\\"`) is avoided. #2397
+- The Autotools build system no longer uses headers and libraries from the
+  `--prefix` path given on the command line. This previously caused
+  cross-compilation to incorrectly pick up host headers and libraries. #2442
+
+## [8.1.0] – 2023-07-06
+
+### Added
+
+- On non-Windows platforms, new `-Tvt100` and `-Tvt100-24bit` output formats are
+  available that do rudimentary rendering to a terminal that supports ANSI
+  escape sequences.
+- Some notes about the interaction with wide-oriented streams were added to the
+  cgraph man page.
+
+### Changed
+
+- When memory allocation failures cause Graphviz to exit, information about the
+  failing allocation is included in the error message.
+
+### Fixed
+
+- Failure of arrowhead and arrowtail to respect penwidth #372 \
+  Fixed also for the `curve` and `icurve`
+  [edge arrow shapes](https://graphviz.org/doc/info/arrows.html#primitive-shapes).
+- Iteration calculations based on `nslimit` and/or `nslimit1` attributes are
+  clamped to `[0, INT_MAX]`. That is, calculations that result in a negative
+  number of iterations are rounded up to `0` and those that result in a number
+  of iterations that exceeds `INT_MAX` are rounded down to `INT_MAX`. Iteration
+  numbers outside this range do not have useful behavior, but could be caused
+  unintentionally by users.
+- Setting `xdotversion` attributes that parse as greater than 17 (`xdotversion`
+  is parsed as a series of digits, ignoring all non-digits) no longer causes an
+  out of bounds read when rendering to xdot. #2390
+- Icon size in the macOS Graphviz.app has been fixed so icons are no longer
+  invisible.
+- Compiling the portable source tarball on a machine with SWIG ≥ 4.1.0 no
+  longer fails due to missing PHP files. #2388
+- Syntax for a loop in `gvmap.sh` has been corrected. This was a regression in
+  Graphviz 2.50.0. #2404
+
+## [8.0.5] – 2023-04-30
+
+### Changed
+
+- Support for versions of Pango prior to 1.22.0 has been removed.
+- On Windows, the Pango plugin now uses the newer `pango_layout_get_baseline`
+  API.
+- `dot` no longer installs a signal handler for `SIGINT`. This means typing
+  Ctrl+C while `dot` is running will no longer attempt a partial render and exit
+  with 0 status. Ctrl+C will have the standard behavior, typically aborting
+  `dot`.
+
+### Fixed
+
+- A minor inaccuracy for some cases of clipping an edge to a polygon node
+  boundary has been fixed.
+- A minor inaccuracy in node width and height for some cases of rendering
+  polygon nodes has been fixed.
+- A minor inaccuracy for some cases of calculating text height from `fontsize`
+  in the GD plugin has been fixed.
+- A minor vertical misalignment of text in the GD plugin has been fixed.
+- Instead of using the actual font height as given by the font metrics, an
+  approximation based on font size was used in the Pango plugin.
+- A minor inaccuracy for some cases of calculating text width and height in the
+  Pango plugin has been fixed.
+- A minor vertical misalignment of text in the Pango plugin has been fixed.
+- Ensure `HAVE_PANGOCAIRO` is set when using CMake and the library is available.
+- A minor inaccuracy in node width and height for some cases of defining
+  polygon-based nodes has been fixed.
+- A minor inaccuracy for some cases of calculating margin for record-based nodes
+  has been fixed.
+- A minor inaccuracy in node width and height for some cases of defining
+  record-based nodes has been fixed.
+- On all known supported platforms except 32-bit MinGW, graphs involving small
+  distance constraints no longer cause a crash during majorization. #1554
+
+## [8.0.3] – 2023-04-16
+
+### Added
+
+- A pre-processor script for resolving external image references
+  (`image="http…"`) is now available. This enables graphs to reference images
+  from intranet or internet locations. #1664
+
+### Changed
+
+- The accuracy of box overlapping checks during routing has been improved.
+
+### Fixed
+
+- makeCompoundEdge: Assertion `bez->sflag` failed. #1879
+- Graphviz.app’s export functionality has been restored. This was a regression
+  in Graphviz 5.0.0. #2375
+
+## [8.0.2] – 2023-04-10
+
+### Changed
+
+- The Autotools build system can now detect a MacPorts-installed libANN. #1854
+- Support for versions of Cairo prior to 1.10 has been removed.
+- Graphs that generate rectangles with areas in the range [2³², 2⁶⁴ - 1]
+  are now supported. Previously areas greater than 2³² - 1 would be
+  rejected. #2371
+
+### Fixed
+
+- Head and tail of `digraph` edges with `dir = both` were inverted if
+  `splines = ortho` was used. The bug was only exposed on straight edges.
+  Edges with at least one corner were unaffected. #144
+- `_Gdtclft_Init` link errors when builting libtcldot_builtin using the
+  Autotools build system have been resolved. #2365
+- Incorrect string construction in the `pov` output formatter has been fixed.
+
+## [8.0.1] – 2023-03-27
+
+### Added
+
+- When specifying a color in HSV format, it is now possible to give an
+  additional fourth component for the alpha channel (opacity). #510
+
+### Changed
+
+- Graphviz will now exit when encountering a syntactically invalid HTML label
+  instead of attempting to recover and continue. #1311
+- **Breaking**: the `url_map_n` field in the `obj_state_t` struct is now a
+  `size_t`.
+- The limit of 5 unique `samehead` or `sametail` values per node has been
+  removed. The maximum number of unique `samehead` or `sametail` values is now
+  limited only by available memory. #452
+- **Breaking**: The `size` field of the `elist` struct is now a `size_t`.
+- **Breaking**: The `size` field of the `nlist` struct is now a `size_t`.
+- **Breaking**: The `n_nodes` field of the `Agraphinfo_t` struct is now a
+  `size_t`.
+- **Breaking**: The `nspans` field of `textlabel_t.u.txt` is now a `size_t`.
+- **Breaking**: The `sflag` and `eflag` fields of the `bezier` struct are now
+  `uint32_t`s.
+- **Breaking**: The `nvertices` field of the `stroke_t` struct is now a
+  `size_t`.
+- “no hard-coded metrics” warnings are now only printed once per font.
+- The Autotools build system now discovers Python paths using `sysconfig`
+  instead of `distutils.sysconfig`, making it compatible with Python 3.12. This
+  alters the installation path of the Python Graphviz module to something more
+  correct. #2332
+
+### Fixed
+
+- The `pic` output renderer uses PIC or troff comments where appropriate, fixing
+  a problem that resulted in comments being misinterpreted by `groff` and being
+  visible in the final output. #2341
+- `gv2gxl` and `gxl2gv` correctly detect their mode (gv→gxl or gxl→gv) on
+  Windows when called via an absolute or relative path. #2344
+- Using C pre-processor line directives (`^\s*#(line )?\d+`) claiming a line
+  number greater than `INT_MAX` no longer causes an integer overflow. #1318
+- fdp cluster→cluster edges were correct but now drawn incorrectly. This was a
+  regression in Graphviz 7.0.0. #2345
+- Failure of arrowhead and arrowtail to respect penwidth #372 \
+  Fixed also for the `cylinder`
+  [node shape](https://graphviz.org/doc/info/shapes.html#polygon).
+- Second periphery of a cylinder shaped node is not correct. #2297
+- Graphs with more than 127 layers no longer cause out of bound writes. #2355
+- htmltable.c assertions are no longer triggered by using HTML table cells too
+  small to fit their content. #1622
+- `dot2gxl -d` no longer crashes when receiving a closing `node` tag following a
+  closing `graph` tag. #2094
+- A buffer overflow in Smyrna when loading GVPR scripts has been corrected.
+- A buffer overflow when loading a plugin with a long type string has been
+  corrected.
+- Graphs that involve more than 2000 stroke points during tapering calculations
+  no longer cause out of bounds writes.
+- Using `arrowsize=0.0` no longer triggers an assertion failure or crash during
+  miter calculations. This was a regression in Graphviz 7.0.0. #2342
+- When using the `beautify=true` attribute, beautification no longer confuses
+  leaves and dimensions. This previously could have led to skipping calculations
+  or infinite loops.
+- When using the `beautify=true` attribute, the first and last nodes around a
+  circular layout are no longer placed on top of each other. #2283
+- Applying `concentrate=true` to duplicate edges no longer results in errors due
+  to non-normal edges being found. #2087
+- `splines=ortho` and `concentrate=true` when used in combination no longer
+  causes crashes during spline construction. #2361
+- Externally referenced SVG files with their opening `<svg` tag on the same line
+  as their XML declaration are no longer ignored. #2352
+
+### Removed
+
+- The VML output renderer has been removed. This format has been superseded by
+  SVG. #799
+- Legacy man page references to `dotty` have been removed. `dotty` was removed
+  in Graphviz 4.0.0.
+- **Breaking**: The definition of the `elist_fastapp` macro has been removed.
+- Versions of Librsvg prior to 2.36.0 are no longer supported.
+- Versions of GDK prior to 2.0.0 are no longer supported.
+- Versions of Glib prior to 2.36.0 are no longer supported.
+- **Breaking**: The `Agnodeinfo_t.inleaf` field and its `ND_inleaf` accessor
+  have been removed.
+- **Breaking**: The `Agnodeinfo_t.outleaf` field and its `ND_outleaf` and
+  `GD_outleaf` accessors have been removed.
+- **Breaking**: The `Agraphinfo_t.has_sourcerank` field and its
+  `GD_has_sourcerank` accessor has been removed.
+- **Breaking**: The `Agraphinfo_t.has_sinkrank` field and its
+  `GD_has_sinkrank` accessor has been removed.
+- Support for the legacy Microsoft Visio VDX format has been removed.
+- **Breaking**: The `arrow_at_start` and `arrow_at_end` parameters from the
+  `gvrender_engine_t.beziercurve` callback have been removed.
+- **Breaking**: The `GVRENDER_DOES_ARROWS` constant has been removed.
+- The extra cmpnd.c code is no longer shipped in the Graphviz distribution
+  tarball.
+- **Breaking**: The `STROKE_CLOSED`, `STROKE_FILLED`, `STROKE_PENDOWN`, and
+  `STROKE_VERTICES_ALLOCATED` constants have been removed.
+- **Breaking**: The `stoke_t.flags` field has been removed.
+
+## [7.1.0] – 2023-01-21
+
+### Added
+
+- The command line option `--help` has been added as an alias for `-?`. #1618
+- The command line option `--version` has been added as an alias for `-V`. #1618
+
+### Fixed
+
+- The Autotools build system no longer errors when attempting libANN discovery
+  during cross-compilation. This was a regression in Graphviz 7.0.6. #2335
+- Graphs with more than 46341 (⌈√INT_MAX⌉) nodes no longer crash `twopi`. #1999
+- Compatibility with `/bin/sh` has been restored in the Autotools build system.
+  This was a regression in Graphviz 7.0.6. This restores the ability to compile
+  on NetBSD which was fixed in 7.0.4 but regressed in 7.0.6. #2340
+- `ccomps` no longer crashes when failing to open files.
+
+## [7.0.6] – 2023-01-06
+
+### Changed
+
+- The Autotools build system no longer looks for `python` binaries. The Python
+  interpreter is unconditionally assumed to be `python3`. The configure option
+  `--enable-python` is now an alias for `--enable-python3`.
+- The Autotools and CMake build systems, when building `gvedit`, will now look
+  for and use Qt6 in preference over Qt5. #2233
+- Reserved stack size on Windows for the `dot.exe` binary has been increased
+  from ~3.8MB to 32MB. #1710
+- Reserved stack size on macOS for the `dot` binary when built with CMake has
+  been increased from 8MB to 32MB. #1710
+- The Autotools build system can now find libANN on Debian-based operating
+  systems, enabling compilation of libmingle and `mingle`. #1835
+- The `webdot` web server interface to Graphviz has been removed. For a modern
+  replacement, see for example https://github.com/magjac/d3-graphviz. #1131
+
+### Fixed
+
+- The modgraph.php example no longer includes gv.php, which is no longer
+  generated by SWIG 4.1.0. #2322
+
+## [7.0.5] – 2022-12-23
+
+### Fixed
+
+- Using `style` attributes in excess of 128 bytes and/or 63 individual styles no
+  longer results in out-of-bounds memory accesses. #2325
+
+## [7.0.4] – 2022-12-03
+
+### Fixed
+
+- The `alt` attributes are once again set in the cmap output. This was a
+  regression in Graphviz 7.0.2, that intentionally removed these but did not
+  account for the W3C specification making these attributes required when the
+  `href` attribute is set. #265, #2319
+- Building Graphviz from source using the Autotools build system in now possible
+  on NetBSD. #2317
+- The ortho library now allocates trapezoid structures on-demand, removing the
+  “Trapezoid-table overflow” error that previously occurred when its upfront
+  estimation was exceeded. #56, #1880
+
+## [7.0.3] – 2022-11-26
+
+### Changed
+
+* Support for the Intel C Compiler in the Autotools build system has been
+  removed. #2298
+* Fallback typedefs for `ssize_t` have been removed from the CMake build system.
+
+### Fixed
+
+- The CMake build system no longer builds auxiliary tools beyond `gvpack` with
+  demand loading disabled.
+- `gvpack` built with the CMake build system can now find plugins correctly at
+  run time. #1838
+
+## [7.0.2] – 2022-11-18
+
+### Added
+
+- The `cluster`, `dot_builtins`, `dot2gxl`, `gv2gxl`, `gvedit`, and `prune`
+  utilities are now included in the CMake build system. #1753, #1836
+
+### Changed
+
+- `gvedit` now uses a relative path from its own executable to discover its
+  attributes file, `../share/graphviz/gvedit/attrs.txt`. This should make it
+  more relocatable and make its behavior more consistent across operating
+  systems.
+- `alt` tags are no longer set in the cmap output. #265
+
+### Fixed
+
+- `gxl2gv`, when dealing with `name` attributes, may be less likely to crash. We
+  say “may be less likely” because a bug remains that makes a crash still
+  the most likely outcome. #2300
+- Gradient URL references in SVG output once again align with their targets
+  (linear or radial gradients) when `id` attributes are in use. This was
+  arguably a regression in Graphviz 6.0.1. #2307
+- The CMake build system’s interactions with a Zlib installed in a non-system
+  location has been improved.
+- Do not try to install `gv.php` if using SWIG-4.1.0. Graphviz 7.0.1 changes
+  listed SWIG 4.1.0 as supported, but there was an oversight that is fixed in
+  7.0.2. Complete #2277, #2303
+- Several compilation errors when building Smyrna on macOS have been fixed. This
+  was a regression in Graphviz 7.0.1.
+- A crash when using neato layout with large inferred per-node edge counts was
+  fixed. #42
+
+## [7.0.1] – 2022-11-09
+
+### Added
+
+- SWIG 4.1.0 is now supported in the Autotools build system. #2277, #2303
+
+### Changed
+
+- When built with zlib support, Graphviz will unconditionally use
+  `deflateBound`. The only user-visible effect should be slightly decreased
+  memory usage when using a zlib-compressed output format.
+- The test suite only detects Graphviz companion programs adjacent to the first
+  `dot` found in `$PATH` #2201
+
+### Fixed
+
+- Failure of arrowhead and arrowtail to respect penwidth #372 \
+  Fixed also for the `diamond` and `tee`
+  [edge arrow shapes](https://graphviz.org/doc/info/arrows.html#primitive-shapes).
+- The CMake build system no longer uses the final install location as the
+  staging area for example graphs and templates during `cpack`. This bug was
+  introduced in Graphviz 4.0.0. #2232
+- The CMake build system uses corrected paths to DevIL and FreeType headers and
+  libraries when discovered.
+- The CMake build system under MinGW no longer attempts to install third party
+  Expat and Getopt libraries.
+
+## [7.0.0] – 2022-10-22
+
+### Changed
+
+- **Breaking**: An `outline_width` field has been added to the `Agnodeinfo_t`
+  struct.
+- **Breaking**: An `outline_height` field has been added to the `Agnodeinfo_t`
+  struct.
+- When using the CMake build system, the minimum requirement has been increased
+  from CMake 3.9 to CMake 3.13.0.
+- When compiling Graphviz with the Intel C Compiler, the Autotools build system
+  no longer suppresses `-ffast-math`. Users relying on this are encouraged to
+  investigate what in their build environment is appending a flag their C
+  compiler does not support.
+- The `-ffast-math` compiler flag is no longer enabled by the Autotools build
+  system.
+- Reserved stack size on Windows for the `dot.exe` binary has been increased
+  from the default 1MB to ~3.8MB.
+
+### Fixed
+
+- Issues with GCC 8, `-O3` and `-ffast-math` #1412
+- Problem building Graphviz-5.0.1: undefined symbols `__*_finite` #2296
+- Failure of arrowhead and arrowtail to respect penwidth #372 \
+  Fixed for all
+  [polygon-based node shapes](https://graphviz.org/doc/info/shapes.html#polygon)
+  (except for the `cylinder` node shape) and for the
+  [edge arrow shapes](https://graphviz.org/doc/info/arrows.html)
+  `normal`, `inv`, `box` and `dot`
+
+### Removed
+
+- Support for the MOSEK commercial solver has been removed. The `MOSEK`
+  build-time macro no longer does anything.
+
+## [6.0.2] - 2022-10-11
+
+### Fixed
+
+- Using `aspect` with a custom value in the `packmode` attribute is no longer
+  misparsed.
+- Smyrna bounding box computation has been corrected. There was a regression in
+  4.0.0 that resulted in a degenerate bounding box being computed for any input
+  graph. See #2279 for details.
+- Smyrna warnings about the `on_attrRB0_clicked` and `on_attrSearchBtn_clicked`
+  handlers being not found have been fixed and the buttons to which they are
+  wired should be functional again. This was a regression in 2.50.0 See #2279
+  for details.
+- Smyrna warnings about the `mAttributesSlot` handler being not found have been
+  fixed and the button to which it is wired should be functional again. This was
+  a regression in 2.49.2 See #2279 for details.
+- Graphviz no longer fails to load private Ghostscript symbols ("Could not load
+  `libgvplugin_gs.so.6`) #2280
+- trailing commas issue with fdp layout #2282
+- Missing `-S` in `sccmap` man page usage summary.
+- In `sccmap`, a `-v` option following a `-S` option now re-enables strongly
+  connected component output that the man page implied.
+
+## [6.0.1] – 2022-09-11
+
+### Changed
+
+- **Breaking**: libxdot fields for the size and number of operations, the
+  statistics counts, and polygon line points are now `size_t` values instead of
+  `int` values
+- Accuracy of the bounding boxes printed by the `showboxes` feature have been
+  improved.
+
+### Fixed
+
+- Id attribute is not used in linearGradient. #2258
+- Graphviz 5.0.1 undocumented change of automatically generated output filename
+  with -O flag (missing dot separator). This was a regression in 5.0.1. #2270
+- Assert fail in `aaglex` for multiple calls to `agmemread`. This was a
+  regression in 5.0.1. #2272
+
+### Removed
+
+- The `$GV_FILE_PATH` sandboxing mechanism has been removed #2257
+
+## [5.0.1] – 2022-08-20
+
+### Fixed
+
+- -Tx11: Assertion `xev.xbutton.button >= 1 && xev.xbutton.button <= 5 && "Xlib
+  returned invalid button event"` failed #2256
+- missing Perl includes patch #2262
+- smyrna: incorrect tokenization in frmobjectui.c:set_attr_object_type #2259
+- [Dot] Record shape+UTF+" | "=Eats spaces. #925
+- Memory leak in osage
+- Segmentation fault when running test example neatopack.c #1800
+- Memory leak in dot when using clusters
+- Memory leak in patchwork when using clusters
+- Subgraph layout and rendering
+- Generated SVG files no longer use `transparent` paint or color as this keyword
+  does not exist in SVG 1.1, and instead use `none` or a zero-opacity color.
+- Unnecessary space in 'points' attribute for 'polyline' in SVG output
+- `graphml2gv` no longer calls itself `cvtgxl` in error messages
+
+### Added
+ - GVContext::version() to lib/gvc++
+ - GVContext::buildDate() to lib/gvc++
+
+## [5.0.0] – 2022-07-07
+
+### Changed
+
+- `use_sanitizers` option has been removed from the CMake build system.
+
+### Fixed
+
+- **Breaking**: The 4.0.0 change replacing the `Agiodisc_t` struct member
+  `putstr` by `printf` has been reverted
+- graphviz-4.0.0: build error: cmd/tools/gvcolor.c:159: undefined reference to
+  `fmax` #2246
+- Failed assertion in `chkSgraph` for twopi layout and ortho splines. #14
+- Failed assertion in `chkSgraph` for dot layout and ortho splines. #1408
+- Failed assertion in `chkSgraph` for circo layout and ortho splines. #1990
+- Segmentation Fault with splines="ortho". #1658
+- Transparent Label appear in SVG output #146
+- Binary tcl modules should compile with -module #1285
+- b15.gv crashes dot #827
+- heap overflow in function startElementHandler in gxl2gv.c #2093
+- Crash on assertion #121
+- `xdotversion` attribute is no longer misparsed. This was a regression in
+  Graphviz 2.47.2. #358
+
+## [4.0.0] – 2022-05-29
+
+### Changed
+
+- **Breaking**: The `mark` field of the `Agnodeinfo_t` struct is now a
+  `size_t` instead of a `char`.
+- **Breaking**: The unused `shape_t` struct has been removed from the public
+  header `types.h`
+- **Breaking**: The `Agiodisc_t` struct member `putstr` that was previously an
+  `fputs` analog is replaced by `printf` that is required to behave similar to
+  `fprintf`.
+- the `mingle`, `diffimg`, `gvmap`, and `edgepaint` binaries are now included in
+  the CMake build system
+- the `gvmap.sh` and `vimdot` scripts are now installed by the CMake build
+  system on operating systems other than Windows
+- a brief note about the (previously undocumented) behavior of Graphviz when
+  sent `SIGUSR1` is now mentioned in the man page
+- build system support for `dotty`, `lefty`, and `lneato` has been removed
+- the CMake build system now includes the DevIL, GDK, GhostScript, GTK, LASi,
+  Poppler, Quartz, Rsvg, Visio, WebP, and Xlib plugins
+- `awk` is no longer a build-time dependency #2118
+
+### Fixed
+
+- `agcanon`, `agcanonStr`, and `agwrite` now return error values on memory
+  allocation failures instead of crashing or corrupting data
+- `gvpr` programs can now pass dynamically allocated arguments to user-defined
+  functions without corrupting their content. Some cases of this were a
+  regression in Graphviz 2.46.0. Other cases have existed since the first
+  release of `gvpr`. #2185
+- spurious "no hard-coded metrics" warnings on labels with empty lines #2179
+- fixed corruption of user shape characteristics during EPSF initialization
+- output formats canon, dot, and xdot are not completely faithful to input #2184
+- gvpr index function produces wrong results #2211. This was a regression in
+  Graphviz 2.47.0.
+- Error on more than 128 cluster subgraphs #2080
+- `dot2gxl` no longer crashes on input `<node id="">` #2092
+- remove itos #2229
+- `sfdp` no longer crashes on certain graphs with cycles. #2225
+- `gml2gv` does not handle integer penwidth correctly #1871
+
+### Removed
+
+- the glitz plugin has been removed. The plugin was never complete and
+  distributions no longer ship glitz.
+
+## [3.0.0] – 2022-02-26
+
+### Changed
+
+- **Breaking**: Using Graphviz as a library on Windows now requires the `GVDLL`
+  symbol to be set to ensure correct linking.
+- **Breaking**: Graphviz headers no longer define the `boolean` type. A
+  replacement is C99 `bool` in the C standard library’s stdbool.h.
+- **Breaking**: The `insidefn` member of the `shape_functions` struct must now
+  be a pointer to a function returning a C99 `bool` instead of a
+  Graphviz-specific `boolean`.
+- **Breaking**: The `swapEnds` and `splineMerge` members of the `splineInfo`
+  struct must now be pointers to functions returning a C99 `bool`s instead of
+  Graphviz-specific `boolean`s. Similarly the `ignoreSwap` and `isOrtho` members
+  of this struct must now be C99 `bool`s instead of a Graphviz-specific
+  `boolean`s.
+- **Breaking**: The `defined`, `constrained`, `clip`, and `dyna` fields of the
+  `port` struct are now C99 `bool`s instead of Graphviz-specific `boolean`s.
+- **Breaking**: The `set` and `html` fields of the `textlabel_t` struct are now
+  C99 `bool`s instead of Graphviz-specific `boolean`s.
+- **Breaking**: The `usershape` field of the `shape_desc` struct is now a C99
+  `bool` instead of a Graphviz-specific `boolean`.
+- **Breaking**: The `candidate` and `valid` fields of the `rank_t` struct are
+  now C99 `bool`s instead of Graphviz-specific `boolean`s.
+- **Breaking**: The `filled`, `landscape`, and `centered` fields of the
+  `layout_t` struct are now C99 `bool`s instead of Graphviz-specific `boolean`s.
+- **Breaking**: The `has_images`, `has_flat_edges`, `has_sourcerank`,
+  `has_sinkrank`, `expanded`, and `exact_ranksep` fields of the `Agraphinfo_t`
+  struct are now C99 `bool`s instead of Graphviz-specific `boolean`s.
+- **Breaking**: The `clustnode` and `has_port` fields of the `Agnodeinfo_t`
+  struct are now C99 `bool`s instead of Graphviz-specific `boolean`s.
+- **Breaking**: The `conc_opp_flag` field of the `Agedgeinfo_t` struct is now a
+  C99 `bool` instead of a Graphviz-specific `boolean`.
+- **Breaking**: The `must_inline` and `nocache` fields of the `usershape_t`
+  struct are now C99 `bool`s instead of Graphviz-specific `boolean`s.
+- **Breaking**: The `device_sets_dpi`, `external_context`, `fit_mode`,
+  `needs_refresh`, `click`, `has_grown`, and `has_been_rendered` fields of the
+  `GVJ_t` struct are now C99 `bool`s instead of Graphviz-specific `boolean`s.
+- **Breaking**: The `loadimage` member of the `gvloadimage_engine_t` struct must
+  now accept a C99 `bool` parameter instead of a former Graphviz-specific
+  `boolean` parameter.
+- **Breaking**: The `textlayout` member of the `gvtextlayout_engine_t` struct
+  must now return a C99 `bool` instead of a Graphviz-specific `boolean`.
+- **Breaking**: The `config` and `auto_outfile_names` members of the
+  `GVC_common_s` struct are now C99 `bool`s instead of Graphviz-specific
+  `boolean`s.
+- **Breaking**: The `fixed` member of the `pack_info` struct is now an array of
+  C99 `bool`s instead of an array of Graphviz-specific `boolean`s. Similarly,
+  `pack_graph` now takes a `bool` array instead of a `boolean` array.
+- **Breaking**: `pccomps` now takes a C99 `bool` instead of a `boolean` output
+  parameter.
+- **Breaking**: `gvusershape_file_access` now returns a C99 `bool` instead of a
+  Graphviz-specific `boolean`.
+- **Breaking**: 1-bit fields of the `obj_state_s` struct are now unsigned
+  instead of signed.
+- **Breaking**: Graphviz headers no longer define the constant `MAXSHORT`. A
+  drop-in replacement is `SHRT_MAX` in the C standard library’s limits.h.
+- **Breaking**: Graphviz headers no longer define `NIL` macros. A drop-in
+  replacement is `NULL` in the C standard library’s stddef.h.
+- **Breaking**: Graphviz headers no longer define the `NOT` macro. A drop-in
+  replacement is the C/C++ operator `!`.
+- **Breaking**: Graphviz headers no longer (re-)define the C constants `INT_MIN`
+  and `INT_MAX`. Replacements can be found in the C standard library’s limits.h.
+- **Breaking**: Graphviz headers no longer define the constant `_DUMMY_ELEM`.
+- **Breaking**: The `-m` memory test option to Graphviz command-line programs
+  has been deprecated. Tools such as
+  [Leak Sanitizer](https://clang.llvm.org/docs/LeakSanitizer.html) are a more
+  effective modern way of diagnosing memory safety issues.
+- **Breaking**: Graphviz headers no longer define the constant `MAXFLOAT`. A
+  replacement is `FLT_MAX` in the C standard library’s float.h.
+- The Ming plugin that produced Shockwave files has been removed. This format
+  was EOLed by Adobe in April 2019. #2160
+- CentOS 7 packages now include libmingle and the `mingle` program.
+- The tclpkg Makefile no longer suppresses `-fstack-clash-protection` nor
+  other compiler options containing `-x`
+- Lefty is no longer enabled in the portable source tarball.
+- on Linux, the CMake build system uses the standard `GNUInstallDirs` to locate
+  target installation paths
+
+### Fixed
+
+- **Breaking**: GVPR now typedefs `ssize_t` as `SSIZE_T` on Windows instead of
+  `int` #1804
+- **Breaking**: `vgpanecmd` in the TCL tclpathplan library no longer accepts
+  abbreviated commands (e.g. `r` for `rotate`) and commands must be given in
+  full #1961
+- fix detection of unavailable output format
+- SVG layout doesn't always respect requested size #1855
+- mismatched format string in `mingle`
+- Building from scratch with Visual Studio fails #2175
+- Plugins are not configured on MinGW #2176
+- gvpr on MinGW does not support absolute paths #1780
+- PNG format not available in CMake builds with MinGW
+- tclpkg Makefile corrupts CFLAGS #2177
+- lneato -? sometimes fails with STATUS_STACK_BUFFER_OVERRUN on Windows #1934
+- expr misinterprets `<<` and `>>` #2103
+- stdout and stderr are not flushed at exit on MinGW #2178
+- Gvedit on macOS now understands the `-?` help command line argument
+- CMAKE_LIBRARY_PATH is not honored #1973
+- assert failure with `nslimit1=0` #1902
+- `gvpr` usage output has been restored. This was a regression in Graphviz
+  2.46.0.
+- C++ API not usable after install #2196
+
+## [2.50.0] – 2021-12-04
+
+### Added
+
+- hard-coded lookup tables for fallback font metrics for more fonts and font
+  variants
+- a new `gvputs_nonascii` API function has been implemented for GVC I/O with C
+  escaping
+
+### Changed
+
+- Check for existence of `dl_iterate_phdr(3)` and if it is available, prefer
+  using it instead of iterating over `/proc/self/maps` for computing `libdir`.
+- A limit on GVC config files of 100000 bytes has been removed.
+- MD5 checksums of release artifacts are no longer provided. SHA256 checksums
+  are still provided and these should be used instead.
+- when cross-compiling, the `dot -c` is no longer run during installation
+- `$CMAKE_INCLUDE_PATH` is no longer manually configured in the CMake build
+  system
+
+### Fixed
+
+- remove Bashism from `gvmap.sh` #2151
+- Lefty artifacts are no longer installed when Lefty is disabled #2153
+- Smyrna artifacts are no longer installed when Smyrna is disabled
+- calling convention mismatches in delaunay.c’s GTS code
+- impure assertion in `jacobi`
+- undefined behavior in libgvc’s reading of little endian numbers
+- boldness of `agnxtsubg` in cgraph man page
+- parameter `name` in `gvusershape_find` prototype corrected to a const pointer,
+  to match the implementation
+- xdot JSON output is not valid JSON #1958
+- fix uninitialized read of `pid` in `_sfpopen` on Windows
+- claimed minimum CMake version supported has been corrected to 3.9
+
+## [2.49.3] – 2021-10-22
+
+### Fixed
+
+- gvpr "split", "tokens", and "index" functions produce incorrect results #2138.
+  This was a regression that occurred between 2.47.1 and 2.47.2.
+
+## [2.49.2] – 2021-10-16
+
+### Changed
+
+- Lefty is disabled by default in the Autotools build system. To re-enable it,
+  pass `--enable-lefty` to `./configure`. In a future release, Lefty will be
+  removed.
+- remove PHP5 support in SWIG bindings
+
+### Fixed
+
+- Msys experimental packages are included in release artifacts #2130
+- CMake build system incorrectly aliases gv2gml to gml2gv #2131
+- Gv2gml Doesn't escape quotes in attributes #1276
+- GVPR incorrectly understands color schemes #1956
+
+## [2.49.1] – 2021-09-22
+
+### Changed
+
+- the CMake build system installs gzipped man pages if `gzip` is available #1883
+- CMake projects using Graphviz as a subproject (`add_subdirectory`) can now
+  link against and use `gvc`.
+
+### Fixed
+
+- various problems in the generation of Javascript bindings
+- 2.48.0: test suite is failing #2112
+- Ensure correct file-level dependency for generated file in cmake generated
+  projects #2119
+- compile failures with a C++20-compatible toolchain #2122
+- compile errors on macOS when using Bison 3.8 #2127
+- Make Graphviz buildable as a cmake subproject/subdirectory #1477
+- Header not found in Cmake project #2109
+
+## [2.49.0] – 2021-08-28
+
+### Added
+- a very basic C++ API for a subset of the functions in lib/cgraph and
+  lib/gvc, allowing a graph to be rendered from DOT source to a
+  specified format. The new API is available through two new
+  libraries: lib/cgraph++ and lib/gvc++. It is experimental, meaning
+  that it might have breaking changes also in upcoming patch or minor
+  releases (towards #2001)
+- CMake builds now support an `with_expat` option that allows the support for
+  using HTML-like labels through the optional expat library to be explicitly
+  enabled (default) or disabled
+- CMake builds now support an with_zlib option that allows the support for
+  raster image compression through the optional zlib library to be explicitly
+  enabled (default) or disabled
+
+### Changed
+
+- the CMake build system now enables `-Wextra` when building C++
+- some Cgraph functions that take `char*` arguments that they do not modify have
+  been updated to take `const char*` arguments #634
+- incorrectly using the `layout` attribute on anything other than a graph now
+  results in a warning about this being invalid #2078
+- `edgepaint` accepts more standard `--` prefixed command line arguments and
+  rejects invalid options #1971
+- improved detection of Lefty dependencies in the Autotools build system
+- libexpr rejects printing the time (`%t`) if no format is provided
+- `-DDATE=…` option in the CMake build system has been removed
+- the Autotools build system no longer writes the DATE file and the portable
+  source tarball no longer includes this
+
+### Fixed
+
+- The attached dot file causes a segfault when processed #2095
+- fix typos and update URLs in `edgepaint` usage text and man page
+- Fix clang's undefined behavior warning in dotLayout
+- gvpr doesn't build on macOS but MKDEFS_EXECUTABLE points to wrong
+  directory #2101
+- the generated gdefs.h header is no longer installed
+- `ccomps` out-of-memory message no longer incorrectly refers to `gc`
+- do not abort when `calloc(0, x)` or `calloc(x, 0)` in `gcalloc` return `NULL`
+- failed Exshort_t type discrimination #1799
+- dot manpage is in wrong directory on Windows #1936
+- CMake builds fail when when the ltdl library is not available even if the
+  `enable_ltdl` option is `ON`
+- CMake builds fail when when the optional `zlib` library is not available
+- fix graph rotation in quartz plugin
+
+## [2.48.0] - 2021-07-17
+
+### Added
+- a new C++ test infrastructure based on ctest and Catch2 towards #2002
+- support for test coverage analysis with
+  [lcov](http://ltp.sourceforge.net/coverage/lcov.php) and
+  [test coverage visualization in GitLab MRs](https://docs.gitlab.com/ee/user/project/merge_requests/test_coverage_visualization.html)
+
+### Changed
+
+- updated Graphviz bug report URL in the Autotools build system
+- Fix `WIN32` path of `gvc.def` specified in `libgvc_la_LDFLAGS`
+- the CMake build system now not only checks for Bison, but also ensures the
+  found version is recent enough #1916
+
+### Fixed
+
+- ortho's eqEndSeg incorrectly modifies its arguments #2047
+- Autotools enables -Wtrampolines and -Wlogical-op for Clang #2066
+- node_distinct_coloring failure due to out-of-memory now reported correctly
+  instead of referring to a failure to open lab_gamut
+- Fix a typo `GD_LIBS` to `GDLIB_LIBS` in `tclpkg/tcldot/Makefile.am` !2022
+- Autotools build system sets libgd variables now instead of incorrectly setting
+  GTK variables
+- HTML strings used as labels are distinguishable in GXL output by
+  `kind="HTML-like string"`
+- a Bashism removed from the Autotools build system
+- when Criterion is available, the `command_line` test binary is no longer built
+  and installed by default, but rather during `make check`
+- round-tripping a file through ``gv2gxl`` and then ``gxl2gv`` no longer causes
+  HTML-like labels to become non-HTML like labels #517
+- fix ODR violation by including the ortho object files in the gvc lib also for
+  CMake and MSbuild #2096
+
+## [2.47.3] - 2021-06-19
+
+### Changed
+
+- marginally more accurate computations in Smyrna sphere projection
+- Perl is no longer required to build Graphviz #2067
+- nop more reliably returns success and failure exit statuses
+- implicit 63 character limit on plugin names is removed in GVC
+- the packaging work flow on CentOS 7 now selects the Python 3 bindings, instead
+  of Python 2 bindings
+- remove Python 2 bindings #1992
+- improved thread-safety in Graphviz bindings Makefile
+
+### Fixed
+
+- no longer pass libcommon to the linker twice in mm2gv when building with CMake
+- Quartz plugin is now compiled with explicit `--tag=CC` to libtool #2065
+- out of bounds read when attempting to load a plugin whose name is ≥63
+  characters
+- out of bounds read when examining a registered plugin whose name is ≥63
+  characters
+- do not `fclose(NULL)` in gvmap
+- Assertion error when using `dot` in `ortho.c` in `convertSPtoRoute` in
+  graphviz 2.47.2 #2082. This was a regression introduced in 2.47.2.
+
+## [2.47.2] - 2021-05-26
+
+### Added
+
+- CMake option `use_sanitizers` which enables building with address and
+  undefined behavior sanitizer
+
+### Changed
+
+- $PATH is no longer assumed to be "/bin:/usr/bin:/usr/local/bin" if unset
+- test suite no longer assumes `python3` exists #2049
+- CMake build system locates Python 3 before calling it
+- diff and grep are no longer required to build Graphviz on Windows
+
+### Fixed
+
+- Uninitialized variable read in delaunay_tri
+- potentially mismatched format string in tclpkg
+- `gvToolTred` is now exported from gvc.dll on Windows mirroring the behavior on
+  Unix platforms.
+
+## [2.47.1] - 2021-04-17
+
+### Changed
+
+- More detailed error messages when opening input file fails
+
+### Fixed
+
+- Windows build thinks xdg-open can be used to open a web browser #1954
+- lab_gamut_data misses a value #1974
+- xdot man page does not document some functions #1957
+- Superfluous empty `@param` in documentation #1977
+- PIC renderer does not work and probably never has #131
+- dot conversion to dia format #689
+- memory leak of reference-counted HTML strings
+- Align rank from bottom in dot graph #1339
+- Fix for TBbalance attribute code #1980
+- HTML parser error with single closing square bracket in table row #1893
+- reference counted strings put the HTML bit in the middle of the reference
+  count #1984
+- &amp;amp; escape disappearing #797
+- miscalculation of minimum rank on large graphs
+- AddressSanitizer: strcpy-param-overlap in gvconfig_libdir when
+  running dot -c #1994
+- fix reuse of va_list in pov rendering
+
+## [2.47.0] - 2021-03-15
+
+### Changed
+- The edges in JSON output are ordered now !1728
+- remove regex usage #1919
+- RxSpencer is no longer a dependency on Windows
+- gvmap.sh is compatible with POSIX shells in addition to ksh
+- sed is no longer a build dependency on Windows
+- SHA256 checksum generation? #1955
+
+### Fixed
+- Fix gvpr -? to actually print usage and exit non-zero
+- gvpr is not built by CMake #1878
+- typos in gpcanvas.c #1927
+- memory leak in libmingle
+- private inheritance in IncVPSC #1874
+- broken sorting in nearest_neighbor_graph_ann.cpp #1938
+- memory leak in ANN bridge
+- gvpr on Windows does not support absolute paths #1780
+- buffer overflow in unflatten
+- agxbputc macro does not bracket its arguments #1814
+
+## [2.46.1] - 2021-02-13
+
+### Added
+- Support for building against Guile 2.2
+- Portable source is now also offered as a .tar.xz
+
+### Changed
+- CentOS/RHEL 6 is no longer supported
+- Vestiges of Qt4 support have been removed
+- C++11 support is now required of the C++ compiler used to build Graphviz
+- C99 support is now required of the C compiler used to build Graphviz
+- Question about userout() function in agerror.c #1924
+- The minimum version of Python required to run the test suite is 3.6
+
+### Fixed
+- memory leak in label construction
+- gvedit compilation errors out, but works if manually compiled with qt5 #1862
+- incorrect HTML BR attribute parsing code #1913
+- broken overflow checks in RectArea #1906
+- various memory leaks !1699
+- Fix bad free in lefty !1709
+- typo in pathcross #1926
+- Out-of-bounds write caused by incorrect error handling of malloc in genUserdata #1928
+- Offer .tar.xz files too #454
+- Header file graphviz_version.h has no include guards #1929
+- regression: newlines embedded in quoted labels / node names are not preserved in 2.46.0 #1931
+- Properly fill graphviz_version.h !1706
+
+## [2.46.0] - 2021-01-18
+
+### Added
+- Cgraph's agxbuf API gained a new function agxbdisown(), for dissociating
+  backing memory from the managed buffer
+- Build system support for the Elbrus 2000 CPU, thanks to Michael Shigorin
+
+### Changed
+- Cgraph's agheap() API has been removed
+- Autotools build system support for eFence has been removed
+- Building Graphviz with ICC defaults to -O2 instead of -O0
+- Build system work arounds for GCC 3 have been removed
+- Incomplete support for running the test suite under CMake has been removed
+- Portable source tarballs now use the “ustar” POSIX format
+- Minimum version of Flex required to build Graphviz is now 2.5.2
+- Minimum version of Bison required to build Graphviz is now 3.0
+- Minimum version of CMake required to build Graphviz using CMake is now 3.1
+
+### Fixed
+- gvpr: line numbers in gvpr errors/warnings are incorrect #1594
+- URL typo in patchwork man page
+- Escaped backslashes are not correctly handled when producing xdot with dot #165
+- heap-over-flow(off-by-null) in lib/common/shapes.c #1700
+- Windows MSBuild executables have the wrong version #1745
+- Cast Overflow at pango_textlayout #1314
+- x11 back end segfaults if display is unavailable #1776
+- typo in cmd/gvpr/lib/clustg #1781
+- Segfault in dot #1783
+- Incorrect 'Arrow type "s" unknown' error #1444
+- segfault on reading 0x10 #1724
+- Null-dereference READ (144736912) #1676
+- "Warning! PATH too long installer unable to modify PATH!" using CMake Windows installer and PATH length > 1024 #1770
+- gvedit -? gives "option - unrecognized - ignored" instead of showing usage #1813
+- lefty is not built for Windows (fixed for MSBuild builds only) #1818
+- a failure to detect OpenGL glGenTextures() errors has been corrected
+- sfio does compile time benchmarknig #1422
+- iffe "lib" check always succeeds when compiler optimises #1521
+- syntax error near text who is not present #1411
+- Explicitly links with libstdc++; should allow libc++ if appropriate #163
+- A macOS file that was erroneously excluded from portable source tarballs has
+  been restored
+- Add option -? for usage to diffimg
+- Add option -? for usage to dotty
+- Add option -? for usage to lneato
+- Add option -? for usage to vimdot
+- Fix smyrna -? to actually print usage instead of error
+- Fix edgepaint -? to actually print usage instead of error
+- Remove '"' from usage text in non-Windows version of dotty
+- Correct misspelled 'smyrna' in usage
+- Fix edgepaint -o option
+- Correct shebang of gvmap.sh to use ksh
+- Fix gvmap.sh -? option to exit with zero exit status
+- Graphviz doesn't build on MacOS with the latest libc++ #1785
+- make fails if ps2pdf is not installed (using autotools) #1763
+- multiple graphs to file output causes a segfault #1845
+- lefty PTY functionality relies on file descriptor implementation details #1823
+- buffer overflow in fdpgen
+- Crashes by VRML output when current directory is not writable #793
+- Segmentation fault when newrank=true #1221
+- sfdp craches #236
+- fdp segmentation fault with GK=0 #1290
+- fdp crash #1865
+- Graphviz always crash with this simple dot file #167
+- Seg fault in dot #1771
+- gml2gv doesn't handle some attributes correctly #1869
+- Add missing circo, fdp, neato, osage, patchwork, sfdp & twopi tools to Windows builds (copies of dot)
+- Add gv2gml tool to CMake (copy of gml2gv on Windows, symlink to gml2gv otherwise)
+- Regression: fdp generates internal names in the output #1876
+- Regression: fdp assertion error on cluster in edge #1877
+- Regression in id / &lt;title&gt; in svg for twopi #1907
+
+## [2.44.1] - 2020-06-29
+
+### Added
+- applied RH patches (from graphviz-2.42.2-8.fc32.src.rpm)
+  - graphviz-2.42.2-coverity-scan-fixes.patch
+  - graphviz-2.42.2-dotty-menu-fix.patch
+  - graphviz-2.42.2-ocaml-allow-const-cast.patch
+- some allocation failures that could previously allow memory corruption now exit
+- lab_gamut.3.pdf is no longer included in release archives
+
+### Changed
+- Windows binaries available at https://www2.graphviz.org/Packages/ instead of
+  https://ci.appveyor.com/project/ellson/graphviz-pl238
+- Retarget Windows builds to Visual Studio 2019 and toolset v142
+
+### Fixed
+- Released Ubuntu packages does not contain language bindings for Python3 #1737
+- Neato's hier mode is broken since v2.44.0 #1726
+- Segmentation fault (core dumped) #1436
+
+## [2.44.0] - 2020-04-08
+
+### Added
+- New SGD mode in neato (thanks [Jonathan Zheng](https://gitlab.com/jxz12/graphviz/-/tree/sgd))
+- Add pkg-config files !1322
+- tred: add feature to output removed edges to stderr upon request !1326
+- Fix issue #1671: Workaround: avoid creating a virtual edge loop. !1328
+- Add riscv64 to host_cpu configure.ac !1329
+- lib/cgraph: include empty malloc.h from subdir include !1332
+- lib/gvpr: compile mkdefs with $(HOSTCC) rather than $(CC) !1333
+- lib/vpsc: rename bcopy->b_copy !1334
+
+### Fixed
+- MSB4018 The NativeCodeAnalysis task failed unexpectedly. #1481
+
+## [2.42.4] - 2020-04-05
+
+### Added
+- Include all test files in distro !1341
+- host_cpu add mips64 platform !1325
+- Correct description of 'port' syntax in manual !1324
+
+### Fixed
+- svg output displays TITLE of %3 if graph had no name #1376
+- XML errors in generated SVG when URL attribute contains ampersand (&) #1687
+- Test files missing from source distributions #1647
+- SVG error for "g.transform.scale " in graphviz version 2.43 #1605
+
+## [2.42.3] and earlier
+
+```
+
+October 9, 2019
+    - Release 2.42.3
+	- Merge 1316, 1317, 1319, 1320
+	- Patches #1591, #1596
+	- Add Fedora 32 builds
+	- CI/CD fixes
+	- Documentation (Warning about HTML label usage)
+
+September 17, 2019
+    - Release 2.42.2 - ( Never fully released due to CI/CD hardware issues )
+    - Fix deployment issues.  Builds can now be found under:
+	             http://www2.graphviz.org/Packages/
+July 17, 2019
+    - Release 2.42.1
+    - Fix deployment issues.  Builds can now be found under:
+	             http://www2.graphviz.org/Packages/
+July 4, 2019
+    - Release 2.42.0
+    - Fixes quite a few bugs
+September 22, 2017
+    - Move master repo to GitLab: https://gitlab.com/graphviz/graphviz
+December 21, 2016
+	- Remove usage of ast_common.h
+December 20, 2016
+    - Release 2.40.0
+        - network-simplex fixes and optimization (Stephen North)
+	- built-in tred tool now available in the various swig generated
+	language bindings (John Ellson)
+	- number rounding added to SVG renderer (same as PS and TK rounding)
+	to aid regression testing. (John Ellson)
+	- additional regressson test framework, used in Travis CI builds. (Erwin Janssen)
+	- PHP7 support (requires swig-3.0.11 or later). (John Ellson)
+	- Allow user to specify clustering algorithm in gvmap. (Emden Gansner)
+	- Add Sierpinski graph generator to gvgen. (Emden Gansner)
+	- Extensive code cleanup (Erwin Janssen)
+	- Removal of libgd source - use vanilla libgd from separate install
+	- Windows builds (Erwin Janssen)
+	- Appveyor CI for automated Windows build testing (Erwin Janssen)
+	- Travis CI for Fedora/Centos builds (Erwin Janssen)
+	- Added JSON output format, -Tjson  (Emden Gansner)
+	- New curved arrowhead, cylinder node shape.
+	- Resolves bugs: 2599, 1172
+June 18, 2016
+	- Experimenting with Travis CI
+February 13, 2016
+	- Add cylinder shape for databases.
+	- Free installed plugins
+	- Update makefile for dot so that the using libpanco_C in the static build include PANGOFT2
+        as well as PANGOCAIRO_LIBS (needed for some versions of Ubuntu)
+February 1, 2016
+	- Add json output format
+April 26, 2015
+	- output class value in svg files
+September 9, 2014
+	- Add plain shape for use with HTML-like labels.
+August 12, 2014
+	- Add icurve arrowhead.
+July 28, 2014
+	- Revert to old, translate to origin semantics in neato, etc. Add flag notranslate if that is
+          what the user desires.
+April 13, 2014
+	- Release 2.38.0
+	- Resolves bugs: 2409, 2413, 2417, 2420, 2422, 2423, 2425
+March 27, 2014
+	- Enable packing for dot
+	- Allow scaling to work for all non-dot layouts
+March 9, 2014
+	- Add overline text characteristic.
+March 4, 2014
+	- Fix bugs in gvpr and gv.cpp so edges can be created in subgraphs.
+	- Add edgepaint program for coloring edges to make them easier to tell apart.
+	- Modify neato to avoid unnecessary translations of output. This allows positions
+	given on input to remain the same on output.
+	- Fix swig java package to work and support gv.renderresult.
+	- Fix test for the absence of layout (old test relied on statically allocated Agraphinfo_t).
+	- HTML-like tables and cells can now specify which borders should be drawn.
+	- The fixedsize attribute now takes the value "shape" which allows labels much larger than the
+	node shape.
+January 11, 2014
+	- Release 2.36.0
+	- Resolves bugs: 2372, 2384, 2388, 2391, 2392, 2383, 2395, 2401, 2406
+	- Various MacOS Fixes from Pixleglow.
+	- Remove old libgraph sources from distributions.
+	- Move master git repo to github.com
+September 15, 2013
+	- Add <S> element for strike-through to HTML-like labels.
+September 6, 2013
+	- Release 2.34.0
+	- New version of xdot supporting inline text characteristics such as <b> and
+	version-specific output based on xdotversion
+	- Resolves bugs: 2325, 2326, 2333, 2334, 2337, 2338, 2340, 2343,
+		2345, 2346, 2349, 2350, 2351, 2352, 2353, 2354, 2357, 2359
+	- Resolves Redhat bug: BZ#847458
+August 21, 2013
+	- Added mingle command and library for edge bundling
+August 1, 2013
+	- Release 2.32.0
+	- New version of xdot format, annotating gradient color schemes
+	- Support for reading pdf images using poppler
+	- Lefty/dotty/lneato now accept anonymous graphs
+July 2, 2013
+	- Add star node shape
+	- Add two-tone (non-gradient) fill
+February 14, 2013
+	- Release 2.30.1
+	- various build fixes
+January 13, 2013
+	- Release 2.30.0
+	- Replaced libgraph with libcgraph; use of libgraph is now deprecated
+	- New ranking algorithm that allows multiple subgraph constraints
+November 27, 2012
+	- Add graphml2gv and gv2gml to Windows package.
+September 25, 2012
+	- Support edges using curved arcs.
+August 16, 2012
+	- Added new shapes used by the synthetic biology community.
+July 12, 2012
+	- For HTML-like labels, provide rounded cells, and dashed or dotted borders.
+	- Add lcurve and rcurve arrowheads.
+	- Add prototype pie chart and striped fills.
+	- Support insets in treemaps to make containment clear
+June 7, 2012
+	- Add random rooted tree generation to gvgen
+February 29, 2012
+	- Allow GVPRPATH to specify that the default path be prepended or appended to it.
+February 27, 2012
+	- Support arbitrary lists of layers; allow the user to specify arbitrary layers for output.
+February 24, 2012
+	- A collection of gvpr scripts, which were part of the source package, are now
+	installed in <prefix>/share/graphviz/gvpr, and the that path is used as part of th
+	default built-in path for gvpr.
+February 15, 2012
+	- Update libexpr to reflect Glenn Fowler's changes including scopes for variables.
+February 9, 2012
+	- Add next graph variable to gvpr
+February 8, 2012
+	- Modify dot and fdp so that a cluster's margin attribute will affect the space
+	  between the bounding box and nodes
+January 26, 2012
+	- Modify the dijkstra tool to use only directed edges
+	- Output numbers without quotes if quotes are not needed on input
+	- Support gradient fill
+January 23, 2012
+	- Provide support for webp images
+January 17, 2012
+	- Fix tapered edges to use the dir attribute and arrowhead
+September 21, 2011
+	- Add imagepath attribute
+	- Add help functionality to Graphviz.app
+August 24, 2011
+	- Add <B>,<I>,<U> to html strings via svg
+August 16, 2011
+	- Add tapered edges
+August 3, 2011
+	- Add support for external labels
+July 14, 2011
+	- Add initial implementation of graphml2gv
+July 8, 2011
+	- Add basic horizontal and vertical rules to html tables
+May 6, 2011
+	- Release 2.28.0
+	- incremented library api version:
+	    libcdt, libgraph, libcgraph, libgvpr, libgvc
+	- Add gvmap, cluster and gvmap.sh
+	- Deprecate dotty; prefer gvedit
+	- Add patchwork supporting squarified tree maps
+	- Add ordering as a node attribute
+	- Fix problems with font resolution
+	- Fix problems with text placement
+	- Fix twopi to set root attribute
+	- Make available layouts and formats available via the API
+	- Fix error message system so that an application can capture the messages
+	- New Qt-based version of gvedit
+	- New attributes and features for sfdp
+	- gvgen now allows the user to specify graph name and node name template
+	- Make overlap=false denote overlap=prism
+	- More efficient xdot library
+	- HTML-like labels provide ID
+	- Fixed bugs: 1480 1980 2044 2087 2088 2089 2091 2093 2094
+	2095 2101 2102 2103 2104 2112 2113 2118 2128 2129 2139 2149
+	2157 2113 2159 2160 2161 2163
+March 31, 2011
+	- Add many new gvpr scripts to release package
+	- Add scale attribute to twopi
+October 14, 2010
+	- Add <B>,<I>,<U> to html strings via cairo
+February 15, 2010
+	- migrated to 2005 version of cdt
+January 26, 2010
+	- Release 2.26.3
+	- libcgraph.so   version bumped from 4 to 5 due to API changes
+	- Allow ranksep to specify multiple radial differences in twopi
+	- Allow the user to specify all pairwise distances in neato with
+	- Fixed bugs: 1280 1409 1567 1583 1624 1631 1655 1708 1709
+	1727 1784 1792 1798 1800 1813 1814 1830 1831 1833 1836 1839
+model=mds
+December 10, 2009
+	- Release 2.26.0
+	- Core features:
+		- added: "smyrna" - a new opengl-based viewer for large graphs
+		- added: rudimentary "gml2gv", "gv2gml" converters
+		- extended support for various image formats in node images
+		- removed vestiges of codegens, now all putput formats supported
+		  through plugins.  Dropped some output formats for which
+		  plugins have not been developed: -Tdia, -Tmif
+		- gvpr converted to a library; additional array handling and
+		  text processing functions added; language extended to allow
+		  multiple BEG_G/N/E blocks.
+		- allow background images specified via xdot
+	- Ports added/dropped from nightly builds:
+	  (The dropped ports could probably be re-added if there was demand.)
+		- added MacOSX SnowLeopard  (multiarch:  i386/x86_64/ppc)
+		- added Fedora 12 (i386, x86_64)
+		- added Fedora 13 (Rawhide) (i386, x86_64)
+		- dropped Fedora 7 (i386, x86_64)
+		- dropped Fedora 8 (i386, x86_64)
+		- dropped RHEL 3 (i386, x86_64, ia64)
+		- dropped Ubuntu 8 (i386)
+	- Fixed bugs: 1683 1713 1718 1720 1738 1747 1759 1770 1776 1786
+	  1799 1816 1827
+
+June 16, 2009
+	- Release 2.24.0
+	- Core:
+		- add new layout engine for large graphs: sfdp
+		- add new layout engine for nested graphs: osage
+        - pack library extended to handle array-based packing modes
+          using array bounds, aspect ratio, user-controlled sorting, etc.
+	- Fixed bugs: 1515 1590 1598 1601 1605 1607 1609 1610 1611 1614
+	1615 1617 1625 1628 1634 1635 1640 1641 1642 1646 1649 1651 1652
+
+March 13, 2009
+	- Release 2.22.2
+		- fix for buffer overflow (present in 2.22.0 and 2.22.1)
+	- Fixed bugs:
+		1602
+
+March 9, 2009
+	- Release 2.22.1
+		- build fixes for Visual Studio and for FreeBSD
+March 3, 2009
+	- Release 2.22.0
+	- Core:
+		- libgvc api changed, version bumped.  Affects third party
+		  applications using libgvc.
+		- plugin api changed, version bumped.  Affects third party
+		  plugins for graphviz.
+		- 90% conversion to cgraph has been done, but not enabled yet,
+		  (and yes, its true what they say about the last 10% )
+		- drop libagraph from distribution  (use libcgraph)
+		- layout code completely converted to floating point.
+		- new "dot -P" option for generating a graph of available
+		  plugins.
+		- registered MIME type:  text/vnd.graphviz for .gv files
+		- rename files from .dot to .gv to avoid conflict with
+		  Word templates.  .dot still supported, but deprecated.
+		- new command: mm2gv   (matrix-market graph file conversion)
+		- rename commands:	dot2gxl -> gv2gxl
+					gxl2dot -> gxl2gv
+	- Plugins:
+		- new rsvg plugin for support of node shapes in SVG format
+		- new gs plugin for support of node shapes in PS format
+		- new lasi plugin for support of UTF-8 characters in PS output
+		  (the above thee plugins are Linux only, at the moment)
+		- new quartz plugin (MacOSx only)
+		- new gdiplus plugin (Windows only)
+		- new -Tvml support in core plugin (thanks Steve Roush)
+		- new -Ttk support in core plugin (also used by Tcldot and
+		  gv_tcl language bindings.)
+		- disabled old style codegens completely
+	- Linux:
+		- new Ubuntu8 builds
+		- new Fedora 10 and 11 builds
+	- MacOSx:
+		- Universal binary for Leopard: i386, x86_64, ppc, ppc64
+		- Should not conflict with parallel install of MacPorts
+		  version of graphviz
+		- Improved GUI
+	- Windows:
+		- VisualC project files now available, in addition to the GNU
+		  Makefiles that are used the mingw builds.
+	- Language Bindings:
+		- fixed problem with writing dot, xdot, plain, canon to
+		  memory or to Tcl_Channels
+		- renamed man pages to Debian style:  gv.3tcl, gv.3perl, etc
+	- Fixed bugs: 827 1365 1366 1367 1368 1374 1375 1376 1378 1380 1382
+	1383 1385 1386 1388 1390 1391 1392 1394 1395 1397 1398 1399 1405
+	1407 1410 1412 1414 1415 1416 1421 1424 1425 1427 1429 1431 1433
+	1435 1436 1437 1438 1440 1441 1444 1446 1451 1452 1453 1456 1457
+	1459 1460 1461 1462 1463 1464 1465 1466 1470 1474 1475 1476 1477
+	1478 1484 1485 1489 1490 1492 1493 1495 1496 1499 1500 1501 1502
+	1503 1505 1509 1513 1521 1523 1525 1530 1531 1532 1533 1535 1536
+	1539 1540 1542 1543 1546 1547 1551 1553 1554 1561 1565 1566 1568
+	1569 1570 1571 1573 1577 1578 1579 1580 1581 1582 1584 1586
+
+June 25, 2008
+	- Release 2.20.2
+	- Fix bug in HTML-like labels
+June 23, 2008
+	- Release 2.20.1
+	- Fix bug in ccomps related to conversion to cgraph
+June 20, 2008
+	- Release 2.20.0
+	- Preparing for Release 2.20
+	- Fixed bugs: 1315, 1317, 1324, 1336, 1343, 1364
+	- Add new "folder" shape for nodes.
+	- Migration of gvpr tools to libcgraph.
+	- New output format -Teps  (encapsulated postscript)
+	- Various NetBSD and SuSE fixes incorporated
+	- ./configure now provides a summary
+	- RPM specfile updates for fedora-10 (no more string comparisons)
+	- Add MacOS support (Glen Low)
+March 10, 2008
+	- Release 2.18
+	- Fixed bugs: 1249 1255 1256 1268 1276 1289 1295 1300
+		Fedora BZ#247376,
+	- in -Tps use a new number formatter that suppresses trailing 0.
+	- support tcl/tk-8.5
+	- support gcc-4.3
+	- support for node usershapes/images in svg format (thanks Alex Poylisher)
+	- install: perl, php, python, ruby, tcl, bindings in language-specified directories
+	- add arrowhead scaling with edge penwidth
+	- add "folder" node shape (thanks Pander)
+	- many windows and mac fixes (thanks Glen)
+	- add "smyna" large graph view (thanks Arif) (not yet included in binary distros)
+December 12, 2007
+	- Release 2.16.1
+	- Fixed bugs: 1228 1234 1238 1239 1245
+	- Improvements to PHP binding
+	- Improvements to OCAML binding
+	- Make regression tests run from the build tree, rather than require installation
+	- Repair freetype detection on RedHat-7 (Yes, people still use it!!)
+	- Fix zoom-at-mouse-location in -Txlib and -Tgtk
+	- Fix some dotty regressions
+November 9, 2007
+	- Release 2.16
+	- Fixed bugs: 456 473 1021 1153 1154 1155 1159 1160 1162 1165 1166
+	1168 1169 1170 1172 1173 1174 1175 1177 1178 1179 1181 1182 1183
+	1185 1187 1189 1192 1193 1195 1196 1199 1204 1207 1210 1215 1216
+	1217 1218 1219 1220 1223
+	- new regression test suite
+	- new cgraph library (will eventually replace graph and agraph)
+	- add "image" and "imagescale" for simpler support for images in nodes
+	- add "tab" "box3d" and "component" shapes.  - Diomidis Spinellis
+	- replace arith.h in distro
+	- add functions to access version info to avoid need for gvcint.h
+	- Fix problem with irregular character spacing at 96dpi in pango/cairo output formats.
+	- Add gdk_pixbuf plugin providing: .bmp .ico .jpg .png .tif
+	- Add DevIL plugin providing: .bmp .jpg .png .tif .tga
+	- Extend GD plugin to provide a backend to cairo for: .gif .jpg .png .gd .gd2 .wbmp  <- gifs are now antialiased
+	- Rework plugin framework to separate device from renderer, and to autoload load dependendent plugins
+	- show defaults in output from: ./configure --help
+	- add more info to dot -v  and dot -v2 debug outputs
+	- various issues with CR/LF in windows, but not in binary outputs.
+August 15, 2007
+	- release 2.14.1
+	- Fixed bugs: 1163, 1167
+	- Windows build fixes
+	- Add xdot parsing library to source distros
+	- graphviz.spec fixes for rpm distros from Gareth Armstrong
+	- moved language binding man pages to mann (gv_php.n, gv_ocaml.n, etc.)
+	- New access functions for version info in GVC_t - permits gvcint.h to
+	be private.
+August 2, 2007
+	- release 2.14
+	- Fixed (or otherwise closed) bugs:
+		74 130 162 184 190 197 219 223 281 295 311 316
+		324 352 364 385 393 404 420 447 455 474 489 507
+		530 532 537 543 551 564 571 574 577 583 587 588
+		590 592 595 599 638 647 650 660 675 667 668 669
+		676 684 685 686 721 725 734 740 746 747 748 749
+		752 755 756 765 778 780 781 782 785 794 803 814
+		822 828 836 840 847 852 862 866 868 893 928 944
+		948 950 955 961 976 985 992 1024 1057 1064 1065
+		1066 1069 1072 1074 1079 1085 1086 1089 1091 1092
+		1093 1094 1096 1107 1111 1123 1124 1130 1138 1145
+		1151 1152 1156
+	- Fixed Redhat bugs: 218191 237497
+	- Fixed Debian bugs: 321128 422862 422873
+	- Fixed Gentoo bugs: 173676
+	- Using system version of libgd if gd-2.0.34 or later. (Fedora 7 and 8 distros)
+	        internal copy of gd updated to gd-2.0.35.
+	- Updated GVGUI viewer for Windows
+	- Windows build process now uses GNU autoconf and UWIN
+	- Added support for selection of edge routing types:
+		line, polyline, orthogonal, spline
+	- Added -Tvml support
+December 5, 2006
+	- release 2.12
+	- Bug fix release for 2.10
+	- The gd plugin for font handlers was not being used at all if the build
+	did not use fontconfig, e.g., on Windows. In addition, the code had
+	dropped the name mapping to Windows font names.
+	- PostScript output had an extraneous '%' character on the first line,
+	which would cause printing to fail.
+	- Text handling, during both sizing and layout, incorrectly handled
+	empty lines such as label="\nabc".
+	- HTML-like tables had been changed to use too much vertical space,
+	to possibly use the wrong font in calculating the height of a line,
+	and to use the wrong offset when moving the baseline from one line to
+	the next.
+November 27, 2006
+	- release 2.10
+	- dot - New pango+cairo renderer plugin (was in separate graphviz-cairo tree).
+	  -- -Tpng now uses cairo   (-Tpng:gd for old gd based renderer)
+	  -- -Tpdf now available
+	  -- -Tps:cairo now available (-Tps is a direct ps renderer not based on cairo)
+	  -- -Tsvg:cairo now available (-Tsvg is a direct svg renderer not based on cairo)
+	  -- -Txlib now available -- "dot -Tx11 foo.dot"  watches foo.dot with inotify and updates
+	  -- -Tgtk now available -- eventually to provide a graph editing capability - not fully working
+	  -- -Tswf "Flash" now available using the ming library. Currently has incomplete font support and not yet in Fedora rpms because ming not yet available as rpm.
+	- remove hard gd dependencies from dot.  gd renderers now provided
+	  as optional plugin.   Deprecated, but required for -Tjpg, -Tgif and -Tvrml.
+	- gvpr - Add kindOf function, plus functions to set and get default values
+	- dot - Implement esep attribute to allow graph to specify room
+	around nodes for spline routing.
+	- neato - add vpsc library and DIGCOLA
+	- neato - add IPSEPCOLA additions from Tim Dwyer
+	- move: -Tps, -Tfig, -Tsvg, -Timap/ismap/cmap/cmapx, -Tdot/xdot,
+	from codegens to a "core" plugin.
+	- dot - new usershape plugin mechanism potentially supporting
+	  a wider range of input shape format -> output format combinations.
+	display on changes
+	- Fixes for builds on Mac OS/X
+	- dot - new -O switch to automatically generate output file
+	names based on the input filename and the -T value.
+	 e.g.  "dot -Tpng -O *.dot"
+	Also works for case of multiple graphs in a single input file.
+	- add support for "Brewer" color nameset
+	- move reusable .so libraries to $PREFIX/lib per frequent request
+	from Debian community.   Plugin .so's remain in $PREFIX/lib/graphviz.
+	- Fix bugs 882 884 886 896 902 905 906 911 918 919 933 936 938 940
+	   948 955 958 967 979 987 993 1005 1006 1011 1012 1013 1014 1016
+	   1018 1025 1030 1034 1035 1039 1040 debian#37300
+
+February 3, 2006
+	- release 2.8
+	- (POTENTIAL INCOMPATIBILITY) The default input scaling, in the
+	absence of a "-s" switch, has been changed from inches to points.
+	The new behavior of "neato" is equivalent to "neato -s72".
+	The old behavior can be restored with "neato -s1".
+	The purpose of this change is to avoid a Frequently-Made-Mistake
+	when using "neato -n" to process a previously generated layout.
+	Previously it was necessary to use "neato -n -s72", but with this
+	change the default matches dot's output and the "-s72" is not required.
+	- Added pseudo layout engines: "dot -Knop" and dot -Knop1" equivalent
+	to "neato -n"
+	- Added pseodo layout engine: "dot -Knop2" equivalent to "neato -n2"
+	- Add support for color namespaces; add Brewer color data
+	- Add support for simulated duplex edges using parallel edges:
+	head arrow takes first color, tail arrow takes second color.
+	- source code management moved back to CVS until GIT matures a bit more
+	- distribute separe rpms for binares of language bindings :
+	- Add a small pad region around graph renderings to allow for finite
+	penwidths at the drawing edges
+	- Add protonode(g) and E=protoedge(g) functions to simplify
+	language bindings.
+	- Add special purpose code to deal with html labels from language
+	bindings.
+	- Various portability fixes for: HPUX, Mac OS/X, Cygwin, Windows.
+	- Fix bugs 784 786 787 788 789 790 791 793 795 796 798 799
+	    800 801 804 806 811 812 817 820 821 823 824 825 830
+	    837 839 841 842 843 848 850 851 854 855 856 857 858
+	    859 861 863 866 867 869 872 874 876 877
+
+August 28, 2005
+	- release 2.6
+	- experimentally moved source code management from CVS to GIT
+	- added iterator functions to script bindings
+	- more C-API tuning
+	- add "-c" switch to dot to explicitly generate plugin "config" file
+		instead of generating it as a side-effect of "dot -V"
+	- better support for binary relocation.
+	- plugin versioning and version checking
+	- clean up of header files
+	- provide statically linked "dot_static" (not incl. in rpms)
+	- additional "event" support for GUIs (e.g. "DotEdit" graphviz-cairo)
+	- add some information about plugins to "dot -v" output.
+	- lefty/dotty fixes
+	- fix bugs 746 750 752 753 754 756 761 763 764 765 768
+		771 772 773 774 775 776 777 778
+	- not a bug 757 760 770
+July 20, 2005
+	- release 2.4
+	- major code restructuring
+	- new plugin architecture (e.g. see separate package: graphviz-cairo )
+	- new script-language bindings using swig (perl, ruby, python, tcl, java ... )
+	- C-API now in libgvc (no more dotneato.[ch] or dotneato-config.sh]
+	- pkgconfig now used for reusable libraries
+	- lefty upgrade
+	- fix bugs 156 255 492 631 641 647 659 662 665 670 690 691
+			701 702 703 705 730 731 732 741 743
+April 7, 2005
+	- release 2.2.1
+	- correct license headers to CPL in .cpp files
+	- undo indentation cleanup to dynagraph .h files
+	- fix bugs: 183 247 419 615 616 625 626 627 643
+		646 651 658 661 664 674
+	- fix buffer overrun in Gvfilepath construction
+January 19, 2005
+	- release 2.2
+	- fix bugs: 86 345 517 579 580 597 600 601 604
+	- use the original cpl1.0.txt as the license master, instead of CPL.html        - fix for bug generating in memory bitmaps that was affecting webdot
+	- fixes for windows builds
+	- documentation updates
+December 11, 2004
+	- release 2.0
+	- new CPL license
+	- re indent all sources
+December 11, 2004
+	- release 1.18
+	dotneato
+	- fix bugs: 451 536 545 547 548 559 561 565 572
+	- increase max size  of HTML tables.
+	- spline cluster edges in fdp
+	- center userimages in nodes
+	- support user images in HTML table cells
+	- syntax extension for node:port:compass as well as node:compass
+	- FreeBSD fixes
+	- sync with gd-2.0.32
+	- attempt to catch some out-of-memory conditions with very large graphs
+	- support background and node-fill partial transparency when truecolor=true
+
+September 14, 2004
+	- release 1.16
+	dotneato
+	- fix bugs: 275 523 526 527 529 534
+August 30, 2004
+	- release 1.14
+    dotneato
+	- the official gd now has support support for GIFs again - the
+		internal gd is now closely sync'ed with the official version
+		and will eventually be removed in favor of using a
+		separate installation of the official version.
+	- gd has new support for FontConfig (thanks to Dag Lem)
+		NB. the fontname attribute in graphs is now a font pattern
+		as understood by fontconfig (e.g. fontname="Times-Italic"),
+		unless it contains a '/' in which case it is interpreted as
+		a font path as before.
+	- gd provides support for html4 entities in decimal, hex or named, e.g "&lt;"
+	- "dot -v" debugging output now reports fontname -> fontpath resolutions
+
+	- PostScript generated by -Tps now uses "xshow" operator for strings
+		for better matching of bitmap and PostScript outputs.
+
+	- ability to use an external gd-2.0.29 version of libgd (EXPERIMENTAL)
+
+	- new feature: parallel edges by using a ":" separated list of edge colors
+	- new feature: rankdir=BT and rankdir=RL  (thanks to Dag Lem)
+
+	- new layout engine: fdp - force directed placement (EXPERIMENTAL)
+		a neato-like undirected layout engine that produces
+		clustered symmetric layouts.
+		Supports edges between clusters and nodes.
+
+	- updated neato engine: now using stress majorization as the default,
+		which avoids the potential for cycling
+	- model=subset in neato provides a third distance function, where
+		two nodes sharing many nodes will be place farther apart
+	- shape=none now equivalent to shape=plaintext
+	- fix label justification with \l and \r
+	- first cut at <FONT> support added to html labels
+	- various color transparency fixes
+	- various fixes for UTF8 and Latin[12] character encodings.
+	- various cluster fixes.
+	- improved hyperlink support in -Tsvg
+	- support tooltips on clusters in client-side imagemaps
+
+    gvpr
+	- add support for scanf and friends
+
+    general
+	- greater use of shared libraries.
+	- pkg-config files provided for shared libraries (EXPERIMENTAL)
+	- "./configure --disable-shared --enable-static" works if needed
+	- C++ wrappers on all header files (thanks to Victor Wodecki)
+	- various configuration and portablity fixes
+	- provide pdf version of man pages
+	- Windows package provides graphviz libraries and header files
+	- Closed bugs: 195 198 234 321 330 399 401 406 410 411
+		412 413 415 416 417 423 424 427 430 431 433 434 435
+		438 441 442 444 445 449 450 452 454 457 458 462 463
+		464 467 468 469 471 475 480 482 485 495 496 498 499
+		500 501 504 508 511 512 514
+
+March 5, 2004
+    - added glyphwidths.ps support utility
+
+March 1, 2004
+    - release 1.12
+    - general
+	- rename bcc -> bcomps to avoid name conflict with "Bruce's C Compiler"
+		on Redhat distributions.
+	- all build without X11 (fix problem in lefty tree)
+	- remove from distribution:
+		dag, fdp, geo, grid, incr, shape, tcldgr, tcldgl
+    - dotneato
+	- fix "brown-bag" problem resulting in PNG and JPEG errors on RH8 and RH9.
+February 23, 2004
+    - release 1.11
+    - general
+	- fix windows builds
+	- add tool "bcc" to distribution
+    - dotneato
+	- add -Gviewport="X,Y,Z,x,y"  where XY are the dimensions of a viewport
+	  in device coordinates (pixels), Z is a zooming factor, x,y is the
+	  location of the center of the viewport in graph coordinates.
+	  Supported in bitmap and imagemap outputs only.
+	- fix memory leak in gd/gdft.c
+	- clean up calculation of whitespace around labels
+    - dotty, lefty
+	- fix for bug #400
+December 23, 2003
+	- added dijkstra (single source distance) filter
+September 10, 2003
+    - general
+	- removed CVS directories from .tar.gz distributions
+	- add "config" directory to contain some of the autoconf clutter
+	- only remove flex products with "make maintainer-clean" to
+	  avoid trying to regenerate them after "make distclean"
+	  basically this is to avoid the broken flex on Debian.
+	- suppress complaints from ./configure about config.rpath
+	- doc/build.html updated with notes about Windows builds
+	- build fixes for Forte 6sp2 compiler on Sun -xarch=v9a (64bit)
+	- build fixes for OpenBSD
+	- improved configure testing for Tcl/Tk
+	- various bug fixes, internal restructuring, etc
+    - dotneato
+	- fix problem with extra escape chars in .fig output
+	- support for "setlinewidth" in -Tfig
+	- improved splines in -Tfig
+	- add manpage for dotneato-config
+	- neato: add defaultdist graph attribute to set distance
+	  between components
+	- first cut at html table formatter add. not ready for use yet
+	  as the syntax is going to change some more.
+    - tools
+	- renamed "colorize" to "gvcolor" to avoid conflict on Debian
+	- renamed "gpr" to "gvpr" to avoid conflict on Debian
+	- add fflush() to acyclic, ccomps, gvcolor, tred, dot2gxl
+	  to try to fix truncated output when used in php or perl cgi scripts
+July 9, 2003
+	- rerelease 1.10 with ast_common.h fix in -devel rpms
+July 3, 2003
+	- declare this version 1.10
+	- general
+	    - "mkdir obj;cd obj;../configure;make"   now works (bug #293)
+	    - "make prefix=xxx"   now works (bug #274)
+	    - "--with-wish=xxx"   now works (bug #270)
+	    - remove generated file: ast_common.h from source distributions
+	    - make GIF support configurable
+	    - added .cvsignore throughout source tree to reduce CVS noise
+	    - FAQ updates
+	    - documentation updates for gpr
+	    - improve portability of dotneato-config, but requires libtool now
+	    - improvements to error processing for library users
+	-gd
+	    - sync with gd-2.0.15
+	    - optimize line drawing code
+	- dot, neato, twopi
+	    - fix bugs 240 270 274 293 298 303
+	    - support "peripheries=0" without crashing
+	    - add support for "dia" output format (-Tdia)
+	    - espf fixes (use of showpage)
+	    - svg fixes (coordinates and viewBox)
+	    - ismap/imap, fixes (quoting of label strings)
+	    - fix to "point" shape
+	    - improve (m|c|re)alloc usage
+	    - improve handling of very-small fonts in bitmap outputs.
+	    - various fixes for multiple -T -o feature
+	    - add support for splines to records and ports (neato)
+	    - various improvements to libpack
+	    - dot_init_graph and neato_init_graph external for library users
+	    - cluster improvements (neato)
+	    - fix support for truecolor
+	    - normalize splines so that they now always go from tail to head
+	    - add some simple help text for any unrecognized option
+		(e.g. -?  -h  --help)
+	- tools
+	    - extend gpr language to allow access to command-line arguments
+	    - add sqrt() function to gpr
+	    - add new tool - gvpack
+	- tcldot
+	    - use .dll extension if on windows
+	    - doted demo
+		- use tcl's file requestor instead of homebrew
+		- add zooming controlled by mousewheel
+		- support additional export formats
+
+January 31, 2003
+	- declare this version 1.9
+		(3-level version numbering has been dropped now
+		that we have nightly snapshot builds with their
+		own extended numbering.)
+	- general
+	    - config.h is no longer installed.  config.h is generated by
+		./configure for the current build only.  It may not be
+		applicable for derivative builds.
+	    - improve ICONV configure tests
+	    - lots of janitor-work to clean up warning messages from -Wall
+	    - use @OBJEXT@ in Makefile.am so that .obj is used under cygwin
+	    - fixes for Solaris builds
+	    - use libpng-config if available
+	    - reduce long build times due to touching ast_common.h too often
+	    - improve dependency tracking.  "make -j8" now works with distcc
+	    - autogen.sh fixes to work on RH7.3, RH8.0, and Solaris.
+	    - eliminate use of suffix rules which confused some makes.
+	    - DOT language allows '+' for concatenation of quoted strings
+	- dot, neato, twopi
+	    - fix bugs 209 210 214 216 217 222 224 225 229
+			230 233 236 237
+	    - update gd into alignment with gd-2.0.9
+	    - change to make libagraph output compatible with libgraph input
+	    - add shapes: septagon, pentagon, a_ediamond, rect, rectangle
+	    - introduce "ND_...", "ED_...", "GD_...", node/edge/graph-data
+		accessor macros in partial preparation for use of
+		libagraph in dot.
+	    - add libdotneato.so, dotneato.h, dotneato-config
+		to aid use of dot libraries by user apps based
+	        on installed graphviz-devel rpm and without access
+		to graphviz sources.
+	    - new xdot output format providing detailed drawing instructions
+	    - new -y command line flag, inverts y coordinates
+	    - support multiple -T when -o given, as in:
+			cat xxx.dot | dot -Tpng -Tcmap -o xxx
+		which produces xxx.png and xxx.cmap from a single
+		layout computation.   Intended for use in CGI programs.
+	- agraph
+	    - correct callback ordering for deletions
+	- tools
+	    - add gxl2dot and dot2gxl for GXL language conversions
+	    - gvui now provides *map output
+	- tcldot, tcldgr, tcldgl
+	    - improve tcl8.4 support
+	    - extend search path for tcl.h to include /usr/local/include/tcl8.4/
+		in support of BSD install conventions.
+	- dynagraph
+	    - many fixes
+	    - change to not build dynagraph by default (use --with-dynagraph)
+	- docs
+	    - dotguide updates
+September 27, 2002
+		- declare this version 1.8.10
+	- general
+	    - various configure.in fixes and simplifications
+	    - change configure to now build dynagraph by default
+	    	"--without-dynagraph" is supported
+	    - fix graphviz.spec.in to partition packages properly
+	    	graphviz no longer depends on graphviz-tcl.
+	    -  Makefile.old cleanups
+	    - configure.old now set version number automatically from
+	      configure.in
+	- dot, neato, twopi
+	    - Initial support for image node shapes + URL fetch.
+	    - Made number of dimensions a runtime variable in neato.
+	    - Bug fix in vrmlgen for degenerate splines.
+	    - Bug fix - ordering=in should now work
+	    - Bug fix - layers no numbered from 0 to match PS requirements
+	    - Bug fix - don't draw arrows on invisible edges
+	    - Bug fix - when pack=true and ratio is set
+	    - Bug fix - agraph/scan.l to work with latest flex beta
+
+August 2, 2002
+		- declare this version 1.8.9
+	- general
+	    - split rpm into:
+	        graphviz, graphviz-tcl, graphviz-graphs, graphviz-devel
+	    - gcc3 warning cleanup
+	    - Install lincdt, libgraph, libagraph, libgd, libpathplan, libexp,
+		and libpack so that they can be used by other programs.
+		Headers and man3 in graphviz-devel
+	- dynagraph, graphsearch
+ 	    - New tools based on libagraph and written in C++
+	- dot, neato, twopi
+	    - Add node and edge tooltips for use with -Tcmap
+	    	\N,\E,\H,\T substitutions also work in tooltips.
+	    - Add alt="label_string" to -Tcmap
+	    - Add edge-label and port mappings to -Tps and -Tps2 so
+	        that edges can be hyperlinked in PDF documents.
+	    - Add support for \E (edge name), \H (head-node name),
+	        \T (tail-node name) substitutions in edge labels and edge URLs
+	    - Add support for stylesheet="file.css" for use in -Tsvg
+	    - Fix -Tpic to work with recent gpic (Bruce Lilly)
+	    - Fix alignment of imagemaps to images.
+	    - Fix "transparent" color support in -Tsvg
+	    - Fix support for graph [URL="default.html"] in -Tsvg and -Tcmap.
+	    - Fix '&' escaping in URLs in -Tsvg
+	    - Fix infinite loop in dot layout algorithm
+	    - Fix text rotations again (hopefully freetype is stable now.)
+	    - Cluster layout improvements
+	    - Clean up warning messages from pathplan
+	    - Consolidation of mapping code from imapgen.c and ismapgen.c into mapgen.c
+	- gpr
+	    - Added additional mode to extract components based sharing an
+	        edge or a cluster
+	    - Fix test for getopt
+	- tcl-based tools
+	    - Disable tcl-based tool building if tcl/tk not available
+	        with stubs support.
+	- documentation updates: FAQ, dotguide, dot.1
+July 5, 2002
+	    - declare 1.8.7 a "brown bag" release
+		 and declare this version 1.8.8
+	- remove wrong assert in gdgen.c
+	- fix graph centering in bitmap outputs
+	- provide enough margins
+	- fix line widths after scaling
+		(test with directed/proc3d.dot)
+	- fix text rotations (requires libfreetype.so.6.3.1)
+		(test with directed/NaN.dot)
+July 5, 2002
+	    - declare this version 1.8.7
+	- Fix missing "]" in ihi demo.
+July 2, 2002
+	- Add URL mappings for clusters: svg,svgz,ps,ismap,imap,cmap.
+	- Fix to avoid white edges in bitmap outputs when bgcolor is set.
+	- Improve sizing and position of strings in bitmap outputs
+	  when using builtin fonts (when font file not found).
+	- Fix \N substitution in edge URLs in imap and cmap outputs.
+	- Add -Tcmap for client-side imagemaps.
+	- Generate warnings instead of access violation for EPSF file problems.
+	- Various spline fixes in neato.
+	- Fixes to pack.c
+	- Add feature to ccomps to allow extraction of individual component
+	  by number or node.
+	- Cdt make to use iffe provided in the tools directory.
+	- Various Makefile.old fixes.
+	- Use HAVE_LIBZ to remove GD2 format if libz not available.
+	  Now bare-bones programs can be built without any add-on libraries.
+	- Modified dot grammar to allow simple name attributes in attribute
+	  lists.  Thus, [splines] is equivalent to [splines=true]. Adopted
+	  the same convention for command line attributes -G, -E and -N.
+	  In addition, such command line attributes now override any
+	  competing initial attribute statements.
+	- HP-UX 11.11 build fixes for struct dioattr.
+	- Fix for bug #158 "Nodes disappear with ports"
+	- Various Windows-specific #ifdefs
+	- Fix edge coordinates in -Tplain.
+
+May 24, 2002
+	    - declare this version 1.8.6
+May 19, 2002
+	- Fixed segfault from use of bgcolor in clusters.
+May 15, 2002
+	- Changed install location of architecture-independent demo
+	  scripts and graphs to <prefix>/share/graphviz/ to conform to FHS.
+	- Avoid multiple linking of libfreetype (and others) which caused
+	  problems on SunOS-2.8.
+May 6, 2002
+	- Factored out some duplicated arrow code from dotgen/splines.c
+	  and neatorgen/splines.c into common/arrows.c.
+	- Added new arrow types:  halfopen, box, obox, crow.
+	- Touched up the arrow designs so that they look better at default size.
+	- Modified/extended graphs/directed/newarrows.dot to show new arrows.
+May 3, 2002
+        - Added some UML arrow types from Diomidis Spinellis <[email protected]>
+	  empty, invempty, open, diamond, odiamond.
+May 2, 2002
+	- Added new pack option to neato. This causes each connected component
+	  to be laid out separately, and then the resulting graphs are packed
+	  together in a single layout.
+	- Amended neato to accept new tee arrowhead.
+April 19, 2002
+	- Coords of rectangles changed to left/top right/bottom in -Timap.
+	- Generate COPYING from LICENSE.html during ./authogen.sh,
+	  remove COPYING from CVS.
+April 16, 2002
+	- Minor license file patches.
+	- Corrected one of those reversed flat edge bugs again.
+
+April 11, 2002
+	     - declared this version 1.8.5
+	- various portability fixes
+	- various SVG fixes and optimizations
+April 5, 2002:
+	     - declared this version 1.8.4
+	- SVG renderer:
+		- make graph|node|edge ids unique, particularly for multiedges
+		- put graph|node|edge names in <title>...</title>
+		- use some property inheritance to reduce size of output
+		- fix compile errors when no zlib
+		- updated DTD reference
+	- GD renderer:
+		- Minimal Type1 font support:
+			- look in /usr/lib/X11/fonts/Type1/
+			- look for .pfa or .pfb font files based on fontname
+		- run gdgen.c through dos2unix - problems with gcc on SuSE
+	- fix Mac-OSX build problems:
+		- improve strto[u]ll configure tests
+		- add -fno-common for extern problem
+		- function renamed to avoid conflicts (vis -> visibility)
+		- add configure tests for search.h, malloc.h, getopt.h, errno.h
+		- improve configure tests for FILE struct features
+		- add configure tests for lrand48
+	- add new demo graphs:
+		- graphs/undirected/Heawood.dot
+		- graphs/undirected/Petersen.dot
+	- neato:
+		- fix for -x implementation in neato (Bug 77)
+		- fix spline problem (Bug 87)
+		- fix some divide-by-zero problems
+	- twopi:
+		- fix Bug 117
+		- update man pages for unconnected graphs capability
+	- added arrowhead or arrowtail = tee
+March 22, 2002:
+	- add dotneato/pack code to twopi
+	- add contrib/prune to gnu build and install
+March 20, 2002:
+	    - declared this version 1.8.3
+	- fixed parse error for lines starting with '#' in .dot files
+	- fixed a recently introduced bug that caused failure of:
+		digraph G {  {rank = same;  A -> B; B -> A } }
+	- updated DOCTYPE header in SVG outputs
+	- added dotneato/common/xbuf.[ch] for dynamic string handling
+	  to avoid sprintf buffer overruns.
+	- twopigen - handle special case of graphs with < 3 nodes.
+	- neato - handle point shapes
+	- added fontcolor support to svg
+March 14, 2002:
+	- Fixed bug 109
+	- Removed duplicate definitions for str[n]casecmp
+	- Added missing declarations needed for Windows
+	- Cleaned up warning messages from set but unused variables
+	- Removed use of DOS preprocessor variable; uniformly replaced by MSWIN32
+March 8, 2002:
+	- declared this version 1.8.2
+    - Mainly to fix a missed static buffer problem which trips up the
+      Windows community
+March 1, 2002:
+	- declared this version 1.8.1
+    - Bug fixes reported from user testing of 1.8.0, especially problem
+      with SVG output
+February 25, 2002:
+	- updated dotguide.tex and moved to LaTeX article format
+	- added webdot.cgi perl script, enhanced to accept the same
+	    argument format as John's tcl version (so it can also
+	    serve neato and twopi graph layouts).
+
+February 7, 2002: graphviz-1.8.0 pre
+	- declared this version 1.8.0
+
+February 5, 2002: graphviz-1.7.17-0
+    - various 64bit portability fixes
+    - various bug fixes
+January 2, 2002: graphviz-1.7.16-0
+    - dotneato
+	- fix bugs in -Tps output due to pen/fill color changes
+	- various -Tfig.c fixes
+	- various portability fixes
+December 28, 2001: graphviz-1.7.15-0
+    -dotneato
+        - introduce damping factor into neato's solver
+        - clean up pencolor v fillcolor code so that filled polygons are drawn
+		just once if the renderer is capable (e.g. svg, fig)
+        - complete -Tfig support (xfig format)
+December 11, 2001: graphviz-1.7.14-0
+    -dotneato
+	- add -Tsvgz (compressed SVG) support
+December 11, 2001: graphviz-1.7.13-0
+    - dotneato
+        - fontwidth fixes
+	- remove some potential buffer overruns
+	- escape '&' in SVG, unless it is already part of a UTF entity sequence
+	- recognize Times_New_Roman and Courier_New as default font names.
+	- improve -liconv support in configure
+	- clean up some compiler warnings
+    - dynagraph
+	- change "round" to "ROUND" to avoid conflict with system headers on linux
+December 03, 2001: graphviz-1.7.12-0
+    - dotneato
+        - add -Tplain-ext which includes port identifiers edge records
+	- escape '>' with '&gt;' in edge ids and edge URLs in -Tsvg.
+	- spline fixes
+	- mincross fixes
+	- improved text alignment in nodes - particularly in bitmap outputs.
+	- fixed text scaling problems for 8-bit characters (e.g. umlauts)
+	- add graph lexer and postscript support for extended characters
+    - lefty
+        - fix for X11 displays
+    - pathplan
+        - added workaround for gcc-0.96 bug when "-O2 -mcpu=686 -ffast-math"
+October 22, 2001: graphviz-1.7.11-0
+    - dotneato
+	- svg - fix landscape "y" direction
+	      - fix text rotation (works in batik, not yet in sodipodi or amaya)
+	      - fix linewidth
+	      - fix xmnls:xlink reference
+    - doc
+	- Dot.ref - updated
+    - graphs/directed
+        - newarrows.dot expanded
+	- honda-tokoro.dot added
+October 21, 2001: graphviz-1.7.10-0
+    - lefty & dotty
+	- realign code with EK's master tree.
+	  includes fix for dirty trails when dragging nodes in dotty.
+    - dotneato
+	- svg - kludge escape of "<" & ">" characters in labels.
+    - general
+	- generate doxygen documentation on http://www.graphviz.org/
+August 20, 2001: graphviz-1.7.9-0
+    - general
+	- first release from relocated cvs server
+    - dotneato
+        - fix for abort from spline code
+        - fix for crash from gd tiling code
+August 15, 2001: graphviz-1.7.8-0
+    - general
+        - Update gd to gd-2.0.1 with extensions
+    - dotneato
+        - more spline fixes
+        - add suport for "#rgb" color specification
+        - add twopi layout engine (circular layouts)
+July 13, 2001: graphviz-1.7.7-0
+    - Synchronization release prior to relocating CVS server.
+    - general
+    	- some Makefile fixes for OpenBSD
+	- some FAQ updates
+    - dotneato
+        - self-edge fixes
+        - spline fixes
+    - libgraph
+        - parser fixes
+July 1, 2001: graphviz-1.7.6-3
+    - general
+	- portability fixes (including 14 charater file names !)
+	- memory leak fixes
+	- "make test" targets in graphs/directed, graphs/undirected
+    - configure
+	- add support for building without X11, Tk, Tcl
+	- add hooks for dmalloc and ElectricFence debugging
+    - dotneato
+	- spline fixes
+	- cluster fixes
+	- fix label centering
+	- fix support for graph margins in bitmapped outputs
+	- correction to PostScript preamble
+	- SVG generator improvement - now works with Amaya and SodiPodi
+    - tcldot
+	- now uses Tcl Channels properly for input
+	- fixes for linewidth support
+	- command extensions
+	    - listattributes now accepts list
+	    - queryattributes now accepts list
+	    - setattributes now accepts list
+	    - queryattributevalues - new command
+		- generates list of pairs compatible with setattributes
+    - dotty
+	- passthrough keyboard events
+    - doted
+	- fix resizing problems
+	- add PNG and SVG output formats
+
+April 27, 2001: graphviz-1.7.6
+
+    NEW FEATURES
+
+    Added a collection of graph processing tools:
+
+    acyclic : a filter that takes a directed graph as input
+    and outputs a copy of the graph with sufficient edges
+    reversed to make the graph acyclic.
+
+    ccomps : decomposes graphs into their connected components,
+    printing the components to standard output.
+
+    colorize : is a filter that sets node colors from initial
+    seed values. Colors flow along edges from tail to head.
+
+    gc : a graph analogue to wc in that it prints to standard
+    output the number of nodes, edges, connected components or
+    clusters contained in the input files.
+
+    gpr : a graph stream editor inspired by awk. It copies
+    input graphs to its output, possibly transforming their
+    structure and attributes, creating new graphs, or
+    printing arbitrary information.
+
+    nop : reads a stream of graphs and prints each in
+    pretty-printed (canonical) format on stdout.
+
+    sccmap : decomposes digraphs into strongly connected components
+    and an auxiliary map of the relationship between components.
+
+    tred : computes the transitive reduction of directed graphs,
+    and prints the resulting graphs to standard output. This
+    removes edges implied by transitivity.
+
+    unflatten : is a preprocessor to dot that is used to improve
+    the aspect ratio of graphs having many leaves or disconnected
+    nodes. The usual layout for such a graph is generally very
+    wide or tall. unflatten inserts invisible edges or adjusts
+    the minlen on edges to improve layout compaction.
+
+
+    FIXES
+
+    Add FAQ
+
+    Change PNG default background color from transparent to white
+    because of the difficulty some viewers have with transparency.
+
+    Add support for [color=transparent]
+
+    Fix broken support for specific capitalized fontnames
+    (Times Helvetica Arial Courier)
+
+    Fix broken support for DOTFONTPATH
+
+    Some bitmap font scaling fixes - we're still not happy with
+    bitmap font scaling as some labels still exceed the area
+    allocated by the layout engines.
+
+    Some -Timap fixes for mouse sensitive graphs on web pages
+
+    Some cluster layout fixes
+
+    Fix for [rankdir=LR] problems when using neato layout engine
+
+    Some neato layout fixes
+
+    Updates to unix.dot
+
+    Various OS and distro fixes
+
+
+December 23, 2000: graphviz-1.7.5
+
+   - update to gd-1.8.4 and freetype2
+   - add support for font paths
+
+
+December 15, 2000: graphviz-1.7.4
+    -various cluster fixes
+    -separate support for node fillcolor from pencolor (see dot.1)
+    -add support for dotted and dashed lines to bitmap renderers (PNG, GIF etc)
+    -add support for varying linewidth to bitmap renderers
+    -remove libtcldot dependence on lingdtclft (already statically included)
+    -various fixes to build processes, GNU and non-GNU
+
+
+graphviz-1.7.3 .....
+
+May 3, 2000: removed webdot into its own CVS module and rpm package
+
+April 16, 2000: Use check for "gdImagePng" to make sure that we have
+   recent version of libgd.  <[email protected]>
+
+April 14, 2000: Add Tcldgl and dge demo <[email protected]>
+
+April 14, 2000: Add dynagraph libraries <[email protected]>
+
+April 14, 2000: Flatten directory hierarchy of sources <[email protected]>
+
+April 14, 2000: Fix X11 library detection for lefty:
+	src/configure.in, src/lefty/Makefile.in
+   <[email protected]>
+
+April 14, 2000: Fix pic support:
+	src/dotneato/picgen.c,
+	src/dotneato/emit.c,
+	webdot/tcl/webdot.tcl
+   <Bruce Lilly>
+
+April 7, 2000: Upgrade webdot installation process:
+	webdot/Makefile, webdot/README
+    <[email protected]>
+
+March 13, 2000: Support for virtual hosts in webdot/webdot.tcl, add
+   "puts $skt "Host: $server"     Michael Tillberg <[email protected]>
+
+March 13, 2000: Fix to src/graph/parser.y line 149
+   "if ((e->head == t->node) && !(Agraph_type & AGDIGRAPH)) {"
+   Stephen North  <[email protected]>
+
+March 13, 2000: Use AM_PROG_LIBTOOL instead of AC_PROG_LIBTOOL
+   in configure.in.  John Ellson <[email protected]>
+```
+
+[12.2.1]: https://gitlab.com/graphviz/graphviz/compare/12.2.0...12.2.1
+[12.2.0]: https://gitlab.com/graphviz/graphviz/compare/12.1.2...12.2.0
+[12.1.2]: https://gitlab.com/graphviz/graphviz/compare/12.1.1...12.1.2
+[12.1.1]: https://gitlab.com/graphviz/graphviz/compare/12.1.0...12.1.1
+[12.1.0]: https://gitlab.com/graphviz/graphviz/compare/12.0.0...12.1.0
+[12.0.0]: https://gitlab.com/graphviz/graphviz/compare/11.0.0...12.0.0
+[11.0.0]: https://gitlab.com/graphviz/graphviz/compare/10.0.1...11.0.0
+[10.0.1]: https://gitlab.com/graphviz/graphviz/compare/9.0.0...10.0.1
+[9.0.0]: https://gitlab.com/graphviz/graphviz/compare/8.1.0...9.0.0
+[8.1.0]: https://gitlab.com/graphviz/graphviz/compare/8.0.5...8.1.0
+[8.0.5]: https://gitlab.com/graphviz/graphviz/compare/8.0.3...8.0.5
+[8.0.3]: https://gitlab.com/graphviz/graphviz/compare/8.0.2...8.0.3
+[8.0.2]: https://gitlab.com/graphviz/graphviz/compare/8.0.1...8.0.2
+[8.0.1]: https://gitlab.com/graphviz/graphviz/compare/7.1.0...8.0.1
+[7.1.0]: https://gitlab.com/graphviz/graphviz/compare/7.0.6...7.1.0
+[7.0.6]: https://gitlab.com/graphviz/graphviz/compare/7.0.5...7.0.6
+[7.0.5]: https://gitlab.com/graphviz/graphviz/compare/7.0.4...7.0.5
+[7.0.4]: https://gitlab.com/graphviz/graphviz/compare/7.0.3...7.0.4
+[7.0.3]: https://gitlab.com/graphviz/graphviz/compare/7.0.2...7.0.3
+[7.0.2]: https://gitlab.com/graphviz/graphviz/compare/7.0.1...7.0.2
+[7.0.1]: https://gitlab.com/graphviz/graphviz/compare/7.0.0...7.0.1
+[7.0.0]: https://gitlab.com/graphviz/graphviz/compare/6.0.2...7.0.0
+[6.0.2]: https://gitlab.com/graphviz/graphviz/compare/6.0.1...6.0.2
+[6.0.1]: https://gitlab.com/graphviz/graphviz/compare/5.0.1...6.0.1
+[5.0.1]: https://gitlab.com/graphviz/graphviz/compare/5.0.0...5.0.1
+[5.0.0]: https://gitlab.com/graphviz/graphviz/compare/4.0.0...5.0.0
+[4.0.0]: https://gitlab.com/graphviz/graphviz/compare/3.0.0...4.0.0
+[3.0.0]: https://gitlab.com/graphviz/graphviz/compare/2.50.0...3.0.0
+[2.50.0]: https://gitlab.com/graphviz/graphviz/compare/2.49.3...2.50.0
+[2.49.3]: https://gitlab.com/graphviz/graphviz/compare/2.49.2...2.49.3
+[2.49.2]: https://gitlab.com/graphviz/graphviz/compare/2.49.1...2.49.2
+[2.49.1]: https://gitlab.com/graphviz/graphviz/compare/2.49.0...2.49.1
+[2.49.0]: https://gitlab.com/graphviz/graphviz/compare/2.48.0...2.49.0
+[2.48.0]: https://gitlab.com/graphviz/graphviz/compare/2.47.3...2.48.0
+[2.47.3]: https://gitlab.com/graphviz/graphviz/compare/2.47.2...2.47.3
+[2.47.2]: https://gitlab.com/graphviz/graphviz/compare/2.47.1...2.47.2
+[2.47.1]: https://gitlab.com/graphviz/graphviz/compare/2.47.0...2.47.1
+[2.47.0]: https://gitlab.com/graphviz/graphviz/compare/2.46.1...2.47.0
+[2.46.1]: https://gitlab.com/graphviz/graphviz/compare/2.46.0...2.46.1
+[2.46.0]: https://gitlab.com/graphviz/graphviz/compare/2.44.1...2.46.0
+[2.44.1]: https://gitlab.com/graphviz/graphviz/compare/2.44.0...2.44.1
+[2.44.0]: https://gitlab.com/graphviz/graphviz/compare/2.42.4...2.44.0
+[2.42.4]: https://gitlab.com/graphviz/graphviz/compare/2.42.3...2.42.4
+[2.42.3]: https://gitlab.com/graphviz/graphviz/compare/2.42.2...2.42.3

+ 227 - 0
graphviz.mod/graphviz/COPYING

@@ -0,0 +1,227 @@
+Eclipse Public License - v 1.0
+
+   THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+   PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF
+   THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+   1. DEFINITIONS
+
+   "Contribution" means:
+
+   a) in the case of the initial Contributor, the initial code and
+   documentation distributed under this Agreement, and
+
+   b) in the case of each subsequent Contributor:
+
+   i) changes to the Program, and
+
+   ii) additions to the Program;
+
+   where such changes and/or additions to the Program originate from and
+   are distributed by that particular Contributor. A Contribution
+   'originates' from a Contributor if it was added to the Program by such
+   Contributor itself or anyone acting on such Contributor's behalf.
+   Contributions do not include additions to the Program which: (i) are
+   separate modules of software distributed in conjunction with the
+   Program under their own license agreement, and (ii) are not derivative
+   works of the Program.
+
+   "Contributor" means any person or entity that distributes the Program.
+
+   "Licensed Patents" mean patent claims licensable by a Contributor which
+   are necessarily infringed by the use or sale of its Contribution alone
+   or when combined with the Program.
+
+   "Program" means the Contributions distributed in accordance with this
+   Agreement.
+
+   "Recipient" means anyone who receives the Program under this Agreement,
+   including all Contributors.
+
+   2. GRANT OF RIGHTS
+
+   a) Subject to the terms of this Agreement, each Contributor hereby
+   grants Recipient a non-exclusive, worldwide, royalty-free copyright
+   license to reproduce, prepare derivative works of, publicly display,
+   publicly perform, distribute and sublicense the Contribution of such
+   Contributor, if any, and such derivative works, in source code and
+   object code form.
+
+   b) Subject to the terms of this Agreement, each Contributor hereby
+   grants Recipient a non-exclusive, worldwide, royalty-free patent
+   license under Licensed Patents to make, use, sell, offer to sell,
+   import and otherwise transfer the Contribution of such Contributor, if
+   any, in source code and object code form. This patent license shall
+   apply to the combination of the Contribution and the Program if, at the
+   time the Contribution is added by the Contributor, such addition of the
+   Contribution causes such combination to be covered by the Licensed
+   Patents. The patent license shall not apply to any other combinations
+   which include the Contribution. No hardware per se is licensed
+   hereunder.
+
+   c) Recipient understands that although each Contributor grants the
+   licenses to its Contributions set forth herein, no assurances are
+   provided by any Contributor that the Program does not infringe the
+   patent or other intellectual property rights of any other entity. Each
+   Contributor disclaims any liability to Recipient for claims brought by
+   any other entity based on infringement of intellectual property rights
+   or otherwise. As a condition to exercising the rights and licenses
+   granted hereunder, each Recipient hereby assumes sole responsibility to
+   secure any other intellectual property rights needed, if any. For
+   example, if a third party patent license is required to allow Recipient
+   to distribute the Program, it is Recipient's responsibility to acquire
+   that license before distributing the Program.
+
+   d) Each Contributor represents that to its knowledge it has sufficient
+   copyright rights in its Contribution, if any, to grant the copyright
+   license set forth in this Agreement.
+
+   3. REQUIREMENTS
+
+   A Contributor may choose to distribute the Program in object code form
+   under its own license agreement, provided that:
+
+   a) it complies with the terms and conditions of this Agreement; and
+
+   b) its license agreement:
+
+   i) effectively disclaims on behalf of all Contributors all warranties
+   and conditions, express and implied, including warranties or conditions
+   of title and non-infringement, and implied warranties or conditions of
+   merchantability and fitness for a particular purpose;
+
+   ii) effectively excludes on behalf of all Contributors all liability
+   for damages, including direct, indirect, special, incidental and
+   consequential damages, such as lost profits;
+
+   iii) states that any provisions which differ from this Agreement are
+   offered by that Contributor alone and not by any other party; and
+
+   iv) states that source code for the Program is available from such
+   Contributor, and informs licensees how to obtain it in a reasonable
+   manner on or through a medium customarily used for software exchange.
+
+   When the Program is made available in source code form:
+
+   a) it must be made available under this Agreement; and
+
+   b) a copy of this Agreement must be included with each copy of the
+   Program.
+
+   Contributors may not remove or alter any copyright notices contained
+   within the Program.
+
+   Each Contributor must identify itself as the originator of its
+   Contribution, if any, in a manner that reasonably allows subsequent
+   Recipients to identify the originator of the Contribution.
+
+   4. COMMERCIAL DISTRIBUTION
+
+   Commercial distributors of software may accept certain responsibilities
+   with respect to end users, business partners and the like. While this
+   license is intended to facilitate the commercial use of the Program,
+   the Contributor who includes the Program in a commercial product
+   offering should do so in a manner which does not create potential
+   liability for other Contributors. Therefore, if a Contributor includes
+   the Program in a commercial product offering, such Contributor
+   ("Commercial Contributor") hereby agrees to defend and indemnify every
+   other Contributor ("Indemnified Contributor") against any losses,
+   damages and costs (collectively "Losses") arising from claims, lawsuits
+   and other legal actions brought by a third party against the
+   Indemnified Contributor to the extent caused by the acts or omissions
+   of such Commercial Contributor in connection with its distribution of
+   the Program in a commercial product offering. The obligations in this
+   section do not apply to any claims or Losses relating to any actual or
+   alleged intellectual property infringement. In order to qualify, an
+   Indemnified Contributor must: a) promptly notify the Commercial
+   Contributor in writing of such claim, and b) allow the Commercial
+   Contributor to control, and cooperate with the Commercial Contributor
+   in, the defense and any related settlement negotiations. The
+   Indemnified Contributor may participate in any such claim at its own
+   expense.
+
+   For example, a Contributor might include the Program in a commercial
+   product offering, Product X. That Contributor is then a Commercial
+   Contributor. If that Commercial Contributor then makes performance
+   claims, or offers warranties related to Product X, those performance
+   claims and warranties are such Commercial Contributor's responsibility
+   alone. Under this section, the Commercial Contributor would have to
+   defend claims against the other Contributors related to those
+   performance claims and warranties, and if a court requires any other
+   Contributor to pay any damages as a result, the Commercial Contributor
+   must pay those damages.
+
+   5. NO WARRANTY
+
+   EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+   PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+   KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
+   WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR
+   FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible
+   for determining the appropriateness of using and distributing the
+   Program and assumes all risks associated with its exercise of rights
+   under this Agreement , including but not limited to the risks and costs
+   of program errors, compliance with applicable laws, damage to or loss
+   of data, programs or equipment, and unavailability or interruption of
+   operations.
+
+   6. DISCLAIMER OF LIABILITY
+
+   EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
+   ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+   WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+   DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+   HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+   7. GENERAL
+
+   If any provision of this Agreement is invalid or unenforceable under
+   applicable law, it shall not affect the validity or enforceability of
+   the remainder of the terms of this Agreement, and without further
+   action by the parties hereto, such provision shall be reformed to the
+   minimum extent necessary to make such provision valid and enforceable.
+
+   If Recipient institutes patent litigation against any entity (including
+   a cross-claim or counterclaim in a lawsuit) alleging that the Program
+   itself (excluding combinations of the Program with other software or
+   hardware) infringes such Recipient's patent(s), then such Recipient's
+   rights granted under Section 2(b) shall terminate as of the date such
+   litigation is filed.
+
+   All Recipient's rights under this Agreement shall terminate if it fails
+   to comply with any of the material terms or conditions of this
+   Agreement and does not cure such failure in a reasonable period of time
+   after becoming aware of such noncompliance. If all Recipient's rights
+   under this Agreement terminate, Recipient agrees to cease use and
+   distribution of the Program as soon as reasonably practicable. However,
+   Recipient's obligations under this Agreement and any licenses granted
+   by Recipient relating to the Program shall continue and survive.
+
+   Everyone is permitted to copy and distribute copies of this Agreement,
+   but in order to avoid inconsistency the Agreement is copyrighted and
+   may only be modified in the following manner. The Agreement Steward
+   reserves the right to publish new versions (including revisions) of
+   this Agreement from time to time. No one other than the Agreement
+   Steward has the right to modify this Agreement. The Eclipse Foundation
+   is the initial Agreement Steward. The Eclipse Foundation may assign the
+   responsibility to serve as the Agreement Steward to a suitable separate
+   entity. Each new version of the Agreement will be given a
+   distinguishing version number. The Program (including Contributions)
+   may always be distributed subject to the version of the Agreement under
+   which it was received. In addition, after a new version of the
+   Agreement is published, Contributor may elect to distribute the Program
+   (including its Contributions) under the new version. Except as
+   expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+   rights or licenses to the intellectual property of any Contributor
+   under this Agreement, whether expressly, by implication, estoppel or
+   otherwise. All rights in the Program not expressly granted under this
+   Agreement are reserved.
+
+   This Agreement is governed by the laws of the State of New York and the
+   intellectual property laws of the United States of America. No party to
+   this Agreement will bring a legal action under this Agreement more than
+   one year after the cause of action arose. Each party waives its rights
+   to a jury trial in any resulting litigation.

+ 1 - 0
graphviz.mod/graphviz/ChangeLog

@@ -0,0 +1 @@
+See CHANGELOG.md

+ 2746 - 0
graphviz.mod/graphviz/Doxyfile

@@ -0,0 +1,2746 @@
+# Doxyfile 1.9.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+#
+# Note:
+#
+# Use doxygen to compare the used configuration file with the template
+# configuration file:
+# doxygen -x [configFile]
+# Use doxygen to compare the used configuration file with the template
+# configuration file without replacing the environment variables or CMake type
+# replacement variables:
+# doxygen -x_noenv [configFile]
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the configuration
+# file that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME           = Graphviz
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER         = 12.2.1
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          =
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO           =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = ./public
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096
+# sub-directories (in 2 levels) under the output directory of each output format
+# and will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to
+# control the number of sub-directories.
+# The default value is: NO.
+
+CREATE_SUBDIRS         = NO
+
+# Controls the number of sub-directories that will be created when
+# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every
+# level increment doubles the number of directories, resulting in 4096
+# directories at level 8 which is the default and also the maximum value. The
+# sub-directories are organized in 2 levels, the first level always has a fixed
+# number of 16 directories.
+# Minimum value: 0, maximum value: 8, default value: 8.
+# This tag requires that the tag CREATE_SUBDIRS is set to YES.
+
+CREATE_SUBDIRS_LEVEL   = 8
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES    = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian,
+# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English
+# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek,
+# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with
+# English messages), Korean, Korean-en (Korean with English messages), Latvian,
+# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese,
+# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish,
+# Swedish, Turkish, Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF           = NO
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES        = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH        = .
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line
+# such as
+# /***************
+# as being the beginning of a Javadoc-style comment "banner". If set to NO, the
+# Javadoc-style will behave just like regular comments and it will not be
+# interpreted by doxygen.
+# The default value is: NO.
+
+JAVADOC_BANNER         = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# By default Python docstrings are displayed as preformatted text and doxygen's
+# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the
+# doxygen's special commands can be used and the contents of the docstring
+# documentation blocks is shown as doxygen documentation.
+# The default value is: YES.
+
+PYTHON_DOCSTRING       = YES
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:^^"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". Note that you cannot put \n's in the value part of an alias
+# to insert newlines (in the resulting output). You can put ^^ in the value part
+# of an alias to insert a newline as if a physical newline was in the original
+# file. When you need a literal { or } or , in the value part of an alias you
+# have to escape them by means of a backslash (\), this can lead to conflicts
+# with the commands \{ and \} for these it is advised to use the version @{ and
+# @} or use a double escape (\\{ and \\})
+
+ALIASES                =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C  = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice
+# sources only. Doxygen will then generate output that is more tailored for that
+# language. For instance, namespaces will be presented as modules, types will be
+# separated into more groups, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_SLICE  = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
+# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice,
+# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
+# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
+# tries to guess whether the code is fixed or free formatted code, this is the
+# default for Fortran type files). For instance to make doxygen treat .inc files
+# as Fortran files (default is PHP), and .f files as C (default is Fortran),
+# use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen. When specifying no_extension you should add
+# * to the FILE_PATTERNS.
+#
+# Note see also the list of default file extension mappings.
+
+EXTENSION_MAPPING      = y=C
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See https://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
+# to that level are automatically included in the table of contents, even if
+# they do not have an id attribute.
+# Note: This feature currently applies only to Markdown headings.
+# Minimum value: 0, maximum value: 99, default value: 5.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+TOC_INCLUDE_HEADINGS   = 5
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
+# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use
+# during processing. When set to 0 doxygen will based this on the number of
+# cores available in the system. You can set it explicitly to a value larger
+# than 0 to get more control over the balance between CPU load and processing
+# speed. At this moment only the input processing can be done using multiple
+# threads. Since this is still an experimental feature the default is set to 1,
+# which effectively disables parallel processing. Please report any issues you
+# encounter. Generating dot graphs in parallel is controlled by the
+# DOT_NUM_THREADS setting.
+# Minimum value: 0, maximum value: 32, default value: 1.
+
+NUM_PROC_THREADS       = 1
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual
+# methods of a class will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIV_VIRTUAL   = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC         = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If this flag is set to YES, the name of an unnamed parameter in a declaration
+# will be determined by the corresponding definition. By default unnamed
+# parameters remain unnamed in the output.
+# The default value is: YES.
+
+RESOLVE_UNNAMED_PARAMS = YES
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# will also hide undocumented C++ concepts if enabled. This option has no effect
+# if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# declarations. If set to NO, these declarations will be included in the
+# documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS          = NO
+
+# With the correct setting of option CASE_SENSE_NAMES doxygen will better be
+# able to match the capabilities of the underlying filesystem. In case the
+# filesystem is case sensitive (i.e. it supports files in the same directory
+# whose names only differ in casing), the option must be set to YES to properly
+# deal with such files in case they appear in the input. For filesystems that
+# are not case sensitive the option should be set to NO to properly deal with
+# output files written for symbols that only differ in casing, such as for two
+# classes, one named CLASS and the other named Class, and to also support
+# references to files without having to specify the exact matching casing. On
+# Windows (including Cygwin) and MacOS, users should typically set this option
+# to NO, whereas on Linux or other Unix flavors it should typically be set to
+# YES.
+# Possible values are: SYSTEM, NO and YES.
+# The default value is: SYSTEM.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class
+# will show which file needs to be included to use the class.
+# The default value is: YES.
+
+SHOW_HEADERFILE        = YES
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file. See also section "Changing the
+# layout of pages" for information.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES         =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS               = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as documenting some parameters in
+# a documented function twice, or documenting parameters that don't exist or
+# using markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR      = YES
+
+# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete
+# function parameter documentation. If set to NO, doxygen will accept that some
+# parameters have no documentation without warning.
+# The default value is: YES.
+
+WARN_IF_INCOMPLETE_DOC = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong parameter
+# documentation, but not about the absence of documentation. If EXTRACT_ALL is
+# set to YES then this flag will automatically be disabled. See also
+# WARN_IF_INCOMPLETE_DOC
+# The default value is: NO.
+
+WARN_NO_PARAMDOC       = NO
+
+# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about
+# undocumented enumeration values. If set to NO, doxygen will accept
+# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: NO.
+
+WARN_IF_UNDOC_ENUM_VAL = NO
+
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS
+# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but
+# at the end of the doxygen process doxygen will return with a non-zero status.
+# Possible values are: NO, YES and FAIL_ON_WARNINGS.
+# The default value is: NO.
+
+WARN_AS_ERROR          = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# See also: WARN_LINE_FORMAT
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT            =
+
+# In the $text part of the WARN_FORMAT command it is possible that a reference
+# to a more specific place is given. To make it easier to jump to this place
+# (outside of doxygen) the user can define a custom "cut" / "paste" string.
+# Example:
+# WARN_LINE_FORMAT = "'vi $file +$line'"
+# See also: WARN_FORMAT
+# The default value is: at line $line of file $file.
+
+WARN_LINE_FORMAT       = "at line $line of file $file"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr). In case the file specified cannot be opened for writing the
+# warning and error messages are written to standard error. When as file - is
+# specified the warning and error messages are written to standard output
+# (stdout).
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+# Include root directory `graphviz` into the doxygen
+# because doxygen builds directory dependency graphs only for root children,
+# but not for root directory itself.
+
+INPUT                  = ./cmd \
+                         ./lib \
+                         ./dot.demo \
+                         ./plugin \
+                         ./tclpkg
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see:
+# https://www.gnu.org/software/libiconv/) for the list of possible encodings.
+# See also: INPUT_FILE_ENCODING
+# The default value is: UTF-8.
+
+INPUT_ENCODING         = UTF-8
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify
+# character encoding on a per file pattern basis. Doxygen will compare the file
+# name with each pattern and apply the encoding instead of the default
+# INPUT_ENCODING) if there is a match. The character encodings are a list of the
+# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding
+# "INPUT_ENCODING" for further information on supported encodings.
+
+INPUT_FILE_ENCODING    =
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# Note the list of default checked file patterns might differ from the list of
+# default file extension mappings.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml,
+# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C
+# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd,
+# *.vhdl, *.ucf, *.qsf and *.ice.
+
+FILE_PATTERNS          = *.c \
+                         *.cpp \
+                         *.h \
+                         *.l \
+                         *.y
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE              = yes
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# ANamespace::AClass, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that doxygen will use the data processed and written to standard output
+# for further processing, therefore nothing else, like debug statements or used
+# commands (so in case of a Windows batch file always use @echo OFF), should be
+# written to standard output.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+# The Fortran standard specifies that for fixed formatted Fortran code all
+# characters from position 72 are to be considered as comment. A common
+# extension is to allow longer lines before the automatic comment starts. The
+# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can
+# be processed before the automatic comment starts.
+# Minimum value: 7, maximum value: 10000, default value: 72.
+
+FORTRAN_COMMENT_AFTER  = 72
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER         = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# entity all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION    = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see https://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS       = YES
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
+# clang parser (see:
+# http://clang.llvm.org/) for more accurate parsing at the cost of reduced
+# performance. This can be particularly helpful with template rich C++ code for
+# which doxygen's built-in parser lacks the necessary type information.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse_libclang=ON option for CMake.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS
+# tag is set to YES then doxygen will add the directory of each input to the
+# include path.
+# The default value is: YES.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_ADD_INC_PATHS    = YES
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS          =
+
+# If clang assisted parsing is enabled you can provide the clang parser with the
+# path to the directory containing a file called compile_commands.json. This
+# file is the compilation database (see:
+# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the
+# options used when the source files were built. This is equivalent to
+# specifying the -p option to a clang tool, such as clang-check. These options
+# will then be passed to the parser. Any options specified with CLANG_OPTIONS
+# will be added as well.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse_libclang=ON option for CMake.
+
+CLANG_DATABASE_PATH    =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX     = YES
+
+# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes)
+# that should be ignored while generating the index headers. The IGNORE_PREFIX
+# tag works for classes, function and member names. The entity will be placed in
+# the alphabetical list under the first letter of the entity name that remains
+# after removing the prefix.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT            = doxygen
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# Note: Since the styling of scrollbars can currently not be overruled in
+# Webkit/Chromium, the styling will be left out of the default doxygen.css if
+# one or more extra stylesheets have been specified. So if scrollbar
+# customization is desired it has to be added explicitly. For an example see the
+# documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output
+# should be rendered with a dark or light theme.
+# Possible values are: LIGHT always generate light mode output, DARK always
+# generate dark mode output, AUTO_LIGHT automatically set the mode according to
+# the user preference, use light mode if no preference is set (the default),
+# AUTO_DARK automatically set the mode according to the user preference, use
+# dark mode if no preference is set and TOGGLE allow to user to switch between
+# light and dark mode via a button.
+# The default value is: AUTO_LIGHT.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE        = AUTO_LIGHT
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a color-wheel, see
+# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use gray-scales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = NO
+
+# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
+# documentation will contain a main index with vertical navigation menus that
+# are dynamically created via JavaScript. If disabled, the navigation index will
+# consists of multiple levels of tabs that are statically embedded in every HTML
+# page. Disable this option to support browsers that do not have JavaScript,
+# like the Qt help browser.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_MENUS     = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see:
+# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To
+# create a documentation set, doxygen will generate a Makefile in the HTML
+# output directory. Running make will produce the docset in that directory and
+# running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
+# genXcode/_index.html for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag determines the URL of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDURL         =
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# on Windows. In the beginning of 2021 Microsoft took the original page, with
+# a.o. the download links, offline the HTML help workshop was already many years
+# in maintenance mode). You can download the HTML help workshop from the web
+# archives at Installation executable (see:
+# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo
+# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe).
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP      = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE               =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION           =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the main .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI           = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING     =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          =
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# The QHG_LOCATION tag can be used to specify the location (absolute path
+# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to
+# run qhelpgenerator on the generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX          = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine tune the look of the index (see "Fine-tuning the output"). As an
+# example, the default style sheet generated by doxygen has an example that
+# shows how to put an image at the root of the tree instead of the PROJECT_NAME.
+# Since the tree basically has the same information as the tab index, you could
+# consider setting DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW      = yes
+
+# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the
+# FULL_SIDEBAR option determines if the side bar is limited to only the treeview
+# area (value NO) or if it should extend to the full height of the window (value
+# YES). Setting this to YES gives a layout similar to
+# https://docs.readthedocs.io with more room for contents, but less room for the
+# project logo, title, and description. If either GENERATE_TREEVIEW or
+# DISABLE_INDEX is set to NO, this option has no effect.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FULL_SIDEBAR           = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH         = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email
+# addresses.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+OBFUSCATE_EMAILS       = YES
+
+# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg
+# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
+# https://inkscape.org) to generate formulas as SVG images instead of PNGs for
+# the HTML output. These images will generally look nicer at scaled resolutions.
+# Possible values are: png (the default) and svg (looks nicer but requires the
+# pdf2svg or inkscape tool).
+# The default value is: png.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FORMULA_FORMAT    = png
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE       = 10
+
+# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
+# to create new LaTeX commands to be used in formulas as building blocks. See
+# the section "Including formulas" for details.
+
+FORMULA_MACROFILE      =
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# https://www.mathjax.org) which uses client side JavaScript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# With MATHJAX_VERSION it is possible to specify the MathJax version to be used.
+# Note that the different versions of MathJax have different requirements with
+# regards to the different settings, so it is possible that also other MathJax
+# settings have to be changed when switching between the different MathJax
+# versions.
+# Possible values are: MathJax_2 and MathJax_3.
+# The default value is: MathJax_2.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_VERSION        = MathJax_2
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. For more details about the output format see MathJax
+# version 2 (see:
+# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3
+# (see:
+# http://docs.mathjax.org/en/latest/web/components/output.html).
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility. This is the name for Mathjax version 2, for MathJax version 3
+# this will be translated into chtml), NativeMML (i.e. MathML. Only supported
+# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This
+# is the name for Mathjax version 3, for MathJax version 2 this will be
+# translated into HTML-CSS) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from https://www.mathjax.org before deployment. The default value is:
+# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2
+# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        =
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# for MathJax version 2 (see
+# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions):
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# For example for MathJax version 3 (see
+# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html):
+# MATHJAX_EXTENSIONS = ams
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see:
+# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE           = yes
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using JavaScript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see:
+# https://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see:
+# https://xapian.org/). See the section "External Indexing and Searching" for
+# details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT           =
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when not enabling USE_PDFLATEX the default is latex when enabling
+# USE_PDFLATEX the default is pdflatex and when in the later case latex is
+# chosen this is overwritten by pdflatex. For specific output languages the
+# default can have been set differently, this depends on the implementation of
+# the output language.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# Note: This tag is used in the Makefile / make.bat.
+# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file
+# (.tex).
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
+# generate index for LaTeX. In case there is no backslash (\) as first character
+# it will be automatically added in the LaTeX code.
+# Note: This tag is used in the generated output file (.tex).
+# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat.
+# The default value is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_MAKEINDEX_CMD    = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for
+# the generated LaTeX document. The header should contain everything until the
+# first chapter. If it is left blank doxygen will generate a standard header. It
+# is highly recommended to start with a default header using
+# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty
+# and then modify the file new_header.tex. See also section "Doxygen usage" for
+# information on how to generate the default header that doxygen normally uses.
+#
+# Note: Only use a user-defined header if you know what you are doing!
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. The following
+# commands have a special meaning inside the header (and footer): For a
+# description of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for
+# the generated LaTeX document. The footer should contain everything after the
+# last chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer. See also section "Doxygen
+# usage" for information on how to generate the default footer that doxygen
+# normally uses. Note: Only use a user-defined footer if you know what you are
+# doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER           =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES      =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS         = NO
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as
+# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX
+# files. Set this option to YES, to get a higher quality PDF documentation.
+#
+# See also section LATEX_CMD_NAME for selecting the engine.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX           = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE        = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES     = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP        = NO
+
+# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
+# path from which the emoji images will be read. If a relative path is entered,
+# it will be relative to the LATEX_OUTPUT directory. If left blank the
+# LATEX_OUTPUT directory will be used.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EMOJI_DIRECTORY  =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT             =
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# configuration file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's configuration file. A template extensions file can be
+# generated using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT             =
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION          =
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT             = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING     = YES
+
+# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include
+# namespace members in file scope as well, matching the HTML output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_NS_MEMB_FILE_SCOPE = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK       = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
+# the structure of the code including all documentation. Note that this feature
+# is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION        = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF     = YES
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of
+# RECURSIVE has no effect here.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED             = "PRINTF_LIKE(x,y)=" \
+                         CGRAPH_API \
+                         EXTERN \
+                         GLOBALS_API \
+                         GVC_API \
+                         GVPLUGIN_LOADIMAGE_API \
+                         GVPR_API \
+                         PACK_API \
+                         PATHGEOM_API \
+                         PATHPLAN_API \
+                         RENDER_API \
+                         UTILS_API \
+			 CGHDR_API \
+                         XDOT_API
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS        = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH               =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT               = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 0
+
+# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of
+# subgraphs. When you want a differently looking font in the dot files that
+# doxygen generates you can specify fontname, fontcolor and fontsize attributes.
+# For details please see <a href=https://graphviz.org/doc/info/attrs.html>Node,
+# Edge and Graph Attributes specification</a> You need to make sure dot is able
+# to find the font, which can be done by putting it in a standard location or by
+# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
+# directory containing the font. Default graphviz fontsize is 14.
+# The default value is: fontname=Helvetica,fontsize=10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_COMMON_ATTR        = fontname=\"Helvetica,Arial,sans-serif\"
+
+# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can
+# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. <a
+# href=https://graphviz.org/doc/info/arrows.html>Complete documentation about
+# arrows shapes.</a>
+# The default value is: labelfontname=Helvetica,labelfontsize=10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_EDGE_ATTR          = labelfontsize=10 arrowhead=open arrowtail=open arrowsize=0.5
+
+# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes
+# around nodes set 'shape=plain' or 'shape=plaintext' <a
+# href=https://www.graphviz.org/doc/info/shapes.html>Shapes specification</a>
+# The default value is: shape=box,height=0.2,width=0.4.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NODE_ATTR          = fontsize=12 shape=plaintext
+
+# You can set the path where dot can find font specified with fontname in
+# DOT_COMMON_ATTR and others dot attributes.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a
+# graph for each documented class showing the direct and indirect inheritance
+# relations. In case HAVE_DOT is set as well dot will be used to draw the graph,
+# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set
+# to TEXT the direct and indirect inheritance relations will be shown as texts /
+# links.
+# Possible values are: NO, YES, TEXT and GRAPH.
+# The default value is: YES.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies. See also the chapter Grouping
+# in the manual.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK               = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag UML_LOOK is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and
+# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS
+# tag is set to YES, doxygen will add type and arguments for attributes and
+# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen
+# will not generate fields with class member information in the UML graphs. The
+# class diagrams will look similar to the default class diagrams but using UML
+# notation for the relationships.
+# Possible values are: NO, YES and NONE.
+# The default value is: NO.
+# This tag requires that the tag UML_LOOK is set to YES.
+
+DOT_UML_DETAILS        = NO
+
+# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters
+# to display on a single line. If the actual line length exceeds this threshold
+# significantly it will wrapped across multiple lines. Some heuristics are apply
+# to avoid ugly line breaks.
+# Minimum value: 0, maximum value: 1000, default value: 17.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_WRAP_THRESHOLD     = 17
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH          = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH             = yes
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH           = yes
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH        = YES
+
+# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels
+# of child directories generated in directory dependency graphs by dot.
+# Minimum value: 1, maximum value: 25, default value: 1.
+# This tag requires that the tag DIRECTORY_GRAPH is set to YES.
+
+DIR_GRAPH_MAX_DEPTH    = 1
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT       = svg
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS           =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file or to the filename of jar file
+# to be used. If left blank, it is assumed PlantUML is not used or called during
+# a preprocessing step. Doxygen will generate a warning when it encounters a
+# \startuml command in this case and will not generate output for the diagram.
+
+PLANTUML_JAR_PATH      =
+
+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
+# configuration file for plantuml.
+
+PLANTUML_CFG_FILE      =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH  =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES    = 100
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS      = YES
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal
+# graphical representation for inheritance and collaboration diagrams is used.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate
+# files that are used to generate the various graphs.
+#
+# Note: This setting is not only used for dot files but also for msc temporary
+# files.
+# The default value is: YES.
+
+DOT_CLEANUP            = NO

+ 2746 - 0
graphviz.mod/graphviz/Doxyfile.in

@@ -0,0 +1,2746 @@
+# Doxyfile 1.9.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+#
+# Note:
+#
+# Use doxygen to compare the used configuration file with the template
+# configuration file:
+# doxygen -x [configFile]
+# Use doxygen to compare the used configuration file with the template
+# configuration file without replacing the environment variables or CMake type
+# replacement variables:
+# doxygen -x_noenv [configFile]
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the configuration
+# file that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME           = Graphviz
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER         = @VERSION@
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          =
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO           =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = @top_builddir@/public
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096
+# sub-directories (in 2 levels) under the output directory of each output format
+# and will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to
+# control the number of sub-directories.
+# The default value is: NO.
+
+CREATE_SUBDIRS         = NO
+
+# Controls the number of sub-directories that will be created when
+# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every
+# level increment doubles the number of directories, resulting in 4096
+# directories at level 8 which is the default and also the maximum value. The
+# sub-directories are organized in 2 levels, the first level always has a fixed
+# number of 16 directories.
+# Minimum value: 0, maximum value: 8, default value: 8.
+# This tag requires that the tag CREATE_SUBDIRS is set to YES.
+
+CREATE_SUBDIRS_LEVEL   = 8
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES    = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian,
+# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English
+# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek,
+# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with
+# English messages), Korean, Korean-en (Korean with English messages), Latvian,
+# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese,
+# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish,
+# Swedish, Turkish, Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF           = NO
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES        = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH        = .
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line
+# such as
+# /***************
+# as being the beginning of a Javadoc-style comment "banner". If set to NO, the
+# Javadoc-style will behave just like regular comments and it will not be
+# interpreted by doxygen.
+# The default value is: NO.
+
+JAVADOC_BANNER         = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# By default Python docstrings are displayed as preformatted text and doxygen's
+# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the
+# doxygen's special commands can be used and the contents of the docstring
+# documentation blocks is shown as doxygen documentation.
+# The default value is: YES.
+
+PYTHON_DOCSTRING       = YES
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:^^"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". Note that you cannot put \n's in the value part of an alias
+# to insert newlines (in the resulting output). You can put ^^ in the value part
+# of an alias to insert a newline as if a physical newline was in the original
+# file. When you need a literal { or } or , in the value part of an alias you
+# have to escape them by means of a backslash (\), this can lead to conflicts
+# with the commands \{ and \} for these it is advised to use the version @{ and
+# @} or use a double escape (\\{ and \\})
+
+ALIASES                =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C  = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice
+# sources only. Doxygen will then generate output that is more tailored for that
+# language. For instance, namespaces will be presented as modules, types will be
+# separated into more groups, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_SLICE  = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
+# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice,
+# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
+# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
+# tries to guess whether the code is fixed or free formatted code, this is the
+# default for Fortran type files). For instance to make doxygen treat .inc files
+# as Fortran files (default is PHP), and .f files as C (default is Fortran),
+# use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen. When specifying no_extension you should add
+# * to the FILE_PATTERNS.
+#
+# Note see also the list of default file extension mappings.
+
+EXTENSION_MAPPING      = y=C
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See https://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
+# to that level are automatically included in the table of contents, even if
+# they do not have an id attribute.
+# Note: This feature currently applies only to Markdown headings.
+# Minimum value: 0, maximum value: 99, default value: 5.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+TOC_INCLUDE_HEADINGS   = 5
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
+# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use
+# during processing. When set to 0 doxygen will based this on the number of
+# cores available in the system. You can set it explicitly to a value larger
+# than 0 to get more control over the balance between CPU load and processing
+# speed. At this moment only the input processing can be done using multiple
+# threads. Since this is still an experimental feature the default is set to 1,
+# which effectively disables parallel processing. Please report any issues you
+# encounter. Generating dot graphs in parallel is controlled by the
+# DOT_NUM_THREADS setting.
+# Minimum value: 0, maximum value: 32, default value: 1.
+
+NUM_PROC_THREADS       = 1
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual
+# methods of a class will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIV_VIRTUAL   = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC         = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If this flag is set to YES, the name of an unnamed parameter in a declaration
+# will be determined by the corresponding definition. By default unnamed
+# parameters remain unnamed in the output.
+# The default value is: YES.
+
+RESOLVE_UNNAMED_PARAMS = YES
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# will also hide undocumented C++ concepts if enabled. This option has no effect
+# if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# declarations. If set to NO, these declarations will be included in the
+# documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS          = NO
+
+# With the correct setting of option CASE_SENSE_NAMES doxygen will better be
+# able to match the capabilities of the underlying filesystem. In case the
+# filesystem is case sensitive (i.e. it supports files in the same directory
+# whose names only differ in casing), the option must be set to YES to properly
+# deal with such files in case they appear in the input. For filesystems that
+# are not case sensitive the option should be set to NO to properly deal with
+# output files written for symbols that only differ in casing, such as for two
+# classes, one named CLASS and the other named Class, and to also support
+# references to files without having to specify the exact matching casing. On
+# Windows (including Cygwin) and MacOS, users should typically set this option
+# to NO, whereas on Linux or other Unix flavors it should typically be set to
+# YES.
+# Possible values are: SYSTEM, NO and YES.
+# The default value is: SYSTEM.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class
+# will show which file needs to be included to use the class.
+# The default value is: YES.
+
+SHOW_HEADERFILE        = YES
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file. See also section "Changing the
+# layout of pages" for information.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES         =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS               = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as documenting some parameters in
+# a documented function twice, or documenting parameters that don't exist or
+# using markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR      = YES
+
+# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete
+# function parameter documentation. If set to NO, doxygen will accept that some
+# parameters have no documentation without warning.
+# The default value is: YES.
+
+WARN_IF_INCOMPLETE_DOC = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong parameter
+# documentation, but not about the absence of documentation. If EXTRACT_ALL is
+# set to YES then this flag will automatically be disabled. See also
+# WARN_IF_INCOMPLETE_DOC
+# The default value is: NO.
+
+WARN_NO_PARAMDOC       = NO
+
+# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about
+# undocumented enumeration values. If set to NO, doxygen will accept
+# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: NO.
+
+WARN_IF_UNDOC_ENUM_VAL = NO
+
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS
+# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but
+# at the end of the doxygen process doxygen will return with a non-zero status.
+# Possible values are: NO, YES and FAIL_ON_WARNINGS.
+# The default value is: NO.
+
+WARN_AS_ERROR          = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# See also: WARN_LINE_FORMAT
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT            =
+
+# In the $text part of the WARN_FORMAT command it is possible that a reference
+# to a more specific place is given. To make it easier to jump to this place
+# (outside of doxygen) the user can define a custom "cut" / "paste" string.
+# Example:
+# WARN_LINE_FORMAT = "'vi $file +$line'"
+# See also: WARN_FORMAT
+# The default value is: at line $line of file $file.
+
+WARN_LINE_FORMAT       = "at line $line of file $file"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr). In case the file specified cannot be opened for writing the
+# warning and error messages are written to standard error. When as file - is
+# specified the warning and error messages are written to standard output
+# (stdout).
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+# Include root directory `graphviz` into the doxygen
+# because doxygen builds directory dependency graphs only for root children,
+# but not for root directory itself.
+
+INPUT                  = @top_srcdir@/cmd \
+                         @top_srcdir@/lib \
+                         @top_srcdir@/dot.demo \
+                         @top_srcdir@/plugin \
+                         @top_srcdir@/tclpkg
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see:
+# https://www.gnu.org/software/libiconv/) for the list of possible encodings.
+# See also: INPUT_FILE_ENCODING
+# The default value is: UTF-8.
+
+INPUT_ENCODING         = UTF-8
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify
+# character encoding on a per file pattern basis. Doxygen will compare the file
+# name with each pattern and apply the encoding instead of the default
+# INPUT_ENCODING) if there is a match. The character encodings are a list of the
+# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding
+# "INPUT_ENCODING" for further information on supported encodings.
+
+INPUT_FILE_ENCODING    =
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# Note the list of default checked file patterns might differ from the list of
+# default file extension mappings.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml,
+# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C
+# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd,
+# *.vhdl, *.ucf, *.qsf and *.ice.
+
+FILE_PATTERNS          = *.c \
+                         *.cpp \
+                         *.h \
+                         *.l \
+                         *.y
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE              = yes
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# ANamespace::AClass, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that doxygen will use the data processed and written to standard output
+# for further processing, therefore nothing else, like debug statements or used
+# commands (so in case of a Windows batch file always use @echo OFF), should be
+# written to standard output.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+# The Fortran standard specifies that for fixed formatted Fortran code all
+# characters from position 72 are to be considered as comment. A common
+# extension is to allow longer lines before the automatic comment starts. The
+# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can
+# be processed before the automatic comment starts.
+# Minimum value: 7, maximum value: 10000, default value: 72.
+
+FORTRAN_COMMENT_AFTER  = 72
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER         = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# entity all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION    = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see https://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS       = YES
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
+# clang parser (see:
+# http://clang.llvm.org/) for more accurate parsing at the cost of reduced
+# performance. This can be particularly helpful with template rich C++ code for
+# which doxygen's built-in parser lacks the necessary type information.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse_libclang=ON option for CMake.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS
+# tag is set to YES then doxygen will add the directory of each input to the
+# include path.
+# The default value is: YES.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_ADD_INC_PATHS    = YES
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS          =
+
+# If clang assisted parsing is enabled you can provide the clang parser with the
+# path to the directory containing a file called compile_commands.json. This
+# file is the compilation database (see:
+# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the
+# options used when the source files were built. This is equivalent to
+# specifying the -p option to a clang tool, such as clang-check. These options
+# will then be passed to the parser. Any options specified with CLANG_OPTIONS
+# will be added as well.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse_libclang=ON option for CMake.
+
+CLANG_DATABASE_PATH    =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX     = YES
+
+# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes)
+# that should be ignored while generating the index headers. The IGNORE_PREFIX
+# tag works for classes, function and member names. The entity will be placed in
+# the alphabetical list under the first letter of the entity name that remains
+# after removing the prefix.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT            = doxygen
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# Note: Since the styling of scrollbars can currently not be overruled in
+# Webkit/Chromium, the styling will be left out of the default doxygen.css if
+# one or more extra stylesheets have been specified. So if scrollbar
+# customization is desired it has to be added explicitly. For an example see the
+# documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output
+# should be rendered with a dark or light theme.
+# Possible values are: LIGHT always generate light mode output, DARK always
+# generate dark mode output, AUTO_LIGHT automatically set the mode according to
+# the user preference, use light mode if no preference is set (the default),
+# AUTO_DARK automatically set the mode according to the user preference, use
+# dark mode if no preference is set and TOGGLE allow to user to switch between
+# light and dark mode via a button.
+# The default value is: AUTO_LIGHT.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE        = AUTO_LIGHT
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a color-wheel, see
+# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use gray-scales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = NO
+
+# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
+# documentation will contain a main index with vertical navigation menus that
+# are dynamically created via JavaScript. If disabled, the navigation index will
+# consists of multiple levels of tabs that are statically embedded in every HTML
+# page. Disable this option to support browsers that do not have JavaScript,
+# like the Qt help browser.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_MENUS     = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see:
+# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To
+# create a documentation set, doxygen will generate a Makefile in the HTML
+# output directory. Running make will produce the docset in that directory and
+# running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
+# genXcode/_index.html for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag determines the URL of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDURL         =
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# on Windows. In the beginning of 2021 Microsoft took the original page, with
+# a.o. the download links, offline the HTML help workshop was already many years
+# in maintenance mode). You can download the HTML help workshop from the web
+# archives at Installation executable (see:
+# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo
+# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe).
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP      = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE               =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION           =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the main .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI           = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING     =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          =
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# The QHG_LOCATION tag can be used to specify the location (absolute path
+# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to
+# run qhelpgenerator on the generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX          = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine tune the look of the index (see "Fine-tuning the output"). As an
+# example, the default style sheet generated by doxygen has an example that
+# shows how to put an image at the root of the tree instead of the PROJECT_NAME.
+# Since the tree basically has the same information as the tab index, you could
+# consider setting DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW      = yes
+
+# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the
+# FULL_SIDEBAR option determines if the side bar is limited to only the treeview
+# area (value NO) or if it should extend to the full height of the window (value
+# YES). Setting this to YES gives a layout similar to
+# https://docs.readthedocs.io with more room for contents, but less room for the
+# project logo, title, and description. If either GENERATE_TREEVIEW or
+# DISABLE_INDEX is set to NO, this option has no effect.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FULL_SIDEBAR           = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH         = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email
+# addresses.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+OBFUSCATE_EMAILS       = YES
+
+# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg
+# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
+# https://inkscape.org) to generate formulas as SVG images instead of PNGs for
+# the HTML output. These images will generally look nicer at scaled resolutions.
+# Possible values are: png (the default) and svg (looks nicer but requires the
+# pdf2svg or inkscape tool).
+# The default value is: png.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FORMULA_FORMAT    = png
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE       = 10
+
+# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
+# to create new LaTeX commands to be used in formulas as building blocks. See
+# the section "Including formulas" for details.
+
+FORMULA_MACROFILE      =
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# https://www.mathjax.org) which uses client side JavaScript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# With MATHJAX_VERSION it is possible to specify the MathJax version to be used.
+# Note that the different versions of MathJax have different requirements with
+# regards to the different settings, so it is possible that also other MathJax
+# settings have to be changed when switching between the different MathJax
+# versions.
+# Possible values are: MathJax_2 and MathJax_3.
+# The default value is: MathJax_2.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_VERSION        = MathJax_2
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. For more details about the output format see MathJax
+# version 2 (see:
+# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3
+# (see:
+# http://docs.mathjax.org/en/latest/web/components/output.html).
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility. This is the name for Mathjax version 2, for MathJax version 3
+# this will be translated into chtml), NativeMML (i.e. MathML. Only supported
+# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This
+# is the name for Mathjax version 3, for MathJax version 2 this will be
+# translated into HTML-CSS) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from https://www.mathjax.org before deployment. The default value is:
+# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2
+# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        =
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# for MathJax version 2 (see
+# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions):
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# For example for MathJax version 3 (see
+# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html):
+# MATHJAX_EXTENSIONS = ams
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see:
+# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE           = yes
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using JavaScript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see:
+# https://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see:
+# https://xapian.org/). See the section "External Indexing and Searching" for
+# details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT           =
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when not enabling USE_PDFLATEX the default is latex when enabling
+# USE_PDFLATEX the default is pdflatex and when in the later case latex is
+# chosen this is overwritten by pdflatex. For specific output languages the
+# default can have been set differently, this depends on the implementation of
+# the output language.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# Note: This tag is used in the Makefile / make.bat.
+# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file
+# (.tex).
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
+# generate index for LaTeX. In case there is no backslash (\) as first character
+# it will be automatically added in the LaTeX code.
+# Note: This tag is used in the generated output file (.tex).
+# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat.
+# The default value is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_MAKEINDEX_CMD    = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for
+# the generated LaTeX document. The header should contain everything until the
+# first chapter. If it is left blank doxygen will generate a standard header. It
+# is highly recommended to start with a default header using
+# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty
+# and then modify the file new_header.tex. See also section "Doxygen usage" for
+# information on how to generate the default header that doxygen normally uses.
+#
+# Note: Only use a user-defined header if you know what you are doing!
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. The following
+# commands have a special meaning inside the header (and footer): For a
+# description of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for
+# the generated LaTeX document. The footer should contain everything after the
+# last chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer. See also section "Doxygen
+# usage" for information on how to generate the default footer that doxygen
+# normally uses. Note: Only use a user-defined footer if you know what you are
+# doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER           =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES      =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS         = NO
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as
+# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX
+# files. Set this option to YES, to get a higher quality PDF documentation.
+#
+# See also section LATEX_CMD_NAME for selecting the engine.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX           = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE        = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES     = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP        = NO
+
+# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
+# path from which the emoji images will be read. If a relative path is entered,
+# it will be relative to the LATEX_OUTPUT directory. If left blank the
+# LATEX_OUTPUT directory will be used.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EMOJI_DIRECTORY  =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT             =
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# configuration file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's configuration file. A template extensions file can be
+# generated using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT             =
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION          =
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT             = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING     = YES
+
+# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include
+# namespace members in file scope as well, matching the HTML output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_NS_MEMB_FILE_SCOPE = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK       = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
+# the structure of the code including all documentation. Note that this feature
+# is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION        = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF     = YES
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of
+# RECURSIVE has no effect here.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED             = "PRINTF_LIKE(x,y)=" \
+                         CGRAPH_API \
+                         EXTERN \
+                         GLOBALS_API \
+                         GVC_API \
+                         GVPLUGIN_LOADIMAGE_API \
+                         GVPR_API \
+                         PACK_API \
+                         PATHGEOM_API \
+                         PATHPLAN_API \
+                         RENDER_API \
+                         UTILS_API \
+			 CGHDR_API \
+                         XDOT_API
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS        = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH               =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT               = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 0
+
+# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of
+# subgraphs. When you want a differently looking font in the dot files that
+# doxygen generates you can specify fontname, fontcolor and fontsize attributes.
+# For details please see <a href=https://graphviz.org/doc/info/attrs.html>Node,
+# Edge and Graph Attributes specification</a> You need to make sure dot is able
+# to find the font, which can be done by putting it in a standard location or by
+# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
+# directory containing the font. Default graphviz fontsize is 14.
+# The default value is: fontname=Helvetica,fontsize=10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_COMMON_ATTR        = fontname=\"Helvetica,Arial,sans-serif\"
+
+# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can
+# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. <a
+# href=https://graphviz.org/doc/info/arrows.html>Complete documentation about
+# arrows shapes.</a>
+# The default value is: labelfontname=Helvetica,labelfontsize=10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_EDGE_ATTR          = labelfontsize=10 arrowhead=open arrowtail=open arrowsize=0.5
+
+# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes
+# around nodes set 'shape=plain' or 'shape=plaintext' <a
+# href=https://www.graphviz.org/doc/info/shapes.html>Shapes specification</a>
+# The default value is: shape=box,height=0.2,width=0.4.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NODE_ATTR          = fontsize=12 shape=plaintext
+
+# You can set the path where dot can find font specified with fontname in
+# DOT_COMMON_ATTR and others dot attributes.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a
+# graph for each documented class showing the direct and indirect inheritance
+# relations. In case HAVE_DOT is set as well dot will be used to draw the graph,
+# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set
+# to TEXT the direct and indirect inheritance relations will be shown as texts /
+# links.
+# Possible values are: NO, YES, TEXT and GRAPH.
+# The default value is: YES.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies. See also the chapter Grouping
+# in the manual.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK               = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag UML_LOOK is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and
+# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS
+# tag is set to YES, doxygen will add type and arguments for attributes and
+# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen
+# will not generate fields with class member information in the UML graphs. The
+# class diagrams will look similar to the default class diagrams but using UML
+# notation for the relationships.
+# Possible values are: NO, YES and NONE.
+# The default value is: NO.
+# This tag requires that the tag UML_LOOK is set to YES.
+
+DOT_UML_DETAILS        = NO
+
+# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters
+# to display on a single line. If the actual line length exceeds this threshold
+# significantly it will wrapped across multiple lines. Some heuristics are apply
+# to avoid ugly line breaks.
+# Minimum value: 0, maximum value: 1000, default value: 17.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_WRAP_THRESHOLD     = 17
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH          = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH             = yes
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH           = yes
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH        = YES
+
+# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels
+# of child directories generated in directory dependency graphs by dot.
+# Minimum value: 1, maximum value: 25, default value: 1.
+# This tag requires that the tag DIRECTORY_GRAPH is set to YES.
+
+DIR_GRAPH_MAX_DEPTH    = 1
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT       = svg
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS           =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file or to the filename of jar file
+# to be used. If left blank, it is assumed PlantUML is not used or called during
+# a preprocessing step. Doxygen will generate a warning when it encounters a
+# \startuml command in this case and will not generate output for the diagram.
+
+PLANTUML_JAR_PATH      =
+
+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
+# configuration file for plantuml.
+
+PLANTUML_CFG_FILE      =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH  =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES    = 100
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS      = YES
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal
+# graphical representation for inheritance and collaboration diagrams is used.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate
+# files that are used to generate the various graphs.
+#
+# Note: This setting is not only used for dot files but also for msc temporary
+# files.
+# The default value is: YES.
+
+DOT_CLEANUP            = NO

+ 368 - 0
graphviz.mod/graphviz/INSTALL

@@ -0,0 +1,368 @@
+Installation Instructions
+*************************
+
+   Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software
+Foundation, Inc.
+
+   Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.  This file is offered as-is,
+without warranty of any kind.
+
+Basic Installation
+==================
+
+   Briefly, the shell command './configure && make && make install'
+should configure, build, and install this package.  The following
+more-detailed instructions are generic; see the 'README' file for
+instructions specific to this package.  Some packages provide this
+'INSTALL' file but do not implement all of the features documented
+below.  The lack of an optional feature in a given package is not
+necessarily a bug.  More recommendations for GNU packages can be found
+in *note Makefile Conventions: (standards)Makefile Conventions.
+
+   The 'configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a 'Makefile' in each directory of the package.
+It may also create one or more '.h' files containing system-dependent
+definitions.  Finally, it creates a shell script 'config.status' that
+you can run in the future to recreate the current configuration, and a
+file 'config.log' containing compiler output (useful mainly for
+debugging 'configure').
+
+   It can also use an optional file (typically called 'config.cache' and
+enabled with '--cache-file=config.cache' or simply '-C') that saves the
+results of its tests to speed up reconfiguring.  Caching is disabled by
+default to prevent problems with accidental use of stale cache files.
+
+   If you need to do unusual things to compile the package, please try
+to figure out how 'configure' could check whether to do them, and mail
+diffs or instructions to the address given in the 'README' so they can
+be considered for the next release.  If you are using the cache, and at
+some point 'config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+   The file 'configure.ac' (or 'configure.in') is used to create
+'configure' by a program called 'autoconf'.  You need 'configure.ac' if
+you want to change it or regenerate 'configure' using a newer version of
+'autoconf'.
+
+   The simplest way to compile this package is:
+
+  1. 'cd' to the directory containing the package's source code and type
+     './configure' to configure the package for your system.
+
+     Running 'configure' might take a while.  While running, it prints
+     some messages telling which features it is checking for.
+
+  2. Type 'make' to compile the package.
+
+  3. Optionally, type 'make check' to run any self-tests that come with
+     the package, generally using the just-built uninstalled binaries.
+
+  4. Type 'make install' to install the programs and any data files and
+     documentation.  When installing into a prefix owned by root, it is
+     recommended that the package be configured and built as a regular
+     user, and only the 'make install' phase executed with root
+     privileges.
+
+  5. Optionally, type 'make installcheck' to repeat any self-tests, but
+     this time using the binaries in their final installed location.
+     This target does not install anything.  Running this target as a
+     regular user, particularly if the prior 'make install' required
+     root privileges, verifies that the installation completed
+     correctly.
+
+  6. You can remove the program binaries and object files from the
+     source code directory by typing 'make clean'.  To also remove the
+     files that 'configure' created (so you can compile the package for
+     a different kind of computer), type 'make distclean'.  There is
+     also a 'make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+  7. Often, you can also type 'make uninstall' to remove the installed
+     files again.  In practice, not all packages have tested that
+     uninstallation works correctly, even though it is required by the
+     GNU Coding Standards.
+
+  8. Some packages, particularly those that use Automake, provide 'make
+     distcheck', which can by used by developers to test that all other
+     targets like 'make install' and 'make uninstall' work correctly.
+     This target is generally not run by end users.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the 'configure' script does not know about.  Run './configure --help'
+for details on some of the pertinent environment variables.
+
+   You can give 'configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here is
+an example:
+
+     ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+   *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you can use GNU 'make'.  'cd' to the
+directory where you want the object files and executables to go and run
+the 'configure' script.  'configure' automatically checks for the source
+code in the directory that 'configure' is in and in '..'.  This is known
+as a "VPATH" build.
+
+   With a non-GNU 'make', it is safer to compile the package for one
+architecture at a time in the source code directory.  After you have
+installed the package for one architecture, use 'make distclean' before
+reconfiguring for another architecture.
+
+   On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple '-arch' options to the
+compiler but only a single '-arch' option to the preprocessor.  Like
+this:
+
+     ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CPP="gcc -E" CXXCPP="g++ -E"
+
+   This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the 'lipo' tool if you have problems.
+
+Installation Names
+==================
+
+   By default, 'make install' installs the package's commands under
+'/usr/local/bin', include files under '/usr/local/include', etc.  You
+can specify an installation prefix other than '/usr/local' by giving
+'configure' the option '--prefix=PREFIX', where PREFIX must be an
+absolute file name.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+pass the option '--exec-prefix=PREFIX' to 'configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like '--bindir=DIR' to specify different values for particular
+kinds of files.  Run 'configure --help' for a list of the directories
+you can set and what kinds of files go in them.  In general, the default
+for these options is expressed in terms of '${prefix}', so that
+specifying just '--prefix' will affect all of the other directory
+specifications that were not explicitly provided.
+
+   The most portable way to affect installation locations is to pass the
+correct locations to 'configure'; however, many packages provide one or
+both of the following shortcuts of passing variable assignments to the
+'make install' command line to change installation locations without
+having to reconfigure or recompile.
+
+   The first method involves providing an override variable for each
+affected directory.  For example, 'make install
+prefix=/alternate/directory' will choose an alternate location for all
+directory configuration variables that were expressed in terms of
+'${prefix}'.  Any directories that were specified during 'configure',
+but not in terms of '${prefix}', must each be overridden at install time
+for the entire installation to be relocated.  The approach of makefile
+variable overrides for each directory variable is required by the GNU
+Coding Standards, and ideally causes no recompilation.  However, some
+platforms have known limitations with the semantics of shared libraries
+that end up requiring recompilation when using this method, particularly
+noticeable in packages that use GNU Libtool.
+
+   The second method involves providing the 'DESTDIR' variable.  For
+example, 'make install DESTDIR=/alternate/directory' will prepend
+'/alternate/directory' before all installation names.  The approach of
+'DESTDIR' overrides is not required by the GNU Coding Standards, and
+does not work on platforms that have drive letters.  On the other hand,
+it does better at avoiding recompilation issues, and works well even
+when some directory options were not specified in terms of '${prefix}'
+at 'configure' time.
+
+Optional Features
+=================
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving 'configure' the
+option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'.
+
+   Some packages pay attention to '--enable-FEATURE' options to
+'configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to '--with-PACKAGE' options, where PACKAGE
+is something like 'gnu-as' or 'x' (for the X Window System).  The
+'README' should mention any '--enable-' and '--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, 'configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the 'configure' options '--x-includes=DIR' and
+'--x-libraries=DIR' to specify their locations.
+
+   Some packages offer the ability to configure how verbose the
+execution of 'make' will be.  For these packages, running './configure
+--enable-silent-rules' sets the default to minimal output, which can be
+overridden with 'make V=1'; while running './configure
+--disable-silent-rules' sets the default to verbose, which can be
+overridden with 'make V=0'.
+
+Particular systems
+==================
+
+   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU CC
+is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+     ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+   HP-UX 'make' updates targets which have the same time stamps as their
+prerequisites, which makes it generally unusable when shipped generated
+files such as 'configure' are involved.  Use GNU 'make' instead.
+
+   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its '<wchar.h>' header file.  The option '-nodtk' can be used as a
+workaround.  If GNU CC is not installed, it is therefore recommended to
+try
+
+     ./configure CC="cc"
+
+and if that doesn't work, try
+
+     ./configure CC="cc -nodtk"
+
+   On Solaris, don't put '/usr/ucb' early in your 'PATH'.  This
+directory contains several dysfunctional programs; working variants of
+these programs are available in '/usr/bin'.  So, if you need '/usr/ucb'
+in your 'PATH', put it _after_ '/usr/bin'.
+
+   On Haiku, software installed for all users goes in '/boot/common',
+not '/usr/local'.  It is recommended to use the following options:
+
+     ./configure --prefix=/boot/common
+
+Specifying the System Type
+==========================
+
+   There may be some features 'configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on.  Usually, assuming the package is built to be run on the
+_same_ architectures, 'configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+'--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as 'sun4', or a canonical name which has the form:
+
+     CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+     OS
+     KERNEL-OS
+
+   See the file 'config.sub' for the possible values of each field.  If
+'config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+   If you are _building_ compiler tools for cross-compiling, you should
+use the option '--target=TYPE' to select the type of system they will
+produce code for.
+
+   If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with '--host=TYPE'.
+
+Sharing Defaults
+================
+
+   If you want to set default values for 'configure' scripts to share,
+you can create a site shell script called 'config.site' that gives
+default values for variables like 'CC', 'cache_file', and 'prefix'.
+'configure' looks for 'PREFIX/share/config.site' if it exists, then
+'PREFIX/etc/config.site' if it exists.  Or, you can set the
+'CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all 'configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+   Variables not defined in a site shell script can be set in the
+environment passed to 'configure'.  However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost.  In order to avoid this problem, you should set
+them in the 'configure' command line, using 'VAR=value'.  For example:
+
+     ./configure CC=/usr/local2/bin/gcc
+
+causes the specified 'gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an
+Autoconf limitation.  Until the limitation is lifted, you can use this
+workaround:
+
+     CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+'configure' Invocation
+======================
+
+   'configure' recognizes the following options to control how it
+operates.
+
+'--help'
+'-h'
+     Print a summary of all of the options to 'configure', and exit.
+
+'--help=short'
+'--help=recursive'
+     Print a summary of the options unique to this package's
+     'configure', and exit.  The 'short' variant lists options used only
+     in the top level, while the 'recursive' variant lists options also
+     present in any nested packages.
+
+'--version'
+'-V'
+     Print the version of Autoconf used to generate the 'configure'
+     script, and exit.
+
+'--cache-file=FILE'
+     Enable the cache: use and save the results of the tests in FILE,
+     traditionally 'config.cache'.  FILE defaults to '/dev/null' to
+     disable caching.
+
+'--config-cache'
+'-C'
+     Alias for '--cache-file=config.cache'.
+
+'--quiet'
+'--silent'
+'-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to '/dev/null' (any error
+     messages will still be shown).
+
+'--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     'configure' can determine that directory automatically.
+
+'--prefix=DIR'
+     Use DIR as the installation prefix.  *note Installation Names:: for
+     more details, including other options available for fine-tuning the
+     installation locations.
+
+'--no-create'
+'-n'
+     Run the configure checks, but stop before creating any output
+     files.
+
+'configure' also accepts some other, not widely useful, options.  Run
+'configure --help' for more details.

+ 59 - 0
graphviz.mod/graphviz/Makefile.am

@@ -0,0 +1,59 @@
+## Process this file with automake to produce Makefile.in
+
+ACLOCAL_AMFLAGS = -I m4
+
+export TAR_OPTIONS = --owner=0 --group=0 --exclude=windows/dependencies/*/*
+
+dist_doc_DATA = AUTHORS COPYING CHANGELOG.md NEWS cpl1.0.txt
+
+pkginclude_HEADERS = $(top_builddir)/graphviz_version.h
+
+dist_man_MANS = graphviz.7
+
+# $(subdirs) contains the list from: AC_CONFIG_SUBDIRS
+SUBDIRS = $(subdirs) lib plugin cmd tclpkg doc contrib share graphs tests
+
+.PHONY: doxygen
+doxygen:
+	doxygen
+
+dist-hook:
+	echo "$(VERSION)" >GRAPHVIZ_VERSION
+
+BUILT_SOURCES = $(top_builddir)/graphviz_version.h
+
+$(top_builddir)/graphviz_version.h: config.h
+	printf '#pragma once\n' > $(top_builddir)/graphviz_version.h
+	$(EGREP) 'PACKAGE|VERSION|GVPLUGIN' config.h >> $(top_builddir)/graphviz_version.h
+
+EXTRA_DIST = graphviz.spec \
+	config/depcomp \
+	builddate.h \
+	m4/README \
+	Doxyfile.in Doxyfile \
+	config/config_perl.pl \
+	config/config_ruby.rb dot.demo plugin.demo \
+	macosx windows debian redhat
+
+.PHONY: rpm
+rpm: dist
+	mkdir -p $(HOME)/rpmbuild/$(HOSTNAME)/SPECS $(HOME)/rpmbuild/$(HOSTNAME)/SOURCES
+	cp graphviz-$(VERSION).tar.gz $(HOME)/rpmbuild/$(HOSTNAME)/SOURCES/
+	case `cut -d' ' -f1 /etc/system-release` in \
+	Fedora) cp redhat/graphviz.spec.fedora $(HOME)/rpmbuild/$(HOSTNAME)/SPECS/graphviz.spec;; \
+	CentOS) cp redhat/graphviz.spec.rhel $(HOME)/rpmbuild/$(HOSTNAME)/SPECS/graphviz.spec;; \
+	Red) cp redhat/graphviz.spec.rhel $(HOME)/rpmbuild/$(HOSTNAME)/SPECS/graphviz.spec;; \
+	esac
+	rpmbuild -ba $(HOME)/rpmbuild/$(HOSTNAME)/SPECS/graphviz.spec
+
+.PHONY: deb
+deb: dist
+	rm -rf graphviz-$(VERSION)
+	zcat graphviz-$(VERSION).tar.gz | tar xf -
+	(cd graphviz-$(VERSION); fakeroot make -f debian/rules binary)
+
+.PHONY: pkg
+pkg: dist
+	tar xzf graphviz-$(VERSION).tar.gz && make -C graphviz-$(VERSION)/macosx/build && mv graphviz-$(VERSION)/macosx/build/graphviz-*.pkg .
+
+DISTCLEANFILES = config.cache builddate.h FEATURE/* graphviz-$(VERSION)*

+ 1222 - 0
graphviz.mod/graphviz/Makefile.in

@@ -0,0 +1,1222 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \
+	$(top_srcdir)/m4/ax_compare_version.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltargz.m4 \
+	$(top_srcdir)/m4/ltdl.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/./version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+	$(am__configure_deps) $(dist_doc_DATA) $(pkginclude_HEADERS) \
+	$(am__DIST_COMMON)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = debian/changelog debian/libgv-php5.install \
+	macosx/Info.plist macosx/build/graphviz.pmdoc/01local.xml \
+	macosx/build/graphviz.pmdoc/02graphviz.xml \
+	redhat/graphviz.spec.fedora redhat/graphviz.spec.rhel Doxyfile
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+man7dir = $(mandir)/man7
+am__installdirs = "$(DESTDIR)$(man7dir)" "$(DESTDIR)$(docdir)" \
+	"$(DESTDIR)$(pkgincludedir)"
+NROFF = nroff
+MANS = $(dist_man_MANS)
+DATA = $(dist_doc_DATA)
+HEADERS = $(pkginclude_HEADERS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	cscope distdir distdir-am dist dist-all distcheck
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
+	$(LISP)config.h.in
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+CSCOPE = cscope
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Doxyfile.in \
+	$(srcdir)/Makefile.in $(srcdir)/config.h.in \
+	$(top_srcdir)/config/compile $(top_srcdir)/config/config.guess \
+	$(top_srcdir)/config/config.sub \
+	$(top_srcdir)/config/install-sh $(top_srcdir)/config/ltmain.sh \
+	$(top_srcdir)/config/missing $(top_srcdir)/debian/changelog.in \
+	$(top_srcdir)/debian/libgv-php5.install.in \
+	$(top_srcdir)/macosx/Info.plist.in \
+	$(top_srcdir)/macosx/build/graphviz.pmdoc/01local.xml.in \
+	$(top_srcdir)/macosx/build/graphviz.pmdoc/02graphviz.xml.in \
+	$(top_srcdir)/redhat/graphviz.spec.fedora.in \
+	$(top_srcdir)/redhat/graphviz.spec.rhel.in AUTHORS COPYING \
+	ChangeLog INSTALL NEWS README config/compile \
+	config/config.guess config/config.sub config/depcomp \
+	config/install-sh config/ltmain.sh config/missing
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  if test -d "$(distdir)"; then \
+    find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+      && rm -rf "$(distdir)" \
+      || { sleep 5 && rm -rf "$(distdir)"; }; \
+  else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+DIST_TARGETS = dist-gzip
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+ANN_CFLAGS = @ANN_CFLAGS@
+ANN_LIBS = @ANN_LIBS@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+CYGWIN = @CYGWIN@
+DARWIN = @DARWIN@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEVIL_INCLUDES = @DEVIL_INCLUDES@
+DEVIL_LIBS = @DEVIL_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+EXPAT_CFLAGS = @EXPAT_CFLAGS@
+EXPAT_LIBS = @EXPAT_LIBS@
+FGREP = @FGREP@
+FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@
+FREETYPE2_LIBS = @FREETYPE2_LIBS@
+GDIPLUS_CFLAGS = @GDIPLUS_CFLAGS@
+GDIPLUS_HEADS = @GDIPLUS_HEADS@
+GDIPLUS_LIBS = @GDIPLUS_LIBS@
+GDK_CFLAGS = @GDK_CFLAGS@
+GDK_LIBS = @GDK_LIBS@
+GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@
+GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@
+GDLIB_CFLAGS = @GDLIB_CFLAGS@
+GDLIB_CONFIG = @GDLIB_CONFIG@
+GDLIB_LIBS = @GDLIB_LIBS@
+GLADE_CFLAGS = @GLADE_CFLAGS@
+GLADE_LIBS = @GLADE_LIBS@
+GLUT_CFLAGS = @GLUT_CFLAGS@
+GLUT_LIBS = @GLUT_LIBS@
+GO = @GO@
+GO_INCLUDES = @GO_INCLUDES@
+GO_LIBS = @GO_LIBS@
+GRAPHVIZ_AUTHOR_EMAIL = @GRAPHVIZ_AUTHOR_EMAIL@
+GRAPHVIZ_AUTHOR_NAME = @GRAPHVIZ_AUTHOR_NAME@
+GRAPHVIZ_CHANGE_DATE = @GRAPHVIZ_CHANGE_DATE@
+GRAPHVIZ_VERSION_DATE = @GRAPHVIZ_VERSION_DATE@
+GRAPHVIZ_VERSION_MAJOR = @GRAPHVIZ_VERSION_MAJOR@
+GRAPHVIZ_VERSION_MICRO = @GRAPHVIZ_VERSION_MICRO@
+GRAPHVIZ_VERSION_MINOR = @GRAPHVIZ_VERSION_MINOR@
+GREP = @GREP@
+GROFF = @GROFF@
+GS_CFLAGS = @GS_CFLAGS@
+GS_LIBS = @GS_LIBS@
+GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@
+GTKGLEXT_LIBS = @GTKGLEXT_LIBS@
+GTKGL_CFLAGS = @GTKGL_CFLAGS@
+GTKGL_LIBS = @GTKGL_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+GTS_CFLAGS = @GTS_CFLAGS@
+GTS_LIBS = @GTS_LIBS@
+GUILE_CFLAGS = @GUILE_CFLAGS@
+GUILE_LIBS = @GUILE_LIBS@
+GVPLUGIN_CONFIG_FILE = @GVPLUGIN_CONFIG_FILE@
+GVPLUGIN_VERSION = @GVPLUGIN_VERSION@
+GVPLUGIN_VERSION_INFO = @GVPLUGIN_VERSION_INFO@
+HAVE_CXX17 = @HAVE_CXX17@
+INCLTDL = @INCLTDL@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTGOSIZE = @INTGOSIZE@
+IPSEPCOLA_INCLUDES = @IPSEPCOLA_INCLUDES@
+IPSEPCOLA_LIBS = @IPSEPCOLA_LIBS@
+JAVA = @JAVA@
+JAVASCRIPT = @JAVASCRIPT@
+JAVA_INCLUDES = @JAVA_INCLUDES@
+JAVA_LIBS = @JAVA_LIBS@
+JNI_EXTRA_LDFLAGS = @JNI_EXTRA_LDFLAGS@
+JSHEXT = @JSHEXT@
+LASI_CFLAGS = @LASI_CFLAGS@
+LASI_LIBS = @LASI_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBADD_DL = @LIBADD_DL@
+LIBADD_DLD_LINK = @LIBADD_DLD_LINK@
+LIBADD_DLOPEN = @LIBADD_DLOPEN@
+LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@
+LIBLTDL = @LIBLTDL@
+LIBOBJS = @LIBOBJS@
+LIBPOSTFIX = @LIBPOSTFIX@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTDLDEPS = @LTDLDEPS@
+LTDLINCL = @LTDLINCL@
+LTDLOPEN = @LTDLOPEN@
+LTLIBOBJS = @LTLIBOBJS@
+LT_ARGZ_H = @LT_ARGZ_H@
+LT_CONFIG_H = @LT_CONFIG_H@
+LT_DLLOADERS = @LT_DLLOADERS@
+LT_DLPREOPEN = @LT_DLPREOPEN@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+LUA = @LUA@
+LUA_INCLUDES = @LUA_INCLUDES@
+LUA_INSTALL_DIR = @LUA_INSTALL_DIR@
+LUA_LIBS = @LUA_LIBS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MATH_LIBS = @MATH_LIBS@
+MCS = @MCS@
+MINGW32 = @MINGW32@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJC = @OBJC@
+OBJCDEPMODE = @OBJCDEPMODE@
+OBJCFLAGS = @OBJCFLAGS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@
+PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@
+PANGOFT2_CFLAGS = @PANGOFT2_CFLAGS@
+PANGOFT2_LIBS = @PANGOFT2_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PERL_INCLUDES = @PERL_INCLUDES@
+PERL_INSTALL_DIR = @PERL_INSTALL_DIR@
+PERL_LIBS = @PERL_LIBS@
+PHP = @PHP@
+PHPCONFIG = @PHPCONFIG@
+PHP_INCLUDES = @PHP_INCLUDES@
+PHP_INSTALL_DATADIR = @PHP_INSTALL_DATADIR@
+PHP_INSTALL_DIR = @PHP_INSTALL_DIR@
+PHP_LIBS = @PHP_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PLATFORMSDKINCLUDE = @PLATFORMSDKINCLUDE@
+PLATFORMSDKLIB = @PLATFORMSDKLIB@
+POPPLER_CFLAGS = @POPPLER_CFLAGS@
+POPPLER_LIBS = @POPPLER_LIBS@
+PS2PDF = @PS2PDF@
+PYTHON3 = @PYTHON3@
+PYTHON3_INCLUDES = @PYTHON3_INCLUDES@
+PYTHON3_INSTALL_DIR = @PYTHON3_INSTALL_DIR@
+PYTHON3_LIBS = @PYTHON3_LIBS@
+QMAKE = @QMAKE@
+QTCORE_CFLAGS = @QTCORE_CFLAGS@
+QTCORE_LIBS = @QTCORE_LIBS@
+QTGUI_CFLAGS = @QTGUI_CFLAGS@
+QTGUI_LIBS = @QTGUI_LIBS@
+QUARTZ_CFLAGS = @QUARTZ_CFLAGS@
+QUARTZ_LIBS = @QUARTZ_LIBS@
+RANLIB = @RANLIB@
+RSVG_CFLAGS = @RSVG_CFLAGS@
+RSVG_LIBS = @RSVG_LIBS@
+RUBY = @RUBY@
+RUBY_CFLAGS = @RUBY_CFLAGS@
+RUBY_INSTALL_DIR = @RUBY_INSTALL_DIR@
+RUBY_LIBS = @RUBY_LIBS@
+RUBY_VER = @RUBY_VER@
+R_CFLAGS = @R_CFLAGS@
+R_LIBS = @R_LIBS@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHARED_LIBRARY_SUFFIX = @SHARED_LIBRARY_SUFFIX@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SWIG = @SWIG@
+SWIGJAVA_CPPFLAGS = @SWIGJAVA_CPPFLAGS@
+SWIG_PHP_DATA = @SWIG_PHP_DATA@
+SWIG_PHP_DATA_TO_PACKAGE = @SWIG_PHP_DATA_TO_PACKAGE@
+SWIG_PHP_OPT = @SWIG_PHP_OPT@
+SWIG_VERSION = @SWIG_VERSION@
+TCLCONFIG = @TCLCONFIG@
+TCLINT_INCLUDES = @TCLINT_INCLUDES@
+TCLSH = @TCLSH@
+TCLSH_EXEC_PREFIX = @TCLSH_EXEC_PREFIX@
+TCL_CFLAGS = @TCL_CFLAGS@
+TCL_DEFS = @TCL_DEFS@
+TCL_INCLUDES = @TCL_INCLUDES@
+TCL_INSTALL_DIR = @TCL_INSTALL_DIR@
+TCL_LIBS = @TCL_LIBS@
+TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@
+TCL_MINOR_VERSION = @TCL_MINOR_VERSION@
+TCL_PATCH_LEVEL = @TCL_PATCH_LEVEL@
+TCL_PKGINDEX = @TCL_PKGINDEX@
+TCL_PKGINDEX_GD = @TCL_PKGINDEX_GD@
+TCL_PKGINDEX_SWIG = @TCL_PKGINDEX_SWIG@
+TCL_SHLIB_SUFFIX = @TCL_SHLIB_SUFFIX@
+TCL_SRC_DIR = @TCL_SRC_DIR@
+TCL_STUB_LIB_SPEC = @TCL_STUB_LIB_SPEC@
+TCL_VERSION = @TCL_VERSION@
+VERSION = @VERSION@
+WEBP_CFLAGS = @WEBP_CFLAGS@
+WEBP_LIBS = @WEBP_LIBS@
+XMKMF = @XMKMF@
+XRENDER_CFLAGS = @XRENDER_CFLAGS@
+XRENDER_LIBS = @XRENDER_LIBS@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+Z_INCLUDES = @Z_INCLUDES@
+Z_LIBS = @Z_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_OBJC = @ac_ct_OBJC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+demodir = @demodir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+ltdl_LIBOBJS = @ltdl_LIBOBJS@
+ltdl_LTLIBOBJS = @ltdl_LTLIBOBJS@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sys_symbol_underscore = @sys_symbol_underscore@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ACLOCAL_AMFLAGS = -I m4
+dist_doc_DATA = AUTHORS COPYING CHANGELOG.md NEWS cpl1.0.txt
+pkginclude_HEADERS = $(top_builddir)/graphviz_version.h
+dist_man_MANS = graphviz.7
+
+# $(subdirs) contains the list from: AC_CONFIG_SUBDIRS
+SUBDIRS = $(subdirs) lib plugin cmd tclpkg doc contrib share graphs tests
+BUILT_SOURCES = $(top_builddir)/graphviz_version.h
+EXTRA_DIST = graphviz.spec \
+	config/depcomp \
+	builddate.h \
+	m4/README \
+	Doxyfile.in Doxyfile \
+	config/config_perl.pl \
+	config/config_ruby.rb dot.demo plugin.demo \
+	macosx windows debian redhat
+
+DISTCLEANFILES = config.cache builddate.h FEATURE/* graphviz-$(VERSION)*
+all: $(BUILT_SOURCES) config.h
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh: Makefile
+	@:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \
+	      $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	$(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+config.h: stamp-h1
+	@test -f $@ || rm -f stamp-h1
+	@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+	@rm -f stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in:  $(am__configure_deps) 
+	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+	rm -f stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f config.h stamp-h1
+debian/changelog: $(top_builddir)/config.status $(top_srcdir)/debian/changelog.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+debian/libgv-php5.install: $(top_builddir)/config.status $(top_srcdir)/debian/libgv-php5.install.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+macosx/Info.plist: $(top_builddir)/config.status $(top_srcdir)/macosx/Info.plist.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+macosx/build/graphviz.pmdoc/01local.xml: $(top_builddir)/config.status $(top_srcdir)/macosx/build/graphviz.pmdoc/01local.xml.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+macosx/build/graphviz.pmdoc/02graphviz.xml: $(top_builddir)/config.status $(top_srcdir)/macosx/build/graphviz.pmdoc/02graphviz.xml.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+redhat/graphviz.spec.fedora: $(top_builddir)/config.status $(top_srcdir)/redhat/graphviz.spec.fedora.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+redhat/graphviz.spec.rhel: $(top_builddir)/config.status $(top_srcdir)/redhat/graphviz.spec.rhel.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+Doxyfile: $(top_builddir)/config.status $(srcdir)/Doxyfile.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool config.lt
+install-man7: $(dist_man_MANS)
+	@$(NORMAL_INSTALL)
+	@list1=''; \
+	list2='$(dist_man_MANS)'; \
+	test -n "$(man7dir)" \
+	  && test -n "`echo $$list1$$list2`" \
+	  || exit 0; \
+	echo " $(MKDIR_P) '$(DESTDIR)$(man7dir)'"; \
+	$(MKDIR_P) "$(DESTDIR)$(man7dir)" || exit 1; \
+	{ for i in $$list1; do echo "$$i"; done;  \
+	if test -n "$$list2"; then \
+	  for i in $$list2; do echo "$$i"; done \
+	    | sed -n '/\.7[a-z]*$$/p'; \
+	fi; \
+	} | while read p; do \
+	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; echo "$$p"; \
+	done | \
+	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^7][0-9a-z]*$$,7,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+	sed 'N;N;s,\n, ,g' | { \
+	list=; while read file base inst; do \
+	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man7dir)/$$inst'"; \
+	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man7dir)/$$inst" || exit $$?; \
+	  fi; \
+	done; \
+	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+	while read files; do \
+	  test -z "$$files" || { \
+	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man7dir)'"; \
+	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man7dir)" || exit $$?; }; \
+	done; }
+
+uninstall-man7:
+	@$(NORMAL_UNINSTALL)
+	@list=''; test -n "$(man7dir)" || exit 0; \
+	files=`{ for i in $$list; do echo "$$i"; done; \
+	l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+	  sed -n '/\.7[a-z]*$$/p'; \
+	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^7][0-9a-z]*$$,7,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+	dir='$(DESTDIR)$(man7dir)'; $(am__uninstall_files_from_dir)
+install-dist_docDATA: $(dist_doc_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \
+	done
+
+uninstall-dist_docDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir)
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+	@$(NORMAL_INSTALL)
+	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
+	done
+
+uninstall-pkgincludeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+	test ! -s cscope.files \
+	  || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+	-rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+	-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	$(am__remove_distdir)
+	test -d "$(distdir)" || mkdir "$(distdir)"
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+	$(MAKE) $(AM_MAKEFLAGS) \
+	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
+	  dist-hook
+	-test -n "$(am__skip_mode_fix)" \
+	|| find "$(distdir)" -type d ! -perm -755 \
+		-exec chmod u+rwx,go+rx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
+	$(am__post_remove_distdir)
+
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+	$(am__post_remove_distdir)
+
+dist-lzip: distdir
+	tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+	$(am__post_remove_distdir)
+
+dist-xz: distdir
+	tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+	$(am__post_remove_distdir)
+
+dist-tarZ: distdir
+	@echo WARNING: "Support for distribution archives compressed with" \
+		       "legacy program 'compress' is deprecated." >&2
+	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__post_remove_distdir)
+
+dist-shar: distdir
+	@echo WARNING: "Support for shar distribution archives is" \
+	               "deprecated." >&2
+	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+	shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
+	$(am__post_remove_distdir)
+
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__post_remove_distdir)
+
+dist dist-all:
+	$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+	$(am__post_remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lz*) \
+	  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+	*.tar.xz*) \
+	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir)
+	chmod u+w $(distdir)
+	mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
+	chmod a-w $(distdir)
+	test -d $(distdir)/_build || exit 0; \
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && am__cwd=`pwd` \
+	  && $(am__cd) $(distdir)/_build/sub \
+	  && ../../configure \
+	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	    --srcdir=../.. --prefix="$$dc_install_base" \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+	  && cd "$$am__cwd" \
+	  || exit 1
+	$(am__post_remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+	@test -n '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: trying to run $@ with an empty' \
+	       '$$(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	$(am__cd) '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-recursive
+all-am: Makefile $(MANS) $(DATA) $(HEADERS) config.h
+installdirs: installdirs-recursive
+installdirs-am:
+	for dir in "$(DESTDIR)$(man7dir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(pkgincludedir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr \
+	distclean-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-dist_docDATA install-man \
+	install-pkgincludeHEADERS
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man: install-man7
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-dist_docDATA uninstall-man \
+	uninstall-pkgincludeHEADERS
+
+uninstall-man: uninstall-man7
+
+.MAKE: $(am__recursive_targets) all check install install-am \
+	install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+	am--refresh check check-am clean clean-cscope clean-generic \
+	clean-libtool cscope cscopelist-am ctags ctags-am dist \
+	dist-all dist-bzip2 dist-gzip dist-hook dist-lzip dist-shar \
+	dist-tarZ dist-xz dist-zip distcheck distclean \
+	distclean-generic distclean-hdr distclean-libtool \
+	distclean-tags distcleancheck distdir distuninstallcheck dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dist_docDATA install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-man7 install-pdf install-pdf-am \
+	install-pkgincludeHEADERS install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+	ps ps-am tags tags-am uninstall uninstall-am \
+	uninstall-dist_docDATA uninstall-man uninstall-man7 \
+	uninstall-pkgincludeHEADERS
+
+.PRECIOUS: Makefile
+
+
+export TAR_OPTIONS = --owner=0 --group=0 --exclude=windows/dependencies/*/*
+
+.PHONY: doxygen
+doxygen:
+	doxygen
+
+dist-hook:
+	echo "$(VERSION)" >GRAPHVIZ_VERSION
+
+$(top_builddir)/graphviz_version.h: config.h
+	printf '#pragma once\n' > $(top_builddir)/graphviz_version.h
+	$(EGREP) 'PACKAGE|VERSION|GVPLUGIN' config.h >> $(top_builddir)/graphviz_version.h
+
+.PHONY: rpm
+rpm: dist
+	mkdir -p $(HOME)/rpmbuild/$(HOSTNAME)/SPECS $(HOME)/rpmbuild/$(HOSTNAME)/SOURCES
+	cp graphviz-$(VERSION).tar.gz $(HOME)/rpmbuild/$(HOSTNAME)/SOURCES/
+	case `cut -d' ' -f1 /etc/system-release` in \
+	Fedora) cp redhat/graphviz.spec.fedora $(HOME)/rpmbuild/$(HOSTNAME)/SPECS/graphviz.spec;; \
+	CentOS) cp redhat/graphviz.spec.rhel $(HOME)/rpmbuild/$(HOSTNAME)/SPECS/graphviz.spec;; \
+	Red) cp redhat/graphviz.spec.rhel $(HOME)/rpmbuild/$(HOSTNAME)/SPECS/graphviz.spec;; \
+	esac
+	rpmbuild -ba $(HOME)/rpmbuild/$(HOSTNAME)/SPECS/graphviz.spec
+
+.PHONY: deb
+deb: dist
+	rm -rf graphviz-$(VERSION)
+	zcat graphviz-$(VERSION).tar.gz | tar xf -
+	(cd graphviz-$(VERSION); fakeroot make -f debian/rules binary)
+
+.PHONY: pkg
+pkg: dist
+	tar xzf graphviz-$(VERSION).tar.gz && make -C graphviz-$(VERSION)/macosx/build && mv graphviz-$(VERSION)/macosx/build/graphviz-*.pkg .
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

+ 4 - 0
graphviz.mod/graphviz/NEWS

@@ -0,0 +1,4 @@
+See the CHANGELOG.md file for detailed technical news for this release.
+
+The link https://graphviz.org/about/ provides more high-level descriptions.
+

+ 4 - 0
graphviz.mod/graphviz/README

@@ -0,0 +1,4 @@
+Graphviz - Graph Drawing Programs from AT&T Research and Lucent Bell Labs
+
+See doc/build.html for prerequisites and detailed build notes.
+

+ 1440 - 0
graphviz.mod/graphviz/aclocal.m4

@@ -0,0 +1,1440 @@
+# generated automatically by aclocal 1.16.1 -*- Autoconf -*-
+
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
+
+dnl pkg.m4 - Macros to locate and utilise pkg-config.   -*- Autoconf -*-
+dnl serial 11 (pkg-config-0.29.1)
+dnl
+dnl Copyright © 2004 Scott James Remnant <[email protected]>.
+dnl Copyright © 2012-2015 Dan Nicholson <[email protected]>
+dnl
+dnl This program is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl This program is distributed in the hope that it will be useful, but
+dnl WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+dnl General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+dnl 02111-1307, USA.
+dnl
+dnl As a special exception to the GNU General Public License, if you
+dnl distribute this file as part of a program that contains a
+dnl configuration script generated by Autoconf, you may include it under
+dnl the same distribution terms that you use for the rest of that
+dnl program.
+
+dnl PKG_PREREQ(MIN-VERSION)
+dnl -----------------------
+dnl Since: 0.29
+dnl
+dnl Verify that the version of the pkg-config macros are at least
+dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's
+dnl installed version of pkg-config, this checks the developer's version
+dnl of pkg.m4 when generating configure.
+dnl
+dnl To ensure that this macro is defined, also add:
+dnl m4_ifndef([PKG_PREREQ],
+dnl     [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])])
+dnl
+dnl See the "Since" comment for each macro you use to see what version
+dnl of the macros you require.
+m4_defun([PKG_PREREQ],
+[m4_define([PKG_MACROS_VERSION], [0.29.1])
+m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
+    [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
+])dnl PKG_PREREQ
+
+dnl PKG_PROG_PKG_CONFIG([MIN-VERSION])
+dnl ----------------------------------
+dnl Since: 0.16
+dnl
+dnl Search for the pkg-config tool and set the PKG_CONFIG variable to
+dnl first found in the path. Checks that the version of pkg-config found
+dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is
+dnl used since that's the first version where most current features of
+dnl pkg-config existed.
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
+m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])
+AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])
+AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+	AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+	_pkg_min_version=m4_default([$1], [0.9.0])
+	AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+		AC_MSG_RESULT([yes])
+	else
+		AC_MSG_RESULT([no])
+		PKG_CONFIG=""
+	fi
+fi[]dnl
+])dnl PKG_PROG_PKG_CONFIG
+
+dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+dnl -------------------------------------------------------------------
+dnl Since: 0.18
+dnl
+dnl Check to see whether a particular set of modules exists. Similar to
+dnl PKG_CHECK_MODULES(), but does not set variables or print errors.
+dnl
+dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+dnl only at the first occurence in configure.ac, so if the first place
+dnl it's called might be skipped (such as if it is within an "if", you
+dnl have to call PKG_CHECK_EXISTS manually
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+    AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+  m4_default([$2], [:])
+m4_ifvaln([$3], [else
+  $3])dnl
+fi])
+
+dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+dnl ---------------------------------------------
+dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting
+dnl pkg_failed based on the result.
+m4_define([_PKG_CONFIG],
+[if test -n "$$1"; then
+    pkg_cv_[]$1="$$1"
+ elif test -n "$PKG_CONFIG"; then
+    PKG_CHECK_EXISTS([$3],
+                     [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes ],
+		     [pkg_failed=yes])
+ else
+    pkg_failed=untried
+fi[]dnl
+])dnl _PKG_CONFIG
+
+dnl _PKG_SHORT_ERRORS_SUPPORTED
+dnl ---------------------------
+dnl Internal check to see if pkg-config supports short errors.
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi[]dnl
+])dnl _PKG_SHORT_ERRORS_SUPPORTED
+
+
+dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+dnl   [ACTION-IF-NOT-FOUND])
+dnl --------------------------------------------------------------
+dnl Since: 0.4.0
+dnl
+dnl Note that if there is a possibility the first call to
+dnl PKG_CHECK_MODULES might not happen, you should be sure to include an
+dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+   	AC_MSG_RESULT([no])
+        _PKG_SHORT_ERRORS_SUPPORTED
+        if test $_pkg_short_errors_supported = yes; then
+	        $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
+        else 
+	        $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+	m4_default([$4], [AC_MSG_ERROR(
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT])[]dnl
+        ])
+elif test $pkg_failed = untried; then
+     	AC_MSG_RESULT([no])
+	m4_default([$4], [AC_MSG_FAILURE(
+[The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl
+        ])
+else
+	$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+	$1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+        AC_MSG_RESULT([yes])
+	$3
+fi[]dnl
+])dnl PKG_CHECK_MODULES
+
+
+dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+dnl   [ACTION-IF-NOT-FOUND])
+dnl ---------------------------------------------------------------------
+dnl Since: 0.29
+dnl
+dnl Checks for existence of MODULES and gathers its build flags with
+dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags
+dnl and VARIABLE-PREFIX_LIBS from --libs.
+dnl
+dnl Note that if there is a possibility the first call to
+dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to
+dnl include an explicit call to PKG_PROG_PKG_CONFIG in your
+dnl configure.ac.
+AC_DEFUN([PKG_CHECK_MODULES_STATIC],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+_save_PKG_CONFIG=$PKG_CONFIG
+PKG_CONFIG="$PKG_CONFIG --static"
+PKG_CHECK_MODULES($@)
+PKG_CONFIG=$_save_PKG_CONFIG[]dnl
+])dnl PKG_CHECK_MODULES_STATIC
+
+
+dnl PKG_INSTALLDIR([DIRECTORY])
+dnl -------------------------
+dnl Since: 0.27
+dnl
+dnl Substitutes the variable pkgconfigdir as the location where a module
+dnl should install pkg-config .pc files. By default the directory is
+dnl $libdir/pkgconfig, but the default can be changed by passing
+dnl DIRECTORY. The user can override through the --with-pkgconfigdir
+dnl parameter.
+AC_DEFUN([PKG_INSTALLDIR],
+[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])
+m4_pushdef([pkg_description],
+    [pkg-config installation directory @<:@]pkg_default[@:>@])
+AC_ARG_WITH([pkgconfigdir],
+    [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],,
+    [with_pkgconfigdir=]pkg_default)
+AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
+m4_popdef([pkg_default])
+m4_popdef([pkg_description])
+])dnl PKG_INSTALLDIR
+
+
+dnl PKG_NOARCH_INSTALLDIR([DIRECTORY])
+dnl --------------------------------
+dnl Since: 0.27
+dnl
+dnl Substitutes the variable noarch_pkgconfigdir as the location where a
+dnl module should install arch-independent pkg-config .pc files. By
+dnl default the directory is $datadir/pkgconfig, but the default can be
+dnl changed by passing DIRECTORY. The user can override through the
+dnl --with-noarch-pkgconfigdir parameter.
+AC_DEFUN([PKG_NOARCH_INSTALLDIR],
+[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])
+m4_pushdef([pkg_description],
+    [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@])
+AC_ARG_WITH([noarch-pkgconfigdir],
+    [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],,
+    [with_noarch_pkgconfigdir=]pkg_default)
+AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])
+m4_popdef([pkg_default])
+m4_popdef([pkg_description])
+])dnl PKG_NOARCH_INSTALLDIR
+
+
+dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
+dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+dnl -------------------------------------------
+dnl Since: 0.28
+dnl
+dnl Retrieves the value of the pkg-config variable for the given module.
+AC_DEFUN([PKG_CHECK_VAR],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl
+
+_PKG_CONFIG([$1], [variable="][$3]["], [$2])
+AS_VAR_COPY([$1], [pkg_cv_][$1])
+
+AS_VAR_IF([$1], [""], [$5], [$4])dnl
+])dnl PKG_CHECK_VAR
+
+# Copyright (C) 2002-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.16'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.16.1], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.16.1])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to '$srcdir/foo'.  In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is '.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+m4_if([$1], [CC],   [depcc="$CC"   am_compiler_list=],
+      [$1], [CXX],  [depcc="$CXX"  am_compiler_list=],
+      [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+      [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+      [$1], [UPC],  [depcc="$UPC"  am_compiler_list=],
+      [$1], [GCJ],  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                    [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+  [--enable-dependency-tracking],
+  [do not reject slow dependency extractors])
+AS_HELP_STRING(
+  [--disable-dependency-tracking],
+  [speeds up one-time build])])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Older Autoconf quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  # TODO: see whether this extra hack can be removed once we start
+  # requiring Autoconf 2.70 or later.
+  AS_CASE([$CONFIG_FILES],
+          [*\'*], [eval set x "$CONFIG_FILES"],
+          [*], [set x $CONFIG_FILES])
+  shift
+  # Used to flag and report bootstrapping failures.
+  am_rc=0
+  for am_mf
+  do
+    # Strip MF so we end up with the name of the file.
+    am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile which includes
+    # dependency-tracking related rules and includes.
+    # Grep'ing the whole file directly is not great: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+      || continue
+    am_dirpart=`AS_DIRNAME(["$am_mf"])`
+    am_filepart=`AS_BASENAME(["$am_mf"])`
+    AM_RUN_LOG([cd "$am_dirpart" \
+      && sed -e '/# am--include-marker/d' "$am_filepart" \
+        | $MAKE -f - am--depfiles]) || am_rc=$?
+  done
+  if test $am_rc -ne 0; then
+    AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
+    for automatic dependency tracking.  Try re-running configure with the
+    '--disable-dependency-tracking' option to at least be able to build
+    the package (albeit without support for automatic dependency tracking).])
+  fi
+  AS_UNSET([am_dirpart])
+  AS_UNSET([am_filepart])
+  AS_UNSET([am_mf])
+  AS_UNSET([am_rc])
+  rm -f conftest-deps.mk
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking is enabled.
+# This creates each '.Po' and '.Plo' makefile fragment that we'll need in
+# order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.65])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[AC_DIAGNOSE([obsolete],
+             [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(
+  m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+  [ok:ok],,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+			     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+		  [_AM_DEPENDENCIES([CC])],
+		  [m4_define([AC_PROG_CC],
+			     m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+		  [_AM_DEPENDENCIES([CXX])],
+		  [m4_define([AC_PROG_CXX],
+			     m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+		  [_AM_DEPENDENCIES([OBJC])],
+		  [m4_define([AC_PROG_OBJC],
+			     m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+		  [_AM_DEPENDENCIES([OBJCXX])],
+		  [m4_define([AC_PROG_OBJCXX],
+			     m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell [email protected] about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+  fi
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
+
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST([install_sh])])
+
+# Copyright (C) 2003-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Copyright (C) 1998-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_LEX
+# -----------
+# Autoconf leaves LEX=: if lex or flex can't be found.  Change that to a
+# "missing" invocation, for better error output.
+AC_DEFUN([AM_PROG_LEX],
+[AC_PREREQ([2.50])dnl
+AC_REQUIRE([AM_MISSING_HAS_RUN])dnl
+AC_REQUIRE([AC_PROG_LEX])dnl
+if test "$LEX" = :; then
+  LEX=${am_missing_run}flex
+fi])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check whether make has an 'include' directive that can support all
+# the idioms we need for our automatic dependency tracking code.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive])
+cat > confinc.mk << 'END'
+am__doit:
+	@echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+  AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])
+  AS_CASE([$?:`cat confinc.out 2>/dev/null`],
+      ['0:this is the am__doit target'],
+      [AS_CASE([$s],
+          [BSD], [am__include='.include' am__quote='"'],
+          [am__include='include' am__quote=''])])
+  if test "$am__include" != "#"; then
+    _am_result="yes ($s style)"
+    break
+  fi
+done
+rm -f confinc.* confmf.*
+AC_MSG_RESULT([${_am_result}])
+AC_SUBST([am__include])])
+AC_SUBST([am__quote])])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
+else
+  am_missing_run=
+  AC_MSG_WARN(['missing' script is too old or missing])
+fi
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake.  We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+  [whether $CC understands -c and -o together],
+  [am_cv_prog_cc_c_o],
+  [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+   ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
+    AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$[*]" = "X"; then
+	# -L didn't work.
+	set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$[*]" != "X $srcdir/configure conftest.file" \
+	&& test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+	# If neither matched, then we have a broken ls.  This can happen
+	# if, for instance, CONFIG_SHELL is bash and it inherits a
+	# broken ls alias from the environment.  This has actually
+	# happened.  Such a system could not be considered "sane".
+	AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment])
+     fi
+     if test "$[2]" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+  [AC_MSG_CHECKING([that generated files are newer than configure])
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+
+# Copyright (C) 2009-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# ("yes" being less verbose, "no" or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+  [--enable-silent-rules],
+  [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+  [--disable-silent-rules],
+  [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+   [am_cv_make_support_nested_variables],
+   [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+	@$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+  dnl Using '$V' instead of '$(V)' breaks IRIX make.
+  AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor 'install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in "make install-strip", and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+#
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+
+m4_if([$1], [v7],
+  [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+  [m4_case([$1],
+    [ustar],
+     [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+      # There is notably a 21 bits limit for the UID and the GID.  In fact,
+      # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+      # and bug#13588).
+      am_max_uid=2097151 # 2^21 - 1
+      am_max_gid=$am_max_uid
+      # The $UID and $GID variables are not portable, so we need to resort
+      # to the POSIX-mandated id(1) utility.  Errors in the 'id' calls
+      # below are definitely unexpected, so allow the users to see them
+      # (that is, avoid stderr redirection).
+      am_uid=`id -u || echo unknown`
+      am_gid=`id -g || echo unknown`
+      AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+      if test $am_uid -le $am_max_uid; then
+         AC_MSG_RESULT([yes])
+      else
+         AC_MSG_RESULT([no])
+         _am_tools=none
+      fi
+      AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+      if test $am_gid -le $am_max_gid; then
+         AC_MSG_RESULT([yes])
+      else
+        AC_MSG_RESULT([no])
+        _am_tools=none
+      fi],
+
+  [pax],
+    [],
+
+  [m4_fatal([Unknown tar format])])
+
+  AC_MSG_CHECKING([how to create a $1 tar archive])
+
+  # Go ahead even if we have the value already cached.  We do so because we
+  # need to set the values for the 'am__tar' and 'am__untar' variables.
+  _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+  for _am_tool in $_am_tools; do
+    case $_am_tool in
+    gnutar)
+      for _am_tar in tar gnutar gtar; do
+        AM_RUN_LOG([$_am_tar --version]) && break
+      done
+      am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+      am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+      am__untar="$_am_tar -xf -"
+      ;;
+    plaintar)
+      # Must skip GNU tar: if it does not support --format= it doesn't create
+      # ustar tarball either.
+      (tar --version) >/dev/null 2>&1 && continue
+      am__tar='tar chf - "$$tardir"'
+      am__tar_='tar chf - "$tardir"'
+      am__untar='tar xf -'
+      ;;
+    pax)
+      am__tar='pax -L -x $1 -w "$$tardir"'
+      am__tar_='pax -L -x $1 -w "$tardir"'
+      am__untar='pax -r'
+      ;;
+    cpio)
+      am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+      am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+      am__untar='cpio -i -H $1 -d'
+      ;;
+    none)
+      am__tar=false
+      am__tar_=false
+      am__untar=false
+      ;;
+    esac
+
+    # If the value was cached, stop now.  We just wanted to have am__tar
+    # and am__untar set.
+    test -n "${am_cv_prog_tar_$1}" && break
+
+    # tar/untar a dummy directory, and stop if the command works.
+    rm -rf conftest.dir
+    mkdir conftest.dir
+    echo GrepMe > conftest.dir/file
+    AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+    rm -rf conftest.dir
+    if test -s conftest.tar; then
+      AM_RUN_LOG([$am__untar <conftest.tar])
+      AM_RUN_LOG([cat conftest.dir/file])
+      grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+    fi
+  done
+  rm -rf conftest.dir
+
+  AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+  AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([m4/ax_check_compile_flag.m4])
+m4_include([m4/ax_compare_version.m4])
+m4_include([m4/ax_cxx_compile_stdcxx.m4])
+m4_include([m4/ax_cxx_compile_stdcxx_17.m4])
+m4_include([m4/libtool.m4])
+m4_include([m4/ltargz.m4])
+m4_include([m4/ltdl.m4])
+m4_include([m4/ltoptions.m4])
+m4_include([m4/ltsugar.m4])
+m4_include([m4/ltversion.m4])
+m4_include([m4/lt~obsolete.m4])

+ 1 - 0
graphviz.mod/graphviz/builddate.h

@@ -0,0 +1 @@
+#define BUILDDATE "20241206.2353"

+ 7 - 0
graphviz.mod/graphviz/cmd/Makefile.am

@@ -0,0 +1,7 @@
+## Process this file with automake to produce Makefile.in
+
+SUBDIRS = dot tools gvpr gvmap gvedit mingle edgepaint
+
+if WITH_SMYRNA
+SUBDIRS += smyrna
+endif

+ 807 - 0
graphviz.mod/graphviz/cmd/Makefile.in

@@ -0,0 +1,807 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@WITH_SMYRNA_TRUE@am__append_1 = smyrna
+subdir = cmd
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \
+	$(top_srcdir)/m4/ax_compare_version.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltargz.m4 \
+	$(top_srcdir)/m4/ltdl.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/./version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	distdir distdir-am
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = dot tools gvpr gvmap gvedit mingle edgepaint smyrna
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+ANN_CFLAGS = @ANN_CFLAGS@
+ANN_LIBS = @ANN_LIBS@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+CYGWIN = @CYGWIN@
+DARWIN = @DARWIN@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEVIL_INCLUDES = @DEVIL_INCLUDES@
+DEVIL_LIBS = @DEVIL_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+EXPAT_CFLAGS = @EXPAT_CFLAGS@
+EXPAT_LIBS = @EXPAT_LIBS@
+FGREP = @FGREP@
+FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@
+FREETYPE2_LIBS = @FREETYPE2_LIBS@
+GDIPLUS_CFLAGS = @GDIPLUS_CFLAGS@
+GDIPLUS_HEADS = @GDIPLUS_HEADS@
+GDIPLUS_LIBS = @GDIPLUS_LIBS@
+GDK_CFLAGS = @GDK_CFLAGS@
+GDK_LIBS = @GDK_LIBS@
+GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@
+GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@
+GDLIB_CFLAGS = @GDLIB_CFLAGS@
+GDLIB_CONFIG = @GDLIB_CONFIG@
+GDLIB_LIBS = @GDLIB_LIBS@
+GLADE_CFLAGS = @GLADE_CFLAGS@
+GLADE_LIBS = @GLADE_LIBS@
+GLUT_CFLAGS = @GLUT_CFLAGS@
+GLUT_LIBS = @GLUT_LIBS@
+GO = @GO@
+GO_INCLUDES = @GO_INCLUDES@
+GO_LIBS = @GO_LIBS@
+GRAPHVIZ_AUTHOR_EMAIL = @GRAPHVIZ_AUTHOR_EMAIL@
+GRAPHVIZ_AUTHOR_NAME = @GRAPHVIZ_AUTHOR_NAME@
+GRAPHVIZ_CHANGE_DATE = @GRAPHVIZ_CHANGE_DATE@
+GRAPHVIZ_VERSION_DATE = @GRAPHVIZ_VERSION_DATE@
+GRAPHVIZ_VERSION_MAJOR = @GRAPHVIZ_VERSION_MAJOR@
+GRAPHVIZ_VERSION_MICRO = @GRAPHVIZ_VERSION_MICRO@
+GRAPHVIZ_VERSION_MINOR = @GRAPHVIZ_VERSION_MINOR@
+GREP = @GREP@
+GROFF = @GROFF@
+GS_CFLAGS = @GS_CFLAGS@
+GS_LIBS = @GS_LIBS@
+GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@
+GTKGLEXT_LIBS = @GTKGLEXT_LIBS@
+GTKGL_CFLAGS = @GTKGL_CFLAGS@
+GTKGL_LIBS = @GTKGL_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+GTS_CFLAGS = @GTS_CFLAGS@
+GTS_LIBS = @GTS_LIBS@
+GUILE_CFLAGS = @GUILE_CFLAGS@
+GUILE_LIBS = @GUILE_LIBS@
+GVPLUGIN_CONFIG_FILE = @GVPLUGIN_CONFIG_FILE@
+GVPLUGIN_VERSION = @GVPLUGIN_VERSION@
+GVPLUGIN_VERSION_INFO = @GVPLUGIN_VERSION_INFO@
+HAVE_CXX17 = @HAVE_CXX17@
+INCLTDL = @INCLTDL@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTGOSIZE = @INTGOSIZE@
+IPSEPCOLA_INCLUDES = @IPSEPCOLA_INCLUDES@
+IPSEPCOLA_LIBS = @IPSEPCOLA_LIBS@
+JAVA = @JAVA@
+JAVASCRIPT = @JAVASCRIPT@
+JAVA_INCLUDES = @JAVA_INCLUDES@
+JAVA_LIBS = @JAVA_LIBS@
+JNI_EXTRA_LDFLAGS = @JNI_EXTRA_LDFLAGS@
+JSHEXT = @JSHEXT@
+LASI_CFLAGS = @LASI_CFLAGS@
+LASI_LIBS = @LASI_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBADD_DL = @LIBADD_DL@
+LIBADD_DLD_LINK = @LIBADD_DLD_LINK@
+LIBADD_DLOPEN = @LIBADD_DLOPEN@
+LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@
+LIBLTDL = @LIBLTDL@
+LIBOBJS = @LIBOBJS@
+LIBPOSTFIX = @LIBPOSTFIX@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTDLDEPS = @LTDLDEPS@
+LTDLINCL = @LTDLINCL@
+LTDLOPEN = @LTDLOPEN@
+LTLIBOBJS = @LTLIBOBJS@
+LT_ARGZ_H = @LT_ARGZ_H@
+LT_CONFIG_H = @LT_CONFIG_H@
+LT_DLLOADERS = @LT_DLLOADERS@
+LT_DLPREOPEN = @LT_DLPREOPEN@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+LUA = @LUA@
+LUA_INCLUDES = @LUA_INCLUDES@
+LUA_INSTALL_DIR = @LUA_INSTALL_DIR@
+LUA_LIBS = @LUA_LIBS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MATH_LIBS = @MATH_LIBS@
+MCS = @MCS@
+MINGW32 = @MINGW32@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJC = @OBJC@
+OBJCDEPMODE = @OBJCDEPMODE@
+OBJCFLAGS = @OBJCFLAGS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@
+PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@
+PANGOFT2_CFLAGS = @PANGOFT2_CFLAGS@
+PANGOFT2_LIBS = @PANGOFT2_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PERL_INCLUDES = @PERL_INCLUDES@
+PERL_INSTALL_DIR = @PERL_INSTALL_DIR@
+PERL_LIBS = @PERL_LIBS@
+PHP = @PHP@
+PHPCONFIG = @PHPCONFIG@
+PHP_INCLUDES = @PHP_INCLUDES@
+PHP_INSTALL_DATADIR = @PHP_INSTALL_DATADIR@
+PHP_INSTALL_DIR = @PHP_INSTALL_DIR@
+PHP_LIBS = @PHP_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PLATFORMSDKINCLUDE = @PLATFORMSDKINCLUDE@
+PLATFORMSDKLIB = @PLATFORMSDKLIB@
+POPPLER_CFLAGS = @POPPLER_CFLAGS@
+POPPLER_LIBS = @POPPLER_LIBS@
+PS2PDF = @PS2PDF@
+PYTHON3 = @PYTHON3@
+PYTHON3_INCLUDES = @PYTHON3_INCLUDES@
+PYTHON3_INSTALL_DIR = @PYTHON3_INSTALL_DIR@
+PYTHON3_LIBS = @PYTHON3_LIBS@
+QMAKE = @QMAKE@
+QTCORE_CFLAGS = @QTCORE_CFLAGS@
+QTCORE_LIBS = @QTCORE_LIBS@
+QTGUI_CFLAGS = @QTGUI_CFLAGS@
+QTGUI_LIBS = @QTGUI_LIBS@
+QUARTZ_CFLAGS = @QUARTZ_CFLAGS@
+QUARTZ_LIBS = @QUARTZ_LIBS@
+RANLIB = @RANLIB@
+RSVG_CFLAGS = @RSVG_CFLAGS@
+RSVG_LIBS = @RSVG_LIBS@
+RUBY = @RUBY@
+RUBY_CFLAGS = @RUBY_CFLAGS@
+RUBY_INSTALL_DIR = @RUBY_INSTALL_DIR@
+RUBY_LIBS = @RUBY_LIBS@
+RUBY_VER = @RUBY_VER@
+R_CFLAGS = @R_CFLAGS@
+R_LIBS = @R_LIBS@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHARED_LIBRARY_SUFFIX = @SHARED_LIBRARY_SUFFIX@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SWIG = @SWIG@
+SWIGJAVA_CPPFLAGS = @SWIGJAVA_CPPFLAGS@
+SWIG_PHP_DATA = @SWIG_PHP_DATA@
+SWIG_PHP_DATA_TO_PACKAGE = @SWIG_PHP_DATA_TO_PACKAGE@
+SWIG_PHP_OPT = @SWIG_PHP_OPT@
+SWIG_VERSION = @SWIG_VERSION@
+TCLCONFIG = @TCLCONFIG@
+TCLINT_INCLUDES = @TCLINT_INCLUDES@
+TCLSH = @TCLSH@
+TCLSH_EXEC_PREFIX = @TCLSH_EXEC_PREFIX@
+TCL_CFLAGS = @TCL_CFLAGS@
+TCL_DEFS = @TCL_DEFS@
+TCL_INCLUDES = @TCL_INCLUDES@
+TCL_INSTALL_DIR = @TCL_INSTALL_DIR@
+TCL_LIBS = @TCL_LIBS@
+TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@
+TCL_MINOR_VERSION = @TCL_MINOR_VERSION@
+TCL_PATCH_LEVEL = @TCL_PATCH_LEVEL@
+TCL_PKGINDEX = @TCL_PKGINDEX@
+TCL_PKGINDEX_GD = @TCL_PKGINDEX_GD@
+TCL_PKGINDEX_SWIG = @TCL_PKGINDEX_SWIG@
+TCL_SHLIB_SUFFIX = @TCL_SHLIB_SUFFIX@
+TCL_SRC_DIR = @TCL_SRC_DIR@
+TCL_STUB_LIB_SPEC = @TCL_STUB_LIB_SPEC@
+TCL_VERSION = @TCL_VERSION@
+VERSION = @VERSION@
+WEBP_CFLAGS = @WEBP_CFLAGS@
+WEBP_LIBS = @WEBP_LIBS@
+XMKMF = @XMKMF@
+XRENDER_CFLAGS = @XRENDER_CFLAGS@
+XRENDER_LIBS = @XRENDER_LIBS@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+Z_INCLUDES = @Z_INCLUDES@
+Z_LIBS = @Z_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_OBJC = @ac_ct_OBJC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+demodir = @demodir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+ltdl_LIBOBJS = @ltdl_LIBOBJS@
+ltdl_LTLIBOBJS = @ltdl_LTLIBOBJS@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sys_symbol_underscore = @sys_symbol_underscore@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+SUBDIRS = dot tools gvpr gvmap gvedit mingle edgepaint $(am__append_1)
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu cmd/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu cmd/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+	check-am clean clean-generic clean-libtool cscopelist-am ctags \
+	ctags-am distclean distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+	ps ps-am tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

+ 130 - 0
graphviz.mod/graphviz/cmd/dot/Makefile.am

@@ -0,0 +1,130 @@
+## Process this file with automake to produce Makefile.in
+
+linkedman = neato.1 twopi.1 fdp.1 circo.1
+if ENABLE_MAN_PDFS
+linkedpdf = neato.1.pdf twopi.1.pdf fdp.1.pdf circo.1.pdf
+else
+linkedpdf =
+endif
+linkedprogram = neato$(EXEEXT) twopi$(EXEEXT) fdp$(EXEEXT) circo$(EXEEXT) \
+	osage$(EXEEXT) patchwork$(EXEEXT)
+
+if WITH_SFDP
+linkedman += sfdp.1
+if ENABLE_MAN_PDFS
+linkedpdf += sfdp.1.pdf
+endif
+linkedprogram += sfdp$(EXEEXT)
+endif
+
+AM_CPPFLAGS = \
+	-I$(top_srcdir)/lib \
+	-I$(top_srcdir)/lib/common \
+	-I$(top_srcdir)/lib/gvc \
+	-I$(top_srcdir)/lib/pathplan \
+	-I$(top_srcdir)/lib/cgraph \
+	-I$(top_srcdir)/lib/cdt
+
+if ENABLE_SHARED
+if ENABLE_LTDL
+if ENABLE_STATIC
+bin_PROGRAMS = dot dot_static
+else
+bin_PROGRAMS = dot dot_builtins
+endif
+dist_bin_SCRIPTS = dot_sandbox
+else
+if ENABLE_STATIC
+bin_PROGRAMS = dot_static dot_builtins
+else
+bin_PROGRAMS = dot_builtins
+endif
+endif
+else
+if ENABLE_STATIC
+bin_PROGRAMS = dot_static
+endif
+endif
+
+dist_man_MANS = dot.1 dot_sandbox.1 osage.1 patchwork.1
+if ENABLE_MAN_PDFS
+pdf_DATA = dot.1.pdf osage.1.pdf patchwork.1.pdf
+endif
+
+dot_SOURCES = dot.c no_builtins.c
+dot_CPPFLAGS = $(AM_CPPFLAGS) -DDEMAND_LOADING=1
+dot_LDADD = \
+	$(top_builddir)/lib/gvc/libgvc.la \
+	$(top_builddir)/lib/cgraph/libcgraph.la
+
+install-data-hook:
+	(cd $(DESTDIR)$(man1dir); for i in $(linkedman); do rm -f $$i; $(LN_S) dot.1 $$i; done;)
+	(cd $(DESTDIR)$(pdfdir); for i in $(linkedpdf); do rm -f $$i; $(LN_S) dot.1.pdf $$i; done;)
+
+# create "neato", "fdp" etc as soflinks to "dot"
+# run "dot -c", if possible, to create plugin config
+install-exec-hook:
+	(cd $(DESTDIR)$(bindir); if test -x dot$(EXEEXT); then for i in $(linkedprogram); do rm -f $$i; $(LN_S) dot$(EXEEXT) $$i; done; fi;)
+	if test "x$(DESTDIR)" = "x" -a "x$(build)" = "x$(host)"; then if test -x $(bindir)/dot$(EXEEXT); then if test -x /sbin/ldconfig; then /sbin/ldconfig 2>/dev/null; fi; cd $(bindir); ./dot$(EXEEXT) -c; else cd $(bindir); ./dot_static$(EXEEXT) -c; fi; fi
+
+uninstall-hook:
+	(cd $(DESTDIR)$(man1dir); rm -f $(linkedman);)
+	(cd $(DESTDIR)$(pdfdir); for i in $(linkedpdf); do rm -f $$i; done;)
+	(cd $(DESTDIR)$(bindir); rm -f $(linkedprogram);)
+	(cd $(DESTDIR)$(libdir); rm -f config;)
+
+.1.1.pdf:
+	rm -f $@; pdffile=$@; psfile=$${pdffile%pdf}ps; \
+	$(GROFF) -Tps -man $< > $$psfile || { rm -f $$psfile; exit 1; }; \
+	$(PS2PDF) $$psfile && rm -f $$psfile || { rm -f $$psfile; exit 1; }
+SUFFIXES = .1 .1.pdf
+
+dot_static_SOURCES = dot.c dot_builtins.cpp
+dot_static_CPPFLAGS = $(AM_CPPFLAGS) -DDEMAND_LOADING=0
+dot_static_LDADD = \
+	$(top_builddir)/plugin/dot_layout/libgvplugin_dot_layout_C.la \
+	$(top_builddir)/plugin/neato_layout/libgvplugin_neato_layout_C.la \
+	$(top_builddir)/plugin/core/libgvplugin_core_C.la \
+	$(top_builddir)/plugin/vt/libgvplugin_vt_C.la \
+	$(top_builddir)/lib/gvc/libgvc_C.la \
+	$(top_builddir)/lib/pathplan/libpathplan_C.la \
+	$(top_builddir)/lib/xdot/libxdot_C.la \
+	$(top_builddir)/lib/cgraph/libcgraph_C.la \
+	$(top_builddir)/lib/cdt/libcdt_C.la \
+	$(top_builddir)/lib/util/libutil_C.la \
+	$(PANGOCAIRO_LIBS) $(PANGOFT2_LIBS) $(GTS_LIBS) $(EXPAT_LIBS) $(Z_LIBS) $(IPSEPCOLA_LIBS) $(MATH_LIBS)
+
+dot_builtins_SOURCES = dot.c dot_builtins.cpp
+dot_builtins_CPPFLAGS = $(AM_CPPFLAGS) -DDEMAND_LOADING=1
+dot_builtins_LDADD = \
+	$(top_builddir)/plugin/dot_layout/libgvplugin_dot_layout.la \
+	$(top_builddir)/plugin/neato_layout/libgvplugin_neato_layout.la \
+	$(top_builddir)/plugin/core/libgvplugin_core.la \
+	$(top_builddir)/plugin/vt/libgvplugin_vt.la \
+	$(top_builddir)/lib/gvc/libgvc.la \
+	$(top_builddir)/lib/pathplan/libpathplan.la \
+	$(top_builddir)/lib/xdot/libxdot.la \
+	$(top_builddir)/lib/cgraph/libcgraph.la \
+	$(top_builddir)/lib/cdt/libcdt.la \
+	$(GTS_LIBS) $(EXPAT_LIBS) $(Z_LIBS) $(IPSEPCOLA_LIBS) $(MATH_LIBS)
+
+if WITH_LIBGD
+dot_static_LDADD += $(top_builddir)/plugin/gd/.libs/libgvplugin_gd_C.a $(GDLIB_LIBS)
+dot_builtins_LDADD += $(top_builddir)/plugin/gd/libgvplugin_gd.la $(GDLIB_LIBS)
+endif
+
+if WITH_PANGOCAIRO
+dot_static_LDADD += $(top_builddir)/plugin/pango/.libs/libgvplugin_pango_C.a $(PANGOCAIRO_LIBS) $(PANGOFT2_LIBS)
+dot_builtins_LDADD += $(top_builddir)/plugin/pango/libgvplugin_pango.la $(PANGOCAIRO_LIBS)
+if WITH_WEBP
+dot_static_LDADD += $(top_builddir)/plugin/webp/.libs/libgvplugin_webp_C.a $(WEBP_LIBS)
+dot_builtins_LDADD += $(top_builddir)/plugin/webp/libgvplugin_webp.la $(WEBP_LIBS)
+endif
+endif
+
+if WITH_LASI
+dot_static_LDADD += $(top_builddir)/plugin/lasi/.libs/libgvplugin_lasi_C.a $(LASI_LIBS)
+dot_builtins_LDADD += $(top_builddir)/plugin/lasi/libgvplugin_lasi.la $(LASI_LIBS)
+endif
+
+DISTCLEANFILES = $(pdf_DATA)

+ 1279 - 0
graphviz.mod/graphviz/cmd/dot/Makefile.in

@@ -0,0 +1,1279 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@WITH_SFDP_TRUE@am__append_1 = sfdp.1
+@ENABLE_MAN_PDFS_TRUE@@WITH_SFDP_TRUE@am__append_2 = sfdp.1.pdf
+@WITH_SFDP_TRUE@am__append_3 = sfdp$(EXEEXT)
+@ENABLE_LTDL_FALSE@@ENABLE_SHARED_TRUE@@ENABLE_STATIC_FALSE@bin_PROGRAMS = dot_builtins$(EXEEXT)
+@ENABLE_LTDL_FALSE@@ENABLE_SHARED_TRUE@@ENABLE_STATIC_TRUE@bin_PROGRAMS = dot_static$(EXEEXT) \
+@ENABLE_LTDL_FALSE@@ENABLE_SHARED_TRUE@@ENABLE_STATIC_TRUE@	dot_builtins$(EXEEXT)
+@ENABLE_LTDL_TRUE@@ENABLE_SHARED_TRUE@@ENABLE_STATIC_FALSE@bin_PROGRAMS = dot$(EXEEXT) \
+@ENABLE_LTDL_TRUE@@ENABLE_SHARED_TRUE@@ENABLE_STATIC_FALSE@	dot_builtins$(EXEEXT)
+@ENABLE_LTDL_TRUE@@ENABLE_SHARED_TRUE@@ENABLE_STATIC_TRUE@bin_PROGRAMS = dot$(EXEEXT) \
+@ENABLE_LTDL_TRUE@@ENABLE_SHARED_TRUE@@ENABLE_STATIC_TRUE@	dot_static$(EXEEXT)
+@ENABLE_SHARED_FALSE@@ENABLE_STATIC_TRUE@bin_PROGRAMS =  \
+@ENABLE_SHARED_FALSE@@ENABLE_STATIC_TRUE@	dot_static$(EXEEXT)
+@WITH_LIBGD_TRUE@am__append_4 = $(top_builddir)/plugin/gd/.libs/libgvplugin_gd_C.a $(GDLIB_LIBS)
+@WITH_LIBGD_TRUE@am__append_5 = $(top_builddir)/plugin/gd/libgvplugin_gd.la $(GDLIB_LIBS)
+@WITH_PANGOCAIRO_TRUE@am__append_6 = $(top_builddir)/plugin/pango/.libs/libgvplugin_pango_C.a $(PANGOCAIRO_LIBS) $(PANGOFT2_LIBS)
+@WITH_PANGOCAIRO_TRUE@am__append_7 = $(top_builddir)/plugin/pango/libgvplugin_pango.la $(PANGOCAIRO_LIBS)
+@WITH_PANGOCAIRO_TRUE@@WITH_WEBP_TRUE@am__append_8 = $(top_builddir)/plugin/webp/.libs/libgvplugin_webp_C.a $(WEBP_LIBS)
+@WITH_PANGOCAIRO_TRUE@@WITH_WEBP_TRUE@am__append_9 = $(top_builddir)/plugin/webp/libgvplugin_webp.la $(WEBP_LIBS)
+@WITH_LASI_TRUE@am__append_10 = $(top_builddir)/plugin/lasi/.libs/libgvplugin_lasi_C.a $(LASI_LIBS)
+@WITH_LASI_TRUE@am__append_11 = $(top_builddir)/plugin/lasi/libgvplugin_lasi.la $(LASI_LIBS)
+subdir = cmd/dot
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \
+	$(top_srcdir)/m4/ax_compare_version.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltargz.m4 \
+	$(top_srcdir)/m4/ltdl.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/./version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__dist_bin_SCRIPTS_DIST) \
+	$(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" \
+	"$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pdfdir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_dot_OBJECTS = dot-dot.$(OBJEXT) dot-no_builtins.$(OBJEXT)
+dot_OBJECTS = $(am_dot_OBJECTS)
+dot_DEPENDENCIES = $(top_builddir)/lib/gvc/libgvc.la \
+	$(top_builddir)/lib/cgraph/libcgraph.la
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+am_dot_builtins_OBJECTS = dot_builtins-dot.$(OBJEXT) \
+	dot_builtins-dot_builtins.$(OBJEXT)
+dot_builtins_OBJECTS = $(am_dot_builtins_OBJECTS)
+am__DEPENDENCIES_1 =
+@WITH_LIBGD_TRUE@am__DEPENDENCIES_2 =  \
+@WITH_LIBGD_TRUE@	$(top_builddir)/plugin/gd/libgvplugin_gd.la \
+@WITH_LIBGD_TRUE@	$(am__DEPENDENCIES_1)
+@WITH_PANGOCAIRO_TRUE@am__DEPENDENCIES_3 = $(top_builddir)/plugin/pango/libgvplugin_pango.la \
+@WITH_PANGOCAIRO_TRUE@	$(am__DEPENDENCIES_1)
+@WITH_PANGOCAIRO_TRUE@@WITH_WEBP_TRUE@am__DEPENDENCIES_4 = $(top_builddir)/plugin/webp/libgvplugin_webp.la \
+@WITH_PANGOCAIRO_TRUE@@WITH_WEBP_TRUE@	$(am__DEPENDENCIES_1)
+@WITH_LASI_TRUE@am__DEPENDENCIES_5 = $(top_builddir)/plugin/lasi/libgvplugin_lasi.la \
+@WITH_LASI_TRUE@	$(am__DEPENDENCIES_1)
+dot_builtins_DEPENDENCIES =  \
+	$(top_builddir)/plugin/dot_layout/libgvplugin_dot_layout.la \
+	$(top_builddir)/plugin/neato_layout/libgvplugin_neato_layout.la \
+	$(top_builddir)/plugin/core/libgvplugin_core.la \
+	$(top_builddir)/plugin/vt/libgvplugin_vt.la \
+	$(top_builddir)/lib/gvc/libgvc.la \
+	$(top_builddir)/lib/pathplan/libpathplan.la \
+	$(top_builddir)/lib/xdot/libxdot.la \
+	$(top_builddir)/lib/cgraph/libcgraph.la \
+	$(top_builddir)/lib/cdt/libcdt.la $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_2) $(am__DEPENDENCIES_3) \
+	$(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5)
+am_dot_static_OBJECTS = dot_static-dot.$(OBJEXT) \
+	dot_static-dot_builtins.$(OBJEXT)
+dot_static_OBJECTS = $(am_dot_static_OBJECTS)
+@WITH_LIBGD_TRUE@am__DEPENDENCIES_6 = $(top_builddir)/plugin/gd/.libs/libgvplugin_gd_C.a \
+@WITH_LIBGD_TRUE@	$(am__DEPENDENCIES_1)
+@WITH_PANGOCAIRO_TRUE@am__DEPENDENCIES_7 = $(top_builddir)/plugin/pango/.libs/libgvplugin_pango_C.a \
+@WITH_PANGOCAIRO_TRUE@	$(am__DEPENDENCIES_1) \
+@WITH_PANGOCAIRO_TRUE@	$(am__DEPENDENCIES_1)
+@WITH_PANGOCAIRO_TRUE@@WITH_WEBP_TRUE@am__DEPENDENCIES_8 = $(top_builddir)/plugin/webp/.libs/libgvplugin_webp_C.a \
+@WITH_PANGOCAIRO_TRUE@@WITH_WEBP_TRUE@	$(am__DEPENDENCIES_1)
+@WITH_LASI_TRUE@am__DEPENDENCIES_9 = $(top_builddir)/plugin/lasi/.libs/libgvplugin_lasi_C.a \
+@WITH_LASI_TRUE@	$(am__DEPENDENCIES_1)
+dot_static_DEPENDENCIES =  \
+	$(top_builddir)/plugin/dot_layout/libgvplugin_dot_layout_C.la \
+	$(top_builddir)/plugin/neato_layout/libgvplugin_neato_layout_C.la \
+	$(top_builddir)/plugin/core/libgvplugin_core_C.la \
+	$(top_builddir)/plugin/vt/libgvplugin_vt_C.la \
+	$(top_builddir)/lib/gvc/libgvc_C.la \
+	$(top_builddir)/lib/pathplan/libpathplan_C.la \
+	$(top_builddir)/lib/xdot/libxdot_C.la \
+	$(top_builddir)/lib/cgraph/libcgraph_C.la \
+	$(top_builddir)/lib/cdt/libcdt_C.la \
+	$(top_builddir)/lib/util/libutil_C.la $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_6) $(am__DEPENDENCIES_7) \
+	$(am__DEPENDENCIES_8) $(am__DEPENDENCIES_9)
+am__dist_bin_SCRIPTS_DIST = dot_sandbox
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+SCRIPTS = $(dist_bin_SCRIPTS)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/config/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/dot-dot.Po \
+	./$(DEPDIR)/dot-no_builtins.Po ./$(DEPDIR)/dot_builtins-dot.Po \
+	./$(DEPDIR)/dot_builtins-dot_builtins.Po \
+	./$(DEPDIR)/dot_static-dot.Po \
+	./$(DEPDIR)/dot_static-dot_builtins.Po
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+SOURCES = $(dot_SOURCES) $(dot_builtins_SOURCES) $(dot_static_SOURCES)
+DIST_SOURCES = $(dot_SOURCES) $(dot_builtins_SOURCES) \
+	$(dot_static_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(dist_man_MANS)
+DATA = $(pdf_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in \
+	$(top_srcdir)/config/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+ANN_CFLAGS = @ANN_CFLAGS@
+ANN_LIBS = @ANN_LIBS@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+CYGWIN = @CYGWIN@
+DARWIN = @DARWIN@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEVIL_INCLUDES = @DEVIL_INCLUDES@
+DEVIL_LIBS = @DEVIL_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+EXPAT_CFLAGS = @EXPAT_CFLAGS@
+EXPAT_LIBS = @EXPAT_LIBS@
+FGREP = @FGREP@
+FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@
+FREETYPE2_LIBS = @FREETYPE2_LIBS@
+GDIPLUS_CFLAGS = @GDIPLUS_CFLAGS@
+GDIPLUS_HEADS = @GDIPLUS_HEADS@
+GDIPLUS_LIBS = @GDIPLUS_LIBS@
+GDK_CFLAGS = @GDK_CFLAGS@
+GDK_LIBS = @GDK_LIBS@
+GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@
+GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@
+GDLIB_CFLAGS = @GDLIB_CFLAGS@
+GDLIB_CONFIG = @GDLIB_CONFIG@
+GDLIB_LIBS = @GDLIB_LIBS@
+GLADE_CFLAGS = @GLADE_CFLAGS@
+GLADE_LIBS = @GLADE_LIBS@
+GLUT_CFLAGS = @GLUT_CFLAGS@
+GLUT_LIBS = @GLUT_LIBS@
+GO = @GO@
+GO_INCLUDES = @GO_INCLUDES@
+GO_LIBS = @GO_LIBS@
+GRAPHVIZ_AUTHOR_EMAIL = @GRAPHVIZ_AUTHOR_EMAIL@
+GRAPHVIZ_AUTHOR_NAME = @GRAPHVIZ_AUTHOR_NAME@
+GRAPHVIZ_CHANGE_DATE = @GRAPHVIZ_CHANGE_DATE@
+GRAPHVIZ_VERSION_DATE = @GRAPHVIZ_VERSION_DATE@
+GRAPHVIZ_VERSION_MAJOR = @GRAPHVIZ_VERSION_MAJOR@
+GRAPHVIZ_VERSION_MICRO = @GRAPHVIZ_VERSION_MICRO@
+GRAPHVIZ_VERSION_MINOR = @GRAPHVIZ_VERSION_MINOR@
+GREP = @GREP@
+GROFF = @GROFF@
+GS_CFLAGS = @GS_CFLAGS@
+GS_LIBS = @GS_LIBS@
+GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@
+GTKGLEXT_LIBS = @GTKGLEXT_LIBS@
+GTKGL_CFLAGS = @GTKGL_CFLAGS@
+GTKGL_LIBS = @GTKGL_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+GTS_CFLAGS = @GTS_CFLAGS@
+GTS_LIBS = @GTS_LIBS@
+GUILE_CFLAGS = @GUILE_CFLAGS@
+GUILE_LIBS = @GUILE_LIBS@
+GVPLUGIN_CONFIG_FILE = @GVPLUGIN_CONFIG_FILE@
+GVPLUGIN_VERSION = @GVPLUGIN_VERSION@
+GVPLUGIN_VERSION_INFO = @GVPLUGIN_VERSION_INFO@
+HAVE_CXX17 = @HAVE_CXX17@
+INCLTDL = @INCLTDL@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTGOSIZE = @INTGOSIZE@
+IPSEPCOLA_INCLUDES = @IPSEPCOLA_INCLUDES@
+IPSEPCOLA_LIBS = @IPSEPCOLA_LIBS@
+JAVA = @JAVA@
+JAVASCRIPT = @JAVASCRIPT@
+JAVA_INCLUDES = @JAVA_INCLUDES@
+JAVA_LIBS = @JAVA_LIBS@
+JNI_EXTRA_LDFLAGS = @JNI_EXTRA_LDFLAGS@
+JSHEXT = @JSHEXT@
+LASI_CFLAGS = @LASI_CFLAGS@
+LASI_LIBS = @LASI_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBADD_DL = @LIBADD_DL@
+LIBADD_DLD_LINK = @LIBADD_DLD_LINK@
+LIBADD_DLOPEN = @LIBADD_DLOPEN@
+LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@
+LIBLTDL = @LIBLTDL@
+LIBOBJS = @LIBOBJS@
+LIBPOSTFIX = @LIBPOSTFIX@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTDLDEPS = @LTDLDEPS@
+LTDLINCL = @LTDLINCL@
+LTDLOPEN = @LTDLOPEN@
+LTLIBOBJS = @LTLIBOBJS@
+LT_ARGZ_H = @LT_ARGZ_H@
+LT_CONFIG_H = @LT_CONFIG_H@
+LT_DLLOADERS = @LT_DLLOADERS@
+LT_DLPREOPEN = @LT_DLPREOPEN@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+LUA = @LUA@
+LUA_INCLUDES = @LUA_INCLUDES@
+LUA_INSTALL_DIR = @LUA_INSTALL_DIR@
+LUA_LIBS = @LUA_LIBS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MATH_LIBS = @MATH_LIBS@
+MCS = @MCS@
+MINGW32 = @MINGW32@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJC = @OBJC@
+OBJCDEPMODE = @OBJCDEPMODE@
+OBJCFLAGS = @OBJCFLAGS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@
+PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@
+PANGOFT2_CFLAGS = @PANGOFT2_CFLAGS@
+PANGOFT2_LIBS = @PANGOFT2_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PERL_INCLUDES = @PERL_INCLUDES@
+PERL_INSTALL_DIR = @PERL_INSTALL_DIR@
+PERL_LIBS = @PERL_LIBS@
+PHP = @PHP@
+PHPCONFIG = @PHPCONFIG@
+PHP_INCLUDES = @PHP_INCLUDES@
+PHP_INSTALL_DATADIR = @PHP_INSTALL_DATADIR@
+PHP_INSTALL_DIR = @PHP_INSTALL_DIR@
+PHP_LIBS = @PHP_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PLATFORMSDKINCLUDE = @PLATFORMSDKINCLUDE@
+PLATFORMSDKLIB = @PLATFORMSDKLIB@
+POPPLER_CFLAGS = @POPPLER_CFLAGS@
+POPPLER_LIBS = @POPPLER_LIBS@
+PS2PDF = @PS2PDF@
+PYTHON3 = @PYTHON3@
+PYTHON3_INCLUDES = @PYTHON3_INCLUDES@
+PYTHON3_INSTALL_DIR = @PYTHON3_INSTALL_DIR@
+PYTHON3_LIBS = @PYTHON3_LIBS@
+QMAKE = @QMAKE@
+QTCORE_CFLAGS = @QTCORE_CFLAGS@
+QTCORE_LIBS = @QTCORE_LIBS@
+QTGUI_CFLAGS = @QTGUI_CFLAGS@
+QTGUI_LIBS = @QTGUI_LIBS@
+QUARTZ_CFLAGS = @QUARTZ_CFLAGS@
+QUARTZ_LIBS = @QUARTZ_LIBS@
+RANLIB = @RANLIB@
+RSVG_CFLAGS = @RSVG_CFLAGS@
+RSVG_LIBS = @RSVG_LIBS@
+RUBY = @RUBY@
+RUBY_CFLAGS = @RUBY_CFLAGS@
+RUBY_INSTALL_DIR = @RUBY_INSTALL_DIR@
+RUBY_LIBS = @RUBY_LIBS@
+RUBY_VER = @RUBY_VER@
+R_CFLAGS = @R_CFLAGS@
+R_LIBS = @R_LIBS@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHARED_LIBRARY_SUFFIX = @SHARED_LIBRARY_SUFFIX@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SWIG = @SWIG@
+SWIGJAVA_CPPFLAGS = @SWIGJAVA_CPPFLAGS@
+SWIG_PHP_DATA = @SWIG_PHP_DATA@
+SWIG_PHP_DATA_TO_PACKAGE = @SWIG_PHP_DATA_TO_PACKAGE@
+SWIG_PHP_OPT = @SWIG_PHP_OPT@
+SWIG_VERSION = @SWIG_VERSION@
+TCLCONFIG = @TCLCONFIG@
+TCLINT_INCLUDES = @TCLINT_INCLUDES@
+TCLSH = @TCLSH@
+TCLSH_EXEC_PREFIX = @TCLSH_EXEC_PREFIX@
+TCL_CFLAGS = @TCL_CFLAGS@
+TCL_DEFS = @TCL_DEFS@
+TCL_INCLUDES = @TCL_INCLUDES@
+TCL_INSTALL_DIR = @TCL_INSTALL_DIR@
+TCL_LIBS = @TCL_LIBS@
+TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@
+TCL_MINOR_VERSION = @TCL_MINOR_VERSION@
+TCL_PATCH_LEVEL = @TCL_PATCH_LEVEL@
+TCL_PKGINDEX = @TCL_PKGINDEX@
+TCL_PKGINDEX_GD = @TCL_PKGINDEX_GD@
+TCL_PKGINDEX_SWIG = @TCL_PKGINDEX_SWIG@
+TCL_SHLIB_SUFFIX = @TCL_SHLIB_SUFFIX@
+TCL_SRC_DIR = @TCL_SRC_DIR@
+TCL_STUB_LIB_SPEC = @TCL_STUB_LIB_SPEC@
+TCL_VERSION = @TCL_VERSION@
+VERSION = @VERSION@
+WEBP_CFLAGS = @WEBP_CFLAGS@
+WEBP_LIBS = @WEBP_LIBS@
+XMKMF = @XMKMF@
+XRENDER_CFLAGS = @XRENDER_CFLAGS@
+XRENDER_LIBS = @XRENDER_LIBS@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+Z_INCLUDES = @Z_INCLUDES@
+Z_LIBS = @Z_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_OBJC = @ac_ct_OBJC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+demodir = @demodir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+ltdl_LIBOBJS = @ltdl_LIBOBJS@
+ltdl_LTLIBOBJS = @ltdl_LTLIBOBJS@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sys_symbol_underscore = @sys_symbol_underscore@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+linkedman = neato.1 twopi.1 fdp.1 circo.1 $(am__append_1)
+@ENABLE_MAN_PDFS_FALSE@linkedpdf = $(am__append_2)
+@ENABLE_MAN_PDFS_TRUE@linkedpdf = neato.1.pdf twopi.1.pdf fdp.1.pdf \
+@ENABLE_MAN_PDFS_TRUE@	circo.1.pdf $(am__append_2)
+linkedprogram = neato$(EXEEXT) twopi$(EXEEXT) fdp$(EXEEXT) \
+	circo$(EXEEXT) osage$(EXEEXT) patchwork$(EXEEXT) \
+	$(am__append_3)
+AM_CPPFLAGS = \
+	-I$(top_srcdir)/lib \
+	-I$(top_srcdir)/lib/common \
+	-I$(top_srcdir)/lib/gvc \
+	-I$(top_srcdir)/lib/pathplan \
+	-I$(top_srcdir)/lib/cgraph \
+	-I$(top_srcdir)/lib/cdt
+
+@ENABLE_LTDL_TRUE@@ENABLE_SHARED_TRUE@dist_bin_SCRIPTS = dot_sandbox
+dist_man_MANS = dot.1 dot_sandbox.1 osage.1 patchwork.1
+@ENABLE_MAN_PDFS_TRUE@pdf_DATA = dot.1.pdf osage.1.pdf patchwork.1.pdf
+dot_SOURCES = dot.c no_builtins.c
+dot_CPPFLAGS = $(AM_CPPFLAGS) -DDEMAND_LOADING=1
+dot_LDADD = \
+	$(top_builddir)/lib/gvc/libgvc.la \
+	$(top_builddir)/lib/cgraph/libcgraph.la
+
+SUFFIXES = .1 .1.pdf
+dot_static_SOURCES = dot.c dot_builtins.cpp
+dot_static_CPPFLAGS = $(AM_CPPFLAGS) -DDEMAND_LOADING=0
+dot_static_LDADD =  \
+	$(top_builddir)/plugin/dot_layout/libgvplugin_dot_layout_C.la \
+	$(top_builddir)/plugin/neato_layout/libgvplugin_neato_layout_C.la \
+	$(top_builddir)/plugin/core/libgvplugin_core_C.la \
+	$(top_builddir)/plugin/vt/libgvplugin_vt_C.la \
+	$(top_builddir)/lib/gvc/libgvc_C.la \
+	$(top_builddir)/lib/pathplan/libpathplan_C.la \
+	$(top_builddir)/lib/xdot/libxdot_C.la \
+	$(top_builddir)/lib/cgraph/libcgraph_C.la \
+	$(top_builddir)/lib/cdt/libcdt_C.la \
+	$(top_builddir)/lib/util/libutil_C.la $(PANGOCAIRO_LIBS) \
+	$(PANGOFT2_LIBS) $(GTS_LIBS) $(EXPAT_LIBS) $(Z_LIBS) \
+	$(IPSEPCOLA_LIBS) $(MATH_LIBS) $(am__append_4) $(am__append_6) \
+	$(am__append_8) $(am__append_10)
+dot_builtins_SOURCES = dot.c dot_builtins.cpp
+dot_builtins_CPPFLAGS = $(AM_CPPFLAGS) -DDEMAND_LOADING=1
+dot_builtins_LDADD =  \
+	$(top_builddir)/plugin/dot_layout/libgvplugin_dot_layout.la \
+	$(top_builddir)/plugin/neato_layout/libgvplugin_neato_layout.la \
+	$(top_builddir)/plugin/core/libgvplugin_core.la \
+	$(top_builddir)/plugin/vt/libgvplugin_vt.la \
+	$(top_builddir)/lib/gvc/libgvc.la \
+	$(top_builddir)/lib/pathplan/libpathplan.la \
+	$(top_builddir)/lib/xdot/libxdot.la \
+	$(top_builddir)/lib/cgraph/libcgraph.la \
+	$(top_builddir)/lib/cdt/libcdt.la $(GTS_LIBS) $(EXPAT_LIBS) \
+	$(Z_LIBS) $(IPSEPCOLA_LIBS) $(MATH_LIBS) $(am__append_5) \
+	$(am__append_7) $(am__append_9) $(am__append_11)
+DISTCLEANFILES = $(pdf_DATA)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .1 .1.pdf .c .cpp .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu cmd/dot/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu cmd/dot/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+dot$(EXEEXT): $(dot_OBJECTS) $(dot_DEPENDENCIES) $(EXTRA_dot_DEPENDENCIES) 
+	@rm -f dot$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(dot_OBJECTS) $(dot_LDADD) $(LIBS)
+
+dot_builtins$(EXEEXT): $(dot_builtins_OBJECTS) $(dot_builtins_DEPENDENCIES) $(EXTRA_dot_builtins_DEPENDENCIES) 
+	@rm -f dot_builtins$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(dot_builtins_OBJECTS) $(dot_builtins_LDADD) $(LIBS)
+
+dot_static$(EXEEXT): $(dot_static_OBJECTS) $(dot_static_DEPENDENCIES) $(EXTRA_dot_static_DEPENDENCIES) 
+	@rm -f dot_static$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(dot_static_OBJECTS) $(dot_static_LDADD) $(LIBS)
+install-dist_binSCRIPTS: $(dist_bin_SCRIPTS)
+	@$(NORMAL_INSTALL)
+	@list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	     } \
+	; done
+
+uninstall-dist_binSCRIPTS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dot-dot.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dot-no_builtins.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dot_builtins-dot.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dot_builtins-dot_builtins.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dot_static-dot.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dot_static-dot_builtins.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+	@$(MKDIR_P) $(@D)
+	@echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.c.o:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+dot-dot.o: dot.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dot-dot.o -MD -MP -MF $(DEPDIR)/dot-dot.Tpo -c -o dot-dot.o `test -f 'dot.c' || echo '$(srcdir)/'`dot.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dot-dot.Tpo $(DEPDIR)/dot-dot.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dot.c' object='dot-dot.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dot-dot.o `test -f 'dot.c' || echo '$(srcdir)/'`dot.c
+
+dot-dot.obj: dot.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dot-dot.obj -MD -MP -MF $(DEPDIR)/dot-dot.Tpo -c -o dot-dot.obj `if test -f 'dot.c'; then $(CYGPATH_W) 'dot.c'; else $(CYGPATH_W) '$(srcdir)/dot.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dot-dot.Tpo $(DEPDIR)/dot-dot.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dot.c' object='dot-dot.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dot-dot.obj `if test -f 'dot.c'; then $(CYGPATH_W) 'dot.c'; else $(CYGPATH_W) '$(srcdir)/dot.c'; fi`
+
+dot-no_builtins.o: no_builtins.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dot-no_builtins.o -MD -MP -MF $(DEPDIR)/dot-no_builtins.Tpo -c -o dot-no_builtins.o `test -f 'no_builtins.c' || echo '$(srcdir)/'`no_builtins.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dot-no_builtins.Tpo $(DEPDIR)/dot-no_builtins.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='no_builtins.c' object='dot-no_builtins.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dot-no_builtins.o `test -f 'no_builtins.c' || echo '$(srcdir)/'`no_builtins.c
+
+dot-no_builtins.obj: no_builtins.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dot-no_builtins.obj -MD -MP -MF $(DEPDIR)/dot-no_builtins.Tpo -c -o dot-no_builtins.obj `if test -f 'no_builtins.c'; then $(CYGPATH_W) 'no_builtins.c'; else $(CYGPATH_W) '$(srcdir)/no_builtins.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dot-no_builtins.Tpo $(DEPDIR)/dot-no_builtins.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='no_builtins.c' object='dot-no_builtins.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dot-no_builtins.obj `if test -f 'no_builtins.c'; then $(CYGPATH_W) 'no_builtins.c'; else $(CYGPATH_W) '$(srcdir)/no_builtins.c'; fi`
+
+dot_builtins-dot.o: dot.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_builtins_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dot_builtins-dot.o -MD -MP -MF $(DEPDIR)/dot_builtins-dot.Tpo -c -o dot_builtins-dot.o `test -f 'dot.c' || echo '$(srcdir)/'`dot.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dot_builtins-dot.Tpo $(DEPDIR)/dot_builtins-dot.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dot.c' object='dot_builtins-dot.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_builtins_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dot_builtins-dot.o `test -f 'dot.c' || echo '$(srcdir)/'`dot.c
+
+dot_builtins-dot.obj: dot.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_builtins_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dot_builtins-dot.obj -MD -MP -MF $(DEPDIR)/dot_builtins-dot.Tpo -c -o dot_builtins-dot.obj `if test -f 'dot.c'; then $(CYGPATH_W) 'dot.c'; else $(CYGPATH_W) '$(srcdir)/dot.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dot_builtins-dot.Tpo $(DEPDIR)/dot_builtins-dot.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dot.c' object='dot_builtins-dot.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_builtins_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dot_builtins-dot.obj `if test -f 'dot.c'; then $(CYGPATH_W) 'dot.c'; else $(CYGPATH_W) '$(srcdir)/dot.c'; fi`
+
+dot_static-dot.o: dot.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_static_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dot_static-dot.o -MD -MP -MF $(DEPDIR)/dot_static-dot.Tpo -c -o dot_static-dot.o `test -f 'dot.c' || echo '$(srcdir)/'`dot.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dot_static-dot.Tpo $(DEPDIR)/dot_static-dot.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dot.c' object='dot_static-dot.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_static_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dot_static-dot.o `test -f 'dot.c' || echo '$(srcdir)/'`dot.c
+
+dot_static-dot.obj: dot.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_static_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dot_static-dot.obj -MD -MP -MF $(DEPDIR)/dot_static-dot.Tpo -c -o dot_static-dot.obj `if test -f 'dot.c'; then $(CYGPATH_W) 'dot.c'; else $(CYGPATH_W) '$(srcdir)/dot.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dot_static-dot.Tpo $(DEPDIR)/dot_static-dot.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dot.c' object='dot_static-dot.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_static_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dot_static-dot.obj `if test -f 'dot.c'; then $(CYGPATH_W) 'dot.c'; else $(CYGPATH_W) '$(srcdir)/dot.c'; fi`
+
+.cpp.o:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+dot_builtins-dot_builtins.o: dot_builtins.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_builtins_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dot_builtins-dot_builtins.o -MD -MP -MF $(DEPDIR)/dot_builtins-dot_builtins.Tpo -c -o dot_builtins-dot_builtins.o `test -f 'dot_builtins.cpp' || echo '$(srcdir)/'`dot_builtins.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dot_builtins-dot_builtins.Tpo $(DEPDIR)/dot_builtins-dot_builtins.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='dot_builtins.cpp' object='dot_builtins-dot_builtins.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_builtins_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dot_builtins-dot_builtins.o `test -f 'dot_builtins.cpp' || echo '$(srcdir)/'`dot_builtins.cpp
+
+dot_builtins-dot_builtins.obj: dot_builtins.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_builtins_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dot_builtins-dot_builtins.obj -MD -MP -MF $(DEPDIR)/dot_builtins-dot_builtins.Tpo -c -o dot_builtins-dot_builtins.obj `if test -f 'dot_builtins.cpp'; then $(CYGPATH_W) 'dot_builtins.cpp'; else $(CYGPATH_W) '$(srcdir)/dot_builtins.cpp'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dot_builtins-dot_builtins.Tpo $(DEPDIR)/dot_builtins-dot_builtins.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='dot_builtins.cpp' object='dot_builtins-dot_builtins.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_builtins_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dot_builtins-dot_builtins.obj `if test -f 'dot_builtins.cpp'; then $(CYGPATH_W) 'dot_builtins.cpp'; else $(CYGPATH_W) '$(srcdir)/dot_builtins.cpp'; fi`
+
+dot_static-dot_builtins.o: dot_builtins.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_static_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dot_static-dot_builtins.o -MD -MP -MF $(DEPDIR)/dot_static-dot_builtins.Tpo -c -o dot_static-dot_builtins.o `test -f 'dot_builtins.cpp' || echo '$(srcdir)/'`dot_builtins.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dot_static-dot_builtins.Tpo $(DEPDIR)/dot_static-dot_builtins.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='dot_builtins.cpp' object='dot_static-dot_builtins.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_static_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dot_static-dot_builtins.o `test -f 'dot_builtins.cpp' || echo '$(srcdir)/'`dot_builtins.cpp
+
+dot_static-dot_builtins.obj: dot_builtins.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_static_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dot_static-dot_builtins.obj -MD -MP -MF $(DEPDIR)/dot_static-dot_builtins.Tpo -c -o dot_static-dot_builtins.obj `if test -f 'dot_builtins.cpp'; then $(CYGPATH_W) 'dot_builtins.cpp'; else $(CYGPATH_W) '$(srcdir)/dot_builtins.cpp'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/dot_static-dot_builtins.Tpo $(DEPDIR)/dot_static-dot_builtins.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='dot_builtins.cpp' object='dot_static-dot_builtins.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dot_static_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dot_static-dot_builtins.obj `if test -f 'dot_builtins.cpp'; then $(CYGPATH_W) 'dot_builtins.cpp'; else $(CYGPATH_W) '$(srcdir)/dot_builtins.cpp'; fi`
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-man1: $(dist_man_MANS)
+	@$(NORMAL_INSTALL)
+	@list1=''; \
+	list2='$(dist_man_MANS)'; \
+	test -n "$(man1dir)" \
+	  && test -n "`echo $$list1$$list2`" \
+	  || exit 0; \
+	echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+	$(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+	{ for i in $$list1; do echo "$$i"; done;  \
+	if test -n "$$list2"; then \
+	  for i in $$list2; do echo "$$i"; done \
+	    | sed -n '/\.1[a-z]*$$/p'; \
+	fi; \
+	} | while read p; do \
+	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; echo "$$p"; \
+	done | \
+	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+	sed 'N;N;s,\n, ,g' | { \
+	list=; while read file base inst; do \
+	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+	  fi; \
+	done; \
+	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+	while read files; do \
+	  test -z "$$files" || { \
+	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+	done; }
+
+uninstall-man1:
+	@$(NORMAL_UNINSTALL)
+	@list=''; test -n "$(man1dir)" || exit 0; \
+	files=`{ for i in $$list; do echo "$$i"; done; \
+	l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+	  sed -n '/\.1[a-z]*$$/p'; \
+	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+	dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+install-pdfDATA: $(pdf_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(pdf_DATA)'; test -n "$(pdfdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; \
+	done
+
+uninstall-pdfDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pdf_DATA)'; test -n "$(pdfdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pdfdir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(SCRIPTS) $(MANS) $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pdfdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+		-rm -f ./$(DEPDIR)/dot-dot.Po
+	-rm -f ./$(DEPDIR)/dot-no_builtins.Po
+	-rm -f ./$(DEPDIR)/dot_builtins-dot.Po
+	-rm -f ./$(DEPDIR)/dot_builtins-dot_builtins.Po
+	-rm -f ./$(DEPDIR)/dot_static-dot.Po
+	-rm -f ./$(DEPDIR)/dot_static-dot_builtins.Po
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man install-pdfDATA
+	@$(NORMAL_INSTALL)
+	$(MAKE) $(AM_MAKEFLAGS) install-data-hook
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS install-dist_binSCRIPTS
+	@$(NORMAL_INSTALL)
+	$(MAKE) $(AM_MAKEFLAGS) install-exec-hook
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+		-rm -f ./$(DEPDIR)/dot-dot.Po
+	-rm -f ./$(DEPDIR)/dot-no_builtins.Po
+	-rm -f ./$(DEPDIR)/dot_builtins-dot.Po
+	-rm -f ./$(DEPDIR)/dot_builtins-dot_builtins.Po
+	-rm -f ./$(DEPDIR)/dot_static-dot.Po
+	-rm -f ./$(DEPDIR)/dot_static-dot_builtins.Po
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-dist_binSCRIPTS \
+	uninstall-man uninstall-pdfDATA
+	@$(NORMAL_INSTALL)
+	$(MAKE) $(AM_MAKEFLAGS) uninstall-hook
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-data-am install-exec-am install-strip \
+	uninstall-am
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+	clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-binPROGRAMS \
+	install-data install-data-am install-data-hook \
+	install-dist_binSCRIPTS install-dvi install-dvi-am \
+	install-exec install-exec-am install-exec-hook install-html \
+	install-html-am install-info install-info-am install-man \
+	install-man1 install-pdf install-pdf-am install-pdfDATA \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \
+	uninstall-dist_binSCRIPTS uninstall-hook uninstall-man \
+	uninstall-man1 uninstall-pdfDATA
+
+.PRECIOUS: Makefile
+
+
+install-data-hook:
+	(cd $(DESTDIR)$(man1dir); for i in $(linkedman); do rm -f $$i; $(LN_S) dot.1 $$i; done;)
+	(cd $(DESTDIR)$(pdfdir); for i in $(linkedpdf); do rm -f $$i; $(LN_S) dot.1.pdf $$i; done;)
+
+# create "neato", "fdp" etc as soflinks to "dot"
+# run "dot -c", if possible, to create plugin config
+install-exec-hook:
+	(cd $(DESTDIR)$(bindir); if test -x dot$(EXEEXT); then for i in $(linkedprogram); do rm -f $$i; $(LN_S) dot$(EXEEXT) $$i; done; fi;)
+	if test "x$(DESTDIR)" = "x" -a "x$(build)" = "x$(host)"; then if test -x $(bindir)/dot$(EXEEXT); then if test -x /sbin/ldconfig; then /sbin/ldconfig 2>/dev/null; fi; cd $(bindir); ./dot$(EXEEXT) -c; else cd $(bindir); ./dot_static$(EXEEXT) -c; fi; fi
+
+uninstall-hook:
+	(cd $(DESTDIR)$(man1dir); rm -f $(linkedman);)
+	(cd $(DESTDIR)$(pdfdir); for i in $(linkedpdf); do rm -f $$i; done;)
+	(cd $(DESTDIR)$(bindir); rm -f $(linkedprogram);)
+	(cd $(DESTDIR)$(libdir); rm -f config;)
+
+.1.1.pdf:
+	rm -f $@; pdffile=$@; psfile=$${pdffile%pdf}ps; \
+	$(GROFF) -Tps -man $< > $$psfile || { rm -f $$psfile; exit 1; }; \
+	$(PS2PDF) $$psfile && rm -f $$psfile || { rm -f $$psfile; exit 1; }
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

+ 741 - 0
graphviz.mod/graphviz/cmd/dot/dot.1

@@ -0,0 +1,741 @@
+.TH DOT 1 "12 January 2015"
+.SH NAME
+dot \- filter for drawing directed graphs
+.br
+neato \- filter for drawing undirected graphs
+.br
+twopi \- filter for radial layouts of graphs
+.br
+circo \- filter for circular layout of graphs
+.br
+fdp \- filter for drawing undirected graphs
+.br
+sfdp \- filter for drawing large undirected graphs
+.br
+patchwork \- filter for squarified tree maps
+.br
+osage \- filter for array-based layouts
+.SH SYNOPSIS
+\fBdot\fR
+[\fIoptions\fP]
+[files]
+.br
+\fBneato\fR
+[\fIoptions\fP]
+[files]
+.br
+\fBtwopi\fR
+[\fIoptions\fP]
+[files]
+.br
+\fBcirco\fR
+[\fIoptions\fP]
+[files]
+.br
+\fBfdp\fR
+[\fIoptions\fP]
+[files]
+.br
+\fBsfdp\fR
+[\fIoptions\fP]
+[files]
+.br
+\fBpatchwork\fR
+[\fIoptions\fP]
+[files]
+.br
+\fBosage\fR
+[\fIoptions\fP]
+[files]
+.SH DESCRIPTION
+These are a collection of programs for drawing graphs. 
+There is actually only one main program; the specific layout algorithms
+are implemented as plugins. Thus, they largely share all of the same command-line 
+options.
+.PP
+.I dot
+draws directed graphs.  It works well on directed acyclic graphs and other graphs
+that can be drawn as hierarchies or have a natural ``flow.''
+.PP
+.I neato
+draws undirected graphs using a ``spring'' model and reducing the related energy (see Kamada and Kawai,
+Information Processing Letters 31:1, April 1989). 
+.PP
+.I twopi
+draws graphs using a radial layout (see G. Wills,
+Symposium on Graph Drawing GD'97, September, 1997).
+Basically, one node is chosen as the center and put at the origin.
+The remaining nodes are placed on a sequence of concentric circles
+centered about the origin, each a fixed radial distance from the
+previous circle.
+All nodes distance 1 from the center are placed on the first circle;
+all nodes distance 1 from a node on the first circle are placed on
+the second circle; and so forth.
+.PP
+.I circo
+draws graphs using a circular layout (see
+Six and Tollis, GD '99 and ALENEX '99, and
+Kaufmann and Wiese, GD '02.)
+The tool identifies biconnected components and draws the nodes of
+the component on a circle. The block\(hycutpoint tree
+is then laid out using a recursive radial algorithm. Edge
+crossings within a circle are minimized by placing as many edges on
+the circle's perimeter as possible.
+In particular, if the component is outerplanar, the component will
+have a planar layout.
+If a node belongs to multiple non\(hytrivial biconnected components,
+the layout puts the node in one of them. By default, this is the first
+non\(hytrivial component found in the search from the root component.
+.PP
+.I fdp
+draws undirected graphs using a ``spring'' model. It relies on a
+force\(hydirected approach in the spirit of Fruchterman and Reingold
+(cf. Software\(hyPractice & Experience 21(11), 1991, pp. 1129\(hy1164).
+.PP
+.I sfdp
+also draws undirected graphs using the ``spring'' model described
+above, but it uses a multi-scale approach to produce layouts
+of large graphs in a reasonably short time.
+.PP
+.I patchwork
+draws the graph as a squarified treemap (see M. Bruls et al., ``Squarified treemaps'', Proc. Joint Eurographics 
+and IEEE TCVG Symp. on Visualization, 2000, pp. 33-42). The clusters of the graph are used to
+specify the tree.
+.PP
+.I osage
+draws the graph using its cluster structure. For a given cluster, each of its subclusters is laid out internally. 
+Then the subclusters, plus any remaining nodes, are repositioned based on the cluster's \fBpack\fP and \fBpackmode\fP
+attributes.
+.SH OUTPUT FORMATS
+Graphviz uses an extensible plugin mechanism for its output renderers,
+so to see what output formats your installation of dot supports
+you can use ``dot \-T:'' and check the warning message.
+Also, The plugin mechanism supports multiple implementations
+of the output formats, allowing variations in the renderers and formatters.
+To see what variants are available for a particular output format, use, for example: ``dot \-Tpng:''
+and to force a particular variant, use, for example: ``dot \-Tpng:gd''
+.P
+Traditionally, Graphviz supports the following:
+.br
+\fB\-Tdot\fP (Dot format containing layout information),
+.br
+\fB\-Txdot\fP (Dot format containing complete layout information),
+.br
+\fB\-Tps\fP (PostScript),
+.br
+\fB\-Tpdf\fP (PDF),
+.br
+\fB\-Tsvg\fP \fB\-Tsvgz\fP (Structured Vector Graphics),
+.br
+\fB\-Tfig\fP (XFIG graphics),
+.br
+\fB\-Tpng\fP (png bitmap graphics),
+.br
+\fB\-Tgif\fP (gif bitmap graphics),
+.br
+\fB\-Tjpg\fP \fB\-Tjpeg\fP (jpeg bitmap graphics),
+.br
+\fB\-Tjson\fP (xdot information encoded in JSON),
+.br
+\fB\-Timap\fP (imagemap files for httpd servers for each node or edge
+that has a non\(hynull \fBhref\fP attribute.),
+.br
+\fB\-Tcmapx\fP (client\(hyside imagemap for use in html and xhtml).
+.br
+Additional less common or more special\(hypurpose output formats
+can be found at https://www.graphviz.org/doc/info/output.html.
+.PP
+Alternative plugins providing support for a given output format
+can be found from the error message resulting from appending a ':' to the format. e.g. \fB\-Tpng:\fP
+The first plugin listed is always the default.
+.PP
+The \fB\-P\fP switch can be used to produce a graph of all output variants supported by plugins in the local installation of graphviz.
+.SH GRAPH FILE LANGUAGE
+Here is a synopsis of the graph file language, normally using the extension \fB.gv\fR, for graphs:
+.PP
+[\fBstrict\fR] (\fBgraph\fR|\fBdigraph\fR) \fIname\fP { \fIstatement\(hylist\fP }\fR
+.br 
+is the top\(hylevel graph. If the graph is \fBstrict\fR, then multiple edges are
+not allowed between the same pairs of nodes.
+If it is a directed graph, indicated by \fBdigraph\fR,
+then the \fIedgeop\fR must be "\->". If it is an undirected \fBgraph\fR
+then the \fIedgeop\fR must be "\-\-".
+.PP
+Statements may be:
+.PP
+\fIname\fB=\fIval\fB;\fR
+.br
+\fBnode [\fIname\fB=\fIval\fB];\fR
+.br
+\fBedge [\fIname\fB=\fIval\fB];\fR
+.br
+Set default graph, node, or edge attribute \fIname\fP to \fIval\fP.
+Any subgraph, node, or edge appearing after this inherits the new
+default attributes.
+.PP
+\fBn0 [\fIname0=val0,name1=val1,...\fB];\fR
+.br
+Creates node \fBn0\fP (if it does not already exist)
+and sets its attributes according to the optional list. 
+.PP
+\fBn0 \fIedgeop\fR n1 \fIedgeop\fR \fI...\fB \fIedgeop\fR nn \fB[\fIname0=val0,name1=val1,...\fB];\fR
+.br
+Creates edges between nodes \fBn0\fP, \fBn1\fP, ..., \fBnn\fP and sets
+their attributes according to the optional list.
+Creates nodes as necessary.
+.PP
+[\fBsubgraph \fIname\fB] \fB{ \fIstatement\(hylist \fB}\fR
+.br
+Creates a subgraph.  Subgraphs may be used in place
+of \fBn0\fP, ..., \fBnn\fP in the above statements to create edges.
+[\fBsubgraph \fIname\fR] is optional;
+if missing, the subgraph is assigned an internal name. 
+.PP
+The language accepts both C\(hystyle comments /*C...*/ or //...
+.PP
+Attribute names and values are ordinary (C\(hystyle) strings.
+The following sections describe attributes that control graph layout.
+.PP
+A more complete description of the language can be found at
+https://www.graphviz.org/doc/info/lang.html.
+.SH "GRAPH, NODE AND EDGE ATTRIBUTES"
+Graphviz uses the \fIname\fP=\fIvalue\fP attributes, attached to graphs, subgraphs,
+nodes and edges, to tailor the layout and rendering. We list the more prominent
+attributes below. The complete list is available at 
+https://www.graphviz.org/doc/info/attrs.html.
+.SH "  Attributes Common to Nodes, Edges, Clusters and Graphs"
+\fBhref=\fIurl\fR the default url for image map files; in PostScript files,
+the base URL for all relative URLs, as recognized by Acrobat Distiller
+3.0 and up.
+.PP
+\fBURL=\fIurl\fR (``URL'' is a synonym for ``href.'')
+.PP
+\fBfontcolor=\fIcolorvalue\fR sets the label text color.
+.PP
+A \fIcolorvalue\fP may be "\fIh,s,v\fB"\fR (hue, saturation, brightness)
+floating point numbers between 0 and 1, or an X11 color name such as
+\fBwhite, black, red, green, blue, yellow, magenta,\fR or \fBcyan\fR,
+or a "\fI#rrggbb" (red, green, blue, 2 hex characters each) value.
+See https://www.graphviz.org/doc/info/attrs.html#k:color and
+https://www.graphviz.org/doc/info/colors.html for further details.
+.PP
+\fBfontsize=\fIn\fR sets the label type size to \fIn\fP points.
+.PP
+\fBfontname=\fIname\fR sets the label font family name.
+.PP
+\fBlabel=\fItext\fR where \fItext\fP may include escaped newlines
+\\\|n, \\\|l, or \\\|r for center, left, and right justified lines.
+The string '\\G' value will be replaced by the graph name.
+For node labels, the string '\\N' value will be replaced by the node name.
+For edges,
+if the substring '\\T' is found in a label, it will be replaced by the name of the tail node;
+if the substring '\\H' is found in a label, it will be replaced by the name of the head node;
+if the substring '\\E' value is found in a label it will be replaced by: \fItail_node_name\fP\->\fIhead_node_name\fP
+or by: \fItail_node_name\fP\-\-\fIhead_node_name\fP for undirected graphs.
+.PP
+Graphviz also supports special HTML-like labels for constructing complex node
+content. A full\(hydescription of these is given at https://www.graphviz.org/doc/info/shapes.html#html.
+.PP
+If a node has \fBshape=record\fP, the label
+may contain recursive box lists delimited by { | }.
+Port identifiers in labels are set off by angle brackets < >.
+.PP
+.SH "  Graph Attributes"
+\fBsize="\fIx,y\fP"\fR specifies the maximum bounding box of drawing in inches.
+.PP
+\fBratio=\fIf\fR sets the aspect ratio to \fIf\fP which may be
+a floating point number, or one of the keywords \fBfill\fP,
+\fBcompress\fP, or \fBauto\fP.
+.PP
+\fBlayout=\fIengine\fR indicates the preferred layout engine (\fBdot\fP, \fBneato\fP, \fBfdp\fP, etc.) overriding the default 
+from the basename of the command or the \-K commandline option.
+.PP
+\fBmargin=\fIf\fR sets the page margin (included in the page size).
+.PP
+\fBordering=out\fR constrains order of out\(hyedges in a subgraph
+according to their file sequence.
+.PP
+\fBrotate=90\fR sets landscape mode. 
+(\fBorientation=land\fR is backward compatible but obsolete.)
+.PP
+\fBcenter=\fIn\fR a non\(hyzero value centers the drawing on the page.
+.PP
+\fBcolor=\fIcolorvalue\fR sets foreground color (\fBbgcolor\fP for background).
+.PP
+\fBoverlap=\fImode\fR. This specifies what algorithm should do if
+any nodes overlap. If mode is \fBfalse\fP, the program uses the Prism algorithm
+to adjust the nodes to eliminate overlaps. If mode is \fBscale\fP,
+the layout is uniformly scaled up, preserving node sizes, until nodes no
+longer overlap. The latter technique removes overlaps while preserving
+symmetry and structure, while the former removes overlaps more compactly
+but destroys symmetries.
+If mode is \fBtrue\fP (the default), no repositioning is done.
+Since the \fBdot\fP algorithm always produces a layout with no node overlaps, this
+attribute is only useful with other layouts.
+.PP
+\fBstylesheet=\fI"file.css"\fR includes a reference to a stylesheet
+in \-Tsvg and \-Tsvgz outputs.  Ignored by other formats.
+.PP
+\fBsplines\fR If set to \fBtrue\fR, edges are
+drawn as splines.
+If set to \fBpolyline\fR, edges are 
+drawn as polylines.
+If set to \fBortho\fR, edges are 
+drawn as orthogonal polylines.
+In all of these cases, the nodes must not overlap.
+If \fBsplines=\fBfalse\fR or \fBsplines=\fBline\fR, edges are 
+drawn as line segments.
+The default is \fBtrue\fR for dot, and \fBfalse\fR for all other layouts.
+
+.PP
+\fB(dot\(hyspecific attributes)\fR
+.br
+.PP
+\fBnodesep=\fIf\fR sets the minimum separation between nodes.
+.PP
+\fBranksep=\fIf\fR sets the minimum separation between ranks.
+.PP
+\fBrankdir=LR|RL|BT\fR requests a left\(hyto\(hyright, right\(hyto\(hyleft, or bottom\(hyto\(hytop, drawing.
+.PP
+\fBrank=same\fR (or \fBmin\fP or \fBmax\fP) in a subgraph
+constrains the rank assignment of its nodes.   If a subgraph's
+name has the prefix \fBcluster\fP, its nodes are drawn in
+a distinct rectangle of the layout.  Clusters may be nested.
+
+.PP
+\fB(neato\(hyspecific attributes)\fR
+.br
+\fBmode=\fIval\fR.  Algorithm for minimizing energy in the layout. By default,
+\fBneato\fR uses stress majorization. If \fBmode=KK\fP, it uses a version of
+gradient descent.
+.PP
+\fBmodel=\fIval\fR.  The \fBneato\fP model computes the desired distances between
+all pairs of vertices. By default, it uses the length of the shortest path. If \fBmodel\fP
+is set to \fBcircuit\fP, a circuit-resistance model is used. 
+If \fBmodel\fP is set to \fBsubset\fP, it uses a model whereby the edge length is the number
+of nodes that are neighbors of exactly one of the edge's vertices. 
+.PP
+\fBstart=\fIval\fR.  Requests random initial placement and seeds
+the random number generator.  If \fIval\fP is not an integer,
+the process ID or current time is used as the seed.
+.PP
+\fBepsilon=\fIn\fR.  Sets the cutoff for the solver.
+The default is 0.1.
+
+.PP
+\fB(twopi\(hyspecific attributes)\fR
+.br
+\fBroot=\fIctr\fR. This specifies the node to be used as the center of
+the layout. If not specified, \fItwopi\fP will randomly pick one of the
+nodes that are furthest from a leaf node, where a leaf node is a node
+of degree 1. If no leaf nodes exists, an arbitrary node is picked as center.
+.PP
+\fBranksep=\fIval\fR. Specifies the radial distance in inches between
+the sequence of rings. The default is 0.75.
+
+.PP
+\fB(circo\(hyspecific attributes)\fR
+.br
+\fBroot=\fInodename\fR. Specifies the name of a node occurring in the
+root block. If the graph is disconnected, the \fBroot\fP node attribute
+can be used to specify additional root blocks.
+.PP
+\fBmindist=\fIvalue\fR. Sets the minimum separation between all nodes. If not
+specified then \fIcirco\fP uses a default value of 1.0.
+
+.PP
+\fB(fdp\(hyspecific attributes)\fR
+.br
+\fBK=\fIval\fR. Sets the default ideal node separation
+in the layout.
+.PP
+\fBmaxiter=\fIval\fR. Sets the maximum number of iterations used to
+layout the graph.
+.PP
+\fBstart=\fIval\fR. Adjusts the random initial placement of nodes
+with no specified position.  If \fIval\fP is an integer,
+it is used as the seed for the random number generator.
+If \fIval\fP is not an integer, a random system\(hygenerated integer,
+such as the process ID or current time, is used as the seed.
+.PP
+
+.SH "  Node Attributes"
+.PP
+\fBheight=\fId\fR or \fBwidth=\fId\fR sets minimum height or width.
+Adding \fBfixedsize=true\fP forces these to be the actual size
+(text labels are ignored).
+.PP
+\fBshape=\fIbuiltin_polygon\fR record epsf
+.br
+\fIbuiltin_polygon\fR can be such values as \fBplaintext, ellipse, oval, circle, egg, 
+triangle, box, diamond, trapezium, parallelogram, house, hexagon, octagon,
+note, tab, box3d, or component,\fR, among others.
+(Polygons are defined or modified by the following node attributes:
+\fBregular\fR, \fBperipheries\fR, \fBsides\fR, \fBorientation\fR,
+\fBdistortion\fR and \fBskew\fR.)  \fBepsf\fR uses the node's
+\fBshapefile\fR attribute as the path name of an external
+EPSF file to be automatically loaded for the node shape.
+.PP
+See https://www.graphviz.org/doc/info/shapes.html for a complete description
+of node shapes.
+.PP
+\fBcolor=\fIcolorvalue\fR sets the outline color, and the default fill color
+if style=filled and \fBfillcolor\fR is not specified.
+.PP
+\fBfillcolor=\fIcolorvalue\fR sets the fill color
+when style=filled.  If not specified, the fillcolor when style=filled defaults
+to be the same as the outline color.
+.PP
+\fBstyle=filled solid dashed dotted bold invis\fP
+.PP
+\fBxlabel=\fI"text"\fR specifies a label that will be place near, but outside,
+of a node. The normal \fBlabel\fP string is placed within the node shape.
+.PP
+\fBtarget=\fI"target"\fR is a target string for client\(hyside imagemaps
+and SVG, effective when nodes have a URL.
+The target string is used to determine which window of the browser is used
+for the URL.  Setting it to "_graphviz" will open a new window if it doesn't
+already exist, or reuse it if it does.
+If the target string is empty, the default,
+then no target attribute is included in the output.
+The substrings '\\N' and '\\G' are substituted in the same manner as
+for the node label attribute.
+Additionally the substring '\\L' is substituted with the node label string.
+.PP
+\fBtooltip=\fI"text"\fR is a tooltip string for client\(hyside imagemaps
+and SVG, effective when nodes have a URL.  The tooltip string defaults to be the
+same as the label string, but this attribute permits nodes without
+labels to still have tooltips thus permitting denser graphs.
+The substrings '\\N' and '\\G' are substituted in the same manner as
+for the node label attribute.
+Additionally the substring '\\L' is substituted with the node label string.
+.PP
+The following attributes apply only to polygon shape nodes:
+.PP
+\fBregular=\fIn\fR if \fIn\fR is non\(hyzero then the polygon is made 
+regular, i.e. symmetric about the x and y axis, otherwise the
+polygon takes on the aspect ratio of the label. 
+\fIbuiltin_polygons\fR that are not already regular are made regular
+by this attribute.
+\fIbuiltin_polygons\fR that are already regular are not affected (i.e.
+they cannot be made asymmetric).
+.PP
+\fBperipheries=\fIn\fR sets the number of periphery lines drawn around
+the polygon.  This value supersedes the number of periphery lines
+of \fIbuiltin_polygons\fR.
+.PP
+\fBsides=\fIn\fR sets the number of sides to the polygon. \fIn\fR<3
+results in an ellipse.
+This attribute is ignored by \fIbuiltin_polygons\fR.
+.PP
+\fBorientation=\fIf\fR sets the orientation of the first apex of the
+polygon counterclockwise from the vertical, in degrees.
+\fIf\fR may be a floating point number.
+The orientation of labels is not affected by this attribute.
+This attribute is added to the initial orientation of \fIbuiltin_polygons.\fR
+.PP
+\fBdistortion=\fIf\fR sets the amount of broadening of the top and
+narrowing of the bottom of the polygon (relative to its orientation). 
+Floating point values between \-1 and +1 are suggested.
+This attribute is ignored by \fIbuiltin_polygons\fR.
+.PP                                                            
+\fBskew=\fIf\fR sets the amount of right\(hydisplacement of the top and
+left\(hydisplacement of the bottom of the polygon (relative to its
+orientation).
+Floating point values between \-1 and +1 are suggested.
+This attribute is ignored by \fIbuiltin_polygons\fR.
+
+.PP
+\fB(circo\(hyspecific attributes)\fR
+.br
+\fBroot=\fItrue/false\fR. This specifies that the block containing the given
+node be treated as the root of the spanning tree in the layout.
+
+.PP
+\fB(neato\(hy and fdp\(hyspecific attributes)\fR
+.br
+\fBpin=\fIval\fR. If \fIval\fR is \fBtrue\fP, the node will remain at
+its initial position.
+
+.SH "  Edge Attributes"
+\fBweight=\fIval\fR where \fIval\fP is the cost of the edge.
+For \fBdot\fP, weights must be non-negative integers.
+Values greater than 1 tend to shorten the edge;  weight 0 flat
+edges are ignored for ordering nodes.
+In \fBtwopi\fP, a weight of 0 will cause the edge to be ignored in constructing
+the underlying spanning tree. For \fBneato\fP and \fBfdp\fP, a heavier weight will
+put more emphasis on the algorithm achieving an edge length closer to that specified by
+the edge's \fBlen\fP attribute. 
+.PP
+\fBstyle=solid dashed dotted bold invis\fP
+.PP
+\fBcolor=\fIcolorvalue\fR sets the line color for edges.
+.PP
+\fBcolor=\fIcolorvaluelist\fR a ':' separated list of \fIcolorvalue\fR creates
+parallel edges, one edge for each color.
+.PP
+\fBdir=forward back both none\fP controls arrow direction.
+.PP
+\fBtailclip,headclip=false\fP disables endpoint shape clipping.
+.PP
+\fBtarget=\fI"text"\fR is a target string for client\(hyside imagemaps
+and SVG, effective when edges have a URL.
+If the target string is empty, the default,
+then no target attribute is included in the output.
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBtooltip=\fI"text"\fR is a tooltip string for client\(hyside imagemaps
+effective when edges have a URL.  The tooltip string defaults to be the
+same as the edge label string. 
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBarrowhead,arrowtail=none, normal, inv, dot, odot, invdot, invodot,
+tee, empty, invempty, open, halfopen, diamond, odiamond, box, obox, crow\fP.
+Specifies the shape of the glyph occurring where the edge touches the head
+or tail node, respectively. Note that this only specifies the shape. The \fBdir\fP
+attribute determines whether or not the glyph is drawn.
+.PP
+\fBarrowsize=\fIval\fR specifies a multiplicative scale factor for the size of the arrowhead.
+inv_length=6,inv_width=7,dot_radius=2) 
+.PP
+\fBheadlabel,taillabel=\fItext\fR for labels appearing near the head and tail nodes of an edge.
+\fBlabelfontcolor\fP, \fBlabelfontname\fP, \fBlabelfontsize\fP
+for head and tail labels.
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBheadhref=\fI"url"\fR sets the url for the head port in imagemap, PostScript and SVG files.
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBheadURL=\fI"url"\fR (\fBheadURL\fP is a synonym for \fBheadhref\fP.)
+.PP
+\fBheadtarget=\fI"headtarget"\fR is a target string for client\(hyside imagemaps
+and SVG, effective when edge heads have a URL.
+The headtarget string is used to determine which window of the browser is used
+for the URL.  If the headtarget string is empty, the default,
+then headtarget defaults to the same value as target for the edge.
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBheadtooltip=\fI"tooltip"\fR is a tooltip string for client\(hyside imagemaps
+effective when head ports have a URL.  The tooltip string defaults to be the
+same as the headlabel string. 
+The substrings '\\T', '\\H', and '\\E' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBtailhref=\fI"url"\fR sets the url for the tail port in imagemap, PostScript and SVG files.
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBtailURL=\fI"url"\fR (\fBtailURL\fP is a synonym for \fBtailhref\fP.)
+.PP
+\fBtailtarget=\fI"tailtarget"\fR is a target string for client\(hyside imagemaps
+and SVG, effective when edge tails have a URL.
+The tailtarget string is used to determine which window of the browser is used
+for the URL.  If the tailtarget string is empty, the default,
+then tailtarget defaults to the same value as target for the edge.
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBtailtooltip=\fI"tooltip"\fR is a tooltip string for client\(hyside imagemaps
+effective when tail ports have a URL.  The tooltip string defaults to be the
+same as the taillabel string. 
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBlabeldistance\fP and \fBlabelangle\fP (in degrees CCW) specify the placement of
+head and tail labels.
+.PP
+\fBdecorate\fP draws line from edge to label.
+.PP
+\fBsamehead,sametail\fP aim edges having the same value to the
+same port, using the average landing point.
+
+.PP
+\fB(dot\(hyspecific attributes)\fR
+.br
+\fBconstraint=false\fP causes an edge to be ignored for rank assignment.
+.PP
+\fBminlen=\fIn\fR where \fIn\fP is an integer factor that applies
+to the edge length (ranks for normal edges, or minimum node separation
+for flat edges).
+.PP
+\fBxlabel=\fI"text"\fR Edge labels in \fBdot\fP are treated as special types of nodes,
+with space allocated for them during node layout. This can sometimes deform the edge
+routing. If an \fBxlabel\fP is used instead, the label is placed after all nodes and edges
+have been positioned. In turn, this may mean that there is some overlap among the labels.
+.PP
+\fB(neato and fdp\(hyspecific attributes)\fR
+.br
+\fBlen=\fIf\fR sets the optimal length of an edge.
+The default is 1.0.
+.PP
+.SH "COMMAND\(hyLINE OPTIONS"
+\fB\-G\fP sets a default graph attribute.
+.br
+\fB\-N\fP sets a default node attribute.
+.br
+\fB\-E\fP sets a default edge attribute.
+Example: \fB\-Gsize="7,8" \-Nshape=box \-Efontsize=8\fR
+.PP
+\fB\-\-filepath=\fIpath\fR uses \fIpath\fR as a prefix for locating externally
+referenced files. For example, using \fB\-\-filepath=bar/baz\fR would cause
+\fBfoo.png\fR in \fBimage="foo.png"\fR to be looked for on disk as
+\fBbar/baz/foo.png\fR. This overrides any \fBimagepath\fR set either on the
+command line or as an attribute within the input graph source.
+.PP
+\fB\-l\fIfile\fR loads custom PostScript library files.
+Usually these define custom shapes or styles.
+If \fB\-l\fP is given by itself, the standard library is omitted.
+.PP
+\fB\-T\fIlang\fR sets the output language as described above.
+
+.PP
+\fB\-n\fR[\fB1\fR|\fB2\fR] (no\(hyop)
+If set, neato assumes nodes have already been positioned and all
+nodes have a pos attribute giving the positions.
+It then performs an optional adjustment to remove node\(hynode overlap,
+depending on the value of the overlap attribute,
+computes the edge layouts, depending on the value of the \fBsplines\fR attribute,
+and emits the graph in the appropriate format.
+If num is supplied, the following actions occur:
+.nf
+    num = 1
+.fi
+Equivalent to \-n.
+.nf
+    num > 1
+.fi
+Use node positions as specified,
+with no adjustment to remove node\(hynode overlaps,
+and use any edge layouts already specified by the pos attribute.
+neato computes an edge layout for any edge that does not have a \fBpos\fP attribute.
+As usual, edge layout is guided by the \fBsplines\fR attribute.
+.PP
+\fB\-K\fIlayout\fR override the default layout engine implied by the command name.
+.PP
+\fB\-O\fP automatically generate output filenames based on the input filename and the \-T format.
+.PP
+\fB\-P\fP generate a graph of the currently available plugins.
+.PP
+\fB\-v\fP (verbose) prints various information useful for debugging.
+.PP
+\fB\-c\fP configure plugins.
+.PP
+\fB\-q\fIlevel\fR set level of message suppression. The default is 1.
+.PP
+\fB\-s\fIfscale\fR scale input by \fIfscale\fP, the default is 72.
+.PP
+\fB\-y\fR invert y coordinate in output.
+.PP
+\fB\-o\fIfile\fR write output to \fIfile\fP.
+.PP
+\fB\-x\fP reduce graph.
+.PP
+\fB\-Lg\fP don't use grid.
+.PP
+\fB\-LO\fP use old attractive force.
+.PP
+\fB\-Ln\fIi\fR set number of iterations to \fIi\fP.
+.PP
+\fB\-LU\fIi\fR set unscaled factor to \fIi\fP.
+.PP
+\fB\-LC\fIv\fR set overlap expansion factor to \fIv\fP.
+.PP
+\fB\-LT\fR[*]\fIv\fR set temperature (temperature factor) to \fIv\fP.
+.PP
+\fB\-V\fP (version) prints version information and exits.
+.PP
+\fB\-?\fP prints the usage and exits.
+.PP
+A complete description of the available command\(hyline options can be found at
+https://www.graphviz.org/doc/info/command.html.
+.SH "EXAMPLES"
+.nf
+digraph test123 {
+        a \-> b \-> c;
+        a \-> {x y};
+        b [shape=box];
+        c [label="hello\\\|nworld",color=blue,fontsize=24,
+             fontname="Palatino\-Italic",fontcolor=red,style=filled];
+        a \-> z [label="hi", weight=100];
+        x \-> z [label="multi\-line\\\|nlabel"];
+        edge [style=dashed,color=red];
+        b \-> x;
+        {rank=same; b x}
+}
+.fi
+.PP
+.nf
+graph test123 {
+        a \-\- b \-\- c;
+        a \-\- {x y};
+        x \-\- c [w=10.0];
+        x \-\- y [w=5.0,len=3];
+}
+.fi
+.SH "CAVEATS"
+Edge splines can overlap unintentionally.
+.PP
+Flat edge labels are slightly broken.
+Intercluster edge labels are totally broken.
+.PP
+Because unconstrained optimization is employed, node boxes can
+possibly overlap or touch unrelated edges.  All existing
+spring embedders seem to have this limitation.
+.PP
+Apparently reasonable attempts to pin nodes or adjust edge lengths
+and weights can cause instability.
+.SH AUTHORS
+Stephen C. North <[email protected]>
+.br
+Emden R. Gansner <[email protected]>
+.br
+John C. Ellson <[email protected]>
+.br
+Yifan Hu <[email protected]>
+.PP
+The bitmap driver (PNG, GIF etc) is by Thomas Boutell, <http://www.boutell.com/gd>
+.PP
+The Truetype font renderer is from
+the Freetype Project (David Turner, Robert Wilhelm, and Werner Lemberg)
+(who can be contacted at freetype\[email protected]\-muenchen.de).
+.SH "SEE ALSO"
+This man page contains only a small amount of the information related
+to the Graphviz layout programs. The most complete information can be
+found at https://www.graphviz.org/documentation/, especially in the
+on\(hyline reference pages. Most of these documents are also available in the
+\fIdoc\fP and \fIdoc/info\fP subtrees in the source and binary distributions.
+.PP
+.BR tcldot (n), xcolors (1), libcgraph (3).
+.PP
+E. R. Gansner, S. C. North,  K. P. Vo, "DAG \(hy A Program to Draw Directed Graphs", Software \(hy Practice and Experience 17(1), 1988, pp. 1047\(hy1062.
+.br
+E. R. Gansner, E. Koutsofios, S. C. North,  K. P. Vo, "A Technique for Drawing Directed Graphs," IEEE Trans. on Soft. Eng. 19(3), 1993, pp. 214\(hy230.
+.br
+S. North and E. Koutsofios, "Applications of graph visualization",
+Graphics Interface 94, pp. 234\(hy245.
+.br
+E. R. Gansner and E. Koutsofios and S. C. North, "Drawing Graphs with dot," 
+Available at https://www.graphviz.org/pdf/dotguide.pdf.
+.br
+S. C. North, "NEATO User's Manual".
+Available https://www.graphviz.org/pdf/neatoguide.pdf.
+.br
+E. R. Gansner and Y. Hu, "Efficient, Proximity-Preserving Node Overlap Removal",
+J. Graph Algorithms Appl., 14(1) pp. 53\(hy74, 2010. 
+.SH "NOTES"
+On non-Windows platforms, sending \fBSIGUSR1\fR to Graphviz can be used to
+toggle on and off some extra points reporting in the neatogen code.

+ 109 - 0
graphviz.mod/graphviz/cmd/dot/dot.c

@@ -0,0 +1,109 @@
+/**
+ * @file
+ * @brief main rendering program for various layouts of graphs and output formats
+ */
+
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: Details at https://graphviz.org
+ *************************************************************************/
+
+/*
+ * Written by Stephen North and Eleftherios Koutsofios.
+ */
+
+#include "config.h"
+
+#include <cgraph/cgraph.h>
+#include <gvc/gvc.h>
+#include <gvc/gvio.h>
+#include <util/exit.h>
+
+#include <common/globals.h>
+
+#include <stdbool.h>
+#include <stdlib.h>
+#include <time.h>
+
+static GVC_t *Gvc;
+static graph_t * G;
+
+#ifndef _WIN32
+#ifndef NO_FPERR
+static void fperr(int s)
+{
+    fprintf(stderr, "caught SIGFPE %d\n", s);
+    /* signal (s, SIG_DFL); raise (s); */
+    graphviz_exit(1);
+}
+#endif
+#endif
+
+int main(int argc, char **argv)
+{
+    graph_t *prev = NULL;
+    int r, rc = 0;
+
+    Gvc = gvContextPlugins(lt_preloaded_symbols, DEMAND_LOADING);
+    GvExitOnUsage = 1;
+    gvParseArgs(Gvc, argc, argv);
+#ifndef _WIN32
+    signal(SIGUSR1, gvToggle);
+#ifndef NO_FPERR
+    signal(SIGFPE, fperr);
+#endif
+#endif
+
+    if ((G = gvPluginsGraph(Gvc))) {
+	    gvLayoutJobs(Gvc, G);  /* take layout engine from command line */
+	    gvRenderJobs(Gvc, G);
+    }
+    else {
+	while ((G = gvNextInputGraph(Gvc))) {
+	    if (prev) {
+		gvFreeLayout(Gvc, prev);
+		agclose(prev);
+	    }
+	    gvLayoutJobs(Gvc, G);  /* take layout engine from command line */
+	    gvRenderJobs(Gvc, G);
+	    r = agreseterrors();
+	    rc = MAX(rc,r);
+	    prev = G;
+	}
+    }
+    gvFinalize(Gvc);
+    r = gvFreeContext(Gvc);
+    graphviz_exit(MAX(rc,r));
+}
+
+/**
+ * @dir .
+ * @brief main rendering program for various layouts of graphs and output formats
+ */
+
+/**
+ * @mainpage
+ *
+ * %Hierarchy:\n
+ * -# Applications
+ *   - @ref cmd/dot – main rendering application for various layouts of graphs and output formats
+ *   - @ref cmd – directory of applications
+ *   - @ref dot.demo "dot.demo" – demo programs
+ * -# @ref plugin – Plugins of graph layout engines and output formats
+ * -# Core libraries
+ *   -# @ref engines
+ *     -# @ref common_render – rendering for layout engines
+ *     -# @ref common_utils – low level utilities for layout engines
+ *   -# @ref lib – miscellaneous libraries
+ *   -# @ref cgraph – abstract graph C library
+ *     -# @ref cgraph_app – uncoupled application specific functions
+ *     -# @ref cgraph_core – highly cohesive core
+ * -# Low level utility libraries
+ *   - @ref cgraph_utils – low level cgraph utilities
+ *   - @ref lib/cdt – Container Data Types library
+ */

+ 55 - 0
graphviz.mod/graphviz/cmd/dot/dot_builtins.cpp

@@ -0,0 +1,55 @@
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: Details at https://graphviz.org
+ *************************************************************************/
+
+#include "config.h"
+
+#include <gvc/gvplugin.h>
+
+#if defined(GVDLL)
+#define IMPORT	__declspec(dllimport)
+#else
+#define IMPORT /* nothing */
+#endif
+
+extern "C" {
+
+IMPORT extern gvplugin_library_t gvplugin_dot_layout_LTX_library;
+IMPORT extern gvplugin_library_t gvplugin_neato_layout_LTX_library;
+#ifdef HAVE_LIBGD
+IMPORT extern gvplugin_library_t gvplugin_gd_LTX_library;
+#endif
+#ifdef HAVE_PANGOCAIRO
+IMPORT extern gvplugin_library_t gvplugin_pango_LTX_library;
+#ifdef HAVE_WEBP
+IMPORT extern gvplugin_library_t gvplugin_webp_LTX_library;
+#endif
+#endif
+IMPORT extern gvplugin_library_t gvplugin_core_LTX_library;
+IMPORT extern gvplugin_library_t gvplugin_vt_LTX_library;
+
+
+lt_symlist_t lt_preloaded_symbols[] = {
+	{ "gvplugin_dot_layout_LTX_library", &gvplugin_dot_layout_LTX_library },
+	{ "gvplugin_neato_layout_LTX_library", &gvplugin_neato_layout_LTX_library },
+#ifdef HAVE_PANGOCAIRO
+	{ "gvplugin_pango_LTX_library", &gvplugin_pango_LTX_library },
+#ifdef HAVE_WEBP
+	{ "gvplugin_webp_LTX_library", &gvplugin_webp_LTX_library },
+#endif
+#endif
+#ifdef HAVE_LIBGD
+	{ "gvplugin_gd_LTX_library", &gvplugin_gd_LTX_library },
+#endif
+	{ "gvplugin_core_LTX_library", &gvplugin_core_LTX_library },
+	{ "gvplugin_vt_LTX_library", &gvplugin_vt_LTX_library },
+	{ 0, 0 }
+};
+
+}

+ 97 - 0
graphviz.mod/graphviz/cmd/dot/dot_sandbox

@@ -0,0 +1,97 @@
+#!/usr/bin/env python3
+
+"""
+Graphviz sandbox
+
+This program is a wrapper around Graphviz. It aims to provide a safe environment for the
+processing of untrusted input graphs and command line options. More precisely:
+  1. No network access will be allowed.
+  2. The file system will be read-only. Command line options like `-o …` and `-O` will
+     not work. It is expected that the caller will render to stdout and pipe the output
+     to their desired file.
+"""
+
+import abc
+import platform
+import shutil
+import subprocess as sp
+import sys
+from pathlib import Path
+from typing import List, Type, Union
+
+
+class Sandbox:
+    """
+    API for sandbox interaction
+
+    Specific sandbox mechanisms should be implemented as derived classes of this.
+    """
+
+    @staticmethod
+    @abc.abstractmethod
+    def is_usable() -> bool:
+        """is this sandbox available on the current platform?"""
+        raise NotImplementedError
+
+    @staticmethod
+    @abc.abstractmethod
+    def _run(args: List[Union[Path, str]]) -> int:
+        """run the given command line within the sandbox"""
+        raise NotImplementedError
+
+    @classmethod
+    def run(cls, args: List[Union[Path, str]]) -> int:
+        """wrapper around `_run` to perform common sanity checks"""
+        assert cls.is_usable(), "attempted to use unusable sandbox"
+        return cls._run(args)
+
+
+class Bubblewrap(Sandbox):
+    """
+    Bubblewrap¹-based sandbox
+
+    ¹ https://github.com/containers/bubblewrap
+    """
+
+    def is_usable() -> bool:
+        return shutil.which("bwrap") is not None
+
+    def _run(args: List[Union[Path, str]]) -> sp.CompletedProcess:
+        prefix = ["bwrap", "--ro-bind", "/", "/", "--unshare-all", "--"]
+        return sp.call(prefix + args)
+
+
+def main(args: List[str]) -> int:
+    """entry point"""
+
+    # available sandboxes in order of preference
+    SANDBOXES: Tuple[Type[Sandbox]] = (Bubblewrap,)
+
+    # locate Graphviz, preferring the version collocated with us
+    exe = ".exe" if platform.system() == "Windows" else ""
+    dot = Path(__file__).parent / f"dot{exe}"
+    if not dot.exists():
+        dot = shutil.which("dot")
+    if dot is None:
+        sys.stderr.write("Graphviz (`dot`) not found\n")
+        return -1
+
+    # find a usable sandbox
+    sandbox: Optional[Type[Sandbox]] = None
+    for box in SANDBOXES:
+        if not box.is_usable():
+            continue
+        sandbox = box
+        break
+    if sandbox is None:
+        sys.stderr.write("no usable sandbox found\n")
+        return -1
+
+    dot_args = args[1:]
+
+    # run Graphviz
+    return sandbox.run([dot] + dot_args)
+
+
+if __name__ == "__main__":
+    sys.exit(main(sys.argv))

+ 29 - 0
graphviz.mod/graphviz/cmd/dot/dot_sandbox.1

@@ -0,0 +1,29 @@
+.TH DOT_SANDBOX 1
+.SH NAME
+dot_sandbox \- Graphviz sandbox
+.SH SYNOPSIS
+\fBdot_sandbox\fR \fIoptions...\fR
+.SH DESCRIPTION
+This program is a wrapper around Graphviz. It aims to provide a safe environment
+for the processing of untrusted input graphs and command line options. More
+precisely:
+.RS
+.IP \[bu] 2
+No network access will be allowed.
+.IP \[bu]
+The file system will be read-only. Command line options like \fB\-o ...\fR and
+\fB\-O\fR will not work. It is expected that the caller will render to
+\fBstdout\fR and pipe the output to their desired file.
+.RE
+.PP
+The command line options to \fBdot_sandbox\fR are command line options to be
+passed to \fBdot\fR. Options are passed through unmodified.
+.PP
+The following sandboxing mechanisms are supported:
+.RS
+.IP \[bu] 2
+Bubblewrap
+.RE
+.SH "SEE ALSO"
+.BR dot (1),
+.BR bwrap (1)

+ 13 - 0
graphviz.mod/graphviz/cmd/dot/no_builtins.c

@@ -0,0 +1,13 @@
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: Details at https://graphviz.org
+ *************************************************************************/
+
+#include <gvc/gvplugin.h>
+
+lt_symlist_t lt_preloaded_symbols[] = {{0, 0}};

+ 458 - 0
graphviz.mod/graphviz/cmd/dot/osage.1

@@ -0,0 +1,458 @@
+.TH OSAGE 1 "27 May 2009"
+.SH NAME
+osage \- filter for drawing clustered graphs
+.SH SYNOPSIS
+\fBosage\fR
+[\fB\-\fR(\fBG\fR|\fBN\fR|\fBE\fR)\fIname=value\fR]
+[\fB\-T\fIlang\fR]
+[\fB\-l\fIlibfile\fR]
+[\fB\-o\fIoutfile\fR]
+[\fB\-O\fR]
+[\fB\-P\fR]
+[\fB\-v\fR]
+[\fB\-V\fR]
+[files]
+.SH DESCRIPTION
+.I osage
+draws clustered graphs. As input, it takes any graph in the
+.I dot
+format. It draws the graph recursively. At each level, there will
+be a collection of nodes and a collection of cluster subgraphs.
+The internals of each cluster subgraph are laid out, then the 
+cluster subgraphs and nodes at the current level are positioned
+relative to each other, treating each cluster subgraph as a node. 
+.P
+At each level, the nodes and cluster subgraphs are viewed as rectangles
+to be packed together. At present, edges are ignored during packing.
+Packing is done using the standard packing functions. In particular,
+the graph attributes \fBpack\fP and \fBpackmode\fP control the layout.
+Each graph and cluster can specify its own values for these attributes.
+Remember also that a cluster inherits its attribute values from
+its parent graph.
+.P
+After all nodes and clusters, edges are routed based on the value of
+the \fBsplines\fP attribute.
+.SH OUTPUT FORMATS
+Osage uses an extensible plugin mechanism for its output renderers,
+so to see what output formats your installation of osage supports
+you can use ``osage \-Txxx'' (where xxx is an unlikely format)
+and check the warning message.
+Also, The plugin mechanism supports multiple implementations
+of the output formats.
+To see what variants are available, use, for example: ``osage \-Tpng:''
+and to force a particular variant, use, for example: ``osage \-Tpng:gd''
+.P
+Traditionally, osage supports the following:
+\fB\-Tps\fP (PostScript),
+\fB\-Tsvg\fP \fB\-Tsvgz\fP (Structured Vector Graphics),
+\fB\-Tfig\fP (XFIG graphics),
+\fB\-Tmif\fP (FrameMaker graphics),
+\fB\-Thpgl\fP (HP pen plotters), and \fB\-Tpcl\fP (Laserjet printers),
+\fB\-Tpng\fP \fB\-Tgif\fP (bitmap graphics),
+\fB\-Timap\fP (imagemap files for httpd servers for each node or edge
+that has a non\(hynull "href" attribute.),
+\fB\-Tcmapx\fP (client\(hyside imagemap for use in html and xhtml).
+Additional less common or more special\(hypurpose output formats
+can be found at https://www.graphviz.org/doc/info/output.html.)
+.P
+Alternative plugins providing support for a given output format
+can be found from the error message resulting from appending a ':' to the format. e.g. \fB\-Tpng:\fP
+The first plugin listed is always the default.
+.SH GRAPH FILE LANGUAGE
+Here is a synopsis of the graph file language, normally using the extension \fB.gv\fR, for graphs:
+.PP
+[\fBstrict\fR] (\fBgraph\fR|\fBdigraph\fR) \fIname\fP { \fIstatement\(hylist\fP }\fR
+.br 
+Is the top level graph. If the graph is \fBstrict\fR then multiple edges are
+not allowed between the same pairs of nodes.
+If it is a directed graph, indicated by \fBdigraph\fR,
+then the \fIedgeop\fR must be "\->". If it is an undirected \fBgraph\fR
+then the \fIedgeop\fR must be "\-\-".
+Statements may be:
+.PP
+\fIname\fB=\fIval\fB;\fR
+.br
+\fBnode [\fIname\fB=\fIval\fB];\fR
+.br
+\fBedge [\fIname\fB=\fIval\fB];\fR
+.br
+Set default graph, node, or edge attribute \fIname\fP to \fIval\fP.
+Any subgraph, node, or edge appearing after this inherits the new
+default attributes.
+.PP
+\fBn0 [\fIname0=val0,name1=val1,...\fB];\fR
+Creates node \fBn0\fP (if it does not already exist)
+and sets its attributes according to the optional list. 
+.PP
+\fBn0 \fIedgeop\fR n1 \fIedgeop\fR \fI...\fB \fIedgeop\fR nn [\fIname0=val0,name1=val1,...\fB];\fR
+.br
+Creates edges between nodes \fBn0\fP, \fBn1\fP, ..., \fBnn\fP and sets
+their attributes according to the optional list.
+Creates nodes as necessary.
+.PP
+[\fBsubgraph \fIname\fB] { \fIstatement\(hylist \fB}\fR
+.br
+Creates a subgraph.  Subgraphs may be used in place
+of \fBn0\fP, ..., \fBnn\fP in the above statements to create edges.
+[\fBsubgraph \fIname\fR] is optional;
+if missing, the subgraph is assigned an internal name. 
+.PP
+Comments may be /*C\(hylike*/ or //C++\(hylike.
+
+.PP
+Attribute names and values are ordinary (C\(hystyle) strings.
+The following sections describe attributes that control graph layout.
+
+.SH "GRAPH ATTRIBUTES"
+.PP
+\fBsize="\fIx,y\fP"\fR sets bounding box of drawing in inches.
+.PP
+\fBpage="\fIx,y\fP"\fR sets the PostScript pagination unit.
+.PP
+\fBratio=\fIf\fR sets the aspect ratio to \fIf\fP which may be
+a floating point number, or one of the keywords \fBfill\fP,
+\fBcompress\fP, or \fBauto\fP.
+.PP
+\fBpagedir=\fR[TBLR][TBLR] sets the major and minor order of pagination.
+.PP
+\fBrotate=90\fR sets landscape mode. 
+(\fBorientation=land\fR is backward compatible but obsolete.)
+.PP
+\fBcenter=\fIn\fR a non\(hyzero value centers the drawing on the page.
+.PP
+\fBlayers="\fIid:id:id:id\fR" is a sequence of layer identifiers for
+overlay diagrams.  The PostScript array variable \fIlayercolorseq\fR
+sets the assignment of colors to layers. The least index is 1 and 
+each element must be a 3\(hyelement array to be interpreted as a color coordinate.
+.PP
+\fBcolor=\fIcolorvalue\fR sets foreground color (\fBbgcolor\fP for background).
+.PP
+\fBhref=\fI"url"\fR the default url for image map files; in PostScript files,
+the base URL for all relative URLs, as recognized by Acrobat Distiller
+3.0 and up.
+.PP
+\fBURL=\fI"url"\fR ("URL" is a synonym for "href".)
+.PP
+\fBstylesheet=\fI"file.css"\fR includes a reference to a stylesheet
+in \-Tsvg and \-Tsvgz outputs.  Ignored by other formats.
+.PP
+\fBsplines\fR. If set to \fItrue\fR, edges are
+drawn as splines.
+If set to \fIpolyline\fR, edges are 
+drawn as polylines.
+If set to \fIortho\fR, edges are 
+drawn as orthogonal polylines.
+In all of these cases, the nodes may not overlap.
+If \fBsplines=\fIfalse\fR or \fBsplines=\fIline\fR, edges are 
+drawn as line segments.
+The default is \fIfalse\fR.
+
+.SH "NODE ATTRIBUTES"
+.PP
+\fBheight=\fId\fR or \fBwidth=\fId\fR sets minimum height or width.
+Adding \fBfixedsize=true\fP forces these to be the actual size
+(text labels are ignored).
+.PP
+\fBshape=record polygon epsf \fIbuiltin_polygon\fR
+.br
+\fIbuiltin_polygon\fR is one of: \fBplaintext ellipse oval circle egg 
+triangle box diamond trapezium parallelogram house hexagon octagon
+note tab box3d component.\fR
+(Polygons are defined or modified by the following node attributes:
+\fBregular\fR, \fBperipheries\fR, \fBsides\fR, \fBorientation\fR,
+\fBdistortion\fR and \fBskew\fR.)  \fBepsf\fR uses the node's
+\fBshapefile\fR attribute as the path name of an external
+EPSF file to be automatically loaded for the node shape.
+.PP
+\fBlabel=\fItext\fR where \fItext\fP may include escaped newlines
+\\\|n, \\\|l, or \\\|r for center, left, and right justified lines.
+The string '\\N' value will be replaced by the node name.
+The string '\\G' value will be replaced by the graph name.
+Record labels may contain recursive box lists delimited by { | }.
+Port identifiers in labels are set off by angle brackets < >.
+In the graph file, use colon (such as, \fBnode0:port28\fR).
+.PP
+\fBfontsize=\fIn\fR sets the label type size to \fIn\fP points.
+.PP
+\fBfontname=\fIname\fR sets the label font family name.
+.PP
+\fBcolor=\fIcolorvalue\fR sets the outline color, and the default fill color
+if style=filled and \fBfillcolor\fR is not specified.
+.PP
+\fBfillcolor=\fIcolorvalue\fR sets the fill color
+when style=filled.  If not specified, the fillcolor when style=filled defaults
+to be the same as the outline color.
+.PP
+\fBfontcolor=\fIcolorvalue\fR sets the label text color.
+.PP
+A \fIcolorvalue\fP may be "\fIh,s,v\fB"\fR (hue, saturation, brightness)
+floating point numbers between 0 and 1, or an X11 color name such as
+\fBwhite black red green blue yellow magenta cyan\fR or \fBburlywood\fR,
+or a "\fI#rrggbb" (red, green, blue, 2 hex characters each) value.
+.PP
+\fBstyle=filled solid dashed dotted bold invis\fP or any Postscript code.
+.PP
+\fBlayer=\fIid\fR or \fIid:id\fR or "all" sets the node's active layers.
+The empty string means no layers (invisible).
+.PP
+The following attributes apply only to polygon shape nodes:
+.PP
+\fBregular=\fIn\fR if \fIn\fR is non\(hyzero then the polygon is made 
+regular, i.e. symmetric about the x and y axis, otherwise the
+polygon takes on the aspect ratio of the label. 
+\fIbuiltin_polygons\fR that are not already regular are made regular
+by this attribute.
+\fIbuiltin_polygons\fR that are already regular are not affected (i.e.
+they cannot be made asymmetric).
+.PP
+\fBperipheries=\fIn\fR sets the number of periphery lines drawn around
+the polygon.  This value supersedes the number of periphery lines
+of \fIbuiltin_polygons\fR.
+.PP
+\fBsides=\fIn\fR sets the number of sides to the polygon. \fIn\fR<3
+results in an ellipse.
+This attribute is ignored by \fIbuiltin_polygons\fR.
+.PP
+\fBorientation=\fIf\fR sets the orientation of the first apex of the
+polygon counterclockwise from the vertical, in degrees.
+\fIf\fR may be a floating point number.
+The orientation of labels is not affected by this attribute.
+This attribute is added to the initial orientation of \fIbuiltin_polygons.\fR
+.PP
+\fBdistortion=\fIf\fR sets the amount of broadening of the top and
+narrowing of the bottom of the polygon (relative to its orientation). 
+Floating point values between \-1 and +1 are suggested.
+This attribute is ignored by \fIbuiltin_polygons\fR.
+.PP                                                            
+\fBskew=\fIf\fR sets the amount of right\(hydisplacement of the top and
+left\(hydisplacement of the bottom of the polygon (relative to its
+orientation).
+Floating point values between \-1 and +1 are suggested.
+This attribute is ignored by \fIbuiltin_polygons\fR.
+.PP
+\fBhref=\fI"url"\fR sets the url for the node in imagemap, PostScript and SVG
+files.
+The substrings '\\N' and '\\G' are substituted in the same manner as
+for the node label attribute.
+Additionally the substring '\\L' is substituted with the node label string.
+.PP
+\fBURL=\fI"url"\fR ("URL" is a synonym for "href".)
+.PP
+\fBtarget=\fI"target"\fR is a target string for client\(hyside imagemaps
+and SVG, effective when nodes have a URL.
+The target string is used to determine which window of the browser is used
+for the URL.  Setting it to "_graphviz" will open a new window if it doesn't
+already exist, or reuse it if it does.
+If the target string is empty, the default,
+then no target attribute is included in the output.
+The substrings '\\N' and '\\G' are substituted in the same manner as
+for the node label attribute.
+Additionally the substring '\\L' is substituted with the node label string.
+.PP
+\fBtooltip=\fI"tooltip"\fR is a tooltip string for client\(hyside imagemaps
+and SVG, effective when nodes have a URL.  The tooltip string defaults to be the
+same as the label string, but this attribute permits nodes without
+labels to still have tooltips thus permitting denser graphs.
+The substrings '\\N' and '\\G' are substituted in the same manner as
+for the node label attribute.
+Additionally the substring '\\L' is substituted with the node label string.
+
+
+.SH "EDGE ATTRIBUTES"
+.PP
+\fBlabel=\fItext\fR where \fItext\fR may include escaped newlines
+\\\|n, \\\|l, or \\\|r for centered, left, or right justified lines.
+If the substring '\\T' is found in a label it will be replaced by the tail_node name.
+If the substring '\\H' is found in a label it will be replaced by the head_node name.
+If the substring '\\E' value is found in a label it will be replaced by: tail_node_name\->head_node_name
+If the substring '\\G' is found in a label it will be replaced by the graph name.
+or by: tail_node_name\-\-head_node_name for undirected graphs.
+.PP
+\fBfontsize=\fIn\fR sets the label type size to \fIn\fP points.
+.PP
+\fBfontname=\fIname\fR sets the label font family name.
+.PP
+\fBfontcolor=\fIcolorvalue\fR sets the label text color.
+.PP
+\fBstyle=solid dashed dotted bold invis\fP
+.PP
+\fBcolor=\fIcolorvalue\fR sets the line color for edges.
+.PP
+\fBcolor=\fIcolorvaluelist\fR a ':' separated list of \fIcolorvalue\fR creates
+parallel edges, one edge for each color.
+.PP
+\fBdir=forward back both none\fP controls arrow direction.
+.PP
+\fBtailclip,headclip=false\fP disables endpoint shape clipping.
+.PP
+\fBhref=\fI"url"\fR sets the url for the node in imagemap, PostScript and SVG
+files.
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBURL=\fI"url"\fR ("URL" is a synonym for "href".)
+.PP
+\fBtarget=\fI"target"\fR is a target string for client\(hyside imagemaps
+and SVG, effective when edges have a URL.
+If the target string is empty, the default,
+then no target attribute is included in the output.
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBtooltip=\fI"tooltip"\fR is a tooltip string for client\(hyside imagemaps
+effective when edges have a URL.  The tooltip string defaults to be the
+same as the edge label string. 
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBarrowhead,arrowtail=none, normal, inv, dot, odot, invdot, invodot,
+tee, empty, invempty, open, halfopen, diamond, odiamond, box, obox, crow\fP.
+.PP
+\fBarrowsize\fP (norm_length=10,norm_width=5,
+inv_length=6,inv_width=7,dot_radius=2) 
+.PP
+\fBheadlabel,taillabel=string\fP for port labels.
+\fBlabelfontcolor\fP,\fBlabelfontname\fP,\fBlabelfontsize\fP
+for head and tail labels.
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBheadhref=\fI"url"\fR sets the url for the head port in imagemap, PostScript and SVG files.
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBheadURL=\fI"url"\fR ("headURL" is a synonym for "headhref".)
+.PP
+\fBheadtarget=\fI"headtarget"\fR is a target string for client\(hyside imagemaps
+and SVG, effective when edge heads have a URL.
+The headtarget string is used to determine which window of the browser is used
+for the URL.  If the headtarget string is empty, the default,
+then headtarget defaults to the same value as target for the edge.
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBheadtooltip=\fI"tooltip"\fR is a tooltip string for client\(hyside imagemaps
+effective when head ports have a URL.  The tooltip string defaults to be the
+same as the headlabel string. 
+The substrings '\\T', '\\H', and '\\E' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBtailhref=\fI"url"\fR sets the url for the tail port in imagemap, PostScript and SVG files.
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBtailURL=\fI"url"\fR ("tailURL" is a synonym for "tailhref".)
+.PP
+\fBtailtarget=\fI"tailtarget"\fR is a target string for client\(hyside imagemaps
+and SVG, effective when edge tails have a URL.
+The tailtarget string is used to determine which window of the browser is used
+for the URL.  If the tailtarget string is empty, the default,
+then tailtarget defaults to the same value as target for the edge.
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBtailtooltip=\fI"tooltip"\fR is a tooltip string for client\(hyside imagemaps
+effective when tail ports have a URL.  The tooltip string defaults to be the
+same as the taillabel string. 
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBlabeldistance\fP and \fPport_label_distance\fP set distance; also
+\fBlabelangle\fP (in degrees CCW)
+.PP
+\fBdecorate\fP draws line from edge to label.
+.PP
+\fBsamehead,sametail\fP aim edges having the same value to the
+same port, using the average landing point.
+.PP
+\fBlayer=\fIid\fR or \fIid:id\fR or "all" sets the edge's active layers.
+The empty string means no layers (invisible).
+
+.PP
+\fB(neato\(hyspecific attributes)\fR
+.br
+\fBw=\fIf\fR sets the weight (spring constant) of an edge
+to the given floating point value.  The default is 1.0;
+greater values make the edge tend more toward its optimal length.
+.PP
+\fBlen=\fIf\fR sets the optimal length of an edge.
+The default is 1.0.
+.SH "COMMAND LINE OPTIONS"
+\fB\-G\fP sets a default graph attribute.
+.br
+\fB\-N\fP sets a default node attribute.
+.br
+\fB\-E\fP sets a default edge attribute.
+Example: \fB\-Gsize="7,8" \-Nshape=box \-Efontsize=8\fR
+.PP
+\fB\-l\fIfile\fR loads custom PostScript library files.
+Usually these define custom shapes or styles.
+If \fB\-l\fP is given by itself, the standard library is omitted.
+.PP
+\fB\-T\fIlang\fR sets the output language as described above.
+.PP
+\fB\-O\fP automatically generate output filenames based on the input filename and the \-T format.
+.PP
+\fB\-o\fIfile\fR write output to \fIfile\fP.
+.PP
+\fB\-x\fP reduce graph.
+.PP
+\fB\-Lg\fP don't use grid.
+.PP
+\fB\-LO\fP use old attractive force.
+.PP
+\fB\-Ln\fIi\fR set number of iterations to \fIi\fP.
+.PP
+\fB\-LU\fIi\fR set unscaled factor to \fIi\fP.
+.PP
+\fB\-LC\fIv\fR set overlap expansion factor to \fIv\fP.
+.PP
+\fB\-LT\fR[*]\fIv\fR set temperature (temperature factor) to \fIv\fP.
+.PP
+\fB\-v\fP (verbose) prints various information useful for debugging.
+.PP
+\fB\-V\fP (version) prints version information and exits.
+.PP
+\fB\-?\fP prints the usage and exits.
+.SH "EXAMPLES"
+.nf
+digraph test123 {
+        pack=8
+        subgraph cluster0 {
+          packmode=array
+          x y x0 y0 x1
+          subgraph cluster1 {
+            m n
+          }
+        }
+        b [shape=box];
+        c [label="hello\enworld",color=blue,fontsize=24,
+             fontname="Palatino\-Italic",fontcolor=red,style=filled];
+        a \-> z
+        x \-> z
+        a \-> b \-> c;
+        a \-> {x y};
+        edge [style=dashed,color=red];
+        b \-> x;
+}
+.fi
+.SH AUTHORS
+Emden R. Gansner <[email protected]>
+.SH "SEE ALSO"
+This man page contains only a small amount of the information related
+to the Graphviz layout programs. The most complete information can be
+found at https://www.graphviz.org/documentation/, especially in the
+on\(hyline reference pages. Most of these documents are also available in the
+\fIdoc\fP and \fIdoc/info\fP subtrees in the source and binary distributions.
+.PP
+dot(1)

+ 464 - 0
graphviz.mod/graphviz/cmd/dot/patchwork.1

@@ -0,0 +1,464 @@
+.TH PATCHWORK 1 "22 April 2011"
+.SH NAME
+patchwork \- filter for drawing clustered graphs as treemaps
+.SH SYNOPSIS
+\fBpatchwork\fR
+[\fB\-\fR(\fBG\fR|\fBN\fR|\fBE\fR)\fIname=value\fR]
+[\fB\-T\fIlang\fR]
+[\fB\-l\fIlibfile\fR]
+[\fB\-o\fIoutfile\fR]
+[\fB\-O\fR]
+[\fB\-P\fR]
+[\fB\-v\fR]
+[\fB\-V\fR]
+[files]
+.SH DESCRIPTION
+.I patchwork
+draws clustered graphs using a squarified treemap layout. 
+As input, it takes any graph in the
+.I dot
+format. Each cluster is given an area based on the areas specified
+by the clusters and nodes it contains. The areas of nodes and empty
+clusters can be specified by the \fBarea\fP attribute.
+The default value is 1.
+.P
+The root graph is laid out as a square. Then, recursively, the region of
+a cluster or graph is partitioned
+among its top-level nodes and clusters, with each given
+a roughly square subregion with its specified area.
+.SH OUTPUT FORMATS
+Patchwork uses an extensible plugin mechanism for its output renderers,
+so to see what output formats your installation of patchwork supports
+you can use ``patchwork \-Txxx'' (where xxx is an unlikely format)
+and check the warning message.
+Also, The plugin mechanism supports multiple implementations
+of the output formats.
+To see what variants are available, use, for example: ``patchwork \-Tpng:''
+and to force a particular variant, use, for example: ``patchwork \-Tpng:gd''
+.P
+Traditionally, patchwork supports the following:
+\fB\-Tps\fP (PostScript),
+\fB\-Tsvg\fP \fB\-Tsvgz\fP (Structured Vector Graphics),
+\fB\-Tfig\fP (XFIG graphics),
+\fB\-Tmif\fP (FrameMaker graphics),
+\fB\-Thpgl\fP (HP pen plotters), and \fB\-Tpcl\fP (Laserjet printers),
+\fB\-Tpng\fP \fB\-Tgif\fP (bitmap graphics),
+\fB\-Timap\fP (imagemap files for httpd servers for each node or edge
+that has a non\(hynull "href" attribute.),
+\fB\-Tcmapx\fP (client\(hyside imagemap for use in html and xhtml).
+Additional less common or more special\(hypurpose output formats
+can be found at https://www.graphviz.org/doc/info/output.html.)
+.P
+Alternative plugins providing support for a given output format
+can be found from the error message resulting from appending a ':' to the format. e.g. \fB\-Tpng:\fP
+The first plugin listed is always the default.
+.SH GRAPH FILE LANGUAGE
+Here is a synopsis of the graph file language, normally using the extension \fB.gv\fR, for graphs:
+.PP
+[\fBstrict\fR] (\fBgraph\fR|\fBdigraph\fR) \fIname\fP { \fIstatement\(hylist\fP }\fR
+.br 
+Is the top level graph. If the graph is \fBstrict\fR then multiple edges are
+not allowed between the same pairs of nodes.
+If it is a directed graph, indicated by \fBdigraph\fR,
+then the \fIedgeop\fR must be "\->". If it is an undirected \fBgraph\fR
+then the \fIedgeop\fR must be "\-\-".
+Statements may be:
+.PP
+\fIname\fB=\fIval\fB;\fR
+.br
+\fBnode [\fIname\fB=\fIval\fB];\fR
+.br
+\fBedge [\fIname\fB=\fIval\fB];\fR
+.br
+Set default graph, node, or edge attribute \fIname\fP to \fIval\fP.
+Any subgraph, node, or edge appearing after this inherits the new
+default attributes.
+.PP
+\fBn0 [\fIname0=val0,name1=val1,...\fB];\fR
+Creates node \fBn0\fP (if it does not already exist)
+and sets its attributes according to the optional list. 
+.PP
+\fBn0 \fIedgeop\fR n1 \fIedgeop\fR \fI...\fB \fIedgeop\fR nn [\fIname0=val0,name1=val1,...\fB];\fR
+.br
+Creates edges between nodes \fBn0\fP, \fBn1\fP, ..., \fBnn\fP and sets
+their attributes according to the optional list.
+Creates nodes as necessary.
+.PP
+[\fBsubgraph \fIname\fB] { \fIstatement\(hylist \fB}\fR
+.br
+Creates a subgraph.  Subgraphs may be used in place
+of \fBn0\fP, ..., \fBnn\fP in the above statements to create edges.
+[\fBsubgraph \fIname\fR] is optional;
+if missing, the subgraph is assigned an internal name. 
+.PP
+Comments may be /*C\(hylike*/ or //C++\(hylike.
+
+.PP
+Attribute names and values are ordinary (C\(hystyle) strings.
+The following sections describe attributes that control graph layout.
+
+.SH "GRAPH ATTRIBUTES"
+.PP
+\fBsize="\fIx,y\fP"\fR sets bounding box of drawing in inches.
+.PP
+\fBpage="\fIx,y\fP"\fR sets the PostScript pagination unit.
+.PP
+\fBratio=\fIf\fR sets the aspect ratio to \fIf\fP which may be
+a floating point number, or one of the keywords \fBfill\fP,
+\fBcompress\fP, or \fBauto\fP.
+.PP
+\fBpagedir=\fR[TBLR][TBLR] sets the major and minor order of pagination.
+.PP
+\fBrotate=90\fR sets landscape mode. 
+(\fBorientation=land\fR is backward compatible but obsolete.)
+.PP
+\fBcenter=\fIn\fR a non\(hyzero value centers the drawing on the page.
+.PP
+\fBlayers="\fIid:id:id:id\fR" is a sequence of layer identifiers for
+overlay diagrams.  The PostScript array variable \fIlayercolorseq\fR
+sets the assignment of colors to layers. The least index is 1 and 
+each element must be a 3\(hyelement array to be interpreted as a color coordinate.
+.PP
+\fBcolor=\fIcolorvalue\fR sets foreground color (\fBbgcolor\fP for background).
+.PP
+\fBhref=\fI"url"\fR the default url for image map files; in PostScript files,
+the base URL for all relative URLs, as recognized by Acrobat Distiller
+3.0 and up.
+.PP
+\fBURL=\fI"url"\fR ("URL" is a synonym for "href".)
+.PP
+\fBstylesheet=\fI"file.css"\fR includes a reference to a stylesheet
+in \-Tsvg and \-Tsvgz outputs.  Ignored by other formats.
+.PP
+\fBsplines\fR. If set to \fItrue\fR, edges are
+drawn as splines.
+If set to \fIpolyline\fR, edges are 
+drawn as polylines.
+If set to \fIortho\fR, edges are 
+drawn as orthogonal polylines.
+In all of these cases, the nodes may not overlap.
+If \fBsplines=\fIfalse\fR or \fBsplines=\fIline\fR, edges are 
+drawn as line segments.
+The default is \fIfalse\fR.
+
+.SH "NODE ATTRIBUTES"
+.PP
+\fBheight=\fId\fR or \fBwidth=\fId\fR sets minimum height or width.
+Adding \fBfixedsize=true\fP forces these to be the actual size
+(text labels are ignored).
+.PP
+\fBshape=record polygon epsf \fIbuiltin_polygon\fR
+.br
+\fIbuiltin_polygon\fR is one of: \fBplaintext ellipse oval circle egg 
+triangle box diamond trapezium parallelogram house hexagon octagon
+note tab box3d component.\fR
+(Polygons are defined or modified by the following node attributes:
+\fBregular\fR, \fBperipheries\fR, \fBsides\fR, \fBorientation\fR,
+\fBdistortion\fR and \fBskew\fR.)  \fBepsf\fR uses the node's
+\fBshapefile\fR attribute as the path name of an external
+EPSF file to be automatically loaded for the node shape.
+.PP
+\fBlabel=\fItext\fR where \fItext\fP may include escaped newlines
+\\\|n, \\\|l, or \\\|r for center, left, and right justified lines.
+The string '\\N' value will be replaced by the node name.
+The string '\\G' value will be replaced by the graph name.
+Record labels may contain recursive box lists delimited by { | }.
+Port identifiers in labels are set off by angle brackets < >.
+In the graph file, use colon (such as, \fBnode0:port28\fR).
+.PP
+\fBfontsize=\fIn\fR sets the label type size to \fIn\fP points.
+.PP
+\fBfontname=\fIname\fR sets the label font family name.
+.PP
+\fBcolor=\fIcolorvalue\fR sets the outline color, and the default fill color
+if style=filled and \fBfillcolor\fR is not specified.
+.PP
+\fBfillcolor=\fIcolorvalue\fR sets the fill color
+when style=filled.  If not specified, the fillcolor when style=filled defaults
+to be the same as the outline color.
+.PP
+\fBfontcolor=\fIcolorvalue\fR sets the label text color.
+.PP
+A \fIcolorvalue\fP may be "\fIh,s,v\fB"\fR (hue, saturation, brightness)
+floating point numbers between 0 and 1, or an X11 color name such as
+\fBwhite black red green blue yellow magenta cyan\fR or \fBburlywood\fR,
+or a "\fI#rrggbb" (red, green, blue, 2 hex characters each) value.
+.PP
+\fBstyle=filled solid dashed dotted bold invis\fP or any Postscript code.
+.PP
+\fBlayer=\fIid\fR or \fIid:id\fR or "all" sets the node's active layers.
+The empty string means no layers (invisible).
+.PP
+The following attributes apply only to polygon shape nodes:
+.PP
+\fBregular=\fIn\fR if \fIn\fR is non\(hyzero then the polygon is made 
+regular, i.e. symmetric about the x and y axis, otherwise the
+polygon takes on the aspect ratio of the label. 
+\fIbuiltin_polygons\fR that are not already regular are made regular
+by this attribute.
+\fIbuiltin_polygons\fR that are already regular are not affected (i.e.
+they cannot be made asymmetric).
+.PP
+\fBperipheries=\fIn\fR sets the number of periphery lines drawn around
+the polygon.  This value supersedes the number of periphery lines
+of \fIbuiltin_polygons\fR.
+.PP
+\fBsides=\fIn\fR sets the number of sides to the polygon. \fIn\fR<3
+results in an ellipse.
+This attribute is ignored by \fIbuiltin_polygons\fR.
+.PP
+\fBorientation=\fIf\fR sets the orientation of the first apex of the
+polygon counterclockwise from the vertical, in degrees.
+\fIf\fR may be a floating point number.
+The orientation of labels is not affected by this attribute.
+This attribute is added to the initial orientation of \fIbuiltin_polygons.\fR
+.PP
+\fBdistortion=\fIf\fR sets the amount of broadening of the top and
+narrowing of the bottom of the polygon (relative to its orientation). 
+Floating point values between \-1 and +1 are suggested.
+This attribute is ignored by \fIbuiltin_polygons\fR.
+.PP                                                            
+\fBskew=\fIf\fR sets the amount of right\(hydisplacement of the top and
+left\(hydisplacement of the bottom of the polygon (relative to its
+orientation).
+Floating point values between \-1 and +1 are suggested.
+This attribute is ignored by \fIbuiltin_polygons\fR.
+.PP
+\fBhref=\fI"url"\fR sets the url for the node in imagemap, PostScript and SVG
+files.
+The substrings '\\N' and '\\G' are substituted in the same manner as
+for the node label attribute.
+Additionally the substring '\\L' is substituted with the node label string.
+.PP
+\fBURL=\fI"url"\fR ("URL" is a synonym for "href".)
+.PP
+\fBtarget=\fI"target"\fR is a target string for client\(hyside imagemaps
+and SVG, effective when nodes have a URL.
+The target string is used to determine which window of the browser is used
+for the URL.  Setting it to "_graphviz" will open a new window if it doesn't
+already exist, or reuse it if it does.
+If the target string is empty, the default,
+then no target attribute is included in the output.
+The substrings '\\N' and '\\G' are substituted in the same manner as
+for the node label attribute.
+Additionally the substring '\\L' is substituted with the node label string.
+.PP
+\fBtooltip=\fI"tooltip"\fR is a tooltip string for client\(hyside imagemaps
+and SVG, effective when nodes have a URL.  The tooltip string defaults to be the
+same as the label string, but this attribute permits nodes without
+labels to still have tooltips thus permitting denser graphs.
+The substrings '\\N' and '\\G' are substituted in the same manner as
+for the node label attribute.
+Additionally the substring '\\L' is substituted with the node label string.
+
+
+.SH "EDGE ATTRIBUTES"
+.PP
+\fBlabel=\fItext\fR where \fItext\fR may include escaped newlines
+\\\|n, \\\|l, or \\\|r for centered, left, or right justified lines.
+If the substring '\\T' is found in a label it will be replaced by the tail_node name.
+If the substring '\\H' is found in a label it will be replaced by the head_node name.
+If the substring '\\E' value is found in a label it will be replaced by: tail_node_name\->head_node_name
+If the substring '\\G' is found in a label it will be replaced by the graph name.
+or by: tail_node_name\-\-head_node_name for undirected graphs.
+.PP
+\fBfontsize=\fIn\fR sets the label type size to \fIn\fP points.
+.PP
+\fBfontname=\fIname\fR sets the label font family name.
+.PP
+\fBfontcolor=\fIcolorvalue\fR sets the label text color.
+.PP
+\fBstyle=solid dashed dotted bold invis\fP
+.PP
+\fBcolor=\fIcolorvalue\fR sets the line color for edges.
+.PP
+\fBcolor=\fIcolorvaluelist\fR a ':' separated list of \fIcolorvalue\fR creates
+parallel edges, one edge for each color.
+.PP
+\fBdir=forward back both none\fP controls arrow direction.
+.PP
+\fBtailclip,headclip=false\fP disables endpoint shape clipping.
+.PP
+\fBhref=\fI"url"\fR sets the url for the node in imagemap, PostScript and SVG
+files.
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBURL=\fI"url"\fR ("URL" is a synonym for "href".)
+.PP
+\fBtarget=\fI"target"\fR is a target string for client\(hyside imagemaps
+and SVG, effective when edges have a URL.
+If the target string is empty, the default,
+then no target attribute is included in the output.
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBtooltip=\fI"tooltip"\fR is a tooltip string for client\(hyside imagemaps
+effective when edges have a URL.  The tooltip string defaults to be the
+same as the edge label string. 
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBarrowhead,arrowtail=none, normal, inv, dot, odot, invdot, invodot,
+tee, empty, invempty, open, halfopen, diamond, odiamond, box, obox, crow\fP.
+.PP
+\fBarrowsize\fP (norm_length=10,norm_width=5,
+inv_length=6,inv_width=7,dot_radius=2) 
+.PP
+\fBheadlabel,taillabel=string\fP for port labels.
+\fBlabelfontcolor\fP,\fBlabelfontname\fP,\fBlabelfontsize\fP
+for head and tail labels.
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBheadhref=\fI"url"\fR sets the url for the head port in imagemap, PostScript and SVG files.
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBheadURL=\fI"url"\fR ("headURL" is a synonym for "headhref".)
+.PP
+\fBheadtarget=\fI"headtarget"\fR is a target string for client\(hyside imagemaps
+and SVG, effective when edge heads have a URL.
+The headtarget string is used to determine which window of the browser is used
+for the URL.  If the headtarget string is empty, the default,
+then headtarget defaults to the same value as target for the edge.
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBheadtooltip=\fI"tooltip"\fR is a tooltip string for client\(hyside imagemaps
+effective when head ports have a URL.  The tooltip string defaults to be the
+same as the headlabel string. 
+The substrings '\\T', '\\H', and '\\E' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBtailhref=\fI"url"\fR sets the url for the tail port in imagemap, PostScript and SVG files.
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBtailURL=\fI"url"\fR ("tailURL" is a synonym for "tailhref".)
+.PP
+\fBtailtarget=\fI"tailtarget"\fR is a target string for client\(hyside imagemaps
+and SVG, effective when edge tails have a URL.
+The tailtarget string is used to determine which window of the browser is used
+for the URL.  If the tailtarget string is empty, the default,
+then tailtarget defaults to the same value as target for the edge.
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBtailtooltip=\fI"tooltip"\fR is a tooltip string for client\(hyside imagemaps
+effective when tail ports have a URL.  The tooltip string defaults to be the
+same as the taillabel string. 
+The substrings '\\T', '\\H', '\\E' and '\\G' are substituted in the same manner as
+for the edge label attribute.
+Additionally the substring '\\L' is substituted with the edge label string.
+.PP
+\fBlabeldistance\fP and \fPport_label_distance\fP set distance; also
+\fBlabelangle\fP (in degrees CCW)
+.PP
+\fBdecorate\fP draws line from edge to label.
+.PP
+\fBsamehead,sametail\fP aim edges having the same value to the
+same port, using the average landing point.
+.PP
+\fBlayer=\fIid\fR or \fIid:id\fR or "all" sets the edge's active layers.
+The empty string means no layers (invisible).
+
+.PP
+\fB(neato\(hyspecific attributes)\fR
+.br
+\fBw=\fIf\fR sets the weight (spring constant) of an edge
+to the given floating point value.  The default is 1.0;
+greater values make the edge tend more toward its optimal length.
+.PP
+\fBlen=\fIf\fR sets the optimal length of an edge.
+The default is 1.0.
+.SH "COMMAND LINE OPTIONS"
+\fB\-G\fP sets a default graph attribute.
+.br
+\fB\-N\fP sets a default node attribute.
+.br
+\fB\-E\fP sets a default edge attribute.
+Example: \fB\-Gsize="7,8" \-Nshape=box \-Efontsize=8\fR
+.PP
+\fB\-l\fIfile\fR loads custom PostScript library files.
+Usually these define custom shapes or styles.
+If \fB\-l\fP is given by itself, the standard library is omitted.
+.PP
+\fB\-T\fIlang\fR sets the output language as described above.
+.PP
+\fB\-O\fP automatically generate output filenames based on the input filename and the \-T format.
+.PP
+\fB\-o\fIfile\fR write output to \fIfile\fP.
+.PP
+\fB\-x\fP reduce graph.
+.PP
+\fB\-Lg\fP don't use grid.
+.PP
+\fB\-LO\fP use old attractive force.
+.PP
+\fB\-Ln\fIi\fR set number of iterations to \fIi\fP.
+.PP
+\fB\-LU\fIi\fR set unscaled factor to \fIi\fP.
+.PP
+\fB\-LC\fIv\fR set overlap expansion factor to \fIv\fP.
+.PP
+\fB\-LT\fR[*]\fIv\fR set temperature (temperature factor) to \fIv\fP.
+.PP
+\fB\-v\fP (verbose) prints various information useful for debugging.
+.PP
+\fB\-V\fP (version) prints version information and exits.
+.PP
+\fB\-?\fP prints the usage and exits.
+.SH "EXAMPLES"
+.nf
+graph G {
+  node[style=filled]
+  subgraph cluster0 {
+    subgraph cluster0_0 {
+      style=filled
+      fillcolor=green
+      a b[area=3 fillcolor=yellow]
+    }
+    subgraph cluster0_1 {
+       area=2
+       bgcolor=yellow
+    }
+    c [style=filled
+      fillcolor=red ]
+  }
+  subgraph cluster1 {
+    e f
+  }
+}
+.fi
+.SH BUGS
+At present, patchwork ignores edges, and supplies no visual clues to indicate nesting.
+Such clues might consist of nested boxes or thicker rectangular outlines. In addition,
+it would be good if some cluster label could be displayed.
+.P
+Patchwork has no mechanism for fitting labels within the supplied box.
+.SH AUTHORS
+Emden R. Gansner <[email protected]>
+.br
+Yifan Hu <[email protected]>
+.SH "SEE ALSO"
+This man page contains only a small amount of the information related
+to the Graphviz layout programs. The most complete information can be
+found at https://www.graphviz.org/documentation/, especially in the
+on\(hyline reference pages. Most of these documents are also available in the
+\fIdoc\fP and \fIdoc/info\fP subtrees in the source and binary distributions.
+.PP
+dot(1)
+.PP
+M. Bruls, K. Huizing and J. van Wijk, "Squarified Treemaps", Proc. Eurographics and IEEE TVCG Symposium on Visualization, 
+1999, pp. 33\(hy42.
+.br

+ 39 - 0
graphviz.mod/graphviz/cmd/edgepaint/Makefile.am

@@ -0,0 +1,39 @@
+## Process this file with automake to produce Makefile.in
+
+AM_CPPFLAGS = \
+	-I$(top_srcdir)/lib \
+	-I$(top_srcdir)/lib/common \
+	-I$(top_srcdir)/lib/cgraph \
+	-I$(top_srcdir)/lib/cdt
+
+bin_PROGRAMS = edgepaint
+
+dist_man_MANS = edgepaint.1
+if ENABLE_MAN_PDFS
+pdf_DATA = edgepaint.1.pdf
+endif
+
+edgepaint_SOURCES = edgepaintmain.c
+edgepaint_CPPFLAGS = $(AM_CPPFLAGS)
+edgepaint_LDADD = \
+	$(top_builddir)/lib/sfdpgen/libsfdpgen_C.la \
+	$(top_builddir)/lib/edgepaint/libedgepaint_C.la \
+	$(top_builddir)/lib/neatogen/libneatogen_C.la \
+	$(top_builddir)/lib/sparse/libsparse_C.la \
+	$(top_builddir)/lib/gvc/libgvc.la \
+	$(top_builddir)/lib/cgraph/libcgraph.la \
+	$(top_builddir)/lib/cdt/libcdt.la \
+	$(top_builddir)/lib/rbtree/librbtree_C.la \
+	-lm
+
+# add a non-existent C++ source to force the C++ compiler to be used for
+# linking, so the C++ standard library is included for our C++ dependencies
+nodist_EXTRA_edgepaint_SOURCES = fake.cxx
+
+.1.1.pdf:
+	rm -f $@; pdffile=$@; psfile=$${pdffile%pdf}ps; \
+	$(GROFF) -Tps -man $< > $$psfile || { rm -f $$psfile; exit 1; }; \
+	$(PS2PDF) $$psfile && rm -f $$psfile || { rm -f $$psfile; exit 1; }
+SUFFIXES = .1 .1.pdf
+
+DISTCLEANFILES = $(pdf_DATA)

+ 1040 - 0
graphviz.mod/graphviz/cmd/edgepaint/Makefile.in

@@ -0,0 +1,1040 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = edgepaint$(EXEEXT)
+subdir = cmd/edgepaint
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \
+	$(top_srcdir)/m4/ax_compare_version.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltargz.m4 \
+	$(top_srcdir)/m4/ltdl.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/./version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \
+	"$(DESTDIR)$(pdfdir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_edgepaint_OBJECTS = edgepaint-edgepaintmain.$(OBJEXT)
+edgepaint_OBJECTS = $(am_edgepaint_OBJECTS)
+edgepaint_DEPENDENCIES = $(top_builddir)/lib/sfdpgen/libsfdpgen_C.la \
+	$(top_builddir)/lib/edgepaint/libedgepaint_C.la \
+	$(top_builddir)/lib/neatogen/libneatogen_C.la \
+	$(top_builddir)/lib/sparse/libsparse_C.la \
+	$(top_builddir)/lib/gvc/libgvc.la \
+	$(top_builddir)/lib/cgraph/libcgraph.la \
+	$(top_builddir)/lib/cdt/libcdt.la \
+	$(top_builddir)/lib/rbtree/librbtree_C.la
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/config/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/edgepaint-edgepaintmain.Po \
+	./$(DEPDIR)/edgepaint-fake.Po
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+SOURCES = $(edgepaint_SOURCES) $(nodist_EXTRA_edgepaint_SOURCES)
+DIST_SOURCES = $(edgepaint_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(dist_man_MANS)
+DATA = $(pdf_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in \
+	$(top_srcdir)/config/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+ANN_CFLAGS = @ANN_CFLAGS@
+ANN_LIBS = @ANN_LIBS@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+CYGWIN = @CYGWIN@
+DARWIN = @DARWIN@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEVIL_INCLUDES = @DEVIL_INCLUDES@
+DEVIL_LIBS = @DEVIL_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+EXPAT_CFLAGS = @EXPAT_CFLAGS@
+EXPAT_LIBS = @EXPAT_LIBS@
+FGREP = @FGREP@
+FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@
+FREETYPE2_LIBS = @FREETYPE2_LIBS@
+GDIPLUS_CFLAGS = @GDIPLUS_CFLAGS@
+GDIPLUS_HEADS = @GDIPLUS_HEADS@
+GDIPLUS_LIBS = @GDIPLUS_LIBS@
+GDK_CFLAGS = @GDK_CFLAGS@
+GDK_LIBS = @GDK_LIBS@
+GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@
+GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@
+GDLIB_CFLAGS = @GDLIB_CFLAGS@
+GDLIB_CONFIG = @GDLIB_CONFIG@
+GDLIB_LIBS = @GDLIB_LIBS@
+GLADE_CFLAGS = @GLADE_CFLAGS@
+GLADE_LIBS = @GLADE_LIBS@
+GLUT_CFLAGS = @GLUT_CFLAGS@
+GLUT_LIBS = @GLUT_LIBS@
+GO = @GO@
+GO_INCLUDES = @GO_INCLUDES@
+GO_LIBS = @GO_LIBS@
+GRAPHVIZ_AUTHOR_EMAIL = @GRAPHVIZ_AUTHOR_EMAIL@
+GRAPHVIZ_AUTHOR_NAME = @GRAPHVIZ_AUTHOR_NAME@
+GRAPHVIZ_CHANGE_DATE = @GRAPHVIZ_CHANGE_DATE@
+GRAPHVIZ_VERSION_DATE = @GRAPHVIZ_VERSION_DATE@
+GRAPHVIZ_VERSION_MAJOR = @GRAPHVIZ_VERSION_MAJOR@
+GRAPHVIZ_VERSION_MICRO = @GRAPHVIZ_VERSION_MICRO@
+GRAPHVIZ_VERSION_MINOR = @GRAPHVIZ_VERSION_MINOR@
+GREP = @GREP@
+GROFF = @GROFF@
+GS_CFLAGS = @GS_CFLAGS@
+GS_LIBS = @GS_LIBS@
+GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@
+GTKGLEXT_LIBS = @GTKGLEXT_LIBS@
+GTKGL_CFLAGS = @GTKGL_CFLAGS@
+GTKGL_LIBS = @GTKGL_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+GTS_CFLAGS = @GTS_CFLAGS@
+GTS_LIBS = @GTS_LIBS@
+GUILE_CFLAGS = @GUILE_CFLAGS@
+GUILE_LIBS = @GUILE_LIBS@
+GVPLUGIN_CONFIG_FILE = @GVPLUGIN_CONFIG_FILE@
+GVPLUGIN_VERSION = @GVPLUGIN_VERSION@
+GVPLUGIN_VERSION_INFO = @GVPLUGIN_VERSION_INFO@
+HAVE_CXX17 = @HAVE_CXX17@
+INCLTDL = @INCLTDL@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTGOSIZE = @INTGOSIZE@
+IPSEPCOLA_INCLUDES = @IPSEPCOLA_INCLUDES@
+IPSEPCOLA_LIBS = @IPSEPCOLA_LIBS@
+JAVA = @JAVA@
+JAVASCRIPT = @JAVASCRIPT@
+JAVA_INCLUDES = @JAVA_INCLUDES@
+JAVA_LIBS = @JAVA_LIBS@
+JNI_EXTRA_LDFLAGS = @JNI_EXTRA_LDFLAGS@
+JSHEXT = @JSHEXT@
+LASI_CFLAGS = @LASI_CFLAGS@
+LASI_LIBS = @LASI_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBADD_DL = @LIBADD_DL@
+LIBADD_DLD_LINK = @LIBADD_DLD_LINK@
+LIBADD_DLOPEN = @LIBADD_DLOPEN@
+LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@
+LIBLTDL = @LIBLTDL@
+LIBOBJS = @LIBOBJS@
+LIBPOSTFIX = @LIBPOSTFIX@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTDLDEPS = @LTDLDEPS@
+LTDLINCL = @LTDLINCL@
+LTDLOPEN = @LTDLOPEN@
+LTLIBOBJS = @LTLIBOBJS@
+LT_ARGZ_H = @LT_ARGZ_H@
+LT_CONFIG_H = @LT_CONFIG_H@
+LT_DLLOADERS = @LT_DLLOADERS@
+LT_DLPREOPEN = @LT_DLPREOPEN@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+LUA = @LUA@
+LUA_INCLUDES = @LUA_INCLUDES@
+LUA_INSTALL_DIR = @LUA_INSTALL_DIR@
+LUA_LIBS = @LUA_LIBS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MATH_LIBS = @MATH_LIBS@
+MCS = @MCS@
+MINGW32 = @MINGW32@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJC = @OBJC@
+OBJCDEPMODE = @OBJCDEPMODE@
+OBJCFLAGS = @OBJCFLAGS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@
+PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@
+PANGOFT2_CFLAGS = @PANGOFT2_CFLAGS@
+PANGOFT2_LIBS = @PANGOFT2_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PERL_INCLUDES = @PERL_INCLUDES@
+PERL_INSTALL_DIR = @PERL_INSTALL_DIR@
+PERL_LIBS = @PERL_LIBS@
+PHP = @PHP@
+PHPCONFIG = @PHPCONFIG@
+PHP_INCLUDES = @PHP_INCLUDES@
+PHP_INSTALL_DATADIR = @PHP_INSTALL_DATADIR@
+PHP_INSTALL_DIR = @PHP_INSTALL_DIR@
+PHP_LIBS = @PHP_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PLATFORMSDKINCLUDE = @PLATFORMSDKINCLUDE@
+PLATFORMSDKLIB = @PLATFORMSDKLIB@
+POPPLER_CFLAGS = @POPPLER_CFLAGS@
+POPPLER_LIBS = @POPPLER_LIBS@
+PS2PDF = @PS2PDF@
+PYTHON3 = @PYTHON3@
+PYTHON3_INCLUDES = @PYTHON3_INCLUDES@
+PYTHON3_INSTALL_DIR = @PYTHON3_INSTALL_DIR@
+PYTHON3_LIBS = @PYTHON3_LIBS@
+QMAKE = @QMAKE@
+QTCORE_CFLAGS = @QTCORE_CFLAGS@
+QTCORE_LIBS = @QTCORE_LIBS@
+QTGUI_CFLAGS = @QTGUI_CFLAGS@
+QTGUI_LIBS = @QTGUI_LIBS@
+QUARTZ_CFLAGS = @QUARTZ_CFLAGS@
+QUARTZ_LIBS = @QUARTZ_LIBS@
+RANLIB = @RANLIB@
+RSVG_CFLAGS = @RSVG_CFLAGS@
+RSVG_LIBS = @RSVG_LIBS@
+RUBY = @RUBY@
+RUBY_CFLAGS = @RUBY_CFLAGS@
+RUBY_INSTALL_DIR = @RUBY_INSTALL_DIR@
+RUBY_LIBS = @RUBY_LIBS@
+RUBY_VER = @RUBY_VER@
+R_CFLAGS = @R_CFLAGS@
+R_LIBS = @R_LIBS@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHARED_LIBRARY_SUFFIX = @SHARED_LIBRARY_SUFFIX@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SWIG = @SWIG@
+SWIGJAVA_CPPFLAGS = @SWIGJAVA_CPPFLAGS@
+SWIG_PHP_DATA = @SWIG_PHP_DATA@
+SWIG_PHP_DATA_TO_PACKAGE = @SWIG_PHP_DATA_TO_PACKAGE@
+SWIG_PHP_OPT = @SWIG_PHP_OPT@
+SWIG_VERSION = @SWIG_VERSION@
+TCLCONFIG = @TCLCONFIG@
+TCLINT_INCLUDES = @TCLINT_INCLUDES@
+TCLSH = @TCLSH@
+TCLSH_EXEC_PREFIX = @TCLSH_EXEC_PREFIX@
+TCL_CFLAGS = @TCL_CFLAGS@
+TCL_DEFS = @TCL_DEFS@
+TCL_INCLUDES = @TCL_INCLUDES@
+TCL_INSTALL_DIR = @TCL_INSTALL_DIR@
+TCL_LIBS = @TCL_LIBS@
+TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@
+TCL_MINOR_VERSION = @TCL_MINOR_VERSION@
+TCL_PATCH_LEVEL = @TCL_PATCH_LEVEL@
+TCL_PKGINDEX = @TCL_PKGINDEX@
+TCL_PKGINDEX_GD = @TCL_PKGINDEX_GD@
+TCL_PKGINDEX_SWIG = @TCL_PKGINDEX_SWIG@
+TCL_SHLIB_SUFFIX = @TCL_SHLIB_SUFFIX@
+TCL_SRC_DIR = @TCL_SRC_DIR@
+TCL_STUB_LIB_SPEC = @TCL_STUB_LIB_SPEC@
+TCL_VERSION = @TCL_VERSION@
+VERSION = @VERSION@
+WEBP_CFLAGS = @WEBP_CFLAGS@
+WEBP_LIBS = @WEBP_LIBS@
+XMKMF = @XMKMF@
+XRENDER_CFLAGS = @XRENDER_CFLAGS@
+XRENDER_LIBS = @XRENDER_LIBS@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+Z_INCLUDES = @Z_INCLUDES@
+Z_LIBS = @Z_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_OBJC = @ac_ct_OBJC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+demodir = @demodir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+ltdl_LIBOBJS = @ltdl_LIBOBJS@
+ltdl_LTLIBOBJS = @ltdl_LTLIBOBJS@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sys_symbol_underscore = @sys_symbol_underscore@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AM_CPPFLAGS = \
+	-I$(top_srcdir)/lib \
+	-I$(top_srcdir)/lib/common \
+	-I$(top_srcdir)/lib/cgraph \
+	-I$(top_srcdir)/lib/cdt
+
+dist_man_MANS = edgepaint.1
+@ENABLE_MAN_PDFS_TRUE@pdf_DATA = edgepaint.1.pdf
+edgepaint_SOURCES = edgepaintmain.c
+edgepaint_CPPFLAGS = $(AM_CPPFLAGS)
+edgepaint_LDADD = \
+	$(top_builddir)/lib/sfdpgen/libsfdpgen_C.la \
+	$(top_builddir)/lib/edgepaint/libedgepaint_C.la \
+	$(top_builddir)/lib/neatogen/libneatogen_C.la \
+	$(top_builddir)/lib/sparse/libsparse_C.la \
+	$(top_builddir)/lib/gvc/libgvc.la \
+	$(top_builddir)/lib/cgraph/libcgraph.la \
+	$(top_builddir)/lib/cdt/libcdt.la \
+	$(top_builddir)/lib/rbtree/librbtree_C.la \
+	-lm
+
+
+# add a non-existent C++ source to force the C++ compiler to be used for
+# linking, so the C++ standard library is included for our C++ dependencies
+nodist_EXTRA_edgepaint_SOURCES = fake.cxx
+SUFFIXES = .1 .1.pdf
+DISTCLEANFILES = $(pdf_DATA)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .1 .1.pdf .c .cxx .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu cmd/edgepaint/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu cmd/edgepaint/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+edgepaint$(EXEEXT): $(edgepaint_OBJECTS) $(edgepaint_DEPENDENCIES) $(EXTRA_edgepaint_DEPENDENCIES) 
+	@rm -f edgepaint$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(edgepaint_OBJECTS) $(edgepaint_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/edgepaint-edgepaintmain.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/edgepaint-fake.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+	@$(MKDIR_P) $(@D)
+	@echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.c.o:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+edgepaint-edgepaintmain.o: edgepaintmain.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edgepaint_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT edgepaint-edgepaintmain.o -MD -MP -MF $(DEPDIR)/edgepaint-edgepaintmain.Tpo -c -o edgepaint-edgepaintmain.o `test -f 'edgepaintmain.c' || echo '$(srcdir)/'`edgepaintmain.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/edgepaint-edgepaintmain.Tpo $(DEPDIR)/edgepaint-edgepaintmain.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='edgepaintmain.c' object='edgepaint-edgepaintmain.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edgepaint_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o edgepaint-edgepaintmain.o `test -f 'edgepaintmain.c' || echo '$(srcdir)/'`edgepaintmain.c
+
+edgepaint-edgepaintmain.obj: edgepaintmain.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edgepaint_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT edgepaint-edgepaintmain.obj -MD -MP -MF $(DEPDIR)/edgepaint-edgepaintmain.Tpo -c -o edgepaint-edgepaintmain.obj `if test -f 'edgepaintmain.c'; then $(CYGPATH_W) 'edgepaintmain.c'; else $(CYGPATH_W) '$(srcdir)/edgepaintmain.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/edgepaint-edgepaintmain.Tpo $(DEPDIR)/edgepaint-edgepaintmain.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='edgepaintmain.c' object='edgepaint-edgepaintmain.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edgepaint_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o edgepaint-edgepaintmain.obj `if test -f 'edgepaintmain.c'; then $(CYGPATH_W) 'edgepaintmain.c'; else $(CYGPATH_W) '$(srcdir)/edgepaintmain.c'; fi`
+
+.cxx.o:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cxx.obj:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cxx.lo:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+edgepaint-fake.o: fake.cxx
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edgepaint_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT edgepaint-fake.o -MD -MP -MF $(DEPDIR)/edgepaint-fake.Tpo -c -o edgepaint-fake.o `test -f 'fake.cxx' || echo '$(srcdir)/'`fake.cxx
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/edgepaint-fake.Tpo $(DEPDIR)/edgepaint-fake.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='fake.cxx' object='edgepaint-fake.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edgepaint_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o edgepaint-fake.o `test -f 'fake.cxx' || echo '$(srcdir)/'`fake.cxx
+
+edgepaint-fake.obj: fake.cxx
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edgepaint_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT edgepaint-fake.obj -MD -MP -MF $(DEPDIR)/edgepaint-fake.Tpo -c -o edgepaint-fake.obj `if test -f 'fake.cxx'; then $(CYGPATH_W) 'fake.cxx'; else $(CYGPATH_W) '$(srcdir)/fake.cxx'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/edgepaint-fake.Tpo $(DEPDIR)/edgepaint-fake.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='fake.cxx' object='edgepaint-fake.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(edgepaint_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o edgepaint-fake.obj `if test -f 'fake.cxx'; then $(CYGPATH_W) 'fake.cxx'; else $(CYGPATH_W) '$(srcdir)/fake.cxx'; fi`
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-man1: $(dist_man_MANS)
+	@$(NORMAL_INSTALL)
+	@list1=''; \
+	list2='$(dist_man_MANS)'; \
+	test -n "$(man1dir)" \
+	  && test -n "`echo $$list1$$list2`" \
+	  || exit 0; \
+	echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+	$(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+	{ for i in $$list1; do echo "$$i"; done;  \
+	if test -n "$$list2"; then \
+	  for i in $$list2; do echo "$$i"; done \
+	    | sed -n '/\.1[a-z]*$$/p'; \
+	fi; \
+	} | while read p; do \
+	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; echo "$$p"; \
+	done | \
+	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+	sed 'N;N;s,\n, ,g' | { \
+	list=; while read file base inst; do \
+	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+	  fi; \
+	done; \
+	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+	while read files; do \
+	  test -z "$$files" || { \
+	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+	done; }
+
+uninstall-man1:
+	@$(NORMAL_UNINSTALL)
+	@list=''; test -n "$(man1dir)" || exit 0; \
+	files=`{ for i in $$list; do echo "$$i"; done; \
+	l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+	  sed -n '/\.1[a-z]*$$/p'; \
+	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+	dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+install-pdfDATA: $(pdf_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(pdf_DATA)'; test -n "$(pdfdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; \
+	done
+
+uninstall-pdfDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pdf_DATA)'; test -n "$(pdfdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pdfdir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(MANS) $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pdfdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+		-rm -f ./$(DEPDIR)/edgepaint-edgepaintmain.Po
+	-rm -f ./$(DEPDIR)/edgepaint-fake.Po
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man install-pdfDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+		-rm -f ./$(DEPDIR)/edgepaint-edgepaintmain.Po
+	-rm -f ./$(DEPDIR)/edgepaint-fake.Po
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-pdfDATA
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+	clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-binPROGRAMS \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-man1 \
+	install-pdf install-pdf-am install-pdfDATA install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+	uninstall-am uninstall-binPROGRAMS uninstall-man \
+	uninstall-man1 uninstall-pdfDATA
+
+.PRECIOUS: Makefile
+
+
+.1.1.pdf:
+	rm -f $@; pdffile=$@; psfile=$${pdffile%pdf}ps; \
+	$(GROFF) -Tps -man $< > $$psfile || { rm -f $$psfile; exit 1; }; \
+	$(PS2PDF) $$psfile && rm -f $$psfile || { rm -f $$psfile; exit 1; }
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

+ 71 - 0
graphviz.mod/graphviz/cmd/edgepaint/edgepaint.1

@@ -0,0 +1,71 @@
+.TH CLARIFY 1 "26 February 2014"
+.SH NAME
+edgepaint \- edge coloring to disambiguate crossing edges
+.SH SYNOPSIS
+.B
+[
+.I options
+]
+[
+.BI \-o
+.I outfile
+]
+[
+.I files
+]
+.SH DESCRIPTION
+.B edgepaint
+takes as input a graph in DOT format with node position information (the
+\fIpos\fR attribute) and colors the edges in a manner making it easier to tell
+them apart.
+.SH OPTIONS
+The following options are supported:
+.TP
+.BI \-\-accuracy=  e
+Accuracy with which to find the maximally different coloring for each node with
+regard to its neighbors. Default \fIe\fR = 0.01.
+.TP
+.BI \-\-angle= a
+Color two edges differently if their incidence angle is less than \fIa\fR
+degrees. Default \fIa\fR = 15.
+.TP
+.BI \-\-random_seed= s
+Random seed to use. \fIs\fR must be an integer. If \fIs\fR is negative, we do
+|\fIs\fR| iterations with different seeds and pick the best.
+.TP
+.BI \-\-lightness= "l1,l2"
+Only applies for the "lab" color scheme: \fIl1\fR and \fIl2\fR must integers,
+with 0 <= \fIl1\fR <= \fIl2\fR <=100. By default, we use "0,70".
+.TP
+.BI \-\-share_endpoint
+If this option is specified, edges that share a node are not considered in
+conflict if they are close to parallel but are on the opposite sides of the node
+(around 180 degree).
+.TP
+.BI \-o " f"
+Write output to file \fIf\fR (default: stdout).
+.TP
+.BI \-\-color_scheme= "c"
+Specifies the color scheme.  This can be "rgb", "gray", "lab" (default); or a
+comma-separated list of RGB colors in hex (e.g., "#ff0000,#aabbed,#eeffaa")
+representing a palette; or a string specifying a Brewer color scheme (e.g.,
+"accent7"; see https://graphviz.org/doc/info/colors.html#brewer).
+.TP
+.B \-v
+Turns on verbose mode.
+.TP
+.BI \-?
+Print usage and exit.
+
+.SH BUGS
+At present, \fBedgepaint\fR does not handle graphs with loops or directed
+multiedges. So, a graph with edges \fIa\~\->\~b\fR and \fIb\~\->\~a\fR is
+acceptable, but not if it has edges \fIa\~\->\~b\fR and \fIa\~\->\~b\fR or
+\fIa\~\-\-\~b\fR and \fIa\~\-\-\~b\fR. Ports are ignored in this analysis, so
+having \fIa.x\~\->\~b\fR and \fIa.y\~\->\~b\fR is also not supported.
+.SH AUTHOR
+Yifan Hu <[email protected]>
+.SH "SEE ALSO"
+.PP
+gvmap(1), sfdp(1), neato (1), dot(1)
+.PP

+ 290 - 0
graphviz.mod/graphviz/cmd/edgepaint/edgepaintmain.c

@@ -0,0 +1,290 @@
+/**
+ * @dir .
+ * @brief %edge coloring to disambiguate crossing edges
+ */
+
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ *************************************************************************/
+
+#include "config.h"
+#include "../tools/openFile.h"
+#include <cgraph/cgraph.h>
+#include <cgraph/ingraphs.h>
+#include <common/pointset.h>
+#include <getopt.h>
+#include <util/agxbuf.h>
+#include <util/alloc.h>
+#include <util/exit.h>
+#include <util/startswith.h>
+#include <util/unreachable.h>
+
+#include <sparse/general.h>
+#include <sparse/SparseMatrix.h>
+#include <sparse/DotIO.h>
+#include <edgepaint/node_distinct_coloring.h>
+#include <edgepaint/edge_distinct_coloring.h>
+#include <sparse/color_palette.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+static char *fname;
+static FILE *outfile;
+static char **Files;
+
+static void usage (char* cmd, int eval){
+  fprintf(stderr, "Usage: %s <options> gv file with 2D coordinates.\n", cmd);
+  fprintf(stderr, "Find a color assignment of the edges, such that edges that cross at small angle have as different as possible.\n");
+  fprintf(stderr, "Options are: \n");
+  fprintf(stderr, " --accuracy=e      : accuracy with which to find the maximally different coloring for each node with regard to its neighbors. Default 0.01.\n");
+  fprintf(stderr, " --angle=a         : if edge crossing is less than that angle a, then make the edge colors different. Default 15.\n");
+  fprintf(stderr, " --random_seed=s   : random seed to use. s must be an integer. If s is negative, we do -s iterations with different seeds and pick the best.\n");
+  fprintf(stderr, " --color_scheme=c  : palette used. The string c should be \"rgb\", \"gray\", \"lab\" (default); or\n");
+  fprintf(stderr, "       a comma-separated list of RGB colors in hex (e.g., \"#ff0000,#aabbed,#eeffaa\"); or\n");
+  fprintf(stderr, "       a string specifying a Brewer color scheme (e.g., \"accent7\"; see https://graphviz.org/doc/info/colors.html#brewer).\n");
+  fprintf(stderr, " --lightness=l1,l2 : only applied for LAB color scheme: l1 must be integer >=0, l2 integer <=100, and l1 <=l2. By default we use 0,70\n");
+  fprintf(stderr, " --share_endpoint  :  if this option is specified, edges that shares an end point are not considered in conflict if they are close to\n");
+  fprintf(stderr, "       parallel but is on the opposite ends of the shared point (around 180 degree).\n");
+  fprintf(stderr, " -v               : verbose\n");
+  fprintf(stderr, " -o fname         :  write output to file fname (stdout)\n");
+  graphviz_exit(eval);
+}
+
+/* checkG:
+ * Return non-zero if g has loops or multiedges.
+ * Relies on multiedges occurring consecutively in edge list.
+ */
+static int
+checkG (Agraph_t* g)
+{
+	Agedge_t* e;
+	Agnode_t* n;
+	Agnode_t* h;
+	Agnode_t* prevh = NULL;
+
+	for (n = agfstnode (g); n; n = agnxtnode (g, n)) {
+		for (e = agfstout (g, n); e; e = agnxtout (g, e)) {
+			if ((h = aghead(e)) == n) return 1;   // loop
+			if (h == prevh) return 1;            // multiedge
+			prevh = h;
+		}
+		prevh = NULL;  // reset
+	}
+	return 0;
+}
+
+static void init(int argc, char *argv[], double *angle, double *accuracy,
+                 int *check_edges_with_same_endpoint, int *seed,
+                 const char **color_scheme, int *lightness) {
+
+  char* cmd = argv[0];
+  outfile = NULL;
+
+  Verbose = 0;
+  *accuracy = 0.01;
+  *angle = 15;/* 10 degree by default*/
+  *check_edges_with_same_endpoint = 0;
+  *seed = 123;
+  *color_scheme = "lab";
+  lightness[0] = 0;
+  lightness[1] = 70;
+
+  while (true) {
+
+    // some constants above the range of valid ASCII to use as getopt markers
+    enum {
+      OPT_ACCURACY = 128,
+      OPT_ANGLE = 129,
+      OPT_COLOR_SCHEME = 130,
+      OPT_RANDOM_SEED = 131,
+      OPT_LIGHTNESS = 132,
+      OPT_SHARE_ENDPOINT = 133,
+    };
+
+    static const struct option opts[] = {
+        // clang-format off
+        {"accuracy",       required_argument, 0, OPT_ACCURACY},
+        {"angle",          required_argument, 0, OPT_ANGLE},
+        {"color_scheme",   required_argument, 0, OPT_COLOR_SCHEME},
+        {"random_seed",    required_argument, 0, OPT_RANDOM_SEED},
+        {"lightness",      required_argument, 0, OPT_LIGHTNESS},
+        {"share_endpoint", no_argument,       0, OPT_SHARE_ENDPOINT},
+        {0, 0, 0, 0},
+        // clang-format on
+    };
+
+    int option_index = 0;
+    int c = getopt_long(argc, argv, "a:c:r:l:o:s:v?", opts, &option_index);
+
+    if (c == -1) {
+      break;
+    }
+
+    const char *arg = optarg;
+
+    // legacy handling of single-dash-prefixed options
+    if (c == 'a' && startswith(arg, "ccuracy=")) {
+      c = OPT_ACCURACY;
+      arg += strlen("ccuracy=");
+    } else if (c == 'a' && startswith(arg, "ngle=")) {
+      c = OPT_ANGLE;
+      arg += strlen("ngle=");
+    } else if (c == 'c' && startswith(arg, "olor_scheme=")) {
+      c = OPT_COLOR_SCHEME;
+      arg += strlen("olor_scheme=");
+    } else if (c == 'r' && startswith(arg, "andom_seed=")) {
+      c = OPT_RANDOM_SEED;
+      arg += strlen("andom_seed=");
+    } else if (c == 'l' && startswith(arg, "ightness=")) {
+      c = OPT_LIGHTNESS;
+      arg += strlen("ightness=");
+    } else if (c == 's' && startswith(arg, "hare_endpoint")) {
+      c = OPT_SHARE_ENDPOINT;
+    }
+
+    switch (c) {
+
+    // any valid use of these options should have been handled as legacy above
+    case 'a':
+    case 'c':
+    case 'r':
+    case 'l':
+      fprintf(stderr, "option -%c unrecognized.\n", c);
+      usage(cmd, EXIT_FAILURE);
+      UNREACHABLE();
+
+    case '?':
+      if (optopt == '\0' || optopt == '?') {
+        usage(cmd, EXIT_SUCCESS);
+      }
+      fprintf(stderr, "option -%c unrecognized.\n", optopt);
+      usage(cmd, EXIT_FAILURE);
+      UNREACHABLE();
+
+    case 'o':
+      if (outfile != NULL) {
+        fclose(outfile);
+      }
+      outfile = openFile(cmd, arg, "w");
+      break;
+
+    case 'v':
+      Verbose = 1;
+      break;
+
+    case OPT_ACCURACY:
+      if (sscanf(arg, "%lf", accuracy) != 1 || *accuracy <= 0) {
+        fprintf(stderr, "--accuracy option must be a positive real number.\n");
+        usage(cmd, EXIT_FAILURE);
+      }
+      break;
+
+    case OPT_ANGLE:
+      if (sscanf(arg, "%lf", angle) != 1 || *angle <= 0 || *angle >= 90) {
+        fprintf(stderr, "--angle option must be a positive real number "
+                        "between 0 and 90.\n");
+        usage(cmd, EXIT_FAILURE);
+      }
+      break;
+
+    case OPT_COLOR_SCHEME:
+      if (!knownColorScheme(arg)) {
+        fprintf(stderr,
+                "--color_scheme option must be a known color scheme.\n");
+        usage(cmd, EXIT_FAILURE);
+      }
+      *color_scheme = arg;
+      break;
+
+    case OPT_LIGHTNESS: {
+      int l1 = 0;
+      int l2 = 70;
+      if (sscanf(arg, "%d,%d", &l1, &l2) != 2 || l1 < 0 || l2 > 100 ||
+          l1 > l2) {
+        fprintf(stderr, "invalid --lightness=%s option.\n", arg);
+        usage(cmd, EXIT_FAILURE);
+      }
+      lightness[0] = l1;
+      lightness[1] = l2;
+      break;
+    }
+
+    case OPT_RANDOM_SEED:
+      if (sscanf(arg, "%d", seed) != 1) {
+        fprintf(stderr, "--random_seed option must be an integer.\n");
+        usage(cmd, EXIT_FAILURE);
+      }
+      break;
+
+    case OPT_SHARE_ENDPOINT:
+      *check_edges_with_same_endpoint = 1;
+      break;
+
+    default:
+      UNREACHABLE();
+    }
+  }
+
+  if (argc > optind) {
+    Files = argv + optind;
+  }
+
+  if (outfile == NULL) {
+    outfile = stdout;
+  }
+}
+
+static int clarify(Agraph_t *g, double angle, double accuracy,
+                   int check_edges_with_same_endpoint, int seed,
+                   const char *color_scheme, int *lightness) {
+
+  if (checkG(g)) {
+    agerrorf("Graph %s contains loops or multiedges\n", agnameof(g));
+    return 1;
+  }
+
+  initDotIO(g);
+  g = edge_distinct_coloring(color_scheme, lightness, g, angle, accuracy, check_edges_with_same_endpoint, seed);
+  if (!g) return 1;
+
+  agwrite (g, stdout);
+  return 0;
+}
+
+int main(int argc, char *argv[])
+{
+  double accuracy;
+  double angle;
+  int check_edges_with_same_endpoint, seed;
+  const char *color_scheme = NULL;
+  int lightness[] = {0, 70};
+  Agraph_t *g;
+  Agraph_t *prev = NULL;
+  ingraph_state ig;
+  int rv = EXIT_SUCCESS;
+
+	init(argc, argv, &angle, &accuracy, &check_edges_with_same_endpoint, &seed, &color_scheme, lightness);
+	newIngraph(&ig, Files);
+
+	while ((g = nextGraph(&ig)) != 0) {
+		if (prev)
+		    agclose(prev);
+		prev = g;
+		fname = fileName(&ig);
+		if (Verbose)
+		    fprintf(stderr, "Process graph %s in file %s\n", agnameof(g),
+			    fname);
+		if (clarify(g, angle, accuracy, check_edges_with_same_endpoint, seed,
+		            color_scheme, lightness) != 0) {
+		    rv = EXIT_FAILURE;
+		}
+	}
+
+	graphviz_exit(rv);
+}

+ 83 - 0
graphviz.mod/graphviz/cmd/gvedit/Makefile.am

@@ -0,0 +1,83 @@
+## Process this file with automake to produce Makefile.in
+
+SUBDIRS = ui images
+
+gveditdir = $(pkgdatadir)/gvedit
+
+mans = gvedit.1
+
+if WITH_QT
+bin_PROGRAMS = gvedit
+gvedit_DATA = attrs.txt
+man_MANS = $(mans)
+if ENABLE_MAN_PDFS
+pdf_DATA = gvedit.1.pdf
+endif
+endif
+
+AM_CPPFLAGS = \
+	-I$(top_srcdir)/lib \
+	-I$(top_srcdir)/lib/common \
+	-I$(top_srcdir)/lib/gvc \
+	-I$(top_srcdir)/lib/pathplan \
+	-I$(top_srcdir)/lib/cgraph \
+	-I$(top_srcdir)/lib/cdt
+
+gvedit_CPPFLAGS = \
+	$(AM_CPPFLAGS) \
+	$(QTGUI_CFLAGS) \
+	$(QTCORE_CFLAGS) \
+        -DDEMAND_LOADING=1 \
+        -DQT_NO_CAST_TO_ASCII \
+        -DQT_NO_CAST_FROM_ASCII \
+        -DQT_STRICT_ITERATORS \
+        -DQT_NO_URL_CAST_FROM_STRING \
+        -DQT_NO_CAST_FROM_BYTEARRAY \
+        -DQT_USE_QSTRINGBUILDER \
+        -DQT_USE_FAST_OPERATOR_PLUS
+
+gvedit_LDADD = \
+	$(top_builddir)/lib/gvc/libgvc.la \
+	$(top_builddir)/lib/cgraph/libcgraph.la \
+	$(top_builddir)/lib/cdt/libcdt.la \
+	$(QTGUI_LIBS) \
+	$(QTCORE_LIBS) \
+	$(EXPAT_LIBS) $(Z_LIBS)
+
+noinst_HEADERS = csettings.h imageviewer.h mainwindow.h mdichild.h
+if WITH_QT
+BUILT_SOURCES = ui_settings.h
+endif
+
+MOCABLES = moc_csettings.cpp moc_imageviewer.cpp moc_mainwindow.cpp moc_mdichild.cpp qrc_mdi.cpp
+
+gvedit_SOURCES = main.cpp csettings.cpp imageviewer.cpp mainwindow.cpp mdichild.cpp
+nodist_gvedit_SOURCES = $(MOCABLES)
+
+$(MOCABLES): mocables
+
+.PHONY: mocables
+mocables ui_settings.h: qMakefile
+	$(MAKE) -f qMakefile prefix=${prefix} exec_prefix=${exec_prefix} mocables compiler_rcc_make_all
+
+# in case the user has both Qt4 and Qt5 installed, set QT_SELECT to force Qt5
+qMakefile: gvedit.pro
+	QT_SELECT=5 $(QMAKE) -o qMakefile gvedit.pro
+
+.1.1.pdf:
+	rm -f $@; pdffile=$@; psfile=$${pdffile%pdf}ps; \
+	$(GROFF) -Tps -man $< > $$psfile || { rm -f $$psfile; exit 1; }; \
+	$(PS2PDF) $$psfile && rm -f $$psfile || { rm -f $$psfile; exit 1; }
+SUFFIXES = .1 .1.pdf
+
+EXTRA_DIST = attrs.txt gvedit.pro.in mdi.qrc $(mans)
+
+CLEANFILES = $(MOCABLES) ui_settings.h
+DISTCLEANFILES = qMakefile $(pdf_DATA)
+
+clean-local:
+	-$(MAKE) -f qMakefile clean
+
+distclean-local:
+	-$(MAKE) -f qMakefile distclean
+

+ 1330 - 0
graphviz.mod/graphviz/cmd/gvedit/Makefile.in

@@ -0,0 +1,1330 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@WITH_QT_TRUE@bin_PROGRAMS = gvedit$(EXEEXT)
+subdir = cmd/gvedit
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \
+	$(top_srcdir)/m4/ax_compare_version.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltargz.m4 \
+	$(top_srcdir)/m4/ltdl.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/./version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \
+	$(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = gvedit.pro
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \
+	"$(DESTDIR)$(gveditdir)" "$(DESTDIR)$(pdfdir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_gvedit_OBJECTS = gvedit-main.$(OBJEXT) gvedit-csettings.$(OBJEXT) \
+	gvedit-imageviewer.$(OBJEXT) gvedit-mainwindow.$(OBJEXT) \
+	gvedit-mdichild.$(OBJEXT)
+am__objects_1 = gvedit-moc_csettings.$(OBJEXT) \
+	gvedit-moc_imageviewer.$(OBJEXT) \
+	gvedit-moc_mainwindow.$(OBJEXT) gvedit-moc_mdichild.$(OBJEXT) \
+	gvedit-qrc_mdi.$(OBJEXT)
+nodist_gvedit_OBJECTS = $(am__objects_1)
+gvedit_OBJECTS = $(am_gvedit_OBJECTS) $(nodist_gvedit_OBJECTS)
+am__DEPENDENCIES_1 =
+gvedit_DEPENDENCIES = $(top_builddir)/lib/gvc/libgvc.la \
+	$(top_builddir)/lib/cgraph/libcgraph.la \
+	$(top_builddir)/lib/cdt/libcdt.la $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/config/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/gvedit-csettings.Po \
+	./$(DEPDIR)/gvedit-imageviewer.Po ./$(DEPDIR)/gvedit-main.Po \
+	./$(DEPDIR)/gvedit-mainwindow.Po \
+	./$(DEPDIR)/gvedit-mdichild.Po \
+	./$(DEPDIR)/gvedit-moc_csettings.Po \
+	./$(DEPDIR)/gvedit-moc_imageviewer.Po \
+	./$(DEPDIR)/gvedit-moc_mainwindow.Po \
+	./$(DEPDIR)/gvedit-moc_mdichild.Po \
+	./$(DEPDIR)/gvedit-qrc_mdi.Po
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+SOURCES = $(gvedit_SOURCES) $(nodist_gvedit_SOURCES)
+DIST_SOURCES = $(gvedit_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+DATA = $(gvedit_DATA) $(pdf_DATA)
+HEADERS = $(noinst_HEADERS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	distdir distdir-am
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/gvedit.pro.in \
+	$(top_srcdir)/config/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+ANN_CFLAGS = @ANN_CFLAGS@
+ANN_LIBS = @ANN_LIBS@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+CYGWIN = @CYGWIN@
+DARWIN = @DARWIN@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEVIL_INCLUDES = @DEVIL_INCLUDES@
+DEVIL_LIBS = @DEVIL_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+EXPAT_CFLAGS = @EXPAT_CFLAGS@
+EXPAT_LIBS = @EXPAT_LIBS@
+FGREP = @FGREP@
+FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@
+FREETYPE2_LIBS = @FREETYPE2_LIBS@
+GDIPLUS_CFLAGS = @GDIPLUS_CFLAGS@
+GDIPLUS_HEADS = @GDIPLUS_HEADS@
+GDIPLUS_LIBS = @GDIPLUS_LIBS@
+GDK_CFLAGS = @GDK_CFLAGS@
+GDK_LIBS = @GDK_LIBS@
+GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@
+GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@
+GDLIB_CFLAGS = @GDLIB_CFLAGS@
+GDLIB_CONFIG = @GDLIB_CONFIG@
+GDLIB_LIBS = @GDLIB_LIBS@
+GLADE_CFLAGS = @GLADE_CFLAGS@
+GLADE_LIBS = @GLADE_LIBS@
+GLUT_CFLAGS = @GLUT_CFLAGS@
+GLUT_LIBS = @GLUT_LIBS@
+GO = @GO@
+GO_INCLUDES = @GO_INCLUDES@
+GO_LIBS = @GO_LIBS@
+GRAPHVIZ_AUTHOR_EMAIL = @GRAPHVIZ_AUTHOR_EMAIL@
+GRAPHVIZ_AUTHOR_NAME = @GRAPHVIZ_AUTHOR_NAME@
+GRAPHVIZ_CHANGE_DATE = @GRAPHVIZ_CHANGE_DATE@
+GRAPHVIZ_VERSION_DATE = @GRAPHVIZ_VERSION_DATE@
+GRAPHVIZ_VERSION_MAJOR = @GRAPHVIZ_VERSION_MAJOR@
+GRAPHVIZ_VERSION_MICRO = @GRAPHVIZ_VERSION_MICRO@
+GRAPHVIZ_VERSION_MINOR = @GRAPHVIZ_VERSION_MINOR@
+GREP = @GREP@
+GROFF = @GROFF@
+GS_CFLAGS = @GS_CFLAGS@
+GS_LIBS = @GS_LIBS@
+GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@
+GTKGLEXT_LIBS = @GTKGLEXT_LIBS@
+GTKGL_CFLAGS = @GTKGL_CFLAGS@
+GTKGL_LIBS = @GTKGL_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+GTS_CFLAGS = @GTS_CFLAGS@
+GTS_LIBS = @GTS_LIBS@
+GUILE_CFLAGS = @GUILE_CFLAGS@
+GUILE_LIBS = @GUILE_LIBS@
+GVPLUGIN_CONFIG_FILE = @GVPLUGIN_CONFIG_FILE@
+GVPLUGIN_VERSION = @GVPLUGIN_VERSION@
+GVPLUGIN_VERSION_INFO = @GVPLUGIN_VERSION_INFO@
+HAVE_CXX17 = @HAVE_CXX17@
+INCLTDL = @INCLTDL@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTGOSIZE = @INTGOSIZE@
+IPSEPCOLA_INCLUDES = @IPSEPCOLA_INCLUDES@
+IPSEPCOLA_LIBS = @IPSEPCOLA_LIBS@
+JAVA = @JAVA@
+JAVASCRIPT = @JAVASCRIPT@
+JAVA_INCLUDES = @JAVA_INCLUDES@
+JAVA_LIBS = @JAVA_LIBS@
+JNI_EXTRA_LDFLAGS = @JNI_EXTRA_LDFLAGS@
+JSHEXT = @JSHEXT@
+LASI_CFLAGS = @LASI_CFLAGS@
+LASI_LIBS = @LASI_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBADD_DL = @LIBADD_DL@
+LIBADD_DLD_LINK = @LIBADD_DLD_LINK@
+LIBADD_DLOPEN = @LIBADD_DLOPEN@
+LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@
+LIBLTDL = @LIBLTDL@
+LIBOBJS = @LIBOBJS@
+LIBPOSTFIX = @LIBPOSTFIX@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTDLDEPS = @LTDLDEPS@
+LTDLINCL = @LTDLINCL@
+LTDLOPEN = @LTDLOPEN@
+LTLIBOBJS = @LTLIBOBJS@
+LT_ARGZ_H = @LT_ARGZ_H@
+LT_CONFIG_H = @LT_CONFIG_H@
+LT_DLLOADERS = @LT_DLLOADERS@
+LT_DLPREOPEN = @LT_DLPREOPEN@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+LUA = @LUA@
+LUA_INCLUDES = @LUA_INCLUDES@
+LUA_INSTALL_DIR = @LUA_INSTALL_DIR@
+LUA_LIBS = @LUA_LIBS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MATH_LIBS = @MATH_LIBS@
+MCS = @MCS@
+MINGW32 = @MINGW32@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJC = @OBJC@
+OBJCDEPMODE = @OBJCDEPMODE@
+OBJCFLAGS = @OBJCFLAGS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@
+PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@
+PANGOFT2_CFLAGS = @PANGOFT2_CFLAGS@
+PANGOFT2_LIBS = @PANGOFT2_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PERL_INCLUDES = @PERL_INCLUDES@
+PERL_INSTALL_DIR = @PERL_INSTALL_DIR@
+PERL_LIBS = @PERL_LIBS@
+PHP = @PHP@
+PHPCONFIG = @PHPCONFIG@
+PHP_INCLUDES = @PHP_INCLUDES@
+PHP_INSTALL_DATADIR = @PHP_INSTALL_DATADIR@
+PHP_INSTALL_DIR = @PHP_INSTALL_DIR@
+PHP_LIBS = @PHP_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PLATFORMSDKINCLUDE = @PLATFORMSDKINCLUDE@
+PLATFORMSDKLIB = @PLATFORMSDKLIB@
+POPPLER_CFLAGS = @POPPLER_CFLAGS@
+POPPLER_LIBS = @POPPLER_LIBS@
+PS2PDF = @PS2PDF@
+PYTHON3 = @PYTHON3@
+PYTHON3_INCLUDES = @PYTHON3_INCLUDES@
+PYTHON3_INSTALL_DIR = @PYTHON3_INSTALL_DIR@
+PYTHON3_LIBS = @PYTHON3_LIBS@
+QMAKE = @QMAKE@
+QTCORE_CFLAGS = @QTCORE_CFLAGS@
+QTCORE_LIBS = @QTCORE_LIBS@
+QTGUI_CFLAGS = @QTGUI_CFLAGS@
+QTGUI_LIBS = @QTGUI_LIBS@
+QUARTZ_CFLAGS = @QUARTZ_CFLAGS@
+QUARTZ_LIBS = @QUARTZ_LIBS@
+RANLIB = @RANLIB@
+RSVG_CFLAGS = @RSVG_CFLAGS@
+RSVG_LIBS = @RSVG_LIBS@
+RUBY = @RUBY@
+RUBY_CFLAGS = @RUBY_CFLAGS@
+RUBY_INSTALL_DIR = @RUBY_INSTALL_DIR@
+RUBY_LIBS = @RUBY_LIBS@
+RUBY_VER = @RUBY_VER@
+R_CFLAGS = @R_CFLAGS@
+R_LIBS = @R_LIBS@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHARED_LIBRARY_SUFFIX = @SHARED_LIBRARY_SUFFIX@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SWIG = @SWIG@
+SWIGJAVA_CPPFLAGS = @SWIGJAVA_CPPFLAGS@
+SWIG_PHP_DATA = @SWIG_PHP_DATA@
+SWIG_PHP_DATA_TO_PACKAGE = @SWIG_PHP_DATA_TO_PACKAGE@
+SWIG_PHP_OPT = @SWIG_PHP_OPT@
+SWIG_VERSION = @SWIG_VERSION@
+TCLCONFIG = @TCLCONFIG@
+TCLINT_INCLUDES = @TCLINT_INCLUDES@
+TCLSH = @TCLSH@
+TCLSH_EXEC_PREFIX = @TCLSH_EXEC_PREFIX@
+TCL_CFLAGS = @TCL_CFLAGS@
+TCL_DEFS = @TCL_DEFS@
+TCL_INCLUDES = @TCL_INCLUDES@
+TCL_INSTALL_DIR = @TCL_INSTALL_DIR@
+TCL_LIBS = @TCL_LIBS@
+TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@
+TCL_MINOR_VERSION = @TCL_MINOR_VERSION@
+TCL_PATCH_LEVEL = @TCL_PATCH_LEVEL@
+TCL_PKGINDEX = @TCL_PKGINDEX@
+TCL_PKGINDEX_GD = @TCL_PKGINDEX_GD@
+TCL_PKGINDEX_SWIG = @TCL_PKGINDEX_SWIG@
+TCL_SHLIB_SUFFIX = @TCL_SHLIB_SUFFIX@
+TCL_SRC_DIR = @TCL_SRC_DIR@
+TCL_STUB_LIB_SPEC = @TCL_STUB_LIB_SPEC@
+TCL_VERSION = @TCL_VERSION@
+VERSION = @VERSION@
+WEBP_CFLAGS = @WEBP_CFLAGS@
+WEBP_LIBS = @WEBP_LIBS@
+XMKMF = @XMKMF@
+XRENDER_CFLAGS = @XRENDER_CFLAGS@
+XRENDER_LIBS = @XRENDER_LIBS@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+Z_INCLUDES = @Z_INCLUDES@
+Z_LIBS = @Z_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_OBJC = @ac_ct_OBJC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+demodir = @demodir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+ltdl_LIBOBJS = @ltdl_LIBOBJS@
+ltdl_LTLIBOBJS = @ltdl_LTLIBOBJS@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sys_symbol_underscore = @sys_symbol_underscore@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+SUBDIRS = ui images
+gveditdir = $(pkgdatadir)/gvedit
+mans = gvedit.1
+@WITH_QT_TRUE@gvedit_DATA = attrs.txt
+@WITH_QT_TRUE@man_MANS = $(mans)
+@ENABLE_MAN_PDFS_TRUE@@WITH_QT_TRUE@pdf_DATA = gvedit.1.pdf
+AM_CPPFLAGS = \
+	-I$(top_srcdir)/lib \
+	-I$(top_srcdir)/lib/common \
+	-I$(top_srcdir)/lib/gvc \
+	-I$(top_srcdir)/lib/pathplan \
+	-I$(top_srcdir)/lib/cgraph \
+	-I$(top_srcdir)/lib/cdt
+
+gvedit_CPPFLAGS = \
+	$(AM_CPPFLAGS) \
+	$(QTGUI_CFLAGS) \
+	$(QTCORE_CFLAGS) \
+        -DDEMAND_LOADING=1 \
+        -DQT_NO_CAST_TO_ASCII \
+        -DQT_NO_CAST_FROM_ASCII \
+        -DQT_STRICT_ITERATORS \
+        -DQT_NO_URL_CAST_FROM_STRING \
+        -DQT_NO_CAST_FROM_BYTEARRAY \
+        -DQT_USE_QSTRINGBUILDER \
+        -DQT_USE_FAST_OPERATOR_PLUS
+
+gvedit_LDADD = \
+	$(top_builddir)/lib/gvc/libgvc.la \
+	$(top_builddir)/lib/cgraph/libcgraph.la \
+	$(top_builddir)/lib/cdt/libcdt.la \
+	$(QTGUI_LIBS) \
+	$(QTCORE_LIBS) \
+	$(EXPAT_LIBS) $(Z_LIBS)
+
+noinst_HEADERS = csettings.h imageviewer.h mainwindow.h mdichild.h
+@WITH_QT_TRUE@BUILT_SOURCES = ui_settings.h
+MOCABLES = moc_csettings.cpp moc_imageviewer.cpp moc_mainwindow.cpp moc_mdichild.cpp qrc_mdi.cpp
+gvedit_SOURCES = main.cpp csettings.cpp imageviewer.cpp mainwindow.cpp mdichild.cpp
+nodist_gvedit_SOURCES = $(MOCABLES)
+SUFFIXES = .1 .1.pdf
+EXTRA_DIST = attrs.txt gvedit.pro.in mdi.qrc $(mans)
+CLEANFILES = $(MOCABLES) ui_settings.h
+DISTCLEANFILES = qMakefile $(pdf_DATA)
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .1 .1.pdf .cpp .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu cmd/gvedit/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu cmd/gvedit/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+gvedit.pro: $(top_builddir)/config.status $(srcdir)/gvedit.pro.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+gvedit$(EXEEXT): $(gvedit_OBJECTS) $(gvedit_DEPENDENCIES) $(EXTRA_gvedit_DEPENDENCIES) 
+	@rm -f gvedit$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(gvedit_OBJECTS) $(gvedit_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvedit-csettings.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvedit-imageviewer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvedit-main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvedit-mainwindow.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvedit-mdichild.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvedit-moc_csettings.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvedit-moc_imageviewer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvedit-moc_mainwindow.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvedit-moc_mdichild.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvedit-qrc_mdi.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+	@$(MKDIR_P) $(@D)
+	@echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cpp.o:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+gvedit-main.o: main.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gvedit-main.o -MD -MP -MF $(DEPDIR)/gvedit-main.Tpo -c -o gvedit-main.o `test -f 'main.cpp' || echo '$(srcdir)/'`main.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvedit-main.Tpo $(DEPDIR)/gvedit-main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='main.cpp' object='gvedit-main.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gvedit-main.o `test -f 'main.cpp' || echo '$(srcdir)/'`main.cpp
+
+gvedit-main.obj: main.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gvedit-main.obj -MD -MP -MF $(DEPDIR)/gvedit-main.Tpo -c -o gvedit-main.obj `if test -f 'main.cpp'; then $(CYGPATH_W) 'main.cpp'; else $(CYGPATH_W) '$(srcdir)/main.cpp'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvedit-main.Tpo $(DEPDIR)/gvedit-main.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='main.cpp' object='gvedit-main.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gvedit-main.obj `if test -f 'main.cpp'; then $(CYGPATH_W) 'main.cpp'; else $(CYGPATH_W) '$(srcdir)/main.cpp'; fi`
+
+gvedit-csettings.o: csettings.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gvedit-csettings.o -MD -MP -MF $(DEPDIR)/gvedit-csettings.Tpo -c -o gvedit-csettings.o `test -f 'csettings.cpp' || echo '$(srcdir)/'`csettings.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvedit-csettings.Tpo $(DEPDIR)/gvedit-csettings.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='csettings.cpp' object='gvedit-csettings.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gvedit-csettings.o `test -f 'csettings.cpp' || echo '$(srcdir)/'`csettings.cpp
+
+gvedit-csettings.obj: csettings.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gvedit-csettings.obj -MD -MP -MF $(DEPDIR)/gvedit-csettings.Tpo -c -o gvedit-csettings.obj `if test -f 'csettings.cpp'; then $(CYGPATH_W) 'csettings.cpp'; else $(CYGPATH_W) '$(srcdir)/csettings.cpp'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvedit-csettings.Tpo $(DEPDIR)/gvedit-csettings.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='csettings.cpp' object='gvedit-csettings.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gvedit-csettings.obj `if test -f 'csettings.cpp'; then $(CYGPATH_W) 'csettings.cpp'; else $(CYGPATH_W) '$(srcdir)/csettings.cpp'; fi`
+
+gvedit-imageviewer.o: imageviewer.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gvedit-imageviewer.o -MD -MP -MF $(DEPDIR)/gvedit-imageviewer.Tpo -c -o gvedit-imageviewer.o `test -f 'imageviewer.cpp' || echo '$(srcdir)/'`imageviewer.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvedit-imageviewer.Tpo $(DEPDIR)/gvedit-imageviewer.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='imageviewer.cpp' object='gvedit-imageviewer.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gvedit-imageviewer.o `test -f 'imageviewer.cpp' || echo '$(srcdir)/'`imageviewer.cpp
+
+gvedit-imageviewer.obj: imageviewer.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gvedit-imageviewer.obj -MD -MP -MF $(DEPDIR)/gvedit-imageviewer.Tpo -c -o gvedit-imageviewer.obj `if test -f 'imageviewer.cpp'; then $(CYGPATH_W) 'imageviewer.cpp'; else $(CYGPATH_W) '$(srcdir)/imageviewer.cpp'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvedit-imageviewer.Tpo $(DEPDIR)/gvedit-imageviewer.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='imageviewer.cpp' object='gvedit-imageviewer.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gvedit-imageviewer.obj `if test -f 'imageviewer.cpp'; then $(CYGPATH_W) 'imageviewer.cpp'; else $(CYGPATH_W) '$(srcdir)/imageviewer.cpp'; fi`
+
+gvedit-mainwindow.o: mainwindow.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gvedit-mainwindow.o -MD -MP -MF $(DEPDIR)/gvedit-mainwindow.Tpo -c -o gvedit-mainwindow.o `test -f 'mainwindow.cpp' || echo '$(srcdir)/'`mainwindow.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvedit-mainwindow.Tpo $(DEPDIR)/gvedit-mainwindow.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='mainwindow.cpp' object='gvedit-mainwindow.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gvedit-mainwindow.o `test -f 'mainwindow.cpp' || echo '$(srcdir)/'`mainwindow.cpp
+
+gvedit-mainwindow.obj: mainwindow.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gvedit-mainwindow.obj -MD -MP -MF $(DEPDIR)/gvedit-mainwindow.Tpo -c -o gvedit-mainwindow.obj `if test -f 'mainwindow.cpp'; then $(CYGPATH_W) 'mainwindow.cpp'; else $(CYGPATH_W) '$(srcdir)/mainwindow.cpp'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvedit-mainwindow.Tpo $(DEPDIR)/gvedit-mainwindow.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='mainwindow.cpp' object='gvedit-mainwindow.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gvedit-mainwindow.obj `if test -f 'mainwindow.cpp'; then $(CYGPATH_W) 'mainwindow.cpp'; else $(CYGPATH_W) '$(srcdir)/mainwindow.cpp'; fi`
+
+gvedit-mdichild.o: mdichild.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gvedit-mdichild.o -MD -MP -MF $(DEPDIR)/gvedit-mdichild.Tpo -c -o gvedit-mdichild.o `test -f 'mdichild.cpp' || echo '$(srcdir)/'`mdichild.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvedit-mdichild.Tpo $(DEPDIR)/gvedit-mdichild.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='mdichild.cpp' object='gvedit-mdichild.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gvedit-mdichild.o `test -f 'mdichild.cpp' || echo '$(srcdir)/'`mdichild.cpp
+
+gvedit-mdichild.obj: mdichild.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gvedit-mdichild.obj -MD -MP -MF $(DEPDIR)/gvedit-mdichild.Tpo -c -o gvedit-mdichild.obj `if test -f 'mdichild.cpp'; then $(CYGPATH_W) 'mdichild.cpp'; else $(CYGPATH_W) '$(srcdir)/mdichild.cpp'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvedit-mdichild.Tpo $(DEPDIR)/gvedit-mdichild.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='mdichild.cpp' object='gvedit-mdichild.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gvedit-mdichild.obj `if test -f 'mdichild.cpp'; then $(CYGPATH_W) 'mdichild.cpp'; else $(CYGPATH_W) '$(srcdir)/mdichild.cpp'; fi`
+
+gvedit-moc_csettings.o: moc_csettings.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gvedit-moc_csettings.o -MD -MP -MF $(DEPDIR)/gvedit-moc_csettings.Tpo -c -o gvedit-moc_csettings.o `test -f 'moc_csettings.cpp' || echo '$(srcdir)/'`moc_csettings.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvedit-moc_csettings.Tpo $(DEPDIR)/gvedit-moc_csettings.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='moc_csettings.cpp' object='gvedit-moc_csettings.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gvedit-moc_csettings.o `test -f 'moc_csettings.cpp' || echo '$(srcdir)/'`moc_csettings.cpp
+
+gvedit-moc_csettings.obj: moc_csettings.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gvedit-moc_csettings.obj -MD -MP -MF $(DEPDIR)/gvedit-moc_csettings.Tpo -c -o gvedit-moc_csettings.obj `if test -f 'moc_csettings.cpp'; then $(CYGPATH_W) 'moc_csettings.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_csettings.cpp'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvedit-moc_csettings.Tpo $(DEPDIR)/gvedit-moc_csettings.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='moc_csettings.cpp' object='gvedit-moc_csettings.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gvedit-moc_csettings.obj `if test -f 'moc_csettings.cpp'; then $(CYGPATH_W) 'moc_csettings.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_csettings.cpp'; fi`
+
+gvedit-moc_imageviewer.o: moc_imageviewer.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gvedit-moc_imageviewer.o -MD -MP -MF $(DEPDIR)/gvedit-moc_imageviewer.Tpo -c -o gvedit-moc_imageviewer.o `test -f 'moc_imageviewer.cpp' || echo '$(srcdir)/'`moc_imageviewer.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvedit-moc_imageviewer.Tpo $(DEPDIR)/gvedit-moc_imageviewer.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='moc_imageviewer.cpp' object='gvedit-moc_imageviewer.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gvedit-moc_imageviewer.o `test -f 'moc_imageviewer.cpp' || echo '$(srcdir)/'`moc_imageviewer.cpp
+
+gvedit-moc_imageviewer.obj: moc_imageviewer.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gvedit-moc_imageviewer.obj -MD -MP -MF $(DEPDIR)/gvedit-moc_imageviewer.Tpo -c -o gvedit-moc_imageviewer.obj `if test -f 'moc_imageviewer.cpp'; then $(CYGPATH_W) 'moc_imageviewer.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_imageviewer.cpp'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvedit-moc_imageviewer.Tpo $(DEPDIR)/gvedit-moc_imageviewer.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='moc_imageviewer.cpp' object='gvedit-moc_imageviewer.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gvedit-moc_imageviewer.obj `if test -f 'moc_imageviewer.cpp'; then $(CYGPATH_W) 'moc_imageviewer.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_imageviewer.cpp'; fi`
+
+gvedit-moc_mainwindow.o: moc_mainwindow.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gvedit-moc_mainwindow.o -MD -MP -MF $(DEPDIR)/gvedit-moc_mainwindow.Tpo -c -o gvedit-moc_mainwindow.o `test -f 'moc_mainwindow.cpp' || echo '$(srcdir)/'`moc_mainwindow.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvedit-moc_mainwindow.Tpo $(DEPDIR)/gvedit-moc_mainwindow.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='moc_mainwindow.cpp' object='gvedit-moc_mainwindow.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gvedit-moc_mainwindow.o `test -f 'moc_mainwindow.cpp' || echo '$(srcdir)/'`moc_mainwindow.cpp
+
+gvedit-moc_mainwindow.obj: moc_mainwindow.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gvedit-moc_mainwindow.obj -MD -MP -MF $(DEPDIR)/gvedit-moc_mainwindow.Tpo -c -o gvedit-moc_mainwindow.obj `if test -f 'moc_mainwindow.cpp'; then $(CYGPATH_W) 'moc_mainwindow.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_mainwindow.cpp'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvedit-moc_mainwindow.Tpo $(DEPDIR)/gvedit-moc_mainwindow.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='moc_mainwindow.cpp' object='gvedit-moc_mainwindow.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gvedit-moc_mainwindow.obj `if test -f 'moc_mainwindow.cpp'; then $(CYGPATH_W) 'moc_mainwindow.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_mainwindow.cpp'; fi`
+
+gvedit-moc_mdichild.o: moc_mdichild.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gvedit-moc_mdichild.o -MD -MP -MF $(DEPDIR)/gvedit-moc_mdichild.Tpo -c -o gvedit-moc_mdichild.o `test -f 'moc_mdichild.cpp' || echo '$(srcdir)/'`moc_mdichild.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvedit-moc_mdichild.Tpo $(DEPDIR)/gvedit-moc_mdichild.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='moc_mdichild.cpp' object='gvedit-moc_mdichild.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gvedit-moc_mdichild.o `test -f 'moc_mdichild.cpp' || echo '$(srcdir)/'`moc_mdichild.cpp
+
+gvedit-moc_mdichild.obj: moc_mdichild.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gvedit-moc_mdichild.obj -MD -MP -MF $(DEPDIR)/gvedit-moc_mdichild.Tpo -c -o gvedit-moc_mdichild.obj `if test -f 'moc_mdichild.cpp'; then $(CYGPATH_W) 'moc_mdichild.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_mdichild.cpp'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvedit-moc_mdichild.Tpo $(DEPDIR)/gvedit-moc_mdichild.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='moc_mdichild.cpp' object='gvedit-moc_mdichild.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gvedit-moc_mdichild.obj `if test -f 'moc_mdichild.cpp'; then $(CYGPATH_W) 'moc_mdichild.cpp'; else $(CYGPATH_W) '$(srcdir)/moc_mdichild.cpp'; fi`
+
+gvedit-qrc_mdi.o: qrc_mdi.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gvedit-qrc_mdi.o -MD -MP -MF $(DEPDIR)/gvedit-qrc_mdi.Tpo -c -o gvedit-qrc_mdi.o `test -f 'qrc_mdi.cpp' || echo '$(srcdir)/'`qrc_mdi.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvedit-qrc_mdi.Tpo $(DEPDIR)/gvedit-qrc_mdi.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='qrc_mdi.cpp' object='gvedit-qrc_mdi.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gvedit-qrc_mdi.o `test -f 'qrc_mdi.cpp' || echo '$(srcdir)/'`qrc_mdi.cpp
+
+gvedit-qrc_mdi.obj: qrc_mdi.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gvedit-qrc_mdi.obj -MD -MP -MF $(DEPDIR)/gvedit-qrc_mdi.Tpo -c -o gvedit-qrc_mdi.obj `if test -f 'qrc_mdi.cpp'; then $(CYGPATH_W) 'qrc_mdi.cpp'; else $(CYGPATH_W) '$(srcdir)/qrc_mdi.cpp'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvedit-qrc_mdi.Tpo $(DEPDIR)/gvedit-qrc_mdi.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='qrc_mdi.cpp' object='gvedit-qrc_mdi.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gvedit-qrc_mdi.obj `if test -f 'qrc_mdi.cpp'; then $(CYGPATH_W) 'qrc_mdi.cpp'; else $(CYGPATH_W) '$(srcdir)/qrc_mdi.cpp'; fi`
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-man1: $(man_MANS)
+	@$(NORMAL_INSTALL)
+	@list1=''; \
+	list2='$(man_MANS)'; \
+	test -n "$(man1dir)" \
+	  && test -n "`echo $$list1$$list2`" \
+	  || exit 0; \
+	echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+	$(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+	{ for i in $$list1; do echo "$$i"; done;  \
+	if test -n "$$list2"; then \
+	  for i in $$list2; do echo "$$i"; done \
+	    | sed -n '/\.1[a-z]*$$/p'; \
+	fi; \
+	} | while read p; do \
+	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; echo "$$p"; \
+	done | \
+	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+	sed 'N;N;s,\n, ,g' | { \
+	list=; while read file base inst; do \
+	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+	  fi; \
+	done; \
+	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+	while read files; do \
+	  test -z "$$files" || { \
+	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+	done; }
+
+uninstall-man1:
+	@$(NORMAL_UNINSTALL)
+	@list=''; test -n "$(man1dir)" || exit 0; \
+	files=`{ for i in $$list; do echo "$$i"; done; \
+	l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+	  sed -n '/\.1[a-z]*$$/p'; \
+	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+	dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+install-gveditDATA: $(gvedit_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(gvedit_DATA)'; test -n "$(gveditdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(gveditdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(gveditdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(gveditdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(gveditdir)" || exit $$?; \
+	done
+
+uninstall-gveditDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(gvedit_DATA)'; test -n "$(gveditdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(gveditdir)'; $(am__uninstall_files_from_dir)
+install-pdfDATA: $(pdf_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(pdf_DATA)'; test -n "$(pdfdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; \
+	done
+
+uninstall-pdfDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pdf_DATA)'; test -n "$(pdfdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pdfdir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-recursive
+all-am: Makefile $(PROGRAMS) $(MANS) $(DATA) $(HEADERS)
+installdirs: installdirs-recursive
+installdirs-am:
+	for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(gveditdir)" "$(DESTDIR)$(pdfdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-recursive
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool clean-local \
+	mostlyclean-am
+
+distclean: distclean-recursive
+		-rm -f ./$(DEPDIR)/gvedit-csettings.Po
+	-rm -f ./$(DEPDIR)/gvedit-imageviewer.Po
+	-rm -f ./$(DEPDIR)/gvedit-main.Po
+	-rm -f ./$(DEPDIR)/gvedit-mainwindow.Po
+	-rm -f ./$(DEPDIR)/gvedit-mdichild.Po
+	-rm -f ./$(DEPDIR)/gvedit-moc_csettings.Po
+	-rm -f ./$(DEPDIR)/gvedit-moc_imageviewer.Po
+	-rm -f ./$(DEPDIR)/gvedit-moc_mainwindow.Po
+	-rm -f ./$(DEPDIR)/gvedit-moc_mdichild.Po
+	-rm -f ./$(DEPDIR)/gvedit-qrc_mdi.Po
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-local distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-gveditDATA install-man install-pdfDATA
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+		-rm -f ./$(DEPDIR)/gvedit-csettings.Po
+	-rm -f ./$(DEPDIR)/gvedit-imageviewer.Po
+	-rm -f ./$(DEPDIR)/gvedit-main.Po
+	-rm -f ./$(DEPDIR)/gvedit-mainwindow.Po
+	-rm -f ./$(DEPDIR)/gvedit-mdichild.Po
+	-rm -f ./$(DEPDIR)/gvedit-moc_csettings.Po
+	-rm -f ./$(DEPDIR)/gvedit-moc_imageviewer.Po
+	-rm -f ./$(DEPDIR)/gvedit-moc_mainwindow.Po
+	-rm -f ./$(DEPDIR)/gvedit-moc_mdichild.Po
+	-rm -f ./$(DEPDIR)/gvedit-qrc_mdi.Po
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-gveditDATA uninstall-man \
+	uninstall-pdfDATA
+
+uninstall-man: uninstall-man1
+
+.MAKE: $(am__recursive_targets) all check install install-am \
+	install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+	am--depfiles check check-am clean clean-binPROGRAMS \
+	clean-generic clean-libtool clean-local cscopelist-am ctags \
+	ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-local distclean-tags distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-binPROGRAMS install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-gveditDATA \
+	install-html install-html-am install-info install-info-am \
+	install-man install-man1 install-pdf install-pdf-am \
+	install-pdfDATA install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs installdirs-am \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+	uninstall-binPROGRAMS uninstall-gveditDATA uninstall-man \
+	uninstall-man1 uninstall-pdfDATA
+
+.PRECIOUS: Makefile
+
+
+$(MOCABLES): mocables
+
+.PHONY: mocables
+mocables ui_settings.h: qMakefile
+	$(MAKE) -f qMakefile prefix=${prefix} exec_prefix=${exec_prefix} mocables compiler_rcc_make_all
+
+# in case the user has both Qt4 and Qt5 installed, set QT_SELECT to force Qt5
+qMakefile: gvedit.pro
+	QT_SELECT=5 $(QMAKE) -o qMakefile gvedit.pro
+
+.1.1.pdf:
+	rm -f $@; pdffile=$@; psfile=$${pdffile%pdf}ps; \
+	$(GROFF) -Tps -man $< > $$psfile || { rm -f $$psfile; exit 1; }; \
+	$(PS2PDF) $$psfile && rm -f $$psfile || { rm -f $$psfile; exit 1; }
+
+clean-local:
+	-$(MAKE) -f qMakefile clean
+
+distclean-local:
+	-$(MAKE) -f qMakefile distclean
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

+ 1505 - 0
graphviz.mod/graphviz/cmd/gvedit/attrs.txt

@@ -0,0 +1,1505 @@
+# Graphviz attributes
+# Each item consist of a header line, followed by a description in HTML.
+#
+# The header line has the format
+#    :name:used_by:types[:dflt[:minv]];  [notes]
+# where
+#  name has the format name1[/namei]*[ notes]
+#    the note can be used as a comment
+#
+#  used_by is a string consisting of G,C,N,E, indicating that the attribute
+#    applies to graphs, clusters, nodes and edges, respectively.
+#
+#  types has the format type[/typei]*
+#    type can be int, bool, string, double, or a special <typename>.
+#    In the last case, we assume there is an entry for <typename> in
+#    the types file.
+#
+#  dflt has the format dflt[/dflti]*
+#    dflt gives a description of the default value of the attribute.
+#    It can contain arbitrary text but ':' must be preceded by a space.
+#
+#  minv has the format min[/mini]*
+#    minv gives a description of the minimum value of the attribute.
+#    It can contain arbitrary text.
+#
+#  the notes field, if present, consists of a comma-separated list of:
+#    
+#   bitmap cmap map ps svg - attribute limited to specified output formats
+#   dot neato twopi circo fdp sfdp - attribute limited to specified layouts
+#   notdot - attribute use in all layouts but dot
+#   write - attribute is write-only
+#   obsolete - attribute is obsolete
+#
+# Obviously, for any field which allows multiple subfields separated by '/'
+# the subfields cannot contain the '/' character.
+#
+# In the summary table, attributes are anchored with a:<name>.
+# In the description list, attributes are anchored with d:<name>.
+# There can be more than one item with the same name.
+# The attributes are alphabetized on output.
+# 
+# As this is processed by a shell script, and then the web page generator,
+# the special character '\' can cause problems. When used as a literal, use
+# the HTML encoding &#92; to avoid problems.
+#    
+:_background:G:string:<none>;  
+A string in the <A HREF=output.html#d:xdot>xdot format</A> specifying an arbitrary background.  
+During rendering, the canvas is first filled as described in the
+<A href=#d:bgcolor>bgcolor attribute</A>. 
+Then, if <b>_background</b> is defined, the graphics
+operations described in the string are performed on the canvas.
+:Damping:G:double:0.99:0.0; neato
+Factor damping force motions. On each iteration, a nodes movement
+is limited to this factor of its potential motion. By being less than
+1.0, the system tends to ``cool'', thereby preventing cycling.
+#:Nodefactor:G:double:1.0;
+#  Set by attribute, overwritten, unused
+#:Nodesep:G:double:1.0;
+#  Set by attribute, overwritten, unused
+:URL:ENGC:escString:<none>;   map,postscript,svg
+Hyperlinks incorporated into device-dependent output.
+At present, used in ps2, cmap, i*map and svg formats.
+For all these formats, URLs can be attached to nodes, edges and
+clusters. URL attributes can also be attached to the root graph in ps2,
+cmap and i*map formats. This serves as the base URL for relative URLs in the
+former, and as the default image map file in the latter.
+<P>
+For svg, cmapx and imap output, the active area for a node is its
+visible image.
+For example, an unfilled
+node with no drawn boundary will only be active on its label.
+For other output, the active area is its bounding box.
+The active area for a cluster is its bounding box.
+For edges, the active areas are small circles where the edge contacts its head
+and tail nodes. In addition, for svg, cmapx and imap, the active area
+includes a thin polygon approximating the edge. The circles may
+overlap the related node, and the edge URL dominates.
+If the edge has a label, this will also be active.
+Finally, if the edge has a head or tail label, this will also be active.
+<P>
+Note that, for edges, the attributes <A HREF=#d:headURL>headURL</A>,
+<A HREF=#d:tailURL>tailURL</A>, <A HREF=#d:labelURL>labelURL</A> and
+<A HREF=#d:edgeURL>edgeURL</A> allow control of various parts of an
+edge.
+Also note that, if active areas of two edges overlap, it is unspecified
+which area dominates.
+:area:NC:double:1.0:>0;  patchwork
+Indicates the preferred area for a node or empty cluster when laid out by patchwork.
+:arrowhead:E:arrowType:normal;
+Style of arrowhead on the head node of an edge.
+This will only appear if the <A HREF=#d:dir>dir</A> attribute
+is "forward" or "both".
+See the <A HREF=#h:undir_note>limitation</A>.
+:arrowsize:E:double:1.0:0.0;
+Multiplicative scale factor for arrowheads.
+:arrowtail:E:arrowType:normal;
+Style of arrowhead on the tail node of an edge.
+This will only appear if the <A HREF=#d:dir>dir</A> attribute
+is "back" or "both".
+See the <A HREF=#h:undir_note>limitation</A>.
+#:aspect:G:aspectType; dot
+#Target aspect ratio (width of the layout divided by the height)
+#of the graph drawing. If unset, dot minimizes the total edge length.
+#For certain graphs, like those with large fan-in or fan-out, this can
+#lead to very wide layouts. Setting <TT>aspect</TT> will cause dot to try
+#to adjust the layout to get an aspect ratio close to that specified
+#by <TT>aspect</TT>.
+##<P>
+##By default, dot will do 5 passes attempting to achieve the desired
+#aspect ratio. For certain graphs, more passes will be needed to get
+#close enough. The <TT>aspect</TT> attribute can also be used to 
+#specify the maximum number of passes to try.
+#<P>
+#At present, there is no mechanism for widening a very tall layout.
+#Also, the algorithm doesn't handle clusters, nor disconnected graphs.
+#For the latter case, one can split the pipeline<BR>
+#<TT>ccomps -x | dot | gvpack | neato -n2</TT>
+#to get a similar effect.
+:bb:G:rect; write
+Bounding box of drawing in points.
+:bgcolor:GC:color/colorList:<none>;
+When attached to the root graph, this color is used as the background for
+entire canvas. When a cluster attribute, it is used as the initial
+background for the cluster. If a cluster has a filled
+<A HREF=#d:style>style</A>, the
+cluster's <A HREF=#d:fillcolor>fillcolor</A> will overlay the
+background color.
+<P>
+If the value is a <A HREF=#k:colorList>colorList</A>, a gradient fill is
+used. By default, this is a linear fill; setting <TT>style=radial</TT> will
+cause a radial fill. At present, only two colors are used. If the second
+color (after a colon) is missing, the default color is used for it.
+See also the <A HREF=#d:gradientangle>gradientangle</A> attribute
+for setting the gradient angle. 
+<P>
+For certain output formats, such as PostScript, no fill is done for
+the root graph unless
+<b>bgcolor</b> is explicitly set. For bitmap formats, however, 
+the bits need to be
+initialized to something, so the canvas is filled with white by default.
+This means that if the bitmap output is included in some other
+document, all of the bits within the bitmap's bounding box will be
+set, overwriting whatever color or graphics were already on the page.
+If this effect is not desired, and you only want to set bits explicitly
+assigned in drawing the graph, set <B>bgcolor</B>="transparent".
+#bottomlabel:N:string:"";
+#  Additional label near bottom of nodes of shape M*.
+:center:G:bool:false;
+If true, the drawing is centered in the output canvas.
+:charset:G:string:"UTF-8";
+Specifies the character encoding used when interpreting string input
+as a text label. The default value is <TT>"UTF-8"</TT>.
+The other legal value is <TT>"iso-8859-1"</TT> or,
+equivalently,
+<TT>"Latin1"</TT>. The <B>charset</B> attribute is case-insensitive.
+Note that if the character encoding used in the input does not
+match the <B>charset</B> value, the resulting output may be very strange.
+:class:ENCG:string:"":;svg
+Classnames to attach to the node, edge, graph, or cluster's SVG element.
+Combine with <a href="#d:stylesheet">stylesheet</a> for styling SVG output
+using CSS classnames.
+<p>
+Multiple space-separated classes are supported.
+<p>
+<pre>
+digraph G {
+  graph [class="cats"];
+
+  subgraph cluster_big {
+    graph [class="big_cats"];
+
+    "Lion" [class="yellow social"];
+    "Snow Leopard" [class="white solitary"];
+  };
+}
+</pre>
+:clusterrank:G:clusterMode:local;  dot
+Mode used for handling clusters. If <B>clusterrank</B> is "local", a
+subgraph whose name begins with "cluster" is given special treatment.
+The subgraph is laid out separately, and then integrated as a unit into
+its parent graph, with a bounding rectangle drawn about it.
+If the cluster has a <A HREF=#d:label>label</A> parameter, this label
+is displayed within the rectangle.
+Note also that there can be clusters within clusters.
+At present, the modes "global" and "none"
+appear to be identical, both turning off the special cluster processing.
+:color:ENC:color/colorList:black;
+Basic drawing color for graphics, not text. For the latter, use the
+<A HREF=#d:fontcolor>fontcolor</A> attribute.
+<P>
+For edges, the value
+can either be a single color or a <A HREF=#k:colorList>colorList</A>.
+In the latter case, if colorList has no fractions,
+the edge is drawn using parallel splines or lines,
+one for each color in the list, in the order given.
+The head arrow, if any, is drawn using the first color in the list,
+and the tail arrow, if any, the second color. This supports the common
+case of drawing opposing edges, but using parallel splines instead of
+separately routed multiedges. 
+If any fraction is used, the colors are drawn in series, with each color
+being given roughly its specified fraction of the edge.
+For example, the graph
+<PRE>
+digraph G {
+  a -> b [dir=both color="red:blue"]
+  c -> d [dir=none color="green:red;0.25:blue"]
+}
+</PRE>
+yields<BR>
+<IMG SRC="colorlist.gif">
+:colorscheme:ENCG:string:"";
+This attribute specifies a color scheme namespace. If defined, it specifies
+the context for interpreting color names. In particular, if a
+<A HREF=#k:color>color</A> value has form <TT>"xxx"</TT> or <TT>"//xxx"</TT>,
+then the
+color <TT>xxx</TT> will be evaluated according to the current color scheme.
+If no color scheme is set, the standard X11 naming is used.
+For example, if <TT>colorscheme=bugn9</TT>, then <TT>color=7</TT>
+is interpreted as <TT>"/bugn9/7"</TT>.
+:comment:ENG:string:"";
+Comments are inserted into output. Device-dependent
+:compound:G:bool:false;  dot
+If true, allow edges between clusters. (See <A HREF=#d:lhead>lhead</A>
+and <A HREF=#d:ltail>ltail</A> below.)
+:concentrate:G:bool:false;
+If true, use edge concentrators.
+This merges multiedges into a single edge and causes partially parallel
+edges to share part of their paths. The latter feature is not yet available
+outside of dot.
+:constraint:E:bool:true;  dot
+If false, the edge is not used in ranking the nodes. For example,
+in the graph
+<PRE>
+digraph G {
+  a -> c;
+  a -> b;
+  b -> c [constraint=false];
+}
+</PRE>
+the edge <CODE>b -> c</CODE> does not add a constraint during rank
+assignment, so the only constraints are that a be above b and c,
+yielding the graph:<BR>
+<IMG SRC="constraint.gif">
+:defaultdist:G:double:1+(avg. len)*sqrt(|V|):epsilon; neato
+This specifies the distance between nodes in separate connected
+components. If set too small, connected components may overlap.
+Only applicable if <A HREF=#d:pack>pack</A>=false.
+:decorate:E:bool:false;
+If true, attach edge label to edge by a 2-segment
+polyline, underlining the label, then going to the closest point of spline.
+:dim:G:int:2:2; neato,fdp,sfdp
+Set the number of dimensions used for the layout. The maximum value
+allowed is 10.
+:dimen:G:int:2:2; neato,fdp,sfdp
+Set the number of dimensions used for rendering. 
+The maximum value allowed is 10.
+If both <TT>dimen</TT> and <TT>dim</TT> are set, the latter specifies
+the dimension used for layout, and the former for rendering.
+If only <TT>dimen</TT> is set, this is used for both layout and rendering
+dimensions.
+<P>
+Note that, at present, all aspects of rendering are 2D. This includes
+the shape and size of nodes, overlap removal, and edge routing. Thus,
+for <TT>dimen &gt; 2</TT>, the only valid information is the <TT>pos</TT>
+attribute of the nodes.
+All other coordinates will be 2D and, at best, will reflect a projection
+of a higher-dimensional point onto the plane.
+:dir:E:dirType:forward(directed)/none(undirected);
+Set edge type for drawing arrowheads. This indicates which ends of the
+edge should be decorated with an arrowhead. The actual style of the
+arrowhead can be specified using the <A HREF=#d:arrowhead>arrowhead</A>
+and <A HREF=#d:arrowtail>arrowtail</A> attributes.
+See <A HREF=#h:undir_note>limitation</A>.
+:diredgeconstraints:G:string/bool:false;   neato
+Only valid when <A HREF=#d:mode>mode</A>="ipsep".
+If true, constraints are generated for each edge in the largest (heuristic)
+directed acyclic subgraph such that the edge must point downwards.
+If "hier", generates level constraints similar to those used with
+<A HREF=#d:mode>mode</A>="hier". The main difference is that, in the latter
+case, only these constraints are involved, so a faster solver can be used.
+:distortion:N:double:0.0:-100.0;
+Distortion factor for <A HREF=#d:shape><B>shape</B></A>=polygon.
+Positive values cause top part to
+be larger than bottom; negative values do the opposite.
+:dpi:G:double:96.0/0.0;  bitmap output,svg
+This specifies the expected number of pixels per inch on a display device.
+For bitmap output, this guarantees that text rendering will be
+done more accurately, both in size and in placement. For SVG output,
+it is used to guarantee that the dimensions in the output correspond to
+the correct number of points or inches.
+:edgeURL:E:escString:"";  map,svg
+If <B>edgeURL</B> is defined, this is the link used for the non-label
+parts of an edge. This value overrides any <A HREF=#d:URL>URL</A>
+defined for the edge.
+Also, this value is used near the head or tail node unless overridden
+by a <A HREF=#d:headURL>headURL</A> or <A HREF=#d:tailURL>tailURL</A> value,
+respectively.
+See <A HREF=#h:undir_note>limitation</A>.
+:edgehref:E:escString:"";  map,svg
+Synonym for <A HREF=#d:edgeURL>edgeURL</A>.
+:edgetarget:E:escString:<none>;   map,svg
+If the edge has a <A HREF=#d:URL>URL</A> or <A HREF=#d:edgeURL>edgeURL</A>
+attribute, this attribute determines which window of the
+browser is used
+for the URL attached to the non-label part of the edge.
+Setting it to "_graphviz" will open a new window if it
+doesn't already exist, or reuse it if it does.
+If undefined, the value of the <A HREF=#d:target>target</A> is used.
+:edgetooltip:E:escString:"";    cmap,svg
+Tooltip annotation attached to the non-label part of an edge.
+This is used only if the edge has a <A HREF=#d:URL>URL</A>
+or <A HREF=#d:edgeURL>edgeURL</A> attribute.
+:epsilon:G:double:.0001 * # nodes(mode == KK)/.0001(mode == major)/.01(mode == sgd);  neato
+Terminating condition. If the length squared of all energy gradients are
+&lt; <B>epsilon</B>, the algorithm stops.
+:esep:G:addDouble/addPoint:+3; notdot
+Margin used around polygons for purposes of spline edge routing.
+The interpretation is the same as given for <A HREF=#d:sep>sep</A>.
+This should normally be strictly less than <A HREF=#d:sep>sep</A>.
+:fillcolor:NEC:color/colorList:lightgrey(nodes)/black(clusters);
+Color used to fill the background of a node or cluster
+assuming <A HREF=#d:style>style</A>=filled, or a filled arrowhead.
+If <B>fillcolor</B> is not defined, <A HREF=#d:color>color</A> is
+used. (For clusters, if <B>color</B> is not defined,
+<A HREF=#d:bgcolor>bgcolor</A> is used.) If this is not defined,
+the default is used, except for
+<A HREF=#d:shape><B>shape</B></A>=point or when the output
+format is MIF,
+which use black by default.
+<P>
+If the value is a <A HREF=#k:colorList>colorList</A>, a gradient fill is
+used. By default, this is a linear fill; setting <TT>style=radial</TT> will
+cause a radial fill. At present, only two colors are used. If the second
+color (after a colon) is missing, the default color is used for it.
+See also the <A HREF=#d:gradientangle>gradientangle</A> attribute
+for setting the gradient angle. 
+<P>
+Note that a cluster inherits the root graph's attributes if defined.
+Thus, if the root graph has defined a <B>fillcolor</B>, this will override a
+<B>color</B> or <B>bgcolor</B> attribute set for the cluster.
+:fixedsize:N:bool/string:false;
+If <tt>false</tt>, the size of a node is determined by smallest width and height
+needed to contain its label and image, if any, with a margin specified by
+the <A HREF=#d:margin><TT>margin</TT></A> attribute. The width
+and height must also be at least as large as the sizes specified by the
+<A HREF=#d:width><TT>width</TT></A> and
+<A HREF=#d:height><TT>height</TT></A> attributes, which specify
+the minimum values for these parameters. 
+<P>
+If <tt>true</tt>, the node size is specified by the values of the
+<A HREF=#d:width><TT>width</TT></A>
+and <A HREF=#d:height><TT>height</TT></A> attributes only
+and is not expanded to contain the text label.
+There will be a warning if the label (with margin)
+cannot fit within these limits.
+<P>
+If the <A HREF=attrs.html#d:fixedsize><TT>fixedsize</TT></A> attribute is set 
+to <tt>shape</tt>, the <A HREF=#d:width><TT>width</TT></A> and
+<A HREF=#d:height><TT>height</TT></A> attributes also determine the size
+of the node shape, but the label can be much larger. Both the label and
+shape sizes are used when avoiding node overlap, but all edges to the
+node ignore the label and only contact the node shape. No warning is given
+if the label is too large.
+:fontcolor:ENGC:color:black;
+Color used for text.
+:fontnames:G:string:"";    svg
+Allows user control of how basic fontnames are represented in SVG output.
+If <TT>fontnames</TT> is undefined or <TT>"svg"</TT>,
+the output will try to use known SVG fontnames. For example, the
+default font  <TT>"Times-Roman"</TT> will be mapped to the
+basic SVG font <TT>"serif"</TT>. This can be overridden by setting
+<TT>fontnames</TT> to  <TT>"ps"</TT> or  <TT>"gd"</TT>.
+In the former case, known PostScript font names such as
+<TT>"Times-Roman"</TT> will be used in the output.
+In the latter case, the fontconfig font conventions
+are used. Thus, <TT>"Times-Roman"</TT> would be treated as
+<TT>"Nimbus Roman No9 L"</TT>. These last two options are useful
+with SVG viewers that support these richer fontname spaces.
+:fontname:ENGC:string:"Times-Roman";
+Font used for text. This very much depends on the output format and, for
+non-bitmap output such as PostScript or SVG, the availability of the font
+when the graph is displayed or printed. As such, it is best to rely on
+font faces that are generally available, such as Times-Roman, Helvetica or
+Courier.
+<P>
+How font names are resolved also depends on the underlying library that handles
+font name resolution.
+If Graphviz was built using the
+<A HREF=http://pdx.freedesktop.org/~fontconfig/fontconfig-user.html>fontconfig library</A>, 
+the latter library will be used to search for the font. 
+See the commands <B>fc-list</B>, <B>fc-match</B> and the other fontconfig commands for how
+names are resolved and which fonts are available.
+Other systems may provide their own font package, such as Quartz for OS X.
+<P>
+Note that various font attributes, such as weight and slant, can be built into the
+font name. Unfortunately, the syntax varies depending on which font system is dominant. 
+Thus, using <TT>fontname="times bold italic"</TT> will produce a bold, slanted Times font 
+using Pango, the usual main font library. Alternatively,  
+<TT>fontname="times:italic"</TT> will produce a slanted
+Times font from fontconfig, while <TT>fontname="times-bold"</TT> will resolve to a bold
+Times using Quartz. You will need
+to ascertain which package is used by your Graphviz system and refer to the relevant
+documentation.
+<P>
+If Graphviz is not built with a high-level font library, <TT>fontname</TT> will be
+considered the name of a Type 1 or True Type font file.
+If you specify <TT>fontname=schlbk</TT>, the tool will look for a
+file named  <TT>schlbk.ttf</TT> or <TT>schlbk.pfa</TT> or <TT>schlbk.pfb</TT>
+in one of the directories specified by
+the <A HREF=#d:fontpath>fontpath</A> attribute.
+The lookup does support various aliases for the common fonts.
+:fontpath:G:string:system-dependent;
+Directory list used by libgd to search for bitmap fonts if Graphviz
+was not built with the fontconfig library.
+If <B>fontpath</B> is not set, the environment
+variable <TT>DOTFONTPATH</TT> is checked.
+If that is not set, <TT>GDFONTPATH</TT> is checked.
+If not set, libgd uses its compiled-in font path.
+Note that fontpath is an attribute of the root graph.
+:fontsize:ENGC:double:14.0:1.0;
+Font size, <A HREF=#points>in points</A>, used for text.
+:forcelabels:G:bool:true;
+If true, all  <A HREF=#d:xlabel><B>xlabel</B></A> attributes are placed, even if there is some overlap with nodes
+or other labels.
+:gradientangle:NCG:int:"";
+If a gradient fill is being used, this determines the angle of the fill. For linear fills, the colors transform
+along a line specified by the angle and the center of the object. For radial fills, a value of zero causes the
+colors to transform radially from the center; for non-zero values, the colors transform from a point near the
+object's periphery as specified by the value.
+<P>
+If unset, the default angle is 0.
+:group:N:string:"";  dot
+If the end points of an edge belong to the same group, i.e., have the
+same group attribute, parameters are set to avoid crossings and keep
+the edges straight.
+:headURL:E:escString:"";   map,svg
+If <B>headURL</B> is defined, it is
+output as part of the head label of the edge.
+Also, this value is used near the head node, overriding any
+<A HREF=#d:URL>URL</A> value.
+See <A HREF=#h:undir_note>limitation</A>.
+:headclip:E:bool:true;
+If true, the head of an edge is clipped to the boundary of the head node;
+otherwise, the end of the edge goes to the center of the node, or the
+center of a port, if applicable.
+:headhref:E:escString:"";  map,svg
+Synonym for <A HREF=#d:headURL>headURL</A>.
+:headlabel:E:lblString:"";
+Text label to be placed near head of edge.
+See <A HREF=#h:undir_note>limitation</A>.
+:head_lp:E:point; write
+Position of an edge's head label, <A HREF=#points>in points</A>.
+The position indicates the center of the label.
+:headport:E:portPos:center;
+Indicates where on the head node to attach the head of the edge.
+In the default case, the edge is aimed towards the center of the node,
+and then clipped at the node boundary.
+See <A HREF=#h:undir_note>limitation</A>.
+:headtarget:E:escString:<none>;   map,svg
+If the edge has a <A HREF=#d:headURL>headURL</A>,
+this attribute determines which window of the
+browser is used
+for the URL. Setting it to "_graphviz" will open a new window if it
+doesn't already exist, or reuse it if it does.
+If undefined, the value of the <A HREF=#d:target>target</A> is used.
+:headtooltip:E:escString:"";    cmap,svg
+Tooltip annotation attached to the head of an edge. This is used only
+if the edge has a <A HREF=#d:headURL>headURL</A> attribute.
+:height:N:double:0.5:0.02;
+Height of node, in inches. This is taken as the initial, minimum height
+of the node. If <A HREF=#d:fixedsize><B>fixedsize</B></A> is true, this
+will be the final height of the node. Otherwise, if the node label
+requires more height to fit, the node's height will be increased to
+contain the label. Note also that, if the output format is dot, the
+value given to <B>height</B> will be the final value.
+<P>
+If the node shape is regular, the width and height are made identical.
+In this case, if either the width or the height is set explicitly,
+that value is used.
+In this case, if both the width or the height are set explicitly,
+the maximum of the two values is used.
+If neither is set explicitly, the minimum of the two default values
+is used.
+:href:GCNE:escString:"";  map,postscript,svg
+Synonym for <A HREF=#d:URL>URL</A>.
+:id:GCNE:escString:"";  map,postscript,svg
+Allows the graph author to provide an id for graph objects which is to be included in the output.
+Normal "&#92;N", "&#92;E", "&#92;G" substitutions are applied.
+If provided, it is the responsibility of the provider to keep
+its values sufficiently unique for its intended downstream use.
+Note, in particular, that "&#92;E" does not provide a unique id for multi-edges.
+If no id attribute is provided, then a unique internal id is used. However, 
+this value is unpredictable by the graph writer.
+An externally provided id is not used internally.
+<P>
+If the graph provides an id attribute, this will be used as a prefix for
+internally generated attributes. By making these distinct, the user
+can include multiple image maps in the same document.
+:image:N:string:"";
+Gives the name of a file containing an image to be displayed inside
+a node. The image file must be in one of the recognized 
+<A HREF=output.html#d:image_fmts>formats</A>,
+typically JPEG, PNG, GIF, BMP, SVG or Postscript, and be able to be converted
+into the desired output format.
+<P>
+The file must contain the image size information. This is usually trivially
+true for the bitmap formats. For PostScript, the file must contain a
+line starting with <TT>%%BoundingBox: </TT> followed by four integers
+specifying the lower left x and y coordinates and the upper right x and y
+coordinates of the bounding box for the image, the coordinates being in
+points. An SVG image file must contain <TT>width</TT> and <TT>height</TT>
+attributes, typically as part of the <TT>svg</TT> element.
+The values for these should have the form of a floating point number,
+followed by optional units, e.g., <TT>width="76pt"</TT>. 
+Recognized units are <TT>in</TT>, <TT>px</TT>,
+<TT>pc</TT>, <TT>pt</TT>, <TT>cm</TT> and <TT>mm</TT> for inches, pixels,
+picas, points, centimeters and millimeters, respectively.
+The default unit is points.
+<P>
+Unlike with the <A HREF=#d:shapefile>shapefile</A> attribute,
+the image is treated as node
+content rather than the entire node. In particular, an image can
+be contained in a node of any shape, not just a rectangle.
+:imagepath:G:string:"";
+Specifies a list of directories in which to look for image files as specified by the
+<a href="#d:image">image</a> attribute or using the <TT>IMG</TT> element in
+<a href="shapes.html#html">HTML-like labels</a>.
+The string should be a list of (absolute or relative) pathnames, each separated by
+a semicolon (for Windows) or a colon (all other OS). 
+The first directory in which a file of the given name is found will be used to
+load the image. If <tt>imagepath</tt> is not set, relative pathnames for the image
+file will be interpreted with respect to the current working directory.
+:imagepos:N:string:"mc":;
+Attribute controlling how an image is positioned within its containing node.  This
+only has an effect when the image is smaller than the containing node.  The
+default is to be centered both horizontally and vertically.  Valid values:
+<TABLE>
+<TR><TD>tl</TD><TD>Top Left</TD></TR>
+<TR><TD>tc</TD><TD>Top Centered</TD></TR>
+<TR><TD>tr</TD><TD>Top Right</TD></TR>
+<TR><TD>ml</TD><TD>Middle Left</TD></TR>
+<TR><TD>mc</TD><TD>Middle Centered <I>(the default)</I></TD></TR>
+<TR><TD>mr</TD><TD>Middle Right</TD></TR>
+<TR><TD>bl</TD><TD>Bottom Left</TD></TR>
+<TR><TD>bc</TD><TD>Bottom Centered</TD></TR>
+<TR><TD>br</TD><TD>Bottom Right</TD></TR>
+</TABLE>
+:imagescale:N:bool/string:false:;
+Attribute controlling how an image fills its
+containing node. In general, the image is given its natural size,
+(cf. <A HREF=#d:dpi>dpi</A>),
+and the node size is made large enough to contain its image, its
+label, its margin, and its peripheries.
+Its width and height will also be at least as large as its
+minimum <A HREF=#d:width>width</A> and <A HREF=#d:height>height</A>.
+If, however, <TT>fixedsize=true</TT>,
+the width and height attributes specify the exact size of the node.
+<P>
+During rendering, in the default case (<TT>imagescale=false</TT>),
+the image retains its natural size.
+If <TT>imagescale=true</TT>,
+the image is uniformly scaled (i.e., its aspect ratio is
+preserved) to fit inside the node.
+At least one dimension of the image will be as large as possible
+given the size of the node.
+When <TT>imagescale=width</TT>,
+the width of the image is scaled to fill the node width.
+The corresponding property holds when <TT>imagescale=height</TT>.
+When <TT>imagescale=both</TT>,
+both the height and the width are scaled separately to fill the node.
+<P>
+In all cases, if a dimension of the image is larger than the
+corresponding dimension of the node, that dimension of the
+image is scaled down to fit the node. As with the case of
+expansion, if  <TT>imagescale=true</TT>, width and height are
+scaled uniformly.
+:inputscale:G:double:<none>;  neato,fdp
+For layout algorithms that support initial input positions (specified by the <A HREF=#d:pos><B>pos</B></A> attribute),
+this attribute can be used to appropriately scale the values. By default, fdp and neato interpret
+the x and y values of pos as being in inches. (<B>NOTE</B>: neato -n(2) treats the coordinates as
+being in points, being the unit used by the layout algorithms for the pos attribute.) Thus, if
+the graph has pos attributes in points, one should set <TT>inputscale=72</TT>.
+This can also be set on the command line using the <A HREF=command.html#minusK><TT>-s</TT> flag</A> flag.
+<P>
+If not set, no scaling is done and the units on input are treated as inches.
+A value of 0 is equivalent to <TT>inputscale=72</TT>.
+:K:GC:double:0.3:0;  fdp,sfdp
+Spring constant used in virtual physical model. It roughly corresponds
+to an ideal edge length (in inches), in that increasing K tends to
+increase the distance between nodes.
+Note that the edge attribute <A HREF=#d:len>len</A> can be used to
+override this value for adjacent nodes.
+:label:ENGC:lblString:"\&#92;N" (nodes)/"" (otherwise);
+Text label attached to objects.
+If a node's <A HREF=#d:shape>shape</A> is record, then the label can
+have a <A HREF=shapes.html#record>special format</A>
+which describes the record layout.
+<P>
+Note that a node's default label is "&#92;N", so the node's name or ID becomes
+its label. Technically, a node's name can be an HTML string but this will not
+mean that the node's label will be interpreted as an <a href="shapes.html#html">HTML-like label</a>. This is
+because the node's actual label is an ordinary string, which will be replaced 
+by the raw bytes stored in the node's name.
+To get an HTML-like label, the label attribute value itself must be an HTML string.
+:labelURL:E:escString:"";  map,svg
+If <B>labelURL</B> is defined, this is the link used for the label
+of an edge. This value overrides any <A HREF=#d:URL>URL</A>
+defined for the edge.
+:labelangle:E:double:-25.0:-180.0;
+This, along with <A HREF=#d:labeldistance>labeldistance</A>, determine
+where the
+headlabel (taillabel) are placed with respect to the head (tail)
+in polar coordinates. The origin in the coordinate system is
+the point where the edge touches the node. The ray of 0 degrees
+goes from the origin back along the edge, parallel to the edge
+at the origin.
+<P>
+The angle, in degrees, specifies the rotation from the 0 degree ray,
+with positive angles moving counterclockwise and negative angles
+moving clockwise.
+:labeldistance:E:double:1.0:0.0;
+Multiplicative scaling factor adjusting the distance that
+the headlabel(taillabel) is from the head(tail) node.
+The default distance is 10 points. See <A HREF=#d:labelangle>labelangle</A>
+for more details.
+:labelfloat:E:bool:false;
+If true, allows edge labels to be less constrained in position.
+In particular, it may appear on top of other edges.
+:labelfontcolor:E:color:black;
+Color used for headlabel and taillabel.
+If not set, defaults to edge's fontcolor.
+:labelfontname:E:string:"Times-Roman";
+Font used for headlabel and taillabel.
+If not set, defaults to edge's fontname.
+:labelfontsize:E:double:14.0:1.0;
+Font size, <A HREF=#points>in points</A>, used for headlabel and taillabel.
+If not set, defaults to edge's fontsize.
+:labelhref:E:escString:"";  map,svg
+Synonym for <A HREF=#d:labelURL>labelURL</A>.
+:labeljust:GC:string:"c";
+Justification for cluster labels. If "r", the label
+is right-justified within bounding rectangle; if "l", left-justified;
+else the label is centered.
+Note that a subgraph inherits attributes from its parent. Thus, if
+the root graph sets <B>labeljust</B> to "l", the subgraph inherits
+this value.
+:labelloc:NGC:string:"t"(clusters)/"b"(root graphs)/"c"(nodes);
+Vertical placement of labels for nodes, root graphs and clusters.
+<P>
+For graphs and clusters, only "t" and "b" are allowed, corresponding
+to placement at the top and bottom, respectively.
+By default, root
+graph labels go on the bottom and cluster labels go on the top.
+Note that a subgraph inherits attributes from its parent. Thus, if
+the root graph sets <B>labelloc</B> to "b", the subgraph inherits
+this value.
+<P>
+For nodes, this attribute is used only when the height of the node
+is larger than the height of its label. 
+If <TT>labelloc</TT> is set to "t", "c", or "b", the label is aligned
+with the top, centered, or aligned with the bottom of the node, respectively.
+In the default case, the label is vertically centered.
+:labeltarget:E:escString:<none>;   map,svg
+If the edge has a <A HREF=#d:URL>URL</A> or <A HREF=#d:labelURL>labelURL</A>
+attribute, this attribute determines which window of the
+browser is used
+for the URL attached to the label.
+Setting it to "_graphviz" will open a new window if it
+doesn't already exist, or reuse it if it does.
+If undefined, the value of the <A HREF=#d:target>target</A> is used.
+:labeltooltip:E:escString:"";    cmap,svg
+Tooltip annotation attached to label of an edge.
+This is used only if the edge has a <A HREF=#d:URL>URL</A>
+or <A HREF=#d:labelURL>labelURL</A> attribute.
+:label_scheme:G:int:0:0;  sfdp
+The value indicates
+whether to treat a node whose name has the form |edgelabel|* as a special node representing an edge label. 
+The default (0) produces no effect.
+If the attribute is set to 1, sfdp uses a penalty-based method to make that kind of node close to the 
+center of its neighbor. With a value of 2, sfdp uses a penalty-based method to make that kind of node 
+close to the old center of its neighbor. Finally, a value of 3 invokes a two-step process of overlap 
+removal and straightening.
+:landscape:G:bool:false;
+If true, the graph is rendered in landscape mode. Synonymous with
+<A HREF=#d:rotate><TT>rotate=90</TT></A> or
+<A HREF=#d:orientation><TT>orientation=landscape</TT></A>.
+:layer:ENC:layerRange:"";
+Specifies layers in which the node, edge or cluster is present.
+:layers:G:layerList:"";
+Specifies a linearly ordered list of layer names attached to the graph
+The graph is then output in separate layers. Only those components
+belonging to the current output layer appear. For more information,
+see the page <A HREF="../../../faq/#FaqOverlays">How to use drawing layers (overlays)</A>.
+:layerlistsep:G:string:",";
+Specifies the separator characters used to split
+an attribute of type <A HREF=#k:layerRange>layerRange</A> into a list of ranges.
+:layerselect:G:layerRange:"";
+Selects a list of layers to be emitted.
+:layersep:G:string:" :&#92;t";
+Specifies the separator characters used to split the
+<A HREF=#d:layers>layers</A> attribute into a list of layer names.
+:layout:G:string:"";
+Specifies the name of the layout algorithm to use, such as "dot"
+or "neato". Normally, graphs should be kept independent of a type of
+layout. In some cases, however, it can be convenient to embed the type
+of layout desired within the graph. For example, a graph containing
+position information from a layout might want to record what the
+associated layout algorithm was.
+<P>
+This attribute takes precedence over 
+the <A HREF=command.html#minusK>-K flag</A> 
+or the actual command name used.
+:len:E:double:1.0(neato)/0.3(fdp); neato,fdp
+Preferred edge length, in inches.
+:levels:G:int:MAXINT:0.0;  sfdp
+Number of levels allowed in the multilevel scheme.
+:levelsgap:G:double:0.0;  neato
+Specifies strictness of level constraints in neato
+when <TT><A HREF=#d:mode>mode</A>="ipsep" or "hier"</TT>.
+Larger positive values mean stricter constraints, which demand more
+separation between levels. On the other hand, negative values will relax
+the constraints by allowing some overlap between the levels.
+:lhead:E:string:""; dot
+Logical head of an edge. When <A HREF=#d:compound><B>compound</B></A> is true,
+if <B>lhead</B> is defined and is the name of a cluster containing
+the real head,
+the edge is clipped to the boundary of the cluster.
+See <A HREF=#h:undir_note>limitation</A>.
+:lheight:GC:double; write
+Height of graph or cluster label, in inches.
+:lp:EGC:point; write
+Label position, <A HREF=#points>in points</A>.
+The position indicates the center of the label.
+:ltail:E:string:""; dot
+Logical tail of an edge. When <A HREF=#d:compound><B>compound</B></A> is true,
+if <B>ltail</B> is defined and is the name of a cluster
+containing the real tail,
+the edge is clipped to the boundary of the cluster.
+See <A HREF=#h:undir_note>limitation</A>.
+:lwidth:GC:double; write
+Width of graph or cluster label, in inches.
+:margin:NCG:double/point:<device-dependent>;
+For graphs, this sets x and y margins of canvas, in inches. If the margin
+is a single double, both margins are set equal to the given value.
+<P>
+Note that the margin is not part of the drawing but just empty space
+left around the drawing. It basically corresponds to a translation of
+drawing, as would be necessary to center a drawing on a page. Nothing
+is actually drawn in the margin. To actually extend the background of
+a drawing, see the <A HREF=#d:pad>pad</A> attribute.
+<P>
+For clusters, this specifies the space between the nodes in the cluster and
+the cluster bounding box. By default, this is 8 points.
+<P>
+For nodes, this attribute specifies space left around the node's label.
+By default, the value is <TT>0.11,0.055</TT>.
+:maxiter:G:int:100 * # nodes(mode == KK)/200(mode == major)/30(mode == sgd)/600(fdp);  neato,fdp
+Sets the number of iterations used.
+:mclimit:G:double:1.0;  dot
+Multiplicative scale factor used to alter the MinQuit (default = 8)
+and MaxIter (default = 24) parameters used during crossing
+minimization. These correspond to the
+number of tries without improvement before quitting and the
+maximum number of iterations in each pass.
+:mindist:G:double:1.0:0.0;  circo
+Specifies the minimum separation between all nodes.
+:minlen:E:int:1:0;  dot
+Minimum edge length (rank difference between head and tail).
+:mode:G:string:major;  neato
+Technique for optimizing the layout. For neato, if <B>mode</B> is <TT>"major"</TT>,
+neato uses stress majorization. If <B>mode</B> is <TT>"KK"</TT>,
+neato uses a version of the gradient descent method. The only advantage
+to the latter technique is that it is sometimes appreciably faster for
+small (number of nodes &lt; 100) graphs. A significant disadvantage is that
+it may cycle. If <B>mode</B> is <TT>"sgd"</TT>, neato uses a version of the
+stochastic gradient descent method. The advantage of sgd is faster and more
+reliable convergence than both the previous methods, while the disadvantage
+is that it runs in a fixed number of iterations and may require larger
+values of <TT>"maxiter"</TT> in some graphs.
+<P>
+There are two experimental modes in neato, "hier", which adds a top-down
+directionality similar to the layout used in dot, and "ipsep", which
+allows the graph to specify minimum vertical and horizontal distances
+between nodes. (See the <A HREF=#d:sep>sep</A> attribute.)
+<P>
+For sfdp, the default <B>mode</B> is <TT>"spring"</TT>, which corresponds to using
+a spring-electrical model. Setting <B>mode</B> to <TT>"maxent"</TT> causes a similar
+model to be run but one that also takes into account edge lengths specified by the
+<TT>"len"</TT> attribute.
+:model:G:string:shortpath;  neato
+This value specifies how the distance matrix is computed for the input
+graph. The distance matrix specifies the ideal distance between every
+pair of nodes. neato attemps to find a layout which best achieves
+these distances. By default, it uses the length of the shortest path,
+where the length of each edge is given by its <A HREF=#d:len>len</A>
+attribute. If <B>model</B> is <TT>"circuit"</TT>, neato uses the
+circuit resistance
+model to compute the distances. This tends to emphasize clusters. If
+<B>model</B> is <TT>"subset"</TT>, neato uses the subset model. This sets the
+edge length to be the number of nodes that are neighbors of exactly one
+of the end points, and then calculates the shortest paths. This helps
+to separate nodes with high degree.
+<P>
+For more control of distances, one can use <TT>model=mds</TT>. In this
+case, the <A HREF=#d:len>len</A> of an edge is used as the ideal distance
+between its vertices. A shortest path calculation is only used for
+pairs of nodes not connected by an edge. Thus, by supplying a complete
+graph, the input can specify all of the relevant distances.
+:mosek:G:bool:false;    neato
+If Graphviz is built with MOSEK defined, mode=ipsep and mosek=true,
+the Mosek software (www.mosek.com) is use to solve the ipsep constraints.
+:newrank:G:bool:false;    dot
+The original ranking algorithm in dot is recursive on clusters. This can produce fewer ranks
+and a more compact layout, but sometimes at the cost of a head node being place on a higher
+rank than the tail node. It also assumes that a node is not constrained in separate, 
+incompatible subgraphs. For example, a node cannot be in a cluster and also be constrained by
+<TT>rank=same</TT> with a node not in the cluster.
+<P>
+If <TT>newrank=true</TT>, the ranking algorithm does a single global ranking, ignoring clusters.
+This allows nodes to be subject to multiple constraints. Rank constraints will usually take
+precedence over edge constraints.
+:nodesep:G:double:0.25:0.02;
+In dot, this specifies the minimum space between two adjacent nodes in the same rank, in inches.
+<P>
+For other layouts, this affects the spacing between loops on a single node, or multiedges between
+a pair of nodes.
+:nojustify:GCNE:bool:false;
+By default, the justification of multi-line labels is done within the
+largest context that makes sense. Thus, in the label of a polygonal
+node, a left-justified line will align with the left side of the node
+(shifted by the prescribed <A HREF=#d:margin>margin</A>).
+In record nodes, left-justified
+line will line up with the left side of the enclosing column of fields.
+If <B>nojustify</B> is <TT>"true"</TT>, multi-line labels will be justified
+in the context of itself. For example, if the attribute is set,
+the first label line is long, and the second is shorter and left-justified,
+the second will align with the left-most character in the first line,
+regardless of  how large the node might be.
+:normalize:G:double/bool:false; notdot
+If set, normalize coordinates of final
+layout so that the first point is at the origin, and then rotate the
+layout so that the angle of the first edge is specified by the value of <TT>normalize</TT> in degrees.
+If  <TT>normalize</TT> is not a number, it is evaluated as a  <TT>bool</TT>, with true
+corresponding to 0 degrees. <B>NOTE:</B> Since the attribute is evaluated first as a number,
+0 and 1 cannot be used for false and true.
+:notranslate:G:bool:false;      neato
+By default, the final layout is translated so that the lower-left corner of the bounding box is
+at the origin. This can be annoying if some nodes are pinned or if the user runs <TT>neato -n</TT>. 
+To avoid this translation, set <TT>notranslate</TT> to true.
+:nslimit:G:double;  dot
+Used to set number of iterations in
+network simplex applications. <B>nslimit</B> is used in
+computing node x coordinates.
+If defined, # iterations =  <B>nslimit</B> * # nodes;
+otherwise,  # iterations = MAXINT.
+:nslimit1:G:double;  dot
+Used to set number of iterations in
+network simplex applications. 
+<B>nslimit1</B> is used for ranking nodes.
+If defined, # iterations =  <B>nslimit1</B> * # nodes;
+otherwise,  # iterations = MAXINT.
+:ordering:GN:string:""; dot
+If the value of the attribute is "out", then
+the outedges of a node, that is, edges with the node as its tail node,
+must appear
+left-to-right in the same order in which they are defined in
+the input.
+If the value of the attribute is "in", then
+the inedges of a node must appear
+left-to-right in the same order in which they are defined in
+the input.
+If defined as a graph or subgraph attribute, the value is applied to all nodes
+in the graph or subgraph. Note that the graph attribute takes
+precedence over the node attribute.
+:orientation:NG:double/string:0.0/"":360.0;
+When used on nodes: Angle, in degrees, used to rotate polygon node shapes. For any number of polygon sides, 0 degrees rotation results in a flat base.
+<P>
+When used on graphs: If <CODE>"[lL]*"</CODE>, set graph orientation to landscape.
+Used only if <A HREF=#d:rotate><B>rotate</B></A> is not defined.
+:outputorder:G:outputMode:breadthfirst;
+Specify order in which nodes and edges are drawn.
+:overlap:G:string/bool:true;  notdot
+Determines if and how node overlaps should be removed. Nodes are first
+enlarged using the <A HREF=#d:sep><B>sep</B></A> attribute.
+If "true" , overlaps are retained.
+If the value is "scale", overlaps are removed by uniformly scaling in x and y.
+If the value converts to "false", and it is available, Prism, a proximity graph-based algorithm, is
+used to remove node overlaps.
+This can also be invoked explicitly with "overlap=prism".
+This technique starts with a
+small scaling up, controlled by the 
+<A HREF="#d:overlap_scaling"><TT>overlap_scaling</TT></A> attribute,
+which can remove a significant portion of the overlap.
+The prism option also accepts an optional non-negative integer suffix.
+This can be used to control the number of attempts made at overlap
+removal. By default, <TT>overlap="prism"</TT> is equivalent to
+<TT>overlap="prism1000"</TT>. Setting <TT>overlap="prism0"</TT>
+causes only the scaling phase to be run.
+<P>
+If Prism is not available, or the version of Graphviz is earlier than 2.28, "overlap=false"
+uses a Voronoi-based technique.
+This can always be invoked explicitly with "overlap=voronoi".
+<P>
+If the value is "scalexy", x and y are separately
+scaled to remove overlaps.
+<P>
+If the value is "compress", the layout will be scaled down as much as
+possible without introducing any overlaps, obviously assuming there are
+none to begin with.
+<P>
+<B>N.B.</B>The remaining allowed values of <TT>overlap</TT>
+correspond to algorithms which, at present, can produce bad aspect ratios.
+In addition, we deprecate the use of the "ortho*" and "portho*".
+<P>
+If the value is "vpsc", overlap removal is done as a
+quadratic optimization to minimize node displacement while removing
+node overlaps.
+<P>
+If the value is "orthoxy" or "orthoyx", overlaps
+are moved by optimizing two constraint problems, one for the x axis and
+one for the y. The suffix indicates which axis is processed first.
+If the value is "ortho", the technique is similar to "orthoxy" except a
+heuristic is used to reduce the bias between the two passes.
+If the value is "ortho_yx", the technique is the same as "ortho", except
+the roles of x and y are reversed.
+The values "portho", "porthoxy", "porthoxy", and "portho_yx" are similar
+to the previous four, except only pseudo-orthogonal ordering is
+enforced.
+<P>
+If the layout is done by neato with <A HREF=#d:mode>mode</A>="ipsep",
+then one can use <TT>overlap=ipsep</TT>.
+In this case, the overlap removal constraints are
+incorporated into the layout algorithm itself.
+N.B. At present, this only supports one level of clustering.
+<P>
+Except for fdp and sfdp, the layouts assume <TT>overlap="true"</TT> as the default.
+Fdp first uses a number of passes using a built-in, force-directed technique
+to try to remove overlaps. Thus, fdp accepts <B>overlap</B> with an integer
+prefix followed by a colon, specifying the number of tries. If there is
+no prefix, no initial tries will be performed. If there is nothing following
+a colon, none of the above methods will be attempted. By default, fdp
+uses <TT>overlap="9:prism"</TT>. Note that <TT>overlap="true"</TT>,
+<TT>overlap="0:true"</TT> and <TT>overlap="0:"</TT> all turn off all overlap
+removal.
+<P>
+By default, sfdp uses <TT>overlap="prism0"</TT>.
+<P>
+Except for the Voronoi and prism methods, all of these transforms preserve the
+orthogonal ordering of the original layout. That is, if the x coordinates
+of two nodes are originally the same, they will remain the same, and if
+the x coordinate of one node is originally less than the x coordinate of
+another, this relation will still hold in the transformed layout. The
+similar properties hold for the y coordinates.
+This is not quite true for the "porth*" cases. For these, orthogonal
+ordering is only preserved among nodes related by an edge.
+:overlap_scaling:G:double:-4:-1.0e10; prism
+When <TT>overlap=prism</TT>, the layout is scaled by this factor, thereby
+removing a fair amount of node overlap, and making node overlap removal
+faster and better able to retain the graph's shape.
+<P>
+If <TT>overlap_scaling</TT> is negative, the layout is scaled by
+<TT>-1*overlap_scaling</TT> times the average label size.
+If <TT>overlap_scaling</TT> is positive, the layout is scaled by
+<TT>overlap_scaling</TT>.
+If <TT>overlap_scaling</TT> is zero, no scaling is done.
+:overlap_shrink:G:bool:true; prism
+If true, the overlap removal algorithm will perform a compression pass to reduce the
+size of the layout.
+:pack:G:bool/int:false;
+This is true if the value of pack is "true" (case-insensitive) or a
+non-negative integer. If true, each connected component of the graph is
+laid out separately, and then the graphs are packed together.
+If pack has an integral value, this is used as the size,
+in <A HREF=#points>points</A>, of
+a margin around each part; otherwise, a default margin of 8 is used.
+If pack is interpreted as false, the entire graph is laid out together.
+The granularity and method of packing is influenced by the
+<A HREF=#d:packmode>packmode</A> attribute.
+<P>
+For layouts which always do packing, such a twopi, the <B>pack</B>
+attribute is just used to set the margin.
+:packmode:G:packMode:node;
+This indicates how connected components should be packed
+(cf. <A HREF=#k:packMode>packMode</A>). Note that defining
+<B>packmode</B> will automatically turn on packing as though one had
+set <B>pack=true</B>.
+:pad:G:double/point:0.0555 (4 points);
+The pad attribute specifies how much, in inches, to extend the
+drawing area around the minimal area needed to draw the graph.
+If the pad is a single double, both the x and y pad values are set
+equal to the given value. This area is part of the
+drawing and will be filled with the background color, if appropriate.
+<P>
+Normally, a small pad is used for aesthetic reasons, especially when
+a background color is used, to avoid having nodes and edges abutting
+the boundary of the drawn region.
+:page:G:double/point;
+Width and height of output pages, in inches. If only a single value
+is given, this is used for both the width and height.
+<P>
+If this is set and is
+smaller than the size of the layout, a rectangular array of pages of
+the specified page size is overlaid on the layout, with origins
+aligned in the lower-left corner, thereby partitioning the layout
+into pages. The pages are then produced one at a time, in
+<A HREF=#d:pagedir>pagedir</A> order.
+<P>
+At present, this only works for PostScript output. For other types of
+output, one should use another tool to split the output into multiple
+output files. Or use the <A HREF=#d:viewport>viewport</A> to generate
+multiple files.
+:pagedir:G:pagedir:BL;
+If the <A HREF=#d:page>page</A> attribute is set and applicable,
+this attribute specifies the order in which the pages are emitted.
+This is limited to one of the 8 row or column major orders.
+:pencolor:C:color:black;
+Color used to draw the bounding box around a cluster.
+If <B>pencolor</B> is not defined, <A HREF=#d:color><B>color</B></A> is
+used. If this is not defined, <A HREF=#d:bgcolor>bgcolor</A> is used.
+If this is not defined, the default is used.
+<P>
+Note that a cluster inherits the root graph's attributes if defined.
+Thus, if the root graph has defined a <B>pencolor</B>, this will override a
+<B>color</B> or <B>bgcolor</B> attribute set for the cluster.
+:penwidth:CNE:double:1.0:0.0;
+Specifies the width of the pen, in points, used to draw lines and curves,
+including the boundaries of edges and clusters. The value is inherited
+by subclusters.
+It has no effect on text.
+<P>
+Previous to 31 January 2008, the effect of <TT>penwidth=<I>W</I></TT>
+was achieved by including <TT>setlinewidth(<I>W</I>)</TT>
+as part of a <A HREF=#d:style><TT>style</TT></A> specification.
+If both are used, <TT>penwidth</TT> will be used.
+:peripheries:NC:int:shape default(nodes)/1(clusters):0;
+Set number of peripheries used in polygonal shapes and cluster
+boundaries. Note that
+<A HREF=shapes.html#epsf>user-defined shapes</A> are treated as a
+form of box shape, so the default
+peripheries value is 1 and the user-defined shape will be drawn in
+a bounding rectangle. Setting <TT>peripheries=0</TT> will turn this off.
+Also, 1 is the maximum peripheries value for clusters.
+:pin:N:bool:false;   neato,fdp
+If true and the node has a pos attribute on input, neato or fdp prevents the
+node from moving from the input position. This property can also be specified
+in the pos attribute itself (cf. the <A HREF=#k:point>point</A> type).
+<P>
+<B>Note:</B> Due to an artifact of the implementation, 
+previous to 27 Feb 2014, final coordinates
+are translated to the origin. Thus, if you look at the output coordinates
+given in the (x)dot or plain format, pinned nodes will not have the same
+output coordinates as were given on input. If this is important, a
+simple workaround is to maintain the coordinates of a pinned node. The vector
+difference between the old and new coordinates will give the translation,
+which can then be subtracted from all of the appropriate coordinates.
+<P>
+After 27 Feb 2014, this translation can be avoided in neato by setting the 
+<A HREF="#d:notranslate">notranslate</A> to TRUE. However, if the graph
+specifies <A HREF="#d:overlap">node overlap removal</A> or a change in 
+<A HREF="#d:ratio">aspect ratio</A>, node coordinates may still change. 
+:pos:EN:point/splineType;
+Position of node, or spline control points.
+For nodes, the position indicates the center of the node.
+On output, the coordinates are in <A HREF=#points>points</A>.
+<P>
+In neato and fdp, pos can be used to set the initial position of a node.
+By default, the coordinates are assumed to be in inches. However, the
+<A HREF=command.html#d:s>-s</A> command line flag can be used to specify
+different units. As the output coordinates are in points, 
+feeding the output of a graph laid out by a Graphviz program into
+neato or fdp will almost always require the -s flag.
+<P>
+When the <A HREF=command.html#d:n>-n</A> command line flag is used with
+neato, it is assumed the positions have been set by one of the layout
+programs, and are therefore in points. Thus, <TT>neato -n</TT> can accept
+input correctly without requiring a <TT>-s</TT> flag and, in fact,
+ignores any such flag.
+:quadtree:G:quadType/bool:normal;  sfdp
+Quadtree scheme to use.
+<P>
+A TRUE bool value corresponds to "normal";
+a FALSE bool value corresponds to "none".
+As a slight exception to the normal interpretation of bool,
+a value of "2" corresponds to "fast".
+:quantum:G:double:0.0:0.0;
+If <B>quantum</B> > 0.0, node label dimensions
+will be rounded to integral multiples of the quantum.
+:rank:S:rankType:; dot
+Rank constraints on the nodes in a subgraph.
+If <B>rank</B>="same", all nodes are placed on the same rank.
+If <B>rank</B>="min", all nodes are placed on the minimum rank.
+If <B>rank</B>="source", all nodes are placed on the minimum rank, and
+the only nodes on the minimum rank belong to some subgraph whose
+rank attribute is "source" or "min".
+Analogous criteria hold for <B>rank</B>="max" and <B>rank</B>="sink".
+(Note: the
+minimum rank is topmost or leftmost, and the maximum rank is bottommost
+or rightmost.)
+:rankdir:G:rankdir:TB; dot
+Sets direction of graph layout. For example, if <B>rankdir</B>="LR",
+and barring cycles, an edge <CODE>T -> H;</CODE> will go
+from left to right. By default, graphs are laid out from top to bottom.
+<P>
+This attribute also has a side-effect in determining how record nodes
+are interpreted. See <A HREF="shapes.html#record">record shapes</A>.
+:ranksep:G:double/doubleList:0.5(dot)/1.0(twopi):0.02;   dot,twopi
+In dot, this gives the desired rank separation, in inches. This is
+the minimum vertical distance between the bottom of the nodes in one
+rank and the tops of nodes in the next. If the value
+contains "equally", the centers of all ranks are spaced equally apart.
+Note that both
+settings are possible, e.g., ranksep = "1.2 equally".
+<P>
+In twopi, this attribute specifies the radial separation of concentric circles.
+For twopi, <TT>ranksep</TT> can also be a list of doubles. The first double specifies
+the radius of the inner circle; the second double specifies the increase in
+radius from the first circle to the second; etc. If there are more circles than
+numbers, the last number is used as the increment for the remainder.
+:ratio:G:double/string;
+Sets the aspect ratio (drawing height/drawing width) for the drawing.
+Note that this is adjusted before
+the <A HREF=#d:size><B>size</B></A> attribute constraints are enforced.
+In addition, the calculations usually ignore the node sizes, so the
+final drawing size may only approximate what is desired.
+<P>
+If <B>ratio</B> is numeric, it is taken as the desired aspect ratio.
+Then, if the actual aspect ratio is less than the desired ratio,
+the drawing height is scaled up to achieve the
+desired ratio; if the actual ratio is greater than that desired ratio,
+the drawing width is scaled up.
+<P>
+If <B>ratio</B> = "fill" and the <A HREF=#d:size><B>size</B></A>
+attribute is set, node positions are scaled, separately in both x
+and y, so that the final drawing exactly fills the specified size.
+If both <A HREF=#d:size><B>size</B></A> values exceed the width
+and height of the drawing, then both coordinate values of each
+node are scaled up accordingly. However, if either size dimension
+is smaller than the corresponding dimension in the drawing, one
+dimension is scaled up so that the final drawing has the same aspect
+ratio as specified by <A HREF=#d:size><B>size</B></A>. 
+Then, when rendered, the layout will be
+scaled down uniformly in both dimensions to fit the given
+<A HREF=#d:size><B>size</B></A>, which may cause nodes and text
+to shrink as well. This may not be what the user
+wants, but it avoids the hard problem of how to reposition the
+nodes in an acceptable fashion to reduce the drawing size.
+<P>
+If <B>ratio</B> = "compress" and the <A HREF=#d:size><B>size</B></A>
+attribute is set, dot attempts to compress the initial layout to fit
+in the given size. This achieves a tighter packing of nodes but
+reduces the balance and symmetry. This feature only works in dot.
+<P>
+If <B>ratio</B> = "expand", the <A HREF=#d:size><B>size</B></A>
+attribute is set, and both the width and the height of the graph are
+less than the value in  <A HREF=#d:size><B>size</B></A>, node positions are scaled
+uniformly until at least
+one dimension fits <A HREF=#d:size><B>size</B></A> exactly.
+Note that this is distinct from using <A HREF=#d:size><B>size</B></A> as the
+desired size, as here the drawing is expanded before edges are generated and
+all node and text sizes remain unchanged.
+<P>
+If <B>ratio</B> = "auto", the <A HREF=#d:page><B>page</B></A>
+attribute is set and the graph cannot be drawn on a single page,
+then <A HREF=#d:size><B>size</B></A> is set to an ``ideal'' value.
+In particular, the size in a given dimension will be the smallest integral
+multiple of the page size in that dimension which is at least half the
+current size. The two dimensions are then scaled independently to the
+new size. This feature only works in dot.
+:rects:N:rect; write
+Rectangles for fields of records, <A HREF=#points>in points</A>.
+:regular:N:bool:false;
+If true, force polygon to be regular, i.e., the vertices of the
+polygon will lie on a circle whose center is the center of the node.
+:remincross:G:bool:true;  dot
+If true and there are multiple clusters, run crossing
+minimization a second time.
+:repulsiveforce:G:double:1.0:0.0;  sfdp
+The power of the repulsive force used in an extended Fruchterman-Reingold 
+force directed model. Values larger than 1 tend to reduce 
+the warping effect at the expense of less clustering.
+:resolution:G:double:96.0/0.0;  bitmap output,svg
+This is a synonym for the <A HREF=#d:dpi>dpi</A> attribute.
+:root:GN:string/bool:<none>(graphs)/false(nodes);  twopi,circo
+This specifies nodes to be used as the center of the
+layout and the root of the generated spanning tree. As a graph attribute,
+this gives the name of the node. As a node attribute, it
+specifies that the node should be used as a central node. In twopi,
+this will actually be the central node. In circo, the block containing
+the node will be central in the drawing of its connected component.
+If not defined,
+twopi will pick a most central node, and circo will pick a random node.
+<P>
+If the root attribute is defined as the empty string, twopi will reset it
+to name of the node picked as the root node.
+<P>
+For twopi, it is possible to have multiple roots, presumably one for each
+component. If more than one node in a component is marked as the root, twopi
+will pick one.
+:rotate:G:int:0;
+If 90, set drawing orientation to landscape.
+:rotation:G:double:0;   sfdp
+Causes the final layout to be rotated counter-clockwise by the specified number of degrees.
+:samehead:E:string:"";  dot
+Edges with the same head and the same <B>samehead</B> value are aimed
+at the same point on the head. This has no effect on loops.
+Each node can have at most 5 unique samehead values.
+See <A HREF=#h:undir_note>limitation</A>.
+:sametail:E:string:"";  dot
+Edges with the same tail and the same <B>sametail</B> value are aimed
+at the same point on the tail. This has no effect on loops.
+Each node can have at most 5 unique sametail values.
+See <A HREF=#h:undir_note>limitation</A>.
+:samplepoints:N:int:8(output)/20(overlap and image maps);
+If the input graph defines the <A HREF=#d:vertices><B>vertices</B></A>
+attribute, and output is dot or xdot, this gives
+the number of points used for a node whose shape is a circle or ellipse.
+It plays the same role in neato, when adjusting the layout to avoid
+overlapping nodes, and in image maps.
+:scale:G:double/point;  notdot
+If set, after the initial layout, the layout is scaled by the given factors.
+If only a single number is given, this is used for both factors.
+:searchsize:G:int:30; dot
+During network simplex, maximum number of edges with negative cut values
+to search when looking for one with minimum cut value.
+:sep:G:addDouble/addPoint:+4; notdot
+Specifies margin to leave around nodes when removing node overlap.
+This guarantees a minimal non-zero distance between nodes.
+<P>
+If the attribute begins with a plus sign '+', an additive margin is
+specified. That is, "+w,h" causes the node's bounding box to be increased 
+by w
+points on the left and right sides, and by h points on the top and bottom.
+Without a plus sign, the node is scaled by 1 + w in the x coordinate
+and 1 + h in the y coordinate.
+<P>
+If only a single number is given, this is used for both dimensions.
+<P>
+If unset but <A HREF=#d:esep>esep</A> is defined, the <tt>sep</tt> values
+will be set to the <tt>esep</tt> values divided by <tt>0.8</tt>. 
+If <tt>esep</tt> is unset, the default value is used.
+:shape:N:shape:ellipse;
+Set the shape of a node.
+:shapefile:N:string:"";
+(Deprecated) If defined, shapefile specifies a file containing user-supplied node content.
+The <A HREF=#d:shape><B>shape</B></A> of the node is set to box.
+The image in the shapefile must be
+rectangular. The image formats supported as well as the precise semantics of
+how the file is used depends on the
+<A HREF="output.html">output format</A>.  For further details, see
+<A HREF=output.html#d:image_fmts>Image Formats</A> and
+<A HREF="../../../faq/#ext_image">External PostScript files</A>.
+<P>
+There is one exception to this usage.
+If <B>shape</B> is set to "epsf", shapefile gives
+a filename containing a definition of the node in PostScript.
+The graphics defined must be contain all of the
+node content, including any desired boundaries.
+For further details, see
+<A HREF="../../../faq/#ext_ps_file">
+External PostScript files</A>.
+:showboxes:ENG:int:0:0; dot
+Print guide boxes in PostScript at the beginning of
+routesplines if 1, or at the end if 2. (Debugging, TB mode only!)
+:sides:N:int:4:0;
+Number of sides if <A HREF=#d:shape><B>shape</B></A>=polygon.
+:size:G:double/point;
+Maximum width and height of drawing, in inches.
+If only a single number is given, this is used for both the width
+and the height.
+<P>
+If defined and the drawing is larger than the given size, 
+the drawing is uniformly
+scaled down so that it fits within the given size.
+<P>
+If <TT>size</TT> ends in an exclamation point (<TT>!</TT>),
+then it is taken to be
+the desired size. In this case, if both dimensions of the drawing are
+less than <TT>size</TT>, the drawing is scaled up uniformly until at
+least one dimension equals its dimension in <TT>size</TT>.
+<P>
+Note that there is some interaction between the <B>size</B> and
+<A HREF=#d:ratio><B>ratio</B></A> attributes.
+:skew:N:double:0.0:-100.0;
+Skew factor for <A HREF=#d:shape><B>shape</B></A>=polygon. Positive values
+skew top of polygon to right; negative to left.
+:smoothing:G:smoothType:"none";  sfdp
+Specifies a post-processing step used to smooth out an uneven distribution 
+of nodes.
+:sortv:GCN:int:0:0;
+If <A HREF="#d:packmode">packmode</A> indicates an array packing, 
+this attribute specifies an
+insertion order among the components, with smaller values inserted first.
+:splines:G:bool/string;
+Controls how, and if, edges are represented. If true, edges are drawn as
+splines routed around nodes; if false, edges are drawn as line segments.
+If set to <tt>none</tt> or "", no edges are drawn at all.
+<P>
+(1 March 2007) The values <TT>line</TT> and <TT>spline</TT> can be
+used as synonyms for <TT>false</TT> and <TT>true</TT>, respectively.
+In addition, the value <TT>polyline</TT> specifies that edges should be
+drawn as polylines.
+<P>
+(28 Sep 2010) The value <TT>ortho</TT> specifies edges should be
+routed as polylines of axis-aligned segments. Currently, the routing
+does not handle ports or, in dot, edge labels.
+<P>
+(25 Sep 2012) The value <TT>curved</TT> specifies edges should be
+drawn as curved arcs.
+<P>
+<TABLE>
+<TR>
+     <TD><IMG WIDTH="200" VSPACE="10" HSPACE="10" SRC="spline_none.png">
+    <TD><IMG WIDTH="200" VSPACE="10" HSPACE="10" SRC="spline_line.png">
+</TR>
+<TR>
+    <TD ALIGN="center">splines=none<BR>splines=""
+    <TD ALIGN="center">splines=line<BR>splines=false
+</TR>
+<TR>
+    <TD><IMG WIDTH="200" VSPACE="10" HSPACE="10" SRC="spline_polyline.png">
+    <TD><IMG WIDTH="200" VSPACE="10" HSPACE="10" SRC="spline_curved.png">
+</TR>
+<TR>
+    <TD ALIGN="center">splines=polyline
+    <TD ALIGN="center">splines=curved
+</TR>
+<TR>
+    <TD><IMG WIDTH="200" VSPACE="10" HSPACE="10" SRC="spline_ortho.png">
+    <TD><IMG WIDTH="200" VSPACE="10" HSPACE="10" SRC="spline_spline.png">
+</TR>
+<TR>
+    <TD ALIGN="center">splines=ortho
+    <TD ALIGN="center">splines=spline<BR>splines=true
+</TR>
+</TABLE>
+
+<P>
+By default, the attribute is unset. How this is interpreted depends on
+the layout. For dot, the default is to draw edges as splines. For all
+other layouts, the default is to draw edges as line segments. Note that
+for these latter layouts, if <TT>splines="true"</TT>, this
+requires non-overlapping nodes (cf. <A HREF=#d:overlap><B>overlap</B></A>).
+If fdp is used for layout and <TT>splines="compound"</TT>, then the edges are
+drawn to avoid clusters as well as nodes.
+:start:G:startType:""; neato,fdp
+Parameter used to determine the initial layout of nodes. If unset, the
+nodes are randomly placed in a unit square with
+the same seed is always used for the random number generator, so the
+initial placement is repeatable.
+:style:ENCG:style:"";
+Set style information for components of the graph. For cluster subgraphs, if <TT>style="filled"</TT>, the
+cluster box's background is filled.
+<P>
+If the default style attribute has been set for a component, an individual component can use
+<TT>style=""</TT> to revert to the normal default. For example, if the graph has
+<P>
+<TT>edge [style="invis"]</TT>
+<P>
+making all edges invisible, a specific edge can overrride this via:
+<P>
+<TT>a -> b [style=""]</TT>
+<P>
+Of course, the component can also explicitly set its <TT>style</TT> attribute to the desired value.
+:stylesheet:G:string:"";  svg
+A URL or pathname specifying an XML style sheet, used in SVG output. Combine
+with <a href="#d:class">class</a> to style elements using CSS selectors.
+:tailURL:E:escString:""; map,svg
+If <B>tailURL</B> is defined, it is
+output as part of the tail label of the edge.
+Also, this value is used near the tail node, overriding any
+<A HREF=#d:URL>URL</A> value.
+See <A HREF=#h:undir_note>limitation</A>.
+:tailclip:E:bool:true;
+If true, the tail of an edge is clipped to the boundary of the tail node;
+otherwise, the end of the edge goes to the center of the node, or the
+center of a port, if applicable.
+:tailhref:E:escString:"";  map,svg
+Synonym for <A HREF=#d:tailURL>tailURL</A>.
+:taillabel:E:lblString:"";
+Text label to be placed near tail of edge.
+See <A HREF=#h:undir_note>limitation</A>.
+:tailport:E:portPos:center;
+Indicates where on the tail node to attach the tail of the edge.
+See <A HREF=#h:undir_note>limitation</A>.
+:tail_lp:E:point; write
+Position of an edge's tail label, <A HREF=#points>in points</A>.
+The position indicates the center of the label.
+:tailtarget:E:escString:<none>;   map,svg
+If the edge has a <A HREF=#d:tailURL>tailURL</A>,
+this attribute determines which window of the
+browser is used
+for the URL. Setting it to "_graphviz" will open a new window if it
+doesn't already exist, or reuse it if it does.
+If undefined, the value of the <A HREF=#d:target>target</A> is used.
+:tailtooltip:E:escString:"";    cmap,svg
+Tooltip annotation attached to the tail of an edge. This is used only
+if the edge has a <A HREF=#d:tailURL>tailURL</A> attribute.
+:target:ENGC:escString/string:<none>;   map,svg
+If the object has a URL, this attribute determines which window
+of the browser is used for the URL.
+See <A HREF="http://www.w3.org/TR/html401/present/frames.html#adef-target">W3C documentation</A>.
+:tooltip:NEC:escString:"";    cmap,svg
+Tooltip annotation attached to the node or edge. If unset, Graphviz
+will use the object's <A HREF=#d:label>label</A> if defined.
+Note that if the label is a record specification or an HTML-like
+label, the resulting tooltip may be unhelpful. In this case, if
+tooltips will be generated, the user should set a <TT>tooltip</TT>
+attribute explicitly.
+#toplabel:N:string:"";
+#  Additional label near top of nodes of shape M*.
+:truecolor:G:bool:;  bitmap output
+If set explicitly to true or false, the value determines whether or not
+internal bitmap rendering relies on a truecolor color model or uses
+a color palette.
+If the attribute is unset, truecolor is not used
+unless there is a <A HREF=#d:shapefile>shapefile</A> property
+for some node in the graph.
+The output model will use the input model when possible.
+<P>
+Use of color palettes results in less memory usage during creation of the
+bitmaps and smaller output files.
+<P>
+Usually, the only time it is necessary to specify the truecolor model
+is if the graph uses more than 256 colors.
+However, if one uses <A HREF=#d:bgcolor>bgcolor</A>=transparent with
+a color palette, font
+antialiasing can show up as a fuzzy white area around characters.
+Using <B>truecolor</B>=true avoids this problem.
+:xdotversion:G:string:;   xdot
+For xdot output, if this attribute is set, this determines the version of xdot used in output.
+If not set, the attribute will be set to the xdot version used for output.
+:vertices:N:pointList; write
+If the input graph defines this attribute, the node is polygonal,
+and output is dot or xdot, this attribute provides the
+coordinates of the vertices of the node's polygon, in inches.
+If the node is an ellipse or circle, the
+<A HREF=#d:samplepoints>samplepoints</A> attribute affects
+the output.
+:viewport:G:viewPort:"";
+Clipping window on final drawing. Note that this attribute supersedes any
+<A HREF="#d:size">size</A> attribute. The width and height of the viewport specify
+precisely the final size of the output. 
+:voro_margin:G:double:0.05:0.0; notdot
+Factor to scale up drawing to allow margin for expansion in
+Voronoi technique. dim' = (1+2*margin)*dim.
+#voro_pmargin:G:double; neato
+#  Obsolete, replaced by sep
+#w:E:double:1.0; neato
+#  Redundant definition of weight in neato, cf. bug 9.
+:weight:E:int/double:1:0(dot,twopi)/1(neato,fdp);
+Weight of edge. In dot, the heavier the weight, the shorter,
+straighter and more vertical the edge is.
+<B>N.B.</B> Weights in dot must be integers.
+For twopi, a weight of 0 indicates the edge should not be used in constructing a
+spanning tree from the root.
+For other layouts, a larger weight encourages the layout to 
+make the edge length closer to that specified by the 
+<A HREF=#d:len>len</A> attribute.
+:width:N:double:0.75:0.01;
+Width of node, in inches. This is taken as the initial, minimum width
+of the node. If <A HREF=#d:fixedsize><B>fixedsize</B></A> is true, this
+will be the final width of the node. Otherwise, if the node label
+requires more width to fit, the node's width will be increased to
+contain the label. Note also that, if the output format is dot, the
+value given to <B>width</B> will be the final value.
+<P>
+If the node shape is regular, the width and height are made identical.
+In this case, if either the width or the height is set explicitly,
+that value is used.
+In this case, if both the width or the height are set explicitly,
+the maximum of the two values is used.
+If neither is set explicitly, the minimum of the two default values
+is used.
+:xlabel:EN:lblString:"";
+External label for a node or edge. For nodes, the label will be placed outside of the
+node but near it. For edges, the label will be placed near the center of the edge.
+This can be useful in dot to avoid the occasional problem when the use of edge labels
+distorts the layout. For other layouts, the xlabel attribute can be viewed as a synonym
+for the <A HREF=#d:label><B>label</B></A> attribute.
+<P>
+These labels are added after all nodes and edges have been placed. The labels will be placed
+so that they do not overlap any node or label. This means it may not be possible to place all
+of them. To force placing all of them, use the  <A HREF=#d:forcelabels><B>forcelabels</B></A> attribute.
+:xlp:NE:point; write
+Position of an exterior label, <A HREF=#points>in points</A>.
+The position indicates the center of the label.
+:z:N:double:0.0:-MAXFLOAT/-1000;
+<B>Deprecated:</B>Use <A HREF=#d:pos><B>pos</B></A> attribute, along
+with <A HREF=#d:dimen><B>dimen</B></A> and/or <A HREF=#d:dim><B>dim</B></A>
+to specify dimensions.
+<P>
+Provides z coordinate value for 3D layouts and displays. If the
+graph has <A HREF=#d:dim><B>dim</B></A> set to 3 (or more),
+neato will use a node's <B>z</B> value
+for the z coordinate of its initial position if
+its <A HREF=#d:pos><B>pos</B></A> attribute is also defined.
+<P>
+Even if no <B>z</B> values are specified in the input, it is necessary to
+declare a <B>z</B> attribute for nodes, e.g, using <TT>node[z=""]</TT>
+in order to get z values on output.
+Thus, setting <TT>dim=3</TT> but not declaring <B>z</B> will
+cause <TT>neato -Tvrml</TT> to
+layout the graph in 3D but project the layout onto the xy-plane
+for the rendering. If the <B>z</B> attribute is declared, the final rendering
+will be in 3D.

+ 573 - 0
graphviz.mod/graphviz/cmd/gvedit/csettings.cpp

@@ -0,0 +1,573 @@
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: Details at https://graphviz.org
+ *************************************************************************/
+#ifdef _WIN32
+#include "windows.h"
+#endif
+#include "csettings.h"
+#include "mainwindow.h"
+#include "mdichild.h"
+#include "qfiledialog.h"
+#include "qmessagebox.h"
+#include "string.h"
+#include <QTemporaryFile>
+#include <QtWidgets>
+#include <cassert>
+#include <cgraph/rdr.h>
+#include <cstdint>
+#include <qfile.h>
+#include <string>
+#include <vector>
+
+#ifdef __APPLE__
+#include <mach-o/dyld.h>
+#endif
+
+#ifdef __FreeBSD__
+#include <sys/sysctl.h>
+#include <sys/types.h>
+#endif
+
+#if !defined(_WIN32)
+#include <unistd.h>
+#endif
+
+extern int errorPipe(char *errMsg);
+
+#define WIDGET(t, f) (findChild<t *>(QStringLiteral(#f)))
+
+#ifndef _WIN32
+/// `readlink`-alike but dynamically allocates
+static std::string readln(const std::string &pathname) {
+
+  std::vector<char> buf(512, '\0');
+
+  while (true) {
+
+    // expand target buffer
+    buf.resize(buf.size() * 2);
+
+    // attempt to resolve
+    {
+      ssize_t written = readlink(pathname.c_str(), buf.data(), buf.size());
+      if (written < 0)
+        break;
+      if (static_cast<size_t>(written) < buf.size()) {
+        // success
+        buf[written] = '\0';
+        return buf.data();
+      }
+    }
+  }
+
+  // failed
+  return "";
+}
+#endif
+
+/// find an absolute path to the current executable
+static std::string find_me(void) {
+
+  // macOS
+#ifdef __APPLE__
+  {
+    // determine how many bytes we will need to allocate
+    uint32_t buf_size = 0;
+    int rc = _NSGetExecutablePath(NULL, &buf_size);
+    assert(rc != 0);
+    assert(buf_size > 0);
+
+    std::vector<char> pathname(buf_size);
+
+    // retrieve the actual path
+    if (_NSGetExecutablePath(pathname.data(), &buf_size) < 0) {
+      errout << "failed to get path for executable.\n";
+      return "";
+    }
+
+    // try to resolve any levels of symlinks if possible
+    for (std::string p = pathname.data();;) {
+      const std::string buf = readln(p);
+      if (buf == "")
+        return p;
+
+      p = buf;
+    }
+  }
+#elif defined(_WIN32)
+  {
+    std::vector<char> pathname;
+    DWORD rc = 0;
+
+    do {
+      {
+        size_t size = pathname.empty() ? 1024 : (pathname.size() * 2);
+        pathname.resize(size);
+      }
+
+      rc = GetModuleFileNameA(NULL, pathname.data(), pathname.size());
+      if (rc == 0) {
+        errout << "failed to get path for executable.\n";
+        return "";
+      }
+
+    } while (rc == pathname.size());
+
+    return pathname.data();
+  }
+#else
+
+  // Linux
+  std::string pathname = readln("/proc/self/exe");
+  if (pathname != "")
+    return pathname;
+
+  // DragonFly BSD, FreeBSD
+  pathname = readln("/proc/curproc/file");
+  if (pathname != "")
+    return pathname;
+
+  // NetBSD
+  pathname = readln("/proc/curproc/exe");
+  if (pathname != "")
+    return pathname;
+
+// /proc-less FreeBSD
+#ifdef __FreeBSD__
+  {
+    int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1};
+    static const size_t MIB_LENGTH = sizeof(mib) / sizeof(mib[0]);
+
+    do {
+      // determine how long the path is
+      size_t buf_size = 0;
+      if (sysctl(mib, MIB_LENGTH, NULL, &buf_size, NULL, 0) < 0)
+        break;
+      assert(buf_size > 0);
+
+      // make enough space for the target path
+      std::vector<char> buf(buf_size, '\0');
+
+      // resolve it
+      if (sysctl(mib, MIB_LENGTH, buf.data(), &buf_size, NULL, 0) == 0)
+        return buf.data();
+    } while (0);
+  }
+#endif
+#endif
+
+  errout << "failed to get path for executable.\n";
+  return "";
+}
+
+/// find an absolute path to where Smyrna auxiliary files are stored
+static std::string find_share(void) {
+
+#ifdef _WIN32
+  const char PATH_SEPARATOR = '\\';
+#else
+  const char PATH_SEPARATOR = '/';
+#endif
+
+  // find the path to the `gvedit` binary
+  std::string gvedit_exe = find_me();
+  if (gvedit_exe == "")
+    return "";
+
+  // assume it is of the form …/bin/gvedit[.exe] and construct
+  // …/share/graphviz/gvedit
+
+  size_t slash = gvedit_exe.rfind(PATH_SEPARATOR);
+  if (slash == std::string::npos) {
+    errout << "no path separator in path to self, " << gvedit_exe.c_str()
+           << '\n';
+    return "";
+  }
+
+  std::string bin = gvedit_exe.substr(0, slash);
+  slash = bin.rfind(PATH_SEPARATOR);
+  if (slash == std::string::npos) {
+    errout << "no path separator in directory containing self, " << bin.c_str()
+           << '\n';
+    return "";
+  }
+
+  std::string install_prefix = bin.substr(0, slash);
+
+  return install_prefix + PATH_SEPARATOR + "share" + PATH_SEPARATOR +
+         "graphviz" + PATH_SEPARATOR + "gvedit";
+}
+
+bool loadAttrs(const QString &fileName, QComboBox *cbNameG, QComboBox *cbNameN,
+               QComboBox *cbNameE) {
+  QFile file(fileName);
+  if (file.open(QIODevice::ReadOnly)) {
+    QTextStream stream(&file);
+    QString line;
+    while (!stream.atEnd()) {
+      line = stream.readLine(); // line of text excluding '\n'
+      if (line.left(1) == QLatin1String(":")) {
+        QString attrName;
+        QStringList sl = line.split(u':');
+        for (int id = 0; id < sl.count(); id++) {
+          if (id == 1)
+            attrName = sl[id];
+          if (id == 2) {
+            if (sl[id].contains(u'G'))
+              cbNameG->addItem(attrName);
+            if (sl[id].contains(u'N'))
+              cbNameN->addItem(attrName);
+            if (sl[id].contains(u'E'))
+              cbNameE->addItem(attrName);
+          }
+        }
+      }
+    }
+  } else {
+    errout << "Could not open attribute name file \"" << fileName
+           << "\" for reading\n";
+    errout.flush();
+    return true;
+  }
+
+  return false;
+}
+
+QString stripFileExtension(const QString &fileName) {
+  // `lastIndexOf` returns -1 if not found and `left` takes a negative number to
+  // mean “the entire string”, so this is a no-op if the filename has no
+  // extension
+  return fileName.left(fileName.lastIndexOf(u'.', fileName.size() - 1));
+}
+
+CFrmSettings::CFrmSettings() {
+  this->gvc = gvContext();
+  Ui_Dialog tempDia;
+  tempDia.setupUi(this);
+  graph = nullptr;
+  activeWindow = nullptr;
+  QString pathname;
+  char *s = nullptr;
+#ifndef _WIN32
+  s = getenv("GVEDIT_PATH");
+#endif
+  if (s)
+    pathname = QString::fromUtf8(s);
+  else
+    pathname = QString::fromStdString(find_share());
+
+  connect(WIDGET(QPushButton, pbAdd), &QPushButton::clicked, this,
+          &CFrmSettings::addSlot);
+  connect(WIDGET(QPushButton, pbNew), &QPushButton::clicked, this,
+          &CFrmSettings::newSlot);
+  connect(WIDGET(QPushButton, pbOpen), &QPushButton::clicked, this,
+          &CFrmSettings::openSlot);
+  connect(WIDGET(QPushButton, pbSave), &QPushButton::clicked, this,
+          &CFrmSettings::saveSlot);
+  connect(WIDGET(QPushButton, btnOK), &QPushButton::clicked, this,
+          &CFrmSettings::okSlot);
+  connect(WIDGET(QPushButton, btnCancel), &QPushButton::clicked, this,
+          &CFrmSettings::cancelSlot);
+  connect(WIDGET(QPushButton, pbOut), &QPushButton::clicked, this,
+          &CFrmSettings::outputSlot);
+  connect(WIDGET(QPushButton, pbHelp), &QPushButton::clicked, this,
+          &CFrmSettings::helpSlot);
+
+  connect(WIDGET(QComboBox, cbScope),
+          QOverload<int>::of(&QComboBox::currentIndexChanged), this,
+          &CFrmSettings::scopeChangedSlot);
+  scopeChangedSlot(0);
+
+  if (!pathname.isEmpty()) {
+    loadAttrs(pathname + QLatin1String("/attrs.txt"),
+              WIDGET(QComboBox, cbNameG), WIDGET(QComboBox, cbNameN),
+              WIDGET(QComboBox, cbNameE));
+  }
+  setWindowIcon(QIcon(QStringLiteral(":/images/icon.png")));
+}
+
+void CFrmSettings::outputSlot() {
+  QString _filter = QStringLiteral("Output File(*.%1)")
+                        .arg(WIDGET(QComboBox, cbExtension)->currentText());
+  QString fileName = QFileDialog::getSaveFileName(this, tr("Save Graph As.."),
+                                                  QStringLiteral("/"), _filter);
+  if (!fileName.isEmpty())
+    WIDGET(QLineEdit, leOutput)->setText(fileName);
+}
+
+void CFrmSettings::scopeChangedSlot(int id) {
+  WIDGET(QComboBox, cbNameG)->setVisible(id == 0);
+  WIDGET(QComboBox, cbNameN)->setVisible(id == 1);
+  WIDGET(QComboBox, cbNameE)->setVisible(id == 2);
+}
+
+void CFrmSettings::addSlot() {
+  QString _scope = WIDGET(QComboBox, cbScope)->currentText();
+  QString _name;
+  switch (WIDGET(QComboBox, cbScope)->currentIndex()) {
+  case 0:
+    _name = WIDGET(QComboBox, cbNameG)->currentText();
+    break;
+  case 1:
+    _name = WIDGET(QComboBox, cbNameN)->currentText();
+    break;
+  case 2:
+    _name = WIDGET(QComboBox, cbNameE)->currentText();
+    break;
+  }
+  QString _value = WIDGET(QLineEdit, leValue)->text();
+
+  if (_value.trimmed().isEmpty())
+    QMessageBox::warning(this, tr("GvEdit"),
+                         tr("Please enter a value for selected attribute!"),
+                         QMessageBox::Ok, QMessageBox::Ok);
+  else {
+    QString str = _scope + QLatin1Char(u'[') + _name + QLatin1String("=\"");
+    if (WIDGET(QTextEdit, teAttributes)->toPlainText().contains(str)) {
+      QMessageBox::warning(this, tr("GvEdit"),
+                           tr("Attribute is already defined!"), QMessageBox::Ok,
+                           QMessageBox::Ok);
+      return;
+    }
+    str = str + _value + QLatin1String("\"]");
+    WIDGET(QTextEdit, teAttributes)
+        ->setPlainText(WIDGET(QTextEdit, teAttributes)->toPlainText() + str +
+                       QLatin1Char('\n'));
+  }
+}
+
+void CFrmSettings::helpSlot() {
+  QDesktopServices::openUrl(
+      QUrl(QStringLiteral("http://www.graphviz.org/doc/info/attrs.html")));
+}
+
+void CFrmSettings::cancelSlot() { this->reject(); }
+
+void CFrmSettings::okSlot() {
+  saveContent();
+  this->done(drawGraph());
+}
+
+void CFrmSettings::newSlot() {
+  WIDGET(QTextEdit, teAttributes)->setPlainText(tr(""));
+}
+
+void CFrmSettings::openSlot() {
+  QString fileName = QFileDialog::getOpenFileName(
+      this, tr("Open File"), QStringLiteral("/"), tr("Text file (*.*)"));
+  if (!fileName.isEmpty()) {
+    QFile file(fileName);
+    if (!file.open(QFile::ReadOnly | QFile::Text)) {
+      QMessageBox::warning(this, tr("MDI"),
+                           tr("Cannot read file %1:\n%2.")
+                               .arg(fileName)
+                               .arg(file.errorString()));
+      return;
+    }
+
+    QTextStream in(&file);
+    WIDGET(QTextEdit, teAttributes)->setPlainText(in.readAll());
+  }
+}
+
+void CFrmSettings::saveSlot() {
+
+  if (WIDGET(QTextEdit, teAttributes)->toPlainText().trimmed().isEmpty()) {
+    QMessageBox::warning(this, tr("GvEdit"), tr("Nothing to save!"),
+                         QMessageBox::Ok, QMessageBox::Ok);
+    return;
+  }
+
+  QString fileName = QFileDialog::getSaveFileName(
+      this, tr("Open File"), QStringLiteral("/"), tr("Text File(*.*)"));
+  if (!fileName.isEmpty()) {
+
+    QFile file(fileName);
+    if (!file.open(QFile::WriteOnly | QFile::Text)) {
+      QMessageBox::warning(this, tr("MDI"),
+                           tr("Cannot write file %1:\n%2.")
+                               .arg(fileName)
+                               .arg(file.errorString()));
+      return;
+    }
+
+    QTextStream out(&file);
+    out << WIDGET(QTextEdit, teAttributes)->toPlainText();
+  }
+}
+
+bool CFrmSettings::loadGraph(MdiChild *m) {
+  if (graph) {
+    agclose(graph);
+    graph = nullptr;
+  }
+  graphData.clear();
+  graphData.append(m->toPlainText());
+  setActiveWindow(m);
+  return true;
+}
+
+bool CFrmSettings::createLayout() {
+  rdr_t rdr;
+  // first attach attributes to graph
+  int _pos = graphData.indexOf(tr("{"));
+  graphData.replace(_pos, 1,
+                    QLatin1Char('{') +
+                        WIDGET(QTextEdit, teAttributes)->toPlainText());
+
+  /* Reset line number and file name;
+   * If known, might want to use real name
+   */
+  agsetfile("<gvedit>");
+  QByteArray bytes = graphData.toUtf8();
+  rdr.data = bytes.constData();
+  rdr.len = strlen(rdr.data);
+  rdr.cur = 0;
+  graph = agmemread(rdr.data);
+  if (!graph)
+    return false;
+  if (agerrors()) {
+    agclose(graph);
+    graph = nullptr;
+    return false;
+  }
+  Agraph_t *G = this->graph;
+  QString layout;
+
+  layout = WIDGET(QComboBox, cbLayout)->currentText();
+
+  gvLayout(gvc, G, layout.toUtf8().constData()); /* library function */
+  return true;
+}
+
+static QString buildTempFile() {
+  QTemporaryFile tempFile;
+  tempFile.setAutoRemove(false);
+  tempFile.open();
+  QString a = tempFile.fileName();
+  return a;
+}
+
+void CFrmSettings::doPreview(const QString &fileName) {
+  if (getActiveWindow()->previewFrm != nullptr) {
+    getActiveWindow()->parentFrm->mdiArea->removeSubWindow(
+        getActiveWindow()->previewFrm->subWindowRef);
+    getActiveWindow()->previewFrm = nullptr;
+  }
+
+  if (fileName.isNull() ||
+      !getActiveWindow()->loadPreview(fileName)) { // create preview
+    QString prevFile(buildTempFile());
+    gvRenderFilename(gvc, graph, "png", prevFile.toUtf8().constData());
+    getActiveWindow()->loadPreview(prevFile);
+  }
+}
+
+bool CFrmSettings::renderLayout() {
+  if (!graph)
+    return false;
+  QString sfx = WIDGET(QComboBox, cbExtension)->currentText();
+  QString fileName(WIDGET(QLineEdit, leOutput)->text());
+
+  if (fileName.isEmpty() || sfx == QLatin1String("NONE"))
+    doPreview(QString());
+  else {
+    fileName = stripFileExtension(fileName);
+    fileName = fileName + QLatin1Char('.') + sfx;
+    if (fileName != activeWindow->outputFile)
+      activeWindow->outputFile = fileName;
+
+#ifdef _WIN32
+    if (!fileName.contains(u'/') && !fileName.contains(u'\\'))
+#else
+    if (!fileName.contains(u'/'))
+#endif
+    { // no directory info => can we create/write the file?
+      QFile outf(fileName);
+      if (!outf.open(QIODevice::WriteOnly)) {
+        QString pathName = QDir::homePath();
+        pathName.append(u'/').append(fileName);
+        fileName = QDir::toNativeSeparators(pathName);
+        const QString msg =
+            QStringLiteral("Output written to %1\n").arg(fileName);
+        errorPipe(msg.toLatin1().data());
+      }
+    }
+
+    if (gvRenderFilename(gvc, graph, sfx.toUtf8().constData(),
+                         fileName.toUtf8().constData()))
+      return false;
+
+    doPreview(fileName);
+  }
+  return true;
+}
+
+bool CFrmSettings::loadLayouts() { return false; }
+
+bool CFrmSettings::loadRenderers() { return false; }
+
+void CFrmSettings::refreshContent() {
+
+  WIDGET(QComboBox, cbLayout)->setCurrentIndex(activeWindow->layoutIdx);
+  WIDGET(QComboBox, cbExtension)->setCurrentIndex(activeWindow->renderIdx);
+  if (!activeWindow->outputFile.isEmpty())
+    WIDGET(QLineEdit, leOutput)->setText(activeWindow->outputFile);
+  else
+    WIDGET(QLineEdit, leOutput)
+        ->setText(stripFileExtension(activeWindow->currentFile()) +
+                  QLatin1Char('.') +
+                  WIDGET(QComboBox, cbExtension)->currentText());
+
+  WIDGET(QTextEdit, teAttributes)->setText(activeWindow->attributes);
+
+  WIDGET(QLineEdit, leValue)->clear();
+}
+
+void CFrmSettings::saveContent() {
+  activeWindow->layoutIdx = WIDGET(QComboBox, cbLayout)->currentIndex();
+  activeWindow->renderIdx = WIDGET(QComboBox, cbExtension)->currentIndex();
+  activeWindow->outputFile = WIDGET(QLineEdit, leOutput)->text();
+  activeWindow->attributes = WIDGET(QTextEdit, teAttributes)->toPlainText();
+}
+
+int CFrmSettings::drawGraph() {
+  if (createLayout() && renderLayout()) {
+    getActiveWindow()->settingsSet = false;
+  }
+  agreseterrors();
+
+  return QDialog::Accepted;
+}
+
+int CFrmSettings::runSettings(MdiChild *m) {
+  if (this->loadGraph(m))
+    return drawGraph();
+
+  if (m && m == getActiveWindow()) {
+    if (this->loadGraph(m))
+      return drawGraph();
+    return QDialog::Rejected;
+  }
+
+  return showSettings(m);
+}
+
+int CFrmSettings::showSettings(MdiChild *m) {
+
+  if (this->loadGraph(m)) {
+    refreshContent();
+    return this->exec();
+  }
+  return QDialog::Rejected;
+}
+
+void CFrmSettings::setActiveWindow(MdiChild *m) { this->activeWindow = m; }
+
+MdiChild *CFrmSettings::getActiveWindow() { return activeWindow; }

+ 65 - 0
graphviz.mod/graphviz/cmd/gvedit/csettings.h

@@ -0,0 +1,65 @@
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: Details at https://graphviz.org
+ *************************************************************************/
+
+#pragma once
+
+class MdiChild;
+#include <QDialog>
+#include <QString>
+#include "ui_settings.h"
+
+#include "config.h"
+
+#include <gvc/gvc.h>
+
+class CFrmSettings : public QDialog
+{
+        Q_OBJECT
+public:
+    CFrmSettings();
+    int runSettings(MdiChild* m);
+    int showSettings(MdiChild* m);
+    int drawGraph();
+    MdiChild* getActiveWindow();
+    QString graphData;
+    GVC_t* gvc;    
+private slots:
+    void outputSlot();
+    void addSlot();
+    void helpSlot();
+    void cancelSlot();
+    void okSlot();
+    void newSlot();
+    void openSlot();
+    void saveSlot();
+    void scopeChangedSlot(int);
+private:
+    //Actions
+    Agraph_t* graph;
+    MdiChild* activeWindow;
+    QAction* outputAct;
+    QAction* addAct;
+    QAction* helpAct;
+    QAction* cancelAct;
+    QAction* okAct;
+    QAction* newAct;
+    QAction* openAct;
+    QAction* saveAct;
+    //METHODS
+    bool loadLayouts();
+    bool loadRenderers();
+    void refreshContent();
+    void saveContent();
+    void doPreview(const QString &);
+    void setActiveWindow(MdiChild* m);
+    bool loadGraph(MdiChild* m);
+    bool createLayout();
+    bool renderLayout();
+};

+ 39 - 0
graphviz.mod/graphviz/cmd/gvedit/gvedit.1

@@ -0,0 +1,39 @@
+.TH GVEDIT 1 "4 April 2011"
+.SH NAME
+gvedit \- simple graph editor and viewer
+.SH SYNOPSIS
+.B gvedit
+[
+.B \-sv?
+]
+[
+.I file
+]
+.SH DESCRIPTION
+.B gvedit
+provides a simple graph editor and viewer. It allows many graphs to be viewed at the
+same time. The text of each graph is displayed in its own text window. 
+.P
+The name of a Graphviz file can be specified on the command line. This graph
+file will be automatically opened on start-up.
+.SH OPTIONS
+The following options are supported:
+.TP
+.B \-s
+By default, the layout algorithms that use initial positions given by a node's pos attribute
+(currently, fdp and neato) assume the coordinates are in inches. Frequently, the input graph
+has these in points, especially if the graph is output by a Graphviz layout algorithm. This flag
+can be used to scale the coordinates from points to inches.
+.TP
+.B \-v
+Verbose mode.
+.TP
+.B \-?
+Prints usage information and exit.
+.SH AUTHOR
+Arif Bilgin <[email protected]>
+.br
+Emden R. Gansner <[email protected]>
+.SH SEE ALSO
+.PP
+dot(1)

+ 24 - 0
graphviz.mod/graphviz/cmd/gvedit/gvedit.pro.in

@@ -0,0 +1,24 @@
+QT += core gui widgets
+
+LIBS += \
+        -L$(top_builddir)/lib/gvc/.libs -lgvc \
+        -L$(top_builddir)/lib/cgraph/.libs -lcgraph \
+        -L$(top_builddir)/lib/cdt/.libs -lcdt \
+        -lexpat -lz -lltdl
+
+INCLUDEPATH += \
+	../../lib/gvc \
+	../../lib/common \
+	../../lib/pathplan \
+	../../lib/cgraph \
+	../../lib/cdt \
+	../..
+
+CONFIG += qt
+win32-g++|win32-clang-g++ {
+	CONFIG -= debug_and_release
+}
+FORMS = @top_srcdir@/cmd/gvedit/ui/settings.ui
+HEADERS = @top_srcdir@/cmd/gvedit/mainwindow.h @top_srcdir@/cmd/gvedit/mdichild.h @top_srcdir@/cmd/gvedit/csettings.h @top_srcdir@/cmd/gvedit/imageviewer.h
+SOURCES = @top_srcdir@/cmd/gvedit/main.cpp @top_srcdir@/cmd/gvedit/mainwindow.cpp @top_srcdir@/cmd/gvedit/mdichild.cpp @top_srcdir@/cmd/gvedit/csettings.cpp @top_srcdir@/cmd/gvedit/imageviewer.cpp
+RESOURCES     = @top_srcdir@/cmd/gvedit/mdi.qrc

+ 6 - 0
graphviz.mod/graphviz/cmd/gvedit/images/Makefile.am

@@ -0,0 +1,6 @@
+## Process this file with automake to produce Makefile.in
+
+all:
+
+EXTRA_DIST = copy.png cut.png export.png icon.png new.png open.png \
+	paste.png run.png save.png save_as.png settings.png

+ 630 - 0
graphviz.mod/graphviz/cmd/gvedit/images/Makefile.in

@@ -0,0 +1,630 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = cmd/gvedit/images
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \
+	$(top_srcdir)/m4/ax_compare_version.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltargz.m4 \
+	$(top_srcdir)/m4/ltdl.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/./version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+ANN_CFLAGS = @ANN_CFLAGS@
+ANN_LIBS = @ANN_LIBS@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+CYGWIN = @CYGWIN@
+DARWIN = @DARWIN@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEVIL_INCLUDES = @DEVIL_INCLUDES@
+DEVIL_LIBS = @DEVIL_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+EXPAT_CFLAGS = @EXPAT_CFLAGS@
+EXPAT_LIBS = @EXPAT_LIBS@
+FGREP = @FGREP@
+FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@
+FREETYPE2_LIBS = @FREETYPE2_LIBS@
+GDIPLUS_CFLAGS = @GDIPLUS_CFLAGS@
+GDIPLUS_HEADS = @GDIPLUS_HEADS@
+GDIPLUS_LIBS = @GDIPLUS_LIBS@
+GDK_CFLAGS = @GDK_CFLAGS@
+GDK_LIBS = @GDK_LIBS@
+GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@
+GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@
+GDLIB_CFLAGS = @GDLIB_CFLAGS@
+GDLIB_CONFIG = @GDLIB_CONFIG@
+GDLIB_LIBS = @GDLIB_LIBS@
+GLADE_CFLAGS = @GLADE_CFLAGS@
+GLADE_LIBS = @GLADE_LIBS@
+GLUT_CFLAGS = @GLUT_CFLAGS@
+GLUT_LIBS = @GLUT_LIBS@
+GO = @GO@
+GO_INCLUDES = @GO_INCLUDES@
+GO_LIBS = @GO_LIBS@
+GRAPHVIZ_AUTHOR_EMAIL = @GRAPHVIZ_AUTHOR_EMAIL@
+GRAPHVIZ_AUTHOR_NAME = @GRAPHVIZ_AUTHOR_NAME@
+GRAPHVIZ_CHANGE_DATE = @GRAPHVIZ_CHANGE_DATE@
+GRAPHVIZ_VERSION_DATE = @GRAPHVIZ_VERSION_DATE@
+GRAPHVIZ_VERSION_MAJOR = @GRAPHVIZ_VERSION_MAJOR@
+GRAPHVIZ_VERSION_MICRO = @GRAPHVIZ_VERSION_MICRO@
+GRAPHVIZ_VERSION_MINOR = @GRAPHVIZ_VERSION_MINOR@
+GREP = @GREP@
+GROFF = @GROFF@
+GS_CFLAGS = @GS_CFLAGS@
+GS_LIBS = @GS_LIBS@
+GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@
+GTKGLEXT_LIBS = @GTKGLEXT_LIBS@
+GTKGL_CFLAGS = @GTKGL_CFLAGS@
+GTKGL_LIBS = @GTKGL_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+GTS_CFLAGS = @GTS_CFLAGS@
+GTS_LIBS = @GTS_LIBS@
+GUILE_CFLAGS = @GUILE_CFLAGS@
+GUILE_LIBS = @GUILE_LIBS@
+GVPLUGIN_CONFIG_FILE = @GVPLUGIN_CONFIG_FILE@
+GVPLUGIN_VERSION = @GVPLUGIN_VERSION@
+GVPLUGIN_VERSION_INFO = @GVPLUGIN_VERSION_INFO@
+HAVE_CXX17 = @HAVE_CXX17@
+INCLTDL = @INCLTDL@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTGOSIZE = @INTGOSIZE@
+IPSEPCOLA_INCLUDES = @IPSEPCOLA_INCLUDES@
+IPSEPCOLA_LIBS = @IPSEPCOLA_LIBS@
+JAVA = @JAVA@
+JAVASCRIPT = @JAVASCRIPT@
+JAVA_INCLUDES = @JAVA_INCLUDES@
+JAVA_LIBS = @JAVA_LIBS@
+JNI_EXTRA_LDFLAGS = @JNI_EXTRA_LDFLAGS@
+JSHEXT = @JSHEXT@
+LASI_CFLAGS = @LASI_CFLAGS@
+LASI_LIBS = @LASI_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBADD_DL = @LIBADD_DL@
+LIBADD_DLD_LINK = @LIBADD_DLD_LINK@
+LIBADD_DLOPEN = @LIBADD_DLOPEN@
+LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@
+LIBLTDL = @LIBLTDL@
+LIBOBJS = @LIBOBJS@
+LIBPOSTFIX = @LIBPOSTFIX@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTDLDEPS = @LTDLDEPS@
+LTDLINCL = @LTDLINCL@
+LTDLOPEN = @LTDLOPEN@
+LTLIBOBJS = @LTLIBOBJS@
+LT_ARGZ_H = @LT_ARGZ_H@
+LT_CONFIG_H = @LT_CONFIG_H@
+LT_DLLOADERS = @LT_DLLOADERS@
+LT_DLPREOPEN = @LT_DLPREOPEN@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+LUA = @LUA@
+LUA_INCLUDES = @LUA_INCLUDES@
+LUA_INSTALL_DIR = @LUA_INSTALL_DIR@
+LUA_LIBS = @LUA_LIBS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MATH_LIBS = @MATH_LIBS@
+MCS = @MCS@
+MINGW32 = @MINGW32@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJC = @OBJC@
+OBJCDEPMODE = @OBJCDEPMODE@
+OBJCFLAGS = @OBJCFLAGS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@
+PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@
+PANGOFT2_CFLAGS = @PANGOFT2_CFLAGS@
+PANGOFT2_LIBS = @PANGOFT2_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PERL_INCLUDES = @PERL_INCLUDES@
+PERL_INSTALL_DIR = @PERL_INSTALL_DIR@
+PERL_LIBS = @PERL_LIBS@
+PHP = @PHP@
+PHPCONFIG = @PHPCONFIG@
+PHP_INCLUDES = @PHP_INCLUDES@
+PHP_INSTALL_DATADIR = @PHP_INSTALL_DATADIR@
+PHP_INSTALL_DIR = @PHP_INSTALL_DIR@
+PHP_LIBS = @PHP_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PLATFORMSDKINCLUDE = @PLATFORMSDKINCLUDE@
+PLATFORMSDKLIB = @PLATFORMSDKLIB@
+POPPLER_CFLAGS = @POPPLER_CFLAGS@
+POPPLER_LIBS = @POPPLER_LIBS@
+PS2PDF = @PS2PDF@
+PYTHON3 = @PYTHON3@
+PYTHON3_INCLUDES = @PYTHON3_INCLUDES@
+PYTHON3_INSTALL_DIR = @PYTHON3_INSTALL_DIR@
+PYTHON3_LIBS = @PYTHON3_LIBS@
+QMAKE = @QMAKE@
+QTCORE_CFLAGS = @QTCORE_CFLAGS@
+QTCORE_LIBS = @QTCORE_LIBS@
+QTGUI_CFLAGS = @QTGUI_CFLAGS@
+QTGUI_LIBS = @QTGUI_LIBS@
+QUARTZ_CFLAGS = @QUARTZ_CFLAGS@
+QUARTZ_LIBS = @QUARTZ_LIBS@
+RANLIB = @RANLIB@
+RSVG_CFLAGS = @RSVG_CFLAGS@
+RSVG_LIBS = @RSVG_LIBS@
+RUBY = @RUBY@
+RUBY_CFLAGS = @RUBY_CFLAGS@
+RUBY_INSTALL_DIR = @RUBY_INSTALL_DIR@
+RUBY_LIBS = @RUBY_LIBS@
+RUBY_VER = @RUBY_VER@
+R_CFLAGS = @R_CFLAGS@
+R_LIBS = @R_LIBS@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHARED_LIBRARY_SUFFIX = @SHARED_LIBRARY_SUFFIX@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SWIG = @SWIG@
+SWIGJAVA_CPPFLAGS = @SWIGJAVA_CPPFLAGS@
+SWIG_PHP_DATA = @SWIG_PHP_DATA@
+SWIG_PHP_DATA_TO_PACKAGE = @SWIG_PHP_DATA_TO_PACKAGE@
+SWIG_PHP_OPT = @SWIG_PHP_OPT@
+SWIG_VERSION = @SWIG_VERSION@
+TCLCONFIG = @TCLCONFIG@
+TCLINT_INCLUDES = @TCLINT_INCLUDES@
+TCLSH = @TCLSH@
+TCLSH_EXEC_PREFIX = @TCLSH_EXEC_PREFIX@
+TCL_CFLAGS = @TCL_CFLAGS@
+TCL_DEFS = @TCL_DEFS@
+TCL_INCLUDES = @TCL_INCLUDES@
+TCL_INSTALL_DIR = @TCL_INSTALL_DIR@
+TCL_LIBS = @TCL_LIBS@
+TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@
+TCL_MINOR_VERSION = @TCL_MINOR_VERSION@
+TCL_PATCH_LEVEL = @TCL_PATCH_LEVEL@
+TCL_PKGINDEX = @TCL_PKGINDEX@
+TCL_PKGINDEX_GD = @TCL_PKGINDEX_GD@
+TCL_PKGINDEX_SWIG = @TCL_PKGINDEX_SWIG@
+TCL_SHLIB_SUFFIX = @TCL_SHLIB_SUFFIX@
+TCL_SRC_DIR = @TCL_SRC_DIR@
+TCL_STUB_LIB_SPEC = @TCL_STUB_LIB_SPEC@
+TCL_VERSION = @TCL_VERSION@
+VERSION = @VERSION@
+WEBP_CFLAGS = @WEBP_CFLAGS@
+WEBP_LIBS = @WEBP_LIBS@
+XMKMF = @XMKMF@
+XRENDER_CFLAGS = @XRENDER_CFLAGS@
+XRENDER_LIBS = @XRENDER_LIBS@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+Z_INCLUDES = @Z_INCLUDES@
+Z_LIBS = @Z_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_OBJC = @ac_ct_OBJC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+demodir = @demodir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+ltdl_LIBOBJS = @ltdl_LIBOBJS@
+ltdl_LTLIBOBJS = @ltdl_LTLIBOBJS@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sys_symbol_underscore = @sys_symbol_underscore@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+EXTRA_DIST = copy.png cut.png export.png icon.png new.png open.png \
+	paste.png run.png save.png save_as.png settings.png
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu cmd/gvedit/images/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu cmd/gvedit/images/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	cscopelist-am ctags-am distclean distclean-generic \
+	distclean-libtool distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+all:
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

BIN
graphviz.mod/graphviz/cmd/gvedit/images/copy.png


BIN
graphviz.mod/graphviz/cmd/gvedit/images/cut.png


BIN
graphviz.mod/graphviz/cmd/gvedit/images/export.png


BIN
graphviz.mod/graphviz/cmd/gvedit/images/icon.png


BIN
graphviz.mod/graphviz/cmd/gvedit/images/new.png


BIN
graphviz.mod/graphviz/cmd/gvedit/images/open.png


BIN
graphviz.mod/graphviz/cmd/gvedit/images/paste.png


BIN
graphviz.mod/graphviz/cmd/gvedit/images/run.png


BIN
graphviz.mod/graphviz/cmd/gvedit/images/save.png


BIN
graphviz.mod/graphviz/cmd/gvedit/images/save_as.png


BIN
graphviz.mod/graphviz/cmd/gvedit/images/settings.png


+ 216 - 0
graphviz.mod/graphviz/cmd/gvedit/imageviewer.cpp

@@ -0,0 +1,216 @@
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: Details at https://graphviz.org
+ *************************************************************************/
+
+
+#include "imageviewer.h"
+#include "mdichild.h"
+#include <QtGlobal>
+
+ImageViewer::ImageViewer()
+{
+    imageLabel = new QLabel;
+    imageLabel->setBackgroundRole(QPalette::Base);
+    imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
+    imageLabel->setScaledContents(true);
+
+    scrollArea = new QScrollArea;
+    scrollArea->setBackgroundRole(QPalette::Dark);
+    scrollArea->setWidget(imageLabel);
+    setCentralWidget(scrollArea);
+
+    createActions();
+    createMenus();
+
+    setWindowTitle(tr(""));
+    resize(800, 600);
+
+    setWindowIcon(QIcon(QStringLiteral(":/images/icon.png")));
+}
+
+bool ImageViewer::open(const QString &fileName)
+{
+    if (!fileName.isEmpty()) {
+	QImage image(fileName);
+	if (image.isNull()) {
+	    return false;
+	}
+	imageLabel->setPixmap(QPixmap::fromImage(image));
+	scaleFactor = 1.0;
+	fitToWindowAct->setEnabled(true);
+	updateActions();
+
+	if (!fitToWindowAct->isChecked())
+	    imageLabel->adjustSize();
+    }
+    return true;
+}
+
+void ImageViewer::print()
+{
+#ifndef QT_NO_PRINTER
+    auto get_pixmap = [&]() {
+#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
+        Q_ASSERT(imageLabel->pixmap());
+        return *imageLabel->pixmap();
+#else
+        return imageLabel->pixmap(Qt::ReturnByValue);
+#endif
+    };
+    QPrintDialog dialog(&printer, this);
+    if (dialog.exec()) {
+	QPainter painter(&printer);
+	QRect rect = painter.viewport();
+	QSize size = get_pixmap().size();
+	size.scale(rect.size(), Qt::KeepAspectRatio);
+	painter.setViewport(rect.x(), rect.y(), size.width(),
+			    size.height());
+	painter.setWindow(get_pixmap().rect());
+	painter.drawPixmap(0, 0, get_pixmap());
+    }
+#endif
+}
+
+void ImageViewer::zoomIn()
+{
+    scaleImage(1.25);
+}
+
+void ImageViewer::zoomOut()
+{
+    scaleImage(0.8);
+}
+
+void ImageViewer::normalSize()
+{
+    imageLabel->adjustSize();
+    scaleFactor = 1.0;
+}
+
+void ImageViewer::fitToWindow()
+{
+    bool fitToWindow = fitToWindowAct->isChecked();
+    scrollArea->setWidgetResizable(fitToWindow);
+    if (!fitToWindow) {
+	normalSize();
+    }
+    updateActions();
+}
+
+void ImageViewer::about()
+{
+    QMessageBox::about(this, tr("About Image Viewer"),
+		       tr
+		       ("<p>The <b>Image Viewer</b> example shows how to combine QLabel "
+			"and QScrollArea to display an image. QLabel is typically used "
+			"for displaying a text, but it can also display an image. "
+			"QScrollArea provides a scrolling view around another widget. "
+			"If the child widget exceeds the size of the frame, QScrollArea "
+			"automatically provides scroll bars. </p><p>The example "
+			"demonstrates how QLabel's ability to scale its contents "
+			"(QLabel::scaledContents), and QScrollArea's ability to "
+			"automatically resize its contents "
+			"(QScrollArea::widgetResizable), can be used to implement "
+			"zooming and scaling features. </p><p>In addition the example "
+			"shows how to use QPainter to print an image.</p>"));
+}
+
+void ImageViewer::createActions()
+{
+    printAct = new QAction(tr("&Print..."), this);
+    printAct->setShortcut(tr("Ctrl+P"));
+    printAct->setEnabled(false);
+    connect(printAct, &QAction::triggered, this, &ImageViewer::print);
+
+    exitAct = new QAction(tr("E&xit"), this);
+    exitAct->setShortcut(tr("Ctrl+Q"));
+    connect(exitAct, &QAction::triggered, this, &ImageViewer::close);
+
+    zoomInAct = new QAction(tr("Zoom &In (25%)"), this);
+    zoomInAct->setShortcut(tr("Ctrl++"));
+    zoomInAct->setEnabled(false);
+    connect(zoomInAct, &QAction::triggered, this, &ImageViewer::zoomIn);
+
+    zoomOutAct = new QAction(tr("Zoom &Out (25%)"), this);
+    zoomOutAct->setShortcut(tr("Ctrl+-"));
+    zoomOutAct->setEnabled(false);
+    connect(zoomOutAct, &QAction::triggered, this, &ImageViewer::zoomOut);
+
+    normalSizeAct = new QAction(tr("&Normal Size"), this);
+    normalSizeAct->setShortcut(tr("Ctrl+S"));
+    normalSizeAct->setEnabled(false);
+    connect(normalSizeAct, &QAction::triggered, this, &ImageViewer::normalSize);
+
+    fitToWindowAct = new QAction(tr("&Fit to Window"), this);
+    fitToWindowAct->setEnabled(false);
+    fitToWindowAct->setCheckable(true);
+    fitToWindowAct->setShortcut(tr("Ctrl+F"));
+    connect(fitToWindowAct, &QAction::triggered, this,
+            &ImageViewer::fitToWindow);
+
+    aboutAct = new QAction(tr("&About"), this);
+    connect(aboutAct, &QAction::triggered, this, &ImageViewer::about);
+
+    aboutQtAct = new QAction(tr("About &Qt"), this);
+    connect(aboutQtAct, &QAction::triggered, qApp, &QApplication::aboutQt);
+}
+
+void ImageViewer::createMenus()
+{
+
+    viewMenu = new QMenu(tr("&View"), this);
+    viewMenu->addAction(zoomInAct);
+    viewMenu->addAction(zoomOutAct);
+    viewMenu->addAction(normalSizeAct);
+    viewMenu->addSeparator();
+    viewMenu->addAction(fitToWindowAct);
+
+    menuBar()->addMenu(viewMenu);
+}
+
+void ImageViewer::updateActions()
+{
+    zoomInAct->setEnabled(!fitToWindowAct->isChecked());
+    zoomOutAct->setEnabled(!fitToWindowAct->isChecked());
+    normalSizeAct->setEnabled(!fitToWindowAct->isChecked());
+}
+
+void ImageViewer::scaleImage(double factor)
+{
+    auto get_pixmap = [&]() {
+#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
+        Q_ASSERT(imageLabel->pixmap());
+        return *imageLabel->pixmap();
+#else
+        return imageLabel->pixmap(Qt::ReturnByValue);
+#endif
+    };
+    scaleFactor *= factor;
+    imageLabel->resize(scaleFactor * get_pixmap().size());
+
+    adjustScrollBar(scrollArea->horizontalScrollBar(), factor);
+    adjustScrollBar(scrollArea->verticalScrollBar(), factor);
+
+    zoomInAct->setEnabled(scaleFactor < 3.0);
+    zoomOutAct->setEnabled(scaleFactor > 0.333);
+}
+
+void ImageViewer::adjustScrollBar(QScrollBar * scrollBar, double factor)
+{
+    scrollBar->setValue(int (factor * scrollBar->value()
+			     +
+			     ((factor - 1) * scrollBar->pageStep() / 2)));
+}
+
+void ImageViewer::closeEvent(QCloseEvent * event)
+{
+    this->graphWindow->previewFrm = nullptr;
+    event->accept();
+
+}

+ 77 - 0
graphviz.mod/graphviz/cmd/gvedit/imageviewer.h

@@ -0,0 +1,77 @@
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: Details at https://graphviz.org
+ *************************************************************************/
+
+#pragma once
+
+#define QT_NO_PRINTER 1
+
+#include <QtWidgets>
+#include <QMainWindow>
+#include <QPrinter>
+
+QT_BEGIN_NAMESPACE
+class QAction;
+class QLabel;
+class QMenu;
+class QScrollArea;
+class QScrollBar;
+class MdiChild;
+QT_END_NAMESPACE
+
+class ImageViewer : public QMainWindow
+{
+    Q_OBJECT
+
+public:
+    ImageViewer();
+    MdiChild* graphWindow;
+    QMdiSubWindow* subWindowRef; //reference to its wrapping sub window
+public slots:
+    bool open(const QString &fileName);
+    void print();
+    void zoomIn();
+    void zoomOut();
+    void normalSize();
+    void fitToWindow();
+    void about();
+
+
+private slots:
+
+private:
+    void createActions();
+    void createMenus();
+    void updateActions();
+    void scaleImage(double factor);
+    void adjustScrollBar(QScrollBar *scrollBar, double factor);
+
+    QLabel *imageLabel;
+    QScrollArea *scrollArea;
+    double scaleFactor;
+
+#ifndef QT_NO_PRINTER
+    QPrinter printer;
+#endif
+
+    QAction *openAct;
+    QAction *printAct;
+    QAction *exitAct;
+    QAction *zoomInAct;
+    QAction *zoomOutAct;
+    QAction *normalSizeAct;
+    QAction *fitToWindowAct;
+    QAction *aboutAct;
+    QAction *aboutQtAct;
+
+    QMenu *viewMenu;
+	protected:
+        void closeEvent(QCloseEvent *event);
+
+};

+ 110 - 0
graphviz.mod/graphviz/cmd/gvedit/main.cpp

@@ -0,0 +1,110 @@
+/**
+ * @file
+ * @brief gvedit - simple graph editor and viewer
+ */
+
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: Details at https://graphviz.org
+ *************************************************************************/
+
+#include "config.h"
+
+#ifdef _WIN32
+#include "windows.h"
+#endif
+#include "mainwindow.h"
+#include <QApplication>
+#include <QCommandLineParser>
+#include <QFile>
+#include <stdio.h>
+
+#include <gvc/gvc.h>
+
+#include <common/globals.h>
+
+#ifdef _MSC_VER
+#pragma comment(lib, "cgraph.lib")
+#pragma comment(lib, "gvc.lib")
+#endif
+
+QTextStream errout(stderr, QIODevice::WriteOnly);
+
+int main(int argc, char *argv[]) {
+  Q_INIT_RESOURCE(mdi);
+
+  QStringList files;
+  {
+    // Scoped QCoreApplication for when X11 DISPLAY is not available
+    QCoreApplication app(argc, argv);
+
+    QCommandLineParser parser;
+    parser.setApplicationDescription(
+        QStringLiteral("gvedit - simple graph editor and viewer"));
+    parser.addPositionalArgument(
+        QStringLiteral("files"),
+        QCoreApplication::translate("main", "files to open."),
+        QStringLiteral("[files...]"));
+
+    const QCommandLineOption helpOption(
+        {
+            QStringLiteral("?"),
+            QStringLiteral("h"),
+            QStringLiteral("help"),
+        },
+        QCoreApplication::translate("main",
+                                    "Displays help on commandline options."));
+    parser.addOption(helpOption);
+
+    const QCommandLineOption scaleInputBy72Option(
+        {
+            QStringLiteral("s"),
+            QStringLiteral("scale-input-by-72"),
+        },
+        QCoreApplication::translate("main", "Scale input by 72"));
+    parser.addOption(scaleInputBy72Option);
+
+    const QCommandLineOption verboseOption(
+        {
+            QStringLiteral("v"),
+            QStringLiteral("verbose"),
+        },
+        QCoreApplication::translate("main", "Verbose mode"));
+    parser.addOption(verboseOption);
+
+    if (!parser.parse(app.arguments())) {
+      parser.showHelp(1);
+    }
+
+    if (parser.isSet(helpOption)) {
+      parser.showHelp(0);
+    }
+
+    if (parser.isSet(scaleInputBy72Option)) {
+      PSinputscale = POINTS_PER_INCH;
+    }
+
+    if (parser.isSet(verboseOption)) {
+      Verbose = 1;
+    }
+
+    files = parser.positionalArguments();
+  }
+
+  QApplication app(argc, argv);
+
+  CMainWindow mainWin(files);
+  mainWin.show();
+  const int ret = app.exec();
+  graphviz_exit(ret);
+}
+
+/**
+ * @dir .
+ * @brief simple graph editor and viewer
+ */

+ 588 - 0
graphviz.mod/graphviz/cmd/gvedit/mainwindow.cpp

@@ -0,0 +1,588 @@
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: Details at https://graphviz.org
+ *************************************************************************/
+
+#include "mainwindow.h"
+#include "config.h"
+#include "csettings.h"
+#include "mdichild.h"
+#include <QStringList>
+#include <QtWidgets>
+#include <optional>
+#include <qframe.h>
+#include <string_view>
+
+QTextEdit *globTextEdit;
+
+int errorPipe(char *errMsg) {
+  globTextEdit->setText(globTextEdit->toPlainText() +
+                        QString::fromUtf8(errMsg));
+  return 0;
+}
+
+static void freeList(char **lp, int count) {
+  for (int i = 0; i < count; i++)
+    free(lp[i]);
+  free(lp);
+}
+
+static int LoadPlugins(QComboBox &cb, GVC_t *gvc, const char *kind,
+                       const QStringList &more, std::string_view prefer) {
+  int count;
+  char **lp = gvPluginList(gvc, kind, &count);
+  std::optional<int> idx;
+
+  cb.clear();
+  for (int id = 0; id < count; id++) {
+    cb.addItem(QString::fromUtf8(lp[id]));
+    if (!idx.has_value() && prefer == lp[id])
+      idx = id;
+  }
+  freeList(lp, count);
+
+  /* Add additional items if supplied */
+  cb.addItems(more);
+
+  if (idx.has_value())
+    cb.setCurrentIndex(*idx);
+
+  return idx.value_or(0);
+}
+
+void CMainWindow::createConsole() {
+  QDockWidget *dock = new QDockWidget(tr("Output Console"), nullptr);
+  QTextEdit *textEdit = new QTextEdit(dock);
+
+  dock->setAllowedAreas(Qt::BottomDockWidgetArea | Qt::TopDockWidgetArea);
+  addDockWidget(Qt::BottomDockWidgetArea, dock);
+  QVBoxLayout *vL = new QVBoxLayout();
+
+  textEdit->setObjectName(QStringLiteral("textEdit"));
+  globTextEdit = textEdit;
+  agseterrf(errorPipe);
+
+  vL->addWidget(textEdit);
+  vL->setContentsMargins(1, 1, 1, 1);
+
+  QFrame *fr = new QFrame(dock);
+  vL->addWidget(fr);
+
+  QPushButton *logNewBtn =
+      new QPushButton(QIcon(QStringLiteral(":/images/new.png")), {}, fr);
+  QPushButton *logSaveBtn =
+      new QPushButton(QIcon(QStringLiteral(":/images/save.png")), {}, fr);
+  QHBoxLayout *consoleLayout = new QHBoxLayout();
+  consoleLayout->addWidget(logNewBtn);
+  connect(logNewBtn, &QPushButton::clicked, this, &CMainWindow::slotNewLog);
+  connect(logSaveBtn, &QPushButton::clicked, this, &CMainWindow::slotSaveLog);
+  consoleLayout->addWidget(logSaveBtn);
+  consoleLayout->addStretch();
+
+  consoleLayout->setContentsMargins(1, 1, 1, 1);
+
+  fr->setLayout(consoleLayout);
+
+  QFrame *mainFrame = new QFrame(dock);
+  mainFrame->setLayout(vL);
+
+  dock->setWidget(mainFrame);
+}
+
+static const QStringList xtra = {QStringLiteral("NONE")};
+
+CMainWindow::CMainWindow(const QStringList &files) {
+
+  QWidget *centralwidget = new QWidget(this);
+  centralwidget->setObjectName(QStringLiteral("centralwidget"));
+  QVBoxLayout *verticalLayout_2 = new QVBoxLayout(centralwidget);
+  verticalLayout_2->setObjectName(QStringLiteral("verticalLayout_2"));
+  QVBoxLayout *verticalLayout = new QVBoxLayout();
+  verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
+  mdiArea = new QMdiArea(centralwidget);
+  mdiArea->setObjectName(QStringLiteral("mdiArea"));
+
+  verticalLayout->addWidget(mdiArea);
+  verticalLayout_2->setContentsMargins(1, 1, 1, 1);
+  verticalLayout_2->addLayout(verticalLayout);
+  setCentralWidget(centralwidget);
+  centralwidget->layout()->setContentsMargins(1, 1, 1, 1);
+  prevChild = nullptr;
+
+  createConsole();
+
+  connect(mdiArea, &QMdiArea::subWindowActivated, this,
+          &CMainWindow::slotRefreshMenus);
+
+  frmSettings = new CFrmSettings();
+
+  actions();
+  menus();
+  toolBars();
+  statusBar();
+  updateMenus();
+
+  readSettings();
+
+  setWindowTitle(tr("GVEdit"));
+  this->resize(1024, 900);
+  this->move(0, 0);
+  setUnifiedTitleAndToolBarOnMac(true);
+  QComboBox *cb =
+      frmSettings->findChild<QComboBox *>(QStringLiteral("cbLayout"));
+  dfltLayoutIdx = LoadPlugins(*cb, frmSettings->gvc, "layout", {}, "dot");
+  cb = frmSettings->findChild<QComboBox *>(QStringLiteral("cbExtension"));
+  dfltRenderIdx = LoadPlugins(*cb, frmSettings->gvc, "device", xtra, "png");
+  statusBar()->showMessage(tr("Ready"));
+  setWindowIcon(QIcon(QStringLiteral(":/images/icon.png")));
+  // load files specified in command line , one time task
+  for (const QString &file : files) {
+    addFile(file);
+  }
+}
+
+void CMainWindow::closeEvent(QCloseEvent *event) {
+  mdiArea->closeAllSubWindows();
+  if (mdiArea->currentSubWindow()) {
+    event->ignore();
+  } else {
+    writeSettings();
+    event->accept();
+  }
+}
+
+void CMainWindow::slotNew() {
+  MdiChild *child = createMdiChild();
+  child->newFile();
+  child->show();
+}
+
+void CMainWindow::addFile(const QString &fileName) {
+  if (!fileName.isEmpty()) {
+    QMdiSubWindow *existing = findMdiChild(fileName);
+    if (existing) {
+      mdiArea->setActiveSubWindow(existing);
+      return;
+    }
+
+    MdiChild *child = createMdiChild();
+    if (child->loadFile(fileName)) {
+      statusBar()->showMessage(tr("File loaded"), 2000);
+      child->show();
+      slotRun(child);
+    } else {
+      child->close();
+    }
+  }
+}
+
+void CMainWindow::slotOpen() {
+  QStringList filters{
+      QStringLiteral("*.cpp"),
+      QStringLiteral("*.cxx"),
+      QStringLiteral("*.cc"),
+  };
+
+  QFileDialog fd;
+  fd.setNameFilter(QStringLiteral("XML (*.xml)"));
+  QString fileName = fd.getOpenFileName(this);
+
+  addFile(fileName);
+}
+
+void CMainWindow::slotSave() {
+  if (activeMdiChild() && activeMdiChild()->save())
+    statusBar()->showMessage(tr("File saved"), 2000);
+}
+
+void CMainWindow::slotSaveAs() {
+  if (activeMdiChild() && activeMdiChild()->saveAs())
+    statusBar()->showMessage(tr("File saved"), 2000);
+}
+
+void CMainWindow::slotCut() {
+  if (activeMdiChild())
+    activeMdiChild()->cut();
+}
+
+void CMainWindow::slotCopy() {
+  if (activeMdiChild())
+    activeMdiChild()->copy();
+}
+
+void CMainWindow::slotPaste() {
+  if (activeMdiChild())
+    activeMdiChild()->paste();
+}
+
+void CMainWindow::slotAbout() {
+  QString abs(tr("<b>GVEdit</b> Graph File Editor For Graphviz"
+                 " version: 1.02\n"
+                 "Graphviz version: "));
+
+  abs += tr(gvcVersion(frmSettings->gvc));
+  QMessageBox::about(this, tr("About GVEdit"), abs);
+}
+
+void CMainWindow::setChild() {
+  if (prevChild != activeMdiChild()) {
+    const QString msg =
+        QStringLiteral("working on %1\n").arg(activeMdiChild()->currentFile());
+    errorPipe(msg.toLatin1().data());
+    prevChild = activeMdiChild();
+  }
+}
+
+void CMainWindow::slotSettings() {
+  setChild();
+  frmSettings->showSettings(activeMdiChild());
+}
+
+void CMainWindow::slotRun(MdiChild *m) {
+  setChild();
+
+  if (m)
+    frmSettings->runSettings(m);
+  else
+    frmSettings->runSettings(activeMdiChild());
+}
+
+void CMainWindow::slotNewLog() { globTextEdit->clear(); }
+
+void CMainWindow::slotSaveLog() {
+
+  if (globTextEdit->toPlainText().trimmed().isEmpty()) {
+    QMessageBox::warning(this, tr("GvEdit"), tr("Nothing to save!"),
+                         QMessageBox::Ok, QMessageBox::Ok);
+    return;
+  }
+
+  QString fileName = QFileDialog::getSaveFileName(
+      this, tr("Open File"), QStringLiteral("/"), tr("Text File(*.*)"));
+  if (!fileName.isEmpty()) {
+
+    QFile file(fileName);
+    if (!file.open(QFile::WriteOnly | QFile::Text)) {
+      QMessageBox::warning(this, tr("MDI"),
+                           tr("Cannot write file %1:\n%2.")
+                               .arg(fileName)
+                               .arg(file.errorString()));
+      return;
+    }
+
+    QTextStream out(&file);
+    out << globTextEdit->toPlainText();
+  }
+}
+
+void CMainWindow::updateFileMenu() {
+  if (!activeMdiChild()) {
+    saveAct->setEnabled(false);
+    saveAsAct->setEnabled(false);
+    pasteAct->setEnabled(false);
+    closeAct->setEnabled(false);
+    closeAllAct->setEnabled(false);
+    tileAct->setEnabled(false);
+    cascadeAct->setEnabled(false);
+    nextAct->setEnabled(false);
+    previousAct->setEnabled(false);
+    separatorAct->setVisible(false);
+    settingsAct->setEnabled(false);
+    layoutAct->setEnabled(false);
+  } else {
+    saveAct->setEnabled(true);
+    saveAsAct->setEnabled(true);
+    pasteAct->setEnabled(true);
+    closeAct->setEnabled(true);
+    closeAllAct->setEnabled(true);
+    tileAct->setEnabled(true);
+    cascadeAct->setEnabled(true);
+    nextAct->setEnabled(true);
+    previousAct->setEnabled(true);
+    separatorAct->setVisible(true);
+    settingsAct->setEnabled(true);
+    layoutAct->setEnabled(true);
+
+    if (activeMdiChild()->textCursor().hasSelection()) {
+      cutAct->setEnabled(true);
+      copyAct->setEnabled(true);
+
+    } else {
+      cutAct->setEnabled(false);
+      copyAct->setEnabled(false);
+    }
+  }
+}
+
+void CMainWindow::slotRefreshMenus() { updateMenus(); }
+
+void CMainWindow::updateMenus() {
+  this->updateFileMenu();
+  this->updateWindowMenu();
+}
+
+void CMainWindow::updateWindowMenu() {
+  mWindow->clear();
+  mWindow->addAction(closeAct);
+  mWindow->addAction(closeAllAct);
+  mWindow->addSeparator();
+  mWindow->addAction(tileAct);
+  mWindow->addAction(cascadeAct);
+  mWindow->addSeparator();
+  mWindow->addAction(nextAct);
+  mWindow->addAction(previousAct);
+  mWindow->addAction(separatorAct);
+
+  QList<QMdiSubWindow *> windows = mdiArea->subWindowList();
+  separatorAct->setVisible(!windows.isEmpty());
+
+  for (int i = 0; i < windows.size(); ++i) {
+    QMdiSubWindow *window = windows.at(i);
+    if (window->widget()->inherits("MdiChild")) {
+      MdiChild *child = qobject_cast<MdiChild *>(window->widget());
+      QString text;
+      if (i < 9) {
+        text = tr("&%1 %2").arg(i + 1).arg(child->userFriendlyCurrentFile());
+      } else {
+        text = tr("%1 %2").arg(i + 1).arg(child->userFriendlyCurrentFile());
+      }
+      QAction *action = mWindow->addAction(text);
+      action->setCheckable(true);
+      action->setChecked(child == activeMdiChild());
+      connect(action, &QAction::triggered, this,
+              [this, window] { activateChild(window); });
+    }
+  }
+}
+
+MdiChild *CMainWindow::createMdiChild() {
+  MdiChild *child = new MdiChild;
+  child->parentFrm = this;
+  QMdiSubWindow *s = mdiArea->addSubWindow(child);
+  s->resize(800, 600);
+  s->move(mdiArea->subWindowList().count() * 5,
+          mdiArea->subWindowList().count() * 5);
+  connect(child, &MdiChild::copyAvailable, cutAct, &QAction::setEnabled);
+  connect(child, &MdiChild::copyAvailable, copyAct, &QAction::setEnabled);
+  child->layoutIdx = dfltLayoutIdx;
+  child->renderIdx = dfltRenderIdx;
+
+  return child;
+}
+
+void CMainWindow::actions() {
+  newAct =
+      new QAction(QIcon(QStringLiteral(":/images/new.png")), tr("&New"), this);
+  newAct->setShortcuts(QKeySequence::New);
+  newAct->setStatusTip(tr("Create a new file"));
+  connect(newAct, &QAction::triggered, this, &CMainWindow::slotNew);
+
+  openAct = new QAction(QIcon(QStringLiteral(":/images/open.png")),
+                        tr("&Open..."), this);
+  openAct->setShortcuts(QKeySequence::Open);
+  openAct->setStatusTip(tr("Open an existing file"));
+  connect(openAct, &QAction::triggered, this, &CMainWindow::slotOpen);
+
+  saveAct = new QAction(QIcon(QStringLiteral(":/images/save.png")), tr("&Save"),
+                        this);
+  saveAct->setShortcuts(QKeySequence::Save);
+  saveAct->setStatusTip(tr("Save the document to disk"));
+  connect(saveAct, &QAction::triggered, this, &CMainWindow::slotSave);
+
+  saveAsAct = new QAction(tr("Save &As..."), this);
+  saveAsAct->setShortcuts(QKeySequence::SaveAs);
+  saveAsAct->setStatusTip(tr("Save the document under a new name"));
+  connect(saveAsAct, &QAction::triggered, this, &CMainWindow::slotSaveAs);
+
+  exitAct = new QAction(tr("E&xit"), this);
+  exitAct->setShortcuts(QKeySequence::Quit);
+  exitAct->setStatusTip(tr("Exit the application"));
+  connect(exitAct, &QAction::triggered, qApp, &QApplication::closeAllWindows);
+
+  cutAct =
+      new QAction(QIcon(QStringLiteral(":/images/cut.png")), tr("Cu&t"), this);
+  cutAct->setShortcuts(QKeySequence::Cut);
+  cutAct->setStatusTip(tr("Cut the current selection's contents to the "
+                          "clipboard"));
+  connect(cutAct, &QAction::triggered, this, &CMainWindow::slotCut);
+
+  copyAct = new QAction(QIcon(QStringLiteral(":/images/copy.png")), tr("&Copy"),
+                        this);
+  copyAct->setShortcuts(QKeySequence::Copy);
+  copyAct->setStatusTip(tr("Copy the current selection's contents to the "
+                           "clipboard"));
+  connect(copyAct, &QAction::triggered, this, &CMainWindow::slotCopy);
+
+  pasteAct = new QAction(QIcon(QStringLiteral(":/images/paste.png")),
+                         tr("&Paste"), this);
+  pasteAct->setShortcuts(QKeySequence::Paste);
+  pasteAct->setStatusTip(tr("Paste the clipboard's contents into the current "
+                            "selection"));
+  connect(pasteAct, &QAction::triggered, this, &CMainWindow::slotPaste);
+
+  closeAct = new QAction(tr("Cl&ose"), this);
+  closeAct->setStatusTip(tr("Close the active window"));
+  connect(closeAct, &QAction::triggered, mdiArea,
+          &QMdiArea::closeActiveSubWindow);
+
+  closeAllAct = new QAction(tr("Close &All"), this);
+  closeAllAct->setStatusTip(tr("Close all the windows"));
+  connect(closeAllAct, &QAction::triggered, mdiArea,
+          &QMdiArea::closeAllSubWindows);
+
+  tileAct = new QAction(tr("&Tile"), this);
+  tileAct->setStatusTip(tr("Tile the windows"));
+  connect(tileAct, &QAction::triggered, mdiArea, &QMdiArea::tileSubWindows);
+
+  cascadeAct = new QAction(tr("&Cascade"), this);
+  cascadeAct->setStatusTip(tr("Cascade the windows"));
+  connect(cascadeAct, &QAction::triggered, mdiArea,
+          &QMdiArea::cascadeSubWindows);
+
+  nextAct = new QAction(tr("Ne&xt"), this);
+  nextAct->setShortcuts(QKeySequence::NextChild);
+  nextAct->setStatusTip(tr("Move the focus to the next window"));
+  connect(nextAct, &QAction::triggered, mdiArea,
+          &QMdiArea::activateNextSubWindow);
+
+  previousAct = new QAction(tr("Pre&vious"), this);
+  previousAct->setShortcuts(QKeySequence::PreviousChild);
+  previousAct->setStatusTip(tr("Move the focus to the previous window"));
+  connect(previousAct, &QAction::triggered, mdiArea,
+          &QMdiArea::activatePreviousSubWindow);
+
+  separatorAct = new QAction(this);
+  separatorAct->setSeparator(true);
+
+  aboutAct = new QAction(tr("&About"), this);
+  aboutAct->setStatusTip(tr("Show the application's About box"));
+  connect(aboutAct, &QAction::triggered, this, &CMainWindow::slotAbout);
+
+  settingsAct = new QAction(QIcon(QStringLiteral(":/images/settings.png")),
+                            tr("Settings"), this);
+  settingsAct->setStatusTip(tr("Show Graphviz Settings"));
+  connect(settingsAct, &QAction::triggered, this, &CMainWindow::slotSettings);
+  settingsAct->setShortcut(QKeySequence(Qt::SHIFT | Qt::Key_F5));
+
+  layoutAct = new QAction(QIcon(QStringLiteral(":/images/run.png")),
+                          tr("Layout"), this);
+  layoutAct->setStatusTip(tr("Layout the active graph"));
+  connect(layoutAct, &QAction::triggered, this, [this] { slotRun(); });
+  layoutAct->setShortcut(QKeySequence(Qt::Key_F5));
+}
+
+void CMainWindow::menus() {
+  mFile = menuBar()->addMenu(tr("&File"));
+  mEdit = menuBar()->addMenu(tr("&Edit"));
+  mWindow = menuBar()->addMenu(tr("&Window"));
+  mGraph = menuBar()->addMenu(tr("&Graph"));
+  mHelp = menuBar()->addMenu(tr("&Help"));
+
+  mFile->addAction(newAct);
+  mFile->addAction(openAct);
+  mFile->addAction(saveAct);
+  mFile->addAction(saveAsAct);
+  mFile->addSeparator();
+
+  mFile->addAction(exitAct);
+
+  mEdit->addAction(cutAct);
+  mEdit->addAction(copyAct);
+  mEdit->addAction(pasteAct);
+
+  mGraph->addAction(settingsAct);
+  mGraph->addAction(layoutAct);
+  mGraph->addSeparator();
+
+  updateWindowMenu();
+  connect(mWindow, &QMenu::aboutToShow, this, &CMainWindow::slotRefreshMenus);
+  mHelp->addAction(aboutAct);
+}
+
+void CMainWindow::toolBars() {
+  tbFile = addToolBar(tr("File"));
+  tbFile->addAction(newAct);
+  tbFile->addAction(openAct);
+  tbFile->addAction(saveAct);
+
+  tbEdit = addToolBar(tr("Edit"));
+  tbEdit->addAction(cutAct);
+  tbEdit->addAction(copyAct);
+  tbEdit->addAction(pasteAct);
+
+  tbGraph = addToolBar(tr("Graph"));
+  tbGraph->addAction(settingsAct);
+  tbGraph->addAction(layoutAct);
+}
+
+void CMainWindow::readSettings() {
+  // first try new settings
+  {
+    QSettings settings(QStringLiteral("Graphviz"), QStringLiteral("gvedit"));
+    if (settings.contains(QStringLiteral("pos")) &&
+        settings.contains(QStringLiteral("size"))) {
+      QPoint pos =
+          settings.value(QStringLiteral("pos"), QPoint(200, 200)).toPoint();
+      QSize size =
+          settings.value(QStringLiteral("size"), QSize(400, 400)).toSize();
+      move(pos);
+      resize(size);
+      return;
+    }
+  }
+
+  // fall back to old settings
+  QSettings settings(QStringLiteral("Trolltech"),
+                     QStringLiteral("MDI Example"));
+  QPoint pos =
+      settings.value(QStringLiteral("pos"), QPoint(200, 200)).toPoint();
+  QSize size = settings.value(QStringLiteral("size"), QSize(400, 400)).toSize();
+  move(pos);
+  resize(size);
+}
+
+void CMainWindow::writeSettings() {
+  QSettings settings(QStringLiteral("Graphviz"), QStringLiteral("gvedit"));
+  settings.setValue(QStringLiteral("pos"), pos());
+  settings.setValue(QStringLiteral("size"), size());
+}
+
+MdiChild *CMainWindow::activeMdiChild() {
+  if (QMdiSubWindow *activeSubWindow = mdiArea->activeSubWindow()) {
+    if (activeSubWindow->widget()->inherits("MdiChild"))
+      return qobject_cast<MdiChild *>(activeSubWindow->widget());
+    return qobject_cast<ImageViewer *>(activeSubWindow->widget())->graphWindow;
+  }
+  return 0;
+}
+
+QMdiSubWindow *CMainWindow::findMdiChild(const QString &fileName) {
+  QString canonicalFilePath = QFileInfo(fileName).canonicalFilePath();
+
+  foreach (QMdiSubWindow *window, mdiArea->subWindowList()) {
+    if (window->widget()->inherits("MdiChild")) {
+
+      MdiChild *mdiChild = qobject_cast<MdiChild *>(window->widget());
+      if (mdiChild->currentFile() == canonicalFilePath)
+        return window;
+    } else {
+
+      MdiChild *mdiChild =
+          qobject_cast<ImageViewer *>(window->widget())->graphWindow;
+      if (mdiChild->currentFile() == canonicalFilePath)
+        return window;
+    }
+  }
+  return 0;
+}
+
+void CMainWindow::activateChild(QWidget *window) {
+  if (!window)
+    return;
+  mdiArea->setActiveSubWindow(qobject_cast<QMdiSubWindow *>(window));
+}

+ 109 - 0
graphviz.mod/graphviz/cmd/gvedit/mainwindow.h

@@ -0,0 +1,109 @@
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: Details at https://graphviz.org
+ *************************************************************************/
+
+/*
+Core structures of mdi windowing code is either inspired or directly copied from
+Nokia Corporation's QT Toolkit examples. These examples are published under the
+terms of the BSD
+*/
+
+#pragma once
+
+#include "ui_settings.h"
+#include <QMainWindow>
+#include <QTextStream>
+#include <vector>
+
+extern QTextStream errout;
+
+class MdiChild;
+class CFrmSettings;
+QT_BEGIN_NAMESPACE
+class QAction;
+class QMenu;
+class QMdiArea;
+class QMdiSubWindow;
+QT_END_NAMESPACE
+
+class CMainWindow : public QMainWindow {
+  Q_OBJECT
+
+public:
+  CMainWindow(const QStringList &files);
+  QMdiArea *mdiArea;
+  void addFile(const QString &fileName);
+private slots:
+  void slotSettings();
+  void slotRun(MdiChild *m = nullptr);
+  void slotNew();
+  void slotOpen();
+  void slotSave();
+  void slotSaveAs();
+  void slotCut();
+  void slotCopy();
+  void slotPaste();
+  void slotAbout();
+  void slotRefreshMenus();
+  void slotNewLog();
+  void slotSaveLog();
+  MdiChild *createMdiChild();
+  void activateChild(QWidget *window);
+
+protected:
+  void closeEvent(QCloseEvent *event);
+
+private:
+  void setChild();
+  void createConsole();
+  void actions();
+  void menus();
+  void updateMenus();
+  void updateWindowMenu();
+  void updateFileMenu();
+  void toolBars();
+  void readSettings();
+  void writeSettings();
+  MdiChild *activeMdiChild();
+  MdiChild *prevChild;
+  QMdiSubWindow *findMdiChild(const QString &fileName);
+  int dfltRenderIdx, dfltLayoutIdx;
+
+  QToolBar *tbFile;
+  QToolBar *tbEdit;
+  QToolBar *tbGraph;
+
+  QAction *newAct;
+  QAction *openAct;
+  QAction *saveAct;
+  QAction *saveAsAct;
+  QAction *exitAct;
+  QAction *cutAct;
+  QAction *copyAct;
+  QAction *pasteAct;
+  QAction *closeAct;
+  QAction *closeAllAct;
+  QAction *tileAct;
+  QAction *cascadeAct;
+  QAction *nextAct;
+  QAction *previousAct;
+  QAction *separatorAct;
+  QAction *aboutAct;
+
+  QAction *settingsAct;
+  QAction *layoutAct;
+
+  CFrmSettings *frmSettings;
+  // menus
+  QMenu *mFile;
+  QMenu *mEdit;
+  QMenu *mGraph;
+  QMenu *mWindow;
+  QMenu *mHelp;
+};

+ 13 - 0
graphviz.mod/graphviz/cmd/gvedit/mdi.qrc

@@ -0,0 +1,13 @@
+<RCC>
+    <qresource prefix="/">
+        <file>images/copy.png</file>
+        <file>images/cut.png</file>
+        <file>images/new.png</file>
+        <file>images/open.png</file>
+        <file>images/paste.png</file>
+        <file>images/save.png</file>
+        <file>images/run.png</file>
+        <file>images/settings.png</file>
+        <file>images/icon.png</file>
+    </qresource>
+</RCC>

+ 157 - 0
graphviz.mod/graphviz/cmd/gvedit/mdichild.cpp

@@ -0,0 +1,157 @@
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: Details at https://graphviz.org
+ *************************************************************************/
+
+#include "mdichild.h"
+#include "mainwindow.h"
+#include <QtGlobal>
+#include <QtWidgets>
+#include <memory>
+
+MdiChild::MdiChild() {
+  setAttribute(Qt::WA_DeleteOnClose);
+  isUntitled = true;
+  layoutIdx = 0;
+  renderIdx = 0;
+  preview = true;
+  applyCairo = false;
+  settingsSet = false;
+}
+
+void MdiChild::newFile() {
+  static int sequenceNumber = 1;
+
+  isUntitled = true;
+  curFile = tr("graph%1.gv").arg(sequenceNumber++);
+  setWindowTitle(curFile + QLatin1String("[*]"));
+
+  connect(document(), &QTextDocument::contentsChange, this,
+          &MdiChild::documentWasModified);
+}
+
+bool MdiChild::loadFile(const QString &fileName) {
+  QFile file(fileName);
+  if (!file.open(QFile::ReadOnly | QFile::Text)) {
+    QMessageBox::warning(
+        this, tr("MDI"),
+        tr("Cannot read file %1:\n%2.").arg(fileName).arg(file.errorString()));
+    return false;
+  }
+
+  QTextStream in(&file);
+  QApplication::setOverrideCursor(Qt::WaitCursor);
+  setPlainText(in.readAll());
+  QApplication::restoreOverrideCursor();
+
+  setCurrentFile(fileName);
+
+  connect(document(), &QTextDocument::contentsChange, this,
+          &MdiChild::documentWasModified);
+
+  return true;
+}
+
+bool MdiChild::save() {
+  if (isUntitled) {
+    return saveAs();
+  }
+  return saveFile(curFile);
+}
+
+bool MdiChild::saveAs() {
+  QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), curFile);
+  if (fileName.isEmpty())
+    return false;
+
+  return saveFile(fileName);
+}
+
+bool MdiChild::saveFile(const QString &fileName) {
+  QFile file(fileName);
+  if (!file.open(QFile::WriteOnly | QFile::Text)) {
+    QMessageBox::warning(
+        this, tr("MDI"),
+        tr("Cannot write file %1:\n%2.").arg(fileName).arg(file.errorString()));
+    return false;
+  }
+
+  QTextStream out(&file);
+  QApplication::setOverrideCursor(Qt::WaitCursor);
+#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+  out.setCodec("UTF-8");
+#endif
+  out << toPlainText();
+  out.flush();
+  QApplication::restoreOverrideCursor();
+
+  setCurrentFile(fileName);
+  return true;
+}
+
+QString MdiChild::userFriendlyCurrentFile() { return strippedName(curFile); }
+
+void MdiChild::closeEvent(QCloseEvent *event) {
+  if (maybeSave()) {
+    event->accept();
+  } else {
+    event->ignore();
+  }
+}
+
+void MdiChild::documentWasModified() {
+  setWindowModified(document()->isModified());
+}
+
+bool MdiChild::maybeSave() {
+  if (document()->isModified()) {
+    QMessageBox::StandardButton ret;
+    ret = QMessageBox::warning(this, tr("MDI"),
+                               tr("'%1' has been modified.\n"
+                                  "Do you want to save your changes?")
+                                   .arg(userFriendlyCurrentFile()),
+                               QMessageBox::Save | QMessageBox::Discard |
+                                   QMessageBox::Cancel);
+    if (ret == QMessageBox::Save)
+      return save();
+    if (ret == QMessageBox::Cancel)
+      return false;
+  }
+  return true;
+}
+
+void MdiChild::setCurrentFile(const QString &fileName) {
+  curFile = QFileInfo(fileName).canonicalFilePath();
+  isUntitled = false;
+  document()->setModified(false);
+  setWindowModified(false);
+  setWindowTitle(userFriendlyCurrentFile() + QLatin1String("[*]"));
+}
+
+QString MdiChild::strippedName(const QString &fullFileName) {
+  return QFileInfo(fullFileName).fileName();
+}
+
+bool MdiChild::loadPreview(const QString &fileName) {
+  if (previewFrm == nullptr) {
+    previewFrm = std::make_unique<ImageViewer>();
+    previewFrm->graphWindow = this;
+    QMdiSubWindow *s = parentFrm->mdiArea->addSubWindow(previewFrm.get());
+
+    s->resize(600, 400);
+    s->move(parentFrm->mdiArea->subWindowList().count() * 5,
+            parentFrm->mdiArea->subWindowList().count() * 5);
+    previewFrm->subWindowRef = s;
+  }
+  bool rv = previewFrm->open(fileName);
+  if (rv)
+    previewFrm->show();
+  return rv;
+}
+
+bool MdiChild::firstTime() { return settingsSet; }

+ 56 - 0
graphviz.mod/graphviz/cmd/gvedit/mdichild.h

@@ -0,0 +1,56 @@
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: Details at https://graphviz.org
+ *************************************************************************/
+
+#pragma once
+
+#include <memory>
+#include <QTextEdit>
+#include "imageviewer.h"
+class CMainWindow;
+
+class MdiChild : public QTextEdit
+{
+    Q_OBJECT
+
+public:
+    MdiChild();
+
+    void newFile();
+    bool loadFile(const QString &fileName);
+    bool save();
+    bool saveAs();
+    bool saveFile(const QString &fileName);
+    QString userFriendlyCurrentFile();
+    QString currentFile() { return curFile; }
+    int layoutIdx;
+    int renderIdx;
+    QString outputFile;
+    bool preview;
+    bool applyCairo;
+    QString attributes;
+    std::unique_ptr<ImageViewer> previewFrm;
+    CMainWindow* parentFrm;
+    bool loadPreview(const QString &fileName);
+    bool firstTime();
+    bool settingsSet;
+protected:
+    void closeEvent(QCloseEvent *event);
+
+private slots:
+    void documentWasModified();
+
+private:
+    bool maybeSave();
+    void setCurrentFile(const QString &fileName);
+    QString strippedName(const QString &fullFileName);
+
+    QString curFile;
+    bool isUntitled;
+};

+ 5 - 0
graphviz.mod/graphviz/cmd/gvedit/ui/Makefile.am

@@ -0,0 +1,5 @@
+## Process this file with automake to produce Makefile.in
+
+all:
+
+EXTRA_DIST = settings.ui

+ 628 - 0
graphviz.mod/graphviz/cmd/gvedit/ui/Makefile.in

@@ -0,0 +1,628 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = cmd/gvedit/ui
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \
+	$(top_srcdir)/m4/ax_compare_version.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltargz.m4 \
+	$(top_srcdir)/m4/ltdl.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/./version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+ANN_CFLAGS = @ANN_CFLAGS@
+ANN_LIBS = @ANN_LIBS@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+CYGWIN = @CYGWIN@
+DARWIN = @DARWIN@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEVIL_INCLUDES = @DEVIL_INCLUDES@
+DEVIL_LIBS = @DEVIL_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+EXPAT_CFLAGS = @EXPAT_CFLAGS@
+EXPAT_LIBS = @EXPAT_LIBS@
+FGREP = @FGREP@
+FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@
+FREETYPE2_LIBS = @FREETYPE2_LIBS@
+GDIPLUS_CFLAGS = @GDIPLUS_CFLAGS@
+GDIPLUS_HEADS = @GDIPLUS_HEADS@
+GDIPLUS_LIBS = @GDIPLUS_LIBS@
+GDK_CFLAGS = @GDK_CFLAGS@
+GDK_LIBS = @GDK_LIBS@
+GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@
+GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@
+GDLIB_CFLAGS = @GDLIB_CFLAGS@
+GDLIB_CONFIG = @GDLIB_CONFIG@
+GDLIB_LIBS = @GDLIB_LIBS@
+GLADE_CFLAGS = @GLADE_CFLAGS@
+GLADE_LIBS = @GLADE_LIBS@
+GLUT_CFLAGS = @GLUT_CFLAGS@
+GLUT_LIBS = @GLUT_LIBS@
+GO = @GO@
+GO_INCLUDES = @GO_INCLUDES@
+GO_LIBS = @GO_LIBS@
+GRAPHVIZ_AUTHOR_EMAIL = @GRAPHVIZ_AUTHOR_EMAIL@
+GRAPHVIZ_AUTHOR_NAME = @GRAPHVIZ_AUTHOR_NAME@
+GRAPHVIZ_CHANGE_DATE = @GRAPHVIZ_CHANGE_DATE@
+GRAPHVIZ_VERSION_DATE = @GRAPHVIZ_VERSION_DATE@
+GRAPHVIZ_VERSION_MAJOR = @GRAPHVIZ_VERSION_MAJOR@
+GRAPHVIZ_VERSION_MICRO = @GRAPHVIZ_VERSION_MICRO@
+GRAPHVIZ_VERSION_MINOR = @GRAPHVIZ_VERSION_MINOR@
+GREP = @GREP@
+GROFF = @GROFF@
+GS_CFLAGS = @GS_CFLAGS@
+GS_LIBS = @GS_LIBS@
+GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@
+GTKGLEXT_LIBS = @GTKGLEXT_LIBS@
+GTKGL_CFLAGS = @GTKGL_CFLAGS@
+GTKGL_LIBS = @GTKGL_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+GTS_CFLAGS = @GTS_CFLAGS@
+GTS_LIBS = @GTS_LIBS@
+GUILE_CFLAGS = @GUILE_CFLAGS@
+GUILE_LIBS = @GUILE_LIBS@
+GVPLUGIN_CONFIG_FILE = @GVPLUGIN_CONFIG_FILE@
+GVPLUGIN_VERSION = @GVPLUGIN_VERSION@
+GVPLUGIN_VERSION_INFO = @GVPLUGIN_VERSION_INFO@
+HAVE_CXX17 = @HAVE_CXX17@
+INCLTDL = @INCLTDL@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTGOSIZE = @INTGOSIZE@
+IPSEPCOLA_INCLUDES = @IPSEPCOLA_INCLUDES@
+IPSEPCOLA_LIBS = @IPSEPCOLA_LIBS@
+JAVA = @JAVA@
+JAVASCRIPT = @JAVASCRIPT@
+JAVA_INCLUDES = @JAVA_INCLUDES@
+JAVA_LIBS = @JAVA_LIBS@
+JNI_EXTRA_LDFLAGS = @JNI_EXTRA_LDFLAGS@
+JSHEXT = @JSHEXT@
+LASI_CFLAGS = @LASI_CFLAGS@
+LASI_LIBS = @LASI_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBADD_DL = @LIBADD_DL@
+LIBADD_DLD_LINK = @LIBADD_DLD_LINK@
+LIBADD_DLOPEN = @LIBADD_DLOPEN@
+LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@
+LIBLTDL = @LIBLTDL@
+LIBOBJS = @LIBOBJS@
+LIBPOSTFIX = @LIBPOSTFIX@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTDLDEPS = @LTDLDEPS@
+LTDLINCL = @LTDLINCL@
+LTDLOPEN = @LTDLOPEN@
+LTLIBOBJS = @LTLIBOBJS@
+LT_ARGZ_H = @LT_ARGZ_H@
+LT_CONFIG_H = @LT_CONFIG_H@
+LT_DLLOADERS = @LT_DLLOADERS@
+LT_DLPREOPEN = @LT_DLPREOPEN@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+LUA = @LUA@
+LUA_INCLUDES = @LUA_INCLUDES@
+LUA_INSTALL_DIR = @LUA_INSTALL_DIR@
+LUA_LIBS = @LUA_LIBS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MATH_LIBS = @MATH_LIBS@
+MCS = @MCS@
+MINGW32 = @MINGW32@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJC = @OBJC@
+OBJCDEPMODE = @OBJCDEPMODE@
+OBJCFLAGS = @OBJCFLAGS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@
+PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@
+PANGOFT2_CFLAGS = @PANGOFT2_CFLAGS@
+PANGOFT2_LIBS = @PANGOFT2_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PERL_INCLUDES = @PERL_INCLUDES@
+PERL_INSTALL_DIR = @PERL_INSTALL_DIR@
+PERL_LIBS = @PERL_LIBS@
+PHP = @PHP@
+PHPCONFIG = @PHPCONFIG@
+PHP_INCLUDES = @PHP_INCLUDES@
+PHP_INSTALL_DATADIR = @PHP_INSTALL_DATADIR@
+PHP_INSTALL_DIR = @PHP_INSTALL_DIR@
+PHP_LIBS = @PHP_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PLATFORMSDKINCLUDE = @PLATFORMSDKINCLUDE@
+PLATFORMSDKLIB = @PLATFORMSDKLIB@
+POPPLER_CFLAGS = @POPPLER_CFLAGS@
+POPPLER_LIBS = @POPPLER_LIBS@
+PS2PDF = @PS2PDF@
+PYTHON3 = @PYTHON3@
+PYTHON3_INCLUDES = @PYTHON3_INCLUDES@
+PYTHON3_INSTALL_DIR = @PYTHON3_INSTALL_DIR@
+PYTHON3_LIBS = @PYTHON3_LIBS@
+QMAKE = @QMAKE@
+QTCORE_CFLAGS = @QTCORE_CFLAGS@
+QTCORE_LIBS = @QTCORE_LIBS@
+QTGUI_CFLAGS = @QTGUI_CFLAGS@
+QTGUI_LIBS = @QTGUI_LIBS@
+QUARTZ_CFLAGS = @QUARTZ_CFLAGS@
+QUARTZ_LIBS = @QUARTZ_LIBS@
+RANLIB = @RANLIB@
+RSVG_CFLAGS = @RSVG_CFLAGS@
+RSVG_LIBS = @RSVG_LIBS@
+RUBY = @RUBY@
+RUBY_CFLAGS = @RUBY_CFLAGS@
+RUBY_INSTALL_DIR = @RUBY_INSTALL_DIR@
+RUBY_LIBS = @RUBY_LIBS@
+RUBY_VER = @RUBY_VER@
+R_CFLAGS = @R_CFLAGS@
+R_LIBS = @R_LIBS@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHARED_LIBRARY_SUFFIX = @SHARED_LIBRARY_SUFFIX@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SWIG = @SWIG@
+SWIGJAVA_CPPFLAGS = @SWIGJAVA_CPPFLAGS@
+SWIG_PHP_DATA = @SWIG_PHP_DATA@
+SWIG_PHP_DATA_TO_PACKAGE = @SWIG_PHP_DATA_TO_PACKAGE@
+SWIG_PHP_OPT = @SWIG_PHP_OPT@
+SWIG_VERSION = @SWIG_VERSION@
+TCLCONFIG = @TCLCONFIG@
+TCLINT_INCLUDES = @TCLINT_INCLUDES@
+TCLSH = @TCLSH@
+TCLSH_EXEC_PREFIX = @TCLSH_EXEC_PREFIX@
+TCL_CFLAGS = @TCL_CFLAGS@
+TCL_DEFS = @TCL_DEFS@
+TCL_INCLUDES = @TCL_INCLUDES@
+TCL_INSTALL_DIR = @TCL_INSTALL_DIR@
+TCL_LIBS = @TCL_LIBS@
+TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@
+TCL_MINOR_VERSION = @TCL_MINOR_VERSION@
+TCL_PATCH_LEVEL = @TCL_PATCH_LEVEL@
+TCL_PKGINDEX = @TCL_PKGINDEX@
+TCL_PKGINDEX_GD = @TCL_PKGINDEX_GD@
+TCL_PKGINDEX_SWIG = @TCL_PKGINDEX_SWIG@
+TCL_SHLIB_SUFFIX = @TCL_SHLIB_SUFFIX@
+TCL_SRC_DIR = @TCL_SRC_DIR@
+TCL_STUB_LIB_SPEC = @TCL_STUB_LIB_SPEC@
+TCL_VERSION = @TCL_VERSION@
+VERSION = @VERSION@
+WEBP_CFLAGS = @WEBP_CFLAGS@
+WEBP_LIBS = @WEBP_LIBS@
+XMKMF = @XMKMF@
+XRENDER_CFLAGS = @XRENDER_CFLAGS@
+XRENDER_LIBS = @XRENDER_LIBS@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+Z_INCLUDES = @Z_INCLUDES@
+Z_LIBS = @Z_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_OBJC = @ac_ct_OBJC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+demodir = @demodir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+ltdl_LIBOBJS = @ltdl_LIBOBJS@
+ltdl_LTLIBOBJS = @ltdl_LTLIBOBJS@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sys_symbol_underscore = @sys_symbol_underscore@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+EXTRA_DIST = settings.ui
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu cmd/gvedit/ui/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu cmd/gvedit/ui/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	cscopelist-am ctags-am distclean distclean-generic \
+	distclean-libtool distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+all:
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

+ 552 - 0
graphviz.mod/graphviz/cmd/gvedit/ui/settings.ui

@@ -0,0 +1,552 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>404</width>
+    <height>512</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="minimumSize">
+   <size>
+    <width>404</width>
+    <height>509</height>
+   </size>
+  </property>
+  <property name="maximumSize">
+   <size>
+    <width>404</width>
+    <height>512</height>
+   </size>
+  </property>
+  <property name="windowTitle">
+   <string>Dialog</string>
+  </property>
+  <widget class="QFrame" name="frame">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>401</width>
+     <height>151</height>
+    </rect>
+   </property>
+   <property name="frameShape">
+    <enum>QFrame::StyledPanel</enum>
+   </property>
+   <property name="frameShadow">
+    <enum>QFrame::Sunken</enum>
+   </property>
+   <property name="lineWidth">
+    <number>2</number>
+   </property>
+   <widget class="QWidget" name="layoutWidget">
+    <property name="geometry">
+     <rect>
+      <x>10</x>
+      <y>10</y>
+      <width>381</width>
+      <height>131</height>
+     </rect>
+    </property>
+    <layout class="QVBoxLayout" name="verticalLayout_5">
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout">
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout">
+         <item>
+          <widget class="QLabel" name="label">
+           <property name="minimumSize">
+            <size>
+             <width>120</width>
+             <height>0</height>
+            </size>
+           </property>
+           <property name="text">
+            <string>Layout Engine</string>
+           </property>
+           <property name="margin">
+            <number>5</number>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QComboBox" name="cbLayout">
+           <property name="minimumSize">
+            <size>
+             <width>150</width>
+             <height>0</height>
+            </size>
+           </property>
+           <item>
+            <property name="text">
+             <string>dot</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>circo</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>fdp</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>neato</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>nop</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>nop1</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>nop2</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>osage</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>patchwork</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>sfdp</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>twopi</string>
+            </property>
+           </item>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_3">
+         <item>
+          <widget class="QLabel" name="label_3">
+           <property name="minimumSize">
+            <size>
+             <width>120</width>
+             <height>0</height>
+            </size>
+           </property>
+           <property name="text">
+            <string>Output file Type</string>
+           </property>
+           <property name="margin">
+            <number>5</number>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QComboBox" name="cbExtension">
+           <property name="minimumSize">
+            <size>
+             <width>150</width>
+             <height>0</height>
+            </size>
+           </property>
+           <item>
+            <property name="text">
+             <string>png</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>jpg</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>ps</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>dot</string>
+            </property>
+           </item>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_2">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <item>
+          <widget class="QLabel" name="label_2">
+           <property name="minimumSize">
+            <size>
+             <width>120</width>
+             <height>0</height>
+            </size>
+           </property>
+           <property name="text">
+            <string>Output File Name</string>
+           </property>
+           <property name="margin">
+            <number>5</number>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QLineEdit" name="leOutput">
+           <property name="readOnly">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="pbOut">
+           <property name="maximumSize">
+            <size>
+             <width>50</width>
+             <height>16777215</height>
+            </size>
+           </property>
+           <property name="text">
+            <string>...</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </widget>
+  </widget>
+  <widget class="QFrame" name="frame_2">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>150</y>
+     <width>401</width>
+     <height>61</height>
+    </rect>
+   </property>
+   <property name="frameShape">
+    <enum>QFrame::StyledPanel</enum>
+   </property>
+   <property name="frameShadow">
+    <enum>QFrame::Raised</enum>
+   </property>
+   <widget class="QWidget" name="layoutWidget1">
+    <property name="geometry">
+     <rect>
+      <x>2</x>
+      <y>0</y>
+      <width>391</width>
+      <height>62</height>
+     </rect>
+    </property>
+    <layout class="QHBoxLayout" name="horizontalLayout_7">
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_5">
+         <item>
+          <widget class="QLabel" name="label_5">
+           <property name="text">
+            <string>Scope</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QComboBox" name="cbScope">
+           <item>
+            <property name="text">
+             <string>graph</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>node</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>edge</string>
+            </property>
+           </item>
+          </widget>
+         </item>
+         <item>
+          <widget class="QLabel" name="label_6">
+           <property name="text">
+            <string>Name</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QComboBox" name="cbNameG"/>
+         </item>
+         <item>
+          <widget class="QComboBox" name="cbNameN"/>
+         </item>
+         <item>
+          <widget class="QComboBox" name="cbNameE"/>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_6">
+         <item>
+          <widget class="QLabel" name="label_7">
+           <property name="minimumSize">
+            <size>
+             <width>40</width>
+             <height>0</height>
+            </size>
+           </property>
+           <property name="maximumSize">
+            <size>
+             <width>47</width>
+             <height>16777215</height>
+            </size>
+           </property>
+           <property name="text">
+            <string>Value</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QLineEdit" name="leValue"/>
+         </item>
+        </layout>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout_3">
+       <item>
+        <widget class="QPushButton" name="pbAdd">
+         <property name="minimumSize">
+          <size>
+           <width>75</width>
+           <height>0</height>
+          </size>
+         </property>
+         <property name="text">
+          <string>Add</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="verticalSpacer">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>13</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <widget class="QPushButton" name="pbHelp">
+         <property name="minimumSize">
+          <size>
+           <width>75</width>
+           <height>0</height>
+          </size>
+         </property>
+         <property name="text">
+          <string>Help</string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </widget>
+  </widget>
+  <widget class="QFrame" name="frame_3">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>210</y>
+     <width>401</width>
+     <height>301</height>
+    </rect>
+   </property>
+   <property name="frameShape">
+    <enum>QFrame::StyledPanel</enum>
+   </property>
+   <property name="frameShadow">
+    <enum>QFrame::Raised</enum>
+   </property>
+   <widget class="QWidget" name="layoutWidget2">
+    <property name="geometry">
+     <rect>
+      <x>7</x>
+      <y>6</y>
+      <width>391</width>
+      <height>291</height>
+     </rect>
+    </property>
+    <layout class="QVBoxLayout" name="verticalLayout_4">
+     <item>
+      <widget class="QTextEdit" name="teAttributes"/>
+     </item>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout_10">
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_8">
+         <item>
+          <widget class="QPushButton" name="pbNew">
+           <property name="minimumSize">
+            <size>
+             <width>40</width>
+             <height>0</height>
+            </size>
+           </property>
+           <property name="maximumSize">
+            <size>
+             <width>40</width>
+             <height>16777215</height>
+            </size>
+           </property>
+           <property name="text">
+            <string>clear</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="pbOpen">
+           <property name="minimumSize">
+            <size>
+             <width>40</width>
+             <height>0</height>
+            </size>
+           </property>
+           <property name="maximumSize">
+            <size>
+             <width>40</width>
+             <height>16777215</height>
+            </size>
+           </property>
+           <property name="text">
+            <string>load</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="pbSave">
+           <property name="minimumSize">
+            <size>
+             <width>40</width>
+             <height>0</height>
+            </size>
+           </property>
+           <property name="maximumSize">
+            <size>
+             <width>40</width>
+             <height>16777215</height>
+            </size>
+           </property>
+           <property name="text">
+            <string>save</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <spacer name="horizontalSpacer_3">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_9">
+         <item>
+          <widget class="QPushButton" name="btnCancel">
+           <property name="text">
+            <string>Cancel</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="btnOK">
+           <property name="text">
+            <string>OK</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </widget>
+  </widget>
+  <action name="actionCSettingsOK">
+   <property name="text">
+    <string>CSettingsOK</string>
+   </property>
+  </action>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

+ 54 - 0
graphviz.mod/graphviz/cmd/gvmap/Makefile.am

@@ -0,0 +1,54 @@
+## Process this file with automake to produce Makefile.in
+
+AM_CPPFLAGS = \
+	-I$(top_srcdir)/lib \
+	-I$(top_srcdir)/lib/common \
+	-I$(top_srcdir)/lib/cgraph \
+	-I$(top_srcdir)/lib/cdt
+
+if WITH_SFDP
+bin_PROGRAMS = gvmap cluster
+dist_bin_SCRIPTS = gvmap.sh
+man_MANS = gvmap.1 cluster.1 gvmap.sh.1
+if ENABLE_MAN_PDFS
+pdf_DATA = gvmap.1.pdf cluster.1.pdf gvmap.sh.1.pdf
+endif
+endif
+
+noinst_HEADERS = make_map.h power.h country_graph_coloring.h
+
+gvmap_SOURCES = gvmap.c make_map.c power.c country_graph_coloring.c
+
+cluster_SOURCES = cluster.c make_map.c power.c country_graph_coloring.c
+
+gvmap_LDADD = \
+	$(top_builddir)/lib/sfdpgen/libsfdpgen_C.la \
+	$(top_builddir)/lib/edgepaint/libedgepaint_C.la \
+	$(top_builddir)/lib/neatogen/libneatogen_C.la \
+	$(top_builddir)/lib/sparse/libsparse_C.la \
+	$(top_builddir)/lib/gvc/libgvc.la \
+	$(top_builddir)/lib/cgraph/libcgraph.la \
+	$(top_builddir)/lib/rbtree/librbtree_C.la \
+	$(GTS_LIBS) -lm
+
+cluster_LDADD = \
+	$(top_builddir)/lib/sfdpgen/libsfdpgen_C.la \
+	$(top_builddir)/lib/edgepaint/libedgepaint_C.la \
+	$(top_builddir)/lib/neatogen/libneatogen_C.la \
+	$(top_builddir)/lib/sparse/libsparse_C.la \
+	$(top_builddir)/lib/gvc/libgvc.la \
+	$(top_builddir)/lib/cgraph/libcgraph.la \
+	$(top_builddir)/lib/rbtree/librbtree_C.la \
+	$(GTS_LIBS) -lm
+
+gvmap.sh :
+
+.1.1.pdf:
+	rm -f $@; pdffile=$@; psfile=$${pdffile%pdf}ps; \
+	$(GROFF) -Tps -man $< > $$psfile || { rm -f $$psfile; exit 1; }; \
+	$(PS2PDF) $$psfile && rm -f $$psfile || { rm -f $$psfile; exit 1; }
+SUFFIXES = .1 .1.pdf
+
+EXTRA_DIST = gvmap.1 cluster.1 gvmap.sh.1
+
+DISTCLEANFILES = $(pdf_DATA)

+ 1049 - 0
graphviz.mod/graphviz/cmd/gvmap/Makefile.in

@@ -0,0 +1,1049 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@WITH_SFDP_TRUE@bin_PROGRAMS = gvmap$(EXEEXT) cluster$(EXEEXT)
+subdir = cmd/gvmap
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \
+	$(top_srcdir)/m4/ax_compare_version.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltargz.m4 \
+	$(top_srcdir)/m4/ltdl.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/./version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__dist_bin_SCRIPTS_DIST) \
+	$(noinst_HEADERS) $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" \
+	"$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pdfdir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_cluster_OBJECTS = cluster.$(OBJEXT) make_map.$(OBJEXT) \
+	power.$(OBJEXT) country_graph_coloring.$(OBJEXT)
+cluster_OBJECTS = $(am_cluster_OBJECTS)
+am__DEPENDENCIES_1 =
+cluster_DEPENDENCIES = $(top_builddir)/lib/sfdpgen/libsfdpgen_C.la \
+	$(top_builddir)/lib/edgepaint/libedgepaint_C.la \
+	$(top_builddir)/lib/neatogen/libneatogen_C.la \
+	$(top_builddir)/lib/sparse/libsparse_C.la \
+	$(top_builddir)/lib/gvc/libgvc.la \
+	$(top_builddir)/lib/cgraph/libcgraph.la \
+	$(top_builddir)/lib/rbtree/librbtree_C.la \
+	$(am__DEPENDENCIES_1)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+am_gvmap_OBJECTS = gvmap.$(OBJEXT) make_map.$(OBJEXT) power.$(OBJEXT) \
+	country_graph_coloring.$(OBJEXT)
+gvmap_OBJECTS = $(am_gvmap_OBJECTS)
+gvmap_DEPENDENCIES = $(top_builddir)/lib/sfdpgen/libsfdpgen_C.la \
+	$(top_builddir)/lib/edgepaint/libedgepaint_C.la \
+	$(top_builddir)/lib/neatogen/libneatogen_C.la \
+	$(top_builddir)/lib/sparse/libsparse_C.la \
+	$(top_builddir)/lib/gvc/libgvc.la \
+	$(top_builddir)/lib/cgraph/libcgraph.la \
+	$(top_builddir)/lib/rbtree/librbtree_C.la \
+	$(am__DEPENDENCIES_1)
+am__dist_bin_SCRIPTS_DIST = gvmap.sh
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+SCRIPTS = $(dist_bin_SCRIPTS)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/config/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/cluster.Po \
+	./$(DEPDIR)/country_graph_coloring.Po ./$(DEPDIR)/gvmap.Po \
+	./$(DEPDIR)/make_map.Po ./$(DEPDIR)/power.Po
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(cluster_SOURCES) $(gvmap_SOURCES)
+DIST_SOURCES = $(cluster_SOURCES) $(gvmap_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+DATA = $(pdf_DATA)
+HEADERS = $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/config/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+ANN_CFLAGS = @ANN_CFLAGS@
+ANN_LIBS = @ANN_LIBS@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+CYGWIN = @CYGWIN@
+DARWIN = @DARWIN@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEVIL_INCLUDES = @DEVIL_INCLUDES@
+DEVIL_LIBS = @DEVIL_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+EXPAT_CFLAGS = @EXPAT_CFLAGS@
+EXPAT_LIBS = @EXPAT_LIBS@
+FGREP = @FGREP@
+FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@
+FREETYPE2_LIBS = @FREETYPE2_LIBS@
+GDIPLUS_CFLAGS = @GDIPLUS_CFLAGS@
+GDIPLUS_HEADS = @GDIPLUS_HEADS@
+GDIPLUS_LIBS = @GDIPLUS_LIBS@
+GDK_CFLAGS = @GDK_CFLAGS@
+GDK_LIBS = @GDK_LIBS@
+GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@
+GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@
+GDLIB_CFLAGS = @GDLIB_CFLAGS@
+GDLIB_CONFIG = @GDLIB_CONFIG@
+GDLIB_LIBS = @GDLIB_LIBS@
+GLADE_CFLAGS = @GLADE_CFLAGS@
+GLADE_LIBS = @GLADE_LIBS@
+GLUT_CFLAGS = @GLUT_CFLAGS@
+GLUT_LIBS = @GLUT_LIBS@
+GO = @GO@
+GO_INCLUDES = @GO_INCLUDES@
+GO_LIBS = @GO_LIBS@
+GRAPHVIZ_AUTHOR_EMAIL = @GRAPHVIZ_AUTHOR_EMAIL@
+GRAPHVIZ_AUTHOR_NAME = @GRAPHVIZ_AUTHOR_NAME@
+GRAPHVIZ_CHANGE_DATE = @GRAPHVIZ_CHANGE_DATE@
+GRAPHVIZ_VERSION_DATE = @GRAPHVIZ_VERSION_DATE@
+GRAPHVIZ_VERSION_MAJOR = @GRAPHVIZ_VERSION_MAJOR@
+GRAPHVIZ_VERSION_MICRO = @GRAPHVIZ_VERSION_MICRO@
+GRAPHVIZ_VERSION_MINOR = @GRAPHVIZ_VERSION_MINOR@
+GREP = @GREP@
+GROFF = @GROFF@
+GS_CFLAGS = @GS_CFLAGS@
+GS_LIBS = @GS_LIBS@
+GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@
+GTKGLEXT_LIBS = @GTKGLEXT_LIBS@
+GTKGL_CFLAGS = @GTKGL_CFLAGS@
+GTKGL_LIBS = @GTKGL_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+GTS_CFLAGS = @GTS_CFLAGS@
+GTS_LIBS = @GTS_LIBS@
+GUILE_CFLAGS = @GUILE_CFLAGS@
+GUILE_LIBS = @GUILE_LIBS@
+GVPLUGIN_CONFIG_FILE = @GVPLUGIN_CONFIG_FILE@
+GVPLUGIN_VERSION = @GVPLUGIN_VERSION@
+GVPLUGIN_VERSION_INFO = @GVPLUGIN_VERSION_INFO@
+HAVE_CXX17 = @HAVE_CXX17@
+INCLTDL = @INCLTDL@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTGOSIZE = @INTGOSIZE@
+IPSEPCOLA_INCLUDES = @IPSEPCOLA_INCLUDES@
+IPSEPCOLA_LIBS = @IPSEPCOLA_LIBS@
+JAVA = @JAVA@
+JAVASCRIPT = @JAVASCRIPT@
+JAVA_INCLUDES = @JAVA_INCLUDES@
+JAVA_LIBS = @JAVA_LIBS@
+JNI_EXTRA_LDFLAGS = @JNI_EXTRA_LDFLAGS@
+JSHEXT = @JSHEXT@
+LASI_CFLAGS = @LASI_CFLAGS@
+LASI_LIBS = @LASI_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBADD_DL = @LIBADD_DL@
+LIBADD_DLD_LINK = @LIBADD_DLD_LINK@
+LIBADD_DLOPEN = @LIBADD_DLOPEN@
+LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@
+LIBLTDL = @LIBLTDL@
+LIBOBJS = @LIBOBJS@
+LIBPOSTFIX = @LIBPOSTFIX@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTDLDEPS = @LTDLDEPS@
+LTDLINCL = @LTDLINCL@
+LTDLOPEN = @LTDLOPEN@
+LTLIBOBJS = @LTLIBOBJS@
+LT_ARGZ_H = @LT_ARGZ_H@
+LT_CONFIG_H = @LT_CONFIG_H@
+LT_DLLOADERS = @LT_DLLOADERS@
+LT_DLPREOPEN = @LT_DLPREOPEN@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+LUA = @LUA@
+LUA_INCLUDES = @LUA_INCLUDES@
+LUA_INSTALL_DIR = @LUA_INSTALL_DIR@
+LUA_LIBS = @LUA_LIBS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MATH_LIBS = @MATH_LIBS@
+MCS = @MCS@
+MINGW32 = @MINGW32@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJC = @OBJC@
+OBJCDEPMODE = @OBJCDEPMODE@
+OBJCFLAGS = @OBJCFLAGS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@
+PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@
+PANGOFT2_CFLAGS = @PANGOFT2_CFLAGS@
+PANGOFT2_LIBS = @PANGOFT2_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PERL_INCLUDES = @PERL_INCLUDES@
+PERL_INSTALL_DIR = @PERL_INSTALL_DIR@
+PERL_LIBS = @PERL_LIBS@
+PHP = @PHP@
+PHPCONFIG = @PHPCONFIG@
+PHP_INCLUDES = @PHP_INCLUDES@
+PHP_INSTALL_DATADIR = @PHP_INSTALL_DATADIR@
+PHP_INSTALL_DIR = @PHP_INSTALL_DIR@
+PHP_LIBS = @PHP_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PLATFORMSDKINCLUDE = @PLATFORMSDKINCLUDE@
+PLATFORMSDKLIB = @PLATFORMSDKLIB@
+POPPLER_CFLAGS = @POPPLER_CFLAGS@
+POPPLER_LIBS = @POPPLER_LIBS@
+PS2PDF = @PS2PDF@
+PYTHON3 = @PYTHON3@
+PYTHON3_INCLUDES = @PYTHON3_INCLUDES@
+PYTHON3_INSTALL_DIR = @PYTHON3_INSTALL_DIR@
+PYTHON3_LIBS = @PYTHON3_LIBS@
+QMAKE = @QMAKE@
+QTCORE_CFLAGS = @QTCORE_CFLAGS@
+QTCORE_LIBS = @QTCORE_LIBS@
+QTGUI_CFLAGS = @QTGUI_CFLAGS@
+QTGUI_LIBS = @QTGUI_LIBS@
+QUARTZ_CFLAGS = @QUARTZ_CFLAGS@
+QUARTZ_LIBS = @QUARTZ_LIBS@
+RANLIB = @RANLIB@
+RSVG_CFLAGS = @RSVG_CFLAGS@
+RSVG_LIBS = @RSVG_LIBS@
+RUBY = @RUBY@
+RUBY_CFLAGS = @RUBY_CFLAGS@
+RUBY_INSTALL_DIR = @RUBY_INSTALL_DIR@
+RUBY_LIBS = @RUBY_LIBS@
+RUBY_VER = @RUBY_VER@
+R_CFLAGS = @R_CFLAGS@
+R_LIBS = @R_LIBS@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHARED_LIBRARY_SUFFIX = @SHARED_LIBRARY_SUFFIX@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SWIG = @SWIG@
+SWIGJAVA_CPPFLAGS = @SWIGJAVA_CPPFLAGS@
+SWIG_PHP_DATA = @SWIG_PHP_DATA@
+SWIG_PHP_DATA_TO_PACKAGE = @SWIG_PHP_DATA_TO_PACKAGE@
+SWIG_PHP_OPT = @SWIG_PHP_OPT@
+SWIG_VERSION = @SWIG_VERSION@
+TCLCONFIG = @TCLCONFIG@
+TCLINT_INCLUDES = @TCLINT_INCLUDES@
+TCLSH = @TCLSH@
+TCLSH_EXEC_PREFIX = @TCLSH_EXEC_PREFIX@
+TCL_CFLAGS = @TCL_CFLAGS@
+TCL_DEFS = @TCL_DEFS@
+TCL_INCLUDES = @TCL_INCLUDES@
+TCL_INSTALL_DIR = @TCL_INSTALL_DIR@
+TCL_LIBS = @TCL_LIBS@
+TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@
+TCL_MINOR_VERSION = @TCL_MINOR_VERSION@
+TCL_PATCH_LEVEL = @TCL_PATCH_LEVEL@
+TCL_PKGINDEX = @TCL_PKGINDEX@
+TCL_PKGINDEX_GD = @TCL_PKGINDEX_GD@
+TCL_PKGINDEX_SWIG = @TCL_PKGINDEX_SWIG@
+TCL_SHLIB_SUFFIX = @TCL_SHLIB_SUFFIX@
+TCL_SRC_DIR = @TCL_SRC_DIR@
+TCL_STUB_LIB_SPEC = @TCL_STUB_LIB_SPEC@
+TCL_VERSION = @TCL_VERSION@
+VERSION = @VERSION@
+WEBP_CFLAGS = @WEBP_CFLAGS@
+WEBP_LIBS = @WEBP_LIBS@
+XMKMF = @XMKMF@
+XRENDER_CFLAGS = @XRENDER_CFLAGS@
+XRENDER_LIBS = @XRENDER_LIBS@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+Z_INCLUDES = @Z_INCLUDES@
+Z_LIBS = @Z_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_OBJC = @ac_ct_OBJC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+demodir = @demodir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+ltdl_LIBOBJS = @ltdl_LIBOBJS@
+ltdl_LTLIBOBJS = @ltdl_LTLIBOBJS@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sys_symbol_underscore = @sys_symbol_underscore@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AM_CPPFLAGS = \
+	-I$(top_srcdir)/lib \
+	-I$(top_srcdir)/lib/common \
+	-I$(top_srcdir)/lib/cgraph \
+	-I$(top_srcdir)/lib/cdt
+
+@WITH_SFDP_TRUE@dist_bin_SCRIPTS = gvmap.sh
+@WITH_SFDP_TRUE@man_MANS = gvmap.1 cluster.1 gvmap.sh.1
+@ENABLE_MAN_PDFS_TRUE@@WITH_SFDP_TRUE@pdf_DATA = gvmap.1.pdf cluster.1.pdf gvmap.sh.1.pdf
+noinst_HEADERS = make_map.h power.h country_graph_coloring.h
+gvmap_SOURCES = gvmap.c make_map.c power.c country_graph_coloring.c
+cluster_SOURCES = cluster.c make_map.c power.c country_graph_coloring.c
+gvmap_LDADD = \
+	$(top_builddir)/lib/sfdpgen/libsfdpgen_C.la \
+	$(top_builddir)/lib/edgepaint/libedgepaint_C.la \
+	$(top_builddir)/lib/neatogen/libneatogen_C.la \
+	$(top_builddir)/lib/sparse/libsparse_C.la \
+	$(top_builddir)/lib/gvc/libgvc.la \
+	$(top_builddir)/lib/cgraph/libcgraph.la \
+	$(top_builddir)/lib/rbtree/librbtree_C.la \
+	$(GTS_LIBS) -lm
+
+cluster_LDADD = \
+	$(top_builddir)/lib/sfdpgen/libsfdpgen_C.la \
+	$(top_builddir)/lib/edgepaint/libedgepaint_C.la \
+	$(top_builddir)/lib/neatogen/libneatogen_C.la \
+	$(top_builddir)/lib/sparse/libsparse_C.la \
+	$(top_builddir)/lib/gvc/libgvc.la \
+	$(top_builddir)/lib/cgraph/libcgraph.la \
+	$(top_builddir)/lib/rbtree/librbtree_C.la \
+	$(GTS_LIBS) -lm
+
+SUFFIXES = .1 .1.pdf
+EXTRA_DIST = gvmap.1 cluster.1 gvmap.sh.1
+DISTCLEANFILES = $(pdf_DATA)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .1 .1.pdf .c .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu cmd/gvmap/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu cmd/gvmap/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+cluster$(EXEEXT): $(cluster_OBJECTS) $(cluster_DEPENDENCIES) $(EXTRA_cluster_DEPENDENCIES) 
+	@rm -f cluster$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(cluster_OBJECTS) $(cluster_LDADD) $(LIBS)
+
+gvmap$(EXEEXT): $(gvmap_OBJECTS) $(gvmap_DEPENDENCIES) $(EXTRA_gvmap_DEPENDENCIES) 
+	@rm -f gvmap$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(gvmap_OBJECTS) $(gvmap_LDADD) $(LIBS)
+install-dist_binSCRIPTS: $(dist_bin_SCRIPTS)
+	@$(NORMAL_INSTALL)
+	@list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n' \
+	    -e 'h;s|.*|.|' \
+	    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) { files[d] = files[d] " " $$1; \
+	      if (++n[d] == $(am__install_max)) { \
+		print "f", d, files[d]; n[d] = 0; files[d] = "" } } \
+	    else { print "f", d "/" $$4, $$1 } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	     if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	     test -z "$$files" || { \
+	       echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	       $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	     } \
+	; done
+
+uninstall-dist_binSCRIPTS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	       sed -e 's,.*/,,;$(transform)'`; \
+	dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cluster.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/country_graph_coloring.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvmap.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/make_map.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/power.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+	@$(MKDIR_P) $(@D)
+	@echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.c.o:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-man1: $(man_MANS)
+	@$(NORMAL_INSTALL)
+	@list1=''; \
+	list2='$(man_MANS)'; \
+	test -n "$(man1dir)" \
+	  && test -n "`echo $$list1$$list2`" \
+	  || exit 0; \
+	echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+	$(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+	{ for i in $$list1; do echo "$$i"; done;  \
+	if test -n "$$list2"; then \
+	  for i in $$list2; do echo "$$i"; done \
+	    | sed -n '/\.1[a-z]*$$/p'; \
+	fi; \
+	} | while read p; do \
+	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; echo "$$p"; \
+	done | \
+	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+	sed 'N;N;s,\n, ,g' | { \
+	list=; while read file base inst; do \
+	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+	  fi; \
+	done; \
+	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+	while read files; do \
+	  test -z "$$files" || { \
+	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+	done; }
+
+uninstall-man1:
+	@$(NORMAL_UNINSTALL)
+	@list=''; test -n "$(man1dir)" || exit 0; \
+	files=`{ for i in $$list; do echo "$$i"; done; \
+	l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+	  sed -n '/\.1[a-z]*$$/p'; \
+	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+	dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+install-pdfDATA: $(pdf_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(pdf_DATA)'; test -n "$(pdfdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; \
+	done
+
+uninstall-pdfDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pdf_DATA)'; test -n "$(pdfdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pdfdir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(SCRIPTS) $(MANS) $(DATA) $(HEADERS)
+installdirs:
+	for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pdfdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+		-rm -f ./$(DEPDIR)/cluster.Po
+	-rm -f ./$(DEPDIR)/country_graph_coloring.Po
+	-rm -f ./$(DEPDIR)/gvmap.Po
+	-rm -f ./$(DEPDIR)/make_map.Po
+	-rm -f ./$(DEPDIR)/power.Po
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man install-pdfDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS install-dist_binSCRIPTS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+		-rm -f ./$(DEPDIR)/cluster.Po
+	-rm -f ./$(DEPDIR)/country_graph_coloring.Po
+	-rm -f ./$(DEPDIR)/gvmap.Po
+	-rm -f ./$(DEPDIR)/make_map.Po
+	-rm -f ./$(DEPDIR)/power.Po
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-dist_binSCRIPTS \
+	uninstall-man uninstall-pdfDATA
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+	clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-binPROGRAMS \
+	install-data install-data-am install-dist_binSCRIPTS \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-man1 install-pdf install-pdf-am \
+	install-pdfDATA install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \
+	uninstall-dist_binSCRIPTS uninstall-man uninstall-man1 \
+	uninstall-pdfDATA
+
+.PRECIOUS: Makefile
+
+
+gvmap.sh :
+
+.1.1.pdf:
+	rm -f $@; pdffile=$@; psfile=$${pdffile%pdf}ps; \
+	$(GROFF) -Tps -man $< > $$psfile || { rm -f $$psfile; exit 1; }; \
+	$(PS2PDF) $$psfile && rm -f $$psfile || { rm -f $$psfile; exit 1; }
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

+ 104 - 0
graphviz.mod/graphviz/cmd/gvmap/cluster.1

@@ -0,0 +1,104 @@
+.de TQ
+.  br
+.  ns
+.  TP \\$1
+..
+.TH CLUSTER 1 "3 March 2011"
+.SH NAME
+cluster \- find clusters in a graph and augment the graph with this information.
+.SH SYNOPSIS
+.B cluster
+[\fB\-v?\fP]
+[
+.BI \-C k
+]
+[
+.BI \-c k
+]
+[
+.B \-o
+.I outfile
+]
+[ 
+.I files
+]
+.SH DESCRIPTION
+.B cluster
+takes as input a graph in DOT format, finds node clusters and augments 
+the graph with this information. 
+The clusters are specified by the "cluster" attribute attached to nodes; cluster
+values are non-negative integers.
+.B cluster
+attempts to maximize the modularity of the clustering.
+If the edge attribute "weight" is defined, this will be used in 
+computing the clustering.
+.SH OPTIONS
+The following options are supported:
+.TP
+.BI \-C k 
+specifies a targeted number of clusters that should be generated.
+The specified number \fIk\fP is only a suggestion and may not be realisable. 
+If \fIk == 0\fP, the default, the number of clusters that approximately optimizes the modularity is returned.
+.TP
+.BI \-c k
+specifies clustering method.
+If \fIk == 0\fP, the default, modularity clustering will be used. 
+If \fIk == 1\fP modularity quality will be used.
+.TP
+.BI \-o outfile 
+Specifies that output should go into the file \fIoutfile\fP. By default,
+\fIstdout\fP is used.
+.TP
+.BI \-v 
+Verbose mode.
+.TP
+.BI \-?
+Prints the usage and exits.
+.SH EXAMPLES
+.PP
+Applying 
+.B cluster
+to the following graph,
+.PP
+.nf
+\fB   graph {
+       1--2 [weight=10.]
+       2--3 [weight=1]
+       3--4 [weight=10.]
+       4--5 [weight=10]
+       5--6 [weight=10]
+       3--6 [weight=0.1]
+       4--6 [weight=10.]
+      }\fP
+.fi
+.PP
+gives
+.PP
+.nf
+\fB   graph {
+         node [cluster="-1"];
+         1 [cluster=1];
+         2 [cluster=1];
+         3 [cluster=2];
+         4 [cluster=2];
+         5 [cluster=2];
+         6 [cluster=2];
+         1 -- 2 [weight="10."];
+         2 -- 3 [weight=1];
+         3 -- 4 [weight="10."];
+         4 -- 5 [weight=10];
+         5 -- 6 [weight=10];
+         3 -- 6 [weight="0.1"];
+         4 -- 6 [weight="10."];
+   }\fP
+.fi
+
+
+.SH AUTHOR
+Yifan Hu <[email protected]>
+.SH "SEE ALSO"
+.PP
+gvmap(1)
+.PP
+
+Blondel, V.D., Guillaume, J.L., Lambiotte, R., Lefebvre, E.: Fast unfolding of communities in large networks. Journal of Statistical Mechanics: Theory and Experiment (2008), P10008.

+ 131 - 0
graphviz.mod/graphviz/cmd/gvmap/cluster.c

@@ -0,0 +1,131 @@
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: Details at https://graphviz.org
+ *************************************************************************/
+
+#include "config.h"
+#include "../tools/openFile.h"
+#include <stdio.h>
+#include <stdlib.h>
+#define STANDALONE
+#include <sparse/general.h>
+#include <sparse/QuadTree.h>
+#include <time.h>
+#include <sparse/SparseMatrix.h>
+#include <getopt.h>
+#include <string.h>
+#include "make_map.h"
+#include <sfdpgen/spring_electrical.h>
+#include <sfdpgen/post_process.h>
+#include <neatogen/overlap.h>
+#include <sparse/clustering.h>
+#include <cgraph/ingraphs.h>
+#include <sparse/DotIO.h>
+#include <sparse/colorutil.h>
+#include <util/unreachable.h>
+
+typedef struct {
+  FILE* outfp;
+  char** infiles;
+  int maxcluster;
+  int clustering_method;
+} opts_t;
+
+static const char usestr[] =
+"    -C k - generate no more than k clusters (0)\n\
+       0 : no limit\n\
+    -c k - use clustering method k (0)\n\
+       0 : use modularity\n\
+       1 : use modularity quality\n\
+    -o <outfile> - output file (stdout)\n\
+    -v   - verbose mode\n\
+    -?   - print usage\n";
+
+static void usage(char* cmd, int eval)
+{
+    fprintf(stderr, "Usage: %s <options> graphfile\n", cmd);
+    fputs (usestr, stderr);
+    graphviz_exit(eval);
+}
+
+static void init(int argc, char *argv[], opts_t* opts) {
+  char* cmd = argv[0];
+  int c;
+  int v;
+
+  opts->maxcluster = 0;
+  opts->outfp = stdout;
+  Verbose = 0;
+
+  opts->clustering_method =  CLUSTERING_MODULARITY;
+  while ((c = getopt(argc, argv, ":vC:c:o:?")) != -1) {
+    switch (c) {
+    case 'c':
+      if (sscanf(optarg, "%d", &v) == 0 || v < 0) {
+	usage(cmd,1);
+      }
+      else opts->clustering_method = v;
+      break;
+    case 'C':
+      if (sscanf(optarg, "%d", &v) == 0 || v < 0) {
+	usage(cmd,1);
+      }
+      else opts->maxcluster = v;
+      break;
+    case 'o':
+      opts->outfp = openFile(cmd, optarg, "w");
+      break;
+    case 'v':
+      Verbose = 1;
+      break;
+    case '?':
+      if (optopt == '\0' || optopt == '?')
+	usage(cmd, 0);
+      else {
+	fprintf(stderr, " option -%c unrecognized\n",
+		optopt);
+	usage(cmd, 1);
+      }
+      break;
+    default:
+      UNREACHABLE();
+    }
+  }
+
+  argv += optind;
+  argc -= optind;
+  if (argc)
+    opts->infiles = argv;
+  else
+    opts->infiles = NULL;
+}
+
+static void clusterGraph (Agraph_t* g, int maxcluster, int clustering_method){
+  initDotIO(g);
+  attached_clustering(g, maxcluster, clustering_method);
+}
+
+int main(int argc, char *argv[])
+{
+  Agraph_t *g = 0, *prevg = 0;
+  ingraph_state ig;
+  opts_t opts;
+
+  init(argc, argv, &opts);
+
+  newIngraph(&ig, opts.infiles);
+
+  while ((g = nextGraph (&ig)) != 0) {
+    if (prevg) agclose (prevg);
+    clusterGraph (g, opts.maxcluster, opts.clustering_method);
+    agwrite(g, opts.outfp);
+    prevg = g;
+  }
+
+  graphviz_exit(0);
+}

+ 161 - 0
graphviz.mod/graphviz/cmd/gvmap/country_graph_coloring.c

@@ -0,0 +1,161 @@
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: Details at https://graphviz.org
+ *************************************************************************/
+
+#define STANDALONE
+#include "country_graph_coloring.h"
+#include <math.h>
+#include "power.h"
+#include <stdbool.h>
+#include <time.h>
+
+static void get_local_12_norm(int n, int i, const int *ia, const int *ja,
+    const int *p, double *norm){
+  int j, nz = 0;
+  norm[0] = n; norm[1] = 0;
+  for (j = ia[i]; j < ia[i+1]; j++){
+    if (ja[j] == i) continue;
+    norm[0] = fmin(norm[0], abs(p[i] - p[ja[j]]));
+    nz++;
+    norm[1] += abs(p[i] - p[ja[j]]);
+  }
+  if (nz > 0) norm[1] /= nz;
+}
+static void get_12_norm(int n, int *ia, int *ja, int *p, double *norm){
+  /* norm[0] := antibandwidth
+     norm[1] := (\sum_{{i,j}\in E} |p[i] - p[j]|)/|E|
+     norm[2] := (\sum_{i\in V} (Min_{{j,i}\in E} |p[i] - p[j]|)/|V|
+  */
+  int i, j, nz = 0;
+  double tmp;
+  norm[0] = n; norm[1] = 0; norm[2] = 0;
+  for (i = 0; i < n; i++){
+    tmp = n;
+    for (j = ia[i]; j < ia[i+1]; j++){
+      if (ja[j] == i) continue;
+      norm[0] = fmin(norm[0], abs(p[i] - p[ja[j]]));
+      norm[1] += abs(p[i] - p[ja[j]]);
+      tmp = fmin(tmp, abs(p[i] - p[ja[j]]));
+      nz++;
+    }
+    norm[2] += tmp;
+  }
+  norm[2] /= n;
+  norm[1] /= nz;
+}
+
+void improve_antibandwidth_by_swapping(SparseMatrix A, int *p){
+  bool improved = true;
+  int cnt = 1, n = A->m, i, j, *ia = A->ia, *ja = A->ja;
+  double norm1[3], norm2[3], norm11[3], norm22[3];
+  clock_t start = clock();
+  FILE *fp = NULL;
+  
+  if (Verbose){
+    fprintf(stderr,"saving timing vs antiband data to timing_greedy\n");
+    fp = fopen("timing_greedy","w");
+  }
+  assert(SparseMatrix_is_symmetric(A, true));
+  while (improved){
+    improved = false;
+    for (i = 0; i < n; i++){
+      get_local_12_norm(n, i, ia, ja, p, norm1);
+      for (j = 0; j < n; j++){
+	if (j == i) continue;
+	get_local_12_norm(n, j, ia, ja, p, norm2);
+	const int pi = p[i];
+	const int pj = p[j];
+	(p)[i] = pj;
+	(p)[j] = pi;
+	get_local_12_norm(n, i, ia, ja, p, norm11);
+	get_local_12_norm(n, j, ia, ja, p, norm22);
+	if (fmin(norm11[0], norm22[0]) > fmin(norm1[0], norm2[0])){
+	  improved = true;
+	  norm1[0] = norm11[0];
+	  norm1[1] = norm11[1];
+	  continue;
+	}
+	(p)[i] = pi;
+	(p)[j] = pj;
+      }
+      if (i%100 == 0 && Verbose) {
+	get_12_norm(n, ia, ja, p, norm1);
+	fprintf(fp, "%f %f %f\n", ((double)(clock() - start)) / CLOCKS_PER_SEC,
+	        norm1[0], norm1[2]);
+      }
+    }
+    if (Verbose) {
+      get_12_norm(n, ia, ja, p, norm1);
+      fprintf(stderr, "[%d] aband = %f, aband_avg = %f\n", cnt++, norm1[0], norm1[2]);
+      fprintf(fp,"%f %f %f\n", ((double)(clock() - start)) / CLOCKS_PER_SEC,
+              norm1[0], norm1[2]);
+    }
+  }
+  if (fp != NULL) {
+    fclose(fp);
+  }
+}
+  
+void country_graph_coloring(int seed, SparseMatrix A, int **p) {
+  int n = A->m, i, j, jj;
+  SparseMatrix L, A2;
+  int *ia = A->ia, *ja = A->ja;
+  int a = -1;
+  double nrow;
+  double norm1[3];
+  clock_t start, start2;
+
+  start = clock();
+  assert(A->m == A->n);
+  A2 = SparseMatrix_symmetrize(A, true);
+  ia = A2->ia; ja = A2->ja;
+
+  /* Laplacian */
+  L = SparseMatrix_new(n, n, 1, MATRIX_TYPE_REAL, FORMAT_COORD);
+  for (i = 0; i < n; i++){
+    nrow = 0.;
+    for (j = ia[i]; j < ia[i+1]; j++){
+      jj = ja[j];
+      if (jj != i){
+	nrow ++;
+	L = SparseMatrix_coordinate_form_add_entry(L, i, jj, &a);
+      }
+    }
+    L = SparseMatrix_coordinate_form_add_entry(L, i, i, &nrow);
+  }
+  {
+    SparseMatrix new = SparseMatrix_from_coordinate_format(L);
+    SparseMatrix_delete(L);
+    L = new;
+  }
+
+  /* largest eigen vector */
+  double *v = power_method(L, L->n, seed);
+
+  vector_ordering(n, v, p);
+  if (Verbose)
+    fprintf(stderr, "cpu time for spectral ordering (before greedy) = %f\n",
+            ((double)(clock() - start)) / CLOCKS_PER_SEC);
+
+  start2 = clock();
+  /* swapping */
+  improve_antibandwidth_by_swapping(A2, *p);
+  if (Verbose) {
+    fprintf(stderr, "cpu time for greedy refinement = %f\n",
+            ((double)(clock() - start2)) / CLOCKS_PER_SEC);
+
+    fprintf(stderr, "cpu time for spectral + greedy = %f\n",
+            ((double)(clock() - start)) / CLOCKS_PER_SEC);
+
+  }
+  get_12_norm(n, ia, ja, *p, norm1);
+
+  if (A2 != A) SparseMatrix_delete(A2);
+  SparseMatrix_delete(L);
+}

+ 17 - 0
graphviz.mod/graphviz/cmd/gvmap/country_graph_coloring.h

@@ -0,0 +1,17 @@
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: Details at https://graphviz.org
+ *************************************************************************/
+
+#pragma once
+
+#include <sparse/SparseMatrix.h>
+
+void country_graph_coloring(int seed, SparseMatrix A, int **p);
+
+void improve_antibandwidth_by_swapping(SparseMatrix A, int *p);

+ 167 - 0
graphviz.mod/graphviz/cmd/gvmap/gvmap.1

@@ -0,0 +1,167 @@
+.de TQ
+.  br
+.  ns
+.  TP \\$1
+..
+.TH GVMAP 1 "3 March 2011"
+.SH NAME
+gvmap \- find clusters and create a geographical map highlighting clusters.
+.SH SYNOPSIS
+.B gvmap
+[
+.I options
+]
+[
+.BI \-o
+.I outfile
+]
+[ 
+.I files
+]
+.SH DESCRIPTION
+.B gvmap
+takes as input a graph in DOT format, finds node clusters and produces a rendering of the graph as a geographic-style map, with clusters highlighted
+as countries, in xdot format.
+.P
+In the input graph, each node must have position, width and height information (pos, width and height attributes, 
+respectively) defined, and nodes must not overlap.
+.P
+By default, 
+.B gvmap
+will generate the clusters from the data. If desired, the input graph can specify
+cluster information by giving every node a \fIcluster\fP attribute whose value is
+a small positive integer. (It is works best if \fIcluster\fP values are all integers
+in the interval [1,K] for some K. Nodes sharing the same \fIcluster\fP attribute value will 
+be put into the same cluster. \fBN.B.\fP For the \fIcluster\fP attribute to be used,
+all nodes must have a valid value.
+.P
+If the \fI\-D\fP flag is used, 
+.B  gvmap
+will use the top-level cluster subgraphs to determine the clustering. Any nodes not in
+such a cluster will be put into a single catch-all cluster.
+.P
+If the input specifies the desired clustering as described above, it can also
+specify a desired coloring by having some node in each cluster provide a
+\fIclustercolor\fP attribute. \fBN.B.\fP Unless one specifies \fI\-c0\fP, only the \fIclustercolor\fP
+of the last node in a cluster has an effect. In addition, unless one uses \fI\-O\fP, \fBgvmap\fP may
+permute the given colors.
+.SH OPTIONS
+The following options are supported:
+.TP
+.BI \-a " k"
+The integer k specifies the average number of artificial points added along 
+the bounding box of the labels. Such artificial points are added to avoid 
+a country boundary cutting through the boundary box of the labels. Computing 
+time is proportional to k; hence, for large graphs, a small value of k is 
+suggested. If k = -1, a suitable value of k is automatically selected based on 
+the graph size. By default k = -1.
+.TP
+.BI \-b " v"
+The real number v specifies the line width used to draw the polygon boundaries, with v < 0 for no line. By default v = 0.
+.TP
+.BI \-c " k"
+The integer k specifies color scheme used to color the countries. By default k = 1.
+.TP
+   Acceptable values are:
+   0 : no polygons
+   1 : pastel
+   2 : blue to yellow
+   3 : white to red
+   4 : light grey to red
+   5 : primary colors
+   6 : sequential single hue red
+   7 : sequential single hue lighter red
+   8 : light grey
+.TP
+.BI \-c_opacity= xy
+Specifies a two-character hexadecimal string specifying the opacity of the polygons.
+.TP
+.BI \-C " d"
+The integer d specifies the maximum number of clusters (countries) allowed. By default d = 0, which means that there is no limit.
+.TP
+.BI \-d " d"
+The integer d specifies the random seed used during color assignment optimization that maximize color difference between neighboring countries.
+.TP
+.BI \-D
+If specified, the graph's cluster subgraphs are used to specify the clustering.
+.TP
+.BI \-e
+If specified, edges will be included in the final output.
+.TP
+.BI \-g " c"
+Specifies the bounding box color. If not specified, a bounding box is not drawn. 
+.TP
+.BI \-h " k"
+The number of artificial points added to maintain a bridge between endpoints. By default, this is zero.
+.TP
+.BI \-highlight= k
+Only draw cluster \fIk\fP. By default, all clusters are drawn.
+.TP
+.BI \-k 
+If specified, increases the randomness of outer boundary.
+.TP
+.BI \-l " s"
+Use the string \fIs\fP as a label for the drawing.
+.TP
+.BI \-m " v"
+Generate a margin of \fIv\fP points around the drawing. By default, this is determined by \fBgvmap\fP.
+.TP
+.BI \-O  
+Do NOT do color assignment optimization that maximizes color differences between neighboring countries
+.TP
+.BI \-o <file> 
+Put output in <file>. Default output is stdout
+.TP
+.BI \-p " k"
+Indicates what level of points should be shown. By default, no points are shown.
+.TP
+   Acceptable values are:
+   0 : no points
+   1 : all points
+   2 : label points
+   3 : random/artificial points
+.TP
+.BI \-Q
+Use modularity quality for clustering rather than the default modularity clustering.
+.TP
+.BI \-r " k"
+The number of random points k (integer) used to define sea and lake boundaries. If 0, auto assigned. By default v = 0
+.TP
+.BI \-s " v"
+The real number v specifies the depth of the sea and lake shores in points. If 0, auto assigned. By default v = 0.
+.TP
+.BI \-t " n"
+Make \fIn\fP attempts to improve cluster contiguity.
+.TP
+.BI \-v 
+Verbose mode.
+.TP
+.BI \-z " c" 
+Specified the polygon line color. Default is black.
+.TP
+.BI \-? 
+Print usage and exit.
+.SH EXAMPLES
+.PP
+Given a graph foo.gv, one way to generate a layout and highlight the clusters 
+is to first select a layout engine with a suitable overlap removal method, then 
+feed the output to gvmap, and finally render the map using specific graphics 
+format. For example, the following pipeline
+creates a map with edges in semi-transparent light gray and nodes laid 
+out using sfdp:
+.PP
+sfdp \-Goverlap=prism foo.gv | gvmap \-e | neato \-n2 \-Ecolor=#55555522 \-Tpng > foo.png
+.PP
+The shell script gvmap.sh provides a shorthand for such pipelines. For example, the
+above pipeline can be achieved using
+.PP
+gvmap.sh \-Ae \-Ecolor=#55555522 \-Tpng foo.gv > foo.png
+
+
+.SH AUTHOR
+Yifan Hu <[email protected]>
+.SH "SEE ALSO"
+.PP
+gvmap.sh(1), sfdp(1), neato(1), gvpr(1)
+.PP
+E. R. Gansner, Y. Hu, S. G. Kobourov, "GMap: Visualizing graphs and clusters as maps," Proc. Pacific Vis. 2010, pp. 201\(hy208.

+ 449 - 0
graphviz.mod/graphviz/cmd/gvmap/gvmap.c

@@ -0,0 +1,449 @@
+/**
+ * @file
+ * @brief creates a geographical map highlighting clusters
+ */
+
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: Details at https://graphviz.org
+ *************************************************************************/
+
+#include "config.h"
+#include "../tools/openFile.h"
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#define STANDALONE
+#include <sparse/general.h>
+#include <sparse/QuadTree.h>
+#include <time.h>
+#include <sparse/SparseMatrix.h>
+#include <getopt.h>
+#include <string.h>
+#include "make_map.h"
+#include <sfdpgen/spring_electrical.h>
+#include <sfdpgen/post_process.h>
+#include <neatogen/overlap.h>
+#include <sparse/clustering.h>
+#include <cgraph/ingraphs.h>
+#include <sparse/DotIO.h>
+#include <sparse/colorutil.h>
+#include <sparse/color_palette.h>
+#include <util/startswith.h>
+#include <util/unreachable.h>
+
+typedef struct {
+    char* cmd;
+    char **infiles; 
+    FILE* outfile;
+    int dim;
+    double shore_depth_tol;
+    int nrandom; 
+    double bbox_margin;
+    int useClusters;
+    int clusterMethod;
+    bool plotedges;
+    int color_scheme;
+    double line_width;
+    char *color_scheme_str;
+    const char *opacity;
+    int improve_contiguity_n;
+    int nart;
+    bool color_optimize;
+    int maxcluster;
+    int nedgep;
+    const char *line_color;
+    bool include_OK_points;
+    int highlight_cluster;
+    int seed;      /* seed used to calculate Fiedler vector */
+} params_t;
+
+static const char usestr[] =
+"   where graphfile must contain node positions, and widths and heights for each node. No overlap between nodes should be present. Acceptable options are: \n\
+    -a k - average number of artificial points added along the bounding box of the labels. If < 0, a suitable value is selected automatically. (-1)\n\
+    -b v - polygon line width, with v < 0 for no line. (0)\n\
+    -c k - polygon color scheme (1)\n\
+       0 : no polygons\n\
+       1 : pastel (default)\n\
+       2 : blue to yellow\n\
+       3 : white to red\n\
+       4 : light grey to red\n\
+       5 : primary colors\n\
+       6 : sequential single hue red \n\
+       7 : Adam color scheme\n\
+       8 : Adam blend\n\
+       9 : sequential single hue lighter red \n\
+      10 : light grey\n\
+    -c_opacity=xx - 2-character hex string for opacity of polygons\n\
+    -C k - generate at most k clusters. (0)\n\
+    -d s - seed used to calculate Fiedler vector for optimal coloring\n\
+    -D   - use top-level cluster subgraphs to specify clustering\n\
+    -e   - show edges\n\
+    -g c - bounding box color. If not specified, a bounding box is not drawn.\n\
+    -h k - number of artificial points added to maintain bridge between endpoints (0)\n\
+    -highlight=k - only draw cluster k\n\
+    -k   - increase randomness of boundary\n\
+    -l s - specify label\n\
+    -m v - bounding box margin. If 0, auto-assigned (0)\n\
+    -o <file> - put output in <file> (stdout)\n\
+    -O   - do NOT do color assignment optimization that maximizes color difference between neighboring countries\n\
+    -p k - ignored\n\
+    -r k - number of random points k used to define sea and lake boundaries. If 0, auto assigned. (0)\n\
+    -s v - depth of the sea and lake shores in points. If < 0, auto assigned. (0)\n\
+    -t n - improve contiguity up to n times. (0)\n\
+    -v   - verbose\n\
+    -z c - polygon line color (black)\n";
+
+/* 
+
+   -q f - output format (3)\n\
+       0 : Mathematica\n\
+       1 : PostScript\n\
+       2 : country map\n\
+       3 : dot format\n\
+*/
+    /* e.g., 
+       1 [cluster=10, clustercolor="#ff0000"]
+       2 [cluster=10]
+       (and no other nodes are in cluster10)
+
+       then since we can only use 1 color for the cluster 10, both 1 and 2 will be colored based on the color of node 2. However if you have
+
+       2 [cluster=10]
+       1 [cluster=10, clustercolor="#ff0000"]
+
+       then you get both colored red.
+       
+    */
+
+static void usage(char* cmd, int eval)
+{
+    fprintf(stderr, "Usage: %s <options> graphfile\n", cmd);
+    fputs (usestr, stderr);
+    graphviz_exit(eval);
+}
+
+#define HLPFX "ighlight="
+#define N_HLPFX (sizeof(HLPFX)-1)
+
+static void 
+init(int argc, char **argv, params_t* pm)
+{
+  char* cmd = argv[0];
+  int c;
+  double s;
+  int v, r;
+  char stmp[3];  /* two character string plus '\0' */
+
+  pm->outfile = NULL;
+  pm->opacity = NULL;
+  pm->color_scheme_str = NULL;
+  pm->nrandom = -1;
+  pm->dim = 2;
+  pm->shore_depth_tol = 0;
+  pm->highlight_cluster = 0;
+  pm->useClusters = 0;
+  pm->clusterMethod = CLUSTERING_MODULARITY;
+  pm->plotedges = false;
+  pm->color_scheme = COLOR_SCHEME_PASTEL; 
+  pm->line_width = 0;
+  pm->improve_contiguity_n = 0;
+  pm->nart = -1;
+  pm->color_optimize = true;
+  pm->maxcluster = 0;
+  pm->nedgep = 0;
+
+  pm->cmd = cmd;
+  pm->infiles = NULL;
+  pm->line_color = "#000000";
+  pm->include_OK_points = false;
+  pm->seed = 123;
+
+  pm->bbox_margin = 0;
+
+  opterr = 0;
+  while ((c = getopt(argc, argv, ":evODQko:m:s:r:p:c:C:l:b:g:t:a:h:z:d:?")) != -1) {
+    switch (c) {
+    case 'm':
+      if (sscanf(optarg, "%lf", &s) > 0 && s != 0) {
+	    pm->bbox_margin = s;
+      } else {
+        usage(cmd, 1);
+      }
+      break;
+    case 'Q':
+      pm->clusterMethod = CLUSTERING_MQ;
+      break;
+    case 's':
+      if (sscanf(optarg, "%lf", &s) > 0) {
+        pm->shore_depth_tol = s;
+      } else {
+        usage(cmd,1);
+      }
+      break;
+    case 'h':
+      if (sscanf(optarg, "%d", &v) > 0) {
+        pm->nedgep = MAX(0, v);
+      } else if (startswith(optarg, HLPFX) &&
+                 sscanf(optarg + N_HLPFX, "%d", &v) > 0) {
+        pm->highlight_cluster = MAX(0, v);
+      } else {
+        usage(cmd,1);
+      }
+      break;
+     case 'r':
+      if (sscanf(optarg, "%d", &r) > 0) {
+        pm->nrandom = r;
+      }
+      break;
+    case 't':
+      if (sscanf(optarg, "%d", &r) > 0 && r > 0) {
+        pm->improve_contiguity_n = r;
+      }
+      break;
+    case 'p': // ignored
+      break;
+    case 'k':
+      pm->include_OK_points = true;
+      break;
+    case 'v':
+      Verbose = 1;
+      break;
+    case 'D':
+      pm->useClusters = 1;
+      break;
+    case 'e':
+      pm->plotedges = true;
+      break;
+    case 'o':
+	  pm->outfile = openFile(pm->cmd, optarg, "w");
+      break;
+    case 'O':
+      pm->color_optimize = false;
+      break;
+    case 'a':
+      if (sscanf(optarg, "%d", &r) > 0) {
+	    pm->nart = r;
+      } else {
+	    usage(cmd,1);
+      }
+      break;
+    case 'c':
+      if (sscanf(optarg,"_opacity=%2s", stmp) > 0 && strlen(stmp) == 2){
+        pm->opacity = stmp;
+      } else if (sscanf(optarg, "%d", &r) > 0 && r >= COLOR_SCHEME_NONE &&
+                 r <= COLOR_SCHEME_GREY) {
+        pm->color_scheme = r;
+      } else if (knownColorScheme(optarg)) {
+        pm->color_scheme = COLOR_SCHEME_NONE;
+        pm->color_scheme_str = optarg;
+      } else {
+        fprintf(stderr,"-c option %s is invalid, must be a valid integer or string\n", optarg);
+        usage(cmd, 1);
+      }
+      break;
+    case 'd':
+      if (sscanf(optarg,"%d",&v) <= 0){
+        usage(cmd,1);
+      }
+      else
+        pm->seed = v;
+      break;
+    case 'C':
+      if (!(sscanf(optarg, "%d", &v) > 0 && v >= 0)) {
+        usage(cmd,1);
+      }
+      else
+        pm->maxcluster = v;
+      break;
+    case 'g':
+      // ignored
+      break;
+    case 'z': {
+      pm->line_color = optarg;
+      break;
+    }
+    case 'b':
+      if (sscanf(optarg,"%lf",&s) > 0) {
+        pm->line_width = s;
+      } else {
+        fprintf (stderr, "%s: unexpected argument \"%s\" for -b flag\n", cmd, optarg);
+      }
+      break;
+    case 'l':
+      // ignored
+      break;
+    case ':':
+      fprintf(stderr, "gvpack: option -%c missing argument - ignored\n", optopt);
+      break;
+    case '?':
+      if (optopt == '\0' || optopt == '?')
+        usage(cmd, 0);
+      else {
+        fprintf(stderr, " option -%c unrecognized\n", optopt);
+        usage(cmd, 1);
+      }
+      break;
+    default:
+      UNREACHABLE();
+    }
+  }
+
+  argv += optind;
+  argc -= optind;
+  if (argc)
+    pm->infiles = argv;
+  if (!pm->outfile)
+    pm->outfile = stdout;
+}
+
+static int
+validateCluster (int n, int* grouping, int clust_num)
+{
+  int i;
+  for (i = 0; i < n; i++) {
+      if (grouping[i] == clust_num) return clust_num;
+  }
+  fprintf (stderr, "Highlighted cluster %d not found - ignored\n", clust_num);
+  return 0;
+}
+
+/// @return 0 on success
+static int makeMap(SparseMatrix graph, int n, double *x, double *width,
+                   int *grouping, char **labels, float *fsz, float *rgb_r,
+                   float *rgb_g, float *rgb_b, params_t *pm, Agraph_t *g) {
+  int dim = pm->dim;
+  int i;
+  SparseMatrix poly_lines, polys, poly_point_map;
+  int nverts, *polys_groups;
+  double *x_poly;
+  SparseMatrix country_graph;
+  int improve_contiguity_n = pm->improve_contiguity_n;
+#ifdef TIME
+  clock_t  cpu;
+#endif
+  int nart0;
+  int nart, nrandom;
+
+#ifdef TIME
+  cpu = clock();
+#endif
+  nrandom = pm->nrandom; nart0 = nart = pm->nart;
+  if (pm->highlight_cluster) {
+    pm->highlight_cluster = validateCluster (n, grouping, pm->highlight_cluster);
+  }
+  if (make_map_from_rectangle_groups(pm->include_OK_points, n, dim, x, width,
+                                     grouping, graph, pm->bbox_margin, nrandom,
+                                     &nart, pm->nedgep, pm->shore_depth_tol,
+                                     &nverts, &x_poly, &poly_lines, &polys,
+                                     &polys_groups, &poly_point_map,
+                                     &country_graph, pm->highlight_cluster)
+                                     != 0) {
+    return -1;
+  }
+
+  if (Verbose) fprintf(stderr,"nart = %d\n",nart);
+  /* compute a good color permutation */
+  if (pm->color_optimize && country_graph && rgb_r && rgb_g && rgb_b) 
+    map_optimal_coloring(pm->seed, country_graph, rgb_r,  rgb_g, rgb_b);
+  else if (pm->color_scheme_str){
+    map_palette_optimal_coloring(pm->color_scheme_str, country_graph,
+               &rgb_r, &rgb_g, &rgb_b);
+  }
+
+#ifdef TIME
+  fprintf(stderr, "map making time = %f\n",((double) (clock() - cpu)) / CLOCKS_PER_SEC);
+#endif
+
+
+  /* now we check to see if all points in the same group are also in the same polygon, if not, the map is not very
+     contiguous so we move point positions to improve contiguity */
+  if (graph && improve_contiguity_n) {
+    for (i = 0; i < improve_contiguity_n; i++){
+      improve_contiguity(n, dim, grouping, poly_point_map, x, graph);
+      nart = nart0;
+      (void)make_map_from_rectangle_groups(pm->include_OK_points,
+				     n, dim, x, width, grouping, graph, pm->bbox_margin, nrandom, &nart, pm->nedgep, 
+				     pm->shore_depth_tol, &nverts, &x_poly, &poly_lines, 
+				     &polys, &polys_groups, &poly_point_map, &country_graph, pm->highlight_cluster);
+    }
+    {
+      SparseMatrix D = SparseMatrix_get_real_adjacency_matrix_symmetrized(graph);
+      remove_overlap(dim, D, x, width, 1000, 5000.,
+		     ELSCHEME_NONE, 0, NULL, NULL, true);
+      SparseMatrix_delete(D);
+      
+      nart = nart0;
+      (void)make_map_from_rectangle_groups(pm->include_OK_points,
+				     n, dim, x, width, grouping, graph, pm->bbox_margin, nrandom, &nart, pm->nedgep, 
+				     pm->shore_depth_tol, &nverts, &x_poly, &poly_lines, 
+				     &polys, &polys_groups, &poly_point_map, &country_graph, pm->highlight_cluster);
+    }
+    
+  }
+
+    Dot_SetClusterColor(g, rgb_r,  rgb_g,  rgb_b, grouping);
+    plot_dot_map(g, n, dim, x, polys, poly_lines, pm->line_width, pm->line_color, x_poly, polys_groups, labels, fsz, rgb_r, rgb_g, rgb_b, pm->opacity,
+           (pm->plotedges?graph:NULL), pm->outfile);
+  SparseMatrix_delete(polys);
+  SparseMatrix_delete(poly_lines);
+  SparseMatrix_delete(poly_point_map);
+  free(x_poly);
+  free(polys_groups);
+  return 0;
+}
+
+/// @return 0 on success
+static int mapFromGraph(Agraph_t *g, params_t *pm) {
+    SparseMatrix graph;
+  int n;
+  double* width = NULL;
+  double* x;
+  char** labels = NULL;
+  int* grouping;
+  float* rgb_r = NULL;
+  float* rgb_g = NULL;
+  float* rgb_b = NULL;
+  float* fsz;
+
+  initDotIO(g);
+  graph = Import_coord_clusters_from_dot(g, pm->maxcluster, pm->dim, &n, &width, &x, &grouping, 
+					   &rgb_r,  &rgb_g,  &rgb_b,  &fsz, &labels, pm->color_scheme, pm->clusterMethod, pm->useClusters);
+  const int rc = makeMap(graph, n, x, width, grouping, labels, fsz, rgb_r,
+                         rgb_g, rgb_b, pm, g);
+  free(rgb_r);
+  free(rgb_g);
+  free(rgb_b);
+  return rc;
+}
+
+int main(int argc, char *argv[])
+{
+  params_t pm;
+  Agraph_t* g;
+  Agraph_t* prevg = NULL;
+  ingraph_state ig;
+
+  init(argc, argv, &pm);
+
+  newIngraph(&ig, pm.infiles);
+  while ((g = nextGraph (&ig)) != 0) {
+    if (prevg) agclose (prevg);
+    if (mapFromGraph(g, &pm) != 0) {
+      graphviz_exit(EXIT_FAILURE);
+    }
+    prevg = g;
+  }
+
+  graphviz_exit(0);
+}
+
+/**
+ * @dir .
+ * @brief creates a geographical map highlighting clusters
+ */

+ 106 - 0
graphviz.mod/graphviz/cmd/gvmap/gvmap.sh

@@ -0,0 +1,106 @@
+#!/bin/sh
+
+# Script for gvmap pipeline
+# Use -A to add flags for gvmap; e.g., -Ae results in gvmap -e
+# -K can be used to change the original layout; by default, sfdp is used
+# -T is used to specify the final output format
+# -G, -N and -E flags can be used to tailor the rendering
+# -g, -n and -e flags can be used to tailor the initial layout
+# Be careful of spaces in the flags. If these are not wrapped in quotes, the
+# parts will be separated during option processing.
+
+LAYOUT=sfdp
+OPTSTR="vVA:G:E:N:g:e:n:K:T:o:"
+USAGE="Usage: gvmap [-vV] [-A gvmap flags] [-G attr=val] [-E attr=val] [-N attr=val] [-g attr=val] [-e attr=val] [-n attr=val] [-K layout] [-T output format] [-o outfile]"
+FLAGS1=
+FLAGS2=
+FLAGS3=
+
+while getopts ":$OPTSTR" c
+do
+  case $c in
+  v )
+    VERBOSE=1
+    FLAGS1="$FLAGS1 -v"
+    FLAGS2="$FLAGS2 -v"
+    FLAGS3="$FLAGS3 -v"
+    ;;
+  V )
+	dot -V
+    exit 0
+    ;;
+  K )
+    LAYOUT=$OPTARG
+    ;;
+  A )
+    FLAGS2="$FLAGS2 -$OPTARG"
+    ;;
+  T )
+    FLAGS3="$FLAGS3 -T$OPTARG"
+    ;;
+  e )
+      FLAGS1="$FLAGS1 -E$OPTARG"
+    ;;
+  n )
+      FLAGS1="$FLAGS1 -N$OPTARG"
+    ;;
+  g )
+      FLAGS1="$FLAGS1 -G$OPTARG"
+    ;;
+  E )
+      FLAGS3="$FLAGS3 -E$OPTARG"
+    ;;
+  N )
+      FLAGS3="$FLAGS3 -N$OPTARG"
+    ;;
+  G )
+      FLAGS3="$FLAGS3 -G$OPTARG"
+    ;;
+  o )
+      FLAGS3="$FLAGS3 -o$OPTARG"
+    ;;
+  :)
+    printf '%s requires a value\n' "$OPTARG" >&2
+    exit 2
+    ;;
+  \? )
+    if [ "$OPTARG" = "?" ]
+    then
+      printf '%s\n' "$USAGE"
+      exit 0
+    else
+      printf  'gvmap: unknown flag %s\n' "$OPTARG" >&2
+      printf '%s\n' "$USAGE"
+      exit 2
+    fi
+    ;;
+  esac
+done
+shift $((OPTIND-1))
+
+if [ $# -eq 0 ]
+then
+  if [ -n "$VERBOSE" ]
+  then
+    printf '%s -Goverlap=prism %s | gvmap %s | neato -n2 %s\n' "$LAYOUT" "$FLAGS1" "$FLAGS2" "$FLAGS3" >&2
+  fi
+  $LAYOUT -Goverlap=prism $FLAGS1 | gvmap $FLAGS2 | neato -n2 $FLAGS3
+else
+  while [ $# -gt 0 ]
+  do
+    if [ -f "$1" ]
+    then
+      if [ -n "$VERBOSE" ]
+      then
+        printf '%s -Goverlap=prism %s %s | gvmap %s | neato -n2 %s\n' "$LAYOUT" "$FLAGS1" "$1" "$FLAGS2" "$FLAGS3" >&2
+      fi
+      $LAYOUT -Goverlap=prism $FLAGS1 $1 | gvmap $FLAGS2 | neato -n2 $FLAGS3
+    else
+      printf 'gvmap: unknown input file %s - ignored\n' "$1" >&2
+    fi
+    shift
+  done
+fi
+
+
+

+ 101 - 0
graphviz.mod/graphviz/cmd/gvmap/gvmap.sh.1

@@ -0,0 +1,101 @@
+.de TQ
+.  br
+.  ns
+.  TP \\$1
+..
+.TH GVMAP.SH 1 "31 March 2011"
+.SH NAME
+gvmap.sh \- pipeline for running gvmap
+.SH SYNOPSIS
+.B gvmap.sh
+[\fB\-vV?\fP]
+[
+.I options
+]
+[
+.BI \-o
+.I outfile
+]
+[ 
+.I files
+]
+.SH DESCRIPTION
+.B gvmap.sh
+takes as input a graph in DOT format, performs a layout, runs the output through
+gvmap and renders the output. At some point, it is hoped to integrate all of these
+tasks into gvmap.
+.SH OPTIONS
+The following options are supported:
+.TP
+.BI \-a " k"
+The integer k specifies the average number of artificial points added along 
+the bounding box of the labels. Such artificial points are added to avoid 
+a country boundary cutting through the boundary box of the labels. Computing 
+time is proportional to k; hence, for large graphs, a small value of k is 
+suggested. If k = -1, a suitable value of k is automatically selected based on 
+the graph size. By default k = -1.
+.TP
+.BI \-K " layout" 
+specifies which program should be use for the initial layout. By default,
+sfdp is run. Also by default, the layout is passed the flag \-Goverlap=prism. This can be
+overridden using a \-g flag.
+.TP
+.BI \-T " format" 
+specifies the final output format. This works the same way as the \-T flag for any
+Graphviz layout program.
+.TP
+.BI \-N " attr=val"
+specifies the setting of a default node attribute during the rendering phase. This works the same way as 
+the \-N flag for any Graphviz layout program.
+.TP
+.BI \-G " attr=val"
+specifies the setting of a graph attribute during the rendering phase. This works the same way as 
+the \-G flag for any Graphviz layout program.
+.TP
+.BI \-E " attr=val"
+specifies the setting of a default edge attribute during the rendering phase. This works the same way as 
+the \-E flag for any Graphviz layout program.
+.TP
+.BI \-n " attr=val"
+specifies the setting of a default node attribute during the layout phase. This works the same way as 
+the \-N flag for any Graphviz layout program.
+.TP
+.BI \-g " attr=val"
+specifies the setting of a graph attribute during the layout phase. This works the same way as 
+the \-G flag for any Graphviz layout program.
+.TP
+.BI \-e " attr=val"
+specifies the setting of a default edge attribute during the layout phase. This works the same way as 
+the \-E flag for any Graphviz layout program.
+.TP
+.BI \-A " flag"
+specifies a flag to be passed to gvmap. For example, gvmap.sh \-Ae \-As3 causes gvmap \-e \-s3 to be run.
+.TP
+.BI \-v
+Set verbose mode.
+.TP
+.BI \-V
+Print version information and exit. 
+.TP
+.BI \-?
+Print usage information and exit. 
+
+.SH EXAMPLES
+.PP
+The following invocation
+creates a map with edges in semi-transparent light gray and nodes laid 
+out using sfdp:
+.PP
+gvmap.sh \-Ae \-Ecolor=#55555522 \-Tpng foo.gv > foo.png
+.PP
+It is equivalent to running the pipeline
+.PP
+sfdp \-Goverlap=prism foo.gv | gvmap \-e | neato \-n2 \-Ecolor=#55555522 \-Tpng > foo.png
+
+.SH AUTHOR
+Emden R. Gansner <[email protected]>
+.SH "SEE ALSO"
+.PP
+gvmap(1), sfdp(1), neato(1), gvpr(1)
+.PP
+E. R. Gansner, Y. Hu, S. G. Kobourov, "GMap: Visualizing graphs and clusters as maps," Proc. Pacific Vis. 2010, pp. 201\(hy208.

+ 1433 - 0
graphviz.mod/graphviz/cmd/gvmap/make_map.c

@@ -0,0 +1,1433 @@
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: Details at https://graphviz.org
+ *************************************************************************/
+
+#define STANDALONE
+#include <assert.h>
+#include <sparse/SparseMatrix.h>
+#include <sparse/general.h>
+#include <math.h>
+#include <sparse/QuadTree.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <string.h>
+#include <cgraph/list.h>
+#include <cgraph/cgraph.h>
+#include "make_map.h"
+#include <sfdpgen/stress_model.h>
+#include "country_graph_coloring.h"
+#include <sparse/colorutil.h>
+#include <neatogen/delaunay.h>
+#include <util/agxbuf.h>
+#include <util/alloc.h>
+#include <util/prisize_t.h>
+
+#include <edgepaint/lab.h>
+#include <edgepaint/node_distinct_coloring.h>
+
+void map_palette_optimal_coloring(char *color_scheme, SparseMatrix A0,
+				  float **rgb_r, float **rgb_g, float **rgb_b){
+  /*
+    for a graph A, get a distinctive color of its nodes so that the color distanmce among all nodes are maximized. Here
+    color distance on a node is defined as the minimum of color differences between a node and its neighbors.
+    color_scheme: rgb, gray, lab, or one of the color palettes in color_palettes.h, or a list of hex rgb colors separaterd by comma like "#ff0000,#00ff00"
+    A: the graph of n nodes
+    cdim: dimension of the color space
+    rgb_r, rgb_g, rgb_b: float array of length A->m + 1, which contains color for each country. 1-based
+  */
+ 
+  /*color: On input an array of size n*cdim, if NULL, will be allocated. On exit the final color assignment for node i is [cdim*i,cdim*(i+1)), in RGB (between 0 to 1)
+  */
+  double *colors = NULL;
+  int n = A0->m, i, cdim;
+
+  SparseMatrix A;
+  bool weightedQ = true;
+
+  {double *dist = NULL;
+    A = SparseMatrix_symmetrize(A0, false);
+    SparseMatrix_distance_matrix(A, &dist);
+    SparseMatrix_delete(A);
+    A = SparseMatrix_from_dense(n, n, dist);
+    free(dist);
+    A = SparseMatrix_remove_diagonal(A);
+    SparseMatrix_export(stdout, A);
+  }
+
+  // lightness: of the form 0,70, specifying the range of lightness of LAB
+  // color. Ignored if scheme is not COLOR_LAB.
+  int lightness[] = {0, 100};
+
+  // accuracy is the threshold given so that when finding the coloring for each
+  // node, the optimal is with in "accuracy" of the true global optimal.
+  const double accuracy = 0.01;
+
+  // seed: random_seed. If negative, consider -seed as the number of random
+  // start iterations
+  const int seed = -10;
+
+  node_distinct_coloring(color_scheme, lightness, weightedQ, A, accuracy, seed,
+                         &cdim, &colors);
+
+  if (A != A0){
+    SparseMatrix_delete(A);
+  }
+  *rgb_r = gv_calloc(n + 1, sizeof(float));
+  *rgb_g = gv_calloc(n + 1, sizeof(float));
+  *rgb_b = gv_calloc(n + 1, sizeof(float));
+
+  for (i = 0; i < n; i++){
+    (*rgb_r)[i+1] = (float) colors[cdim*i];
+    (*rgb_g)[i+1] = (float) colors[cdim*i + 1];
+    (*rgb_b)[i+1] = (float) colors[cdim*i + 2];
+  }
+  free(colors);
+}
+
+void map_optimal_coloring(int seed, SparseMatrix A, float *rgb_r,  float *rgb_g, float *rgb_b){
+  int *p = NULL;
+  float *u = NULL;
+  int n = A->m;
+  int i;
+
+  country_graph_coloring(seed, A, &p);
+
+  rgb_r++; rgb_b++; rgb_g++;/* seems necessary, but need to better think about cases when clusters are not contiguous */
+  vector_float_take(n, rgb_r, n, p, &u);
+  for (i = 0; i < n; i++) rgb_r[i] = u[i];
+  vector_float_take(n, rgb_g, n, p, &u);
+  for (i = 0; i < n; i++) rgb_g[i] = u[i];
+  vector_float_take(n, rgb_b, n, p, &u);
+  for (i = 0; i < n; i++) rgb_b[i] = u[i];
+  free(u);
+}
+
+static int get_poly_id(int ip, SparseMatrix point_poly_map){
+  return point_poly_map->ja[point_poly_map->ia[ip]];
+}
+ 
+void improve_contiguity(int n, int dim, int *grouping, SparseMatrix poly_point_map, double *x, SparseMatrix graph){
+ /* 
+     grouping: which group each of the vertex belongs to
+     poly_point_map: a matrix of dimension npolys x (n + nrandom), poly_point_map[i,j] != 0 if polygon i contains the point j.
+     .  If j < n, it is the original point, otherwise it is artificial point (forming the rectangle around a label) or random points.
+  */
+  int i, j, *ia, *ja, u, v;
+  SparseMatrix point_poly_map, D;
+  double dist;
+  int nbad = 0, flag;
+  int maxit = 10;
+
+  D = SparseMatrix_get_real_adjacency_matrix_symmetrized(graph);
+
+  assert(graph->m == n);
+  ia = D->ia; ja = D->ja;
+  double *a = D->a;
+
+  /* point_poly_map: each row i has only 1 entry at column j, which says that point i is in polygon j */
+  point_poly_map = SparseMatrix_transpose(poly_point_map);
+
+  for (i = 0; i < n; i++){
+    u = i;
+    for (j = ia[i]; j < ia[i+1]; j++){
+      v = ja[j];
+      dist = distance_cropped(x, dim, u, v);
+      if (grouping[u] != grouping[v]){
+	a[j] = 1.1*dist;
+      }	else if (get_poly_id(u, point_poly_map) == get_poly_id(v, point_poly_map)){
+	a[j] = dist;
+      } else {
+	nbad++;
+	a[j] = 0.9*dist;
+      }
+
+    }
+  }
+
+  if (Verbose) fprintf(stderr,"ratio (edges among discontiguous regions vs total edges)=%f\n",((double) nbad)/ia[n]);
+  stress_model(dim, D, &x, maxit, &flag);
+
+  assert(!flag);
+
+  SparseMatrix_delete(D);
+  SparseMatrix_delete(point_poly_map);
+}
+
+struct Triangle {
+  int vertices[3];/* 3 points */
+  double center[2]; /* center of the triangle */
+};
+
+static void normal(double v[], double normal[]){
+  if (v[0] == 0){
+    normal[0] = 1; normal[1] = 0;
+  } else {
+    normal[0] = -v[1];
+    normal[1] = v[0];
+  }
+}
+
+static void triangle_center(double x[], double y[], double z[], double c[]){
+  /* find the "center" c, which is the intersection of the 3 vectors that are normal to each
+     of the edges respectively, and which passes through the center of the edges respectively
+     center[{x_, y_, z_}] := Module[
+     {xy = 0.5*(x + y), yz = 0.5*(y + z), zx = 0.5*(z + x), nxy, nyz, 
+     beta, cen},
+     nxy = normal[y - x];
+     nyz = normal[y - z];
+     beta = (y-x).(xy - yz)/(nyz.(y-x));
+     cen = yz + beta*nyz;
+     Graphics[{Line[{x, y, z, x}], Red, Point[cen], Line[{cen, xy}], 
+     Line[{cen, yz}], Green, Line[{cen, zx}]}]
+     
+     ]
+ */
+  double xy[2], yz[2], nxy[2], nyz[2], ymx[2], ymz[2], beta, bot;
+  int i;
+
+  for (i = 0; i < 2; i++) ymx[i] = y[i] - x[i];
+  for (i = 0; i < 2; i++) ymz[i] = y[i] - z[i];
+  for (i = 0; i < 2; i++) xy[i] = 0.5*(x[i] + y[i]);
+  for (i = 0; i < 2; i++) yz[i] = 0.5*(y[i] + z[i]);
+
+
+  normal(ymx, nxy);
+  normal(ymz, nyz);
+  bot = nyz[0]*(x[0]-y[0])+nyz[1]*(x[1]-y[1]);
+  if (bot == 0){/* xy and yz are parallel */
+    c[0] = xy[0]; c[1] = xy[1];
+    return;
+  }
+  beta = ((x[0] - y[0])*(xy[0] - yz[0])+(x[1] - y[1])*(xy[1] - yz[1]))/bot;
+  c[0] = yz[0] + beta*nyz[0];
+  c[1] = yz[1] + beta*nyz[1];
+}
+
+static SparseMatrix matrix_add_entry(SparseMatrix A, int i, int j, int val){
+  int i1 = i, j1 = j;
+  if (i < j) {
+    i1 = j; j1 = i;
+  }
+  A = SparseMatrix_coordinate_form_add_entry(A, j1, i1, &val);
+  return SparseMatrix_coordinate_form_add_entry(A, i1, j1, &val);
+}
+
+static void plot_dot_edges(FILE *f, SparseMatrix A){
+  int i, *ia, *ja, j;
+
+  
+  int n = A->m;
+  ia = A->ia;
+  ja = A->ja;
+  for (i = 0; i < n; i++){
+    for (j = ia[i]; j < ia[i+1]; j++){
+      if (ja[j] == i) continue;
+      fprintf(f,"%d -- %d;\n",i,ja[j]);
+    }
+  }
+}
+
+static void plot_dot_labels(FILE *f, int n, int dim, double *x, char **labels, float *fsz){
+  int i;
+
+  for (i = 0; i < n; i++){
+    if (fsz){
+      fprintf(f, "%d [label=\"%s\", pos=\"%lf,%lf\", fontsize=%f];\n",i, labels[i], x[i*dim], x[i*dim+1], fsz[i]); 
+    } else {
+      fprintf(f, "%d [label=\"%s\", pos=\"%lf,%lf\"];\n",i, labels[i], x[i*dim], x[i*dim+1]); 
+    }
+  }
+
+}
+
+DEFINE_LIST(doubles, double)
+
+static void dot_polygon(agxbuf *sbuff, doubles_t xp, doubles_t yp,
+                        double line_width, bool fill, const char *cstring) {
+
+  assert(doubles_size(&xp) == doubles_size(&yp));
+  if (!doubles_is_empty(&xp)){
+    if (fill) {
+      agxbprint(sbuff,
+                " c %" PRISIZE_T " -%s C %" PRISIZE_T " -%s P %" PRISIZE_T " ",
+                strlen(cstring), cstring, strlen(cstring), cstring,
+                doubles_size(&xp));
+    } else {
+      if (line_width > 0){
+	size_t len_swidth = (size_t)snprintf(NULL, 0, "%f", line_width);
+	agxbprint(sbuff, " c %" PRISIZE_T " -%s S %" PRISIZE_T
+	          " -setlinewidth(%f) L %" PRISIZE_T " ", strlen(cstring), cstring,
+	          len_swidth + 14, line_width, doubles_size(&xp));
+      } else {
+	agxbprint(sbuff, " c %" PRISIZE_T " -%s L %" PRISIZE_T " ", strlen(cstring),
+	          cstring, doubles_size(&xp));
+      }
+    }
+    for (size_t i = 0; i < doubles_size(&xp); i++) {
+      agxbprint(sbuff, " %f %f", doubles_get(&xp, i), doubles_get(&yp, i));
+    }
+  }
+}
+
+static void plot_dot_polygons(agxbuf *sbuff, double line_width,
+                              const char *line_color, SparseMatrix polys,
+                              double *x_poly, int *polys_groups, float *r,
+                              float *g, float *b, const char *opacity) {
+  int i, j, *ia = polys->ia, *ja = polys->ja, *a = polys->a, npolys = polys->m, nverts = polys->n, ipoly,first;
+  const bool fill = false;
+  const bool use_line = line_width >= 0;
+  
+  agxbuf cstring_buffer = {0};
+  agxbput(&cstring_buffer, "#aaaaaaff");
+  char *cstring = agxbuse(&cstring_buffer);
+
+  doubles_t xp = {0};
+  doubles_t yp = {0};
+
+  if (Verbose) fprintf(stderr,"npolys = %d\n",npolys);
+  first = abs(a[0]); ipoly = first + 1;
+  for (i = 0; i < npolys; i++){
+    for (j = ia[i]; j < ia[i+1]; j++){
+      assert(ja[j] < nverts && ja[j] >= 0);
+      (void)nverts;
+      if (abs(a[j]) != ipoly){/* the first poly, or a hole */
+	ipoly = abs(a[j]);
+	if (r && g && b) {
+	  rgb2hex(r[polys_groups[i]], g[polys_groups[i]], b[polys_groups[i]],
+	          &cstring_buffer, opacity);
+	  cstring = agxbuse(&cstring_buffer);
+	}
+	dot_polygon(sbuff, xp, yp, line_width, fill, cstring);
+	// start a new polygon
+	doubles_clear(&xp);
+	doubles_clear(&yp);
+      } 
+      doubles_append(&xp, x_poly[2 * ja[j]]);
+      doubles_append(&yp, x_poly[2 * ja[j] + 1]);
+    }
+    if (use_line) {
+      dot_polygon(sbuff, xp, yp, line_width, fill, line_color);
+    } else {
+      /* why set fill to polys_groups[i]?*/
+      dot_polygon(sbuff, xp, yp, -1, true, cstring);
+    }
+  }
+  agxbfree(&cstring_buffer);
+  doubles_free(&xp);
+  doubles_free(&yp);
+}
+
+void plot_dot_map(Agraph_t* gr, int n, int dim, double *x, SparseMatrix polys,
+                  SparseMatrix poly_lines, double line_width,
+                  const char *line_color, double *x_poly, int *polys_groups,
+                  char **labels, float *fsz, float *r, float *g, float *b,
+                  const char* opacity, SparseMatrix A, FILE* f) {
+  /* if graph object exist, we just modify some attributes, otherwise we dump the whole graph */
+  bool plot_polyQ = true;
+  agxbuf sbuff = {0};
+
+  if (!r || !g || !b) plot_polyQ = false;
+
+  if (!gr) {
+    fprintf(f, "graph map {\n node [margin = 0 width=0.0001 height=0.00001 shape=plaintext];\n graph [outputorder=edgesfirst, bgcolor=\"#dae2ff\"]\n edge [color=\"#55555515\",fontname=\"Helvetica-Bold\"]\n");
+  } else {
+    agattr(gr, AGNODE, "margin", "0"); 
+    agattr(gr, AGNODE, "width", "0.0001"); 
+    agattr(gr, AGNODE, "height", "0.0001"); 
+    agattr(gr, AGNODE, "shape", "plaintext"); 
+    agattr(gr, AGNODE, "margin", "0"); 
+    agattr(gr, AGNODE, "fontname", "Helvetica-Bold"); 
+    agattr(gr, AGRAPH, "outputorder", "edgesfirst");
+    agattr(gr, AGRAPH, "bgcolor", "#dae2ff");
+    if (!A) agattr(gr, AGEDGE, "style","invis");/* do not plot edges */
+  }
+
+  /*polygons */
+  if (plot_polyQ) {
+    if (!gr) fprintf(f,"_background = \"");
+    plot_dot_polygons(&sbuff, -1., NULL, polys, x_poly, polys_groups, r, g, b, opacity);
+  }
+
+  /* polylines: line width is set here */
+  if (line_width >= 0){
+    plot_dot_polygons(&sbuff, line_width, line_color, poly_lines, x_poly, polys_groups, NULL, NULL, NULL, NULL);
+  }
+  if (!gr) {
+    fprintf(f,"%s",agxbuse(&sbuff));
+    fprintf(f,"\"\n");/* close polygons/lines */
+  } else {
+    agattr(gr, AGRAPH, "_background", agxbuse(&sbuff));
+    agwrite(gr, f);
+  }
+
+  /* nodes */
+  if (!gr && labels) plot_dot_labels(f, n, dim, x, labels, fsz);
+  /* edges */
+  if (!gr && A) plot_dot_edges(f, A);
+
+  /* background color + plot label?*/
+
+  if (!gr) fprintf(f, "}\n");
+
+  agxbfree(&sbuff);
+}
+
+/** construct triangles
+ *
+ * Always contains a self edge and is symmetric.
+ *
+ * @param n Number of points
+ * @param dim Dimension, only first2D is used
+ * @param x Point j is stored x[j × dim] -- x[j × dim + dim - 1]
+ * @param nt [out] Number of triangles
+ * @param T [out] triangles
+ * @param E [out] A matrix of size n×n, if two points i > j are connected by an
+ *   triangulation edge, and is neighboring two triangles t1 and t2, then
+ *   A[i, j] is both t1 and t2
+ * @return 0 on success
+ */
+static int get_tri(int n, int dim, double *x, int *nt, struct Triangle **T,
+                   SparseMatrix *E) {
+  int i, j, i0, i1, i2, ntri;
+  SparseMatrix A, B;
+
+  int* trilist = get_triangles(x, n, &ntri);
+  if (trilist == NULL) {
+    return -1;
+  }
+
+  *T = gv_calloc(ntri, sizeof(struct Triangle));
+
+  A = SparseMatrix_new(n, n, 1, MATRIX_TYPE_INTEGER, FORMAT_COORD);
+  for (i = 0; i < ntri; i++) {
+    for (j = 0; j < 3; j++) {
+      (*T)[i].vertices[j] = trilist[i * 3 + j];
+    }
+    i0 = (*T)[i].vertices[0]; i1 = (*T)[i].vertices[1]; i2 = (*T)[i].vertices[2];
+
+    triangle_center(&x[i0*dim], &x[i1*dim], &x[i2*dim], (*T)[i].center);
+    A = matrix_add_entry(A, i0, i1, i);
+    A = matrix_add_entry(A, i1, i2, i);
+    A = matrix_add_entry(A, i2, i0, i);
+  }
+
+  B = SparseMatrix_from_coordinate_format_not_compacted(A);
+  SparseMatrix_delete(A);
+  B = SparseMatrix_sort(B);
+  *E = B;
+
+  *nt = ntri;
+
+  free(trilist);
+  return 0;
+}
+
+static SparseMatrix get_country_graph(int n, SparseMatrix A, int *groups, int GRP_RANDOM, int GRP_BBOX){
+  /* form a graph each vertex is a group (a country), and a vertex is connected to another if the two countries shares borders.
+   since the group ID may not be contiguous (e.g., only groups 2,3,5, -1), we will return NULL if one of the group has non-positive ID! */
+  int *ia, *ja;
+  int one = 1, jj, i, j, ig1, ig2;
+  SparseMatrix B, BB;
+  int min_grp, max_grp;
+  
+  min_grp = max_grp = groups[0];
+  for (i = 0; i < n; i++) {
+    max_grp = MAX(groups[i], max_grp);
+    min_grp = MIN(groups[i], min_grp);
+  }
+  if (min_grp <= 0) return NULL;
+  B = SparseMatrix_new(max_grp, max_grp, 1, MATRIX_TYPE_INTEGER, FORMAT_COORD);
+  ia = A->ia;
+  ja = A->ja;
+  for (i = 0; i < n; i++){
+    ig1 = groups[i]-1;/* add a diagonal entry */
+    SparseMatrix_coordinate_form_add_entry(B, ig1, ig1, &one);
+    for (j = ia[i]; j < ia[i+1]; j++){
+      jj = ja[j];
+      if (i != jj && groups[i] != groups[jj] && groups[jj] != GRP_RANDOM && groups[jj] != GRP_BBOX){
+	ig1 = groups[i]-1; ig2 = groups[jj]-1;
+	SparseMatrix_coordinate_form_add_entry(B, ig1, ig2, &one);
+      }
+    }
+  }
+  BB = SparseMatrix_from_coordinate_format(B);
+  SparseMatrix_delete(B);
+  return BB;
+}
+
+static void conn_comp(int n, SparseMatrix A, int *groups, SparseMatrix *poly_point_map){
+  /* form a graph where only vertices that are connected as well as in the same group are connected */
+  int *ia, *ja;
+  int one = 1, jj, i, j;
+  SparseMatrix B, BB;
+  int ncomps, *comps = NULL;
+
+  B = SparseMatrix_new(n, n, 1, MATRIX_TYPE_INTEGER, FORMAT_COORD);
+  ia = A->ia;
+  ja = A->ja;
+  for (i = 0; i < n; i++){
+    for (j = ia[i]; j < ia[i+1]; j++){
+      jj = ja[j];
+      if (i != jj && groups[i] == groups[jj]){
+	SparseMatrix_coordinate_form_add_entry(B, i, jj, &one);
+      }
+    }
+  }
+  BB = SparseMatrix_from_coordinate_format(B);
+
+  int *comps_ptr = SparseMatrix_weakly_connected_components(BB, &ncomps, &comps);
+  SparseMatrix_delete(B);
+  SparseMatrix_delete(BB);
+  *poly_point_map = SparseMatrix_new(ncomps, n, n, MATRIX_TYPE_PATTERN, FORMAT_CSR);
+  free((*poly_point_map)->ia);
+  free((*poly_point_map)->ja);
+  (*poly_point_map)->ia = comps_ptr;
+  (*poly_point_map)->ja = comps;
+  (*poly_point_map)->nz = n;
+
+}
+
+static void get_poly_lines(int nt, SparseMatrix E, int ncomps, int *comps_ptr,
+                           int *comps, int *groups, SparseMatrix *poly_lines,
+                           int **polys_groups, int GRP_RANDOM, int GRP_BBOX) {
+  /*============================================================
+
+    polygon outlines 
+
+    ============================================================*/
+  int i, *tlist, nz, ipoly, nnt, ii, jj, t1, t2, t, cur, next, nn, j, nlink, sta;
+  int *elist, edim = 3;/* a list tell which vertex a particular vertex is linked with during poly construction.
+		since the surface is a cycle, each can only link with 2 others, the 3rd position is used to record how many links
+	      */
+  int *ie = E->ia, *je = E->ja, *e = E->a;
+  SparseMatrix A;
+
+  int *mask = gv_calloc(nt, sizeof(int));
+  for (i = 0; i < nt; i++) mask[i] = -1;
+  /* loop over every point in each connected component */
+  elist = gv_calloc(nt * edim, sizeof(int));
+  tlist = gv_calloc(nt * 2, sizeof(int));
+  *poly_lines = SparseMatrix_new(ncomps, nt, 1, MATRIX_TYPE_INTEGER, FORMAT_COORD);
+  *polys_groups = gv_calloc(ncomps, sizeof(int));
+
+  for (i = 0; i < nt; i++) elist[i*edim + 2] = 0;
+  nz = ie[E->m] - ie[0];
+
+  ipoly = 1;
+
+  for (i = 0; i < ncomps; i++){
+    nnt = 0;
+    for (j = comps_ptr[i]; j < comps_ptr[i+1]; j++){
+      ii = comps[j];
+
+      (*polys_groups)[i] = groups[ii];/* assign the grouping of each poly */
+
+      /* skip the country formed by random points */
+      if (groups[ii] == GRP_RANDOM || groups[ii] == GRP_BBOX) continue;
+
+      for (jj = ie[ii]; jj < ie[ii+1]; jj++){
+	if (groups[je[jj]] != groups[ii] && jj < nz - 1  && je[jj] == je[jj+1]){/* an triangle edge neighboring 2 triangles and two ends not in the same groups */
+	  t1 = e[jj];
+	  t2 = e[jj+1];
+
+	  nlink = elist[t1*edim + 2]%2;
+	  elist[t1*edim + nlink] = t2;/* t1->t2*/
+	  elist[t1*edim + 2]++;
+
+	  nlink = elist[t2*edim + 2]%2;
+	  elist[t2*edim + nlink] = t1;/* t1->t2*/
+	  elist[t2*edim + 2]++;
+
+	  tlist[nnt++] = t1; tlist[nnt++] = t2;
+	  jj++;
+	}
+      }
+    }/* done poly edges for this component i */
+
+    /* form one or more (if there is a hole) polygon outlines for this component  */
+    for (j = 0; j < nnt; j++){
+      t = tlist[j];
+      if (mask[t] != i){
+	cur = sta = t; mask[cur] = i;
+	next = neighbor(t, 1, edim, elist);
+	SparseMatrix_coordinate_form_add_entry(*poly_lines, i, cur, &ipoly);
+	while (next != sta){
+	  mask[next] = i;
+	  
+	  SparseMatrix_coordinate_form_add_entry(*poly_lines, i, next, &ipoly);
+
+	  nn = neighbor(next, 0, edim, elist);
+	  if (nn == cur) {
+	    nn = neighbor(next, 1, edim, elist);
+	  }
+	  assert(nn != cur);
+
+	  cur = next;
+	  next = nn;
+	}
+
+	SparseMatrix_coordinate_form_add_entry(*poly_lines, i, sta, &ipoly);/* complete a cycle by adding starting point */
+
+	ipoly++;
+      }
+
+    }/* found poly_lines for this comp */
+  }
+
+  A = SparseMatrix_from_coordinate_format_not_compacted(*poly_lines);
+  SparseMatrix_delete(*poly_lines);
+  *poly_lines = A;
+
+  free(tlist);
+  free(elist);
+  free(mask);
+}
+
+static void cycle_print(int head, int *cycle, int *edge_table){
+  int cur, next;
+
+  cur = head;
+  fprintf(stderr, "cycle (edges): {");
+  while ((next = cycle_next(cur)) != head){
+    fprintf(stderr, "%d,",cur);
+    cur = next;
+  }
+  fprintf(stderr, "%d}\n",cur);
+
+  cur = head;
+  fprintf(stderr, "cycle (vertices): ");
+  while ((next = cycle_next(cur)) != head){
+    fprintf(stderr, "%d--",edge_head(cur));
+    cur = next;
+  }
+  fprintf(stderr, "%d--%d\n",edge_head(cur),edge_tail(cur));
+}
+
+static int same_edge(int ecur, int elast, int *edge_table){
+  return (edge_head(ecur) == edge_head(elast) && edge_tail(ecur) == edge_tail(elast))
+	  || (edge_head(ecur) == edge_tail(elast) && edge_tail(ecur) == edge_head(elast));
+}
+
+static void get_polygon_solids(int nt, SparseMatrix E, int ncomps,
+                               int *comps_ptr, int *comps, SparseMatrix *polys)
+{
+  /*============================================================
+
+    polygon solids that will be colored
+
+    ============================================================*/
+  int *edge_table;/* a table of edges of the triangle graph. If two vertex u and v are connected and are adjacent to two triangles
+		     t1 and t2, then from u there are two edges to v, one denoted as t1->t2, and the other t2->t1. They are
+		     numbered as e1 and e2. edge_table[e1]={t1,t2} and edge_table[e2]={t2,t1}
+		  */
+  SparseMatrix half_edges;/* a graph of triangle edges. If two vertex u and v are connected and are adjacent to two triangles
+		     t1 and t2, then from u there are two edges to v, one denoted as t1->t2, and the other t2->t1. They are
+		     numbered as e1 and e2. Likewise from v to u there are also two edges e1 and e2.
+		  */
+
+  int n = E->m, *ie = E->ia, *je = E->ja, *e = E->a, ne, i, j, t1, t2, jj, ii;
+  int *cycle, cycle_head = 0;/* a list of edges that form a cycle that describe the polygon. cycle[e][0] gives the prev edge in the cycle from e,
+	       cycle[e][1] gives the next edge
+	     */
+  int *edge_cycle_map, NOT_ON_CYCLE = -1;/* map an edge e to its position on cycle, unless it does not exist (NOT_ON_CYCLE) */
+  int *emask;/* whether an edge is seen this iter */
+  enum {NO_DUPLICATE = -1};
+  int *elist, edim = 3;/* a list tell which edge a particular vertex is linked with when a voro cell has been visited,
+		since the surface is a cycle, each vertex can only link with 2 edges, the 3rd position is used to record how many links
+	      */
+
+  int k, duplicate, ee = 0, ecur, enext, eprev, cur, next, nn, nlink, head, elast = 0, etail, tail, ehead, efirst; 
+
+  int DEBUG_CYCLE = 0;
+  SparseMatrix B;
+
+  ne = E->nz;
+  edge_table = gv_calloc(ne * 2, sizeof(int));
+
+  half_edges = SparseMatrix_new(n, n, 1, MATRIX_TYPE_INTEGER, FORMAT_COORD);
+
+  ne = 0;
+  for (i = 0; i < n; i++){
+    for (j = ie[i]; j < ie[i+1]; j++){
+      if (j < ie[n] - ie[0] - 1 && i > je[j] && je[j] == je[j+1]){/* an triangle edge neighboring 2 triangles. Since E is symmetric, we only do one edge of E*/
+	t1 = e[j];
+	t2 = e[j+1];
+	jj = je[j];	  
+	assert(jj < n);
+	edge_table[ne*2] = t1;/*t1->t2*/
+	edge_table[ne*2+1] = t2;
+	half_edges = SparseMatrix_coordinate_form_add_entry(half_edges, i, jj, &ne);
+	half_edges = SparseMatrix_coordinate_form_add_entry(half_edges, jj, i, &ne);
+	ne++;
+
+	edge_table[ne*2] = t2;/*t2->t1*/
+	edge_table[ne*2+1] = t1;
+	half_edges = SparseMatrix_coordinate_form_add_entry(half_edges, i, jj, &ne);
+	half_edges = SparseMatrix_coordinate_form_add_entry(half_edges, jj, i, &ne);	
+
+
+	ne++;
+	j++;
+      }
+    }
+  }
+  assert(E->nz >= ne);
+
+  cycle = gv_calloc(ne * 2, sizeof(int));
+  B = SparseMatrix_from_coordinate_format_not_compacted(half_edges);
+  SparseMatrix_delete(half_edges);half_edges = B;
+
+  edge_cycle_map = gv_calloc(ne, sizeof(int));
+  emask = gv_calloc(ne, sizeof(int));
+  for (i = 0; i < ne; i++) edge_cycle_map[i] = NOT_ON_CYCLE;
+  for (i = 0; i < ne; i++) emask[i] = -1;
+
+  ie = half_edges->ia;
+  je = half_edges->ja;
+  e = half_edges->a;
+  elist = gv_calloc(nt * 3, sizeof(int));
+  for (i = 0; i < nt; i++) elist[i*edim + 2] = 0;
+
+  *polys = SparseMatrix_new(ncomps, nt, 1, MATRIX_TYPE_INTEGER, FORMAT_COORD);
+
+  for (i = 0; i < ncomps; i++){
+    if (DEBUG_CYCLE) fprintf(stderr, "\n ============  comp %d has %d members\n",i, comps_ptr[i+1]-comps_ptr[i]);
+    for (k = comps_ptr[i]; k < comps_ptr[i+1]; k++){
+      ii = comps[k];
+      duplicate = NO_DUPLICATE;
+      if (DEBUG_CYCLE) fprintf(stderr,"member = %d has %d neighbors\n",ii, ie[ii+1]-ie[ii]);
+      for (j = ie[ii]; j < ie[ii+1]; j++){
+	jj = je[j];
+	ee = e[j];
+	t1 = edge_head(ee);
+	if (DEBUG_CYCLE) fprintf(stderr," linked with %d using half-edge %d, {head,tail} of the edge = {%d, %d}\n",jj, ee, t1, edge_tail(ee));
+	nlink = elist[t1*edim + 2]%2;
+	elist[t1*edim + nlink] = ee;/* t1->t2*/
+	elist[t1*edim + 2]++;
+
+	if (edge_cycle_map[ee] != NOT_ON_CYCLE) duplicate = ee;
+	emask[ee] = ii;
+      }
+
+      if (duplicate == NO_DUPLICATE){
+	/* this must be the first time the cycle is being established, a new voro cell*/
+	ecur = ee;
+	cycle_head = ecur;
+	cycle_next(ecur) = ecur;
+	cycle_prev(ecur) = ecur;
+	edge_cycle_map[ecur] = 1;
+	head = cur = edge_head(ecur);
+	next = edge_tail(ecur);
+	if (DEBUG_CYCLE) fprintf(stderr, "NEW CYCLE\n starting with edge %d, {head,tail}={%d,%d}\n", ee, head, next);
+	while (next != head){
+	  enext = neighbor(next, 0, edim, elist);/* two voro edges linked with triangle "next" */
+	  if ((edge_head(enext) == cur && edge_tail(enext) == next)
+	      || (edge_head(enext) == next && edge_tail(enext) == cur)){/* same edge */
+	    enext = neighbor(next, 1, edim, elist);
+	  };
+	  if (DEBUG_CYCLE) fprintf(stderr, "cur edge = %d, next edge %d, {head,tail}={%d,%d},\n",ecur, enext, edge_head(enext), edge_tail(enext));
+	  nn = edge_head(enext);
+	  if (nn == next) nn = edge_tail(enext);
+	  cycle_next(enext) = cycle_next(ecur);
+	  cycle_prev(enext) = ecur;
+	  cycle_next(ecur) = enext;
+	  cycle_prev(ee) = enext;
+	  edge_cycle_map[enext] = 1;
+
+	  ecur = enext;
+	  cur = next;
+	  next = nn;
+	} 
+	if (DEBUG_CYCLE) cycle_print(ee, cycle,edge_table);
+      } else {
+	/* we found a duplicate edge, remove that, and all contiguous neighbors that overlap with the current voro
+	 */
+	ecur = ee = duplicate;
+	while (emask[ecur] == ii){
+	  /* contiguous overlapping edges, Cycling is not possible
+	     since the cycle can not complete surround the new voro cell and yet
+	     do not contain any other edges
+	  */
+	  ecur = cycle_next(ecur);
+	}
+	if (DEBUG_CYCLE) fprintf(stderr," duplicating edge = %d, starting from the a non-duplicating edge %d, search backwards\n",ee, ecur);
+
+	ecur = cycle_prev(ecur);
+	efirst = ecur;
+	while (emask[ecur] == ii){
+	  if (DEBUG_CYCLE) fprintf(stderr," remove edge %d (%d--%d)\n",ecur, edge_head(ecur), edge_tail(ecur));
+	  /* short this duplicating edge */
+	  edge_cycle_map[ecur] = NOT_ON_CYCLE;
+	  enext = cycle_next(ecur);
+	  eprev = cycle_prev(ecur);
+	  cycle_next(ecur) = ecur;/* isolate this edge */
+	  cycle_prev(ecur) = ecur;
+	  cycle_next(eprev) = enext;/* short */
+	  cycle_prev(enext) = eprev;
+	  elast = ecur;/* record the last removed edge */
+	  ecur = eprev;
+	}
+
+	if (DEBUG_CYCLE) {
+	  fprintf(stderr, "remaining (broken) cycle = ");
+	  cycle_print(cycle_next(ecur), cycle,edge_table);
+	}
+
+	/* we now have a broken cycle of head = edge_tail(ecur) and tail = edge_head(cycle_next(ecur)) */
+	ehead = ecur; etail = cycle_next(ecur);
+	cycle_head = ehead;
+	head = edge_tail(ehead); 
+	tail = edge_head(etail);
+
+	/* pick an edge ev from head in the voro that is a removed edge: since the removed edges form a path starting from
+	   efirst, and at elast (head of elast is head), usually we just need to check that ev is not the same as elast,
+	   but in the case of a voro filling in a hole, we also need to check that ev is not efirst,
+	   since in this case every edge of the voro cell is removed
+	 */
+	ecur = neighbor(head, 0, edim, elist);
+	if (same_edge(ecur, elast, edge_table)){
+	  ecur = neighbor(head, 1, edim, elist);
+	};
+
+	if (DEBUG_CYCLE) fprintf(stderr, "forwarding now from edge %d = {%d, %d}, try to reach vtx %d, first edge from voro = %d\n",
+				 ehead, edge_head(ehead), edge_tail(ehead), tail, ecur);
+
+	/* now go along voro edges till we reach the tail of the broken cycle*/
+	cycle_next(ehead) = ecur;
+	cycle_prev(ecur) = ehead;
+	cycle_prev(etail) = ecur;
+	cycle_next(ecur) = etail;
+	if (same_edge(ecur, efirst, edge_table)){
+	  if (DEBUG_CYCLE) fprintf(stderr, "this voro cell fill in a hole completely!!!!\n");
+	} else {
+	
+	  edge_cycle_map[ecur] = 1;
+	  head = cur = edge_head(ecur);
+	  next = edge_tail(ecur);
+	  if (DEBUG_CYCLE) fprintf(stderr, "starting with edge %d, {head,tail}={%d,%d}\n", ecur, head, next);
+	  while (next != tail){
+	    enext = neighbor(next, 0, edim, elist);/* two voro edges linked with triangle "next" */
+	    if ((edge_head(enext) == cur && edge_tail(enext) == next)
+		|| (edge_head(enext) == next && edge_tail(enext) == cur)){/* same edge */
+	      enext = neighbor(next, 1, edim, elist);
+	    };
+	    if (DEBUG_CYCLE) fprintf(stderr, "cur edge = %d, next edge %d, {head,tail}={%d,%d},\n",ecur, enext, edge_head(enext), edge_tail(enext));
+
+
+	    nn = edge_head(enext);
+	    if (nn == next) nn = edge_tail(enext);
+	    cycle_next(enext) = cycle_next(ecur);
+	    cycle_prev(enext) = ecur;
+	    cycle_next(ecur) = enext;
+	    cycle_prev(etail) = enext;
+	    edge_cycle_map[enext] = 1;
+	    
+	    ecur = enext;
+	    cur = next;
+	    next = nn;
+	  }
+	}
+
+      }
+      
+    }
+    /* done this component, load to sparse matrix, unset edge_map*/
+    ecur = cycle_head;
+    while ((enext = cycle_next(ecur)) != cycle_head){
+      edge_cycle_map[ecur] = NOT_ON_CYCLE;
+      head = edge_head(ecur);
+      SparseMatrix_coordinate_form_add_entry(*polys, i, head, &i);
+      ecur = enext;
+    }
+    edge_cycle_map[ecur] = NOT_ON_CYCLE;
+    head = edge_head(ecur); tail = edge_tail(ecur);
+    SparseMatrix_coordinate_form_add_entry(*polys, i, head, &i);
+    SparseMatrix_coordinate_form_add_entry(*polys, i, tail, &i);
+
+
+    /* unset edge_map */
+  }
+
+  B = SparseMatrix_from_coordinate_format_not_compacted(*polys);
+  SparseMatrix_delete(*polys);
+  *polys = B;
+  
+  SparseMatrix_delete(half_edges);
+  free(cycle);
+  free(edge_cycle_map);
+  free(elist);
+  free(emask);
+  free(edge_table);
+}
+
+static void get_polygons(int n, int nrandom, int dim, int *grouping, int nt,
+                         struct Triangle *Tp, SparseMatrix E, int *nverts,
+                         double **x_poly, SparseMatrix *poly_lines,
+                         SparseMatrix *polys, int **polys_groups,
+                         SparseMatrix *poly_point_map,
+                         SparseMatrix *country_graph) {
+  int i, j;
+  int *groups;
+  int maxgrp;
+  int *comps = NULL, *comps_ptr = NULL, ncomps;
+  int GRP_RANDOM, GRP_BBOX;
+
+  assert(dim == 2);
+  *nverts = nt;
+ 
+  groups = gv_calloc(n + nrandom, sizeof(int));
+  maxgrp = grouping[0];
+  for (i = 0; i < n; i++) {
+    maxgrp = MAX(maxgrp, grouping[i]);
+    groups[i] = grouping[i];
+  }
+
+  GRP_RANDOM = maxgrp + 1; GRP_BBOX = maxgrp + 2;
+  for (i = n; i < n + nrandom - 4; i++) {/* all random points in the same group */
+    groups[i] = GRP_RANDOM;
+  }
+  for (i = n + nrandom - 4; i < n + nrandom; i++) {/* last 4 pts of the expanded bonding box in the same group */
+    groups[i] = GRP_BBOX;
+  }
+  
+  /* finding connected components: vertices that are connected in the triangle graph, as well as in the same group */
+  conn_comp(n + nrandom, E, groups, poly_point_map);
+
+  ncomps = (*poly_point_map)->m;
+  comps = (*poly_point_map)->ja;
+  comps_ptr = (*poly_point_map)->ia;
+
+  /* connected components are such that  the random points and the bounding box 4 points forms the last
+     remaining components */
+  for (i = ncomps - 1; i >= 0; i--) {
+    if (groups[comps[comps_ptr[i]]] != GRP_RANDOM &&
+        groups[comps[comps_ptr[i]]] != GRP_BBOX) break;
+  }
+  ncomps = i + 1;
+  if (Verbose) fprintf(stderr,"ncomps = %d\n",ncomps);
+
+  *x_poly = gv_calloc(dim * nt, sizeof(double));
+  for (i = 0; i < nt; i++){
+    for (j = 0; j < dim; j++){
+      (*x_poly)[i*dim+j] = Tp[i].center[j];
+    }
+  }
+  
+  /*============================================================
+
+    polygon outlines 
+
+    ============================================================*/
+  get_poly_lines(nt, E, ncomps, comps_ptr, comps, groups, poly_lines,
+                 polys_groups, GRP_RANDOM, GRP_BBOX);
+
+  /*============================================================
+
+    polygon solids
+
+    ============================================================*/
+  get_polygon_solids(nt, E, ncomps, comps_ptr, comps, polys);
+
+  *country_graph = get_country_graph(n, E, groups, GRP_RANDOM, GRP_BBOX);
+
+  free(groups);
+}
+
+static int make_map_internal(bool include_OK_points, int n, int dim, double *x0,
+                             int *grouping0, SparseMatrix graph,
+                             double bounding_box_margin, int nrandom,
+                             int nedgep, double shore_depth_tol, int *nverts,
+                             double **x_poly, SparseMatrix *poly_lines,
+                             SparseMatrix *polys, int **polys_groups,
+                             SparseMatrix *poly_point_map,
+                             SparseMatrix *country_graph, int highlight_cluster) {
+
+
+  double xmax[2], xmin[2], area, *x = x0;
+  int i, j;
+  QuadTree qt;
+  int dim2 = 2, nn = 0;
+  int max_qtree_level = 10;
+  double ymin[2], min;
+  int imin, nzok = 0, nzok0 = 0, nt;
+  double *xran, point[2];
+  struct Triangle *Tp;
+  SparseMatrix E;
+  double boxsize[2];
+  bool INCLUDE_OK_POINTS = include_OK_points;/* OK points are random points inserted and found to be within shore_depth_tol of real/artificial points,
+			      including them instead of throwing away increase realism of boundary */
+  int *grouping = grouping0;
+
+  int HIGHLIGHT_SET = highlight_cluster;
+
+  for (j = 0; j < dim2; j++) {
+    xmax[j] = x[j];
+    xmin[j] = x[j];
+  }
+
+  for (i = 0; i < n; i++){
+    for (j = 0; j < dim2; j++) {
+      xmax[j] = fmax(xmax[j], x[i*dim+j]);
+      xmin[j] = fmin(xmin[j], x[i*dim+j]);
+    }
+  }
+  boxsize[0] = xmax[0] - xmin[0];
+  boxsize[1] = xmax[1] - xmin[1];
+  area = boxsize[0]*boxsize[1];
+
+  if (nrandom == 0) {
+    nrandom = n;
+  } else if (nrandom < 0){
+    nrandom = -nrandom * n;
+  } else if (nrandom < 4) {/* by default we add 4 point on 4 corners anyway */
+    nrandom = 0;
+  } else {
+    nrandom -= 4;
+  }
+
+  if (shore_depth_tol < 0) shore_depth_tol = sqrt(area/(double) n); /* set to average distance for random distribution */
+  if (Verbose) fprintf(stderr, "nrandom=%d shore_depth_tol=%.08f\n", nrandom, shore_depth_tol);
+
+
+  /* add artificial points along each edge to avoid as much as possible 
+     two connected components be separated due to small shore depth */
+  {
+    int nz;
+    double *y;
+    int k, t, np=nedgep;
+    if (graph && np){
+      fprintf(stderr,"add art np = %d\n",np);
+      nz = graph->nz;
+      y = gv_calloc(dim * n + dim * nz * np, sizeof(double));
+      for (i = 0; i < n*dim; i++) y[i] = x[i];
+      grouping = gv_calloc(n + nz * np, sizeof(int));
+      for (i = 0; i < n; i++) grouping[i] = grouping0[i];
+      nz = n;
+      for (i = 0; i < graph->m; i++){
+
+	for (j = graph->ia[i]; j < graph->ia[i+1]; j++){
+	  if (!HIGHLIGHT_SET || (grouping[i] == grouping[graph->ja[j]] && grouping[i] == HIGHLIGHT_SET)){
+	    for (t = 0; t < np; t++){
+	      for (k = 0; k < dim; k++){
+		y[nz*dim+k] = t/((double) np)*x[i*dim+k] + (1-t/((double) np))*x[(graph->ja[j])*dim + k];
+	      }
+	      assert(n + (nz-n)*np + t < n + nz*np && n + (nz-n)*np + t >= 0);
+	      if (t/((double) np) > 0.5){
+		grouping[nz] = grouping[i];
+	      } else {
+		grouping[nz] = grouping[graph->ja[j]];
+	      }
+	      nz++;
+	    }
+	  }
+	}
+      }
+      fprintf(stderr, "after adding edge points, n:%d->%d\n",n, nz);
+      n = nz;
+      x = y;
+      qt = QuadTree_new_from_point_list(dim, nz, max_qtree_level, y);
+    } else {
+      qt = QuadTree_new_from_point_list(dim, n, max_qtree_level, x);
+    }
+  }
+
+  /* generate random points for lake/sea effect */
+  if (nrandom != 0){
+    for (i = 0; i < dim2; i++) {
+      if (bounding_box_margin > 0){
+	xmin[i] -= bounding_box_margin;
+	xmax[i] += bounding_box_margin;
+      } else if (bounding_box_margin < 0) {
+	xmin[i] -= boxsize[i]*(-bounding_box_margin);
+	xmax[i] += boxsize[i]*(-bounding_box_margin);
+      } else { // auto bounding box
+	xmin[i] -= fmax(boxsize[i] * 0.2, 2.* shore_depth_tol);
+	xmax[i] += fmax(boxsize[i] * 0.2, 2 * shore_depth_tol);
+      }
+    }
+    if (Verbose) {
+      double bbm = bounding_box_margin;
+      if (bbm > 0)
+	fprintf (stderr, "bounding box margin: %.06f", bbm);
+      else if (bbm < 0)
+	fprintf (stderr, "bounding box margin: (%.06f * %.06f)", boxsize[0], -bbm);
+      else
+	fprintf(stderr, "bounding box margin: %.06f",
+	        fmax(boxsize[0] * 0.2, 2 * shore_depth_tol));
+    }
+    if (nrandom < 0) {
+      const double area2 = (xmax[1] - xmin[1]) * (xmax[0] - xmin[0]);
+      const double n1 = floor(area2 / (shore_depth_tol * shore_depth_tol));
+      const double n2 = n * floor(area2 / area);
+      nrandom = fmax(n1, n2);
+    }
+    srand(123);
+    xran = gv_calloc((nrandom + 4) * dim2, sizeof(double));
+    int nz = 0;
+    if (INCLUDE_OK_POINTS){
+      nzok0 = nzok = nrandom - 1;/* points that are within tolerance of real or artificial points */
+      if (grouping == grouping0) {
+        int *grouping2 = gv_calloc(n + nrandom, sizeof(int));
+        memcpy(grouping2, grouping, sizeof(int)*n);
+        grouping = grouping2;
+      } else {
+        grouping = gv_recalloc(grouping, n, n + nrandom, sizeof(int));
+      }
+    }
+    nn = n;
+
+    for (i = 0; i < nrandom; i++){
+
+      for (j = 0; j < dim2; j++){
+	point[j] = xmin[j] + (xmax[j] - xmin[j])*drand();
+      }
+      
+      QuadTree_get_nearest(qt, point, ymin, &imin, &min);
+
+      if (min > shore_depth_tol){/* point not too close, accepted */
+	for (j = 0; j < dim2; j++){
+	  xran[nz*dim2+j] = point[j];
+	}
+	nz++;
+      } else if (INCLUDE_OK_POINTS && min > shore_depth_tol/10){/* avoid duplicate points */
+	for (j = 0; j < dim2; j++){
+	  xran[nzok*dim2+j] = point[j];
+	}
+	grouping[nn++] = grouping[imin];
+	nzok--;
+
+      }
+
+    }
+    nrandom = nz;
+    if (Verbose) fprintf(stderr, "nn nrandom=%d\n", nrandom);
+  } else {
+    xran = gv_calloc(4 * dim2, sizeof(double));
+  }
+
+
+
+  /* add 4 corners even if nrandom = 0. The corners should be further away from the other points to avoid skinny triangles */
+  for (i = 0; i < dim2; i++) xmin[i] -= 0.2*(xmax[i]-xmin[i]);
+  for (i = 0; i < dim2; i++) xmax[i] += 0.2*(xmax[i]-xmin[i]);
+  i = nrandom;
+  for (j = 0; j < dim2; j++) xran[i*dim2+j] = xmin[j];
+  i++;
+  for (j = 0; j < dim2; j++) xran[i*dim2+j] = xmax[j];
+  i++;
+  xran[i*dim2] = xmin[0]; xran[i*dim2+1] = xmax[1];
+  i++;
+  xran[i*dim2] = xmax[0]; xran[i*dim2+1] = xmin[1];
+  nrandom += 4;
+
+
+  double *xcombined;
+  if (INCLUDE_OK_POINTS){
+    xcombined = gv_calloc((nn + nrandom) * dim2, sizeof(double));
+  } else {
+    xcombined = gv_calloc((n + nrandom) * dim2, sizeof(double));
+  }
+  for (i = 0; i < n; i++) {
+    for (j = 0; j < dim2; j++) xcombined[i*dim2+j] = x[i*dim+j];
+  }
+  for (i = 0; i < nrandom; i++) {
+    for (j = 0; j < dim2; j++) xcombined[(i + nn)*dim2+j] = xran[i*dim+j];
+  }
+
+  if (INCLUDE_OK_POINTS){
+    for (i = 0; i < nn - n; i++) {
+      for (j = 0; j < dim2; j++) xcombined[(i + n)*dim2+j] = xran[(nzok0 - i)*dim+j];
+    }
+    n = nn;
+  }
+
+
+  {
+    int nz, nh = 0;/* the set to highlight */
+    if (HIGHLIGHT_SET){
+      if (Verbose) fprintf(stderr," highlight cluster %d, n = %d\n",HIGHLIGHT_SET, n);
+      /* shift set to the beginning */
+      nz = 0;
+      for (i = 0; i < n; i++){
+	if (grouping[i] == HIGHLIGHT_SET){
+	  nh++;
+	  for (j = 0; j < dim; j++){
+	    xcombined[nz++] = x[i*dim+j];
+	  }
+	}
+      }
+      for (i = 0; i < n; i++){
+	if (grouping[i] != HIGHLIGHT_SET){
+	  for (j = 0; j < dim; j++){
+	    xcombined[nz++] = x[i*dim+j];
+	  }
+	}
+      }
+      assert(nz == n*dim);
+      for (i = 0; i < nh; i++){
+	grouping[i] = 1;
+      }
+      for (i = nh; i < n; i++){
+	grouping[i] = 2;
+      }
+      nrandom += n - nh;/* count everything except cluster HIGHLIGHT_SET as random */
+      n = nh;
+      if (Verbose) fprintf(stderr,"nh = %d\n",nh);
+    }
+  }
+
+  int rc = 0;
+  if (get_tri(n + nrandom, dim2, xcombined, &nt, &Tp, &E) != 0) {
+    rc = -1;
+    goto done;
+  }
+  get_polygons(n, nrandom, dim2, grouping, nt, Tp, E, nverts, x_poly,
+               poly_lines, polys, polys_groups, poly_point_map, country_graph);
+
+  SparseMatrix_delete(E);
+  free(Tp);
+done:
+  free(xcombined);
+  free(xran);
+  if (grouping != grouping0) free(grouping);
+  if (x != x0) free(x);
+  return rc;
+}
+
+static void add_point(int *n, int igrp, double **x, int *nmax, double point[], int **groups){
+
+  if (*n >= *nmax){
+    int old_nmax = *nmax;
+    *nmax = 20 + *n;
+    *x = gv_recalloc(*x, 2 * old_nmax, 2 * *nmax, sizeof(double));
+    *groups = gv_recalloc(*groups, old_nmax, *nmax, sizeof(int));
+  }
+
+  (*x)[(*n)*2] = point[0];
+  (*x)[(*n)*2+1] = point[1];
+  (*groups)[*n] = igrp;
+  (*n)++;
+}
+
+static void get_boundingbox(int n, int dim, double *x, double *width, double *bbox){
+  int i;
+  bbox[0] = bbox[1] = x[0];
+  bbox[2] = bbox[3] = x[1];
+  
+  for (i = 0; i < n; i++){
+    bbox[0] = fmin(bbox[0], x[i * dim] - width[i * dim]);
+    bbox[1] = fmax(bbox[1], x[i * dim] + width[i * dim]);
+    bbox[2] = fmin(bbox[2], x[i * dim + 1] - width[i * dim + 1]);
+    bbox[3] = fmax(bbox[3], x[i * dim + 1] + width[i * dim + 1]);
+  }
+}
+
+int make_map_from_rectangle_groups(bool include_OK_points,
+				   int n, int dim, double *x, double *sizes, 
+				   int *grouping, SparseMatrix graph, double bounding_box_margin, int nrandom, int *nart, int nedgep, 
+				   double shore_depth_tol,
+				   int *nverts, double **x_poly, 
+				   SparseMatrix *poly_lines, SparseMatrix *polys, int **polys_groups, SparseMatrix *poly_point_map, 
+				   SparseMatrix *country_graph, int highlight_cluster){
+
+  /* create a list of polygons from a list of rectangles in 2D. rectangles belong to groups. rectangles in the same group that are also close 
+     geometrically will be in the same polygon describing the outline of the group. The main difference for this function and
+     make_map_from_point_groups is that in this function, the input are points with width/heights, and we try not to place
+     "lakes" inside these rectangles. This is achieved approximately by adding artificial points along the perimeter of the rectangles,
+     as well as near the center.
+
+     input:
+     include_OK_points: OK points are random points inserted and found to be within shore_depth_tol of real/artificial points,
+     .                  including them instead of throwing away increase realism of boundary 
+     n: number of points
+     dim: dimension of the points. If dim > 2, only the first 2D is used.
+     x: coordinates
+     sizes: width and height
+     grouping: which group each of the vertex belongs to
+     graph: the link structure between points. If graph == NULL, this is not used. otherwise
+     .      it is assumed that matrix is symmetric and the graph is undirected
+     bounding_box_margin: margin used to form the bounding box.
+     .      if negative, it is taken as relative. i.e., -0.5 means a margin of 0.5*box_size
+     nrandom (input): number of random points to insert in the bounding box to figure out lakes and seas.
+     .        If nrandom = 0, no points are inserted, if nrandom < 0, the number is decided automatically.
+     .        
+     nart: on entry, number of artificial points to be added along each side of a rectangle enclosing the labels. if < 0, auto-selected.
+     . On exit, actual number of artificial points added.
+     nedgep: number of artificial points are adding along edges to establish as much as possible a bright between nodes 
+     .       connected by the edge, and avoid islands that are connected. k = 0 mean no points.
+     shore_depth_tol: nrandom random points are inserted in the bounding box of the points,
+     .      such random points are then weeded out if it is within distance of shore_depth_tol from 
+     .      real points. If 0, auto assigned
+
+     output:
+     nverts: number of vertices in the Voronoi diagram
+     x_poly: the 2D coordinates of these polygons, dimension nverts*2
+     poly_lines: the sparse matrix representation of the polygon indices, as well as their identity. The matrix is of size
+     .       npolygons x nverts. The i-th polygon is formed by linking vertices with index in the i-th row of the sparse matrix.
+     .       Each row is of the form {{i,j1,m},...{i,jk,m},{i,j1,m},{i,l1,m+1},...}, where j1--j2--jk--j1 form one loop,
+     .       and l1 -- l2 -- ... form another. Each row can have more than 1 loop only when the connected region the polylines represent
+     .       has at least 1 holes.
+     polys: the sparse matrix representation of the polygon indices, as well as their identity. The matrix is of size
+     .       npolygons x nverts. The i-th polygon is formed by linking vertices with index in the i-th row of the sparse matrix.
+     .       Unlike poly_lines, here each row represent an one stroke drawing of the SOLID polygon, vertices
+     .       along this path may repeat
+     polys_groups: the group (color) each polygon belongs to, this include all groups of the real points,
+     .       plus the random point group and the bounding box group
+     poly_point_map: a matrix of dimension npolys x (n + nrandom), poly_point_map[i,j] != 0 if polygon i contains the point j.
+     .  If j < n, it is the original point, otherwise it is artificial point (forming the rectangle around a label) or random points.
+    country_graph: shows which country is a neighbor of which country.
+     .     if country i and country j are neighbor, then the {i,j} entry is the total number of vertices that
+     .     belongs to i and j, and share an edge of the triangulation. In addition, {i,i} and {j,j} have values equal 
+     .     to the number of vertices in each of the countries. If the input "grouping" has negative or zero value, then
+     .     country_graph = NULL. 
+
+     
+  */
+  double *X;
+  int N, nmax, i, j, k, igrp;
+  int *groups, K = *nart;/* average number of points added per side of rectangle */
+
+  double avgsize[2],  avgsz, h[2], p1, p0;
+  double point[2];
+  int nadded[2];
+  double delta[2];
+  double bbox[4];
+
+  if (K < 0){
+    K = (int) 10/(1+n/400.);/* 0 if n > 3600*/
+  }
+  *nart = 0;
+  if (Verbose){
+    int maxgp = grouping[0];
+    int mingp = grouping[0];
+    for (i = 0; i < n; i++) {
+      maxgp = MAX(maxgp, grouping[i]);
+      mingp = MIN(mingp, grouping[i]);
+    }
+    fprintf(stderr, "max grouping - min grouping + 1 = %d\n",maxgp - mingp + 1); 
+  }
+
+  int rc = 0;
+  if (!sizes){
+    return make_map_internal(include_OK_points, n, dim, x, grouping, graph,
+                             bounding_box_margin, nrandom, nedgep,
+                             shore_depth_tol, nverts, x_poly, poly_lines, polys,
+                             polys_groups, poly_point_map, country_graph,
+                             highlight_cluster);
+  } else {
+
+    /* add artificial node due to node sizes */
+    avgsize[0] = 0;
+    avgsize[1] = 0;
+    for (i = 0; i < n; i++){
+      for (j = 0; j < 2; j++) {
+	avgsize[j] += sizes[i*dim+j];
+      }
+    }
+    for (i = 0; i < 2; i++) avgsize[i] /= n;
+    avgsz = 0.5*(avgsize[0] + avgsize[1]);
+    if (Verbose) fprintf(stderr, "avgsize = {%f, %f}\n",avgsize[0], avgsize[1]);
+
+    nmax = 2*n;
+    X = gv_calloc(dim * (n + nmax), sizeof(double));
+    groups = gv_calloc(n + nmax, sizeof(int));
+    for (i = 0; i < n; i++) {
+      groups[i] = grouping[i];
+      for (j = 0; j < 2; j++){
+	X[i*2+j] = x[i*dim+j];
+      }
+    }
+    N = n;
+
+    if (shore_depth_tol < 0) {
+      shore_depth_tol = -(shore_depth_tol)*avgsz;
+    } else if (shore_depth_tol == 0){
+      get_boundingbox(n, dim, x, sizes, bbox);
+      const double area = (bbox[1] - bbox[0]) * (bbox[3] - bbox[2]);
+      shore_depth_tol = sqrt(area / n);
+      if (Verbose) fprintf(stderr,"setting shore length ======%f\n",shore_depth_tol);
+    } else {
+    }
+
+    /* add artificial points in an anti-clockwise fashion */
+
+    if (K > 0){
+      delta[0] = .5*avgsize[0]/K; delta[1] = .5*avgsize[1]/K;/* small perturbation to make boundary between labels looks more fractal */
+    } else {
+      delta[0] = delta[1] = 0.;
+    }
+    for (i = 0; i < n; i++){
+      igrp = grouping[i];
+      for (j = 0; j < 2; j++) {
+	if (avgsz == 0){
+	  nadded[j] = 0;
+	} else {
+	  nadded[j] = (int) K*sizes[i*dim+j]/avgsz;
+	}
+      }
+
+      /*top: left to right */
+      if (nadded[0] > 0){
+	h[0] = sizes[i*dim]/nadded[0];
+	point[0] = x[i*dim] - sizes[i*dim]/2;
+	p1 = point[1] = x[i*dim+1] + sizes[i*dim + 1]/2;
+	add_point(&N, igrp, &X, &nmax, point, &groups);
+	for (k = 0; k < nadded[0] - 1; k++){
+	  point[0] += h[0];
+	  point[1] = p1 + (0.5-drand())*delta[1];
+	  add_point(&N, igrp, &X, &nmax, point, &groups);
+	}
+	
+	/* bot: right to left */
+	point[0] = x[i*dim] + sizes[i*dim]/2;
+	p1 = point[1] = x[i*dim+1] - sizes[i*dim + 1]/2;
+	add_point(&N, igrp, &X, &nmax, point, &groups);
+	for (k = 0; k < nadded[0] - 1; k++){
+	  point[0] -= h[0];
+	  point[1] = p1 + (0.5-drand())*delta[1];
+	  add_point(&N, igrp, &X, &nmax, point, &groups);
+	}
+      }
+
+      if (nadded[1] > 0){	
+	/* left: bot to top */
+	h[1] = sizes[i*dim + 1]/nadded[1];
+	p0 = point[0] = x[i*dim] - sizes[i*dim]/2;
+	point[1] = x[i*dim+1] - sizes[i*dim + 1]/2;
+	add_point(&N, igrp, &X, &nmax, point, &groups);
+	for (k = 0; k < nadded[1] - 1; k++){
+	  point[0] = p0 + (0.5-drand())*delta[0];
+	  point[1] += h[1];
+	  add_point(&N, igrp, &X, &nmax, point, &groups);
+	}
+	
+	/* right: top to bot */
+	p0 = point[0] = x[i*dim] + sizes[i*dim]/2;
+	point[1] = x[i*dim+1] + sizes[i*dim + 1]/2;
+	add_point(&N, igrp, &X, &nmax, point, &groups);
+	for (k = 0; k < nadded[1] - 1; k++){
+	  point[0] = p0 + (0.5-drand())*delta[0];
+	  point[1] -= h[1];
+	  add_point(&N, igrp, &X, &nmax, point, &groups);
+	}	
+      }
+      *nart = N - n;
+
+    }/* done adding artificial points due to node size*/
+
+    rc = make_map_internal(include_OK_points, N, dim, X, groups, graph,
+                           bounding_box_margin, nrandom, nedgep, 
+                           shore_depth_tol, nverts, x_poly, poly_lines, polys,
+                           polys_groups, poly_point_map, country_graph,
+                           highlight_cluster);
+    free(groups);
+    free(X);
+  }
+  return rc;
+}

+ 45 - 0
graphviz.mod/graphviz/cmd/gvmap/make_map.h

@@ -0,0 +1,45 @@
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: Details at https://graphviz.org
+ *************************************************************************/
+
+#pragma once
+
+#include <sparse/SparseMatrix.h>
+#include <cgraph/cgraph.h>
+#include <stdbool.h>
+
+int make_map_from_rectangle_groups(bool include_OK_points, int n, int dim,
+                                   double *x, double *sizes, int *grouping,
+                                   SparseMatrix graph,
+                                   double bounding_box_margin, int nrandom,
+                                   int *nart, int nedgep,
+                                   double shore_depth_tol, int *nverts,
+                                   double **x_poly, SparseMatrix *poly_lines,
+                                   SparseMatrix *polys, int **polys_groups,
+                                   SparseMatrix *poly_point_map,
+                                   SparseMatrix *country_graph,
+                                   int highlight_cluster);
+
+void improve_contiguity(int n, int dim, int *grouping, SparseMatrix poly_point_map, double *x, SparseMatrix graph);
+
+void plot_dot_map(Agraph_t* gr, int n, int dim, double *x, SparseMatrix polys,
+                  SparseMatrix poly_lines, double line_width,
+                  const char *line_color, double *x_poly, int *polys_groups,
+                  char **labels, float *fsz, float *r, float *g, float *b,
+                  const char* opacity, SparseMatrix A, FILE*);
+
+void map_optimal_coloring(int seed, SparseMatrix A, float *rgb_r,  float *rgb_g, float *rgb_b);
+void map_palette_optimal_coloring(char *color_scheme, SparseMatrix A,
+                                  float **rgb_r, float **rgb_g, float **rgb_b);
+
+#define neighbor(t, i, edim, elist) elist[(edim)*(t)+i]
+#define edge_head(e) edge_table[2*(e)]
+#define edge_tail(e) edge_table[2*(e)+1]
+#define cycle_prev(e) cycle[2*(e)]
+#define cycle_next(e) cycle[2*(e)+1]

+ 94 - 0
graphviz.mod/graphviz/cmd/gvmap/power.c

@@ -0,0 +1,94 @@
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: Details at https://graphviz.org
+ *************************************************************************/
+
+#include <util/alloc.h>
+#include "power.h"
+#include <sparse/SparseMatrix.h>
+
+// Maxium of iterations that will be done in power_method
+static const int maxit = 100;
+
+// Accuracy control (convergence criterion) for power_method
+static const double tolerance = 0.00001;
+
+double *power_method(void *A, int n, int random_seed) {
+  /* find largest eigenvector of a matrix A.
+
+     This converges only if the largest eigenvector/value is real (e.g., if A is symmetric) and the
+     next largest eigenvalues separate from the largest ones
+
+     input:
+     A: the matrix
+     n: dimension of matrix A
+     random_seed: seed for eigenvector initialization
+     matrix: max number f iterations
+
+     output:
+     eigv: eigenvectors. The i-th is at eigvs[i*n, i*(n+1) - 1]
+
+     Function PowerIteration (A – m × m matrix )
+     % This function computes u1, u2, . . . , uk, the first k eigenvectors of S.
+     const tolerance ← 0.001
+     ui ← random
+     ui ← ui/||ui||
+     do
+       vi ← ui
+       ui ← A vi/||A vi||
+     while (ui^T vi < 1-tolerance) (halt when direction change is small)
+     vi = ui
+     return v1,v2,...
+   */
+  double *v, *u, *vv;
+  int iter = 0;
+  double res, unorm;
+  int i;
+
+  double *eigv = gv_calloc(n, sizeof(double));
+
+  vv = gv_calloc(n, sizeof(double));
+  u = gv_calloc(n, sizeof(double));
+
+  srand((unsigned)random_seed);
+
+  v = eigv;
+  for (i = 0; i < n; i++) u[i] = drand();
+  res = sqrt(vector_product(n, u, u));
+  if (res > 0) res =  1/res;
+  for (i = 0; i < n; i++) {
+    u[i] = u[i]*res;
+    v[i] = u[i];
+  }
+  iter = 0;
+  do {
+    SparseMatrix_multiply_vector(A, u, &vv);
+
+    unorm = vector_product(n, vv, vv);/* ||u||^2 */
+    unorm = sqrt(unorm);
+    if (unorm > 0) {
+      unorm = 1/unorm;
+    } else {
+      // ||A.v||=0, so v must be an eigenvec correspond to eigenvalue zero
+      for (i = 0; i < n; i++) vv[i] = u[i];
+      unorm = sqrt(vector_product(n, vv, vv));
+      if (unorm > 0) unorm = 1/unorm;
+    }
+    res = 0.;
+
+    for (i = 0; i < n; i++) {
+      u[i] = vv[i]*unorm;
+      res = res + u[i]*v[i];
+      v[i] = u[i];
+    }
+  } while (res < 1 - tolerance && iter++ < maxit);
+  free(u);
+  free(vv);
+
+  return eigv;
+}

+ 15 - 0
graphviz.mod/graphviz/cmd/gvmap/power.h

@@ -0,0 +1,15 @@
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: Details at https://graphviz.org
+ *************************************************************************/
+
+#pragma once
+
+#include <sparse/general.h>
+
+double *power_method(void *A, int n, int random_seed);

+ 50 - 0
graphviz.mod/graphviz/cmd/gvpr/Makefile.am

@@ -0,0 +1,50 @@
+## Process this file with automake to produce Makefile.in
+
+SUBDIRS = lib
+
+AM_CPPFLAGS = \
+	-I$(top_srcdir)/lib \
+	-I$(top_srcdir)/lib/gvpr \
+	-I$(top_srcdir)/lib/cgraph \
+	-I$(top_srcdir)/lib/cdt
+
+if ENABLE_STATIC
+bin_PROGRAMS = gvpr gvpr_static
+else
+bin_PROGRAMS = gvpr
+endif
+
+dist_man_MANS = gvpr.1
+if ENABLE_MAN_PDFS
+pdf_DATA = gvpr.1.pdf
+endif
+
+gvpr_SOURCES = gvprmain.c
+gvpr_CPPFLAGS = $(AM_CPPFLAGS)
+gvpr_LDADD = $(top_builddir)/lib/gvpr/libgvpr.la \
+	$(top_builddir)/lib/cgraph/libcgraph.la \
+	$(top_builddir)/lib/cdt/libcdt.la
+
+.1.1.pdf:
+	rm -f $@; pdffile=$@; psfile=$${pdffile%pdf}ps; \
+	$(GROFF) -Tps -man $< > $$psfile || { rm -f $$psfile; exit 1; }; \
+	$(PS2PDF) $$psfile && rm -f $$psfile || { rm -f $$psfile; exit 1; }
+SUFFIXES = .1 .1.pdf
+
+gvpr_static_SOURCES = gvprmain.c
+gvpr_static_CPPFLAGS = $(AM_CPPFLAGS)
+gvpr_static_LDADD = \
+	$(top_builddir)/lib/gvpr/libgvpr_C.la \
+	$(top_builddir)/lib/expr/libexpr_C.la \
+	$(top_builddir)/lib/ast/libast_C.la \
+	$(top_builddir)/lib/sfio/libsfio_C.la \
+	$(top_builddir)/lib/sfio/Sfio_f/libsfiof_C.la \
+	$(top_builddir)/lib/cgraph/libcgraph_C.la \
+	$(top_builddir)/lib/cdt/libcdt_C.la \
+	$(top_builddir)/lib/util/libutil_C.la \
+	$(top_builddir)/lib/vmalloc/libvmalloc_C.la \
+	$(MATH_LIBS)
+
+EXTRA_DIST = lib
+
+DISTCLEANFILES = $(pdf_DATA)

+ 1132 - 0
graphviz.mod/graphviz/cmd/gvpr/Makefile.in

@@ -0,0 +1,1132 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@ENABLE_STATIC_FALSE@bin_PROGRAMS = gvpr$(EXEEXT)
+@ENABLE_STATIC_TRUE@bin_PROGRAMS = gvpr$(EXEEXT) gvpr_static$(EXEEXT)
+subdir = cmd/gvpr
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \
+	$(top_srcdir)/m4/ax_compare_version.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltargz.m4 \
+	$(top_srcdir)/m4/ltdl.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/./version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \
+	"$(DESTDIR)$(pdfdir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_gvpr_OBJECTS = gvpr-gvprmain.$(OBJEXT)
+gvpr_OBJECTS = $(am_gvpr_OBJECTS)
+gvpr_DEPENDENCIES = $(top_builddir)/lib/gvpr/libgvpr.la \
+	$(top_builddir)/lib/cgraph/libcgraph.la \
+	$(top_builddir)/lib/cdt/libcdt.la
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+am_gvpr_static_OBJECTS = gvpr_static-gvprmain.$(OBJEXT)
+gvpr_static_OBJECTS = $(am_gvpr_static_OBJECTS)
+am__DEPENDENCIES_1 =
+gvpr_static_DEPENDENCIES = $(top_builddir)/lib/gvpr/libgvpr_C.la \
+	$(top_builddir)/lib/expr/libexpr_C.la \
+	$(top_builddir)/lib/ast/libast_C.la \
+	$(top_builddir)/lib/sfio/libsfio_C.la \
+	$(top_builddir)/lib/sfio/Sfio_f/libsfiof_C.la \
+	$(top_builddir)/lib/cgraph/libcgraph_C.la \
+	$(top_builddir)/lib/cdt/libcdt_C.la \
+	$(top_builddir)/lib/util/libutil_C.la \
+	$(top_builddir)/lib/vmalloc/libvmalloc_C.la \
+	$(am__DEPENDENCIES_1)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/config/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/gvpr-gvprmain.Po \
+	./$(DEPDIR)/gvpr_static-gvprmain.Po
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(gvpr_SOURCES) $(gvpr_static_SOURCES)
+DIST_SOURCES = $(gvpr_SOURCES) $(gvpr_static_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(dist_man_MANS)
+DATA = $(pdf_DATA)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	distdir distdir-am
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in \
+	$(top_srcdir)/config/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+ANN_CFLAGS = @ANN_CFLAGS@
+ANN_LIBS = @ANN_LIBS@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+CYGWIN = @CYGWIN@
+DARWIN = @DARWIN@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEVIL_INCLUDES = @DEVIL_INCLUDES@
+DEVIL_LIBS = @DEVIL_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+EXPAT_CFLAGS = @EXPAT_CFLAGS@
+EXPAT_LIBS = @EXPAT_LIBS@
+FGREP = @FGREP@
+FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@
+FREETYPE2_LIBS = @FREETYPE2_LIBS@
+GDIPLUS_CFLAGS = @GDIPLUS_CFLAGS@
+GDIPLUS_HEADS = @GDIPLUS_HEADS@
+GDIPLUS_LIBS = @GDIPLUS_LIBS@
+GDK_CFLAGS = @GDK_CFLAGS@
+GDK_LIBS = @GDK_LIBS@
+GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@
+GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@
+GDLIB_CFLAGS = @GDLIB_CFLAGS@
+GDLIB_CONFIG = @GDLIB_CONFIG@
+GDLIB_LIBS = @GDLIB_LIBS@
+GLADE_CFLAGS = @GLADE_CFLAGS@
+GLADE_LIBS = @GLADE_LIBS@
+GLUT_CFLAGS = @GLUT_CFLAGS@
+GLUT_LIBS = @GLUT_LIBS@
+GO = @GO@
+GO_INCLUDES = @GO_INCLUDES@
+GO_LIBS = @GO_LIBS@
+GRAPHVIZ_AUTHOR_EMAIL = @GRAPHVIZ_AUTHOR_EMAIL@
+GRAPHVIZ_AUTHOR_NAME = @GRAPHVIZ_AUTHOR_NAME@
+GRAPHVIZ_CHANGE_DATE = @GRAPHVIZ_CHANGE_DATE@
+GRAPHVIZ_VERSION_DATE = @GRAPHVIZ_VERSION_DATE@
+GRAPHVIZ_VERSION_MAJOR = @GRAPHVIZ_VERSION_MAJOR@
+GRAPHVIZ_VERSION_MICRO = @GRAPHVIZ_VERSION_MICRO@
+GRAPHVIZ_VERSION_MINOR = @GRAPHVIZ_VERSION_MINOR@
+GREP = @GREP@
+GROFF = @GROFF@
+GS_CFLAGS = @GS_CFLAGS@
+GS_LIBS = @GS_LIBS@
+GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@
+GTKGLEXT_LIBS = @GTKGLEXT_LIBS@
+GTKGL_CFLAGS = @GTKGL_CFLAGS@
+GTKGL_LIBS = @GTKGL_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+GTS_CFLAGS = @GTS_CFLAGS@
+GTS_LIBS = @GTS_LIBS@
+GUILE_CFLAGS = @GUILE_CFLAGS@
+GUILE_LIBS = @GUILE_LIBS@
+GVPLUGIN_CONFIG_FILE = @GVPLUGIN_CONFIG_FILE@
+GVPLUGIN_VERSION = @GVPLUGIN_VERSION@
+GVPLUGIN_VERSION_INFO = @GVPLUGIN_VERSION_INFO@
+HAVE_CXX17 = @HAVE_CXX17@
+INCLTDL = @INCLTDL@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTGOSIZE = @INTGOSIZE@
+IPSEPCOLA_INCLUDES = @IPSEPCOLA_INCLUDES@
+IPSEPCOLA_LIBS = @IPSEPCOLA_LIBS@
+JAVA = @JAVA@
+JAVASCRIPT = @JAVASCRIPT@
+JAVA_INCLUDES = @JAVA_INCLUDES@
+JAVA_LIBS = @JAVA_LIBS@
+JNI_EXTRA_LDFLAGS = @JNI_EXTRA_LDFLAGS@
+JSHEXT = @JSHEXT@
+LASI_CFLAGS = @LASI_CFLAGS@
+LASI_LIBS = @LASI_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBADD_DL = @LIBADD_DL@
+LIBADD_DLD_LINK = @LIBADD_DLD_LINK@
+LIBADD_DLOPEN = @LIBADD_DLOPEN@
+LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@
+LIBLTDL = @LIBLTDL@
+LIBOBJS = @LIBOBJS@
+LIBPOSTFIX = @LIBPOSTFIX@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTDLDEPS = @LTDLDEPS@
+LTDLINCL = @LTDLINCL@
+LTDLOPEN = @LTDLOPEN@
+LTLIBOBJS = @LTLIBOBJS@
+LT_ARGZ_H = @LT_ARGZ_H@
+LT_CONFIG_H = @LT_CONFIG_H@
+LT_DLLOADERS = @LT_DLLOADERS@
+LT_DLPREOPEN = @LT_DLPREOPEN@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+LUA = @LUA@
+LUA_INCLUDES = @LUA_INCLUDES@
+LUA_INSTALL_DIR = @LUA_INSTALL_DIR@
+LUA_LIBS = @LUA_LIBS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MATH_LIBS = @MATH_LIBS@
+MCS = @MCS@
+MINGW32 = @MINGW32@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJC = @OBJC@
+OBJCDEPMODE = @OBJCDEPMODE@
+OBJCFLAGS = @OBJCFLAGS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@
+PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@
+PANGOFT2_CFLAGS = @PANGOFT2_CFLAGS@
+PANGOFT2_LIBS = @PANGOFT2_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PERL_INCLUDES = @PERL_INCLUDES@
+PERL_INSTALL_DIR = @PERL_INSTALL_DIR@
+PERL_LIBS = @PERL_LIBS@
+PHP = @PHP@
+PHPCONFIG = @PHPCONFIG@
+PHP_INCLUDES = @PHP_INCLUDES@
+PHP_INSTALL_DATADIR = @PHP_INSTALL_DATADIR@
+PHP_INSTALL_DIR = @PHP_INSTALL_DIR@
+PHP_LIBS = @PHP_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PLATFORMSDKINCLUDE = @PLATFORMSDKINCLUDE@
+PLATFORMSDKLIB = @PLATFORMSDKLIB@
+POPPLER_CFLAGS = @POPPLER_CFLAGS@
+POPPLER_LIBS = @POPPLER_LIBS@
+PS2PDF = @PS2PDF@
+PYTHON3 = @PYTHON3@
+PYTHON3_INCLUDES = @PYTHON3_INCLUDES@
+PYTHON3_INSTALL_DIR = @PYTHON3_INSTALL_DIR@
+PYTHON3_LIBS = @PYTHON3_LIBS@
+QMAKE = @QMAKE@
+QTCORE_CFLAGS = @QTCORE_CFLAGS@
+QTCORE_LIBS = @QTCORE_LIBS@
+QTGUI_CFLAGS = @QTGUI_CFLAGS@
+QTGUI_LIBS = @QTGUI_LIBS@
+QUARTZ_CFLAGS = @QUARTZ_CFLAGS@
+QUARTZ_LIBS = @QUARTZ_LIBS@
+RANLIB = @RANLIB@
+RSVG_CFLAGS = @RSVG_CFLAGS@
+RSVG_LIBS = @RSVG_LIBS@
+RUBY = @RUBY@
+RUBY_CFLAGS = @RUBY_CFLAGS@
+RUBY_INSTALL_DIR = @RUBY_INSTALL_DIR@
+RUBY_LIBS = @RUBY_LIBS@
+RUBY_VER = @RUBY_VER@
+R_CFLAGS = @R_CFLAGS@
+R_LIBS = @R_LIBS@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHARED_LIBRARY_SUFFIX = @SHARED_LIBRARY_SUFFIX@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SWIG = @SWIG@
+SWIGJAVA_CPPFLAGS = @SWIGJAVA_CPPFLAGS@
+SWIG_PHP_DATA = @SWIG_PHP_DATA@
+SWIG_PHP_DATA_TO_PACKAGE = @SWIG_PHP_DATA_TO_PACKAGE@
+SWIG_PHP_OPT = @SWIG_PHP_OPT@
+SWIG_VERSION = @SWIG_VERSION@
+TCLCONFIG = @TCLCONFIG@
+TCLINT_INCLUDES = @TCLINT_INCLUDES@
+TCLSH = @TCLSH@
+TCLSH_EXEC_PREFIX = @TCLSH_EXEC_PREFIX@
+TCL_CFLAGS = @TCL_CFLAGS@
+TCL_DEFS = @TCL_DEFS@
+TCL_INCLUDES = @TCL_INCLUDES@
+TCL_INSTALL_DIR = @TCL_INSTALL_DIR@
+TCL_LIBS = @TCL_LIBS@
+TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@
+TCL_MINOR_VERSION = @TCL_MINOR_VERSION@
+TCL_PATCH_LEVEL = @TCL_PATCH_LEVEL@
+TCL_PKGINDEX = @TCL_PKGINDEX@
+TCL_PKGINDEX_GD = @TCL_PKGINDEX_GD@
+TCL_PKGINDEX_SWIG = @TCL_PKGINDEX_SWIG@
+TCL_SHLIB_SUFFIX = @TCL_SHLIB_SUFFIX@
+TCL_SRC_DIR = @TCL_SRC_DIR@
+TCL_STUB_LIB_SPEC = @TCL_STUB_LIB_SPEC@
+TCL_VERSION = @TCL_VERSION@
+VERSION = @VERSION@
+WEBP_CFLAGS = @WEBP_CFLAGS@
+WEBP_LIBS = @WEBP_LIBS@
+XMKMF = @XMKMF@
+XRENDER_CFLAGS = @XRENDER_CFLAGS@
+XRENDER_LIBS = @XRENDER_LIBS@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+Z_INCLUDES = @Z_INCLUDES@
+Z_LIBS = @Z_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_OBJC = @ac_ct_OBJC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+demodir = @demodir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+ltdl_LIBOBJS = @ltdl_LIBOBJS@
+ltdl_LTLIBOBJS = @ltdl_LTLIBOBJS@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sys_symbol_underscore = @sys_symbol_underscore@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+SUBDIRS = lib
+AM_CPPFLAGS = \
+	-I$(top_srcdir)/lib \
+	-I$(top_srcdir)/lib/gvpr \
+	-I$(top_srcdir)/lib/cgraph \
+	-I$(top_srcdir)/lib/cdt
+
+dist_man_MANS = gvpr.1
+@ENABLE_MAN_PDFS_TRUE@pdf_DATA = gvpr.1.pdf
+gvpr_SOURCES = gvprmain.c
+gvpr_CPPFLAGS = $(AM_CPPFLAGS)
+gvpr_LDADD = $(top_builddir)/lib/gvpr/libgvpr.la \
+	$(top_builddir)/lib/cgraph/libcgraph.la \
+	$(top_builddir)/lib/cdt/libcdt.la
+
+SUFFIXES = .1 .1.pdf
+gvpr_static_SOURCES = gvprmain.c
+gvpr_static_CPPFLAGS = $(AM_CPPFLAGS)
+gvpr_static_LDADD = \
+	$(top_builddir)/lib/gvpr/libgvpr_C.la \
+	$(top_builddir)/lib/expr/libexpr_C.la \
+	$(top_builddir)/lib/ast/libast_C.la \
+	$(top_builddir)/lib/sfio/libsfio_C.la \
+	$(top_builddir)/lib/sfio/Sfio_f/libsfiof_C.la \
+	$(top_builddir)/lib/cgraph/libcgraph_C.la \
+	$(top_builddir)/lib/cdt/libcdt_C.la \
+	$(top_builddir)/lib/util/libutil_C.la \
+	$(top_builddir)/lib/vmalloc/libvmalloc_C.la \
+	$(MATH_LIBS)
+
+EXTRA_DIST = lib
+DISTCLEANFILES = $(pdf_DATA)
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .1 .1.pdf .c .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu cmd/gvpr/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu cmd/gvpr/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+gvpr$(EXEEXT): $(gvpr_OBJECTS) $(gvpr_DEPENDENCIES) $(EXTRA_gvpr_DEPENDENCIES) 
+	@rm -f gvpr$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(gvpr_OBJECTS) $(gvpr_LDADD) $(LIBS)
+
+gvpr_static$(EXEEXT): $(gvpr_static_OBJECTS) $(gvpr_static_DEPENDENCIES) $(EXTRA_gvpr_static_DEPENDENCIES) 
+	@rm -f gvpr_static$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(gvpr_static_OBJECTS) $(gvpr_static_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvpr-gvprmain.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvpr_static-gvprmain.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+	@$(MKDIR_P) $(@D)
+	@echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.c.o:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+gvpr-gvprmain.o: gvprmain.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvpr_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gvpr-gvprmain.o -MD -MP -MF $(DEPDIR)/gvpr-gvprmain.Tpo -c -o gvpr-gvprmain.o `test -f 'gvprmain.c' || echo '$(srcdir)/'`gvprmain.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvpr-gvprmain.Tpo $(DEPDIR)/gvpr-gvprmain.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gvprmain.c' object='gvpr-gvprmain.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvpr_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gvpr-gvprmain.o `test -f 'gvprmain.c' || echo '$(srcdir)/'`gvprmain.c
+
+gvpr-gvprmain.obj: gvprmain.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvpr_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gvpr-gvprmain.obj -MD -MP -MF $(DEPDIR)/gvpr-gvprmain.Tpo -c -o gvpr-gvprmain.obj `if test -f 'gvprmain.c'; then $(CYGPATH_W) 'gvprmain.c'; else $(CYGPATH_W) '$(srcdir)/gvprmain.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvpr-gvprmain.Tpo $(DEPDIR)/gvpr-gvprmain.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gvprmain.c' object='gvpr-gvprmain.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvpr_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gvpr-gvprmain.obj `if test -f 'gvprmain.c'; then $(CYGPATH_W) 'gvprmain.c'; else $(CYGPATH_W) '$(srcdir)/gvprmain.c'; fi`
+
+gvpr_static-gvprmain.o: gvprmain.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvpr_static_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gvpr_static-gvprmain.o -MD -MP -MF $(DEPDIR)/gvpr_static-gvprmain.Tpo -c -o gvpr_static-gvprmain.o `test -f 'gvprmain.c' || echo '$(srcdir)/'`gvprmain.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvpr_static-gvprmain.Tpo $(DEPDIR)/gvpr_static-gvprmain.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gvprmain.c' object='gvpr_static-gvprmain.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvpr_static_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gvpr_static-gvprmain.o `test -f 'gvprmain.c' || echo '$(srcdir)/'`gvprmain.c
+
+gvpr_static-gvprmain.obj: gvprmain.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvpr_static_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gvpr_static-gvprmain.obj -MD -MP -MF $(DEPDIR)/gvpr_static-gvprmain.Tpo -c -o gvpr_static-gvprmain.obj `if test -f 'gvprmain.c'; then $(CYGPATH_W) 'gvprmain.c'; else $(CYGPATH_W) '$(srcdir)/gvprmain.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gvpr_static-gvprmain.Tpo $(DEPDIR)/gvpr_static-gvprmain.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gvprmain.c' object='gvpr_static-gvprmain.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gvpr_static_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gvpr_static-gvprmain.obj `if test -f 'gvprmain.c'; then $(CYGPATH_W) 'gvprmain.c'; else $(CYGPATH_W) '$(srcdir)/gvprmain.c'; fi`
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-man1: $(dist_man_MANS)
+	@$(NORMAL_INSTALL)
+	@list1=''; \
+	list2='$(dist_man_MANS)'; \
+	test -n "$(man1dir)" \
+	  && test -n "`echo $$list1$$list2`" \
+	  || exit 0; \
+	echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+	$(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+	{ for i in $$list1; do echo "$$i"; done;  \
+	if test -n "$$list2"; then \
+	  for i in $$list2; do echo "$$i"; done \
+	    | sed -n '/\.1[a-z]*$$/p'; \
+	fi; \
+	} | while read p; do \
+	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; echo "$$p"; \
+	done | \
+	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+	sed 'N;N;s,\n, ,g' | { \
+	list=; while read file base inst; do \
+	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+	  fi; \
+	done; \
+	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+	while read files; do \
+	  test -z "$$files" || { \
+	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+	done; }
+
+uninstall-man1:
+	@$(NORMAL_UNINSTALL)
+	@list=''; test -n "$(man1dir)" || exit 0; \
+	files=`{ for i in $$list; do echo "$$i"; done; \
+	l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+	  sed -n '/\.1[a-z]*$$/p'; \
+	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+	dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+install-pdfDATA: $(pdf_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(pdf_DATA)'; test -n "$(pdfdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; \
+	done
+
+uninstall-pdfDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pdf_DATA)'; test -n "$(pdfdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pdfdir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(PROGRAMS) $(MANS) $(DATA)
+installdirs: installdirs-recursive
+installdirs-am:
+	for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pdfdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+		-rm -f ./$(DEPDIR)/gvpr-gvprmain.Po
+	-rm -f ./$(DEPDIR)/gvpr_static-gvprmain.Po
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-man install-pdfDATA
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+		-rm -f ./$(DEPDIR)/gvpr-gvprmain.Po
+	-rm -f ./$(DEPDIR)/gvpr_static-gvprmain.Po
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-pdfDATA
+
+uninstall-man: uninstall-man1
+
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+	am--depfiles check check-am clean clean-binPROGRAMS \
+	clean-generic clean-libtool cscopelist-am ctags ctags-am \
+	distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-binPROGRAMS \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-man1 \
+	install-pdf install-pdf-am install-pdfDATA install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \
+	uninstall-man uninstall-man1 uninstall-pdfDATA
+
+.PRECIOUS: Makefile
+
+
+.1.1.pdf:
+	rm -f $@; pdffile=$@; psfile=$${pdffile%pdf}ps; \
+	$(GROFF) -Tps -man $< > $$psfile || { rm -f $$psfile; exit 1; }; \
+	$(PS2PDF) $$psfile && rm -f $$psfile || { rm -f $$psfile; exit 1; }
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

+ 1195 - 0
graphviz.mod/graphviz/cmd/gvpr/gvpr.1

@@ -0,0 +1,1195 @@
+.de TQ
+.  br
+.  ns
+.  TP \\$1
+..
+.TH GVPR 1 "29 August 2013"
+.SH NAME
+gvpr \- graph pattern scanning and processing language
+.br
+.SH SYNOPSIS
+.B gvpr
+[\fB\-icnqV?\fP]
+[
+.BI \-o
+.I outfile
+]
+[
+.BI \-a
+.I args
+]
+[
+.I 'prog'
+|
+.BI \-f
+.I progfile
+]
+[ 
+.I files 
+]
+.SH DESCRIPTION
+.B gvpr
+(previously known as
+.BR gpr )
+is a graph stream editor inspired by \fBawk\fP.
+It copies input graphs to its
+output, possibly transforming their structure and attributes,
+creating new graphs, or printing arbitrary information.
+The graph model is that provided by
+.IR libcgraph (3).
+In particular, \fBgvpr\fP reads and writes graphs using the
+dot language.
+.PP
+Basically,
+.B gvpr
+traverses each input graph, denoted by \fB$G\fP, visiting each node and edge,
+matching it with the predicate\(hyaction rules supplied in the input program.
+The rules are evaluated in order.
+For each predicate evaluating to true, the corresponding 
+action is performed. 
+During the traversal, the current node or edge being visited
+is denoted by \fB$\fP.
+.PP
+For each input graph, there is a target subgraph, denoted by
+\fB$T\fP, initially empty and used to accumulate
+chosen entities, and an output graph, \fB$O\fP, used for final processing
+and then written to output. 
+By default, the output graph is the target graph.
+The output graph can be set in the program or, in a limited sense,
+on the command line.
+.SH OPTIONS
+The following options are supported:
+.TP
+.BI \-a " args"
+The string \fIargs\fP is split into whitespace\(hyseparated tokens, 
+with the individual tokens
+available as strings in the \fBgvpr\fP program 
+as \fBARGV[\fI0\fP],...,ARGV[ARGC\-1]\fR.
+Whitespace characters within single or double quoted substrings, or
+preceded by a backslash, are ignored as separators. 
+In general, a backslash character turns off any special meaning of the
+following character.
+Note that the tokens derived from multiple \fB\-a\fP flags are concatenated.
+.TP
+.B \-c
+Use the source graph as the output graph.
+.TP
+.B \-i
+Derive the node\(hyinduced subgraph extension of the output graph in the context 
+of its root graph.
+.TP
+.BI \-o " outfile"
+Causes the output stream to be written to the specified file; by default,
+output is written to \fBstdout\fP.
+.TP
+.BI \-f " progfile"
+Use the contents of the specified file as the program to execute
+on the input. If \fIprogfile\fP contains a slash character, the name is taken
+as the pathname of the file. Otherwise, \fBgvpr\fP will use the
+directories specified in the environment variable \fBGVPRPATH\fP to look
+for the file. If 
+.B \-f
+is not given,
+.B gvpr
+will use the first non\(hyoption argument as the program.
+.TP
+.B \-q
+Turns off warning messages.
+.TP
+.B \-n
+Turns off graph read-ahead. By default, the variable \fB$NG\fP is set to the next
+graph to be processed. This requires a read of the next graph before processing the
+current graph, which may block if the next graph is only generated in response to
+some action pertaining to the processing of the current graph.
+.TP
+.B \-V
+Causes the program to print version information and exit.
+.TP
+.B \-?
+Causes the program to print usage information and exit.
+.SH OPERANDS
+The following operand is supported:
+.TP 8
+.I files
+Names of files containing 1 or more graphs in the dot language.
+If no
+.B \-f
+option is given, the first name is removed from the list and used 
+as the input program. If the list of files is empty, \fBstdin\fP will be used.
+.SH PROGRAMS
+A
+.B gvpr
+program consists of a list of predicate\(hyaction clauses, having one
+of the forms:
+.IP
+.BI "BEGIN { "  action " }"
+.IP
+.BI "BEG_G { "  action " }"
+.IP
+.BI "N [ " predicate " ] { " action " }
+.IP
+.BI "E [ " predicate " ] { " action " }
+.IP
+.BI "END_G { "  action " }"
+.IP
+.BI "END { "  action " }"
+.PP
+A program can contain at most one of each of the \fBBEGIN\fP, 
+\fBEND_G\fP and \fBEND\fP clauses. 
+There can be any number of \fBBEG_G\fP, \fBN\fP and \fBE\fP statements,
+the first applied to graphs, the second to nodes, the third to edges.
+These are separated into blocks, a block consisting of an optional
+\fBBEG_G\fP statement and all \fBN\fP and \fBE\fP statements up to 
+the next \fBBEG_G\fP statement, if any.
+The top\(hylevel semantics of a \fBgvpr\fP program are:
+.PP
+.RS
+.nf
+Evaluate the \fBBEGIN\fP clause, if any.
+For each input graph \fIG\fP {
+    For each block {
+        Set \fIG\fP as the current graph and current object.
+        Evaluate the \fBBEG_G\fP clause, if any.
+        For each node and edge in \fIG\fP {
+            Set the node or edge as the current object.
+            Evaluate the \fBN\fP or \fBE\fP clauses, as appropriate.
+        } 
+    } 
+    Set \fIG\fP as the current object.
+    Evaluate the \fBEND_G\fP clause, if any.
+} 
+Evaluate the \fBEND\fP clause, if any.
+.fi
+.RE
+.DT
+.PP
+The actions of the \fBBEGIN\fP, \fBBEG_G\fP, \fBEND_G\fP and \fBEND\fP clauses
+are performed when the clauses are evaluated.
+For \fBN\fP or \fBE\fP clauses,
+either the predicate or action may be omitted. 
+If there is no predicate with an action, the action is 
+performed on every node or edge, as appropriate.
+If there is no action and the predicate evaluates to true,
+the associated node or edge is added to the target graph. 
+.PP
+The blocks are evaluated in the order in which they occur.
+Within a block, the \fBN\fP clauses 
+(\fBE\fP clauses, respectively) are evaluated in the
+order in which they occur. Note, though, that within a block, 
+\fBN\fP or \fBE\fP clauses may be interlaced, depending on the
+traversal order.
+.PP
+Predicates and actions are sequences of statements in the C dialect 
+supported by the
+.IR expr (3)
+library.
+The only difference between predicates and actions is that the former
+must have a type that may interpreted as either true or false.
+Here the usual C convention is followed, in which a non\(hyzero value is
+considered true. This would include non\(hyempty strings and non\(hyempty
+references to nodes, edges, etc. However, if a string can be 
+converted to an integer, this value is used.
+.PP
+In addition to the usual C base types
+(\fBvoid\fP, \fBint\fP, \fBchar\fP, \fBfloat\fP, \fBlong\fP, 
+\fBunsigned\fP and \fBdouble\fP), 
+\fBgvpr\fP \fRprovides \fBstring\fP as a synonym for \fBchar*\fP, and 
+the graph\(hybased types \fBnode_t\fP,
+\fBedge_t\fP, \fBgraph_t\fP and \fBobj_t\fP.
+The \fBobj_t\fP type can be viewed as a supertype of the other 3 concrete types;
+the correct base type is maintained dynamically.
+Besides these base types, the only other supported type expressions
+are (associative) arrays. 
+.PP
+Constants follow C syntax, but strings may be quoted with either
+\fB"..."\fP or \fB'...'\fP.
+\fBgvpr\fP accepts C++ comments as well as cpp\(hytype comments.
+For the latter, if a line begins with a '#' character, the rest of
+the line is ignored.
+.PP
+A statement can be a declaration of a function, a variable
+or an array, or an executable statement. For declarations, there
+is a single scope. Array declarations have the form: 
+.PP
+.RS
+.nf
+\fI type array \fB[\fP type0 \fB]\fR
+.fi
+.RE
+.DT
+.PP
+where \fI type0 \fP is optional. If it is supplied, the parser will 
+enforce that all array subscripts have the specified type. If it is
+not supplied, objects of all types can be used as subscripts.
+As in C, variables and arrays must
+be declared. In particular, an undeclared variable will be interpreted
+as the name of an attribute of a node, edge or graph, depending on the
+context.
+.PP
+Executable statements can be one of the following:
+.RS
+.TS
+l l.
+\fB{\fR [\fI statement ... \fR] \fB}\fR
+\fIexpression\fP	\fR// commonly\fP\fI var \fB=\fP expression\fR
+\fBif(\fI expression \fP)\fI statement \fR[ \fBelse\fI statement \fR]
+\fBfor(\fI expression \fP;\fI expression \fP;\fI expression \fP)\fI statement\fP
+\fBfor(\fI array \fP[\fI var \fP])\fI statement\fP
+\fBforr(\fI array \fP[\fI var \fP])\fI statement\fP
+\fBwhile(\fI expression \fP)\fI statement\fP
+\fBswitch(\fI expression \fP)\fI case statements\fP
+\fBbreak [\fI expression \fP]
+\fBcontinue [\fI expression \fP]
+\fBreturn [\fI expression \fP]\fR
+.TE
+.RE
+.SM
+Items in brackets are optional.
+.PP
+In the second form of the \fBfor\fP statement and the \fBforr\fP statement, the variable \fIvar\fP
+is set to each value used as an index in the specified array and then
+the associated \fIstatement\fP is evaluated. For numeric and string indices, the indices are 
+returned in increasing (decreasing) numeric or lexicographic order for 
+\fBfor\fP (\fBforr\fP, respectively). This can be used for sorting.
+.PP
+Function definitions can only appear in the \fBBEGIN\fP clause.
+.PP
+Expressions include the usual C expressions. 
+String comparisons using \fB==\fP and \fB!=\fP
+treat the right hand operand as a pattern
+for the purpose of regular expression matching.
+Patterns use
+.IR ksh (1)
+file match pattern syntax.
+(For simple string equality, use the \fBstrcmp\fP function.
+.PP
+\fBgvpr\fP will attempt to use an expression as a string or numeric value 
+as appropriate. Both C-like casts and function templates will cause
+conversions to be performed, if possible.
+.PP
+Expressions of graphical type (i.e., \fBgraph_t, node_t,
+edge_t, obj_t\fP) may be followed by a field reference in the
+form of \fB.\fP\fIname\fP. The resulting value is the value
+of the attribute named \fIname\fP of the given object.
+In addition, in certain contexts an undeclared, unmodified
+identifier is taken to be an
+attribute name. Specifically, such identifiers denote attributes
+of the current node or edge, respectively, in \fBN\fP
+and \fBE\fP clauses, and the current graph in \fBBEG_G\fP and \fBEND_G\fP
+clauses.
+.PP
+As usual in the 
+.IR libcgraph (3)
+model, attributes are string\(hyvalued.
+In addition,
+.B gvpr
+supports certain pseudo\(hyattributes of graph objects, not necessarily
+string\(hyvalued. These reflect intrinsic properties of the graph objects
+and cannot be set by the user.
+.TP
+\fBhead\fR : \fBnode_t\fR
+the head of an edge.
+.TP
+\fBtail\fR : \fBnode_t\fR
+the tail of an edge.
+.TP
+\fBname\fR : \fBstring\fR
+the name of an edge, node or graph. The name of an edge has the
+form "\fI<tail\(hyname><edge\(hyop><head\(hyname>\fB[\fI<key>\fB]\fR",
+where \fI<edge\(hyop>\fP is "\fB\->\fP" or "\fB\-\-\fP" depending on
+whether the graph is directed or not. The bracket part \fB[\fI<key>\fB]\fR
+only appears if the edge has a non\(hytrivial key.
+.TP
+\fBindegree\fR : \fBint\fR
+the indegree of a node.
+.TP
+\fBoutdegree\fR : \fBint\fR
+the outdegree of a node.
+.TP
+\fBdegree\fR : \fBint\fR
+the degree of a node.
+.TP
+\fBX\fR : \fBdouble\fR
+the X coordinate of a node. (Assumes the node has a \fIpos\fP attribute.)
+.TP
+\fBY\fR : \fBdouble\fR
+the Y coordinate of a node. (Assumes the node has a \fIpos\fP attribute.)
+.TP
+\fBroot\fR : \fBgraph_t\fR
+the root graph of an object. The root of a root graph
+is itself.
+.TP
+\fBparent\fR : \fBgraph_t\fR
+the parent graph of a subgraph. The parent of a root graph
+is \fBNULL\fP
+.TP
+\fBn_edges\fR : \fBint\fR
+the number of edges in the graph
+.TP
+\fBn_nodes\fR : \fBint\fR
+the number of nodes in the graph
+.TP
+\fBdirected\fR : \fBint\fR
+true (non\(hyzero) if the graph is directed
+.TP
+\fBstrict\fR : \fBint\fR
+true (non\(hyzero) if the graph is strict
+.SH "BUILT\(hyIN FUNCTIONS"
+.PP
+The following functions are built into \fBgvpr\fP. Those functions
+returning references to graph objects return \fBNULL\fP in case of failure.
+.SS "Graphs and subgraph"
+.TP
+\fBgraph\fP(\fIs\fP : \fBstring\fP, \fIt\fP : \fBstring\fP) : \fBgraph_t\fP
+creates a graph whose name is \fIs\fP and whose type is
+specified by the string \fIt\fP. Ignoring case, the characters
+\fBU, D, S, N\fR have the interpretation undirected, directed,
+strict, and non\(hystrict, respectively. If \fIt\fP is empty,
+a directed, non\(hystrict graph is generated.
+.TP
+\fBsubg\fP(\fIg\fP : \fBgraph_t\fP, \fIs\fP : \fBstring\fP) : \fBgraph_t\fP
+creates a subgraph in graph \fIg\fP with name \fIs\fP. If the subgraph
+already exists, it is returned.
+.TP
+\fBisSubg\fP(\fIg\fP : \fBgraph_t\fP, \fIs\fP : \fBstring\fP) : \fBgraph_t\fP
+returns the subgraph in graph \fIg\fP with name \fIs\fP, if it exists,
+or \fBNULL\fP otherwise.
+.TP
+\fBfstsubg\fP(\fIg\fP : \fBgraph_t\fP) : \fBgraph_t\fP
+returns the first subgraph in graph \fIg\fP, or \fBNULL\fP if none exists.
+.TP
+\fBnxtsubg\fP(\fIsg\fP : \fBgraph_t\fP) : \fBgraph_t\fP
+returns the next subgraph after \fIsg\fP, or \fBNULL\fP.
+.TP
+\fBisDirect\fP(\fIg\fP : \fBgraph_t\fP) : \fBint\fP
+returns true if and only if \fIg\fP is directed.
+.TP
+\fBisStrict\fP(\fIg\fP : \fBgraph_t\fP) : \fBint\fP
+returns true if and only if \fIg\fP is strict.
+.TP
+\fBnNodes\fP(\fIg\fP : \fBgraph_t\fP) : \fBint\fP
+returns the number of nodes in \fIg\fP.
+.TP
+\fBnEdges\fP(\fIg\fP : \fBgraph_t\fP) : \fBint\fP
+returns the number of edges in \fIg\fP.
+.SS "Nodes"
+.TP
+\fBnode\fP(\fIg\fP : \fBgraph_t\fP, \fIs\fP : \fBstring\fP) : \fBnode_t\fP
+creates a node in graph \fIg\fP of name \fIs\fP. If such a node
+already exists, it is returned.
+.TP
+\fBsubnode\fP(\fIsg\fP : \fBgraph_t\fP, \fIn\fP : \fBnode_t\fP) : \fBnode_t\fP
+inserts the node \fIn\fP into the subgraph \fIsg\fP. Returns the node.
+.TP
+\fBfstnode\fP(\fIg\fP : \fBgraph_t\fP) : \fBnode_t\fP
+returns the first node in graph \fIg\fP, or \fBNULL\fP if none exists.
+.TP
+\fBnxtnode\fP(\fIn\fP : \fBnode_t\fP) : \fBnode_t\fP
+returns the next node after \fIn\fP in the root graph, or \fBNULL\fP.
+.TP
+\fBnxtnode_sg\fP(\fIsg\fP : \fBgraph_t\fP, \fIn\fP : \fBnode_t\fP) : \fBnode_t\fP
+returns the next node after \fIn\fP in \fIsg\fP, or \fBNULL\fP.
+.TP
+\fBisNode\fP(\fIsg\fP : \fBgraph_t\fP, \fIs\fP : \fBstring\fP) : \fBnode_t\fP
+looks for a node in (sub)graph \fIsg\fP of name \fIs\fP. If such a node
+exists, it is returned. Otherwise, \fBNULL\fP is returned.
+.TP
+\fBisSubnode\fP(\fIsg\fP : \fBgraph_t\fP, \fIn\fP : \fBnode_t\fP) : \fBint\fP
+returns non-zero if node \fIn\fP is in (sub)graph \fIsg\fP, or zero
+otherwise.
+.TP
+\fBindegreeOf\fP(\fIsg\fP : \fBgraph_t\fP, \fIn\fP : \fBnode_t\fP) : \fBint\fP
+returns the indegree of node \fIn\fP in (sub)graph \fIsg\fP.
+.TP
+\fBoutdegreeOf\fP(\fIsg\fP : \fBgraph_t\fP, \fIn\fP : \fBnode_t\fP) : \fBint\fP
+returns the outdegree of node \fIn\fP in (sub)graph \fIsg\fP.
+.TP
+\fBdegreeOf\fP(\fIsg\fP : \fBgraph_t\fP, \fIn\fP : \fBnode_t\fP) : \fBint\fP
+returns the degree of node \fIn\fP in (sub)graph \fIsg\fP.
+.SS "Edges"
+.TP
+\fBedge\fP(\fIt\fP : \fBnode_t\fP, \fIh\fP : \fBnode_t\fP, \fIs\fP : \fBstring\fP) : \fBedge_t\fP
+creates an edge with tail node \fIt\fP, head node \fIh\fP and
+name \fIs\fP in the root graph. If the graph is undirected, the 
+distinction between head and tail nodes is unimportant.
+If such an edge already exists, it is returned.
+.TP
+\fBedge_sg\fP(\fIsg\fP : \fBgraph_t\fP, \fIt\fP : \fBnode_t\fP, \fIh\fP : \fBnode_t\fP, \fIs\fP : \fBstring\fP) : \fBedge_t\fP
+creates an edge with tail node \fIt\fP, head node \fIh\fP and name \fIs\fP 
+in (sub)graph \fIsg\fP (and all parent graphs). If the graph is undirected, the distinction between
+head and tail nodes is unimportant.
+If such an edge already exists, it is returned.
+.TP
+\fBsubedge\fP(\fIg\fP : \fBgraph_t\fP, \fIe\fP : \fBedge_t\fP) : \fBedge_t\fP
+inserts the edge \fIe\fP into the subgraph \fIg\fP. Returns the edge.
+.TP
+\fBisEdge\fP(\fIt\fP : \fBnode_t\fP, \fIh\fP : \fBnode_t\fP, \fIs\fP : \fBstring\fP) : \fBedge_t\fP
+looks for an edge with tail node \fIt\fP, head node \fIh\fP and
+name \fIs\fP. If the graph is undirected, the distinction between
+head and tail nodes is unimportant.
+If such an edge exists, it is returned. Otherwise, \fBNULL\fP is returned.
+.TP
+\fBisEdge_sg\fP(\fIsg\fP : \fBgraph_t\fP, \fIt\fP : \fBnode_t\fP, \fIh\fP : \fBnode_t\fP, \fIs\fP : \fBstring\fP) : \fBedge_t\fP
+looks for an edge with tail node \fIt\fP, head node \fIh\fP and
+name \fIs\fP in (sub)graph \fIsg\fP. If the graph is undirected, the distinction between
+head and tail nodes is unimportant.
+If such an edge exists, it is returned. Otherwise, \fBNULL\fP is returned.
+.TP
+\fBisSubedge\fP(\fIsg\fP : \fBgraph_t\fP, \fIe\fP : \fBedge_t\fP) : \fBint\fP
+returns non-zero if edge \fIe\fP is in (sub)graph \fIsg\fP, or zero
+otherwise.
+.TP
+\fBfstout\fP(\fIn\fP : \fBnode_t\fP) : \fBedge_t\fP
+returns the first outedge of node \fIn\fP in the root graph.
+.TP
+\fBfstout_sg\fP(\fIsg\fP : \fBgraph_t\fP, \fIn\fP : \fBnode_t\fP) : \fBedge_t\fP
+returns the first outedge of node \fIn\fP in (sub)graph \fIsg\fP.
+.TP
+\fBnxtout\fP(\fIe\fP : \fBedge_t\fP) : \fBedge_t\fP
+returns the next outedge after \fIe\fP in the root graph.
+.TP
+\fBnxtout_sg\fP(\fIsg\fP : \fBgraph_t\fP, \fIe\fP : \fBedge_t\fP) : \fBedge_t\fP
+returns the next outedge after \fIe\fP in graph \fIsg\fP.
+.TP
+\fBfstin\fP(\fIn\fP : \fBnode_t\fP) : \fBedge_t\fP
+returns the first inedge of node \fIn\fP in the root graph.
+.TP
+\fBfstin_sg\fP(\fIsg\fP : \fBgraph_t\fP, \fIn\fP : \fBnode_t\fP) : \fBedge_t\fP
+returns the first inedge of node \fIn\fP in graph \fIsg\fP.
+.TP
+\fBnxtin\fP(\fIe\fP : \fBedge_t\fP) : \fBedge_t\fP
+returns the next inedge after \fIe\fP in the root graph.
+.TP
+\fBnxtin_sg\fP(\fIsg\fP : \fBgraph_t\fP, \fIe\fP : \fBedge_t\fP) : \fBedge_t\fP
+returns the next inedge after \fIe\fP in graph \fIsg\fP.
+.TP
+\fBfstedge\fP(\fIn\fP : \fBnode_t\fP) : \fBedge_t\fP
+returns the first edge of node \fIn\fP in the root graph.
+.TP
+\fBfstedge_sg\fP(\fIsg\fP : \fBgraph_t\fP, \fIn\fP : \fBnode_t\fP) : \fBedge_t\fP
+returns the first edge of node \fIn\fP in graph \fIsg\fP.
+.TP
+\fBnxtedge\fP(\fIe\fP : \fBedge_t\fP, \fIn\fP : \fBnode_t\fP) : \fBedge_t\fP
+returns the next edge after \fIe\fP in the root graph.
+.TP
+\fBnxtedge_sg\fP(\fIsg\fP : \fBgraph_t\fP, \fIe\fP : \fBedge_t\fP, \fIn\fP : \fBnode_t\fP) : \fBedge_t\fP
+returns the next edge after \fIe\fP in the graph \fIsg\fP.
+.TP
+\fBopp\fP(\fIe\fP : \fBedge_t\fP, \fIn\fP : \fBnode_t\fP) : \fBnode_t\fP
+returns the node on the edge \fIe\fP not equal to \fIn\fP.
+Returns NULL if \fIn\fP is not a node of \fIe\fP.
+This can be useful when using \fBfstedge\fP and \fBnxtedge\fP
+to enumerate the neighbors of \fIn\fP.
+.SS "Graph I/O"
+.TP
+\fBwrite\fP(\fIg\fP : \fBgraph_t\fP) : \fBvoid\fP
+prints \fIg\fP in dot format onto the output stream.
+.TP
+\fBwriteG\fP(\fIg\fP : \fBgraph_t\fP, \fIfname\fP : \fBstring\fP) : \fBvoid\fP
+prints \fIg\fP in dot format into the file \fIfname\fP.
+.TP
+\fBfwriteG\fP(\fIg\fP : \fBgraph_t\fP, \fIfd\fP : \fBint\fP) : \fBvoid\fP
+prints \fIg\fP in dot format onto the open stream denoted
+by the integer \fIfd\fP.
+.TP
+\fBreadG\fP(\fIfname\fP : \fBstring\fP) : \fBgraph_t\fP
+returns a graph read from the file \fIfname\fP. The graph should be
+in dot format. If no graph can be read, \fBNULL\fP is returned.
+.TP
+\fBfreadG\fP(\fIfd\fP : \fBint\fP) : \fBgraph_t\fP
+returns the next graph read from the open stream \fIfd\fP.
+Returns \fBNULL\fP at end of file.
+.SS "Graph miscellany"
+.TP
+\fBdelete\fP(\fIg\fP : \fBgraph_t\fP, \fIx\fP : \fBobj_t\fP) : \fBvoid\fP
+deletes object \fIx\fP from graph \fIg\fP.
+If \fIg\fP is \fBNULL\fP, the function uses the root graph of \fIx\fP.
+If \fIx\fP is a graph or subgraph, it is closed unless \fIx\fP is locked.
+.TP
+\fBisIn\fP(\fIg\fP : \fBgraph_t\fP, \fIx\fP : \fBobj_t\fP) : \fBint\fP
+returns true if \fIx\fP is in subgraph \fIg\fP.
+.TP
+\fBcloneG\fP(\fIg\fP : \fBgraph_t\fP, \fIs\fP : \fBstring\fP) : \fBgraph_t\fP
+creates a clone of graph \fIg\fP with name of \fIs\fP.
+If \fIs\fP is "", the created graph has the same name as \fIg\fP.
+.TP
+\fBclone\fP(\fIg\fP : \fBgraph_t\fP, \fIx\fP : \fBobj_t\fP) : \fBobj_t\fP
+creates a clone of object \fIx\fP in graph \fIg\fP.
+In particular, the new object has the same name/value attributes
+and structure as the original object.
+If an object with the same key as \fIx\fP already exists, its attributes
+are overlaid by those of \fIx\fP and the object is returned.
+If an edge is cloned, both endpoints are implicitly cloned.
+If a graph is cloned, all nodes, edges and subgraphs are implicitly
+cloned.
+If \fIx\fP is a graph, \fIg\fP may be \fBNULL\fP, in which case the cloned
+object will be a new root graph. In this case, the call is equivalent
+to \fBcloneG(\fP\fIx\fP\fB,"")\fP.
+.TP
+\fBcopy\fP(\fIg\fP : \fBgraph_t\fP, \fIx\fP : \fBobj_t\fP) : \fBobj_t\fP
+creates a copy of object \fIx\fP in graph \fIg\fP,
+where the new object has the same name/value attributes
+as the original object.
+If an object with the same key as \fIx\fP already exists, its attributes
+are overlaid by those of \fIx\fP and the object is returned.
+Note that this is a shallow copy. If \fIx\fP is a graph, none of its nodes, 
+edges or subgraphs are copied into the new graph. If \fIx\fP is an edge,
+the endpoints are created if necessary, but they are not cloned.
+If \fIx\fP is a graph, \fIg\fP may be \fBNULL\fP, in which case the cloned
+object will be a new root graph.
+.TP
+\fBcopyA\fP(\fIsrc\fP : \fBobj_t\fP, \fItgt\fP : \fBobj_t\fP) : \fBint\fP
+copies the attributes of object \fIsrc\fP to object \fItgt\fP, overwriting
+any attribute values \fItgt\fP may initially have.
+.TP
+\fBinduce\fP(\fIg\fP : \fBgraph_t\fP) : \fBvoid\fP
+extends \fIg\fP to its node\(hyinduced subgraph extension in its root graph.
+.TP
+\fBhasAttr\fP(\fIsrc\fP : \fBobj_t\fP, \fIname\fP : \fBstring\fP) : \fBint\fP
+returns non-zero if object \fIsrc\fP has an attribute whose name is
+\fIname\fP. It returns 0 otherwise.
+.TP
+\fBisAttr\fP(\fIg\fP : \fBgraph_t\fP, \fIkind\fP : \fBstring\fP, \fIname\fP : \fBstring\fP) : \fBint\fP
+returns non-zero if an attribute \fIname\fP has been defined in \fIg\fP
+for objects of the given \fIkind\fP. For nodes, edges, and graphs, \fIkind\fP
+should be "N", "E", and "G", respectively.
+It returns 0 otherwise.
+.TP
+\fBaget\fP(\fIsrc\fP : \fBobj_t\fP, \fIname\fP : \fBstring\fP) : \fBstring\fP
+returns the value of attribute \fIname\fP in object \fIsrc\fP. This is
+useful for those cases when \fIname\fP conflicts with one of the keywords
+such as "head" or "root".
+If the attribute has not been declared in the graph, the function will
+initialize it with a default value of "". To avoid this, one should use
+the \fBhasAttr\fP or \fBisAttr\fP function to check that the attribute exists.
+.TP
+\fBaset\fP(\fIsrc\fP : \fBobj_t\fP, \fIname\fP : \fBstring\fP, \fIvalue\fP : \fBstring\fP) : \fBint\fP
+sets the value of attribute \fIname\fP in object \fIsrc\fP to \fIvalue\fP.
+Returns 0 on success, non\(hyzero on failure. See \fBaget\fP above.
+.TP
+\fBgetDflt\fP(\fIg\fP : \fBgraph_t\fP, \fIkind\fP : \fBstring\fP, \fIname\fP : \fBstring\fP) : \fBstring\fP
+returns the default value of attribute \fIname\fP in objects in \fIg\fP of
+the given \fIkind\fP. For nodes, edges, and graphs, \fIkind\fP
+should be "N", "E", and "G", respectively.
+If the attribute has not been declared in the graph, the function will
+initialize it with a default value of "". To avoid this, one should use
+the \fBisAttr\fP function to check that the attribute exists.
+.TP
+\fBsetDflt\fP(\fIg\fP : \fBgraph_t\fP, \fIkind\fP : \fBstring\fP, \fIname\fP : \fBstring\fP, \fIvalue\fP : \fBstring\fP) : \fBint\fP
+sets the default value of attribute \fIname\fP to \fIvalue\fP in 
+objects in \fIg\fP of
+the given \fIkind\fP. For nodes, edges, and graphs, \fIkind\fP
+should be "N", "E", and "G", respectively.
+Returns 0 on success, non\(hyzero on failure. See \fBgetDflt\fP above.
+.TP
+\fBfstAttr\fP(\fIg\fP : \fBgraph_t\fP, \fIkind\fP : \fBstring\fP) : \fBstring\fP
+returns the name of the first attribute of objects in \fIg\fP of
+the given \fIkind\fP. For nodes, edges, and graphs, \fIkind\fP
+should be "N", "E", and "G", respectively.
+If there are no attributes, the string "" is returned.
+.TP
+\fBnxtAttr\fP(\fIg\fP : \fBgraph_t\fP, \fIkind\fP : \fBstring\fP, \fIname\fP : \fBstring\fP) : \fBstring\fP
+returns the name of the next attribute of objects in \fIg\fP of
+the given \fIkind\fP after the attribute \fIname\fP. 
+The argument \fIname\fP must be the name of an existing attribute; it will
+typically be the return value of an previous call to \fBfstAttr\fP or
+\fBnxtAttr\fP.
+For nodes, edges, and graphs, \fIkind\fP
+should be "N", "E", and "G", respectively.
+If there are no attributes left, the string "" is returned.
+.TP
+\fBcompOf\fP(\fIg\fP : \fBgraph_t\fP, \fIn\fP : \fBnode_t\fP) : \fBgraph_t\fP
+returns the connected component of the graph \fIg\fP containing node \fIn\fP,
+as a subgraph of \fIg\fP. The subgraph only contains the nodes. One can
+use \fIinduce\fP to add the edges. The function fails and returns \fBNULL\fP
+if \fIn\fP is not in \fIg\fP. Connectivity is based on the underlying
+undirected graph of \fIg\fP.
+.TP
+\fBkindOf\fP(\fIobj\fP : \fBobj_t\fP) : \fBstring\fP
+returns an indication of the type of \fIobj\fP.
+For nodes, edges, and graphs, it returns "N", "E", and "G", respectively.
+.TP
+\fBlock\fP(\fIg\fP : \fBgraph_t\fP, \fIv\fP : \fBint\fP) : \fBint\fP
+implements graph locking on root graphs. If the integer \fIv\fP is positive, the
+graph is set so that future calls to \fBdelete\fP have no immediate effect.
+If \fIv\fP is zero, the graph is unlocked. If there has been a call
+to delete the graph while it was locked, the graph is closed.
+If \fIv\fP is negative, nothing is done.
+In all cases, the previous lock value is returned.
+.SS "Strings"
+.TP
+\fBsprintf\fP(\fIfmt\fP : \fBstring\fP, \fI...\fP) : \fBstring\fP
+returns the string resulting from formatting
+the values of the expressions occurring after \fIfmt\fP
+according to the
+.IR printf (3)
+format
+.I fmt
+.TP
+\fBgsub\fP(\fIstr\fP : \fBstring\fP, \fIpat\fP : \fBstring\fP) : \fBstring\fP
+.TP
+\fBgsub\fP(\fIstr\fP : \fBstring\fP, \fIpat\fP : \fBstring\fP, \fIrepl\fP : \fBstring\fP) : \fBstring\fP
+returns \fIstr\fP with all substrings matching \fIpat\fP
+deleted or replaced by \fIrepl\fP, respectively.
+.TP
+\fBsub\fP(\fIstr\fP : \fBstring\fP, \fIpat\fP : \fBstring\fP) : \fBstring\fP
+.TP
+\fBsub\fP(\fIstr\fP : \fBstring\fP, \fIpat\fP : \fBstring\fP, \fIrepl\fP : \fBstring\fP) : \fBstring\fP
+returns \fIstr\fP with the leftmost substring matching \fIpat\fP
+deleted or replaced by \fIrepl\fP, respectively. The 
+characters '^' and '$'
+may be used at the beginning and end, respectively,
+of \fIpat\fP to anchor the pattern to the beginning or end of \fIstr\fP.
+.TP
+\fBsubstr\fP(\fIstr\fP : \fBstring\fP, \fIidx\fP : \fBint\fP) : \fBstring\fP
+.TP
+\fBsubstr\fP(\fIstr\fP : \fBstring\fP, \fIidx\fP : \fBint\fP, \fIlen\fP : \fBint\fP) : \fBstring\fP
+returns the substring of \fIstr\fP starting at position \fIidx\fP to
+the end of the string or of length \fIlen\fP, respectively.
+Indexing starts at 0. If \fIidx\fP is negative or \fIidx\fP is greater than
+the length of \fIstr\fP, a fatal error occurs. Similarly, in the second
+case, if \fIlen\fP is negative or \fIidx\fP + \fIlen\fP is greater than the
+length of \fIstr\fP, a fatal error occurs.
+.TP
+\fBstrcmp\fP(\fIs1\fP : \fBstring\fP, \fIs2\fP : \fBstring\fP) : \fBint\fP
+provides the standard C function
+.IR strcmp (3).
+.TP
+\fBlength\fP(\fIs\fP : \fBstring\fP) : \fBint\fP
+returns the length of string \fIs\fP.
+.TP
+\fBindex\fP(\fIs\fP : \fBstring\fP, \fIt\fP : \fBstring\fP) : \fBint\fP
+.TP
+\fBrindex\fP(\fIs\fP : \fBstring\fP, \fIt\fP : \fBstring\fP) : \fBint\fP
+returns the index of the character in string \fIs\fP where the leftmost
+(rightmost) copy of string \fIt\fP can be found, or \-1 if \fIt\fP is not a 
+substring of \fIs\fP.
+.TP
+\fBmatch\fP(\fIs\fP : \fBstring\fP, \fIp\fP : \fBstring\fP) : \fBint\fP
+returns the index of the character in string \fIs\fP where the leftmost
+match of pattern \fIp\fP can be found, or \-1 if no substring of \fIs\fP
+matches \fIp\fP.
+.TP
+\fBtoupper\fP(\fIs\fP : \fBstring\fP) : \fBstring\fP
+returns a version of \fIs\fP with the alphabetic characters converted to upper-case.
+.TP
+\fBtolower\fP(\fIs\fP : \fBstring\fP) : \fBstring\fP
+returns a version of \fIs\fP with the alphabetic characters converted to lower-case.
+.TP
+\fBcanon\fP(\fIs\fP : \fBstring\fP) : \fBstring\fP
+returns a version of \fIs\fP appropriate to be used as an identifier
+in a dot file.
+.TP
+\fBhtml\fP(\fIg\fP : \fBgraph_t\fP, \fIs\fP : \fBstring\fP) : \fBstring\fP
+returns a ``magic'' version  of \fIs\fP as an HTML string. This will typically be
+used to attach an HTML-like label to a graph object. Note that the returned string
+lives in \fIg\fP. In particular, it will be freed when \fIg\fP is closed, and to
+act as an HTML string, it has to be used with an object of \fIg\fP. In addition,
+note that the
+angle bracket quotes should not be part of \fIs\fP. These will be added if 
+\fIg\fP is written in concrete DOT format.
+.TP
+\fBishtml\fP(\fIs\fP : \fBstring\fP) : \fBint\fP
+returns non-zero if and only if \fIs\fP is an HTML string.
+.TP
+\fBxOf\fP(\fIs\fP : \fBstring\fP) : \fBstring\fP
+returns the string "\fIx\fP" if \fIs\fP has the form "\fIx\fP,\fIy\fP", 
+where both \fIx\fP and \fIy\fP are numeric.
+.TP
+\fByOf\fP(\fIs\fP : \fBstring\fP) : \fBstring\fP
+returns the string "\fIy\fP" if \fIs\fP has the form "\fIx\fP,\fIy\fP", 
+where both \fIx\fP and \fIy\fP are numeric.
+.TP
+\fBllOf\fP(\fIs\fP : \fBstring\fP) : \fBstring\fP
+returns the string "\fIllx\fP,\fIlly\fP" if \fIs\fP has the form 
+"\fIllx\fP,\fIlly\fP,\fIurx\fP,\fIury\fP",
+where all of \fIllx\fP, \fIlly\fP, \fIurx\fP, and \fIury\fP are numeric.
+.TP
+.BI urOf( s )
+\fBurOf\fP(\fIs\fP : \fBstring\fP) : \fBstring\fP
+returns the string "\fIurx\fP,\fIury\fP" if \fIs\fP has the form 
+"\fIllx\fP,\fIlly\fP,\fIurx\fP,\fIury\fP",
+where all of \fIllx\fP, \fIlly\fP, \fIurx\fP, and \fIury\fP are numeric.
+.TP
+\fBsscanf\fP(\fIs\fP : \fBstring\fP, \fIfmt\fP : \fBstring\fP, \fI...\fP) : \fBint\fP
+scans the string \fIs\fP, extracting values
+according to the
+.IR sscanf (3)
+format
+.IR fmt .
+The values are stored in the addresses following \fIfmt\fP,
+addresses having the form \fB&\fP\fIv\fP, where \fIv\fP is some declared
+variable of the correct type.
+Returns the number of items successfully scanned.
+.TP
+\fBsplit\fP(\fIs\fP : \fBstring\fP, \fIarr\fP : \fBarray\fP, \fIseps\fP : \fBstring\fP) : \fBint\fP
+.TP
+\fBsplit\fP(\fIs\fP : \fBstring\fP, \fIarr\fP : \fBarray\fP) : \fBint\fP
+.TP
+\fBtokens\fP(\fIs\fP : \fBstring\fP, \fIarr\fP : \fBarray\fP, \fIseps\fP : \fBstring\fP) : \fBint\fP
+.TP
+\fBtokens\fP(\fIs\fP : \fBstring\fP, \fIarr\fP : \fBarray\fP) : \fBint\fP
+The \fBsplit\fP function breaks the string \fIs\fP into fields, while the \fBtokens\fP function
+breaks the string into tokens. 
+A field consists of all non-separator characters between two separator characters or the beginning or
+end of the string. Thus, a field may be the empty string. A
+token is a maximal, non-empty substring not containing a separator character.
+The separator characters are those given in the \fIseps\fP argument.
+If \fIseps\fP is not provided, the default value is " \\t\\n". 
+The functions return the number of fields or tokens.
+.sp
+The fields and tokens are stored in the argument array. The array must be \fBstring\fP-valued and
+have \fBint\fP as its index type. The entries are indexed by consecutive
+integers, starting at 0. Any values already stored in the array will be either overwritten, or
+still be present after the function returns.
+.SS "I/O"
+.TP
+\fBprint\fP(\fI...\fP) : \fBvoid\fP
+.BI print( " expr" , " ...\fB )
+prints a string representation of each argument in turn onto
+\fBstdout\fP, followed by a newline.
+.TP
+\fBprintf\fP(\fIfmt\fP : \fBstring\fP, \fI...\fP) : \fBint\fP
+.TP
+\fBprintf\fP(\fIfd\fP : \fBint\fP, \fIfmt\fP : \fBstring\fP, \fI...\fP) : \fBint\fP
+prints the string resulting from formatting
+the values of the expressions following \fIfmt\fP
+according to the
+.IR printf (3)
+format
+.IR fmt .
+Returns 0 on success.
+By default, it prints on \fBstdout\fP.
+If the optional integer \fIfd\fP is given, output is written on the open
+stream associated with \fIfd\fP.
+.TP
+\fBscanf\fP(\fIfmt\fP : \fBstring\fP, \fI...\fP) : \fBint\fP
+.TP
+\fBscanf\fP(\fIfd\fP : \fBint\fP, \fIfmt\fP : \fBstring\fP, \fI...\fP) : \fBint\fP
+scans in values from an input stream according to the
+.IR scanf (3)
+format
+.IR fmt .
+The values are stored in the addresses following \fIfmt\fP,
+addresses having the form \fB&\fP\fIv\fP, where \fIv\fP is some declared
+variable of the correct type.
+By default, it reads from \fBstdin\fP.
+If the optional integer \fIfd\fP is given, input is read from the open
+stream associated with \fIfd\fP.
+Returns the number of items successfully scanned.
+.TP
+\fBopenF\fP(\fIs\fP : \fBstring\fP, \fIt\fP : \fBstring\fP) : \fBint\fP
+opens the file \fIs\fP as an I/O stream. The string argument \fIt\fP
+specifies how the file is opened. The arguments are the same as for
+the C function
+.IR fopen (3).
+It returns an integer denoting the stream, or \-1 on error.
+.sp
+As usual, streams 0, 1 and 2 are already open as \fBstdin\fP, \fBstdout\fP,
+and \fBstderr\fP, respectively. Since \fBgvpr\fP may use \fBstdin\fP to
+read the input graphs, the user should avoid using this stream.
+.TP
+\fBcloseF\fP(\fIfd\fP : \fBint\fP) : \fBint\fP
+closes the open stream denoted by the integer \fIfd\fP.
+Streams  0, 1 and 2 cannot be closed.
+Returns 0 on success.
+.TP
+\fBreadL\fP(\fIfd\fP : \fBint\fP) : \fBstring\fP
+returns the next line read from the input stream \fIfd\fP. It returns
+the empty string "" on end of file. Note that the newline character is
+left in the returned string.
+.SS "Math"
+.TP
+\fBexp\fP(\fId\fP : \fBdouble\fP) : \fBdouble\fP
+returns e to the \fId\fPth power.
+.TP
+\fBlog\fP(\fId\fP : \fBdouble\fP) : \fBdouble\fP
+returns the natural log of \fId\fP.
+.TP
+\fBsqrt\fP(\fId\fP : \fBdouble\fP) : \fBdouble\fP
+returns the square root of the double \fId\fP.
+.TP
+\fBpow\fP(\fId\fP : \fBdouble\fP, \fIx\fP : \fBdouble\fP) : \fBdouble\fP
+returns \fId\fP raised to the \fIx\fPth power.
+.TP
+\fBcos\fP(\fId\fP : \fBdouble\fP) : \fBdouble\fP
+returns the cosine of \fId\fP.
+.TP
+\fBsin\fP(\fId\fP : \fBdouble\fP) : \fBdouble\fP
+returns the sine of \fId\fP.
+.TP
+\fBatan2\fP(\fIy\fP : \fBdouble\fP, \fIx\fP : \fBdouble\fP) : \fBdouble\fP
+returns the arctangent of \fIy/x\fP in the range \-pi to pi.
+.TP
+\fBMIN\fP(\fIy\fP : \fBdouble\fP, \fIx\fP : \fBdouble\fP) : \fBdouble\fP
+returns the minimum of \fIy\fP and \fIx\fP.
+.TP
+\fBMAX\fP(\fIy\fP : \fBdouble\fP, \fIx\fP : \fBdouble\fP) : \fBdouble\fP
+returns the maximum of \fIy\fP and \fIx\fP.
+.SS "Associative Arrays"
+.TP
+\fB#\fP \fIarr\fP : \fBint\fP
+returns the number of elements in the array \fIarr\fP.
+.TP
+\fIidx\fP \fBin\fP \fIarr\fP : \fBint\fP
+returns 1 if a value has been set for index \fIidx\fP in the array \fIarr\fP.
+It returns 0 otherwise.
+.TP
+\fBunset\fP(\fIv\fP : \fBarray\fP, \fIidx\fP) : \fBint\fP
+removes the item indexed by \fIidx\fP. It returns 1 if the item existed, 0 otherwise.
+.TP
+\fBunset\fP(\fIv\fP : \fBarray\fP) : \fBvoid\fP
+re-initializes the array.
+.SS "Miscellaneous"
+.TP
+\fBexit\fP(\fIv\fP : \fBint\fP) : \fBvoid\fP
+causes
+.B gvpr
+to exit with the exit code
+.IR v .
+.TP
+\fBsystem\fP(\fIcmd\fP : \fBstring\fP) : \fBint\fP
+provides the standard C function
+.IR system (3).
+It executes \fIcmd\fP in the user's shell environment, and
+returns the exit status of the shell.
+.TP
+\fBrand\fP() : \fBdouble\fP
+returns a pseudo\(hyrandom double between 0 and 1.
+.TP
+\fBsrand\fP() : \fBint\fP
+.TP
+\fBsrand\fP(\fIv\fP : \fBint\fP) : \fBint\fP
+sets a seed for the random number generator. The optional argument gives
+the seed; if it is omitted, the current time is used. The previous seed
+value is returned. \fBsrand\fP should be called before any calls to
+\fBrand\fP.
+.TP
+\fBcolorx\fP(\fIcolor\fP : \fBstring\fP, \fIfmt\fP : \fBstring\fP) : \fBstring\fP
+translates a color from one format to another. The \fIcolor\fP argument should be
+a color in one of the recognized string representations. The \fIfmt\fP value should
+be one of "RGB", "RGBA", "HSV", or "HSVA".
+An empty string is returned on error.
+.SH "BUILT\(hyIN VARIABLES"
+.PP
+.B gvpr
+provides certain special, built\(hyin variables, whose values are set
+automatically by \fBgvpr\fP depending on the context. Except as noted,
+the user cannot modify their values.
+.TP
+\fB$\fP : \fBobj_t\fP
+denotes the current object (node, edge, graph) depending on the
+context.  It is not available in \fBBEGIN\fP or \fBEND\fP clauses.
+.TP
+\fB$F\fP : \fBstring\fP
+is the name of the current input file. 
+.TP
+\fB$G\fP : \fBgraph_t\fP
+denotes the current graph being processed. It is not available
+in \fBBEGIN\fP or \fBEND\fP clauses.
+.TP
+\fB$NG\fP : \fBgraph_t\fP
+denotes the next graph to be processed. If \fB$NG\fP is NULL, 
+the current graph \fB$G\fP is the last graph. Note that if the input
+comes from stdin, the last graph cannot be determined until the input
+pipe is closed. 
+It is not available in \fBBEGIN\fP or \fBEND\fP clauses, or if the 
+\fB\-n\fP flag is used.
+.TP
+\fB$O\fP : \fBgraph_t\fP
+denotes the output graph. Before graph traversal, it is initialized
+to the target graph. After traversal and any \fBEND_G\fP actions,
+if it refers to a non\(hyempty graph, that graph is printed onto the output stream.
+It is only valid in \fBN\fP, \fBE\fP and \fBEND_G\fP clauses.
+The output graph may be set by the user.
+.TP
+\fB$T\fP : \fBgraph_t\fP
+denotes the current target graph. It is a subgraph of \fB$G\fP
+and is available only in \fBN\fP, \fBE\fP and \fBEND_G\fP clauses.
+.TP
+\fB$tgtname\fP : \fBstring\fP
+denotes the name of the target graph. 
+By default, it is set to \fB"gvpr_result"\fP.
+If used multiple times during the execution of
+.BR gvpr ,
+the name will be appended with an integer. 
+This variable may be set by the user.
+.TP
+\fB$tvroot\fP : \fBnode_t\fP
+indicates the starting node for a (directed or undirected)
+depth\(hyfirst or breadth\(hyfirst traversal of the
+graph (cf. \fB$tvtype\fP below).
+The default value is \fBNULL\fP for each input graph.
+After the traversal at the given root, if the value of \fB$tvroot\fP has changed,
+a new traversal will begin with the new value of \fB$tvroot\fP. Also, see \fB$tvnext\fP below.
+.TP
+\fB$tvnext\fP : \fBnode_t\fP
+indicates the next starting node for a (directed or undirected)
+depth\(hyfirst or breadth\(hyfirst traversal of the
+graph (cf. \fB$tvtype\fP below).
+If a traversal finishes and the \fB$tvroot\fP has not been reset but the \fB$tvnext\fP has been
+set but not used, this node will be used as the next choice for \fB$tvroot\fP.
+The default value is \fBNULL\fP for each input graph.
+.TP
+\fB$tvedge\fP : \fBedge_t\fP
+For BFS and DFS traversals, this is set to the edge used to arrive at the
+current node or edge. At the beginning of a traversal, or for other traversal
+types, the value is \fBNULL\fP.
+.TP
+\fB$tvtype\fP : \fBtvtype_t\fP
+indicates how \fBgvpr\fP traverses a graph. It can only take
+one of the constant values with the prefix "TV_" described below.
+\fBTV_flat\fP is the default.
+.IP
+In the underlying graph library
+.IR cgraph (3),
+edges in undirected graphs are given an arbitrary direction. This is
+used for traversals, such as \fBTV_fwd\fR, requiring directed edges.
+.
+.TP
+\fBARGC\fP : \fBint\fP
+denotes the number of arguments specified by the 
+\fB\-a\fP \fIargs\fP command\(hyline argument.
+.TP
+\fBARGV\fP : \fBstring array\fP
+denotes the array of arguments specified by the 
+\fB\-a\fP \fIargs\fP
+command\(hyline argument. The \fIi\fPth argument is given
+by \fBARGV[\fIi\fP]\fR.
+.SH "BUILT\(hyIN CONSTANTS"
+.PP
+There are several symbolic constants defined by \fBgvpr\fP.
+.TP
+\fBNULL\fR : \fIobj_t\fR
+a null object reference, equivalent to 0.
+.TP
+\fBTV_flat\fR : \fItvtype_t\fR
+a simple, flat traversal, with graph objects visited in
+seemingly arbitrary order.
+.TP
+\fBTV_ne\fR : \fItvtype_t\fR
+a traversal which first visits all of the nodes, then all
+of the edges.
+.TP
+\fBTV_en\fR : \fItvtype_t\fR
+a traversal which first visits all of the edges, then all
+of the nodes.
+.TP
+\fBTV_dfs\fR : \fItvtype_t\fR
+.TQ
+\fBTV_postdfs\fR : \fItvtype_t\fR
+.TQ
+\fBTV_prepostdfs\fR : \fItvtype_t\fR
+a traversal of the graph using a depth\(hyfirst search on the
+underlying undirected graph. 
+To do the traversal, \fBgvpr\fP will check the value of
+\fB$tvroot\fP. If this has the same value that it had previously
+(at the start, the previous value is initialized to \fBNULL\fP.), \fBgvpr\fP
+will simply look for some unvisited node and traverse its connected
+component. On the other hand, if \fB$tvroot\fP has changed, its connected
+component will be toured, assuming it has not been previously visited or,
+if \fB$tvroot\fP is \fBNULL\fP, the traversal will stop. Note that using
+\fBTV_dfs\fP and \fB$tvroot\fP, it is possible to create an infinite loop.
+.
+.IP
+By default, the traversal is done in pre-order. That is, a node is
+visited before all of its unvisited edges. For \fBTV_postdfs\fR,
+all of a node's unvisited edges are visited before the node. For
+\fBTV_prepostdfs\fR, a node is visited twice, before and after all of
+its unvisited edges.
+.
+.TP
+\fBTV_fwd\fR : \fItvtype_t\fR
+.TQ
+\fBTV_postfwd\fR : \fItvtype_t\fR
+.TQ
+\fBTV_prepostfwd\fR : \fItvtype_t\fR
+A traversal of the graph using a depth\(hyfirst search on the
+graph following only forward arcs.
+The choice of roots for the traversal is the
+same as described for \fBTV_dfs\fR above.
+The different order of visitation specified by \fBTV_fwd\fR,
+\fBTV_postfwd\fR and \fBTV_prepostfwd\fR are the same as those
+specified by the analogous traversals \fBTV_dfs\fR,
+\fBTV_postdfs\fR and \fBTV_prepostdfs\fR.
+.TP
+\fBTV_rev\fR : \fItvtype_t\fR
+.TQ
+\fBTV_postrev\fR : \fItvtype_t\fR
+.TQ
+\fBTV_prepostrev\fR : \fItvtype_t\fR
+A traversal of the graph using a depth\(hyfirst search on the
+graph following only reverse arcs.
+The choice of roots for the traversal is the
+same as described for \fBTV_dfs\fR above.
+The different order of visitation specified by \fBTV_rev\fR,
+\fBTV_postrev\fR and \fBTV_prepostrev\fR are the same as those
+specified by the analogous traversals \fBTV_dfs\fR,
+\fBTV_postdfs\fR and \fBTV_prepostdfs\fR.
+.TP
+\fBTV_bfs\fR : \fItvtype_t\fR
+A traversal of the graph using a breadth\(hyfirst search on the
+graph ignoring edge directions. See the item on \fBTV_dfs\fR above
+for the role of \fB$tvroot\fP.
+.SH EXAMPLES
+.PP
+.RS
+.nf
+\fBgvpr \-i 'N[color=="blue"]' file.gv\fP
+.fi
+.RE
+.DT
+.PP
+Generate the node\(hyinduced subgraph of all nodes with color blue.
+.PP
+.RS
+.nf
+\fBgvpr \-c 'N[color=="blue"]{color = "red"}' file.gv\fP
+.fi
+.RE
+.DT
+.PP
+Make all blue nodes red.
+.PP
+.RS
+.nf
+\fBBEGIN { int n, e; int tot_n = 0; int tot_e = 0; }
+BEG_G {
+  n = nNodes($G);
+  e = nEdges($G);
+  printf ("%d nodes %d edges %s\\n", n, e, $G.name);
+  tot_n += n;
+  tot_e += e;
+}
+END { printf ("%d nodes %d edges total\\n", tot_n, tot_e) }\fP
+.fi
+.RE
+.DT
+.PP
+Version of the program \fBgc\fP.
+.PP
+.RS
+.nf
+\fBBEG_G { graph_t g = graph ("merge", "S"); }
+E {
+  node_t h = clone(g,$.head);
+  node_t t = clone(g,$.tail);
+  edge_t e = edge(t,h,"");
+  e.weight = e.weight + 1;
+}
+END_G { $O = g; }\fP
+.fi
+.RE
+.DT
+.PP
+Produces a strict version of the input graph, where the weight attribute
+of an edge indicates how many edges from the input graph the edge represents.
+.PP
+.RS
+.nf
+\fBBEGIN {node_t n; int deg[]}
+E{deg[head]++; deg[tail]++; }
+END_G {
+  for (deg[n]) {
+    printf ("deg[%s] = %d\\n", n.name, deg[n]);
+  }
+}\fP
+.fi
+.RE
+.DT
+.PP
+Computes the degrees of nodes with edges.
+.PP
+.RS
+.nf
+\fBBEGIN {
+  int i, indent;
+  int seen[string];
+  void prInd (int cnt) {
+    for (i = 0; i < cnt; i++) printf ("  ");
+  }
+}
+BEG_G {
+
+   $tvtype = TV_prepostfwd;
+   $tvroot = node($,ARGV[0]);
+}
+N {
+  if (seen[$.name]) indent--;
+  else {
+    prInd(indent);
+      print ($.name);
+    seen[$.name] = 1;
+    indent++;
+  }
+}\fP
+.fi
+.RE
+.DT
+.PP
+Prints the depth-first traversal of the graph, starting
+with the node whose name is \fBARGV[0]\fP, as an indented list.
+.SH ENVIRONMENT
+.TP
+.B GVPRPATH
+Colon\(hyseparated list of directories to be searched to find
+the file specified by the \-f option. \fBgvpr\fP has a default list built in. If \fBGVPRPATH\fP
+is not defined, the default list is used. If \fBGVPRPATH\fP starts with colon, the list is formed
+by appending \fBGVPRPATH\fP to the default list. If \fBGVPRPATH\fP ends with colon, the list is formed
+by appending the default list to \fBGVPRPATH\fP. Otherwise, \fBGVPRPATH\fP is used for the list.
+.P
+On Windows systems, replace ``colon'' with ``semicolon'' in the previous paragraph.
+.SH BUGS AND WARNINGS
+Scripts should be careful deleting nodes during \fBN{}\fP and \fBE{}\fP
+blocks using BFS and DFS traversals as these rely on stacks and queues of
+nodes. 
+.PP
+When the program is given as a command line argument, the usual
+shell interpretation takes place, which may affect some of the
+special names in \fBgvpr\fP. To avoid this, it is best to wrap the
+program in single quotes.
+.PP
+If string constants contain pattern metacharacters that you want to
+escape to avoid pattern matching, two backslashes will probably be
+necessary, as a single backslash will be lost when the string is
+originally scanned. Usually, it is simpler to use \fBstrcmp\fP to
+avoid pattern matching.
+.PP
+As of 24 April 2008, \fBgvpr\fP switched to using a new, underlying
+graph library, which uses the simpler model that there is only one
+copy of a node, not one copy for each subgraph logically containing
+it. This means that iterators such as \fInxtnode\fP cannot traverse
+a subgraph using just a node argument. For this reason, subgraph
+traversal requires new functions ending in "_sg", which also take
+a subgraph argument. The versions without that suffix will always
+traverse the root graph.
+.PP
+There is a single global scope, except for formal function parameters,
+and even these can interfere with the type system. Also, the 
+extent of all variables is the entire life of the program. 
+It might be preferable for scope
+to reflect the natural nesting of the clauses, or for the program
+to at least reset locally declared variables.
+For now, it is advisable to use distinct names for all variables.
+.PP
+If a function ends with a complex statement, such as an
+IF statement, with each branch doing a return, type checking may fail. 
+Functions should use a return at the end.
+.PP
+The expr library does not support string values of (char*)0.
+This means we can't distinguish between "" and (char*)0 edge keys.
+For the purposes of looking up and creating edges, we translate "" 
+to be (char*)0, since this latter value is
+necessary in order to look up any edge with a matching head and tail.
+.PP
+Related to this, strings converted to integers act like char pointers,
+getting the value 0 or 1 depending on whether the string consists
+solely of zeroes or not. Thus, the ((int)"2") evaluates to 1.
+.PP
+The language inherits the usual C problems such as dangling references
+and the confusion between '=' and '=='.
+.SH AUTHOR
+Emden R. Gansner <[email protected]>
+.SH "SEE ALSO"
+.PP
+awk(1), gc(1), dot(1), nop(1), expr(3), cgraph(3)

+ 108 - 0
graphviz.mod/graphviz/cmd/gvpr/gvprmain.c

@@ -0,0 +1,108 @@
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: Details at https://graphviz.org
+ *************************************************************************/
+
+
+/*
+ * gvpr: graph pattern recognizer
+ *
+ * Written by Emden Gansner
+ */
+
+
+#include "config.h"
+#include <limits.h>
+#include <stddef.h>
+#include <stdio.h>
+
+#include <cgraph/cgraph.h>
+#include <gvpr/gvpr.h>
+#include <util/exit.h>
+
+#ifdef DEBUG
+static ssize_t outfn (void* sp, const char *buf, size_t nbyte, void* dp)
+{
+  if (nbyte > (size_t)INT_MAX) {
+    return -1;
+  }
+  return printf("<stdout>%.*s", (int)nbyte, buf);
+}
+
+static ssize_t errfn (void* sp, const char *buf, size_t nbyte, void* dp)
+{
+  if (nbyte > (size_t)INT_MAX) {
+    return -1;
+  }
+  return fprintf(stderr, "<stderr>%.*s", (int)nbyte, buf);
+}
+
+static int iofread(void *chan, char *buf, int bufsize)
+{
+  return (int)fread(buf, 1, (size_t)bufsize, chan);
+}
+
+static int ioputstr(void *chan, const char *str)
+{
+  return fputs(str, chan);
+}
+
+static int ioflush(void *chan)
+{
+  return fflush(chan);
+}
+
+static Agiodisc_t gprIoDisc = { iofread, ioputstr, ioflush };
+
+static Agdisc_t gprDisc = { &AgIdDisc, &gprIoDisc };
+
+int
+main (int argc, char* argv[])
+{
+    Agraph_t* gs[2];
+    Agraph_t* g = agread(stdin, &gprDisc);
+    int rv;
+    gvpropts opts;
+
+    gs[0] = g;
+    gs[1] = 0;
+    opts.ingraphs = gs;
+    opts.out = outfn;
+    opts.err = errfn;
+    opts.flags = GV_USE_OUTGRAPH;
+    opts.bindings = 0;
+    
+    rv = gvpr (argc, argv, &opts);
+
+    fprintf(stderr, "rv %d\n", rv);
+
+    rv = gvpr (argc, argv, &opts);
+
+    graphviz_exit(rv);
+}
+
+#else
+int
+main (int argc, char* argv[])
+{
+    gvpropts opts;
+    opts.ingraphs = 0;
+    opts.out = 0;
+    opts.err = 0;
+    opts.flags = GV_USE_EXIT;
+    opts.bindings = 0;
+    
+    graphviz_exit(gvpr(argc, argv, &opts));
+}
+
+#endif
+
+/**
+ * @dir cmd/gvpr
+ * @brief graph pattern scanning and processing language
+ */

+ 688 - 0
graphviz.mod/graphviz/cmd/gvpr/lib/Makefile

@@ -0,0 +1,688 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# cmd/gvpr/lib/Makefile.  Generated from Makefile.in by configure.
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+
+
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/graphviz
+pkgincludedir = $(includedir)/graphviz
+pkglibdir = $(libdir)/graphviz
+pkglibexecdir = $(libexecdir)/graphviz
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = x86_64-pc-linux-gnu
+host_triplet = x86_64-pc-linux-gnu
+subdir = cmd/gvpr/lib
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \
+	$(top_srcdir)/m4/ax_compare_version.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltargz.m4 \
+	$(top_srcdir)/m4/ltdl.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/./version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_$(V))
+am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY))
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(gvprdir)"
+DATA = $(gvpr_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = ${SHELL} /builds/graphviz/graphviz/config/missing aclocal-1.16
+AMTAR = $${TAR-tar}
+AM_DEFAULT_VERBOSITY = 0
+ANN_CFLAGS = 
+ANN_LIBS = -lann
+AR = ar
+AUTOCONF = ${SHELL} /builds/graphviz/graphviz/config/missing autoconf
+AUTOHEADER = ${SHELL} /builds/graphviz/graphviz/config/missing autoheader
+AUTOMAKE = ${SHELL} /builds/graphviz/graphviz/config/missing automake-1.16
+AWK = mawk
+CC = gcc
+CCDEPMODE = depmode=gcc3
+CFLAGS = -g -O2 -Wall -Wextra -Wmissing-include-dirs -Wswitch-default -Wfloat-equal -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wconversion -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Wtrampolines -Wlogical-op -Wno-unknown-pragmas -Wstrict-prototypes -Wpointer-arith -Wall
+CPP = gcc -E
+CPPFLAGS = 
+CXX = g++ -std=c++17
+CXXCPP = g++ -E -std=c++17
+CXXDEPMODE = depmode=gcc3
+CXXFLAGS = -g -O2 -fPIE -fPIC
+CYGPATH_W = echo
+CYGWIN = no
+DARWIN = 
+DEFS = -DHAVE_CONFIG_H
+DEPDIR = .deps
+DEVIL_INCLUDES = 
+DEVIL_LIBS =  -lIL -lILU
+DLLTOOL = false
+DSYMUTIL = 
+DUMPBIN = 
+ECHO_C = 
+ECHO_N = -n
+ECHO_T = 
+EGREP = /usr/bin/grep -E
+EXEEXT = 
+EXPAT_CFLAGS = 
+EXPAT_LIBS = -lexpat
+FGREP = /usr/bin/grep -F
+FREETYPE2_CFLAGS = -I/usr/include/freetype2 -I/usr/include/libpng16
+FREETYPE2_LIBS = -lfreetype
+GDIPLUS_CFLAGS = 
+GDIPLUS_HEADS = 
+GDIPLUS_LIBS = 
+GDK_CFLAGS = -pthread -I/usr/include/gtk-3.0 -I/usr/include/gio-unix-2.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/fribidi -I/usr/include/harfbuzz -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/uuid -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include
+GDK_LIBS = -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -lgdk_pixbuf-2.0 -lcairo-gobject -lcairo -lgobject-2.0 -lglib-2.0
+GDK_PIXBUF_CFLAGS = -pthread -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include
+GDK_PIXBUF_LIBS = -lgdk_pixbuf-2.0 -lgobject-2.0 -lglib-2.0
+GDLIB_CFLAGS = 
+GDLIB_CONFIG = 
+GDLIB_LIBS =  -lgd -lgd
+GLADE_CFLAGS = -pthread -I/usr/include/libglade-2.0 -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/pango-1.0 -I/usr/include/fribidi -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/uuid -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/libxml2
+GLADE_LIBS = -lglade-2.0 -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lharfbuzz -lfontconfig -lfreetype -lxml2
+GLUT_CFLAGS = 
+GLUT_LIBS =  -lglut
+GO = go
+GO_INCLUDES = 
+GO_LIBS = 
+GRAPHVIZ_AUTHOR_EMAIL = 
+GRAPHVIZ_AUTHOR_NAME = 
+GRAPHVIZ_CHANGE_DATE = Fri Dec  6 2024
+GRAPHVIZ_VERSION_DATE = 20241206.2353
+GRAPHVIZ_VERSION_MAJOR = 12
+GRAPHVIZ_VERSION_MICRO = 1
+GRAPHVIZ_VERSION_MINOR = 2
+GREP = /usr/bin/grep
+GROFF = groff
+GS_CFLAGS = 
+GS_LIBS = -lgs
+GTKGLEXT_CFLAGS = -pthread -I/usr/include/gtkglext-1.0 -I/usr/lib/x86_64-linux-gnu/gtkglext-1.0/include -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/pango-1.0 -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/pango-1.0 -I/usr/include/fribidi -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/uuid -I/usr/include/freetype2 -I/usr/include/libpng16
+GTKGLEXT_LIBS = -lgtkglext-x11-1.0 -lgdkglext-x11-1.0 -lGLU -lGL -lXmu -lXt -lSM -lICE -lgdk-x11-2.0 -lpangox-1.0 -lX11 -Wl,--export-dynamic -lgmodule-2.0 -pthread -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lharfbuzz -lfontconfig -lfreetype
+GTKGL_CFLAGS = 
+GTKGL_LIBS = 
+GTK_CFLAGS = -pthread -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/pango-1.0 -I/usr/include/fribidi -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/uuid -I/usr/include/freetype2 -I/usr/include/libpng16
+GTK_LIBS = -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lharfbuzz -lfontconfig -lfreetype
+GTS_CFLAGS = -pthread -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include
+GTS_LIBS = -lgts -lm -lgthread-2.0 -pthread -Wl,--export-dynamic -lgmodule-2.0 -pthread -lglib-2.0
+GUILE_CFLAGS = -pthread -I/usr/include/guile/3.0
+GUILE_LIBS = -lguile-3.0 -lgc
+GVPLUGIN_CONFIG_FILE = config6
+GVPLUGIN_VERSION = 6
+GVPLUGIN_VERSION_INFO = 6:0:0
+HAVE_CXX17 = 1
+INCLTDL = 
+INSTALL = /usr/bin/install -c
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_SCRIPT = ${INSTALL}
+INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
+INTGOSIZE = 64
+IPSEPCOLA_INCLUDES = -I$(top_srcdir)/lib/vpsc
+IPSEPCOLA_LIBS = $(top_builddir)/lib/vpsc/libvpsc_C.la
+JAVA = 
+JAVASCRIPT = 
+JAVA_INCLUDES = 
+JAVA_LIBS = 
+JNI_EXTRA_LDFLAGS = -shrext .so
+JSHEXT = so
+LASI_CFLAGS = -I/usr/include/pango-1.0 -I/usr/include/fribidi -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/uuid -I/usr/include/freetype2 -I/usr/include/libpng16
+LASI_LIBS = -lLASi -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lharfbuzz -lfontconfig -lfreetype
+LD = /usr/bin/ld -m elf_x86_64
+LDFLAGS = 
+LEX = flex
+LEXLIB = 
+LEX_OUTPUT_ROOT = lex.yy
+LIBADD_DL = -ldl 
+LIBADD_DLD_LINK = 
+LIBADD_DLOPEN = -ldl
+LIBADD_SHL_LOAD = 
+LIBLTDL = -lltdl
+LIBOBJS = 
+LIBPOSTFIX = 64
+LIBS = 
+LIBTOOL = $(SHELL) $(top_builddir)/libtool
+LIPO = 
+LN_S = ln -s
+LTDLDEPS = 
+LTDLINCL = 
+LTDLOPEN = libltdl
+LTLIBOBJS = 
+LT_ARGZ_H = 
+LT_CONFIG_H = config.h
+LT_DLLOADERS =  libltdl/dlopen.la
+LT_DLPREOPEN = -dlpreopen libltdl/dlopen.la 
+LT_SYS_LIBRARY_PATH = 
+LUA = lua
+LUA_INCLUDES =  -I/usr/include/lua5.3
+LUA_INSTALL_DIR = /usr/lib/x86_64-linux-gnu/lua
+LUA_LIBS =  -llua5.3
+MAKEINFO = ${SHELL} /builds/graphviz/graphviz/config/missing makeinfo
+MANIFEST_TOOL = :
+MATH_LIBS = -lm
+MCS = 
+MINGW32 = no
+MKDIR_P = /usr/bin/mkdir -p
+NM = /usr/bin/nm -B
+NMEDIT = 
+OBJC = gcc
+OBJCDEPMODE = depmode=gcc3
+OBJCFLAGS = 
+OBJDUMP = objdump
+OBJEXT = o
+OTOOL = 
+OTOOL64 = 
+PACKAGE = graphviz
+PACKAGE_BUGREPORT = https://gitlab.com/graphviz/graphviz/-/issues
+PACKAGE_NAME = graphviz
+PACKAGE_STRING = graphviz 12.2.1
+PACKAGE_TARNAME = graphviz
+PACKAGE_URL = 
+PACKAGE_VERSION = 12.2.1
+PANGOCAIRO_CFLAGS = -I/usr/include/pango-1.0 -I/usr/include/fribidi -I/usr/include/harfbuzz -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/uuid -I/usr/include/freetype2 -I/usr/include/libpng16
+PANGOCAIRO_LIBS = -lpangocairo-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lharfbuzz -lcairo
+PANGOFT2_CFLAGS = -I/usr/include/pango-1.0 -I/usr/include/fribidi -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/uuid -I/usr/include/freetype2 -I/usr/include/libpng16
+PANGOFT2_LIBS = -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lharfbuzz -lfontconfig -lfreetype
+PATH_SEPARATOR = :
+PERL = perl
+PERL_INCLUDES = -I/usr/lib/x86_64-linux-gnu/perl/5.30/CORE
+PERL_INSTALL_DIR = /usr/lib/x86_64-linux-gnu/perl5/5.30
+PERL_LIBS = -L/usr/lib/x86_64-linux-gnu/perl/5.30/CORE -lperl
+PHP = php
+PHPCONFIG = php-config
+PHP_INCLUDES = -I/usr/include/php/20190902 -I/usr/include/php/20190902/main -I/usr/include/php/20190902/TSRM -I/usr/include/php/20190902/Zend -I/usr/include/php/20190902/ext -I/usr/include/php/20190902/ext/date/lib
+PHP_INSTALL_DATADIR = /usr/share/php
+PHP_INSTALL_DIR = /usr/lib/php/20190902
+PHP_LIBS = -L/usr/lib/php/20190902 -lcrypt -largon2 -lresolv -lcrypt -lrt -lm -ldl -lxml2 -lssl -lcrypto -lpcre2-8 -lz -lsodium -lcrypt -largon2 -lcrypt
+PKG_CONFIG = /usr/bin/pkg-config
+PKG_CONFIG_LIBDIR = 
+PKG_CONFIG_PATH = 
+PLATFORMSDKINCLUDE = 
+PLATFORMSDKLIB = 
+POPPLER_CFLAGS = -I/usr/include/poppler/glib -I/usr/include/poppler -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/uuid -I/usr/include/freetype2 -I/usr/include/libpng16
+POPPLER_LIBS = -lpoppler-glib -lgobject-2.0 -lglib-2.0 -lcairo
+PS2PDF = ps2pdf
+PYTHON3 = python3
+PYTHON3_INCLUDES =  -I/usr/include/python3.8 -I/usr/include/x86_64-linux-gnu/python3.8
+PYTHON3_INSTALL_DIR = /usr/lib/python3.8/site-packages
+PYTHON3_LIBS =  
+QMAKE = qmake
+QTCORE_CFLAGS = -DQT_CORE_LIB -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/x86_64-linux-gnu/qt5
+QTCORE_LIBS = -lQt5Core
+QTGUI_CFLAGS = -DQT_PRINTSUPPORT_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/include/x86_64-linux-gnu/qt5/QtPrintSupport -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/x86_64-linux-gnu/qt5
+QTGUI_LIBS = -lQt5PrintSupport -lQt5Widgets -lQt5Gui -lQt5Core
+QUARTZ_CFLAGS = 
+QUARTZ_LIBS = 
+RANLIB = ranlib
+RSVG_CFLAGS = -pthread -I/usr/include/librsvg-2.0 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/uuid -I/usr/include/freetype2 -I/usr/include/libpng16
+RSVG_LIBS = -lrsvg-2 -lm -lgio-2.0 -lgdk_pixbuf-2.0 -lgobject-2.0 -lglib-2.0 -lcairo
+RUBY = ruby
+RUBY_CFLAGS = -I/usr/include/x86_64-linux-gnu/ruby-2.7.0 -I/usr/include/ruby-2.7.0
+RUBY_INSTALL_DIR = /usr/lib/x86_64-linux-gnu/ruby/vendor_ruby/2.7.0
+RUBY_LIBS = -lruby-2.7 -lm
+RUBY_VER = 
+R_CFLAGS = 
+R_LIBS = 
+SED = /usr/bin/sed
+SET_MAKE = 
+SHARED_LIBRARY_SUFFIX = .so
+SHELL = /bin/bash
+STRIP = strip
+SWIG = swig
+SWIGJAVA_CPPFLAGS = 
+SWIG_PHP_DATA = gv.php
+SWIG_PHP_DATA_TO_PACKAGE = usr/share/php/gv.php
+SWIG_PHP_OPT = -php7
+SWIG_VERSION = 4.0.1
+TCLCONFIG = /usr/lib/tclConfig.sh
+TCLINT_INCLUDES = -I/usr/include/tcl8.6/tcl-private/generic
+TCLSH = /usr/bin/tclsh8.6
+TCLSH_EXEC_PREFIX = /usr
+TCL_CFLAGS =  -DUSE_TCL_STUBS
+TCL_DEFS = -DPACKAGE_NAME=\"tcl\" -DPACKAGE_TARNAME=\"tcl\" -DPACKAGE_VERSION=\"8.6\" -DPACKAGE_STRING=\"tcl\ 8.6\" -DPACKAGE_BUGREPORT=\"\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_SYS_PARAM_H=1 -DUSE_THREAD_ALLOC=1 -D_REENTRANT=1 -D_THREAD_SAFE=1 -DHAVE_PTHREAD_ATTR_SETSTACKSIZE=1 -DHAVE_PTHREAD_ATFORK=1 -DTCL_THREADS=1 -DTCL_CFGVAL_ENCODING=\"iso8859-1\" -DHAVE_ZLIB=1 -DMODULE_SCOPE=extern\ __attribute__\(\(__visibility__\(\"hidden\"\)\)\) -DHAVE_HIDDEN=1 -DHAVE_CAST_TO_UNION=1 -DTCL_SHLIB_EXT=\".so\" -DNDEBUG=1 -DTCL_CFG_OPTIMIZED=1 -DTCL_TOMMATH=1 -DMP_PREC=4 -D_LARGEFILE64_SOURCE=1 -DTCL_WIDE_INT_IS_LONG=1 -DHAVE_GETCWD=1 -DHAVE_MKSTEMP=1 -DHAVE_OPENDIR=1 -DHAVE_STRTOL=1 -DHAVE_WAITPID=1 -DHAVE_GETNAMEINFO=1 -DHAVE_GETADDRINFO=1 -DHAVE_FREEADDRINFO=1 -DHAVE_GAI_STRERROR=1 -DHAVE_STRUCT_ADDRINFO=1 -DHAVE_STRUCT_IN6_ADDR=1 -DHAVE_STRUCT_SOCKADDR_IN6=1 -DHAVE_STRUCT_SOCKADDR_STORAGE=1 -DHAVE_GETPWUID_R_5=1 -DHAVE_GETPWUID_R=1 -DHAVE_GETPWNAM_R_5=1 -DHAVE_GETPWNAM_R=1 -DHAVE_GETGRGID_R_5=1 -DHAVE_GETGRGID_R=1 -DHAVE_GETGRNAM_R_5=1 -DHAVE_GETGRNAM_R=1 -DHAVE_DECL_GETHOSTBYNAME_R=1 -DHAVE_GETHOSTBYNAME_R_6=1 -DHAVE_GETHOSTBYNAME_R=1 -DHAVE_DECL_GETHOSTBYADDR_R=1 -DHAVE_GETHOSTBYADDR_R_8=1 -DHAVE_GETHOSTBYADDR_R=1 -DHAVE_TERMIOS_H=1 -DHAVE_SYS_IOCTL_H=1 -DHAVE_SYS_TIME_H=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_GMTIME_R=1 -DHAVE_LOCALTIME_R=1 -DHAVE_MKTIME=1 -DHAVE_TM_GMTOFF=1 -DHAVE_TIMEZONE_VAR=1 -DHAVE_STRUCT_STAT_ST_BLOCKS=1 -DHAVE_STRUCT_STAT_ST_BLKSIZE=1 -DHAVE_BLKCNT_T=1 -DHAVE_INTPTR_T=1 -DHAVE_UINTPTR_T=1 -DNO_UNION_WAIT=1 -DHAVE_SIGNED_CHAR=1 -DHAVE_LANGINFO=1 -DHAVE_MKSTEMPS=1 -DHAVE_FTS=1 -DHAVE_SYS_IOCTL_H=1 -DTCL_UNLOAD_DLLS=1 -DHAVE_CPUID=1 
+TCL_INCLUDES = -I/usr/include/tcl8.6
+TCL_INSTALL_DIR = /usr/lib64/tcl8.6
+TCL_LIBS = 
+TCL_MAJOR_VERSION = 8
+TCL_MINOR_VERSION = 6
+TCL_PATCH_LEVEL = .10
+TCL_PKGINDEX = tcldot/pkgIndex.tcl tclpathplan/pkgIndex.tcl
+TCL_PKGINDEX_GD = gdtclft/pkgIndex.tcl
+TCL_PKGINDEX_SWIG = gv/pkgIndex.tcl
+TCL_SHLIB_SUFFIX = .so
+TCL_SRC_DIR = /usr/include/tcl8.6/tcl-private
+TCL_STUB_LIB_SPEC = -L/usr/lib/x86_64-linux-gnu -ltclstub8.6
+TCL_VERSION = 8.6
+VERSION = 12.2.1
+WEBP_CFLAGS = 
+WEBP_LIBS = -lwebp
+XMKMF = 
+XRENDER_CFLAGS = 
+XRENDER_LIBS = -lXrender -lX11
+X_CFLAGS = 
+X_EXTRA_LIBS = 
+X_LIBS = 
+X_PRE_LIBS =  -lSM -lICE
+YACC = bison -y
+YFLAGS = 
+Z_INCLUDES = 
+Z_LIBS =  -lz
+abs_builddir = /builds/graphviz/graphviz/cmd/gvpr/lib
+abs_srcdir = /builds/graphviz/graphviz/cmd/gvpr/lib
+abs_top_builddir = /builds/graphviz/graphviz
+abs_top_srcdir = /builds/graphviz/graphviz
+ac_ct_AR = ar
+ac_ct_CC = gcc
+ac_ct_CXX = g++
+ac_ct_DUMPBIN = 
+ac_ct_OBJC = gcc
+am__include = include
+am__leading_dot = .
+am__quote = 
+am__tar = tar --format=ustar -chf - "$$tardir"
+am__untar = tar -xf -
+bindir = ${exec_prefix}/bin
+build = x86_64-pc-linux-gnu
+build_alias = 
+build_cpu = x86_64
+build_os = linux-gnu
+build_vendor = pc
+builddir = .
+datadir = ${datarootdir}
+datarootdir = ${prefix}/share
+demodir = $(pkgdatadir)/demo
+docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
+dvidir = ${docdir}
+exec_prefix = ${prefix}
+host = x86_64-pc-linux-gnu
+host_alias = 
+host_cpu = x86_64
+host_os = linux-gnu
+host_vendor = pc
+htmldir = ${docdir}
+includedir = ${prefix}/include
+infodir = ${datarootdir}/info
+install_sh = ${SHELL} /builds/graphviz/graphviz/config/install-sh
+libdir = ${exec_prefix}/lib
+libexecdir = ${exec_prefix}/libexec
+localedir = ${datarootdir}/locale
+localstatedir = ${prefix}/var
+ltdl_LIBOBJS =  lt__strl.o
+ltdl_LTLIBOBJS =  lt__strl.lo
+mandir = ${datarootdir}/man
+mkdir_p = $(MKDIR_P)
+oldincludedir = /usr/include
+pdfdir = ${docdir}
+pkgconfigdir = ${libdir}/pkgconfig
+prefix = /usr/local
+program_transform_name = s,x,x,
+psdir = ${docdir}
+runstatedir = ${localstatedir}/run
+sbindir = ${exec_prefix}/sbin
+sharedstatedir = ${prefix}/com
+srcdir = .
+subdirs =  libltdl
+sys_symbol_underscore = no
+sysconfdir = ${prefix}/etc
+target_alias = 
+top_build_prefix = ../../../
+top_builddir = ../../..
+top_srcdir = ../../..
+gvprdir = $(pkgdatadir)/gvpr
+gvpr_DATA = addedges addranks addrings anon attr bb bbox bipart binduce chkclusters \
+	chkedges cliptree col collapse color cycle dechain deghist \
+	deledges delmulti delnodes depath dijkstra \
+	flatten get-layers-list histogram group indent knbhd \
+	maxdeg path rotate scale scalexy span topon \
+	treetoclust
+
+EXTRA_DIST = $(gvpr_DATA)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu cmd/gvpr/lib/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu cmd/gvpr/lib/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-gvprDATA: $(gvpr_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(gvpr_DATA)'; test -n "$(gvprdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(gvprdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(gvprdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(gvprdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(gvprdir)" || exit $$?; \
+	done
+
+uninstall-gvprDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(gvpr_DATA)'; test -n "$(gvprdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(gvprdir)'; $(am__uninstall_files_from_dir)
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(gvprdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-gvprDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-gvprDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	cscopelist-am ctags-am distclean distclean-generic \
+	distclean-libtool distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-gvprDATA \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+	ps ps-am tags-am uninstall uninstall-am uninstall-gvprDATA
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

+ 12 - 0
graphviz.mod/graphviz/cmd/gvpr/lib/Makefile.am

@@ -0,0 +1,12 @@
+## Process this file with automake to produce Makefile.in
+
+gvprdir = $(pkgdatadir)/gvpr
+
+gvpr_DATA = addedges addranks addrings anon attr bb bbox bipart binduce chkclusters \
+	chkedges cliptree col collapse color cycle dechain deghist \
+	deledges delmulti delnodes depath dijkstra \
+	flatten get-layers-list histogram group indent knbhd \
+	maxdeg path rotate scale scalexy span topon \
+	treetoclust
+
+EXTRA_DIST = $(gvpr_DATA)

+ 688 - 0
graphviz.mod/graphviz/cmd/gvpr/lib/Makefile.in

@@ -0,0 +1,688 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = cmd/gvpr/lib
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \
+	$(top_srcdir)/m4/ax_compare_version.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltargz.m4 \
+	$(top_srcdir)/m4/ltdl.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/./version.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(gvprdir)"
+DATA = $(gvpr_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+ANN_CFLAGS = @ANN_CFLAGS@
+ANN_LIBS = @ANN_LIBS@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+CYGWIN = @CYGWIN@
+DARWIN = @DARWIN@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEVIL_INCLUDES = @DEVIL_INCLUDES@
+DEVIL_LIBS = @DEVIL_LIBS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+EXPAT_CFLAGS = @EXPAT_CFLAGS@
+EXPAT_LIBS = @EXPAT_LIBS@
+FGREP = @FGREP@
+FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@
+FREETYPE2_LIBS = @FREETYPE2_LIBS@
+GDIPLUS_CFLAGS = @GDIPLUS_CFLAGS@
+GDIPLUS_HEADS = @GDIPLUS_HEADS@
+GDIPLUS_LIBS = @GDIPLUS_LIBS@
+GDK_CFLAGS = @GDK_CFLAGS@
+GDK_LIBS = @GDK_LIBS@
+GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@
+GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@
+GDLIB_CFLAGS = @GDLIB_CFLAGS@
+GDLIB_CONFIG = @GDLIB_CONFIG@
+GDLIB_LIBS = @GDLIB_LIBS@
+GLADE_CFLAGS = @GLADE_CFLAGS@
+GLADE_LIBS = @GLADE_LIBS@
+GLUT_CFLAGS = @GLUT_CFLAGS@
+GLUT_LIBS = @GLUT_LIBS@
+GO = @GO@
+GO_INCLUDES = @GO_INCLUDES@
+GO_LIBS = @GO_LIBS@
+GRAPHVIZ_AUTHOR_EMAIL = @GRAPHVIZ_AUTHOR_EMAIL@
+GRAPHVIZ_AUTHOR_NAME = @GRAPHVIZ_AUTHOR_NAME@
+GRAPHVIZ_CHANGE_DATE = @GRAPHVIZ_CHANGE_DATE@
+GRAPHVIZ_VERSION_DATE = @GRAPHVIZ_VERSION_DATE@
+GRAPHVIZ_VERSION_MAJOR = @GRAPHVIZ_VERSION_MAJOR@
+GRAPHVIZ_VERSION_MICRO = @GRAPHVIZ_VERSION_MICRO@
+GRAPHVIZ_VERSION_MINOR = @GRAPHVIZ_VERSION_MINOR@
+GREP = @GREP@
+GROFF = @GROFF@
+GS_CFLAGS = @GS_CFLAGS@
+GS_LIBS = @GS_LIBS@
+GTKGLEXT_CFLAGS = @GTKGLEXT_CFLAGS@
+GTKGLEXT_LIBS = @GTKGLEXT_LIBS@
+GTKGL_CFLAGS = @GTKGL_CFLAGS@
+GTKGL_LIBS = @GTKGL_LIBS@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+GTS_CFLAGS = @GTS_CFLAGS@
+GTS_LIBS = @GTS_LIBS@
+GUILE_CFLAGS = @GUILE_CFLAGS@
+GUILE_LIBS = @GUILE_LIBS@
+GVPLUGIN_CONFIG_FILE = @GVPLUGIN_CONFIG_FILE@
+GVPLUGIN_VERSION = @GVPLUGIN_VERSION@
+GVPLUGIN_VERSION_INFO = @GVPLUGIN_VERSION_INFO@
+HAVE_CXX17 = @HAVE_CXX17@
+INCLTDL = @INCLTDL@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTGOSIZE = @INTGOSIZE@
+IPSEPCOLA_INCLUDES = @IPSEPCOLA_INCLUDES@
+IPSEPCOLA_LIBS = @IPSEPCOLA_LIBS@
+JAVA = @JAVA@
+JAVASCRIPT = @JAVASCRIPT@
+JAVA_INCLUDES = @JAVA_INCLUDES@
+JAVA_LIBS = @JAVA_LIBS@
+JNI_EXTRA_LDFLAGS = @JNI_EXTRA_LDFLAGS@
+JSHEXT = @JSHEXT@
+LASI_CFLAGS = @LASI_CFLAGS@
+LASI_LIBS = @LASI_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBADD_DL = @LIBADD_DL@
+LIBADD_DLD_LINK = @LIBADD_DLD_LINK@
+LIBADD_DLOPEN = @LIBADD_DLOPEN@
+LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@
+LIBLTDL = @LIBLTDL@
+LIBOBJS = @LIBOBJS@
+LIBPOSTFIX = @LIBPOSTFIX@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTDLDEPS = @LTDLDEPS@
+LTDLINCL = @LTDLINCL@
+LTDLOPEN = @LTDLOPEN@
+LTLIBOBJS = @LTLIBOBJS@
+LT_ARGZ_H = @LT_ARGZ_H@
+LT_CONFIG_H = @LT_CONFIG_H@
+LT_DLLOADERS = @LT_DLLOADERS@
+LT_DLPREOPEN = @LT_DLPREOPEN@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+LUA = @LUA@
+LUA_INCLUDES = @LUA_INCLUDES@
+LUA_INSTALL_DIR = @LUA_INSTALL_DIR@
+LUA_LIBS = @LUA_LIBS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MATH_LIBS = @MATH_LIBS@
+MCS = @MCS@
+MINGW32 = @MINGW32@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJC = @OBJC@
+OBJCDEPMODE = @OBJCDEPMODE@
+OBJCFLAGS = @OBJCFLAGS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@
+PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@
+PANGOFT2_CFLAGS = @PANGOFT2_CFLAGS@
+PANGOFT2_LIBS = @PANGOFT2_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PERL_INCLUDES = @PERL_INCLUDES@
+PERL_INSTALL_DIR = @PERL_INSTALL_DIR@
+PERL_LIBS = @PERL_LIBS@
+PHP = @PHP@
+PHPCONFIG = @PHPCONFIG@
+PHP_INCLUDES = @PHP_INCLUDES@
+PHP_INSTALL_DATADIR = @PHP_INSTALL_DATADIR@
+PHP_INSTALL_DIR = @PHP_INSTALL_DIR@
+PHP_LIBS = @PHP_LIBS@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PLATFORMSDKINCLUDE = @PLATFORMSDKINCLUDE@
+PLATFORMSDKLIB = @PLATFORMSDKLIB@
+POPPLER_CFLAGS = @POPPLER_CFLAGS@
+POPPLER_LIBS = @POPPLER_LIBS@
+PS2PDF = @PS2PDF@
+PYTHON3 = @PYTHON3@
+PYTHON3_INCLUDES = @PYTHON3_INCLUDES@
+PYTHON3_INSTALL_DIR = @PYTHON3_INSTALL_DIR@
+PYTHON3_LIBS = @PYTHON3_LIBS@
+QMAKE = @QMAKE@
+QTCORE_CFLAGS = @QTCORE_CFLAGS@
+QTCORE_LIBS = @QTCORE_LIBS@
+QTGUI_CFLAGS = @QTGUI_CFLAGS@
+QTGUI_LIBS = @QTGUI_LIBS@
+QUARTZ_CFLAGS = @QUARTZ_CFLAGS@
+QUARTZ_LIBS = @QUARTZ_LIBS@
+RANLIB = @RANLIB@
+RSVG_CFLAGS = @RSVG_CFLAGS@
+RSVG_LIBS = @RSVG_LIBS@
+RUBY = @RUBY@
+RUBY_CFLAGS = @RUBY_CFLAGS@
+RUBY_INSTALL_DIR = @RUBY_INSTALL_DIR@
+RUBY_LIBS = @RUBY_LIBS@
+RUBY_VER = @RUBY_VER@
+R_CFLAGS = @R_CFLAGS@
+R_LIBS = @R_LIBS@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHARED_LIBRARY_SUFFIX = @SHARED_LIBRARY_SUFFIX@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SWIG = @SWIG@
+SWIGJAVA_CPPFLAGS = @SWIGJAVA_CPPFLAGS@
+SWIG_PHP_DATA = @SWIG_PHP_DATA@
+SWIG_PHP_DATA_TO_PACKAGE = @SWIG_PHP_DATA_TO_PACKAGE@
+SWIG_PHP_OPT = @SWIG_PHP_OPT@
+SWIG_VERSION = @SWIG_VERSION@
+TCLCONFIG = @TCLCONFIG@
+TCLINT_INCLUDES = @TCLINT_INCLUDES@
+TCLSH = @TCLSH@
+TCLSH_EXEC_PREFIX = @TCLSH_EXEC_PREFIX@
+TCL_CFLAGS = @TCL_CFLAGS@
+TCL_DEFS = @TCL_DEFS@
+TCL_INCLUDES = @TCL_INCLUDES@
+TCL_INSTALL_DIR = @TCL_INSTALL_DIR@
+TCL_LIBS = @TCL_LIBS@
+TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@
+TCL_MINOR_VERSION = @TCL_MINOR_VERSION@
+TCL_PATCH_LEVEL = @TCL_PATCH_LEVEL@
+TCL_PKGINDEX = @TCL_PKGINDEX@
+TCL_PKGINDEX_GD = @TCL_PKGINDEX_GD@
+TCL_PKGINDEX_SWIG = @TCL_PKGINDEX_SWIG@
+TCL_SHLIB_SUFFIX = @TCL_SHLIB_SUFFIX@
+TCL_SRC_DIR = @TCL_SRC_DIR@
+TCL_STUB_LIB_SPEC = @TCL_STUB_LIB_SPEC@
+TCL_VERSION = @TCL_VERSION@
+VERSION = @VERSION@
+WEBP_CFLAGS = @WEBP_CFLAGS@
+WEBP_LIBS = @WEBP_LIBS@
+XMKMF = @XMKMF@
+XRENDER_CFLAGS = @XRENDER_CFLAGS@
+XRENDER_LIBS = @XRENDER_LIBS@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+Z_INCLUDES = @Z_INCLUDES@
+Z_LIBS = @Z_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_OBJC = @ac_ct_OBJC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+demodir = @demodir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+ltdl_LIBOBJS = @ltdl_LIBOBJS@
+ltdl_LTLIBOBJS = @ltdl_LTLIBOBJS@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sys_symbol_underscore = @sys_symbol_underscore@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+gvprdir = $(pkgdatadir)/gvpr
+gvpr_DATA = addedges addranks addrings anon attr bb bbox bipart binduce chkclusters \
+	chkedges cliptree col collapse color cycle dechain deghist \
+	deledges delmulti delnodes depath dijkstra \
+	flatten get-layers-list histogram group indent knbhd \
+	maxdeg path rotate scale scalexy span topon \
+	treetoclust
+
+EXTRA_DIST = $(gvpr_DATA)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu cmd/gvpr/lib/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu cmd/gvpr/lib/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-gvprDATA: $(gvpr_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(gvpr_DATA)'; test -n "$(gvprdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(gvprdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(gvprdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(gvprdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(gvprdir)" || exit $$?; \
+	done
+
+uninstall-gvprDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(gvpr_DATA)'; test -n "$(gvprdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(gvprdir)'; $(am__uninstall_files_from_dir)
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(gvprdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-gvprDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-gvprDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	cscopelist-am ctags-am distclean distclean-generic \
+	distclean-libtool distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-gvprDATA \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+	ps ps-am tags-am uninstall uninstall-am uninstall-gvprDATA
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

+ 20 - 0
graphviz.mod/graphviz/cmd/gvpr/lib/addedges

@@ -0,0 +1,20 @@
+/* Add edges from input graph to argument graph
+ * Does not add nodes.
+ */
+BEGIN{
+  graph_t g = readG(ARGV[0]);
+  node_t h, t;
+  edge_t e;
+}
+E {
+  if ((h = isNode(g,head.name)) && (t = isNode(g,tail.name))) {
+    if (!isEdge(t,h,"")) {
+      e = copy(g,$);
+    }
+  }
+}
+END {
+  write(g);
+}
+
+

+ 36 - 0
graphviz.mod/graphviz/cmd/gvpr/lib/addranks

@@ -0,0 +1,36 @@
+/* Assuming nodes have been positioned by dot, this adds a rank
+ * attribute by placing all nodes with the same y value on a specific
+ * integer rank.
+ * If the graph has rankdir=LR, x and y are flipped.
+ */
+BEG_G {
+  double x,y;
+  int lv[double];
+  int r, rk[double];
+  int flip;
+  if (isAttr($,"G","rankdir") && $.rankdir=="LR") flip = 1;
+}
+N {
+  sscanf($.pos,"%f,%f",&x,&y);
+  if (flip) lv[x] = 1;
+  else lv[y] = 1;
+}
+BEG_G {
+  r = 0;
+  if (flip)
+    forr (lv[x]) {
+      rk[x] = r++;
+      /* printf (2, "rk[%f] = %d\n", y, rk[y]); */
+    }
+  else
+    forr (lv[y]) {
+      rk[y] = r++;
+      /* printf (2, "rk[%f] = %d\n", y, rk[y]); */
+    }
+}
+N {
+  sscanf($.pos,"%f,%f",&x,&y);
+  /* printf(2, "node %s y %f rk %d\n", $.name, y, rk[y]); */
+  if (flip) $.rank = sprintf("%d", rk[x]); 
+  else $.rank = sprintf("%d", rk[y]); 
+}

+ 56 - 0
graphviz.mod/graphviz/cmd/gvpr/lib/addrings

@@ -0,0 +1,56 @@
+/* Takes a graph laid out by twopi and adds rings.
+ * Assumes ARGV[] = "root" "=" <rootname>, as output by twopi -v.
+ * Usage:
+ *   twopi -v foo.dot > out 2> log
+ *   gvpr -f addrings.g -a"`grep root log`" out | neato -n2 ...
+ */
+BEG_G {
+  graph_t og;
+  edge_t e;
+  node_t ctr = node($, ARGV[0]);
+  double rs = 1.0; /* min. slack between the squares of two consecutive radii */
+  int cx, cy;
+  int x, y;
+  node_t n;
+  int i, n_r;
+  int d;
+  int rads[int];
+  char* ctr_s = ctr.pos;
+  sscanf (ctr_s, "%d,%d", &cx, &cy);
+  if (hasAttr($, "ranksep")) {
+    sscanf ($.ranksep, "%f", &rs);
+    if (rs == 0.0) rs = 1.0;
+  }
+  rs *= 72;
+  rs = 1.5*rs*rs;
+}
+N [$ != ctr] {
+  sscanf ($.pos, "%d,%d", &x, &y);
+  d = (x-cx)*(x-cx) + (y-cy)*(y-cy);
+  for (rads[i]) {
+    if ((rads[i]-rs <= d) && (d <= rads[i]+rs)) return;
+  }
+  n_r++;
+  rads[n_r] = d;
+}
+END_G {
+  og = copy (NULL, $);
+  og.outputorder = "nodesfirst";
+  setDflt (og, "N", "label", "\\N");
+  for (rads[i]) {
+    n = node(og, "ring_"+((string)i));
+    n.shape = "circle";
+    n.pos = ctr_s;
+    n.style = "";
+    n.label = "";
+    d = rads[i];
+    n.width = sprintf("%f", sqrt(d)/36.0);
+  }
+  for (n=fstnode($);n;n = nxtnode(n))
+    clone (og, n);
+  for (n=fstnode($);n;n = nxtnode(n))
+    for (e=fstedge(n);e;e = nxtedge(e,n))
+      clone (og, e);
+  write(og);
+  
+}

+ 31 - 0
graphviz.mod/graphviz/cmd/gvpr/lib/anon

@@ -0,0 +1,31 @@
+/* anonymize the graph */
+BEG_G {
+  node_t map[node_t];
+  graph_t dup;
+  int id = 0;
+  char* gtype;
+  node_t n;
+  edge_t e;
+  char* l;
+
+  if ($.directed) gtype = "D";
+  else gtype = "U";
+  if ($.strict) gtype = gtype + "S";
+  dup = graph ($.name, gtype);
+  $tvtype = TV_ne;
+}
+
+N {
+  n = node(dup, (char*)id);
+  n.label=$.name;
+  map[$] = n; 
+  id++;
+}
+
+E {
+  edge (map[$.tail],map[$.head],"");
+}
+
+END_G {
+  write (dup);
+}

+ 7 - 0
graphviz.mod/graphviz/cmd/gvpr/lib/attr

@@ -0,0 +1,7 @@
+/* List known node attributes */
+BEG_G {
+  char* attr;
+  for (attr = fstAttr($,"N"); attr != ""; attr = nxtAttr($,"N",attr)) {
+    print (attr);
+  }
+}

+ 39 - 0
graphviz.mod/graphviz/cmd/gvpr/lib/bb

@@ -0,0 +1,39 @@
+/* computes the bounding box of a graph based on its nodes 
+   taking into account clusters and node sizes.
+ */
+BEGIN {
+  double x, y, w2, h2;
+  double llx, lly, urx, ury;
+  double llx0, lly0, urx0, ury0;
+
+  graph_t clustBB (graph_t G) {
+    graph_t sg;
+    for (sg = fstsubg(G); sg; sg = nxtsubg(sg)) {
+	  sg = clustBB(sg);
+    }
+	if (G.name == "cluster*") {
+      sscanf (G.bb, "%lf,%lf,%lf,%lf", &llx0, &lly0, &urx0, &ury0);
+      if (llx0 < llx) llx = llx0;
+      if (lly0 < lly) lly = lly0;
+      if (urx0 > urx) urx = urx0;
+      if (ury0 > ury) ury = ury0;
+    }
+    return G;
+  }
+}
+BEG_G {
+  llx = 1000000; lly = 1000000; urx = -1000000; ury = -1000000;
+}
+N {
+  sscanf ($.pos, "%lf,%lf", &x, &y);
+  w2 = (36.0*(double)$.width);
+  h2 = (36.0*(double)$.height);
+  if ((x - w2) < llx) llx = x - w2;
+  if ((x + w2) > urx) urx = x + w2;
+  if ((y - h2) < lly) lly = y - h2;
+  if ((y + h2) > ury) ury = y + h2;
+}
+END_G {
+  clustBB ($);
+  $.bb = sprintf ("%lf,%lf,%lf,%lf", llx, lly, urx, ury);
+}

+ 20 - 0
graphviz.mod/graphviz/cmd/gvpr/lib/bbox

@@ -0,0 +1,20 @@
+/* computes the bounding box of a graph based on node positions */
+BEGIN {
+  double xmin, ymin, xmax, ymax;
+  xmin = ymin = 1.7976931348623157e+308;
+  xmax = ymax = -ymin;
+  double x, y;
+}
+N {
+  if (sscanf ($.pos, "%f,%f", &x, &y) == 2) {
+    if (x < xmin) xmin = x;
+    if (y < ymin) ymin = y;
+    if (x > xmax) xmax = x;
+    if (y > ymax) ymax = y;
+  }
+}
+
+END {
+  printf ("(%f,%f) (%f,%f)\n", xmin,  ymin, xmax, ymax);
+  if (ARGC) printf ("area = %f aspect = %f\n", ((xmax-xmin)*(ymax-ymin))/1000000., (xmax-xmin)/(ymax-ymin));
+}

+ 45 - 0
graphviz.mod/graphviz/cmd/gvpr/lib/binduce

@@ -0,0 +1,45 @@
+/* Given a bipartite graph, induce a non-bipartite graph.
+ * argv[0]="name=value" This is used to identify the nodes used
+ * to induce edges. If aget(n,name) == value, 
+ *  if deg(n) == 1, delete
+ *  if deg(n) == 2, delete and connect to neighbor with edge
+ *  if deg(n) > 2, delete and add edge between all pairs of neighbors
+ *  Add weights to edge.
+ */
+BEGIN{
+  int i, cnt;
+  int wt[edge_t];
+  string values[int];
+  node_t nbrs[int];
+  edge_t e;
+  tokens(ARGV[0],values,"=");
+  string aname = values[0];
+  string value = values[1];
+  printf(2, "%s=%s\n", aname, value);
+}
+N[aget($,aname)==value] {
+  if ($.degree > 1) {
+    cnt = 0;
+    for (e = fstedge($); e; e = nxtedge(e, $))
+      nbrs[cnt++] = opp(e,$);
+    for (i = 0; i < cnt-1; i++) {
+      if ((e = isEdge(nbrs[i],nbrs[i+1],"")) != NULL) {
+        wt[e] += 1;
+      }
+      else if ($G.directed && (e = isEdge(nbrs[i+1],nbrs[i],""))) {
+        wt[e] += 1;
+      }
+      else if (nbrs[i] != nbrs[i+1]) { // avoid loops
+        e = edge(nbrs[i],nbrs[i+1],"");
+        wt[e] = 1;
+      }
+    }
+    unset(nbrs);
+  }
+  delete($G,$);
+}
+END_G{
+  for (wt[e]) {
+    e.multiplicity = sprintf ("%d", wt[e]);
+  }
+}

+ 27 - 0
graphviz.mod/graphviz/cmd/gvpr/lib/bipart

@@ -0,0 +1,27 @@
+/* Determine if a graph is bipartite or not.
+ */
+BEG_G{
+  int vc, c, color[node_t];
+  node_t v;
+  edge_t e;
+  $tvtype = TV_dfs;
+  $tvroot = fstnode($);
+}
+N{
+  if ($tvedge == NULL)
+    color[$] = 1;
+  if (color[$] == 1)
+    c = 2;
+  else
+    c = 1;
+  for (e = fstedge($); e; e = nxtedge(e,$)) {
+    v = opp(e,$);
+    vc = color[v];
+    if (vc == 0)
+      color[v] = c;
+    else if (vc != c) {
+      printf(2, "Not bipartite\n");
+      exit(1);
+    }
+  }
+}

+ 28 - 0
graphviz.mod/graphviz/cmd/gvpr/lib/chkclusters

@@ -0,0 +1,28 @@
+/* Report if graph has non-hierarchical clusters */
+BEGIN {
+  graph_t c[node_t];
+  node_t n;
+
+  void proc (graph_t h, graph_t p, graph_t g)
+  {
+    if (h.name == "cluster*") {
+      for (n = fstnode(h); n; n = nxtnode_sg(h,n)) {
+		g = c[n];
+		if (g) {
+		  if (g != p) {
+            printf(2,"node %s in %s and %s\n", n.name, h.name, g.name);
+		    exit(1);
+          }
+        }
+        c[n] = h;
+      }
+      p = h;
+    }
+    for (g = fstsubg(h); g; g = nxtsubg(g)) {
+      proc(g,p,NULL);
+    }
+  }
+}
+BEG_G {
+  proc($,$,NULL);
+}

+ 40 - 0
graphviz.mod/graphviz/cmd/gvpr/lib/chkedges

@@ -0,0 +1,40 @@
+/* Looks for multiedges and loops, and output
+ * those found along with counts. If the -d flag
+ * is given, edge direction is taken into account.
+ */
+BEGIN{
+  char* ename; 
+  char* n; 
+  int doDir, cnt[]; 
+  int loopcnt[];
+  int nloops, nmulti;
+  if ((ARGC > 0) && (ARGV[0] == "-d"))
+    doDir = 1;
+  else
+    doDir = 0;
+}
+BEG_G{unset(cnt); unset(loopcnt); nloops = nmulti = 0;}
+E{
+  if (doDir || (tail.name <= head.name)) ename=tail.name+"_"+head.name;
+  else ename = head.name+"_"+tail.name;
+  if (tail == head) {
+    loopcnt[ename] += 1;
+    if (loopcnt[ename] == 1) nloops += 1;
+  }
+  else {
+    cnt[ename] += 1;
+    if (cnt[ename] == 2) nmulti += 1;
+  }
+}
+END_G{
+  printf ("graph %s: %d loops %d multiedges\n", $.name, nloops, nmulti);
+  for (cnt[n]) {
+    if (cnt[n] > 1)
+      printf ("%s : %d\n", n, cnt[n]);
+  }
+  for (loopcnt[n]) {
+    if (loopcnt[n] > 0)
+      printf ("%s : %d\n", n, loopcnt[n]);
+  }
+}
+

+ 8 - 0
graphviz.mod/graphviz/cmd/gvpr/lib/cliptree

@@ -0,0 +1,8 @@
+/* Construct subgraph reachable from node ARGV[0] by forward edges */
+BEG_G {
+  node_t r = node($,ARGV[0]);
+
+  $tvroot = r;
+  $tvtype = TV_fwd;
+}
+N{$tvroot=NULL; subnode($T,$);}

+ 54 - 0
graphviz.mod/graphviz/cmd/gvpr/lib/clustg

@@ -0,0 +1,54 @@
+/* Create derived graph whose nodes are top-level clusters (any nodes not in top-level clusters are trivial top-level clusters),
+ * and there is an edge between two nodes in the derived graph if there is an edge between the clusters in the original graph.
+ * The new graph is directed if the original one is; it is strict. Edges within clusters are ignored.
+ * Nodes and edges have a _cnt attribute indicating the number of node in a cluster and the number of equivalent edges, respectively.
+ */
+BEGIN {
+  graph_t dg;
+  graph_t c[node_t];
+  node_t nmap[node_t];
+  node_t n, n0, dn, dn0;
+  edge_t e;
+
+  void proc (graph_t h, graph_t g)
+  {
+    if (h.name == "cluster*") {
+      dn = node(dg, h.name);
+      dn._cnt = (string)(h.n_nodes);
+      for (n = fstnode(h); n; n = nxtnode_sg(h,n)) {
+		n0 = nmap[n];
+		if (n0) {
+          printf(2,"node %s in %s and %s\n", n.name, h.name, n0.name);
+		  exit(1);
+        }
+        nmap[n] = dn;
+      }
+      return;
+    }
+    for (g = fstsubg(h); g; g = nxtsubg(g)) {
+      proc(g,NULL);
+    }
+  }
+}
+BEG_G{
+  dg = graph("clust"+name, isDirect($)?"DS":"US");
+  setDflt(dg,"E","_cnt","0");
+  setDflt(dg,"N","_cnt","0");
+  proc($,NULL);
+  $tvtype = TV_ne;
+}
+N[!nmap[$]]{
+  dn = node(dg, name);
+  nmap[$] = dn;
+}
+E{
+  dn0 = nmap[$.tail];
+  dn = nmap[$.head];
+  if (dn != dn0) {
+    e = edge(dn0,dn,"");
+    e._cnt = (string)(1+(int)e._cnt);
+  }
+}
+END_G {
+  write(dg);
+}

+ 24 - 0
graphviz.mod/graphviz/cmd/gvpr/lib/col

@@ -0,0 +1,24 @@
+# test
+/* color nodes using output of dijkstra */
+BEG_G {
+    double h, hn, hf, d, sat, md = maxdist; 
+    if (hue_near =="") hue_near = 0.8;
+    if (hue_far =="") hue_far = 1.2;
+    hn = hue_near;
+    hf = hue_far;
+}
+# test
+N {
+    d = dist;
+    sat = (md - d + 1.0) /( md + 1.0);
+    h = hn + ((hf - hn) * d)/md;
+    while (h < 0.0) h = h + 1.0;
+    while (h > 1.0) h = h - 1.0;
+    color = sprintf("%lf %lf %lf",hue,sat,1.0);
+      /* make sure the shape is filled */
+    if (!match(style,"filled")>=0) {
+      if (style != "") style=sprintf("%s,filled",style);
+      else style="filled";
+    }
+}
+

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio