<div dir="ltr"><div>Hi everyone,</div><div><br></div><div><span class="gmail-mceItemHidden"><span></span>Keeping track of ongoing progress and how much more work different areas need is important.  <span class="gmail-mceItemHidden">I've found</span> the new </span><a href="https://health.graphics/quantum/">Firefox Health Dashboards</a><span class="gmail-mceItemHidden"><span></span> that Harald Kirschner and the team <span class="gmail-mceItemHidden">have worked</span>
 on extremely helpful.  You can see the status of the ongoing work on 
the various areas on the Quantum project there, including the Quantum 
Flow project.</span></div><div> <br></div><div><span class="gmail-mceItemHidden"><span></span>The other charts that I'<span class="gmail-mceItemHidden"><span class="gmail-hiddenSuggestion">ve been watching</span></span> are the </span><a href="https://github.com/WebKit/webkit/tree/master/PerformanceTests/Speedometer"><span class="gmail-mceItemHidden"><span></span>Speedometer <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">v2</span></span></span></a> benchmark charts (<a href="https://arewefastyet.com/#machine=17&view=breakdown&suite=speedometer-misc">32-bit</a> and <a href="https://arewefastyet.com/#machine=35&view=breakdown&suite=speedometer-misc">64-bit</a>
 Windows).  We are actively working on improving our score on this 
benchmark.  In case you haven't heard about this benchmark before, it 
runs a number of simulated user actions in the <a href="http://todomvc.com/"><span class="gmail-mceItemHidden"><span></span><span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">TodoMVC</span></span> app</span></a>
 written in a number of popular JS frameworks/dialects and computes a 
score based on that.  It mostly examines the JavaScript engine of the 
browser but since it reals the code in the real browser environment it 
ends up examining other parts of the browser (DOM, layout, graphics, 
etc.) to certain extents too.  If you would like to keep up with our 
progress on this benchmark, one nice way is to follow the tracker bug 
for the optimization work around this.</div><div> <br></div><div>One 
important project that is now starting to get to bear fruit is the 
refactoring of Gecko's event queue.  See the following diagram which I 
borrowed from this <a href="https://www.icloud.com/keynote/0hmu8sUZRot_9XJACva_hdnKA#DocGroup%5FLabeling%5Fin%5FQuantum%5FDOM"><span class="gmail-mceItemHidden"><span></span><span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">brownbag</span></span> talk</span></a> about Quantum DOM.</div><div> <br></div><div><a href="http://ehsanakhgari.org/wp-content/uploads/2017/06/Screenshot_2017-06-01_23-08-52.png"><img class="gmail-aligncenter gmail-wp-image-1545 gmail-size-large" src="http://ehsanakhgari.org/wp-content/uploads/2017/06/Screenshot_2017-06-01_23-08-52-1024x765.png" alt="" width="605" height="452"></a><br> ​<br><span class="gmail-mceItemHidden"><span></span>
 ​​The basic idea is that we want to process events with a different 
order depending on their type, but we don't want to change the 
respective ordering of the events of the same type.  This will allow 
Gecko to serve requests to paint pages and handle user <span class="gmail-mceItemHidden"><span class="gmail-hiddenSuggestion">input</span></span> events first, and then process other things like scripts, DOM events, timer <span class="gmail-hiddenSpellError">callbacks</span>,
 network events, etc., and finally when there is no other immediate work
 of higher priority to be done, low priority work such as garbage and 
