1. load libraries

2. Load Seurat Object

DimPlot(All_samples_Merged,group.by = "cell_line", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T)

DimPlot(All_samples_Merged,
        group.by = "SCT_snn_res.0.9", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T)


cluster_table <- table(Idents(All_samples_Merged))


DimPlot(All_samples_Merged, group.by = "predicted.celltype.l2", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T)


library(clustree)
clustree(All_samples_Merged, prefix = "SCT_snn_res.")



DimPlot(All_samples_Merged, group.by = "predicted.celltype.l1", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)


DimPlot(All_samples_Merged, group.by = "predicted.celltype.l1", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = F)


DimPlot(All_samples_Merged, group.by = "predicted.celltype.l2", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)


DimPlot(All_samples_Merged, group.by = "predicted.celltype.l2", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = F)



DimPlot(All_samples_Merged, group.by = "predicted.celltype.l2", 
        reduction = "umap",
        label.size = 3,
        repel = T,
        label = T, label.box = T)




table(All_samples_Merged$predicted.celltype.l2, All_samples_Merged$SCT_snn_res.0.9)
                   
                       0    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18
  CD4 CTL              0    0    0    0    0    0    2    0    4    0    0    0    0    0    0    0    0    0    0
  CD4 Naive            0    0    0    0    0    0  595    0  100    0    0    1    0    0    0    0    6    0    4
  CD4 Proliferating 5124 5231 3823 2401 1748 2535    0 2547    0 1263 1329   20 1327  598   41  237    0  154    1
  CD4 TCM            978  158  501 1366   21   24 2170   22 1892  266  585 1859   41  111  406   57  235   35   61
  CD4 TEM              0    0    0    8    0    0   19    0   27    0    0   15    0    0    0    0    0    0    0
  CD8 Naive            6    0    2    0    0    0  304    0   61    0   19    0    1    3    2    0   12    0    3
  CD8 TCM              0    0    0   76    0    0  115    0  137   10    0   72    0    0    0    0    2    0    1
  CD8 TEM              0    0    0    0    0    0   27    0  182    8    0    0    0    0    0    0    0    0    0
  cDC2                 9    0  155    0    0   23    0    5    1    0   67    0    9   43    0   22    0    2    0
  dnT                  1    0    0    2    2    0    4    0   33    0    0    0    0    0    0    7   11    0    1
  gdT                  0    0    0    0    0    0    0    0   13    0    0    0    0    0    0    0    0    0    0
  HSPC               167    8  285    1    0  744    1  652    1    1   12    8  401   43    1   26    0    6    0
  ILC                  0    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0
  MAIT                 0    0    0    0    0    0    4    0   50    0    0    0    0    0    0    0    2    0    0
  NK                   0    0    0    0    0    0    0    0   91    0    0    0    0    0    0    0    0    0    1
  NK Proliferating     7   11  162   20 1971    4    0    4    0  644   10    0    0    0    0   31    0    0    0
  Treg                11    0    2    1    0    0   50    0  103    0    0    0    0    1    0   20   12    0    5

3. Data PREPERATION

DefaultAssay(All_samples_Merged) <- 'ADT'

VariableFeatures(All_samples_Merged) <- rownames(All_samples_Merged[["ADT"]])

# we will use all ADT features for dimensional reduction
# we set a dimensional reduction name to avoid overwriting the 
All_samples_Merged <- NormalizeData(All_samples_Merged, normalization.method = 'CLR', margin = 2) %>% 
  ScaleData() %>% RunPCA(reduction.name = 'apca', npcs =28, maxit = 5000)
Normalizing across cells

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~00s          
  |+                                                 | 2 % ~00s          
  |++                                                | 3 % ~00s          
  |++                                                | 4 % ~00s          
  |+++                                               | 5 % ~00s          
  |+++                                               | 6 % ~00s          
  |++++                                              | 7 % ~00s          
  |++++                                              | 8 % ~00s          
  |+++++                                             | 9 % ~00s          
  |+++++                                             | 10% ~00s          
  |++++++                                            | 11% ~00s          
  |++++++                                            | 12% ~00s          
  |+++++++                                           | 13% ~00s          
  |+++++++                                           | 14% ~00s          
  |++++++++                                          | 15% ~00s          
  |++++++++                                          | 16% ~00s          
  |+++++++++                                         | 17% ~00s          
  |+++++++++                                         | 18% ~00s          
  |++++++++++                                        | 19% ~00s          
  |++++++++++                                        | 20% ~00s          
  |+++++++++++                                       | 21% ~00s          
  |+++++++++++                                       | 22% ~00s          
  |++++++++++++                                      | 23% ~00s          
  |++++++++++++                                      | 24% ~00s          
  |+++++++++++++                                     | 25% ~00s          
  |+++++++++++++                                     | 26% ~00s          
  |++++++++++++++                                    | 27% ~00s          
  |++++++++++++++                                    | 28% ~00s          
  |+++++++++++++++                                   | 29% ~00s          
  |+++++++++++++++                                   | 30% ~00s          
  |++++++++++++++++                                  | 31% ~00s          
  |++++++++++++++++                                  | 32% ~00s          
  |+++++++++++++++++                                 | 33% ~00s          
  |+++++++++++++++++                                 | 34% ~00s          
  |++++++++++++++++++                                | 35% ~00s          
  |++++++++++++++++++                                | 36% ~00s          
  |+++++++++++++++++++                               | 37% ~00s          
  |+++++++++++++++++++                               | 38% ~00s          
  |++++++++++++++++++++                              | 39% ~00s          
  |++++++++++++++++++++                              | 40% ~00s          
  |+++++++++++++++++++++                             | 41% ~00s          
  |+++++++++++++++++++++                             | 42% ~00s          
  |++++++++++++++++++++++                            | 43% ~00s          
  |++++++++++++++++++++++                            | 44% ~00s          
  |+++++++++++++++++++++++                           | 45% ~00s          
  |+++++++++++++++++++++++                           | 46% ~00s          
  |++++++++++++++++++++++++                          | 47% ~00s          
  |++++++++++++++++++++++++                          | 48% ~00s          
  |+++++++++++++++++++++++++                         | 49% ~00s          
  |+++++++++++++++++++++++++                         | 50% ~00s          
  |++++++++++++++++++++++++++                        | 51% ~00s          
  |++++++++++++++++++++++++++                        | 52% ~00s          
  |+++++++++++++++++++++++++++                       | 53% ~00s          
  |+++++++++++++++++++++++++++                       | 54% ~00s          
  |++++++++++++++++++++++++++++                      | 55% ~00s          
  |++++++++++++++++++++++++++++                      | 56% ~00s          
  |+++++++++++++++++++++++++++++                     | 57% ~00s          
  |+++++++++++++++++++++++++++++                     | 58% ~00s          
  |++++++++++++++++++++++++++++++                    | 59% ~00s          
  |++++++++++++++++++++++++++++++                    | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 61% ~00s          
  |+++++++++++++++++++++++++++++++                   | 62% ~00s          
  |++++++++++++++++++++++++++++++++                  | 63% ~00s          
  |++++++++++++++++++++++++++++++++                  | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |++++++++++++++++++++++++++++++++++                | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
