picky-statistics 4.0.0pre3 → 4.0.0pre5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (596) hide show
  1. data/lib/picky-statistics/application/javascripts/d3/LICENSE +26 -0
  2. data/lib/picky-statistics/application/javascripts/d3/Makefile +268 -0
  3. data/lib/picky-statistics/application/javascripts/d3/README.md +51 -0
  4. data/lib/picky-statistics/application/javascripts/d3/d3.chart.js +984 -0
  5. data/lib/picky-statistics/application/javascripts/d3/d3.chart.min.js +1 -0
  6. data/lib/picky-statistics/application/javascripts/d3/d3.csv.js +92 -0
  7. data/lib/picky-statistics/application/javascripts/d3/d3.csv.min.js +1 -0
  8. data/lib/picky-statistics/application/javascripts/d3/d3.geo.js +938 -0
  9. data/lib/picky-statistics/application/javascripts/d3/d3.geo.min.js +1 -0
  10. data/lib/picky-statistics/application/javascripts/d3/d3.geom.js +835 -0
  11. data/lib/picky-statistics/application/javascripts/d3/d3.geom.min.js +1 -0
  12. data/lib/picky-statistics/application/javascripts/d3/d3.js +4690 -0
  13. data/lib/picky-statistics/application/javascripts/d3/d3.layout.js +1891 -0
  14. data/lib/picky-statistics/application/javascripts/d3/d3.layout.min.js +1 -0
  15. data/lib/picky-statistics/application/javascripts/d3/d3.min.js +2 -0
  16. data/lib/picky-statistics/application/javascripts/d3/d3.time.js +687 -0
  17. data/lib/picky-statistics/application/javascripts/d3/d3.time.min.js +1 -0
  18. data/lib/picky-statistics/application/javascripts/d3/examples/albers/albers.html +168 -0
  19. data/lib/picky-statistics/application/javascripts/d3/examples/area/area-radial.html +48 -0
  20. data/lib/picky-statistics/application/javascripts/d3/examples/area/area.html +113 -0
  21. data/lib/picky-statistics/application/javascripts/d3/examples/axis/axis-alternating.html +50 -0
  22. data/lib/picky-statistics/application/javascripts/d3/examples/axis/axis-ggplot2.html +68 -0
  23. data/lib/picky-statistics/application/javascripts/d3/examples/axis/axis-multiples.html +117 -0
  24. data/lib/picky-statistics/application/javascripts/d3/examples/axis/axis-orientations.html +63 -0
  25. data/lib/picky-statistics/application/javascripts/d3/examples/axis/axis-transition.html +153 -0
  26. data/lib/picky-statistics/application/javascripts/d3/examples/azimuthal/azimuthal.css +21 -0
  27. data/lib/picky-statistics/application/javascripts/d3/examples/azimuthal/azimuthal.html +99 -0
  28. data/lib/picky-statistics/application/javascripts/d3/examples/azimuthal/azimuthal.js +29 -0
  29. data/lib/picky-statistics/application/javascripts/d3/examples/bar/bar-hierarchy.html +223 -0
  30. data/lib/picky-statistics/application/javascripts/d3/examples/bar/bar.html +101 -0
  31. data/lib/picky-statistics/application/javascripts/d3/examples/bar/sample-data.csv +53 -0
  32. data/lib/picky-statistics/application/javascripts/d3/examples/bonne/bonne.html +159 -0
  33. data/lib/picky-statistics/application/javascripts/d3/examples/box/box.css +4 -0
  34. data/lib/picky-statistics/application/javascripts/d3/examples/box/box.html +19 -0
  35. data/lib/picky-statistics/application/javascripts/d3/examples/box/box.js +68 -0
  36. data/lib/picky-statistics/application/javascripts/d3/examples/brush/brush-ordinal.html +92 -0
  37. data/lib/picky-statistics/application/javascripts/d3/examples/brush/brush-x.html +92 -0
  38. data/lib/picky-statistics/application/javascripts/d3/examples/brush/brush-y.html +91 -0
  39. data/lib/picky-statistics/application/javascripts/d3/examples/brush/brush.html +98 -0
  40. data/lib/picky-statistics/application/javascripts/d3/examples/bubble/bubble.css +8 -0
  41. data/lib/picky-statistics/application/javascripts/d3/examples/bubble/bubble.html +14 -0
  42. data/lib/picky-statistics/application/javascripts/d3/examples/bubble/bubble.js +46 -0
  43. data/lib/picky-statistics/application/javascripts/d3/examples/bullet/bullet.css +10 -0
  44. data/lib/picky-statistics/application/javascripts/d3/examples/bullet/bullet.html +18 -0
  45. data/lib/picky-statistics/application/javascripts/d3/examples/bullet/bullet.js +53 -0
  46. data/lib/picky-statistics/application/javascripts/d3/examples/bullet/bullets.json +7 -0
  47. data/lib/picky-statistics/application/javascripts/d3/examples/bundle/bundle-radial.css +9 -0
  48. data/lib/picky-statistics/application/javascripts/d3/examples/bundle/bundle-radial.html +15 -0
  49. data/lib/picky-statistics/application/javascripts/d3/examples/bundle/bundle-radial.js +50 -0
  50. data/lib/picky-statistics/application/javascripts/d3/examples/bundle/bundle-treemap.css +14 -0
  51. data/lib/picky-statistics/application/javascripts/d3/examples/bundle/bundle-treemap.html +16 -0
  52. data/lib/picky-statistics/application/javascripts/d3/examples/bundle/bundle-treemap.js +53 -0
  53. data/lib/picky-statistics/application/javascripts/d3/examples/bundle/packages.js +49 -0
  54. data/lib/picky-statistics/application/javascripts/d3/examples/button.css +35 -0
  55. data/lib/picky-statistics/application/javascripts/d3/examples/calendar/calendar.css +15 -0
  56. data/lib/picky-statistics/application/javascripts/d3/examples/calendar/dji-area.html +120 -0
  57. data/lib/picky-statistics/application/javascripts/d3/examples/calendar/dji.csv +5233 -0
  58. data/lib/picky-statistics/application/javascripts/d3/examples/calendar/dji.html +15 -0
  59. data/lib/picky-statistics/application/javascripts/d3/examples/calendar/dji.js +65 -0
  60. data/lib/picky-statistics/application/javascripts/d3/examples/calendar/vix.csv +5231 -0
  61. data/lib/picky-statistics/application/javascripts/d3/examples/calendar/vix.html +15 -0
  62. data/lib/picky-statistics/application/javascripts/d3/examples/calendar/vix.js +65 -0
  63. data/lib/picky-statistics/application/javascripts/d3/examples/cartogram/cartogram.css +20 -0
  64. data/lib/picky-statistics/application/javascripts/d3/examples/cartogram/cartogram.html +15 -0
  65. data/lib/picky-statistics/application/javascripts/d3/examples/cartogram/cartogram.js +51 -0
  66. data/lib/picky-statistics/application/javascripts/d3/examples/cartogram/demers.css +9 -0
  67. data/lib/picky-statistics/application/javascripts/d3/examples/cartogram/demers.html +16 -0
  68. data/lib/picky-statistics/application/javascripts/d3/examples/cartogram/demers.js +79 -0
  69. data/lib/picky-statistics/application/javascripts/d3/examples/cartogram/dorling.css +9 -0
  70. data/lib/picky-statistics/application/javascripts/d3/examples/cartogram/dorling.html +16 -0
  71. data/lib/picky-statistics/application/javascripts/d3/examples/cartogram/dorling.js +80 -0
  72. data/lib/picky-statistics/application/javascripts/d3/examples/chord/chord-flare.html +109 -0
  73. data/lib/picky-statistics/application/javascripts/d3/examples/chord/chord.css +9 -0
  74. data/lib/picky-statistics/application/javascripts/d3/examples/chord/chord.html +14 -0
  75. data/lib/picky-statistics/application/javascripts/d3/examples/chord/chord.js +98 -0
  76. data/lib/picky-statistics/application/javascripts/d3/examples/choropleth/choropleth-area.html +51 -0
  77. data/lib/picky-statistics/application/javascripts/d3/examples/choropleth/choropleth-bounds.html +46 -0
  78. data/lib/picky-statistics/application/javascripts/d3/examples/choropleth/choropleth.css +16 -0
  79. data/lib/picky-statistics/application/javascripts/d3/examples/choropleth/choropleth.html +15 -0
  80. data/lib/picky-statistics/application/javascripts/d3/examples/choropleth/choropleth.js +38 -0
  81. data/lib/picky-statistics/application/javascripts/d3/examples/choropleth/unemployment.json +1 -0
  82. data/lib/picky-statistics/application/javascripts/d3/examples/clock/clock.css +23 -0
  83. data/lib/picky-statistics/application/javascripts/d3/examples/clock/clock.html +17 -0
  84. data/lib/picky-statistics/application/javascripts/d3/examples/clock/clock.js +87 -0
  85. data/lib/picky-statistics/application/javascripts/d3/examples/cluster/cluster-radial.html +14 -0
  86. data/lib/picky-statistics/application/javascripts/d3/examples/cluster/cluster-radial.js +39 -0
  87. data/lib/picky-statistics/application/javascripts/d3/examples/cluster/cluster.css +15 -0
  88. data/lib/picky-statistics/application/javascripts/d3/examples/cluster/cluster.html +14 -0
  89. data/lib/picky-statistics/application/javascripts/d3/examples/cluster/cluster.js +39 -0
  90. data/lib/picky-statistics/application/javascripts/d3/examples/contour/contour.html +108 -0
  91. data/lib/picky-statistics/application/javascripts/d3/examples/crimea/crimea-stacked-area.html +109 -0
  92. data/lib/picky-statistics/application/javascripts/d3/examples/crimea/crimea-stacked-bar.html +98 -0
  93. data/lib/picky-statistics/application/javascripts/d3/examples/crimea/crimea.csv +24 -0
  94. data/lib/picky-statistics/application/javascripts/d3/examples/custom/custom.html +83 -0
  95. data/lib/picky-statistics/application/javascripts/d3/examples/data/README.md +13 -0
  96. data/lib/picky-statistics/application/javascripts/d3/examples/data/faithful.json +8 -0
  97. data/lib/picky-statistics/application/javascripts/d3/examples/data/flare-imports.json +222 -0
  98. data/lib/picky-statistics/application/javascripts/d3/examples/data/flare.json +380 -0
  99. data/lib/picky-statistics/application/javascripts/d3/examples/data/morley.csv +101 -0
  100. data/lib/picky-statistics/application/javascripts/d3/examples/data/sample.csv +2 -0
  101. data/lib/picky-statistics/application/javascripts/d3/examples/data/sample.html +5 -0
  102. data/lib/picky-statistics/application/javascripts/d3/examples/data/sample.json +1 -0
  103. data/lib/picky-statistics/application/javascripts/d3/examples/data/sample.txt +1 -0
  104. data/lib/picky-statistics/application/javascripts/d3/examples/data/sample.xml +4 -0
  105. data/lib/picky-statistics/application/javascripts/d3/examples/data/stocks.csv +807 -0
  106. data/lib/picky-statistics/application/javascripts/d3/examples/data/unemployment.csv +1709 -0
  107. data/lib/picky-statistics/application/javascripts/d3/examples/data/us-borders.json +1 -0
  108. data/lib/picky-statistics/application/javascripts/d3/examples/data/us-counties.json +3216 -0
  109. data/lib/picky-statistics/application/javascripts/d3/examples/data/us-state-centroids.json +54 -0
  110. data/lib/picky-statistics/application/javascripts/d3/examples/data/us-states.json +54 -0
  111. data/lib/picky-statistics/application/javascripts/d3/examples/data/world-countries.json +179 -0
  112. data/lib/picky-statistics/application/javascripts/d3/examples/delaunay/delaunay.html +44 -0
  113. data/lib/picky-statistics/application/javascripts/d3/examples/donut/donut.html +124 -0
  114. data/lib/picky-statistics/application/javascripts/d3/examples/dot/dot.html +103 -0
  115. data/lib/picky-statistics/application/javascripts/d3/examples/drag/drag.html +44 -0
  116. data/lib/picky-statistics/application/javascripts/d3/examples/force/README +10 -0
  117. data/lib/picky-statistics/application/javascripts/d3/examples/force/force-bounds.html +70 -0
  118. data/lib/picky-statistics/application/javascripts/d3/examples/force/force-cluster.html +249 -0
  119. data/lib/picky-statistics/application/javascripts/d3/examples/force/force-collapsible.html +144 -0
  120. data/lib/picky-statistics/application/javascripts/d3/examples/force/force-dynamic.html +118 -0
  121. data/lib/picky-statistics/application/javascripts/d3/examples/force/force-map.html +104 -0
  122. data/lib/picky-statistics/application/javascripts/d3/examples/force/force-multi-foci.html +68 -0
  123. data/lib/picky-statistics/application/javascripts/d3/examples/force/force.css +9 -0
  124. data/lib/picky-statistics/application/javascripts/d3/examples/force/force.html +14 -0
  125. data/lib/picky-statistics/application/javascripts/d3/examples/force/force.js +50 -0
  126. data/lib/picky-statistics/application/javascripts/d3/examples/force/miserables.json +1 -0
  127. data/lib/picky-statistics/application/javascripts/d3/examples/great-arc/great-arc.html +78 -0
  128. data/lib/picky-statistics/application/javascripts/d3/examples/hello-world/hello-data-key.html +60 -0
  129. data/lib/picky-statistics/application/javascripts/d3/examples/hello-world/hello-data-nested-key.html +75 -0
  130. data/lib/picky-statistics/application/javascripts/d3/examples/hello-world/hello-data-nested.html +77 -0
  131. data/lib/picky-statistics/application/javascripts/d3/examples/hello-world/hello-data.html +46 -0
  132. data/lib/picky-statistics/application/javascripts/d3/examples/hello-world/hello-event.html +53 -0
  133. data/lib/picky-statistics/application/javascripts/d3/examples/hello-world/hello-node-key.html +25 -0
  134. data/lib/picky-statistics/application/javascripts/d3/examples/hello-world/hello-order.html +25 -0
  135. data/lib/picky-statistics/application/javascripts/d3/examples/hello-world/hello-sort.html +75 -0
  136. data/lib/picky-statistics/application/javascripts/d3/examples/hello-world/hello-transform.html +41 -0
  137. data/lib/picky-statistics/application/javascripts/d3/examples/hello-world/hello-transition-undefined.html +43 -0
  138. data/lib/picky-statistics/application/javascripts/d3/examples/hello-world/hello-transition.html +47 -0
  139. data/lib/picky-statistics/application/javascripts/d3/examples/hello-world/hello-webkit-transition.html +64 -0
  140. data/lib/picky-statistics/application/javascripts/d3/examples/hello-world/select-enter-add.html +29 -0
  141. data/lib/picky-statistics/application/javascripts/d3/examples/hello-world/selectAll-enter-add.html +20 -0
  142. data/lib/picky-statistics/application/javascripts/d3/examples/histogram/histogram.html +80 -0
  143. data/lib/picky-statistics/application/javascripts/d3/examples/horizon/horizon.css +9 -0
  144. data/lib/picky-statistics/application/javascripts/d3/examples/horizon/horizon.html +25 -0
  145. data/lib/picky-statistics/application/javascripts/d3/examples/horizon/horizon.js +43 -0
  146. data/lib/picky-statistics/application/javascripts/d3/examples/horizon/unemployment.json +1 -0
  147. data/lib/picky-statistics/application/javascripts/d3/examples/hull/hull.html +75 -0
  148. data/lib/picky-statistics/application/javascripts/d3/examples/kde/kde.css +9 -0
  149. data/lib/picky-statistics/application/javascripts/d3/examples/kde/kde.html +14 -0
  150. data/lib/picky-statistics/application/javascripts/d3/examples/kde/kde.js +40 -0
  151. data/lib/picky-statistics/application/javascripts/d3/examples/line/line.css +22 -0
  152. data/lib/picky-statistics/application/javascripts/d3/examples/line/line.html +11 -0
  153. data/lib/picky-statistics/application/javascripts/d3/examples/line/line.js +63 -0
  154. data/lib/picky-statistics/application/javascripts/d3/examples/marimekko/marimekko.html +116 -0
  155. data/lib/picky-statistics/application/javascripts/d3/examples/marimekko/marimekko.json +18 -0
  156. data/lib/picky-statistics/application/javascripts/d3/examples/marker/marker.html +169 -0
  157. data/lib/picky-statistics/application/javascripts/d3/examples/mercator/mercator.html +133 -0
  158. data/lib/picky-statistics/application/javascripts/d3/examples/moire/moire.html +53 -0
  159. data/lib/picky-statistics/application/javascripts/d3/examples/node-canvas/us-counties.js +70 -0
  160. data/lib/picky-statistics/application/javascripts/d3/examples/pack/pack.css +15 -0
  161. data/lib/picky-statistics/application/javascripts/d3/examples/pack/pack.html +14 -0
  162. data/lib/picky-statistics/application/javascripts/d3/examples/pack/pack.js +33 -0
  163. data/lib/picky-statistics/application/javascripts/d3/examples/parallel/cars.csv +407 -0
  164. data/lib/picky-statistics/application/javascripts/d3/examples/parallel/parallel.html +134 -0
  165. data/lib/picky-statistics/application/javascripts/d3/examples/partition/partition-icicle-zoom.html +59 -0
  166. data/lib/picky-statistics/application/javascripts/d3/examples/partition/partition-icicle.html +45 -0
  167. data/lib/picky-statistics/application/javascripts/d3/examples/partition/partition-sunburst-zoom.html +72 -0
  168. data/lib/picky-statistics/application/javascripts/d3/examples/partition/partition-sunburst.html +21 -0
  169. data/lib/picky-statistics/application/javascripts/d3/examples/partition/partition-sunburst.js +72 -0
  170. data/lib/picky-statistics/application/javascripts/d3/examples/pie/pie-transition.html +69 -0
  171. data/lib/picky-statistics/application/javascripts/d3/examples/pie/pie.html +51 -0
  172. data/lib/picky-statistics/application/javascripts/d3/examples/population/population.css +28 -0
  173. data/lib/picky-statistics/application/javascripts/d3/examples/population/population.csv +571 -0
  174. data/lib/picky-statistics/application/javascripts/d3/examples/population/population.html +13 -0
  175. data/lib/picky-statistics/application/javascripts/d3/examples/population/population.js +126 -0
  176. data/lib/picky-statistics/application/javascripts/d3/examples/qq/qq.css +18 -0
  177. data/lib/picky-statistics/application/javascripts/d3/examples/qq/qq.html +21 -0
  178. data/lib/picky-statistics/application/javascripts/d3/examples/qq/qq.js +66 -0
  179. data/lib/picky-statistics/application/javascripts/d3/examples/qq/stats.js +28 -0
  180. data/lib/picky-statistics/application/javascripts/d3/examples/qq/turkers.json +1 -0
  181. data/lib/picky-statistics/application/javascripts/d3/examples/quadtree/quadtree.html +114 -0
  182. data/lib/picky-statistics/application/javascripts/d3/examples/showreel/showreel.html +661 -0
  183. data/lib/picky-statistics/application/javascripts/d3/examples/sizzle/sizzle.html +27 -0
  184. data/lib/picky-statistics/application/javascripts/d3/examples/sort/sort.css +4 -0
  185. data/lib/picky-statistics/application/javascripts/d3/examples/sort/sort.html +12 -0
  186. data/lib/picky-statistics/application/javascripts/d3/examples/sort/sort.js +112 -0
  187. data/lib/picky-statistics/application/javascripts/d3/examples/spline/spline.css +30 -0
  188. data/lib/picky-statistics/application/javascripts/d3/examples/spline/spline.html +14 -0
  189. data/lib/picky-statistics/application/javascripts/d3/examples/spline/spline.js +113 -0
  190. data/lib/picky-statistics/application/javascripts/d3/examples/splom/flowers.json +1 -0
  191. data/lib/picky-statistics/application/javascripts/d3/examples/splom/splom.css +49 -0
  192. data/lib/picky-statistics/application/javascripts/d3/examples/splom/splom.html +13 -0
  193. data/lib/picky-statistics/application/javascripts/d3/examples/splom/splom.js +119 -0
  194. data/lib/picky-statistics/application/javascripts/d3/examples/stream/stack.css +7 -0
  195. data/lib/picky-statistics/application/javascripts/d3/examples/stream/stack.html +22 -0
  196. data/lib/picky-statistics/application/javascripts/d3/examples/stream/stack.js +119 -0
  197. data/lib/picky-statistics/application/javascripts/d3/examples/stream/stream.css +3 -0
  198. data/lib/picky-statistics/application/javascripts/d3/examples/stream/stream.html +19 -0
  199. data/lib/picky-statistics/application/javascripts/d3/examples/stream/stream.js +42 -0
  200. data/lib/picky-statistics/application/javascripts/d3/examples/stream/stream_layers.js +33 -0
  201. data/lib/picky-statistics/application/javascripts/d3/examples/superformula/dot.html +104 -0
  202. data/lib/picky-statistics/application/javascripts/d3/examples/superformula/explorer.html +120 -0
  203. data/lib/picky-statistics/application/javascripts/d3/examples/superformula/superformula.html +70 -0
  204. data/lib/picky-statistics/application/javascripts/d3/examples/superformula/superformula.js +98 -0
  205. data/lib/picky-statistics/application/javascripts/d3/examples/symbol-map/symbol-map.html +67 -0
  206. data/lib/picky-statistics/application/javascripts/d3/examples/touch/touch.html +65 -0
  207. data/lib/picky-statistics/application/javascripts/d3/examples/transform/test.html +85 -0
  208. data/lib/picky-statistics/application/javascripts/d3/examples/transform/transform.html +60 -0
  209. data/lib/picky-statistics/application/javascripts/d3/examples/tree/tree-dynamic.html +111 -0
  210. data/lib/picky-statistics/application/javascripts/d3/examples/tree/tree-interactive.html +172 -0
  211. data/lib/picky-statistics/application/javascripts/d3/examples/tree/tree-radial.html +14 -0
  212. data/lib/picky-statistics/application/javascripts/d3/examples/tree/tree-radial.js +40 -0
  213. data/lib/picky-statistics/application/javascripts/d3/examples/tree/tree.css +15 -0
  214. data/lib/picky-statistics/application/javascripts/d3/examples/tree/tree.html +14 -0
  215. data/lib/picky-statistics/application/javascripts/d3/examples/tree/tree.js +39 -0
  216. data/lib/picky-statistics/application/javascripts/d3/examples/treemap/treemap-svg.html +22 -0
  217. data/lib/picky-statistics/application/javascripts/d3/examples/treemap/treemap-svg.js +34 -0
  218. data/lib/picky-statistics/application/javascripts/d3/examples/treemap/treemap.css +8 -0
  219. data/lib/picky-statistics/application/javascripts/d3/examples/treemap/treemap.html +22 -0
  220. data/lib/picky-statistics/application/javascripts/d3/examples/treemap/treemap.js +53 -0
  221. data/lib/picky-statistics/application/javascripts/d3/examples/voroboids/boid.js +235 -0
  222. data/lib/picky-statistics/application/javascripts/d3/examples/voroboids/voroboids.css +15 -0
  223. data/lib/picky-statistics/application/javascripts/d3/examples/voroboids/voroboids.html +14 -0
  224. data/lib/picky-statistics/application/javascripts/d3/examples/voroboids/voroboids.js +65 -0
  225. data/lib/picky-statistics/application/javascripts/d3/examples/voronoi/voronoi.css +16 -0
  226. data/lib/picky-statistics/application/javascripts/d3/examples/voronoi/voronoi.html +15 -0
  227. data/lib/picky-statistics/application/javascripts/d3/examples/voronoi/voronoi.js +34 -0
  228. data/lib/picky-statistics/application/javascripts/d3/examples/zoom-pan/zoom-pan-transform.html +96 -0
  229. data/lib/picky-statistics/application/javascripts/d3/examples/zoom-pan/zoom-pan.html +120 -0
  230. data/lib/picky-statistics/application/javascripts/d3/examples/zoom/dji.csv +5233 -0
  231. data/lib/picky-statistics/application/javascripts/d3/examples/zoom/zoom.html +162 -0
  232. data/lib/picky-statistics/application/javascripts/d3/lib/colorbrewer/LICENSE +38 -0
  233. data/lib/picky-statistics/application/javascripts/d3/lib/colorbrewer/colorbrewer.css +1327 -0
  234. data/lib/picky-statistics/application/javascripts/d3/lib/colorbrewer/colorbrewer.js +32 -0
  235. data/lib/picky-statistics/application/javascripts/d3/lib/jit/LICENSE +27 -0
  236. data/lib/picky-statistics/application/javascripts/d3/lib/jquery-ui/LICENSE +25 -0
  237. data/lib/picky-statistics/application/javascripts/d3/lib/jquery-ui/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  238. data/lib/picky-statistics/application/javascripts/d3/lib/jquery-ui/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  239. data/lib/picky-statistics/application/javascripts/d3/lib/jquery-ui/images/ui-bg_flat_10_000000_40x100.png +0 -0
  240. data/lib/picky-statistics/application/javascripts/d3/lib/jquery-ui/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  241. data/lib/picky-statistics/application/javascripts/d3/lib/jquery-ui/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  242. data/lib/picky-statistics/application/javascripts/d3/lib/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  243. data/lib/picky-statistics/application/javascripts/d3/lib/jquery-ui/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  244. data/lib/picky-statistics/application/javascripts/d3/lib/jquery-ui/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  245. data/lib/picky-statistics/application/javascripts/d3/lib/jquery-ui/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  246. data/lib/picky-statistics/application/javascripts/d3/lib/jquery-ui/images/ui-icons_222222_256x240.png +0 -0
  247. data/lib/picky-statistics/application/javascripts/d3/lib/jquery-ui/images/ui-icons_228ef1_256x240.png +0 -0
  248. data/lib/picky-statistics/application/javascripts/d3/lib/jquery-ui/images/ui-icons_ef8c08_256x240.png +0 -0
  249. data/lib/picky-statistics/application/javascripts/d3/lib/jquery-ui/images/ui-icons_ffd27a_256x240.png +0 -0
  250. data/lib/picky-statistics/application/javascripts/d3/lib/jquery-ui/images/ui-icons_ffffff_256x240.png +0 -0
  251. data/lib/picky-statistics/application/javascripts/d3/lib/jquery-ui/jquery-ui.css +318 -0
  252. data/lib/picky-statistics/application/javascripts/d3/lib/jquery-ui/jquery-ui.min.js +83 -0
  253. data/lib/picky-statistics/application/javascripts/d3/lib/jquery/LICENSE +20 -0
  254. data/lib/picky-statistics/application/javascripts/d3/lib/jquery/jquery.js +6883 -0
  255. data/lib/picky-statistics/application/javascripts/d3/lib/jquery/jquery.min.js +166 -0
  256. data/lib/picky-statistics/application/javascripts/d3/lib/polymaps/LICENSE +28 -0
  257. data/lib/picky-statistics/application/javascripts/d3/lib/protovis/LICENSE +27 -0
  258. data/lib/picky-statistics/application/javascripts/d3/lib/science/LICENSE +26 -0
  259. data/lib/picky-statistics/application/javascripts/d3/lib/science/science.js +225 -0
  260. data/lib/picky-statistics/application/javascripts/d3/lib/science/science.lin.js +27 -0
  261. data/lib/picky-statistics/application/javascripts/d3/lib/science/science.lin.min.js +1 -0
  262. data/lib/picky-statistics/application/javascripts/d3/lib/science/science.min.js +1 -0
  263. data/lib/picky-statistics/application/javascripts/d3/lib/science/science.stats.js +720 -0
  264. data/lib/picky-statistics/application/javascripts/d3/lib/science/science.stats.min.js +1 -0
  265. data/lib/picky-statistics/application/javascripts/d3/lib/sizzle/LICENSE +24 -0
  266. data/lib/picky-statistics/application/javascripts/d3/lib/sizzle/sizzle.js +1376 -0
  267. data/lib/picky-statistics/application/javascripts/d3/lib/sizzle/sizzle.min.js +28 -0
  268. data/lib/picky-statistics/application/javascripts/d3/package.json +28 -0
  269. data/lib/picky-statistics/application/javascripts/d3/src/behavior/behavior.js +1 -0
  270. data/lib/picky-statistics/application/javascripts/d3/src/behavior/drag.js +125 -0
  271. data/lib/picky-statistics/application/javascripts/d3/src/behavior/zoom.js +242 -0
  272. data/lib/picky-statistics/application/javascripts/d3/src/chart/box.js +297 -0
  273. data/lib/picky-statistics/application/javascripts/d3/src/chart/bullet.js +237 -0
  274. data/lib/picky-statistics/application/javascripts/d3/src/chart/chart.js +1 -0
  275. data/lib/picky-statistics/application/javascripts/d3/src/chart/horizon.js +203 -0
  276. data/lib/picky-statistics/application/javascripts/d3/src/chart/qq.js +245 -0
  277. data/lib/picky-statistics/application/javascripts/d3/src/compat/date.js +3 -0
  278. data/lib/picky-statistics/application/javascripts/d3/src/compat/style.js +9 -0
  279. data/lib/picky-statistics/application/javascripts/d3/src/core/array.js +29 -0
  280. data/lib/picky-statistics/application/javascripts/d3/src/core/ascending.js +3 -0
  281. data/lib/picky-statistics/application/javascripts/d3/src/core/bisect.js +38 -0
  282. data/lib/picky-statistics/application/javascripts/d3/src/core/collapse.js +3 -0
  283. data/lib/picky-statistics/application/javascripts/d3/src/core/core.js +1 -0
  284. data/lib/picky-statistics/application/javascripts/d3/src/core/descending.js +3 -0
  285. data/lib/picky-statistics/application/javascripts/d3/src/core/dispatch.js +60 -0
  286. data/lib/picky-statistics/application/javascripts/d3/src/core/ease.js +128 -0
  287. data/lib/picky-statistics/application/javascripts/d3/src/core/entries.js +5 -0
  288. data/lib/picky-statistics/application/javascripts/d3/src/core/event.js +6 -0
  289. data/lib/picky-statistics/application/javascripts/d3/src/core/extent.js +21 -0
  290. data/lib/picky-statistics/application/javascripts/d3/src/core/first.js +13 -0
  291. data/lib/picky-statistics/application/javascripts/d3/src/core/format.js +100 -0
  292. data/lib/picky-statistics/application/javascripts/d3/src/core/formatPrefix.js +20 -0
  293. data/lib/picky-statistics/application/javascripts/d3/src/core/functor.js +3 -0
  294. data/lib/picky-statistics/application/javascripts/d3/src/core/hsl.js +63 -0
  295. data/lib/picky-statistics/application/javascripts/d3/src/core/html.js +10 -0
  296. data/lib/picky-statistics/application/javascripts/d3/src/core/interpolate.js +183 -0
  297. data/lib/picky-statistics/application/javascripts/d3/src/core/json.js +5 -0
  298. data/lib/picky-statistics/application/javascripts/d3/src/core/keys.js +5 -0
  299. data/lib/picky-statistics/application/javascripts/d3/src/core/last.js +13 -0
  300. data/lib/picky-statistics/application/javascripts/d3/src/core/max.js +14 -0
  301. data/lib/picky-statistics/application/javascripts/d3/src/core/mean.js +13 -0
  302. data/lib/picky-statistics/application/javascripts/d3/src/core/median.js +5 -0
  303. data/lib/picky-statistics/application/javascripts/d3/src/core/merge.js +3 -0
  304. data/lib/picky-statistics/application/javascripts/d3/src/core/min.js +14 -0
  305. data/lib/picky-statistics/application/javascripts/d3/src/core/nest.js +87 -0
  306. data/lib/picky-statistics/application/javascripts/d3/src/core/noop.js +1 -0
  307. data/lib/picky-statistics/application/javascripts/d3/src/core/ns.js +17 -0
  308. data/lib/picky-statistics/application/javascripts/d3/src/core/number.js +3 -0
  309. data/lib/picky-statistics/application/javascripts/d3/src/core/permute.js +7 -0
  310. data/lib/picky-statistics/application/javascripts/d3/src/core/quantile.js +8 -0
  311. data/lib/picky-statistics/application/javascripts/d3/src/core/random.js +15 -0
  312. data/lib/picky-statistics/application/javascripts/d3/src/core/range.js +21 -0
  313. data/lib/picky-statistics/application/javascripts/d3/src/core/rebind.js +16 -0
  314. data/lib/picky-statistics/application/javascripts/d3/src/core/requote.js +5 -0
  315. data/lib/picky-statistics/application/javascripts/d3/src/core/rgb.js +287 -0
  316. data/lib/picky-statistics/application/javascripts/d3/src/core/round.js +5 -0
  317. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-append.js +15 -0
  318. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-attr.js +44 -0
  319. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-call.js +13 -0
  320. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-classed.js +61 -0
  321. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-data.js +110 -0
  322. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-each.js +9 -0
  323. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-empty.js +3 -0
  324. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-enter-select.js +24 -0
  325. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-enter.js +11 -0
  326. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-filter.js +26 -0
  327. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-html.js +6 -0
  328. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-insert.js +20 -0
  329. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-map.js +5 -0
  330. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-node.js +9 -0
  331. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-on.js +34 -0
  332. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-order.js +11 -0
  333. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-property.js +23 -0
  334. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-remove.js +9 -0
  335. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-root.js +18 -0
  336. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-select.js +30 -0
  337. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-selectAll.js +24 -0
  338. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-sort.js +12 -0
  339. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-style.js +26 -0
  340. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-text.js +6 -0
  341. data/lib/picky-statistics/application/javascripts/d3/src/core/selection-transition.js +14 -0
  342. data/lib/picky-statistics/application/javascripts/d3/src/core/selection.js +25 -0
  343. data/lib/picky-statistics/application/javascripts/d3/src/core/split.js +21 -0
  344. data/lib/picky-statistics/application/javascripts/d3/src/core/sum.js +14 -0
  345. data/lib/picky-statistics/application/javascripts/d3/src/core/text.js +10 -0
  346. data/lib/picky-statistics/application/javascripts/d3/src/core/this.js +3 -0
  347. data/lib/picky-statistics/application/javascripts/d3/src/core/timer.js +104 -0
  348. data/lib/picky-statistics/application/javascripts/d3/src/core/transform.js +58 -0
  349. data/lib/picky-statistics/application/javascripts/d3/src/core/transition-attr.js +23 -0
  350. data/lib/picky-statistics/application/javascripts/d3/src/core/transition-delay.js +6 -0
  351. data/lib/picky-statistics/application/javascripts/d3/src/core/transition-duration.js +6 -0
  352. data/lib/picky-statistics/application/javascripts/d3/src/core/transition-each.js +9 -0
  353. data/lib/picky-statistics/application/javascripts/d3/src/core/transition-remove.js +6 -0
  354. data/lib/picky-statistics/application/javascripts/d3/src/core/transition-select.js +22 -0
  355. data/lib/picky-statistics/application/javascripts/d3/src/core/transition-selectAll.js +22 -0
  356. data/lib/picky-statistics/application/javascripts/d3/src/core/transition-style.js +14 -0
  357. data/lib/picky-statistics/application/javascripts/d3/src/core/transition-text.js +7 -0
  358. data/lib/picky-statistics/application/javascripts/d3/src/core/transition-transition.js +3 -0
  359. data/lib/picky-statistics/application/javascripts/d3/src/core/transition.js +125 -0
  360. data/lib/picky-statistics/application/javascripts/d3/src/core/transpose.js +3 -0
  361. data/lib/picky-statistics/application/javascripts/d3/src/core/uninterpolate.js +9 -0
  362. data/lib/picky-statistics/application/javascripts/d3/src/core/values.js +5 -0
  363. data/lib/picky-statistics/application/javascripts/d3/src/core/xhr.js +10 -0
  364. data/lib/picky-statistics/application/javascripts/d3/src/core/xml.js +10 -0
  365. data/lib/picky-statistics/application/javascripts/d3/src/core/zip.js +13 -0
  366. data/lib/picky-statistics/application/javascripts/d3/src/csv/csv.js +5 -0
  367. data/lib/picky-statistics/application/javascripts/d3/src/csv/format.js +13 -0
  368. data/lib/picky-statistics/application/javascripts/d3/src/csv/parse.js +73 -0
  369. data/lib/picky-statistics/application/javascripts/d3/src/end.js +1 -0
  370. data/lib/picky-statistics/application/javascripts/d3/src/externs.js +6 -0
  371. data/lib/picky-statistics/application/javascripts/d3/src/geo/albers.js +126 -0
  372. data/lib/picky-statistics/application/javascripts/d3/src/geo/azimuthal.js +80 -0
  373. data/lib/picky-statistics/application/javascripts/d3/src/geo/bonne.js +70 -0
  374. data/lib/picky-statistics/application/javascripts/d3/src/geo/bounds.js +83 -0
  375. data/lib/picky-statistics/application/javascripts/d3/src/geo/circle.js +146 -0
  376. data/lib/picky-statistics/application/javascripts/d3/src/geo/equirectangular.js +36 -0
  377. data/lib/picky-statistics/application/javascripts/d3/src/geo/geo.js +3 -0
  378. data/lib/picky-statistics/application/javascripts/d3/src/geo/greatArc.js +80 -0
  379. data/lib/picky-statistics/application/javascripts/d3/src/geo/greatCircle.js +1 -0
  380. data/lib/picky-statistics/application/javascripts/d3/src/geo/mercator.js +36 -0
  381. data/lib/picky-statistics/application/javascripts/d3/src/geo/path.js +271 -0
  382. data/lib/picky-statistics/application/javascripts/d3/src/geo/type.js +5 -0
  383. data/lib/picky-statistics/application/javascripts/d3/src/geom/contour.js +78 -0
  384. data/lib/picky-statistics/application/javascripts/d3/src/geom/delaunay.js +31 -0
  385. data/lib/picky-statistics/application/javascripts/d3/src/geom/geom.js +1 -0
  386. data/lib/picky-statistics/application/javascripts/d3/src/geom/hull.js +98 -0
  387. data/lib/picky-statistics/application/javascripts/d3/src/geom/polygon.js +88 -0
  388. data/lib/picky-statistics/application/javascripts/d3/src/geom/quadtree.js +129 -0
  389. data/lib/picky-statistics/application/javascripts/d3/src/geom/voronoi.js +409 -0
  390. data/lib/picky-statistics/application/javascripts/d3/src/layout/bundle.js +57 -0
  391. data/lib/picky-statistics/application/javascripts/d3/src/layout/chord.js +153 -0
  392. data/lib/picky-statistics/application/javascripts/d3/src/layout/cluster.js +78 -0
  393. data/lib/picky-statistics/application/javascripts/d3/src/layout/force.js +342 -0
  394. data/lib/picky-statistics/application/javascripts/d3/src/layout/hierarchy.js +120 -0
  395. data/lib/picky-statistics/application/javascripts/d3/src/layout/histogram.js +102 -0
  396. data/lib/picky-statistics/application/javascripts/d3/src/layout/layout.js +1 -0
  397. data/lib/picky-statistics/application/javascripts/d3/src/layout/pack.js +203 -0
  398. data/lib/picky-statistics/application/javascripts/d3/src/layout/partition.js +48 -0
  399. data/lib/picky-statistics/application/javascripts/d3/src/layout/pie.js +95 -0
  400. data/lib/picky-statistics/application/javascripts/d3/src/layout/stack.js +237 -0
  401. data/lib/picky-statistics/application/javascripts/d3/src/layout/tree.js +237 -0
  402. data/lib/picky-statistics/application/javascripts/d3/src/layout/treemap.js +217 -0
  403. data/lib/picky-statistics/application/javascripts/d3/src/package.js +18 -0
  404. data/lib/picky-statistics/application/javascripts/d3/src/scale/bilinear.js +7 -0
  405. data/lib/picky-statistics/application/javascripts/d3/src/scale/category.js +54 -0
  406. data/lib/picky-statistics/application/javascripts/d3/src/scale/linear.js +111 -0
  407. data/lib/picky-statistics/application/javascripts/d3/src/scale/log.js +85 -0
  408. data/lib/picky-statistics/application/javascripts/d3/src/scale/nice.js +24 -0
  409. data/lib/picky-statistics/application/javascripts/d3/src/scale/ordinal.js +81 -0
  410. data/lib/picky-statistics/application/javascripts/d3/src/scale/polylinear.js +16 -0
  411. data/lib/picky-statistics/application/javascripts/d3/src/scale/pow.js +54 -0
  412. data/lib/picky-statistics/application/javascripts/d3/src/scale/quantile.js +43 -0
  413. data/lib/picky-statistics/application/javascripts/d3/src/scale/quantize.js +36 -0
  414. data/lib/picky-statistics/application/javascripts/d3/src/scale/scale.js +10 -0
  415. data/lib/picky-statistics/application/javascripts/d3/src/scale/sqrt.js +3 -0
  416. data/lib/picky-statistics/application/javascripts/d3/src/start.js +1 -0
  417. data/lib/picky-statistics/application/javascripts/d3/src/svg/arc.js +95 -0
  418. data/lib/picky-statistics/application/javascripts/d3/src/svg/area-radial.js +10 -0
  419. data/lib/picky-statistics/application/javascripts/d3/src/svg/area.js +89 -0
  420. data/lib/picky-statistics/application/javascripts/d3/src/svg/axis.js +200 -0
  421. data/lib/picky-statistics/application/javascripts/d3/src/svg/brush.js +334 -0
  422. data/lib/picky-statistics/application/javascripts/d3/src/svg/chord.js +99 -0
  423. data/lib/picky-statistics/application/javascripts/d3/src/svg/diagonal-radial.js +22 -0
  424. data/lib/picky-statistics/application/javascripts/d3/src/svg/diagonal.js +38 -0
  425. data/lib/picky-statistics/application/javascripts/d3/src/svg/line-radial.js +22 -0
  426. data/lib/picky-statistics/application/javascripts/d3/src/svg/line.js +415 -0
  427. data/lib/picky-statistics/application/javascripts/d3/src/svg/mouse.js +29 -0
  428. data/lib/picky-statistics/application/javascripts/d3/src/svg/svg.js +1 -0
  429. data/lib/picky-statistics/application/javascripts/d3/src/svg/symbol.js +98 -0
  430. data/lib/picky-statistics/application/javascripts/d3/src/svg/touches.js +9 -0
  431. data/lib/picky-statistics/application/javascripts/d3/src/time/day.js +7 -0
  432. data/lib/picky-statistics/application/javascripts/d3/src/time/days.js +11 -0
  433. data/lib/picky-statistics/application/javascripts/d3/src/time/format-iso.js +13 -0
  434. data/lib/picky-statistics/application/javascripts/d3/src/time/format-utc.js +53 -0
  435. data/lib/picky-statistics/application/javascripts/d3/src/time/format.js +327 -0
  436. data/lib/picky-statistics/application/javascripts/d3/src/time/hour.js +8 -0
  437. data/lib/picky-statistics/application/javascripts/d3/src/time/hours.js +11 -0
  438. data/lib/picky-statistics/application/javascripts/d3/src/time/minute.js +5 -0
  439. data/lib/picky-statistics/application/javascripts/d3/src/time/minutes.js +11 -0
  440. data/lib/picky-statistics/application/javascripts/d3/src/time/month.js +7 -0
  441. data/lib/picky-statistics/application/javascripts/d3/src/time/months.js +11 -0
  442. data/lib/picky-statistics/application/javascripts/d3/src/time/range.js +16 -0
  443. data/lib/picky-statistics/application/javascripts/d3/src/time/scale-utc.js +36 -0
  444. data/lib/picky-statistics/application/javascripts/d3/src/time/scale.js +118 -0
  445. data/lib/picky-statistics/application/javascripts/d3/src/time/second.js +5 -0
  446. data/lib/picky-statistics/application/javascripts/d3/src/time/seconds.js +7 -0
  447. data/lib/picky-statistics/application/javascripts/d3/src/time/time.js +3 -0
  448. data/lib/picky-statistics/application/javascripts/d3/src/time/week.js +9 -0
  449. data/lib/picky-statistics/application/javascripts/d3/src/time/weeks.js +11 -0
  450. data/lib/picky-statistics/application/javascripts/d3/src/time/year.js +7 -0
  451. data/lib/picky-statistics/application/javascripts/d3/src/time/years.js +11 -0
  452. data/lib/picky-statistics/application/javascripts/d3/test/core/ascending-test.js +47 -0
  453. data/lib/picky-statistics/application/javascripts/d3/test/core/bisect-test.js +103 -0
  454. data/lib/picky-statistics/application/javascripts/d3/test/core/descending-test.js +47 -0
  455. data/lib/picky-statistics/application/javascripts/d3/test/core/dispatch-test.js +129 -0
  456. data/lib/picky-statistics/application/javascripts/d3/test/core/ease-test.js +129 -0
  457. data/lib/picky-statistics/application/javascripts/d3/test/core/entries-test.js +43 -0
  458. data/lib/picky-statistics/application/javascripts/d3/test/core/extent-test.js +51 -0
  459. data/lib/picky-statistics/application/javascripts/d3/test/core/first-test.js +42 -0
  460. data/lib/picky-statistics/application/javascripts/d3/test/core/format-test.js +239 -0
  461. data/lib/picky-statistics/application/javascripts/d3/test/core/formatPrefix-test.js +108 -0
  462. data/lib/picky-statistics/application/javascripts/d3/test/core/functor-test.js +29 -0
  463. data/lib/picky-statistics/application/javascripts/d3/test/core/hsl-test.js +82 -0
  464. data/lib/picky-statistics/application/javascripts/d3/test/core/html-test.js +37 -0
  465. data/lib/picky-statistics/application/javascripts/d3/test/core/interpolate-test.js +209 -0
  466. data/lib/picky-statistics/application/javascripts/d3/test/core/json-test.js +37 -0
  467. data/lib/picky-statistics/application/javascripts/d3/test/core/keys-test.js +31 -0
  468. data/lib/picky-statistics/application/javascripts/d3/test/core/last-test.js +42 -0
  469. data/lib/picky-statistics/application/javascripts/d3/test/core/max-test.js +51 -0
  470. data/lib/picky-statistics/application/javascripts/d3/test/core/mean-test.js +43 -0
  471. data/lib/picky-statistics/application/javascripts/d3/test/core/median-test.js +43 -0
  472. data/lib/picky-statistics/application/javascripts/d3/test/core/merge-test.js +27 -0
  473. data/lib/picky-statistics/application/javascripts/d3/test/core/min-test.js +50 -0
  474. data/lib/picky-statistics/application/javascripts/d3/test/core/nest-test.js +236 -0
  475. data/lib/picky-statistics/application/javascripts/d3/test/core/ns-test.js +58 -0
  476. data/lib/picky-statistics/application/javascripts/d3/test/core/permute-test.js +53 -0
  477. data/lib/picky-statistics/application/javascripts/d3/test/core/quantile-test.js +50 -0
  478. data/lib/picky-statistics/application/javascripts/d3/test/core/range-test.js +93 -0
  479. data/lib/picky-statistics/application/javascripts/d3/test/core/rebind-test.js +52 -0
  480. data/lib/picky-statistics/application/javascripts/d3/test/core/requote-test.js +53 -0
  481. data/lib/picky-statistics/application/javascripts/d3/test/core/rgb-test.js +89 -0
  482. data/lib/picky-statistics/application/javascripts/d3/test/core/round-test.js +70 -0
  483. data/lib/picky-statistics/application/javascripts/d3/test/core/select-test.js +42 -0
  484. data/lib/picky-statistics/application/javascripts/d3/test/core/selectAll-test.js +46 -0
  485. data/lib/picky-statistics/application/javascripts/d3/test/core/selection-append-test.js +123 -0
  486. data/lib/picky-statistics/application/javascripts/d3/test/core/selection-attr-test.js +153 -0
  487. data/lib/picky-statistics/application/javascripts/d3/test/core/selection-call-test.js +71 -0
  488. data/lib/picky-statistics/application/javascripts/d3/test/core/selection-classed-test.js +219 -0
  489. data/lib/picky-statistics/application/javascripts/d3/test/core/selection-data-test.js +168 -0
  490. data/lib/picky-statistics/application/javascripts/d3/test/core/selection-each-test.js +83 -0
  491. data/lib/picky-statistics/application/javascripts/d3/test/core/selection-empty-test.js +51 -0
  492. data/lib/picky-statistics/application/javascripts/d3/test/core/selection-filter-test.js +70 -0
  493. data/lib/picky-statistics/application/javascripts/d3/test/core/selection-html-test.js +121 -0
  494. data/lib/picky-statistics/application/javascripts/d3/test/core/selection-insert-test.js +136 -0
  495. data/lib/picky-statistics/application/javascripts/d3/test/core/selection-map-test.js +47 -0
  496. data/lib/picky-statistics/application/javascripts/d3/test/core/selection-node-test.js +50 -0
  497. data/lib/picky-statistics/application/javascripts/d3/test/core/selection-on-test.js +95 -0
  498. data/lib/picky-statistics/application/javascripts/d3/test/core/selection-order-test.js +32 -0
  499. data/lib/picky-statistics/application/javascripts/d3/test/core/selection-property-test.js +91 -0
  500. data/lib/picky-statistics/application/javascripts/d3/test/core/selection-remove-test.js +39 -0
  501. data/lib/picky-statistics/application/javascripts/d3/test/core/selection-select-test.js +125 -0
  502. data/lib/picky-statistics/application/javascripts/d3/test/core/selection-selectAll-test.js +128 -0
  503. data/lib/picky-statistics/application/javascripts/d3/test/core/selection-sort-test.js +59 -0
  504. data/lib/picky-statistics/application/javascripts/d3/test/core/selection-style-test.js +100 -0
  505. data/lib/picky-statistics/application/javascripts/d3/test/core/selection-test.js +35 -0
  506. data/lib/picky-statistics/application/javascripts/d3/test/core/selection-text-test.js +109 -0
  507. data/lib/picky-statistics/application/javascripts/d3/test/core/split-test.js +34 -0
  508. data/lib/picky-statistics/application/javascripts/d3/test/core/sum-test.js +47 -0
  509. data/lib/picky-statistics/application/javascripts/d3/test/core/text-test.js +48 -0
  510. data/lib/picky-statistics/application/javascripts/d3/test/core/timer-test.js +62 -0
  511. data/lib/picky-statistics/application/javascripts/d3/test/core/transition-test-attr.js +54 -0
  512. data/lib/picky-statistics/application/javascripts/d3/test/core/transition-test-attrTween.js +67 -0
  513. data/lib/picky-statistics/application/javascripts/d3/test/core/transition-test-call.js +33 -0
  514. data/lib/picky-statistics/application/javascripts/d3/test/core/transition-test-delay.js +41 -0
  515. data/lib/picky-statistics/application/javascripts/d3/test/core/transition-test-duration.js +41 -0
  516. data/lib/picky-statistics/application/javascripts/d3/test/core/transition-test-each.js +166 -0
  517. data/lib/picky-statistics/application/javascripts/d3/test/core/transition-test-id.js +20 -0
  518. data/lib/picky-statistics/application/javascripts/d3/test/core/transition-test-remove.js +46 -0
  519. data/lib/picky-statistics/application/javascripts/d3/test/core/transition-test-select.js +63 -0
  520. data/lib/picky-statistics/application/javascripts/d3/test/core/transition-test-selectAll.js +59 -0
  521. data/lib/picky-statistics/application/javascripts/d3/test/core/transition-test-style.js +49 -0
  522. data/lib/picky-statistics/application/javascripts/d3/test/core/transition-test-styleTween.js +73 -0
  523. data/lib/picky-statistics/application/javascripts/d3/test/core/transition-test-text.js +30 -0
  524. data/lib/picky-statistics/application/javascripts/d3/test/core/transition-test-time.js +36 -0
  525. data/lib/picky-statistics/application/javascripts/d3/test/core/transition-test-transition.js +60 -0
  526. data/lib/picky-statistics/application/javascripts/d3/test/core/transition-test-tween.js +71 -0
  527. data/lib/picky-statistics/application/javascripts/d3/test/core/transition-test.js +66 -0
  528. data/lib/picky-statistics/application/javascripts/d3/test/core/transpose-test.js +32 -0
  529. data/lib/picky-statistics/application/javascripts/d3/test/core/values-test.js +35 -0
  530. data/lib/picky-statistics/application/javascripts/d3/test/core/version-test.js +18 -0
  531. data/lib/picky-statistics/application/javascripts/d3/test/core/xhr-test.js +56 -0
  532. data/lib/picky-statistics/application/javascripts/d3/test/core/xml-test.js +48 -0
  533. data/lib/picky-statistics/application/javascripts/d3/test/core/zip-test.js +32 -0
  534. data/lib/picky-statistics/application/javascripts/d3/test/csv/csv-test.js +38 -0
  535. data/lib/picky-statistics/application/javascripts/d3/test/csv/format-test.js +39 -0
  536. data/lib/picky-statistics/application/javascripts/d3/test/csv/parse-test.js +101 -0
  537. data/lib/picky-statistics/application/javascripts/d3/test/env-assert.js +96 -0
  538. data/lib/picky-statistics/application/javascripts/d3/test/env-fragment.js +8 -0
  539. data/lib/picky-statistics/application/javascripts/d3/test/env-xhr.js +56 -0
  540. data/lib/picky-statistics/application/javascripts/d3/test/env.js +13 -0
  541. data/lib/picky-statistics/application/javascripts/d3/test/geo/albers-test.js +57 -0
  542. data/lib/picky-statistics/application/javascripts/d3/test/geo/azimuthal-test.js +261 -0
  543. data/lib/picky-statistics/application/javascripts/d3/test/geo/bonne-test.js +116 -0
  544. data/lib/picky-statistics/application/javascripts/d3/test/geo/equirectangular-test.js +50 -0
  545. data/lib/picky-statistics/application/javascripts/d3/test/geo/greatArc-test.js +41 -0
  546. data/lib/picky-statistics/application/javascripts/d3/test/geo/mercator-test.js +57 -0
  547. data/lib/picky-statistics/application/javascripts/d3/test/geo/path-test.js +25 -0
  548. data/lib/picky-statistics/application/javascripts/d3/test/geom/polygon-test.js +57 -0
  549. data/lib/picky-statistics/application/javascripts/d3/test/layout/cluster-test.js +39 -0
  550. data/lib/picky-statistics/application/javascripts/d3/test/layout/hierarchy-test.js +30 -0
  551. data/lib/picky-statistics/application/javascripts/d3/test/layout/histogram-test.js +91 -0
  552. data/lib/picky-statistics/application/javascripts/d3/test/layout/pack-test.js +67 -0
  553. data/lib/picky-statistics/application/javascripts/d3/test/layout/partition-test.js +50 -0
  554. data/lib/picky-statistics/application/javascripts/d3/test/layout/tree-test.js +41 -0
  555. data/lib/picky-statistics/application/javascripts/d3/test/layout/treemap-test.js +190 -0
  556. data/lib/picky-statistics/application/javascripts/d3/test/scale/category-test.js +74 -0
  557. data/lib/picky-statistics/application/javascripts/d3/test/scale/linear-test.js +243 -0
  558. data/lib/picky-statistics/application/javascripts/d3/test/scale/log-test.js +266 -0
  559. data/lib/picky-statistics/application/javascripts/d3/test/scale/ordinal-test.js +207 -0
  560. data/lib/picky-statistics/application/javascripts/d3/test/scale/pow-test.js +263 -0
  561. data/lib/picky-statistics/application/javascripts/d3/test/scale/quantile-test.js +64 -0
  562. data/lib/picky-statistics/application/javascripts/d3/test/scale/quantize-test.js +69 -0
  563. data/lib/picky-statistics/application/javascripts/d3/test/scale/sqrt-test.js +256 -0
  564. data/lib/picky-statistics/application/javascripts/d3/test/svg/arc-test.js +147 -0
  565. data/lib/picky-statistics/application/javascripts/d3/test/svg/area-radial-test.js +200 -0
  566. data/lib/picky-statistics/application/javascripts/d3/test/svg/area-test.js +192 -0
  567. data/lib/picky-statistics/application/javascripts/d3/test/svg/axis-test.js +353 -0
  568. data/lib/picky-statistics/application/javascripts/d3/test/svg/line-radial-test.js +125 -0
  569. data/lib/picky-statistics/application/javascripts/d3/test/svg/line-test.js +189 -0
  570. data/lib/picky-statistics/application/javascripts/d3/test/svg/symbol-test.js +96 -0
  571. data/lib/picky-statistics/application/javascripts/d3/test/time/day-test.js +65 -0
  572. data/lib/picky-statistics/application/javascripts/d3/test/time/days-test.js +105 -0
  573. data/lib/picky-statistics/application/javascripts/d3/test/time/format-test.js +467 -0
  574. data/lib/picky-statistics/application/javascripts/d3/test/time/hour-test.js +103 -0
  575. data/lib/picky-statistics/application/javascripts/d3/test/time/hours-test.js +135 -0
  576. data/lib/picky-statistics/application/javascripts/d3/test/time/minute-test.js +43 -0
  577. data/lib/picky-statistics/application/javascripts/d3/test/time/minutes-test.js +101 -0
  578. data/lib/picky-statistics/application/javascripts/d3/test/time/month-test.js +53 -0
  579. data/lib/picky-statistics/application/javascripts/d3/test/time/months-test.js +105 -0
  580. data/lib/picky-statistics/application/javascripts/d3/test/time/scale-test.js +525 -0
  581. data/lib/picky-statistics/application/javascripts/d3/test/time/second-test.js +41 -0
  582. data/lib/picky-statistics/application/javascripts/d3/test/time/seconds-test.js +101 -0
  583. data/lib/picky-statistics/application/javascripts/d3/test/time/week-test.js +59 -0
  584. data/lib/picky-statistics/application/javascripts/d3/test/time/weeks-test.js +105 -0
  585. data/lib/picky-statistics/application/javascripts/d3/test/time/year-test.js +41 -0
  586. data/lib/picky-statistics/application/javascripts/d3/test/time/years-test.js +73 -0
  587. data/lib/picky-statistics/application/javascripts/full_live.js +60 -0
  588. data/lib/picky-statistics/application/javascripts/graph.js +83 -0
  589. data/lib/picky-statistics/application/javascripts/results.js +86 -0
  590. data/lib/picky-statistics/application/javascripts/rickshaw.js +1 -0
  591. data/lib/picky-statistics/application/javascripts/statistics.js +30 -55
  592. data/lib/picky-statistics/application/stylesheets/statistics.css +83 -27
  593. data/lib/picky-statistics/application/views/index.haml +29 -39
  594. data/lib/picky-statistics/statistics/logfile_reader.rb +43 -32
  595. data/spec/lib/picky-statistics/statistics/logfile_reader_spec.rb +28 -25
  596. metadata +596 -6
