install.packages("ggplot2")
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/ggplot2_4.0.2.tar.gz'
Content type 'application/x-gzip' length 8482095 bytes (8.1 MB)
==================================================
downloaded 8.1 MB


The downloaded source packages are in
    ‘/tmp/RtmpfVUqIx/downloaded_packages’
install.packages("dplyr")
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/dplyr_1.2.1.tar.gz'
Content type 'application/x-gzip' length 1521233 bytes (1.5 MB)
==================================================
downloaded 1.5 MB


The downloaded source packages are in
    ‘/tmp/RtmpfVUqIx/downloaded_packages’
install.packages("GGally")
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/GGally_2.4.0.tar.gz'
Content type 'application/x-gzip' length 2003384 bytes (1.9 MB)
==================================================
downloaded 1.9 MB


The downloaded source packages are in
    ‘/tmp/RtmpfVUqIx/downloaded_packages’
# Infection Data Visualizations in R

# Create the data frame
infections <- c(245, 215, 2076, 5023, 189, 195, 123, 116, 3298, 430, 502, 126, 112, 67, 52, 39, 54, 2356, 6781, 120, 2389, 279, 257, 290, 234, 5689, 261, 672, 205)
ufo2010 <- c(2, 6, 2, 59, 0, 1, 1, 0, 115, 0, 0, 0, 0, 0, 0, 0, 6, 4, 2, 7, 2, 9, 2, 29, 10, 169, 1, 40, 16)
pop <- c(25101, 61912, 33341, 409061, 7481, 18675, 25581, 22286, 459598, 3915, 67197, 34365, 3911, 32122, 31459, 2311, 28350, 101482, 19005, 20679, 36745, 162812, 15927, 251417, 153920, 1554720, 16148, 305455, 37276)
df <- data.frame(infections, ufo2010, pop)

# Load necessary libraries
library(ggplot2)
library(dplyr)

# --- 1. Bar Graph: Comparing Infections and UFO Sightings ---
ggplot(df, aes(x = 1:nrow(df))) +
  geom_bar(aes(y = infections, fill = "Infections"), stat = "identity", position = "dodge") +
  geom_bar(aes(y = ufo2010, fill = "UFO Sightings (2010)"), stat = "identity", position = "dodge", alpha = 0.7) +
  scale_fill_manual("Variables", values = c("Infections" = "skyblue", "UFO Sightings (2010)" = "salmon")) +
  labs(x = "Data Point Index", y = "Count", title = "Comparison of Infections and UFO Sightings") +
  theme_minimal() +
  theme(legend.position = "top")

#The grouped bar chart is a reasonable starting point for side-by-side comparison, but using a numeric index (1–30) on the x-axis instead of a meaningful label (county, region, etc.) makes it nearly impossible for a reader to interpret the data in context. The scale disparity between infections (reaching 6,000+) and UFO sightings (near zero) is so extreme that the salmon-colored UFO bars are practically invisible — a dual-axis approach or separate panels would communicate both variables far more effectively.

# --- 2. Line Chart: Trends in Infections and Population ---
ggplot(df, aes(x = 1:nrow(df))) +
  geom_line(aes(y = infections, color = "Infections"), linewidth = 1) +
  geom_line(aes(y = pop, color = "Population"), linewidth = 1, linetype = "dashed") +
  scale_color_manual("Variables", values = c("Infections" = "green", "Population" = "purple")) +
  labs(x = "Data Point Index", y = "Count", title = "Trends in Infections and Population") +
  theme_minimal() +
  theme(legend.position = "top")

#Same scale problem here, and it's arguably worse in a line chart. The infection line (green) flatlines completely at the bottom because population values are in the hundreds of thousands to millions, dwarfing everything else. This chart is essentially showing only the population trend. A secondary y-axis or normalization (e.g., infections per 1,000 residents) is needed to make this meaningful. The dashed line style for population is a nice touch, but it can't overcome the fundamental axis issue.
# --- 3. Scatter Plot: Relationship between Population and Infections ---
ggplot(df, aes(x = pop, y = infections)) +
  geom_point(color = "blue", alpha = 0.6) +
  labs(x = "Population", y = "Number of Infections", title = "Relationship between Population and Number of Infections") +
  theme_minimal()

