The code below visualizes data on tree cover percentage, mean hottest month temperature, and average wildfire size in the US. The tree cover percentage and mean hottest month temperature data is worldwide, but the plots are focused on the US.

Load libraries

# load packages
library(ncdf4)
library(CFtime)
library(lattice)
library(RColorBrewer)
library(abind)
library(sf)
library(stars)
library(ggplot2)
library(classInt)
library(units)

Read Natural Earth shape file

The global (Robinson) projections from http://www.naturalearthdata.com (the geography regions one)

#change path as necessary
shape_path <- "C:/Users/Louisa/geog490/data/Rmaps/source/"
regions_shapefile <- paste(shape_path, "ne_50m_geography_regions_polys/ne_50m_geography_regions_polys.shp", sep="")
regions_poly_sf <- st_read(regions_shapefile)
Reading layer `ne_50m_geography_regions_polys' from data source 
  `C:\Users\Louisa\geog490\data\Rmaps\source\ne_50m_geography_regions_polys\ne_50m_geography_regions_polys.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 522 features and 37 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -180 ymin: -89.99993 xmax: 180 ymax: 83.97999
Geodetic CRS:  WGS 84

Read and open Treecover netCDF file

# set path and filename, change as needed
tree_path <- "C:/Users/Louisa/geog490/data/cspace/"
tree_name <- "treecov.nc"  
tree_file <- paste(tree_path, tree_name, sep="")
tree <- read_ncdf(tree_file, var = "treecov")
Will return stars object with 259200 cells.
No projection information found in nc file. 
 Coordinate variable units found to be degrees, 
 assuming WGS84 Lat/Lon.
# open file
treein <- nc_open(tree_file)
print(treein)
File C:/Users/Louisa/geog490/data/cspace/treecov.nc (NC_FORMAT_CLASSIC):

     1 variables (excluding dimension variables):
        float treecov[lon,lat]   
            name: treecov
            long_name: treecov
            units: 1
            _FillValue: -9

     2 dimensions:
        lon  Size:720 
            standard_name: longitude
            long_name: longitude
            units: degrees_east
            axis: X
        lat  Size:360 
            standard_name: latitude
            long_name: latitude
            units: degrees_north
            axis: Y

    3 global attributes:
        source: UMD Tree Cover Data resampled to 0.5-degrees
        data: gl-latlong-8km-landcover.bsq.gz
        history: P.J. Bartlein, 20 Feb 2008

Convert to sf polygons

treecov_poly <- st_as_sf(tree, as_points = FALSE)

Plot treecover

Set limitations to focus on US (or other area of interest)

#reccomend trimming dataset if only looking at one place
plot(treecov_poly, xlim = c(-130, -65), ylim = c(39, 40), key.pos=1, border= NA, main = "Treecover (%)")

The treecover plot displays tree cover canopy percentage per output grid cell.

Read and open temeprature file

# set path and filename change as needed
mtemp_path <- "C:/Users/Louisa/geog490/data/cspace/"
mtemp_name <- "cru10min30_new.nc"  
mtemp_file <- paste(mtemp_path, mtemp_name, sep="")
#important to select correct variable!
mtemp <- read_ncdf(mtemp_file, var = "mtwa")
Will return stars object with 259200 cells.
No projection information found in nc file. 
 Coordinate variable units found to be degrees, 
 assuming WGS84 Lat/Lon.
# open file
tempin <- nc_open(mtemp_file)
print(tempin)
File C:/Users/Louisa/geog490/data/cspace/cru10min30_new.nc (NC_FORMAT_CLASSIC):

     4 variables (excluding dimension variables):
        float tmp[lon,lat,time]   
            units: deg_C
            missing_value: -99
            long_name: 2m air temperature
        float mtco[lon,lat]   
            units: deg_C
            missing_value: -99
            long_name: mean_temperature_coldest_month
        float mtwa[lon,lat]   
            units: deg_C
            missing_value: -99
            long_name: mean_temperture_warmest_month
        float mat[lon,lat]   
            units: deg_C
            missing_value: -99
            long_name: mean_annual_temperature

     3 dimensions:
        lon  Size:720 
            units: degrees_east
            axis: X
        lat  Size:360 
            units: degrees_north
            axis: Y
        time  Size:12 
            units: days since 1900-01-01 00:00:00.0 -0:00
            axis: T

    6 global attributes:
        title: CRU CL 2.0 -- 10min grid sampled every 0.5 degree
        institution: http://www.cru.uea.ac.uk/
        source: http://www.cru.uea.ac.uk/~markn/cru05/cru05_intro.html
        references: New et al. (2002) Climate Res 21:1-25
        history: Bartlein 16 Apr 2013
        Conventions: CF-1.0

