load libraries
Load 10x Visium
dataset
InstallData("stxBrain")
trying URL 'http://seurat.nygenome.org/src/contrib/stxBrain.SeuratData_0.1.2.tar.gz'
Content type 'application/octet-stream' length 142661912 bytes (136.1 MB)
==================================================
downloaded 136.1 MB
The downloaded source packages are in
‘/tmp/RtmpsJDVnL/downloaded_packages’
brain <- LoadData("stxBrain", type = "anterior1")
Data preprocessing
plot1 <- VlnPlot(brain, features = "nCount_Spatial", pt.size = 0.1) + NoLegend()
plot2 <- SpatialFeaturePlot(brain, features = "nCount_Spatial") + theme(legend.position = "right")
wrap_plots(plot1, plot2)

Normalization
brain <- SCTransform(brain, assay = "Spatial", verbose = FALSE)
Gene expression
visualization
SpatialFeaturePlot(brain, features = c("Hpca", "Ttr", "Mki67"))

custom_plot <- SpatialFeaturePlot(brain, features = c("Ttr")) +
theme(legend.text = element_text(size = 0),
legend.title = element_text(size = 20),
legend.key.size = unit(1, "cm"))
custom_plot

p1 <- SpatialFeaturePlot(brain, features = "Ttr", pt.size.factor = 1)
p2 <- SpatialFeaturePlot(brain, features = "Ttr", alpha = c(0.1, 1))
p1 + p2

Dimensionality
reduction, clustering, and visualization
brain <- RunPCA(brain, assay = "SCT", verbose = FALSE)
brain <- FindNeighbors(brain, reduction = "pca", dims = 1:30)
brain <- FindClusters(brain, verbose = FALSE)
brain <- RunUMAP(brain, reduction = "pca", dims = 1:30)
Using method 'umap'
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
visualize the results
of the clustering either in UMAP space
p1 <- DimPlot(brain, reduction = "umap", label = TRUE)
p2 <- SpatialDimPlot(brain, label = TRUE, label.size = 3)
p1 + p2

visualize the results
of the clustering either in UMAP space
SpatialDimPlot(brain,
cells.highlight = CellsByIdentities(object = brain, idents = c(2, 1, 4, 3, 5, 8)),
facet.highlight = TRUE,
ncol = 3) & theme(plot.margin = unit(c(1, 1, 1, 1), "mm"))

Interactive
plotting
SpatialDimPlot(brain, interactive = TRUE)

visualize the results
of the clustering either in UMAP space
SpatialFeaturePlot(brain, features = "Ttr", interactive = TRUE)

LinkedDimPlot(brain)

Identification of
Spatially Variable Features
de_markers <- FindMarkers(brain, ident.1 = 5, ident.2 = 7)
SpatialFeaturePlot(object = brain, features = rownames(de_markers)[1:3], alpha = c(0.1, 1), ncol = 3)