#This is one of the stronger visuals in the set. Mapping population on the x-axis against infections on the y-axis is conceptually sound and appropriate for exploring a potential relationship. The clustering of points near zero reveals that most areas have both low population and low infections, with a few clear outliers. Adding a regression line (geom_smooth()) would strengthen the interpretation significantly — right now the reader has to guess at the direction of the relationship.

# --- 4. Box Plot: Distribution of Infections ---
ggplot(df, aes(y = infections)) +
  geom_boxplot(fill = "lightcoral") +
  labs(y = "Number of Infections", title = "Distribution of Number of Infections") +
  theme_minimal()

#This plot has a rendering issue, the box is oriented horizontally at the bottom of the chart while the y-axis is labeled "Number of Infections," which creates a confusing mismatch. The x-axis appears to span roughly -0.4 to 0.4, which doesn't correspond to infection counts at all. Several points are flagged as outliers above 2,000, which is consistent with the data, but the overall layout makes this hard to read and interpret accurately. The axis orientation needs to be corrected.
# --- 5. Histogram: Frequency Distribution of UFO Sightings ---
ggplot(df, aes(x = ufo2010)) +
  geom_histogram(binwidth = 5, fill = "orange", color = "black", alpha = 0.7) +
  labs(x = "Number of UFO Sightings (2010)", y = "Frequency", title = "Frequency Distribution of UFO Sightings (2010)") +
  theme_minimal()

#This is actually one of the cleaner charts in the assignment. The heavy right skew is clearly visible, the vast majority of data points cluster near zero sightings, with very few observations extending toward 150+. The gold/yellow color is distinct and readable. One improvement would be to adjust the bin width for more granularity near zero, where most of the action is, and to annotate the outlier bars for context.
# --- 6. Scatter Plot: Relationship between Population and UFO Sightings ---
ggplot(df, aes(x = pop, y = ufo2010)) +
  geom_point(color = "purple", alpha = 0.6) +
  labs(x = "Population", y = "Number of UFO Sightings (2010)", title = "Relationship between Population and UFO Sightings (2010)") +
  theme_minimal()

#Structurally similar to Visual 3, and it works for the same reasons — the axes are correctly assigned and the question being asked (does population predict UFO sightings?) is valid. The one outlier at ~1.5M population and ~170 sightings is visually prominent and worth calling out. Like Visual 3, a trend line would help the reader assess the relationship. The purple color is distinct and works well here.
# --- 7. Scatter Plot: Infections vs. UFOs with Population Size ---
ggplot(df, aes(x = ufo2010, y = infections, size = pop)) +
  geom_point(alpha = 0.6, color = "maroon") +
  scale_size_continuous(name = "Population Size") +
  labs(x = "Number of UFO Sightings (2010)", y = "Number of Infections", title = "Infections vs. UFO Sightings, Size by Population") +
  theme_minimal()

#That's a smart design choice and shows a stronger grasp of multivariate visualization than the earlier charts. The legend is clean and appropriately scaled. A few things worth noting: the point in the upper left (high infections, near-zero UFO sightings) and the large bubble in the upper right (high infections, high UFO sightings, large population) are the two most interesting observations and deserve annotation or callout, they tell a story the reader currently has to hunt for. 
# --- 8. Pair Plot: Overview of Relationships ---
library(GGally)
ggpairs(df) +
  ggtitle("Pair Plot of Infections, UFO Sightings, and Population") +
  theme_minimal()