cycle collection and idle <span class="gmail-hiddenSpellError">callbacks</span> are run.  This is now mostly finished (except for </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1351148"><span class="gmail-mceItemHidden"><span></span>high priority <span class="gmail-mceItemHidden"><span class="gmail-hiddenSuggestion">input</span></span> events</span></a><span class="gmail-mceItemHidden"><span></span>), and we have already started porting a few things to run as idle <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">callbacks</span></span>!  This part of Quantum DOM will hopefully be part of Firefox 55.</span></div><div> <br></div><div><span class="gmail-mceItemHidden"><span></span>The idle <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">callbacks</span></span> are a great programming utility for asynchronous <span class="gmail-hiddenSpellError">callbacks</span> that you would like to run with a low priority and without them interfering with important work.  These are already </span><a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/requestIdleCallback">exposed to web pages</a><span class="gmail-mceItemHidden"><span></span>.  In C++, you can schedule such <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">callbacks</span></span> using the NS_IdleDispatchToCurrentThread() API.  In Chrome JS, the is the <span class="gmail-hiddenSuggestion">equivalent</span>
 nsIThread.idleDispatch() method.  We will soon write some more thorough
 documentation on how this can be used in both Gecko and browser code.  
We now have a lot of bugs on file which can use idle dispatch as a 
solution or mitigation, so this will be a useful trick for people to get
 familiar with.</span><code></code></div><div> <br></div><div><span class="gmail-mceItemHidden"><span></span>Last week, we had a small work week at the Toronto office.  The week was more focused on bug fixing than <span class="gmail-mceItemHidden">long-term</span> planning (we only have around 16 more weeks of development time on <span class="gmail-hiddenSpellError">mozilla-central</span> for Firefox 57 after all!) so you can probably see more of the progress on the </span><a href="https://people-mozilla.org/%7Ecpeterson/bb/burndown.html?whiteboard=[qf:p1]&Since=2017-01-01"><span class="gmail-mceItemHidden"><span></span><span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">burndown</span></span> chart</span></a><span class="gmail-mceItemHidden"><span></span>.  We had a big triage on the last day where we went through most of the [<span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">qf</span></span>:<span class="gmail-hiddenSpellError">p1</span>]
 bugs and removed a number of them from the set which were now no longer
 high priority issues or issues we had no realistic hopes of being able 
to fix in the 57 timeframe given the staffing available.</span></div><div> <br></div><div>Now
 as always it's time to recognize the efforts of many of you who have 
helped make Firefox faster in the past 2 weeks.  Apologies in advance to
 those whose contributions I'm forgetting to acknowledge here.</div><ul id="gmail-docs-internal-guid-a4b68691-66e1-331e-5627-604c583e2ce2"><li dir="ltr"><p dir="ltr"><span class="gmail-mceItemHidden"><span></span>Olli <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">Pettay</span></span> </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1366250">made it so that we can avoid a layout flush</a><span class="gmail-mceItemHidden"><span></span> if JavaScript attempts to focus() and element that is already focused.  This provides some <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">speedups</span></span> on the Speedometer <span class="gmail-hiddenSpellError">V2</span> benchmark! He also made us </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1367552">free the memory consumed by DOM elements only at idle priority of the main thread event loop</a>.</p></li><li dir="ltr"><p dir="ltr"><span class="gmail-mceItemHidden"><span></span>Michael <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">Layzell</span></span> </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1348401"><span class="gmail-mceItemHidden"><span></span>removed the <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">PPrinting</span></span>::<span class="gmail-hiddenSpellError">ShowProgress</span> synchronous IPC message</span></a><span class="gmail-mceItemHidden"><span></span>. It’s great to see the <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">whitelist</span></span> of sync IPC messages shrinking!  He also landed a </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1365719">telemetry probe for measuring how long we spend processing synchronous IPC messages</a><span class="gmail-mceItemHidden"><span></span>.
  This will be helpful for those remaining sync IPC messages where we’re
 wondering whether the processing side of the IPC message is taking a 