FindSpatiallyVariableFeatures
brain <- FindSpatiallyVariableFeatures(brain,
features = VariableFeatures(brain)[1:1000],
selection.method = "moransi")
| | 0 % ~calculating
|+ | 1 % ~05m 08s
|+ | 2 % ~04m 48s
|++ | 3 % ~04m 47s
|++ | 4 % ~04m 42s
|+++ | 5 % ~04m 39s
|+++ | 6 % ~04m 34s
|++++ | 7 % ~04m 26s
|++++ | 8 % ~04m 19s
|+++++ | 9 % ~04m 14s
|+++++ | 10% ~04m 09s
|++++++ | 11% ~04m 07s
|++++++ | 12% ~04m 02s
|+++++++ | 13% ~04m 01s
|+++++++ | 14% ~03m 56s
|++++++++ | 15% ~03m 52s
|++++++++ | 16% ~03m 48s
|+++++++++ | 17% ~03m 47s
|+++++++++ | 18% ~03m 43s
|++++++++++ | 19% ~03m 40s
|++++++++++ | 20% ~03m 36s
|+++++++++++ | 21% ~03m 32s
|+++++++++++ | 22% ~03m 30s
|++++++++++++ | 23% ~03m 26s
|++++++++++++ | 24% ~03m 24s
|+++++++++++++ | 25% ~03m 21s
|+++++++++++++ | 26% ~03m 18s
|++++++++++++++ | 27% ~03m 15s
|++++++++++++++ | 28% ~03m 13s
|+++++++++++++++ | 29% ~03m 10s
|+++++++++++++++ | 30% ~03m 07s
|++++++++++++++++ | 31% ~03m 04s
|++++++++++++++++ | 32% ~03m 02s
|+++++++++++++++++ | 33% ~02m 58s
|+++++++++++++++++ | 34% ~02m 56s
|++++++++++++++++++ | 35% ~02m 53s
|++++++++++++++++++ | 36% ~02m 50s
|+++++++++++++++++++ | 37% ~02m 47s
|+++++++++++++++++++ | 38% ~02m 44s
|++++++++++++++++++++ | 39% ~02m 41s
|++++++++++++++++++++ | 40% ~02m 38s
|+++++++++++++++++++++ | 41% ~02m 36s
|+++++++++++++++++++++ | 42% ~02m 33s
|++++++++++++++++++++++ | 43% ~02m 30s
|++++++++++++++++++++++ | 44% ~02m 27s
|+++++++++++++++++++++++ | 45% ~02m 25s
|+++++++++++++++++++++++ | 46% ~02m 22s
|++++++++++++++++++++++++ | 47% ~02m 20s
|++++++++++++++++++++++++ | 48% ~02m 17s
|+++++++++++++++++++++++++ | 49% ~02m 14s
|+++++++++++++++++++++++++ | 50% ~02m 11s
|++++++++++++++++++++++++++ | 51% ~02m 09s
|++++++++++++++++++++++++++ | 52% ~02m 06s
|+++++++++++++++++++++++++++ | 53% ~02m 04s
|+++++++++++++++++++++++++++ | 54% ~02m 01s
|++++++++++++++++++++++++++++ | 55% ~01m 58s
|++++++++++++++++++++++++++++ | 56% ~01m 56s
|+++++++++++++++++++++++++++++ | 57% ~01m 53s
|+++++++++++++++++++++++++++++ | 58% ~01m 50s
|++++++++++++++++++++++++++++++ | 59% ~01m 47s
|++++++++++++++++++++++++++++++ | 60% ~01m 45s
|+++++++++++++++++++++++++++++++ | 61% ~01m 42s
|+++++++++++++++++++++++++++++++ | 62% ~01m 39s
|++++++++++++++++++++++++++++++++ | 63% ~01m 37s
|++++++++++++++++++++++++++++++++ | 64% ~01m 34s
|+++++++++++++++++++++++++++++++++ | 65% ~01m 31s
|+++++++++++++++++++++++++++++++++ | 66% ~01m 29s
|++++++++++++++++++++++++++++++++++ | 67% ~01m 26s
|++++++++++++++++++++++++++++++++++ | 68% ~01m 24s
|+++++++++++++++++++++++++++++++++++ | 69% ~01m 21s
|+++++++++++++++++++++++++++++++++++ | 70% ~01m 18s
|++++++++++++++++++++++++++++++++++++ | 71% ~01m 16s
|++++++++++++++++++++++++++++++++++++ | 72% ~01m 13s
|+++++++++++++++++++++++++++++++++++++ | 73% ~01m 10s
|+++++++++++++++++++++++++++++++++++++ | 74% ~01m 08s
|++++++++++++++++++++++++++++++++++++++ | 75% ~01m 05s
|++++++++++++++++++++++++++++++++++++++ | 76% ~01m 03s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~01m 00s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~57s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~55s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~52s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~50s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~47s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~44s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~42s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~39s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~36s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~34s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~31s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~29s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~26s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~23s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~21s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~18s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~16s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~13s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~10s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~08s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~05s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~03s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=04m 21s
top.features <- head(SpatiallyVariableFeatures(brain, method = "moransi"), 6)
SpatialFeaturePlot(brain, features = top.features, ncol = 3, alpha = c(0.1, 1)) &
theme(plot.margin = unit(c(1, 1, 1, 1), "mm"))

Subset out anatomical
regions
brain_sub <- subset(brain, idents = c(1, 2, 3, 4, 6, 7))
SpatialDimPlot(brain_sub, label = T, crop = T, label.size = 3) + NoLegend() +
SpatialDimPlot(brain_sub, label = T, crop = F, label.size = 3)

