For the 2017 season, the ATP has unveiled a new set of graphics they use during the telecast of a match. There are surprisingly many graphcis that pop up from time to time and they all have a cohesive theme. For example, the score is always shown in a corner of the screen, there’s a summary graphic at the end of each set, there’s a summary graphic at the end of each match, and they sprinkle in interesting little tid-bits as they become relevant throughout the match – things like each players first serve percent so far in this set, the average duration of each player’s service game, etc.

That they all match is cool. But they are generally worse than the graphics used in years past. I find the ‘match summary’ graphic particularly bad:

The highest-level information is the score (6-1, 7-5) is up in the top left corner. Probably could be a little easier to find. But that’s juse the score – the goal of this graphic is to provide insight into why the winner won and the loser lost.

There are six more pieces of information: 1. First serve percent in 2. First serve percent won 3. Second serve percent won 4. Count of aces 5. Count of break points and break points won per set and total 6. Count of double faults

It’s a little confusing that part of this information is in units of percent and part of it is in units of points. And the total number of points each player served isn’t shown, which makes it impossible to convert between the two units.

From more of a “design”" standpoint, the circular bar plots compress the information into a very thin strip and then curve it around a circle. The good part about this design is that certain breakpoints like 25%, 50%, 75% and 100% are easy to identify (right, bottom, left, and top). Simply showing the numberals of the counts seems a little lazy.

Probably the biggest problem is that yelow and white aren’t that different of colors and the association between color and player is hard (for me) to remember. One signal that the color scheme isn’t working is that the word “Nadal” appears five times, and the same for “Fognini”.

I’m not the only one who doesn’t like this graphic. So I decided to try to do better.

First Idea – One Mosaic Plot per Player

My first idea was to give the top banner to overall information, then under that the winner gets the left side of the screen and the loser gets the right side. This impairs comparisons between the players, which is a major negative, but I am going to try it out to start.

Here’s an example:

library(tidyverse)
library(ggmosaic)
library(gridExtra)
library(grid)
nadal <- data_frame(serve = factor(x = rep(x = c('first serve', 'second serve', 'double fault'), times = c(70, 30, 0)),
                                     levels = c('double fault', 'second serve', 'first serve')),
                    outcome = factor(x = c(rep(x = c('ace', 'win', 'loss'), times = c(10, 48, 12)),
                                           rep(x = c('win', 'loss'), times = c(24, 6))),
                                     levels = c('ace', 'win', 'loss')))
fognini <- data_frame(serve = factor(x = rep(x = c('first', 'second', 'double fault'), times = c(49, 41, 10)),
                                     levels = c('double fault', 'second', 'first')),
                      outcome = factor(x = c(rep(x = c('ace', 'win', 'loss'), times = c(5, 30, 14)),
                                             rep(x = c('win', 'loss'), times = c(13, 28)),
                                             rep(x = 'loss', times = 10)),
                                       levels = c('ace', 'win', 'loss')))
p1 <- nadal %>%
    ggplot(mapping = aes(x = product(outcome, serve), fill = outcome)) +
    geom_mosaic() +
    coord_flip() +
    scale_fill_manual(breaks = c('ace', 'win', 'loss'), values = c('darkblue', 'blue', 'red')) +
    theme_minimal() +
    theme(legend.position = c(1.2, 1.0),
          legend.title = element_blank(),
          axis.text.x = element_blank(),
          axis.ticks = element_blank(),
          axis.title.y = element_blank(),
          panel.grid = element_blank(),
          plot.title = element_text(hjust = 0.5)) +
    ggtitle('Nadal')
p2 <- fognini %>%
    ggplot(mapping = aes(x = product(outcome, serve), fill = outcome)) +
    geom_mosaic() +
    coord_flip() +
    scale_fill_manual(breaks = c('ace', 'win', 'loss'), values = c('darkblue', 'blue', 'red')) +
    theme_minimal() +
    theme(legend.position = 'none',
          axis.text.x = element_blank(),
          axis.ticks = element_blank(),
          axis.title.y = element_blank(),
          panel.grid = element_blank(),
          plot.title = element_text(hjust = 0.5)) +
    ggtitle('Fognini')
t <- textGrob(label = 'Nadal   6 7       Start time: March 18, 2017 11:45 AM \nFognini 1 5       Duration:   1hr 48min', 
              just = 'left',
              gp = gpar(fontfamily = 'mono'))
grid.arrange(layout_matrix = matrix(data = c(1, NA, 2, 3), nrow = 2, byrow = TRUE),
             grobs = list(t, p1, p2),
             heights = c(1, 5))