long time to finish or whether the overhead of the message dispatch is 
the slowing <span class="gmail-mceItemHidden"><span class="gmail-hiddenSuggestion">factor</span></span>.</span></p></li><li dir="ltr"><p dir="ltr">Shih-Chiang Chien <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1363421"><span class="gmail-mceItemHidden"><span></span><span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">lazified</span></span> the loading of UserAgentOverrides.jsm until the first network connection is made</span></a><span class="gmail-mceItemHidden"><span></span> <span class="gmail-mceItemHidden"><span class="gmail-hiddenSuggestion">in order to</span></span> improve startup speed.</span></p></li><li dir="ltr"><p dir="ltr">Florian removed some main thread IO during early startup caused by <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1363398">accidentally causing a DLL to load to get the localized display name of our crash reporting folder</a>.  He also <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1358798"><span class="gmail-mceItemHidden"><span></span>wrote a test to <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">whitelist</span></span> and blacklist JavaScript code</span></a> that is run early during start-up.</p></li><li dir="ltr"><p dir="ltr"><span class="gmail-mceItemHidden"><span></span>André <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">Bargull</span></span> </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1365650"><span class="gmail-mceItemHidden"><span></span>improved <span class="gmail-mceItemHidden"><span class="gmail-hiddenGrammarError">the performance of</span></span> initializing default JS <span class="gmail-hiddenSpellError">Intl</span> objects</span></a><span class="gmail-mceItemHidden"><span></span>.  He also made some improvements to <span class="gmail-mceItemHidden"><span class="gmail-hiddenGrammarError">the performance of</span></span> </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1366696">RegExp.prototype.@@split and RegExp.prototype.@@replace</a>.</p></li><li dir="ltr"><p dir="ltr"><span class="gmail-mceItemHidden"><span></span>Boris <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">Zbarsky</span></span> </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1364360">made calling Element.scrollTop = 0; a lot cheaper</a> by avoiding an unnecessary synchronous layout flush.</p></li><li dir="ltr"><p dir="ltr"><span class="gmail-mceItemHidden"><span></span><span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">Dão</span></span> Gottwald </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1358453">changed the tab strip scrolling code</a> to flush once instead of once per ‘scroll’ event.  He also <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1362542">removed a layout flush</a> that used to occur when clicking on the “List all tabs” button in the tab bar.</p></li><li dir="ltr"><p dir="ltr"><span class="gmail-mceItemHidden"><span></span><span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">Alessio</span></span> <span class="gmail-hiddenSpellError">Placitelli</span> </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1359031">ensured Telemetry doesn’t initialize the search service</a> before first paint.</p></li><li dir="ltr"><p dir="ltr"><span class="gmail-mceItemHidden"><span></span>Felipe <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">Gomes</span></span> made us </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1337043#c62"><span class="gmail-mceItemHidden"><span></span>skip <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">nsURLClassifier</span></span> initialization for about: loads</span></a>, causing a start-up perf improvement.</p></li><li dir="ltr"><p dir="ltr">Ting-Yu Chou <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=816784">made it far less expensive</a> to clean up closed tabs and windows.</p></li><li dir="ltr"><p dir="ltr">Will Wang <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1356605"><span class="gmail-mceItemHidden"><span></span>reduced the cost of initializing <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">SessionCookies</span></span></span></a> for improved start-up time.</p></li><li dir="ltr"><p dir="ltr"><span class="gmail-mceItemHidden"><span></span>Mats <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">Palmgren</span></span> </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1359341"><span class="gmail-mceItemHidden"><span></span>improved our <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">reflow</span></span> performance</span></a> on <a href="http://pastebin.com">pastebin.com</a>.  He also <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1364805"><span class="gmail-mceItemHidden"><span></span><span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">devirtualuized</span></span> various <span class="gmail-hiddenSpellError">nsIFrame</span> members</span></a> (including <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1362886"><span class="gmail-mceItemHidden"><span></span><span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">nsIFrame</span></span>::<span class="gmail-hiddenSpellError">IsLeaf</span>()</span></a> which took a lot of effort), which contributed some Speedometer improvements.</p></li><li dir="ltr"><p dir="ltr"><span class="gmail-mceItemHidden"><span></span><span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">Makoto</span></span> Kato </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1358025">removed support for undoing setting HTMLInputElement.value and HTMLTextAreaElement.value through JavaScript</a><span class="gmail-mceItemHidden"><span></span>.  This improves <span class="gmail-mceItemHidden"><span class="gmail-hiddenGrammarError">the performance of</span></span> doing so in script, and isn’t something that other browser engines support doing.  He also </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1366218"><span class="gmail-mceItemHidden"><span></span><span class="gmail-mceItemHidden"><span class="gmail-hiddenSuggestion">utilized</span></span> an existing fast path in <span class="gmail-hiddenSpellError">HTMLInputElement</span></span></a> further improving the speed of setting the value property.</p></li><li dir="ltr"><p dir="ltr">David Baron <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1367830">made the hidden window inactive by default</a>, which should help improve start-up time.</p></li><li dir="ltr"><p dir="ltr"><span class="gmail-mceItemHidden"><span></span>Marco <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">Bonardo</span></span> </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1361322"><span class="gmail-mceItemHidden"><span></span>made it so that the <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">favicon</span></span> database isn’t opened on startup to check for corrupt-ness</span></a>, which should help improve start-up time for existing profiles.</p></li><li dir="ltr"><p dir="ltr"><span class="gmail-mceItemHidden"><span></span>Andreas <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">Farre</span></span> </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1353206"><span class="gmail-mceItemHidden"><span></span>exposed <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">requestIdleCallback</span></span> to non-DOM JS execution contexts</span></a><span class="gmail-mceItemHidden"><span></span>!
 This will help our front-end engineers schedule main thread jobs using a
 more intelligent mechanism.  He also, with some help from Olli <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">Pettay</span></span>, ensured that </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1311425"><span class="gmail-mceItemHidden"><span></span>idle <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">callbacks</span></span> do not run when we are about to fire a timer</span></a><span class="gmail-mceItemHidden"><span></span>.  This is important to <span class="gmail-mceItemHidden"><span class="gmail-hiddenSuggestion">ensure</span></span> that those <span class="gmail-hiddenSpellError">callbacks</span> cannot interfere with higher priority timers that may be about to fire.  He also enabled </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1355311"><span class="gmail-mceItemHidden"><span></span>throttling of <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">timeouts</span></span> scheduled by tracking scripts by default</span></a>.  This should help reduce the overhead of pages left open in background tabs.</p></li><li dir="ltr"><p dir="ltr">Bas Schouten <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1367906">avoided some display list construction overhead for backgrounds of elements without rounded borders</a>.</p></li><li dir="ltr"><p dir="ltr">Morris Tseng made <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=929484">table frames get they own display items</a>.</p></li><li dir="ltr"><p dir="ltr">Mike Conley <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1362866">got rid of some unnecessary focus changes</a> during tab switching.</p></li><li dir="ltr"><p dir="ltr"><span class="gmail-mceItemHidden"><span></span><span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">Nihanth</span></span> <span class="gmail-hiddenSpellError">Subramanya</span> </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1367450"><span class="gmail-mceItemHidden"><span></span>moved <span class="gmail-mceItemHidden"><span class="gmail-hiddenGrammarError">the initialization of</span></span> Captive Portal detection so that it no longer blocks first paint</span></a>, which should help to improve start-up time.</p></li><li dir="ltr"><p dir="ltr">David Keeler <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1366100"><span class="gmail-mceItemHidden"><span></span>disabled <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">OCSP</span></span> verification for DV TLS certificates on Nightly</span></a><span class="gmail-mceItemHidden"><span></span>.  Currently Firefox is the only major browser that support <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">OCSP</span></span>
 verification by contacting the CA’s OCSP server during TLS handshake 