Centering and scaling data matrix

  |                                                                                                                                
  |                                                                                                                          |   0%
  |                                                                                                                                
  |==========================================================================================================================| 100%
Warning: You're computing too large a percentage of total singular values, use a standard svd instead.Warning: Requested number is larger than the number of available items (28). Setting to 28.Warning: Requested number is larger than the number of available items (28). Setting to 28.Warning: Requested number is larger than the number of available items (28). Setting to 28.Warning: Requested number is larger than the number of available items (28). Setting to 28.Warning: Requested number is larger than the number of available items (28). Setting to 28.PC_ 1 
Positive:  CD5, CD274, TCRab, CD7, CD3, CD28, CD45RO, CD26, CD44, CD62L 
       CXCR3, CD127, CD45, CCR8 
Negative:  CD25, CD30, CD2, CD95, CD45RA, CD4, CCR6, CCR4, CXCR4, CD40 
       CD19, CCR7, PD1, CCR10 
PC_ 2 
Positive:  CD45, CD44, CD45RO, CD4, CD3, CD40, CCR4, CD45RA, CD26, CD95 
       CD2, CD5, CD62L, CD28 
Negative:  CD127, CD19, PD1, CCR7, CCR10, CXCR3, CCR8, CCR6, CD7, CD274 
       CD30, CXCR4, CD25, TCRab 
PC_ 3 
Positive:  CD62L, TCRab, CD28, CD3, CD4, CXCR4, CCR7, CD45RA, CD127, CD5 
       PD1, CCR4, CD95, CD2 
Negative:  CD26, CXCR3, CD45RO, CD274, CD40, CD44, CCR10, CCR6, CD7, CD30 
       CD19, CD25, CD45, CCR8 
PC_ 4 
Positive:  CCR4, CD5, CD274, CD4, CD30, CCR6, CD44, CD28, CD25, CD45RA 
       CD19, CCR10, CXCR3, PD1 
Negative:  CD40, CD45, CD2, CD62L, CD7, CD26, CXCR4, CCR7, CD127, CD95 
       CD45RO, CCR8, CD3, TCRab 
PC_ 5 
Positive:  CD45RO, CD28, CCR8, CD26, CCR4, PD1, CD4, CCR10, CD40, CD127 
       CD19, TCRab, CD2, CCR7 
Negative:  CD7, CD45RA, CD5, CD44, CCR6, CXCR3, CXCR4, CD274, CD62L, CD30 
       CD3, CD95, CD45, CD25 
Warning: Key 'PC_' taken, using 'apca_' instead
# Identify multimodal neighbors. These will be stored in the neighbors slot, 
# and can be accessed using bm[['weighted.nn']]
# The WNN graph can be accessed at bm[["wknn"]], 
# and the SNN graph used for clustering at bm[["wsnn"]]
# Cell-specific modality weights can be accessed at bm$RNA.weight

All_samples_Merged <- FindMultiModalNeighbors(
  All_samples_Merged, reduction.list = list("pca", "apca"), 
  dims.list = list(1:20, 1:18), modality.weight.name = "RNA.weight"
)
Calculating cell-specific modality weights
Finding 20 nearest neighbors for each modality.

  |                                                  | 0 % ~calculating  
  |+++++++++++++++++++++++++                         | 50% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=17s  
Calculating kernel bandwidths

  |                                                  | 0 % ~calculating  
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s  
Warning: The number of provided modality.weight.name is not equal to the number of modalities. SCT.weight ADT.weight are used to store the modality weightsFinding multimodal neighbors

  |                                                  | 0 % ~calculating  
  |+++++++++++++++++++++++++                         | 50% ~29s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 00s

  |                                                  | 0 % ~calculating  
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
Constructing multimodal KNN graph
Constructing multimodal SNN graph

4. Visualization RNA+ADT


All_samples_Merged <- RunUMAP(All_samples_Merged, nn.name = "weighted.nn", reduction.name = "wnn.umap", reduction.key = "wnnUMAP_")
Warning: The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric
To use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'
This message will be shown once per session18:01:05 UMAP embedding parameters a = 0.9922 b = 1.112
18:01:06 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 20
18:01:07 Initializing from normalized Laplacian + noise (using RSpectra)
18:01:11 Commencing optimization for 200 epochs, with 1470228 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
18:01:27 Optimization finished
All_samples_Merged <- FindClusters(All_samples_Merged, graph.name = "wsnn", algorithm = 3, resolution = 0.9, verbose = FALSE)

p1 <- DimPlot(All_samples_Merged, reduction = 'wnn.umap', label = TRUE, repel = TRUE, label.size = 2.5) + NoLegend()
p2 <- DimPlot(All_samples_Merged, reduction = 'wnn.umap', group.by = 'predicted.celltype.l2', label = TRUE, repel = TRUE, label.size = 2.5) + NoLegend()
p1 + p2


DimPlot(All_samples_Merged, reduction = 'wnn.umap', group.by = "cell_line",label = TRUE, repel = TRUE, label.size = 2.5)

DimPlot(All_samples_Merged, reduction = 'wnn.umap', label = TRUE, repel = TRUE, label.size = 2.5)

DimPlot(All_samples_Merged, reduction = 'wnn.umap', group.by = 'predicted.celltype.l2', label = TRUE, repel = TRUE, label.size = 2.5)


