j1-template 2022.2.2 → 2022.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +4 -4
  2. data/_includes/themes/j1/blocks/footer/boxes/contacts_box.proc +46 -18
  3. data/_includes/themes/j1/blocks/footer/boxes/links_box.proc +1 -0
  4. data/assets/data/fab.html +2 -2
  5. data/assets/data/footer.html +2 -2
  6. data/assets/themes/j1/adapter/js/analytics.js +13 -13
  7. data/assets/themes/j1/adapter/js/cookieConsent.js +1 -1
  8. data/assets/themes/j1/adapter/js/nbinteract.js +366 -120
  9. data/assets/themes/j1/core/css/themes/unodark/bootstrap.css +30 -40
  10. data/assets/themes/j1/core/css/themes/unodark/bootstrap.min.css +1 -1
  11. data/assets/themes/j1/core/css/themes/unolight/bootstrap.css +85 -216
  12. data/assets/themes/j1/core/css/themes/unolight/bootstrap.min.css +2 -2
  13. data/assets/themes/j1/core/js/template.js +1 -1
  14. data/assets/themes/j1/core/js/template.min.js +1 -1
  15. data/assets/themes/j1/core/js/template.min.js.map +1 -1
  16. data/assets/themes/j1/modules/carousel/css/theme/uno.css +5 -0
  17. data/assets/themes/j1/modules/carousel/css/theme/uno.min.css +1 -1
  18. data/assets/themes/j1/modules/cookieConsent/js/cookieConsent.js +1 -0
  19. data/assets/themes/j1/modules/justifiedGallery/css/justifiedGallery.css +6 -0
  20. data/assets/themes/j1/modules/justifiedGallery/css/justifiedGallery.min.css +1 -1
  21. data/assets/themes/j1/modules/mmenuLight/css/mmenu-light.css +2 -2
  22. data/assets/themes/j1/modules/mmenuLight/css/mmenu-light.min.css +1 -2
  23. data/assets/themes/j1/modules/nbInteract/README.md +169 -0
  24. data/assets/themes/j1/modules/nbInteract/css/nbinteract-core.css +4 -0
  25. data/assets/themes/j1/modules/nbInteract/css/nbinteract-core.min.css +4 -0
  26. data/assets/themes/j1/modules/nbInteract/css/theme/uno/nbinteract-core.css +33 -33
  27. data/assets/themes/j1/modules/nbInteract/css/theme/uno/nbinteract-core.min.css +1 -1
  28. data/assets/themes/j1/modules/nbInteract/js/requireJS/require.js +2068 -0
  29. data/assets/themes/j1/modules/nbInteract/js/requireJS/require.min.js +36 -0
  30. data/assets/themes/j1/modules/plotly/LICENSE +21 -0
  31. data/assets/themes/j1/modules/plotly/README.md +32 -0
  32. data/assets/themes/j1/modules/plotly/js/plotly.js +265345 -0
  33. data/assets/themes/j1/modules/plotly/js/plotly.min.js +65 -0
  34. data/assets/themes/j1/modules/requirejs/LICENSE +45 -0
  35. data/assets/themes/j1/modules/requirejs/README.md +79 -0
  36. data/assets/themes/j1/modules/requirejs/js/require.js +2068 -0
  37. data/assets/themes/j1/modules/requirejs/js/require.min.js +36 -0
  38. data/lib/j1/version.rb +1 -1
  39. data/lib/starter_web/Gemfile +1 -1
  40. data/lib/starter_web/_config.yml +1 -1
  41. data/lib/starter_web/_data/blocks/defaults/footer.yml +25 -17
  42. data/lib/starter_web/_data/blocks/footer.yml +78 -65
  43. data/lib/starter_web/_data/modules/analytics.yml +8 -23
  44. data/lib/starter_web/_data/modules/defaults/analytics.yml +1 -1
  45. data/lib/starter_web/_data/modules/defaults/cookieconsent.yml +4 -1
  46. data/lib/starter_web/_data/modules/justifiedGallery.yml +14 -8
  47. data/lib/starter_web/_data/modules/navigator_menu.yml +6 -3
  48. data/lib/starter_web/_data/modules/nbinteract.yml +12 -48
  49. data/lib/starter_web/_data/resources.yml +52 -18
  50. data/lib/starter_web/_includes/attributes.asciidoc +25 -0
  51. data/lib/starter_web/_plugins/lunr_index.rb +1 -1
  52. data/lib/starter_web/assets/images/pages/nbinteract/mandelbrot-menge-1920x1200.jpg +0 -0
  53. data/lib/starter_web/assets/images/pages/nbinteract/mandelbrot-menge.png +0 -0
  54. data/lib/starter_web/assets/images/pages/nbinteract/manual/nbi_bar.jpg +0 -0
  55. data/lib/starter_web/assets/images/pages/nbinteract/manual/nbi_hist.jpg +0 -0
  56. data/lib/starter_web/assets/images/pages/nbinteract/manual/nbi_line.jpg +0 -0
  57. data/lib/starter_web/assets/images/pages/nbinteract/manual/nbi_multiple_choice.jpg +0 -0
  58. data/lib/starter_web/assets/images/pages/nbinteract/manual/nbi_scatter.jpg +0 -0
  59. data/lib/starter_web/assets/images/pages/nbinteract/manual/nbi_scatter_drag.jpg +0 -0
  60. data/lib/starter_web/assets/images/pages/nbinteract/manual/nbi_short_answer.jpg +0 -0
  61. data/lib/starter_web/assets/images/pages/nbinteract/nbi-textbook-example.jpg +0 -0
  62. data/lib/starter_web/assets/videos/gallery/kick-it-old-school-poster.jpg +0 -0
  63. data/lib/starter_web/assets/videos/gallery/nye-party-shop-poster.jpg +0 -0
  64. data/lib/starter_web/assets/videos/gallery/stay-colorful-poster.jpg +0 -0
  65. data/lib/starter_web/collections/posts/public/series/_posts/2020-01-01-post-wiki-series.adoc +1 -0
  66. data/lib/starter_web/collections/posts/public/series/_posts/2020-01-02-post-wiki-series.adoc +1 -0
  67. data/lib/starter_web/collections/posts/public/series/_posts/2020-01-03-post-wiki-series.adoc +1 -0
  68. data/lib/starter_web/package.json +1 -2
  69. data/lib/starter_web/pages/public/jupyter/docs/_includes/documents/j1_docs_example_static.asciidoc +232 -232
  70. data/lib/starter_web/pages/public/jupyter/docs/j1-nbinteract-doc.adoc +165 -149
  71. data/lib/starter_web/pages/public/jupyter/docs/nbi-widget-manual.adoc +156 -11
  72. data/lib/starter_web/pages/public/jupyter/docs/nbinteract-doc.adoc +11 -6
  73. data/lib/starter_web/pages/public/jupyter/examples/j1-circular-times-table.adoc +136 -0
  74. data/lib/starter_web/pages/public/jupyter/examples/j1-interactive-widgets.adoc +9 -5
  75. data/lib/starter_web/pages/public/jupyter/examples/j1-odes-in-python.adoc +16 -7
  76. data/lib/starter_web/pages/public/jupyter/examples/j1-testing-plotly.adoc +95 -0
  77. data/lib/starter_web/pages/public/jupyter/examples/j1_climate-change-forecast.adoc +4 -4
  78. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/{algebra_with_sympy-checkpoint.ipynb → j1_circular_times_table-checkpoint.ipynb} +5190 -7291
  79. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_climate_change_forecast-checkpoint.ipynb +2 -2
  80. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_docs_example_dynamic-checkpoint.ipynb +1 -1
  81. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_interactive_widgets-checkpoint.ipynb +170 -15
  82. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_ode_selected-checkpoint.ipynb +1 -1
  83. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_odes_in_python-checkpoint.ipynb +520 -111
  84. data/lib/starter_web/pages/public/jupyter/notebooks/j1/factor_by_factor.mp4 +0 -0
  85. data/lib/starter_web/pages/public/jupyter/notebooks/j1/{.ipynb_checkpoints/j1_algebra_with_sympy-checkpoint.ipynb → j1_circular_times_table.ipynb} +5178 -7308
  86. data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_climate_change_forecast.ipynb +2 -2
  87. data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_docs_example_dynamic.ipynb +1 -1
  88. data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_interactive_widgets.ipynb +170 -15
  89. data/lib/starter_web/pages/public/jupyter/notebooks/j1/{j1_ode_selected.ipynb → j1_odes_in_python.ipynb} +783 -34
  90. data/lib/starter_web/pages/public/jupyter/notebooks/j1/line_by_line.mp4 +0 -0
  91. data/lib/starter_web/pages/public/jupyter/notebooks/j1/point_by_point.mp4 +0 -0
  92. data/lib/starter_web/pages/public/jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_recipes_interactive_questions-checkpoint.ipynb +185 -0
  93. data/lib/starter_web/pages/public/jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_tutorial_interact-checkpoint.ipynb +254 -0
  94. data/lib/starter_web/pages/public/jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_tutorial_monty_hall-checkpoint.ipynb +732 -0
  95. data/lib/starter_web/pages/public/jupyter/notebooks/nbi-docs/nbi_docs_recipes_interactive_questions.ipynb +19 -22
  96. data/lib/starter_web/pages/public/jupyter/notebooks/nbi-docs/nbi_docs_tutorial_monty_hall.ipynb +25 -26
  97. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_circular_times_table.html +746 -0
  98. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_climate_change_forecast.html +2 -2
  99. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_interactive_widgets.html +217 -0
  100. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_odes_in_python.html +955 -0
  101. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/nbi_docs_recipes_interactive_questions.html +1 -2
  102. data/lib/starter_web/pages/public/jupyter/{apis/binderhub-api.adoc → services/binderhub.adoc} +25 -28
  103. data/lib/starter_web/pages/public/jupyter/{apis/jupyterhub-api.adoc → services/jupyterhub.adoc} +8 -9
  104. data/lib/starter_web/pages/public/learn/roundtrip/100_present_images.adoc +1 -1
  105. data/lib/starter_web/pages/public/learn/roundtrip/100_present_videos.adoc +9 -15
  106. data/lib/starter_web/pages/public/learn/roundtrip/200_typography.adoc +1 -1
  107. data/lib/starter_web/pages/public/learn/roundtrip/300_icon_fonts.adoc +12 -1
  108. data/lib/starter_web/pages/public/learn/roundtrip/400_asciidoc_extensions.adoc +1 -1
  109. data/lib/starter_web/pages/public/learn/roundtrip/410_bs_modals_extentions.adoc +1 -1
  110. data/lib/starter_web/pages/public/learn/roundtrip/420_responsive_tables_extensions.adoc +1 -1
  111. data/lib/starter_web/pages/public/legal/en/300_privacy.adoc +117 -12
  112. data/lib/starter_web/pages/public/se/se-fake.adoc +47 -0
  113. data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
  114. data/lib/starter_web/utilsrv/package.json +1 -1
  115. metadata +41 -41
  116. data/lib/starter_web/_data/_resources.yml +0 -1668
  117. data/lib/starter_web/assets/images/pages/nbinteract/binderhub-architecture.png +0 -0
  118. data/lib/starter_web/assets/videos/gallery/adriana-lima-poster.jpg +0 -0
  119. data/lib/starter_web/pages/public/jupyter/notebooks/binder/binder-launches.ipynb +0 -385
  120. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/Untitled-checkpoint.ipynb +0 -6
  121. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/binder-launches-checkpoint.ipynb +0 -385
  122. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/climate-change-forecast-checkpoint.ipynb +0 -916
  123. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/google_altair-checkpoint.ipynb +0 -33
  124. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/ipympl_test_plots-checkpoint.ipynb +0 -14517
  125. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_altair_interactive-checkpoint.ipynb +0 -16493
  126. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_altair_interactive_test-checkpoint.ipynb +0 -14697
  127. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_altair_visualization-checkpoint.ipynb +0 -15358
  128. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_altair_visualization_full-checkpoint.ipynb +0 -2576
  129. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_climate_change_forecast.ipynb +0 -1060
  130. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_docs_hist-checkpoint.ipynb +0 -98
  131. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_interactive-checkpoint.ipynb +0 -560
  132. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_ipympl_test_plots-checkpoint.ipynb +0 -14511
  133. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_pandas_creating_reading_and_writing-checkpoint.ipynb +0 -328
  134. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/j1_recipes_layout-checkpoint.ipynb +0 -341
  135. data/lib/starter_web/pages/public/jupyter/notebooks/j1/.ipynb_checkpoints/nbi_docs_recipes_graphing-checkpoint.ipynb +0 -98
  136. data/lib/starter_web/pages/public/jupyter/notebooks/j1/binder-launches.ipynb +0 -411
  137. data/lib/starter_web/pages/public/jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_examples_correlation-checkpoint.ipynb +0 -651
  138. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/binder-launches.html +0 -546
  139. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_ode_selected.html +0 -186
  140. data/lib/starter_web/pages/public/jupyter/notebooks/themes/altair/excel.py +0 -55
  141. data/lib/starter_web/pages/public/jupyter/notebooks/themes/altair/ggplot.py +0 -108
  142. data/lib/starter_web/pages/public/jupyter/notebooks/themes/altair/ggplot2.py +0 -108
  143. data/lib/starter_web/pages/public/jupyter/notebooks/themes/altair/husky.py +0 -121
  144. data/lib/starter_web/pages/public/jupyter/notebooks/themes/altair/latimes.py +0 -149
  145. data/lib/starter_web/pages/public/jupyter/notebooks/themes/altair/pcolor.py +0 -6
  146. data/lib/starter_web/pages/public/jupyter/notebooks/themes/altair/quartz.py +0 -55
  147. data/lib/starter_web/pages/public/jupyter/notebooks/themes/altair/spacy_base.py +0 -94
  148. data/lib/starter_web/pages/public/jupyter/notebooks/themes/altair/spacy_mono.py +0 -158
  149. data/lib/starter_web/pages/public/jupyter/notebooks/themes/altair/sunsentinel.py +0 -125