Convert to sf points

# convert stars object to sf POINTS
tmp_pts <- st_as_sf(mtemp, as_points = TRUE)

Plot temperature

Set limitations to focus on area of interest

plot(tmp_pts, xlim = c(-130, -65), ylim = c(39, 40), pch = 15, key.pos= 1, main = "Mean Temp (C)")

The temperature plot displays the mean temperature of the warmest month in celsius.

Read and open wildfire file

# set path and filename change as needed
fire_path <- "C:/Users/Louisa/geog490/data/"
fire_name <- "us_fires.nc"  
fire_file <- paste(fire_path, fire_name, sep="")
fire <- read_ncdf(fire_file, var = "fpafod_mean_area")
Will return stars object with 6300 cells.
No projection information found in nc file. 
 Coordinate variable units found to be degrees, 
 assuming WGS84 Lat/Lon.
# open file
firein <- nc_open(fire_file)
print(firein)
File C:/Users/Louisa/geog490/data/us_fires.nc (NC_FORMAT_NETCDF4):

     2 variables (excluding dimension variables):
        float fpafod_counts[lon,lat]   (Contiguous storage)  
            units: 1
            _FillValue: 1.00000003318135e+32
            long_name: Number of fires, 1992-2013
        float fpafod_mean_area[lon,lat]   (Contiguous storage)  
            units: ha
            _FillValue: 1.00000003318135e+32
            long_name: Average Fire Size, 1992-2013

     2 dimensions:
        lon  Size:126 
            units: degrees_east
            long_name: lon
            axis: X
        lat  Size:50 
            units: degrees_north
            long_name: lat
            axis: Y

    6 global attributes:
        title: FPA-FOD Fires
        institution: USFS
        source: http://www.fs.usda.gov/rds/archive/Product/RDS-2013-0009.3/
        references: Short, K.C., 2014, Earth Syst. Sci. Data, 6, 1-27
        history: P.J. Bartlein, Thu Jan 28 13:46:10 2021
        Conventions: CF-1.6

Convert to sf points

# convert stars object to sf POINTS
fire_pts <- st_as_sf(fire, as_points = TRUE)

Plot fire

#plot fire
plot(fire_pts, pch = 15, key.pos=1, logz = TRUE, breaks = c(-1,0,.5,1,1.5,2,2.5,3,3.5), at = c(-1,0,.5,1,1.5,2,2.5,3,3.5), main = "Average Wildfire Size (ha)")

The wildfire size plot displays the average wildfire size from 1992-2013. The remaining white spots either do not fit the scale or have no data.

Filter fire

Filter by size, leaving the largest relative fires, and define variable

#filter fire- units are very important
subfire <- dplyr::filter(fire_pts, fpafod_mean_area > units::set_units(100, ha))

Plot large wildfires over regions to make it easier to compare

#plot subfires with context
plot(st_geometry(regions_poly_sf), xlim = c(-100, -80), ylim = c(30, 50))
plot(subfire, pch = 10, key.pos=1, logz = TRUE, breaks = c(-1,0,.5,1,1.5,2,2.5,3,3.5), at = c(-1,0,.5,1,1.5,2,2.5,3,3.5), col = "red", add=TRUE)

This plot displays only the areas with an average wildfire size above 100 ha.

Plot large wildfires and temperature

#plot regions, temp, regions, subfires
plot(st_geometry(regions_poly_sf), xlim = c(-100, -80), ylim = c(30, 50))
plot(tmp_pts, pch = 15, add=TRUE)
plot(st_geometry(regions_poly_sf), xlim = c(-100, -80), ylim = c(30, 50), add=TRUE)
plot(subfire, pch = 9, key.pos=1, logz = TRUE, breaks = c(-1,0,.5,1,1.5,2,2.5,3,3.5), at = c(-1,0,.5,1,1.5,2,2.5,3,3.5), col = "red", add=TRUE)

This displays the large wildfires over the warmest month’s average temperature.

Plot large wildfires and treecover