All_samples_Merged <- RunUMAP(All_samples_Merged, reduction = 'pca', dims = 1:20, assay = 'RNA', 
              reduction.name = 'rna.umap', reduction.key = 'rnaUMAP_')
11:01:30 UMAP embedding parameters a = 0.9922 b = 1.112
11:01:30 Read 46976 rows and found 20 numeric columns
11:01:30 Using Annoy for neighbor search, n_neighbors = 30
11:01:30 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
11:01:34 Writing NN index file to temp file /tmp/RtmpNFcsIF/filed205f4af0ad
11:01:34 Searching Annoy index using 1 thread, search_k = 3000
11:01:44 Annoy recall = 100%
11:01:45 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
11:01:47 Initializing from normalized Laplacian + noise (using RSpectra)
11:01:54 Commencing optimization for 200 epochs, with 1992390 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
11:02:09 Optimization finished
All_samples_Merged <- RunUMAP(All_samples_Merged, reduction = 'apca', dims = 1:18, assay = 'ADT', 
              reduction.name = 'adt.umap', reduction.key = 'adtUMAP_')
11:02:10 UMAP embedding parameters a = 0.9922 b = 1.112
11:02:10 Read 46976 rows and found 18 numeric columns
11:02:10 Using Annoy for neighbor search, n_neighbors = 30
11:02:10 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
11:02:13 Writing NN index file to temp file /tmp/RtmpNFcsIF/filed2054dcef845
11:02:13 Searching Annoy index using 1 thread, search_k = 3000
11:02:24 Annoy recall = 100%
11:02:25 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
11:02:27 Initializing from normalized Laplacian + noise (using RSpectra)
11:02:28 Commencing optimization for 200 epochs, with 2051920 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
11:02:44 Optimization finished
p3 <- DimPlot(All_samples_Merged, reduction = 'rna.umap', group.by = 'predicted.celltype.l2', label = TRUE, 
              repel = TRUE, label.size = 2.5) + NoLegend()
p4 <- DimPlot(All_samples_Merged, reduction = 'adt.umap', group.by = 'predicted.celltype.l2', label = TRUE, 
              repel = TRUE, label.size = 2.5) + NoLegend()
p3 + p4


DimPlot(All_samples_Merged, reduction = 'rna.umap', group.by = "cell_line",label = TRUE, repel = TRUE, label.size = 2.5)

DimPlot(All_samples_Merged, reduction = 'rna.umap', group.by = "seurat_clusters",label = TRUE, repel = TRUE, label.size = 2.5)

DimPlot(All_samples_Merged, reduction = 'rna.umap', group.by = 'predicted.celltype.l2', label = TRUE, 
              repel = TRUE, label.size = 2.5)

DimPlot(All_samples_Merged, reduction = 'adt.umap', group.by = "cell_line",label = TRUE, repel = TRUE, label.size = 2.5)

DimPlot(All_samples_Merged, reduction = 'adt.umap', group.by = "seurat_clusters",label = TRUE, repel = TRUE, label.size = 2.5)

DimPlot(All_samples_Merged, reduction = 'adt.umap', group.by = 'predicted.celltype.l2', label = TRUE, 
              repel = TRUE, label.size = 2.5) + NoLegend()


FeaturePlot(All_samples_Merged, features = c("adt_CD45RA","adt_CD45RO","adt_CD5","adt_CD274", "adt_CD95"),
                  reduction = 'wnn.umap', max.cutoff = 2, 
                  cols = c("lightgrey","darkgreen"), ncol = 3)


FeaturePlot(All_samples_Merged, features = c("adt_TCRab", "adt_CD7", "adt_CD3", "adt_CD28"),
                  reduction = 'wnn.umap', max.cutoff = 2, 
                  cols = c("lightgrey","darkgreen"), ncol = 3)

            
 FeaturePlot(All_samples_Merged, features = c("adt_CD26", "adt_CD44", "adt_CD62L","adt_CXCR3", "adt_CD127", "adt_CD45"),
                  reduction = 'wnn.umap', max.cutoff = 2, 
                  cols = c("lightgrey","darkgreen"), ncol = 3)     

 
 FeaturePlot(All_samples_Merged, features = c("adt_CCR6","adt_CCR7","adt_CCR8","adt_CCR10"),
                  reduction = 'wnn.umap', max.cutoff = 2, 
                  cols = c("lightgrey","darkgreen"), ncol = 3) 

 
 FeaturePlot(All_samples_Merged, features = c("adt_CD30","adt_CD40","adt_CCR4","adt_CD4" ,"adt_CD25"),
                  reduction = 'wnn.umap', max.cutoff = 2, 
                  cols = c("lightgrey","darkgreen"), ncol = 3) 

 
 FeaturePlot(All_samples_Merged, features = c("adt_PD1","adt_CD62L","adt_CD95","adt_TCRab", "adt_CXCR4"),
                  reduction = 'wnn.umap', max.cutoff = 2, 
                  cols = c("lightgrey","darkgreen"), ncol = 3)  

 FeaturePlot(All_samples_Merged, features = c("adt_CD2","adt_CD28","adt_CD127","adt_CD19"),
                  reduction = 'wnn.umap', max.cutoff = 2, 
                  cols = c("lightgrey","darkgreen"), ncol = 3)  

 
 
 FeaturePlot(All_samples_Merged, features = c("rna_TP53","rna_CARD11","rna_ARID1A","rna_FAS","rna_CCR4"), 
                  reduction = 'wnn.umap', max.cutoff = 3, ncol = 3)

 
 FeaturePlot(All_samples_Merged, features = c("rna_RHOA","rna_TNFRSF1B"),
                  reduction = 'wnn.umap', max.cutoff = 2, 
                  cols = c("lightgrey","darkgreen"), ncol = 3)  

 
 FeaturePlot(All_samples_Merged, features = c("rna_PLS3","rna_STAT4","rna_GATA3","rna_TRAIL","rna_CD1D"),
                  reduction = 'wnn.umap', max.cutoff = 2, 
                  cols = c("lightgrey","darkgreen"), ncol = 3)  