@@ -0,0 +1,1891 @@
1
+ (function(){d3.layout = {};
2
+ // Implements hierarchical edge bundling using Holten's algorithm. For each
3
+ // input link, a path is computed that travels through the tree, up the parent
4
+ // hierarchy to the least common ancestor, and then back down to the destination
5
+ // node. Each path is simply an array of nodes.
6
+ d3.layout.bundle = function() {
7
+ return function(links) {
8
+ var paths = [],
9
+ i = -1,
10
+ n = links.length;
11
+ while (++i < n) paths.push(d3_layout_bundlePath(links[i]));
12
+ return paths;
13
+ };
14
+ };
15
+
16
+ function d3_layout_bundlePath(link) {
17
+ var start = link.source,
18
+ end = link.target,
19
+ lca = d3_layout_bundleLeastCommonAncestor(start, end),
20
+ points = [start];
21
+ while (start !== lca) {
22
+ start = start.parent;
23
+ points.push(start);
24
+ }
25
+ var k = points.length;
26
+ while (end !== lca) {
27
+ points.splice(k, 0, end);
28
+ end = end.parent;
29
+ }
30
+ return points;
31
+ }
32
+
33
+ function d3_layout_bundleAncestors(node) {
34
+ var ancestors = [],
35
+ parent = node.parent;
36
+ while (parent != null) {
37
+ ancestors.push(node);
38
+ node = parent;
39
+ parent = parent.parent;
40
+ }
41
+ ancestors.push(node);
42
+ return ancestors;
43
+ }
44
+
45
+ function d3_layout_bundleLeastCommonAncestor(a, b) {
46
+ if (a === b) return a;
47
+ var aNodes = d3_layout_bundleAncestors(a),
48
+ bNodes = d3_layout_bundleAncestors(b),
49
+ aNode = aNodes.pop(),
50
+ bNode = bNodes.pop(),
51
+ sharedNode = null;
52
+ while (aNode === bNode) {
53
+ sharedNode = aNode;
54
+ aNode = aNodes.pop();
55
+ bNode = bNodes.pop();
56
+ }
57
+ return sharedNode;
58
+ }
59
+ d3.layout.chord = function() {
60
+ var chord = {},
61
+ chords,
62
+ groups,
63
+ matrix,
64
+ n,
65
+ padding = 0,
66
+ sortGroups,
67
+ sortSubgroups,
68
+ sortChords;
69
+
70
+ function relayout() {
71
+ var subgroups = {},
72
+ groupSums = [],
73
+ groupIndex = d3.range(n),
74
+ subgroupIndex = [],
75
+ k,
76
+ x,
77
+ x0,
78
+ i,
79
+ j;
80
+
81
+ chords = [];
82
+ groups = [];
83
+
84
+ // Compute the sum.
85
+ k = 0, i = -1; while (++i < n) {
86
+ x = 0, j = -1; while (++j < n) {
87
+ x += matrix[i][j];
88
+ }
89
+ groupSums.push(x);
90
+ subgroupIndex.push(d3.range(n));
91
+ k += x;
92
+ }
93
+
94
+ // Sort groups…
95
+ if (sortGroups) {
96
+ groupIndex.sort(function(a, b) {
97
+ return sortGroups(groupSums[a], groupSums[b]);
98
+ });
99
+ }
100
+
101
+ // Sort subgroups…
102
+ if (sortSubgroups) {
103
+ subgroupIndex.forEach(function(d, i) {
104
+ d.sort(function(a, b) {
105
+ return sortSubgroups(matrix[i][a], matrix[i][b]);
106
+ });
107
+ });
108
+ }
109
+
110
+ // Convert the sum to scaling factor for [0, 2pi].
111
+ // TODO Allow start and end angle to be specified.
112
+ // TODO Allow padding to be specified as percentage?
113
+ k = (2 * Math.PI - padding * n) / k;
114
+
115
+ // Compute the start and end angle for each group and subgroup.
116
+ // Note: Opera has a bug reordering object literal properties!
117
+ x = 0, i = -1; while (++i < n) {
118
+ x0 = x, j = -1; while (++j < n) {
119
+ var di = groupIndex[i],
120
+ dj = subgroupIndex[di][j],
121
+ v = matrix[di][dj],
122
+ a0 = x,
123
+ a1 = x += v * k;
124
+ subgroups[di + "-" + dj] = {
125
+ index: di,
126
+ subindex: dj,
127
+ startAngle: a0,
128
+ endAngle: a1,
129
+ value: v
130
+ };
131
+ }
132
+ groups.push({
133
+ index: di,
134
+ startAngle: x0,
135
+ endAngle: x,
136
+ value: (x - x0) / k
137
+ });
138
+ x += padding;
139
+ }
140
+
141
+ // Generate chords for each (non-empty) subgroup-subgroup link.
142
+ i = -1; while (++i < n) {
143
+ j = i - 1; while (++j < n) {
144
+ var source = subgroups[i + "-" + j],
145
+ target = subgroups[j + "-" + i];
146
+ if (source.value || target.value) {
147
+ chords.push(source.value < target.value
148
+ ? {source: target, target: source}
149
+ : {source: source, target: target});
150
+ }
151
+ }
152
+ }
153
+
154
+ if (sortChords) resort();
155
+ }
156
+
157
+ function resort() {
158
+ chords.sort(function(a, b) {
159
+ return sortChords(
160
+ (a.source.value + a.target.value) / 2,
161
+ (b.source.value + b.target.value) / 2);
162
+ });
163
+ }
164
+
165
+ chord.matrix = function(x) {
166
+ if (!arguments.length) return matrix;
167
+ n = (matrix = x) && matrix.length;
168
+ chords = groups = null;
169
+ return chord;
170
+ };
171
+
172
+ chord.padding = function(x) {
173
+ if (!arguments.length) return padding;
174
+ padding = x;
175
+ chords = groups = null;
176
+ return chord;
177
+ };
178
+
179
+ chord.sortGroups = function(x) {
180
+ if (!arguments.length) return sortGroups;
181
+ sortGroups = x;
182
+ chords = groups = null;
183
+ return chord;
184
+ };
185
+
186
+ chord.sortSubgroups = function(x) {
187
+ if (!arguments.length) return sortSubgroups;
188
+ sortSubgroups = x;
189
+ chords = null;
190
+ return chord;
191
+ };
192
+
193
+ chord.sortChords = function(x) {
194
+ if (!arguments.length) return sortChords;
195
+ sortChords = x;
196
+ if (chords) resort();
197
+ return chord;
198
+ };
199
+
200
+ chord.chords = function() {
201
+ if (!chords) relayout();
202
+ return chords;
203
+ };
204
+
205
+ chord.groups = function() {
206
+ if (!groups) relayout();
207
+ return groups;
208
+ };
209
+
210
+ return chord;
211
+ };
212
+ // A rudimentary force layout using Gauss-Seidel.
213
+ d3.layout.force = function() {
214
+ var force = {},
215
+ event = d3.dispatch("tick"),
216
+ size = [1, 1],
217
+ drag,
218
+ alpha,
219
+ friction = .9,
220
+ linkDistance = d3_layout_forceLinkDistance,
221
+ linkStrength = d3_layout_forceLinkStrength,
222
+ charge = -30,
223
+ gravity = .1,
224
+ theta = .8,
225
+ interval,
226
+ nodes = [],
227
+ links = [],
228
+ distances,
229
+ strengths,
230
+ charges;
231
+
232
+ function repulse(node) {
233
+ return function(quad, x1, y1, x2, y2) {
234
+ if (quad.point !== node) {
235
+ var dx = quad.cx - node.x,
236
+ dy = quad.cy - node.y,
237
+ dn = 1 / Math.sqrt(dx * dx + dy * dy);
238
+
239
+ /* Barnes-Hut criterion. */
240
+ if ((x2 - x1) * dn < theta) {
241
+ var k = quad.charge * dn * dn;
242
+ node.px -= dx * k;
243
+ node.py -= dy * k;
244
+ return true;
245
+ }
246
+
247
+ if (quad.point && isFinite(dn)) {
248
+ var k = quad.pointCharge * dn * dn;
249
+ node.px -= dx * k;
250
+ node.py -= dy * k;
251
+ }
252
+ }
253
+ return !quad.charge;
254
+ };
255
+ }
256
+
257
+ function tick() {
258
+ var n = nodes.length,
259
+ m = links.length,
260
+ q,
261
+ i, // current index
262
+ o, // current object
263
+ s, // current source
264
+ t, // current target
265
+ l, // current distance
266
+ k, // current force
267
+ x, // x-distance
268
+ y; // y-distance
269
+
270
+ // gauss-seidel relaxation for links
271
+ for (i = 0; i < m; ++i) {
272
+ o = links[i];
273
+ s = o.source;
274
+ t = o.target;
275
+ x = t.x - s.x;
276
+ y = t.y - s.y;
277
+ if (l = (x * x + y * y)) {
278
+ l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;
279
+ x *= l;
280
+ y *= l;
281
+ t.x -= x * (k = s.weight / (t.weight + s.weight));
282
+ t.y -= y * k;
283
+ s.x += x * (k = 1 - k);
284
+ s.y += y * k;
285
+ }
286
+ }
287
+
288
+ // apply gravity forces
289
+ if (k = alpha * gravity) {
290
+ x = size[0] / 2;
291
+ y = size[1] / 2;
292
+ i = -1; if (k) while (++i < n) {
293
+ o = nodes[i];
294
+ o.x += (x - o.x) * k;
295
+ o.y += (y - o.y) * k;
296
+ }
297
+ }
298
+
299
+ // compute quadtree center of mass and apply charge forces
300
+ if (charge) {
301
+ d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);
302
+ i = -1; while (++i < n) {
303
+ if (!(o = nodes[i]).fixed) {
304
+ q.visit(repulse(o));
305
+ }
306
+ }
307
+ }
308
+
309
+ // position verlet integration
310
+ i = -1; while (++i < n) {
311
+ o = nodes[i];
312
+ if (o.fixed) {
313
+ o.x = o.px;
314
+ o.y = o.py;
315
+ } else {
316
+ o.x -= (o.px - (o.px = o.x)) * friction;
317
+ o.y -= (o.py - (o.py = o.y)) * friction;
318
+ }
319
+ }
320
+
321
+ event.tick({type: "tick", alpha: alpha});
322
+
323
+ // simulated annealing, basically
324
+ return (alpha *= .99) < .005;
325
+ }
326
+
327
+ force.nodes = function(x) {
328
+ if (!arguments.length) return nodes;
329
+ nodes = x;
330
+ return force;
331
+ };
332
+
333
+ force.links = function(x) {
334
+ if (!arguments.length) return links;
335
+ links = x;
336
+ return force;
337
+ };
338
+
339
+ force.size = function(x) {
340
+ if (!arguments.length) return size;
341
+ size = x;
342
+ return force;
343
+ };
344
+
345
+ force.linkDistance = function(x) {
346
+ if (!arguments.length) return linkDistance;
347
+ linkDistance = d3.functor(x);
348
+ return force;
349
+ };
350
+
351
+ // For backwards-compatibility.
352
+ force.distance = force.linkDistance;
353
+
354
+ force.linkStrength = function(x) {
355
+ if (!arguments.length) return linkStrength;
356
+ linkStrength = d3.functor(x);
357
+ return force;
358
+ };
359
+
360
+ force.friction = function(x) {
361
+ if (!arguments.length) return friction;
362
+ friction = x;
363
+ return force;
364
+ };
365
+
366
+ force.charge = function(x) {
367
+ if (!arguments.length) return charge;
368
+ charge = typeof x === "function" ? x : +x;
369
+ return force;
370
+ };
371
+
372
+ force.gravity = function(x) {
373
+ if (!arguments.length) return gravity;
374
+ gravity = x;
375
+ return force;
376
+ };
377
+
378
+ force.theta = function(x) {
379
+ if (!arguments.length) return theta;
380
+ theta = x;
381
+ return force;
382
+ };
383
+
384
+ force.start = function() {
385
+ var i,
386
+ j,
387
+ n = nodes.length,
388
+ m = links.length,
389
+ w = size[0],
390
+ h = size[1],
391
+ neighbors,
392
+ o;
393
+
394
+ for (i = 0; i < n; ++i) {
395
+ (o = nodes[i]).index = i;
396
+ o.weight = 0;
397
+ }
398
+
399
+ distances = [];
400
+ strengths = [];
401
+ for (i = 0; i < m; ++i) {
402
+ o = links[i];
403
+ if (typeof o.source == "number") o.source = nodes[o.source];
404
+ if (typeof o.target == "number") o.target = nodes[o.target];
405
+ distances[i] = linkDistance.call(this, o, i);
406
+ strengths[i] = linkStrength.call(this, o, i);
407
+ ++o.source.weight;
408
+ ++o.target.weight;
409
+ }
410
+
411
+ for (i = 0; i < n; ++i) {
412
+ o = nodes[i];
413
+ if (isNaN(o.x)) o.x = position("x", w);
414
+ if (isNaN(o.y)) o.y = position("y", h);
415
+ if (isNaN(o.px)) o.px = o.x;
416
+ if (isNaN(o.py)) o.py = o.y;
417
+ }
418
+
419
+ charges = [];
420
+ if (typeof charge === "function") {
421
+ for (i = 0; i < n; ++i) {
422
+ charges[i] = +charge.call(this, nodes[i], i);
423
+ }
424
+ } else {
425
+ for (i = 0; i < n; ++i) {
426
+ charges[i] = charge;
427
+ }
428
+ }
429
+
430
+ // initialize node position based on first neighbor
431
+ function position(dimension, size) {
432
+ var neighbors = neighbor(i),
433
+ j = -1,
434
+ m = neighbors.length,
435
+ x;
436
+ while (++j < m) if (!isNaN(x = neighbors[j][dimension])) return x;
437
+ return Math.random() * size;
438
+ }
439
+
440
+ // initialize neighbors lazily
441
+ function neighbor() {
442
+ if (!neighbors) {
443
+ neighbors = [];
444
+ for (j = 0; j < n; ++j) {
445
+ neighbors[j] = [];
446
+ }
447
+ for (j = 0; j < m; ++j) {
448
+ var o = links[j];
449
+ neighbors[o.source.index].push(o.target);
450
+ neighbors[o.target.index].push(o.source);
451
+ }
452
+ }
453
+ return neighbors[i];
454
+ }
455
+
456
+ return force.resume();
457
+ };
458
+
459
+ force.resume = function() {
460
+ alpha = .1;
461
+ d3.timer(tick);
462
+ return force;
463
+ };
464
+
465
+ force.stop = function() {
466
+ alpha = 0;
467
+ return force;
468
+ };
469
+
470
+ // use `node.call(force.drag)` to make nodes draggable
471
+ force.drag = function() {
472
+ if (!drag) drag = d3.behavior.drag()
473
+ .origin(Object)
474
+ .on("dragstart", dragstart)
475
+ .on("drag", d3_layout_forceDrag)
476
+ .on("dragend", d3_layout_forceDragEnd);
477
+
478
+ this.on("mouseover.force", d3_layout_forceDragOver)
479
+ .on("mouseout.force", d3_layout_forceDragOut)
480
+ .call(drag);
481
+ };
482
+
483
+ function dragstart(d) {
484
+ d3_layout_forceDragOver(d3_layout_forceDragNode = d);
485
+ d3_layout_forceDragForce = force;
486
+ }
487
+
488
+ return d3.rebind(force, event, "on");
489
+ };
490
+
491
+ var d3_layout_forceDragForce,
492
+ d3_layout_forceDragNode;
493
+
494
+ function d3_layout_forceDragOver(d) {
495
+ d.fixed |= 2;
496
+ }
497
+
498
+ function d3_layout_forceDragOut(d) {
499
+ if (d !== d3_layout_forceDragNode) d.fixed &= 1;
500
+ }
501
+
502
+ function d3_layout_forceDragEnd() {
503
+ d3_layout_forceDrag();
504
+ d3_layout_forceDragNode.fixed &= 1;
505
+ d3_layout_forceDragForce = d3_layout_forceDragNode = null;
506
+ }
507
+
508
+ function d3_layout_forceDrag() {
509
+ d3_layout_forceDragNode.px = d3.event.x;
510
+ d3_layout_forceDragNode.py = d3.event.y;
511
+ d3_layout_forceDragForce.resume(); // restart annealing
512
+ }
513
+
514
+ function d3_layout_forceAccumulate(quad, alpha, charges) {
515
+ var cx = 0,
516
+ cy = 0;
517
+ quad.charge = 0;
518
+ if (!quad.leaf) {
519
+ var nodes = quad.nodes,
520
+ n = nodes.length,
521
+ i = -1,
522
+ c;
523
+ while (++i < n) {
524
+ c = nodes[i];
525
+ if (c == null) continue;
526
+ d3_layout_forceAccumulate(c, alpha, charges);
527
+ quad.charge += c.charge;
528
+ cx += c.charge * c.cx;
529
+ cy += c.charge * c.cy;
530
+ }
531
+ }
532
+ if (quad.point) {
533
+ // jitter internal nodes that are coincident
534
+ if (!quad.leaf) {
535
+ quad.point.x += Math.random() - .5;
536
+ quad.point.y += Math.random() - .5;
537
+ }
538
+ var k = alpha * charges[quad.point.index];
539
+ quad.charge += quad.pointCharge = k;
540
+ cx += k * quad.point.x;
541
+ cy += k * quad.point.y;
542
+ }
543
+ quad.cx = cx / quad.charge;
544
+ quad.cy = cy / quad.charge;
545
+ }
546
+
547
+ function d3_layout_forceLinkDistance(link) {
548
+ return 20;
549
+ }
550
+
551
+ function d3_layout_forceLinkStrength(link) {
552
+ return 1;
553
+ }
554
+ d3.layout.partition = function() {
555
+ var hierarchy = d3.layout.hierarchy(),
556
+ size = [1, 1]; // width, height
557
+
558
+ function position(node, x, dx, dy) {
559
+ var children = node.children;
560
+ node.x = x;
561
+ node.y = node.depth * dy;
562
+ node.dx = dx;
563
+ node.dy = dy;
564
+ if (children && (n = children.length)) {
565
+ var i = -1,
566
+ n,
567
+ c,
568
+ d;
569
+ dx = node.value ? dx / node.value : 0;
570
+ while (++i < n) {
571
+ position(c = children[i], x, d = c.value * dx, dy);
572
+ x += d;
573
+ }
574
+ }
575
+ }
576
+
577
+ function depth(node) {
578
+ var children = node.children,
579
+ d = 0;
580
+ if (children && (n = children.length)) {
581
+ var i = -1,
582
+ n;
583
+ while (++i < n) d = Math.max(d, depth(children[i]));
584
+ }
585
+ return 1 + d;
586
+ }
587
+
588
+ function partition(d, i) {
589
+ var nodes = hierarchy.call(this, d, i);
590
+ position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));
591
+ return nodes;
592
+ }
593
+
594
+ partition.size = function(x) {
595
+ if (!arguments.length) return size;
596
+ size = x;
597
+ return partition;
598
+ };
599
+
600
+ return d3_layout_hierarchyRebind(partition, hierarchy);
601
+ };
602
+ d3.layout.pie = function() {
603
+ var value = Number,
604
+ sort = d3_layout_pieSortByValue,
605
+ startAngle = 0,
606
+ endAngle = 2 * Math.PI;
607
+
608
+ function pie(data, i) {
609
+
610
+ // Compute the numeric values for each data element.
611
+ var values = data.map(function(d, i) { return +value.call(pie, d, i); });
612
+
613
+ // Compute the start angle.
614
+ var a = +(typeof startAngle === "function"
615
+ ? startAngle.apply(this, arguments)
616
+ : startAngle);
617
+
618
+ // Compute the angular scale factor: from value to radians.
619
+ var k = ((typeof endAngle === "function"
620
+ ? endAngle.apply(this, arguments)
621
+ : endAngle) - startAngle)
622
+ / d3.sum(values);
623
+
624
+ // Optionally sort the data.
625
+ var index = d3.range(data.length);
626
+ if (sort != null) index.sort(sort === d3_layout_pieSortByValue
627
+ ? function(i, j) { return values[j] - values[i]; }
628
+ : function(i, j) { return sort(data[i], data[j]); });
629
+
630
+ // Compute the arcs!
631
+ var arcs = index.map(function(i) {
632
+ return {
633
+ data: data[i],
634
+ value: d = values[i],
635
+ startAngle: a,
636
+ endAngle: a += d * k
637
+ };
638
+ });
639
+
640
+ // Return the arcs in the original data's order.
641
+ return data.map(function(d, i) {
642
+ return arcs[index[i]];
643
+ });
644
+ }
645
+
646
+ /**
647
+ * Specifies the value function *x*, which returns a nonnegative numeric value
648
+ * for each datum. The default value function is `Number`. The value function
649
+ * is passed two arguments: the current datum and the current index.
650
+ */
651
+ pie.value = function(x) {
652
+ if (!arguments.length) return value;
653
+ value = x;
654
+ return pie;
655
+ };
656
+
657
+ /**
658
+ * Specifies a sort comparison operator *x*. The comparator is passed two data
659
+ * elements from the data array, a and b; it returns a negative value if a is
660
+ * less than b, a positive value if a is greater than b, and zero if a equals
661
+ * b.
662
+ */
663
+ pie.sort = function(x) {
664
+ if (!arguments.length) return sort;
665
+ sort = x;
666
+ return pie;
667
+ };
668
+
669
+ /**
670
+ * Specifies the overall start angle of the pie chart. Defaults to 0. The
671
+ * start angle can be specified either as a constant or as a function; in the
672
+ * case of a function, it is evaluated once per array (as opposed to per
673
+ * element).
674
+ */
675
+ pie.startAngle = function(x) {
676
+ if (!arguments.length) return startAngle;
677
+ startAngle = x;
678
+ return pie;
679
+ };
680
+
681
+ /**
682
+ * Specifies the overall end angle of the pie chart. Defaults to 2π. The
683
+ * end angle can be specified either as a constant or as a function; in the
684
+ * case of a function, it is evaluated once per array (as opposed to per
685
+ * element).
686
+ */
687
+ pie.endAngle = function(x) {
688
+ if (!arguments.length) return endAngle;
689
+ endAngle = x;
690
+ return pie;
691
+ };
692
+
693
+ return pie;
694
+ };
695
+
696
+ var d3_layout_pieSortByValue = {};
697
+ // data is two-dimensional array of x,y; we populate y0
698
+ d3.layout.stack = function() {
699
+ var values = Object,
700
+ order = d3_layout_stackOrders["default"],
701
+ offset = d3_layout_stackOffsets["zero"],
702
+ out = d3_layout_stackOut,
703
+ x = d3_layout_stackX,
704
+ y = d3_layout_stackY;
705
+
706
+ function stack(data, index) {
707
+
708
+ // Convert series to canonical two-dimensional representation.
709
+ var series = data.map(function(d, i) {
710
+ return values.call(stack, d, i);
711
+ });
712
+
713
+ // Convert each series to canonical [[x,y]] representation.
714
+ var points = series.map(function(d, i) {
715
+ return d.map(function(v, i) {
716
+ return [x.call(stack, v, i), y.call(stack, v, i)];
717
+ });
718
+ });
719
+
720
+ // Compute the order of series, and permute them.
721
+ var orders = order.call(stack, points, index);
722
+ series = d3.permute(series, orders);
723
+ points = d3.permute(points, orders);
724
+
725
+ // Compute the baseline…
726
+ var offsets = offset.call(stack, points, index);
727
+
728
+ // And propagate it to other series.
729
+ var n = series.length,
730
+ m = series[0].length,
731
+ i,
732
+ j,
733
+ o;
734
+ for (j = 0; j < m; ++j) {
735
+ out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);
736
+ for (i = 1; i < n; ++i) {
737
+ out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);
738
+ }
739
+ }
740
+
741
+ return data;
742
+ }
743
+
744
+ stack.values = function(x) {
745
+ if (!arguments.length) return values;
746
+ values = x;
747
+ return stack;
748
+ };
749
+
750
+ stack.order = function(x) {
751
+ if (!arguments.length) return order;
752
+ order = typeof x === "function" ? x : d3_layout_stackOrders[x];
753
+ return stack;
754
+ };
755
+
756
+ stack.offset = function(x) {
757
+ if (!arguments.length) return offset;
758
+ offset = typeof x === "function" ? x : d3_layout_stackOffsets[x];
759
+ return stack;
760
+ };
761
+
762
+ stack.x = function(z) {
763
+ if (!arguments.length) return x;
764
+ x = z;
765
+ return stack;
766
+ };
767
+
768
+ stack.y = function(z) {
769
+ if (!arguments.length) return y;
770
+ y = z;
771
+ return stack;
772
+ };
773
+
774
+ stack.out = function(z) {
775
+ if (!arguments.length) return out;
776
+ out = z;
777
+ return stack;
778
+ };
779
+
780
+ return stack;
781
+ }
782
+
783
+ function d3_layout_stackX(d) {
784
+ return d.x;
785
+ }
786
+
787
+ function d3_layout_stackY(d) {
788
+ return d.y;
789
+ }
790
+
791
+ function d3_layout_stackOut(d, y0, y) {
792
+ d.y0 = y0;
793
+ d.y = y;
794
+ }
795
+
796
+ var d3_layout_stackOrders = {
797
+
798
+ "inside-out": function(data) {
799
+ var n = data.length,
800
+ i,
801
+ j,
802
+ max = data.map(d3_layout_stackMaxIndex),
803
+ sums = data.map(d3_layout_stackReduceSum),
804
+ index = d3.range(n).sort(function(a, b) { return max[a] - max[b]; }),
805
+ top = 0,
806
+ bottom = 0,
807
+ tops = [],
808
+ bottoms = [];
809
+ for (i = 0; i < n; ++i) {
810
+ j = index[i];
811
+ if (top < bottom) {
812
+ top += sums[j];
813
+ tops.push(j);
814
+ } else {
815
+ bottom += sums[j];
816
+ bottoms.push(j);
817
+ }
818
+ }
819
+ return bottoms.reverse().concat(tops);
820
+ },
821
+
822
+ "reverse": function(data) {
823
+ return d3.range(data.length).reverse();
824
+ },
825
+
826
+ "default": function(data) {
827
+ return d3.range(data.length);
828
+ }
829
+
830
+ };
831
+
832
+ var d3_layout_stackOffsets = {
833
+
834
+ "silhouette": function(data) {
835
+ var n = data.length,
836
+ m = data[0].length,
837
+ sums = [],
838
+ max = 0,
839
+ i,
840
+ j,
841
+ o,
842
+ y0 = [];
843
+ for (j = 0; j < m; ++j) {
844
+ for (i = 0, o = 0; i < n; i++) o += data[i][j][1];
845
+ if (o > max) max = o;
846
+ sums.push(o);
847
+ }
848
+ for (j = 0; j < m; ++j) {
849
+ y0[j] = (max - sums[j]) / 2;
850
+ }
851
+ return y0;
852
+ },
853
+
854
+ "wiggle": function(data) {
855
+ var n = data.length,
856
+ x = data[0],
857
+ m = x.length,
858
+ max = 0,
859
+ i,
860
+ j,
861
+ k,
862
+ s1,
863
+ s2,
864
+ s3,
865
+ dx,
866
+ o,
867
+ o0,
868
+ y0 = [];
869
+ y0[0] = o = o0 = 0;
870
+ for (j = 1; j < m; ++j) {
871
+ for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];
872
+ for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {
873
+ for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {
874
+ s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;
875
+ }
876
+ s2 += s3 * data[i][j][1];
877
+ }
878
+ y0[j] = o -= s1 ? s2 / s1 * dx : 0;
879
+ if (o < o0) o0 = o;
880
+ }
881
+ for (j = 0; j < m; ++j) y0[j] -= o0;
882
+ return y0;
883
+ },
884
+
885
+ "expand": function(data) {
886
+ var n = data.length,
887
+ m = data[0].length,
888
+ k = 1 / n,
889
+ i,
890
+ j,
891
+ o,
892
+ y0 = [];
893
+ for (j = 0; j < m; ++j) {
894
+ for (i = 0, o = 0; i < n; i++) o += data[i][j][1];
895
+ if (o) for (i = 0; i < n; i++) data[i][j][1] /= o;
896
+ else for (i = 0; i < n; i++) data[i][j][1] = k;
897
+ }
898
+ for (j = 0; j < m; ++j) y0[j] = 0;
899
+ return y0;
900
+ },
901
+
902
+ "zero": function(data) {
903
+ var j = -1,
904
+ m = data[0].length,
905
+ y0 = [];
906
+ while (++j < m) y0[j] = 0;
907
+ return y0;
908
+ }
909
+
910
+ };
911
+
912
+ function d3_layout_stackMaxIndex(array) {
913
+ var i = 1,
914
+ j = 0,
915
+ v = array[0][1],
916
+ k,
917
+ n = array.length;
918
+ for (; i < n; ++i) {
919
+ if ((k = array[i][1]) > v) {
920
+ j = i;
921
+ v = k;
922
+ }
923
+ }
924
+ return j;
925
+ }
926
+
927
+ function d3_layout_stackReduceSum(d) {
928
+ return d.reduce(d3_layout_stackSum, 0);
929
+ }
930
+
931
+ function d3_layout_stackSum(p, d) {
932
+ return p + d[1];
933
+ }
934
+ d3.layout.histogram = function() {
935
+ var frequency = true,
936
+ valuer = Number,
937
+ ranger = d3_layout_histogramRange,
938
+ binner = d3_layout_histogramBinSturges;
939
+
940
+ function histogram(data, i) {
941
+ var bins = [],
942
+ values = data.map(valuer, this),
943
+ range = ranger.call(this, values, i),
944
+ thresholds = binner.call(this, range, values, i),
945
+ bin,
946
+ i = -1,
947
+ n = values.length,
948
+ m = thresholds.length - 1,
949
+ k = frequency ? 1 : 1 / n,
950
+ x;
951
+
952
+ // Initialize the bins.
953
+ while (++i < m) {
954
+ bin = bins[i] = [];
955
+ bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);
956
+ bin.y = 0;
957
+ }
958
+
959
+ // Fill the bins, ignoring values outside the range.
960
+ i = -1; while(++i < n) {
961
+ x = values[i];
962
+ if ((x >= range[0]) && (x <= range[1])) {
963
+ bin = bins[d3.bisect(thresholds, x, 1, m) - 1];
964
+ bin.y += k;
965
+ bin.push(data[i]);
966
+ }
967
+ }
968
+
969
+ return bins;
970
+ }
971
+
972
+ // Specifies how to extract a value from the associated data. The default
973
+ // value function is `Number`, which is equivalent to the identity function.
974
+ histogram.value = function(x) {
975
+ if (!arguments.length) return valuer;
976
+ valuer = x;
977
+ return histogram;
978
+ };
979
+
980
+ // Specifies the range of the histogram. Values outside the specified range
981
+ // will be ignored. The argument `x` may be specified either as a two-element
982
+ // array representing the minimum and maximum value of the range, or as a
983
+ // function that returns the range given the array of values and the current
984
+ // index `i`. The default range is the extent (minimum and maximum) of the
985
+ // values.
986
+ histogram.range = function(x) {
987
+ if (!arguments.length) return ranger;
988
+ ranger = d3.functor(x);
989
+ return histogram;
990
+ };
991
+
992
+ // Specifies how to bin values in the histogram. The argument `x` may be
993
+ // specified as a number, in which case the range of values will be split
994
+ // uniformly into the given number of bins. Or, `x` may be an array of
995
+ // threshold values, defining the bins; the specified array must contain the
996
+ // rightmost (upper) value, thus specifying n + 1 values for n bins. Or, `x`
997
+ // may be a function which is evaluated, being passed the range, the array of
998
+ // values, and the current index `i`, returning an array of thresholds. The
999
+ // default bin function will divide the values into uniform bins using
1000
+ // Sturges' formula.
1001
+ histogram.bins = function(x) {
1002
+ if (!arguments.length) return binner;
1003
+ binner = typeof x === "number"
1004
+ ? function(range) { return d3_layout_histogramBinFixed(range, x); }
1005
+ : d3.functor(x);
1006
+ return histogram;
1007
+ };
1008
+
1009
+ // Specifies whether the histogram's `y` value is a count (frequency) or a
1010
+ // probability (density). The default value is true.
1011
+ histogram.frequency = function(x) {
1012
+ if (!arguments.length) return frequency;
1013
+ frequency = !!x;
1014
+ return histogram;
1015
+ };
1016
+
1017
+ return histogram;
1018
+ };
1019
+
1020
+ function d3_layout_histogramBinSturges(range, values) {
1021
+ return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));
1022
+ }
1023
+
1024
+ function d3_layout_histogramBinFixed(range, n) {
1025
+ var x = -1,
1026
+ b = +range[0],
1027
+ m = (range[1] - b) / n,
1028
+ f = [];
1029
+ while (++x <= n) f[x] = m * x + b;
1030
+ return f;
1031
+ }
1032
+
1033
+ function d3_layout_histogramRange(values) {
1034
+ return [d3.min(values), d3.max(values)];
1035
+ }
1036
+ d3.layout.hierarchy = function() {
1037
+ var sort = d3_layout_hierarchySort,
1038
+ children = d3_layout_hierarchyChildren,
1039
+ value = d3_layout_hierarchyValue;
1040
+
1041
+ // Recursively compute the node depth and value.
1042
+ // Also converts the data representation into a standard hierarchy structure.
1043
+ function recurse(data, depth, nodes) {
1044
+ var childs = children.call(hierarchy, data, depth),
1045
+ node = d3_layout_hierarchyInline ? data : {data: data};
1046
+ node.depth = depth;
1047
+ nodes.push(node);
1048
+ if (childs && (n = childs.length)) {
1049
+ var i = -1,
1050
+ n,
1051
+ c = node.children = [],
1052
+ v = 0,
1053
+ j = depth + 1;
1054
+ while (++i < n) {
1055
+ d = recurse(childs[i], j, nodes);
1056
+ d.parent = node;
1057
+ c.push(d);
1058
+ v += d.value;
1059
+ }
1060
+ if (sort) c.sort(sort);
1061
+ if (value) node.value = v;
1062
+ } else if (value) {
1063
+ node.value = +value.call(hierarchy, data, depth) || 0;
1064
+ }
1065
+ return node;
1066
+ }
1067
+
1068
+ // Recursively re-evaluates the node value.
1069
+ function revalue(node, depth) {
1070
+ var children = node.children,
1071
+ v = 0;
1072
+ if (children && (n = children.length)) {
1073
+ var i = -1,
1074
+ n,
1075
+ j = depth + 1;
1076
+ while (++i < n) v += revalue(children[i], j);
1077
+ } else if (value) {
1078
+ v = +value.call(hierarchy, d3_layout_hierarchyInline ? node : node.data, depth) || 0;
1079
+ }
1080
+ if (value) node.value = v;
1081
+ return v;
1082
+ }
1083
+
1084
+ function hierarchy(d) {
1085
+ var nodes = [];
1086
+ recurse(d, 0, nodes);
1087
+ return nodes;
1088
+ }
1089
+
1090
+ hierarchy.sort = function(x) {
1091
+ if (!arguments.length) return sort;
1092
+ sort = x;
1093
+ return hierarchy;
1094
+ };
1095
+
1096
+ hierarchy.children = function(x) {
1097
+ if (!arguments.length) return children;
1098
+ children = x;
1099
+ return hierarchy;
1100
+ };
1101
+
1102
+ hierarchy.value = function(x) {
1103
+ if (!arguments.length) return value;
1104
+ value = x;
1105
+ return hierarchy;
1106
+ };
1107
+
1108
+ // Re-evaluates the `value` property for the specified hierarchy.
1109
+ hierarchy.revalue = function(root) {
1110
+ revalue(root, 0);
1111
+ return root;
1112
+ };
1113
+
1114
+ return hierarchy;
1115
+ };
1116
+
1117
+ // A method assignment helper for hierarchy subclasses.
1118
+ function d3_layout_hierarchyRebind(object, hierarchy) {
1119
+ d3.rebind(object, hierarchy, "sort", "children", "value");
1120
+
1121
+ // Add an alias for links, for convenience.
1122
+ object.links = d3_layout_hierarchyLinks;
1123
+
1124
+ // If the new API is used, enabling inlining.
1125
+ object.nodes = function(d) {
1126
+ d3_layout_hierarchyInline = true;
1127
+ return (object.nodes = object)(d);
1128
+ };
1129
+
1130
+ return object;
1131
+ }
1132
+
1133
+ function d3_layout_hierarchyChildren(d) {
1134
+ return d.children;
1135
+ }
1136
+
1137
+ function d3_layout_hierarchyValue(d) {
1138
+ return d.value;
1139
+ }
1140
+
1141
+ function d3_layout_hierarchySort(a, b) {
1142
+ return b.value - a.value;
1143
+ }
1144
+
1145
+ // Returns an array source+target objects for the specified nodes.
1146
+ function d3_layout_hierarchyLinks(nodes) {
1147
+ return d3.merge(nodes.map(function(parent) {
1148
+ return (parent.children || []).map(function(child) {
1149
+ return {source: parent, target: child};
1150
+ });
1151
+ }));
1152
+ }
1153
+
1154
+ // For backwards-compatibility, don't enable inlining by default.
1155
+ var d3_layout_hierarchyInline = false;
1156
+ d3.layout.pack = function() {
1157
+ var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort),
1158
+ size = [1, 1];
1159
+
1160
+ function pack(d, i) {
1161
+ var nodes = hierarchy.call(this, d, i),
1162
+ root = nodes[0];
1163
+
1164
+ // Recursively compute the layout.
1165
+ root.x = 0;
1166
+ root.y = 0;
1167
+ d3_layout_packTree(root);
1168
+
1169
+ // Scale the layout to fit the requested size.
1170
+ var w = size[0],
1171
+ h = size[1],
1172
+ k = 1 / Math.max(2 * root.r / w, 2 * root.r / h);
1173
+ d3_layout_packTransform(root, w / 2, h / 2, k);
1174
+
1175
+ return nodes;
1176
+ }
1177
+
1178
+ pack.size = function(x) {
1179
+ if (!arguments.length) return size;
1180
+ size = x;
1181
+ return pack;
1182
+ };
1183
+
1184
+ return d3_layout_hierarchyRebind(pack, hierarchy);
1185
+ };
1186
+
1187
+ function d3_layout_packSort(a, b) {
1188
+ return a.value - b.value;
1189
+ }
1190
+
1191
+ function d3_layout_packInsert(a, b) {
1192
+ var c = a._pack_next;
1193
+ a._pack_next = b;
1194
+ b._pack_prev = a;
1195
+ b._pack_next = c;
1196
+ c._pack_prev = b;
1197
+ }
1198
+
1199
+ function d3_layout_packSplice(a, b) {
1200
+ a._pack_next = b;
1201
+ b._pack_prev = a;
1202
+ }
1203
+
1204
+ function d3_layout_packIntersects(a, b) {
1205
+ var dx = b.x - a.x,
1206
+ dy = b.y - a.y,
1207
+ dr = a.r + b.r;
1208
+ return (dr * dr - dx * dx - dy * dy) > .001; // within epsilon
1209
+ }
1210
+
1211
+ function d3_layout_packCircle(nodes) {
1212
+ var xMin = Infinity,
1213
+ xMax = -Infinity,
1214
+ yMin = Infinity,
1215
+ yMax = -Infinity,
1216
+ n = nodes.length,
1217
+ a, b, c, j, k;
1218
+
1219
+ function bound(node) {
1220
+ xMin = Math.min(node.x - node.r, xMin);
1221
+ xMax = Math.max(node.x + node.r, xMax);
1222
+ yMin = Math.min(node.y - node.r, yMin);
1223
+ yMax = Math.max(node.y + node.r, yMax);
1224
+ }
1225
+
1226
+ // Create node links.
1227
+ nodes.forEach(d3_layout_packLink);
1228
+
1229
+ // Create first node.
1230
+ a = nodes[0];
1231
+ a.x = -a.r;
1232
+ a.y = 0;
1233
+ bound(a);
1234
+
1235
+ // Create second node.
1236
+ if (n > 1) {
1237
+ b = nodes[1];
1238
+ b.x = b.r;
1239
+ b.y = 0;
1240
+ bound(b);
1241
+
1242
+ // Create third node and build chain.
1243
+ if (n > 2) {
1244
+ c = nodes[2];
1245
+ d3_layout_packPlace(a, b, c);
1246
+ bound(c);
1247
+ d3_layout_packInsert(a, c);
1248
+ a._pack_prev = c;
1249
+ d3_layout_packInsert(c, b);
1250
+ b = a._pack_next;
1251
+
1252
+ // Now iterate through the rest.
1253
+ for (var i = 3; i < n; i++) {
1254
+ d3_layout_packPlace(a, b, c = nodes[i]);
1255
+
1256
+ // Search for the closest intersection.
1257
+ var isect = 0, s1 = 1, s2 = 1;
1258
+ for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {
1259
+ if (d3_layout_packIntersects(j, c)) {
1260
+ isect = 1;
1261
+ break;
1262
+ }
1263
+ }
1264
+ if (isect == 1) {
1265
+ for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {
1266
+ if (d3_layout_packIntersects(k, c)) {
1267
+ if (s2 < s1) {
1268
+ isect = -1;
1269
+ j = k;
1270
+ }
1271
+ break;
1272
+ }
1273
+ }
1274
+ }
1275
+
1276
+ // Update node chain.
1277
+ if (isect == 0) {
1278
+ d3_layout_packInsert(a, c);
1279
+ b = c;
1280
+ bound(c);
1281
+ } else if (isect > 0) {
1282
+ d3_layout_packSplice(a, j);
1283
+ b = j;
1284
+ i--;
1285
+ } else { // isect < 0
1286
+ d3_layout_packSplice(j, b);
1287
+ a = j;
1288
+ i--;
1289
+ }
1290
+ }
1291
+ }
1292
+ }
1293
+
1294
+ // Re-center the circles and return the encompassing radius.
1295
+ var cx = (xMin + xMax) / 2,
1296
+ cy = (yMin + yMax) / 2,
1297
+ cr = 0;
1298
+ for (var i = 0; i < n; i++) {
1299
+ var node = nodes[i];
1300
+ node.x -= cx;
1301
+ node.y -= cy;
1302
+ cr = Math.max(cr, node.r + Math.sqrt(node.x * node.x + node.y * node.y));
1303
+ }
1304
+
1305
+ // Remove node links.
1306
+ nodes.forEach(d3_layout_packUnlink);
1307
+
1308
+ return cr;
1309
+ }
1310
+
1311
+ function d3_layout_packLink(node) {
1312
+ node._pack_next = node._pack_prev = node;
1313
+ }
1314
+
1315
+ function d3_layout_packUnlink(node) {
1316
+ delete node._pack_next;
1317
+ delete node._pack_prev;
1318
+ }
1319
+
1320
+ function d3_layout_packTree(node) {
1321
+ var children = node.children;
1322
+ if (children && children.length) {
1323
+ children.forEach(d3_layout_packTree);
1324
+ node.r = d3_layout_packCircle(children);
1325
+ } else {
1326
+ node.r = Math.sqrt(node.value);
1327
+ }
1328
+ }
1329
+
1330
+ function d3_layout_packTransform(node, x, y, k) {
1331
+ var children = node.children;
1332
+ node.x = (x += k * node.x);
1333
+ node.y = (y += k * node.y);
1334
+ node.r *= k;
1335
+ if (children) {
1336
+ var i = -1, n = children.length;
1337
+ while (++i < n) d3_layout_packTransform(children[i], x, y, k);
1338
+ }
1339
+ }
1340
+
1341
+ function d3_layout_packPlace(a, b, c) {
1342
+ var db = a.r + c.r,
1343
+ dx = b.x - a.x,
1344
+ dy = b.y - a.y;
1345
+ if (db && (dx || dy)) {
1346
+ var da = b.r + c.r,
1347
+ dc = Math.sqrt(dx * dx + dy * dy),
1348
+ cos = Math.max(-1, Math.min(1, (db * db + dc * dc - da * da) / (2 * db * dc))),
1349
+ theta = Math.acos(cos),
1350
+ x = cos * (db /= dc),
1351
+ y = Math.sin(theta) * db;
1352
+ c.x = a.x + x * dx + y * dy;
1353
+ c.y = a.y + x * dy - y * dx;
1354
+ } else {
1355
+ c.x = a.x + db;
1356
+ c.y = a.y;
1357
+ }
1358
+ }
1359
+ // Implements a hierarchical layout using the cluster (or dendogram) algorithm.
1360
+ d3.layout.cluster = function() {
1361
+ var hierarchy = d3.layout.hierarchy().sort(null).value(null),
1362
+ separation = d3_layout_treeSeparation,
1363
+ size = [1, 1]; // width, height
1364
+
1365
+ function cluster(d, i) {
1366
+ var nodes = hierarchy.call(this, d, i),
1367
+ root = nodes[0],
1368
+ previousNode,
1369
+ x = 0,
1370
+ kx,
1371
+ ky;
1372
+
1373
+ // First walk, computing the initial x & y values.
1374
+ d3_layout_treeVisitAfter(root, function(node) {
1375
+ var children = node.children;
1376
+ if (children && children.length) {
1377
+ node.x = d3_layout_clusterX(children);
1378
+ node.y = d3_layout_clusterY(children);
1379
+ } else {
1380
+ node.x = previousNode ? x += separation(node, previousNode) : 0;
1381
+ node.y = 0;
1382
+ previousNode = node;
1383
+ }
1384
+ });
1385
+
1386
+ // Compute the left-most, right-most, and depth-most nodes for extents.
1387
+ var left = d3_layout_clusterLeft(root),
1388
+ right = d3_layout_clusterRight(root),
1389
+ x0 = left.x - separation(left, right) / 2,
1390
+ x1 = right.x + separation(right, left) / 2;
1391
+
1392
+ // Second walk, normalizing x & y to the desired size.
1393
+ d3_layout_treeVisitAfter(root, function(node) {
1394
+ node.x = (node.x - x0) / (x1 - x0) * size[0];
1395
+ node.y = (1 - node.y / root.y) * size[1];
1396
+ });
1397
+
1398
+ return nodes;
1399
+ }
1400
+
1401
+ cluster.separation = function(x) {
1402
+ if (!arguments.length) return separation;
1403
+ separation = x;
1404
+ return cluster;
1405
+ };
1406
+
1407
+ cluster.size = function(x) {
1408
+ if (!arguments.length) return size;
1409
+ size = x;
1410
+ return cluster;
1411
+ };
1412
+
1413
+ return d3_layout_hierarchyRebind(cluster, hierarchy);
1414
+ };
1415
+
1416
+ function d3_layout_clusterY(children) {
1417
+ return 1 + d3.max(children, function(child) {
1418
+ return child.y;
1419
+ });
1420
+ }
1421
+
1422
+ function d3_layout_clusterX(children) {
1423
+ return children.reduce(function(x, child) {
1424
+ return x + child.x;
1425
+ }, 0) / children.length;
1426
+ }
1427
+
1428
+ function d3_layout_clusterLeft(node) {
1429
+ var children = node.children;
1430
+ return children && children.length ? d3_layout_clusterLeft(children[0]) : node;
1431
+ }
1432
+
1433
+ function d3_layout_clusterRight(node) {
1434
+ var children = node.children, n;
1435
+ return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;
1436
+ }
1437
+ // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
1438
+ d3.layout.tree = function() {
1439
+ var hierarchy = d3.layout.hierarchy().sort(null).value(null),
1440
+ separation = d3_layout_treeSeparation,
1441
+ size = [1, 1]; // width, height
1442
+
1443
+ function tree(d, i) {
1444
+ var nodes = hierarchy.call(this, d, i),
1445
+ root = nodes[0];
1446
+
1447
+ function firstWalk(node, previousSibling) {
1448
+ var children = node.children,
1449
+ layout = node._tree;
1450
+ if (children && (n = children.length)) {
1451
+ var n,
1452
+ firstChild = children[0],
1453
+ previousChild,
1454
+ ancestor = firstChild,
1455
+ child,
1456
+ i = -1;
1457
+ while (++i < n) {
1458
+ child = children[i];
1459
+ firstWalk(child, previousChild);
1460
+ ancestor = apportion(child, previousChild, ancestor);
1461
+ previousChild = child;
1462
+ }
1463
+ d3_layout_treeShift(node);
1464
+ var midpoint = .5 * (firstChild._tree.prelim + child._tree.prelim);
1465
+ if (previousSibling) {
1466
+ layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling);
1467
+ layout.mod = layout.prelim - midpoint;
1468
+ } else {
1469
+ layout.prelim = midpoint;
1470
+ }
1471
+ } else {
1472
+ if (previousSibling) {
1473
+ layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling);
1474
+ }
1475
+ }
1476
+ }
1477
+
1478
+ function secondWalk(node, x) {
1479
+ node.x = node._tree.prelim + x;
1480
+ var children = node.children;
1481
+ if (children && (n = children.length)) {
1482
+ var i = -1,
1483
+ n;
1484
+ x += node._tree.mod;
1485
+ while (++i < n) {
1486
+ secondWalk(children[i], x);
1487
+ }
1488
+ }
1489
+ }
1490
+
1491
+ function apportion(node, previousSibling, ancestor) {
1492
+ if (previousSibling) {
1493
+ var vip = node,
1494
+ vop = node,
1495
+ vim = previousSibling,
1496
+ vom = node.parent.children[0],
1497
+ sip = vip._tree.mod,
1498
+ sop = vop._tree.mod,
1499
+ sim = vim._tree.mod,
1500
+ som = vom._tree.mod,
1501
+ shift;
1502
+ while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {
1503
+ vom = d3_layout_treeLeft(vom);
1504
+ vop = d3_layout_treeRight(vop);
1505
+ vop._tree.ancestor = node;
1506
+ shift = vim._tree.prelim + sim - vip._tree.prelim - sip + separation(vim, vip);
1507
+ if (shift > 0) {
1508
+ d3_layout_treeMove(d3_layout_treeAncestor(vim, node, ancestor), node, shift);
1509
+ sip += shift;
1510
+ sop += shift;
1511
+ }
1512
+ sim += vim._tree.mod;
1513
+ sip += vip._tree.mod;
1514
+ som += vom._tree.mod;
1515
+ sop += vop._tree.mod;
1516
+ }
1517
+ if (vim && !d3_layout_treeRight(vop)) {
1518
+ vop._tree.thread = vim;
1519
+ vop._tree.mod += sim - sop;
1520
+ }
1521
+ if (vip && !d3_layout_treeLeft(vom)) {
1522
+ vom._tree.thread = vip;
1523
+ vom._tree.mod += sip - som;
1524
+ ancestor = node;
1525
+ }
1526
+ }
1527
+ return ancestor;
1528
+ }
1529
+
1530
+ // Initialize temporary layout variables.
1531
+ d3_layout_treeVisitAfter(root, function(node, previousSibling) {
1532
+ node._tree = {
1533
+ ancestor: node,
1534
+ prelim: 0,
1535
+ mod: 0,
1536
+ change: 0,
1537
+ shift: 0,
1538
+ number: previousSibling ? previousSibling._tree.number + 1 : 0
1539
+ };
1540
+ });
1541
+
1542
+ // Compute the layout using Buchheim et al.'s algorithm.
1543
+ firstWalk(root);
1544
+ secondWalk(root, -root._tree.prelim);
1545
+
1546
+ // Compute the left-most, right-most, and depth-most nodes for extents.
1547
+ var left = d3_layout_treeSearch(root, d3_layout_treeLeftmost),
1548
+ right = d3_layout_treeSearch(root, d3_layout_treeRightmost),
1549
+ deep = d3_layout_treeSearch(root, d3_layout_treeDeepest),
1550
+ x0 = left.x - separation(left, right) / 2,
1551
+ x1 = right.x + separation(right, left) / 2,
1552
+ y1 = deep.depth || 1;
1553
+
1554
+ // Clear temporary layout variables; transform x and y.
1555
+ d3_layout_treeVisitAfter(root, function(node) {
1556
+ node.x = (node.x - x0) / (x1 - x0) * size[0];
1557
+ node.y = node.depth / y1 * size[1];
1558
+ delete node._tree;
1559
+ });
1560
+
1561
+ return nodes;
1562
+ }
1563
+
1564
+ tree.separation = function(x) {
1565
+ if (!arguments.length) return separation;
1566
+ separation = x;
1567
+ return tree;
1568
+ };
1569
+
1570
+ tree.size = function(x) {
1571
+ if (!arguments.length) return size;
1572
+ size = x;
1573
+ return tree;
1574
+ };
1575
+
1576
+ return d3_layout_hierarchyRebind(tree, hierarchy);
1577
+ };
1578
+
1579
+ function d3_layout_treeSeparation(a, b) {
1580
+ return a.parent == b.parent ? 1 : 2;
1581
+ }
1582
+
1583
+ // function d3_layout_treeSeparationRadial(a, b) {
1584
+ // return (a.parent == b.parent ? 1 : 2) / a.depth;
1585
+ // }
1586
+
1587
+ function d3_layout_treeLeft(node) {
1588
+ var children = node.children;
1589
+ return children && children.length ? children[0] : node._tree.thread;
1590
+ }
1591
+
1592
+ function d3_layout_treeRight(node) {
1593
+ var children = node.children,
1594
+ n;
1595
+ return children && (n = children.length) ? children[n - 1] : node._tree.thread;
1596
+ }
1597
+
1598
+ function d3_layout_treeSearch(node, compare) {
1599
+ var children = node.children;
1600
+ if (children && (n = children.length)) {
1601
+ var child,
1602
+ n,
1603
+ i = -1;
1604
+ while (++i < n) {
1605
+ if (compare(child = d3_layout_treeSearch(children[i], compare), node) > 0) {
1606
+ node = child;
1607
+ }
1608
+ }
1609
+ }
1610
+ return node;
1611
+ }
1612
+
1613
+ function d3_layout_treeRightmost(a, b) {
1614
+ return a.x - b.x;
1615
+ }
1616
+
1617
+ function d3_layout_treeLeftmost(a, b) {
1618
+ return b.x - a.x;
1619
+ }
1620
+
1621
+ function d3_layout_treeDeepest(a, b) {
1622
+ return a.depth - b.depth;
1623
+ }
1624
+
1625
+ function d3_layout_treeVisitAfter(node, callback) {
1626
+ function visit(node, previousSibling) {
1627
+ var children = node.children;
1628
+ if (children && (n = children.length)) {
1629
+ var child,
1630
+ previousChild = null,
1631
+ i = -1,
1632
+ n;
1633
+ while (++i < n) {
1634
+ child = children[i];
1635
+ visit(child, previousChild);
1636
+ previousChild = child;
1637
+ }
1638
+ }
1639
+ callback(node, previousSibling);
1640
+ }
1641
+ visit(node, null);
1642
+ }
1643
+
1644
+ function d3_layout_treeShift(node) {
1645
+ var shift = 0,
1646
+ change = 0,
1647
+ children = node.children,
1648
+ i = children.length,
1649
+ child;
1650
+ while (--i >= 0) {
1651
+ child = children[i]._tree;
1652
+ child.prelim += shift;
1653
+ child.mod += shift;
1654
+ shift += child.shift + (change += child.change);
1655
+ }
1656
+ }
1657
+
1658
+ function d3_layout_treeMove(ancestor, node, shift) {
1659
+ ancestor = ancestor._tree;
1660
+ node = node._tree;
1661
+ var change = shift / (node.number - ancestor.number);
1662
+ ancestor.change += change;
1663
+ node.change -= change;
1664
+ node.shift += shift;
1665
+ node.prelim += shift;
1666
+ node.mod += shift;
1667
+ }
1668
+
1669
+ function d3_layout_treeAncestor(vim, node, ancestor) {
1670
+ return vim._tree.ancestor.parent == node.parent
1671
+ ? vim._tree.ancestor
1672
+ : ancestor;
1673
+ }
1674
+ // Squarified Treemaps by Mark Bruls, Kees Huizing, and Jarke J. van Wijk
1675
+ // Modified to support a target aspect ratio by Jeff Heer
1676
+ d3.layout.treemap = function() {
1677
+ var hierarchy = d3.layout.hierarchy(),
1678
+ round = Math.round,
1679
+ size = [1, 1], // width, height
1680
+ padding = null,
1681
+ pad = d3_layout_treemapPadNull,
1682
+ sticky = false,
1683
+ stickies,
1684
+ ratio = 0.5 * (1 + Math.sqrt(5)); // golden ratio
1685
+
1686
+ // Compute the area for each child based on value & scale.
1687
+ function scale(children, k) {
1688
+ var i = -1,
1689
+ n = children.length,
1690
+ child,
1691
+ area;
1692
+ while (++i < n) {
1693
+ area = (child = children[i]).value * (k < 0 ? 0 : k);
1694
+ child.area = isNaN(area) || area <= 0 ? 0 : area;
1695
+ }
1696
+ }
1697
+
1698
+ // Recursively arranges the specified node's children into squarified rows.
1699
+ function squarify(node) {
1700
+ var children = node.children;
1701
+ if (children && children.length) {
1702
+ var rect = pad(node),
1703
+ row = [],
1704
+ remaining = children.slice(), // copy-on-write
1705
+ child,
1706
+ best = Infinity, // the best row score so far
1707
+ score, // the current row score
1708
+ u = Math.min(rect.dx, rect.dy), // initial orientation
1709
+ n;
1710
+ scale(remaining, rect.dx * rect.dy / node.value);
1711
+ row.area = 0;
1712
+ while ((n = remaining.length) > 0) {
1713
+ row.push(child = remaining[n - 1]);
1714
+ row.area += child.area;
1715
+ if ((score = worst(row, u)) <= best) { // continue with this orientation
1716
+ remaining.pop();
1717
+ best = score;
1718
+ } else { // abort, and try a different orientation
1719
+ row.area -= row.pop().area;
1720
+ position(row, u, rect, false);
1721
+ u = Math.min(rect.dx, rect.dy);
1722
+ row.length = row.area = 0;
1723
+ best = Infinity;
1724
+ }
1725
+ }
1726
+ if (row.length) {
1727
+ position(row, u, rect, true);
1728
+ row.length = row.area = 0;
1729
+ }
1730
+ children.forEach(squarify);
1731
+ }
1732
+ }
1733
+
1734
+ // Recursively resizes the specified node's children into existing rows.
1735
+ // Preserves the existing layout!
1736
+ function stickify(node) {
1737
+ var children = node.children;
1738
+ if (children && children.length) {
1739
+ var rect = pad(node),
1740
+ remaining = children.slice(), // copy-on-write
1741
+ child,
1742
+ row = [];
1743
+ scale(remaining, rect.dx * rect.dy / node.value);
1744
+ row.area = 0;
1745
+ while (child = remaining.pop()) {
1746
+ row.push(child);
1747
+ row.area += child.area;
1748
+ if (child.z != null) {
1749
+ position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);
1750
+ row.length = row.area = 0;
1751
+ }
1752
+ }
1753
+ children.forEach(stickify);
1754
+ }
1755
+ }
1756
+
1757
+ // Computes the score for the specified row, as the worst aspect ratio.
1758
+ function worst(row, u) {
1759
+ var s = row.area,
1760
+ r,
1761
+ rmax = 0,
1762
+ rmin = Infinity,
1763
+ i = -1,
1764
+ n = row.length;
1765
+ while (++i < n) {
1766
+ if (!(r = row[i].area)) continue;
1767
+ if (r < rmin) rmin = r;
1768
+ if (r > rmax) rmax = r;
1769
+ }
1770
+ s *= s;
1771
+ u *= u;
1772
+ return s
1773
+ ? Math.max((u * rmax * ratio) / s, s / (u * rmin * ratio))
1774
+ : Infinity;
1775
+ }
1776
+
1777
+ // Positions the specified row of nodes. Modifies `rect`.
1778
+ function position(row, u, rect, flush) {
1779
+ var i = -1,
1780
+ n = row.length,
1781
+ x = rect.x,
1782
+ y = rect.y,
1783
+ v = u ? round(row.area / u) : 0,
1784
+ o;
1785
+ if (u == rect.dx) { // horizontal subdivision
1786
+ if (flush || v > rect.dy) v = v ? rect.dy : 0; // over+underflow
1787
+ while (++i < n) {
1788
+ o = row[i];
1789
+ o.x = x;
1790
+ o.y = y;
1791
+ o.dy = v;
1792
+ x += o.dx = v ? round(o.area / v) : 0;
1793
+ }
1794
+ o.z = true;
1795
+ o.dx += rect.x + rect.dx - x; // rounding error
1796
+ rect.y += v;
1797
+ rect.dy -= v;
1798
+ } else { // vertical subdivision
1799
+ if (flush || v > rect.dx) v = v ? rect.dx : 0; // over+underflow
1800
+ while (++i < n) {
1801
+ o = row[i];
1802
+ o.x = x;
1803
+ o.y = y;
1804
+ o.dx = v;
1805
+ y += o.dy = v ? round(o.area / v) : 0;
1806
+ }
1807
+ o.z = false;
1808
+ o.dy += rect.y + rect.dy - y; // rounding error
1809
+ rect.x += v;
1810
+ rect.dx -= v;
1811
+ }
1812
+ }
1813
+
1814
+ function treemap(d) {
1815
+ var nodes = stickies || hierarchy(d),
1816
+ root = nodes[0];
1817
+ root.x = 0;
1818
+ root.y = 0;
1819
+ root.dx = size[0];
1820
+ root.dy = size[1];
1821
+ if (stickies) hierarchy.revalue(root);
1822
+ scale([root], root.dx * root.dy / root.value);
1823
+ (stickies ? stickify : squarify)(root);
1824
+ if (sticky) stickies = nodes;
1825
+ return nodes;
1826
+ }
1827
+
1828
+ treemap.size = function(x) {
1829
+ if (!arguments.length) return size;
1830
+ size = x;
1831
+ return treemap;
1832
+ };
1833
+
1834
+ treemap.padding = function(x) {
1835
+ if (!arguments.length) return padding;
1836
+
1837
+ function padFunction(node) {
1838
+ var p = x.call(treemap, node, node.depth);
1839
+ return p == null
1840
+ ? d3_layout_treemapPadNull(node)
1841
+ : d3_layout_treemapPad(node, typeof p === "number" ? [p, p, p, p] : p);
1842
+ }
1843
+
1844
+ function padConstant(node) {
1845
+ return d3_layout_treemapPad(node, x);
1846
+ }
1847
+
1848
+ var type;
1849
+ pad = (padding = x) == null ? d3_layout_treemapPadNull
1850
+ : (type = typeof x) === "function" ? padFunction
1851
+ : type === "number" ? (x = [x, x, x, x], padConstant)
1852
+ : padConstant;
1853
+ return treemap;
1854
+ };
1855
+
1856
+ treemap.round = function(x) {
1857
+ if (!arguments.length) return round != Number;
1858
+ round = x ? Math.round : Number;
1859
+ return treemap;
1860
+ };
1861
+
1862
+ treemap.sticky = function(x) {
1863
+ if (!arguments.length) return sticky;
1864
+ sticky = x;
1865
+ stickies = null;
1866
+ return treemap;
1867
+ };
1868
+
1869
+ treemap.ratio = function(x) {
1870
+ if (!arguments.length) return ratio;
1871
+ ratio = x;
1872
+ return treemap;
1873
+ };
1874
+
1875
+ return d3_layout_hierarchyRebind(treemap, hierarchy);
1876
+ };
1877
+
1878
+ function d3_layout_treemapPadNull(node) {
1879
+ return {x: node.x, y: node.y, dx: node.dx, dy: node.dy};
1880
+ }
1881
+
1882
+ function d3_layout_treemapPad(node, padding) {
1883
+ var x = node.x + padding[3],
1884
+ y = node.y + padding[0],
1885
+ dx = node.dx - padding[1] - padding[3],
1886
+ dy = node.dy - padding[0] - padding[2];
1887
+ if (dx < 0) { x += dx / 2; dx = 0; }
1888
+ if (dy < 0) { y += dy / 2; dy = 0; }
1889
+ return {x: x, y: y, dx: dx, dy: dy};
1890
+ }
1891
+ })();