aboutsummaryrefslogtreecommitdiffstats
path: root/docs/com/pres
diff options
context:
space:
mode:
Diffstat (limited to 'docs/com/pres')
-rwxr-xr-xdocs/com/pres/index.template.html378
-rwxr-xr-xdocs/com/pres/summit-Berlin.html302
2 files changed, 680 insertions, 0 deletions
diff --git a/docs/com/pres/index.template.html b/docs/com/pres/index.template.html
new file mode 100755
index 000000000..f9dd5a2d7
--- /dev/null
+++ b/docs/com/pres/index.template.html
@@ -0,0 +1,378 @@
+<!doctype html>
+<html lang="en">
+
+ <head>
+ <meta charset="utf-8">
+
+ <title>OPNFV presentation</title>
+
+ <meta name="description" content="A framework for easily creating beautiful presentations using HTML">
+ <meta name="author" content="Hakim El Hattab">
+
+ <meta name="apple-mobile-web-app-capable" content="yes" />
+ <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
+
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui">
+
+ <link rel="stylesheet" href="css/reveal.css">
+ <link rel="stylesheet" href="css/theme/OPNFV.css" id="theme">
+
+ <!-- Code syntax highlighting -->
+ <link rel="stylesheet" href="lib/css/zenburn.css">
+
+ <!-- Printing and PDF exports -->
+ <script>
+ var link = document.createElement( 'link' );
+ link.rel = 'stylesheet';
+ link.type = 'text/css';
+ link.href = window.location.search.match( /print-pdf/gi ) ? 'css/print/pdf.css' : 'css/print/paper.css';
+ document.getElementsByTagName( 'head' )[0].appendChild( link );
+ </script>
+
+ <!--[if lt IE 9]>
+ <script src="lib/js/html5shiv.js"></script>
+ <![endif]-->
+ </head>
+
+ <body>
+
+ <div class="reveal">
+ <!-- Any section element inside of this container is displayed as a slide -->
+ <div class="slides">
+
+ <section data-background="../img/title-bg.png" data-background-transition="none">
+ <br>
+ <h1>Project </h1>
+ <h3>subtitle</h3>
+ <br><br><br>
+ <h5>John Doe</h5>
+ <br />
+ <h5>whenever you want</h5>
+ <br>
+
+ </section>
+
+ <section>
+ <blockquote>
+ &ldquo;Good job. Chris Price - &rdquo;
+ </blockquote>
+ </section>
+
+ <section id="fragments">
+ <h1>item</h1>
+ <ul>
+ <li class="fragment">another one</li>
+ <li class="fragment">one more time</li>
+ </ul>
+ </section>
+
+
+
+ <section>
+ <section data-markdown>
+ # Cool in markdow
+ ## really cool
+ - yep
+ </section>
+ <section>
+ <p>OPNFV</p>
+ <img width="400" data-src="https://www.opnfv.org/sites/all/themes/opnfv/logo.png" alt="OPNFV">
+ </section>
+ <section data-markdown>
+ # Markdown
+ ![OPNFV](https://www.opnfv.org/sites/all/themes/opnfv/logo.png "OPNFV")
+ </section>
+ </section>
+
+
+ <section style="text-align: left;">
+ <h1>THE END</h1>
+ <p>
+ - <a href="http://slides.com">Try the online editor</a> <br>
+ - <a href="https://github.com/hakimel/reveal.js">Source code &amp; documentation</a>
+ </p>
+ </section>
+
+ <section>
+ <h2>Slides</h2>
+ <p>
+ Not a coder? Not a problem. There's a fully-featured visual editor for authoring these, try it out at <a href="http://slides.com" target="_blank">http://slides.com</a>.
+ </p>
+ </section>
+
+ <section>
+ <h2>Point of View</h2>
+ <p>
+ Press <strong>ESC</strong> to enter the slide overview.
+ </p>
+ <p>
+ Hold down alt and click on any element to zoom in on it using <a href="http://lab.hakim.se/zoom-js">zoom.js</a>. Alt + click anywhere to zoom back out.
+ </p>
+ </section>
+
+ <section>
+ <h2>Touch Optimized</h2>
+ <p>
+ Presentations look great on touch devices, like mobile phones and tablets. Simply swipe through your slides.
+ </p>
+ </section>
+
+ <section id="transitions">
+ <h2>Transition Styles</h2>
+ <p>
+ You can select from different transitions, like: <br>
+ <a href="?transition=none#/transitions">None</a> -
+ <a href="?transition=fade#/transitions">Fade</a> -
+ <a href="?transition=slide#/transitions">Slide</a> -
+ <a href="?transition=convex#/transitions">Convex</a> -
+ <a href="?transition=concave#/transitions">Concave</a> -
+ <a href="?transition=zoom#/transitions">Zoom</a>
+ </p>
+ </section>
+
+ <section id="themes">
+ <h2>Themes</h2>
+ <p>
+ reveal.js comes with a few themes built in: <br>
+ <!-- Hacks to swap themes after the page has loaded. Not flexible and only intended for the reveal.js demo deck. -->
+ <a href="#" onclick="document.getElementById('theme').setAttribute('href','css/theme/black.css'); return false;">Black (default)</a> -
+ <a href="#" onclick="document.getElementById('theme').setAttribute('href','css/theme/white.css'); return false;">White</a> -
+ <a href="#" onclick="document.getElementById('theme').setAttribute('href','css/theme/league.css'); return false;">League</a> -
+ <a href="#" onclick="document.getElementById('theme').setAttribute('href','css/theme/sky.css'); return false;">Sky</a> -
+ <a href="#" onclick="document.getElementById('theme').setAttribute('href','css/theme/beige.css'); return false;">Beige</a> -
+ <a href="#" onclick="document.getElementById('theme').setAttribute('href','css/theme/simple.css'); return false;">Simple</a> <br>
+ <a href="#" onclick="document.getElementById('theme').setAttribute('href','css/theme/serif.css'); return false;">Serif</a> -
+ <a href="#" onclick="document.getElementById('theme').setAttribute('href','css/theme/blood.css'); return false;">Blood</a> -
+ <a href="#" onclick="document.getElementById('theme').setAttribute('href','css/theme/night.css'); return false;">Night</a> -
+ <a href="#" onclick="document.getElementById('theme').setAttribute('href','css/theme/moon.css'); return false;">Moon</a> -
+ <a href="#" onclick="document.getElementById('theme').setAttribute('href','css/theme/solarized.css'); return false;">Solarized</a>
+ </p>
+ </section>
+
+ <section>
+ <section data-background="#dddddd">
+ <h2>Slide Backgrounds</h2>
+ <p>
+ Set <code>data-background="#dddddd"</code> on a slide to change the background color. All CSS color formats are supported.
+ </p>
+ <a href="#" class="navigate-down">
+ <img width="178" height="238" data-src="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png" alt="Down arrow">
+ </a>
+ </section>
+ <section data-background="https://s3.amazonaws.com/hakim-static/reveal-js/image-placeholder.png">
+ <h2>Image Backgrounds</h2>
+ <pre><code class="hljs">&lt;section data-background="image.png"&gt;</code></pre>
+ </section>
+ <section data-background="https://s3.amazonaws.com/hakim-static/reveal-js/image-placeholder.png" data-background-repeat="repeat" data-background-size="100px">
+ <h2>Tiled Backgrounds</h2>
+ <pre><code class="hljs" style="word-wrap: break-word;">&lt;section data-background="image.png" data-background-repeat="repeat" data-background-size="100px"&gt;</code></pre>
+ </section>
+ <section data-background-video="https://s3.amazonaws.com/static.slid.es/site/homepage/v1/homepage-video-editor.mp4,https://s3.amazonaws.com/static.slid.es/site/homepage/v1/homepage-video-editor.webm" data-background-color="#000000">
+ <div style="background-color: rgba(0, 0, 0, 0.9); color: #fff; padding: 20px;">
+ <h2>Video Backgrounds</h2>
+ <pre><code class="hljs" style="word-wrap: break-word;">&lt;section data-background-video="video.mp4,video.webm"&gt;</code></pre>
+ </div>
+ </section>
+ <section data-background="http://i.giphy.com/90F8aUepslB84.gif">
+ <h2>... and GIFs!</h2>
+ </section>
+ </section>
+
+ <section data-transition="slide" data-background="#4d7e65" data-background-transition="zoom">
+ <h2>Background Transitions</h2>
+ <p>
+ Different background transitions are available via the backgroundTransition option. This one's called "zoom".
+ </p>
+ <pre><code class="hljs">Reveal.configure({ backgroundTransition: 'zoom' })</code></pre>
+ </section>
+
+ <section data-transition="slide" data-background="#b5533c" data-background-transition="zoom">
+ <h2>Background Transitions</h2>
+ <p>
+ You can override background transitions per-slide.
+ </p>
+ <pre><code class="hljs" style="word-wrap: break-word;">&lt;section data-background-transition="zoom"&gt;</code></pre>
+ </section>
+
+ <section>
+ <h2>Pretty Code</h2>
+ <pre><code class="hljs" data-trim contenteditable>
+function linkify( selector ) {
+ if( supports3DTransforms ) {
+
+ var nodes = document.querySelectorAll( selector );
+
+ for( var i = 0, len = nodes.length; i &lt; len; i++ ) {
+ var node = nodes[i];
+
+ if( !node.className ) {
+ node.className += ' roll';
+ }
+ }
+ }
+}
+ </code></pre>
+ <p>Code syntax highlighting courtesy of <a href="http://softwaremaniacs.org/soft/highlight/en/description/">highlight.js</a>.</p>
+ </section>
+
+ <section>
+ <h2>Marvelous List</h2>
+ <ul>
+ <li>No order here</li>
+ <li>Or here</li>
+ <li>Or here</li>
+ <li>Or here</li>
+ </ul>
+ </section>
+
+ <section>
+ <h2>Fantastic Ordered List</h2>
+ <ol>
+ <li>One is smaller than...</li>
+ <li>Two is smaller than...</li>
+ <li>Three!</li>
+ </ol>
+ </section>
+
+ <section>
+ <h2>Tabular Tables</h2>
+ <table>
+ <thead>
+ <tr>
+ <th>Item</th>
+ <th>Value</th>
+ <th>Quantity</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>Apples</td>
+ <td>$1</td>
+ <td>7</td>
+ </tr>
+ <tr>
+ <td>Lemonade</td>
+ <td>$2</td>
+ <td>18</td>
+ </tr>
+ <tr>
+ <td>Bread</td>
+ <td>$3</td>
+ <td>2</td>
+ </tr>
+ </tbody>
+ </table>
+ </section>
+
+ <section>
+ <h2>Clever Quotes</h2>
+ <p>
+ These guys come in two forms, inline: <q cite="http://searchservervirtualization.techtarget.com/definition/Our-Favorite-Technology-Quotations">
+ &ldquo;The nice thing about standards is that there are so many to choose from&rdquo;</q> and block:
+ </p>
+ <blockquote cite="http://searchservervirtualization.techtarget.com/definition/Our-Favorite-Technology-Quotations">
+ &ldquo;For years there has been a theory that millions of monkeys typing at random on millions of typewriters would
+ reproduce the entire works of Shakespeare. The Internet has proven this theory to be untrue.&rdquo;
+ </blockquote>
+ </section>
+
+ <section>
+ <h2>Intergalactic Interconnections</h2>
+ <p>
+ You can link between slides internally,
+ <a href="#/2/3">like this</a>.
+ </p>
+ </section>
+
+ <section>
+ <h2>Speaker View</h2>
+ <p>There's a <a href="https://github.com/hakimel/reveal.js#speaker-notes">speaker view</a>. It includes a timer, preview of the upcoming slide as well as your speaker notes.</p>
+ <p>Press the <em>S</em> key to try it out.</p>
+
+ <aside class="notes">
+ Oh hey, these are some notes. They'll be hidden in your presentation, but you can see them if you open the speaker notes window (hit 's' on your keyboard).
+ </aside>
+ </section>
+
+ <section>
+ <h2>Export to PDF</h2>
+ <p>Presentations can be <a href="https://github.com/hakimel/reveal.js#pdf-export">exported to PDF</a>, here's an example:</p>
+ <iframe src="https://www.slideshare.net/slideshow/embed_code/42840540" width="445" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:3px solid #666; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe>
+ </section>
+
+ <section>
+ <h2>Global State</h2>
+ <p>
+ Set <code>data-state="something"</code> on a slide and <code>"something"</code>
+ will be added as a class to the document element when the slide is open. This lets you
+ apply broader style changes, like switching the page background.
+ </p>
+ </section>
+
+ <section data-state="customevent">
+ <h2>State Events</h2>
+ <p>
+ Additionally custom events can be triggered on a per slide basis by binding to the <code>data-state</code> name.
+ </p>
+ <pre><code class="javascript" data-trim contenteditable style="font-size: 18px;">
+Reveal.addEventListener( 'customevent', function() {
+ console.log( '"customevent" has fired' );
+} );
+ </code></pre>
+ </section>
+
+ <section>
+ <h2>Take a Moment</h2>
+ <p>
+ Press B or . on your keyboard to pause the presentation. This is helpful when you're on stage and want to take distracting slides off the screen.
+ </p>
+ </section>
+
+ <section>
+ <h2>Much more</h2>
+ <ul>
+ <li>Right-to-left support</li>
+ <li><a href="https://github.com/hakimel/reveal.js#api">Extensive JavaScript API</a></li>
+ <li><a href="https://github.com/hakimel/reveal.js#auto-sliding">Auto-progression</a></li>
+ <li><a href="https://github.com/hakimel/reveal.js#parallax-background">Parallax backgrounds</a></li>
+ <li><a href="https://github.com/hakimel/reveal.js#keyboard-bindings">Custom keyboard bindings</a></li>
+ </ul>
+ </section>
+
+
+ </div>
+ <div class='footer'>
+ <img src="./img/logo-OPNFV.png" alt="OPNFV logo">
+ </div>
+ </div>
+
+ <script src="lib/js/head.min.js"></script>
+ <script src="js/reveal.js"></script>
+
+ <script>
+
+ // Full list of configuration options available at:
+ // https://github.com/hakimel/reveal.js#configuration
+ Reveal.initialize({
+ controls: true,
+ progress: true,
+ history: true,
+ center: true,
+
+ transition: 'slide', // none/fade/slide/convex/concave/zoom
+
+ // Optional reveal.js plugins
+ dependencies: [
+ { src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } },
+ { src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
+ { src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
+ { src: 'plugin/highlight/highlight.js', async: true, condition: function() { return !!document.querySelector( 'pre code' ); }, callback: function() { hljs.initHighlightingOnLoad(); } },
+ { src: 'plugin/zoom-js/zoom.js', async: true },
+ { src: 'plugin/notes/notes.js', async: true }
+ ]
+ });
+
+ </script>
+
+ </body>
+</html>
diff --git a/docs/com/pres/summit-Berlin.html b/docs/com/pres/summit-Berlin.html
new file mode 100755
index 000000000..1f05d5bc1
--- /dev/null
+++ b/docs/com/pres/summit-Berlin.html
@@ -0,0 +1,302 @@
+<!doctype html>
+<html lang="en">
+
+ <head>
+ <meta charset="utf-8">
+
+ <title>OPNFV presentation</title>
+
+ <meta name="description" content="Functest: Many rivers to cross">
+ <meta name="author" content="Morgan Richomme and Functest contributors">
+
+ <meta name="apple-mobile-web-app-capable" content="yes" />
+ <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
+
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui">
+
+ <link rel="stylesheet" href="../css/reveal.css">
+ <link rel="stylesheet" href="../css/theme/OPNFV.css" id="theme">
+
+ <!-- Code syntax highlighting -->
+ <link rel="stylesheet" href="../lib/css/zenburn.css">
+
+ <!-- Printing and PDF exports -->
+ <script>
+ var link = document.createElement( 'link' );
+ link.rel = 'stylesheet';
+ link.type = 'text/css';
+ link.href = window.location.search.match( /print-pdf/gi ) ? '../css/print/pdf.css' : '../css/print/paper.css';
+ document.getElementsByTagName( 'head' )[0].appendChild( link );
+ </script>
+
+ <!--[if lt IE 9]>
+ <script src="lib/js/html5shiv.js"></script>
+ <![endif]-->
+ </head>
+
+ <body>
+
+ <div class="reveal">
+ <!-- Any section element inside of this container is displayed as a slide -->
+ <div class="slides">
+
+ <section data-background="../img/title-bg.png" data-background-transition="none">
+ <br>
+ <h1>From Arno to Colorado</h1>
+ <h3>Functest: Many rivers to cross</h3>
+ <br><br>
+ <h4>Functest contributors</h4>
+ <h5>OPNFV Design Summit, 20/6/2016, Berlin</h5>
+ <br>
+
+ </section>
+
+ <section>
+ <blockquote>
+ &ldquo;Bad programmers have all the answers. Good testers have all the questions. Gil Zilberfeld - &rdquo;
+ </blockquote>
+ </section>
+
+ <section data-markdown>
+ # Agenda
+ * Functest
+ * Arno
+ * Brahmaputra
+ * Colorado
+ * D, E, F rivers and beyond
+ </section>
+
+ <section data-markdown>
+ # The dream team
+ ![team](../img/teamSummitBerlin.png)
+ </section>
+
+ <section>
+ <section data-markdown>
+ # Functest: what for?
+ </section>
+ <section data-markdown>
+ ## Our goals
+ ### make sure OPNFV works......
+ </section>
+ <section data-markdown>
+ ## so concretely...
+ * Validate scenarios for the release
+ * Give confidence on OPNFV fresh releases
+ * Ensure consistancy towards installers
+ * Ensure End to End interoperability
+ </section>
+ <section data-markdown>
+ ## and also
+ * Provide functional test suites to be replayed
+ * ~ post install sanity check
+ * usable for plugfests
+ * coherent with ETSI and Telco needs
+ * Provide test tools
+ * run tests
+ * collect info
+ * create dashboard
+ </section>
+ <section data-markdown>
+ ## Our goals are not....
+ * Performance testing (yardstick, Xperf )
+ * Re-do tests done in specific projects
+ * storage/storeperf
+ * infra audit/qtip
+ * Compare results
+ </section>
+
+ <section data-markdown>
+ ## Our rules
+ * Re-use as much as possible upstream suites (Rally, Tempest, Robot, testOn..)
+ * Keep it simple...
+ * Automate (if not it is not a test...)
+ * Create new suites only if tests not covered
+ * Consider fields not addressed by existing test projects
+ </section>
+
+ <section data-markdown>
+ ## Our rules
+ * Installer neutral
+ * Controller neutral
+ * Black box approach
+ </section>
+
+ </section>
+
+ <section>
+ <section data-markdown>
+ # Arno
+ </section>
+ <section data-markdown>
+ ## Proof of concept
+ * 4 Testcases: vPing (userdata), Tempest, Rally, ODL
+ * 1 scenario: os-odl_l2-nofeature-ha
+ * 2 installers: Foreman/Fuel
+ * Lots of manual operations (reporting, documentation)
+ </section>
+ </section>
+ <section>
+ <section data-markdown>
+ # Brahmaputra
+ </section>
+ <section data-markdown>
+ ## More everything....
+ * 7 Testcases: vPing (ssh), ONOS, vIMS, Tempest and Rally extended
+ * 3 feature projects: doctor, promise, sdnvpn
+ * 13 Scenarios
+ * 4 Installers (Apex, Compass, Fuel, Joid)
+ * Test result collection
+ * Automatic dashboard
+ </section>
+ <section>
+ <h3>Jiras</h3>
+ <img height="200" data-src="../img/jiras.png" alt="Jiras">
+ <img height="200" data-src="../img/jiras2.png" alt="Jiras">
+ </section>
+
+ <section>
+ <h3>Brahmaputra Scenario matrix</h3>
+ <img width="800" data-src="../img/matrix.png" alt="Jiras">
+ </section>
+
+ <section>
+ Comparison odl_l2-nofeature-noha scenario
+ <table>
+ <thead>
+ <tr>
+ <th>Project</th>
+ <th>Apex</th>
+ <th>Compass</th>
+ <th>Fuel</th>
+ <th>Joid</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>POD</td>
+ <td>LF POD1</td>
+ <td>Huawei US</td>
+ <td>Ericsson POD2</td>
+ <td>Orange POD2</td>
+ </tr>
+ <tr>
+ <td>Functest</td>
+ <td>2h50</td>
+ <td>1h45</td>
+ <td>2h35</td>
+ <td>2h30</td>
+ </tr>
+ <tr>
+ <td>Yardstick</td>
+ <td>1h05</td>
+ <td>1h00</td>
+ <td>1h00</td>
+ <td>0h55</td>
+ </tr>
+ </tbody>
+ </table>
+ * difference of duration due to POD and test suites
+ </section>
+
+ <section data-markdown>
+ ## Lessons learned
+ * Tempest:
+ * Rally:
+ * vIMS: complete but complex test case, very interesting to automate (pre MANO, most of Telco needs met there)
+ </section>
+
+ </section>
+
+ <section>
+ <section data-markdown>
+ # Colorado
+ </section>
+
+ <section data-markdown>
+ ## What's new?
+ * Slicing of the tests (healthcheck / Smoke / SDN controllers / Features / VNFs)
+ * Test duration management
+ * New test cases: healthcheck, security
+ * Refactoring (API, structure)
+ * ARM Support
+ * Automatic reporting
+ * Dashboard evolution to ELK
+ * CLI
+ </section>
+
+ <section>
+ <h3>Automatic reporting</h3>
+ <img height="400" data-src="../img/reporting.png" alt="Reporting">
+ <br><a href="http://testresults.opnfv.org/reporting/functest/release/master/index-status-fuel.html">Validated scenarios for Colorado</a>
+ </section>
+
+ </section>
+
+ <section>
+ <section data-markdown>
+ # Many rivers to cross
+ ## Functest beyond Colorado
+ </section>
+ <section data-markdown>
+ ## More test cases
+ * New controler: OpenContrail
+ * New feature projects
+ * New VNFs (vEPC, vCDN, vWhatever...)
+ * Multi sites (e.g bgpvpn with different back ends)
+ </section>
+ <section data-markdown>
+ ## A Functional testing As a Service framework
+ * Scenarios can select their relevant test cases
+ * Test duration estimation
+ * Agile dashboarding
+ * Analytics
+ </section>
+ <section data-markdown>
+ ## Upstream
+ * Rally
+ * Functest description for ETSI?
+ </section>
+ </section>
+
+ <section>
+ <h3>Thank you</h3>
+ <img width="600" data-src="../img/colorado.png" alt="tests">
+ </section>
+
+ </div>
+ <div class='footer'>
+ <img src="../img/logo-OPNFV.png" alt="OPNFV logo">
+ </div>
+ </div>
+
+ <script src="../lib/js/head.min.js"></script>
+ <script src="../js/reveal.js"></script>
+
+ <script>
+
+ // Full list of configuration options available at:
+ // https://github.com/hakimel/reveal.js#configuration
+ Reveal.initialize({
+ controls: true,
+ progress: true,
+ history: true,
+ center: true,
+
+ transition: 'slide', // none/fade/slide/convex/concave/zoom
+
+ // Optional reveal.js plugins
+ dependencies: [
+ { src: '../lib/js/classList.js', condition: function() { return !document.body.classList; } },
+ { src: '../plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
+ { src: '../plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
+ { src: '../plugin/highlight/highlight.js', async: true, condition: function() { return !!document.querySelector( 'pre code' ); }, callback: function() { hljs.initHighlightingOnLoad(); } },
+ { src: '../plugin/zoom-js/zoom.js', async: true },
+ { src: '../plugin/notes/notes.js', async: true }
+ ]
+ });
+
+ </script>
+
+ </body>
+</html>