and our telemetry data suggests that this is a major source of slowness 
during the <span class="gmail-hiddenSuggestion">initial</span> TLS handshake.</span></p></li><li dir="ltr"><p dir="ltr">Doug Thayer made <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1353029">PDF.js propagate its enabled state asynchronously instead of using synchronous IPC to query it from the content process</a>.</p></li><li dir="ltr"><p dir="ltr"><span class="gmail-mceItemHidden"><span></span>Nicholas <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">Nethercote</span></span> </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1347274"><span class="gmail-mceItemHidden"><span></span>reduced the locking overhead that the Gecko <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">Profiler</span></span> macros</span></a><span class="gmail-mceItemHidden"><span></span> used for <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">profiler</span></span> labels and such introduce, which reduces the overhead of these macros even when the <span class="gmail-hiddenSpellError">profiler</span> isn’t running.</span></p></li><li dir="ltr"><p dir="ltr"><span class="gmail-mceItemHidden"><span></span>Jan de <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">Mooij</span></span> </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1368509">generalized baseline JIT type update stubs</a>, allowing us deal better with polymorphic code.  In addition, he made <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1363054">type monitor stubs work with unknown objects/values</a>.  He also ensured <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1368461">most RegExp objects are allocated in the incremental GC nursery</a> to avoid requiring a full GC to collect them.  He also <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1364345">made Array.prototype.splice() be O(1)</a>.</p></li><li dir="ltr"><p dir="ltr">Thomas Nguyen <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1361699"><span class="gmail-mceItemHidden"><span></span>removed a delay to loading web page content when <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">safebrowsing</span></span> data files are being downloaded in the background</span></a>.</p></li><li dir="ltr"><p dir="ltr">Jonathan Kew made <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1365982"><span class="gmail-mceItemHidden"><span></span>each frame’s properties be attached to itself <span class="gmail-mceItemHidden"><span class="gmail-hiddenSuggestion">rather than</span></span> all be stored in a shared <span class="gmail-hiddenSpellError">hashtable</span></span></a>.</p></li><li dir="ltr"><p dir="ltr">Kershaw Chang <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1312515"><span class="gmail-mceItemHidden"><span></span>lowered <span class="gmail-mceItemHidden"><span class="gmail-hiddenGrammarError">the priority of</span></span> HTTP requests coming from tracking scripts</span></a>.</p></li><li dir="ltr"><p dir="ltr"><span class="gmail-mceItemHidden"><span></span>Felipe <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">Gomes</span></span> </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1317856">made Flash click to play by default</a>!  I have lost count on how many years this has been in the works!</p></li><li dir="ltr"><p dir="ltr"><span class="gmail-mceItemHidden"><span></span><span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">Masayuki</span></span> <span class="gmail-hiddenSpellError">Nakano</span> </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1339543"><span class="gmail-mceItemHidden"><span></span>removed the <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">PBrowser</span></span>::Msg_RequestNativeKeyBindings synchronous IPC message</span></a>.</p></li></ul><ul><li><span class="gmail-mceItemHidden"><span></span>Kris <span class="gmail-mceItemHidden"><span class="gmail-hiddenSpellError">Maglione</span></span>
 took his off-thread script decoding infrastructure designed to improve 
startup performance to a new level!  You may remember this setup was </span><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1359653">introduced</a> just recently, and now Kris <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1364974">taught it how to decode multiple scripts at a time</a>,
 to save the cost of off-thread script decoding setup per script.  It 
should be obvious in the graph below from ts_paint measurements when the
 patches landed!</li></ul><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline"><img src="https://lh4.googleusercontent.com/6YKfQ481wzXh5KMCCDd86gFsfHFjrtMXfQ_KnFk-fvTSqMFllHjPurktTWmkZce8BPVxKgz3GkbP270O04EoIroGrkr2TI1gna3vbV1L_UJYv5cJVBoIJKhqYGr4Ycdp5SSPfhK7" style="border-width: medium; border-style: none; border-color: currentcolor; border-image: none; transform: rotate(0rad);" width="602" height="217"></span><div><br></div><div>Cheers,<br></div><div>-- <br><div class="gmail-m_-7803447070676956464gmail_signature"><div dir="ltr">Ehsan<br></div></div>
</div></div>