theme_axis_labels <- theme(axis.text.x = element_text(size = 10),
axis.text.y = element_text(size = 10),
axis.title.x = element_text(size = 10),
axis.title.y = element_text(size = 10))
SpatialDimPlot(brain_sub, label = T, label.size = 3, crop = T) + theme_axis_labels

brain_sub[["anterior1"]] <- Crop(brain_sub[["anterior1"]],
x = c(150, 500),
y = c(0, 425))
SpatialDimPlot(brain_sub, label = T) + theme_axis_labels

m <- 0.6; b <- -550
cortex_coords <- GetTissueCoordinates(brain_sub, scale = "lowres") %>%
subset(-y >= (m * x + b))
cortex <- subset(brain_sub,
cells = cortex_coords$cell)
SpatialDimPlot(cortex, label = T, label.size = 3, crop = F)

c1 <- SpatialDimPlot(cortex, images = "anterior1", crop = T, label = T)
c2 <- SpatialDimPlot(cortex, images = "anterior1", crop = F, label = T, pt.size.factor = 1, label.size = 3)
c1 + c2

Integration with
single-cell data
allen_reference <- readRDS("/brahms/shared/vignette-data/allen_cortex.rds")
LS0tCnRpdGxlOiAiU2V1cmF0IFNwYXRpYWwgVHV0b3JpYWwtU2VxdWVuY2luZyBCYXNlZCIKYXV0aG9yOiAiTmFzaXIgTWFobW9vZCBBYmJhc2kiCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IHRydWUKICAgIHRoZW1lOiBqb3VybmFsCi0tLQoKCiMgbG9hZCBsaWJyYXJpZXMKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoU2V1cmF0KQpsaWJyYXJ5KFNldXJhdERhdGEpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwYXRjaHdvcmspCmxpYnJhcnkoZHBseXIpCmBgYAoKCiMgTG9hZCAxMHggVmlzaXVtIGRhdGFzZXQKYGBge3J9CgpJbnN0YWxsRGF0YSgic3R4QnJhaW4iKQoKYnJhaW4gPC0gTG9hZERhdGEoInN0eEJyYWluIiwgdHlwZSA9ICJhbnRlcmlvcjEiKQpgYGAKCiMgRGF0YSBwcmVwcm9jZXNzaW5nCmBgYHtyfQpwbG90MSA8LSBWbG5QbG90KGJyYWluLCBmZWF0dXJlcyA9ICJuQ291bnRfU3BhdGlhbCIsIHB0LnNpemUgPSAwLjEpICsgTm9MZWdlbmQoKQoKcGxvdDIgPC0gU3BhdGlhbEZlYXR1cmVQbG90KGJyYWluLCBmZWF0dXJlcyA9ICJuQ291bnRfU3BhdGlhbCIpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikKCndyYXBfcGxvdHMocGxvdDEsIHBsb3QyKQpgYGAKIyBOb3JtYWxpemF0aW9uCmBgYHtyfQpicmFpbiA8LSBTQ1RyYW5zZm9ybShicmFpbiwgYXNzYXkgPSAiU3BhdGlhbCIsIHZlcmJvc2UgPSBGQUxTRSkKYGBgCgoKCgojIEdlbmUgZXhwcmVzc2lvbiB2aXN1YWxpemF0aW9uCmBgYHtyfQpTcGF0aWFsRmVhdHVyZVBsb3QoYnJhaW4sIGZlYXR1cmVzID0gYygiSHBjYSIsICJUdHIiLCAiTWtpNjciKSkKYGBgCgoKYGBge3J9CmN1c3RvbV9wbG90IDwtIFNwYXRpYWxGZWF0dXJlUGxvdChicmFpbiwgZmVhdHVyZXMgPSBjKCJUdHIiKSkgKyAKICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAwKSwKICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLAogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgxLCAiY20iKSkKCmN1c3RvbV9wbG90CmBgYAoKCmBgYHtyfQpwMSA8LSBTcGF0aWFsRmVhdHVyZVBsb3QoYnJhaW4sIGZlYXR1cmVzID0gIlR0ciIsIHB0LnNpemUuZmFjdG9yID0gMSkKCnAyIDwtIFNwYXRpYWxGZWF0dXJlUGxvdChicmFpbiwgZmVhdHVyZXMgPSAiVHRyIiwgYWxwaGEgPSBjKDAuMSwgMSkpCgpwMSArIHAyCmBgYAoKCgoKIyBEaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24sIGNsdXN0ZXJpbmcsIGFuZCB2aXN1YWxpemF0aW9uCmBgYHtyfQpicmFpbiA8LSBSdW5QQ0EoYnJhaW4sIGFzc2F5ID0gIlNDVCIsIHZlcmJvc2UgPSBGQUxTRSkKYnJhaW4gPC0gRmluZE5laWdoYm9ycyhicmFpbiwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjMwKQpicmFpbiA8LSBGaW5kQ2x1c3RlcnMoYnJhaW4sIHZlcmJvc2UgPSBGQUxTRSkKYnJhaW4gPC0gUnVuVU1BUChicmFpbiwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjMwKQpgYGAKCgoKCiMgdmlzdWFsaXplIHRoZSByZXN1bHRzIG9mIHRoZSBjbHVzdGVyaW5nIGVpdGhlciBpbiBVTUFQIHNwYWNlIApgYGB7cn0KcDEgPC0gRGltUGxvdChicmFpbiwgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbCA9IFRSVUUpIAoKcDIgPC0gU3BhdGlhbERpbVBsb3QoYnJhaW4sIGxhYmVsID0gVFJVRSwgbGFiZWwuc2l6ZSA9IDMpIAoKcDEgKyBwMgpgYGAKCiMgdmlzdWFsaXplIHRoZSByZXN1bHRzIG9mIHRoZSBjbHVzdGVyaW5nIGVpdGhlciBpbiBVTUFQIHNwYWNlIApgYGB7cn0KU3BhdGlhbERpbVBsb3QoYnJhaW4sCiAgICAgICAgICAgICAgIGNlbGxzLmhpZ2hsaWdodCA9IENlbGxzQnlJZGVudGl0aWVzKG9iamVjdCA9IGJyYWluLCBpZGVudHMgPSBjKDIsIDEsIDQsIDMsIDUsIDgpKSwgCiAgICAgICAgICAgICAgIGZhY2V0LmhpZ2hsaWdodCA9IFRSVUUsIAogICAgICAgICAgICAgICBuY29sID0gMykgJiB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygxLCAxLCAxLCAxKSwgIm1tIikpCmBgYAoKCiMgSW50ZXJhY3RpdmUgcGxvdHRpbmcKYGBge3J9ClNwYXRpYWxEaW1QbG90KGJyYWluLCBpbnRlcmFjdGl2ZSA9IFRSVUUpCmBgYAoKCgoKIyB2aXN1YWxpemUgdGhlIHJlc3VsdHMgb2YgdGhlIGNsdXN0ZXJpbmcgZWl0aGVyIGluIFVNQVAgc3BhY2UgCmBgYHtyfQpTcGF0aWFsRmVhdHVyZVBsb3QoYnJhaW4sIGZlYXR1cmVzID0gIlR0ciIsIGludGVyYWN0aXZlID0gVFJVRSkKYGBgCgoKCiMgCmBgYHtyfQpMaW5rZWREaW1QbG90KGJyYWluKQpgYGAKCgojIElkZW50aWZpY2F0aW9uIG9mIFNwYXRpYWxseSBWYXJpYWJsZSBGZWF0dXJlcwpgYGB7cn0KZGVfbWFya2VycyA8LSBGaW5kTWFya2VycyhicmFpbiwgaWRlbnQuMSA9IDUsIGlkZW50LjIgPSA3KQoKU3BhdGlhbEZlYXR1cmVQbG90KG9iamVjdCA9IGJyYWluLCBmZWF0dXJlcyA9IHJvd25hbWVzKGRlX21hcmtlcnMpWzE6M10sIGFscGhhID0gYygwLjEsIDEpLCBuY29sID0gMykKYGBgCgoKCiMgRmluZFNwYXRpYWxseVZhcmlhYmxlRmVhdHVyZXMKYGBge3J9CmJyYWluIDwtIEZpbmRTcGF0aWFsbHlWYXJpYWJsZUZlYXR1cmVzKGJyYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcyA9IFZhcmlhYmxlRmVhdHVyZXMoYnJhaW4pWzE6MTAwMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5tZXRob2QgPSAibW9yYW5zaSIpCgp0b3AuZmVhdHVyZXMgPC0gaGVhZChTcGF0aWFsbHlWYXJpYWJsZUZlYXR1cmVzKGJyYWluLCBtZXRob2QgPSAibW9yYW5zaSIpLCA2KQoKU3BhdGlhbEZlYXR1cmVQbG90KGJyYWluLCBmZWF0dXJlcyA9IHRvcC5mZWF0dXJlcywgbmNvbCA9IDMsIGFscGhhID0gYygwLjEsIDEpKSAmIAogIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDEsIDEsIDEsIDEpLCAibW0iKSkKYGBgCgoKCgojIFN1YnNldCBvdXQgYW5hdG9taWNhbCByZWdpb25zCmBgYHtyfQpicmFpbl9zdWIgPC0gc3Vic2V0KGJyYWluLCBpZGVudHMgPSBjKDEsIDIsIDMsIDQsIDYsIDcpKQoKU3BhdGlhbERpbVBsb3QoYnJhaW5fc3ViLCBsYWJlbCA9IFQsIGNyb3AgPSBULCBsYWJlbC5zaXplID0gMykgKyBOb0xlZ2VuZCgpICsgCiAgU3BhdGlhbERpbVBsb3QoYnJhaW5fc3ViLCBsYWJlbCA9IFQsIGNyb3AgPSBGLCBsYWJlbC5zaXplID0gMykKYGBgCgoKCgoKYGBge3J9CnRoZW1lX2F4aXNfbGFiZWxzIDwtIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpCgpTcGF0aWFsRGltUGxvdChicmFpbl9zdWIsIGxhYmVsID0gVCwgbGFiZWwuc2l6ZSA9IDMsIGNyb3AgPSBUKSArIHRoZW1lX2F4aXNfbGFiZWxzCmBgYAoKCgpgYGB7cn0KYnJhaW5fc3ViW1siYW50ZXJpb3IxIl1dIDwtIENyb3AoYnJhaW5fc3ViW1siYW50ZXJpb3IxIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gYygxNTAsIDUwMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBjKDAsIDQyNSkpCgpTcGF0aWFsRGltUGxvdChicmFpbl9zdWIsIGxhYmVsID0gVCkgKyB0aGVtZV9heGlzX2xhYmVscwpgYGAKCgoKCgpgYGB7cn0KbSA8LSAwLjY7IGIgPC0gLTU1MAoKY29ydGV4X2Nvb3JkcyA8LSBHZXRUaXNzdWVDb29yZGluYXRlcyhicmFpbl9zdWIsIHNjYWxlID0gImxvd3JlcyIpICU+JQogICAgICAgICAgICAgICAgICBzdWJzZXQoLXkgPj0gKG0gKiB4ICsgYikpCgpjb3J0ZXggPC0gc3Vic2V0KGJyYWluX3N1YiwgCiAgICAgICAgICAgICAgICAgY2VsbHMgPSBjb3J0ZXhfY29vcmRzJGNlbGwpCgpTcGF0aWFsRGltUGxvdChjb3J0ZXgsIGxhYmVsID0gVCwgbGFiZWwuc2l6ZSA9IDMsIGNyb3AgPSBGKQpgYGAKCmBgYHtyfQpjMSA8LSBTcGF0aWFsRGltUGxvdChjb3J0ZXgsIGltYWdlcyA9ICJhbnRlcmlvcjEiLCBjcm9wID0gVCwgbGFiZWwgPSBUKQpjMiA8LSBTcGF0aWFsRGltUGxvdChjb3J0ZXgsIGltYWdlcyA9ICJhbnRlcmlvcjEiLCBjcm9wID0gRiwgbGFiZWwgPSBULCBwdC5zaXplLmZhY3RvciA9IDEsIGxhYmVsLnNpemUgPSAzKQoKYzEgKyBjMgpgYGAKCgojIEludGVncmF0aW9uIHdpdGggc2luZ2xlLWNlbGwgZGF0YQpgYGB7cn0KYWxsZW5fcmVmZXJlbmNlIDwtIHJlYWRSRFMoIi9icmFobXMvc2hhcmVkL3ZpZ25ldHRlLWRhdGEvYWxsZW5fY29ydGV4LnJkcyIpCmBgYAoK