You can see that I used a fixed-width font for the top bar. That’s not because I think that looks good – it’s because I want things to line up and I can’t figure out how to get tabs to render right in a textGrob. I made some assumptions about the number of points each player served to get an equivalence between the aces/doubles and the percents.

I would love to get rid of the little spaces that seem to appear for unobserved combinations (e.g. neither player had a second serve ace, but the second serve row has a thin dark blue line on the right side).

I would love to get rid of the word “double fault” on the left side of Nadal’s plot, since he didn’t double fault at all, but I don’t know how to do that.

I would love to move the players’ names a bit closer to their plots, but I don’t know how to do that.

I would love to indicate ‘ace’ with the same blue that I used for ‘win’, but with some extra layer of hash marks or something to make it clear that aces are conceptually a subset a wins.

I would love to work in information on break points, but I’m not sure how to do it.

It might be nice to scale the size of each player’s plot according to the number of points he served, but I’m not sure if that’s a good idea.

Second Idea

Sankey plot.

LS0tCnRpdGxlOiAiSW1wcm92aW5nIHRoZSBBVFAgTWF0Y2ggU3VtbWFyeSBHcmFwaGljIgphdXRob3I6IFJvYmVydCBXLiBDb3J0eQpvdXRwdXQ6IAogICAgaHRtbF9ub3RlYm9vazoKICAgICAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKLS0tCgpGb3IgdGhlIDIwMTcgc2Vhc29uLCB0aGUgQVRQIGhhcyB1bnZlaWxlZCBhIG5ldyBzZXQgb2YgZ3JhcGhpY3MgdGhleSB1c2UgZHVyaW5nIHRoZSB0ZWxlY2FzdCBvZiBhIG1hdGNoLgpUaGVyZSBhcmUgc3VycHJpc2luZ2x5IG1hbnkgZ3JhcGhjaXMgdGhhdCBwb3AgdXAgZnJvbSB0aW1lIHRvIHRpbWUgYW5kIHRoZXkgYWxsIGhhdmUgYSBjb2hlc2l2ZSB0aGVtZS4KRm9yIGV4YW1wbGUsIHRoZSBzY29yZSBpcyBhbHdheXMgc2hvd24gaW4gYSBjb3JuZXIgb2YgdGhlIHNjcmVlbiwgdGhlcmUncyBhIHN1bW1hcnkgZ3JhcGhpYyBhdCB0aGUgZW5kIG9mIGVhY2ggc2V0LCB0aGVyZSdzIGEgc3VtbWFyeSBncmFwaGljIGF0IHRoZSBlbmQgb2YgZWFjaCBtYXRjaCwgYW5kIHRoZXkgc3ByaW5rbGUgaW4gaW50ZXJlc3RpbmcgbGl0dGxlIHRpZC1iaXRzIGFzIHRoZXkgYmVjb21lIHJlbGV2YW50IHRocm91Z2hvdXQgdGhlIG1hdGNoIC0tIHRoaW5ncyBsaWtlIGVhY2ggcGxheWVycyBmaXJzdCBzZXJ2ZSBwZXJjZW50IHNvIGZhciBpbiB0aGlzIHNldCwgdGhlIGF2ZXJhZ2UgZHVyYXRpb24gb2YgZWFjaCBwbGF5ZXIncyBzZXJ2aWNlIGdhbWUsIGV0Yy4KClRoYXQgdGhleSBhbGwgbWF0Y2ggaXMgY29vbC4KQnV0IHRoZXkgYXJlIGdlbmVyYWxseSB3b3JzZSB0aGFuIHRoZSBncmFwaGljcyB1c2VkIGluIHllYXJzIHBhc3QuCkkgZmluZCB0aGUgJ21hdGNoIHN1bW1hcnknIGdyYXBoaWMgcGFydGljdWxhcmx5IGJhZDoKCiFbXShleGFtcGxlLmpwZykKClRoZSBoaWdoZXN0LWxldmVsIGluZm9ybWF0aW9uIGlzIHRoZSBzY29yZSAoNi0xLCA3LTUpIGlzIHVwIGluIHRoZSB0b3AgbGVmdCBjb3JuZXIuClByb2JhYmx5IGNvdWxkIGJlIGEgbGl0dGxlIGVhc2llciB0byBmaW5kLgpCdXQgdGhhdCdzIGp1c2UgdGhlIHNjb3JlIC0tIHRoZSBnb2FsIG9mIHRoaXMgZ3JhcGhpYyBpcyB0byBwcm92aWRlIGluc2lnaHQgaW50byB3aHkgdGhlIHdpbm5lciB3b24gYW5kIHRoZSBsb3NlciBsb3N0LgoKVGhlcmUgYXJlIHNpeCBtb3JlIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjoKMS4gIEZpcnN0IHNlcnZlIHBlcmNlbnQgaW4KMi4gIEZpcnN0IHNlcnZlIHBlcmNlbnQgd29uCjMuICBTZWNvbmQgc2VydmUgcGVyY2VudCB3b24KNC4gIENvdW50IG9mIGFjZXMKNS4gIENvdW50IG9mIGJyZWFrIHBvaW50cyBhbmQgYnJlYWsgcG9pbnRzIHdvbiBwZXIgc2V0IGFuZCB0b3RhbAo2LiAgQ291bnQgb2YgZG91YmxlIGZhdWx0cwoKSXQncyBhIGxpdHRsZSBjb25mdXNpbmcgdGhhdCBwYXJ0IG9mIHRoaXMgaW5mb3JtYXRpb24gaXMgaW4gdW5pdHMgb2YgcGVyY2VudCBhbmQgcGFydCBvZiBpdCBpcyBpbiB1bml0cyBvZiBwb2ludHMuCkFuZCB0aGUgdG90YWwgbnVtYmVyIG9mIHBvaW50cyBlYWNoIHBsYXllciBzZXJ2ZWQgaXNuJ3Qgc2hvd24sIHdoaWNoIG1ha2VzIGl0IGltcG9zc2libGUgdG8gY29udmVydCBiZXR3ZWVuIHRoZSB0d28gdW5pdHMuCgpGcm9tIG1vcmUgb2YgYSAiZGVzaWduIiIgc3RhbmRwb2ludCwgdGhlIGNpcmN1bGFyIGJhciBwbG90cyBjb21wcmVzcyB0aGUgaW5mb3JtYXRpb24gaW50byBhIHZlcnkgdGhpbiBzdHJpcCBhbmQgdGhlbiBjdXJ2ZSBpdCBhcm91bmQgYSBjaXJjbGUuClRoZSBnb29kIHBhcnQgYWJvdXQgdGhpcyBkZXNpZ24gaXMgdGhhdCBjZXJ0YWluIGJyZWFrcG9pbnRzIGxpa2UgMjUlLCA1MCUsIDc1JSBhbmQgMTAwJSBhcmUgZWFzeSB0byBpZGVudGlmeSAocmlnaHQsIGJvdHRvbSwgbGVmdCwgYW5kIHRvcCkuClNpbXBseSBzaG93aW5nIHRoZSBudW1iZXJhbHMgb2YgdGhlIGNvdW50cyBzZWVtcyBhIGxpdHRsZSBsYXp5LgoKUHJvYmFibHkgdGhlIGJpZ2dlc3QgcHJvYmxlbSBpcyB0aGF0IHllbG93IGFuZCB3aGl0ZSBhcmVuJ3QgdGhhdCBkaWZmZXJlbnQgb2YgY29sb3JzIGFuZCB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBjb2xvciBhbmQgcGxheWVyIGlzIGhhcmQgKGZvciBtZSkgdG8gcmVtZW1iZXIuCk9uZSBzaWduYWwgdGhhdCB0aGUgY29sb3Igc2NoZW1lIGlzbid0IHdvcmtpbmcgaXMgdGhhdCB0aGUgd29yZCAiTmFkYWwiIGFwcGVhcnMgZml2ZSB0aW1lcywgYW5kIHRoZSBzYW1lIGZvciAiRm9nbmluaSIuCgpbSSdtIG5vdCB0aGUgb25seSBvbmUgd2hvIGRvZXNuJ3QgbGlrZSB0aGlzIGdyYXBoaWMuXShodHRwOi8vd3d3Lm1lbnN0ZW5uaXNmb3J1bXMuY29tLzItZ2VuZXJhbC1tZXNzYWdlcy84Nzk3NzctZG8teW91LWxpa2UtbmV3LW1hdGNoLXN0YXRzLWdyYXBoaWNzLmh0bWwpClNvIEkgZGVjaWRlZCB0byB0cnkgdG8gZG8gYmV0dGVyLgoKCgojIEZpcnN0IElkZWEgLS0gT25lIE1vc2FpYyBQbG90IHBlciBQbGF5ZXIKCk15IGZpcnN0IGlkZWEgd2FzIHRvIGdpdmUgdGhlIHRvcCBiYW5uZXIgdG8gb3ZlcmFsbCBpbmZvcm1hdGlvbiwgdGhlbiB1bmRlciB0aGF0IHRoZSB3aW5uZXIgZ2V0cyB0aGUgbGVmdCBzaWRlIG9mIHRoZSBzY3JlZW4gYW5kIHRoZSBsb3NlciBnZXRzIHRoZSByaWdodCBzaWRlLgpUaGlzIGltcGFpcnMgY29tcGFyaXNvbnMgYmV0d2VlbiB0aGUgcGxheWVycywgd2hpY2ggaXMgYSBtYWpvciBuZWdhdGl2ZSwgYnV0IEkgYW0gZ29pbmcgdG8gdHJ5IGl0IG91dCB0byBzdGFydC4KCkhlcmUncyBhbiBleGFtcGxlOgoKYGBge3IsIGVjaG89VFJVRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ2dtb3NhaWMpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KGdyaWQpCgpuYWRhbCA8LSBkYXRhX2ZyYW1lKHNlcnZlID0gZmFjdG9yKHggPSByZXAoeCA9IGMoJ2ZpcnN0IHNlcnZlJywgJ3NlY29uZCBzZXJ2ZScsICdkb3VibGUgZmF1bHQnKSwgdGltZXMgPSBjKDcwLCAzMCwgMCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygnZG91YmxlIGZhdWx0JywgJ3NlY29uZCBzZXJ2ZScsICdmaXJzdCBzZXJ2ZScpKSwKICAgICAgICAgICAgICAgICAgICBvdXRjb21lID0gZmFjdG9yKHggPSBjKHJlcCh4ID0gYygnYWNlJywgJ3dpbicsICdsb3NzJyksIHRpbWVzID0gYygxMCwgNDgsIDEyKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAoeCA9IGMoJ3dpbicsICdsb3NzJyksIHRpbWVzID0gYygyNCwgNikpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoJ2FjZScsICd3aW4nLCAnbG9zcycpKSkKCmZvZ25pbmkgPC0gZGF0YV9mcmFtZShzZXJ2ZSA9IGZhY3Rvcih4ID0gcmVwKHggPSBjKCdmaXJzdCcsICdzZWNvbmQnLCAnZG91YmxlIGZhdWx0JyksIHRpbWVzID0gYyg0OSwgNDEsIDEwKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCdkb3VibGUgZmF1bHQnLCAnc2Vjb25kJywgJ2ZpcnN0JykpLAogICAgICAgICAgICAgICAgICAgICAgb3V0Y29tZSA9IGZhY3Rvcih4ID0gYyhyZXAoeCA9IGMoJ2FjZScsICd3aW4nLCAnbG9zcycpLCB0aW1lcyA9IGMoNSwgMzAsIDE0KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcCh4ID0gYygnd2luJywgJ2xvc3MnKSwgdGltZXMgPSBjKDEzLCAyOCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAoeCA9ICdsb3NzJywgdGltZXMgPSAxMCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCdhY2UnLCAnd2luJywgJ2xvc3MnKSkpCgpwMSA8LSBuYWRhbCAlPiUKICAgIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBwcm9kdWN0KG91dGNvbWUsIHNlcnZlKSwgZmlsbCA9IG91dGNvbWUpKSArCiAgICBnZW9tX21vc2FpYygpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgICBzY2FsZV9maWxsX21hbnVhbChicmVha3MgPSBjKCdhY2UnLCAnd2luJywgJ2xvc3MnKSwgdmFsdWVzID0gYygnZGFya2JsdWUnLCAnYmx1ZScsICdyZWQnKSkgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IGMoMS4yLCAxLjApLAogICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgICBnZ3RpdGxlKCdOYWRhbCcpCgoKcDIgPC0gZm9nbmluaSAlPiUKICAgIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBwcm9kdWN0KG91dGNvbWUsIHNlcnZlKSwgZmlsbCA9IG91dGNvbWUpKSArCiAgICBnZW9tX21vc2FpYygpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgICBzY2FsZV9maWxsX21hbnVhbChicmVha3MgPSBjKCdhY2UnLCAnd2luJywgJ2xvc3MnKSwgdmFsdWVzID0gYygnZGFya2JsdWUnLCAnYmx1ZScsICdyZWQnKSkgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJywKICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogICAgZ2d0aXRsZSgnRm9nbmluaScpCgp0IDwtIHRleHRHcm9iKGxhYmVsID0gJ05hZGFsICAgNiA3ICAgICAgIFN0YXJ0IHRpbWU6IE1hcmNoIDE4LCAyMDE3IDExOjQ1IEFNIFxuRm9nbmluaSAxIDUgICAgICAgRHVyYXRpb246ICAgMWhyIDQ4bWluJywgCiAgICAgICAgICAgICAganVzdCA9ICdsZWZ0JywKICAgICAgICAgICAgICBncCA9IGdwYXIoZm9udGZhbWlseSA9ICdtb25vJykpCmdyaWQuYXJyYW5nZShsYXlvdXRfbWF0cml4ID0gbWF0cml4KGRhdGEgPSBjKDEsIE5BLCAyLCAzKSwgbnJvdyA9IDIsIGJ5cm93ID0gVFJVRSksCiAgICAgICAgICAgICBncm9icyA9IGxpc3QodCwgcDEsIHAyKSwKICAgICAgICAgICAgIGhlaWdodHMgPSBjKDEsIDUpKQpgYGAKCllvdSBjYW4gc2VlIHRoYXQgSSB1c2VkIGEgZml4ZWQtd2lkdGggZm9udCBmb3IgdGhlIHRvcCBiYXIuClRoYXQncyBub3QgYmVjYXVzZSBJIHRoaW5rIHRoYXQgbG9va3MgZ29vZCAtLSBpdCdzIGJlY2F1c2UgSSB3YW50IHRoaW5ncyB0byBsaW5lIHVwIGFuZCBJIGNhbid0IGZpZ3VyZSBvdXQgaG93IHRvIGdldCB0YWJzIHRvIHJlbmRlciByaWdodCBpbiBhIGB0ZXh0R3JvYmAuCkkgbWFkZSBzb21lIGFzc3VtcHRpb25zIGFib3V0IHRoZSBudW1iZXIgb2YgcG9pbnRzIGVhY2ggcGxheWVyIHNlcnZlZCB0byBnZXQgYW4gZXF1aXZhbGVuY2UgYmV0d2VlbiB0aGUgYWNlcy9kb3VibGVzIGFuZCB0aGUgcGVyY2VudHMuCgpJIHdvdWxkIGxvdmUgdG8gZ2V0IHJpZCBvZiB0aGUgbGl0dGxlIHNwYWNlcyB0aGF0IHNlZW0gdG8gYXBwZWFyIGZvciB1bm9ic2VydmVkIGNvbWJpbmF0aW9ucyAoZS5nLiBuZWl0aGVyIHBsYXllciBoYWQgYSBzZWNvbmQgc2VydmUgYWNlLCBidXQgdGhlIHNlY29uZCBzZXJ2ZSByb3cgaGFzIGEgdGhpbiBkYXJrIGJsdWUgbGluZSBvbiB0aGUgcmlnaHQgc2lkZSkuCgpJIHdvdWxkIGxvdmUgdG8gZ2V0IHJpZCBvZiB0aGUgd29yZCAiZG91YmxlIGZhdWx0IiBvbiB0aGUgbGVmdCBzaWRlIG9mIE5hZGFsJ3MgcGxvdCwgc2luY2UgaGUgZGlkbid0IGRvdWJsZSBmYXVsdCBhdCBhbGwsIGJ1dCBJIGRvbid0IGtub3cgaG93IHRvIGRvIHRoYXQuCgpJIHdvdWxkIGxvdmUgdG8gbW92ZSB0aGUgcGxheWVycycgbmFtZXMgYSBiaXQgY2xvc2VyIHRvIHRoZWlyIHBsb3RzLCBidXQgSSBkb24ndCBrbm93IGhvdyB0byBkbyB0aGF0LgoKSSB3b3VsZCBsb3ZlIHRvIGluZGljYXRlICdhY2UnIHdpdGggdGhlIHNhbWUgYmx1ZSB0aGF0IEkgdXNlZCBmb3IgJ3dpbicsIGJ1dCB3aXRoIHNvbWUgZXh0cmEgbGF5ZXIgb2YgaGFzaCBtYXJrcyBvciBzb21ldGhpbmcgdG8gbWFrZSBpdCBjbGVhciB0aGF0IGFjZXMgYXJlIGNvbmNlcHR1YWxseSBhIHN1YnNldCBhIHdpbnMuCgpJIHdvdWxkIGxvdmUgdG8gd29yayBpbiBpbmZvcm1hdGlvbiBvbiBicmVhayBwb2ludHMsIGJ1dCBJJ20gbm90IHN1cmUgaG93IHRvIGRvIGl0LgoKSXQgbWlnaHQgYmUgbmljZSB0byBzY2FsZSB0aGUgc2l6ZSBvZiBlYWNoIHBsYXllcidzIHBsb3QgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgb2YgcG9pbnRzIGhlIHNlcnZlZCwgYnV0IEknbSBub3Qgc3VyZSBpZiB0aGF0J3MgYSBnb29kIGlkZWEuCgojIFNlY29uZCBJZGVhCgpTYW5rZXkgcGxvdC4K