#This is the most analytically rich visual in the set. Using ggpairs() from GGally is a strong choice — it compactly shows pairwise scatter plots, density curves, and correlation coefficients all in one matrix. The standout finding is the very high correlation between UFO sightings and population (0.942***), which is far stronger than either variable's correlation with infections (~0.58–0.60). This plot essentially does the work of summarizing the whole dataset and should arguably be the centerpiece of the analysis, not the last chart.
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpgYGB7cn0KaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpCmBgYAoKCgpgYGB7cn0KaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQpgYGAKCgoKYGBge3J9Cmluc3RhbGwucGFja2FnZXMoIkdHYWxseSIpCmBgYAoKCgoKYGBge3J9CiMgSW5mZWN0aW9uIERhdGEgVmlzdWFsaXphdGlvbnMgaW4gUgoKIyBDcmVhdGUgdGhlIGRhdGEgZnJhbWUKaW5mZWN0aW9ucyA8LSBjKDI0NSwgMjE1LCAyMDc2LCA1MDIzLCAxODksIDE5NSwgMTIzLCAxMTYsIDMyOTgsIDQzMCwgNTAyLCAxMjYsIDExMiwgNjcsIDUyLCAzOSwgNTQsIDIzNTYsIDY3ODEsIDEyMCwgMjM4OSwgMjc5LCAyNTcsIDI5MCwgMjM0LCA1Njg5LCAyNjEsIDY3MiwgMjA1KQp1Zm8yMDEwIDwtIGMoMiwgNiwgMiwgNTksIDAsIDEsIDEsIDAsIDExNSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNiwgNCwgMiwgNywgMiwgOSwgMiwgMjksIDEwLCAxNjksIDEsIDQwLCAxNikKcG9wIDwtIGMoMjUxMDEsIDYxOTEyLCAzMzM0MSwgNDA5MDYxLCA3NDgxLCAxODY3NSwgMjU1ODEsIDIyMjg2LCA0NTk1OTgsIDM5MTUsIDY3MTk3LCAzNDM2NSwgMzkxMSwgMzIxMjIsIDMxNDU5LCAyMzExLCAyODM1MCwgMTAxNDgyLCAxOTAwNSwgMjA2NzksIDM2NzQ1LCAxNjI4MTIsIDE1OTI3LCAyNTE0MTcsIDE1MzkyMCwgMTU1NDcyMCwgMTYxNDgsIDMwNTQ1NSwgMzcyNzYpCmBgYAoKCgoKCmBgYHtyfQpkZiA8LSBkYXRhLmZyYW1lKGluZmVjdGlvbnMsIHVmbzIwMTAsIHBvcCkKCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKCiMgLS0tIDEuIEJhciBHcmFwaDogQ29tcGFyaW5nIEluZmVjdGlvbnMgYW5kIFVGTyBTaWdodGluZ3MgLS0tCmdncGxvdChkZiwgYWVzKHggPSAxOm5yb3coZGYpKSkgKwogIGdlb21fYmFyKGFlcyh5ID0gaW5mZWN0aW9ucywgZmlsbCA9ICJJbmZlY3Rpb25zIiksIHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBnZW9tX2JhcihhZXMoeSA9IHVmbzIwMTAsIGZpbGwgPSAiVUZPIFNpZ2h0aW5ncyAoMjAxMCkiKSwgc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIiwgYWxwaGEgPSAwLjcpICsKICBzY2FsZV9maWxsX21hbnVhbCgiVmFyaWFibGVzIiwgdmFsdWVzID0gYygiSW5mZWN0aW9ucyIgPSAic2t5Ymx1ZSIsICJVRk8gU2lnaHRpbmdzICgyMDEwKSIgPSAic2FsbW9uIikpICsKICBsYWJzKHggPSAiRGF0YSBQb2ludCBJbmRleCIsIHkgPSAiQ291bnQiLCB0aXRsZSA9ICJDb21wYXJpc29uIG9mIEluZmVjdGlvbnMgYW5kIFVGTyBTaWdodGluZ3MiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikKYGBgCgpgYGB7cn0KI1RoZSBncm91cGVkIGJhciBjaGFydCBpcyBhIHJlYXNvbmFibGUgc3RhcnRpbmcgcG9pbnQgZm9yIHNpZGUtYnktc2lkZSBjb21wYXJpc29uLCBidXQgdXNpbmcgYSBudW1lcmljIGluZGV4ICgx4oCTMzApIG9uIHRoZSB4LWF4aXMgaW5zdGVhZCBvZiBhIG1lYW5pbmdmdWwgbGFiZWwgKGNvdW50eSwgcmVnaW9uLCBldGMuKSBtYWtlcyBpdCBuZWFybHkgaW1wb3NzaWJsZSBmb3IgYSByZWFkZXIgdG8gaW50ZXJwcmV0IHRoZSBkYXRhIGluIGNvbnRleHQuIFRoZSBzY2FsZSBkaXNwYXJpdHkgYmV0d2VlbiBpbmZlY3Rpb25zIChyZWFjaGluZyA2LDAwMCspIGFuZCBVRk8gc2lnaHRpbmdzIChuZWFyIHplcm8pIGlzIHNvIGV4dHJlbWUgdGhhdCB0aGUgc2FsbW9uLWNvbG9yZWQgVUZPIGJhcnMgYXJlIHByYWN0aWNhbGx5IGludmlzaWJsZSDigJQgYSBkdWFsLWF4aXMgYXBwcm9hY2ggb3Igc2VwYXJhdGUgcGFuZWxzIHdvdWxkIGNvbW11bmljYXRlIGJvdGggdmFyaWFibGVzIGZhciBtb3JlIGVmZmVjdGl2ZWx5LgpgYGAKCgoKCgoKCmBgYHtyfQoKIyAtLS0gMi4gTGluZSBDaGFydDogVHJlbmRzIGluIEluZmVjdGlvbnMgYW5kIFBvcHVsYXRpb24gLS0tCmdncGxvdChkZiwgYWVzKHggPSAxOm5yb3coZGYpKSkgKwogIGdlb21fbGluZShhZXMoeSA9IGluZmVjdGlvbnMsIGNvbG9yID0gIkluZmVjdGlvbnMiKSwgbGluZXdpZHRoID0gMSkgKwogIGdlb21fbGluZShhZXMoeSA9IHBvcCwgY29sb3IgPSAiUG9wdWxhdGlvbiIpLCBsaW5ld2lkdGggPSAxLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKCJWYXJpYWJsZXMiLCB2YWx1ZXMgPSBjKCJJbmZlY3Rpb25zIiA9ICJncmVlbiIsICJQb3B1bGF0aW9uIiA9ICJwdXJwbGUiKSkgKwogIGxhYnMoeCA9ICJEYXRhIFBvaW50IEluZGV4IiwgeSA9ICJDb3VudCIsIHRpdGxlID0gIlRyZW5kcyBpbiBJbmZlY3Rpb25zIGFuZCBQb3B1bGF0aW9uIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCmBgYAoKCmBgYHtyfQojU2FtZSBzY2FsZSBwcm9ibGVtIGhlcmUsIGFuZCBpdCdzIGFyZ3VhYmx5IHdvcnNlIGluIGEgbGluZSBjaGFydC4gVGhlIGluZmVjdGlvbiBsaW5lIChncmVlbikgZmxhdGxpbmVzIGNvbXBsZXRlbHkgYXQgdGhlIGJvdHRvbSBiZWNhdXNlIHBvcHVsYXRpb24gdmFsdWVzIGFyZSBpbiB0aGUgaHVuZHJlZHMgb2YgdGhvdXNhbmRzIHRvIG1pbGxpb25zLCBkd2FyZmluZyBldmVyeXRoaW5nIGVsc2UuIFRoaXMgY2hhcnQgaXMgZXNzZW50aWFsbHkgc2hvd2luZyBvbmx5IHRoZSBwb3B1bGF0aW9uIHRyZW5kLiBBIHNlY29uZGFyeSB5LWF4aXMgb3Igbm9ybWFsaXphdGlvbiAoZS5nLiwgaW5mZWN0aW9ucyBwZXIgMSwwMDAgcmVzaWRlbnRzKSBpcyBuZWVkZWQgdG8gbWFrZSB0aGlzIG1lYW5pbmdmdWwuIFRoZSBkYXNoZWQgbGluZSBzdHlsZSBmb3IgcG9wdWxhdGlvbiBpcyBhIG5pY2UgdG91Y2gsIGJ1dCBpdCBjYW4ndCBvdmVyY29tZSB0aGUgZnVuZGFtZW50YWwgYXhpcyBpc3N1ZS4KYGBgCgoKCgpgYGB7cn0KIyAtLS0gMy4gU2NhdHRlciBQbG90OiBSZWxhdGlvbnNoaXAgYmV0d2VlbiBQb3B1bGF0aW9uIGFuZCBJbmZlY3Rpb25zIC0tLQpnZ3Bsb3QoZGYsIGFlcyh4ID0gcG9wLCB5ID0gaW5mZWN0aW9ucykpICsKICBnZW9tX3BvaW50KGNvbG9yID0gImJsdWUiLCBhbHBoYSA9IDAuNikgKwogIGxhYnMoeCA9ICJQb3B1bGF0aW9uIiwgeSA9ICJOdW1iZXIgb2YgSW5mZWN0aW9ucyIsIHRpdGxlID0gIlJlbGF0aW9uc2hpcCBiZXR3ZWVuIFBvcHVsYXRpb24gYW5kIE51bWJlciBvZiBJbmZlY3Rpb25zIikgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCgpgYGB7cn0KI1RoaXMgaXMgb25lIG9mIHRoZSBzdHJvbmdlciB2aXN1YWxzIGluIHRoZSBzZXQuIE1hcHBpbmcgcG9wdWxhdGlvbiBvbiB0aGUgeC1heGlzIGFnYWluc3QgaW5mZWN0aW9ucyBvbiB0aGUgeS1heGlzIGlzIGNvbmNlcHR1YWxseSBzb3VuZCBhbmQgYXBwcm9wcmlhdGUgZm9yIGV4cGxvcmluZyBhIHBvdGVudGlhbCByZWxhdGlvbnNoaXAuIFRoZSBjbHVzdGVyaW5nIG9mIHBvaW50cyBuZWFyIHplcm8gcmV2ZWFscyB0aGF0IG1vc3QgYXJlYXMgaGF2ZSBib3RoIGxvdyBwb3B1bGF0aW9uIGFuZCBsb3cgaW5mZWN0aW9ucywgd2l0aCBhIGZldyBjbGVhciBvdXRsaWVycy4gQWRkaW5nIGEgcmVncmVzc2lvbiBsaW5lIChnZW9tX3Ntb290aCgpKSB3b3VsZCBzdHJlbmd0aGVuIHRoZSBpbnRlcnByZXRhdGlvbiBzaWduaWZpY2FudGx5IOKAlCByaWdodCBub3cgdGhlIHJlYWRlciBoYXMgdG8gZ3Vlc3MgYXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgcmVsYXRpb25zaGlwLgpgYGAKCgoKCgoKCgpgYGB7cn0KCiMgLS0tIDQuIEJveCBQbG90OiBEaXN0cmlidXRpb24gb2YgSW5mZWN0aW9ucyAtLS0KZ2dwbG90KGRmLCBhZXMoeSA9IGluZmVjdGlvbnMpKSArCiAgZ2VvbV9ib3hwbG90KGZpbGwgPSAibGlnaHRjb3JhbCIpICsKICBsYWJzKHkgPSAiTnVtYmVyIG9mIEluZmVjdGlvbnMiLCB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgTnVtYmVyIG9mIEluZmVjdGlvbnMiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKCgoKYGBge3J9CiNUaGlzIHBsb3QgaGFzIGEgcmVuZGVyaW5nIGlzc3VlLCB0aGUgYm94IGlzIG9yaWVudGVkIGhvcml6b250YWxseSBhdCB0aGUgYm90dG9tIG9mIHRoZSBjaGFydCB3aGlsZSB0aGUgeS1heGlzIGlzIGxhYmVsZWQgIk51bWJlciBvZiBJbmZlY3Rpb25zLCIgd2hpY2ggY3JlYXRlcyBhIGNvbmZ1c2luZyBtaXNtYXRjaC4gVGhlIHgtYXhpcyBhcHBlYXJzIHRvIHNwYW4gcm91Z2hseSAtMC40IHRvIDAuNCwgd2hpY2ggZG9lc24ndCBjb3JyZXNwb25kIHRvIGluZmVjdGlvbiBjb3VudHMgYXQgYWxsLiBTZXZlcmFsIHBvaW50cyBhcmUgZmxhZ2dlZCBhcyBvdXRsaWVycyBhYm92ZSAyLDAwMCwgd2hpY2ggaXMgY29uc2lzdGVudCB3aXRoIHRoZSBkYXRhLCBidXQgdGhlIG92ZXJhbGwgbGF5b3V0IG1ha2VzIHRoaXMgaGFyZCB0byByZWFkIGFuZCBpbnRlcnByZXQgYWNjdXJhdGVseS4gVGhlIGF4aXMgb3JpZW50YXRpb24gbmVlZHMgdG8gYmUgY29ycmVjdGVkLgpgYGAKCgoKYGBge3J9CiMgLS0tIDUuIEhpc3RvZ3JhbTogRnJlcXVlbmN5IERpc3RyaWJ1dGlvbiBvZiBVRk8gU2lnaHRpbmdzIC0tLQpnZ3Bsb3QoZGYsIGFlcyh4ID0gdWZvMjAxMCkpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUsIGZpbGwgPSAib3JhbmdlIiwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNykgKwogIGxhYnMoeCA9ICJOdW1iZXIgb2YgVUZPIFNpZ2h0aW5ncyAoMjAxMCkiLCB5ID0gIkZyZXF1ZW5jeSIsIHRpdGxlID0gIkZyZXF1ZW5jeSBEaXN0cmlidXRpb24gb2YgVUZPIFNpZ2h0aW5ncyAoMjAxMCkiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKCgpgYGB7cn0KI1RoaXMgaXMgYWN0dWFsbHkgb25lIG9mIHRoZSBjbGVhbmVyIGNoYXJ0cyBpbiB0aGUgYXNzaWdubWVudC4gVGhlIGhlYXZ5IHJpZ2h0IHNrZXcgaXMgY2xlYXJseSB2aXNpYmxlLCB0aGUgdmFzdCBtYWpvcml0eSBvZiBkYXRhIHBvaW50cyBjbHVzdGVyIG5lYXIgemVybyBzaWdodGluZ3MsIHdpdGggdmVyeSBmZXcgb2JzZXJ2YXRpb25zIGV4dGVuZGluZyB0b3dhcmQgMTUwKy4gVGhlIGdvbGQveWVsbG93IGNvbG9yIGlzIGRpc3RpbmN0IGFuZCByZWFkYWJsZS4gT25lIGltcHJvdmVtZW50IHdvdWxkIGJlIHRvIGFkanVzdCB0aGUgYmluIHdpZHRoIGZvciBtb3JlIGdyYW51bGFyaXR5IG5lYXIgemVybywgd2hlcmUgbW9zdCBvZiB0aGUgYWN0aW9uIGlzLCBhbmQgdG8gYW5ub3RhdGUgdGhlIG91dGxpZXIgYmFycyBmb3IgY29udGV4dC4KYGBgCgoKCgoKYGBge3J9CiMgLS0tIDYuIFNjYXR0ZXIgUGxvdDogUmVsYXRpb25zaGlwIGJldHdlZW4gUG9wdWxhdGlvbiBhbmQgVUZPIFNpZ2h0aW5ncyAtLS0KZ2dwbG90KGRmLCBhZXMoeCA9IHBvcCwgeSA9IHVmbzIwMTApKSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICJwdXJwbGUiLCBhbHBoYSA9IDAuNikgKwogIGxhYnMoeCA9ICJQb3B1bGF0aW9uIiwgeSA9ICJOdW1iZXIgb2YgVUZPIFNpZ2h0aW5ncyAoMjAxMCkiLCB0aXRsZSA9ICJSZWxhdGlvbnNoaXAgYmV0d2VlbiBQb3B1bGF0aW9uIGFuZCBVRk8gU2lnaHRpbmdzICgyMDEwKSIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgoKCgpgYGB7cn0KI1N0cnVjdHVyYWxseSBzaW1pbGFyIHRvIFZpc3VhbCAzLCBhbmQgaXQgd29ya3MgZm9yIHRoZSBzYW1lIHJlYXNvbnMg4oCUIHRoZSBheGVzIGFyZSBjb3JyZWN0bHkgYXNzaWduZWQgYW5kIHRoZSBxdWVzdGlvbiBiZWluZyBhc2tlZCAoZG9lcyBwb3B1bGF0aW9uIHByZWRpY3QgVUZPIHNpZ2h0aW5ncz8pIGlzIHZhbGlkLiBUaGUgb25lIG91dGxpZXIgYXQgfjEuNU0gcG9wdWxhdGlvbiBhbmQgfjE3MCBzaWdodGluZ3MgaXMgdmlzdWFsbHkgcHJvbWluZW50IGFuZCB3b3J0aCBjYWxsaW5nIG91dC4gTGlrZSBWaXN1YWwgMywgYSB0cmVuZCBsaW5lIHdvdWxkIGhlbHAgdGhlIHJlYWRlciBhc3Nlc3MgdGhlIHJlbGF0aW9uc2hpcC4gVGhlIHB1cnBsZSBjb2xvciBpcyBkaXN0aW5jdCBhbmQgd29ya3Mgd2VsbCBoZXJlLgpgYGAKCgoKCgpgYGB7cn0KIyAtLS0gNy4gU2NhdHRlciBQbG90OiBJbmZlY3Rpb25zIHZzLiBVRk9zIHdpdGggUG9wdWxhdGlvbiBTaXplIC0tLQpnZ3Bsb3QoZGYsIGFlcyh4ID0gdWZvMjAxMCwgeSA9IGluZmVjdGlvbnMsIHNpemUgPSBwb3ApKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNiwgY29sb3IgPSAibWFyb29uIikgKwogIHNjYWxlX3NpemVfY29udGludW91cyhuYW1lID0gIlBvcHVsYXRpb24gU2l6ZSIpICsKICBsYWJzKHggPSAiTnVtYmVyIG9mIFVGTyBTaWdodGluZ3MgKDIwMTApIiwgeSA9ICJOdW1iZXIgb2YgSW5mZWN0aW9ucyIsIHRpdGxlID0gIkluZmVjdGlvbnMgdnMuIFVGTyBTaWdodGluZ3MsIFNpemUgYnkgUG9wdWxhdGlvbiIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgoKCgpgYGB7cn0KI1RoYXQncyBhIHNtYXJ0IGRlc2lnbiBjaG9pY2UgYW5kIHNob3dzIGEgc3Ryb25nZXIgZ3Jhc3Agb2YgbXVsdGl2YXJpYXRlIHZpc3VhbGl6YXRpb24gdGhhbiB0aGUgZWFybGllciBjaGFydHMuIFRoZSBsZWdlbmQgaXMgY2xlYW4gYW5kIGFwcHJvcHJpYXRlbHkgc2NhbGVkLiBBIGZldyB0aGluZ3Mgd29ydGggbm90aW5nOiB0aGUgcG9pbnQgaW4gdGhlIHVwcGVyIGxlZnQgKGhpZ2ggaW5mZWN0aW9ucywgbmVhci16ZXJvIFVGTyBzaWdodGluZ3MpIGFuZCB0aGUgbGFyZ2UgYnViYmxlIGluIHRoZSB1cHBlciByaWdodCAoaGlnaCBpbmZlY3Rpb25zLCBoaWdoIFVGTyBzaWdodGluZ3MsIGxhcmdlIHBvcHVsYXRpb24pIGFyZSB0aGUgdHdvIG1vc3QgaW50ZXJlc3Rpbmcgb2JzZXJ2YXRpb25zIGFuZCBkZXNlcnZlIGFubm90YXRpb24gb3IgY2FsbG91dCwgdGhleSB0ZWxsIGEgc3RvcnkgdGhlIHJlYWRlciBjdXJyZW50bHkgaGFzIHRvIGh1bnQgZm9yLiAKYGBgCgoKCgpgYGB7cn0KIyAtLS0gOC4gUGFpciBQbG90OiBPdmVydmlldyBvZiBSZWxhdGlvbnNoaXBzIC0tLQpsaWJyYXJ5KEdHYWxseSkKZ2dwYWlycyhkZikgKwogIGdndGl0bGUoIlBhaXIgUGxvdCBvZiBJbmZlY3Rpb25zLCBVRk8gU2lnaHRpbmdzLCBhbmQgUG9wdWxhdGlvbiIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgoKCgpgYGB7cn0KI1RoaXMgaXMgdGhlIG1vc3QgYW5hbHl0aWNhbGx5IHJpY2ggdmlzdWFsIGluIHRoZSBzZXQuIFVzaW5nIGdncGFpcnMoKSBmcm9tIEdHYWxseSBpcyBhIHN0cm9uZyBjaG9pY2Ug4oCUIGl0IGNvbXBhY3RseSBzaG93cyBwYWlyd2lzZSBzY2F0dGVyIHBsb3RzLCBkZW5zaXR5IGN1cnZlcywgYW5kIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50cyBhbGwgaW4gb25lIG1hdHJpeC4gVGhlIHN0YW5kb3V0IGZpbmRpbmcgaXMgdGhlIHZlcnkgaGlnaCBjb3JyZWxhdGlvbiBiZXR3ZWVuIFVGTyBzaWdodGluZ3MgYW5kIHBvcHVsYXRpb24gKDAuOTQyKioqKSwgd2hpY2ggaXMgZmFyIHN0cm9uZ2VyIHRoYW4gZWl0aGVyIHZhcmlhYmxlJ3MgY29ycmVsYXRpb24gd2l0aCBpbmZlY3Rpb25zICh+MC41OOKAkzAuNjApLiBUaGlzIHBsb3QgZXNzZW50aWFsbHkgZG9lcyB0aGUgd29yayBvZiBzdW1tYXJpemluZyB0aGUgd2hvbGUgZGF0YXNldCBhbmQgc2hvdWxkIGFyZ3VhYmx5IGJlIHRoZSBjZW50ZXJwaWVjZSBvZiB0aGUgYW5hbHlzaXMsIG5vdCB0aGUgbGFzdCBjaGFydC4KYGBgCgoKCg==