#plot regions, treecover, regions, subfire
plot(st_geometry(regions_poly_sf), xlim = c(-100, -80), ylim = c(30, 50))
plot(treecov_poly,border = NA, add=TRUE)
plot(st_geometry(regions_poly_sf), xlim = c(-100, -80), ylim = c(30, 50), add=TRUE)
plot(subfire, pch = 9, key.pos=1, logz = TRUE, breaks = c(-1,0,.5,1,1.5,2,2.5,3,3.5), at = c(-1,0,.5,1,1.5,2,2.5,3,3.5), col = "red", add=TRUE)

Displays the large wildfires over the tree cover percentage.

Conclusions

On average the large wildfires occur in mostly the west and southwest portions of the US. This pattern is similar to that of the highest temperatures, but not similar to the treecover percentage. This indicates that temperature has a greater influence on wildfires than treecover.

LS0tDQp0aXRsZTogIlRlbXBlcmF0dXJlLCBUcmVlY292ZXIsIGFuZCBXaWxkZmlyZXMgaW4gdGhlIFVTIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KVGhlIGNvZGUgYmVsb3cgdmlzdWFsaXplcyBkYXRhIG9uIHRyZWUgY292ZXIgcGVyY2VudGFnZSwgbWVhbiBob3R0ZXN0IG1vbnRoIHRlbXBlcmF0dXJlLCBhbmQgYXZlcmFnZSB3aWxkZmlyZSBzaXplIGluIHRoZSBVUy4gVGhlIHRyZWUgY292ZXIgcGVyY2VudGFnZSBhbmQgbWVhbiBob3R0ZXN0IG1vbnRoIHRlbXBlcmF0dXJlIGRhdGEgaXMgd29ybGR3aWRlLCBidXQgdGhlIHBsb3RzIGFyZSBmb2N1c2VkIG9uIHRoZSBVUy4NCg0KIyMjIExvYWQgbGlicmFyaWVzDQpgYGB7cn0NCiMgbG9hZCBwYWNrYWdlcw0KbGlicmFyeShuY2RmNCkNCmxpYnJhcnkoQ0Z0aW1lKQ0KbGlicmFyeShsYXR0aWNlKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KGFiaW5kKQ0KbGlicmFyeShzZikNCmxpYnJhcnkoc3RhcnMpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGNsYXNzSW50KQ0KbGlicmFyeSh1bml0cykNCmBgYA0KDQoNCiMjIyBSZWFkIE5hdHVyYWwgRWFydGggc2hhcGUgZmlsZQ0KVGhlIGdsb2JhbCAoUm9iaW5zb24pIHByb2plY3Rpb25zIGZyb20gaHR0cDovL3d3dy5uYXR1cmFsZWFydGhkYXRhLmNvbSAodGhlIGdlb2dyYXBoeSByZWdpb25zIG9uZSkNCmBgYHtyfQ0KI2NoYW5nZSBwYXRoIGFzIG5lY2Vzc2FyeQ0Kc2hhcGVfcGF0aCA8LSAiQzovVXNlcnMvTG91aXNhL2dlb2c0OTAvZGF0YS9SbWFwcy9zb3VyY2UvIg0KcmVnaW9uc19zaGFwZWZpbGUgPC0gcGFzdGUoc2hhcGVfcGF0aCwgIm5lXzUwbV9nZW9ncmFwaHlfcmVnaW9uc19wb2x5cy9uZV81MG1fZ2VvZ3JhcGh5X3JlZ2lvbnNfcG9seXMuc2hwIiwgc2VwPSIiKQ0KcmVnaW9uc19wb2x5X3NmIDwtIHN0X3JlYWQocmVnaW9uc19zaGFwZWZpbGUpDQoNCmBgYA0KDQojIyMgUmVhZCBhbmQgb3BlbiBUcmVlY292ZXIgbmV0Q0RGIGZpbGUNCg0KYGBge3J9DQojIHNldCBwYXRoIGFuZCBmaWxlbmFtZSwgY2hhbmdlIGFzIG5lZWRlZA0KdHJlZV9wYXRoIDwtICJDOi9Vc2Vycy9Mb3Vpc2EvZ2VvZzQ5MC9kYXRhL2NzcGFjZS8iDQp0cmVlX25hbWUgPC0gInRyZWVjb3YubmMiICANCnRyZWVfZmlsZSA8LSBwYXN0ZSh0cmVlX3BhdGgsIHRyZWVfbmFtZSwgc2VwPSIiKQ0KdHJlZSA8LSByZWFkX25jZGYodHJlZV9maWxlLCB2YXIgPSAidHJlZWNvdiIpDQoNCiMgb3BlbiBmaWxlDQp0cmVlaW4gPC0gbmNfb3Blbih0cmVlX2ZpbGUpDQpwcmludCh0cmVlaW4pDQoNCmBgYA0KDQojIyMgQ29udmVydCB0byBzZiBwb2x5Z29ucw0KYGBge3J9DQp0cmVlY292X3BvbHkgPC0gc3RfYXNfc2YodHJlZSwgYXNfcG9pbnRzID0gRkFMU0UpDQoNCmBgYA0KDQojIyMgUGxvdCB0cmVlY292ZXINClNldCBsaW1pdGF0aW9ucyB0byBmb2N1cyBvbiBVUyAob3Igb3RoZXIgYXJlYSBvZiBpbnRlcmVzdCkNCmBgYHtyfQ0KI3JlY2NvbWVuZCB0cmltbWluZyBkYXRhc2V0IGlmIG9ubHkgbG9va2luZyBhdCBvbmUgcGxhY2UNCnBsb3QodHJlZWNvdl9wb2x5LCB4bGltID0gYygtMTMwLCAtNjUpLCB5bGltID0gYygzOSwgNDApLCBrZXkucG9zPTEsIGJvcmRlcj0gTkEsIG1haW4gPSAiVHJlZWNvdmVyICglKSIpDQoNCmBgYA0KVGhlIHRyZWVjb3ZlciBwbG90IGRpc3BsYXlzIHRyZWUgY292ZXIgY2Fub3B5IHBlcmNlbnRhZ2UgcGVyIG91dHB1dCBncmlkIGNlbGwuDQoNCiMjIyBSZWFkIGFuZCBvcGVuIHRlbWVwcmF0dXJlIGZpbGUNCmBgYHtyfQ0KIyBzZXQgcGF0aCBhbmQgZmlsZW5hbWUgY2hhbmdlIGFzIG5lZWRlZA0KbXRlbXBfcGF0aCA8LSAiQzovVXNlcnMvTG91aXNhL2dlb2c0OTAvZGF0YS9jc3BhY2UvIg0KbXRlbXBfbmFtZSA8LSAiY3J1MTBtaW4zMF9uZXcubmMiICANCm10ZW1wX2ZpbGUgPC0gcGFzdGUobXRlbXBfcGF0aCwgbXRlbXBfbmFtZSwgc2VwPSIiKQ0KI2ltcG9ydGFudCB0byBzZWxlY3QgY29ycmVjdCB2YXJpYWJsZSENCm10ZW1wIDwtIHJlYWRfbmNkZihtdGVtcF9maWxlLCB2YXIgPSAibXR3YSIpDQoNCiMgb3BlbiBmaWxlDQp0ZW1waW4gPC0gbmNfb3BlbihtdGVtcF9maWxlKQ0KcHJpbnQodGVtcGluKQ0KDQpgYGANCg0KIyMjIENvbnZlcnQgdG8gc2YgcG9pbnRzDQpgYGB7cn0NCiMgY29udmVydCBzdGFycyBvYmplY3QgdG8gc2YgUE9JTlRTDQp0bXBfcHRzIDwtIHN0X2FzX3NmKG10ZW1wLCBhc19wb2ludHMgPSBUUlVFKQ0KDQpgYGANCg0KIyMjIFBsb3QgdGVtcGVyYXR1cmUNClNldCBsaW1pdGF0aW9ucyB0byBmb2N1cyBvbiBhcmVhIG9mIGludGVyZXN0DQpgYGB7cn0NCnBsb3QodG1wX3B0cywgeGxpbSA9IGMoLTEzMCwgLTY1KSwgeWxpbSA9IGMoMzksIDQwKSwgcGNoID0gMTUsIGtleS5wb3M9IDEsIG1haW4gPSAiTWVhbiBUZW1wIChDKSIpDQoNCmBgYA0KVGhlIHRlbXBlcmF0dXJlIHBsb3QgZGlzcGxheXMgdGhlIG1lYW4gdGVtcGVyYXR1cmUgb2YgdGhlIHdhcm1lc3QgbW9udGggaW4gY2Vsc2l1cy4NCg0KDQojIyMgUmVhZCBhbmQgb3BlbiB3aWxkZmlyZSBmaWxlDQpgYGB7cn0NCiMgc2V0IHBhdGggYW5kIGZpbGVuYW1lIGNoYW5nZSBhcyBuZWVkZWQNCmZpcmVfcGF0aCA8LSAiQzovVXNlcnMvTG91aXNhL2dlb2c0OTAvZGF0YS8iDQpmaXJlX25hbWUgPC0gInVzX2ZpcmVzLm5jIiAgDQpmaXJlX2ZpbGUgPC0gcGFzdGUoZmlyZV9wYXRoLCBmaXJlX25hbWUsIHNlcD0iIikNCmZpcmUgPC0gcmVhZF9uY2RmKGZpcmVfZmlsZSwgdmFyID0gImZwYWZvZF9tZWFuX2FyZWEiKQ0KDQojIG9wZW4gZmlsZQ0KZmlyZWluIDwtIG5jX29wZW4oZmlyZV9maWxlKQ0KcHJpbnQoZmlyZWluKQ0KDQpgYGANCg0KIyMjIENvbnZlcnQgdG8gc2YgcG9pbnRzDQpgYGB7cn0NCiMgY29udmVydCBzdGFycyBvYmplY3QgdG8gc2YgUE9JTlRTDQpmaXJlX3B0cyA8LSBzdF9hc19zZihmaXJlLCBhc19wb2ludHMgPSBUUlVFKQ0KDQpgYGANCg0KIyMjIFBsb3QgZmlyZQ0KYGBge3J9DQojcGxvdCBmaXJlDQpwbG90KGZpcmVfcHRzLCBwY2ggPSAxNSwga2V5LnBvcz0xLCBsb2d6ID0gVFJVRSwgYnJlYWtzID0gYygtMSwwLC41LDEsMS41LDIsMi41LDMsMy41KSwgYXQgPSBjKC0xLDAsLjUsMSwxLjUsMiwyLjUsMywzLjUpLCBtYWluID0gIkF2ZXJhZ2UgV2lsZGZpcmUgU2l6ZSAoaGEpIikNCg0KYGBgDQpUaGUgd2lsZGZpcmUgc2l6ZSBwbG90IGRpc3BsYXlzIHRoZSBhdmVyYWdlIHdpbGRmaXJlIHNpemUgZnJvbSAxOTkyLTIwMTMuIFRoZSByZW1haW5pbmcgd2hpdGUgc3BvdHMgZWl0aGVyIGRvIG5vdCBmaXQgdGhlIHNjYWxlIG9yIGhhdmUgbm8gZGF0YS4NCg0KIyMjIEZpbHRlciBmaXJlDQpGaWx0ZXIgYnkgc2l6ZSwgbGVhdmluZyB0aGUgbGFyZ2VzdCByZWxhdGl2ZSBmaXJlcywgYW5kIGRlZmluZSB2YXJpYWJsZSANCmBgYHtyfQ0KI2ZpbHRlciBmaXJlLSB1bml0cyBhcmUgdmVyeSBpbXBvcnRhbnQNCnN1YmZpcmUgPC0gZHBseXI6OmZpbHRlcihmaXJlX3B0cywgZnBhZm9kX21lYW5fYXJlYSA+IHVuaXRzOjpzZXRfdW5pdHMoMTAwLCBoYSkpDQoNCmBgYA0KDQoNCiMjIyBQbG90IGxhcmdlIHdpbGRmaXJlcyBvdmVyIHJlZ2lvbnMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gY29tcGFyZQ0KYGBge3J9DQojcGxvdCBzdWJmaXJlcyB3aXRoIGNvbnRleHQNCnBsb3Qoc3RfZ2VvbWV0cnkocmVnaW9uc19wb2x5X3NmKSwgeGxpbSA9IGMoLTEwMCwgLTgwKSwgeWxpbSA9IGMoMzAsIDUwKSkNCnBsb3Qoc3ViZmlyZSwgcGNoID0gMTAsIGtleS5wb3M9MSwgbG9neiA9IFRSVUUsIGJyZWFrcyA9IGMoLTEsMCwuNSwxLDEuNSwyLDIuNSwzLDMuNSksIGF0ID0gYygtMSwwLC41LDEsMS41LDIsMi41LDMsMy41KSwgY29sID0gInJlZCIsIGFkZD1UUlVFKQ0KDQpgYGANClRoaXMgcGxvdCBkaXNwbGF5cyBvbmx5IHRoZSBhcmVhcyB3aXRoIGFuIGF2ZXJhZ2Ugd2lsZGZpcmUgc2l6ZSBhYm92ZSAxMDAgaGEuDQoNCiMjIyBQbG90IGxhcmdlIHdpbGRmaXJlcyBhbmQgdGVtcGVyYXR1cmUgDQpgYGB7cn0NCiNwbG90IHJlZ2lvbnMsIHRlbXAsIHJlZ2lvbnMsIHN1YmZpcmVzDQpwbG90KHN0X2dlb21ldHJ5KHJlZ2lvbnNfcG9seV9zZiksIHhsaW0gPSBjKC0xMDAsIC04MCksIHlsaW0gPSBjKDMwLCA1MCkpDQpwbG90KHRtcF9wdHMsIHBjaCA9IDE1LCBhZGQ9VFJVRSkNCnBsb3Qoc3RfZ2VvbWV0cnkocmVnaW9uc19wb2x5X3NmKSwgeGxpbSA9IGMoLTEwMCwgLTgwKSwgeWxpbSA9IGMoMzAsIDUwKSwgYWRkPVRSVUUpDQpwbG90KHN1YmZpcmUsIHBjaCA9IDksIGtleS5wb3M9MSwgbG9neiA9IFRSVUUsIGJyZWFrcyA9IGMoLTEsMCwuNSwxLDEuNSwyLDIuNSwzLDMuNSksIGF0ID0gYygtMSwwLC41LDEsMS41LDIsMi41LDMsMy41KSwgY29sID0gInJlZCIsIGFkZD1UUlVFKQ0KDQpgYGANClRoaXMgZGlzcGxheXMgdGhlIGxhcmdlIHdpbGRmaXJlcyBvdmVyIHRoZSB3YXJtZXN0IG1vbnRoJ3MgYXZlcmFnZSB0ZW1wZXJhdHVyZS4NCg0KIyMjIFBsb3QgbGFyZ2Ugd2lsZGZpcmVzIGFuZCB0cmVlY292ZXIgDQoNCmBgYHtyfQ0KI3Bsb3QgcmVnaW9ucywgdHJlZWNvdmVyLCByZWdpb25zLCBzdWJmaXJlDQpwbG90KHN0X2dlb21ldHJ5KHJlZ2lvbnNfcG9seV9zZiksIHhsaW0gPSBjKC0xMDAsIC04MCksIHlsaW0gPSBjKDMwLCA1MCkpDQpwbG90KHRyZWVjb3ZfcG9seSxib3JkZXIgPSBOQSwgYWRkPVRSVUUpDQpwbG90KHN0X2dlb21ldHJ5KHJlZ2lvbnNfcG9seV9zZiksIHhsaW0gPSBjKC0xMDAsIC04MCksIHlsaW0gPSBjKDMwLCA1MCksIGFkZD1UUlVFKQ0KcGxvdChzdWJmaXJlLCBwY2ggPSA5LCBrZXkucG9zPTEsIGxvZ3ogPSBUUlVFLCBicmVha3MgPSBjKC0xLDAsLjUsMSwxLjUsMiwyLjUsMywzLjUpLCBhdCA9IGMoLTEsMCwuNSwxLDEuNSwyLDIuNSwzLDMuNSksIGNvbCA9ICJyZWQiLCBhZGQ9VFJVRSkNCg0KYGBgDQpEaXNwbGF5cyB0aGUgbGFyZ2Ugd2lsZGZpcmVzIG92ZXIgdGhlIHRyZWUgY292ZXIgcGVyY2VudGFnZS4NCg0KIyMjIENvbmNsdXNpb25zDQpPbiBhdmVyYWdlIHRoZSBsYXJnZSB3aWxkZmlyZXMgb2NjdXIgaW4gbW9zdGx5IHRoZSB3ZXN0IGFuZCBzb3V0aHdlc3QgcG9ydGlvbnMgb2YgdGhlIFVTLiBUaGlzIHBhdHRlcm4gaXMgc2ltaWxhciB0byB0aGF0IG9mIHRoZSBoaWdoZXN0IHRlbXBlcmF0dXJlcywgYnV0IG5vdCAgc2ltaWxhciB0byB0aGUgdHJlZWNvdmVyIHBlcmNlbnRhZ2UuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGVtcGVyYXR1cmUgaGFzIGEgZ3JlYXRlciBpbmZsdWVuY2Ugb24gd2lsZGZpcmVzIHRoYW4gdHJlZWNvdmVyLg0K