Warning: The following features could not be found rna_TRAILWarning: The following requested variables were not found: rna_TRAIL

 
 FeaturePlot(All_samples_Merged, features = c("rna_KIR3DL2","rna_NKp46","rna_IL2RA","rna_TOX","rna_STAT5A"),
                  reduction = 'wnn.umap', max.cutoff = 2, 
                  cols = c("lightgrey","darkgreen"), ncol = 3)  
Warning: The following features could not be found rna_NKp46Warning: The following requested variables were not found: rna_NKp46

 
 FeaturePlot(All_samples_Merged, features = c("rna_MYC","rna_MNT","rna_EPHA4","rna_DNM3","rna_TWIST1"),
                  reduction = 'wnn.umap', max.cutoff = 2, 
                  cols = c("lightgrey","darkgreen"), ncol = 3)  

 
 FeaturePlot(All_samples_Merged, features = c("rna_TRAF2","rna_SELL","rna_miR21"),
                  reduction = 'wnn.umap', max.cutoff = 2, 
                  cols = c("lightgrey","darkgreen"), ncol = 3)  
Warning: The following features could not be found rna_miR21Warning: The following requested variables were not found: rna_miR21

 
 FeaturePlot(All_samples_Merged, features = c("rna_TRAF2","rna_SELL","rna_miR21"),
                  reduction = 'wnn.umap', max.cutoff = 2, 
                  cols = c("lightgrey","darkgreen"), ncol = 3)
Warning: The following features could not be found rna_miR21Warning: The following requested variables were not found: rna_miR21

 
 FeaturePlot(All_samples_Merged, features = c("rna_FCL3","rna_PDCD1","rna_CXCL13"),
                  reduction = 'wnn.umap', max.cutoff = 2, 
                  cols = c("lightgrey","darkgreen"), ncol = 3)  
Warning: The following features could not be found rna_FCL3Warning: The following requested variables were not found: rna_FCL3


 VlnPlot(All_samples_Merged, features = "SCT.weight", group.by = 'predicted.celltype.l2', sort = TRUE, pt.size = 0.1) +
  NoLegend()

 VlnPlot(All_samples_Merged, features = "ADT.weight", group.by = 'predicted.celltype.l2', sort = TRUE, pt.size = 0.1) +
  NoLegend()

 
 table(All_samples_Merged$predicted.celltype.l2, All_samples_Merged$wsnn_res.0.9)
                   
                       0    1   10   11   12   13   14   15   16   17   18   19    2   20   21   22   23   24   25   26   27   28
  CD4 CTL              0    0    0    0    0    0    0    0    0    1    0    0    0    0    0    4    0    0    0    0    0    0
  CD4 Naive            0    0    0    0    0    0    0    0    0   21    0    0    0    0    0    0    0    0    0    0    0    0
  CD4 Proliferating 5020 2202  919 1420 1108  827  749  677  766    0  488  416 3175  292  219    0  254  188  116   92   74   71
  CD4 TCM            957   32  939  179   22  486  251  247   49  555   28   16  261  102   78   20    3   23    7   19   30   10
  CD4 TEM              0    0    0    1    0    0    0    0    0    1    0    0    0    0    0    2    0    0    0    0    0    0
  CD8 Naive            6    0    0    0    0    2    0    1    0   41    0    0    1    3    0    0    0    1    0    0    0    0
  CD8 TCM              0    0   50    2    0    0   10    1    0   10    0    0    0    0    0   22    0    0    0    0    0    0
  CD8 TEM              0    0    0    0    0    0    8    0    0    0    0    0    0    0    0  171    0    0    0    0    0    0
  cDC2                 9    0    0    0    4    0    0  114    0    0   15    4   42   18    5    0   23    5   20    0    2    0
  dnT                  0    0    0    3    0    0    0    1    0   33    0    0    0    0    7    0    0    0    0    0    0    0
  gdT                  0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   13    0    0    0    0    0    0
  HSPC               158    0    0    0  367    3    1   25    2    2   78   64  263    0   20    0   36   29   15    3    5    0
  ILC                  0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1    0    0    0    0    0    0
  MAIT                 0    0    0    0    0    0    0    0    0    2    0    0    0    0    0   50    0    0    0    0    0    0
  NK                   0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   91    0    0    0    0    0    0
  NK Proliferating     7 2441    8   11    0    1  160   14    0    0    0    0  152    0   34    0    0    0    9    0    0    0
  Treg                 3    0    0    1    0    0    0    1    0   29    0    0    0    1   30    0    0    0    0    0    0    0
                   
                      29    3    4    5    6    7    8    9
  CD4 CTL              0    0    0    0    0    1    0    0
  CD4 Naive            4    0    0    0  679    1    1    0
  CD4 Proliferating    0 3679 2125 2125    0    0   72 1305
  CD4 TCM             61   25    9    9 1655 2069 2073  573
  CD4 TEM              0    0    0    0    0   43   22    0
  CD8 Naive            3    0    0    0  316   20    0   19
  CD8 TCM              1    0    0    0   13  209   95    0
  CD8 TEM              0    0    0    0    0   38    0    0
  cDC2                 0    0   14    1    0    0    0   60
  dnT                  1    0    0    0    2   14    0    0
  gdT                  0    0    0    0    0    0    0    0
  HSPC                 0    7  679  587    1    0    0   12
  ILC                  0    0    0    0    0    0    0    0
  MAIT                 0    0    0    0    0    4    0    0
  NK                   1    0    0    0    0    0    0    0
  NK Proliferating     0   10    4    5    0    0    0    8
  Treg                 4    0    0    0   39   97    0    0

5. Save the Seurat object as an Robj file