@@ -1,546 +0,0 @@
1
- <div class="cell text_cell">
2
- <button class="js-nbinteract-widget">
3
- Loading widgets...
4
- </button>
5
- </div>
6
-
7
-
8
-
9
- <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
10
- <div class="text_cell_render border-box-sizing rendered_html">
11
- <h1 id="Analysing-mybinder.org-launches">Analysing mybinder.org launches<a class="anchor-link" href="#Analysing-mybinder.org-launches">&#182;</a></h1><p>The first few cells download and massage the data. Later on we answer questions on which repositories are popular and such.</p>
12
-
13
- </div>
14
- </div>
15
- </div>
16
-
17
-
18
-
19
- <div class="
20
- cell border-box-sizing code_cell rendered">
21
- <div class="input">
22
-
23
- <div class="inner_cell">
24
- <div class="input_area">
25
- <div class=" highlight hl-ipython3"><pre><span></span><span class="o">%</span><span class="k">matplotlib</span> inline
26
-
27
- <span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
28
- <span class="kn">import</span> <span class="nn">datetime</span>
29
- <span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span>
30
- </pre></div>
31
-
32
- </div>
33
- </div>
34
- </div>
35
-
36
- </div>
37
-
38
-
39
-
40
- <div class="
41
- cell border-box-sizing code_cell rendered">
42
- <div class="input">
43
-
44
- <div class="inner_cell">
45
- <div class="input_area">
46
- <div class=" highlight hl-ipython3"><pre><span></span><span class="n">index</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_json</span><span class="p">(</span><span class="s2">&quot;https://archive.analytics.mybinder.org/index.jsonl&quot;</span><span class="p">,</span>
47
- <span class="n">lines</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
48
- </pre></div>
49
-
50
- </div>
51
- </div>
52
- </div>
53
-
54
- </div>
55
-
56
-
57
-
58
- <div class="
59
- cell border-box-sizing code_cell rendered">
60
- <div class="input">
61
-
62
- <div class="inner_cell">
63
- <div class="input_area">
64
- <div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># get all days since start of 2019</span>
65
- <span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span>
66
- <span class="n">n</span> <span class="o">=</span> <span class="p">(</span><span class="n">now</span> <span class="o">-</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2019</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span><span class="o">.</span><span class="n">days</span>
67
-
68
- <span class="c1"># small range for previewing</span>
69
- <span class="c1">#n = 30</span>
70
-
71
- <span class="n">frames</span> <span class="o">=</span> <span class="p">[]</span>
72
- <span class="k">for</span> <span class="n">idx</span><span class="p">,</span> <span class="n">day</span> <span class="ow">in</span> <span class="n">index</span><span class="o">.</span><span class="n">sort_index</span><span class="p">(</span><span class="n">ascending</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span><span class="o">.</span><span class="n">iterrows</span><span class="p">():</span>
73
- <span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_json</span><span class="p">(</span><span class="s2">&quot;https://archive.analytics.mybinder.org/</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">day</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]),</span>
74
- <span class="n">lines</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="p">)</span>
75
- <span class="n">frames</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">df</span><span class="p">)</span>
76
- <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">frames</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">n</span><span class="p">:</span>
77
- <span class="k">break</span>
78
-
79
- <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Fetched data for </span><span class="si">{</span><span class="n">n</span><span class="si">}</span><span class="s2"> days.&quot;</span><span class="p">)</span>
80
- </pre></div>
81
-
82
- </div>
83
- </div>
84
- </div>
85
-
86
- </div>
87
-
88
-
89
-
90
- <div class="
91
- cell border-box-sizing code_cell rendered">
92
- <div class="input">
93
-
94
- <div class="inner_cell">
95
- <div class="input_area">
96
- <div class=" highlight hl-ipython3"><pre><span></span><span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">concat</span><span class="p">(</span><span class="n">frames</span><span class="p">)</span>
97
- </pre></div>
98
-
99
- </div>
100
- </div>
101
- </div>
102
-
103
- </div>
104
-
105
-
106
-
107
- <div class="
108
- cell border-box-sizing code_cell rendered">
109
- <div class="input">
110
-
111
- <div class="inner_cell">
112
- <div class="input_area">
113
- <div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># make it easier to grab the ref</span>
114
- <span class="k">def</span> <span class="nf">get_repo</span><span class="p">(</span><span class="n">spec</span><span class="p">):</span>
115
- <span class="n">s</span> <span class="o">=</span> <span class="n">spec</span><span class="o">.</span><span class="n">rsplit</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
116
- <span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;.git&#39;</span><span class="p">):</span>
117
- <span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="p">[:</span><span class="o">-</span><span class="mi">4</span><span class="p">]</span>
118
- <span class="k">return</span> <span class="n">s</span>
119
- <span class="n">df</span><span class="p">[</span><span class="s1">&#39;repo&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s1">&#39;spec&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="n">get_repo</span><span class="p">)</span> <span class="c1">#lambda s: s.rsplit(&quot;/&quot;, 1)[0].replace(&quot;.git&quot;, &quot;&quot;))</span>
120
- <span class="n">df</span><span class="p">[</span><span class="s1">&#39;org&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s1">&#39;spec&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="n">s</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
121
- <span class="n">df</span><span class="p">[</span><span class="s1">&#39;ref&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s1">&#39;spec&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="n">s</span><span class="o">.</span><span class="n">rsplit</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">1</span><span class="p">])</span>
122
- </pre></div>
123
-
124
- </div>
125
- </div>
126
- </div>
127
-
128
- </div>
129
-
130
-
131
-
132
- <div class="
133
- cell border-box-sizing code_cell rendered">
134
- <div class="input">
135
-
136
- <div class="inner_cell">
137
- <div class="input_area">
138
- <div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># take a look at the data, does it look sensible?</span>
139
- <span class="n">df</span><span class="o">.</span><span class="n">sample</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
140
- </pre></div>
141
-
142
- </div>
143
- </div>
144
- </div>
145
-
146
- </div>
147
-
148
-
149
-
150
- <div class="
151
- cell border-box-sizing code_cell rendered">
152
- <div class="input">
153
-
154
- <div class="inner_cell">
155
- <div class="input_area">
156
- <div class=" highlight hl-ipython3"><pre><span></span><span class="n">df</span> <span class="o">=</span> <span class="n">df</span><span class="o">.</span><span class="n">drop</span><span class="p">(</span><span class="n">columns</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;schema&#39;</span><span class="p">,</span> <span class="s1">&#39;version&#39;</span><span class="p">,</span> <span class="s1">&#39;spec&#39;</span><span class="p">,</span> <span class="s1">&#39;status&#39;</span><span class="p">])</span>
157
- </pre></div>
158
-
159
- </div>
160
- </div>
161
- </div>
162
-
163
- </div>
164
-
165
-
166
-
167
- <div class="
168
- cell border-box-sizing code_cell rendered">
169
- <div class="input">
170
-
171
- <div class="inner_cell">
172
- <div class="input_area">
173
- <div class=" highlight hl-ipython3"><pre><span></span><span class="n">df</span><span class="o">.</span><span class="n">head</span><span class="p">()</span>
174
- </pre></div>
175
-
176
- </div>
177
- </div>
178
- </div>
179
-
180
- </div>
181
- <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
182
- <div class="text_cell_render border-box-sizing rendered_html">
183
- <h2 id="Monthly,-weekly,-daily-active-repos">Monthly, weekly, daily active repos<a class="anchor-link" href="#Monthly,-weekly,-daily-active-repos">&#182;</a></h2>
184
- </div>
185
- </div>
186
- </div>
187
-
188
-
189
-
190
- <div class="
191
- cell border-box-sizing code_cell rendered">
192
- <div class="input">
193
-
194
- <div class="inner_cell">
195
- <div class="input_area">
196
- <div class=" highlight hl-ipython3"><pre><span></span><span class="n">df_</span> <span class="o">=</span> <span class="n">df</span><span class="o">.</span><span class="n">set_index</span><span class="p">(</span><span class="s2">&quot;timestamp&quot;</span><span class="p">)</span>
197
- </pre></div>
198
-
199
- </div>
200
- </div>
201
- </div>
202
-
203
- </div>
204
-
205
-
206
-
207
- <div class="
208
- cell border-box-sizing code_cell rendered">
209
- <div class="input">
210
-
211
- <div class="inner_cell">
212
- <div class="input_area">
213
- <div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">n_active_repos</span><span class="p">(</span><span class="n">period</span><span class="o">=</span><span class="mi">30</span><span class="p">):</span>
214
- <span class="sd">&quot;&quot;&quot;Unique active repos over the period</span>
215
- <span class="sd"> </span>
216
- <span class="sd"> With period=30 this gives monthly active repos</span>
217
- <span class="sd"> With period=1 you get daily active repos</span>
218
- <span class="sd"> &quot;&quot;&quot;</span>
219
- <span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span>
220
- <span class="n">start</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2019</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
221
- <span class="n">days_since_start</span> <span class="o">=</span> <span class="p">(</span><span class="n">now</span> <span class="o">-</span> <span class="n">start</span><span class="p">)</span><span class="o">.</span><span class="n">days</span>
222
-
223
- <span class="n">data</span> <span class="o">=</span> <span class="p">[]</span>
224
-
225
- <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">days_since_start</span><span class="p">):</span>
226
- <span class="n">s</span> <span class="o">=</span> <span class="n">start</span> <span class="o">+</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="n">n</span><span class="p">)</span>
227
- <span class="n">e</span> <span class="o">=</span> <span class="n">start</span> <span class="o">+</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="n">n</span><span class="o">+</span><span class="n">period</span><span class="p">)</span>
228
- <span class="k">if</span> <span class="n">e</span> <span class="o">&gt;</span> <span class="n">now</span><span class="p">:</span>
229
- <span class="k">break</span>
230
-
231
- <span class="c1"># our &quot;monthly&quot; data</span>
232
- <span class="n">monthly</span> <span class="o">=</span> <span class="n">df_</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">s</span><span class="o">.</span><span class="n">isoformat</span><span class="p">():</span><span class="n">e</span><span class="o">.</span><span class="n">isoformat</span><span class="p">()]</span>
233
- <span class="n">data</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">dict</span><span class="p">(</span><span class="n">timestamp</span><span class="o">=</span><span class="n">e</span><span class="p">,</span> <span class="n">repos</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">monthly</span><span class="o">.</span><span class="n">repo</span><span class="p">))))</span>
234
-
235
- <span class="k">return</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="o">.</span><span class="n">from_records</span><span class="p">(</span><span class="n">data</span><span class="p">)</span><span class="o">.</span><span class="n">set_index</span><span class="p">(</span><span class="s2">&quot;timestamp&quot;</span><span class="p">)</span>
236
- </pre></div>
237
-
238
- </div>
239
- </div>
240
- </div>
241
-
242
- </div>
243
-
244
-
245
-
246
- <div class="
247
- cell border-box-sizing code_cell rendered">
248
- <div class="input">
249
-
250
- <div class="inner_cell">
251
- <div class="input_area">
252
- <div class=" highlight hl-ipython3"><pre><span></span><span class="n">monthly_active</span> <span class="o">=</span> <span class="n">n_active_repos</span><span class="p">(</span><span class="mi">30</span><span class="p">)</span>
253
- <span class="n">weekly_active</span> <span class="o">=</span> <span class="n">n_active_repos</span><span class="p">(</span><span class="mi">7</span><span class="p">)</span>
254
- <span class="n">daily_active</span> <span class="o">=</span> <span class="n">n_active_repos</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
255
- </pre></div>
256
-
257
- </div>
258
- </div>
259
- </div>
260
-
261
- </div>
262
-
263
-
264
-
265
- <div class="
266
- cell border-box-sizing code_cell rendered">
267
- <div class="input">
268
-
269
- <div class="inner_cell">
270
- <div class="input_area">
271
- <div class=" highlight hl-ipython3"><pre><span></span><span class="n">activity</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">merge</span><span class="p">(</span><span class="n">monthly_active</span><span class="p">,</span> <span class="n">daily_active</span><span class="p">,</span>
272
- <span class="n">suffixes</span><span class="o">=</span><span class="p">(</span><span class="s2">&quot;_monthly&quot;</span><span class="p">,</span> <span class="s2">&quot;_daily&quot;</span><span class="p">),</span> <span class="n">left_index</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">right_index</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
273
- <span class="n">activity</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">merge</span><span class="p">(</span><span class="n">activity</span><span class="p">,</span> <span class="n">weekly_active</span><span class="p">,</span> <span class="n">left_index</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">right_index</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
274
-
275
- <span class="n">activity</span><span class="o">.</span><span class="n">columns</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;30day active&#39;</span><span class="p">,</span> <span class="s1">&#39;1d active&#39;</span><span class="p">,</span> <span class="s1">&#39;7d active&#39;</span><span class="p">]</span>
276
- <span class="n">activity</span><span class="o">.</span><span class="n">plot</span><span class="p">();</span>
277
- </pre></div>
278
-
279
- </div>
280
- </div>
281
- </div>
282
-
283
- </div>
284
- <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
285
- <div class="text_cell_render border-box-sizing rendered_html">
286
- <h2 id="Total-launches">Total launches<a class="anchor-link" href="#Total-launches">&#182;</a></h2>
287
- </div>
288
- </div>
289
- </div>
290
-
291
-
292
-
293
- <div class="
294
- cell border-box-sizing code_cell rendered">
295
- <div class="input">
296
-
297
- <div class="inner_cell">
298
- <div class="input_area">
299
- <div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># Sneak peek: total launches!</span>
300
- <span class="n">df</span><span class="o">.</span><span class="n">shape</span>
301
- </pre></div>
302
-
303
- </div>
304
- </div>
305
- </div>
306
-
307
- </div>
308
- <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
309
- <div class="text_cell_render border-box-sizing rendered_html">
310
- <h2 id="Launches-per-day">Launches per day<a class="anchor-link" href="#Launches-per-day">&#182;</a></h2>
311
- </div>
312
- </div>
313
- </div>
314
-
315
-
316
-
317
- <div class="
318
- cell border-box-sizing code_cell rendered">
319
- <div class="input">
320
-
321
- <div class="inner_cell">
322
- <div class="input_area">
323
- <div class=" highlight hl-ipython3"><pre><span></span><span class="n">daily</span> <span class="o">=</span> <span class="n">df</span><span class="o">.</span><span class="n">set_index</span><span class="p">(</span><span class="s2">&quot;timestamp&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">resample</span><span class="p">(</span><span class="s1">&#39;D&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">count</span><span class="p">()</span>
324
- </pre></div>
325
-
326
- </div>
327
- </div>
328
- </div>
329
-
330
- </div>
331
-
332
-
333
-
334
- <div class="
335
- cell border-box-sizing code_cell rendered">
336
- <div class="input">
337
-
338
- <div class="inner_cell">
339
- <div class="input_area">
340
- <div class=" highlight hl-ipython3"><pre><span></span><span class="n">daily</span><span class="p">[</span><span class="s1">&#39;repo&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">plot</span><span class="p">()</span>
341
- </pre></div>
342
-
343
- </div>
344
- </div>
345
- </div>
346
-
347
- </div>
348
- <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
349
- <div class="text_cell_render border-box-sizing rendered_html">
350
- <h2 id="Estimate-number-of-unique-repositories">Estimate number of unique repositories<a class="anchor-link" href="#Estimate-number-of-unique-repositories">&#182;</a></h2><p>Expect the raw number of launches to be bigger than the number of repositories launched more than once. Those launched only once might have been accidents.</p>
351
-
352
- </div>
353
- </div>
354
- </div>
355
-
356
-
357
-
358
- <div class="
359
- cell border-box-sizing code_cell rendered">
360
- <div class="input">
361
-
362
- <div class="inner_cell">
363
- <div class="input_area">
364
- <div class=" highlight hl-ipython3"><pre><span></span><span class="nb">len</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">df</span><span class="o">.</span><span class="n">repo</span><span class="p">))</span>
365
- </pre></div>
366
-
367
- </div>
368
- </div>
369
- </div>
370
-
371
- </div>
372
-
373
-
374
-
375
- <div class="
376
- cell border-box-sizing code_cell rendered">
377
- <div class="input">
378
-
379
- <div class="inner_cell">
380
- <div class="input_area">
381
- <div class=" highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">Counter</span>
382
-
383
- <span class="nb">sum</span><span class="p">(</span><span class="mi">1</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="n">Counter</span><span class="p">(</span><span class="n">df</span><span class="o">.</span><span class="n">repo</span><span class="p">)</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span> <span class="o">&gt;</span> <span class="mi">3</span><span class="p">)</span>
384
- </pre></div>
385
-
386
- </div>
387
- </div>
388
- </div>
389
-
390
- </div>
391
- <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
392
- <div class="text_cell_render border-box-sizing rendered_html">
393
- <h2 id="Popular-repositories-and-their-branches">Popular repositories and their branches<a class="anchor-link" href="#Popular-repositories-and-their-branches">&#182;</a></h2><p>Twenty most popular repos:</p>
394
-
395
- </div>
396
- </div>
397
- </div>
398
-
399
-
400
-
401
- <div class="
402
- cell border-box-sizing code_cell rendered">
403
- <div class="input">
404
-
405
- <div class="inner_cell">
406
- <div class="input_area">
407
- <div class=" highlight hl-ipython3"><pre><span></span><span class="n">top20</span> <span class="o">=</span> <span class="n">df</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="s2">&quot;repo&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">count</span><span class="p">()</span><span class="o">.</span><span class="n">sort_values</span><span class="p">(</span><span class="s2">&quot;timestamp&quot;</span><span class="p">,</span> <span class="n">ascending</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span><span class="o">.</span><span class="n">head</span><span class="p">(</span><span class="mi">20</span><span class="p">)</span>
408
- <span class="n">top20</span>
409
- </pre></div>
410
-
411
- </div>
412
- </div>
413
- </div>
414
-
415
- </div>
416
-
417
-
418
-
419
- <div class="
420
- cell border-box-sizing code_cell rendered">
421
- <div class="input">
422
-
423
- <div class="inner_cell">
424
- <div class="input_area">
425
- <div class=" highlight hl-ipython3"><pre><span></span><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Cumulative top20 launches:&quot;</span><span class="p">,</span> <span class="n">top20</span><span class="p">[</span><span class="s1">&#39;ref&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">())</span>
426
- <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;The top20 repos are </span><span class="si">{:.1f}% o</span><span class="s2">f all &quot;</span>
427
- <span class="s2">&quot;launches.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="mi">100</span> <span class="o">*</span> <span class="n">top20</span><span class="p">[</span><span class="s1">&#39;ref&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> <span class="o">/</span> <span class="n">df</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span>
428
- </pre></div>
429
-
430
- </div>
431
- </div>
432
- </div>
433
-
434
- </div>
435
- <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
436
- <div class="text_cell_render border-box-sizing rendered_html">
437
- <h2 id="Per-org-stats">Per org stats<a class="anchor-link" href="#Per-org-stats">&#182;</a></h2><p>Needs more RAM than mybinder.org gives us for now</p>
438
-
439
- </div>
440
- </div>
441
- </div>
442
-
443
-
444
-
445
- <div class="
446
- cell border-box-sizing code_cell rendered">
447
- <div class="input">
448
-
449
- <div class="inner_cell">
450
- <div class="input_area">
451
- <div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># add a new column showing total launches per repo</span>
452
- <span class="n">totals_per_repo</span> <span class="o">=</span> <span class="p">(</span><span class="n">df</span><span class="o">.</span><span class="n">groupby</span><span class="p">([</span><span class="s2">&quot;repo&quot;</span><span class="p">])</span>
453
- <span class="o">.</span><span class="n">size</span><span class="p">()</span>
454
- <span class="o">.</span><span class="n">reset_index</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;repo_counts&#39;</span><span class="p">))</span>
455
- </pre></div>
456
-
457
- </div>
458
- </div>
459
- </div>
460
-
461
- </div>
462
-
463
-
464
-
465
- <div class="
466
- cell border-box-sizing code_cell rendered">
467
- <div class="input">
468
-
469
- <div class="inner_cell">
470
- <div class="input_area">
471
- <div class=" highlight hl-ipython3"><pre><span></span><span class="c1"># add a nnew column showing total launches per org</span>
472
- <span class="n">totals_per_org</span> <span class="o">=</span> <span class="p">(</span><span class="n">df</span><span class="o">.</span><span class="n">groupby</span><span class="p">([</span><span class="s2">&quot;org&quot;</span><span class="p">])</span>
473
- <span class="o">.</span><span class="n">size</span><span class="p">()</span>
474
- <span class="o">.</span><span class="n">reset_index</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;org_counts&#39;</span><span class="p">))</span>
475
- </pre></div>
476
-
477
- </div>
478
- </div>
479
- </div>
480
-
481
- </div>
482
-
483
-
484
-
485
- <div class="
486
- cell border-box-sizing code_cell rendered">
487
- <div class="input">
488
-
489
- <div class="inner_cell">
490
- <div class="input_area">
491
- <div class=" highlight hl-ipython3"><pre><span></span><span class="n">df_</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">merge</span><span class="p">(</span><span class="n">df</span><span class="p">,</span> <span class="n">totals_per_repo</span><span class="p">,</span> <span class="n">on</span><span class="o">=</span><span class="s1">&#39;repo&#39;</span><span class="p">)</span>
492
- <span class="n">df_</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">merge</span><span class="p">(</span><span class="n">df_</span><span class="p">,</span> <span class="n">totals_per_org</span><span class="p">,</span> <span class="n">on</span><span class="o">=</span><span class="s1">&#39;org&#39;</span><span class="p">)</span>
493
- <span class="c1">#df_.sample(10)</span>
494
- </pre></div>
495
-
496
- </div>
497
- </div>
498
- </div>
499
-
500
- </div>
501
-
502
-
503
-
504
- <div class="
505
- cell border-box-sizing code_cell rendered">
506
- <div class="input">
507
-
508
- <div class="inner_cell">
509
- <div class="input_area">
510
- <div class=" highlight hl-ipython3"><pre><span></span><span class="p">(</span><span class="n">df</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="s2">&quot;provider&quot;</span><span class="p">)</span>
511
- <span class="o">.</span><span class="n">size</span><span class="p">()</span>
512
- <span class="o">.</span><span class="n">reset_index</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;Launches&#39;</span><span class="p">)</span>
513
- <span class="o">.</span><span class="n">sort_values</span><span class="p">(</span><span class="s1">&#39;Launches&#39;</span><span class="p">,</span> <span class="n">ascending</span><span class="o">=</span><span class="kc">False</span><span class="p">))</span>
514
- </pre></div>
515
-
516
- </div>
517
- </div>
518
- </div>
519
-
520
- </div>
521
-
522
-
523
-
524
- <div class="
525
- cell border-box-sizing code_cell rendered">
526
- <div class="input">
527
-
528
- <div class="inner_cell">
529
- <div class="input_area">
530
- <div class=" highlight hl-ipython3"><pre><span></span><span class="p">(</span><span class="n">df_</span><span class="o">.</span><span class="n">groupby</span><span class="p">([</span><span class="s2">&quot;org&quot;</span><span class="p">,</span> <span class="s2">&quot;repo&quot;</span><span class="p">,</span> <span class="s2">&quot;ref&quot;</span><span class="p">,</span> <span class="s2">&quot;repo_counts&quot;</span><span class="p">,</span> <span class="s2">&quot;org_counts&quot;</span><span class="p">])</span>
531
- <span class="o">.</span><span class="n">size</span><span class="p">()</span>
532
- <span class="c1"># give the column a nice name</span>
533
- <span class="o">.</span><span class="n">reset_index</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;ref_counts&#39;</span><span class="p">)</span>
534
- <span class="c1"># sort first by total launches, then within a repo by ref launches</span>
535
- <span class="o">.</span><span class="n">sort_values</span><span class="p">([</span><span class="s1">&#39;org_counts&#39;</span><span class="p">,</span> <span class="s1">&#39;repo_counts&#39;</span><span class="p">,</span> <span class="s1">&#39;ref_counts&#39;</span><span class="p">],</span>
536
- <span class="n">ascending</span><span class="o">=</span><span class="p">[</span><span class="kc">False</span><span class="p">,</span><span class="kc">False</span><span class="p">,</span> <span class="kc">False</span><span class="p">])</span>
537
- <span class="o">.</span><span class="n">set_index</span><span class="p">([</span><span class="s2">&quot;org&quot;</span><span class="p">,</span> <span class="s1">&#39;repo&#39;</span><span class="p">,</span> <span class="s1">&#39;ref&#39;</span><span class="p">])</span>
538
- <span class="p">)</span>
539
- </pre></div>
540
-
541
- </div>
542
- </div>
543
- </div>
544
-
545
- </div>
546
-