save(All_samples_Merged, file = "../0-imp_OBJ_SS/All_samples_Merged_WNN_correct.Robj")
LS0tCnRpdGxlOiAiV05OIGFuYWx5c2lzIG9mIENJVEUtc2VxLCBSTkEgKyBBRFQiCmF1dGhvcjogTmFzaXIgTWFobW9vZCBBYmJhc2kKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgI3JtZGZvcm1hdHM6OnJlYWR0aGVkb3duCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICB0b2NfY29sbGFwc2VkOiB0cnVlCi0tLQoKIyAxLiBsb2FkIGxpYnJhcmllcwpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KbGlicmFyeShTZXVyYXQpCmxpYnJhcnkoU2V1cmF0T2JqZWN0KQpsaWJyYXJ5KFNldXJhdERhdGEpCmxpYnJhcnkocGF0Y2h3b3JrKQpsaWJyYXJ5KGhhcm1vbnkpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KHJldGljdWxhdGUpCmxpYnJhcnkoQXppbXV0aCkKbGlicmFyeShkcGx5cikKbGlicmFyeShSdHNuZSkKbGlicmFyeShoYXJtb255KQpsaWJyYXJ5KGdyaWRFeHRyYSkKYGBgCgojIDIuIExvYWQgU2V1cmF0IE9iamVjdCAKYGBge3IgbG9hZF9zZXVyYXQsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwfQoKIGxvYWQoIi9ob21lL2Jpb2luZm8vQ2x1c3Rlcl90b19Db21wdXRlcl9UcmFuc2Zlcl9maWxlc19mb2xkZXIvQWxsX05vcm1hbC1QQk1DX0Fibm9ybWFsLWNlbGxMaW5lc19UX2NlbGxzX01lcmdlZF9Bbm5vdGF0ZWRfVU1BUF9vbl9DbHVzdGVyc190b19VU0UuUm9iaiIpCiAKICBBbGxfc2FtcGxlc19NZXJnZWQKCiAgCiAgRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsZ3JvdXAuYnkgPSAiY2VsbF9saW5lIiwgCiAgICAgICAgcmVkdWN0aW9uID0gInVtYXAiLAogICAgICAgIGxhYmVsLnNpemUgPSAzLAogICAgICAgIHJlcGVsID0gVCwKICAgICAgICBsYWJlbCA9IFQpCgpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwKICAgICAgICBncm91cC5ieSA9ICJTQ1Rfc25uX3Jlcy4wLjkiLCAKICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsCiAgICAgICAgbGFiZWwuc2l6ZSA9IDMsCiAgICAgICAgcmVwZWwgPSBULAogICAgICAgIGxhYmVsID0gVCkKCmNsdXN0ZXJfdGFibGUgPC0gdGFibGUoSWRlbnRzKEFsbF9zYW1wbGVzX01lcmdlZCkpCgoKRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIGdyb3VwLmJ5ID0gInByZWRpY3RlZC5jZWxsdHlwZS5sMiIsIAogICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwIiwKICAgICAgICBsYWJlbC5zaXplID0gMywKICAgICAgICByZXBlbCA9IFQsCiAgICAgICAgbGFiZWwgPSBUKQoKbGlicmFyeShjbHVzdHJlZSkKY2x1c3RyZWUoQWxsX3NhbXBsZXNfTWVyZ2VkLCBwcmVmaXggPSAiU0NUX3Nubl9yZXMuIikKCgpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgZ3JvdXAuYnkgPSAicHJlZGljdGVkLmNlbGx0eXBlLmwxIiwgCiAgICAgICAgcmVkdWN0aW9uID0gInVtYXAiLAogICAgICAgIGxhYmVsLnNpemUgPSAzLAogICAgICAgIHJlcGVsID0gVCwKICAgICAgICBsYWJlbCA9IFQsIGxhYmVsLmJveCA9IFQpCgpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgZ3JvdXAuYnkgPSAicHJlZGljdGVkLmNlbGx0eXBlLmwxIiwgCiAgICAgICAgcmVkdWN0aW9uID0gInVtYXAiLAogICAgICAgIGxhYmVsLnNpemUgPSAzLAogICAgICAgIHJlcGVsID0gVCwKICAgICAgICBsYWJlbCA9IEYpCgpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgZ3JvdXAuYnkgPSAicHJlZGljdGVkLmNlbGx0eXBlLmwyIiwgCiAgICAgICAgcmVkdWN0aW9uID0gInVtYXAiLAogICAgICAgIGxhYmVsLnNpemUgPSAzLAogICAgICAgIHJlcGVsID0gVCwKICAgICAgICBsYWJlbCA9IFQsIGxhYmVsLmJveCA9IFQpCgpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgZ3JvdXAuYnkgPSAicHJlZGljdGVkLmNlbGx0eXBlLmwyIiwgCiAgICAgICAgcmVkdWN0aW9uID0gInVtYXAiLAogICAgICAgIGxhYmVsLnNpemUgPSAzLAogICAgICAgIHJlcGVsID0gVCwKICAgICAgICBsYWJlbCA9IEYpCgoKRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIGdyb3VwLmJ5ID0gInByZWRpY3RlZC5jZWxsdHlwZS5sMiIsIAogICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwIiwKICAgICAgICBsYWJlbC5zaXplID0gMywKICAgICAgICByZXBlbCA9IFQsCiAgICAgICAgbGFiZWwgPSBULCBsYWJlbC5ib3ggPSBUKQoKCgp0YWJsZShBbGxfc2FtcGxlc19NZXJnZWQkcHJlZGljdGVkLmNlbGx0eXBlLmwyLCBBbGxfc2FtcGxlc19NZXJnZWQkU0NUX3Nubl9yZXMuMC45KQoKCmBgYAoKCiMgMy4gRGF0YSBQUkVQRVJBVElPTgpgYGB7ciBkYXRhLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMH0KRGVmYXVsdEFzc2F5KEFsbF9zYW1wbGVzX01lcmdlZCkgPC0gJ0FEVCcKClZhcmlhYmxlRmVhdHVyZXMoQWxsX3NhbXBsZXNfTWVyZ2VkKSA8LSByb3duYW1lcyhBbGxfc2FtcGxlc19NZXJnZWRbWyJBRFQiXV0pCgojIHdlIHdpbGwgdXNlIGFsbCBBRFQgZmVhdHVyZXMgZm9yIGRpbWVuc2lvbmFsIHJlZHVjdGlvbgojIHdlIHNldCBhIGRpbWVuc2lvbmFsIHJlZHVjdGlvbiBuYW1lIHRvIGF2b2lkIG92ZXJ3cml0aW5nIHRoZSAKQWxsX3NhbXBsZXNfTWVyZ2VkIDwtIE5vcm1hbGl6ZURhdGEoQWxsX3NhbXBsZXNfTWVyZ2VkLCBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICdDTFInLCBtYXJnaW4gPSAyKSAlPiUgCiAgU2NhbGVEYXRhKCkgJT4lIFJ1blBDQShyZWR1Y3Rpb24ubmFtZSA9ICdhcGNhJywgbnBjcyA9MjgsIG1heGl0ID0gNTAwMCkKCgojIElkZW50aWZ5IG11bHRpbW9kYWwgbmVpZ2hib3JzLiBUaGVzZSB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgbmVpZ2hib3JzIHNsb3QsIAojIGFuZCBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgYm1bWyd3ZWlnaHRlZC5ubiddXQojIFRoZSBXTk4gZ3JhcGggY2FuIGJlIGFjY2Vzc2VkIGF0IGJtW1sid2tubiJdXSwgCiMgYW5kIHRoZSBTTk4gZ3JhcGggdXNlZCBmb3IgY2x1c3RlcmluZyBhdCBibVtbIndzbm4iXV0KIyBDZWxsLXNwZWNpZmljIG1vZGFsaXR5IHdlaWdodHMgY2FuIGJlIGFjY2Vzc2VkIGF0IGJtJFJOQS53ZWlnaHQKCkFsbF9zYW1wbGVzX01lcmdlZCA8LSBGaW5kTXVsdGlNb2RhbE5laWdoYm9ycygKICBBbGxfc2FtcGxlc19NZXJnZWQsIHJlZHVjdGlvbi5saXN0ID0gbGlzdCgicGNhIiwgImFwY2EiKSwgCiAgZGltcy5saXN0ID0gbGlzdCgxOjIwLCAxOjE4KSwgbW9kYWxpdHkud2VpZ2h0Lm5hbWUgPSAiUk5BLndlaWdodCIKKQoKCgoKYGBgCgoKIyA0LiBWaXN1YWxpemF0aW9uIFJOQStBRFQKYGBge3IgVmlzdWFsaXplLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMH0KCkFsbF9zYW1wbGVzX01lcmdlZCA8LSBSdW5VTUFQKEFsbF9zYW1wbGVzX01lcmdlZCwgbm4ubmFtZSA9ICJ3ZWlnaHRlZC5ubiIsIHJlZHVjdGlvbi5uYW1lID0gIndubi51bWFwIiwgcmVkdWN0aW9uLmtleSA9ICJ3bm5VTUFQXyIpCkFsbF9zYW1wbGVzX01lcmdlZCA8LSBGaW5kQ2x1c3RlcnMoQWxsX3NhbXBsZXNfTWVyZ2VkLCBncmFwaC5uYW1lID0gIndzbm4iLCBhbGdvcml0aG0gPSAzLCByZXNvbHV0aW9uID0gMC45LCB2ZXJib3NlID0gRkFMU0UpCgpwMSA8LSBEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgcmVkdWN0aW9uID0gJ3dubi51bWFwJywgbGFiZWwgPSBUUlVFLCByZXBlbCA9IFRSVUUsIGxhYmVsLnNpemUgPSAyLjUpICsgTm9MZWdlbmQoKQpwMiA8LSBEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgcmVkdWN0aW9uID0gJ3dubi51bWFwJywgZ3JvdXAuYnkgPSAncHJlZGljdGVkLmNlbGx0eXBlLmwyJywgbGFiZWwgPSBUUlVFLCByZXBlbCA9IFRSVUUsIGxhYmVsLnNpemUgPSAyLjUpICsgTm9MZWdlbmQoKQpwMSArIHAyCgpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgcmVkdWN0aW9uID0gJ3dubi51bWFwJywgZ3JvdXAuYnkgPSAiY2VsbF9saW5lIixsYWJlbCA9IFRSVUUsIHJlcGVsID0gVFJVRSwgbGFiZWwuc2l6ZSA9IDIuNSkKRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIHJlZHVjdGlvbiA9ICd3bm4udW1hcCcsIGxhYmVsID0gVFJVRSwgcmVwZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gMi41KQpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgcmVkdWN0aW9uID0gJ3dubi51bWFwJywgZ3JvdXAuYnkgPSAncHJlZGljdGVkLmNlbGx0eXBlLmwyJywgbGFiZWwgPSBUUlVFLCByZXBlbCA9IFRSVUUsIGxhYmVsLnNpemUgPSAyLjUpCmBgYAoKYGBge3IgVmlzdWFsaXplMiwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTB9CgpBbGxfc2FtcGxlc19NZXJnZWQgPC0gUnVuVU1BUChBbGxfc2FtcGxlc19NZXJnZWQsIHJlZHVjdGlvbiA9ICdwY2EnLCBkaW1zID0gMToyMCwgYXNzYXkgPSAnUk5BJywgCiAgICAgICAgICAgICAgcmVkdWN0aW9uLm5hbWUgPSAncm5hLnVtYXAnLCByZWR1Y3Rpb24ua2V5ID0gJ3JuYVVNQVBfJykKQWxsX3NhbXBsZXNfTWVyZ2VkIDwtIFJ1blVNQVAoQWxsX3NhbXBsZXNfTWVyZ2VkLCByZWR1Y3Rpb24gPSAnYXBjYScsIGRpbXMgPSAxOjE4LCBhc3NheSA9ICdBRFQnLCAKICAgICAgICAgICAgICByZWR1Y3Rpb24ubmFtZSA9ICdhZHQudW1hcCcsIHJlZHVjdGlvbi5rZXkgPSAnYWR0VU1BUF8nKQoKcDMgPC0gRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIHJlZHVjdGlvbiA9ICdybmEudW1hcCcsIGdyb3VwLmJ5ID0gJ3ByZWRpY3RlZC5jZWxsdHlwZS5sMicsIGxhYmVsID0gVFJVRSwgCiAgICAgICAgICAgICAgcmVwZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gMi41KSArIE5vTGVnZW5kKCkKcDQgPC0gRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIHJlZHVjdGlvbiA9ICdhZHQudW1hcCcsIGdyb3VwLmJ5ID0gJ3ByZWRpY3RlZC5jZWxsdHlwZS5sMicsIGxhYmVsID0gVFJVRSwgCiAgICAgICAgICAgICAgcmVwZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gMi41KSArIE5vTGVnZW5kKCkKcDMgKyBwNAoKRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIHJlZHVjdGlvbiA9ICdybmEudW1hcCcsIGdyb3VwLmJ5ID0gImNlbGxfbGluZSIsbGFiZWwgPSBUUlVFLCByZXBlbCA9IFRSVUUsIGxhYmVsLnNpemUgPSAyLjUpCkRpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCByZWR1Y3Rpb24gPSAncm5hLnVtYXAnLCBncm91cC5ieSA9ICJzZXVyYXRfY2x1c3RlcnMiLGxhYmVsID0gVFJVRSwgcmVwZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gMi41KQpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgcmVkdWN0aW9uID0gJ3JuYS51bWFwJywgZ3JvdXAuYnkgPSAncHJlZGljdGVkLmNlbGx0eXBlLmwyJywgbGFiZWwgPSBUUlVFLCAKICAgICAgICAgICAgICByZXBlbCA9IFRSVUUsIGxhYmVsLnNpemUgPSAyLjUpCkRpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCByZWR1Y3Rpb24gPSAnYWR0LnVtYXAnLCBncm91cC5ieSA9ICJjZWxsX2xpbmUiLGxhYmVsID0gVFJVRSwgcmVwZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gMi41KQpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgcmVkdWN0aW9uID0gJ2FkdC51bWFwJywgZ3JvdXAuYnkgPSAic2V1cmF0X2NsdXN0ZXJzIixsYWJlbCA9IFRSVUUsIHJlcGVsID0gVFJVRSwgbGFiZWwuc2l6ZSA9IDIuNSkKRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIHJlZHVjdGlvbiA9ICdhZHQudW1hcCcsIGdyb3VwLmJ5ID0gJ3ByZWRpY3RlZC5jZWxsdHlwZS5sMicsIGxhYmVsID0gVFJVRSwgCiAgICAgICAgICAgICAgcmVwZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gMi41KSArIE5vTGVnZW5kKCkKCmBgYAoKCmBgYHtyIFZpc3VhbGl6ZTMsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwfQoKRmVhdHVyZVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCBmZWF0dXJlcyA9IGMoImFkdF9DRDQ1UkEiLCJhZHRfQ0Q0NVJPIiwiYWR0X0NENSIsImFkdF9DRDI3NCIsICJhZHRfQ0Q5NSIpLAogICAgICAgICAgICAgICAgICByZWR1Y3Rpb24gPSAnd25uLnVtYXAnLCBtYXguY3V0b2ZmID0gMiwgCiAgICAgICAgICAgICAgICAgIGNvbHMgPSBjKCJsaWdodGdyZXkiLCJkYXJrZ3JlZW4iKSwgbmNvbCA9IDMpCgpGZWF0dXJlUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIGZlYXR1cmVzID0gYygiYWR0X1RDUmFiIiwgImFkdF9DRDciLCAiYWR0X0NEMyIsICJhZHRfQ0QyOCIpLAogICAgICAgICAgICAgICAgICByZWR1Y3Rpb24gPSAnd25uLnVtYXAnLCBtYXguY3V0b2ZmID0gMiwgCiAgICAgICAgICAgICAgICAgIGNvbHMgPSBjKCJsaWdodGdyZXkiLCJkYXJrZ3JlZW4iKSwgbmNvbCA9IDMpCiAgICAgICAgICAgIAogRmVhdHVyZVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCBmZWF0dXJlcyA9IGMoImFkdF9DRDI2IiwgImFkdF9DRDQ0IiwgImFkdF9DRDYyTCIsImFkdF9DWENSMyIsICJhZHRfQ0QxMjciLCAiYWR0X0NENDUiKSwKICAgICAgICAgICAgICAgICAgcmVkdWN0aW9uID0gJ3dubi51bWFwJywgbWF4LmN1dG9mZiA9IDIsIAogICAgICAgICAgICAgICAgICBjb2xzID0gYygibGlnaHRncmV5IiwiZGFya2dyZWVuIiksIG5jb2wgPSAzKSAgICAgCiAKIEZlYXR1cmVQbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgZmVhdHVyZXMgPSBjKCJhZHRfQ0NSNiIsImFkdF9DQ1I3IiwiYWR0X0NDUjgiLCJhZHRfQ0NSMTAiKSwKICAgICAgICAgICAgICAgICAgcmVkdWN0aW9uID0gJ3dubi51bWFwJywgbWF4LmN1dG9mZiA9IDIsIAogICAgICAgICAgICAgICAgICBjb2xzID0gYygibGlnaHRncmV5IiwiZGFya2dyZWVuIiksIG5jb2wgPSAzKSAKIAogRmVhdHVyZVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCBmZWF0dXJlcyA9IGMoImFkdF9DRDMwIiwiYWR0X0NENDAiLCJhZHRfQ0NSNCIsImFkdF9DRDQiICwiYWR0X0NEMjUiKSwKICAgICAgICAgICAgICAgICAgcmVkdWN0aW9uID0gJ3dubi51bWFwJywgbWF4LmN1dG9mZiA9IDIsIAogICAgICAgICAgICAgICAgICBjb2xzID0gYygibGlnaHRncmV5IiwiZGFya2dyZWVuIiksIG5jb2wgPSAzKSAKIAogRmVhdHVyZVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCBmZWF0dXJlcyA9IGMoImFkdF9QRDEiLCJhZHRfQ0Q2MkwiLCJhZHRfQ0Q5NSIsImFkdF9UQ1JhYiIsICJhZHRfQ1hDUjQiKSwKICAgICAgICAgICAgICAgICAgcmVkdWN0aW9uID0gJ3dubi51bWFwJywgbWF4LmN1dG9mZiA9IDIsIAogICAgICAgICAgICAgICAgICBjb2xzID0gYygibGlnaHRncmV5IiwiZGFya2dyZWVuIiksIG5jb2wgPSAzKSAgCiBGZWF0dXJlUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIGZlYXR1cmVzID0gYygiYWR0X0NEMiIsImFkdF9DRDI4IiwiYWR0X0NEMTI3IiwiYWR0X0NEMTkiKSwKICAgICAgICAgICAgICAgICAgcmVkdWN0aW9uID0gJ3dubi51bWFwJywgbWF4LmN1dG9mZiA9IDIsIAogICAgICAgICAgICAgICAgICBjb2xzID0gYygibGlnaHRncmV5IiwiZGFya2dyZWVuIiksIG5jb2wgPSAzKSAgCiAKIAogRmVhdHVyZVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCBmZWF0dXJlcyA9IGMoInJuYV9UUDUzIiwicm5hX0NBUkQxMSIsInJuYV9BUklEMUEiLCJybmFfRkFTIiwicm5hX0NDUjQiKSwgCiAgICAgICAgICAgICAgICAgIHJlZHVjdGlvbiA9ICd3bm4udW1hcCcsIG1heC5jdXRvZmYgPSAzLCBuY29sID0gMykKIAogRmVhdHVyZVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCBmZWF0dXJlcyA9IGMoInJuYV9SSE9BIiwicm5hX1RORlJTRjFCIiksCiAgICAgICAgICAgICAgICAgIHJlZHVjdGlvbiA9ICd3bm4udW1hcCcsIG1heC5jdXRvZmYgPSAyLCAKICAgICAgICAgICAgICAgICAgY29scyA9IGMoImxpZ2h0Z3JleSIsImRhcmtncmVlbiIpLCBuY29sID0gMykgIAogCiBGZWF0dXJlUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIGZlYXR1cmVzID0gYygicm5hX1BMUzMiLCJybmFfU1RBVDQiLCJybmFfR0FUQTMiLCJybmFfVFJBSUwiLCJybmFfQ0QxRCIpLAogICAgICAgICAgICAgICAgICByZWR1Y3Rpb24gPSAnd25uLnVtYXAnLCBtYXguY3V0b2ZmID0gMiwgCiAgICAgICAgICAgICAgICAgIGNvbHMgPSBjKCJsaWdodGdyZXkiLCJkYXJrZ3JlZW4iKSwgbmNvbCA9IDMpICAKIAogRmVhdHVyZVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCBmZWF0dXJlcyA9IGMoInJuYV9LSVIzREwyIiwicm5hX05LcDQ2Iiwicm5hX0lMMlJBIiwicm5hX1RPWCIsInJuYV9TVEFUNUEiKSwKICAgICAgICAgICAgICAgICAgcmVkdWN0aW9uID0gJ3dubi51bWFwJywgbWF4LmN1dG9mZiA9IDIsIAogICAgICAgICAgICAgICAgICBjb2xzID0gYygibGlnaHRncmV5IiwiZGFya2dyZWVuIiksIG5jb2wgPSAzKSAgCiAKIEZlYXR1cmVQbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgZmVhdHVyZXMgPSBjKCJybmFfTVlDIiwicm5hX01OVCIsInJuYV9FUEhBNCIsInJuYV9ETk0zIiwicm5hX1RXSVNUMSIpLAogICAgICAgICAgICAgICAgICByZWR1Y3Rpb24gPSAnd25uLnVtYXAnLCBtYXguY3V0b2ZmID0gMiwgCiAgICAgICAgICAgICAgICAgIGNvbHMgPSBjKCJsaWdodGdyZXkiLCJkYXJrZ3JlZW4iKSwgbmNvbCA9IDMpICAKIAogRmVhdHVyZVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCBmZWF0dXJlcyA9IGMoInJuYV9UUkFGMiIsInJuYV9TRUxMIiwicm5hX21pUjIxIiksCiAgICAgICAgICAgICAgICAgIHJlZHVjdGlvbiA9ICd3bm4udW1hcCcsIG1heC5jdXRvZmYgPSAyLCAKICAgICAgICAgICAgICAgICAgY29scyA9IGMoImxpZ2h0Z3JleSIsImRhcmtncmVlbiIpLCBuY29sID0gMykgIAogCiBGZWF0dXJlUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIGZlYXR1cmVzID0gYygicm5hX1RSQUYyIiwicm5hX1NFTEwiLCJybmFfbWlSMjEiKSwKICAgICAgICAgICAgICAgICAgcmVkdWN0aW9uID0gJ3dubi51bWFwJywgbWF4LmN1dG9mZiA9IDIsIAogICAgICAgICAgICAgICAgICBjb2xzID0gYygibGlnaHRncmV5IiwiZGFya2dyZWVuIiksIG5jb2wgPSAzKQogCiBGZWF0dXJlUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIGZlYXR1cmVzID0gYygicm5hX0ZDTDMiLCJybmFfUERDRDEiLCJybmFfQ1hDTDEzIiksCiAgICAgICAgICAgICAgICAgIHJlZHVjdGlvbiA9ICd3bm4udW1hcCcsIG1heC5jdXRvZmYgPSAyLCAKICAgICAgICAgICAgICAgICAgY29scyA9IGMoImxpZ2h0Z3JleSIsImRhcmtncmVlbiIpLCBuY29sID0gMykgIAoKYGBgCmBgYHtyIFZpc3VhbGl6ZTQsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwfQoKIFZsblBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCBmZWF0dXJlcyA9ICJTQ1Qud2VpZ2h0IiwgZ3JvdXAuYnkgPSAncHJlZGljdGVkLmNlbGx0eXBlLmwyJywgc29ydCA9IFRSVUUsIHB0LnNpemUgPSAwLjEpICsKICBOb0xlZ2VuZCgpCiBWbG5QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgZmVhdHVyZXMgPSAiQURULndlaWdodCIsIGdyb3VwLmJ5ID0gJ3ByZWRpY3RlZC5jZWxsdHlwZS5sMicsIHNvcnQgPSBUUlVFLCBwdC5zaXplID0gMC4xKSArCiAgTm9MZWdlbmQoKQogCiB0YWJsZShBbGxfc2FtcGxlc19NZXJnZWQkcHJlZGljdGVkLmNlbGx0eXBlLmwyLCBBbGxfc2FtcGxlc19NZXJnZWQkd3Nubl9yZXMuMC45KQoKYGBgCiMgNS4gU2F2ZSB0aGUgU2V1cmF0IG9iamVjdCBhcyBhbiBSb2JqIGZpbGUKYGBge3Igc2F2ZVJPQkp9CgpzYXZlKEFsbF9zYW1wbGVzX01lcmdlZCwgZmlsZSA9ICIuLi8wLWltcF9PQkpfU1MvQWxsX3NhbXBsZXNfTWVyZ2VkX1dOTl9jb3JyZWN0LlJvYmoiKQoKCmBgYAoKCgoK