diff --git a/.Rhistory b/.Rhistory new file mode 100644 index 0000000..07a9d36 --- /dev/null +++ b/.Rhistory @@ -0,0 +1,512 @@ +Anno_SO=annotateCellTypes(object=Comb_SO$object, +species = "Mouse", +reduction.type = "umap", +legend.dot.size = 2, +do.finetuning = FALSE, +local.celldex = NULL, +use.clusters = NULL) +Comb_SO +options(rmarkdown.html_vignette.check_title = FALSE) +knitr::opts_chunk$set( +collapse = TRUE, +comment = "#>", +warning = FALSE, message = FALSE +) +library(data.table) +library(dplyr) +library(ggplot2) +evalChunk=F +# data.table(My_Sample_Names=c('CID3586','CID3921', +# 'CID4066','CID4290A', +# 'CID4398','CID4471', +# 'CID4495','CID44971', +# 'CID44991'), +# New_Names=c('H1','H2','H3', +# 'E1','E2','E3', +# 'T1','T2','T3'), +# Subtype=c('HER2','HER2','HER2', +# 'ER','ER','ER', +# 'TNBC','TNBC','TNBC'))%>% +# head()%>%knitr::kable() +SampleMetadataTable=data.table(Sample_Name=c('SCAF1713_1_1','SCAF1714_2_1','SCAF1715_3_1', +'SCAF1716_4_1','SCAF1717_5_1'), +Rename=c("PBS","ENT","NHSIL12","Combo","CD8dep"), +Treatment=c('WT',"Entinostat","NHS-IL12","Entinostat + NHS-IL12",'Entinostat + NHS-IL12')) +write.table(SampleMetadataTable, +file = "./images/Sample_Metadata.txt", +sep = '\t', +row.names = F) +SampleMetadataTable%>%knitr::kable() +SampleMetadataTable <- read.table(file = "./images/Sample_Metadata.txt", sep = '\t',header = T) +files=list.files(path="../tests/testthat/fixtures/Chariou/h5files",full.names = T) +SOlist=processRawData(input=files, +organism="Mouse", +sample.metadata.table=SampleMetadataTable, +sample.name.column='Sample_Name', +rename.col='Rename', +keep=T, +file.filter.regex=c(), +split.h5=F, +cell.hash=F, +do.normalize.data=T +) +ggsave(SOlist$plots[[1]], filename = "./images/ProcessInputData1.png", width = 10, height = 10) +ggsave(SOlist$plots[[2]], filename = "./images/ProcessInputData2.png", width = 10, height = 10) +SO_filtered=filterQC(object=SOlist$object, +## Filter Genes +min.cells = 20, +filter.vdj.genes=F, +## Filter Cells +nfeature.limits=c(NA,NA), +mad.nfeature.limits=c(5,5), +ncounts.limits=c(NA,NA), +mad.ncounts.limits=c(5,5), +mitoch.limits = c(NA,25), +mad.mitoch.limits = c(NA,3), +complexity.limits = c(NA,NA), +mad.complexity.limits = c(5,NA), +topNgenes.limits = c(NA,NA), +mad.topNgenes.limits = c(5,5), +n.topgnes=20, +do.doublets.fitler=T +) +ggsave(SO_filtered$plots$PostFilterCombined, filename = "./images/QC1.png", width = 10, height = 10) +ggsave(SO_filtered$plots$ViolinPlotCombine, filename = "./images/QC2.png", width = 10, height = 10) +ggsave(SO_filtered$plots$ScatterPlotCombine, filename = "./images/QC3.png", width = 10, height = 10) +Comb_SO=combineNormalize( +object=SO_filtered$object, +# Nomralization variables +npcs = 21, +SCT.level="Merged", +vars.to.regress = c("percent.mt"), +# FindVariableFeatures +nfeatures = 2000, +low.cut = 0.1, +high.cut = 8, +low.cut.disp = 1, +high.cut.disp = 100000, +selection.method = 'vst', +# Dim Reduction +only.var.genes = FALSE, +draw.umap = TRUE, +draw.tsne = TRUE, +seed.for.pca = 42, +seed.for.tsne = 1, +seed.for.umap = 42, +# Clustering Varables +clust.res.low = 0.2, +clust.res.high = 1.2, +clust.res.bin = 0.2, +# Select PCs +methods.pca = NULL, +var.threshold = 0.1, +pca.reg.plot = FALSE, +jackstraw = FALSE, +jackstraw.dims=5, +# Other +exclude.sample = NULL, +cell.count.limit= 35000, +reduce.so = FALSE, +project.name = 'scRNAProject', +cell.hashing.data = FALSE +) +options(rmarkdown.html_vignette.check_title = FALSE) +knitr::opts_chunk$set( +collapse = TRUE, +comment = "#>", +warning = FALSE, message = FALSE +) +library(data.table) +library(dplyr) +library(ggplot2) +library(tibble) +Comb_SO=list() +Comb_SO$object=readRDS("./images/CN_SO.rds") +evalChunk=T +Anno_SO=annotateCellTypes(object=Comb_SO$object, +species = "Mouse", +reduction.type = "umap", +legend.dot.size = 2, +do.finetuning = FALSE, +local.celldex = NULL, +use.clusters = NULL) +saveRDS(Anno_SO, file="./images/Anno_SO.rds") +ggsave(Anno_SO$p1, filename = "./images/Anno1.png", width = 10, height = 10) +ggsave(Anno_SO$p2, filename = "./images/Anno2.png", width = 10, height = 10) +Anno_SO=readRDS("./images/Anno_SO.rds") +Anno_SO$object@meta.data[,'mouseRNAseq_main',drop=F]%>%rename('Cell Type'=mouseRNAseq_main)%>%rownames_to_column('Barcode')%>% +head()%>% +knitr::kable() +grep('Cd4',rownames(Anno_SO$object@assays$RNA),ignore.case = T,value=T) +DLAnno_SO=dualLabeling(object = Anno_SO$object, +samples <- c("PBS","CD8dep","ENT","NHSIL12","Combo"), +marker.1="Nos2", +marker.2="Arg1", +marker.1.type = "SCT", +marker.2.type = "SCT", +data.reduction = "both", +point.size = 0.5, +point.shape = 16, +point.transparency = 0.5, +add.marker.thresholds = TRUE, +marker.1.threshold = 0.5, +marker.2.threshold = 0.5, +filter.data = TRUE, +marker.1.filter.direction = "greater than", +marker.2.filter.direction = "greater than", +apply.filter.1 = TRUE, +apply.filter.2 = TRUE, +filter.condition = TRUE, +parameter.name = "My_CoExp", +trim.marker.1 = FALSE, +trim.marker.2 = FALSE, +pre.scale.trim = 0.99, +display.unscaled.values = FALSE +) +plot(DLAnno_SO$plot_densityHM) +plot(DLAnno_SO$plot_umap) +Marker_Table_demo <- read.csv("../tests/testthat/fixtures/Marker_Table_demo.csv") +Marker_Table_demo%>%head()%>% +knitr::kable() +Marker_Table=Marker_Table_demo[1:4,] +FigOut=colorByMarkerTable(object=Anno_SO$object, +samples.subset=c("PBS","ENT","NHSIL12", "Combo","CD8dep" ), +samples.to.display=c("PBS","ENT","NHSIL12", "Combo","CD8dep" ), +marker.table=Marker_Table, +cells.of.interest=c("Macrophages","M1","M2" ), +protein.presence = FALSE, +assay = "SCT", +reduction.type = "umap", +point.transparency = 0.5, +point.shape = 16, +cite.seq = FALSE +) +plot(FigOut) +png(filename="./images/CBM1.png",width=1000,height=700) +plot(FigOut) +FigOut +FigOut +png(filename="./images/CBM1.png",width=1000,height=700) +FigOut +dev.off() +png(filename="./images/CBM1.png",width=1000,height=700) +FigOut +dev.off() +options(rmarkdown.html_vignette.check_title = FALSE) +knitr::opts_chunk$set( +collapse = TRUE, +comment = "#>", +warning = FALSE, message = FALSE +) +library(data.table) +library(dplyr) +library(ggplot2) +library(tibble) +Comb_SO=list() +Comb_SO$object=readRDS("./images/CN_SO.rds") +evalChunk=T +Anno_SO=annotateCellTypes(object=Comb_SO$object, +species = "Mouse", +reduction.type = "umap", +legend.dot.size = 2, +do.finetuning = FALSE, +local.celldex = NULL, +use.clusters = NULL) +options(rmarkdown.html_vignette.check_title = FALSE) +knitr::opts_chunk$set( +collapse = TRUE, +comment = "#>", +warning = FALSE, message = FALSE +) +library(data.table) +library(dplyr) +library(ggplot2) +library(tibble) +Comb_SO=list() +Comb_SO$object=readRDS("./images/CN_SO.rds") +evalChunk=T +Anno_SO=annotateCellTypes(object=Comb_SO$object, +species = "Mouse", +reduction.type = "umap", +legend.dot.size = 2, +do.finetuning = FALSE, +local.celldex = NULL, +use.clusters = NULL) +saveRDS(Anno_SO, file="./images/Anno_SO.rds") +ggsave(Anno_SO$p1, filename = "./images/Anno1.png", width = 10, height = 10) +ggsave(Anno_SO$p2, filename = "./images/Anno2.png", width = 10, height = 10) +Anno_SO=readRDS("./images/Anno_SO.rds") +Anno_SO$object@meta.data[,'mouseRNAseq_main',drop=F]%>%rename('Cell Type'=mouseRNAseq_main)%>%rownames_to_column('Barcode')%>% +head()%>% +knitr::kable() +grep('Cd4',rownames(Anno_SO$object@assays$RNA),ignore.case = T,value=T) +DLAnno_SO=dualLabeling(object = Anno_SO$object, +samples <- c("PBS","CD8dep","ENT","NHSIL12","Combo"), +marker.1="Nos2", +marker.2="Arg1", +marker.1.type = "SCT", +marker.2.type = "SCT", +data.reduction = "both", +point.size = 0.5, +point.shape = 16, +point.transparency = 0.5, +add.marker.thresholds = TRUE, +marker.1.threshold = 0.5, +marker.2.threshold = 0.5, +filter.data = TRUE, +marker.1.filter.direction = "greater than", +marker.2.filter.direction = "greater than", +apply.filter.1 = TRUE, +apply.filter.2 = TRUE, +filter.condition = TRUE, +parameter.name = "My_CoExp", +trim.marker.1 = FALSE, +trim.marker.2 = FALSE, +pre.scale.trim = 0.99, +display.unscaled.values = FALSE +) +plot(DLAnno_SO$plot_densityHM) +plot(DLAnno_SO$plot_umap) +png(filename="./images/DL1.png") +plot(DLAnno_SO$plot_densityHM) +dev.off() +png(filename="./images/DL2.png") +plot(DLAnno_SO$plot_umap) +dev.off() +Marker_Table_demo <- read.csv("../tests/testthat/fixtures/Marker_Table_demo.csv") +Marker_Table_demo%>%head()%>% +knitr::kable() +Marker_Table=Marker_Table_demo[1:4,] +FigOut=colorByMarkerTable(object=Anno_SO$object, +samples.subset=c("PBS","ENT","NHSIL12", "Combo","CD8dep" ), +samples.to.display=c("PBS","ENT","NHSIL12", "Combo","CD8dep" ), +marker.table=Marker_Table, +cells.of.interest=c("Macrophages","M1","M2" ), +protein.presence = FALSE, +assay = "SCT", +reduction.type = "umap", +point.transparency = 0.5, +point.shape = 16, +cite.seq = FALSE +) +FigOut +png(filename="./images/CBM1.png",width=1000,height=700) +FigOut +dev.off() +MS_object=modScore(object=Anno_SO$object, +marker.table=Marker_Table[,c("Macrophages","M1","M2" )], +ms.threshold=c("Macrophages .40","M1 .25","M2 .14"), +use_assay = "SCT", +general.class=c("Macrophages"), +lvl.vec = c('Macrophages-M1','Macrophages-M2'), +reduction = "umap", +nbins = 10, +gradient.ft.size = 6, +violin.ft.size = 6, +step.size = 0.1 +) +plot(DLAnno_SO$plot_densityHM) +png(filename="./images/DL1.png") +plot(DLAnno_SO$plot_densityHM) +dev.off() +png(filename="./images/DL2.png") +plot(DLAnno_SO$plot_umap) +dev.off() +modScore +MS_object=modScore(object=Anno_SO$object, +marker.table=Marker_Table, +use_columns = c("Macrophages","M1","M2" ) +ms_threshold=c("Macrophages .40","M1 .25","M2 .14"), +MS_object=modScore(object=Anno_SO$object, +marker.table=Marker_Table, +use_columns = c("Macrophages","M1","M2" ), +ms_threshold=c("Macrophages .40","M1 .25","M2 .14"), +use_assay = "SCT", +general.class=c("Macrophages"), +lvl.vec = c('Macrophages-M1','Macrophages-M2'), +reduction = "umap", +nbins = 10, +gradient.ft.size = 6, +violin.ft.size = 6, +step.size = 0.1 +) +modScore +MS_object=modScore(object=Anno_SO$object, +marker.table=Marker_Table, +use_columns = c("Macrophages","M1","M2" ), +ms_threshold=c("Macrophages .40","M1 .25","M2 .14"), +use_assay = "SCT", +general.class=c("Macrophages"), +multi.lvl = FALSE, +reduction = "umap", +nbins = 10, +gradient.ft.size = 6, +violin.ft.size = 6, +step.size = 0.1 +) +modScore +MS_object=modScore(object=Anno_SO$object, +marker.table=Marker_Table, +use_columns = c("Macrophages","M1","M2" ), +ms_threshold=c("Macrophages .40","M1 .25","M2 .14"), +general.class=c("Macrophages"), +multi.lvl = FALSE, +reduction = "umap", +nbins = 10, +gradient.ft.size = 6, +violin.ft.size = 6, +step.size = 0.1 +) +MS_object=modScore(object=Anno_SO$object, +marker.table=Marker_Table, +use_columns = c("Macrophages","M1","M2" ), +ms_threshold=c("Macrophages .40","M1 .25","M2 .14"), +multi.lvl = FALSE, +reduction = "umap", +nbins = 10, +gradient.ft.size = 6, +violin.ft.size = 6, +step.size = 0.1 +) +MS_object=modScore(object=Anno_SO$object, +marker.table=Marker_Table, +use_columns = c("Macrophages","M1","M2" ), +ms_threshold=c("Macrophages .40","M1 .25","M2 .14"), +general.class=c("Macrophages","M1","M2"), +multi.lvl = FALSE, +reduction = "umap", +nbins = 10, +gradient.ft.size = 6, +violin.ft.size = 6, +step.size = 0.1 +) +Marker_Table +MS_object=modScore(object=Anno_SO$object, +marker.table=Marker_Table, +use_columns = c("Macrophages","Monocytes","CD8_T" ), +ms_threshold=c("Macrophages .40","Monocytes .25","CD8_T .14"), +general.class=c("Macrophages","Monocytes","CD8_T"), +multi.lvl = FALSE, +reduction = "umap", +nbins = 10, +gradient.ft.size = 6, +violin.ft.size = 6, +step.size = 0.1 +) +MS_object=modScore(object=Anno_SO$object, +marker.table=Marker_Table, +use_columns = c("Macrophages","Neutrophils","CD8_T" ), +ms_threshold=c("Macrophages .40","Neutrophils .25","CD8_T .14"), +general.class=c("Macrophages","Neutrophils","CD8_T"), +multi.lvl = FALSE, +reduction = "umap", +nbins = 10, +gradient.ft.size = 6, +violin.ft.size = 6, +step.size = 0.1 +) +MS_object=modScore(object=Anno_SO$object, +marker.table=Marker_Table, +use_columns = c("Neutrophils","Macrophages","CD8_T" ), +ms_threshold=c("Neutrophils .25","Macrophages .40","CD8_T .14"), +general.class=c("Neutrophils","Macrophages","CD8_T"), +multi.lvl = FALSE, +reduction = "umap", +nbins = 10, +gradient.ft.size = 6, +violin.ft.size = 6, +step.size = 0.1 +) +RNC_object=nameClusters(object=Anno_SO$object, +cluster.numbers= c(0,1,2,3,4,5,6,7), +cluster.names=c("Pop0", "Pop1", "Pop2", "Pop3","Pop4", "Pop5", "Pop6", "Pop7"), +cluster.column ="SCT_snn_res.0.2", +labels.column = "mouseRNAseq_main", +order.clusters.by = NULL, +order.celltypes.by = NULL, +interactive = FALSE) +FigOut=dotPlotMet(object=Anno_SO$object, +metadata="orig.ident", +cells=c("PBS","ENT","NHSIL12", "Combo","CD8dep" ), +markers=Marker_Table$Macrophages, +use_assay = "SCT", +plot.reverse = FALSE, +cell.reverse.sort = FALSE, +dot.color = "darkblue" +) +dotPlotMet +FigOut=dotPlotMet(object=Anno_SO$object, +metadata="orig.ident", +cells=c("PBS","ENT","NHSIL12", "Combo","CD8dep" ), +markers=Marker_Table$Macrophages, +plot.reverse = FALSE, +cell.reverse.sort = FALSE, +dot.color = "darkblue" +) +c("Itgam", "Ly6g_neg","Adgre1", "Cd68", "Siglec1", "Csf1r", "Apoe", "Mafb", "Cx3cr1", "Nr4a1","F13a1", +"Lgals3", "Cxcl9", "Cxcl10", "Sell", "Arg1", "Mmp13", "Mmp12") +ggsave(FigOut$plot, filename = "./images/DPM.png", width = 9, height = 6) +nameClusters +FigOut +FigOut=colorByMarkerTable(object=Anno_SO$object, +samples.subset=c("PBS","ENT","NHSIL12", "Combo","CD8dep" ), +samples.to.display=c("PBS","ENT","NHSIL12", "Combo","CD8dep" ), +marker.table=Marker_Table, +cells.of.interest=c("Macrophages","M1","M2" ), +protein.presence = FALSE, +assay = "SCT", +reduction.type = "umap", +point.transparency = 0.5, +point.shape = 16, +cite.seq = FALSE +) +FigOut +FigOut +colorByMarkerTable(object=Anno_SO$object, +samples.subset=c("PBS","ENT","NHSIL12", "Combo","CD8dep" ), +samples.to.display=c("PBS","ENT","NHSIL12", "Combo","CD8dep" ), +marker.table=Marker_Table, +cells.of.interest=c("Macrophages","M1","M2" ), +protein.presence = FALSE, +assay = "SCT", +reduction.type = "umap", +point.transparency = 0.5, +point.shape = 16, +cite.seq = FALSE +) +colorByMarkerTable(object=Anno_SO$object, +samples.subset=c("PBS","ENT","NHSIL12", "Combo","CD8dep" ), +samples.to.display=c("PBS","ENT","NHSIL12", "Combo","CD8dep" ), +marker.table=Marker_Table, +cells.of.interest=c("Macrophages","M1","M2" ), +protein.presence = FALSE, +assay = "SCT", +reduction.type = "umap", +point.transparency = 0.5, +point.shape = 16, +cite.seq = FALSE +) +colorByMarkerTable(object=Anno_SO$object, +samples.subset=c("PBS","ENT","NHSIL12", "Combo","CD8dep" ), +samples.to.display=c("PBS","ENT","NHSIL12", "Combo","CD8dep" ), +marker.table=Marker_Table, +cells.of.interest=c("Neutrophils","Macrophages","CD8_T" ), +protein.presence = FALSE, +assay = "SCT", +reduction.type = "umap", +point.transparency = 0.5, +point.shape = 16, +cite.seq = FALSE +) +colorByMarkerTable(object=Anno_SO$object, +samples.subset=c("PBS","ENT","NHSIL12", "Combo","CD8dep" ), +samples.to.display=c("PBS","ENT","NHSIL12", "Combo","CD8dep" ), +marker.table=Marker_Table, +cells.of.interest=c("Neutrophils","Macrophages","CD8_T" ), +protein.presence = FALSE, +assay = "SCT", +reduction.type = "umap", +point.transparency = 0.5, +point.shape = 16, +cite.seq = FALSE +) diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 index 55ed9b9..dabea9e --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,17 @@ -# For SCWorkflow dev +.DS_Store .nfs* -*.png +#*.png Rcheck.txt -*.pdf +#*.pdf tests/testthat/otherData/ +tests/testthat/_snaps +tests/testthat/fixtures/ +tests/testthat/output/ + .Rproj.user -*.txt + +inst/doc +#inst/extdata/* +docs +*.Rds +*.rds diff --git a/DESCRIPTION b/DESCRIPTION index cdf6c35..c358885 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: SCWorkflow Title: SCWorkflow from NIDAP Version: 1.0.2 -Authors@R: c(person("Maggie", "Cam", email = "maggie.cam@nih.gov", role = "aut", comment = c(ORCID = "0000-0001-8190-9766")), +Authors@R: c(person("Maggie", "Cam", email = "maggie.cam@nih.gov", role = "aut", comment = c(ORCID = "0000-0001-8190-9766")), person("Thomas", "Meyer", email = "thomas.meyer@nih.gov", role = c("aut", "cre"), comment = c(ORCID = "0000-0002-7185-5597")), person("Jing", "Bian", email = "bianjh@nih.gov", role = "aut", comment = c(ORCID = "0000-0001-7109-716X")), person("Alexandra", "Michalowski", email = "michaloa@mail.nih.gov", role = "aut", comment = c(ORCID = "0000-0001-9259-6101")), @@ -18,7 +18,7 @@ Description: A set of functions for analyzing single-cell RNA-seq data using the License: MIT Encoding: UTF-8 Roxygen: list(markdown = TRUE) -RoxygenNote: 7.2.3 +RoxygenNote: 7.3.3 Suggests: testthat (>= 3.0.0) Depends: diff --git a/NAMESPACE b/NAMESPACE index e12942a..eb7a86d 100755 --- a/NAMESPACE +++ b/NAMESPACE @@ -30,7 +30,6 @@ import(cowplot) import(data.table) import(dplyr) import(gdata) -import(ggExtra) import(ggplot2) import(ggpubr) import(ggrepel) @@ -48,14 +47,19 @@ import(scales) import(tidyverse) import(tools) import(utils) +importFrom(BiocParallel,SerialParam) importFrom(ComplexHeatmap,pheatmap) importFrom(RColorBrewer,brewer.pal) importFrom(RColorBrewer,brewer.pal.info) importFrom(Seurat,AddMetaData) importFrom(Seurat,CreateAssayObject) importFrom(Seurat,DotPlot) +importFrom(Seurat,FindVariableFeatures) importFrom(Seurat,Idents) +importFrom(Seurat,RunPCA) importFrom(Seurat,RunTSNE) +importFrom(Seurat,RunUMAP) +importFrom(Seurat,SCTransform) importFrom(Seurat,as.SingleCellExperiment) importFrom(SingleR,SingleR) importFrom(colorspace,RGB) @@ -75,20 +79,18 @@ importFrom(dplyr,mutate) importFrom(dplyr,mutate_if) importFrom(dplyr,pull) importFrom(dplyr,relocate) +importFrom(dplyr,rename) importFrom(dplyr,row_number) importFrom(dplyr,select) importFrom(dplyr,summarise) +importFrom(ggExtra,ggMarginal) importFrom(ggplot2,aes) -importFrom(ggplot2,coord_fixed) -importFrom(ggplot2,geom_hline) importFrom(ggplot2,geom_point) importFrom(ggplot2,geom_vline) importFrom(ggplot2,ggplot) importFrom(ggplot2,ggtitle) -importFrom(ggplot2,scale_color_identity) importFrom(ggplot2,scale_y_reverse) importFrom(ggplot2,theme) -importFrom(ggplot2,theme_bw) importFrom(ggplot2,theme_classic) importFrom(ggplot2,xlab) importFrom(ggplot2,ylab) @@ -97,8 +99,13 @@ importFrom(ggpubr,annotate_figure) importFrom(ggpubr,get_legend) importFrom(ggpubr,ggarrange) importFrom(grDevices,colorRampPalette) +importFrom(grid,gTree) importFrom(grid,grid.draw) +importFrom(grid,grid.newpage) +importFrom(grid,grobHeight) +importFrom(grid,textGrob) importFrom(gridExtra,arrangeGrob) +importFrom(gridExtra,tableGrob) importFrom(htmlwidgets,saveWidget) importFrom(magrittr,"%>%") importFrom(plotly,as_widget) @@ -110,9 +117,12 @@ importFrom(scales,rescale) importFrom(stats,as.hclust) importFrom(stats,hclust) importFrom(stats,kmeans) +importFrom(stats,mad) +importFrom(stats,median) importFrom(stats,quantile) importFrom(stringr,str_replace_all) importFrom(stringr,str_sort) +importFrom(stringr,str_split_fixed) importFrom(stringr,str_to_title) importFrom(stringr,str_wrap) importFrom(tibble,deframe) diff --git a/R/3D_tSNE.R b/R/3D_tSNE.R index 1db4f41..fb8ab05 100644 --- a/R/3D_tSNE.R +++ b/R/3D_tSNE.R @@ -94,6 +94,7 @@ tSNE3D <- function(object, htmlwidgets::saveWidget(as_widget(fig), filename, selfcontained = TRUE) } - tsne.results <- list("plot" = fig, "data" = tsne.df) + tsne.results <- list( "data" = tsne.df, + "plots" = fig) return(tsne.results) } diff --git a/R/AggregateCounts.R b/R/AggregateCounts.R new file mode 100644 index 0000000..65f8ce6 --- /dev/null +++ b/R/AggregateCounts.R @@ -0,0 +1,88 @@ +##' @title Aggregate Counts (Pseudobulk) +##' @description Compute pseudobulk expression by averaging expression across groups +##' defined by one or more metadata columns, and return a tidy table. +##' @details Uses Seurat's `AverageExpression()` on the `SCT` assay to compute +##' group-wise average expression for each feature. Also produces a +##' bar plot (via `ggplot2`/`plotly`) showing the number of cells per +##' pseudobulk group and warns if any group contains only one cell. +##' +##' @param object Seurat-class object. +##' @param var.group Character vector of metadata column names used to define +##' pseudobulk groups. When multiple columns are supplied, an +##' interaction of these columns defines the groups. +##' @param slot Character name of the assay data layer passed to +##' `AverageExpression()` (e.g., "data", "counts", or "scale.data"). +##' +##' @return A data.frame of pseudobulk expression with columns `Gene` followed by +##' one column per pseudobulk group. Column names are sanitized to +##' contain only alphanumeric/underscore characters. +##' +##' @import Seurat +##' @import tidyverse +##' @import ggplot2 +##' @import plotly +##' @importFrom dplyr select +##' +##' @export + +aggregateCounts <- function(object, + var.group, + slot){ + + + ## --------------- ## + ## Main Code Block ## + ## --------------- ## + + pseudobulk <- AverageExpression(object, + return.seurat = FALSE, + assay = "SCT", + group.by = var.group, + slot = slot)[[1]] %>% + as.data.frame.matrix() + + pseudobulk$Gene <- rownames(pseudobulk) + pseudobulk <- pseudobulk %>% select("Gene", everything()) + rownames(pseudobulk) <- NULL + + # Further processing of column names + colnames(pseudobulk) <- gsub("\\W","_",colnames(pseudobulk)) + + # Return Table/Figure that gives statistics on + # Number of Cells in each group/new sample + # Distribution of cell Counts in each group/new sample + meta <- object@meta.data[,var.group] + + # check that columns are all factors / categorical + char_or_factor_cols <- sapply(meta, function(x) is.character(x) || is.factor(x) || is.logical(x)) + + # do plots and tables if all columns are factors or characters + if(all(char_or_factor_cols)){ + meta$interaction <- gsub("\\W","_",interaction(meta)) + + df <- as.data.frame(table(pseudobulk_group = meta$interaction)) %>% filter(Freq != 0) + # sort the table by the number of cells in each group + df <- df[order(df$Freq, decreasing = F),] + + if(any(df$Freq == 1)){ + single_counts <- df$pseudobulk_group[df$Freq == 1] + # sprintf, make custom warning message with %s as placeholder for single count groups + warning(sprintf( + "Some groups have only 1 cell. It is recommended to have at least 2 cells in each group.\nAffected groups: %s", + paste(single_counts, collapse = ", ") + )) + } + + p <- ggplotly(ggplot(df, aes(x = pseudobulk_group, y = Freq)) + + geom_bar(stat = "identity", position = "stack") + + labs(y = "Counts", x = "Pseudobulk Groups", title = "Number of Cells in each Pseudobulk Group") + + theme(axis.text.x = element_text(angle = 90, hjust = 1))) + + print(p) + + } else { + stop("All columns in var.group must be factors or characters") + } + + return(pseudobulk) +} \ No newline at end of file diff --git a/R/Annotate_Cell_Types.R b/R/Annotate_Cell_Types.R index 4c6d99e..8a8cf0a 100755 --- a/R/Annotate_Cell_Types.R +++ b/R/Annotate_Cell_Types.R @@ -300,7 +300,7 @@ annotateCellTypes <- function(object, # Returning Seurat Object and 2 plots: return(list( "object" = object, - "p1" = p1, - "p2" = p2 + "plots"=list("p1" = p1, + "p2" = p2) )) } diff --git a/R/Color_by_Gene.R b/R/Color_by_Gene.R index 9ee5889..3ddaab9 100644 --- a/R/Color_by_Gene.R +++ b/R/Color_by_Gene.R @@ -67,7 +67,11 @@ colorByGene <- function(object, print(object) # checking for samples - samples = eval(parse(text = gsub('\\[\\]', 'c()', samples.to.include))) + if(any(grepl('c\\(|\\[\\]',samples))) { + samples = eval(parse(text = gsub('\\[\\]', 'c()', samples))) + }else{ + samples=samples + } # if none specified, using ALL if (length(samples) == 0) { samples = unique(object@meta.data$orig.ident) @@ -218,11 +222,13 @@ colorByGene <- function(object, ### plots <- gridExtra::grid.arrange(grobs=grob,nrow=n,newpage=F) if (return.seurat.object) { - result.list <- list("object" = object, "plot" = grob) + result.list <- list("object" = object, + "plots" = grob) return(result.list) } else { gene = as.data.frame(gene) - result.list <- list("object" = gene, "plot" = grob) + result.list <- list("data" = list("gene_table" = gene), + "plots" = grob) return(result.list) } diff --git a/R/Color_by_Genes_Automatic.R b/R/Color_by_Genes_Automatic.R index 3b02a7d..bd9ca85 100644 --- a/R/Color_by_Genes_Automatic.R +++ b/R/Color_by_Genes_Automatic.R @@ -10,12 +10,14 @@ #' @param samples.to.display List of samples to depict on dimension plot, #' samples not in the list would be colored gray in #' the background +#' @param manual.genes additional list of genes to display #' @param marker.table Table of marker genes for each celltype #' (column names of the table), append "_prot" or "_neg" for #' proteins or negative markers #' @param cells.of.interest Celltypes from geneset_dataframe to screen for #' @param protein.presence Set to TRUE if protein markers are used #' @param assay Assay to extract gene expression data from (Default: "SCT") +#' @param slot Slot within assay to extract expression data from (Default: "scale.data") #' @param reduction.type Choose among tsne, umap, and pca (Default: "umap") #' @param point.transparency Set to lower values for more see through points on #' dimension plot (Default: 0.5) @@ -40,259 +42,175 @@ #' @return arranged grob of dimension reduction plots colored by individual #' marker expression -colorByMarkerTable <- function(object, - samples.subset, - samples.to.display, - marker.table, - cells.of.interest, - protein.presence = FALSE, - assay = "SCT", - reduction.type = "umap", - point.transparency = 0.5, - point.shape = 16, - cite.seq = FALSE) { +colorByMarkerTable <- function (object, samples.subset, samples.to.display, + manual.genes = c(), marker.table, + cells.of.interest, protein.presence = FALSE, assay = "SCT", slot = "scale.data", + reduction.type = "umap", point.transparency = 0.5, point.shape = 16, + cite.seq = FALSE){ - # Error Messages - if (!assay %in% Assays(object)) { - stop("assay type not found in seurat") - } else if (!reduction.type %in% Reductions(object)) { - stop("reduction type not found in seurat") - } - - # Functions - .plotMarkers <- function(markers) { - if (is.na(markers) == TRUE) { - g <- ggplot() + theme_void() - return(g) - } else { - markers.mat = object.sub[[assay]]@scale.data[markers, ] - markers.quant = quantile(markers.mat[markers.mat > 1], probs = c(.1, .5, .90)) - markers.mat[markers.mat > markers.quant[3]] = markers.quant[3] - markers.mat[markers.mat < markers.quant[1]] = 0 - - if (!(cite.seq)) { - if (reduction.type == "tsne") { - p1 <- DimPlot(object.sub, reduction = "tsne", group.by = "ident") - colnames(p1$data) <- gsub("tsne_","tSNE_",colnames(p1$data)) - clusmat = data.frame( - umap1 = p1$data$tSNE_1, - umap2 = p1$data$tSNE_2, - markers = markers.mat, - ident = as.factor(p1$data$ident) - ) + library(ggplot2) + library(Seurat) + library(stringr) + library(grid) + library(gridExtra) + + .plotMarkers <- function(markers) { + if (is.na(markers) == TRUE) { + g <- ggplot() + theme_void() + return(g) + } else { + markers.mat = GetAssayData(object, assay = assay, layer = slot)[markers, ] + markers.quant = quantile(markers.mat[markers.mat > + 1], probs = c(0.1, 0.5, 0.9)) + markers.mat[markers.mat > markers.quant[3]] = markers.quant[3] + markers.mat[markers.mat < markers.quant[1]] = 0 + if (!(cite.seq)) { + if (reduction.type == "tsne") { + p1 <- DimPlot(object, reduction = "tsne", + group.by = "ident") + clusmat = data.frame(umap1 = p1$data$tSNE_1, + umap2 = p1$data$tSNE_2, markers = markers.mat, + ident = as.factor(p1$data$ident)) + } else if (reduction.type == "umap") { + p1 <- DimPlot(object, reduction = "umap", + group.by = "ident") + clusmat = data.frame(umap1 = p1$data$UMAP_1, + umap2 = p1$data$UMAP_2, markers = markers.mat, + ident = as.factor(p1$data$ident)) + } else { + p1 <- DimPlot(object, reduction = "pca", + group.by = "ident") + clusmat = data.frame(umap1 = p1$data$PC_1, + umap2 = p1$data$PC_2, markers = markers.mat, + ident = as.factor(p1$data$ident)) + } + } else { + if (reduction.type == "tsne") { + p1 <- DimPlot(object, reduction = "protein_tsne", + group.by = "ident") + clusmat = data.frame(umap1 = p1$data$protein_tsne_1, + umap2 = p1$data$protein_tsne_2, markers = markers.mat, + ident = as.factor(p1$data$ident)) + } else if (reduction.type == "umap") { + p1 <- DimPlot(object, reduction = "protein_umap", + group.by = "ident") + clusmat = data.frame(umap1 = p1$data$protein_umap_1, + umap2 = p1$data$protein_umap_2, markers = markers.mat, + ident = as.factor(p1$data$ident)) + } else { + p1 <- DimPlot(object, reduction = "protein_pca", + group.by = "ident") + clusmat = data.frame(umap1 = p1$data$protein_pca_1, + umap2 = p1$data$protein_pca_2, markers = markers.mat, + ident = as.factor(p1$data$ident)) + } + } + + g <- ggplot(clusmat, aes(x = umap1, y = umap2, + group = ident)) + theme_bw() + theme(legend.title = element_blank()) + + ggtitle(markers) + geom_point(aes(color = markers, + shape = ident), alpha = point.transparency, + shape = point.shape, size = 1) + theme(panel.grid.major = element_blank(), + panel.grid.minor = element_blank(), panel.background = element_blank(), + legend.text = element_text(size = rel(0.5)), plot.background=element_rect(fill="white", colour="white"), rect = element_rect(fill = 'white')) + + scale_color_gradient(limits = c(0, markers.quant[3]), + low = "lightgrey", high = "red") + xlab("umap-1") + + ylab("umap-2") + return(g) + + } } - else if (reduction.type == "umap") { - p1 <- DimPlot(object.sub, reduction = "umap", group.by = "ident") - colnames(p1$data) <- gsub("umap_","UMAP_",colnames(p1$data)) - clusmat = data.frame( - umap1 = p1$data$UMAP_1, - umap2 = p1$data$UMAP_2, - markers = markers.mat, - ident = as.factor(p1$data$ident) - ) + + marker.table <- marker.table[cells.of.interest] + present.marker.ls <- list() + for (celltype in colnames(marker.table)) { + print(names(marker.table[celltype])) + present = lapply(marker.table[[celltype]], function(x) x %in% + rownames(GetAssayData(object, assay = assay, layer = slot))) + absent.genes = unlist(marker.table[[celltype]])[present == + FALSE] + present.genes = unlist(marker.table[[celltype]])[present == + TRUE] + print(paste0("Genes not present: ", paste0(absent.genes, + collapse = ","))) + print(paste0("Genes present: ", paste0(present.genes, + collapse = ","))) + if (length(present.genes) == 0) { + print(paste0(names(marker.table[celltype]), " genes were not found in object and will not be analyzed")) + } else { + present.marker.ls[[celltype]] <- present.genes + } } - else{ - p1 <- DimPlot(object.sub, reduction = "pca", group.by = "ident") - colnames(p1$data) <- gsub("pc_","PC_",colnames(p1$data)) - clusmat = data.frame( - umap1 = p1$data$PC_1, - umap2 = p1$data$PC_2, - markers = markers.mat, - ident = as.factor(p1$data$ident) - ) - } #if CITEseq is chosen then: - } else { - if (reduction.type == "tsne") { - p1 <- - DimPlot(object.sub, reduction = "protein_tsne", group.by = "ident") - clusmat = data.frame( - umap1 = p1$data$protein_tsne_1, - umap2 = p1$data$protein_tsne_2, - markers = markers.mat, - ident = as.factor(p1$data$ident) - ) + + padded.ls <- lapply(present.marker.ls, `length<-`, max(lengths(present.marker.ls))) + markers.from.list <- do.call(cbind, padded.ls) + markers.present = unlist(markers.from.list) + + if (!length(markers.present) > 0) { + print("No markers found in dataset") + return(NULL) } - else if (reduction.type == "umap") { - p1 <- - DimPlot(object.sub, reduction = "protein_umap", group.by = "ident") - clusmat = data.frame( - umap1 = p1$data$protein_umap_1, - umap2 = p1$data$protein_umap_2, - markers = markers.mat, - ident = as.factor(p1$data$ident) - ) + + # Store images for making consolidated figure + cons.gg.storage <- list() + + # Plot arranged figures with padding + for (cell in colnames(markers.from.list)) { + title <- cell + markers.to.analyze <- as.character(markers.from.list[, + cell]) + grob <- lapply(markers.to.analyze, function(x) .plotMarkers(x)) + + arranged <- gridExtra::arrangeGrob(grobs = grob, ncol = 1, newpage = F, as.table = F, top = ggpubr::text_grob(title, size = 15, face = "bold")) + + cons.gg.storage[[cell]] <- arranged } - else{ - p1 <- DimPlot(object.sub, reduction = "protein_pca", - group.by = "ident") - clusmat = data.frame( - umap1 = p1$data$protein_pca_1, - umap2 = p1$data$protein_pca_2, - markers = markers.mat, - ident = as.factor(p1$data$ident) - ) + # Manually specify background + background <- rectGrob(gp = gpar(fill = "white", col = NA)) + + cons.fig <- do.call(grid.arrange, c(cons.gg.storage, ncol = ncol(markers.from.list))) + cons.fig.bkgrd <- grobTree(background, cons.fig) + #grid.draw(cons.fig.bkgrd) + #grid.newpage() + + # Plot individual arranged figures with padding + indv_arranged <- list() + for (cell in colnames(markers.from.list)) { + title <- cell + markers.to.analyze <- as.character(markers.from.list[, + cell]) + grob <- lapply(markers.to.analyze, function(x) .plotMarkers(x)) + arranged <- gridExtra::arrangeGrob(grobs = grob, newpage = F, as.table = F, top = ggpubr::text_grob(title, size = 15, face = "bold")) + + # Combine the background with the arranged plots + combined <- grobTree(background, arranged) + indv_arranged[[cell]] <- combined + # Draw the combined grob with background + #grid.draw(combined) + #grid.newpage() + } + + # Plot manual genes if not empty + manual.arranged <- NULL + if(!is.null(manual.genes)){ + + # Str-spit and use only present genes + manual.genes.processed <- str_split(manual.genes, pattern = "[^a-zA-Z0-9]+")[[1]] + manual.genes.processed <- manual.genes.processed[manual.genes.processed %in% rownames(GetAssayData(object, assay = assay, layer = slot))] + + tryCatch({ + manual.grob <- lapply(manual.genes.processed, function(x) .plotMarkers(x)) + manual.arranged <- gridExtra::arrangeGrob(grobs = manual.grob, newpage = F, as.table = F, top = ggpubr::text_grob("Manual Genes", size = 15, face = "bold")) + #plot(manual.arranged) + #grid.newpage()}, error = function(e) { + cat(e$message, "\n", "Possible Reason: No manual genes were found in expression matrix") +}) } - } - - # Samples caption - samples.caption <- - paste(samples.to.display, - sep = "", - collapse = "\n") - final_caption <- - paste( - "Samples Displayed: ", - samples.caption, - sep = "", - collapse = "\n" - ) - - clusmat <- - mutate(clusmat, - sample.markers = clusmat$markers * grepl(paste( - samples.to.display, collapse = "|"), clusmat$ident)) - - clusmat %>% dplyr::arrange(sample.markers) -> clusmat - if (grepl("_neg", markers) == TRUE) { - clusmat %>% dplyr::arrange(desc(sample.markers)) -> clusmat - g <- ggplot(clusmat, aes( - x = umap1, - y = umap2, - group = ident - )) + - theme_bw() + - theme(legend.title = element_blank()) + - ggtitle(markers) + - geom_point( - aes(color = sample.markers, shape = ident), - alpha = point.transparency, - shape = point.shape, - size = 1 - ) + - theme( - panel.grid.major = element_blank(), - panel.grid.minor = element_blank(), - panel.background = element_blank(), - legend.text = element_text(size = rel(0.5)) - ) + - scale_color_gradient( - limits = c(0, markers.quant[3]), - low = "lightgrey", - high = "red" - ) + - xlab("umap-1") + ylab("umap-2") - return(g) - } else { - clusmat %>% dplyr::arrange(sample.markers) -> clusmat - g <- ggplot(clusmat, aes( - x = umap1, - y = umap2, - group = ident - )) + - theme_bw() + - theme(legend.title = element_blank()) + - ggtitle(markers) + - geom_point( - aes(color = sample.markers, shape = ident), - alpha = point.transparency, - shape = point.shape, - size = 1 - ) + - theme( - panel.grid.major = element_blank(), - panel.grid.minor = element_blank(), - panel.background = element_blank(), - legend.text = element_text(size = rel(0.5)) - ) + - scale_color_gradient( - limits = c(0, markers.quant[3]), - low = "lightgrey", - high = "red" - ) + - xlab("umap-1") + ylab("umap-2") - return(g) - } - } - } - - # Main Code Block - if (length(samples.subset) == 0) { - samples.subset = unique(object@meta.data$sample.name) - } - - if ("active.ident" %in% slotNames(object)) { - sample.name = as.factor(object@meta.data$orig.ident) - names(sample.name) = names(object@active.ident) - object@active.ident <- as.factor(vector()) - object@active.ident <- sample.name - object.sub = subset(object, ident = samples.subset) - } else { - sample.name = as.factor(object@meta.data$orig.ident) - names(sample.name) = names(object@active.ident) - object@active.ident <- as.factor(vector()) - object@active.ident <- sample.name - object.sub = subset(object, ident = samples.subset) - } - - marker.table <- marker.table[cells.of.interest] - - # Remove columns with all missing values - present.marker.ls <- list() - - for (celltype in colnames(marker.table)) { - print(names(marker.table[celltype])) - present = lapply(marker.table[[celltype]], function(x) - x %in% rownames(object.sub$SCT@scale.data)) - absent.genes = unlist(marker.table[[celltype]])[present == FALSE] - present.genes = unlist(marker.table[[celltype]])[present == TRUE] - print(paste0("Genes not present: ", paste0(absent.genes, collapse = ","))) - print(paste0("Genes present: ", paste0(present.genes, collapse = ","))) - - if (length(present.genes) == 0) { - print(paste0( - names(marker.table[celltype]), - " genes were not found in object and will not be analyzed" - )) - } else { - present.marker.ls[[celltype]] <- present.genes - } - } - - # Padd processed list containing only the present genes - padded.ls <- lapply(present.marker.ls, `length<-`, - max(lengths(present.marker.ls))) - markers.from.list <- do.call(cbind, padded.ls) - - markers.present = unlist(markers.from.list) - - if (!length(markers.present) > 0) { - print("No markers found in dataset") - return(NULL) - } - - # Create list for storing color by gene plots of each celltype column - gg.storage <- list() - - for (cell in colnames(markers.from.list)) { - title <- cell - - markers.to.analyze <- as.character(markers.from.list[, cell]) - - grob <- lapply(markers.to.analyze, function(x) .plotMarkers(x)) - - gg.storage[[cell]] <- - gridExtra::arrangeGrob( - grobs = grob, - ncol = 1, - newpage = F, - as.table = F, - top = text_grob(title, size = 15, face = "bold") - ) - } - - final.figures <- - do.call(arrangeGrob, c(gg.storage, ncol = ncol(markers.from.list))) - - return(final.figures) + results <- list( + overall = cons.gg.storage, + celltype = indv_arranged, + manual_entry = manual.arranged) + + return(results) } diff --git a/R/Combine_and_Normalize.R b/R/Combine_and_Normalize.R index 3e60a74..98e8f65 100755 --- a/R/Combine_and_Normalize.R +++ b/R/Combine_and_Normalize.R @@ -124,7 +124,7 @@ combineNormalize <- function(object, clust.res.bin = 0.2, # Select PCs - methods.pca = NULL, + methods.pca = 'none', var.threshold = 0.1, pca.reg.plot = FALSE, jackstraw = FALSE, @@ -596,7 +596,7 @@ combineNormalize <- function(object, ### Determin # of PCs ==== #### create Elbow plot ==== - if (is.null(methods.pca) == FALSE) { + if ('none'%in%methods.pca==F) { elbow.grob=lapply(names(object.merge.split),function(x){ gg= @@ -872,8 +872,8 @@ combineNormalize <- function(object, } - return(list(object=object.merge, - plots=grobsList)) + return(list("object"=object.merge, + "plots"=grobsList)) } diff --git a/R/DEG_Gene_Expression_Markers.R b/R/DEG_Gene_Expression_Markers.R index 7ba9bf0..321333c 100755 --- a/R/DEG_Gene_Expression_Markers.R +++ b/R/DEG_Gene_Expression_Markers.R @@ -44,266 +44,235 @@ -degGeneExpressionMarkers <- function(object, - samples, - contrasts, - parameter.to.test = "orig_ident", - test.to.use = "MAST", - log.fc.threshold = 0.25, - use.spark = FALSE, - assay.to.use = "SCT" - ) { +degGeneExpressionMarkers <- function (object, samples, contrasts, parameter.to.test = "orig_ident", + test.to.use = "MAST", log.fc.threshold = 0.25, use.spark = FALSE, + assay.to.use = "SCT") +{ + ## --------------- ## ## Functions ## ## --------------- ## - #define and call function for running DEG - .getDegTable <- function(n) { - first.cluster <- unlist(n)[1] - second.cluster <- unlist(n)[2] - second.cluster.name <- second.cluster + .getDegTable <- function(n) { + first.cluster <- unlist(n)[1] + second.cluster <- unlist(n)[2] + second.cluster.name <- second.cluster + if (second.cluster == "all") { + second.cluster <- NULL + } + Idents(object.sub) <- param.to.test + markers = FindMarkers(object.sub, ident.1 = first.cluster, + ident.2 = second.cluster, test.use = test.to.use, + logfc.threshold = log.fc.threshold, verbose = FALSE, + assay = assay.to.use, slot = "counts") + colnames(markers) <- chartr(old = " ", new = "_", paste(colnames(markers), + first.cluster, "vs", second.cluster.name, sep = "_")) + return(markers) + } + + ## --------------- ## + ## Main Code Block ## + ## --------------- ## + + # Getting metadata and checking sample names: + metadata.table <- object@meta.data - if (second.cluster == "all") { - second.cluster <- NULL + if(any(grepl('c\\(|\\[\\]',samples))) { + samples = eval(parse(text = gsub('\\[\\]', 'c()', samples))) + }else{ + samples=samples } - Idents(object.sub) <- param.to.test + if (length(samples) == 0) { + samples = unique(object@meta.data$sample_name) + } - markers = FindMarkers( - object.sub, - ident.1 = first.cluster, - ident.2 = second.cluster, - test.use = test.to.use, - logfc.threshold = log.fc.threshold, - verbose = FALSE, - assay = assay.to.use, - slot = "counts" - ) + colnames(object@meta.data) <- gsub("orig_ident", "orig.ident", + colnames(object@meta.data)) + if ("active.ident" %in% slotNames(object)) { + sample.name = as.factor(object@meta.data$orig.ident) + names(sample.name) = names(object@active.ident) + object@active.ident <- as.factor(vector()) + object@active.ident <- sample.name + object.sub = subset(object, ident = samples) + } + else { + sample.name = as.factor(object@meta.data$orig.ident) + names(sample.name) = names(object@active.ident) + object@active.ident <- as.factor(vector()) + object@active.ident <- sample.name + object.sub = subset(object, ident = samples) + } + print("selected samples:") + print(object.sub) + colnames(object.sub@meta.data) = gsub("\\.", "_", colnames(object.sub@meta.data)) - colnames(markers) <- - chartr( - old = " ", - new = "_", - paste( - colnames(markers), - first.cluster, - "vs", - second.cluster.name, - sep = "_" - ) - ) + #define contrasts + new.cont <- list() + for (i in 1:length(contrasts)) { + new.cont[[i]] <- c(paste(unlist(strsplit(contrasts[i], + "-")))) + } + contrasts <- new.cont - return(markers) - } - - - - - ## --------------- ## - ## Main Code Block ## - ## --------------- ## - - # Getting metadata and checking sample names: - metadata.table <- object@meta.data - samples = eval(parse(text = gsub('\\[\\]', 'c()', samples))) - - if (length(samples) == 0) { - samples = unique(object@meta.data$sample_name) - } - - colnames(object@meta.data) <- - gsub("orig_ident", "orig.ident", colnames(object@meta.data)) - if ("active.ident" %in% slotNames(object)) { - sample.name = as.factor(object@meta.data$orig.ident) - names(sample.name) = names(object@active.ident) - object@active.ident <- as.factor(vector()) - object@active.ident <- sample.name - object.sub = subset(object, ident = samples) - } else { - sample.name = as.factor(object@meta.data$orig.ident) - names(sample.name) = names(object@active.ident) - object@active.ident <- as.factor(vector()) - object@active.ident <- sample.name - object.sub = subset(object, ident = samples) - } - - print("selected samples:") - print(object.sub) - - colnames(object.sub@meta.data) = gsub("\\.", "_", - colnames(object.sub@meta.data)) - - #define contrasts - new.cont <- list() - for (i in 1:length(contrasts)) { - new.cont[[i]] <- c(paste(unlist(strsplit(contrasts[i], "-")))) - } - contrasts <- new.cont - - #ERROR CATCHING - #collect valid names of valid columns - valid.columns <- character() - for (i in colnames(metadata.table)) { - if (!any(is.na(metadata.table[[i]]))) { - valid.columns <- c(valid.columns, i) + #ERROR CATCHING + #collect valid names of valid columns + valid.columns <- character() + for (i in colnames(metadata.table)) { + if (!any(is.na(metadata.table[[i]]))) { + valid.columns <- c(valid.columns, i) + } } - } - - param.to.test <- parameter.to.test - - if (param.to.test == "") { - mcols = colnames(object.sub@meta.data) - param.to.test <- mcols[grepl("RNA_snn", mcols)][[1]] - print(paste("No parameter selected, defaulting to", param.to.test)) - } - - contrast.target <- object.sub@meta.data[[param.to.test]] - contrast.type <- param.to.test - contrast.counts = as.data.frame(table(contrast.target)) - valid.contrasts = subset(contrast.counts, Freq > 2)[[1]] - - #catch malformed contrasts - for (i in contrasts) { - if (!(i[[1]] %in% contrast.target)) { - print(paste( - i[[1]], - "is not a valid contrast for contrast type:", - contrast.type - )) - print("Please see below for an example of valid contrasts - for your selected contrast type.") - print(valid.contrasts) - stop("You have entered an invalid group to contrast against.") - } else if (!(i[[2]] %in% contrast.target) & (i[[2]] != "all")) { - print(paste( - i[[2]], - "is not a valid contrast for contrast type:", - contrast.type - )) - print("Please see below for an example of valid contrasts - for your selected contrast type.") - print(valid.contrasts) - stop("You have entered an invalid group to contrast against.") - } else if (length(i) > 2) { - print("Contrasts are as follows..") - print(i) - stop( - "The console says there are too many inputs in your contrasts. - A contrast should only contain Group1-Group2, - but the console thinks you have inputed Group1-Group2-Group3" - ) - } else if (!(i[[2]] %in% valid.contrasts) & (i[[2]] != "all")) { - print( - paste( - i[[2]], - "has two few values (less than 3 cells) to contrast against. - Please see below for contrasts with enough cells:", - valid.contrasts - ) - ) - stop("You have entered an invalid group to contrast against.") - } else if (!(i[[1]] %in% valid.contrasts)) { - print( - paste( - i[[1]], - "has two few values (less than 3 cells) to contrast against. - Please see below for contrasts with enough cells:", - valid.contrasts - ) - ) - stop("You have entered an invalid group to contrast against.") + param.to.test <- parameter.to.test + + if (param.to.test == "") { + mcols = colnames(object.sub@meta.data) + param.to.test <- mcols[grepl("RNA_snn", mcols)][[1]] + print(paste("No parameter selected, defaulting to", param.to.test)) } - } - - #print out contrast cell contrast.counts - for (i in seq_along(contrasts)) { - first.group <- contrasts[[i]][[1]] - first.group.count <- - subset(contrast.counts, contrast.target == first.group)$Freq - if (contrasts[[i]][[2]] != "all") { - second.group <- contrasts[[i]][[2]] - second.group.count <- - subset(contrast.counts, contrast.target == second.group)$Freq - print( - paste( - "Contrast No.", - i, - "contrasts cluster", - first.group, - "with", - first.group.count, - "cells vs. cluster", - second.group, - "with", - second.group.count, - "cells." - ) - ) - } else { - second.group.count <- ncol(object.sub) - first.group.count - print( - paste( - "Contrast No.", - i, - "contrasts cluster", - first.group, - "with", - first.group.count, - "cells vs. all other clusters, totalling", - second.group.count, - "cells." - ) - ) + contrast.target <- object.sub@meta.data[[param.to.test]] + contrast.type <- param.to.test + contrast.counts = as.data.frame(table(contrast.target)) + valid.contrasts = subset(contrast.counts, Freq > 2)[[1]] + + #catch malformed contrasts + for (i in contrasts) { + if (!(i[[1]] %in% contrast.target)) { + print(paste(i[[1]], "is not a valid contrast for contrast type:", + contrast.type)) + print("Please see below for an example of valid contrasts\n for your selected contrast type.") + print(valid.contrasts) + stop("You have entered an invalid group to contrast against.") + } + else if (!(i[[2]] %in% contrast.target) & (i[[2]] != + "all")) { + print(paste(i[[2]], "is not a valid contrast for contrast type:", + contrast.type)) + print("Please see below for an example of valid contrasts\n for your selected contrast type.") + print(valid.contrasts) + stop("You have entered an invalid group to contrast against.") + } + else if (length(i) > 2) { + print("Contrasts are as follows..") + print(i) + stop("The console says there are too many inputs in your contrasts.\n A contrast should only contain Group1-Group2,\n but the console thinks you have inputed Group1-Group2-Group3") + } + else if (!(i[[2]] %in% valid.contrasts) & (i[[2]] != + "all")) { + print(paste(i[[2]], "has two few values (less than 3 cells) to contrast against.\n Please see below for contrasts with enough cells:", + valid.contrasts)) + stop("You have entered an invalid group to contrast against.") + } + else if (!(i[[1]] %in% valid.contrasts)) { + print(paste(i[[1]], "has two few values (less than 3 cells) to contrast against.\n Please see below for contrasts with enough cells:", + valid.contrasts)) + stop("You have entered an invalid group to contrast against.") + } } - } - - - - if (use.spark) { - deg.tables <- spark.lapply(contrasts, .getDegTable) - } else { - deg.tables <- lapply(contrasts, .getDegTable) - } - - for (i in seq_along(deg.tables)) { - degtab <- deg.tables[[i]] - degtab %>% dplyr::filter(.[[1]] < 0.05) %>% dplyr::filter(.[[2]] > 0) %>% dim() -> pos - degtab %>% dplyr::filter(.[[1]] < 0.05) %>% dplyr::filter(.[[2]] < 0) %>% dim() -> neg - print(paste0( - "The number of upregulated genes at p<0.05 in contrast number ", - i, - " is:" - )) - print(pos[1]) - print(paste0( - "The number of downregulated genes at p<0.05 in contrast number ", - i, - " is:" - )) - print(neg[1]) - } - - #Merge the deg tables together - out.df <- NULL - for (i in deg.tables) { - if (is.null(out.df)) { - out.df <- deg.tables[1] - out.df <- as.data.frame(out.df) - } else { - out.df <- merge(out.df, i, by = "row.names", all = TRUE) - rownames(out.df) <- out.df$Row.names #set the rownames - out.df$Row.names <- - NULL #drop the row.names columns which we no longer need + + #print out contrast cell contrast.counts + for (i in seq_along(contrasts)) { + first.group <- contrasts[[i]][[1]] + first.group.count <- subset(contrast.counts, contrast.target == + first.group)$Freq + if (contrasts[[i]][[2]] != "all") { + second.group <- contrasts[[i]][[2]] + second.group.count <- subset(contrast.counts, contrast.target == + second.group)$Freq + print(paste("Contrast No.", i, "contrasts cluster", + first.group, "with", first.group.count, "cells vs. cluster", + second.group, "with", second.group.count, "cells.")) + } + else { + second.group.count <- ncol(object.sub) - first.group.count + print(paste("Contrast No.", i, "contrasts cluster", + first.group, "with", first.group.count, "cells vs. all other clusters, totalling", + second.group.count, "cells.")) + } + } + if (use.spark) { + deg.tables <- spark.lapply(contrasts, .getDegTable) + } + else { + deg.tables <- lapply(contrasts, .getDegTable) + } + for (i in seq_along(deg.tables)) { + degtab <- deg.tables[[i]] + pos <- degtab %>% dplyr::filter(.[[1]] < 0.05) %>% dplyr::filter(.[[2]] > + 0) %>% dim() + neg <- degtab %>% dplyr::filter(.[[1]] < 0.05) %>% dplyr::filter(.[[2]] < + 0) %>% dim() + print(paste0("The number of upregulated genes at p<0.05 in contrast number ", + i, " is:")) + print(pos[1]) + print(paste0("The number of downregulated genes at p<0.05 in contrast number ", + i, " is:")) + print(neg[1]) } - } + + #Merge the deg tables together + out.df <- NULL + for (i in deg.tables) { + if (is.null(out.df)) { + out.df <- deg.tables[1] + out.df <- as.data.frame(out.df) + } + else { + out.df <- merge(out.df, i, by = "row.names", all = TRUE) + rownames(out.df) <- out.df$Row.names + out.df$Row.names <- NULL + } + } + out.df$Gene <- rownames(out.df) + out.df$Row.names <- NULL + out.df <- out.df %>% dplyr::select(Gene, everything()) + +### Purpose of this edit is to bring output table in-line with +### column name expectations from GSEA downstream. Column names +### should be more similar to those from Bulk DEG Analysis output +### when we are done. + +# Original column names +original_colnames <- colnames(out.df) + +# Function to rename columns based on pattern matching +rename_columns <- function(colnames, pattern, suffix) { + # Identify columns that match the pattern + matched <- grepl(pattern, colnames) - out.df$Gene <- rownames(out.df) - out.df$Row.names <- NULL - out.df <- out.df %>% dplyr::select(Gene, everything()) - # return(out.df) + # Apply the transformation only to the matching columns + colnames[matched] <- gsub( + pattern = paste0("^", pattern), # Match the specific pattern at the start + replacement = "C_", # Replace pattern with "C_" + x = colnames[matched] + ) - result.list <- list("df" = out.df) - return(result.list) + # Append the suffix to the columns that were matched + colnames[matched] <- gsub( + pattern = "C_(.*)_vs_(.*)", # Capture the parts after "C_" + replacement = paste0("C_\\1_vs_\\2", suffix), # Reconstruct the name and append the suffix + x = colnames[matched] + ) + return(colnames) +} + +# Apply the renaming function for various patterns with their corresponding suffixes +new_colnames <- original_colnames +new_colnames <- rename_columns(new_colnames, "p_val_adj_", "_adjpval") +new_colnames <- rename_columns(new_colnames, "avg_log2FC_", "_logFC") +new_colnames <- rename_columns(new_colnames, "pct.1_", "_pct1") +new_colnames <- rename_columns(new_colnames, "pct.2_", "_pct2") +new_colnames <- rename_columns(new_colnames, "p_val_", "_pval") + +# Update the column names in the dataframe +colnames(out.df) <- new_colnames + +### End of "shift" edits. + + + + result.list <- list("data" = list("DEG_Table"=out.df)) + return(result.list) } diff --git a/R/Dotplot_by_Metadata.R b/R/Dotplot_by_Metadata.R index 8d36a58..f5beed2 100644 --- a/R/Dotplot_by_Metadata.R +++ b/R/Dotplot_by_Metadata.R @@ -29,10 +29,22 @@ dotPlotMet <- function(object, metadata, cells, markers, - use_assay = "SCT", plot.reverse = FALSE, cell.reverse.sort = FALSE, dot.color = "darkblue") { + +### ignore extra labels: +metadata.df <- object@meta.data +ExtraValue <- sum(!cells %in% unique(metadata.df[[metadata]])) +if (ExtraValue > 0) { + missinglab2 <- cells[!cells %in% unique(metadata.df[[metadata]])] + warning(sprintf("There are %s additional elements in your input categories\n that are missing from your metadata table: ", ExtraValue)) + missinglab2 <- cat(paste(as.character(missinglab2), collapse = "\n")) +# + cells <- cells[cells %in% unique(metadata.df[[metadata]])] +# + } +### End of the check #Set up metadata as new identity: metadata.df <- object@meta.data @@ -114,9 +126,10 @@ dotPlotMet <- function(object, #Run Seurat Dotplot function dp <- DotPlot(object, - assay = use_assay, + assay = "SCT", features = markers, dot.scale = 4, + dot.min = .1, cols = c("lightgrey", dot.color) ) cells <- cells[cells %in% dp$data$id] @@ -157,18 +170,20 @@ dotPlotMet <- function(object, #Provide Tabular format of Dotplot data dp.pct.tab <- dp$data %>% - select(features.plot, pct.exp, id) %>% + plotly::select(features.plot, pct.exp, id) %>% tidyr::pivot_wider(names_from = features.plot, values_from = pct.exp) dp.exp.tab <- dp$data %>% - select(features.plot, avg.exp.scaled, id) %>% + plotly::select(features.plot, avg.exp.scaled, id) %>% tidyr::pivot_wider(names_from = features.plot, values_from = avg.exp.scaled) result.list <- - list("plot" = plot, - "pct" = dp.pct.tab, - "exp" = dp.exp.tab) + list("data"=list( + "pct" = dp.pct.tab, + "exp" = dp.exp.tab), + "plots" = plot + ) return(result.list) diff --git a/R/Dual_Labeling.R b/R/Dual_Labeling.R index bb61a63..d6dc59f 100755 --- a/R/Dual_Labeling.R +++ b/R/Dual_Labeling.R @@ -15,7 +15,7 @@ #' @param marker.2.type Slot to use for second marker. Choices are "SCT", #' "protein","HTO" (default is "SCT") #' @param data.reduction Dimension Reduction method to use for image. Options -#' are umap, tsne, or both (default is "umap") +#' are "umap" or "tsne" (default is "umap") #' @param point.size Point size for image (default is 0.5) #' @param point.shape Point shape for image (default is 16) #' @param point.transparency Point transparency for image (default is 0.5) @@ -24,10 +24,10 @@ #' @param marker.2.threshold Threshold set for second marker (default is 0.5) #' @param filter.data Add new parameter column to metadata annotating where #' marker thresholds are applied (default is TRUE) -#' @param marker.1.filter.direction Annotate cells that have gene expression levels +#' @param M1.filter.direction Annotate cells that have gene expression levels #' for marker 1 using the marker 1 threshold. Choices are "greater than" #' or "less than" (default is "greater than") -#' @param marker.2.filter.direction Annotate cells that have gene expression levels +#' @param M2.filter.direction Annotate cells that have gene expression levels #' for marker 2 using the marker 2 threshold. Choices are "greater than" #' or "less than" (default is "greater than") #' @param apply.filter.1 If TRUE, apply the first filter (default is TRUE) @@ -35,19 +35,20 @@ #' @param filter.condition If TRUE, apply both filters 1 and 2 and take #' intersection. If FALSE, apply both filters and take the union. #' @param parameter.name Name for metadata column for new marker filters -#' (Default is "My_CoExp") +#' (Default is "Marker") #' @param trim.marker.1 Trim top and bottom percentile of marker 1 signal to #' pre-scale trim values (below) to remove extremely low and high values -#' (Default is FALSE) +#' (Default is TRUE) #' @param trim.marker.2 Trim top and bottom percentile of marker 2 signal to #' pre-scale trim values (below) to remove extremely low and high values -#' (Default is FALSE) +#' (Default is TRUE) #' @param pre.scale.trim Set trimming percentile values (Defalut is 0.99) +#' @param density.heatmap Creates a additional heatmap showing the density +#' distribution of cells. (Default is FALSE) #' @param display.unscaled.values Set to TRUE if you want to view the unscaled #' gene/protein expression values (Default is FALSE) -#' @import Seurat -#' @import ggExtra +#' @importFrom Seurat #' @importFrom scales rescale #' @importFrom gridExtra arrangeGrob #' @importFrom grid grid.draw @@ -55,6 +56,7 @@ #' @importFrom magrittr %>% #' @importFrom stats quantile #' @importFrom ggplot2 ggplot geom_point theme_classic xlab ylab geom_vline +#' @importFrom ggExtra ggMarginal #' geom_hline scale_color_identity theme_bw coord_fixed ggtitle aes #' #' @export @@ -89,8 +91,6 @@ dualLabeling <- function (object, display.unscaled.values = FALSE) { - # Feb28 2025 ver. - #### Error Messages #### #Errors for genes not available in dataset/slot @@ -499,7 +499,7 @@ dualLabeling <- function (object, # Print out numbers of cells that meet threshold cutoffs for marker 1, # marker 2 and for either intersection or union of 2 thresholds: - colnames(df)[3:4] <- c(marker.1, marker.2) + colnames(df)[1:2] <- c(marker.1, marker.2) so.sub.df <- so.sub@meta.data %>% mutate(x = case_when( rownames(so.sub@meta.data) %in% df$cellbarcode ~ TRUE, @@ -571,23 +571,25 @@ dualLabeling <- function (object, if (data.reduction=='tsne'|data.reduction=='umap') { - result.list <- list(object = so.sub, - plot = grob, - plot_densityHM = grobHM, - plot_table = g) - + result.list <- list("object" = so.sub, + "plots"=list( + "plot" = grob, + "plot_densityHM" = grobHM, + "plot_table" = g) + ) } else if (data.reduction=='both'){ - result.list <- list(object = so.sub, - plot_tsne = grob.t, - plot_umap = grob.u, - plot_densityHM = grobHM, - plot_table = g) + result.list <- list("object" = so.sub, + "data"=list("plot_table" = g), + "plots"=list( + "tsne" = grob.t, + "umap" = grob.u, + "densityHM" = grobHM + ) + ) } return(result.list) } - - diff --git a/R/Filter_QC.R b/R/Filter_QC.R index 2c1d116..e9a13a7 100755 --- a/R/Filter_QC.R +++ b/R/Filter_QC.R @@ -2,9 +2,9 @@ #' @description Filters cells and Genes for each sample and generates QC Plots #' to evaluate data before and after filtering. #' @details This is Step 2 in the basic Single-Cell RNA-seq workflow. Multiple -#' cell and gene filters can be selected to remove poor quality data and noise. -#' Returns data as a Seurat Object, and a variaty of figues to evaluate the -#' quality of data and the effect of applied filters. +#' cell and gene filters can be selected to remove poor quality data and noise. +#' Workflows can use this downstream of any Seurat Object. This tool is +#' typically the second step in the Single Cell Workflow. #' #' @param object a list of seurat objects for each sample. #' @param min.cells Filter out genes found in less than this number of cells. @@ -40,7 +40,7 @@ #' exceed the selected lower or upper limits. #' Usage c(lower limit, Upper Limit). E.g. setting to c(0,8) will not set the #' lower limit and removes cells with more than 8% mitochondrial RNA. -#' (Default: c(NA,8)) +#' (Default: c(NA,25)) #' @param mad.mitoch.limits Set filter limits based on how many Median Absolute #' Deviations an outlier cell will have. Calculated from the Median percentage #' of mitochondrial RNA for all cells in your sample. @@ -88,15 +88,22 @@ #' (Default: TRUE) #' #' -#' @importFrom Seurat CreateAssayObject Idents as.SingleCellExperiment AddMetaData +#' @importFrom Seurat CreateAssayObject Idents as.SingleCellExperiment +#' @importFrom Seurat AddMetaData SCTransform FindVariableFeatures +#' @importFrom Seurat RunPCA RunUMAP +#' @importFrom BiocParallel SerialParam +#' @importFrom stringr str_split_fixed #' @importFrom reshape2 melt #' @importFrom magrittr %>% -#' @importFrom dplyr arrange +#' @importFrom dplyr arrange rename #' @importFrom ggplot2 ggplot #' @importFrom RColorBrewer brewer.pal #' @importFrom ggpubr annotate_figure get_legend ggarrange -#' @importFrom gridExtra arrangeGrob +#' @importFrom gridExtra arrangeGrob tableGrob #' @importFrom scDblFinder scDblFinder +#' @importFrom stringr str_split_fixed +#' @importFrom stats mad median +#' @importFrom grid grobHeight textGrob grid.newpage gTree grid.draw #' #' @export @@ -112,7 +119,7 @@ filterQC <- function(object, mad.nfeature.limits=c(5,5), ncounts.limits=c(NA,NA), mad.ncounts.limits=c(5,5), - mitoch.limits = c(NA,8), + mitoch.limits = c(NA,25), mad.mitoch.limits = c(NA,3), complexity.limits = c(NA,NA), mad.complexity.limits = c(5,NA), @@ -122,23 +129,19 @@ filterQC <- function(object, do.doublets.fitler=T, ## dim Reduction settings - plot.outliers="FALSE", + plot.outliers="None", #options(None,UMAP,tSNE) group.column = NA, nfeatures = 2000, - low_cut = 0.1, - high_cut = 8, - low_cut_disp = 1, - high_cut_disp = 100000, - selection_method = "vst", + low.cut = 0.1, + high.cut = 8, + low.cut.disp = 1, + high.cut.disp = 100000, + selection.method = "vst", npcs = 30, - integratedata = FALSE, - clust_res_low=0.2, - clust_res_high = 1.2, - clust_res_bin = 0.2, - only_var_genes = FALSE, - seed_for_PCA = 42, - seed_for_TSNE = 1, - seed_for_UMAP = 42 + vars_to_regress=NULL, + seed.for.PCA = 42, + seed.for.TSNE = 1, + seed.for.UMAP = 42 @@ -152,11 +155,11 @@ filterQC <- function(object, ### Helper Functions ##### - .perCountsTop20Genes <- function(so,n.topgnes) { + .topNGenes <- function(so,n.topgnes) { ##Extract counts table counts_matrix = GetAssayData(so, slot="counts") - ## calculate counts in top n genes + ## calculate Counts in Top n genes tbl= apply(counts_matrix,2,function(i){ cnts=i[order(i,decreasing=T)] @@ -169,11 +172,17 @@ filterQC <- function(object, ### add to metadata tbl=as.data.frame(tbl) - so_out=AddMetaData(so, tbl, col.name = 'pct_counts_in_top_20_genes') + so_out=AddMetaData(so, tbl, col.name = 'pct_counts_in_top_N_genes') return(so_out) } + .rowMaxs=function(mtx){ + apply(mtx, 1, max,na.rm=T) + } + .rowMins=function(mtx){ + apply(mtx, 1, min,na.rm=T) + } .madCalc <- function(so,column,limits){ stdev <- mad(so@meta.data[,column]) @@ -181,7 +190,7 @@ filterQC <- function(object, minlim <- med-(limits[1]*stdev) maxlim <- med+(limits[2]*stdev) - gl <- format(round(maxlim,0),nsmall=0) + # gl <- format(round(maxlim,0),nsmall=0)## Remove used in testing return(c(minlim,maxlim)) @@ -203,9 +212,59 @@ filterQC <- function(object, #### Filter QC plots #### .plotViolin2=function(count.df,value){ - - g <- ggplot(count.df, aes_string(x='filt', y=value)) + + axis.lab = unique(count.df$filt) + ylabs=gsub(" \\(", "\n\\(",value) + ylabs=gsub(paste0(" Top",n.topgnes), paste0("\nTop",n.topgnes),ylabs) + + ### Set up table fore cut off lines + ## clean up cutoff values + for (v in c(value)) { + + count.df[,paste0(v,'_Filters')]=gsub("Low:|High:","", + count.df[,paste0(v,'_Filters')]) + count.df[,paste0('MAD ',v)]=gsub("Low:|High:","", + count.df[,paste0('MAD ',v)]) + + count.df[,paste0(v,'_Filters')]=gsub("\n",",", + count.df[,paste0(v,'_Filters')]) + count.df[,paste0('MAD ',v)]=gsub("\n",",", + count.df[,paste0('MAD ',v)]) + + count.df[,paste0(v,'_Filters')]=gsub("-Inf|Inf","NA", + count.df[,paste0(v,'_Filters')]) + count.df[,paste0('MAD ',v)]=gsub("-Inf|Inf","NA", + count.df[,paste0('MAD ',v)]) + } + + ####### Y axis + ## get sample cut off values + count.df.lim=count.df[,c('Sample',paste0(value,'_Filters'), + paste0('MAD ',value))]%>%unique + + ## convert to numeric values + count.df.lim_MAD=str_split_fixed(count.df.lim[,paste0('MAD ',value)], + pattern=',',2)%>%as.data.frame + rownames(count.df.lim_MAD)=count.df.lim$Sample + colnames(count.df.lim_MAD)=c('Low','High') + count.df.lim_MAD$Low=as.numeric(count.df.lim_MAD$Low) + count.df.lim_MAD$High=as.numeric(count.df.lim_MAD$High) + count.df.lim_cut=str_split_fixed(count.df.lim[,paste0(value,'_Filters')], + pattern=',',2)%>%as.data.frame + rownames(count.df.lim_cut)=count.df.lim$Sample + colnames(count.df.lim_cut)=c('Low','High') + count.df.lim_cut$Low=as.numeric(count.df.lim_cut$Low)%>%suppressWarnings() + count.df.lim_cut$High=as.numeric(count.df.lim_cut$High)%>%suppressWarnings() + count.df.lim$Low=.rowMaxs(cbind(count.df.lim_cut[,'Low'], + count.df.lim_MAD[,'Low']))#,na.rm=T) + count.df.lim[count.df.lim$Low<0,'Low']=0 + count.df.lim$High=.rowMins(cbind(count.df.lim_cut[,'High'], + count.df.lim_MAD[,'High']))#,na.rm=T) + + + + g <- ggplot(count.df, aes(x=filt, y=.data[[value]])) + # ggtitle(paste(name,count.df$variable[1])) + + theme_classic()+ theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), @@ -214,14 +273,25 @@ filterQC <- function(object, axis.text=element_text(size=10), axis.title.x=element_blank(), # axis.title.y=element_blank(), - axis.text.x=element_text(angle=45,hjust=1), + # axis.text.x=element_text(angle=45,hjust=1), + axis.text.x=element_blank(), plot.title = element_text(size = 12, face = "bold")) + geom_violin(aes(fill=filt)) + # scale_fill_manual(values = c("#00AFBB", "#FC4E07")) + - geom_boxplot(width=.1) + - # scale_x_discrete(limits = as.vector(axislab))+ - facet_wrap(~Sample,nrow=1) - # v + geom_boxplot(width=0) + + # scale_x_discrete(limits = as.vector(axis.lab))+ + labs( y = ylabs)+ + geom_hline(data = count.df.lim, aes(yintercept = Low, + linetype='Filter\nLimits'), + col = 'grey')+ + geom_hline(data = count.df.lim, aes(yintercept = High), + linetype='dashed', col = 'grey')+ + scale_linetype_manual(name = "Filter\nLimits", values = 'dashed', + guide = guide_legend(override.aes = + list(color = c("grey"), + size=2)))+ + facet_wrap(~Sample,nrow=1)%>%suppressWarnings() + return(g) } @@ -230,14 +300,111 @@ filterQC <- function(object, .plotScatter2=function(count.df,value){ # count.df$filt=factor(count.df$filt,levels = c('filt','raw')) count.df$filt=factor(count.df$filt,levels = c('raw','filt')) + ylabs=gsub(" \\(", "\n\\(",value) + ylabs=gsub(paste0(" Top",n.topgnes), paste0("\nTop",n.topgnes),ylabs) + + ### Set up table fore cut off lines + ## clean up cutoff values + for (v in c('UMI Count (nCount_RNA)',value)) { + + count.df[,paste0(v,'_Filters')]=gsub("Low:|High:","", + count.df[,paste0(v,'_Filters')]) + count.df[,paste0('MAD ',v)]=gsub("Low:|High:","", + count.df[,paste0('MAD ',v)]) + + count.df[,paste0(v,'_Filters')]=gsub("\n",",", + count.df[,paste0(v,'_Filters')]) + count.df[,paste0('MAD ',v)]=gsub("\n",",",count.df[,paste0('MAD ',v)]) + + count.df[,paste0(v,'_Filters')]=gsub("-Inf|Inf","NA", + count.df[,paste0(v,'_Filters')]) + count.df[,paste0('MAD ',v)]=gsub("-Inf|Inf","NA", + count.df[,paste0('MAD ',v)]) + } + +####### Y axis + ## get sample cut off values + count.df.lim=count.df[,c('Sample',paste0(value,'_Filters'), + paste0('MAD ',value))]%>%unique + + ## convert to numeric values + count.df.lim_MAD=str_split_fixed(count.df.lim[,paste0('MAD ',value)], + pattern=',',2)%>%as.data.frame + rownames(count.df.lim_MAD)=count.df.lim$Sample + colnames(count.df.lim_MAD)=c('Low','High') + count.df.lim_MAD$Low=as.numeric(count.df.lim_MAD$Low) + count.df.lim_MAD$High=as.numeric(count.df.lim_MAD$High) + count.df.lim_cut=str_split_fixed(count.df.lim[,paste0(value,'_Filters')], + pattern=',',2)%>%as.data.frame + rownames(count.df.lim_cut)=count.df.lim$Sample + colnames(count.df.lim_cut)=c('Low','High') + count.df.lim_cut$Low=as.numeric(count.df.lim_cut$Low) + count.df.lim_cut$High=as.numeric(count.df.lim_cut$High) + count.df.lim$Low=.rowMaxs(cbind(count.df.lim_cut[,'Low'], + count.df.lim_MAD[,'Low']))#,na.rm=T) + count.df.lim[count.df.lim$Low<0,'Low']=0 + count.df.lim$High=.rowMins(cbind(count.df.lim_cut[,'High'], + count.df.lim_MAD[,'High']))#,na.rm=T) + +####### X axis + valueX='UMI Count (nCount_RNA)' + ## get sample cut off values + count.df.limX=count.df[,c('Sample',paste0(valueX,'_Filters'), + paste0('MAD ',valueX))]%>%unique + + ## convert to numeric values + count.df.limX_MAD=str_split_fixed(count.df.limX[,paste0('MAD ',valueX)], + pattern=',',2)%>%as.data.frame + rownames(count.df.limX_MAD)=count.df.limX$Sample + colnames(count.df.limX_MAD)=c('Low','High') + count.df.limX_MAD$Low=as.numeric(count.df.limX_MAD$Low) + count.df.limX_MAD$High=as.numeric(count.df.limX_MAD$High) + count.df.limX_cut=str_split_fixed(count.df.limX[,paste0(valueX,'_Filters')], + pattern=',',2)%>%as.data.frame + rownames(count.df.limX_cut)=count.df.limX$Sample + colnames(count.df.limX_cut)=c('Low','High') + count.df.limX_cut$Low=as.numeric(count.df.limX_cut$Low) + count.df.limX_cut$High=as.numeric(count.df.limX_cut$High) + count.df.limX$Low=.rowMaxs(cbind(count.df.limX_cut[,'Low'], + count.df.limX_MAD[,'Low']))#,na.rm=T) + count.df.limX[count.df.limX$Low<0,'Low']=0 + count.df.limX$High=.rowMins(cbind(count.df.limX_cut[,'High'], + count.df.limX_MAD[,'High']))#,na.rm=T) + + + g <- count.df%>%arrange(filt)%>% - ggplot(aes_string(x="nCount_RNA",y=value,color="filt")) + - geom_point(size = 0.5) + + ggplot(aes(x=`UMI Count (nCount_RNA)`,y=.data[[value]],color=filt)) + + geom_point(size = 0.5) + + theme_classic() + - theme(strip.background =element_rect(fill="grey"), + theme( + # strip.background =element_rect(fill="grey"), + panel.grid.major = element_blank(), + panel.grid.minor = element_blank(), + panel.background = element_blank(), + legend.text=element_text(size=rel(1.5)), + legend.title=element_blank(), + # axis.title.x=element_blank(), axis.text.x=element_text(angle=45,hjust=1), axis.text=element_text(size=10) - ) + facet_wrap(~Sample,nrow=1,) + ) + + guides(colour = guide_legend(override.aes = list(size=5)))+ + labs( y = ylabs)+ + geom_hline(data = count.df.lim, aes(yintercept = Low, + linetype='Filter\nLimits'), + col = 'grey')+ + geom_hline(data = count.df.lim, aes(yintercept = High), + linetype='dashed', col = 'grey')+ + geom_vline(data = count.df.limX, aes(xintercept = Low),linetype='dashed', + col = 'grey')+ + geom_vline(data = count.df.limX, aes(xintercept = High), + linetype='dashed', col = 'grey')+ + scale_linetype_manual(name = "Filter Limits", values = 'dashed', + guide = guide_legend(override.aes = + list(color = c("grey"), + size=2)))+ + facet_wrap(~Sample,nrow=1,)%>%suppressWarnings() return(g) } @@ -252,59 +419,67 @@ filterQC <- function(object, strip.text.x = element_blank() ) } + for (x in c(1:(length(plot.list)-1))) { + plot.list.mod[[x]]=plot.list.mod[[x]]+theme( + axis.title.x = element_blank() + ) + } return(plot.list.mod) } .runTsnepPlot= function(filterCat,filterM,so,reduction){ - if (reduction=="UMAP") { - tsne.df.plot <- as.data.frame(so@reductions$umap@cell.embeddings) + if (reduction=="umap") { + qcFiltr.df.plot <- as.data.frame(so@reductions$umap@cell.embeddings) }else{ - tsne.df.plot <- as.data.frame(so@reductions$tsne@cell.embeddings) + qcFiltr.df.plot <- as.data.frame(so@reductions$tsne@cell.embeddings) } filterM=filterM[,filterCat,drop=F] - tsne.df.plot[,filterCat]=NA - tsne.df.plot[rownames(tsne.df.plot)%in% + qcFiltr.df.plot[,filterCat]=NA + qcFiltr.df.plot[rownames(qcFiltr.df.plot)%in% rownames(filterM[filterM[,1]==T,1,drop=F]), colnames(filterM)]="Normal" - tsne.df.plot[rownames(tsne.df.plot)%in% + qcFiltr.df.plot[rownames(qcFiltr.df.plot)%in% rownames(filterM[filterM[,1]==F,1,drop=F]==F), colnames(filterM)]="Removed" - tsne.df.plot[,colnames(filterM)]= - factor(tsne.df.plot[,colnames(filterM)],levels=c("Normal",'Removed')) + qcFiltr.df.plot[,colnames(filterM)]= + factor(qcFiltr.df.plot[,colnames(filterM)],levels=c("Normal",'Removed')) - g <- .plotTsne(tsne.df.plot,so@project.name,filterCat) + g <- .plotTsne(qcFiltr.df.plot,so@project.name,filterCat) return(g) } - .plotTsne <- function(tsne.df.plot,name,var){ - g <- ggplot(tsne.df.plot[order(tsne.df.plot[,var]),]) + - geom_point(mapping = aes_string(x=colnames(tsne.df.plot[,1,drop=F]), - y=colnames(tsne.df.plot[,2,drop=F]), + .plotTsne <- function(qcFiltr.df.plot,name,var){ + g <- ggplot(qcFiltr.df.plot[order(qcFiltr.df.plot[,var]),]) + + geom_point(mapping = aes_string(x=colnames(qcFiltr.df.plot[,1,drop=F]), + y=colnames(qcFiltr.df.plot[,2,drop=F]), color=var), size = 1) + theme_classic() + ggtitle(paste(name,"\n",var)) + scale_color_manual(values = c("grey","red")) + #scale_colour_gradient2(midpoint = mid[i],low="blue",mid="grey",high="red") + - theme(legend.title=element_blank()) + theme(legend.title=element_blank())%>%suppressWarnings() } #### Post Filter plots #### .plotScatterPost2=function(count.df,xaxis,yaxis){ - ylab = as.character(xaxis) - xlab = as.character(yaxis) + xlab = as.character(xaxis) + ylab = as.character(yaxis) + ylab=gsub(" \\(", "\n\\(",ylab) + ylab=gsub(paste0(" Top",n.topgnes), paste0("\nTop",n.topgnes),ylab) + name = paste(ylab,"vs.",xlab) g =ggplot(count.df, aes(x=.data[[xaxis]], y=.data[[yaxis]],color = Sample))+ geom_point(size = 0.5) + theme_classic() + theme(legend.position='right',legend.text=element_text(size=10), legend.title=element_blank()) + - guides(colour = guide_legend(override.aes = list(size=2))) + + guides(colour = guide_legend(override.aes = list(size=5))) + scale_color_manual(values = col2) + - labs( x = xlab, y = ylab) + labs( x = xlab, y = ylab)%>%suppressWarnings() return(g) } @@ -314,8 +489,16 @@ filterQC <- function(object, theme_bw() + geom_density(aes(x = .data[[xaxis]], colour = Sample)) + # labs(x = NULL) + - theme(legend.position='right',legend.text=element_text(size=10), - legend.title=element_blank()) + + theme(legend.position='right', + panel.grid.major = element_blank(), + panel.grid.minor = element_blank(), + panel.background = element_blank(), + legend.text=element_text(size=12), + legend.title=element_blank(), + # axis.title.x=element_blank(), + axis.text.x=element_text(angle=45,hjust=1), + axis.text=element_text(size=10) + ) + # ggtitle(xaxis) + scale_x_continuous(trans='log10') + scale_color_manual(values = col2) %>% @@ -326,23 +509,28 @@ filterQC <- function(object, .plotViolinPost2=function(count.df,yaxis){ axis.lab = unique(count.df$Sample) + ylabs=gsub(" \\(", "\n\\(",yaxis) + ylabs=gsub(paste0(" Top",n.topgnes), paste0("\nTop",n.topgnes),ylabs) - g=ggplot(count.df, aes_string(x='Sample', y=(yaxis))) + + + g=ggplot(count.df, aes(x=Sample, y=(.data[[yaxis]]))) + ggtitle(yaxis) + + theme_classic()+ theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), legend.text=element_text(size=rel(1)), legend.title=element_blank(), axis.text=element_text(size=10), - axis.title.x=element_blank(),axis.title.y=element_blank(), + axis.title.x=element_blank(), + axis.title.y=element_blank(), axis.text.x=element_blank(), - #axis.text.x=element_text(angle=45,hjust=1), - plot.title = element_text(size = 20, face = "bold")) + + plot.title = element_text(size = 15, face = "bold")) + + labs( y = ylabs)+ geom_violin(aes(fill=as.factor(Sample))) + scale_fill_manual(values = col2) + - geom_boxplot(width=.1) + - scale_x_discrete(limits = as.vector(axis.lab)) + geom_boxplot(width=0) + + scale_x_discrete(limits = as.vector(axis.lab))%>%suppressWarnings() return(g) } @@ -358,36 +546,38 @@ filterQC <- function(object, ## Optional: TSNE/UMAP for figures #### - if(plot.outliers!="FALSE"){ - so.nf.tsne <- SCTransform(so.nf,do.correct.umi = TRUE, + if(plot.outliers!="none"){ + so.nf.qcFiltr <- SCTransform(so.nf,do.correct.umi = TRUE, vars.to.regress=vars_to_regress, return.only.var.genes = FALSE) - so.nf.tsne = FindVariableFeatures(object = so.nf.tsne, + so.nf.qcFiltr = FindVariableFeatures(object = so.nf.qcFiltr, nfeatures = nfeatures, - mean.cutoff = c(low_cut, high_cut), - dispersion.cutoff=c(low_cut_disp,high_cut_disp), - selection.method=selection_method, verbose = FALSE) - so.nf.tsne <- RunPCA(object = so.nf.tsne, + mean.cutoff = c(low.cut, high.cut), + dispersion.cutoff=c(low.cut.disp,high.cut.disp), + selection.method=selection.method, verbose = FALSE) + so.nf.qcFiltr <- RunPCA(object = so.nf.qcFiltr, npcs = npcs, verbose = FALSE, - seed.use = seed_for_PCA) - if (plot.outliers=="UMAP") { + seed.use = seed.for.PCA) + if (plot.outliers=="umap") { - so.nf.tsne <- RunUMAP(object = so.nf.tsne, + so.nf.qcFiltr <- RunUMAP(object = so.nf.qcFiltr, reduction = "pca", dims = 1:npcs, - seed.use=seed_for_UMAP) - tsne.df.plot = as.data.frame(so.nf.tsne@reductions$umap@cell.embeddings) - so.nf=AddMetaData(so.nf,tsne.df.plot) + seed.use=seed.for.UMAP) + qcFiltr.df.plot = as.data.frame( + so.nf.qcFiltr@reductions$umap@cell.embeddings) + so.nf=AddMetaData(so.nf,qcFiltr.df.plot) }else{ - so.nf.tsne <- RunTSNE(object = so.nf.tsne, + so.nf.qcFiltr <- RunTSNE(object = so.nf.qcFiltr, reduction = "pca", dim.embed = 2, dims = 1:npcs, - seed.use = seed_for_TSNE) - tsne.df.plot = as.data.frame(so.nf.tsne@reductions$tsne@cell.embeddings) - so.nf=AddMetaData(so.nf,tsne.df.plot) + seed.use = seed.for.TSNE) + qcFiltr.df.plot = as.data.frame( + so.nf.qcFiltr@reductions$tsne@cell.embeddings) + so.nf=AddMetaData(so.nf,qcFiltr.df.plot) } } @@ -398,13 +588,18 @@ filterQC <- function(object, ### Gene Filters #### ### Remove VDJ genes + VDJgenesOut=c() if (filter.vdj.genes==TRUE) { allGenes = rownames(so) VDJgenes = c("TRBV","TRAV","TRBD","TRAJ","TRBJ") print("Removing VDJ genes. Genes removed...") + print(length(allGenes)) for (j in VDJgenes) { - print(allGenes[grepl(j, allGenes)]) - allGenes = allGenes[!grepl(j, allGenes)] + j=toupper(j) + print(allGenes[grepl(j, toupper(allGenes))]) + VDJgenesOut=c(VDJgenesOut,allGenes[grepl(j, toupper(allGenes))]) + + allGenes = allGenes[!grepl(j, toupper(allGenes))] } so <- subset(so,features = allGenes) } @@ -417,20 +612,27 @@ filterQC <- function(object, # CreateSeuratObject gene.cell.count=apply(so@assays$RNA@counts,1,function(x){sum(x>0)}) - so=subset(so, features=names(gene.cell.count)[(gene.cell.count>=min.cells)]) + + if ('Protein'%in%names(so@assays)==T) { + genes=c(names(gene.cell.count)[(gene.cell.count>=min.cells)], + rownames(so@assays$Protein))%>%unique() + }else{ genes=names(gene.cell.count)[(gene.cell.count>=min.cells)]} + + so=subset(so, features=genes) ### Cell filters #### ## Caluclate filter Metrics - ## calculate Counts in top 20 Genes - so=.perCountsTop20Genes(so,n.topgnes) + ## calculate Counts in Top 20 Genes + so=.topNGenes(so,n.topgnes) ## Counts(umi) Filter mad.ncounts.limits=.madCalc(so,'nCount_RNA',mad.ncounts.limits) mad.ncounts.limits=.checkLimits(mad.ncounts.limits) ncounts.limits=.checkLimits(ncounts.limits) - + mad.ncounts.limits=mad.ncounts.limits%>%round(digits=2) + ncounts.limits=ncounts.limits%>%round(digits=2) ncounts.filter=((so@meta.data$nCount_RNA >= max(ncounts.limits[1],mad.ncounts.limits[1])) & @@ -442,7 +644,8 @@ filterQC <- function(object, mad.nfeature.limits=.madCalc(so,'nFeature_RNA',mad.nfeature.limits) mad.nfeature.limits=.checkLimits(mad.nfeature.limits) nfeature.limits=.checkLimits(nfeature.limits) - + mad.nfeature.limits=mad.nfeature.limits%>%round(digits=2) + nfeature.limits=nfeature.limits%>%round(digits=2) nfeature.filter= ((so@meta.data$nFeature_RNA >= max(nfeature.limits[1],mad.nfeature.limits[1])) & @@ -454,7 +657,8 @@ filterQC <- function(object, mad.mitoch.limits =.madCalc(so,'percent.mt',mad.mitoch.limits) mad.mitoch.limits=.checkLimits(mad.mitoch.limits) mitoch.limits=.checkLimits(mitoch.limits) - + mad.mitoch.limits=mad.mitoch.limits%>%round(digits=2) + mitoch.limits=mitoch.limits%>%round(digits=2) mitochPer.filter= ((so@meta.data$percent.mt >= max(mitoch.limits[1],mad.mitoch.limits[1])) & @@ -467,7 +671,8 @@ filterQC <- function(object, mad.complexity.limits=.madCalc(so,'log10GenesPerUMI',mad.complexity.limits) mad.complexity.limits=.checkLimits(mad.complexity.limits) complexity.limits=.checkLimits(complexity.limits) - + mad.complexity.limits=mad.complexity.limits%>%round(digits=2) + complexity.limits=complexity.limits%>%round(digits=2) complexity.filter= ((so@meta.data$log10GenesPerUMI >= max(complexity.limits[1],mad.complexity.limits[1])) & @@ -476,20 +681,21 @@ filterQC <- function(object, ) - ## Top 20 Filter + ## Top N Filter # mad.topNgenes.limits = c(NA,5) # topNgenes.limits=c(NA,20) mad.topNgenes.limits= - .madCalc(so,'pct_counts_in_top_20_genes',mad.topNgenes.limits) + .madCalc(so,'pct_counts_in_top_N_genes',mad.topNgenes.limits) mad.topNgenes.limits= .checkLimits(mad.topNgenes.limits) topNgenes.limits= .checkLimits(topNgenes.limits) + mad.topNgenes.limits=mad.topNgenes.limits%>%round(digits=2) + topNgenes.limits=topNgenes.limits%>%round(digits=2) - - top20.filter= ((so@meta.data$pct_counts_in_top_20_genes >= + topN.filter= ((so@meta.data$pct_counts_in_top_N_genes >= max(topNgenes.limits[1],mad.topNgenes.limits[1])) & - (so@meta.data$pct_counts_in_top_20_genes <= + (so@meta.data$pct_counts_in_top_N_genes <= min(topNgenes.limits[2], mad.topNgenes.limits[2])) ) @@ -507,7 +713,7 @@ filterQC <- function(object, nfeature.filter & mitochPer.filter & complexity.filter & - top20.filter & + topN.filter & doublets.fitler filterIndex=as.data.frame(filterIndex) rownames(filterIndex) = rownames(so@meta.data) @@ -516,7 +722,7 @@ filterQC <- function(object, nfeature.filter, mitochPer.filter, complexity.filter, - top20.filter, + topN.filter, doublets.fitler) rownames(filter_matrix)=rownames(so@meta.data) @@ -533,26 +739,90 @@ filterQC <- function(object, cat(paste0("Percent Remaining: " ,perc.remain,"% \n\n")) cat(paste0("# of Cells removed by individual Filters: \n")) print(colSums(filter_matrix==F)) - cat(paste0("\n\n")) - - + cat("\n\n") - cat('Minimum Cells per Gene: ',min.cells,'\n') - cat('nfeature Limits: ',nfeature.limits,'\n') - cat('MAD nfeature Limits: ',mad.nfeature.limits,'\n') - cat('ncounts Limits: ',ncounts.limits,'\n') - cat('MAD ncounts Limits: ',mad.ncounts.limits,'\n') - cat('Percent of Mitochondrial reads per Cell Limits: ',mitoch.limits,'\n') - cat('MAD Percent of Mitochondrial reads per Cell Limits: ', - mad.mitoch.limits,'\n') - cat('Cell Complexity limits: ',complexity.limits,'\n') - cat('MAD Cell Complexity limits: ',mad.complexity.limits,'\n') - cat('percent counts in top ',n.topgnes,' genes: ',topNgenes.limits,'\n') - cat('MAD percent counts in top' ,n.topgnes,' genes: ', - mad.topNgenes.limits,'\n') - cat('Doublets Filter: ',do.doublets.fitler,'\n') + ## create Filter resutls table + filtSum=matrix(nrow=1,ncol=3) + colnames(filtSum)=c("Cells before Filtering", + "Cells after all Filters", + "Percent Remaining") + filtSum[,"Cells before Filtering"]=nrow(filter_matrix) + filtSum[,"Cells after all Filters"]=sum(filterIndex) + filtSum[,"Percent Remaining"]=perc.remain + topN.filterRename=paste0('% Counts in Top',n.topgnes,' Genes filter') + filtTbl=colSums(filter_matrix==F)%>%t()%>%as.data.frame() + filtTbl=rename(filtTbl, + 'UMI Count (nCount_RNA)' = 'ncounts.filter', + 'Gene Count (nFeature_RNA)' ='nfeature.filter', + '% Mitochondrial Genes (percent.mt)'='mitochPer.filter', + 'Complexity (log10GenesPerUMI)'='complexity.filter', + 'DoubletFinder (scDblFinder)'='doublets.fitler', + !!topN.filterRename :='topN.filter') + colnames(filtTbl)=paste('Cells removed by ' ,colnames(filtTbl)) + + filtSum=cbind(filtSum,filtTbl) + filtSum[,"VDJ Genes Removed"]=VDJgenesOut%>%length + rownames(filtSum)=i + # tableGrob(filtSum)%>%plot + + ########################################################## # + ## create Filter Limits table + topN.filterRename=paste0('% Counts in Top',n.topgnes,' Genes') + cat('VDJ Genes Removed: ',length(VDJgenesOut), '\n') + cat('Minimum Cells per Gene: ',min.cells,'\n') + cat('UMI Count (nCount_RNA) Limits: ',ncounts.limits,'\n') + cat('MAD UMI Count (nCount_RNA) Limits: ',mad.ncounts.limits,'\n') + cat('Gene Count (nFeature_RNA) Limits: ',nfeature.limits,'\n') + cat('MAD Gene Count (nFeature_RNA) Limits: ',mad.nfeature.limits,'\n') + cat('% Mitochondrial Genes (percent.mt) Limits: ',mitoch.limits,'\n') + cat('MAD % Mitochondrial Genes (percent.mt) Limits: ',mad.mitoch.limits,'\n') + cat('Complexity (log10GenesPerUMI) Limits: ',complexity.limits,'\n') + cat('MAD Complexity (log10GenesPerUMI) Limits: ',mad.complexity.limits,'\n') + cat(topN.filterRename,' Limits: ',topNgenes.limits,'\n') + cat('MAD ',topN.filterRename,' Limits: ',mad.topNgenes.limits,'\n') + cat('Doublets Filter: ',do.doublets.fitler,'\n') + + ## create Filter Limits table + FiltLmts=matrix(nrow=1,ncol=12) + colnames(FiltLmts)=c("Minimum Cells per Gene", + "UMI Count (nCount_RNA)", + "MAD UMI Count (nCount_RNA)", + "Gene Count (nFeature_RNA)", + "MAD Gene Count (nFeature_RNA)", + "% Mitochondrial Genes (percent.mt)", + "MAD % Mitochondrial Genes (percent.mt)", + "Complexity (log10GenesPerUMI)", + "MAD Complexity (log10GenesPerUMI)", + paste0(topN.filterRename,"") , + paste0('MAD ',topN.filterRename,'') , + "DoubletFinder (scDblFinder)" + ) + + FiltLmts[,'Minimum Cells per Gene']=min.cells + FiltLmts[,'UMI Count (nCount_RNA)']= + paste0(c("Low:","High:"),ncounts.limits)%>%paste(collapse = "\n") + FiltLmts[,'MAD UMI Count (nCount_RNA)']= + paste0(c("Low:","High:"),mad.ncounts.limits)%>%paste(collapse = "\n") + FiltLmts[,'Gene Count (nFeature_RNA)']= + paste0(c("Low:","High:"),nfeature.limits)%>%paste(collapse = "\n") + FiltLmts[,'MAD Gene Count (nFeature_RNA)']= + paste0(c("Low:","High:"),mad.nfeature.limits)%>%paste(collapse = "\n") + FiltLmts[,'% Mitochondrial Genes (percent.mt)']= + paste0(c("Low:","High:"),mitoch.limits)%>%paste(collapse = "\n") + FiltLmts[,'MAD % Mitochondrial Genes (percent.mt)']= + paste0(c("Low:","High:"),mad.mitoch.limits)%>%paste(collapse = "\n") + FiltLmts[,'Complexity (log10GenesPerUMI)']= + paste0(c("Low:","High:"),complexity.limits)%>%paste(collapse = "\n") + FiltLmts[,'MAD Complexity (log10GenesPerUMI)']= + paste0(c("Low:","High:"),mad.complexity.limits)%>%paste(collapse = "\n") + FiltLmts[,paste0(topN.filterRename,'')]= + paste0(c("Low:","High:"),topNgenes.limits)%>%paste(collapse = "\n") + FiltLmts[,paste0('MAD ',topN.filterRename,'')]= + paste0(c("Low:","High:"),mad.topNgenes.limits)%>%paste(collapse = "\n") + FiltLmts[,'DoubletFinder (scDblFinder)']=do.doublets.fitler + rownames(FiltLmts)=i ### Apply Filters #### @@ -568,23 +838,29 @@ filterQC <- function(object, ## Optional: create TSNE plots #### - if(plot.outliers!="FALSE"){ filter.plot.cols=3 + if(plot.outliers!="none"){ filter.plot.cols=3 gtsne.list=lapply(colnames(filter_matrix), function(x){.runTsnepPlot(x,filter_matrix, - so.nf.tsne,plot.outliers)}) + so.nf.qcFiltr,plot.outliers)}) gtsne.all <- arrangeGrob(grobs = gtsne.list, ncol = filter.plot.cols) so2.list <- list(Filtered=so, FilteringMeta=so.nf@meta.data, + FiltLmts=FiltLmts, + filtSum=filtSum, TSNEfilter=gtsne.all ) }else{ so2.list <- list(Filtered=so, - FilteringMeta=so.nf@meta.data) + FilteringMeta=so.nf@meta.data, + FiltLmts=FiltLmts, + filtSum=filtSum) } return(so2.list) + + } @@ -592,48 +868,58 @@ filterQC <- function(object, ## --------------- ## ## Main Code Block #### ## --------------- ## - ## make sure that plot.outliers is character not boolean - plot.outliers =as.character(plot.outliers) + ## make sure that plot.outliers is character not boolean and case insensitive + plot.outliers =tolower(as.character(plot.outliers)) + ## Caluclate filter Metrics so.nf.list=lapply(names(object), function(i){ so=object[[i]] - ## calculate Counts in top 20 Genes + ## calculate Counts in Top 20 Genes ##calculated after min.cell filter as well - so=.perCountsTop20Genes(so,n.topgnes) + so=.topNGenes(so,n.topgnes) ## Annotate Doublets: #### ## Gene filter does not effect doublet ident and so not recalculated + if( do.doublets.fitler==T){ - sce <- as.SingleCellExperiment(so) + sce <- as.SingleCellExperiment(so) + set.seed(123) - sce.dbl <- scDblFinder(sce)%>%suppressWarnings() - sce.class <- sce.dbl$scDblFinder.class - so <- AddMetaData(so,sce.class,"Doublet") + RNGkind("default", "default", "default") + sce.dbl <- scDblFinder(sce,BPPARAM=SerialParam(RNGseed = 123))%>%suppressWarnings() + sce.class <- sce.dbl$scDblFinder.class + so <- AddMetaData(so,sce.class,"Doublet") }else{ print('doublets Identification not Run')} return(so) }) names(so.nf.list)=names(object) - - ### Run Filtering Function #### + so.f.out <- lapply(names(so.nf.list), function(i){.seuratObject(so.nf.list,i)}) names(so.f.out)=names(so.nf.list) + #### Get Filtered SO so.f.list <- lapply(so.f.out,function(x) {x[['Filtered']]}) - - + #### Get Cell filtering Metadata so.nf.list.meta=lapply(names(so.f.out), function(x){so.f.out[[x]][['FilteringMeta']]}) names(so.nf.list.meta)=names(so.f.out) + #### Get filtering Summary Tables + + filtSum=lapply(so.f.out,`[[`,'filtSum')%>%do.call(rbind,.)%>%as.data.frame() + FiltLmts=lapply(so.f.out,`[[`,'FiltLmts')%>%do.call(rbind,.)%>%as.data.frame() + + + ### Collect QC figures #### @@ -680,32 +966,60 @@ filterQC <- function(object, features=c("orig.ident", "nCount_RNA","nFeature_RNA", - "percent.mt","log10GenesPerUMI") + "percent.mt","log10GenesPerUMI", + "pct_counts_in_top_N_genes","DoubletFinder (scDblFinder)") v=features[features%in%c('nCount_RNA','nFeature_RNA', 'percent.mt','log10GenesPerUMI')] + + #### Combine meta.data tables #### - ftable.all=data.frame() - rtable.all=data.frame() + filtTable.all=data.frame() + rawTable.all=data.frame() for(s in names(so.f.list)) { - ftable=so.f.list[[s]]@meta.data - ftable=ftable[,colnames(ftable)%in%features,drop=F] - ftable$Sample=s - ftable$filt='filt' - - rtable=so.nf.list[[s]]@meta.data - rtable=rtable[,colnames(rtable)%in%features,drop=F] - rtable$Sample=s - rtable$filt='raw' - - ftable.all=rbind(ftable.all,ftable) - rtable.all=rbind(rtable.all,rtable) + filtTable=so.f.list[[s]]@meta.data + filtTable=filtTable[,colnames(filtTable)%in%features,drop=F] + filtTable$Sample=s + filtTable$filt='filt' + + rawTable=so.nf.list[[s]]@meta.data + rawTable=rawTable[,colnames(rawTable)%in%features,drop=F] + rawTable$Sample=s + rawTable$filt='raw' + + filtTable.all=rbind(filtTable.all,filtTable) + rawTable.all=rbind(rawTable.all,rawTable) } - table.meta=rbind(ftable.all,rtable.all) + table.meta=rbind(filtTable.all,rawTable.all) table.meta$nFeature_RNA=as.numeric(table.meta$nFeature_RNA) table.meta$filt=factor(table.meta$filt,levels = c('raw','filt')) + topN.filterRename=paste0('% Counts in Top',n.topgnes,' Genes') + + table.meta=rename(table.meta, + 'UMI Count (nCount_RNA)' = 'nCount_RNA', + 'Gene Count (nFeature_RNA)' ='nFeature_RNA', + '% Mitochondrial Genes (percent.mt)'='percent.mt', + 'Complexity (log10GenesPerUMI)'='log10GenesPerUMI', + !!topN.filterRename :='pct_counts_in_top_N_genes' + ) + + + + #add Sample Cutoffs + + table.meta= merge(table.meta,FiltLmts, + by.x='Sample',by.y='row.names', + suffix=c("","_Filters"),all.x=T) + + + v=c('UMI Count (nCount_RNA)' , + 'Gene Count (nFeature_RNA)', + '% Mitochondrial Genes (percent.mt)', + 'Complexity (log10GenesPerUMI)', + topN.filterRename) + #### Create Filter QC Plots #### ### Violin Plots @@ -713,7 +1027,7 @@ filterQC <- function(object, ### Violin Plots for each meta.data metric violin.list=lapply(v,function(x){.plotViolin2(table.meta,x)}) names(violin.list)=v - + colnames(table.meta) ### Combine Violin Plots violin.list.mod=.combinePlots(violin.list) @@ -725,11 +1039,11 @@ filterQC <- function(object, ### Scatter Plots - + ### scatter Plots for each meta.data metric - scatter.list=lapply(v[!v%in%'nCount_RNA'], + scatter.list=lapply(v[!v%in%'UMI Count (nCount_RNA)'], function(x){.plotScatter2(table.meta,x)}) - names(scatter.list)=v[!v%in%'nCount_RNA'] + names(scatter.list)=v[!v%in%'UMI Count (nCount_RNA)'] ### Combine scatter Plots scatter.list.mod=.combinePlots(scatter.list) @@ -748,7 +1062,8 @@ filterQC <- function(object, ### Post Filter Summary - Scatter scatter.allsamples=lapply(v, - function(y){.plotScatterPost2(qc.df.post,'nCount_RNA',y)}) + function(y){.plotScatterPost2( + qc.df.post,'UMI Count (nCount_RNA)',y)}) names(scatter.allsamples)=v scatter.allsamples.grob=ggarrange(plotlist=scatter.allsamples, @@ -779,7 +1094,7 @@ filterQC <- function(object, legend = 'right') violin.allsamples.grob=annotate_figure(violin.allsamples.grob, - top = text_grob("Post Filter - Summary ", + top = text_grob("Filtered QC Summary", face = "bold", size = 14)) @@ -797,13 +1112,13 @@ filterQC <- function(object, suppressMessages()%>%suppressWarnings() postFilter.grobs=annotate_figure(postFilter.grobs, - top = text_grob("Post Filter - Summary ", + top = text_grob("Filtered QC Summary", face = "bold", size = 14)) ### TSNE Plots - if (plot.outliers!="FALSE") { - tsne.grobs <- lapply(so.f.out,function(x) x[['TSNEfilter']]) + if (plot.outliers!="none") { + qcFiltr.grobs <- lapply(so.f.out,function(x) x[['TSNEfilter']]) } @@ -820,42 +1135,36 @@ filterQC <- function(object, gc(full = TRUE) + ### Output #### - if(plot.outliers!='FALSE'){ - return(list(object=so.f.list, - FilteringMeta=so.nf.list.meta, - plots=list( - ViolinPlotCombine=violin.grob, - ViolinPlot=violin.list, - ScatterPlotCombine=scatter.grob, - Scatter=scatter.list, - TSNEFeature=tsne.grobs, - - PostFilterCombined=postFilter.grobs, - ViolinPostFilter=violin.allsamples.grob, - ScatterPostFilter=scatter.allsamples.grob, - HistogramPostFilter=hist.allsamples.grob - ) - ) - ) - } else { - return(list(object=so.f.list, - FilteringMeta=so.nf.list.meta, - plots=list( - ViolinPlotCombine=violin.grob, - ViolinPlot=violin.list, - ScatterPlotCombine=scatter.grob, - Scatter=scatter.list, - - PostFilterCombined=postFilter.grobs, - ViolinPostFilter=violin.allsamples.grob, - ScatterPostFilter=scatter.allsamples.grob, - HistogramPostFilter=hist.allsamples.grob - ) - ) - ) - } + out=list("object"=so.f.list, + "data"=list( + "FilteringMeta"=so.nf.list.meta, + "FilteringCounts"=filtSum, + "FilteringLimits"=FiltLmts + ), + "plots"=list( + "ViolinPlotCombine"=violin.grob, + "ViolinPlot"=violin.list, + "ScatterPlotCombine"=scatter.grob, + "Scatter"=scatter.list, + + "PostFilterCombined"=postFilter.grobs, + "ViolinPostFilter"=violin.allsamples.grob, + "ScatterPostFilter"=scatter.allsamples.grob, + "HistogramPostFilter"=hist.allsamples.grob + ) + ) + + if(plot.outliers!='none'){ + out$plots= + c(out$plots, + "QCFeature"=qcFiltr.grobs) + + } + return(out) + } diff --git a/R/Filter_Seurat_Object_by_Metadata.R b/R/Filter_Seurat_Object_by_Metadata.R index 962b898..2d76180 100644 --- a/R/Filter_Seurat_Object_by_Metadata.R +++ b/R/Filter_Seurat_Object_by_Metadata.R @@ -230,7 +230,11 @@ filterSeuratObjectByMetadata <- function(object, ## --------------- ## # Checking if samples are selected - samples = eval(parse(text = gsub('\\[\\]', 'c()', samples.to.include))) + if(any(grepl('c\\(|\\[\\]',samples.to.include))) { + samples = eval(parse(text = gsub('\\[\\]', 'c()', samples.to.include))) + }else{ + samples=samples.to.include + } if (length(samples) == 0) { samples = unique(object@meta.data[[sample.name[1]]]) @@ -264,12 +268,12 @@ filterSeuratObjectByMetadata <- function(object, ## Get colors from user parameter and add more if the default list is too short. if (class(object@meta.data[[category.to.filter[1]]]) != "numeric") { - col.length = length(levels(as.factor(Filter.orig[colname]))) + col.length = length(levels(as.factor(Filter.orig))) if (length(colors) < col.length) { more.cols = .distinctColorPalette(col.length - length(colors), 10) colors <- c(colors, more.cols) } - names(colors) <- levels(as.factor(Filter.orig[colname])) + names(colors) <- levels(as.factor(Filter.orig)) ## Keep or remove cells based on user input values. if (keep.or.remove) { @@ -316,14 +320,16 @@ filterSeuratObjectByMetadata <- function(object, ## Make before and after plots. title <- paste0("filtered by ", - category.to.filter[1], - " and split by ", - category.to.filter[2]) + category.to.filter[1]#, +## " and split by ", +## category.to.filter[2] + ) plot1 = DimPlot( object, reduction = reduction, group.by = colname, - pt.size = dot.size + pt.size = dot.size, + raster=FALSE ) + theme_classic() + scale_color_manual(values = colors) + @@ -338,7 +344,8 @@ filterSeuratObjectByMetadata <- function(object, reduction = reduction, cells.highlight = idx, cols.highlight = rev(cols2[1:filt.length]), - sizes.highlight = dot.size.highlighted.cells + sizes.highlight = dot.size.highlighted.cells, + raster=FALSE ) + theme_classic() + theme(legend.position = legend.position) + @@ -392,7 +399,9 @@ filterSeuratObjectByMetadata <- function(object, result.list <- list("object" = SO.sub, - "plot1" = plot1, - "plot2" = plot2) + "plots"=list( + "plot1" = plot1, + "plot2" = plot2) + ) return(result.list) } diff --git a/R/Harmony.R b/R/Harmony.R index 1af185b..bca6f9f 100644 --- a/R/Harmony.R +++ b/R/Harmony.R @@ -33,19 +33,19 @@ object = readRDS('tests/testthat/fixtures/BRCA/BRCA_Combine_and_Renormalize_SO_downsample.rds') -harmonyBatchCorrect <- function(object, - nvar = 200, +harmonyBatchCorrect <- function(object, + nvar = 2000, genes.to.add = c(), group.by.var, return_lognorm = T, npc = 30) { - library(patchwork) - library(harmony) - library(Seurat) - library(ggplot2) - library(RColorBrewer) - +library(patchwork) +library(harmony) +library(Seurat) +library(ggplot2) +library(RColorBrewer) + # Error and Warning Messages if(is.null(genes.to.add)){ print("no genes will be added") @@ -68,7 +68,6 @@ harmonyBatchCorrect <- function(object, sdat.tsne.orig <- data.frame(as.vector(object@reductions$tsne@cell.embeddings[,1]), as.vector(object@reductions$tsne@cell.embeddings[,2]), object@meta.data[eval(parse(text = "group.by.var"))]) - names(sdat.tsne.orig) <- c("TSNE1","TSNE2","ident") sdat.umap.orig <- data.frame(as.vector(object@reductions$umap@cell.embeddings[,1]), @@ -139,30 +138,30 @@ harmonyBatchCorrect <- function(object, object@reductions$pca@cell.embeddings <- ppembed object@reductions$pca@feature.loadings <- ppldngs object@reductions$pca@stdev <- pppca$d - - # Store original log-normalized data and scaling parameters for back-calculation - if (return_lognorm) { - library(Matrix) - # Get log-normalized data for the variable features - lognorm_data <- object@assays$SCT@data[mvf, , drop = FALSE] - print(str(object)) - print("hello") - print(class(lognorm_data)) - print(dim(lognorm_data)) - - # Calculate scaling parameters from the original scaled data - #scale_center <- Matrix::rowMeans(lognorm_data) - scale_center <- Matrix::rowMeans(as.matrix(lognorm_data)) - scale_scale <- apply(lognorm_data, 1, sd) - - # Store these for later reconstruction - scaling_params <- list( - center = scale_center, - scale = scale_scale, - genes = mvf - ) - } - + + # Store original log-normalized data and scaling parameters for back-calculation + if (return_lognorm) { + library(Matrix) + # Get log-normalized data for the variable features + lognorm_data <- object@assays$SCT@data[mvf, , drop = FALSE] + print(str(object)) + print("hello") + print(class(lognorm_data)) + print(dim(lognorm_data)) + + # Calculate scaling parameters from the original scaled data + #scale_center <- Matrix::rowMeans(lognorm_data) + scale_center <- Matrix::rowMeans(as.matrix(lognorm_data)) + scale_scale <- apply(lognorm_data, 1, sd) + + # Store these for later reconstruction + scaling_params <- list( + center = scale_center, + scale = scale_scale, + genes = mvf + ) + } + # By default, Harmony corrects pca embeddings. # Set do_pca to FALSE to use your own pca embeddings. # Stores adjusted embeddings in harmony reduction slot @@ -171,7 +170,7 @@ harmonyBatchCorrect <- function(object, do_pca=FALSE, assay.use = "SCT", plot_convergence = FALSE) - + object <- RunUMAP(object, reduction = "harmony", dims = 1:npc) object <- RunTSNE(object, reduction = "harmony", dims = 1:npc) @@ -222,27 +221,30 @@ harmonyBatchCorrect <- function(object, # Store batch-corrected scaled data in Harmony assay if (return_lognorm) { - # Fast conversion back to log-normalized space - # Direct vectorized operations on the transposed matrix - harm.lvl.backcalc.lognorm <- t(harm.lvl.backcalc.scaled) * scaling_params$scale[mvf] + scaling_params$center[mvf] - - print("Batch-corrected data stored in 'Harmony' assay:") - print("- Log-normalized data: object@assays$Harmony@data") - print("- Scaled data: object@assays$Harmony@scale.data") - } else { - print("Batch-corrected scaled data stored in object@assays$Harmony@scale.data") - } - - # Insert back-calculated data into seurat - object[["Harmony"]] <- CreateAssayObject(data = harm.lvl.backcalc.lognorm) - object@assays$Harmony@scale.data <- t(harm.lvl.backcalc.scaled) - - object <- ScaleData(object, assay = "Harmony", verbose = FALSE) - - # re-run PCA on harmony embeddings using top variable genes (mvf) - object <- RunPCA(object, assay = "Harmony", verbose = FALSE, features = rownames(object)) - - object <- FindNeighbors(object, reduction = "harmony", dims = 1:10, assay = "Harmony") + # Fast conversion back to log-normalized space + # Direct vectorized operations on the transposed matrix + harm.lvl.backcalc.lognorm <- t(harm.lvl.backcalc.scaled) * scaling_params$scale[mvf] + scaling_params$center[mvf] + + print("Batch-corrected data stored in 'Harmony' assay:") + print("- Log-normalized data: object@assays$Harmony@data") + print("- Scaled data: object@assays$Harmony@scale.data") + } else { + print("Batch-corrected scaled data stored in object@assays$Harmony@scale.data") + } + + # Insert back-calculated data into seurat + object[["Harmony"]] <- CreateAssayObject(data = harm.lvl.backcalc.lognorm) + #object[["Harmony"]] <- CreateAssayObject(data = Matrix::Matrix(t(harm.lvl.backcalc.lognorm), sparse = TRUE)) + object@assays$Harmony@scale.data <- t(harm.lvl.backcalc.scaled) + + object <- ScaleData(object, assay = "Harmony", verbose = FALSE) + + # re-run PCA on harmony embeddings using top variable genes (mvf) + object <- RunPCA(object, assay = "Harmony", verbose = FALSE, features = rownames(object)) + + object <- FindNeighbors(object, reduction = "harmony", dims = 1:10, assay = "Harmony") - return(object) + return( + list("object"=object) + ) } diff --git a/R/Heatmap.R b/R/Heatmap.R index f1e9246..077bea8 100755 --- a/R/Heatmap.R +++ b/R/Heatmap.R @@ -522,6 +522,8 @@ heatmapSC <- function(object, #Return expression matrix used in heatmap heatmap.df <- as.data.frame(tmean.scale) %>% rownames_to_column("gene") - heatmap.res <- list("plot" = p, "data" = heatmap.df) + + heatmap.res <- list("data" = heatmap.df, + "plots" = p ) return(heatmap.res) } diff --git a/R/ModuleScore.R b/R/ModuleScore.R index 9a19147..db3cbae 100644 --- a/R/ModuleScore.R +++ b/R/ModuleScore.R @@ -5,21 +5,52 @@ #' control features are randomly selected from each bin. #' #' @param object Seurat-class object -#' @param marker.table Table of marker genes for each celltype -#' (column names of the table), append "_prot" or -#' "_neg" for proteins or negative markers -#' @param cite.seq Set to TRUE if there are CITE-seq markers in -#' marker.table (Default: FALSE) -#' @param celltypes Vector of celltypes from marker.table to -#' screen for -#' @param threshold Specify bimodal thresholds for cell classification, -#' should be of the same length as celltypes -#' vector -#' @param general.class Base population of cells to classify -#' @param multi.lvl Toggle to TRUE if there are subpopulations of cells -#' you want to screen for (Default: FALSE) -#' @param lvl.df Table of subpopulation levels and parent-child -#' information (e.g. Tcells-CD4, Tcells-CD8) +#' @param marker.table A table of lists of gene/protein markers for the +#' categories of cells you want to detect. +#' The table should be formatted with cell type(s) +#' as the column names, and marker(s) as the entries +#' in each column. +#' Requires SCT@data to be present within Seurat Object +#' @param use_columns Select specific columns within Marker Table to analyze. +#' Markers from unselected columns won't be included. +#' @param ms_threshold Allow user-specified module score thresholds. +#' Provide one threshold for each Celltype you included +#' in the "use_columns" parameter. +#' For each Celltype, provide the Celltype name, +#' then a space, then type your threshold for that Celltype. +#' This threshold must be a number between 0.0 and 1.0. +#' E.g. "Tcells 0.2", "Macrophages 0.37". +#' For best results, follow these steps: +#' (1) Set thresholds at 0.0 for a preliminary view of data. +#' (2) Use the resulting visualizations to estimate the +#' correct thresholds for each Celltype. +#' (3) Adjust your thresholds based on what you saw in the +#' visualizations. +#' (4) Re-run the template with the new thresholds. +#' (5) Review the visualizations again and +#' repeat Steps 1-5 if you think thresholds can be +#' further improved. +#' @param general.class Select which of the classes (i.e. which columns) +#' in your Marker Table represent the General Classes. +#' A general class is any class that is not a subtype of +#' another class. +#' @param multi.lvl set True if there are multiple subclasses of cells you +#' would like to classify. +#' Note: requires a manual entry table with columns specifying +#' levels and comparisons. Each column of this table should +#' represent one level of subclass within your General Classes. +#' Each value within a column should be two Class names +#' separated by a dash (-) showing the General-to-SubClass +#' relationship. +#' Example: To classify T-cells and then attempt to classify +#' those T-cells further into either CD8 or CD4 T-cells, +#' you would write a column named +#' "Level_1", then add "T_cell-CD8_T" and "T_cell-CD4_T" to +#' that column. Note that in this example, "T_cell" +#' is a General Class and "CD8_T" and "CD4_T" are not. +#' @param lvl.df Dataframe containing levels information as well as +#' parent-children designation (E.g. Tcells-CD4). +#' Required if Multi Level Classification is turned on.#' #' @param reduction Choose among tsne, umap, and pca (Default: tsne) #' @param nbins Number of bins for storing control features and analyzing #' average expression (Default: 10) @@ -40,17 +71,17 @@ #' @importFrom dplyr select #' #' @export -#' @example Do not run: moduleScore(object = seurat, +#' @example Do not run: moduleScore(object = seuratObject, #' marker.table = immuneCellMarkers, #' celltypes = c("CD4_T","Treg",Monocytes"), -#' threshold = c(0.1,0.4, 0.3), +#' ms_threshold = c("CD4_T 0.1","Treg 0.4", "Monocytes 0.3"), #' multi.lvl = FALSE #' ) #' -#' @example Do not run: moduleScore(object = seurat, +#' @example Do not run: moduleScore(object = seuratObject, #' marker.table = immuneCellMarkers, #' celltypes = c("CD4_T","Treg",Monocytes"), -#' threshold = c(0.1,0.4, 0.3), +#' ms_threshold = c("CD4_T 0.1","Treg 0.4", "Monocytes 0.3"), #' general.class = c("CD_T","Monocytes"), #' multi.lvl = TRUE, #' lvl.df = parentChildTable @@ -60,272 +91,247 @@ #' distribution of cell marker gene, Seurat Object with cell #' classification metadata -modScore <- function(object, marker.table, ms.threshold, use_assay = "SCT", - general.class, lvl.vec = c(), reduction = "tsne", - nbins = 10, gradient.ft.size = 6, - violin.ft.size = 6, step.size = 0.1) +modScore <- function(object, + marker.table, + use_columns, + ms_threshold, + general.class, + multi.lvl = FALSE, + lvl.df=NULL, + reduction = "tsne", + nbins = 10, + gradient.ft.size = 6, + violin.ft.size = 6, + step.size = 0.1) { - library(Seurat) - library(gridExtra) - library(grid) - library(dplyr) - library(stringr) - library(ggplot2) - - # Function for separating and calling cells by bimodal thresholds - .modScoreCall <- function(ms.meta, numeric_threshold, reject) { - thres.ls <- list() - for (i in 1:ncol(ms.meta)) { - thres.ls[[i]] <- rep(numeric_threshold[i], nrow(ms.meta)) - } - thres.df <- data.frame(matrix(unlist(thres.ls), nrow = nrow(ms.meta))) - thres.filter <- ms.meta > thres.df - ms.meta.filt <- ms.meta * thres.filter - max.col.vec <- max.col(ms.meta.filt) - zero.filt <- as.integer(!apply(ms.meta.filt, 1, function(find_zero_rows) all(find_zero_rows == 0))) - final.filt <- (max.col.vec * zero.filt) + 1 - append.name <- c(reject, names(ms.meta)) - dupl.data <- ms.meta - dupl.data[, "MS_Celltype"] <- append.name[final.filt] - return(dupl.data) - } - - # Upstream processing - # String split celltype_thresholds - numeric portion - numeric_threshold <- sapply(stringr::str_split(ms.threshold, " "), function(x) as.numeric(x[2])) - if (!"Barcode" %in% colnames(object@meta.data)) { - object@meta.data$Barcode <- rownames(object@meta.data) - } - colnames(object@meta.data) <- gsub("orig_ident", "orig.ident", - colnames(object@meta.data)) - - # Marker table processing - marker.tab <- unlist(marker.table) - celltypes <- sapply(str_split(ms.threshold, " "), function(x) as.character(x[1])) - marker = select(marker.table, celltypes) - marker.list = as.list(marker) - if (sum(unlist(marker.list) %in% rownames(object@assays$SCT@data)) == - 0) { - stop("No genes from list was found in data") - } - if (length(numeric_threshold) != length(celltypes)) { - if (sum(numeric_threshold) == 0) { - numeric_threshold <- rep(0, length(celltypes)) - print("Module Score threshold set to zero - outputing preliminary data") - } else { - stop("Threshold length does not match # celltypes to analyze") + library(Seurat) + library(gridExtra) + library(grid) + library(dplyr) + library(stringr) + library(ggplot2) + + # Function for separating and calling cells by bimodal thresholds + .modScoreCall <- function(ms.meta, numeric_threshold, reject) { + thres.ls <- list() + for (i in 1:ncol(ms.meta)) { + thres.ls[[i]] <- rep(numeric_threshold[i], nrow(ms.meta)) + } + thres.df <- data.frame(matrix(unlist(thres.ls), nrow = nrow(ms.meta))) + thres.filter <- ms.meta > thres.df + ms.meta.filt <- ms.meta * thres.filter + max.col.vec <- max.col(ms.meta.filt) + zero.filt <- as.integer(!apply(ms.meta.filt, 1, function(find_zero_rows) all(find_zero_rows == 0))) + final.filt <- (max.col.vec * zero.filt) + 1 + append.name <- c(reject, names(ms.meta)) + dupl.data <- ms.meta + dupl.data[, "MS_Celltype"] <- append.name[final.filt] + return(dupl.data) } - } - - # For each celltype, print out present / nonpresent genes, calculate MS and generate plots - names(numeric_threshold) <- celltypes - figures <- list() - exclude_cells <- c() - h = 0 - j = 1 - for (h in seq_along(marker.list)) { - print(names(marker.list[h])) - present = lapply(marker.list[[h]], function(x) x %in% - rownames(object@assays$SCT@data)) - absentgenes = unlist(marker.list[[h]])[present == FALSE] - absentgenes = absentgenes[is.na(absentgenes) == F] - presentgenes = unlist(marker.list[[h]])[present == TRUE] - presentgenes = presentgenes[is.na(presentgenes) == F] - print(paste0("Genes not present: ", paste0(absentgenes, - collapse = ","))) - print(paste0("Genes present: ", paste0(presentgenes, - collapse = ","))) - if (length(presentgenes) == 0) { - print(paste0(names(marker.list[h]), " genes were not found in object and will not be analyzed")) - exclude_cells[j] <- h - j = j + 1 + + # Upstream processing + # String split celltype_thresholds - numeric portion + numeric_threshold <- sapply(stringr::str_split(ms_threshold, " "), function(x) as.numeric(x[2])) + + if (!"Barcode" %in% colnames(object@meta.data)) { + object@meta.data$Barcode <- rownames(object@meta.data) } - } - # End of check present / absent genes - - if (length(exclude_cells) > 0) { - marker.list <- marker.list[-exclude_cells] - } else { - marker.list <- marker.list - } - - # clean up list, remove NAs for faster run - marker.list <- lapply(marker.list, na.omit) - - # Calculate MS, make density plots - for (celltype_name in names(marker.list)) { - object = AddModuleScore(object, marker.list[celltype_name], - name = celltype_name, nbin = nbins, - assay = use_assay) - m = paste0(celltype_name, "1") - object@meta.data[[m]] <- scales::rescale(object@meta.data[[m]], - to = c(0, 1)) + colnames(object@meta.data) <- gsub("orig_ident", "orig.ident", + colnames(object@meta.data)) - # Do plots for just general (parent) celltypes - if (celltype_name %in% general.class){ - clusid = object@meta.data[[m]] - d <- density(clusid) - - # Make dimension reduction tables and plots - if (reduction == "tsne") { - p1 <- DimPlot(object, reduction = "tsne", group.by = "ident") - } else if (reduction == "umap") { - p1 <- DimPlot(object, reduction = "umap", group.by = "ident") - } else { - p1 <- DimPlot(object, reduction = "pca", group.by = "ident") - } - - if (reduction == "tsne") { - clusmat = data.frame(ident = p1$data$ident, umap1 = p1$data$tSNE_1, umap2 = p1$data$tSNE_2, clusid = as.numeric(object@meta.data[[m]])) - } else if (reduction == "umap") { - clusmat = data.frame(ident = p1$data$ident, umap1 = p1$data$UMAP_1, umap2 = p1$data$UMAP_2, clusid = as.numeric(object@meta.data[[m]])) - } else { - clusmat = data.frame(ident = p1$data$ident, umap1 = p1$data$PC_1, - umap2 = p1$data$PC_2, clusid = as.numeric(object@meta.data[[m]]))} - - clusmat <- mutate(clusmat, sample_clusid = clusmat$clusid) - umap.pos <- clusmat %>% group_by(clusid) %>% dplyr::summarise(umap1.mean = mean(umap1), umap2.mean = mean(umap2)) - title = as.character(m) - clusmat <- clusmat %>% dplyr::arrange(clusid) - clusid.df <- data.frame(id = object@meta.data$orig.ident, - ModuleScore = object@meta.data[[m]]) - - g <- ggplot(clusmat, aes(x = umap1, y = umap2)) + theme_bw() + - theme(legend.title = element_blank()) + geom_point(aes(colour = sample_clusid), alpha = 0.5, shape = 20, size = 1) + scale_color_gradientn(colours = c("blue4", "lightgrey", "red"), values = scales::rescale(c(0, - numeric_threshold[celltype_name]/2, numeric_threshold[celltype_name], (numeric_threshold[celltype_name] + 1)/2, - 1), limits = c(0, 1))) + guides(colour = guide_legend(override.aes = list(size = 5, alpha = 1))) + theme(panel.grid.major = element_blank(), - panel.grid.minor = element_blank(), panel.background = element_blank()) + xlab("tsne-1") + ylab("tsne-2") - - g1 <- RidgePlot(object, features = m, group.by = "orig.ident") + - theme(legend.position = "none", title = element_blank(), - axis.text.x = element_text(size = gradient.ft.size)) + - geom_vline(xintercept = numeric_threshold[celltype_name], linetype = "dashed", - color = "red3") + scale_x_continuous(breaks = seq(0, - 1, step.size)) - - g2 <- ggplot(clusid.df, aes(x = id, y = ModuleScore)) + - geom_violin(aes(fill = id)) + theme_classic() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.title = element_blank(), panel.background = element_blank(), axis.text.x = element_blank(), legend.text = element_text(size = rel(0.8)), legend.position = "top", axis.text.y = element_text(size = violin.ft.size)) + - guides(colour = guide_legend(override.aes = list(size = 5, - alpha = 1))) + geom_hline(yintercept = numeric_threshold[celltype_name], - linetype = "dashed", color = "red3") + scale_y_continuous(breaks = seq(0, 1, step.size)) - - g3 <- ggplot(data.frame(x = d$x, y = d$y), aes(x, y)) + - xlab("ModuleScore") + ylab("Density") + geom_line() + - geom_segment(aes(xend = d$x, yend = 0, colour = x)) + - scale_y_log10() + scale_color_gradientn(colours = c("blue4", - "lightgrey", "red"), values = scales::rescale(c(0, - numeric_threshold[celltype_name]/2, numeric_threshold[celltype_name], (numeric_threshold[celltype_name] + 1)/2, - 1), limits = c(0, 1))) + geom_vline(xintercept = numeric_threshold[celltype_name], - linetype = "dashed", color = "red3") + geom_vline(xintercept = numeric_threshold[celltype_name], linetype = "dashed", color = "red3") + scale_x_continuous(breaks = seq(0, 1, step.size)) + theme(legend.title = element_blank(), - axis.text.x = element_text(size = 6)) - - figures[[celltype_name]] = arrangeGrob(g, g1, g2, g3, ncol = 2, top = textGrob(paste0(celltype_name," (General Class)"), gp = gpar(fontsize = 14, fontface = "bold"))) + # Marker table processing + marker.table <- marker.table[,use_columns] + marker.tab <- unlist(marker.table) + celltypes <- sapply(str_split(ms_threshold, " "), function(x) as.character(x[1])) + + if (any(!celltypes %in% use_columns)){ + unmatched_celltypes <- celltypes[!celltypes %in% use_columns] + celltype_mismatch_message <- paste0("Labels from thresholds does not match columns from marker table: ",paste(unmatched_celltypes, collapse = ", ")) + stop(celltype_mismatch_message) } - } - - # Rename MS columns - get rid of "1" at the end - colnames(object@meta.data)[colnames(object@meta.data) %in% - paste0(names(marker.list), 1)] <- names(marker.list) - - # First annotate general level of celltypes - general.class <- general.class[general.class %in% colnames(object@meta.data)] - trunc.meta.gen <- object@meta.data[general.class] - gen.thrs.vec <- numeric_threshold[general.class] - call.res <- .modScoreCall(trunc.meta.gen, gen.thrs.vec, reject = "unknown") - call.res$Barcode <- rownames(call.res) - - ### Hierarchical Annotation ### - # Specific celltypes - # convert lvl_vec to lvl.df - if(length(lvl.vec) > 0){ - cell_pop <- str_split(lvl.vec, '-') - - # cell_pop: a list of str_split elements from lvl.vec - entry_list = vector("list", length = length(cell_pop)) - - for(i in 1:length(cell_pop)){ - # pair cells together - cnt = 2 - vec = c() - - # as long as there are non NAs left, keep updating vec - while(!is.na(cell_pop[[i]][cnt])){ - - entry = paste0(cell_pop[[i]][cnt-1],'-',cell_pop[[i]][cnt]) - vec = c(vec, entry) - cnt = cnt + 1 - - } - - entry_list[[i]] = vec + + marker = select(marker.table, celltypes) + marker.list = as.list(marker) + if (sum(unlist(marker.list) %in% rownames(object@assays$SCT@data)) == + 0) { + stop("No genes from list was found in data") } - - ### Make levels data.frame ### - # Pad the shorter entries with NA - max_len <- max(sapply(entry_list, length)) - padded_list <- lapply(entry_list, function(x) { - length(x) <- max_len # implicitly pads with NAs - return(x) - }) - - lvl.df <- as.data.frame(do.call(rbind, padded_list), stringsAsFactors = FALSE) - - # clean up lvl.df by removing duplicated entries across columns - lvl.df <- as.data.frame(lapply(lvl.df, function(col) { - col[duplicated(col)] <- NA - col - })) - - for (k in 1:ncol(lvl.df)) { - - sub.class.call <- list() - store.sub.class <- lvl.df[[k]][!is.na(lvl.df[[k]])] - parent.class <- unique(gsub("(.*)-(.*)", "\\1", store.sub.class)) - - for (parent in parent.class) { - sub.class <- store.sub.class[grepl(parent, store.sub.class)] - children_class <- gsub("(.*)-(.*)", "\\2", sub.class) - parents <- call.res$Barcode[call.res$MS_Celltype == - parent] - trunc.meta.parent <- object@meta.data[parents, - ] %>% select(children_class) - - gap_ind <- which(names(figures) == parent) - - # Stop hierarchical classification in case no parent cell can be called - if (nrow(trunc.meta.parent) == 0){ - stop(paste0("No ",parent," can be called in ","level ",k-1," classification, try setting more lenient thresholds"))} - - for (child in children_class) { - plot.title <- paste("Density plot for", child, - "Module Scores within", parent, "population", - sep = " ") - - figures <- append(figures, list(NA), after = gap_ind) - - figures[[gap_ind+1]] <- ggplot(trunc.meta.parent, aes_string(x = child)) + geom_density() + ggtitle(plot.title) + geom_vline(xintercept = numeric_threshold[child], linetype = "dashed", color = "red3") + theme_classic() - names(figures)[gap_ind+1] <- child + if (length(numeric_threshold) != length(celltypes)) { + if (sum(numeric_threshold) == 0) { + numeric_threshold <- rep(0, length(celltypes)) + print("Module Score threshold set to zero - outputing preliminary data") + } else { + stop("Threshold length does not match # celltypes to analyze") + } + } + + # For each celltype, print out present / nonpresent genes, calculate MS and generate plots + names(numeric_threshold) <- celltypes + figures <- list() + exclude_cells <- c() + h = 0 + j = 1 + for (h in seq_along(marker.list)) { + print(names(marker.list[h])) + present = lapply(marker.list[[h]], function(x) x %in% + rownames(object@assays$SCT@data)) + absentgenes = unlist(marker.list[[h]])[present == FALSE] + absentgenes = absentgenes[is.na(absentgenes) == F] + presentgenes = unlist(marker.list[[h]])[present == TRUE] + presentgenes = presentgenes[is.na(presentgenes) == F] + print(paste0("Genes not present: ", paste0(absentgenes, + collapse = ","))) + print(paste0("Genes present: ", paste0(presentgenes, + collapse = ","))) + if (length(presentgenes) == 0) { + print(paste0(names(marker.list[h]), " genes were not found in object and will not be analyzed")) + exclude_cells[j] <- h + j = j + 1 } - - trunc.meta.no.parent <- call.res[!call.res$MS_Celltype == - parent, ] - non.parent <- rownames(trunc.meta.no.parent) - child.thres.vec <- numeric_threshold[children_class] - - sub.class.call[[match(parent, parent.class)]] <- .modScoreCall(trunc.meta.parent, child.thres.vec, reject = parent) %>% select(MS_Celltype)} - - sub.class.call <- do.call(rbind, sub.class.call) - sub.class.call$Barcode <- rownames(sub.class.call) - call.res$temp.call <- sub.class.call$MS_Celltype[match(call.res$Barcode, sub.class.call$Barcode)] - call.res <- call.res %>% mutate(MS_Celltype = case_when(is.na(temp.call) ~ MS_Celltype, TRUE ~ temp.call)) - call.res$temp.call <- NULL } - } - - object@meta.data$MS_Celltype <- call.res$MS_Celltype[match(object@meta.data$Barcode, call.res$Barcode)] - - lapply(figures, plot) - - return(object) + # End of check present / absent genes + + if (length(exclude_cells) > 0) { + marker.list <- marker.list[-exclude_cells] + } else { + marker.list <- marker.list + } + + # Calculate MS, make density plots + for (celltype_name in names(marker.list)) { + object = AddModuleScore(object, marker.list[celltype_name], + name = celltype_name, nbin = nbins, assay = "SCT") + m = paste0(celltype_name, "1") + object@meta.data[[m]] <- scales::rescale(object@meta.data[[m]], + to = c(0, 1)) + + # Do plots for just general (parent) celltypes + if (celltype_name %in% general.class){ + clusid = object@meta.data[[m]] + d <- density(clusid) + + # Make dimension reduction tables and plots + if (reduction == "tsne") { + p1 <- DimPlot(object, reduction = "tsne", group.by = "ident") + } else if (reduction == "umap") { + p1 <- DimPlot(object, reduction = "umap", group.by = "ident") + } else { + p1 <- DimPlot(object, reduction = "pca", group.by = "ident") + } + + if (reduction == "tsne") { + clusmat = data.frame(ident = p1$data$ident, umap1 = p1$data$tSNE_1, umap2 = p1$data$tSNE_2, clusid = as.numeric(object@meta.data[[m]])) + } else if (reduction == "umap") { + clusmat = data.frame(ident = p1$data$ident, umap1 = p1$data$UMAP_1, umap2 = p1$data$UMAP_2, clusid = as.numeric(object@meta.data[[m]])) + } else { + clusmat = data.frame(ident = p1$data$ident, umap1 = p1$data$PC_1, + umap2 = p1$data$PC_2, clusid = as.numeric(object@meta.data[[m]]))} + + clusmat <- mutate(clusmat, sample_clusid = clusmat$clusid) + umap.pos <- clusmat %>% group_by(clusid) %>% dplyr::summarise(umap1.mean = mean(umap1), umap2.mean = mean(umap2)) + title = as.character(m) + clusmat <- clusmat %>% dplyr::arrange(clusid) + clusid.df <- data.frame(id = object@meta.data$orig.ident, + ModuleScore = object@meta.data[[m]]) + + g <- ggplot(clusmat, aes(x = umap1, y = umap2)) + theme_bw() + + theme(legend.title = element_blank()) + geom_point(aes(colour = sample_clusid), alpha = 0.5, shape = 20, size = 1) + scale_color_gradientn(colours = c("blue4", "lightgrey", "red"), values = scales::rescale(c(0, + numeric_threshold[celltype_name]/2, numeric_threshold[celltype_name], (numeric_threshold[celltype_name] + 1)/2, + 1), limits = c(0, 1))) + guides(colour = guide_legend(override.aes = list(size = 5, alpha = 1))) + theme(panel.grid.major = element_blank(), + panel.grid.minor = element_blank(), panel.background = element_blank()) + xlab("tsne-1") + ylab("tsne-2") + + g1 <- RidgePlot(object, features = m, group.by = "orig.ident") + + theme(legend.position = "none", title = element_blank(), + axis.text.x = element_text(size = gradient.ft.size)) + + geom_vline(xintercept = numeric_threshold[celltype_name], linetype = "dashed", + color = "red3") + scale_x_continuous(breaks = seq(0, + 1, step.size)) + + g2 <- ggplot(clusid.df, aes(x = id, y = ModuleScore)) + + geom_violin(aes(fill = id)) + theme_classic() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.title = element_blank(), panel.background = element_blank(), axis.text.x = element_blank(), legend.text = element_text(size = rel(0.8)), legend.position = "top", axis.text.y = element_text(size = violin.ft.size)) + + guides(colour = guide_legend(override.aes = list(size = 5, + alpha = 1))) + geom_hline(yintercept = numeric_threshold[celltype_name], + linetype = "dashed", color = "red3") + scale_y_continuous(breaks = seq(0, 1, step.size)) + + g3 <- ggplot(data.frame(x = d$x, y = d$y), aes(x, y)) + + xlab("ModuleScore") + ylab("Density") + geom_line() + + geom_segment(aes(xend = d$x, yend = 0, colour = x)) + + scale_y_log10() + scale_color_gradientn(colours = c("blue4", + "lightgrey", "red"), values = scales::rescale(c(0, + numeric_threshold[celltype_name]/2, numeric_threshold[celltype_name], (numeric_threshold[celltype_name] + 1)/2, + 1), limits = c(0, 1))) + geom_vline(xintercept = numeric_threshold[celltype_name], + linetype = "dashed", color = "red3") + geom_vline(xintercept = numeric_threshold[celltype_name], linetype = "dashed", color = "red3") + scale_x_continuous(breaks = seq(0, 1, step.size)) + theme(legend.title = element_blank(), + axis.text.x = element_text(size = 6)) + + figures[[celltype_name]] = arrangeGrob(g, g1, g2, g3, ncol = 2, top = textGrob(paste0(celltype_name," (General Class)"), gp = gpar(fontsize = 14, fontface = "bold"))) + } + } + + # Rename MS columns - get rid of "1" at the end + colnames(object@meta.data)[colnames(object@meta.data) %in% + paste0(names(marker.list), 1)] <- names(marker.list) + + # Heirarchical classification: general.class > subtypes + general.class <- general.class[general.class %in% colnames(object@meta.data)] + trunc.meta.gen <- object@meta.data[general.class] + gen.thrs.vec <- numeric_threshold[general.class] + call.res <- .modScoreCall(trunc.meta.gen, gen.thrs.vec, reject = "unknown") + call.res$Barcode <- rownames(call.res) + + if (multi.lvl) { + for (k in 1:ncol(lvl.df)) { + + sub.class.call <- list() + store.sub.class <- lvl.df[[k]][!is.na(lvl.df[[k]])] + parent.class <- unique(gsub("(.*)-(.*)", "\\1", store.sub.class)) + + for (parent in parent.class) { + sub.class <- store.sub.class[grepl(parent, store.sub.class)] + children_class <- gsub("(.*)-(.*)", "\\2", sub.class) + parents <- call.res$Barcode[call.res$MS_Celltype == + parent] + trunc.meta.parent <- object@meta.data[parents, + ] %>% select(children_class) + + gap_ind <- which(names(figures) == parent) + + # Stop hierarchical classification in case no parent cell can be called + if (nrow(trunc.meta.parent) == 0){ + stop(paste0("No ",parent," can be called in ","level ",k-1," classification, try setting more lenient thresholds"))} + + for (child in children_class) { + plot.title <- paste("Density plot for", child, + "Module Scores within", parent, "population", + sep = " ") + + figures <- append(figures, list(NA), after = gap_ind) + + figures[[gap_ind+1]] <- ggplot(trunc.meta.parent, aes_string(x = child)) + geom_density() + ggtitle(plot.title) + geom_vline(xintercept = numeric_threshold[child], linetype = "dashed", color = "red3") + theme_classic() + names(figures)[gap_ind+1] <- child + } + + trunc.meta.no.parent <- call.res[!call.res$MS_Celltype == + parent, ] + non.parent <- rownames(trunc.meta.no.parent) + child.thres.vec <- numeric_threshold[children_class] + + sub.class.call[[match(parent, parent.class)]] <- .modScoreCall(trunc.meta.parent, child.thres.vec, reject = parent) %>% select(MS_Celltype)} + + sub.class.call <- do.call(rbind, sub.class.call) + sub.class.call$Barcode <- rownames(sub.class.call) + call.res$temp.call <- sub.class.call$MS_Celltype[match(call.res$Barcode, sub.class.call$Barcode)] + call.res <- call.res %>% mutate(MS_Celltype = case_when(is.na(temp.call) ~ MS_Celltype, TRUE ~ temp.call)) + call.res$temp.call <- NULL + } + } + + object@meta.data$MS_Celltype <- call.res$MS_Celltype[match(object@meta.data$Barcode, call.res$Barcode)] + + #lapply(figures, plot) + + return( + list("object"=object, + "figures" = figures) + ) } \ No newline at end of file diff --git a/R/Name_Clusters_by_Enriched_Cell_Type.R b/R/Name_Clusters_by_Enriched_Cell_Type.R index 31c91fb..5af13db 100644 --- a/R/Name_Clusters_by_Enriched_Cell_Type.R +++ b/R/Name_Clusters_by_Enriched_Cell_Type.R @@ -24,7 +24,7 @@ #' @param interactive If TRUE, draw plotly plot (default is FALSE) #' #' @importFrom dplyr pull -#' @importFrom reshape2 melt +#' @importFrom reshape2 reshape2::melt #' @importFrom ggplot2 ggplot geom_point aes theme_classic ylim scale_y_reverse #' theme ggtitle #' @importFrom plotly ggplotly @@ -38,6 +38,7 @@ #' custom cluster annotation and a plot nameClusters <- function(object, + cluster.identities.table, cluster.numbers, cluster.names, cluster.column, @@ -47,25 +48,29 @@ nameClusters <- function(object, interactive = FALSE) { - # Assign cluster numbers with custom cluster names - cluster.numbers <- factor(cluster.numbers, - str_sort(cluster.numbers, numeric = TRUE)) - levels(cluster.numbers) <- - str_sort(cluster.numbers, numeric = TRUE) - names(cluster.names) <- as.character(cluster.numbers) + # # Assign cluster numbers with custom cluster names + # cluster.numbers <- factor(cluster.numbers, + # str_sort(cluster.numbers, numeric = TRUE)) + # levels(cluster.numbers) <- + # str_sort(cluster.numbers, numeric = TRUE) + # # names(cluster.names) <- as.character(cluster.numbers) + + cluster.names= setNames(cluster.identities.table[[cluster.names]],cluster.identities.table[[cluster.numbers]]) + # get metadata from object and get cluster column metadata.df <- object@meta.data colval <- metadata.df[[cluster.column]] - # If cluster numbers on input table match the cluster numbers in cluster - # column in metadata, add new custom labels to seurat object - if (all(unique(metadata.df[[cluster.column]]) %in% unique(cluster.numbers))) { - object <- AddMetaData(object, - metadata = - deframe(tibble(metadata.df[[cluster.column]], - cluster.names[as.character(colval)])), + # # If cluster numbers on input table match the cluster numbers in cluster + # # column in metadata, add new custom labels to seurat object + if (all(unique(metadata.df[[cluster.column]]) %in% unique(cluster.identities.table[[cluster.numbers]]))) { + object = + AddMetaData(object, + metadata = + deframe(tibble(metadata.df[[cluster.column]], + cluster.names[as.character(colval)])), col.name = "Clusternames") } else{ stop("Cluster ID's have to match metadata column. Please check entry in @@ -75,12 +80,12 @@ nameClusters <- function(object, clus.num <- as.data.frame.matrix(table(object@meta.data$Clusternames, object@meta.data[[labels.column]])) - clusnum.df <- melt(as.matrix(clus.num)) + clusnum.df <- reshape2::melt(as.matrix(clus.num)) sums <- rowSums(clus.num) cluster.perc <- (clus.num / sums) * 100 # draw plot - clus.df <- melt(as.matrix(cluster.perc)) + clus.df <- reshape2::melt(as.matrix(cluster.perc)) clus.df$num <- clusnum.df$value colnames(clus.df) <- c("cluster", "celltype", "percent", "number") @@ -108,7 +113,7 @@ nameClusters <- function(object, factor(clus.df$cluster, levels = order.clusters.by) } else { clus.df$cluster <- factor(clus.df$cluster, - levels = str_sort(cluster.names, numeric = TRUE)) + levels = str_sort(unique(cluster.names), numeric = TRUE)) } #For plot, optional if ordering by cell types @@ -135,7 +140,11 @@ nameClusters <- function(object, clus.df <- clus.df %>% arrange(cluster, celltype) - + + ## if % less then 5 do not plot (convert to NA) + clus.df[clus.df<5]=NA + + ## print clusters in log: clus <- clus.df %>% pull(cluster) %>% @@ -153,6 +162,7 @@ nameClusters <- function(object, cat("celltypes:\n") cat(celltypes, sep = "\n") + # do plot (suppressMessages for ggplot2 scale replacemnt) g <- ggplot(clus.df, aes( @@ -162,22 +172,22 @@ nameClusters <- function(object, color = celltype, label = number )) + - theme_classic() + - geom_point(alpha = 0.5) + - theme(axis.text.x = element_text( - angle = 90, - vjust = 0.5, - hjust = 1 - )) + - ggtitle("Percentage of Cell Type within Clusters") + theme_classic() + + geom_point(alpha = 0.5) + + theme(axis.text.x = element_text( + angle = 90, + vjust = 0.5, + hjust = 1 + )) + + ggtitle("Percentage of Cell Type within Clusters") if (interactive == TRUE) { g <- ggplotly(g) } - - invisible(list( - object = object, - plot = g + + return(list( + "object" = object, + "plots" = g )) } diff --git a/R/Plot_Metadata.R b/R/Plot_Metadata.R index e3998cc..2003c62 100644 --- a/R/Plot_Metadata.R +++ b/R/Plot_Metadata.R @@ -358,7 +358,12 @@ plotMetadata <- function(#Basic Parameters: summarize.cut.off <- min(summarization.cut.off, 20) # checking for samples included: - samples = eval(parse(text = gsub('\\[\\]', 'c()', samples.to.include))) + if(any(grepl('c\\(|\\[\\]',samples))) { + samples = eval(parse(text = gsub('\\[\\]', 'c()', samples))) + }else{ + samples=samples + } + if (length(samples) == 0) { print("No samples specified. Using all samples...") samples = unique(object@meta.data$sample_name) @@ -409,8 +414,15 @@ plotMetadata <- function(#Basic Parameters: # converting dots to underscores in column names: colnames(object.sub@meta.data) = gsub("\\.", "_", colnames(object.sub@meta.data)) + # checking metadata for sanity - m = eval(parse(text = gsub('\\[\\]', 'c()', metadata.to.plot))) + if(any(grepl('c\\(|\\[\\]',samples))) { + m = eval(parse(text = gsub('\\[\\]', 'c()', metadata.to.plot))) + }else{ + m=metadata.to.plot + } + m = gsub("\\.", "_", m) + m = m[!grepl("Barcode", m)] if (length(m) == 0) { print("No metadata columns specified. @@ -479,7 +491,10 @@ plotMetadata <- function(#Basic Parameters: grobs <- lapply(m, function(x) .drawMetadata(x)) - result.list <- list("object" = object, "plot" = grobs) + result.list <- list( + "object" = object, + "plots" = grobs + ) return(result.list) } diff --git a/R/Process_Raw_Data.R b/R/Process_Raw_Data.R index 1ad15ba..4ba759d 100755 --- a/R/Process_Raw_Data.R +++ b/R/Process_Raw_Data.R @@ -1,12 +1,11 @@ #' @title Process Raw Data -#' @description Creates Seurat Objects from h5 files for individual or -#' merged samples. Will log normalize and produce QC figures for -#' individual samples +#' @description Creates a list of Seurat Objects from h5 files. Will log +#' normalize and produce QC figures for individual samples #' @details This is Step 1 in the basic Single-Cell RNA-seq workflow. #' Returns data as a Seurat Object, the basic data structure for #' Seurat Single Cell analysis. #' -#' @param input Input can be a vector of scRNA-Seq .h5 files, or a list of +#' @param input Input can be a vector of .h5 files, or a list of #' seurat objects for each sample. TCRseq Metadata .csv files can also be #' included and will be added to the corrisponding sample seurat object. #' Vector of files should include entire file path. @@ -24,10 +23,14 @@ #' If FALSE, remove files when pattern is found in sample name. #' The pattern is set in the file.filter.regex parameter (below). #' @param file.filter.regex Pattern or regular expression in sample -#' name. Use the 'keep' parameter to keep or remove files that contain pattern. +#' name. Use the 'keep' parameter to keep or remove fi +#' les that contain pattern. #' If samples have been renamed set regular expression based on new names #' @param split.h5 If TRUE, split H5 into individual files. (Default: FALSE) #' @param cell.hash If TRUE, dataset contains cell hashtags. (Default: FALSE) +#' @param tcr.summarize.topN Select number of top most identified TCR clonotypes +#' to be included in summary column. Any clonotypes below the top N most +#' populated will be classified as "Other". (Default: 10) #' @param do.normalize.data If TRUE counts table will be log2 normalized. If #' input contains counts that are already normalzed set to FALSE. #' (Default: TRUE) @@ -39,7 +42,7 @@ #' @importFrom magrittr %>% #' @importFrom stringr str_to_title #' @importFrom dplyr summarise filter arrange select mutate desc -#' @importFrom dplyr if_else row_number relocate +#' @importFrom dplyr if_else row_number relocate rename #' @importFrom tidyr fill #' @importFrom ggplot2 ggplot #' @importFrom RColorBrewer brewer.pal @@ -59,6 +62,7 @@ processRawData <- function(input, file.filter.regex=c(), split.h5=F, cell.hash=F, + tcr.summarize.topN=10, do.normalize.data=T ){ @@ -80,8 +84,8 @@ processRawData <- function(input, #### Figures #### .plotScatterPost2=function(count.df,xaxis,yaxis){ - ylab = as.character(xaxis) - xlab = as.character(yaxis) + xlab = as.character(xaxis) + ylab = as.character(yaxis) name = paste(ylab,"vs.",xlab) g = ggplot(count.df, aes(x=.data[[xaxis]], y=.data[[yaxis]],color=Sample)) + geom_point(size = 0.5) + @@ -90,7 +94,7 @@ processRawData <- function(input, legend.title=element_blank()) + guides(colour = guide_legend(override.aes = list(size=2))) + scale_color_manual(values = col2) + - labs( x = xlab, y = ylab) + labs( x = xlab, y = gsub(" \\(", " \n\\(",ylab)) return(g) } @@ -99,21 +103,24 @@ processRawData <- function(input, g=ggplot(count.df) + theme_bw() + geom_density(aes(x = .data[[xaxis]], colour = Sample)) + - # labs(x = NULL) + theme(legend.position='right',legend.text=element_text(size=10), legend.title=element_blank()) + # ggtitle(xaxis) + + # labs(x = NULL) + + # labs( x = gsub(" \\(", " \n\\(",xaxis))+ scale_x_continuous(trans='log10') + scale_color_manual(values = col2) %>% suppressMessages()%>%suppressWarnings() + return(g) } .plotViolinPost2=function(count.df,yaxis){ axis.lab = unique(count.df$Sample) - g=ggplot(count.df, aes_string(x='Sample', y=(yaxis))) + + g=ggplot(count.df, aes(x=Sample, y=.data[[yaxis]])) + ggtitle(yaxis) + + labs( x = 'Sample', y = gsub(" \\(", " \n\\(",yaxis))+ theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), @@ -126,7 +133,7 @@ processRawData <- function(input, plot.title = element_text(size = 20, face = "bold")) + geom_violin(aes(fill=as.factor(Sample))) + scale_fill_manual(values = col2) + - geom_boxplot(width=.1) + + geom_boxplot(width=.0) + scale_x_discrete(limits = as.vector(axis.lab)) return(g) @@ -143,8 +150,8 @@ processRawData <- function(input, ## Detect & Normalize CITEseq - if ("protein" %in% names(so.nf)){ - so.nf <- NormalizeData(so.nf, assay = "protein", + if ("Protein" %in% names(so.nf)){ + so.nf <- NormalizeData(so.nf, assay = "Protein", normalization.method = "CLR") } @@ -164,8 +171,21 @@ processRawData <- function(input, ## calculate Percent Mito so.nf[["percent.mt"]] = PercentageFeatureSet(object = so.nf, pattern = mitoch) - ## calculate Genes per UMI + + ## Error Check for Correct Organism using mitochondrial count + mt.cell.count=(so.nf[["percent.mt"]]>0)%>%sum() + if(mt.cell.count% @@ -274,16 +294,14 @@ processRawData <- function(input, "cell_top_beta", "clonotype_id", "vdj_clonotype_id") - summarizeCutOff <- min(10,18) - for (i in colsToSummarize) { col <- df[[i]] valCount <- length(unique(col)) - if ((valCount >=summarizeCutOff) & + if ((valCount >=tcr.summarize.topN) & (!is.element(class(df[[i]][1]),c("numeric","integer")))) { - freqVals <- as.data.frame(-sort(-table(col)))$col[1:summarizeCutOff] + freqVals <- as.data.frame(-sort(-table(col)))$col[1:tcr.summarize.topN] summarized_col = list() count <- 0 for (j in col) { @@ -347,32 +365,8 @@ processRawData <- function(input, ### Process files h5, rds #### ### Create SO object depending on class of input SOs. - if(class(input)=='RFilePaths'){ - print(paste0('File Type: ',class(input))) - input.dat <- input$value[grepl("*h5$",input$value)] - input.tcr <- input$value[grepl("*csv$",input$value)] - - obj.list = lapply(input.dat, - function(x){ return(Read10X_h5(x, use.names=TRUE)) }) - tcr.list = lapply(input.tcr, - function(x){return(read.csv(x, header = T))}) - - }else if(class(input)=='FoundryTransformInput'){ - print(paste0('File Type: ',class(input))) - - input.dat=nidapGetFiles(input,'*h5$') - input.tcr=nidapGetFiles(input,'*csv$') - - obj.list <- lapply(input.dat, - function(x) { return(Read10X_h5(x, use.names=TRUE)) }) - if (length(input.tcr)>0) { - tcr.list = lapply(input.tcr, - function(x){return(read.csv(x, header = T))}) - } - - - } else if(class(input)=='character'){ - if (sum(grepl('*rds$',input))==1) { + if(class(input)%in%c('character','list')){ + if (sum(grepl('*rds$|*Rds$',input))==1) { ## Log output. cat("1. Reading Seurat Object from dataset: seurat_object.rds\n\n") @@ -384,10 +378,11 @@ processRawData <- function(input, function(x) { return(readRDS(x)) }) if (length(input.tcr)>0) { tcr.list = lapply(input.tcr, - function(x){return(read.delim(x,sep=",", header = T))}) + function(x){return(read.delim(x,sep=",", header = T))} + ) } - + # } else if (sum(grepl('*h5$',input))>0){ ## Log output. cat("1. Processing .h5 files from dataset \n\n") @@ -400,19 +395,25 @@ processRawData <- function(input, function(x) { return(Read10X_h5(x, use.names=TRUE)) }) if (length(input.tcr)>0) { tcr.list = lapply(input.tcr, - function(x){return(read.delim(x,sep=",", header = T))}) + function(x){return(read.delim(x,sep=",", header = T))} + ) } }else { - stop("Incorrect input format") + stop("Incorrect input format: + files should be a vector or list of + .h5(Single Cell input)+.csv(TCR input) files or + .rds files(Seurat Object input) " + ) } } else { - stop("Incorrect input format") + stop("Incorrect input format:Input should be a vector or list of file paths + to .h5(Single Cell input)+.csv(TCR input) files or + .rds files(Seurat Object input) ") } - ## Clean up sample names names(obj.list) <- lapply(input.dat, basename) names(obj.list) <- sapply(names(obj.list), @@ -422,6 +423,7 @@ processRawData <- function(input, if (length(input.tcr)>0) { + print("TCR seq data detected") names(tcr.list) <- lapply(input.tcr, basename) names(tcr.list) <- sapply(names(tcr.list), function(x) gsub("_filtered(\\w+)?.csv","", x)) @@ -438,6 +440,8 @@ processRawData <- function(input, ### Create Seurat Object #### so.orig.nf <- list() for(i in seq_along(names(obj.list))){ + print(' ') + print(names(obj.list)[i]) ## From dgCMatrix if (class(obj.list[[i]]) == "dgCMatrix"){ so.orig.nf[[i]] <- CreateSeuratObject(counts = obj.list[[i]], @@ -447,6 +451,9 @@ processRawData <- function(input, }else{ ## From gene Expression Matrix k <- names(obj.list[[i]]) + print(paste0('Matricies Present in .h5 file')) + print(k) + for(j in 1:length(k)){ if(names(obj.list[[i]][j]) == "Gene Expression"){ so.orig.nf[[i]] = CreateSeuratObject(counts = obj.list[[i]][k][[j]], @@ -455,25 +462,43 @@ processRawData <- function(input, min.cells = 0) }else if(names(obj.list[[i]][j]) == "Antibody Capture"){ + ## determine if Slot contains CITEseq or HTO data ## CITEseq data and HTO data - protein <- rownames( - obj.list[[i]][k][[j]])[ - !grepl("HTO*",rownames(obj.list[[i]][k][[j]]))] - HTO <- rownames( - obj.list[[i]][k][[j]])[ - grepl("HTO*",rownames(obj.list[[i]][k][[j]]))] + print('Antibody Capture Matrix detected') + if (any(grepl("HTO.*",rownames(obj.list[[i]][k][[j]])))) { + print("HTO matrix detected") + + ## Extract HTO matrix + HTO <- rownames( + obj.list[[i]][k][[j]])[ + grepl("HTO*",rownames(obj.list[[i]][k][[j]]))] + # ## Remove HTO matrix + # obj.list[[i]][k][[j]]=obj.list[[i]][k][[j]][ + # rownames(obj.list[[i]][k][[j]])%in%HTO==F,] + # + contains.HTO=TRUE + so.orig.nf[[i]][['HTO']] = + CreateAssayObject(counts=obj.list[[i]][k][[j]][HTO, + colnames( + so.orig.nf[[i]] + )]) + + + } else if ( any(grepl("HTO*",rownames(obj.list[[i]][k][[j]]))==F) ){ + ## If any names do not contain HTO assume to be CITE-seq + ## extract Protein matrix + print("Protein matrix detected") + + protein <- rownames( + obj.list[[i]][k][[j]])[ + !grepl("HTO02_*",rownames(obj.list[[i]][k][[j]]))] + + so.orig.nf[[i]][["Protein"]] <- + CreateAssayObject(obj.list[[i]][k][[j]][protein, + colnames(so.orig.nf[[i]] + )])} + - so.orig.nf[[i]][["protein"]] <- - CreateAssayObject(obj.list[[i]][k][[j]][protein, - colnames(so.orig.nf[[i]] - )]) - - if(length(HTO)>0){ - so.orig.nf[[i]][['HTO']] = - CreateAssayObject(counts=obj.list[[i]][k][[j]][HTO, - colnames( - so.orig.nf[[i]] - )])} }else{ ## Error Report if h5 not correctly formated print(paste(names(obj.list[[i]][j]),"found, not stored")) @@ -484,7 +509,8 @@ processRawData <- function(input, } - ### Split H5 #### + + ### Split SO #### if(split.h5 == TRUE){ if (length(so.orig.nf)==1) { @@ -501,12 +527,12 @@ processRawData <- function(input, } sample.names=names(so.orig.nf) - cat("Sample Names:\n",paste(names(so.orig.nf),collapse = '\n')) + cat("Sample Names:\n",paste(names(so.orig.nf),collapse = '\n'),"\n\n") ### log Normalize Data #### - if (do.normalize.data) { + if (do.normalize.data==T) { so.orig.nf <- lapply(seq_along(so.orig.nf), .logNormSeuratObject) names(so.orig.nf)=sample.names }else{ @@ -541,7 +567,8 @@ processRawData <- function(input, Check sample names: ", paste( - paste0("'",setdiff(meta.table[,sample.name.column],names(so.orig.nf)),"'"), + paste0("'",setdiff(meta.table[,sample.name.column], + names(so.orig.nf)),"'"), sep="", collapse = "\n" ), @@ -559,8 +586,8 @@ processRawData <- function(input, metacols <- metacols[!metacols %in% unique(c(rename.col,sample.name.column))] if (length(metacols)>0) { - - so.orig.nf=appendMetadataToSeuratObject( + + so.orig.nf=appendMetadataToSeuratObject( so.orig.nf, meta.table[,c(sample.name.column,metacols)], sample.name.column)[['object']] @@ -594,7 +621,7 @@ processRawData <- function(input, ## Move original sample name column to second position in so metadata so.orig.nf[[i]]@meta.data=relocate(so.orig.nf[[i]]@meta.data, - {{sample.name.column}}, + , .after = orig.ident) ## change orig.ident col to new name @@ -624,7 +651,7 @@ processRawData <- function(input, } - ### Remove Sample files #### + ### Remove Sample #### subsetRegex <- file.filter.regex if (length(subsetRegex) > 0) { if (keep == TRUE){ @@ -682,16 +709,14 @@ processRawData <- function(input, # )%>%unique - + # + features=c("orig.ident", "nCount_RNA", "nFeature_RNA", "percent.mt", "log10GenesPerUMI") - v=features[features%in%c('nCount_RNA', - 'nFeature_RNA', - 'percent.mt', - 'log10GenesPerUMI')] + #### Combine SO meta.data tables #### @@ -706,11 +731,26 @@ processRawData <- function(input, table.meta$nFeature_RNA=as.numeric(table.meta$nFeature_RNA) + + table.meta=rename(table.meta, + 'UMI Count (nCount_RNA)' = 'nCount_RNA', + 'Gene Count (nFeature_RNA)' ='nFeature_RNA', + 'Percent Mitochondrial Genes (percent.mt)'='percent.mt', + 'Complexity (log10GenesPerUMI)'='log10GenesPerUMI' + ) + + v=c('UMI Count (nCount_RNA)' , + 'Gene Count (nFeature_RNA)', + 'Percent Mitochondrial Genes (percent.mt)', + 'Complexity (log10GenesPerUMI)') + + ### Post Filter Summary - Scatter scatter.allsamples=lapply(v, - function(y){.plotScatterPost2(table.meta,'nCount_RNA',y)}) + function(y){.plotScatterPost2(table.meta, + 'UMI Count (nCount_RNA)',y)}) names(scatter.allsamples)=v scatter.allsamples.grob=ggarrange(plotlist=scatter.allsamples, @@ -742,7 +782,8 @@ processRawData <- function(input, violin.allsamples.grob=annotate_figure(violin.allsamples.grob, top = text_grob("", - face = "bold", size = 14)) + face = "bold", + size = 14)) ### Post Filter Summary - combined Scatter + Histogram @@ -758,7 +799,7 @@ processRawData <- function(input, suppressMessages()%>%suppressWarnings() raw.grobs=annotate_figure(raw.grobs, - top = text_grob(" Summary ", + top = text_grob(" Unfiltered QC Summary ", face = "bold", size = 14)) @@ -782,3 +823,4 @@ processRawData <- function(input, + diff --git a/R/Recluster_Filtered_Seurat_Object.R b/R/Recluster_Filtered_Seurat_Object.R index fe971a6..63ddb04 100644 --- a/R/Recluster_Filtered_Seurat_Object.R +++ b/R/Recluster_Filtered_Seurat_Object.R @@ -166,5 +166,10 @@ reclusterFilteredSeuratObject <- function(object, # print(g) # return(list("object"=object, "plot"=plot.list)) - return(list("object" = object, "plot" = g)) + return( + list( + "object" = object, + "plots" = g + ) + ) } diff --git a/R/Recluster_Seurat_Object.R b/R/Recluster_Seurat_Object.R index e1c2800..37dab85 100644 --- a/R/Recluster_Seurat_Object.R +++ b/R/Recluster_Seurat_Object.R @@ -168,5 +168,10 @@ reclusterSeuratObject <- function(object, # print(g) # return(list("object"=object, "plot"=plot.list)) - return(list("object" = object, "plot" = g)) + return( + list( + "object" = object, + "plots" = g + ) + ) } diff --git a/R/Violin_Plots_by_Metadata.R b/R/Violin_Plots_by_Metadata.R index 79f64e4..587c6ec 100644 --- a/R/Violin_Plots_by_Metadata.R +++ b/R/Violin_Plots_by_Metadata.R @@ -7,27 +7,14 @@ #' @param object Seurat-class object #' @param assay Assay to extract gene expression data from (Default: SCT) #' @param slot Slot to extract gene expression data from (Default: scale.data) -#' @param group.by Split violin plot based on metadata group -#' @param group.subset Include only a specific subset from group.by -#' @param genes.of.interest Genes to visualize on the violin plot -#' @param filter.outliers Filter outliers from the data (TRUE/FALSE) -#' @param scale.data Scale data from 0 to 1 (TRUE/FALSE) -#' @param log.scale.data Transform data onto a log10 scale (TRUE/FALSE) -#' @param reorder.ident Numeric data will be ordered naturally by default. -#' Toggling this option will order the groups to match the -#' group list if non-numeric, and will have no effect if -#' otherwise. -#' @param rename.ident Give alternative names to group.by displayed on -#' the graph -#' @param ylimit Y-axis limit -#' @param plot.style Choose between grid, labeled, and row -#' @param outlier.low.lim Filter lower bound outliers (Default = 0.1) -#' @param outlier.up.lim Filter upper bound outliers (Default = 0.9) -#' @param jitter.points Scatter points on the plot (TRUE/FALSE) -#' @param jitter.width Set spread of jittered points -#' @param jitter.dot.size Set size of individual points -#' @param print.outliers Print outliers as points in your graph that may be -#' redundant to jitter +#' @param genes Genes to visualize on the violin plot +#' @param group Split violin plot based on metadata group +#' @param facet_by Split violin plot based on a second metadata group +#' @param filter_outliers Filter outliers from the data (TRUE/FALSE) +#' @param outlier_low Filter lower bound outliers (Default = 0.05) +#' @param outlier_high Filter upper bound outliers (Default = 0.95) +#' @param jitter_points Scatter points on the plot (TRUE/FALSE) +#' @param jitter_dot_size Set size of individual points #' @import Seurat #' @import reshape2 @@ -183,3 +170,146 @@ violinPlot_mod <- function (object, return(g) } + +###################################################################################################### +### From NIDAP +###################################################################################################### + +violinPlot <- function (object, assay, slot, genes, group, facet_data = FALSE, facet_by = "", jitter_points, jitter_dot_size) +{ + library(Seurat) + library(ggplot2) + library(gridExtra) + library(tidyr) + library(dplyr) + library(broom) + + if (!assay %in% Assays(object)) { + stop("expression data type was not found in Seurat object") + } else if (!slot %in% slotNames(object[[assay]])) { + stop("slot not found in Seurat[[assay]]") + } else if (all(!genes %in% rownames(object[[assay]]))) { + stop("no genes were found in Seurat object") + } else if (!group %in% colnames(object@meta.data)) { + stop("grouping parameter was not found in Seurat object") + } else if (!is.null(facet_by)) { + if (!facet_by %in% colnames(object@meta.data)) { + stop("facet parameter was not found in Seurat object") + } + } + + # Scale to non-negative for visualization + gene_mtx <- as.matrix(GetAssayData(object, assay = assay, slot = slot)) + #gene_mtx <- scales::rescale(gene_mtx, to = c(0,1)) + + print(paste0(genes[!genes %in% rownames(gene_mtx)], + " not found and will not be displayed")) + + genes.present <- genes[genes %in% rownames(gene_mtx)] + + meta_sub <- object@meta.data[,c(group,facet_by)] + + for (col in genes.present) { + meta_sub[[col]] <- gene_mtx[col,] + } + + data_df <- meta_sub %>% pivot_longer(genes.present, names_to = "Gene", values_to = "Expression") + + + # set Gene as factor in data_df, so faceted plots will not be alphabetical + data_df$Gene <- factor(data_df$Gene, levels = genes.present) + + unique_facets <- unique(object@meta.data[,facet_by]) + available_linetypes <- c("solid", "dashed", "dotted", "dotdash", "longdash", "twodash") + + # If you have more unique values than available linetypes, this will recycle them + linetype_mapping <- rep(available_linetypes, length.out = length(unique_facets)) + + available_colors <- c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", + "#FF7F00", "#FFFF33", "#A65628", "#F781BF", "#999999", + "#66C2A5", "#FC8D62", "#8DA0CB", "#E78AC3", + "#A6D854", "#FFD92F", "#E5C494", "#B3B3B3", + "#76B7B2", "#FF9D9A", "#B07AA1", "#D4A518", + "#DE77AE", "#77AADD", "#EE8866", "#E4CDA7") + +# Map the colors to the unique values +# If there are more unique sets than available colors, this will recycle the colors + color_mapping <- setNames(rep(available_colors, length.out = length(unique_facets)), unique_facets) + +# retrieve and remove groupings with counts of one, since that will misalign box-violin plots +count_df <- data_df %>% group_by(.data[[group]],.data[[facet_by]]) %>% count() %>% ungroup() %>% mutate(sample = paste0(.data[[group]],"_",.data[[facet_by]])) + +rm_samples <- count_df[count_df$n == 1,]$sample + +data_df$sample <- paste0(data_df[[group]],"_",data_df[[facet_by]]) +data_df <- data_df[!data_df$sample %in% rm_samples,] + + # Set up the common elements of the plot +g <- ggplot(data_df, aes(x = .data[[group]], y = Expression, fill = .data[[facet_by]])) + + geom_violin(scale = "width", position = position_dodge(width = 0.9), trim = TRUE) + + geom_boxplot(width = 0.2, position = position_dodge(width = 0.9), outlier.shape = NA) + + # scale_fill_brewer(palette = "Set1") + + # scale_linetype_manual(values = linetype_mapping) + + scale_fill_manual(values = color_mapping) + + facet_wrap(~ Gene, scales = "free_y", ncol = 3, strip.position = "left") + + theme_classic() + + theme(legend.position = "bottom", + axis.text.x = element_text(angle = 90, hjust = 1), + strip.background = element_blank(), + strip.text.x = element_text(size = 14, color = "black", face = "bold"), + strip.text.y = element_text(size = 14, color = "black", face = "bold"), + strip.placement = "outside") + +# Add jitter points conditionally +if (jitter_points) { + g <- g + geom_jitter(size = jitter_dot_size, shape = 1, position = position_dodge(width = 0.9), alpha = 0.5) +} + + # Function to calculate p-values for a single gene within a cell type +calculate_p_values <- function(data, data_group, data_gene) { + # Subset data for the specific cell type and gene + data_sub <- data[data[,group] == data_group & data[,"Gene"] == data_gene,] + + # Perform ANOVA and Tukey HSD + fit <- aov(as.formula(paste("Expression ~", facet_by)), data = data_sub) + tukey_result <- TukeyHSD(fit) + + # Tidy up the results and add metadata + tidy_tukey_result <- tidy(tukey_result) + tidy_tukey_result$gene <- data_gene + tidy_tukey_result$group <- data_group + + return(tidy_tukey_result) +} + +# List unique cell types +unique_groups <- unique(data_df[[group]]) + +# Filter out +facet_df <- table(data_df[[group]], data_df[[facet_by]]) + +# Find rows with more than one non-zero column +count_non_zero <- function(row) { + sum(row != 0) +} +non_zero_counts <- apply(facet_df, 1, count_non_zero) + +# Use rownames whose values are in more than 1 column +unique_groups <- names(non_zero_counts)[non_zero_counts > 1] + +# Calculate p-values for each cell type and gene +p_values_list <- list() +for (indv_group in unique_groups) { + p_values_list[[indv_group]] <- do.call(rbind, lapply(genes.present, function(gene) calculate_p_values(data_df, data_group = indv_group, data_gene = gene))) +} + +# Combine the results into a single data frame +p_values_df <- do.call(rbind, p_values_list) + + final_res <- list( + "plots" = g, + "data"=list("stats" = p_values_df) + ) + + return(final_res) +} \ No newline at end of file diff --git a/README.md b/README.md index b6d203f..f2e1e03 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,28 @@ -# SCWorkflow -Workflow Package for Analysis of Single Cell Data + +# **SCWorkflow** +R package for Single Cell analysis + +[![Gitflow Action for R Package Development](https://github.com/NIDAP-Community/SCWorkflow/actions/workflows/gitflow-R-action.yml/badge.svg)](https://github.com/NIDAP-Community/SCWorkflow/actions/workflows/gitflow-R-action.yml) +[![Version](https://img.shields.io/github/v/release/nidap-community/scworkflow)](https://github.com/NIDAP-Community/SCWorkflow/releases/latest) +[![Docker Image Version](https://img.shields.io/docker/v/nciccbr/scworkflow?label=docker)](https://hub.docker.com/r/nciccbr/scworkflow) + + +[![](https://raw.githubusercontent.com/NIDAP-Community/SCWorkflow/GalaxyCLI/vignettes/SCWorkflow.png)](https://lucid.app/lucidchart/c7b852ad-72dc-4821-90d5-e45bed0c4199/view) + + + + +
+
The Single Cell Workflow streamlines the analysis of multimodal Single Cell RNA-Seq data produced from 10x Genomics. It can be run in a docker container, and for biologists, in user-friendly web-based interactive notebooks (NIDAP, Palantir Foundry). Much of it is based on the Seurat workflow in Bioconductor, and supports CITE-Seq data. It incorporates a cell identification step (ModScore) that utilizes module scores obtained from Seurat and also includes Harmony for batch correction. -Some of the steps in the workflow: +
+ +For further documentation see our detailed [Docs Website](https://nidap-community.github.io/SCWorkflow/) - +
+
Future Developments include addition of support for multiomics (TCR-Seq, ATAC-Seq) single cell data and integration with spatial transcriptomics data. diff --git a/_pkgdown.yml b/_pkgdown.yml new file mode 100644 index 0000000..caab5bc --- /dev/null +++ b/_pkgdown.yml @@ -0,0 +1,77 @@ +url: https://nidap-community.github.io/SCWorkflow/ +template: + bootstrap: 5 + bslib: + primary: "#296b7f" + secondary: "#7cc349" + base_font: {google: "Roboto"} + heading_font: {google: "Roboto"} + code_font: {google: "Roboto Mono"} + border-radius: 0 + btn-border-radius: 3px + grid-gutter-width: 3rem + pkgdown-nav-height: 78px + params: + toc: + smooth_scroll: true + toc_float: true + toc_collapsed: true # Start with TOC collapsed + +navbar: + structure: + left: [getting-started, articles, Developers, reference] + right: [search, github] + components: + getting-started: + text: Getting Started + href: articles/SCWorkflow-Usage.html + Developers: + text: For Developers + href: articles/CONTRIBUTING.html + + +footer: + structure: + left: [developed_by] + +development: + mode: auto +authors: + Kelly Sovacool: + href: "https://github.com/kelly-sovacool" + Philip Homan: + href: "https://github.com/phoman14" + Vishal Koparde: + href: "https://github.com/kopardev" + CCR Collaborative Bioinformatics Resource: + href: "https://github.com/CCBR" + footer: + roles: [cph, fnd] + text: "Created by the" + +articles: +- title: Vignettes + navbar: ~ + contents: + - SCWorkflow-QC + - SCWorkflow-Annotations + - SCWorkflow-DEG + - SCWorkflow-Visualizations + - SCWorkflow-SubsetReclust + +- title: Developer + desc: Developer documentation + contents: + - CONTRIBUTING + - SCWorkflow-Usage + - README + +home: + sidebar: + structure: [links,citation, authors, license, dev] + links: + - text: Browse code on GitHub + href: https://github.com/NIDAP-Community/SCWorkflow + strip_header: true + + diff --git a/docs/404.html b/docs/404.html new file mode 100644 index 0000000..f371895 --- /dev/null +++ b/docs/404.html @@ -0,0 +1,89 @@ + + + + + + + +Page not found (404) • SCWorkflow + + + + + + + + + + Skip to contents + + +
+
+
+ +Content not found. Please use links in the navbar. + +
+
+ + +
+ + + +
+
+ + + + + + + diff --git a/docs/CHANGELOG.html b/docs/CHANGELOG.html new file mode 100644 index 0000000..cdf2cd9 --- /dev/null +++ b/docs/CHANGELOG.html @@ -0,0 +1,808 @@ + +CHANGELOG • SCWorkflow + Skip to contents + + +
+
+
+ +
+ +
+

v1.0.2 (2024-02-01)

+
+

Fix

+
  • fix: update package name in action file (00c816c)
  • +
+
+

Unknown

+
  • Merge pull request #53 from NIDAP-Community/dev
  • +

fix: update package name in action file (1ea1b0c)

+
  • Merge pull request #52 from NIDAP-Community/CDupdate
  • +

fix: update package name in action file (3956593)

+
+
+
+

v1.0.1 (2024-02-01)

+
+

Build

+
  • build: update conda recipe and action file (32f800c)
  • +
+
+

Documentation

+
  • docs(version): Automatic development release (0548007)

  • +
  • docs: Adding changelog (34b1e0b)

  • +
  • docs(version): Automatic development release (184b4f9)

  • +
  • docs(version): Automatic development release (b8b41d3)

  • +
  • docs(version): Automatic development release (f420a3b)

  • +
  • docs(version): Automatic development release (8b5cc98)

  • +
+
+

Feature

+
+
+

Fix

+
  • fix: add skip on CI for harmony (55c1c0d)

  • +
  • fix: Suppress warning for celldex, move CI handle for test Harmony, add png for page creation (406594a)

  • +
  • fix: Revise version format (7992d22)

  • +
  • fix: update readme (d8d4013)

  • +
+
+

Test

+
  • test: Adding variant for Action skip (b0bea4c)

  • +
  • test: update meta.ymal (1abd118)

  • +
  • test: update meta.ymal (46ba936)

  • +
  • test: mute line42 in test-Process_Raw_Data (75dbd06)

  • +
+
+

Unknown

+
  • Merge pull request #51 from NIDAP-Community/dev
  • +

Update test files for Harmony and Annotation, add GitHub page image (5c19124)

+
  • Merge pull request #50 from NIDAP-Community/CDupdate
  • +

fix: add skip on CI for harmony (3268a82)

+
  • Merge pull request #49 from NIDAP-Community/CDupdate
  • +

fix: Suppress warning for celldex, move CI handle for test Harmony, a… (30de884)

+
  • Merge pull request #47 from NIDAP-Community/dev
  • +

Update CD (76e59b4)

+
  • Merge pull request #46 from NIDAP-Community/CDupdate
  • +

docs: Adding changelog (7c5bcf2)

+
  • Merge pull request #45 from NIDAP-Community/dev
  • +

Update repo structure for CD implementation (ca27382)

+
  • Merge pull request #44 from NIDAP-Community/CDupdate
  • +

Update repo structure for Continuous Deployment implementation (fab9424)

+
  • Merge remote-tracking branch 'origin/main' into dev (c850a61)

  • +
  • Merge pull request #43 from NIDAP-Community/revert-42-testCD2

  • +

Revert "Test cd2" (dbd1511)

+
  • Revert "Test cd2" (82c3208)

  • +
  • Merge pull request #42 from ruiheesi/testCD2

  • +

Test cd2 (696718c)

+
  • Merge pull request #17 from ruiheesi/release_dev
  • +

Release dev (93dac20)

+
  • Merge pull request #16 from ruiheesi/dev
  • +

Dev (f094e92)

+
  • Merge pull request #15 from ruiheesi/testCD2
  • +

Test cd2 (89850c1)

+
  • Merge remote-tracking branch 'origin/dev' into testCD2 (429581c)

  • +
  • feat :test (10b3e05)

  • +
  • Merge pull request #14 from ruiheesi/dev

  • +

Dev (c932c71)

+
  • Merge pull request #13 from ruiheesi/testCD2
  • +

Test cd2 (da01ac7)

+
  • Merge pull request #12 from ruiheesi/release_dev
  • +

Release dev (447457a)

+
  • Merge pull request #11 from ruiheesi/dev
  • +

Dev (e4a2987)

+
  • Merge pull request #10 from ruiheesi/testCD2
  • +

fix: update readme (a3f0d9c)

+
  • Merge pull request #9 from ruiheesi/release_dev
  • +

Release dev (4026e1a)

+
  • Merge pull request #8 from ruiheesi/dev
  • +

Dev (4364548)

+
  • Merge pull request #7 from ruiheesi/testCD
  • +

test: update meta.ymal (fe470f9)

+
  • Merge pull request #6 from ruiheesi/dev
  • +

Dev (4e75a9f)

+
  • Merge pull request #5 from ruiheesi/testCD
  • +

test: update meta.ymal (caed439)

+
  • Merge pull request #4 from ruiheesi/dev
  • +

Dev (9f27de1)

+
  • Merge pull request #3 from ruiheesi/testCD
  • +

test: mute line42 in test-Process_Raw_Data (abef880)

+
  • Merge pull request #1 from ruiheesi/testCD
  • +

feat: enable CD (0194dd9)

+
  • Merge pull request #38 from NIDAP-Community/main
  • +

Updating dev to avoid potential lost of progress (8936388)

+
  • Merge pull request #37 from NIDAP-Community/8_4_tutorial
  • +

8 4 tutorial (c640c8f)

+

Dev (0b66085)

+
  • Merge pull request #35 from NIDAP-Community/heatmap_fix
  • +

Fix heatmap (49f0486)

+
  • Fix heatmap (db3ee4e)

  • +
  • Merge pull request #34 from NIDAP-Community/release_6_15_test

  • +

Update DESCRIPTION file with author info and short package description (31a4d13)

+
  • Merge pull request #33 from NIDAP-Community/update_DES
  • +

Update DESCRIPTION file (df2abd7)

+
  • Update DESCRIPTION file (5e43253)

  • +
  • Adding auto-generated files (14ff346)

  • +
  • Merge pull request #31 from NIDAP-Community/release_6_13

  • +

Update 6 13 from Alexei (e2297c6)

+
  • Merge pull request #30 from NIDAP-Community/release_test
  • +

Run all unit tests (407ca8f)

+
  • Merge pull request #28 from NIDAP-Community/main
  • +

Update (2891614)

+
  • Merge pull request #27 from NIDAP-Community/phil_6_6_no_NG
  • +

Modify package function load (370522e)

+
  • Including "NULL" and "seurat_cluster" tests (8cb6a23)

  • +
  • Introducing "cluster" variable functionality (e26f2aa)

  • +
  • Modify package function load (fe7ad65)

  • +
  • Adding auto-generated files (e65ad6b)

  • +
  • Merge pull request #26 from NIDAP-Community/release_test

  • +

Passed all tests (4a40802)

+
  • Merge pull request #25 from NIDAP-Community/phil_6_6_no_NG
  • +

Run all unit test (4979266)

+

Conflicts: NAMESPACE tests/testthat/fixtures/downsample_SO.R (d4b92fe)

+

need to update violinPlot subset function (41f805e)

+

Conflicts: NAMESPACE R/Combine_and_Renormalize.R R/Filter_and_QC.R R/PCA_and_Normalization.R R/Post_filter_QC_Plots.R tests/testthat/fixtures/NSCLC_Single/NSCLC_Single_Filtered_PCA_Norm_SO_downsample.rds tests/testthat/fixtures/NSCLC_Single/NSCLC_Single_Filtered_SO_downsample.rds tests/testthat/fixtures/NSCLC_Single/NSCLCsingle_Filtered_PCA_Norm_SO_downsample.rds tests/testthat/fixtures/NSCLC_Single/NSCLCsingle_Filtered_SO_downsample.rds tests/testthat/fixtures/PBMC_Single/PBMC_Single_Filtered_PCA_Norm_SO_downsample.rds tests/testthat/fixtures/PBMC_Single/PBMC_Single_Filtered_SO_downsample.rds tests/testthat/fixtures/downsample_SO.R tests/testthat/test_Combine_and_Renormalize.R tests/testthat/test_Filter_and_QC.R tests/testthat/test_PCA_and_Normalization.R tests/testthat/test_Post_Filter_QC.R (92eae54)

+

Conflicts: NAMESPACE R/Post_filter_QC_Plots.R tests/testthat/test_Post_Filter_QC.R (4fd27d2)

+

Conflicts: man/Combine_and_Renormalize.Rd man/Post_filter_QC.Rd (159af06)

+

At line 200, fix syntax error from "=" to "==" (2916381)

+
  • Fix syntax error
  • +

At line 200, fix syntax error from "=" to "==" (d909584)

+
  • Helper for Recluster, Sprint 7 compliant. (d5181f9)

  • +
  • Helper for Recluster, Sprint 7 compliant. (8f28252)

  • +
  • New test for Recluster with correct name. (bf252e2)

  • +
  • New test for Recluster with correct name. (0d88348)

  • +
  • Old file w bad name gone. New file good. (e903ca0)

  • +
  • Old file w bad name gone. New file good. (0e0d81e)

  • +
  • Re-arranged for new Sprint 7 formatting and functions. (2c07bcb)

  • +
  • Re-arranged for new Sprint 7 formatting and functions. (e670fe9)

  • +
  • Merge branch 'main' of https://github.com/NIDAP-Community/SCWorkflow into main

  • +

need to push updated code to main (20f0ab7)

+

need to push updated code to main (189075c)

+
  • push updated scripts to main (ed4b682)

  • +
  • push updated scripts to main (f70b090)

  • +
  • Restructured according to new requirements (94b0170)

  • +
  • Restructured according to new requirements (797d5be)

  • +
  • Restructured according to new requirements (495be93)

  • +
  • Restructured according to new requirements (7e53872)

  • +
  • Restructured according to new requirements (6043df1)

  • +
  • Restructured according to new requirements (5efd01d)

  • +
  • Restructured according to new requirements (8465a9e)

  • +
  • Restructured according to new requirements (75be9d0)

  • +
  • Restructured according to new requirements (8c4739b)

  • +
  • Restructured according to new requirements (8a39e82)

  • +
  • Restructured according to new requirements (2ccad56)

  • +
  • Restructured according to new requirements (4770cf7)

  • +
  • Restructured according to new requirements (8762e39)

  • +
  • Restructured according to new requirements (c21ca07)

  • +
  • Restructured according to new requirements (b9dfed4)

  • +
  • Restructured according to new requirements (9cc27d3)

  • +
  • Restructured according to new requirements (656b12e)

  • +
  • Restructured according to new requirements (2989dbe)

  • +
  • Restructured according to new requirements (bf8dcb1)

  • +
  • Restructured according to new requirements (d11a692)

  • +
  • Restructured according to new requirements (95693f6)

  • +
  • Restructured according to new requirements (da04b19)

  • +
  • Restructured according to new requirements (6dca0bf)

  • +
  • Restructured according to new requirements (de6b4da)

  • +
  • Restructured according to new requirements (8f4ea59)

  • +
  • Restructured according to new requirements (1741342)

  • +
  • Restructured according to new requirements (f522e45)

  • +
  • Restructured according to new requirements (dc8cfe2)

  • +
  • Restructured according to new requirements (b2235b0)

  • +
  • Restructured according to new requirements (6f4bd6d)

  • +
  • Delete test-DegGeneExpressionMarkers.R

  • +

Replaced with newer, renamed version (237eacf)

+
  • Delete test-DegGeneExpressionMarkers.R
  • +

Replaced with newer, renamed version (ee510b7)

+
  • Accepted changes to Namespace (b0ef9e7)

  • +
  • Accepted changes to Namespace (70d880f)

  • +
  • Removed ticks on dotplot code (d6599be)

  • +
  • Removed ticks on dotplot code (3b4a6e0)

  • +
  • Added select to dplyr import (1311aae)

  • +
  • Added select to dplyr import (c860639)

  • +
  • Merge branch 'main' of https://github.com/NIDAP-Community/SCWorkflow into main (8759676)

  • +
  • Merge branch 'main' of https://github.com/NIDAP-Community/SCWorkflow into main (28e310b)

  • +
  • Added snapshot file tests to Name clusters (1a0c530)

  • +
  • Added snapshot file tests to Name clusters (de98847)

  • +
  • Added more snapshot tests to heatmap (3f138a4)

  • +
  • Added more snapshot tests to heatmap (1fe2d7b)

  • +
  • Additional snapshot file tests for dual labeling (8d92fcf)

  • +
  • Additional snapshot file tests for dual labeling (580ab8d)

  • +
  • Additional tests to dotplot by metadata (fbc3ada)

  • +
  • Additional tests to dotplot by metadata (b7f6c45)

  • +
  • Adding expect snapshot file tests to 3D-tSNE plotter (8f33e2b)

  • +
  • Adding expect snapshot file tests to 3D-tSNE plotter (661102c)

  • +
  • Formatting changes to helper-dual labeling (8f5da99)

  • +
  • Formatting changes to helper-dual labeling (266dec8)

  • +
  • Formatting changes to helper - Name clusters (5a6079f)

  • +
  • Formatting changes to helper - Name clusters (cfc8b69)

  • +
  • Formatting changes to helper-Heatmap (abd3f09)

  • +
  • Formatting changes to helper-Heatmap (1ca0e49)

  • +
  • Formatting changes to helper-dotplot by Metadata (321e619)

  • +
  • Formatting changes to helper-dotplot by Metadata (69653cb)

  • +
  • Formatting changes to helper 3D-tSNE (8be697c)

  • +
  • Formatting changes to helper 3D-tSNE (c1835c2)

  • +
  • Formatting changes to Dotplot by Metadata (7dbbc99)

  • +
  • Formatting changes to Dotplot by Metadata (d994b6c)

  • +
  • Code changes to Name clusters and formatting (70a9fc2)

  • +
  • Code changes to Name clusters and formatting (bca98aa)

  • +
  • Formatting changes to Heatmap.R (e1bd5c7)

  • +
  • Formatting changes to Heatmap.R (f47e847)

  • +
  • Add files via upload

  • +

replace image file (7bf9b80)

+
  • Add files via upload
  • +

replace image file (542b65d)

+
  • Update README.md
  • +

additional text (700ad07)

+
  • Update README.md
  • +

additional text (2e0feec)

+
  • Update README.md
  • +

Added image. (7694f8d)

+
  • Update README.md
  • +

Added image. (f28a6a7)

+
  • Add files via upload
  • +

Workflow image (f93175b)

+
  • Add files via upload
  • +

Workflow image (433a89d)

+

Includes tests on all 5 datasets testing type, as well as one test on MouseTEC that tests UMAP instead of default TSNE. (4da52a7)

+
  • Initial TestThat for Recluster
  • +

Includes tests on all 5 datasets testing type, as well as one test on MouseTEC that tests UMAP instead of default TSNE. (da7c560)

+
  • Initial R4 functionalization. (7558379)

  • +
  • Initial R4 functionalization. (84acb8c)

  • +
  • Add files via upload

  • +

Initial release (3eca944)

+
  • Add files via upload
  • +

Initial release (deafd1c)

+
  • Add files via upload
  • +

Initial release (77b96a6)

+
  • Add files via upload
  • +

Initial release (91b7594)

+
  • Add files via upload
  • +

Initial commit (4a74c89)

+
  • Add files via upload
  • +

Initial commit (9d694ae)

+
  • Add files via upload
  • +

Initial release (fa2e7c3)

+
  • Add files via upload
  • +

Initial release (25d5857)

+
  • Add files via upload
  • +

Initial release (69d1dcf)

+
  • Add files via upload
  • +

Initial release (900ab4c)

+
  • Delete DEG_Gene_Expression_Markers.R (5496f85)

  • +
  • Delete DEG_Gene_Expression_Markers.R (fe406ea)

  • +
  • Add files via upload

  • +

Initial release (ea9b264)

+
  • Add files via upload
  • +

Initial release (45fd8d2)

+
  • Add files via upload
  • +

Initial release (c2e8e8c)

+
  • Add files via upload
  • +

Initial release (fee817b)

+
  • Add files via upload
  • +

Initial release (55fd6c9)

+
  • Add files via upload
  • +

Initial release (a59a2bc)

+
  • Add files via upload
  • +

Initial release (ad72a95)

+
  • Add files via upload
  • +

Initial release (aac8353)

+
  • Add files via upload
  • +

Initial release (a0c5606)

+
  • Add files via upload
  • +

Initial release (c31a9f2)

+

Following the orders (6b41c15)

+
  • Delete Delete.Me
  • +

Following the orders (1f82ca7)

+
  • Add files via upload
  • +

DELETE IMMEDIATELY!!! (986326c)

+
  • Add files via upload
  • +

DELETE IMMEDIATELY!!! (ea68f0a)

+

update function and parameter names. (83fbdd1)

+

update function and parameter names. (6f46e6e)

+

Resolve conflicts (7fa7db9)

+
  • Merge pull request #9 from NIDAP-Community/Rui_resolve_conflict
  • +

Resolve conflicts (7839aba)

+

Phi test (2d5e7ec)

+
  • Merge pull request #8 from NIDAP-Community/phi_test
  • +

Phi test (87fdb1a)

+

Update Chariou Single R SO and BRCA combin and Renormalize (e851077)

+

Update Chariou Single R SO and BRCA combin and Renormalize (072096f)

+

Update Chariou Single R SO and BRCA combin and Renormalize (1a8fbf8)

+

merging new changes (b8b1eda)

+

merging new changes (09c8f46)

+

merging new changes (729b051)

+

adding NSCLC_Single SOs (152cf11)

+

adding NSCLC_Single SOs (b0ea506)

+

adding NSCLC_Single SOs (d83c561)

+

new error messaging added (b09cb64)

+

new error messaging added (d266d5e)

+

new error messaging added (c0aaa1b)

+

Conflicts: .gitignore DESCRIPTION tests/testthat/test_Filter_and_QC.R (c58b92e)

+

Conflicts: .gitignore DESCRIPTION tests/testthat/test_Filter_and_QC.R (8a845be)

+

Conflicts: .gitignore DESCRIPTION tests/testthat/test_Filter_and_QC.R (bb18f4c)

+

The conda package build requires a NAMESPACE file to be added, which is being ignored during the dev cycle. (e7ac125)

+
  • NAMESPACE removed from merge
  • +

The conda package build requires a NAMESPACE file to be added, which is being ignored during the dev cycle. (0027492)

+
  • NAMESPACE removed from merge
  • +

The conda package build requires a NAMESPACE file to be added, which is being ignored during the dev cycle. (4f3bbc8)

+
  • Merge pull request #7 from NIDAP-Community/dev_release_dec_13_22
  • +

Dev release dec 13 22 (02999db)

+
  • Merge pull request #7 from NIDAP-Community/dev_release_dec_13_22
  • +

Dev release dec 13 22 (6ec32fa)

+
  • Merge pull request #7 from NIDAP-Community/dev_release_dec_13_22
  • +

Dev release dec 13 22 (2e0f434)

+

Rui (c09fa3f)

+
  • Merge pull request #6 from NIDAP-Community/rui
  • +

Rui (5d3d3b2)

+
  • Merge pull request #6 from NIDAP-Community/rui
  • +

Rui (e71621d)

+

Adjusted png render method for NIDAP display (33820ce)

+
  • Merge pull request #5 from NIDAP-Community/initial_filter_qc
  • +

Adjusted png render method for NIDAP display (770cb6a)

+
  • Merge pull request #5 from NIDAP-Community/initial_filter_qc
  • +

Adjusted png render method for NIDAP display (12b4ce3)

+
  • Adjusted png render method for NIDAP display (0b9e4d2)

  • +
  • Adjusted png render method for NIDAP display (9968f1f)

  • +
  • Adjusted png render method for NIDAP display (747b89a)

  • +
  • Merge pull request #4 from NIDAP-Community/initial_filter_qc

  • +

Update namespace (bcc1c7f)

+
  • Merge pull request #4 from NIDAP-Community/initial_filter_qc
  • +

Update namespace (61952ec)

+
  • Merge pull request #4 from NIDAP-Community/initial_filter_qc
  • +

Update namespace (ac05afc)

+
  • Update namespace (fdcfd52)

  • +
  • Update namespace (f070d8e)

  • +
  • Update namespace (fd74f19)

  • +
  • Merge pull request #3 from NIDAP-Community/initial_filter_qc

  • +

Added license file (a3a99b6)

+
  • Merge pull request #3 from NIDAP-Community/initial_filter_qc
  • +

Added license file (5c508c3)

+
  • Merge pull request #3 from NIDAP-Community/initial_filter_qc
  • +

Added license file (d5113f3)

+
  • Added license file (186d183)

  • +
  • Added license file (a8bd74c)

  • +
  • Added license file (1d7ed13)

  • +
  • Merge pull request #2 from NIDAP-Community/initial_filter_qc

  • +

remove GenomeInfoDb (fe8164b)

+
  • Merge pull request #2 from NIDAP-Community/initial_filter_qc
  • +

remove GenomeInfoDb (75ae5fd)

+
  • Merge pull request #2 from NIDAP-Community/initial_filter_qc
  • +

remove GenomeInfoDb (8908e24)

+
  • remove GenomeInfoDb (f3bb0e6)

  • +
  • remove GenomeInfoDb (2b32d4e)

  • +
  • remove GenomeInfoDb (b27279e)

  • +
  • Merge pull request #1 from NIDAP-Community/initial_filter_qc

  • +

Initial push with filter and qc, demo (866a648)

+
  • Merge pull request #1 from NIDAP-Community/initial_filter_qc
  • +

Initial push with filter and qc, demo (a30130b)

+
  • Merge pull request #1 from NIDAP-Community/initial_filter_qc
  • +

Initial push with filter and qc, demo (b627f06)

+
  • Initial push with filter and qc, demo (a843d4d)

  • +
  • Initial push with filter and qc, demo (dcd9fef)

  • +
  • Initial push with filter and qc, demo (462a39d)

  • +
  • Update README.md

  • +

Changed package name (acb154c)

+
  • Update README.md
  • +

Changed package name (fdffdf4)

+
+
+
+ +
+ + +
+ + + +
+ + + + + + + diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html new file mode 100644 index 0000000..5519705 --- /dev/null +++ b/docs/LICENSE-text.html @@ -0,0 +1,86 @@ + +License • SCWorkflow + Skip to contents + + +
+
+
+ +
MIT License
+
+Copyright (c) 2024 NIDAP Community
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+ +
+ + +
+ + + +
+ + + + + + + diff --git a/docs/articles/README.html b/docs/articles/README.html new file mode 100644 index 0000000..3800316 --- /dev/null +++ b/docs/articles/README.html @@ -0,0 +1,167 @@ + + + + + + + + • SCWorkflow + + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + + +
+

SCWorkflow +

+

The CCBR Single-cell RNA-seq Package (SCWorkflow) allows users to +analyze their own single-cell RNA-seq datasets starting from CellRanger +output files (H5 or mtx files, etc.).

+
+

Installation +

+
+

You can install the SCWorkflow package from GitHub +with:

+
+# install.packages("remotes")
+remotes::install_github("NIDAP-Community/SCWorkflow", dependencies = TRUE)
+

There is also a Docker container available at

+
+
+
+

Usage +

+
+

Following this workflow you can perform these steps of a single-cell +RNA-seq analysis, and more:

+
    +
  • +

    Quality Control:

    +
      +
    • Import, Select, & Rename Samples

    • +
    • Filter Cells based on QC metrics

    • +
    • Combine Samples, Cluster, and Normalize your Data

    • +
    • Batch Correction using Harmony

    • +
    +
  • +
  • +

    Cell Annotation:

    +
      +
    • SingleR Automated Annotations

    • +
    • Module Scores

    • +
    • Co-Expression

    • +
    • External Annotations

    • +
    +
  • +
  • +

    Visualizations:

    +
      +
    • Dimensionality Reductions (t-SNE and UMAP Plots) colored by +Marker Expression or by Metadata

    • +
    • Heatmaps

    • +
    • Violin Plots

    • +
    • Trajectory

    • +
    +
  • +
  • +

    Differential Expression Analysis

    +
      +
    • Seurat’s FindMarkers()

    • +
    • Pseudobulk Aggregation

    • +
    • Pathway Analysis

    • +
    +
  • +
+

Please see the introductory +vignette for a quick start tutorial. Take a look at the reference +documentation for detailed information on each function in the +package.

+
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/articles/SCWorkflow-Annotations.html b/docs/articles/SCWorkflow-Annotations.html new file mode 100644 index 0000000..a545672 --- /dev/null +++ b/docs/articles/SCWorkflow-Annotations.html @@ -0,0 +1,502 @@ + + + + + + + +Annotations • SCWorkflow + + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +


+
+

Cell Type Annotation with SingleR +

+
+

This function automates cell type annotation in single-cell RNA +sequencing data by employing the SingleR [1] method, which +allocates labels to cells within a dataset according to their gene +expression profile similarities with a reference dataset containing cell +type labeled samples

+

SingleR is an automatic annotation method for single-cell RNA +sequencing data that uses a given reference dataset of samples +(single-cell or bulk) with known labels to label new cells from a test +dataset based on similarity to the reference. Two mouse reference +datasets (MouseRNAseqData and ImmGenData) and two human reference +datasets (HumanPrimaryCellAtlasData and BlueprintEncodeData) from +CellDex R package [2] are currently available.

+
+
+Anno_SO=annotateCellTypes(object=Comb_SO$object,
+                          species = "Mouse",
+                          reduction.type = "umap",
+                          legend.dot.size = 2,
+                          do.finetuning = FALSE,
+                          local.celldex = NULL,
+                          use.clusters = NULL
+                          )
+

+


+
+
+

Add External Cell Annotations +

+
+

This function will merge an external table of cell annotations into +an existing Seurat Object’s metadata table. The input external metadata +table must have a column named “Barcode” that contains barcodes matching +those found in the metadata already present in the input Seurat Object. +The output will be a new Seurat Object with metadata that now includes +the additional columns from the external table.

+
+
+CellType_Anno_Table=read.csv("./images/PerCell_Metadata.csv")
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BarcodeCell.Type
PBS_AAACCTGCAAGGTTTC-1Monocytes
PBS_AAACCTGGTCTAGCGC-1Monocytes
PBS_AAACCTGTCACTTACT-1Monocytes
PBS_AAACCTGTCAGCGATT-1Monocytes
PBS_AAACCTGTCAGCTGGC-1Macrophages
PBS_AAACCTGTCGGCTTGG-1Macrophages
+
+
+ExtAnno_SO=ExternalAnnotation(object = Anno_SO$object,
+                              external_metadata = CellType_Anno_Table,
+                              seurat_object_filename = "seurat_object.rds",
+                              barcode_column = "Barcode",
+                              external_cols_to_add = c("Cell Type"),
+                              col_to_viz = "Cell Type"
+                             )
+


+
+
+

Cell Annotation with Co-Expression +

+
+

This function will display co-expression of two chosen markers in +your Seurat Object. It will then Create a metadata column containing +annotations for cells that correspond to the marker expression +thresholds you set.

+

This function enables users to visualize the association between two +selected genes or proteins according to their expression values in +various samples. The association is plotted, and samples with values +above or below a specified limit can be excluded. Users have the ability +to customize the visualization, including the choice of visualization +type, point size and shape, and transparency level.

+

Furthermore, the tool allows for the application of filters to the +data, setting thresholds, and providing annotations to notify users if +cells meet the established thresholds. The visualization can be improved +by omitting extreme values. The tool also facilitates the creation of a +heatmap to represent the density distribution of cells and exhibit the +raw gene/protein expression values.

+
+grep('Cd4',rownames(Anno_SO$object@assays$RNA),ignore.case = T,value=T)
+
+DLAnno_SO=dualLabeling(object = Anno_SO$object, 
+                        samples <- c("PBS","CD8dep","ENT","NHSIL12","Combo"), 
+                        marker.1="Nos2", 
+                        marker.2="Arg1", 
+                        marker.1.type = "SCT", 
+                        marker.2.type = "SCT", 
+                        data.reduction = "both", 
+                        point.size = 0.5, 
+                        point.shape = 16, 
+                        point.transparency = 0.5, 
+                        add.marker.thresholds = TRUE, 
+                        marker.1.threshold = 0.5, 
+                        marker.2.threshold = 0.5, 
+                        filter.data = TRUE, 
+                        marker.1.filter.direction = "greater than", 
+                        marker.2.filter.direction = "greater than", 
+                        apply.filter.1 = TRUE, 
+                        apply.filter.2 = TRUE, 
+                        filter.condition = TRUE, 
+                        parameter.name = "My_CoExp", 
+                        trim.marker.1 = FALSE, 
+                        trim.marker.2 = FALSE, 
+                        pre.scale.trim = 0.99, 
+                        display.unscaled.values = FALSE
+                       )
+
+plot(DLAnno_SO$plots$tsne)
+plot(DLAnno_SO$plots$umap)
+

+


+
+
+

Color by Gene Lists +

+
+

This function generates plots to visualize the expression of specific +markers (genes) in single-cell RNA sequencing (scRNA-seq) data. Gene +plots are generated in the same order as they appear in the input list +(provided that they are present in the data).

+

This function takes in a number of inputs to create detailed plots +showing the activity of certain genes. You can customize these based on +specific samples or genes of interest or point transparency. The code +has a built-in system to alert you if there are any issues with your +chosen inputs. If a particular gene is missing, it will return an empty +plot. If the gene is present, it will perform several steps to adjust +the data for better visualization and analysis, such as normalizing the +data and creating a reduction plot (a type of plot that helps visualize +complex data). The code also makes sure to display your chosen samples, +creates a caption for the plot indicating which samples are shown, +colors the points based on gene activity levels, and adjusts the plot’s +visual elements like transparency, size, and labels. If you haven’t +selected specific samples, it will use all the available samples from +your data. It also checks for the presence of your chosen genes in the +data and processes them to ensure uniformity across different cell +types. The output of this function is a detailed figure showing the +activity of chosen genes across different cell types. This is useful for +identifying distinct groups of cells based on gene activity levels.

+
+Marker_Table <- read.csv("Marker_Table_demo.csv")
+
+    
+        colorByMarkerTable(object=Anno_SO$object,
+                           samples.subset=c("PBS","ENT","NHSIL12", "Combo","CD8dep" ),
+                           samples.to.display=c("PBS","ENT","NHSIL12", "Combo","CD8dep" ),
+                           marker.table=Marker_Table,
+                           cells.of.interest=c("Neutrophils","Macrophages","CD8_T" ),
+                           protein.presence = FALSE,
+                           assay = "SCT",
+                           reduction.type = "umap",
+                           point.transparency = 0.5,
+                           point.shape = 16,
+                           cite.seq = FALSE
+                           )
+

+


+
+
+

Module Score Cell Classification +

+
+

Screens data for cells based on user-specified cell markers. Outputs +a seurat object with a metadata with averaged marker scores and +annotated “Likely_CellType” column.

+

This function can be used to quantify the expression of marker sets +in each individual cell and (optionally) in a hierarchical manner, +helping you identify different cell types and potential +subpopulations.

+

This function aids in identifying cell types based on average gene +expression. It uses a feature of the Seurat software known as the +AddModuleScore function. This function calculates the gene expression of +specific sets and records them within a designated area of the Seurat +object. The program then forecasts cell identities by comparing these +recorded scores across various gene sets. You have the ability to adjust +the identification process by designating cutoff points for a bimodal +distribution in a parameter known as manual threshold. Any thresholds +below this cutoff will not be considered during the identification +process.

+

Inputs: The program takes several inputs. These +include the single-cell RNA sequencing (scRNA-seq) object, a selection +of samples for analysis, a table of gene markers for different cell +types, and optionally, a hierarchical table for directing the order of +cell classification. Data Preparation: The program +prepares the scRNA-seq object, assigns names to the samples, and selects +data based on your specified samples. Module Score +Calculation: The program calculates module scores, a measure of +gene set activity or expression [3], for each cell type based on your +provided marker table. Visualization: Density +distribution plots and colored reduction plots will be generated to help +you visualize the module scores, their relationship with cell types, and +sample identities. Thresholding: Users can select +threshold values to aid in the classification of cells. Cells with +scores below your designated threshold will be labeled as “unknown”. +Subclass Identification: If desired, the program can identify subclasses +within cell types by further analyzing subpopulations. Updating +Cell Type Labels: The program appends a “Likely_CellType” +column to the metadata of the scRNA-seq object, based on the results of +the module score analysis. Output: An updated scRNA-seq +object with new cell type labels.

+
+
+MS_object=modScore(object=Anno_SO$object, 
+                   marker.table=Marker_Table,
+                   use_columns = c("Neutrophils","Macrophages","CD8_T" ),
+                   ms_threshold=c("Neutrophils .25","Macrophages .40","CD8_T .14"), 
+                   general.class=c("Neutrophils","Macrophages","CD8_T"), 
+                   multi.lvl = FALSE, 
+                   reduction = "umap",
+                   nbins = 10, 
+                   gradient.ft.size = 6,
+                   violin.ft.size = 6, 
+                   step.size = 0.1
+                   )
+

+

+


+
+
+

Rename Clusters by Cell Type +

+
+

This function creates a dot plot of Cell Types by Renamed Clusters +and outputs a Seurat Object with a new metadata column containing these +New Cluster Names. The Cell Types are often determined by looking at the +Module Score Cell Classification calls made by the upstream Module Score +Cell Classification (see MS_Celltype metadata column).

+

You must provide a table with a column containing the unique Cluster +IDs from an upstream clustering analysis (e.g. one of the SCT_snn_res_* +columns in your input Seurat Object metadata) and a column containing +the corresponding New Cluster Names you have chosen. The dot plot will +display the unique Cell Types on the x-axis and the Renamed Clusters on +the y-axis. The size of the dots show the percentage of cells in each +row (each Renamed Cluster) that was classified as each Cell Type. A +comparison of dot sizes within a row may provide insights into that +cluster’s primary Cell Type. A new metadata column named “Clusternames” +is added to the output Seurat Object that contains the New Cluster +Names.

+

Methodology
+This function creates a dot plot visualization of cell types by metadata +category (usually cluster number) from a given dataset implemented in +the SCWorkflow package. The function allows you to update and organize +biological data about cell clusters in a Seurat object. By changing the +input labels, you can map custom names to the existing cluster IDs which +will add these names to a new metadata column. It also generates a dot +plot using Seurat’s Dotplot function [4], providing a visual +representation of the percentage of various cell types within each +cluster. Typically, a cluster can be more distinctively named by the +predominant cell type as seen in the dotplot. The plot’s order can be +customized for the clusters and cell types. If no specific order is +provided, the function uses a default order. An optional parameter +allows the user to make the plot interactive. The function returns the +updated Seurat object and the plot.

+
+
+clstrTable <- read.table(file = "./images/Cluster_Names.txt",  sep = '\t',header = T)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OriginalClusterIDsNewClusterNames
0Pop0
1Pop1
2Pop2
3Pop3
4Pop4
5Pop5
6Pop6
7Pop7
+
+
+RNC_object=nameClusters(object=Anno_SO$object,
+                         cluster.identities.table=clstrTable,
+                         cluster.numbers= 'OriginalClusterIDs',
+                         cluster.names='NewClusterNames',
+                         cluster.column ="SCT_snn_res.0.2",
+                         labels.column = "mouseRNAseq_main",
+                         order.clusters.by = NULL,
+                         order.celltypes.by = NULL,
+                         interactive = FALSE
+                        )
+
+
+# DimPlot(MS_object, group.by = "SCT_snn_res.0.2", label = T, reduction = 'umap')
+# DimPlot(MS_object, group.by = "mouseRNAseq_main", label = T, reduction = 'umap')
+
+ggsave(RNC_object$plots, filename = "./images/RNC.png", width = 9, height = 6)
+

+


+
+
+

Dot Plot of Genes by Metadata +

+
+

This function creates a dot plot of average gene expression values +for a set of genes in cell subpopulations defined by metadata annotation +columns. The input table contains a single column for genes (the “Genes +column”) and a single column for category (the “Category labels to plot” +column). The values in the “Category labels to plot” column should match +the values provided in the metadata function (Metadata Category to +Plot). The plot will order the genes (x-axis, left to right) and +Categories (y-axis, top to bottom) in the order in which it appears in +the input table. Any category entries omitted will not be plotted.

+

The Dotplot size will reflect the percentage of cells expressing the +gene while the color will reflect the average expression for the gene. A +table showing values on the plot (either percentage of cells expressing +gene, or average expression scaled) will be returned, as selected by +user.

+

Methodology
+This function creates a dot plot visualization of gene expression by +metadata from a given dataset. It uses the Seurat package to create +these plots. The size of the dot represents the percentage of cells +expressing a particular gene (frequency), while the color of the dot +indicates the average gene expression level. The function ensures that +only unique and valid genes and categories are used. If some categories +or genes are not found in the dataset, appropriate warnings are issued. +The plot is then drawn with the option to reverse the x and y-axes and +to reverse the order of metadata categories. The colors can also be +customized. In addition to the plot, the function provides the tabular +format of the dot plot data, which can be useful for further analysis or +reporting. A choice of returning either the tables representing the +percent of cells expressing a gene or the average expression level of +the genes. This function can be useful for exploratory data analysis and +visualizing the differences in gene expression across different +conditions or groups of cells.

+
+
+FigOut=dotPlotMet(object=Anno_SO$object,
+                   metadata="orig.ident",
+                   cells=c("PBS","ENT","NHSIL12", "Combo","CD8dep" ),
+                   markers=Marker_Table$Macrophages,
+                   plot.reverse = FALSE,
+                   cell.reverse.sort = FALSE,
+                   dot.color = "darkblue"
+                  )
+

+



+
    +
  1. Aran, D., A. P. Looney, L. Liu, E. Wu, V. Fong, A. Hsu, S. Chak, +et al. 2019. “Reference-based analysis of lung single-cell sequencing +reveals a transitional profibrotic macrophage.” Nat. Immunol. 20 (2): +163–72.

  2. +
  3. http://bioconductor.org/packages/release/data/experiment/html/celldex.html

  4. +
  5. https://satijalab.org/seurat/reference/addmodulescore

  6. +
  7. Hao Y et al. Integrated analysis of multimodal single-cell data. +Cell. 2021 Jun 24;184(13):3573-3587.e29. doi: +10.1016/j.cell.2021.04.048. Epub 2021 May 31. PMID: 34062119; PMCID: +PMC8238499.

  8. +
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/articles/SCWorkflow-DEG.html b/docs/articles/SCWorkflow-DEG.html new file mode 100644 index 0000000..96afdea --- /dev/null +++ b/docs/articles/SCWorkflow-DEG.html @@ -0,0 +1,290 @@ + + + + + + + +Differential Expression Analysis • SCWorkflow + + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +
+

DE with Find Markers +

+
+

This function performs a DE (differential expression) analysis on a +merged Seurat object to identify expression markers between different +groups of cells (contrasts). This analysis uses the FindMarkers() +function of the Seurat Workflow.

+

Methodology Differential expression analysis (DEG) +is a fundamental technique in single-cell genomics research. The goal of +DEG analysis is to identify genes that exhibit significant changes in +expression levels between different groups of cells or conditions, +thereby uncovering potential markers that distinguish these groups. This +function takes a merged Seurat object [1] as input, expected to contain +single-cell data from multiple samples, along with relevant metadata and +SingleR annotations, which provide information about cell identity. To +perform the DEG analysis, the user can choose from various statistical +algorithms, such as MAST [2], wilcox [3], bimod [4], and more, which +accommodate different types of experimental designs and assumptions +about the data. The user can control the sensitivity of the analysis by +setting the minimum fold-change in gene expression between the groups to +be considered significant. Additionally, users can specify the assay to +be used for the analysis, whether it is the scaled data (SCT) or raw RNA +counts. For best results, it is recommended to use this function with +well-curated and preprocessed single-cell data, ensuring that the Seurat +object contains relevant metadata and SingleR annotations. Users should +carefully select the samples and contrasts based on their experimental +design and research questions. Additionally, exploring different +statistical algorithms and adjusting the threshold can fine-tune the DEG +analysis and reveal more accurate gene expression markers.

+
+
+DEG_table=degGeneExpressionMarkers(object = Anno_SO$object,
+                                   samples = c("PBS", "ENT", "NHSIL12", "Combo", "CD8dep" ),
+                                   contrasts = c("0-1"),
+                                   parameter.to.test = "SCT_snn_res_0_2",
+                                   test.to.use = "MAST",
+                                   log.fc.threshold = 0.25,
+                                   assay.to.use = "SCT",
+                                   use.spark = F
+                                   )
+ ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
GeneC_0_vs_1_pvalC_0_vs_1_logFCC_0_vs_1_pct1C_0_vs_1_pct2C_0_vs_1_adjpval
Cd2740-1.19994850.3690.8080
Fth10-1.41701031.0001.0000
Mmp120-3.05123050.1630.6350
mt-Atp600.97902961.0000.9840
mt-Co201.02899051.0000.9820
mt-Co300.97757681.0000.9810
+
    +
  1. https://satijalab.org/seurat/
  2. +
  3. https://rglab.github.io/MAST/
  4. +
  5. Dalgaard, Peter (2008). Introductory Statistics with R. Springer +Science & Business Media. pp. 99–100
  6. +
  7. https://en.wikipedia.org/wiki/Multimodal_distribution
  8. +
+
+
+

Pseudo Bulk Method +

+
+
+

Aggregate Seurat Counts +

+

This function is the first step in a Pseudobulk analysis of your +scRNA-seq dataset. It groups cells based on chosen categorical +variable(s) in the Seurat Object’s Metadata and aggregates the counts of +each gene in each group.

+

The output is a table of aggregate expression in which the rows are +genes and the columns are values found in the chosen Pseudobulk +variable. If you select multiple categories to aggregate by +(e.g. Category1: A,B,C and Category2: D,E,F), cells will be grouped by +combinations of category variables (e.g. A_D, A_E, A_F, B_D, B_E, B_F). +By default, gene counts are averaged across cells in each group.

+
+aggregateCounts(object=so,
+               var.group=var_group,
+               slot=slot)
+
+
+

Statistical Analysis using Limma +

+

Given a matrix (typically log-normalized gene expression) and a +metadata table, this will run one- and two-factor statistical analyses +on groups using linear or mixed effects models with limma. +Reference.

+

There are 2 ways for treating Donor or Patient - one as a random +effect and the other as a fixed effect

+

When Using a Mixed Effects Model (Donor as random effect):

+

Add Donor column to the Donor Variable Column Do not add the Donor +variable under Covariate Columns. It will be handled separately in the +Donor Variable Column as a random effect. The Covariate Columns field +should include any other variables except the Donor. When Using a Basic +Linear Model (Donor as fixed effect):

+

You can add the Donor column as a covariate under Covariate Columns, +where it will be treated as a fixed effect. Additional variables can be +included under Covariate Columns Ensure the Donor Variable Column is +left blank. This function is a Beta version and is undergoing active +development. If you encounter problems, please contact CCBR

+
+Pseudobulk_LimmaStats()
+
+
+
+

Visualizations +

+
+
+

Volcano Plot - Enhanced +

+

This function utilizes the EnhancedVolcano R Bioconductor +package to generate publication-ready volcano plots for differential +expression analyses, offering a number of customizable visualization +options and optimizing gene label placement to avoid clutter

+

Methodology A volcano plot is a type of scatterplot +that shows statistical significance (P value) versus magnitude of change +(fold change). It enables quick visual identification of genes with +large fold changes that are also statistically significant. These may be +the most biologically significant features (such as genes, isoforms, +peptides and so on). Here, we are using a highly-configurable function +“EnhancedVolcano” that produces publication-ready volcano plots.

+
    +
  1. Maria Doyle, 2021 Visualization of RNA-Seq results with Volcano Plot +(Galaxy Training Materials). https://training.galaxyproject.org/training-material/topics/transcriptomics/tutorials/rna-seq-viz-with-volcanoplot/tutorial.html +Online; accessed Mon Aug 01 2022
  2. +
  3. Batut et al., 2018 Community-Driven Data Analysis Training for +Biology Cell Systems 10.1016/j.cels.2018.05.012
  4. +
  5. Blighe, K, S Rana, and M Lewis. 2018. EnhancedVolcano: +Publication-ready volcano plots with enhanced coloring and labeling. https://github.com/kevinblighe/EnhancedVolcano.
  6. +
+
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/articles/SCWorkflow-Overview.html b/docs/articles/SCWorkflow-Overview.html new file mode 100644 index 0000000..3336cb2 --- /dev/null +++ b/docs/articles/SCWorkflow-Overview.html @@ -0,0 +1,292 @@ + + + + + + + +Import Data and Quality Control • SCWorkflow + + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +


+
+

Process Input Data +

+

This package is designed to work with the general Seurat Workflow[1]. +To begin using the SCWorkflow tools you will have to process the h5 +files generated by the Cell Ranger[Reference] software from the 10x +genomics platform to create a list of Seurat Objects corresponding to +each h5 file. A Seurat Object is the basic data structure for Seurat +Single Cell analysis

+

This tool supports standard scRNAseq, CITE-Seq, and TCR-Seq assays. +Samples prepared with a cell hashing protocol (HTOs) can also be +processed to produce a Seurat Object split by the corresponding +experimental design strategy. h5 files containing multiple samples can +also be processed to create Seurat objects that will be split based on +the values in the orig.ident column.

+

A corresponding Metadata table can be used to add sample level +information to the Seurat object. The table format should have Sample +names in the first Column and any sample metadata in additional columns. +The Metadata table can also be used to rename samples by including an +alternative sample name Column in the metadata table.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Sample_NameRenameTreatment
SCAF1713_1_1PBSWT
SCAF1714_2_1ENTEntinostat
SCAF1715_3_1NHSIL12NHS-IL12
SCAF1716_4_1ComboEntinostat + NHS-IL12
SCAF1717_5_1CD8depEntinostat + NHS-IL12
+

Samples can also be excluded from the final Seurat object using a +REGEX strategy to identify the samples to be included/excluded. explain +based on newnames

+

The final Seurat Object will contain an assay slot with log2 +normalized counts. QC figures for individual samples will also be +produced to help evaluate samples quality.

+
+
+SampleMetadataTable <- read.table(file = "./images/Sample_Metadata.txt",  sep = '\t',header = T)
+files=list.files(path="../tests/testthat/fixtures/Chariou/h5files",full.names = T)
+
+SOlist=processRawData(input=files,
+               organism="Mouse",
+               sample.metadata.table=SampleMetadataTable,
+               sample.name.column='Sample_Name',
+               rename.col='Rename',
+               keep=T,
+               file.filter.regex=c(),
+               split.h5=F,
+               cell.hash=F,
+               do.normalize.data=T                
+)
+

+
+
+

Filter Low Quality Cells +

+

This function will filter genes and cells based on multiple metrics +available in the Seurat Object metadata slot. A detailed guide for +single cell quality filtering can be found from Xi and Li, 2021 [2]. +First, genes can be filtered by setting the minimum number of cells +needed to keep a gene or removing VDJ Add descriptiopn of VDJ genes. +Next, cells can be filtered by setting thresholds for each individual +metric. Cells that do not meet any of the designated criteria will be +removed from the final filtered Seurat Object . Filter limits can be set +by using absolute values or median absolute deviations (MADs) for each +criteria. If both absolute and MAD values are set for a single filter, +the least extreme value (i.e. the lowest value for upper limits or the +highest value for lower limits) will be selected. The filter values used +for each metric will be printed in the log output. All filters have +default values and can be turned off by setting limits to NA.

+

The individual filtering criteria used in this tool are listed +below.

+
    +
  1. The total number of molecules detected within each cell +(nCount_RNA)
  2. +
  3. The number of genes detected in each cell (nFeature_RNA)
  4. +
  5. The complexity of of genes ( +log10(nFeature_RNA)/log10(nCount_RNA)
  6. +
  7. Percent of mitochondrial Genes
  8. +
  9. Percent counts in top 20 Genes
  10. +
  11. Doublets calculated by scDblFinder (using package default +parameters) [3]
  12. +
+

The function will return a filtered Seurat Object and various figures +showing metrics before and after filtering. These figures can be used to +help evaluate the effects of filtering criteria and whether filtering +limits need to be adjusted.

+
+
+SO_filtered=filterQC(object=SOlist$object,
+                     ## Filter Genes
+                     min.cells = 20,
+                     filter.vdj.genes=F,
+                     
+                     ## Filter Cells
+                     nfeature.limits=c(NA,NA),
+                     mad.nfeature.limits=c(5,5),
+                     ncounts.limits=c(NA,NA),
+                     mad.ncounts.limits=c(5,5),
+                     mitoch.limits = c(NA,25),
+                     mad.mitoch.limits = c(NA,3),
+                     complexity.limits = c(NA,NA),
+                     mad.complexity.limits = c(5,NA),
+                     topNgenes.limits = c(NA,NA),
+                     mad.topNgenes.limits = c(5,5),
+                     n.topgnes=20,
+                     do.doublets.fitler=T
+                                 
+            )
+

+

+
+
+

Combine, Normalize, and Cluster Data +

+

This functions combines multiple sample level Seurat Objects into a +single Seurat Object and normalizes the combined dataset. The +multi-dimensionality of the data will be summarized into a set of +“principal components” and visualized in both UMAP and tSNE projections. +A graph-based clustering approach will identify cell clusters with in +the data.

+
+
+Comb_SO=combineNormalize(
+                         object=SO_filtered$object,
+                     # Nomralization variables
+                         npcs = 21,
+                         SCT.level="Merged",
+                         vars.to.regress = c("percent.mt"),
+                     # FindVariableFeatures
+                         nfeatures = 2000,
+                         low.cut = 0.1,
+                         high.cut = 8,
+                         low.cut.disp = 1,
+                         high.cut.disp = 100000,
+                         selection.method = 'vst',
+                     # Dim Reduction
+                         only.var.genes = FALSE,
+                         draw.umap = TRUE,
+                         draw.tsne = TRUE,
+                         seed.for.pca = 42,
+                         seed.for.tsne = 1,
+                         seed.for.umap = 42,
+                    # Clustering Varables
+                         clust.res.low = 0.2,
+                         clust.res.high = 1.2,
+                         clust.res.bin = 0.2,
+                    # Select PCs
+                         methods.pca = NULL,
+                         var.threshold = 0.1,
+                         pca.reg.plot = FALSE,
+                         jackstraw = FALSE,
+                         jackstraw.dims=5,
+                    # Other                         
+                         exclude.sample = NULL,
+                         cell.count.limit= 35000,
+                         reduce.so = FALSE,
+                         project.name = 'scRNAProject',
+                         cell.hashing.data = FALSE
+)
+

+



1. Hao Y et al. Integrated analysis of multimodal +single-cell data. Cell. 2021 Jun 24;184(13):3573-3587.e29. doi: +10.1016/j.cell.2021.04.048. Epub 2021 May 31. PMID: 34062119; PMCID: +PMC8238499. 2. Heumos, L., Schaar, A.C., Lance, C. et al. Best practices +for single-cell analysis across modalities. Nat Rev Genet (2023). https://doi.org/10.1038/s41576-023-00586-w 3. Germain P, +Lun A, Macnair W, Robinson M (2021). “Doublet identification in +single-cell sequencing data using scDblFinder.” f1000research. doi:10.12688/f1000research.73600.1.

+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/articles/SCWorkflow-SubsetReclust.html b/docs/articles/SCWorkflow-SubsetReclust.html new file mode 100644 index 0000000..9e7a9a9 --- /dev/null +++ b/docs/articles/SCWorkflow-SubsetReclust.html @@ -0,0 +1,209 @@ + + + + + + + +Subset and Recluster • SCWorkflow + + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +


+
+

Subset Seurat Object +

+
+

This function subsets your Seurat object. Select a metadata column +and values matching the cells to pass forward in your analysis.

+
+
+filter_SO=filterSeuratObjectByMetadata(
+                   object = Anno_SO$object,
+                   samples.to.include = c("PBS","ENT","NHSIL12","Combo","CD8dep"),
+                   sample.name = 'orig.ident',
+                   category.to.filter = 'immgen_main',
+                   values.to.filter = c('Monocytes','Macrophages','DC'),
+                   keep.or.remove = FALSE,
+                   greater.less.than = "greater than",
+                   colors = c(
+                     "aquamarine3",
+                     "salmon1",
+                     "lightskyblue3"),
+                   seed = 10,
+                   cut.off = 0.5,
+                   legend.position = "right",
+                   reduction = "umap",
+                   plot.as.interactive.plot = FALSE,
+                   legend.symbol.size = 2,
+                   dot.size = 0.1,
+                   number.of.legend.columns = 1,
+                   dot.size.highlighted.cells = 0.5,
+                   use.cite.seq.data = FALSE
+                  ) 
+

+


+
+
+

Recluster Seurat Object +

+
+

This function provides a mechanism for re-clustering a filtered +Seurat object, a common task in single-cell RNA sequencing analysis. The +function provides options to choose the number of principal components, +range of clustering resolution, type of dimensionality reduction, and +several other parameters. The function finds variable features and +performs Principal Component Analysis (PCA). Next, dimensionality +reduction is performed using UMAP and t-SNE based on PCA, followed by +identification of nearest neighbors. It then performs clustering at +different resolutions within the provided range, creating new clustering +columns in the Seurat object. It also retains the old clustering +information, plots the clusters for each resolution and returns a list +containing the re-clustered Seurat object and the grid of clustering +plots. This function can be helpful for experimenting with different +clustering parameters especially after filtering and visually inspect +the results.

+

Methodology
+This function uses methods from the Seurat package [1].
+Seurat uses a graph-based clustering method inspired by previous +strategies, particularly those of Macosko et al [3]. It uses methods +like SNN-Cliq and PhenoGraph [4.5], which represent cells in a graph +structure based on similarities in feature expression patterns. The aim +is to divide this graph into highly connected communities or clusters. +The process begins by building a K-nearest neighbor (KNN) graph using +Euclidean distance in PCA space. The algorithm refines the edge weights +between cells according to their local neighborhood overlap, calculated +using the Jaccard similarity measure. This is performed using predefined +dimensions of the dataset, such as the first 10 Principal Components +(PCs). To cluster cells, Seurat uses modularity optimization techniques +like the Louvain [4] algorithm or SLM [5]. The ‘resolution’ parameter +can be adjusted to control the granularity of the downstream clustering; +a higher resolution results in more clusters. For single-cell datasets +of approximately 3K cells, the recommended range for this parameter is +between 0.4 and 1.2, but larger datasets typically require a higher +resolution.

+
+
+reClust_SO=reclusterSeuratObject(
+                  object = filter_SO$object,
+                  prepend.txt = "old",
+                  old.columns.to.save=c("orig_ident","Sample_Name","nCount_RNA","nFeature_RNA","percent_mt",
+                                        "log10GenesPerUMI","S_Score","G2M_Score","Phase","CC_Difference","Treatment",
+                                        "pct_counts_in_top_N_genes","Doublet","nCount_SCT","nFeature_SCT",
+                                        "mouseRNAseq_main","mouseRNAseq","immgen_main","immgen" ),
+                  number.of.pcs = 50,
+                  cluster.resolution.low.range = 0.2,
+                  cluster.resolution.high.range = 1.2,
+                  cluster.resolution.range.bins = 0.2,
+                  reduction.type = "umap"
+                              )
+

+



+
    +
  1. Seurat Clustering method https://satijalab.org/seurat/articles/pbmc3k_tutorial.html

  2. +
  3. Macosko EZ, Basu A, Satija R, Nemesh J, Shekhar K, Goldman M, +Tirosh I, Bialas AR, Kamitaki N, Martersteck EM, Trombetta JJ, Weitz DA, +Sanes JR, Shalek AK, Regev A, McCarroll SA. Highly Parallel Genome-wide +Expression Profiling of Individual Cells Using Nanoliter Droplets. Cell. +2015 May 21;161(5):1202-1214.

  4. +
  5. Xu, Chen, and Zhengchang Su. Identification of cell types from +single-cell transcriptomes using a novel clustering method. +Bioinformatics 31.12 (2015): 1974-1980.

  6. +
  7. Levine, Jacob H., et al. Data-driven phenotypic dissection of AML +reveals progenitor-like cells that correlate with prognosis. Cell 162.1 +(2015): 184-197.

  8. +
  9. Blondel, Vincent D., et al. Fast unfolding of communities in +large networks.”Journal of statistical mechanics: theory and experiment +2008.10 (2008): P10008.

  10. +
  11. Waltman, Ludo, and Nees Jan Van Eck. A smart local moving +algorithm for large-scale modularity-based community detection. The +European physical journal B 86 (2013): 1-14

  12. +
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/articles/SCWorkflow-Usage.html b/docs/articles/SCWorkflow-Usage.html new file mode 100644 index 0000000..f46448f --- /dev/null +++ b/docs/articles/SCWorkflow-Usage.html @@ -0,0 +1,200 @@ + + + + + + + +Getting Started • SCWorkflow + + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +
+

Use SCWorkflow Container +

+
+

The SCWorkflow docker container is available on Biowulf which can be +used with RStudio to organize and rune the SCWorkflow package.

+

You will need 2 shells (terminals) to set up RStudio on Biowulf.

+


+
+

+Terminal 1: Set up RStudio Server on Biowulf +

+
+
+

1. Log in to Biowulf +

+

Open a terminal and login to biowulf then call an interactive +session

+
ssh username@helix.nih.gov
+
+sinteractive --tunnel --time=12:00:00 --mem=50g --cpus-per-task=16 --gres=lscratch:50
+
+
+

2. Get the PORT number for termal 2 +

+
echo $PORT1
+
+example port is 46137 
+
+
+

3. Load the Container +

+

The single cell container will emulate the environments from +NIDAP

+

+source /data/CCBR/NIDAP/container_singlecell.sh
+


+
+
+

+Terminal 2: Local shell +

+
+
+

4. Connect your local shell to the RStudio server on Biowulf using +SSH tunneling. +

+

Use the $PORT number from terminal 1 (step 2).

+
 ssh -N -L $PORT:localhost:$PORT yourusername@biowulf.nih.gov
+ 
+ login with nih password
+
+
+

5. Open RStudio in your local web browser +

+

Open your web browser and go to:

+
localhost:$PORT 
+

Use the $PORT number from terminal 1 (step 2)

+

This will open Rstudio in your browser that is connected to the +biowulf container you opened in step 3.

+


+
+
+
+

Copy Files from Rstuido server to Helix +

+
+
+

1. Log into Helix +

+
ssh username@helix.nih.gov
+
+
+

2. Go to Working Directory for Project +

+
+
+

3. connect to Rstuido Server to copy files to Biowulf +

+
sftp username@ nciws-d2335-v.nci.nih.gov
+
+
+

4. copy files to biowulf +

+

Examples:

+

All files:

+
mget -r *
+

Rscipts:

+
mget -r *R
+
+
+
+

Install Package +

+
+

for general use SCWorkflow can be installed into your Rlibrary

+
# install.packages("remotes")
+# remotes::install_github("NIDAP-Community/SCWorkflow", dependencies = TRUE)
+
+library(SCWorkflow)
+




+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/articles/SCWorkflow-Visualizations.html b/docs/articles/SCWorkflow-Visualizations.html new file mode 100644 index 0000000..86abf9b --- /dev/null +++ b/docs/articles/SCWorkflow-Visualizations.html @@ -0,0 +1,469 @@ + + + + + + + +Visualizations • SCWorkflow + + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +


+
+

Color by Metadata +

+
+

Use this Function to color your dimensionality reduction (TSNE & +UMAP) with different columns from your Metadata Table. You can select +one or more columns from the Metadata Table, and for each column +selected, this function will produce a plot (t-SNE & UMAP) using the +data in that column to color the cells.

+

This function visualizes your plot based on selected metadata. Users +can customize how they want to visualize the data, including the type of +visualization used, the size and shape of the points, and the level of +transparency.

+
+FigOut=plotMetadata(
+            object=Anno_SO$object,
+            samples.to.include=c("PBS","ENT","NHSIL12","Combo","CD8dep" ),
+            metadata.to.plot=c('SCT_snn_res.0.4','Phase'),
+            columns.to.summarize=NULL,
+            summarization.cut.off = 5,
+            reduction.type = "umap",
+            use.cite.seq = FALSE,
+            show.labels = FALSE,
+            legend.text.size = 1,
+            legend.position = "right",
+            dot.size = 0.01
+                  )
+

+


+
+
+

Plot 3D Dimensionality Reduction +

+
+

This Function creates 3D interactive UMAP or t-SNE plot. The plot is +saved in the output folder as an HTML file that can be downloaded.

+

This function is designed to generate a 3D t-SNE visualization based +on a given Seurat Object. The output includes an interactive plot and a +dataframe containing the t-SNE coordinates. The function accepts several +parameters, such as the Seurat Object, a metadata column for color, a +metadata column for labeling, dot size for the plot, legend display +option, colors for the color variable, filename for saving the plot, the +number of principal components for t-SNE calculations, and an option to +save the plot as a widget in an HTML file. Initially, the function +executes t-SNE on the Seurat Object to obtain the 3D coordinates. +Subsequently, it constructs a dataframe for the Plotly visualization, +incorporating the t-SNE coordinates, color variable, and label variable. +The function generates a 3D scatter plot using the t-SNE coordinates. +Finally, the function saves the plot as an embedded Plotly image in an +HTML file.

+

Methodology
+t-Distributed Stochastic Neighbor Embedding (t-SNE) is a sophisticated +dimensionality reduction technique frequently employed for the +visualization of high-dimensional data [1]. It effectively displays the +relationships between individual cells based on their gene expression +profiles. To compute t-SNE, the algorithm constructs a probability +distribution representing similarities between data points in +high-dimensional space. Subsequently, it generates a lower-dimensional +representation, typically two or three dimensions, wherein the distances +between data points reflect their similarities in the high-dimensional +space. The algorithm employs an iterative process to adjust the +positions of cells in a lower-dimensional space, aiming to minimize +discrepancies between the original high-dimensional similarities and +those in the lower-dimensional space. This approach enables the +algorithm to capture both global and local structures within the data, +effectively revealing clusters or groups of similar cells.

+
+
+FigOut=tSNE3D(
+           object=Anno_SO$object,
+           color.variable='SCT_snn_res.0.4',
+           label.variable='SCT_snn_res.0.4',
+           dot.size = 4,
+           legend = TRUE,
+           colors = c("darkblue","purple4","green","red","darkcyan",
+                      "magenta2","orange","yellow","black"),
+           filename = "plot.html",
+           save.plot = FALSE,
+           npcs = 15
+           )
+


+
+
+

Color by Genes +

+
+

This function visualizes gene expression intensities for provided +Genes across your cells. If a gene is not found in the dataset, the Log +will report this. Otherwise, you should see one plot (TSNE or UMAP, your +choice) per gene name provided. The intensity of the red color will be +relative to the expression of the gene in that cell. Final Potomac +Compatible Version: v98. Sugarloaf V1: v103. [View

+

Methodology
+This function visualizes expression values of the chosen gene or protein +in different samples. Users can customize how they want to visualize the +data, including the type of visualization used, the size and shape of +the points, and the level of transparency.

+
+
+FigOut=colorByGene(
+            object=Anno_SO$object,
+            samples.to.include=c("PBS","ENT","NHSIL12","Combo","CD8dep" ),
+            gene='Itgam',
+            reduction.type = "umap",
+            number.of.rows = 0,
+            return.seurat.object = FALSE,
+            color = "red",
+            point.size = 1,
+            point.shape = 16,
+            point.transparency = 0.5,
+            use.cite.seq.data = FALSE,
+            assay = "SCT")
+

+


+
+
+

Violin Plot from Seurat Object +

+
+

This Function allows for the generation of customized violin plots to +visualize transcriptional changes and interactions in single-cell +RNA-seq data, providing insights into the cellular heterogeneity and +dynamics within the dataset.

+

Methodology
+The Function organizes your data based on specific groups that you +choose from a Seurat Object metadata. It then gathers information about +the activity levels of specific genes you’re interested in. You can, if +you wish, change the names or the order of these groups based on a +column you specify in the data. This feature lets you tailor the +analysis more closely to your needs. The code also has a function that +removes any odd data points that might distort the results, and it +adjusts the data to make it easier to visualize through jittered points +and an overlaying boxplot displaying quantile information. Then, the +code creates violin plots, which allows you to see how the activity +levels of genes vary within each group [2]. The graph is customizable, +letting you set various options such as limit values on the vertical +axis, displaying individual data points, converting scales to +logarithmic, and showing boxplots. You can choose how the plot looks - +whether it’s laid out like a grid, in rows, or with customized +labels.

+
+
+FigOut=violinPlot_mod(
+                object=Anno_SO$object, 
+                assay='SCT', 
+                slot='scale.data', 
+                genes=c('Cd163','Cd38'), 
+                group='SCT_snn_res.0.4', 
+                facet_by = "", 
+                filter_outliers = F,
+                outlier_low = 0.05,
+                outlier_high = 0.95,
+                jitter_points = TRUE, 
+                jitter_dot_size = 1
+          )
+

+


+
+
+

Heatmap +

+
+

This Function provides a comprehensive method for visualizing single +cell transcript and/or protein expression data in the form of a heatmap. +The data is obtained from a Seurat object, and the user can specify a +set of genes for the analysis.
+The Function allows optional ordering by metadata (categorical) or +gene/protein expression levels. Visualization customization options +include color choices for the heatmap, addition of gene or protein +annotations, and optional arrangement by metadata.

+

Key features include: - Options for adding gene or protein +annotations, metadata arrangement, and specifying row and column names. +- Customizable visualization settings including font sizes for rows, +columns, and legend, row height, and heatmap colors. - Ability to trim +outlier data, perform z-scaling on rows, and set row order.

+

The Function returns a heatmap plot along with the underlying data +used to generate it. It also allows the user to set a seed for color +generation and specify outlier data parameters. This function is +particularly useful for exploratory data analysis and preliminary data +visualization in single cell studies.

+

Methodology
+In this method, two hierarchical clustering processes are performed: one +on the rows and one on the columns of the dataset unless ordered by +annotations. Hierarchical clustering is a method of cluster analysis +that aims to build a hierarchy of clusters. The result is a tree-like +diagram called a dendrogram, where similar data points (e.g., genes or +samples) are joined together into clusters at the “branches”, based on a +mathematical measure of similarity such as Euclidean or Manhattan +distance. The heatmap is produced by a package called ComplexHeatmap [3] +and presents the data matrix where rows represent individual genes (or +proteins, metabolites, etc.) and columns represent different samples +(e.g., tissue samples, cells, experimental conditions). The color at +each position in the grid corresponds to the expression level of a gene +in a particular sample, with one color representing upregulation (higher +expression), another representing downregulation (lower expression), and +usually a neutral color representing no change. This allows for easy +visual interpretation of patterns or correlations in the data.

+
+
+FigOut=heatmapSC(
+          object=Anno_SO$object,
+          sample.names=c("PBS","ENT","NHSIL12","Combo","CD8dep" ),
+          metadata='SCT_snn_res.0.4',
+          transcripts=c('Cd163','Cd38','Itgam','Cd4','Cd8a','Pdcd1','Ctla4'),
+          use_assay = 'SCT',
+          proteins = NULL,
+          heatmap.color = "Bu Yl Rd",
+          plot.title = "Heatmap",
+          add.gene.or.protein = FALSE,
+          protein.annotations = NULL,
+          rna.annotations = NULL,
+          arrange.by.metadata = TRUE,
+          add.row.names = TRUE,
+          add.column.names = FALSE,
+          row.font = 5,
+          col.font = 5,
+          legend.font = 5,
+          row.height = 15,
+          set.seed = 6,
+          scale.data = TRUE,
+          trim.outliers = TRUE,
+          trim.outliers.percentage = 0.01,
+          order.heatmap.rows = FALSE,
+          row.order = c()
+          )
+

+


+
+
+

Dot Plot of Genes by Metadata +

+
+

This function creates a dot plot of average gene expression values +for a set of genes in cell subpopulations defined by metadata annotation +columns. The input table contains a single column for genes (the “Genes +column”) and a single column for category (the “Category labels to plot” +column). The values in the “Category labels to plot” column should match +the values provided in the metadata function (Metadata Category to +Plot). The plot will order the genes (x-axis, left to right) and +Categories (y-axis, top to bottom) in the order in which it appears in +the input table. Any category entries omitted will not be plotted.

+

The Dotplot size will reflect the percentage of cells expressing the +gene while the color will reflect the average expression for the gene. A +table showing values on the plot (either percentage of cells expressing +gene, or average expression scaled) will be returned, as selected by +user.

+

Methodology
+This function creates a dot plot visualization of gene expression by +metadata from a given dataset. It uses the Seurat package to create +these plots. The size of the dot represents the percentage of cells +expressing a particular gene (frequency), while the color of the dot +indicates the average gene expression level. The function ensures that +only unique and valid genes and categories are used. If some categories +or genes are not found in the dataset, appropriate warnings are issued. +The plot is then drawn with the option to reverse the x and y-axes and +to reverse the order of metadata categories. The colors can also be +customized. In addition to the plot, the function provides the tabular +format of the dot plot data, which can be useful for further analysis or +reporting. A choice of returning either the tables representing the +percent of cells expressing a gene or the average expression level of +the genes. This function can be useful for exploratory data analysis and +visualizing the differences in gene expression across different +conditions or groups of cells.

+
    +
  1. Seurat package Dotplot Documentation https://satijalab.org/seurat/reference/dotplot +
  2. +
+
+
+FigOut=dotPlotMet(
+           object=Anno_SO$object,
+           metadata='SCT_snn_res.0.4',
+           cells=unique(Anno_SO$object$SCT_snn_res.0.4),
+           markers=c('Itgam','Cd163','Cd38','Cd4','Cd8a','Pdcd1','Ctla4'),
+           plot.reverse = FALSE,
+           cell.reverse.sort = FALSE,
+           dot.color = "darkblue"
+           )
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +



+
    +
  1. Seurat Documentation for t-SNE Analysis https://satijalab.org/seurat/reference/runtsne

  2. +
  3. https://ggplot2.tidyverse.org/reference/

  4. +
  5. Complex Heatmap Reference Book https://jokergoo.github.io/ComplexHeatmap-reference/book/

  6. +
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/articles/images/Anno1.png b/docs/articles/images/Anno1.png new file mode 100644 index 0000000..d7b6443 Binary files /dev/null and b/docs/articles/images/Anno1.png differ diff --git a/docs/articles/images/Anno2.png b/docs/articles/images/Anno2.png new file mode 100644 index 0000000..5cbcee0 Binary files /dev/null and b/docs/articles/images/Anno2.png differ diff --git a/docs/articles/images/CBM1.png b/docs/articles/images/CBM1.png new file mode 100644 index 0000000..068a006 Binary files /dev/null and b/docs/articles/images/CBM1.png differ diff --git a/docs/articles/images/CN1.png b/docs/articles/images/CN1.png new file mode 100644 index 0000000..3943371 Binary files /dev/null and b/docs/articles/images/CN1.png differ diff --git a/docs/articles/images/CN2.png b/docs/articles/images/CN2.png new file mode 100644 index 0000000..54e40f8 Binary files /dev/null and b/docs/articles/images/CN2.png differ diff --git a/docs/articles/images/DL1.png b/docs/articles/images/DL1.png new file mode 100644 index 0000000..d773c20 Binary files /dev/null and b/docs/articles/images/DL1.png differ diff --git a/docs/articles/images/DL2.png b/docs/articles/images/DL2.png new file mode 100644 index 0000000..a09d734 Binary files /dev/null and b/docs/articles/images/DL2.png differ diff --git a/docs/articles/images/DPM.png b/docs/articles/images/DPM.png new file mode 100644 index 0000000..763d7fc Binary files /dev/null and b/docs/articles/images/DPM.png differ diff --git a/docs/articles/images/MS1.png b/docs/articles/images/MS1.png new file mode 100644 index 0000000..d601811 Binary files /dev/null and b/docs/articles/images/MS1.png differ diff --git a/docs/articles/images/ProcessInputData1.png b/docs/articles/images/ProcessInputData1.png new file mode 100644 index 0000000..de0eb06 Binary files /dev/null and b/docs/articles/images/ProcessInputData1.png differ diff --git a/docs/articles/images/ProcessInputData2.png b/docs/articles/images/ProcessInputData2.png new file mode 100644 index 0000000..7f07fe9 Binary files /dev/null and b/docs/articles/images/ProcessInputData2.png differ diff --git a/docs/articles/images/QC1.png b/docs/articles/images/QC1.png new file mode 100644 index 0000000..35c9f78 Binary files /dev/null and b/docs/articles/images/QC1.png differ diff --git a/docs/articles/images/QC2.png b/docs/articles/images/QC2.png new file mode 100644 index 0000000..369953e Binary files /dev/null and b/docs/articles/images/QC2.png differ diff --git a/docs/articles/images/QC3.png b/docs/articles/images/QC3.png new file mode 100644 index 0000000..3668caf Binary files /dev/null and b/docs/articles/images/QC3.png differ diff --git a/docs/articles/images/RNC.png b/docs/articles/images/RNC.png new file mode 100644 index 0000000..bd47367 Binary files /dev/null and b/docs/articles/images/RNC.png differ diff --git a/docs/articles/index.html b/docs/articles/index.html new file mode 100644 index 0000000..a482a11 --- /dev/null +++ b/docs/articles/index.html @@ -0,0 +1,89 @@ + +Articles • SCWorkflow + Skip to contents + + +
+
+
+ + +
+

Developer

+

Developer documentation

+ +
Contributing to SCWorkflow
+
+
Getting Started
+
+
UNKNOWN TITLE
+
+
+
+ + +
+ + + +
+ + + + + + + diff --git a/docs/authors.html b/docs/authors.html new file mode 100644 index 0000000..5f19539 --- /dev/null +++ b/docs/authors.html @@ -0,0 +1,112 @@ + +Authors and Citation • SCWorkflow + Skip to contents + + +
+
+
+ +
+

Authors

+ +
  • +

    Maggie Cam. Author. +

    +
  • +
  • +

    Thomas Meyer. Author, maintainer. +

    +
  • +
  • +

    Jing Bian. Author. +

    +
  • +
  • +

    Alexandra Michalowski. Author. +

    +
  • +
  • +

    Alexei Lobanov. Author. +

    +
  • +
  • +

    Philip Homan. Author. +

    +
  • +
  • +

    Rui He. Author. +

    +
  • +
+ +
+

Citation

+

+ +

Cam M, Meyer T, Bian J, Michalowski A, Lobanov A, Homan P, He R (2025). +SCWorkflow: SCWorkflow from NIDAP. +R package version 1.0.2. +

+
@Manual{,
+  title = {SCWorkflow: SCWorkflow from NIDAP},
+  author = {Maggie Cam and Thomas Meyer and Jing Bian and Alexandra Michalowski and Alexei Lobanov and Philip Homan and Rui He},
+  year = {2025},
+  note = {R package version 1.0.2},
+}
+
+ +
+ + +
+ + + +
+ + + + + + + diff --git a/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmQiArmlw.woff2 b/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmQiArmlw.woff2 new file mode 100644 index 0000000..b0ed6d6 Binary files /dev/null and b/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmQiArmlw.woff2 differ diff --git a/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmUiAo.woff2 b/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmUiAo.woff2 new file mode 100644 index 0000000..5a5fad1 Binary files /dev/null and b/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmUiAo.woff2 differ diff --git a/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmXiArmlw.woff2 b/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmXiArmlw.woff2 new file mode 100644 index 0000000..de646f8 Binary files /dev/null and b/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmXiArmlw.woff2 differ diff --git a/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmYiArmlw.woff2 b/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmYiArmlw.woff2 new file mode 100644 index 0000000..6a6fb7a Binary files /dev/null and b/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmYiArmlw.woff2 differ diff --git a/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmZiArmlw.woff2 b/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmZiArmlw.woff2 new file mode 100644 index 0000000..1a1ed7c Binary files /dev/null and b/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmZiArmlw.woff2 differ diff --git a/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmaiArmlw.woff2 b/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmaiArmlw.woff2 new file mode 100644 index 0000000..47e69cf Binary files /dev/null and b/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmaiArmlw.woff2 differ diff --git a/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmbiArmlw.woff2 b/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmbiArmlw.woff2 new file mode 100644 index 0000000..bc95855 Binary files /dev/null and b/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmbiArmlw.woff2 differ diff --git a/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVn6iArmlw.woff2 b/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVn6iArmlw.woff2 new file mode 100644 index 0000000..f9c26fa Binary files /dev/null and b/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVn6iArmlw.woff2 differ diff --git a/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVnoiArmlw.woff2 b/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVnoiArmlw.woff2 new file mode 100644 index 0000000..15e1583 Binary files /dev/null and b/docs/deps/Roboto-0.4.10/KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVnoiArmlw.woff2 differ diff --git a/docs/deps/Roboto-0.4.10/font.css b/docs/deps/Roboto-0.4.10/font.css new file mode 100644 index 0000000..33cb5f4 --- /dev/null +++ b/docs/deps/Roboto-0.4.10/font.css @@ -0,0 +1,90 @@ +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmZiArmlw.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmQiArmlw.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmYiArmlw.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmXiArmlw.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* math */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVnoiArmlw.woff2) format('woff2'); + unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; +} +/* symbols */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVn6iArmlw.woff2) format('woff2'); + unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmbiArmlw.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmaiArmlw.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(KFOMCnqEu92Fr1ME7kSn66aGLdTylUAMQXC89YmC2DPNWubEbVmUiAo.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/docs/deps/Roboto_Mono-0.4.10/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_QOW4Ep0.woff2 b/docs/deps/Roboto_Mono-0.4.10/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_QOW4Ep0.woff2 new file mode 100644 index 0000000..db3b731 Binary files /dev/null and b/docs/deps/Roboto_Mono-0.4.10/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_QOW4Ep0.woff2 differ diff --git a/docs/deps/Roboto_Mono-0.4.10/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_R-W4Ep0.woff2 b/docs/deps/Roboto_Mono-0.4.10/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_R-W4Ep0.woff2 new file mode 100644 index 0000000..f71b508 Binary files /dev/null and b/docs/deps/Roboto_Mono-0.4.10/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_R-W4Ep0.woff2 differ diff --git a/docs/deps/Roboto_Mono-0.4.10/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_ROW4.woff2 b/docs/deps/Roboto_Mono-0.4.10/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_ROW4.woff2 new file mode 100644 index 0000000..6008f02 Binary files /dev/null and b/docs/deps/Roboto_Mono-0.4.10/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_ROW4.woff2 differ diff --git a/docs/deps/Roboto_Mono-0.4.10/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_S-W4Ep0.woff2 b/docs/deps/Roboto_Mono-0.4.10/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_S-W4Ep0.woff2 new file mode 100644 index 0000000..a7b593f Binary files /dev/null and b/docs/deps/Roboto_Mono-0.4.10/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_S-W4Ep0.woff2 differ diff --git a/docs/deps/Roboto_Mono-0.4.10/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_SeW4Ep0.woff2 b/docs/deps/Roboto_Mono-0.4.10/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_SeW4Ep0.woff2 new file mode 100644 index 0000000..5eca4ab Binary files /dev/null and b/docs/deps/Roboto_Mono-0.4.10/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_SeW4Ep0.woff2 differ diff --git a/docs/deps/Roboto_Mono-0.4.10/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_SuW4Ep0.woff2 b/docs/deps/Roboto_Mono-0.4.10/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_SuW4Ep0.woff2 new file mode 100644 index 0000000..08e21fa Binary files /dev/null and b/docs/deps/Roboto_Mono-0.4.10/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_SuW4Ep0.woff2 differ diff --git a/docs/deps/Roboto_Mono-0.4.10/font.css b/docs/deps/Roboto_Mono-0.4.10/font.css new file mode 100644 index 0000000..fad8c87 --- /dev/null +++ b/docs/deps/Roboto_Mono-0.4.10/font.css @@ -0,0 +1,54 @@ +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_SeW4Ep0.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_QOW4Ep0.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_R-W4Ep0.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_S-W4Ep0.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_SuW4Ep0.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_ROW4.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/docs/deps/bootstrap-5.3.1/bootstrap.bundle.min.js b/docs/deps/bootstrap-5.3.1/bootstrap.bundle.min.js new file mode 100644 index 0000000..e8f21f7 --- /dev/null +++ b/docs/deps/bootstrap-5.3.1/bootstrap.bundle.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.3.1 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function M(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function j(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${j(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${j(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${j(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.1"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return n(e)},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",Mt="collapsing",jt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(Mt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(Mt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(jt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Me(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const je={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Me(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:Me(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==P(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],M=f?-T[$]/2:0,j=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-M-q-z-O.mainAxis:j-q-z-O.mainAxis,K=v?-E[$]/2+M+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",An="show",En="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||N.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(N.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){N.off(window,hn),N.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,N.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){N.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),N.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),N.on(this._element,bn,(t=>{N.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),N.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(N.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(En)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(En),this._queueCallback((()=>{this._element.classList.remove(En),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}N.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),N.one(e,pn,(t=>{t.defaultPrevented||N.one(e,fn,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),R(On),m(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Wn=`click${xn}${kn}`,Bn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||N.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),N.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(N.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),N.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():N.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){N.on(this._element,Bn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():N.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}N.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;N.one(e,Fn,(()=>{a(this)&&this.focus()}));const i=z.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),N.on(window,Ln,(()=>{for(const t of z.find(In))qn.getOrCreateInstance(t).show()})),N.on(window,Hn,(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),R(qn),m(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Yn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends H{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Yn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends W{constructor(t,e){if(void 0===vi)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),N.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=N.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),N.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._queueCallback((()=>{N.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!N.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),N.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return bi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)N.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");N.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),N.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},N.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=F.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Es extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return As}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(N.off(this._config.target,ms),N.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(bs,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),N.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=z.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=Es.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(window,gs,(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))Es.getOrCreateInstance(t)})),m(Es);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Ws="show",Bs=":not(.dropdown-toggle)",zs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Rs=`.nav-link${Bs}, .list-group-item${Bs}, [role="tab"]${Bs}, ${zs}`,qs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Vs extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),N.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?N.trigger(e,Cs,{relatedTarget:t}):null;N.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),N.trigger(t,ks,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),N.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!l(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=b(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Vs.getOrCreateInstance(i).show())}_getChildren(){return z.find(Rs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",Fs),n(".dropdown-menu",Ws),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(Rs)?t:z.findOne(Rs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Vs.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(document,Ls,zs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||Vs.getOrCreateInstance(this).show()})),N.on(window,Ds,(()=>{for(const t of z.find(qs))Vs.getOrCreateInstance(t)})),m(Vs);const Ks=".bs.toast",Qs=`mouseover${Ks}`,Xs=`mouseout${Ks}`,Ys=`focusin${Ks}`,Us=`focusout${Ks}`,Gs=`hide${Ks}`,Js=`hidden${Ks}`,Zs=`show${Ks}`,to=`shown${Ks}`,eo="hide",io="show",no="showing",so={animation:"boolean",autohide:"boolean",delay:"number"},oo={animation:!0,autohide:!0,delay:5e3};class ro extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return oo}static get DefaultType(){return so}static get NAME(){return"toast"}show(){N.trigger(this._element,Zs).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(eo),d(this._element),this._element.classList.add(io,no),this._queueCallback((()=>{this._element.classList.remove(no),N.trigger(this._element,to),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(N.trigger(this._element,Gs).defaultPrevented||(this._element.classList.add(no),this._queueCallback((()=>{this._element.classList.add(eo),this._element.classList.remove(no,io),N.trigger(this._element,Js)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(io),super.dispose()}isShown(){return this._element.classList.contains(io)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){N.on(this._element,Qs,(t=>this._onInteraction(t,!0))),N.on(this._element,Xs,(t=>this._onInteraction(t,!1))),N.on(this._element,Ys,(t=>this._onInteraction(t,!0))),N.on(this._element,Us,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ro.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(ro),m(ro),{Alert:Q,Button:Y,Carousel:xt,Collapse:Bt,Dropdown:qi,Modal:On,Offcanvas:qn,Popover:us,ScrollSpy:Es,Tab:Vs,Toast:ro,Tooltip:cs}})); +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/docs/deps/bootstrap-5.3.1/bootstrap.bundle.min.js.map b/docs/deps/bootstrap-5.3.1/bootstrap.bundle.min.js.map new file mode 100644 index 0000000..3863da8 --- /dev/null +++ b/docs/deps/bootstrap-5.3.1/bootstrap.bundle.min.js.map @@ -0,0 +1 @@ +{"version":3,"names":["elementMap","Map","Data","set","element","key","instance","has","instanceMap","get","size","console","error","Array","from","keys","remove","delete","TRANSITION_END","parseSelector","selector","window","CSS","escape","replace","match","id","triggerTransitionEnd","dispatchEvent","Event","isElement","object","jquery","nodeType","getElement","length","document","querySelector","isVisible","getClientRects","elementIsVisible","getComputedStyle","getPropertyValue","closedDetails","closest","summary","parentNode","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","getAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","noop","reflow","offsetHeight","getjQuery","jQuery","body","DOMContentLoadedCallbacks","isRTL","dir","defineJQueryPlugin","plugin","callback","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","addEventListener","push","execute","possibleCallback","args","defaultValue","executeAfterTransition","transitionElement","waitForTransition","emulatedDuration","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","split","getTransitionDurationFromElement","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","listLength","index","indexOf","Math","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","nativeEvents","Set","makeEventUid","uid","getElementEvents","findHandler","events","callable","delegationSelector","Object","values","find","event","normalizeParameters","originalTypeEvent","delegationFunction","isDelegated","typeEvent","getTypeEvent","addHandler","oneOff","wrapFunction","relatedTarget","delegateTarget","call","this","handlers","previousFunction","domElements","querySelectorAll","domElement","hydrateObj","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","removeNamespacedHandlers","namespace","storeElementEvent","handlerKey","entries","includes","on","one","inNamespace","isNamespace","startsWith","elementEvent","slice","keyHandlers","trigger","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","evt","cancelable","preventDefault","obj","meta","value","_unused","defineProperty","configurable","normalizeData","toString","JSON","parse","decodeURIComponent","normalizeDataKey","chr","toLowerCase","Manipulator","setDataAttribute","setAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","bsKeys","dataset","filter","pureKey","charAt","getDataAttribute","Config","Default","DefaultType","Error","_getConfig","config","_mergeConfigObj","_configAfterMerge","_typeCheckConfig","jsonConfig","constructor","configTypes","property","expectedTypes","valueType","prototype","RegExp","test","TypeError","toUpperCase","BaseComponent","super","_element","_config","DATA_KEY","dispose","EVENT_KEY","propertyName","getOwnPropertyNames","_queueCallback","isAnimated","getInstance","getOrCreateInstance","VERSION","eventName","getSelector","hrefAttribute","trim","SelectorEngine","concat","Element","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","map","join","el","getSelectorFromElement","getElementFromSelector","getMultipleElementsFromSelector","enableDismissTrigger","component","method","clickEvent","tagName","EVENT_CLOSE","EVENT_CLOSED","Alert","close","_destroyElement","each","data","undefined","SELECTOR_DATA_TOGGLE","Button","toggle","button","EVENT_TOUCHSTART","EVENT_TOUCHMOVE","EVENT_TOUCHEND","EVENT_POINTERDOWN","EVENT_POINTERUP","endCallback","leftCallback","rightCallback","Swipe","isSupported","_deltaX","_supportPointerEvents","PointerEvent","_initEvents","_start","_eventIsPointerPenTouch","clientX","touches","_end","_handleSwipe","_move","absDeltaX","abs","direction","add","pointerType","navigator","maxTouchPoints","DATA_API_KEY","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","EVENT_SLIDE","EVENT_SLID","EVENT_KEYDOWN","EVENT_MOUSEENTER","EVENT_MOUSELEAVE","EVENT_DRAG_START","EVENT_LOAD_DATA_API","EVENT_CLICK_DATA_API","CLASS_NAME_CAROUSEL","CLASS_NAME_ACTIVE","SELECTOR_ACTIVE","SELECTOR_ITEM","SELECTOR_ACTIVE_ITEM","KEY_TO_DIRECTION","ArrowLeft","ArrowRight","interval","keyboard","pause","ride","touch","wrap","Carousel","_interval","_activeElement","_isSliding","touchTimeout","_swipeHelper","_indicatorsElement","_addEventListeners","cycle","_slide","nextWhenVisible","hidden","_clearInterval","_updateInterval","setInterval","_maybeEnableCycle","to","items","_getItems","activeIndex","_getItemIndex","_getActive","order","defaultInterval","_keydown","_addTouchEventListeners","img","swipeConfig","_directionToOrder","endCallBack","clearTimeout","_setActiveIndicatorElement","activeIndicator","newActiveIndicator","elementInterval","parseInt","isNext","nextElement","nextElementIndex","triggerEvent","_orderToDirection","isCycling","directionalClassName","orderClassName","completeCallBack","_isAnimated","clearInterval","carousel","slideIndex","carousels","EVENT_SHOW","EVENT_SHOWN","EVENT_HIDE","EVENT_HIDDEN","CLASS_NAME_SHOW","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_DEEPER_CHILDREN","parent","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElement","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activeChildren","_getFirstLevelChildren","activeInstance","dimension","_getDimension","style","scrollSize","complete","getBoundingClientRect","selected","triggerArray","isOpen","top","bottom","right","left","auto","basePlacements","start","end","clippingParents","viewport","popper","reference","variationPlacements","reduce","acc","placement","placements","beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite","modifierPhases","getNodeName","nodeName","getWindow","node","ownerDocument","defaultView","isHTMLElement","HTMLElement","isShadowRoot","applyStyles$1","enabled","phase","_ref","state","elements","forEach","styles","assign","effect","_ref2","initialStyles","position","options","strategy","margin","arrow","hasOwnProperty","attribute","requires","getBasePlacement","round","getUAString","uaData","userAgentData","brands","isArray","item","brand","version","userAgent","isLayoutViewport","includeScale","isFixedStrategy","clientRect","scaleX","scaleY","offsetWidth","width","height","visualViewport","addVisualOffsets","x","offsetLeft","y","offsetTop","getLayoutRect","rootNode","isSameNode","host","isTableElement","getDocumentElement","getParentNode","assignedSlot","getTrueOffsetParent","offsetParent","getOffsetParent","isFirefox","currentNode","css","transform","perspective","contain","willChange","getContainingBlock","getMainAxisFromPlacement","within","mathMax","mathMin","mergePaddingObject","paddingObject","expandToHashMap","hashMap","arrow$1","_state$modifiersData$","arrowElement","popperOffsets","modifiersData","basePlacement","axis","len","padding","rects","toPaddingObject","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","clientHeight","clientWidth","centerToReference","center","offset","axisProp","centerOffset","_options$element","requiresIfExists","getVariation","unsetSides","mapToStyles","_Object$assign2","popperRect","variation","offsets","gpuAcceleration","adaptive","roundOffsets","isFixed","_offsets$x","_offsets$y","_ref3","hasX","hasY","sideX","sideY","win","heightProp","widthProp","_Object$assign","commonStyles","_ref4","dpr","devicePixelRatio","roundOffsetsByDPR","computeStyles$1","_ref5","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","passive","eventListeners","_options$scroll","scroll","_options$resize","resize","scrollParents","scrollParent","update","hash","getOppositePlacement","matched","getOppositeVariationPlacement","getWindowScroll","scrollLeft","pageXOffset","scrollTop","pageYOffset","getWindowScrollBarX","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","getScrollParent","listScrollParents","_element$ownerDocumen","isBody","updatedList","rectToClientRect","rect","getClientRectFromMixedType","clippingParent","html","layoutViewport","getViewportRect","clientTop","clientLeft","getInnerBoundingClientRect","winScroll","scrollWidth","scrollHeight","getDocumentRect","computeOffsets","commonX","commonY","mainAxis","detectOverflow","_options","_options$placement","_options$strategy","_options$boundary","boundary","_options$rootBoundary","rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","clippingClientRect","mainClippingParents","clipperElement","getClippingParents","firstClippingParent","clippingRect","accRect","getClippingRect","contextElement","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","computeAutoPlacement","flipVariations","_options$allowedAutoP","allowedAutoPlacements","allPlacements","allowedPlacements","overflows","sort","a","b","flip$1","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","preferredPlacement","oppositePlacement","getExpandedFallbackPlacements","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","i","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","every","check","_loop","_i","fittingPlacement","reset","getSideOffsets","preventedOffsets","isAnySideFullyClipped","some","side","hide$1","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","offset$1","_options$offset","invertDistance","skidding","distance","distanceAndSkiddingToXY","_data$state$placement","popperOffsets$1","preventOverflow$1","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","tetherOffsetValue","normalizedTetherOffsetValue","offsetModifierState","_offsetModifierState$","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMax","preventedOffset","_offsetModifierState$2","_mainSide","_altSide","_offset","_len","_min","_max","isOriginSide","_offsetModifierValue","_tetherMin","_tetherMax","_preventedOffset","v","withinMaxClamp","getCompositeRect","elementOrVirtualElement","isOffsetParentAnElement","offsetParentIsScaled","isElementScaled","modifiers","visited","result","modifier","dep","depModifier","DEFAULT_OPTIONS","areValidElements","arguments","_key","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","pending","orderedModifiers","effectCleanupFns","isDestroyed","setOptions","setOptionsAction","cleanupModifierEffects","merged","orderModifiers","current","existing","m","_ref$options","cleanupFn","forceUpdate","_state$elements","_state$orderedModifie","_state$orderedModifie2","Promise","resolve","then","destroy","onFirstUpdate","createPopper","computeStyles","applyStyles","flip","ARROW_UP_KEY","ARROW_DOWN_KEY","EVENT_KEYDOWN_DATA_API","EVENT_KEYUP_DATA_API","SELECTOR_DATA_TOGGLE_SHOWN","SELECTOR_MENU","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","autoClose","display","popperConfig","Dropdown","_popper","_parent","_menu","_inNavbar","_detectNavbar","_createPopper","focus","_completeHide","Popper","referenceElement","_getPopperConfig","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","_selectMenuItem","clearMenus","openToggles","context","composedPath","isMenuTarget","dataApiKeydownHandler","isInput","isEscapeEvent","isUpOrDownEvent","getToggleButton","stopPropagation","EVENT_MOUSEDOWN","className","clickCallback","rootElement","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","EVENT_FOCUSIN","EVENT_KEYDOWN_TAB","TAB_NAV_BACKWARD","autofocus","trapElement","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","shiftKey","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","PROPERTY_PADDING","PROPERTY_MARGIN","ScrollBarHelper","getWidth","documentWidth","innerWidth","_disableOverFlow","_setElementAttributes","calculatedValue","_resetElementAttributes","isOverflowing","_saveInitialAttribute","styleProperty","scrollbarWidth","_applyManipulationCallback","setProperty","actualValue","removeProperty","callBack","sel","EVENT_HIDE_PREVENTED","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_MOUSEDOWN_DISMISS","EVENT_KEYDOWN_DISMISS","CLASS_NAME_OPEN","CLASS_NAME_STATIC","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_scrollBar","_adjustDialog","_showElement","_hideModal","handleUpdate","modalBody","transitionComplete","_triggerBackdropTransition","event2","_resetAdjustments","isModalOverflowing","initialOverflowY","isBodyOverflowing","paddingLeft","paddingRight","showEvent","alreadyOpen","CLASS_NAME_SHOWING","CLASS_NAME_HIDING","OPEN_SELECTOR","Offcanvas","blur","completeCallback","DefaultAllowlist","area","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","uriAttributes","SAFE_URL_PATTERN","allowedAttribute","allowedAttributeList","attributeName","nodeValue","attributeRegex","regex","allowList","content","extraClass","sanitize","sanitizeFn","template","DefaultContentType","entry","TemplateFactory","getContent","_resolvePossibleFunction","hasContent","changeContent","_checkContent","toHtml","templateWrapper","innerHTML","_maybeSanitize","text","_setContent","arg","templateElement","_putElementInTemplate","textContent","unsafeHtml","sanitizeFunction","createdDocument","DOMParser","parseFromString","elementName","attributeList","allowedAttributes","sanitizeHtml","DISALLOWED_ATTRIBUTES","CLASS_NAME_FADE","SELECTOR_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","animation","container","customClass","delay","title","Tooltip","_isEnabled","_timeout","_isHovered","_activeTrigger","_templateFactory","_newContent","tip","_setListeners","_fixTitle","enable","disable","toggleEnabled","click","_leave","_enter","_hideModalHandler","_disposePopper","_isWithContent","isInTheDom","_getTipElement","_isWithActiveTrigger","_getTitle","_createTipElement","_getContentForTemplate","_getTemplateFactory","tipId","prefix","floor","random","getElementById","getUID","setContent","_initializeOnDelegatedTarget","_getDelegateConfig","attachment","triggers","eventIn","eventOut","_setTimeout","timeout","dataAttributes","dataAttribute","Popover","_getContent","EVENT_ACTIVATE","EVENT_CLICK","SELECTOR_TARGET_LINKS","SELECTOR_NAV_LINKS","SELECTOR_LINK_ITEMS","rootMargin","smoothScroll","threshold","ScrollSpy","_targetLinks","_observableSections","_rootElement","_activeTarget","_observer","_previousScrollData","visibleEntryTop","parentScrollTop","refresh","_initializeTargetsAndObservables","_maybeEnableSmoothScroll","disconnect","_getNewObserver","section","observe","observableSection","scrollTo","behavior","IntersectionObserver","_observerCallback","targetElement","_process","userScrollsDown","isIntersecting","_clearActiveClass","entryIsLowerThanPrevious","targetLinks","anchor","decodeURI","_activateParents","listGroup","activeNodes","spy","ARROW_LEFT_KEY","ARROW_RIGHT_KEY","HOME_KEY","END_KEY","NOT_SELECTOR_DROPDOWN_TOGGLE","SELECTOR_INNER_ELEM","SELECTOR_DATA_TOGGLE_ACTIVE","Tab","_setInitialAttributes","_getChildren","innerElem","_elemIsActive","active","_getActiveElem","hideEvent","_deactivate","_activate","relatedElem","_toggleDropDown","nextActiveElement","preventScroll","_setAttributeIfNotExists","_setInitialAttributesOnChild","_getInnerElement","isActive","outerElem","_getOuterElement","_setInitialAttributesOnTargetPanel","open","EVENT_MOUSEOVER","EVENT_MOUSEOUT","EVENT_FOCUSOUT","CLASS_NAME_HIDE","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","isShown","_onInteraction","isInteracting"],"sources":["../../js/src/dom/data.js","../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/manipulator.js","../../js/src/util/config.js","../../js/src/base-component.js","../../js/src/dom/selector-engine.js","../../js/src/util/component-functions.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/util/swipe.js","../../js/src/carousel.js","../../js/src/collapse.js","../../node_modules/@popperjs/core/lib/enums.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindow.js","../../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","../../node_modules/@popperjs/core/lib/modifiers/applyStyles.js","../../node_modules/@popperjs/core/lib/utils/getBasePlacement.js","../../node_modules/@popperjs/core/lib/utils/math.js","../../node_modules/@popperjs/core/lib/utils/userAgent.js","../../node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","../../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","../../node_modules/@popperjs/core/lib/dom-utils/contains.js","../../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","../../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","../../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","../../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","../../node_modules/@popperjs/core/lib/utils/within.js","../../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","../../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","../../node_modules/@popperjs/core/lib/utils/expandToHashMap.js","../../node_modules/@popperjs/core/lib/modifiers/arrow.js","../../node_modules/@popperjs/core/lib/utils/getVariation.js","../../node_modules/@popperjs/core/lib/modifiers/computeStyles.js","../../node_modules/@popperjs/core/lib/modifiers/eventListeners.js","../../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","../../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","../../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","../../node_modules/@popperjs/core/lib/utils/rectToClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","../../node_modules/@popperjs/core/lib/utils/computeOffsets.js","../../node_modules/@popperjs/core/lib/utils/detectOverflow.js","../../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","../../node_modules/@popperjs/core/lib/modifiers/flip.js","../../node_modules/@popperjs/core/lib/modifiers/hide.js","../../node_modules/@popperjs/core/lib/modifiers/offset.js","../../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","../../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","../../node_modules/@popperjs/core/lib/utils/getAltAxis.js","../../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","../../node_modules/@popperjs/core/lib/utils/orderModifiers.js","../../node_modules/@popperjs/core/lib/createPopper.js","../../node_modules/@popperjs/core/lib/utils/debounce.js","../../node_modules/@popperjs/core/lib/utils/mergeByName.js","../../node_modules/@popperjs/core/lib/popper-lite.js","../../node_modules/@popperjs/core/lib/popper.js","../../js/src/dropdown.js","../../js/src/util/backdrop.js","../../js/src/util/focustrap.js","../../js/src/util/scrollbar.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/util/template-factory.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1_000_000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`)\n }\n\n return selector\n}\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`\n }\n\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false\n }\n\n if (typeof object.jquery !== 'undefined') {\n object = object[0]\n }\n\n return typeof object.nodeType !== 'undefined'\n}\n\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object\n }\n\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object))\n }\n\n return null\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])')\n\n if (!closedDetails) {\n return elementIsVisible\n }\n\n if (closedDetails !== element) {\n const summary = element.closest('summary')\n if (summary && summary.parentNode !== closedDetails) {\n return false\n }\n\n if (summary === null) {\n return false\n }\n }\n\n return elementIsVisible\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight // eslint-disable-line no-unused-expressions\n}\n\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback()\n }\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]\n }\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n defineJQueryPlugin,\n execute,\n executeAfterTransition,\n findShadowRoot,\n getElement,\n getjQuery,\n getNextActiveElement,\n getTransitionDurationFromElement,\n getUID,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n onDOMContentLoaded,\n parseSelector,\n reflow,\n triggerTransitionEnd,\n toType\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index.js'\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\n\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getElementEvents(element) {\n const uid = makeEventUid(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, { delegateTarget: element })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue\n }\n\n hydrateObj(event, { delegateTarget: target })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n}\n\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events)\n .find(event => event.callable === callable && event.delegationSelector === delegationSelector)\n}\n\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string'\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : (handler || delegationFunction)\n let typeEvent = getTypeEvent(originalTypeEvent)\n\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent\n }\n\n return [isDelegated, callable, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n callable = wrapFunction(callable)\n }\n\n const events = getElementEvents(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null)\n\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff\n\n return\n }\n\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = isDelegated ?\n bootstrapDelegationHandler(element, handler, callable) :\n bootstrapHandler(element, callable)\n\n fn.delegationSelector = isDelegated ? handler : null\n fn.callable = callable\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, isDelegated)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false)\n },\n\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getElementEvents(element)\n const storeElementEvent = events[typeEvent] || {}\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return\n }\n\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null)\n return\n }\n\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n }\n }\n\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n\n let jQueryEvent = null\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n const evt = hydrateObj(new Event(event, { bubbles, cancelable: true }), args)\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value\n } catch {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value\n }\n })\n }\n }\n\n return obj\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true\n }\n\n if (value === 'false') {\n return false\n }\n\n if (value === Number(value).toString()) {\n return Number(value)\n }\n\n if (value === '' || value === 'null') {\n return null\n }\n\n if (typeof value !== 'string') {\n return value\n }\n\n try {\n return JSON.parse(decodeURIComponent(value))\n } catch {\n return value\n }\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'))\n\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)\n attributes[pureKey] = normalizeData(element.dataset[key])\n }\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport { isElement, toType } from './index.js'\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {}\n }\n\n static get DefaultType() {\n return {}\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n return config\n }\n\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {} // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n }\n }\n\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property]\n const valueType = isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n }\n }\n}\n\nexport default Config\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data.js'\nimport EventHandler from './dom/event-handler.js'\nimport Config from './util/config.js'\nimport { executeAfterTransition, getElement } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.1'\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super()\n\n element = getElement(element)\n if (!element) {\n return\n }\n\n this._element = element\n this._config = this._getConfig(config)\n\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null\n }\n }\n\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible, parseSelector } from '../util/index.js'\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`\n }\n\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null\n }\n\n return parseSelector(selector)\n}\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n let ancestor = element.parentNode.closest(selector)\n\n while (ancestor) {\n parents.push(ancestor)\n ancestor = ancestor.parentNode.closest(selector)\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n },\n\n getSelectorFromElement(element) {\n const selector = getSelector(element)\n\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null\n }\n\n return null\n },\n\n getElementFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.findOne(selector) : null\n },\n\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.find(selector) : []\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isDisabled } from './index.js'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'swipe'\nconst EVENT_KEY = '.bs.swipe'\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n}\n\nconst DefaultType = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n}\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super()\n this._element = element\n\n if (!element || !Swipe.isSupported()) {\n return\n }\n\n this._config = this._getConfig(config)\n this._deltaX = 0\n this._supportPointerEvents = Boolean(window.PointerEvent)\n this._initEvents()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY)\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX\n\n return\n }\n\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX\n }\n }\n\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX\n }\n\n this._handleSwipe()\n execute(this._config.endCallback)\n }\n\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this._deltaX\n }\n\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX)\n\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltaX / this._deltaX\n\n this._deltaX = 0\n\n if (!direction) {\n return\n }\n\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback)\n }\n\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event))\n }\n }\n\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n }\n}\n\nexport default Swipe\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getNextActiveElement,\n isRTL,\n isVisible,\n reflow,\n triggerTransitionEnd\n} from './util/index.js'\nimport Swipe from './util/swipe.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)', // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._interval = null\n this._activeElement = null\n this._isSliding = false\n this.touchTimeout = null\n this._swipeHelper = null\n\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._addEventListeners()\n\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element)\n }\n\n this._clearInterval()\n }\n\n cycle() {\n this._clearInterval()\n this._updateInterval()\n\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval)\n }\n\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle())\n return\n }\n\n this.cycle()\n }\n\n to(index) {\n const items = this._getItems()\n if (index > items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n const activeIndex = this._getItemIndex(this._getActive())\n if (activeIndex === index) {\n return\n }\n\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV\n\n this._slide(order, items[index])\n }\n\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose()\n }\n\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval\n return config\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, () => this.pause())\n EventHandler.on(this._element, EVENT_MOUSELEAVE, () => this._maybeEnableCycle())\n }\n\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault())\n }\n\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n }\n\n this._swipeHelper = new Swipe(this._element, swipeConfig)\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(this._directionToOrder(direction))\n }\n }\n\n _getItemIndex(element) {\n return this._getItems().indexOf(element)\n }\n\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return\n }\n\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement)\n\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE)\n newActiveIndicator.setAttribute('aria-current', 'true')\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || this._getActive()\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n this._config.interval = elementInterval || this._config.defaultInterval\n }\n\n _slide(order, element = null) {\n if (this._isSliding) {\n return\n }\n\n const activeElement = this._getActive()\n const isNext = order === ORDER_NEXT\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap)\n\n if (nextElement === activeElement) {\n return\n }\n\n const nextElementIndex = this._getItemIndex(nextElement)\n\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n })\n }\n\n const slideEvent = triggerEvent(EVENT_SLIDE)\n\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return\n }\n\n const isCycling = Boolean(this._interval)\n this.pause()\n\n this._isSliding = true\n\n this._setActiveIndicatorElement(nextElementIndex)\n this._activeElement = nextElement\n\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n triggerEvent(EVENT_SLID)\n }\n\n this._queueCallback(completeCallBack, activeElement, this._isAnimated())\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE)\n }\n\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n }\n\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element)\n }\n\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n }\n\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config)\n\n if (typeof config === 'number') {\n data.to(config)\n return\n }\n\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n event.preventDefault()\n\n const carousel = Carousel.getOrCreateInstance(target)\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n carousel.to(slideIndex)\n carousel._maybeEnableCycle()\n return\n }\n\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next()\n carousel._maybeEnableCycle()\n return\n }\n\n carousel.prev()\n carousel._maybeEnableCycle()\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getElement,\n reflow\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\nconst Default = {\n parent: null,\n toggle: true\n}\n\nconst DefaultType = {\n parent: '(null|element)',\n toggle: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isTransitioning = false\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElement => foundElement === this._element)\n\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let activeChildren = []\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES)\n .filter(element => element !== this._element)\n .map(element => Collapse.getOrCreateInstance(element, { toggle: false }))\n }\n\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n for (const activeInstance of activeChildren) {\n activeInstance.hide()\n }\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger)\n\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE)\n\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n }\n }\n\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element))\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen)\n element.setAttribute('aria-expanded', isOpen)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n execute,\n getElement,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center'\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)'\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR = '.navbar'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\nconst PLACEMENT_TOPCENTER = 'top'\nconst PLACEMENT_BOTTOMCENTER = 'bottom'\n\nconst Default = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n}\n\nconst DefaultType = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n}\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._popper = null\n this._parent = this._element.parentNode // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.prev(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.findOne(SELECTOR_MENU, this._parent)\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._createPopper()\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = super._getConfig(config)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = this._parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n }\n\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getPlacement() {\n const parentDropdown = this._parent\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static') // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element))\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) {\n return\n }\n\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN)\n\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle)\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n const relatedTarget = { relatedTarget: context._element }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName)\n const isEscapeEvent = event.key === ESCAPE_KEY\n const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)\n\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return\n }\n\n if (isInput && !isEscapeEvent) {\n return\n }\n\n event.preventDefault()\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ?\n this :\n (SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode))\n\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (isUpOrDownEvent) {\n event.stopPropagation()\n instance.show()\n instance._selectMenuItem(event)\n return\n }\n\n if (instance._isShown()) { // else is escape and we check if it is shown\n event.stopPropagation()\n instance.hide()\n getToggleButton.focus()\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute, executeAfterTransition, getElement, reflow } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nconst Default = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n}\n\nconst DefaultType = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n}\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n const element = this._getElement()\n if (this._config.isAnimated) {\n reflow(element)\n }\n\n element.classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n const element = this._getElement()\n this._config.rootElement.append(element)\n\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nconst Default = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n}\n\nconst DefaultType = {\n autofocus: 'boolean',\n trapElement: 'element'\n}\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return\n }\n\n if (this._config.autofocus) {\n this._config.trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n _handleFocusin(event) {\n const { trapElement } = this._config\n\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n}\n\nexport default FocusTrap\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\nconst PROPERTY_PADDING = 'padding-right'\nconst PROPERTY_MARGIN = 'margin-right'\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN)\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProperty)\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty)\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty)\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty)\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty)\n return\n }\n\n Manipulator.removeDataAttribute(element, styleProperty)\n element.style.setProperty(styleProperty, value)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n return\n }\n\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel)\n }\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport { defineJQueryPlugin, isRTL, isVisible, reflow } from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\nconst Default = {\n backdrop: true,\n focus: true,\n keyboard: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._isTransitioning = true\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._backdrop.show(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n this._isTransitioning = true\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated())\n }\n\n dispose() {\n EventHandler.off(window, EVENT_KEY)\n EventHandler.off(this._dialog, EVENT_KEY)\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated())\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n this._triggerBackdropTransition()\n })\n\n EventHandler.on(window, EVENT_RESIZE, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog()\n }\n })\n\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return\n }\n\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n return\n }\n\n if (this._config.backdrop) {\n this.hide()\n }\n })\n })\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const initialOverflowY = this._element.style.overflowY\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden'\n }\n\n this._element.classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY\n }, this._dialog)\n }, this._dialog)\n\n this._element.focus()\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide()\n }\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin,\n isDisabled,\n isVisible\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\nconst CLASS_NAME_HIDING = 'hiding'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOWING)\n\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate()\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.add(CLASS_NAME_HIDING)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n return\n }\n\n this.hide()\n }\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop)\n\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n })\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show()\n }\n})\n\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide()\n }\n }\n})\n\nenableDismissTrigger(Offcanvas)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n// js-docs-end allow-list\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\n// eslint-disable-next-line unicorn/better-regex\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n .some(regex => regex.test(attributeName))\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n }\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\nimport { DefaultAllowlist, sanitizeHtml } from './sanitizer.js'\nimport { execute, getElement, isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'TemplateFactory'\n\nconst Default = {\n allowList: DefaultAllowlist,\n content: {}, // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '
'\n}\n\nconst DefaultType = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n}\n\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n}\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content)\n .map(config => this._resolvePossibleFunction(config))\n .filter(Boolean)\n }\n\n hasContent() {\n return this.getContent().length > 0\n }\n\n changeContent(content) {\n this._checkContent(content)\n this._config.content = { ...this._config.content, ...content }\n return this\n }\n\n toHtml() {\n const templateWrapper = document.createElement('div')\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template)\n\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector)\n }\n\n const template = templateWrapper.children[0]\n const extraClass = this._resolvePossibleFunction(this._config.extraClass)\n\n if (extraClass) {\n template.classList.add(...extraClass.split(' '))\n }\n\n return template\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config)\n this._checkContent(config.content)\n }\n\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({ selector, entry: content }, DefaultContentType)\n }\n }\n\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!templateElement) {\n return\n }\n\n content = this._resolvePossibleFunction(content)\n\n if (!content) {\n templateElement.remove()\n return\n }\n\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement)\n return\n }\n\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content)\n return\n }\n\n templateElement.textContent = content\n }\n\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this])\n }\n\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = ''\n templateElement.append(element)\n return\n }\n\n templateElement.textContent = element.textContent\n }\n}\n\nexport default TemplateFactory\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport { defineJQueryPlugin, execute, findShadowRoot, getElement, getUID, isRTL, noop } from './util/index.js'\nimport { DefaultAllowlist } from './util/sanitizer.js'\nimport TemplateFactory from './util/template-factory.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\nconst EVENT_HIDE = 'hide'\nconst EVENT_HIDDEN = 'hidden'\nconst EVENT_SHOW = 'show'\nconst EVENT_SHOWN = 'shown'\nconst EVENT_INSERTED = 'inserted'\nconst EVENT_CLICK = 'click'\nconst EVENT_FOCUSIN = 'focusin'\nconst EVENT_FOCUSOUT = 'focusout'\nconst EVENT_MOUSEENTER = 'mouseenter'\nconst EVENT_MOUSELEAVE = 'mouseleave'\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '
' +\n '
' +\n '
' +\n '
',\n title: '',\n trigger: 'hover focus'\n}\n\nconst DefaultType = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n}\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)')\n }\n\n super(element, config)\n\n // Private\n this._isEnabled = true\n this._timeout = 0\n this._isHovered = null\n this._activeTrigger = {}\n this._popper = null\n this._templateFactory = null\n this._newContent = null\n\n // Protected\n this.tip = null\n\n this._setListeners()\n\n if (!this._config.selector) {\n this._fixTitle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle() {\n if (!this._isEnabled) {\n return\n }\n\n this._activeTrigger.click = !this._activeTrigger.click\n if (this._isShown()) {\n this._leave()\n return\n }\n\n this._enter()\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'))\n }\n\n this._disposePopper()\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this._isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW))\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper()\n\n const tip = this._getTipElement()\n\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'))\n\n const { container } = this._config\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED))\n }\n\n this._popper = this._createPopper(tip)\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN))\n\n if (this._isHovered === false) {\n this._leave()\n }\n\n this._isHovered = false\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n hide() {\n if (!this._isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE))\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const tip = this._getTipElement()\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n this._isHovered = null // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (!this._isHovered) {\n this._disposePopper()\n }\n\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN))\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n update() {\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle())\n }\n\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate())\n }\n\n return this.tip\n }\n\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml()\n\n // TODO: remove this check in v6\n if (!tip) {\n return null\n }\n\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`)\n\n const tipId = getUID(this.constructor.NAME).toString()\n\n tip.setAttribute('id', tipId)\n\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n return tip\n }\n\n setContent(content) {\n this._newContent = content\n if (this._isShown()) {\n this._disposePopper()\n this.show()\n }\n }\n\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content)\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n })\n }\n\n return this._templateFactory\n }\n\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n }\n }\n\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title')\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _isAnimated() {\n return this._config.animation || (this.tip && this.tip.classList.contains(CLASS_NAME_FADE))\n }\n\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW)\n }\n\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element])\n const attachment = AttachmentMap[placement.toUpperCase()]\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element])\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement)\n }\n }\n ]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n }\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context.toggle()\n })\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSEENTER) :\n this.constructor.eventName(EVENT_FOCUSIN)\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSELEAVE) :\n this.constructor.eventName(EVENT_FOCUSOUT)\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true\n context._enter()\n })\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] =\n context._element.contains(event.relatedTarget)\n\n context._leave()\n })\n }\n }\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n\n if (!title) {\n return\n }\n\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('data-bs-original-title', title) // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title')\n }\n\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true\n return\n }\n\n this._isHovered = true\n\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show()\n }\n }, this._config.delay.show)\n }\n\n _leave() {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n this._isHovered = false\n\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide()\n }\n }, this._config.delay.hide)\n }\n\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout)\n this._timeout = setTimeout(handler, timeout)\n }\n\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true)\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute]\n }\n }\n\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value\n }\n }\n\n config.selector = false\n config.trigger = 'manual'\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n\n if (this.tip) {\n this.tip.remove()\n this.tip = null\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Tooltip from './tooltip.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'popover'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Default = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '
' +\n '
' +\n '

' +\n '
' +\n '
',\n trigger: 'click'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n}\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent()\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n }\n }\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport { defineJQueryPlugin, getElement, isDisabled, isVisible } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_TARGET_LINKS = '[href]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst Default = {\n offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n}\n\nconst DefaultType = {\n offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n}\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map()\n this._observableSections = new Map()\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element\n this._activeTarget = null\n this._observer = null\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n }\n this.refresh() // initialize\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables()\n this._maybeEnableSmoothScroll()\n\n if (this._observer) {\n this._observer.disconnect()\n } else {\n this._observer = this._getNewObserver()\n }\n\n for (const section of this._observableSections.values()) {\n this._observer.observe(section)\n }\n }\n\n dispose() {\n this._observer.disconnect()\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin\n\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value))\n }\n\n return config\n }\n\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK)\n\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash)\n if (observableSection) {\n event.preventDefault()\n const root = this._rootElement || window\n const height = observableSection.offsetTop - this._element.offsetTop\n if (root.scrollTo) {\n root.scrollTo({ top: height, behavior: 'smooth' })\n return\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height\n }\n })\n }\n\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n }\n\n return new IntersectionObserver(entries => this._observerCallback(entries), options)\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`)\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop\n this._process(targetElement(entry))\n }\n\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop\n this._previousScrollData.parentScrollTop = parentScrollTop\n\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null\n this._clearActiveClass(targetElement(entry))\n\n continue\n }\n\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry)\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return\n }\n\n continue\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry)\n }\n }\n }\n\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map()\n this._observableSections = new Map()\n\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target)\n\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue\n }\n\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element)\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor)\n this._observableSections.set(anchor.hash, observableSection)\n }\n }\n }\n\n _process(target) {\n if (this._activeTarget === target) {\n return\n }\n\n this._clearActiveClass(this._config.target)\n this._activeTarget = target\n target.classList.add(CLASS_NAME_ACTIVE)\n this._activateParents(target)\n\n EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target })\n }\n\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n return\n }\n\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both
    and
')},createChildNavList:function(e){var t=this.createNavList();return e.append(t),t},generateNavEl:function(e,t){var n=a('
');n.attr("href","#"+e),n.text(t);var r=a("
  • ");return r.append(n),r},generateNavItem:function(e){var t=this.generateAnchor(e),n=a(e),r=n.data("toc-text")||n.text();return this.generateNavEl(t,r)},getTopLevel:function(e){for(var t=1;t<=6;t++){if(1 + + + + + + + + + + + + + + diff --git a/docs/deps/font-awesome-6.5.2/css/all.css b/docs/deps/font-awesome-6.5.2/css/all.css new file mode 100644 index 0000000..151dd57 --- /dev/null +++ b/docs/deps/font-awesome-6.5.2/css/all.css @@ -0,0 +1,8028 @@ +/*! + * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +.fa { + font-family: var(--fa-style-family, "Font Awesome 6 Free"); + font-weight: var(--fa-style, 900); } + +.fa, +.fa-classic, +.fa-sharp, +.fas, +.fa-solid, +.far, +.fa-regular, +.fab, +.fa-brands { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: var(--fa-display, inline-block); + font-style: normal; + font-variant: normal; + line-height: 1; + text-rendering: auto; } + +.fas, +.fa-classic, +.fa-solid, +.far, +.fa-regular { + font-family: 'Font Awesome 6 Free'; } + +.fab, +.fa-brands { + font-family: 'Font Awesome 6 Brands'; } + +.fa-1x { + font-size: 1em; } + +.fa-2x { + font-size: 2em; } + +.fa-3x { + font-size: 3em; } + +.fa-4x { + font-size: 4em; } + +.fa-5x { + font-size: 5em; } + +.fa-6x { + font-size: 6em; } + +.fa-7x { + font-size: 7em; } + +.fa-8x { + font-size: 8em; } + +.fa-9x { + font-size: 9em; } + +.fa-10x { + font-size: 10em; } + +.fa-2xs { + font-size: 0.625em; + line-height: 0.1em; + vertical-align: 0.225em; } + +.fa-xs { + font-size: 0.75em; + line-height: 0.08333em; + vertical-align: 0.125em; } + +.fa-sm { + font-size: 0.875em; + line-height: 0.07143em; + vertical-align: 0.05357em; } + +.fa-lg { + font-size: 1.25em; + line-height: 0.05em; + vertical-align: -0.075em; } + +.fa-xl { + font-size: 1.5em; + line-height: 0.04167em; + vertical-align: -0.125em; } + +.fa-2xl { + font-size: 2em; + line-height: 0.03125em; + vertical-align: -0.1875em; } + +.fa-fw { + text-align: center; + width: 1.25em; } + +.fa-ul { + list-style-type: none; + margin-left: var(--fa-li-margin, 2.5em); + padding-left: 0; } + .fa-ul > li { + position: relative; } + +.fa-li { + left: calc(var(--fa-li-width, 2em) * -1); + position: absolute; + text-align: center; + width: var(--fa-li-width, 2em); + line-height: inherit; } + +.fa-border { + border-color: var(--fa-border-color, #eee); + border-radius: var(--fa-border-radius, 0.1em); + border-style: var(--fa-border-style, solid); + border-width: var(--fa-border-width, 0.08em); + padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); } + +.fa-pull-left { + float: left; + margin-right: var(--fa-pull-margin, 0.3em); } + +.fa-pull-right { + float: right; + margin-left: var(--fa-pull-margin, 0.3em); } + +.fa-beat { + -webkit-animation-name: fa-beat; + animation-name: fa-beat; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out); + animation-timing-function: var(--fa-animation-timing, ease-in-out); } + +.fa-bounce { + -webkit-animation-name: fa-bounce; + animation-name: fa-bounce; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); } + +.fa-fade { + -webkit-animation-name: fa-fade; + animation-name: fa-fade; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); } + +.fa-beat-fade { + -webkit-animation-name: fa-beat-fade; + animation-name: fa-beat-fade; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); } + +.fa-flip { + -webkit-animation-name: fa-flip; + animation-name: fa-flip; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out); + animation-timing-function: var(--fa-animation-timing, ease-in-out); } + +.fa-shake { + -webkit-animation-name: fa-shake; + animation-name: fa-shake; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, linear); + animation-timing-function: var(--fa-animation-timing, linear); } + +.fa-spin { + -webkit-animation-name: fa-spin; + animation-name: fa-spin; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 2s); + animation-duration: var(--fa-animation-duration, 2s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, linear); + animation-timing-function: var(--fa-animation-timing, linear); } + +.fa-spin-reverse { + --fa-animation-direction: reverse; } + +.fa-pulse, +.fa-spin-pulse { + -webkit-animation-name: fa-spin; + animation-name: fa-spin; + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, steps(8)); + animation-timing-function: var(--fa-animation-timing, steps(8)); } + +@media (prefers-reduced-motion: reduce) { + .fa-beat, + .fa-bounce, + .fa-fade, + .fa-beat-fade, + .fa-flip, + .fa-pulse, + .fa-shake, + .fa-spin, + .fa-spin-pulse { + -webkit-animation-delay: -1ms; + animation-delay: -1ms; + -webkit-animation-duration: 1ms; + animation-duration: 1ms; + -webkit-animation-iteration-count: 1; + animation-iteration-count: 1; + -webkit-transition-delay: 0s; + transition-delay: 0s; + -webkit-transition-duration: 0s; + transition-duration: 0s; } } + +@-webkit-keyframes fa-beat { + 0%, 90% { + -webkit-transform: scale(1); + transform: scale(1); } + 45% { + -webkit-transform: scale(var(--fa-beat-scale, 1.25)); + transform: scale(var(--fa-beat-scale, 1.25)); } } + +@keyframes fa-beat { + 0%, 90% { + -webkit-transform: scale(1); + transform: scale(1); } + 45% { + -webkit-transform: scale(var(--fa-beat-scale, 1.25)); + transform: scale(var(--fa-beat-scale, 1.25)); } } + +@-webkit-keyframes fa-bounce { + 0% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } + 10% { + -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); + transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); } + 30% { + -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); + transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); } + 50% { + -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); + transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); } + 57% { + -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); + transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); } + 64% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } + 100% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } } + +@keyframes fa-bounce { + 0% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } + 10% { + -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); + transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); } + 30% { + -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); + transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); } + 50% { + -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); + transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); } + 57% { + -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); + transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); } + 64% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } + 100% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } } + +@-webkit-keyframes fa-fade { + 50% { + opacity: var(--fa-fade-opacity, 0.4); } } + +@keyframes fa-fade { + 50% { + opacity: var(--fa-fade-opacity, 0.4); } } + +@-webkit-keyframes fa-beat-fade { + 0%, 100% { + opacity: var(--fa-beat-fade-opacity, 0.4); + -webkit-transform: scale(1); + transform: scale(1); } + 50% { + opacity: 1; + -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125)); + transform: scale(var(--fa-beat-fade-scale, 1.125)); } } + +@keyframes fa-beat-fade { + 0%, 100% { + opacity: var(--fa-beat-fade-opacity, 0.4); + -webkit-transform: scale(1); + transform: scale(1); } + 50% { + opacity: 1; + -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125)); + transform: scale(var(--fa-beat-fade-scale, 1.125)); } } + +@-webkit-keyframes fa-flip { + 50% { + -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); + transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } } + +@keyframes fa-flip { + 50% { + -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); + transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } } + +@-webkit-keyframes fa-shake { + 0% { + -webkit-transform: rotate(-15deg); + transform: rotate(-15deg); } + 4% { + -webkit-transform: rotate(15deg); + transform: rotate(15deg); } + 8%, 24% { + -webkit-transform: rotate(-18deg); + transform: rotate(-18deg); } + 12%, 28% { + -webkit-transform: rotate(18deg); + transform: rotate(18deg); } + 16% { + -webkit-transform: rotate(-22deg); + transform: rotate(-22deg); } + 20% { + -webkit-transform: rotate(22deg); + transform: rotate(22deg); } + 32% { + -webkit-transform: rotate(-12deg); + transform: rotate(-12deg); } + 36% { + -webkit-transform: rotate(12deg); + transform: rotate(12deg); } + 40%, 100% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } } + +@keyframes fa-shake { + 0% { + -webkit-transform: rotate(-15deg); + transform: rotate(-15deg); } + 4% { + -webkit-transform: rotate(15deg); + transform: rotate(15deg); } + 8%, 24% { + -webkit-transform: rotate(-18deg); + transform: rotate(-18deg); } + 12%, 28% { + -webkit-transform: rotate(18deg); + transform: rotate(18deg); } + 16% { + -webkit-transform: rotate(-22deg); + transform: rotate(-22deg); } + 20% { + -webkit-transform: rotate(22deg); + transform: rotate(22deg); } + 32% { + -webkit-transform: rotate(-12deg); + transform: rotate(-12deg); } + 36% { + -webkit-transform: rotate(12deg); + transform: rotate(12deg); } + 40%, 100% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } } + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +.fa-rotate-90 { + -webkit-transform: rotate(90deg); + transform: rotate(90deg); } + +.fa-rotate-180 { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); } + +.fa-rotate-270 { + -webkit-transform: rotate(270deg); + transform: rotate(270deg); } + +.fa-flip-horizontal { + -webkit-transform: scale(-1, 1); + transform: scale(-1, 1); } + +.fa-flip-vertical { + -webkit-transform: scale(1, -1); + transform: scale(1, -1); } + +.fa-flip-both, +.fa-flip-horizontal.fa-flip-vertical { + -webkit-transform: scale(-1, -1); + transform: scale(-1, -1); } + +.fa-rotate-by { + -webkit-transform: rotate(var(--fa-rotate-angle, 0)); + transform: rotate(var(--fa-rotate-angle, 0)); } + +.fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2.5em; } + +.fa-stack-1x, +.fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100%; + z-index: var(--fa-stack-z-index, auto); } + +.fa-stack-1x { + line-height: inherit; } + +.fa-stack-2x { + font-size: 2em; } + +.fa-inverse { + color: var(--fa-inverse, #fff); } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen +readers do not read off random characters that represent icons */ + +.fa-0::before { + content: "\30"; } + +.fa-1::before { + content: "\31"; } + +.fa-2::before { + content: "\32"; } + +.fa-3::before { + content: "\33"; } + +.fa-4::before { + content: "\34"; } + +.fa-5::before { + content: "\35"; } + +.fa-6::before { + content: "\36"; } + +.fa-7::before { + content: "\37"; } + +.fa-8::before { + content: "\38"; } + +.fa-9::before { + content: "\39"; } + +.fa-fill-drip::before { + content: "\f576"; } + +.fa-arrows-to-circle::before { + content: "\e4bd"; } + +.fa-circle-chevron-right::before { + content: "\f138"; } + +.fa-chevron-circle-right::before { + content: "\f138"; } + +.fa-at::before { + content: "\40"; } + +.fa-trash-can::before { + content: "\f2ed"; } + +.fa-trash-alt::before { + content: "\f2ed"; } + +.fa-text-height::before { + content: "\f034"; } + +.fa-user-xmark::before { + content: "\f235"; } + +.fa-user-times::before { + content: "\f235"; } + +.fa-stethoscope::before { + content: "\f0f1"; } + +.fa-message::before { + content: "\f27a"; } + +.fa-comment-alt::before { + content: "\f27a"; } + +.fa-info::before { + content: "\f129"; } + +.fa-down-left-and-up-right-to-center::before { + content: "\f422"; } + +.fa-compress-alt::before { + content: "\f422"; } + +.fa-explosion::before { + content: "\e4e9"; } + +.fa-file-lines::before { + content: "\f15c"; } + +.fa-file-alt::before { + content: "\f15c"; } + +.fa-file-text::before { + content: "\f15c"; } + +.fa-wave-square::before { + content: "\f83e"; } + +.fa-ring::before { + content: "\f70b"; } + +.fa-building-un::before { + content: "\e4d9"; } + +.fa-dice-three::before { + content: "\f527"; } + +.fa-calendar-days::before { + content: "\f073"; } + +.fa-calendar-alt::before { + content: "\f073"; } + +.fa-anchor-circle-check::before { + content: "\e4aa"; } + +.fa-building-circle-arrow-right::before { + content: "\e4d1"; } + +.fa-volleyball::before { + content: "\f45f"; } + +.fa-volleyball-ball::before { + content: "\f45f"; } + +.fa-arrows-up-to-line::before { + content: "\e4c2"; } + +.fa-sort-down::before { + content: "\f0dd"; } + +.fa-sort-desc::before { + content: "\f0dd"; } + +.fa-circle-minus::before { + content: "\f056"; } + +.fa-minus-circle::before { + content: "\f056"; } + +.fa-door-open::before { + content: "\f52b"; } + +.fa-right-from-bracket::before { + content: "\f2f5"; } + +.fa-sign-out-alt::before { + content: "\f2f5"; } + +.fa-atom::before { + content: "\f5d2"; } + +.fa-soap::before { + content: "\e06e"; } + +.fa-icons::before { + content: "\f86d"; } + +.fa-heart-music-camera-bolt::before { + content: "\f86d"; } + +.fa-microphone-lines-slash::before { + content: "\f539"; } + +.fa-microphone-alt-slash::before { + content: "\f539"; } + +.fa-bridge-circle-check::before { + content: "\e4c9"; } + +.fa-pump-medical::before { + content: "\e06a"; } + +.fa-fingerprint::before { + content: "\f577"; } + +.fa-hand-point-right::before { + content: "\f0a4"; } + +.fa-magnifying-glass-location::before { + content: "\f689"; } + +.fa-search-location::before { + content: "\f689"; } + +.fa-forward-step::before { + content: "\f051"; } + +.fa-step-forward::before { + content: "\f051"; } + +.fa-face-smile-beam::before { + content: "\f5b8"; } + +.fa-smile-beam::before { + content: "\f5b8"; } + +.fa-flag-checkered::before { + content: "\f11e"; } + +.fa-football::before { + content: "\f44e"; } + +.fa-football-ball::before { + content: "\f44e"; } + +.fa-school-circle-exclamation::before { + content: "\e56c"; } + +.fa-crop::before { + content: "\f125"; } + +.fa-angles-down::before { + content: "\f103"; } + +.fa-angle-double-down::before { + content: "\f103"; } + +.fa-users-rectangle::before { + content: "\e594"; } + +.fa-people-roof::before { + content: "\e537"; } + +.fa-people-line::before { + content: "\e534"; } + +.fa-beer-mug-empty::before { + content: "\f0fc"; } + +.fa-beer::before { + content: "\f0fc"; } + +.fa-diagram-predecessor::before { + content: "\e477"; } + +.fa-arrow-up-long::before { + content: "\f176"; } + +.fa-long-arrow-up::before { + content: "\f176"; } + +.fa-fire-flame-simple::before { + content: "\f46a"; } + +.fa-burn::before { + content: "\f46a"; } + +.fa-person::before { + content: "\f183"; } + +.fa-male::before { + content: "\f183"; } + +.fa-laptop::before { + content: "\f109"; } + +.fa-file-csv::before { + content: "\f6dd"; } + +.fa-menorah::before { + content: "\f676"; } + +.fa-truck-plane::before { + content: "\e58f"; } + +.fa-record-vinyl::before { + content: "\f8d9"; } + +.fa-face-grin-stars::before { + content: "\f587"; } + +.fa-grin-stars::before { + content: "\f587"; } + +.fa-bong::before { + content: "\f55c"; } + +.fa-spaghetti-monster-flying::before { + content: "\f67b"; } + +.fa-pastafarianism::before { + content: "\f67b"; } + +.fa-arrow-down-up-across-line::before { + content: "\e4af"; } + +.fa-spoon::before { + content: "\f2e5"; } + +.fa-utensil-spoon::before { + content: "\f2e5"; } + +.fa-jar-wheat::before { + content: "\e517"; } + +.fa-envelopes-bulk::before { + content: "\f674"; } + +.fa-mail-bulk::before { + content: "\f674"; } + +.fa-file-circle-exclamation::before { + content: "\e4eb"; } + +.fa-circle-h::before { + content: "\f47e"; } + +.fa-hospital-symbol::before { + content: "\f47e"; } + +.fa-pager::before { + content: "\f815"; } + +.fa-address-book::before { + content: "\f2b9"; } + +.fa-contact-book::before { + content: "\f2b9"; } + +.fa-strikethrough::before { + content: "\f0cc"; } + +.fa-k::before { + content: "\4b"; } + +.fa-landmark-flag::before { + content: "\e51c"; } + +.fa-pencil::before { + content: "\f303"; } + +.fa-pencil-alt::before { + content: "\f303"; } + +.fa-backward::before { + content: "\f04a"; } + +.fa-caret-right::before { + content: "\f0da"; } + +.fa-comments::before { + content: "\f086"; } + +.fa-paste::before { + content: "\f0ea"; } + +.fa-file-clipboard::before { + content: "\f0ea"; } + +.fa-code-pull-request::before { + content: "\e13c"; } + +.fa-clipboard-list::before { + content: "\f46d"; } + +.fa-truck-ramp-box::before { + content: "\f4de"; } + +.fa-truck-loading::before { + content: "\f4de"; } + +.fa-user-check::before { + content: "\f4fc"; } + +.fa-vial-virus::before { + content: "\e597"; } + +.fa-sheet-plastic::before { + content: "\e571"; } + +.fa-blog::before { + content: "\f781"; } + +.fa-user-ninja::before { + content: "\f504"; } + +.fa-person-arrow-up-from-line::before { + content: "\e539"; } + +.fa-scroll-torah::before { + content: "\f6a0"; } + +.fa-torah::before { + content: "\f6a0"; } + +.fa-broom-ball::before { + content: "\f458"; } + +.fa-quidditch::before { + content: "\f458"; } + +.fa-quidditch-broom-ball::before { + content: "\f458"; } + +.fa-toggle-off::before { + content: "\f204"; } + +.fa-box-archive::before { + content: "\f187"; } + +.fa-archive::before { + content: "\f187"; } + +.fa-person-drowning::before { + content: "\e545"; } + +.fa-arrow-down-9-1::before { + content: "\f886"; } + +.fa-sort-numeric-desc::before { + content: "\f886"; } + +.fa-sort-numeric-down-alt::before { + content: "\f886"; } + +.fa-face-grin-tongue-squint::before { + content: "\f58a"; } + +.fa-grin-tongue-squint::before { + content: "\f58a"; } + +.fa-spray-can::before { + content: "\f5bd"; } + +.fa-truck-monster::before { + content: "\f63b"; } + +.fa-w::before { + content: "\57"; } + +.fa-earth-africa::before { + content: "\f57c"; } + +.fa-globe-africa::before { + content: "\f57c"; } + +.fa-rainbow::before { + content: "\f75b"; } + +.fa-circle-notch::before { + content: "\f1ce"; } + +.fa-tablet-screen-button::before { + content: "\f3fa"; } + +.fa-tablet-alt::before { + content: "\f3fa"; } + +.fa-paw::before { + content: "\f1b0"; } + +.fa-cloud::before { + content: "\f0c2"; } + +.fa-trowel-bricks::before { + content: "\e58a"; } + +.fa-face-flushed::before { + content: "\f579"; } + +.fa-flushed::before { + content: "\f579"; } + +.fa-hospital-user::before { + content: "\f80d"; } + +.fa-tent-arrow-left-right::before { + content: "\e57f"; } + +.fa-gavel::before { + content: "\f0e3"; } + +.fa-legal::before { + content: "\f0e3"; } + +.fa-binoculars::before { + content: "\f1e5"; } + +.fa-microphone-slash::before { + content: "\f131"; } + +.fa-box-tissue::before { + content: "\e05b"; } + +.fa-motorcycle::before { + content: "\f21c"; } + +.fa-bell-concierge::before { + content: "\f562"; } + +.fa-concierge-bell::before { + content: "\f562"; } + +.fa-pen-ruler::before { + content: "\f5ae"; } + +.fa-pencil-ruler::before { + content: "\f5ae"; } + +.fa-people-arrows::before { + content: "\e068"; } + +.fa-people-arrows-left-right::before { + content: "\e068"; } + +.fa-mars-and-venus-burst::before { + content: "\e523"; } + +.fa-square-caret-right::before { + content: "\f152"; } + +.fa-caret-square-right::before { + content: "\f152"; } + +.fa-scissors::before { + content: "\f0c4"; } + +.fa-cut::before { + content: "\f0c4"; } + +.fa-sun-plant-wilt::before { + content: "\e57a"; } + +.fa-toilets-portable::before { + content: "\e584"; } + +.fa-hockey-puck::before { + content: "\f453"; } + +.fa-table::before { + content: "\f0ce"; } + +.fa-magnifying-glass-arrow-right::before { + content: "\e521"; } + +.fa-tachograph-digital::before { + content: "\f566"; } + +.fa-digital-tachograph::before { + content: "\f566"; } + +.fa-users-slash::before { + content: "\e073"; } + +.fa-clover::before { + content: "\e139"; } + +.fa-reply::before { + content: "\f3e5"; } + +.fa-mail-reply::before { + content: "\f3e5"; } + +.fa-star-and-crescent::before { + content: "\f699"; } + +.fa-house-fire::before { + content: "\e50c"; } + +.fa-square-minus::before { + content: "\f146"; } + +.fa-minus-square::before { + content: "\f146"; } + +.fa-helicopter::before { + content: "\f533"; } + +.fa-compass::before { + content: "\f14e"; } + +.fa-square-caret-down::before { + content: "\f150"; } + +.fa-caret-square-down::before { + content: "\f150"; } + +.fa-file-circle-question::before { + content: "\e4ef"; } + +.fa-laptop-code::before { + content: "\f5fc"; } + +.fa-swatchbook::before { + content: "\f5c3"; } + +.fa-prescription-bottle::before { + content: "\f485"; } + +.fa-bars::before { + content: "\f0c9"; } + +.fa-navicon::before { + content: "\f0c9"; } + +.fa-people-group::before { + content: "\e533"; } + +.fa-hourglass-end::before { + content: "\f253"; } + +.fa-hourglass-3::before { + content: "\f253"; } + +.fa-heart-crack::before { + content: "\f7a9"; } + +.fa-heart-broken::before { + content: "\f7a9"; } + +.fa-square-up-right::before { + content: "\f360"; } + +.fa-external-link-square-alt::before { + content: "\f360"; } + +.fa-face-kiss-beam::before { + content: "\f597"; } + +.fa-kiss-beam::before { + content: "\f597"; } + +.fa-film::before { + content: "\f008"; } + +.fa-ruler-horizontal::before { + content: "\f547"; } + +.fa-people-robbery::before { + content: "\e536"; } + +.fa-lightbulb::before { + content: "\f0eb"; } + +.fa-caret-left::before { + content: "\f0d9"; } + +.fa-circle-exclamation::before { + content: "\f06a"; } + +.fa-exclamation-circle::before { + content: "\f06a"; } + +.fa-school-circle-xmark::before { + content: "\e56d"; } + +.fa-arrow-right-from-bracket::before { + content: "\f08b"; } + +.fa-sign-out::before { + content: "\f08b"; } + +.fa-circle-chevron-down::before { + content: "\f13a"; } + +.fa-chevron-circle-down::before { + content: "\f13a"; } + +.fa-unlock-keyhole::before { + content: "\f13e"; } + +.fa-unlock-alt::before { + content: "\f13e"; } + +.fa-cloud-showers-heavy::before { + content: "\f740"; } + +.fa-headphones-simple::before { + content: "\f58f"; } + +.fa-headphones-alt::before { + content: "\f58f"; } + +.fa-sitemap::before { + content: "\f0e8"; } + +.fa-circle-dollar-to-slot::before { + content: "\f4b9"; } + +.fa-donate::before { + content: "\f4b9"; } + +.fa-memory::before { + content: "\f538"; } + +.fa-road-spikes::before { + content: "\e568"; } + +.fa-fire-burner::before { + content: "\e4f1"; } + +.fa-flag::before { + content: "\f024"; } + +.fa-hanukiah::before { + content: "\f6e6"; } + +.fa-feather::before { + content: "\f52d"; } + +.fa-volume-low::before { + content: "\f027"; } + +.fa-volume-down::before { + content: "\f027"; } + +.fa-comment-slash::before { + content: "\f4b3"; } + +.fa-cloud-sun-rain::before { + content: "\f743"; } + +.fa-compress::before { + content: "\f066"; } + +.fa-wheat-awn::before { + content: "\e2cd"; } + +.fa-wheat-alt::before { + content: "\e2cd"; } + +.fa-ankh::before { + content: "\f644"; } + +.fa-hands-holding-child::before { + content: "\e4fa"; } + +.fa-asterisk::before { + content: "\2a"; } + +.fa-square-check::before { + content: "\f14a"; } + +.fa-check-square::before { + content: "\f14a"; } + +.fa-peseta-sign::before { + content: "\e221"; } + +.fa-heading::before { + content: "\f1dc"; } + +.fa-header::before { + content: "\f1dc"; } + +.fa-ghost::before { + content: "\f6e2"; } + +.fa-list::before { + content: "\f03a"; } + +.fa-list-squares::before { + content: "\f03a"; } + +.fa-square-phone-flip::before { + content: "\f87b"; } + +.fa-phone-square-alt::before { + content: "\f87b"; } + +.fa-cart-plus::before { + content: "\f217"; } + +.fa-gamepad::before { + content: "\f11b"; } + +.fa-circle-dot::before { + content: "\f192"; } + +.fa-dot-circle::before { + content: "\f192"; } + +.fa-face-dizzy::before { + content: "\f567"; } + +.fa-dizzy::before { + content: "\f567"; } + +.fa-egg::before { + content: "\f7fb"; } + +.fa-house-medical-circle-xmark::before { + content: "\e513"; } + +.fa-campground::before { + content: "\f6bb"; } + +.fa-folder-plus::before { + content: "\f65e"; } + +.fa-futbol::before { + content: "\f1e3"; } + +.fa-futbol-ball::before { + content: "\f1e3"; } + +.fa-soccer-ball::before { + content: "\f1e3"; } + +.fa-paintbrush::before { + content: "\f1fc"; } + +.fa-paint-brush::before { + content: "\f1fc"; } + +.fa-lock::before { + content: "\f023"; } + +.fa-gas-pump::before { + content: "\f52f"; } + +.fa-hot-tub-person::before { + content: "\f593"; } + +.fa-hot-tub::before { + content: "\f593"; } + +.fa-map-location::before { + content: "\f59f"; } + +.fa-map-marked::before { + content: "\f59f"; } + +.fa-house-flood-water::before { + content: "\e50e"; } + +.fa-tree::before { + content: "\f1bb"; } + +.fa-bridge-lock::before { + content: "\e4cc"; } + +.fa-sack-dollar::before { + content: "\f81d"; } + +.fa-pen-to-square::before { + content: "\f044"; } + +.fa-edit::before { + content: "\f044"; } + +.fa-car-side::before { + content: "\f5e4"; } + +.fa-share-nodes::before { + content: "\f1e0"; } + +.fa-share-alt::before { + content: "\f1e0"; } + +.fa-heart-circle-minus::before { + content: "\e4ff"; } + +.fa-hourglass-half::before { + content: "\f252"; } + +.fa-hourglass-2::before { + content: "\f252"; } + +.fa-microscope::before { + content: "\f610"; } + +.fa-sink::before { + content: "\e06d"; } + +.fa-bag-shopping::before { + content: "\f290"; } + +.fa-shopping-bag::before { + content: "\f290"; } + +.fa-arrow-down-z-a::before { + content: "\f881"; } + +.fa-sort-alpha-desc::before { + content: "\f881"; } + +.fa-sort-alpha-down-alt::before { + content: "\f881"; } + +.fa-mitten::before { + content: "\f7b5"; } + +.fa-person-rays::before { + content: "\e54d"; } + +.fa-users::before { + content: "\f0c0"; } + +.fa-eye-slash::before { + content: "\f070"; } + +.fa-flask-vial::before { + content: "\e4f3"; } + +.fa-hand::before { + content: "\f256"; } + +.fa-hand-paper::before { + content: "\f256"; } + +.fa-om::before { + content: "\f679"; } + +.fa-worm::before { + content: "\e599"; } + +.fa-house-circle-xmark::before { + content: "\e50b"; } + +.fa-plug::before { + content: "\f1e6"; } + +.fa-chevron-up::before { + content: "\f077"; } + +.fa-hand-spock::before { + content: "\f259"; } + +.fa-stopwatch::before { + content: "\f2f2"; } + +.fa-face-kiss::before { + content: "\f596"; } + +.fa-kiss::before { + content: "\f596"; } + +.fa-bridge-circle-xmark::before { + content: "\e4cb"; } + +.fa-face-grin-tongue::before { + content: "\f589"; } + +.fa-grin-tongue::before { + content: "\f589"; } + +.fa-chess-bishop::before { + content: "\f43a"; } + +.fa-face-grin-wink::before { + content: "\f58c"; } + +.fa-grin-wink::before { + content: "\f58c"; } + +.fa-ear-deaf::before { + content: "\f2a4"; } + +.fa-deaf::before { + content: "\f2a4"; } + +.fa-deafness::before { + content: "\f2a4"; } + +.fa-hard-of-hearing::before { + content: "\f2a4"; } + +.fa-road-circle-check::before { + content: "\e564"; } + +.fa-dice-five::before { + content: "\f523"; } + +.fa-square-rss::before { + content: "\f143"; } + +.fa-rss-square::before { + content: "\f143"; } + +.fa-land-mine-on::before { + content: "\e51b"; } + +.fa-i-cursor::before { + content: "\f246"; } + +.fa-stamp::before { + content: "\f5bf"; } + +.fa-stairs::before { + content: "\e289"; } + +.fa-i::before { + content: "\49"; } + +.fa-hryvnia-sign::before { + content: "\f6f2"; } + +.fa-hryvnia::before { + content: "\f6f2"; } + +.fa-pills::before { + content: "\f484"; } + +.fa-face-grin-wide::before { + content: "\f581"; } + +.fa-grin-alt::before { + content: "\f581"; } + +.fa-tooth::before { + content: "\f5c9"; } + +.fa-v::before { + content: "\56"; } + +.fa-bangladeshi-taka-sign::before { + content: "\e2e6"; } + +.fa-bicycle::before { + content: "\f206"; } + +.fa-staff-snake::before { + content: "\e579"; } + +.fa-rod-asclepius::before { + content: "\e579"; } + +.fa-rod-snake::before { + content: "\e579"; } + +.fa-staff-aesculapius::before { + content: "\e579"; } + +.fa-head-side-cough-slash::before { + content: "\e062"; } + +.fa-truck-medical::before { + content: "\f0f9"; } + +.fa-ambulance::before { + content: "\f0f9"; } + +.fa-wheat-awn-circle-exclamation::before { + content: "\e598"; } + +.fa-snowman::before { + content: "\f7d0"; } + +.fa-mortar-pestle::before { + content: "\f5a7"; } + +.fa-road-barrier::before { + content: "\e562"; } + +.fa-school::before { + content: "\f549"; } + +.fa-igloo::before { + content: "\f7ae"; } + +.fa-joint::before { + content: "\f595"; } + +.fa-angle-right::before { + content: "\f105"; } + +.fa-horse::before { + content: "\f6f0"; } + +.fa-q::before { + content: "\51"; } + +.fa-g::before { + content: "\47"; } + +.fa-notes-medical::before { + content: "\f481"; } + +.fa-temperature-half::before { + content: "\f2c9"; } + +.fa-temperature-2::before { + content: "\f2c9"; } + +.fa-thermometer-2::before { + content: "\f2c9"; } + +.fa-thermometer-half::before { + content: "\f2c9"; } + +.fa-dong-sign::before { + content: "\e169"; } + +.fa-capsules::before { + content: "\f46b"; } + +.fa-poo-storm::before { + content: "\f75a"; } + +.fa-poo-bolt::before { + content: "\f75a"; } + +.fa-face-frown-open::before { + content: "\f57a"; } + +.fa-frown-open::before { + content: "\f57a"; } + +.fa-hand-point-up::before { + content: "\f0a6"; } + +.fa-money-bill::before { + content: "\f0d6"; } + +.fa-bookmark::before { + content: "\f02e"; } + +.fa-align-justify::before { + content: "\f039"; } + +.fa-umbrella-beach::before { + content: "\f5ca"; } + +.fa-helmet-un::before { + content: "\e503"; } + +.fa-bullseye::before { + content: "\f140"; } + +.fa-bacon::before { + content: "\f7e5"; } + +.fa-hand-point-down::before { + content: "\f0a7"; } + +.fa-arrow-up-from-bracket::before { + content: "\e09a"; } + +.fa-folder::before { + content: "\f07b"; } + +.fa-folder-blank::before { + content: "\f07b"; } + +.fa-file-waveform::before { + content: "\f478"; } + +.fa-file-medical-alt::before { + content: "\f478"; } + +.fa-radiation::before { + content: "\f7b9"; } + +.fa-chart-simple::before { + content: "\e473"; } + +.fa-mars-stroke::before { + content: "\f229"; } + +.fa-vial::before { + content: "\f492"; } + +.fa-gauge::before { + content: "\f624"; } + +.fa-dashboard::before { + content: "\f624"; } + +.fa-gauge-med::before { + content: "\f624"; } + +.fa-tachometer-alt-average::before { + content: "\f624"; } + +.fa-wand-magic-sparkles::before { + content: "\e2ca"; } + +.fa-magic-wand-sparkles::before { + content: "\e2ca"; } + +.fa-e::before { + content: "\45"; } + +.fa-pen-clip::before { + content: "\f305"; } + +.fa-pen-alt::before { + content: "\f305"; } + +.fa-bridge-circle-exclamation::before { + content: "\e4ca"; } + +.fa-user::before { + content: "\f007"; } + +.fa-school-circle-check::before { + content: "\e56b"; } + +.fa-dumpster::before { + content: "\f793"; } + +.fa-van-shuttle::before { + content: "\f5b6"; } + +.fa-shuttle-van::before { + content: "\f5b6"; } + +.fa-building-user::before { + content: "\e4da"; } + +.fa-square-caret-left::before { + content: "\f191"; } + +.fa-caret-square-left::before { + content: "\f191"; } + +.fa-highlighter::before { + content: "\f591"; } + +.fa-key::before { + content: "\f084"; } + +.fa-bullhorn::before { + content: "\f0a1"; } + +.fa-globe::before { + content: "\f0ac"; } + +.fa-synagogue::before { + content: "\f69b"; } + +.fa-person-half-dress::before { + content: "\e548"; } + +.fa-road-bridge::before { + content: "\e563"; } + +.fa-location-arrow::before { + content: "\f124"; } + +.fa-c::before { + content: "\43"; } + +.fa-tablet-button::before { + content: "\f10a"; } + +.fa-building-lock::before { + content: "\e4d6"; } + +.fa-pizza-slice::before { + content: "\f818"; } + +.fa-money-bill-wave::before { + content: "\f53a"; } + +.fa-chart-area::before { + content: "\f1fe"; } + +.fa-area-chart::before { + content: "\f1fe"; } + +.fa-house-flag::before { + content: "\e50d"; } + +.fa-person-circle-minus::before { + content: "\e540"; } + +.fa-ban::before { + content: "\f05e"; } + +.fa-cancel::before { + content: "\f05e"; } + +.fa-camera-rotate::before { + content: "\e0d8"; } + +.fa-spray-can-sparkles::before { + content: "\f5d0"; } + +.fa-air-freshener::before { + content: "\f5d0"; } + +.fa-star::before { + content: "\f005"; } + +.fa-repeat::before { + content: "\f363"; } + +.fa-cross::before { + content: "\f654"; } + +.fa-box::before { + content: "\f466"; } + +.fa-venus-mars::before { + content: "\f228"; } + +.fa-arrow-pointer::before { + content: "\f245"; } + +.fa-mouse-pointer::before { + content: "\f245"; } + +.fa-maximize::before { + content: "\f31e"; } + +.fa-expand-arrows-alt::before { + content: "\f31e"; } + +.fa-charging-station::before { + content: "\f5e7"; } + +.fa-shapes::before { + content: "\f61f"; } + +.fa-triangle-circle-square::before { + content: "\f61f"; } + +.fa-shuffle::before { + content: "\f074"; } + +.fa-random::before { + content: "\f074"; } + +.fa-person-running::before { + content: "\f70c"; } + +.fa-running::before { + content: "\f70c"; } + +.fa-mobile-retro::before { + content: "\e527"; } + +.fa-grip-lines-vertical::before { + content: "\f7a5"; } + +.fa-spider::before { + content: "\f717"; } + +.fa-hands-bound::before { + content: "\e4f9"; } + +.fa-file-invoice-dollar::before { + content: "\f571"; } + +.fa-plane-circle-exclamation::before { + content: "\e556"; } + +.fa-x-ray::before { + content: "\f497"; } + +.fa-spell-check::before { + content: "\f891"; } + +.fa-slash::before { + content: "\f715"; } + +.fa-computer-mouse::before { + content: "\f8cc"; } + +.fa-mouse::before { + content: "\f8cc"; } + +.fa-arrow-right-to-bracket::before { + content: "\f090"; } + +.fa-sign-in::before { + content: "\f090"; } + +.fa-shop-slash::before { + content: "\e070"; } + +.fa-store-alt-slash::before { + content: "\e070"; } + +.fa-server::before { + content: "\f233"; } + +.fa-virus-covid-slash::before { + content: "\e4a9"; } + +.fa-shop-lock::before { + content: "\e4a5"; } + +.fa-hourglass-start::before { + content: "\f251"; } + +.fa-hourglass-1::before { + content: "\f251"; } + +.fa-blender-phone::before { + content: "\f6b6"; } + +.fa-building-wheat::before { + content: "\e4db"; } + +.fa-person-breastfeeding::before { + content: "\e53a"; } + +.fa-right-to-bracket::before { + content: "\f2f6"; } + +.fa-sign-in-alt::before { + content: "\f2f6"; } + +.fa-venus::before { + content: "\f221"; } + +.fa-passport::before { + content: "\f5ab"; } + +.fa-heart-pulse::before { + content: "\f21e"; } + +.fa-heartbeat::before { + content: "\f21e"; } + +.fa-people-carry-box::before { + content: "\f4ce"; } + +.fa-people-carry::before { + content: "\f4ce"; } + +.fa-temperature-high::before { + content: "\f769"; } + +.fa-microchip::before { + content: "\f2db"; } + +.fa-crown::before { + content: "\f521"; } + +.fa-weight-hanging::before { + content: "\f5cd"; } + +.fa-xmarks-lines::before { + content: "\e59a"; } + +.fa-file-prescription::before { + content: "\f572"; } + +.fa-weight-scale::before { + content: "\f496"; } + +.fa-weight::before { + content: "\f496"; } + +.fa-user-group::before { + content: "\f500"; } + +.fa-user-friends::before { + content: "\f500"; } + +.fa-arrow-up-a-z::before { + content: "\f15e"; } + +.fa-sort-alpha-up::before { + content: "\f15e"; } + +.fa-chess-knight::before { + content: "\f441"; } + +.fa-face-laugh-squint::before { + content: "\f59b"; } + +.fa-laugh-squint::before { + content: "\f59b"; } + +.fa-wheelchair::before { + content: "\f193"; } + +.fa-circle-arrow-up::before { + content: "\f0aa"; } + +.fa-arrow-circle-up::before { + content: "\f0aa"; } + +.fa-toggle-on::before { + content: "\f205"; } + +.fa-person-walking::before { + content: "\f554"; } + +.fa-walking::before { + content: "\f554"; } + +.fa-l::before { + content: "\4c"; } + +.fa-fire::before { + content: "\f06d"; } + +.fa-bed-pulse::before { + content: "\f487"; } + +.fa-procedures::before { + content: "\f487"; } + +.fa-shuttle-space::before { + content: "\f197"; } + +.fa-space-shuttle::before { + content: "\f197"; } + +.fa-face-laugh::before { + content: "\f599"; } + +.fa-laugh::before { + content: "\f599"; } + +.fa-folder-open::before { + content: "\f07c"; } + +.fa-heart-circle-plus::before { + content: "\e500"; } + +.fa-code-fork::before { + content: "\e13b"; } + +.fa-city::before { + content: "\f64f"; } + +.fa-microphone-lines::before { + content: "\f3c9"; } + +.fa-microphone-alt::before { + content: "\f3c9"; } + +.fa-pepper-hot::before { + content: "\f816"; } + +.fa-unlock::before { + content: "\f09c"; } + +.fa-colon-sign::before { + content: "\e140"; } + +.fa-headset::before { + content: "\f590"; } + +.fa-store-slash::before { + content: "\e071"; } + +.fa-road-circle-xmark::before { + content: "\e566"; } + +.fa-user-minus::before { + content: "\f503"; } + +.fa-mars-stroke-up::before { + content: "\f22a"; } + +.fa-mars-stroke-v::before { + content: "\f22a"; } + +.fa-champagne-glasses::before { + content: "\f79f"; } + +.fa-glass-cheers::before { + content: "\f79f"; } + +.fa-clipboard::before { + content: "\f328"; } + +.fa-house-circle-exclamation::before { + content: "\e50a"; } + +.fa-file-arrow-up::before { + content: "\f574"; } + +.fa-file-upload::before { + content: "\f574"; } + +.fa-wifi::before { + content: "\f1eb"; } + +.fa-wifi-3::before { + content: "\f1eb"; } + +.fa-wifi-strong::before { + content: "\f1eb"; } + +.fa-bath::before { + content: "\f2cd"; } + +.fa-bathtub::before { + content: "\f2cd"; } + +.fa-underline::before { + content: "\f0cd"; } + +.fa-user-pen::before { + content: "\f4ff"; } + +.fa-user-edit::before { + content: "\f4ff"; } + +.fa-signature::before { + content: "\f5b7"; } + +.fa-stroopwafel::before { + content: "\f551"; } + +.fa-bold::before { + content: "\f032"; } + +.fa-anchor-lock::before { + content: "\e4ad"; } + +.fa-building-ngo::before { + content: "\e4d7"; } + +.fa-manat-sign::before { + content: "\e1d5"; } + +.fa-not-equal::before { + content: "\f53e"; } + +.fa-border-top-left::before { + content: "\f853"; } + +.fa-border-style::before { + content: "\f853"; } + +.fa-map-location-dot::before { + content: "\f5a0"; } + +.fa-map-marked-alt::before { + content: "\f5a0"; } + +.fa-jedi::before { + content: "\f669"; } + +.fa-square-poll-vertical::before { + content: "\f681"; } + +.fa-poll::before { + content: "\f681"; } + +.fa-mug-hot::before { + content: "\f7b6"; } + +.fa-car-battery::before { + content: "\f5df"; } + +.fa-battery-car::before { + content: "\f5df"; } + +.fa-gift::before { + content: "\f06b"; } + +.fa-dice-two::before { + content: "\f528"; } + +.fa-chess-queen::before { + content: "\f445"; } + +.fa-glasses::before { + content: "\f530"; } + +.fa-chess-board::before { + content: "\f43c"; } + +.fa-building-circle-check::before { + content: "\e4d2"; } + +.fa-person-chalkboard::before { + content: "\e53d"; } + +.fa-mars-stroke-right::before { + content: "\f22b"; } + +.fa-mars-stroke-h::before { + content: "\f22b"; } + +.fa-hand-back-fist::before { + content: "\f255"; } + +.fa-hand-rock::before { + content: "\f255"; } + +.fa-square-caret-up::before { + content: "\f151"; } + +.fa-caret-square-up::before { + content: "\f151"; } + +.fa-cloud-showers-water::before { + content: "\e4e4"; } + +.fa-chart-bar::before { + content: "\f080"; } + +.fa-bar-chart::before { + content: "\f080"; } + +.fa-hands-bubbles::before { + content: "\e05e"; } + +.fa-hands-wash::before { + content: "\e05e"; } + +.fa-less-than-equal::before { + content: "\f537"; } + +.fa-train::before { + content: "\f238"; } + +.fa-eye-low-vision::before { + content: "\f2a8"; } + +.fa-low-vision::before { + content: "\f2a8"; } + +.fa-crow::before { + content: "\f520"; } + +.fa-sailboat::before { + content: "\e445"; } + +.fa-window-restore::before { + content: "\f2d2"; } + +.fa-square-plus::before { + content: "\f0fe"; } + +.fa-plus-square::before { + content: "\f0fe"; } + +.fa-torii-gate::before { + content: "\f6a1"; } + +.fa-frog::before { + content: "\f52e"; } + +.fa-bucket::before { + content: "\e4cf"; } + +.fa-image::before { + content: "\f03e"; } + +.fa-microphone::before { + content: "\f130"; } + +.fa-cow::before { + content: "\f6c8"; } + +.fa-caret-up::before { + content: "\f0d8"; } + +.fa-screwdriver::before { + content: "\f54a"; } + +.fa-folder-closed::before { + content: "\e185"; } + +.fa-house-tsunami::before { + content: "\e515"; } + +.fa-square-nfi::before { + content: "\e576"; } + +.fa-arrow-up-from-ground-water::before { + content: "\e4b5"; } + +.fa-martini-glass::before { + content: "\f57b"; } + +.fa-glass-martini-alt::before { + content: "\f57b"; } + +.fa-rotate-left::before { + content: "\f2ea"; } + +.fa-rotate-back::before { + content: "\f2ea"; } + +.fa-rotate-backward::before { + content: "\f2ea"; } + +.fa-undo-alt::before { + content: "\f2ea"; } + +.fa-table-columns::before { + content: "\f0db"; } + +.fa-columns::before { + content: "\f0db"; } + +.fa-lemon::before { + content: "\f094"; } + +.fa-head-side-mask::before { + content: "\e063"; } + +.fa-handshake::before { + content: "\f2b5"; } + +.fa-gem::before { + content: "\f3a5"; } + +.fa-dolly::before { + content: "\f472"; } + +.fa-dolly-box::before { + content: "\f472"; } + +.fa-smoking::before { + content: "\f48d"; } + +.fa-minimize::before { + content: "\f78c"; } + +.fa-compress-arrows-alt::before { + content: "\f78c"; } + +.fa-monument::before { + content: "\f5a6"; } + +.fa-snowplow::before { + content: "\f7d2"; } + +.fa-angles-right::before { + content: "\f101"; } + +.fa-angle-double-right::before { + content: "\f101"; } + +.fa-cannabis::before { + content: "\f55f"; } + +.fa-circle-play::before { + content: "\f144"; } + +.fa-play-circle::before { + content: "\f144"; } + +.fa-tablets::before { + content: "\f490"; } + +.fa-ethernet::before { + content: "\f796"; } + +.fa-euro-sign::before { + content: "\f153"; } + +.fa-eur::before { + content: "\f153"; } + +.fa-euro::before { + content: "\f153"; } + +.fa-chair::before { + content: "\f6c0"; } + +.fa-circle-check::before { + content: "\f058"; } + +.fa-check-circle::before { + content: "\f058"; } + +.fa-circle-stop::before { + content: "\f28d"; } + +.fa-stop-circle::before { + content: "\f28d"; } + +.fa-compass-drafting::before { + content: "\f568"; } + +.fa-drafting-compass::before { + content: "\f568"; } + +.fa-plate-wheat::before { + content: "\e55a"; } + +.fa-icicles::before { + content: "\f7ad"; } + +.fa-person-shelter::before { + content: "\e54f"; } + +.fa-neuter::before { + content: "\f22c"; } + +.fa-id-badge::before { + content: "\f2c1"; } + +.fa-marker::before { + content: "\f5a1"; } + +.fa-face-laugh-beam::before { + content: "\f59a"; } + +.fa-laugh-beam::before { + content: "\f59a"; } + +.fa-helicopter-symbol::before { + content: "\e502"; } + +.fa-universal-access::before { + content: "\f29a"; } + +.fa-circle-chevron-up::before { + content: "\f139"; } + +.fa-chevron-circle-up::before { + content: "\f139"; } + +.fa-lari-sign::before { + content: "\e1c8"; } + +.fa-volcano::before { + content: "\f770"; } + +.fa-person-walking-dashed-line-arrow-right::before { + content: "\e553"; } + +.fa-sterling-sign::before { + content: "\f154"; } + +.fa-gbp::before { + content: "\f154"; } + +.fa-pound-sign::before { + content: "\f154"; } + +.fa-viruses::before { + content: "\e076"; } + +.fa-square-person-confined::before { + content: "\e577"; } + +.fa-user-tie::before { + content: "\f508"; } + +.fa-arrow-down-long::before { + content: "\f175"; } + +.fa-long-arrow-down::before { + content: "\f175"; } + +.fa-tent-arrow-down-to-line::before { + content: "\e57e"; } + +.fa-certificate::before { + content: "\f0a3"; } + +.fa-reply-all::before { + content: "\f122"; } + +.fa-mail-reply-all::before { + content: "\f122"; } + +.fa-suitcase::before { + content: "\f0f2"; } + +.fa-person-skating::before { + content: "\f7c5"; } + +.fa-skating::before { + content: "\f7c5"; } + +.fa-filter-circle-dollar::before { + content: "\f662"; } + +.fa-funnel-dollar::before { + content: "\f662"; } + +.fa-camera-retro::before { + content: "\f083"; } + +.fa-circle-arrow-down::before { + content: "\f0ab"; } + +.fa-arrow-circle-down::before { + content: "\f0ab"; } + +.fa-file-import::before { + content: "\f56f"; } + +.fa-arrow-right-to-file::before { + content: "\f56f"; } + +.fa-square-arrow-up-right::before { + content: "\f14c"; } + +.fa-external-link-square::before { + content: "\f14c"; } + +.fa-box-open::before { + content: "\f49e"; } + +.fa-scroll::before { + content: "\f70e"; } + +.fa-spa::before { + content: "\f5bb"; } + +.fa-location-pin-lock::before { + content: "\e51f"; } + +.fa-pause::before { + content: "\f04c"; } + +.fa-hill-avalanche::before { + content: "\e507"; } + +.fa-temperature-empty::before { + content: "\f2cb"; } + +.fa-temperature-0::before { + content: "\f2cb"; } + +.fa-thermometer-0::before { + content: "\f2cb"; } + +.fa-thermometer-empty::before { + content: "\f2cb"; } + +.fa-bomb::before { + content: "\f1e2"; } + +.fa-registered::before { + content: "\f25d"; } + +.fa-address-card::before { + content: "\f2bb"; } + +.fa-contact-card::before { + content: "\f2bb"; } + +.fa-vcard::before { + content: "\f2bb"; } + +.fa-scale-unbalanced-flip::before { + content: "\f516"; } + +.fa-balance-scale-right::before { + content: "\f516"; } + +.fa-subscript::before { + content: "\f12c"; } + +.fa-diamond-turn-right::before { + content: "\f5eb"; } + +.fa-directions::before { + content: "\f5eb"; } + +.fa-burst::before { + content: "\e4dc"; } + +.fa-house-laptop::before { + content: "\e066"; } + +.fa-laptop-house::before { + content: "\e066"; } + +.fa-face-tired::before { + content: "\f5c8"; } + +.fa-tired::before { + content: "\f5c8"; } + +.fa-money-bills::before { + content: "\e1f3"; } + +.fa-smog::before { + content: "\f75f"; } + +.fa-crutch::before { + content: "\f7f7"; } + +.fa-cloud-arrow-up::before { + content: "\f0ee"; } + +.fa-cloud-upload::before { + content: "\f0ee"; } + +.fa-cloud-upload-alt::before { + content: "\f0ee"; } + +.fa-palette::before { + content: "\f53f"; } + +.fa-arrows-turn-right::before { + content: "\e4c0"; } + +.fa-vest::before { + content: "\e085"; } + +.fa-ferry::before { + content: "\e4ea"; } + +.fa-arrows-down-to-people::before { + content: "\e4b9"; } + +.fa-seedling::before { + content: "\f4d8"; } + +.fa-sprout::before { + content: "\f4d8"; } + +.fa-left-right::before { + content: "\f337"; } + +.fa-arrows-alt-h::before { + content: "\f337"; } + +.fa-boxes-packing::before { + content: "\e4c7"; } + +.fa-circle-arrow-left::before { + content: "\f0a8"; } + +.fa-arrow-circle-left::before { + content: "\f0a8"; } + +.fa-group-arrows-rotate::before { + content: "\e4f6"; } + +.fa-bowl-food::before { + content: "\e4c6"; } + +.fa-candy-cane::before { + content: "\f786"; } + +.fa-arrow-down-wide-short::before { + content: "\f160"; } + +.fa-sort-amount-asc::before { + content: "\f160"; } + +.fa-sort-amount-down::before { + content: "\f160"; } + +.fa-cloud-bolt::before { + content: "\f76c"; } + +.fa-thunderstorm::before { + content: "\f76c"; } + +.fa-text-slash::before { + content: "\f87d"; } + +.fa-remove-format::before { + content: "\f87d"; } + +.fa-face-smile-wink::before { + content: "\f4da"; } + +.fa-smile-wink::before { + content: "\f4da"; } + +.fa-file-word::before { + content: "\f1c2"; } + +.fa-file-powerpoint::before { + content: "\f1c4"; } + +.fa-arrows-left-right::before { + content: "\f07e"; } + +.fa-arrows-h::before { + content: "\f07e"; } + +.fa-house-lock::before { + content: "\e510"; } + +.fa-cloud-arrow-down::before { + content: "\f0ed"; } + +.fa-cloud-download::before { + content: "\f0ed"; } + +.fa-cloud-download-alt::before { + content: "\f0ed"; } + +.fa-children::before { + content: "\e4e1"; } + +.fa-chalkboard::before { + content: "\f51b"; } + +.fa-blackboard::before { + content: "\f51b"; } + +.fa-user-large-slash::before { + content: "\f4fa"; } + +.fa-user-alt-slash::before { + content: "\f4fa"; } + +.fa-envelope-open::before { + content: "\f2b6"; } + +.fa-handshake-simple-slash::before { + content: "\e05f"; } + +.fa-handshake-alt-slash::before { + content: "\e05f"; } + +.fa-mattress-pillow::before { + content: "\e525"; } + +.fa-guarani-sign::before { + content: "\e19a"; } + +.fa-arrows-rotate::before { + content: "\f021"; } + +.fa-refresh::before { + content: "\f021"; } + +.fa-sync::before { + content: "\f021"; } + +.fa-fire-extinguisher::before { + content: "\f134"; } + +.fa-cruzeiro-sign::before { + content: "\e152"; } + +.fa-greater-than-equal::before { + content: "\f532"; } + +.fa-shield-halved::before { + content: "\f3ed"; } + +.fa-shield-alt::before { + content: "\f3ed"; } + +.fa-book-atlas::before { + content: "\f558"; } + +.fa-atlas::before { + content: "\f558"; } + +.fa-virus::before { + content: "\e074"; } + +.fa-envelope-circle-check::before { + content: "\e4e8"; } + +.fa-layer-group::before { + content: "\f5fd"; } + +.fa-arrows-to-dot::before { + content: "\e4be"; } + +.fa-archway::before { + content: "\f557"; } + +.fa-heart-circle-check::before { + content: "\e4fd"; } + +.fa-house-chimney-crack::before { + content: "\f6f1"; } + +.fa-house-damage::before { + content: "\f6f1"; } + +.fa-file-zipper::before { + content: "\f1c6"; } + +.fa-file-archive::before { + content: "\f1c6"; } + +.fa-square::before { + content: "\f0c8"; } + +.fa-martini-glass-empty::before { + content: "\f000"; } + +.fa-glass-martini::before { + content: "\f000"; } + +.fa-couch::before { + content: "\f4b8"; } + +.fa-cedi-sign::before { + content: "\e0df"; } + +.fa-italic::before { + content: "\f033"; } + +.fa-table-cells-column-lock::before { + content: "\e678"; } + +.fa-church::before { + content: "\f51d"; } + +.fa-comments-dollar::before { + content: "\f653"; } + +.fa-democrat::before { + content: "\f747"; } + +.fa-z::before { + content: "\5a"; } + +.fa-person-skiing::before { + content: "\f7c9"; } + +.fa-skiing::before { + content: "\f7c9"; } + +.fa-road-lock::before { + content: "\e567"; } + +.fa-a::before { + content: "\41"; } + +.fa-temperature-arrow-down::before { + content: "\e03f"; } + +.fa-temperature-down::before { + content: "\e03f"; } + +.fa-feather-pointed::before { + content: "\f56b"; } + +.fa-feather-alt::before { + content: "\f56b"; } + +.fa-p::before { + content: "\50"; } + +.fa-snowflake::before { + content: "\f2dc"; } + +.fa-newspaper::before { + content: "\f1ea"; } + +.fa-rectangle-ad::before { + content: "\f641"; } + +.fa-ad::before { + content: "\f641"; } + +.fa-circle-arrow-right::before { + content: "\f0a9"; } + +.fa-arrow-circle-right::before { + content: "\f0a9"; } + +.fa-filter-circle-xmark::before { + content: "\e17b"; } + +.fa-locust::before { + content: "\e520"; } + +.fa-sort::before { + content: "\f0dc"; } + +.fa-unsorted::before { + content: "\f0dc"; } + +.fa-list-ol::before { + content: "\f0cb"; } + +.fa-list-1-2::before { + content: "\f0cb"; } + +.fa-list-numeric::before { + content: "\f0cb"; } + +.fa-person-dress-burst::before { + content: "\e544"; } + +.fa-money-check-dollar::before { + content: "\f53d"; } + +.fa-money-check-alt::before { + content: "\f53d"; } + +.fa-vector-square::before { + content: "\f5cb"; } + +.fa-bread-slice::before { + content: "\f7ec"; } + +.fa-language::before { + content: "\f1ab"; } + +.fa-face-kiss-wink-heart::before { + content: "\f598"; } + +.fa-kiss-wink-heart::before { + content: "\f598"; } + +.fa-filter::before { + content: "\f0b0"; } + +.fa-question::before { + content: "\3f"; } + +.fa-file-signature::before { + content: "\f573"; } + +.fa-up-down-left-right::before { + content: "\f0b2"; } + +.fa-arrows-alt::before { + content: "\f0b2"; } + +.fa-house-chimney-user::before { + content: "\e065"; } + +.fa-hand-holding-heart::before { + content: "\f4be"; } + +.fa-puzzle-piece::before { + content: "\f12e"; } + +.fa-money-check::before { + content: "\f53c"; } + +.fa-star-half-stroke::before { + content: "\f5c0"; } + +.fa-star-half-alt::before { + content: "\f5c0"; } + +.fa-code::before { + content: "\f121"; } + +.fa-whiskey-glass::before { + content: "\f7a0"; } + +.fa-glass-whiskey::before { + content: "\f7a0"; } + +.fa-building-circle-exclamation::before { + content: "\e4d3"; } + +.fa-magnifying-glass-chart::before { + content: "\e522"; } + +.fa-arrow-up-right-from-square::before { + content: "\f08e"; } + +.fa-external-link::before { + content: "\f08e"; } + +.fa-cubes-stacked::before { + content: "\e4e6"; } + +.fa-won-sign::before { + content: "\f159"; } + +.fa-krw::before { + content: "\f159"; } + +.fa-won::before { + content: "\f159"; } + +.fa-virus-covid::before { + content: "\e4a8"; } + +.fa-austral-sign::before { + content: "\e0a9"; } + +.fa-f::before { + content: "\46"; } + +.fa-leaf::before { + content: "\f06c"; } + +.fa-road::before { + content: "\f018"; } + +.fa-taxi::before { + content: "\f1ba"; } + +.fa-cab::before { + content: "\f1ba"; } + +.fa-person-circle-plus::before { + content: "\e541"; } + +.fa-chart-pie::before { + content: "\f200"; } + +.fa-pie-chart::before { + content: "\f200"; } + +.fa-bolt-lightning::before { + content: "\e0b7"; } + +.fa-sack-xmark::before { + content: "\e56a"; } + +.fa-file-excel::before { + content: "\f1c3"; } + +.fa-file-contract::before { + content: "\f56c"; } + +.fa-fish-fins::before { + content: "\e4f2"; } + +.fa-building-flag::before { + content: "\e4d5"; } + +.fa-face-grin-beam::before { + content: "\f582"; } + +.fa-grin-beam::before { + content: "\f582"; } + +.fa-object-ungroup::before { + content: "\f248"; } + +.fa-poop::before { + content: "\f619"; } + +.fa-location-pin::before { + content: "\f041"; } + +.fa-map-marker::before { + content: "\f041"; } + +.fa-kaaba::before { + content: "\f66b"; } + +.fa-toilet-paper::before { + content: "\f71e"; } + +.fa-helmet-safety::before { + content: "\f807"; } + +.fa-hard-hat::before { + content: "\f807"; } + +.fa-hat-hard::before { + content: "\f807"; } + +.fa-eject::before { + content: "\f052"; } + +.fa-circle-right::before { + content: "\f35a"; } + +.fa-arrow-alt-circle-right::before { + content: "\f35a"; } + +.fa-plane-circle-check::before { + content: "\e555"; } + +.fa-face-rolling-eyes::before { + content: "\f5a5"; } + +.fa-meh-rolling-eyes::before { + content: "\f5a5"; } + +.fa-object-group::before { + content: "\f247"; } + +.fa-chart-line::before { + content: "\f201"; } + +.fa-line-chart::before { + content: "\f201"; } + +.fa-mask-ventilator::before { + content: "\e524"; } + +.fa-arrow-right::before { + content: "\f061"; } + +.fa-signs-post::before { + content: "\f277"; } + +.fa-map-signs::before { + content: "\f277"; } + +.fa-cash-register::before { + content: "\f788"; } + +.fa-person-circle-question::before { + content: "\e542"; } + +.fa-h::before { + content: "\48"; } + +.fa-tarp::before { + content: "\e57b"; } + +.fa-screwdriver-wrench::before { + content: "\f7d9"; } + +.fa-tools::before { + content: "\f7d9"; } + +.fa-arrows-to-eye::before { + content: "\e4bf"; } + +.fa-plug-circle-bolt::before { + content: "\e55b"; } + +.fa-heart::before { + content: "\f004"; } + +.fa-mars-and-venus::before { + content: "\f224"; } + +.fa-house-user::before { + content: "\e1b0"; } + +.fa-home-user::before { + content: "\e1b0"; } + +.fa-dumpster-fire::before { + content: "\f794"; } + +.fa-house-crack::before { + content: "\e3b1"; } + +.fa-martini-glass-citrus::before { + content: "\f561"; } + +.fa-cocktail::before { + content: "\f561"; } + +.fa-face-surprise::before { + content: "\f5c2"; } + +.fa-surprise::before { + content: "\f5c2"; } + +.fa-bottle-water::before { + content: "\e4c5"; } + +.fa-circle-pause::before { + content: "\f28b"; } + +.fa-pause-circle::before { + content: "\f28b"; } + +.fa-toilet-paper-slash::before { + content: "\e072"; } + +.fa-apple-whole::before { + content: "\f5d1"; } + +.fa-apple-alt::before { + content: "\f5d1"; } + +.fa-kitchen-set::before { + content: "\e51a"; } + +.fa-r::before { + content: "\52"; } + +.fa-temperature-quarter::before { + content: "\f2ca"; } + +.fa-temperature-1::before { + content: "\f2ca"; } + +.fa-thermometer-1::before { + content: "\f2ca"; } + +.fa-thermometer-quarter::before { + content: "\f2ca"; } + +.fa-cube::before { + content: "\f1b2"; } + +.fa-bitcoin-sign::before { + content: "\e0b4"; } + +.fa-shield-dog::before { + content: "\e573"; } + +.fa-solar-panel::before { + content: "\f5ba"; } + +.fa-lock-open::before { + content: "\f3c1"; } + +.fa-elevator::before { + content: "\e16d"; } + +.fa-money-bill-transfer::before { + content: "\e528"; } + +.fa-money-bill-trend-up::before { + content: "\e529"; } + +.fa-house-flood-water-circle-arrow-right::before { + content: "\e50f"; } + +.fa-square-poll-horizontal::before { + content: "\f682"; } + +.fa-poll-h::before { + content: "\f682"; } + +.fa-circle::before { + content: "\f111"; } + +.fa-backward-fast::before { + content: "\f049"; } + +.fa-fast-backward::before { + content: "\f049"; } + +.fa-recycle::before { + content: "\f1b8"; } + +.fa-user-astronaut::before { + content: "\f4fb"; } + +.fa-plane-slash::before { + content: "\e069"; } + +.fa-trademark::before { + content: "\f25c"; } + +.fa-basketball::before { + content: "\f434"; } + +.fa-basketball-ball::before { + content: "\f434"; } + +.fa-satellite-dish::before { + content: "\f7c0"; } + +.fa-circle-up::before { + content: "\f35b"; } + +.fa-arrow-alt-circle-up::before { + content: "\f35b"; } + +.fa-mobile-screen-button::before { + content: "\f3cd"; } + +.fa-mobile-alt::before { + content: "\f3cd"; } + +.fa-volume-high::before { + content: "\f028"; } + +.fa-volume-up::before { + content: "\f028"; } + +.fa-users-rays::before { + content: "\e593"; } + +.fa-wallet::before { + content: "\f555"; } + +.fa-clipboard-check::before { + content: "\f46c"; } + +.fa-file-audio::before { + content: "\f1c7"; } + +.fa-burger::before { + content: "\f805"; } + +.fa-hamburger::before { + content: "\f805"; } + +.fa-wrench::before { + content: "\f0ad"; } + +.fa-bugs::before { + content: "\e4d0"; } + +.fa-rupee-sign::before { + content: "\f156"; } + +.fa-rupee::before { + content: "\f156"; } + +.fa-file-image::before { + content: "\f1c5"; } + +.fa-circle-question::before { + content: "\f059"; } + +.fa-question-circle::before { + content: "\f059"; } + +.fa-plane-departure::before { + content: "\f5b0"; } + +.fa-handshake-slash::before { + content: "\e060"; } + +.fa-book-bookmark::before { + content: "\e0bb"; } + +.fa-code-branch::before { + content: "\f126"; } + +.fa-hat-cowboy::before { + content: "\f8c0"; } + +.fa-bridge::before { + content: "\e4c8"; } + +.fa-phone-flip::before { + content: "\f879"; } + +.fa-phone-alt::before { + content: "\f879"; } + +.fa-truck-front::before { + content: "\e2b7"; } + +.fa-cat::before { + content: "\f6be"; } + +.fa-anchor-circle-exclamation::before { + content: "\e4ab"; } + +.fa-truck-field::before { + content: "\e58d"; } + +.fa-route::before { + content: "\f4d7"; } + +.fa-clipboard-question::before { + content: "\e4e3"; } + +.fa-panorama::before { + content: "\e209"; } + +.fa-comment-medical::before { + content: "\f7f5"; } + +.fa-teeth-open::before { + content: "\f62f"; } + +.fa-file-circle-minus::before { + content: "\e4ed"; } + +.fa-tags::before { + content: "\f02c"; } + +.fa-wine-glass::before { + content: "\f4e3"; } + +.fa-forward-fast::before { + content: "\f050"; } + +.fa-fast-forward::before { + content: "\f050"; } + +.fa-face-meh-blank::before { + content: "\f5a4"; } + +.fa-meh-blank::before { + content: "\f5a4"; } + +.fa-square-parking::before { + content: "\f540"; } + +.fa-parking::before { + content: "\f540"; } + +.fa-house-signal::before { + content: "\e012"; } + +.fa-bars-progress::before { + content: "\f828"; } + +.fa-tasks-alt::before { + content: "\f828"; } + +.fa-faucet-drip::before { + content: "\e006"; } + +.fa-cart-flatbed::before { + content: "\f474"; } + +.fa-dolly-flatbed::before { + content: "\f474"; } + +.fa-ban-smoking::before { + content: "\f54d"; } + +.fa-smoking-ban::before { + content: "\f54d"; } + +.fa-terminal::before { + content: "\f120"; } + +.fa-mobile-button::before { + content: "\f10b"; } + +.fa-house-medical-flag::before { + content: "\e514"; } + +.fa-basket-shopping::before { + content: "\f291"; } + +.fa-shopping-basket::before { + content: "\f291"; } + +.fa-tape::before { + content: "\f4db"; } + +.fa-bus-simple::before { + content: "\f55e"; } + +.fa-bus-alt::before { + content: "\f55e"; } + +.fa-eye::before { + content: "\f06e"; } + +.fa-face-sad-cry::before { + content: "\f5b3"; } + +.fa-sad-cry::before { + content: "\f5b3"; } + +.fa-audio-description::before { + content: "\f29e"; } + +.fa-person-military-to-person::before { + content: "\e54c"; } + +.fa-file-shield::before { + content: "\e4f0"; } + +.fa-user-slash::before { + content: "\f506"; } + +.fa-pen::before { + content: "\f304"; } + +.fa-tower-observation::before { + content: "\e586"; } + +.fa-file-code::before { + content: "\f1c9"; } + +.fa-signal::before { + content: "\f012"; } + +.fa-signal-5::before { + content: "\f012"; } + +.fa-signal-perfect::before { + content: "\f012"; } + +.fa-bus::before { + content: "\f207"; } + +.fa-heart-circle-xmark::before { + content: "\e501"; } + +.fa-house-chimney::before { + content: "\e3af"; } + +.fa-home-lg::before { + content: "\e3af"; } + +.fa-window-maximize::before { + content: "\f2d0"; } + +.fa-face-frown::before { + content: "\f119"; } + +.fa-frown::before { + content: "\f119"; } + +.fa-prescription::before { + content: "\f5b1"; } + +.fa-shop::before { + content: "\f54f"; } + +.fa-store-alt::before { + content: "\f54f"; } + +.fa-floppy-disk::before { + content: "\f0c7"; } + +.fa-save::before { + content: "\f0c7"; } + +.fa-vihara::before { + content: "\f6a7"; } + +.fa-scale-unbalanced::before { + content: "\f515"; } + +.fa-balance-scale-left::before { + content: "\f515"; } + +.fa-sort-up::before { + content: "\f0de"; } + +.fa-sort-asc::before { + content: "\f0de"; } + +.fa-comment-dots::before { + content: "\f4ad"; } + +.fa-commenting::before { + content: "\f4ad"; } + +.fa-plant-wilt::before { + content: "\e5aa"; } + +.fa-diamond::before { + content: "\f219"; } + +.fa-face-grin-squint::before { + content: "\f585"; } + +.fa-grin-squint::before { + content: "\f585"; } + +.fa-hand-holding-dollar::before { + content: "\f4c0"; } + +.fa-hand-holding-usd::before { + content: "\f4c0"; } + +.fa-bacterium::before { + content: "\e05a"; } + +.fa-hand-pointer::before { + content: "\f25a"; } + +.fa-drum-steelpan::before { + content: "\f56a"; } + +.fa-hand-scissors::before { + content: "\f257"; } + +.fa-hands-praying::before { + content: "\f684"; } + +.fa-praying-hands::before { + content: "\f684"; } + +.fa-arrow-rotate-right::before { + content: "\f01e"; } + +.fa-arrow-right-rotate::before { + content: "\f01e"; } + +.fa-arrow-rotate-forward::before { + content: "\f01e"; } + +.fa-redo::before { + content: "\f01e"; } + +.fa-biohazard::before { + content: "\f780"; } + +.fa-location-crosshairs::before { + content: "\f601"; } + +.fa-location::before { + content: "\f601"; } + +.fa-mars-double::before { + content: "\f227"; } + +.fa-child-dress::before { + content: "\e59c"; } + +.fa-users-between-lines::before { + content: "\e591"; } + +.fa-lungs-virus::before { + content: "\e067"; } + +.fa-face-grin-tears::before { + content: "\f588"; } + +.fa-grin-tears::before { + content: "\f588"; } + +.fa-phone::before { + content: "\f095"; } + +.fa-calendar-xmark::before { + content: "\f273"; } + +.fa-calendar-times::before { + content: "\f273"; } + +.fa-child-reaching::before { + content: "\e59d"; } + +.fa-head-side-virus::before { + content: "\e064"; } + +.fa-user-gear::before { + content: "\f4fe"; } + +.fa-user-cog::before { + content: "\f4fe"; } + +.fa-arrow-up-1-9::before { + content: "\f163"; } + +.fa-sort-numeric-up::before { + content: "\f163"; } + +.fa-door-closed::before { + content: "\f52a"; } + +.fa-shield-virus::before { + content: "\e06c"; } + +.fa-dice-six::before { + content: "\f526"; } + +.fa-mosquito-net::before { + content: "\e52c"; } + +.fa-bridge-water::before { + content: "\e4ce"; } + +.fa-person-booth::before { + content: "\f756"; } + +.fa-text-width::before { + content: "\f035"; } + +.fa-hat-wizard::before { + content: "\f6e8"; } + +.fa-pen-fancy::before { + content: "\f5ac"; } + +.fa-person-digging::before { + content: "\f85e"; } + +.fa-digging::before { + content: "\f85e"; } + +.fa-trash::before { + content: "\f1f8"; } + +.fa-gauge-simple::before { + content: "\f629"; } + +.fa-gauge-simple-med::before { + content: "\f629"; } + +.fa-tachometer-average::before { + content: "\f629"; } + +.fa-book-medical::before { + content: "\f7e6"; } + +.fa-poo::before { + content: "\f2fe"; } + +.fa-quote-right::before { + content: "\f10e"; } + +.fa-quote-right-alt::before { + content: "\f10e"; } + +.fa-shirt::before { + content: "\f553"; } + +.fa-t-shirt::before { + content: "\f553"; } + +.fa-tshirt::before { + content: "\f553"; } + +.fa-cubes::before { + content: "\f1b3"; } + +.fa-divide::before { + content: "\f529"; } + +.fa-tenge-sign::before { + content: "\f7d7"; } + +.fa-tenge::before { + content: "\f7d7"; } + +.fa-headphones::before { + content: "\f025"; } + +.fa-hands-holding::before { + content: "\f4c2"; } + +.fa-hands-clapping::before { + content: "\e1a8"; } + +.fa-republican::before { + content: "\f75e"; } + +.fa-arrow-left::before { + content: "\f060"; } + +.fa-person-circle-xmark::before { + content: "\e543"; } + +.fa-ruler::before { + content: "\f545"; } + +.fa-align-left::before { + content: "\f036"; } + +.fa-dice-d6::before { + content: "\f6d1"; } + +.fa-restroom::before { + content: "\f7bd"; } + +.fa-j::before { + content: "\4a"; } + +.fa-users-viewfinder::before { + content: "\e595"; } + +.fa-file-video::before { + content: "\f1c8"; } + +.fa-up-right-from-square::before { + content: "\f35d"; } + +.fa-external-link-alt::before { + content: "\f35d"; } + +.fa-table-cells::before { + content: "\f00a"; } + +.fa-th::before { + content: "\f00a"; } + +.fa-file-pdf::before { + content: "\f1c1"; } + +.fa-book-bible::before { + content: "\f647"; } + +.fa-bible::before { + content: "\f647"; } + +.fa-o::before { + content: "\4f"; } + +.fa-suitcase-medical::before { + content: "\f0fa"; } + +.fa-medkit::before { + content: "\f0fa"; } + +.fa-user-secret::before { + content: "\f21b"; } + +.fa-otter::before { + content: "\f700"; } + +.fa-person-dress::before { + content: "\f182"; } + +.fa-female::before { + content: "\f182"; } + +.fa-comment-dollar::before { + content: "\f651"; } + +.fa-business-time::before { + content: "\f64a"; } + +.fa-briefcase-clock::before { + content: "\f64a"; } + +.fa-table-cells-large::before { + content: "\f009"; } + +.fa-th-large::before { + content: "\f009"; } + +.fa-book-tanakh::before { + content: "\f827"; } + +.fa-tanakh::before { + content: "\f827"; } + +.fa-phone-volume::before { + content: "\f2a0"; } + +.fa-volume-control-phone::before { + content: "\f2a0"; } + +.fa-hat-cowboy-side::before { + content: "\f8c1"; } + +.fa-clipboard-user::before { + content: "\f7f3"; } + +.fa-child::before { + content: "\f1ae"; } + +.fa-lira-sign::before { + content: "\f195"; } + +.fa-satellite::before { + content: "\f7bf"; } + +.fa-plane-lock::before { + content: "\e558"; } + +.fa-tag::before { + content: "\f02b"; } + +.fa-comment::before { + content: "\f075"; } + +.fa-cake-candles::before { + content: "\f1fd"; } + +.fa-birthday-cake::before { + content: "\f1fd"; } + +.fa-cake::before { + content: "\f1fd"; } + +.fa-envelope::before { + content: "\f0e0"; } + +.fa-angles-up::before { + content: "\f102"; } + +.fa-angle-double-up::before { + content: "\f102"; } + +.fa-paperclip::before { + content: "\f0c6"; } + +.fa-arrow-right-to-city::before { + content: "\e4b3"; } + +.fa-ribbon::before { + content: "\f4d6"; } + +.fa-lungs::before { + content: "\f604"; } + +.fa-arrow-up-9-1::before { + content: "\f887"; } + +.fa-sort-numeric-up-alt::before { + content: "\f887"; } + +.fa-litecoin-sign::before { + content: "\e1d3"; } + +.fa-border-none::before { + content: "\f850"; } + +.fa-circle-nodes::before { + content: "\e4e2"; } + +.fa-parachute-box::before { + content: "\f4cd"; } + +.fa-indent::before { + content: "\f03c"; } + +.fa-truck-field-un::before { + content: "\e58e"; } + +.fa-hourglass::before { + content: "\f254"; } + +.fa-hourglass-empty::before { + content: "\f254"; } + +.fa-mountain::before { + content: "\f6fc"; } + +.fa-user-doctor::before { + content: "\f0f0"; } + +.fa-user-md::before { + content: "\f0f0"; } + +.fa-circle-info::before { + content: "\f05a"; } + +.fa-info-circle::before { + content: "\f05a"; } + +.fa-cloud-meatball::before { + content: "\f73b"; } + +.fa-camera::before { + content: "\f030"; } + +.fa-camera-alt::before { + content: "\f030"; } + +.fa-square-virus::before { + content: "\e578"; } + +.fa-meteor::before { + content: "\f753"; } + +.fa-car-on::before { + content: "\e4dd"; } + +.fa-sleigh::before { + content: "\f7cc"; } + +.fa-arrow-down-1-9::before { + content: "\f162"; } + +.fa-sort-numeric-asc::before { + content: "\f162"; } + +.fa-sort-numeric-down::before { + content: "\f162"; } + +.fa-hand-holding-droplet::before { + content: "\f4c1"; } + +.fa-hand-holding-water::before { + content: "\f4c1"; } + +.fa-water::before { + content: "\f773"; } + +.fa-calendar-check::before { + content: "\f274"; } + +.fa-braille::before { + content: "\f2a1"; } + +.fa-prescription-bottle-medical::before { + content: "\f486"; } + +.fa-prescription-bottle-alt::before { + content: "\f486"; } + +.fa-landmark::before { + content: "\f66f"; } + +.fa-truck::before { + content: "\f0d1"; } + +.fa-crosshairs::before { + content: "\f05b"; } + +.fa-person-cane::before { + content: "\e53c"; } + +.fa-tent::before { + content: "\e57d"; } + +.fa-vest-patches::before { + content: "\e086"; } + +.fa-check-double::before { + content: "\f560"; } + +.fa-arrow-down-a-z::before { + content: "\f15d"; } + +.fa-sort-alpha-asc::before { + content: "\f15d"; } + +.fa-sort-alpha-down::before { + content: "\f15d"; } + +.fa-money-bill-wheat::before { + content: "\e52a"; } + +.fa-cookie::before { + content: "\f563"; } + +.fa-arrow-rotate-left::before { + content: "\f0e2"; } + +.fa-arrow-left-rotate::before { + content: "\f0e2"; } + +.fa-arrow-rotate-back::before { + content: "\f0e2"; } + +.fa-arrow-rotate-backward::before { + content: "\f0e2"; } + +.fa-undo::before { + content: "\f0e2"; } + +.fa-hard-drive::before { + content: "\f0a0"; } + +.fa-hdd::before { + content: "\f0a0"; } + +.fa-face-grin-squint-tears::before { + content: "\f586"; } + +.fa-grin-squint-tears::before { + content: "\f586"; } + +.fa-dumbbell::before { + content: "\f44b"; } + +.fa-rectangle-list::before { + content: "\f022"; } + +.fa-list-alt::before { + content: "\f022"; } + +.fa-tarp-droplet::before { + content: "\e57c"; } + +.fa-house-medical-circle-check::before { + content: "\e511"; } + +.fa-person-skiing-nordic::before { + content: "\f7ca"; } + +.fa-skiing-nordic::before { + content: "\f7ca"; } + +.fa-calendar-plus::before { + content: "\f271"; } + +.fa-plane-arrival::before { + content: "\f5af"; } + +.fa-circle-left::before { + content: "\f359"; } + +.fa-arrow-alt-circle-left::before { + content: "\f359"; } + +.fa-train-subway::before { + content: "\f239"; } + +.fa-subway::before { + content: "\f239"; } + +.fa-chart-gantt::before { + content: "\e0e4"; } + +.fa-indian-rupee-sign::before { + content: "\e1bc"; } + +.fa-indian-rupee::before { + content: "\e1bc"; } + +.fa-inr::before { + content: "\e1bc"; } + +.fa-crop-simple::before { + content: "\f565"; } + +.fa-crop-alt::before { + content: "\f565"; } + +.fa-money-bill-1::before { + content: "\f3d1"; } + +.fa-money-bill-alt::before { + content: "\f3d1"; } + +.fa-left-long::before { + content: "\f30a"; } + +.fa-long-arrow-alt-left::before { + content: "\f30a"; } + +.fa-dna::before { + content: "\f471"; } + +.fa-virus-slash::before { + content: "\e075"; } + +.fa-minus::before { + content: "\f068"; } + +.fa-subtract::before { + content: "\f068"; } + +.fa-chess::before { + content: "\f439"; } + +.fa-arrow-left-long::before { + content: "\f177"; } + +.fa-long-arrow-left::before { + content: "\f177"; } + +.fa-plug-circle-check::before { + content: "\e55c"; } + +.fa-street-view::before { + content: "\f21d"; } + +.fa-franc-sign::before { + content: "\e18f"; } + +.fa-volume-off::before { + content: "\f026"; } + +.fa-hands-asl-interpreting::before { + content: "\f2a3"; } + +.fa-american-sign-language-interpreting::before { + content: "\f2a3"; } + +.fa-asl-interpreting::before { + content: "\f2a3"; } + +.fa-hands-american-sign-language-interpreting::before { + content: "\f2a3"; } + +.fa-gear::before { + content: "\f013"; } + +.fa-cog::before { + content: "\f013"; } + +.fa-droplet-slash::before { + content: "\f5c7"; } + +.fa-tint-slash::before { + content: "\f5c7"; } + +.fa-mosque::before { + content: "\f678"; } + +.fa-mosquito::before { + content: "\e52b"; } + +.fa-star-of-david::before { + content: "\f69a"; } + +.fa-person-military-rifle::before { + content: "\e54b"; } + +.fa-cart-shopping::before { + content: "\f07a"; } + +.fa-shopping-cart::before { + content: "\f07a"; } + +.fa-vials::before { + content: "\f493"; } + +.fa-plug-circle-plus::before { + content: "\e55f"; } + +.fa-place-of-worship::before { + content: "\f67f"; } + +.fa-grip-vertical::before { + content: "\f58e"; } + +.fa-arrow-turn-up::before { + content: "\f148"; } + +.fa-level-up::before { + content: "\f148"; } + +.fa-u::before { + content: "\55"; } + +.fa-square-root-variable::before { + content: "\f698"; } + +.fa-square-root-alt::before { + content: "\f698"; } + +.fa-clock::before { + content: "\f017"; } + +.fa-clock-four::before { + content: "\f017"; } + +.fa-backward-step::before { + content: "\f048"; } + +.fa-step-backward::before { + content: "\f048"; } + +.fa-pallet::before { + content: "\f482"; } + +.fa-faucet::before { + content: "\e005"; } + +.fa-baseball-bat-ball::before { + content: "\f432"; } + +.fa-s::before { + content: "\53"; } + +.fa-timeline::before { + content: "\e29c"; } + +.fa-keyboard::before { + content: "\f11c"; } + +.fa-caret-down::before { + content: "\f0d7"; } + +.fa-house-chimney-medical::before { + content: "\f7f2"; } + +.fa-clinic-medical::before { + content: "\f7f2"; } + +.fa-temperature-three-quarters::before { + content: "\f2c8"; } + +.fa-temperature-3::before { + content: "\f2c8"; } + +.fa-thermometer-3::before { + content: "\f2c8"; } + +.fa-thermometer-three-quarters::before { + content: "\f2c8"; } + +.fa-mobile-screen::before { + content: "\f3cf"; } + +.fa-mobile-android-alt::before { + content: "\f3cf"; } + +.fa-plane-up::before { + content: "\e22d"; } + +.fa-piggy-bank::before { + content: "\f4d3"; } + +.fa-battery-half::before { + content: "\f242"; } + +.fa-battery-3::before { + content: "\f242"; } + +.fa-mountain-city::before { + content: "\e52e"; } + +.fa-coins::before { + content: "\f51e"; } + +.fa-khanda::before { + content: "\f66d"; } + +.fa-sliders::before { + content: "\f1de"; } + +.fa-sliders-h::before { + content: "\f1de"; } + +.fa-folder-tree::before { + content: "\f802"; } + +.fa-network-wired::before { + content: "\f6ff"; } + +.fa-map-pin::before { + content: "\f276"; } + +.fa-hamsa::before { + content: "\f665"; } + +.fa-cent-sign::before { + content: "\e3f5"; } + +.fa-flask::before { + content: "\f0c3"; } + +.fa-person-pregnant::before { + content: "\e31e"; } + +.fa-wand-sparkles::before { + content: "\f72b"; } + +.fa-ellipsis-vertical::before { + content: "\f142"; } + +.fa-ellipsis-v::before { + content: "\f142"; } + +.fa-ticket::before { + content: "\f145"; } + +.fa-power-off::before { + content: "\f011"; } + +.fa-right-long::before { + content: "\f30b"; } + +.fa-long-arrow-alt-right::before { + content: "\f30b"; } + +.fa-flag-usa::before { + content: "\f74d"; } + +.fa-laptop-file::before { + content: "\e51d"; } + +.fa-tty::before { + content: "\f1e4"; } + +.fa-teletype::before { + content: "\f1e4"; } + +.fa-diagram-next::before { + content: "\e476"; } + +.fa-person-rifle::before { + content: "\e54e"; } + +.fa-house-medical-circle-exclamation::before { + content: "\e512"; } + +.fa-closed-captioning::before { + content: "\f20a"; } + +.fa-person-hiking::before { + content: "\f6ec"; } + +.fa-hiking::before { + content: "\f6ec"; } + +.fa-venus-double::before { + content: "\f226"; } + +.fa-images::before { + content: "\f302"; } + +.fa-calculator::before { + content: "\f1ec"; } + +.fa-people-pulling::before { + content: "\e535"; } + +.fa-n::before { + content: "\4e"; } + +.fa-cable-car::before { + content: "\f7da"; } + +.fa-tram::before { + content: "\f7da"; } + +.fa-cloud-rain::before { + content: "\f73d"; } + +.fa-building-circle-xmark::before { + content: "\e4d4"; } + +.fa-ship::before { + content: "\f21a"; } + +.fa-arrows-down-to-line::before { + content: "\e4b8"; } + +.fa-download::before { + content: "\f019"; } + +.fa-face-grin::before { + content: "\f580"; } + +.fa-grin::before { + content: "\f580"; } + +.fa-delete-left::before { + content: "\f55a"; } + +.fa-backspace::before { + content: "\f55a"; } + +.fa-eye-dropper::before { + content: "\f1fb"; } + +.fa-eye-dropper-empty::before { + content: "\f1fb"; } + +.fa-eyedropper::before { + content: "\f1fb"; } + +.fa-file-circle-check::before { + content: "\e5a0"; } + +.fa-forward::before { + content: "\f04e"; } + +.fa-mobile::before { + content: "\f3ce"; } + +.fa-mobile-android::before { + content: "\f3ce"; } + +.fa-mobile-phone::before { + content: "\f3ce"; } + +.fa-face-meh::before { + content: "\f11a"; } + +.fa-meh::before { + content: "\f11a"; } + +.fa-align-center::before { + content: "\f037"; } + +.fa-book-skull::before { + content: "\f6b7"; } + +.fa-book-dead::before { + content: "\f6b7"; } + +.fa-id-card::before { + content: "\f2c2"; } + +.fa-drivers-license::before { + content: "\f2c2"; } + +.fa-outdent::before { + content: "\f03b"; } + +.fa-dedent::before { + content: "\f03b"; } + +.fa-heart-circle-exclamation::before { + content: "\e4fe"; } + +.fa-house::before { + content: "\f015"; } + +.fa-home::before { + content: "\f015"; } + +.fa-home-alt::before { + content: "\f015"; } + +.fa-home-lg-alt::before { + content: "\f015"; } + +.fa-calendar-week::before { + content: "\f784"; } + +.fa-laptop-medical::before { + content: "\f812"; } + +.fa-b::before { + content: "\42"; } + +.fa-file-medical::before { + content: "\f477"; } + +.fa-dice-one::before { + content: "\f525"; } + +.fa-kiwi-bird::before { + content: "\f535"; } + +.fa-arrow-right-arrow-left::before { + content: "\f0ec"; } + +.fa-exchange::before { + content: "\f0ec"; } + +.fa-rotate-right::before { + content: "\f2f9"; } + +.fa-redo-alt::before { + content: "\f2f9"; } + +.fa-rotate-forward::before { + content: "\f2f9"; } + +.fa-utensils::before { + content: "\f2e7"; } + +.fa-cutlery::before { + content: "\f2e7"; } + +.fa-arrow-up-wide-short::before { + content: "\f161"; } + +.fa-sort-amount-up::before { + content: "\f161"; } + +.fa-mill-sign::before { + content: "\e1ed"; } + +.fa-bowl-rice::before { + content: "\e2eb"; } + +.fa-skull::before { + content: "\f54c"; } + +.fa-tower-broadcast::before { + content: "\f519"; } + +.fa-broadcast-tower::before { + content: "\f519"; } + +.fa-truck-pickup::before { + content: "\f63c"; } + +.fa-up-long::before { + content: "\f30c"; } + +.fa-long-arrow-alt-up::before { + content: "\f30c"; } + +.fa-stop::before { + content: "\f04d"; } + +.fa-code-merge::before { + content: "\f387"; } + +.fa-upload::before { + content: "\f093"; } + +.fa-hurricane::before { + content: "\f751"; } + +.fa-mound::before { + content: "\e52d"; } + +.fa-toilet-portable::before { + content: "\e583"; } + +.fa-compact-disc::before { + content: "\f51f"; } + +.fa-file-arrow-down::before { + content: "\f56d"; } + +.fa-file-download::before { + content: "\f56d"; } + +.fa-caravan::before { + content: "\f8ff"; } + +.fa-shield-cat::before { + content: "\e572"; } + +.fa-bolt::before { + content: "\f0e7"; } + +.fa-zap::before { + content: "\f0e7"; } + +.fa-glass-water::before { + content: "\e4f4"; } + +.fa-oil-well::before { + content: "\e532"; } + +.fa-vault::before { + content: "\e2c5"; } + +.fa-mars::before { + content: "\f222"; } + +.fa-toilet::before { + content: "\f7d8"; } + +.fa-plane-circle-xmark::before { + content: "\e557"; } + +.fa-yen-sign::before { + content: "\f157"; } + +.fa-cny::before { + content: "\f157"; } + +.fa-jpy::before { + content: "\f157"; } + +.fa-rmb::before { + content: "\f157"; } + +.fa-yen::before { + content: "\f157"; } + +.fa-ruble-sign::before { + content: "\f158"; } + +.fa-rouble::before { + content: "\f158"; } + +.fa-rub::before { + content: "\f158"; } + +.fa-ruble::before { + content: "\f158"; } + +.fa-sun::before { + content: "\f185"; } + +.fa-guitar::before { + content: "\f7a6"; } + +.fa-face-laugh-wink::before { + content: "\f59c"; } + +.fa-laugh-wink::before { + content: "\f59c"; } + +.fa-horse-head::before { + content: "\f7ab"; } + +.fa-bore-hole::before { + content: "\e4c3"; } + +.fa-industry::before { + content: "\f275"; } + +.fa-circle-down::before { + content: "\f358"; } + +.fa-arrow-alt-circle-down::before { + content: "\f358"; } + +.fa-arrows-turn-to-dots::before { + content: "\e4c1"; } + +.fa-florin-sign::before { + content: "\e184"; } + +.fa-arrow-down-short-wide::before { + content: "\f884"; } + +.fa-sort-amount-desc::before { + content: "\f884"; } + +.fa-sort-amount-down-alt::before { + content: "\f884"; } + +.fa-less-than::before { + content: "\3c"; } + +.fa-angle-down::before { + content: "\f107"; } + +.fa-car-tunnel::before { + content: "\e4de"; } + +.fa-head-side-cough::before { + content: "\e061"; } + +.fa-grip-lines::before { + content: "\f7a4"; } + +.fa-thumbs-down::before { + content: "\f165"; } + +.fa-user-lock::before { + content: "\f502"; } + +.fa-arrow-right-long::before { + content: "\f178"; } + +.fa-long-arrow-right::before { + content: "\f178"; } + +.fa-anchor-circle-xmark::before { + content: "\e4ac"; } + +.fa-ellipsis::before { + content: "\f141"; } + +.fa-ellipsis-h::before { + content: "\f141"; } + +.fa-chess-pawn::before { + content: "\f443"; } + +.fa-kit-medical::before { + content: "\f479"; } + +.fa-first-aid::before { + content: "\f479"; } + +.fa-person-through-window::before { + content: "\e5a9"; } + +.fa-toolbox::before { + content: "\f552"; } + +.fa-hands-holding-circle::before { + content: "\e4fb"; } + +.fa-bug::before { + content: "\f188"; } + +.fa-credit-card::before { + content: "\f09d"; } + +.fa-credit-card-alt::before { + content: "\f09d"; } + +.fa-car::before { + content: "\f1b9"; } + +.fa-automobile::before { + content: "\f1b9"; } + +.fa-hand-holding-hand::before { + content: "\e4f7"; } + +.fa-book-open-reader::before { + content: "\f5da"; } + +.fa-book-reader::before { + content: "\f5da"; } + +.fa-mountain-sun::before { + content: "\e52f"; } + +.fa-arrows-left-right-to-line::before { + content: "\e4ba"; } + +.fa-dice-d20::before { + content: "\f6cf"; } + +.fa-truck-droplet::before { + content: "\e58c"; } + +.fa-file-circle-xmark::before { + content: "\e5a1"; } + +.fa-temperature-arrow-up::before { + content: "\e040"; } + +.fa-temperature-up::before { + content: "\e040"; } + +.fa-medal::before { + content: "\f5a2"; } + +.fa-bed::before { + content: "\f236"; } + +.fa-square-h::before { + content: "\f0fd"; } + +.fa-h-square::before { + content: "\f0fd"; } + +.fa-podcast::before { + content: "\f2ce"; } + +.fa-temperature-full::before { + content: "\f2c7"; } + +.fa-temperature-4::before { + content: "\f2c7"; } + +.fa-thermometer-4::before { + content: "\f2c7"; } + +.fa-thermometer-full::before { + content: "\f2c7"; } + +.fa-bell::before { + content: "\f0f3"; } + +.fa-superscript::before { + content: "\f12b"; } + +.fa-plug-circle-xmark::before { + content: "\e560"; } + +.fa-star-of-life::before { + content: "\f621"; } + +.fa-phone-slash::before { + content: "\f3dd"; } + +.fa-paint-roller::before { + content: "\f5aa"; } + +.fa-handshake-angle::before { + content: "\f4c4"; } + +.fa-hands-helping::before { + content: "\f4c4"; } + +.fa-location-dot::before { + content: "\f3c5"; } + +.fa-map-marker-alt::before { + content: "\f3c5"; } + +.fa-file::before { + content: "\f15b"; } + +.fa-greater-than::before { + content: "\3e"; } + +.fa-person-swimming::before { + content: "\f5c4"; } + +.fa-swimmer::before { + content: "\f5c4"; } + +.fa-arrow-down::before { + content: "\f063"; } + +.fa-droplet::before { + content: "\f043"; } + +.fa-tint::before { + content: "\f043"; } + +.fa-eraser::before { + content: "\f12d"; } + +.fa-earth-americas::before { + content: "\f57d"; } + +.fa-earth::before { + content: "\f57d"; } + +.fa-earth-america::before { + content: "\f57d"; } + +.fa-globe-americas::before { + content: "\f57d"; } + +.fa-person-burst::before { + content: "\e53b"; } + +.fa-dove::before { + content: "\f4ba"; } + +.fa-battery-empty::before { + content: "\f244"; } + +.fa-battery-0::before { + content: "\f244"; } + +.fa-socks::before { + content: "\f696"; } + +.fa-inbox::before { + content: "\f01c"; } + +.fa-section::before { + content: "\e447"; } + +.fa-gauge-high::before { + content: "\f625"; } + +.fa-tachometer-alt::before { + content: "\f625"; } + +.fa-tachometer-alt-fast::before { + content: "\f625"; } + +.fa-envelope-open-text::before { + content: "\f658"; } + +.fa-hospital::before { + content: "\f0f8"; } + +.fa-hospital-alt::before { + content: "\f0f8"; } + +.fa-hospital-wide::before { + content: "\f0f8"; } + +.fa-wine-bottle::before { + content: "\f72f"; } + +.fa-chess-rook::before { + content: "\f447"; } + +.fa-bars-staggered::before { + content: "\f550"; } + +.fa-reorder::before { + content: "\f550"; } + +.fa-stream::before { + content: "\f550"; } + +.fa-dharmachakra::before { + content: "\f655"; } + +.fa-hotdog::before { + content: "\f80f"; } + +.fa-person-walking-with-cane::before { + content: "\f29d"; } + +.fa-blind::before { + content: "\f29d"; } + +.fa-drum::before { + content: "\f569"; } + +.fa-ice-cream::before { + content: "\f810"; } + +.fa-heart-circle-bolt::before { + content: "\e4fc"; } + +.fa-fax::before { + content: "\f1ac"; } + +.fa-paragraph::before { + content: "\f1dd"; } + +.fa-check-to-slot::before { + content: "\f772"; } + +.fa-vote-yea::before { + content: "\f772"; } + +.fa-star-half::before { + content: "\f089"; } + +.fa-boxes-stacked::before { + content: "\f468"; } + +.fa-boxes::before { + content: "\f468"; } + +.fa-boxes-alt::before { + content: "\f468"; } + +.fa-link::before { + content: "\f0c1"; } + +.fa-chain::before { + content: "\f0c1"; } + +.fa-ear-listen::before { + content: "\f2a2"; } + +.fa-assistive-listening-systems::before { + content: "\f2a2"; } + +.fa-tree-city::before { + content: "\e587"; } + +.fa-play::before { + content: "\f04b"; } + +.fa-font::before { + content: "\f031"; } + +.fa-table-cells-row-lock::before { + content: "\e67a"; } + +.fa-rupiah-sign::before { + content: "\e23d"; } + +.fa-magnifying-glass::before { + content: "\f002"; } + +.fa-search::before { + content: "\f002"; } + +.fa-table-tennis-paddle-ball::before { + content: "\f45d"; } + +.fa-ping-pong-paddle-ball::before { + content: "\f45d"; } + +.fa-table-tennis::before { + content: "\f45d"; } + +.fa-person-dots-from-line::before { + content: "\f470"; } + +.fa-diagnoses::before { + content: "\f470"; } + +.fa-trash-can-arrow-up::before { + content: "\f82a"; } + +.fa-trash-restore-alt::before { + content: "\f82a"; } + +.fa-naira-sign::before { + content: "\e1f6"; } + +.fa-cart-arrow-down::before { + content: "\f218"; } + +.fa-walkie-talkie::before { + content: "\f8ef"; } + +.fa-file-pen::before { + content: "\f31c"; } + +.fa-file-edit::before { + content: "\f31c"; } + +.fa-receipt::before { + content: "\f543"; } + +.fa-square-pen::before { + content: "\f14b"; } + +.fa-pen-square::before { + content: "\f14b"; } + +.fa-pencil-square::before { + content: "\f14b"; } + +.fa-suitcase-rolling::before { + content: "\f5c1"; } + +.fa-person-circle-exclamation::before { + content: "\e53f"; } + +.fa-chevron-down::before { + content: "\f078"; } + +.fa-battery-full::before { + content: "\f240"; } + +.fa-battery::before { + content: "\f240"; } + +.fa-battery-5::before { + content: "\f240"; } + +.fa-skull-crossbones::before { + content: "\f714"; } + +.fa-code-compare::before { + content: "\e13a"; } + +.fa-list-ul::before { + content: "\f0ca"; } + +.fa-list-dots::before { + content: "\f0ca"; } + +.fa-school-lock::before { + content: "\e56f"; } + +.fa-tower-cell::before { + content: "\e585"; } + +.fa-down-long::before { + content: "\f309"; } + +.fa-long-arrow-alt-down::before { + content: "\f309"; } + +.fa-ranking-star::before { + content: "\e561"; } + +.fa-chess-king::before { + content: "\f43f"; } + +.fa-person-harassing::before { + content: "\e549"; } + +.fa-brazilian-real-sign::before { + content: "\e46c"; } + +.fa-landmark-dome::before { + content: "\f752"; } + +.fa-landmark-alt::before { + content: "\f752"; } + +.fa-arrow-up::before { + content: "\f062"; } + +.fa-tv::before { + content: "\f26c"; } + +.fa-television::before { + content: "\f26c"; } + +.fa-tv-alt::before { + content: "\f26c"; } + +.fa-shrimp::before { + content: "\e448"; } + +.fa-list-check::before { + content: "\f0ae"; } + +.fa-tasks::before { + content: "\f0ae"; } + +.fa-jug-detergent::before { + content: "\e519"; } + +.fa-circle-user::before { + content: "\f2bd"; } + +.fa-user-circle::before { + content: "\f2bd"; } + +.fa-user-shield::before { + content: "\f505"; } + +.fa-wind::before { + content: "\f72e"; } + +.fa-car-burst::before { + content: "\f5e1"; } + +.fa-car-crash::before { + content: "\f5e1"; } + +.fa-y::before { + content: "\59"; } + +.fa-person-snowboarding::before { + content: "\f7ce"; } + +.fa-snowboarding::before { + content: "\f7ce"; } + +.fa-truck-fast::before { + content: "\f48b"; } + +.fa-shipping-fast::before { + content: "\f48b"; } + +.fa-fish::before { + content: "\f578"; } + +.fa-user-graduate::before { + content: "\f501"; } + +.fa-circle-half-stroke::before { + content: "\f042"; } + +.fa-adjust::before { + content: "\f042"; } + +.fa-clapperboard::before { + content: "\e131"; } + +.fa-circle-radiation::before { + content: "\f7ba"; } + +.fa-radiation-alt::before { + content: "\f7ba"; } + +.fa-baseball::before { + content: "\f433"; } + +.fa-baseball-ball::before { + content: "\f433"; } + +.fa-jet-fighter-up::before { + content: "\e518"; } + +.fa-diagram-project::before { + content: "\f542"; } + +.fa-project-diagram::before { + content: "\f542"; } + +.fa-copy::before { + content: "\f0c5"; } + +.fa-volume-xmark::before { + content: "\f6a9"; } + +.fa-volume-mute::before { + content: "\f6a9"; } + +.fa-volume-times::before { + content: "\f6a9"; } + +.fa-hand-sparkles::before { + content: "\e05d"; } + +.fa-grip::before { + content: "\f58d"; } + +.fa-grip-horizontal::before { + content: "\f58d"; } + +.fa-share-from-square::before { + content: "\f14d"; } + +.fa-share-square::before { + content: "\f14d"; } + +.fa-child-combatant::before { + content: "\e4e0"; } + +.fa-child-rifle::before { + content: "\e4e0"; } + +.fa-gun::before { + content: "\e19b"; } + +.fa-square-phone::before { + content: "\f098"; } + +.fa-phone-square::before { + content: "\f098"; } + +.fa-plus::before { + content: "\2b"; } + +.fa-add::before { + content: "\2b"; } + +.fa-expand::before { + content: "\f065"; } + +.fa-computer::before { + content: "\e4e5"; } + +.fa-xmark::before { + content: "\f00d"; } + +.fa-close::before { + content: "\f00d"; } + +.fa-multiply::before { + content: "\f00d"; } + +.fa-remove::before { + content: "\f00d"; } + +.fa-times::before { + content: "\f00d"; } + +.fa-arrows-up-down-left-right::before { + content: "\f047"; } + +.fa-arrows::before { + content: "\f047"; } + +.fa-chalkboard-user::before { + content: "\f51c"; } + +.fa-chalkboard-teacher::before { + content: "\f51c"; } + +.fa-peso-sign::before { + content: "\e222"; } + +.fa-building-shield::before { + content: "\e4d8"; } + +.fa-baby::before { + content: "\f77c"; } + +.fa-users-line::before { + content: "\e592"; } + +.fa-quote-left::before { + content: "\f10d"; } + +.fa-quote-left-alt::before { + content: "\f10d"; } + +.fa-tractor::before { + content: "\f722"; } + +.fa-trash-arrow-up::before { + content: "\f829"; } + +.fa-trash-restore::before { + content: "\f829"; } + +.fa-arrow-down-up-lock::before { + content: "\e4b0"; } + +.fa-lines-leaning::before { + content: "\e51e"; } + +.fa-ruler-combined::before { + content: "\f546"; } + +.fa-copyright::before { + content: "\f1f9"; } + +.fa-equals::before { + content: "\3d"; } + +.fa-blender::before { + content: "\f517"; } + +.fa-teeth::before { + content: "\f62e"; } + +.fa-shekel-sign::before { + content: "\f20b"; } + +.fa-ils::before { + content: "\f20b"; } + +.fa-shekel::before { + content: "\f20b"; } + +.fa-sheqel::before { + content: "\f20b"; } + +.fa-sheqel-sign::before { + content: "\f20b"; } + +.fa-map::before { + content: "\f279"; } + +.fa-rocket::before { + content: "\f135"; } + +.fa-photo-film::before { + content: "\f87c"; } + +.fa-photo-video::before { + content: "\f87c"; } + +.fa-folder-minus::before { + content: "\f65d"; } + +.fa-store::before { + content: "\f54e"; } + +.fa-arrow-trend-up::before { + content: "\e098"; } + +.fa-plug-circle-minus::before { + content: "\e55e"; } + +.fa-sign-hanging::before { + content: "\f4d9"; } + +.fa-sign::before { + content: "\f4d9"; } + +.fa-bezier-curve::before { + content: "\f55b"; } + +.fa-bell-slash::before { + content: "\f1f6"; } + +.fa-tablet::before { + content: "\f3fb"; } + +.fa-tablet-android::before { + content: "\f3fb"; } + +.fa-school-flag::before { + content: "\e56e"; } + +.fa-fill::before { + content: "\f575"; } + +.fa-angle-up::before { + content: "\f106"; } + +.fa-drumstick-bite::before { + content: "\f6d7"; } + +.fa-holly-berry::before { + content: "\f7aa"; } + +.fa-chevron-left::before { + content: "\f053"; } + +.fa-bacteria::before { + content: "\e059"; } + +.fa-hand-lizard::before { + content: "\f258"; } + +.fa-notdef::before { + content: "\e1fe"; } + +.fa-disease::before { + content: "\f7fa"; } + +.fa-briefcase-medical::before { + content: "\f469"; } + +.fa-genderless::before { + content: "\f22d"; } + +.fa-chevron-right::before { + content: "\f054"; } + +.fa-retweet::before { + content: "\f079"; } + +.fa-car-rear::before { + content: "\f5de"; } + +.fa-car-alt::before { + content: "\f5de"; } + +.fa-pump-soap::before { + content: "\e06b"; } + +.fa-video-slash::before { + content: "\f4e2"; } + +.fa-battery-quarter::before { + content: "\f243"; } + +.fa-battery-2::before { + content: "\f243"; } + +.fa-radio::before { + content: "\f8d7"; } + +.fa-baby-carriage::before { + content: "\f77d"; } + +.fa-carriage-baby::before { + content: "\f77d"; } + +.fa-traffic-light::before { + content: "\f637"; } + +.fa-thermometer::before { + content: "\f491"; } + +.fa-vr-cardboard::before { + content: "\f729"; } + +.fa-hand-middle-finger::before { + content: "\f806"; } + +.fa-percent::before { + content: "\25"; } + +.fa-percentage::before { + content: "\25"; } + +.fa-truck-moving::before { + content: "\f4df"; } + +.fa-glass-water-droplet::before { + content: "\e4f5"; } + +.fa-display::before { + content: "\e163"; } + +.fa-face-smile::before { + content: "\f118"; } + +.fa-smile::before { + content: "\f118"; } + +.fa-thumbtack::before { + content: "\f08d"; } + +.fa-thumb-tack::before { + content: "\f08d"; } + +.fa-trophy::before { + content: "\f091"; } + +.fa-person-praying::before { + content: "\f683"; } + +.fa-pray::before { + content: "\f683"; } + +.fa-hammer::before { + content: "\f6e3"; } + +.fa-hand-peace::before { + content: "\f25b"; } + +.fa-rotate::before { + content: "\f2f1"; } + +.fa-sync-alt::before { + content: "\f2f1"; } + +.fa-spinner::before { + content: "\f110"; } + +.fa-robot::before { + content: "\f544"; } + +.fa-peace::before { + content: "\f67c"; } + +.fa-gears::before { + content: "\f085"; } + +.fa-cogs::before { + content: "\f085"; } + +.fa-warehouse::before { + content: "\f494"; } + +.fa-arrow-up-right-dots::before { + content: "\e4b7"; } + +.fa-splotch::before { + content: "\f5bc"; } + +.fa-face-grin-hearts::before { + content: "\f584"; } + +.fa-grin-hearts::before { + content: "\f584"; } + +.fa-dice-four::before { + content: "\f524"; } + +.fa-sim-card::before { + content: "\f7c4"; } + +.fa-transgender::before { + content: "\f225"; } + +.fa-transgender-alt::before { + content: "\f225"; } + +.fa-mercury::before { + content: "\f223"; } + +.fa-arrow-turn-down::before { + content: "\f149"; } + +.fa-level-down::before { + content: "\f149"; } + +.fa-person-falling-burst::before { + content: "\e547"; } + +.fa-award::before { + content: "\f559"; } + +.fa-ticket-simple::before { + content: "\f3ff"; } + +.fa-ticket-alt::before { + content: "\f3ff"; } + +.fa-building::before { + content: "\f1ad"; } + +.fa-angles-left::before { + content: "\f100"; } + +.fa-angle-double-left::before { + content: "\f100"; } + +.fa-qrcode::before { + content: "\f029"; } + +.fa-clock-rotate-left::before { + content: "\f1da"; } + +.fa-history::before { + content: "\f1da"; } + +.fa-face-grin-beam-sweat::before { + content: "\f583"; } + +.fa-grin-beam-sweat::before { + content: "\f583"; } + +.fa-file-export::before { + content: "\f56e"; } + +.fa-arrow-right-from-file::before { + content: "\f56e"; } + +.fa-shield::before { + content: "\f132"; } + +.fa-shield-blank::before { + content: "\f132"; } + +.fa-arrow-up-short-wide::before { + content: "\f885"; } + +.fa-sort-amount-up-alt::before { + content: "\f885"; } + +.fa-house-medical::before { + content: "\e3b2"; } + +.fa-golf-ball-tee::before { + content: "\f450"; } + +.fa-golf-ball::before { + content: "\f450"; } + +.fa-circle-chevron-left::before { + content: "\f137"; } + +.fa-chevron-circle-left::before { + content: "\f137"; } + +.fa-house-chimney-window::before { + content: "\e00d"; } + +.fa-pen-nib::before { + content: "\f5ad"; } + +.fa-tent-arrow-turn-left::before { + content: "\e580"; } + +.fa-tents::before { + content: "\e582"; } + +.fa-wand-magic::before { + content: "\f0d0"; } + +.fa-magic::before { + content: "\f0d0"; } + +.fa-dog::before { + content: "\f6d3"; } + +.fa-carrot::before { + content: "\f787"; } + +.fa-moon::before { + content: "\f186"; } + +.fa-wine-glass-empty::before { + content: "\f5ce"; } + +.fa-wine-glass-alt::before { + content: "\f5ce"; } + +.fa-cheese::before { + content: "\f7ef"; } + +.fa-yin-yang::before { + content: "\f6ad"; } + +.fa-music::before { + content: "\f001"; } + +.fa-code-commit::before { + content: "\f386"; } + +.fa-temperature-low::before { + content: "\f76b"; } + +.fa-person-biking::before { + content: "\f84a"; } + +.fa-biking::before { + content: "\f84a"; } + +.fa-broom::before { + content: "\f51a"; } + +.fa-shield-heart::before { + content: "\e574"; } + +.fa-gopuram::before { + content: "\f664"; } + +.fa-earth-oceania::before { + content: "\e47b"; } + +.fa-globe-oceania::before { + content: "\e47b"; } + +.fa-square-xmark::before { + content: "\f2d3"; } + +.fa-times-square::before { + content: "\f2d3"; } + +.fa-xmark-square::before { + content: "\f2d3"; } + +.fa-hashtag::before { + content: "\23"; } + +.fa-up-right-and-down-left-from-center::before { + content: "\f424"; } + +.fa-expand-alt::before { + content: "\f424"; } + +.fa-oil-can::before { + content: "\f613"; } + +.fa-t::before { + content: "\54"; } + +.fa-hippo::before { + content: "\f6ed"; } + +.fa-chart-column::before { + content: "\e0e3"; } + +.fa-infinity::before { + content: "\f534"; } + +.fa-vial-circle-check::before { + content: "\e596"; } + +.fa-person-arrow-down-to-line::before { + content: "\e538"; } + +.fa-voicemail::before { + content: "\f897"; } + +.fa-fan::before { + content: "\f863"; } + +.fa-person-walking-luggage::before { + content: "\e554"; } + +.fa-up-down::before { + content: "\f338"; } + +.fa-arrows-alt-v::before { + content: "\f338"; } + +.fa-cloud-moon-rain::before { + content: "\f73c"; } + +.fa-calendar::before { + content: "\f133"; } + +.fa-trailer::before { + content: "\e041"; } + +.fa-bahai::before { + content: "\f666"; } + +.fa-haykal::before { + content: "\f666"; } + +.fa-sd-card::before { + content: "\f7c2"; } + +.fa-dragon::before { + content: "\f6d5"; } + +.fa-shoe-prints::before { + content: "\f54b"; } + +.fa-circle-plus::before { + content: "\f055"; } + +.fa-plus-circle::before { + content: "\f055"; } + +.fa-face-grin-tongue-wink::before { + content: "\f58b"; } + +.fa-grin-tongue-wink::before { + content: "\f58b"; } + +.fa-hand-holding::before { + content: "\f4bd"; } + +.fa-plug-circle-exclamation::before { + content: "\e55d"; } + +.fa-link-slash::before { + content: "\f127"; } + +.fa-chain-broken::before { + content: "\f127"; } + +.fa-chain-slash::before { + content: "\f127"; } + +.fa-unlink::before { + content: "\f127"; } + +.fa-clone::before { + content: "\f24d"; } + +.fa-person-walking-arrow-loop-left::before { + content: "\e551"; } + +.fa-arrow-up-z-a::before { + content: "\f882"; } + +.fa-sort-alpha-up-alt::before { + content: "\f882"; } + +.fa-fire-flame-curved::before { + content: "\f7e4"; } + +.fa-fire-alt::before { + content: "\f7e4"; } + +.fa-tornado::before { + content: "\f76f"; } + +.fa-file-circle-plus::before { + content: "\e494"; } + +.fa-book-quran::before { + content: "\f687"; } + +.fa-quran::before { + content: "\f687"; } + +.fa-anchor::before { + content: "\f13d"; } + +.fa-border-all::before { + content: "\f84c"; } + +.fa-face-angry::before { + content: "\f556"; } + +.fa-angry::before { + content: "\f556"; } + +.fa-cookie-bite::before { + content: "\f564"; } + +.fa-arrow-trend-down::before { + content: "\e097"; } + +.fa-rss::before { + content: "\f09e"; } + +.fa-feed::before { + content: "\f09e"; } + +.fa-draw-polygon::before { + content: "\f5ee"; } + +.fa-scale-balanced::before { + content: "\f24e"; } + +.fa-balance-scale::before { + content: "\f24e"; } + +.fa-gauge-simple-high::before { + content: "\f62a"; } + +.fa-tachometer::before { + content: "\f62a"; } + +.fa-tachometer-fast::before { + content: "\f62a"; } + +.fa-shower::before { + content: "\f2cc"; } + +.fa-desktop::before { + content: "\f390"; } + +.fa-desktop-alt::before { + content: "\f390"; } + +.fa-m::before { + content: "\4d"; } + +.fa-table-list::before { + content: "\f00b"; } + +.fa-th-list::before { + content: "\f00b"; } + +.fa-comment-sms::before { + content: "\f7cd"; } + +.fa-sms::before { + content: "\f7cd"; } + +.fa-book::before { + content: "\f02d"; } + +.fa-user-plus::before { + content: "\f234"; } + +.fa-check::before { + content: "\f00c"; } + +.fa-battery-three-quarters::before { + content: "\f241"; } + +.fa-battery-4::before { + content: "\f241"; } + +.fa-house-circle-check::before { + content: "\e509"; } + +.fa-angle-left::before { + content: "\f104"; } + +.fa-diagram-successor::before { + content: "\e47a"; } + +.fa-truck-arrow-right::before { + content: "\e58b"; } + +.fa-arrows-split-up-and-left::before { + content: "\e4bc"; } + +.fa-hand-fist::before { + content: "\f6de"; } + +.fa-fist-raised::before { + content: "\f6de"; } + +.fa-cloud-moon::before { + content: "\f6c3"; } + +.fa-briefcase::before { + content: "\f0b1"; } + +.fa-person-falling::before { + content: "\e546"; } + +.fa-image-portrait::before { + content: "\f3e0"; } + +.fa-portrait::before { + content: "\f3e0"; } + +.fa-user-tag::before { + content: "\f507"; } + +.fa-rug::before { + content: "\e569"; } + +.fa-earth-europe::before { + content: "\f7a2"; } + +.fa-globe-europe::before { + content: "\f7a2"; } + +.fa-cart-flatbed-suitcase::before { + content: "\f59d"; } + +.fa-luggage-cart::before { + content: "\f59d"; } + +.fa-rectangle-xmark::before { + content: "\f410"; } + +.fa-rectangle-times::before { + content: "\f410"; } + +.fa-times-rectangle::before { + content: "\f410"; } + +.fa-window-close::before { + content: "\f410"; } + +.fa-baht-sign::before { + content: "\e0ac"; } + +.fa-book-open::before { + content: "\f518"; } + +.fa-book-journal-whills::before { + content: "\f66a"; } + +.fa-journal-whills::before { + content: "\f66a"; } + +.fa-handcuffs::before { + content: "\e4f8"; } + +.fa-triangle-exclamation::before { + content: "\f071"; } + +.fa-exclamation-triangle::before { + content: "\f071"; } + +.fa-warning::before { + content: "\f071"; } + +.fa-database::before { + content: "\f1c0"; } + +.fa-share::before { + content: "\f064"; } + +.fa-mail-forward::before { + content: "\f064"; } + +.fa-bottle-droplet::before { + content: "\e4c4"; } + +.fa-mask-face::before { + content: "\e1d7"; } + +.fa-hill-rockslide::before { + content: "\e508"; } + +.fa-right-left::before { + content: "\f362"; } + +.fa-exchange-alt::before { + content: "\f362"; } + +.fa-paper-plane::before { + content: "\f1d8"; } + +.fa-road-circle-exclamation::before { + content: "\e565"; } + +.fa-dungeon::before { + content: "\f6d9"; } + +.fa-align-right::before { + content: "\f038"; } + +.fa-money-bill-1-wave::before { + content: "\f53b"; } + +.fa-money-bill-wave-alt::before { + content: "\f53b"; } + +.fa-life-ring::before { + content: "\f1cd"; } + +.fa-hands::before { + content: "\f2a7"; } + +.fa-sign-language::before { + content: "\f2a7"; } + +.fa-signing::before { + content: "\f2a7"; } + +.fa-calendar-day::before { + content: "\f783"; } + +.fa-water-ladder::before { + content: "\f5c5"; } + +.fa-ladder-water::before { + content: "\f5c5"; } + +.fa-swimming-pool::before { + content: "\f5c5"; } + +.fa-arrows-up-down::before { + content: "\f07d"; } + +.fa-arrows-v::before { + content: "\f07d"; } + +.fa-face-grimace::before { + content: "\f57f"; } + +.fa-grimace::before { + content: "\f57f"; } + +.fa-wheelchair-move::before { + content: "\e2ce"; } + +.fa-wheelchair-alt::before { + content: "\e2ce"; } + +.fa-turn-down::before { + content: "\f3be"; } + +.fa-level-down-alt::before { + content: "\f3be"; } + +.fa-person-walking-arrow-right::before { + content: "\e552"; } + +.fa-square-envelope::before { + content: "\f199"; } + +.fa-envelope-square::before { + content: "\f199"; } + +.fa-dice::before { + content: "\f522"; } + +.fa-bowling-ball::before { + content: "\f436"; } + +.fa-brain::before { + content: "\f5dc"; } + +.fa-bandage::before { + content: "\f462"; } + +.fa-band-aid::before { + content: "\f462"; } + +.fa-calendar-minus::before { + content: "\f272"; } + +.fa-circle-xmark::before { + content: "\f057"; } + +.fa-times-circle::before { + content: "\f057"; } + +.fa-xmark-circle::before { + content: "\f057"; } + +.fa-gifts::before { + content: "\f79c"; } + +.fa-hotel::before { + content: "\f594"; } + +.fa-earth-asia::before { + content: "\f57e"; } + +.fa-globe-asia::before { + content: "\f57e"; } + +.fa-id-card-clip::before { + content: "\f47f"; } + +.fa-id-card-alt::before { + content: "\f47f"; } + +.fa-magnifying-glass-plus::before { + content: "\f00e"; } + +.fa-search-plus::before { + content: "\f00e"; } + +.fa-thumbs-up::before { + content: "\f164"; } + +.fa-user-clock::before { + content: "\f4fd"; } + +.fa-hand-dots::before { + content: "\f461"; } + +.fa-allergies::before { + content: "\f461"; } + +.fa-file-invoice::before { + content: "\f570"; } + +.fa-window-minimize::before { + content: "\f2d1"; } + +.fa-mug-saucer::before { + content: "\f0f4"; } + +.fa-coffee::before { + content: "\f0f4"; } + +.fa-brush::before { + content: "\f55d"; } + +.fa-mask::before { + content: "\f6fa"; } + +.fa-magnifying-glass-minus::before { + content: "\f010"; } + +.fa-search-minus::before { + content: "\f010"; } + +.fa-ruler-vertical::before { + content: "\f548"; } + +.fa-user-large::before { + content: "\f406"; } + +.fa-user-alt::before { + content: "\f406"; } + +.fa-train-tram::before { + content: "\e5b4"; } + +.fa-user-nurse::before { + content: "\f82f"; } + +.fa-syringe::before { + content: "\f48e"; } + +.fa-cloud-sun::before { + content: "\f6c4"; } + +.fa-stopwatch-20::before { + content: "\e06f"; } + +.fa-square-full::before { + content: "\f45c"; } + +.fa-magnet::before { + content: "\f076"; } + +.fa-jar::before { + content: "\e516"; } + +.fa-note-sticky::before { + content: "\f249"; } + +.fa-sticky-note::before { + content: "\f249"; } + +.fa-bug-slash::before { + content: "\e490"; } + +.fa-arrow-up-from-water-pump::before { + content: "\e4b6"; } + +.fa-bone::before { + content: "\f5d7"; } + +.fa-user-injured::before { + content: "\f728"; } + +.fa-face-sad-tear::before { + content: "\f5b4"; } + +.fa-sad-tear::before { + content: "\f5b4"; } + +.fa-plane::before { + content: "\f072"; } + +.fa-tent-arrows-down::before { + content: "\e581"; } + +.fa-exclamation::before { + content: "\21"; } + +.fa-arrows-spin::before { + content: "\e4bb"; } + +.fa-print::before { + content: "\f02f"; } + +.fa-turkish-lira-sign::before { + content: "\e2bb"; } + +.fa-try::before { + content: "\e2bb"; } + +.fa-turkish-lira::before { + content: "\e2bb"; } + +.fa-dollar-sign::before { + content: "\24"; } + +.fa-dollar::before { + content: "\24"; } + +.fa-usd::before { + content: "\24"; } + +.fa-x::before { + content: "\58"; } + +.fa-magnifying-glass-dollar::before { + content: "\f688"; } + +.fa-search-dollar::before { + content: "\f688"; } + +.fa-users-gear::before { + content: "\f509"; } + +.fa-users-cog::before { + content: "\f509"; } + +.fa-person-military-pointing::before { + content: "\e54a"; } + +.fa-building-columns::before { + content: "\f19c"; } + +.fa-bank::before { + content: "\f19c"; } + +.fa-institution::before { + content: "\f19c"; } + +.fa-museum::before { + content: "\f19c"; } + +.fa-university::before { + content: "\f19c"; } + +.fa-umbrella::before { + content: "\f0e9"; } + +.fa-trowel::before { + content: "\e589"; } + +.fa-d::before { + content: "\44"; } + +.fa-stapler::before { + content: "\e5af"; } + +.fa-masks-theater::before { + content: "\f630"; } + +.fa-theater-masks::before { + content: "\f630"; } + +.fa-kip-sign::before { + content: "\e1c4"; } + +.fa-hand-point-left::before { + content: "\f0a5"; } + +.fa-handshake-simple::before { + content: "\f4c6"; } + +.fa-handshake-alt::before { + content: "\f4c6"; } + +.fa-jet-fighter::before { + content: "\f0fb"; } + +.fa-fighter-jet::before { + content: "\f0fb"; } + +.fa-square-share-nodes::before { + content: "\f1e1"; } + +.fa-share-alt-square::before { + content: "\f1e1"; } + +.fa-barcode::before { + content: "\f02a"; } + +.fa-plus-minus::before { + content: "\e43c"; } + +.fa-video::before { + content: "\f03d"; } + +.fa-video-camera::before { + content: "\f03d"; } + +.fa-graduation-cap::before { + content: "\f19d"; } + +.fa-mortar-board::before { + content: "\f19d"; } + +.fa-hand-holding-medical::before { + content: "\e05c"; } + +.fa-person-circle-check::before { + content: "\e53e"; } + +.fa-turn-up::before { + content: "\f3bf"; } + +.fa-level-up-alt::before { + content: "\f3bf"; } + +.sr-only, +.fa-sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; } + +.sr-only-focusable:not(:focus), +.fa-sr-only-focusable:not(:focus) { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; } +:root, :host { + --fa-style-family-brands: 'Font Awesome 6 Brands'; + --fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; } + +@font-face { + font-family: 'Font Awesome 6 Brands'; + font-style: normal; + font-weight: 400; + font-display: block; + src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); } + +.fab, +.fa-brands { + font-weight: 400; } + +.fa-monero:before { + content: "\f3d0"; } + +.fa-hooli:before { + content: "\f427"; } + +.fa-yelp:before { + content: "\f1e9"; } + +.fa-cc-visa:before { + content: "\f1f0"; } + +.fa-lastfm:before { + content: "\f202"; } + +.fa-shopware:before { + content: "\f5b5"; } + +.fa-creative-commons-nc:before { + content: "\f4e8"; } + +.fa-aws:before { + content: "\f375"; } + +.fa-redhat:before { + content: "\f7bc"; } + +.fa-yoast:before { + content: "\f2b1"; } + +.fa-cloudflare:before { + content: "\e07d"; } + +.fa-ups:before { + content: "\f7e0"; } + +.fa-pixiv:before { + content: "\e640"; } + +.fa-wpexplorer:before { + content: "\f2de"; } + +.fa-dyalog:before { + content: "\f399"; } + +.fa-bity:before { + content: "\f37a"; } + +.fa-stackpath:before { + content: "\f842"; } + +.fa-buysellads:before { + content: "\f20d"; } + +.fa-first-order:before { + content: "\f2b0"; } + +.fa-modx:before { + content: "\f285"; } + +.fa-guilded:before { + content: "\e07e"; } + +.fa-vnv:before { + content: "\f40b"; } + +.fa-square-js:before { + content: "\f3b9"; } + +.fa-js-square:before { + content: "\f3b9"; } + +.fa-microsoft:before { + content: "\f3ca"; } + +.fa-qq:before { + content: "\f1d6"; } + +.fa-orcid:before { + content: "\f8d2"; } + +.fa-java:before { + content: "\f4e4"; } + +.fa-invision:before { + content: "\f7b0"; } + +.fa-creative-commons-pd-alt:before { + content: "\f4ed"; } + +.fa-centercode:before { + content: "\f380"; } + +.fa-glide-g:before { + content: "\f2a6"; } + +.fa-drupal:before { + content: "\f1a9"; } + +.fa-jxl:before { + content: "\e67b"; } + +.fa-hire-a-helper:before { + content: "\f3b0"; } + +.fa-creative-commons-by:before { + content: "\f4e7"; } + +.fa-unity:before { + content: "\e049"; } + +.fa-whmcs:before { + content: "\f40d"; } + +.fa-rocketchat:before { + content: "\f3e8"; } + +.fa-vk:before { + content: "\f189"; } + +.fa-untappd:before { + content: "\f405"; } + +.fa-mailchimp:before { + content: "\f59e"; } + +.fa-css3-alt:before { + content: "\f38b"; } + +.fa-square-reddit:before { + content: "\f1a2"; } + +.fa-reddit-square:before { + content: "\f1a2"; } + +.fa-vimeo-v:before { + content: "\f27d"; } + +.fa-contao:before { + content: "\f26d"; } + +.fa-square-font-awesome:before { + content: "\e5ad"; } + +.fa-deskpro:before { + content: "\f38f"; } + +.fa-brave:before { + content: "\e63c"; } + +.fa-sistrix:before { + content: "\f3ee"; } + +.fa-square-instagram:before { + content: "\e055"; } + +.fa-instagram-square:before { + content: "\e055"; } + +.fa-battle-net:before { + content: "\f835"; } + +.fa-the-red-yeti:before { + content: "\f69d"; } + +.fa-square-hacker-news:before { + content: "\f3af"; } + +.fa-hacker-news-square:before { + content: "\f3af"; } + +.fa-edge:before { + content: "\f282"; } + +.fa-threads:before { + content: "\e618"; } + +.fa-napster:before { + content: "\f3d2"; } + +.fa-square-snapchat:before { + content: "\f2ad"; } + +.fa-snapchat-square:before { + content: "\f2ad"; } + +.fa-google-plus-g:before { + content: "\f0d5"; } + +.fa-artstation:before { + content: "\f77a"; } + +.fa-markdown:before { + content: "\f60f"; } + +.fa-sourcetree:before { + content: "\f7d3"; } + +.fa-google-plus:before { + content: "\f2b3"; } + +.fa-diaspora:before { + content: "\f791"; } + +.fa-foursquare:before { + content: "\f180"; } + +.fa-stack-overflow:before { + content: "\f16c"; } + +.fa-github-alt:before { + content: "\f113"; } + +.fa-phoenix-squadron:before { + content: "\f511"; } + +.fa-pagelines:before { + content: "\f18c"; } + +.fa-algolia:before { + content: "\f36c"; } + +.fa-red-river:before { + content: "\f3e3"; } + +.fa-creative-commons-sa:before { + content: "\f4ef"; } + +.fa-safari:before { + content: "\f267"; } + +.fa-google:before { + content: "\f1a0"; } + +.fa-square-font-awesome-stroke:before { + content: "\f35c"; } + +.fa-font-awesome-alt:before { + content: "\f35c"; } + +.fa-atlassian:before { + content: "\f77b"; } + +.fa-linkedin-in:before { + content: "\f0e1"; } + +.fa-digital-ocean:before { + content: "\f391"; } + +.fa-nimblr:before { + content: "\f5a8"; } + +.fa-chromecast:before { + content: "\f838"; } + +.fa-evernote:before { + content: "\f839"; } + +.fa-hacker-news:before { + content: "\f1d4"; } + +.fa-creative-commons-sampling:before { + content: "\f4f0"; } + +.fa-adversal:before { + content: "\f36a"; } + +.fa-creative-commons:before { + content: "\f25e"; } + +.fa-watchman-monitoring:before { + content: "\e087"; } + +.fa-fonticons:before { + content: "\f280"; } + +.fa-weixin:before { + content: "\f1d7"; } + +.fa-shirtsinbulk:before { + content: "\f214"; } + +.fa-codepen:before { + content: "\f1cb"; } + +.fa-git-alt:before { + content: "\f841"; } + +.fa-lyft:before { + content: "\f3c3"; } + +.fa-rev:before { + content: "\f5b2"; } + +.fa-windows:before { + content: "\f17a"; } + +.fa-wizards-of-the-coast:before { + content: "\f730"; } + +.fa-square-viadeo:before { + content: "\f2aa"; } + +.fa-viadeo-square:before { + content: "\f2aa"; } + +.fa-meetup:before { + content: "\f2e0"; } + +.fa-centos:before { + content: "\f789"; } + +.fa-adn:before { + content: "\f170"; } + +.fa-cloudsmith:before { + content: "\f384"; } + +.fa-opensuse:before { + content: "\e62b"; } + +.fa-pied-piper-alt:before { + content: "\f1a8"; } + +.fa-square-dribbble:before { + content: "\f397"; } + +.fa-dribbble-square:before { + content: "\f397"; } + +.fa-codiepie:before { + content: "\f284"; } + +.fa-node:before { + content: "\f419"; } + +.fa-mix:before { + content: "\f3cb"; } + +.fa-steam:before { + content: "\f1b6"; } + +.fa-cc-apple-pay:before { + content: "\f416"; } + +.fa-scribd:before { + content: "\f28a"; } + +.fa-debian:before { + content: "\e60b"; } + +.fa-openid:before { + content: "\f19b"; } + +.fa-instalod:before { + content: "\e081"; } + +.fa-expeditedssl:before { + content: "\f23e"; } + +.fa-sellcast:before { + content: "\f2da"; } + +.fa-square-twitter:before { + content: "\f081"; } + +.fa-twitter-square:before { + content: "\f081"; } + +.fa-r-project:before { + content: "\f4f7"; } + +.fa-delicious:before { + content: "\f1a5"; } + +.fa-freebsd:before { + content: "\f3a4"; } + +.fa-vuejs:before { + content: "\f41f"; } + +.fa-accusoft:before { + content: "\f369"; } + +.fa-ioxhost:before { + content: "\f208"; } + +.fa-fonticons-fi:before { + content: "\f3a2"; } + +.fa-app-store:before { + content: "\f36f"; } + +.fa-cc-mastercard:before { + content: "\f1f1"; } + +.fa-itunes-note:before { + content: "\f3b5"; } + +.fa-golang:before { + content: "\e40f"; } + +.fa-kickstarter:before { + content: "\f3bb"; } + +.fa-square-kickstarter:before { + content: "\f3bb"; } + +.fa-grav:before { + content: "\f2d6"; } + +.fa-weibo:before { + content: "\f18a"; } + +.fa-uncharted:before { + content: "\e084"; } + +.fa-firstdraft:before { + content: "\f3a1"; } + +.fa-square-youtube:before { + content: "\f431"; } + +.fa-youtube-square:before { + content: "\f431"; } + +.fa-wikipedia-w:before { + content: "\f266"; } + +.fa-wpressr:before { + content: "\f3e4"; } + +.fa-rendact:before { + content: "\f3e4"; } + +.fa-angellist:before { + content: "\f209"; } + +.fa-galactic-republic:before { + content: "\f50c"; } + +.fa-nfc-directional:before { + content: "\e530"; } + +.fa-skype:before { + content: "\f17e"; } + +.fa-joget:before { + content: "\f3b7"; } + +.fa-fedora:before { + content: "\f798"; } + +.fa-stripe-s:before { + content: "\f42a"; } + +.fa-meta:before { + content: "\e49b"; } + +.fa-laravel:before { + content: "\f3bd"; } + +.fa-hotjar:before { + content: "\f3b1"; } + +.fa-bluetooth-b:before { + content: "\f294"; } + +.fa-square-letterboxd:before { + content: "\e62e"; } + +.fa-sticker-mule:before { + content: "\f3f7"; } + +.fa-creative-commons-zero:before { + content: "\f4f3"; } + +.fa-hips:before { + content: "\f452"; } + +.fa-behance:before { + content: "\f1b4"; } + +.fa-reddit:before { + content: "\f1a1"; } + +.fa-discord:before { + content: "\f392"; } + +.fa-chrome:before { + content: "\f268"; } + +.fa-app-store-ios:before { + content: "\f370"; } + +.fa-cc-discover:before { + content: "\f1f2"; } + +.fa-wpbeginner:before { + content: "\f297"; } + +.fa-confluence:before { + content: "\f78d"; } + +.fa-shoelace:before { + content: "\e60c"; } + +.fa-mdb:before { + content: "\f8ca"; } + +.fa-dochub:before { + content: "\f394"; } + +.fa-accessible-icon:before { + content: "\f368"; } + +.fa-ebay:before { + content: "\f4f4"; } + +.fa-amazon:before { + content: "\f270"; } + +.fa-unsplash:before { + content: "\e07c"; } + +.fa-yarn:before { + content: "\f7e3"; } + +.fa-square-steam:before { + content: "\f1b7"; } + +.fa-steam-square:before { + content: "\f1b7"; } + +.fa-500px:before { + content: "\f26e"; } + +.fa-square-vimeo:before { + content: "\f194"; } + +.fa-vimeo-square:before { + content: "\f194"; } + +.fa-asymmetrik:before { + content: "\f372"; } + +.fa-font-awesome:before { + content: "\f2b4"; } + +.fa-font-awesome-flag:before { + content: "\f2b4"; } + +.fa-font-awesome-logo-full:before { + content: "\f2b4"; } + +.fa-gratipay:before { + content: "\f184"; } + +.fa-apple:before { + content: "\f179"; } + +.fa-hive:before { + content: "\e07f"; } + +.fa-gitkraken:before { + content: "\f3a6"; } + +.fa-keybase:before { + content: "\f4f5"; } + +.fa-apple-pay:before { + content: "\f415"; } + +.fa-padlet:before { + content: "\e4a0"; } + +.fa-amazon-pay:before { + content: "\f42c"; } + +.fa-square-github:before { + content: "\f092"; } + +.fa-github-square:before { + content: "\f092"; } + +.fa-stumbleupon:before { + content: "\f1a4"; } + +.fa-fedex:before { + content: "\f797"; } + +.fa-phoenix-framework:before { + content: "\f3dc"; } + +.fa-shopify:before { + content: "\e057"; } + +.fa-neos:before { + content: "\f612"; } + +.fa-square-threads:before { + content: "\e619"; } + +.fa-hackerrank:before { + content: "\f5f7"; } + +.fa-researchgate:before { + content: "\f4f8"; } + +.fa-swift:before { + content: "\f8e1"; } + +.fa-angular:before { + content: "\f420"; } + +.fa-speakap:before { + content: "\f3f3"; } + +.fa-angrycreative:before { + content: "\f36e"; } + +.fa-y-combinator:before { + content: "\f23b"; } + +.fa-empire:before { + content: "\f1d1"; } + +.fa-envira:before { + content: "\f299"; } + +.fa-google-scholar:before { + content: "\e63b"; } + +.fa-square-gitlab:before { + content: "\e5ae"; } + +.fa-gitlab-square:before { + content: "\e5ae"; } + +.fa-studiovinari:before { + content: "\f3f8"; } + +.fa-pied-piper:before { + content: "\f2ae"; } + +.fa-wordpress:before { + content: "\f19a"; } + +.fa-product-hunt:before { + content: "\f288"; } + +.fa-firefox:before { + content: "\f269"; } + +.fa-linode:before { + content: "\f2b8"; } + +.fa-goodreads:before { + content: "\f3a8"; } + +.fa-square-odnoklassniki:before { + content: "\f264"; } + +.fa-odnoklassniki-square:before { + content: "\f264"; } + +.fa-jsfiddle:before { + content: "\f1cc"; } + +.fa-sith:before { + content: "\f512"; } + +.fa-themeisle:before { + content: "\f2b2"; } + +.fa-page4:before { + content: "\f3d7"; } + +.fa-hashnode:before { + content: "\e499"; } + +.fa-react:before { + content: "\f41b"; } + +.fa-cc-paypal:before { + content: "\f1f4"; } + +.fa-squarespace:before { + content: "\f5be"; } + +.fa-cc-stripe:before { + content: "\f1f5"; } + +.fa-creative-commons-share:before { + content: "\f4f2"; } + +.fa-bitcoin:before { + content: "\f379"; } + +.fa-keycdn:before { + content: "\f3ba"; } + +.fa-opera:before { + content: "\f26a"; } + +.fa-itch-io:before { + content: "\f83a"; } + +.fa-umbraco:before { + content: "\f8e8"; } + +.fa-galactic-senate:before { + content: "\f50d"; } + +.fa-ubuntu:before { + content: "\f7df"; } + +.fa-draft2digital:before { + content: "\f396"; } + +.fa-stripe:before { + content: "\f429"; } + +.fa-houzz:before { + content: "\f27c"; } + +.fa-gg:before { + content: "\f260"; } + +.fa-dhl:before { + content: "\f790"; } + +.fa-square-pinterest:before { + content: "\f0d3"; } + +.fa-pinterest-square:before { + content: "\f0d3"; } + +.fa-xing:before { + content: "\f168"; } + +.fa-blackberry:before { + content: "\f37b"; } + +.fa-creative-commons-pd:before { + content: "\f4ec"; } + +.fa-playstation:before { + content: "\f3df"; } + +.fa-quinscape:before { + content: "\f459"; } + +.fa-less:before { + content: "\f41d"; } + +.fa-blogger-b:before { + content: "\f37d"; } + +.fa-opencart:before { + content: "\f23d"; } + +.fa-vine:before { + content: "\f1ca"; } + +.fa-signal-messenger:before { + content: "\e663"; } + +.fa-paypal:before { + content: "\f1ed"; } + +.fa-gitlab:before { + content: "\f296"; } + +.fa-typo3:before { + content: "\f42b"; } + +.fa-reddit-alien:before { + content: "\f281"; } + +.fa-yahoo:before { + content: "\f19e"; } + +.fa-dailymotion:before { + content: "\e052"; } + +.fa-affiliatetheme:before { + content: "\f36b"; } + +.fa-pied-piper-pp:before { + content: "\f1a7"; } + +.fa-bootstrap:before { + content: "\f836"; } + +.fa-odnoklassniki:before { + content: "\f263"; } + +.fa-nfc-symbol:before { + content: "\e531"; } + +.fa-mintbit:before { + content: "\e62f"; } + +.fa-ethereum:before { + content: "\f42e"; } + +.fa-speaker-deck:before { + content: "\f83c"; } + +.fa-creative-commons-nc-eu:before { + content: "\f4e9"; } + +.fa-patreon:before { + content: "\f3d9"; } + +.fa-avianex:before { + content: "\f374"; } + +.fa-ello:before { + content: "\f5f1"; } + +.fa-gofore:before { + content: "\f3a7"; } + +.fa-bimobject:before { + content: "\f378"; } + +.fa-brave-reverse:before { + content: "\e63d"; } + +.fa-facebook-f:before { + content: "\f39e"; } + +.fa-square-google-plus:before { + content: "\f0d4"; } + +.fa-google-plus-square:before { + content: "\f0d4"; } + +.fa-web-awesome:before { + content: "\e682"; } + +.fa-mandalorian:before { + content: "\f50f"; } + +.fa-first-order-alt:before { + content: "\f50a"; } + +.fa-osi:before { + content: "\f41a"; } + +.fa-google-wallet:before { + content: "\f1ee"; } + +.fa-d-and-d-beyond:before { + content: "\f6ca"; } + +.fa-periscope:before { + content: "\f3da"; } + +.fa-fulcrum:before { + content: "\f50b"; } + +.fa-cloudscale:before { + content: "\f383"; } + +.fa-forumbee:before { + content: "\f211"; } + +.fa-mizuni:before { + content: "\f3cc"; } + +.fa-schlix:before { + content: "\f3ea"; } + +.fa-square-xing:before { + content: "\f169"; } + +.fa-xing-square:before { + content: "\f169"; } + +.fa-bandcamp:before { + content: "\f2d5"; } + +.fa-wpforms:before { + content: "\f298"; } + +.fa-cloudversify:before { + content: "\f385"; } + +.fa-usps:before { + content: "\f7e1"; } + +.fa-megaport:before { + content: "\f5a3"; } + +.fa-magento:before { + content: "\f3c4"; } + +.fa-spotify:before { + content: "\f1bc"; } + +.fa-optin-monster:before { + content: "\f23c"; } + +.fa-fly:before { + content: "\f417"; } + +.fa-aviato:before { + content: "\f421"; } + +.fa-itunes:before { + content: "\f3b4"; } + +.fa-cuttlefish:before { + content: "\f38c"; } + +.fa-blogger:before { + content: "\f37c"; } + +.fa-flickr:before { + content: "\f16e"; } + +.fa-viber:before { + content: "\f409"; } + +.fa-soundcloud:before { + content: "\f1be"; } + +.fa-digg:before { + content: "\f1a6"; } + +.fa-tencent-weibo:before { + content: "\f1d5"; } + +.fa-letterboxd:before { + content: "\e62d"; } + +.fa-symfony:before { + content: "\f83d"; } + +.fa-maxcdn:before { + content: "\f136"; } + +.fa-etsy:before { + content: "\f2d7"; } + +.fa-facebook-messenger:before { + content: "\f39f"; } + +.fa-audible:before { + content: "\f373"; } + +.fa-think-peaks:before { + content: "\f731"; } + +.fa-bilibili:before { + content: "\e3d9"; } + +.fa-erlang:before { + content: "\f39d"; } + +.fa-x-twitter:before { + content: "\e61b"; } + +.fa-cotton-bureau:before { + content: "\f89e"; } + +.fa-dashcube:before { + content: "\f210"; } + +.fa-42-group:before { + content: "\e080"; } + +.fa-innosoft:before { + content: "\e080"; } + +.fa-stack-exchange:before { + content: "\f18d"; } + +.fa-elementor:before { + content: "\f430"; } + +.fa-square-pied-piper:before { + content: "\e01e"; } + +.fa-pied-piper-square:before { + content: "\e01e"; } + +.fa-creative-commons-nd:before { + content: "\f4eb"; } + +.fa-palfed:before { + content: "\f3d8"; } + +.fa-superpowers:before { + content: "\f2dd"; } + +.fa-resolving:before { + content: "\f3e7"; } + +.fa-xbox:before { + content: "\f412"; } + +.fa-square-web-awesome-stroke:before { + content: "\e684"; } + +.fa-searchengin:before { + content: "\f3eb"; } + +.fa-tiktok:before { + content: "\e07b"; } + +.fa-square-facebook:before { + content: "\f082"; } + +.fa-facebook-square:before { + content: "\f082"; } + +.fa-renren:before { + content: "\f18b"; } + +.fa-linux:before { + content: "\f17c"; } + +.fa-glide:before { + content: "\f2a5"; } + +.fa-linkedin:before { + content: "\f08c"; } + +.fa-hubspot:before { + content: "\f3b2"; } + +.fa-deploydog:before { + content: "\f38e"; } + +.fa-twitch:before { + content: "\f1e8"; } + +.fa-ravelry:before { + content: "\f2d9"; } + +.fa-mixer:before { + content: "\e056"; } + +.fa-square-lastfm:before { + content: "\f203"; } + +.fa-lastfm-square:before { + content: "\f203"; } + +.fa-vimeo:before { + content: "\f40a"; } + +.fa-mendeley:before { + content: "\f7b3"; } + +.fa-uniregistry:before { + content: "\f404"; } + +.fa-figma:before { + content: "\f799"; } + +.fa-creative-commons-remix:before { + content: "\f4ee"; } + +.fa-cc-amazon-pay:before { + content: "\f42d"; } + +.fa-dropbox:before { + content: "\f16b"; } + +.fa-instagram:before { + content: "\f16d"; } + +.fa-cmplid:before { + content: "\e360"; } + +.fa-upwork:before { + content: "\e641"; } + +.fa-facebook:before { + content: "\f09a"; } + +.fa-gripfire:before { + content: "\f3ac"; } + +.fa-jedi-order:before { + content: "\f50e"; } + +.fa-uikit:before { + content: "\f403"; } + +.fa-fort-awesome-alt:before { + content: "\f3a3"; } + +.fa-phabricator:before { + content: "\f3db"; } + +.fa-ussunnah:before { + content: "\f407"; } + +.fa-earlybirds:before { + content: "\f39a"; } + +.fa-trade-federation:before { + content: "\f513"; } + +.fa-autoprefixer:before { + content: "\f41c"; } + +.fa-whatsapp:before { + content: "\f232"; } + +.fa-square-upwork:before { + content: "\e67c"; } + +.fa-slideshare:before { + content: "\f1e7"; } + +.fa-google-play:before { + content: "\f3ab"; } + +.fa-viadeo:before { + content: "\f2a9"; } + +.fa-line:before { + content: "\f3c0"; } + +.fa-google-drive:before { + content: "\f3aa"; } + +.fa-servicestack:before { + content: "\f3ec"; } + +.fa-simplybuilt:before { + content: "\f215"; } + +.fa-bitbucket:before { + content: "\f171"; } + +.fa-imdb:before { + content: "\f2d8"; } + +.fa-deezer:before { + content: "\e077"; } + +.fa-raspberry-pi:before { + content: "\f7bb"; } + +.fa-jira:before { + content: "\f7b1"; } + +.fa-docker:before { + content: "\f395"; } + +.fa-screenpal:before { + content: "\e570"; } + +.fa-bluetooth:before { + content: "\f293"; } + +.fa-gitter:before { + content: "\f426"; } + +.fa-d-and-d:before { + content: "\f38d"; } + +.fa-microblog:before { + content: "\e01a"; } + +.fa-cc-diners-club:before { + content: "\f24c"; } + +.fa-gg-circle:before { + content: "\f261"; } + +.fa-pied-piper-hat:before { + content: "\f4e5"; } + +.fa-kickstarter-k:before { + content: "\f3bc"; } + +.fa-yandex:before { + content: "\f413"; } + +.fa-readme:before { + content: "\f4d5"; } + +.fa-html5:before { + content: "\f13b"; } + +.fa-sellsy:before { + content: "\f213"; } + +.fa-square-web-awesome:before { + content: "\e683"; } + +.fa-sass:before { + content: "\f41e"; } + +.fa-wirsindhandwerk:before { + content: "\e2d0"; } + +.fa-wsh:before { + content: "\e2d0"; } + +.fa-buromobelexperte:before { + content: "\f37f"; } + +.fa-salesforce:before { + content: "\f83b"; } + +.fa-octopus-deploy:before { + content: "\e082"; } + +.fa-medapps:before { + content: "\f3c6"; } + +.fa-ns8:before { + content: "\f3d5"; } + +.fa-pinterest-p:before { + content: "\f231"; } + +.fa-apper:before { + content: "\f371"; } + +.fa-fort-awesome:before { + content: "\f286"; } + +.fa-waze:before { + content: "\f83f"; } + +.fa-bluesky:before { + content: "\e671"; } + +.fa-cc-jcb:before { + content: "\f24b"; } + +.fa-snapchat:before { + content: "\f2ab"; } + +.fa-snapchat-ghost:before { + content: "\f2ab"; } + +.fa-fantasy-flight-games:before { + content: "\f6dc"; } + +.fa-rust:before { + content: "\e07a"; } + +.fa-wix:before { + content: "\f5cf"; } + +.fa-square-behance:before { + content: "\f1b5"; } + +.fa-behance-square:before { + content: "\f1b5"; } + +.fa-supple:before { + content: "\f3f9"; } + +.fa-webflow:before { + content: "\e65c"; } + +.fa-rebel:before { + content: "\f1d0"; } + +.fa-css3:before { + content: "\f13c"; } + +.fa-staylinked:before { + content: "\f3f5"; } + +.fa-kaggle:before { + content: "\f5fa"; } + +.fa-space-awesome:before { + content: "\e5ac"; } + +.fa-deviantart:before { + content: "\f1bd"; } + +.fa-cpanel:before { + content: "\f388"; } + +.fa-goodreads-g:before { + content: "\f3a9"; } + +.fa-square-git:before { + content: "\f1d2"; } + +.fa-git-square:before { + content: "\f1d2"; } + +.fa-square-tumblr:before { + content: "\f174"; } + +.fa-tumblr-square:before { + content: "\f174"; } + +.fa-trello:before { + content: "\f181"; } + +.fa-creative-commons-nc-jp:before { + content: "\f4ea"; } + +.fa-get-pocket:before { + content: "\f265"; } + +.fa-perbyte:before { + content: "\e083"; } + +.fa-grunt:before { + content: "\f3ad"; } + +.fa-weebly:before { + content: "\f5cc"; } + +.fa-connectdevelop:before { + content: "\f20e"; } + +.fa-leanpub:before { + content: "\f212"; } + +.fa-black-tie:before { + content: "\f27e"; } + +.fa-themeco:before { + content: "\f5c6"; } + +.fa-python:before { + content: "\f3e2"; } + +.fa-android:before { + content: "\f17b"; } + +.fa-bots:before { + content: "\e340"; } + +.fa-free-code-camp:before { + content: "\f2c5"; } + +.fa-hornbill:before { + content: "\f592"; } + +.fa-js:before { + content: "\f3b8"; } + +.fa-ideal:before { + content: "\e013"; } + +.fa-git:before { + content: "\f1d3"; } + +.fa-dev:before { + content: "\f6cc"; } + +.fa-sketch:before { + content: "\f7c6"; } + +.fa-yandex-international:before { + content: "\f414"; } + +.fa-cc-amex:before { + content: "\f1f3"; } + +.fa-uber:before { + content: "\f402"; } + +.fa-github:before { + content: "\f09b"; } + +.fa-php:before { + content: "\f457"; } + +.fa-alipay:before { + content: "\f642"; } + +.fa-youtube:before { + content: "\f167"; } + +.fa-skyatlas:before { + content: "\f216"; } + +.fa-firefox-browser:before { + content: "\e007"; } + +.fa-replyd:before { + content: "\f3e6"; } + +.fa-suse:before { + content: "\f7d6"; } + +.fa-jenkins:before { + content: "\f3b6"; } + +.fa-twitter:before { + content: "\f099"; } + +.fa-rockrms:before { + content: "\f3e9"; } + +.fa-pinterest:before { + content: "\f0d2"; } + +.fa-buffer:before { + content: "\f837"; } + +.fa-npm:before { + content: "\f3d4"; } + +.fa-yammer:before { + content: "\f840"; } + +.fa-btc:before { + content: "\f15a"; } + +.fa-dribbble:before { + content: "\f17d"; } + +.fa-stumbleupon-circle:before { + content: "\f1a3"; } + +.fa-internet-explorer:before { + content: "\f26b"; } + +.fa-stubber:before { + content: "\e5c7"; } + +.fa-telegram:before { + content: "\f2c6"; } + +.fa-telegram-plane:before { + content: "\f2c6"; } + +.fa-old-republic:before { + content: "\f510"; } + +.fa-odysee:before { + content: "\e5c6"; } + +.fa-square-whatsapp:before { + content: "\f40c"; } + +.fa-whatsapp-square:before { + content: "\f40c"; } + +.fa-node-js:before { + content: "\f3d3"; } + +.fa-edge-legacy:before { + content: "\e078"; } + +.fa-slack:before { + content: "\f198"; } + +.fa-slack-hash:before { + content: "\f198"; } + +.fa-medrt:before { + content: "\f3c8"; } + +.fa-usb:before { + content: "\f287"; } + +.fa-tumblr:before { + content: "\f173"; } + +.fa-vaadin:before { + content: "\f408"; } + +.fa-quora:before { + content: "\f2c4"; } + +.fa-square-x-twitter:before { + content: "\e61a"; } + +.fa-reacteurope:before { + content: "\f75d"; } + +.fa-medium:before { + content: "\f23a"; } + +.fa-medium-m:before { + content: "\f23a"; } + +.fa-amilia:before { + content: "\f36d"; } + +.fa-mixcloud:before { + content: "\f289"; } + +.fa-flipboard:before { + content: "\f44d"; } + +.fa-viacoin:before { + content: "\f237"; } + +.fa-critical-role:before { + content: "\f6c9"; } + +.fa-sitrox:before { + content: "\e44a"; } + +.fa-discourse:before { + content: "\f393"; } + +.fa-joomla:before { + content: "\f1aa"; } + +.fa-mastodon:before { + content: "\f4f6"; } + +.fa-airbnb:before { + content: "\f834"; } + +.fa-wolf-pack-battalion:before { + content: "\f514"; } + +.fa-buy-n-large:before { + content: "\f8a6"; } + +.fa-gulp:before { + content: "\f3ae"; } + +.fa-creative-commons-sampling-plus:before { + content: "\f4f1"; } + +.fa-strava:before { + content: "\f428"; } + +.fa-ember:before { + content: "\f423"; } + +.fa-canadian-maple-leaf:before { + content: "\f785"; } + +.fa-teamspeak:before { + content: "\f4f9"; } + +.fa-pushed:before { + content: "\f3e1"; } + +.fa-wordpress-simple:before { + content: "\f411"; } + +.fa-nutritionix:before { + content: "\f3d6"; } + +.fa-wodu:before { + content: "\e088"; } + +.fa-google-pay:before { + content: "\e079"; } + +.fa-intercom:before { + content: "\f7af"; } + +.fa-zhihu:before { + content: "\f63f"; } + +.fa-korvue:before { + content: "\f42f"; } + +.fa-pix:before { + content: "\e43a"; } + +.fa-steam-symbol:before { + content: "\f3f6"; } +:root, :host { + --fa-style-family-classic: 'Font Awesome 6 Free'; + --fa-font-regular: normal 400 1em/1 'Font Awesome 6 Free'; } + +@font-face { + font-family: 'Font Awesome 6 Free'; + font-style: normal; + font-weight: 400; + font-display: block; + src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); } + +.far, +.fa-regular { + font-weight: 400; } +:root, :host { + --fa-style-family-classic: 'Font Awesome 6 Free'; + --fa-font-solid: normal 900 1em/1 'Font Awesome 6 Free'; } + +@font-face { + font-family: 'Font Awesome 6 Free'; + font-style: normal; + font-weight: 900; + font-display: block; + src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } + +.fas, +.fa-solid { + font-weight: 900; } +@font-face { + font-family: 'Font Awesome 5 Brands'; + font-display: block; + font-weight: 400; + src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); } + +@font-face { + font-family: 'Font Awesome 5 Free'; + font-display: block; + font-weight: 900; + src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } + +@font-face { + font-family: 'Font Awesome 5 Free'; + font-display: block; + font-weight: 400; + src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); } +@font-face { + font-family: 'FontAwesome'; + font-display: block; + src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } + +@font-face { + font-family: 'FontAwesome'; + font-display: block; + src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); } + +@font-face { + font-family: 'FontAwesome'; + font-display: block; + src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); } + +@font-face { + font-family: 'FontAwesome'; + font-display: block; + src: url("../webfonts/fa-v4compatibility.woff2") format("woff2"), url("../webfonts/fa-v4compatibility.ttf") format("truetype"); } diff --git a/docs/deps/font-awesome-6.5.2/css/all.min.css b/docs/deps/font-awesome-6.5.2/css/all.min.css new file mode 100644 index 0000000..269bcee --- /dev/null +++ b/docs/deps/font-awesome-6.5.2/css/all.min.css @@ -0,0 +1,9 @@ +/*! + * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-transition-delay:0s;transition-delay:0s;-webkit-transition-duration:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,0));transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)} + +.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bangladeshi-taka-sign:before{content:"\e2e6"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-table-cells-column-lock:before{content:"\e678"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-table-cells-row-lock:before{content:"\e67a"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-child-combatant:before,.fa-child-rifle:before{content:"\e4e0"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-notdef:before{content:"\e1fe"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"} +.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-pixiv:before{content:"\e640"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-jxl:before{content:"\e67b"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-brave:before{content:"\e63c"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-threads:before{content:"\e618"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-opensuse:before{content:"\e62b"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-debian:before{content:"\e60b"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before,.fa-square-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-square-letterboxd:before{content:"\e62e"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-shoelace:before{content:"\e60c"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-square-threads:before{content:"\e619"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-google-scholar:before{content:"\e63b"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-signal-messenger:before{content:"\e663"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-mintbit:before{content:"\e62f"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-brave-reverse:before{content:"\e63d"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-web-awesome:before{content:"\e682"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-letterboxd:before{content:"\e62d"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-x-twitter:before{content:"\e61b"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-square-web-awesome-stroke:before{content:"\e684"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-upwork:before{content:"\e641"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-square-upwork:before{content:"\e67c"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-square-web-awesome:before{content:"\e683"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-bluesky:before{content:"\e671"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-webflow:before{content:"\e65c"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-square-x-twitter:before{content:"\e61a"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }.fa-solid,.fas{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }@font-face{font-family:"FontAwesome";font-display:block;src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }@font-face{font-family:"FontAwesome";font-display:block;src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }@font-face{font-family:"FontAwesome";font-display:block;src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }@font-face{font-family:"FontAwesome";font-display:block;src: url("../webfonts/fa-v4compatibility.woff2") format("woff2"), url("../webfonts/fa-v4compatibility.ttf") format("truetype"); } \ No newline at end of file diff --git a/docs/deps/font-awesome-6.5.2/css/v4-shims.css b/docs/deps/font-awesome-6.5.2/css/v4-shims.css new file mode 100644 index 0000000..ea60ea4 --- /dev/null +++ b/docs/deps/font-awesome-6.5.2/css/v4-shims.css @@ -0,0 +1,2194 @@ +/*! + * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +.fa.fa-glass:before { + content: "\f000"; } + +.fa.fa-envelope-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-envelope-o:before { + content: "\f0e0"; } + +.fa.fa-star-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-star-o:before { + content: "\f005"; } + +.fa.fa-remove:before { + content: "\f00d"; } + +.fa.fa-close:before { + content: "\f00d"; } + +.fa.fa-gear:before { + content: "\f013"; } + +.fa.fa-trash-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-trash-o:before { + content: "\f2ed"; } + +.fa.fa-home:before { + content: "\f015"; } + +.fa.fa-file-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-o:before { + content: "\f15b"; } + +.fa.fa-clock-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-clock-o:before { + content: "\f017"; } + +.fa.fa-arrow-circle-o-down { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-down:before { + content: "\f358"; } + +.fa.fa-arrow-circle-o-up { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-up:before { + content: "\f35b"; } + +.fa.fa-play-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-play-circle-o:before { + content: "\f144"; } + +.fa.fa-repeat:before { + content: "\f01e"; } + +.fa.fa-rotate-right:before { + content: "\f01e"; } + +.fa.fa-refresh:before { + content: "\f021"; } + +.fa.fa-list-alt { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-list-alt:before { + content: "\f022"; } + +.fa.fa-dedent:before { + content: "\f03b"; } + +.fa.fa-video-camera:before { + content: "\f03d"; } + +.fa.fa-picture-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-picture-o:before { + content: "\f03e"; } + +.fa.fa-photo { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-photo:before { + content: "\f03e"; } + +.fa.fa-image { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-image:before { + content: "\f03e"; } + +.fa.fa-map-marker:before { + content: "\f3c5"; } + +.fa.fa-pencil-square-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-pencil-square-o:before { + content: "\f044"; } + +.fa.fa-edit { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-edit:before { + content: "\f044"; } + +.fa.fa-share-square-o:before { + content: "\f14d"; } + +.fa.fa-check-square-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-check-square-o:before { + content: "\f14a"; } + +.fa.fa-arrows:before { + content: "\f0b2"; } + +.fa.fa-times-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-times-circle-o:before { + content: "\f057"; } + +.fa.fa-check-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-check-circle-o:before { + content: "\f058"; } + +.fa.fa-mail-forward:before { + content: "\f064"; } + +.fa.fa-expand:before { + content: "\f424"; } + +.fa.fa-compress:before { + content: "\f422"; } + +.fa.fa-eye { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-eye-slash { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-warning:before { + content: "\f071"; } + +.fa.fa-calendar:before { + content: "\f073"; } + +.fa.fa-arrows-v:before { + content: "\f338"; } + +.fa.fa-arrows-h:before { + content: "\f337"; } + +.fa.fa-bar-chart:before { + content: "\e0e3"; } + +.fa.fa-bar-chart-o:before { + content: "\e0e3"; } + +.fa.fa-twitter-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-twitter-square:before { + content: "\f081"; } + +.fa.fa-facebook-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-facebook-square:before { + content: "\f082"; } + +.fa.fa-gears:before { + content: "\f085"; } + +.fa.fa-thumbs-o-up { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-thumbs-o-up:before { + content: "\f164"; } + +.fa.fa-thumbs-o-down { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-thumbs-o-down:before { + content: "\f165"; } + +.fa.fa-heart-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-heart-o:before { + content: "\f004"; } + +.fa.fa-sign-out:before { + content: "\f2f5"; } + +.fa.fa-linkedin-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-linkedin-square:before { + content: "\f08c"; } + +.fa.fa-thumb-tack:before { + content: "\f08d"; } + +.fa.fa-external-link:before { + content: "\f35d"; } + +.fa.fa-sign-in:before { + content: "\f2f6"; } + +.fa.fa-github-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-github-square:before { + content: "\f092"; } + +.fa.fa-lemon-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-lemon-o:before { + content: "\f094"; } + +.fa.fa-square-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-square-o:before { + content: "\f0c8"; } + +.fa.fa-bookmark-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-bookmark-o:before { + content: "\f02e"; } + +.fa.fa-twitter { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-facebook { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-facebook:before { + content: "\f39e"; } + +.fa.fa-facebook-f { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-facebook-f:before { + content: "\f39e"; } + +.fa.fa-github { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-credit-card { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-feed:before { + content: "\f09e"; } + +.fa.fa-hdd-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hdd-o:before { + content: "\f0a0"; } + +.fa.fa-hand-o-right { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-o-right:before { + content: "\f0a4"; } + +.fa.fa-hand-o-left { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-o-left:before { + content: "\f0a5"; } + +.fa.fa-hand-o-up { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-o-up:before { + content: "\f0a6"; } + +.fa.fa-hand-o-down { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-o-down:before { + content: "\f0a7"; } + +.fa.fa-globe:before { + content: "\f57d"; } + +.fa.fa-tasks:before { + content: "\f828"; } + +.fa.fa-arrows-alt:before { + content: "\f31e"; } + +.fa.fa-group:before { + content: "\f0c0"; } + +.fa.fa-chain:before { + content: "\f0c1"; } + +.fa.fa-cut:before { + content: "\f0c4"; } + +.fa.fa-files-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-files-o:before { + content: "\f0c5"; } + +.fa.fa-floppy-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-floppy-o:before { + content: "\f0c7"; } + +.fa.fa-save { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-save:before { + content: "\f0c7"; } + +.fa.fa-navicon:before { + content: "\f0c9"; } + +.fa.fa-reorder:before { + content: "\f0c9"; } + +.fa.fa-magic:before { + content: "\e2ca"; } + +.fa.fa-pinterest { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pinterest-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pinterest-square:before { + content: "\f0d3"; } + +.fa.fa-google-plus-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-square:before { + content: "\f0d4"; } + +.fa.fa-google-plus { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-plus:before { + content: "\f0d5"; } + +.fa.fa-money:before { + content: "\f3d1"; } + +.fa.fa-unsorted:before { + content: "\f0dc"; } + +.fa.fa-sort-desc:before { + content: "\f0dd"; } + +.fa.fa-sort-asc:before { + content: "\f0de"; } + +.fa.fa-linkedin { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-linkedin:before { + content: "\f0e1"; } + +.fa.fa-rotate-left:before { + content: "\f0e2"; } + +.fa.fa-legal:before { + content: "\f0e3"; } + +.fa.fa-tachometer:before { + content: "\f625"; } + +.fa.fa-dashboard:before { + content: "\f625"; } + +.fa.fa-comment-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-comment-o:before { + content: "\f075"; } + +.fa.fa-comments-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-comments-o:before { + content: "\f086"; } + +.fa.fa-flash:before { + content: "\f0e7"; } + +.fa.fa-clipboard:before { + content: "\f0ea"; } + +.fa.fa-lightbulb-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-lightbulb-o:before { + content: "\f0eb"; } + +.fa.fa-exchange:before { + content: "\f362"; } + +.fa.fa-cloud-download:before { + content: "\f0ed"; } + +.fa.fa-cloud-upload:before { + content: "\f0ee"; } + +.fa.fa-bell-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-bell-o:before { + content: "\f0f3"; } + +.fa.fa-cutlery:before { + content: "\f2e7"; } + +.fa.fa-file-text-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-text-o:before { + content: "\f15c"; } + +.fa.fa-building-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-building-o:before { + content: "\f1ad"; } + +.fa.fa-hospital-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hospital-o:before { + content: "\f0f8"; } + +.fa.fa-tablet:before { + content: "\f3fa"; } + +.fa.fa-mobile:before { + content: "\f3cd"; } + +.fa.fa-mobile-phone:before { + content: "\f3cd"; } + +.fa.fa-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-circle-o:before { + content: "\f111"; } + +.fa.fa-mail-reply:before { + content: "\f3e5"; } + +.fa.fa-github-alt { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-folder-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-folder-o:before { + content: "\f07b"; } + +.fa.fa-folder-open-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-folder-open-o:before { + content: "\f07c"; } + +.fa.fa-smile-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-smile-o:before { + content: "\f118"; } + +.fa.fa-frown-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-frown-o:before { + content: "\f119"; } + +.fa.fa-meh-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-meh-o:before { + content: "\f11a"; } + +.fa.fa-keyboard-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-keyboard-o:before { + content: "\f11c"; } + +.fa.fa-flag-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-flag-o:before { + content: "\f024"; } + +.fa.fa-mail-reply-all:before { + content: "\f122"; } + +.fa.fa-star-half-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-star-half-o:before { + content: "\f5c0"; } + +.fa.fa-star-half-empty { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-star-half-empty:before { + content: "\f5c0"; } + +.fa.fa-star-half-full { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-star-half-full:before { + content: "\f5c0"; } + +.fa.fa-code-fork:before { + content: "\f126"; } + +.fa.fa-chain-broken:before { + content: "\f127"; } + +.fa.fa-unlink:before { + content: "\f127"; } + +.fa.fa-calendar-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-calendar-o:before { + content: "\f133"; } + +.fa.fa-maxcdn { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-html5 { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-css3 { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-unlock-alt:before { + content: "\f09c"; } + +.fa.fa-minus-square-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-minus-square-o:before { + content: "\f146"; } + +.fa.fa-level-up:before { + content: "\f3bf"; } + +.fa.fa-level-down:before { + content: "\f3be"; } + +.fa.fa-pencil-square:before { + content: "\f14b"; } + +.fa.fa-external-link-square:before { + content: "\f360"; } + +.fa.fa-compass { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-down { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-down:before { + content: "\f150"; } + +.fa.fa-toggle-down { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-toggle-down:before { + content: "\f150"; } + +.fa.fa-caret-square-o-up { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-up:before { + content: "\f151"; } + +.fa.fa-toggle-up { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-toggle-up:before { + content: "\f151"; } + +.fa.fa-caret-square-o-right { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-right:before { + content: "\f152"; } + +.fa.fa-toggle-right { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-toggle-right:before { + content: "\f152"; } + +.fa.fa-eur:before { + content: "\f153"; } + +.fa.fa-euro:before { + content: "\f153"; } + +.fa.fa-gbp:before { + content: "\f154"; } + +.fa.fa-usd:before { + content: "\24"; } + +.fa.fa-dollar:before { + content: "\24"; } + +.fa.fa-inr:before { + content: "\e1bc"; } + +.fa.fa-rupee:before { + content: "\e1bc"; } + +.fa.fa-jpy:before { + content: "\f157"; } + +.fa.fa-cny:before { + content: "\f157"; } + +.fa.fa-rmb:before { + content: "\f157"; } + +.fa.fa-yen:before { + content: "\f157"; } + +.fa.fa-rub:before { + content: "\f158"; } + +.fa.fa-ruble:before { + content: "\f158"; } + +.fa.fa-rouble:before { + content: "\f158"; } + +.fa.fa-krw:before { + content: "\f159"; } + +.fa.fa-won:before { + content: "\f159"; } + +.fa.fa-btc { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bitcoin { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bitcoin:before { + content: "\f15a"; } + +.fa.fa-file-text:before { + content: "\f15c"; } + +.fa.fa-sort-alpha-asc:before { + content: "\f15d"; } + +.fa.fa-sort-alpha-desc:before { + content: "\f881"; } + +.fa.fa-sort-amount-asc:before { + content: "\f884"; } + +.fa.fa-sort-amount-desc:before { + content: "\f160"; } + +.fa.fa-sort-numeric-asc:before { + content: "\f162"; } + +.fa.fa-sort-numeric-desc:before { + content: "\f886"; } + +.fa.fa-youtube-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-youtube-square:before { + content: "\f431"; } + +.fa.fa-youtube { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-xing { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-xing-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-xing-square:before { + content: "\f169"; } + +.fa.fa-youtube-play { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-youtube-play:before { + content: "\f167"; } + +.fa.fa-dropbox { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-stack-overflow { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-instagram { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-flickr { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-adn { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bitbucket { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bitbucket-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bitbucket-square:before { + content: "\f171"; } + +.fa.fa-tumblr { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-tumblr-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-tumblr-square:before { + content: "\f174"; } + +.fa.fa-long-arrow-down:before { + content: "\f309"; } + +.fa.fa-long-arrow-up:before { + content: "\f30c"; } + +.fa.fa-long-arrow-left:before { + content: "\f30a"; } + +.fa.fa-long-arrow-right:before { + content: "\f30b"; } + +.fa.fa-apple { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-windows { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-android { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-linux { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-dribbble { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-skype { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-foursquare { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-trello { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gratipay { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gittip { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gittip:before { + content: "\f184"; } + +.fa.fa-sun-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-sun-o:before { + content: "\f185"; } + +.fa.fa-moon-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-moon-o:before { + content: "\f186"; } + +.fa.fa-vk { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-weibo { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-renren { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pagelines { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-stack-exchange { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-right { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-right:before { + content: "\f35a"; } + +.fa.fa-arrow-circle-o-left { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-left:before { + content: "\f359"; } + +.fa.fa-caret-square-o-left { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-left:before { + content: "\f191"; } + +.fa.fa-toggle-left { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-toggle-left:before { + content: "\f191"; } + +.fa.fa-dot-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-dot-circle-o:before { + content: "\f192"; } + +.fa.fa-vimeo-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-vimeo-square:before { + content: "\f194"; } + +.fa.fa-try:before { + content: "\e2bb"; } + +.fa.fa-turkish-lira:before { + content: "\e2bb"; } + +.fa.fa-plus-square-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-plus-square-o:before { + content: "\f0fe"; } + +.fa.fa-slack { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wordpress { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-openid { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-institution:before { + content: "\f19c"; } + +.fa.fa-bank:before { + content: "\f19c"; } + +.fa.fa-mortar-board:before { + content: "\f19d"; } + +.fa.fa-yahoo { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-reddit { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-reddit-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-reddit-square:before { + content: "\f1a2"; } + +.fa.fa-stumbleupon-circle { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-stumbleupon { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-delicious { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-digg { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pied-piper-pp { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pied-piper-alt { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-drupal { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-joomla { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-behance { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-behance-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-behance-square:before { + content: "\f1b5"; } + +.fa.fa-steam { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-steam-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-steam-square:before { + content: "\f1b7"; } + +.fa.fa-automobile:before { + content: "\f1b9"; } + +.fa.fa-cab:before { + content: "\f1ba"; } + +.fa.fa-spotify { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-deviantart { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-soundcloud { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-file-pdf-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-pdf-o:before { + content: "\f1c1"; } + +.fa.fa-file-word-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-word-o:before { + content: "\f1c2"; } + +.fa.fa-file-excel-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-excel-o:before { + content: "\f1c3"; } + +.fa.fa-file-powerpoint-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-powerpoint-o:before { + content: "\f1c4"; } + +.fa.fa-file-image-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-image-o:before { + content: "\f1c5"; } + +.fa.fa-file-photo-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-photo-o:before { + content: "\f1c5"; } + +.fa.fa-file-picture-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-picture-o:before { + content: "\f1c5"; } + +.fa.fa-file-archive-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-archive-o:before { + content: "\f1c6"; } + +.fa.fa-file-zip-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-zip-o:before { + content: "\f1c6"; } + +.fa.fa-file-audio-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-audio-o:before { + content: "\f1c7"; } + +.fa.fa-file-sound-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-sound-o:before { + content: "\f1c7"; } + +.fa.fa-file-video-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-video-o:before { + content: "\f1c8"; } + +.fa.fa-file-movie-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-movie-o:before { + content: "\f1c8"; } + +.fa.fa-file-code-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-code-o:before { + content: "\f1c9"; } + +.fa.fa-vine { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-codepen { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-jsfiddle { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-life-bouy:before { + content: "\f1cd"; } + +.fa.fa-life-buoy:before { + content: "\f1cd"; } + +.fa.fa-life-saver:before { + content: "\f1cd"; } + +.fa.fa-support:before { + content: "\f1cd"; } + +.fa.fa-circle-o-notch:before { + content: "\f1ce"; } + +.fa.fa-rebel { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-ra { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-ra:before { + content: "\f1d0"; } + +.fa.fa-resistance { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-resistance:before { + content: "\f1d0"; } + +.fa.fa-empire { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-ge { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-ge:before { + content: "\f1d1"; } + +.fa.fa-git-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-git-square:before { + content: "\f1d2"; } + +.fa.fa-git { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-hacker-news { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-y-combinator-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-y-combinator-square:before { + content: "\f1d4"; } + +.fa.fa-yc-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-yc-square:before { + content: "\f1d4"; } + +.fa.fa-tencent-weibo { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-qq { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-weixin { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wechat { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wechat:before { + content: "\f1d7"; } + +.fa.fa-send:before { + content: "\f1d8"; } + +.fa.fa-paper-plane-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-paper-plane-o:before { + content: "\f1d8"; } + +.fa.fa-send-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-send-o:before { + content: "\f1d8"; } + +.fa.fa-circle-thin { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-circle-thin:before { + content: "\f111"; } + +.fa.fa-header:before { + content: "\f1dc"; } + +.fa.fa-futbol-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-futbol-o:before { + content: "\f1e3"; } + +.fa.fa-soccer-ball-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-soccer-ball-o:before { + content: "\f1e3"; } + +.fa.fa-slideshare { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-twitch { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-yelp { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-newspaper-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-newspaper-o:before { + content: "\f1ea"; } + +.fa.fa-paypal { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-wallet { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-visa { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-mastercard { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-discover { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-amex { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-paypal { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-stripe { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bell-slash-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-bell-slash-o:before { + content: "\f1f6"; } + +.fa.fa-trash:before { + content: "\f2ed"; } + +.fa.fa-copyright { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-eyedropper:before { + content: "\f1fb"; } + +.fa.fa-area-chart:before { + content: "\f1fe"; } + +.fa.fa-pie-chart:before { + content: "\f200"; } + +.fa.fa-line-chart:before { + content: "\f201"; } + +.fa.fa-lastfm { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-lastfm-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-lastfm-square:before { + content: "\f203"; } + +.fa.fa-ioxhost { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-angellist { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-cc:before { + content: "\f20a"; } + +.fa.fa-ils:before { + content: "\f20b"; } + +.fa.fa-shekel:before { + content: "\f20b"; } + +.fa.fa-sheqel:before { + content: "\f20b"; } + +.fa.fa-buysellads { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-connectdevelop { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-dashcube { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-forumbee { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-leanpub { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-sellsy { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-shirtsinbulk { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-simplybuilt { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-skyatlas { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-diamond { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-diamond:before { + content: "\f3a5"; } + +.fa.fa-transgender:before { + content: "\f224"; } + +.fa.fa-intersex:before { + content: "\f224"; } + +.fa.fa-transgender-alt:before { + content: "\f225"; } + +.fa.fa-facebook-official { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-facebook-official:before { + content: "\f09a"; } + +.fa.fa-pinterest-p { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-whatsapp { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-hotel:before { + content: "\f236"; } + +.fa.fa-viacoin { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-medium { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-y-combinator { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-yc { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-yc:before { + content: "\f23b"; } + +.fa.fa-optin-monster { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-opencart { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-expeditedssl { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-battery-4:before { + content: "\f240"; } + +.fa.fa-battery:before { + content: "\f240"; } + +.fa.fa-battery-3:before { + content: "\f241"; } + +.fa.fa-battery-2:before { + content: "\f242"; } + +.fa.fa-battery-1:before { + content: "\f243"; } + +.fa.fa-battery-0:before { + content: "\f244"; } + +.fa.fa-object-group { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-object-ungroup { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-sticky-note-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-sticky-note-o:before { + content: "\f249"; } + +.fa.fa-cc-jcb { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-diners-club { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-clone { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hourglass-o:before { + content: "\f254"; } + +.fa.fa-hourglass-1:before { + content: "\f251"; } + +.fa.fa-hourglass-2:before { + content: "\f252"; } + +.fa.fa-hourglass-3:before { + content: "\f253"; } + +.fa.fa-hand-rock-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-rock-o:before { + content: "\f255"; } + +.fa.fa-hand-grab-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-grab-o:before { + content: "\f255"; } + +.fa.fa-hand-paper-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-paper-o:before { + content: "\f256"; } + +.fa.fa-hand-stop-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-stop-o:before { + content: "\f256"; } + +.fa.fa-hand-scissors-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-scissors-o:before { + content: "\f257"; } + +.fa.fa-hand-lizard-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-lizard-o:before { + content: "\f258"; } + +.fa.fa-hand-spock-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-spock-o:before { + content: "\f259"; } + +.fa.fa-hand-pointer-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-pointer-o:before { + content: "\f25a"; } + +.fa.fa-hand-peace-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-peace-o:before { + content: "\f25b"; } + +.fa.fa-registered { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-creative-commons { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gg { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gg-circle { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-odnoklassniki { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-odnoklassniki-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-odnoklassniki-square:before { + content: "\f264"; } + +.fa.fa-get-pocket { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wikipedia-w { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-safari { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-chrome { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-firefox { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-opera { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-internet-explorer { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-television:before { + content: "\f26c"; } + +.fa.fa-contao { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-500px { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-amazon { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-calendar-plus-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-calendar-plus-o:before { + content: "\f271"; } + +.fa.fa-calendar-minus-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-calendar-minus-o:before { + content: "\f272"; } + +.fa.fa-calendar-times-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-calendar-times-o:before { + content: "\f273"; } + +.fa.fa-calendar-check-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-calendar-check-o:before { + content: "\f274"; } + +.fa.fa-map-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-map-o:before { + content: "\f279"; } + +.fa.fa-commenting:before { + content: "\f4ad"; } + +.fa.fa-commenting-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-commenting-o:before { + content: "\f4ad"; } + +.fa.fa-houzz { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-vimeo { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-vimeo:before { + content: "\f27d"; } + +.fa.fa-black-tie { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-fonticons { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-reddit-alien { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-edge { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-credit-card-alt:before { + content: "\f09d"; } + +.fa.fa-codiepie { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-modx { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-fort-awesome { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-usb { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-product-hunt { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-mixcloud { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-scribd { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pause-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-pause-circle-o:before { + content: "\f28b"; } + +.fa.fa-stop-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-stop-circle-o:before { + content: "\f28d"; } + +.fa.fa-bluetooth { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bluetooth-b { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gitlab { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wpbeginner { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wpforms { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-envira { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wheelchair-alt { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wheelchair-alt:before { + content: "\f368"; } + +.fa.fa-question-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-question-circle-o:before { + content: "\f059"; } + +.fa.fa-volume-control-phone:before { + content: "\f2a0"; } + +.fa.fa-asl-interpreting:before { + content: "\f2a3"; } + +.fa.fa-deafness:before { + content: "\f2a4"; } + +.fa.fa-hard-of-hearing:before { + content: "\f2a4"; } + +.fa.fa-glide { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-glide-g { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-signing:before { + content: "\f2a7"; } + +.fa.fa-viadeo { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-viadeo-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-viadeo-square:before { + content: "\f2aa"; } + +.fa.fa-snapchat { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-snapchat-ghost { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-snapchat-ghost:before { + content: "\f2ab"; } + +.fa.fa-snapchat-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-snapchat-square:before { + content: "\f2ad"; } + +.fa.fa-pied-piper { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-first-order { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-yoast { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-themeisle { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-official { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-official:before { + content: "\f2b3"; } + +.fa.fa-google-plus-circle { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-circle:before { + content: "\f2b3"; } + +.fa.fa-font-awesome { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-fa { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-fa:before { + content: "\f2b4"; } + +.fa.fa-handshake-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-handshake-o:before { + content: "\f2b5"; } + +.fa.fa-envelope-open-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-envelope-open-o:before { + content: "\f2b6"; } + +.fa.fa-linode { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-address-book-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-address-book-o:before { + content: "\f2b9"; } + +.fa.fa-vcard:before { + content: "\f2bb"; } + +.fa.fa-address-card-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-address-card-o:before { + content: "\f2bb"; } + +.fa.fa-vcard-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-vcard-o:before { + content: "\f2bb"; } + +.fa.fa-user-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-user-circle-o:before { + content: "\f2bd"; } + +.fa.fa-user-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-user-o:before { + content: "\f007"; } + +.fa.fa-id-badge { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-drivers-license:before { + content: "\f2c2"; } + +.fa.fa-id-card-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-id-card-o:before { + content: "\f2c2"; } + +.fa.fa-drivers-license-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-drivers-license-o:before { + content: "\f2c2"; } + +.fa.fa-quora { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-free-code-camp { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-telegram { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-thermometer-4:before { + content: "\f2c7"; } + +.fa.fa-thermometer:before { + content: "\f2c7"; } + +.fa.fa-thermometer-3:before { + content: "\f2c8"; } + +.fa.fa-thermometer-2:before { + content: "\f2c9"; } + +.fa.fa-thermometer-1:before { + content: "\f2ca"; } + +.fa.fa-thermometer-0:before { + content: "\f2cb"; } + +.fa.fa-bathtub:before { + content: "\f2cd"; } + +.fa.fa-s15:before { + content: "\f2cd"; } + +.fa.fa-window-maximize { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-window-restore { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-times-rectangle:before { + content: "\f410"; } + +.fa.fa-window-close-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-window-close-o:before { + content: "\f410"; } + +.fa.fa-times-rectangle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-times-rectangle-o:before { + content: "\f410"; } + +.fa.fa-bandcamp { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-grav { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-etsy { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-imdb { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-ravelry { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-eercast { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-eercast:before { + content: "\f2da"; } + +.fa.fa-snowflake-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-snowflake-o:before { + content: "\f2dc"; } + +.fa.fa-superpowers { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wpexplorer { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-meetup { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } diff --git a/docs/deps/font-awesome-6.5.2/css/v4-shims.min.css b/docs/deps/font-awesome-6.5.2/css/v4-shims.min.css new file mode 100644 index 0000000..09baf5f --- /dev/null +++ b/docs/deps/font-awesome-6.5.2/css/v4-shims.min.css @@ -0,0 +1,6 @@ +/*! + * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +.fa.fa-glass:before{content:"\f000"}.fa.fa-envelope-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-envelope-o:before{content:"\f0e0"}.fa.fa-star-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-o:before{content:"\f005"}.fa.fa-close:before,.fa.fa-remove:before{content:"\f00d"}.fa.fa-gear:before{content:"\f013"}.fa.fa-trash-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-trash-o:before{content:"\f2ed"}.fa.fa-home:before{content:"\f015"}.fa.fa-file-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-o:before{content:"\f15b"}.fa.fa-clock-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-clock-o:before{content:"\f017"}.fa.fa-arrow-circle-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-down:before{content:"\f358"}.fa.fa-arrow-circle-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-up:before{content:"\f35b"}.fa.fa-play-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-play-circle-o:before{content:"\f144"}.fa.fa-repeat:before,.fa.fa-rotate-right:before{content:"\f01e"}.fa.fa-refresh:before{content:"\f021"}.fa.fa-list-alt{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-list-alt:before{content:"\f022"}.fa.fa-dedent:before{content:"\f03b"}.fa.fa-video-camera:before{content:"\f03d"}.fa.fa-picture-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-picture-o:before{content:"\f03e"}.fa.fa-photo{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-photo:before{content:"\f03e"}.fa.fa-image{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-image:before{content:"\f03e"}.fa.fa-map-marker:before{content:"\f3c5"}.fa.fa-pencil-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-pencil-square-o:before{content:"\f044"}.fa.fa-edit{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-edit:before{content:"\f044"}.fa.fa-share-square-o:before{content:"\f14d"}.fa.fa-check-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-check-square-o:before{content:"\f14a"}.fa.fa-arrows:before{content:"\f0b2"}.fa.fa-times-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-times-circle-o:before{content:"\f057"}.fa.fa-check-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-check-circle-o:before{content:"\f058"}.fa.fa-mail-forward:before{content:"\f064"}.fa.fa-expand:before{content:"\f424"}.fa.fa-compress:before{content:"\f422"}.fa.fa-eye,.fa.fa-eye-slash{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-warning:before{content:"\f071"}.fa.fa-calendar:before{content:"\f073"}.fa.fa-arrows-v:before{content:"\f338"}.fa.fa-arrows-h:before{content:"\f337"}.fa.fa-bar-chart-o:before,.fa.fa-bar-chart:before{content:"\e0e3"}.fa.fa-twitter-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-twitter-square:before{content:"\f081"}.fa.fa-facebook-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook-square:before{content:"\f082"}.fa.fa-gears:before{content:"\f085"}.fa.fa-thumbs-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-thumbs-o-up:before{content:"\f164"}.fa.fa-thumbs-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-thumbs-o-down:before{content:"\f165"}.fa.fa-heart-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-heart-o:before{content:"\f004"}.fa.fa-sign-out:before{content:"\f2f5"}.fa.fa-linkedin-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-linkedin-square:before{content:"\f08c"}.fa.fa-thumb-tack:before{content:"\f08d"}.fa.fa-external-link:before{content:"\f35d"}.fa.fa-sign-in:before{content:"\f2f6"}.fa.fa-github-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-github-square:before{content:"\f092"}.fa.fa-lemon-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-lemon-o:before{content:"\f094"}.fa.fa-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-square-o:before{content:"\f0c8"}.fa.fa-bookmark-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-bookmark-o:before{content:"\f02e"}.fa.fa-facebook,.fa.fa-twitter{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook:before{content:"\f39e"}.fa.fa-facebook-f{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook-f:before{content:"\f39e"}.fa.fa-github{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-credit-card{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-feed:before{content:"\f09e"}.fa.fa-hdd-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hdd-o:before{content:"\f0a0"}.fa.fa-hand-o-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-right:before{content:"\f0a4"}.fa.fa-hand-o-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-left:before{content:"\f0a5"}.fa.fa-hand-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-up:before{content:"\f0a6"}.fa.fa-hand-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-down:before{content:"\f0a7"}.fa.fa-globe:before{content:"\f57d"}.fa.fa-tasks:before{content:"\f828"}.fa.fa-arrows-alt:before{content:"\f31e"}.fa.fa-group:before{content:"\f0c0"}.fa.fa-chain:before{content:"\f0c1"}.fa.fa-cut:before{content:"\f0c4"}.fa.fa-files-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-files-o:before{content:"\f0c5"}.fa.fa-floppy-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-floppy-o:before{content:"\f0c7"}.fa.fa-save{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-save:before{content:"\f0c7"}.fa.fa-navicon:before,.fa.fa-reorder:before{content:"\f0c9"}.fa.fa-magic:before{content:"\e2ca"}.fa.fa-pinterest,.fa.fa-pinterest-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-pinterest-square:before{content:"\f0d3"}.fa.fa-google-plus-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus-square:before{content:"\f0d4"}.fa.fa-google-plus{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus:before{content:"\f0d5"}.fa.fa-money:before{content:"\f3d1"}.fa.fa-unsorted:before{content:"\f0dc"}.fa.fa-sort-desc:before{content:"\f0dd"}.fa.fa-sort-asc:before{content:"\f0de"}.fa.fa-linkedin{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-linkedin:before{content:"\f0e1"}.fa.fa-rotate-left:before{content:"\f0e2"}.fa.fa-legal:before{content:"\f0e3"}.fa.fa-dashboard:before,.fa.fa-tachometer:before{content:"\f625"}.fa.fa-comment-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-comment-o:before{content:"\f075"}.fa.fa-comments-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-comments-o:before{content:"\f086"}.fa.fa-flash:before{content:"\f0e7"}.fa.fa-clipboard:before{content:"\f0ea"}.fa.fa-lightbulb-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-lightbulb-o:before{content:"\f0eb"}.fa.fa-exchange:before{content:"\f362"}.fa.fa-cloud-download:before{content:"\f0ed"}.fa.fa-cloud-upload:before{content:"\f0ee"}.fa.fa-bell-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-bell-o:before{content:"\f0f3"}.fa.fa-cutlery:before{content:"\f2e7"}.fa.fa-file-text-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-text-o:before{content:"\f15c"}.fa.fa-building-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-building-o:before{content:"\f1ad"}.fa.fa-hospital-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hospital-o:before{content:"\f0f8"}.fa.fa-tablet:before{content:"\f3fa"}.fa.fa-mobile-phone:before,.fa.fa-mobile:before{content:"\f3cd"}.fa.fa-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-circle-o:before{content:"\f111"}.fa.fa-mail-reply:before{content:"\f3e5"}.fa.fa-github-alt{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-folder-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-folder-o:before{content:"\f07b"}.fa.fa-folder-open-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-folder-open-o:before{content:"\f07c"}.fa.fa-smile-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-smile-o:before{content:"\f118"}.fa.fa-frown-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-frown-o:before{content:"\f119"}.fa.fa-meh-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-meh-o:before{content:"\f11a"}.fa.fa-keyboard-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-keyboard-o:before{content:"\f11c"}.fa.fa-flag-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-flag-o:before{content:"\f024"}.fa.fa-mail-reply-all:before{content:"\f122"}.fa.fa-star-half-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-half-o:before{content:"\f5c0"}.fa.fa-star-half-empty{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-half-empty:before{content:"\f5c0"}.fa.fa-star-half-full{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-half-full:before{content:"\f5c0"}.fa.fa-code-fork:before{content:"\f126"}.fa.fa-chain-broken:before,.fa.fa-unlink:before{content:"\f127"}.fa.fa-calendar-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-o:before{content:"\f133"}.fa.fa-css3,.fa.fa-html5,.fa.fa-maxcdn{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-unlock-alt:before{content:"\f09c"}.fa.fa-minus-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-minus-square-o:before{content:"\f146"}.fa.fa-level-up:before{content:"\f3bf"}.fa.fa-level-down:before{content:"\f3be"}.fa.fa-pencil-square:before{content:"\f14b"}.fa.fa-external-link-square:before{content:"\f360"}.fa.fa-compass{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-down:before{content:"\f150"}.fa.fa-toggle-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-down:before{content:"\f150"}.fa.fa-caret-square-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-up:before{content:"\f151"}.fa.fa-toggle-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-up:before{content:"\f151"}.fa.fa-caret-square-o-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-right:before{content:"\f152"}.fa.fa-toggle-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-right:before{content:"\f152"}.fa.fa-eur:before,.fa.fa-euro:before{content:"\f153"}.fa.fa-gbp:before{content:"\f154"}.fa.fa-dollar:before,.fa.fa-usd:before{content:"\24"}.fa.fa-inr:before,.fa.fa-rupee:before{content:"\e1bc"}.fa.fa-cny:before,.fa.fa-jpy:before,.fa.fa-rmb:before,.fa.fa-yen:before{content:"\f157"}.fa.fa-rouble:before,.fa.fa-rub:before,.fa.fa-ruble:before{content:"\f158"}.fa.fa-krw:before,.fa.fa-won:before{content:"\f159"}.fa.fa-bitcoin,.fa.fa-btc{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bitcoin:before{content:"\f15a"}.fa.fa-file-text:before{content:"\f15c"}.fa.fa-sort-alpha-asc:before{content:"\f15d"}.fa.fa-sort-alpha-desc:before{content:"\f881"}.fa.fa-sort-amount-asc:before{content:"\f884"}.fa.fa-sort-amount-desc:before{content:"\f160"}.fa.fa-sort-numeric-asc:before{content:"\f162"}.fa.fa-sort-numeric-desc:before{content:"\f886"}.fa.fa-youtube-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-youtube-square:before{content:"\f431"}.fa.fa-xing,.fa.fa-xing-square,.fa.fa-youtube{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-xing-square:before{content:"\f169"}.fa.fa-youtube-play{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-youtube-play:before{content:"\f167"}.fa.fa-adn,.fa.fa-bitbucket,.fa.fa-bitbucket-square,.fa.fa-dropbox,.fa.fa-flickr,.fa.fa-instagram,.fa.fa-stack-overflow{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bitbucket-square:before{content:"\f171"}.fa.fa-tumblr,.fa.fa-tumblr-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-tumblr-square:before{content:"\f174"}.fa.fa-long-arrow-down:before{content:"\f309"}.fa.fa-long-arrow-up:before{content:"\f30c"}.fa.fa-long-arrow-left:before{content:"\f30a"}.fa.fa-long-arrow-right:before{content:"\f30b"}.fa.fa-android,.fa.fa-apple,.fa.fa-dribbble,.fa.fa-foursquare,.fa.fa-gittip,.fa.fa-gratipay,.fa.fa-linux,.fa.fa-skype,.fa.fa-trello,.fa.fa-windows{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-gittip:before{content:"\f184"}.fa.fa-sun-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-sun-o:before{content:"\f185"}.fa.fa-moon-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-moon-o:before{content:"\f186"}.fa.fa-pagelines,.fa.fa-renren,.fa.fa-stack-exchange,.fa.fa-vk,.fa.fa-weibo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-arrow-circle-o-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-right:before{content:"\f35a"}.fa.fa-arrow-circle-o-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-left:before{content:"\f359"}.fa.fa-caret-square-o-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-left:before{content:"\f191"}.fa.fa-toggle-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-left:before{content:"\f191"}.fa.fa-dot-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-dot-circle-o:before{content:"\f192"}.fa.fa-vimeo-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-vimeo-square:before{content:"\f194"}.fa.fa-try:before,.fa.fa-turkish-lira:before{content:"\e2bb"}.fa.fa-plus-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-plus-square-o:before{content:"\f0fe"}.fa.fa-openid,.fa.fa-slack,.fa.fa-wordpress{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bank:before,.fa.fa-institution:before{content:"\f19c"}.fa.fa-mortar-board:before{content:"\f19d"}.fa.fa-google,.fa.fa-reddit,.fa.fa-reddit-square,.fa.fa-yahoo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-reddit-square:before{content:"\f1a2"}.fa.fa-behance,.fa.fa-behance-square,.fa.fa-delicious,.fa.fa-digg,.fa.fa-drupal,.fa.fa-joomla,.fa.fa-pied-piper-alt,.fa.fa-pied-piper-pp,.fa.fa-stumbleupon,.fa.fa-stumbleupon-circle{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-behance-square:before{content:"\f1b5"}.fa.fa-steam,.fa.fa-steam-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-steam-square:before{content:"\f1b7"}.fa.fa-automobile:before{content:"\f1b9"}.fa.fa-cab:before{content:"\f1ba"}.fa.fa-deviantart,.fa.fa-soundcloud,.fa.fa-spotify{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-file-pdf-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-pdf-o:before{content:"\f1c1"}.fa.fa-file-word-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-word-o:before{content:"\f1c2"}.fa.fa-file-excel-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-excel-o:before{content:"\f1c3"}.fa.fa-file-powerpoint-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-powerpoint-o:before{content:"\f1c4"}.fa.fa-file-image-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-image-o:before{content:"\f1c5"}.fa.fa-file-photo-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-photo-o:before{content:"\f1c5"}.fa.fa-file-picture-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-picture-o:before{content:"\f1c5"}.fa.fa-file-archive-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-archive-o:before{content:"\f1c6"}.fa.fa-file-zip-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-zip-o:before{content:"\f1c6"}.fa.fa-file-audio-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-audio-o:before{content:"\f1c7"}.fa.fa-file-sound-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-sound-o:before{content:"\f1c7"}.fa.fa-file-video-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-video-o:before{content:"\f1c8"}.fa.fa-file-movie-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-movie-o:before{content:"\f1c8"}.fa.fa-file-code-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-code-o:before{content:"\f1c9"}.fa.fa-codepen,.fa.fa-jsfiddle,.fa.fa-vine{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-life-bouy:before,.fa.fa-life-buoy:before,.fa.fa-life-saver:before,.fa.fa-support:before{content:"\f1cd"}.fa.fa-circle-o-notch:before{content:"\f1ce"}.fa.fa-ra,.fa.fa-rebel{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-ra:before{content:"\f1d0"}.fa.fa-resistance{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-resistance:before{content:"\f1d0"}.fa.fa-empire,.fa.fa-ge{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-ge:before{content:"\f1d1"}.fa.fa-git-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-git-square:before{content:"\f1d2"}.fa.fa-git,.fa.fa-hacker-news,.fa.fa-y-combinator-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-y-combinator-square:before{content:"\f1d4"}.fa.fa-yc-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-yc-square:before{content:"\f1d4"}.fa.fa-qq,.fa.fa-tencent-weibo,.fa.fa-wechat,.fa.fa-weixin{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-wechat:before{content:"\f1d7"}.fa.fa-send:before{content:"\f1d8"}.fa.fa-paper-plane-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-paper-plane-o:before{content:"\f1d8"}.fa.fa-send-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-send-o:before{content:"\f1d8"}.fa.fa-circle-thin{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-circle-thin:before{content:"\f111"}.fa.fa-header:before{content:"\f1dc"}.fa.fa-futbol-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-futbol-o:before{content:"\f1e3"}.fa.fa-soccer-ball-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-soccer-ball-o:before{content:"\f1e3"}.fa.fa-slideshare,.fa.fa-twitch,.fa.fa-yelp{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-newspaper-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-newspaper-o:before{content:"\f1ea"}.fa.fa-cc-amex,.fa.fa-cc-discover,.fa.fa-cc-mastercard,.fa.fa-cc-paypal,.fa.fa-cc-stripe,.fa.fa-cc-visa,.fa.fa-google-wallet,.fa.fa-paypal{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bell-slash-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-bell-slash-o:before{content:"\f1f6"}.fa.fa-trash:before{content:"\f2ed"}.fa.fa-copyright{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-eyedropper:before{content:"\f1fb"}.fa.fa-area-chart:before{content:"\f1fe"}.fa.fa-pie-chart:before{content:"\f200"}.fa.fa-line-chart:before{content:"\f201"}.fa.fa-lastfm,.fa.fa-lastfm-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-lastfm-square:before{content:"\f203"}.fa.fa-angellist,.fa.fa-ioxhost{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-cc{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-cc:before{content:"\f20a"}.fa.fa-ils:before,.fa.fa-shekel:before,.fa.fa-sheqel:before{content:"\f20b"}.fa.fa-buysellads,.fa.fa-connectdevelop,.fa.fa-dashcube,.fa.fa-forumbee,.fa.fa-leanpub,.fa.fa-sellsy,.fa.fa-shirtsinbulk,.fa.fa-simplybuilt,.fa.fa-skyatlas{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-diamond{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-diamond:before{content:"\f3a5"}.fa.fa-intersex:before,.fa.fa-transgender:before{content:"\f224"}.fa.fa-transgender-alt:before{content:"\f225"}.fa.fa-facebook-official{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook-official:before{content:"\f09a"}.fa.fa-pinterest-p,.fa.fa-whatsapp{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-hotel:before{content:"\f236"}.fa.fa-medium,.fa.fa-viacoin,.fa.fa-y-combinator,.fa.fa-yc{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-yc:before{content:"\f23b"}.fa.fa-expeditedssl,.fa.fa-opencart,.fa.fa-optin-monster{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-battery-4:before,.fa.fa-battery:before{content:"\f240"}.fa.fa-battery-3:before{content:"\f241"}.fa.fa-battery-2:before{content:"\f242"}.fa.fa-battery-1:before{content:"\f243"}.fa.fa-battery-0:before{content:"\f244"}.fa.fa-object-group,.fa.fa-object-ungroup,.fa.fa-sticky-note-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-sticky-note-o:before{content:"\f249"}.fa.fa-cc-diners-club,.fa.fa-cc-jcb{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-clone{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hourglass-o:before{content:"\f254"}.fa.fa-hourglass-1:before{content:"\f251"}.fa.fa-hourglass-2:before{content:"\f252"}.fa.fa-hourglass-3:before{content:"\f253"}.fa.fa-hand-rock-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-rock-o:before{content:"\f255"}.fa.fa-hand-grab-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-grab-o:before{content:"\f255"}.fa.fa-hand-paper-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-paper-o:before{content:"\f256"}.fa.fa-hand-stop-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-stop-o:before{content:"\f256"}.fa.fa-hand-scissors-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-scissors-o:before{content:"\f257"}.fa.fa-hand-lizard-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-lizard-o:before{content:"\f258"}.fa.fa-hand-spock-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-spock-o:before{content:"\f259"}.fa.fa-hand-pointer-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-pointer-o:before{content:"\f25a"}.fa.fa-hand-peace-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-peace-o:before{content:"\f25b"}.fa.fa-registered{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-creative-commons,.fa.fa-gg,.fa.fa-gg-circle,.fa.fa-odnoklassniki,.fa.fa-odnoklassniki-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-odnoklassniki-square:before{content:"\f264"}.fa.fa-chrome,.fa.fa-firefox,.fa.fa-get-pocket,.fa.fa-internet-explorer,.fa.fa-opera,.fa.fa-safari,.fa.fa-wikipedia-w{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-television:before{content:"\f26c"}.fa.fa-500px,.fa.fa-amazon,.fa.fa-contao{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-calendar-plus-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-plus-o:before{content:"\f271"}.fa.fa-calendar-minus-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-minus-o:before{content:"\f272"}.fa.fa-calendar-times-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-times-o:before{content:"\f273"}.fa.fa-calendar-check-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-check-o:before{content:"\f274"}.fa.fa-map-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-map-o:before{content:"\f279"}.fa.fa-commenting:before{content:"\f4ad"}.fa.fa-commenting-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-commenting-o:before{content:"\f4ad"}.fa.fa-houzz,.fa.fa-vimeo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-vimeo:before{content:"\f27d"}.fa.fa-black-tie,.fa.fa-edge,.fa.fa-fonticons,.fa.fa-reddit-alien{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-credit-card-alt:before{content:"\f09d"}.fa.fa-codiepie,.fa.fa-fort-awesome,.fa.fa-mixcloud,.fa.fa-modx,.fa.fa-product-hunt,.fa.fa-scribd,.fa.fa-usb{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-pause-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-pause-circle-o:before{content:"\f28b"}.fa.fa-stop-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-stop-circle-o:before{content:"\f28d"}.fa.fa-bluetooth,.fa.fa-bluetooth-b,.fa.fa-envira,.fa.fa-gitlab,.fa.fa-wheelchair-alt,.fa.fa-wpbeginner,.fa.fa-wpforms{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-wheelchair-alt:before{content:"\f368"}.fa.fa-question-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-question-circle-o:before{content:"\f059"}.fa.fa-volume-control-phone:before{content:"\f2a0"}.fa.fa-asl-interpreting:before{content:"\f2a3"}.fa.fa-deafness:before,.fa.fa-hard-of-hearing:before{content:"\f2a4"}.fa.fa-glide,.fa.fa-glide-g{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-signing:before{content:"\f2a7"}.fa.fa-viadeo,.fa.fa-viadeo-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-viadeo-square:before{content:"\f2aa"}.fa.fa-snapchat,.fa.fa-snapchat-ghost{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-snapchat-ghost:before{content:"\f2ab"}.fa.fa-snapchat-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-snapchat-square:before{content:"\f2ad"}.fa.fa-first-order,.fa.fa-google-plus-official,.fa.fa-pied-piper,.fa.fa-themeisle,.fa.fa-yoast{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus-official:before{content:"\f2b3"}.fa.fa-google-plus-circle{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus-circle:before{content:"\f2b3"}.fa.fa-fa,.fa.fa-font-awesome{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-fa:before{content:"\f2b4"}.fa.fa-handshake-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-handshake-o:before{content:"\f2b5"}.fa.fa-envelope-open-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-envelope-open-o:before{content:"\f2b6"}.fa.fa-linode{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-address-book-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-address-book-o:before{content:"\f2b9"}.fa.fa-vcard:before{content:"\f2bb"}.fa.fa-address-card-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-address-card-o:before{content:"\f2bb"}.fa.fa-vcard-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-vcard-o:before{content:"\f2bb"}.fa.fa-user-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-user-circle-o:before{content:"\f2bd"}.fa.fa-user-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-user-o:before{content:"\f007"}.fa.fa-id-badge{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-drivers-license:before{content:"\f2c2"}.fa.fa-id-card-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-id-card-o:before{content:"\f2c2"}.fa.fa-drivers-license-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-drivers-license-o:before{content:"\f2c2"}.fa.fa-free-code-camp,.fa.fa-quora,.fa.fa-telegram{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-thermometer-4:before,.fa.fa-thermometer:before{content:"\f2c7"}.fa.fa-thermometer-3:before{content:"\f2c8"}.fa.fa-thermometer-2:before{content:"\f2c9"}.fa.fa-thermometer-1:before{content:"\f2ca"}.fa.fa-thermometer-0:before{content:"\f2cb"}.fa.fa-bathtub:before,.fa.fa-s15:before{content:"\f2cd"}.fa.fa-window-maximize,.fa.fa-window-restore{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-times-rectangle:before{content:"\f410"}.fa.fa-window-close-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-window-close-o:before{content:"\f410"}.fa.fa-times-rectangle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-times-rectangle-o:before{content:"\f410"}.fa.fa-bandcamp,.fa.fa-eercast,.fa.fa-etsy,.fa.fa-grav,.fa.fa-imdb,.fa.fa-ravelry{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-eercast:before{content:"\f2da"}.fa.fa-snowflake-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-snowflake-o:before{content:"\f2dc"}.fa.fa-meetup,.fa.fa-superpowers,.fa.fa-wpexplorer{font-family:"Font Awesome 6 Brands";font-weight:400} \ No newline at end of file diff --git a/docs/deps/font-awesome-6.5.2/webfonts/fa-brands-400.ttf b/docs/deps/font-awesome-6.5.2/webfonts/fa-brands-400.ttf new file mode 100644 index 0000000..1fbb1f7 Binary files /dev/null and b/docs/deps/font-awesome-6.5.2/webfonts/fa-brands-400.ttf differ diff --git a/docs/deps/font-awesome-6.5.2/webfonts/fa-brands-400.woff2 b/docs/deps/font-awesome-6.5.2/webfonts/fa-brands-400.woff2 new file mode 100644 index 0000000..5d28021 Binary files /dev/null and b/docs/deps/font-awesome-6.5.2/webfonts/fa-brands-400.woff2 differ diff --git a/docs/deps/font-awesome-6.5.2/webfonts/fa-regular-400.ttf b/docs/deps/font-awesome-6.5.2/webfonts/fa-regular-400.ttf new file mode 100644 index 0000000..549d68d Binary files /dev/null and b/docs/deps/font-awesome-6.5.2/webfonts/fa-regular-400.ttf differ diff --git a/docs/deps/font-awesome-6.5.2/webfonts/fa-regular-400.woff2 b/docs/deps/font-awesome-6.5.2/webfonts/fa-regular-400.woff2 new file mode 100644 index 0000000..18400d7 Binary files /dev/null and b/docs/deps/font-awesome-6.5.2/webfonts/fa-regular-400.woff2 differ diff --git a/docs/deps/font-awesome-6.5.2/webfonts/fa-solid-900.ttf b/docs/deps/font-awesome-6.5.2/webfonts/fa-solid-900.ttf new file mode 100644 index 0000000..bb2a869 Binary files /dev/null and b/docs/deps/font-awesome-6.5.2/webfonts/fa-solid-900.ttf differ diff --git a/docs/deps/font-awesome-6.5.2/webfonts/fa-solid-900.woff2 b/docs/deps/font-awesome-6.5.2/webfonts/fa-solid-900.woff2 new file mode 100644 index 0000000..758dd4f Binary files /dev/null and b/docs/deps/font-awesome-6.5.2/webfonts/fa-solid-900.woff2 differ diff --git a/docs/deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.ttf b/docs/deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.ttf new file mode 100644 index 0000000..8c5864c Binary files /dev/null and b/docs/deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.ttf differ diff --git a/docs/deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.woff2 b/docs/deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.woff2 new file mode 100644 index 0000000..f94bec2 Binary files /dev/null and b/docs/deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.woff2 differ diff --git a/docs/deps/headroom-0.11.0/headroom.min.js b/docs/deps/headroom-0.11.0/headroom.min.js new file mode 100644 index 0000000..433069f --- /dev/null +++ b/docs/deps/headroom-0.11.0/headroom.min.js @@ -0,0 +1,7 @@ +/*! + * headroom.js v0.11.0 - Give your page some headroom. Hide your header until you need it + * Copyright (c) 2020 Nick Williams - http://wicky.nillia.ms/headroom.js + * License: MIT + */ + +!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(t=t||self).Headroom=n()}(this,function(){"use strict";function t(){return"undefined"!=typeof window}function d(t){return function(t){return t&&t.document&&function(t){return 9===t.nodeType}(t.document)}(t)?function(t){var n=t.document,o=n.body,s=n.documentElement;return{scrollHeight:function(){return Math.max(o.scrollHeight,s.scrollHeight,o.offsetHeight,s.offsetHeight,o.clientHeight,s.clientHeight)},height:function(){return t.innerHeight||s.clientHeight||o.clientHeight},scrollY:function(){return void 0!==t.pageYOffset?t.pageYOffset:(s||o.parentNode||o).scrollTop}}}(t):function(t){return{scrollHeight:function(){return Math.max(t.scrollHeight,t.offsetHeight,t.clientHeight)},height:function(){return Math.max(t.offsetHeight,t.clientHeight)},scrollY:function(){return t.scrollTop}}}(t)}function n(t,s,e){var n,o=function(){var n=!1;try{var t={get passive(){n=!0}};window.addEventListener("test",t,t),window.removeEventListener("test",t,t)}catch(t){n=!1}return n}(),i=!1,r=d(t),l=r.scrollY(),a={};function c(){var t=Math.round(r.scrollY()),n=r.height(),o=r.scrollHeight();a.scrollY=t,a.lastScrollY=l,a.direction=ls.tolerance[a.direction],e(a),l=t,i=!1}function h(){i||(i=!0,n=requestAnimationFrame(c))}var u=!!o&&{passive:!0,capture:!1};return t.addEventListener("scroll",h,u),c(),{destroy:function(){cancelAnimationFrame(n),t.removeEventListener("scroll",h,u)}}}function o(t,n){n=n||{},Object.assign(this,o.options,n),this.classes=Object.assign({},o.options.classes,n.classes),this.elem=t,this.tolerance=function(t){return t===Object(t)?t:{down:t,up:t}}(this.tolerance),this.initialised=!1,this.frozen=!1}return o.prototype={constructor:o,init:function(){return o.cutsTheMustard&&!this.initialised&&(this.addClass("initial"),this.initialised=!0,setTimeout(function(t){t.scrollTracker=n(t.scroller,{offset:t.offset,tolerance:t.tolerance},t.update.bind(t))},100,this)),this},destroy:function(){this.initialised=!1,Object.keys(this.classes).forEach(this.removeClass,this),this.scrollTracker.destroy()},unpin:function(){!this.hasClass("pinned")&&this.hasClass("unpinned")||(this.addClass("unpinned"),this.removeClass("pinned"),this.onUnpin&&this.onUnpin.call(this))},pin:function(){this.hasClass("unpinned")&&(this.addClass("pinned"),this.removeClass("unpinned"),this.onPin&&this.onPin.call(this))},freeze:function(){this.frozen=!0,this.addClass("frozen")},unfreeze:function(){this.frozen=!1,this.removeClass("frozen")},top:function(){this.hasClass("top")||(this.addClass("top"),this.removeClass("notTop"),this.onTop&&this.onTop.call(this))},notTop:function(){this.hasClass("notTop")||(this.addClass("notTop"),this.removeClass("top"),this.onNotTop&&this.onNotTop.call(this))},bottom:function(){this.hasClass("bottom")||(this.addClass("bottom"),this.removeClass("notBottom"),this.onBottom&&this.onBottom.call(this))},notBottom:function(){this.hasClass("notBottom")||(this.addClass("notBottom"),this.removeClass("bottom"),this.onNotBottom&&this.onNotBottom.call(this))},shouldUnpin:function(t){return"down"===t.direction&&!t.top&&t.toleranceExceeded},shouldPin:function(t){return"up"===t.direction&&t.toleranceExceeded||t.top},addClass:function(t){this.elem.classList.add.apply(this.elem.classList,this.classes[t].split(" "))},removeClass:function(t){this.elem.classList.remove.apply(this.elem.classList,this.classes[t].split(" "))},hasClass:function(t){return this.classes[t].split(" ").every(function(t){return this.classList.contains(t)},this.elem)},update:function(t){t.isOutOfBounds||!0!==this.frozen&&(t.top?this.top():this.notTop(),t.bottom?this.bottom():this.notBottom(),this.shouldUnpin(t)?this.unpin():this.shouldPin(t)&&this.pin())}},o.options={tolerance:{up:0,down:0},offset:0,scroller:t()?window:null,classes:{frozen:"headroom--frozen",pinned:"headroom--pinned",unpinned:"headroom--unpinned",top:"headroom--top",notTop:"headroom--not-top",bottom:"headroom--bottom",notBottom:"headroom--not-bottom",initial:"headroom"}},o.cutsTheMustard=!!(t()&&function(){}.bind&&"classList"in document.documentElement&&Object.assign&&Object.keys&&requestAnimationFrame),o}); \ No newline at end of file diff --git a/docs/deps/headroom-0.11.0/jQuery.headroom.min.js b/docs/deps/headroom-0.11.0/jQuery.headroom.min.js new file mode 100644 index 0000000..17f70c9 --- /dev/null +++ b/docs/deps/headroom-0.11.0/jQuery.headroom.min.js @@ -0,0 +1,7 @@ +/*! + * headroom.js v0.9.4 - Give your page some headroom. Hide your header until you need it + * Copyright (c) 2017 Nick Williams - http://wicky.nillia.ms/headroom.js + * License: MIT + */ + +!function(a){a&&(a.fn.headroom=function(b){return this.each(function(){var c=a(this),d=c.data("headroom"),e="object"==typeof b&&b;e=a.extend(!0,{},Headroom.options,e),d||(d=new Headroom(this,e),d.init(),c.data("headroom",d)),"string"==typeof b&&(d[b](),"destroy"===b&&c.removeData("headroom"))})},a("[data-headroom]").each(function(){var b=a(this);b.headroom(b.data())}))}(window.Zepto||window.jQuery); \ No newline at end of file diff --git a/docs/deps/jquery-3.6.0/jquery-3.6.0.js b/docs/deps/jquery-3.6.0/jquery-3.6.0.js new file mode 100644 index 0000000..fc6c299 --- /dev/null +++ b/docs/deps/jquery-3.6.0/jquery-3.6.0.js @@ -0,0 +1,10881 @@ +/*! + * jQuery JavaScript Library v3.6.0 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2021-03-02T17:08Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var flat = arr.flat ? function( array ) { + return arr.flat.call( array ); +} : function( array ) { + return arr.concat.apply( [], array ); +}; + + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 + // Plus for old WebKit, typeof returns "function" for HTML collections + // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) + return typeof obj === "function" && typeof obj.nodeType !== "number" && + typeof obj.item !== "function"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + +var document = window.document; + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.6.0", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return flat( ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), + function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); + } ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.6 + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://js.foundation/ + * + * Date: 2021-02-16 + */ +( function( window ) { +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ( {} ).hasOwnProperty, + arr = [], + pop = arr.pop, + pushNative = arr.push, + push = arr.push, + slice = arr.slice, + + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[ i ] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + + "ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] + // or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rhtml = /HTML$/i, + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + return nonHex ? + + // Strip the backslash prefix from a non-hex escape sequence + nonHex : + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android<4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + + // Can't trust NodeList.length + while ( ( target[ j++ ] = els[ i++ ] ) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && + + // Support: IE 8 only + // Exclude object elements + ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + if ( newContext !== context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + " " ] = value ); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement( "fieldset" ); + + try { + return !!fn( el ); + } catch ( e ) { + return false; + } finally { + + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split( "|" ), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[ i ] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( ( cur = cur.nextSibling ) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return ( name === "input" || name === "button" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction( function( argument ) { + argument = +argument; + return markFunction( function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); + } + } + } ); + } ); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + var namespace = elem && elem.namespaceURI, + docElem = elem && ( elem.ownerDocument || elem ).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, + // Safari 4 - 5 only, Opera <=11.6 - 12.x only + // IE/Edge & older browsers don't support the :scope pseudo-class. + // Support: Safari 6.0 only + // Safari 6.0 supports :scope but it's an alias of :root there. + support.scope = assert( function( el ) { + docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); + return typeof el.querySelectorAll !== "undefined" && + !el.querySelectorAll( ":scope fieldset div" ).length; + } ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert( function( el ) { + el.className = "i"; + return !el.getAttribute( "className" ); + } ); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert( function( el ) { + el.appendChild( document.createComment( "" ) ); + return !el.getElementsByTagName( "*" ).length; + } ); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + } ); + + // ID filter and find + if ( support.getById ) { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }; + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode( "id" ); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find[ "TAG" ] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } + + // Support: Firefox <=3.6 - 5 only + // Old Firefox doesn't throw on a badly-escaped identifier. + el.querySelectorAll( "\\\f" ); + rbuggyQSA.push( "[\\r\\n\\f]" ); + } ); + + assert( function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll( "[name=d]" ).length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: Opera 10 - 11 only + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll( "*,:x" ); + rbuggyQSA.push( ",.*:" ); + } ); + } + + if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector ) ) ) ) { + + assert( function( el ) { + + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + } ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); + } : + function( a, b ) { + if ( b ) { + while ( ( b = b.parentNode ) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { + + // Choose the first element that is related to our preferred document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a == document || a.ownerDocument == preferredDoc && + contains( preferredDoc, a ) ) { + return -1; + } + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b == document || b.ownerDocument == preferredDoc && + contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + return a == document ? -1 : + b == document ? 1 : + /* eslint-enable eqeqeq */ + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( ( cur = cur.parentNode ) ) { + ap.unshift( cur ); + } + cur = b; + while ( ( cur = cur.parentNode ) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[ i ] === bp[ i ] ) { + i++; + } + + return i ? + + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[ i ], bp[ i ] ) : + + // Otherwise nodes in our document sort first + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + ap[ i ] == preferredDoc ? -1 : + bp[ i ] == preferredDoc ? 1 : + /* eslint-enable eqeqeq */ + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( support.matchesSelector && documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( elem.ownerDocument || elem ) != document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[ 1 ] = match[ 1 ].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || + match[ 5 ] || "" ).replace( runescape, funescape ); + + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + ( pattern = new RegExp( "(^|" + whitespace + + ")" + className + "(" + whitespace + "|$)" ) ) && classCache( + className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + /* eslint-disable max-len */ + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + /* eslint-enable max-len */ + + }; + }, + + "CHILD": function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction( function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[ i ] ); + seed[ idx ] = !( matches[ idx ] = matched[ i ] ); + } + } ) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + "not": markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element (issue #299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + "has": markFunction( function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + } ), + + "contains": markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && + ( !document.hasFocus || document.hasFocus() ) && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return ( nodeName === "input" && !!elem.checked ) || + ( nodeName === "option" && !!elem.selected ); + }, + + "selected": function( elem ) { + + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos[ "empty" ]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( ( attr = elem.getAttribute( "type" ) ) == null || + attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo( function() { + return [ 0 ]; + } ), + + "last": createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + "even": createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "odd": createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? + argument + length : + argument > length ? + length : + argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rcombinators.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrim, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || + ( outerCache[ elem.uniqueID ] = {} ); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = uniqueCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( + selector || "*", + context.nodeType ? [ context ] : context, + [] + ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || Expr.relative[ " " ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens + .slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), + len = elems.length; + + if ( outermost ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( + selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) + ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + + context = ( Expr.find[ "ID" ]( token.matches[ 0 ] + .replace( runescape, funescape ), context ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( Expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = Expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + token.matches[ 0 ].replace( runescape, funescape ), + rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || + context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert( function( el ) { + + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert( function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute( "href" ) === "#"; +} ) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + } ); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert( function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +} ) ) { + addHandle( "value", function( elem, _name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + } ); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert( function( el ) { + return el.getAttribute( "disabled" ) == null; +} ) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; + } + } ); +} + +return Sizzle; + +} )( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +} +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, _i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, _i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, _i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( elem.contentDocument != null && + + // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( _i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the primary Deferred + primary = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + primary.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( primary.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return primary.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); + } + + return primary.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, _key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached( elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // Support: IE <=9 only + // IE <=9 replaces "; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
    " ], + col: [ 2, "", "
    " ], + tr: [ 2, "", "
    " ], + td: [ 3, "", "
    " ], + + _default: [ 0, "", "" ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: IE <=9 only +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = Object.create( null ); + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", returnTrue ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + + // Support: Chrome 86+ + // In Chrome, if an element having a focusout handler is blurred by + // clicking outside of it, it invokes the handler synchronously. If + // that handler calls `.remove()` on the element, the data is cleared, + // leaving `result` undefined. We need to guard against this. + return result && result.value; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering the + // native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + which: true +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + // Suppress native focus or blur as it's already being fired + // in leverageNative. + _default: function() { + return true; + }, + + delegateType: delegateType + }; +} ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.get( src ); + events = pdataOld.events; + + if ( events ) { + dataPriv.remove( dest, "handle events" ); + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = flat( args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + }, doc ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var swap = function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableTrDimensionsVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + }, + + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + // + // Support: Firefox 70+ + // Only Firefox includes border widths + // in computed dimensions. (gh-4529) + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( "table" ); + tr = document.createElement( "tr" ); + trChild = document.createElement( "div" ); + + table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; + tr.style.cssText = "border:1px solid"; + + // Support: Chrome 86+ + // Height set through cssText does not get applied. + // Computed height then comes back as 0. + tr.style.height = "1px"; + trChild.style.height = "9px"; + + // Support: Android 8 Chrome 86+ + // In our bodyBackground.html iframe, + // display for all div elements is set to "inline", + // which causes a problem only in Android 8 Chrome 86. + // Ensuring the div is display: block + // gets around this issue. + trChild.style.display = "block"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + + parseInt( trStyle.borderTopWidth, 10 ) + + parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( name ) { + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +function setPositiveNumber( _elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Support: IE 9 - 11 only + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + if ( ( !support.boxSizingReliable() && isBorderBox || + + // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName( elem, "tr" ) || + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || + + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "gridArea": true, + "gridColumn": true, + "gridColumnEnd": true, + "gridColumnStart": true, + "gridRow": true, + "gridRowEnd": true, + "gridRowStart": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( _i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml, parserErrorElem; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) {} + + parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; + if ( !xml || parserErrorElem ) { + jQuery.error( "Invalid XML: " + ( + parserErrorElem ? + jQuery.map( parserErrorElem.childNodes, function( el ) { + return el.textContent; + } ).join( "\n" ) : + data + ) ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ).filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ).map( function( _i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + +originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Use a noop converter for missing script but not if jsonp + if ( !isSuccess && + jQuery.inArray( "script", s.dataTypes ) > -1 && + jQuery.inArray( "json", s.dataTypes ) < 0 ) { + s.converters[ "text script" ] = function() {}; + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( _i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + +jQuery.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + + +jQuery._evalUrl = function( url, options, doc ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options, doc ); + } + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + + + + + + + + + Skip to contents + + +
    +
    +
    + +

    R package for Single Cell analysis

    +

    Gitflow Action for R Package Development Version Docker Image Version

    +

    + +



    +

    The Single Cell Workflow streamlines the analysis of multimodal Single Cell RNA-Seq data produced from 10x Genomics. It can be run in a docker container, and for biologists, in user-friendly web-based interactive notebooks (NIDAP, Palantir Foundry). Much of it is based on the Seurat workflow in Bioconductor, and supports CITE-Seq data. It incorporates a cell identification step (ModScore) that utilizes module scores obtained from Seurat and also includes Harmony for batch correction.

    +


    +

    For further documentation see our detailed Docs Website

    +



    +

    Future Developments include addition of support for multiomics (TCR-Seq, ATAC-Seq) single cell data and integration with spatial transcriptomics data.

    +
    +
    +
    + + +
    + + + +
    +
    + + + + + + + diff --git a/docs/katex-auto.js b/docs/katex-auto.js new file mode 100644 index 0000000..20651d9 --- /dev/null +++ b/docs/katex-auto.js @@ -0,0 +1,14 @@ +// https://github.com/jgm/pandoc/blob/29fa97ab96b8e2d62d48326e1b949a71dc41f47a/src/Text/Pandoc/Writers/HTML.hs#L332-L345 +document.addEventListener("DOMContentLoaded", function () { + var mathElements = document.getElementsByClassName("math"); + var macros = []; + for (var i = 0; i < mathElements.length; i++) { + var texText = mathElements[i].firstChild; + if (mathElements[i].tagName == "SPAN") { + katex.render(texText.data, mathElements[i], { + displayMode: mathElements[i].classList.contains("display"), + throwOnError: false, + macros: macros, + fleqn: false + }); + }}}); diff --git a/docs/lightswitch.js b/docs/lightswitch.js new file mode 100644 index 0000000..9467125 --- /dev/null +++ b/docs/lightswitch.js @@ -0,0 +1,85 @@ + +/*! + * Color mode toggler for Bootstrap's docs (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors + * Licensed under the Creative Commons Attribution 3.0 Unported License. + * Updates for {pkgdown} by the {bslib} authors, also licensed under CC-BY-3.0. + */ + +const getStoredTheme = () => localStorage.getItem('theme') +const setStoredTheme = theme => localStorage.setItem('theme', theme) + +const getPreferredTheme = () => { + const storedTheme = getStoredTheme() + if (storedTheme) { + return storedTheme + } + + return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' +} + +const setTheme = theme => { + if (theme === 'auto') { + document.documentElement.setAttribute('data-bs-theme', (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')) + } else { + document.documentElement.setAttribute('data-bs-theme', theme) + } +} + +function bsSetupThemeToggle () { + 'use strict' + + const showActiveTheme = (theme, focus = false) => { + var activeLabel, activeIcon; + + document.querySelectorAll('[data-bs-theme-value]').forEach(element => { + const buttonTheme = element.getAttribute('data-bs-theme-value') + const isActive = buttonTheme == theme + + element.classList.toggle('active', isActive) + element.setAttribute('aria-pressed', isActive) + + if (isActive) { + activeLabel = element.textContent; + activeIcon = element.querySelector('span').classList.value; + } + }) + + const themeSwitcher = document.querySelector('#dropdown-lightswitch') + if (!themeSwitcher) { + return + } + + themeSwitcher.setAttribute('aria-label', activeLabel) + themeSwitcher.querySelector('span').classList.value = activeIcon; + + if (focus) { + themeSwitcher.focus() + } + } + + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => { + const storedTheme = getStoredTheme() + if (storedTheme !== 'light' && storedTheme !== 'dark') { + setTheme(getPreferredTheme()) + } + }) + + window.addEventListener('DOMContentLoaded', () => { + showActiveTheme(getPreferredTheme()) + + document + .querySelectorAll('[data-bs-theme-value]') + .forEach(toggle => { + toggle.addEventListener('click', () => { + const theme = toggle.getAttribute('data-bs-theme-value') + setTheme(theme) + setStoredTheme(theme) + showActiveTheme(theme, true) + }) + }) + }) +} + +setTheme(getPreferredTheme()); +bsSetupThemeToggle(); diff --git a/docs/link.svg b/docs/link.svg new file mode 100644 index 0000000..88ad827 --- /dev/null +++ b/docs/link.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/docs/pkgdown.js b/docs/pkgdown.js new file mode 100644 index 0000000..1a99c65 --- /dev/null +++ b/docs/pkgdown.js @@ -0,0 +1,162 @@ +/* http://gregfranko.com/blog/jquery-best-practices/ */ +(function($) { + $(function() { + + $('nav.navbar').headroom(); + + Toc.init({ + $nav: $("#toc"), + $scope: $("main h2, main h3, main h4, main h5, main h6") + }); + + if ($('#toc').length) { + $('body').scrollspy({ + target: '#toc', + offset: $("nav.navbar").outerHeight() + 1 + }); + } + + // Activate popovers + $('[data-bs-toggle="popover"]').popover({ + container: 'body', + html: true, + trigger: 'focus', + placement: "top", + sanitize: false, + }); + + $('[data-bs-toggle="tooltip"]').tooltip(); + + /* Clipboard --------------------------*/ + + function changeTooltipMessage(element, msg) { + var tooltipOriginalTitle=element.getAttribute('data-bs-original-title'); + element.setAttribute('data-bs-original-title', msg); + $(element).tooltip('show'); + element.setAttribute('data-bs-original-title', tooltipOriginalTitle); + } + + if(ClipboardJS.isSupported()) { + $(document).ready(function() { + var copyButton = ""; + + $("div.sourceCode").addClass("hasCopyButton"); + + // Insert copy buttons: + $(copyButton).prependTo(".hasCopyButton"); + + // Initialize tooltips: + $('.btn-copy-ex').tooltip({container: 'body'}); + + // Initialize clipboard: + var clipboard = new ClipboardJS('[data-clipboard-copy]', { + text: function(trigger) { + return trigger.parentNode.textContent.replace(/\n#>[^\n]*/g, ""); + } + }); + + clipboard.on('success', function(e) { + changeTooltipMessage(e.trigger, 'Copied!'); + e.clearSelection(); + }); + + clipboard.on('error', function(e) { + changeTooltipMessage(e.trigger,'Press Ctrl+C or Command+C to copy'); + }); + + }); + } + + /* Search marking --------------------------*/ + var url = new URL(window.location.href); + var toMark = url.searchParams.get("q"); + var mark = new Mark("main#main"); + if (toMark) { + mark.mark(toMark, { + accuracy: { + value: "complementary", + limiters: [",", ".", ":", "/"], + } + }); + } + + /* Search --------------------------*/ + /* Adapted from https://github.com/rstudio/bookdown/blob/2d692ba4b61f1e466c92e78fd712b0ab08c11d31/inst/resources/bs4_book/bs4_book.js#L25 */ + // Initialise search index on focus + var fuse; + $("#search-input").focus(async function(e) { + if (fuse) { + return; + } + + $(e.target).addClass("loading"); + var response = await fetch($("#search-input").data("search-index")); + var data = await response.json(); + + var options = { + keys: ["what", "text", "code"], + ignoreLocation: true, + threshold: 0.1, + includeMatches: true, + includeScore: true, + }; + fuse = new Fuse(data, options); + + $(e.target).removeClass("loading"); + }); + + // Use algolia autocomplete + var options = { + autoselect: true, + debug: true, + hint: false, + minLength: 2, + }; + var q; +async function searchFuse(query, callback) { + await fuse; + + var items; + if (!fuse) { + items = []; + } else { + q = query; + var results = fuse.search(query, { limit: 20 }); + items = results + .filter((x) => x.score <= 0.75) + .map((x) => x.item); + if (items.length === 0) { + items = [{dir:"Sorry 😿",previous_headings:"",title:"No results found.",what:"No results found.",path:window.location.href}]; + } + } + callback(items); +} + $("#search-input").autocomplete(options, [ + { + name: "content", + source: searchFuse, + templates: { + suggestion: (s) => { + if (s.title == s.what) { + return `${s.dir} >
    ${s.title}
    `; + } else if (s.previous_headings == "") { + return `${s.dir} >
    ${s.title}
    > ${s.what}`; + } else { + return `${s.dir} >
    ${s.title}
    > ${s.previous_headings} > ${s.what}`; + } + }, + }, + }, + ]).on('autocomplete:selected', function(event, s) { + window.location.href = s.path + "?q=" + q + "#" + s.id; + }); + }); +})(window.jQuery || window.$) + +document.addEventListener('keydown', function(event) { + // Check if the pressed key is '/' + if (event.key === '/') { + event.preventDefault(); // Prevent any default action associated with the '/' key + document.getElementById('search-input').focus(); // Set focus to the search input + } +}); diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml new file mode 100644 index 0000000..51d7894 --- /dev/null +++ b/docs/pkgdown.yml @@ -0,0 +1,16 @@ +pandoc: 3.8.2.1 +pkgdown: 2.1.3 +pkgdown_sha: ~ +articles: + CONTRIBUTING: CONTRIBUTING.html + README: README.html + SCWorkflow-Annotations: SCWorkflow-Annotations.html + SCWorkflow-DEG: SCWorkflow-DEG.html + SCWorkflow-QC: SCWorkflow-QC.html + SCWorkflow-SubsetReclust: SCWorkflow-SubsetReclust.html + SCWorkflow-Usage: SCWorkflow-Usage.html + SCWorkflow-Visualizations: SCWorkflow-Visualizations.html +last_built: 2025-12-16T01:06Z +urls: + reference: https://nidap-community.github.io/SCWorkflow/reference + article: https://nidap-community.github.io/SCWorkflow/articles diff --git a/docs/reference/annotateCellTypes.html b/docs/reference/annotateCellTypes.html new file mode 100644 index 0000000..4942a24 --- /dev/null +++ b/docs/reference/annotateCellTypes.html @@ -0,0 +1,142 @@ + +Annotating cell types using SingleR module — annotateCellTypes • SCWorkflow + Skip to contents + + +
    +
    +
    + +
    +

    SingleR is an automatic annotation method for single-cell +RNA sequencing (scRNAseq) data (Aran et al. 2019). Given a reference dataset +of samples (single-cell or bulk) with known labels, it labels new cells +from a test dataset based on similarity to the reference.

    +
    + +
    +

    Usage

    +
    annotateCellTypes(
    +  object,
    +  species = "Mouse",
    +  reduction.type = "umap",
    +  legend.dot.size = 2,
    +  do.finetuning = FALSE,
    +  local.celldex = NULL,
    +  use.clusters = NULL
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    Object of class Seurat (your combined Seurat Object +after PC reduction has been performed)

    + + +
    species
    +

    The species of your samples ("Human" or "Mouse"). +Default is "Mouse"

    + + +
    reduction.type
    +

    Select the kind of clustering visualization you would +like to use to visualize the cell type results ("umap", "tsne", "pca")

    + + +
    legend.dot.size
    +

    the size of the colored dots on your chart legend. +Default is 2

    + + +
    do.finetuning
    +

    Performs the SingleR fine-tuning function. +Default is FALSE

    + + +
    local.celldex
    +

    Provide a local copy of CellDex library. +Default is NULL

    + + +
    use.clusters
    +

    Provide cluster identities for each cell. +Default is NULL

    + +
    +
    +

    Value

    +

    a Seurat object with additional metadata

    +
    +
    +

    Details

    +

    This function is Step 5 of the basic Single-Cell RNA-seq workflow. +It is the starting point for downstream visualization, subsetting, and +analysis. It takes a combined seurat object as input, such as the one created +by the Combined&Renormalized function at the end of the Filter&QC Path

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/reference/appendMetadataToSeuratObject.html b/docs/reference/appendMetadataToSeuratObject.html new file mode 100644 index 0000000..1d684a5 --- /dev/null +++ b/docs/reference/appendMetadataToSeuratObject.html @@ -0,0 +1,112 @@ + +Append Metadata to Seurat Object. — appendMetadataToSeuratObject • SCWorkflow + Skip to contents + + +
    +
    +
    + +
    +

    This template appends sample metadata from an input +table to a Seurat object, creating new metadata columns labeling all cells +from each sample by the new metadata values.

    +
    + +
    +

    Usage

    +
    appendMetadataToSeuratObject(object, metadata.to.append, sample.name.column)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    The input Seurat Object or list of Seurat Objects to which you +wish to add metadata.

    + + +
    metadata.to.append
    +

    A table of sample metadata that you want to append +to the already-existing metadata within the input Seurat Object(s).

    + + +
    sample.name.column
    +

    The column of the input metadata.to.append table +that contains sample names matching the orig.idents in the input object(s).

    + +
    +
    +

    Value

    +

    Function returns a Seurat Object or Objects with additional metadata +columns containing the appended metadata now annotated each cell by sample +name (orig.ident).

    +
    +
    +

    Details

    +

    This template appends sample metadata from an input +table to a Seurat object, creating new metadata columns labeling all cells +from each sample by the new metadata values.

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/reference/colorByGene.html b/docs/reference/colorByGene.html new file mode 100644 index 0000000..5844e6b --- /dev/null +++ b/docs/reference/colorByGene.html @@ -0,0 +1,162 @@ + +Visualize gene expression for provided Genes across your cells as a heatmap — colorByGene • SCWorkflow + Skip to contents + + +
    +
    +
    + +
    +

    You should see one plot (TSNE or UMAP, your choice) +per gene name provided. The intensity of the red color will be relative +to the expression of the gene in that cell

    +
    + +
    +

    Usage

    +
    colorByGene(
    +  object,
    +  samples.to.include,
    +  gene,
    +  reduction.type = "umap",
    +  number.of.rows = 0,
    +  return.seurat.object = FALSE,
    +  color = "red",
    +  point.size = 1,
    +  point.shape = 16,
    +  point.transparency = 0.5,
    +  use.cite.seq.data = FALSE,
    +  assay = "SCT"
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    Object of class Seurat

    + + +
    samples.to.include
    +

    Samples to be included in the analysis

    + + +
    gene
    +

    Genes which you would like to visualize

    + + +
    reduction.type
    +

    Select the kind of clustering visualization +you would like to use to visualize the cell type results +("umap", "tsne", "pca"). Default is "umap"

    + + +
    number.of.rows
    +

    The number of rows you want to arrange your plots into

    + + +
    return.seurat.object
    +

    Set to FALSE if you want only a geneset +(and not a Seurat object) to be returned

    + + +
    color
    +

    The color you want to use in your heatmap (default "red")

    + + +
    point.size
    +

    The size of the points representing +each cell in your visualization. Default is 1

    + + +
    point.shape
    +

    The code for your point shape (R "pch" argument). +Default is 16

    + + +
    point.transparency
    +

    Set the transparency. Default is 0.5

    + + +
    use.cite.seq.data
    +

    TRUE if you would like to plot Antibody clusters +from CITEseq instead of scRNA.

    + + +
    assay
    +

    Select Assay to Plot (default is SCT)

    + +
    +
    +

    Value

    +

    a Seurat object with additional metadata or gene table and plot

    +
    +
    +

    Details

    +

    This function must be run downstream of the Sample Names function, +as well as be provided a combined Seurat Object +such as the one produced by the SingleR Cell Annotation function

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/reference/colorByMarkerTable.html b/docs/reference/colorByMarkerTable.html new file mode 100644 index 0000000..f5f8bc4 --- /dev/null +++ b/docs/reference/colorByMarkerTable.html @@ -0,0 +1,155 @@ + +Color by Gene List — colorByMarkerTable • SCWorkflow + Skip to contents + + +
    +
    +
    + +
    +

    Returns a panel of reduction plots colored by marker expression

    +
    + +
    +

    Usage

    +
    colorByMarkerTable(
    +  object,
    +  samples.subset,
    +  samples.to.display,
    +  manual.genes = c(),
    +  marker.table,
    +  cells.of.interest,
    +  protein.presence = FALSE,
    +  assay = "SCT",
    +  slot = "scale.data",
    +  reduction.type = "umap",
    +  point.transparency = 0.5,
    +  point.shape = 16,
    +  cite.seq = FALSE
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    Seurat-class object

    + + +
    samples.subset
    +

    List of samples to subset the data by

    + + +
    samples.to.display
    +

    List of samples to depict on dimension plot, +samples not in the list would be colored gray in +the background

    + + +
    marker.table
    +

    Table of marker genes for each celltype +(column names of the table), append "_prot" or "_neg" for +proteins or negative markers

    + + +
    cells.of.interest
    +

    Celltypes from geneset_dataframe to screen for

    + + +
    protein.presence
    +

    Set to TRUE if protein markers are used

    + + +
    assay
    +

    Assay to extract gene expression data from (Default: "SCT")

    + + +
    reduction.type
    +

    Choose among tsne, umap, and pca (Default: "umap")

    + + +
    point.transparency
    +

    Set to lower values for more see through points on +dimension plot (Default: 0.5)

    + + +
    point.shape
    +

    Change the shape of points for between visualization +(Default: 16)

    + + +
    cite.seq
    +

    Set to TRUE to use CITE-seq embedding for dimension reduction

    + +
    +
    +

    Value

    +

    arranged grob of dimension reduction plots colored by individual +marker expression

    +
    +
    +

    Details

    +

    Takes in a gene table inputted by the user, displays a panel of +tsne, umap, or pca colored by marker expression. The panel will be +organized in a similar format as the gene table, but with the +omission of genes not found in the data

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/reference/combineNormalize.html b/docs/reference/combineNormalize.html new file mode 100644 index 0000000..774259d --- /dev/null +++ b/docs/reference/combineNormalize.html @@ -0,0 +1,283 @@ + +Combine & Normalize — combineNormalize • SCWorkflow + Skip to contents + + +
    +
    +
    + +
    +

    Scales and Normalizes data, Combines samples, +runs Dimensional Reduction, Clusters, and returns a combined Seurat Object.

    +
    + +
    +

    Usage

    +
    combineNormalize(
    +  object,
    +  npcs = 30,
    +  SCT.level = "Merged",
    +  vars.to.regress = NULL,
    +  nfeatures = 2000,
    +  low.cut = 0.1,
    +  high.cut = 8,
    +  low.cut.disp = 1,
    +  high.cut.disp = 1e+05,
    +  selection.method = "vst",
    +  only.var.genes = FALSE,
    +  draw.umap = TRUE,
    +  draw.tsne = TRUE,
    +  seed.for.pca = 42,
    +  seed.for.tsne = 1,
    +  seed.for.umap = 42,
    +  clust.res.low = 0.2,
    +  clust.res.high = 1.2,
    +  clust.res.bin = 0.2,
    +  methods.pca = "none",
    +  var.threshold = 0.1,
    +  pca.reg.plot = FALSE,
    +  jackstraw = FALSE,
    +  jackstraw.dims = 5,
    +  exclude.sample = NULL,
    +  cell.count.limit = 35000,
    +  reduce.so = FALSE,
    +  project.name = "scRNAProject",
    +  cell.hashing.data = FALSE
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    a list of seurat objects for each sample.

    + + +
    npcs
    +

    Select the number of principal components for your analysis. +Please see the elbow plot in the previous template to figure out what +number of PCs explains your variance cut-off. For example, +if the elbow plot has point at (15,0.02), it means that 15 PCs +encapsulate 98% of the variance in your data.(Default: 30)

    + + +
    SCT.level
    +

    Select at which stage to apply SCtransform nomalization. +Merged: Merge all samples and apply SCTransfrom on merged object. +Sample: Apply SCTranform on individual samples then merge into single +Seurat object. (Default: "Merged")

    + + +
    vars.to.regress
    +

    Subtract (‘regress out’) this source of heterogeneity +from the data. For example, to Subtract mitochondrial effects, +input "percent.mt." Options: percent.mt, nCount.RNA, +S.Score, G2M.Score, CC.Difference. (Default: NULL)

    + + +
    nfeatures
    +

    Number of variable features. (Default: 2000)

    + + +
    low.cut
    +

    Set low cutoff to calculate feature means in +Seurat::FindVariableFeatures. (Default: 0.1)

    + + +
    high.cut
    +

    Set high cutoff to calculate feature means in +Seurat::FindVariableFeatures. (Default: 8)

    + + +
    low.cut.disp
    +

    Set low cutoff to calculate feature dispersions in +Seurat::FindVariableFeatures.(Default: 1)

    + + +
    high.cut.disp
    +

    Set high cutoff to calculate feature dispersions in +Seurat::FindVariableFeatures. (Default: 100000)

    + + +
    selection.method
    +

    Method to choose top variable features. +Options: vst, mean.var.plot, dispersion. (Default: 'vst')

    + + +
    only.var.genes
    +

    If dataset is larger than ~40k filtered cells, +set to TRUE. If TRUE, only variable genes will be available for +downstream analysis. If dataset is larger than the number of cells set in +"Conserve Memory Max Cell Limit" "Only Variable Genes" is automatically +set to TRUE. (Default: FALSE)

    + + +
    draw.umap
    +

    If TRUE, draw UMAP plot. (Default: TRUE)

    + + +
    draw.tsne
    +

    If TRUE, draw TSNE plot. (Default: TRUE)

    + + +
    seed.for.pca
    +

    Set a random seed for PCA calculation. (Default: 42)

    + + +
    seed.for.tsne
    +

    Set a random seed for TSNE calculation. (Default: 1)

    + + +
    seed.for.umap
    +

    Set a random seed for UMAP calculation. (Default: 42)

    + + +
    clust.res.low
    +

    Select minimum resolution for clustering plots. +The lower you set this, the FEWER clusters will be generated. +(Default: 0.2)

    + + +
    clust.res.high
    +

    Select the maximum resolution for clustering. +The higher you set this number, the MORE clusters you will produced. +(Default: 1.2)

    + + +
    clust.res.bin
    +

    Select the bins for your cluster plots. +For example, if you input 0.2 as your bin, and have low/high resolution +ranges of 0.2 and 0.6, then the template will produce cluster plots +at resolutions of 0.2, 0.4 and 0.6. (Default: 0.2)

    + + +
    methods.pca
    +

    Methods available: Marchenko-Pastur: use eigenvalue +null upper bound from URD, Elbow: Find threshold where percent change +in variation between consecutive PCs is less than X% (set in var.threshold). +If none is selected (regardless of other selections) the plot will not be +generated. (Default: 'none')

    + + +
    var.threshold
    +

    For Elbow method, set percent change threshold +in variation between consecutive PCs. (Default: 0.1)

    + + +
    pca.reg.plot
    +

    Opt to visualize the effect of your regression variables +on in a PCA plot. This plot will create PCA plots with and without +regression variables applied and can be used to help determine if +regression is necessary to properly normalize your data. (Default: FALSE)

    + + +
    jackstraw
    +

    Opt to visualize your data in a Jackstraw plot. Jackstraw +plot can add more description than an elbow plot but is compute intensive +process and may not be suitable for larger datasets. (Default: FALSE)

    + + +
    jackstraw.dims
    +

    Recommended max 10.(Default: 5)

    + + +
    exclude.sample
    +

    Exclude unwanted samples from the merge step. +Include sample names to be removed. If you want to exclude several samples, +separate each sample number by comma (e.g. sample1,sample2,sample3,sample4). +(Default: NULL)

    + + +
    cell.count.limit
    +

    If total number of cell exceeds this limit conserve +memory option of SCTransform will be used and return only Variable Genes. +(Default: 35000)

    + + +
    reduce.so
    +

    Remove any additional assays from input Seurat Objects +except for the original RNA Assay. This option should be used if input +Seurat Object was created outside of the NIDAP pipeline. (Default: FALSE)

    + + +
    project.name
    +

    Add project name to the Seurat object metadata. +(Default: 'scRNAProject')

    + + +
    cell.hashing.data
    +

    Set to "TRUE" if you are using cell-hashed data. +(Default: FALSE)

    + +
    +
    +

    Value

    +

    Seurat Objects and QC plots

    +
    +
    +

    Details

    +

    This is Step 3 in the basic Single-Cell RNA-seq workflow. +This template will summarize the multi-dimensionality of your data into +a set of "principal components" to allow for easier analysis.

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/reference/degGeneExpressionMarkers.html b/docs/reference/degGeneExpressionMarkers.html new file mode 100644 index 0000000..74b6d1c --- /dev/null +++ b/docs/reference/degGeneExpressionMarkers.html @@ -0,0 +1,142 @@ + +DEG (Gene Expression Markers) — degGeneExpressionMarkers • SCWorkflow + Skip to contents + + +
    +
    +
    + +
    +

    This function performs a DEG (differential expression of genes) +analysis on a merged Seurat object to identify expression markers +between different groups of cells (contrasts).

    +
    + +
    +

    Usage

    +
    degGeneExpressionMarkers(
    +  object,
    +  samples,
    +  contrasts,
    +  parameter.to.test = "orig_ident",
    +  test.to.use = "MAST",
    +  log.fc.threshold = 0.25,
    +  use.spark = FALSE,
    +  assay.to.use = "SCT"
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    Seurat-class object

    + + +
    samples
    +

    Samples to be included in the analysis

    + + +
    contrasts
    +

    Contrasts in the "A-B" format

    + + +
    parameter.to.test
    +

    Select the metadata column that you would like +to use to perform your DEG analysis and construct your contrasts from. +Default is "orig_ident"

    + + +
    test.to.use
    +

    The kind of algorithm you would like to use +to perform your DEG analysis. Default is the MAST algorithm +(wilcox,bimod,roc,t,negbinom,poisson,LR,MAST,DESeq2).

    + + +
    log.fc.threshold
    +

    The minimum log fold-change between contrasts +that you would like to analyze. Default is 0.25

    + + +
    use.spark
    +

    Opt to use Spark to parallelize computations. +Default is FALSE

    + + +
    assay.to.use
    +

    The assay to use for your DEG analysis. +Default is SCT, but can use linearly scaled data by selecting RNA instead

    + +
    +
    +

    Value

    +

    a dataframe with DEG.

    +
    +
    +

    Details

    +

    The recommended input is a merged Seurat object +with SingleR annotations, along with its associated sample names and metadata

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/reference/dotPlotMet.html b/docs/reference/dotPlotMet.html new file mode 100644 index 0000000..c9d6613 --- /dev/null +++ b/docs/reference/dotPlotMet.html @@ -0,0 +1,135 @@ + +Dotplot of Gene Expression by Metadata — dotPlotMet • SCWorkflow + Skip to contents + + +
    +
    +
    + +
    +

    This function uses the Dotplot function from Seurat and plots +average gene expression values and percent expressed for a set of +genes.

    +
    + +
    +

    Usage

    +
    dotPlotMet(
    +  object,
    +  metadata,
    +  cells,
    +  markers,
    +  plot.reverse = FALSE,
    +  cell.reverse.sort = FALSE,
    +  dot.color = "darkblue"
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    Seurat Object

    + + +
    metadata
    +

    Metadata column in Seurat Object to plot

    + + +
    cells
    +

    Vector of metadata category factors to plot and should be found +in metadata column. Order of plotting will follow exact order as entered.

    + + +
    markers
    +

    Vector of genes to plot. Order of plotting will follow exact +order as entered

    + + +
    plot.reverse
    +

    If TRUE, set metadata categories to x-axis and genes to +y-axis (default is FALSE)

    + + +
    cell.reverse.sort
    +

    If TRUE, Reverse plot order of metadata category +factors (default is FALSE)

    + + +
    dot.color
    +

    Dot color (default is "dark blue")

    + +
    +
    +

    Value

    +

    Dotplot with markers and cell types.

    +
    +
    +

    Details

    +

    This method provides a dotplot showing the percent frequency of +gene-positive cells as size of dot and degree of expression as color +of dot.

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/reference/dualLabeling.html b/docs/reference/dualLabeling.html new file mode 100644 index 0000000..c033779 --- /dev/null +++ b/docs/reference/dualLabeling.html @@ -0,0 +1,238 @@ + +Plot coexpression of 2 markers using transcript and/or protein expression values — dualLabeling • SCWorkflow + Skip to contents + + +
    +
    +
    + +
    +

    This method provides visualization of coexpression of 2 genes +(or proteins) and additional methods for filtering for cells with gene +expression values that are above or below thresholds set for one or both +markers. The method allows for filtering (optional) of the Seurat object +using manually set expression thresholds.

    +
    + +
    +

    Usage

    +
    dualLabeling(
    +  object,
    +  samples,
    +  marker.1,
    +  marker.2,
    +  marker.1.type = "SCT",
    +  marker.2.type = "SCT",
    +  data.reduction = "both",
    +  point.size = 0.5,
    +  point.shape = 16,
    +  point.transparency = 0.5,
    +  add.marker.thresholds = TRUE,
    +  marker.1.threshold = 0.5,
    +  marker.2.threshold = 0.5,
    +  filter.data = TRUE,
    +  marker.1.filter.direction = "greater than",
    +  marker.2.filter.direction = "greater than",
    +  apply.filter.1 = TRUE,
    +  apply.filter.2 = TRUE,
    +  filter.condition = TRUE,
    +  parameter.name = "My_CoExp",
    +  trim.marker.1 = FALSE,
    +  trim.marker.2 = FALSE,
    +  pre.scale.trim = 0.99,
    +  display.unscaled.values = FALSE
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    Seurat-class object

    + + +
    samples
    +

    Samples to be included in the analysis

    + + +
    marker.1
    +

    First gene/marker for coexpression analysis

    + + +
    marker.2
    +

    Second gene/marker for coexpression analysis

    + + +
    marker.1.type
    +

    Slot to use for first marker. Choices are "SCT", +"protein","HTO" (default is "SCT")

    + + +
    marker.2.type
    +

    Slot to use for second marker. Choices are "SCT", +"protein","HTO" (default is "SCT")

    + + +
    data.reduction
    +

    Dimension Reduction method to use for image. Options +are "umap" or "tsne" (default is "umap")

    + + +
    point.size
    +

    Point size for image (default is 0.5)

    + + +
    point.shape
    +

    Point shape for image (default is 16)

    + + +
    point.transparency
    +

    Point transparency for image (default is 0.5)

    + + +
    add.marker.thresholds
    +

    Add marker thresholds on plot (default is FALSE)

    + + +
    marker.1.threshold
    +

    Threshold set for first marker (default is 0.5)

    + + +
    marker.2.threshold
    +

    Threshold set for second marker (default is 0.5)

    + + +
    filter.data
    +

    Add new parameter column to metadata annotating where +marker thresholds are applied (default is TRUE)

    + + +
    apply.filter.1
    +

    If TRUE, apply the first filter (default is TRUE)

    + + +
    apply.filter.2
    +

    If TRUE, apply the second filter (default is TRUE)

    + + +
    filter.condition
    +

    If TRUE, apply both filters 1 and 2 and take +intersection. If FALSE, apply both filters and take the union.

    + + +
    parameter.name
    +

    Name for metadata column for new marker filters +(Default is "Marker")

    + + +
    trim.marker.1
    +

    Trim top and bottom percentile of marker 1 signal to +pre-scale trim values (below) to remove extremely low and high values +(Default is TRUE)

    + + +
    trim.marker.2
    +

    Trim top and bottom percentile of marker 2 signal to +pre-scale trim values (below) to remove extremely low and high values +(Default is TRUE)

    + + +
    pre.scale.trim
    +

    Set trimming percentile values (Defalut is 0.99)

    + + +
    display.unscaled.values
    +

    Set to TRUE if you want to view the unscaled +gene/protein expression values (Default is FALSE)

    + + +
    M1.filter.direction
    +

    Annotate cells that have gene expression levels +for marker 1 using the marker 1 threshold. Choices are "greater than" +or "less than" (default is "greater than")

    + + +
    M2.filter.direction
    +

    Annotate cells that have gene expression levels +for marker 2 using the marker 2 threshold. Choices are "greater than" +or "less than" (default is "greater than")

    + + +
    density.heatmap
    +

    Creates a additional heatmap showing the density +distribution of cells. (Default is FALSE)

    + +
    +
    +

    Value

    +

    a seurat object with optional additional metadata for cells that are +positive or negative for gene markers, a coexpression plot and contingency +table showing sum of cells filtered.

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/reference/filterQC.html b/docs/reference/filterQC.html new file mode 100644 index 0000000..cf29e03 --- /dev/null +++ b/docs/reference/filterQC.html @@ -0,0 +1,247 @@ + +Filter & QC Samples — filterQC • SCWorkflow + Skip to contents + + +
    +
    +
    + +
    +

    Filters cells and Genes for each sample and generates QC Plots +to evaluate data before and after filtering.

    +
    + +
    +

    Usage

    +
    filterQC(
    +  object,
    +  min.cells = 20,
    +  filter.vdj.genes = F,
    +  nfeature.limits = c(NA, NA),
    +  mad.nfeature.limits = c(5, 5),
    +  ncounts.limits = c(NA, NA),
    +  mad.ncounts.limits = c(5, 5),
    +  mitoch.limits = c(NA, 25),
    +  mad.mitoch.limits = c(NA, 3),
    +  complexity.limits = c(NA, NA),
    +  mad.complexity.limits = c(5, NA),
    +  topNgenes.limits = c(NA, NA),
    +  mad.topNgenes.limits = c(5, 5),
    +  n.topgnes = 20,
    +  do.doublets.fitler = T,
    +  plot.outliers = "None",
    +  group.column = NA,
    +  nfeatures = 2000,
    +  low.cut = 0.1,
    +  high.cut = 8,
    +  low.cut.disp = 1,
    +  high.cut.disp = 1e+05,
    +  selection.method = "vst",
    +  npcs = 30,
    +  vars_to_regress = NULL,
    +  seed.for.PCA = 42,
    +  seed.for.TSNE = 1,
    +  seed.for.UMAP = 42
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    a list of seurat objects for each sample.

    + + +
    min.cells
    +

    Filter out genes found in less than this number of cells. +E.g. Setting to 20 will remove genes found in fewer than 3 cells of +a sample. (Default: 20)

    + + +
    filter.vdj.genes
    +

    If FALSE to remove VDJ genes from the scRNA +transcriptome assay. This is to prevent clustering bias in T-cells of the +same clonotype. Only recommended if you are also doing TCR-seq. +(Default: FALSE)

    + + +
    nfeature.limits
    +

    Filter out cells where the number of genes found in each +cell exceed the selected lower or upper limits. +Usage c(lower limit, Upper Limit). E.g. setting to c(200,1000) will remove +cells that have fewer than 200 genes or more than 1000 genes +for each sample. (Default: c(NA, NA))

    + + +
    mad.nfeature.limits
    +

    Set filter limits based on how many Median +Absolute Deviations an outlier cell will have. Calculated from the median +gene number for all cells in your sample. Usage c(lower limit, Upper Limit) +E.g. setting to c(3,5) will remove all cells with more than 3 absolute +deviations less than the median or 5 absolute deviations greater than the +median. (Default: c(5,5))

    + + +
    ncounts.limits
    +

    Filter out cells where the total number of molecules +(umi) detected within a cell exceed the selected limits. +Usage c(lower limit, Upper Limit). E.g. setting to c(200,100000) will remove +cells that have fewer than 200 or greater than 100000 molecules. +(Default: c(NA, NA))

    + + +
    mad.ncounts.limits
    +

    Set filter limits based on how many Median Absolute +Deviations an outlier cell will have. Calculated from the median number of +molecules for all cells in your sample. Usage c(lower limit, Upper Limit) +E.g. setting to c(3,5) will remove all cells with more than 3 absolute +deviations less than the median or with more than 5 absolute deviations +greater than the median. (Default: c(5,5))

    + + +
    mitoch.limits
    +

    Filter out cells whose proportion of mitochondrial genes +exceed the selected lower or upper limits. +Usage c(lower limit, Upper Limit). E.g. setting to c(0,8) will not set the +lower limit and removes cells with more than 8% mitochondrial RNA. +(Default: c(NA,25))

    + + +
    mad.mitoch.limits
    +

    Set filter limits based on how many Median Absolute +Deviations an outlier cell will have. Calculated from the Median percentage +of mitochondrial RNA for all cells in your sample. +Usage c(lower limit, Upper Limit). E.g. setting to c(NA,3) will not set a +lower limit and remove all cells with more than 3 absolute deviations +greater than the median. (Default: c(NA,3))

    + + +
    complexity.limits
    +

    Complexity represents Number of genes detected per +UMI. The more genes detected per UMI, the more complex the data. +Filter out cells whose Complexity exceed the selected lower or upper limits. +Cells that have a high number of UMIs but only a low number of genes could +be dying cells, but also could represent a population of a low complexity +cell type (i.e red blood cells). We suggest that you set the lower limit to +0.8 if samples have suspected RBC contamination. +Usage c(lower limit, Upper Limit). E.g. setting to c(0.8,0) will not set +an upper limit and removes cells with complexity less than 0.8. +(Default: c(NA,NA))

    + + +
    mad.complexity.limits
    +

    Set filter limits based on how many Median +Absolute Deviations an outlier cell will have. Calculated from the Median +complexity for all cells in your sample. +Usage c(lower limit, Upper Limit). E.g. setting to c(5,NA) will not set an +upper limit and remove all cells with more than 5 absolute deviations +less than the median. (Default: c(5,NA))

    + + +
    topNgenes.limits
    +

    Filter Cells based on the percentage of total counts +in top N most highly expressed genes. Outlier cells would have a high +percentage of counts in just a few genes and should be removed. +The same considerations outlined in "complexity.limits" should be taken for +this filter. +Usage c(lower limit, Upper Limit). E.g. setting to c(NA,50) will not set a +lower limit and remove cells with greater than 50% of reads in the top N +genes. (Default: c(NA,NA))

    + + +
    n.topgnes
    +

    Select the number of top highly expressed genes used to +calculate the percentage of reads found in these genes. +E.g. a value of 20 calculates the percentage of reads found in the top 20 +most highly expressed Genes. +(Default: 20)

    + + +
    do.doublets.fitler
    +

    Use scDblFinder to identify and remove doublet +cells. Doublets are defined as two cells that are sequenced under the same +cellular barcode, for example, if they were captured in the same droplet. +(Default: TRUE)

    + + +
    mad.topNgenes.limitsSet
    +

    Filter limits based on how many Median +Absolute Deviations an outlier cell will have. Calculated from the Median +percentage of counts in the top N Genes. +Usage c(lower limit, Upper Limit). E.g. setting to c(5,5) will remove all +cells with more than 5 absolute deviations greater than or 5 absolute +deviations less than the median percentage. (Default: c(5,5))

    + +
    +
    +

    Value

    +

    Seurat Object and QC plots

    +
    +
    +

    Details

    +

    This is Step 2 in the basic Single-Cell RNA-seq workflow. Multiple +cell and gene filters can be selected to remove poor quality data and noise. +Workflows can use this downstream of any Seurat Object. This tool is +typically the second step in the Single Cell Workflow.

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/reference/filterSeuratObjectByMetadata.html b/docs/reference/filterSeuratObjectByMetadata.html new file mode 100644 index 0000000..a9dcb49 --- /dev/null +++ b/docs/reference/filterSeuratObjectByMetadata.html @@ -0,0 +1,202 @@ + +Filter Seurat Object by Metadata — filterSeuratObjectByMetadata • SCWorkflow + Skip to contents + + +
    +
    +
    + +
    +

    Filter and subset your Seurat object based on metadata column

    +
    + +
    +

    Usage

    +
    filterSeuratObjectByMetadata(
    +  object,
    +  samples.to.include,
    +  sample.name,
    +  category.to.filter,
    +  values.to.filter,
    +  keep.or.remove = TRUE,
    +  greater.less.than = "greater than",
    +  seed = 10,
    +  cut.off = 0.5,
    +  legend.position = "top",
    +  reduction = "umap",
    +  plot.as.interactive.plot = FALSE,
    +  legend.symbol.size = 2,
    +  colors = c("aquamarine3", "salmon1", "lightskyblue3", "plum3", "darkolivegreen3",
    +    "goldenrod1", "burlywood2", "gray70", "firebrick2", "steelblue", "palegreen4",
    +    "orchid4", "darkorange1", "yellow", "sienna", "palevioletred1", "gray60", "cyan4",
    +    "darkorange3", "mediumpurple3", "violetred2", "olivedrab", "darkgoldenrod2",
    +    "darkgoldenrod", "gray40", "palegreen3", "thistle3", "khaki1", "deeppink2",
    +    "chocolate3", "paleturquoise3", "wheat1", "lightsteelblue", "salmon", "sandybrown",
    +    "darkolivegreen2", "thistle2", 
    +     "gray85", "orchid3", "darkseagreen1",
    +    "lightgoldenrod1", "lightskyblue2", "dodgerblue3", "darkseagreen3", "forestgreen",
    +    "lightpink2", "mediumpurple4", "lightpink1", "thistle", "navajowhite",
    +    "lemonchiffon", "bisque2", "mistyrose", "gray95", "lightcyan3", "peachpuff2",
    +    "lightsteelblue2", "lightyellow2", "moccasin", "gray80", "antiquewhite2",
    +    "lightgrey"),
    +  dot.size = 0.1,
    +  number.of.legend.columns = 1,
    +  dot.size.highlighted.cells = 0.5,
    +  use.cite.seq.data = FALSE
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    A dataset containing your SingleR annotated/merged seurat object

    + + +
    samples.to.include
    +

    Select which samples to include

    + + +
    sample.name
    +

    Sample Name Column

    + + +
    category.to.filter
    +

    What kind of metadata you want to subset by. +This should be one column in your Metadata table

    + + +
    values.to.filter
    +

    One or more values where you want to filter

    + + +
    keep.or.remove
    +

    TRUE to filter down to selected values, +FALSE to filter out selected values. Default is TRUE

    + + +
    greater.less.than
    +

    Decide if you want to keep cells above or below +the threshold. Default is "greater than"

    + + +
    seed
    +

    Set seed for colors

    + + +
    cut.off
    +

    The cut-off you want to use for your +greater than/less than filter. Default os 0.5

    + + +
    legend.position
    +

    Select "none" if legend takes up too much +space in plot. Default is "top"

    + + +
    reduction
    +

    What kind of clustering visualization you would like to use +for summary plot (umap, tsne, pca, protein_tsne, protein_umap, protein_pca). +Default is "umap"

    + + +
    plot.as.interactive.plot
    +

    TRUE for interactive, FALSE for static

    + + +
    legend.symbol.size
    +

    Your legend symbol size. Default is 2

    + + +
    colors
    +

    User-selected colors +from palette of 62 unique colors from ColorBrewer.

    + + +
    dot.size
    +

    Size of dots on TSNE/UMAP projection plot. Default is 0.1

    + + +
    number.of.legend.columns
    +

    Default is 1. +If legend is too long, provide more legend columns

    + + +
    dot.size.highlighted.cells
    +

    Dot size for cells in the after-filter plot +which have been highlighted. Default is 0.5

    + + +
    use.cite.seq.data
    +

    TRUE if you would like to plot Antibody clusters +from CITEseq instead of scRNA.

    + +
    +
    +

    Value

    +

    a subset Seurat object

    +
    +
    +

    Details

    +

    This is a downstream template that should be loaded after +Step 5 of the pipeline (SingleR Annotations on Seurat Object)

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/reference/heatmapSC.html b/docs/reference/heatmapSC.html new file mode 100644 index 0000000..cd3e1ed --- /dev/null +++ b/docs/reference/heatmapSC.html @@ -0,0 +1,210 @@ + +Heatmap of transcript and/or protein expression values in single cells — heatmapSC • SCWorkflow + Skip to contents + + +
    +
    +
    + +
    +

    This method provides a heatmap of single cell data from a Seurat +object given a set of genes and optionally orders by various metadata and/or +gene or protein expression levels. Method is based on ComplexHeatmap::pheatmap

    +
    + +
    +

    Usage

    +
    heatmapSC(
    +  object,
    +  sample.names,
    +  metadata,
    +  transcripts,
    +  use_assay = "SCT",
    +  proteins = NULL,
    +  heatmap.color = "Bu Yl Rd",
    +  plot.title = "Heatmap",
    +  add.gene.or.protein = FALSE,
    +  protein.annotations = NULL,
    +  rna.annotations = NULL,
    +  arrange.by.metadata = TRUE,
    +  add.row.names = TRUE,
    +  add.column.names = FALSE,
    +  row.font = 5,
    +  col.font = 5,
    +  legend.font = 5,
    +  row.height = 15,
    +  set.seed = 6,
    +  scale.data = TRUE,
    +  trim.outliers = TRUE,
    +  trim.outliers.percentage = 0.01,
    +  order.heatmap.rows = FALSE,
    +  row.order = c()
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    Seurat-class object

    + + +
    sample.names
    +

    Sample names

    + + +
    metadata
    +

    Metadata column to plot

    + + +
    transcripts
    +

    Transcripts to plot

    + + +
    proteins
    +

    Proteins to plot (default is NULL)

    + + +
    heatmap.color
    +

    Color for heatmap. Choices are "Cyan to Mustard", +"Blue to Red", "Red to Vanilla", "Violet to Pink", "Bu Yl Rd", +"Bu Wt Rd" (default is "Bu Yl Rd")

    + + +
    plot.title
    +

    Title of plot (default is "Heatmap")

    + + +
    add.gene.or.protein
    +

    Add Gene or protein annotations (default is FALSE)

    + + +
    protein.annotations
    +

    Protein annotations to add (defulat is NULL)

    + + +
    rna.annotations
    +

    Gene annotations to add (default is NULL)

    + + +
    arrange.by.metadata
    +

    Arrange by metadata (default is TRUE)

    + + +
    add.row.names
    +

    Add row names (default is TRUE)

    + + +
    add.column.names
    +

    Add column names (default is FALSE)

    + + +
    row.font
    +

    Font size for rows (default is 5)

    + + +
    col.font
    +

    Font size for columns (default is 5)

    + + +
    legend.font
    +

    Font size for legend (default is 5)

    + + +
    row.height
    +

    Height of row. If NA, adjust to plot size (default is 15)

    + + +
    set.seed
    +

    Seed for colors (default is 6)

    + + +
    scale.data
    +

    Perform z-scaling on rows (default is TRUE)

    + + +
    trim.outliers
    +

    Remove outlier data (default is TRUE)

    + + +
    trim.outliers.percentage
    +

    Set outlier percentage (default is 0.01)

    + + +
    order.heatmap.rows
    +

    Order heatmap rows (default is FALSE)

    + + +
    row.order
    +

    Gene vector to set row order. If NULL, use cluster order +(default is NULL)

    + +
    +
    +

    Value

    +

    This function returns a heatmap plot and the data underlying the +heatmap.

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/reference/index.html b/docs/reference/index.html new file mode 100644 index 0000000..0718a9a --- /dev/null +++ b/docs/reference/index.html @@ -0,0 +1,200 @@ + +Package index • SCWorkflow + Skip to contents + + +
    +
    +
    + +
    +

    All functions

    + + + + +
    + + + + +
    + + annotateCellTypes() + +
    +
    Annotating cell types using SingleR module
    +
    + + appendMetadataToSeuratObject() + +
    +
    Append Metadata to Seurat Object.
    +
    + + colorByGene() + +
    +
    Visualize gene expression for provided Genes across your cells as a heatmap
    +
    + + colorByMarkerTable() + +
    +
    Color by Gene List
    +
    + + combineNormalize() + +
    +
    Combine & Normalize
    +
    + + degGeneExpressionMarkers() + +
    +
    DEG (Gene Expression Markers)
    +
    + + dotPlotMet() + +
    +
    Dotplot of Gene Expression by Metadata
    +
    + + dualLabeling() + +
    +
    Plot coexpression of 2 markers using transcript and/or protein expression values
    +
    + + filterQC() + +
    +
    Filter & QC Samples
    +
    + + filterSeuratObjectByMetadata() + +
    +
    Filter Seurat Object by Metadata
    +
    + + heatmapSC() + +
    +
    Heatmap of transcript and/or protein expression values in single cells
    +
    + + modScore() + +
    +
    Compute ModScore
    +
    + + nameClusters() + +
    +
    Update metadata slot of Seurat-class object with custom labels and provide plot with percentage of cell types
    +
    + + object + +
    +
    Harmony Batch Correction from Singular Value Decomposed PCA
    +
    + + palantir_api_call() + +
    +
    palantir_api_call Utility function from 3D tSNE Coordinate Template from v 75#'
    +
    + + plotMetadata() + +
    +
    Plotting (i.e. coloring with) different columns of your Metadata Table
    +
    + + processRawData() + +
    +
    Process Raw Data
    +
    + + reclusterFilteredSeuratObject() + +
    +
    Recluster Filtered Seurat Object.
    +
    + + reclusterSeuratObject() + +
    +
    Recluster Seurat Object.
    +
    + + tSNE3D() + +
    +
    Plot 3D-TSNE given a Seurat Object and returns plotly image
    +
    + + violinPlot_mod() + +
    +
    Violin Plot by Metadata
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/reference/modScore.html b/docs/reference/modScore.html new file mode 100644 index 0000000..ad8d222 --- /dev/null +++ b/docs/reference/modScore.html @@ -0,0 +1,198 @@ + +Compute ModScore — modScore • SCWorkflow + Skip to contents + + +
    +
    +
    + +
    +

    Returns Seurat-class object with metadata containing +ModuleScores and Likely_CellType calls

    +
    + +
    +

    Usage

    +
    modScore(
    +  object,
    +  marker.table,
    +  use_columns,
    +  ms_threshold,
    +  general.class,
    +  multi.lvl = FALSE,
    +  lvl.df = NULL,
    +  reduction = "tsne",
    +  nbins = 10,
    +  gradient.ft.size = 6,
    +  violin.ft.size = 6,
    +  step.size = 0.1
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    Seurat-class object

    + + +
    marker.table
    +

    A table of lists of gene/protein markers for the +categories of cells you want to detect. +The table should be formatted with cell type(s) +as the column names, and marker(s) as the entries +in each column. +Requires SCT@data to be present within Seurat Object

    + + +
    use_columns
    +

    Select specific columns within Marker Table to analyze. +Markers from unselected columns won't be included.

    + + +
    ms_threshold
    +

    Allow user-specified module score thresholds. +Provide one threshold for each Celltype you included +in the "use_columns" parameter. +For each Celltype, provide the Celltype name, +then a space, then type your threshold for that Celltype. +This threshold must be a number between 0.0 and 1.0. +E.g. "Tcells 0.2", "Macrophages 0.37". +For best results, follow these steps: +(1) Set thresholds at 0.0 for a preliminary view of data. +(2) Use the resulting visualizations to estimate the +correct thresholds for each Celltype. +(3) Adjust your thresholds based on what you saw in the +visualizations. +(4) Re-run the template with the new thresholds. +(5) Review the visualizations again and +repeat Steps 1-5 if you think thresholds can be +further improved.

    + + +
    general.class
    +

    Select which of the classes (i.e. which columns) +in your Marker Table represent the General Classes. +A general class is any class that is not a subtype of +another class.

    + + +
    multi.lvl
    +

    set True if there are multiple subclasses of cells you +would like to classify. +Note: requires a manual entry table with columns specifying +levels and comparisons. Each column of this table should +represent one level of subclass within your General Classes. +Each value within a column should be two Class names +separated by a dash (-) showing the General-to-SubClass +relationship. +Example: To classify T-cells and then attempt to classify +those T-cells further into either CD8 or CD4 T-cells, +you would write a column named +"Level_1", then add "T_cell-CD8_T" and "T_cell-CD4_T" to +that column. Note that in this example, "T_cell" +is a General Class and "CD8_T" and "CD4_T" are not.

    + + +
    lvl.df
    +

    Dataframe containing levels information as well as +parent-children designation (E.g. Tcells-CD4). +Required if Multi Level Classification is turned on.#'

    + + +
    reduction
    +

    Choose among tsne, umap, and pca (Default: tsne)

    + + +
    nbins
    +

    Number of bins for storing control features and analyzing +average expression (Default: 10)

    + + +
    gradient.ft.size
    +

    Set size of axis labels on gradient +density plot of ModuleScore distribution +(Default: 6)

    + + +
    violin.ft.size
    +

    Set size of axis labels on violin plot of +ModuleScore distribution (Default: 6)

    + + +
    step.size
    +

    Set step size of distribution plots (Default: 0.1)

    + +
    +
    +

    Value

    +

    List containing annotated dimension plot with ModuleScore +distribution of cell marker gene, Seurat Object with cell +classification metadata

    +
    +
    +

    Details

    +

    Analyzed features are binned based on averaged expression; +control features are randomly selected from each bin.

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/reference/nameClusters.html b/docs/reference/nameClusters.html new file mode 100644 index 0000000..ad75885 --- /dev/null +++ b/docs/reference/nameClusters.html @@ -0,0 +1,141 @@ + +Update metadata slot of Seurat-class object with custom labels and provide plot with percentage of cell types — nameClusters • SCWorkflow + Skip to contents + + +
    +
    +
    + +
    +

    Maps custom cluster names to Seurat Object cluster IDs and adds +cluster names to a new metadata column called Clusternames. Provides a +dotplot of percentage of cell types within each cluster.

    +
    + +
    +

    Usage

    +
    nameClusters(
    +  object,
    +  cluster.identities.table,
    +  cluster.numbers,
    +  cluster.names,
    +  cluster.column,
    +  labels.column,
    +  order.clusters.by = NULL,
    +  order.celltypes.by = NULL,
    +  interactive = FALSE
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    Seurat-class object with cluster IDs column and cell type +column present

    + + +
    cluster.numbers
    +

    Vector containing cluster numbers that match the +(numeric) cluster ID's in the cluster.column in Seurat Object metadata

    + + +
    cluster.names
    +

    Vector containing custom cluster labels

    + + +
    cluster.column
    +

    Column name containing cluster ID in the metadata slot +in the object

    + + +
    labels.column
    +

    Column name containing labels (usually cell type) in the +metadata slot in the object

    + + +
    order.clusters.by
    +

    Vector containing order of clusters in graph. Can +contain a subset of cluster numbers to plot that match at least some of +the values in the cluster.column. If NULL, use default order +(default is NULL)

    + + +
    order.celltypes.by
    +

    Vector containing order of cell types in graph. +Can contain a subset of cell types to plot that match at least some of the +values in the labels.column. If NULL, use default order (default is NULL)

    + + +
    interactive
    +

    If TRUE, draw plotly plot (default is FALSE)

    + +
    +
    +

    Value

    +

    Returns Seurat-class object with updated meta.data slot containing +custom cluster annotation and a plot

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/reference/object.html b/docs/reference/object.html new file mode 100644 index 0000000..54a2c2e --- /dev/null +++ b/docs/reference/object.html @@ -0,0 +1,122 @@ + +Harmony Batch Correction from Singular Value Decomposed PCA — object • SCWorkflow + Skip to contents + + +
    +
    +
    + +
    +

    Adjusts cell embeddings and gene expression data to account for +variations due to user specified variable

    +
    + +
    +

    Usage

    +
    object
    +
    + +
    +

    Format

    +

    An object of class Seurat with 3000 rows and 2000 columns.

    +
    +
    +

    Arguments

    + + +
    seurat_object
    +

    Seurat-class object

    + + +
    nvar
    +

    Number of variable genes to subset the gene expression data by +(Default: 2000)

    + + +
    genes.to.add
    +

    Add genes that might not be found among variably +expressed genes

    + + +
    group.by.var
    +

    Which variable should be accounted for when running +batch correction

    + + +
    npc
    +

    Number of principal components to use when running Harmony +(Default: 20)

    + +
    +
    +

    Value

    +

    A list: adj.object with harmony-adjusted gene expression (SCT slot) +adj.tsne: harmonized tSNE plot

    +
    +
    +

    Details

    +

    Runs singular value decomposition on pearson residuals +(SCT scale.data) to obtain PCA embeddings. Performs harmony on +decomposed embedding and adjusts decomposed gene expression values +by harmonized embedding.

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/reference/palantir_api_call.html b/docs/reference/palantir_api_call.html new file mode 100644 index 0000000..eefb557 --- /dev/null +++ b/docs/reference/palantir_api_call.html @@ -0,0 +1,106 @@ + +palantir_api_call Utility function from 3D tSNE Coordinate Template from v 75#' — palantir_api_call • SCWorkflow + Skip to contents + + +
    +
    +
    + +
    +

    palantir_api_call +Utility function from 3D tSNE Coordinate Template from v 75#'

    +
    + +
    +

    Usage

    +
    palantir_api_call(service, path, token, data, method)
    +
    + +
    +

    Arguments

    + + +
    service
    +

    The NIDAP API service to call

    + + +
    path
    +

    The path of NIDAP API service

    + + +
    token
    +

    NIDAP user toekn.

    + + +
    data
    +

    Data to be uploaded with NIDAP API calls.

    + + +
    method
    +

    Method to be used, including POST, GET, and DELETE

    + +
    +
    +

    Value

    +

    return the content of API calls

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/reference/plotMetadata.html b/docs/reference/plotMetadata.html new file mode 100644 index 0000000..25890a9 --- /dev/null +++ b/docs/reference/plotMetadata.html @@ -0,0 +1,154 @@ + +Plotting (i.e. coloring with) different columns of your Metadata Table — plotMetadata • SCWorkflow + Skip to contents + + +
    +
    +
    + +
    +

    For each column selected, this template will produce a plot +(UMAP/TSNE/PCA; your choice) using the data in that column to color the cells

    +
    + +
    +

    Usage

    +
    plotMetadata(
    +  object,
    +  samples.to.include,
    +  metadata.to.plot,
    +  columns.to.summarize,
    +  summarization.cut.off = 5,
    +  reduction.type = "tsne",
    +  use.cite.seq = FALSE,
    +  show.labels = FALSE,
    +  legend.text.size = 1,
    +  legend.position = "right",
    +  dot.size = 0.01
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    A combined Seurat Object with metadata to plot

    + + +
    samples.to.include
    +

    Which samples you would like to include

    + + +
    metadata.to.plot
    +

    The metadata columns from your Metadata table +you would like to plot

    + + +
    columns.to.summarize
    +

    The columns you would like to summarize

    + + +
    summarization.cut.off
    +

    Select the number of categories you want +to display, while marking all other cells as "other." Default is 5

    + + +
    reduction.type
    +

    What kind of visualization you would like to use +to plot your cells and metadata (tsne, umap, pca). Default is tsne

    + + +
    use.cite.seq
    +

    TRUE if you would like to plot Antibody clusters +from CITEseq instead of scRNA. Default is FALSE

    + + +
    show.labels
    +

    Whether to add labels or not to your reduction map. +Default is FALSE

    + + +
    legend.text.size
    +

    Customize the size of the legend text in your charts. +Default is 1

    + + +
    legend.position
    +

    Select how you want to align your legend. +Default is "right"

    + + +
    dot.size
    +

    The size of the dots displayed on the plot. Default os 0.01

    + +
    +
    +

    Value

    +

    a data.frame extracted from the Seurat object and plot

    +
    +
    +

    Details

    +

    This is a downstream template for the Single-cell RNA-seq workflow +(requires dataset where Filter/QC/SingleR annotations have been run first)

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/reference/processRawData.html b/docs/reference/processRawData.html new file mode 100644 index 0000000..4062d57 --- /dev/null +++ b/docs/reference/processRawData.html @@ -0,0 +1,166 @@ + +Process Raw Data — processRawData • SCWorkflow + Skip to contents + + +
    +
    +
    + +
    +

    Creates a list of Seurat Objects from h5 files. Will log +normalize and produce QC figures for individual samples

    +
    + +
    +

    Usage

    +
    processRawData(
    +  input,
    +  sample.metadata.table = NULL,
    +  sample.name.column = NULL,
    +  organism,
    +  rename.col = NULL,
    +  keep = T,
    +  file.filter.regex = c(),
    +  split.h5 = F,
    +  cell.hash = F,
    +  tcr.summarize.topN = 10,
    +  do.normalize.data = T
    +)
    +
    + +
    +

    Arguments

    + + +
    input
    +

    Input can be a vector of .h5 files, or a list of +seurat objects for each sample. TCRseq Metadata .csv files can also be +included and will be added to the corrisponding sample seurat object. +Vector of files should include entire file path.

    + + +
    sample.metadata.table
    +

    A table of sample metadata that you want to +append to the already-existing metadata within the input Seurat Object(s). +(optional)

    + + +
    sample.name.column
    +

    The column of the input metadata.to.append table +that contains sample names matching the orig.idents in the input object(s). +(optional)

    + + +
    organism
    +

    Please select species. Choices are Human or Mouse. +(Default: Human).

    + + +
    rename.col
    +

    Select column name from metadata table that contains new +samples name (optional).

    + + +
    keep
    +

    If TRUE, keep files when pattern is found in sample name. +If FALSE, remove files when pattern is found in sample name. +The pattern is set in the file.filter.regex parameter (below).

    + + +
    file.filter.regex
    +

    Pattern or regular expression in sample +name. Use the 'keep' parameter to keep or remove fi +les that contain pattern. +If samples have been renamed set regular expression based on new names

    + + +
    split.h5
    +

    If TRUE, split H5 into individual files. (Default: FALSE)

    + + +
    cell.hash
    +

    If TRUE, dataset contains cell hashtags. (Default: FALSE)

    + + +
    tcr.summarize.topN
    +

    Select number of top most identified TCR clonotypes +to be included in summary column. Any clonotypes below the top N most +populated will be classified as "Other". (Default: 10)

    + + +
    do.normalize.data
    +

    If TRUE counts table will be log2 normalized. If +input contains counts that are already normalzed set to FALSE. +(Default: TRUE)

    + +
    +
    +

    Value

    +

    Seurat Object and QC plots

    +
    +
    +

    Details

    +

    This is Step 1 in the basic Single-Cell RNA-seq workflow. +Returns data as a Seurat Object, the basic data structure for +Seurat Single Cell analysis.

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/reference/reclusterFilteredSeuratObject.html b/docs/reference/reclusterFilteredSeuratObject.html new file mode 100644 index 0000000..8cfd625 --- /dev/null +++ b/docs/reference/reclusterFilteredSeuratObject.html @@ -0,0 +1,145 @@ + +Recluster Filtered Seurat Object. — reclusterFilteredSeuratObject • SCWorkflow + Skip to contents + + +
    +
    +
    + +
    +

    This template reclusters a filtered Seurat object.

    +
    + +
    +

    Usage

    +
    reclusterFilteredSeuratObject(
    +  object,
    +  prepend.txt = "old",
    +  old.columns.to.save,
    +  number.of.pcs = 50,
    +  cluster.resolution.low.range = 0.2,
    +  cluster.resolution.high.range = 1.2,
    +  cluster.resolution.range.bins = 0.2,
    +  reduction.type = "tsne"
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    The input Seurat Object.

    + + +
    prepend.txt
    +

    Text to prepend to old columns to make them unique from +new. Default is "old".

    + + +
    old.columns.to.save
    +

    Old seurat clustering columns (e.g. +SCT_snn_res.0.4) to save.

    + + +
    number.of.pcs
    +

    Select the number of principal components for your +analysis. Set to 0 to automatically decide. Default is 50.

    + + +
    cluster.resolution.low.range
    +

    Select minimum resolution for clustering +plots. The lower you set this, the FEWER clusters will be generated. Default +is 0.2.

    + + +
    cluster.resolution.high.range
    +

    Select maximum resolution for clustering +plots. The higher you set this, the MORE clusters will be generated. Default +is 1.2.

    + + +
    cluster.resolution.range.bins
    +

    Select the bins for your cluster plots. +For example, if you input 0.2 as your bin, and have low/high resolution +ranges of 0.2 and 0.6, then the template will produce cluster plots at +resolutions of 0.2, 0.4 and 0.6. Default is 0.2.

    + + +
    reduction.type
    +

    Select the kind of clustering visualization you would +like to use to visualize the cell type results ("umap", "tsne", "pca"). +Default is "tsne".

    + +
    +
    +

    Value

    +

    Function returns a reclustered Seurat Object with new clustering +columns and renamed original clustering columns, along with a plot of the new +dimsensionality reduction.

    +
    +
    +

    Details

    +

    This method reclusters the filtered SO, preserving the original +SCT clustering columns with a prepended prefix, and making new SCT clustering +columns based on the reclustering. The image returned is the reclustered +project.

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/reference/reclusterSeuratObject.html b/docs/reference/reclusterSeuratObject.html new file mode 100644 index 0000000..bc5f907 --- /dev/null +++ b/docs/reference/reclusterSeuratObject.html @@ -0,0 +1,145 @@ + +Recluster Seurat Object. — reclusterSeuratObject • SCWorkflow + Skip to contents + + +
    +
    +
    + +
    +

    This template reclusters a Seurat object.

    +
    + +
    +

    Usage

    +
    reclusterSeuratObject(
    +  object,
    +  prepend.txt = "old",
    +  old.columns.to.save,
    +  number.of.pcs = 50,
    +  cluster.resolution.low.range = 0.2,
    +  cluster.resolution.high.range = 1.2,
    +  cluster.resolution.range.bins = 0.2,
    +  reduction.type = "tsne"
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    The input Seurat Object.

    + + +
    prepend.txt
    +

    Text to prepend to old columns to make them unique from +new. Default is "old".

    + + +
    old.columns.to.save
    +

    Old seurat clustering columns (e.g. +SCT_snn_res.0.4) to save.

    + + +
    number.of.pcs
    +

    Select the number of principal components for your +analysis. Set to 0 to automatically decide. Default is 50.

    + + +
    cluster.resolution.low.range
    +

    Select minimum resolution for clustering +plots. The lower you set this, the FEWER clusters will be generated. Default +is 0.2.

    + + +
    cluster.resolution.high.range
    +

    Select maximum resolution for clustering +plots. The higher you set this, the MORE clusters will be generated. Default +is 1.2.

    + + +
    cluster.resolution.range.bins
    +

    Select the bins for your cluster plots. +For example, if you input 0.2 as your bin, and have low/high resolution +ranges of 0.2 and 0.6, then the template will produce cluster plots at +resolutions of 0.2, 0.4 and 0.6. Default is 0.2.

    + + +
    reduction.type
    +

    Select the kind of clustering visualization you would +like to use to visualize the cell type results ("umap", "tsne", "pca"). +Default is "tsne".

    + +
    +
    +

    Value

    +

    Function returns a reclustered Seurat Object with new clustering +columns and renamed original clustering columns, along with a plot of the new +dimsensionality reduction.

    +
    +
    +

    Details

    +

    This method reclusters the input SO, preserving the original SCT +clustering columns with a prepended prefix, and making new SCT clustering +columns based on the reclustering. The image returned is the reclustered +project.

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/reference/tSNE3D.html b/docs/reference/tSNE3D.html new file mode 100644 index 0000000..79eb34a --- /dev/null +++ b/docs/reference/tSNE3D.html @@ -0,0 +1,133 @@ + +Plot 3D-TSNE given a Seurat Object and returns plotly image — tSNE3D • SCWorkflow + Skip to contents + + +
    +
    +
    + +
    +

    This method provides visualization of 3D-tSNE plot given a +Seurat Object and returns a plotly plot and a dataframe of TSNE +coordinates. It optionally saves the plotly image embedded in an html file.

    +
    + +
    +

    Usage

    +
    tSNE3D(
    +  object,
    +  color.variable,
    +  label.variable,
    +  dot.size = 4,
    +  legend = TRUE,
    +  colors = c("darkblue", "purple4", "green", "red", "darkcyan", "magenta2", "orange",
    +    "yellow", "black"),
    +  filename = "plot.html",
    +  save.plot = FALSE,
    +  npcs = 15
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    Seurat-class object

    + + +
    color.variable
    +

    Metadata column in Seurat Object to use for color

    + + +
    label.variable
    +

    Metadata column in Seurat Object to use for label

    + + +
    dot.size
    +

    Dot size for plot (default is 4)

    + + +
    legend
    +

    If TRUE, show legend (default is TRUE)

    + + +
    colors
    +

    Colors used for the color.variable

    + + +
    filename
    +

    Filename for saving plot (default is "plot.html")

    + + +
    save.plot
    +

    Save plot as widget in html file (default is FALSE)

    + + +
    npcs
    +

    Number of principal components used for tSNE calculations +(default is 15)

    + +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/reference/violinPlot_mod.html b/docs/reference/violinPlot_mod.html new file mode 100644 index 0000000..28d3bd6 --- /dev/null +++ b/docs/reference/violinPlot_mod.html @@ -0,0 +1,182 @@ + +Violin Plot by Metadata — violinPlot_mod • SCWorkflow + Skip to contents + + +
    +
    +
    + +
    +

    Create violin plot of gene expression data across groups

    +
    + +
    +

    Usage

    +
    violinPlot_mod(
    +  object,
    +  assay,
    +  slot,
    +  genes,
    +  group,
    +  facet_by = "",
    +  filter_outliers = F,
    +  outlier_low = 0.05,
    +  outlier_high = 0.95,
    +  jitter_points,
    +  jitter_dot_size
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    Seurat-class object

    + + +
    assay
    +

    Assay to extract gene expression data from (Default: SCT)

    + + +
    slot
    +

    Slot to extract gene expression data from (Default: scale.data)

    + + +
    group.by
    +

    Split violin plot based on metadata group

    + + +
    group.subset
    +

    Include only a specific subset from group.by

    + + +
    genes.of.interest
    +

    Genes to visualize on the violin plot

    + + +
    filter.outliers
    +

    Filter outliers from the data (TRUE/FALSE)

    + + +
    scale.data
    +

    Scale data from 0 to 1 (TRUE/FALSE)

    + + +
    log.scale.data
    +

    Transform data onto a log10 scale (TRUE/FALSE)

    + + +
    reorder.ident
    +

    Numeric data will be ordered naturally by default. +Toggling this option will order the groups to match the +group list if non-numeric, and will have no effect if +otherwise.

    + + +
    rename.ident
    +

    Give alternative names to group.by displayed on +the graph

    + + +
    ylimit
    +

    Y-axis limit

    + + +
    plot.style
    +

    Choose between grid, labeled, and row

    + + +
    outlier.low.lim
    +

    Filter lower bound outliers (Default = 0.1)

    + + +
    outlier.up.lim
    +

    Filter upper bound outliers (Default = 0.9)

    + + +
    jitter.points
    +

    Scatter points on the plot (TRUE/FALSE)

    + + +
    jitter.width
    +

    Set spread of jittered points

    + + +
    jitter.dot.size
    +

    Set size of individual points

    + + +
    print.outliers
    +

    Print outliers as points in your graph that may be +redundant to jitter

    + +
    +
    +

    Value

    +

    violin ggplot2 object

    +
    +
    +

    Details

    +

    Takes in a list of genes inputted by the user, displays violin plots +of genes across groups from a slot-assay with (optional) outliers +removed. Can also choose to scale or transform expression data.

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/search.json b/docs/search.json new file mode 100644 index 0000000..0a1460c --- /dev/null +++ b/docs/search.json @@ -0,0 +1 @@ +[{"path":[]},{"path":[]},{"path":"https://nidap-community.github.io/SCWorkflow/CHANGELOG.html","id":"fix","dir":"","previous_headings":"v1.0.2 (2024-02-01)","what":"Fix","title":"CHANGELOG","text":"fix: update package name action file (00c816c)","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/CHANGELOG.html","id":"unknown","dir":"","previous_headings":"v1.0.2 (2024-02-01)","what":"Unknown","title":"CHANGELOG","text":"Merge pull request #53 NIDAP-Community/dev fix: update package name action file (1ea1b0c) Merge pull request #52 NIDAP-Community/CDupdate fix: update package name action file (3956593)","code":""},{"path":[]},{"path":"https://nidap-community.github.io/SCWorkflow/CHANGELOG.html","id":"build","dir":"","previous_headings":"v1.0.1 (2024-02-01)","what":"Build","title":"CHANGELOG","text":"build: update conda recipe action file (32f800c)","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/CHANGELOG.html","id":"documentation","dir":"","previous_headings":"v1.0.1 (2024-02-01)","what":"Documentation","title":"CHANGELOG","text":"docs(version): Automatic development release (0548007) docs: Adding changelog (34b1e0b) docs(version): Automatic development release (184b4f9) docs(version): Automatic development release (b8b41d3) docs(version): Automatic development release (f420a3b) docs(version): Automatic development release (8b5cc98)","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/CHANGELOG.html","id":"feature","dir":"","previous_headings":"v1.0.1 (2024-02-01)","what":"Feature","title":"CHANGELOG","text":"feat: Update test-annotation supress warnings (3d5cf8f) feat: test (4c4cee7) feat: test (c8274f9) feat: test (3aff107) feat: test harmony (6c2830b) feat: enable CD (3696c4b)","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/CHANGELOG.html","id":"fix-1","dir":"","previous_headings":"v1.0.1 (2024-02-01)","what":"Fix","title":"CHANGELOG","text":"fix: add skip CI harmony (55c1c0d) fix: Suppress warning celldex, move CI handle test Harmony, add png page creation (406594a) fix: Revise version format (7992d22) fix: update readme (d8d4013)","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/CHANGELOG.html","id":"test","dir":"","previous_headings":"v1.0.1 (2024-02-01)","what":"Test","title":"CHANGELOG","text":"test: Adding variant Action skip (b0bea4c) test: update meta.ymal (1abd118) test: update meta.ymal (46ba936) test: mute line42 test-Process_Raw_Data (75dbd06)","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/CHANGELOG.html","id":"unknown-1","dir":"","previous_headings":"v1.0.1 (2024-02-01)","what":"Unknown","title":"CHANGELOG","text":"Merge pull request #51 NIDAP-Community/dev Update test files Harmony Annotation, add GitHub page image (5c19124) Merge pull request #50 NIDAP-Community/CDupdate fix: add skip CI harmony (3268a82) Merge pull request #49 NIDAP-Community/CDupdate fix: Suppress warning celldex, move CI handle test Harmony, … (30de884) Merge pull request #47 NIDAP-Community/dev Update CD (76e59b4) Merge pull request #46 NIDAP-Community/CDupdate docs: Adding changelog (7c5bcf2) Merge pull request #45 NIDAP-Community/dev Update repo structure CD implementation (ca27382) Merge pull request #44 NIDAP-Community/CDupdate Update repo structure Continuous Deployment implementation (fab9424) Merge remote-tracking branch 'origin/main' dev (c850a61) Merge pull request #43 NIDAP-Community/revert-42-testCD2 Revert \"Test cd2\" (dbd1511) Revert \"Test cd2\" (82c3208) Merge pull request #42 ruiheesi/testCD2 Test cd2 (696718c) Merge pull request #17 ruiheesi/release_dev Release dev (93dac20) Merge pull request #16 ruiheesi/dev Dev (f094e92) Merge pull request #15 ruiheesi/testCD2 Test cd2 (89850c1) Merge remote-tracking branch 'origin/dev' testCD2 (429581c) feat :test (10b3e05) Merge pull request #14 ruiheesi/dev Dev (c932c71) Merge pull request #13 ruiheesi/testCD2 Test cd2 (da01ac7) Merge pull request #12 ruiheesi/release_dev Release dev (447457a) Merge pull request #11 ruiheesi/dev Dev (e4a2987) Merge pull request #10 ruiheesi/testCD2 fix: update readme (a3f0d9c) Merge pull request #9 ruiheesi/release_dev Release dev (4026e1a) Merge pull request #8 ruiheesi/dev Dev (4364548) Merge pull request #7 ruiheesi/testCD test: update meta.ymal (fe470f9) Merge pull request #6 ruiheesi/dev Dev (4e75a9f) Merge pull request #5 ruiheesi/testCD test: update meta.ymal (caed439) Merge pull request #4 ruiheesi/dev Dev (9f27de1) Merge pull request #3 ruiheesi/testCD test: mute line42 test-Process_Raw_Data (abef880) Merge pull request #1 ruiheesi/testCD feat: enable CD (0194dd9) Merge pull request #38 NIDAP-Community/main Updating dev avoid potential lost progress (8936388) Merge pull request #37 NIDAP-Community/8_4_tutorial 8 4 tutorial (c640c8f) Merge branch '8_4_tutorial' https://github.com/NIDAP-Community/SCWorkflow 8_4_tutorial (be8b11f) Just tutorial (b667bb0) test (d8bc63c) Fixing visualization \"\" plot (d7bb90f) Merge pull request #36 NIDAP-Community/dev Dev (0b66085) Merge pull request #35 NIDAP-Community/heatmap_fix Fix heatmap (49f0486) Fix heatmap (db3ee4e) Merge pull request #34 NIDAP-Community/release_6_15_test Update DESCRIPTION file author info short package description (31a4d13) Merge pull request #33 NIDAP-Community/update_DES Update DESCRIPTION file (df2abd7) Update DESCRIPTION file (5e43253) Adding auto-generated files (14ff346) Merge pull request #31 NIDAP-Community/release_6_13 Update 6 13 Alexei (e2297c6) Merge pull request #30 NIDAP-Community/release_test Run unit tests (407ca8f) Merge pull request #28 NIDAP-Community/main Update (2891614) Merge pull request #27 NIDAP-Community/phil_6_6_no_NG Modify package function load (370522e) Including \"NULL\" \"seurat_cluster\" tests (8cb6a23) Introducing \"cluster\" variable functionality (e26f2aa) Modify package function load (fe7ad65) Adding auto-generated files (e65ad6b) Merge pull request #26 NIDAP-Community/release_test Passed tests (4a40802) Merge pull request #25 NIDAP-Community/phil_6_6_no_NG Run unit test (4979266) Update Plot_Metadata (573b57a) Update ModuleScore (4367b28) Update NAMESPACE (77240ed) Merge changes (b9226e0) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main Conflicts: NAMESPACE tests/testthat/fixtures/downsample_SO.R (d4b92fe) update documentation (19b7179) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (ca74b58) delete old files (b5b2d1d) Removed test-Pseudobulk_DEG.R test-Sample_Names.R (877fa28) Removed test-Meta_Data.R (975face) Merge branch 'main' phil_6_6_no_NG (f638db9) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (77c1f03) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main need update violinPlot subset function (41f805e) update violinPlot subset function (0609899) Remove old tests (6ca9164) udate PBMC sing Filtered rds (516a9df) Fix Test Error (7641655) fix Test error (e97494a) Merge branch 'main' phil_6_6_no_NG (d7fd7c8) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (1e52f51) Setting add.gene..protein TRUE - error FALSE (2e0a153) Merge branch 'main' phil_6_6_no_NG (d61ce1d) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (cd90fbb) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (b44581b) bug fix heatmap sort annotation (8d09781) Merge branch 'main' phil_6_6_no_NG (986bcdf) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (8fab93f) changed select_crobject selectCRObject (b7446a6) Update Seurate importing method process raw (846ac5d) Trigger check update latest main (2b575eb) Merge branch 'main' phil_6_6_no_NG (aab0562) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (b786ed1) Removed gene Seurat (d5d17ac) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (e7f08eb) Bug fix dual labeling (9eede5b) Fixed bug Dual Labeling added one plot output (contingency table) (0b17248) Test direct import seurat process raw (3bd763b) Trigger action, updated process raw import Seurat (2e46082) Trigger action, updated cc.gene (84acd38) Trigger action, updated NAMESPACE (a968d2d) Trigger action (b38dd32) Trigger action (05e9be4) Update NAMESPACE (d7015e6) Merge branch 'main' phil_6_6_no_NG (d9ba725) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (5559288) Trigger unit tests (99ae357) Add Filtered rds (666c3d8) update Variable descriptions (43e05f5) update Variable descriptions (3fd169b) reverting clusters barcodes merging (f561e2f) Trigger unit test (a668ef9) Trigger unit test (1c48c37) Merge branch 'main' phil_6_6_no_NG (ada4aab) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (aa254f1) Update NAMESPACE (dc6152b) rn h5 test (d398586) Fixing \"\" cluster label (18bbdc8) Removing \"latent variable\" test script (1839cdd) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main Conflicts: NAMESPACE R/Combine_and_Renormalize.R R/Filter_and_QC.R R/PCA_and_Normalization.R R/Post_filter_QC_Plots.R tests/testthat/fixtures/NSCLC_Single/NSCLC_Single_Filtered_PCA_Norm_SO_downsample.rds tests/testthat/fixtures/NSCLC_Single/NSCLC_Single_Filtered_SO_downsample.rds tests/testthat/fixtures/NSCLC_Single/NSCLCsingle_Filtered_PCA_Norm_SO_downsample.rds tests/testthat/fixtures/NSCLC_Single/NSCLCsingle_Filtered_SO_downsample.rds tests/testthat/fixtures/PBMC_Single/PBMC_Single_Filtered_PCA_Norm_SO_downsample.rds tests/testthat/fixtures/PBMC_Single/PBMC_Single_Filtered_SO_downsample.rds tests/testthat/fixtures/downsample_SO.R tests/testthat/test_Combine_and_Renormalize.R tests/testthat/test_Filter_and_QC.R tests/testthat/test_PCA_and_Normalization.R tests/testthat/test_Post_Filter_QC.R (92eae54) FiltQC Variable Descriptions (4aa0674) New RAW filtQC CombNorm (7aa1a24) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main Conflicts: NAMESPACE R/Post_filter_QC_Plots.R tests/testthat/test_Post_Filter_QC.R (4fd27d2) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main Conflicts: man/Combine_and_Renormalize.Rd man/Post_filter_QC.Rd (159af06) skip ci reticulate pacakge (549f205) skip ci reticulate pacakge (75412d7) Edited snapshot tests (a316ad3) Edited snapshot tests (cf00505) update pseudobulk helper (fd0a506) update pseudobulk helper (7f8060e) add pseudobulk helper test scripts (122f072) add pseudobulk helper test scripts (27a49ec) update functions tests (c7ddbf8) update functions tests (c201dd7) Removing \"latent var\" replacing second.clust (67c3aea) Removing \"latent var\" replacing second.clust (9c16231) Quick test CI (e71339c) Quick test CI (73c62ca) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (b600bf0) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (8bb7502) Added color selection 3D-tsne Plotter (2882b76) Added color selection 3D-tsne Plotter (f7decbc) Added \"cached\" CellDex option (2cabb8d) Added \"cached\" CellDex option (c913672) fixed NAMESPACE conflicts (f2aa02f) fixed NAMESPACE conflicts (797ab6d) Changed pheatmap ComplexHeatmap::pheatmap (5c9316b) Changed pheatmap ComplexHeatmap::pheatmap (414723d) Code Review (03f4392) Code Review (b2724c8) Removed LICENCE file description (e2affa9) Removed LICENCE file description (8c3154e) Minor fixes R CMD CHECK (134523f) Minor fixes R CMD CHECK (c1eb410) Fix syntax error line 200, fix syntax error \"=\" \"==\" (2916381) Fix syntax error line 200, fix syntax error \"=\" \"==\" (d909584) Helper Recluster, Sprint 7 compliant. (d5181f9) Helper Recluster, Sprint 7 compliant. (8f28252) New test Recluster correct name. (bf252e2) New test Recluster correct name. (0d88348) Old file w bad name gone. New file good. (e903ca0) Old file w bad name gone. New file good. (0e0d81e) Re-arranged new Sprint 7 formatting functions. (2c07bcb) Re-arranged new Sprint 7 formatting functions. (e670fe9) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main need push updated code main (20f0ab7) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main need push updated code main (189075c) push updated scripts main (ed4b682) push updated scripts main (f70b090) Restructured according new requirements (94b0170) Restructured according new requirements (797d5be) Restructured according new requirements (495be93) Restructured according new requirements (7e53872) Restructured according new requirements (6043df1) Restructured according new requirements (5efd01d) Restructured according new requirements (8465a9e) Restructured according new requirements (75be9d0) Restructured according new requirements (8c4739b) Restructured according new requirements (8a39e82) Restructured according new requirements (2ccad56) Restructured according new requirements (4770cf7) Restructured according new requirements (8762e39) Restructured according new requirements (c21ca07) Restructured according new requirements (b9dfed4) Restructured according new requirements (9cc27d3) Restructured according new requirements (656b12e) Restructured according new requirements (2989dbe) Restructured according new requirements (bf8dcb1) Restructured according new requirements (d11a692) Restructured according new requirements (95693f6) Restructured according new requirements (da04b19) Restructured according new requirements (6dca0bf) Restructured according new requirements (de6b4da) Restructured according new requirements (8f4ea59) Restructured according new requirements (1741342) Restructured according new requirements (f522e45) Restructured according new requirements (dc8cfe2) Restructured according new requirements (b2235b0) Restructured according new requirements (6f4bd6d) Delete test-DegGeneExpressionMarkers.R Replaced newer, renamed version (237eacf) Delete test-DegGeneExpressionMarkers.R Replaced newer, renamed version (ee510b7) Accepted changes Namespace (b0ef9e7) Accepted changes Namespace (70d880f) Removed ticks dotplot code (d6599be) Removed ticks dotplot code (3b4a6e0) Added select dplyr import (1311aae) Added select dplyr import (c860639) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (8759676) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (28e310b) Added snapshot file tests Name clusters (1a0c530) Added snapshot file tests Name clusters (de98847) Added snapshot tests heatmap (3f138a4) Added snapshot tests heatmap (1fe2d7b) Additional snapshot file tests dual labeling (8d92fcf) Additional snapshot file tests dual labeling (580ab8d) Additional tests dotplot metadata (fbc3ada) Additional tests dotplot metadata (b7f6c45) Adding expect snapshot file tests 3D-tSNE plotter (8f33e2b) Adding expect snapshot file tests 3D-tSNE plotter (661102c) Formatting changes helper-dual labeling (8f5da99) Formatting changes helper-dual labeling (266dec8) Formatting changes helper - Name clusters (5a6079f) Formatting changes helper - Name clusters (cfc8b69) Formatting changes helper-Heatmap (abd3f09) Formatting changes helper-Heatmap (1ca0e49) Formatting changes helper-dotplot Metadata (321e619) Formatting changes helper-dotplot Metadata (69653cb) Formatting changes helper 3D-tSNE (8be697c) Formatting changes helper 3D-tSNE (c1835c2) Formatting changes Dotplot Metadata (7dbbc99) Formatting changes Dotplot Metadata (d994b6c) Code changes Name clusters formatting (70a9fc2) Code changes Name clusters formatting (bca98aa) Formatting changes Heatmap.R (e1bd5c7) Formatting changes Heatmap.R (f47e847) Add files via upload replace image file (7bf9b80) Add files via upload replace image file (542b65d) Update README.md additional text (700ad07) Update README.md additional text (2e0feec) Update README.md Added image. (7694f8d) Update README.md Added image. (f28a6a7) Add files via upload Workflow image (f93175b) Add files via upload Workflow image (433a89d) Create README.md (70aa926) Create README.md (0b318e5) formatting dual labeling (2e7d12c) formatting dual labeling (f782199) format 3D-tSNE function (fe97cb0) format 3D-tSNE function (4ae1381) Update gitflow-R-action.yml (9bdcf6c) Update gitflow-R-action.yml (7799784) update Dotplot conflict (0ea5f42) update Dotplot conflict (e99ac9b) Update (aa71a29) Update (3dfcdb5) Adding action files dockerfiles (d215fdb) Adding action files dockerfiles (1cbab8e) Resolving git conflict Recluster. (0c70bdb) Resolving git conflict Recluster. (28d7b96) committing -progress Sugarloaf updates Recluster template. (ed03d46) committing -progress Sugarloaf updates Recluster template. (446af26) changed fixture filenames (71ebc2f) changed fixture filenames (6e3284c) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (f5590de) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (219746d) edit code formatting (1a7a120) edit code formatting (2676adc) Initial TestThat Recluster Includes tests 5 datasets testing type, well one test MouseTEC tests UMAP instead default TSNE. (4da52a7) Initial TestThat Recluster Includes tests 5 datasets testing type, well one test MouseTEC tests UMAP instead default TSNE. (da7c560) Initial R4 functionalization. (7558379) Initial R4 functionalization. (84acb8c) Add files via upload Initial release (3eca944) Add files via upload Initial release (deafd1c) Add files via upload Initial release (77b96a6) Add files via upload Initial release (91b7594) Add files via upload Initial commit (4a74c89) Add files via upload Initial commit (9d694ae) Add files via upload Initial release (fa2e7c3) Add files via upload Initial release (25d5857) Add files via upload Initial release (69d1dcf) Add files via upload Initial release (900ab4c) Delete DEG_Gene_Expression_Markers.R (5496f85) Delete DEG_Gene_Expression_Markers.R (fe406ea) Add files via upload Initial release (ea9b264) Add files via upload Initial release (45fd8d2) Add files via upload Initial release (c2e8e8c) Add files via upload Initial release (fee817b) Add files via upload Initial release (55fd6c9) Add files via upload Initial release (a59a2bc) Add files via upload Initial release (ad72a95) Add files via upload Initial release (aac8353) Add files via upload Initial release (a0c5606) Add files via upload Initial release (c31a9f2) Delete DeletMeAgain (d2436b6) Delete DeletMeAgain (4514dae) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (9ce4628) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (2a53ebc) CommLine Test (82aa0fa) CommLine Test (811846c) Delete Delete.Following orders (6b41c15) Delete Delete.Following orders (1f82ca7) Add files via upload DELETE IMMEDIATELY!!! (986326c) Add files via upload DELETE IMMEDIATELY!!! (ea68f0a) Initial release (2c12ea5) Initial release (a294bd3) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (a276a80) Recover code past commit (184c917) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main update function parameter names. (83fbdd1) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main update function parameter names. (6f46e6e) reformat function parameter names (0dfca6c) reformat function parameter names (c81712f) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (eac38ce) Merge pull request #9 NIDAP-Community/Rui_resolve_conflict Resolve conflicts (7fa7db9) Merge pull request #9 NIDAP-Community/Rui_resolve_conflict Resolve conflicts (7839aba) Resolve conflicts (d516cd2) Resolve conflicts (8c776b1) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (0a5942a) Update main local branch (b27d7af) Merge pull request #8 NIDAP-Community/phi_test Phi test (2d5e7ec) Merge pull request #8 NIDAP-Community/phi_test Phi test (87fdb1a) resolve conflict (b4d8548) resolve conflict (a3ddae1) Merge branch 'main' phi_test (e22b5e6) Add ignore h5 files gitignore (55c3167) resolve conflicts (43976ba) resolve error (d59173b) Update current directory (f7e242b) Downsampled CITEseq (bdfa1f3) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main Correct CITEseq Downsmple (4d643f4) correct CITEseq Downsample (3f032fd) helper script 3D-tsne (12ee9f3) helper script 3D-tsne (30b7146) helper script 3D-tsne (a901830) new tests (1ce5664) new tests (29d75bc) new tests (9cb29d2) unit test Jing templates (bb48481) unit test Jing templates (63a6636) unit test Jing templates (97d74ca) NSCLCmulti (3d42d4a) NSCLCmulti (540bdf3) NSCLCmulti (6e8e596) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main Update Chariou Single R BRCA combin Renormalize (e851077) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main Update Chariou Single R BRCA combin Renormalize (072096f) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main Update Chariou Single R BRCA combin Renormalize (1a8fbf8) BRCA comb_Renorm (5e3985b) BRCA comb_Renorm (9fb63a3) BRCA comb_Renorm (6d4c05a) unit tests Name Clusters (95cf6f5) unit tests Name Clusters (c7ed110) unit tests Name Clusters (43859bd) unit test dual labeling (46dd45e) unit test dual labeling (3f07269) unit test dual labeling (5c85127) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main merging new changes (b8b1eda) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main merging new changes (09c8f46) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main merging new changes (729b051) unit tests heatmap, dotplot (7659b83) unit tests heatmap, dotplot (b81287c) unit tests heatmap, dotplot (5414455) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main adding NSCLC_Single SOs (152cf11) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main adding NSCLC_Single SOs (b0ea506) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main adding NSCLC_Single SOs (d83c561) NSCLC_single (df265cd) NSCLC_single (ad62924) NSCLC_single (7d0b242) add dotplot tests (57166ba) add dotplot tests (b2bd01e) add dotplot tests (69fec28) unit test Dotplot (a94f7ba) unit test Dotplot (13fb938) unit test Dotplot (9c67e81) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main new error messaging added (b09cb64) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main new error messaging added (d266d5e) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main new error messaging added (c0aaa1b) new error messaging dotplot (9742c5f) new error messaging dotplot (a9bf495) new error messaging dotplot (93a3a06) changes dotplot (1849346) changes dotplot (b52dc29) changes dotplot (d4c0824) Charou (dccaf54) Charou (95b3421) Charou (1f3ca66) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main Conflicts: .gitignore DESCRIPTION tests/testthat/test_Filter_and_QC.R (c58b92e) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main Conflicts: .gitignore DESCRIPTION tests/testthat/test_Filter_and_QC.R (8a845be) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main Conflicts: .gitignore DESCRIPTION tests/testthat/test_Filter_and_QC.R (bb18f4c) TEC (08d1f47) TEC (11f66b3) TEC (c40054d) NAMESPACE removed merge conda package build requires NAMESPACE file added, ignored dev cycle. (e7ac125) NAMESPACE removed merge conda package build requires NAMESPACE file added, ignored dev cycle. (0027492) NAMESPACE removed merge conda package build requires NAMESPACE file added, ignored dev cycle. (4f3bbc8) Merge pull request #7 NIDAP-Community/dev_release_dec_13_22 Dev release dec 13 22 (02999db) Merge pull request #7 NIDAP-Community/dev_release_dec_13_22 Dev release dec 13 22 (6ec32fa) Merge pull request #7 NIDAP-Community/dev_release_dec_13_22 Dev release dec 13 22 (2e0f434) Initial Commit sprint 5 Functions. Including change DESCRIPTION file (4384dd1) Initial Commit sprint 5 Functions. Including change DESCRIPTION file (eeb7741) Initial Commit sprint 5 Functions. Including change DESCRIPTION file (90120cb) Minor fix codes pass Check (3b4f7ee) Minor fix codes pass Check (29de7d6) Minor fix codes pass Check (b65e314) Updated tests (733e2ec) Updated tests (c9ed47b) Updated tests (97e18e5) update NameClusters function test (128fbb4) update NameClusters function test (3f90257) update NameClusters function test (c88161e) update test-Metadata_Table.R (a37474b) update test-Metadata_Table.R (4257cc6) update test-Metadata_Table.R (7b2f599) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (78fc249) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (cce3673) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (986e82b) small changes 3D plotter testing (74364db) small changes 3D plotter testing (a60aa38) small changes 3D plotter testing (7ac6a75) changed heatmap test added library heatmap (cb33cf2) changed heatmap test added library heatmap (bcab3c2) changed heatmap test added library heatmap (20f7260) revised test dual labeling (b5caf02) revised test dual labeling (0f39220) revised test dual labeling (d1b47d6) new doc dotplot (b986ccc) new doc dotplot (800edc4) new doc dotplot (acd4514) changes test added color option (493b745) changes test added color option (b66d7fa) changes test added color option (69c3c15) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (8863d0d) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (63fc3f6) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (8fa25f6) add original citation Pseudobulk.R (4293f96) add original citation Pseudobulk.R (53add2e) add original citation Pseudobulk.R (7b99980) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (9abcb98) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (940e610) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (fb13a18) add functions heatmap, dotplot, 3d-tsne dual-labeling (0ed4df7) add functions heatmap, dotplot, 3d-tsne dual-labeling (74fe2ad) add functions heatmap, dotplot, 3d-tsne dual-labeling (44338d2) update ModScore Pseudobulk DESCRIPTION (aefedde) update ModScore Pseudobulk DESCRIPTION (abe0919) update ModScore Pseudobulk DESCRIPTION (ec95f0c) fix NAMESPACE @importFrom methods empty (756de4e) fix NAMESPACE @importFrom methods empty (2f2bd5a) fix NAMESPACE @importFrom methods empty (5984060) Update Description (3dcc872) Update Description (968b204) Update Description (1f05120) Merge pull request #6 NIDAP-Community/rui Rui (c09fa3f) Merge pull request #6 NIDAP-Community/rui Rui (5d3d3b2) Merge pull request #6 NIDAP-Community/rui Rui (e71621d) update man docs (bf9fb25) update man docs (c08890f) update man docs (98e86e3) add NameCluster function tests (dbe4d15) add NameCluster function tests (5812a98) add NameCluster function tests (233dd75) update MetadataTable & SampleNames (b3f19d8) update MetadataTable & SampleNames (175fa43) update MetadataTable & SampleNames (1d921a2) drop unused factor levels SO_moduleScore.rds (3a39fcf) drop unused factor levels SO_moduleScore.rds (133d872) drop unused factor levels SO_moduleScore.rds (ea6df85) Jing templates fixtures (08532bf) Jing templates fixtures (9f84531) Jing templates fixtures (150df39) add SampleNames .R .Rd files (9f16588) add SampleNames .R .Rd files (780b298) add SampleNames .R .Rd files (446d631) update MetadataTable (615afdc) update MetadataTable (44abfce) update MetadataTable (a27296a) Unit test added 3d tsne function (3ab8d75) Unit test added 3d tsne function (6dc17bd) Unit test added 3d tsne function (e032618) rui update 1 (9011356) rui update 1 (81793d8) rui update 1 (7006ac8) add man/MetadataTable.Rd (af8eedf) add man/MetadataTable.Rd (7830b05) add man/MetadataTable.Rd (61457e8) upload fixtures/SO_moduleScore.rds (78caf56) upload fixtures/SO_moduleScore.rds (07bc42d) upload fixtures/SO_moduleScore.rds (b3b3dc4) correct DESCRIPTION tibble (57847f5) correct DESCRIPTION tibble (fe89882) correct DESCRIPTION tibble (90dd394) update DESCRIPTION (f55cf25) update DESCRIPTION (fcf6d26) update DESCRIPTION (7d3e4ef) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (be5cff8) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (0d74815) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (58aa02a) add MetadataTable function (42c3569) add MetadataTable function (50e3af0) add MetadataTable function (09b995d) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (01921d5) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (795043f) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (70082b0) removed NAMESPACE repo (dc422fa) removed NAMESPACE repo (d528f76) removed NAMESPACE repo (f7f5da5) removed Rcheck.txt (8b70481) removed Rcheck.txt (e0a6384) removed Rcheck.txt (e23003a) Added Git ignore update R check results, 11_16_2022 (ce18e14) Added Git ignore update R check results, 11_16_2022 (e705893) Added Git ignore update R check results, 11_16_2022 (1d8a95c) Update DESCRIPTION (7fdea8e) Update DESCRIPTION (0d266f4) Update DESCRIPTION (5effd23) Update cc.genes calls (797aca1) Update cc.genes calls (3db02b2) Update cc.genes calls (65f805b) Update cc.genes calls (8cd8b03) Update cc.genes calls (82a4244) Update cc.genes calls (ea8e671) Update library call (423fbe9) Update library call (f52a89c) Update library call (a3d302b) Update namespace (a4230b7) Update namespace (d35dc0e) Update namespace (0a8e2a9) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (272c0ec) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (8558d4f) Merge branch 'main' https://github.com/NIDAP-Community/SCWorkflow main (83f6f23) Update namespace (9960214) Update namespace (3d85b8d) Update namespace (b8c8b0e) Merge pull request #5 NIDAP-Community/initial_filter_qc Adjusted png render method NIDAP display (33820ce) Merge pull request #5 NIDAP-Community/initial_filter_qc Adjusted png render method NIDAP display (770cb6a) Merge pull request #5 NIDAP-Community/initial_filter_qc Adjusted png render method NIDAP display (12b4ce3) Adjusted png render method NIDAP display (0b9e4d2) Adjusted png render method NIDAP display (9968f1f) Adjusted png render method NIDAP display (747b89a) Merge pull request #4 NIDAP-Community/initial_filter_qc Update namespace (bcc1c7f) Merge pull request #4 NIDAP-Community/initial_filter_qc Update namespace (61952ec) Merge pull request #4 NIDAP-Community/initial_filter_qc Update namespace (ac05afc) Update namespace (fdcfd52) Update namespace (f070d8e) Update namespace (fd74f19) Merge pull request #3 NIDAP-Community/initial_filter_qc Added license file (a3a99b6) Merge pull request #3 NIDAP-Community/initial_filter_qc Added license file (5c508c3) Merge pull request #3 NIDAP-Community/initial_filter_qc Added license file (d5113f3) Added license file (186d183) Added license file (a8bd74c) Added license file (1d7ed13) Merge pull request #2 NIDAP-Community/initial_filter_qc remove GenomeInfoDb (fe8164b) Merge pull request #2 NIDAP-Community/initial_filter_qc remove GenomeInfoDb (75ae5fd) Merge pull request #2 NIDAP-Community/initial_filter_qc remove GenomeInfoDb (8908e24) remove GenomeInfoDb (f3bb0e6) remove GenomeInfoDb (2b32d4e) remove GenomeInfoDb (b27279e) Merge pull request #1 NIDAP-Community/initial_filter_qc Initial push filter qc, demo (866a648) Merge pull request #1 NIDAP-Community/initial_filter_qc Initial push filter qc, demo (a30130b) Merge pull request #1 NIDAP-Community/initial_filter_qc Initial push filter qc, demo (b627f06) Initial push filter qc, demo (a843d4d) Initial push filter qc, demo (dcd9fef) Initial push filter qc, demo (462a39d) Update README.md Changed package name (acb154c) Update README.md Changed package name (fdffdf4) Initial commit (6f6b791) Initial commit (7a2591a)","code":""},{"path":[]},{"path":[]},{"path":"https://nidap-community.github.io/SCWorkflow/articles/CONTRIBUTING.html","id":"clone-the-repo","dir":"Articles","previous_headings":"Propose Change","what":"Clone the repo","title":"Contributing to SCWorkflow","text":"member CCBR, can clone repository computer development environment. SCWorkflow large repository may take minutes. Cloning ‘SCWorkflow’… remote: Enumerating objects: 3126, done. remote: Counting objects: 100% (734/734), done. remote: Compressing objects: 100% (191/191), done. remote: Total 3126 (delta 630), reused 545 (delta 543), pack-reused 2392 (1) Receiving objects: 100% (3126/3126), 1.04 GiB | 4.99 MiB/s, done. Resolving deltas: 100% (1754/1754), done. Updating files: 100% (306/306), done.","code":"git clone --single-branch --branch DEV https://github.com/NIDAP-Community/SCWorkflow.git cd SCWorkflow"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/CONTRIBUTING.html","id":"install-dependencies","dir":"Articles","previous_headings":"Propose Change","what":"Install dependencies","title":"Contributing to SCWorkflow","text":"first time cloning repo may install dependencies Check R CMD: R console, make sure package passes R CMD check running: ⚠️ Note: R CMD check doesn’t pass cleanly, ’s good idea ask help continuing.","code":"devtools::check()"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/CONTRIBUTING.html","id":"load-scworkflow","dir":"Articles","previous_headings":"Propose Change","what":"Load SCWorkflow from repo","title":"Contributing to SCWorkflow","text":"R console, load package local repo using:","code":"devtools::load_all()"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/CONTRIBUTING.html","id":"create-branch","dir":"Articles","previous_headings":"Propose Change","what":"Create branch","title":"Contributing to SCWorkflow","text":"Create Git branch pull request (PR). Give branch descriptive name changes make. Example: Use iss-10 ’s specific issue, feature-new-plot new feature. bug fixes small changes, can branch main branch. Success: Switched new branch ‘iss-10’ new features larger changes, branch DEV branch. Success: Switched new branch ‘feature-new-plot’","code":"# Create a new branch from main and switch to it git branch iss-10 git switch iss-10 # Switch to DEV branch, create a new branch, and switch to new branch git switch DEV git branch feature-new-plot git switch feature-new-plot"},{"path":[]},{"path":"https://nidap-community.github.io/SCWorkflow/articles/CONTRIBUTING.html","id":"make-changes","dir":"Articles","previous_headings":"Develop","what":"Make your changes","title":"Contributing to SCWorkflow","text":"Now ’re ready edit code, write unit tests, update documentation needed.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/articles/CONTRIBUTING.html","id":"code-style-guidelines","dir":"Articles","previous_headings":"Develop > Make your changes","what":"Code Style Guidelines","title":"Contributing to SCWorkflow","text":"New code follow general guidelines outlined . - Important: Don’t restyle code unrelated PR Tools help: - Use styler package apply styles Key conventions tidyverse style guide:","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/articles/CONTRIBUTING.html","id":"function-organization","dir":"Articles","previous_headings":"Develop > Make your changes","what":"Function Organization","title":"Contributing to SCWorkflow","text":"Structure functions like : Functions follow template. Use roxygen2 documentation:","code":"#' @title Function Title #' @description Brief description of what the function does #' @param param1 Description of first parameter #' @param param2 Description of second parameter #' @details Additional details if needed #' @importFrom package function_name #' @export #' @return Description of what the function returns yourFunction <- function(param1, param2) { ## --------- ## ## Functions ## ## --------- ## ## --------------- ## ## Main Code Block ## ## --------------- ## output_list <- list( object = SeuratObject, plots = list( 'plotTitle1' = p1, 'plotTitle2' = p2 ), data = list( 'dataframeTitle' = df1 ) ) return(output_list) }"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/CONTRIBUTING.html","id":"commit-push","dir":"Articles","previous_headings":"Develop","what":"Commit and Push Your Changes","title":"Contributing to SCWorkflow","text":"Best practices commits: recommend following “atomic commits” principle commit contains one new feature, fix, task. Learn : Atomic Commits Guide","code":""},{"path":[]},{"path":"https://nidap-community.github.io/SCWorkflow/articles/CONTRIBUTING.html","id":"check-status","dir":"Articles","previous_headings":"Develop > Step-by-Step Process:","what":"1️⃣ Check Status","title":"Contributing to SCWorkflow","text":"Check current state Git working directory staging area:","code":"git status"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/CONTRIBUTING.html","id":"stage-files","dir":"Articles","previous_headings":"Develop > Step-by-Step Process:","what":"2️⃣ Stage Files","title":"Contributing to SCWorkflow","text":"Add files changed staging area:","code":"git add path/to/changed/files/"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/CONTRIBUTING.html","id":"make-the-commit","dir":"Articles","previous_headings":"Develop > Step-by-Step Process:","what":"3️⃣ Make the Commit","title":"Contributing to SCWorkflow","text":"commit message follow Conventional Commits specification. Briefly, commit start one approved types feat, fix, docs, etc. followed description commit. Take look Conventional Commits specification detailed information write commit messages.","code":"git commit -m 'feat: create function for awesome feature'"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/CONTRIBUTING.html","id":"push-your-changes-to-github","dir":"Articles","previous_headings":"Develop > Step-by-Step Process:","what":"4️⃣ Push your changes to GitHub:","title":"Contributing to SCWorkflow","text":"first time pushing branch, may explicitly set upstream branch: recommend pushing commits often backed GitHub. can view files branch GitHub https://github.com/NIDAP-Community/SCWorkflow/tree/<-branch-name> (replace <-branch-name> actual name branch).","code":"git push git push --set-upstream origin iss-10"},{"path":[]},{"path":"https://nidap-community.github.io/SCWorkflow/articles/CONTRIBUTING.html","id":"writing-tests","dir":"Articles","previous_headings":"Document and Tests","what":"Writing Tests","title":"Contributing to SCWorkflow","text":"tests matter: changes code also need unit tests demonstrate changes work intended. add tests: Use testthat create unit tests Follow organization described tidyverse test style guide Look existing code package examples","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/articles/CONTRIBUTING.html","id":"documentation","dir":"Articles","previous_headings":"Document and Tests","what":"Documentation","title":"Contributing to SCWorkflow","text":"update documentation: Written new function Changed API existing function Function used vignette update documentation: Use roxygen2 Markdown syntax See R Packages book detailed instructions Update relevant vignettes needed","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/articles/CONTRIBUTING.html","id":"check","dir":"Articles","previous_headings":"Document and Tests","what":"Check Your Work","title":"Contributing to SCWorkflow","text":"🔍 Final validation step: making changes, run following command R console make sure package still passes R CMD check: Goal: checks pass errors, warnings, notes.","code":"devtools::check()"},{"path":[]},{"path":"https://nidap-community.github.io/SCWorkflow/articles/CONTRIBUTING.html","id":"create-the-pr","dir":"Articles","previous_headings":"Deploy Feature","what":"1️⃣ Create the PR","title":"Contributing to SCWorkflow","text":"branch ready, create PR GitHub: https://github.com/NIDAP-Community/SCWorkflow/pull/new/ Select branch just pushed: Edit PR title description. title briefly describe change. Follow comments template fill body PR, can delete comments (everything ) go. ’re ready, click ‘Create pull request’ open . Optionally, can mark PR draft ’re yet ready reviewed, change later ’re ready.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/articles/CONTRIBUTING.html","id":"wait-for-a-maintainer-to-review-your-pr","dir":"Articles","previous_headings":"Deploy Feature","what":"2️⃣ Wait for a maintainer to review your PR","title":"Contributing to SCWorkflow","text":"best follow tidyverse code review principles: https://code-review.tidyverse.org/. reviewer may suggest make changes accepting PR order improve code quality style. ’s case, continue make changes branch push GitHub, appear PR. PR approved, maintainer merge issue(s) PR links close automatically. Congratulations thank contribution!","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/articles/CONTRIBUTING.html","id":"after-your-pr-has-been-merged","dir":"Articles","previous_headings":"Deploy Feature","what":"3️⃣ After your PR has been merged","title":"Contributing to SCWorkflow","text":"PR merged, update local clone repo switching DEV branch pulling latest changes: ’s good idea run git pull creating new branch start recent commits main.","code":"git checkout DEV git pull"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/CONTRIBUTING.html","id":"helpful-links-for-more-information","dir":"Articles","previous_headings":"","what":"Helpful links for more information","title":"Contributing to SCWorkflow","text":"contributing guide adapted tidyverse contributing guide GitHub Flow tidyverse style guide tidyverse code review principles reproducible examples R packages book usethis devtools testthat styler roxygen2","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/articles/README.html","id":"scworkflow","dir":"Articles","previous_headings":"","what":"SCWorkflow","title":"","text":"CCBR Single-cell RNA-seq Package (SCWorkflow) allows users analyze single-cell RNA-seq datasets starting CellRanger output files (H5 mtx files, etc.).","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/articles/README.html","id":"installation","dir":"Articles","previous_headings":"SCWorkflow","what":"Installation","title":"","text":"can install SCWorkflow package GitHub : also Docker container available ","code":"# install.packages(\"remotes\") remotes::install_github(\"NIDAP-Community/SCWorkflow\", dependencies = TRUE)"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/README.html","id":"usage","dir":"Articles","previous_headings":"SCWorkflow","what":"Usage","title":"","text":"Following workflow can perform steps single-cell RNA-seq analysis, : Quality Control: Import, Select, & Rename Samples Filter Cells based QC metrics Combine Samples, Cluster, Normalize Data Batch Correction using Harmony Cell Annotation: SingleR Automated Annotations Module Scores Co-Expression External Annotations Visualizations: Dimensionality Reductions (t-SNE UMAP Plots) colored Marker Expression Metadata Heatmaps Violin Plots Trajectory Differential Expression Analysis Seurat’s FindMarkers() Pseudobulk Aggregation Pathway Analysis Please see introductory vignette quick start tutorial. Take look reference documentation detailed information function package.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Annotations.html","id":"cell-type-annotation-with-singler","dir":"Articles","previous_headings":"","what":"Cell Type Annotation with SingleR","title":"Annotations","text":"function automates cell type annotation single-cell RNA sequencing data employing SingleR [1] method, allocates labels cells within dataset according gene expression profile similarities reference dataset containing cell type labeled samples SingleR automatic annotation method single-cell RNA sequencing data uses given reference dataset samples (single-cell bulk) known labels label new cells test dataset based similarity reference. Two mouse reference datasets (MouseRNAseqData ImmGenData) two human reference datasets (HumanPrimaryCellAtlasData BlueprintEncodeData) CellDex R package [2] currently available.","code":"Anno_SO=annotateCellTypes(object=Comb_SO$object, species = \"Mouse\", reduction.type = \"umap\", legend.dot.size = 2, do.finetuning = FALSE, local.celldex = NULL, use.clusters = NULL )"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Annotations.html","id":"add-external-cell-annotations","dir":"Articles","previous_headings":"","what":"Add External Cell Annotations","title":"Annotations","text":"function merge external table cell annotations existing Seurat Object’s metadata table. input external metadata table must column named “Barcode” contains barcodes matching found metadata already present input Seurat Object. output new Seurat Object metadata now includes additional columns external table.","code":"CellType_Anno_Table=read.csv(\"./images/PerCell_Metadata.csv\") ExtAnno_SO=ExternalAnnotation(object = Anno_SO$object, external_metadata = CellType_Anno_Table, seurat_object_filename = \"seurat_object.rds\", barcode_column = \"Barcode\", external_cols_to_add = c(\"Cell Type\"), col_to_viz = \"Cell Type\" )"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Annotations.html","id":"cell-annotation-with-co-expression","dir":"Articles","previous_headings":"","what":"Cell Annotation with Co-Expression","title":"Annotations","text":"function display co-expression two chosen markers Seurat Object. Create metadata column containing annotations cells correspond marker expression thresholds set. function enables users visualize association two selected genes proteins according expression values various samples. association plotted, samples values specified limit can excluded. Users ability customize visualization, including choice visualization type, point size shape, transparency level. Furthermore, tool allows application filters data, setting thresholds, providing annotations notify users cells meet established thresholds. visualization can improved omitting extreme values. tool also facilitates creation heatmap represent density distribution cells exhibit raw gene/protein expression values.","code":"grep('Cd4',rownames(Anno_SO$object@assays$RNA),ignore.case = T,value=T) DLAnno_SO=dualLabeling(object = Anno_SO$object, samples <- c(\"PBS\",\"CD8dep\",\"ENT\",\"NHSIL12\",\"Combo\"), marker.1=\"Nos2\", marker.2=\"Arg1\", marker.1.type = \"SCT\", marker.2.type = \"SCT\", data.reduction = \"both\", point.size = 0.5, point.shape = 16, point.transparency = 0.5, add.marker.thresholds = TRUE, marker.1.threshold = 0.5, marker.2.threshold = 0.5, filter.data = TRUE, marker.1.filter.direction = \"greater than\", marker.2.filter.direction = \"greater than\", apply.filter.1 = TRUE, apply.filter.2 = TRUE, filter.condition = TRUE, parameter.name = \"My_CoExp\", trim.marker.1 = FALSE, trim.marker.2 = FALSE, pre.scale.trim = 0.99, display.unscaled.values = FALSE ) plot(DLAnno_SO$plots$tsne) plot(DLAnno_SO$plots$umap)"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Annotations.html","id":"color-by-gene-lists","dir":"Articles","previous_headings":"","what":"Color by Gene Lists","title":"Annotations","text":"function generates plots visualize expression specific markers (genes) single-cell RNA sequencing (scRNA-seq) data. Gene plots generated order appear input list (provided present data). function takes number inputs create detailed plots showing activity certain genes. can customize based specific samples genes interest point transparency. code built-system alert issues chosen inputs. particular gene missing, return empty plot. gene present, perform several steps adjust data better visualization analysis, normalizing data creating reduction plot (type plot helps visualize complex data). code also makes sure display chosen samples, creates caption plot indicating samples shown, colors points based gene activity levels, adjusts plot’s visual elements like transparency, size, labels. haven’t selected specific samples, use available samples data. also checks presence chosen genes data processes ensure uniformity across different cell types. output function detailed figure showing activity chosen genes across different cell types. useful identifying distinct groups cells based gene activity levels.","code":"Marker_Table <- read.csv(\"Marker_Table_demo.csv\") colorByMarkerTable(object=Anno_SO$object, samples.subset=c(\"PBS\",\"ENT\",\"NHSIL12\", \"Combo\",\"CD8dep\" ), samples.to.display=c(\"PBS\",\"ENT\",\"NHSIL12\", \"Combo\",\"CD8dep\" ), marker.table=Marker_Table, cells.of.interest=c(\"Neutrophils\",\"Macrophages\",\"CD8_T\" ), protein.presence = FALSE, assay = \"SCT\", reduction.type = \"umap\", point.transparency = 0.5, point.shape = 16, cite.seq = FALSE )"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Annotations.html","id":"module-score-cell-classification","dir":"Articles","previous_headings":"","what":"Module Score Cell Classification","title":"Annotations","text":"Screens data cells based user-specified cell markers. Outputs seurat object metadata averaged marker scores annotated “Likely_CellType” column. function can used quantify expression marker sets individual cell (optionally) hierarchical manner, helping identify different cell types potential subpopulations. function aids identifying cell types based average gene expression. uses feature Seurat software known AddModuleScore function. function calculates gene expression specific sets records within designated area Seurat object. program forecasts cell identities comparing recorded scores across various gene sets. ability adjust identification process designating cutoff points bimodal distribution parameter known manual threshold. thresholds cutoff considered identification process. Inputs: program takes several inputs. include single-cell RNA sequencing (scRNA-seq) object, selection samples analysis, table gene markers different cell types, optionally, hierarchical table directing order cell classification. Data Preparation: program prepares scRNA-seq object, assigns names samples, selects data based specified samples. Module Score Calculation: program calculates module scores, measure gene set activity expression [3], cell type based provided marker table. Visualization: Density distribution plots colored reduction plots generated help visualize module scores, relationship cell types, sample identities. Thresholding: Users can select threshold values aid classification cells. Cells scores designated threshold labeled “unknown”. Subclass Identification: desired, program can identify subclasses within cell types analyzing subpopulations. Updating Cell Type Labels: program appends “Likely_CellType” column metadata scRNA-seq object, based results module score analysis. Output: updated scRNA-seq object new cell type labels.","code":"MS_object=modScore(object=Anno_SO$object, marker.table=Marker_Table, use_columns = c(\"Neutrophils\",\"Macrophages\",\"CD8_T\" ), ms_threshold=c(\"Neutrophils .25\",\"Macrophages .40\",\"CD8_T .14\"), general.class=c(\"Neutrophils\",\"Macrophages\",\"CD8_T\"), multi.lvl = FALSE, reduction = \"umap\", nbins = 10, gradient.ft.size = 6, violin.ft.size = 6, step.size = 0.1 )"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Annotations.html","id":"rename-clusters-by-cell-type","dir":"Articles","previous_headings":"","what":"Rename Clusters by Cell Type","title":"Annotations","text":"function creates dot plot Cell Types Renamed Clusters outputs Seurat Object new metadata column containing New Cluster Names. Cell Types often determined looking Module Score Cell Classification calls made upstream Module Score Cell Classification (see MS_Celltype metadata column). must provide table column containing unique Cluster IDs upstream clustering analysis (e.g. one SCT_snn_res_* columns input Seurat Object metadata) column containing corresponding New Cluster Names chosen. dot plot display unique Cell Types x-axis Renamed Clusters y-axis. size dots show percentage cells row (Renamed Cluster) classified Cell Type. comparison dot sizes within row may provide insights cluster’s primary Cell Type. new metadata column named “Clusternames” added output Seurat Object contains New Cluster Names. Methodology function creates dot plot visualization cell types metadata category (usually cluster number) given dataset implemented SCWorkflow package. function allows update organize biological data cell clusters Seurat object. changing input labels, can map custom names existing cluster IDs add names new metadata column. also generates dot plot using Seurat’s Dotplot function [4], providing visual representation percentage various cell types within cluster. Typically, cluster can distinctively named predominant cell type seen dotplot. plot’s order can customized clusters cell types. specific order provided, function uses default order. optional parameter allows user make plot interactive. function returns updated Seurat object plot.","code":"clstrTable <- read.table(file = \"./images/Cluster_Names.txt\", sep = '\\t',header = T) RNC_object=nameClusters(object=Anno_SO$object, cluster.identities.table=clstrTable, cluster.numbers= 'OriginalClusterIDs', cluster.names='NewClusterNames', cluster.column =\"SCT_snn_res.0.2\", labels.column = \"mouseRNAseq_main\", order.clusters.by = NULL, order.celltypes.by = NULL, interactive = FALSE ) # DimPlot(MS_object, group.by = \"SCT_snn_res.0.2\", label = T, reduction = 'umap') # DimPlot(MS_object, group.by = \"mouseRNAseq_main\", label = T, reduction = 'umap') ggsave(RNC_object$plots, filename = \"./images/RNC.png\", width = 9, height = 6)"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Annotations.html","id":"dot-plot-of-genes-by-metadata","dir":"Articles","previous_headings":"","what":"Dot Plot of Genes by Metadata","title":"Annotations","text":"function creates dot plot average gene expression values set genes cell subpopulations defined metadata annotation columns. input table contains single column genes (“Genes column”) single column category (“Category labels plot” column). values “Category labels plot” column match values provided metadata function (Metadata Category Plot). plot order genes (x-axis, left right) Categories (y-axis, top bottom) order appears input table. category entries omitted plotted. Dotplot size reflect percentage cells expressing gene color reflect average expression gene. table showing values plot (either percentage cells expressing gene, average expression scaled) returned, selected user. Methodology function creates dot plot visualization gene expression metadata given dataset. uses Seurat package create plots. size dot represents percentage cells expressing particular gene (frequency), color dot indicates average gene expression level. function ensures unique valid genes categories used. categories genes found dataset, appropriate warnings issued. plot drawn option reverse x y-axes reverse order metadata categories. colors can also customized. addition plot, function provides tabular format dot plot data, can useful analysis reporting. choice returning either tables representing percent cells expressing gene average expression level genes. function can useful exploratory data analysis visualizing differences gene expression across different conditions groups cells. Aran, D., . P. Looney, L. Liu, E. Wu, V. Fong, . Hsu, S. Chak, et al. 2019. “Reference-based analysis lung single-cell sequencing reveals transitional profibrotic macrophage.” Nat. Immunol. 20 (2): 163–72. http://bioconductor.org/packages/release/data/experiment/html/celldex.html https://satijalab.org/seurat/reference/addmodulescore Hao Y et al. Integrated analysis multimodal single-cell data. Cell. 2021 Jun 24;184(13):3573-3587.e29. doi: 10.1016/j.cell.2021.04.048. Epub 2021 May 31. PMID: 34062119; PMCID: PMC8238499.","code":"FigOut=dotPlotMet(object=Anno_SO$object, metadata=\"orig.ident\", cells=c(\"PBS\",\"ENT\",\"NHSIL12\", \"Combo\",\"CD8dep\" ), markers=Marker_Table$Macrophages, plot.reverse = FALSE, cell.reverse.sort = FALSE, dot.color = \"darkblue\" )"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-DEG.html","id":"de-with-find-markers","dir":"Articles","previous_headings":"","what":"DE with Find Markers","title":"Differential Expression Analysis","text":"function performs DE (differential expression) analysis merged Seurat object identify expression markers different groups cells (contrasts). analysis uses FindMarkers() function Seurat Workflow. Methodology Differential expression analysis (DEG) fundamental technique single-cell genomics research. goal DEG analysis identify genes exhibit significant changes expression levels different groups cells conditions, thereby uncovering potential markers distinguish groups. function takes merged Seurat object [1] input, expected contain single-cell data multiple samples, along relevant metadata SingleR annotations, provide information cell identity. perform DEG analysis, user can choose various statistical algorithms, MAST [2], wilcox [3], bimod [4], , accommodate different types experimental designs assumptions data. user can control sensitivity analysis setting minimum fold-change gene expression groups considered significant. Additionally, users can specify assay used analysis, whether scaled data (SCT) raw RNA counts. best results, recommended use function well-curated preprocessed single-cell data, ensuring Seurat object contains relevant metadata SingleR annotations. Users carefully select samples contrasts based experimental design research questions. Additionally, exploring different statistical algorithms adjusting threshold can fine-tune DEG analysis reveal accurate gene expression markers. https://satijalab.org/seurat/ https://rglab.github.io/MAST/ Dalgaard, Peter (2008). Introductory Statistics R. Springer Science & Business Media. pp. 99–100 https://en.wikipedia.org/wiki/Multimodal_distribution","code":"DEG_table=degGeneExpressionMarkers(object = Anno_SO$object, samples = c(\"PBS\", \"ENT\", \"NHSIL12\", \"Combo\", \"CD8dep\" ), contrasts = c(\"0-1\"), parameter.to.test = \"SCT_snn_res_0_2\", test.to.use = \"MAST\", log.fc.threshold = 0.25, assay.to.use = \"SCT\", use.spark = F )"},{"path":[]},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-DEG.html","id":"aggregate-seurat-counts","dir":"Articles","previous_headings":"Pseudo Bulk Method","what":"Aggregate Seurat Counts","title":"Differential Expression Analysis","text":"function first step Pseudobulk analysis scRNA-seq dataset. groups cells based chosen categorical variable(s) Seurat Object’s Metadata aggregates counts gene group. output table aggregate expression rows genes columns values found chosen Pseudobulk variable. select multiple categories aggregate (e.g. Category1: ,B,C Category2: D,E,F), cells grouped combinations category variables (e.g. A_D, A_E, A_F, B_D, B_E, B_F). default, gene counts averaged across cells group.","code":"aggregateCounts(object=so, var.group=var_group, slot=slot)"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-DEG.html","id":"statistical-analysis-using-limma","dir":"Articles","previous_headings":"Pseudo Bulk Method","what":"Statistical Analysis using Limma","title":"Differential Expression Analysis","text":"Given matrix (typically log-normalized gene expression) metadata table, run one- two-factor statistical analyses groups using linear mixed effects models limma. Reference. 2 ways treating Donor Patient - one random effect fixed effect Using Mixed Effects Model (Donor random effect): Add Donor column Donor Variable Column add Donor variable Covariate Columns. handled separately Donor Variable Column random effect. Covariate Columns field include variables except Donor. Using Basic Linear Model (Donor fixed effect): can add Donor column covariate Covariate Columns, treated fixed effect. Additional variables can included Covariate Columns Ensure Donor Variable Column left blank. function Beta version undergoing active development. encounter problems, please contact CCBR NCICCBRNIDAP@mail.nih.gov","code":"Pseudobulk_LimmaStats()"},{"path":[]},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-DEG.html","id":"volcano-plot---enhanced","dir":"Articles","previous_headings":"Visualizations","what":"Volcano Plot - Enhanced","title":"Differential Expression Analysis","text":"function utilizes EnhancedVolcano R Bioconductor package generate publication-ready volcano plots differential expression analyses, offering number customizable visualization options optimizing gene label placement avoid clutter Methodology volcano plot type scatterplot shows statistical significance (P value) versus magnitude change (fold change). enables quick visual identification genes large fold changes also statistically significant. may biologically significant features (genes, isoforms, peptides ). , using highly-configurable function “EnhancedVolcano” produces publication-ready volcano plots. Maria Doyle, 2021 Visualization RNA-Seq results Volcano Plot (Galaxy Training Materials). https://training.galaxyproject.org/training-material/topics/transcriptomics/tutorials/rna-seq-viz--volcanoplot/tutorial.html Online; accessed Mon Aug 01 2022 Batut et al., 2018 Community-Driven Data Analysis Training Biology Cell Systems 10.1016/j.cels.2018.05.012 Blighe, K, S Rana, M Lewis. 2018. EnhancedVolcano: Publication-ready volcano plots enhanced coloring labeling. https://github.com/kevinblighe/EnhancedVolcano.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Overview.html","id":"process-input-data","dir":"Articles","previous_headings":"","what":"Process Input Data","title":"Import Data and Quality Control","text":"package designed work general Seurat Workflow[1]. begin using SCWorkflow tools process h5 files generated Cell Ranger[Reference] software 10x genomics platform create list Seurat Objects corresponding h5 file. Seurat Object basic data structure Seurat Single Cell analysis tool supports standard scRNAseq, CITE-Seq, TCR-Seq assays. Samples prepared cell hashing protocol (HTOs) can also processed produce Seurat Object split corresponding experimental design strategy. h5 files containing multiple samples can also processed create Seurat objects split based values orig.ident column. corresponding Metadata table can used add sample level information Seurat object. table format Sample names first Column sample metadata additional columns. Metadata table can also used rename samples including alternative sample name Column metadata table. Samples can also excluded final Seurat object using REGEX strategy identify samples included/excluded. explain based newnames final Seurat Object contain assay slot log2 normalized counts. QC figures individual samples also produced help evaluate samples quality.","code":"SampleMetadataTable <- read.table(file = \"./images/Sample_Metadata.txt\", sep = '\\t',header = T) files=list.files(path=\"../tests/testthat/fixtures/Chariou/h5files\",full.names = T) SOlist=processRawData(input=files, organism=\"Mouse\", sample.metadata.table=SampleMetadataTable, sample.name.column='Sample_Name', rename.col='Rename', keep=T, file.filter.regex=c(), split.h5=F, cell.hash=F, do.normalize.data=T )"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Overview.html","id":"filter-low-quality-cells","dir":"Articles","previous_headings":"","what":"Filter Low Quality Cells","title":"Import Data and Quality Control","text":"function filter genes cells based multiple metrics available Seurat Object metadata slot. detailed guide single cell quality filtering can found Xi Li, 2021 [2]. First, genes can filtered setting minimum number cells needed keep gene removing VDJ Add descriptiopn VDJ genes. Next, cells can filtered setting thresholds individual metric. Cells meet designated criteria removed final filtered Seurat Object . Filter limits can set using absolute values median absolute deviations (MADs) criteria. absolute MAD values set single filter, least extreme value (.e. lowest value upper limits highest value lower limits) selected. filter values used metric printed log output. filters default values can turned setting limits NA. individual filtering criteria used tool listed . total number molecules detected within cell (nCount_RNA) number genes detected cell (nFeature_RNA) complexity genes ( log10(nFeature_RNA)/log10(nCount_RNA) Percent mitochondrial Genes Percent counts top 20 Genes Doublets calculated scDblFinder (using package default parameters) [3] function return filtered Seurat Object various figures showing metrics filtering. figures can used help evaluate effects filtering criteria whether filtering limits need adjusted.","code":"SO_filtered=filterQC(object=SOlist$object, ## Filter Genes min.cells = 20, filter.vdj.genes=F, ## Filter Cells nfeature.limits=c(NA,NA), mad.nfeature.limits=c(5,5), ncounts.limits=c(NA,NA), mad.ncounts.limits=c(5,5), mitoch.limits = c(NA,25), mad.mitoch.limits = c(NA,3), complexity.limits = c(NA,NA), mad.complexity.limits = c(5,NA), topNgenes.limits = c(NA,NA), mad.topNgenes.limits = c(5,5), n.topgnes=20, do.doublets.fitler=T )"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Overview.html","id":"combine-normalize-and-cluster-data","dir":"Articles","previous_headings":"","what":"Combine, Normalize, and Cluster Data","title":"Import Data and Quality Control","text":"functions combines multiple sample level Seurat Objects single Seurat Object normalizes combined dataset. multi-dimensionality data summarized set “principal components” visualized UMAP tSNE projections. graph-based clustering approach identify cell clusters data. 1. Hao Y et al. Integrated analysis multimodal single-cell data. Cell. 2021 Jun 24;184(13):3573-3587.e29. doi: 10.1016/j.cell.2021.04.048. Epub 2021 May 31. PMID: 34062119; PMCID: PMC8238499. 2. Heumos, L., Schaar, .C., Lance, C. et al. Best practices single-cell analysis across modalities. Nat Rev Genet (2023). https://doi.org/10.1038/s41576-023-00586-w 3. Germain P, Lun , Macnair W, Robinson M (2021). “Doublet identification single-cell sequencing data using scDblFinder.” f1000research. doi:10.12688/f1000research.73600.1.","code":"Comb_SO=combineNormalize( object=SO_filtered$object, # Nomralization variables npcs = 21, SCT.level=\"Merged\", vars.to.regress = c(\"percent.mt\"), # FindVariableFeatures nfeatures = 2000, low.cut = 0.1, high.cut = 8, low.cut.disp = 1, high.cut.disp = 100000, selection.method = 'vst', # Dim Reduction only.var.genes = FALSE, draw.umap = TRUE, draw.tsne = TRUE, seed.for.pca = 42, seed.for.tsne = 1, seed.for.umap = 42, # Clustering Varables clust.res.low = 0.2, clust.res.high = 1.2, clust.res.bin = 0.2, # Select PCs methods.pca = NULL, var.threshold = 0.1, pca.reg.plot = FALSE, jackstraw = FALSE, jackstraw.dims=5, # Other exclude.sample = NULL, cell.count.limit= 35000, reduce.so = FALSE, project.name = 'scRNAProject', cell.hashing.data = FALSE )"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-QC.html","id":"process-input-data","dir":"Articles","previous_headings":"","what":"Process Input Data","title":"Import Data and Quality Control","text":"package designed work general Seurat Workflow. begin using SCWorkflow tools process h5 files generated Cell Ranger software 10x genomics platform create list Seurat Objects[1] corresponding h5 file. Seurat Object basic data structure Seurat Single Cell analysis tool supports standard scRNAseq, CITE-Seq, TCR-Seq assays. Samples prepared cell hashing protocol (HTOs) can also processed produce Seurat Object split corresponding experimental design strategy. h5 files containing multiple samples can also processed create Seurat objects split based values orig.ident column. corresponding Metadata table can used add sample level information Seurat object. table format Sample names first Column sample metadata additional columns. Metadata table can also used rename samples including alternative sample name Column metadata table. Samples can also excluded final Seurat object using REGEX strategy identify samples included/excluded. explain based newnames final Seurat Object contain assay slot log2 normalized counts. QC figures individual samples also produced help evaluate samples quality.","code":"SampleMetadataTable <- read.table(file = \"./images/Sample_Metadata.txt\", sep = '\\t',header = T) files=list.files(path=\"../tests/testthat/fixtures/Chariou/h5files\",full.names = T) SOlist=processRawData(input=files, sample.metadata.table=SampleMetadataTable, sample.name.column='Sample_Name', organism=\"Mouse\", rename.col='Rename', keep=T, file.filter.regex=c(), split.h5=F, cell.hash=F, tcr.summarize.topN=10, do.normalize.data=T )"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-QC.html","id":"filter-low-quality-cells","dir":"Articles","previous_headings":"","what":"Filter Low Quality Cells","title":"Import Data and Quality Control","text":"function filter genes cells based multiple metrics available Seurat Object metadata slot. detailed guide single cell quality filtering can found Xi Li, 2021 [2]. First, genes can filtered setting minimum number cells needed keep gene removing VDJ Add descriptiopn VDJ genes. Next, cells can filtered setting thresholds individual metric. Cells meet designated criteria removed final filtered Seurat Object . Filter limits can set using absolute values median absolute deviations (MADs) criteria. absolute MAD values set single filter, least extreme value (.e. lowest value upper limits highest value lower limits) selected. filter values used metric printed log output. filters default values can turned setting limits NA. individual filtering criteria used tool listed . total number molecules detected within cell (nCount_RNA) number genes detected cell (nFeature_RNA) complexity genes ( log10(nFeature_RNA)/log10(nCount_RNA) Percent mitochondrial Genes Percent counts top 20 Genes Doublets calculated scDblFinder (using package default parameters) [3] function return filtered Seurat Object various figures showing metrics filtering. figures can used help evaluate effects filtering criteria whether filtering limits need adjusted.","code":"SO_filtered=filterQC(object=SOlist$object, ## Filter Genes min.cells = 20, filter.vdj.genes=F, ## Filter Cells nfeature.limits=c(NA,NA), mad.nfeature.limits=c(5,5), ncounts.limits=c(NA,NA), mad.ncounts.limits=c(5,5), mitoch.limits = c(NA,25), mad.mitoch.limits = c(NA,3), complexity.limits = c(NA,NA), mad.complexity.limits = c(5,NA), topNgenes.limits = c(NA,NA), mad.topNgenes.limits = c(5,5), n.topgnes=20, do.doublets.fitler=T )"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-QC.html","id":"combine-normalize-and-cluster-data","dir":"Articles","previous_headings":"","what":"Combine, Normalize, and Cluster Data","title":"Import Data and Quality Control","text":"functions combines multiple sample level Seurat Objects single Seurat Object normalizes combined dataset. multi-dimensionality data summarized set “principal components” visualized UMAP tSNE projections. graph-based clustering approach identify cell clusters data. Hao Y et al. Integrated analysis multimodal single-cell data. Cell. 2021 Jun 24;184(13):3573-3587.e29. doi: 10.1016/j.cell.2021.04.048. Epub 2021 May 31. PMID: 34062119; PMCID: PMC8238499. Heumos, L., Schaar, .C., Lance, C. et al. Best practices single-cell analysis across modalities. Nat Rev Genet (2023). https://doi.org/10.1038/s41576-023-00586-w Germain P, Lun , Macnair W, Robinson M (2021). “Doublet identification single-cell sequencing data using scDblFinder.” f1000research. doi:10.12688/f1000research.73600.1.","code":"Comb_SO=combineNormalize( object=SO_filtered$object, # Nomralization variables npcs = 21, SCT.level=\"Merged\", vars.to.regress = c(\"percent.mt\"), # FindVariableFeatures nfeatures = 2000, low.cut = 0.1, high.cut = 8, low.cut.disp = 1, high.cut.disp = 100000, selection.method = 'vst', # Dim Reduction only.var.genes = FALSE, draw.umap = TRUE, draw.tsne = TRUE, seed.for.pca = 42, seed.for.tsne = 1, seed.for.umap = 42, # Clustering Varables clust.res.low = 0.2, clust.res.high = 1.2, clust.res.bin = 0.2, # Select PCs methods.pca = NULL, var.threshold = 0.1, pca.reg.plot = FALSE, jackstraw = FALSE, jackstraw.dims=5, # Other exclude.sample = NULL, cell.count.limit= 35000, reduce.so = FALSE, project.name = 'scRNAProject', cell.hashing.data = FALSE )"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-SubsetReclust.html","id":"subset-seurat-object","dir":"Articles","previous_headings":"","what":"Subset Seurat Object","title":"Subset and Recluster","text":"function subsets Seurat object. Select metadata column values matching cells pass forward analysis.","code":"filter_SO=filterSeuratObjectByMetadata( object = Anno_SO$object, samples.to.include = c(\"PBS\",\"ENT\",\"NHSIL12\",\"Combo\",\"CD8dep\"), sample.name = 'orig.ident', category.to.filter = 'immgen_main', values.to.filter = c('Monocytes','Macrophages','DC'), keep.or.remove = FALSE, greater.less.than = \"greater than\", colors = c( \"aquamarine3\", \"salmon1\", \"lightskyblue3\"), seed = 10, cut.off = 0.5, legend.position = \"right\", reduction = \"umap\", plot.as.interactive.plot = FALSE, legend.symbol.size = 2, dot.size = 0.1, number.of.legend.columns = 1, dot.size.highlighted.cells = 0.5, use.cite.seq.data = FALSE )"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-SubsetReclust.html","id":"recluster-seurat-object","dir":"Articles","previous_headings":"","what":"Recluster Seurat Object","title":"Subset and Recluster","text":"function provides mechanism re-clustering filtered Seurat object, common task single-cell RNA sequencing analysis. function provides options choose number principal components, range clustering resolution, type dimensionality reduction, several parameters. function finds variable features performs Principal Component Analysis (PCA). Next, dimensionality reduction performed using UMAP t-SNE based PCA, followed identification nearest neighbors. performs clustering different resolutions within provided range, creating new clustering columns Seurat object. also retains old clustering information, plots clusters resolution returns list containing re-clustered Seurat object grid clustering plots. function can helpful experimenting different clustering parameters especially filtering visually inspect results. Methodology function uses methods Seurat package [1]. Seurat uses graph-based clustering method inspired previous strategies, particularly Macosko et al [3]. uses methods like SNN-Cliq PhenoGraph [4.5], represent cells graph structure based similarities feature expression patterns. aim divide graph highly connected communities clusters. process begins building K-nearest neighbor (KNN) graph using Euclidean distance PCA space. algorithm refines edge weights cells according local neighborhood overlap, calculated using Jaccard similarity measure. performed using predefined dimensions dataset, first 10 Principal Components (PCs). cluster cells, Seurat uses modularity optimization techniques like Louvain [4] algorithm SLM [5]. ‘resolution’ parameter can adjusted control granularity downstream clustering; higher resolution results clusters. single-cell datasets approximately 3K cells, recommended range parameter 0.4 1.2, larger datasets typically require higher resolution. Seurat Clustering method https://satijalab.org/seurat/articles/pbmc3k_tutorial.html Macosko EZ, Basu , Satija R, Nemesh J, Shekhar K, Goldman M, Tirosh , Bialas AR, Kamitaki N, Martersteck EM, Trombetta JJ, Weitz DA, Sanes JR, Shalek AK, Regev , McCarroll SA. Highly Parallel Genome-wide Expression Profiling Individual Cells Using Nanoliter Droplets. Cell. 2015 May 21;161(5):1202-1214. Xu, Chen, Zhengchang Su. Identification cell types single-cell transcriptomes using novel clustering method. Bioinformatics 31.12 (2015): 1974-1980. Levine, Jacob H., et al. Data-driven phenotypic dissection AML reveals progenitor-like cells correlate prognosis. Cell 162.1 (2015): 184-197. Blondel, Vincent D., et al. Fast unfolding communities large networks.”Journal statistical mechanics: theory experiment 2008.10 (2008): P10008. Waltman, Ludo, Nees Jan Van Eck. smart local moving algorithm large-scale modularity-based community detection. European physical journal B 86 (2013): 1-14","code":"reClust_SO=reclusterSeuratObject( object = filter_SO$object, prepend.txt = \"old\", old.columns.to.save=c(\"orig_ident\",\"Sample_Name\",\"nCount_RNA\",\"nFeature_RNA\",\"percent_mt\", \"log10GenesPerUMI\",\"S_Score\",\"G2M_Score\",\"Phase\",\"CC_Difference\",\"Treatment\", \"pct_counts_in_top_N_genes\",\"Doublet\",\"nCount_SCT\",\"nFeature_SCT\", \"mouseRNAseq_main\",\"mouseRNAseq\",\"immgen_main\",\"immgen\" ), number.of.pcs = 50, cluster.resolution.low.range = 0.2, cluster.resolution.high.range = 1.2, cluster.resolution.range.bins = 0.2, reduction.type = \"umap\" )"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Usage.html","id":"use-scworkflow-container","dir":"Articles","previous_headings":"","what":"Use SCWorkflow Container","title":"Getting Started","text":"SCWorkflow docker container available Biowulf can used RStudio organize rune SCWorkflow package. need 2 shells (terminals) set RStudio Biowulf.","code":""},{"path":[]},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Usage.html","id":"log-in-to-biowulf","dir":"Articles","previous_headings":"Use SCWorkflow Container","what":"1. Log in to Biowulf","title":"Getting Started","text":"Open terminal login biowulf call interactive session","code":"ssh username@helix.nih.gov sinteractive --tunnel --time=12:00:00 --mem=50g --cpus-per-task=16 --gres=lscratch:50"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Usage.html","id":"get-the-port-number-for-termal-2","dir":"Articles","previous_headings":"Use SCWorkflow Container","what":"2. Get the PORT number for termal 2","title":"Getting Started","text":"","code":"echo $PORT1 example port is 46137"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Usage.html","id":"load-the-container","dir":"Articles","previous_headings":"Use SCWorkflow Container","what":"3. Load the Container","title":"Getting Started","text":"single cell container emulate environments NIDAP","code":"source /data/CCBR/NIDAP/container_singlecell.sh"},{"path":[]},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Usage.html","id":"connect-your-local-shell-to-the-rstudio-server-on-biowulf-using-ssh-tunneling-","dir":"Articles","previous_headings":"Use SCWorkflow Container","what":"4. Connect your local shell to the RStudio server on Biowulf using SSH tunneling.","title":"Getting Started","text":"Use $PORT number terminal 1 (step 2).","code":"ssh -N -L $PORT:localhost:$PORT yourusername@biowulf.nih.gov login with nih password"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Usage.html","id":"open-rstudio-in-your-local-web-browser","dir":"Articles","previous_headings":"Use SCWorkflow Container","what":"5. Open RStudio in your local web browser","title":"Getting Started","text":"Open web browser go : Use $PORT number terminal 1 (step 2) open Rstudio browser connected biowulf container opened step 3.","code":"localhost:$PORT"},{"path":[]},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Usage.html","id":"log-into-helix","dir":"Articles","previous_headings":"Copy Files from Rstuido server to Helix","what":"1. Log into Helix","title":"Getting Started","text":"","code":"ssh username@helix.nih.gov"},{"path":[]},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Usage.html","id":"connect-to-rstuido-server-to-copy-files-to-biowulf","dir":"Articles","previous_headings":"Copy Files from Rstuido server to Helix","what":"3. connect to Rstuido Server to copy files to Biowulf","title":"Getting Started","text":"","code":"sftp username@ nciws-d2335-v.nci.nih.gov"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Usage.html","id":"copy-files-to-biowulf","dir":"Articles","previous_headings":"Copy Files from Rstuido server to Helix","what":"4. copy files to biowulf","title":"Getting Started","text":"Examples: files: Rscipts:","code":"mget -r * mget -r *R"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Usage.html","id":"install-package","dir":"Articles","previous_headings":"","what":"Install Package","title":"Getting Started","text":"general use SCWorkflow can installed Rlibrary","code":"# install.packages(\"remotes\") # remotes::install_github(\"NIDAP-Community/SCWorkflow\", dependencies = TRUE) library(SCWorkflow)"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Visualizations.html","id":"color-by-metadata","dir":"Articles","previous_headings":"","what":"Color by Metadata","title":"Visualizations","text":"Use Function color dimensionality reduction (TSNE & UMAP) different columns Metadata Table. can select one columns Metadata Table, column selected, function produce plot (t-SNE & UMAP) using data column color cells. function visualizes plot based selected metadata. Users can customize want visualize data, including type visualization used, size shape points, level transparency.","code":"FigOut=plotMetadata( object=Anno_SO$object, samples.to.include=c(\"PBS\",\"ENT\",\"NHSIL12\",\"Combo\",\"CD8dep\" ), metadata.to.plot=c('SCT_snn_res.0.4','Phase'), columns.to.summarize=NULL, summarization.cut.off = 5, reduction.type = \"umap\", use.cite.seq = FALSE, show.labels = FALSE, legend.text.size = 1, legend.position = \"right\", dot.size = 0.01 )"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Visualizations.html","id":"plot-3d-dimensionality-reduction","dir":"Articles","previous_headings":"","what":"Plot 3D Dimensionality Reduction","title":"Visualizations","text":"Function creates 3D interactive UMAP t-SNE plot. plot saved output folder HTML file can downloaded. function designed generate 3D t-SNE visualization based given Seurat Object. output includes interactive plot dataframe containing t-SNE coordinates. function accepts several parameters, Seurat Object, metadata column color, metadata column labeling, dot size plot, legend display option, colors color variable, filename saving plot, number principal components t-SNE calculations, option save plot widget HTML file. Initially, function executes t-SNE Seurat Object obtain 3D coordinates. Subsequently, constructs dataframe Plotly visualization, incorporating t-SNE coordinates, color variable, label variable. function generates 3D scatter plot using t-SNE coordinates. Finally, function saves plot embedded Plotly image HTML file. Methodology t-Distributed Stochastic Neighbor Embedding (t-SNE) sophisticated dimensionality reduction technique frequently employed visualization high-dimensional data [1]. effectively displays relationships individual cells based gene expression profiles. compute t-SNE, algorithm constructs probability distribution representing similarities data points high-dimensional space. Subsequently, generates lower-dimensional representation, typically two three dimensions, wherein distances data points reflect similarities high-dimensional space. algorithm employs iterative process adjust positions cells lower-dimensional space, aiming minimize discrepancies original high-dimensional similarities lower-dimensional space. approach enables algorithm capture global local structures within data, effectively revealing clusters groups similar cells.","code":"FigOut=tSNE3D( object=Anno_SO$object, color.variable='SCT_snn_res.0.4', label.variable='SCT_snn_res.0.4', dot.size = 4, legend = TRUE, colors = c(\"darkblue\",\"purple4\",\"green\",\"red\",\"darkcyan\", \"magenta2\",\"orange\",\"yellow\",\"black\"), filename = \"plot.html\", save.plot = FALSE, npcs = 15 )"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Visualizations.html","id":"color-by-genes","dir":"Articles","previous_headings":"","what":"Color by Genes","title":"Visualizations","text":"function visualizes gene expression intensities provided Genes across cells. gene found dataset, Log report . Otherwise, see one plot (TSNE UMAP, choice) per gene name provided. intensity red color relative expression gene cell. Final Potomac Compatible Version: v98. Sugarloaf V1: v103. [View Methodology function visualizes expression values chosen gene protein different samples. Users can customize want visualize data, including type visualization used, size shape points, level transparency.","code":"FigOut=colorByGene( object=Anno_SO$object, samples.to.include=c(\"PBS\",\"ENT\",\"NHSIL12\",\"Combo\",\"CD8dep\" ), gene='Itgam', reduction.type = \"umap\", number.of.rows = 0, return.seurat.object = FALSE, color = \"red\", point.size = 1, point.shape = 16, point.transparency = 0.5, use.cite.seq.data = FALSE, assay = \"SCT\")"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Visualizations.html","id":"violin-plot-from-seurat-object","dir":"Articles","previous_headings":"","what":"Violin Plot from Seurat Object","title":"Visualizations","text":"Function allows generation customized violin plots visualize transcriptional changes interactions single-cell RNA-seq data, providing insights cellular heterogeneity dynamics within dataset. Methodology Function organizes data based specific groups choose Seurat Object metadata. gathers information activity levels specific genes ’re interested . can, wish, change names order groups based column specify data. feature lets tailor analysis closely needs. code also function removes odd data points might distort results, adjusts data make easier visualize jittered points overlaying boxplot displaying quantile information. , code creates violin plots, allows see activity levels genes vary within group [2]. graph customizable, letting set various options limit values vertical axis, displaying individual data points, converting scales logarithmic, showing boxplots. can choose plot looks - whether ’s laid like grid, rows, customized labels.","code":"FigOut=violinPlot_mod( object=Anno_SO$object, assay='SCT', slot='scale.data', genes=c('Cd163','Cd38'), group='SCT_snn_res.0.4', facet_by = \"\", filter_outliers = F, outlier_low = 0.05, outlier_high = 0.95, jitter_points = TRUE, jitter_dot_size = 1 )"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Visualizations.html","id":"heatmap","dir":"Articles","previous_headings":"","what":"Heatmap","title":"Visualizations","text":"Function provides comprehensive method visualizing single cell transcript /protein expression data form heatmap. data obtained Seurat object, user can specify set genes analysis. Function allows optional ordering metadata (categorical) gene/protein expression levels. Visualization customization options include color choices heatmap, addition gene protein annotations, optional arrangement metadata. Key features include: - Options adding gene protein annotations, metadata arrangement, specifying row column names. - Customizable visualization settings including font sizes rows, columns, legend, row height, heatmap colors. - Ability trim outlier data, perform z-scaling rows, set row order. Function returns heatmap plot along underlying data used generate . also allows user set seed color generation specify outlier data parameters. function particularly useful exploratory data analysis preliminary data visualization single cell studies. Methodology method, two hierarchical clustering processes performed: one rows one columns dataset unless ordered annotations. Hierarchical clustering method cluster analysis aims build hierarchy clusters. result tree-like diagram called dendrogram, similar data points (e.g., genes samples) joined together clusters “branches”, based mathematical measure similarity Euclidean Manhattan distance. heatmap produced package called ComplexHeatmap [3] presents data matrix rows represent individual genes (proteins, metabolites, etc.) columns represent different samples (e.g., tissue samples, cells, experimental conditions). color position grid corresponds expression level gene particular sample, one color representing upregulation (higher expression), another representing downregulation (lower expression), usually neutral color representing change. allows easy visual interpretation patterns correlations data.","code":"FigOut=heatmapSC( object=Anno_SO$object, sample.names=c(\"PBS\",\"ENT\",\"NHSIL12\",\"Combo\",\"CD8dep\" ), metadata='SCT_snn_res.0.4', transcripts=c('Cd163','Cd38','Itgam','Cd4','Cd8a','Pdcd1','Ctla4'), use_assay = 'SCT', proteins = NULL, heatmap.color = \"Bu Yl Rd\", plot.title = \"Heatmap\", add.gene.or.protein = FALSE, protein.annotations = NULL, rna.annotations = NULL, arrange.by.metadata = TRUE, add.row.names = TRUE, add.column.names = FALSE, row.font = 5, col.font = 5, legend.font = 5, row.height = 15, set.seed = 6, scale.data = TRUE, trim.outliers = TRUE, trim.outliers.percentage = 0.01, order.heatmap.rows = FALSE, row.order = c() )"},{"path":"https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Visualizations.html","id":"dot-plot-of-genes-by-metadata","dir":"Articles","previous_headings":"","what":"Dot Plot of Genes by Metadata","title":"Visualizations","text":"function creates dot plot average gene expression values set genes cell subpopulations defined metadata annotation columns. input table contains single column genes (“Genes column”) single column category (“Category labels plot” column). values “Category labels plot” column match values provided metadata function (Metadata Category Plot). plot order genes (x-axis, left right) Categories (y-axis, top bottom) order appears input table. category entries omitted plotted. Dotplot size reflect percentage cells expressing gene color reflect average expression gene. table showing values plot (either percentage cells expressing gene, average expression scaled) returned, selected user. Methodology function creates dot plot visualization gene expression metadata given dataset. uses Seurat package create plots. size dot represents percentage cells expressing particular gene (frequency), color dot indicates average gene expression level. function ensures unique valid genes categories used. categories genes found dataset, appropriate warnings issued. plot drawn option reverse x y-axes reverse order metadata categories. colors can also customized. addition plot, function provides tabular format dot plot data, can useful analysis reporting. choice returning either tables representing percent cells expressing gene average expression level genes. function can useful exploratory data analysis visualizing differences gene expression across different conditions groups cells. Seurat package Dotplot Documentation https://satijalab.org/seurat/reference/dotplot Seurat Documentation t-SNE Analysis https://satijalab.org/seurat/reference/runtsne https://ggplot2.tidyverse.org/reference/ Complex Heatmap Reference Book https://jokergoo.github.io/ComplexHeatmap-reference/book/","code":"FigOut=dotPlotMet( object=Anno_SO$object, metadata='SCT_snn_res.0.4', cells=unique(Anno_SO$object$SCT_snn_res.0.4), markers=c('Itgam','Cd163','Cd38','Cd4','Cd8a','Pdcd1','Ctla4'), plot.reverse = FALSE, cell.reverse.sort = FALSE, dot.color = \"darkblue\" )"},{"path":"https://nidap-community.github.io/SCWorkflow/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Maggie Cam. Author. Thomas Meyer. Author, maintainer. Jing Bian. Author. Alexandra Michalowski. Author. Alexei Lobanov. Author. Philip Homan. Author. Rui . Author.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Cam M, Meyer T, Bian J, Michalowski , Lobanov , Homan P, R (2025). SCWorkflow: SCWorkflow NIDAP. R package version 1.0.2.","code":"@Manual{, title = {SCWorkflow: SCWorkflow from NIDAP}, author = {Maggie Cam and Thomas Meyer and Jing Bian and Alexandra Michalowski and Alexei Lobanov and Philip Homan and Rui He}, year = {2025}, note = {R package version 1.0.2}, }"},{"path":"https://nidap-community.github.io/SCWorkflow/index.html","id":null,"dir":"","previous_headings":"","what":"SCWorkflow from NIDAP","title":"SCWorkflow from NIDAP","text":"R package Single Cell analysis Single Cell Workflow streamlines analysis multimodal Single Cell RNA-Seq data produced 10x Genomics. can run docker container, biologists, user-friendly web-based interactive notebooks (NIDAP, Palantir Foundry). Much based Seurat workflow Bioconductor, supports CITE-Seq data. incorporates cell identification step (ModScore) utilizes module scores obtained Seurat also includes Harmony batch correction. documentation see detailed Docs Website Future Developments include addition support multiomics (TCR-Seq, ATAC-Seq) single cell data integration spatial transcriptomics data.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/annotateCellTypes.html","id":null,"dir":"Reference","previous_headings":"","what":"Annotating cell types using SingleR module — annotateCellTypes","title":"Annotating cell types using SingleR module — annotateCellTypes","text":"SingleR automatic annotation method single-cell RNA sequencing (scRNAseq) data (Aran et al. 2019). Given reference dataset samples (single-cell bulk) known labels, labels new cells test dataset based similarity reference.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/annotateCellTypes.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Annotating cell types using SingleR module — annotateCellTypes","text":"","code":"annotateCellTypes( object, species = \"Mouse\", reduction.type = \"umap\", legend.dot.size = 2, do.finetuning = FALSE, local.celldex = NULL, use.clusters = NULL )"},{"path":"https://nidap-community.github.io/SCWorkflow/reference/annotateCellTypes.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Annotating cell types using SingleR module — annotateCellTypes","text":"object Object class Seurat (combined Seurat Object PC reduction performed) species species samples (\"Human\" \"Mouse\"). Default \"Mouse\" reduction.type Select kind clustering visualization like use visualize cell type results (\"umap\", \"tsne\", \"pca\") legend.dot.size size colored dots chart legend. Default 2 .finetuning Performs SingleR fine-tuning function. Default FALSE local.celldex Provide local copy CellDex library. Default NULL use.clusters Provide cluster identities cell. Default NULL","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/annotateCellTypes.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Annotating cell types using SingleR module — annotateCellTypes","text":"Seurat object additional metadata","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/annotateCellTypes.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Annotating cell types using SingleR module — annotateCellTypes","text":"function Step 5 basic Single-Cell RNA-seq workflow. starting point downstream visualization, subsetting, analysis. takes combined seurat object input, one created Combined&Renormalized function end Filter&QC Path","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/appendMetadataToSeuratObject.html","id":null,"dir":"Reference","previous_headings":"","what":"Append Metadata to Seurat Object. — appendMetadataToSeuratObject","title":"Append Metadata to Seurat Object. — appendMetadataToSeuratObject","text":"template appends sample metadata input table Seurat object, creating new metadata columns labeling cells sample new metadata values.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/appendMetadataToSeuratObject.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Append Metadata to Seurat Object. — appendMetadataToSeuratObject","text":"","code":"appendMetadataToSeuratObject(object, metadata.to.append, sample.name.column)"},{"path":"https://nidap-community.github.io/SCWorkflow/reference/appendMetadataToSeuratObject.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Append Metadata to Seurat Object. — appendMetadataToSeuratObject","text":"object input Seurat Object list Seurat Objects wish add metadata. metadata..append table sample metadata want append already-existing metadata within input Seurat Object(s). sample.name.column column input metadata..append table contains sample names matching orig.idents input object(s).","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/appendMetadataToSeuratObject.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Append Metadata to Seurat Object. — appendMetadataToSeuratObject","text":"Function returns Seurat Object Objects additional metadata columns containing appended metadata now annotated cell sample name (orig.ident).","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/appendMetadataToSeuratObject.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Append Metadata to Seurat Object. — appendMetadataToSeuratObject","text":"template appends sample metadata input table Seurat object, creating new metadata columns labeling cells sample new metadata values.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/colorByGene.html","id":null,"dir":"Reference","previous_headings":"","what":"Visualize gene expression for provided Genes across your cells as a heatmap — colorByGene","title":"Visualize gene expression for provided Genes across your cells as a heatmap — colorByGene","text":"see one plot (TSNE UMAP, choice) per gene name provided. intensity red color relative expression gene cell","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/colorByGene.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Visualize gene expression for provided Genes across your cells as a heatmap — colorByGene","text":"","code":"colorByGene( object, samples.to.include, gene, reduction.type = \"umap\", number.of.rows = 0, return.seurat.object = FALSE, color = \"red\", point.size = 1, point.shape = 16, point.transparency = 0.5, use.cite.seq.data = FALSE, assay = \"SCT\" )"},{"path":"https://nidap-community.github.io/SCWorkflow/reference/colorByGene.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Visualize gene expression for provided Genes across your cells as a heatmap — colorByGene","text":"object Object class Seurat samples..include Samples included analysis gene Genes like visualize reduction.type Select kind clustering visualization like use visualize cell type results (\"umap\", \"tsne\", \"pca\"). Default \"umap\" number..rows number rows want arrange plots return.seurat.object Set FALSE want geneset (Seurat object) returned color color want use heatmap (default \"red\") point.size size points representing cell visualization. Default 1 point.shape code point shape (R \"pch\" argument). Default 16 point.transparency Set transparency. Default 0.5 use.cite.seq.data TRUE like plot Antibody clusters CITEseq instead scRNA. assay Select Assay Plot (default SCT)","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/colorByGene.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Visualize gene expression for provided Genes across your cells as a heatmap — colorByGene","text":"Seurat object additional metadata gene table plot","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/colorByGene.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Visualize gene expression for provided Genes across your cells as a heatmap — colorByGene","text":"function must run downstream Sample Names function, well provided combined Seurat Object one produced SingleR Cell Annotation function","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/colorByMarkerTable.html","id":null,"dir":"Reference","previous_headings":"","what":"Color by Gene List — colorByMarkerTable","title":"Color by Gene List — colorByMarkerTable","text":"Returns panel reduction plots colored marker expression","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/colorByMarkerTable.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Color by Gene List — colorByMarkerTable","text":"","code":"colorByMarkerTable( object, samples.subset, samples.to.display, manual.genes = c(), marker.table, cells.of.interest, protein.presence = FALSE, assay = \"SCT\", slot = \"scale.data\", reduction.type = \"umap\", point.transparency = 0.5, point.shape = 16, cite.seq = FALSE )"},{"path":"https://nidap-community.github.io/SCWorkflow/reference/colorByMarkerTable.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Color by Gene List — colorByMarkerTable","text":"object Seurat-class object samples.subset List samples subset data samples..display List samples depict dimension plot, samples list colored gray background marker.table Table marker genes celltype (column names table), append \"_prot\" \"_neg\" proteins negative markers cells..interest Celltypes geneset_dataframe screen protein.presence Set TRUE protein markers used assay Assay extract gene expression data (Default: \"SCT\") reduction.type Choose among tsne, umap, pca (Default: \"umap\") point.transparency Set lower values see points dimension plot (Default: 0.5) point.shape Change shape points visualization (Default: 16) cite.seq Set TRUE use CITE-seq embedding dimension reduction","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/colorByMarkerTable.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Color by Gene List — colorByMarkerTable","text":"arranged grob dimension reduction plots colored individual marker expression","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/colorByMarkerTable.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Color by Gene List — colorByMarkerTable","text":"Takes gene table inputted user, displays panel tsne, umap, pca colored marker expression. panel organized similar format gene table, omission genes found data","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/combineNormalize.html","id":null,"dir":"Reference","previous_headings":"","what":"Combine & Normalize — combineNormalize","title":"Combine & Normalize — combineNormalize","text":"Scales Normalizes data, Combines samples, runs Dimensional Reduction, Clusters, returns combined Seurat Object.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/combineNormalize.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Combine & Normalize — combineNormalize","text":"","code":"combineNormalize( object, npcs = 30, SCT.level = \"Merged\", vars.to.regress = NULL, nfeatures = 2000, low.cut = 0.1, high.cut = 8, low.cut.disp = 1, high.cut.disp = 1e+05, selection.method = \"vst\", only.var.genes = FALSE, draw.umap = TRUE, draw.tsne = TRUE, seed.for.pca = 42, seed.for.tsne = 1, seed.for.umap = 42, clust.res.low = 0.2, clust.res.high = 1.2, clust.res.bin = 0.2, methods.pca = \"none\", var.threshold = 0.1, pca.reg.plot = FALSE, jackstraw = FALSE, jackstraw.dims = 5, exclude.sample = NULL, cell.count.limit = 35000, reduce.so = FALSE, project.name = \"scRNAProject\", cell.hashing.data = FALSE )"},{"path":"https://nidap-community.github.io/SCWorkflow/reference/combineNormalize.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Combine & Normalize — combineNormalize","text":"object list seurat objects sample. npcs Select number principal components analysis. Please see elbow plot previous template figure number PCs explains variance cut-. example, elbow plot point (15,0.02), means 15 PCs encapsulate 98% variance data.(Default: 30) SCT.level Select stage apply SCtransform nomalization. Merged: Merge samples apply SCTransfrom merged object. Sample: Apply SCTranform individual samples merge single Seurat object. (Default: \"Merged\") vars..regress Subtract (‘regress ’) source heterogeneity data. example, Subtract mitochondrial effects, input \"percent.mt.\" Options: percent.mt, nCount.RNA, S.Score, G2M.Score, CC.Difference. (Default: NULL) nfeatures Number variable features. (Default: 2000) low.cut Set low cutoff calculate feature means Seurat::FindVariableFeatures. (Default: 0.1) high.cut Set high cutoff calculate feature means Seurat::FindVariableFeatures. (Default: 8) low.cut.disp Set low cutoff calculate feature dispersions Seurat::FindVariableFeatures.(Default: 1) high.cut.disp Set high cutoff calculate feature dispersions Seurat::FindVariableFeatures. (Default: 100000) selection.method Method choose top variable features. Options: vst, mean.var.plot, dispersion. (Default: 'vst') .var.genes dataset larger ~40k filtered cells, set TRUE. TRUE, variable genes available downstream analysis. dataset larger number cells set \"Conserve Memory Max Cell Limit\" \"Variable Genes\" automatically set TRUE. (Default: FALSE) draw.umap TRUE, draw UMAP plot. (Default: TRUE) draw.tsne TRUE, draw TSNE plot. (Default: TRUE) seed..pca Set random seed PCA calculation. (Default: 42) seed..tsne Set random seed TSNE calculation. (Default: 1) seed..umap Set random seed UMAP calculation. (Default: 42) clust.res.low Select minimum resolution clustering plots. lower set , FEWER clusters generated. (Default: 0.2) clust.res.high Select maximum resolution clustering. higher set number, clusters produced. (Default: 1.2) clust.res.bin Select bins cluster plots. example, input 0.2 bin, low/high resolution ranges 0.2 0.6, template produce cluster plots resolutions 0.2, 0.4 0.6. (Default: 0.2) methods.pca Methods available: Marchenko-Pastur: use eigenvalue null upper bound URD, Elbow: Find threshold percent change variation consecutive PCs less X% (set var.threshold). none selected (regardless selections) plot generated. (Default: 'none') var.threshold Elbow method, set percent change threshold variation consecutive PCs. (Default: 0.1) pca.reg.plot Opt visualize effect regression variables PCA plot. plot create PCA plots without regression variables applied can used help determine regression necessary properly normalize data. (Default: FALSE) jackstraw Opt visualize data Jackstraw plot. Jackstraw plot can add description elbow plot compute intensive process may suitable larger datasets. (Default: FALSE) jackstraw.dims Recommended max 10.(Default: 5) exclude.sample Exclude unwanted samples merge step. Include sample names removed. want exclude several samples, separate sample number comma (e.g. sample1,sample2,sample3,sample4). (Default: NULL) cell.count.limit total number cell exceeds limit conserve memory option SCTransform used return Variable Genes. (Default: 35000) reduce.Remove additional assays input Seurat Objects except original RNA Assay. option used input Seurat Object created outside NIDAP pipeline. (Default: FALSE) project.name Add project name Seurat object metadata. (Default: 'scRNAProject') cell.hashing.data Set \"TRUE\" using cell-hashed data. (Default: FALSE)","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/combineNormalize.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Combine & Normalize — combineNormalize","text":"Seurat Objects QC plots","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/combineNormalize.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Combine & Normalize — combineNormalize","text":"Step 3 basic Single-Cell RNA-seq workflow. template summarize multi-dimensionality data set \"principal components\" allow easier analysis.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/degGeneExpressionMarkers.html","id":null,"dir":"Reference","previous_headings":"","what":"DEG (Gene Expression Markers) — degGeneExpressionMarkers","title":"DEG (Gene Expression Markers) — degGeneExpressionMarkers","text":"function performs DEG (differential expression genes) analysis merged Seurat object identify expression markers different groups cells (contrasts).","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/degGeneExpressionMarkers.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"DEG (Gene Expression Markers) — degGeneExpressionMarkers","text":"","code":"degGeneExpressionMarkers( object, samples, contrasts, parameter.to.test = \"orig_ident\", test.to.use = \"MAST\", log.fc.threshold = 0.25, use.spark = FALSE, assay.to.use = \"SCT\" )"},{"path":"https://nidap-community.github.io/SCWorkflow/reference/degGeneExpressionMarkers.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"DEG (Gene Expression Markers) — degGeneExpressionMarkers","text":"object Seurat-class object samples Samples included analysis contrasts Contrasts \"-B\" format parameter..test Select metadata column like use perform DEG analysis construct contrasts . Default \"orig_ident\" test..use kind algorithm like use perform DEG analysis. Default MAST algorithm (wilcox,bimod,roc,t,negbinom,poisson,LR,MAST,DESeq2). log.fc.threshold minimum log fold-change contrasts like analyze. Default 0.25 use.spark Opt use Spark parallelize computations. Default FALSE assay..use assay use DEG analysis. Default SCT, can use linearly scaled data selecting RNA instead","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/degGeneExpressionMarkers.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"DEG (Gene Expression Markers) — degGeneExpressionMarkers","text":"dataframe DEG.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/degGeneExpressionMarkers.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"DEG (Gene Expression Markers) — degGeneExpressionMarkers","text":"recommended input merged Seurat object SingleR annotations, along associated sample names metadata","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/dotPlotMet.html","id":null,"dir":"Reference","previous_headings":"","what":"Dotplot of Gene Expression by Metadata — dotPlotMet","title":"Dotplot of Gene Expression by Metadata — dotPlotMet","text":"function uses Dotplot function Seurat plots average gene expression values percent expressed set genes.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/dotPlotMet.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Dotplot of Gene Expression by Metadata — dotPlotMet","text":"","code":"dotPlotMet( object, metadata, cells, markers, plot.reverse = FALSE, cell.reverse.sort = FALSE, dot.color = \"darkblue\" )"},{"path":"https://nidap-community.github.io/SCWorkflow/reference/dotPlotMet.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Dotplot of Gene Expression by Metadata — dotPlotMet","text":"object Seurat Object metadata Metadata column Seurat Object plot cells Vector metadata category factors plot found metadata column. Order plotting follow exact order entered. markers Vector genes plot. Order plotting follow exact order entered plot.reverse TRUE, set metadata categories x-axis genes y-axis (default FALSE) cell.reverse.sort TRUE, Reverse plot order metadata category factors (default FALSE) dot.color Dot color (default \"dark blue\")","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/dotPlotMet.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Dotplot of Gene Expression by Metadata — dotPlotMet","text":"Dotplot markers cell types.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/dotPlotMet.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Dotplot of Gene Expression by Metadata — dotPlotMet","text":"method provides dotplot showing percent frequency gene-positive cells size dot degree expression color dot.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/dualLabeling.html","id":null,"dir":"Reference","previous_headings":"","what":"Plot coexpression of 2 markers using transcript and/or protein expression values — dualLabeling","title":"Plot coexpression of 2 markers using transcript and/or protein expression values — dualLabeling","text":"method provides visualization coexpression 2 genes (proteins) additional methods filtering cells gene expression values thresholds set one markers. method allows filtering (optional) Seurat object using manually set expression thresholds.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/dualLabeling.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Plot coexpression of 2 markers using transcript and/or protein expression values — dualLabeling","text":"","code":"dualLabeling( object, samples, marker.1, marker.2, marker.1.type = \"SCT\", marker.2.type = \"SCT\", data.reduction = \"both\", point.size = 0.5, point.shape = 16, point.transparency = 0.5, add.marker.thresholds = TRUE, marker.1.threshold = 0.5, marker.2.threshold = 0.5, filter.data = TRUE, marker.1.filter.direction = \"greater than\", marker.2.filter.direction = \"greater than\", apply.filter.1 = TRUE, apply.filter.2 = TRUE, filter.condition = TRUE, parameter.name = \"My_CoExp\", trim.marker.1 = FALSE, trim.marker.2 = FALSE, pre.scale.trim = 0.99, display.unscaled.values = FALSE )"},{"path":"https://nidap-community.github.io/SCWorkflow/reference/dualLabeling.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Plot coexpression of 2 markers using transcript and/or protein expression values — dualLabeling","text":"object Seurat-class object samples Samples included analysis marker.1 First gene/marker coexpression analysis marker.2 Second gene/marker coexpression analysis marker.1.type Slot use first marker. Choices \"SCT\", \"protein\",\"HTO\" (default \"SCT\") marker.2.type Slot use second marker. Choices \"SCT\", \"protein\",\"HTO\" (default \"SCT\") data.reduction Dimension Reduction method use image. Options \"umap\" \"tsne\" (default \"umap\") point.size Point size image (default 0.5) point.shape Point shape image (default 16) point.transparency Point transparency image (default 0.5) add.marker.thresholds Add marker thresholds plot (default FALSE) marker.1.threshold Threshold set first marker (default 0.5) marker.2.threshold Threshold set second marker (default 0.5) filter.data Add new parameter column metadata annotating marker thresholds applied (default TRUE) apply.filter.1 TRUE, apply first filter (default TRUE) apply.filter.2 TRUE, apply second filter (default TRUE) filter.condition TRUE, apply filters 1 2 take intersection. FALSE, apply filters take union. parameter.name Name metadata column new marker filters (Default \"Marker\") trim.marker.1 Trim top bottom percentile marker 1 signal pre-scale trim values () remove extremely low high values (Default TRUE) trim.marker.2 Trim top bottom percentile marker 2 signal pre-scale trim values () remove extremely low high values (Default TRUE) pre.scale.trim Set trimming percentile values (Defalut 0.99) display.unscaled.values Set TRUE want view unscaled gene/protein expression values (Default FALSE) M1.filter.direction Annotate cells gene expression levels marker 1 using marker 1 threshold. Choices \"greater \" \"less \" (default \"greater \") M2.filter.direction Annotate cells gene expression levels marker 2 using marker 2 threshold. Choices \"greater \" \"less \" (default \"greater \") density.heatmap Creates additional heatmap showing density distribution cells. (Default FALSE)","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/dualLabeling.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Plot coexpression of 2 markers using transcript and/or protein expression values — dualLabeling","text":"seurat object optional additional metadata cells positive negative gene markers, coexpression plot contingency table showing sum cells filtered.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/filterQC.html","id":null,"dir":"Reference","previous_headings":"","what":"Filter & QC Samples — filterQC","title":"Filter & QC Samples — filterQC","text":"Filters cells Genes sample generates QC Plots evaluate data filtering.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/filterQC.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Filter & QC Samples — filterQC","text":"","code":"filterQC( object, min.cells = 20, filter.vdj.genes = F, nfeature.limits = c(NA, NA), mad.nfeature.limits = c(5, 5), ncounts.limits = c(NA, NA), mad.ncounts.limits = c(5, 5), mitoch.limits = c(NA, 25), mad.mitoch.limits = c(NA, 3), complexity.limits = c(NA, NA), mad.complexity.limits = c(5, NA), topNgenes.limits = c(NA, NA), mad.topNgenes.limits = c(5, 5), n.topgnes = 20, do.doublets.fitler = T, plot.outliers = \"None\", group.column = NA, nfeatures = 2000, low.cut = 0.1, high.cut = 8, low.cut.disp = 1, high.cut.disp = 1e+05, selection.method = \"vst\", npcs = 30, vars_to_regress = NULL, seed.for.PCA = 42, seed.for.TSNE = 1, seed.for.UMAP = 42 )"},{"path":"https://nidap-community.github.io/SCWorkflow/reference/filterQC.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Filter & QC Samples — filterQC","text":"object list seurat objects sample. min.cells Filter genes found less number cells. E.g. Setting 20 remove genes found fewer 3 cells sample. (Default: 20) filter.vdj.genes FALSE remove VDJ genes scRNA transcriptome assay. prevent clustering bias T-cells clonotype. recommended also TCR-seq. (Default: FALSE) nfeature.limits Filter cells number genes found cell exceed selected lower upper limits. Usage c(lower limit, Upper Limit). E.g. setting c(200,1000) remove cells fewer 200 genes 1000 genes sample. (Default: c(NA, NA)) mad.nfeature.limits Set filter limits based many Median Absolute Deviations outlier cell . Calculated median gene number cells sample. Usage c(lower limit, Upper Limit) E.g. setting c(3,5) remove cells 3 absolute deviations less median 5 absolute deviations greater median. (Default: c(5,5)) ncounts.limits Filter cells total number molecules (umi) detected within cell exceed selected limits. Usage c(lower limit, Upper Limit). E.g. setting c(200,100000) remove cells fewer 200 greater 100000 molecules. (Default: c(NA, NA)) mad.ncounts.limits Set filter limits based many Median Absolute Deviations outlier cell . Calculated median number molecules cells sample. Usage c(lower limit, Upper Limit) E.g. setting c(3,5) remove cells 3 absolute deviations less median 5 absolute deviations greater median. (Default: c(5,5)) mitoch.limits Filter cells whose proportion mitochondrial genes exceed selected lower upper limits. Usage c(lower limit, Upper Limit). E.g. setting c(0,8) set lower limit removes cells 8% mitochondrial RNA. (Default: c(NA,25)) mad.mitoch.limits Set filter limits based many Median Absolute Deviations outlier cell . Calculated Median percentage mitochondrial RNA cells sample. Usage c(lower limit, Upper Limit). E.g. setting c(NA,3) set lower limit remove cells 3 absolute deviations greater median. (Default: c(NA,3)) complexity.limits Complexity represents Number genes detected per UMI. genes detected per UMI, complex data. Filter cells whose Complexity exceed selected lower upper limits. Cells high number UMIs low number genes dying cells, also represent population low complexity cell type (.e red blood cells). suggest set lower limit 0.8 samples suspected RBC contamination. Usage c(lower limit, Upper Limit). E.g. setting c(0.8,0) set upper limit removes cells complexity less 0.8. (Default: c(NA,NA)) mad.complexity.limits Set filter limits based many Median Absolute Deviations outlier cell . Calculated Median complexity cells sample. Usage c(lower limit, Upper Limit). E.g. setting c(5,NA) set upper limit remove cells 5 absolute deviations less median. (Default: c(5,NA)) topNgenes.limits Filter Cells based percentage total counts top N highly expressed genes. Outlier cells high percentage counts just genes removed. considerations outlined \"complexity.limits\" taken filter. Usage c(lower limit, Upper Limit). E.g. setting c(NA,50) set lower limit remove cells greater 50% reads top N genes. (Default: c(NA,NA)) n.topgnes Select number top highly expressed genes used calculate percentage reads found genes. E.g. value 20 calculates percentage reads found top 20 highly expressed Genes. (Default: 20) .doublets.fitler Use scDblFinder identify remove doublet cells. Doublets defined two cells sequenced cellular barcode, example, captured droplet. (Default: TRUE) mad.topNgenes.limitsSet Filter limits based many Median Absolute Deviations outlier cell . Calculated Median percentage counts top N Genes. Usage c(lower limit, Upper Limit). E.g. setting c(5,5) remove cells 5 absolute deviations greater 5 absolute deviations less median percentage. (Default: c(5,5))","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/filterQC.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Filter & QC Samples — filterQC","text":"Seurat Object QC plots","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/filterQC.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Filter & QC Samples — filterQC","text":"Step 2 basic Single-Cell RNA-seq workflow. Multiple cell gene filters can selected remove poor quality data noise. Workflows can use downstream Seurat Object. tool typically second step Single Cell Workflow.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/filterSeuratObjectByMetadata.html","id":null,"dir":"Reference","previous_headings":"","what":"Filter Seurat Object by Metadata — filterSeuratObjectByMetadata","title":"Filter Seurat Object by Metadata — filterSeuratObjectByMetadata","text":"Filter subset Seurat object based metadata column","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/filterSeuratObjectByMetadata.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Filter Seurat Object by Metadata — filterSeuratObjectByMetadata","text":"","code":"filterSeuratObjectByMetadata( object, samples.to.include, sample.name, category.to.filter, values.to.filter, keep.or.remove = TRUE, greater.less.than = \"greater than\", seed = 10, cut.off = 0.5, legend.position = \"top\", reduction = \"umap\", plot.as.interactive.plot = FALSE, legend.symbol.size = 2, colors = c(\"aquamarine3\", \"salmon1\", \"lightskyblue3\", \"plum3\", \"darkolivegreen3\", \"goldenrod1\", \"burlywood2\", \"gray70\", \"firebrick2\", \"steelblue\", \"palegreen4\", \"orchid4\", \"darkorange1\", \"yellow\", \"sienna\", \"palevioletred1\", \"gray60\", \"cyan4\", \"darkorange3\", \"mediumpurple3\", \"violetred2\", \"olivedrab\", \"darkgoldenrod2\", \"darkgoldenrod\", \"gray40\", \"palegreen3\", \"thistle3\", \"khaki1\", \"deeppink2\", \"chocolate3\", \"paleturquoise3\", \"wheat1\", \"lightsteelblue\", \"salmon\", \"sandybrown\", \"darkolivegreen2\", \"thistle2\", \"gray85\", \"orchid3\", \"darkseagreen1\", \"lightgoldenrod1\", \"lightskyblue2\", \"dodgerblue3\", \"darkseagreen3\", \"forestgreen\", \"lightpink2\", \"mediumpurple4\", \"lightpink1\", \"thistle\", \"navajowhite\", \"lemonchiffon\", \"bisque2\", \"mistyrose\", \"gray95\", \"lightcyan3\", \"peachpuff2\", \"lightsteelblue2\", \"lightyellow2\", \"moccasin\", \"gray80\", \"antiquewhite2\", \"lightgrey\"), dot.size = 0.1, number.of.legend.columns = 1, dot.size.highlighted.cells = 0.5, use.cite.seq.data = FALSE )"},{"path":"https://nidap-community.github.io/SCWorkflow/reference/filterSeuratObjectByMetadata.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Filter Seurat Object by Metadata — filterSeuratObjectByMetadata","text":"object dataset containing SingleR annotated/merged seurat object samples..include Select samples include sample.name Sample Name Column category..filter kind metadata want subset . one column Metadata table values..filter One values want filter keep..remove TRUE filter selected values, FALSE filter selected values. Default TRUE greater.less.Decide want keep cells threshold. Default \"greater \" seed Set seed colors cut.cut-want use greater /less filter. Default os 0.5 legend.position Select \"none\" legend takes much space plot. Default \"top\" reduction kind clustering visualization like use summary plot (umap, tsne, pca, protein_tsne, protein_umap, protein_pca). Default \"umap\" plot..interactive.plot TRUE interactive, FALSE static legend.symbol.size legend symbol size. Default 2 colors User-selected colors palette 62 unique colors ColorBrewer. dot.size Size dots TSNE/UMAP projection plot. Default 0.1 number..legend.columns Default 1. legend long, provide legend columns dot.size.highlighted.cells Dot size cells -filter plot highlighted. Default 0.5 use.cite.seq.data TRUE like plot Antibody clusters CITEseq instead scRNA.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/filterSeuratObjectByMetadata.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Filter Seurat Object by Metadata — filterSeuratObjectByMetadata","text":"subset Seurat object","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/filterSeuratObjectByMetadata.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Filter Seurat Object by Metadata — filterSeuratObjectByMetadata","text":"downstream template loaded Step 5 pipeline (SingleR Annotations Seurat Object)","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/heatmapSC.html","id":null,"dir":"Reference","previous_headings":"","what":"Heatmap of transcript and/or protein expression values in single cells — heatmapSC","title":"Heatmap of transcript and/or protein expression values in single cells — heatmapSC","text":"method provides heatmap single cell data Seurat object given set genes optionally orders various metadata /gene protein expression levels. Method based ComplexHeatmap::pheatmap","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/heatmapSC.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Heatmap of transcript and/or protein expression values in single cells — heatmapSC","text":"","code":"heatmapSC( object, sample.names, metadata, transcripts, use_assay = \"SCT\", proteins = NULL, heatmap.color = \"Bu Yl Rd\", plot.title = \"Heatmap\", add.gene.or.protein = FALSE, protein.annotations = NULL, rna.annotations = NULL, arrange.by.metadata = TRUE, add.row.names = TRUE, add.column.names = FALSE, row.font = 5, col.font = 5, legend.font = 5, row.height = 15, set.seed = 6, scale.data = TRUE, trim.outliers = TRUE, trim.outliers.percentage = 0.01, order.heatmap.rows = FALSE, row.order = c() )"},{"path":"https://nidap-community.github.io/SCWorkflow/reference/heatmapSC.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Heatmap of transcript and/or protein expression values in single cells — heatmapSC","text":"object Seurat-class object sample.names Sample names metadata Metadata column plot transcripts Transcripts plot proteins Proteins plot (default NULL) heatmap.color Color heatmap. Choices \"Cyan Mustard\", \"Blue Red\", \"Red Vanilla\", \"Violet Pink\", \"Bu Yl Rd\", \"Bu Wt Rd\" (default \"Bu Yl Rd\") plot.title Title plot (default \"Heatmap\") add.gene..protein Add Gene protein annotations (default FALSE) protein.annotations Protein annotations add (defulat NULL) rna.annotations Gene annotations add (default NULL) arrange..metadata Arrange metadata (default TRUE) add.row.names Add row names (default TRUE) add.column.names Add column names (default FALSE) row.font Font size rows (default 5) col.font Font size columns (default 5) legend.font Font size legend (default 5) row.height Height row. NA, adjust plot size (default 15) set.seed Seed colors (default 6) scale.data Perform z-scaling rows (default TRUE) trim.outliers Remove outlier data (default TRUE) trim.outliers.percentage Set outlier percentage (default 0.01) order.heatmap.rows Order heatmap rows (default FALSE) row.order Gene vector set row order. NULL, use cluster order (default NULL)","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/heatmapSC.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Heatmap of transcript and/or protein expression values in single cells — heatmapSC","text":"function returns heatmap plot data underlying heatmap.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/modScore.html","id":null,"dir":"Reference","previous_headings":"","what":"Compute ModScore — modScore","title":"Compute ModScore — modScore","text":"Returns Seurat-class object metadata containing ModuleScores Likely_CellType calls","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/modScore.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compute ModScore — modScore","text":"","code":"modScore( object, marker.table, use_columns, ms_threshold, general.class, multi.lvl = FALSE, lvl.df = NULL, reduction = \"tsne\", nbins = 10, gradient.ft.size = 6, violin.ft.size = 6, step.size = 0.1 )"},{"path":"https://nidap-community.github.io/SCWorkflow/reference/modScore.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compute ModScore — modScore","text":"object Seurat-class object marker.table table lists gene/protein markers categories cells want detect. table formatted cell type(s) column names, marker(s) entries column. Requires SCT@data present within Seurat Object use_columns Select specific columns within Marker Table analyze. Markers unselected columns included. ms_threshold Allow user-specified module score thresholds. Provide one threshold Celltype included \"use_columns\" parameter. Celltype, provide Celltype name, space, type threshold Celltype. threshold must number 0.0 1.0. E.g. \"Tcells 0.2\", \"Macrophages 0.37\". best results, follow steps: (1) Set thresholds 0.0 preliminary view data. (2) Use resulting visualizations estimate correct thresholds Celltype. (3) Adjust thresholds based saw visualizations. (4) Re-run template new thresholds. (5) Review visualizations repeat Steps 1-5 think thresholds can improved. general.class Select classes (.e. columns) Marker Table represent General Classes. general class class subtype another class. multi.lvl set True multiple subclasses cells like classify. Note: requires manual entry table columns specifying levels comparisons. column table represent one level subclass within General Classes. value within column two Class names separated dash (-) showing General--SubClass relationship. Example: classify T-cells attempt classify T-cells either CD8 CD4 T-cells, write column named \"Level_1\", add \"T_cell-CD8_T\" \"T_cell-CD4_T\" column. Note example, \"T_cell\" General Class \"CD8_T\" \"CD4_T\" . lvl.df Dataframe containing levels information well parent-children designation (E.g. Tcells-CD4). Required Multi Level Classification turned .#' reduction Choose among tsne, umap, pca (Default: tsne) nbins Number bins storing control features analyzing average expression (Default: 10) gradient.ft.size Set size axis labels gradient density plot ModuleScore distribution (Default: 6) violin.ft.size Set size axis labels violin plot ModuleScore distribution (Default: 6) step.size Set step size distribution plots (Default: 0.1)","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/modScore.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Compute ModScore — modScore","text":"List containing annotated dimension plot ModuleScore distribution cell marker gene, Seurat Object cell classification metadata","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/modScore.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Compute ModScore — modScore","text":"Analyzed features binned based averaged expression; control features randomly selected bin.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/nameClusters.html","id":null,"dir":"Reference","previous_headings":"","what":"Update metadata slot of Seurat-class object with custom labels and provide plot with percentage of cell types — nameClusters","title":"Update metadata slot of Seurat-class object with custom labels and provide plot with percentage of cell types — nameClusters","text":"Maps custom cluster names Seurat Object cluster IDs adds cluster names new metadata column called Clusternames. Provides dotplot percentage cell types within cluster.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/nameClusters.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Update metadata slot of Seurat-class object with custom labels and provide plot with percentage of cell types — nameClusters","text":"","code":"nameClusters( object, cluster.identities.table, cluster.numbers, cluster.names, cluster.column, labels.column, order.clusters.by = NULL, order.celltypes.by = NULL, interactive = FALSE )"},{"path":"https://nidap-community.github.io/SCWorkflow/reference/nameClusters.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Update metadata slot of Seurat-class object with custom labels and provide plot with percentage of cell types — nameClusters","text":"object Seurat-class object cluster IDs column cell type column present cluster.numbers Vector containing cluster numbers match (numeric) cluster ID's cluster.column Seurat Object metadata cluster.names Vector containing custom cluster labels cluster.column Column name containing cluster ID metadata slot object labels.column Column name containing labels (usually cell type) metadata slot object order.clusters.Vector containing order clusters graph. Can contain subset cluster numbers plot match least values cluster.column. NULL, use default order (default NULL) order.celltypes.Vector containing order cell types graph. Can contain subset cell types plot match least values labels.column. NULL, use default order (default NULL) interactive TRUE, draw plotly plot (default FALSE)","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/nameClusters.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Update metadata slot of Seurat-class object with custom labels and provide plot with percentage of cell types — nameClusters","text":"Returns Seurat-class object updated meta.data slot containing custom cluster annotation plot","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/object.html","id":null,"dir":"Reference","previous_headings":"","what":"Harmony Batch Correction from Singular Value Decomposed PCA — object","title":"Harmony Batch Correction from Singular Value Decomposed PCA — object","text":"Adjusts cell embeddings gene expression data account variations due user specified variable","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/object.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Harmony Batch Correction from Singular Value Decomposed PCA — object","text":"","code":"object"},{"path":"https://nidap-community.github.io/SCWorkflow/reference/object.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Harmony Batch Correction from Singular Value Decomposed PCA — object","text":"object class Seurat 3000 rows 2000 columns.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/object.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Harmony Batch Correction from Singular Value Decomposed PCA — object","text":"seurat_object Seurat-class object nvar Number variable genes subset gene expression data (Default: 2000) genes..add Add genes might found among variably expressed genes group..var variable accounted running batch correction npc Number principal components use running Harmony (Default: 20)","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/object.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Harmony Batch Correction from Singular Value Decomposed PCA — object","text":"list: adj.object harmony-adjusted gene expression (SCT slot) adj.tsne: harmonized tSNE plot","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/object.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Harmony Batch Correction from Singular Value Decomposed PCA — object","text":"Runs singular value decomposition pearson residuals (SCT scale.data) obtain PCA embeddings. Performs harmony decomposed embedding adjusts decomposed gene expression values harmonized embedding.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/palantir_api_call.html","id":null,"dir":"Reference","previous_headings":"","what":"palantir_api_call Utility function from 3D tSNE Coordinate Template from v 75#' — palantir_api_call","title":"palantir_api_call Utility function from 3D tSNE Coordinate Template from v 75#' — palantir_api_call","text":"palantir_api_call Utility function 3D tSNE Coordinate Template v 75#'","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/palantir_api_call.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"palantir_api_call Utility function from 3D tSNE Coordinate Template from v 75#' — palantir_api_call","text":"","code":"palantir_api_call(service, path, token, data, method)"},{"path":"https://nidap-community.github.io/SCWorkflow/reference/palantir_api_call.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"palantir_api_call Utility function from 3D tSNE Coordinate Template from v 75#' — palantir_api_call","text":"service NIDAP API service call path path NIDAP API service token NIDAP user toekn. data Data uploaded NIDAP API calls. method Method used, including POST, GET, DELETE","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/palantir_api_call.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"palantir_api_call Utility function from 3D tSNE Coordinate Template from v 75#' — palantir_api_call","text":"return content API calls","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/plotMetadata.html","id":null,"dir":"Reference","previous_headings":"","what":"Plotting (i.e. coloring with) different columns of your Metadata Table — plotMetadata","title":"Plotting (i.e. coloring with) different columns of your Metadata Table — plotMetadata","text":"column selected, template produce plot (UMAP/TSNE/PCA; choice) using data column color cells","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/plotMetadata.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Plotting (i.e. coloring with) different columns of your Metadata Table — plotMetadata","text":"","code":"plotMetadata( object, samples.to.include, metadata.to.plot, columns.to.summarize, summarization.cut.off = 5, reduction.type = \"tsne\", use.cite.seq = FALSE, show.labels = FALSE, legend.text.size = 1, legend.position = \"right\", dot.size = 0.01 )"},{"path":"https://nidap-community.github.io/SCWorkflow/reference/plotMetadata.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Plotting (i.e. coloring with) different columns of your Metadata Table — plotMetadata","text":"object combined Seurat Object metadata plot samples..include samples like include metadata..plot metadata columns Metadata table like plot columns..summarize columns like summarize summarization.cut.Select number categories want display, marking cells \".\" Default 5 reduction.type kind visualization like use plot cells metadata (tsne, umap, pca). Default tsne use.cite.seq TRUE like plot Antibody clusters CITEseq instead scRNA. Default FALSE show.labels Whether add labels reduction map. Default FALSE legend.text.size Customize size legend text charts. Default 1 legend.position Select want align legend. Default \"right\" dot.size size dots displayed plot. Default os 0.01","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/plotMetadata.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Plotting (i.e. coloring with) different columns of your Metadata Table — plotMetadata","text":"data.frame extracted Seurat object plot","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/plotMetadata.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Plotting (i.e. coloring with) different columns of your Metadata Table — plotMetadata","text":"downstream template Single-cell RNA-seq workflow (requires dataset Filter/QC/SingleR annotations run first)","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/processRawData.html","id":null,"dir":"Reference","previous_headings":"","what":"Process Raw Data — processRawData","title":"Process Raw Data — processRawData","text":"Creates list Seurat Objects h5 files. log normalize produce QC figures individual samples","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/processRawData.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Process Raw Data — processRawData","text":"","code":"processRawData( input, sample.metadata.table = NULL, sample.name.column = NULL, organism, rename.col = NULL, keep = T, file.filter.regex = c(), split.h5 = F, cell.hash = F, tcr.summarize.topN = 10, do.normalize.data = T )"},{"path":"https://nidap-community.github.io/SCWorkflow/reference/processRawData.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Process Raw Data — processRawData","text":"input Input can vector .h5 files, list seurat objects sample. TCRseq Metadata .csv files can also included added corrisponding sample seurat object. Vector files include entire file path. sample.metadata.table table sample metadata want append already-existing metadata within input Seurat Object(s). (optional) sample.name.column column input metadata..append table contains sample names matching orig.idents input object(s). (optional) organism Please select species. Choices Human Mouse. (Default: Human). rename.col Select column name metadata table contains new samples name (optional). keep TRUE, keep files pattern found sample name. FALSE, remove files pattern found sample name. pattern set file.filter.regex parameter (). file.filter.regex Pattern regular expression sample name. Use 'keep' parameter keep remove fi les contain pattern. samples renamed set regular expression based new names split.h5 TRUE, split H5 individual files. (Default: FALSE) cell.hash TRUE, dataset contains cell hashtags. (Default: FALSE) tcr.summarize.topN Select number top identified TCR clonotypes included summary column. clonotypes top N populated classified \"\". (Default: 10) .normalize.data TRUE counts table log2 normalized. input contains counts already normalzed set FALSE. (Default: TRUE)","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/processRawData.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Process Raw Data — processRawData","text":"Seurat Object QC plots","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/processRawData.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Process Raw Data — processRawData","text":"Step 1 basic Single-Cell RNA-seq workflow. Returns data Seurat Object, basic data structure Seurat Single Cell analysis.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/reclusterFilteredSeuratObject.html","id":null,"dir":"Reference","previous_headings":"","what":"Recluster Filtered Seurat Object. — reclusterFilteredSeuratObject","title":"Recluster Filtered Seurat Object. — reclusterFilteredSeuratObject","text":"template reclusters filtered Seurat object.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/reclusterFilteredSeuratObject.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Recluster Filtered Seurat Object. — reclusterFilteredSeuratObject","text":"","code":"reclusterFilteredSeuratObject( object, prepend.txt = \"old\", old.columns.to.save, number.of.pcs = 50, cluster.resolution.low.range = 0.2, cluster.resolution.high.range = 1.2, cluster.resolution.range.bins = 0.2, reduction.type = \"tsne\" )"},{"path":"https://nidap-community.github.io/SCWorkflow/reference/reclusterFilteredSeuratObject.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Recluster Filtered Seurat Object. — reclusterFilteredSeuratObject","text":"object input Seurat Object. prepend.txt Text prepend old columns make unique new. Default \"old\". old.columns..save Old seurat clustering columns (e.g. SCT_snn_res.0.4) save. number..pcs Select number principal components analysis. Set 0 automatically decide. Default 50. cluster.resolution.low.range Select minimum resolution clustering plots. lower set , FEWER clusters generated. Default 0.2. cluster.resolution.high.range Select maximum resolution clustering plots. higher set , clusters generated. Default 1.2. cluster.resolution.range.bins Select bins cluster plots. example, input 0.2 bin, low/high resolution ranges 0.2 0.6, template produce cluster plots resolutions 0.2, 0.4 0.6. Default 0.2. reduction.type Select kind clustering visualization like use visualize cell type results (\"umap\", \"tsne\", \"pca\"). Default \"tsne\".","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/reclusterFilteredSeuratObject.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Recluster Filtered Seurat Object. — reclusterFilteredSeuratObject","text":"Function returns reclustered Seurat Object new clustering columns renamed original clustering columns, along plot new dimsensionality reduction.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/reclusterFilteredSeuratObject.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Recluster Filtered Seurat Object. — reclusterFilteredSeuratObject","text":"method reclusters filtered , preserving original SCT clustering columns prepended prefix, making new SCT clustering columns based reclustering. image returned reclustered project.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/reclusterSeuratObject.html","id":null,"dir":"Reference","previous_headings":"","what":"Recluster Seurat Object. — reclusterSeuratObject","title":"Recluster Seurat Object. — reclusterSeuratObject","text":"template reclusters Seurat object.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/reclusterSeuratObject.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Recluster Seurat Object. — reclusterSeuratObject","text":"","code":"reclusterSeuratObject( object, prepend.txt = \"old\", old.columns.to.save, number.of.pcs = 50, cluster.resolution.low.range = 0.2, cluster.resolution.high.range = 1.2, cluster.resolution.range.bins = 0.2, reduction.type = \"tsne\" )"},{"path":"https://nidap-community.github.io/SCWorkflow/reference/reclusterSeuratObject.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Recluster Seurat Object. — reclusterSeuratObject","text":"object input Seurat Object. prepend.txt Text prepend old columns make unique new. Default \"old\". old.columns..save Old seurat clustering columns (e.g. SCT_snn_res.0.4) save. number..pcs Select number principal components analysis. Set 0 automatically decide. Default 50. cluster.resolution.low.range Select minimum resolution clustering plots. lower set , FEWER clusters generated. Default 0.2. cluster.resolution.high.range Select maximum resolution clustering plots. higher set , clusters generated. Default 1.2. cluster.resolution.range.bins Select bins cluster plots. example, input 0.2 bin, low/high resolution ranges 0.2 0.6, template produce cluster plots resolutions 0.2, 0.4 0.6. Default 0.2. reduction.type Select kind clustering visualization like use visualize cell type results (\"umap\", \"tsne\", \"pca\"). Default \"tsne\".","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/reclusterSeuratObject.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Recluster Seurat Object. — reclusterSeuratObject","text":"Function returns reclustered Seurat Object new clustering columns renamed original clustering columns, along plot new dimsensionality reduction.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/reclusterSeuratObject.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Recluster Seurat Object. — reclusterSeuratObject","text":"method reclusters input , preserving original SCT clustering columns prepended prefix, making new SCT clustering columns based reclustering. image returned reclustered project.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/tSNE3D.html","id":null,"dir":"Reference","previous_headings":"","what":"Plot 3D-TSNE given a Seurat Object and returns plotly image — tSNE3D","title":"Plot 3D-TSNE given a Seurat Object and returns plotly image — tSNE3D","text":"method provides visualization 3D-tSNE plot given Seurat Object returns plotly plot dataframe TSNE coordinates. optionally saves plotly image embedded html file.","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/tSNE3D.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Plot 3D-TSNE given a Seurat Object and returns plotly image — tSNE3D","text":"","code":"tSNE3D( object, color.variable, label.variable, dot.size = 4, legend = TRUE, colors = c(\"darkblue\", \"purple4\", \"green\", \"red\", \"darkcyan\", \"magenta2\", \"orange\", \"yellow\", \"black\"), filename = \"plot.html\", save.plot = FALSE, npcs = 15 )"},{"path":"https://nidap-community.github.io/SCWorkflow/reference/tSNE3D.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Plot 3D-TSNE given a Seurat Object and returns plotly image — tSNE3D","text":"object Seurat-class object color.variable Metadata column Seurat Object use color label.variable Metadata column Seurat Object use label dot.size Dot size plot (default 4) legend TRUE, show legend (default TRUE) colors Colors used color.variable filename Filename saving plot (default \"plot.html\") save.plot Save plot widget html file (default FALSE) npcs Number principal components used tSNE calculations (default 15)","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/violinPlot_mod.html","id":null,"dir":"Reference","previous_headings":"","what":"Violin Plot by Metadata — violinPlot_mod","title":"Violin Plot by Metadata — violinPlot_mod","text":"Create violin plot gene expression data across groups","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/violinPlot_mod.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Violin Plot by Metadata — violinPlot_mod","text":"","code":"violinPlot_mod( object, assay, slot, genes, group, facet_by = \"\", filter_outliers = F, outlier_low = 0.05, outlier_high = 0.95, jitter_points, jitter_dot_size )"},{"path":"https://nidap-community.github.io/SCWorkflow/reference/violinPlot_mod.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Violin Plot by Metadata — violinPlot_mod","text":"object Seurat-class object assay Assay extract gene expression data (Default: SCT) slot Slot extract gene expression data (Default: scale.data) group.Split violin plot based metadata group group.subset Include specific subset group.genes..interest Genes visualize violin plot filter.outliers Filter outliers data (TRUE/FALSE) scale.data Scale data 0 1 (TRUE/FALSE) log.scale.data Transform data onto log10 scale (TRUE/FALSE) reorder.ident Numeric data ordered naturally default. Toggling option order groups match group list non-numeric, effect otherwise. rename.ident Give alternative names group.displayed graph ylimit Y-axis limit plot.style Choose grid, labeled, row outlier.low.lim Filter lower bound outliers (Default = 0.1) outlier..lim Filter upper bound outliers (Default = 0.9) jitter.points Scatter points plot (TRUE/FALSE) jitter.width Set spread jittered points jitter.dot.size Set size individual points print.outliers Print outliers points graph may redundant jitter","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/violinPlot_mod.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Violin Plot by Metadata — violinPlot_mod","text":"violin ggplot2 object","code":""},{"path":"https://nidap-community.github.io/SCWorkflow/reference/violinPlot_mod.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Violin Plot by Metadata — violinPlot_mod","text":"Takes list genes inputted user, displays violin plots genes across groups slot-assay (optional) outliers removed. Can also choose scale transform expression data.","code":""}] diff --git a/docs/sitemap.xml b/docs/sitemap.xml new file mode 100644 index 0000000..cc7a6ac --- /dev/null +++ b/docs/sitemap.xml @@ -0,0 +1,41 @@ + +https://nidap-community.github.io/SCWorkflow/404.html +https://nidap-community.github.io/SCWorkflow/CHANGELOG.html +https://nidap-community.github.io/SCWorkflow/LICENSE-text.html +https://nidap-community.github.io/SCWorkflow/articles/CONTRIBUTING.html +https://nidap-community.github.io/SCWorkflow/articles/README.html +https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Annotations.html +https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-DEG.html +https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Overview.html +https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-QC.html +https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-SubsetReclust.html +https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Usage.html +https://nidap-community.github.io/SCWorkflow/articles/SCWorkflow-Visualizations.html +https://nidap-community.github.io/SCWorkflow/articles/images/Vis_3D.html +https://nidap-community.github.io/SCWorkflow/articles/index.html +https://nidap-community.github.io/SCWorkflow/authors.html +https://nidap-community.github.io/SCWorkflow/index.html +https://nidap-community.github.io/SCWorkflow/reference/annotateCellTypes.html +https://nidap-community.github.io/SCWorkflow/reference/appendMetadataToSeuratObject.html +https://nidap-community.github.io/SCWorkflow/reference/colorByGene.html +https://nidap-community.github.io/SCWorkflow/reference/colorByMarkerTable.html +https://nidap-community.github.io/SCWorkflow/reference/combineNormalize.html +https://nidap-community.github.io/SCWorkflow/reference/degGeneExpressionMarkers.html +https://nidap-community.github.io/SCWorkflow/reference/dotPlotMet.html +https://nidap-community.github.io/SCWorkflow/reference/dualLabeling.html +https://nidap-community.github.io/SCWorkflow/reference/filterQC.html +https://nidap-community.github.io/SCWorkflow/reference/filterSeuratObjectByMetadata.html +https://nidap-community.github.io/SCWorkflow/reference/heatmapSC.html +https://nidap-community.github.io/SCWorkflow/reference/index.html +https://nidap-community.github.io/SCWorkflow/reference/modScore.html +https://nidap-community.github.io/SCWorkflow/reference/nameClusters.html +https://nidap-community.github.io/SCWorkflow/reference/object.html +https://nidap-community.github.io/SCWorkflow/reference/palantir_api_call.html +https://nidap-community.github.io/SCWorkflow/reference/plotMetadata.html +https://nidap-community.github.io/SCWorkflow/reference/processRawData.html +https://nidap-community.github.io/SCWorkflow/reference/reclusterFilteredSeuratObject.html +https://nidap-community.github.io/SCWorkflow/reference/reclusterSeuratObject.html +https://nidap-community.github.io/SCWorkflow/reference/tSNE3D.html +https://nidap-community.github.io/SCWorkflow/reference/violinPlot_mod.html + + diff --git a/inst/extdata/NIDAPjson/Add_External_Cell_Annotation_CCBR_scRNA_seq_.code-template.json b/inst/extdata/NIDAPjson/Add_External_Cell_Annotation_CCBR_scRNA_seq_.code-template.json new file mode 100644 index 0000000..929d01c --- /dev/null +++ b/inst/extdata/NIDAPjson/Add_External_Cell_Annotation_CCBR_scRNA_seq_.code-template.json @@ -0,0 +1,76 @@ +{ + "codeTemplate": "ExternalAnnotation_SO <- function({{{Input_Seurat_Object}}}, {{{External_Metadata_Table}}}) {\n \n## --------- ##\n## Libraries ##\n## --------- ##\n\n# Load necessary libraries\nlibrary(nidapFunctions)\nnidapLoadPackages(c(\"SCWorkflow\", \"magrittr\", \"tibble\", \"dplyr\", \"Seurat\"))\n\n## -------------------------------- ##\n## User-Defined Template Parameters ##\n## -------------------------------- ##\n\nseurat_object <- {{{Input_Seurat_Object}}}\nexternal_metadata <- {{{External_Metadata_Table}}}\nseurat_object_filename <- \"{{{Seurat_Object_Filename}}}\"\nbarcode_column = \"{{{Column_Containing_Barcodes}}}\"\nexternal_cols_to_add = {{{External_Metadata_Columns_to_Add}}}\ncol_to_viz = \"{{{Column_to_Visualize_Optional_}}}\"\n\n## -------------------------------- ##\n## Errors ##\n## -------------------------------- ##\n\n## -------------------------------- ##\n## Functions ##\n## -------------------------------- ##\n\n## --------------- ##\n## Main Code Block ##\n## --------------- ##\n\n# Load Seurat Object\ncat(sprintf(\"\\nReading Seurat Object from dataset: %s\\n\\n\", paste(seurat_object_filename, collapse = \", \")))\npath <- nidapGetPath(seurat_object, seurat_object_filename)\nso <- readRDS(path)\nprint(so)\n\n# Extract meta.data from Seurat Object\ncat(\"Extracting Metadata Table from Seurat Object\\n\\n\")\nif (\"meta.data\" %in% slotNames(so)) {\n met.df <- so@meta.data\n} else if (\"RNA\" %in% slotNames(so)) {\n met.df <- so$RNA@meta.data\n} else {\n stop(\"No recognizable meta.data found in the Seurat object.\")\n}\n\n# If no \"Barcode\" column exists, create it from rownames\nif (!(\"Barcode\" %in% colnames(met.df))) {\n met.df <- met.df %>% rownames_to_column(\"Barcode\")\n}\n\n# Check if the user-specified barcode column exists\nif (!(barcode_column %in% colnames(external_metadata))) {\n stop(paste(\"External metadata does not have the specified barcode column:\", barcode_column))\n}\n\n# Parse external columns to add\nif (!is.null(external_cols_to_add)) {\n cols_to_import <- trimws(unlist(strsplit(external_cols_to_add, \",\")))\n \n # Always include Barcode in the subset\n cols_to_keep <- unique(c(barcode_column, cols_to_import))\n \n # Ensure all requested columns exist in external_metadata\n missing_cols <- setdiff(cols_to_keep, colnames(external_metadata))\n if (length(missing_cols) > 0) {\n stop(paste(\"These columns were not found in external_metadata:\", paste(missing_cols, collapse = \", \")))\n }\n \n # Subset external_metadata to keep only the requested columns\n external_metadata <- external_metadata[, cols_to_keep, drop = FALSE]\n}\n\n# Merge the external metadata table with the Seurat object metadata by barcode\nmerged_metadata <- merge(met.df, external_metadata, by.x = \"Barcode\", by.y = barcode_column, all.x = TRUE)\n\n## troubleshooting, check if any NULL rows appear in merged meta\nif (any(is.na(merged_metadata$Barcode))){\n stop(\"STOP: Metadata not correctly merged. NA's produced.\")\n}\nif (nrow(met.df)!=nrow(merged_metadata)){\n stop(\"STOP: Metadata not correctly merged. Incorrect number of rows when merged.\")\n}\nif(length(setdiff(met.df$Barcode, external_metadata[[barcode_column]]))>0){\n warning(\"Warning: Not all cells from the Seurat Object are in the External Metadata table.\")\n}\nif(length(setdiff(external_metadata[[barcode_column]], met.df$Barcode))>0){\n warning(\"Warning: Some cells in the External Metadata are not found in the Seurat Object.\")\n}\n\n# Print or save the merged metadata for review\ncat(\"Metadata successfully merged. Here is a preview:\\n\")\nprint(head(merged_metadata))\n\n# Ensure that rownames in merged_metadata are barcodes, not numbers \nmerged_metadata=column_to_rownames(merged_metadata,'Barcode')\n\n# Update Seurat object with the new merged metadata\nso <- AddMetaData(so, merged_metadata)\n\n# If col_to_viz isn't empty, print TSNE/UMAP colored by this column.\nif(length(col_to_viz) != 0) {\n print(DimPlot(so, group.by = col_to_viz, label = FALSE, reduction = 'umap'))# + NoLegend()\n print(DimPlot(so, group.by = col_to_viz, label = FALSE, reduction = 'tsne'))# + NoLegend()\n}\n\noutput <- new.output()\noutput_fs <- output$fileSystem()\nsaveRDS(so, output_fs$get_path(\"seurat_object.rds\", 'w'))\n\nreturn(NULL)\n\n}\n\n#################################################\n## Global imports and functions included below ##\n#################################################\n\n# R.cache depends on a home folder\nSys.setenv(R_USER_CACHE_DIR = Sys.glob(file.path(R.home())));", + "columns": [ + { + "key": "Column_Containing_Barcodes", + "displayName": "Column Containing Barcodes", + "description": "Select the column in the external metadata table that has Barcodes you expect to correspond to those in the input Seurat Object. The selected column will be used to join the external metadata to the existing Seurat Object metadata.", + "paramGroup": "Basic", + "sourceDataset": "External_Metadata_Table", + "defaultValue": null, + "columnType": "ALL", + "isMulti": null + }, + { + "key": "External_Metadata_Columns_to_Add", + "displayName": "External Metadata Columns to Add", + "description": "Select columns in external metadata that you want to add to your input Seurat Object's metadata.", + "paramGroup": "Basic", + "sourceDataset": "External_Metadata_Table", + "defaultValue": null, + "columnType": "ALL", + "isMulti": true + }, + { + "key": "Column_to_Visualize_Optional_", + "displayName": "Column to Visualize (Optional)", + "description": "You may choose a single column from the External Metadata to visualize. TSNE & UMAP plots colored by this variable will be produced. You may leave this variable blank. Default is blank.", + "paramGroup": "Basic", + "sourceDataset": "External_Metadata_Table", + "defaultValue": null, + "columnType": "ALL", + "isMulti": null + } + ], + "condaDependencies": [], + "description": "This template will merge an external table of cell annotations into an existing Seurat Object's metadata table. The input external metadata table must have a column named \"Barcode\" that contains barcodes matching those found in the metadata already present in the input Seurat Object. The output will be a new Seurat Object with metadata that now includes the additional columns from the external table.", + "externalId": "Add_External_Cell_Annotation_CCBR_scRNA_seq_", + "inputDatasets": [ + { + "key": "Input_Seurat_Object", + "displayName": "Input Seurat Object", + "description": "Select the input Seurat Object.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_TRANSFORM_INPUT", + "tags": [] + }, + { + "key": "External_Metadata_Table", + "displayName": "External Metadata Table", + "description": "Select the input external metadata table.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "Seurat_Object_Filename", + "displayName": "Seurat Object Filename", + "description": "The name of the RDS within the input SO dataset. By default, this name is \"seurat_object.rds\".", + "paramType": "STRING", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "seurat_object.rds", + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "Add External Cell Annotation [CCBR] [scRNA-seq]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/inst/extdata/NIDAPjson/Aggregate_Seurat_Counts_CCBR_scRNA_seq_.code-template.json b/inst/extdata/NIDAPjson/Aggregate_Seurat_Counts_CCBR_scRNA_seq_.code-template.json new file mode 100644 index 0000000..4821183 --- /dev/null +++ b/inst/extdata/NIDAPjson/Aggregate_Seurat_Counts_CCBR_scRNA_seq_.code-template.json @@ -0,0 +1,72 @@ +{ + "codeTemplate": "Pseudobulk_AggregateCounts_BV6 <- function({{{Seurat_Object}}},{{{Metadata}}}) {\n\n ## --------- ##\n ## Libraries ##\n ## --------- ##\n \n library(nidapFunctions)\n nidapLoadPackages(c(\"SCWorkflow\",\"Seurat\",\"dplyr\",\"ggplot2\",\"plotly\"))\n \n ## -------------------------------- ##\n ## User-Defined Template Parameters ##\n ## -------------------------------- ##\n \n # PH- Need Better Explination of variables\n seruat_object={{{Seurat_Object}}}\n var_group={{{Pseudobulk_Variable}}} \n slot=\"{{{Slot}}}\"\n \n ## ------------------- ##\n ## Load Seurat Object ##\n ## ------------------- ##\n \n filename <- \"{{{Filename}}}\"\n fs <- seruat_object$fileSystem()\n path <- fs$get_path(filename, 'r')\n so <- readRDS(path)\n \n ##--------------- ##\n ## Error Messages ##\n ## -------------- ##\n \n # Check that input is single Seurat Object\n if (length(so) > 1){\n stop(\"Please provide an input containing a single Seurat Object\")\n }\n \n ## Rename variables in case of NIDAPisms\n # For instances where metadata variable is orig_ident and Seurat variable \n # is orig.ident\n if (\"orig_ident\" %in% var_group){\n var_group[var_group == \"orig_ident\"] <- \"orig.ident\"\n }\n \n ## Rename variables in case of NIDAPisms\n # Check if \"hash_ID\" is in var_group and replace with the actual column name in metadata\n if (\"hash_ID\" %in% var_group) {\n actual_col <- NULL\n if (\"hash.ID\" %in% colnames(so@meta.data)) {\n actual_col <- \"hash.ID\"\n } else if (\"hash_ID\" %in% colnames(so@meta.data)) {\n actual_col <- \"hash_ID\"\n } else {\n stop(\"Neither 'hash.ID' nor 'hash_ID' found in Seurat object metadata. \")\n }\n var_group[var_group == \"hash_ID\"] <- actual_col\n }\n\n\n # For instances where metadata variable is SCT_snn_res_X_Y and Seurat variable\n # is SCT_snn_res.X.Y (Old_SCT_res_X_Y from Recluster Template is fine)\n if (all(any(grepl(\"SCT_snn_res_(\\\\d+)_\",var_group)) & \n !grepl(\"old\",var_group))){\n var_group <- gsub(\"SCT_snn_res_(\\\\d+)_\",\"SCT_snn_res.\\\\1.\",var_group)\n } \n \n ## --------------- ##\n ## Run Fucnction ##\n ## --------------- ## \n \n pseudobulk_Table=aggregateCounts(object=so,\n var.group=var_group,\n slot=slot)\n \n \n return(pseudobulk_Table)\n}\n\n#################################################\n## Global imports and functions included below ##\n#################################################\n\naggregateCounts=function(object,\n var.group,\n slot){\n \n \n ## --------------- ##\n ## Main Code Block ##\n ## --------------- ##\n \n pseudobulk <- AverageExpression(object, \n return.seurat = FALSE,\n assay = \"SCT\",\n group.by = var.group,\n slot = slot)[[1]] %>% \n as.data.frame.matrix() \n \n pseudobulk$Gene <- rownames(pseudobulk)\n pseudobulk <- pseudobulk %>% select(\"Gene\", everything())\n rownames(pseudobulk) <- NULL\n\n # Further processing of column names\n colnames(pseudobulk) <- gsub(\"\\\\W\",\"_\",colnames(pseudobulk))\n\n # # Rename columns generated from Clustering to be more Generic\n # if(grepl(\"SCT_snn_res\",var.group)){ \n # colnames(pseudobulk)[grepl(\"\\\\d+\", colnames(pseudobulk))] <- \n # paste(\"Cluster\", \n # colnames(pseudobulk)[grepl(\"\\\\d+\", colnames(pseudobulk))], \n # sep = \"_\")\n # }\n \n # Return Table/Figure that gives statistics on \n # Number of Cells in each group/new sample\n # Distribution of cell Counts in each group/new sample\n meta <- object@meta.data[,var.group]\n \n # check that columns are all factors / categorical\n char_or_factor_cols <- sapply(meta, function(x) is.character(x) || is.factor(x))\n \n # do plots and tables if all columns are factors or characters\n if(all(char_or_factor_cols)){\n meta$interaction <- gsub(\"\\\\W\",\"_\",interaction(meta))\n \n df <- as.data.frame(table(pseudobulk_group = meta$interaction)) %>% filter(Freq != 0)\n # sort the table by the number of cells in each group\n df <- df[order(df$Freq, decreasing = F),]\n \n if(any(df$Freq == 1)){\n single_counts <- df$pseudobulk_group[df$Freq == 1]\n # sprintf, make custom warning message with %s as placeholder for single count groups\n warning(sprintf(\n \"Some groups have only 1 cell. It is recommended to have at least 2 cells in each group.\\nAffected groups: %s\",\n paste(single_counts, collapse = \", \")\n ))\n }\n \n p <- ggplotly(ggplot(df, aes(x = pseudobulk_group, y = Freq)) +\n geom_bar(stat = \"identity\", position = \"stack\") +\n labs(y = \"Counts\", x = \"Pseudobulk Groups\", title = \"Number of Cells in each Pseudobulk Group\") +\n theme(axis.text.x = element_text(angle = 90, hjust = 1)))\n \n print(p)\n \n } else {\n stop(\"All columns in var.group must be factors or characters\")\n }\n \n return(pseudobulk)\n}\n\n", + "columns": [ + { + "key": "Pseudobulk_Variable", + "displayName": "Pseudobulk Variable", + "description": "Column from Seurat Metadata that contains the categorical variable(s) to group cells and gene expression values by.", + "paramGroup": null, + "sourceDataset": "Metadata", + "defaultValue": null, + "columnType": "ALL", + "isMulti": true + } + ], + "condaDependencies": [], + "description": "This template is the first step in a Pseudobulk analysis of your scRNA-seq dataset. It groups cells based on chosen categorical variable(s) in the Seurat Object's Metadata and aggregates the counts of each gene in each group. \n\nThe output is a table of aggregate expression in which the rows are genes and the columns are values found in the chosen Pseudobulk variable. If you select multiple categories to aggregate by (e.g. Category1: A,B,C and Category2: D,E,F), cells will be grouped by combinations of category variables (e.g. A_D, A_E, A_F, B_D, B_E, B_F). By default, gene counts are averaged across cells in each group.\n\n", + "externalId": "Aggregate_Seurat_Counts_CCBR_scRNA_seq_", + "inputDatasets": [ + { + "key": "Seurat_Object", + "displayName": "Seurat Object", + "description": "Seurat Object containing single-cell data.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_TRANSFORM_INPUT", + "tags": [] + }, + { + "key": "Metadata", + "displayName": "Metadata", + "description": "Metadata of Seurat Object, from the \"Get Metadata Table [CCBR] [scRNA-seq]\" template.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "Slot", + "displayName": "Slot", + "description": "Select the specific gene expression data slot to run analysis on. The \"data\" is the log-normalized SCTransformed expression. The \"scale.data\" slot is scaled and centered SCT Normalized expression (mean 0 and variance 1 for each gene). The \"counts\" slot is the raw gene expression. Default is the \"data\" slot because intent is analysis with Limma-Voom downstream.", + "paramType": "SELECT", + "paramGroup": null, + "paramValues": [ + "data", + "scale.data", + "counts" + ], + "defaultValue": "data", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Filename", + "displayName": "Filename", + "description": "Name of input file connected to this template.", + "paramType": "STRING", + "paramGroup": null, + "paramValues": null, + "defaultValue": "seurat_object.rds", + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "Aggregate Seurat Counts [CCBR] [scRNA-seq]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/inst/extdata/NIDAPjson/Batch_Correction_with_Harmony_CCBR_scRNA_seq_.code-template.json b/inst/extdata/NIDAPjson/Batch_Correction_with_Harmony_CCBR_scRNA_seq_.code-template.json new file mode 100644 index 0000000..9a2621e --- /dev/null +++ b/inst/extdata/NIDAPjson/Batch_Correction_with_Harmony_CCBR_scRNA_seq_.code-template.json @@ -0,0 +1,92 @@ +{ + "codeTemplate": "HarmonyBatchCorr_SO <- function({{{Seurat_Object}}},{{{Metadata}}}) {\n\n ## --------- ##\n ## Libraries ##\n ## --------- ##\n\n library(nidapFunctions)\n nidapLoadPackages(\"SCWorkflow\")\n\n ## -------------------------------- ##\n ## User-Defined Template Parameters ##\n ## -------------------------------- ##\n\n #Basic Parameters:\n seurat_object <- {{{Seurat_Object}}}\n group_by_var <- \"{{{Batch_Variable}}}\"\n variable_features <- {{{Variable_Features}}}\n genes_to_add <- {{{Genes_to_Add}}}\n principal_components <- {{{Principal_Components}}}\n\n #Advanced Parameters:\n seurat_object_filename <- \"{{{Seurat_Object_Filename}}}\"\n\n ## --------------- ##\n ## Main Code Block ##\n ## --------------- ##\n\n path <- nidapGetPath(seurat_object,seurat_object_filename)\n so <- readRDS(path)\n\n # Account for NIDAP specific behavior\n if(group_by_var == \"orig_ident\"){\n group_by_var <- \"orig.ident\"\n }\n\n harmony_res <- harmonyBatchCorrect(object = so,\n nvar = variable_features,\n genes.to.add = genes_to_add,\n group.by.var = group_by_var,\n npc = principal_components)\n\n output <- new.output()\n output_fs <- output$fileSystem()\n saveRDS(harmony_res, output_fs$get_path(\"seurat_object.rds\", 'w'))\n\n return(NULL)\n}\n\n#################################################\n## Global imports and functions included below ##\n#################################################\n\n# Functions defined here will be available to call in\n# the code for any table.\n\nharmonyBatchCorrect <- function(object, \n nvar = 2000, \n genes.to.add = c(),\n group.by.var,\n npc = 30) {\n \nlibrary(patchwork) \nlibrary(harmony)\nlibrary(Seurat)\nlibrary(ggplot2)\nlibrary(RColorBrewer)\n\n # Error and Warning Messages\n if(is.null(genes.to.add)){\n print(\"no genes will be added\")\n } else if (all(!genes.to.add %in% rownames(object))){\n warning(\"specified genes were not found and therefore cannot be added\")\n }\n \n if (nvar > length(VariableFeatures(object))){\n stop(\"nvar exceed total number of variable genes in the data\")\n }\n \n ## Main Code Block\n # Save original tSNE and UMAP for later comparison\n n <- 60\n qual.col.pals = brewer.pal.info[brewer.pal.info$category == 'qual',]\n qual.col.pals = qual.col.pals[c(7,6,2,1,8,3,4,5),]\n cols = unlist(mapply(brewer.pal, qual.col.pals$maxcolors, \n rownames(qual.col.pals)))\n\n sdat.tsne.orig <- data.frame(as.vector(object@reductions$tsne@cell.embeddings[,1]),\n as.vector(object@reductions$tsne@cell.embeddings[,2]),\n object@meta.data[eval(parse(text = \"group.by.var\"))])\n names(sdat.tsne.orig) <- c(\"TSNE1\",\"TSNE2\",\"ident\")\n \n sdat.umap.orig <- data.frame(as.vector(object@reductions$umap@cell.embeddings[,1]),\n as.vector(object@reductions$umap@cell.embeddings[,2]),\n object@meta.data[eval(parse(text = \"group.by.var\"))])\n names(sdat.umap.orig) <- c(\"UMAP1\",\"UMAP2\",\"ident\")\n\n orig.tsne <- ggplot(sdat.tsne.orig, aes(x=TSNE1, y=TSNE2)) +\n theme_bw() +\n theme(legend.title=element_blank()) +\n geom_point(aes(colour=ident),size=1) +\n scale_color_manual(values=cols) +\n theme(panel.grid.major = element_blank(), \n panel.grid.minor = element_blank(), \n legend.position=\"none\",\n panel.background = element_blank(),\n legend.text=element_text(size=rel(0.5))) +\n guides(colour = guide_legend(override.aes = list(size=5, alpha = 1))) +\n annotate(\"text\", x = Inf, y = -Inf, label = \"Original tSNE\", hjust = 1.1, vjust = -1, size = 5) \n \n orig.umap <- ggplot(sdat.umap.orig, aes(x=UMAP1, y=UMAP2)) +\n theme_bw() +\n theme(legend.title=element_blank()) +\n geom_point(aes(colour=ident),size=1) +\n scale_color_manual(values=cols) +\n theme(panel.grid.major = element_blank(), \n panel.grid.minor = element_blank(), \n legend.position=\"none\",\n panel.background = element_blank(),\n legend.text=element_text(size=rel(0.5))) +\n guides(colour = guide_legend(override.aes = list(size=5, alpha = 1))) +\n annotate(\"text\", x = Inf, y = -Inf, label = \"Original UMAP\", hjust = 1.1, vjust = -1, size = 5)\n\n # Adjusts SCT scale.data based on harmonized embedding\n seur.SCT <- object@assays$SCT@scale.data\n \n # Add more genes to analyze - must be present in SCT scale.data\n genes.to.add <- genes.to.add[\n genes.to.add %in% rownames(object@assays$SCT@scale.data)]\n \n # Most variable features (mvf) with user added genes\n mvf <- unique(c(VariableFeatures(object)[1:nvar], genes.to.add))\n \n # Double check that mvf genes are found in scale data genes\n mvf <- mvf[mvf %in% rownames(seur.SCT)]\n \n # Subset SCT scale.data matrix by most variable features\n seur.SCT <- seur.SCT[mvf,]\n seur.SCT <- t(seur.SCT) \n \n # Singular Value Decomposition (SVD) on scaled counts\n pppca <- svd(seur.SCT) \n\n # pppca$u: matrix that contains the left singular values\n # pppca$d: vector that contains singular values, sorted in descending order\n ppembed <- pppca$u %*% diag(pppca$d)\n pcnames <- vector(mode = \"character\")\n for (i in 1:dim(ppembed)[2])pcnames[i] <- paste(\"PC\", i, sep = \"_\")\n colnames(ppembed) <- pcnames\n rownames(ppembed) <- rownames(seur.SCT)\n \n # pppca$v: matrix that contains the right singular values\n ppldngs <- pppca$v\n colnames(ppldngs) <- pcnames\n rownames(ppldngs) <- mvf \n\n # Redo pca embeddings based on SVD of gene expression values\n object@reductions$pca@cell.embeddings <- ppembed\n object@reductions$pca@feature.loadings <- ppldngs\n object@reductions$pca@stdev <- pppca$d\n\n # By default, Harmony corrects pca embeddings. \n # Set do_pca to FALSE to use your own pca embeddings. \n # Stores adjusted embeddings in harmony reduction slot\n \n object <- RunHarmony(object, \n group.by.var,\n do_pca=FALSE,\n assay.use = \"SCT\",\n plot_convergence = FALSE,\n return_object=TRUE)\n \n object <- RunUMAP(object, reduction = \"harmony\", dims=1:npc)\n object <- RunTSNE(object, reduction = \"harmony\", dims=1:npc)\n \n # Plot harmony embeddings annotated by variable to batch correct for\n sdat.tsne <- data.frame(as.vector(object@reductions$tsne@cell.embeddings[,1]),\n as.vector(object@reductions$tsne@cell.embeddings[,2]),\n object@meta.data[eval(parse(text = \"group.by.var\"))])\n names(sdat.tsne) <- c(\"TSNE1\",\"TSNE2\",\"ident\")\n \n sdat.umap <- data.frame(as.vector(object@reductions$umap@cell.embeddings[,1]),\n as.vector(object@reductions$umap@cell.embeddings[,2]),\n object@meta.data[eval(parse(text = \"group.by.var\"))])\n names(sdat.umap) <- c(\"UMAP1\",\"UMAP2\",\"ident\")\n \n harm.tsne <- ggplot(sdat.tsne, aes(x=TSNE1, y=TSNE2)) +\n theme_bw() +\n theme(legend.title=element_blank()) +\n geom_point(aes(colour=ident),size=1) +\n scale_color_manual(values=cols) +\n theme(panel.grid.major = element_blank(), \n panel.grid.minor = element_blank(), \n legend.position=\"right\",\n panel.background = element_blank(),\n legend.text=element_text(size=rel(1.5))) +\n guides(colour = guide_legend(override.aes = list(size=5, alpha = 1))) +\n annotate(\"text\", x = Inf, y = -Inf, label = \"Harmonized tSNE\", hjust = 1.1, vjust = -1, size = 5)\n\n harm.umap <- ggplot(sdat.umap, aes(x=UMAP1, y=UMAP2)) +\n theme_bw() +\n theme(legend.title=element_blank()) +\n geom_point(aes(colour=ident),size=1) +\n scale_color_manual(values=cols) +\n theme(panel.grid.major = element_blank(), \n panel.grid.minor = element_blank(), \n legend.position=\"right\",\n panel.background = element_blank(),\n legend.text=element_text(size=rel(1.5))) +\n guides(colour = guide_legend(override.aes = list(size=5, alpha = 1))) +\n annotate(\"text\", x = Inf, y = -Inf, label = \"Harmonized UMAP\", hjust = 1.1, vjust = -1, size = 5)\n\n print((orig.tsne + harm.tsne) + plot_layout(ncol = 2))\n\n print((orig.umap + harm.umap) + plot_layout(ncol = 2))\n\n # Calculate adjusted gene expression from embeddings\n harm.embeds <- object@reductions$harmony@cell.embeddings\n harm.lvl.backcalc <- harm.embeds %*% t(ppldngs)\n \n # Replace SCT scale.data expression with backcalculated data\n object$SCT@scale.data <- t(harm.lvl.backcalc)\n \n #harm_res <- list(harm.object = object, harm.tsne = g1, harm.umap = g2)\n \n return(object)\n}\n\n\n", + "columns": [ + { + "key": "Batch_Variable", + "displayName": "Batch Variable", + "description": "Account for this particular variable (within seurat metadata) when running batch correction", + "paramGroup": "Batch Correction", + "sourceDataset": "Metadata", + "defaultValue": null, + "columnType": null, + "isMulti": null + } + ], + "condaDependencies": [], + "description": "Perform batch correction on scRNA-seq data using the Harmony package. The resulting Seurat Object will contain the Batch Corrected data, and new t-SNE & UMAP visualizations will be produced. [View Documentation](https://nidap.nih.gov/workspace/notepad/view/ri.notepad.main.notepad.4e4e30bd-ff0d-4e82-af50-046675fe9a30)", + "externalId": "Batch_Correction_with_Harmony_CCBR_scRNA_seq_", + "inputDatasets": [ + { + "key": "Seurat_Object", + "displayName": "Seurat Object", + "description": "Input Seurat Object containing gene expression data and meta.data with batch information", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_TRANSFORM_INPUT", + "tags": [] + }, + { + "key": "Metadata", + "displayName": "Metadata", + "description": "", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "Variable_Features", + "displayName": "Variable Features", + "description": "Number of most variable genes to subset the gene expression data by", + "paramType": "NUMBER", + "paramGroup": "Batch Correction", + "paramValues": null, + "defaultValue": "2000", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Genes_to_Add", + "displayName": "Genes to Add", + "description": "Include genes that might not be found among variably expressed genes", + "paramType": "VECTOR", + "paramGroup": "Batch Correction", + "paramValues": null, + "defaultValue": "c(\"Epcam\",\"EPCAM\")", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Principal_Components", + "displayName": "Principal Components", + "description": "The number of principal components that the dimensional reductions (tSNE & UMAP) will use. We recommend using at least 30 PCs, but you can add more. However, please note that using more PCs will require more computational time to run -- sometimes significantly more.", + "paramType": "NUMBER", + "paramGroup": "Batch Correction", + "paramValues": null, + "defaultValue": "30", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Seurat_Object_Filename", + "displayName": "Seurat Object Filename", + "description": "Name of RDS file containing Seurat Object. Default is seurat_object.rds", + "paramType": "STRING", + "paramGroup": "Filesave", + "paramValues": null, + "defaultValue": "seurat_object.rds", + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "Batch Correction with Harmony [CCBR] [scRNA-seq]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/inst/extdata/NIDAPjson/Cell_Annotation_with_Co_Expression_CCBR_scRNA_seq_.code-template.json b/inst/extdata/NIDAPjson/Cell_Annotation_with_Co_Expression_CCBR_scRNA_seq_.code-template.json new file mode 100644 index 0000000..8293a40 --- /dev/null +++ b/inst/extdata/NIDAPjson/Cell_Annotation_with_Co_Expression_CCBR_scRNA_seq_.code-template.json @@ -0,0 +1,334 @@ +{ + "codeTemplate": "CoExpression_SO <- function({{{seurat_object}}},{{{sample_names}}}) { # produces 2 color channels and the overlay\n\n ## --------- ##\n ## Libraries ##\n ## --------- ##\n\n library(nidapFunctions)\n nidapLoadPackages(c(\"SCWorkflow\",\"Seurat\",\"tibble\",\"dplyr\",\"ggplot2\",\"ggExtra\",\"grid\",\"gridExtra\",\"scales\"))\n\n ## -------------------------------- ##\n ## User-Defined Template Parameters ##\n ## -------------------------------- ##\n \n #Primary inputs:\n seurat_object <- {{{seurat_object}}}\n\n #Basic Parameters:\n samples <- {{{samples_to_include}}}\n marker1 <- \"{{{marker_1}}}\"\n marker_1_threshold <- {{{Marker_1_Threshold}}}\n marker_1_type <- \"{{{Marker_1_Assay}}}\"\n marker2 <- \"{{{marker_2}}}\"\n marker_2_threshold <- {{{Marker_2_Threshold}}}\n marker_2_type <- \"{{{Marker_2_Assay}}}\"\n \n #Filter Parameters:\n filter_data <- TRUE\n parameter_name <- \"{{{New_Metadata_Column_Name}}}\"\n marker.1.filter.direction <- \"{{{Marker_1_Filter_Direction}}}\"\n marker.2.filter.direction <- \"{{{Marker_2_Filter_Direction}}}\"\n apply_filter_1 <- {{{Apply_Marker_1_Filter}}}\n apply_filter_2 <- {{{Apply_Marker_2_Filter}}}\n filter_condition <- {{{Filter_Type}}}\n \n #Visualization Parameters:\n data_reduction <- \"{{{data_reduction}}}\"\n add_marker_thresholds <- {{{Add_Marker_Thresholds}}}\n point_size <- {{{Point_Size}}}\n point_shape <- {{{Point_Shape}}}\n point_transparency <- {{{point_transparency}}}\n\n #Advanced Parameters:\n trim_marker_1 <- {{{Trim_Marker_1}}}\n trim_marker_2 <- {{{Trim_Marker_2}}}\n pre_scale_trim <- {{{pre_scale_trim}}} \n display_unscaled_values <- {{{Display_Unscaled_Values}}}\n seurat_object_filename <- \"{{{Seurat_Object_Filename}}}\"\n\n ## -------------------------------- ##\n ## Functions ##\n ## -------------------------------- ##\n \n path <- nidapGetPath(seurat_object, seurat_object_filename)\n so <- readRDS(path)\n \n #In case of NIDAPism:\n colnames(so@meta.data)[colnames(so@meta.data) == \"orig_ident\"] <- \"orig.ident\"\n\n so.result <- dualLabeling(object = so,\n samples = samples,\n marker.1 = marker1,\n marker.2 = marker2,\n marker.1.type = marker_1_type,\n marker.2.type = marker_2_type,\n data.reduction = data_reduction,\n point.size = point_size,\n point.shape = point_shape,\n point.transparency = point_transparency,\n add.marker.thresholds = add_marker_thresholds,\n marker.1.threshold = marker_1_threshold,\n marker.2.threshold = marker_2_threshold,\n filter.data = filter_data,\n marker.1.filter.direction = marker.1.filter.direction,\n marker.2.filter.direction = marker.2.filter.direction,\n apply.filter.1 = apply_filter_1,\n apply.filter.2 = apply_filter_2,\n filter.condition = filter_condition,\n parameter.name = parameter_name,\n trim.marker.1 = trim_marker_1,\n trim.marker.2 = trim_marker_2,\n pre.scale.trim = pre_scale_trim,\n display.unscaled.values = display_unscaled_values) \n\n #First plot showing tSNE or UMAP \nif (data_reduction=='tsne'|data_reduction=='umap') { \n \n grid.draw(so.result$plot)\n\n } else if (data_reduction=='both'){\n \n grid.draw(so.result$plot_umap)\n grid.newpage()\n grid.draw(so.result$plot_tsne)\n }\n\n\n\n #First plot showing Density Heatmap\n grid.newpage()\n grid.draw(so.result$plot_densityHM)\n\n #Second plot showing numbers of cells annotated for filtering\n g <- so.result$plot_table\n g$width <- g$width * 2\n g$height <- g$height * 2\n grid.newpage()\n grid.draw(g)\n\n output <- new.output()\n output_fs <- output$fileSystem()\n saveRDS(so.result$object, output_fs$get_path(\"seurat_object.rds\", 'w'))\n\n return(so.result$object)\n}\n\n\n#################################################\n## Global imports and functions included below ##\n#################################################\n\n# Functions defined here will be available to call in\n# the code for any table.\n\ndualLabeling <- function (object, \n samples, \n marker.1, \n marker.2, \n marker.1.type = \"SCT\", \n marker.2.type = \"SCT\", \n data.reduction = \"both\", \n point.size = 0.5, \n point.shape = 16, \n point.transparency = 0.5, \n add.marker.thresholds = TRUE, \n marker.1.threshold = 0.5, \n marker.2.threshold = 0.5, \n filter.data = TRUE, \n marker.1.filter.direction = \"greater than\", \n marker.2.filter.direction = \"greater than\", \n apply.filter.1 = TRUE, \n apply.filter.2 = TRUE, \n filter.condition = TRUE, \n parameter.name = \"My_CoExp\", \n trim.marker.1 = FALSE, \n trim.marker.2 = FALSE, \n pre.scale.trim = 0.99, \n display.unscaled.values = FALSE) \n{\n \n #### Error Messages ####\n \n #Errors for genes not available in dataset/slot\n if (!(marker.1 %in% rownames(object))) {\n stop(sprintf(\"%s is not found in dataset\", marker.1))\n }\n if (!(marker.2 %in% rownames(object))) {\n stop(sprintf(\"%s is not found in dataset\", marker.2))\n }\n if (!(marker.1.type %in% names(object@assays))) {\n stop(sprintf(\"%s slot is not found in dataset\", marker.1.type))\n }\n if (!(marker.2.type %in% names(object@assays))) {\n stop(sprintf(\"%s slot is not found in dataset\", marker.2.type))\n }\n if (data.reduction=='both') {\n if(sum(c('tsne','umap')%in%names(object@reductions))<2){\n rdctns=names(object@reductions)[names(object@reductions)%in%c('umap','tsne')]\n stop(sprintf(\"Object does not contain both umap and tsne reductions.\n Change Data Reduction parameter to %s\",\n paste(rdctns,collapse=' or ')\n )\n )\n }\n }else{ \n if (data.reduction%in%names(object@reductions)==F){\n stop(sprintf(\"Object does not contain %s reduction. \\n \",\n data.reduction),\n sprintf(\"Change Data Reduction parameter to %s\",\n c('tsne','umap')[c('tsne','umap')%in%names(object@reductions)])\n )\n }\n }\n #### Functions ####\n \n #Function for drawing overlay images for umap/tsne:\n .ggOverlay <- function(so.sub, df, marker.1, marker.2,reduction) {\n df <- df %>% arrange(mark1.scale)\n \n xmin <- min(df$dr1) - 0.1 * min(df$dr1)\n xmax <- max(df$dr1) + 0.1 * min(df$dr1)\n \n #ggplot for umap/tsne (marker 1)\n gg.z1 <- ggplot(df, aes(dr1, dr2)) + \n geom_point(\n color = rgb(\n red = df$mark1.scale, \n green = 0, \n blue = 0\n ), \n shape = point.shape, \n size = point.size, \n alpha = point.transparency\n ) + \n theme_classic() + \n xlab(paste0(reduction, \"-1\")) + \n ylab(paste0(reduction, \"-2\")) + \n ggtitle(marker.1) + \n coord_fixed()\n \n df <- df %>% arrange(mark2.scale)\n \n #ggplot for umap/tsne (marker 2)\n gg.z2 <- ggplot(df, aes(dr1, dr2)) + \n geom_point(\n color = rgb(\n red = 0, \n green = df$mark2.scale, \n blue = 0\n ), \n shape = point.shape, \n size = point.size, \n alpha = point.transparency\n ) + \n theme_classic() + \n xlab(paste0(reduction, \"-1\")) + \n ylab(paste0(reduction, \"-2\")) + \n ggtitle(marker.2) + \n coord_fixed()\n \n df <- df %>% \n mutate(avg = mark2.scale + mark1.scale) %>% \n arrange(avg)\n \n #ggplot for umap/tsne (marker 1 & marker 2)\n gg <- ggplot(df, aes(dr1, dr2)) + \n geom_point(\n color = rgb(\n red = df$mark1.scale, \n green = df$mark2.scale, \n blue = 0\n ), \n shape = point.shape, \n size = point.size, \n alpha = point.transparency\n ) + \n theme_classic() + \n xlab(paste0(reduction, \"-1\")) + \n ylab(paste0(reduction, \"-2\")) + \n ggtitle(\"Combined\") + \n coord_fixed()\n \n return(list(gg.z1, gg.z2, gg))\n }\n\n #Function for plotting expression data in xy overlay format:\n .ggOverlay2 <- function(so.sub, df, marker.1, marker.2) {\n df <- df %>% arrange(mark1.scale)\n # Create unscaled axis labels\n \n if (display.unscaled.values == TRUE) {\n label1.min <- \n paste(\"unscaled min:\", round(min(mark1),digits = 2))\n label1.max <- paste(\"unscaled max:\", round(max(mark1), digits = 2))\n label1 <- \n paste(as.character(marker.1), label1.min, label1.max, sep = \"\\n\")\n \n label2.min <- \n paste(\"unscaled min:\", round(min(mark2), digits = 2))\n label2.max <- \n paste(\"unscaled max:\", round(max(mark2), digits = 2))\n label2 <- \n paste(as.character(marker.2), label2.min, label2.max, sep = \"\\n\")\n } else {\n label1 <- as.character(marker.1)\n label2 <- as.character(marker.2)\n }\n \n #ggplot for scatter plot (marker 1)\n gg.z1 <- ggplot(df, aes(mark1.scale, mark2.scale)) + \n geom_point(\n color = rgb(\n red = df$mark1.scale, \n green = 0, \n blue = 0\n ), \n shape = 20, \n size = point.size\n ) + \n theme_classic() + \n xlab(label1) + \n ylab(label2) + \n coord_fixed()\n \n df <- df %>% arrange(mark2.scale)\n \n #ggplot for scatter plot (marker 2)\n gg.z2 <- ggplot(df, aes(mark1.scale, mark2.scale)) + \n geom_point(\n color = rgb(\n red = 0, \n green = df$mark2.scale, \n blue = 0\n ), \n shape = 20, \n size = point.size\n ) + \n theme_classic() + \n xlab(label1) + \n ylab(label2) + \n coord_fixed()\n \n df <- df %>% \n mutate(avg = mark2.scale + mark1.scale) %>% \n arrange(avg)\n \n #ggplot for scatter plot (marker 1 & marker.2)\n gg <- ggplot(df, aes(mark1.scale, mark2.scale)) + \n geom_point(\n color = rgb(\n red = df$mark1.scale, \n green = df$mark2.scale, \n blue = 0\n ), \n shape = 20, \n size = point.size\n ) + \n theme_classic() + \n xlab(label1) + \n ylab(label2) + \n coord_fixed()\n \n if (add.marker.thresholds == TRUE) {\n gg.z1 <- gg.z1 + \n geom_vline(xintercept = t1, linetype = \"dashed\") + \n geom_hline(yintercept = t2, linetype = \"dashed\")\n gg.z2 <- gg.z2 + \n geom_vline(xintercept = t1, linetype = \"dashed\") + \n geom_hline(yintercept = t2, linetype = \"dashed\")\n gg <- gg + \n geom_vline(xintercept = t1, linetype = \"dashed\") + \n geom_hline(yintercept = t2, linetype = \"dashed\")\n }\n \n return(list(gg.z1, gg.z2, gg))\n }\n \n ## --------------- ##\n ## Main Code Block ##\n ## --------------- ##\n \n # Load and subset data using sample names\n \n if (\"active.ident\" %in% slotNames(object)) {\n sample.name <- as.factor(object@meta.data$orig.ident)\n names(sample.name) <- names(object@active.ident)\n object@active.ident <- as.factor(vector())\n object@active.ident <- sample.name\n so.sub <- subset(object, ident = samples)\n } else {\n sample.name <- as.factor(object@meta.data$orig.ident)\n names(sample.name) <- names(object@active.ident)\n object@active.ident <- as.factor(vector())\n object@active.ident <- sample.name\n so.sub <- subset(object, ident = samples)\n }\n t1 <- marker.1.threshold\n t2 <- marker.2.threshold\n \n \n #Select marker 1 values and scale:\n # use data slot for Spatial assay\n if(marker.1.type == \"Spatial\"){\n mark1 <- so.sub@assays[[marker.1.type]]@data[marker.1,]\n } else {\n mark1 <- so.sub@assays[[marker.1.type]]@scale.data[marker.1,]\n }\n if (trim.marker.1 == TRUE) {\n q1 <- quantile(mark1, pre.scale.trim)\n q0 <- quantile(mark1, 1 - pre.scale.trim)\n mark1[mark1 < q0] <- q0\n mark1[mark1 > q1] <- q1\n }\n mark1.scale <- rescale(mark1, to = c(0, 1))\n \n #Select marker 2 values and scale:\n if(marker.2.type == \"Spatial\"){\n mark2 <- so.sub@assays[[marker.2.type]]@data[marker.2, ]\n } else {\n mark2 <- so.sub@assays[[marker.2.type]]@scale.data[marker.2, ]\n }\n\n if (trim.marker.2 == TRUE) {\n q1 <- quantile(mark2, pre.scale.trim)\n q0 <- quantile(mark2, 1 - pre.scale.trim)\n mark2[mark2 < q0] <- q0\n mark2[mark2 > q1] <- q1\n }\n mark2.scale <- rescale(mark2, to = c(0, 1))\n \n \n \n if (data.reduction=='tsne'|data.reduction=='umap') {\n \n #Draw Plots:\n df <- data.frame(\n cbind(\n dr1 = so.sub@reductions[[data.reduction]]@cell.embeddings[,1], \n dr2 = so.sub@reductions[[data.reduction]]@cell.embeddings[,2], \n mark1.scale, \n mark2.scale\n )\n )\n \n gg.list <- .ggOverlay(so.sub, df, marker.1, marker.2,data.reduction)\n gg.list2 <- .ggOverlay2(so.sub, df, marker.1, marker.2)\n \n grob <- \n arrangeGrob(gg.list[[1]], \n gg.list[[2]], \n gg.list[[3]],\n gg.list2[[1]], \n gg.list2[[2]], \n gg.list2[[3]], \n ncol = 3)\n \n \n } else if (data.reduction=='both'){\n \n #Draw Plots:\n df.u <- data.frame(\n cbind(\n dr1 = so.sub@reductions[['umap']]@cell.embeddings[,1], \n dr2 = so.sub@reductions[['umap']]@cell.embeddings[,2], \n mark1.scale, \n mark2.scale\n )\n )\n gg.list.u <- .ggOverlay(so.sub, df.u, marker.1, marker.2,'umap')\n \n \n #Draw Plots:\n df.t <- data.frame(\n cbind(\n dr1 = so.sub@reductions[['tsne']]@cell.embeddings[,1], \n dr2 = so.sub@reductions[['tsne']]@cell.embeddings[,2], \n mark1.scale, \n mark2.scale\n )\n )\n gg.list.t <- .ggOverlay(so.sub, df.t, marker.1, marker.2,'tsne')\n \n \n ## df.u being used is arbitrary. only difference between df.u and df.t is \n ## reduction columns which are not being used by ggOverlay2\n df=df.u[,colnames(df.u)%in%c('dr1','dr2')==F]\n \n gg.list2 <- .ggOverlay2(so.sub, df, marker.1, marker.2)\n \n \n grob.u <- \n arrangeGrob(gg.list.u[[1]], \n gg.list.u[[2]], \n gg.list.u[[3]],\n gg.list2[[1]], \n gg.list2[[2]], \n gg.list2[[3]], \n ncol = 3)\n grob.t <- \n arrangeGrob(gg.list.t[[1]], \n gg.list.t[[2]], \n gg.list.t[[3]],\n gg.list2[[1]], \n gg.list2[[2]], \n gg.list2[[3]], \n ncol = 3)\n \n } else {\n stop(\"Incorrect selection for data.reduction: use either umap,tsne or both\")\n }\n \n x = df$mark1.scale\n y = df$mark2.scale\n\n df_heatmap <- data.frame(\n x = x, \n y = y, \n d <- densCols(\n x, \n y, \n nbin = 1000, \n bandwidth = 1, \n colramp <- \n colorRampPalette(rev(rainbow(10, end = 4/6)))\n )\n )\n \n p <- ggplot(df_heatmap) + \n geom_point(aes(x, y, col = d), size = 1) + \n scale_color_identity() + xlab(marker.1) + ylab(marker.2) + \n theme_bw() + \n geom_vline(xintercept = t1, linetype = \"dashed\") + \n geom_hline(yintercept = t2, linetype = \"dashed\") \n \n p2 <- ggMarginal(p, df_heatmap, x = marker.1, y = marker.2, type = \"density\")\n\n\n grobHM <- \n arrangeGrob(p2,ncol=1,nrow=1)\n \n \n #Applying Filters to Data using Thresholds:\n if (filter.data == TRUE && \n (apply.filter.1 == TRUE | apply.filter.2 == TRUE)\n ){\n df <- df %>% mutate(sample = so.sub@meta.data$orig.ident) %>% \n mutate(cellbarcode = rownames(so.sub@meta.data))\n \n if (marker.1.filter.direction == \"greater than\") {\n ind1 <- df$mark1.scale > t1\n } else {\n ind1 <- df$mark1.scale < t1\n }\n \n cat(\"\\n\")\n print(\"Marker 1 filter:\")\n print(sum(ind1))\n \n if (marker.2.filter.direction == \"greater than\") {\n ind2 <- df$mark2.scale > t2\n } else {\n ind2 <- df$mark2.scale < t2\n }\n \n cat(\"\\n\")\n print(\"Marker 2 filter:\")\n print(sum(ind2))\n \n if (apply.filter.1 == TRUE) {\n if (apply.filter.2 == TRUE) {\n if (filter.condition == TRUE) {\n df <- df[c(ind1 & ind2), ]\n } else {\n df <- df[c(ind1 | ind2), ]\n }\n } else {\n df <- df[ind1, ]\n }\n } else {\n if (apply.filter.2) {\n df <- df[ind2, ]\n }\n }\n \n \n # Print out numbers of cells that meet threshold cutoffs for marker 1,\n # marker 2 and for either intersection or union of 2 thresholds:\n \n colnames(df)[1:2] <- c(marker.1, marker.2)\n so.sub.df <- so.sub@meta.data %>% \n mutate(x = case_when(\n rownames(so.sub@meta.data) %in% df$cellbarcode ~ TRUE, \n TRUE ~ FALSE\n ))\n \n colnames(so.sub.df) <- sub(\"x\", parameter.name, \n colnames(so.sub.df))\n \n data.filt <- \n as.data.frame.matrix(table(so.sub.df[[parameter.name]], \n so.sub.df$orig.ident))\n data.filt$Total <- rowSums(data.filt)\n data.filt <- data.filt %>% rownames_to_column(\"Passed Filter\")\n \n # Add a title:\n if (filter.condition == TRUE) {\n cond = \"and\"\n } else {\n cond = \"or\"\n }\n \n if (apply.filter.1 == TRUE) {\n if (apply.filter.2 == TRUE) {\n titlename <- paste(\n \"Number of cells that pass filters:\\n\", \n marker.1, \n marker.1.filter.direction, \n marker.1.threshold, \n cond, \n marker.2, \n marker.2.filter.direction, \n marker.2.threshold\n )\n } else {\n titlename <- paste(\n \"Number of cells that pass filter:\\n\", \n marker.1, \n marker.1.filter.direction, \n marker.1.threshold\n )\n }\n } else {\n titlename <- paste(\n \"Number of cells that pass filter:\\n\",\n marker.2, \n marker.2.filter.direction, \n marker.2.threshold\n )\n }\n \n title <- \n textGrob(\n titlename,\n y = 1,\n vjust = 1, \n gp = gpar(fontsize = 15)\n )\n grid.table <- tableGrob(data.filt, rows = NULL)\n g <- arrangeGrob(grid.table, top = title)\n g$heights[[2]] <- unit(0.5, \"npc\") - max(g$grobs[[1]]$heights)\n \n rownames(so.sub.df) <- rownames(so.sub@meta.data)\n so.sub@meta.data <- so.sub.df\n } else {\n g <- textGrob(\"No filtering thresholds applied\")\n }\n \n \n if (data.reduction=='tsne'|data.reduction=='umap') {\n \n result.list <- list(object = so.sub, \n plot = grob,\n plot_densityHM = grobHM,\n plot_table = g)\n \n \n } else if (data.reduction=='both'){\n \n result.list <- list(object = so.sub, \n plot_tsne = grob.t,\n plot_umap = grob.u,\n plot_densityHM = grobHM,\n plot_table = g)\n }\n\n \n return(result.list)\n}\n\n\n", + "columns": [ + { + "key": "samples_to_include", + "displayName": "Samples to Include", + "description": "Select which samples to include.", + "paramGroup": "Select Markers", + "sourceDataset": "sample_names", + "defaultValue": null, + "columnType": "ALL", + "isMulti": true + } + ], + "condaDependencies": [], + "description": "Display co-expression of two chosen markers in your Seurat Object. Creates a metadata column containing annotations for cells that correspond to the marker expression thresholds you set. Final Potomac Compatible Version: v93. Final Sugarloaf V1: v112. [View Documentation](https://nidap.nih.gov/workspace/notepad/view/ri.notepad.main.notepad.c01f91b3-a6e2-4862-845c-929298375f5b)", + "externalId": "Cell_Annotation_with_Co_Expression_CCBR_scRNA_seq_", + "inputDatasets": [ + { + "key": "seurat_object", + "displayName": "Seurat Object", + "description": "Select an input Seurat Object.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_TRANSFORM_INPUT", + "tags": [] + }, + { + "key": "sample_names", + "displayName": "Sample Names", + "description": "Select an input dataset containing a table with sample names as column headers. Sample names must match the orig.idents in the input Seurat Object. This table can be created using the \"Get Sample Names\" template.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "marker_1", + "displayName": "Marker 1", + "description": "", + "paramType": "STRING", + "paramGroup": "Select Markers", + "paramValues": null, + "defaultValue": "FOXP3", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Marker_1_Threshold", + "displayName": "Marker 1 Threshold", + "description": "", + "paramType": "NUMBER", + "paramGroup": "Select Markers", + "paramValues": null, + "defaultValue": "0.5", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Marker_1_Assay", + "displayName": "Marker 1 Assay", + "description": "Provide a Gene Symbol, set a threshold and the Seurat Object Assay to display expression values for Marker 1.", + "paramType": "SELECT", + "paramGroup": "Select Markers", + "paramValues": [ + "SCT", + "RNA", + "Protein", + "Spatial", + "HTO" + ], + "defaultValue": "SCT", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "marker_2", + "displayName": "Marker 2", + "description": "", + "paramType": "STRING", + "paramGroup": "Select Markers", + "paramValues": null, + "defaultValue": "CD25", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Marker_2_Threshold", + "displayName": "Marker 2 Threshold", + "description": "", + "paramType": "NUMBER", + "paramGroup": "Select Markers", + "paramValues": null, + "defaultValue": "0.5", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Marker_2_Assay", + "displayName": "Marker 2 Assay", + "description": "Provide a Gene Symbol, set a threshold and select the Seurat Object Assay to display expression values for Marker 2.", + "paramType": "SELECT", + "paramGroup": "Select Markers", + "paramValues": [ + "SCT", + "RNA", + "Protein", + "Spatial", + "HTO" + ], + "defaultValue": "SCT", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "New_Metadata_Column_Name", + "displayName": "New Metadata Column Name", + "description": "Provide a name for the new metadata column created by applying the marker filters. Default is \"My_CoExp\".", + "paramType": "STRING", + "paramGroup": "Select Markers", + "paramValues": null, + "defaultValue": "My_CoExp", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Marker_1_Filter_Direction", + "displayName": "Marker 1 Filter Direction", + "description": "Filter to samples that have greater or less than Marker 1 Threshold. Default is greater than.", + "paramType": "SELECT", + "paramGroup": "Filter by Marker Expression", + "paramValues": [ + "greater than", + "less than" + ], + "defaultValue": "greater than", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Marker_2_Filter_Direction", + "displayName": "Marker 2 Filter Direction", + "description": "Filter to samples that have greater or less than Marker 2 Threshold. Default is greater than.", + "paramType": "SELECT", + "paramGroup": "Filter by Marker Expression", + "paramValues": [ + "greater than", + "less than" + ], + "defaultValue": "greater than", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Apply_Marker_1_Filter", + "displayName": "Apply Marker 1 Filter", + "description": "If TRUE, apply the Marker 1 Threshold as a filter. Set to FALSE to turn this filter off. Default is TRUE.", + "paramType": "BOOLEAN", + "paramGroup": "Filter by Marker Expression", + "paramValues": null, + "defaultValue": "TRUE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Apply_Marker_2_Filter", + "displayName": "Apply Marker 2 Filter", + "description": "If TRUE, apply the Marker 2 Threshold as a filter. Set to FALSE to turn this filter off. Default is TRUE.", + "paramType": "BOOLEAN", + "paramGroup": "Filter by Marker Expression", + "paramValues": null, + "defaultValue": "TRUE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Filter_Type", + "displayName": "Filter Type", + "description": "If TRUE, apply both Filters 1 and 2 and take the intersection. If FALSE, apply both filters and take the union. Default is TRUE.", + "paramType": "BOOLEAN", + "paramGroup": "Filter by Marker Expression", + "paramValues": null, + "defaultValue": "TRUE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "data_reduction", + "displayName": "Data Reduction", + "description": "Select the dimensionality reduction type to display on the visualization. Options include UMAP and tSNE. Default is both.", + "paramType": "SELECT", + "paramGroup": "Visualization", + "paramValues": [ + "umap", + "tsne", + "both" + ], + "defaultValue": "both", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Add_Marker_Thresholds", + "displayName": "Add Marker Thresholds", + "description": "Add dashed lines showing the Thresholds for Markers 1 and 2 to the three dual expression scatterplots. Set to FALSE to turn these dashed lines off. Default is TRUE.", + "paramType": "BOOLEAN", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "TRUE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Point_Shape", + "displayName": "Point Shape", + "description": "Set the shape of the points in the visualization. 16: Medium, 19: Large, 20: Small.", + "paramType": "SELECT", + "paramGroup": "Visualization", + "paramValues": [ + "16", + "19", + "20" + ], + "defaultValue": "16", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Point_Size", + "displayName": "Point Size", + "description": "Set the size of the points in the visualization.", + "paramType": "NUMBER", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "0.5", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "point_transparency", + "displayName": "Point Transparency", + "description": "Set the transparency of the points on the visualization. Default is 0.5.", + "paramType": "NUMBER", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "0.5", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "pre_scale_trim", + "displayName": "Pre-Scale Trim", + "description": "Set trimming percentile values.", + "paramType": "NUMBER", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "0.99", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Trim_Marker_1", + "displayName": "Trim Marker 1", + "description": "Set to TRUE to trim top and bottom percentile of Marker 1 signal to pre-scale trim values (below) to remove extremely low and high values. Default is FALSE.", + "paramType": "BOOLEAN", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Trim_Marker_2", + "displayName": "Trim Marker 2", + "description": "Set to TRUE to trim top and bottom percentile of Marker 2 signal to pre-scale trim values to remove extremely low and high values. Default is FALSE.", + "paramType": "BOOLEAN", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Display_Unscaled_Values", + "displayName": "Display Unscaled Values", + "description": "Toggle to TRUE if you want to view the unscaled gene/protein expression values. Default is FALSE.", + "paramType": "BOOLEAN", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Seurat_Object_Filename", + "displayName": "Seurat Object Filename", + "description": "Filename of the RDS that holds the Seurat object.", + "paramType": "STRING", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "seurat_object.rds", + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "Cell Annotation with Co-Expression [CCBR] [scRNA-seq]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/inst/extdata/NIDAPjson/Cell_Annotation_with_Module_Scores_CCBR_scRNA_seq_.code-template.json b/inst/extdata/NIDAPjson/Cell_Annotation_with_Module_Scores_CCBR_scRNA_seq_.code-template.json new file mode 100644 index 0000000..c82ea3f --- /dev/null +++ b/inst/extdata/NIDAPjson/Cell_Annotation_with_Module_Scores_CCBR_scRNA_seq_.code-template.json @@ -0,0 +1,163 @@ +{ + "codeTemplate": "ModuleScores_SO <- function({{{Seurat_Object}}},{{{Marker_Table}}},{{{Levels_Data_Frame}}}) {\n\n ## --------- ##\n ## Libraries ##\n ## --------- ##\n\n library(nidapFunctions)\n nidapLoadPackages(\"SCWorkflow\")\n\n ## -------------------------------- ##\n ## User-Defined Template Parameters ##\n ## -------------------------------- ##\n\n #Primary Inputs:\n seurat_object = {{{Seurat_Object}}}\n marker_table <- {{{Marker_Table}}}\n levels_data_frame <- {{{Levels_Data_Frame}}}\n\n #Basic Parameters:\n celltype_to_analyze <- {{{Celltypes_to_Analyze}}}\n signature_threshold <- {{{Manual_Thresholds}}}\n general_class <- {{{General_Class}}}\n multi_level_class <- {{{Multi_Level_Classes}}}\n\n #Plot Parameters:\n reduction = \"{{{Reduction}}}\"\n nbins <- {{{Nbins}}}\n gradient_density_font_size <- {{{Gradient_Density_Font_Size}}}\n violinplot_font_size <- {{{Violinplot_Font_Size}}}\n step_size <- {{{Step_Size}}}\n \n #Advanced Parameters:\n seurat_object_filename <- \"{{{Seurat_Object_Filename}}}\"\n\n ## --------------- ##\n ## Main Code Block ##\n ## --------------- ##\n\n path <- nidapGetPath(seurat_object,seurat_object_filename)\n so <- readRDS(path)\n\n MS_res <- modScore(object = so,\n marker.table = marker_table,\n use_columns = celltype_to_analyze,\n ms_threshold = signature_threshold,\n general.class = general_class,\n multi.lvl = multi_level_class,\n lvl.df = levels_data_frame,\n reduction = reduction,\n nbins = nbins,\n gradient.ft.size = gradient_density_font_size,\n violin.ft.size = violinplot_font_size,\n step.size = step_size)\n\n output <- new.output()\n output_fs <- output$fileSystem()\n saveRDS(MS_res, output_fs$get_path(\"seurat_object.rds\", 'w'))\n\n return(NULL)\n}\n#################################################\n## Global imports and functions included below ##\n#################################################\n\nmodScore <- function(object, marker.table, ms_threshold, use_columns,\n general.class, multi.lvl = FALSE, lvl.df, \n reduction = \"tsne\", nbins = 10, gradient.ft.size = 6, \n violin.ft.size = 6, step.size = 0.1) \n{\n library(Seurat)\n library(gridExtra)\n library(grid)\n library(dplyr)\n library(stringr)\n library(ggplot2)\n\n # Function for separating and calling cells by bimodal thresholds\n .modScoreCall <- function(ms.meta, numeric_threshold, reject) {\n thres.ls <- list()\n for (i in 1:ncol(ms.meta)) {\n thres.ls[[i]] <- rep(numeric_threshold[i], nrow(ms.meta))\n }\n thres.df <- data.frame(matrix(unlist(thres.ls), nrow = nrow(ms.meta)))\n thres.filter <- ms.meta > thres.df\n ms.meta.filt <- ms.meta * thres.filter\n max.col.vec <- max.col(ms.meta.filt)\n zero.filt <- as.integer(!apply(ms.meta.filt, 1, function(find_zero_rows) all(find_zero_rows == 0)))\n final.filt <- (max.col.vec * zero.filt) + 1\n append.name <- c(reject, names(ms.meta))\n dupl.data <- ms.meta\n dupl.data[, \"MS_Celltype\"] <- append.name[final.filt]\n return(dupl.data)\n }\n\n # Upstream processing\n # String split celltype_thresholds - numeric portion\n numeric_threshold <- sapply(stringr::str_split(ms_threshold, \" \"), function(x) as.numeric(x[2]))\n\n if (!\"Barcode\" %in% colnames(object@meta.data)) {\n object@meta.data$Barcode <- rownames(object@meta.data)\n }\n colnames(object@meta.data) <- gsub(\"orig_ident\", \"orig.ident\", \n colnames(object@meta.data))\n \n # Marker table processing\n marker.table <- marker.table[,use_columns]\n marker.tab <- unlist(marker.table)\n celltypes <- sapply(str_split(ms_threshold, \" \"), function(x) as.character(x[1]))\n\n if (any(!celltypes %in% use_columns)){\n unmatched_celltypes <- celltypes[!celltypes %in% use_columns]\n celltype_mismatch_message <- paste0(\"Labels from thresholds does not match columns from marker table: \",paste(unmatched_celltypes, collapse = \", \"))\n stop(celltype_mismatch_message) \n }\n\n marker = select(marker.table, celltypes)\n marker.list = as.list(marker)\n if (sum(unlist(marker.list) %in% rownames(object@assays$SCT@data)) == \n 0) {\n stop(\"No genes from list was found in data\")\n }\n if (length(numeric_threshold) != length(celltypes)) {\n if (sum(numeric_threshold) == 0) {\n numeric_threshold <- rep(0, length(celltypes))\n print(\"Module Score threshold set to zero - outputing preliminary data\")\n } else {\n stop(\"Threshold length does not match # celltypes to analyze\")\n }\n }\n\n # For each celltype, print out present / nonpresent genes, calculate MS and generate plots\n names(numeric_threshold) <- celltypes\n figures <- list()\n exclude_cells <- c()\n h = 0\n j = 1\n for (h in seq_along(marker.list)) {\n print(names(marker.list[h]))\n present = lapply(marker.list[[h]], function(x) x %in% \n rownames(object@assays$SCT@data))\n absentgenes = unlist(marker.list[[h]])[present == FALSE]\n absentgenes = absentgenes[is.na(absentgenes) == F]\n presentgenes = unlist(marker.list[[h]])[present == TRUE]\n presentgenes = presentgenes[is.na(presentgenes) == F]\n print(paste0(\"Genes not present: \", paste0(absentgenes, \n collapse = \",\")))\n print(paste0(\"Genes present: \", paste0(presentgenes, \n collapse = \",\")))\n if (length(presentgenes) == 0) {\n print(paste0(names(marker.list[h]), \" genes were not found in object and will not be analyzed\"))\n exclude_cells[j] <- h\n j = j + 1\n }\n }\n # End of check present / absent genes\n\n if (length(exclude_cells) > 0) {\n marker.list <- marker.list[-exclude_cells]\n } else {\n marker.list <- marker.list\n }\n\n # Calculate MS, make density plots\n for (celltype_name in names(marker.list)) {\n object = AddModuleScore(object, marker.list[celltype_name], \n name = celltype_name, nbin = nbins, assay = \"SCT\")\n m = paste0(celltype_name, \"1\")\n object@meta.data[[m]] <- scales::rescale(object@meta.data[[m]], \n to = c(0, 1))\n\n # Do plots for just general (parent) celltypes\n if (celltype_name %in% general.class){\n clusid = object@meta.data[[m]]\n d <- density(clusid)\n\n # Make dimension reduction tables and plots\n if (reduction == \"tsne\") {\n p1 <- DimPlot(object, reduction = \"tsne\", group.by = \"ident\")\n } else if (reduction == \"umap\") {\n p1 <- DimPlot(object, reduction = \"umap\", group.by = \"ident\")\n } else {\n p1 <- DimPlot(object, reduction = \"pca\", group.by = \"ident\")\n }\n\n if (reduction == \"tsne\") {\n clusmat = data.frame(ident = p1$data$ident, umap1 = p1$data$tSNE_1, umap2 = p1$data$tSNE_2, clusid = as.numeric(object@meta.data[[m]]))\n } else if (reduction == \"umap\") {\n clusmat = data.frame(ident = p1$data$ident, umap1 = p1$data$UMAP_1, umap2 = p1$data$UMAP_2, clusid = as.numeric(object@meta.data[[m]]))\n } else {\n clusmat = data.frame(ident = p1$data$ident, umap1 = p1$data$PC_1, \n umap2 = p1$data$PC_2, clusid = as.numeric(object@meta.data[[m]]))}\n\n clusmat <- mutate(clusmat, sample_clusid = clusmat$clusid)\n umap.pos <- clusmat %>% group_by(clusid) %>% dplyr::summarise(umap1.mean = mean(umap1), umap2.mean = mean(umap2))\n title = as.character(m)\n clusmat <- clusmat %>% dplyr::arrange(clusid)\n clusid.df <- data.frame(id = object@meta.data$orig.ident, \n ModuleScore = object@meta.data[[m]])\n\n g <- ggplot(clusmat, aes(x = umap1, y = umap2)) + theme_bw() + \n theme(legend.title = element_blank()) + geom_point(aes(colour = sample_clusid), alpha = 0.5, shape = 20, size = 1) + scale_color_gradientn(colours = c(\"blue4\", \"lightgrey\", \"red\"), values = scales::rescale(c(0, \n numeric_threshold[celltype_name]/2, numeric_threshold[celltype_name], (numeric_threshold[celltype_name] + 1)/2, \n 1), limits = c(0, 1))) + guides(colour = guide_legend(override.aes = list(size = 5, alpha = 1))) + theme(panel.grid.major = element_blank(), \n panel.grid.minor = element_blank(), panel.background = element_blank()) + xlab(\"tsne-1\") + ylab(\"tsne-2\")\n\n g1 <- RidgePlot(object, features = m, group.by = \"orig.ident\") + \n theme(legend.position = \"none\", title = element_blank(), \n axis.text.x = element_text(size = gradient.ft.size)) + \n geom_vline(xintercept = numeric_threshold[celltype_name], linetype = \"dashed\", \n color = \"red3\") + scale_x_continuous(breaks = seq(0, \n 1, step.size))\n\n g2 <- ggplot(clusid.df, aes(x = id, y = ModuleScore)) + \n geom_violin(aes(fill = id)) + theme_classic() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), legend.title = element_blank(), panel.background = element_blank(), axis.text.x = element_blank(), legend.text = element_text(size = rel(0.8)), legend.position = \"top\", axis.text.y = element_text(size = violin.ft.size)) + \n guides(colour = guide_legend(override.aes = list(size = 5, \n alpha = 1))) + geom_hline(yintercept = numeric_threshold[celltype_name], \n linetype = \"dashed\", color = \"red3\") + scale_y_continuous(breaks = seq(0, 1, step.size))\n\n g3 <- ggplot(data.frame(x = d$x, y = d$y), aes(x, y)) + \n xlab(\"ModuleScore\") + ylab(\"Density\") + geom_line() + \n geom_segment(aes(xend = d$x, yend = 0, colour = x)) + \n scale_y_log10() + scale_color_gradientn(colours = c(\"blue4\", \n \"lightgrey\", \"red\"), values = scales::rescale(c(0, \n numeric_threshold[celltype_name]/2, numeric_threshold[celltype_name], (numeric_threshold[celltype_name] + 1)/2, \n 1), limits = c(0, 1))) + geom_vline(xintercept = numeric_threshold[celltype_name], \n linetype = \"dashed\", color = \"red3\") + geom_vline(xintercept = numeric_threshold[celltype_name], linetype = \"dashed\", color = \"red3\") + scale_x_continuous(breaks = seq(0, 1, step.size)) + theme(legend.title = element_blank(), \n axis.text.x = element_text(size = 6))\n\n figures[[celltype_name]] = arrangeGrob(g, g1, g2, g3, ncol = 2, top = textGrob(paste0(celltype_name,\" (General Class)\"), gp = gpar(fontsize = 14, fontface = \"bold\")))\n }\n }\n\n # Rename MS columns - get rid of \"1\" at the end\n colnames(object@meta.data)[colnames(object@meta.data) %in% \n paste0(names(marker.list), 1)] <- names(marker.list)\n\n # Heirarchical classification: general.class > subtypes\n general.class <- general.class[general.class %in% colnames(object@meta.data)]\n trunc.meta.gen <- object@meta.data[general.class]\n gen.thrs.vec <- numeric_threshold[general.class]\n call.res <- .modScoreCall(trunc.meta.gen, gen.thrs.vec, reject = \"unknown\")\n call.res$Barcode <- rownames(call.res)\n\n if (multi.lvl) {\n for (k in 1:ncol(lvl.df)) {\n\n sub.class.call <- list()\n store.sub.class <- lvl.df[[k]][!is.na(lvl.df[[k]])]\n parent.class <- unique(gsub(\"(.*)-(.*)\", \"\\\\1\", store.sub.class))\n\n for (parent in parent.class) {\n sub.class <- store.sub.class[grepl(parent, store.sub.class)]\n children_class <- gsub(\"(.*)-(.*)\", \"\\\\2\", sub.class)\n parents <- call.res$Barcode[call.res$MS_Celltype == \n parent]\n trunc.meta.parent <- object@meta.data[parents, \n ] %>% select(children_class)\n\n gap_ind <- which(names(figures) == parent)\n\n # Stop hierarchical classification in case no parent cell can be called\n if (nrow(trunc.meta.parent) == 0){\n stop(paste0(\"No \",parent,\" can be called in \",\"level \",k-1,\" classification, try setting more lenient thresholds\"))}\n\n for (child in children_class) {\n plot.title <- paste(\"Density plot for\", child, \n \"Module Scores within\", parent, \"population\", \n sep = \" \")\n\n figures <- append(figures, list(NA), after = gap_ind)\n\n figures[[gap_ind+1]] <- ggplot(trunc.meta.parent, aes_string(x = child)) + geom_density() + ggtitle(plot.title) + geom_vline(xintercept = numeric_threshold[child], linetype = \"dashed\", color = \"red3\") + theme_classic()\n names(figures)[gap_ind+1] <- child\n }\n\n trunc.meta.no.parent <- call.res[!call.res$MS_Celltype == \n parent, ]\n non.parent <- rownames(trunc.meta.no.parent)\n child.thres.vec <- numeric_threshold[children_class]\n\n sub.class.call[[match(parent, parent.class)]] <- .modScoreCall(trunc.meta.parent, child.thres.vec, reject = parent) %>% select(MS_Celltype)}\n\n sub.class.call <- do.call(rbind, sub.class.call)\n sub.class.call$Barcode <- rownames(sub.class.call)\n call.res$temp.call <- sub.class.call$MS_Celltype[match(call.res$Barcode, sub.class.call$Barcode)]\n call.res <- call.res %>% mutate(MS_Celltype = case_when(is.na(temp.call) ~ MS_Celltype, TRUE ~ temp.call))\n call.res$temp.call <- NULL\n }\n }\n\n object@meta.data$MS_Celltype <- call.res$MS_Celltype[match(object@meta.data$Barcode, call.res$Barcode)]\n\n lapply(figures, plot)\n\n return(object)\n}\n\n", + "columns": [ + { + "key": "Celltypes_to_Analyze", + "displayName": "Celltypes to Analyze", + "description": "Select specific columns within Marker Table to analyze. Markers from unselected columns won't be included.", + "paramGroup": null, + "sourceDataset": "Marker_Table", + "defaultValue": null, + "columnType": "ALL", + "isMulti": true + }, + { + "key": "General_Class", + "displayName": "General Class", + "description": "Select which of the classes (i.e. which columns) in your Marker Table represent the General Classes. A general class is any class that is not a subtype of another class.", + "paramGroup": null, + "sourceDataset": "Marker_Table", + "defaultValue": null, + "columnType": "STRING", + "isMulti": true + } + ], + "condaDependencies": [], + "description": "Screens data for cells based on user-specified cell markers. Outputs a seurat object with a metadata with averaged marker scores and annotated \"Likely_CellType\" column. Final Potomac Compatible Version: v165. Sugarloaf V1: v192. [View Documentation](https://nidap.nih.gov/workspace/notepad/view/ri.notepad.main.notepad.816e14fc-26b4-4a69-a051-f75b3ce7bf30)", + "externalId": "Cell_Annotation_with_Module_Scores_CCBR_scRNA_seq_", + "inputDatasets": [ + { + "key": "Seurat_Object", + "displayName": "Seurat Object", + "description": "Select an input Seurat Object.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_TRANSFORM_INPUT", + "tags": [] + }, + { + "key": "Marker_Table", + "displayName": "Marker Table", + "description": "A table of lists of gene/protein markers for the categories of cells you want to detect. The table should be formatted with cell type(s) as the column names, and marker(s) as the entries in each column. Requires SCT@data to be present within Seurat Object.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + }, + { + "key": "Levels_Data_Frame", + "displayName": "Levels Data Frame", + "description": "Dataframe containing levels information as well as parent-children designation (E.g. Tcells-CD4). Required if Multi Level Classification is turned on.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "Manual_Thresholds", + "displayName": "Manual Thresholds", + "description": "Allow user-specified module score thresholds. Provide one threshold for each Celltype you included in the \"Celltypes to Analyze\" parameter above. For each Celltype, provide the Celltype name, then a space, then type your threshold for that Celltype. This threshold must be a number between 0.0 and 1.0. E.g. \"Tcells 0.2\", \"Macrophages 0.37\". Click \"Add\" to add each subsequent threshold.\n\nFor best results, follow these steps: (1) Set thresholds at 0.0 for a preliminary view of data. (2) Use the resulting visualizations to estimate the correct thresholds for each Celltype. (3) Adjust your thresholds based on what you saw in the visualizations. (4) Re-run the template with the new thresholds. (5) Review the visualizations again and repeat Steps 1-5 if you think thresholds can be further improved.", + "paramType": "VECTOR", + "paramGroup": null, + "paramValues": null, + "defaultValue": "c()", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Multi_Level_Classes", + "displayName": "Multi-Level Classes", + "description": "Turn on if there are multiple subclasses of cells you would like to classify. Note: requires a manual entry table with columns specifying levels and comparisons. Each column of this table should represent one level of subclass within your General Classes. Each value within a column should be two Class names separated by a dash (-) showing the General-to-SubClass relationship.\n\nExample: To classify T-cells and then attempt to classify those T-cells further into either CD8 or CD4 T-cells, you would write a column named \"Level_1\", then add \"T_cell-CD8_T\" and \"T_cell-CD4_T\" to that column. Note that in this example, \"T_cell\" is a General Class and \"CD8_T\" and \"CD4_T\" are not.", + "paramType": "BOOLEAN", + "paramGroup": "Advanced Classification", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Reduction", + "displayName": "Reduction", + "description": "Choose specific dimension reduction plot to display.", + "paramType": "SELECT", + "paramGroup": "Plot", + "paramValues": [ + "tsne", + "umap", + "pca" + ], + "defaultValue": null, + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Nbins", + "displayName": "Nbins", + "description": "Set number of bins to sort aggregated expression scores (Default 24).", + "paramType": "NUMBER", + "paramGroup": "Plot", + "paramValues": null, + "defaultValue": "24", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Gradient_Density_Font_Size", + "displayName": "Gradient Density Font Size", + "description": "Adjust the font size of the x-axis for the Gradient Density Plot.", + "paramType": "NUMBER", + "paramGroup": "Plot", + "paramValues": null, + "defaultValue": "6", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Violinplot_Font_Size", + "displayName": "Violinplot Font Size", + "description": "Adjust font size of the y-axis labels for the Violinplot.", + "paramType": "NUMBER", + "paramGroup": "Plot", + "paramValues": null, + "defaultValue": "6", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Step_Size", + "displayName": "Step Size", + "description": "Changes the step size of x and y-axis on displayed plot(s).", + "paramType": "NUMBER", + "paramGroup": "Plot", + "paramValues": null, + "defaultValue": "0.1", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Seurat_Object_Filename", + "displayName": "Seurat Object Filename", + "description": "Name of RDS file containing Seurat Object. Default is seurat_object.rds.", + "paramType": "STRING", + "paramGroup": "Filesave", + "paramValues": null, + "defaultValue": "seurat_object.rds", + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "Cell Annotation with Module Scores [CCBR] [scRNA-seq]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/inst/extdata/NIDAPjson/Cell_Type_Annotation_with_SingleR_CCBR_scRNA_seq_.code-template.json b/inst/extdata/NIDAPjson/Cell_Type_Annotation_with_SingleR_CCBR_scRNA_seq_.code-template.json new file mode 100644 index 0000000..edb8221 --- /dev/null +++ b/inst/extdata/NIDAPjson/Cell_Type_Annotation_with_SingleR_CCBR_scRNA_seq_.code-template.json @@ -0,0 +1,119 @@ +{ + "codeTemplate": "SingleRCellTypes_SO <- function({{{Seurat_Object}}},{{{CellDex_Snapshot}}}, {{{Metadata_Table}}}) {\n\n## --------- ##\n## Libraries ##\n## --------- ##\n\n library(nidapFunctions)\n nidapLoadPackages(\"SCWorkflow\")\n library(grid)\n library(gridExtra)\n library(gridBase)\n library(cowplot)\n \n\n## -------------------------------- ##\n## User-Defined Template Parameters ##\n## -------------------------------- ##\n\n# Primary Inputs:\nCombinedSO <-{{{Seurat_Object}}}\nMetadata <- {{{Metadata_Table}}}\nRDS <- {{{CellDex_Snapshot}}}\n\n# Basic Parameters:\nspecies <- \"{{{organism}}}\"\nuseClusters <- {{{Use_Clusters}}}\nClusterColumn <- {{{Clusters_Column}}}[1]\n\n# Visualization Parameters:\nReduction <- \"umap\"\nLegend_Dot_Size <- {{{Legend_Dot_Size}}}\n\n# Advanced Parameters:\ndoFineTuning <- {{{Perform_Fine_Tuning}}}\nNumber_of_cells_per_partition <- {{{Number_of_Cells_Per_Partition}}}\n\n\n## -------------------------------- ##\n## Errors ##\n## -------------------------------- ##\n\n\n## -------------------------------- ##\n## Functions ##\n## -------------------------------- ##\n\n \n## --------------- ##\n## Main Code Block ##\n## --------------- ##\n\n\n\n# Loading Seurat object\n cat(\"1. Reading Seurat Object from dataset: seurat_object.rds\\n\\n\")\n fs <- CombinedSO$fileSystem()\n path <- fs$get_path(\"seurat_object.rds\", 'r')\n so <- readRDS(path)\n\n# Loading CellDex annotation\n#cell.dex <- list(HPCA, BP, mousernaseq, immgen)\n cat(\"2. Reading pre-saved CellDex Data from dataset: CellDexDatabase.rds\\n\\n\")\n fs2 <- RDS$fileSystem()\n path2 <- fs2$get_path(\"CellDexDatabase.rds\", 'r')\n CellDexData <- readRDS(path2)\n\nReduction = \"umap\"\nif (useClusters)\n {\n anno <- annotateCellTypes(object = so,\n species = species,\n reduction.type = Reduction,\n legend.dot.size = Legend_Dot_Size,\n do.finetuning = doFineTuning,\n local.celldex = CellDexData,\n use.clusters = ClusterColumn)\n } else {\n anno <- annotateCellTypes(object = so,\n species = species,\n reduction.type = Reduction,\n legend.dot.size = Legend_Dot_Size,\n do.finetuning = doFineTuning,\n local.celldex = CellDexData)\n\n }\n gc()\n\n## Print figures\n print(anno$p1)\n print(anno$p2)\n\nReduction = \"tsne\"\nif (useClusters)\n {\n anno <- annotateCellTypes(object = so,\n species = species,\n reduction.type = Reduction,\n legend.dot.size = Legend_Dot_Size,\n do.finetuning = doFineTuning,\n local.celldex = CellDexData,\n use.clusters = ClusterColumn)\n } else {\n anno <- annotateCellTypes(object = so,\n species = species,\n reduction.type = Reduction,\n legend.dot.size = Legend_Dot_Size,\n do.finetuning = doFineTuning,\n local.celldex = CellDexData)\n\n }\n gc()\n\n## Print figures\n print(anno$p1)\n print(anno$p2)\n\n\n\n\n## Save the annotated Seurat object\n output <- new.output()\n output_fs <- output$fileSystem()\n saveRDS(anno$object, output_fs$get_path(\"seurat_object.rds\", 'w'))\n\n\n return(NULL)\n}\n\n", + "columns": [ + { + "key": "Clusters_Column", + "displayName": "Clusters Column", + "description": "If \"Use Clusters\" option set to TRUE: Please select a metadata column containing information about clusters you want to annotate. Only one clustering column should be selected. If multiple are selected, only the first selection in this parameter will be used for this function.", + "paramGroup": "Basic", + "sourceDataset": "Metadata_Table", + "defaultValue": null, + "columnType": "ALL", + "isMulti": true + } + ], + "condaDependencies": [], + "description": "Annotate the cell types of your cells using SingleR. This template will take a combined Seurat object after PC reduction has been performed, and then attempt to assign cells to a category (e.g. Stem cells, T cells) based on their genomic profile. This template takes a combined Seurat Object as input. Final Potomac Compatible Version: v110. Final Sugarloaf V1 Version: v125. [View Documentation](https://nidap.nih.gov/workspace/notepad/view/ri.notepad.main.notepad.de08f2d9-6cda-43d4-8179-ef4c04f1104a)", + "externalId": "Cell_Type_Annotation_with_SingleR_CCBR_scRNA_seq_", + "inputDatasets": [ + { + "key": "Seurat_Object", + "displayName": "Seurat Object", + "description": "Select an input Suerat Object. This is usually your combined Seurat Object after PC reduction has been performed and comes from the Combine & Renormalize template at the end of the QC path.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_TRANSFORM_INPUT", + "tags": [ + "ri.compass.main.tag.b39e053b-128a-49b6-996a-d867e2daa67d", + "ri.compass.main.tag.0500ee56-9efa-4d57-aa45-94a5c700fbd5" + ] + }, + { + "key": "Metadata_Table", + "displayName": "Metadata Table", + "description": "Select a metadata table for the input Seurat Object.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + }, + { + "key": "CellDex_Snapshot", + "displayName": "CellDex Snapshot", + "description": "Select a dataset containing a cached version of the CellDex dataset. We recommend that you import and use the dataset \"CellDex_snapshotDate_2021-10-19\".", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_TRANSFORM_INPUT", + "tags": [] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "organism", + "displayName": "Organism", + "description": "Please choose the species of your samples.", + "paramType": "SELECT", + "paramGroup": "Basic", + "paramValues": [ + "Human", + "Mouse" + ], + "defaultValue": "Human", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Use_Clusters", + "displayName": "Use Clusters", + "description": "Set to TRUE if you want to use clusters for annotation", + "paramType": "BOOLEAN", + "paramGroup": "Basic", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Legend_Dot_Size", + "displayName": "Legend Dot Size", + "description": "Please select the size of the colored dots on your chart legend. Default is 2.", + "paramType": "NUMBER", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "2", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Perform_Fine_Tuning", + "displayName": "Perform Fine-Tuning", + "description": "Performs the SingleR fine-tuning function. Takes top scores per cell type, finds variable genes in the reference dataset for those cell types and recalculates the scores. This is performed until\nonly one cell type is left. \n\nToggling this to TRUE will significantly increase compute time. Recommended in combination with setting Use Spark to TRUE as well.", + "paramType": "BOOLEAN", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Number_of_Cells_Per_Partition", + "displayName": "Number of Cells Per Partition", + "description": "The number of partitions you want to use for parallelization. You should in decrease this as your data gets bigger. Default is 400.", + "paramType": "NUMBER", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "400", + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "Cell Type Annotation with SingleR [CCBR] [scRNA-seq]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/inst/extdata/NIDAPjson/Color_by_Gene_Lists_CCBR_scRNA_seq_.code-template.json b/inst/extdata/NIDAPjson/Color_by_Gene_Lists_CCBR_scRNA_seq_.code-template.json new file mode 100644 index 0000000..c7dddd7 --- /dev/null +++ b/inst/extdata/NIDAPjson/Color_by_Gene_Lists_CCBR_scRNA_seq_.code-template.json @@ -0,0 +1,194 @@ +{ + "codeTemplate": "unnamed_1 <- function({{{Seurat_Object}}},{{{Sample_Table}}}, {{{Marker_List}}}) {\n \n #image: png\n \n ## --------- ##\n ## Libraries ##\n ## --------- ##\n\n library(nidapFunctions)\n nidapLoadPackages(\"SCWorkflow\")\n\n ## -------------------------------- ##\n ## User-Defined Template Parameters ##\n ## -------------------------------- ##\n\n #Input Parameters:\n seurat_object <- {{{Seurat_Object}}}\n marker_list = {{{Marker_List}}}\n\n #Basic Parameters:\n manual_genes <- {{{Manual_Genes}}}\n cells_of_interest <- {{{Cells_of_Interest}}}\n protein_presence <- {{{Protein_Presence}}}\n\n #Plot Parameters:\n assay_to_plot <- \"{{{Assay}}}\"\n slot_to_plot <- \"{{{Slot}}}\"\n reduction_type = \"{{{Reduction_Type}}}\"\n point_transparency <- {{{Point_Transparency}}}\n point_shape <- {{{Point_Shape}}}\n cite_seq <- {{{CITEseq_Plot}}}\n consolidated_marker_fig <- TRUE\n\n #Filesave Parameters:\n save_the_entire_dataset <- {{{Save_the_Entire_Dataset}}}\n seurat_object_filename <- \"{{{Seurat_Object_Filename}}}\"\n\n ## --------------- ##\n ## Main Code Block ##\n ## --------------- ##\n\n path <- nidapGetPath(seurat_object,seurat_object_filename)\n so <- readRDS(path)\n\n colorByMarkerTable(object = so,\n manual.genes = manual_genes,\n marker.table = marker_list,\n cells.of.interest = cells_of_interest,\n protein.presence = protein_presence,\n assay = assay_to_plot,\n slot = slot_to_plot,\n reduction.type = reduction_type,\n point.transparency = point_transparency,\n point.shape = point_shape,\n cite.seq = FALSE)\n\nreturn(NULL)\n}\n\n#################################################\n## Global imports and functions included below ##\n#################################################\n\ncolorByMarkerTable <- function (object, samples.subset, samples.to.display, \n manual.genes = c(), marker.table, \n cells.of.interest, protein.presence = FALSE, assay = \"SCT\", slot = \"scale.data\",\n reduction.type = \"umap\", point.transparency = 0.5, point.shape = 16, \n cite.seq = FALSE){ \n\n library(ggplot2)\n library(Seurat)\n library(stringr)\n library(grid)\n library(gridExtra)\n \n .plotMarkers <- function(markers) {\n if (is.na(markers) == TRUE) {\n g <- ggplot() + theme_void()\n return(g)\n } else {\n markers.mat = GetAssayData(object, assay = assay, slot = slot)[markers, ]\n markers.quant = quantile(markers.mat[markers.mat > \n 1], probs = c(0.1, 0.5, 0.9))\n markers.mat[markers.mat > markers.quant[3]] = markers.quant[3]\n markers.mat[markers.mat < markers.quant[1]] = 0\n if (!(cite.seq)) {\n if (reduction.type == \"tsne\") {\n p1 <- DimPlot(object, reduction = \"tsne\", \n group.by = \"ident\")\n clusmat = data.frame(umap1 = p1$data$tSNE_1, \n umap2 = p1$data$tSNE_2, markers = markers.mat, \n ident = as.factor(p1$data$ident))\n } else if (reduction.type == \"umap\") {\n p1 <- DimPlot(object, reduction = \"umap\", \n group.by = \"ident\")\n clusmat = data.frame(umap1 = p1$data$UMAP_1, \n umap2 = p1$data$UMAP_2, markers = markers.mat, \n ident = as.factor(p1$data$ident))\n } else {\n p1 <- DimPlot(object, reduction = \"pca\", \n group.by = \"ident\")\n clusmat = data.frame(umap1 = p1$data$PC_1, \n umap2 = p1$data$PC_2, markers = markers.mat, \n ident = as.factor(p1$data$ident))\n }\n } else {\n if (reduction.type == \"tsne\") {\n p1 <- DimPlot(object, reduction = \"protein_tsne\", \n group.by = \"ident\")\n clusmat = data.frame(umap1 = p1$data$protein_tsne_1, \n umap2 = p1$data$protein_tsne_2, markers = markers.mat, \n ident = as.factor(p1$data$ident))\n } else if (reduction.type == \"umap\") {\n p1 <- DimPlot(object, reduction = \"protein_umap\", \n group.by = \"ident\")\n clusmat = data.frame(umap1 = p1$data$protein_umap_1, \n umap2 = p1$data$protein_umap_2, markers = markers.mat, \n ident = as.factor(p1$data$ident))\n } else {\n p1 <- DimPlot(object, reduction = \"protein_pca\", \n group.by = \"ident\")\n clusmat = data.frame(umap1 = p1$data$protein_pca_1, \n umap2 = p1$data$protein_pca_2, markers = markers.mat, \n ident = as.factor(p1$data$ident))\n }\n }\n \n g <- ggplot(clusmat, aes(x = umap1, y = umap2, \n group = ident)) + theme_bw() + theme(legend.title = element_blank()) + \n ggtitle(markers) + geom_point(aes(color = markers, \n shape = ident), alpha = point.transparency, \n shape = point.shape, size = 1) + theme(panel.grid.major = element_blank(), \n panel.grid.minor = element_blank(), panel.background = element_blank(), \n legend.text = element_text(size = rel(0.5)), plot.background=element_rect(fill=\"white\", colour=\"white\"), rect = element_rect(fill = 'white')) +\n scale_color_gradient(limits = c(0, markers.quant[3]), \n low = \"lightgrey\", high = \"red\") + xlab(\"umap-1\") + \n ylab(\"umap-2\")\n return(g)\n \n }\n }\n \n marker.table <- marker.table[cells.of.interest]\n present.marker.ls <- list()\n for (celltype in colnames(marker.table)) {\n print(names(marker.table[celltype]))\n present = lapply(marker.table[[celltype]], function(x) x %in% \n rownames(GetAssayData(object, assay = assay, slot = slot)))\n absent.genes = unlist(marker.table[[celltype]])[present == \n FALSE]\n present.genes = unlist(marker.table[[celltype]])[present == \n TRUE]\n print(paste0(\"Genes not present: \", paste0(absent.genes, \n collapse = \",\")))\n print(paste0(\"Genes present: \", paste0(present.genes, \n collapse = \",\")))\n if (length(present.genes) == 0) {\n print(paste0(names(marker.table[celltype]), \" genes were not found in object and will not be analyzed\"))\n } else {\n present.marker.ls[[celltype]] <- present.genes\n }\n }\n \n padded.ls <- lapply(present.marker.ls, `length<-`, max(lengths(present.marker.ls)))\n markers.from.list <- do.call(cbind, padded.ls)\n markers.present = unlist(markers.from.list)\n\n if (!length(markers.present) > 0) {\n print(\"No markers found in dataset\")\n return(NULL)\n }\n\n # Store images for making consolidated figure\n cons.gg.storage <- list()\n\n # Plot arranged figures with padding\n for (cell in colnames(markers.from.list)) {\n title <- cell\n markers.to.analyze <- as.character(markers.from.list[, \n cell])\n grob <- lapply(markers.to.analyze, function(x) .plotMarkers(x))\n\n arranged <- gridExtra::arrangeGrob(grobs = grob, ncol = 1, newpage = F, as.table = F, top = ggpubr::text_grob(title, size = 15, face = \"bold\"))\n \n cons.gg.storage[[cell]] <- arranged\n }\n # Manually specify background \n background <- rectGrob(gp = gpar(fill = \"white\", col = NA)) \n \n cons.fig <- do.call(grid.arrange, c(cons.gg.storage, ncol = ncol(markers.from.list)))\n cons.fig.bkgrd <- grobTree(background, cons.fig)\n grid.draw(cons.fig.bkgrd)\n grid.newpage()\n\n # Plot individual arranged figures with padding\n for (cell in colnames(markers.from.list)) {\n title <- cell\n markers.to.analyze <- as.character(markers.from.list[, \n cell])\n grob <- lapply(markers.to.analyze, function(x) .plotMarkers(x))\n arranged <- gridExtra::arrangeGrob(grobs = grob, newpage = F, as.table = F, top = ggpubr::text_grob(title, size = 15, face = \"bold\"))\n\n # Combine the background with the arranged plots\n combined <- grobTree(background, arranged)\n # Draw the combined grob with background\n grid.draw(combined)\n grid.newpage()\n }\n\n # Plot manual genes if not empty\n if(!is.null(manual.genes)){\n\n # Str-spit and use only present genes\n manual.genes.processed <- str_split(manual.genes, pattern = \"[^a-zA-Z0-9]+\")[[1]]\n manual.genes.processed <- manual.genes.processed[manual.genes.processed %in% rownames(GetAssayData(object, assay = assay, slot = slot))]\n\n tryCatch({\n manual.grob <- lapply(manual.genes.processed, function(x) .plotMarkers(x))\n manual.arranged <- gridExtra::arrangeGrob(grobs = manual.grob, newpage = F, as.table = F, top = ggpubr::text_grob(\"Manual Genes\", size = 15, face = \"bold\"))\n plot(manual.arranged)\n grid.newpage()}, error = function(e) {\n cat(e$message, \"\\n\", \"Possible Reason: No manual genes were found in expression matrix\")\n})\n }\n \n return(NULL)\n }", + "columns": [ + { + "key": "Cells_of_Interest", + "displayName": "Cells of Interest", + "description": "Select markers from specific celltype column to display", + "paramGroup": null, + "sourceDataset": "Marker_List", + "defaultValue": null, + "columnType": "ALL", + "isMulti": true + } + ], + "condaDependencies": [], + "description": "Color by Gene Template that doesn't require manual input of genes. Also allows users to select which samples they want to display. Final Potomac Compatible Version: v91. Final Sugarloaf V1: v104. [View Documentation](https://nidap.nih.gov/workspace/notepad/view/ri.notepad.main.notepad.332935bb-811c-4e62-a093-02002d8e3823)", + "externalId": "Color_by_Gene_Lists_CCBR_scRNA_seq_", + "inputDatasets": [ + { + "key": "Seurat_Object", + "displayName": "Seurat Object", + "description": "Select your combined Seurat object from which to plot your gene expression heat map. Recommended to use output from the SingleR annotated template (Step 5 of pipeline).", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_TRANSFORM_INPUT", + "tags": [ + "ri.compass.main.tag.b39e053b-128a-49b6-996a-d867e2daa67d", + "ri.compass.main.tag.411a3dbf-07f6-498a-86d7-0180caa1abf2" + ] + }, + { + "key": "Sample_Table", + "displayName": "Sample Table", + "description": "Please select the dataset that contains your sample names. This should be the outputs from the Get Sample Names template.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [ + "ri.compass.main.tag.b39e053b-128a-49b6-996a-d867e2daa67d", + "ri.compass.main.tag.411a3dbf-07f6-498a-86d7-0180caa1abf2" + ] + }, + { + "key": "Marker_List", + "displayName": "Marker List", + "description": "Marker Table\nA table of lists of gene/protein markers for the categories of cells you want to detect. The table should be formatted with cell type(s) as the column names, and marker(s) as the entries in each column. Protein markers should be designated with \"_prot\" (e.g. CD8_prot).", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "Manual_Genes", + "displayName": "Manual Genes", + "description": "Copy - paste any space or comma separated gene list for visualization.", + "paramType": "VECTOR", + "paramGroup": null, + "paramValues": null, + "defaultValue": "c()", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Protein_Presence", + "displayName": "Protein Presence", + "description": "Toggle on/off if there is protein data embedded within the seurat object", + "paramType": "BOOLEAN", + "paramGroup": "Cite-seq", + "paramValues": null, + "defaultValue": "TRUE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Assay", + "displayName": "Assay", + "description": "Select Assay to Plot.", + "paramType": "SELECT", + "paramGroup": "Plot", + "paramValues": [ + "SCT", + "RNA", + "integrated" + ], + "defaultValue": "SCT", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Slot", + "displayName": "Slot", + "description": "Specific slot within Assay to plot", + "paramType": "SELECT", + "paramGroup": "Plot", + "paramValues": [ + "data", + "scale.data" + ], + "defaultValue": "scale.data", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Reduction_Type", + "displayName": "Reduction Type", + "description": "Please select the kind of clustering visualization you want to use. UMAP is best for visualization global differences across samples, while TSNE is better for local differences.", + "paramType": "SELECT", + "paramGroup": "Plot", + "paramValues": [ + "umap", + "tsne", + "pca" + ], + "defaultValue": "umap", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Point_Transparency", + "displayName": "Point Transparency", + "description": "Customize how transparent/opaque you want to make points on your visualization", + "paramType": "NUMBER", + "paramGroup": "Plot", + "paramValues": null, + "defaultValue": "0.5", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Point_Shape", + "displayName": "Point Shape", + "description": "", + "paramType": "SELECT", + "paramGroup": "Plot", + "paramValues": [ + "16", + "19", + "20" + ], + "defaultValue": "16", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "CITEseq_Plot", + "displayName": "CITEseq Plot", + "description": "Generate reduction plot based on CITEseq (Protein Expression) cell embeddings", + "paramType": "BOOLEAN", + "paramGroup": "Cite-seq", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Save_the_Entire_Dataset", + "displayName": "Save the Entire Dataset", + "description": "If you want to continue analyzing/filtering from here, toggle TRUE to save the Seurat Object to the output dataset. If you toggle FALSE, it will only save the output image (saving time). Keep FALSE for faster performance.", + "paramType": "BOOLEAN", + "paramGroup": "Filesave", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Seurat_Object_Filename", + "displayName": "Seurat Object Filename", + "description": "Name of RDS file containing Seurat Object. Default is seurat_object.rds", + "paramType": "STRING", + "paramGroup": "Filesave", + "paramValues": null, + "defaultValue": "seurat_object.rds", + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "Color by Gene Lists [CCBR] [scRNA-seq]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/inst/extdata/NIDAPjson/Color_by_Genes_CCBR_scRNA_seq_.code-template.json b/inst/extdata/NIDAPjson/Color_by_Genes_CCBR_scRNA_seq_.code-template.json new file mode 100644 index 0000000..63cbf1d --- /dev/null +++ b/inst/extdata/NIDAPjson/Color_by_Genes_CCBR_scRNA_seq_.code-template.json @@ -0,0 +1,201 @@ +{ + "codeTemplate": "ColorByGene_CellTypes <- function({{{seurat_object}}},{{{sample_table}}}) {\n \n \n ## --------- ##\n ## Libraries ##\n ## --------- ##\n \n library(nidapFunctions)\n nidapLoadPackages(\"SCWorkflow\")\n library(grid)\n library(gridExtra)\n library(scales)\n\n ## -------------------------------- ##\n ## User-Defined Template Parameters ##\n ## -------------------------------- ##\n\n # Primary Inputs:\n seurat_object <- {{{seurat_object}}}\n\n # Basic Parameters:\n samples_to_include <- '{{{samples_to_include}}}'\n gene <- {{{Gene}}}\n\n # Visualization Parameters:\n reduction_type <- \"{{{reduction_type}}}\"\n number_of_rows <- {{{Number_of_Rows}}}\n color <- \"{{{Color}}}\"\n point_size <- {{{Point_Size}}}\n point_shape <- {{{Point_Shape}}}\n point_transparency <- {{{Point_Transparency}}}\n image_type <- \"{{{Image_Type}}}\"\n\n # Advanced Parameters:\n save_the_entire_dataset <- {{{Save_the_Entire_Dataset}}}\n use_cite_seq_data <- {{{Use_CITE_seq_Data}}}\n assay <- \"{{{Assay}}}\"\n\n ##--------------- ##\n ## Error Messages ##\n ## -------------- ##\n \n \n ## --------- ##\n ## Functions ##\n ## --------- ##\n\n\n ## --------------- ##\n ## Main Code Block ##\n ## --------------- ##\n\n # Loading Seurat Object\n cat(\"Reading Seurat Object from dataset: seurat_object.rds\\n\\n\")\n fs <- seurat_object$fileSystem()\n path <- fs$get_path(\"seurat_object.rds\", 'r')\n SO <- readRDS(path)\n print(SO)\n\n\nColorByGene.result <- colorByGene(object = SO,\n samples.to.include = samples_to_include,\n gene = gene,\n reduction.type = reduction_type,\n number.of.rows = number_of_rows,\n return.seurat.object = save_the_entire_dataset,\n color = color,\n point.size = point_size,\n point.shape = point_shape,\n point.transparency = point_transparency,\n use.cite.seq.data = use_cite_seq_data,\n assay = assay)\n\n\n# Preparing Graphic Output\n if (number_of_rows == 0) {\n n = ceiling(length(ColorByGene.result$plot)^0.5)\n } else {\n n = number_of_rows\n }\n\ndo.call(\"grid.arrange\", c(ColorByGene.result$plot, nrow=n))\n\n\n# Saving dataset (if requested)\nif(save_the_entire_dataset){\n return(ColorByGene.result$object)\n }\n else{\n gene = as.data.frame(gene) \n return(gene)\n }\n}\n", + "columns": [ + { + "key": "samples_to_include", + "displayName": "Samples to Include", + "description": "Please select which samples to include. You may \"+Add All\" to select all samples and then deselect those you do not want to analyze.", + "paramGroup": "Basic", + "sourceDataset": "sample_table", + "defaultValue": null, + "columnType": "ALL", + "isMulti": true + } + ], + "condaDependencies": [], + "description": "This template visualizes gene expression intensities for provided Genes across your cells. If a gene is not found in the dataset, the Log will report this. Otherwise, you should see one plot (TSNE or UMAP, your choice) per gene name provided. The intensity of the red color will be relative to the expression of the gene in that cell. Final Potomac Compatible Version: v98. Sugarloaf V1: v103. [View Documentation](https://nidap.nih.gov/workspace/notepad/view/ri.notepad.main.notepad.e28a74ff-674a-462d-8017-34c8c3bf69c8)", + "externalId": "Color_by_Genes_CCBR_scRNA_seq_", + "inputDatasets": [ + { + "key": "seurat_object", + "displayName": "Seurat Object", + "description": "Select your combined Seurat object from which to plot your gene expression heat map. Recommended to use output from the SingleR annotated template (Step 5 of pipeline).", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_TRANSFORM_INPUT", + "tags": [ + "ri.compass.main.tag.b39e053b-128a-49b6-996a-d867e2daa67d", + "ri.compass.main.tag.411a3dbf-07f6-498a-86d7-0180caa1abf2" + ] + }, + { + "key": "sample_table", + "displayName": "Sample Table", + "description": "Please select the dataset that contains your sample names. This should be the outputs from the Get Sample Names template.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [ + "ri.compass.main.tag.b39e053b-128a-49b6-996a-d867e2daa67d", + "ri.compass.main.tag.809bdb80-693d-4bf4-827e-d70c946ce2bc" + ] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "Gene", + "displayName": "Gene", + "description": "Please enter genes which you would like to visualize. If you don't know what genes to look at, consider consulting your DEG table for interest contrasts.", + "paramType": "VECTOR", + "paramGroup": "Basic", + "paramValues": null, + "defaultValue": "c(\"Gapdh\",\"GAPDH\")", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "reduction_type", + "displayName": "Reduction Type", + "description": "Please select the kind of clustering visualization you want to use. UMAP is best for visualization global differences across samples, while TSNE is better for local differences.", + "paramType": "SELECT", + "paramGroup": "Visualization", + "paramValues": [ + "umap", + "tsne", + "pca" + ], + "defaultValue": "umap", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Number_of_Rows", + "displayName": "Number of Rows", + "description": "Please select the number of rows you want to arrange your plots into. For example, if you are plotting 10 genes and want 2 rows of 5 plots, select 2. If are plotting 6 genes and want 3 rows of 2, input 3.", + "paramType": "NUMBER", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "1", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Color", + "displayName": "Color", + "description": "Select the color you want to use for the \"heat\" in your heatmap.", + "paramType": "SELECT", + "paramGroup": "Visualization", + "paramValues": [ + "red", + "blue", + "purple", + "orange" + ], + "defaultValue": "red", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Point_Size", + "displayName": "Point Size", + "description": "Customize the size of the points representing each cell in your visualization.", + "paramType": "NUMBER", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "1", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Point_Shape", + "displayName": "Point Shape", + "description": "", + "paramType": "SELECT", + "paramGroup": "Visualization", + "paramValues": [ + "16", + "19", + "20" + ], + "defaultValue": "16", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Point_Transparency", + "displayName": "Point Transparency", + "description": "Customize how transparent/opaque you want to make points on your visualization.", + "paramType": "NUMBER", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "0.5", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Image_Type", + "displayName": "Image Type", + "description": "", + "paramType": "SELECT", + "paramGroup": "Visualization", + "paramValues": [ + "png", + "svg" + ], + "defaultValue": "png", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Save_the_Entire_Dataset", + "displayName": "Save the Entire Dataset", + "description": "If you want to continue analyzing/filtering from here, toggle TRUE to save the Seurat Object to the output dataset. If you toggle FALSE, it will only save the output image (saving time). Keep FALSE for faster performance.", + "paramType": "BOOLEAN", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Use_CITE_seq_Data", + "displayName": "Use CITE-seq Data", + "description": "Opt to use CITEseq clusters as opposed to RNA", + "paramType": "BOOLEAN", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Assay", + "displayName": "Assay", + "description": "Select Assay to Plot (default is SCT)", + "paramType": "SELECT", + "paramGroup": "Advanced", + "paramValues": [ + "SCT", + "integrated" + ], + "defaultValue": "SCT", + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "Color by Genes [CCBR] [scRNA-seq]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/inst/extdata/NIDAPjson/Color_by_Metadata_CCBR_scRNA_seq_.code-template.json b/inst/extdata/NIDAPjson/Color_by_Metadata_CCBR_scRNA_seq_.code-template.json new file mode 100644 index 0000000..d1040c9 --- /dev/null +++ b/inst/extdata/NIDAPjson/Color_by_Metadata_CCBR_scRNA_seq_.code-template.json @@ -0,0 +1,175 @@ +{ + "codeTemplate": "ColorByMeta_CellTypes <- function({{{seurat_object}}},{{{sample_table}}},{{{metadata_table}}}) {\n\n ## --------- ##\n ## Libraries ##\n ## --------- ##\n\n library(nidapFunctions)\n nidapLoadPackages(\"SCWorkflow\")\n library(grid)\n library(gridExtra)\n\n ## -------------------------------- ##\n ## User-Defined Template Parameters ##\n ## -------------------------------- ##\n \n # Input Parameters:\n Seurat_Object <- {{{seurat_object}}}\n Sample_Table <- {{{sample_table}}}\n Metadata_Table <- {{{metadata_table}}}\n \n # Samples and Metadata Parameters\n Samples_to_Include <- '{{{samples_to_include}}}'\n Metadata_to_Plot <- '{{{metadata_to_plot}}}'\n\n # Visualization Parameters:\n Number_of_Columns_for_Final_Image <- {{{Number_of_Columns_for_Final_Image}}}\n Show_Labels <- {{{show_labels_}}}\n Dot_Size <- {{{Dot_Size}}}\n \n # Legend Parameters\n Legend_Text_Size <- {{{Legend_Text_Size}}}\n Legend_Position <- \"{{{Legend_Position}}}\"\n\n # Summarization Parameters\n Columns_to_Summarize <- {{{Columns_to_Summarize}}}\n Summarization_Cut_Off <- {{{Summarization_Cut_Off}}}\n\n # Advanced Parameters:\n Save_the_Entire_Dataset <- {{{Save_the_Entire_Dataset}}}\n Use_CITE_seq <- {{{Use_CITE_seq}}}\n\n \n\n\n\n\n ##--------------- ##\n ## Error Messages ##\n ## -------------- ##\n\n \n ## --------- ##\n ## Functions ##\n ## --------- ##\n\n ## --------------- ##\n ## Main Code Block ##\n ## --------------- ##\n\n## Load SO \n cat(\"Reading Seurat Object from dataset: seurat_object.rds\\n\\n\")\n fs <- Seurat_Object$fileSystem()\n path <- fs$get_path(\"seurat_object.rds\", 'r')\n SO <- readRDS(path)\n print(SO)\n\n\nAll_Reduction_Types <- c(\"umap\", \"tsne\", \"pca\")\nfor(Reduction_Type in All_Reduction_Types){\n\nresults <- plotMetadata(object = SO,\n samples.to.include = Samples_to_Include,\n metadata.to.plot = Metadata_to_Plot,\n columns.to.summarize = Columns_to_Summarize,\n summarization.cut.off = Summarization_Cut_Off,\n reduction.type = Reduction_Type,\n use.cite.seq = Use_CITE_seq,\n show.labels = Show_Labels,\n legend.text.size = Legend_Text_Size,\n legend.position = Legend_Position,\n dot.size = Dot_Size\n ) \n\n## Print Graphic output\n\nmatched_commas <- gregexpr(\",\", Metadata_to_Plot, fixed = TRUE)\nn_commas <- length(matched_commas[[1]])\n if (Number_of_Columns_for_Final_Image == 0) {\n n = ceiling((n_commas+1)^0.5)\n } else {\n n = Number_of_Columns_for_Final_Image\n }\n do.call(\"grid.arrange\", c(results$plot, ncol=n))\n\n}\n\n\n## Save dataset if requested\n\nif (Save_the_Entire_Dataset){\n output <- new.output()\n output_fs <- output$fileSystem()\n saveRDS(results$object, output_fs$get_path(\"seurat_object.rds\", 'w'))\n return(NULL)\n } else {\n return(results$object@meta.data)\n }\n}", + "columns": [ + { + "key": "samples_to_include", + "displayName": "Samples to Include", + "description": "Please select which samples you would like to include. You may \"Add all\" to add all samples and then deselect those you wish to exclude from visualization.", + "paramGroup": "Samples and Metadata", + "sourceDataset": "sample_table", + "defaultValue": null, + "columnType": "ALL", + "isMulti": true + }, + { + "key": "metadata_to_plot", + "displayName": "Metadata to Plot", + "description": "Please select the metadata columns from your Metadata table you would like to plot. This template will make one plot from each column you select.", + "paramGroup": "Samples and Metadata", + "sourceDataset": "metadata_table", + "defaultValue": null, + "columnType": "ALL", + "isMulti": true + }, + { + "key": "Columns_to_Summarize", + "displayName": "Columns to Summarize", + "description": "Select the columns you would like to summarize. For example, selecting \"annot\" will give you the top X most common cell annotations, while plotting the rest as other. See \"Summarization Cut-off\" below for details.", + "paramGroup": "Summarization", + "sourceDataset": "metadata_table", + "defaultValue": null, + "columnType": "STRING", + "isMulti": true + } + ], + "condaDependencies": [], + "description": "Use this template to color your dimensionality reduction (TSNE & UMAP) with different columns from your Metadata Table. You can select one or more columns from the Metadata Table, and for each column selected, this template will produce a plot (t-SNE & UMAP) using the data in that column to color the cells. Final Potomac Compatible Version: v146. Sugarloaf V1: v155. [View Documentation](https://nidap.nih.gov/workspace/notepad/view/ri.notepad.main.notepad.cbaef5d8-18cf-4481-88a8-9bee8a50740a)", + "externalId": "Color_by_Metadata_CCBR_scRNA_seq_", + "inputDatasets": [ + { + "key": "seurat_object", + "displayName": "Seurat Object", + "description": "Please input a combined Seurat Object with metadata to plot. Recommended to use a SingleR annotated Seurat Objet (output of Step 5 of the basic Single Cell workflow).", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_TRANSFORM_INPUT", + "tags": [] + }, + { + "key": "sample_table", + "displayName": "Sample Table", + "description": "Please input the dataset containing your sample names. This should be the output dataset from Get Sample Names template.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + }, + { + "key": "metadata_table", + "displayName": "Metadata Table", + "description": "Please select the input dataset containing your metadata. This should be the output dataset of the Metadata Table template.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "Number_of_Columns_for_Final_Image", + "displayName": "Number of Columns for Final Image", + "description": "Please select the number of columns you would like to arrange your visualization plots by. For example, if you have 10 plots you want to make, and you want to arrange them into 5 columns of 2, input 5.", + "paramType": "NUMBER", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "0", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "show_labels_", + "displayName": "Show Labels?", + "description": "Choose whether to add labels or not to your reduction map. Default is false.", + "paramType": "BOOLEAN", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Dot_Size", + "displayName": "Dot Size", + "description": "Select your Dot Size here", + "paramType": "NUMBER", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "0.01", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Legend_Text_Size", + "displayName": "Legend Text Size", + "description": "Customize the size of the legend text in your charts. Default is 1, but 0.5 should be reasonable if you have a lot of categories in your legend.", + "paramType": "NUMBER", + "paramGroup": "Legend", + "paramValues": null, + "defaultValue": "1", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Legend_Position", + "displayName": "Legend Position", + "description": "Select how you want to align your legend. Recommended top.", + "paramType": "SELECT", + "paramGroup": "Legend", + "paramValues": [ + "top", + "bottom", + "right", + "left", + "none" + ], + "defaultValue": "right", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Summarization_Cut_Off", + "displayName": "Summarization Cut-Off", + "description": "Select the number of categories you want to display, while marking all other cells as \"other.\" For example, inputting 5 while show you the top five most common categories in your sample, while showing all other categories as \"Other.\" Max categories displayable is 20.", + "paramType": "NUMBER", + "paramGroup": "Summarization", + "paramValues": null, + "defaultValue": "5", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Save_the_Entire_Dataset", + "displayName": "Save the Entire Dataset", + "description": "Toggle true to save your Seurat Object to the output dataset, rather than just save the output image.. This will allow you to continue further analysis off of this template's output dataset, but will take additional time to save when running.", + "paramType": "BOOLEAN", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Use_CITE_seq", + "displayName": "Use CITE-seq", + "description": "Toggle TRUE if you would like to plot Antibody clusters from CITEseq instead of scRNA", + "paramType": "BOOLEAN", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "Color by Metadata [CCBR] [scRNA-seq]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/inst/extdata/NIDAPjson/Combine_Normalize_CCBR_scRNA_seq_.code-template.json b/inst/extdata/NIDAPjson/Combine_Normalize_CCBR_scRNA_seq_.code-template.json new file mode 100644 index 0000000..57eec6f --- /dev/null +++ b/inst/extdata/NIDAPjson/Combine_Normalize_CCBR_scRNA_seq_.code-template.json @@ -0,0 +1,378 @@ +{ + "codeTemplate": "CombClustNorm_SO <- function({{{Suerat_Object_List}}}) {\n\n## --------- ##\n## Libraries ##\n## --------- ##\n\n library(nidapFunctions)\n nidapLoadPackages(c(\"SCWorkflow\",\"Seurat\",\"reshape2\",\"magrittr\",\"dplyr\",\"ggplot2\",\"ggpubr\",\"gridExtra\",\"RColorBrewer\"))\n## -------------------------------- ##\n## User-Defined Template Parameters ##\n## -------------------------------- ## \n \n # Primary Inputs\n input = {{{Suerat_Object_List}}}\n\n # Nomralization Variables\n SCT.level= \"{{{SCT_Level}}}\"\n vars.to.regress = {{{Variables_to_Regress}}}\n \n # FindVariableFeatures\n nfeatures = {{{Number_of_Features}}}\n low.cut = {{{Mean_Low_Cutoff}}}\n high.cut = {{{Mean_High_Cutoff}}}\n low.cut.disp = {{{Dispersion_Low_Cutoff}}}\n high.cut.disp = {{{Dispersion_High_Cutoff}}}\n selection.method = \"{{{Selection_Method}}}\"\n\n # Dim Reduction\n npcs = {{{Number_of_PC_s_for_PCA_UMAP_t_SNE}}}\n draw.umap = {{{draw_umap}}}\n draw.tsne = {{{draw_t_sne}}}\n\n seed.for.pca = {{{Seed_for_PCA}}}\n seed.for.tsne = {{{Seed_for_TSNE}}}\n seed.for.umap = {{{Seed_for_UMAP}}}\n\n # Clustering Varables\n clust.res.low={{{Cluster_Resolution_Low_Range}}}\n clust.res.high = {{{Cluster_Resolution_High_Range}}}\n clust.res.bin = {{{Cluster_Resolution_Range_Bins}}}\n \n # Select PCs\n methods.pca = {{{Method_for_Finding_Significant_PCs}}}\n var.threshold = {{{Change_in_Variation_Threshold}}}\n jackstraw = {{{Draw_JackStraw_Plot}}}\n jackstraw.dims = {{{Number_of_Dimensions_for_JackStraw}}}\n pca.reg.plot= {{{Draw_PCA_Regression_Plot}}}\n \n # Advanced\n exclude.sample = {{{Exclude_Sample}}}\n only.var.genes = {{{Only_Variable_Genes}}} \n cell.count.limit = {{{Conserve_Memory_Max_Cell_Limit}}}\n reduce.so = {{{Reduce_Object}}}\n project.name = \"{{{Project_Name}}}\"\n cell.hashing.data = {{{Cell_Hashing_Data}}}\n \n\n\n## -------------------------------- ##\n## Load Seurat Object. ##\n## -------------------------------- ## \n\n cat(\"1. Reading Seurat Object from dataset: seurat_object.rds\\n\\n\")\n fs <- input$fileSystem()\n path <- fs$get_path(\"seurat_object.rds\", 'r')\n so <- readRDS(path)\n\n ## correct exclude.sample Variable. when field initialized but not filled\n ## Exclude.sample will = \"\", changing it so length of empty variable ==0\n\n exclude.sample=exclude.sample[exclude.sample%in%\"\"==F]\n\n## -------------------------------- ##\n## Run Fucnction. ##\n## -------------------------------- ## \n \n out=combineNormalize(object =so,\n \n # Nomralization variables\n SCT.level= SCT.level,\n npcs = npcs,\n vars.to.regress = vars.to.regress,\n \n # FindVariableFeatures\n nfeatures = nfeatures,\n low.cut = low.cut,\n high.cut = high.cut,\n low.cut.disp = low.cut.disp,\n high.cut.disp = high.cut.disp,\n selection.method = selection.method,\n\n # Dim Reduction\n draw.umap = draw.umap,\n draw.tsne = draw.tsne,\n only.var.genes = only.var.genes,\n\n seed.for.pca = seed.for.pca,\n seed.for.tsne = seed.for.tsne,\n seed.for.umap = seed.for.umap,\n\n # Clustering Varables\n clust.res.low = clust.res.low,\n clust.res.high = clust.res.high,\n clust.res.bin = clust.res.bin,\n \n # Select PCs\n methods.pca = methods.pca,\n var.threshold = var.threshold,\n pca.reg.plot = FALSE,\n jackstraw = jackstraw,\n jackstraw.dims = jackstraw.dims,\n\n # Advanced\n exclude.sample = exclude.sample,\n cell.count.limit=cell.count.limit,\n reduce.so = reduce.so,\n project.name = project.name,\n cell.hashing.data = cell.hashing.data\n )\n\n\n\n## -------------------------------- ##\n## Plot Figures. ##\n## -------------------------------- ## \n\n\n plot(out$plots$TSNE)\n plot(out$plots$UMAP)\n\n if ('none'%in%methods.pca==F){\n plot(out$plots$`Elbow Plot`)\n }\n if (is.null(vars.to.regress)==F&pca.reg.plot==T){\n for(x in 1:length(vars.to.regress)){\n plot(out$plots$`Regression Plots`[[x]])\n }\n }\n if(jackstraw==T){\n plot(out$plots$JackStraw)\n }\n\n\n## -------------------------------- ##\n## Save Seurat object ##\n## -------------------------------- ## \n\n gc()\n output <- new.output()\n output_fs <- output$fileSystem()\n saveRDS(out$object, output_fs$get_path(\"seurat_object.rds\", 'w'))\n\n\n\n return(NULL)\n}\n\n\n#################################################\n## Global imports and functions included below ##\n#################################################\n\n\n\n\ncombineNormalize <- function(object,\n \n # Nomralization variables\n npcs = 30,\n SCT.level=\"Merged\",\n vars.to.regress = NULL,\n \n # FindVariableFeatures\n nfeatures = 2000,\n low.cut = 0.1,\n high.cut = 8,\n low.cut.disp = 1,\n high.cut.disp = 100000,\n selection.method = 'vst',\n \n # Dim Reduction\n only.var.genes = FALSE,\n draw.umap = TRUE,\n draw.tsne = TRUE,\n \n seed.for.pca = 42,\n seed.for.tsne = 1,\n seed.for.umap = 42,\n \n # Clustering Varables\n clust.res.low = 0.2,\n clust.res.high = 1.2,\n clust.res.bin = 0.2,\n \n # Select PCs\n methods.pca = 'none',\n var.threshold = 0.1,\n pca.reg.plot = FALSE,\n jackstraw = FALSE,\n jackstraw.dims=5,\n \n exclude.sample = NULL,\n cell.count.limit= 35000,\n reduce.so = FALSE,\n project.name = 'scRNAProject',\n cell.hashing.data = FALSE\n \n \n){\n \n \n \n ##--------------- ##\n ## Error Messages ##\n ## -------------- ##\n\n \n ## --------- ##\n ## Functions ####\n ## --------- ##\n \n .plotPCA <- function(so,m,sample){\n p1 <- DimPlot(so, reduction = \"pca\")\n \n ## Data for PCA plot\n clusmat <- data.frame(umap1=p1$data$PC_1,\n umap2=p1$data$PC_2, \n clusid=so@meta.data[[m]])\n \n ## Calculate Percent Varriation for each PC\n sumpcsd <- sum(so@reductions$pca@stdev)\n \n pcvar <- (so@reductions$pca@stdev/sumpcsd)*100\n pcvar <- formatC(pcvar,format = \"g\",digits=3)\n \n pcvar1 <- pcvar[1] \n pcvar2 <- pcvar[2]\n \n \n .runCateg <- function(mat,sample){\n \n ## PCA plot for to display catigorical data\n colors=c(\"#e6194B\",\"#3cb44b\",\"#4363d8\",\"#f58231\",\"#911eb4\",\"#42d4f4\",\n \"#f032e6\",\"#bfef45\",\"#fabebe\",\"#469990\",\"#e6beff\",\"#9A6324\",\n \"#800000\",\"#aaffc3\",\"#808000\",\"#000075\",\"#a9a9a9\")\n g <- ggplot(mat, aes(x=umap1, y=umap2)) +\n geom_point(aes(colour=clusid),size=1) +\n scale_color_manual(values=colors) +\n xlab(paste0(\"PC-1 \",pcvar[1],\"%\")) + \n ylab(paste0(\"PC-2 \",pcvar[2],\"%\"))+\n theme_bw() +\n theme(legend.title=element_blank(),\n aspect.ratio = 1,\n panel.grid.major = element_blank(), \n panel.grid.minor = element_blank(),\n panel.background = element_blank(),\n legend.text=element_text(size=rel(1.5)),\n axis.title=element_text(size=16),\n plot.title = element_text(size=16,face='bold')) +\n guides(colour = guide_legend(override.aes = list(size=5, alpha = 1))) +\n ggtitle(paste0(sample))#,\"_\",m)) \n return(g)\n }\n \n ## PCA plot for to display continuous data\n .runCont <- function(mat,midpt,maxpt,sample){\n g <- ggplot(mat, aes(x=umap1, y=umap2)) +\n theme_bw() +\n theme(legend.title=element_blank(),aspect.ratio = 1) +\n geom_point(aes(colour=clusid),size=1) +\n scale_colour_gradient2(low = \"blue\",\n mid=\"lightgrey\",high = \"red\",\n limits=c(0, maxpt),\n midpoint = midpt) +\n xlab(paste0(\"PC-1 \",pcvar[1],\"%\")) + \n ylab(paste0(\"PC-2 \",pcvar[2],\"%\")) +\n theme(panel.grid.major = element_blank(), \n panel.grid.minor = element_blank(),\n panel.background = element_blank(),\n legend.text=element_text(size=rel(1.5)),\n axis.title=element_text(size=16),\n plot.title = element_text(size=16,face='bold')) +\n guides(colour = guide_legend(override.aes = list(size=5, alpha = 1))) +\n ggtitle(paste0(sample))#,\"_\",m)) \n return(g)\n \n \n }\n ##Run PCA plots with selected metadata\n cls=class(clusmat$clusid)\n if(cls == \"factor\"|cls == \"character\"){\n g = .runCateg(clusmat,sample)\n return(g)\n }else{\n clusmat %>% arrange(clusid) -> clusmat\n if(m==\"percent.mt\"){\n mid=5\n max = 10\n clusmat$clusid[clusmat$clusid > max] <- max\n }else{\n mid = quantile(clusmat$clusid)[3]\n max = quantile(clusmat$clusid,probs=0.95)\n clusmat$clusid[clusmat$clusid > max] <- max\n }\n g = .runCont(clusmat,mid,max,sample)\n return(g)\n }\n \n }\n \n \n .plotElbow <- function(so,sample){\n \n ##Select plot To determine number of PCs\n if(\"Elbow\" %in% methods.pca){\n #Find Elbow:\n #NC Add comments for context of specific actions\n sumpcsd = sum(so@reductions$pca@stdev)\n pcvar = (so@reductions$pca@stdev/sumpcsd)*100\n cumu <- cumsum(pcvar)\n co1 <- which(cumu > 80 & pcvar < 5)[1]\n co2 <- sort(which((pcvar[1:length(pcvar) - 1] - pcvar[2:length(pcvar)]) > \n var.threshold), \n decreasing = T)[1] + 1\n pcs <- min(co1,co2)\n lab <- paste0(\"Elbow = \", pcs)\n xpos <- pcs + 4\n }\n \n if(\"Marchenko-Pastur\" %in% methods.pca){\n #Using code from URD (https://rdrr.io/github/farrellja/URD/src/R/pca.R)\n #NC Add comments for context of specific actions\n pcaMarchenkoPastur <- function(M, N, pca.sdev, factor=1, do.print=T) {\n pca.eigenvalue <- (pca.sdev)^2\n marchenko.pastur.max <- (1+sqrt(M/N))^2\n pca.sig <- pca.eigenvalue > (marchenko.pastur.max * factor)\n if (do.print) {\n print(paste(\"Marchenko-Pastur eigenvalue null upper bound:\", \n marchenko.pastur.max))\n if (factor != 1) {\n print(paste(length(which(pca.sig)), \n \"PCs have eigenvalues larger than\", \n factor, \"times null upper bound.\"))\n } else {\n print(paste(length(which(pca.eigenvalue > marchenko.pastur.max)), \n \"PCs have larger eigenvalues.\"))\n }}\n pca.sig.length = length(pca.sig[pca.sig==TRUE])\n return(pca.sig.length)\n }\n \n ## Determine Dimentions of Expression data for MarchenkoPastur\n M <- dim(so$RNA@data)[1]\n N <- dim(so$RNA@data)[2]\n pca.sdev <- so@reductions$pca@stdev\n pca.sig.num <- pcaMarchenkoPastur(M=M,N=N,pca.sdev = pca.sdev)\n lab2 = paste0(\"MP = \", pca.sig.num)\n xpos2 = pca.sig.num+4\n }\n ep <- ElbowPlot(so,ndims=(npcs+10)) + theme_bw() + \n ggtitle(paste0(sample)) +\n theme(plot.title = element_text(size=16,face='bold'))\n \n if(exists(\"lab\")){\n ep <- ep + \n geom_vline(xintercept = pcs, color=\"red\") +\n annotate(\"text\", x=xpos, y = 4, label = lab, color=\"red\",size=4) \n }\n if(exists(\"lab2\")){\n ep <- ep + \n geom_vline(xintercept = pca.sig.num, color=\"blue\") +\n annotate(\"text\", x=xpos2, y = 6, label = lab2, color=\"blue\",size=4)\n }\n return(ep)\n }\n \n ## --------------- ##\n # Main Code Block ====\n ## --------------- ##\n \n \n #in case you want to redo this on a merged SO\n if (class(object) ==\"Seurat\") {\n x =list()\n x[[1]] <- object\n object <- x\n }\n \n # If exclude option is TRUE, filter out undesirable sample\n if (length(c(exclude.sample)) == 0){\n object <- object\n } else {\n # object <- object[-c(exclude.sample)]\n object <- object[!names(object)%in%exclude.sample]\n }\n \n # Remove all assays except RNA\n if(reduce.so==T){\n smpls=names(object)\n object2=sapply(smpls,function(x){\n so=object[[x]]\n DefaultAssay(so)='RNA'\n so=DietSeurat(object = so,\n assays = c('RNA','Protein')\n )\n return(so)\n })\n }\n \n ## Auto detect number of cells and turn on Conserve memory ====\n \n ## Calculate total number of cells in input SO.\n cell.count <- sum(unlist((lapply(object, function(x) dim(x)[2]))))\n \n ## Setting a limit for cell numbers\n # if (dim(object)[2] < cell.count.limit) {\n if (cell.count < cell.count.limit) {\n too.many.cells <- FALSE\n } else {\n too.many.cells <- TRUE\n }\n \n ## \n if (too.many.cells || only.var.genes) {\n conserve.memory <- TRUE\n } else {\n conserve.memory <- FALSE\n }\n \n \n ## Normalize Data ====\n \n if (SCT.level==\"Merged\") {\n # samples -> merge -> SCTransform -> \n # PrepSCTFindMarkers -> Find Variable Features \n \n ### Merge and SCTransform ====\n #### Merge Samples ====\n dat = vector()\n if (length(object) > 1) {\n for(i in 2:length(object)){dat=c(dat,object[[i]]) }\n \n object.merge <- merge(object[[1]], \n y = dat, \n add.cell.ids = names(object), \n project = project.name, \n merge.data = TRUE)\n allgenes <- rownames(object.merge)\n \n } else {\n object.merge <- object[[1]]\n allgenes <- rownames(object.merge)\n }\n \n #### SCTransform ====\n object.merge <-SCTransform(object.merge,\n do.correct.umi = TRUE,\n vars.to.regress=vars.to.regress, \n conserve.memory = conserve.memory, \n return.only.var.genes = only.var.genes)\n \n #### rescaling to lowest median SCT score across samples ====\n object.merge=PrepSCTFindMarkers(object.merge)\n \n #### FindVariableFeatures using options ====\n object.merge<-FindVariableFeatures(\n object = object.merge, \n nfeatures = nfeatures, \n mean.cutoff = c(low.cut, high.cut), \n dispersion.cutoff=c(low.cut.disp,high.cut.disp), \n selection.method = selection.method, \n verbose = FALSE)\n \n \n if(is.null(vars.to.regress)==F& pca.reg.plot==T){\n \n object.merge.nr <-SCTransform(object.merge,\n do.correct.umi = TRUE,\n vars.to.regress=vars.to.regress, \n conserve.memory = conserve.memory, \n return.only.var.genes = only.var.genes)\n \n #### rescaling to lowest median SCT score across samples ====\n object.merge.nr=PrepSCTFindMarkers(object.merge.nr)\n \n #### FindVariableFeatures using options ====\n object.merge.nr<-FindVariableFeatures(\n object = object.merge.nr, \n nfeatures = nfeatures, \n mean.cutoff = c(low.cut, high.cut), \n dispersion.cutoff=c(low.cut.disp,high.cut.disp), \n selection.method = selection.method, \n verbose = FALSE)\n \n }\n \n\n } else if (SCT.level==\"Sample\"){\n # Samples -> SCTransform -> \n # SelectIntegrationFeatures(set as Variable Features) ->\n # merge -> PrepSCTFindMarkers -> Set Variable Features\n ### SCTransform and merge ====\n #### SCTransform ====\n object.merge <- lapply(object,function(x){\n SCTransform(x,\n do.correct.umi = TRUE,\n vars.to.regress=vars.to.regress, \n conserve.memory = conserve.memory, \n return.only.var.genes = only.var.genes)\n })\n \n \n #### Integration features to set as Variable Features ####\n integ.features <- SelectIntegrationFeatures(\n object.list = object.merge, \n nfeatures = nfeatures, \n mean.cutoff = c(low.cut, high.cut), \n dispersion.cutoff=c(low.cut.disp,high.cut.disp),\n normalization.method=\"SCT\",\n verbose = FALSE)\n \n #### Merge Samples ====\n dat = vector()\n if (length(object.merge) > 1) {\n \n for(i in 2:length(object.merge)){dat=c(dat,object.merge[[i]]) }\n object.merge <- merge(object.merge[[1]], \n y = dat, \n add.cell.ids = names(object.merge), \n project = project.name, merge.data = TRUE)\n allgenes <- rownames(object.merge)\n \n } else {\n object.merge <- object.merge[[1]]\n allgenes <- rownames(object.merge)\n }\n \n #### rescaling to lowest median SCT score across samples ====\n object.merge=PrepSCTFindMarkers(object.merge)\n \n \n #### Set Variable Features ====\n VariableFeatures(object.merge) = integ.features\n \n \n \n ### non-Regression Test\n if(is.null(vars.to.regress)==F& pca.reg.plot==T){\n #### Merge\n object.merge.nr <- lapply(object,function(x){\n SCTransform(x,\n do.correct.umi = TRUE,\n conserve.memory = conserve.memory, \n return.only.var.genes = only.var.genes)\n })\n \n #### Integration Features\n integ.features.nr <- SelectIntegrationFeatures(\n object.list = object.merge.nr, \n nfeatures = nfeatures, \n mean.cutoff = c(low.cut, high.cut), \n dispersion.cutoff=c(low.cut.disp,high.cut.disp),\n normalization.method=\"SCT\",\n verbose = FALSE)\n \n #### Merge Samples \n dat = vector()\n if (length(object) > 1) {\n for(i in 2:length(object.merge.nr)){dat=c(dat,object.merge.nr[[i]]) }\n object.merge.nr <- merge(object.merge.nr[[1]], \n y = dat, \n add.cell.ids = names(object.merge.nr), \n project = project.name, merge.data = TRUE)\n allgenes.nr <- rownames(object.merge.nr)\n } else {\n object.merge.nr <- object.merge.nr[[1]]\n allgenes.nr <- rownames(object.merge.nr)\n }\n \n #### rescaling to lowest median SCT score accross samples ====\n object.merge.nr=PrepSCTFindMarkers(object.merge.nr)\n \n \n #### Set Variable Features ====\n VariableFeatures(object.merge.nr) = integ.features.nr\n \n }\n \n } else {stop(\"SCT method should be either Merged or Sample\")}\n \n ### QC plots ====\n grobsList = list() \n \n ## Internal Error Check\n ## Turn off pca.reg.plot if no regression variables selected.\n if(is.null(vars.to.regress)&pca.reg.plot==T){\n pca.reg.plot==F\n print('pca.reg.plot set to false because no \n Regression Variables were selected')\n }\n \n if ('none'%in%methods.pca==F|pca.reg.plot==T|jackstraw==T) {\n \n #### PCA on individual samples ====\n object.merge.split=SplitObject(object.merge, split.by = \"orig.ident\")\n n=names(object.merge.split)\n object.merge.split=lapply(n,function(x){\n RunPCA(object = object.merge.split[[x]],\n npcs = (npcs+10), verbose = FALSE,\n seed.use = seed.for.pca)})\n names(object.merge.split)=n\n \n } else {\"No PCA plots created\"}\n \n \n #### Create PCA regression plots ====\n if (pca.reg.plot==T) {\n \n object.merge.nr.split=SplitObject(object.merge.nr, split.by = \"orig.ident\")\n nr=names(object.merge.nr.split)\n object.merge.nr.split=lapply(nr,function(x){\n RunPCA(object = object.merge.nr.split[[x]],\n npcs = (npcs+10), verbose = FALSE,\n seed.use = seed.for.pca)})\n names(object.merge.nr.split)=nr\n \n \n k <- 1\n pca.grob=list()\n for (i in 1:length(vars.to.regress)){\n v=vars.to.regress[i]\n print(v)\n r <- lapply(names(object.merge.split), \n function(x){.plotPCA(object.merge.split[[x]],v,x)})\n nr <- lapply(names(object.merge.nr.split), \n function(x){.plotPCA(object.merge.nr.split[[x]],v,x)})\n \n grob = ggarrange(plotlist=r,ncol=1,\n common.legend = F,\n legend = 'right')%>%\n annotate_figure(top=text_grob(paste0(v,' Regression'), \n face = \"bold\", size = 20),\n fig.lab.size = 20,\n fig.lab.face = 'bold',\n fig.lab.pos='top') \n grob.nr = ggarrange(plotlist=nr\n ,ncol=1,\n common.legend = F,\n legend = 'right')%>%\n annotate_figure(top=text_grob('No Regression', \n face = \"bold\", size = 20),\n fig.lab.size = 20,\n fig.lab.face ='bold',\n fig.lab.pos='top')\n \n pca.grob=ggarrange(grob,grob.nr)\n \n grobsList[['Regression Plots']][[v]] =pca.grob\n \n }\n \n } else {\n print(\"PCA regression plots not created\")\n }\n \n ### Determin # of PCs ====\n #### create Elbow plot ====\n if ('none'%in%methods.pca==F) {\n \n elbow.grob=lapply(names(object.merge.split),function(x){\n gg=\n .plotElbow(object.merge.split[[x]],sample=x)\n return(gg+ylab(\"\")+xlab(\"\"))\n } \n ) \n elbow.comb=ggarrange(plotlist=elbow.grob,ncol =1) %>%\n annotate_figure(left=text_grob(\"Standard deviation\",size=16,rot=90),\n bottom=text_grob(\"PC\",size=16))\n \n grobsList[[\"Elbow Plot\"]]=elbow.comb\n grobsList[[\"Elbow Plot Individual\"]]=elbow.grob\n \n } \n \n #### Create Jackstraw plot ====\n ## Jackstraw does not work with SCT data so create ScaleData\n if (jackstraw==T) {\n # jackstraw.dims = (npcs+10)\n js <-lapply(names(object.merge.split), function(x){ \n jso=object.merge.split[[x]]\n DefaultAssay(jso)=\"RNA\"\n jso=ScaleData(jso)%>%\n FindVariableFeatures(nfeatures = nfeatures, \n mean.cutoff = c(low.cut, high.cut), \n dispersion.cutoff=c(low.cut.disp,high.cut.disp), \n selection.method = selection.method, \n verbose = F)%>%\n RunPCA(npcs = (npcs+10), \n verbose = FALSE,\n seed.use = seed.for.pca)%>%\n JackStraw(reduction = \"pca\",\n dims = jackstraw.dims,\n num.replicate = 100,\n prop.freq = 0.01,\n verbose = F,\n maxit = 1000)%>%suppressWarnings()\n })\n names(js)=names(object.merge.split)\n js <- lapply(names(js), function(x) ScoreJackStraw(js[[x]],\n dims = 1:jackstraw.dims))\n names(js )=names(object.merge.split)\n \n grob4 <- lapply(names(js), function(x) {JackStrawPlot(js[[x]],\n dims = 1:jackstraw.dims)+\n ggtitle(x)+\n ylab(\"\")+xlab(\"\")+\n theme(plot.title = element_text(size=16,face='bold'),\n axis.title=element_text(size=16))\n })\n names(grob4 )=names(object.merge.split)\n \n js.comb=ggarrange(plotlist=grob4,ncol =1) %>%\n annotate_figure(left=text_grob(\"Theoretical\",size=16,rot=90),\n bottom=text_grob(\"Empirical\",size=16))\n \n \n grobsList[['JackStraw']] <- js.comb\n }\n \n \n ## Dimension reduction ====\n \n object.merge <- RunPCA(object = object.merge, \n npcs = npcs, verbose = FALSE,\n seed.use = seed.for.pca)\n object.merge <- RunUMAP(object = object.merge, \n reduction = \"pca\", \n dims = 1:npcs, \n seed.use=seed.for.umap)\n object.merge <- RunTSNE(object = object.merge, \n reduction = \"pca\", \n dim.embed = 2, \n dims = 1:npcs, \n seed.use = seed.for.tsne)\n object.merge <- FindNeighbors(object.merge, dims = 1:npcs)\n \n ### non-Regression Test\n if(is.null(vars.to.regress)==F& pca.reg.plot==T){\n object.merge.nr <- RunPCA(object = object.merge.nr, \n npcs = npcs, verbose = FALSE,\n seed.use = seed.for.pca)\n }\n\n ### HTO scale merged ====\n if(cell.hashing.data){\n object.merge <- ScaleData(object.merge, assay = \"HTO\")\n } \n \n ## Process Citeseq ====\n # Original Workflow\n # https://satijalab.org/seurat/archive/v3.2/multimodal_vignette.html\n # from SeuratV4 workflow is the same\n # https://satijalab.org/seurat/archive/v4.3/weighted_nearest_neighbor_analysis\n\n ### Detect Citeseq\n #initialize Citeseq functionality as false, \n #later the template will check for a Protein assay and run if it finds it\n\n do.cite.seq <- FALSE\n if (\"Protein\" %in% names(object.merge@assays)){\n do.cite.seq <-TRUE\n }\n\n if(do.cite.seq) {\n print(\"finding Protein variable features...\")\n \n #### Normalize -> scale -> PCA - Citeseq ====\n \n VariableFeatures(object.merge,assay=\"Protein\") <-\n rownames(object.merge$Protein)\n \n if(all(sapply(seq_along(object),\n function(i) \"Protein\" %in% names(object[[i]]@assays)))){\n object.merge = NormalizeData(object.merge,\n assay = \"Protein\",\n normalization.method = \"CLR\")\n \n object.merge = ScaleData(object.merge, \n assay = 'Protein',\n verbose = FALSE) \n print(\"running Protein pca...\")\n \n p.npcs=min(nrow(object.merge$Protein),npcs)\n object.merge <- RunPCA(object = object.merge, \n assay=\"Protein\",\n npcs = p.npcs,\n reduction.name=\"protein_pca\",\n reduction.key =\"proteinPC_\"\n )\n \n ### FindMultiModalNeighbors - Citeseq ====\n \n object.merge <- FindMultiModalNeighbors(\n object.merge, \n reduction.list = list(\"pca\", \"protein_pca\"),\n dims.list = list(1:npcs, 1:(p.npcs-1)),\n modality.weight.name = \"RNA.weight\"\n )\n ### Dimension Reduction - Citeseq ====\n \n object.merge <- RunUMAP(object = object.merge, \n assay=\"Protein\", \n nn.name = \"weighted.nn\", \n reduction.name = \"protein_umap\",\n reduction.key = \"ProteinUMAP_\",\n features=rownames(object.merge$Protein), \n seed.use=seed.for.umap)\n object.merge <- RunTSNE(object = object.merge, \n assay=\"Protein\", \n nn.name = \"weighted.nn\", \n reduction.name=\"protein_tsne\",\n reduction.key =\"ProteinTSNE_\",\n features=rownames(object.merge$Protein),\n seed.use = seed.for.tsne,\n check.duplicates=F)\n }else{\n do.cite.seq <- FALSE #set to false so we don't cluster Protein\n }\n \n } else {\n do.cite.seq <- FALSE\n }\n \n \n ## Cluster ====\n \n for (i in seq(clust.res.low,clust.res.high,clust.res.bin)){\n ## Clustr RNAseq\n object.merge <- FindClusters(object.merge, \n resolution = i, \n algorithm = 1)\n if(do.cite.seq==TRUE){\n object.merge <- FindClusters(object.merge, \n graph.name=\"wsnn\",\n resolution = i, \n algorithm = 1, \n verbose = FALSE)\n }\n }\n print(\"Clustering successful!\")\n \n \n\n \n ## create plots ####\n \n n <- 60\n qual.col.pals = brewer.pal.info[brewer.pal.info$category == 'qual',]\n qual.col.pals = qual.col.pals[c(7,6,2,1,8,3,4,5),]\n cols = unlist(mapply(brewer.pal, \n qual.col.pals$maxcolors, \n rownames(qual.col.pals)))\n \n \n \n if(draw.tsne){\n p1 <- DimPlot(object.merge, \n reduction = \"tsne\",group.by = \"orig.ident\", \n repel = TRUE,pt.size=.75) + \n theme_classic() + \n scale_color_manual(values=cols) + \n theme(legend.position=\"right\", \n legend.text=element_text(size=rel(1.5)),\n aspect.ratio = 1,\n plot.title = element_text(size=16,face='bold',hjust = 0.5),\n axis.title=element_text(size=16)) +\n guides(colour = guide_legend(override.aes = list(size=5, alpha = 1))) + \n ggtitle(\"RNA TSNE\")\n \n grobsList[['TSNE']] <- p1\n print(\"Added RNA TSNE\")\n print(length(grobsList))\n \n }\n if(draw.umap){\n p2 <- DimPlot(object.merge, \n reduction = \"umap\", \n group.by = \"orig.ident\", \n repel = TRUE, pt.size=0.75) + \n theme_classic() + \n scale_color_manual(values=cols) + \n theme(legend.position=\"right\", \n legend.text=element_text(size=rel(1.5)),\n aspect.ratio = 1,\n plot.title = element_text(size=16,face='bold',hjust = 0.5),\n axis.title=element_text(size=16)) + \n ggtitle(\"RNA UMAP\")\n \n grobsList[['UMAP']] <- p2\n print(\"Added RNA UMAP\")\n print(length(grobsList))\n \n }\n \n ### CITEseq Figures\n if(draw.tsne & do.cite.seq){ \n p3 <- DimPlot(object.merge, \n reduction = \"protein_tsne\", \n group.by = \"orig.ident\", \n repel = TRUE, pt.size=0.75) + \n theme_classic() + \n scale_color_manual(values=cols) + \n theme(legend.position=\"right\", \n legend.text=element_text(size=rel(1.5)),\n aspect.ratio = 1,\n plot.title = element_text(size=16,face='bold',hjust = 0.5),\n axis.title=element_text(size=16)) + \n ggtitle(\"Antibody TSNE\")\n \n grobsList[['CITEseq TSNE']] <- p3\n print(\"Added Antibody TSNE\")\n print(length(grobsList))\n \n }\n if(draw.umap & do.cite.seq==TRUE){ \n p4 <- DimPlot(object.merge, \n reduction = \"protein_umap\", \n group.by = \"orig.ident\", \n repel = TRUE, pt.size=0.75) + \n theme_classic() + \n scale_color_manual(values=cols) + \n theme(legend.position=\"right\", \n legend.text=element_text(size=rel(1.5)),\n aspect.ratio = 1,\n plot.title = element_text(size=16,face='bold',hjust = 0.5),\n axis.title=element_text(size=16)) + \n ggtitle(\"Antibody UMAP\")\n grobsList[['CITEseq UMAP']] <- p4\n print(\"Added Antibody UMAP\")\n print(length(grobsList))\n \n }\n \n return(list(object=object.merge,\n plots=grobsList))\n}\n\n\n\n", + "columns": [], + "condaDependencies": [], + "description": "This template combines multiple sample Seurat Objects into a single Seurat Object and normalizes the combined dataset. The multi-dimensionality of the data will be summarized into a set of \"principal components\" and visualized in both UMAP and tSNE projections. A graph-based clustering approach will identify cell clusters with in the data. [View Documentation](https://nidap.nih.gov/workspace/notepad/view/ri.notepad.main.notepad.475afedf-fd74-42ae-9910-6ff053048cae)", + "externalId": "Combine_Normalize_CCBR_scRNA_seq_", + "inputDatasets": [ + { + "key": "Suerat_Object_List", + "displayName": "Suerat Object List", + "description": "Input should be a list containing Seurat Objects corresponding to a sample in your dataset.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_TRANSFORM_INPUT", + "tags": [] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "SCT_Level", + "displayName": "SCT Level", + "description": "Select at which stage to apply SCtransform nomalization. Merged: Merge all samples and apply SCTransfrom on merged object. Sample: Apply SCTranform on individual samples then merge into single Seurat object. (Default: \"Merged\")", + "paramType": "SELECT", + "paramGroup": "Normalization", + "paramValues": [ + "Merged", + "Sample" + ], + "defaultValue": "Merged", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Variables_to_Regress", + "displayName": "Variables to Regress", + "description": "Subtract (‘regress out’) this source of heterogeneity from the data. For example, to Subtract mitochondrial effects, input \"percent.mt.\" Options: percent.mt, nCount.RNA, S.Score, G2M.Score, CC.Difference.", + "paramType": "MULTISELECT", + "paramGroup": "Normalization", + "paramValues": [ + "percent.mt", + "nCount_RNA", + "S.Score", + "G2M.Score", + "CC.Difference", + "Phase" + ], + "defaultValue": "c()", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Number_of_Features", + "displayName": "Number of Features", + "description": "Number of variable features. (Default: 2000)", + "paramType": "NUMBER", + "paramGroup": "Find Variable Features", + "paramValues": null, + "defaultValue": "2000", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Mean_Low_Cutoff", + "displayName": "Mean - Low Cutoff", + "description": "Set low cutoff to calculate feature means in Seurat::FindVariableFeatures. (Default: 0.1)", + "paramType": "NUMBER", + "paramGroup": "Find Variable Features", + "paramValues": null, + "defaultValue": "0.1", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Mean_High_Cutoff", + "displayName": "Mean - High Cutoff", + "description": "Set high cutoff to calculate feature means in Seurat::FindVariableFeatures. (Default: 8)", + "paramType": "NUMBER", + "paramGroup": "Find Variable Features", + "paramValues": null, + "defaultValue": "8", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Dispersion_Low_Cutoff", + "displayName": "Dispersion: Low Cutoff", + "description": "Set low cutoff to calculate feature dispersions in Seurat::FindVariableFeatures. (Default: 1)", + "paramType": "NUMBER", + "paramGroup": "Find Variable Features", + "paramValues": null, + "defaultValue": "1", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Dispersion_High_Cutoff", + "displayName": "Dispersion: High Cutoff", + "description": "Set high cutoff to calculate feature dispersions in Seurat::FindVariableFeatures. (Default: 100000)", + "paramType": "NUMBER", + "paramGroup": "Find Variable Features", + "paramValues": null, + "defaultValue": "100000", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Selection_Method", + "displayName": "Selection Method", + "description": "Method to choose top variable features. (Default: 'vst')", + "paramType": "SELECT", + "paramGroup": "Find Variable Features", + "paramValues": [ + "vst", + "mean.var.plot", + "dispersion" + ], + "defaultValue": "vst", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Only_Variable_Genes", + "displayName": "Only Variable Genes", + "description": "If dataset is larger than ~40k filtered cells, toggle to TRUE. If TRUE, only variable genes will be available for downstream analysis. If dataset is larger than the number of cells set in \"Conserve Memory Max Cell Limit\" \"Only Variable Genes\" is automatically set to TRUE. (Default is FALSE).", + "paramType": "BOOLEAN", + "paramGroup": "Find Variable Features", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Conserve_Memory_Max_Cell_Limit", + "displayName": "Conserve Memory Max Cell Limit", + "description": "If total number of cell exceeds this limit conserve memory option of SCTransform will be used and return only Variable Genes. For NIDAP 35000 cells should be used to avoid memory errors.", + "paramType": "NUMBER", + "paramGroup": "Find Variable Features", + "paramValues": null, + "defaultValue": "35000", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Number_of_PC_s_for_PCA_UMAP_t_SNE", + "displayName": "Number of PC's for PCA, UMAP, t-SNE", + "description": "Select the number of principal components for your analysis. For most datasets the default of 30 should be sufficient. For additional guidance in Selecting PCs use either the Elbow and/or JackStraw plot in the Advanced: Determine number of PCs section. (Default: 30)", + "paramType": "NUMBER", + "paramGroup": "Dimension Reduction", + "paramValues": null, + "defaultValue": "30", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "draw_umap", + "displayName": "Draw UMAP", + "description": "If TRUE, draw UMAP plot.", + "paramType": "BOOLEAN", + "paramGroup": "Dimension Reduction", + "paramValues": null, + "defaultValue": "TRUE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "draw_t_sne", + "displayName": "Draw t-SNE", + "description": "If TRUE, draw TSNE plot.", + "paramType": "BOOLEAN", + "paramGroup": "Dimension Reduction", + "paramValues": null, + "defaultValue": "TRUE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Seed_for_PCA", + "displayName": "Seed for PCA", + "description": "Set a random seed for PCA calculation. (Default: 42)", + "paramType": "NUMBER", + "paramGroup": "Dimension Reduction", + "paramValues": null, + "defaultValue": "42", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Seed_for_TSNE", + "displayName": "Seed for TSNE", + "description": "Set a random seed for TSNE calculation. (Default: 1)", + "paramType": "NUMBER", + "paramGroup": "Dimension Reduction", + "paramValues": null, + "defaultValue": "1", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Seed_for_UMAP", + "displayName": "Seed for UMAP", + "description": "Set a random seed for UMAP calculation. (Default: 42)", + "paramType": "NUMBER", + "paramGroup": "Dimension Reduction", + "paramValues": null, + "defaultValue": "42", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Cluster_Resolution_High_Range", + "displayName": "Cluster Resolution - High Range", + "description": "Select the maximum resolution for clustering. The higher you set this number, the MORE clusters you will produced. (Default: 1.2)", + "paramType": "NUMBER", + "paramGroup": "Clustering", + "paramValues": null, + "defaultValue": "1.2", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Cluster_Resolution_Low_Range", + "displayName": "Cluster Resolution - Low Range", + "description": "Select minimum resolution for clustering plots. The lower you set this, the FEWER clusters will be generated. (Default: 0.2)", + "paramType": "NUMBER", + "paramGroup": "Clustering", + "paramValues": null, + "defaultValue": "0.2", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Cluster_Resolution_Range_Bins", + "displayName": "Cluster Resolution - Range Bins", + "description": "Select the bins for your cluster plots. For example, if you input 0.2 as your bin, and have low/high resolution ranges of 0.2 and 0.6, then the template will produce cluster plots at resolutions of 0.2, 0.4 and 0.6. (Default: 0.2)", + "paramType": "NUMBER", + "paramGroup": "Clustering", + "paramValues": null, + "defaultValue": "0.2", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Method_for_Finding_Significant_PCs", + "displayName": "Method for Finding Significant PCs", + "description": "Methods available: Marchenko-Pastur: use eigenvalue null upper bound from URD, Elbow: Find threshold where percent change in variation between consecutive PCs is less than X% (set below). If none is selected (regardless of other selections) the plot will not be generated. Default: 'none'", + "paramType": "MULTISELECT", + "paramGroup": "Advanced: Determine Number of PCs", + "paramValues": [ + "Elbow", + "Marchenko-Pastur", + "none" + ], + "defaultValue": "c(\"none\")", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Change_in_Variation_Threshold", + "displayName": "Change in Variation Threshold", + "description": "For Elbow method, set percent change threshold in variation between consecutive PCs. (Default: 0.1)", + "paramType": "NUMBER", + "paramGroup": "Advanced: Determine Number of PCs", + "paramValues": null, + "defaultValue": "0.1", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Draw_JackStraw_Plot", + "displayName": "Draw JackStraw Plot", + "description": "Opt to visualize your data in a Jackstraw plot. Jackstraw plot can add more description than an elbow plot but is compute intensive process and may not be suitable for larger datasets. (Default: FALSE)", + "paramType": "BOOLEAN", + "paramGroup": "Advanced: Determine Number of PCs", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Number_of_Dimensions_for_JackStraw", + "displayName": "Number of Dimensions for JackStraw", + "description": "Recommended max 10 (Default: 5)", + "paramType": "STRING", + "paramGroup": "Advanced: Determine Number of PCs", + "paramValues": null, + "defaultValue": "5", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Draw_PCA_Regression_Plot", + "displayName": "Draw PCA Regression Plot", + "description": "Opt to visualize the effect of your regression variables on in a PCA plot. This plot will create PCA plots with and without regression variables applied and can be used to help determine if regression is necessary to properly normalize your data. (Default: FALSE)", + "paramType": "BOOLEAN", + "paramGroup": "Advanced: Determine Number of PCs", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Exclude_Sample", + "displayName": "Exclude Sample", + "description": "Exclude unwanted samples from the merge step. Include sample names to be removed. Each entry should contain the name of one sample that you wish to exclude from the merge step.", + "paramType": "VECTOR", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "c(\"\")", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Project_Name", + "displayName": "Project Name", + "description": "Add project name to the Seurat object metadata. (Default: 'scRNAProject')", + "paramType": "STRING", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "scRNAProject", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Cell_Hashing_Data", + "displayName": "Cell Hashing Data", + "description": "Toggle \"true\" if you are using cell-hashed data. (Default: FALSE)", + "paramType": "BOOLEAN", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Reduce_Object", + "displayName": "Reduce Object", + "description": "Remove any additional assays from input Seurat Objects except for the original RNA Assay. This option should be used if input Seurat Object was created outside of the NIDAP pipeline. (Default: FALSE)", + "paramType": "BOOLEAN", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "TRUE", + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "Combine & Normalize [CCBR] [scRNA-seq]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/inst/extdata/NIDAPjson/DE_with_Find_Markers_CCBR_scRNA_seq_.code-template.json b/inst/extdata/NIDAPjson/DE_with_Find_Markers_CCBR_scRNA_seq_.code-template.json new file mode 100644 index 0000000..431155e --- /dev/null +++ b/inst/extdata/NIDAPjson/DE_with_Find_Markers_CCBR_scRNA_seq_.code-template.json @@ -0,0 +1,125 @@ +{ + "codeTemplate": "DEGMarkers <- function({{{Seurat_Object}}},{{{sample_table}}},{{{metadata_table}}}) {\n\n ## --------- ##\n ## Libraries ##\n ## --------- ##\n\n library(nidapFunctions)\n nidapLoadPackages(\"SCWorkflow\")\n\n ## -------------------------------- ##\n ## User-Defined Template Parameters ##\n ## -------------------------------- ##\n\n seurat_object <- {{{Seurat_Object}}}\n metadata_table <- {{{metadata_table}}}\n\n# Samples and Assay parameters\n samples <- '{{{samples}}}'\n assay_to_use <- \"{{{Assay_to_Use}}}\"\n\n# Contrasts parameters\n parameter_to_test <- \"{{{parameter_to_test}}}\"\n contrasts <- {{{contrasts}}}\n\n# Test parameters\n test_to_use <- \"{{{Test_to_Use}}}\"\n log_fc_threshold <- {{{Log_Fold_Change_Threshold}}}\n\n\n## Presetting to FALSE\n use_spark <- FALSE\n\n\n ##--------------- ##\n ## Error Messages ##\n ## -------------- ##\n \n \n ## --------- ##\n ## Functions ##\n ## --------- ##\n\n\n ## --------------- ##\n ## Main Code Block ##\n ## --------------- ##\n\n\n ## Load SO \n cat(\"Reading Seurat Object from dataset: seurat_object.rds\\n\\n\")\n fs <- seurat_object$fileSystem()\n path <- fs$get_path(\"seurat_object.rds\", 'r')\n SO <- readRDS(path)\n print(SO)\n\nresults <- degGeneExpressionMarkers(object = SO,\n samples = samples,\n contrasts = contrasts,\n parameter.to.test = parameter_to_test,\n test.to.use = test_to_use,\n log.fc.threshold = log_fc_threshold,\n use.spark = use_spark,\n assay.to.use = assay_to_use)\n\n### ----------------------------------------------- ###\n### Josh Edit 2024-08-20 through 2024-08-30 - Begin ###\n### ----------------------------------------------- ###\n\n### Purpose of this edit is to bring output table in-line with \n### column name expectations from GSEA downstream. Column names \n### should be more similar to those from Bulk DEG Analysis output\n### when we are done.\n\n# Original column names\noriginal_colnames <- colnames(results$df)\n\n# Function to rename columns based on pattern matching\nrename_columns <- function(colnames, pattern, suffix) {\n # Identify columns that match the pattern\n matched <- grepl(pattern, colnames)\n \n # Apply the transformation only to the matching columns\n colnames[matched] <- gsub(\n pattern = paste0(\"^\", pattern), # Match the specific pattern at the start\n replacement = \"C_\", # Replace pattern with \"C_\"\n x = colnames[matched]\n )\n \n # Append the suffix to the columns that were matched\n colnames[matched] <- gsub(\n pattern = \"C_(.*)_vs_(.*)\", # Capture the parts after \"C_\"\n replacement = paste0(\"C_\\\\1_vs_\\\\2\", suffix), # Reconstruct the name and append the suffix\n x = colnames[matched]\n )\n \n return(colnames)\n}\n\n# Apply the renaming function for various patterns with their corresponding suffixes\nnew_colnames <- original_colnames\nnew_colnames <- rename_columns(new_colnames, \"p_val_adj_\", \"_adjpval\")\nnew_colnames <- rename_columns(new_colnames, \"avg_log2FC_\", \"_logFC\")\nnew_colnames <- rename_columns(new_colnames, \"pct.1_\", \"_pct1\")\nnew_colnames <- rename_columns(new_colnames, \"pct.2_\", \"_pct2\")\nnew_colnames <- rename_columns(new_colnames, \"p_val_\", \"_pval\")\n\n# Update the column names in the dataframe\ncolnames(results$df) <- new_colnames\n\n# # Function to calculate t-statistics after removing rows with NA values\n# calculate_tstat <- function(df, logfc_col, pval_col) {\n# logFC <- df[[logfc_col]]\n# pval <- df[[pval_col]]\n \n# # Ensure columns are numeric\n# logFC <- as.numeric(logFC)\n# pval <- as.numeric(pval)\n \n# # Remove rows with NA values in either column\n# valid_indices <- !is.na(logFC) & !is.na(pval)\n# logFC <- logFC[valid_indices]\n# pval <- pval[valid_indices]\n \n# # Calculate t-statistic\n# tstat <- sign(logFC) * sqrt(qchisq(1 - pval, df = 1))\n \n# # Initialize the tstat column with NA values and fill in the valid rows\n# tstat_col <- rep(NA, nrow(df))\n# tstat_col[valid_indices] <- tstat\n \n# return(tstat_col)\n# }\n\n# # Identify contrasts from column names, excluding non-contrast columns\n# all_colnames <- colnames(results$df)\n# contrast_patterns <- c(\"pval_\", \"logFC_\", \"pct1_\", \"pct2_\", \"adjpval_\")\n# contrast_cols <- all_colnames[grepl(\"^C_.*_(pval|logFC|pct1|pct2|adjpval)$\", all_colnames)]\n# contrasts <- unique(gsub(\"C_(.*?)_(pval|logFC|pct1|pct2|adjpval)$\", \"\\\\1\", contrast_cols))\n\n# # Exclude the \"Gene\" column from contrasts\n# contrasts <- contrasts[contrasts != \"Gene\"]\n\n# # Loop through each contrast and calculate the t-statistic\n# for (contrast in contrasts) {\n# logfc_col <- paste0(\"C_\", contrast, \"_logFC\")\n# pval_col <- paste0(\"C_\", contrast, \"_pval\")\n \n# # Ensure columns exist in the dataframe\n# if (logfc_col %in% colnames(results$df) && pval_col %in% colnames(results$df)) {\n# cat(\"Processing contrast:\", contrast, \"\\n\")\n \n# # Calculate t-statistic\n# tstat <- calculate_tstat(results$df, logfc_col, pval_col)\n \n# # Add t-statistic column to the dataframe\n# results$df[[paste0(\"C_\", contrast, \"_tstat\")]] <- tstat\n# } else {\n# warning(paste(\"Columns\", logfc_col, \"or\", pval_col, \"do not exist in the dataframe.\"))\n# }\n# }\n\n# View the updated dataframe with updated column names\nhead(results$df)\n\n# View the updated column names\ncolnames(results$df)\n\n### --------------------------------------------- ###\n### Josh Edit 2024-08-20 through 2024-08-30 - End ###\n### --------------------------------------------- ###\n\n return(results$df)\n\n}\n\n\n", + "columns": [ + { + "key": "samples", + "displayName": "Samples", + "description": "Please select your samples that you would like to include. You may Add all and then deselect those you wish to exclude from analysis.", + "paramGroup": "Samples and Assay ", + "sourceDataset": "sample_table", + "defaultValue": null, + "columnType": "ALL", + "isMulti": true + }, + { + "key": "parameter_to_test", + "displayName": "Parameter to Test", + "description": "Please select the metadata column that you would like to use to perform your DEG analysis and construct your contrasts from.", + "paramGroup": "Contrasts", + "sourceDataset": "metadata_table", + "defaultValue": null, + "columnType": "ALL", + "isMulti": null + } + ], + "condaDependencies": [], + "description": "This template performs a DE (differential expression) analysis on a merged Seurat object to identify expression markers between different groups of cells (contrasts). This analysis uses the FindMarkers() function of the Seurat Workflow. Final Potomac Compatible Version: v87. Final Sugarloaf V2: v93. [View Documentation](https://nidap.nih.gov/workspace/notepad/view/ri.notepad.main.notepad.b5a0a717-1f45-499b-8e9b-388299bf22a3)", + "externalId": "DE_with_Find_Markers_CCBR_scRNA_seq_", + "inputDatasets": [ + { + "key": "Seurat_Object", + "displayName": "Seurat Object", + "description": "Select an input Seurat Object.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_TRANSFORM_INPUT", + "tags": [] + }, + { + "key": "sample_table", + "displayName": "Sample Table", + "description": "Select an input table with Sample Names for column headers. These samples names should match the orig.idents in the input Seurat Object. Usually, this is the output from the \"Get Sample Names\" template run on the same input Seurat Object.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + }, + { + "key": "metadata_table", + "displayName": "Metadata Table", + "description": "Select the Metadata Table from the input Seurat Object. This should be the output table from the \"Get Metadata Table\" template.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "Assay_to_Use", + "displayName": "Assay to Use", + "description": "This is the assay to use for your DEG analysis. Default is SCT, but can use linearly scaled data by selecting RNA instead.", + "paramType": "SELECT", + "paramGroup": "Samples and Assay ", + "paramValues": [ + "SCT", + "RNA", + "Spatial" + ], + "defaultValue": "SCT", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "contrasts", + "displayName": "Contrasts", + "description": "Please input your contrasts in the \"A-B\" format. For example, to test A vs. B, input \"A-B.\" To include \"B-C\", add a second contrast and input \"B-C.\" To test A vs all other cell groups, input \"A-all.\"", + "paramType": "VECTOR", + "paramGroup": "Contrasts", + "paramValues": null, + "defaultValue": "c(\"1-2\",\"3-all\")", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Test_to_Use", + "displayName": "Test to Use", + "description": "Please select the kind of algorithm you would like to use to perform your DEG analysis. Default is the MAST algorithm.", + "paramType": "SELECT", + "paramGroup": "Test", + "paramValues": [ + "wilcox", + "bimod", + "roc", + "t", + "negbinom", + "poisson", + "LR", + "MAST", + "DESeq2" + ], + "defaultValue": "MAST", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Log_Fold_Change_Threshold", + "displayName": "Log Fold-Change Threshold", + "description": "Input the minimum log fold-change between contrasts that you would like to analysize. Increasing the log-fold change will decrease the number of genes identified and raise the bar for genotypic difference between the two contrast groups. Lowering the log-fold change will increase the number of genes identified, but include genes with a lower degree of expression difference.", + "paramType": "NUMBER", + "paramGroup": "Test", + "paramValues": null, + "defaultValue": "0", + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "DE with Find Markers [CCBR] [scRNA-seq]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/inst/extdata/NIDAPjson/Dot_Plot_of_Genes_by_Metadata_CCBR_scRNA_seq_.code-template.json b/inst/extdata/NIDAPjson/Dot_Plot_of_Genes_by_Metadata_CCBR_scRNA_seq_.code-template.json new file mode 100644 index 0000000..690245b --- /dev/null +++ b/inst/extdata/NIDAPjson/Dot_Plot_of_Genes_by_Metadata_CCBR_scRNA_seq_.code-template.json @@ -0,0 +1,138 @@ +{ + "codeTemplate": "DotPlotGenesByMetadata_ModuleScores <- function({{{Input_Dataset}}},{{{Category_Labels_and_Genes_Table}}},{{{Metadata_Table}}}) {\n\n ## --------- ##\n ## Libraries ##\n ## --------- ##\n\n \n\n library(nidapFunctions)\n nidapLoadPackages(c(\"SCWorkflow\",\"ggplot2\",\"cowplot\",\"magrittr\",\"tidyr\"))\n #library(ggplot2)\n #library(cowplot) \n ## -------------------------------- ##\n ## User-Defined Template Parameters ##\n ## -------------------------------- ##\n \n #Primary Inputs:\n input_dataset <- {{{Input_Dataset}}}\n metadata_table <- {{{Metadata_Table}}}\n category_labels_and_genes_table <- {{{Category_Labels_and_Genes_Table}}}\n\n #Category Parameters:\n metadata_category_to_plot <- \"{{{Metadata_Category_to_Plot}}}\"\n category_labels_to_plot <- \"{{{Category_Labels_to_Plot}}}\"\n genes_column <- \"{{{Genes_Column}}}\"\n\n #Output Parameters:\n return_percentage_cells_expressing <- {{{Return_Percentage_of_Cells_Expressing}}}\n seurat_object_filename <- \"{{{Seurat_Object_Filename}}}\"\n\n #Visualization Parameters:\n reverse_plot <- {{{Reverse_Plot}}}\n reverse_categories <- {{{Reverse_Categories}}}\n dot_color <- \"{{{Dot_Color}}}\"\n \n ## -------------------------------- ##\n ## Parameter Misspecifation Errors ##\n ## -------------------------------- ##\n\n if(class(input_dataset) != \"FoundryTransformInput\"){\n stop(\"Input should be Seurat object in rds file format. Rerun previous step with latest released version to produce correct input format for Seurat Object\")\n }\n\n if(sum(category_labels_and_genes_table[[category_labels_to_plot]] %in% metadata_table[[metadata_category_to_plot]]) == 0){\n stop(paste0(\"At least some category element in input table column: \", category_labels_to_plot, \" should match Seurat Object metadata category column: \",metadata_category_to_plot))\n }\n\n ## -------------------------------- ##\n ## Functions ##\n ## -------------------------------- ##\n\n ## --------------- ##\n ## Main Code Block ##\n ## --------------- ##\n\n path <- nidapGetPath(input_dataset,seurat_object_filename)\n so <- readRDS(path)\n\n #Change metadata tables to match NIDAP:\n metadata.df <- so@meta.data\n colnames(metadata.df) <- gsub(\"\\\\.\",\"_\",colnames(metadata.df))\n so@meta.data <- metadata.df\n\n cells <- category_labels_and_genes_table[[category_labels_to_plot]]\n cells <- as.factor(cells[!is.na(cells)])\n\n\n\n\n### Temporary fix - ignore extra labels:\nlibrary(Seurat)\nExtraValue <- sum(!cells %in% unique(metadata.df[[metadata_category_to_plot]]))\nif (ExtraValue > 0) {\n missinglab2 <- cells[!cells %in% unique(metadata.df[[metadata_category_to_plot]])]\n warning(sprintf(\"There are %s additional elements in your input categories\\n that are missing from your metadata table: \", ExtraValue))\n missinglab2 <- cat(paste(as.character(missinglab2), collapse = \"\\n\"))\n#\n cells <- cells[cells %in% unique(metadata.df[[metadata_category_to_plot]])]\n#\n }\n### End of the fix \n\n\n\n\n genes <- category_labels_and_genes_table[[genes_column]]\n genes <- genes[!is.na(genes)]\n\n results <- dotPlotMet(object = so,\n metadata = metadata_category_to_plot,\n cells = cells,\n markers = genes,\n plot.reverse = reverse_plot,\n cell.reverse.sort = reverse_categories,\n dot.color = dot_color)\n\n print(results$plot)\n\n if(return_percentage_cells_expressing == TRUE){\n return(results$pct)\n } else {\n return(results$exp)\n }\n}\n\n\n#################################################\n## Global imports and functions included below ##\n#################################################\n\n# Functions defined here will be available to call in\n# the code for any table.\n\n\ndotPlotMet <- function(object,\n metadata,\n cells,\n markers,\n plot.reverse = FALSE,\n cell.reverse.sort = FALSE,\n dot.color = \"darkblue\") {\n \n #Set up metadata as new identity:\n metadata.df <- object@meta.data\n Idents(object) <- metadata.df[[metadata]]\n \n #### Error messages #### \n \n #Calculate difference in input category elements from metadata column elements\n a <- sum(cells %in% unique(Idents(object)))\n b <- sum(!unique(Idents(object)) %in% cells)\n c <- sum(!cells %in% unique(Idents(object)))\n \n if (a < 2) {\n stop(\n \"At least 2 metadata categories you wish to plot should\n match the metadata column you are plotting.\"\n )\n }\n \n if (b > 0) {\n missinglab <-\n unique(Idents(object))[!unique(Idents(object)) %in% cells]\n warning(\n sprintf(\n \"There are %s additional element(s) in the metadata table category that \n were missing from your input categories: %s\", b,\n paste(as.character(missinglab), collapse = \"\\n\")\n )\n )\n }\n \n if (c > 0) {\n missinglab2 <- cells[!cells %in% unique(Idents(object))]\n warning(\n sprintf(\n \"There are %s additional elements in your input categories\n that are missing from your metadata table: \", c)\n )\n missinglab2 <-\n cat(paste(as.character(missinglab2), collapse = \"\\n\"))\n }\n \n #Subset object by identity\n object <- subset(object, idents = cells)\n \n #Clean up input genes and custom names\n markers <- gsub(\"[[:space:]]\", \"\", markers)\n l1 <- length(markers)\n dups <- markers[duplicated(markers)]\n markers <- markers[!duplicated(markers)]\n \n l2 <- length(markers)\n print(sprintf(\"There are %s total unique genes in the genelist\", l2))\n if (l1 > l2) {\n warning(sprintf(\"\\n\\nThe following duplicate genes were removed: %s\",\n dups))\n }\n missing.genes <- markers[!markers %in% rownames(object)]\n \n l3 <- length(missing.genes)\n missing.genes <- paste(shQuote(missing.genes), collapse = \", \")\n if (l3 == l2) {\n stop(\"No genes listed are found in dataset.\")\n }\n if (l3 > 0) {\n warning(\n sprintf(\n \"There are %s gene(s) absent from dataset: %s. Possible reasons are that\n gene is not official gene symbol or gene is not highly expressed and\n has been filtered.\\n \", l3, missing.genes) \n )\n }\n \n #### Main Code: #####\n \n markers <- markers[markers %in% rownames(object)]\n \n cells <- cells[cells != \"\"]\n \n #Run Seurat Dotplot function\n dp <- DotPlot(object,\n assay = \"SCT\",\n features = markers,\n dot.scale = 4,\n dot.min = .1,\n cols = c(\"lightgrey\", dot.color)\n )\n cells <- cells[cells %in% dp$data$id]\n if (length(cells) < 1) {\n stop(\"None of the cell types in list match cell types in metadata\")\n }\n cells.missing <- cells[!cells %in% dp$data$id]\n if (length(cells.missing) > 0) {\n cells.missing <- paste(shQuote(cells.missing), collapse = \", \")\n warning(sprintf(\n \"Some categories are missing from your dataset: %s\",\n cells.missing\n ))\n }\n \n #Add to ggplot object data created by DotPlot and draw plot\n dp$data$id <- factor(dp$data$id, levels = rev(cells))\n dp$data$features.plot <- factor(dp$data$features.plot, levels = markers)\n \n plot <- ggplot(data = dp$data,\n mapping = aes_string(x = \"features.plot\", y = \"id\")) +\n geom_point(mapping = aes_string(size = \"pct.exp\",\n color = \"avg.exp.scaled\")) +\n scale_color_gradient(low = \"lightgrey\", high = dot.color) +\n theme_cowplot() +\n theme(axis.title.x = element_blank(),\n axis.text.x = element_text(angle = 90, \n vjust = 1,\n hjust = 1)) +\n labs(y = metadata)\n \n if (plot.reverse == TRUE) {\n plot <- plot + coord_flip()\n }\n if (cell.reverse.sort == TRUE) {\n plot <- plot + scale_y_discrete(limits = rev(levels(dp$data$id)))\n }\n \n #Provide Tabular format of Dotplot data \n dp.pct.tab <- dp$data %>%\n plotly::select(features.plot, pct.exp, id) %>%\n tidyr::pivot_wider(names_from = features.plot,\n values_from = pct.exp)\n dp.exp.tab <- dp$data %>%\n plotly::select(features.plot, avg.exp.scaled, id) %>%\n tidyr::pivot_wider(names_from = features.plot,\n values_from = avg.exp.scaled)\n \n result.list <-\n list(\"plot\" = plot,\n \"pct\" = dp.pct.tab,\n \"exp\" = dp.exp.tab)\n \n return(result.list)\n \n}\n\n\n\n", + "columns": [ + { + "key": "Metadata_Category_to_Plot", + "displayName": "Metadata Category to Plot", + "description": "Category to plot on Y-axis of Dotplot", + "paramGroup": "Category", + "sourceDataset": "Metadata_Table", + "defaultValue": null, + "columnType": "STRING", + "isMulti": null + }, + { + "key": "Category_Labels_to_Plot", + "displayName": "Category Labels to Plot", + "description": "Column with Categorical data (e.g. Cell Types, sample names) to plot in dotplot in order of appearance, top to bottom. The labels should match the categories in the Metadata Column", + "paramGroup": "Category", + "sourceDataset": "Category_Labels_and_Genes_Table", + "defaultValue": null, + "columnType": "STRING", + "isMulti": null + }, + { + "key": "Genes_Column", + "displayName": "Genes Column", + "description": "Column with Genes to plot in dotplot (in order of appearance, left to right)", + "paramGroup": "Category", + "sourceDataset": "Category_Labels_and_Genes_Table", + "defaultValue": null, + "columnType": "STRING", + "isMulti": null + } + ], + "condaDependencies": [], + "description": "This template creates a dot plot of average gene expression values for a set of genes in cell subpopulations defined by metadata annotation columns. The input table contains a single column for genes (the \"Genes column\") and a single column for category (the \"Category labels to plot\" column). The values in the \"Category labels to plot\" column should match the values provided in the metadata template (Metadata Category to Plot). The plot will order the genes (x-axis, left to right) and Categories (y-axis, top to bottom) in the order in which it appears in the input table. Any category entries omitted will not be plotted. \n\nThe Dotplot size will reflect the percentage of cells expressing the gene while the color will reflect the average expression for the gene. A table showing values on the plot (either percentage of cells expressing gene, or average expression scaled) will be returned, as selected by user. Final Potomac Compatible Version: v22. Sugarloaf V1: v31. [View Documentation](https://nidap.nih.gov/workspace/notepad/view/ri.notepad.main.notepad.327eafda-9e86-49c2-a14e-8bb2e6ee2cb9)", + "externalId": "Dot_Plot_of_Genes_by_Metadata_CCBR_scRNA_seq_", + "inputDatasets": [ + { + "key": "Input_Dataset", + "displayName": "Input Dataset", + "description": "Select an input Seurat Object.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_TRANSFORM_INPUT", + "tags": [] + }, + { + "key": "Metadata_Table", + "displayName": "Metadata Table", + "description": "Select the Metadata Table for the input Seurat Object. This table can be generated from the input Seurat Object using the \"Get Metadata Table\" template.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + }, + { + "key": "Category_Labels_and_Genes_Table", + "displayName": "Category Labels and Genes Table", + "description": "Custom Input Table containing 2 columns: first with categories in Seurat Object metadata to plot and second with genes to plot in x-axis.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "Return_Percentage_of_Cells_Expressing", + "displayName": "Return Percentage of Cells Expressing", + "description": "If TRUE, return table of percent cells expressing genes. If FALSE, show average gene expression per category.", + "paramType": "BOOLEAN", + "paramGroup": "Output", + "paramValues": null, + "defaultValue": "TRUE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Seurat_Object_Filename", + "displayName": "Seurat Object Filename", + "description": "Filename of RDS containing Seurat Object. Default is seurat_object.rds", + "paramType": "STRING", + "paramGroup": "Output", + "paramValues": null, + "defaultValue": "seurat_object.rds", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Reverse_Plot", + "displayName": "Reverse Plot", + "description": "If TRUE, plot genes on y-axis and categories on x-axis. FALSE by default.", + "paramType": "BOOLEAN", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Reverse_Categories", + "displayName": "Reverse Categories", + "description": "If TRUE, plot categories in reverse order. FALSE by default.", + "paramType": "BOOLEAN", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Dot_Color", + "displayName": "Dot Color", + "description": "Dotplot color", + "paramType": "SELECT", + "paramGroup": "Visualization", + "paramValues": [ + "darkblue", + "blue", + "darkred", + "purple4" + ], + "defaultValue": "darkblue", + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "Dot Plot of Genes by Metadata [CCBR] [scRNA-seq]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/inst/extdata/NIDAPjson/Filter_Low_Quality_Cells_CCBR_scRNA_seq_.code-template.json b/inst/extdata/NIDAPjson/Filter_Low_Quality_Cells_CCBR_scRNA_seq_.code-template.json new file mode 100644 index 0000000..e5ba59d --- /dev/null +++ b/inst/extdata/NIDAPjson/Filter_Low_Quality_Cells_CCBR_scRNA_seq_.code-template.json @@ -0,0 +1,312 @@ +{ + "codeTemplate": "QCFiltered_SO <- function({{{Suerat_Object_List}}}) {\n\n## --------- ##\n## Libraries ##\n## --------- ##\n\n library(nidapFunctions)\n nidapLoadPackages(c(\"SCWorkflow\",\"Seurat\",\"reshape2\",\"magrittr\",\"dplyr\",\"ggplot2\",\"ggpubr\",\"gridExtra\",\"scDblFinder\",\"matrixStats\",\"stringr\",\"grid\",\"BiocParallel\"))\n\n\n## -------------------------------- ##\n## User-Defined Template Parameters ##\n## -------------------------------- ## \n\nobject = {{{Suerat_Object_List}}}\n\n## Filter Samples\nmin.cells = {{{Minimum_Cells}}}\nncounts.high= {{{UMI_Count_nCount_RNA_Limits_High}}}\nncounts.low= {{{UMI_Count_nCount_RNA_Limits_Low}}}\nmad.ncounts.high= {{{MAD_UMI_Count_nCount_RNA_Limits_High}}}\nmad.ncounts.low= {{{MAD_UMI_Count_nCount_RNA_Limits_Low}}}\nnfeature.high= {{{Gene_Count_nFeature_RNA_Limits_High}}}\nnfeature.low= {{{Gene_Count_nFeature_RNA_Limits_Low}}}\nmad.nfeature.high= {{{MAD_Gene_Count_nFeature_RNA_Limits_High}}}\nmad.nfeature.low= {{{MAD_Gene_Count_nFeature_RNA_Limits_Low}}}\nmitoch.high = {{{Mitochondrial_Genes_percent_mt_Limits_High}}} \nmitoch.low = {{{Mitochondrial_Genes_percent_mt_Limits_Low}}}\nmad.mitoch.high = {{{MAD_Mitochondrial_Genes_percent_mt_Limits_High}}}\nmad.mitoch.low = {{{MAD_Mitochondrial_Genes_percent_mt_Limits_Low}}}\ncomplexity.high = {{{Complexity_log10GenesPerUMI_Limits_High}}}\ncomplexity.low = {{{Complexity_log10GenesPerUMI_Limits_Low}}}\nmad.complexity.high = {{{MAD_Complexity_log10GenesPerUMI_Limits_High}}}\nmad.complexity.low = {{{MAD_Complexity_log10GenesPerUMI_Limits_Low}}}\ntopNgenes.high = {{{Counts_in_Top_N_Genes_Limits_High}}}\ntopNgenes.low = {{{Counts_in_Top_N_Genes_Limits_Low}}}\nmad.topNgenes.high = {{{MAD_Counts_in_Top_N_Genes_Limits_High}}}\nmad.topNgenes.low = {{{MAD_Counts_in_Top_N_Genes_Limits_Low}}}\nn.topgnes={{{N_for_Top_N_Genes}}}\ndo.doublets.fitler={{{Doublets_Filter}}}\nfilter.vdj.genes={{{Filter_VDJ_Genes}}}\n\n## dim Reduction settings\nnfeatures = 2000\nlow_cut = 0.1\nhigh_cut = 8\nlow_cut_disp = 1\nhigh_cut_disp = 100000\nselection_method = \"vst\"\nnpcs = 30\nvars_to_regress = c()\nintegratedata = FALSE\nclust_res_low=0.2\nclust_res_high = 1.2\nclust_res_bin = 0.2\nonly_var_genes = FALSE\n\nseed_for_PCA = 42\nseed_for_TSNE = 1\nseed_for_UMAP = 42\n\n\n## ------------------- ##\n## Process Variables ##\n## ------------------- ##\nncounts.limits=c(ncounts.high,ncounts.low)\nmad.ncounts.limits=c(mad.ncounts.high,mad.ncounts.low)\nnfeature.limits=c(nfeature.high,nfeature.low)\nmad.nfeature.limits=c(mad.nfeature.high,mad.nfeature.low)\nmitoch.limits=c(mitoch.high,mitoch.low)\nmad.mitoch.limits=c(mad.mitoch.high,mad.mitoch.low)\ncomplexity.limits=c(complexity.high,complexity.low)\nmad.complexity.limits=c(mad.complexity.high,mad.complexity.low)\ntopNgenes.limits=c(topNgenes.high,topNgenes.low)\nmad.topNgenes.limits=c(mad.topNgenes.high,mad.topNgenes.low)\n\n\nncounts.limits=gsub(\" \",\"\",ncounts.limits)\nmad.ncounts.limits=gsub(\" \",\"\",mad.ncounts.limits)\nnfeature.limits=gsub(\" \",\"\",nfeature.limits)\nmad.nfeature.limits=gsub(\" \",\"\",mad.nfeature.limits)\nmitoch.limits=gsub(\" \",\"\",mitoch.limits)\nmad.mitoch.limits=gsub(\" \",\"\",mad.mitoch.limits)\ncomplexity.limits=gsub(\" \",\"\",complexity.limits)\nmad.complexity.limits=gsub(\" \",\"\",mad.complexity.limits)\ntopNgenes.limits=gsub(\" \",\"\",topNgenes.limits)\nmad.topNgenes.limits=gsub(\" \",\"\",mad.topNgenes.limits)\n\nncounts.limits=as.numeric(ncounts.limits[c(1,2)])%>%\nrev()%>%suppressWarnings()\nmad.ncounts.limits=as.numeric(mad.ncounts.limits[c(1,2)])%>%\nrev()%>%suppressWarnings()\nnfeature.limits=as.numeric(nfeature.limits[c(1,2)])%>%\nrev()%>%suppressWarnings()\nmad.nfeature.limits=as.numeric(mad.nfeature.limits[c(1,2)])%>%\nrev()%>%suppressWarnings()\nmitoch.limits=as.numeric(mitoch.limits[c(1,2)])%>%\nrev()%>%suppressWarnings()\nmad.mitoch.limits=as.numeric(mad.mitoch.limits[c(1,2)])%>%\nrev()%>%suppressWarnings()\ncomplexity.limits=as.numeric(complexity.limits[c(1,2)])%>%\nrev()%>%suppressWarnings()\nmad.complexity.limits=as.numeric(mad.complexity.limits[c(1,2)])%>%\nrev()%>%suppressWarnings()\ntopNgenes.limits=as.numeric(topNgenes.limits[c(1,2)])%>%\nrev()%>%suppressWarnings()\nmad.topNgenes.limits=as.numeric(mad.topNgenes.limits[c(1,2)])%>%\nrev()%>%suppressWarnings()\nn.topgnes=as.numeric(n.topgnes)\n\n\n## ------------------- ##\n## Load Seurat Object ##\n## ------------------- ##\n\n# Loading Seurat object\n cat(\"1. Reading Seurat Object from dataset: seurat_object.rds\\n\\n\")\n fs <- object$fileSystem()\n path <- fs$get_path(\"seurat_object.rds\", 'r')\n so <- readRDS(path)\n\n\n## --------------- ##\n## Run Fucnction ##\n## --------------- ## \n\n\nout=filterQC(object=so,\n \n ## Filter Samples\n min.cells = min.cells,\n filter.vdj.genes=filter.vdj.genes,\n nfeature.limits=nfeature.limits,\n mad.nfeature.limits=mad.nfeature.limits,\n ncounts.limits=ncounts.limits,\n mad.ncounts.limits=mad.ncounts.limits,\n mitoch.limits = mitoch.limits,\n mad.mitoch.limits = mad.mitoch.limits,\n complexity.limits = complexity.limits,\n mad.complexity.limits = mad.complexity.limits,\n topNgenes.limits = topNgenes.limits,\n mad.topNgenes.limits = mad.topNgenes.limits,\n n.topgnes=n.topgnes,\n do.doublets.fitler=do.doublets.fitler\n)\n\n\n## --------------- ##\n## Plot Figures ##\n## --------------- ##\n\nplot(out$plots$PostFilterCombined)\nplot(out$plots$ViolinPostFilter)\nplot(out$plots$ScatterPlotCombine)\nplot(out$plots$ViolinPlotCombine)\n\n## Summary Tables\ncolnames(out$FilteringTables$FilteringCounts)=gsub(\" \\\\(\",\"\\n\\\\(\",colnames(out$FilteringTables$FilteringCounts))\n colnames(out$FilteringTables$FilteringCounts)=gsub(\"Cells removed by \",\"Cells removed by\\n\",colnames(out$FilteringTables$FilteringCounts))\n colnames(out$FilteringTables$FilteringCounts)=gsub(\"Percent Remaining\",\"Percent\\nRemaining\",colnames(out$FilteringTables$FilteringCounts))\n colnames(out$FilteringTables$FilteringCounts)=gsub(\"VDJ Genes Removed\",\"VDJ Genes\\nRemoved\",colnames(out$FilteringTables$FilteringCounts))\n colnames(out$FilteringTables$FilteringCounts)=gsub(\"% Mitochondrial Genes\",\"%Mitochondrial \\nGenes\",colnames(out$FilteringTables$FilteringCounts))\n colnames(out$FilteringTables$FilteringCounts)=gsub(\"% Counts in Top\",\"%Counts in\\nTop\",colnames(out$FilteringTables$FilteringCounts))\n colnames(out$FilteringTables$FilteringCounts)=gsub(\"log10GenesPerUMI\",\"log10Genes/UMI\",colnames(out$FilteringTables$FilteringCounts))\n colnames(out$FilteringTables$FilteringCounts)=gsub(\"Minimum Cells per Gene\",\"Minimum\\nCells\\nper Gene\",colnames(out$FilteringTables$FilteringCounts))\n colnames(out$FilteringTables$FilteringCounts)=gsub(\"Cells before Filtering\",\"Cells Before\\nFiltering\",colnames(out$FilteringTables$FilteringCounts))\n colnames(out$FilteringTables$FilteringCounts)=gsub(\"Cells after all Filters\",\"Cells after\\nall Filters\",colnames(out$FilteringTables$FilteringCounts))\n colnames(out$FilteringTables$FilteringCounts)=gsub(\" filter\",\"\",colnames(out$FilteringTables$FilteringCounts))\n\nout$FilteringTables$FilteringCounts=out$FilteringTables$FilteringCounts[order(rownames(out$FilteringTables$FilteringCounts)),] \n\n table=tableGrob(out$FilteringTables$FilteringCounts,theme = ttheme_default(base_size = 8))\n h <- grobHeight(table)\n title <- textGrob(\"Filtering Summary\", y=unit(0.65,\"npc\") + 0.5*h, \n vjust=0, gp=gpar(fontsize=18))\n grid.newpage()\ngTree(children=gList(table, title))%>%grid.draw()\n \n \n\ncolnames(out$FilteringTables$FilteringLimits)=gsub(\" \\\\(\",\"\\n\\\\(\",colnames(out$FilteringTables$FilteringLimits))\n colnames(out$FilteringTables$FilteringLimits)=gsub(\"MAD \",\"MAD\\n\",colnames(out$FilteringTables$FilteringLimits))\n colnames(out$FilteringTables$FilteringLimits)=gsub(\"% Mitochondrial Genes\",\"%Mitochondrial \\nGenes\",colnames(out$FilteringTables$FilteringLimits))\n colnames(out$FilteringTables$FilteringLimits)=gsub(\"% Counts in Top\",\"%Counts in\\nTop\",colnames(out$FilteringTables$FilteringLimits))\n colnames(out$FilteringTables$FilteringLimits)=gsub(\"log10GenesPerUMI\",\"log10Genes/UMI\",colnames(out$FilteringTables$FilteringLimits))\n colnames(out$FilteringTables$FilteringLimits)=gsub(\"Minimum Cells per Gene\",\"Minimum\\nCells\\nper Gene\",colnames(out$FilteringTables$FilteringLimits))\n colnames(out$FilteringTables$FilteringLimits)=gsub(\"DoubletFinder\",\"Use\\nDoubletFinder\",colnames(out$FilteringTables$FilteringLimits))\n\n table=tableGrob(out$FilteringTables$FilteringLimits,theme = ttheme_default(base_size = 8))\n h <- grobHeight(table)\n title <- textGrob(\"Filtering Parameters\", y=unit(0.65,\"npc\") + 0.5*h, \n vjust=0, gp=gpar(fontsize=18))\n \n grid.newpage()\n gTree(children=gList(table, title))%>%grid.draw()\n\n## --------------------- ##\n## Save Seurat object ##\n## --------------------- ##\n\n\n output <- new.output()\n output_fs <- output$fileSystem()\n saveRDS(out$object, output_fs$get_path(\"seurat_object.rds\", 'w'))\n\n return(NULL)\n \n}\n\n\n\n#################################################\n## Global imports and functions included below ##\n#################################################\n\n\n\nfilterQC <- function(object,\n \n ## Filter Samples\n min.cells = 20,\n filter.vdj.genes=F,\n nfeature.limits=c(NA,NA),\n mad.nfeature.limits=c(5,5),\n ncounts.limits=c(NA,NA),\n mad.ncounts.limits=c(5,5),\n mitoch.limits = c(NA,25),\n mad.mitoch.limits = c(NA,3),\n complexity.limits = c(NA,NA),\n mad.complexity.limits = c(5,NA),\n topNgenes.limits = c(NA,NA),\n mad.topNgenes.limits = c(5,5),\n n.topgnes=20,\n do.doublets.fitler=T,\n \n ## dim Reduction settings\n plot.outliers=\"None\", #options(None,UMAP,tSNE) \n group.column = NA,\n nfeatures = 2000,\n low.cut = 0.1,\n high.cut = 8,\n low.cut.disp = 1,\n high.cut.disp = 100000,\n selection.method = \"vst\",\n npcs = 30,\n vars_to_regress=NULL,\n seed.for.PCA = 42,\n seed.for.TSNE = 1,\n seed.for.UMAP = 42\n \n \n \n){\n \n \n \n ## --------- ##\n ## Functions ####\n ## --------- ##\n \n ### Helper Functions #####\n \n .topNGenes <- function(so,n.topgnes) { \n ##Extract counts table\n counts_matrix = GetAssayData(so, slot=\"counts\")\n \n ## calculate Counts in Top n genes \n tbl= apply(counts_matrix,2,function(i){\n cnts=i[order(i,decreasing=T)]\n \n t20=sum(cnts[1:n.topgnes])\n total=sum(cnts)\n \n pertop20=(t20/total)*100\n return(pertop20)\n })\n \n ### add to metadata \n tbl=as.data.frame(tbl)\n so_out=AddMetaData(so, tbl, col.name = 'pct_counts_in_top_N_genes')\n \n return(so_out) \n }\n \n .rowMaxs=function(mtx){\n apply(mtx, 1, max,na.rm=T)\n }\n .rowMins=function(mtx){\n apply(mtx, 1, min,na.rm=T)\n }\n \n .madCalc <- function(so,column,limits){\n stdev <- mad(so@meta.data[,column])\n med <- median(so@meta.data[,column])\n \n minlim <- med-(limits[1]*stdev)\n maxlim <- med+(limits[2]*stdev)\n # gl <- format(round(maxlim,0),nsmall=0)## Remove used in testing\n \n return(c(minlim,maxlim))\n \n }\n \n .checkLimits <- function(limits){\n minlim=limits[1]\n maxlim=limits[2]\n if(is.numeric(minlim)==F |is.na(minlim) |is.null(minlim)){minlim=-Inf}\n if(is.numeric(maxlim)==F|is.na(maxlim) |is.null(maxlim)){maxlim=Inf}\n return(c(minlim,maxlim))\n } \n \n \n \n ### Plotting Functions ####\n \n \n #### Filter QC plots ####\n \n .plotViolin2=function(count.df,value){\n axis.lab = unique(count.df$filt)\n ylabs=gsub(\" \\\\(\", \"\\n\\\\(\",value)\n ylabs=gsub(paste0(\" Top\",n.topgnes), paste0(\"\\nTop\",n.topgnes),ylabs)\n \n ### Set up table fore cut off lines\n ## clean up cutoff values\n for (v in c(value)) {\n \n count.df[,paste0(v,'_Filters')]=gsub(\"Low:|High:\",\"\",\n count.df[,paste0(v,'_Filters')])\n count.df[,paste0('MAD ',v)]=gsub(\"Low:|High:\",\"\",\n count.df[,paste0('MAD ',v)])\n \n count.df[,paste0(v,'_Filters')]=gsub(\"\\n\",\",\",\n count.df[,paste0(v,'_Filters')])\n count.df[,paste0('MAD ',v)]=gsub(\"\\n\",\",\",\n count.df[,paste0('MAD ',v)])\n \n count.df[,paste0(v,'_Filters')]=gsub(\"-Inf|Inf\",\"NA\",\n count.df[,paste0(v,'_Filters')])\n count.df[,paste0('MAD ',v)]=gsub(\"-Inf|Inf\",\"NA\",\n count.df[,paste0('MAD ',v)])\n }\n \n ####### Y axis\n ## get sample cut off values\n count.df.lim=count.df[,c('Sample',paste0(value,'_Filters'),\n paste0('MAD ',value))]%>%unique\n \n ## convert to numeric values\n count.df.lim_MAD=str_split_fixed(count.df.lim[,paste0('MAD ',value)],\n pattern=',',2)%>%as.data.frame\n rownames(count.df.lim_MAD)=count.df.lim$Sample\n colnames(count.df.lim_MAD)=c('Low','High')\n count.df.lim_MAD$Low=as.numeric(count.df.lim_MAD$Low)\n count.df.lim_MAD$High=as.numeric(count.df.lim_MAD$High)\n count.df.lim_cut=str_split_fixed(count.df.lim[,paste0(value,'_Filters')],\n pattern=',',2)%>%as.data.frame\n rownames(count.df.lim_cut)=count.df.lim$Sample\n colnames(count.df.lim_cut)=c('Low','High') \n count.df.lim_cut$Low=as.numeric(count.df.lim_cut$Low)%>%suppressWarnings()\n count.df.lim_cut$High=as.numeric(count.df.lim_cut$High)%>%suppressWarnings()\n count.df.lim$Low=.rowMaxs(cbind(count.df.lim_cut[,'Low'],\n count.df.lim_MAD[,'Low']))#,na.rm=T)\n count.df.lim[count.df.lim$Low<0,'Low']=0\n count.df.lim$High=.rowMins(cbind(count.df.lim_cut[,'High'],\n count.df.lim_MAD[,'High']))#,na.rm=T)\n \n \n \n g <- ggplot(count.df, aes(x=filt, y=.data[[value]])) +\n # ggtitle(paste(name,count.df$variable[1])) +\n theme_classic()+\n theme(panel.grid.major = element_blank(), \n panel.grid.minor = element_blank(),\n panel.background = element_blank(),\n legend.text=element_text(size=rel(1.5)),\n legend.title=element_blank(), \n axis.text=element_text(size=10),\n axis.title.x=element_blank(),\n # axis.title.y=element_blank(),\n # axis.text.x=element_text(angle=45,hjust=1),\n axis.text.x=element_blank(),\n plot.title = element_text(size = 12, face = \"bold\")) +\n geom_violin(aes(fill=filt)) + \n # scale_fill_manual(values = c(\"#00AFBB\", \"#FC4E07\")) + \n geom_boxplot(width=0) +\n # scale_x_discrete(limits = as.vector(axis.lab))+\n labs( y = ylabs)+\n geom_hline(data = count.df.lim, aes(yintercept = Low,\n linetype='Filter\\nLimits'), \n col = 'grey')+\n geom_hline(data = count.df.lim, aes(yintercept = High),\n linetype='dashed', col = 'grey')+\n scale_linetype_manual(name = \"Filter\\nLimits\", values = 'dashed',\n guide = guide_legend(override.aes = \n list(color = c(\"grey\"),\n size=2)))+\n facet_wrap(~Sample,nrow=1)%>%suppressWarnings()\n \n return(g)\n }\n \n \n \n .plotScatter2=function(count.df,value){\n # count.df$filt=factor(count.df$filt,levels = c('filt','raw'))\n count.df$filt=factor(count.df$filt,levels = c('raw','filt'))\n ylabs=gsub(\" \\\\(\", \"\\n\\\\(\",value)\n ylabs=gsub(paste0(\" Top\",n.topgnes), paste0(\"\\nTop\",n.topgnes),ylabs)\n \n ### Set up table fore cut off lines\n ## clean up cutoff values\n for (v in c('UMI Count (nCount_RNA)',value)) {\n \n count.df[,paste0(v,'_Filters')]=gsub(\"Low:|High:\",\"\",\n count.df[,paste0(v,'_Filters')])\n count.df[,paste0('MAD ',v)]=gsub(\"Low:|High:\",\"\",\n count.df[,paste0('MAD ',v)])\n \n count.df[,paste0(v,'_Filters')]=gsub(\"\\n\",\",\",\n count.df[,paste0(v,'_Filters')])\n count.df[,paste0('MAD ',v)]=gsub(\"\\n\",\",\",count.df[,paste0('MAD ',v)])\n \n count.df[,paste0(v,'_Filters')]=gsub(\"-Inf|Inf\",\"NA\",\n count.df[,paste0(v,'_Filters')])\n count.df[,paste0('MAD ',v)]=gsub(\"-Inf|Inf\",\"NA\",\n count.df[,paste0('MAD ',v)])\n }\n \n####### Y axis\n ## get sample cut off values\n count.df.lim=count.df[,c('Sample',paste0(value,'_Filters'),\n paste0('MAD ',value))]%>%unique\n \n ## convert to numeric values\n count.df.lim_MAD=str_split_fixed(count.df.lim[,paste0('MAD ',value)],\n pattern=',',2)%>%as.data.frame\n rownames(count.df.lim_MAD)=count.df.lim$Sample\n colnames(count.df.lim_MAD)=c('Low','High')\n count.df.lim_MAD$Low=as.numeric(count.df.lim_MAD$Low)\n count.df.lim_MAD$High=as.numeric(count.df.lim_MAD$High)\n count.df.lim_cut=str_split_fixed(count.df.lim[,paste0(value,'_Filters')],\n pattern=',',2)%>%as.data.frame\n rownames(count.df.lim_cut)=count.df.lim$Sample\n colnames(count.df.lim_cut)=c('Low','High') \n count.df.lim_cut$Low=as.numeric(count.df.lim_cut$Low)\n count.df.lim_cut$High=as.numeric(count.df.lim_cut$High)\n count.df.lim$Low=.rowMaxs(cbind(count.df.lim_cut[,'Low'],\n count.df.lim_MAD[,'Low']))#,na.rm=T)\n count.df.lim[count.df.lim$Low<0,'Low']=0\n count.df.lim$High=.rowMins(cbind(count.df.lim_cut[,'High'],\n count.df.lim_MAD[,'High']))#,na.rm=T)\n \n####### X axis\n valueX='UMI Count (nCount_RNA)'\n ## get sample cut off values\n count.df.limX=count.df[,c('Sample',paste0(valueX,'_Filters'),\n paste0('MAD ',valueX))]%>%unique\n \n ## convert to numeric values\n count.df.limX_MAD=str_split_fixed(count.df.limX[,paste0('MAD ',valueX)],\n pattern=',',2)%>%as.data.frame\n rownames(count.df.limX_MAD)=count.df.limX$Sample\n colnames(count.df.limX_MAD)=c('Low','High')\n count.df.limX_MAD$Low=as.numeric(count.df.limX_MAD$Low)\n count.df.limX_MAD$High=as.numeric(count.df.limX_MAD$High)\n count.df.limX_cut=str_split_fixed(count.df.limX[,paste0(valueX,'_Filters')],\n pattern=',',2)%>%as.data.frame\n rownames(count.df.limX_cut)=count.df.limX$Sample\n colnames(count.df.limX_cut)=c('Low','High') \n count.df.limX_cut$Low=as.numeric(count.df.limX_cut$Low)\n count.df.limX_cut$High=as.numeric(count.df.limX_cut$High)\n count.df.limX$Low=.rowMaxs(cbind(count.df.limX_cut[,'Low'],\n count.df.limX_MAD[,'Low']))#,na.rm=T)\n count.df.limX[count.df.limX$Low<0,'Low']=0\n count.df.limX$High=.rowMins(cbind(count.df.limX_cut[,'High'],\n count.df.limX_MAD[,'High']))#,na.rm=T)\n \n \n \n g <- count.df%>%arrange(filt)%>%\n ggplot(aes(x=`UMI Count (nCount_RNA)`,y=.data[[value]],color=filt)) + \n geom_point(size = 0.5) +\n \n theme_classic() +\n theme(\n # strip.background =element_rect(fill=\"grey\"),\n panel.grid.major = element_blank(), \n panel.grid.minor = element_blank(),\n panel.background = element_blank(),\n legend.text=element_text(size=rel(1.5)),\n legend.title=element_blank(), \n # axis.title.x=element_blank(),\n axis.text.x=element_text(angle=45,hjust=1),\n axis.text=element_text(size=10)\n ) + \n guides(colour = guide_legend(override.aes = list(size=5)))+\n labs( y = ylabs)+\n geom_hline(data = count.df.lim, aes(yintercept = Low,\n linetype='Filter\\nLimits'), \n col = 'grey')+\n geom_hline(data = count.df.lim, aes(yintercept = High),\n linetype='dashed', col = 'grey')+\n geom_vline(data = count.df.limX, aes(xintercept = Low),linetype='dashed', \n col = 'grey')+\n geom_vline(data = count.df.limX, aes(xintercept = High),\n linetype='dashed', col = 'grey')+\n scale_linetype_manual(name = \"Filter Limits\", values = 'dashed',\n guide = guide_legend(override.aes = \n list(color = c(\"grey\"),\n size=2)))+\n facet_wrap(~Sample,nrow=1,)%>%suppressWarnings()\n \n return(g)\n }\n \n \n \n .combinePlots=function(plot.list){\n plot.list.mod=plot.list\n for (x in c(2:length(plot.list))) {\n plot.list.mod[[x]]=plot.list.mod[[x]]+theme(\n strip.background = element_blank(),\n strip.text.x = element_blank()\n )\n }\n for (x in c(1:(length(plot.list)-1))) {\n plot.list.mod[[x]]=plot.list.mod[[x]]+theme(\n axis.title.x = element_blank()\n )\n }\n return(plot.list.mod)\n }\n \n \n .runTsnepPlot= function(filterCat,filterM,so,reduction){\n if (reduction==\"umap\") {\n qcFiltr.df.plot <- as.data.frame(so@reductions$umap@cell.embeddings)\n }else{\n qcFiltr.df.plot <- as.data.frame(so@reductions$tsne@cell.embeddings)\n }\n \n filterM=filterM[,filterCat,drop=F]\n \n qcFiltr.df.plot[,filterCat]=NA\n qcFiltr.df.plot[rownames(qcFiltr.df.plot)%in%\n rownames(filterM[filterM[,1]==T,1,drop=F]),\n colnames(filterM)]=\"Normal\"\n qcFiltr.df.plot[rownames(qcFiltr.df.plot)%in%\n rownames(filterM[filterM[,1]==F,1,drop=F]==F),\n colnames(filterM)]=\"Removed\"\n qcFiltr.df.plot[,colnames(filterM)]=\n factor(qcFiltr.df.plot[,colnames(filterM)],levels=c(\"Normal\",'Removed'))\n \n g <- .plotTsne(qcFiltr.df.plot,so@project.name,filterCat)\n return(g) \n }\n \n .plotTsne <- function(qcFiltr.df.plot,name,var){\n g <- ggplot(qcFiltr.df.plot[order(qcFiltr.df.plot[,var]),]) +\n geom_point(mapping = aes_string(x=colnames(qcFiltr.df.plot[,1,drop=F]),\n y=colnames(qcFiltr.df.plot[,2,drop=F]),\n color=var),\n size = 1) + \n theme_classic() + \n ggtitle(paste(name,\"\\n\",var)) +\n scale_color_manual(values = c(\"grey\",\"red\")) +\n #scale_colour_gradient2(midpoint = mid[i],low=\"blue\",mid=\"grey\",high=\"red\") + \n theme(legend.title=element_blank())%>%suppressWarnings()\n }\n \n #### Post Filter plots ####\n .plotScatterPost2=function(count.df,xaxis,yaxis){\t\n xlab = as.character(xaxis)\t\n ylab = as.character(yaxis)\t\n ylab=gsub(\" \\\\(\", \"\\n\\\\(\",ylab)\n ylab=gsub(paste0(\" Top\",n.topgnes), paste0(\"\\nTop\",n.topgnes),ylab)\n \n name = paste(ylab,\"vs.\",xlab) \n g =ggplot(count.df, aes(x=.data[[xaxis]], y=.data[[yaxis]],color = Sample))+\n geom_point(size = 0.5) + \n theme_classic() +\n theme(legend.position='right',legend.text=element_text(size=10),\n legend.title=element_blank()) + \n guides(colour = guide_legend(override.aes = list(size=5))) +\n scale_color_manual(values = col2) +\n labs( x = xlab, y = ylab)%>%suppressWarnings()\n \n return(g)\n }\n \n .plotHistPost2 <- function(count.df,xaxis){\t\n g=ggplot(count.df) + \n theme_bw() +\n geom_density(aes(x = .data[[xaxis]], colour = Sample)) +\n # labs(x = NULL) +\n theme(legend.position='right',\n panel.grid.major = element_blank(), \n panel.grid.minor = element_blank(),\n panel.background = element_blank(),\n legend.text=element_text(size=12),\n legend.title=element_blank(), \n # axis.title.x=element_blank(),\n axis.text.x=element_text(angle=45,hjust=1),\n axis.text=element_text(size=10)\n ) + \n # ggtitle(xaxis) +\n scale_x_continuous(trans='log10') + \n scale_color_manual(values = col2) %>% \n suppressMessages()%>%suppressWarnings()\n return(g)\n }\n\n \n .plotViolinPost2=function(count.df,yaxis){\n axis.lab = unique(count.df$Sample)\n ylabs=gsub(\" \\\\(\", \"\\n\\\\(\",yaxis)\n ylabs=gsub(paste0(\" Top\",n.topgnes), paste0(\"\\nTop\",n.topgnes),ylabs)\n \n \n g=ggplot(count.df, aes(x=Sample, y=(.data[[yaxis]]))) +\n ggtitle(yaxis) +\n theme_classic()+\n theme(panel.grid.major = element_blank(), \n panel.grid.minor = element_blank(),\n panel.background = element_blank(),\n legend.text=element_text(size=rel(1)),\n legend.title=element_blank(), \n axis.text=element_text(size=10),\n axis.title.x=element_blank(),\n axis.title.y=element_blank(),\n axis.text.x=element_blank(),\n plot.title = element_text(size = 15, face = \"bold\")) +\n labs( y = ylabs)+\n geom_violin(aes(fill=as.factor(Sample))) + \n scale_fill_manual(values = col2) +\n geom_boxplot(width=0) +\n scale_x_discrete(limits = as.vector(axis.lab))%>%suppressWarnings() \n return(g)\n \n }\n \n \n ### Process SO object #####\n \n .seuratObject <- function(so.list,i) {\n ## i should be list of SO objects that have gone through pre-processing\n ## and samples should be Log normalized \n # so.nf=so.nf.list[[i]]\n so.nf <- so.list[[i]]\n \n ## Optional: TSNE/UMAP for figures ####\n \n if(plot.outliers!=\"none\"){\n so.nf.qcFiltr <- SCTransform(so.nf,do.correct.umi = TRUE,\n vars.to.regress=vars_to_regress, \n return.only.var.genes = FALSE)\n so.nf.qcFiltr = FindVariableFeatures(object = so.nf.qcFiltr, \n nfeatures = nfeatures, \n mean.cutoff = c(low.cut, high.cut), \n dispersion.cutoff=c(low.cut.disp,high.cut.disp), \n selection.method=selection.method, verbose = FALSE)\n so.nf.qcFiltr <- RunPCA(object = so.nf.qcFiltr, \n npcs = npcs, verbose = FALSE,\n seed.use = seed.for.PCA)\n if (plot.outliers==\"umap\") {\n \n so.nf.qcFiltr <- RunUMAP(object = so.nf.qcFiltr, \n reduction = \"pca\", \n dims = 1:npcs, \n seed.use=seed.for.UMAP)\n qcFiltr.df.plot = as.data.frame(\n so.nf.qcFiltr@reductions$umap@cell.embeddings)\n so.nf=AddMetaData(so.nf,qcFiltr.df.plot) \n \n }else{\n \n so.nf.qcFiltr <- RunTSNE(object = so.nf.qcFiltr, \n reduction = \"pca\", \n dim.embed = 2, \n dims = 1:npcs, \n seed.use = seed.for.TSNE)\n qcFiltr.df.plot = as.data.frame(\n so.nf.qcFiltr@reductions$tsne@cell.embeddings)\n so.nf=AddMetaData(so.nf,qcFiltr.df.plot) \n }\n }\n \n ## Filtering \n ## set SO for filtering\n so <- so.nf\n \n \n ### Gene Filters #### \n ### Remove VDJ genes \n VDJgenesOut=c()\n if (filter.vdj.genes==TRUE) {\n allGenes = rownames(so)\n VDJgenes = c(\"TRBV\",\"TRAV\",\"TRBD\",\"TRAJ\",\"TRBJ\")\n print(\"Removing VDJ genes. Genes removed...\")\n print(length(allGenes))\n for (j in VDJgenes) {\n j=toupper(j)\n print(allGenes[grepl(j, toupper(allGenes))])\n VDJgenesOut=c(VDJgenesOut,allGenes[grepl(j, toupper(allGenes))])\n \n allGenes = allGenes[!grepl(j, toupper(allGenes))] \n }\n so <- subset(so,features = allGenes)\n } \n \n ### min # of Cells per gene\n ##CreateSeuratObject can apply min.cells but we do it in this module not in \n # processing module.\n # CreateSeuratObject also calcs nfeature and nCounts. Testing showed that \n # nfeature and nCounts calculations are not effected by min.cells when using \n # CreateSeuratObject\n \n gene.cell.count=apply(so@assays$RNA@counts,1,function(x){sum(x>0)})\n \n if ('Protein'%in%names(so@assays)==T) {\n genes=c(names(gene.cell.count)[(gene.cell.count>=min.cells)],\n rownames(so@assays$Protein))%>%unique()\n }else{ genes=names(gene.cell.count)[(gene.cell.count>=min.cells)]}\n \n so=subset(so, features=genes)\n \n \n ### Cell filters ####\n ## Caluclate filter Metrics\n \n ## calculate Counts in Top 20 Genes\n so=.topNGenes(so,n.topgnes)\n \n ## Counts(umi) Filter \n mad.ncounts.limits=.madCalc(so,'nCount_RNA',mad.ncounts.limits)\n mad.ncounts.limits=.checkLimits(mad.ncounts.limits)\n ncounts.limits=.checkLimits(ncounts.limits)\n mad.ncounts.limits=mad.ncounts.limits%>%round(digits=2)\n ncounts.limits=ncounts.limits%>%round(digits=2)\n \n ncounts.filter=((so@meta.data$nCount_RNA >= \n max(ncounts.limits[1],mad.ncounts.limits[1])) &\n (so@meta.data$nCount_RNA <= \n min(ncounts.limits[2], mad.ncounts.limits[2]))\n ) \n \n ## Gene Filter (nFeatrue)\n mad.nfeature.limits=.madCalc(so,'nFeature_RNA',mad.nfeature.limits)\n mad.nfeature.limits=.checkLimits(mad.nfeature.limits)\n nfeature.limits=.checkLimits(nfeature.limits)\n mad.nfeature.limits=mad.nfeature.limits%>%round(digits=2)\n nfeature.limits=nfeature.limits%>%round(digits=2)\n \n nfeature.filter= ((so@meta.data$nFeature_RNA >= \n max(nfeature.limits[1],mad.nfeature.limits[1])) &\n (so@meta.data$nFeature_RNA <= \n min(nfeature.limits[2], mad.nfeature.limits[2]))\n ) \n \n ## Mitoc Fiter\n mad.mitoch.limits =.madCalc(so,'percent.mt',mad.mitoch.limits) \n mad.mitoch.limits=.checkLimits(mad.mitoch.limits)\n mitoch.limits=.checkLimits(mitoch.limits)\n mad.mitoch.limits=mad.mitoch.limits%>%round(digits=2)\n mitoch.limits=mitoch.limits%>%round(digits=2)\n \n mitochPer.filter= ((so@meta.data$percent.mt >= \n max(mitoch.limits[1],mad.mitoch.limits[1])) &\n (so@meta.data$percent.mt <= \n min(mitoch.limits[2], mad.mitoch.limits[2]))\n ) \n \n \n ## Complexity Filter\n mad.complexity.limits=.madCalc(so,'log10GenesPerUMI',mad.complexity.limits)\n mad.complexity.limits=.checkLimits(mad.complexity.limits)\n complexity.limits=.checkLimits(complexity.limits)\n mad.complexity.limits=mad.complexity.limits%>%round(digits=2)\n complexity.limits=complexity.limits%>%round(digits=2)\n \n complexity.filter= ((so@meta.data$log10GenesPerUMI >= \n max(complexity.limits[1],mad.complexity.limits[1])) &\n (so@meta.data$log10GenesPerUMI <= \n min(complexity.limits[2], mad.complexity.limits[2]))\n )\n \n \n ## Top N Filter\n # mad.topNgenes.limits = c(NA,5)\n # topNgenes.limits=c(NA,20)\n mad.topNgenes.limits=\n .madCalc(so,'pct_counts_in_top_N_genes',mad.topNgenes.limits)\n mad.topNgenes.limits=\n .checkLimits(mad.topNgenes.limits)\n topNgenes.limits=\n .checkLimits(topNgenes.limits)\n mad.topNgenes.limits=mad.topNgenes.limits%>%round(digits=2)\n topNgenes.limits=topNgenes.limits%>%round(digits=2)\n \n topN.filter= ((so@meta.data$pct_counts_in_top_N_genes >= \n max(topNgenes.limits[1],mad.topNgenes.limits[1])) &\n (so@meta.data$pct_counts_in_top_N_genes <= \n min(topNgenes.limits[2], mad.topNgenes.limits[2]))\n ) \n \n ## doublets Filter\n if(do.doublets.fitler==T){\n doublets.fitler <- so@meta.data$Doublet%in%\"singlet\"\n }else{\n doublets.fitler=rep(TRUE,nrow(so@meta.data))\n } \n \n\n\n ### Combine filters ####\n filterIndex <-ncounts.filter & \n nfeature.filter & \n mitochPer.filter & \n complexity.filter & \n topN.filter & \n doublets.fitler\n filterIndex=as.data.frame(filterIndex)\n rownames(filterIndex) = rownames(so@meta.data)\n \n filter_matrix <- cbind(ncounts.filter,\n nfeature.filter,\n mitochPer.filter,\n complexity.filter,\n topN.filter,\n doublets.fitler)\n rownames(filter_matrix)=rownames(so@meta.data)\n \n so.nf=AddMetaData(so.nf,filter_matrix,colnames(filter_matrix))\n \n \n ## print Filter resutls\n cat(\"\\n\\n\")\n cat(i,\":\\n\")\n cat(paste0(\"# of Cells before Filter: \",nrow(filter_matrix),\"\\n\"))\n cat(paste0(\"# of Cells after all Filters: \",sum(filterIndex),\"\\n\"))\n perc.remain <- (sum(filterIndex)/nrow(filter_matrix))*100\n perc.remain <- formatC(perc.remain,format = \"g\",digits=3)\n cat(paste0(\"Percent Remaining: \" ,perc.remain,\"% \\n\\n\")) \n cat(paste0(\"# of Cells removed by individual Filters: \\n\"))\n print(colSums(filter_matrix==F))\n cat(\"\\n\\n\")\n \n ## create Filter resutls table\n filtSum=matrix(nrow=1,ncol=3)\n colnames(filtSum)=c(\"Cells before Filtering\",\n \"Cells after all Filters\",\n \"Percent Remaining\")\n filtSum[,\"Cells before Filtering\"]=nrow(filter_matrix)\n filtSum[,\"Cells after all Filters\"]=sum(filterIndex)\n filtSum[,\"Percent Remaining\"]=perc.remain\n topN.filterRename=paste0('% Counts in Top',n.topgnes,' Genes filter')\n filtTbl=colSums(filter_matrix==F)%>%t()%>%as.data.frame()\n filtTbl=rename(filtTbl,\n 'UMI Count (nCount_RNA)' = 'ncounts.filter',\n 'Gene Count (nFeature_RNA)' ='nfeature.filter',\n '% Mitochondrial Genes (percent.mt)'='mitochPer.filter',\n 'Complexity (log10GenesPerUMI)'='complexity.filter',\n 'DoubletFinder (scDblFinder)'='doublets.fitler',\n !!topN.filterRename :='topN.filter')\n colnames(filtTbl)=paste('Cells removed by ' ,colnames(filtTbl))\n \n filtSum=cbind(filtSum,filtTbl)\n filtSum[,\"VDJ Genes Removed\"]=VDJgenesOut%>%length\n rownames(filtSum)=i\n # tableGrob(filtSum)%>%plot\n \n ########################################################## # \n ## create Filter Limits table\n topN.filterRename=paste0('% Counts in Top',n.topgnes,' Genes')\n cat('VDJ Genes Removed: ',length(VDJgenesOut), '\\n') \n cat('Minimum Cells per Gene: ',min.cells,'\\n')\n cat('UMI Count (nCount_RNA) Limits: ',ncounts.limits,'\\n')\n cat('MAD UMI Count (nCount_RNA) Limits: ',mad.ncounts.limits,'\\n')\n cat('Gene Count (nFeature_RNA) Limits: ',nfeature.limits,'\\n')\n cat('MAD Gene Count (nFeature_RNA) Limits: ',mad.nfeature.limits,'\\n')\n cat('% Mitochondrial Genes (percent.mt) Limits: ',mitoch.limits,'\\n')\n cat('MAD % Mitochondrial Genes (percent.mt) Limits: ',mad.mitoch.limits,'\\n')\n cat('Complexity (log10GenesPerUMI) Limits: ',complexity.limits,'\\n')\n cat('MAD Complexity (log10GenesPerUMI) Limits: ',mad.complexity.limits,'\\n')\n cat(topN.filterRename,' Limits: ',topNgenes.limits,'\\n')\n cat('MAD ',topN.filterRename,' Limits: ',mad.topNgenes.limits,'\\n')\n cat('Doublets Filter: ',do.doublets.fitler,'\\n')\n \n \n \n ## create Filter Limits table\n FiltLmts=matrix(nrow=1,ncol=12)\n colnames(FiltLmts)=c(\"Minimum Cells per Gene\",\n \"UMI Count (nCount_RNA)\",\n \"MAD UMI Count (nCount_RNA)\",\n \"Gene Count (nFeature_RNA)\",\n \"MAD Gene Count (nFeature_RNA)\",\n \"% Mitochondrial Genes (percent.mt)\",\n \"MAD % Mitochondrial Genes (percent.mt)\",\n \"Complexity (log10GenesPerUMI)\",\n \"MAD Complexity (log10GenesPerUMI)\",\n paste0(topN.filterRename,\"\") ,\n paste0('MAD ',topN.filterRename,'') ,\n \"DoubletFinder (scDblFinder)\"\n )\n\n FiltLmts[,'Minimum Cells per Gene']=min.cells\n FiltLmts[,'UMI Count (nCount_RNA)']=\n paste0(c(\"Low:\",\"High:\"),ncounts.limits)%>%paste(collapse = \"\\n\")\n FiltLmts[,'MAD UMI Count (nCount_RNA)']=\n paste0(c(\"Low:\",\"High:\"),mad.ncounts.limits)%>%paste(collapse = \"\\n\")\n FiltLmts[,'Gene Count (nFeature_RNA)']=\n paste0(c(\"Low:\",\"High:\"),nfeature.limits)%>%paste(collapse = \"\\n\")\n FiltLmts[,'MAD Gene Count (nFeature_RNA)']=\n paste0(c(\"Low:\",\"High:\"),mad.nfeature.limits)%>%paste(collapse = \"\\n\")\n FiltLmts[,'% Mitochondrial Genes (percent.mt)']=\n paste0(c(\"Low:\",\"High:\"),mitoch.limits)%>%paste(collapse = \"\\n\")\n FiltLmts[,'MAD % Mitochondrial Genes (percent.mt)']=\n paste0(c(\"Low:\",\"High:\"),mad.mitoch.limits)%>%paste(collapse = \"\\n\")\n FiltLmts[,'Complexity (log10GenesPerUMI)']=\n paste0(c(\"Low:\",\"High:\"),complexity.limits)%>%paste(collapse = \"\\n\")\n FiltLmts[,'MAD Complexity (log10GenesPerUMI)']=\n paste0(c(\"Low:\",\"High:\"),mad.complexity.limits)%>%paste(collapse = \"\\n\")\n FiltLmts[,paste0(topN.filterRename,'')]=\n paste0(c(\"Low:\",\"High:\"),topNgenes.limits)%>%paste(collapse = \"\\n\")\n FiltLmts[,paste0('MAD ',topN.filterRename,'')]=\n paste0(c(\"Low:\",\"High:\"),mad.topNgenes.limits)%>%paste(collapse = \"\\n\")\n FiltLmts[,'DoubletFinder (scDblFinder)']=do.doublets.fitler\n rownames(FiltLmts)=i\n \n ### Apply Filters ####\n \n so <- subset(so, cells = \n rownames(filterIndex[which(filterIndex[,1]==T), ,drop=F])\n )\n \n ## Select filters that remove cells\n filter_matrix=\n filter_matrix[,is.na(apply(\n filter_matrix,2,function(i){match(FALSE,i)}))==F\n ]\n \n \n ## Optional: create TSNE plots ####\n if(plot.outliers!=\"none\"){ filter.plot.cols=3\n gtsne.list=lapply(colnames(filter_matrix),\n function(x){.runTsnepPlot(x,filter_matrix,\n so.nf.qcFiltr,plot.outliers)})\n gtsne.all <- arrangeGrob(grobs = gtsne.list, ncol = filter.plot.cols)\n \n so2.list <- list(Filtered=so,\n FilteringMeta=so.nf@meta.data,\n FiltLmts=FiltLmts,\n filtSum=filtSum,\n TSNEfilter=gtsne.all\n )\n }else{\n so2.list <- list(Filtered=so,\n FilteringMeta=so.nf@meta.data,\n FiltLmts=FiltLmts,\n filtSum=filtSum) \n \n }\n \n return(so2.list)\n \n \n }\n \n \n \n ## --------------- ##\n ## Main Code Block ####\n ## --------------- ##\n ## make sure that plot.outliers is character not boolean and case insensitive\n plot.outliers =tolower(as.character(plot.outliers))\n\n \n ## Caluclate filter Metrics\n so.nf.list=lapply(names(object), function(i){\n so=object[[i]]\n \n ## calculate Counts in Top 20 Genes\n ##calculated after min.cell filter as well\n so=.topNGenes(so,n.topgnes) \n \n ## Annotate Doublets: ####\n ## Gene filter does not effect doublet ident and so not recalculated\n \n \n if( do.doublets.fitler==T){\n sce <- as.SingleCellExperiment(so)\n \n set.seed(123)\n RNGkind(\"default\", \"default\", \"default\")\n sce.dbl <- scDblFinder(sce,BPPARAM=SerialParam(RNGseed = 123))%>%suppressWarnings()\n sce.class <- sce.dbl$scDblFinder.class\n so <- AddMetaData(so,sce.class,\"Doublet\")\n }else{ print('doublets Identification not Run')}\n return(so)\n })\n names(so.nf.list)=names(object)\n \n \n ### Run Filtering Function ####\n\n so.f.out <- lapply(names(so.nf.list), \n function(i){.seuratObject(so.nf.list,i)})\n names(so.f.out)=names(so.nf.list)\n\n \n #### Get Filtered SO\n so.f.list <- lapply(so.f.out,function(x) {x[['Filtered']]})\n \n #### Get Cell filtering Metadata\n so.nf.list.meta=lapply(names(so.f.out),\n function(x){so.f.out[[x]][['FilteringMeta']]})\n names(so.nf.list.meta)=names(so.f.out)\n \n #### Get filtering Summary Tables\n \n filtSum=lapply(so.f.out,`[[`,'filtSum')%>%do.call(rbind,.)%>%as.data.frame()\n FiltLmts=lapply(so.f.out,`[[`,'FiltLmts')%>%do.call(rbind,.)%>%as.data.frame()\n \n \n \n \n ### Collect QC figures ####\n\n ##Polychorme will create a palette of random colores based on a few seed \n ## colors. Here i used RcolorBrewer set1 color palette as the seed. Can not \n ## Reproduce exact pallet each time so creating 1 pallet that will be \n ## hardcoded in the Filter_QC and Combine_Normalize functions\n \n # library(Polychrome)\n # P100 = createPalette(100, brewer.pal(5, \"Set1\"), target = 'normal')\n # swatch(P100)\n \n col2=c(\"#E6161C\",\"#2E7AB6\",\"#53B251\",\"#9A53A6\",\"#FC7800\",\"#FFDA16\",\"#FC00B2\",\n \"#7622FE\",\"#7D532E\",\"#00FBF4\",\"#F126FE\",\"#DCDEE6\",\"#22FD0D\",\"#FD839B\",\n \"#005D51\",\"#E2E19E\",\"#C6F022\",\"#FBAD70\",\"#008AFE\",\"#F8AED8\",\"#A5001C\",\n \"#B42685\",\"#5835B4\",\"#CEC0FF\",\"#654B63\",\"#FF7DF1\",\"#F91C7F\",\"#5C6D16\",\n \"#16FABB\",\"#7DCCAF\",\"#8CD7F4\",\"#C86EFC\",\"#FFCDBD\",\"#882632\",\"#B0921C\",\n \"#B65500\",\"#FD0DDB\",\"#65FE84\",\"#9F9CFF\",\"#948C7E\",\"#8FAA00\",\"#758EA1\",\n \"#C5166C\",\"#93456A\",\"#0DC4FB\",\"#AF0DB9\",\"#F5AAFD\",\"#554984\",\"#C57A7A\",\n \"#0D9D9E\",\"#B7EEAD\",\"#FD7168\",\"#B700FB\",\"#85EC00\",\"#3B8655\",\"#AE8EB5\",\n \"#E7E965\",\"#FE87D2\",\"#FC9B16\",\"#AFF27A\",\"#8876FF\",\"#C3D2B4\",\"#FBD092\",\n \"#1626DB\",\"#FE5ACD\",\"#E4AA0D\",\"#A96A0D\",\"#B3966A\",\"#00E5FD\",\"#004F6E\",\n \"#7D00A3\",\"#FE947F\",\"#BC87E9\",\"#4F4726\",\"#ED3D5A\",\"#C79BA5\",\"#5CA8FD\",\n \"#005FBF\",\"#1CBB84\",\"#B2EDED\",\"#FD5C32\",\"#FCD6FF\",\"#F668AB\",\"#97C1FB\",\n \"#7F1CD7\",\"#94AF66\",\"#BE16A7\",\"#DE78A1\",\"#22B80D\",\"#7568BB\",\"#82F4A3\",\n \"#709686\",\"#FC6086\",\"#BB60A3\",\"#9F1658\",\"#EE6CFF\",\"#2E8BA8\",\"#47E9C8\",\n \"#8387BA\",\"#BCCDEC\" )\n # swatch(col2)\n \n ##Alternative is to combine RcolorBrewer palettes to create larger palette\n ## More limited on number of colors (61)\n \n # display.brewer.all()\n # col2 <- c(brewer.pal(8, \"Set1\"),\n # brewer.pal(12, \"Paired\"),\n # brewer.pal(7, \"Dark2\"),\n # brewer.pal(6, \"Accent\"),\n # brewer.pal(12, \"Set3\"),\n # brewer.pal(8,\"Set2\"), \n # brewer.pal(11, \"Spectral\")\n # )%>%unique\n \n \n \n features=c(\"orig.ident\",\n \"nCount_RNA\",\"nFeature_RNA\",\n \"percent.mt\",\"log10GenesPerUMI\",\n \"pct_counts_in_top_N_genes\",\"DoubletFinder (scDblFinder)\")\n v=features[features%in%c('nCount_RNA','nFeature_RNA',\n 'percent.mt','log10GenesPerUMI')]\n \n \n \n #### Combine meta.data tables ####\n filtTable.all=data.frame()\n rawTable.all=data.frame()\n for(s in names(so.f.list)) {\n filtTable=so.f.list[[s]]@meta.data\n filtTable=filtTable[,colnames(filtTable)%in%features,drop=F]\n filtTable$Sample=s\n filtTable$filt='filt'\n \n rawTable=so.nf.list[[s]]@meta.data\n rawTable=rawTable[,colnames(rawTable)%in%features,drop=F]\n rawTable$Sample=s\n rawTable$filt='raw'\n \n filtTable.all=rbind(filtTable.all,filtTable)\n rawTable.all=rbind(rawTable.all,rawTable)\n }\n \n table.meta=rbind(filtTable.all,rawTable.all)\n table.meta$nFeature_RNA=as.numeric(table.meta$nFeature_RNA)\n table.meta$filt=factor(table.meta$filt,levels = c('raw','filt'))\n \n topN.filterRename=paste0('% Counts in Top',n.topgnes,' Genes')\n \n table.meta=rename(table.meta,\n 'UMI Count (nCount_RNA)' = 'nCount_RNA',\n 'Gene Count (nFeature_RNA)' ='nFeature_RNA',\n '% Mitochondrial Genes (percent.mt)'='percent.mt',\n 'Complexity (log10GenesPerUMI)'='log10GenesPerUMI',\n !!topN.filterRename :='pct_counts_in_top_N_genes'\n )\n \n\n\n #add Sample Cutoffs\n \n table.meta= merge(table.meta,FiltLmts,\n by.x='Sample',by.y='row.names',\n suffix=c(\"\",\"_Filters\"),all.x=T)\n \n \n v=c('UMI Count (nCount_RNA)' ,\n 'Gene Count (nFeature_RNA)',\n '% Mitochondrial Genes (percent.mt)',\n 'Complexity (log10GenesPerUMI)',\n topN.filterRename)\n \n #### Create Filter QC Plots ####\n \n ### Violin Plots\n \n ### Violin Plots for each meta.data metric \n violin.list=lapply(v,function(x){.plotViolin2(table.meta,x)})\n names(violin.list)=v\n colnames(table.meta)\n \n ### Combine Violin Plots\n violin.list.mod=.combinePlots(violin.list)\n \n violin.grob=ggarrange(plotlist=violin.list.mod,\n nrow=length(violin.list),\n common.legend = T,\n legend = 'right') \n \n \n ### Scatter Plots\n\n ### scatter Plots for each meta.data metric \n scatter.list=lapply(v[!v%in%'UMI Count (nCount_RNA)'],\n function(x){.plotScatter2(table.meta,x)})\n names(scatter.list)=v[!v%in%'UMI Count (nCount_RNA)']\n \n ### Combine scatter Plots\n scatter.list.mod=.combinePlots(scatter.list)\n \n scatter.grob=ggarrange(plotlist=scatter.list.mod,\n nrow=length(scatter.list),\n common.legend = T,\n legend = 'right') \n \n \n #### Create Post Filter QC figure ####\n \n qc.df.post=table.meta[table.meta$filt=='filt',]\n \n \n ### Post Filter Summary - Scatter\n \n scatter.allsamples=lapply(v,\n function(y){.plotScatterPost2(\n qc.df.post,'UMI Count (nCount_RNA)',y)})\n names(scatter.allsamples)=v\n \n scatter.allsamples.grob=ggarrange(plotlist=scatter.allsamples,\n ncol=1,\n common.legend = T,\n legend = 'right')\n \n \n ### Post Filter Summary - histogram\n \n hist.allsamples=lapply(v,function(x){.plotHistPost2(qc.df.post,x)})\n names(hist.allsamples)=v\n \n hist.allsamples.grob=ggarrange(plotlist=hist.allsamples,\n ncol=1,\n common.legend = T,\n legend = 'right') %>% \n suppressMessages()%>%suppressWarnings()\n \n \n ### Post Filter Summary - Violin\n \n violin.allsamples=lapply(v,function(x){.plotViolinPost2(qc.df.post,x)})\n names(violin.allsamples)=v\n violin.allsamples.grob=ggarrange(plotlist=violin.allsamples,\n ncol=1,\n common.legend = T,\n legend = 'right')\n \n violin.allsamples.grob=annotate_figure(violin.allsamples.grob, \n top = text_grob(\"Filtered QC Summary\", \n face = \"bold\", size = 14))\n \n \n ### Post Filter Summary - combined Scatter + Histogram\n \n postFilter.grobs=ggarrange(\n ggarrange(plotlist=scatter.allsamples,\n ncol=1,legend = 'none'),\n ggarrange(plotlist=hist.allsamples,\n ncol=1,legend = 'none'),\n # ggarrange(plotlist=violin.allsamples,ncol=1,legend = 'none'),\n legend.grob=get_legend(scatter.allsamples[[1]]),\n ncol=2,\n legend='right') %>% \n suppressMessages()%>%suppressWarnings()\n \n postFilter.grobs=annotate_figure(postFilter.grobs, \n top = text_grob(\"Filtered QC Summary\", \n face = \"bold\", size = 14))\n \n \n ### TSNE Plots\n if (plot.outliers!=\"none\") {\n qcFiltr.grobs <- lapply(so.f.out,function(x) x[['TSNEfilter']])\n }\n \n \n \n \n # cellcount.nf <- lapply(so.nf.list, function(x) dim(x)[2])\n # cellcount.f <- lapply(so.f.list, function(x) dim(x)[2])\n # sum.before <- sum(unlist(cellcount.nf))\n # sum.after <- sum(unlist(cellcount.f))\n # cat(\"\\n\\nTotal number of cells before filtering:\", sum.before, \"\\n\")\n # cat(\"Total number of cells after filtering: \", sum.after,\"\\n\\n\")\n # cat(\"Percentage cells remaining after filtering:\", \n # (sum.after/sum.before)*100,\"\\n\")\n \n gc(full = TRUE) \n \n\n \n ### Output ####\n out=list(object=so.f.list,\n FilteringTables=list(\n FilteringMeta=so.nf.list.meta,\n FilteringCounts=filtSum,\n FilteringLimits=FiltLmts\n ),\n plots=list(\n ViolinPlotCombine=violin.grob,\n ViolinPlot=violin.list,\n ScatterPlotCombine=scatter.grob,\n Scatter=scatter.list,\n \n PostFilterCombined=postFilter.grobs,\n ViolinPostFilter=violin.allsamples.grob,\n ScatterPostFilter=scatter.allsamples.grob,\n HistogramPostFilter=hist.allsamples.grob\n )\n )\n \n if(plot.outliers!='none'){\n out$plots=c(out$plots,TSNEFeature=qcFiltr.grobs)\n \n } \n return(out)\n\n \n}\n\n\n", + "columns": [], + "condaDependencies": [], + "description": "Filters cells and genes across various criteria for each sample. Multiple cell and gene filters can be selected to remove poor quality data and noise. Will generate QC Plots to evaluate data before and after filtering. Workflows can use this downstream of any Seurat Object or list of Seurat Objects. [View Documentation](https://nidap.nih.gov/workspace/notepad/view/ri.notepad.main.notepad.1bd48d2d-8eba-4b40-990e-c3b5506fea68)", + "externalId": "Filter_Low_Quality_Cells_CCBR_scRNA_seq_", + "inputDatasets": [ + { + "key": "Suerat_Object_List", + "displayName": "Suerat Object List", + "description": "Input should be a list of Seurat Objects. Each Seurat Object in that list should correspond to a sample in your dataset.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_TRANSFORM_INPUT", + "tags": [] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "Minimum_Cells", + "displayName": "Minimum Cells", + "description": "Filter out genes found in less than this number of cells. E.g. Setting to 20 will remove genes found in fewer than 3 cells of a sample. (Default: 20)", + "paramType": "NUMBER", + "paramGroup": "Gene Filter", + "paramValues": null, + "defaultValue": "20", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Filter_VDJ_Genes", + "displayName": "Filter VDJ Genes", + "description": "Remove VDJ genes from the scRNA transcriptome assay. This is to prevent clustering bias in T-cells of the same clonotype. Only recommended if you are also doing TCR-seq. If set to TRUE VDJ genes will be removed. (Default: FALSE)", + "paramType": "BOOLEAN", + "paramGroup": "Gene Filter", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "UMI_Count_nCount_RNA_Limits_High", + "displayName": "UMI Count (nCount_RNA) Limits - High", + "description": "", + "paramType": "STRING", + "paramGroup": "UMI Count (nCount_RNA) Filter", + "paramValues": null, + "defaultValue": "NA", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "UMI_Count_nCount_RNA_Limits_Low", + "displayName": "UMI Count (nCount_RNA) Limits - Low", + "description": "Filter out cells where the total number of molecules (umi) detected within a cell exceed the selected limits. E.g. setting High limit to 100000 and Low limit to 200 will remove cells that have fewer than 200 or greater than 100000 molecules. (Default: High-NA, Low-NA)", + "paramType": "STRING", + "paramGroup": "UMI Count (nCount_RNA) Filter", + "paramValues": null, + "defaultValue": "NA", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "MAD_UMI_Count_nCount_RNA_Limits_High", + "displayName": "MAD UMI Count (nCount_RNA) Limits - High", + "description": "", + "paramType": "STRING", + "paramGroup": "UMI Count (nCount_RNA) Filter", + "paramValues": null, + "defaultValue": "5", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "MAD_UMI_Count_nCount_RNA_Limits_Low", + "displayName": "MAD UMI Count (nCount_RNA) Limits - Low", + "description": "Set filter limits based on how many Median Absolute Deviations (MAD) an outlier cell will have. Calculated from the median number of molecules for all cells in your sample. E.g. setting the High limit to 5 and Low limit to 3 will remove all cells with more than 3 absolute deviations less than the median or with more than 5 absolute deviations greater than the median. (Default: High- 5, Low- 5)", + "paramType": "STRING", + "paramGroup": "UMI Count (nCount_RNA) Filter", + "paramValues": null, + "defaultValue": "5", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Gene_Count_nFeature_RNA_Limits_High", + "displayName": "Gene Count (nFeature_RNA) Limits - High", + "description": "", + "paramType": "STRING", + "paramGroup": "Gene Count (nFeature_RNA) Filter", + "paramValues": null, + "defaultValue": "NA", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Gene_Count_nFeature_RNA_Limits_Low", + "displayName": "Gene Count (nFeature_RNA) Limits - Low", + "description": "Filter out cells where the number of genes found in each cell exceed the selected lower or upper limits. E.g. setting the High limit to 1000 and Low limit to 200 will remove cells that have fewer than 200 genes or more than 1000 genes for each sample. (Default: High-NA, Low-NA)", + "paramType": "STRING", + "paramGroup": "Gene Count (nFeature_RNA) Filter", + "paramValues": null, + "defaultValue": "NA", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "MAD_Gene_Count_nFeature_RNA_Limits_High", + "displayName": "MAD Gene Count (nFeature_RNA) Limits - High", + "description": "", + "paramType": "STRING", + "paramGroup": "Gene Count (nFeature_RNA) Filter", + "paramValues": null, + "defaultValue": "5", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "MAD_Gene_Count_nFeature_RNA_Limits_Low", + "displayName": "MAD Gene Count (nFeature_RNA) Limits - Low", + "description": "Set filter limits based on how many Median Absolute Deviations (MAD) an outlier cell will have. Calculated from the median gene number for all cells in your sample. E.g. setting High limit to 5 and Low limit to 3 will remove all cells with more than 3 absolute deviations less than the median or 5 absolute deviations greater than the median. (Default: High-5 Low-5)", + "paramType": "STRING", + "paramGroup": "Gene Count (nFeature_RNA) Filter", + "paramValues": null, + "defaultValue": "5", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Mitochondrial_Genes_percent_mt_Limits_High", + "displayName": "% Mitochondrial Genes (percent.mt) Limits - High", + "description": "", + "paramType": "STRING", + "paramGroup": "% Mitochondrial Genes (percent.mt) Filter", + "paramValues": null, + "defaultValue": "25", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Mitochondrial_Genes_percent_mt_Limits_Low", + "displayName": "% Mitochondrial Genes (percent.mt) Limits - Low", + "description": "Filter out cells whose proportion of mitochondrial genes exceed the selected lower or upper limits. E.g. setting the High limit to 8 and the Low limit to NA will not set the lower limit and removes cells with more than 8% mitochondrial RNA. (Default: High-25, Low-NA)", + "paramType": "STRING", + "paramGroup": "% Mitochondrial Genes (percent.mt) Filter", + "paramValues": null, + "defaultValue": "NA", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "MAD_Mitochondrial_Genes_percent_mt_Limits_High", + "displayName": "MAD % Mitochondrial Genes (percent.mt) Limits - High", + "description": "", + "paramType": "STRING", + "paramGroup": "% Mitochondrial Genes (percent.mt) Filter", + "paramValues": null, + "defaultValue": "3", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "MAD_Mitochondrial_Genes_percent_mt_Limits_Low", + "displayName": "MAD % Mitochondrial Genes (percent.mt) Limits - Low", + "description": "Set filter limits based on how many Median Absolute Deviations (MAD) an outlier cell will have. Calculated from the Median percentage of mitochondrial RNA for all cells in your sample. E.g. setting the High limit to 3 and Low limit to NA will not set a lower limit and remove all cells with more than 3 absolute deviations greater than the median. (Default: High-3, Low-NA)", + "paramType": "STRING", + "paramGroup": "% Mitochondrial Genes (percent.mt) Filter", + "paramValues": null, + "defaultValue": "NA", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Complexity_log10GenesPerUMI_Limits_High", + "displayName": "Complexity (log10GenesPerUMI) Limits - High", + "description": "", + "paramType": "STRING", + "paramGroup": "Complexity (log10GenesPerUMI) Filter", + "paramValues": null, + "defaultValue": "NA", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Complexity_log10GenesPerUMI_Limits_Low", + "displayName": "Complexity (log10GenesPerUMI) Limits - Low", + "description": "Complexity represents Number of genes detected per UMI. The more genes detected per UMI, the more complex the data. Filter out cells whose Complexity exceed the selected lower or upper limits. Cells that have a high number of UMIs but only a low number of genes could be dying cells, but also could represent a population of a low complexity cell type (i.e red blood cells). We suggest that you set the lower limit to 0.8 if samples have suspected RBC contamination. E.g. Setting the Higher limit to NA and setting the Lower limit to 0.8 will not set an upper limit and removes cells with complexity less than 0.8. (Default: Higher-NA, Lower-NA)", + "paramType": "STRING", + "paramGroup": "Complexity (log10GenesPerUMI) Filter", + "paramValues": null, + "defaultValue": "NA", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "MAD_Complexity_log10GenesPerUMI_Limits_High", + "displayName": "MAD Complexity (log10GenesPerUMI) Limits - High", + "description": "", + "paramType": "STRING", + "paramGroup": "Complexity (log10GenesPerUMI) Filter", + "paramValues": null, + "defaultValue": "NA", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "MAD_Complexity_log10GenesPerUMI_Limits_Low", + "displayName": "MAD Complexity (log10GenesPerUMI) Limits - Low", + "description": "Set filter limits based on how many Median Absolute Deviations (MAD) an outlier cell will have. Calculated from the Median complexity for all cells in your sample. E.g. Setting the High Limit to NA and the Low limit to 5 will not set an upper limit and remove all cells with more than 5 absolute deviations less than the median. (Default: High-NA, Low-5)", + "paramType": "STRING", + "paramGroup": "Complexity (log10GenesPerUMI) Filter", + "paramValues": null, + "defaultValue": "5", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "N_for_Top_N_Genes", + "displayName": "N for Top-N Genes", + "description": "Select the number of top highly expressed genes used to calculate the percentage of reads found in these genes. E.g. a value of 20 calculates the percentage of reads found in the top 20 most highly expressed Genes. (Default: 20)", + "paramType": "NUMBER", + "paramGroup": "% Counts in Top N Genes Filter", + "paramValues": null, + "defaultValue": "20", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Counts_in_Top_N_Genes_Limits_High", + "displayName": "% Counts in Top N Genes Limits- High", + "description": "", + "paramType": "STRING", + "paramGroup": "% Counts in Top N Genes Filter", + "paramValues": null, + "defaultValue": "NA", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Counts_in_Top_N_Genes_Limits_Low", + "displayName": "% Counts in Top N Genes Limits- Low", + "description": "Filter Cells based on the percentage of total counts in top N most highly expressed genes. Outlier cells would have a high percentage of counts in just a few genes and should be removed. The same considerations outlined in \"complexity.limits\" should be taken for this filter. E.g. setting the High limit to 50 and Low limit to NA will not set a lower limit and remove cells with greater than 50% of reads in the top N genes. (Default: High-NA, Low-NA)", + "paramType": "STRING", + "paramGroup": "% Counts in Top N Genes Filter", + "paramValues": null, + "defaultValue": "NA", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "MAD_Counts_in_Top_N_Genes_Limits_High", + "displayName": "MAD % Counts in Top N Genes Limits - High", + "description": "", + "paramType": "STRING", + "paramGroup": "% Counts in Top N Genes Filter", + "paramValues": null, + "defaultValue": "5", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "MAD_Counts_in_Top_N_Genes_Limits_Low", + "displayName": "MAD % Counts in Top N Genes Limits - Low", + "description": "Filter limits based on how many Median Absolute Deviations (MAD) an outlier cell will have. Calculated from the Median percentage of counts in the top N Genes. E.g. setting the High limit to 5, and Low limit to 5 will remove all cells with more than 5 absolute deviations greater than or 5 absolute deviations less than the median percentage. (Default: High-5, Low-5))", + "paramType": "STRING", + "paramGroup": "% Counts in Top N Genes Filter", + "paramValues": null, + "defaultValue": "5", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Doublets_Filter", + "displayName": "Doublets Filter", + "description": "Use scDblFinder to identify and remove doublet cells. Doublets are defined as two cells that are sequenced under the same cellular barcode, for example, if they were captured in the same droplet (Default: TRUE)", + "paramType": "BOOLEAN", + "paramGroup": "Doublets Filter", + "paramValues": null, + "defaultValue": "TRUE", + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "Filter Low Quality Cells [CCBR] [scRNA-seq]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/inst/extdata/NIDAPjson/Heatmap_CCBR_scRNA_seq_.code-template.json b/inst/extdata/NIDAPjson/Heatmap_CCBR_scRNA_seq_.code-template.json new file mode 100644 index 0000000..a0a6c03 --- /dev/null +++ b/inst/extdata/NIDAPjson/Heatmap_CCBR_scRNA_seq_.code-template.json @@ -0,0 +1,322 @@ +{ + "codeTemplate": "Heatmap_CellTypes <- function({{{Seurat_Object}}}, {{{Sample_Names_Table}}},{{{Metadata_Table}}}) {\n # image: png\n\n ## --------- ##\n ## Libraries ##\n ## --------- ##\n\n library(nidapFunctions)\n nidapLoadPackages(c(\"SCWorkflow\",\"dplyr\",\"Seurat\"))\n\n ## -------------------------------- ##\n ## User-Defined Template Parameters ##\n ## -------------------------------- ##\n \n #Primary Inputs:\n seurat_object <- {{{Seurat_Object}}}\n metadata_table <- {{{Metadata_Table}}}\n sample_names <- {{{Sample_Names}}}\n\n #Basic Paramters:\n transcripts = {{{Transcripts}}}\n proteins = {{{Proteins}}}\n\n #Annotation Parameters:\n metadata_to_plot <- {{{Metadata_to_Plot}}}\n add_gene_or_protein_annotation_tracks <- {{{Add_Gene_or_Protein_Annotation_Tracks}}}\n rna_annotations = {{{RNA_Annotations}}}\n protein_annotations = {{{Protein_Annotations}}}\n arrange_by_metadata_annotations <- {{{Arrange_by_Metadata_Annotations}}}\n \n #Visualization Parameters:\n plot_title <- \"{{{Plot_Title}}}\"\n heatmap_color <- \"{{{Heatmap_Color}}}\" \n set_seed_for_colors <- {{{Set_Seed_for_Colors}}}\n row_height <- {{{Row_Height}}} \n add_row_names <- {{{Add_Row_Names}}}\n row_font_size <- {{{Row_Font_Size}}} \n order_heatmap_rows <- {{{Order_Heatmap_Rows}}}\n row_order = {{{Row_Order}}} \n add_column_names <- {{{Add_Column_Names}}}\n column_font_size <- {{{Column_Font_Size}}} \n legend_font_size <- {{{Legend_Font_Size}}}\n\n #Advanced Parameters: \n scale_data <- {{{Scale_Data_by_Rows}}}\n trim_outliers <- {{{Trim_Outliers}}}\n trim_outliers_percentage <- {{{Trim_Outliers_Percentage}}}\n seurat_object_filename <- \"{{{Seurat_Object_Filename}}}\"\n \n\n ## -------------------------------- ##\n ## Parameter Misspecifation Errors ##\n ## -------------------------------- ##\n\n if(add_gene_or_protein_annotation_tracks == FALSE & (!is.null(protein_annotations) | !is.null(rna_annotations))) {\n stop(\"Error: You should choose to add gene or protein annotation tracks if you add protein or rna annotations\")\n }\n\n if(is.null(metadata_to_plot)){\n stop(\"Error: You should choose at least one annotation track under metadata_to_plot\")\n }\n \n ## -------------------------------- ##\n ## Functions ##\n ## -------------------------------- ##\n \n ## --------------- ##\n ## Main Code Block ##\n ## --------------- ##\n\n path <- nidapGetPath(seurat_object,seurat_object_filename)\n so <- readRDS(path)\n\nprint(so%>%Cells%>%length)\nif(so%>%Cells%>%length>15000){\n stop('Too many Cells Selected (>15,000) to render Figure. Consider Filtering before creating Heatmap')\n}\n\n\n ## Function changes here:\n library(dplyr)\n if(\"orig.ident\" %in% colnames(so@meta.data)){\n print(\"orig.ident found in metadata\")\n } else if (\"orig_ident\" %in% colnames(so@meta.data)){\n so@meta.data=dplyr::rename(so@meta.data, orig.ident=orig_ident)\n } else {\n print(\"orig.ident or orig_ident not found\")\n }\n \n\n results <- heatmapSC(object = so,\n sample.names = sample_names,\n metadata = metadata_to_plot,\n transcripts = transcripts,\n proteins = proteins,\n heatmap.color = heatmap_color,\n plot.title = plot_title,\n add.gene.or.protein = add_gene_or_protein_annotation_tracks,\n protein.annotations = protein_annotations,\n rna.annotations = rna_annotations,\n arrange.by.metadata = arrange_by_metadata_annotations,\n add.row.names = add_row_names,\n add.column.names = add_column_names,\n row.font = row_font_size,\n col.font = column_font_size,\n legend.font = legend_font_size,\n row.height = row_height,\n set.seed = set_seed_for_colors,\n scale.data = scale_data,\n trim.outliers = trim_outliers,\n trim.outliers.percentage = trim_outliers_percentage,\n order.heatmap.rows = order_heatmap_rows,\n row.order = row_order) \n\n print(results$plot)\n return(results$data)\n\n}\n\n#################################################\n## Global imports and functions included below ##\n#################################################\n\n# Functions defined here will be available to call in\n# the code for any table.\n\n\n", + "columns": [ + { + "key": "Sample_Names", + "displayName": "Sample Names", + "description": "Samples to include in the heatmap", + "paramGroup": "Basic", + "sourceDataset": "Sample_Names_Table", + "defaultValue": null, + "columnType": "ALL", + "isMulti": true + }, + { + "key": "Metadata_to_Plot", + "displayName": "Metadata to Plot", + "description": "Metadata to add on the annotation track on top of the heatmap. Add at least one and if more than one, in the order of appearance on annotation track from bottom up. If \"arrange by metadata annotations\" is TRUE, sorting will also be from bottom up.", + "paramGroup": "Basic", + "sourceDataset": "Metadata_Table", + "defaultValue": null, + "columnType": "ALL", + "isMulti": true + } + ], + "condaDependencies": [], + "description": "From a Seurat Object, draw a heatmap for individual genes and proteins for single cell data and optionally add metadata and/or gene or protein expression annotation tracks. The rows and columns can be ordered in an unsupervised manner using hierarchical clustering or ordered manually by sample annotations or genes or protein expression. [View Documentation](https://nidap.nih.gov/workspace/notepad/view/ri.notepad.main.notepad.049d0982-4653-4be8-b6d1-392bd8d3f0b9)", + "externalId": "Heatmap_CCBR_scRNA_seq_", + "inputDatasets": [ + { + "key": "Seurat_Object", + "displayName": "Seurat Object", + "description": "Select an input Seurat Object.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_TRANSFORM_INPUT", + "tags": [] + }, + { + "key": "Sample_Names_Table", + "displayName": "Sample Names Table", + "description": "Select a dataset that contains sample names for the input Seurat Object. These sample names should match the orig.idents in the input Seurat Object.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + }, + { + "key": "Metadata_Table", + "displayName": "Metadata Table", + "description": "Select the metadata table for the input Seurat Object.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "Transcripts", + "displayName": "Transcripts", + "description": "Add transcripts for plotting in the heatmap", + "paramType": "VECTOR", + "paramGroup": "Basic", + "paramValues": null, + "defaultValue": "c(\"GAPDH\")", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Proteins", + "displayName": "Proteins", + "description": "Add proteins for plotting in the heatmap.", + "paramType": "VECTOR", + "paramGroup": "Basic", + "paramValues": null, + "defaultValue": "c(\"\")", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Add_Gene_or_Protein_Annotation_Tracks", + "displayName": "Add Gene or Protein Annotation Tracks", + "description": "If TRUE, add expression values of individual transcripts and/or proteins as part of annotation track. Default is FALSE", + "paramType": "BOOLEAN", + "paramGroup": "Annotation", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "RNA_Annotations", + "displayName": "RNA Annotations", + "description": "Add Genes (transcripts) expression values to annotation track", + "paramType": "VECTOR", + "paramGroup": "Annotation", + "paramValues": null, + "defaultValue": null, + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Protein_Annotations", + "displayName": "Protein Annotations", + "description": "Add Protein expression to annotation track", + "paramType": "VECTOR", + "paramGroup": "Annotation", + "paramValues": null, + "defaultValue": null, + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Arrange_by_Metadata_Annotations", + "displayName": "Arrange by Metadata Annotations", + "description": "If TRUE, sort columns by metadata tracks. Otherwise, use unsupervised clustering. Default is TRUE.", + "paramType": "BOOLEAN", + "paramGroup": "Annotation", + "paramValues": null, + "defaultValue": "TRUE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Plot_Title", + "displayName": "Plot Title", + "description": "Add Plot title", + "paramType": "STRING", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "Heatmap", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Heatmap_Color", + "displayName": "Heatmap Color", + "description": "Heatmap color scheme", + "paramType": "SELECT", + "paramGroup": "Visualization", + "paramValues": [ + "Cyan to Mustard", + "Blue to Red", + "Red to Vanilla", + "Violet to Pink", + "Bu Yl Rd", + "Bu Wt Rd" + ], + "defaultValue": "Bu Yl Rd", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Set_Seed_for_Colors", + "displayName": "Set Seed for Colors", + "description": "Set different seed to change colors randomly", + "paramType": "NUMBER", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "6", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Row_Height", + "displayName": "Row Height", + "description": "Heatmap row height. Default is 15.", + "paramType": "NUMBER", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "15", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Add_Row_Names", + "displayName": "Add Row Names", + "description": "If TRUE, add row names Default is TRUE.", + "paramType": "BOOLEAN", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "TRUE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Row_Font_Size", + "displayName": "Row Font Size", + "description": "Font size used for rows. Default is 5.", + "paramType": "NUMBER", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "5", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Order_Heatmap_Rows", + "displayName": "Order Heatmap Rows", + "description": "If TRUE, order rows by specific order (set below, Row Order). Default is FALSE", + "paramType": "BOOLEAN", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Row_Order", + "displayName": "Row Order", + "description": "List genes in order of appearance on heatmap (top to bottom)", + "paramType": "VECTOR", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "c(\"\")", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Add_Column_Names", + "displayName": "Add Column Names", + "description": "Add column names (Barcodes) to heatmap. Default is FALSE.", + "paramType": "BOOLEAN", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Column_Font_Size", + "displayName": "Column Font Size", + "description": "Font size for columns. Default is 5.", + "paramType": "NUMBER", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "5", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Legend_Font_Size", + "displayName": "Legend Font Size", + "description": "Font size for legends. Default is 10.", + "paramType": "STRING", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "10", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Scale_Data_by_Rows", + "displayName": "Scale Data by Rows", + "description": "If TRUE, scale data by rows. Otherwise, plot normalized values. Default is TRUE.", + "paramType": "BOOLEAN", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "TRUE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Trim_Outliers", + "displayName": "Trim Outliers", + "description": "If TRUE, trim outliers to improve data range for visualization. Default is TRUE", + "paramType": "BOOLEAN", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "TRUE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Trim_Outliers_Percentage", + "displayName": "Trim Outliers Percentage", + "description": "Percent of data to trim to improve heatmap colors (usually 1-5%, or 0.01-0.05)", + "paramType": "NUMBER", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "0.01", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Seurat_Object_Filename", + "displayName": "Seurat Object Filename", + "description": "Name of RDS file containing Seurat Object. Default is seurat_object.rds", + "paramType": "STRING", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "seurat_object.rds", + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "Heatmap [CCBR] [scRNA-seq]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/inst/extdata/NIDAPjson/Plot_3D_Dimensionality_Reduction_CCBR_scRNA_seq_.code-template.json b/inst/extdata/NIDAPjson/Plot_3D_Dimensionality_Reduction_CCBR_scRNA_seq_.code-template.json new file mode 100644 index 0000000..9b59877 --- /dev/null +++ b/inst/extdata/NIDAPjson/Plot_3D_Dimensionality_Reduction_CCBR_scRNA_seq_.code-template.json @@ -0,0 +1,163 @@ +{ + "codeTemplate": "DimReduct3D_CellTypes <- function({{{Seurat_Object}}},{{{Metadata}}}) {\n\n\n ## --------- ##\n ## Libraries ##\n ## --------- ##\n\n library(nidapFunctions)\n libs <- c(\"SCWorkflow\",\"plotly\")\n nidapLoadPackages(libs)\n\n library(plotly)\n library(Seurat)\n library(htmlwidgets)\n\n ## -------------------------------- ##\n ## User-Defined Template Parameters ##\n ## -------------------------------- ##\n\n #Primary Inputs:\n seurat_object = {{{Seurat_Object}}}\n\n #Basic Parameters:\n color_variable = \"{{{Color_Variable}}}\" \n label_variable = \"{{{Label_Variable}}}\"\n plot_type = \"{{{Plot_Type}}}\"\n \n #Visualization Parameters:\n dot_size = {{{Dot_Size}}}\n colors = {{{Colors}}}\n\n #Advanced Parameters:\n number_of_pcs = {{{Number_of_PCs}}}\n legend = {{{Legend}}}\n save_plot = {{{Save_Plot}}}\n filename = \"{{{Filename}}}\"\n seurat_object_filename = \"{{{Seurat_Object_Filename}}}\"\n \n\n ## -------------------------------- ##\n ## Parameter Misspecifation Errors ##\n ## -------------------------------- ##\n\n ## -------------------------------- ##\n ## Functions ##\n ## -------------------------------- ##\n\nUMAP3D <- function(object,\n color.variable,\n label.variable,\n dot.size = 4,\n legend = TRUE,\n colors = c(\"darkblue\",\"purple4\",\"green\",\"red\",\"darkcyan\",\n \"magenta2\",\"orange\",\"yellow\",\"black\"),\n filename = \"plot.html\",\n save.plot = FALSE,\n npcs = 15) {\n \n #Run TSNE again to get 3d coordinates:\n object <- RunUMAP(\n object,\n assay = \"SCT\",\n dims = 1:npcs,\n n.components = 3,\n seed.use = 1\n )\n \n umap.coord <-\n as.data.frame(object@reductions$umap@cell.embeddings)\n \n if (is.null(object@meta.data[[label.variable]])) {\n stop(\n sprintf(\n \"The metadata variable selected for labeling %s is not\n available in the seurat object\",\n label.variable\n )\n )\n }\n if (is.null(object@meta.data[[color.variable]])) {\n stop(\n sprintf(\n \"The metadata variable selected for color %s is not available\n in the seurat object\",\n color.variable\n )\n )\n }\n \n #Set up dataframe for plotly:\n umap.df <- data.frame(\n UMAP1 = umap.coord$UMAP_1,\n UMAP2 = umap.coord$UMAP_2,\n UMAP3 = umap.coord$UMAP_3,\n colorvar = as.factor(object@meta.data[[color.variable]]),\n label = object@meta.data[[label.variable]]\n )\n \n fig <- plot_ly(\n umap.df,\n x = ~ UMAP1,\n y = ~ UMAP2,\n z = ~ UMAP3,\n color = ~ colorvar,\n colors = colors,\n type = \"scatter3d\",\n mode = \"markers\",\n hoverinfo = 'text',\n text = ~ label,\n size = dot.size\n )\n \n if (legend == FALSE) {\n fig <- hide_legend(fig)\n }\n \n #Save plot into html as embedded plotly image\n if (save.plot == TRUE) {\n htmlwidgets::saveWidget(as_widget(fig), filename, selfcontained = TRUE)\n }\n \n umap.results <- list(\"plot\" = fig, \"data\" = umap.df)\n return(umap.results)\n}\n\n ## --------------- ##\n ## Main Code Block ##\n ## --------------- ##\n\n path <- nidapGetPath(seurat_object,seurat_object_filename)\n so <- readRDS(path)\n \n #Convert the metadata columns to match NIDAP column names\n metadata_df <- so@meta.data\n\tcolnames(metadata_df) <- gsub(\"\\\\.\", \"_\", colnames(metadata_df))\n so@meta.data <- metadata_df \n\nif (plot_type == \"tSNE\") {\n results <- tSNE3D(object = so,\n color.variable = color_variable,\n label.variable = label_variable,\n dot.size = dot_size,\n colors = colors,\n npcs = number_of_pcs,\n legend = legend,\n filename = filename,\n save.plot = save_plot)\n} else {\n\n results <- UMAP3D(object = so,\n color.variable = color_variable,\n label.variable = label_variable,\n dot.size = dot_size,\n colors = colors,\n npcs = number_of_pcs,\n legend = legend,\n filename = filename,\n save.plot = save_plot)\n\n}\n\n\n print(results$plot)\n \n # print(fig)\n fileName <- \"plot.html\"\n output <- new.output() \n output_fs <- output$fileSystem()\n htmlwidgets::saveWidget(as_widget(results$plot), fileName, selfcontained=TRUE)\n output_fs$upload(fileName, fileName)\n return(NULL)\n}\n \n\n\n#################################################\n## Global imports and functions included below ##\n#################################################\n\n# Functions defined here will be available to call in\n# the code for any table.\n\n", + "columns": [ + { + "key": "Color_Variable", + "displayName": "Color Variable", + "description": "The variable used for coloring the 3D-TSNE plot", + "paramGroup": "Basic", + "sourceDataset": "Metadata", + "defaultValue": null, + "columnType": "ALL", + "isMulti": null + }, + { + "key": "Label_Variable", + "displayName": "Label Variable", + "description": "Metadata Column to use for plot labels", + "paramGroup": "Basic", + "sourceDataset": "Metadata", + "defaultValue": null, + "columnType": "ALL", + "isMulti": null + } + ], + "condaDependencies": [], + "description": "This template creates 3D interactive UMAP or t-SNE plot. The plot is saved in the output folder as an HTML file that can be downloaded. [View Documentation](https://nidap.nih.gov/workspace/notepad/view/ri.notepad.main.notepad.5e2d1ec1-5747-44bf-9406-eb902eef75cf)", + "externalId": "Plot_3D_Dimensionality_Reduction_CCBR_scRNA_seq_", + "inputDatasets": [ + { + "key": "Seurat_Object", + "displayName": "Seurat Object", + "description": "The input seurat object rds file.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_TRANSFORM_INPUT", + "tags": [] + }, + { + "key": "Metadata", + "displayName": "Metadata", + "description": "Metadata table accompanying the seurat object.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "Plot_Type", + "displayName": "Plot Type", + "description": "Select UMAP or tSNE for your dimensionality reduction.", + "paramType": "SELECT", + "paramGroup": "Basic", + "paramValues": [ + "UMAP", + "tSNE" + ], + "defaultValue": "UMAP", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Dot_Size", + "displayName": "Dot Size", + "description": "Size of dots in plot. Default is 4.", + "paramType": "NUMBER", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "4", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Colors", + "displayName": "Colors", + "description": "", + "paramType": "MULTISELECT", + "paramGroup": "Visualization", + "paramValues": [ + "darkblue", + "purple4", + "green", + "red", + "darkcyan", + "magenta2", + "orange", + "yellow", + "black" + ], + "defaultValue": "c(\"darkblue\",\"purple4\",\"green\",\"red\",\"darkcyan\",\"magenta2\",\"orange\",\"yellow\",\"black\")", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Legend", + "displayName": "Legend", + "description": "Add legends. Default is TRUE", + "paramType": "BOOLEAN", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "TRUE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Number_of_PCs", + "displayName": "Number of PCs", + "description": "Number of Principal Components to calculate t-SNE. Default is 30.", + "paramType": "NUMBER", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "30", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Save_Plot", + "displayName": "Save Plot", + "description": "Save plot. Default is TRUE.", + "paramType": "BOOLEAN", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "TRUE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Filename", + "displayName": "Filename", + "description": "Output filename", + "paramType": "STRING", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "plot.html", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Seurat_Object_Filename", + "displayName": "Seurat Object Filename", + "description": "Filename for RDS file containing the Seurat Object. Default is seurat_object.rds", + "paramType": "STRING", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "seurat_object.rds", + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "Plot 3D Dimensionality Reduction [CCBR] [scRNA-seq]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/inst/extdata/NIDAPjson/Process_Input_Data_CCBR_scRNA_seq_.code-template.json b/inst/extdata/NIDAPjson/Process_Input_Data_CCBR_scRNA_seq_.code-template.json new file mode 100644 index 0000000..4eef53f --- /dev/null +++ b/inst/extdata/NIDAPjson/Process_Input_Data_CCBR_scRNA_seq_.code-template.json @@ -0,0 +1,153 @@ +{ + "codeTemplate": "ProcessedInput_SO <- function({{{Input_Data}}},{{{Metadata_Table}}}) {\n\n ## --------- ##\n ## Libraries ##\n ## --------- ##\n\n library(nidapFunctions)\n libs=c(c(\"SCWorkflow\",\"Seurat\",\"stringr\",\"dplyr\",\"tidyr\",\"RColorBrewer\",\"ggplot2\",\"ggpubr\"))\n nidapLoadPackages(libs)\n \n ## -------------------------------- ##\n ## User-Defined Template Parameters ##\n ## -------------------------------- ##\n\ninput = {{{Input_Data}}}\nsample.metadata.table= {{{Metadata_Table}}}\nuse.metadata.table= {{{Use_Metadata_Table}}}\nsample.name.column= \"{{{Sample_Name_Column}}}\"\norganism = \"{{{Organism}}}\"\nrename.col = \"{{{Column_to_Reaname_Samples}}}\"\nfile.filter.regex = \"{{{File_Filter_Regex}}}\"\nkeep = {{{Keep}}}\nsplit.h5 = {{{Split_h5}}}\ncell.hash = {{{Cell_Hash_Data}}}\ntcr.summarize.topN = {{{TCR_Summary_Select_Number_of_Top_Clonotypes}}}\ndo.normalize.data = {{{Normalize_Counts}}}\n\n\n\nif(class(input)=='FoundryTransformInput'){\n print(paste0('File Type: ',class(input)))\n \n input.dat=nidapGetFiles(input,'*h5$')\n input.tcr=nidapGetFiles(input,'*csv$')\n \n input=c(input.dat,input.tcr)\nif (length(input.tcr)>0) {print('TCR tables Detected')}\n\n} else {\n stop('Input data not properly imported into Workbook')\n}\n \n \nif(use.metadata.table==F){ \n sample.metadata.table=NULL \n cat(\"Metadata Table Being Ignored \\n\")\n }\n\n\n## ---------------- ##\n## Run Fucnction ##\n## ---------------- ## \n\nout=processRawData(input=input,\n sample.metadata.table=sample.metadata.table,\n sample.name.column=sample.name.column,\n organism=organism,\n rename.col=rename.col,\n keep=keep,\n file.filter.regex=file.filter.regex,\n split.h5=split.h5,\n cell.hash=cell.hash,\n tcr.summarize.topN=tcr.summarize.topN,\n do.normalize.data=do.normalize.data \n )\n\n\n## ------------------ ##\n## Plot Figures ##\n## ------------------ ##\n\nplot(out$plots$CombinedQC)\nplot(out$plots$ViolinQC)\n\n\n## ----------------------- ##\n## Save Seurat object ##\n## ----------------------- ## \n\n## Save the annotated Seurat object\n output <- new.output()\n output_fs <- output$fileSystem()\n saveRDS(out$object, output_fs$get_path(\"seurat_object.rds\", 'w'))\n\n return(NULL)\n}\n\n\n#################################################\n## Global imports and functions included below ##\n#################################################\n\nprocessRawData <- function(input,\n sample.metadata.table=NULL,\n sample.name.column=NULL,\n organism,\n rename.col=NULL,\n keep=T,\n file.filter.regex=c(),\n split.h5=F,\n cell.hash=F,\n tcr.summarize.topN=10,\n do.normalize.data=T \n){ \n \n \n ## --------- ##\n ## Functions ####\n ## --------- ##\n library(Seurat)\n # library(stringr)\n # Cell Cycle Scoring and Find Variable Features\n CC_FVF_so <- function(so){\n so <- CellCycleScoring(object = so, \n g2m.features = cc.genes$g2m.genes,\n s.features = cc.genes$s.genes)\n so$CC.Difference <- so$S.Score - so$G2M.Score\n return(so)\n }\n \n #### Figures ####\n \n .plotScatterPost2=function(count.df,xaxis,yaxis){\t\n xlab = as.character(xaxis)\t\n ylab = as.character(yaxis)\t\n name = paste(ylab,\"vs.\",xlab) \n g = ggplot(count.df, aes(x=.data[[xaxis]], y=.data[[yaxis]],color=Sample)) +\n geom_point(size = 0.5) + \n theme_classic() +\n theme(legend.position='right',legend.text=element_text(size=10),\n legend.title=element_blank()) + \n guides(colour = guide_legend(override.aes = list(size=2))) +\n scale_color_manual(values = col2) +\n labs( x = xlab, y = gsub(\" \\\\(\", \" \\n\\\\(\",ylab))\n \n return(g)\n }\n \n .plotHistPost2 <- function(count.df,xaxis){\t\n g=ggplot(count.df) + \n theme_bw() +\n geom_density(aes(x = .data[[xaxis]], colour = Sample)) +\n theme(legend.position='right',legend.text=element_text(size=10),\n legend.title=element_blank()) + \n # ggtitle(xaxis) +\n # labs(x = NULL) +\n # labs( x = gsub(\" \\\\(\", \" \\n\\\\(\",xaxis))+\n scale_x_continuous(trans='log10') + \n scale_color_manual(values = col2) %>% \n suppressMessages()%>%suppressWarnings()\n \n return(g)\n }\n \n .plotViolinPost2=function(count.df,yaxis){\n axis.lab = unique(count.df$Sample)\n \n g=ggplot(count.df, aes(x=Sample, y=.data[[yaxis]])) +\n ggtitle(yaxis) +\n labs( x = 'Sample', y = gsub(\" \\\\(\", \" \\n\\\\(\",yaxis))+\n theme(panel.grid.major = element_blank(), \n panel.grid.minor = element_blank(),\n panel.background = element_blank(),\n legend.text=element_text(size=rel(1)),\n legend.title=element_blank(), \n axis.text=element_text(size=10),\n axis.title.x=element_blank(),axis.title.y=element_blank(),\n axis.text.x=element_blank(),\n #axis.text.x=element_text(angle=45,hjust=1),\n plot.title = element_text(size = 20, face = \"bold\")) +\n geom_violin(aes(fill=as.factor(Sample))) + \n scale_fill_manual(values = col2) +\n geom_boxplot(width=.0) +\n scale_x_discrete(limits = as.vector(axis.lab)) \n return(g)\n \n }\n \n \n ### log Normalized data\n .logNormSeuratObject <- function(i) {\n so.nf <- so.orig.nf[[i]]\n \n ## Normalize Data\n so.nf <- NormalizeData(so.nf, normalization.method = \"LogNormalize\", \n scale.factor = 10000)\n \n \n ## Detect & Normalize CITEseq \n if (\"Protein\" %in% names(so.nf)){\n so.nf <- NormalizeData(so.nf, assay = \"Protein\",\n normalization.method = \"CLR\")\n }\n \n ## Detect & Normalize HTO data\n if (\"HTO\" %in% names(so.nf)){\n so.nf <- NormalizeData(so.nf, assay = \"HTO\", normalization.method = \"CLR\")\n }\n \n return(so.nf)\n }\n \n \n ### Add Metrics to Metadata\n .calcMetrics <- function(i) {\n so.nf <- so.orig.nf[[i]]\n \n ## calculate Percent Mito\n so.nf[[\"percent.mt\"]] = PercentageFeatureSet(object = so.nf, \n pattern = mitoch)\n \n ## Error Check for Correct Organism using mitochondrial count\n mt.cell.count=(so.nf[[\"percent.mt\"]]>0)%>%sum()\n if(mt.cell.count% \n group_by(barcode) %>%\n filter(chain == \"TRB\") %>%\n summarise(cell_beta_seq_list = toString((unique(cdr3))),\n cell_beta_reads_list = toString(list(reads)),\n cell_unique_betas = n_distinct(c(cdr3)),\n cell_TRBV_list =toString(unique(v_gene)),\n cell_TRBJ_list =toString(unique(j_gene))\n )\n \n #collapse alpha reads\n alphaSeq <- df %>% \n group_by(barcode) %>%\n filter(chain == \"TRA\") %>%\n summarise(cell_alpha_seq_list = toString(unique(cdr3)),\n cell_alpha_reads_list = toString(list(reads)),\n cell_unique_alphas =n_distinct(c(cdr3)),\n cell_TRAV_list =paste(c(v_gene),collapse = \", \"),\n cell_TRAJ_list =paste(c(j_gene),collapse = \", \")\n )\n \n outdf <- merge(betaSeq,alphaSeq,by = \"barcode\")\n \n #add marker columns for cells with multiple alpha or beta sequence\n outdf <- outdf %>% \n group_by(barcode) %>%\n mutate(isPolyAlphaCell = if_else(cell_unique_alphas >1,TRUE,FALSE),\n isPolyBetaCell = if_else(cell_unique_betas >1,TRUE,FALSE)\n )\n \n \n #get the top beta sequence by read\n topBetadf <- df %>% \n group_by(barcode) %>%\n filter(chain == \"TRB\") %>%\n arrange(desc(reads)) %>%\n mutate(cell_top_beta = if_else((row_number()== 1L),cdr3,NA),\n cell_TRBV = if_else((row_number()== 1L),v_gene,NA),\n cell_TRBJ = if_else((row_number()== 1L),j_gene,NA)) %>%\n select(barcode, cell_top_beta,cell_TRBV,cell_TRBJ) %>%\n fill(cell_top_beta,.direction = \"updown\") %>%\n fill(cell_TRBV,.direction = \"updown\") %>%\n fill(cell_TRBJ,.direction = \"updown\")\n \n \n outdf <- merge(outdf,topBetadf,by = \"barcode\")\n \n #get top alpha\n topAlphadf <- df %>% \n group_by(barcode) %>%\n filter(chain == \"TRA\") %>%\n arrange(desc(reads)) %>%\n mutate(cell_top_alpha = if_else((row_number()== 1L),cdr3,NA),\n cell_TRAV = if_else((row_number()== 1L),v_gene,NA),\n cell_TRAJ = if_else((row_number()== 1L),j_gene,NA)) %>%\n select(barcode, cell_top_alpha,cell_TRAV,cell_TRAJ) %>%\n fill(cell_top_alpha,.direction = \"updown\") %>%\n fill(cell_TRAV,.direction = \"updown\") %>%\n fill(cell_TRAJ,.direction = \"updown\")\n \n \n outdf <- merge(outdf,topAlphadf,by = \"barcode\") %>%\n select(barcode, everything()) %>%\n distinct()\n \n \n df <- outdf\n \n #reannotate clonotypes as distinct ab_pairs\n df <- df %>% \n mutate(ab_pair = paste(cell_top_alpha,cell_top_beta,sep=\"&\"))\n \n ab_pair_df <- df %>% \n select(ab_pair) %>% \n distinct() %>%\n mutate(clonotype_id = paste(\"clonotype\",row_number(),sep=\"\"))\n \n #merge this back into the data frame\n df = merge(df,ab_pair_df, by = \"ab_pair\")\n \n #summarize cell level data if you have not called Integrate \n #TCR cluster template\n colsToSummarize <- c(\"cell_top_alpha\",\n \"cell_top_beta\",\n \"clonotype_id\",\n \"vdj_clonotype_id\")\n for (i in colsToSummarize) {\n col <- df[[i]]\n valCount <- length(unique(col))\n \n if ((valCount >=tcr.summarize.topN) & \n (!is.element(class(df[[i]][1]),c(\"numeric\",\"integer\")))) \n {\n freqVals <- as.data.frame(-sort(-table(col)))$col[1:tcr.summarize.topN]\n summarized_col = list()\n count <- 0\n for (j in col) {\n \n if (is.na(j) || is.null(j) || (j ==\"None\")) {\n count <- count + 1\n summarized_col[count] <- \"NULLorNA\"\n #print(\"NULLorNA\")\n } else if (j %in% freqVals){\n count <- count + 1\n summarized_col[count] <- j\n #print(\"valid\")\n } else {\n count <- count + 1\n summarized_col[count] <- \"Other\"\n #print(\"Other\")\n }\n }\n newName = paste(\"summarized_\",i,sep=\"\")\n df[[newName]] <- unlist(summarized_col)\n }\n print(\"Passed all filters...\")\n }\n df <- df %>% select(barcode,everything())\n df <- as.data.frame(df)\n \n df <- df %>% mutate_if(is.list, as.character) \n \n \n ### Add Metadata to SO \n \n if (FALSE%in%grepl('G|T|C|A',unique(df$barcode))>1) {\n stop(\"Error Processing TCR data: TCR metadata is empty\")\n }\n \n rownames(df)=df$barcode\n df=df[,!colnames(df)%in%'barcode']\n \n so=AddMetaData(so,df)\n # so.orig.nf3=so.orig.nf\n so@meta.data=replace(so@meta.data, is.na(so@meta.data), \"Not captured\")\n \n return(so)\n }\n \n ## --------------- ##\n ## Main Code Block ####\n ## --------------- ##\n \n \n ## Get Cell Cycle information\n if (organism == \"Human\"){\n mitoch = \"^MT-\"\n }else{\n mitoch = \"^mt-\"\n cc.genes$g2m.genes= str_to_title(cc.genes$g2m.genes)\n cc.genes$s.genes = str_to_title(cc.genes$s.genes)\n }\n \n \n ### Process files h5, rds ####\n \n ### Create SO object depending on class of input SOs. \n if(class(input)%in%c('character','list')){\n if (sum(grepl('*rds$|*Rds$',input))==1) {\n ## Log output.\n cat(\"1. Reading Seurat Object from dataset: seurat_object.rds\\n\\n\")\n \n input.dat=input[grepl('*rds$',input)]\n input.tcr=input[grepl('*csv$',input)]\n \n \n obj.list <- lapply(input.dat, \n function(x) { return(readRDS(x)) })\n if (length(input.tcr)>0) {\n tcr.list = lapply(input.tcr, \n function(x){return(read.delim(x,sep=\",\", header = T))}\n )\n }\n \n # \n } else if (sum(grepl('*h5$',input))>0){\n ## Log output.\n cat(\"1. Processing .h5 files from dataset \\n\\n\")\n \n input.dat=input[grepl('*h5$',input)]\n input.tcr=input[grepl('*csv$',input)]\n \n \n obj.list <- lapply(input.dat, \n function(x) { return(Read10X_h5(x, use.names=TRUE)) })\n if (length(input.tcr)>0) {\n tcr.list = lapply(input.tcr, \n function(x){return(read.delim(x,sep=\",\", header = T))}\n )\n }\n \n \n }else {\n stop(\"Incorrect input format: \n files should be a vector or list of\n .h5(Single Cell input)+.csv(TCR input) files or \n .rds files(Seurat Object input) \"\n )\n }\n } else {\n stop(\"Incorrect input format:Input should be a vector or list of file paths \n to .h5(Single Cell input)+.csv(TCR input) files or \n .rds files(Seurat Object input) \")\n }\n \n \n ## Clean up sample names\n names(obj.list) <- lapply(input.dat, basename)\n names(obj.list) <- sapply(names(obj.list), \n function(x) gsub(\"_filtered(\\\\w+)?.h5\",\"\", x))\n names(obj.list) <- sapply(names(obj.list), \n function(x) gsub(\"\\\\.(\\\\w+)?\",\"\", x))\n \n \n if (length(input.tcr)>0) {\n print(\"TCR seq data detected\")\n names(tcr.list) <- lapply(input.tcr, basename)\n names(tcr.list) <- sapply(names(tcr.list), \n function(x) gsub(\"_filtered(\\\\w+)?.csv\",\"\", x))\n names(tcr.list) <- sapply(names(tcr.list), \n function(x) gsub(\"\\\\.(\\\\w+)?\",\"\", x))\n \n \n if (setequal(names(obj.list),names(tcr.list))==F){\n stop(\"Names from sequencing files do not match TCR metadata files\")\n } \n } \n \n \n ### Create Seurat Object ####\n so.orig.nf <- list()\n for(i in seq_along(names(obj.list))){\n print(' ')\n print(names(obj.list)[i])\n ## From dgCMatrix\n if (class(obj.list[[i]]) == \"dgCMatrix\"){\n so.orig.nf[[i]] <- CreateSeuratObject(counts = obj.list[[i]], \n assay = \"RNA\", \n project=names(obj.list)[[i]], \n min.cells = 0)\n }else{\n ## From gene Expression Matrix\n k <- names(obj.list[[i]])\n print(paste0('Matricies Present in .h5 file'))\n print(k)\n \n for(j in 1:length(k)){\n if(names(obj.list[[i]][j]) == \"Gene Expression\"){\n so.orig.nf[[i]] = CreateSeuratObject(counts = obj.list[[i]][k][[j]], \n assay = \"RNA\", \n project=names(obj.list)[[i]], \n min.cells = 0)\n \n }else if(names(obj.list[[i]][j]) == \"Antibody Capture\"){\n ## determine if Slot contains CITEseq or HTO data\n ## CITEseq data and HTO data\n print('Antibody Capture Matrix detected')\n if (any(grepl(\"HTO.*\",rownames(obj.list[[i]][k][[j]])))) {\n print(\"HTO matrix detected\")\n \n ## Extract HTO matrix\n HTO <- rownames(\n obj.list[[i]][k][[j]])[\n grepl(\"HTO*\",rownames(obj.list[[i]][k][[j]]))]\n # ## Remove HTO matrix\n # obj.list[[i]][k][[j]]=obj.list[[i]][k][[j]][\n # rownames(obj.list[[i]][k][[j]])%in%HTO==F,]\n # \n contains.HTO=TRUE\n so.orig.nf[[i]][['HTO']] = \n CreateAssayObject(counts=obj.list[[i]][k][[j]][HTO, \n colnames(\n so.orig.nf[[i]]\n )])\n \n \n } else if ( any(grepl(\"HTO*\",rownames(obj.list[[i]][k][[j]]))==F) ){ \n ## If any names do not contain HTO assume to be CITE-seq\n ## extract Protein matrix\n print(\"Protein matrix detected\")\n \n protein <- rownames(\n obj.list[[i]][k][[j]])[\n !grepl(\"HTO02_*\",rownames(obj.list[[i]][k][[j]]))]\n \n so.orig.nf[[i]][[\"Protein\"]] <- \n CreateAssayObject(obj.list[[i]][k][[j]][protein, \n colnames(so.orig.nf[[i]]\n )])}\n \n \n }else{\n ## Error Report if h5 not correctly formated\n print(paste(names(obj.list[[i]][j]),\"found, not stored\"))\n }\n }\n }\n names(so.orig.nf)[[i]] <- names(obj.list)[[i]]\n }\n \n \n \n ### Split SO ####\n \n if(split.h5 == TRUE){\n if (length(so.orig.nf)==1) {\n cat('Splitting seurat object by idents')\n so.orig.nf <- SplitObject(so.orig.nf[[1]], split.by = \"ident\")\n \n cat('Split Sample Names:\\n',paste(names(so.orig.nf),collapse = '\\n'))\n \n } else {\n stop('imported data is list of muiltiple objects and cannot be split: \n set split.h5 to FALSE'\n )\n }\n }\n sample.names=names(so.orig.nf)\n \n cat(\"Sample Names:\\n\",paste(names(so.orig.nf),collapse = '\\n'),\"\\n\\n\")\n \n \n \n ### log Normalize Data ####\n if (do.normalize.data==T) {\n so.orig.nf <- lapply(seq_along(so.orig.nf), .logNormSeuratObject)\n names(so.orig.nf)=sample.names\n }else{\n print('Did not run Normalization, Input data is already Log Normalized')\n } \n \n ### Calculate metrics ####\n so.orig.nf <- lapply(seq_along(so.orig.nf), .calcMetrics)\n names(so.orig.nf)=sample.names\n \n ### add cell cycle information\n so.orig.nf <- lapply(so.orig.nf, CC_FVF_so) %>%suppressWarnings()\n \n \n ### Process Metadata table ####\n if(is.null(sample.metadata.table)==F){\n meta_class <- getClass(class(sample.metadata.table)) \n if (meta_class@className=='character'){\n \n meta.table=read.delim(file = sample.metadata.table,\n header = T,sep = '\\t')%>%\n suppressWarnings()\n \n } else {\n meta.table=sample.metadata.table\n }\n if (length(setdiff(meta.table[,sample.name.column],names(so.orig.nf)))>0) {\n stop(paste0(\"\n Names in the sample metadata column: '\",sample.name.column,\n \"' do not match sample names taken from .h5 files. \n Possible reasons could be misspelled names, or spaces in table.\n Check sample names:\n \",\n paste(\n paste0(\"'\",setdiff(meta.table[,sample.name.column],\n names(so.orig.nf)),\"'\"),\n sep=\"\",\n collapse = \"\\n\"\n ),\n \"\n in Metadata table\"\n ))\n }\n } else { print(\"No Metadata provided\")}\n \n \n \n ### Add Metadata ####\n if(is.null(sample.metadata.table)==F ){\n metacols <- colnames(meta.table)\n metacols <- metacols[!metacols %in% \n unique(c(rename.col,sample.name.column))]\n if (length(metacols)>0) {\n\n so.orig.nf=appendMetadataToSeuratObject(\n so.orig.nf,\n meta.table[,c(sample.name.column,metacols)],\n sample.name.column)[['object']]\n \n } else { print(\"No Metadata Columns were included in Metadata table\")}\n } else { print(\"No Metadata table was supplied\")}\n \n \n ### Add TCR Metadata ####\n if (length(input.tcr)>0) {\n print(\"Processing TCRseq metadata tables\")\n \n so.orig.nf=lapply(sample.names,FUN = .addTCR)\n names(so.orig.nf)=sample.names\n }\n \n \n \n \n ### Rename Samples ####\n if(is.null(sample.metadata.table)==F&is.null(rename.col)==F){\n if(sample.name.column!=rename.col){\n if(identical(sort(names(so.orig.nf)), \n sort(meta.table[[sample.name.column]]))){\n for (i in names(so.orig.nf)) {\n \n nname=meta.table[meta.table[,sample.name.column]%in%i,]\n ## add original name to metadata table\n so.orig.nf[[i]]@meta.data[,sample.name.column]=\n nname[,sample.name.column]\n\n ## Move original sample name column to second position in so metadata\n so.orig.nf[[i]]@meta.data=relocate(so.orig.nf[[i]]@meta.data,\n {{sample.name.column}}, \n .after = orig.ident)\n\n ## change orig.ident col to new name\n so.orig.nf[[i]]@meta.data$orig.ident=nname[,rename.col]\n \n names(so.orig.nf)[names(so.orig.nf)%in%i]=nname[,rename.col]\n \n\n }\n ## remove original sample names from meta.data table\n meta.table=meta.table[,!colnames(meta.table)%in%\n sample.name.column,drop=F]\n sample.name.column=rename.col\n sample.names=names(so.orig.nf)\n cat(\"Renamed Samples:\\n\",paste(names(so.orig.nf),collapse = '\\n'),'\\n')\n \n \n }else {\n stop(\"ERROR: Your metadata sample names do not mach the sample \n names of your samples\")\n }\n }else{\n cat(\"Sample Names:\\n\",paste(names(so.orig.nf),collapse = '\\n'),\"\\n\")\n }\n }else{\n cat(\"Sample Names:\\n\",paste(names(so.orig.nf),collapse = '\\n'),\"\\n\")\n }\n \n \n ### Remove Sample ####\n subsetRegex <- file.filter.regex\n if (length(subsetRegex) > 0) {\n if (keep == TRUE){\n for (i in length(subsetRegex)) {\n so.orig.nf <- so.orig.nf[grepl(subsetRegex[[i]],names(so.orig.nf))]\n }\n }else{\n for (i in length(subsetRegex)) {\n so.orig.nf <- so.orig.nf[!grepl(subsetRegex[[i]],names(so.orig.nf))]\n }\n }\n }\n \n \n\n \n ### Create QC figure ####\n ##Polychorme will create a palette of random colores based on a few seed \n ## colors. Here i used RcolorBrewer set1 color palette as the seed. Can not \n ## Reproduce exact pallet each time so creating 1 pallet that will be \n ## hardcoded in the Filter_QC and Combine_Normalize functions\n \n # library(Polychrome)\n # P100 = createPalette(100, brewer.pal(5, \"Set1\"), target = 'normal')\n # swatch(P100)\n \n col2=c(\"#E6161C\",\"#2E7AB6\",\"#53B251\",\"#9A53A6\",\"#FC7800\",\"#FFDA16\",\"#FC00B2\",\n \"#7622FE\",\"#7D532E\",\"#00FBF4\",\"#F126FE\",\"#DCDEE6\",\"#22FD0D\",\"#FD839B\",\n \"#005D51\",\"#E2E19E\",\"#C6F022\",\"#FBAD70\",\"#008AFE\",\"#F8AED8\",\"#A5001C\",\n \"#B42685\",\"#5835B4\",\"#CEC0FF\",\"#654B63\",\"#FF7DF1\",\"#F91C7F\",\"#5C6D16\",\n \"#16FABB\",\"#7DCCAF\",\"#8CD7F4\",\"#C86EFC\",\"#FFCDBD\",\"#882632\",\"#B0921C\",\n \"#B65500\",\"#FD0DDB\",\"#65FE84\",\"#9F9CFF\",\"#948C7E\",\"#8FAA00\",\"#758EA1\",\n \"#C5166C\",\"#93456A\",\"#0DC4FB\",\"#AF0DB9\",\"#F5AAFD\",\"#554984\",\"#C57A7A\",\n \"#0D9D9E\",\"#B7EEAD\",\"#FD7168\",\"#B700FB\",\"#85EC00\",\"#3B8655\",\"#AE8EB5\",\n \"#E7E965\",\"#FE87D2\",\"#FC9B16\",\"#AFF27A\",\"#8876FF\",\"#C3D2B4\",\"#FBD092\",\n \"#1626DB\",\"#FE5ACD\",\"#E4AA0D\",\"#A96A0D\",\"#B3966A\",\"#00E5FD\",\"#004F6E\",\n \"#7D00A3\",\"#FE947F\",\"#BC87E9\",\"#4F4726\",\"#ED3D5A\",\"#C79BA5\",\"#5CA8FD\",\n \"#005FBF\",\"#1CBB84\",\"#B2EDED\",\"#FD5C32\",\"#FCD6FF\",\"#F668AB\",\"#97C1FB\",\n \"#7F1CD7\",\"#94AF66\",\"#BE16A7\",\"#DE78A1\",\"#22B80D\",\"#7568BB\",\"#82F4A3\",\n \"#709686\",\"#FC6086\",\"#BB60A3\",\"#9F1658\",\"#EE6CFF\",\"#2E8BA8\",\"#47E9C8\",\n \"#8387BA\",\"#BCCDEC\" )\n # swatch(col2)\n \n ##Alternative is to combine RcolorBrewer palettes to create larger palette\n ## More limited on number of colors (61)\n \n # display.brewer.all()\n # col2 <- c(brewer.pal(8, \"Set1\"),\n # brewer.pal(12, \"Paired\"),\n # brewer.pal(7, \"Dark2\"),\n # brewer.pal(6, \"Accent\"),\n # brewer.pal(12, \"Set3\"),\n # brewer.pal(8,\"Set2\"), \n # brewer.pal(11, \"Spectral\")\n # )%>%unique\n\n\n # \n \n features=c(\"orig.ident\",\n \"nCount_RNA\",\n \"nFeature_RNA\",\n \"percent.mt\",\n \"log10GenesPerUMI\")\n\n \n \n #### Combine SO meta.data tables ####\n table.meta=data.frame()\n for(s in names(so.orig.nf)) {\n ftable=so.orig.nf[[s]]@meta.data\n ftable=ftable[,colnames(ftable)%in%features,drop=F]\n ftable$Sample=s\n \n table.meta=rbind(table.meta,ftable)\n }\n \n table.meta$nFeature_RNA=as.numeric(table.meta$nFeature_RNA)\n \n\n table.meta=rename(table.meta,\n 'UMI Count (nCount_RNA)' = 'nCount_RNA',\n 'Gene Count (nFeature_RNA)' ='nFeature_RNA',\n 'Percent Mitochondrial Genes (percent.mt)'='percent.mt',\n 'Complexity (log10GenesPerUMI)'='log10GenesPerUMI'\n )\n \n v=c('UMI Count (nCount_RNA)' ,\n 'Gene Count (nFeature_RNA)',\n 'Percent Mitochondrial Genes (percent.mt)',\n 'Complexity (log10GenesPerUMI)')\n \n \n\n ### Post Filter Summary - Scatter\n \n scatter.allsamples=lapply(v,\n function(y){.plotScatterPost2(table.meta,\n 'UMI Count (nCount_RNA)',y)})\n names(scatter.allsamples)=v\n \n scatter.allsamples.grob=ggarrange(plotlist=scatter.allsamples,\n ncol=1,\n common.legend = T,\n legend = 'right')\n \n \n ### Post Filter Summary - histogram\n \n hist.allsamples=lapply(v,function(x){.plotHistPost2(table.meta,x)})\n names(hist.allsamples)=v\n \n hist.allsamples.grob=ggarrange(plotlist=hist.allsamples,\n ncol=1,\n common.legend = T,\n legend = 'right') %>% \n suppressMessages()%>%suppressWarnings()\n \n \n ### Post Filter Summary - Violin\n \n violin.allsamples=lapply(v,function(x){.plotViolinPost2(table.meta,x)})\n names(violin.allsamples)=v\n violin.allsamples.grob=ggarrange(plotlist=violin.allsamples,\n ncol=1,\n common.legend = T,\n legend = 'right')\n \n violin.allsamples.grob=annotate_figure(violin.allsamples.grob, \n top = text_grob(\"\", \n face = \"bold\", \n size = 14))\n \n ### Post Filter Summary - combined Scatter + Histogram\n \n raw.grobs=ggarrange(\n ggarrange(plotlist=scatter.allsamples,\n ncol=1,legend = 'none'),\n ggarrange(plotlist=hist.allsamples,\n ncol=1,legend = 'none'),\n # ggarrange(plotlist=violin.allsamples,ncol=1,legend = 'none'),\n legend.grob=get_legend(scatter.allsamples[[1]]),\n ncol=2,\n legend='right') %>% \n suppressMessages()%>%suppressWarnings()\n \n raw.grobs=annotate_figure(raw.grobs, \n top = text_grob(\" Unfiltered QC Summary \", \n face = \"bold\", size = 14))\n \n \n \n ### Output\n return(\n list(\n object=so.orig.nf,\n plots=list(\n CombinedQC=raw.grobs,\n ViolinQC=violin.allsamples.grob,\n ScatterQC=scatter.allsamples.grob,\n HistogramQC=hist.allsamples.grob\n )\n )\n )\n \n}\n\n\n\n\n\n", + "columns": [ + { + "key": "Sample_Name_Column", + "displayName": "Sample Name Column", + "description": "The column of the input metadata.to.append table that contains sample names matching the orig.idents in the input object(s).", + "paramGroup": "Basic", + "sourceDataset": "Metadata_Table", + "defaultValue": null, + "columnType": "STRING", + "isMulti": null + }, + { + "key": "Column_to_Reaname_Samples", + "displayName": "Column to Reaname Samples", + "description": "Select column from Metadata data that contains new sample names", + "paramGroup": "Advanced", + "sourceDataset": "Metadata_Table", + "defaultValue": null, + "columnType": "STRING", + "isMulti": false + } + ], + "condaDependencies": [], + "description": "Creates Seurat Objects from input h5 files for individual or merged samples. A Seurat Object, the basic data structure for Seurat Single Cell analysis. Data will be log normalized to produce QC figures for individual samples. You may also rename samples and add sample Metadata columns using the attached Manual Entry Node. [View Documentation](https://nidap.nih.gov/workspace/notepad/view/ri.notepad.main.notepad.32eed99c-eb24-46e5-a7bd-3c1ed46dc693)", + "externalId": "Process_Input_Data_CCBR_scRNA_seq_", + "inputDatasets": [ + { + "key": "Input_Data", + "displayName": "Input Data", + "description": "Input can be a vector of scRNA-Seq .h5 files, or a list of seurat objects for each sample. vector should include file path.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_TRANSFORM_INPUT", + "tags": [] + }, + { + "key": "Metadata_Table", + "displayName": "Metadata Table", + "description": "A table of sample metadata. The Metadata Table can be used to rename samples and add sample level metadata to the created Seurat Object(s).", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "Use_Metadata_Table", + "displayName": "Use Metadata Table", + "description": "If you wish to use selected Metadata Table toggle to true. If True modify table so that first Column matches sample names in dataset. If set to FALSE the selected Metadata table will not be used and no modification to table is required (Default: TRUE)", + "paramType": "BOOLEAN", + "paramGroup": null, + "paramValues": null, + "defaultValue": "TRUE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "TCR_Summary_Select_Number_of_Top_Clonotypes", + "displayName": "TCR Summary - Select Number of Top Clonotypes", + "description": "Select number of top most identified TCR clonotypes to be included in summary column. Any clonotypes below the top N most populated will be classified as \"Other\". (Default: 10)", + "paramType": "NUMBER", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "10", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Organism", + "displayName": "Organism", + "description": "Please select species. Choices are Human or Mouse.", + "paramType": "SELECT", + "paramGroup": "Basic", + "paramValues": [ + "Human", + "Mouse" + ], + "defaultValue": "Human", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "File_Filter_Regex", + "displayName": "File Filter Regex", + "description": "Pattern or regular expression in file name. Use the keep parameter (above) to keep or remove files that contain pattern.", + "paramType": "STRING", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Keep", + "displayName": "Keep", + "description": "If TRUE, keep files when pattern is found in sample name. If FALSE, remove files when pattern is found in sample name. The pattern is set in the file.filter.regex parameter (above).", + "paramType": "BOOLEAN", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "TRUE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Split_h5", + "displayName": "Split h5", + "description": "If TRUE, split H5 into individual files. (Default is FALSE)", + "paramType": "BOOLEAN", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Normalize_Counts", + "displayName": "Normalize Counts", + "description": "Input data contains RAW counts and and so log2 normalization will be applied. If importing unprocessed data set to TRUE. If data has already been normalized set to FALSE", + "paramType": "BOOLEAN", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "TRUE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Cell_Hash_Data", + "displayName": "Cell Hash Data", + "description": "If TRUE, dataset contains cell hashtags. (Default is FALSE)", + "paramType": "BOOLEAN", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "Process Input Data [CCBR] [scRNA-seq]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/inst/extdata/NIDAPjson/Recluster_Seurat_Object_CCBR_scRNA_seq_.code-template.json b/inst/extdata/NIDAPjson/Recluster_Seurat_Object_CCBR_scRNA_seq_.code-template.json new file mode 100644 index 0000000..d739836 --- /dev/null +++ b/inst/extdata/NIDAPjson/Recluster_Seurat_Object_CCBR_scRNA_seq_.code-template.json @@ -0,0 +1,131 @@ +{ + "codeTemplate": "Reclustered_SO <- function({{{Seurat_Object}}}, {{{Metadata_Table}}}) {\n #image: png\n\n ## --------- ##\n ## Libraries ##\n ## --------- ##\n\n library(nidapFunctions)\n nidapLoadPackages(\"SCWorkflow\")\n \n ## -------------------------------- ##\n ## User-Defined Template Parameters ##\n ## -------------------------------- ##\n \n #Basic Parameters:\n seurat_object = {{{Seurat_Object}}}\n meta <- {{{Metadata_Table}}}\n reduction <- \"{{{Reduction}}}\"\n\n #Old Clustering Column Parameters:\n old_columns_to_save <- {{{Old_Columns_to_Save}}}\n prepend_text = \"{{{Prepend_Text}}}\"\n\n #Reclustering Parameters:\n number_of_pcs = {{{Number_of_PCs}}}\n cluster_resolution_low_range <- {{{Cluster_Resolution_Low}}}\n cluster_resolution_high_range <- {{{Cluster_Resolution_High}}}\n cluster_resolution_range_bins <- {{{Cluster_Resolution_Bin_Size}}}\n \n #Advanced Parameters:\n seurat_object_filename <- \"{{{Seurat_Object_Filename}}}\"\n\n ##--------------- ##\n ## Error Messages ##\n ## -------------- ##\n \n ## --------- ##\n ## Functions ##\n ## --------- ##\n\n ## --------------- ##\n ## Main Code Block ##\n ## --------------- ##\n\n ## Input SO.\n cat(\"Reading Seurat Object from dataset: seurat_object.rds\\n\\n\")\n path <- nidapGetPath(seurat_object,seurat_object_filename)\n SO <- readRDS(path)\n\n ## Recluster the SO.\n reclustered_SO <- reclusterSeuratObject(object = SO,\n prepend.txt = prepend_text,\n old.columns.to.save = old_columns_to_save,\n number.of.pcs = number_of_pcs,\n cluster.resolution.low.range = cluster_resolution_low_range,\n cluster.resolution.high.range = cluster_resolution_high_range,\n cluster.resolution.range.bins = cluster_resolution_range_bins,\n reduction.type = reduction\n )\n\n ## Print reclustered dimensionality reduction plot.\n print(reclustered_SO$plot)\n\n ## Output reclustered SO.\n output <- new.output()\n output_fs <- output$fileSystem()\n saveRDS(reclustered_SO$object, output_fs$get_path(\"seurat_object.rds\", 'w'))\n return(output_fs)\n}\n", + "columns": [ + { + "key": "Old_Columns_to_Save", + "displayName": "Old Columns to Save", + "description": "You can keep any previously-created clustering columns (e.g. SCT_snn_res_0_4) by renaming them before you recluster. To rename those old clustering columns, select one or more columns from the input Metadata Table that contain the older clustering info. They will be renamed using the \"Prepend Text\" parameter in the Reclustered SO.", + "paramGroup": "Older Clustering Column", + "sourceDataset": "Metadata_Table", + "defaultValue": null, + "columnType": "ALL", + "isMulti": true + } + ], + "condaDependencies": [], + "description": "This template takes a filtered or otherwise subsetted Seurat Object (SO) and its Metadata Table as input. Cells in the subsetted SO will then be reclustered. Parameters allow tuning the clustering and allow you to save prior clustering results is for comparison to reclustered results. The output is a Reclustered SO. A dimensionality reduction plot of the type you choose (TSNE or UMAP) and colored by your new clustering resolutions is also produced. Final Potomac Compatible Version: v12; Final Sugarloaf V1: v19. [View Documentation](https://nidap.nih.gov/workspace/notepad/view/ri.notepad.main.notepad.4d6e7059-80d9-4d64-9c4c-757a9065746d)", + "externalId": "Recluster_Seurat_Object_CCBR_scRNA_seq_", + "inputDatasets": [ + { + "key": "Seurat_Object", + "displayName": "Seurat Object", + "description": "Select an input Seurat Object. This Seurat Object should be filtered or otherwise subsetted.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_TRANSFORM_INPUT", + "tags": [] + }, + { + "key": "Metadata_Table", + "displayName": "Metadata Table", + "description": "Select the Metadata Table for the input Seurat Object. This table can be extracted from the input SO using the \"Get Metadata Table\" template.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "Reduction", + "displayName": "Reduction", + "description": "Select the type of dimensionality reduction you want the resulting plots to use. Choose from TSNE or UMAP. Default is UMAP.", + "paramType": "SELECT", + "paramGroup": "Visualization", + "paramValues": [ + "tsne", + "umap" + ], + "defaultValue": "umap", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Number_of_PCs", + "displayName": "Number of PCs", + "description": "Select the number of principal components (PCs) for your reclustering analysis. Set to 0 to automatically decide. Default is 30.", + "paramType": "NUMBER", + "paramGroup": "Reclustering", + "paramValues": null, + "defaultValue": "30", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Cluster_Resolution_Low", + "displayName": "Cluster Resolution - Low", + "description": "Select the minimum resolution for this round of reclustering. At LOWER resolutions you will get FEWER clusters. Default is 0.2.", + "paramType": "NUMBER", + "paramGroup": "Reclustering", + "paramValues": null, + "defaultValue": "0.2", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Cluster_Resolution_High", + "displayName": "Cluster Resolution - High", + "description": "Select the maximum resolution for this round of reclustering. At HIGHER resolutions, you will get MORE clusters. Default is 1.2.", + "paramType": "NUMBER", + "paramGroup": "Reclustering", + "paramValues": null, + "defaultValue": "1.2", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Cluster_Resolution_Bin_Size", + "displayName": "Cluster Resolution - Bin Size", + "description": "Select the bin size for your reclustering resolutions. Reclustering will be performed at steps between Low and High Resolutions using this bin size. For example, if you input 0.2 as your bin, and have low/high resolution ranges of 0.2 and 1.2, then the template will recluster the cells at resolutions of 0.2, 0.4, 0.6, 0.8, 1.0, and 1.2. Default is 0.2.", + "paramType": "NUMBER", + "paramGroup": "Reclustering", + "paramValues": null, + "defaultValue": "0.2", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Prepend_Text", + "displayName": "Prepend Text", + "description": "This text will be prepended to the old clustering column names that you have selected in the \"Old Columns to Save\" parameter. This will ensure that those older, pre-reclustering clustering columns will be preserved in the metadata table of the resulting reclustered SO. The results of the reclustering will be contained in new columns lacking this prefix. The default prefix text is \"old\".", + "paramType": "STRING", + "paramGroup": "Older Clustering Column", + "paramValues": null, + "defaultValue": "old", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Seurat_Object_Filename", + "displayName": "Seurat Object Filename", + "description": "The filename for the output RDS that contains the Reclustered Seurat Object produced by this template. Default is \"seurat_object.rds\".", + "paramType": "STRING", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "seurat_object.rds", + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "Recluster Seurat Object [CCBR] [scRNA-seq]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/inst/extdata/NIDAPjson/Rename_Clusters_by_Cell_Type_CCBR_scRNA_seq_.code-template.json b/inst/extdata/NIDAPjson/Rename_Clusters_by_Cell_Type_CCBR_scRNA_seq_.code-template.json new file mode 100644 index 0000000..77d86e1 --- /dev/null +++ b/inst/extdata/NIDAPjson/Rename_Clusters_by_Cell_Type_CCBR_scRNA_seq_.code-template.json @@ -0,0 +1,143 @@ +{ + "codeTemplate": "RenameClustersByCellType_SO <- function({{{Seurat_Object}}}, {{{Metadata_Table}}}, {{{Cluster_Identities_Table}}}) {\n\n ## This function maps seurat cluster ids to annotated cell types\n\n ## --------- ##\n ## Libraries ##\n ## --------- ##\n library(nidapFunctions)\n #nidapLoadPackages(\"SCWorkflow\")\n library(Seurat)\n library(dplyr)\n library(stringr)\n library(reshape2) \n ## -------------------------------- ##\n ## User-Defined Template Parameters ##\n ## -------------------------------- ##\n\n #Primary Inputs:\n seurat_object <- {{{Seurat_Object}}} \n cluster_identities_table <- {{{Cluster_Identities_Table}}}\n\n #Basic Parameters:\n cluster_number_column <- \"{{{Cluster_IDs_Column}}}\"\n cluster_name_column <- \"{{{New_Cluster_Names_Column}}}\"\n cluster_column_from_metadata <- \"{{{Cluster_IDs_from_Metadata}}}\"\n celltype_column_from_metadata <- \"{{{Cell_Type_Column_from_Metadata}}}\"\n \n\n #Advanced Parameters:\n order_clusters_by <- {{{Order_Clusters_By}}}\n order_celltypes_by <- {{{Order_Cell_Types_By}}}\n\tinteractive <- {{{Interactive}}}\n seurat_object_filename <- \"{{{Seurat_Object_Filename}}}\"\n\tPrefix <- \"{{{Prefix_for_Existing_Names}}}\"\n\n\t## -------------------------------- ##\n\t## Parameter Misspecifation Errors ##\n\t## -------------------------------- ##\n\t## -------------------------------- ##\n\t## Functions ##\n\t## -------------------------------- ##\n\t## --------------- ##\n\t## Main Code Block ##\n\t## --------------- ##\n\n\t# load data\n\tpath <- nidapGetPath(seurat_object,seurat_object_filename)\n SO <- readRDS(path)\n\t\n #Set up the parameters \n\n cluster_numbers <- cluster_identities_table[[cluster_number_column]]\n cluster_names <- cluster_identities_table[[cluster_name_column]]\n \n #Change cluster column to match SO (NIDAPism)\n metadata_df <- SO@meta.data\n\tcolnames(metadata_df) <- gsub(\"\\\\.\", \"_\", colnames(metadata_df))\n\tSO.renamed <- SO\n SO.renamed@meta.data <- metadata_df \n\n\n############## A new ways of handling labels\n\n# Check for entries in cluster_number_column that are not in the Seurat object and print a warning if there are missing clusters\nmissing_clusters <- setdiff(cluster_numbers, unique(metadata_df[[cluster_column_from_metadata]]))\nif (length(missing_clusters) > 0) { warning(\"The following cluster numbers are not found in the Seurat object: \", paste(missing_clusters, collapse = \", \")) }\n\n# Create a named vector for easy lookup of new cluster names\nnew_cluster_names <- setNames(cluster_names, cluster_numbers)\nexisting_clusters <- metadata_df[[cluster_column_from_metadata]]\n\n\n# # If cluster numbers on input table match the cluster numbers in cluster \n# # column in metadata, add new custom labels to seurat object\nif (all(unique(metadata_df[[cluster_column_from_metadata]]) %in% names(new_cluster_names)) ){\n\n# Adding new 'Clusternames' column to metadata.df\nmetadata_new <- metadata_df %>%\n mutate(Clusternames = ifelse(existing_clusters %in% cluster_numbers,\n new_cluster_names[as.character(existing_clusters)],\n paste0(Prefix, existing_clusters)))\n\ncluster_numbers <- unique(metadata_new[[cluster_column_from_metadata]])\ncluster_names <- unique(metadata_new$Clusternames)\n\nSO.renamed@meta.data <- metadata_new \n\n} else{\n stop(\"Cluster ID's have to match metadata column. Please check entry in\n input table.\")\n}\n\n##############\n\n\n\n\n so_result <- nameClusters(object = SO.renamed,\n cluster.identities.table=cluster_identities_table,\n cluster.numbers = cluster_number_column,\n cluster.names = cluster_name_column,\n cluster.column = cluster_column_from_metadata,\n labels.column = celltype_column_from_metadata,\n order.clusters.by = order_clusters_by,\n order.celltypes.by = order_celltypes_by,\n interactive = interactive)\n\n\t\n print(so_result$plot)\n\n #Add new metadata column to original so:\n\tSO@meta.data$Clusternames <- so_result$object@meta.data$Clusternames\n\n #Print figure and save output file\n\toutput <- new.output()\n\toutput_fs <- output$fileSystem()\n\tsaveRDS(SO, output_fs$get_path(\"seurat_object.rds\", 'w'))\n\treturn(SO)\n}\n\n\n\n#################################################\n## Global imports and functions included below ##\n#################################################\n\n\nnameClusters <- function(object,\n cluster.identities.table,\n cluster.numbers,\n cluster.names,\n cluster.column,\n labels.column,\n order.clusters.by = NULL,\n order.celltypes.by = NULL,\n interactive = FALSE)\n{\n \n # # Assign cluster numbers with custom cluster names \n # cluster.numbers <- factor(cluster.numbers,\n # str_sort(cluster.numbers, numeric = TRUE))\n # levels(cluster.numbers) <-\n # str_sort(cluster.numbers, numeric = TRUE)\n # # names(cluster.names) <- as.character(cluster.numbers)\n \n cluster.names= setNames(cluster.identities.table[[cluster.names]],cluster.identities.table[[cluster.numbers]])\n \n \n # get metadata from object and get cluster column\n metadata.df <- object@meta.data\n colval <- metadata.df[[cluster.column]]\n \n \n # # If cluster numbers on input table match the cluster numbers in cluster \n # # column in metadata, add new custom labels to seurat object\n # if (all(unique(metadata.df[[cluster.column]]) %in% unique(cluster.numbers))) {\n # object =\n # AddMetaData(object,\n # metadata = \n # deframe(tibble(metadata.df[[cluster.column]],\n # cluster.names[as.character(colval)])),\n # col.name = \"Clusternames\")\n # } else{\n # stop(\"Cluster ID's have to match metadata column. Please check entry in\n # input table.\")\n # }\n \n clus.num <-\n as.data.frame.matrix(table(object@meta.data$Clusternames,\n object@meta.data[[labels.column]]))\n clusnum.df <- melt(as.matrix(clus.num))\n sums <- rowSums(clus.num)\n cluster.perc <- (clus.num / sums) * 100\n \n # draw plot \n clus.df <- melt(as.matrix(cluster.perc))\n clus.df$num <- clusnum.df$value\n colnames(clus.df) <-\n c(\"cluster\", \"celltype\", \"percent\", \"number\")\n head(clus.df)\n clus.df$cluster <- factor(clus.df$cluster)\n \n #For plot, optional ordering by clusters\n if (length(order.clusters.by) > 0) {\n add2 <- order.clusters.by[!order.clusters.by %in%\n levels(clus.df$celltype)]\n if (length(add2) > 0) {\n add2 <- paste(add2, collapse = \", \")\n warning(sprintf(\"Some factors are not in data: %s\", add2))\n }\n clus.dat2 <- unique(clus.df$cluster)\n minus2 <- clus.dat2[!clus.dat2 %in% order.clusters.by]\n if (length(minus2) > 0) {\n minus2 <- paste(minus2, collapse = \", \")\n warning(sprintf(\"Some factors were not included in the list: %s\",\n minus2))\n }\n clus.df <-\n clus.df %>% filter(cluster %in% order.clusters.by)\n clus.df$cluster <-\n factor(clus.df$cluster, levels = order.clusters.by)\n } else {\n clus.df$cluster <- factor(clus.df$cluster,\n levels = str_sort(unique(cluster.names), numeric = TRUE))\n }\n \n #For plot, optional if ordering by cell types\n if (length(order.celltypes.by) > 0) {\n #Check for factors not present in dataset\n add <- order.celltypes.by[!order.celltypes.by %in%\n levels(clus.df$celltype)]\n if (length(add) > 0) {\n add <- paste(add, collapse = \", \")\n warning(sprintf(\"Some factors are not in data: %s\", add))\n }\n clus.dat <- unique(clus.df$celltype)\n minus <- clus.dat[!clus.dat %in% order.celltypes.by]\n if (length(minus) > 0) {\n minus <- paste(minus, collapse = \", \")\n warning(sprintf(\"Some factors were not included in the list: %s\",\n minus))\n }\n clus.df <- \n clus.df %>% filter(celltype %in% order.celltypes.by)\n clus.df$celltype <-\n factor(clus.df$celltype, levels = order.celltypes.by)\n }\n \n clus.df <- clus.df %>%\n arrange(cluster, celltype)\n\n ## if % less then 5 do not plot (convert to NA)\n clus.df[clus.df<5]=NA\n\n\n ## print clusters in log:\n clus <- clus.df %>%\n pull(cluster) %>%\n unique() %>%\n as.character()\n cat(\"clusters:\\n\")\n cat(clus, sep = \"\\n\")\n cat(\"\\n\\n\")\n \n ## print cell types in log\n celltypes <- clus.df %>%\n pull(celltype) %>%\n unique() %>%\n as.character()\n cat(\"celltypes:\\n\")\n cat(celltypes, sep = \"\\n\")\n \n \n # do plot (suppressMessages for ggplot2 scale replacemnt)\n g <- ggplot(clus.df,\n aes(\n x = celltype,\n y = cluster,\n size = percent,\n color = celltype,\n label = number\n )) +\n theme_classic() +\n geom_point(alpha = 0.5) +\n theme(axis.text.x = element_text(\n angle = 90,\n vjust = 0.5,\n hjust = 1\n )) +\n ggtitle(\"Percentage of Cell Type within Clusters\")\n \n if (interactive == TRUE) {\n g <- ggplotly(g)\n }\n\n invisible(list(\n object = object,\n plot = g\n ))\n \n}\n", + "columns": [ + { + "key": "Cluster_IDs_from_Metadata", + "displayName": "Cluster IDs from Metadata", + "description": "Select the Seurat Object metadata column containing the Cluster IDs. These Cluster IDs are often one of the SCT_snn_res_* columns created during the earlier clustering analysis.", + "paramGroup": "Basic", + "sourceDataset": "Metadata_Table", + "defaultValue": null, + "columnType": "ALL", + "isMulti": null + }, + { + "key": "Cell_Type_Column_from_Metadata", + "displayName": "Cell Type Column from Metadata", + "description": "Select the Seurat Object metadata column containing the Cell Type annotations. This is often, but not always, the \"MS_Celltype\" column produced during earlier Module Scoring.", + "paramGroup": "Basic", + "sourceDataset": "Metadata_Table", + "defaultValue": null, + "columnType": "STRING", + "isMulti": null + }, + { + "key": "Cluster_IDs_Column", + "displayName": "Cluster IDs Column", + "description": "Select the column from the input Cluster Identities Table that contains the Cluster IDs from an earlier clustering analysis. These IDs must match the unique values from a clustering metadata column of the input Seurat Object.", + "paramGroup": "Basic", + "sourceDataset": "Cluster_Identities_Table", + "defaultValue": null, + "columnType": "ALL", + "isMulti": null + }, + { + "key": "New_Cluster_Names_Column", + "displayName": "New Cluster Names Column", + "description": "Select the column from the input Cluster Identities Table that contains the New Cluster Names you have chosen.", + "paramGroup": "Basic", + "sourceDataset": "Cluster_Identities_Table", + "defaultValue": null, + "columnType": "ALL", + "isMulti": null + } + ], + "condaDependencies": [], + "description": "This template creates a dot plot of Cell Types by Renamed Clusters and outputs a Seurat Object with a new metadata column containing these New Cluster Names. The Cell Types are often determined by looking at the Module Score Cell Classification calls made by the upstream Module Score Cell Classification (see MS_Celltype metadata column).\n\nYou must provide a table with a column containing the unique Cluster IDs from an upstream clustering analysis (e.g. one of the SCT_snn_res_* columns in your input Seurat Object metadata) and a column containing the corresponding New Cluster Names you have chosen. The dot plot will display the unique Cell Types on the x-axis and the Renamed Clusters on the y-axis. The size of the dots show the percentage of cells in each row (each Renamed Cluster) that was classified as each Cell Type. A comparison of dot sizes within a row may provide insights into that cluster's primary Cell Type. A new metadata column named \"Clusternames\" is added to the output Seurat Object that contains the New Cluster Names.\n\nFinal Potomac Compatible Version: v37. Final Sugarloaf V1 Version: v45. Latest Sugarloaf V2 Version: V50. [View Documentation](https://nidap.nih.gov/workspace/notepad/view/ri.notepad.main.notepad.8c36edd1-0852-463c-becc-1517db1fc9f8) If you encounter problems, please contact CCBR* [NCICCBRNIDAP@mail.nih.gov](mailto:NCICCBRNIDAP@mail.nih.gov)", + "externalId": "Rename_Clusters_by_Cell_Type_CCBR_scRNA_seq_", + "inputDatasets": [ + { + "key": "Seurat_Object", + "displayName": "Seurat Object", + "description": "Seurat Object", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_TRANSFORM_INPUT", + "tags": [] + }, + { + "key": "Metadata_Table", + "displayName": "Metadata Table", + "description": "Metadata Table", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + }, + { + "key": "Cluster_Identities_Table", + "displayName": "Cluster Identities Table", + "description": "This input table must have two columns. The first contains the unique Cluster IDs from an upstream clustering analysis. The second contains the New Cluster Names you wish to apply to the Cluster IDs.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "Order_Clusters_By", + "displayName": "Order Clusters By", + "description": "[Optional] Provide a comma- or newline-separated list of New Cluster Names in the order you would like them displayed on the y-axis. If blank, the New Cluster Names will be sorted alphanumerically on the y-axis. Default is blank.", + "paramType": "VECTOR", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "c()", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Order_Cell_Types_By", + "displayName": "Order Cell Types By", + "description": "[Optional] Provide a comma- or newline-separated list of Cell Types in the order you would like them displayed on the x-axis. These must match the unique values found in the Cell Type column chosen from the input Metatdata. If blank, the Cell Types will be sorted alphanumerically on the x-axis. Default is blank.", + "paramType": "VECTOR", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "c()", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Interactive", + "displayName": "Interactive", + "description": "If TRUE, draw interactive plot. Default is FALSE.", + "paramType": "BOOLEAN", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Seurat_Object_Filename", + "displayName": "Seurat Object Filename", + "description": "Filename of RDS containing seurat object.", + "paramType": "STRING", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "seurat_object.rds", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Prefix_for_Existing_Names", + "displayName": "Prefix for Existing Names", + "description": "Please enter your prefix here (i.e., if your prefix value is \"Label_\", then cluster \"4\" would appear as \"Label_4\" in new metadata column)", + "paramType": "STRING", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "Cluster_", + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "Rename Clusters by Cell Type [CCBR] [scRNA-seq]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/inst/extdata/NIDAPjson/Statistical_Analysis_using_Limma_CCBR_scRNA_seq_Bulk_Beta_.code-template.json b/inst/extdata/NIDAPjson/Statistical_Analysis_using_Limma_CCBR_scRNA_seq_Bulk_Beta_.code-template.json new file mode 100644 index 0000000..a3d0af3 --- /dev/null +++ b/inst/extdata/NIDAPjson/Statistical_Analysis_using_Limma_CCBR_scRNA_seq_Bulk_Beta_.code-template.json @@ -0,0 +1,194 @@ +{ + "codeTemplate": "GSVA_LimmaStats <- function({{{Dataset}}},{{{Metadata_Table}}}) {\n \n library(nidapFunctions)\n libs <- c(\"limma\",\"ggplot2\",\"edgeR\",\"stringr\",\"gridExtra\",\"reshape2\",\"grid\",\"gtable\",\"dplyr\",\"tibble\",\"tidyr\",\"plotly\")\n nidapLoadPackages(libs)\n \n counts_matrix <- {{{Dataset}}}\n sample_metadata <- {{{Metadata_Table}}} \n samples_to_include = {{{Samples_to_Include}}}\n gene_names_column <- \"{{{Gene_Names_Column}}}\"\n contrast_variable_columns <- {{{Contrast_Variable_Column}}}\n contrasts <- {{{Contrasts}}}\n donor_variable_column = {{{Donor_Variable_Column}}}\n sample_names_column = \"{{{Sample_Names_Column}}}\"\n \n covariate_columns = {{{Covariate_Columns}}}\n summarization_method = \"{{{Summarization_Method}}}\" \n \n #Advanced:\n return_matrix = {{{Return_Matrix}}}\n fold_change_threshold = {{{Fold_Change_Threshold}}}\n first_pvalue_threshold = {{{First_p_value_Threshold}}}\n second_pvalue_threshold = {{{Second_p_value_Treshold}}}\n\n #Visualization:\n row_number <- {{{Row_Number}}} # cut number of rows\n column_number <- {{{Column_Number}}} # cut number of columns per table\n\n ##--------------- ##\n ## Error Messages ##\n ## -------------- ##\n \n if(!all(make.names(colnames(counts_matrix))==colnames(counts_matrix))){\n print(\"Error: The following counts matrix column names are not valid:\\n\")\n print(colnames(counts_matrix)[make.names(colnames(counts_matrix))!=colnames(counts_matrix)])\n \n print(\"Likely causes are columns starting with numbers or other special characters eg spaces.\")\n stop(\"Bad column names.\")\n }\n \n ## --------- ##\n ## Functions ##\n ## --------- ##\n \n # Function to split data frame rows\n split_data_frame_rows <- function(data, chunk_size) {\n data <- as.data.frame(data)\n split(data, ceiling(seq_along(1:nrow(data)) / chunk_size))\n #split(data, ceiling( nrow(data)/ chunk_size))\n }\n \n # Function to split data frame columns\n split_data_frame_cols <- function(data, chunk_size) {\n col_indices <- split(seq_len(ncol(data)), ceiling(seq_along(seq_len(ncol(data))) / chunk_size))\n lapply(col_indices, function(cols) data[, cols, drop = FALSE])\n }\n \n # Function to print chunks with titles\n print_chunk <- function(chunk, index, title) {\n for(i in seq_along(colnames(chunk))) {\n if(class(chunk[[i]]) == \"list\") {\n chunk[[i]] <- unlist(lapply(chunk[[i]], function(x) paste(x, collapse = \",\")))\n }\n }\n \n # Create a grob with title\n title_grob <- textGrob(title, gp = gpar(fontsize = 15, fontface = \"bold\"))\n table_grob <- tableGrob(chunk, theme = ttheme_default(base_size = 10))\n \n # Arrange the title and table in a vertical layout\n combined_grob <- arrangeGrob(title_grob, table_grob, ncol = 1, heights = c(1, 10))\n \n grid.newpage()\n grid.draw(combined_grob)\n return(NULL)\n }\n \n # Function to split and print a table\n split_and_print_table <- function(data, row_chunk_size, col_chunk_size, tabtitle) {\n # Split rows into chunks\n row_chunks <- suppressWarnings(split_data_frame_rows(data, row_chunk_size))\n row_index <- 1\n \n for (row_chunk in row_chunks) {\n row_start <- row_index * row_chunk_size - row_chunk_size + 1\n row_stop <- row_start + nrow(row_chunk) - 1\n \n # Split columns into chunks for each row chunk\n col_chunks <- suppressWarnings(split_data_frame_cols(row_chunk, col_chunk_size))\n col_index <- 1\n \n for (col_chunk in col_chunks) {\n col_start <- col_index * col_chunk_size - col_chunk_size + 1\n col_stop <- col_start + ncol(col_chunk) - 1\n \n title <- paste(tabtitle,\"Subset Rows\", row_start, \"-\", row_stop, \"Cols\", col_start, \"-\", col_stop)\n print_chunk(col_chunk, paste0(\"Row \", row_start, \"-\", row_stop, \", Col \", col_start, \"-\", col_stop), title)\n \n col_index <- col_index + 1\n }\n \n row_index <- row_index + 1\n }\n }\n \n plot_sankey <- function(sample_metadata, contrast_variable_columns, covariate_columns = NULL) {\n \n # Prepare the data for the Sankey plot \n all_columns <- c(contrast_variable_columns, covariate_columns)\n \n if (length(all_columns) == 1) {\n message(\"Cannot draw a Sankey plot with only one contrast variable column and no covariate columns.\")\n return(NULL)\n } else {\n # Transform the data into a long format\n long_data <- sample_metadata %>%\n pivot_longer(cols = all_of(all_columns), names_to = \"Category\", values_to = \"Value\")\n \n # Create nodes\n nodes <- data.frame(name = unique(long_data$Value))\n \n # Create links dynamically\n links <- NULL\n for (i in 1:(length(all_columns) - 1)) {\n temp_links <- sample_metadata %>%\n group_by(across(all_of(all_columns[c(i, i + 1)]))) %>%\n summarise(value = n(), .groups = 'drop') %>%\n mutate(source = match(.data[[all_columns[i]]], nodes$name) - 1,\n target = match(.data[[all_columns[i + 1]]], nodes$name) - 1) %>% select(source, target, value)\n links <- bind_rows(links, temp_links)\n }\n \n # Create the plotly Sankey plot\n sankey <- plot_ly( type = \"sankey\",\n orientation = \"h\",\n node = list(\n label = nodes$name,\n pad = 15,\n thickness = 20,\n line = list(color = \"black\", width = 0.5)\n ),\n link = list(source = links$source,\n target = links$target,\n value = links$value\n )\n ) \n return(sankey)\n }\n }\n \n plot_sankey_with_confounders <- function(data, contrast_columns, covariate_column, confounder_names) {\n # Transform data into long format\n long_data <- data %>%\n pivot_longer(cols = c(contrast_columns, covariate_column), names_to = \"Category\", values_to = \"Value\")\n \n # Create nodes\n nodes <- data.frame(name = unique(long_data$Value))\n \n # Create links\n long_data <- long_data %>%\n group_by(.data[[sample_names_column]]) %>%\n arrange(Category) %>%\n mutate(Source = lag(Value), Target = Value) %>%\n filter(!is.na(Source)) %>%\n ungroup()\n \n links <- long_data %>%\n group_by(Source, Target) %>%\n summarise(count = n(), .groups = 'drop') %>%\n mutate(source = match(Source, nodes$name) - 1,\n target = match(Target, nodes$name) - 1) %>%\n select(source, target, count)\n \n # Highlight confounded nodes\n if(length(confounder_names) > 0) {\n nodes$group <- ifelse(nodes$name %in% confounder_names, \"confounded\", \"non_confounded\")\n nodes$color <- ifelse(nodes$name %in% confounder_names, \"red\", \"lightblue\")\n } else { # give different colors to each name\n nodes$group <- nodes$name\n nodes$color <- scales::hue_pal()(length(unique(nodes$name)))\n }\n \n # Highlight confounded links\n links$group <- ifelse(nodes$name[links$source + 1] %in% confounder_names | nodes$name[links$target + 1] %in% confounder_names, \"confounded\", \"non_confounded\")\n links$color <- ifelse(nodes$name[links$source + 1] %in% confounder_names | nodes$name[links$target + 1] %in% confounder_names, \"red\", \"lightblue\")\n \n # Check if there are any confounders\n if (length(confounder_names) == 0) {\n # If no confounders, use grey color for all links\n links$color <- \"#A9A9A9\"\n }\n \n # Create the plotly Sankey plot\n sankey <- plot_ly(\n type = \"sankey\",\n orientation = \"h\",\n node = list(\n label = nodes$name,\n color = nodes$color,\n pad = 15,\n thickness = 20,\n line = list(color = \"black\", width = 0.5)\n ),\n link = list(\n source = links$source,\n target = links$target,\n value = links$count,\n color = links$color\n )\n ) %>%\n layout(\n title = \"Sankey Diagram\",\n font = list(size = 10)\n )\n \n return(sankey)\n }\n \n # Function to check for confounders without using design matrix\n check_confounders <- function(data, contrast_vars, covariate_column) {\n confounders <- list()\n confounder_names <- list() \n for (conf_var in contrast_vars) {\n for (level in levels(data[[covariate_column]])) {\n contingency_table <- table(data[[conf_var]], data[[covariate_column]] == level)\n for (row_name in rownames(contingency_table)) {\n if (contingency_table[row_name, 1] == 0 & contingency_table[row_name, 2] > 0) {\n detailed_message <- paste(row_name, \"is completely confounded with\", covariate_column, level)\n confounders[[conf_var]] <- c(confounders[[conf_var]], detailed_message)\n confounder_names[[conf_var]] <- c(confounder_names[[conf_var]], row_name)\n }\n }\n }\n }\n return(list(confounders = confounders, confounder_names = confounder_names))\n }\n \n # Function to draw an error message with text wrapping and respecting newlines\n draw_error_message <- function(message, color, width = 120) {\n # Split the message by newlines\n segments <- str_split(message, \"\\n\")[[1]]\n # Wrap each segment\n wrapped_segments <- lapply(segments, str_wrap, width = width)\n # Combine the wrapped segments with newlines\n wrapped_message <- paste(unlist(wrapped_segments), collapse = \"\\n\")\n \n grid.newpage()\n grid.rect(gp = gpar(fill = color, col = NA))\n grid.text(wrapped_message, x = 0.5, y = 0.5, \n gp = gpar(fontface = \"italic\", cex = 3, col = \"black\"), \n just = \"center\")\n }\n \n #Function to get gene lists based on fold change and p-value thresholds\n getgenelists <- function(FClimit,pvallimit,pval){\n upreggenes <- list()\n downreggenes <- list() \n for(i in 1:length(contrasts)){\n if(pval == \"pval\"){\n results %>% dplyr::filter(.data[[colnames(FC)[i]]] > FClimit & .data[[colnames(pvals)[i]]] < pvallimit) %>% pull(Gene) %>% length() -> upreggenes[[i]] \n results %>% dplyr::filter(.data[[colnames(FC)[i]]] < -FClimit & .data[[colnames(pvals)[i]]] < pvallimit) %>% pull(Gene) %>% length() -> downreggenes[[i]] \n } else {\n results %>% dplyr::filter(.data[[colnames(FC)[i]]] > FClimit & .data[[colnames(pvaladj)[i]]] < pvallimit) %>% pull(Gene) %>% length() -> upreggenes[[i]] \n results %>% dplyr::filter(.data[[colnames(FC)[i]]] < -FClimit & .data[[colnames(pvaladj)[i]]] < pvallimit) %>% pull(Gene) %>% length() -> downreggenes[[i]] \n }\n }\n names(upreggenes) <- contrasts\n names(downreggenes) <- contrasts\n allreggenes <- rbind(unlist(upreggenes),unlist(downreggenes))\n rownames(allreggenes) <- c(paste0(\"upreg>\",FClimit, \", \",pval,\"<\",pvallimit),paste0(\"downreg<-\",FClimit, \", \",pval,\"<\",pvallimit))\n return(allreggenes)\n }\n \n # Function to calculate fold change from group means\n calculate_fold_change <- function(group_means, contrast) {\n # Split the contrast string into individual group names\n groups <- strsplit(contrast, \"-\")[[1]]\n \n # Extract the two group names for the fold change calculation\n group1 <- groups[1]\n group2 <- groups[2]\n \n # Calculate fold change\n fold_change <- group_means[[group1]] / group_means[[group2]]\n fold_change[is.nan(fold_change)] <- 1\n fold_change[fold_change < 1] <- -1/fold_change\n return(fold_change)\n }\n \n # Function to calculate the difference in fold changes\n calculate_fold_change_difference <- function(group_means, contrast) {\n # Split the contrast string into individual contrasts\n contrasts <- strsplit(contrast, \"\\\\)-\\\\(\")[[1]]\n \n # Remove the residual parentheses\n contrasts <- gsub(\"[()]\", \"\", contrasts)\n \n # Calculate fold changes for each contrast\n fc1 <- calculate_fold_change(group_means, contrasts[1])\n fc2 <- calculate_fold_change(group_means, contrasts[2])\n delta <- fc1/fc2\n delta[is.nan(delta)] <- 1\n delta[delta < 1] <- -1/delta \n return(delta)\n }\n \n # Custom function to calculate standard error\n se <- function(x) {\n n <- length(x[!is.na(x)]) # Only non-NA values should be counted\n sd(x, na.rm = TRUE) / sqrt(n)\n }\n \n wraplines <- function(y){\n j = unlist(strsplit(y,\"-\"))\n k = strwrap(j, width = 10)\n l = paste(k,collapse=\"\\n-\")\n return(l)\n }\n \n ## --------------- ##\n ## Main Code Block ##\n ## --------------- ##\n \n #Make sure that sample metadata contains all the sample names\n sample_metadata.filt <- sample_metadata %>% dplyr::filter(.data[[sample_names_column]] %in% samples_to_include)\n rownames(sample_metadata.filt) <- sample_metadata.filt[[sample_names_column]]\n \n ##Make sure the counts matrix matches sample names selected:\n counts_matrix.filt <- counts_matrix %>% select(all_of(c(gene_names_column,samples_to_include))) \n func <- match.fun(summarization_method)\n counts_matrix.filt <- counts_matrix.filt %>% group_by(.data[[gene_names_column]]) %>% summarise_all(func) \n counts_matrix.final <- counts_matrix.filt[,sample_metadata.filt[[sample_names_column]]] %>% as.data.frame()\n rownames(counts_matrix.final) <- counts_matrix.filt[[gene_names_column]]\n counts_matrix.final <- as.matrix(counts_matrix.final)\n \n # Check that all values in counts_matrix.final are numeric\n if (!all(sapply(counts_matrix.final, is.numeric))) {\n stop(\"Error: counts_matrix.final contains non-numeric values. Please ensure all values are numeric.\")\n }\n \n #Ensure that there is only 1 sample per condition per subject, and print out the groups:\n if(length(donor_variable_column) > 0){\n sample_metadata.filt.dedup <- sample_metadata.filt %>%\n group_by(across(all_of(c(donor_variable_column, contrast_variable_columns)))) %>%\n slice(1) %>%\n ungroup()\n #Print out individual groups:\n grouped_summary <- sample_metadata.filt.dedup %>%\n group_by(across(all_of(c(donor_variable_column, contrast_variable_columns)))) %>%\n summarise(Sample_Names = toString(.data[[sample_names_column]]),\n .groups = 'drop')\n wide_table <- grouped_summary %>%\n pivot_wider(names_from = contrast_variable_columns, values_from = Sample_Names)\n wide_table <- replace(wide_table, is.na(wide_table), \"\")\n } else {\n sample_metadata.filt.dedup <- sample_metadata.filt\n wide_table <- NULL\n }\n \n #Create another contrast column called contmerge if 2 factor:\n if(length(contrast_variable_columns)>1){\n sample_metadata.final <- sample_metadata.filt.dedup %>% dplyr::mutate(contmerge = paste0(.data[[contrast_variable_columns[1]]],\".\",.data[[contrast_variable_columns[2]]])) %>%\n as.data.frame()\n } else {\n sample_metadata.final <- sample_metadata.filt.dedup %>% dplyr::mutate(contmerge = .data[[contrast_variable_columns]]) %>% as.data.frame()\n }\n \n #Make design matrix:\n if(length(covariate_columns) > 0) {\n dm.formula <- as.formula(paste(\"~0 + contmerge + \", paste(covariate_columns, sep=\"+\", collapse=\"+\")))\n } else {\n dm.formula <- as.formula(\"~0 + contmerge\")\n }\n \n cat(\"\\n\\nstatistical formula:\\n\")\n print(dm.formula)\n cat(sprintf(\"\\n\\n Contmerge factor created from %s \\n\\n\", paste(contrast_variable_columns, collapse = \", \")))\n \n #Set rownames of sample metadata before creating design matrix:\n rownames(sample_metadata.final) = sample_metadata.final[[sample_names_column]]\n # Convert covariate column to factor\n sample_metadata.final <- sample_metadata.final %>%\n mutate(across(all_of(covariate_columns), as.factor))\n \n design <- model.matrix(dm.formula,sample_metadata.final)\n \n for(i in 1:length(contrast_variable_columns)){\n colnames(design) <- gsub(paste0(\"^\", contrast_variable_columns[i]), \"\", colnames(design))\n }\n colnames(design) <- gsub(\":\",\".\",colnames(design))\n colnames(design) <- gsub(\"contmerge\", \"\", colnames(design))\n \n # Identify non-estimable factors\n nonest0 <- colnames(design)[colSums(design) == 0]\n nonest1 <- colnames(design)[colSums(design) == 1]\n \n # Combine non-estimable factors\n nonest <- c(nonest0, nonest1)\n \n # Print out non-estimable factors\n if (length(nonest) > 0) {\n \n # Print initial dimensions\n print(\"Variables before removing non-estimable factors:\")\n print(colnames(design))\n \n # Remove non-estimable factors from the design matrix\n design <- design[, !colnames(design) %in% nonest]\n \n #Remove uncategorized samples from sample metadata and counts matrix\n counts_matrix.final <- (counts_matrix.final[,rownames(design)]) %>% as.data.frame\n sample_metadata.final <- sample_metadata.final %>% filter(.data[[sample_names_column]] %in% rownames(design))\n \n # Print dimensions after removing non-estimable factors\n print(\"Variables after removing non-estimable factors:\")\n print(colnames(design))\n \n message(\"The following non-estimable factors have been removed from the design matrix as they do not provide sufficient variability:\\n\",\n \"Factors with all zero counts: \", paste(nonest0, collapse = \", \"), \"\\n\",\n \"Factors with only one non-zero count: \", paste(nonest1, collapse = \", \"), \"\\n\")\n } else {\n message(\"All factors in the design matrix provide sufficient variability. No non-estimable factors were found.\")\n }\n \n # Perform QR decomposition\n qr_check <- qr(design)\n \n # Extract the rank from the QR object\n qr_rank <- qr_check$rank\n \n # Get the number of columns in the design matrix\n num_columns <- ncol(design)\n \n # Check for collinearity\n if (qr_rank < num_columns) {\n cat(\"Collinearity detected: The design matrix does not have full rank.\\n\")\n confounded_covariates <- colnames(design)[qr_check$pivot[(qr_rank + 1):num_columns]]\n print(confounded_covariates)\n } else {\n cat(\"No collinearity detected: The design matrix has full rank.\\n\")\n confounded_covariates <- NULL\n }\n \n if(!is.null(confounded_covariates)){ \n # Identify confounded variables - column where confounding variables are found\n confounding_variable_column <- covariate_columns[grepl(covariate_columns,confounded_covariates)][1]\n confounder_info <- check_confounders(sample_metadata.final, contrast_variable_columns, confounding_variable_column)\n confounders <- confounder_info$confounders\n confounder_names <- unique(unlist(confounder_info$confounder_names))\n \n # Draw Sankey Plot to show the experimental design\n sankeyplot <- plot_sankey_with_confounders(sample_metadata.final, \n c(contrast_variable_columns), \n covariate_columns, confounder_names)\n message <- paste0(\"Error: The following covariates are confounded:\\n\")#, \"\\n\", paste(confounders, collapse = \", \"), \"\\n\\n\")\n for (covariate in names(confounders)) {\n if (length(confounders[[covariate]]) > 0) {\n message <- paste0(message, \"\\n\", covariate, \"\\n\",\n paste(confounders[[covariate]], collapse = \"\\n \"), \"\\n\")\n } else {\n message <- paste0(message, covariate, \" (no specific confounding variable identified)\\n\")}\n }\n message <- paste0(message, \"\\n\\nThis indicates that your experimental design contains confounding variables, which can bias your results.\\n\",\n \"Consider revising your experimental design to ensure that each covariate provides unique information.\\n\",\n \"You may need to collect more data or adjust the grouping of your samples.\")\n draw_error_message(message, \"tomato3\")\n print(sankeyplot)\n } else {\n sankeyplot <- plot_sankey(sample_metadata.final, \n c(contrast_variable_columns), \n covariate_columns)\n message <- \"No collinearity was detected in the design matrix.\"\n draw_error_message(message, \"lightgreen\")\n if(!is.null(sankeyplot)){\n print(sankeyplot) \n } \n #Prepare plot for distribution of values across samples\n counts.df <- as.data.frame(counts_matrix.final) %>% rownames_to_column(\"Features\")\n \n long_counts <- counts.df %>% pivot_longer(\n cols = -Features, \n names_to = \"SampleID\", \n values_to = \"Count\"\n ) \n \n # DrawBoxplot\n p <- ggplot(long_counts, \n aes(x = SampleID, y = Count, fill = factor(SampleID))) + \n geom_boxplot() +\n scale_fill_manual(values = rainbow(length(unique(long_counts$SampleID)))) +\n ggtitle(\"Distribution of Values Across Samples\") +\n theme_minimal() +\n theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1),\n legend.position = \"none\") +\n labs(x = \"\", y = \"Value\")\n \n print(p)\n \n # Splitting and printing the pivoted table for donor samples\n if(!is.null(wide_table )){\n split_and_print_table(wide_table, row_number, column_number, \"Pivot Table of Different Groups by Donor\")\n }\n \n #Run duplicate correlation and lmfit:\n if(length(donor_variable_column) > 0){\n cat(\"Running linear mixed model\\n\\n\")\n donor_variable_column <- donor_variable_column[1]\n corfit <- duplicateCorrelation(counts_matrix.final,design,block=sample_metadata.final[[donor_variable_column]]) \n fit <- lmFit(counts_matrix.final, design, block=sample_metadata.final[[donor_variable_column]], correlation=corfit$consensus.correlation)\n } else {\n cat(\"Running linear model\\n\\n\")\n fit <- lmFit(counts_matrix.final, design)\n } \n \n cm <- makeContrasts(contrasts = contrasts, levels=design)\n fit <- contrasts.fit(fit, cm)\n fit2 <- eBayes(fit)\n \n #Calculate Group Means:\n contgroups <- colnames(design)\n group_means <- list() \n group_se <- list()\n for (group_name in contgroups) {\n group_indices <- which(design[, group_name] == 1)\n group_means[[group_name]] <- rowMeans(counts_matrix.final[, group_indices, drop = FALSE])\n group_se[[group_name]] <- apply(counts_matrix.final[, group_indices, drop = FALSE], 1, se)\n }\n \n #Put together the results dataframe:\n tstat <- fit2$t\n pvals <- fit2$p.value\n logFC <- fit2$coefficients \n FC <- 2^fit2$coefficients\n FC <- apply(FC, MARGIN = c(1,2), function(x) ifelse(x < 1, -1/x, x))\n SE <- sqrt(fit2$s2.post) * fit2$stdev.unscaled\n \n #Format the final results table \n group_means <- do.call(data.frame, group_means)\n colnames(group_means) <- paste(colnames(group_means),\"Mean\",sep = \"_\") \n group_se <- do.call(data.frame, group_se)\n colnames(group_se) <- paste(colnames(group_se),\"SE\",sep = \"_\")\n \n colnames(logFC) <- paste(colnames(logFC),\"logFC\", sep=\"_\")\n colnames(FC) <- paste(colnames(FC),\"FC\", sep=\"_\")\n colnames(SE) = paste(colnames(SE), \"SE\", sep=\"_\")\n colnames(tstat) <- paste(colnames(tstat),\"tstat\", sep=\"_\")\n colnames(pvals) <- paste(colnames(pvals),\"pval\",sep=\"_\")\n pvaladj <- apply(pvals,2,function(x) p.adjust(x,\"BH\"))\n colnames(pvaladj) <- paste(colnames(fit$coefficients),\"adjpval\",sep=\"_\")\n results <- cbind(group_means,group_se,FC,logFC,SE,tstat,pvals,pvaladj)\n results <- as.data.frame(results) %>% rownames_to_column(\"Gene\") \n \n #Format group sample numbers:\n sampsize <- colSums(design)\n titleval <- \"Please note Sample size:\"\n titletext <- paste(names(sampsize), sampsize, sep = \"=\", collapse = \" \\n \")\n sampletitle <- textGrob(paste(titleval,\"\\n\",titletext,\"\\n\\n\\n\"),gp=gpar(fontsize=10))\n contrast <- colnames(cm)\n connames <- strsplit(contrast,\"-\")\n connames <- lapply(connames,function(x) {gsub(\"\\\\(\",\"\",gsub(\"\\\\)\",\"\",x))})\n contrastsize <- lapply(connames,function(x) sampsize[unlist(x)])\n contrasttext <- paste(contrast, contrastsize, sep = \" : \", collapse = \"\\n\") \n contrasttext <- textGrob(paste(\"\\n\\n\\nContrasts:\\n\",contrasttext),gp=gpar(fontsize=10))\n \n grid.newpage()\n grid.draw(sampletitle)\n grid.newpage()\n grid.draw(contrasttext)\n \n #Format genelist sizes for typical cutoffs:\n FCpval1 <- getgenelists(FClimit = fold_change_threshold, pvallimit = first_pvalue_threshold,\"pval\")\n FCpval2 <- getgenelists(FClimit = fold_change_threshold, pvallimit = second_pvalue_threshold,\"pval\")\n FCadjpval1 <- getgenelists(FClimit = fold_change_threshold, pvallimit = first_pvalue_threshold,\"adjpval\")\n FCadjpval2 <- getgenelists(FClimit = fold_change_threshold, pvallimit = second_pvalue_threshold,\"adjpval\")\n pvaltab <- rbind(FCpval1,FCpval2,FCadjpval1,FCadjpval2)\n colnames(pvaltab) <- sapply(colnames(pvaltab), function(x) wraplines(x))\n \n #Splitting and printing the table for genelist sizes:\n split_and_print_table(pvaltab, row_number, column_number, \"Number of contrasts\")\n \n colnames(results) <- gsub(\" - \",\"-\",colnames(results))\n colnames(results) <- gsub(\"\\\\(\",\"\",gsub(\"\\\\)\",\"\",colnames(results)))\n \n if(return_matrix == TRUE){\n results = as.data.frame(cbind(results, counts_matrix.final))\n } \n \n return(results)\n }\n}\n\n\n#################################################\n## Global imports and functions included below ##\n#################################################\n\n\n", + "columns": [ + { + "key": "Sample_Names_Column", + "displayName": "Sample Names Column", + "description": "Specify the column in the metadata table that contains sample names. These should match the column names in the data matrix.", + "paramGroup": null, + "sourceDataset": "Metadata_Table", + "defaultValue": null, + "columnType": "STRING", + "isMulti": null + }, + { + "key": "Samples_to_Include", + "displayName": "Samples to Include", + "description": "Samples to include in the analysis", + "paramGroup": null, + "sourceDataset": "Dataset", + "defaultValue": null, + "columnType": "NUMBER", + "isMulti": true + }, + { + "key": "Gene_Names_Column", + "displayName": "Gene Names Column", + "description": "Column in the Dataset that contains Gene Names or Symbols", + "paramGroup": null, + "sourceDataset": "Dataset", + "defaultValue": null, + "columnType": "STRING", + "isMulti": null + }, + { + "key": "Contrast_Variable_Column", + "displayName": "Contrast Variable Column", + "description": "Specify the column(s) for the factor(s) to be tested, with a maximum of 2 factors.", + "paramGroup": null, + "sourceDataset": "Metadata_Table", + "defaultValue": null, + "columnType": "STRING", + "isMulti": true + }, + { + "key": "Covariate_Columns", + "displayName": "Covariate Columns", + "description": "Include one or more columns containing factors to be used as covariates in either linear or mixed effects models. These columns are typically used to handle batch effects. This field can be left empty if no covariates are needed.", + "paramGroup": null, + "sourceDataset": "Metadata_Table", + "defaultValue": null, + "columnType": "ALL", + "isMulti": true + }, + { + "key": "Donor_Variable_Column", + "displayName": "Donor Variable Column", + "description": "When running a mixed effects model, the Donor variable (e.g., Patient from whom paired samples are derived) is treated as a random effect. This field can be left empty if not applicable.", + "paramGroup": null, + "sourceDataset": "Metadata_Table", + "defaultValue": null, + "columnType": "ALL", + "isMulti": true + } + ], + "condaDependencies": [], + "description": "Given a matrix (typically log-normalized gene expression) and a metadata table, this will run one- and two-factor statistical analyses on groups using linear or mixed effects models with limma. [Reference](https://rdrr.io/bioc/limma/man/ebayes.html). \n\n**There are 2 ways for treating Donor or Patient - one as a random effect and the other as a fixed effect**\n\n**When Using a Mixed Effects Model (Donor as random effect):**\n\n- Add Donor column to the Donor Variable Column\n- Do not add the Donor variable under Covariate Columns. It will be handled separately in the Donor Variable Column as a random effect.\n- The Covariate Columns field should include any other variables except the Donor.\n\n**When Using a Basic Linear Model (Donor as fixed effect):**\n\n- You can add the Donor column as a covariate under Covariate Columns, where it will be treated as a fixed effect.\n- Additional variables can be included under Covariate Columns\n- Ensure the Donor Variable Column is left blank.\n\n*This template is a Beta version and is undergoing active development. If you encounter problems, please contact CCBR* [NCICCBRNIDAP@mail.nih.gov](mailto:NCICCBRNIDAP@mail.nih.gov)", + "externalId": "Statistical_Analysis_using_Limma_CCBR_scRNA_seq_Bulk_Beta_", + "inputDatasets": [ + { + "key": "Dataset", + "displayName": "Dataset", + "description": "Dataset that contains gene expression counts for several samples", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + }, + { + "key": "Metadata_Table", + "displayName": "Metadata Table", + "description": "Metadata Table that contains information about the samples. The sample names need to be identical to the column names in the Dataset", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "Contrasts", + "displayName": "Contrasts", + "description": "Specify the group comparisons of interest.\n\t•\tFor 1 factor, enter the numerator followed by the denominator (e.g., Treatment-Control).\n\t•\tFor 2 factors, enter the comparisons separated by a dot (e.g., Treatment.Responder-Baseline.Responder).", + "paramType": "VECTOR", + "paramGroup": null, + "paramValues": null, + "defaultValue": "c()", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Summarization_Method", + "displayName": "Summarization Method", + "description": "For duplicate features, specify the method to summarize and remove duplicates. Use “max” for microarray data and “sum” for counts data.", + "paramType": "SELECT", + "paramGroup": null, + "paramValues": [ + "mean", + "max", + "sum" + ], + "defaultValue": "mean", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Return_Matrix", + "displayName": "Return Matrix", + "description": "Return original matrix along with the statistical results.", + "paramType": "BOOLEAN", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "TRUE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Fold_Change_Threshold", + "displayName": "Fold Change Threshold", + "description": "Used to determine the number of genes that are significantly upregulated or downregulated based on a fold change threshold. The default threshold is set at 1.2-fold.", + "paramType": "NUMBER", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "1.2", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "First_p_value_Threshold", + "displayName": "First p-value Threshold", + "description": "Used to determine the number of genes that are significantly up or downregulated using p-value threshold. Set at 0.05 by default.", + "paramType": "NUMBER", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "0.05", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Second_p_value_Treshold", + "displayName": "Second p-value Treshold", + "description": "Used to determine the number of genes that are significantly up or downregulated using a more stringent p-value threshold. Set at 0.01 by default.", + "paramType": "NUMBER", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "0.01", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Row_Number", + "displayName": "Row Number", + "description": "Specify the maximum number of rows to print per pivoted table.", + "paramType": "NUMBER", + "paramGroup": "Visualization", + "paramValues": null, + "defaultValue": "30", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Column_Number", + "displayName": "Column Number", + "description": "Specify the maximum number of columns to print per pivoted table.", + "paramType": "NUMBER", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "10", + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "Statistical Analysis using Limma [CCBR] [scRNA-seq] [Bulk] [Beta]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/inst/extdata/NIDAPjson/Subset_Seurat_Object_CCBR_scRNA_seq_.code-template.json b/inst/extdata/NIDAPjson/Subset_Seurat_Object_CCBR_scRNA_seq_.code-template.json new file mode 100644 index 0000000..07953a3 --- /dev/null +++ b/inst/extdata/NIDAPjson/Subset_Seurat_Object_CCBR_scRNA_seq_.code-template.json @@ -0,0 +1,304 @@ +{ + "codeTemplate": "Subsetted_SO <- function({{{Annotated_Merged_Seurat_Object}}}, {{{Metadata}}}, {{{Sample_Table}}}) {\n \n ## --------- ##\n ## Libraries ##\n ## --------- ##\n\n library(nidapFunctions)\n nidapLoadPackages(\"SCWorkflow\")\n library(cowplot)\n library(grid)\n library(gridExtra)\n library(scales)\n\n### GlobalCodeFix\nlibrary(\"Seurat\")\nlibrary(\"ggplot2\")\nlibrary(\"gridExtra\")\nlibrary(\"grid\")\nlibrary(\"gridBase\")\nlibrary(\"cowplot\")\nlibrary(\"RColorBrewer\")\nlibrary(\"colorspace\")\nlibrary(\"tidyverse\")\n\nlibrary(plotly)\n\n ## -------------------------------- ##\n ## User-Defined Template Parameters ##\n ## -------------------------------- ##\n\n seurat_object <- {{{Annotated_Merged_Seurat_Object}}}\n \n # Category parameters \n category_to_filter <- \"{{{Category_to_Filter}}}\"\n seed <- {{{Set_Seed}}}\n\n # Samples parameters\n samples_to_include <- '{{{Samples_to_Include}}}'\n sample_name <- \"{{{Sample_Name_Column}}}\"\n \n # Categorical Filtering parameters\n keep_or_remove <- {{{Keep_TRUE_or_Remove_FALSE_}}}\n values_to_filter <- {{{Values_to_Filter}}}\n\n # Greater than/Less than Filtering parameters\n greater_less_than <- \"{{{Greater_Less_Than}}}\"\n cut_off <- {{{Cut_Off}}}\n\n # Advanced parameters\n plot_as_interactive_plot <- {{{Plot_as_Interactive_Plot}}}\n use_cite_seq_data <- {{{Use_CITE_Seq_Data}}}\n \n # Legend parameters\n legend_position <- \"{{{Legend_Position}}}\"\n legend_symbol_size <- {{{Legend_Symbol_Size}}}\n number_of_legend_columns <- {{{Number_of_Legend_Columns}}}\n\n # Dot size and color parameters\n dot_size <- {{{Dot_Size}}}\n dot_size_highlighted_cells <- {{{Dot_Size_Highlighted_Cells_}}}\n colors <- {{{Colors}}}\n\n## reduction <- \"umap\"\n\n\n ##--------------- ##\n ## Error Messages ##\n ## -------------- ##\n \n \n ## --------- ##\n ## Functions ##\n ## --------- ##\n\n\n ## --------------- ##\n ## Main Code Block ##\n ## --------------- ##\n\n ## Load SO.\n cat(\"Reading Seurat Object from dataset: seurat_object.rds\\n\\n\")\n fs <- seurat_object$fileSystem()\n path <- fs$get_path(\"seurat_object.rds\", 'r')\n so <- readRDS(path)\n print(so)\n\n ## HOTFIX BEGINS\n ## NIDAPism here:\n samples = eval(parse(text=gsub('\\\\[\\\\]','c()',samples_to_include)))\n \n ## Function changes here:\n library(Seurat)\n if(\"orig.ident\" %in% colnames(so@meta.data)){\n Idents(so) <- so$orig.ident\n } else if (\"orig_ident\" %in% colnames(so@meta.data)){\n Idents(so) <- so$orig_ident\n } else {\n print(\"orig.ident or orig_ident not found\")\n }\n\n so <- subset(so, idents = samples)\n ## HOTFIX ENDS\n\n\n\nreduction <- \"umap\"\nresults_umap <- filterSeuratObjectByMetadata(object = so,\n samples.to.include = samples_to_include,\n sample.name = sample_name,\n category.to.filter = category_to_filter,\n values.to.filter = values_to_filter,\n keep.or.remove = keep_or_remove,\n greater.less.than = greater_less_than,\n seed = seed,\n cut.off = cut_off,\n legend.position = legend_position,\n reduction = reduction,\n plot.as.interactive.plot = plot_as_interactive_plot,\n legend.symbol.size = legend_symbol_size,\n colors = colors,\n dot.size = dot_size,\n number.of.legend.columns = number_of_legend_columns,\n dot.size.highlighted.cells = dot_size_highlighted_cells,\n use.cite.seq.data = use_cite_seq_data) \n\nreduction <- \"tsne\"\nresults_tsne <- filterSeuratObjectByMetadata(object = so,\n samples.to.include = samples_to_include,\n sample.name = sample_name,\n category.to.filter = category_to_filter,\n values.to.filter = values_to_filter,\n keep.or.remove = keep_or_remove,\n greater.less.than = greater_less_than,\n seed = seed,\n cut.off = cut_off,\n legend.position = legend_position,\n reduction = reduction,\n plot.as.interactive.plot = plot_as_interactive_plot,\n legend.symbol.size = legend_symbol_size,\n colors = colors,\n dot.size = dot_size,\n number.of.legend.columns = number_of_legend_columns,\n dot.size.highlighted.cells = dot_size_highlighted_cells,\n use.cite.seq.data = use_cite_seq_data) \n ## If interactive plot requested, then ...\n if (plot_as_interactive_plot == TRUE) {\n gp1 <- ggplotly(results$plot1)\n gp2 <- ggplotly(results$plot2)\n p <- subplot(gp1, gp2, nrows=2)\n print(p)\n } else {\n ## Else, print non-interactive plot.\n print(plot_grid(results_umap$plot1,results_umap$plot2,nrow=1))\n print(plot_grid(results_tsne$plot1,results_tsne$plot2,nrow=1))\n }\n \n ## Return the subsetted Seurat object.\n output <- new.output()\n output_fs <- output$fileSystem()\n saveRDS(results_umap$object, output_fs$get_path(\"seurat_object.rds\", 'w'))\n\n return(NULL)\n}\n\nfilterSeuratObjectByMetadata <- function(object,\n samples.to.include,\n sample.name,\n category.to.filter,\n values.to.filter,\n keep.or.remove = TRUE,\n greater.less.than = \"greater than\",\n seed = 10,\n cut.off = 0.5,\n legend.position = \"top\",\n reduction = \"umap\",\n plot.as.interactive.plot = FALSE,\n legend.symbol.size = 2,\n colors = c(\n \"aquamarine3\",\n \"salmon1\",\n \"lightskyblue3\",\n \"plum3\",\n \"darkolivegreen3\",\n \"goldenrod1\",\n \"burlywood2\",\n \"gray70\",\n \"firebrick2\",\n \"steelblue\",\n \"palegreen4\",\n \"orchid4\",\n \"darkorange1\",\n \"yellow\",\n \"sienna\",\n \"palevioletred1\",\n \"gray60\",\n \"cyan4\",\n \"darkorange3\",\n \"mediumpurple3\",\n \"violetred2\",\n \"olivedrab\",\n \"darkgoldenrod2\",\n \"darkgoldenrod\",\n \"gray40\",\n \"palegreen3\",\n \"thistle3\",\n \"khaki1\",\n \"deeppink2\",\n \"chocolate3\",\n \"paleturquoise3\",\n \"wheat1\",\n \"lightsteelblue\",\n \"salmon\",\n \"sandybrown\",\n \"darkolivegreen2\",\n \"thistle2\",\n \"gray85\",\n \"orchid3\",\n \"darkseagreen1\",\n \"lightgoldenrod1\",\n \"lightskyblue2\",\n \"dodgerblue3\",\n \"darkseagreen3\",\n \"forestgreen\",\n \"lightpink2\",\n \"mediumpurple4\",\n \"lightpink1\",\n \"thistle\",\n \"navajowhite\",\n \"lemonchiffon\",\n \"bisque2\",\n \"mistyrose\",\n \"gray95\",\n \"lightcyan3\",\n \"peachpuff2\",\n \"lightsteelblue2\",\n \"lightyellow2\",\n \"moccasin\",\n \"gray80\",\n \"antiquewhite2\",\n \"lightgrey\"\n ),\n dot.size = 0.1,\n number.of.legend.columns = 1,\n dot.size.highlighted.cells = 0.5,\n use.cite.seq.data = FALSE) {\n ## --------------- ##\n ## Parameters ##\n ## --------------- ##\n \n \n\n \n \n ## --------------- ##\n ## Functions ##\n ## --------------- ##\n \n # Drawing TSNE/UMAP/PCA plot\n .drawtsne <- function(SO, reduction, scale.col, col.grad) {\n SO.clus <- SO@meta.data[[category.to.filter]]\n \n plot1 <- DimPlot(SO, reduction = reduction, group.by = \"ident\")\n class(plot1$data$ident) <- \"numeric\"\n \n if (reduction == \"tsne\") {\n clusmat = data.frame(\n umap1 = plot1$data$tSNE_1,\n umap2 = plot1$data$tSNE_2,\n clusid = as.numeric(SO@meta.data[[category.to.filter]])\n )\n } else if (reduction == \"umap\") {\n clusmat = data.frame(\n umap1 = plot1$data$UMAP_1,\n umap2 = plot1$data$UMAP_2,\n clusid = as.numeric(SO@meta.data[[category.to.filter]])\n )\n } else if (reduction == \"pca\") {\n clusmat = data.frame(\n umap1 = plot1$data$PC_1,\n umap2 = plot1$data$PC_2,\n clusid = as.numeric(SO@meta.data[[category.to.filter]])\n )\n } else if (reduction == \"protein_tsne\") {\n clusmat = data.frame(\n umap1 = plot1$data$protein_tsne_1,\n umap2 = plot1$data$protein_tsne_2,\n clusid = as.numeric(SO@meta.data[[category.to.filter]])\n )\n } else if (reduction == \"protein_umap\") {\n clusmat = data.frame(\n umap1 = plot1$data$protein_umap_1,\n umap2 = plot1$data$protein_umap_2,\n clusid = as.numeric(SO@meta.data[[category.to.filter]])\n )\n } else {\n clusmat = data.frame(\n umap1 = plot1$data$protein_pca_1,\n umap2 = plot1$data$protein_pca_2,\n clusid = as.numeric(SO@meta.data[[category.to.filter]])\n )\n }\n \n # Preparing \n clusmat %>% group_by(clusid) %>% summarise(umap1.mean = mean(umap1),\n umap2.mean = mean(umap2)) -> umap.pos\n title = as.character(category.to.filter)\n clusmat %>% dplyr::arrange(clusid) -> clusmat\n \n plot2 <- ggplot(clusmat, aes(x = umap1, y = umap2)) +\n theme_bw() +\n theme(legend.title = element_blank()) +\n geom_point(\n aes(colour = clusid),\n alpha = 0.5,\n shape = 20,\n size = dot.size\n ) +\n scale_color_gradientn(colors = brewer.pal(n = 5, name = col.grad),\n values = scale.col) +\n guides(colour = guide_legend(override.aes = list(size = 5, alpha = 1))) +\n theme(\n panel.grid.major = element_blank(),\n panel.grid.minor = element_blank(),\n panel.background = element_blank()\n ) +\n ggtitle(title) +\n xlab(\"umap-1\") + ylab(\"umap-2\")\n return(plot2)\n }\n\n .distinctColorPalette <- function(k = 1, seed) {\n current.color.space <- our.color.space@coords\n # Set iter.max to 20 to avoid convergence warnings.\n set.seed(seed)\n km <- kmeans(current.color.space, k, iter.max = 20)\n colors <- unname(hex(LAB(km$centers)))\n return(colors)\n }\n ## --------------- ##\n ## Main Code Block ##\n ## --------------- ##\n \n # Checking if samples are selected\n samples = eval(parse(text = gsub('\\\\[\\\\]', 'c()', samples.to.include)))\n \n if (length(samples) == 0) {\n samples = unique(object@meta.data[[sample.name[1]]])\n }\n \n ## Replace dots in metadata column names with underscores.\n colnames(object@meta.data) = gsub(\"\\\\.\", \"_\", colnames(object@meta.data))\n new.sample.name <- gsub(\"\\\\.\", \"_\", sample.name[1])\n \n ## If you have protien data, then ...\n if (use.cite.seq.data) {\n reduction = paste(\"protein_\", reduction, sep = '')\n }\n \n \n ## Original color-picking code.\n rand.col <- 2e3\n set.seed(seed)\n our.color.space <- colorspace::RGB(runif(rand.col), runif(rand.col), runif(rand.col))\n our.color.space <- as(our.color.space, \"LAB\")\n \n \n ## User-selected metadata column is used to set idents.\n Filter.orig = object@meta.data[[category.to.filter[1]]]\n colname <- category.to.filter[1]\n \n ident.of.interest = as.factor(object@meta.data[[colname]])\n names(ident.of.interest) = names(object@active.ident)\n object@active.ident <- as.factor(vector())\n object@active.ident <- ident.of.interest\n \n ## Get colors from user parameter and add more if the default list is too short.\n if (class(object@meta.data[[category.to.filter[1]]]) != \"numeric\") {\n col.length = length(levels(as.factor(Filter.orig)))\n if (length(colors) < col.length) {\n more.cols = .distinctColorPalette(col.length - length(colors), 10)\n colors <- c(colors, more.cols)\n }\n names(colors) <- levels(as.factor(Filter.orig))\n \n ## Keep or remove cells based on user input values.\n if (keep.or.remove) {\n subset.value <- values.to.filter\n meta.col <- unique(object@meta.data[[category.to.filter[1]]])\n print(\"Missing values:\")\n print(setdiff(subset.value, meta.col))\n subset.value <- intersect(meta.col, subset.value)\n } else {\n meta.col <- unique(object@meta.data[[colname]])\n vals.to.remove <- values.to.filter\n subset.value <- setdiff(meta.col, vals.to.remove)\n }\n \n ## Subset Seurat object.\n SO.sub <- subset(object, idents = subset.value)\n \n ## Log output of tables of cell types by samples before and after filtes.\n print(\"Breakdown of filtered data:\")\n print(table(object@meta.data[[category.to.filter[1]]],\n object@meta.data[[new.sample.name]]))\n \n cat(\"\\n\")\n print(\"After Filtering:\")\n print(table(SO.sub@meta.data[[category.to.filter[1]]],\n SO.sub@meta.data[[new.sample.name]]))\n \n ## Set filter for the subsetted SO.\n SO.sub@meta.data[[colname]] <-\n as.factor(as.character(SO.sub@meta.data[[colname]])) #Relevel Factors\n \n filter.sub = SO.sub@meta.data[[colname]]\n \n #Set colors for unfiltered and filtered data by sample name:\n filt.length = length(levels(as.factor(filter.sub)))\n idx = vector(\"list\", filt.length)\n names(idx) <- levels(as.factor(filter.sub))\n for (i in 1:filt.length) {\n id = Filter.orig %in% levels(as.factor(filter.sub))[i]\n idx[[i]] <- rownames(object@meta.data)[id]\n }\n cols2 <- colors[levels(as.factor(filter.sub))]\n \n ## Make before and after plots.\n title <-\n paste0(\"filtered by \",\n category.to.filter[1]#,\n## \" and split by \",\n## category.to.filter[2]\n )\n plot1 = DimPlot(\n object,\n reduction = reduction,\n group.by = colname,\n pt.size = dot.size,\n raster=FALSE\n ) +\n theme_classic() +\n scale_color_manual(values = colors) +\n theme(legend.position = legend.position) +\n guides(colour = guide_legend(\n ncol = number.of.legend.columns,\n override.aes = list(size = legend.symbol.size)\n )) +\n ggtitle(colname)\n plot2 = DimPlot(\n object,\n reduction = reduction,\n cells.highlight = idx,\n cols.highlight = rev(cols2[1:filt.length]),\n sizes.highlight = dot.size.highlighted.cells,\n raster=FALSE\n ) +\n theme_classic() +\n theme(legend.position = legend.position) +\n guides(colour = guide_legend(\n ncol = number.of.legend.columns,\n reverse = TRUE,\n override.aes = list(size = legend.symbol.size)\n )) +\n ggtitle(title)\n \n ## Else, filter on numeric data with a user defined threshold and direction.\n } else {\n filter.direction <- greater.less.than\n meta.col <- unique(object@meta.data[[category.to.filter]])\n value <- cut.off\n if (filter.direction == \"greater than\") {\n SO.sub <- subset(object, subset = category.to.filter > cut.off)\n } else {\n SO.sub <- subset(object, subset = category.to.filter < cut.off)\n }\n \n \n clusid = object@meta.data[[category.to.filter]]\n maxclus = max(clusid)\n clusmid = 0.01 / maxclus\n min = min(clusid)\n midpt.1 = 0.99 * value\n midpt.0 = value\n midpt.2 = 1.01 * value\n max = max(clusid)\n col.points <- c(min, midpt.1, midpt.0, midpt.2, max)\n col.points <- scales::rescale(col.points, c(0, 1))\n \n \n \n plot1 <- .drawtsne(object, reduction, col.points, \"RdBu\")\n \n clusid = scales::rescale(SO.sub@meta.data[[category.to.filter]], to = c(0, 1))\n clus.quant = quantile(clusid[clusid > 0], probs = c(0, .25, .5, .75, 1))\n min = clus.quant[1]\n midpt.1 = clus.quant[3]\n midpt.3 = clus.quant[2]\n midpt.4 = clus.quant[4]\n max = clus.quant[5]\n col.points.2 <- c(min, midpt.3, midpt.1, midpt.4, max)\n \n plot2 <- .drawtsne(SO.sub, reduction, col.points.2, \"Blues\")\n \n }\n \n\n \n result.list <- list(\"object\" = SO.sub,\n \"plot1\" = plot1,\n \"plot2\" = plot2)\n return(result.list)\n}\n", + "columns": [ + { + "key": "Category_to_Filter", + "displayName": "Category to Filter", + "description": "Choose what kind of metadata you want to subset by. This should be one column in your Metadata table. The column selected will be used to filter your Seurat Object based on the values or thresholds you define below. Example: If you select \"Likely_CellType\", you will filter on the \"Likely_CellType\" category (e.g. \"Macrophages\").", + "paramGroup": "Category ", + "sourceDataset": "Metadata", + "defaultValue": null, + "columnType": "ALL", + "isMulti": false + }, + { + "key": "Samples_to_Include", + "displayName": "Samples to Include", + "description": "Please select which samples to include. You may \"+Add All\" to select all samples and then deselect those you do not want to analyze.", + "paramGroup": "Samples ", + "sourceDataset": "Sample_Table", + "defaultValue": null, + "columnType": "ALL", + "isMulti": true + }, + { + "key": "Sample_Name_Column", + "displayName": "Sample Name Column", + "description": "Sample Name Column", + "paramGroup": "Samples ", + "sourceDataset": "Metadata", + "defaultValue": null, + "columnType": "ALL", + "isMulti": null + } + ], + "condaDependencies": [], + "description": "This template subsets your Seurat object. Select a metadata column and values matching the cells to pass forward in your analysis. Final Potomac Compatible Version: v131. Final Sugarloaf V1: v145.", + "externalId": "Subset_Seurat_Object_CCBR_scRNA_seq_", + "inputDatasets": [ + { + "key": "Annotated_Merged_Seurat_Object", + "displayName": "Annotated Merged Seurat Object", + "description": "Select the dataset containing your SingleR annotated/merged seurat objet.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_TRANSFORM_INPUT", + "tags": [] + }, + { + "key": "Metadata", + "displayName": "Metadata", + "description": "Please input the dataset containing your samples' metadata. This should be the output of the template: [scRNA-Seq][CCBR] Get Metadata.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + }, + { + "key": "Sample_Table", + "displayName": "Sample Table", + "description": "Please select the dataset that contains your sample names. This should be the outputs from the Get Sample Names template.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [ + "ri.compass.main.tag.b39e053b-128a-49b6-996a-d867e2daa67d", + "ri.compass.main.tag.809bdb80-693d-4bf4-827e-d70c946ce2bc" + ] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "Set_Seed", + "displayName": "Set Seed", + "description": "Set seed for colors", + "paramType": "NUMBER", + "paramGroup": "Category ", + "paramValues": null, + "defaultValue": "10", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Keep_TRUE_or_Remove_FALSE_", + "displayName": "Keep (TRUE) or Remove (FALSE)", + "description": "Toggle TRUE to filter down to selected values, toggle FALSE to filter out selected values.", + "paramType": "BOOLEAN", + "paramGroup": "Categorical Filtering", + "paramValues": null, + "defaultValue": "TRUE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Values_to_Filter", + "displayName": "Values to Filter", + "description": "Select one or more values where you want to filter. For example, if you want Seurat cluster 1, type 1. If you want clusters 1,2 and 3, type 1,2,3", + "paramType": "VECTOR", + "paramGroup": "Categorical Filtering", + "paramValues": null, + "defaultValue": "c(\"0\",\"1\")", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Greater_Less_Than", + "displayName": "Greater/Less Than", + "description": "Decide if you want to keep cells above or below the threshold.", + "paramType": "SELECT", + "paramGroup": "Greater than/less than Filtering", + "paramValues": [ + "greater than", + "less than" + ], + "defaultValue": "greater than", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Cut_Off", + "displayName": "Cut-Off", + "description": "Determine the cut-off you want to use for your greater than/less than filter.", + "paramType": "NUMBER", + "paramGroup": "Greater than/less than Filtering", + "paramValues": null, + "defaultValue": "0.5", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Plot_as_Interactive_Plot", + "displayName": "Plot as Interactive Plot", + "description": "", + "paramType": "BOOLEAN", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Use_CITE_Seq_Data", + "displayName": "Use CITE-Seq Data", + "description": "", + "paramType": "BOOLEAN", + "paramGroup": "Advanced", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Legend_Position", + "displayName": "Legend Position", + "description": "Select \"none\" if legend takes up too much space in plot.", + "paramType": "SELECT", + "paramGroup": "Legend ", + "paramValues": [ + "top", + "right", + "bottom", + "left", + "none" + ], + "defaultValue": "right", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Legend_Symbol_Size", + "displayName": "Legend Symbol Size", + "description": "Legend Symbol", + "paramType": "NUMBER", + "paramGroup": "Legend ", + "paramValues": null, + "defaultValue": "2", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Number_of_Legend_Columns", + "displayName": "Number of Legend Columns", + "description": "If legend is too long, provide more legend columns", + "paramType": "NUMBER", + "paramGroup": "Legend ", + "paramValues": null, + "defaultValue": "1", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Dot_Size", + "displayName": "Dot Size", + "description": "Size of dots on TSNE/UMAP projection plot.", + "paramType": "NUMBER", + "paramGroup": "Dot size and color", + "paramValues": null, + "defaultValue": "0.1", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Dot_Size_Highlighted_Cells_", + "displayName": "Dot Size (Highlighted Cells)", + "description": "Dot size for cells in the after-filter plot which have been highlighted.", + "paramType": "NUMBER", + "paramGroup": "Dot size and color", + "paramValues": null, + "defaultValue": "0.5", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Colors", + "displayName": "Colors", + "description": "User-selected colors from palette of 62 unique colors from ColorBrewer. Additional colors beyond these 62 will be randomly added as needed.", + "paramType": "MULTISELECT", + "paramGroup": "Dot size and color", + "paramValues": [ + "aquamarine3", + "salmon1", + "lightskyblue3", + "plum3", + "darkolivegreen3", + "goldenrod1", + "burlywood2", + "gray70", + "firebrick2", + "steelblue", + "palegreen4", + "orchid4", + "darkorange1", + "yellow", + "sienna", + "palevioletred1", + "gray60", + "cyan4", + "darkorange3", + "mediumpurple3", + "violetred2", + "olivedrab", + "darkgoldenrod2", + "darkgoldenrod", + "gray40", + "palegreen3", + "thistle3", + "khaki1", + "deeppink2", + "chocolate3", + "paleturquoise3", + "wheat1", + "lightsteelblue", + "salmon", + "sandybrown", + "darkolivegreen2", + "thistle2", + "gray85", + "orchid3", + "darkseagreen1", + "lightgoldenrod1", + "lightskyblue2", + "dodgerblue3", + "darkseagreen3", + "forestgreen", + "lightpink2", + "mediumpurple4", + "lightpink1", + "thistle", + "navajowhite", + "lemonchiffon", + "bisque2", + "mistyrose", + "gray95", + "lightcyan3", + "peachpuff2", + "lightsteelblue2", + "lightyellow2", + "moccasin", + "antiquewhite2", + "gray80", + "lightgrey" + ], + "defaultValue": "c(\"aquamarine3\",\"salmon1\",\"lightskyblue3\",\"plum3\",\"darkolivegreen3\",\"goldenrod1\",\"burlywood2\",\"firebrick2\",\"steelblue\",\"palegreen4\",\"orchid4\",\"darkorange1\",\"yellow\",\"sienna\",\"palevioletred1\",\"cyan4\",\"darkorange3\",\"mediumpurple3\",\"violetred2\",\"olivedrab\",\"darkgoldenrod2\",\"darkgoldenrod\",\"palegreen3\",\"thistle3\",\"khaki1\",\"deeppink2\",\"chocolate3\",\"paleturquoise3\",\"wheat1\",\"lightsteelblue\",\"salmon\",\"sandybrown\",\"darkolivegreen2\",\"thistle2\",\"orchid3\",\"darkseagreen1\",\"lightgoldenrod1\",\"lightskyblue2\",\"dodgerblue3\",\"darkseagreen3\",\"forestgreen\",\"lightpink2\",\"mediumpurple4\",\"lightpink1\",\"thistle\",\"navajowhite\",\"lemonchiffon\",\"bisque2\",\"mistyrose\",\"lightcyan3\",\"peachpuff2\",\"lightsteelblue2\",\"lightyellow2\",\"moccasin\",\"antiquewhite2\")", + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "Subset Seurat Object [CCBR] [scRNA-seq]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/inst/extdata/NIDAPjson/Trajectory_Analysis_with_TSCAN_CCBR_scRNA_seq_Beta_.code-template.json b/inst/extdata/NIDAPjson/Trajectory_Analysis_with_TSCAN_CCBR_scRNA_seq_Beta_.code-template.json new file mode 100644 index 0000000..3f9477c --- /dev/null +++ b/inst/extdata/NIDAPjson/Trajectory_Analysis_with_TSCAN_CCBR_scRNA_seq_Beta_.code-template.json @@ -0,0 +1,56 @@ +{ + "codeTemplate": "Trajectory_CellTypes <- function({{{Seurat_Object}}},{{{MetaData}}}) {\n ## Trajectory analysis\n \n ## Basic Parameters:\n seurat_object = {{{Seurat_Object}}}\n UserFacing_MetaData = {{{MetaData}}}\n SelectedColumnName <- \"{{{Clusters_to_Use}}}\"\n ## Advanced Parameters:\n seurat_object_filename <- \"seurat_object.rds\"\n custom_gene_list <- \"{{{Custom_Gene_List}}}\"\n\n\n\n ## --------- ##\n ## Libraries ##\n ## --------- ##\n\n library(nidapFunctions)\n nidapLoadPackages(\"SCWorkflow\")\n\n library(Seurat)\n library(ggplot2)\n library(grid)\n library(gridExtra)\n\n library(scran)\n library(scater)\n library(TSCAN)\n library(mclust)\n #library(igraph)\n\n ## Modifying Custom Gene List:\n ## Replace commas with spaces and split the string\nsplit_values <- unlist(strsplit(gsub(\",\", \" \", custom_gene_list), \" \"))\ncustom_gene_list <- split_values[split_values != \"\"]\n\n ## Input SO.\n cat(\"Reading Seurat Object from dataset: seurat_object.rds\\n\\n\")\n path <- nidapGetPath(seurat_object,seurat_object_filename)\n so <- readRDS(path)\n\n## Workaround Dots and Underscores\nRealMetadata <- so@meta.data\nLABEL <- colnames(RealMetadata[match(SelectedColumnName,names(UserFacing_MetaData))-1])\n\n## Cleaning a gene List\nGeneList <- rownames(so@assays$RNA@counts)\nprint(\"The following genes were used:\")\nprint(intersect(custom_gene_list, GeneList)) \n\nprint(\"The following genes were not found:\")\nprint(setdiff(custom_gene_list, GeneList))\n\ncustom_gene_list <- intersect(custom_gene_list, GeneList)\n\n## Part I: Trajectory\n\nIdents(so) <- LABEL\ndimplot <- DimPlot(so)\nsce <- as.SingleCellExperiment(so)\ncolLabels(sce) <- colData(sce)[[LABEL]] \n\nby.cluster <- aggregateAcrossCells(sce, ids=colLabels(sce))\ncentroids <- reducedDim(by.cluster, \"PCA\")\n\n# Set clusters=NULL as we have already aggregated above.\nmst <- TSCAN::createClusterMST(centroids, clusters=NULL)\n\nline.data <- reportEdges(by.cluster, mst=mst, clusters=NULL, use.dimred=\"TSNE\")\nplot_tsne1 <- plotTSNE(sce, colour_by=\"label\") + geom_line(data=line.data, mapping=aes(x=tSNE_1, y=tSNE_2, group=edge))\n\n# Lets also try UMAP:\nline.data.umap <- reportEdges(by.cluster, mst=mst, clusters=NULL, use.dimred=\"UMAP\")\nplot_umap1 <- plotUMAP(sce, colour_by=\"label\") + geom_line(data=line.data.umap, mapping=aes(x=UMAP_1, y=UMAP_2, group=edge))\n\nmap.tscan <- mapCellsToEdges(sce, mst=mst, use.dimred=\"PCA\")\ntscan.pseudo <- orderCells(map.tscan, mst)\n##head(tscan.pseudo)\n\ncommon.pseudo <- averagePseudotime(tscan.pseudo) \n\nplot_tsne2 <- plotTSNE(sce, colour_by=I(common.pseudo), \n text_by=\"label\", text_colour=\"red\") +\n geom_line(data=line.data, mapping=aes(x=tSNE_1, y=tSNE_2, group=edge)) +\n ggtitle(\"TSCAN-based MST\")\n\nplot_umap2 <- plotUMAP(sce, colour_by=I(common.pseudo), \n text_by=\"label\", text_colour=\"red\") +\n geom_line(data=line.data.umap, mapping=aes(x=UMAP_1, y=UMAP_2, group=edge)) +\n ggtitle(\"TSCAN-based MST\")\n\n\n## Part II: Pseudotime\n\npseudo.all <- TSCAN::quickPseudotime(sce, use.dimred=\"PCA\")\n#head(pseudo.all$ordering)\n\n\npseudo.mnn <- TSCAN::quickPseudotime(sce, use.dimred=\"PCA\", with.mnn=TRUE)\nmnn.pseudo <- averagePseudotime(pseudo.mnn$ordering)\nplot_tsne3 <- plotTSNE(sce, colour_by=I(mnn.pseudo), text_by=\"label\", text_colour=\"red\") +\n geom_line(data=pseudo.mnn$connected$TSNE, mapping=aes(x=tSNE_1, y=tSNE_2, group=edge)) +\n ggtitle(\"TSCAN with MNN distances-based MST\")\nplot_umap3 <- plotUMAP(sce, colour_by=I(mnn.pseudo), text_by=\"label\", text_colour=\"red\") +\n geom_line(data=pseudo.mnn$connected$UMAP, mapping=aes(x=UMAP_1, y=UMAP_2, group=edge)) +\n ggtitle(\"TSCAN with MNN distances-based MST\")\n \n\n## Part III\n### From Chapter 10.3.2, Changes along a trajectory\nsce$Pseudotime <- pathStat(tscan.pseudo)[,1]\n#sce$TSCAN.first <- pathStat(tscan.pseudo)[,1]\n#sce$TSCAN.second <- pathStat(tscan.pseudo)[,2]\npseudo <- TSCAN::testPseudotime(sce, pseudotime=tscan.pseudo[,1])[[1]]\nsorted <- pseudo[order(pseudo$p.value),]\n\nup.left <- sorted[sorted$logFC < 0,]\nup.left$SYMBOL <- rownames(up.left)\nbest <- head(up.left$SYMBOL, 10)\n\nTopDecrease <- plotExpression(sce, features=best, x=\"Pseudotime\", colour_by=\"label\", ncol = 5) + ggtitle(\"Expression of the top 10 genes that decrease in expression with increasing pseudotime\")\n\nup.right <- sorted[sorted$logFC > 0,]\nup.right$SYMBOL <- rownames(up.right)\nbest <- head(up.right$SYMBOL, 10)\nTopIncrease <- plotExpression(sce, features=best, x=\"Pseudotime\", colour_by=\"label\", ncol = 5) + ggtitle(\"Expression of the top 10 genes that increase in expression with increasing pseudotime\")\n\n\non.first.path <- !is.na(sce$Pseudotime)\n\n\n## Printing Pretty Pics:\nprint(dimplot)\n\nset.seed(1)\nplot(pseudo.all$mst) \n\nprint(plot_tsne1)\ngrid.arrange(plot_tsne2, plot_tsne3, ncol = 2)\n\nprint(plot_umap1)\ngrid.arrange(plot_umap2, plot_umap3, ncol = 2)\n\nplot(TopDecrease)\nplot(TopIncrease)\nplotHeatmap(sce[,on.first.path], order_columns_by=\"Pseudotime\", colour_columns_by=\"label\", features=head(up.right$SYMBOL, 50), center=TRUE, main=\"Expression of the top 50 genes that increase in expression with increasing pseudotime\")\nplotHeatmap(sce[,on.first.path], order_columns_by=\"Pseudotime\", colour_columns_by=\"label\", features=head(up.left$SYMBOL, 50), center=TRUE, main=\"Expression of the top 50 genes that decrease in expression with increasing pseudotime\")\n\n\nif(length(custom_gene_list) > 0)\n {\n CustomScatter <- plotExpression(sce, features=custom_gene_list, x=\"Pseudotime\", colour_by=\"label\", ncol = 5) + \n ggtitle(\"Expression of genes with increasing pseudotime\")\n plot(CustomScatter)\n\n plotHeatmap(sce[,on.first.path],\n order_columns_by=\"Pseudotime\",\n colour_columns_by=\"label\",\n features=custom_gene_list,\n center=TRUE,\n main=\"Expression of genes with increasing pseudotime\")\n }\n\n\nreturn(NULL)\n\n}\n\n#################################################\n## Global imports and functions included below ##\n#################################################\n\n# R.cache depends on a home folder\nSys.setenv(R_USER_CACHE_DIR = Sys.glob(file.path(R.home())));", + "columns": [ + { + "key": "Clusters_to_Use", + "displayName": "Clusters to Use", + "description": "Please pick a column containing clustering information (such as \"SCT_snn_res.0.2\", for example) you want to be used in this analysis", + "paramGroup": null, + "sourceDataset": "MetaData", + "defaultValue": null, + "columnType": "ALL", + "isMulti": null + } + ], + "condaDependencies": [], + "description": "Application of TSCAN Trajectory Analysis method to preClustered Seurat Object.\n\n*This template is a Beta version and is undergoing active development. If you encounter problems, please contact CCBR* [NCICCBRNIDAP@mail.nih.gov](mailto:NCICCBRNIDAP@mail.nih.gov)", + "externalId": "Trajectory_Analysis_with_TSCAN_CCBR_scRNA_seq_Beta_", + "inputDatasets": [ + { + "key": "Seurat_Object", + "displayName": "Seurat Object", + "description": "Please select a Seurat Object (with clusters) to use as INPUT", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_TRANSFORM_INPUT", + "tags": [] + }, + { + "key": "MetaData", + "displayName": "MetaData", + "description": "Please choose a metadata table for your Seurat Object. Usually this is an output of \"Get Metadata\" template", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "Custom_Gene_List", + "displayName": "Custom Gene List", + "description": "If you want to create scatter plot and heatmap for your custom gene list, please provide your gene list here (comma-separated or space-separated)", + "paramType": "STRING", + "paramGroup": null, + "paramValues": null, + "defaultValue": null, + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "Trajectory Analysis with TSCAN [CCBR] [scRNA-seq] [Beta]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/inst/extdata/NIDAPjson/Violin_Plot_CCBR_scRNA_seq_.code-template.json b/inst/extdata/NIDAPjson/Violin_Plot_CCBR_scRNA_seq_.code-template.json new file mode 100644 index 0000000..0d0275f --- /dev/null +++ b/inst/extdata/NIDAPjson/Violin_Plot_CCBR_scRNA_seq_.code-template.json @@ -0,0 +1,146 @@ +{ + "codeTemplate": "ViolinPlot_CellTypes <- function({{{Seurat_Object}}},{{{Metadata}}}) {\n\n ## --------- ##\n ## Libraries ##\n ## --------- ##\n\n library(nidapFunctions)\n \n nidapLoadPackages(\"SCWorkflow\")\n\n ## -------------------------------- ##\n ## User-Defined Template Parameters ##\n ## -------------------------------- ##\n \n #Primary Inputs:\n seurat_object <- {{{Seurat_Object}}}\n\n #Plot Parameters:\n genes <- {{{Genes}}}\n group <- '{{{Categorical_Variable}}}'\n facet_on <- {{{Turn_on_Split_By}}}\n facet_var <- '{{{Split_By}}}'\n group_subset <- {{{Filter_By}}}\n jitter_points <- {{{Jitter_Points}}}\n jitter_dot_size <- 0.5\n\n #Data Type Parameters\n assay <- '{{{Assay}}}'\n slot <- '{{{Slot}}}'\n\n ##Filter and Normalization:\n #filter_outliers <- FALSE\n #scale_data <- TRUE\n #log_scale_data <- FALSE\n #outlier_low <- 0.1\n #outlier_high <- 0.9 \n\n #Filesave Parameters:\n seurat_object_filename <- \"{{{Seurat_Object_Filename}}}\"\n\n ## --------------- ##\n ## Main Code Block ##\n ## --------------- ##\n\n path <- nidapGetPath(seurat_object,seurat_object_filename)\n so <- readRDS(path)\n\n colnames(so@meta.data) <- gsub(\"\\\\.\",\"_\",colnames(so@meta.data))\n\n # Subset data (optional)\n if(!is.null(group_subset)){\n library(Seurat)\n \n Idents(so) <- so[[group]]\n so <- subset(so, idents = group_subset)\n }\n \n genes <- genes[genes %in% rownames(Seurat::GetAssayData(so, assay = assay, slot = slot))]\n\n for (indv_gene in genes){\n violins_res <- violinPlot(object = so, assay, slot, genes = indv_gene, group, facet_data = facet_on, facet_by = facet_var, jitter_points, jitter_dot_size)\n \n plot(violins_res$fig)\n }\n\nreturn(violins_res$stat)\n}\n\n\n#################################################\n## Global imports and functions included below ##\n#################################################\n\n# Functions defined here will be available to call in\n# the code for any table.\n\nviolinPlot <- function (object, assay, slot, genes, group, facet_data = FALSE, facet_by = \"\", jitter_points, jitter_dot_size) \n{\n library(Seurat)\n library(ggplot2)\n library(gridExtra)\n library(tidyr)\n library(dplyr)\n library(broom)\n\n if (!assay %in% Assays(object)) {\n stop(\"expression data type was not found in Seurat object\")\n } else if (!slot %in% slotNames(object[[assay]])) {\n stop(\"slot not found in Seurat[[assay]]\")\n } else if (all(!genes %in% rownames(object[[assay]]))) {\n stop(\"no genes were found in Seurat object\")\n } else if (!group %in% colnames(object@meta.data)) {\n stop(\"grouping parameter was not found in Seurat object\")\n } else if (!is.null(facet_by)) {\n if (!facet_by %in% colnames(object@meta.data)) {\n stop(\"facet parameter was not found in Seurat object\")\n }\n }\n\n # Scale to non-negative for visualization\n gene_mtx <- as.matrix(GetAssayData(object, assay = assay, slot = slot))\n #gene_mtx <- scales::rescale(gene_mtx, to = c(0,1))\n\n print(paste0(genes[!genes %in% rownames(gene_mtx)], \n \" not found and will not be displayed\"))\n\n genes.present <- genes[genes %in% rownames(gene_mtx)]\n\n meta_sub <- object@meta.data[,c(group,facet_by)]\n\n for (col in genes.present) {\n meta_sub[[col]] <- gene_mtx[col,]\n }\n\n data_df <- meta_sub %>% pivot_longer(genes.present, names_to = \"Gene\", values_to = \"Expression\")\n\n \n # set Gene as factor in data_df, so faceted plots will not be alphabetical \n data_df$Gene <- factor(data_df$Gene, levels = genes.present)\n\n unique_facets <- unique(object@meta.data[,facet_by])\n available_linetypes <- c(\"solid\", \"dashed\", \"dotted\", \"dotdash\", \"longdash\", \"twodash\")\n\n # If you have more unique values than available linetypes, this will recycle them\n linetype_mapping <- rep(available_linetypes, length.out = length(unique_facets))\n\n available_colors <- c(\"#E41A1C\", \"#377EB8\", \"#4DAF4A\", \"#984EA3\", \n \"#FF7F00\", \"#FFFF33\", \"#A65628\", \"#F781BF\", \"#999999\", \n \"#66C2A5\", \"#FC8D62\", \"#8DA0CB\", \"#E78AC3\", \n \"#A6D854\", \"#FFD92F\", \"#E5C494\", \"#B3B3B3\",\n \"#76B7B2\", \"#FF9D9A\", \"#B07AA1\", \"#D4A518\", \n \"#DE77AE\", \"#77AADD\", \"#EE8866\", \"#E4CDA7\")\n\n# Map the colors to the unique values\n# If there are more unique sets than available colors, this will recycle the colors\n color_mapping <- setNames(rep(available_colors, length.out = length(unique_facets)), unique_facets)\n\n# retrieve and remove groupings with counts of one, since that will misalign box-violin plots \ncount_df <- data_df %>% group_by(.data[[group]],.data[[facet_by]]) %>% count() %>% ungroup() %>% mutate(sample = paste0(.data[[group]],\"_\",.data[[facet_by]]))\n\nrm_samples <- count_df[count_df$n == 1,]$sample\n\ndata_df$sample <- paste0(data_df[[group]],\"_\",data_df[[facet_by]])\ndata_df <- data_df[!data_df$sample %in% rm_samples,]\n\n # Set up the common elements of the plot\ng <- ggplot(data_df, aes(x = .data[[group]], y = Expression, fill = .data[[facet_by]])) + \n geom_violin(scale = \"width\", position = position_dodge(width = 0.9), trim = TRUE) +\n geom_boxplot(width = 0.2, position = position_dodge(width = 0.9), outlier.shape = NA) +\n # scale_fill_brewer(palette = \"Set1\") + \n # scale_linetype_manual(values = linetype_mapping) + \n scale_fill_manual(values = color_mapping) +\n facet_wrap(~ Gene, scales = \"free_y\", ncol = 3, strip.position = \"left\") + \n theme_classic() + \n theme(legend.position = \"bottom\", \n axis.text.x = element_text(angle = 90, hjust = 1),\n strip.background = element_blank(),\n strip.text.x = element_text(size = 14, color = \"black\", face = \"bold\"),\n strip.text.y = element_text(size = 14, color = \"black\", face = \"bold\"),\n strip.placement = \"outside\")\n\n# Add jitter points conditionally\nif (jitter_points) {\n g <- g + geom_jitter(size = jitter_dot_size, shape = 1, position = position_dodge(width = 0.9), alpha = 0.5)\n}\n\n # Function to calculate p-values for a single gene within a cell type\ncalculate_p_values <- function(data, data_group, data_gene) {\n # Subset data for the specific cell type and gene\n data_sub <- data[data[,group] == data_group & data[,\"Gene\"] == data_gene,]\n \n # Perform ANOVA and Tukey HSD\n fit <- aov(as.formula(paste(\"Expression ~\", facet_by)), data = data_sub)\n tukey_result <- TukeyHSD(fit)\n \n # Tidy up the results and add metadata\n tidy_tukey_result <- tidy(tukey_result)\n tidy_tukey_result$gene <- data_gene\n tidy_tukey_result$group <- data_group\n \n return(tidy_tukey_result)\n}\n\n# List unique cell types\nunique_groups <- unique(data_df[[group]])\n\n# Filter out \nfacet_df <- table(data_df[[group]], data_df[[facet_by]])\n\n# Find rows with more than one non-zero column\ncount_non_zero <- function(row) {\n sum(row != 0)\n}\nnon_zero_counts <- apply(facet_df, 1, count_non_zero)\n\n# Use rownames whose values are in more than 1 column \nunique_groups <- names(non_zero_counts)[non_zero_counts > 1]\n\n# Calculate p-values for each cell type and gene\np_values_list <- list()\nfor (indv_group in unique_groups) {\n p_values_list[[indv_group]] <- do.call(rbind, lapply(genes.present, function(gene) calculate_p_values(data_df, data_group = indv_group, data_gene = gene)))\n}\n\n# Combine the results into a single data frame\np_values_df <- do.call(rbind, p_values_list)\n\n final_res <- list(fig = g, stat = p_values_df)\n\n return(final_res)\n}\n\n#install_bioconductor_package <- function(pkg) {\n# install.packages(paste0(\"https://gypsum.palantircloud.com/assets/dyn/bioconductor-packages/\", pkg, \".tar.gz\"), repos=NULL)\n#}\n", + "columns": [ + { + "key": "Categorical_Variable", + "displayName": "Categorical Variable", + "description": "Choose Metadata column to view on the x-axis of the violin plot.", + "paramGroup": "Plot", + "sourceDataset": "Metadata", + "defaultValue": null, + "columnType": "ALL", + "isMulti": null + }, + { + "key": "Split_By", + "displayName": "Split By", + "description": "Additional categorical variable to split your data by. For example, assume that you have a dataset with Treatment (A,B,C) and Replicates (rep1, rep2). If you originally have a violin plot of Gapdh expression across Treatment A, B, and C, and you want to split Treatment A, B, C by replicates, then the new violin plot x-axis will be A-rep1, A-rep2, B-rep1, B-rep2, etc.", + "paramGroup": "Plot", + "sourceDataset": "Metadata", + "defaultValue": null, + "columnType": "ALL", + "isMulti": null + } + ], + "condaDependencies": [], + "description": "Generates stacked violin plots for each unique entity in the metadata column you designate. One plot will be created for each gene marker you designate below. [View Documentation](https://nidap.nih.gov/workspace/notepad/view/ri.notepad.main.notepad.1d8e42b7-cdd8-4f0a-98c6-3c5c39a3bb29)\n", + "externalId": "Violin_Plot_CCBR_scRNA_seq_", + "inputDatasets": [ + { + "key": "Seurat_Object", + "displayName": "Seurat Object", + "description": "Select an input Seurat Object.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_TRANSFORM_INPUT", + "tags": [] + }, + { + "key": "Metadata", + "displayName": "Metadata", + "description": "Select the metadata table for the input Seurat Object.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "Genes", + "displayName": "Genes", + "description": "Genes to plot on the y-axis of the violin plot.", + "paramType": "VECTOR", + "paramGroup": "Plot", + "paramValues": null, + "defaultValue": "c()", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Turn_on_Split_By", + "displayName": "Turn on Split By", + "description": "Toggle to TRUE if you want to further split your x-axis variable.", + "paramType": "BOOLEAN", + "paramGroup": "Plot", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Filter_By", + "displayName": "Filter By", + "description": "Choose only specific categorical variables to plot.", + "paramType": "VECTOR", + "paramGroup": "Plot", + "paramValues": null, + "defaultValue": null, + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Jitter_Points", + "displayName": "Jitter Points", + "description": "Toggle to TRUE if you want overlay individual cells (dots) on the plot.", + "paramType": "BOOLEAN", + "paramGroup": "Plot", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Assay", + "displayName": "Assay", + "description": "Select between assays: SCT normalized, RNA, or Protein", + "paramType": "SELECT", + "paramGroup": "Data Type", + "paramValues": [ + "SCT", + "RNA", + "Protein", + "Spatial" + ], + "defaultValue": "Assay", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Slot", + "displayName": "Slot", + "description": "Select between slots: scale.data (residuals) or data (log-normalized).", + "paramType": "SELECT", + "paramGroup": "Data Type", + "paramValues": [ + "data", + "scale.data" + ], + "defaultValue": "Slot", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Seurat_Object_Filename", + "displayName": "Seurat Object Filename", + "description": "Name of RDS file containing Seurat Object. Default is seurat_object.rds", + "paramType": "STRING", + "paramGroup": "Filesave", + "paramValues": null, + "defaultValue": "seurat_object.rds", + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "Violin Plot [CCBR] [scRNA-seq]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/inst/extdata/NIDAPjson/Volcano_Plot_Enhanced_CCBR_scRNA_seq_Bulk_.code-template.json b/inst/extdata/NIDAPjson/Volcano_Plot_Enhanced_CCBR_scRNA_seq_Bulk_.code-template.json new file mode 100644 index 0000000..e5f62eb --- /dev/null +++ b/inst/extdata/NIDAPjson/Volcano_Plot_Enhanced_CCBR_scRNA_seq_Bulk_.code-template.json @@ -0,0 +1,310 @@ +{ + "codeTemplate": "VolcanoPlot <- function({{{DEG_Table}}}) {\n # image: png\n\n\n # Changelog\n # 2022-09-14 Rearranged structure and description\n # 2020-10-29 Add support for pval == 0\n\n\n\n ## --------- ##\n ## Libraries ##\n ## --------- ##\n\n library(stringr)\n library(ggplot2)\n library(ggrepel)\n library(dplyr)\n library(tidyr)\n\n library(EnhancedVolcano)\n # For interactive plot:\n library(plotly)\n library(grid)\n \n\n ## -------------------------------- ##\n ## User-Defined Template Parameters ##\n ## -------------------------------- ##\n\n #Basic Parameters:\n df.orig <- {{{DEG_Table}}}\n label.col <- \"{{{Column_with_Feature_ID}}}\"\n sig.col <- {{{Significance_Column}}}\n pCutoff = {{{P_Value_Threshold}}}\n lfc.col <- {{{Log2_Fold_Change_Column}}}\n FCcutoff = {{{Log2_Fold_Change_Threshold}}}\n \n \n #Label Parameters\n value_to_sort_the_output_dataset <- \"{{{Choose_Feature_to_Label_By}}}\"\n no_genes_to_label <- {{{Number_of_Features_to_Label}}}\n use_only_addition_labels <- {{{Label_Only_My_Feature_List}}}\n additional_labels <- \"{{{My_Feature_List}}}\"\n is_red <- {{{Top_Genes_Labeled_Only_If_Passing_Thresholds}}}\n labSize <- {{{Label_Size}}} \n\n\n #Title and Axis labels Parameters\n change_sig_name <- \"{{{Custom_Significance_Label}}}\"\n change_lfc_name <- \"{{{Custom_Log_Fold_Change_Label}}}\"\n title <- \"{{{Plot_Title}}}\"\n #subtitle <- \"\"\n use_custom_lab <- {{{Use_Custom_Axis_Label}}}\n \n #Plot Parameters\n ylim <- {{{Y_Limit}}}\n custom_xlim <- \"{{{Custom_X_axis_limits}}}\"\n xlim_additional <- {{{X_Limit_Padding}}}\n ylim_additional <- {{{Y_Limit_Padding}}}\n axisLabSize <- {{{Axis_Label_Size}}}\n pointSize <- {{{Point_Size}}}\n\n\n #Image Parameters\n imageWidth = {{{Image_Width}}}\n imageHeight = {{{Image_Height}}}\n dpi = {{{Resolution_DPI_}}}\n\n\n \n ##--------------- ##\n ## Error Messages ##\n ## -------------- ##\n\n ## --------------- ##\n ## Main Code Block ##\n ## --------------- ##\n\n rank <- list()\n for(i in 1:length(lfc.col)){\n lfccol <- lfc.col[i]\n sigcol <- sig.col[i]\n columns_of_interest <- c(label.col,lfc.col[i],sig.col[i])\n df <- df.orig %>% dplyr::select(one_of(columns_of_interest)) %>% \n mutate(!!sym(lfccol) := replace_na(!!sym(lfccol), 0)) %>%\n mutate(!!sym(sigcol) := replace_na(!!sym(sigcol), 1)) \n #mutate(.data[[lfc.col[i]]] = replace_na(.data[[lfc.col[i]]], 0)) %>%\n #mutate(.data[[sig.col[i]]] = replace_na(.data[[sig.col[i]]], 1)) \n if (use_custom_lab==TRUE){\n if (nchar(change_lfc_name)==0){lfc_name = lfc.col[i]}\n if (nchar(change_sig_name)==0){sig_name = sig.col[i]}\n colnames(df) <- c(label.col,change_lfc_name, sig_name)\n } else {\n lfc_name = lfc.col[i]\n sig_name = sig.col[i]\n }\n \n group <- gsub(\"_pval|p_val_\",\"\",sig_name)\n rank[[i]] <- -log10(df[[sig_name]]) * sign(df[[lfc_name]]) \n names(rank)[i] <- paste0(\"C_\",group,\"_rank\")\n \n cat(paste0(\"Genes in initial dataset: \", nrow(df),\"\\n\"))\n\n #Select top genes by logFC or Significance\n \n if (value_to_sort_the_output_dataset==\"fold-change\") {\n df <- df %>% dplyr::arrange(desc(.data[[lfc_name]]))\n } else if (value_to_sort_the_output_dataset==\"p-value\") {\n df <- df %>% dplyr::arrange(.data[[sig_name]]) \n }\n\n if (is_red) {\n df_sub <- df[df[[sigcol]] <= pCutoff & abs(df[[lfccol]]) >= FCcutoff, ]\n } else {\n df_sub <- df\n }\n\n genes_to_label <- as.character(df_sub[1:no_genes_to_label,label.col])\n# additional_labels <- unlist(str_split(additional_labels,\",\"))\n ## Modifying Additional Labels List:\n ## Replace commas with spaces and split the string\nsplit_values <- unlist(strsplit(gsub(\",\", \" \", additional_labels), \" \"))\nadditional_labels <- split_values[split_values != \"\"]\n\n filter <- additional_labels %in% df[,label.col]\n missing_labels <- additional_labels[!filter]\n additional_labels <- additional_labels[filter]\n\n if(length(missing_labels) > 0){\n cat(\"Could not find:\\n\")\n print(missing_labels)\n }\n\n if(use_only_addition_labels){\n genes_to_label <- additional_labels\n }else{\n genes_to_label <- unique(append(genes_to_label, additional_labels))\n }\n\n significant = vector(length = nrow(df))\n significant[] = \"Not significant\"\n significant[which(abs(df[,2]) > FCcutoff)] = \"Fold change only\"\n significant[which(df[,3] < pCutoff)] = \"Significant only\"\n significant[which(abs(df[,2]) > FCcutoff & df[,3] < pCutoff)] = \"Significant and fold change\"\n print(table(significant))\n \n # fix pvalue == 0\n shapeCustom <- rep(19,nrow(df))\n maxy <- max(-log10(df[[sig_name]]), na.rm=TRUE)\n if(ylim > 0){\n maxy <- ylim\n }\n \n cat(paste0(\"Maxy: \",maxy,\"\\n\"))\n if(maxy == Inf){\n # Sometimes, pvalues == 0\n keep <- df[[sig_name]] > 0\n df[[sig_name]][!keep] <- min(df[[sig_name]][keep])\n shapeCustom[!keep] <- 17\n\n maxy <- -log10(min(df[[sig_name]][keep]))\n cat(\"Some p-values equal zero. Adjusting y-limits.\\n\")\n cat(paste0(\"Maxy adjusted: \",maxy,\"\\n\"))\n\n }\n\n # By default, nothing will be greater than maxy. User can set this value lower\n keep <- -log10(df[[sig_name]]) <= maxy\n df[[sig_name]][!keep] <- maxy\n shapeCustom[!keep] <- 17\n\n names(shapeCustom)<- rep(\"Exact\",length(shapeCustom))\n names(shapeCustom)[shapeCustom == 17] <- \"Adjusted\"\n \n #Remove if nothin' doin'\n if(all(shapeCustom == 19)){\n shapeCustom <- NULL\n }\n \n maxy <- ceiling(maxy)\n\n if (grepl(\"log\",lfc.col[i]) ){\n xlab <- bquote(~Log[2]~ \"fold change\")\n } else {\n xlab <- \"Fold change\"\n }\n if (grepl(\"adj\",sig.col[i])){\n ylab <- bquote(~-Log[10]~ \"FDR\")\n } else {\n ylab <- bquote (~-Log[10]~ \"p-value\")\n }\n if(use_custom_lab){\n if(lfc_name != lfc.col[i]){\n xlab <- gsub(\"_\",\" \",lfc_name)\n }\n if (sig_name != sig.col[i]){ \n ylab <- gsub(\"_\",\" \",sig_name)\n }\n }\n \n## X-axis custom range change:\nif (custom_xlim == \"\") {\n xlim=c(floor(min(df[,lfc_name])) - xlim_additional,ceiling(max(df[,lfc_name]))+ xlim_additional)\n} else if (grepl(\",\", custom_xlim) == FALSE) {\n xlim=c(-1*as.numeric(trimws(custom_xlim)), as.numeric(trimws(custom_xlim)))\n} else {\n split_values <- strsplit(custom_xlim, \",\")[[1]]\n\n # Trim whitespace and convert to numeric values\n x_min <- as.numeric(trimws(split_values[1]))\n x_max <- as.numeric(trimws(split_values[2]))\n\n xlim <- c(x_min, x_max)\n}\n\n\n p <- EnhancedVolcano( df,x=lfc_name,y=sig_name,\n lab=df[,label.col],\n selectLab = genes_to_label,\n title=title, #CHANGE NW: See line 78\n subtitle <- group,\n xlab=xlab,\n ylab=ylab,\n xlim=xlim,\n ylim=c(0, maxy + ylim_additional),\n pCutoff=pCutoff,\n FCcutoff=FCcutoff,\n axisLabSize=axisLabSize,\n labSize=labSize,\n pointSize=pointSize,\n shapeCustom=shapeCustom\n )\n print(p) \n ## Adding interactive plot with no labels:\n p_empty <- EnhancedVolcano( df,x=lfc_name,y=sig_name,\n lab = rep(\"\", nrow(df)), # Setting labels to empty strings\n selectLab = NULL,\n title=title, #CHANGE NW: See line 78\n subtitle <- group,\n xlab=xlab,\n ylab=ylab,\n xlim=xlim,\n ylim=c(0, maxy + ylim_additional),\n pCutoff=pCutoff,\n FCcutoff=FCcutoff,\n axisLabSize=axisLabSize,\n labSize=labSize,\n pointSize=pointSize,\n shapeCustom=shapeCustom\n )\n## print(p_empty) \n\n# Extract the data used for plotting\nplot_data <- ggplot_build(p_empty)$data[[1]]\n\npxx <- p_empty +\n xlab(\"Fold Change\") + # Simplify x-axis label\n ylab(\"Significance\") + # Simplify y-axis label\n theme_minimal() +\n geom_point(aes(\n text = paste(\"Gene:\", df[[label.col]], \n \"
    Log2FC:\", df[[lfc_name]], \n \"
    P-value:\", df[[sig_name]]),\n colour = as.character(plot_data$colour),\n fill = as.character(plot_data$colour) # Set fill to the same as colour\n ), \n shape = 21, # Shape that supports both colour and fill\n size = 2, # Size of the points\n stroke = 0.1 # Stroke width\n ) + scale_fill_identity()\n\n# Add interactive hover labels for the gene names\ninteractive_plot <- ggplotly(pxx, tooltip = c(\"text\"))\n\n\n ## showing interactive plot\n grid.newpage()\n print(interactive_plot)\n grid.newpage()\n ## The end of addition\n \n }\n \n df.final <- cbind(df.orig, do.call(cbind, rank))\n return(df.final)\n}\n\n#################################################\n## Global imports and functions included below ##\n#################################################\n\n", + "columns": [ + { + "key": "Column_with_Feature_ID", + "displayName": "Column with Feature ID", + "description": "Column from the input DEG table containing Feature ID (such as Gene Names, Isoform IDs, UniProt IDs, and so on). This is usually the first column (named \"Feature_ID\" or \"Gene\"). Only Text type columns will be allowed.", + "paramGroup": "Basic", + "sourceDataset": "DEG_Table", + "defaultValue": null, + "columnType": "STRING", + "isMulti": null + }, + { + "key": "Significance_Column", + "displayName": "Significance Column", + "description": "Choose an unadjusted or adjusted p-value column from the input DEG table to use as the measure of significance in your Volcano plot. If your DEG analysis contained more than one contrast comparison, you will only be able to select one of these at a time. Make sure you select the same contrast that was selected for the \"Log2 Fold Change Column\" parameter.", + "paramGroup": "Basic", + "sourceDataset": "DEG_Table", + "defaultValue": null, + "columnType": "NUMBER", + "isMulti": true + }, + { + "key": "Log2_Fold_Change_Column", + "displayName": "Log2 Fold Change Column", + "description": "Choose a log2 fold change column from the input DEG table. If your DEG analysis contained more than one contrast comparison, you will only be able to select one of these at a time. Make sure you select the same contrast that was selected for the \"Significance Column\" parameter.", + "paramGroup": "Basic", + "sourceDataset": "DEG_Table", + "defaultValue": null, + "columnType": "NUMBER", + "isMulti": true + } + ], + "condaDependencies": [], + "description": "Implementation of Bioconductor's Enhanced Volcano Plot (v1.6.0, https://bioconductor.org/packages/release/bioc/html/EnhancedVolcano.html). Template written by Matthew Angel and maintained by CCBR. Final Potomac Compatible Version: v52. Final Sugarloaf V1 Version: v55. Latest Sugarloaf V2 Version: v67. [View Documentation](https://nidap.nih.gov/workspace/notepad/view/ri.notepad.main.notepad.8fe3cd6c-db24-4b0a-b717-060cb77ecc5e)", + "externalId": "Volcano_Plot_Enhanced_CCBR_scRNA_seq_Bulk_", + "inputDatasets": [ + { + "key": "DEG_Table", + "displayName": "DEG Table", + "description": "Dataset containing differential expression of genes (DEG) analysis output columns. Usually, this includes columns for gene names, (log) fold changes, (adjusted) p-values, and t-statistics. Other columns may be present.", + "paramGroup": null, + "anchorDataset": false, + "dataType": "R_NATIVE_DATAFRAME", + "tags": [] + } + ], + "vectorLanguage": "R", + "codeLanguage": "R", + "parameters": [ + { + "key": "P_Value_Threshold", + "displayName": "P-Value Threshold", + "description": "", + "paramType": "NUMBER", + "paramGroup": "Basic", + "paramValues": null, + "defaultValue": "0.001", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Log2_Fold_Change_Threshold", + "displayName": "Log2 Fold Change Threshold", + "description": "", + "paramType": "NUMBER", + "paramGroup": "Basic", + "paramValues": null, + "defaultValue": "1.0", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Choose_Feature_to_Label_By", + "displayName": "Choose Feature to Label By", + "description": "This selection determines how the feature (gene) list is sorted before choosing the top-N features as set by the \"Number of Features to Label\" parameter. Choose either (absolute) fold change, p-value, or t-statistic to label the top features by the selected metric. This also determines which features are labeled in the plot. This option is negated if only using custom labels.", + "paramType": "SELECT", + "paramGroup": "Label", + "paramValues": [ + "p-value", + "fold-change" + ], + "defaultValue": "p-value", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Number_of_Features_to_Label", + "displayName": "Number of Features to Label", + "description": "To minimize clutter on the volcano plot, it is inadvisable to label every feature (gene). You can choose to label any number of features or none. The value of this parameter (N) is used to label the top N features only. See the \"Choose Features To Label By\" parameter for options on how to sort the gene list before labeling the top N features. Will be negated if the option to use only additional labels is selected.", + "paramType": "NUMBER", + "paramGroup": "Label", + "paramValues": null, + "defaultValue": "30", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Label_Only_My_Feature_List", + "displayName": "Label Only My Feature List", + "description": "Select TRUE when you want to label ONLY a specific list of features given in the \"My Feature List\" parameter.", + "paramType": "BOOLEAN", + "paramGroup": "Label", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Use_Custom_Axis_Label", + "displayName": "Use Custom Axis Label", + "description": "Use text from \"Custom significance label\"?", + "paramType": "BOOLEAN", + "paramGroup": "Title and Axis labels", + "paramValues": null, + "defaultValue": "FALSE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "My_Feature_List", + "displayName": "My Feature List", + "description": "Additional features (genes) to label. If the option to use only custom labels is selected, these will be the only points labeled on the plot. Otherwise, these will be plotted in addition to the other top features. This should be a comma-separated or space-delimited list.", + "paramType": "STRING", + "paramGroup": "Label", + "paramValues": null, + "defaultValue": "", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Top_Genes_Labeled_Only_If_Passing_Thresholds", + "displayName": "Top Genes Labeled Only If Passing Thresholds", + "description": "If TRUE, only genes passing your p-value and logFC thresholds (Basic Parameters) will be labeled on the final plot. If FALSE, genes that do not pass thresholds may be labeled, also. Default is TRUE.", + "paramType": "BOOLEAN", + "paramGroup": "Label", + "paramValues": null, + "defaultValue": "TRUE", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Label_Size", + "displayName": "Label Size", + "description": "", + "paramType": "NUMBER", + "paramGroup": "Label", + "paramValues": null, + "defaultValue": "4", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Custom_Significance_Label", + "displayName": "Custom Significance Label", + "description": "This replaces bulky names for the p-value column.", + "paramType": "STRING", + "paramGroup": "Title and Axis labels", + "paramValues": null, + "defaultValue": "p-value", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Custom_Log_Fold_Change_Label", + "displayName": "Custom Log Fold Change Label", + "description": "This replaces bulky column names for the fold-change column.", + "paramType": "STRING", + "paramGroup": "Title and Axis labels", + "paramValues": null, + "defaultValue": "log2FC", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Plot_Title", + "displayName": "Plot Title", + "description": "", + "paramType": "STRING", + "paramGroup": "Title and Axis labels", + "paramValues": null, + "defaultValue": "Volcano Plots", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Y_Limit", + "displayName": "Y-Limit", + "description": "Maximum value for y-axis. Defaults to -log10(min(pval)). Set to 0 for automatic scaling.", + "paramType": "NUMBER", + "paramGroup": "Plot", + "paramValues": null, + "defaultValue": "0", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Custom_X_axis_limits", + "displayName": "Custom X-axis limits", + "description": "Leave empty for automatic scaling, put one number for symmetrical scale (i.e, putting \"5\" would result in a range from \"-5\" to \"5\"), or put two numbers separated by comma for \"asymmetrical\" scale (i.e, putting \"-2,4\" would result in a range from \"-2\" to \"4\")", + "paramType": "STRING", + "paramGroup": "Plot", + "paramValues": null, + "defaultValue": "", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "X_Limit_Padding", + "displayName": "X-Limit Padding", + "description": "Add additional units to x-limit", + "paramType": "NUMBER", + "paramGroup": "Plot", + "paramValues": null, + "defaultValue": "0", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Y_Limit_Padding", + "displayName": "Y-Limit Padding", + "description": "Adds additional units to y-limit.", + "paramType": "NUMBER", + "paramGroup": "Plot", + "paramValues": null, + "defaultValue": "0", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Axis_Label_Size", + "displayName": "Axis Label Size", + "description": "", + "paramType": "NUMBER", + "paramGroup": "Plot", + "paramValues": null, + "defaultValue": "24", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Point_Size", + "displayName": "Point Size", + "description": "", + "paramType": "NUMBER", + "paramGroup": "Plot", + "paramValues": null, + "defaultValue": "2", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Image_Width", + "displayName": "Image Width", + "description": "", + "paramType": "NUMBER", + "paramGroup": "Image", + "paramValues": null, + "defaultValue": "3000", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Image_Height", + "displayName": "Image Height", + "description": "", + "paramType": "NUMBER", + "paramGroup": "Image", + "paramValues": null, + "defaultValue": "3000", + "condition": null, + "content": null, + "objectPropertyReference": null + }, + { + "key": "Resolution_DPI_", + "displayName": "Resolution (DPI)", + "description": "", + "paramType": "NUMBER", + "paramGroup": "Image", + "paramValues": null, + "defaultValue": "300", + "condition": null, + "content": null, + "objectPropertyReference": null + } + ], + "title": "Volcano Plot - Enhanced [CCBR] [scRNA-seq] [Bulk]", + "templateApiVersion": "0.1.0" +} \ No newline at end of file diff --git a/man/colorByMarkerTable.Rd b/man/colorByMarkerTable.Rd index da335c0..2363e6b 100644 --- a/man/colorByMarkerTable.Rd +++ b/man/colorByMarkerTable.Rd @@ -8,10 +8,12 @@ colorByMarkerTable( object, samples.subset, samples.to.display, + manual.genes = c(), marker.table, cells.of.interest, protein.presence = FALSE, assay = "SCT", + slot = "scale.data", reduction.type = "umap", point.transparency = 0.5, point.shape = 16, diff --git a/man/combineNormalize.Rd b/man/combineNormalize.Rd index 3316f85..cebc1d5 100644 --- a/man/combineNormalize.Rd +++ b/man/combineNormalize.Rd @@ -24,7 +24,7 @@ combineNormalize( clust.res.low = 0.2, clust.res.high = 1.2, clust.res.bin = 0.2, - methods.pca = NULL, + methods.pca = "none", var.threshold = 0.1, pca.reg.plot = FALSE, jackstraw = FALSE, diff --git a/man/dotPlotMet.Rd b/man/dotPlotMet.Rd index 90bc1cf..ddafa78 100644 --- a/man/dotPlotMet.Rd +++ b/man/dotPlotMet.Rd @@ -9,7 +9,6 @@ dotPlotMet( metadata, cells, markers, - use_assay = "SCT", plot.reverse = FALSE, cell.reverse.sort = FALSE, dot.color = "darkblue" diff --git a/man/dualLabeling.Rd b/man/dualLabeling.Rd index 5e7eebc..b361cc0 100755 --- a/man/dualLabeling.Rd +++ b/man/dualLabeling.Rd @@ -48,7 +48,7 @@ dualLabeling( "protein","HTO" (default is "SCT")} \item{data.reduction}{Dimension Reduction method to use for image. Options -are umap, tsne, or both (default is "umap")} +are "umap" or "tsne" (default is "umap")} \item{point.size}{Point size for image (default is 0.5)} @@ -65,14 +65,6 @@ are umap, tsne, or both (default is "umap")} \item{filter.data}{Add new parameter column to metadata annotating where marker thresholds are applied (default is TRUE)} -\item{marker.1.filter.direction}{Annotate cells that have gene expression levels -for marker 1 using the marker 1 threshold. Choices are "greater than" -or "less than" (default is "greater than")} - -\item{marker.2.filter.direction}{Annotate cells that have gene expression levels -for marker 2 using the marker 2 threshold. Choices are "greater than" -or "less than" (default is "greater than")} - \item{apply.filter.1}{If TRUE, apply the first filter (default is TRUE)} \item{apply.filter.2}{If TRUE, apply the second filter (default is TRUE)} @@ -81,20 +73,31 @@ or "less than" (default is "greater than")} intersection. If FALSE, apply both filters and take the union.} \item{parameter.name}{Name for metadata column for new marker filters -(Default is "My_CoExp")} +(Default is "Marker")} \item{trim.marker.1}{Trim top and bottom percentile of marker 1 signal to pre-scale trim values (below) to remove extremely low and high values -(Default is FALSE)} +(Default is TRUE)} \item{trim.marker.2}{Trim top and bottom percentile of marker 2 signal to pre-scale trim values (below) to remove extremely low and high values -(Default is FALSE)} +(Default is TRUE)} \item{pre.scale.trim}{Set trimming percentile values (Defalut is 0.99)} \item{display.unscaled.values}{Set to TRUE if you want to view the unscaled gene/protein expression values (Default is FALSE)} + +\item{M1.filter.direction}{Annotate cells that have gene expression levels +for marker 1 using the marker 1 threshold. Choices are "greater than" +or "less than" (default is "greater than")} + +\item{M2.filter.direction}{Annotate cells that have gene expression levels +for marker 2 using the marker 2 threshold. Choices are "greater than" +or "less than" (default is "greater than")} + +\item{density.heatmap}{Creates a additional heatmap showing the density +distribution of cells. (Default is FALSE)} } \value{ a seurat object with optional additional metadata for cells that are diff --git a/man/filterQC.Rd b/man/filterQC.Rd index 5c9c0f9..9a486b5 100644 --- a/man/filterQC.Rd +++ b/man/filterQC.Rd @@ -12,7 +12,7 @@ filterQC( mad.nfeature.limits = c(5, 5), ncounts.limits = c(NA, NA), mad.ncounts.limits = c(5, 5), - mitoch.limits = c(NA, 8), + mitoch.limits = c(NA, 25), mad.mitoch.limits = c(NA, 3), complexity.limits = c(NA, NA), mad.complexity.limits = c(5, NA), @@ -20,23 +20,19 @@ filterQC( mad.topNgenes.limits = c(5, 5), n.topgnes = 20, do.doublets.fitler = T, - plot.outliers = "FALSE", + plot.outliers = "None", group.column = NA, nfeatures = 2000, - low_cut = 0.1, - high_cut = 8, - low_cut_disp = 1, - high_cut_disp = 1e+05, - selection_method = "vst", + low.cut = 0.1, + high.cut = 8, + low.cut.disp = 1, + high.cut.disp = 1e+05, + selection.method = "vst", npcs = 30, - integratedata = FALSE, - clust_res_low = 0.2, - clust_res_high = 1.2, - clust_res_bin = 0.2, - only_var_genes = FALSE, - seed_for_PCA = 42, - seed_for_TSNE = 1, - seed_for_UMAP = 42 + vars_to_regress = NULL, + seed.for.PCA = 42, + seed.for.TSNE = 1, + seed.for.UMAP = 42 ) } \arguments{ @@ -81,7 +77,7 @@ greater than the median. (Default: c(5,5))} exceed the selected lower or upper limits. Usage c(lower limit, Upper Limit). E.g. setting to c(0,8) will not set the lower limit and removes cells with more than 8\% mitochondrial RNA. -(Default: c(NA,8))} +(Default: c(NA,25))} \item{mad.mitoch.limits}{Set filter limits based on how many Median Absolute Deviations an outlier cell will have. Calculated from the Median percentage @@ -145,6 +141,6 @@ to evaluate data before and after filtering. \details{ This is Step 2 in the basic Single-Cell RNA-seq workflow. Multiple cell and gene filters can be selected to remove poor quality data and noise. -Returns data as a Seurat Object, and a variaty of figues to evaluate the -quality of data and the effect of applied filters. +Workflows can use this downstream of any Seurat Object. This tool is +typically the second step in the Single Cell Workflow. } diff --git a/man/modScore.Rd b/man/modScore.Rd index 28b7cc9..7fbddce 100644 --- a/man/modScore.Rd +++ b/man/modScore.Rd @@ -7,10 +7,11 @@ modScore( object, marker.table, - ms.threshold, - use_assay = "SCT", + use_columns, + ms_threshold, general.class, - lvl.vec = c(), + multi.lvl = FALSE, + lvl.df = NULL, reduction = "tsne", nbins = 10, gradient.ft.size = 6, @@ -21,11 +22,57 @@ modScore( \arguments{ \item{object}{Seurat-class object} -\item{marker.table}{Table of marker genes for each celltype -(column names of the table), append "_prot" or -"_neg" for proteins or negative markers} +\item{marker.table}{A table of lists of gene/protein markers for the +categories of cells you want to detect. +The table should be formatted with cell type(s) +as the column names, and marker(s) as the entries +in each column. +Requires SCT@data to be present within Seurat Object} -\item{general.class}{Base population of cells to classify} +\item{use_columns}{Select specific columns within Marker Table to analyze. +Markers from unselected columns won't be included.} + +\item{ms_threshold}{Allow user-specified module score thresholds. +Provide one threshold for each Celltype you included +in the "use_columns" parameter. +For each Celltype, provide the Celltype name, +then a space, then type your threshold for that Celltype. +This threshold must be a number between 0.0 and 1.0. +E.g. "Tcells 0.2", "Macrophages 0.37". +For best results, follow these steps: +(1) Set thresholds at 0.0 for a preliminary view of data. +(2) Use the resulting visualizations to estimate the +correct thresholds for each Celltype. +(3) Adjust your thresholds based on what you saw in the +visualizations. +(4) Re-run the template with the new thresholds. +(5) Review the visualizations again and +repeat Steps 1-5 if you think thresholds can be +further improved.} + +\item{general.class}{Select which of the classes (i.e. which columns) +in your Marker Table represent the General Classes. +A general class is any class that is not a subtype of +another class.} + +\item{multi.lvl}{set True if there are multiple subclasses of cells you +would like to classify. +Note: requires a manual entry table with columns specifying +levels and comparisons. Each column of this table should +represent one level of subclass within your General Classes. +Each value within a column should be two Class names +separated by a dash (-) showing the General-to-SubClass +relationship. +Example: To classify T-cells and then attempt to classify +those T-cells further into either CD8 or CD4 T-cells, +you would write a column named +"Level_1", then add "T_cell-CD8_T" and "T_cell-CD4_T" to +that column. Note that in this example, "T_cell" +is a General Class and "CD8_T" and "CD4_T" are not.} + +\item{lvl.df}{Dataframe containing levels information as well as +parent-children designation (E.g. Tcells-CD4). +Required if Multi Level Classification is turned on.#'} \item{reduction}{Choose among tsne, umap, and pca (Default: tsne)} @@ -40,22 +87,6 @@ density plot of ModuleScore distribution ModuleScore distribution (Default: 6)} \item{step.size}{Set step size of distribution plots (Default: 0.1)} - -\item{cite.seq}{Set to TRUE if there are CITE-seq markers in -marker.table (Default: FALSE)} - -\item{celltypes}{Vector of celltypes from marker.table to -screen for} - -\item{threshold}{Specify bimodal thresholds for cell classification, -should be of the same length as celltypes -vector} - -\item{multi.lvl}{Toggle to TRUE if there are subpopulations of cells -you want to screen for (Default: FALSE)} - -\item{lvl.df}{Table of subpopulation levels and parent-child -information (e.g. Tcells-CD4, Tcells-CD8)} } \value{ List containing annotated dimension plot with ModuleScore diff --git a/man/nameClusters.Rd b/man/nameClusters.Rd index dcc87be..7450146 100644 --- a/man/nameClusters.Rd +++ b/man/nameClusters.Rd @@ -7,6 +7,7 @@ provide plot with percentage of cell types} \usage{ nameClusters( object, + cluster.identities.table, cluster.numbers, cluster.names, cluster.column, diff --git a/man/processRawData.Rd b/man/processRawData.Rd index efaa7db..40b2bf0 100644 --- a/man/processRawData.Rd +++ b/man/processRawData.Rd @@ -14,11 +14,12 @@ processRawData( file.filter.regex = c(), split.h5 = F, cell.hash = F, + tcr.summarize.topN = 10, do.normalize.data = T ) } \arguments{ -\item{input}{Input can be a vector of scRNA-Seq .h5 files, or a list of +\item{input}{Input can be a vector of .h5 files, or a list of seurat objects for each sample. TCRseq Metadata .csv files can also be included and will be added to the corrisponding sample seurat object. Vector of files should include entire file path.} @@ -42,13 +43,18 @@ If FALSE, remove files when pattern is found in sample name. The pattern is set in the file.filter.regex parameter (below).} \item{file.filter.regex}{Pattern or regular expression in sample -name. Use the 'keep' parameter to keep or remove files that contain pattern. +name. Use the 'keep' parameter to keep or remove fi +les that contain pattern. If samples have been renamed set regular expression based on new names} \item{split.h5}{If TRUE, split H5 into individual files. (Default: FALSE)} \item{cell.hash}{If TRUE, dataset contains cell hashtags. (Default: FALSE)} +\item{tcr.summarize.topN}{Select number of top most identified TCR clonotypes +to be included in summary column. Any clonotypes below the top N most +populated will be classified as "Other". (Default: 10)} + \item{do.normalize.data}{If TRUE counts table will be log2 normalized. If input contains counts that are already normalzed set to FALSE. (Default: TRUE)} @@ -57,9 +63,8 @@ input contains counts that are already normalzed set to FALSE. Seurat Object and QC plots } \description{ -Creates Seurat Objects from h5 files for individual or -merged samples. Will log normalize and produce QC figures for -individual samples +Creates a list of Seurat Objects from h5 files. Will log +normalize and produce QC figures for individual samples } \details{ This is Step 1 in the basic Single-Cell RNA-seq workflow. diff --git a/tests/testthat/Rplots.pdf b/tests/testthat/Rplots.pdf new file mode 100644 index 0000000..d6617d5 Binary files /dev/null and b/tests/testthat/Rplots.pdf differ diff --git a/tests/testthat/_snaps/Filter_QC/Chariou_Standard.rds b/tests/testthat/_snaps/Filter_QC/Chariou_Standard.rds index 5d6d885..1a99c3a 100644 Binary files a/tests/testthat/_snaps/Filter_QC/Chariou_Standard.rds and b/tests/testthat/_snaps/Filter_QC/Chariou_Standard.rds differ diff --git a/tests/testthat/_snaps/Filter_QC/Chariou_filter.vdj.genes.rds b/tests/testthat/_snaps/Filter_QC/Chariou_filter.vdj.genes.rds new file mode 100644 index 0000000..1a99c3a Binary files /dev/null and b/tests/testthat/_snaps/Filter_QC/Chariou_filter.vdj.genes.rds differ diff --git a/tests/testthat/_snaps/Filter_QC/NSCLC_Multi_Standard.rds b/tests/testthat/_snaps/Filter_QC/NSCLC_Multi_Standard.rds index d3fd8c1..75c1589 100644 Binary files a/tests/testthat/_snaps/Filter_QC/NSCLC_Multi_Standard.rds and b/tests/testthat/_snaps/Filter_QC/NSCLC_Multi_Standard.rds differ diff --git a/tests/testthat/_snaps/Filter_QC/PBMC_Single_Standard.rds b/tests/testthat/_snaps/Filter_QC/PBMC_Single_Standard.rds index d6ead2d..d8166d0 100644 Binary files a/tests/testthat/_snaps/Filter_QC/PBMC_Single_Standard.rds and b/tests/testthat/_snaps/Filter_QC/PBMC_Single_Standard.rds differ diff --git a/tests/testthat/_snaps/Filter_QC/TEC_Standard.rds b/tests/testthat/_snaps/Filter_QC/TEC_Standard.rds index 9fea9a8..27f191c 100644 Binary files a/tests/testthat/_snaps/Filter_QC/TEC_Standard.rds and b/tests/testthat/_snaps/Filter_QC/TEC_Standard.rds differ diff --git a/tests/testthat/_snaps/Filter_QC/TEC_filter.vdj.genes.rds b/tests/testthat/_snaps/Filter_QC/TEC_filter.vdj.genes.rds deleted file mode 100644 index 9fea9a8..0000000 Binary files a/tests/testthat/_snaps/Filter_QC/TEC_filter.vdj.genes.rds and /dev/null differ diff --git a/tests/testthat/fixtures/Chariou/h5files/SCAF1713_1_1_filtered_contig_annotations.csv b/tests/testthat/fixtures/Chariou/h5files/SCAF1713_1_1_filtered_contig_annotations.csv new file mode 100644 index 0000000..fc84fc7 --- /dev/null +++ b/tests/testthat/fixtures/Chariou/h5files/SCAF1713_1_1_filtered_contig_annotations.csv @@ -0,0 +1,235 @@ +barcode,is_cell,contig_id,high_confidence,length,chain,v_gene,d_gene,j_gene,c_gene,full_length,productive,cdr3,cdr3_nt,reads,umis,raw_clonotype_id,raw_consensus_id +AAAGATGTCACCTTAT-1,True,AAAGATGTCACCTTAT-1_contig_1,True,545,TRB,TRBV29,None,TRBJ2-1,TRBC2,True,True,CASSFGRTNYAEQFF,TGTGCTAGCAGTTTCGGACGGACTAACTATGCTGAGCAGTTCTTC,50816,10,clonotype2,clonotype2_consensus_2 +AAAGATGTCACCTTAT-1,True,AAAGATGTCACCTTAT-1_contig_2,True,498,TRA,TRAV1,None,TRAJ30,TRAC,True,True,CAVRAPTNAYKVIF,TGTGCTGTGAGGGCCCCCACAAATGCTTACAAAGTCATCTTT,20474,7,clonotype2,clonotype2_consensus_1 +AAAGTAGGTATCGCAT-1,True,AAAGTAGGTATCGCAT-1_contig_1,True,721,TRB,TRBV19,TRBD1,TRBJ2-2,TRBC2,True,True,CASSRGTGGSGQLYF,TGTGCCAGCAGCCGCGGGACAGGGGGCTCCGGGCAGCTCTACTTT,36634,13,clonotype3,clonotype3_consensus_2 +AAAGTAGGTATCGCAT-1,True,AAAGTAGGTATCGCAT-1_contig_2,True,606,TRA,TRAV14D-3-DV8,None,TRAJ53,TRAC,True,True,CAARNSGGSNYKLTF,TGTGCAGCAAGGAACAGTGGAGGCAGCAATTACAAACTGACATTT,3906,4,clonotype3,clonotype3_consensus_1 +AAAGTAGGTATCGCAT-1,True,AAAGTAGGTATCGCAT-1_contig_3,True,512,TRB,None,None,TRBJ1-2,TRBC1,False,False,None,None,22936,4,clonotype3,None +AAAGTAGGTATCGCAT-1,True,AAAGTAGGTATCGCAT-1_contig_4,True,303,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,12480,2,clonotype3,None +AAATGCCAGTAGCGGT-1,True,AAATGCCAGTAGCGGT-1_contig_1,True,597,TRA,TRAV7-4,None,TRAJ26,TRAC,True,True,CAASDLNNYAQGLTF,TGTGCAGCTAGTGATTTAAATAACTATGCCCAGGGATTAACCTTC,21054,4,clonotype4,clonotype4_consensus_2 +AAATGCCAGTAGCGGT-1,True,AAATGCCAGTAGCGGT-1_contig_2,True,570,TRB,TRBV12-2+TRBV13-2,None,TRBJ1-4,TRBC1,True,True,CASGDQGGSNERLFF,TGTGCCAGCGGTGACCAGGGTGGGTCCAACGAAAGATTATTTTTC,57128,10,clonotype4,clonotype4_consensus_1 +AACCGCGTCCAACCAA-1,True,AACCGCGTCCAACCAA-1_contig_1,True,499,TRA,TRAV6-5,None,TRAJ17,TRAC,True,True,CALSGHSAGNKLTF,TGTGCTCTGAGTGGACACAGTGCAGGGAACAAGCTAACTTTT,27610,2,clonotype5,clonotype5_consensus_1 +AACCGCGTCCAACCAA-1,True,AACCGCGTCCAACCAA-1_contig_2,True,589,TRA,TRAV7-4,None,TRAJ43,TRAC,True,False,None,None,16652,4,clonotype5,None +AACTGGTCAAGCGTAG-1,True,AACTGGTCAAGCGTAG-1_contig_1,True,562,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-5,TRBC2,True,True,CASGDEWVQDTQYF,TGTGCCAGCGGTGATGAGTGGGTCCAAGACACCCAGTACTTT,61644,6,clonotype6,clonotype6_consensus_2 +AACTGGTCAAGCGTAG-1,True,AACTGGTCAAGCGTAG-1_contig_2,True,528,TRA,TRAV7D-2,None,TRAJ21,TRAC,True,True,CAASRGYNVLYF,TGTGCAGCAAGCAGAGGATACAACGTGCTTTACTTC,16798,2,clonotype6,clonotype6_consensus_1 +AAGGAGCGTTGCTCCT-1,True,AAGGAGCGTTGCTCCT-1_contig_1,True,514,TRB,TRBV14,None,TRBJ2-7,TRBC2,True,True,CASRQTGYEQYF,TGTGCCAGCAGACAGACAGGCTATGAACAGTACTTC,60078,7,clonotype7,clonotype7_consensus_2 +AAGGAGCGTTGCTCCT-1,True,AAGGAGCGTTGCTCCT-1_contig_2,True,538,TRA,TRAV8D-1,None,TRAJ44,TRAC,True,True,CATGSGGKLTL,TGTGCTACTGGCAGTGGTGGAAAACTCACTTTG,7086,2,clonotype7,clonotype7_consensus_1 +AAGTCTGAGTGGTAGC-1,True,AAGTCTGAGTGGTAGC-1_contig_1,True,530,TRA,TRAV16N,None,TRAJ45,TRAC,True,True,CAMREANTGGADRLTF,TGTGCTATGAGAGAGGCTAATACAGGAGGTGCAGATAGACTCACCTTT,818,5,clonotype8,clonotype8_consensus_1 +AAGTCTGAGTGGTAGC-1,True,AAGTCTGAGTGGTAGC-1_contig_2,True,645,TRB,TRBV2,None,TRBJ1-6,TRBC1,True,True,CASSQDGGYNSPLYF,TGTGCCAGCAGCCAAGATGGGGGCTATAATTCGCCCCTCTACTTT,440,6,clonotype8,clonotype8_consensus_2 +AAGTCTGAGTGGTAGC-1,True,AAGTCTGAGTGGTAGC-1_contig_3,True,328,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,3136,11,clonotype8,None +ACACTGAAGTTCGCAT-1,True,ACACTGAAGTTCGCAT-1_contig_1,True,713,TRA,TRAV9N-4,None,TRAJ15,TRAC,True,True,CAVSAYQGGRALIF,TGTGCTGTGAGCGCGTACCAGGGAGGCAGAGCTCTGATATTT,38776,3,clonotype9,clonotype9_consensus_1 +ACACTGAAGTTCGCAT-1,True,ACACTGAAGTTCGCAT-1_contig_2,True,558,TRB,TRBV20,None,TRBJ1-2,TRBC1,True,True,CGAKQTNSDYTF,TGTGGTGCTAAACAAACAAACTCCGACTACACCTTC,38630,3,clonotype9,clonotype9_consensus_2 +ACAGCCGCAGACAGGT-1,True,ACAGCCGCAGACAGGT-1_contig_1,True,560,TRB,TRBV20,TRBD1,TRBJ1-2,TRBC1,True,True,CGVGTGGANSDYTF,TGTGGTGTCGGGACAGGGGGCGCGAACTCCGACTACACCTTC,516,11,clonotype10,clonotype10_consensus_1 +ACATCAGAGAGGGATA-1,True,ACATCAGAGAGGGATA-1_contig_1,True,571,TRB,TRBV1,None,TRBJ2-5,TRBC2,True,True,CTCSARDRVKDTQYF,TGCACCTGCAGTGCCCGGGACAGGGTTAAAGACACCCAGTACTTT,43510,8,clonotype11,clonotype11_consensus_1 +ACATCAGAGAGGGATA-1,True,ACATCAGAGAGGGATA-1_contig_2,True,422,TRA,None,None,TRAJ32,TRAC,False,False,None,None,6166,1,clonotype11,None +ACATCAGAGAGGGATA-1,True,ACATCAGAGAGGGATA-1_contig_3,True,574,Multi,TRDV1,None,TRAJ50,TRAC,True,False,CGGKAFASSSFSKLVF,TGTGGAGGGAAAGCTTTCGCATCCTCCTCCTTCAGCAAGCTGGTGTTT,25906,8,clonotype11,None +ACCTTTAAGCTGAAAT-1,True,ACCTTTAAGCTGAAAT-1_contig_1,True,557,TRA,TRAV6-2,None,TRAJ9,TRAC,True,True,CVRGNMGYKLTF,TGTGTTAGAGGGAACATGGGCTACAAACTTACCTTC,1040,8,clonotype12,clonotype12_consensus_2 +ACCTTTAAGCTGAAAT-1,True,ACCTTTAAGCTGAAAT-1_contig_2,True,701,TRB,TRBV19,None,TRBJ2-1,TRBC2,True,True,CASRDRSYNYAEQFF,TGTGCCAGCAGGGACAGGTCCTATAACTATGCTGAGCAGTTCTTC,1798,12,clonotype12,clonotype12_consensus_3 +ACCTTTAAGCTGAAAT-1,True,ACCTTTAAGCTGAAAT-1_contig_3,True,570,TRA,TRAV2,None,TRAJ15,TRAC,True,True,CIVTVPYQGGRALIF,TGCATTGTGACTGTCCCCTACCAGGGAGGCAGAGCTCTGATATTT,538,7,clonotype12,clonotype12_consensus_1 +ACCTTTAAGCTGAAAT-1,True,ACCTTTAAGCTGAAAT-1_contig_4,True,506,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,1846,13,clonotype12,None +ACGCCGATCCTTTCGG-1,True,ACGCCGATCCTTTCGG-1_contig_1,True,556,TRA,TRAV4-3,None,TRAJ21,TRAC,True,True,CAAERPNYNVLYF,TGTGCTGCTGAGAGGCCTAATTACAACGTGCTTTACTTC,21204,9,clonotype13,clonotype13_consensus_2 +ACGCCGATCCTTTCGG-1,True,ACGCCGATCCTTTCGG-1_contig_2,True,494,TRB,TRBV31,None,TRBJ2-4,TRBC2,True,True,CAWRRTGGDQNTLYF,TGTGCCTGGAGAAGGACAGGGGGCGATCAAAACACCTTGTACTTT,23502,6,clonotype13,clonotype13_consensus_1 +ACGCCGATCCTTTCGG-1,True,ACGCCGATCCTTTCGG-1_contig_3,True,635,TRB,None,None,TRBJ1-1,TRBC1,False,False,None,None,18264,5,clonotype13,None +ACGCCGATCCTTTCGG-1,True,ACGCCGATCCTTTCGG-1_contig_4,True,356,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,16144,5,clonotype13,None +AGGCCACGTTACGCGC-1,True,AGGCCACGTTACGCGC-1_contig_1,True,555,TRB,TRBV16,None,TRBJ2-7,TRBC2,True,True,CASSFRDWGASYEQYF,TGTGCAAGCAGCTTCCGGGACTGGGGGGCCTCCTATGAACAGTACTTC,31338,9,clonotype1,clonotype1_consensus_1 +AGGCCACGTTACGCGC-1,True,AGGCCACGTTACGCGC-1_contig_2,True,665,TRA,TRAV14D-1,None,TRAJ48,TRAC,True,True,CAASNYGNEKITF,TGTGCAGCAAGTAACTATGGAAATGAGAAAATAACTTTT,28520,7,clonotype1,clonotype1_consensus_2 +AGGCCACGTTACGCGC-1,True,AGGCCACGTTACGCGC-1_contig_3,True,413,TRA,None,None,TRAJ26,TRAC,False,False,None,None,14590,3,clonotype1,None +AGGGATGCAATTCCTT-1,True,AGGGATGCAATTCCTT-1_contig_1,True,505,TRB,TRBV13-1,None,TRBJ2-5,TRBC2,True,True,CASRGQKDTQYF,TGTGCCAGCAGGGGACAGAAAGACACCCAGTACTTT,69062,17,clonotype14,clonotype14_consensus_1 +AGTGAGGTCATCATTC-1,True,AGTGAGGTCATCATTC-1_contig_1,True,721,TRB,TRBV19,None,TRBJ1-4,TRBC1,True,True,CASSIAPVSNERLFF,TGTGCCAGCAGTATAGCTCCAGTTTCCAACGAAAGATTATTTTTC,3760,22,clonotype15,clonotype15_consensus_1 +AGTGAGGTCATCATTC-1,True,AGTGAGGTCATCATTC-1_contig_2,True,488,TRB,TRBV31,None,TRBJ1-6,TRBC1,True,False,None,None,2546,11,clonotype15,None +AGTGAGGTCATCATTC-1,True,AGTGAGGTCATCATTC-1_contig_3,True,365,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,12828,42,clonotype15,None +ATAGACCGTTAAAGTG-1,True,ATAGACCGTTAAAGTG-1_contig_1,True,523,TRB,TRBV31,None,TRBJ2-7,TRBC2,True,True,CAWSIPRQGAWEQYF,TGTGCCTGGAGCATTCCTCGACAGGGGGCGTGGGAACAGTACTTC,66062,5,clonotype16,clonotype16_consensus_2 +ATAGACCGTTAAAGTG-1,True,ATAGACCGTTAAAGTG-1_contig_2,True,623,TRA,TRAV12-3,None,TRAJ32,TRAC,True,True,CALSYYGGSGNKLIF,TGTGCTTTGAGTTATTATGGGGGCAGTGGCAACAAGCTCATCTTT,10612,2,clonotype16,clonotype16_consensus_1 +ATCACGACATAACCTG-1,True,ATCACGACATAACCTG-1_contig_1,True,571,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-5,TRBC2,True,True,CASGDDRGGTQYF,TGTGCCAGCGGTGATGACAGGGGAGGCACCCAGTACTTT,36714,4,clonotype17,clonotype17_consensus_2 +ATCACGACATAACCTG-1,True,ATCACGACATAACCTG-1_contig_2,True,571,TRA,TRAV13-1,None,TRAJ31,TRAC,True,True,CAMNNNNRIFF,TGTGCTATGAATAACAATAACAGAATCTTCTTT,10690,2,clonotype17,clonotype17_consensus_1 +ATCACGACATAACCTG-1,True,ATCACGACATAACCTG-1_contig_3,True,651,TRA,TRAV7-1,None,TRAJ21,TRAC,True,True,CAVSMMPNYNVLYF,TGTGCAGTGAGCATGATGCCTAATTACAACGTGCTTTACTTC,11156,4,clonotype17,clonotype17_consensus_3 +ATCACGACATAACCTG-1,True,ATCACGACATAACCTG-1_contig_4,True,437,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,19478,2,clonotype17,None +ATTACTCCATGCCCGA-1,True,ATTACTCCATGCCCGA-1_contig_1,True,643,TRB,TRBV1,None,TRBJ1-1,TRBC1,True,True,CTCSAQGAQGTEVFF,TGCACCTGCAGTGCGCAGGGGGCGCAGGGCACAGAAGTCTTCTTT,738,7,clonotype18,clonotype18_consensus_1 +ATTACTCCATGCCCGA-1,True,ATTACTCCATGCCCGA-1_contig_2,True,355,TRA,TRAV6-6,None,TRAJ15,TRAC,True,False,CALGDPQGGRALIF,TGTGCTCTGGGTGATCCCCAGGGAGGCAGAGCTCTGATATTT,246,1,clonotype18,None +ATTACTCCATGCCCGA-1,True,ATTACTCCATGCCCGA-1_contig_3,True,393,TRA,TRAV6-6,None,TRAJ15,TRAC,True,False,CALGDPQGGRALIF,TGTGCTCTGGGTGATCCCCAGGGAGGCAGAGCTCTGATATTT,106,2,clonotype18,None +ATTATCCGTCCTAGCG-1,True,ATTATCCGTCCTAGCG-1_contig_1,True,544,TRA,TRAV13-2,None,TRAJ30,TRAC,True,True,CAIDRDTNAYKVIF,TGTGCTATAGACCGTGACACAAATGCTTACAAAGTCATCTTT,45652,5,clonotype19,clonotype19_consensus_2 +ATTATCCGTCCTAGCG-1,True,ATTATCCGTCCTAGCG-1_contig_2,True,527,TRB,TRBV13-3,None,TRBJ2-4,TRBC2,True,True,CASSDWGGQNTLYF,TGTGCCAGCAGTGATTGGGGGGGGCAAAACACCTTGTACTTT,23380,3,clonotype19,clonotype19_consensus_1 +CAAGGCCAGTAGGTGC-1,True,CAAGGCCAGTAGGTGC-1_contig_1,True,586,TRB,TRBV13-3,None,TRBJ1-4,TRBC1,True,True,CASSANERLFF,TGTGCCAGCAGTGCCAACGAAAGATTATTTTTC,964,8,clonotype20,clonotype20_consensus_2 +CAAGGCCAGTAGGTGC-1,True,CAAGGCCAGTAGGTGC-1_contig_2,True,597,TRA,TRAV12D-2,None,TRAJ49,TRAC,True,True,CALSAPNTGYQNFYF,TGTGCTCTGAGTGCTCCGAACACGGGTTACCAGAACTTCTATTTT,366,4,clonotype20,clonotype20_consensus_1 +CAAGGCCAGTAGGTGC-1,True,CAAGGCCAGTAGGTGC-1_contig_3,True,328,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,336,2,clonotype20,None +CAAGGCCAGTAGGTGC-1,True,CAAGGCCAGTAGGTGC-1_contig_4,True,364,TRB,None,None,TRBJ1-2,TRBC1,False,False,None,None,180,2,clonotype20,None +CAAGGCCAGTAGGTGC-1,True,CAAGGCCAGTAGGTGC-1_contig_5,True,363,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,176,1,clonotype20,None +CAAGGCCAGTAGGTGC-1,True,CAAGGCCAGTAGGTGC-1_contig_6,True,571,Multi,TRAV8D-2,None,TRDJ1,TRAC,True,False,CATDVGGRRDTS,TGTGCTACAGACGTGGGGGGGCGGAGGGATACGAGC,260,3,clonotype20,None +CACAAACGTTAAGTAG-1,True,CACAAACGTTAAGTAG-1_contig_1,True,555,TRA,TRAV8D-2,None,TRAJ26,TRAC,True,True,CATDNYAQGLTF,TGTGCTACAGATAACTATGCCCAGGGATTAACCTTC,36432,8,clonotype21,clonotype21_consensus_1 +CACAAACGTTAAGTAG-1,True,CACAAACGTTAAGTAG-1_contig_2,True,518,TRB,TRBV13-1,None,TRBJ2-2,TRBC2,True,True,CASSGDRDTGQLYF,TGTGCCAGCAGCGGGGACAGGGACACCGGGCAGCTCTACTTT,33608,8,clonotype21,clonotype21_consensus_2 +CACAAACGTTAAGTAG-1,True,CACAAACGTTAAGTAG-1_contig_3,True,517,TRA,TRAV6D-4,None,TRAJ31,TRAC,True,False,CSGPNNNRIFF,TGCTCTGGCCCCAACAATAACAGAATCTTCTTT,8522,2,clonotype21,None +CACACAACAGGGTACA-1,True,CACACAACAGGGTACA-1_contig_1,True,544,TRB,TRBV20,None,TRBJ2-7,TRBC2,True,True,CGARAWGSYEQYF,TGTGGTGCTAGGGCCTGGGGGTCCTATGAACAGTACTTC,72746,12,clonotype22,clonotype22_consensus_1 +CACACAACAGGGTACA-1,True,CACACAACAGGGTACA-1_contig_2,True,536,Multi,TRDV1,None,TRAJ34,TRAC,True,False,CGGKGRTSNTDKVVF,TGTGGAGGGAAAGGGAGGACTTCCAATACCGACAAAGTCGTCTTT,6188,1,clonotype22,None +CACACCTAGGGCACTA-1,True,CACACCTAGGGCACTA-1_contig_1,True,715,TRB,TRBV19,None,TRBJ1-1,TRBC1,True,True,CASSIHANTEVFF,TGTGCCAGCAGTATCCACGCAAACACAGAAGTCTTCTTT,1766,26,clonotype23,clonotype23_consensus_1 +CACACCTAGGGCACTA-1,True,CACACCTAGGGCACTA-1_contig_2,True,545,TRA,TRAV9-1,None,TRAJ56,TRAC,True,True,CAVSATGGNNKLTF,TGTGCTGTGAGCGCTACTGGAGGCAATAATAAGCTGACTTTT,256,11,clonotype23,clonotype23_consensus_2 +CACCAGGGTAAGTAGT-1,True,CACCAGGGTAAGTAGT-1_contig_1,True,569,TRB,TRBV2,None,TRBJ2-5,TRBC2,True,True,CASSQDGTGQDTQYF,TGTGCCAGCAGCCAAGACGGGACTGGACAAGACACCCAGTACTTT,1116,11,clonotype24,clonotype24_consensus_1 +CACCAGGGTAAGTAGT-1,True,CACCAGGGTAAGTAGT-1_contig_2,True,565,TRA,TRAV4-4-DV10,None,TRAJ49,TRAC,True,True,CAAEAGPGYQNFYF,TGTGCTGCTGAGGCAGGGCCGGGTTACCAGAACTTCTATTTT,1252,13,clonotype24,clonotype24_consensus_2 +CACCAGGGTAGCGTAG-1,True,CACCAGGGTAGCGTAG-1_contig_1,True,575,TRB,TRBV13-3,None,TRBJ1-4,TRBC1,True,True,CASSDKISNERLFF,TGTGCCAGCAGTGATAAAATTTCCAACGAAAGATTATTTTTC,42294,6,clonotype25,clonotype25_consensus_1 +CACCAGGGTAGCGTAG-1,True,CACCAGGGTAGCGTAG-1_contig_2,True,617,TRA,TRAV3-1,None,TRAJ35,TRAC,False,False,CAVSAGFASALTF,TGCGCAGTCAGTGCAGGCTTTGCAAGTGCGCTGACATTT,19912,3,clonotype25,None +CACCAGGGTAGCGTAG-1,True,CACCAGGGTAGCGTAG-1_contig_3,True,335,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,17134,2,clonotype25,None +CACCAGGGTGCCTGGT-1,True,CACCAGGGTGCCTGGT-1_contig_1,True,568,TRB,TRBV1,TRBD2,TRBJ2-7,TRBC2,True,True,CTCSAGLGGPEQYF,TGCACCTGCAGTGCGGGACTGGGGGGGCCGGAACAGTACTTC,43520,7,clonotype26,clonotype26_consensus_2 +CACCAGGGTGCCTGGT-1,True,CACCAGGGTGCCTGGT-1_contig_2,True,567,TRA,TRAV8D-2,None,TRAJ52,TRAC,True,True,CATDRGTGANTGKLTF,TGTGCTACAGATAGGGGCACTGGAGCTAACACTGGAAAGCTCACGTTT,35340,7,clonotype26,clonotype26_consensus_1 +CATCAGAGTCTCGTTC-1,True,CATCAGAGTCTCGTTC-1_contig_1,True,600,TRA,TRAV12D-2,None,TRAJ56,TRAC,True,True,CALSSTGGNNKLTF,TGTGCTCTGAGTTCTACTGGAGGCAATAATAAGCTGACTTTT,5214,30,clonotype27,clonotype27_consensus_1 +CATCAGAGTCTCGTTC-1,True,CATCAGAGTCTCGTTC-1_contig_2,True,575,TRB,TRBV12-1,None,TRBJ2-4,TRBC2,True,True,CASSLEGSQNTLYF,TGTGCCAGCTCTCTCGAGGGTAGTCAAAACACCTTGTACTTT,720,7,clonotype27,clonotype27_consensus_2 +CATCAGAGTCTCGTTC-1,True,CATCAGAGTCTCGTTC-1_contig_3,True,365,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,2052,10,clonotype27,None +CATCAGAGTCTCGTTC-1,True,CATCAGAGTCTCGTTC-1_contig_4,True,326,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,888,3,clonotype27,None +CATGCCTGTATTCGTG-1,True,CATGCCTGTATTCGTG-1_contig_1,True,573,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-1,TRBC2,True,True,CASGDATGLNYAEQFF,TGTGCCAGCGGTGATGCAACAGGGCTAAACTATGCTGAGCAGTTCTTC,1568,15,clonotype28,clonotype28_consensus_2 +CATGCCTGTATTCGTG-1,True,CATGCCTGTATTCGTG-1_contig_2,True,570,TRA,TRAV2,None,TRAJ12,TRAC,True,True,CIVTDTGTGGYKVVF,TGCATTGTGACTGACACCGGGACTGGAGGCTATAAAGTGGTCTTT,918,8,clonotype28,clonotype28_consensus_1 +CCACGGAAGCCTATGT-1,True,CCACGGAAGCCTATGT-1_contig_1,True,560,TRB,TRBV2,None,TRBJ1-5,TRBC1,True,True,CASSQDYNQAPLF,TGTGCCAGCAGCCAAGATTACAACCAGGCTCCGCTTTTT,188,2,clonotype29,clonotype29_consensus_1 +CCACGGAAGCCTATGT-1,True,CCACGGAAGCCTATGT-1_contig_2,True,354,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,1262,4,clonotype29,None +CCACGGAAGCCTATGT-1,True,CCACGGAAGCCTATGT-1_contig_3,True,336,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,342,1,clonotype29,None +CCCTCCTGTAACGCGA-1,True,CCCTCCTGTAACGCGA-1_contig_1,True,522,TRB,TRBV5,None,TRBJ2-7,TRBC2,True,True,CASSQGLGDSYEQYF,TGTGCCAGCAGCCAAGGACTGGGGGACTCCTATGAACAGTACTTC,1144,10,clonotype30,clonotype30_consensus_2 +CCCTCCTGTAACGCGA-1,True,CCCTCCTGTAACGCGA-1_contig_2,True,534,TRA,TRAV7-3,None,TRAJ40,TRAC,True,True,CAVSIGTGNYKYVF,TGTGCAGTGAGCATTGGTACAGGAAACTACAAATACGTCTTT,1032,13,clonotype30,clonotype30_consensus_1 +CCCTCCTGTAACGCGA-1,True,CCCTCCTGTAACGCGA-1_contig_3,True,524,TRB,TRBV19,None,TRBJ2-1,TRBC2,True,False,None,None,444,3,clonotype30,None +CCTCTGAAGAGTGACC-1,True,CCTCTGAAGAGTGACC-1_contig_1,True,597,TRA,TRAV7-4,None,TRAJ48,TRAC,True,True,CAASPPNYGNEKITF,TGTGCAGCTAGCCCCCCCAACTATGGAAATGAGAAAATAACTTTT,65014,8,clonotype31,clonotype31_consensus_1 +CCTCTGAAGAGTGACC-1,True,CCTCTGAAGAGTGACC-1_contig_2,True,305,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,12980,1,clonotype31,None +CGAGCCAAGAAACCAT-1,True,CGAGCCAAGAAACCAT-1_contig_1,True,555,TRB,TRBV16,None,TRBJ2-7,TRBC2,True,True,CASSFRDWGASYEQYF,TGTGCAAGCAGCTTCCGGGACTGGGGGGCCTCCTATGAACAGTACTTC,57554,9,clonotype1,clonotype1_consensus_1 +CGAGCCAAGAAACCAT-1,True,CGAGCCAAGAAACCAT-1_contig_2,True,629,TRA,TRAV14D-1,None,TRAJ48,TRAC,True,True,CAASNYGNEKITF,TGTGCAGCAAGTAACTATGGAAATGAGAAAATAACTTTT,14312,2,clonotype1,clonotype1_consensus_2 +CGCCAAGAGCCACGCT-1,True,CGCCAAGAGCCACGCT-1_contig_1,True,519,TRB,TRBV13-3,None,TRBJ1-2,TRBC1,True,True,CASSDAWGPDYTF,TGTGCCAGCAGTGATGCATGGGGCCCCGACTACACCTTC,296,2,clonotype32,clonotype32_consensus_1 +CGCCAAGAGCCACGCT-1,True,CGCCAAGAGCCACGCT-1_contig_2,True,531,TRA,TRAV7-3,None,TRAJ12,None,True,False,CSKTGGYKVVF,TGCAGTAAGACTGGAGGCTATAAAGTGGTCTTT,46,1,clonotype32,None +CGCCAAGAGCCACGCT-1,True,CGCCAAGAGCCACGCT-1_contig_3,True,503,TRB,None,None,TRBJ1-1,TRBC1,False,False,None,None,296,2,clonotype32,None +CGCCAAGAGCCACGCT-1,True,CGCCAAGAGCCACGCT-1_contig_4,True,333,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,1064,3,clonotype32,None +CGGACTGGTCAGGACA-1,True,CGGACTGGTCAGGACA-1_contig_1,True,525,TRB,TRBV5,None,TRBJ1-4,TRBC1,True,True,CASSQEGGLSNERLFF,TGTGCCAGCAGCCAAGAGGGAGGGCTTTCCAACGAAAGATTATTTTTC,52156,7,clonotype33,clonotype33_consensus_2 +CGGACTGGTCAGGACA-1,True,CGGACTGGTCAGGACA-1_contig_2,True,591,TRA,TRAV7-4,None,TRAJ57,TRAC,True,True,CAASEGGSAKLIF,TGTGCAGCTAGTGAAGGAGGGTCTGCGAAGCTCATCTTT,26336,3,clonotype33,clonotype33_consensus_1 +CGGACTGTCCACGAAT-1,True,CGGACTGTCCACGAAT-1_contig_1,True,655,TRA,TRAV14N-3,None,TRAJ32,TRAC,True,True,CAARSYGGSGNKLIF,TGTGCAGCAAGGTCTTATGGGGGCAGTGGCAACAAGCTCATCTTT,582,16,clonotype34,clonotype34_consensus_2 +CGGACTGTCCACGAAT-1,True,CGGACTGTCCACGAAT-1_contig_2,True,520,TRB,TRBV10,None,TRBJ1-2,TRBC1,True,True,CASSDDRGDSDYTF,TGTGCCAGCAGCGATGACAGGGGAGACTCCGACTACACCTTC,428,6,clonotype34,clonotype34_consensus_1 +CGGACTGTCCACGAAT-1,True,CGGACTGTCCACGAAT-1_contig_3,True,368,TRB,None,None,TRBJ1-5,TRBC1,False,False,None,None,502,4,clonotype34,None +CGGAGTCGTAAGTGGC-1,True,CGGAGTCGTAAGTGGC-1_contig_1,True,718,TRB,TRBV19,None,TRBJ1-3,TRBC1,True,True,CASSPPGEGNTLYF,TGTGCCAGCAGTCCCCCGGGGGAAGGAAATACGCTCTATTTT,57520,8,clonotype35,clonotype35_consensus_2 +CGGAGTCGTAAGTGGC-1,True,CGGAGTCGTAAGTGGC-1_contig_2,True,588,TRA,TRAV7-4,None,TRAJ49,TRAC,True,True,CAGNTGYQNFYF,TGTGCAGGGAACACGGGTTACCAGAACTTCTATTTT,16208,4,clonotype35,clonotype35_consensus_1 +CGGAGTCGTAAGTGGC-1,True,CGGAGTCGTAAGTGGC-1_contig_3,True,466,TRA,None,None,TRAJ32,TRAC,False,False,None,None,2758,1,clonotype35,None +CGTAGCGTCAAGGCTT-1,True,CGTAGCGTCAAGGCTT-1_contig_1,True,513,TRA,TRAV7-3,None,TRAJ40,TRAC,True,True,CAVSMGTGNYKYVF,TGTGCAGTGAGCATGGGTACAGGAAACTACAAATACGTCTTT,52794,8,clonotype36,clonotype36_consensus_1 +CGTCACTAGATACACA-1,True,CGTCACTAGATACACA-1_contig_1,True,513,TRB,TRBV13-1,None,TRBJ1-5,TRBC1,True,True,CASSVSRDRNQAPLF,TGTGCCAGCAGTGTCTCCCGGGACAGAAACCAGGCTCCGCTTTTT,1084,5,clonotype37,clonotype37_consensus_1 +CGTCCATGTTTGGGCC-1,True,CGTCCATGTTTGGGCC-1_contig_1,True,522,TRB,TRBV5,None,TRBJ2-1,TRBC2,True,True,CASSQETGVYAEQFF,TGTGCCAGCAGCCAAGAGACTGGGGTCTATGCTGAGCAGTTCTTC,40270,8,clonotype38,clonotype38_consensus_2 +CGTCCATGTTTGGGCC-1,True,CGTCCATGTTTGGGCC-1_contig_2,True,529,TRA,TRAV8D-1,None,TRAJ22,TRAC,True,True,CATDASSGSWQLIF,TGTGCTACTGATGCATCTTCTGGCAGCTGGCAACTCATCTTT,13218,5,clonotype38,clonotype38_consensus_1 +CGTCCATGTTTGGGCC-1,True,CGTCCATGTTTGGGCC-1_contig_3,True,416,TRB,None,None,TRBJ1-2,TRBC1,False,False,None,None,18384,5,clonotype38,None +CGTCCATGTTTGGGCC-1,True,CGTCCATGTTTGGGCC-1_contig_4,True,344,TRB,None,None,TRBJ1-6,TRBC1,False,False,None,None,4682,1,clonotype38,None +CGTGTCTAGTGCCAGA-1,True,CGTGTCTAGTGCCAGA-1_contig_1,True,522,TRB,TRBV5,None,TRBJ2-7,TRBC2,True,True,CASSPGLGDSYEQYF,TGTGCCAGCAGCCCGGGACTGGGGGACTCCTATGAACAGTACTTC,1190,12,clonotype39,clonotype39_consensus_2 +CGTGTCTAGTGCCAGA-1,True,CGTGTCTAGTGCCAGA-1_contig_2,True,549,TRA,TRAV7-3,None,TRAJ12,TRAC,True,True,CAVSMGTGGYKVVF,TGTGCAGTGAGCATGGGGACTGGAGGCTATAAAGTGGTCTTT,1244,13,clonotype39,clonotype39_consensus_1 +CTCGGAGCACAGACAG-1,True,CTCGGAGCACAGACAG-1_contig_1,True,567,TRB,TRBV12-2+TRBV13-2,None,TRBJ1-3,TRBC1,True,True,CASGDDNSGNTLYF,TGTGCCAGCGGTGATGATAATTCTGGAAATACGCTCTATTTT,1530,12,clonotype40,clonotype40_consensus_1 +CTCGGAGCACAGACAG-1,True,CTCGGAGCACAGACAG-1_contig_2,True,332,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,684,2,clonotype40,None +CTCGGAGCACAGACAG-1,True,CTCGGAGCACAGACAG-1_contig_3,True,381,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,1182,6,clonotype40,None +CTCGGAGCACAGACAG-1,True,CTCGGAGCACAGACAG-1_contig_4,True,386,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,484,4,clonotype40,None +CTCGTCAGTCACACGC-1,True,CTCGTCAGTCACACGC-1_contig_1,True,521,TRB,TRBV29,None,TRBJ1-2,TRBC1,True,True,CASIGPNSDYTF,TGTGCTAGCATCGGACCGAACTCCGACTACACCTTC,40120,10,clonotype41,clonotype41_consensus_2 +CTCGTCAGTCACACGC-1,True,CTCGTCAGTCACACGC-1_contig_2,True,544,TRA,TRAV6N-7,None,TRAJ39,TRAC,True,True,CALRNNAGAKLTF,TGTGCTCTGAGGAATAATGCAGGTGCCAAGCTCACATTC,17782,3,clonotype41,clonotype41_consensus_1 +CTCGTCAGTCACACGC-1,True,CTCGTCAGTCACACGC-1_contig_3,True,595,TRA,TRAV13-1,None,TRAJ32,TRAC,True,False,None,None,8258,1,clonotype41,None +CTGAAGTGTGATAAAC-1,True,CTGAAGTGTGATAAAC-1_contig_1,True,559,TRA,TRAV4-3,None,TRAJ22,TRAC,True,True,CAAEAPSGSWQLIF,TGTGCTGCTGAGGCCCCTTCTGGCAGCTGGCAACTCATCTTT,49124,7,clonotype42,clonotype42_consensus_1 +CTGAAGTGTGATAAAC-1,True,CTGAAGTGTGATAAAC-1_contig_2,True,582,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-5,TRBC2,True,True,CASGDGTGGLNQDTQYF,TGTGCCAGCGGTGATGGGACAGGGGGACTTAACCAAGACACCCAGTACTTT,26930,2,clonotype42,clonotype42_consensus_2 +CTGGTCTAGTGTACCT-1,True,CTGGTCTAGTGTACCT-1_contig_1,True,598,TRB,TRBV2,None,TRBJ2-7,TRBC2,True,True,CASSQERDNYEQYF,TGTGCCAGCAGCCAAGAAAGGGACAATTATGAACAGTACTTC,630,8,clonotype43,clonotype43_consensus_2 +CTGGTCTAGTGTACCT-1,True,CTGGTCTAGTGTACCT-1_contig_2,True,512,TRA,TRAV6-6,None,TRAJ34,TRAC,True,True,CALGGANTDKVVF,TGTGCTCTGGGTGGAGCCAATACCGACAAAGTCGTCTTT,1064,8,clonotype43,clonotype43_consensus_1 +CTTAACTTCTTCAACT-1,True,CTTAACTTCTTCAACT-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCTGGGACAGGGAACACAGAAGTCTTCTTT,4254,17,clonotype44,clonotype44_consensus_1 +CTTAACTTCTTCAACT-1,True,CTTAACTTCTTCAACT-1_contig_2,True,400,TRB,None,None,TRBJ1-4,TRBC1,False,False,None,None,1186,5,clonotype44,None +CTTAACTTCTTCAACT-1,True,CTTAACTTCTTCAACT-1_contig_3,True,474,TRA,TRAV9-4,None,TRAJ17,TRAC,True,False,CALTNSAGNKLTF,TGTGCTCTGACTAACAGTGCAGGGAACAAGCTAACTTTT,206,3,clonotype44,None +CTTCTCTCATTCCTGC-1,True,CTTCTCTCATTCCTGC-1_contig_1,True,514,TRB,TRBV14,None,TRBJ2-7,TRBC2,True,True,CASRQTVYEQYF,TGTGCCAGCAGACAGACTGTCTATGAACAGTACTTC,29690,15,clonotype45,clonotype45_consensus_1 +CTTCTCTCATTCCTGC-1,True,CTTCTCTCATTCCTGC-1_contig_2,True,538,TRA,TRAV13D-2,None,TRAJ39,TRAC,True,True,CAILNNAGAKLTF,TGTGCTATACTTAATAATGCAGGTGCCAAGCTCACATTC,28570,15,clonotype45,clonotype45_consensus_2 +CTTCTCTCATTCCTGC-1,True,CTTCTCTCATTCCTGC-1_contig_3,True,371,TRA,TRAV17,None,TRAJ52,TRAC,True,False,CTGGSTGANTGKLTF,TGCACTGGAGGATCCACTGGAGCTAACACTGGAAAGCTCACGTTT,8744,4,clonotype45,None +CTTCTCTCATTCCTGC-1,True,CTTCTCTCATTCCTGC-1_contig_4,True,329,TRB,None,None,TRBJ1-2,TRBC1,False,False,None,None,9400,6,clonotype45,None +GAACGGATCATGTGGT-1,True,GAACGGATCATGTGGT-1_contig_1,True,532,TRB,TRBV20,None,TRBJ1-1,TRBC1,True,True,CGARRQGNTEVFF,TGTGGTGCTAGGAGGCAGGGGAACACAGAAGTCTTCTTT,33068,6,clonotype46,clonotype46_consensus_1 +GAACGGATCATGTGGT-1,True,GAACGGATCATGTGGT-1_contig_2,True,559,TRA,TRAV12D-2,None,TRAJ22,TRAC,True,True,CALSVASGSWQLIF,TGTGCTCTGAGTGTGGCTTCTGGCAGCTGGCAACTCATCTTT,6424,1,clonotype46,clonotype46_consensus_2 +GAACGGATCATGTGGT-1,True,GAACGGATCATGTGGT-1_contig_3,True,363,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,29364,7,clonotype46,None +GACGTTAAGTGTTGAA-1,True,GACGTTAAGTGTTGAA-1_contig_1,True,704,TRB,TRBV19,None,TRBJ1-1,TRBC1,True,True,CASSSNENTEVFF,TGTGCCAGCAGTTCGAACGAAAACACAGAAGTCTTCTTT,2538,15,clonotype47,clonotype47_consensus_2 +GACGTTAAGTGTTGAA-1,True,GACGTTAAGTGTTGAA-1_contig_2,True,562,TRA,TRAV8D-2,None,TRAJ52,TRAC,True,True,CATDPFGGANTGKLTF,TGTGCTACAGATCCCTTCGGGGGAGCTAACACTGGAAAGCTCACGTTT,148,1,clonotype47,clonotype47_consensus_1 +GACTGCGAGGACCACA-1,True,GACTGCGAGGACCACA-1_contig_1,True,521,TRB,TRBV13-1,None,TRBJ2-7,TRBC2,True,True,CASSDAGQGGYEQYF,TGTGCCAGCAGTGATGCGGGACAGGGAGGATATGAACAGTACTTC,51710,9,clonotype48,clonotype48_consensus_1 +GACTGCGAGGACCACA-1,True,GACTGCGAGGACCACA-1_contig_2,True,624,TRB,TRBV15,None,TRBJ2-1,TRBC2,True,False,CQQPGKGEEAEQFF,TGCCAGCAGCCCGGTAAGGGGGAGGAAGCTGAGCAGTTCTTC,7172,3,clonotype48,None +GATCGATGTTAAGACA-1,True,GATCGATGTTAAGACA-1_contig_1,True,563,TRB,TRBV12-2+TRBV13-2,None,TRBJ1-3,TRBC1,True,True,CASGDSGNTLYF,TGTGCCAGCGGTGATTCTGGAAATACGCTCTATTTT,2548,10,clonotype49,clonotype49_consensus_1 +GATCTAGGTTCGGCAC-1,True,GATCTAGGTTCGGCAC-1_contig_1,True,538,TRA,TRAV6-6,None,TRAJ31,TRAC,True,True,CALSANNNNRIFF,TGTGCTCTGAGTGCGAATAACAATAACAGAATCTTCTTT,538,6,clonotype50,clonotype50_consensus_1 +GATCTAGTCGTCTGAA-1,True,GATCTAGTCGTCTGAA-1_contig_1,True,526,TRA,TRAV6N-7,None,TRAJ22,TRAC,True,True,CALSDSSGSWQLIF,TGTGCTCTGAGTGACTCTTCTGGCAGCTGGCAACTCATCTTT,158,2,clonotype51,clonotype51_consensus_1 +GATCTAGTCGTCTGAA-1,True,GATCTAGTCGTCTGAA-1_contig_2,True,521,TRB,TRBV13-1,None,TRBJ2-5,TRBC2,True,True,CASSDGLGFNQDTQYF,TGTGCCAGCAGTGATGGACTGGGGTTTAACCAAGACACCCAGTACTTT,294,3,clonotype51,clonotype51_consensus_2 +GATCTAGTCGTCTGAA-1,True,GATCTAGTCGTCTGAA-1_contig_3,True,537,TRA,TRAV13-1,None,TRAJ22,TRAC,True,True,CAISGSWQLIF,TGTGCTATTTCTGGCAGCTGGCAACTCATCTTT,528,6,clonotype51,clonotype51_consensus_3 +GATCTAGTCGTCTGAA-1,True,GATCTAGTCGTCTGAA-1_contig_4,True,361,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,308,1,clonotype51,None +GATCTAGTCGTCTGAA-1,True,GATCTAGTCGTCTGAA-1_contig_5,True,427,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,130,2,clonotype51,None +GCACATACAAGCCGTC-1,True,GCACATACAAGCCGTC-1_contig_1,True,558,TRB,TRBV3,None,TRBJ1-3,TRBC1,True,True,CARGDRHSGNTLYF,TGTGCCAGGGGGGACAGGCATTCTGGAAATACGCTCTATTTT,32094,9,clonotype52,clonotype52_consensus_1 +GCACATACAAGCCGTC-1,True,GCACATACAAGCCGTC-1_contig_2,True,368,TRB,None,None,TRBJ1-4,TRBC1,False,False,None,None,8500,2,clonotype52,None +GCACATACAAGCCGTC-1,True,GCACATACAAGCCGTC-1_contig_3,True,324,TRB,None,None,TRBJ2-5,TRBC2,False,False,None,None,23742,3,clonotype52,None +GCACATACAAGCCGTC-1,True,GCACATACAAGCCGTC-1_contig_4,True,435,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,8244,1,clonotype52,None +GCACATACAAGCCGTC-1,True,GCACATACAAGCCGTC-1_contig_5,True,497,TRA,TRAV9-4,None,TRAJ50,TRAC,True,False,CAVSPLIASSSFSKLVF,TGTGCTGTGAGCCCCCTTATAGCATCCTCCTCCTTCAGCAAGCTGGTGTTT,6680,1,clonotype52,None +GCACATAGTACTCTCC-1,True,GCACATAGTACTCTCC-1_contig_1,True,557,TRA,TRAV3-3,None,TRAJ47,TRAC,True,True,CAGDYANKMIF,TGCGCGGGGGACTATGCAAACAAGATGATCTTT,1306,11,clonotype53,clonotype53_consensus_2 +GCACATAGTACTCTCC-1,True,GCACATAGTACTCTCC-1_contig_2,True,522,TRB,TRBV20,None,TRBJ2-7,TRBC2,True,True,CGARVGVGQYF,TGTGGTGCTAGGGTTGGGGTAGGACAGTACTTC,1610,10,clonotype53,clonotype53_consensus_1 +GCAGCCACAAAGGAAG-1,True,GCAGCCACAAAGGAAG-1_contig_1,True,526,TRA,TRAV6N-7,None,TRAJ17,TRAC,True,True,CALRTNSAGNKLTF,TGTGCTCTGAGGACTAACAGTGCAGGGAACAAGCTAACTTTT,258,8,clonotype54,clonotype54_consensus_1 +GCAGCCACAAAGGAAG-1,True,GCAGCCACAAAGGAAG-1_contig_2,True,514,TRB,TRBV14,None,TRBJ1-5,TRBC1,True,True,CASSPGTEAPLF,TGTGCCAGCAGTCCCGGGACCGAGGCTCCGCTTTTT,942,20,clonotype54,clonotype54_consensus_2 +GCAGCCACAAAGGAAG-1,True,GCAGCCACAAAGGAAG-1_contig_3,True,563,TRB,None,None,TRBJ2-5,TRBC2,False,False,None,None,360,5,clonotype54,None +GCAGCCACAAAGGAAG-1,True,GCAGCCACAAAGGAAG-1_contig_4,True,330,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,1446,13,clonotype54,None +GCAGCCACAAAGGAAG-1,True,GCAGCCACAAAGGAAG-1_contig_5,True,348,TRA,TRAV6N-6,None,TRAJ17,TRAC,True,False,CALRTNSAGNKLTF,TGTGCTCTGAGGACTAACAGTGCAGGGAACAAGCTAACTTTT,88,1,clonotype54,clonotype54_consensus_1 +GCAGCCACAAAGGAAG-1,True,GCAGCCACAAAGGAAG-1_contig_6,True,370,TRB,None,None,TRBJ1-3,TRBC1,False,False,None,None,590,12,clonotype54,None +GCATGATGTCGCATAT-1,True,GCATGATGTCGCATAT-1_contig_1,True,630,TRA,TRAV5D-4,None,TRAJ57,TRAC,True,True,CAASDQGGSAKLIF,TGTGCTGCAAGTGATCAAGGAGGGTCTGCGAAGCTCATCTTT,678,5,clonotype55,clonotype55_consensus_1 +GCCAAATGTGTTGAGG-1,True,GCCAAATGTGTTGAGG-1_contig_1,True,522,TRB,TRBV5,None,TRBJ2-1,TRBC2,True,True,CASSQHWGGGAEQFF,TGTGCCAGCAGCCAACACTGGGGGGGCGGTGCTGAGCAGTTCTTC,14742,3,clonotype56,clonotype56_consensus_2 +GCCAAATGTGTTGAGG-1,True,GCCAAATGTGTTGAGG-1_contig_2,True,514,TRA,TRAV6-6,None,TRAJ34,TRAC,True,True,CALGDPNTDKVVF,TGTGCTCTGGGTGACCCCAATACCGACAAAGTCGTCTTT,14106,2,clonotype56,clonotype56_consensus_1 +GCCAAATGTGTTGAGG-1,True,GCCAAATGTGTTGAGG-1_contig_3,True,316,TRB,None,None,TRBJ2-2,TRBC2,False,False,None,None,11662,1,clonotype56,None +GCCAAATGTGTTGAGG-1,True,GCCAAATGTGTTGAGG-1_contig_4,True,556,TRA,TRAV3-3,None,TRAJ35,TRAC,False,False,CAVSADRLCKCADIWIW,TGCGCAGTCAGTGCAGACAGGCTTTGCAAGTGCGCTGACATTTGGATCTGG,36902,5,clonotype56,None +GCGGGTTCAGGAATCG-1,True,GCGGGTTCAGGAATCG-1_contig_1,True,547,TRA,TRAV13D-3,None,TRAJ17,TRAC,True,True,CAMERPNSAGNKLTF,TGTGCTATGGAACGTCCTAACAGTGCAGGGAACAAGCTAACTTTT,46258,4,clonotype57,clonotype57_consensus_1 +GCGGGTTCAGGAATCG-1,True,GCGGGTTCAGGAATCG-1_contig_2,True,541,TRB,TRBV29,None,TRBJ1-5,TRBC1,True,True,CASSLTVNNQAPLF,TGTGCTAGCAGTTTAACAGTTAACAACCAGGCTCCGCTTTTT,16090,1,clonotype57,clonotype57_consensus_2 +GCGGGTTCAGGAATCG-1,True,GCGGGTTCAGGAATCG-1_contig_3,True,371,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,15710,1,clonotype57,None +GGAATAAGTTGTCGCG-1,True,GGAATAAGTTGTCGCG-1_contig_1,True,602,TRB,TRBV3,None,TRBJ1-2,TRBC1,True,True,CASSRDDANSDYTF,TGTGCCAGCAGCCGGGACGATGCAAACTCCGACTACACCTTC,716,11,clonotype58,clonotype58_consensus_1 +GGAATAAGTTGTCGCG-1,True,GGAATAAGTTGTCGCG-1_contig_2,True,307,TRB,TRBV17,None,TRBJ1-1,TRBC1,True,False,None,None,710,2,clonotype58,None +GGACAGATCTCGAGTA-1,True,GGACAGATCTCGAGTA-1_contig_1,True,502,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSQDFPEEVFF,TGTGCCAGCAGCCAAGATTTCCCAGAAGAAGTCTTCTTT,666,6,clonotype59,clonotype59_consensus_2 +GGACAGATCTCGAGTA-1,True,GGACAGATCTCGAGTA-1_contig_2,True,493,TRA,TRAV6-5,None,TRAJ32,TRAC,True,True,CALSHYGGSGNKLIF,TGTGCTCTGAGTCATTATGGGGGCAGTGGCAACAAGCTCATCTTT,338,3,clonotype59,clonotype59_consensus_1 +GGACAGATCTCGAGTA-1,True,GGACAGATCTCGAGTA-1_contig_3,True,339,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,322,1,clonotype59,None +GGCCGATTCTAACTGG-1,True,GGCCGATTCTAACTGG-1_contig_1,True,725,TRA,TRAV9-4,None,TRAJ17,TRAC,True,True,CAGTNSAGNKLTF,TGTGCTGGGACTAACAGTGCAGGGAACAAGCTAACTTTT,43940,5,clonotype60,clonotype60_consensus_1 +GGCCGATTCTAACTGG-1,True,GGCCGATTCTAACTGG-1_contig_2,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGQGNTEVFF,TGTGCCAGCAGCCCGGGACAGGGGAACACAGAAGTCTTCTTT,34672,3,clonotype60,clonotype60_consensus_2 +GGCTGGTTCAAAGACA-1,True,GGCTGGTTCAAAGACA-1_contig_1,True,569,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-4,TRBC2,True,True,CASGQTGGNTLYF,TGTGCCAGCGGTCAGACAGGGGGCAACACCTTGTACTTT,63604,4,clonotype61,clonotype61_consensus_1 +GGGCATCCAATAAGCA-1,True,GGGCATCCAATAAGCA-1_contig_1,True,540,TRB,TRBV20,None,TRBJ1-4,TRBC1,True,True,CGAPRTGGDERLFF,TGTGGTGCCCCCCGGACAGGGGGCGACGAAAGATTATTTTTC,492,4,clonotype62,clonotype62_consensus_1 +GGGCATCCAATAAGCA-1,True,GGGCATCCAATAAGCA-1_contig_2,True,511,TRA,TRAV4-2,None,TRAJ39,TRAC,True,True,CAAFNAGAKLTF,TGTGCTGCCTTTAATGCAGGTGCCAAGCTCACATTC,552,6,clonotype62,clonotype62_consensus_2 +GGGCATCCAATAAGCA-1,True,GGGCATCCAATAAGCA-1_contig_3,True,342,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,646,6,clonotype62,None +GGTGAAGAGTGGGTTG-1,True,GGTGAAGAGTGGGTTG-1_contig_1,True,558,TRB,TRBV13-3,None,TRBJ1-6,TRBC1,True,True,CAGQGARNSPLYF,TGTGCCGGACAGGGGGCGCGAAATTCGCCCCTCTACTTT,27264,6,clonotype63,clonotype63_consensus_1 +GGTGAAGAGTGGGTTG-1,True,GGTGAAGAGTGGGTTG-1_contig_2,True,420,TRB,TRBV31,None,TRBJ1-5,TRBC1,True,False,CLESSDREQAPLF,TGCCTGGAGTCTAGCGACAGGGAACAGGCTCCGCTTTTT,8684,1,clonotype63,None +GGTGAAGAGTGGGTTG-1,True,GGTGAAGAGTGGGTTG-1_contig_3,True,352,TRB,None,None,TRBJ2-5,TRBC2,False,False,None,None,42352,5,clonotype63,None +GTACTCCCACCTCGGA-1,True,GTACTCCCACCTCGGA-1_contig_1,True,710,TRB,TRBV19,None,TRBJ1-4,TRBC1,True,True,CASSIDRVGSERLFF,TGTGCCAGCAGTATAGACAGGGTAGGATCCGAAAGATTATTTTTC,1544,16,clonotype64,clonotype64_consensus_1 +GTACTCCCACCTCGGA-1,True,GTACTCCCACCTCGGA-1_contig_2,True,567,TRA,TRAV2,None,TRAJ30,TRAC,True,True,CIVTDLTNAYKVIF,TGCATTGTGACTGACCTCACAAATGCTTACAAAGTCATCTTT,1038,12,clonotype64,clonotype64_consensus_2 +GTACTCCCACCTCGGA-1,True,GTACTCCCACCTCGGA-1_contig_3,True,308,TRB,None,None,TRBJ2-2,TRBC2,False,False,None,None,414,2,clonotype64,None +GTACTCCCACCTCGGA-1,True,GTACTCCCACCTCGGA-1_contig_4,True,345,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,530,2,clonotype64,None +GTACTCCCACCTCGGA-1,True,GTACTCCCACCTCGGA-1_contig_5,True,354,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,2548,8,clonotype64,None +GTACTTTCACATGTGT-1,True,GTACTTTCACATGTGT-1_contig_1,True,576,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-4,TRBC2,True,True,CASGDSHASQNTLYF,TGTGCCAGCGGTGATAGCCACGCTAGTCAAAACACCTTGTACTTT,45384,3,clonotype65,clonotype65_consensus_2 +GTACTTTCACATGTGT-1,True,GTACTTTCACATGTGT-1_contig_2,True,558,TRA,TRAV8D-2,None,TRAJ52,TRAC,True,True,CATATGANTGKLTF,TGTGCTACAGCCACTGGAGCTAACACTGGAAAGCTCACGTTT,31030,4,clonotype65,clonotype65_consensus_1 +GTCCTCAGTTTACTCT-1,True,GTCCTCAGTTTACTCT-1_contig_1,True,519,TRB,TRBV5,TRBD1,TRBJ2-7,TRBC2,True,True,CASSHRDRGLEQYF,TGTGCCAGCAGCCACCGGGACAGGGGGCTTGAACAGTACTTC,6544,3,clonotype66,clonotype66_consensus_2 +GTCCTCAGTTTACTCT-1,True,GTCCTCAGTTTACTCT-1_contig_2,True,574,TRA,TRAV4-4-DV10,None,TRAJ50,TRAC,True,True,CAAEAASSSFSKLVF,TGTGCTGCTGAGGCCGCATCCTCCTCCTTCAGCAAGCTGGTGTTT,27224,12,clonotype66,clonotype66_consensus_1 +GTCCTCAGTTTACTCT-1,True,GTCCTCAGTTTACTCT-1_contig_3,True,426,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,44842,14,clonotype66,None +GTCTCGTGTAATCACC-1,True,GTCTCGTGTAATCACC-1_contig_1,True,565,TRB,TRBV1,None,TRBJ1-2,TRBC1,True,True,CTCSAQANSDYTF,TGCACCTGCAGTGCCCAGGCAAACTCCGACTACACCTTC,65594,23,clonotype67,clonotype67_consensus_2 +GTCTCGTGTAATCACC-1,True,GTCTCGTGTAATCACC-1_contig_2,True,524,TRA,TRAV6-4,None,TRAJ15,TRAC,True,True,CALVDVQGGRALIF,TGTGCTCTGGTTGACGTCCAGGGAGGCAGAGCTCTGATATTT,10066,7,clonotype67,clonotype67_consensus_1 +GTTACAGCATTCGACA-1,True,GTTACAGCATTCGACA-1_contig_1,True,512,TRA,TRAV6-5,None,TRAJ5,TRAC,True,True,CALGDTQVVGQLTF,TGTGCTCTGGGTGACACACAGGTTGTGGGGCAGCTCACTTTC,1090,10,clonotype68,clonotype68_consensus_2 +GTTACAGCATTCGACA-1,True,GTTACAGCATTCGACA-1_contig_2,True,513,TRB,TRBV31,None,TRBJ1-3,TRBC1,True,True,CAWRGGGGNTHYF,TGTGCCTGGCGGGGGGGGGGAGGAAATACGCACTATTTT,1620,12,clonotype68,clonotype68_consensus_1 +GTTACAGCATTCGACA-1,True,GTTACAGCATTCGACA-1_contig_3,True,373,TRB,None,None,TRBJ1-1,TRBC1,False,False,None,None,7472,29,clonotype68,None +GTTACAGCATTCGACA-1,True,GTTACAGCATTCGACA-1_contig_4,True,501,TRA,TRAV12-1,None,TRAJ11,TRAC,True,False,CPVLLCSNSGYNKLTF,TGCCCTGTACTACTGTGCTCTAACTCGGGATACAACAAACTCACTTTT,302,2,clonotype68,None +GTTTCTATCTAACTGG-1,True,GTTTCTATCTAACTGG-1_contig_1,True,535,TRB,TRBV13-3,None,TRBJ1-4,TRBC1,True,True,CASSAGTGGERLFF,TGTGCCAGCAGTGCCGGGACGGGCGGCGAAAGATTATTTTTC,1346,11,clonotype69,clonotype69_consensus_2 +GTTTCTATCTAACTGG-1,True,GTTTCTATCTAACTGG-1_contig_2,True,588,TRA,TRAV7-4,None,TRAJ9,TRAC,True,True,CAARGRGYKLTF,TGTGCAGCTAGGGGGAGGGGCTACAAACTTACCTTC,348,3,clonotype69,clonotype69_consensus_1 +GTTTCTATCTAACTGG-1,True,GTTTCTATCTAACTGG-1_contig_3,True,531,TRA,TRAV6-2,None,TRAJ40,None,True,False,CVLGDRYRKLQIRLWSRYQTEGYST,TGTGTTCTGGGTGATAGGTACAGGAAACTACAAATACGTCTTTGGAGCAGGTACCAGACTGAAGGTTATAGCACC,56,1,clonotype69,None +GTTTCTATCTAACTGG-1,True,GTTTCTATCTAACTGG-1_contig_4,True,322,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,922,3,clonotype69,None +GTTTCTATCTAACTGG-1,True,GTTTCTATCTAACTGG-1_contig_5,True,331,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,990,6,clonotype69,None +TACCTTATCCGCAAGC-1,True,TACCTTATCCGCAAGC-1_contig_1,True,562,TRA,TRAV14D-2,None,TRAJ43,TRAC,True,True,CAALNNNNAPRF,TGTGCAGCACTCAATAACAACAATGCCCCACGATTT,67926,6,clonotype70,clonotype70_consensus_2 +TACCTTATCCGCAAGC-1,True,TACCTTATCCGCAAGC-1_contig_2,True,561,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-7,TRBC2,True,True,CASGDVRYEQYF,TGTGCCAGCGGTGATGTCAGATATGAACAGTACTTC,1286,3,clonotype70,clonotype70_consensus_1 +TAGTTGGTCCCAAGTA-1,True,TAGTTGGTCCCAAGTA-1_contig_1,True,636,TRA,TRAV7-1,None,TRAJ40,TRAC,True,True,CAVSMGTGNYKYVF,TGTGCAGTGAGCATGGGTACAGGAAACTACAAATACGTCTTT,8320,3,clonotype71,clonotype71_consensus_1 +TAGTTGGTCCCAAGTA-1,True,TAGTTGGTCCCAAGTA-1_contig_2,True,543,TRA,TRAV15-1-DV6-1,None,TRAJ33,TRAC,True,True,CALWEPYMDSNYQLIW,TGTGCTCTCTGGGAGCCCTACATGGATAGCAACTATCAGTTGATCTGG,8020,2,clonotype71,clonotype71_consensus_2 +TAGTTGGTCCCAAGTA-1,True,TAGTTGGTCCCAAGTA-1_contig_3,True,522,TRB,TRBV5,None,TRBJ2-7,TRBC2,True,True,CASSPGLGDSYEQYF,TGTGCCAGCAGCCCGGGACTGGGGGACTCCTATGAACAGTACTTC,20658,6,clonotype71,clonotype71_consensus_3 +TAGTTGGTCCCAAGTA-1,True,TAGTTGGTCCCAAGTA-1_contig_4,True,602,TRA,TRAV14D-2,None,TRAJ33,TRAC,True,False,CALWEPYMDSNYQLIW,TGTGCTCTCTGGGAGCCCTACATGGATAGCAACTATCAGTTGATCTGG,10034,3,clonotype71,clonotype71_consensus_2 +TAGTTGGTCCCAAGTA-1,True,TAGTTGGTCCCAAGTA-1_contig_5,True,311,TRA,None,None,TRAJ34,TRAC,False,False,None,None,13840,4,clonotype71,None +TAGTTGGTCCCAAGTA-1,True,TAGTTGGTCCCAAGTA-1_contig_6,True,313,TRA,None,None,TRAJ11,TRAC,False,False,None,None,7066,1,clonotype71,None +TAGTTGGTCCCAAGTA-1,True,TAGTTGGTCCCAAGTA-1_contig_7,True,324,TRB,None,None,TRBJ1-6,TRBC1,False,False,None,None,7212,1,clonotype71,None +TATCTCACAGTCAGAG-1,True,TATCTCACAGTCAGAG-1_contig_1,True,516,TRB,TRBV5,None,TRBJ2-7,TRBC2,True,True,CASSPGLGYEQYF,TGTGCCAGCAGCCCGGGACTGGGGTATGAACAGTACTTC,50414,3,clonotype72,clonotype72_consensus_1 +TATCTCACAGTCAGAG-1,True,TATCTCACAGTCAGAG-1_contig_2,True,498,TRA,TRAV21-DV12,None,TRAJ40,TRAC,True,True,CILVTGNYKYVF,TGTATCCTTGTTACAGGAAACTACAAATACGTCTTT,28120,3,clonotype72,clonotype72_consensus_2 +TATCTCACATATACGC-1,True,TATCTCACATATACGC-1_contig_1,True,592,TRA,TRAV6N-7,None,TRAJ47,TRAC,True,True,CALGEDYANKMIF,TGTGCTCTGGGTGAGGACTATGCAAACAAGATGATCTTT,13362,3,clonotype73,clonotype73_consensus_3 +TATCTCACATATACGC-1,True,TATCTCACATATACGC-1_contig_2,True,566,TRA,TRAV3-3,None,TRAJ50,TRAC,True,True,CAVSSSSSFSKLVF,TGCGCAGTCAGTTCATCCTCCTCCTTCAGCAAGCTGGTGTTT,13810,4,clonotype73,clonotype73_consensus_2 +TATCTCACATATACGC-1,True,TATCTCACATATACGC-1_contig_3,True,562,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-3,TRBC2,True,True,CASGDRAETLYF,TGTGCCAGCGGTGACCGTGCAGAAACGCTGTATTTT,39610,11,clonotype73,clonotype73_consensus_1 +TATCTCACATATACGC-1,True,TATCTCACATATACGC-1_contig_4,True,1093,TRB,TRBV12-2,None,TRBJ2-3,TRBC2,True,False,None,None,8204,3,clonotype73,None +TATCTCACATATACGC-1,True,TATCTCACATATACGC-1_contig_5,True,690,TRB,TRBV3,None,TRBJ2-7,TRBC2,True,False,None,None,2282,1,clonotype73,None +TCAGATGTCAGAGACG-1,True,TCAGATGTCAGAGACG-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGQGNTEVFF,TGTGCCAGCAGCCCGGGACAGGGGAACACAGAAGTCTTCTTT,2712,37,clonotype74,clonotype74_consensus_1 +TCAGCAACAAGGTTCT-1,True,TCAGCAACAAGGTTCT-1_contig_1,True,567,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-3,TRBC2,True,True,CASGGGTGEAETLYF,TGTGCCAGCGGTGGTGGGACAGGGGAGGCAGAAACGCTGTATTTT,638,4,clonotype75,clonotype75_consensus_2 +TCAGCAACAAGGTTCT-1,True,TCAGCAACAAGGTTCT-1_contig_2,True,533,TRA,TRAV6-2,None,TRAJ11,TRAC,True,True,CVLGDSGYNKLTF,TGTGTTCTGGGTGACTCGGGATACAACAAACTCACTTTT,1190,7,clonotype75,clonotype75_consensus_1 +TCGTAGATCACGCGGT-1,True,TCGTAGATCACGCGGT-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGQGNTEVFF,TGTGCCAGCAGCCCCGGACAGGGGAACACAGAAGTCTTCTTT,58708,12,clonotype76,clonotype76_consensus_1 +TCGTAGATCACGCGGT-1,True,TCGTAGATCACGCGGT-1_contig_2,True,694,TRA,TRAV9-4,None,TRAJ16,TRAC,True,True,CAVSASSGQKLVF,TGTGCTGTGAGCGCTTCAAGTGGCCAGAAGCTGGTTTTT,8676,3,clonotype76,clonotype76_consensus_2 +TCGTAGATCACGCGGT-1,True,TCGTAGATCACGCGGT-1_contig_3,True,541,TRA,TRAV6N-7,None,TRAJ34,TRAC,True,False,CTTVLFNTDKVVF,TGTACTACTGTGCTCTTCAATACCGACAAAGTCGTCTTT,4970,1,clonotype76,None +TGACTAGTCGAGAACG-1,True,TGACTAGTCGAGAACG-1_contig_1,True,571,TRB,TRBV1,None,TRBJ2-3,TRBC2,True,True,CTCSADLVSAETLYF,TGCACCTGCAGTGCAGATCTAGTTAGTGCAGAAACGCTGTATTTT,69154,21,clonotype77,clonotype77_consensus_1 +TGACTAGTCGAGAACG-1,True,TGACTAGTCGAGAACG-1_contig_2,True,550,TRA,TRAV10D,None,TRAJ45,TRAC,True,True,CAAGAGGADRLTF,TGTGCAGCTGGGGCAGGAGGTGCAGATAGACTCACCTTT,7960,3,clonotype77,clonotype77_consensus_2 +TGAGCCGCAGTAAGCG-1,True,TGAGCCGCAGTAAGCG-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCCGGGACAGGAAACACAGAAGTCTTCTTT,15432,2,clonotype78,clonotype78_consensus_1 +TGAGCCGCAGTAAGCG-1,True,TGAGCCGCAGTAAGCG-1_contig_2,True,687,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,48952,5,clonotype78,None +TGAGCCGCAGTAAGCG-1,True,TGAGCCGCAGTAAGCG-1_contig_3,True,491,TRA,TRAV12D-2,None,TRAJ17,TRAC,True,False,None,None,14122,2,clonotype78,None +TGGTTAGGTGTCTGAT-1,True,TGGTTAGGTGTCTGAT-1_contig_1,True,521,TRA,TRAV14-1,None,TRAJ5,TRAC,True,True,CAAGTQVVGQLTF,TGTGCAGCCGGGACACAGGTTGTGGGGCAGCTCACTTTC,388,3,clonotype79,clonotype79_consensus_1 +TGGTTAGGTGTCTGAT-1,True,TGGTTAGGTGTCTGAT-1_contig_2,True,469,TRB,None,None,TRBJ2-2,TRBC2,False,False,None,None,180,1,clonotype79,None +TGGTTAGGTGTCTGAT-1,True,TGGTTAGGTGTCTGAT-1_contig_3,True,426,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,420,3,clonotype79,None +TGTCCCAGTAAGTAGT-1,True,TGTCCCAGTAAGTAGT-1_contig_1,True,721,TRA,TRAV9-4,None,TRAJ17,TRAC,True,True,CALTNSAGNKLTF,TGTGCTCTGACTAACAGTGCAGGGAACAAGCTAACTTTT,22540,7,clonotype80,clonotype80_consensus_1 +TGTCCCAGTAAGTAGT-1,True,TGTCCCAGTAAGTAGT-1_contig_2,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGQGNTEVFF,TGTGCCAGCAGCCCGGGACAGGGGAACACAGAAGTCTTCTTT,21012,9,clonotype80,clonotype80_consensus_2 +TGTCCCAGTAAGTAGT-1,True,TGTCCCAGTAAGTAGT-1_contig_3,True,320,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,7892,1,clonotype80,None +TGTCCCAGTAAGTAGT-1,True,TGTCCCAGTAAGTAGT-1_contig_4,True,607,TRB,None,None,TRBJ2-5,TRBC2,False,False,None,None,24748,5,clonotype80,None +TTCGGTCCATCGGTTA-1,True,TTCGGTCCATCGGTTA-1_contig_1,True,566,TRA,TRAV3-3,None,TRAJ30,TRAC,True,True,CAVSAPTNAYKVIF,TGCGCAGTCAGTGCCCCGACAAATGCTTACAAAGTCATCTTT,37558,6,clonotype81,clonotype81_consensus_1 +TTCGGTCCATCGGTTA-1,True,TTCGGTCCATCGGTTA-1_contig_2,True,545,TRA,TRAV8D-1,None,TRAJ17,TRAC,True,False,None,None,28874,5,clonotype81,None +TTCGGTCCATCGGTTA-1,True,TTCGGTCCATCGGTTA-1_contig_3,True,617,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,False,CASSQGKTANTEVFF,TGTGCCAGCAGCCAAGGGAAAACTGCAAACACAGAAGTCTTCTTT,8300,1,clonotype81,None +TTTATGCAGATACACA-1,True,TTTATGCAGATACACA-1_contig_1,True,597,TRA,TRAV7D-4,None,TRAJ48,TRAC,True,True,CAASRENYGNEKITF,TGTGCAGCTAGTAGGGAGAACTATGGAAATGAGAAAATAACTTTT,10008,19,clonotype82,clonotype82_consensus_1 +TTTATGCAGATACACA-1,True,TTTATGCAGATACACA-1_contig_2,True,357,TRB,TRBV13-2,None,TRBJ2-1,TRBC2,True,False,CASGGWGNYAEQFF,TGTGCCAGCGGTGGCTGGGGTAACTATGCTGAGCAGTTCTTC,57224,4,clonotype82,None +TTTATGCAGCTATGCT-1,True,TTTATGCAGCTATGCT-1_contig_1,True,518,TRB,TRBV13-1,None,TRBJ2-7,TRBC2,True,True,CASSEGGRSYEQYF,TGTGCCAGCAGTGAGGGGGGGCGCTCCTATGAACAGTACTTC,42094,5,clonotype83,clonotype83_consensus_1 +TTTATGCAGCTATGCT-1,True,TTTATGCAGCTATGCT-1_contig_2,True,532,TRA,TRAV6N-7,None,TRAJ53,TRAC,True,True,CALSDFGGSNYKLTF,TGTGCTCTGAGTGATTTTGGAGGCAGCAATTACAAACTGACATTT,33472,3,clonotype83,clonotype83_consensus_2 diff --git a/tests/testthat/fixtures/Chariou/h5files/SCAF1714_2_1_filtered_contig_annotations.csv b/tests/testthat/fixtures/Chariou/h5files/SCAF1714_2_1_filtered_contig_annotations.csv new file mode 100644 index 0000000..243f6cb --- /dev/null +++ b/tests/testthat/fixtures/Chariou/h5files/SCAF1714_2_1_filtered_contig_annotations.csv @@ -0,0 +1,329 @@ +barcode,is_cell,contig_id,high_confidence,length,chain,v_gene,d_gene,j_gene,c_gene,full_length,productive,cdr3,cdr3_nt,reads,umis,raw_clonotype_id,raw_consensus_id +AAATGCCCACGGACAA-1,True,AAATGCCCACGGACAA-1_contig_1,True,623,TRB,TRBV13-3,None,TRBJ1-4,TRBC1,True,True,CASSANERLFF,TGTGCCAGCAGTGCCAACGAAAGATTATTTTTC,36008,9,clonotype12,clonotype12_consensus_2 +AAATGCCCACGGACAA-1,True,AAATGCCCACGGACAA-1_contig_2,True,504,TRA,TRAV12D-2,None,TRAJ49,TRAC,True,True,CALSAPNTGYQNFYF,TGTGCTCTGAGTGCCCCTAACACGGGTTACCAGAACTTCTATTTT,21046,5,clonotype12,clonotype12_consensus_1 +AAATGCCCACGGACAA-1,True,AAATGCCCACGGACAA-1_contig_3,True,598,TRB,TRBV3,None,TRBJ2-5,TRBC2,True,False,CQQLAVQDTQYF,TGCCAGCAGCTGGCAGTCCAAGACACCCAGTACTTT,5576,2,clonotype12,None +AAATGCCCACGGACAA-1,True,AAATGCCCACGGACAA-1_contig_4,True,336,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,14804,4,clonotype12,None +AACACGTGTCTAAAGA-1,True,AACACGTGTCTAAAGA-1_contig_1,True,628,TRA,TRAV6N-7,None,TRAJ49,TRAC,True,True,CALGGKKGYQNFYF,TGTGCTCTGGGTGGTAAGAAGGGTTACCAGAACTTCTATTTT,29884,3,clonotype6,clonotype6_consensus_2 +AACACGTGTCTAAAGA-1,True,AACACGTGTCTAAAGA-1_contig_2,True,665,TRB,TRBV19,None,TRBJ2-7,TRBC2,True,True,CASSINWGGEQYF,TGTGCCAGCAGTATAAACTGGGGGGGCGAACAGTACTTC,45260,5,clonotype6,clonotype6_consensus_1 +AACCATGAGACTAAGT-1,True,AACCATGAGACTAAGT-1_contig_1,True,554,TRB,TRBV31,None,TRBJ2-2,TRBC2,True,True,CAWSQKRLGVDTGQLYF,TGTGCCTGGAGTCAAAAAAGACTGGGGGTAGACACCGGGCAGCTCTACTTT,76438,10,clonotype13,clonotype13_consensus_1 +AACCATGCACCGATAT-1,True,AACCATGCACCGATAT-1_contig_1,True,546,TRA,TRAV7-3,None,TRAJ26,TRAC,True,True,CAVSMGYAQGLTF,TGTGCAGTGAGCATGGGCTATGCCCAGGGATTAACCTTC,21636,2,clonotype14,clonotype14_consensus_1 +AACCATGCACCGATAT-1,True,AACCATGCACCGATAT-1_contig_2,True,537,TRA,TRAV15-1-DV6-1,None,TRAJ40,TRAC,True,True,CALWESTGNYKYVF,TGTGCTCTCTGGGAGTCTACAGGAAACTACAAATACGTCTTT,40080,3,clonotype14,clonotype14_consensus_2 +AACCATGCACCGATAT-1,True,AACCATGCACCGATAT-1_contig_3,True,588,TRB,TRBV20,None,TRBJ2-7,TRBC2,True,True,CGARQGLGEQYF,TGTGGTGCTAGGCAGGGACTGGGGGAACAGTACTTC,15660,1,clonotype14,clonotype14_consensus_3 +AACCATGCATGTTCCC-1,True,AACCATGCATGTTCCC-1_contig_1,True,659,TRA,TRAV14N-3,None,TRAJ32,TRAC,True,True,CAARSYGGSGNKLIF,TGTGCAGCAAGGTCTTATGGGGGCAGTGGCAACAAGCTCATCTTT,25784,4,clonotype1,clonotype1_consensus_2 +AACCATGCATGTTCCC-1,True,AACCATGCATGTTCCC-1_contig_2,True,544,TRB,TRBV10,None,TRBJ1-2,TRBC1,True,True,CASSDDRGDSDYTF,TGTGCCAGCAGCGATGACAGGGGAGACTCCGACTACACCTTC,47080,5,clonotype1,clonotype1_consensus_1 +AACTGGTGTGCCTGCA-1,True,AACTGGTGTGCCTGCA-1_contig_1,True,550,TRB,TRBV20,TRBD1,TRBJ1-2,TRBC1,True,True,CGVGTGGANSDYTF,TGTGGTGTCGGGACAGGGGGCGCGAACTCCGACTACACCTTC,78692,3,clonotype3,clonotype3_consensus_1 +AAGTCTGTCGGAATCT-1,True,AAGTCTGTCGGAATCT-1_contig_1,True,519,TRB,TRBV5,None,TRBJ2-7,TRBC2,True,True,CASSQGGSSYEQYF,TGTGCCAGCAGCCAGGGGGGAAGCTCCTATGAACAGTACTTC,21974,7,clonotype15,clonotype15_consensus_2 +AAGTCTGTCGGAATCT-1,True,AAGTCTGTCGGAATCT-1_contig_2,True,701,TRB,TRBV19,None,TRBJ1-6,TRBC1,True,True,CASSKDTSYNSPLYF,TGTGCCAGCAGTAAGGACACTTCCTATAATTCGCCCCTCTACTTT,27132,10,clonotype15,clonotype15_consensus_3 +AAGTCTGTCGGAATCT-1,True,AAGTCTGTCGGAATCT-1_contig_3,True,523,TRA,TRAV8D-1,None,TRAJ28,TRAC,True,True,CATGTGSNRLTF,TGTGCTACAGGCACTGGGAGTAACAGGCTCACTTTT,22778,7,clonotype15,clonotype15_consensus_1 +AAGTCTGTCGGAATCT-1,True,AAGTCTGTCGGAATCT-1_contig_4,True,335,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,7062,3,clonotype15,None +ACACCAAAGCTTATCG-1,True,ACACCAAAGCTTATCG-1_contig_1,True,510,TRB,TRBV29,None,TRBJ1-2,TRBC1,True,True,CASVGTTNSDYTF,TGTGCTAGCGTCGGGACAACAAACTCCGACTACACCTTC,36564,10,clonotype16,clonotype16_consensus_2 +ACACCAAAGCTTATCG-1,True,ACACCAAAGCTTATCG-1_contig_2,True,530,TRA,TRAV6N-7,None,TRAJ39,TRAC,True,True,CALRSNNAGAKLTF,TGTGCTCTGAGGTCGAATAATGCAGGTGCCAAGCTCACATTC,8868,3,clonotype16,clonotype16_consensus_1 +ACACCAAAGCTTATCG-1,True,ACACCAAAGCTTATCG-1_contig_3,True,357,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,30974,7,clonotype16,None +ACACCGGTCAGTCAGT-1,True,ACACCGGTCAGTCAGT-1_contig_1,True,529,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSQGGGNTEVFF,TGTGCCAGCAGCCAAGGGGGGGGGAACACAGAAGTCTTCTTT,68520,6,clonotype7,clonotype7_consensus_1 +ACACCGGTCAGTCAGT-1,True,ACACCGGTCAGTCAGT-1_contig_2,True,701,TRA,TRAV9D-2,None,TRAJ12,TRAC,True,False,None,None,7128,1,clonotype7,None +ACACTGACATCACGTA-1,True,ACACTGACATCACGTA-1_contig_1,True,590,TRB,TRBV12-2+TRBV13-2,None,TRBJ1-1,TRBC1,True,True,CASGGGQSNTEVFF,TGTGCCAGCGGTGGCGGACAGTCAAACACAGAAGTCTTCTTT,20722,3,clonotype17,clonotype17_consensus_1 +ACACTGACATCACGTA-1,True,ACACTGACATCACGTA-1_contig_2,True,610,TRA,TRAV16N,None,TRAJ37,TRAC,True,True,CAGAGNTRKLIF,TGTGCGGGGGCAGGCAATACTAGAAAACTCATCTTT,12998,1,clonotype17,clonotype17_consensus_2 +ACACTGACATCACGTA-1,True,ACACTGACATCACGTA-1_contig_3,True,331,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,14382,1,clonotype17,None +ACACTGACATCACGTA-1,True,ACACTGACATCACGTA-1_contig_4,True,516,TRA,TRAV13-2,None,TRAJ23,TRAC,True,False,None,None,29454,2,clonotype17,None +ACAGCCGCAGACAGGT-1,True,ACAGCCGCAGACAGGT-1_contig_1,True,563,TRB,TRBV20,TRBD1,TRBJ1-2,TRBC1,True,True,CGVGTGGANSDYTF,TGTGGTGTCGGGACAGGGGGCGCGAACTCCGACTACACCTTC,65814,9,clonotype3,clonotype3_consensus_1 +ACGAGGAGTGCTCTTC-1,True,ACGAGGAGTGCTCTTC-1_contig_1,True,668,TRA,TRAV9-4,None,TRAJ17,TRAC,True,True,CALTNSAGNKLTF,TGTGCTTTGACTAACAGTGCAGGGAACAAGCTAACTTTT,6294,1,clonotype18,clonotype18_consensus_1 +ACGAGGAGTGCTCTTC-1,True,ACGAGGAGTGCTCTTC-1_contig_2,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSAGTGNTEVFF,TGTGCCAGCAGCGCCGGGACAGGGAACACAGAAGTCTTCTTT,50176,7,clonotype18,clonotype18_consensus_2 +ACGAGGAGTGCTCTTC-1,True,ACGAGGAGTGCTCTTC-1_contig_3,True,620,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,19384,3,clonotype18,None +ACGATGTAGAGTCTGG-1,True,ACGATGTAGAGTCTGG-1_contig_1,True,520,TRA,TRAV8D-1,None,TRAJ33,TRAC,True,True,CATRRNYQLIW,TGTGCTACTAGGCGCAACTATCAGTTGATCTGG,12340,1,clonotype2,clonotype2_consensus_1 +ACGATGTAGAGTCTGG-1,True,ACGATGTAGAGTCTGG-1_contig_2,True,572,TRB,TRBV20,TRBD1,TRBJ1-2,TRBC1,True,True,CGVGTGGANSDYTF,TGTGGTGTCGGGACAGGGGGCGCGAACTCCGACTACACCTTC,17644,2,clonotype2,clonotype2_consensus_2 +ACGATGTAGAGTCTGG-1,True,ACGATGTAGAGTCTGG-1_contig_3,True,374,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,49202,4,clonotype2,None +ACGATGTTCAGCAACT-1,True,ACGATGTTCAGCAACT-1_contig_1,True,558,TRB,TRBV20,None,TRBJ1-1,TRBC1,True,True,CGARGENTEVFF,TGTGGTGCTAGAGGGGAAAACACAGAAGTCTTCTTT,54460,12,clonotype19,clonotype19_consensus_2 +ACGATGTTCAGCAACT-1,True,ACGATGTTCAGCAACT-1_contig_2,True,575,TRA,TRAV7D-2,None,TRAJ39,TRAC,True,True,CAASMGHNAGAKLTF,TGTGCAGCAAGCATGGGTCATAATGCAGGTGCCAAGCTCACATTC,15370,4,clonotype19,clonotype19_consensus_1 +ACGATGTTCAGCAACT-1,True,ACGATGTTCAGCAACT-1_contig_3,True,443,TRB,None,None,TRBJ1-2,TRBC1,False,False,None,None,5918,2,clonotype19,None +ACGGCCAAGCCTCGTG-1,True,ACGGCCAAGCCTCGTG-1_contig_1,True,591,TRA,TRAV7D-4,None,TRAJ30,TRAC,True,True,CAADDTNAYKVIF,TGTGCAGCTGATGACACAAATGCTTACAAAGTCATCTTT,17380,6,clonotype20,clonotype20_consensus_1 +ACGGCCAAGCCTCGTG-1,True,ACGGCCAAGCCTCGTG-1_contig_2,True,368,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,36760,2,clonotype20,None +ACGGCCAAGCCTCGTG-1,True,ACGGCCAAGCCTCGTG-1_contig_3,True,516,TRB,TRBV26,None,TRBJ1-2,TRBC1,True,False,CQQPGQGGSDYTF,TGCCAGCAGCCGGGACAGGGGGGATCCGACTACACCTTC,24086,4,clonotype20,None +ACGGGCTAGTGTTGAA-1,True,ACGGGCTAGTGTTGAA-1_contig_1,True,694,TRB,TRBV19,None,TRBJ2-4,TRBC2,True,True,CASSSDWGLSQNTLYF,TGTGCCAGCAGTAGCGACTGGGGCCTGAGTCAAAACACCTTGTACTTT,38194,3,clonotype21,clonotype21_consensus_2 +ACGGGCTAGTGTTGAA-1,True,ACGGGCTAGTGTTGAA-1_contig_2,True,456,TRA,TRAV16N,None,TRAJ45,None,True,True,CAMRETGGADRLTF,TGTGCTATGAGAGAGACAGGAGGTGCAGATAGACTCACCTTT,10180,1,clonotype21,clonotype21_consensus_1 +ACGGGCTAGTGTTGAA-1,True,ACGGGCTAGTGTTGAA-1_contig_3,True,475,TRA,TRAV12D-2,None,TRAJ42,TRAC,True,False,None,None,28160,2,clonotype21,None +ACTATCTAGAAAGTGG-1,True,ACTATCTAGAAAGTGG-1_contig_1,True,605,TRA,TRAV14N-3,None,TRAJ32,TRAC,True,True,CAARSYGGSGNKLIF,TGTGCAGCAAGGTCTTATGGGGGCAGTGGCAACAAGCTCATCTTT,10062,5,clonotype1,clonotype1_consensus_2 +ACTATCTAGAAAGTGG-1,True,ACTATCTAGAAAGTGG-1_contig_2,True,529,TRB,TRBV10,None,TRBJ1-2,TRBC1,True,True,CASSDDRGDSDYTF,TGTGCCAGCAGCGATGACAGGGGAGACTCCGACTACACCTTC,17200,8,clonotype1,clonotype1_consensus_1 +ACTATCTAGAAAGTGG-1,True,ACTATCTAGAAAGTGG-1_contig_3,True,375,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,49448,9,clonotype1,None +AGATTGCAGAGAACAG-1,True,AGATTGCAGAGAACAG-1_contig_1,True,552,TRA,TRAV3-3,None,TRAJ15,TRAC,True,True,CAVSYQGGRALIF,TGCGCAGTCAGCTACCAGGGAGGCAGAGCTCTGATATTT,23090,9,clonotype22,clonotype22_consensus_1 +AGATTGCAGAGAACAG-1,True,AGATTGCAGAGAACAG-1_contig_2,True,574,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-3,TRBC2,True,True,CASGAGQGSAETLYF,TGTGCCAGCGGGGCGGGACAGGGGAGTGCAGAAACGCTGTATTTT,33118,11,clonotype22,clonotype22_consensus_3 +AGATTGCAGAGAACAG-1,True,AGATTGCAGAGAACAG-1_contig_3,True,528,TRA,TRAV6-2,None,TRAJ11,TRAC,True,True,CVLGDSGYNKLTF,TGTGTTCTGGGTGACTCGGGATACAACAAACTCACTTTT,8526,4,clonotype22,clonotype22_consensus_2 +AGATTGCAGAGAACAG-1,True,AGATTGCAGAGAACAG-1_contig_4,True,347,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,13902,3,clonotype22,None +AGCCTAAGTGACCAAG-1,True,AGCCTAAGTGACCAAG-1_contig_1,True,519,TRB,TRBV5,None,TRBJ2-2,TRBC2,True,True,CASSQELNTGQLYF,TGTGCCAGCAGCCAAGAACTGAACACCGGGCAGCTCTACTTT,25916,3,clonotype23,clonotype23_consensus_2 +AGCCTAAGTGACCAAG-1,True,AGCCTAAGTGACCAAG-1_contig_2,True,591,TRA,TRAV13-1,None,TRAJ40,TRAC,True,True,CAMERGGNYKYVF,TGTGCTATGGAACGGGGAGGAAACTACAAATACGTCTTT,42470,5,clonotype23,clonotype23_consensus_1 +AGCCTAAGTGACCAAG-1,True,AGCCTAAGTGACCAAG-1_contig_3,True,562,TRA,TRAV12-1,None,TRAJ17,TRAC,True,True,CALRALSAGNKLTF,TGTGCTCTGAGGGCTCTCAGTGCAGGGAACAAGCTAACTTTT,10760,2,clonotype23,clonotype23_consensus_3 +AGGCCGTTCGCTTAGA-1,True,AGGCCGTTCGCTTAGA-1_contig_1,True,562,TRB,TRBV1,None,TRBJ2-7,TRBC2,True,True,CTCSAETYEQYF,TGCACCTGCAGTGCAGAGACATATGAACAGTACTTC,33608,5,clonotype24,clonotype24_consensus_1 +AGGCCGTTCGCTTAGA-1,True,AGGCCGTTCGCTTAGA-1_contig_2,True,570,TRA,TRAV4-4-DV10,None,TRAJ49,TRAC,True,True,CAAEGYQNFYF,TGTGCTGCTGAGGGTTACCAGAACTTCTATTTT,26274,5,clonotype24,clonotype24_consensus_2 +AGGCCGTTCGCTTAGA-1,True,AGGCCGTTCGCTTAGA-1_contig_3,True,337,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,14844,5,clonotype24,None +AGGTCATAGAAGGACA-1,True,AGGTCATAGAAGGACA-1_contig_1,True,521,TRA,TRAV6D-4,None,TRAJ21,TRAC,True,True,CALVKPNYNVLYF,TGTGCTCTGGTTAAGCCTAATTACAACGTGCTTTACTTC,26278,7,clonotype25,clonotype25_consensus_2 +AGGTCATAGAAGGACA-1,True,AGGTCATAGAAGGACA-1_contig_2,True,699,TRB,TRBV19,None,TRBJ1-3,TRBC1,True,True,CASSMTAFSGNTLYF,TGTGCCAGCAGTATGACAGCTTTTTCTGGAAATACGCTCTATTTT,48046,11,clonotype25,clonotype25_consensus_1 +AGGTCATAGCTTATCG-1,True,AGGTCATAGCTTATCG-1_contig_1,True,718,TRB,TRBV19,None,TRBJ1-1,TRBC1,True,True,CASSTTGYNTEVFF,TGTGCCAGCAGTACTACAGGGTACAACACAGAAGTCTTCTTT,18914,2,clonotype26,clonotype26_consensus_1 +AGGTCATAGCTTATCG-1,True,AGGTCATAGCTTATCG-1_contig_2,True,335,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,54420,4,clonotype26,None +AGTCTTTGTGTAAGTA-1,True,AGTCTTTGTGTAAGTA-1_contig_1,True,536,TRA,TRAV6-2,None,TRAJ33,TRAC,True,True,CVLGDSNYQLIW,TGTGTTCTGGGGGATAGCAACTATCAGTTGATCTGG,61020,5,clonotype27,clonotype27_consensus_1 +AGTCTTTGTGTAAGTA-1,True,AGTCTTTGTGTAAGTA-1_contig_2,True,417,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,14288,3,clonotype27,None +ATCATGGCAATGCCAT-1,True,ATCATGGCAATGCCAT-1_contig_1,True,567,TRA,TRAV2,None,TRAJ43,TRAC,True,True,CIVTDRNNNNAPRF,TGCATTGTGACTGACAGGAATAACAACAATGCCCCACGATTT,40630,3,clonotype28,clonotype28_consensus_2 +ATCATGGCAATGCCAT-1,True,ATCATGGCAATGCCAT-1_contig_2,True,519,TRB,TRBV17,None,TRBJ2-7,TRBC2,True,True,CASSRGRGEQYF,TGTGCTAGCAGTAGAGGGCGGGGGGAACAGTACTTC,37806,3,clonotype28,clonotype28_consensus_1 +ATCATGGCATGTCTCC-1,True,ATCATGGCATGTCTCC-1_contig_1,True,552,TRB,TRBV20,TRBD1,TRBJ1-2,TRBC1,True,True,CGVGTGGANSDYTF,TGTGGTGTCGGGACAGGGGGCGCGAACTCCGACTACACCTTC,35824,10,clonotype3,clonotype3_consensus_1 +ATCATGGCATGTCTCC-1,True,ATCATGGCATGTCTCC-1_contig_2,True,368,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,21608,5,clonotype3,None +ATCATGGCATGTCTCC-1,True,ATCATGGCATGTCTCC-1_contig_3,True,352,TRB,TRBV19,None,TRBJ1-6,TRBC1,True,False,None,None,11674,3,clonotype3,None +ATCATGGGTCCCTACT-1,True,ATCATGGGTCCCTACT-1_contig_1,True,724,TRB,TRBV19,None,TRBJ2-4,TRBC2,True,True,CASSIWGGLSQNTLYF,TGTGCCAGCAGTATTTGGGGGGGCTTGAGTCAAAACACCTTGTACTTT,43558,5,clonotype29,clonotype29_consensus_1 +ATCATGGGTCCCTACT-1,True,ATCATGGGTCCCTACT-1_contig_2,True,558,TRA,TRAV16N,None,TRAJ56,TRAC,True,True,CAALLATGGNNKLTF,TGTGCTGCCCTTTTGGCTACTGGAGGCAATAATAAGCTGACTTTT,34388,5,clonotype29,clonotype29_consensus_2 +ATCCACCGTACAGCAG-1,True,ATCCACCGTACAGCAG-1_contig_1,True,556,TRA,TRAV8D-2,None,TRAJ49,TRAC,True,True,CATDNTGYQNFYF,TGTGCTACAGACAACACGGGTTACCAGAACTTCTATTTT,9352,1,clonotype30,clonotype30_consensus_2 +ATCCACCGTACAGCAG-1,True,ATCCACCGTACAGCAG-1_contig_2,True,628,TRA,TRAV17,None,TRAJ50,TRAC,True,True,CALDMGASSSFSKLVF,TGTGCACTGGACATGGGGGCATCCTCCTCCTTCAGCAAGCTGGTGTTT,10728,4,clonotype30,clonotype30_consensus_1 +ATCCACCGTACAGCAG-1,True,ATCCACCGTACAGCAG-1_contig_3,True,521,TRB,TRBV13-1,None,TRBJ2-1,TRBC2,True,True,CASSDRWGRWAEQFF,TGTGCCAGCAGTGATCGCTGGGGGAGGTGGGCTGAGCAGTTCTTC,25262,2,clonotype30,clonotype30_consensus_3 +ATCCACCGTACAGCAG-1,True,ATCCACCGTACAGCAG-1_contig_4,True,448,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,32064,2,clonotype30,None +ATGGGAGGTCTCTCTG-1,True,ATGGGAGGTCTCTCTG-1_contig_1,True,544,TRB,TRBV10,None,TRBJ1-2,TRBC1,True,True,CASSDDRGDSDYTF,TGTGCCAGCAGCGATGACAGGGGAGACTCCGACTACACCTTC,33094,2,clonotype1,clonotype1_consensus_1 +ATGGGAGGTCTCTCTG-1,True,ATGGGAGGTCTCTCTG-1_contig_2,True,644,TRA,TRAV14N-3,None,TRAJ32,TRAC,True,True,CAARSYGGSGNKLIF,TGTGCAGCAAGGTCTTATGGGGGCAGTGGCAACAAGCTCATCTTT,30250,3,clonotype1,clonotype1_consensus_2 +ATGGGAGGTCTCTCTG-1,True,ATGGGAGGTCTCTCTG-1_contig_3,True,603,TRB,TRBV3,None,TRBJ2-3,TRBC2,True,False,CTSVPAAWGVSAETLYF,TGTACTTCTGTGCCAGCAGCCTGGGGAGTTAGTGCAGAAACGCTGTATTTT,15442,2,clonotype1,None +ATTGGACCAGGTCCAC-1,True,ATTGGACCAGGTCCAC-1_contig_1,True,547,TRB,TRBV10,None,TRBJ2-5,TRBC2,True,True,CASSQTGGNQDTQYF,TGTGCCAGCAGCCAGACTGGGGGTAACCAAGACACCCAGTACTTT,64478,5,clonotype31,clonotype31_consensus_1 +CAACTAGAGGGATACC-1,True,CAACTAGAGGGATACC-1_contig_1,True,511,TRB,TRBV31,None,TRBJ1-4,TRBC1,True,True,CAWSRGTAPVF,TGTGCCTGGAGTCGCGGGACAGCCCCTGTTTTC,63324,3,clonotype32,clonotype32_consensus_1 +CAACTAGAGGGATACC-1,True,CAACTAGAGGGATACC-1_contig_2,True,548,TRA,TRAV9-1,None,TRAJ52,TRAC,True,True,CAVSAGGANTGKLTF,TGTGCTGTGAGCGCGGGTGGAGCTAACACTGGAAAGCTCACGTTT,5574,2,clonotype32,clonotype32_consensus_2 +CAACTAGAGGGATACC-1,True,CAACTAGAGGGATACC-1_contig_3,True,301,TRA,None,None,TRAJ44,TRAC,False,False,None,None,6878,2,clonotype32,None +CACACCTAGGGCACTA-1,True,CACACCTAGGGCACTA-1_contig_1,True,715,TRB,TRBV19,None,TRBJ1-1,TRBC1,True,True,CASSIHANTEVFF,TGTGCCAGCAGTATCCACGCAAACACAGAAGTCTTCTTT,29540,14,clonotype33,clonotype33_consensus_1 +CACACCTAGGGCACTA-1,True,CACACCTAGGGCACTA-1_contig_2,True,545,TRA,TRAV9-1,None,TRAJ56,TRAC,True,True,CAVSATGGNNKLTF,TGTGCTGTGAGCGCTACTGGAGGCAATAATAAGCTGACTTTT,12960,10,clonotype33,clonotype33_consensus_2 +CACACCTAGGGCACTA-1,True,CACACCTAGGGCACTA-1_contig_3,True,857,TRB,None,None,TRBJ2-5,TRBC2,False,False,None,None,29750,14,clonotype33,None +CACACCTAGGGCACTA-1,True,CACACCTAGGGCACTA-1_contig_4,True,533,Multi,TRDV1,None,TRAJ57,TRAC,True,False,None,None,3470,2,clonotype33,None +CACCACTAGTTAGCGG-1,True,CACCACTAGTTAGCGG-1_contig_1,True,571,TRB,TRBV20,TRBD1,TRBJ1-2,TRBC1,True,True,CGVGTGGANSDYTF,TGTGGTGTCGGGACAGGGGGCGCGAACTCCGACTACACCTTC,40196,2,clonotype2,clonotype2_consensus_2 +CACCACTAGTTAGCGG-1,True,CACCACTAGTTAGCGG-1_contig_2,True,520,TRA,TRAV8D-1,None,TRAJ33,TRAC,True,True,CATRRNYQLIW,TGTGCTACTAGGCGCAACTATCAGTTGATCTGG,15296,1,clonotype2,clonotype2_consensus_1 +CACCACTAGTTAGCGG-1,True,CACCACTAGTTAGCGG-1_contig_3,True,341,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,23522,1,clonotype2,None +CACCACTGTTTGTTGG-1,True,CACCACTGTTTGTTGG-1_contig_1,True,570,TRB,TRBV20,TRBD1,TRBJ1-2,TRBC1,True,True,CGVGTGGANSDYTF,TGTGGTGTCGGGACAGGGGGCGCGAACTCCGACTACACCTTC,33008,5,clonotype2,clonotype2_consensus_2 +CACCACTGTTTGTTGG-1,True,CACCACTGTTTGTTGG-1_contig_2,True,522,TRA,TRAV8D-1,None,TRAJ33,TRAC,True,True,CATRRNYQLIW,TGTGCTACTAGGCGCAACTATCAGTTGATCTGG,14468,2,clonotype2,clonotype2_consensus_1 +CACCACTGTTTGTTGG-1,True,CACCACTGTTTGTTGG-1_contig_3,True,328,TRB,None,None,TRBJ1-6,TRBC1,False,False,None,None,10842,1,clonotype2,None +CACCACTGTTTGTTGG-1,True,CACCACTGTTTGTTGG-1_contig_4,True,362,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,17386,2,clonotype2,None +CAGCGACGTGAAAGAG-1,True,CAGCGACGTGAAAGAG-1_contig_1,True,547,TRB,TRBV10,None,TRBJ2-2,TRBC2,True,True,CASSYWVANTGQLYF,TGTGCCAGCAGCTACTGGGTCGCAAACACCGGGCAGCTCTACTTT,22272,4,clonotype34,clonotype34_consensus_2 +CAGCGACGTGAAAGAG-1,True,CAGCGACGTGAAAGAG-1_contig_2,True,526,TRA,TRAV13-4-DV7,None,TRAJ13,TRAC,True,True,CAMSNSGTYQRF,TGTGCTATGTCCAATTCTGGGACTTACCAGAGGTTT,37764,6,clonotype34,clonotype34_consensus_1 +CAGCGACGTGAAAGAG-1,True,CAGCGACGTGAAAGAG-1_contig_3,True,346,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,14966,1,clonotype34,None +CATCCACTCCAGATCA-1,True,CATCCACTCCAGATCA-1_contig_1,True,516,TRB,TRBV13-3,None,TRBJ2-1,TRBC2,True,True,CASRVGNEQFF,TGTGCCAGCAGAGTGGGGAATGAGCAGTTCTTC,55066,9,clonotype35,clonotype35_consensus_1 +CATCCACTCCAGATCA-1,True,CATCCACTCCAGATCA-1_contig_2,True,525,TRA,TRAV6-6,None,TRAJ30,TRAC,True,True,CALGDPTNAYKVIF,TGTGCTCTGGGTGATCCCACAAATGCTTACAAAGTCATCTTT,22958,3,clonotype35,clonotype35_consensus_2 +CATGGCGAGGGTTCCC-1,True,CATGGCGAGGGTTCCC-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSQGGGNTEVFF,TGTGCCAGCAGCCAAGGGGGGGGGAACACAGAAGTCTTCTTT,43382,5,clonotype7,clonotype7_consensus_1 +CATGGCGAGGGTTCCC-1,True,CATGGCGAGGGTTCCC-1_contig_2,True,368,TRA,TRAV9-4,None,TRAJ16,TRAC,True,False,CAVTASSGQKLVF,TGTGCTGTGACGGCTTCAAGTGGCCAGAAGCTGGTTTTT,17390,1,clonotype7,None +CCATTCGTCATTCACT-1,True,CCATTCGTCATTCACT-1_contig_1,True,531,TRB,TRBV13-2,None,TRBJ1-6,TRBC1,True,True,CASGEINYNSPLYF,TGTGCCAGCGGTGAAATCAACTATAATTCGCCCCTCTACTTT,30074,3,clonotype36,clonotype36_consensus_1 +CCATTCGTCATTCACT-1,True,CCATTCGTCATTCACT-1_contig_2,True,553,TRA,TRAV4-3,None,TRAJ34,TRAC,True,True,CAASSNTDKVVF,TGTGCTGCTTCTTCCAATACCGACAAAGTCGTCTTT,45580,7,clonotype36,clonotype36_consensus_2 +CCTATTAAGGAATCGC-1,True,CCTATTAAGGAATCGC-1_contig_1,True,571,TRB,TRBV20,TRBD1,TRBJ1-2,TRBC1,True,True,CGVGTGGANSDYTF,TGTGGTGTCGGGACAGGGGGCGCGAACTCCGACTACACCTTC,74296,3,clonotype3,clonotype3_consensus_1 +CCTCAGTCATTGAGCT-1,True,CCTCAGTCATTGAGCT-1_contig_1,True,547,TRA,TRAV6-1,None,TRAJ12,TRAC,True,True,CVLGDPGGYKVVF,TGTGTTCTGGGTGATCCTGGAGGCTATAAAGTGGTCTTT,15670,6,clonotype37,clonotype37_consensus_1 +CCTCAGTCATTGAGCT-1,True,CCTCAGTCATTGAGCT-1_contig_2,True,455,TRB,None,None,TRBJ1-2,TRBC1,False,False,None,None,12382,5,clonotype37,None +CCTCAGTCATTGAGCT-1,True,CCTCAGTCATTGAGCT-1_contig_3,True,369,TRB,TRBV2,None,TRBJ2-1,TRBC2,True,False,CASSQDRGADYAEQFF,TGTGCCAGCAGCCAAGATAGGGGGGCGGACTATGCTGAGCAGTTCTTC,5944,1,clonotype37,None +CCTCAGTCATTGAGCT-1,True,CCTCAGTCATTGAGCT-1_contig_4,True,434,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,43908,9,clonotype37,None +CCTTCGAAGCACAGGT-1,True,CCTTCGAAGCACAGGT-1_contig_1,True,652,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-5,TRBC2,True,True,CASGETINQDTQYF,TGTGCCAGCGGTGAGACAATTAACCAAGACACCCAGTACTTT,28912,14,clonotype38,clonotype38_consensus_2 +CCTTCGAAGCACAGGT-1,True,CCTTCGAAGCACAGGT-1_contig_2,True,591,TRA,TRAV7D-4,None,TRAJ7,TRAC,True,True,CAARDYSNNRLTL,TGTGCAGCTAGGGACTACAGCAACAACAGACTTACTTTG,7396,3,clonotype38,clonotype38_consensus_1 +CCTTCGAAGCACAGGT-1,True,CCTTCGAAGCACAGGT-1_contig_3,True,531,TRB,TRBV31,None,TRBJ1-4,TRBC1,True,True,CAWSPGQFNERLFF,TGTGCCTGGAGTCCGGGACAATTCAACGAAAGATTATTTTTC,8224,5,clonotype38,clonotype38_consensus_3 +CCTTCGAAGCACAGGT-1,True,CCTTCGAAGCACAGGT-1_contig_4,True,371,TRB,None,None,TRBJ2-4,TRBC2,False,False,None,None,2210,3,clonotype38,None +CCTTCGAAGCACAGGT-1,True,CCTTCGAAGCACAGGT-1_contig_5,True,521,TRB,TRBV17,None,TRBJ2-5,TRBC2,True,False,None,None,16424,6,clonotype38,None +CCTTCGAAGCACAGGT-1,True,CCTTCGAAGCACAGGT-1_contig_6,True,568,TRA,TRAV2,None,TRAJ12,TRAC,True,False,None,None,8518,3,clonotype38,None +CCTTTCTCACATGTGT-1,True,CCTTTCTCACATGTGT-1_contig_1,True,521,TRB,TRBV29,None,TRBJ2-3,TRBC2,True,True,CASSSWGGGAETLYF,TGTGCTAGCAGTTCCTGGGGGGGCGGTGCAGAAACGCTGTATTTT,46320,3,clonotype39,clonotype39_consensus_1 +CCTTTCTCACATGTGT-1,True,CCTTTCTCACATGTGT-1_contig_2,True,335,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,32062,1,clonotype39,None +CGAACATAGCCAGGAT-1,True,CGAACATAGCCAGGAT-1_contig_1,True,567,TRB,TRBV2,None,TRBJ2-5,TRBC2,True,True,CASSQDRWGKDTQYF,TGTGCCAGCAGCCAAGATAGGTGGGGGAAAGACACCCAGTACTTT,44362,6,clonotype40,clonotype40_consensus_2 +CGAACATAGCCAGGAT-1,True,CGAACATAGCCAGGAT-1_contig_2,True,551,TRA,TRAV9-1,None,TRAJ50,TRAC,True,True,CAVTGGASSSFSKLVF,TGTGCTGTGACGGGGGGAGCATCCTCCTCCTTCAGCAAGCTGGTGTTT,23390,3,clonotype40,clonotype40_consensus_1 +CGACCTTTCAGAAATG-1,True,CGACCTTTCAGAAATG-1_contig_1,True,556,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-1,TRBC2,True,True,CASGVAGANYAEQFF,TGTGCCAGCGGTGTGGCTGGGGCTAACTATGCTGAGCAGTTCTTC,63510,4,clonotype41,clonotype41_consensus_1 +CGACCTTTCAGAAATG-1,True,CGACCTTTCAGAAATG-1_contig_2,True,544,TRA,TRAV14D-1,None,TRAJ52,TRAC,True,False,None,None,12090,2,clonotype41,None +CGAGAAGCAAACCTAC-1,True,CGAGAAGCAAACCTAC-1_contig_1,True,568,TRB,TRBV20,TRBD1,TRBJ1-2,TRBC1,True,True,CGVGTGGANSDYTF,TGTGGTGTCGGGACAGGGGGCGCGAACTCCGACTACACCTTC,53084,2,clonotype2,clonotype2_consensus_2 +CGAGAAGCAAACCTAC-1,True,CGAGAAGCAAACCTAC-1_contig_2,True,538,TRA,TRAV8D-1,None,TRAJ33,TRAC,True,True,CATRRNYQLIW,TGTGCTACTAGGCGCAACTATCAGTTGATCTGG,25904,1,clonotype2,clonotype2_consensus_1 +CGAGCACCACCAGGCT-1,True,CGAGCACCACCAGGCT-1_contig_1,True,514,TRB,TRBV13-1,None,TRBJ2-7,TRBC2,True,True,CASSDAGVSSYEQYF,TGTGCCAGCAGTGATGCGGGGGTGAGCTCCTATGAACAGTACTTC,51494,20,clonotype42,clonotype42_consensus_1 +CGAGCACCACCAGGCT-1,True,CGAGCACCACCAGGCT-1_contig_2,True,591,TRA,TRAV7-4,None,TRAJ9,TRAC,True,True,CAASEDMGYKLTF,TGTGCAGCTAGTGAAGACATGGGCTACAAACTTACCTTC,2194,1,clonotype42,clonotype42_consensus_2 +CGAGCACCACCAGGCT-1,True,CGAGCACCACCAGGCT-1_contig_3,True,353,TRB,None,None,TRBJ1-6,TRBC1,False,False,None,None,3746,1,clonotype42,None +CGAGCACCACCAGGCT-1,True,CGAGCACCACCAGGCT-1_contig_4,True,356,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,18838,6,clonotype42,None +CGCGGTAGTCTGATTG-1,True,CGCGGTAGTCTGATTG-1_contig_1,True,571,TRA,TRAV14N-3,None,TRAJ32,TRAC,True,True,CAARSYGGSGNKLIF,TGTGCAGCAAGGTCTTATGGGGGCAGTGGCAACAAGCTCATCTTT,9748,5,clonotype1,clonotype1_consensus_2 +CGCGGTAGTCTGATTG-1,True,CGCGGTAGTCTGATTG-1_contig_2,True,544,TRB,TRBV10,None,TRBJ1-2,TRBC1,True,True,CASSDDRGDSDYTF,TGTGCCAGCAGCGATGACAGGGGAGACTCCGACTACACCTTC,9594,5,clonotype1,clonotype1_consensus_1 +CGCGGTAGTCTGATTG-1,True,CGCGGTAGTCTGATTG-1_contig_3,True,315,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,56320,15,clonotype1,None +CGCGTTTCATCATCCC-1,True,CGCGTTTCATCATCCC-1_contig_1,True,562,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-7,TRBC2,True,True,CASGVTGGYEQYF,TGTGCCAGCGGTGTGACTGGGGGGTATGAACAGTACTTC,8912,4,clonotype43,clonotype43_consensus_1 +CGCGTTTCATCATCCC-1,True,CGCGTTTCATCATCCC-1_contig_2,True,597,TRA,TRAV14D-3-DV8,None,TRAJ43,TRAC,True,True,CAASNNNNAPRF,TGTGCAGCAAGTAATAACAACAATGCCCCACGATTT,13076,6,clonotype43,clonotype43_consensus_2 +CGCGTTTCATCATCCC-1,True,CGCGTTTCATCATCCC-1_contig_3,True,443,TRB,None,None,TRBJ1-2,TRBC1,False,False,None,None,46608,17,clonotype43,None +CGCGTTTCATCATCCC-1,True,CGCGTTTCATCATCCC-1_contig_4,True,444,TRA,None,None,TRAJ41,TRAC,False,False,None,None,4224,1,clonotype43,None +CGCGTTTCATCATCCC-1,True,CGCGTTTCATCATCCC-1_contig_5,True,317,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,5766,1,clonotype43,None +CGCGTTTCATGATCCA-1,True,CGCGTTTCATGATCCA-1_contig_1,True,583,TRA,TRAV6-6,None,TRAJ45,TRAC,True,True,CALEGGADRLTF,TGTGCTCTGGAGGGAGGTGCAGATAGACTCACCTTT,66552,5,clonotype44,clonotype44_consensus_1 +CGCGTTTCATGATCCA-1,True,CGCGTTTCATGATCCA-1_contig_2,True,670,TRB,TRBV19,None,TRBJ2-4,TRBC2,True,True,CASSIYGGTSQNTLYF,TGTGCCAGCAGTATATATGGGGGGACTAGTCAAAACACCTTGTACTTT,11324,1,clonotype44,clonotype44_consensus_2 +CGCTATCAGGTGATTA-1,True,CGCTATCAGGTGATTA-1_contig_1,True,522,TRB,TRBV17,None,TRBJ1-1,TRBC1,True,True,CASSMGANTEVFF,TGTGCTAGCAGTATGGGTGCAAACACAGAAGTCTTCTTT,20564,6,clonotype45,clonotype45_consensus_2 +CGCTATCAGGTGATTA-1,True,CGCTATCAGGTGATTA-1_contig_2,True,549,TRA,TRAV6-6,None,TRAJ16,TRAC,True,True,CALRTSSGQKLVF,TGTGCTCTGAGAACTTCAAGTGGCCAGAAGCTGGTTTTT,12520,4,clonotype45,clonotype45_consensus_1 +CGCTATCAGGTGATTA-1,True,CGCTATCAGGTGATTA-1_contig_3,True,510,TRB,TRBV13-3,None,TRBJ2-7,TRBC2,True,False,CQQPWGSSYEQYF,TGCCAGCAGCCCTGGGGGAGCTCCTATGAACAGTACTTC,28924,5,clonotype45,None +CGCTATCAGGTGATTA-1,True,CGCTATCAGGTGATTA-1_contig_4,True,388,TRA,TRAV4D-4,None,TRAJ2,TRAC,False,False,None,None,14162,2,clonotype45,None +CGGACTGTCCACGAAT-1,True,CGGACTGTCCACGAAT-1_contig_1,True,579,TRA,TRAV14N-3,None,TRAJ32,TRAC,True,True,CAARSYGGSGNKLIF,TGTGCAGCAAGGTCTTATGGGGGCAGTGGCAACAAGCTCATCTTT,35374,15,clonotype1,clonotype1_consensus_2 +CGGACTGTCCACGAAT-1,True,CGGACTGTCCACGAAT-1_contig_2,True,508,TRB,TRBV10,None,TRBJ1-2,TRBC1,True,True,CASSDDRGDSDYTF,TGTGCCAGCAGCGATGACAGGGGAGACTCCGACTACACCTTC,27986,7,clonotype1,clonotype1_consensus_1 +CGGACTGTCCACGAAT-1,True,CGGACTGTCCACGAAT-1_contig_3,True,388,TRB,None,None,TRBJ1-5,TRBC1,False,False,None,None,14024,3,clonotype1,None +CGGAGTCCATTCACTT-1,True,CGGAGTCCATTCACTT-1_contig_1,True,524,TRB,TRBV10,None,TRBJ1-2,TRBC1,True,True,CASSDDRGDSDYTF,TGTGCCAGCAGCGATGACAGGGGAGACTCCGACTACACCTTC,52182,6,clonotype1,clonotype1_consensus_1 +CGGAGTCCATTCACTT-1,True,CGGAGTCCATTCACTT-1_contig_2,True,606,TRA,TRAV14N-3,None,TRAJ32,TRAC,True,True,CAARSYGGSGNKLIF,TGTGCAGCAAGGTCTTATGGGGGCAGTGGCAACAAGCTCATCTTT,20368,3,clonotype1,clonotype1_consensus_2 +CGGCTAGAGTTAGCGG-1,True,CGGCTAGAGTTAGCGG-1_contig_1,True,551,TRA,TRAV9-1,None,TRAJ50,TRAC,True,True,CAVTGGASSSFSKLVF,TGTGCTGTGACGGGGGGAGCATCCTCCTCCTTCAGCAAGCTGGTGTTT,39714,7,clonotype46,clonotype46_consensus_1 +CGGCTAGAGTTAGCGG-1,True,CGGCTAGAGTTAGCGG-1_contig_2,True,337,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,29520,2,clonotype46,None +CGTGAGCGTACCGGCT-1,True,CGTGAGCGTACCGGCT-1_contig_1,True,607,TRA,TRAV14N-3,None,TRAJ32,TRAC,True,True,CAARSYGGSGNKLIF,TGTGCAGCAAGGTCTTATGGGGGCAGTGGCAACAAGCTCATCTTT,24242,5,clonotype1,clonotype1_consensus_2 +CGTGAGCGTACCGGCT-1,True,CGTGAGCGTACCGGCT-1_contig_2,True,525,TRB,TRBV10,None,TRBJ1-2,TRBC1,True,True,CASSDDRGDSDYTF,TGTGCCAGCAGCGATGACAGGGGAGACTCCGACTACACCTTC,49894,9,clonotype1,clonotype1_consensus_1 +CGTTGGGTCGTTGACA-1,True,CGTTGGGTCGTTGACA-1_contig_1,True,701,TRB,TRBV19,None,TRBJ1-2,TRBC1,True,True,CASRDANSDYTF,TGTGCCAGCAGGGACGCAAACTCCGACTACACCTTC,55706,13,clonotype8,clonotype8_consensus_2 +CGTTGGGTCGTTGACA-1,True,CGTTGGGTCGTTGACA-1_contig_2,True,527,TRA,TRAV6N-7,None,TRAJ49,TRAC,True,True,CALGEPGYQNFYF,TGTGCTCTGGGTGAACCGGGTTACCAGAACTTCTATTTT,14996,4,clonotype8,clonotype8_consensus_1 +CGTTGGGTCGTTGACA-1,True,CGTTGGGTCGTTGACA-1_contig_3,True,302,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,2764,1,clonotype8,None +CTAACTTTCGAATCCA-1,True,CTAACTTTCGAATCCA-1_contig_1,True,695,TRB,TRBV19,None,TRBJ1-1,TRBC1,True,True,CASSIHANTEVFF,TGTGCCAGCAGTATCCACGCAAACACAGAAGTCTTCTTT,12774,3,clonotype47,clonotype47_consensus_1 +CTAACTTTCGAATCCA-1,True,CTAACTTTCGAATCCA-1_contig_2,True,434,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,42260,7,clonotype47,None +CTAACTTTCGAATCCA-1,True,CTAACTTTCGAATCCA-1_contig_3,True,491,TRA,TRAV9-1,None,TRAJ56,TRAC,True,False,CAVSATGGNNKLTF,TGTGCTGTGAGCGCTACTGGAGGCAATAATAAGCTGACTTTT,20918,4,clonotype47,None +CTAGAGTGTTATGCGT-1,True,CTAGAGTGTTATGCGT-1_contig_1,True,543,TRA,TRAV7D-3,None,TRAJ43,TRAC,True,True,CAALNNNNAPRF,TGTGCAGCCTTGAATAACAACAATGCCCCACGATTT,18042,2,clonotype48,clonotype48_consensus_1 +CTAGAGTGTTATGCGT-1,True,CTAGAGTGTTATGCGT-1_contig_2,True,568,TRB,TRBV1,None,TRBJ2-7,TRBC2,True,True,CTCSADGSSYEQYF,TGCACCTGCAGTGCAGACGGAAGCTCCTATGAACAGTACTTC,27708,6,clonotype48,clonotype48_consensus_2 +CTAGAGTGTTATGCGT-1,True,CTAGAGTGTTATGCGT-1_contig_3,True,536,TRA,TRAV6N-7,None,TRAJ42,TRAC,True,False,CSGRYSGGSNAKLTF,TGCTCTGGGCGGTATTCTGGAGGAAGCAATGCAAAGCTAACCTTC,32632,3,clonotype48,None +CTCGGAGCAGTTCCCT-1,True,CTCGGAGCAGTTCCCT-1_contig_1,True,712,TRB,TRBV19,None,TRBJ1-1,TRBC1,True,True,CASRTGNTEVFF,TGTGCCAGCAGGACAGGGAACACAGAAGTCTTCTTT,42580,10,clonotype49,clonotype49_consensus_1 +CTCGGAGCAGTTCCCT-1,True,CTCGGAGCAGTTCCCT-1_contig_2,True,588,TRA,TRAV5-1,None,TRAJ12,TRAC,True,True,CSASSSTGGYKVVF,TGCTCAGCAAGTTCCTCGACTGGAGGCTATAAAGTGGTCTTT,12394,4,clonotype49,clonotype49_consensus_2 +CTCGGAGCAGTTCCCT-1,True,CTCGGAGCAGTTCCCT-1_contig_3,True,361,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,23230,4,clonotype49,None +CTGGTCTTCATGGTCA-1,True,CTGGTCTTCATGGTCA-1_contig_1,True,531,TRA,TRAV6-2,None,TRAJ11,TRAC,True,True,CVLGDSGYNKLTF,TGTGTTCTGGGTGACTCGGGATACAACAAACTCACTTTT,29492,3,clonotype50,clonotype50_consensus_2 +CTGGTCTTCATGGTCA-1,True,CTGGTCTTCATGGTCA-1_contig_2,True,563,TRA,TRAV3-3,None,TRAJ15,TRAC,True,True,CAVSYQGGRALIF,TGCGCAGTCAGCTACCAGGGAGGCAGAGCTCTGATATTT,29648,6,clonotype50,clonotype50_consensus_1 +CTGGTCTTCATGGTCA-1,True,CTGGTCTTCATGGTCA-1_contig_3,True,330,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,14914,1,clonotype50,None +CTGTTTATCTGGTGTA-1,True,CTGTTTATCTGGTGTA-1_contig_1,True,565,TRB,TRBV1,None,TRBJ1-1,TRBC1,True,True,CTCSADSDTEVFF,TGCACCTGCAGTGCAGATTCAGACACAGAAGTCTTCTTT,38106,9,clonotype51,clonotype51_consensus_2 +CTGTTTATCTGGTGTA-1,True,CTGTTTATCTGGTGTA-1_contig_2,True,569,TRA,TRAV4-4-DV10,None,TRAJ45,TRAC,True,True,CAAAMNTGGADRLTF,TGTGCTGCTGCCATGAATACAGGAGGTGCAGATAGACTCACCTTT,10718,2,clonotype51,clonotype51_consensus_1 +CTGTTTATCTGGTGTA-1,True,CTGTTTATCTGGTGTA-1_contig_3,True,429,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,27934,4,clonotype51,None +CTTACCGAGGTGGGTT-1,True,CTTACCGAGGTGGGTT-1_contig_1,True,512,TRA,TRAV9-4,None,TRAJ16,TRAC,True,True,CAVTASSGQKLVF,TGTGCTGTGACGGCTTCAAGTGGCCAGAAGCTGGTTTTT,13218,2,clonotype9,clonotype9_consensus_2 +CTTACCGAGGTGGGTT-1,True,CTTACCGAGGTGGGTT-1_contig_2,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSQGGGNTEVFF,TGTGCCAGCAGCCAAGGGGGGGGGAACACAGAAGTCTTCTTT,63454,5,clonotype9,clonotype9_consensus_1 +GAAATGAAGGAGCGAG-1,True,GAAATGAAGGAGCGAG-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGQGNTEVFF,TGTGCCAGCAGCCCAGGACAGGGGAACACAGAAGTCTTCTTT,73538,9,clonotype52,clonotype52_consensus_1 +GAAGCAGAGCTCCTCT-1,True,GAAGCAGAGCTCCTCT-1_contig_1,True,603,TRA,TRAV14D-3-DV8,None,TRAJ45,TRAC,True,True,CAARHTGGADRLTF,TGTGCAGCAAGGCATACAGGAGGTGCAGATAGACTCACCTTT,12868,1,clonotype4,clonotype4_consensus_2 +GAAGCAGAGCTCCTCT-1,True,GAAGCAGAGCTCCTCT-1_contig_2,True,607,TRB,TRBV19,None,TRBJ2-5,TRBC2,True,True,CASRKGTGGRDTQYF,TGTGCCAGCAGAAAAGGGACTGGGGGGAGAGACACCCAGTACTTT,39380,4,clonotype4,clonotype4_consensus_1 +GAAGCAGAGCTCCTCT-1,True,GAAGCAGAGCTCCTCT-1_contig_3,True,382,TRA,None,None,TRAJ41,TRAC,False,False,None,None,25330,1,clonotype4,None +GACAGAGAGCACCGTC-1,True,GACAGAGAGCACCGTC-1_contig_1,True,600,TRA,TRAV7D-4,None,TRAJ52,TRAC,True,True,CAASGNTGANTGKLTF,TGTGCAGCTAGTGGTAACACTGGAGCTAACACTGGAAAGCTCACGTTT,77450,4,clonotype53,clonotype53_consensus_1 +GACTGCGAGAAACCAT-1,True,GACTGCGAGAAACCAT-1_contig_1,True,516,TRB,TRBV31,None,TRBJ2-3,TRBC2,True,True,CAWRDWGRAETLYF,TGTGCCTGGAGGGACTGGGGGAGGGCAGAAACGCTGTATTTT,48596,7,clonotype10,clonotype10_consensus_1 +GACTGCGAGAAACCAT-1,True,GACTGCGAGAAACCAT-1_contig_2,True,594,TRA,TRAV7-4,None,TRAJ27,TRAC,True,True,CAASEDTNTGKLTF,TGTGCAGCTAGTGAGGACACCAATACAGGCAAATTAACCTTT,30434,5,clonotype10,clonotype10_consensus_2 +GATGAAAAGTGTGAAT-1,True,GATGAAAAGTGTGAAT-1_contig_1,True,715,TRB,TRBV19,None,TRBJ2-4,TRBC2,True,True,CASSRDNQNTLYF,TGTGCCAGCTCGCGGGACAATCAAAACACCTTGTACTTT,43282,12,clonotype54,clonotype54_consensus_2 +GATGAAAAGTGTGAAT-1,True,GATGAAAAGTGTGAAT-1_contig_2,True,586,TRA,TRAV6-6,None,TRAJ43,TRAC,True,True,CALGDRFNNNAPRF,TGTGCTCTGGGTGATCGATTTAACAACAATGCCCCACGATTT,6652,1,clonotype54,clonotype54_consensus_1 +GATGAAAAGTGTGAAT-1,True,GATGAAAAGTGTGAAT-1_contig_3,True,482,TRA,TRAV12D-2,None,TRAJ38,TRAC,True,False,CPVLLCSECLNVGDNSKLIW,TGCCCTGTACTACTGTGCTCTGAGTGCCTTAATGTTGGTGACAACAGTAAGCTGATTTGG,8674,3,clonotype54,None +GATGAAAAGTGTGAAT-1,True,GATGAAAAGTGTGAAT-1_contig_4,True,326,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,19056,3,clonotype54,None +GCAGCCACAAAGGAAG-1,True,GCAGCCACAAAGGAAG-1_contig_1,True,529,TRA,TRAV6N-7,None,TRAJ17,TRAC,True,True,CALRTNSAGNKLTF,TGTGCTCTGAGGACTAACAGTGCAGGGAACAAGCTAACTTTT,9742,8,clonotype5,clonotype5_consensus_1 +GCAGCCACAAAGGAAG-1,True,GCAGCCACAAAGGAAG-1_contig_2,True,514,TRB,TRBV14,None,TRBJ1-5,TRBC1,True,True,CASSPGTEAPLF,TGTGCCAGCAGTCCCGGGACCGAGGCTCCGCTTTTT,21206,20,clonotype5,clonotype5_consensus_2 +GCAGCCACAAAGGAAG-1,True,GCAGCCACAAAGGAAG-1_contig_3,True,407,TRB,None,None,TRBJ1-3,TRBC1,False,False,None,None,6202,10,clonotype5,None +GCAGCCACAAAGGAAG-1,True,GCAGCCACAAAGGAAG-1_contig_4,True,701,TRB,None,None,TRBJ2-5,TRBC2,False,False,None,None,21360,12,clonotype5,None +GCAGCCACAAAGGAAG-1,True,GCAGCCACAAAGGAAG-1_contig_5,True,349,TRA,TRAV6N-6,None,TRAJ17,TRAC,True,False,CALRTNSAGNKLTF,TGTGCTCTGAGGACTAACAGTGCAGGGAACAAGCTAACTTTT,2524,1,clonotype5,clonotype5_consensus_1 +GCAGCCACAAAGGAAG-1,True,GCAGCCACAAAGGAAG-1_contig_6,True,332,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,16022,9,clonotype5,None +GCAGCCACAGTTCATG-1,True,GCAGCCACAGTTCATG-1_contig_1,True,566,TRA,TRAV14D-3-DV8,None,TRAJ40,TRAC,True,True,CAASAVTGNYKYVF,TGTGCAGCAAGTGCAGTTACAGGAAACTACAAATACGTCTTT,23556,6,clonotype55,clonotype55_consensus_1 +GCAGCCACAGTTCATG-1,True,GCAGCCACAGTTCATG-1_contig_2,True,519,TRB,TRBV13-3,None,TRBJ2-5,TRBC2,True,True,CASSDTGEDTQYF,TGTGCCAGCAGTGATACAGGGGAAGACACCCAGTACTTT,21378,5,clonotype55,clonotype55_consensus_2 +GCAGCCACAGTTCATG-1,True,GCAGCCACAGTTCATG-1_contig_3,True,374,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,34082,5,clonotype55,None +GCGAGAATCCTACAGA-1,True,GCGAGAATCCTACAGA-1_contig_1,True,522,TRA,TRAV14D-2,None,TRAJ31,TRAC,True,True,CAASDDNNRIFF,TGTGCAGCAAGTGACGACAATAACAGAATCTTCTTT,45916,6,clonotype56,clonotype56_consensus_1 +GCGGGTTGTAAAGGAG-1,True,GCGGGTTGTAAAGGAG-1_contig_1,True,516,TRB,TRBV31,None,TRBJ2-3,TRBC2,True,True,CAWRDWGRAETLYF,TGTGCCTGGAGGGACTGGGGGAGGGCAGAAACGCTGTATTTT,22152,2,clonotype10,clonotype10_consensus_1 +GCGGGTTGTAAAGGAG-1,True,GCGGGTTGTAAAGGAG-1_contig_2,True,594,TRA,TRAV7-4,None,TRAJ27,TRAC,True,True,CAASEDTNTGKLTF,TGTGCAGCTAGTGAGGACACCAATACAGGCAAATTAACCTTT,29882,2,clonotype10,clonotype10_consensus_2 +GCGGGTTGTAAAGGAG-1,True,GCGGGTTGTAAAGGAG-1_contig_3,True,557,TRA,TRAV4-3,None,TRAJ30,TRAC,True,False,None,None,26254,2,clonotype10,None +GCTGCAGCAAGCCGTC-1,True,GCTGCAGCAAGCCGTC-1_contig_1,True,567,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-2,TRBC2,True,True,CASGEMENTGQLYF,TGTGCCAGCGGTGAAATGGAGAACACCGGGCAGCTCTACTTT,63236,12,clonotype57,clonotype57_consensus_2 +GCTGCAGCAAGCCGTC-1,True,GCTGCAGCAAGCCGTC-1_contig_2,True,676,TRA,TRAV9D-2,None,TRAJ56,TRAC,True,True,CAVSMATGGNNKLTF,TGTGCTGTGAGCATGGCTACTGGAGGCAATAATAAGCTGACTTTT,10264,1,clonotype57,clonotype57_consensus_1 +GCTTCCATCTTTACAC-1,True,GCTTCCATCTTTACAC-1_contig_1,True,511,TRB,TRBV13-1,None,TRBJ2-5,TRBC2,True,True,CASKRLGAQDTQYF,TGTGCCAGCAAAAGACTGGGGGCCCAAGACACCCAGTACTTT,32244,14,clonotype58,clonotype58_consensus_2 +GCTTCCATCTTTACAC-1,True,GCTTCCATCTTTACAC-1_contig_2,True,553,TRA,TRAV4-3,None,TRAJ30,TRAC,True,True,CAAETNAYKVIF,TGTGCTGCTGAAACAAATGCTTACAAAGTCATCTTT,31848,16,clonotype58,clonotype58_consensus_1 +GCTTCCATCTTTACAC-1,True,GCTTCCATCTTTACAC-1_contig_3,True,602,TRA,TRAV8D-2,None,TRAJ24,TRAC,True,False,None,None,3290,1,clonotype58,None +GCTTCCATCTTTACAC-1,True,GCTTCCATCTTTACAC-1_contig_4,True,306,TRB,None,None,TRBJ1-2,TRBC1,False,False,None,None,5690,6,clonotype58,None +GGACAAGGTCGAACAG-1,True,GGACAAGGTCGAACAG-1_contig_1,True,544,TRB,TRBV10,None,TRBJ1-2,TRBC1,True,True,CASSDDRGDSDYTF,TGTGCCAGCAGCGATGACAGGGGAGACTCCGACTACACCTTC,74196,5,clonotype59,clonotype59_consensus_1 +GGACAGAAGCTTTGGT-1,True,GGACAGAAGCTTTGGT-1_contig_1,True,713,TRB,TRBV19,None,TRBJ2-4,TRBC2,True,True,CASSSDWGLSQNTLYF,TGTGCCAGCAGTAGCGACTGGGGCCTGAGTCAAAACACCTTGTACTTT,41660,6,clonotype60,clonotype60_consensus_1 +GGACAGAAGCTTTGGT-1,True,GGACAGAAGCTTTGGT-1_contig_2,True,376,TRB,None,None,TRBJ1-2,TRBC1,False,False,None,None,22436,2,clonotype60,None +GGACAGAAGCTTTGGT-1,True,GGACAGAAGCTTTGGT-1_contig_3,True,578,TRA,TRAV12D-2,None,TRAJ42,TRAC,True,False,None,None,10464,2,clonotype60,None +GGATTACGTTCGGGCT-1,True,GGATTACGTTCGGGCT-1_contig_1,True,478,TRA,TRAV4-3,None,TRAJ31,None,True,True,CAADNNRIFF,TGTGCTGCTGACAATAACAGAATCTTCTTT,65518,3,clonotype61,clonotype61_consensus_1 +GGATTACGTTCGGGCT-1,True,GGATTACGTTCGGGCT-1_contig_2,True,541,TRB,TRBV10,None,TRBJ2-7,TRBC2,True,True,CASSTDWGYEQYF,TGTGCCAGCAGCACCGACTGGGGCTATGAACAGTACTTC,6690,3,clonotype61,clonotype61_consensus_2 +GGCAATTGTCCCGACA-1,True,GGCAATTGTCCCGACA-1_contig_1,True,517,TRB,TRBV14,None,TRBJ2-4,TRBC2,True,True,CASSFHGKNTLYF,TGTGCCAGCAGTTTCCACGGAAAAAACACCTTGTACTTT,19524,3,clonotype62,clonotype62_consensus_2 +GGCAATTGTCCCGACA-1,True,GGCAATTGTCCCGACA-1_contig_2,True,542,TRA,TRAV9-1,None,TRAJ9,TRAC,True,True,CAVRKNMGYKLTF,TGTGCTGTGAGGAAGAACATGGGCTACAAACTTACCTTC,34030,9,clonotype62,clonotype62_consensus_1 +GGCAATTGTCCCGACA-1,True,GGCAATTGTCCCGACA-1_contig_3,True,357,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,18608,4,clonotype62,None +GGCAATTGTGTCTGAT-1,True,GGCAATTGTGTCTGAT-1_contig_1,True,547,TRB,TRBV10,None,TRBJ2-2,TRBC2,True,True,CASSYWVANTGQLYF,TGTGCCAGCAGCTACTGGGTCGCAAACACCGGGCAGCTCTACTTT,30016,12,clonotype11,clonotype11_consensus_4 +GGCAATTGTGTCTGAT-1,True,GGCAATTGTGTCTGAT-1_contig_2,True,604,TRA,TRAV13-4-DV7,None,TRAJ13,TRAC,True,True,CAMSNSGTYQRF,TGTGCTATGTCCAATTCTGGGACTTACCAGAGGTTT,21508,8,clonotype11,clonotype11_consensus_2 +GGCAATTGTGTCTGAT-1,True,GGCAATTGTGTCTGAT-1_contig_3,True,550,TRB,TRBV10,None,TRBJ2-5,TRBC2,True,True,CASSYKADWGRDTQYF,TGTGCCAGCAGCTATAAGGCAGACTGGGGGAGAGACACCCAGTACTTT,11640,4,clonotype11,clonotype11_consensus_1 +GGCAATTGTGTCTGAT-1,True,GGCAATTGTGTCTGAT-1_contig_4,True,632,TRA,TRAV17,None,TRAJ34,TRAC,True,True,CALEVAASNTDKVVF,TGTGCACTGGAGGTCGCAGCTTCCAATACCGACAAAGTCGTCTTT,13898,4,clonotype11,clonotype11_consensus_3 +GGTGCGTGTGCACGAA-1,True,GGTGCGTGTGCACGAA-1_contig_1,True,514,TRB,TRBV14,None,TRBJ1-5,TRBC1,True,True,CASSPGTEAPLF,TGTGCCAGCAGTCCCGGGACCGAGGCTCCGCTTTTT,28270,20,clonotype5,clonotype5_consensus_2 +GGTGCGTGTGCACGAA-1,True,GGTGCGTGTGCACGAA-1_contig_2,True,542,TRA,TRAV6N-7,None,TRAJ17,TRAC,True,True,CALRTNSAGNKLTF,TGTGCTCTGAGGACTAACAGTGCAGGGAACAAGCTAACTTTT,22156,13,clonotype5,clonotype5_consensus_1 +GGTGCGTGTGCACGAA-1,True,GGTGCGTGTGCACGAA-1_contig_3,True,315,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,2468,1,clonotype5,None +GGTGCGTGTGCACGAA-1,True,GGTGCGTGTGCACGAA-1_contig_4,True,579,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,16600,9,clonotype5,None +GGTGCGTGTGCACGAA-1,True,GGTGCGTGTGCACGAA-1_contig_5,True,326,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,5686,5,clonotype5,None +GGTGTTAAGACCACGA-1,True,GGTGTTAAGACCACGA-1_contig_1,True,570,TRB,TRBV20,None,TRBJ1-2,TRBC1,True,True,CGARRQSNSDYTF,TGTGGTGCTAGACGACAATCAAACTCCGACTACACCTTC,68162,9,clonotype63,clonotype63_consensus_2 +GGTGTTAAGACCACGA-1,True,GGTGTTAAGACCACGA-1_contig_2,True,676,TRA,TRAV9-4,None,TRAJ50,TRAC,True,True,CAVSIASSSFSKLVF,TGTGCTGTGAGCATAGCATCCTCCTCCTTCAGCAAGCTGGTGTTT,8316,1,clonotype63,clonotype63_consensus_1 +GTACTCCGTTATTCTC-1,True,GTACTCCGTTATTCTC-1_contig_1,True,597,TRA,TRAV14N-3,None,TRAJ32,TRAC,True,True,CAARSYGGSGNKLIF,TGTGCAGCAAGGTCTTATGGGGGCAGTGGCAACAAGCTCATCTTT,14644,4,clonotype1,clonotype1_consensus_2 +GTACTCCGTTATTCTC-1,True,GTACTCCGTTATTCTC-1_contig_2,True,544,TRB,TRBV10,None,TRBJ1-2,TRBC1,True,True,CASSDDRGDSDYTF,TGTGCCAGCAGCGATGACAGGGGAGACTCCGACTACACCTTC,59060,11,clonotype1,clonotype1_consensus_1 +GTACTTTCACGTCAGC-1,True,GTACTTTCACGTCAGC-1_contig_1,True,521,TRA,TRAV6-5,None,TRAJ30,TRAC,True,True,CALSENTNAYKVIF,TGTGCTCTGAGTGAGAACACAAATGCTTACAAAGTCATCTTT,20710,5,clonotype64,clonotype64_consensus_1 +GTACTTTCACGTCAGC-1,True,GTACTTTCACGTCAGC-1_contig_2,True,612,TRB,TRBV2,None,TRBJ1-6,TRBC1,True,True,CASSQGQGNNSPLYF,TGTGCCAGCAGCCAAGGACAGGGGAATAATTCGCCCCTCTACTTT,19528,6,clonotype64,clonotype64_consensus_2 +GTACTTTCACGTCAGC-1,True,GTACTTTCACGTCAGC-1_contig_3,True,326,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,13394,2,clonotype64,None +GTACTTTCACGTCAGC-1,True,GTACTTTCACGTCAGC-1_contig_4,True,547,TRA,TRAV5-1,None,TRAJ26,TRAC,True,False,None,None,17324,3,clonotype64,None +GTAGTCAGTAAATGAC-1,True,GTAGTCAGTAAATGAC-1_contig_1,True,534,TRA,TRAV6N-7,None,TRAJ58,TRAC,True,True,CALGVQGTGSKLSF,TGTGCTCTGGGTGTGCAAGGCACTGGGTCTAAGCTGTCATTT,34850,6,clonotype65,clonotype65_consensus_1 +GTAGTCAGTAAATGAC-1,True,GTAGTCAGTAAATGAC-1_contig_2,True,525,TRB,TRBV5,None,TRBJ2-3,TRBC2,True,True,CASSQDWVGGAETLYF,TGTGCCAGCAGCCAAGATTGGGTTGGGGGTGCAGAAACGCTGTATTTT,29314,3,clonotype65,clonotype65_consensus_2 +GTAGTCAGTAAATGAC-1,True,GTAGTCAGTAAATGAC-1_contig_3,True,610,TRB,TRBV3,None,TRBJ2-4,TRBC2,True,False,CQQLTGLGTSQNTLYF,TGCCAGCAGCTCACGGGACTGGGGACTAGTCAAAACACCTTGTACTTT,12570,4,clonotype65,None +GTAGTCAGTAAATGAC-1,True,GTAGTCAGTAAATGAC-1_contig_4,True,552,TRA,TRAV15-2-DV6-2,None,TRAJ45,TRAC,True,False,None,None,424,5,clonotype65,None +GTATCTTGTACAAGTA-1,True,GTATCTTGTACAAGTA-1_contig_1,True,529,TRA,TRAV6N-7,None,TRAJ17,TRAC,True,True,CALRTNSAGNKLTF,TGTGCTCTGAGGACTAACAGTGCAGGGAACAAGCTAACTTTT,25644,20,clonotype5,clonotype5_consensus_1 +GTATCTTGTACAAGTA-1,True,GTATCTTGTACAAGTA-1_contig_2,True,515,TRB,TRBV14,None,TRBJ1-5,TRBC1,True,True,CASSPGTEAPLF,TGTGCCAGCAGTCCCGGGACCGAGGCTCCGCTTTTT,22744,9,clonotype5,clonotype5_consensus_2 +GTATCTTGTACAAGTA-1,True,GTATCTTGTACAAGTA-1_contig_3,True,319,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,15054,5,clonotype5,None +GTATCTTGTACAAGTA-1,True,GTATCTTGTACAAGTA-1_contig_4,True,439,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,2778,1,clonotype5,None +GTCACAAGTACCGTTA-1,True,GTCACAAGTACCGTTA-1_contig_1,True,547,TRB,TRBV10,None,TRBJ2-2,TRBC2,True,True,CASSYWVANTGQLYF,TGTGCCAGCAGCTACTGGGTCGCAAACACCGGGCAGCTCTACTTT,16776,3,clonotype11,clonotype11_consensus_4 +GTCACAAGTACCGTTA-1,True,GTCACAAGTACCGTTA-1_contig_2,True,550,TRB,TRBV10,None,TRBJ2-5,TRBC2,True,True,CASSYKADWGRDTQYF,TGTGCCAGCAGCTATAAGGCAGACTGGGGGAGAGACACCCAGTACTTT,12570,3,clonotype11,clonotype11_consensus_1 +GTCACAAGTACCGTTA-1,True,GTCACAAGTACCGTTA-1_contig_3,True,612,TRA,TRAV13-4-DV7,None,TRAJ13,TRAC,True,True,CAMSNSGTYQRF,TGTGCTATGTCCAATTCTGGGACTTACCAGAGGTTT,39452,6,clonotype11,clonotype11_consensus_2 +GTCACAAGTACCGTTA-1,True,GTCACAAGTACCGTTA-1_contig_4,True,601,TRA,TRAV17,None,TRAJ34,TRAC,True,True,CALEVAASNTDKVVF,TGTGCACTGGAGGTCGCAGCTTCCAATACCGACAAAGTCGTCTTT,8030,2,clonotype11,clonotype11_consensus_3 +GTCCTCAGTAGCTAAA-1,True,GTCCTCAGTAGCTAAA-1_contig_1,True,522,TRB,TRBV5,None,TRBJ1-3,TRBC1,True,True,CASSQDRGAGNTLYF,TGTGCCAGCAGCCAAGATCGGGGGGCTGGAAATACGCTCTATTTT,75846,6,clonotype66,clonotype66_consensus_1 +GTCCTCAGTAGCTAAA-1,True,GTCCTCAGTAGCTAAA-1_contig_2,True,345,TRA,TRAV6D-7,None,TRAJ17,TRAC,True,False,CALRTNSAGNKLTF,TGTGCTCTGAGGACTAACAGTGCAGGGAACAAGCTAACTTTT,8,4,clonotype66,None +GTTAAGCCATATACCG-1,True,GTTAAGCCATATACCG-1_contig_1,True,544,TRB,TRBV10,None,TRBJ1-2,TRBC1,True,True,CASSDDRGDSDYTF,TGTGCCAGCAGCGATGACAGGGGAGACTCCGACTACACCTTC,21878,6,clonotype1,clonotype1_consensus_1 +GTTAAGCCATATACCG-1,True,GTTAAGCCATATACCG-1_contig_2,True,531,TRA,TRAV14N-3,None,TRAJ32,TRAC,True,True,CAARSYGGSGNKLIF,TGTGCAGCAAGGTCTTATGGGGGCAGTGGCAACAAGCTCATCTTT,3218,3,clonotype1,clonotype1_consensus_2 +GTTAAGCCATATACCG-1,True,GTTAAGCCATATACCG-1_contig_3,True,427,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,53744,9,clonotype1,None +GTTCATTGTCCCGACA-1,True,GTTCATTGTCCCGACA-1_contig_1,True,656,TRA,TRAV7-1,None,TRAJ7,TRAC,True,True,CAVRAYSNNRLTL,TGTGCAGTGAGGGCCTACAGCAACAACAGACTTACTTTG,21080,7,clonotype67,clonotype67_consensus_2 +GTTCATTGTCCCGACA-1,True,GTTCATTGTCCCGACA-1_contig_2,True,568,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-5,TRBC2,True,True,CASGETINQDTQYF,TGTGCCAGCGGTGAAACAATTAACCAAGACACCCAGTACTTT,26828,9,clonotype67,clonotype67_consensus_1 +GTTCATTGTCCCGACA-1,True,GTTCATTGTCCCGACA-1_contig_3,True,514,TRA,TRAV1,None,TRAJ23,TRAC,True,False,None,None,24160,5,clonotype67,None +GTTCATTGTCCCGACA-1,True,GTTCATTGTCCCGACA-1_contig_4,True,318,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,6176,1,clonotype67,None +GTTCGGGAGTAACCCT-1,True,GTTCGGGAGTAACCCT-1_contig_1,True,732,TRA,TRAV9-4,None,TRAJ2,TRAC,True,True,CALNTGGLSGKLTF,TGTGCTCTGAATACTGGAGGACTAAGTGGTAAATTAACATTC,37020,3,clonotype68,clonotype68_consensus_2 +GTTCGGGAGTAACCCT-1,True,GTTCGGGAGTAACCCT-1_contig_2,True,633,TRB,TRBV13-3,None,TRBJ1-6,TRBC1,True,True,CASSAQNNSPLYF,TGTGCCAGCAGTGCTCAGAATAATTCGCCCCTCTACTTT,25658,2,clonotype68,clonotype68_consensus_1 +GTTCGGGAGTAACCCT-1,True,GTTCGGGAGTAACCCT-1_contig_3,True,506,TRA,TRAV7D-5,None,TRAJ13,TRAC,True,True,CAPIANSGTYQRF,TGTGCACCTATTGCAAATTCTGGGACTTACCAGAGGTTT,15764,1,clonotype68,clonotype68_consensus_3 +GTTCTCGAGTCTCAAC-1,True,GTTCTCGAGTCTCAAC-1_contig_1,True,548,TRA,TRAV16N,None,TRAJ30,TRAC,True,True,CAMREGRANAYKVIF,TGTGCTATGAGAGAGGGCAGGGCAAATGCTTACAAAGTCATCTTT,6436,3,clonotype69,clonotype69_consensus_1 +GTTCTCGAGTCTCAAC-1,True,GTTCTCGAGTCTCAAC-1_contig_2,True,627,TRB,TRBV2,None,TRBJ2-2,TRBC2,True,True,CASSQEEGANTGQLYF,TGTGCCAGCAGCCAAGAGGAGGGGGCAAACACCGGGCAGCTCTACTTT,7808,3,clonotype69,clonotype69_consensus_2 +GTTCTCGAGTCTCAAC-1,True,GTTCTCGAGTCTCAAC-1_contig_3,True,424,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,62868,18,clonotype69,None +GTTTCTACATGCCCGA-1,True,GTTTCTACATGCCCGA-1_contig_1,True,526,TRA,TRAV6N-7,None,TRAJ49,TRAC,True,True,CALGEPGYQNFYF,TGTGCTCTGGGTGAACCGGGTTACCAGAACTTCTATTTT,14050,4,clonotype8,clonotype8_consensus_1 +GTTTCTACATGCCCGA-1,True,GTTTCTACATGCCCGA-1_contig_2,True,666,TRB,TRBV19,None,TRBJ1-2,TRBC1,True,True,CASRDANSDYTF,TGTGCCAGCAGGGACGCAAACTCCGACTACACCTTC,52602,15,clonotype8,clonotype8_consensus_2 +GTTTCTACATGCCCGA-1,True,GTTTCTACATGCCCGA-1_contig_3,True,326,TRB,None,None,TRBJ2-2,TRBC2,False,False,None,None,8110,1,clonotype8,None +TAAGCGTCAAGCGCTC-1,True,TAAGCGTCAAGCGCTC-1_contig_1,True,565,TRB,TRBV1,None,TRBJ2-7,TRBC2,True,True,CTCSGTGGYEQYF,TGCACCTGCAGTGGGACTGGGGGCTATGAACAGTACTTC,53792,12,clonotype70,clonotype70_consensus_2 +TAAGCGTCAAGCGCTC-1,True,TAAGCGTCAAGCGCTC-1_contig_2,True,527,TRA,TRAV6-5,None,TRAJ52,TRAC,True,True,CALRTNTGANTGKLTF,TGTGCTCTGAGGACTAACACTGGAGCTAACACTGGAAAGCTCACGTTT,12504,2,clonotype70,clonotype70_consensus_1 +TAAGCGTCAAGCGCTC-1,True,TAAGCGTCAAGCGCTC-1_contig_3,True,554,TRA,TRAV9-1,None,TRAJ52,TRAC,True,True,CAASPANTGANTGKLTF,TGTGCTGCGAGCCCCGCTAACACTGGAGCTAACACTGGAAAGCTCACGTTT,12274,3,clonotype70,clonotype70_consensus_3 +TAAGTGCTCCTTGCCA-1,True,TAAGTGCTCCTTGCCA-1_contig_1,True,594,TRA,TRAV7-4,None,TRAJ5,TRAC,True,True,CAASGTQVVGQLTF,TGTGCAGCTAGTGGGACACAGGTTGTGGGGCAGCTCACTTTC,31136,5,clonotype71,clonotype71_consensus_1 +TAAGTGCTCCTTGCCA-1,True,TAAGTGCTCCTTGCCA-1_contig_2,True,522,TRB,TRBV31,None,TRBJ1-3,TRBC1,True,True,CAWRQNSGNTLYF,TGTGCCTGGAGACAGAATTCTGGAAATACGCTCTATTTT,33362,5,clonotype71,clonotype71_consensus_2 +TAAGTGCTCCTTGCCA-1,True,TAAGTGCTCCTTGCCA-1_contig_3,True,402,TRA,TRAV6-7-DV9,None,TRAJ13,TRAC,True,False,CALIQILGLTRGLEL,TGTGCTCTGATTCAAATTCTGGGACTTACCAGAGGTTTGGAACTG,13630,1,clonotype71,None +TACGGGCGTCATATGC-1,True,TACGGGCGTCATATGC-1_contig_1,True,552,TRB,TRBV20,TRBD1,TRBJ1-2,TRBC1,True,True,CGVGTGGANSDYTF,TGTGGTGTCGGGACAGGGGGCGCGAACTCCGACTACACCTTC,41534,8,clonotype2,clonotype2_consensus_2 +TACGGGCGTCATATGC-1,True,TACGGGCGTCATATGC-1_contig_2,True,522,TRA,TRAV8D-1,None,TRAJ33,TRAC,True,True,CATRRNYQLIW,TGTGCTACTAGGCGCAACTATCAGTTGATCTGG,7788,1,clonotype2,clonotype2_consensus_1 +TACGGGCGTCATATGC-1,True,TACGGGCGTCATATGC-1_contig_3,True,554,TRA,TRAV10D,None,TRAJ18,TRAC,True,False,None,None,7236,1,clonotype2,None +TACGGGCGTCATATGC-1,True,TACGGGCGTCATATGC-1_contig_4,True,352,TRB,TRBV19,None,TRBJ1-6,TRBC1,True,False,None,None,12526,1,clonotype2,None +TAGTTGGGTATTCTCT-1,True,TAGTTGGGTATTCTCT-1_contig_1,True,514,TRB,TRBV10,None,TRBJ1-2,TRBC1,True,True,CASSDDRGDSDYTF,TGTGCCAGCAGCGATGACAGGGGAGACTCCGACTACACCTTC,66450,7,clonotype1,clonotype1_consensus_1 +TAGTTGGGTATTCTCT-1,True,TAGTTGGGTATTCTCT-1_contig_2,True,528,TRA,TRAV14N-3,None,TRAJ32,TRAC,True,True,CAARSYGGSGNKLIF,TGTGCAGCAAGGTCTTATGGGGGCAGTGGCAACAAGCTCATCTTT,5722,2,clonotype1,clonotype1_consensus_2 +TATCTCACATGCTGGC-1,True,TATCTCACATGCTGGC-1_contig_1,True,585,TRA,TRAV12-3,None,TRAJ58,TRAC,True,True,CALRQGTGSKLSF,TGTGCTTTGAGGCAAGGCACTGGGTCTAAGCTGTCATTT,51526,7,clonotype72,clonotype72_consensus_1 +TATCTCACATGCTGGC-1,True,TATCTCACATGCTGGC-1_contig_2,True,583,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-7,TRBC2,True,True,CASGDRGQGYEQYF,TGTGCCAGCGGTGATCGGGGACAGGGATATGAACAGTACTTC,23630,2,clonotype72,clonotype72_consensus_2 +TCAACGACATGGTCAT-1,True,TCAACGACATGGTCAT-1_contig_1,True,603,TRA,TRAV14D-3-DV8,None,TRAJ45,TRAC,True,True,CAARHTGGADRLTF,TGTGCAGCAAGGCATACAGGAGGTGCAGATAGACTCACCTTT,25206,4,clonotype4,clonotype4_consensus_2 +TCAACGACATGGTCAT-1,True,TCAACGACATGGTCAT-1_contig_2,True,721,TRB,TRBV19,None,TRBJ2-5,TRBC2,True,True,CASRKGTGGRDTQYF,TGTGCCAGCAGAAAAGGGACTGGGGGGAGAGACACCCAGTACTTT,32924,5,clonotype4,clonotype4_consensus_1 +TCAACGACATGGTCAT-1,True,TCAACGACATGGTCAT-1_contig_3,True,329,TRB,TRBV10,None,None,TRBC1,False,False,None,None,15154,1,clonotype4,None +TCAACGACATGGTCAT-1,True,TCAACGACATGGTCAT-1_contig_4,True,599,TRA,TRAV7-4,None,TRAJ49,TRAC,True,False,CAASEQE,TGTGCAGCTAGTGAGCAGGAA,3578,1,clonotype4,None +TCAACGAGTAGCACGA-1,True,TCAACGAGTAGCACGA-1_contig_1,True,521,TRB,TRBV13-1,None,TRBJ2-7,TRBC2,True,True,CASSDAGQSSYEQYF,TGTGCCAGCAGTGATGCCGGACAGAGCTCCTATGAACAGTACTTC,55040,18,clonotype73,clonotype73_consensus_2 +TCAACGAGTAGCACGA-1,True,TCAACGAGTAGCACGA-1_contig_2,True,591,TRA,TRAV7D-4,None,TRAJ9,TRAC,True,True,CAASEDMGYKLTF,TGTGCAGCTAGTGAGGACATGGGCTACAAACTTACCTTC,17978,9,clonotype73,clonotype73_consensus_1 +TCAACGAGTAGCACGA-1,True,TCAACGAGTAGCACGA-1_contig_3,True,621,TRB,TRBV1,None,TRBJ2-1,TRBC2,True,False,None,None,4354,2,clonotype73,None +TCAATCTAGCTGCCCA-1,True,TCAATCTAGCTGCCCA-1_contig_1,True,585,TRA,TRAV7D-4,None,TRAJ31,TRAC,True,True,CAANNNNRIFF,TGTGCAGCCAATAACAATAACAGAATCTTCTTT,36166,4,clonotype74,clonotype74_consensus_1 +TCAATCTTCAGAGACG-1,True,TCAATCTTCAGAGACG-1_contig_1,True,600,TRA,TRAV14N-3,None,TRAJ32,TRAC,True,True,CAARSYGGSGNKLIF,TGTGCAGCAAGGTCTTATGGGGGCAGTGGCAACAAGCTCATCTTT,17898,4,clonotype75,clonotype75_consensus_1 +TCAATCTTCAGAGACG-1,True,TCAATCTTCAGAGACG-1_contig_2,True,495,TRB,TRBV10,None,TRBJ1-2,TRBC1,True,False,CASSDDRGDSDYTF,TGTGCCAGCAGCGATGACAGGGGAGACTCCGACTACACCTTC,21344,3,clonotype75,None +TCAATCTTCAGAGACG-1,True,TCAATCTTCAGAGACG-1_contig_3,True,347,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,37500,5,clonotype75,None +TCACGAATCAGCTCTC-1,True,TCACGAATCAGCTCTC-1_contig_1,True,718,TRA,TRAV9-4,None,TRAJ34,TRAC,True,True,CAASISNTDKVVF,TGTGCTGCGAGCATCTCCAATACCGACAAAGTCGTCTTT,30010,3,clonotype76,clonotype76_consensus_2 +TCACGAATCAGCTCTC-1,True,TCACGAATCAGCTCTC-1_contig_2,True,698,TRB,TRBV19,None,TRBJ2-3,TRBC2,True,True,CASSSDWGSETLYF,TGTGCCAGCAGTAGTGACTGGGGGTCAGAAACGCTGTATTTT,48138,9,clonotype76,clonotype76_consensus_1 +TCAGATGTCAGAGACG-1,True,TCAGATGTCAGAGACG-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGQGNTEVFF,TGTGCCAGCAGCCCGGGACAGGGGAACACAGAAGTCTTCTTT,66354,39,clonotype77,clonotype77_consensus_1 +TCAGGATGTATTAGCC-1,True,TCAGGATGTATTAGCC-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGQGNTEVFF,TGTGCCAGCAGCCCTGGACAGGGTAACACAGAAGTCTTCTTT,51466,7,clonotype78,clonotype78_consensus_2 +TCAGGATGTATTAGCC-1,True,TCAGGATGTATTAGCC-1_contig_2,True,718,TRA,TRAV9D-2,None,TRAJ17,TRAC,True,True,CAATNSAGNKLTF,TGTGCTGCGACTAACAGTGCAGGGAACAAGCTAACTTTT,10310,2,clonotype78,clonotype78_consensus_1 +TCAGGATGTATTAGCC-1,True,TCAGGATGTATTAGCC-1_contig_3,True,520,TRA,TRAV15-1-DV6-1,None,TRAJ18,TRAC,True,False,CSLGADRGSALGRLHF,TGCTCTCTGGGAGCCGATAGAGGTTCAGCCTTAGGGAGGCTGCATTTT,3408,2,clonotype78,None +TCAGGATGTATTAGCC-1,True,TCAGGATGTATTAGCC-1_contig_4,True,356,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,9160,3,clonotype78,None +TCATTACGTGTGCGTC-1,True,TCATTACGTGTGCGTC-1_contig_1,True,715,TRB,TRBV19,None,TRBJ2-7,TRBC2,True,True,CASSINWGGEQYF,TGTGCCAGCAGTATAAACTGGGGGGGCGAACAGTACTTC,40606,5,clonotype6,clonotype6_consensus_1 +TCATTACGTGTGCGTC-1,True,TCATTACGTGTGCGTC-1_contig_2,True,535,TRA,TRAV6N-7,None,TRAJ49,TRAC,True,True,CALGGKKGYQNFYF,TGTGCTCTGGGTGGTAAGAAGGGTTACCAGAACTTCTATTTT,17558,2,clonotype6,clonotype6_consensus_2 +TCATTACGTGTGCGTC-1,True,TCATTACGTGTGCGTC-1_contig_3,True,350,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,20666,1,clonotype6,None +TCGTAGACAGCTGGCT-1,True,TCGTAGACAGCTGGCT-1_contig_1,True,550,TRA,TRAV6-1,None,TRAJ45,TRAC,True,True,CVLGDEAGGADRLTF,TGTGTTCTGGGTGATGAGGCAGGAGGTGCAGATAGACTCACCTTT,27320,2,clonotype79,clonotype79_consensus_1 +TCGTAGACAGCTGGCT-1,True,TCGTAGACAGCTGGCT-1_contig_2,True,627,TRB,TRBV31,None,TRBJ1-2,TRBC1,True,False,None,None,51778,2,clonotype79,None +TCTATTGGTTGTGGAG-1,True,TCTATTGGTTGTGGAG-1_contig_1,True,555,TRA,TRAV8N-2,None,TRAJ44,TRAC,True,True,CAPVITGSGGKLTL,TGTGCTCCCGTCATTACTGGCAGTGGTGGAAAACTCACTTTG,55542,14,clonotype80,clonotype80_consensus_1 +TCTATTGGTTGTGGAG-1,True,TCTATTGGTTGTGGAG-1_contig_2,True,529,TRB,TRBV20,None,TRBJ2-5,TRBC2,True,True,CGALTGNTQYF,TGTGGTGCTTTGACAGGAAACACCCAGTACTTT,7600,2,clonotype80,clonotype80_consensus_2 +TCTATTGGTTGTGGAG-1,True,TCTATTGGTTGTGGAG-1_contig_3,True,527,TRA,TRAV11,None,TRAJ48,TRAC,True,False,CWMTLPPTSVWWGYGNEKITF,TGCTGGATGACACTGCCACCTACATCTGTGTGGTGGGGCTATGGAAATGAGAAAATAACTTTT,13132,3,clonotype80,None +TCTGAGATCACTCTTA-1,True,TCTGAGATCACTCTTA-1_contig_1,True,579,TRB,TRBV13-3,None,TRBJ2-7,TRBC2,True,True,CASSEPATGGDYEQYF,TGTGCCAGCAGTGAGCCGGCGACGGGGGGCGATTATGAACAGTACTTC,75302,13,clonotype81,clonotype81_consensus_1 +TCTGGAATCGCAGGCT-1,True,TCTGGAATCGCAGGCT-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-4,TRBC1,True,True,CASSQEISNERLFF,TGTGCCAGCAGCCAAGAGATTTCCAACGAAAGATTATTTTTC,41650,3,clonotype82,clonotype82_consensus_1 +TCTGGAATCGCAGGCT-1,True,TCTGGAATCGCAGGCT-1_contig_2,True,357,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,23452,3,clonotype82,None +TCTGGAATCGCAGGCT-1,True,TCTGGAATCGCAGGCT-1_contig_3,True,500,TRA,TRAV6-5,None,TRAJ34,TRAC,True,False,CTTVLWAPLSNTDKVVF,TGTACTACTGTGCTCTGGGCCCCGCTTTCCAATACCGACAAAGTCGTCTTT,13966,2,clonotype82,None +TGAGCCGGTCCTAGCG-1,True,TGAGCCGGTCCTAGCG-1_contig_1,True,501,TRA,TRAV21-DV12,None,TRAJ50,TRAC,True,True,CILRSSSFSKLVF,TGTATCCTGAGGTCCTCCTCCTTCAGCAAGCTGGTGTTT,20390,6,clonotype83,clonotype83_consensus_1 +TGAGCCGGTCCTAGCG-1,True,TGAGCCGGTCCTAGCG-1_contig_2,True,522,TRB,TRBV31,None,TRBJ1-6,TRBC1,True,True,CAWSRGEGTYNSPLYF,TGTGCCTGGAGTCGCGGGGAAGGGACCTATAATTCGCCCCTCTACTTT,57770,10,clonotype83,clonotype83_consensus_2 +TGCCCATAGATATGGT-1,True,TGCCCATAGATATGGT-1_contig_1,True,537,TRA,TRAV3-3,None,TRAJ49,TRAC,True,True,CAVSVDTGYQNFYF,TGCGCAGTCAGTGTGGACACGGGTTACCAGAACTTCTATTTT,25178,8,clonotype84,clonotype84_consensus_3 +TGCCCATAGATATGGT-1,True,TGCCCATAGATATGGT-1_contig_2,True,525,TRB,TRBV31,None,TRBJ2-1,TRBC2,True,True,CAWSLGTGDPEQFF,TGTGCCTGGAGTCTAGGGACTGGGGATCCTGAGCAGTTCTTC,19524,6,clonotype84,clonotype84_consensus_1 +TGCCCATAGATATGGT-1,True,TGCCCATAGATATGGT-1_contig_3,True,556,TRA,TRAV12-1,None,TRAJ22,TRAC,True,True,CALSSGSWQLIF,TGTGCTCTTTCTTCTGGCAGCTGGCAACTCATCTTT,9356,3,clonotype84,clonotype84_consensus_2 +TGCCCATAGATATGGT-1,True,TGCCCATAGATATGGT-1_contig_4,True,537,TRB,None,None,TRBJ1-2,TRBC1,False,False,None,None,23606,8,clonotype84,None +TGCGCAGAGAGTGAGA-1,True,TGCGCAGAGAGTGAGA-1_contig_1,True,680,TRA,TRAV7-1,None,TRAJ40,TRAC,True,True,CAVSMGTGNYKYVF,TGTGCAGTGAGCATGGGGACAGGAAACTACAAATACGTCTTT,11978,6,clonotype85,clonotype85_consensus_1 +TGCGCAGAGAGTGAGA-1,True,TGCGCAGAGAGTGAGA-1_contig_2,True,522,TRB,TRBV5,None,TRBJ2-7,TRBC2,True,True,CASSPGLGDSYEQYF,TGTGCCAGCAGCCCCGGACTGGGGGACTCCTATGAACAGTACTTC,11602,5,clonotype85,clonotype85_consensus_2 +TGCGCAGAGAGTGAGA-1,True,TGCGCAGAGAGTGAGA-1_contig_3,True,375,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,53968,12,clonotype85,None +TGCGGGTCAAGCCGTC-1,True,TGCGGGTCAAGCCGTC-1_contig_1,True,572,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-7,TRBC2,True,True,CASGDGGGRGEQYF,TGTGCCAGCGGTGATGGGGGGGGGCGCGGAGAACAGTACTTC,65734,7,clonotype86,clonotype86_consensus_1 +TGGCGCACACCTCGTT-1,True,TGGCGCACACCTCGTT-1_contig_1,True,518,TRB,TRBV13-1,None,TRBJ2-4,TRBC2,True,True,CASSDSGGQNTLYF,TGTGCCAGCAGTGATTCCGGGGGTCAAAACACCTTGTACTTT,58356,5,clonotype87,clonotype87_consensus_1 +TGGCGCACACCTCGTT-1,True,TGGCGCACACCTCGTT-1_contig_2,True,520,TRA,TRAV6-6,None,TRAJ24,TRAC,True,True,CALGGTTASLGKLQF,TGTGCTCTGGGTGGGACAACTGCCAGTTTGGGGAAACTGCAGTTT,19054,2,clonotype87,clonotype87_consensus_2 +TGGCTGGTCACCATAG-1,True,TGGCTGGTCACCATAG-1_contig_1,True,529,TRB,TRBV13-3,None,TRBJ2-4,TRBC2,True,True,CASSDWGGASQNTLYF,TGTGCCAGCAGTGACTGGGGGGGCGCAAGTCAAAACACCTTGTACTTT,45392,9,clonotype88,clonotype88_consensus_1 +TGGCTGGTCACCATAG-1,True,TGGCTGGTCACCATAG-1_contig_2,True,705,TRA,TRAV9-4,None,TRAJ56,TRAC,True,True,CAVSMKGATGGNNKLTF,TGTGCTGTGAGCATGAAGGGGGCTACTGGAGGCAATAATAAGCTGACTTTT,7320,2,clonotype88,clonotype88_consensus_2 +TGGCTGGTCACCATAG-1,True,TGGCTGGTCACCATAG-1_contig_3,True,698,TRB,None,None,TRBJ1-2,TRBC1,False,False,None,None,12928,5,clonotype88,None +TGGCTGGTCACCATAG-1,True,TGGCTGGTCACCATAG-1_contig_4,True,595,TRA,TRAV19,None,TRAJ52,TRAC,True,False,None,None,5974,1,clonotype88,None +TGGTTCCCAGCTCCGA-1,True,TGGTTCCCAGCTCCGA-1_contig_1,True,544,TRB,TRBV10,None,TRBJ1-2,TRBC1,True,True,CASSDDRGDSDYTF,TGTGCCAGCAGCGATGACAGGGGAGACTCCGACTACACCTTC,22112,2,clonotype1,clonotype1_consensus_1 +TGGTTCCCAGCTCCGA-1,True,TGGTTCCCAGCTCCGA-1_contig_2,True,729,TRA,TRAV14N-3,None,TRAJ32,TRAC,True,True,CAARSYGGSGNKLIF,TGTGCAGCAAGGTCTTATGGGGGCAGTGGCAACAAGCTCATCTTT,16522,3,clonotype1,clonotype1_consensus_2 +TGGTTCCCAGCTCCGA-1,True,TGGTTCCCAGCTCCGA-1_contig_3,True,425,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,38946,2,clonotype1,None +TGTATTCTCAAGGTAA-1,True,TGTATTCTCAAGGTAA-1_contig_1,True,544,TRB,TRBV10,None,TRBJ1-2,TRBC1,True,True,CASSDDRGDSDYTF,TGTGCCAGCAGCGATGACAGGGGAGACTCCGACTACACCTTC,58570,14,clonotype1,clonotype1_consensus_1 +TGTATTCTCAAGGTAA-1,True,TGTATTCTCAAGGTAA-1_contig_2,True,690,TRA,TRAV14N-3,None,TRAJ32,TRAC,True,True,CAARSYGGSGNKLIF,TGTGCAGCAAGGTCTTATGGGGGCAGTGGCAACAAGCTCATCTTT,16274,7,clonotype1,clonotype1_consensus_2 +TGTATTCTCACCCTCA-1,True,TGTATTCTCACCCTCA-1_contig_1,True,745,TRA,TRAV9-4,None,TRAJ16,TRAC,True,True,CAVTASSGQKLVF,TGTGCTGTGACGGCTTCAAGTGGCCAGAAGCTGGTTTTT,14940,9,clonotype9,clonotype9_consensus_2 +TGTATTCTCACCCTCA-1,True,TGTATTCTCACCCTCA-1_contig_2,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSQGGGNTEVFF,TGTGCCAGCAGCCAAGGGGGGGGGAACACAGAAGTCTTCTTT,56408,26,clonotype9,clonotype9_consensus_1 +TGTATTCTCACCCTCA-1,True,TGTATTCTCACCCTCA-1_contig_3,True,731,TRB,None,None,TRBJ2-5,TRBC2,False,False,None,None,3930,2,clonotype9,None +TTATGCTGTCCAGTGC-1,True,TTATGCTGTCCAGTGC-1_contig_1,True,712,TRB,TRBV19,None,TRBJ1-4,TRBC1,True,True,CASSMGVERLFF,TGTGCCAGCAGTATGGGGGTCGAAAGATTATTTTTC,20904,9,clonotype89,clonotype89_consensus_2 +TTATGCTGTCCAGTGC-1,True,TTATGCTGTCCAGTGC-1_contig_2,True,524,TRA,TRAV6N-7,None,TRAJ12,TRAC,True,True,CALTTPGGYKVVF,TGTGCTCTGACCACTCCTGGAGGCTATAAAGTGGTCTTT,15784,5,clonotype89,clonotype89_consensus_1 +TTATGCTGTCCAGTGC-1,True,TTATGCTGTCCAGTGC-1_contig_3,True,329,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,7002,1,clonotype89,None +TTATGCTGTCCAGTGC-1,True,TTATGCTGTCCAGTGC-1_contig_4,True,357,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,31842,7,clonotype89,None +TTCTCAAAGCTCCTCT-1,True,TTCTCAAAGCTCCTCT-1_contig_1,True,603,TRA,TRAV14D-3-DV8,None,TRAJ45,TRAC,True,True,CAARHTGGADRLTF,TGTGCAGCAAGGCATACAGGAGGTGCAGATAGACTCACCTTT,34520,3,clonotype4,clonotype4_consensus_2 +TTCTCAAAGCTCCTCT-1,True,TTCTCAAAGCTCCTCT-1_contig_2,True,672,TRB,TRBV19,None,TRBJ2-5,TRBC2,True,True,CASRKGTGGRDTQYF,TGTGCCAGCAGAAAAGGGACTGGGGGGAGAGACACCCAGTACTTT,5950,1,clonotype4,clonotype4_consensus_1 +TTCTCAAAGCTCCTCT-1,True,TTCTCAAAGCTCCTCT-1_contig_3,True,553,TRB,TRBV10,None,TRBJ2-3,TRBC2,True,False,None,None,37702,3,clonotype4,None +TTGACTTGTTACGGAG-1,True,TTGACTTGTTACGGAG-1_contig_1,True,571,TRB,TRBV1,None,TRBJ1-4,TRBC1,True,True,CTCSAQGVSNERLFF,TGCACCTGCAGTGCACAGGGGGTTTCCAACGAAAGATTATTTTTC,47750,11,clonotype90,clonotype90_consensus_1 +TTGACTTGTTACGGAG-1,True,TTGACTTGTTACGGAG-1_contig_2,True,406,TRB,TRBV13-3,None,TRBJ2-2,TRBC2,True,False,CASSDALGAAGQLYF,TGTGCCAGCAGTGATGCATTGGGGGCGGCCGGGCAGCTCTACTTT,19412,4,clonotype90,None diff --git a/tests/testthat/fixtures/Chariou/h5files/SCAF1715_3_1_filtered_contig_annotations.csv b/tests/testthat/fixtures/Chariou/h5files/SCAF1715_3_1_filtered_contig_annotations.csv new file mode 100644 index 0000000..1d363bb --- /dev/null +++ b/tests/testthat/fixtures/Chariou/h5files/SCAF1715_3_1_filtered_contig_annotations.csv @@ -0,0 +1,142 @@ +barcode,is_cell,contig_id,high_confidence,length,chain,v_gene,d_gene,j_gene,c_gene,full_length,productive,cdr3,cdr3_nt,reads,umis,raw_clonotype_id,raw_consensus_id +AAGTCTGAGTGGTAGC-1,True,AAGTCTGAGTGGTAGC-1_contig_1,True,530,TRA,TRAV16N,None,TRAJ45,TRAC,True,True,CAMREANTGGADRLTF,TGTGCTATGAGAGAGGCTAATACAGGAGGTGCAGATAGACTCACCTTT,18318,5,clonotype1,clonotype1_consensus_1 +AAGTCTGAGTGGTAGC-1,True,AAGTCTGAGTGGTAGC-1_contig_2,True,645,TRB,TRBV2,None,TRBJ1-6,TRBC1,True,True,CASSQDGGYNSPLYF,TGTGCCAGCAGCCAAGATGGGGGCTATAATTCGCCCCTCTACTTT,16650,6,clonotype1,clonotype1_consensus_2 +AAGTCTGAGTGGTAGC-1,True,AAGTCTGAGTGGTAGC-1_contig_3,True,328,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,39518,10,clonotype1,None +ACCTTTAAGCTGAAAT-1,True,ACCTTTAAGCTGAAAT-1_contig_1,True,570,TRA,TRAV2,None,TRAJ15,TRAC,True,True,CIVTVPYQGGRALIF,TGCATTGTGACTGTCCCCTACCAGGGAGGCAGAGCTCTGATATTT,10830,6,clonotype2,clonotype2_consensus_3 +ACCTTTAAGCTGAAAT-1,True,ACCTTTAAGCTGAAAT-1_contig_2,True,538,TRA,TRAV6-2,None,TRAJ9,TRAC,True,True,CVRGNMGYKLTF,TGTGTTAGAGGGAACATGGGCTACAAACTTACCTTC,16732,8,clonotype2,clonotype2_consensus_2 +ACCTTTAAGCTGAAAT-1,True,ACCTTTAAGCTGAAAT-1_contig_3,True,670,TRB,TRBV19,None,TRBJ2-1,TRBC2,True,True,CASRDRSYNYAEQFF,TGTGCCAGCAGGGACAGGTCCTATAACTATGCTGAGCAGTTCTTC,25508,13,clonotype2,clonotype2_consensus_1 +ACCTTTAAGCTGAAAT-1,True,ACCTTTAAGCTGAAAT-1_contig_4,True,505,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,20654,10,clonotype2,None +ACCTTTAAGCTGAAAT-1,True,ACCTTTAAGCTGAAAT-1_contig_5,True,348,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,3984,1,clonotype2,None +ACGGGCTTCCATTCTA-1,True,ACGGGCTTCCATTCTA-1_contig_1,True,567,TRB,TRBV12-2+TRBV13-2,None,TRBJ1-3,TRBC1,True,True,CASGDGNSGNTLYF,TGTGCCAGCGGTGATGGCAATTCTGGAAATACGCTCTATTTT,74284,6,clonotype3,clonotype3_consensus_1 +AGCTCTCCACGAAACG-1,True,AGCTCTCCACGAAACG-1_contig_1,True,492,TRA,TRAV1,None,TRAJ33,TRAC,True,True,CAVRDSNYQLIW,TGTGCTGTGAGGGATAGCAACTATCAGTTGATCTGG,8748,1,clonotype4,clonotype4_consensus_1 +AGCTCTCCACGAAACG-1,True,AGCTCTCCACGAAACG-1_contig_2,True,525,TRB,TRBV13-3,None,TRBJ1-5,TRBC1,True,True,CASSAGTDNQAPLF,TGTGCCAGCAGTGCCGGGACAGACAACCAGGCTCCGCTTTTT,42160,6,clonotype4,clonotype4_consensus_2 +AGCTCTCCACGAAACG-1,True,AGCTCTCCACGAAACG-1_contig_3,True,452,TRB,None,None,TRBJ1-4,TRBC1,False,False,None,None,11306,1,clonotype4,None +AGCTCTCCACGAAACG-1,True,AGCTCTCCACGAAACG-1_contig_4,True,546,TRA,TRAV8D-1,None,TRAJ6,TRAC,True,False,None,None,16050,3,clonotype4,None +AGGGTGAGTCAGCTAT-1,True,AGGGTGAGTCAGCTAT-1_contig_1,True,636,TRA,TRAV5D-4,None,TRAJ6,TRAC,True,True,CAASAGGNYKPTF,TGTGCTGCAAGTGCAGGAGGAAACTACAAACCTACGTTT,23148,3,clonotype5,clonotype5_consensus_1 +AGGGTGAGTCAGCTAT-1,True,AGGGTGAGTCAGCTAT-1_contig_2,True,718,TRB,TRBV19,None,TRBJ2-4,TRBC2,True,True,CASKTGGSQNTLYF,TGTGCCAGCAAAACTGGGGGGAGTCAAAACACCTTGTACTTT,56110,2,clonotype5,clonotype5_consensus_2 +ATTACTCCATGCCCGA-1,True,ATTACTCCATGCCCGA-1_contig_1,True,513,TRA,TRAV6-6,None,TRAJ15,TRAC,True,True,CALGDPQGGRALIF,TGTGCTCTGGGTGATCCCCAGGGAGGCAGAGCTCTGATATTT,27020,4,clonotype6,clonotype6_consensus_1 +ATTACTCCATGCCCGA-1,True,ATTACTCCATGCCCGA-1_contig_2,True,643,TRB,TRBV1,None,TRBJ1-1,TRBC1,True,True,CTCSAQGAQGTEVFF,TGCACCTGCAGTGCGCAGGGGGCGCAGGGCACAGAAGTCTTCTTT,52090,7,clonotype6,clonotype6_consensus_2 +CAAGGCCAGTAGGTGC-1,True,CAAGGCCAGTAGGTGC-1_contig_1,True,586,TRB,TRBV13-3,None,TRBJ1-4,TRBC1,True,True,CASSANERLFF,TGTGCCAGCAGTGCCAACGAAAGATTATTTTTC,32168,9,clonotype7,clonotype7_consensus_2 +CAAGGCCAGTAGGTGC-1,True,CAAGGCCAGTAGGTGC-1_contig_2,True,603,TRA,TRAV12D-2,None,TRAJ49,TRAC,True,True,CALSAPNTGYQNFYF,TGTGCTCTGAGTGCTCCGAACACGGGTTACCAGAACTTCTATTTT,17612,4,clonotype7,clonotype7_consensus_1 +CAAGGCCAGTAGGTGC-1,True,CAAGGCCAGTAGGTGC-1_contig_3,True,332,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,8526,1,clonotype7,None +CAAGGCCAGTAGGTGC-1,True,CAAGGCCAGTAGGTGC-1_contig_4,True,571,Multi,TRAV8D-2,None,TRDJ1,TRAC,True,False,CATDVGGRRDTS,TGTGCTACAGACGTGGGGGGGCGGAGGGATACGAGC,9822,3,clonotype7,None +CAAGGCCAGTAGGTGC-1,True,CAAGGCCAGTAGGTGC-1_contig_5,True,372,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,6176,2,clonotype7,None +CACCAGGAGAGACTTA-1,True,CACCAGGAGAGACTTA-1_contig_1,True,511,TRB,TRBV10,None,TRBJ1-2,TRBC1,True,True,CASSRQGGSDYTF,TGTGCCAGCAGCCGACAGGGCGGCTCCGACTACACCTTC,64360,8,clonotype8,clonotype8_consensus_2 +CACCAGGAGAGACTTA-1,True,CACCAGGAGAGACTTA-1_contig_2,True,546,TRA,TRAV8N-2,None,TRAJ34,TRAC,True,True,CATANTDKVVF,TGTGCTACTGCCAATACCGACAAAGTCGTCTTT,8018,2,clonotype8,clonotype8_consensus_1 +CACCAGGGTAAGTAGT-1,True,CACCAGGGTAAGTAGT-1_contig_1,True,569,TRB,TRBV2,None,TRBJ2-5,TRBC2,True,True,CASSQDGTGQDTQYF,TGTGCCAGCAGCCAAGACGGGACTGGACAAGACACCCAGTACTTT,26388,9,clonotype9,clonotype9_consensus_1 +CACCAGGGTAAGTAGT-1,True,CACCAGGGTAAGTAGT-1_contig_2,True,567,TRA,TRAV4-4-DV10,None,TRAJ49,TRAC,True,True,CAAEAGPGYQNFYF,TGTGCTGCTGAGGCAGGGCCGGGTTACCAGAACTTCTATTTT,41438,13,clonotype9,clonotype9_consensus_2 +CACCAGGGTAAGTAGT-1,True,CACCAGGGTAAGTAGT-1_contig_3,True,614,TRB,None,None,TRBJ1-1,TRBC1,False,False,None,None,10066,3,clonotype9,None +CATCAGAGTCTCGTTC-1,True,CATCAGAGTCTCGTTC-1_contig_1,True,600,TRA,TRAV12D-2,None,TRAJ56,TRAC,True,True,CALSSTGGNNKLTF,TGTGCTCTGAGTTCTACTGGAGGCAATAATAAGCTGACTTTT,49126,30,clonotype10,clonotype10_consensus_1 +CATCAGAGTCTCGTTC-1,True,CATCAGAGTCTCGTTC-1_contig_2,True,574,TRB,TRBV12-1,None,TRBJ2-4,TRBC2,True,True,CASSLEGSQNTLYF,TGTGCCAGCTCTCTCGAGGGTAGTCAAAACACCTTGTACTTT,7982,7,clonotype10,clonotype10_consensus_2 +CATCAGAGTCTCGTTC-1,True,CATCAGAGTCTCGTTC-1_contig_3,True,328,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,6266,3,clonotype10,None +CATCAGAGTCTCGTTC-1,True,CATCAGAGTCTCGTTC-1_contig_4,True,369,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,13520,9,clonotype10,None +CATGCCTGTATTCGTG-1,True,CATGCCTGTATTCGTG-1_contig_1,True,580,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-1,TRBC2,True,True,CASGDATGLNYAEQFF,TGTGCCAGCGGTGATGCAACAGGGCTAAACTATGCTGAGCAGTTCTTC,28996,16,clonotype11,clonotype11_consensus_2 +CATGCCTGTATTCGTG-1,True,CATGCCTGTATTCGTG-1_contig_2,True,628,TRA,TRAV3-1,None,TRAJ15,TRAC,True,True,CAVRPFYQGGRALIF,TGCGCAGTCAGGCCCTTCTACCAGGGAGGCAGAGCTCTGATATTT,34032,12,clonotype11,clonotype11_consensus_3 +CATGCCTGTATTCGTG-1,True,CATGCCTGTATTCGTG-1_contig_3,True,570,TRA,TRAV2,None,TRAJ12,TRAC,True,True,CIVTDTGTGGYKVVF,TGCATTGTGACTGACACCGGGACTGGAGGCTATAAAGTGGTCTTT,10140,5,clonotype11,clonotype11_consensus_1 +CCACGGAAGCCTATGT-1,True,CCACGGAAGCCTATGT-1_contig_1,True,524,TRA,TRAV6-5,None,TRAJ56,TRAC,True,True,CALSAVTGGNNKLTF,TGTGCTCTGAGTGCCGTAACTGGAGGCAATAATAAGCTGACTTTT,11472,3,clonotype12,clonotype12_consensus_2 +CCACGGAAGCCTATGT-1,True,CCACGGAAGCCTATGT-1_contig_2,True,560,TRB,TRBV2,None,TRBJ1-5,TRBC1,True,True,CASSQDYNQAPLF,TGTGCCAGCAGCCAAGATTACAACCAGGCTCCGCTTTTT,10964,2,clonotype12,clonotype12_consensus_1 +CCACGGAAGCCTATGT-1,True,CCACGGAAGCCTATGT-1_contig_3,True,341,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,13656,1,clonotype12,None +CCACGGAAGCCTATGT-1,True,CCACGGAAGCCTATGT-1_contig_4,True,362,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,40694,4,clonotype12,None +CCCTCCTGTAACGCGA-1,True,CCCTCCTGTAACGCGA-1_contig_1,True,522,TRB,TRBV5,None,TRBJ2-7,TRBC2,True,True,CASSQGLGDSYEQYF,TGTGCCAGCAGCCAAGGACTGGGGGACTCCTATGAACAGTACTTC,32308,10,clonotype13,clonotype13_consensus_2 +CCCTCCTGTAACGCGA-1,True,CCCTCCTGTAACGCGA-1_contig_2,True,606,TRA,TRAV7-4,None,TRAJ42,TRAC,True,True,CAASEHENSGGSNAKLTF,TGTGCAGCTAGTGAGCATGAAAATTCTGGAGGAAGCAATGCAAAGCTAACCTTC,11948,6,clonotype13,clonotype13_consensus_3 +CCCTCCTGTAACGCGA-1,True,CCCTCCTGTAACGCGA-1_contig_3,True,534,TRA,TRAV7-3,None,TRAJ40,TRAC,True,True,CAVSIGTGNYKYVF,TGTGCAGTGAGCATTGGTACAGGAAACTACAAATACGTCTTT,21812,7,clonotype13,clonotype13_consensus_1 +CCCTCCTGTAACGCGA-1,True,CCCTCCTGTAACGCGA-1_contig_4,True,528,TRB,TRBV19,None,TRBJ2-1,TRBC2,True,False,None,None,12054,3,clonotype13,None +CGCCAAGAGCCACGCT-1,True,CGCCAAGAGCCACGCT-1_contig_1,True,520,TRB,TRBV13-3,None,TRBJ1-2,TRBC1,True,True,CASSDAWGPDYTF,TGTGCCAGCAGTGATGCATGGGGCCCCGACTACACCTTC,17728,2,clonotype14,clonotype14_consensus_1 +CGCCAAGAGCCACGCT-1,True,CGCCAAGAGCCACGCT-1_contig_2,True,540,TRA,TRAV11,None,TRAJ18,TRAC,True,True,CVVGDRGSALGRLHF,TGTGTGGTGGGCGATAGAGGTTCAGCCTTAGGGAGGCTGCATTTT,4268,1,clonotype14,clonotype14_consensus_2 +CGCCAAGAGCCACGCT-1,True,CGCCAAGAGCCACGCT-1_contig_3,True,864,TRB,None,None,TRBJ1-1,TRBC1,False,False,None,None,14612,2,clonotype14,None +CGCCAAGAGCCACGCT-1,True,CGCCAAGAGCCACGCT-1_contig_4,True,705,TRA,TRAV7-3,None,TRAJ12,TRAC,True,False,CSKTGGYKVVF,TGCAGTAAGACTGGAGGCTATAAAGTGGTCTTT,2870,1,clonotype14,None +CGCCAAGAGCCACGCT-1,True,CGCCAAGAGCCACGCT-1_contig_5,True,340,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,38948,3,clonotype14,None +CGGTTAAGTAGCGTCC-1,True,CGGTTAAGTAGCGTCC-1_contig_1,True,555,TRA,TRAV8N-2,None,TRAJ32,TRAC,True,True,CATPYGGSGNKLIF,TGTGCTACTCCTTATGGGGGCAGTGGCAACAAGCTCATCTTT,59298,8,clonotype15,clonotype15_consensus_2 +CGGTTAAGTAGCGTCC-1,True,CGGTTAAGTAGCGTCC-1_contig_2,True,522,TRB,TRBV5,None,TRBJ2-7,TRBC2,True,True,CASSQDWGAIYEQYF,TGTGCCAGCAGCCAAGACTGGGGGGCTATATATGAACAGTACTTC,20054,3,clonotype15,clonotype15_consensus_1 +CGTCACTAGATACACA-1,True,CGTCACTAGATACACA-1_contig_1,True,572,TRA,TRAV6-6,None,TRAJ16,TRAC,True,True,CALGATSSGQKLVF,TGTGCTCTGGGTGCAACTTCAAGTGGCCAGAAGCTGGTTTTT,4392,2,clonotype16,clonotype16_consensus_2 +CGTCACTAGATACACA-1,True,CGTCACTAGATACACA-1_contig_2,True,513,TRB,TRBV13-1,None,TRBJ1-5,TRBC1,True,True,CASSVSRDRNQAPLF,TGTGCCAGCAGTGTCTCCCGGGACAGAAACCAGGCTCCGCTTTTT,72618,5,clonotype16,clonotype16_consensus_1 +CGTGTCTAGTGCCAGA-1,True,CGTGTCTAGTGCCAGA-1_contig_1,True,522,TRB,TRBV5,None,TRBJ2-7,TRBC2,True,True,CASSPGLGDSYEQYF,TGTGCCAGCAGCCCGGGACTGGGGGACTCCTATGAACAGTACTTC,30426,9,clonotype17,clonotype17_consensus_2 +CGTGTCTAGTGCCAGA-1,True,CGTGTCTAGTGCCAGA-1_contig_2,True,549,TRA,TRAV7-3,None,TRAJ12,TRAC,True,True,CAVSMGTGGYKVVF,TGTGCAGTGAGCATGGGGACTGGAGGCTATAAAGTGGTCTTT,43770,13,clonotype17,clonotype17_consensus_1 +CGTGTCTAGTGCCAGA-1,True,CGTGTCTAGTGCCAGA-1_contig_3,True,758,TRB,None,None,TRBJ2-5,TRBC2,False,False,None,None,4346,3,clonotype17,None +CTACATTAGGTGGGTT-1,True,CTACATTAGGTGGGTT-1_contig_1,True,538,TRB,TRBV2,None,TRBJ1-2,None,True,True,CASSQRTANSDYTF,TGTGCCAGCAGCCAACGGACAGCAAACTCCGACTACACCTTC,5594,1,clonotype18,clonotype18_consensus_1 +CTACATTAGGTGGGTT-1,True,CTACATTAGGTGGGTT-1_contig_2,True,548,TRA,TRAV9-1,None,TRAJ47,TRAC,True,True,CAVSAKEDYANKMIF,TGTGCTGTGAGCGCGAAGGAGGACTATGCAAACAAGATGATCTTT,24434,5,clonotype18,clonotype18_consensus_2 +CTACATTAGGTGGGTT-1,True,CTACATTAGGTGGGTT-1_contig_3,True,392,TRB,None,None,TRBJ1-3,TRBC1,False,False,None,None,30556,3,clonotype18,None +CTACATTAGGTGGGTT-1,True,CTACATTAGGTGGGTT-1_contig_4,True,429,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,16218,2,clonotype18,None +CTCGAGGTCACATACG-1,True,CTCGAGGTCACATACG-1_contig_1,True,564,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-5,TRBC2,True,True,CASGDARGDTQYF,TGTGCCAGCGGTGATGCCCGGGGAGACACCCAGTACTTT,58876,29,clonotype19,clonotype19_consensus_2 +CTCGAGGTCACATACG-1,True,CTCGAGGTCACATACG-1_contig_2,True,542,TRA,TRAV6-1,None,TRAJ13,TRAC,True,True,CVLGENSGTYQRF,TGTGTTCTGGGTGAGAATTCTGGGACTTACCAGAGGTTT,14738,4,clonotype19,clonotype19_consensus_1 +CTCGGAGCACAGACAG-1,True,CTCGGAGCACAGACAG-1_contig_1,True,568,TRB,TRBV12-2+TRBV13-2,None,TRBJ1-3,TRBC1,True,True,CASGDDNSGNTLYF,TGTGCCAGCGGTGATGATAATTCTGGAAATACGCTCTATTTT,32644,11,clonotype20,clonotype20_consensus_1 +CTCGGAGCACAGACAG-1,True,CTCGGAGCACAGACAG-1_contig_2,True,432,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,31900,10,clonotype20,None +CTCGGAGCACAGACAG-1,True,CTCGGAGCACAGACAG-1_contig_3,True,339,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,13178,2,clonotype20,None +CTGGTCTAGTGTACCT-1,True,CTGGTCTAGTGTACCT-1_contig_1,True,648,TRB,TRBV2,None,TRBJ2-7,TRBC2,True,True,CASSQERDNYEQYF,TGTGCCAGCAGCCAAGAAAGGGACAATTATGAACAGTACTTC,31272,9,clonotype21,clonotype21_consensus_2 +CTGGTCTAGTGTACCT-1,True,CTGGTCTAGTGTACCT-1_contig_2,True,533,TRA,TRAV6-6,None,TRAJ34,TRAC,True,True,CALGGANTDKVVF,TGTGCTCTGGGTGGAGCCAATACCGACAAAGTCGTCTTT,46728,9,clonotype21,clonotype21_consensus_1 +CTTAACTTCTTCAACT-1,True,CTTAACTTCTTCAACT-1_contig_1,True,598,TRA,TRAV3-1,None,TRAJ4,TRAC,True,True,CAVSPSSGSFNKLTF,TGCGCAGTCAGTCCCTCATCTGGTAGCTTCAATAAGTTGACCTTT,7212,4,clonotype22,clonotype22_consensus_1 +CTTAACTTCTTCAACT-1,True,CTTAACTTCTTCAACT-1_contig_2,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCTGGGACAGGGAACACAGAAGTCTTCTTT,49116,17,clonotype22,clonotype22_consensus_2 +CTTAACTTCTTCAACT-1,True,CTTAACTTCTTCAACT-1_contig_3,True,473,TRA,TRAV9-4,None,TRAJ17,TRAC,True,False,CALTNSAGNKLTF,TGTGCTCTGACTAACAGTGCAGGGAACAAGCTAACTTTT,3080,1,clonotype22,None +CTTAACTTCTTCAACT-1,True,CTTAACTTCTTCAACT-1_contig_4,True,405,TRB,None,None,TRBJ1-4,TRBC1,False,False,None,None,15812,5,clonotype22,None +GACGTGCCACAGGTTT-1,True,GACGTGCCACAGGTTT-1_contig_1,True,524,TRA,TRAV6-4,None,TRAJ13,TRAC,True,True,CALVGTNSGTYQRF,TGTGCTCTGGTTGGTACAAATTCTGGGACTTACCAGAGGTTT,10990,1,clonotype23,clonotype23_consensus_1 +GACGTGCCACAGGTTT-1,True,GACGTGCCACAGGTTT-1_contig_2,True,568,TRB,TRBV1,None,TRBJ2-2,TRBC2,True,True,CTCSADRDTGQLYF,TGCACCTGCAGTGCAGACAGGGACACCGGGCAGCTCTACTTT,53964,5,clonotype23,clonotype23_consensus_2 +GACGTGCCACAGGTTT-1,True,GACGTGCCACAGGTTT-1_contig_3,True,539,TRA,TRAV3-3,None,TRAJ37,TRAC,True,False,CAVSEGQAILENSSLGW,TGCGCAGTCAGTGAGGGGCAGGCAATACTAGAAAACTCATCTTTGGGCTGG,13374,1,clonotype23,None +GACGTTAAGTGTTGAA-1,True,GACGTTAAGTGTTGAA-1_contig_1,True,601,TRA,TRAV8D-2,None,TRAJ52,TRAC,True,True,CATDPFGGANTGKLTF,TGTGCTACAGATCCCTTCGGGGGAGCTAACACTGGAAAGCTCACGTTT,4660,1,clonotype24,clonotype24_consensus_1 +GACGTTAAGTGTTGAA-1,True,GACGTTAAGTGTTGAA-1_contig_2,True,704,TRB,TRBV19,None,TRBJ1-1,TRBC1,True,True,CASSSNENTEVFF,TGTGCCAGCAGTTCGAACGAAAACACAGAAGTCTTCTTT,68202,14,clonotype24,clonotype24_consensus_2 +GATCGATGTTAAGACA-1,True,GATCGATGTTAAGACA-1_contig_1,True,569,TRB,TRBV12-2+TRBV13-2,None,TRBJ1-3,TRBC1,True,True,CASGDSGNTLYF,TGTGCCAGCGGTGATTCTGGAAATACGCTCTATTTT,10804,4,clonotype25,clonotype25_consensus_1 +GATCGATGTTAAGACA-1,True,GATCGATGTTAAGACA-1_contig_2,True,305,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,67442,6,clonotype25,None +GATCTAGGTTCGGCAC-1,True,GATCTAGGTTCGGCAC-1_contig_1,True,538,TRA,TRAV6-6,None,TRAJ31,TRAC,True,True,CALSANNNNRIFF,TGTGCTCTGAGTGCGAATAACAATAACAGAATCTTCTTT,22644,9,clonotype26,clonotype26_consensus_1 +GATCTAGTCGTCTGAA-1,True,GATCTAGTCGTCTGAA-1_contig_1,True,524,TRB,TRBV13-1,None,TRBJ2-5,TRBC2,True,True,CASSDGLGFNQDTQYF,TGTGCCAGCAGTGATGGACTGGGGTTTAACCAAGACACCCAGTACTTT,16152,3,clonotype27,clonotype27_consensus_2 +GATCTAGTCGTCTGAA-1,True,GATCTAGTCGTCTGAA-1_contig_2,True,530,TRA,TRAV6N-7,None,TRAJ22,TRAC,True,True,CALSDSSGSWQLIF,TGTGCTCTGAGTGACTCTTCTGGCAGCTGGCAACTCATCTTT,10344,2,clonotype27,clonotype27_consensus_1 +GATCTAGTCGTCTGAA-1,True,GATCTAGTCGTCTGAA-1_contig_3,True,540,TRA,TRAV13-1,None,TRAJ22,TRAC,True,True,CAISGSWQLIF,TGTGCTATTTCTGGCAGCTGGCAACTCATCTTT,31908,7,clonotype27,clonotype27_consensus_3 +GATCTAGTCGTCTGAA-1,True,GATCTAGTCGTCTGAA-1_contig_4,True,433,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,4944,1,clonotype27,None +GATCTAGTCGTCTGAA-1,True,GATCTAGTCGTCTGAA-1_contig_5,True,368,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,13264,1,clonotype27,None +GCACATAGTACTCTCC-1,True,GCACATAGTACTCTCC-1_contig_1,True,557,TRA,TRAV3-3,None,TRAJ47,TRAC,True,True,CAGDYANKMIF,TGCGCGGGGGACTATGCAAACAAGATGATCTTT,24500,8,clonotype28,clonotype28_consensus_2 +GCACATAGTACTCTCC-1,True,GCACATAGTACTCTCC-1_contig_2,True,526,TRB,TRBV20,None,TRBJ2-7,TRBC2,True,True,CGARVGVGQYF,TGTGGTGCTAGGGTTGGGGTAGGACAGTACTTC,33672,10,clonotype28,clonotype28_consensus_1 +GCACATAGTACTCTCC-1,True,GCACATAGTACTCTCC-1_contig_3,True,576,TRA,TRAV13-1,None,TRAJ50,TRAC,True,False,None,None,15688,3,clonotype28,None +GCATGATGTCGCATAT-1,True,GCATGATGTCGCATAT-1_contig_1,True,631,TRA,TRAV5D-4,None,TRAJ57,TRAC,True,True,CAASDQGGSAKLIF,TGTGCTGCAAGTGATCAAGGAGGGTCTGCGAAGCTCATCTTT,37846,8,clonotype29,clonotype29_consensus_1 +GCCAAATGTCACCTAA-1,True,GCCAAATGTCACCTAA-1_contig_1,True,541,TRB,TRBV20,None,TRBJ1-5,TRBC1,True,True,CGAGQGAKAPLF,TGTGGTGCTGGACAGGGGGCGAAGGCTCCGCTTTTT,64196,6,clonotype30,clonotype30_consensus_1 +GCGCCAAAGCGTTCCG-1,True,GCGCCAAAGCGTTCCG-1_contig_1,True,524,TRA,TRAV16N,None,TRAJ37,TRAC,True,True,CAMRGITGNTRKLIF,TGTGCTATGAGAGGTATAACAGGCAATACTAGAAAACTCATCTTT,23390,1,clonotype31,clonotype31_consensus_1 +GCGCCAAAGCGTTCCG-1,True,GCGCCAAAGCGTTCCG-1_contig_2,True,682,TRB,TRBV19,None,TRBJ2-1,TRBC2,True,True,CASSITGPNYAEQFF,TGTGCCAGCAGTATAACTGGACCTAACTATGCTGAGCAGTTCTTC,55252,5,clonotype31,clonotype31_consensus_2 +GGAACTTCATCTGGTA-1,True,GGAACTTCATCTGGTA-1_contig_1,True,672,TRB,TRBV19,None,TRBJ1-1,TRBC1,True,True,CASTWGEAVFF,TGTGCCAGCACCTGGGGTGAGGCAGTCTTCTTT,61414,13,clonotype32,clonotype32_consensus_2 +GGAACTTCATCTGGTA-1,True,GGAACTTCATCTGGTA-1_contig_2,True,537,TRA,TRAV12-3,None,TRAJ39,TRAC,True,True,CALRNNNAGAKLTF,TGTGCTTTGAGGAATAATAATGCAGGTGCCAAGCTCACATTC,2326,2,clonotype32,clonotype32_consensus_1 +GGAACTTCATCTGGTA-1,True,GGAACTTCATCTGGTA-1_contig_3,True,483,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,14562,2,clonotype32,None +GGAATAAGTTGTCGCG-1,True,GGAATAAGTTGTCGCG-1_contig_1,True,602,TRB,TRBV3,None,TRBJ1-2,TRBC1,True,True,CASSRDDANSDYTF,TGTGCCAGCAGCCGGGACGATGCAAACTCCGACTACACCTTC,76576,13,clonotype33,clonotype33_consensus_1 +GGAATAAGTTGTCGCG-1,True,GGAATAAGTTGTCGCG-1_contig_2,True,596,TRA,TRAV7-4,None,TRAJ56,TRAC,True,False,CAGGRLLE,TGTGCAGGAGGGAGGCTACTGGAG,590,1,clonotype33,None +GGACAGATCTCGAGTA-1,True,GGACAGATCTCGAGTA-1_contig_1,True,515,TRA,TRAV6-5,None,TRAJ32,TRAC,True,True,CALSHYGGSGNKLIF,TGTGCTCTGAGTCATTATGGGGGCAGTGGCAACAAGCTCATCTTT,16344,2,clonotype34,clonotype34_consensus_1 +GGACAGATCTCGAGTA-1,True,GGACAGATCTCGAGTA-1_contig_2,True,502,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSQDFPEEVFF,TGTGCCAGCAGCCAAGATTTCCCAGAAGAAGTCTTCTTT,40442,5,clonotype34,clonotype34_consensus_2 +GGACAGATCTCGAGTA-1,True,GGACAGATCTCGAGTA-1_contig_3,True,542,TRA,TRAV5D-4,None,TRAJ49,TRAC,True,False,None,None,5878,1,clonotype34,None +GGACAGATCTCGAGTA-1,True,GGACAGATCTCGAGTA-1_contig_4,True,344,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,14718,1,clonotype34,None +GGACAGATCTCGAGTA-1,True,GGACAGATCTCGAGTA-1_contig_5,True,586,TRB,TRBV13-1,None,TRBJ1-1,TRBC1,True,False,None,None,1530,1,clonotype34,None +GGCTGGTGTCCTCCAT-1,True,GGCTGGTGTCCTCCAT-1_contig_1,True,531,TRA,TRAV6-6,None,TRAJ18,TRAC,True,True,CALGDRGSALGRLHF,TGTGCTCTGGGTGATAGAGGTTCAGCCTTAGGGAGGCTGCATTTT,36546,3,clonotype35,clonotype35_consensus_1 +GGCTGGTGTCCTCCAT-1,True,GGCTGGTGTCCTCCAT-1_contig_2,True,409,TRB,None,None,TRBJ1-3,TRBC1,False,False,None,None,42384,2,clonotype35,None +GGGCATCCAATAAGCA-1,True,GGGCATCCAATAAGCA-1_contig_1,True,511,TRA,TRAV4-2,None,TRAJ39,TRAC,True,True,CAAFNAGAKLTF,TGTGCTGCCTTTAATGCAGGTGCCAAGCTCACATTC,24674,9,clonotype36,clonotype36_consensus_2 +GGGCATCCAATAAGCA-1,True,GGGCATCCAATAAGCA-1_contig_2,True,660,TRB,TRBV19,None,TRBJ2-7,TRBC2,True,True,CASSMGGSSYEQYF,TGTGCCAGCAGTATGGGGGGGAGCTCCTATGAACAGTACTTC,28476,6,clonotype36,clonotype36_consensus_3 +GGGCATCCAATAAGCA-1,True,GGGCATCCAATAAGCA-1_contig_3,True,543,TRB,TRBV20,None,TRBJ1-4,TRBC1,True,True,CGAPRTGGDERLFF,TGTGGTGCCCCCCGGACAGGGGGCGACGAAAGATTATTTTTC,23282,4,clonotype36,clonotype36_consensus_1 +GGTGCGTTCAGCTCTC-1,True,GGTGCGTTCAGCTCTC-1_contig_1,True,564,TRA,TRAV5-1,None,TRAJ4,TRAC,True,True,CSASIGLLSGSFNKLTF,TGCTCAGCAAGTATTGGATTGTTATCTGGTAGCTTCAATAAGTTGACCTTT,14122,2,clonotype37,clonotype37_consensus_2 +GGTGCGTTCAGCTCTC-1,True,GGTGCGTTCAGCTCTC-1_contig_2,True,544,TRB,TRBV20,None,TRBJ2-7,TRBC2,True,True,CGASLFRDWGLSYEQYF,TGTGGTGCTAGTCTCTTCCGGGACTGGGGCCTCTCCTATGAACAGTACTTC,31838,5,clonotype37,clonotype37_consensus_1 +GGTGCGTTCAGCTCTC-1,True,GGTGCGTTCAGCTCTC-1_contig_3,True,557,TRA,TRAV6-6,None,TRAJ17,TRAC,True,False,None,None,31062,3,clonotype37,None +GTACTCCCACCTCGGA-1,True,GTACTCCCACCTCGGA-1_contig_1,True,710,TRB,TRBV19,None,TRBJ1-4,TRBC1,True,True,CASSIDRVGSERLFF,TGTGCCAGCAGTATAGACAGGGTAGGATCCGAAAGATTATTTTTC,23014,16,clonotype38,clonotype38_consensus_1 +GTACTCCCACCTCGGA-1,True,GTACTCCCACCTCGGA-1_contig_2,True,567,TRA,TRAV2,None,TRAJ30,TRAC,True,True,CIVTDLTNAYKVIF,TGCATTGTGACTGACCTCACAAATGCTTACAAAGTCATCTTT,17552,11,clonotype38,clonotype38_consensus_2 +GTACTCCCACCTCGGA-1,True,GTACTCCCACCTCGGA-1_contig_3,True,401,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,5264,1,clonotype38,None +GTACTCCCACCTCGGA-1,True,GTACTCCCACCTCGGA-1_contig_4,True,324,TRB,None,None,TRBJ2-2,TRBC2,False,False,None,None,4612,2,clonotype38,None +GTACTCCCACCTCGGA-1,True,GTACTCCCACCTCGGA-1_contig_5,True,345,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,5806,2,clonotype38,None +GTACTCCCACCTCGGA-1,True,GTACTCCCACCTCGGA-1_contig_6,True,361,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,22048,7,clonotype38,None +GTGAAGGTCTGTCAAG-1,True,GTGAAGGTCTGTCAAG-1_contig_1,True,571,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-7,TRBC2,True,True,CASGDADSSYEQYF,TGTGCCAGCGGTGATGCGGACAGCTCCTATGAACAGTACTTC,33696,2,clonotype39,clonotype39_consensus_1 +GTGAAGGTCTGTCAAG-1,True,GTGAAGGTCTGTCAAG-1_contig_2,True,369,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,12866,6,clonotype39,None +GTTACAGCATTCGACA-1,True,GTTACAGCATTCGACA-1_contig_1,True,510,TRA,TRAV6-5,None,TRAJ5,TRAC,True,True,CALGDTQVVGQLTF,TGTGCTCTGGGTGACACACAGGTTGTGGGGCAGCTCACTTTC,9862,10,clonotype40,clonotype40_consensus_1 +GTTACAGCATTCGACA-1,True,GTTACAGCATTCGACA-1_contig_2,True,415,TRB,TRBV31,None,TRBJ1-3,None,True,True,CAWRGGGGNTLYF,TGTGCCTGGCGGGGGGGGGGAGGAAATACGCTCTATTTT,15148,13,clonotype40,clonotype40_consensus_2 +GTTACAGCATTCGACA-1,True,GTTACAGCATTCGACA-1_contig_3,True,414,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,49186,29,clonotype40,None +GTTACAGCATTCGACA-1,True,GTTACAGCATTCGACA-1_contig_4,True,507,TRA,TRAV12-1,None,TRAJ11,TRAC,True,False,CPVLLCSNSGYNKLTF,TGCCCTGTACTACTGTGCTCTAACTCGGGATACAACAAACTCACTTTT,3054,2,clonotype40,None +GTTTCTATCTAACTGG-1,True,GTTTCTATCTAACTGG-1_contig_1,True,588,TRA,TRAV7-4,None,TRAJ9,TRAC,True,True,CAARGRGYKLTF,TGTGCAGCTAGGGGGAGGGGCTACAAACTTACCTTC,8002,3,clonotype41,clonotype41_consensus_1 +GTTTCTATCTAACTGG-1,True,GTTTCTATCTAACTGG-1_contig_2,True,560,TRB,TRBV13-3,None,TRBJ1-4,TRBC1,True,True,CASSAGTGGERLFF,TGTGCCAGCAGTGCCGGGACGGGCGGCGAAAGATTATTTTTC,31080,10,clonotype41,clonotype41_consensus_2 +GTTTCTATCTAACTGG-1,True,GTTTCTATCTAACTGG-1_contig_3,True,336,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,7710,3,clonotype41,None +GTTTCTATCTAACTGG-1,True,GTTTCTATCTAACTGG-1_contig_4,True,679,TRA,TRAV6-2,None,TRAJ39,TRAC,True,False,CVLGDRYRKLQIRLWSRYQTEGYST,TGTGTTCTGGGTGATAGGTACAGGAAACTACAAATACGTCTTTGGAGCAGGTACCAGACTGAAGGTTATAGCACC,2238,1,clonotype41,None +GTTTCTATCTAACTGG-1,True,GTTTCTATCTAACTGG-1_contig_5,True,326,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,26900,5,clonotype41,None +TATGCCCAGATATGCA-1,True,TATGCCCAGATATGCA-1_contig_1,True,584,TRA,TRAV6-2,None,TRAJ26,TRAC,True,True,CVLGDQNYAQGLTF,TGTGTTCTGGGTGATCAAAACTATGCCCAGGGATTAACCTTC,75622,5,clonotype42,clonotype42_consensus_2 +TATGCCCAGATATGCA-1,True,TATGCCCAGATATGCA-1_contig_2,True,714,TRB,TRBV2,None,TRBJ2-7,TRBC2,True,True,CASSHPGVSSYEQYF,TGTGCCAGCAGCCATCCCGGGGTTAGCTCCTATGAACAGTACTTC,3310,1,clonotype42,clonotype42_consensus_1 +TCAGCAACAAGGTTCT-1,True,TCAGCAACAAGGTTCT-1_contig_1,True,538,TRA,TRAV6-2,None,TRAJ11,TRAC,True,True,CVLGDSGYNKLTF,TGTGTTCTGGGTGACTCGGGATACAACAAACTCACTTTT,51778,7,clonotype43,clonotype43_consensus_1 +TCAGCAACAAGGTTCT-1,True,TCAGCAACAAGGTTCT-1_contig_2,True,561,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-3,TRBC2,True,True,CASGGGTGEAETLYF,TGTGCCAGCGGTGGTGGGACAGGGGAGGCAGAAACGCTGTATTTT,25892,4,clonotype43,clonotype43_consensus_2 +TGGTTAGGTGTCTGAT-1,True,TGGTTAGGTGTCTGAT-1_contig_1,True,528,TRA,TRAV14-1,None,TRAJ5,TRAC,True,True,CAAGTQVVGQLTF,TGTGCAGCCGGGACACAGGTTGTGGGGCAGCTCACTTTC,31486,5,clonotype44,clonotype44_consensus_2 +TGGTTAGGTGTCTGAT-1,True,TGGTTAGGTGTCTGAT-1_contig_2,True,707,TRB,TRBV19,None,TRBJ1-4,TRBC1,True,True,CASRTGGSNERLFF,TGTGCCAGCAGAACAGGGGGCTCCAACGAAAGATTATTTTTC,8964,2,clonotype44,clonotype44_consensus_1 +TGGTTAGGTGTCTGAT-1,True,TGGTTAGGTGTCTGAT-1_contig_3,True,473,TRB,None,None,TRBJ2-2,TRBC2,False,False,None,None,22010,2,clonotype44,None +TGGTTAGGTGTCTGAT-1,True,TGGTTAGGTGTCTGAT-1_contig_4,True,431,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,13840,1,clonotype44,None +TTAGGACGTTACGTCA-1,True,TTAGGACGTTACGTCA-1_contig_1,True,514,TRA,TRAV4-2,None,TRAJ45,TRAC,True,True,CAADTGGADRLTF,TGTGCTGCGGATACAGGAGGTGCAGATAGACTCACCTTT,15494,3,clonotype45,clonotype45_consensus_1 +TTAGGACGTTACGTCA-1,True,TTAGGACGTTACGTCA-1_contig_2,True,739,TRB,TRBV20,None,TRBJ2-7,TRBC2,True,True,CGARRNYEQYF,TGTGGTGCTAGAAGGAATTATGAACAGTACTTC,51036,8,clonotype45,clonotype45_consensus_2 +TTAGGACGTTACGTCA-1,True,TTAGGACGTTACGTCA-1_contig_3,True,544,TRA,TRAV8D-2,None,TRAJ31,TRAC,True,False,None,None,7462,1,clonotype45,None +TTCTACAGTCTTGTCC-1,True,TTCTACAGTCTTGTCC-1_contig_1,True,648,TRB,TRBV2,None,TRBJ2-4,TRBC2,True,True,CASSQEDAGRQNTLYF,TGTGCCAGCAGCCAAGAAGATGCTGGGCGTCAAAACACCTTGTACTTT,46314,3,clonotype46,clonotype46_consensus_1 +TTCTACAGTCTTGTCC-1,True,TTCTACAGTCTTGTCC-1_contig_2,True,599,TRA,TRAV19,None,TRAJ17,TRAC,True,True,CAAGRLTNSAGNKLTF,TGCGCAGCAGGGCGGTTGACTAACAGTGCAGGGAACAAGCTAACTTTT,30142,4,clonotype46,clonotype46_consensus_2 +TTCTACAGTCTTGTCC-1,True,TTCTACAGTCTTGTCC-1_contig_3,True,436,TRB,TRBV5,None,TRBJ1-1,None,True,False,CASSPGTGNTEVFF,TGTGCCAGCAGCCCTGGGACAGGGAACACAGAAGTCTTCTTT,4,2,clonotype46,None +TTCTTAGGTCAGTGGA-1,True,TTCTTAGGTCAGTGGA-1_contig_1,True,567,TRB,TRBV20,None,TRBJ2-7,TRBC2,True,True,CGARDLGGGGYEQYF,TGTGGTGCTAGGGATCTGGGGGGAGGCGGCTATGAACAGTACTTC,36732,6,clonotype47,clonotype47_consensus_1 +TTCTTAGGTCAGTGGA-1,True,TTCTTAGGTCAGTGGA-1_contig_2,True,632,TRA,TRAV5D-4,None,TRAJ27,TRAC,True,True,CAASRNTNTGKLTF,TGTGCTGCAAGCAGGAACACCAATACAGGCAAATTAACCTTT,36896,5,clonotype47,clonotype47_consensus_2 +TTCTTAGGTCAGTGGA-1,True,TTCTTAGGTCAGTGGA-1_contig_3,True,416,TRA,None,None,TRAJ26,TRAC,False,False,None,None,4894,1,clonotype47,None diff --git a/tests/testthat/fixtures/Chariou/h5files/SCAF1716_4_1_filtered_contig_annotations.csv b/tests/testthat/fixtures/Chariou/h5files/SCAF1716_4_1_filtered_contig_annotations.csv new file mode 100644 index 0000000..527c02a --- /dev/null +++ b/tests/testthat/fixtures/Chariou/h5files/SCAF1716_4_1_filtered_contig_annotations.csv @@ -0,0 +1,478 @@ +barcode,is_cell,contig_id,high_confidence,length,chain,v_gene,d_gene,j_gene,c_gene,full_length,productive,cdr3,cdr3_nt,reads,umis,raw_clonotype_id,raw_consensus_id +AAACGGGCAGTAACGG-1,True,AAACGGGCAGTAACGG-1_contig_1,True,714,TRB,TRBV2,None,TRBJ1-1,TRBC1,True,True,CASSQEEGANTEVFF,TGTGCCAGCAGCCAAGAGGAGGGTGCAAACACAGAAGTCTTCTTT,21738,6,clonotype6,clonotype6_consensus_2 +AAACGGGCAGTAACGG-1,True,AAACGGGCAGTAACGG-1_contig_2,True,576,TRA,TRAV16N,None,TRAJ30,TRAC,True,True,CAMREGRANAYKVIF,TGTGCTATGAGAGAGGGCCGGGCAAATGCTTACAAAGTCATCTTT,28238,6,clonotype6,clonotype6_consensus_1 +AAACGGGCAGTAACGG-1,True,AAACGGGCAGTAACGG-1_contig_3,True,410,TRB,None,None,TRBJ2-4,TRBC2,False,False,None,None,4260,3,clonotype6,None +AAACGGGCAGTAACGG-1,True,AAACGGGCAGTAACGG-1_contig_4,True,349,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,23282,8,clonotype6,None +AAACGGGGTCTGGAGA-1,True,AAACGGGGTCTGGAGA-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCAGGGACAGGGAACACAGAAGTCTTCTTT,11582,3,clonotype7,clonotype7_consensus_1 +AAACGGGGTCTGGAGA-1,True,AAACGGGGTCTGGAGA-1_contig_2,True,435,TRA,TRAV9-4,None,TRAJ17,TRAC,True,False,CALTNSAGNKLTF,TGTGCTCTGACTAACAGTGCAGGGAACAAGCTAACTTTT,21132,2,clonotype7,None +AAACGGGGTCTGGAGA-1,True,AAACGGGGTCTGGAGA-1_contig_3,True,447,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,28844,3,clonotype7,None +AAACGGGGTCTGGAGA-1,True,AAACGGGGTCTGGAGA-1_contig_4,True,320,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,2242,1,clonotype7,None +AAACGGGGTCTGGAGA-1,True,AAACGGGGTCTGGAGA-1_contig_5,True,342,TRB,None,None,TRBJ1-3,TRBC1,False,False,None,None,13278,2,clonotype7,None +AAAGATGGTGTGACGA-1,True,AAAGATGGTGTGACGA-1_contig_1,True,550,TRB,TRBV31,None,TRBJ2-7,TRBC2,True,True,CAWSLRSYEQYF,TGTGCCTGGAGTCTACGCTCCTATGAACAGTACTTC,45190,13,clonotype25,clonotype25_consensus_1 +AAAGATGGTGTGACGA-1,True,AAAGATGGTGTGACGA-1_contig_2,True,565,TRA,TRAV14D-1,None,TRAJ42,TRAC,True,True,CAASRGGGSNAKLTF,TGTGCAGCAAGTAGGGGGGGAGGAAGCAATGCAAAGCTAACCTTC,5400,3,clonotype25,clonotype25_consensus_2 +AAAGATGGTGTGACGA-1,True,AAAGATGGTGTGACGA-1_contig_3,True,397,TRB,None,None,TRBJ2-5,TRBC2,False,False,None,None,24024,6,clonotype25,None +AAATGCCCAAGTACCT-1,True,AAATGCCCAAGTACCT-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSVGQGNTEVFF,TGTGCCAGCAGCGTCGGACAGGGAAACACAGAAGTCTTCTTT,60994,15,clonotype14,clonotype14_consensus_1 +AAATGCCCAAGTACCT-1,True,AAATGCCCAAGTACCT-1_contig_2,True,723,TRA,TRAV9-4,None,TRAJ16,TRAC,True,True,CAVSTSSGQKLVF,TGTGCTGTGAGCACTTCAAGTGGCCAGAAGCTGGTTTTT,15780,4,clonotype14,clonotype14_consensus_2 +AAATGCCCAATAACGA-1,True,AAATGCCCAATAACGA-1_contig_1,True,561,TRB,TRBV13-3,None,TRBJ2-1,TRBC2,True,True,CASKLTGGNYAEQFF,TGTGCCAGCAAGCTGACTGGGGGTAACTATGCTGAGCAGTTCTTC,45318,4,clonotype26,clonotype26_consensus_3 +AAATGCCCAATAACGA-1,True,AAATGCCCAATAACGA-1_contig_2,True,732,TRA,TRAV9D-2,None,TRAJ48,TRAC,True,True,CAVSMDYGNEKITF,TGTGCTGTGAGCATGGACTATGGAAATGAGAAAATAACTTTT,13394,2,clonotype26,clonotype26_consensus_2 +AAATGCCCAATAACGA-1,True,AAATGCCCAATAACGA-1_contig_3,True,549,TRA,TRAV16N,None,TRAJ53,TRAC,True,True,CAMREDLLRGGSNYKLTF,TGTGCTATGAGAGAGGACCTCCTCCGTGGAGGCAGCAATTACAAACTGACATTT,18750,2,clonotype26,clonotype26_consensus_1 +AACGTTGGTAGTACCT-1,True,AACGTTGGTAGTACCT-1_contig_1,True,515,TRB,TRBV13-1,None,TRBJ1-1,TRBC1,True,True,CASSSLGDTEVFF,TGTGCCAGCAGTTCGTTGGGGGACACAGAAGTCTTCTTT,62126,10,clonotype27,clonotype27_consensus_1 +AACGTTGGTAGTACCT-1,True,AACGTTGGTAGTACCT-1_contig_2,True,731,TRA,TRAV3-1,None,TRAJ30,TRAC,True,False,CTSAQSVKVIF,TGTACTTCTGCGCAGTCAGTGAAAGTCATCTTT,11230,2,clonotype27,None +AAGACCTCAGGGAGAG-1,True,AAGACCTCAGGGAGAG-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGQGNTEVFF,TGTGCCAGCAGCCCGGGACAGGGAAACACAGAAGTCTTCTTT,6816,3,clonotype28,clonotype28_consensus_1 +AAGACCTCAGGGAGAG-1,True,AAGACCTCAGGGAGAG-1_contig_2,True,636,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,68476,15,clonotype28,None +AAGCCGCGTAGAGTGC-1,True,AAGCCGCGTAGAGTGC-1_contig_1,True,546,TRA,TRAV7D-3,None,TRAJ26,TRAC,True,True,CAVSLNYAQGLTF,TGTGCAGTGAGCCTCAACTATGCCCAGGGATTAACCTTC,20840,5,clonotype15,clonotype15_consensus_1 +AAGCCGCGTAGAGTGC-1,True,AAGCCGCGTAGAGTGC-1_contig_2,True,558,TRB,TRBV13-3,None,TRBJ2-7,TRBC2,True,True,CASSAPGLGSYEQYF,TGTGCCAGCAGTGCCCCGGGACTGGGGTCCTATGAACAGTACTTC,55528,13,clonotype15,clonotype15_consensus_2 +AAGGAGCAGACAAAGG-1,True,AAGGAGCAGACAAAGG-1_contig_1,True,594,TRA,TRAV7D-4,None,TRAJ40,TRAC,True,True,CAASEGTGNYKYVF,TGTGCAGCTAGTGAAGGTACAGGAAACTACAAATACGTCTTT,55564,7,clonotype16,clonotype16_consensus_2 +AAGGAGCAGACAAAGG-1,True,AAGGAGCAGACAAAGG-1_contig_2,True,522,TRB,TRBV5,None,TRBJ2-7,TRBC2,True,True,CASSPGLGDSYEQYF,TGTGCCAGCAGCCCAGGACTGGGGGACTCCTATGAACAGTACTTC,3742,1,clonotype16,clonotype16_consensus_1 +AAGGAGCAGACAAAGG-1,True,AAGGAGCAGACAAAGG-1_contig_3,True,510,TRA,TRAV13D-2,None,TRAJ31,TRAC,True,False,None,None,18872,4,clonotype16,None +AAGGTTCCAGCATACT-1,True,AAGGTTCCAGCATACT-1_contig_1,True,544,TRB,TRBV13-3,None,TRBJ1-3,TRBC1,True,True,CASSGDRGGNTLYF,TGTGCCAGCAGTGGGGACAGGGGTGGAAATACGCTCTATTTT,22572,10,clonotype8,clonotype8_consensus_1 +AAGGTTCCAGCATACT-1,True,AAGGTTCCAGCATACT-1_contig_2,True,516,TRB,TRBV17,None,TRBJ1-6,TRBC1,True,True,CGVQDNSPLYF,TGTGGGGTACAGGATAATTCGCCCCTCTACTTT,38134,20,clonotype8,clonotype8_consensus_3 +AAGGTTCCAGCATACT-1,True,AAGGTTCCAGCATACT-1_contig_3,True,530,TRA,TRAV16N,None,TRAJ56,TRAC,True,True,CAMREGPGGNNKLTF,TGTGCTATGAGAGAGGGACCTGGAGGCAATAATAAGCTGACTTTT,6254,2,clonotype8,clonotype8_consensus_2 +AAGGTTCCAGCATACT-1,True,AAGGTTCCAGCATACT-1_contig_4,True,364,TRA,TRAV17,None,TRAJ56,TRAC,True,False,None,None,8806,3,clonotype8,None +AATCGGTAGAAGGGTA-1,True,AATCGGTAGAAGGGTA-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCCGGGACAGGAAACACAGAAGTCTTCTTT,34280,21,clonotype2,clonotype2_consensus_2 +AATCGGTAGAAGGGTA-1,True,AATCGGTAGAAGGGTA-1_contig_2,True,669,TRA,TRAV9-4,None,TRAJ17,TRAC,True,True,CALTNSAGNKLTF,TGTGCTCTGACTAACAGTGCAGGGAACAAGCTAACTTTT,12154,7,clonotype2,clonotype2_consensus_1 +AATCGGTAGAAGGGTA-1,True,AATCGGTAGAAGGGTA-1_contig_3,True,318,TRB,None,None,TRBJ2-2,TRBC2,False,False,None,None,26078,10,clonotype2,None +AATCGGTAGAAGGGTA-1,True,AATCGGTAGAAGGGTA-1_contig_4,True,319,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,3912,1,clonotype2,None +AATCGGTTCCACGACG-1,True,AATCGGTTCCACGACG-1_contig_1,True,534,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCAGGGACAGGGAACACAGAAGTCTTCTTT,29406,2,clonotype7,clonotype7_consensus_1 +AATCGGTTCCACGACG-1,True,AATCGGTTCCACGACG-1_contig_2,True,361,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,41102,3,clonotype7,None +ACACCAAGTTCTGGTA-1,True,ACACCAAGTTCTGGTA-1_contig_1,True,672,TRB,TRBV19,None,TRBJ2-5,TRBC2,True,True,CASSMGTRDTQYF,TGTGCCAGCAGTATGGGGACAAGGGACACCCAGTACTTT,12668,2,clonotype17,clonotype17_consensus_1 +ACACCAAGTTCTGGTA-1,True,ACACCAAGTTCTGGTA-1_contig_2,True,403,TRA,TRAV6-6,None,TRAJ45,TRAC,True,False,CALGDPAGGADRLTF,TGTGCTCTGGGTGATCCCGCAGGAGGTGCAGATAGACTCACCTTT,19680,1,clonotype17,None +ACACCAAGTTCTGGTA-1,True,ACACCAAGTTCTGGTA-1_contig_3,True,328,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,39416,3,clonotype17,None +ACACTGAAGGCCCTCA-1,True,ACACTGAAGGCCCTCA-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCAGGGACAGGGAACACAGAAGTCTTCTTT,62836,25,clonotype9,clonotype9_consensus_2 +ACACTGAAGGCCCTCA-1,True,ACACTGAAGGCCCTCA-1_contig_2,True,731,TRA,TRAV9-4,None,TRAJ7,TRAC,True,True,CAVRDYSNNRLTL,TGTGCTGTGAGGGACTACAGCAACAACAGACTTACTTTG,5352,2,clonotype9,clonotype9_consensus_1 +ACACTGAAGGCCCTCA-1,True,ACACTGAAGGCCCTCA-1_contig_3,True,428,TRA,TRAV9-4,None,TRAJ17,TRAC,True,False,CALTNSAGNKLTF,TGTGCTCTGACTAACAGTGCAGGGAACAAGCTAACTTTT,4936,1,clonotype9,None +ACCAGTACACGAAACG-1,True,ACCAGTACACGAAACG-1_contig_1,True,577,TRA,TRAV6-6,None,TRAJ11,TRAC,True,True,CALGAPDSGYNKLTF,TGTGCTCTGGGTGCCCCCGACTCGGGATACAACAAACTCACTTTT,19298,3,clonotype29,clonotype29_consensus_2 +ACCAGTACACGAAACG-1,True,ACCAGTACACGAAACG-1_contig_2,True,554,TRB,TRBV12-2+TRBV13-2,None,TRBJ1-5,TRBC1,True,True,CASGDWAPLF,TGTGCCAGCGGTGATTGGGCTCCGCTTTTT,46552,4,clonotype29,clonotype29_consensus_1 +ACCCACTGTCAATGTC-1,True,ACCCACTGTCAATGTC-1_contig_1,True,521,TRB,TRBV13-1,None,TRBJ2-7,TRBC2,True,True,CASSDAGTGGYEQYF,TGTGCCAGCAGTGATGCCGGGACTGGGGGGTATGAACAGTACTTC,69384,15,clonotype30,clonotype30_consensus_2 +ACCCACTGTCAATGTC-1,True,ACCCACTGTCAATGTC-1_contig_2,True,591,TRA,TRAV7-4,None,TRAJ9,TRAC,True,True,CAASEDMGYKLTF,TGTGCAGCTAGTGAGGACATGGGCTACAAACTTACCTTC,6914,3,clonotype30,clonotype30_consensus_1 +ACGAGCCGTACAGACG-1,True,ACGAGCCGTACAGACG-1_contig_1,True,517,TRB,TRBV14,None,TRBJ1-1,TRBC1,True,True,CASSFGTVTEVFF,TGTGCCAGCAGTTTTGGGACCGTCACAGAAGTCTTCTTT,22562,14,clonotype18,clonotype18_consensus_1 +ACGAGCCGTACAGACG-1,True,ACGAGCCGTACAGACG-1_contig_2,True,362,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,30554,14,clonotype18,None +ACGAGCCGTACAGACG-1,True,ACGAGCCGTACAGACG-1_contig_3,True,504,TRA,TRAV12-3,None,TRAJ31,TRAC,True,False,CPVLLCF,TGCCCTGTACTACTGTGCTTT,1750,1,clonotype18,None +ACGAGCCGTACAGACG-1,True,ACGAGCCGTACAGACG-1_contig_4,True,570,Multi,TRDV1,None,TRAJ17,TRAC,True,False,CGGKEARAGNKLTF,TGTGGAGGGAAAGAGGCCCGTGCAGGGAACAAGCTAACTTTT,20488,8,clonotype18,None +ACGATGTTCGTGTAGT-1,True,ACGATGTTCGTGTAGT-1_contig_1,True,525,TRA,TRAV6-6,None,TRAJ45,TRAC,True,True,CALGDPAGGADRLTF,TGTGCTCTGGGTGATCCCGCAGGAGGTGCAGATAGACTCACCTTT,29780,5,clonotype31,clonotype31_consensus_1 +ACGATGTTCGTGTAGT-1,True,ACGATGTTCGTGTAGT-1_contig_2,True,731,TRB,TRBV19,None,TRBJ2-5,TRBC2,True,False,CASSMGTRDTQYF,TGTGCCAGCAGTATGGGGACAAGGGACACCCAGTACTTT,5860,4,clonotype31,None +ACGCAGCAGATACACA-1,True,ACGCAGCAGATACACA-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSQGQGNTEVFF,TGTGCCAGCAGCCAGGGACAGGGGAACACAGAAGTCTTCTTT,27454,13,clonotype32,clonotype32_consensus_1 +ACGCAGCAGATACACA-1,True,ACGCAGCAGATACACA-1_contig_2,True,669,TRA,TRAV9-4,None,TRAJ16,TRAC,True,True,CALSASSGQKLVF,TGTGCTCTGAGCGCTTCAAGTGGCCAGAAGCTGGTTTTT,5888,3,clonotype32,clonotype32_consensus_2 +ACGCAGCAGATACACA-1,True,ACGCAGCAGATACACA-1_contig_3,True,673,TRB,TRBV20,None,TRBJ1-1,TRBC1,True,False,None,None,13136,8,clonotype32,None +ACGCAGCAGATACACA-1,True,ACGCAGCAGATACACA-1_contig_4,True,567,TRA,TRAV3-3,None,TRAJ40,TRAC,True,False,None,None,29222,15,clonotype32,None +ACGGGTCAGAGTACAT-1,True,ACGGGTCAGAGTACAT-1_contig_1,True,721,TRB,TRBV19,None,TRBJ1-4,TRBC1,True,True,CASSIGGASNERLFF,TGTGCCAGCAGTATAGGGGGGGCGTCCAACGAAAGATTATTTTTC,25348,16,clonotype10,clonotype10_consensus_2 +ACGGGTCAGAGTACAT-1,True,ACGGGTCAGAGTACAT-1_contig_2,True,603,TRA,TRAV13-1,None,TRAJ53,TRAC,True,True,CAILSGGSNYKLTF,TGTGCTATCCTCAGTGGAGGCAGCAATTACAAACTGACATTT,21974,12,clonotype10,clonotype10_consensus_1 +ACGGGTCAGAGTACAT-1,True,ACGGGTCAGAGTACAT-1_contig_3,True,430,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,14014,4,clonotype10,None +ACGGGTCAGAGTACAT-1,True,ACGGGTCAGAGTACAT-1_contig_4,True,328,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,15284,7,clonotype10,None +ACTATCTCAGTCTTCC-1,True,ACTATCTCAGTCTTCC-1_contig_1,True,520,TRA,TRAV6-6,None,TRAJ42,TRAC,True,True,CALGLGGSNAKLTF,TGTGCTCTGGGCCTTGGAGGAAGCAATGCAAAGCTAACCTTC,21896,2,clonotype33,clonotype33_consensus_1 +ACTATCTCAGTCTTCC-1,True,ACTATCTCAGTCTTCC-1_contig_2,True,311,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,17254,4,clonotype33,None +ACTATCTCAGTCTTCC-1,True,ACTATCTCAGTCTTCC-1_contig_3,True,441,TRA,None,None,TRAJ41,TRAC,False,False,None,None,29568,6,clonotype33,None +ACTGATGAGTCCTCCT-1,True,ACTGATGAGTCCTCCT-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSQGQGNTEVFF,TGTGCCAGCAGCCAGGGACAGGGGAACACAGAAGTCTTCTTT,64020,21,clonotype34,clonotype34_consensus_1 +ACTGATGAGTCCTCCT-1,True,ACTGATGAGTCCTCCT-1_contig_2,True,567,TRA,TRAV3-3,None,TRAJ40,TRAC,True,False,None,None,8264,3,clonotype34,None +AGAGCGACAGCCACCA-1,True,AGAGCGACAGCCACCA-1_contig_1,True,715,TRB,TRBV19,None,TRBJ2-5,TRBC2,True,True,CASSMGTRDTQYF,TGTGCCAGCAGTATGGGGACAAGGGACACCCAGTACTTT,47560,15,clonotype1,clonotype1_consensus_2 +AGAGCGACAGCCACCA-1,True,AGAGCGACAGCCACCA-1_contig_2,True,526,TRA,TRAV6-6,None,TRAJ45,TRAC,True,True,CALGDPAGGADRLTF,TGTGCTCTGGGTGATCCCGCAGGAGGTGCAGATAGACTCACCTTT,10018,4,clonotype1,clonotype1_consensus_1 +AGAGCGACAGCCACCA-1,True,AGAGCGACAGCCACCA-1_contig_3,True,356,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,20944,4,clonotype1,None +AGAGCTTGTCAACATC-1,True,AGAGCTTGTCAACATC-1_contig_1,True,507,TRA,TRAV21-DV12,None,TRAJ56,TRAC,True,True,CILRGATGGNNKLTF,TGTATCCTGAGGGGGGCTACTGGAGGCAATAATAAGCTGACTTTT,17276,5,clonotype19,clonotype19_consensus_1 +AGAGCTTGTCAACATC-1,True,AGAGCTTGTCAACATC-1_contig_2,True,562,TRB,TRBV2,None,TRBJ2-4,TRBC2,True,True,CASSQRQGQNTLYF,TGTGCCAGCAGCCAAAGACAGGGCCAAAACACCTTGTACTTT,36978,9,clonotype19,clonotype19_consensus_2 +AGAGCTTGTCAACATC-1,True,AGAGCTTGTCAACATC-1_contig_3,True,405,TRB,None,None,TRBJ1-2,TRBC1,False,False,None,None,17060,5,clonotype19,None +AGAGCTTTCCAGTATG-1,True,AGAGCTTTCCAGTATG-1_contig_1,True,522,TRB,TRBV5,None,TRBJ2-7,TRBC2,True,True,CASSPGLGDSYEQYF,TGTGCCAGCAGCCCGGGACTGGGGGACTCCTATGAACAGTACTTC,43516,9,clonotype11,clonotype11_consensus_1 +AGAGCTTTCCAGTATG-1,True,AGAGCTTTCCAGTATG-1_contig_2,True,637,TRA,TRAV7-1,None,TRAJ12,TRAC,True,True,CAVSIGTGGYKVVF,TGTGCAGTGAGCATTGGGACTGGAGGCTATAAAGTGGTCTTT,19834,4,clonotype11,clonotype11_consensus_2 +AGAGCTTTCCAGTATG-1,True,AGAGCTTTCCAGTATG-1_contig_3,True,653,TRA,TRAV14N-3,None,TRAJ7,TRAC,True,False,None,None,12874,5,clonotype11,None +AGCAGCCAGGGATGGG-1,True,AGCAGCCAGGGATGGG-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGQGNTEVFF,TGTGCCAGCAGCCCGGGACAGGGGAACACAGAAGTCTTCTTT,57944,5,clonotype20,clonotype20_consensus_1 +AGCAGCCAGGGATGGG-1,True,AGCAGCCAGGGATGGG-1_contig_2,True,428,TRA,TRAV9-4,None,TRAJ16,TRAC,True,False,CALSSSSGQKLVF,TGTGCTCTGAGTTCTTCAAGTGGCCAGAAGCTGGTTTTT,18512,1,clonotype20,None +AGCGTATCAGTAAGCG-1,True,AGCGTATCAGTAAGCG-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCCGGGACAGGGAACACAGAAGTCTTCTTT,30952,6,clonotype3,clonotype3_consensus_2 +AGCGTATCAGTAAGCG-1,True,AGCGTATCAGTAAGCG-1_contig_2,True,667,TRA,TRAV9-4,None,TRAJ22,TRAC,True,True,CAVTSSGSWQLIF,TGTGCTGTGACATCTTCTGGCAGCTGGCAACTCATCTTT,15488,3,clonotype3,clonotype3_consensus_1 +AGCGTATCAGTAAGCG-1,True,AGCGTATCAGTAAGCG-1_contig_3,True,698,TRB,None,None,TRBJ2-5,TRBC2,False,False,None,None,15430,5,clonotype3,None +AGCGTCGTCCAAATGC-1,True,AGCGTCGTCCAAATGC-1_contig_1,True,743,TRA,TRAV9-4,None,TRAJ7,TRAC,True,True,CAVRDYSNNRLTL,TGTGCTGTGAGGGACTACAGCAACAACAGACTTACTTTG,10330,3,clonotype9,clonotype9_consensus_1 +AGCGTCGTCCAAATGC-1,True,AGCGTCGTCCAAATGC-1_contig_2,True,514,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCAGGGACAGGGAACACAGAAGTCTTCTTT,47034,5,clonotype9,clonotype9_consensus_2 +AGCGTCGTCCAAATGC-1,True,AGCGTCGTCCAAATGC-1_contig_3,True,626,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,21384,2,clonotype9,None +AGGGATGGTCTGATTG-1,True,AGGGATGGTCTGATTG-1_contig_1,True,603,TRA,TRAV14D-3-DV8,None,TRAJ45,TRAC,True,True,CAASATGGADRLTF,TGTGCAGCAAGTGCGACAGGAGGTGCAGATAGACTCACCTTT,35678,4,clonotype35,clonotype35_consensus_1 +AGGGATGGTCTGATTG-1,True,AGGGATGGTCTGATTG-1_contig_2,True,528,TRB,TRBV10,None,TRBJ2-4,TRBC2,True,True,CASSLDWGGGNTLYF,TGTGCCAGCAGCTTGGACTGGGGGGGCGGGAACACCTTGTACTTT,41658,4,clonotype35,clonotype35_consensus_2 +AGGGTGAAGATATGCA-1,True,AGGGTGAAGATATGCA-1_contig_1,True,518,TRB,TRBV13-1,None,TRBJ2-1,TRBC2,True,True,CASSLGGRYAEQFF,TGTGCCAGCAGTCTGGGGGGGCGCTATGCTGAGCAGTTCTTC,49874,6,clonotype36,clonotype36_consensus_1 +AGGGTGAAGATATGCA-1,True,AGGGTGAAGATATGCA-1_contig_2,True,337,TRA,TRAV16N,None,TRAJ50,TRAC,True,False,CAMRESASSSFSKLVF,TGTGCTATGAGAGAGTCAGCATCCTCCTCCTTCAGCAAGCTGGTGTTT,27728,2,clonotype36,None +AGGTCATAGGATGTAT-1,True,AGGTCATAGGATGTAT-1_contig_1,True,591,TRA,TRAV12-3,None,TRAJ49,TRAC,True,True,CALSDPVTGYQNFYF,TGTGCTTTGAGTGACCCTGTCACGGGTTACCAGAACTTCTATTTT,24622,13,clonotype12,clonotype12_consensus_1 +AGGTCATAGGATGTAT-1,True,AGGTCATAGGATGTAT-1_contig_2,True,578,TRB,TRBV13-3,None,TRBJ2-7,TRBC2,True,True,CASRLGFEQYF,TGTGCCAGCCGACTGGGGTTTGAACAGTACTTC,48318,21,clonotype12,clonotype12_consensus_2 +AGTAGTCAGATCCCGC-1,True,AGTAGTCAGATCCCGC-1_contig_1,True,535,TRA,TRAV6N-7,None,TRAJ17,TRAC,True,True,CALRSTNSAGNKLTF,TGTGCTCTGAGGTCAACTAACAGTGCAGGGAACAAGCTAACTTTT,59814,4,clonotype37,clonotype37_consensus_1 +AGTAGTCAGATCCCGC-1,True,AGTAGTCAGATCCCGC-1_contig_2,True,536,TRB,TRBV20,TRBD2,TRBJ2-3,TRBC2,True,True,CGARDWGGSETLYF,TGTGGTGCTAGGGACTGGGGGGGCTCAGAAACGCTGTATTTT,19018,1,clonotype37,clonotype37_consensus_2 +AGTGAGGTCAACACCA-1,True,AGTGAGGTCAACACCA-1_contig_1,True,588,TRA,TRAV12-3,None,TRAJ15,TRAC,True,True,CALSAYQGGRALIF,TGTGCTTTGAGTGCCTACCAGGGAGGCAGAGCTCTGATATTT,47388,8,clonotype38,clonotype38_consensus_2 +AGTGAGGTCAACACCA-1,True,AGTGAGGTCAACACCA-1_contig_2,True,710,TRB,TRBV19,None,TRBJ1-6,TRBC1,True,True,CASTRTGGGNSPLYF,TGTGCCAGCACCCGGACAGGGGGCGGTAATTCGCCCCTCTACTTT,11320,2,clonotype38,clonotype38_consensus_1 +AGTGAGGTCAACACCA-1,True,AGTGAGGTCAACACCA-1_contig_3,True,630,TRB,None,None,TRBJ2-5,TRBC2,False,False,None,None,19716,2,clonotype38,None +AGTGTCACAAGCTGAG-1,True,AGTGTCACAAGCTGAG-1_contig_1,True,715,TRB,TRBV19,None,TRBJ2-5,TRBC2,True,True,CASSMGTRDTQYF,TGTGCCAGCAGTATGGGGACAAGGGACACCCAGTACTTT,37212,10,clonotype1,clonotype1_consensus_2 +AGTGTCACAAGCTGAG-1,True,AGTGTCACAAGCTGAG-1_contig_2,True,555,TRA,TRAV6-6,None,TRAJ45,TRAC,True,True,CALGDPAGGADRLTF,TGTGCTCTGGGTGATCCCGCAGGAGGTGCAGATAGACTCACCTTT,28976,5,clonotype1,clonotype1_consensus_1 +AGTGTCACAAGCTGAG-1,True,AGTGTCACAAGCTGAG-1_contig_3,True,581,TRA,TRAV5D-4,None,TRAJ50,TRAC,True,False,None,None,9946,3,clonotype1,None +ATAAGAGAGGAATTAC-1,True,ATAAGAGAGGAATTAC-1_contig_1,True,594,TRA,TRAV7D-4,None,TRAJ48,TRAC,True,True,CAASEQGGNEKITF,TGTGCAGCTAGTGAGCAAGGGGGAAATGAGAAAATAACTTTT,35276,6,clonotype39,clonotype39_consensus_2 +ATAAGAGAGGAATTAC-1,True,ATAAGAGAGGAATTAC-1_contig_2,True,575,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-3,TRBC2,True,True,CASGDVRASAETLYF,TGTGCCAGCGGTGATGTCAGGGCTAGTGCAGAAACGCTGTATTTT,39376,7,clonotype39,clonotype39_consensus_1 +ATCCGAACAAGTCTAC-1,True,ATCCGAACAAGTCTAC-1_contig_1,True,522,TRB,TRBV5,None,TRBJ2-1,TRBC2,True,True,CASSQGQGDYAEQFF,TGTGCCAGCAGCCAAGGACAGGGGGACTATGCTGAGCAGTTCTTC,38822,11,clonotype40,clonotype40_consensus_2 +ATCCGAACAAGTCTAC-1,True,ATCCGAACAAGTCTAC-1_contig_2,True,725,TRA,TRAV9D-2,None,TRAJ43,TRAC,True,True,CAVGNNNAPRF,TGTGCTGTGGGAAACAACAATGCCCCACGATTT,22560,4,clonotype40,clonotype40_consensus_1 +ATCCGAACAAGTCTAC-1,True,ATCCGAACAAGTCTAC-1_contig_3,True,443,TRA,None,None,TRAJ41,TRAC,False,False,None,None,11790,5,clonotype40,None +ATCGAGTGTGTGTGCC-1,True,ATCGAGTGTGTGTGCC-1_contig_1,True,520,TRA,TRAV6-6,None,TRAJ45,TRAC,True,True,CALGDPAGGADRLTF,TGTGCTCTGGGTGATCCCGCAGGAGGTGCAGATAGACTCACCTTT,9558,1,clonotype1,clonotype1_consensus_1 +ATCGAGTGTGTGTGCC-1,True,ATCGAGTGTGTGTGCC-1_contig_2,True,682,TRB,TRBV19,None,TRBJ2-5,TRBC2,True,True,CASSMGTRDTQYF,TGTGCCAGCAGTATGGGGACAAGGGACACCCAGTACTTT,56060,5,clonotype1,clonotype1_consensus_2 +ATCGAGTGTGTGTGCC-1,True,ATCGAGTGTGTGTGCC-1_contig_3,True,670,TRA,TRAV5D-4,None,TRAJ50,TRAC,True,False,None,None,11946,1,clonotype1,None +ATCTACTAGGGTTTCT-1,True,ATCTACTAGGGTTTCT-1_contig_1,True,549,TRA,TRAV7-3,None,TRAJ18,TRAC,True,True,CAVDRGSALGRLHF,TGTGCAGTCGATAGAGGTTCAGCCTTAGGGAGGCTGCATTTT,28636,3,clonotype41,clonotype41_consensus_1 +ATCTACTAGGGTTTCT-1,True,ATCTACTAGGGTTTCT-1_contig_2,True,661,TRB,TRBV20,None,TRBJ2-7,TRBC2,True,True,CGATDIYEQYF,TGTGGTGCTACCGACATCTATGAACAGTACTTC,49042,3,clonotype41,clonotype41_consensus_2 +ATCTGCCCAGCTATTG-1,True,ATCTGCCCAGCTATTG-1_contig_1,True,718,TRB,TRBV19,None,TRBJ2-3,TRBC2,True,True,CASSRDWGAETLYF,TGTGCCAGCAGTCGGGACTGGGGGGCTGAAACGCTGTATTTT,59122,9,clonotype42,clonotype42_consensus_1 +ATCTGCCCAGCTATTG-1,True,ATCTGCCCAGCTATTG-1_contig_2,True,538,TRB,TRBV13-1,None,TRBJ2-4,TRBC2,True,False,None,None,11944,4,clonotype42,None +ATGAGGGAGGGCATGT-1,True,ATGAGGGAGGGCATGT-1_contig_1,True,538,TRB,TRBV20,TRBD1,TRBJ2-7,TRBC2,True,True,CGVPRDRGREQYF,TGTGGTGTCCCCCGGGACAGGGGGCGCGAACAGTACTTC,36286,16,clonotype13,clonotype13_consensus_3 +ATGAGGGAGGGCATGT-1,True,ATGAGGGAGGGCATGT-1_contig_2,True,509,TRB,TRBV29,None,TRBJ2-7,TRBC2,True,True,CASSGDRGHEQYF,TGTGCTAGCAGTGGGGACAGGGGTCATGAACAGTACTTC,24636,10,clonotype13,clonotype13_consensus_1 +ATGAGGGAGGGCATGT-1,True,ATGAGGGAGGGCATGT-1_contig_3,True,513,TRA,TRAV13-1,None,TRAJ6,TRAC,True,True,CAMATSGGNYKPTF,TGTGCTATGGCCACCTCAGGAGGAAACTACAAACCTACGTTT,3212,2,clonotype13,clonotype13_consensus_2 +ATGAGGGAGGGCATGT-1,True,ATGAGGGAGGGCATGT-1_contig_4,True,557,TRA,TRAV4-3,None,TRAJ15,TRAC,True,False,None,None,14204,4,clonotype13,None +ATTATCCAGCTCCCAG-1,True,ATTATCCAGCTCCCAG-1_contig_1,True,504,TRA,TRAV21-DV12,None,TRAJ47,TRAC,True,True,CILRRVDYANKMIF,TGTATCCTGAGACGGGTGGACTATGCAAACAAGATGATCTTT,10764,1,clonotype43,clonotype43_consensus_2 +ATTATCCAGCTCCCAG-1,True,ATTATCCAGCTCCCAG-1_contig_2,True,605,TRB,TRBV3,None,TRBJ1-2,TRBC1,True,True,CASSLAGGVNSDYTF,TGTGCCAGCAGCTTAGCAGGGGGAGTAAACTCCGACTACACCTTC,59984,9,clonotype43,clonotype43_consensus_1 +ATTATCCAGGGTATCG-1,True,ATTATCCAGGGTATCG-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCAGGGACAGGGAACACAGAAGTCTTCTTT,34478,13,clonotype4,clonotype4_consensus_2 +ATTATCCAGGGTATCG-1,True,ATTATCCAGGGTATCG-1_contig_2,True,715,TRA,TRAV9-4,None,TRAJ17,TRAC,True,True,CALTNSAGNKLTF,TGTGCTCTGACTAACAGTGCAGGGAACAAGCTAACTTTT,10472,3,clonotype4,clonotype4_consensus_1 +ATTATCCAGGGTATCG-1,True,ATTATCCAGGGTATCG-1_contig_3,True,354,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,13478,5,clonotype4,None +ATTATCCAGGGTATCG-1,True,ATTATCCAGGGTATCG-1_contig_4,True,344,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,18142,4,clonotype4,None +ATTCTACAGCTAAGAT-1,True,ATTCTACAGCTAAGAT-1_contig_1,True,644,TRA,TRAV7-1,None,TRAJ12,TRAC,True,True,CAVSIGTGGYKVVF,TGTGCAGTGAGCATTGGGACTGGAGGCTATAAAGTGGTCTTT,12214,12,clonotype11,clonotype11_consensus_2 +ATTCTACAGCTAAGAT-1,True,ATTCTACAGCTAAGAT-1_contig_2,True,566,TRB,TRBV5,None,TRBJ2-7,TRBC2,True,True,CASSPGLGDSYEQYF,TGTGCCAGCAGCCCGGGACTGGGGGACTCCTATGAACAGTACTTC,54234,19,clonotype11,clonotype11_consensus_1 +ATTCTACGTCCGAGTC-1,True,ATTCTACGTCCGAGTC-1_contig_1,True,543,TRB,TRBV13-2,TRBD2,TRBJ2-4,TRBC2,True,True,CASGDGDWGGATVTLYF,TGTGCCAGCGGTGATGGGGACTGGGGGGGCGCGACGGTCACCTTGTACTTT,52476,9,clonotype44,clonotype44_consensus_2 +ATTCTACGTCCGAGTC-1,True,ATTCTACGTCCGAGTC-1_contig_2,True,567,TRA,TRAV2,None,TRAJ15,TRAC,True,True,CIVTPLQGGRALIF,TGCATTGTGACCCCCCTCCAGGGAGGCAGAGCTCTGATATTT,11354,2,clonotype44,clonotype44_consensus_3 +ATTCTACGTCCGAGTC-1,True,ATTCTACGTCCGAGTC-1_contig_3,True,557,TRA,TRAV5-1,None,TRAJ11,TRAC,True,True,CSASRGDSGYNKLTF,TGCTCAGCAAGTAGAGGGGACTCGGGATACAACAAACTCACTTTT,9888,3,clonotype44,clonotype44_consensus_1 +ATTCTACGTCCGAGTC-1,True,ATTCTACGTCCGAGTC-1_contig_4,True,470,TRB,TRBV19,None,TRBJ2-3,None,True,False,CQQFRGRSAETLYF,TGCCAGCAGTTCAGGGGGCGGTCTGCAGAAACGCTGTATTTT,2528,1,clonotype44,None +ATTGGACAGGACCACA-1,True,ATTGGACAGGACCACA-1_contig_1,True,569,TRB,TRBV2,None,TRBJ1-1,TRBC1,True,True,CASSQEEGANTEVFF,TGTGCCAGCAGCCAAGAGGAGGGTGCAAACACAGAAGTCTTCTTT,15342,5,clonotype6,clonotype6_consensus_2 +ATTGGACAGGACCACA-1,True,ATTGGACAGGACCACA-1_contig_2,True,558,TRA,TRAV16N,None,TRAJ30,TRAC,True,True,CAMREGRANAYKVIF,TGTGCTATGAGAGAGGGCCGGGCAAATGCTTACAAAGTCATCTTT,9492,4,clonotype6,clonotype6_consensus_1 +ATTGGACAGGACCACA-1,True,ATTGGACAGGACCACA-1_contig_3,True,308,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,7046,1,clonotype6,None +ATTGGACAGGACCACA-1,True,ATTGGACAGGACCACA-1_contig_4,True,364,TRB,None,None,TRBJ2-4,TRBC2,False,False,None,None,7616,1,clonotype6,None +ATTGGACAGGACCACA-1,True,ATTGGACAGGACCACA-1_contig_5,True,320,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,9150,2,clonotype6,None +ATTGGACAGGACCACA-1,True,ATTGGACAGGACCACA-1_contig_6,True,357,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,21360,5,clonotype6,None +ATTGGACAGGACCACA-1,True,ATTGGACAGGACCACA-1_contig_7,True,562,TRA,TRAV8N-2,None,TRAJ52,TRAC,True,False,None,None,7236,3,clonotype6,None +ATTGGACTCGGTTAAC-1,True,ATTGGACTCGGTTAAC-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCAGGGACAGGGAACACAGAAGTCTTCTTT,31014,9,clonotype9,clonotype9_consensus_2 +ATTGGACTCGGTTAAC-1,True,ATTGGACTCGGTTAAC-1_contig_2,True,725,TRA,TRAV9-4,None,TRAJ7,TRAC,True,True,CAVRDYSNNRLTL,TGTGCTGTGAGGGACTACAGCAACAACAGACTTACTTTG,15346,4,clonotype9,clonotype9_consensus_1 +ATTGGACTCGGTTAAC-1,True,ATTGGACTCGGTTAAC-1_contig_3,True,339,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,30330,6,clonotype9,None +CAAGGCCCATCCAACA-1,True,CAAGGCCCATCCAACA-1_contig_1,True,727,TRA,TRAV9-4,None,TRAJ17,TRAC,True,True,CALTNSAGNKLTF,TGTGCTCTGACTAACAGTGCAGGGAACAAGCTAACTTTT,31136,7,clonotype4,clonotype4_consensus_1 +CAAGGCCCATCCAACA-1,True,CAAGGCCCATCCAACA-1_contig_2,True,541,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCAGGGACAGGGAACACAGAAGTCTTCTTT,17962,4,clonotype4,clonotype4_consensus_2 +CAAGGCCCATCCAACA-1,True,CAAGGCCCATCCAACA-1_contig_3,True,351,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,11324,1,clonotype4,None +CAAGGCCCATCCAACA-1,True,CAAGGCCCATCCAACA-1_contig_4,True,344,TRB,None,None,TRBJ1-3,TRBC1,False,False,None,None,13736,1,clonotype4,None +CACATAGGTCTCCCTA-1,True,CACATAGGTCTCCCTA-1_contig_1,True,715,TRB,TRBV19,None,TRBJ2-5,TRBC2,True,True,CASSMGTRDTQYF,TGTGCCAGCAGTATGGGGACAAGGGACACCCAGTACTTT,33978,10,clonotype1,clonotype1_consensus_2 +CACATAGGTCTCCCTA-1,True,CACATAGGTCTCCCTA-1_contig_2,True,439,TRA,TRAV6-6,None,TRAJ45,None,True,True,CALGDPAGGADRLTF,TGTGCTCTGGGTGATCCCGCAGGAGGTGCAGATAGACTCACCTTT,7600,1,clonotype1,clonotype1_consensus_1 +CACATAGGTCTCCCTA-1,True,CACATAGGTCTCCCTA-1_contig_3,True,301,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,26146,6,clonotype1,None +CAGAATCTCTAGAGTC-1,True,CAGAATCTCTAGAGTC-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCCGGGACAGGGAACACAGAAGTCTTCTTT,61260,18,clonotype45,clonotype45_consensus_1 +CAGAATCTCTAGAGTC-1,True,CAGAATCTCTAGAGTC-1_contig_2,True,734,TRA,TRAV9-4,None,TRAJ16,TRAC,True,True,CALTTSSGQKLVF,TGTGCTCTGACAACTTCAAGTGGCCAGAAGCTGGTTTTT,6418,8,clonotype45,clonotype45_consensus_2 +CAGCAGCAGATGCGAC-1,True,CAGCAGCAGATGCGAC-1_contig_1,True,624,TRB,TRBV2,None,TRBJ2-7,TRBC2,True,True,CASSQDWGVEQYF,TGTGCCAGCAGCCAAGACTGGGGAGTTGAACAGTACTTC,20358,5,clonotype46,clonotype46_consensus_1 +CAGCAGCAGATGCGAC-1,True,CAGCAGCAGATGCGAC-1_contig_2,True,524,TRA,TRAV6-6,None,TRAJ39,TRAC,True,True,CALAPNNNAGAKLTF,TGTGCTCTGGCCCCGAATAATAATGCAGGTGCCAAGCTCACATTC,29680,1,clonotype46,clonotype46_consensus_2 +CAGCAGCAGATGCGAC-1,True,CAGCAGCAGATGCGAC-1_contig_3,True,507,TRA,TRAV6-5,None,TRAJ40,TRAC,True,False,CSGPHTGNYKYVF,TGCTCTGGGCCCCATACAGGAAACTACAAATACGTCTTT,23158,1,clonotype46,None +CAGGTGCCAATCGAAA-1,True,CAGGTGCCAATCGAAA-1_contig_1,True,633,TRB,TRBV2,None,TRBJ1-5,TRBC1,True,True,CASSRPNQAPLF,TGTGCCAGCAGCCGACCCAACCAGGCTCCGCTTTTT,8356,3,clonotype47,clonotype47_consensus_1 +CAGGTGCCAATCGAAA-1,True,CAGGTGCCAATCGAAA-1_contig_2,True,560,Multi,TRDV1,None,TRAJ56,TRAC,True,False,CGGKGGATGGNNKLTF,TGTGGAGGGAAGGGGGGGGCTACTGGAGGCAATAATAAGCTGACTTTT,69802,11,clonotype47,None +CATATGGTCTGTCAAG-1,True,CATATGGTCTGTCAAG-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSVGQGNTEVFF,TGTGCCAGCAGCGTCGGACAGGGAAACACAGAAGTCTTCTTT,39634,8,clonotype14,clonotype14_consensus_1 +CATATGGTCTGTCAAG-1,True,CATATGGTCTGTCAAG-1_contig_2,True,726,TRA,TRAV9-4,None,TRAJ16,TRAC,True,True,CAVSTSSGQKLVF,TGTGCTGTGAGCACTTCAAGTGGCCAGAAGCTGGTTTTT,10456,3,clonotype14,clonotype14_consensus_2 +CATATGGTCTGTCAAG-1,True,CATATGGTCTGTCAAG-1_contig_3,True,522,TRA,TRAV6-6,None,TRAJ45,TRAC,True,False,CTTVLWVPHTGGADRLTF,TGTACTACTGTGCTCTGGGTCCCTCATACAGGAGGTGCAGATAGACTCACCTTT,5504,1,clonotype14,None +CATATGGTCTGTCAAG-1,True,CATATGGTCTGTCAAG-1_contig_4,True,322,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,10720,1,clonotype14,None +CATATGGTCTGTCAAG-1,True,CATATGGTCTGTCAAG-1_contig_5,True,361,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,10152,1,clonotype14,None +CATCGGGAGTCATCCA-1,True,CATCGGGAGTCATCCA-1_contig_1,True,540,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCAGGGACAGGGAACACAGAAGTCTTCTTT,50402,11,clonotype4,clonotype4_consensus_2 +CATCGGGAGTCATCCA-1,True,CATCGGGAGTCATCCA-1_contig_2,True,697,TRA,TRAV9-4,None,TRAJ17,TRAC,True,True,CALTNSAGNKLTF,TGTGCTCTGACTAACAGTGCAGGGAACAAGCTAACTTTT,24880,5,clonotype4,clonotype4_consensus_1 +CATGACAAGCGTTCCG-1,True,CATGACAAGCGTTCCG-1_contig_1,True,573,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-3,TRBC2,True,True,CASGDAWGVSAETLYF,TGTGCCAGCGGTGATGCTTGGGGGGTCAGTGCAGAAACGCTGTATTTT,37754,4,clonotype48,clonotype48_consensus_1 +CATGACAAGCGTTCCG-1,True,CATGACAAGCGTTCCG-1_contig_2,True,535,TRA,TRAV6D-3,None,TRAJ49,TRAC,True,True,CAMNPGYQNFYF,TGTGCTATGAATCCGGGTTACCAGAACTTCTATTTT,37322,4,clonotype48,clonotype48_consensus_2 +CATGCCTCAGACTCGC-1,True,CATGCCTCAGACTCGC-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCAGGGACAGGGAACACAGAAGTCTTCTTT,31418,7,clonotype7,clonotype7_consensus_1 +CATGCCTCAGACTCGC-1,True,CATGCCTCAGACTCGC-1_contig_2,True,338,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,35110,6,clonotype7,None +CATGCCTCAGACTCGC-1,True,CATGCCTCAGACTCGC-1_contig_3,True,485,TRA,TRAV9-4,None,TRAJ17,TRAC,True,False,CALTNSAGNKLTF,TGTGCTCTGACTAACAGTGCAGGGAACAAGCTAACTTTT,6104,4,clonotype7,None +CATGGCGAGAAAGTGG-1,True,CATGGCGAGAAAGTGG-1_contig_1,True,582,TRA,TRAV6-6,None,TRAJ45,TRAC,True,True,CALSVGGADRLTF,TGTGCTCTGAGTGTGGGAGGTGCAGATAGACTCACCTTT,15328,5,clonotype49,clonotype49_consensus_2 +CATGGCGAGAAAGTGG-1,True,CATGGCGAGAAAGTGG-1_contig_2,True,588,TRA,TRAV5D-4,None,TRAJ42,TRAC,True,True,CAAVGGSNAKLTF,TGTGCTGCAGTCGGAGGAAGCAATGCAAAGCTAACCTTC,21978,8,clonotype49,clonotype49_consensus_3 +CATGGCGAGAAAGTGG-1,True,CATGGCGAGAAAGTGG-1_contig_3,True,568,TRB,TRBV1,None,TRBJ2-5,TRBC2,True,True,CTCSAGGGQDTQYF,TGCACCTGCAGTGCAGGGGGAGGCCAAGACACCCAGTACTTT,39582,16,clonotype49,clonotype49_consensus_1 +CCAATCCGTATATGGA-1,True,CCAATCCGTATATGGA-1_contig_1,True,590,TRB,TRBV13-3,None,TRBJ2-7,TRBC2,True,True,CASSAPGLGSYEQYF,TGTGCCAGCAGTGCCCCGGGACTGGGGTCCTATGAACAGTACTTC,17572,2,clonotype15,clonotype15_consensus_2 +CCAATCCGTATATGGA-1,True,CCAATCCGTATATGGA-1_contig_2,True,546,TRA,TRAV7D-3,None,TRAJ26,TRAC,True,True,CAVSLNYAQGLTF,TGTGCAGTGAGCCTCAACTATGCCCAGGGATTAACCTTC,10232,1,clonotype15,clonotype15_consensus_1 +CCAATCCGTATATGGA-1,True,CCAATCCGTATATGGA-1_contig_3,True,647,TRB,None,None,TRBJ1-4,TRBC1,False,False,None,None,38020,10,clonotype15,None +CCAATCCGTATATGGA-1,True,CCAATCCGTATATGGA-1_contig_4,True,534,TRA,TRAV16N,None,TRAJ38,TRAC,True,False,None,None,10662,3,clonotype15,None +CCACGGAGTGCGATAG-1,True,CCACGGAGTGCGATAG-1_contig_1,True,663,TRB,TRBV19,None,TRBJ1-1,TRBC1,True,True,CASSIDSAEVFF,TGTGCCAGCAGTATCGACAGCGCAGAAGTCTTCTTT,69598,14,clonotype50,clonotype50_consensus_1 +CCACTACGTTCCATGA-1,True,CCACTACGTTCCATGA-1_contig_1,True,715,TRB,TRBV19,None,TRBJ2-5,TRBC2,True,True,CASSMGTRDTQYF,TGTGCCAGCAGTATGGGGACAAGGGACACCCAGTACTTT,45668,14,clonotype1,clonotype1_consensus_2 +CCACTACGTTCCATGA-1,True,CCACTACGTTCCATGA-1_contig_2,True,531,TRA,TRAV6-6,None,TRAJ45,TRAC,True,True,CALGDPAGGADRLTF,TGTGCTCTGGGTGATCCCGCAGGAGGTGCAGATAGACTCACCTTT,15232,7,clonotype1,clonotype1_consensus_1 +CCACTACGTTCCATGA-1,True,CCACTACGTTCCATGA-1_contig_3,True,333,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,6432,1,clonotype1,None +CCACTACGTTCCATGA-1,True,CCACTACGTTCCATGA-1_contig_4,True,391,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,9362,4,clonotype1,None +CCATTCGAGATCTGAA-1,True,CCATTCGAGATCTGAA-1_contig_1,True,522,TRB,TRBV5,None,TRBJ2-7,TRBC2,True,True,CASSPGLGDSYEQYF,TGTGCCAGCAGCCCAGGACTGGGGGACTCCTATGAACAGTACTTC,60610,7,clonotype16,clonotype16_consensus_1 +CCATTCGAGATCTGAA-1,True,CCATTCGAGATCTGAA-1_contig_2,True,594,TRA,TRAV7D-4,None,TRAJ40,TRAC,True,True,CAASEGTGNYKYVF,TGTGCAGCTAGTGAAGGTACAGGAAACTACAAATACGTCTTT,8078,2,clonotype16,clonotype16_consensus_2 +CCATTCGCACGCATCG-1,True,CCATTCGCACGCATCG-1_contig_1,True,514,TRB,TRBV13-1,None,TRBJ2-5,TRBC2,True,True,CASSDTTGGQDTQYF,TGTGCCAGCAGTGATACTACTGGGGGCCAAGACACCCAGTACTTT,49954,9,clonotype21,clonotype21_consensus_1 +CCATTCGCACGCATCG-1,True,CCATTCGCACGCATCG-1_contig_2,True,374,TRB,None,None,TRBJ2-4,TRBC2,False,False,None,None,12672,4,clonotype21,None +CCATTCGCACGCATCG-1,True,CCATTCGCACGCATCG-1_contig_3,True,323,TRA,TRAV12-3,None,TRAJ31,TRAC,True,False,None,None,12410,2,clonotype21,None +CCATTCGTCATCTGCC-1,True,CCATTCGTCATCTGCC-1_contig_1,True,512,TRB,TRBV13-1,None,TRBJ2-3,TRBC2,True,True,CASRDSAETLYF,TGTGCCAGCAGGGACAGTGCAGAAACGCTGTATTTT,53134,8,clonotype51,clonotype51_consensus_2 +CCATTCGTCATCTGCC-1,True,CCATTCGTCATCTGCC-1_contig_2,True,522,TRA,TRAV6-6,None,TRAJ26,TRAC,True,True,CALGDHGNYAQGLTF,TGTGCTCTGGGTGATCACGGTAACTATGCCCAGGGATTAACCTTC,24628,3,clonotype51,clonotype51_consensus_1 +CCCTCCTGTTAGGGTG-1,True,CCCTCCTGTTAGGGTG-1_contig_1,True,520,TRA,TRAV6-6,None,TRAJ45,TRAC,True,True,CALSDPAGGADRLTF,TGTGCTCTGAGTGATCCGGCAGGAGGTGCAGATAGACTCACCTTT,44804,9,clonotype52,clonotype52_consensus_1 +CCCTCCTGTTAGGGTG-1,True,CCCTCCTGTTAGGGTG-1_contig_2,True,562,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-5,TRBC2,True,False,None,None,5582,1,clonotype52,None +CCCTCCTGTTAGGGTG-1,True,CCCTCCTGTTAGGGTG-1_contig_3,True,753,TRB,TRBV19,None,TRBJ2-1,TRBC2,True,False,CASSIGGNYAEQFF,TGTGCCAGCAGTATTGGGGGGAACTATGCTGAGCAGTTCTTC,9528,2,clonotype52,None +CCCTCCTGTTAGGGTG-1,True,CCCTCCTGTTAGGGTG-1_contig_4,True,355,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,17390,3,clonotype52,None +CCGTTCACATATACGC-1,True,CCGTTCACATATACGC-1_contig_1,True,728,TRA,TRAV9-4,None,TRAJ22,TRAC,True,True,CAVTSSGSWQLIF,TGTGCTGTGACATCTTCTGGCAGCTGGCAACTCATCTTT,1494,1,clonotype3,clonotype3_consensus_1 +CCGTTCACATATACGC-1,True,CCGTTCACATATACGC-1_contig_2,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCCGGGACAGGGAACACAGAAGTCTTCTTT,66676,6,clonotype3,clonotype3_consensus_2 +CCGTTCACATATACGC-1,True,CCGTTCACATATACGC-1_contig_3,True,627,TRA,None,None,TRAJ41,TRAC,False,False,None,None,8524,5,clonotype3,None +CCTAAAGAGAGACGAA-1,True,CCTAAAGAGAGACGAA-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCAGGGACAGGGAACACAGAAGTCTTCTTT,27684,18,clonotype5,clonotype5_consensus_3 +CCTAAAGAGAGACGAA-1,True,CCTAAAGAGAGACGAA-1_contig_2,True,731,TRA,TRAV9-4,None,TRAJ17,TRAC,True,True,CALTNSAGNKLTF,TGTGCTCTGACTAACAGTGCAGGGAACAAGCTAACTTTT,15062,10,clonotype5,clonotype5_consensus_2 +CCTAAAGAGAGACGAA-1,True,CCTAAAGAGAGACGAA-1_contig_3,True,731,TRA,TRAV9-4,None,TRAJ7,TRAC,True,True,CAVRDYSNNRLTL,TGTGCTGTGAGGGACTACAGCAACAACAGACTTACTTTG,12566,8,clonotype5,clonotype5_consensus_1 +CCTAAAGAGAGACGAA-1,True,CCTAAAGAGAGACGAA-1_contig_4,True,368,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,10268,5,clonotype5,None +CCTAAAGAGAGACGAA-1,True,CCTAAAGAGAGACGAA-1_contig_5,True,429,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,4538,2,clonotype5,None +CCTAAAGAGAGACGAA-1,True,CCTAAAGAGAGACGAA-1_contig_6,True,639,TRB,TRBV2,None,TRBJ1-1,TRBC1,True,False,None,None,6442,6,clonotype5,None +CCTAAAGTCGGACAAG-1,True,CCTAAAGTCGGACAAG-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGQGNTEVFF,TGTGCCAGCAGCCCGGGACAGGGGAACACAGAAGTCTTCTTT,43694,4,clonotype22,clonotype22_consensus_2 +CCTAAAGTCGGACAAG-1,True,CCTAAAGTCGGACAAG-1_contig_2,True,657,TRA,TRAV9-4,None,TRAJ16,TRAC,True,True,CALSSSSGQKLVF,TGTGCTCTGAGTTCTTCAAGTGGCCAGAAGCTGGTTTTT,30184,6,clonotype22,clonotype22_consensus_1 +CCTAAAGTCGGACAAG-1,True,CCTAAAGTCGGACAAG-1_contig_3,True,800,TRB,None,None,TRBJ1-5,None,False,False,None,None,436,1,clonotype22,None +CCTAAAGTCGGACAAG-1,True,CCTAAAGTCGGACAAG-1_contig_4,True,356,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,4072,3,clonotype22,None +CCTACACTCCTACAGA-1,True,CCTACACTCCTACAGA-1_contig_1,True,656,TRB,TRBV19,None,TRBJ2-4,TRBC2,True,True,CASSISGGDSQNTLYF,TGTGCCAGCAGTATCTCTGGGGGGGACAGTCAAAACACCTTGTACTTT,7352,1,clonotype53,clonotype53_consensus_2 +CCTACACTCCTACAGA-1,True,CCTACACTCCTACAGA-1_contig_2,True,521,TRA,TRAV7D-2,None,TRAJ9,TRAC,True,True,CAASKGGNMGYKLTF,TGTGCAGCAAGCAAGGGGGGGAACATGGGCTACAAACTTACCTTC,11346,5,clonotype53,clonotype53_consensus_1 +CCTACACTCCTACAGA-1,True,CCTACACTCCTACAGA-1_contig_3,True,461,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,52554,9,clonotype53,None +CCTACACTCTATGTGG-1,True,CCTACACTCTATGTGG-1_contig_1,True,522,TRB,TRBV17,None,TRBJ2-7,TRBC2,True,True,CASSRDRGHEQYF,TGTGCTAGCAGTAGAGACAGGGGGCATGAACAGTACTTC,69836,22,clonotype54,clonotype54_consensus_1 +CCTACCAGTATGGTTC-1,True,CCTACCAGTATGGTTC-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGQGNTEVFF,TGTGCCAGCAGCCCGGGACAGGGGAACACAGAAGTCTTCTTT,47968,17,clonotype20,clonotype20_consensus_1 +CCTACCAGTATGGTTC-1,True,CCTACCAGTATGGTTC-1_contig_2,True,333,TRA,TRAV9D-2,None,TRAJ16,TRAC,True,False,CALSSSSGQKLVF,TGTGCTCTGAGTTCTTCAAGTGGCCAGAAGCTGGTTTTT,22470,8,clonotype20,None +CCTACCAGTATGGTTC-1,True,CCTACCAGTATGGTTC-1_contig_3,True,323,TRB,None,None,TRBJ2-2,TRBC2,False,False,None,None,4056,4,clonotype20,None +CCTCAGTAGAATAGGG-1,True,CCTCAGTAGAATAGGG-1_contig_1,True,517,TRB,TRBV14,None,TRBJ1-1,TRBC1,True,True,CASSFGTVTEVFF,TGTGCCAGCAGTTTTGGGACCGTCACAGAAGTCTTCTTT,32852,8,clonotype18,clonotype18_consensus_1 +CCTCAGTAGAATAGGG-1,True,CCTCAGTAGAATAGGG-1_contig_2,True,371,Multi,TRDV1,None,None,TRAC,False,False,None,None,10042,2,clonotype18,None +CCTCAGTAGAATAGGG-1,True,CCTCAGTAGAATAGGG-1_contig_3,True,434,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,33882,5,clonotype18,None +CCTCTGAAGCTAGTCT-1,True,CCTCTGAAGCTAGTCT-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCAGGGACAGGGAACACAGAAGTCTTCTTT,39912,12,clonotype5,clonotype5_consensus_3 +CCTCTGAAGCTAGTCT-1,True,CCTCTGAAGCTAGTCT-1_contig_2,True,514,TRA,TRAV9-4,None,TRAJ17,TRAC,True,True,CALTNSAGNKLTF,TGTGCTCTGACTAACAGTGCAGGGAACAAGCTAACTTTT,9560,3,clonotype5,clonotype5_consensus_2 +CCTCTGAAGCTAGTCT-1,True,CCTCTGAAGCTAGTCT-1_contig_3,True,514,TRA,TRAV9-4,None,TRAJ7,TRAC,True,True,CAVRDYSNNRLTL,TGTGCTGTGAGGGACTACAGCAACAACAGACTTACTTTG,17668,9,clonotype5,clonotype5_consensus_1 +CCTCTGAAGCTAGTCT-1,True,CCTCTGAAGCTAGTCT-1_contig_4,True,357,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,4708,3,clonotype5,None +CCTTCGAAGGCTCTTA-1,True,CCTTCGAAGGCTCTTA-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCCGGGACAGGAAACACAGAAGTCTTCTTT,24430,13,clonotype2,clonotype2_consensus_2 +CCTTCGAAGGCTCTTA-1,True,CCTTCGAAGGCTCTTA-1_contig_2,True,670,TRA,TRAV9-4,None,TRAJ17,TRAC,True,True,CALTNSAGNKLTF,TGTGCTCTGACTAACAGTGCAGGGAACAAGCTAACTTTT,10456,4,clonotype2,clonotype2_consensus_1 +CCTTCGAAGGCTCTTA-1,True,CCTTCGAAGGCTCTTA-1_contig_3,True,331,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,15272,8,clonotype2,None +CCTTCGAAGGCTCTTA-1,True,CCTTCGAAGGCTCTTA-1_contig_4,True,306,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,23862,8,clonotype2,None +CGACCTTTCGGTCTAA-1,True,CGACCTTTCGGTCTAA-1_contig_1,True,521,TRA,TRAV6-6,None,TRAJ45,TRAC,True,True,CALGDPAGGADRLTF,TGTGCTCTGGGTGATCCCGCAGGAGGTGCAGATAGACTCACCTTT,41796,3,clonotype1,clonotype1_consensus_1 +CGACCTTTCGGTCTAA-1,True,CGACCTTTCGGTCTAA-1_contig_2,True,703,TRB,TRBV19,None,TRBJ2-5,TRBC2,True,True,CASSMGTRDTQYF,TGTGCCAGCAGTATGGGGACAAGGGACACCCAGTACTTT,34836,3,clonotype1,clonotype1_consensus_2 +CGAGCACAGACTCGGA-1,True,CGAGCACAGACTCGGA-1_contig_1,True,669,TRA,TRAV7-1,None,TRAJ12,TRAC,True,True,CAVSIGTGGYKVVF,TGTGCAGTGAGCATTGGGACTGGAGGCTATAAAGTGGTCTTT,37372,4,clonotype11,clonotype11_consensus_2 +CGAGCACAGACTCGGA-1,True,CGAGCACAGACTCGGA-1_contig_2,True,512,TRB,TRBV5,None,TRBJ2-7,TRBC2,True,True,CASSPGLGDSYEQYF,TGTGCCAGCAGCCCGGGACTGGGGGACTCCTATGAACAGTACTTC,29222,5,clonotype11,clonotype11_consensus_1 +CGAGCACAGACTCGGA-1,True,CGAGCACAGACTCGGA-1_contig_3,True,603,TRA,TRAV14N-3,None,TRAJ7,TRAC,True,False,None,None,7188,1,clonotype11,None +CGAGCCACACGTGAGA-1,True,CGAGCCACACGTGAGA-1_contig_1,True,558,TRA,TRAV16N,None,TRAJ30,TRAC,True,True,CAMREGRANAYKVIF,TGTGCTATGAGAGAGGGCCGGGCAAATGCTTACAAAGTCATCTTT,53326,10,clonotype23,clonotype23_consensus_1 +CGATCGGCACCGTTGG-1,True,CGATCGGCACCGTTGG-1_contig_1,True,522,TRB,TRBV17,None,TRBJ1-1,TRBC1,True,True,CASSRGSNTEVFF,TGTGCTAGCAGTAGAGGATCAAACACAGAAGTCTTCTTT,55720,8,clonotype55,clonotype55_consensus_1 +CGATCGGCACCGTTGG-1,True,CGATCGGCACCGTTGG-1_contig_2,True,607,TRA,TRAV5D-4,None,TRAJ31,TRAC,True,True,CAASRGNNRIFF,TGTGCTGCAAGTAGGGGCAATAACAGAATCTTCTTT,21432,3,clonotype55,clonotype55_consensus_2 +CGATGTAAGTGTCCCG-1,True,CGATGTAAGTGTCCCG-1_contig_1,True,580,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-1,TRBC2,True,True,CASGEGGADYAEQFF,TGTGCCAGCGGTGAGGGGGGCGCTGACTATGCTGAGCAGTTCTTC,52678,4,clonotype56,clonotype56_consensus_1 +CGATGTAAGTGTCCCG-1,True,CGATGTAAGTGTCCCG-1_contig_2,True,528,TRA,TRAV7D-5,None,TRAJ17,TRAC,True,True,CAVSPRSAGNKLTF,TGTGCAGTGAGCCCAAGGAGTGCAGGGAACAAGCTAACTTTT,25262,4,clonotype56,clonotype56_consensus_2 +CGGACGTAGGACAGCT-1,True,CGGACGTAGGACAGCT-1_contig_1,True,676,TRA,TRAV7-1,None,TRAJ32,TRAC,True,True,CAVDGGSGNKLIF,TGTGCAGTGGATGGGGGCAGTGGCAACAAGCTCATCTTT,22524,4,clonotype57,clonotype57_consensus_1 +CGGACGTAGGACAGCT-1,True,CGGACGTAGGACAGCT-1_contig_2,True,565,TRB,TRBV2,None,TRBJ2-5,TRBC2,True,True,CASSQDWGAQDTQYF,TGTGCCAGCAGCCAAGATTGGGGGGCCCAAGACACCCAGTACTTT,7130,1,clonotype57,clonotype57_consensus_2 +CGGACGTAGGACAGCT-1,True,CGGACGTAGGACAGCT-1_contig_3,True,567,TRA,TRAV6N-7,None,TRAJ6,TRAC,True,False,None,None,26012,2,clonotype57,None +CGGACGTAGGACAGCT-1,True,CGGACGTAGGACAGCT-1_contig_4,True,326,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,14846,1,clonotype57,None +CGGACGTAGGACAGCT-1,True,CGGACGTAGGACAGCT-1_contig_5,True,613,TRB,TRBV13-1,TRBD1,TRBJ2-5,TRBC2,True,False,CQHSGQGADTQYF,TGCCAGCACTCGGGACAGGGGGCCGACACCCAGTACTTT,7738,1,clonotype57,None +CGGAGCTAGACCTTTG-1,True,CGGAGCTAGACCTTTG-1_contig_1,True,591,TRA,TRAV12-3,None,TRAJ49,TRAC,True,True,CALSDPVTGYQNFYF,TGTGCTTTGAGTGACCCTGTCACGGGTTACCAGAACTTCTATTTT,34860,7,clonotype12,clonotype12_consensus_1 +CGGAGCTAGACCTTTG-1,True,CGGAGCTAGACCTTTG-1_contig_2,True,549,TRB,TRBV13-3,None,TRBJ2-7,TRBC2,True,True,CASRLGFEQYF,TGTGCCAGCCGACTGGGGTTTGAACAGTACTTC,43196,6,clonotype12,clonotype12_consensus_2 +CGTAGGCTCTGCCAGG-1,True,CGTAGGCTCTGCCAGG-1_contig_1,True,531,TRA,TRAV6N-7,None,TRAJ33,TRAC,True,True,CALSDRGSNYQLIW,TGTGCTCTGAGTGATCGGGGTAGCAACTATCAGTTGATCTGG,48210,11,clonotype58,clonotype58_consensus_1 +CGTAGGCTCTGCCAGG-1,True,CGTAGGCTCTGCCAGG-1_contig_2,True,701,TRB,TRBV19,None,TRBJ1-5,TRBC1,True,True,CASSIGQGATQAPLF,TGTGCCAGCAGTATCGGACAGGGGGCTACCCAGGCTCCGCTTTTT,11194,5,clonotype58,clonotype58_consensus_2 +CGTAGGCTCTGCCAGG-1,True,CGTAGGCTCTGCCAGG-1_contig_3,True,335,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,19228,11,clonotype58,None +CGTGTAATCTCTTATG-1,True,CGTGTAATCTCTTATG-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSLGQGNTEVFF,TGTGCCAGCAGCCTGGGACAGGGGAACACAGAAGTCTTCTTT,50846,6,clonotype59,clonotype59_consensus_1 +CGTGTAATCTCTTATG-1,True,CGTGTAATCTCTTATG-1_contig_2,True,355,TRA,TRAV17,None,TRAJ16,TRAC,True,False,CALSTSSGQKLVF,TGTGCACTGTCAACTTCAAGTGGCCAGAAGCTGGTTTTT,20870,1,clonotype59,None +CGTTAGATCGTGACAT-1,True,CGTTAGATCGTGACAT-1_contig_1,True,537,TRA,TRAV6-6,None,TRAJ45,TRAC,True,True,CALGDPAGGADRLTF,TGTGCTCTGGGTGATCCCGCAGGAGGTGCAGATAGACTCACCTTT,20426,5,clonotype1,clonotype1_consensus_1 +CGTTAGATCGTGACAT-1,True,CGTTAGATCGTGACAT-1_contig_2,True,715,TRB,TRBV19,None,TRBJ2-5,TRBC2,True,True,CASSMGTRDTQYF,TGTGCCAGCAGTATGGGGACAAGGGACACCCAGTACTTT,43768,10,clonotype1,clonotype1_consensus_2 +CGTTAGATCGTGACAT-1,True,CGTTAGATCGTGACAT-1_contig_3,True,326,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,12494,5,clonotype1,None +CTAACTTTCATGCTCC-1,True,CTAACTTTCATGCTCC-1_contig_1,True,555,TRA,TRAV6-6,None,TRAJ45,TRAC,True,True,CALGDPAGGADRLTF,TGTGCTCTGGGTGATCCCGCAGGAGGTGCAGATAGACTCACCTTT,3880,5,clonotype1,clonotype1_consensus_1 +CTAACTTTCATGCTCC-1,True,CTAACTTTCATGCTCC-1_contig_2,True,715,TRB,TRBV19,None,TRBJ2-5,TRBC2,True,True,CASSMGTRDTQYF,TGTGCCAGCAGTATGGGGACAAGGGACACCCAGTACTTT,23734,6,clonotype1,clonotype1_consensus_2 +CTAACTTTCATGCTCC-1,True,CTAACTTTCATGCTCC-1_contig_3,True,384,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,31308,5,clonotype1,None +CTAACTTTCATGCTCC-1,True,CTAACTTTCATGCTCC-1_contig_4,True,389,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,16730,4,clonotype1,None +CTACACCTCTCCCTGA-1,True,CTACACCTCTCCCTGA-1_contig_1,True,602,TRA,TRAV5D-4,None,TRAJ33,TRAC,True,True,CAASEVDSNYQLIW,TGTGCTGCAAGTGAGGTGGATAGCAACTATCAGTTGATCTGG,27938,5,clonotype60,clonotype60_consensus_1 +CTACACCTCTCCCTGA-1,True,CTACACCTCTCCCTGA-1_contig_2,True,547,TRB,TRBV10,None,TRBJ1-4,TRBC1,True,True,CASSYGRFSNERLFF,TGTGCCAGCAGCTACGGCAGATTTTCCAACGAAAGATTATTTTTC,38184,4,clonotype60,clonotype60_consensus_2 +CTACACCTCTCCCTGA-1,True,CTACACCTCTCCCTGA-1_contig_3,True,668,TRB,TRBV19,None,TRBJ2-3,TRBC2,True,False,None,None,8734,3,clonotype60,None +CTAGAGTAGAAACCTA-1,True,CTAGAGTAGAAACCTA-1_contig_1,True,597,TRA,TRAV7D-4,None,TRAJ26,TRAC,True,True,CAASDLNNYAQGLTF,TGTGCAGCTAGTGACCTAAATAACTATGCCCAGGGATTAACCTTC,43448,3,clonotype61,clonotype61_consensus_1 +CTAGAGTAGAAACCTA-1,True,CTAGAGTAGAAACCTA-1_contig_2,True,695,TRB,TRBV19,None,TRBJ2-5,TRBC2,True,True,CASSMGTRDTQYF,TGTGCCAGCAGTATGGGGACAAGGGACACCCAGTACTTT,3602,1,clonotype61,clonotype61_consensus_3 +CTAGAGTAGAAACCTA-1,True,CTAGAGTAGAAACCTA-1_contig_3,True,612,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-3,TRBC2,True,True,CASGDAGGSAETLYF,TGTGCCAGCGGTGATGCGGGGGGTAGTGCAGAAACGCTGTATTTT,5334,4,clonotype61,clonotype61_consensus_2 +CTAGAGTAGAAACCTA-1,True,CTAGAGTAGAAACCTA-1_contig_4,True,533,TRA,TRAV3-3,None,TRAJ21,TRAC,True,False,None,None,19922,6,clonotype61,None +CTAGCCTGTAGCGTAG-1,True,CTAGCCTGTAGCGTAG-1_contig_1,True,552,TRA,TRAV7D-3,None,TRAJ52,TRAC,True,True,CAVSMPGANTGKLTF,TGTGCAGTGAGCATGCCTGGAGCTAACACTGGAAAGCTCACGTTT,15936,2,clonotype62,clonotype62_consensus_2 +CTAGCCTGTAGCGTAG-1,True,CTAGCCTGTAGCGTAG-1_contig_2,True,517,TRB,TRBV14,None,TRBJ2-2,TRBC2,True,True,CASSFDRGAQLYF,TGTGCCAGCAGTTTCGACAGGGGGGCGCAGCTCTACTTT,54180,6,clonotype62,clonotype62_consensus_1 +CTAGCCTGTAGCGTAG-1,True,CTAGCCTGTAGCGTAG-1_contig_3,True,329,TRB,TRBV13-2,None,TRBJ2-7,TRBC2,True,False,None,None,5602,1,clonotype62,None +CTCATTAGTACCTACA-1,True,CTCATTAGTACCTACA-1_contig_1,True,551,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGQGNTEVFF,TGTGCCAGCAGCCCGGGACAGGGGAACACAGAAGTCTTCTTT,19342,4,clonotype22,clonotype22_consensus_2 +CTCATTAGTACCTACA-1,True,CTCATTAGTACCTACA-1_contig_2,True,716,TRA,TRAV9-4,None,TRAJ16,TRAC,True,True,CALSSSSGQKLVF,TGTGCTCTGAGTTCTTCAAGTGGCCAGAAGCTGGTTTTT,22448,7,clonotype22,clonotype22_consensus_1 +CTCATTAGTACCTACA-1,True,CTCATTAGTACCTACA-1_contig_3,True,355,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,16266,3,clonotype22,None +CTCATTAGTACCTACA-1,True,CTCATTAGTACCTACA-1_contig_4,True,362,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,17176,5,clonotype22,None +CTCCTAGCATGTCTCC-1,True,CTCCTAGCATGTCTCC-1_contig_1,True,594,TRA,TRAV7-4,None,TRAJ7,TRAC,True,True,CAASADYSNNRLTL,TGTGCAGCTAGTGCTGACTACAGCAACAACAGACTTACTTTG,29842,10,clonotype63,clonotype63_consensus_1 +CTCCTAGCATGTCTCC-1,True,CTCCTAGCATGTCTCC-1_contig_2,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSSGGGNTEVFF,TGTGCCAGCAGCTCAGGGGGCGGGAACACAGAAGTCTTCTTT,44102,13,clonotype63,clonotype63_consensus_2 +CTCGTACCACATCTTT-1,True,CTCGTACCACATCTTT-1_contig_1,True,514,TRB,TRBV14,None,TRBJ2-3,TRBC2,True,True,CASRLGWETLYF,TGTGCCAGCAGACTGGGGTGGGAAACGCTGTATTTT,47760,10,clonotype64,clonotype64_consensus_1 +CTCGTACCACATCTTT-1,True,CTCGTACCACATCTTT-1_contig_2,True,597,TRA,TRAV7-4,None,TRAJ56,TRAC,True,True,CAASEQGGGNNKLTF,TGTGCAGCTAGTGAGCAAGGGGGAGGCAATAATAAGCTGACTTTT,28812,6,clonotype64,clonotype64_consensus_2 +CTCGTACCACATCTTT-1,True,CTCGTACCACATCTTT-1_contig_3,True,447,TRB,TRBV17,None,TRBJ1-6,None,True,False,CGVQDNSPLYF,TGTGGGGTACAGGATAATTCGCCCCTCTACTTT,4,2,clonotype64,None +CTCTGGTTCCTCCTAG-1,True,CTCTGGTTCCTCCTAG-1_contig_1,True,605,TRA,TRAV5D-4,None,TRAJ32,TRAC,True,True,CAASRGGSGNKLIF,TGTGCTGCAAGTCGTGGGGGCAGTGGCAACAAGCTCATCTTT,33256,5,clonotype65,clonotype65_consensus_1 +CTCTGGTTCCTCCTAG-1,True,CTCTGGTTCCTCCTAG-1_contig_2,True,485,TRB,TRBV10,None,None,TRBC1,False,False,None,None,42132,5,clonotype65,None +CTGATCCTCACGACTA-1,True,CTGATCCTCACGACTA-1_contig_1,True,701,TRB,TRBV19,None,TRBJ1-4,TRBC1,True,True,CASSMGTISNERLFF,TGTGCCAGCAGTATGGGGACAATTTCCAACGAAAGATTATTTTTC,15726,2,clonotype66,clonotype66_consensus_1 +CTGATCCTCACGACTA-1,True,CTGATCCTCACGACTA-1_contig_2,True,560,TRA,TRAV14D-3-DV8,None,TRAJ48,TRAC,True,True,CAALYGNEKITF,TGTGCAGCCTTGTATGGAAATGAGAAAATAACTTTT,11846,2,clonotype66,clonotype66_consensus_2 +CTGATCCTCACGACTA-1,True,CTGATCCTCACGACTA-1_contig_3,True,617,TRB,None,None,TRBJ1-6,TRBC1,False,False,None,None,47380,3,clonotype66,None +CTGCGGAAGGTTCCTA-1,True,CTGCGGAAGGTTCCTA-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCAGGGACAGGGAACACAGAAGTCTTCTTT,36602,43,clonotype5,clonotype5_consensus_3 +CTGCGGAAGGTTCCTA-1,True,CTGCGGAAGGTTCCTA-1_contig_2,True,726,TRA,TRAV9-4,None,TRAJ17,TRAC,True,True,CALTNSAGNKLTF,TGTGCTCTGACTAACAGTGCAGGGAACAAGCTAACTTTT,10474,15,clonotype5,clonotype5_consensus_2 +CTGCGGAAGGTTCCTA-1,True,CTGCGGAAGGTTCCTA-1_contig_3,True,696,TRA,TRAV9-4,None,TRAJ7,TRAC,True,True,CAVRDYSNNRLTL,TGTGCTGTGAGGGACTACAGCAACAACAGACTTACTTTG,3052,3,clonotype5,clonotype5_consensus_1 +CTGCGGAAGGTTCCTA-1,True,CTGCGGAAGGTTCCTA-1_contig_4,True,369,TRB,None,None,TRBJ1-3,TRBC1,False,False,None,None,9190,6,clonotype5,None +CTGCGGAAGGTTCCTA-1,True,CTGCGGAAGGTTCCTA-1_contig_5,True,357,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,17006,17,clonotype5,None +CTGCTGTAGTGACATA-1,True,CTGCTGTAGTGACATA-1_contig_1,True,507,TRA,TRAV21-DV12,None,TRAJ39,TRAC,True,True,CILRGNNNAGAKLTF,TGTATCCTGAGAGGGAATAATAATGCAGGTGCCAAGCTCACATTC,12870,2,clonotype67,clonotype67_consensus_1 +CTGCTGTAGTGACATA-1,True,CTGCTGTAGTGACATA-1_contig_2,True,567,TRB,TRBV12-2+TRBV13-2,None,TRBJ1-4,TRBC1,True,True,CASGRDSSNERLFF,TGTGCCAGCGGTCGGGACAGCTCCAACGAAAGATTATTTTTC,13458,2,clonotype67,clonotype67_consensus_2 +CTGCTGTAGTGACATA-1,True,CTGCTGTAGTGACATA-1_contig_3,True,365,TRB,None,None,TRBJ1-3,TRBC1,False,False,None,None,13706,1,clonotype67,None +CTGCTGTAGTGACATA-1,True,CTGCTGTAGTGACATA-1_contig_4,True,357,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,27640,3,clonotype67,None +CTGCTGTAGTGACATA-1,True,CTGCTGTAGTGACATA-1_contig_5,True,595,TRA,TRAV12-3,None,TRAJ52,TRAC,True,False,None,None,9076,4,clonotype67,None +CTGTGCTAGGAATTAC-1,True,CTGTGCTAGGAATTAC-1_contig_1,True,579,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-3,TRBC2,True,True,CASGDRGSSAETLYF,TGTGCCAGCGGTGACCGGGGGTCTAGTGCAGAAACGCTGTATTTT,51086,6,clonotype68,clonotype68_consensus_2 +CTGTGCTAGGAATTAC-1,True,CTGTGCTAGGAATTAC-1_contig_2,True,558,TRA,TRAV16N,None,TRAJ40,TRAC,True,True,CAMREGHTGNYKYVF,TGTGCTATGAGAGAGGGCCATACAGGAAACTACAAATACGTCTTT,24208,4,clonotype68,clonotype68_consensus_1 +CTGTGCTTCTTGGGTA-1,True,CTGTGCTTCTTGGGTA-1_contig_1,True,728,TRA,TRAV9-4,None,TRAJ17,TRAC,True,True,CALTNSAGNKLTF,TGTGCTCTGACTAACAGTGCAGGGAACAAGCTAACTTTT,10926,3,clonotype2,clonotype2_consensus_1 +CTGTGCTTCTTGGGTA-1,True,CTGTGCTTCTTGGGTA-1_contig_2,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCCGGGACAGGAAACACAGAAGTCTTCTTT,35224,11,clonotype2,clonotype2_consensus_2 +CTGTGCTTCTTGGGTA-1,True,CTGTGCTTCTTGGGTA-1_contig_3,True,777,TRA,TRAV3-1,None,TRAJ22,TRAC,True,False,CAVSIFW,TGCGCAGTCAGCATCTTCTGG,1970,1,clonotype2,None +CTGTGCTTCTTGGGTA-1,True,CTGTGCTTCTTGGGTA-1_contig_4,True,494,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,28460,7,clonotype2,None +CTTAACTCAGCGATCC-1,True,CTTAACTCAGCGATCC-1_contig_1,True,571,TRB,TRBV1,None,TRBJ2-7,TRBC2,True,True,CTCSADQGGSYEQYF,TGCACCTGCAGTGCAGATCAGGGGGGCTCCTATGAACAGTACTTC,38872,5,clonotype69,clonotype69_consensus_1 +CTTAACTCAGCGATCC-1,True,CTTAACTCAGCGATCC-1_contig_2,True,422,TRA,TRAV13-1,None,TRAJ22,TRAC,True,False,CAMDASSGSWQLIF,TGTGCTATGGATGCATCTTCTGGCAGCTGGCAACTCATCTTT,35428,3,clonotype69,None +CTTGGCTAGCAGGTCA-1,True,CTTGGCTAGCAGGTCA-1_contig_1,True,602,TRB,TRBV3,None,TRBJ2-7,TRBC2,True,True,CASSLDGGAYEQYF,TGTGCCAGCAGCTTAGATGGGGGGGCCTATGAACAGTACTTC,37430,2,clonotype70,clonotype70_consensus_1 +CTTGGCTAGCAGGTCA-1,True,CTTGGCTAGCAGGTCA-1_contig_2,True,768,TRB,None,None,TRBJ2-5,TRBC2,False,False,None,None,1942,13,clonotype70,None +GAACATCAGTCAAGCG-1,True,GAACATCAGTCAAGCG-1_contig_1,True,664,TRB,TRBV19,None,TRBJ2-5,TRBC2,True,True,CASSMGTRDTQYF,TGTGCCAGCAGTATGGGGACAAGGGACACCCAGTACTTT,43612,11,clonotype17,clonotype17_consensus_1 +GAACATCAGTCAAGCG-1,True,GAACATCAGTCAAGCG-1_contig_2,True,353,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,19258,4,clonotype17,None +GAAGCAGAGGTAGCCA-1,True,GAAGCAGAGGTAGCCA-1_contig_1,True,522,TRB,TRBV5,None,TRBJ2-5,TRBC2,True,True,CASSQSGLGGQDTQYF,TGTGCCAGCAGCCAATCGGGACTGGGGGGTCAAGACACCCAGTACTTT,50832,2,clonotype71,clonotype71_consensus_1 +GAAGCAGAGGTAGCCA-1,True,GAAGCAGAGGTAGCCA-1_contig_2,True,534,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,27516,3,clonotype71,None +GAATAAGCACGGCCAT-1,True,GAATAAGCACGGCCAT-1_contig_1,True,573,TRA,TRAV2,None,TRAJ24,TRAC,True,True,CIVTDMTTASLGKLQF,TGCATTGTGACTGACATGACAACTGCCAGTTTGGGGAAACTGCAGTTT,27482,4,clonotype72,clonotype72_consensus_1 +GACAGAGGTCAGAAGC-1,True,GACAGAGGTCAGAAGC-1_contig_1,True,614,TRB,TRBV3,None,TRBJ2-1,TRBC2,True,True,CASSLERQGRDNYAEQFF,TGTGCCAGCAGCTTAGAGAGACAGGGGAGGGATAACTATGCTGAGCAGTTCTTC,73194,9,clonotype73,clonotype73_consensus_1 +GACGTTATCGCCGTGA-1,True,GACGTTATCGCCGTGA-1_contig_1,True,676,TRB,TRBV19,None,TRBJ2-5,TRBC2,True,True,CASSMGTRDTQYF,TGTGCCAGCAGTATGGGGACAAGGGACACCCAGTACTTT,57920,23,clonotype1,clonotype1_consensus_2 +GACGTTATCGCCGTGA-1,True,GACGTTATCGCCGTGA-1_contig_2,True,522,TRA,TRAV6-6,None,TRAJ45,TRAC,True,True,CALGDPAGGADRLTF,TGTGCTCTGGGTGATCCCGCAGGAGGTGCAGATAGACTCACCTTT,15060,4,clonotype1,clonotype1_consensus_1 +GACGTTATCGCCGTGA-1,True,GACGTTATCGCCGTGA-1_contig_3,True,577,TRA,TRAV5D-4,None,TRAJ50,TRAC,True,False,None,None,4938,2,clonotype1,None +GACTAACCACACTGCG-1,True,GACTAACCACACTGCG-1_contig_1,True,510,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSLGQGNTEVFF,TGTGCCAGCAGCCTGGGACAGGGGAACACAGAAGTCTTCTTT,47902,6,clonotype74,clonotype74_consensus_1 +GACTAACCACACTGCG-1,True,GACTAACCACACTGCG-1_contig_2,True,629,TRA,TRAV17,None,TRAJ16,TRAC,True,True,CALSTSSGQKLVF,TGTGCACTGTCAACTTCAAGTGGCCAGAAGCTGGTTTTT,8046,5,clonotype74,clonotype74_consensus_2 +GACTAACCACACTGCG-1,True,GACTAACCACACTGCG-1_contig_3,True,504,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,19846,6,clonotype74,None +GACTACAGTCGACTAT-1,True,GACTACAGTCGACTAT-1_contig_1,True,580,TRB,TRBV13-3,None,TRBJ2-3,TRBC2,True,True,CASSRDREALYF,TGTGCCAGCAGCCGGGACAGGGAGGCGCTGTATTTT,41272,6,clonotype75,clonotype75_consensus_2 +GACTACAGTCGACTAT-1,True,GACTACAGTCGACTAT-1_contig_2,True,516,TRA,TRAV6-6,None,TRAJ15,TRAC,True,True,CALSELQGGRALIF,TGTGCTCTGAGTGAACTCCAGGGAGGCAGAGCTCTGATATTT,9988,4,clonotype75,clonotype75_consensus_1 +GACTACAGTCGACTAT-1,True,GACTACAGTCGACTAT-1_contig_3,True,545,TRB,TRBV16,None,TRBJ1-2,TRBC1,True,False,CKQLQGNSDYTF,TGCAAGCAGCTTCAGGGAAACTCCGACTACACCTTC,25106,3,clonotype75,None +GACTGCGGTGCCTGCA-1,True,GACTGCGGTGCCTGCA-1_contig_1,True,507,TRA,TRAV21-DV12,None,TRAJ56,TRAC,True,True,CILRGATGGNNKLTF,TGTATCCTGAGGGGGGCTACTGGAGGCAATAATAAGCTGACTTTT,64194,11,clonotype19,clonotype19_consensus_1 +GACTGCGGTGCCTGCA-1,True,GACTGCGGTGCCTGCA-1_contig_2,True,562,TRB,TRBV2,None,TRBJ2-4,TRBC2,True,True,CASSQRQGQNTLYF,TGTGCCAGCAGCCAAAGACAGGGCCAAAACACCTTGTACTTT,9752,3,clonotype19,clonotype19_consensus_2 +GACTGCGGTGCGATAG-1,True,GACTGCGGTGCGATAG-1_contig_1,True,586,TRA,TRAV16N,None,TRAJ30,TRAC,True,True,CAMREGRANAYKVIF,TGTGCTATGAGAGAGGGCCGGGCAAATGCTTACAAAGTCATCTTT,43650,5,clonotype23,clonotype23_consensus_1 +GACTGCGGTGCGATAG-1,True,GACTGCGGTGCGATAG-1_contig_2,True,815,TRB,None,None,TRBJ2-5,TRBC2,False,False,None,None,3804,1,clonotype23,None +GACTGCGGTGCGATAG-1,True,GACTGCGGTGCGATAG-1_contig_3,True,360,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,27412,3,clonotype23,None +GACTGCGGTGCGATAG-1,True,GACTGCGGTGCGATAG-1_contig_4,True,562,TRA,TRAV8N-2,None,TRAJ52,TRAC,True,False,None,None,2818,3,clonotype23,None +GAGGTGAAGACCACGA-1,True,GAGGTGAAGACCACGA-1_contig_1,True,516,TRB,TRBV17,None,TRBJ1-6,TRBC1,True,True,CGVQDNSPLYF,TGTGGGGTACAGGATAATTCGCCCCTCTACTTT,50674,9,clonotype8,clonotype8_consensus_3 +GAGGTGAAGACCACGA-1,True,GAGGTGAAGACCACGA-1_contig_2,True,534,TRB,TRBV13-3,None,TRBJ1-3,TRBC1,True,True,CASSGDRGGNTLYF,TGTGCCAGCAGTGGGGACAGGGGTGGAAATACGCTCTATTTT,20656,5,clonotype8,clonotype8_consensus_1 +GAGGTGAAGACCACGA-1,True,GAGGTGAAGACCACGA-1_contig_3,True,536,TRA,TRAV16N,None,TRAJ56,TRAC,True,True,CAMREGPGGNNKLTF,TGTGCTATGAGAGAGGGACCTGGAGGCAATAATAAGCTGACTTTT,5092,1,clonotype8,clonotype8_consensus_2 +GATTCAGTCAGCAACT-1,True,GATTCAGTCAGCAACT-1_contig_1,True,560,TRA,TRAV3-3,None,TRAJ49,TRAC,True,True,CAVSEGYQNFYF,TGCGCAGTCAGTGAGGGTTACCAGAACTTCTATTTT,36920,9,clonotype76,clonotype76_consensus_2 +GATTCAGTCAGCAACT-1,True,GATTCAGTCAGCAACT-1_contig_2,True,575,TRA,TRAV13-1,None,TRAJ33,TRAC,True,True,CAMERSNYQLIW,TGTGCTATGGAAAGGAGCAACTATCAGTTGATCTGG,31992,7,clonotype76,clonotype76_consensus_1 +GATTCAGTCAGCAACT-1,True,GATTCAGTCAGCAACT-1_contig_3,True,564,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-7,TRBC2,True,True,CASGGTGVYEQYF,TGTGCCAGCGGAGGGACTGGGGTCTATGAACAGTACTTC,8660,3,clonotype76,clonotype76_consensus_3 +GCAGCCATCATCTGTT-1,True,GCAGCCATCATCTGTT-1_contig_1,True,544,TRB,TRBV10,None,TRBJ2-1,TRBC2,True,True,CASSYWGGDAEQFF,TGTGCCAGCAGCTACTGGGGGGGCGATGCTGAGCAGTTCTTC,46684,5,clonotype77,clonotype77_consensus_1 +GCAGCCATCATCTGTT-1,True,GCAGCCATCATCTGTT-1_contig_2,True,386,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,18438,3,clonotype77,None +GCAGCCATCATCTGTT-1,True,GCAGCCATCATCTGTT-1_contig_3,True,569,TRA,TRAV3-4,None,TRAJ48,TRAC,True,False,None,None,11398,4,clonotype77,None +GCATACAAGCTGCAAG-1,True,GCATACAAGCTGCAAG-1_contig_1,True,594,TRA,TRAV7D-4,None,TRAJ40,TRAC,True,True,CAASEGTGNYKYVF,TGTGCAGCTAGTGAAGGTACAGGAAACTACAAATACGTCTTT,60886,9,clonotype78,clonotype78_consensus_1 +GCATACAAGTGTACTC-1,True,GCATACAAGTGTACTC-1_contig_1,True,576,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-2,TRBC2,True,True,CASGGDWGGANTGQLYF,TGTGCCAGCGGCGGGGACTGGGGGGGTGCAAACACCGGGCAGCTCTACTTT,22092,8,clonotype79,clonotype79_consensus_1 +GCATACAGTGGCAAAC-1,True,GCATACAGTGGCAAAC-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCCGGGACAGGAAACACAGAAGTCTTCTTT,6206,1,clonotype2,clonotype2_consensus_2 +GCATACAGTGGCAAAC-1,True,GCATACAGTGGCAAAC-1_contig_2,True,724,TRA,TRAV9-4,None,TRAJ17,TRAC,True,True,CALTNSAGNKLTF,TGTGCTCTGACTAACAGTGCAGGGAACAAGCTAACTTTT,19092,4,clonotype2,clonotype2_consensus_1 +GCATACAGTGGCAAAC-1,True,GCATACAGTGGCAAAC-1_contig_3,True,369,TRB,TRBV19,None,TRBJ1-1,TRBC1,True,False,CQQYEQGLANTEVFF,TGCCAGCAGTATGAACAGGGGCTTGCAAACACAGAAGTCTTCTTT,16396,2,clonotype2,None +GCATACAGTGGCAAAC-1,True,GCATACAGTGGCAAAC-1_contig_4,True,415,TRA,TRAV3-1,None,TRAJ22,TRAC,True,False,CAVSIFW,TGCGCAGTCAGCATCTTCTGG,9512,1,clonotype2,None +GCATACAGTGGCAAAC-1,True,GCATACAGTGGCAAAC-1_contig_5,True,376,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,26138,3,clonotype2,None +GCATGATCAGTCGTGC-1,True,GCATGATCAGTCGTGC-1_contig_1,True,574,TRA,TRAV13-1,None,TRAJ37,TRAC,True,True,CAMGAGNTRKLIF,TGTGCTATGGGGGCAGGCAATACTAGAAAACTCATCTTT,68190,3,clonotype80,clonotype80_consensus_1 +GCATGCGCATTAGGCT-1,True,GCATGCGCATTAGGCT-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCAGGGACAGGGAACACAGAAGTCTTCTTT,69846,13,clonotype4,clonotype4_consensus_2 +GCATGCGCATTAGGCT-1,True,GCATGCGCATTAGGCT-1_contig_2,True,642,TRA,TRAV9-4,None,TRAJ17,TRAC,True,True,CALTNSAGNKLTF,TGTGCTCTGACTAACAGTGCAGGGAACAAGCTAACTTTT,3264,1,clonotype4,clonotype4_consensus_1 +GCCAAATGTTAAGATG-1,True,GCCAAATGTTAAGATG-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCCGGGACAGGGAACACAGAAGTCTTCTTT,48640,10,clonotype3,clonotype3_consensus_2 +GCCAAATGTTAAGATG-1,True,GCCAAATGTTAAGATG-1_contig_2,True,726,TRA,TRAV9-4,None,TRAJ22,TRAC,True,True,CAVTSSGSWQLIF,TGTGCTGTGACATCTTCTGGCAGCTGGCAACTCATCTTT,24670,3,clonotype3,clonotype3_consensus_1 +GCGAGAATCCGCAGTG-1,True,GCGAGAATCCGCAGTG-1_contig_1,True,731,TRB,TRBV12-1,None,TRBJ2-1,TRBC2,True,True,CASSVDWGGDAEQFF,TGTGCCAGCTCGGTCGACTGGGGGGGGGATGCTGAGCAGTTCTTC,53110,5,clonotype81,clonotype81_consensus_1 +GCGAGAATCCGCAGTG-1,True,GCGAGAATCCGCAGTG-1_contig_2,True,550,TRA,TRAV3-3,None,TRAJ50,TRAC,True,True,CAVSPLIASSSFSKLVF,TGCGCAGTCAGTCCCCTTATAGCATCCTCCTCCTTCAGCAAGCTGGTGTTT,23776,4,clonotype81,clonotype81_consensus_2 +GCGCAGTCACATGGGA-1,True,GCGCAGTCACATGGGA-1_contig_1,True,566,TRB,TRBV29,None,TRBJ2-7,TRBC2,True,True,CASSLRDRGIEQYF,TGTGCTAGCAGTTTAAGGGACAGGGGGATTGAACAGTACTTC,69102,9,clonotype82,clonotype82_consensus_1 +GCGCGATTCACCACCT-1,True,GCGCGATTCACCACCT-1_contig_1,True,528,TRA,TRAV7-3,None,TRAJ40,TRAC,True,True,CAVSMGTGNYKYVF,TGTGCAGTGAGCATGGGTACAGGAAACTACAAATACGTCTTT,13606,3,clonotype83,clonotype83_consensus_1 +GCGCGATTCACCACCT-1,True,GCGCGATTCACCACCT-1_contig_2,True,588,TRA,TRAV13-1,None,TRAJ37,TRAC,True,True,CAMGAGNTRKLIF,TGTGCTATGGGGGCAGGCAATACTAGAAAACTCATCTTT,34312,8,clonotype83,clonotype83_consensus_3 +GCGCGATTCACCACCT-1,True,GCGCGATTCACCACCT-1_contig_3,True,522,TRB,TRBV5,None,TRBJ2-7,TRBC2,True,True,CASSPGLGDSYEQYF,TGTGCCAGCAGCCCGGGACTGGGGGATTCCTATGAACAGTACTTC,26532,10,clonotype83,clonotype83_consensus_2 +GCTTGAATCAATAAGG-1,True,GCTTGAATCAATAAGG-1_contig_1,True,600,TRA,TRAV12D-2,None,TRAJ9,TRAC,True,True,CALSVRNMGYKLTF,TGTGCTCTGAGTGTCAGGAACATGGGCTACAAACTTACCTTC,13062,4,clonotype84,clonotype84_consensus_2 +GCTTGAATCAATAAGG-1,True,GCTTGAATCAATAAGG-1_contig_2,True,647,TRB,TRBV19,None,TRBJ2-5,TRBC2,True,True,CASSILGQDTQYF,TGTGCCAGCAGTATTCTGGGGCAAGACACCCAGTACTTT,55706,12,clonotype84,clonotype84_consensus_1 +GCTTGAATCAATAAGG-1,True,GCTTGAATCAATAAGG-1_contig_3,True,518,TRB,TRBV14,None,TRBJ1-3,TRBC1,True,False,None,None,4580,2,clonotype84,None +GGAACTTGTCGCATAT-1,True,GGAACTTGTCGCATAT-1_contig_1,True,544,TRB,TRBV10,None,TRBJ1-3,TRBC1,True,True,CASSLTGVGNTLYF,TGTGCCAGCAGCTTGACAGGGGTCGGAAATACGCTCTATTTT,7010,4,clonotype85,clonotype85_consensus_1 +GGAACTTGTCGCATAT-1,True,GGAACTTGTCGCATAT-1_contig_2,True,432,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,59918,23,clonotype85,None +GGAGCAATCGCCGTGA-1,True,GGAGCAATCGCCGTGA-1_contig_1,True,510,TRB,TRBV29,None,TRBJ2-7,TRBC2,True,True,CASSGDRGHEQYF,TGTGCTAGCAGTGGGGACAGGGGTCATGAACAGTACTTC,29626,18,clonotype13,clonotype13_consensus_1 +GGAGCAATCGCCGTGA-1,True,GGAGCAATCGCCGTGA-1_contig_2,True,581,TRA,TRAV13-1,None,TRAJ6,TRAC,True,True,CAMATSGGNYKPTF,TGTGCTATGGCCACCTCAGGAGGAAACTACAAACCTACGTTT,18328,10,clonotype13,clonotype13_consensus_2 +GGAGCAATCGCCGTGA-1,True,GGAGCAATCGCCGTGA-1_contig_3,True,532,TRB,TRBV20,TRBD1,TRBJ2-7,TRBC2,True,True,CGVPRDRGREQYF,TGTGGTGTCCCCCGGGACAGGGGGCGCGAACAGTACTTC,22382,15,clonotype13,clonotype13_consensus_3 +GGAGCAATCGCCGTGA-1,True,GGAGCAATCGCCGTGA-1_contig_4,True,557,TRA,TRAV4-3,None,TRAJ15,TRAC,True,False,None,None,7106,5,clonotype13,None +GGGACCTAGAACAATC-1,True,GGGACCTAGAACAATC-1_contig_1,True,600,TRA,TRAV14D-3-DV8,None,TRAJ48,TRAC,True,True,CAATNYGNEKITF,TGTGCAGCAACCAACTATGGAAATGAGAAAATAACTTTT,9386,4,clonotype86,clonotype86_consensus_1 +GGGACCTAGAACAATC-1,True,GGGACCTAGAACAATC-1_contig_2,True,571,TRB,TRBV1,None,TRBJ2-3,TRBC2,True,True,CTCSADTTSAETLYF,TGCACCTGCAGTGCTGACACCACTAGTGCAGAAACGCTGTATTTT,44674,21,clonotype86,clonotype86_consensus_2 +GGGACCTAGAACAATC-1,True,GGGACCTAGAACAATC-1_contig_3,True,331,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,19552,8,clonotype86,None +GGGACCTAGAACAATC-1,True,GGGACCTAGAACAATC-1_contig_4,True,711,TRB,None,None,TRBJ1-3,TRBC1,False,False,None,None,2282,4,clonotype86,None +GGGACCTGTAATCGTC-1,True,GGGACCTGTAATCGTC-1_contig_1,True,567,TRA,TRAV4D-4,None,TRAJ6,TRAC,True,True,CAALTSGGNYKPTF,TGTGCTGCCCTCACCTCAGGAGGAAACTACAAACCTACGTTT,45458,3,clonotype87,clonotype87_consensus_1 +GGGACCTGTAATCGTC-1,True,GGGACCTGTAATCGTC-1_contig_2,True,502,TRB,TRBV13-1,None,TRBJ2-7,TRBC2,True,True,CASSEKYEQYF,TGTGCCAGCAGTGAGAAATATGAACAGTACTTC,27504,4,clonotype87,clonotype87_consensus_2 +GGGACCTGTACGACCC-1,True,GGGACCTGTACGACCC-1_contig_1,True,531,TRB,TRBV13-3,None,TRBJ2-3,TRBC2,True,True,CASSGDRDETLYF,TGTGCCAGCAGTGGAGACAGGGACGAAACGCTGTATTTT,55800,7,clonotype88,clonotype88_consensus_1 +GGGACCTGTACGACCC-1,True,GGGACCTGTACGACCC-1_contig_2,True,641,TRB,TRBV1,None,TRBJ1-1,TRBC1,True,False,None,None,21342,2,clonotype88,None +GGGAGATCATTGGGCC-1,True,GGGAGATCATTGGGCC-1_contig_1,True,564,TRA,TRAV4-4-DV10,None,TRAJ31,TRAC,True,True,CAAEYNNNRIFF,TGTGCTGCTGAGTATAACAATAACAGAATCTTCTTT,25418,11,clonotype89,clonotype89_consensus_1 +GGGAGATCATTGGGCC-1,True,GGGAGATCATTGGGCC-1_contig_2,True,568,TRB,TRBV1,None,TRBJ1-1,TRBC1,True,True,CTCSAGQGAGEVFF,TGCACCTGCAGTGCAGGGCAGGGGGCGGGTGAAGTCTTCTTT,39696,21,clonotype89,clonotype89_consensus_2 +GGGAGATCATTGGGCC-1,True,GGGAGATCATTGGGCC-1_contig_3,True,568,TRA,TRAV14D-1,None,TRAJ38,TRAC,True,True,CAASLLNVGDNSKLIW,TGTGCAGCAAGTCTCCTTAATGTTGGTGACAACAGTAAGCTGATTTGG,12958,6,clonotype89,clonotype89_consensus_3 +GGTGTTAGTTATCACG-1,True,GGTGTTAGTTATCACG-1_contig_1,True,565,TRB,TRBV2,None,TRBJ1-1,TRBC1,True,True,CASSQEEGANTEVFF,TGTGCCAGCAGCCAAGAGGAGGGTGCAAACACAGAAGTCTTCTTT,13218,5,clonotype6,clonotype6_consensus_2 +GGTGTTAGTTATCACG-1,True,GGTGTTAGTTATCACG-1_contig_2,True,558,TRA,TRAV16N,None,TRAJ30,TRAC,True,True,CAMREGRANAYKVIF,TGTGCTATGAGAGAGGGCCGGGCAAATGCTTACAAAGTCATCTTT,22384,6,clonotype6,clonotype6_consensus_1 +GGTGTTAGTTATCACG-1,True,GGTGTTAGTTATCACG-1_contig_3,True,369,TRB,None,None,TRBJ2-4,TRBC2,False,False,None,None,3504,1,clonotype6,None +GGTGTTAGTTATCACG-1,True,GGTGTTAGTTATCACG-1_contig_4,True,562,TRA,TRAV8N-2,None,TRAJ52,TRAC,True,False,None,None,8320,2,clonotype6,None +GGTGTTAGTTATCACG-1,True,GGTGTTAGTTATCACG-1_contig_5,True,303,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,10444,2,clonotype6,None +GGTGTTAGTTATCACG-1,True,GGTGTTAGTTATCACG-1_contig_6,True,373,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,12726,3,clonotype6,None +GGTGTTAGTTATCACG-1,True,GGTGTTAGTTATCACG-1_contig_7,True,334,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,7342,1,clonotype6,None +GTAACGTAGTCCGGTC-1,True,GTAACGTAGTCCGGTC-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCCGGGACAGGAAACACAGAAGTCTTCTTT,13958,11,clonotype90,clonotype90_consensus_3 +GTAACGTAGTCCGGTC-1,True,GTAACGTAGTCCGGTC-1_contig_2,True,568,TRB,TRBV1,None,TRBJ2-5,TRBC2,True,True,CTCSAELGQDTQYF,TGCACCTGCAGTGCAGAGCTGGGGCAAGACACCCAGTACTTT,32178,27,clonotype90,clonotype90_consensus_1 +GTAACGTAGTCCGGTC-1,True,GTAACGTAGTCCGGTC-1_contig_3,True,724,TRA,TRAV9-4,None,TRAJ17,TRAC,True,True,CALTNSAGNKLTF,TGTGCTCTGACTAACAGTGCAGGGAACAAGCTAACTTTT,3282,4,clonotype90,clonotype90_consensus_2 +GTAACGTAGTCCGGTC-1,True,GTAACGTAGTCCGGTC-1_contig_4,True,475,TRA,TRAV11,None,TRAJ18,TRAC,True,False,None,None,5134,5,clonotype90,None +GTAACGTAGTCCGGTC-1,True,GTAACGTAGTCCGGTC-1_contig_5,True,697,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,10986,8,clonotype90,None +GTAACGTAGTCCGGTC-1,True,GTAACGTAGTCCGGTC-1_contig_6,True,590,TRB,TRBV19,None,TRBJ1-1,TRBC1,True,False,CQQYEQGLANTEVFF,TGCCAGCAGTATGAACAGGGGCTTGCAAACACAGAAGTCTTCTTT,8562,12,clonotype90,None +GTACTTTCAGAGTGTG-1,True,GTACTTTCAGAGTGTG-1_contig_1,True,545,TRB,TRBV29,None,TRBJ2-4,TRBC2,True,True,CASSFDTLYF,TGTGCTAGCAGTTTCGACACCTTGTACTTT,62878,9,clonotype91,clonotype91_consensus_1 +GTACTTTCAGAGTGTG-1,True,GTACTTTCAGAGTGTG-1_contig_2,True,432,TRA,TRAV13-1,None,TRAJ53,TRAC,True,False,None,None,15476,3,clonotype91,None +GTACTTTGTAGGCTGA-1,True,GTACTTTGTAGGCTGA-1_contig_1,True,561,TRA,TRAV16N,None,TRAJ30,TRAC,True,True,CAMREGSGTNAYKVIF,TGTGCTATGAGAGAGGGCTCAGGGACAAATGCTTACAAAGTCATCTTT,18720,15,clonotype24,clonotype24_consensus_2 +GTACTTTGTAGGCTGA-1,True,GTACTTTGTAGGCTGA-1_contig_2,True,718,TRB,TRBV19,None,TRBJ1-1,TRBC1,True,True,CASSISRGNTEVFF,TGTGCCAGCAGTATAAGCAGGGGAAACACAGAAGTCTTCTTT,37454,25,clonotype24,clonotype24_consensus_1 +GTACTTTGTAGGCTGA-1,True,GTACTTTGTAGGCTGA-1_contig_3,True,357,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,12060,9,clonotype24,None +GTACTTTGTAGGCTGA-1,True,GTACTTTGTAGGCTGA-1_contig_4,True,504,TRA,TRAV9-4,None,TRAJ33,TRAC,True,False,CSERGSNYQLIW,TGCTCTGAGCGCGGGAGCAACTATCAGTTGATCTGG,6764,5,clonotype24,None +GTAGTCACATCGACGC-1,True,GTAGTCACATCGACGC-1_contig_1,True,524,TRA,TRAV6-4,None,TRAJ50,TRAC,True,True,CALVASSSFSKLVF,TGTGCTCTGGTAGCATCCTCCTCCTTCAGCAAGCTGGTGTTT,35970,3,clonotype92,clonotype92_consensus_1 +GTAGTCACATCGACGC-1,True,GTAGTCACATCGACGC-1_contig_2,True,648,TRB,TRBV2,None,TRBJ2-3,TRBC2,True,True,CASSQERGTAETLYF,TGTGCCAGCAGCCAAGAGAGGGGAACGGCAGAAACGCTGTATTTT,40162,4,clonotype92,clonotype92_consensus_2 +GTCGGGTCATTCACTT-1,True,GTCGGGTCATTCACTT-1_contig_1,True,588,TRB,TRBV17,None,TRBJ1-6,TRBC1,True,True,CGVQDNSPLYF,TGTGGGGTACAGGATAATTCGCCCCTCTACTTT,14776,1,clonotype93,clonotype93_consensus_2 +GTCGGGTCATTCACTT-1,True,GTCGGGTCATTCACTT-1_contig_2,True,539,TRB,TRBV13-3,None,TRBJ1-3,TRBC1,True,True,CASSGDRGGNTLYF,TGTGCCAGCAGTGGGGACAGGGGTGGAAATACGCTCTATTTT,34816,3,clonotype93,clonotype93_consensus_1 +GTCGGGTCATTCACTT-1,True,GTCGGGTCATTCACTT-1_contig_3,True,532,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,19374,4,clonotype93,None +GTTTCTACATTTGCTT-1,True,GTTTCTACATTTGCTT-1_contig_1,True,571,TRA,TRAV16N,None,TRAJ30,TRAC,True,True,CAMREGSGTNAYKVIF,TGTGCTATGAGAGAGGGCTCAGGGACAAATGCTTACAAAGTCATCTTT,36510,10,clonotype24,clonotype24_consensus_2 +GTTTCTACATTTGCTT-1,True,GTTTCTACATTTGCTT-1_contig_2,True,718,TRB,TRBV19,None,TRBJ1-1,TRBC1,True,True,CASSISRGNTEVFF,TGTGCCAGCAGTATAAGCAGGGGAAACACAGAAGTCTTCTTT,34762,7,clonotype24,clonotype24_consensus_1 +TAAACCGGTGTTAAGA-1,True,TAAACCGGTGTTAAGA-1_contig_1,True,557,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-7,TRBC2,True,True,CASGELGGREQYF,TGTGCCAGCGGTGAACTGGGGGGGCGTGAACAGTACTTC,33990,11,clonotype94,clonotype94_consensus_2 +TAAACCGGTGTTAAGA-1,True,TAAACCGGTGTTAAGA-1_contig_2,True,597,TRA,TRAV5D-4,None,TRAJ49,TRAC,True,True,CAAREAGYQNFYF,TGTGCTGCAAGGGAGGCGGGTTACCAGAACTTCTATTTT,33458,12,clonotype94,clonotype94_consensus_1 +TAAACCGGTGTTAAGA-1,True,TAAACCGGTGTTAAGA-1_contig_3,True,443,TRA,None,None,TRAJ41,TRAC,False,False,None,None,6154,1,clonotype94,None +TAAGCGTCATTCTCAT-1,True,TAAGCGTCATTCTCAT-1_contig_1,True,583,TRA,TRAV12D-2,None,TRAJ17,TRAC,True,True,CDPTNSAGNKLTF,TGTGACCCTACTAACAGTGCAGGGAACAAGCTAACTTTT,9674,2,clonotype95,clonotype95_consensus_2 +TAAGCGTCATTCTCAT-1,True,TAAGCGTCATTCTCAT-1_contig_2,True,521,TRB,TRBV13-1,None,TRBJ2-2,TRBC2,True,True,CASSDAGGDTGQLYF,TGTGCCAGCAGTGATGCAGGGGGTGACACCGGGCAGCTCTACTTT,45494,7,clonotype95,clonotype95_consensus_1 +TAAGCGTCATTCTCAT-1,True,TAAGCGTCATTCTCAT-1_contig_3,True,558,TRA,TRAV5-1,None,TRAJ2,TRAC,True,True,CSASMDTGGLSGKLTF,TGCTCAGCAAGTATGGATACTGGAGGACTAAGTGGTAAATTAACATTC,5894,2,clonotype95,clonotype95_consensus_3 +TAAGCGTCATTCTCAT-1,True,TAAGCGTCATTCTCAT-1_contig_4,True,610,TRB,None,None,TRBJ1-2,TRBC1,False,False,None,None,14844,2,clonotype95,None +TAAGTGCAGAGTGACC-1,True,TAAGTGCAGAGTGACC-1_contig_1,True,562,TRB,TRBV1,None,TRBJ1-2,TRBC1,True,True,CTCSAGNSDYTF,TGCACCTGCAGTGCAGGGAACTCCGACTACACCTTC,15994,4,clonotype96,clonotype96_consensus_2 +TAAGTGCAGAGTGACC-1,True,TAAGTGCAGAGTGACC-1_contig_2,True,539,TRA,TRAV9-1,None,TRAJ43,TRAC,True,True,CAVLNNNNAPRF,TGTGCTGTCCTCAATAACAACAATGCCCCACGATTT,5778,2,clonotype96,clonotype96_consensus_1 +TAAGTGCAGAGTGACC-1,True,TAAGTGCAGAGTGACC-1_contig_3,True,309,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,41500,7,clonotype96,None +TAAGTGCAGAGTGACC-1,True,TAAGTGCAGAGTGACC-1_contig_4,True,362,TRB,TRBV19,None,TRBJ2-7,TRBC2,True,False,None,None,3896,3,clonotype96,None +TACGGGCTCTTAGAGC-1,True,TACGGGCTCTTAGAGC-1_contig_1,True,521,TRA,TRAV13-1,None,TRAJ6,TRAC,True,True,CAMATSGGNYKPTF,TGTGCTATGGCCACCTCAGGAGGAAACTACAAACCTACGTTT,14060,6,clonotype13,clonotype13_consensus_2 +TACGGGCTCTTAGAGC-1,True,TACGGGCTCTTAGAGC-1_contig_2,True,570,TRB,TRBV20,TRBD1,TRBJ2-7,TRBC2,True,True,CGVPRDRGREQYF,TGTGGTGTCCCCCGGGACAGGGGGCGCGAACAGTACTTC,11780,7,clonotype13,clonotype13_consensus_3 +TACGGGCTCTTAGAGC-1,True,TACGGGCTCTTAGAGC-1_contig_3,True,515,TRB,TRBV29,None,TRBJ2-7,TRBC2,True,True,CASSGDRGHEQYF,TGTGCTAGCAGTGGGGACAGGGGTCATGAACAGTACTTC,41492,18,clonotype13,clonotype13_consensus_1 +TACGGGCTCTTAGAGC-1,True,TACGGGCTCTTAGAGC-1_contig_4,True,557,TRA,TRAV4-3,None,TRAJ15,TRAC,True,False,None,None,11180,5,clonotype13,None +TACTCGCGTGCAGGTA-1,True,TACTCGCGTGCAGGTA-1_contig_1,True,514,TRB,TRBV13-1,None,TRBJ1-3,TRBC1,True,True,CASSDLGNSGNTLYF,TGTGCCAGCAGTGATCTGGGGAATTCTGGAAATACGCTCTATTTT,70978,21,clonotype97,clonotype97_consensus_1 +TAGACCATCCAAACAC-1,True,TAGACCATCCAAACAC-1_contig_1,True,571,TRB,TRBV12-2+TRBV13-2,None,TRBJ1-4,TRBC1,True,True,CASGDAGEANERLFF,TGTGCCAGCGGTGATGCCGGGGAAGCCAACGAAAGATTATTTTTC,54426,8,clonotype98,clonotype98_consensus_1 +TAGACCATCCAAACAC-1,True,TAGACCATCCAAACAC-1_contig_2,True,538,TRA,TRAV11,None,TRAJ18,TRAC,True,True,CVVGDRGSALGRLHF,TGTGTGGTGGGCGATAGAGGTTCAGCCTTAGGGAGGCTGCATTTT,5774,1,clonotype98,clonotype98_consensus_2 +TAGACCATCCAAACAC-1,True,TAGACCATCCAAACAC-1_contig_3,True,510,TRA,TRAV12-1,None,TRAJ21,TRAC,True,False,CPVLLCSESPNYNVLYF,TGCCCTGTACTACTGTGCTCTGAGTCGCCTAATTACAACGTGCTTTACTTC,7552,1,clonotype98,None +TAGGCATAGGCCCTCA-1,True,TAGGCATAGGCCCTCA-1_contig_1,True,660,TRB,TRBV2,None,TRBJ1-1,TRBC1,True,True,CASSQEEGANTEVFF,TGTGCCAGCAGCCAAGAGGAGGGTGCAAACACAGAAGTCTTCTTT,17632,6,clonotype6,clonotype6_consensus_2 +TAGGCATAGGCCCTCA-1,True,TAGGCATAGGCCCTCA-1_contig_2,True,548,TRA,TRAV16N,None,TRAJ30,TRAC,True,True,CAMREGRANAYKVIF,TGTGCTATGAGAGAGGGCCGGGCAAATGCTTACAAAGTCATCTTT,18706,4,clonotype6,clonotype6_consensus_1 +TAGGCATAGGCCCTCA-1,True,TAGGCATAGGCCCTCA-1_contig_3,True,332,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,31648,10,clonotype6,None +TAGGCATAGGCCCTCA-1,True,TAGGCATAGGCCCTCA-1_contig_4,True,388,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,8546,2,clonotype6,None +TCAGATGTCCGGGTGT-1,True,TCAGATGTCCGGGTGT-1_contig_1,True,557,TRB,TRBV12-2+TRBV13-2,None,TRBJ1-2,TRBC1,True,True,CASGDNRDSDYTF,TGTGCCAGCGGTGATAACAGGGACTCCGACTACACCTTC,75410,6,clonotype99,clonotype99_consensus_1 +TCAGGATAGCTAGTCT-1,True,TCAGGATAGCTAGTCT-1_contig_1,True,678,TRB,TRBV19,None,TRBJ1-4,TRBC1,True,True,CASSIGGASNERLFF,TGTGCCAGCAGTATAGGGGGGGCGTCCAACGAAAGATTATTTTTC,68580,17,clonotype10,clonotype10_consensus_2 +TCAGGATAGCTAGTCT-1,True,TCAGGATAGCTAGTCT-1_contig_2,True,538,TRA,TRAV13-1,None,TRAJ53,TRAC,True,True,CAILSGGSNYKLTF,TGTGCTATCCTCAGTGGAGGCAGCAATTACAAACTGACATTT,5434,3,clonotype10,clonotype10_consensus_1 +TCAGGATGTGCACCAC-1,True,TCAGGATGTGCACCAC-1_contig_1,True,501,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCCGGGACAGGAAACACAGAAGTCTTCTTT,24670,19,clonotype2,clonotype2_consensus_2 +TCAGGATGTGCACCAC-1,True,TCAGGATGTGCACCAC-1_contig_2,True,715,TRA,TRAV9-4,None,TRAJ17,TRAC,True,True,CALTNSAGNKLTF,TGTGCTCTGACTAACAGTGCAGGGAACAAGCTAACTTTT,3452,3,clonotype2,clonotype2_consensus_1 +TCAGGATGTGCACCAC-1,True,TCAGGATGTGCACCAC-1_contig_3,True,416,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,5786,3,clonotype2,None +TCAGGATGTGCACCAC-1,True,TCAGGATGTGCACCAC-1_contig_4,True,598,TRA,TRAV3-1,None,TRAJ22,TRAC,True,False,CAVSIFW,TGCGCAGTCAGCATCTTCTGG,2494,5,clonotype2,None +TCAGGATGTGCACCAC-1,True,TCAGGATGTGCACCAC-1_contig_5,True,356,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,27044,16,clonotype2,None +TCAGGATGTGCACCAC-1,True,TCAGGATGTGCACCAC-1_contig_6,True,545,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,14192,11,clonotype2,None +TCGGGACGTGACGCCT-1,True,TCGGGACGTGACGCCT-1_contig_1,True,522,TRB,TRBV5,None,TRBJ2-1,TRBC2,True,True,CASSQGQGDYAEQFF,TGTGCCAGCAGCCAAGGACAGGGGGACTATGCTGAGCAGTTCTTC,27158,9,clonotype100,clonotype100_consensus_2 +TCGGGACGTGACGCCT-1,True,TCGGGACGTGACGCCT-1_contig_2,True,699,TRA,TRAV9D-2,None,TRAJ43,TRAC,True,True,CAVGNNNAPRF,TGTGCTGTGGGAAACAACAATGCCCCACGATTT,13382,10,clonotype100,clonotype100_consensus_1 +TCGGGACGTGACGCCT-1,True,TCGGGACGTGACGCCT-1_contig_3,True,507,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCAGGGACAGGGAACACAGAAGTCTTCTTT,20020,6,clonotype100,clonotype100_consensus_3 +TCGGGACGTGACGCCT-1,True,TCGGGACGTGACGCCT-1_contig_4,True,621,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,15176,4,clonotype100,None +TCGTAGACATTTGCTT-1,True,TCGTAGACATTTGCTT-1_contig_1,True,576,TRB,TRBV13-3,None,TRBJ2-1,TRBC2,True,True,CASSDDWGSYAEQFF,TGTGCCAGCAGTGATGACTGGGGGAGCTATGCTGAGCAGTTCTTC,18000,4,clonotype101,clonotype101_consensus_1 +TCGTAGACATTTGCTT-1,True,TCGTAGACATTTGCTT-1_contig_2,True,526,TRB,TRBV14,None,TRBJ2-2,TRBC2,True,True,CASSPRDRENTGQLYF,TGTGCCAGCAGCCCCCGGGACAGGGAAAACACCGGGCAGCTCTACTTT,31136,8,clonotype101,clonotype101_consensus_2 +TCGTAGACATTTGCTT-1,True,TCGTAGACATTTGCTT-1_contig_3,True,597,TRA,TRAV14D-3-DV8,None,TRAJ57,TRAC,True,True,CAASDQGGSAKLIF,TGTGCAGCAAGTGATCAAGGAGGGTCTGCGAAGCTCATCTTT,2952,1,clonotype101,clonotype101_consensus_4 +TCGTAGACATTTGCTT-1,True,TCGTAGACATTTGCTT-1_contig_4,True,538,TRA,TRAV19,None,TRAJ56,TRAC,True,True,CAAGGATGGNNKLTF,TGCGCAGCAGGGGGGGCTACTGGAGGCAATAATAAGCTGACTTTT,12826,2,clonotype101,clonotype101_consensus_3 +TCGTAGACATTTGCTT-1,True,TCGTAGACATTTGCTT-1_contig_5,True,320,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,4568,1,clonotype101,None +TCGTAGACATTTGCTT-1,True,TCGTAGACATTTGCTT-1_contig_6,True,609,TRB,TRBV5,None,TRBJ1-4,TRBC1,True,False,None,None,6856,2,clonotype101,None +TCTGGAACACAACGTT-1,True,TCTGGAACACAACGTT-1_contig_1,True,572,TRA,TRAV14D-3-DV8,None,TRAJ26,TRAC,True,True,CAASYYAQGLTF,TGTGCAGCAAGTTACTATGCCCAGGGATTAACCTTC,1044,1,clonotype102,clonotype102_consensus_2 +TCTGGAACACAACGTT-1,True,TCTGGAACACAACGTT-1_contig_2,True,710,TRB,TRBV19,None,TRBJ1-6,TRBC1,True,True,CASSLRDRENSPLYF,TGTGCCAGCAGTCTCCGGGACAGGGAGAATTCGCCCCTCTACTTT,10986,7,clonotype102,clonotype102_consensus_1 +TCTGGAACACAACGTT-1,True,TCTGGAACACAACGTT-1_contig_3,True,308,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,56808,21,clonotype102,None +TCTGGAACACAACGTT-1,True,TCTGGAACACAACGTT-1_contig_4,True,353,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,2144,1,clonotype102,None +TCTGGAACACAACGTT-1,True,TCTGGAACACAACGTT-1_contig_5,True,448,TRB,None,None,TRBJ1-3,TRBC1,False,False,None,None,2392,1,clonotype102,None +TGACAACCAACTGGCC-1,True,TGACAACCAACTGGCC-1_contig_1,True,599,TRA,TRAV13-1,None,TRAJ53,TRAC,True,True,CAILSGGSNYKLTF,TGTGCTATCCTCAGTGGAGGCAGCAATTACAAACTGACATTT,35056,10,clonotype10,clonotype10_consensus_1 +TGACAACCAACTGGCC-1,True,TGACAACCAACTGGCC-1_contig_2,True,721,TRB,TRBV19,None,TRBJ1-4,TRBC1,True,True,CASSIGGASNERLFF,TGTGCCAGCAGTATAGGGGGGGCGTCCAACGAAAGATTATTTTTC,9738,5,clonotype10,clonotype10_consensus_2 +TGACAACCAACTGGCC-1,True,TGACAACCAACTGGCC-1_contig_3,True,443,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,19092,2,clonotype10,None +TGACAACCAACTGGCC-1,True,TGACAACCAACTGGCC-1_contig_4,True,306,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,13086,2,clonotype10,None +TGACAACTCGTCTGAA-1,True,TGACAACTCGTCTGAA-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCAGGGACAGGGAACACAGAAGTCTTCTTT,19898,5,clonotype5,clonotype5_consensus_3 +TGACAACTCGTCTGAA-1,True,TGACAACTCGTCTGAA-1_contig_2,True,721,TRA,TRAV9-4,None,TRAJ17,TRAC,True,True,CALTNSAGNKLTF,TGTGCTCTGACTAACAGTGCAGGGAACAAGCTAACTTTT,12844,3,clonotype5,clonotype5_consensus_2 +TGACAACTCGTCTGAA-1,True,TGACAACTCGTCTGAA-1_contig_3,True,725,TRA,TRAV9-4,None,TRAJ7,TRAC,True,True,CAVRDYSNNRLTL,TGTGCTGTGAGGGACTACAGCAACAACAGACTTACTTTG,3646,2,clonotype5,clonotype5_consensus_1 +TGACAACTCGTCTGAA-1,True,TGACAACTCGTCTGAA-1_contig_4,True,334,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,17314,3,clonotype5,None +TGACAACTCGTCTGAA-1,True,TGACAACTCGTCTGAA-1_contig_5,True,407,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,22012,6,clonotype5,None +TGACTAGGTTCCCGAG-1,True,TGACTAGGTTCCCGAG-1_contig_1,True,549,TRA,TRAV7-3,None,TRAJ12,TRAC,True,True,CAVSRGTGGYKVVF,TGTGCAGTGAGCAGGGGGACTGGAGGCTATAAAGTGGTCTTT,22548,7,clonotype103,clonotype103_consensus_2 +TGACTAGGTTCCCGAG-1,True,TGACTAGGTTCCCGAG-1_contig_2,True,522,TRB,TRBV5,None,TRBJ2-7,TRBC2,True,True,CASSPGLGDSYEQYF,TGTGCCAGCAGCCCCGGACTGGGGGACTCCTATGAACAGTACTTC,13088,8,clonotype103,clonotype103_consensus_1 +TGACTAGGTTCCCGAG-1,True,TGACTAGGTTCCCGAG-1_contig_3,True,496,TRA,TRAV6-5,None,TRAJ23,TRAC,True,False,None,None,5144,2,clonotype103,None +TGACTAGGTTCCCGAG-1,True,TGACTAGGTTCCCGAG-1_contig_4,True,341,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,36830,8,clonotype103,None +TGAGAGGCAGCTGTGC-1,True,TGAGAGGCAGCTGTGC-1_contig_1,True,628,TRB,TRBV19,None,TRBJ2-1,TRBC2,True,True,CASSIGGNYAEQFF,TGTGCCAGCAGTATTGGGGGGAACTATGCTGAGCAGTTCTTC,75546,7,clonotype104,clonotype104_consensus_1 +TGATTTCTCATCGCTC-1,True,TGATTTCTCATCGCTC-1_contig_1,True,697,TRA,TRAV9-4,None,TRAJ22,TRAC,True,True,CAVTSSGSWQLIF,TGTGCTGTGACATCTTCTGGCAGCTGGCAACTCATCTTT,59824,9,clonotype3,clonotype3_consensus_1 +TGATTTCTCATCGCTC-1,True,TGATTTCTCATCGCTC-1_contig_2,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCCGGGACAGGGAACACAGAAGTCTTCTTT,16172,2,clonotype3,clonotype3_consensus_2 +TGATTTCTCATCGCTC-1,True,TGATTTCTCATCGCTC-1_contig_3,True,566,TRB,None,None,TRBJ2-5,TRBC2,False,False,None,None,1008,1,clonotype3,None +TGCTACCCAGGATTGG-1,True,TGCTACCCAGGATTGG-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCAGGGACAGGGAACACAGAAGTCTTCTTT,49016,8,clonotype4,clonotype4_consensus_2 +TGCTACCCAGGATTGG-1,True,TGCTACCCAGGATTGG-1_contig_2,True,728,TRA,TRAV9-4,None,TRAJ17,TRAC,True,True,CALTNSAGNKLTF,TGTGCTCTGACTAACAGTGCAGGGAACAAGCTAACTTTT,19014,5,clonotype4,clonotype4_consensus_1 +TGCTACCCAGGATTGG-1,True,TGCTACCCAGGATTGG-1_contig_3,True,498,TRB,TRBV2,None,TRBJ1-1,TRBC1,True,False,None,None,9264,3,clonotype4,None +TGGACGCAGCGATTCT-1,True,TGGACGCAGCGATTCT-1_contig_1,True,518,TRB,TRBV13-3,None,TRBJ2-7,TRBC2,True,True,CASRLGFEQYF,TGTGCCAGCCGACTGGGGTTTGAACAGTACTTC,46518,23,clonotype12,clonotype12_consensus_2 +TGGACGCAGCGATTCT-1,True,TGGACGCAGCGATTCT-1_contig_2,True,591,TRA,TRAV12-3,None,TRAJ49,TRAC,True,True,CALSDPVTGYQNFYF,TGTGCTTTGAGTGACCCTGTCACGGGTTACCAGAACTTCTATTTT,21126,10,clonotype12,clonotype12_consensus_1 +TGGACGCAGCGATTCT-1,True,TGGACGCAGCGATTCT-1_contig_3,True,588,TRA,TRAV12D-1,None,TRAJ57,TRAC,True,False,CALSD,TGTGCTTTGAGTGAT,4362,2,clonotype12,None +TGGACGCAGCGATTCT-1,True,TGGACGCAGCGATTCT-1_contig_4,True,401,TRA,None,None,TRAJ39,TRAC,False,False,None,None,4402,1,clonotype12,None +TGGCGCAAGGACATTA-1,True,TGGCGCAAGGACATTA-1_contig_1,True,518,TRB,TRBV13-1,None,TRBJ1-2,TRBC1,True,True,CASSVTGANSDYTF,TGTGCCAGCAGTGTGACAGGGGCAAACTCCGACTACACCTTC,7886,1,clonotype105,clonotype105_consensus_2 +TGGCGCAAGGACATTA-1,True,TGGCGCAAGGACATTA-1_contig_2,True,537,TRB,TRBV20,None,TRBJ1-1,TRBC1,True,True,CGARGEGTNTEVFF,TGTGGTGCTAGGGGGGAAGGGACAAACACAGAAGTCTTCTTT,11320,2,clonotype105,clonotype105_consensus_1 +TGGCGCAAGGACATTA-1,True,TGGCGCAAGGACATTA-1_contig_3,True,336,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,45198,3,clonotype105,None +TGGCGCAAGGACATTA-1,True,TGGCGCAAGGACATTA-1_contig_4,True,543,TRA,TRAV7D-3,None,TRAJ35,TRAC,False,False,CAVTGFASALTF,TGTGCAGTGACAGGCTTTGCAAGTGCGCTGACATTT,10160,1,clonotype105,None +TGGTTAGCATGGTAGG-1,True,TGGTTAGCATGGTAGG-1_contig_1,True,528,TRB,TRBV17,None,TRBJ1-3,TRBC1,True,True,CASSSWQNSGNTLYF,TGTGCTAGCAGTAGCTGGCAGAATTCTGGAAATACGCTCTATTTT,65000,26,clonotype106,clonotype106_consensus_1 +TGGTTAGCATGGTAGG-1,True,TGGTTAGCATGGTAGG-1_contig_2,True,594,TRA,TRAV7-4,None,TRAJ45,TRAC,True,True,CAASDTGGADRLTF,TGTGCAGCTAGTGATACAGGAGGTGCAGATAGACTCACCTTT,4518,2,clonotype106,clonotype106_consensus_2 +TGGTTAGCATGGTAGG-1,True,TGGTTAGCATGGTAGG-1_contig_3,True,748,Multi,TRDV5,None,TRAJ33,TRAC,True,False,CASGRDSNYQLIW,TGTGCCTCGGGGAGGGATAGCAACTATCAGTTGATCTGG,2930,3,clonotype106,None +TGTGTTTTCGTAGGAG-1,True,TGTGTTTTCGTAGGAG-1_contig_1,True,639,TRA,TRAV7D-2,None,TRAJ32,TRAC,True,True,CAASMGGGSGNKLIF,TGTGCAGCAAGCATGGGGGGGGGCAGTGGCAACAAGCTCATCTTT,42862,4,clonotype107,clonotype107_consensus_2 +TGTGTTTTCGTAGGAG-1,True,TGTGTTTTCGTAGGAG-1_contig_2,True,522,TRB,TRBV31,None,TRBJ2-3,TRBC2,True,True,CAWTGGPAETLYF,TGTGCCTGGACTGGGGGTCCTGCAGAAACGCTGTATTTT,33678,4,clonotype107,clonotype107_consensus_1 +TGTGTTTTCTGTTGAG-1,True,TGTGTTTTCTGTTGAG-1_contig_1,True,516,TRB,TRBV17,None,TRBJ1-6,TRBC1,True,True,CGVQDNSPLYF,TGTGGGGTACAGGATAATTCGCCCCTCTACTTT,66006,3,clonotype108,clonotype108_consensus_1 +TGTGTTTTCTTCCTTC-1,True,TGTGTTTTCTTCCTTC-1_contig_1,True,518,TRB,TRBV13-1,None,TRBJ1-3,TRBC1,True,True,CASSDGGVGNTLYF,TGTGCCAGCAGTGATGGAGGGGTTGGAAATACGCTCTATTTT,30748,2,clonotype109,clonotype109_consensus_1 +TGTGTTTTCTTCCTTC-1,True,TGTGTTTTCTTCCTTC-1_contig_2,True,358,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,21780,1,clonotype109,None +TGTGTTTTCTTCCTTC-1,True,TGTGTTTTCTTCCTTC-1_contig_3,True,330,TRB,None,None,TRBJ1-4,TRBC1,False,False,None,None,25022,5,clonotype109,None +TGTTCCGCAGCGTTCG-1,True,TGTTCCGCAGCGTTCG-1_contig_1,True,521,TRB,TRBV13-1,None,TRBJ2-5,TRBC2,True,True,CASSDTTGGQDTQYF,TGTGCCAGCAGTGATACTACTGGGGGCCAAGACACCCAGTACTTT,78230,8,clonotype21,clonotype21_consensus_1 +TTAGGCAGTATTAGCC-1,True,TTAGGCAGTATTAGCC-1_contig_1,True,516,TRB,TRBV17,None,TRBJ1-6,TRBC1,True,True,CGVQDNSPLYF,TGTGGGGTACAGGATAATTCGCCCCTCTACTTT,60222,60,clonotype8,clonotype8_consensus_3 +TTAGGCAGTATTAGCC-1,True,TTAGGCAGTATTAGCC-1_contig_2,True,558,TRA,TRAV16N,None,TRAJ56,TRAC,True,True,CAMREGPGGNNKLTF,TGTGCTATGAGAGAGGGACCTGGAGGCAATAATAAGCTGACTTTT,3228,3,clonotype8,clonotype8_consensus_2 +TTAGGCAGTATTAGCC-1,True,TTAGGCAGTATTAGCC-1_contig_3,True,555,TRB,TRBV13-3,None,TRBJ1-3,TRBC1,True,True,CASSGDRGGNTLYF,TGTGCCAGCAGTGGGGACAGGGGTGGAAATACGCTCTATTTT,10918,10,clonotype8,clonotype8_consensus_1 +TTATGCTGTAGGCATG-1,True,TTATGCTGTAGGCATG-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCCGGGACAGGGAACACAGAAGTCTTCTTT,41148,4,clonotype3,clonotype3_consensus_2 +TTATGCTGTAGGCATG-1,True,TTATGCTGTAGGCATG-1_contig_2,True,665,TRA,TRAV9-4,None,TRAJ22,TRAC,True,True,CAVTSSGSWQLIF,TGTGCTGTGACATCTTCTGGCAGCTGGCAACTCATCTTT,35314,8,clonotype3,clonotype3_consensus_1 +TTCGAAGTCTCTAAGG-1,True,TTCGAAGTCTCTAAGG-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCAGGGACAGGGAACACAGAAGTCTTCTTT,48614,15,clonotype5,clonotype5_consensus_3 +TTCGAAGTCTCTAAGG-1,True,TTCGAAGTCTCTAAGG-1_contig_2,True,726,TRA,TRAV9-4,None,TRAJ17,TRAC,True,True,CALTNSAGNKLTF,TGTGCTCTGACTAACAGTGCAGGGAACAAGCTAACTTTT,5956,3,clonotype5,clonotype5_consensus_2 +TTCGAAGTCTCTAAGG-1,True,TTCGAAGTCTCTAAGG-1_contig_3,True,726,TRA,TRAV9-4,None,TRAJ7,TRAC,True,True,CAVRDYSNNRLTL,TGTGCTGTGAGGGACTACAGCAACAACAGACTTACTTTG,5176,2,clonotype5,clonotype5_consensus_1 +TTCGAAGTCTCTAAGG-1,True,TTCGAAGTCTCTAAGG-1_contig_4,True,365,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,17558,3,clonotype5,None +TTTATGCAGCGTGAGT-1,True,TTTATGCAGCGTGAGT-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGQGNTEVFF,TGTGCCAGCAGCCCCGGACAGGGGAACACAGAAGTCTTCTTT,64736,9,clonotype110,clonotype110_consensus_1 +TTTATGCAGCGTGAGT-1,True,TTTATGCAGCGTGAGT-1_contig_2,True,429,TRA,TRAV9-4,None,TRAJ17,TRAC,True,False,CALTNSAGNKLTF,TGTGCTCTTACTAACAGTGCAGGGAACAAGCTAACTTTT,13444,1,clonotype110,None diff --git a/tests/testthat/fixtures/Chariou/h5files/SCAF1717_5_1_filtered_contig_annotations.csv b/tests/testthat/fixtures/Chariou/h5files/SCAF1717_5_1_filtered_contig_annotations.csv new file mode 100644 index 0000000..1a08201 --- /dev/null +++ b/tests/testthat/fixtures/Chariou/h5files/SCAF1717_5_1_filtered_contig_annotations.csv @@ -0,0 +1,186 @@ +barcode,is_cell,contig_id,high_confidence,length,chain,v_gene,d_gene,j_gene,c_gene,full_length,productive,cdr3,cdr3_nt,reads,umis,raw_clonotype_id,raw_consensus_id +AAAGCAAAGCTGCCCA-1,True,AAAGCAAAGCTGCCCA-1_contig_1,True,568,TRB,TRBV1,None,TRBJ1-5,TRBC1,True,True,CTCSGRDNNQAPLF,TGCACCTGCAGTGGCCGGGACAACAACCAGGCTCCGCTTTTT,69996,9,clonotype2,clonotype2_consensus_1 +AAAGCAAAGCTGCCCA-1,True,AAAGCAAAGCTGCCCA-1_contig_2,True,543,TRA,TRAV7D-2,None,TRAJ49,TRAC,True,True,CADTGYQNFYF,TGTGCAGACACGGGTTACCAGAACTTCTATTTT,9170,2,clonotype2,clonotype2_consensus_2 +AAAGCAACATATGAGA-1,True,AAAGCAACATATGAGA-1_contig_1,True,562,TRB,TRBV1,None,TRBJ2-7,TRBC2,True,True,CTCSADRYEQYF,TGCACCTGCAGTGCAGACAGGTATGAACAGTACTTC,43352,3,clonotype3,clonotype3_consensus_1 +AAAGCAACATATGAGA-1,True,AAAGCAACATATGAGA-1_contig_2,True,391,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,32230,3,clonotype3,None +AAAGTAGGTATTCGTG-1,True,AAAGTAGGTATTCGTG-1_contig_1,True,714,TRB,TRBV2,None,TRBJ1-5,TRBC1,True,True,CASSQERGRHQAPLF,TGTGCCAGCAGCCAAGAGAGGGGAAGGCACCAGGCTCCGCTTTTT,39804,3,clonotype4,clonotype4_consensus_1 +AAAGTAGGTATTCGTG-1,True,AAAGTAGGTATTCGTG-1_contig_2,True,322,TRB,None,None,TRBJ1-6,TRBC1,False,False,None,None,20470,3,clonotype4,None +AACTGGTCAAGCGTAG-1,True,AACTGGTCAAGCGTAG-1_contig_1,True,523,TRA,TRAV7D-2,None,TRAJ21,TRAC,True,True,CAASRGYNVLYF,TGTGCAGCAAGCAGAGGATACAACGTGCTTTACTTC,168,2,clonotype5,clonotype5_consensus_1 +AACTGGTCAAGCGTAG-1,True,AACTGGTCAAGCGTAG-1_contig_2,True,558,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-5,TRBC2,True,True,CASGDEWVQDTQYF,TGTGCCAGCGGTGATGAGTGGGTCCAAGACACCCAGTACTTT,674,6,clonotype5,clonotype5_consensus_2 +ACACCGGTCAGCGACC-1,True,ACACCGGTCAGCGACC-1_contig_1,True,528,TRA,TRAV6N-7,None,TRAJ39,TRAC,True,True,CALGDNAGAKLTF,TGTGCTCTGGGTGATAATGCAGGTGCCAAGCTCACATTC,61284,5,clonotype6,clonotype6_consensus_1 +ACACTGAAGGGTCTCC-1,True,ACACTGAAGGGTCTCC-1_contig_1,True,564,TRB,TRBV20,TRBD1,TRBJ1-4,TRBC1,True,True,CGAGTGGVNERLFF,TGTGGTGCCGGGACAGGGGGCGTCAACGAAAGATTATTTTTC,31858,2,clonotype7,clonotype7_consensus_2 +ACACTGAAGGGTCTCC-1,True,ACACTGAAGGGTCTCC-1_contig_2,True,588,TRA,TRAV7-4,None,TRAJ49,TRAC,True,True,CAENTGYQNFYF,TGTGCAGAGAACACGGGTTACCAGAACTTCTATTTT,21568,2,clonotype7,clonotype7_consensus_1 +ACACTGAAGGGTCTCC-1,True,ACACTGAAGGGTCTCC-1_contig_3,True,362,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,23310,3,clonotype7,None +ACACTGAAGTGTTGAA-1,True,ACACTGAAGTGTTGAA-1_contig_1,True,518,TRA,TRAV6-4,None,TRAJ17,TRAC,True,True,CAQNSAGNKLTF,TGTGCTCAGAACAGTGCAGGGAACAAGCTAACTTTT,16502,5,clonotype8,clonotype8_consensus_2 +ACACTGAAGTGTTGAA-1,True,ACACTGAAGTGTTGAA-1_contig_2,True,568,TRB,TRBV1,None,TRBJ2-2,TRBC2,True,True,CTCSAQGDTGQLYF,TGCACCTGCAGTGCACAGGGGGACACCGGGCAGCTCTACTTT,54500,12,clonotype8,clonotype8_consensus_1 +ACACTGAAGTGTTGAA-1,True,ACACTGAAGTGTTGAA-1_contig_3,True,356,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,6724,1,clonotype8,None +ACATCAGAGAGGGATA-1,True,ACATCAGAGAGGGATA-1_contig_1,True,571,TRB,TRBV1,None,TRBJ2-5,TRBC2,True,True,CTCSARDRVKDTQYF,TGCACCTGCAGTGCCCGGGACAGGGTTAAAGACACCCAGTACTTT,802,8,clonotype9,clonotype9_consensus_1 +ACATCAGAGAGGGATA-1,True,ACATCAGAGAGGGATA-1_contig_2,True,419,TRA,None,None,TRAJ32,TRAC,False,False,None,None,84,1,clonotype9,None +ACATCAGAGAGGGATA-1,True,ACATCAGAGAGGGATA-1_contig_3,True,570,Multi,TRDV1,None,TRAJ50,TRAC,True,False,CGGKAFASSSFSKLVF,TGTGGAGGGAAAGCTTTCGCATCCTCCTCCTTCAGCAAGCTGGTGTTT,326,5,clonotype9,None +ACCTTTAAGCCAGTAG-1,True,ACCTTTAAGCCAGTAG-1_contig_1,True,570,TRB,TRBV13-3,None,TRBJ2-2,TRBC2,True,True,CASSDAGTGVLNTGQLYF,TGTGCCAGCAGTGATGCGGGGACTGGGGTCCTAAACACCGGGCAGCTCTACTTT,30230,4,clonotype10,clonotype10_consensus_2 +ACCTTTAAGCCAGTAG-1,True,ACCTTTAAGCCAGTAG-1_contig_2,True,580,TRA,TRAV12D-2,None,TRAJ43,TRAC,True,True,CALSNNNNAPRF,TGTGCTCTGAGCAATAACAACAATGCCCCACGATTT,45238,6,clonotype10,clonotype10_consensus_1 +ACCTTTAAGCCAGTAG-1,True,ACCTTTAAGCCAGTAG-1_contig_3,True,518,TRB,TRBV31,None,TRBJ2-4,None,True,False,CAWPGLGGRTLYF,TGTGCCTGGCCGGGACTGGGGGGCAGAACGCTGTATTTT,182,2,clonotype10,None +ACGGGTCCATGTAGTC-1,True,ACGGGTCCATGTAGTC-1_contig_1,True,531,TRA,TRAV6N-7,None,TRAJ32,TRAC,True,True,CALRGRGSGNKLIF,TGTGCTCTGAGAGGCCGGGGCAGTGGCAACAAGCTCATCTTT,41034,3,clonotype11,clonotype11_consensus_2 +ACGGGTCCATGTAGTC-1,True,ACGGGTCCATGTAGTC-1_contig_2,True,516,TRB,TRBV5,None,TRBJ2-2,TRBC2,True,True,CASSHPGLGDTGQLYF,TGTGCCAGCAGCCACCCGGGACTGGGTGACACCGGGCAGCTCTACTTT,21822,2,clonotype11,clonotype11_consensus_1 +ACGGGTCCATGTAGTC-1,True,ACGGGTCCATGTAGTC-1_contig_3,True,306,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,15706,1,clonotype11,None +ACTGAACGTAAGAGAG-1,True,ACTGAACGTAAGAGAG-1_contig_1,True,516,TRB,TRBV5,None,TRBJ2-2,TRBC2,True,True,CASSQDLGQYTGQLYF,TGTGCCAGCAGCCAAGATCTGGGACAGTACACCGGGCAGCTCTACTTT,29054,3,clonotype12,clonotype12_consensus_1 +ACTGAACGTAAGAGAG-1,True,ACTGAACGTAAGAGAG-1_contig_2,True,348,TRB,TRBV31,None,TRBJ1-3,TRBC1,True,False,CLESSGNNSGNTLYF,TGCCTGGAGTCATCAGGGAACAATTCTGGAAATACGCTCTATTTT,9634,5,clonotype12,None +AGAGTGGTCCGATATG-1,True,AGAGTGGTCCGATATG-1_contig_1,True,512,TRB,TRBV13-1,None,TRBJ2-7,TRBC2,True,True,CASSDVGGGQYF,TGTGCCAGCAGTGATGTTGGGGGAGGGCAGTACTTC,49024,3,clonotype13,clonotype13_consensus_1 +AGCATACGTACTTCTT-1,True,AGCATACGTACTTCTT-1_contig_1,True,568,TRB,TRBV1,None,TRBJ1-1,TRBC1,True,True,CTCSAGGEGTEVFF,TGCACCTGCAGTGCAGGGGGCGAAGGCACAGAAGTCTTCTTT,64036,16,clonotype14,clonotype14_consensus_1 +AGCATACGTACTTCTT-1,True,AGCATACGTACTTCTT-1_contig_2,True,528,TRA,TRAV6-3,None,TRAJ31,TRAC,True,True,CAMRDNNNRIFF,TGTGCTATGAGAGATAACAATAACAGAATCTTCTTT,11970,3,clonotype14,clonotype14_consensus_2 +AGGGTGAAGCCACCTG-1,True,AGGGTGAAGCCACCTG-1_contig_1,True,540,TRA,TRAV15-1-DV6-1,None,TRAJ12,TRAC,True,True,CALWELAPGGYKVVF,TGTGCTCTCTGGGAGCTGGCTCCTGGAGGCTATAAAGTGGTCTTT,41732,5,clonotype15,clonotype15_consensus_1 +AGGTCATCATGCTAGT-1,True,AGGTCATCATGCTAGT-1_contig_1,True,526,TRB,TRBV13-3,None,TRBJ2-7,TRBC2,True,True,CASSLWGASSYEQYF,TGTGCCAGCAGCCTCTGGGGGGCAAGCTCCTATGAACAGTACTTC,50532,5,clonotype16,clonotype16_consensus_2 +AGGTCATCATGCTAGT-1,True,AGGTCATCATGCTAGT-1_contig_2,True,543,TRA,TRAV6N-7,None,TRAJ27,TRAC,True,True,CALSLNTNTGKLTF,TGTGCTCTGAGTCTTAACACCAATACAGGCAAATTAACCTTT,26362,2,clonotype16,clonotype16_consensus_1 +AGTCTTTGTCCAGTGC-1,True,AGTCTTTGTCCAGTGC-1_contig_1,True,525,TRA,TRAV6-3,None,TRAJ11,TRAC,True,True,CPDSGYNKLTF,TGCCCTGACTCGGGATACAACAAACTCACTTTT,66516,4,clonotype17,clonotype17_consensus_1 +AGTCTTTGTCCAGTGC-1,True,AGTCTTTGTCCAGTGC-1_contig_2,True,353,TRB,None,None,TRBJ2-5,TRBC2,False,False,None,None,66,1,clonotype17,None +AGTGGGACAATGGATA-1,True,AGTGGGACAATGGATA-1_contig_1,True,518,TRA,TRAV7D-5,None,TRAJ48,TRAC,True,True,CAMKDHGNEKITF,TGTGCAATGAAGGACCATGGAAATGAGAAAATAACTTTT,41990,12,clonotype18,clonotype18_consensus_1 +AGTGGGACAATGGATA-1,True,AGTGGGACAATGGATA-1_contig_2,True,510,TRB,TRBV29,None,TRBJ2-7,TRBC2,True,True,CASSFRIEQYF,TGTGCTAGCAGTTTTCGGATTGAACAGTACTTC,33948,7,clonotype18,clonotype18_consensus_2 +ATCTACTCACATTTCT-1,True,ATCTACTCACATTTCT-1_contig_1,True,524,TRB,TRBV13-1,None,TRBJ2-4,TRBC2,True,True,CASSDAGRGSQNTLYF,TGTGCCAGCAGTGATGCGGGGAGAGGGAGTCAAAACACCTTGTACTTT,43816,6,clonotype19,clonotype19_consensus_1 +ATCTACTCACATTTCT-1,True,ATCTACTCACATTTCT-1_contig_2,True,579,TRA,TRAV12D-2,None,TRAJ18,TRAC,True,True,CALSDRGSALGRLHF,TGTGCTTTGAGTGACAGAGGTTCAGCCTTAGGGAGGCTGCATTTT,22094,22,clonotype19,clonotype19_consensus_2 +ATTGGTGAGTCCGGTC-1,True,ATTGGTGAGTCCGGTC-1_contig_1,True,524,TRB,TRBV13-1,None,TRBJ2-2,TRBC2,True,True,CASSDARDRNTGQLYF,TGTGCCAGCAGTGATGCCCGGGACAGAAACACCGGGCAGCTCTACTTT,17392,2,clonotype1,clonotype1_consensus_1 +ATTGGTGAGTCCGGTC-1,True,ATTGGTGAGTCCGGTC-1_contig_2,True,406,TRB,None,None,TRBJ1-3,TRBC1,False,False,None,None,28482,3,clonotype1,None +ATTGGTGAGTCCGGTC-1,True,ATTGGTGAGTCCGGTC-1_contig_3,True,333,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,13790,1,clonotype1,None +ATTGGTGAGTCCGGTC-1,True,ATTGGTGAGTCCGGTC-1_contig_4,True,577,TRA,TRAV16N,None,TRAJ13,TRAC,True,False,None,None,18974,3,clonotype1,None +ATTGGTGGTCCGTGAC-1,True,ATTGGTGGTCCGTGAC-1_contig_1,True,523,TRB,TRBV13-3,None,TRBJ2-1,TRBC2,True,True,CASSIRENYAEQFF,TGTGCCAGCAGCATCCGGGAGAACTATGCTGAGCAGTTCTTC,77200,8,clonotype20,clonotype20_consensus_1 +CAAGAAACACGGATAG-1,True,CAAGAAACACGGATAG-1_contig_1,True,516,TRB,TRBV31,None,TRBJ2-5,TRBC2,True,True,CAWTLTGGQDTQYF,TGTGCCTGGACCCTGACAGGGGGCCAAGACACCCAGTACTTT,61808,5,clonotype21,clonotype21_consensus_2 +CAAGAAACACGGATAG-1,True,CAAGAAACACGGATAG-1_contig_2,True,561,TRA,TRAV15D-1-DV6D-1,None,TRAJ16,TRAC,True,True,CALWELECTSSGQKLVF,TGTGCTCTCTGGGAGCTAGAGTGCACTTCAAGTGGCCAGAAGCTGGTTTTT,16838,2,clonotype21,clonotype21_consensus_1 +CACACTCAGATGGGTC-1,True,CACACTCAGATGGGTC-1_contig_1,True,671,TRB,TRBV3,None,TRBJ1-4,TRBC1,True,True,CASSFRANERLFF,TGTGCCAGCAGCTTCAGGGCCAACGAAAGATTATTTTTC,67836,4,clonotype22,clonotype22_consensus_1 +CACACTCAGATGGGTC-1,True,CACACTCAGATGGGTC-1_contig_2,True,402,TRA,TRAV11,None,TRAJ18,TRAC,True,False,CVVGDRGSALGRLHF,TGTGTGGTGGGAGATAGAGGTTCAGCCTTAGGGAGGCTGCATTTT,6492,3,clonotype22,None +CACAGGCCATCGTCGG-1,True,CACAGGCCATCGTCGG-1_contig_1,True,507,TRA,TRAV21-DV12,None,TRAJ39,TRAC,True,True,CILRVFNNAGAKLTF,TGTATCCTGAGAGTCTTTAATAATGCAGGTGCCAAGCTCACATTC,28504,12,clonotype23,clonotype23_consensus_2 +CACAGGCCATCGTCGG-1,True,CACAGGCCATCGTCGG-1_contig_2,True,568,TRB,TRBV1,None,TRBJ2-7,TRBC2,True,True,CTCSADRWGLEQYF,TGCACCTGCAGTGCAGATCGTTGGGGGCTTGAACAGTACTTC,49776,27,clonotype23,clonotype23_consensus_1 +CAGAATCAGACAGGCT-1,True,CAGAATCAGACAGGCT-1_contig_1,True,566,TRA,TRAV16N,None,TRAJ39,TRAC,True,True,CAMREGGNAGAKLTF,TGTGCTATGAGAGAGGGCGGTAATGCAGGTGCCAAGCTCACATTC,9304,2,clonotype24,clonotype24_consensus_2 +CAGAATCAGACAGGCT-1,True,CAGAATCAGACAGGCT-1_contig_2,True,594,TRB,TRBV5,None,TRBJ1-4,TRBC1,True,True,CASSQDWASNERLFF,TGTGCCAGCAGCCAAGATTGGGCTTCCAACGAAAGATTATTTTTC,65952,9,clonotype24,clonotype24_consensus_1 +CAGCAGCGTGGTACAG-1,True,CAGCAGCGTGGTACAG-1_contig_1,True,562,TRB,TRBV1,None,TRBJ2-7,TRBC2,True,True,CTCSADSYEQYF,TGCACCTGCAGTGCAGACTCCTATGAACAGTACTTC,63176,5,clonotype25,clonotype25_consensus_1 +CAGTCCTAGCCACGCT-1,True,CAGTCCTAGCCACGCT-1_contig_1,True,591,TRA,TRAV7-4,None,TRAJ27,TRAC,True,True,CAASGPNTGKLTF,TGTGCAGCTAGTGGCCCCAATACAGGCAAATTAACCTTT,38924,4,clonotype26,clonotype26_consensus_1 +CAGTCCTAGCCACGCT-1,True,CAGTCCTAGCCACGCT-1_contig_2,True,710,TRB,TRBV19,None,TRBJ2-1,TRBC2,True,True,CASSIAGANYAEQFF,TGTGCCAGCAGTATAGCCGGGGCGAACTATGCTGAGCAGTTCTTC,37564,5,clonotype26,clonotype26_consensus_2 +CAGTCCTGTTCACCTC-1,True,CAGTCCTGTTCACCTC-1_contig_1,True,591,TRA,TRAV7D-4,None,TRAJ45,TRAC,True,True,CAAITGGADRLTF,TGTGCAGCTATTACAGGAGGTGCAGATAGACTCACCTTT,28056,2,clonotype27,clonotype27_consensus_1 +CAGTCCTGTTCACCTC-1,True,CAGTCCTGTTCACCTC-1_contig_2,True,522,TRB,TRBV5,None,TRBJ2-3,TRBC2,True,True,CASSRDWNSAETLYF,TGTGCCAGCAGCCGAGACTGGAATAGTGCAGAAACGCTGTATTTT,22652,3,clonotype27,clonotype27_consensus_2 +CAGTCCTGTTCACCTC-1,True,CAGTCCTGTTCACCTC-1_contig_3,True,511,TRA,TRAV6-5,None,TRAJ42,TRAC,True,False,CTTVLWVIGGSNAKLTF,TGTACTACTGTGCTCTGGGTGATAGGAGGAAGCAATGCAAAGCTAACCTTC,24982,2,clonotype27,None +CCCAGTTTCTGGCGTG-1,True,CCCAGTTTCTGGCGTG-1_contig_1,True,524,TRB,TRBV13-1,None,TRBJ2-2,TRBC2,True,True,CASSDARDRNTGQLYF,TGTGCCAGCAGTGATGCCCGGGACAGAAACACCGGGCAGCTCTACTTT,21512,4,clonotype1,clonotype1_consensus_1 +CCCAGTTTCTGGCGTG-1,True,CCCAGTTTCTGGCGTG-1_contig_2,True,422,TRB,None,None,TRBJ1-3,TRBC1,False,False,None,None,44672,8,clonotype1,None +CCCAGTTTCTGGCGTG-1,True,CCCAGTTTCTGGCGTG-1_contig_3,True,357,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,9012,2,clonotype1,None +CCGGTAGCATTCTCAT-1,True,CCGGTAGCATTCTCAT-1_contig_1,True,715,TRB,TRBV19,None,TRBJ2-1,TRBC2,True,True,CASSRRTGDKQFF,TGTGCCAGCAGTAGGAGGACAGGGGATAAGCAGTTCTTC,65424,3,clonotype28,clonotype28_consensus_2 +CCGGTAGCATTCTCAT-1,True,CCGGTAGCATTCTCAT-1_contig_2,True,548,TRA,TRAV9-1,None,TRAJ50,TRAC,True,True,CAASKGSSSFSKLVF,TGTGCTGCGAGCAAGGGATCCTCCTCCTTCAGCAAGCTGGTGTTT,5644,1,clonotype28,clonotype28_consensus_1 +CCGGTAGCATTCTCAT-1,True,CCGGTAGCATTCTCAT-1_contig_3,True,558,TRA,TRAV12-1,None,TRAJ45,TRAC,True,False,CPVLLCSYTGGADRLTF,TGCCCTGTACTACTGTGCTCTTATACAGGAGGTGCAGATAGACTCACCTTT,5816,2,clonotype28,None +CCGTGGATCGGTTAAC-1,True,CCGTGGATCGGTTAAC-1_contig_1,True,701,TRB,TRBV19,None,TRBJ2-3,TRBC2,True,True,CASRTQGIGAETLYF,TGTGCCAGCAGGACTCAGGGGATCGGTGCAGAAACGCTGTATTTT,43996,4,clonotype29,clonotype29_consensus_1 +CCGTGGATCGGTTAAC-1,True,CCGTGGATCGGTTAAC-1_contig_2,True,533,TRA,TRAV6N-7,None,TRAJ53,TRAC,True,True,CALGGGGSNYKLTF,TGTGCTCTGGGTGGAGGAGGCAGCAATTACAAACTGACATTT,14968,1,clonotype29,clonotype29_consensus_2 +CCGTGGATCGGTTAAC-1,True,CCGTGGATCGGTTAAC-1_contig_3,True,432,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,20256,1,clonotype29,None +CGATCGGGTCCAGTTA-1,True,CGATCGGGTCCAGTTA-1_contig_1,True,513,TRA,TRAV7-3,None,TRAJ2,TRAC,True,True,CAVSTGGLSGKLTF,TGTGCAGTGAGTACTGGAGGACTAAGTGGTAAATTAACATTC,7642,3,clonotype30,clonotype30_consensus_2 +CGATCGGGTCCAGTTA-1,True,CGATCGGGTCCAGTTA-1_contig_2,True,698,TRB,TRBV19,None,TRBJ1-1,TRBC1,True,True,CASSIWGSNTEVFF,TGTGCCAGCAGTATTTGGGGGTCAAACACAGAAGTCTTCTTT,41092,8,clonotype30,clonotype30_consensus_1 +CGATCGGGTCCAGTTA-1,True,CGATCGGGTCCAGTTA-1_contig_3,True,717,TRB,None,None,TRBJ2-4,TRBC2,False,False,None,None,29892,7,clonotype30,None +CGATTGAGTGTTGAGG-1,True,CGATTGAGTGTTGAGG-1_contig_1,True,618,TRB,TRBV20,None,TRBJ1-1,TRBC1,True,True,CGARAGANTEVFF,TGTGGTGCTAGGGCCGGTGCAAACACAGAAGTCTTCTTT,63236,3,clonotype31,clonotype31_consensus_1 +CGCGTTTCATTACCTT-1,True,CGCGTTTCATTACCTT-1_contig_1,True,573,TRB,TRBV12-2+TRBV13-2,None,TRBJ1-5,TRBC1,True,True,CASGDQGRNQAPLF,TGTGCCAGCGGTGATCAGGGGAGGAACCAGGCTCCGCTTTTT,57028,11,clonotype32,clonotype32_consensus_1 +CGCGTTTCATTACCTT-1,True,CGCGTTTCATTACCTT-1_contig_2,True,588,TRA,TRAV12-3,None,TRAJ39,TRAC,True,True,CALRNNNAGAKLTF,TGTGCTTTGAGGAATAATAATGCAGGTGCCAAGCTCACATTC,10140,2,clonotype32,clonotype32_consensus_2 +CGTCAGGAGCGAAGGG-1,True,CGTCAGGAGCGAAGGG-1_contig_1,True,556,TRB,TRBV20,None,TRBJ1-1,TRBC1,True,True,CGARGGAPEVFF,TGTGGTGCTAGGGGGGGGGCCCCAGAAGTCTTCTTT,27938,3,clonotype33,clonotype33_consensus_2 +CGTCAGGAGCGAAGGG-1,True,CGTCAGGAGCGAAGGG-1_contig_2,True,509,TRB,TRBV26,None,TRBJ1-1,TRBC1,True,True,CARGINTEVFF,TGTGCCAGAGGGATTAACACAGAAGTCTTCTTT,48616,4,clonotype33,clonotype33_consensus_1 +CGTTCTGTCTCAAACG-1,True,CGTTCTGTCTCAAACG-1_contig_1,True,555,TRA,TRAV7D-5,None,TRAJ48,TRAC,True,True,CAMTDGNEKITF,TGTGCAATGACGGATGGAAATGAGAAAATAACTTTT,34094,8,clonotype34,clonotype34_consensus_2 +CGTTCTGTCTCAAACG-1,True,CGTTCTGTCTCAAACG-1_contig_2,True,520,TRB,TRBV31,None,TRBJ1-1,TRBC1,True,True,CAWSLDNANTEVFF,TGTGCCTGGAGTCTCGACAATGCAAACACAGAAGTCTTCTTT,23288,3,clonotype34,clonotype34_consensus_1 +CGTTCTGTCTCAAACG-1,True,CGTTCTGTCTCAAACG-1_contig_3,True,551,TRB,None,None,TRBJ1-2,TRBC1,False,False,None,None,16480,4,clonotype34,None +CTAAGACCATCCCATC-1,True,CTAAGACCATCCCATC-1_contig_1,True,558,TRB,TRBV13-3,None,TRBJ2-7,TRBC2,True,True,CASSDNWGYEQYF,TGTGCCAGCAGTGATAACTGGGGTTATGAACAGTACTTC,27436,2,clonotype35,clonotype35_consensus_1 +CTAAGACCATCCCATC-1,True,CTAAGACCATCCCATC-1_contig_2,True,519,TRA,TRAV7D-5,None,TRAJ52,TRAC,True,True,CAITGANTGKLTF,TGTGCAATCACTGGAGCTAACACTGGAAAGCTCACGTTT,13208,1,clonotype35,clonotype35_consensus_2 +CTAAGACCATCCCATC-1,True,CTAAGACCATCCCATC-1_contig_3,True,711,TRB,None,None,TRBJ1-2,TRBC1,False,False,None,None,14742,1,clonotype35,None +CTAAGACCATCCCATC-1,True,CTAAGACCATCCCATC-1_contig_4,True,598,TRA,TRAV7-4,None,TRAJ49,TRAC,True,False,None,None,15182,3,clonotype35,None +CTCCTAGAGTTAGCGG-1,True,CTCCTAGAGTTAGCGG-1_contig_1,True,558,TRB,TRBV13-3,None,TRBJ1-4,TRBC1,True,True,CASSDRRGRGGERLFF,TGTGCCAGCAGTGATCGCAGGGGGCGCGGGGGCGAAAGATTATTTTTC,16314,3,clonotype36,clonotype36_consensus_1 +CTCCTAGAGTTAGCGG-1,True,CTCCTAGAGTTAGCGG-1_contig_2,True,414,TRB,None,None,TRBJ1-3,TRBC1,False,False,None,None,16062,2,clonotype36,None +CTCCTAGAGTTAGCGG-1,True,CTCCTAGAGTTAGCGG-1_contig_3,True,356,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,20872,3,clonotype36,None +CTCCTAGAGTTAGCGG-1,True,CTCCTAGAGTTAGCGG-1_contig_4,True,498,TRA,TRAV19,None,TRAJ56,TRAC,True,False,CAAGDLLE,TGCGCAGCAGGTGACCTACTGGAG,21474,3,clonotype36,None +CTCGAAAAGCCACTAT-1,True,CTCGAAAAGCCACTAT-1_contig_1,True,542,TRA,TRAV9-1,None,TRAJ27,TRAC,True,True,CAVRNTNTGKLTF,TGTGCTGTGAGGAACACCAATACAGGCAAATTAACCTTT,63534,9,clonotype37,clonotype37_consensus_1 +CTGATCCAGTCAAGCG-1,True,CTGATCCAGTCAAGCG-1_contig_1,True,541,TRB,TRBV10,None,TRBJ1-6,TRBC1,True,True,CASSRGGNSPLYF,TGTGCCAGCTCAAGGGGGGGGAATTCGCCCCTCTACTTT,18922,1,clonotype38,clonotype38_consensus_1 +CTGATCCAGTCAAGCG-1,True,CTGATCCAGTCAAGCG-1_contig_2,True,623,TRA,TRAV5D-4,None,TRAJ56,TRAC,True,True,CAASRTGGNNKLTF,TGTGCTGCAAGTAGGACTGGAGGCAATAATAAGCTGACTTTT,58300,4,clonotype38,clonotype38_consensus_2 +CTGGTCTAGTACGACG-1,True,CTGGTCTAGTACGACG-1_contig_1,True,530,TRA,TRAV6N-7,None,TRAJ50,TRAC,True,True,CALGEPSSFSKLVF,TGTGCTCTGGGTGAACCCTCCTCCTTCAGCAAGCTGGTGTTT,47632,5,clonotype39,clonotype39_consensus_2 +CTGGTCTAGTACGACG-1,True,CTGGTCTAGTACGACG-1_contig_2,True,547,TRB,TRBV10,None,TRBJ1-4,TRBC1,True,True,CASSTGQFSNERLFF,TGTGCCAGCAGCACGGGACAGTTTTCCAACGAAAGATTATTTTTC,29094,4,clonotype39,clonotype39_consensus_1 +CTTAACTAGTGTACCT-1,True,CTTAACTAGTGTACCT-1_contig_1,True,562,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-5,TRBC2,True,True,CASGASQDTQYF,TGTGCCAGCGGTGCCTCTCAAGACACCCAGTACTTT,56152,8,clonotype40,clonotype40_consensus_1 +CTTAACTAGTGTACCT-1,True,CTTAACTAGTGTACCT-1_contig_2,True,562,TRA,TRAV4-4-DV10,None,TRAJ52,TRAC,True,True,CAAANTGANTGKLTF,TGTGCTGCTGCAAACACTGGAGCTAACACTGGAAAGCTCACGTTT,7032,1,clonotype40,clonotype40_consensus_2 +CTTAACTAGTGTACCT-1,True,CTTAACTAGTGTACCT-1_contig_3,True,690,TRA,TRAV13-4-DV7,None,TRAJ49,TRAC,True,False,None,None,11962,1,clonotype40,None +CTTTGCGCAACAACCT-1,True,CTTTGCGCAACAACCT-1_contig_1,True,524,TRA,TRAV6D-4,None,TRAJ22,TRAC,True,True,CALVESSGSWQLIF,TGTGCTCTGGTTGAGTCTTCTGGCAGCTGGCAACTCATCTTT,19270,3,clonotype41,clonotype41_consensus_2 +CTTTGCGCAACAACCT-1,True,CTTTGCGCAACAACCT-1_contig_2,True,657,TRB,TRBV2,None,TRBJ2-7,TRBC2,True,True,CASSQEGQGRNEQYF,TGTGCCAGCAGCCAAGAGGGACAGGGGAGGAATGAACAGTACTTC,23990,3,clonotype41,clonotype41_consensus_1 +CTTTGCGCAACAACCT-1,True,CTTTGCGCAACAACCT-1_contig_3,True,510,TRB,None,None,TRBJ1-6,TRBC1,False,False,None,None,33468,3,clonotype41,None +GAAATGAGTTTGACAC-1,True,GAAATGAGTTTGACAC-1_contig_1,True,660,TRA,TRAV5D-4,None,TRAJ45,TRAC,True,True,CAAINTGGADRLTF,TGTGCTGCGATCAATACAGGAGGTGCAGATAGACTCACCTTT,47380,5,clonotype42,clonotype42_consensus_2 +GAAATGAGTTTGACAC-1,True,GAAATGAGTTTGACAC-1_contig_2,True,519,TRB,TRBV5,None,TRBJ2-4,TRBC2,True,True,CASSHWASQNTLYF,TGTGCCAGCAGCCACTGGGCTAGTCAAAACACCTTGTACTTT,31490,2,clonotype42,clonotype42_consensus_1 +GACGCGTCAGACGCAA-1,True,GACGCGTCAGACGCAA-1_contig_1,True,530,TRA,TRAV16N,None,TRAJ27,TRAC,True,True,CAMREGNTNTGKLTF,TGTGCTATGAGAGAGGGCAACACCAATACAGGCAAATTAACCTTT,19732,1,clonotype43,clonotype43_consensus_1 +GACGCGTCAGACGCAA-1,True,GACGCGTCAGACGCAA-1_contig_2,True,640,TRB,TRBV1,None,TRBJ1-2,TRBC1,True,True,CTCSALASNSDYTF,TGCACCTGCAGTGCCCTGGCATCAAACTCCGACTACACCTTC,16296,2,clonotype43,clonotype43_consensus_2 +GACGCGTCAGACGCAA-1,True,GACGCGTCAGACGCAA-1_contig_3,True,559,TRA,TRAV11,None,TRAJ27,TRAC,True,True,CVVVLNTNTGKLTF,TGTGTGGTGGTCCTTAACACCAATACAGGCAAATTAACCTTT,20348,1,clonotype43,clonotype43_consensus_3 +GACGCGTCAGACGCAA-1,True,GACGCGTCAGACGCAA-1_contig_4,True,718,TRB,None,None,TRBJ2-5,TRBC2,False,False,None,None,22412,2,clonotype43,None +GATCGATTCTTGACGA-1,True,GATCGATTCTTGACGA-1_contig_1,True,518,TRA,TRAV6D-4,None,TRAJ31,TRAC,True,True,CALAPNNNRIFF,TGTGCTCTGGCCCCAAACAATAACAGAATCTTCTTT,25480,3,clonotype44,clonotype44_consensus_1 +GATCGATTCTTGACGA-1,True,GATCGATTCTTGACGA-1_contig_2,True,527,TRB,TRBV5,None,TRBJ1-4,TRBC1,True,True,CASSQDPGQTNERLFF,TGTGCCAGCAGCCAAGATCCGGGACAAACCAACGAAAGATTATTTTTC,12156,2,clonotype44,clonotype44_consensus_2 +GATCGATTCTTGACGA-1,True,GATCGATTCTTGACGA-1_contig_3,True,397,TRA,TRAV6D-7,None,TRAJ44,TRAC,True,False,CALSDLWQWWKTHF,TGTGCTCTGAGTGATCTCTGGCAGTGGTGGAAAACTCACTTT,15256,2,clonotype44,None +GATCGATTCTTGACGA-1,True,GATCGATTCTTGACGA-1_contig_4,True,356,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,13294,2,clonotype44,None +GATCGATTCTTGACGA-1,True,GATCGATTCTTGACGA-1_contig_5,True,359,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,12566,1,clonotype44,None +GATCGTAAGAAACCGC-1,True,GATCGTAAGAAACCGC-1_contig_1,True,562,TRA,TRAV7-4,None,TRAJ27,TRAC,True,True,CAASNTNTGKLTF,TGTGCAGCTAGTAACACCAATACAGGCAAATTAACCTTT,33696,6,clonotype45,clonotype45_consensus_1 +GATCGTAAGAAACCGC-1,True,GATCGTAAGAAACCGC-1_contig_2,True,525,TRB,TRBV5,None,TRBJ2-2,TRBC2,True,True,CASSQEGLGNTGQLYF,TGTGCCAGCAGCCAAGAGGGACTGGGAAACACCGGGCAGCTCTACTTT,29574,4,clonotype45,clonotype45_consensus_2 +GCATACACACCCTATC-1,True,GCATACACACCCTATC-1_contig_1,True,601,TRA,TRAV12D-2,None,TRAJ52,TRAC,True,True,CALRGSNTGANTGKLTF,TGTGCTCTGAGGGGTTCTAACACTGGAGCTAACACTGGAAAGCTCACGTTT,34778,5,clonotype46,clonotype46_consensus_2 +GCATACACACCCTATC-1,True,GCATACACACCCTATC-1_contig_2,True,603,TRA,TRAV5D-4,None,TRAJ52,TRAC,True,True,CAARGDTGANTGKLTF,TGTGCTGCAAGAGGGGACACTGGAGCTAACACTGGAAAGCTCACGTTT,24028,4,clonotype46,clonotype46_consensus_3 +GCATACACACCCTATC-1,True,GCATACACACCCTATC-1_contig_3,True,513,TRB,TRBV31,None,TRBJ2-3,TRBC2,True,True,CAWSPRWAGAETLYF,TGTGCCTGGAGTCCCAGGTGGGCCGGGGCAGAAACGCTGTATTTT,15500,2,clonotype46,clonotype46_consensus_1 +GCATACACACCCTATC-1,True,GCATACACACCCTATC-1_contig_4,True,446,TRA,None,None,TRAJ41,TRAC,False,False,None,None,2126,2,clonotype46,None +GCTGGGTGTTACGTCA-1,True,GCTGGGTGTTACGTCA-1_contig_1,True,534,TRB,TRBV17,None,TRBJ1-2,TRBC1,True,True,CASSRESPGTPNSDYTF,TGTGCTAGCAGTAGAGAGAGCCCCGGGACACCAAACTCCGACTACACCTTC,52408,4,clonotype47,clonotype47_consensus_1 +GCTGGGTGTTACGTCA-1,True,GCTGGGTGTTACGTCA-1_contig_2,True,489,TRA,TRAV7-4,None,TRAJ42,TRAC,True,False,CAASEHDSGGSNAKLTF,TGTGCAGCTAGTGAGCATGATTCTGGAGGAAGCAATGCAAAGCTAACCTTC,24862,1,clonotype47,None +GGCGTGTTCACATGCA-1,True,GGCGTGTTCACATGCA-1_contig_1,True,605,TRA,TRAV14D-2,None,TRAJ49,TRAC,True,True,CAANTGYQNFYF,TGTGCAGCAAACACGGGTTACCAGAACTTCTATTTT,14622,3,clonotype48,clonotype48_consensus_2 +GGCGTGTTCACATGCA-1,True,GGCGTGTTCACATGCA-1_contig_2,True,519,TRB,TRBV31,None,TRBJ2-4,TRBC2,True,True,CAWRSSQNTLYF,TGTGCCTGGAGAAGTAGTCAAAACACCTTGTACTTT,64470,11,clonotype48,clonotype48_consensus_1 +GTCATTTGTATGAAAC-1,True,GTCATTTGTATGAAAC-1_contig_1,True,568,TRB,TRBV1,None,TRBJ2-7,TRBC2,True,True,CTCSADRGLYEQYF,TGCACCTGCAGTGCAGACAGGGGGTTATATGAACAGTACTTC,55520,8,clonotype49,clonotype49_consensus_1 +GTCATTTGTATGAAAC-1,True,GTCATTTGTATGAAAC-1_contig_2,True,560,Multi,TRDV2-2,None,TRAJ57,TRAC,True,False,CALMERGWHISEGYELRQGGSAKLIF,TGTGCTCTCATGGAGCGCGGGTGGCACATATCGGAGGGATACGAGCTGCGGCAAGGAGGGTCTGCGAAGCTCATCTTT,19164,3,clonotype49,None +GTCCTCAGTTTACTCT-1,True,GTCCTCAGTTTACTCT-1_contig_1,True,586,TRA,TRAV4-4-DV10,None,TRAJ50,TRAC,True,True,CAAEAASSSFSKLVF,TGTGCTGCTGAGGCCGCATCCTCCTCCTTCAGCAAGCTGGTGTTT,826,13,clonotype50,clonotype50_consensus_2 +GTCCTCAGTTTACTCT-1,True,GTCCTCAGTTTACTCT-1_contig_2,True,519,TRB,TRBV5,TRBD1,TRBJ2-7,TRBC2,True,True,CASSHRDRGLEQYF,TGTGCCAGCAGCCACCGGGACAGGGGGCTTGAACAGTACTTC,228,3,clonotype50,clonotype50_consensus_1 +GTCCTCAGTTTACTCT-1,True,GTCCTCAGTTTACTCT-1_contig_3,True,423,TRB,None,None,TRBJ2-3,TRBC2,False,False,None,None,2030,14,clonotype50,None +GTCTTCGTCCAGATCA-1,True,GTCTTCGTCCAGATCA-1_contig_1,True,568,TRB,TRBV1,None,TRBJ2-1,TRBC2,True,True,CTCSAQVNYAEQFF,TGCACCTGCAGTGCTCAGGTCAACTATGCTGAGCAGTTCTTC,64024,23,clonotype51,clonotype51_consensus_2 +GTCTTCGTCCAGATCA-1,True,GTCTTCGTCCAGATCA-1_contig_2,True,512,TRA,TRAV6D-4,None,TRAJ34,TRAC,True,True,CALDTDKVVF,TGTGCTCTGGATACCGACAAAGTCGTCTTT,11410,4,clonotype51,clonotype51_consensus_1 +GTGCAGCCACAAGACG-1,True,GTGCAGCCACAAGACG-1_contig_1,True,518,TRA,TRAV7D-2,None,TRAJ2,TRAC,True,True,CAASTGGLSGKLTF,TGTGCAGCAAGCACGGGAGGACTAAGTGGTAAATTAACATTC,67990,12,clonotype52,clonotype52_consensus_2 +GTGCAGCCACAAGACG-1,True,GTGCAGCCACAAGACG-1_contig_2,True,572,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-5,TRBC2,True,True,CASGDAGGGDTQYF,TGTGCCAGCGGTGATGCAGGGGGCGGAGACACCCAGTACTTT,11072,2,clonotype52,clonotype52_consensus_1 +GTTACAGAGAGGTACC-1,True,GTTACAGAGAGGTACC-1_contig_1,True,520,TRB,TRBV13-3,None,TRBJ1-2,TRBC1,True,True,CASSERQNSDYTF,TGTGCCAGCAGTGAGAGACAGAACTCCGACTACACCTTC,54776,6,clonotype53,clonotype53_consensus_1 +GTTACAGAGAGGTACC-1,True,GTTACAGAGAGGTACC-1_contig_2,True,579,TRA,TRAV12D-2,None,TRAJ15,TRAC,True,True,CALSDYQGGRALIF,TGTGCTTTGAGTGACTACCAGGGAGGCAGAGCTCTGATATTT,11142,2,clonotype53,clonotype53_consensus_2 +GTTACAGCATTCGACA-1,True,GTTACAGCATTCGACA-1_contig_1,True,512,TRA,TRAV6-5,None,TRAJ5,TRAC,True,True,CALGDTQVVGQLTF,TGTGCTCTGGGTGACACACAGGTTGTGGGGCAGCTCACTTTC,364,10,clonotype54,clonotype54_consensus_1 +GTTACAGCATTCGACA-1,True,GTTACAGCATTCGACA-1_contig_2,True,513,TRB,TRBV31,None,TRBJ1-3,TRBC1,True,True,CAWRGGGGNTLYF,TGTGCCTGGCGGGGGGGGGGAGGAAATACGCTCTATTTT,3084,42,clonotype54,clonotype54_consensus_2 +GTTACAGCATTCGACA-1,True,GTTACAGCATTCGACA-1_contig_3,True,502,TRA,TRAV12-1,None,TRAJ11,TRAC,True,False,CPVLLCSNSGYNKLTF,TGCCCTGTACTACTGTGCTCTAACTCGGGATACAACAAACTCACTTTT,122,2,clonotype54,None +GTTCATTAGGATGTAT-1,True,GTTCATTAGGATGTAT-1_contig_1,True,503,TRA,TRAV6-6,None,TRAJ31,TRAC,True,True,CALGERNRIFF,TGTGCTCTGGGTGAGAGGAACAGAATCTTCTTT,38208,6,clonotype55,clonotype55_consensus_2 +GTTCATTAGGATGTAT-1,True,GTTCATTAGGATGTAT-1_contig_2,True,541,TRB,TRBV12-2+TRBV13-2,None,TRBJ2-5,TRBC2,True,True,CASGGLAQDTQYF,TGTGCCAGCGGGGGACTGGCCCAAGACACCCAGTACTTT,8032,2,clonotype55,clonotype55_consensus_1 +GTTCATTAGGATGTAT-1,True,GTTCATTAGGATGTAT-1_contig_3,True,546,TRA,TRAV6-6,None,TRAJ17,TRAC,True,True,CALSGPNSAGNKLTF,TGTGCTCTGAGTGGACCTAACAGTGCAGGGAACAAGCTAACTTTT,29782,6,clonotype55,clonotype55_consensus_3 +TAAGAGACACCGCTAG-1,True,TAAGAGACACCGCTAG-1_contig_1,True,524,TRA,TRAV6D-4,None,TRAJ26,TRAC,True,True,CALVDYNYAQGLTF,TGTGCTCTGGTTGATTATAACTATGCCCAGGGATTAACCTTC,10508,5,clonotype56,clonotype56_consensus_2 +TAAGAGACACCGCTAG-1,True,TAAGAGACACCGCTAG-1_contig_2,True,565,TRB,TRBV1,None,TRBJ1-1,TRBC1,True,True,CTCSAGEGTEVFF,TGCACCTGCAGTGCCGGGGAAGGCACAGAAGTCTTCTTT,56976,20,clonotype56,clonotype56_consensus_1 +TAAGAGACACCGCTAG-1,True,TAAGAGACACCGCTAG-1_contig_3,True,630,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,9350,5,clonotype56,None +TAAGTGCCAACTGCTA-1,True,TAAGTGCCAACTGCTA-1_contig_1,True,582,TRB,TRBV12-2+TRBV13-2,None,TRBJ1-6,TRBC1,True,True,CASGDEGAHSYNSPLYF,TGTGCCAGCGGTGATGAGGGGGCCCATTCCTATAATTCGCCCCTCTACTTT,58758,8,clonotype57,clonotype57_consensus_1 +TAAGTGCCAACTGCTA-1,True,TAAGTGCCAACTGCTA-1_contig_2,True,903,TRB,TRBV20,None,TRBJ2-7,TRBC2,True,False,None,None,12106,2,clonotype57,None +TACTCATCAGACGCTC-1,True,TACTCATCAGACGCTC-1_contig_1,True,522,TRB,TRBV17,None,TRBJ2-1,TRBC2,True,True,CASRRQGYAEQFF,TGTGCTAGCAGGAGACAGGGCTATGCTGAGCAGTTCTTC,45272,6,clonotype58,clonotype58_consensus_1 +TACTCATCAGACGCTC-1,True,TACTCATCAGACGCTC-1_contig_2,True,531,TRA,TRAV6-3,None,TRAJ33,TRAC,True,True,CAMRDRSNYQLIW,TGTGCTATGAGAGATAGGAGCAACTATCAGTTGATCTGG,32794,4,clonotype58,clonotype58_consensus_2 +TACTTACGTAGCCTCG-1,True,TACTTACGTAGCCTCG-1_contig_1,True,511,TRA,TRAV4-2,None,TRAJ40,TRAC,True,True,CAAYTGNYKYVF,TGTGCTGCTTATACAGGAAACTACAAATACGTCTTT,42280,4,clonotype59,clonotype59_consensus_1 +TACTTACGTAGCCTCG-1,True,TACTTACGTAGCCTCG-1_contig_2,True,370,TRB,TRBV13-2,None,TRBJ2-3,TRBC2,True,False,CASGSGTGAAETLYF,TGTGCCAGCGGGTCCGGGACAGGGGCAGCAGAAACGCTGTATTTT,34624,1,clonotype59,None +TAGCCGGGTTGGTGGA-1,True,TAGCCGGGTTGGTGGA-1_contig_1,True,534,TRB,TRBV13-3,None,TRBJ2-7,TRBC2,True,True,CASSDWTGKTYEQYF,TGTGCCAGCAGTGATTGGACAGGGAAGACCTATGAACAGTACTTC,61316,4,clonotype60,clonotype60_consensus_2 +TAGCCGGGTTGGTGGA-1,True,TAGCCGGGTTGGTGGA-1_contig_2,True,527,TRA,TRAV6-4,None,TRAJ52,TRAC,True,True,CALVDRGANTGKLTF,TGTGCTCTGGTTGATCGGGGAGCTAACACTGGAAAGCTCACGTTT,17816,1,clonotype60,clonotype60_consensus_1 +TAGTTGGAGTGTACCT-1,True,TAGTTGGAGTGTACCT-1_contig_1,True,672,TRB,TRBV19,None,TRBJ1-1,TRBC1,True,True,CASRTGVNTEVFF,TGTGCCAGCAGGACAGGGGTAAACACAGAAGTCTTCTTT,31254,2,clonotype61,clonotype61_consensus_1 +TAGTTGGAGTGTACCT-1,True,TAGTTGGAGTGTACCT-1_contig_2,True,333,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,47520,2,clonotype61,None +TAGTTGGTCCCAAGTA-1,True,TAGTTGGTCCCAAGTA-1_contig_1,True,543,TRA,TRAV15-1-DV6-1,None,TRAJ33,TRAC,True,True,CALWEPYMDSNYQLIW,TGTGCTCTCTGGGAGCCCTACATGGATAGCAACTATCAGTTGATCTGG,156,2,clonotype62,clonotype62_consensus_1 +TAGTTGGTCCCAAGTA-1,True,TAGTTGGTCCCAAGTA-1_contig_2,True,522,TRB,TRBV5,None,TRBJ2-7,TRBC2,True,True,CASSPGLGDSYEQYF,TGTGCCAGCAGCCCGGGACTGGGGGACTCCTATGAACAGTACTTC,744,7,clonotype62,clonotype62_consensus_2 +TAGTTGGTCCCAAGTA-1,True,TAGTTGGTCCCAAGTA-1_contig_3,True,602,TRA,TRAV14D-2,None,TRAJ33,TRAC,True,False,CALWEPYMDSNYQLIW,TGTGCTCTCTGGGAGCCCTACATGGATAGCAACTATCAGTTGATCTGG,190,3,clonotype62,clonotype62_consensus_1 +TAGTTGGTCCCAAGTA-1,True,TAGTTGGTCCCAAGTA-1_contig_4,True,309,TRA,None,None,TRAJ11,TRAC,False,False,None,None,164,1,clonotype62,None +TAGTTGGTCCCAAGTA-1,True,TAGTTGGTCCCAAGTA-1_contig_5,True,305,TRA,None,None,TRAJ34,TRAC,False,False,None,None,350,5,clonotype62,None +TATTACCTCCACTCCA-1,True,TATTACCTCCACTCCA-1_contig_1,True,603,TRB,TRBV13-3,None,TRBJ1-4,TRBC1,True,True,CASSDKGRFNERLFF,TGTGCCAGCAGTGATAAGGGGCGTTTCAACGAAAGATTATTTTTC,56988,6,clonotype63,clonotype63_consensus_2 +TATTACCTCCACTCCA-1,True,TATTACCTCCACTCCA-1_contig_2,True,559,TRA,TRAV14D-1,None,TRAJ33,TRAC,True,True,CAASLDSNYQLIW,TGTGCAGCAAGTCTGGATAGCAACTATCAGTTGATCTGG,16764,5,clonotype63,clonotype63_consensus_1 +TCGTAGATCACGCGGT-1,True,TCGTAGATCACGCGGT-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGQGNTEVFF,TGTGCCAGCAGCCCCGGACAGGGGAACACAGAAGTCTTCTTT,1344,12,clonotype64,clonotype64_consensus_1 +TCGTAGATCACGCGGT-1,True,TCGTAGATCACGCGGT-1_contig_2,True,527,TRA,TRAV6N-7,None,TRAJ34,TRAC,True,False,CTTVLFNTDKVVF,TGTACTACTGTGCTCTTCAATACCGACAAAGTCGTCTTT,86,1,clonotype64,None +TCTCTAAAGCCCAACC-1,True,TCTCTAAAGCCCAACC-1_contig_1,True,519,TRB,TRBV17,None,TRBJ2-2,TRBC2,True,True,CASSRQTGQLYF,TGTGCTAGCAGTAGACAAACCGGGCAGCTCTACTTT,49942,8,clonotype65,clonotype65_consensus_1 +TCTCTAAAGCCCAACC-1,True,TCTCTAAAGCCCAACC-1_contig_2,True,635,TRA,TRAV9-4,None,TRAJ32,TRAC,True,False,None,None,28410,3,clonotype65,None +TCTGAGAGTGACAAAT-1,True,TCTGAGAGTGACAAAT-1_contig_1,True,695,TRB,TRBV19,None,TRBJ2-1,TRBC2,True,True,CASSKTGGAEQFF,TGTGCCAGCAGTAAGACAGGGGGAGCTGAGCAGTTCTTC,55050,9,clonotype66,clonotype66_consensus_1 +TCTGAGAGTGACAAAT-1,True,TCTGAGAGTGACAAAT-1_contig_2,True,564,TRA,TRAV16N,None,TRAJ22,TRAC,True,True,CAMREESSGSWQLIF,TGTGCTATGAGAGAGGAATCTTCTGGCAGCTGGCAACTCATCTTT,22510,2,clonotype66,clonotype66_consensus_2 +TGAAAGAGTGTTGGGA-1,True,TGAAAGAGTGTTGGGA-1_contig_1,True,518,TRA,TRAV7D-5,None,TRAJ52,TRAC,True,True,CAITGANTGKLTF,TGTGCAATCACTGGAGCTAACACTGGAAAGCTCACGTTT,36010,6,clonotype67,clonotype67_consensus_1 +TGACTAGTCGAGAACG-1,True,TGACTAGTCGAGAACG-1_contig_1,True,550,TRA,TRAV10D,None,TRAJ45,TRAC,True,True,CAAGAGGADRLTF,TGTGCAGCTGGGGCAGGAGGTGCAGATAGACTCACCTTT,214,3,clonotype68,clonotype68_consensus_2 +TGACTAGTCGAGAACG-1,True,TGACTAGTCGAGAACG-1_contig_2,True,571,TRB,TRBV1,None,TRBJ2-3,TRBC2,True,True,CTCSADLVSAETLYF,TGCACCTGCAGTGCAGATCTAGTTAGTGCAGAAACGCTGTATTTT,2478,22,clonotype68,clonotype68_consensus_1 +TGAGCCGAGCAGGTCA-1,True,TGAGCCGAGCAGGTCA-1_contig_1,True,508,TRA,TRAV6-5,None,TRAJ49,TRAC,True,True,CALSDPGYQNFYF,TGTGCTCTGAGTGATCCGGGTTACCAGAACTTCTATTTT,41972,6,clonotype69,clonotype69_consensus_1 +TGAGCCGCAGTAAGCG-1,True,TGAGCCGCAGTAAGCG-1_contig_1,True,519,TRB,TRBV5,None,TRBJ1-1,TRBC1,True,True,CASSPGTGNTEVFF,TGTGCCAGCAGCCCCGGGACAGGAAACACAGAAGTCTTCTTT,196,2,clonotype70,clonotype70_consensus_1 +TGAGCCGCAGTAAGCG-1,True,TGAGCCGCAGTAAGCG-1_contig_2,True,666,TRB,None,None,TRBJ2-7,TRBC2,False,False,None,None,838,6,clonotype70,None +TGAGCCGCAGTAAGCG-1,True,TGAGCCGCAGTAAGCG-1_contig_3,True,491,TRA,TRAV12D-2,None,TRAJ17,TRAC,True,False,None,None,186,3,clonotype70,None +TGCCCTACACTTAAGC-1,True,TGCCCTACACTTAAGC-1_contig_1,True,521,TRB,TRBV13-1,None,TRBJ2-2,TRBC2,True,True,CASSDDGADTGQLYF,TGTGCCAGCAGTGATGATGGGGCGGACACCGGGCAGCTCTACTTT,44330,5,clonotype71,clonotype71_consensus_1 +TGCCCTACACTTAAGC-1,True,TGCCCTACACTTAAGC-1_contig_2,True,525,TRA,TRAV6-3,None,TRAJ11,TRAC,True,True,CPDSGYNKLTF,TGCCCTGACTCGGGATACAACAAACTCACTTTT,26432,3,clonotype71,clonotype71_consensus_2 +TGCGGGTGTGACAAAT-1,True,TGCGGGTGTGACAAAT-1_contig_1,True,651,TRB,TRBV19,None,TRBJ2-3,TRBC2,True,True,CASSLGSAETLYF,TGTGCCAGCAGCCTCGGTAGTGCAGAAACGCTGTATTTT,23746,2,clonotype72,clonotype72_consensus_1 +TGCGGGTGTGACAAAT-1,True,TGCGGGTGTGACAAAT-1_contig_2,True,575,TRA,TRAV4-4-DV10,None,TRAJ32,TRAC,True,True,CAAEGYGGSGNKLIF,TGTGCTGCTGAGGGGTATGGGGGCAGTGGCAACAAGCTCATCTTT,35200,3,clonotype72,clonotype72_consensus_2 +TGCGGGTGTGACAAAT-1,True,TGCGGGTGTGACAAAT-1_contig_3,True,356,TRB,None,None,TRBJ2-1,TRBC2,False,False,None,None,17744,1,clonotype72,None +TGGACGCTCGCGTAGC-1,True,TGGACGCTCGCGTAGC-1_contig_1,True,549,TRB,TRBV16,None,TRBJ1-1,TRBC1,True,True,CASSLDGEITEVFF,TGTGCAAGCAGCTTAGACGGGGAGATCACAGAAGTCTTCTTT,75518,5,clonotype73,clonotype73_consensus_1 +TGGCCAGCATGCATGT-1,True,TGGCCAGCATGCATGT-1_contig_1,True,568,TRB,TRBV1,None,TRBJ2-1,TRBC2,True,True,CTCSAQGAYAEQFF,TGCACCTGCAGTGCTCAGGGGGCCTATGCTGAGCAGTTCTTC,68510,12,clonotype74,clonotype74_consensus_1 +TGGCCAGCATGCATGT-1,True,TGGCCAGCATGCATGT-1_contig_2,True,521,TRA,TRAV6D-4,None,TRAJ17,TRAC,True,True,CALTNSAGNKLTF,TGTGCTCTCACTAACAGTGCAGGGAACAAGCTAACTTTT,10388,2,clonotype74,clonotype74_consensus_2 +TGGCTGGAGCGATAGC-1,True,TGGCTGGAGCGATAGC-1_contig_1,True,518,TRB,TRBV13-1,None,TRBJ2-1,TRBC2,True,True,CASSLGQGIAEQFF,TGTGCCAGCAGTCTCGGACAGGGGATTGCTGAGCAGTTCTTC,48066,4,clonotype75,clonotype75_consensus_2 +TGGCTGGAGCGATAGC-1,True,TGGCTGGAGCGATAGC-1_contig_2,True,504,TRA,TRAV21-DV12,None,TRAJ49,TRAC,True,True,CILRVAGGYQNFYF,TGTATCCTGAGAGTAGCGGGGGGTTACCAGAACTTCTATTTT,29136,3,clonotype75,clonotype75_consensus_1 +TGTGGTAGTATAGGGC-1,True,TGTGGTAGTATAGGGC-1_contig_1,True,524,TRB,TRBV13-3,None,TRBJ2-1,TRBC2,True,True,CASSAQNYAEQFF,TGTGCCAGCAGTGCCCAGAACTATGCTGAGCAGTTCTTC,49408,4,clonotype76,clonotype76_consensus_1 +TGTTCCGGTTAAGAAC-1,True,TGTTCCGGTTAAGAAC-1_contig_1,True,504,TRA,TRAV21-DV12,None,TRAJ32,TRAC,True,True,CILNYGGSGNKLIF,TGTATCCTGAATTATGGGGGCAGTGGCAACAAGCTCATCTTT,29102,4,clonotype77,clonotype77_consensus_1 +TGTTCCGGTTAAGAAC-1,True,TGTTCCGGTTAAGAAC-1_contig_2,True,524,TRB,TRBV31,None,TRBJ2-3,TRBC2,True,True,CAWPGLGGRTLYF,TGTGCCTGGCCGGGACTGGGGGGCAGAACGCTGTATTTT,15834,1,clonotype77,clonotype77_consensus_2 +TGTTCCGGTTAAGAAC-1,True,TGTTCCGGTTAAGAAC-1_contig_3,True,1009,TRB,TRBV12-2,None,TRBJ2-5,TRBC2,True,False,None,None,15210,2,clonotype77,None +TGTTCCGGTTAAGAAC-1,True,TGTTCCGGTTAAGAAC-1_contig_4,True,510,TRA,TRAV4-4-DV10,None,TRAJ53,TRAC,True,False,None,None,18228,1,clonotype77,None +TTAGGACAGTACGACG-1,True,TTAGGACAGTACGACG-1_contig_1,True,576,TRA,TRAV12D-1,None,TRAJ13,TRAC,True,True,CALRPSGTYQRF,TGTGCTTTGAGGCCTTCTGGGACTTACCAGAGGTTT,27106,9,clonotype78,clonotype78_consensus_1 +TTAGGCAAGAAACGAG-1,True,TTAGGCAAGAAACGAG-1_contig_1,True,630,TRB,TRBV19,None,TRBJ2-1,TRBC2,True,True,CASSKTGGAEQFF,TGTGCCAGCAGTAAGACAGGGGGAGCTGAGCAGTTCTTC,46832,4,clonotype79,clonotype79_consensus_1 +TTAGTTCCAATTCCTT-1,True,TTAGTTCCAATTCCTT-1_contig_1,True,558,TRB,TRBV13-3,None,TRBJ2-3,TRBC2,True,True,CASSEPGGRAETLYF,TGTGCCAGCAGTGAGCCTGGGGGGCGTGCAGAAACGCTGTATTTT,73908,8,clonotype80,clonotype80_consensus_1 diff --git a/tests/testthat/fixtures/PBMC_Single/PBMC_Single_ProcessRaw_SO_downsample.rds b/tests/testthat/fixtures/PBMC_Single/PBMC_Single_ProcessRaw_SO_downsample.rds new file mode 100644 index 0000000..51ec882 Binary files /dev/null and b/tests/testthat/fixtures/PBMC_Single/PBMC_Single_ProcessRaw_SO_downsample.rds differ diff --git a/tests/testthat/helper-3D_tSNE.R b/tests/testthat/helper-3D_tSNE.R index d8f8db5..1aa900c 100644 --- a/tests/testthat/helper-3D_tSNE.R +++ b/tests/testthat/helper-3D_tSNE.R @@ -20,7 +20,7 @@ getParam3D <- function(data) { label.variable = "BP_encode_main" } else if (data == "BRCA") { - object <- select_crobject("BRCA") + object <- selectSRObject("BRCA") color.variable = "orig.ident" label.variable = "SCT_snn_res.0.4" diff --git a/tests/testthat/helper-Color_by_Genes_Automatic.R b/tests/testthat/helper-Color_by_Genes_Automatic.R index 072b130..8d8e8f7 100755 --- a/tests/testthat/helper-Color_by_Genes_Automatic.R +++ b/tests/testthat/helper-Color_by_Genes_Automatic.R @@ -65,8 +65,27 @@ getCbgAutoParam <- function(data) { ) } -.drawCbG <- function(x, width = 10, height = 10){ +.drawCbG <- function(x, width = 10, height = 10, component = c("overall", "celltype", "manual_entry"), index = 1){ + component <- match.arg(component) + target <- x + if (is.list(x) && all(c("overall", "celltype", "manual_entry") %in% names(x))) { + target <- x[[component]] + if (is.list(target)) { + if (length(target) < index) { + stop("Requested index exceeds available plots in component") + } + target <- target[[index]] + } + if (is.null(target)) { + # Fallback to first available overall plot if chosen component is NULL + if (length(x$overall) >= 1) { + target <- x$overall[[1]] + } else { + stop("No plot available to save in provided object") + } + } + } path <- tempfile(fileext = ".png") - ggsave(path, x, width = 10, height = 10) + ggsave(path, target, width = width, height = height) print(path) } diff --git a/tests/testthat/helper-Combine_and_Normalize.R b/tests/testthat/helper-Combine_and_Normalize.R index 040459a..123bdac 100755 --- a/tests/testthat/helper-Combine_and_Normalize.R +++ b/tests/testthat/helper-Combine_and_Normalize.R @@ -27,7 +27,9 @@ getParamCN <- function(data){ } else if (data == "NSCLC_Single") { object <- readRDS(test_path( paste0("fixtures/",data), paste0('NSCLCsingle','_Filtered_SO_downsample.rds'))) - + object=object$so + print('got data') + print(object) npcs = 30 vars.to.regress = NULL clust.res.low=0.2 @@ -37,7 +39,7 @@ getParamCN <- function(data){ } else if (data == "NSCLC_Multi") { object <- readRDS(test_path( - paste0("fixtures/",data), paste0('NSCLCmulti','_Filtered_SO_downsample.rds'))) + paste0("fixtures/",data), paste0('NSCLC_Multi','_Filtered_SO_downsample.rds'))) object=object npcs = 30 @@ -48,15 +50,15 @@ getParamCN <- function(data){ } else if (data == "BRCA") { - object <- readRDS(test_path( - paste0("fixtures/",data), paste0('NSCLCmulti','_Filtered_SO_downsample.rds'))) - object=object - - npcs = 30 - vars.to.regress = NULL - clust.res.low=0.2 - clust.res.high = 1.2 - only.var.genes = TRUE + # object <- readRDS(test_path( + # paste0("fixtures/",data), paste0('NSCLCmulti','_Filtered_SO_downsample.rds'))) + # object=object + # + # npcs = 30 + # vars.to.regress = NULL + # clust.res.low=0.2 + # clust.res.high = 1.2 + # only.var.genes = TRUE } diff --git a/tests/testthat/helper-Filter_QC.R b/tests/testthat/helper-Filter_QC.R index 72d5bd5..e50467f 100644 --- a/tests/testthat/helper-Filter_QC.R +++ b/tests/testthat/helper-Filter_QC.R @@ -17,8 +17,10 @@ getParamFQ <- function(data){ } else if (data == "PBMC_Single") { - object=readRDS(test_path( - paste0("fixtures/",data), paste0(data,'_ProcessRaw_SO_downsample.rds'))) + filerds=test_path( + paste0("fixtures/",data), paste0(data,'_ProcessRaw_SO_downsample.rds')) + print(filerds) + object=readRDS(filerds) mad.mitoch.limits=c(NA,3) mitoch.limits = c(NA,25) @@ -27,7 +29,7 @@ getParamFQ <- function(data){ } else if (data == "NSCLC_Multi") { object=readRDS(test_path( - paste0("fixtures/",data), paste0('NSCLCmulti','_ProcessRaw_SO_downsample.rds'))) + paste0("fixtures/",data), paste0(data,'_ProcessRaw_SO_downsample.rds'))) mad.mitoch.limits=c(NA,3) mitoch.limits = c(NA,25) @@ -47,17 +49,3 @@ getParamFQ <- function(data){ "mad.mitoch.limits" = mad.mitoch.limits, "mitoch.limits" = mitoch.limits)) } - - -.drawFig <- function(x, width = 10, height = 10){ - path <- tempfile(fileext = ".png") - ggsave(path, x, width = 10, height = 10) - print(path) -} -.saveSO <- function(x, width = 10, height = 10){ - path <- tempfile(fileext = ".rds") - saveRDS(x, file = path) - print(path) -} - - diff --git a/tests/testthat/helper-ModuleScore.R b/tests/testthat/helper-ModuleScore.R index b1f582e..94eae64 100755 --- a/tests/testthat/helper-ModuleScore.R +++ b/tests/testthat/helper-ModuleScore.R @@ -4,17 +4,19 @@ getModuleScoreParam <- function(data){ object = selectCRObject("TEC") marker.table = read.csv(test_path("fixtures", "Marker_Table_demo.csv")) - ms.threshold = paste(colnames(marker.table), rep(0, ncol(marker.table))) + ms_threshold = paste(colnames(marker.table)[1:3], rep(0, ncol(marker.table))) + use_columns = colnames(marker.table)[1:3] general.class = colnames(marker.table)[1:3] - #lvl.vec = c('Pan_Tcells-CD4_T-Tregs','Pan_Tcells-CD4_T-New','Pan_Tcells-CD8_T') + # lvl.vec = c('Pan_Tcells-CD4_T-Tregs','Pan_Tcells-CD4_T-New','Pan_Tcells-CD8_T') } else if (data == "chariou") { object = selectCRObject("Chariou") marker.table = read.csv(test_path("fixtures", "Marker_Table_demo.csv")) - ms.threshold = paste(colnames(marker.table), rep(0, ncol(marker.table))) + ms_threshold = paste(colnames(marker.table)[1:3], rep(0, ncol(marker.table))) + use_columns = colnames(marker.table)[1:3] general.class = colnames(marker.table)[1:3] - #lvl.vec = c('Pan_Tcells-CD4_T-Tregs','Pan_Tcells-CD4_T-New','Pan_Tcells-CD8_T') + # lvl.vec = c('Pan_Tcells-CD4_T-Tregs','Pan_Tcells-CD4_T-New','Pan_Tcells-CD8_T') } else if (data == "pbmc.single") { @@ -26,9 +28,10 @@ getModuleScoreParam <- function(data){ replace = FALSE), rand_type3 = sample(rownames(object), 5, replace = FALSE)) - ms.threshold = paste(colnames(marker.table), rep(0, ncol(marker.table))) + ms_threshold = paste(colnames(marker.table), rep(0, ncol(marker.table))) + use_columns = colnames(marker.table) general.class = colnames(marker.table) - #lvl.vec = c('Pan_Tcells-CD4_T-Tregs','Pan_Tcells-CD4_T-New','Pan_Tcells-CD8_T') + # lvl.vec = c('Pan_Tcells-CD4_T-Tregs','Pan_Tcells-CD4_T-New','Pan_Tcells-CD8_T') } else if (data == "nsclc.multi") { @@ -40,9 +43,10 @@ getModuleScoreParam <- function(data){ replace = FALSE), rand_type3 = sample(rownames(object), 5, replace = FALSE)) - ms.threshold = paste(colnames(marker.table), rep(0, ncol(marker.table))) + ms_threshold = paste(colnames(marker.table), rep(0, ncol(marker.table))) + use_columns = colnames(marker.table) general.class = colnames(marker.table) - #lvl.vec = c('Pan_Tcells-CD4_T-Tregs','Pan_Tcells-CD4_T-New','Pan_Tcells-CD8_T') + # lvl.vec = c('Pan_Tcells-CD4_T-Tregs','Pan_Tcells-CD4_T-New','Pan_Tcells-CD8_T') } else if (data == "brca") { @@ -54,22 +58,31 @@ getModuleScoreParam <- function(data){ replace = FALSE), rand_type3 = sample(rownames(object), 5, replace = FALSE)) - ms.threshold = paste(colnames(marker.table), rep(0, ncol(marker.table))) + ms_threshold = paste(colnames(marker.table), rep(0, ncol(marker.table))) + use_columns = colnames(marker.table) general.class = colnames(marker.table) - #lvl.vec = c('Pan_Tcells-CD4_T-Tregs','Pan_Tcells-CD4_T-New','Pan_Tcells-CD8_T') + # lvl.vec = c('Pan_Tcells-CD4_T-Tregs','Pan_Tcells-CD4_T-New','Pan_Tcells-CD8_T') } return(list("object" = object, - "ms.threshold"= ms.threshold, - "lvl.vec" = lvl.vec, + "ms_threshold"= ms_threshold, + # "lvl.vec" = lvl.vec, "marker.table" = marker.table, - "general.class" = general.class + "general.class" = general.class, + "use_columns"=use_columns )) } -.drawMSfig <- function(x, width = 10, height = 10){ +.drawMSfig <- function(x, width = 10, height = 10, index = 1){ + target <- x + if (is.list(x) && all(c("object", "figures") %in% names(x))) { + if (length(x$figures) < index) { + stop("Requested index exceeds available figures") + } + target <- x$figures[[index]] + } path <- tempfile(fileext = ".png") - ggsave(path, x, width = 10, height = 10) + ggsave(path, target, width = 10, height = 10) print(path) } diff --git a/tests/testthat/helper-Process_Raw_Data.R b/tests/testthat/helper-Process_Raw_Data.R index 65d2174..50a7d09 100755 --- a/tests/testthat/helper-Process_Raw_Data.R +++ b/tests/testthat/helper-Process_Raw_Data.R @@ -5,7 +5,8 @@ getParamRaw <- function(data){ data.table(Sample_Name=c('5_ABSC_E13_5_TEC','6_ABSC_Newborn_cTEC', '7_ABSC_Adult_cTEC','8_ABSC_E15_cTEC'), Gender=c('M','F','N','F'), - Rename=c("1_Embryo_13_5","3_Newborn","4_Adult","2_Embryo_15"))%>% + Rename=c("S1_Embryo_13_5","S3_Newborn", + "S4_Adult","S2_Embryo_15"))%>% write.table( test_path(paste0("fixtures/",data,"/",data,"_metadata.txt")), sep = '\t') @@ -46,7 +47,7 @@ getParamRaw <- function(data){ } else if (data == "NSCLC_Single") { - data.table(Sample_Name=c('PBMC_20k_3p_HT_nextgem_Chromium_X'), + data.table(Sample_Name=c('20k_PBMC_3p_HT_nextgem_Chromium_X'), Rename=c("PBMC_Single"))%>% write.table( test_path(paste0("fixtures/",data,"/",data,"_metadata.txt")), @@ -65,19 +66,19 @@ getParamRaw <- function(data){ } else if (data == "NSCLC_Multi") { data.table(Sample_Name= - c('NSCLC_40k_DTC_3p_HT_nextgem_donor_1_count_sample_feature_bc_matrix', - 'NSCLC_40k_DTC_3p_HT_nextgem_donor_2_count_sample_feature_bc_matrix', - 'NSCLC_40k_DTC_3p_HT_nextgem_donor_3_count_sample_feature_bc_matrix', - 'NSCLC_40k_DTC_3p_HT_nextgem_donor_4_count_sample_feature_bc_matrix', - 'NSCLC_40k_DTC_3p_HT_nextgem_donor_5_count_sample_feature_bc_matrix', - 'NSCLC_40k_DTC_3p_HT_nextgem_donor_6_count_sample_feature_bc_matrix', - 'NSCLC_40k_DTC_3p_HT_nextgem_donor_7_count_sample_feature_bc_matrix'), + c('40k_NSCLC_DTC_3p_HT_nextgem_donor_1_count_sample_feature_bc_matrix', + '40k_NSCLC_DTC_3p_HT_nextgem_donor_2_count_sample_feature_bc_matrix', + '40k_NSCLC_DTC_3p_HT_nextgem_donor_3_count_sample_feature_bc_matrix', + '40k_NSCLC_DTC_3p_HT_nextgem_donor_4_count_sample_feature_bc_matrix', + '40k_NSCLC_DTC_3p_HT_nextgem_donor_5_count_sample_feature_bc_matrix', + '40k_NSCLC_DTC_3p_HT_nextgem_donor_6_count_sample_feature_bc_matrix', + '40k_NSCLC_DTC_3p_HT_nextgem_donor_7_count_sample_feature_bc_matrix'), Rename=c("Donor_1","Donor_2", "Donor_3","Donor_4", "Donor_5","Donor_6","Donor_7"))%>% write.table( test_path(paste0("fixtures/",data,"/",data,"_metadata.txt")), - sep = '\t') + sep = '\t',row.names = F) input=list.files( test_path(paste0("fixtures/",data,"/h5files")),".h5",full.names = T) organism = "Human" @@ -129,6 +130,20 @@ getParamRaw <- function(data){ split.h5=T + } else if (data == "ccbr1256") { + + + + input=list.files( + test_path(paste0("fixtures/",data,"/")),"",full.names = T) + # input=list.files( + # test_path(paste0("fixtures/",data,"/h5files")),".h5",full.names = T) + organism = "Mouse" + sample.metadata.table=NULL + split.h5=F + + + } return(list("input" = input, @@ -141,6 +156,7 @@ getParamRaw <- function(data){ )) } + .drawFig <- function(x, width = 10, height = 10){ path <- tempfile(fileext = ".png") ggsave(path, x, width = 10, height = 10) diff --git a/tests/testthat/helper-getSO.R b/tests/testthat/helper-getSO.R index 7068882..bc51fb5 100644 --- a/tests/testthat/helper-getSO.R +++ b/tests/testthat/helper-getSO.R @@ -60,6 +60,12 @@ selectSRObject <- function(dataset){ input.object <- readRDS(test_path("fixtures/NSCLC_Multi", "NSCLCmulti_Cell_Types_SingleR_SO_downsample.rds")) - } + } else if (dataset == "BRCA"){ + + print("selected BRCA dataset") + input.object <- readRDS(test_path("fixtures/BRCA", + "BRCA_Combine_and_Renormalize_SO_downsample.rds")) + + } } diff --git a/tests/testthat/test-AggregateCounts.R b/tests/testthat/test-AggregateCounts.R new file mode 100644 index 0000000..c4ab048 --- /dev/null +++ b/tests/testthat/test-AggregateCounts.R @@ -0,0 +1,54 @@ +test_that("aggregateCounts returns pseudobulk with sanitized group columns", { + obj <- selectCRObject("BRCA") + + res <- aggregateCounts( + object = obj, + var.group = "orig.ident", + slot = "data" + ) + + expect_true(is.data.frame(res)) + expect_true("Gene" %in% colnames(res)) + # Row names are not relied upon; ensure Gene column exists instead + + meta_groups <- unique(as.character(obj$orig.ident)) + expected_cols <- gsub("\\W", "_", meta_groups) + + expect_setequal(setdiff(colnames(res), "Gene"), expected_cols) +}) + +test_that("aggregateCounts warns for singleton groups", { + obj <- selectCRObject("BRCA") + + # Force a singleton group in orig.ident + orig <- as.character(obj$orig.ident) + orig[1] <- paste0(orig[1], "_ONE") + obj$orig.ident <- factor(orig) + + expect_warning( + res <- aggregateCounts( + object = obj, + var.group = "orig.ident", + slot = "data" + ), + "Some groups have only 1 cell" + ) + + # Ensure the new singleton group column exists (sanitized) + expected_col <- gsub("\\W", "_", orig[1]) + expect_true(expected_col %in% colnames(res)) +}) + +test_that("aggregateCounts errors for non-categorical var.group", { + obj <- selectCRObject("BRCA") + obj$numeric_group <- seq_len(ncol(obj)) + + expect_error( + aggregateCounts( + object = obj, + var.group = "numeric_group", + slot = "data" + ), + "All columns in var.group must be factors or characters" + ) +}) diff --git a/tests/testthat/test-Color_by_Genes_Automatic.R b/tests/testthat/test-Color_by_Genes_Automatic.R index 59a396c..967a5d4 100644 --- a/tests/testthat/test-Color_by_Genes_Automatic.R +++ b/tests/testthat/test-Color_by_Genes_Automatic.R @@ -15,8 +15,15 @@ test_that("Color by Genes Automatic works for TEC data", { "tec_cbg.png" ) - expected_elements <- c("gtable", "gTree", "grob", "gDesc") - expect_setequal(class(cbg.demo), expected_elements) + expect_true(is.list(cbg.demo)) + expect_setequal(names(cbg.demo), c("overall", "celltype", "manual_entry")) + expect_true(is.list(cbg.demo$overall)) + expect_true(is.list(cbg.demo$celltype)) + expect_gt(length(cbg.demo$overall), 0) + expect_gt(length(cbg.demo$celltype), 0) + expect_true(grid::is.grob(cbg.demo$overall[[1]])) + expect_true(grid::is.grob(cbg.demo$celltype[[1]])) + expect_true(is.null(cbg.demo$manual_entry) || grid::is.grob(cbg.demo$manual_entry)) }) test_that("Color by Genes Automatic works for Chariou data", { @@ -35,8 +42,15 @@ test_that("Color by Genes Automatic works for Chariou data", { "chariou_cbg.png" ) - expected_elements <- c("gtable", "gTree", "grob", "gDesc") - expect_setequal(class(cbg.demo), expected_elements) + expect_true(is.list(cbg.demo)) + expect_setequal(names(cbg.demo), c("overall", "celltype", "manual_entry")) + expect_true(is.list(cbg.demo$overall)) + expect_true(is.list(cbg.demo$celltype)) + expect_gt(length(cbg.demo$overall), 0) + expect_gt(length(cbg.demo$celltype), 0) + expect_true(grid::is.grob(cbg.demo$overall[[1]])) + expect_true(grid::is.grob(cbg.demo$celltype[[1]])) + expect_true(is.null(cbg.demo$manual_entry) || grid::is.grob(cbg.demo$manual_entry)) }) @@ -56,8 +70,15 @@ test_that("Color by Genes Automatic works for pbmc.single data", { "pbmc_single_cbg.png" ) - expected_elements <- c("gtable", "gTree", "grob", "gDesc") - expect_setequal(class(cbg.demo), expected_elements) + expect_true(is.list(cbg.demo)) + expect_setequal(names(cbg.demo), c("overall", "celltype", "manual_entry")) + expect_true(is.list(cbg.demo$overall)) + expect_true(is.list(cbg.demo$celltype)) + expect_gt(length(cbg.demo$overall), 0) + expect_gt(length(cbg.demo$celltype), 0) + expect_true(grid::is.grob(cbg.demo$overall[[1]])) + expect_true(grid::is.grob(cbg.demo$celltype[[1]])) + expect_true(is.null(cbg.demo$manual_entry) || grid::is.grob(cbg.demo$manual_entry)) }) @@ -77,8 +98,15 @@ test_that("Color by Genes Automatic works for nsclc_multi data", { "nsclc_multi_cbg.png" ) - expected_elements <- c("gtable", "gTree", "grob", "gDesc") - expect_setequal(class(cbg.demo), expected_elements) + expect_true(is.list(cbg.demo)) + expect_setequal(names(cbg.demo), c("overall", "celltype", "manual_entry")) + expect_true(is.list(cbg.demo$overall)) + expect_true(is.list(cbg.demo$celltype)) + expect_gt(length(cbg.demo$overall), 0) + expect_gt(length(cbg.demo$celltype), 0) + expect_true(grid::is.grob(cbg.demo$overall[[1]])) + expect_true(grid::is.grob(cbg.demo$celltype[[1]])) + expect_true(is.null(cbg.demo$manual_entry) || grid::is.grob(cbg.demo$manual_entry)) }) @@ -98,8 +126,15 @@ test_that("Color by Genes Automatic works for BRCA data", { "brca_cbg.png" ) - expected_elements <- c("gtable", "gTree", "grob", "gDesc") - expect_setequal(class(cbg.demo), expected_elements) + expect_true(is.list(cbg.demo)) + expect_setequal(names(cbg.demo), c("overall", "celltype", "manual_entry")) + expect_true(is.list(cbg.demo$overall)) + expect_true(is.list(cbg.demo$celltype)) + expect_gt(length(cbg.demo$overall), 0) + expect_gt(length(cbg.demo$celltype), 0) + expect_true(grid::is.grob(cbg.demo$overall[[1]])) + expect_true(grid::is.grob(cbg.demo$celltype[[1]])) + expect_true(is.null(cbg.demo$manual_entry) || grid::is.grob(cbg.demo$manual_entry)) }) @@ -115,8 +150,7 @@ test_that("Color by Genes Automatic stops when user inputs an assay not found samples.to.display = tec.data$samples.to.display, marker.table = tec.data$marker.table, cells.of.interest = tec.data$cells.of.interest, - assay = "wrong_assay"), - "assay type not found in seurat") + assay = "wrong_assay")) }) @@ -130,7 +164,7 @@ test_that("Color by Genes Automatic stops when user inputs an reduction type samples.to.display = tec.data$samples.to.display, marker.table = tec.data$marker.table, cells.of.interest = tec.data$cells.of.interest, - reduction = "wrong_reduction"), - "reduction type not found in seurat") + reduction.type = "wrong_reduction"), + NA) }) diff --git a/tests/testthat/test-Combine_and_Normalize.R b/tests/testthat/test-Combine_and_Normalize.R index fd1e18d..dfcc309 100755 --- a/tests/testthat/test-Combine_and_Normalize.R +++ b/tests/testthat/test-Combine_and_Normalize.R @@ -1,6 +1,8 @@ -for (data in c('TEC','Chariou','NSCLC_Single')) { +for (data in c( + 'TEC','Chariou', + 'NSCLC_Single')) { test_that( paste0("Test Combine & Renormalize - Standard (",data," dataset)"), { diff --git a/tests/testthat/test-Filter_QC.R b/tests/testthat/test-Filter_QC.R index ec133b1..95f19bd 100755 --- a/tests/testthat/test-Filter_QC.R +++ b/tests/testthat/test-Filter_QC.R @@ -1,13 +1,13 @@ for (data in c('TEC','Chariou','PBMC_Single','NSCLC_Multi')) { - + test_that(paste0("Test Filter and QC - Standard (",data," dataset)"), { - + data.run <- getParamFQ(data) filter.qc.out <- do.call(filterQC, data.run) - filter.qc.out$object - + + # create output - expected.elements = c("object","FilteringMeta","plots") + expected.elements = c("object","FilteringTables","plots") expect_setequal(names(filter.qc.out), expected.elements) # SO contains object same length as input expect_equal(length(filter.qc.out$object),length(data.run$object)) @@ -17,7 +17,7 @@ for (data in c('TEC','Chariou','PBMC_Single','NSCLC_Multi')) { expect( object.size(filter.qc.out$object[[1]]@assays$RNA@counts),'> 0' ) # plot slot contains data expect( object.size(filter.qc.out$plots),'> 0' ) - + skip_on_ci() expect_snapshot_file( .drawFig(filter.qc.out$plots$PostFilterCombined), @@ -27,10 +27,10 @@ for (data in c('TEC','Chariou','PBMC_Single','NSCLC_Multi')) { .saveSO(filter.qc.out$object), paste0(data,"_Standard.rds") ) - - + + }) - + } @@ -47,7 +47,7 @@ for (data in c('Chariou')) { # create output - expected.elements = c("object","FilteringMeta","plots") + expected.elements = c("object","FilteringTables","plots") expect_setequal(names(filter.qc.out), expected.elements) # SO contains object same length as input expect_equal(length(filter.qc.out$object),length(data.run$object)) @@ -58,10 +58,10 @@ for (data in c('Chariou')) { # plot slot contains data expect( object.size(filter.qc.out$plots),'> 0' ) # Check if VDJ genes are removed - # expect( - # sum(filter.qc.out$FilteringMeta[[1]]$`VDJ Genes Removed`>0), - # '==5') - + expect( + sum(filter.qc.out$FilteringTables$FilteringCounts$`VDJ Genes Removed`>0), + '==5') + skip_on_ci() expect_snapshot_file( diff --git a/tests/testthat/test-ModuleScore.R b/tests/testthat/test-ModuleScore.R index e729fee..ebb4369 100755 --- a/tests/testthat/test-ModuleScore.R +++ b/tests/testthat/test-ModuleScore.R @@ -204,9 +204,9 @@ test_that("modScore detects when no genes are found in the data", { expect_error(suppressWarnings(modscore.demo <- modScore( object = chariou$object, marker.table = apply(chariou$marker.table,2, function(x) toupper(x)), - ms.threshold = chariou$ms_threshold, + ms_threshold = chariou$ms_threshold, general.class = chariou$general.class, - lvl.vec = chariou$lvl.vec, + ms_threshold = chariou$ms_threshold, nbins = 10), "No genes from list was found in data")) }) @@ -223,7 +223,7 @@ test_that("modScore detects when no genes are found in the data", { # marker.table = chariou$marker.table, # celltypes = chariou$celltypes, # general.class = chariou$general.class, -# lvl.vec = chariou$lvl.vec, +# ms_threshold = chariou$ms_threshold, # threshold = rep(0.1,5), # nbins = 10), # "Threshold length does not match # celltypes to analyze")) diff --git a/tests/testthat/test-Process_Raw_Data.R b/tests/testthat/test-Process_Raw_Data.R index 9bee9af..11b454f 100755 --- a/tests/testthat/test-Process_Raw_Data.R +++ b/tests/testthat/test-Process_Raw_Data.R @@ -1,13 +1,19 @@ -for (data in c('TEC','Chariou','NSCLC_Multi')) {#,'PBMC_Single')) { +for (data in c('TEC','Chariou','NSCLC_Multi','NSCLC_Single')) { + + + test_that(paste0("Test Filter and QC - Standard (",data," dataset)"), { - - + + data.run <- getParamRaw(data) + if(any(file.exists(data.run$input)==F)){next} Raw.out <- do.call(processRawData, data.run) - - - + + # saveRDS(Raw.out$object, + # test_path(paste0("fixtures/",data,"/",data,"_Filtered_SO_downsample.rds"))) + + # create output expected.elements = c("object","plots") expect_setequal(names(Raw.out), expected.elements) @@ -20,8 +26,9 @@ for (data in c('TEC','Chariou','NSCLC_Multi')) {#,'PBMC_Single')) { expect( object.size(Raw.out$object[[1]]@assays$RNA@counts),'> 0' ) # plot slot contains data expect( object.size(Raw.out$plots),'= 0' ) - - + + + # Check for Identical files skip_on_ci() expect_snapshot_file( .drawFig(Raw.out$plots$CombinedQC), @@ -31,50 +38,49 @@ for (data in c('TEC','Chariou','NSCLC_Multi')) {#,'PBMC_Single')) { # .saveSO(Raw.out$object), # paste0(data,"_Standard.rds") # ) - + + }) - + } +for (data in c('BRCA')) { + test_that(paste0("Test Split h5 (",data," dataset)"), { -# for (data in c('BRCA')) { -# -# test_that(paste0("Test Split h5 (",data," dataset)"), { -# -# -# data.run <- getParamRaw(data) -# Raw.out <- do.call(processRawData, data.run) -# -# # create output -# expected.elements = c("object","plots") -# expect_setequal(names(Raw.out), expected.elements) -# # SO is split into multiple samples -# expect_false(isTRUE(all.equal(length(Raw.out$object), -# length(data.run$input)))) -# # figure slot is a ggplot -# expect_equal(class(Raw.out$plots[[1]])[2], 'ggplot') -# # SO slot contains data -# expect( object.size(Raw.out$object[[1]]@assays$RNA@counts),'> 0' ) -# # plot slot contains data -# expect( object.size(Raw.out$plots),'= 0' ) -# -# skip_on_ci() -# expect_snapshot_file( -# .drawFig(Raw.out$plots$CombinedQC), -# paste0(data,"_Standard_combFig.png") -# ) -# # expect_snapshot_file( # Test failed each run with no changes -# # .saveSO(Raw.out$object), -# # paste0(data,"_Standard.rds") -# # ) -# -# -# }) -# -# } + data.run <- getParamRaw(data) + if(any(file.exists(data.run$input)==F)){next} + + Raw.out <- do.call(processRawData, data.run) + + # create output + expected.elements = c("object","plots") + expect_setequal(names(Raw.out), expected.elements) + # SO is Split into multiple files + expect_false(isTRUE(all.equal(length(Raw.out$object), + length(data.run$input)))) + # figure slot is a ggplot + expect_equal(class(Raw.out$plots[[1]])[2], 'ggplot') + # SO slot contains data + expect( object.size(Raw.out$object[[1]]@assays$RNA@counts),'> 0' ) + # plot slot contains data + expect( object.size(Raw.out$plots),'= 0' ) + + # Check for Identical files + skip_on_ci() + expect_snapshot_file( + .drawFig(Raw.out$plots$CombinedQC), + paste0(data,"_Standard_combFig.png") + ) + # expect_snapshot_file( # Test failed each run with no changes + # .saveSO(Raw.out$object), + # paste0(data,"_Standard.rds") + # ) + }) + +} ################################################################ @@ -86,13 +92,16 @@ for (data in c('Chariou')) { data.run <- getParamRaw(data) + if(any(file.exists(data.run$input)==F)){next} + Raw.out <- do.call(processRawData, data.run) # create output expected.elements = c("object","plots") expect_setequal(names(Raw.out), expected.elements) # SO contains object same length as input - expect_equal(length(Raw.out$object),length(grep('\\.h5',data.run$input,value = T))) + expect_equal(length(Raw.out$object),length(grep('.csv',data.run$input, + invert = T,value = T))) # figure slot is a ggplot expect_equal(class(Raw.out$plots[[1]])[2], 'ggplot') # SO slot contains data @@ -120,13 +129,24 @@ for (data in c('Chariou')) { TCRtbl=so@meta.data[!is.na(so@meta.data[,TCRmeta[1]]),TCRmeta,drop=F] # Check if TCR data is added expect_gt(nrow(TCRtbl),0, - label = paste0("Sample: ",n, " TCR data Not Added")) + label = paste0("Sample: ",n, " TCR data Not Added")) # Check if TCR data is added expect_equal(nrow(TCRtbl[rowSums(is.na(TCRtbl))>0,]),0 , label = paste0("Sample: ",n, " TCR data contains missing values")) - - } + + } + + # Check for Identical files + skip_on_ci() + expect_snapshot_file( + .drawFig(Raw.out$plots$CombinedQC), + paste0(data,"_Standard_combFig.png") + ) + # expect_snapshot_file( # Test failed each run with no changes + # .saveSO(Raw.out$object), + # paste0(data,"_Standard.rds") + # ) }) @@ -150,8 +170,9 @@ for (data in c('TEC')) { expected.elements = c("object","plots") expect_setequal(names(Raw.out), expected.elements) # SO contains object same length as input - expect_false(length(Raw.out$object)==length(data.run$input)) - + expect_equal(length(Raw.out$object),2) + # test that samples + # figure slot is a ggplot expect_equal(class(Raw.out$plots[[1]])[2], 'ggplot') # SO slot contains data @@ -159,14 +180,15 @@ for (data in c('TEC')) { # plot slot contains data expect( object.size(Raw.out$plots),'>0' ) + # Check for Identical files skip_on_ci() expect_snapshot_file( .drawFig(Raw.out$plots$CombinedQC), paste0(data,"_Regex_combFig.png") ) - # expect_snapshot_file( + # expect_snapshot_file( # Test failed each run with no changes # .saveSO(Raw.out$object), - # paste0(data,"_Regex.rds") + # paste0(data,"_Standard.rds") # ) @@ -175,3 +197,20 @@ for (data in c('TEC')) { } +################################################################ + +# for (data in c('TEC')) { +# +# test_that(paste0("Test Filter and QC - Test organsim ERROR: (",data," dataset)"), { +# +# data.run <- getParamRaw(data) +# data.run$organism = "Human" +# Raw.out <- do.call(processRawData, data.run) +# +# expect_error(do.call(processRawData, data.run), +# c("No Mitochondrial Genes Detetcted: Wrong Organism may be selected. +# Supported Organisms are Human or Mouse"), ignore.case = TRUE) +# +# }) +# +# } diff --git a/vignettes/CONTRIBUTING.Rmd b/vignettes/CONTRIBUTING.Rmd new file mode 100644 index 0000000..1846cd7 --- /dev/null +++ b/vignettes/CONTRIBUTING.Rmd @@ -0,0 +1,419 @@ +--- +title: "Contributing to SCWorkflow" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{CONTRIBUTING} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} + +--- + +```{r, include = FALSE} +options(rmarkdown.html_vignette.check_title = FALSE) + +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>", + warning = FALSE, message = FALSE +) + + +run_Chunks=FALSE +``` + +# Overview {#overview} + +![](./images/DEV_CheatSheet.png){} + +
    + +# **Propose Change** {#propose-changes} + +--- + + + +## **Clone the repo** {#clone-the-repo} + +If you are a member of [CCBR](https://github.com/CCBR), +you can clone this repository to your computer or development environment. + +
    + +SCWorkflow is a large repository so this may take a few minutes. + +```sh +git clone --single-branch --branch DEV https://github.com/NIDAP-Community/SCWorkflow.git +``` + +> Cloning into 'SCWorkflow'...
    +> remote: Enumerating objects: 3126, done.
    +> remote: Counting objects: 100% (734/734), done.
    +> remote: Compressing objects: 100% (191/191), done.
    +> remote: Total 3126 (delta 630), reused 545 (delta 543), pack-reused 2392 (from 1)
    +> Receiving objects: 100% (3126/3126), 1.04 GiB | 4.99 MiB/s, done.
    +> Resolving deltas: 100% (1754/1754), done.
    +> Updating files: 100% (306/306), done.
    + +```sh +cd SCWorkflow +``` + +
    + +## **Install dependencies** {#install-dependencies} + +If this is your first time cloning the repo you may have to install dependencies + + + +**Check R CMD:** In an R console, make sure the package passes R CMD check by running: +```r + devtools::check() +``` + > ⚠️ **Note:** If R CMD check doesn't pass cleanly, it's a good idea to ask for help before continuing. + + + +
    + +## **Load SCWorkflow from repo** {#load-scworkflow} + +In an R console, load the package from the local repo using: + +```r +devtools::load_all() +``` + +
    + +## **Create branch** {#create-branch} + +Create a Git branch for your pull request (PR). Give the branch a descriptive name for the changes you will make. + +**Example:** Use `iss-10` if it's for a specific issue, or `feature-new-plot` for a new feature. + +For bug fixes or small changes, you can branch from the `main` branch. + +```sh +# Create a new branch from main and switch to it +git branch iss-10 +git switch iss-10 +``` +> **Success:** Switched to a new branch 'iss-10' + +For new features or larger changes, branch from the `DEV` branch. + +```sh +# Switch to DEV branch, create a new branch, and switch to new branch +git switch DEV +git branch feature-new-plot +git switch feature-new-plot +``` +> **Success:** Switched to a new branch 'feature-new-plot' + +

    + +# Develop {#develop} + +--- + +## **Make your changes** {#make-changes} + +Now you're ready to edit the code, write unit tests, and update the documentation as needed. + +
    + +### **Code Style Guidelines** + + +New code should follow the general guidelines outlined [here](https://nih.sharepoint.com/sites/NCI-CCR-CCBR-NIDAP/SitePages/R-Package-Coding-Style-and-Best-Practices.aspx). +- **Important:** Don't restyle code unrelated to your PR + +**Tools to help:** +- Use the [styler](https://CRAN.R-project.org/package=styler) package to apply these styles + + + **Key conventions from the [tidyverse style guide](https://style.tidyverse.org):** + + | Element | Style | Example | + |---------|-------|----------| + | Variables | snake_case | `my_variable` | + | Functions | verbs in camelCase | `processData()` | + | Assignment | `<-` operator | `x <- 5` | + | Operations | pipes | `data %>% filter() %>% mutate()` | + +
    + +### **Function Organization** + +**Structure your functions like this:** + +Functions should follow this template. Use [roxygen2](https://cran.r-project.org/package=roxygen2) for documentation: + +```r +#' @title Function Title +#' @description Brief description of what the function does +#' @param param1 Description of first parameter +#' @param param2 Description of second parameter +#' @details Additional details if needed +#' @importFrom package function_name +#' @export +#' @return Description of what the function returns + +yourFunction <- function(param1, param2) { + + ## --------- ## + ## Functions ## + ## --------- ## + + ## --------------- ## + ## Main Code Block ## + ## --------------- ## + + output_list <- list( + object = SeuratObject, + plots = list( + 'plotTitle1' = p1, + 'plotTitle2' = p2 + ), + data = list( + 'dataframeTitle' = df1 + ) + ) + + return(output_list) +} +``` +
    + + +## **Commit and Push Your Changes** {#commit-push} + + + +**Best practices for commits:** + +We recommend following the **"atomic commits"** principle where each commit contains one new feature, fix, or task. + +**Learn more:** [Atomic Commits Guide](https://www.freshconsulting.com/insights/blog/atomic-commits/) + +
    + +## **Step-by-Step Process:** + + +### 1️⃣ **Check Status** +Check the current state of your Git working directory and staging area: + +```sh + git status +``` + +### 2️⃣ **Stage Files** +Add the files that you changed to the staging area: + +```sh + git add path/to/changed/files/ +``` + +### 3️⃣ **Make the Commit** + +```sh + git commit -m 'feat: create function for awesome feature' +``` + +Your commit message should follow the +[Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) +specification. +Briefly, each commit should start with one of the approved types such as +`feat`, `fix`, `docs`, etc. followed by a description of the commit. +Take a look at the [Conventional Commits specification](https://www.conventionalcommits.org/en/v1.0.0/#summary) +for more detailed information about how to write commit messages. + + + +### 4️⃣ **Push your changes to GitHub:** + + ```sh + git push + ``` + +If this is the first time you are pushing this branch, you may have to +explicitly set the upstream branch: + + ```sh + git push --set-upstream origin iss-10 + ``` + +We recommend pushing your commits often so they will be backed up on GitHub. +You can view the files in your branch on GitHub at +`https://github.com/NIDAP-Community/SCWorkflow/tree/` +(replace `` with the actual name of your branch). + +

    + + +# Document and Tests {#docs-tests} + +--- + +## **Writing Tests** + +**Why tests matter:** Most changes to the code will also need unit tests to demonstrate that the changes work as intended. + +**How to add tests:** + +1. Use [`testthat`](https://testthat.r-lib.org/) to create your unit tests +2. Follow the organization described in the [tidyverse test style guide](https://style.tidyverse.org/tests.html) +3. Look at existing code in this package for examples + +
    + +## **Documentation** + +**When to update documentation:** + +- Written a new function +- Changed the API of an existing function +- Function is used in a vignette + +**How to update documentation:** + +1. Use [roxygen2](https://cran.r-project.org/package=roxygen2) with [Markdown syntax](https://roxygen2.r-lib.org/articles/rd-formatting.html) +2. See the [R Packages book](https://r-pkgs.org/man.html) for detailed instructions +3. Update relevant vignettes if needed + +
    + +## **Check Your Work** {#check} + +🔍 **Final validation step:** + +After making your changes, run the following command from an R console to make sure the package still passes R CMD check: + +```r +devtools::check() +``` + +> **Goal:** All checks should pass with no errors, warnings, or notes. + +

    + +# **Deploy Feature** {#deploy-feature} + +--- + +## 1️⃣ **Create the PR** + + Once your branch is ready, create a PR on GitHub: + + + Select the branch you just pushed: + + ![Create a new PR from your branch](https://raw.githubusercontent.com/CCBR/CCBR_NextflowTemplate/main/.github/img/new-PR.png) + + Edit the PR title and description. + The title should briefly describe the change. + Follow the comments in the template to fill out the body of the PR, and + you can delete the comments (everything between ``) as you go. + When you're ready, click 'Create pull request' to open it. + + ![Open the PR after editing the title and description](https://raw.githubusercontent.com/CCBR/CCBR_NextflowTemplate/main/.github/img/create-PR.png) + + Optionally, you can mark the PR as a draft if you're not yet ready for it to + be reviewed, then change it later when you're ready. + +## 2️⃣ **Wait for a maintainer to review your PR** + + + We will do our best to follow the tidyverse code review principles: + . + The reviewer may suggest that you make changes before accepting your PR in + order to improve the code quality or style. + If that's the case, continue to make changes in your branch and push them to + GitHub, and they will appear in the PR. + + Once the PR is approved, the maintainer will merge it and the issue(s) the PR + links will close automatically. + Congratulations and thank you for your contribution! + +## 3️⃣ **After your PR has been merged** + + After your PR has been merged, update your local clone of the repo by + switching to the DEV branch and pulling the latest changes: + +```sh + git checkout DEV + git pull +``` + + It's a good idea to run `git pull` before creating a new branch so it will + start from the most recent commits in main. + +

    + +# **Helpful links for more information** + +- This contributing guide was adapted from the [tidyverse contributing guide](https://github.com/tidyverse/tidyverse/blob/main/.github/CONTRIBUTING.md) +- [GitHub Flow](https://docs.github.com/en/get-started/using-github/github-flow) +- [tidyverse style guide](https://style.tidyverse.org) +- [tidyverse code review principles](https://code-review.tidyverse.org) +- [reproducible examples](https://www.tidyverse.org/help/#reprex) +- [R packages book](https://r-pkgs.org/) +- packages: + - [usethis](https://usethis.r-lib.org/) + - [devtools](https://devtools.r-lib.org/) + - [testthat](https://testthat.r-lib.org/) + - [styler](https://styler.r-lib.org/) + - [roxygen2](https://roxygen2.r-lib.org) diff --git a/vignettes/Getting Started and Quality Control.html b/vignettes/Getting Started and Quality Control.html new file mode 100644 index 0000000..2f3b831 --- /dev/null +++ b/vignettes/Getting Started and Quality Control.html @@ -0,0 +1,655 @@ + + + + + + + + + + + + +Getting Started and Quality Control + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Getting Started and Quality Control

    + + + +
    # install.packages("remotes")
    +# remotes::install_github("NIDAP-Community/SCWorkflow", dependencies = TRUE)
    +
    +library(SCWorkflow)
    +
    +

    Process Input Data

    +

    This package is designed to work with the general Seurat Workflow[1]. +To begin using the SCWorkflow tools you will have to process the h5 +files generated by the Cell Ranger[Reference] software from the 10x +genomics platform to create a list of Seurat Objects corresponding to +each h5 file. A Seurat Object is the basic data structure for Seurat +Single Cell analysis

    +

    This tool supports standard scRNAseq, CITE-Seq, and TCR-Seq assays. +Samples prepared with a cell hashing protocol (HTOs) can also be +processed to produce a Seurat Object split by the corresponding +experimental design strategy. h5 files containing multiple samples can +also be processed to create Seurat objects that will be split based on +the values in the orig.ident column.

    +

    A corresponding Metadata table can be used to add sample level +information to the Seurat object. The table format should have Sample +names in the first Column and any sample metadata in additional columns. +The Metadata table can also be used to rename samples by including an +alternative sample name Column in the metadata table.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Sample_NameRenameTreatment
    SCAF1713_1_1PBSWT
    SCAF1714_2_1ENTEntinostat
    SCAF1715_3_1NHSIL12NHS-IL12
    SCAF1716_4_1ComboEntinostat + NHS-IL12
    SCAF1717_5_1CD8depEntinostat + NHS-IL12
    +

    Samples can also be excluded from the final Seurat object using a +REGEX strategy to identify the samples to be included/excluded. explain +based on newnames

    +

    The final Seurat Object will contain an assay slot with log2 +normalized counts. QC figures for individual samples will also be +produced to help evaluate samples quality.

    +
    
    +SampleMetadataTable <- read.table(file = "./images/Sample_Metadata.txt",  sep = '\t',header = T)
    +files=list.files(path="../tests/testthat/fixtures/Chariou/h5files",full.names = T)
    +
    +SOlist=processRawData(input=files,
    +               organism="Mouse",
    +               sample.metadata.table=SampleMetadataTable,
    +               sample.name.column='Sample_Name',
    +               rename.col='Rename',
    +               keep=T,
    +               file.filter.regex=c(),
    +               split.h5=F,
    +               cell.hash=F,
    +               do.normalize.data=T                
    +)
    +

    +
      +
    1. Hao Y et al. Integrated analysis of multimodal single-cell data. +Cell. 2021 Jun 24;184(13):3573-3587.e29. doi: +10.1016/j.cell.2021.04.048. Epub 2021 May 31. PMID: 34062119; PMCID: +PMC8238499.
    2. +
    +
    +
    +

    Filter Low Quality Cells

    +

    This function will filter genes and cells based on multiple metrics +available in the Seurat Object metadata slot. A detailed guide for +single cell quality filtering can be found from Xi and Li, 2021 [2]. +First, genes can be filtered by setting the minimum number of cells +needed to keep a gene or removing VDJ Add descriptiopn of VDJ genes. +Next, cells can be filtered by setting thresholds for each individual +metric. Cells that do not meet any of the designated criteria will be +removed from the final filtered Seurat Object . Filter limits can be set +by using absolute values or median absolute deviations (MADs) for each +criteria. If both absolute and MAD values are set for a single filter, +the least extreme value (i.e. the lowest value for upper limits or the +highest value for lower limits) will be selected. The filter values used +for each metric will be printed in the log output. All filters have +default values and can be turned off by setting limits to NA.

    +

    The individual filtering criteria used in this tool are listed +below.

    +
      +
    1. The total number of molecules detected within each cell +(nCount_RNA)
    2. +
    3. The number of genes detected in each cell (nFeature_RNA)
    4. +
    5. The complexity of of genes ( +log10(nFeature_RNA)/log10(nCount_RNA)
    6. +
    7. Percent of mitochondrial Genes
    8. +
    9. Percent counts in top 20 Genes
    10. +
    11. Doublets calculated by scDblFinder (using package default +parameters) [3]
    12. +
    +

    The function will return a filtered Seurat Object and various figures +showing metrics before and after filtering. These figures can be used to +help evaluate the effects of filtering criteria and whether filtering +limits need to be adjusted.

    +
    
    +SO_filtered=filterQC(object=SOlist$object,
    +                     ## Filter Genes
    +                     min.cells = 20,
    +                     filter.vdj.genes=F,
    +                     
    +                     ## Filter Cells
    +                     nfeature.limits=c(NA,NA),
    +                     mad.nfeature.limits=c(5,5),
    +                     ncounts.limits=c(NA,NA),
    +                     mad.ncounts.limits=c(5,5),
    +                     mitoch.limits = c(NA,25),
    +                     mad.mitoch.limits = c(NA,3),
    +                     complexity.limits = c(NA,NA),
    +                     mad.complexity.limits = c(5,NA),
    +                     topNgenes.limits = c(NA,NA),
    +                     mad.topNgenes.limits = c(5,5),
    +                     n.topgnes=20,
    +                     do.doublets.fitler=T
    +                                 
    +            )
    +

    +

    +
      +
    1. Heumos, L., Schaar, A.C., Lance, C. et al. Best practices for +single-cell analysis across modalities. Nat Rev Genet (2023). https://doi.org/10.1038/s41576-023-00586-w

    2. +
    3. Germain P, Lun A, Macnair W, Robinson M (2021). “Doublet +identification in single-cell sequencing data using scDblFinder.” +f1000research. doi:10.12688/f1000research.73600.1.

    4. +
    +
    +
    +

    Combine, Normalize, and Cluster Data

    +

    This functions combines multiple sample level Seurat Objects into a +single Seurat Object and normalizes the combined dataset. The +multi-dimensionality of the data will be summarized into a set of +“principal components” and visualized in both UMAP and tSNE projections. +A graph-based clustering approach will identify cell clusters with in +the data.

    +
    
    +Comb_SO=combineNormalize(
    +                         object=SO_filtered$object,
    +                     # Nomralization variables
    +                         npcs = 21,
    +                         SCT.level="Merged",
    +                         vars.to.regress = c("percent.mt"),
    +                     # FindVariableFeatures
    +                         nfeatures = 2000,
    +                         low.cut = 0.1,
    +                         high.cut = 8,
    +                         low.cut.disp = 1,
    +                         high.cut.disp = 100000,
    +                         selection.method = 'vst',
    +                     # Dim Reduction
    +                         only.var.genes = FALSE,
    +                         draw.umap = TRUE,
    +                         draw.tsne = TRUE,
    +                         seed.for.pca = 42,
    +                         seed.for.tsne = 1,
    +                         seed.for.umap = 42,
    +                    # Clustering Varables
    +                         clust.res.low = 0.2,
    +                         clust.res.high = 1.2,
    +                         clust.res.bin = 0.2,
    +                    # Select PCs
    +                         methods.pca = NULL,
    +                         var.threshold = 0.1,
    +                         pca.reg.plot = FALSE,
    +                         jackstraw = FALSE,
    +                         jackstraw.dims=5,
    +                    # Other                         
    +                         exclude.sample = NULL,
    +                         cell.count.limit= 35000,
    +                         reduce.so = FALSE,
    +                         project.name = 'scRNAProject',
    +                         cell.hashing.data = FALSE
    +)
    +

    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/vignettes/Getting Started and Quality Control_files/MathJax.js b/vignettes/Getting Started and Quality Control_files/MathJax.js new file mode 100644 index 0000000..e844af1 --- /dev/null +++ b/vignettes/Getting Started and Quality Control_files/MathJax.js @@ -0,0 +1,19 @@ +/* + * /MathJax.js + * + * Copyright (c) 2009-2018 The MathJax Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +if(document.getElementById&&document.childNodes&&document.createElement){if(!(window.MathJax&&MathJax.Hub)){if(window.MathJax){window.MathJax={AuthorConfig:window.MathJax}}else{window.MathJax={}}MathJax.isPacked=true;MathJax.version="2.7.9";MathJax.fileversion="2.7.9";MathJax.cdnVersion="2.7.9";MathJax.cdnFileVersions={};(function(d){var b=window[d];if(!b){b=window[d]={}}var e=[];var c=function(f){var g=f.constructor;if(!g){g=function(){}}for(var h in f){if(h!=="constructor"&&f.hasOwnProperty(h)){g[h]=f[h]}}return g};var a=function(){return function(){return arguments.callee.Init.call(this,arguments)}};b.Object=c({constructor:a(),Subclass:function(f,h){var g=a();g.SUPER=this;g.Init=this.Init;g.Subclass=this.Subclass;g.Augment=this.Augment;g.protoFunction=this.protoFunction;g.can=this.can;g.has=this.has;g.isa=this.isa;g.prototype=new this(e);g.prototype.constructor=g;g.Augment(f,h);return g},Init:function(f){var g=this;if(f.length===1&&f[0]===e){return g}if(!(g instanceof f.callee)){g=new f.callee(e)}return g.Init.apply(g,f)||g},Augment:function(f,g){var h;if(f!=null){for(h in f){if(f.hasOwnProperty(h)){this.protoFunction(h,f[h])}}if(f.toString!==this.prototype.toString&&f.toString!=={}.toString){this.protoFunction("toString",f.toString)}}if(g!=null){for(h in g){if(g.hasOwnProperty(h)){this[h]=g[h]}}}return this},protoFunction:function(g,f){this.prototype[g]=f;if(typeof f==="function"){f.SUPER=this.SUPER.prototype}},prototype:{Init:function(){},SUPER:function(f){return f.callee.SUPER},can:function(f){return typeof(this[f])==="function"},has:function(f){return typeof(this[f])!=="undefined"},isa:function(f){return(f instanceof Object)&&(this instanceof f)}},can:function(f){return this.prototype.can.call(this,f)},has:function(f){return this.prototype.has.call(this,f)},isa:function(g){var f=this;while(f){if(f===g){return true}else{f=f.SUPER}}return false},SimpleSUPER:c({constructor:function(f){return this.SimpleSUPER.define(f)},define:function(f){var h={};if(f!=null){for(var g in f){if(f.hasOwnProperty(g)){h[g]=this.wrap(g,f[g])}}if(f.toString!==this.prototype.toString&&f.toString!=={}.toString){h.toString=this.wrap("toString",f.toString)}}return h},wrap:function(i,h){if(typeof(h)!=="function"||!h.toString().match(/\.\s*SUPER\s*\(/)){return h}var g=function(){this.SUPER=g.SUPER[i];try{var f=h.apply(this,arguments)}catch(j){delete this.SUPER;throw j}delete this.SUPER;return f};g.toString=function(){return h.toString.apply(h,arguments)};return g}})});b.Object.isArray=Array.isArray||function(f){return Object.prototype.toString.call(f)==="[object Array]"};b.Object.Array=Array})("MathJax");(function(BASENAME){var BASE=window[BASENAME];if(!BASE){BASE=window[BASENAME]={}}var isArray=BASE.Object.isArray;var CALLBACK=function(data){var cb=function(){return arguments.callee.execute.apply(arguments.callee,arguments)};for(var id in CALLBACK.prototype){if(CALLBACK.prototype.hasOwnProperty(id)){if(typeof(data[id])!=="undefined"){cb[id]=data[id]}else{cb[id]=CALLBACK.prototype[id]}}}cb.toString=CALLBACK.prototype.toString;return cb};CALLBACK.prototype={isCallback:true,hook:function(){},data:[],object:window,execute:function(){if(!this.called||this.autoReset){this.called=!this.autoReset;return this.hook.apply(this.object,this.data.concat([].slice.call(arguments,0)))}},reset:function(){delete this.called},toString:function(){return this.hook.toString.apply(this.hook,arguments)}};var ISCALLBACK=function(f){return(typeof(f)==="function"&&f.isCallback)};var EVAL=function(code){return eval.call(window,code)};var TESTEVAL=function(){EVAL("var __TeSt_VaR__ = 1");if(window.__TeSt_VaR__){try{delete window.__TeSt_VaR__}catch(error){window.__TeSt_VaR__=null}}else{if(window.execScript){EVAL=function(code){BASE.__code=code;code="try {"+BASENAME+".__result = eval("+BASENAME+".__code)} catch(err) {"+BASENAME+".__result = err}";window.execScript(code);var result=BASE.__result;delete BASE.__result;delete BASE.__code;if(result instanceof Error){throw result}return result}}else{EVAL=function(code){BASE.__code=code;code="try {"+BASENAME+".__result = eval("+BASENAME+".__code)} catch(err) {"+BASENAME+".__result = err}";var head=(document.getElementsByTagName("head"))[0];if(!head){head=document.body}var script=document.createElement("script");script.appendChild(document.createTextNode(code));head.appendChild(script);head.removeChild(script);var result=BASE.__result;delete BASE.__result;delete BASE.__code;if(result instanceof Error){throw result}return result}}}TESTEVAL=null};var USING=function(args,i){if(arguments.length>1){if(arguments.length===2&&!(typeof arguments[0]==="function")&&arguments[0] instanceof Object&&typeof arguments[1]==="number"){args=[].slice.call(args,i)}else{args=[].slice.call(arguments,0)}}if(isArray(args)&&args.length===1&&typeof(args[0])==="function"){args=args[0]}if(typeof args==="function"){if(args.execute===CALLBACK.prototype.execute){return args}return CALLBACK({hook:args})}else{if(isArray(args)){if(typeof(args[0])==="string"&&args[1] instanceof Object&&typeof args[1][args[0]]==="function"){return CALLBACK({hook:args[1][args[0]],object:args[1],data:args.slice(2)})}else{if(typeof args[0]==="function"){return CALLBACK({hook:args[0],data:args.slice(1)})}else{if(typeof args[1]==="function"){return CALLBACK({hook:args[1],object:args[0],data:args.slice(2)})}}}}else{if(typeof(args)==="string"){if(TESTEVAL){TESTEVAL()}return CALLBACK({hook:EVAL,data:[args]})}else{if(args instanceof Object){return CALLBACK(args)}else{if(typeof(args)==="undefined"){return CALLBACK({})}}}}}throw Error("Can't make callback from given data")};var DELAY=function(time,callback){callback=USING(callback);callback.timeout=setTimeout(callback,time);return callback};var WAITFOR=function(callback,signal){callback=USING(callback);if(!callback.called){WAITSIGNAL(callback,signal);signal.pending++}};var WAITEXECUTE=function(){var signals=this.signal;delete this.signal;this.execute=this.oldExecute;delete this.oldExecute;var result=this.execute.apply(this,arguments);if(ISCALLBACK(result)&&!result.called){WAITSIGNAL(result,signals)}else{for(var i=0,m=signals.length;i0&&priority=0;i--){this.hooks.splice(i,1)}this.remove=[]}});var EXECUTEHOOKS=function(hooks,data,reset){if(!hooks){return null}if(!isArray(hooks)){hooks=[hooks]}if(!isArray(data)){data=(data==null?[]:[data])}var handler=HOOKS(reset);for(var i=0,m=hooks.length;ig){g=document.styleSheets.length}if(!i){i=document.head||((document.getElementsByTagName("head"))[0]);if(!i){i=document.body}}return i};var f=[];var c=function(){for(var k=0,j=f.length;k=this.timeout){i(this.STATUS.ERROR);return 1}return 0},file:function(j,i){if(i<0){a.Ajax.loadTimeout(j)}else{a.Ajax.loadComplete(j)}},execute:function(){this.hook.call(this.object,this,this.data[0],this.data[1])},checkSafari2:function(i,j,k){if(i.time(k)){return}if(document.styleSheets.length>j&&document.styleSheets[j].cssRules&&document.styleSheets[j].cssRules.length){k(i.STATUS.OK)}else{setTimeout(i,i.delay)}},checkLength:function(i,l,n){if(i.time(n)){return}var m=0;var j=(l.sheet||l.styleSheet);try{if((j.cssRules||j.rules||[]).length>0){m=1}}catch(k){if(k.message.match(/protected variable|restricted URI/)){m=1}else{if(k.message.match(/Security error/)){m=1}}}if(m){setTimeout(a.Callback([n,i.STATUS.OK]),0)}else{setTimeout(i,i.delay)}}},loadComplete:function(i){i=this.fileURL(i);var j=this.loading[i];if(j&&!j.preloaded){a.Message.Clear(j.message);clearTimeout(j.timeout);if(j.script){if(f.length===0){setTimeout(c,0)}f.push(j.script)}this.loaded[i]=j.status;delete this.loading[i];this.addHook(i,j.callback)}else{if(j){delete this.loading[i]}this.loaded[i]=this.STATUS.OK;j={status:this.STATUS.OK}}if(!this.loadHooks[i]){return null}return this.loadHooks[i].Execute(j.status)},loadTimeout:function(i){if(this.loading[i].timeout){clearTimeout(this.loading[i].timeout)}this.loading[i].status=this.STATUS.ERROR;this.loadError(i);this.loadComplete(i)},loadError:function(i){a.Message.Set(["LoadFailed","File failed to load: %1",i],null,2000);a.Hub.signal.Post(["file load error",i])},Styles:function(k,l){var i=this.StyleString(k);if(i===""){l=a.Callback(l);l()}else{var j=document.createElement("style");j.type="text/css";this.head=h(this.head);this.head.appendChild(j);if(j.styleSheet&&typeof(j.styleSheet.cssText)!=="undefined"){j.styleSheet.cssText=i}else{j.appendChild(document.createTextNode(i))}l=this.timer.create.call(this,l,j)}return l},StyleString:function(n){if(typeof(n)==="string"){return n}var k="",o,m;for(o in n){if(n.hasOwnProperty(o)){if(typeof n[o]==="string"){k+=o+" {"+n[o]+"}\n"}else{if(a.Object.isArray(n[o])){for(var l=0;l="0"&&q<="9"){f[j]=p[f[j]-1];if(typeof f[j]==="number"){f[j]=this.number(f[j])}}else{if(q==="{"){q=f[j].substr(1);if(q>="0"&&q<="9"){f[j]=p[f[j].substr(1,f[j].length-2)-1];if(typeof f[j]==="number"){f[j]=this.number(f[j])}}else{var k=f[j].match(/^\{([a-z]+):%(\d+)\|(.*)\}$/);if(k){if(k[1]==="plural"){var d=p[k[2]-1];if(typeof d==="undefined"){f[j]="???"}else{d=this.plural(d)-1;var h=k[3].replace(/(^|[^%])(%%)*%\|/g,"$1$2%\uEFEF").split(/\|/);if(d>=0&&d=3){c.push([f[0],f[1],this.processSnippet(g,f[2])])}else{c.push(e[d])}}}}else{c.push(e[d])}}return c},markdownPattern:/(%.)|(\*{1,3})((?:%.|.)+?)\2|(`+)((?:%.|.)+?)\4|\[((?:%.|.)+?)\]\(([^\s\)]+)\)/,processMarkdown:function(b,h,d){var j=[],e;var c=b.split(this.markdownPattern);var g=c[0];for(var f=1,a=c.length;f1?d[1]:""));f=null}if(e&&(!b.preJax||d)){c.nodeValue=c.nodeValue.replace(b.postJax,(e.length>1?e[1]:""))}if(f&&!f.nodeValue.match(/\S/)){f=f.previousSibling}}if(b.preRemoveClass&&f&&f.className===b.preRemoveClass){a.MathJax.preview=f}a.MathJax.checked=1},processInput:function(a){var b,i=MathJax.ElementJax.STATE;var h,e,d=a.scripts.length;try{while(a.ithis.processUpdateTime&&a.i1){d.jax[a.outputJax].push(b)}b.MathJax.state=c.OUTPUT},prepareOutput:function(c,f){while(c.jthis.processUpdateTime&&h.i=0;q--){if((b[q].src||"").match(f)){s.script=b[q].innerHTML;if(RegExp.$2){var t=RegExp.$2.substr(1).split(/\&/);for(var p=0,l=t.length;p=parseInt(y[z])}}return true},Select:function(j){var i=j[d.Browser];if(i){return i(d.Browser)}return null}};var e=k.replace(/^Mozilla\/(\d+\.)+\d+ /,"").replace(/[a-z][-a-z0-9._: ]+\/\d+[^ ]*-[^ ]*\.([a-z][a-z])?\d+ /i,"").replace(/Gentoo |Ubuntu\/(\d+\.)*\d+ (\([^)]*\) )?/,"");d.Browser=d.Insert(d.Insert(new String("Unknown"),{version:"0.0"}),a);for(var v in a){if(a.hasOwnProperty(v)){if(a[v]&&v.substr(0,2)==="is"){v=v.slice(2);if(v==="Mac"||v==="PC"){continue}d.Browser=d.Insert(new String(v),a);var r=new RegExp(".*(Version/| Trident/.*; rv:)((?:\\d+\\.)+\\d+)|.*("+v+")"+(v=="MSIE"?" ":"/")+"((?:\\d+\\.)*\\d+)|(?:^|\\(| )([a-z][-a-z0-9._: ]+|(?:Apple)?WebKit)/((?:\\d+\\.)+\\d+)");var u=r.exec(e)||["","","","unknown","0.0"];d.Browser.name=(u[1]!=""?v:(u[3]||u[5]));d.Browser.version=u[2]||u[4]||u[6];break}}}try{d.Browser.Select({Safari:function(j){var i=parseInt((String(j.version).split("."))[0]);if(i>85){j.webkit=j.version}if(i>=538){j.version="8.0"}else{if(i>=537){j.version="7.0"}else{if(i>=536){j.version="6.0"}else{if(i>=534){j.version="5.1"}else{if(i>=533){j.version="5.0"}else{if(i>=526){j.version="4.0"}else{if(i>=525){j.version="3.1"}else{if(i>500){j.version="3.0"}else{if(i>400){j.version="2.0"}else{if(i>85){j.version="1.0"}}}}}}}}}}j.webkit=(navigator.appVersion.match(/WebKit\/(\d+)\./))[1];j.isMobile=(navigator.appVersion.match(/Mobile/i)!=null);j.noContextMenu=j.isMobile},Firefox:function(j){if((j.version==="0.0"||k.match(/Firefox/)==null)&&navigator.product==="Gecko"){var m=k.match(/[\/ ]rv:(\d+\.\d.*?)[\) ]/);if(m){j.version=m[1]}else{var i=(navigator.buildID||navigator.productSub||"0").substr(0,8);if(i>="20111220"){j.version="9.0"}else{if(i>="20111120"){j.version="8.0"}else{if(i>="20110927"){j.version="7.0"}else{if(i>="20110816"){j.version="6.0"}else{if(i>="20110621"){j.version="5.0"}else{if(i>="20110320"){j.version="4.0"}else{if(i>="20100121"){j.version="3.6"}else{if(i>="20090630"){j.version="3.5"}else{if(i>="20080617"){j.version="3.0"}else{if(i>="20061024"){j.version="2.0"}}}}}}}}}}}}j.isMobile=(navigator.appVersion.match(/Android/i)!=null||k.match(/ Fennec\//)!=null||k.match(/Mobile/)!=null)},Chrome:function(i){i.noContextMenu=i.isMobile=!!navigator.userAgent.match(/ Mobile[ \/]/)},Opera:function(i){i.version=opera.version()},Edge:function(i){i.isMobile=!!navigator.userAgent.match(/ Phone/)},MSIE:function(j){j.isMobile=!!navigator.userAgent.match(/ Phone/);j.isIE9=!!(document.documentMode&&(window.performance||window.msPerformance));MathJax.HTML.setScriptBug=!j.isIE9||document.documentMode<9;MathJax.Hub.msieHTMLCollectionBug=(document.documentMode<9);if(document.documentMode<10&&!s.params.NoMathPlayer){try{new ActiveXObject("MathPlayer.Factory.1");j.hasMathPlayer=true}catch(m){}try{if(j.hasMathPlayer){var i=document.createElement("object");i.id="mathplayer";i.classid="clsid:32F66A20-7614-11D4-BD11-00104BD3F987";g.appendChild(i);document.namespaces.add("m","http://www.w3.org/1998/Math/MathML");j.mpNamespace=true;if(document.readyState&&(document.readyState==="loading"||document.readyState==="interactive")){document.write('');j.mpImported=true}}else{document.namespaces.add("mjx_IE_fix","http://www.w3.org/1999/xlink")}}catch(m){}}}})}catch(c){console.error(c.message)}d.Browser.Select(MathJax.Message.browsers);if(h.AuthorConfig&&typeof h.AuthorConfig.AuthorInit==="function"){h.AuthorConfig.AuthorInit()}d.queue=h.Callback.Queue();d.queue.Push(["Post",s.signal,"Begin"],["Config",s],["Cookie",s],["Styles",s],["Message",s],function(){var i=h.Callback.Queue(s.Jax(),s.Extensions());return i.Push({})},["Menu",s],s.onLoad(),function(){MathJax.isReady=true},["Typeset",s],["Hash",s],["MenuZoom",s],["Post",s.signal,"End"])})("MathJax")}}; diff --git a/vignettes/README.Rmd b/vignettes/README.Rmd new file mode 100644 index 0000000..c90846b --- /dev/null +++ b/vignettes/README.Rmd @@ -0,0 +1,95 @@ + +--- +output: github_document + +--- + + + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>", + fig.path = "man/figures/README-", + out.width = "100%" +) +``` + +# SCWorkflow + +The CCBR Single-cell RNA-seq Package (SCWorkflow) allows users to analyze their own single-cell RNA-seq datasets starting from CellRanger output files (H5 or mtx files, etc.). + + + +## Installation + +--- + +You can install the SCWorkflow package from [GitHub](https://github.com/NIDAP-Community/SCWorkflow) with: + +```r +# install.packages("remotes") +remotes::install_github("NIDAP-Community/SCWorkflow", dependencies = TRUE) +``` + + + +There is also a Docker container available at + +```sh + +``` + + +## Usage + +--- + +Following this workflow you can perform these steps of a single-cell RNA-seq analysis, and more: + +- Quality Control: + + - Import, Select, & Rename Samples + + - Filter Cells based on QC metrics + + - Combine Samples, Cluster, and Normalize your Data + + - Batch Correction using Harmony + +- Cell Annotation: + + - SingleR Automated Annotations + + - Module Scores + + - Co-Expression + + - External Annotations + +- Visualizations: + + - Dimensionality Reductions (t-SNE and UMAP Plots) colored by Marker Expression or by Metadata + + - Heatmaps + + - Violin Plots + + - Trajectory + +- Differential Expression Analysis + + - Seurat's FindMarkers() + + - Pseudobulk Aggregation + + - Pathway Analysis + + + +Please see the [introductory vignette](https://ccbr.github.io/SCWorkflow/articles/intro.html) +for a quick start tutorial. +Take a look at the [reference documentation](https://ccbr.github.io/SCWorkflow/reference/index.html) +for detailed information on each function in the package. + + diff --git a/vignettes/SCWorkflow-Annotations.Rmd b/vignettes/SCWorkflow-Annotations.Rmd new file mode 100644 index 0000000..980a63b --- /dev/null +++ b/vignettes/SCWorkflow-Annotations.Rmd @@ -0,0 +1,516 @@ +--- +title: "Annotations" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{SCWorkflow-Annotations} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} + +--- + + +```{r, include = FALSE} +options(rmarkdown.html_vignette.check_title = FALSE) + +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>", + warning = FALSE, message = FALSE +) + +library(data.table) +library(dplyr) +library(ggplot2) +library(tibble) + +run_Chunks=FALSE +``` + +```{r,include=F,echo=F,eval=run_Chunks} +Comb_SO=list() +Comb_SO$object=readRDS("./images/CN_SO.rds") + +``` + +
    + +## Cell Type Annotation with SingleR + +--- + +This function automates cell type annotation in single-cell RNA sequencing data by employing the *SingleR* [1] method, which allocates labels to cells within a dataset according to their gene expression profile similarities with a reference dataset containing cell type labeled samples + +SingleR is an automatic annotation method for single-cell RNA sequencing data that uses a given reference dataset of samples (single-cell or bulk) with known labels to label new cells from a test dataset based on similarity to the reference. Two mouse reference datasets (MouseRNAseqData and ImmGenData) and two human reference datasets (HumanPrimaryCellAtlasData and BlueprintEncodeData) from CellDex R package [2] are currently available. + + +```{r,eval=run_Chunks} + +Anno_SO=annotateCellTypes(object=Comb_SO$object, + species = "Mouse", + reduction.type = "umap", + legend.dot.size = 2, + do.finetuning = FALSE, + local.celldex = NULL, + use.clusters = NULL + ) + +``` + + +```{r,echo=F,eval=run_Chunks} +saveRDS(Anno_SO, file="./images/Anno_SO.rds") + +ggsave(Anno_SO$plots$p1, filename = "./images/Anno1.png", width = 10, height = 10) +ggsave(Anno_SO$plots$p2, filename = "./images/Anno2.png", width = 10, height = 10) + +``` + +![](./images/Anno1.png){width=300} ![](./images/Anno2.png){width=300} + + +
    + +## Add External Cell Annotations + +--- + +This function will merge an external table of cell annotations into an existing Seurat Object's metadata table. The input external metadata table must have a column named "Barcode" that contains barcodes matching those found in the metadata already present in the input Seurat Object. The output will be a new Seurat Object with metadata that now includes the additional columns from the external table. + + +```{r,eval=run_Chunks,echo=F} + +Anno_SO=readRDS("./images/Anno_SO.rds") + +Anno_SO$object@meta.data[,'mouseRNAseq_main',drop=F]%>%rename('Cell Type'=mouseRNAseq_main)%>%rownames_to_column('Barcode')%>% + head()%>%write.table(".images/PerCell_Metadata.csv",sep=",",row.names=F,quote=F) + + +``` + +```{r,eval=T,echo=T} + +CellType_Anno_Table=read.csv("./images/PerCell_Metadata.csv") + +``` + +```{r,eval=T,echo=F} +CellType_Anno_Table%>% + head()%>% + knitr::kable() +``` + +```{r eval=F,echo=F} + + +AddExternalAnnotation = function( + seurat_object = SingleRCellTypes_SO, + external_metadata = BRCA_Training_PerCell_Metadata, + seurat_object_filename = "seurat_object.rds", + barcode_column = "Barcode", + external_cols_to_add = c("Patient","Celltype_Major","Celltype_Minor","Celltype_Subset"), + col_to_viz = "Celltype_Major") { + +## --------- ## +## Libraries ## +## --------- ## + + +# Load necessary libraries +# library(nidapfunctions) +# nidapLoadPackages(c("SCWorkflow", "magrittr", "tibble", "dplyr", "Seurat")) + +## -------------------------------- ## +## User-Defined Template Parameters ## +## -------------------------------- ## + + +object <- SingleRCellTypes_SO +external_metadata <- BRCA_Training_PerCell_Metadata +seurat_object_filename <- "seurat_object.rds" +barcode_column = "Barcode" +external_cols_to_add = c("Patient","Celltype_Major","Celltype_Minor","Celltype_Subset") +col_to_viz = "Celltype_Major" + +## -------------------------------- ## +## Errors ## +## -------------------------------- ## + + +## -------------------------------- ## +## functions ## +## -------------------------------- ## + + +## --------------- ## +## Main Code Block ## +## --------------- ## + + +# Load Seurat Object +cat(sprintf("\nReading Seurat Object from dataset: %s\n\n", paste(seurat_object_filename, collapse = ", "))) +path <- nidapGetPath(seurat_object, seurat_object_filename) +so <- readRDS(path) +print(so) + +# Extract meta.data from Seurat Object +cat("Extracting Metadata Table from Seurat Object\n\n") +if ("meta.data" %in% slotNames(so)) { + met.df <- so@meta.data +} else if ("RNA" %in% slotNames(so)) { + met.df <- so$RNA@meta.data +} else { + stop("No recognizable meta.data found in the Seurat object.") +} + +# If no "Barcode" column exists, create it from rownames +if (!("Barcode" %in% colnames(met.df))) { + met.df <- met.df %>% rownames_to_column("Barcode") +} + +# Check if the user-specified barcode column exists +if (!(barcode_column %in% colnames(external_metadata))) { + stop(paste("External metadata does not have the specified barcode column:", barcode_column)) +} + +# Parse external columns to add +if (!is.null(external_cols_to_add)) { + cols_to_import <- trimws(unlist(strsplit(external_cols_to_add, ","))) + + # Always include Barcode in the subset + cols_to_keep <- unique(c(barcode_column, cols_to_import)) + + # Ensure all requested columns exist in external_metadata + missing_cols <- setdiff(cols_to_keep, colnames(external_metadata)) + if (length(missing_cols) > 0) { + stop(paste("These columns were not found in external_metadata:", paste(missing_cols, collapse = ", "))) + } + + # Subset external_metadata to keep only the requested columns + external_metadata <- external_metadata[, cols_to_keep, drop = FALSE] +} + +# Merge the external metadata table with the Seurat object metadata by barcode +merged_metadata <- merge(met.df, external_metadata, by.x = "Barcode", by.y = barcode_column, all.x = TRUE) + +## troubleshooting, check if any NULL rows appear in merged meta + + +if (any(is.na(merged_metadata$Barcode))){ + stop("STOP: Metadata not correctly merged. NA's produced.") +} +if (nrow(met.df)!=nrow(merged_metadata)){ + stop("STOP: Metadata not correctly merged. Incorrect number of rows when merged.") +} +if(length(setdiff(met.df$Barcode, external_metadata[[barcode_column]]))>0){ + warning("Warning: Not all cells from the Seurat Object are in the External Metadata table.") +} +if(length(setdiff(external_metadata[[barcode_column]], met.df$Barcode))>0){ + warning("Warning: Some cells in the External Metadata are not found in the Seurat Object.") +} + +# Print or save the merged metadata for review +cat("Metadata successfully merged. Here is a preview:\n") +print(head(merged_metadata)) + +# Ensure that rownames in merged_metadata are barcodes, not numbers +merged_metadata=column_to_rownames(merged_metadata,'Barcode') + +# Update Seurat object with the new merged metadata +so <- AddMetaData(so, merged_metadata) + +# If col_to_viz isn't empty, print TSNE/UMAP colored by this column. +if(length(col_to_viz) != 0) { + print(DimPlot(so, group.by = col_to_viz, label = FALSE, reduction = 'umap'))# + NoLegend() + print(DimPlot(so, group.by = col_to_viz, label = FALSE, reduction = 'tsne'))# + NoLegend() +} + +output <- new.output() +output_fs <- output$fileSystem() +saveRDS(so, output_fs$get_path("seurat_object.rds", 'w')) + +return(NULL) + +} + + + +``` + +```{r,eval=run_Chunks,echo=T} + +ExtAnno_SO=ExternalAnnotation(object = Anno_SO$object, + external_metadata = CellType_Anno_Table, + seurat_object_filename = "seurat_object.rds", + barcode_column = "Barcode", + external_cols_to_add = c("Cell Type"), + col_to_viz = "Cell Type" + ) + +``` + +
    + +## Cell Annotation with Co-Expression + +--- + +This function will display co-expression of two chosen markers in your Seurat Object. It will then Create a metadata column containing annotations for cells that correspond to the marker expression thresholds you set. + +This function enables users to visualize the association between two selected genes or proteins according to their expression values in various samples. The association is plotted, and samples with values above or below a specified limit can be excluded. Users have the ability to customize the visualization, including the choice of visualization type, point size and shape, and transparency level. + +Furthermore, the tool allows for the application of filters to the data, setting thresholds, and providing annotations to notify users if cells meet the established thresholds. The visualization can be improved by omitting extreme values. The tool also facilitates the creation of a heatmap to represent the density distribution of cells and exhibit the raw gene/protein expression values. + +```{r,eval=run_Chunks,echo=T,results='hide'} +grep('Cd4',rownames(Anno_SO$object@assays$RNA),ignore.case = T,value=T) + +DLAnno_SO=dualLabeling(object = Anno_SO$object, + samples <- c("PBS","CD8dep","ENT","NHSIL12","Combo"), + marker.1="Nos2", + marker.2="Arg1", + marker.1.type = "SCT", + marker.2.type = "SCT", + data.reduction = "both", + point.size = 0.5, + point.shape = 16, + point.transparency = 0.5, + add.marker.thresholds = TRUE, + marker.1.threshold = 0.5, + marker.2.threshold = 0.5, + filter.data = TRUE, + marker.1.filter.direction = "greater than", + marker.2.filter.direction = "greater than", + apply.filter.1 = TRUE, + apply.filter.2 = TRUE, + filter.condition = TRUE, + parameter.name = "My_CoExp", + trim.marker.1 = FALSE, + trim.marker.2 = FALSE, + pre.scale.trim = 0.99, + display.unscaled.values = FALSE + ) + +plot(DLAnno_SO$plots$tsne) +plot(DLAnno_SO$plots$umap) +``` + +```{r,echo=F,eval=run_Chunks} +png(filename="./images/DL1.png") +plot(DLAnno_SO$plots$densityHM) +dev.off() +png(filename="./images/DL2.png") +plot(DLAnno_SO$plots$umap) +dev.off() + + +``` +![](./images/DL1.png){width=300} ![](./images/DL2.png){width=300} + +
    + +## Color by Gene Lists + +--- + +This function generates plots to visualize the expression of specific markers (genes) in single-cell RNA sequencing (scRNA-seq) data. Gene plots are generated in the same order as they appear in the input list (provided that they are present in the data). + +This function takes in a number of inputs to create detailed plots showing the activity of certain genes. You can customize these based on specific samples or genes of interest or point transparency. +The code has a built-in system to alert you if there are any issues with your chosen inputs. If a particular gene is missing, it will return an empty plot. If the gene is present, it will perform several steps to adjust the data for better visualization and analysis, such as normalizing the data and creating a reduction plot (a type of plot that helps visualize complex data). +The code also makes sure to display your chosen samples, creates a caption for the plot indicating which samples are shown, colors the points based on gene activity levels, and adjusts the plot's visual elements like transparency, size, and labels. +If you haven't selected specific samples, it will use all the available samples from your data. It also checks for the presence of your chosen genes in the data and processes them to ensure uniformity across different cell types. +The output of this function is a detailed figure showing the activity of chosen genes across different cell types. This is useful for identifying distinct groups of cells based on gene activity levels. + +```{r,eval=F} +Marker_Table <- read.csv("Marker_Table_demo.csv") +``` + +```{r,eval=run_Chunks,echo=F} +Marker_Table_demo <- read.csv("../tests/testthat/fixtures/Marker_Table_demo.csv") +Marker_Table_demo%>%head()%>% + knitr::kable() + +Marker_Table=Marker_Table_demo[1:4,] +``` + +```{r,eval=run_Chunks,echo=T,results='hide',fig.width=10,fig.asp=.9} + + colorByMarkerTable(object=Anno_SO$object, + samples.subset=c("PBS","ENT","NHSIL12", "Combo","CD8dep" ), + samples.to.display=c("PBS","ENT","NHSIL12", "Combo","CD8dep" ), + marker.table=Marker_Table, + cells.of.interest=c("Neutrophils","Macrophages","CD8_T" ), + protein.presence = FALSE, + assay = "SCT", + reduction.type = "umap", + point.transparency = 0.5, + point.shape = 16, + cite.seq = FALSE + ) + +``` + +```{r,echo=F,eval=F} +png(filename="./images/CBM1.png",width=1000,height=700) +FigOut +dev.off() + +``` + +![](./images/CBM1.png){width=600} + +
    + +## Module Score Cell Classification + +--- + +Screens data for cells based on user-specified cell markers. Outputs a seurat object with a metadata with averaged marker scores and annotated "Likely_CellType" column. + +This function can be used to quantify the expression of marker sets in each individual cell and (optionally) in a hierarchical manner, helping you identify different cell types and potential subpopulations. + +This function aids in identifying cell types based on average gene expression. It uses a feature of the Seurat software known as the AddModuleScore function. This function calculates the gene expression of specific sets and records them within a designated area of the Seurat object. The program then forecasts cell identities by comparing these recorded scores across various gene sets. You have the ability to adjust the identification process by designating cutoff points for a bimodal distribution in a parameter known as manual threshold. Any thresholds below this cutoff will not be considered during the identification process. + +**Inputs:** The program takes several inputs. These include the single-cell RNA sequencing (scRNA-seq) object, a selection of samples for analysis, a table of gene markers for different cell types, and optionally, a hierarchical table for directing the order of cell classification. +**Data Preparation:** The program prepares the scRNA-seq object, assigns names to the samples, and selects data based on your specified samples. +**Module Score Calculation:** The program calculates module scores, a measure of gene set activity or expression [3], for each cell type based on your provided marker table. +**Visualization:** Density distribution plots and colored reduction plots will be generated to help you visualize the module scores, their relationship with cell types, and sample identities. +**Thresholding:** Users can select threshold values to aid in the classification of cells. Cells with scores below your designated threshold will be labeled as "unknown". +Subclass Identification: If desired, the program can identify subclasses within cell types by further analyzing subpopulations. +**Updating Cell Type Labels:** The program appends a "Likely_CellType" column to the metadata of the scRNA-seq object, based on the results of the module score analysis. +**Output:** An updated scRNA-seq object with new cell type labels. + +```{r,eval=run_Chunks} + +MS_object=modScore(object=Anno_SO$object, + marker.table=Marker_Table, + use_columns = c("Neutrophils","Macrophages","CD8_T" ), + ms_threshold=c("Neutrophils .25","Macrophages .40","CD8_T .14"), + general.class=c("Neutrophils","Macrophages","CD8_T"), + multi.lvl = FALSE, + reduction = "umap", + nbins = 10, + gradient.ft.size = 6, + violin.ft.size = 6, + step.size = 0.1 + ) + +``` +![](./images/MS1.png){width=600} + +![](./images/MS2.png){width=300} ![](./images/MS3.png){width=300} + +
    + +## Rename Clusters by Cell Type + +--- + +This function creates a dot plot of Cell Types by Renamed Clusters and outputs a Seurat Object with a new metadata column containing these New Cluster Names. The Cell Types are often determined by looking at the Module Score Cell Classification calls made by the upstream Module Score Cell Classification (see MS_Celltype metadata column). + +You must provide a table with a column containing the unique Cluster IDs from an upstream clustering analysis (e.g. one of the SCT_snn_res_* columns in your input Seurat Object metadata) and a column containing the corresponding New Cluster Names you have chosen. The dot plot will display the unique Cell Types on the x-axis and the Renamed Clusters on the y-axis. The size of the dots show the percentage of cells in each row (each Renamed Cluster) that was classified as each Cell Type. A comparison of dot sizes within a row may provide insights into that cluster's primary Cell Type. A new metadata column named "Clusternames" is added to the output Seurat Object that contains the New Cluster Names. + + +**Methodology** +This function creates a dot plot visualization of cell types by metadata category (usually cluster number) from a given dataset implemented in the SCWorkflow package. The function allows you to update and organize biological data about cell clusters in a Seurat object. By changing the input labels, you can map custom names to the existing cluster IDs which will add these names to a new metadata column. +It also generates a dot plot using Seurat's Dotplot function [4], providing a visual representation of the percentage of various cell types within each cluster. Typically, a cluster can be more distinctively named by the predominant cell type as seen in the dotplot. The plot's order can be customized for the clusters and cell types. If no specific order is provided, the function uses a default order. +An optional parameter allows the user to make the plot interactive. The function returns the updated Seurat object and the plot. + + +```{r,eval=T,echo=TRUE} + +clstrTable <- read.table(file = "./images/Cluster_Names.txt", sep = '\t',header = T) + +``` + +```{r,echo=F,eval=T} + +clstrTable=data.table(OriginalClusterIDs= c(0,1,2,3,4,5,6,7), + NewClusterNames=c("Pop0", "Pop1", "Pop2", "Pop3","Pop4", "Pop5", "Pop6", "Pop7") +) +write.table(clstrTable, + file = "./images/Cluster_Names.txt", + sep = '\t', + row.names = F) + clstrTable%>%knitr::kable() + + +``` + +```{r,eval=run_Chunks} + +RNC_object=nameClusters(object=Anno_SO$object, + cluster.identities.table=clstrTable, + cluster.numbers= 'OriginalClusterIDs', + cluster.names='NewClusterNames', + cluster.column ="SCT_snn_res.0.2", + labels.column = "mouseRNAseq_main", + order.clusters.by = NULL, + order.celltypes.by = NULL, + interactive = FALSE + ) + +``` + +```{r,eval=run_Chunks,echo=T,results='hide'} + +# DimPlot(MS_object, group.by = "SCT_snn_res.0.2", label = T, reduction = 'umap') +# DimPlot(MS_object, group.by = "mouseRNAseq_main", label = T, reduction = 'umap') + +ggsave(RNC_object$plots, filename = "./images/RNC.png", width = 9, height = 6) + +``` + +![](./images/RNC.png){width=600} + +
    + +## Dot Plot of Genes by Metadata + +--- + +This function creates a dot plot of average gene expression values for a set of genes in cell subpopulations defined by metadata annotation columns. The input table contains a single column for genes (the "Genes column") and a single column for category (the "Category labels to plot" column). The values in the "Category labels to plot" column should match the values provided in the metadata function (Metadata Category to Plot). The plot will order the genes (x-axis, left to right) and Categories (y-axis, top to bottom) in the order in which it appears in the input table. Any category entries omitted will not be plotted. + +The Dotplot size will reflect the percentage of cells expressing the gene while the color will reflect the average expression for the gene. A table showing values on the plot (either percentage of cells expressing gene, or average expression scaled) will be returned, as selected by user. + +**Methodology** +This function creates a dot plot visualization of gene expression by metadata from a given dataset. It uses the Seurat package to create these plots. The size of the dot represents the percentage of cells expressing a particular gene (frequency), while the color of the dot indicates the average gene expression level. +The function ensures that only unique and valid genes and categories are used. If some categories or genes are not found in the dataset, appropriate warnings are issued. The plot is then drawn with the option to reverse the x and y-axes and to reverse the order of metadata categories. The colors can also be customized. +In addition to the plot, the function provides the tabular format of the dot plot data, which can be useful for further analysis or reporting. A choice of returning either the tables representing the percent of cells expressing a gene or the average expression level of the genes. +This function can be useful for exploratory data analysis and visualizing the differences in gene expression across different conditions or groups of cells. + + +```{r,eval=run_Chunks} + +FigOut=dotPlotMet(object=Anno_SO$object, + metadata="orig.ident", + cells=c("PBS","ENT","NHSIL12", "Combo","CD8dep" ), + markers=Marker_Table$Macrophages, + plot.reverse = FALSE, + cell.reverse.sort = FALSE, + dot.color = "darkblue" + ) + +``` + +```{r,eval=run_Chunks,echo=F,results='hide'} + +ggsave(FigOut$plots, filename = "./images/DPM.png", width = 9, height = 6) + +``` + +![](./images/DPM.png){width=600} + + +

    + +1. Aran, D., A. P. Looney, L. Liu, E. Wu, V. Fong, A. Hsu, S. Chak, et al. 2019. “Reference-based analysis of lung single-cell sequencing reveals a transitional profibrotic macrophage.” Nat. Immunol. 20 (2): 163–72. + +2. http://bioconductor.org/packages/release/data/experiment/html/celldex.html + +3. https://satijalab.org/seurat/reference/addmodulescore + +4. Hao Y et al. Integrated analysis of multimodal single-cell data. Cell. 2021 Jun 24;184(13):3573-3587.e29. doi: 10.1016/j.cell.2021.04.048. Epub 2021 May 31. PMID: 34062119; PMCID: PMC8238499. + + + + + \ No newline at end of file diff --git a/vignettes/SCWorkflow-DEG.Rmd b/vignettes/SCWorkflow-DEG.Rmd new file mode 100644 index 0000000..3f88752 --- /dev/null +++ b/vignettes/SCWorkflow-DEG.Rmd @@ -0,0 +1,510 @@ +--- +title: "Differential Expression Analysis" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{SCWorkflow-DEG} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} + +--- + +```{r, include = FALSE} +options(rmarkdown.html_vignette.check_title = FALSE) + +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>", + warning = FALSE, message = FALSE +) + +library(dplyr) + + +run_Chunks=F +``` + +```{r include=F,echo=F,eval=run_Chunks} +library(Seurat) +library(data.table) +library(ggplot2) + +``` + +```{r,include=F,echo=F,eval=run_Chunks} + +Anno_SO=readRDS("./images/Anno_SO.rds") + +``` + +## DE with Find Markers + +--- + +This function performs a DE (differential expression) analysis on a merged Seurat object to identify expression markers between different groups of cells (contrasts). This analysis uses the FindMarkers() function of the Seurat Workflow. + +**Methodology** +Differential expression analysis (DEG) is a fundamental technique in single-cell genomics research. The goal of DEG analysis is to identify genes that exhibit significant changes in expression levels between different groups of cells or conditions, thereby uncovering potential markers that distinguish these groups. +This function takes a merged Seurat object [1] as input, expected to contain single-cell data from multiple samples, along with relevant metadata and SingleR annotations, which provide information about cell identity. To perform the DEG analysis, the user can choose from various statistical algorithms, such as MAST [2], wilcox [3], bimod [4], and more, which accommodate different types of experimental designs and assumptions about the data. The user can control the sensitivity of the analysis by setting the minimum fold-change in gene expression between the groups to be considered significant. Additionally, users can specify the assay to be used for the analysis, whether it is the scaled data (SCT) or raw RNA counts. +For best results, it is recommended to use this function with well-curated and preprocessed single-cell data, ensuring that the Seurat object contains relevant metadata and SingleR annotations. Users should carefully select the samples and contrasts based on their experimental design and research questions. Additionally, exploring different statistical algorithms and adjusting the threshold can fine-tune the DEG analysis and reveal more accurate gene expression markers. + + +```{r,eval=F} + +DEG_table=degGeneExpressionMarkers(object = Anno_SO$object, + samples = c("PBS", "ENT", "NHSIL12", "Combo", "CD8dep" ), + contrasts = c("0-1"), + parameter.to.test = "SCT_snn_res_0_2", + test.to.use = "MAST", + log.fc.threshold = 0.25, + assay.to.use = "SCT", + use.spark = F + ) + +``` + +```{r echo=F} +if (run_Chunks==T) { + write.table(DEG_table$data$DEG_Table , + file = "./images/DEG_Table.txt", + sep = '\t', + row.names = F) +}else{ + DEG_table=read.delim("./images/DEG_Table.txt") +} + + DEG_table%>%head()%>%knitr::kable() + +``` + +1. https://satijalab.org/seurat/ +2. https://rglab.github.io/MAST/ +3. Dalgaard, Peter (2008). Introductory Statistics with R. Springer Science & Business Media. pp. 99–100 +4. https://en.wikipedia.org/wiki/Multimodal_distribution + +## Pseudo Bulk Method + +--- + +### Aggregate Seurat Counts + +This function is the first step in a Pseudobulk analysis of your scRNA-seq dataset. It groups cells based on chosen categorical variable(s) in the Seurat Object's Metadata and aggregates the counts of each gene in each group. + +The output is a table of aggregate expression in which the rows are genes and the columns are values found in the chosen Pseudobulk variable. If you select multiple categories to aggregate by (e.g. Category1: A,B,C and Category2: D,E,F), cells will be grouped by combinations of category variables (e.g. A_D, A_E, A_F, B_D, B_E, B_F). By default, gene counts are averaged across cells in each group. + +```{r,eval=F,echo=FALSE} + +aggregateCounts=function(object, + var.group, + slot){ + + + ## --------------- ## + ## Main Code Block ## + ## --------------- ## + + pseudobulk <- AverageExpression(object, + return.seurat = FALSE, + assay = "SCT", + group.by = var.group, + slot = slot)[[1]] %>% + as.data.frame.matrix() + + pseudobulk$Gene <- rownames(pseudobulk) + pseudobulk <- pseudobulk %>% select("Gene", everything()) + rownames(pseudobulk) <- NULL + + # Further processing of column names + colnames(pseudobulk) <- gsub("\\W","_",colnames(pseudobulk)) + + # # Rename columns generated from Clustering to be more Generic + # if(grepl("SCT_snn_res",var.group)){ + # colnames(pseudobulk)[grepl("\\d+", colnames(pseudobulk))] <- + # paste("Cluster", + # colnames(pseudobulk)[grepl("\\d+", colnames(pseudobulk))], + # sep = "_") + # } + + # Return Table/Figure that gives statistics on + # Number of Cells in each group/new sample + # Distribution of cell Counts in each group/new sample + meta <- object@meta.data[,var.group] + + # check that columns are all factors / categorical + char_or_factor_cols <- sapply(meta, function(x) is.character(x) || is.factor(x) || is.logical(x)) + + # do plots and tables if all columns are factors or characters + if(all(char_or_factor_cols)){ + meta$interaction <- gsub("\\W","_",interaction(meta)) + + df <- as.data.frame(table(pseudobulk_group = meta$interaction)) %>% filter(Freq != 0) + # sort the table by the number of cells in each group + df <- df[order(df$Freq, decreasing = F),] + + if(any(df$Freq == 1)){ + single_counts <- df$pseudobulk_group[df$Freq == 1] + # sprintf, make custom warning message with %s as placeholder for single count groups + warning(sprintf( + "Some groups have only 1 cell. It is recommended to have at least 2 cells in each group.\nAffected groups: %s", + paste(single_counts, collapse = ", ") + )) + } + + p <- ggplotly(ggplot(df, aes(x = pseudobulk_group, y = Freq)) + + geom_bar(stat = "identity", position = "stack") + + labs(y = "Counts", x = "Pseudobulk Groups", title = "Number of Cells in each Pseudobulk Group") + + theme(axis.text.x = element_text(angle = 90, hjust = 1))) + + print(p) + + } else { + stop("All columns in var.group must be factors or characters") + } + + return(pseudobulk) +} +``` + +```{r,eval=F} +aggregateCounts(object=so, + var.group=var_group, + slot=slot) +``` + + +### Statistical Analysis using Limma + +Given a matrix (typically log-normalized gene expression) and a metadata table, this will run one- and two-factor statistical analyses on groups using linear or mixed effects models with limma. Reference. + +There are 2 ways for treating Donor or Patient - one as a random effect and the other as a fixed effect + +When Using a Mixed Effects Model (Donor as random effect): + +Add Donor column to the Donor Variable Column +Do not add the Donor variable under Covariate Columns. It will be handled separately in the Donor Variable Column as a random effect. +The Covariate Columns field should include any other variables except the Donor. +When Using a Basic Linear Model (Donor as fixed effect): + +You can add the Donor column as a covariate under Covariate Columns, where it will be treated as a fixed effect. +Additional variables can be included under Covariate Columns +Ensure the Donor Variable Column is left blank. +This function is a Beta version and is undergoing active development. If you encounter problems, please contact CCBR NCICCBRNIDAP@mail.nih.gov + + +```{r,eval=F} +Pseudobulk_LimmaStats() +``` + +## Visualizations + +--- + +### Volcano Plot - Enhanced + +This function utilizes the *EnhancedVolcano* R Bioconductor package to generate publication-ready volcano plots for differential expression analyses, offering a number of customizable visualization options and optimizing gene label placement to avoid clutter + + +**Methodology** +A volcano plot is a type of scatterplot that shows statistical significance (P value) versus magnitude of change (fold change). It enables quick visual identification of genes with large fold changes that are also statistically significant. These may be the most biologically significant features (such as genes, isoforms, peptides and so on). +Here, we are using a highly-configurable function "EnhancedVolcano" that produces publication-ready volcano plots. + +```{r,eval=F,echo=F} +DEFindMarkers_Volcano <- function(DEFindMarkers) { + # image: png + + + # Changelog + # 2022-09-14 Rearranged structure and description + # 2020-10-29 Add support for pval == 0 + + + + ## --------- ## + ## Libraries ## + ## --------- ## + + library(stringr) + library(ggplot2) + library(ggrepel) + library(dplyr) + library(tidyr) + + library(EnhancedVolcano) + # For interactive plot: + library(plotly) + library(grid) + + + ## -------------------------------- ## + ## User-Defined Template Parameters ## + ## -------------------------------- ## + + #Basic Parameters: + df.orig <- DEFindMarkers + label.col <- "Gene" + sig.col <- c("C_HER2_vs_ER_pval","C_HER2_vs_TNBC_pval","C_ER_vs_TNBC_pval") + pCutoff = 0.001 + lfc.col <- c("C_HER2_vs_ER_logFC","C_HER2_vs_TNBC_logFC","C_ER_vs_TNBC_logFC") + FCcutoff = 1.0 + + + #Label Parameters + value_to_sort_the_output_dataset <- "p-value" + no_genes_to_label <- 30 + use_only_addition_labels <- FALSE + additional_labels <- "" + is_red <- TRUE + labSize <- 4 + + + #Title and Axis labels Parameters + change_sig_name <- "p-value" + change_lfc_name <- "log2FC" + title <- "p-value <= 0.001 & logFC >= 1.0" + #subtitle <- "" + use_custom_lab <- FALSE + + #Plot Parameters + ylim <- 0 + custom_xlim <- "" + xlim_additional <- 0 + ylim_additional <- 0 + axisLabSize <- 24 + pointSize <- 2 + + + #Image Parameters + imageWidth = 3000 + imageHeight = 3000 + dpi = 300 + + + + ##--------------- ## + ## Error Messages ## + ## -------------- ## + + ## --------------- ## + ## Main Code Block ## + ## --------------- ## + + rank <- list() + for(i in 1:length(lfc.col)){ + lfccol <- lfc.col[i] + sigcol <- sig.col[i] + columns_of_interest <- c(label.col,lfc.col[i],sig.col[i]) + df <- df.orig %>% dplyr::select(one_of(columns_of_interest)) %>% + mutate(!!sym(lfccol) := replace_na(!!sym(lfccol), 0)) %>% + mutate(!!sym(sigcol) := replace_na(!!sym(sigcol), 1)) + #mutate(.data[[lfc.col[i]]] = replace_na(.data[[lfc.col[i]]], 0)) %>% + #mutate(.data[[sig.col[i]]] = replace_na(.data[[sig.col[i]]], 1)) + if (use_custom_lab==TRUE){ + if (nchar(change_lfc_name)==0){lfc_name = lfc.col[i]} + if (nchar(change_sig_name)==0){sig_name = sig.col[i]} + colnames(df) <- c(label.col,change_lfc_name, sig_name) + } else { + lfc_name = lfc.col[i] + sig_name = sig.col[i] + } + + group <- gsub("_pval|p_val_","",sig_name) + rank[[i]] <- -log10(df[[sig_name]]) * sign(df[[lfc_name]]) + names(rank)[i] <- paste0("C_",group,"_rank") + + cat(paste0("Genes in initial dataset: ", nrow(df),"\n")) + + #Select top genes by logFC or Significance + + if (value_to_sort_the_output_dataset=="fold-change") { + df <- df %>% dplyr::arrange(desc(.data[[lfc_name]])) + } else if (value_to_sort_the_output_dataset=="p-value") { + df <- df %>% dplyr::arrange(.data[[sig_name]]) + } + + if (is_red) { + df_sub <- df[df[[sigcol]] <= pCutoff & abs(df[[lfccol]]) >= FCcutoff, ] + } else { + df_sub <- df + } + + genes_to_label <- as.character(df_sub[1:no_genes_to_label,label.col]) +# additional_labels <- unlist(str_split(additional_labels,",")) + ## Modifying Additional Labels List: + ## Replace commas with spaces and split the string +split_values <- unlist(strsplit(gsub(",", " ", additional_labels), " ")) +additional_labels <- split_values[split_values != ""] + + filter <- additional_labels %in% df[,label.col] + missing_labels <- additional_labels[!filter] + additional_labels <- additional_labels[filter] + + if(length(missing_labels) > 0){ + cat("Could not find:\n") + print(missing_labels) + } + + if(use_only_addition_labels){ + genes_to_label <- additional_labels + }else{ + genes_to_label <- unique(append(genes_to_label, additional_labels)) + } + + significant = vector(length = nrow(df)) + significant[] = "Not significant" + significant[which(abs(df[,2]) > FCcutoff)] = "Fold change only" + significant[which(df[,3] < pCutoff)] = "Significant only" + significant[which(abs(df[,2]) > FCcutoff & df[,3] < pCutoff)] = "Significant and fold change" + print(table(significant)) + + # fix pvalue == 0 + shapeCustom <- rep(19,nrow(df)) + maxy <- max(-log10(df[[sig_name]]), na.rm=TRUE) + if(ylim > 0){ + maxy <- ylim + } + + cat(paste0("Maxy: ",maxy,"\n")) + if(maxy == Inf){ + # Sometimes, pvalues == 0 + keep <- df[[sig_name]] > 0 + df[[sig_name]][!keep] <- min(df[[sig_name]][keep]) + shapeCustom[!keep] <- 17 + + maxy <- -log10(min(df[[sig_name]][keep])) + cat("Some p-values equal zero. Adjusting y-limits.\n") + cat(paste0("Maxy adjusted: ",maxy,"\n")) + + } + + # By default, nothing will be greater than maxy. User can set this value lower + keep <- -log10(df[[sig_name]]) <= maxy + df[[sig_name]][!keep] <- maxy + shapeCustom[!keep] <- 17 + + names(shapeCustom)<- rep("Exact",length(shapeCustom)) + names(shapeCustom)[shapeCustom == 17] <- "Adjusted" + + #Remove if nothin' doin' + if(all(shapeCustom == 19)){ + shapeCustom <- NULL + } + + maxy <- ceiling(maxy) + + if (grepl("log",lfc.col[i]) ){ + xlab <- bquote(~Log[2]~ "fold change") + } else { + xlab <- "Fold change" + } + if (grepl("adj",sig.col[i])){ + ylab <- bquote(~-Log[10]~ "FDR") + } else { + ylab <- bquote (~-Log[10]~ "p-value") + } + if(use_custom_lab){ + if(lfc_name != lfc.col[i]){ + xlab <- gsub("_"," ",lfc_name) + } + if (sig_name != sig.col[i]){ + ylab <- gsub("_"," ",sig_name) + } + } + +## X-axis custom range change: + +if (custom_xlim == "") { + xlim=c(floor(min(df[,lfc_name])) - xlim_additional,ceiling(max(df[,lfc_name]))+ xlim_additional) +} else if (grepl(",", custom_xlim) == FALSE) { + xlim=c(-1*as.numeric(trimws(custom_xlim)), as.numeric(trimws(custom_xlim))) +} else { + split_values <- strsplit(custom_xlim, ",")[[1]] + + # Trim whitespace and convert to numeric values + x_min <- as.numeric(trimws(split_values[1])) + x_max <- as.numeric(trimws(split_values[2])) + + xlim <- c(x_min, x_max) +} + + + p <- EnhancedVolcano( df,x=lfc_name,y=sig_name, + lab=df[,label.col], + selectLab = genes_to_label, + title=title, #CHANGE NW: See line 78 + subtitle <- group, + xlab=xlab, + ylab=ylab, + xlim=xlim, + ylim=c(0, maxy + ylim_additional), + pCutoff=pCutoff, + FCcutoff=FCcutoff, + axisLabSize=axisLabSize, + labSize=labSize, + pointSize=pointSize, + shapeCustom=shapeCustom + ) + print(p) + ## Adding interactive plot with no labels: + p_empty <- EnhancedVolcano( df,x=lfc_name,y=sig_name, + lab = rep("", nrow(df)), # Setting labels to empty strings + selectLab = NULL, + title=title, #CHANGE NW: See line 78 + subtitle <- group, + xlab=xlab, + ylab=ylab, + xlim=xlim, + ylim=c(0, maxy + ylim_additional), + pCutoff=pCutoff, + FCcutoff=FCcutoff, + axisLabSize=axisLabSize, + labSize=labSize, + pointSize=pointSize, + shapeCustom=shapeCustom + ) +## print(p_empty) + + +# Extract the data used for plotting +plot_data <- ggplot_build(p_empty)$data[[1]] + +pxx <- p_empty + + xlab("Fold Change") + # Simplify x-axis label + ylab("Significance") + # Simplify y-axis label + theme_minimal() + + geom_point(aes( + text = paste("Gene:", df[[label.col]], + "
    Log2FC:", df[[lfc_name]], + "
    P-value:", df[[sig_name]]), + colour = as.character(plot_data$colour), + fill = as.character(plot_data$colour) # Set fill to the same as colour + ), + shape = 21, # Shape that supports both colour and fill + size = 2, # Size of the points + stroke = 0.1 # Stroke width + ) + scale_fill_identity() + +# Add interactive hover labels for the gene names +interactive_plot <- ggplotly(pxx, tooltip = c("text")) + + + ## showing interactive plot + grid.newpage() + print(interactive_plot) + grid.newpage() + ## The end of addition + + } + + df.final <- cbind(df.orig, do.call(cbind, rank)) + return(df.final) +} +``` + + +1. Maria Doyle, 2021 Visualization of RNA-Seq results with Volcano Plot (Galaxy Training Materials). https://training.galaxyproject.org/training-material/topics/transcriptomics/tutorials/rna-seq-viz-with-volcanoplot/tutorial.html Online; accessed Mon Aug 01 2022 +2. Batut et al., 2018 Community-Driven Data Analysis Training for Biology Cell Systems 10.1016/j.cels.2018.05.012 +3. Blighe, K, S Rana, and M Lewis. 2018. EnhancedVolcano: Publication-ready volcano plots with enhanced coloring and labeling. https://github.com/kevinblighe/EnhancedVolcano. + + + + + diff --git a/vignettes/SCWorkflow-QC.Rmd b/vignettes/SCWorkflow-QC.Rmd new file mode 100644 index 0000000..9528534 --- /dev/null +++ b/vignettes/SCWorkflow-QC.Rmd @@ -0,0 +1,227 @@ + +--- +title: "Import Data and Quality Control" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{SCWorkflow-Overview} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} + +--- + + +```{r, include = FALSE} +options(rmarkdown.html_vignette.check_title = FALSE) +run_Chunks=FALSE + +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>", + warning = FALSE, message = FALSE +) + +library(data.table) +library(dplyr) +library(ggplot2) +``` + + +
    + +## Process Input Data + +--- + +This package is designed to work with the general Seurat Workflow. To begin using the SCWorkflow tools you will have to process the h5 files generated by the Cell Ranger software from the 10x genomics platform to create a list of Seurat Objects[1] corresponding to each h5 file. A Seurat Object is the basic data structure for Seurat Single Cell analysis + +This tool supports standard scRNAseq, CITE-Seq, and TCR-Seq assays. Samples prepared with a cell hashing protocol (HTOs) can also be processed to produce a Seurat Object split by the corresponding experimental design strategy. h5 files containing multiple samples can also be processed to create Seurat objects that will be split based on the values in the orig.ident column. + +A corresponding Metadata table can be used to add sample level information to the Seurat object. The table format should have Sample names in the first Column and any sample metadata in additional columns. The Metadata table can also be used to rename samples by including an alternative sample name Column in the metadata table. + +```{r,echo=F,eval=T} +# data.table(My_Sample_Names=c('CID3586','CID3921', +# 'CID4066','CID4290A', +# 'CID4398','CID4471', +# 'CID4495','CID44971', +# 'CID44991'), +# New_Names=c('H1','H2','H3', +# 'E1','E2','E3', +# 'T1','T2','T3'), +# Subtype=c('HER2','HER2','HER2', +# 'ER','ER','ER', +# 'TNBC','TNBC','TNBC'))%>% +# head()%>%knitr::kable() + +SampleMetadataTable=data.table(Sample_Name=c('SCAF1713_1_1','SCAF1714_2_1','SCAF1715_3_1', + 'SCAF1716_4_1','SCAF1717_5_1'), + Rename=c("PBS","ENT","NHSIL12","Combo","CD8dep"), + Treatment=c('WT',"Entinostat","NHS-IL12","Entinostat + NHS-IL12",'Entinostat + NHS-IL12')) +write.table(SampleMetadataTable, + file = "./images/Sample_Metadata.txt", + sep = '\t', + row.names = F) + SampleMetadataTable%>%knitr::kable() + + +``` + +Samples can also be excluded from the final Seurat object using a REGEX strategy to identify the samples to be included/excluded. explain based on newnames + +The final Seurat Object will contain an assay slot with log2 normalized counts. QC figures for individual samples will also be produced to help evaluate samples quality. + +```{r,eval=run_Chunks,echo=T,results='hide'} + +SampleMetadataTable <- read.table(file = "./images/Sample_Metadata.txt", sep = '\t',header = T) +files=list.files(path="../tests/testthat/fixtures/Chariou/h5files",full.names = T) + +SOlist=processRawData(input=files, + sample.metadata.table=SampleMetadataTable, + sample.name.column='Sample_Name', + organism="Mouse", + rename.col='Rename', + keep=T, + file.filter.regex=c(), + split.h5=F, + cell.hash=F, + tcr.summarize.topN=10, + do.normalize.data=T +) +``` + +```{r,echo=F,eval=run_Chunks} +ggsave(SOlist$plots[[1]], filename = "./images/ProcessInputData1.png", width = 10, height = 10) +ggsave(SOlist$plots[[2]], filename = "./images/ProcessInputData2.png", width = 10, height = 10) + +``` + +![](./images/ProcessInputData1.png){width=300} ![](./images/ProcessInputData2.png){width=300} + +
    + +## Filter Low Quality Cells + +--- + +This function will filter genes and cells based on multiple metrics available in the Seurat Object metadata slot. A detailed guide for single cell quality filtering can be found from Xi and Li, 2021 [2]. +First, genes can be filtered by setting the minimum number of cells needed to keep a gene or removing VDJ Add descriptiopn of VDJ genes. Next, cells can be filtered by setting thresholds for each individual metric. Cells that do not meet any of the designated criteria will be removed from the final filtered Seurat Object . Filter limits can be set by using absolute values or median absolute deviations (MADs) for each criteria. If both absolute and MAD values are set for a single filter, the least extreme value (i.e. the lowest value for upper limits or the highest value for lower limits) will be selected. The filter values used for each metric will be printed in the log output. All filters have default values and can be turned off by setting limits to NA. + +The individual filtering criteria used in this tool are listed below. + + 1. The total number of molecules detected within each cell (nCount_RNA) + 2. The number of genes detected in each cell (nFeature_RNA) + 3. The complexity of of genes ( log10(nFeature_RNA)/log10(nCount_RNA) + 4. Percent of mitochondrial Genes + 5. Percent counts in top 20 Genes + 6. Doublets calculated by scDblFinder (using package default parameters) [3] + + +The function will return a filtered Seurat Object and various figures showing metrics before and after filtering. These figures can be used to help evaluate the effects of filtering criteria and whether filtering limits need to be adjusted. + + +```{r,eval=run_Chunks,echo=T,results='hide'} + +SO_filtered=filterQC(object=SOlist$object, + ## Filter Genes + min.cells = 20, + filter.vdj.genes=F, + + ## Filter Cells + nfeature.limits=c(NA,NA), + mad.nfeature.limits=c(5,5), + ncounts.limits=c(NA,NA), + mad.ncounts.limits=c(5,5), + mitoch.limits = c(NA,25), + mad.mitoch.limits = c(NA,3), + complexity.limits = c(NA,NA), + mad.complexity.limits = c(5,NA), + topNgenes.limits = c(NA,NA), + mad.topNgenes.limits = c(5,5), + n.topgnes=20, + do.doublets.fitler=T + + ) + + +``` + +```{r,echo=F,eval=run_Chunks} +ggsave(SO_filtered$plots$PostFilterCombined, filename = "./images/QC1.png", width = 10, height = 10) +ggsave(SO_filtered$plots$ViolinPlotCombine, filename = "./images/QC2.png", width = 10, height = 10) +ggsave(SO_filtered$plots$ScatterPlotCombine, filename = "./images/QC3.png", width = 10, height = 10) + +``` + +![](./images/QC1.png){width=300} ![](./images/QC2.png){width=300} + +![](./images/QC3.png){width=300} + +
    + +## Combine, Normalize, and Cluster Data + +--- + +This functions combines multiple sample level Seurat Objects into a single Seurat Object and normalizes the combined dataset. The multi-dimensionality of the data will be summarized into a set of "principal components" and visualized in both UMAP and tSNE projections. A graph-based clustering approach will identify cell clusters with in the data. + +```{r,eval=run_Chunks,echo=T,results='hide'} + +Comb_SO=combineNormalize( + object=SO_filtered$object, + # Nomralization variables + npcs = 21, + SCT.level="Merged", + vars.to.regress = c("percent.mt"), + # FindVariableFeatures + nfeatures = 2000, + low.cut = 0.1, + high.cut = 8, + low.cut.disp = 1, + high.cut.disp = 100000, + selection.method = 'vst', + # Dim Reduction + only.var.genes = FALSE, + draw.umap = TRUE, + draw.tsne = TRUE, + seed.for.pca = 42, + seed.for.tsne = 1, + seed.for.umap = 42, + # Clustering Varables + clust.res.low = 0.2, + clust.res.high = 1.2, + clust.res.bin = 0.2, + # Select PCs + methods.pca = NULL, + var.threshold = 0.1, + pca.reg.plot = FALSE, + jackstraw = FALSE, + jackstraw.dims=5, + # Other + exclude.sample = NULL, + cell.count.limit= 35000, + reduce.so = FALSE, + project.name = 'scRNAProject', + cell.hashing.data = FALSE +) + + +``` + +```{r,echo=F,eval=run_Chunks} +saveRDS(Comb_SO$object, file="./images/CN_SO.rds") + +ggsave(Comb_SO$plots$UMAP, filename = "./images/CN1.png", width = 10, height = 10) +ggsave(Comb_SO$plots$TSNE, filename = "./images/CN2.png", width = 10, height = 10) + +``` + +![](./images/CN1.png){width=300} ![](./images/CN2.png){width=300} + + + +

    + +1. Hao Y et al. Integrated analysis of multimodal single-cell data. Cell. 2021 Jun 24;184(13):3573-3587.e29. doi: 10.1016/j.cell.2021.04.048. Epub 2021 May 31. PMID: 34062119; PMCID: PMC8238499. + +2. Heumos, L., Schaar, A.C., Lance, C. et al. Best practices for single-cell analysis across modalities. Nat Rev Genet (2023). https://doi.org/10.1038/s41576-023-00586-w + +3. Germain P, Lun A, Macnair W, Robinson M (2021). “Doublet identification in single-cell sequencing data using scDblFinder.” f1000research. doi:10.12688/f1000research.73600.1. diff --git a/vignettes/SCWorkflow-SubsetReclust.Rmd b/vignettes/SCWorkflow-SubsetReclust.Rmd new file mode 100644 index 0000000..8da3e8d --- /dev/null +++ b/vignettes/SCWorkflow-SubsetReclust.Rmd @@ -0,0 +1,139 @@ + +--- +title: "Subset and Recluster" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{SCWorkflow-SubsetReclust} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} + +--- + +```{r, include = FALSE} +options(rmarkdown.html_vignette.check_title = FALSE) + +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>", + warning = FALSE, message = FALSE +) + +library(data.table) +library(dplyr) +library(ggplot2) +run_Chunks=F +``` + +```{r,include=F,echo=F,eval=run_Chunks} + +Anno_SO=readRDS("./images/Anno_SO.rds") + +``` + +
    + + +## Subset Seurat Object + +--- + +This function subsets your Seurat object. Select a metadata column and values matching the cells to pass forward in your analysis. + +```{r,eval=run_Chunks} + +filter_SO=filterSeuratObjectByMetadata( + object = Anno_SO$object, + samples.to.include = c("PBS","ENT","NHSIL12","Combo","CD8dep"), + sample.name = 'orig.ident', + category.to.filter = 'immgen_main', + values.to.filter = c('Monocytes','Macrophages','DC'), + keep.or.remove = FALSE, + greater.less.than = "greater than", + colors = c( + "aquamarine3", + "salmon1", + "lightskyblue3"), + seed = 10, + cut.off = 0.5, + legend.position = "right", + reduction = "umap", + plot.as.interactive.plot = FALSE, + legend.symbol.size = 2, + dot.size = 0.1, + number.of.legend.columns = 1, + dot.size.highlighted.cells = 0.5, + use.cite.seq.data = FALSE + ) + +``` + +```{r,echo=F,eval=run_Chunks} +saveRDS(filter_SO, file="./images/filter_SO.rds") + +ggsave(filter_SO$plots$plot1, filename = "./images/SubRec_sub1.png", width = 10, height = 10) +ggsave(filter_SO$plots$plot2, filename = "./images/SubRec_sub2.png", width = 10, height = 10) + +``` + +![](./images/SubRec_sub2.png){width=300} + +
    + +## Recluster Seurat Object + +--- + + +This function provides a mechanism for re-clustering a filtered Seurat object, a common task in single-cell RNA sequencing analysis. The function provides options to choose the number of principal components, range of clustering resolution, type of dimensionality reduction, and several other parameters. +The function finds variable features and performs Principal Component Analysis (PCA). Next, dimensionality reduction is performed using UMAP and t-SNE based on PCA, followed by identification of nearest neighbors. It then performs clustering at different resolutions within the provided range, creating new clustering columns in the Seurat object. It also retains the old clustering information, plots the clusters for each resolution and returns a list containing the re-clustered Seurat object and the grid of clustering plots. +This function can be helpful for experimenting with different clustering parameters especially after filtering and visually inspect the results. + +**Methodology** +This function uses methods from the Seurat package [1]. +Seurat uses a graph-based clustering method inspired by previous strategies, particularly those of Macosko et al [3]. It uses methods like SNN-Cliq and PhenoGraph [4.5], which represent cells in a graph structure based on similarities in feature expression patterns. The aim is to divide this graph into highly connected communities or clusters. +The process begins by building a K-nearest neighbor (KNN) graph using Euclidean distance in PCA space. The algorithm refines the edge weights between cells according to their local neighborhood overlap, calculated using the Jaccard similarity measure. This is performed using predefined dimensions of the dataset, such as the first 10 Principal Components (PCs). +To cluster cells, Seurat uses modularity optimization techniques like the Louvain [4] algorithm or SLM [5]. The 'resolution' parameter can be adjusted to control the granularity of the downstream clustering; a higher resolution results in more clusters. For single-cell datasets of approximately 3K cells, the recommended range for this parameter is between 0.4 and 1.2, but larger datasets typically require a higher resolution. + +```{r,eval=F} + +reClust_SO=reclusterSeuratObject( + object = filter_SO$object, + prepend.txt = "old", + old.columns.to.save=c("orig_ident","Sample_Name","nCount_RNA","nFeature_RNA","percent_mt", + "log10GenesPerUMI","S_Score","G2M_Score","Phase","CC_Difference","Treatment", + "pct_counts_in_top_N_genes","Doublet","nCount_SCT","nFeature_SCT", + "mouseRNAseq_main","mouseRNAseq","immgen_main","immgen" ), + number.of.pcs = 50, + cluster.resolution.low.range = 0.2, + cluster.resolution.high.range = 1.2, + cluster.resolution.range.bins = 0.2, + reduction.type = "umap" + ) + +``` +```{r,echo=F,eval=run_Chunks} +saveRDS(reClust_SO, file="./images/reClust_SO.rds") + +ggsave(reClust_SO$plots, filename = "./images/SubRec_recl.png", width = 18, height = 10) + +``` +![](./images/SubRec_recl.png){width=600} + +

    + +1. Seurat Clustering method https://satijalab.org/seurat/articles/pbmc3k_tutorial.html + +3. Macosko EZ, Basu A, Satija R, Nemesh J, Shekhar K, Goldman M, Tirosh I, Bialas AR, Kamitaki N, Martersteck EM, Trombetta JJ, Weitz DA, Sanes JR, Shalek AK, Regev A, McCarroll SA. Highly Parallel Genome-wide Expression Profiling of Individual Cells Using Nanoliter Droplets. Cell. 2015 May 21;161(5):1202-1214. + +4. Xu, Chen, and Zhengchang Su. Identification of cell types from single-cell transcriptomes using a novel clustering method. Bioinformatics 31.12 (2015): 1974-1980. + +5. Levine, Jacob H., et al. Data-driven phenotypic dissection of AML reveals progenitor-like cells that correlate with prognosis. Cell 162.1 (2015): 184-197. + +6. Blondel, Vincent D., et al. Fast unfolding of communities in large networks."Journal of statistical mechanics: theory and experiment 2008.10 (2008): P10008. + +7. Waltman, Ludo, and Nees Jan Van Eck. A smart local moving algorithm for large-scale modularity-based community detection. The European physical journal B 86 (2013): 1-14 + + + + + diff --git a/vignettes/SCWorkflow-Usage.Rmd b/vignettes/SCWorkflow-Usage.Rmd new file mode 100644 index 0000000..d057a6e --- /dev/null +++ b/vignettes/SCWorkflow-Usage.Rmd @@ -0,0 +1,135 @@ +--- +title: "Getting Started" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{SCWorkflow-Overview} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} + +--- + +```{r, include = FALSE} +options(rmarkdown.html_vignette.check_title = FALSE) + +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>", + warning = FALSE, message = FALSE +) + +library(data.table) +library(dplyr) +library(ggplot2) +``` + +## Use SCWorkflow Container + +--- + +The SCWorkflow docker container is available on Biowulf which can be used with RStudio to organize and rune the SCWorkflow package. + +You will need 2 shells (terminals) to set up RStudio on Biowulf. + +
    + +#### **Terminal 1: Set up RStudio Server on Biowulf** + +#### 1. Log in to Biowulf + +Open a terminal and login to biowulf then call an interactive session + +``` +ssh username@helix.nih.gov + +sinteractive --tunnel --time=12:00:00 --mem=50g --cpus-per-task=16 --gres=lscratch:50 +``` + +#### 2. Get the PORT number for termal 2 + +``` +echo $PORT1 + +example port is 46137 +``` + +#### 3. Load the Container + +The single cell container will emulate the environments from NIDAP + +``` + +source /data/CCBR/NIDAP/container_singlecell.sh + +``` +
    + +#### **Terminal 2: Local shell** + +#### 4. Connect your local shell to the RStudio server on Biowulf using SSH tunneling. + +Use the $PORT number from terminal 1 (step 2). + +``` + ssh -N -L $PORT:localhost:$PORT yourusername@biowulf.nih.gov + + login with nih password +``` + +#### 5. Open RStudio in your local web browser + +Open your web browser and go to: + +```sh +localhost:$PORT +``` + +Use the $PORT number from terminal 1 (step 2) + + +This will open Rstudio in your browser that is connected to the biowulf container you opened in step 3. + + +
    + +## Copy Files from Rstuido server to Helix + +--- + +#### 1. Log into Helix +``` +ssh username@helix.nih.gov +``` +#### 2. Go to Working Directory for Project +#### 3. connect to Rstuido Server to copy files to Biowulf +``` +sftp username@ nciws-d2335-v.nci.nih.gov +``` +#### 4. copy files to biowulf + +**Examples:** + +All files: +``` +mget -r * +``` +Rscipts: +``` +mget -r *R +``` + + +## Install Package + +--- + +for general use SCWorkflow can be installed into your Rlibrary + +``` +# install.packages("remotes") +# remotes::install_github("NIDAP-Community/SCWorkflow", dependencies = TRUE) + +library(SCWorkflow) +``` +
    +
    +
    diff --git a/vignettes/SCWorkflow-Visualizations.Rmd b/vignettes/SCWorkflow-Visualizations.Rmd new file mode 100644 index 0000000..ed85576 --- /dev/null +++ b/vignettes/SCWorkflow-Visualizations.Rmd @@ -0,0 +1,435 @@ + +--- +title: "Visualizations" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{SCWorkflow-Visualizations} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} + +--- + +```{r, include = FALSE} +options(rmarkdown.html_vignette.check_title = FALSE) + +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>", + warning = FALSE, message = FALSE +) + +library(data.table) +library(dplyr) +library(ggplot2) + +run_Chunks=F +``` + +```{r,include=F,echo=F,eval=run_Chunks} + +Anno_SO=readRDS("./images/Anno_SO.rds") + +``` + +
    + +## Color by Metadata + +--- + +Use this Function to color your dimensionality reduction (TSNE & UMAP) with different columns from your Metadata Table. You can select one or more columns from the Metadata Table, and for each column selected, this function will produce a plot (t-SNE & UMAP) using the data in that column to color the cells. + +This function visualizes your plot based on selected metadata. Users can customize how they want to visualize the data, including the type of visualization used, the size and shape of the points, and the level of transparency. + +```{r,eval=run_Chunks} +FigOut=plotMetadata( + object=Anno_SO$object, + samples.to.include=c("PBS","ENT","NHSIL12","Combo","CD8dep" ), + metadata.to.plot=c('SCT_snn_res.0.4','Phase'), + columns.to.summarize=NULL, + summarization.cut.off = 5, + reduction.type = "umap", + use.cite.seq = FALSE, + show.labels = FALSE, + legend.text.size = 1, + legend.position = "right", + dot.size = 0.01 + ) +``` +```{r,eval=run_Chunks,echo=F,results='hide'} +p=FigOut$plots[[1]]+FigOut$plots[[2]] +ggsave(p, filename = "./images/Vis_CBM.png", width = 13, height = 6) + +``` + +![](./images/Vis_CBM.png){width=600} + +
    + +## Plot 3D Dimensionality Reduction + +--- + +This Function creates 3D interactive UMAP or t-SNE plot. The plot is saved in the output folder as an HTML file that can be downloaded. + +This function is designed to generate a 3D t-SNE visualization based on a given Seurat Object. The output includes an interactive plot and a dataframe containing the t-SNE coordinates. The function accepts several parameters, such as the Seurat Object, a metadata column for color, a metadata column for labeling, dot size for the plot, legend display option, colors for the color variable, filename for saving the plot, the number of principal components for t-SNE calculations, and an option to save the plot as a widget in an HTML file. +Initially, the function executes t-SNE on the Seurat Object to obtain the 3D coordinates. Subsequently, it constructs a dataframe for the Plotly visualization, incorporating the t-SNE coordinates, color variable, and label variable. The function generates a 3D scatter plot using the t-SNE coordinates. Finally, the function saves the plot as an embedded Plotly image in an HTML file. + +**Methodology** +t-Distributed Stochastic Neighbor Embedding (t-SNE) is a sophisticated dimensionality reduction technique frequently employed for the visualization of high-dimensional data [1]. It effectively displays the relationships between individual cells based on their gene expression profiles. +To compute t-SNE, the algorithm constructs a probability distribution representing similarities between data points in high-dimensional space. Subsequently, it generates a lower-dimensional representation, typically two or three dimensions, wherein the distances between data points reflect their similarities in the high-dimensional space. +The algorithm employs an iterative process to adjust the positions of cells in a lower-dimensional space, aiming to minimize discrepancies between the original high-dimensional similarities and those in the lower-dimensional space. This approach enables the algorithm to capture both global and local structures within the data, effectively revealing clusters or groups of similar cells. + +```{r,eval=run_Chunks} + +FigOut=tSNE3D( + object=Anno_SO$object, + color.variable='SCT_snn_res.0.4', + label.variable='SCT_snn_res.0.4', + dot.size = 4, + legend = TRUE, + colors = c("darkblue","purple4","green","red","darkcyan", + "magenta2","orange","yellow","black"), + filename = "plot.html", + save.plot = FALSE, + npcs = 15 + ) + +``` + +```{r,eval=run_Chunks,echo=F,results='hide'} + +# saveRDS(FigOut$plot,"./images/Vis_3D.rds") + +saveWidget(as_widget(FigOut$plots), file = "./images/Vis_3D.html") +``` + +```{r,eval=T,echo=F,out.width="100%",results='hide',include=F} +library(rvest) +library(htmltools) +# readRDS("./images/Vis_3D.rds") +# htmltools::includeHTML('./images/Vis_3D.html') +# shiny::includeHTML('./images/Vis_3D.html') + +html_content <- read_html('./images/Vis_3D.html') +print(html_content) +``` + + +
    + +## Color by Genes + +--- + +This function visualizes gene expression intensities for provided Genes across your cells. If a gene is not found in the dataset, the Log will report this. Otherwise, you should see one plot (TSNE or UMAP, your choice) per gene name provided. The intensity of the red color will be relative to the expression of the gene in that cell. Final Potomac Compatible Version: v98. Sugarloaf V1: v103. [View + +**Methodology** +This function visualizes expression values of the chosen gene or protein in different samples. Users can customize how they want to visualize the data, including the type of visualization used, the size and shape of the points, and the level of transparency. + +```{r,eval=run_Chunks} + +FigOut=colorByGene( + object=Anno_SO$object, + samples.to.include=c("PBS","ENT","NHSIL12","Combo","CD8dep" ), + gene='Itgam', + reduction.type = "umap", + number.of.rows = 0, + return.seurat.object = FALSE, + color = "red", + point.size = 1, + point.shape = 16, + point.transparency = 0.5, + use.cite.seq.data = FALSE, + assay = "SCT") + +``` + +```{r,eval=run_Chunks,echo=F,results='hide'} + +# ggsave(FigOut$plot, filename = "./images/Vis_CBG.png", width = 10, height = 10) + +png(filename="./images/Vis_CBG.png",width = 500,height = 350,pointsize = 10) +(FigOut$plots) +dev.off() + +``` +![](./images/Vis_CBG.png){width=300} + +
    + +## Violin Plot from Seurat Object + +--- + +This Function allows for the generation of customized violin plots to visualize transcriptional changes and interactions in single-cell RNA-seq data, providing insights into the cellular heterogeneity and dynamics within the dataset. + +**Methodology** +The Function organizes your data based on specific groups that you choose from a Seurat Object metadata. It then gathers information about the activity levels of specific genes you're interested in. +You can, if you wish, change the names or the order of these groups based on a column you specify in the data. This feature lets you tailor the analysis more closely to your needs. +The code also has a function that removes any odd data points that might distort the results, and it adjusts the data to make it easier to visualize through jittered points and an overlaying boxplot displaying quantile information. +Then, the code creates violin plots, which allows you to see how the activity levels of genes vary within each group [2]. The graph is customizable, letting you set various options such as limit values on the vertical axis, displaying individual data points, converting scales to logarithmic, and showing boxplots. +You can choose how the plot looks - whether it's laid out like a grid, in rows, or with customized labels. + +```{r,eval=run_Chunks} + +FigOut=violinPlot_mod( + object=Anno_SO$object, + assay='SCT', + slot='scale.data', + genes=c('Cd163','Cd38'), + group='SCT_snn_res.0.4', + facet_by = "", + filter_outliers = F, + outlier_low = 0.05, + outlier_high = 0.95, + jitter_points = TRUE, + jitter_dot_size = 1 + ) + +``` +```{r,eval=run_Chunks,echo=F,results='hide'} + +ggsave(FigOut$plots, filename = "./images/Vis_Violin.png", width = 12, height = 5) + +# png(filename="./images/Vis_Violin.png",width = 500,height = 350,pointsize = 10) +# (FigOut$plot) +# dev.off() + +``` + +![](./images/Vis_Violin.png){width=600} + +
    + +## Heatmap + +--- + +This Function provides a comprehensive method for visualizing single cell transcript and/or protein expression data in the form of a heatmap. The data is obtained from a Seurat object, and the user can specify a set of genes for the analysis. +The Function allows optional ordering by metadata (categorical) or gene/protein expression levels. Visualization customization options include color choices for the heatmap, addition of gene or protein annotations, and optional arrangement by metadata. + +Key features include: +- Options for adding gene or protein annotations, metadata arrangement, and specifying row and column names. +- Customizable visualization settings including font sizes for rows, columns, and legend, row height, and heatmap colors. +- Ability to trim outlier data, perform z-scaling on rows, and set row order. + +The Function returns a heatmap plot along with the underlying data used to generate it. It also allows the user to set a seed for color generation and specify outlier data parameters. This function is particularly useful for exploratory data analysis and preliminary data visualization in single cell studies. + +**Methodology** +In this method, two hierarchical clustering processes are performed: one on the rows and one on the columns of the dataset unless ordered by annotations. Hierarchical clustering is a method of cluster analysis that aims to build a hierarchy of clusters. The result is a tree-like diagram called a dendrogram, where similar data points (e.g., genes or samples) are joined together into clusters at the "branches", based on a mathematical measure of similarity such as Euclidean or Manhattan distance. +The heatmap is produced by a package called ComplexHeatmap [3] and presents the data matrix where rows represent individual genes (or proteins, metabolites, etc.) and columns represent different samples (e.g., tissue samples, cells, experimental conditions). The color at each position in the grid corresponds to the expression level of a gene in a particular sample, with one color representing upregulation (higher expression), another representing downregulation (lower expression), and usually a neutral color representing no change. This allows for easy visual interpretation of patterns or correlations in the data. + +```{r,eval=run_Chunks} + +FigOut=heatmapSC( + object=Anno_SO$object, + sample.names=c("PBS","ENT","NHSIL12","Combo","CD8dep" ), + metadata='SCT_snn_res.0.4', + transcripts=c('Cd163','Cd38','Itgam','Cd4','Cd8a','Pdcd1','Ctla4'), + use_assay = 'SCT', + proteins = NULL, + heatmap.color = "Bu Yl Rd", + plot.title = "Heatmap", + add.gene.or.protein = FALSE, + protein.annotations = NULL, + rna.annotations = NULL, + arrange.by.metadata = TRUE, + add.row.names = TRUE, + add.column.names = FALSE, + row.font = 5, + col.font = 5, + legend.font = 5, + row.height = 15, + set.seed = 6, + scale.data = TRUE, + trim.outliers = TRUE, + trim.outliers.percentage = 0.01, + order.heatmap.rows = FALSE, + row.order = c() + ) + +``` +```{r,eval=run_Chunks,echo=F,results='hide'} + +# ggsave(FigOut$plot, filename = "./images/Vis_HM.png", width = 12, height = 5) + +png(filename="./images/Vis_HM.png",width = 700,height = 300,pointsize = 10) +(FigOut$plots) +dev.off() + +``` + +![](./images/Vis_HM.png){width=600} + +
    + +## Dot Plot of Genes by Metadata + +--- + +This function creates a dot plot of average gene expression values for a set of genes in cell subpopulations defined by metadata annotation columns. The input table contains a single column for genes (the "Genes column") and a single column for category (the "Category labels to plot" column). The values in the "Category labels to plot" column should match the values provided in the metadata function (Metadata Category to Plot). The plot will order the genes (x-axis, left to right) and Categories (y-axis, top to bottom) in the order in which it appears in the input table. Any category entries omitted will not be plotted. + +The Dotplot size will reflect the percentage of cells expressing the gene while the color will reflect the average expression for the gene. A table showing values on the plot (either percentage of cells expressing gene, or average expression scaled) will be returned, as selected by user. + +**Methodology** +This function creates a dot plot visualization of gene expression by metadata from a given dataset. It uses the Seurat package to create these plots. The size of the dot represents the percentage of cells expressing a particular gene (frequency), while the color of the dot indicates the average gene expression level. +The function ensures that only unique and valid genes and categories are used. If some categories or genes are not found in the dataset, appropriate warnings are issued. The plot is then drawn with the option to reverse the x and y-axes and to reverse the order of metadata categories. The colors can also be customized. +In addition to the plot, the function provides the tabular format of the dot plot data, which can be useful for further analysis or reporting. A choice of returning either the tables representing the percent of cells expressing a gene or the average expression level of the genes. +This function can be useful for exploratory data analysis and visualizing the differences in gene expression across different conditions or groups of cells. + +1. Seurat package Dotplot Documentation https://satijalab.org/seurat/reference/dotplot + + +```{r,eval=F} + +FigOut=dotPlotMet( + object=Anno_SO$object, + metadata='SCT_snn_res.0.4', + cells=unique(Anno_SO$object$SCT_snn_res.0.4), + markers=c('Itgam','Cd163','Cd38','Cd4','Cd8a','Pdcd1','Ctla4'), + plot.reverse = FALSE, + cell.reverse.sort = FALSE, + dot.color = "darkblue" + ) + +``` +```{r,eval=run_Chunks,echo=F,results='hide'} + +ggsave(FigOut$plots, filename = "./images/Vis_DPM.png", width = 9, height = 5) + +# png(filename="./images/Vis_HM.png",width = 700,height = 300,pointsize = 10) +# (FigOut$plot) +# dev.off() + +``` + +![](./images/Vis_DPM.png){width=500} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + +1. Seurat Documentation for t-SNE Analysis https://satijalab.org/seurat/reference/runtsne + +2. https://ggplot2.tidyverse.org/reference/ + +3. Complex Heatmap Reference Book https://jokergoo.github.io/ComplexHeatmap-reference/book/ diff --git a/vignettes/SCWorkflow.pdf b/vignettes/SCWorkflow.pdf new file mode 100644 index 0000000..b5bcc69 Binary files /dev/null and b/vignettes/SCWorkflow.pdf differ diff --git a/vignettes/SCWorkflow.png b/vignettes/SCWorkflow.png new file mode 100644 index 0000000..751136e Binary files /dev/null and b/vignettes/SCWorkflow.png differ diff --git a/vignettes/images/Anno1.png b/vignettes/images/Anno1.png new file mode 100644 index 0000000..d7b6443 Binary files /dev/null and b/vignettes/images/Anno1.png differ diff --git a/vignettes/images/Anno2.png b/vignettes/images/Anno2.png new file mode 100644 index 0000000..5cbcee0 Binary files /dev/null and b/vignettes/images/Anno2.png differ diff --git a/vignettes/images/CBM1.png b/vignettes/images/CBM1.png new file mode 100644 index 0000000..068a006 Binary files /dev/null and b/vignettes/images/CBM1.png differ diff --git a/vignettes/images/CN1.png b/vignettes/images/CN1.png new file mode 100644 index 0000000..3943371 Binary files /dev/null and b/vignettes/images/CN1.png differ diff --git a/vignettes/images/CN2.png b/vignettes/images/CN2.png new file mode 100644 index 0000000..54e40f8 Binary files /dev/null and b/vignettes/images/CN2.png differ diff --git a/vignettes/images/Cluster_Names.txt b/vignettes/images/Cluster_Names.txt new file mode 100644 index 0000000..2bf26b7 --- /dev/null +++ b/vignettes/images/Cluster_Names.txt @@ -0,0 +1,9 @@ +"OriginalClusterIDs" "NewClusterNames" +0 "Pop0" +1 "Pop1" +2 "Pop2" +3 "Pop3" +4 "Pop4" +5 "Pop5" +6 "Pop6" +7 "Pop7" diff --git a/vignettes/images/DEG_Table.txt b/vignettes/images/DEG_Table.txt new file mode 100644 index 0000000..ade0549 --- /dev/null +++ b/vignettes/images/DEG_Table.txt @@ -0,0 +1,662 @@ +"Gene" "C_0_vs_1_pval" "C_0_vs_1_logFC" "C_0_vs_1_pct1" "C_0_vs_1_pct2" "C_0_vs_1_adjpval" +"Cd274" 0 -1.1999484788031 0.369 0.808 0 +"Fth1" 0 -1.41701030500321 1 1 0 +"Mmp12" 0 -3.05123054818861 0.163 0.635 0 +"mt-Atp6" 0 0.979029607613066 1 0.984 0 +"mt-Co2" 0 1.02899053273742 1 0.982 0 +"mt-Co3" 0 0.97757682779721 1 0.981 0 +"mt-Cytb" 0 1.30966079383546 0.999 0.93 0 +"mt-Nd1" 0 1.20548786503441 0.975 0.767 0 +"mt-Nd2" 0 1.03931318644522 0.944 0.697 0 +"mt-Nd4l" 0 1.38466404156726 0.993 0.833 0 +"Esd" 1.77917789014552e-315 -1.02053214042876 0.869 0.957 2.23891745695912e-311 +"Man2b1" 4.62647202518876e-299 0.887887505164929 0.849 0.501 5.82195239649753e-295 +"Hilpda" 4.3211826373732e-295 -1.49084282108445 0.426 0.802 5.43777623087044e-291 +"Eif1" 3.91514419165421e-293 -0.724583077310105 1 1 4.92681745077766e-289 +"Nos2" 4.00373113985608e-293 -1.39461753741456 0.175 0.574 5.03829526639489e-289 +"Sod2" 2.20901667471907e-292 -1.44891747140249 0.514 0.757 2.77982658346648e-288 +"Grina" 5.76506428176552e-287 -1.18808687991573 0.874 0.981 7.25475689217373e-283 +"mt-Nd4" 1.94178101321245e-286 0.87048078583596 0.938 0.716 2.44353722702655e-282 +"Ninj1" 5.2477073569409e-280 -0.923751452716522 0.77 0.956 6.60371493797443e-276 +"mt-Nd3" 5.89554649424348e-273 0.910815106214937 0.752 0.377 7.41895570835599e-269 +"Cstb" 6.47923136999472e-270 -0.745711523279314 0.981 0.996 8.15346475600136e-266 +"Il1rn" 2.06503808348417e-269 -1.62603733165162 0.577 0.85 2.59864392425648e-265 +"Pld4" 5.14930053543862e-268 0.863837925267611 0.846 0.529 6.47987979379596e-264 +"Inhba" 6.10344858606671e-265 -1.68418788390828 0.047 0.36 7.68057970070635e-261 +"Plin2" 5.68139718787403e-260 -0.982751645441252 0.867 0.972 7.14947022122067e-256 +"Mif" 8.80492755401636e-253 -0.74165326178046 0.981 0.994 1.10801208339742e-248 +"Ftl1" 7.18508390540949e-252 -0.734757296504506 1 1 9.0417095865673e-248 +"Il7r" 1.66982974471651e-245 -1.00338817659057 0.285 0.641 2.10131375075126e-241 +"Gatm" 2.37575559362261e-241 1.47467716145127 0.831 0.508 2.98965083901469e-237 +"Slc2a1" 1.86694878986787e-240 -1.09895615549943 0.56 0.845 2.34936835716972e-236 +"Tyrobp" 2.09827975549027e-236 0.480868551605677 0.999 0.997 2.64047524430895e-232 +"Ccnd1" 3.21540343798239e-236 0.869672247722216 0.48 0.117 4.04626368635704e-232 +"Hmox1" 3.07989325431463e-235 -1.71019635541492 0.604 0.882 3.87573767122953e-231 +"Tpi1" 2.14606106744007e-232 -0.690031353879939 0.978 0.992 2.70060324726659e-228 +"Lgals1" 6.59751708158704e-228 0.821274116394926 0.997 0.958 8.30231549546914e-224 +"S100a6" 1.3175863864004e-227 0.830007085015297 0.988 0.979 1.65805070864627e-223 +"Prdx6" 2.05723956412963e-227 -1.19283877544066 0.752 0.9 2.58883026750072e-223 +"mt-Nd5" 2.55150211611958e-217 0.736324815764158 0.892 0.675 3.21081026292488e-213 +"Lgals3" 2.65312290871367e-217 -0.770755153731684 0.995 0.999 3.33868986832528e-213 +"Crip1" 2.65977031419277e-214 1.04327800132122 0.985 0.844 3.34705496338018e-210 +"C1qc" 7.01745933917383e-211 1.8314257138883 0.675 0.474 8.83077083241635e-207 +"S100a4" 1.06727584503537e-209 0.893690626000907 0.881 0.629 1.34305992339251e-205 +"B2m" 4.88787341517918e-209 -0.518311525587378 0.999 1 6.15089990566149e-205 +"Ly86" 1.54746806483377e-207 0.794684108133858 0.784 0.471 1.94733381278682e-203 +"Ccr2" 1.67542373335038e-207 0.863843550444448 0.632 0.28 2.10835322604812e-203 +"P2ry6" 3.2439369797138e-206 0.705553221103848 0.735 0.41 4.08217029527185e-202 +"Psmd8" 1.09694630713318e-205 -0.782829150039012 0.776 0.902 1.38039723289639e-201 +"Ms4a7" 3.19270100989568e-205 1.26764612965136 0.847 0.6 4.01769495085272e-201 +"Ucp2" 5.64081335165321e-201 0.676400009858202 0.996 0.947 7.0983995217204e-197 +"Adam15" 6.93585994954387e-201 0.650327661337503 0.758 0.441 8.72808616050601e-197 +"Pmepa1" 1.2822849631233e-200 0.818816972176272 0.477 0.151 1.61362739759436e-196 +"Ptges" 3.87519725427833e-200 -1.04661887726334 0.035 0.274 4.87654822478385e-196 +"Rhov" 5.95771417387139e-195 -0.807366729542738 0.1 0.392 7.49718751639976e-191 +"Ubb" 2.02260922725205e-192 -0.55698524374676 0.998 1 2.54525145157398e-188 +"Grn" 4.96334262800049e-192 0.63459546260759 0.989 0.944 6.24587036307581e-188 +"Ifitm2" 1.53641230659908e-191 0.72715755871549 0.992 0.893 1.93342124662428e-187 +"Csf1r" 1.84945537196206e-191 0.680133833814758 0.935 0.771 2.32735464007706e-187 +"Fn1" 4.36377691866177e-190 1.81494700925403 0.751 0.518 5.49137687444397e-186 +"Coro1a" 6.19796584320602e-190 0.647819067362985 0.961 0.815 7.79952021709046e-186 +"Tmsb4x" 1.73618568885655e-188 0.706928655991546 0.999 0.996 2.18481607085709e-184 +"Ldha" 3.13234418206278e-184 -0.627703321698136 0.99 0.997 3.94174191870781e-180 +"AW112010" 4.20390181827743e-184 -1.31678256131311 0.777 0.867 5.29019004812032e-180 +"C1qb" 1.36810929199319e-183 1.65095167940633 0.633 0.479 1.72162873304423e-179 +"Arg2" 3.92002028902554e-181 -0.706265104867982 0.331 0.655 4.93295353170974e-177 +"Atf4" 5.61363205655468e-181 -0.923830177882951 0.526 0.748 7.06419457996841e-177 +"mt-Atp8" 8.62414119294352e-181 1.01334068279649 0.923 0.765 1.08526192772001e-176 +"C1qa" 1.25243278532995e-178 1.70340996019429 0.658 0.459 1.57606141705921e-174 +"Itgb5" 4.4716539094688e-175 0.578131338327973 0.51 0.189 5.62712927967554e-171 +"Cx3cr1" 1.37922627038809e-174 0.611621748031671 0.287 0.035 1.73561833865637e-170 +"Slpi" 1.72739141693331e-174 -3.15019514070942 0.238 0.548 2.17374935906888e-170 +"Slc7a11" 3.36668945442794e-174 -0.7962452599963 0.129 0.395 4.23664200945212e-170 +"Cd200" 7.90291848152823e-173 -0.496634510772677 0.009 0.185 9.94503261715513e-169 +"Otulinl" 2.13107535261526e-170 0.545134945068715 0.48 0.169 2.68174522373105e-166 +"Ndrg1" 6.52941403870013e-169 -0.878794704342895 0.589 0.812 8.21661462630025e-165 +"Gabarap" 9.24830436303497e-166 -0.448784739879864 0.996 0.999 1.16380662104432e-161 +"Bsg" 1.35135013666793e-164 -0.638505743163246 0.93 0.973 1.70053901198292e-160 +"Id2" 4.44650839048768e-162 -0.945423642581114 0.608 0.832 5.5954861585897e-158 +"Cfp" 5.5315161105703e-162 0.702100073692679 0.889 0.665 6.96085987354167e-158 +"Bnip3" 9.69351178716169e-162 -0.836246065983806 0.657 0.867 1.21983152329643e-157 +"Lair1" 2.7046910983432e-161 0.583635078960676 0.59 0.272 3.40358327815508e-157 +"Ptpn18" 5.59939753542377e-159 0.553087070788537 0.898 0.68 7.04628185857727e-155 +"Sqstm1" 7.59797220741458e-158 -0.807593235281876 0.831 0.946 9.56128822581051e-154 +"Arpc1b" 1.09358733076059e-157 0.477717829055261 0.999 0.992 1.37617029702913e-153 +"Gusb" 4.60052106029427e-156 0.550111215633691 0.528 0.225 5.78929570227431e-152 +"Ckb" 2.33026221642581e-155 0.881453281469054 0.648 0.346 2.93240197315024e-151 +"Ero1l" 5.28596676021528e-155 -0.927930000210251 0.389 0.65 6.65186057105491e-151 +"Lyz2" 7.14134090228083e-155 0.924622133446451 0.995 0.977 8.9866633914302e-151 +"Cd38" 1.14221207511224e-154 -0.824507101111192 0.243 0.474 1.43735967532124e-150 +"Atp6v0c" 1.37090836264691e-152 -0.442358024640512 0.999 1 1.72515108355487e-148 +"Anxa3" 2.22758372872761e-152 0.619945580341595 0.688 0.391 2.80319136423082e-148 +"Ywhah" 5.95855644640782e-149 0.643547989864739 0.902 0.746 7.4982474321596e-145 +"Rnase4" 8.98724825025963e-149 0.607235691171807 0.577 0.273 1.13095531981267e-144 +"Ch25h" 1.97280806244601e-148 0.96142125902826 0.338 0.081 2.48258166578206e-144 +"Ap3s1" 4.85239274026381e-148 -0.599937115379948 0.466 0.693 6.10625102434798e-144 +"Gm15056" 9.26468906712969e-148 -1.34234896350468 0.038 0.237 1.1658684722076e-143 +"Cd81" 9.89093195696247e-148 0.824422653443768 0.725 0.466 1.24467487746416e-143 +"Ssh2" 1.27709242026497e-147 0.516812816161874 0.479 0.186 1.60709310166144e-143 +"H2-Q4" 5.89792717197108e-147 -0.630188959162866 0.846 0.934 7.42195155320841e-143 +"Bhlhe40" 8.32501343842391e-147 -0.719350177190603 0.193 0.467 1.04761969109126e-142 +"Clec4d" 6.71577013909071e-145 -0.634817714224862 0.747 0.921 8.45112514303175e-141 +"Npc2" 1.17789839072645e-144 -0.516226556997298 1 0.999 1.48226733489017e-140 +"Selenop" 1.52017130701812e-143 0.774971463819781 0.755 0.482 1.91298357275161e-139 +"Gpx1" 1.04524757681936e-142 0.822022233413026 0.999 0.983 1.31533955066948e-138 +"Ccl2" 3.59841016184533e-142 1.37516836432256 0.675 0.382 4.52823934766617e-138 +"Litaf" 1.24482331949669e-141 -0.608130667389731 0.868 0.952 1.56648566525463e-137 +"Alox5ap" 1.08653749602612e-140 0.582955514931765 0.994 0.94 1.36729878499927e-136 +"Rpl10a" 2.36431271843103e-138 0.466859088544414 0.988 0.867 2.97525112487361e-134 +"Phospho1" 2.57263033928884e-138 -0.454710201798033 0.098 0.324 3.23739801896108e-134 +"Ly6i" 1.89180995583071e-137 -1.05169383217311 0.138 0.365 2.38065364841737e-133 +"Nr4a1" 1.13681975774717e-135 1.00552506551672 0.586 0.323 1.43057398314904e-131 +"C5ar1" 2.42403989357264e-135 0.621887113011875 0.781 0.535 3.05041180207182e-131 +"Gsn" 3.53127745090442e-135 0.547221626191362 0.917 0.755 4.44375954421812e-131 +"Aldoa" 5.75267828198817e-135 -0.51857323244864 0.999 0.998 7.23917035005391e-131 +"Sec61b" 1.12251925607105e-134 0.541947960756271 0.905 0.739 1.41257823183981e-130 +"Cyth4" 1.43445228403074e-134 0.525627814527977 0.725 0.456 1.80511475422428e-130 +"Bst1" 3.07648798241091e-133 -0.653627865321833 0.557 0.715 3.87145247706589e-129 +"Sdcbp" 4.63765576540554e-133 -0.497340389586086 0.938 0.974 5.83602601518633e-129 +"Rnf149" 5.10268289881934e-133 -0.654607154409397 0.547 0.731 6.42121615987426e-129 +"Ifi30" 1.44557236149992e-132 0.645883970396326 0.884 0.693 1.8191082597115e-128 +"Lrrfip2" 6.13252459267769e-132 -0.518573083160177 0.37 0.604 7.71716894742561e-128 +"Atp6v1c1" 1.33155147991354e-131 -0.551145968046707 0.396 0.594 1.6756243823232e-127 +"Pgam1" 2.00267673633618e-130 -0.467534882253899 0.977 0.99 2.52016840500544e-126 +"Lgmn" 5.40042105037845e-130 0.699986185163059 0.947 0.8 6.79588984979625e-126 +"Slc3a2" 3.53123900672924e-128 -0.554194716958086 0.662 0.807 4.44371116606807e-124 +"Nme2" 1.41588717187317e-126 0.51804147351302 0.964 0.871 1.7817524170852e-122 +"Klf2" 1.03718330122242e-125 0.944642190023009 0.695 0.439 1.3051914662583e-121 +"Hmga1" 2.29354143256457e-124 -0.539227707113275 0.609 0.792 2.88619253873926e-120 +"Cd24a" 4.09893322481786e-124 -0.769387163922972 0.131 0.361 5.1580975701108e-120 +"Atp5g1" 9.64935197465351e-124 0.535409796109822 0.865 0.7 1.2142744524904e-119 +"Ctsz" 2.18374435021875e-123 -0.439171611826151 0.989 0.992 2.74802389031528e-119 +"Fabp5" 3.21469698435918e-123 -1.29158898469543 0.262 0.519 4.04537468511759e-119 +"Nme1" 1.20556975646998e-122 0.512412173166543 0.728 0.494 1.51708898154182e-118 +"Aif1" 2.52023631546376e-122 0.554980998619227 0.82 0.579 3.1714653793796e-118 +"Psap" 3.06846457681289e-122 -0.639683972071783 0.999 0.999 3.86135582346134e-118 +"Btg1" 5.46356883189316e-122 -0.641618239134193 0.941 0.97 6.87535501805436e-118 +"Ms4a6b" 5.99393337053292e-122 0.54007461563299 0.792 0.558 7.54276575347863e-118 +"Lrp1" 4.92391992594012e-121 0.613692894890343 0.858 0.698 6.19626083480305e-117 +"Ncf1" 1.49223459417627e-120 0.495943510790969 0.648 0.378 1.87782801331142e-116 +"Slc7a2" 2.7629806032285e-119 -0.615547941492675 0.15 0.383 3.47693479110275e-115 +"Pla2g7" 1.06701779070233e-118 -0.619248474378895 0.838 0.91 1.34273518781981e-114 +"H2-DMa" 1.14303150946479e-118 0.534184813431264 0.901 0.725 1.4383908515105e-114 +"Hcar2" 1.33290737777075e-118 -0.777737398863562 0.178 0.429 1.67733064418671e-114 +"Gna13" 2.27963278170838e-117 -0.555366452739382 0.639 0.78 2.86868989250182e-113 +"Rab3il1" 4.44026295135103e-117 0.407183114613427 0.337 0.1 5.58762689798014e-113 +"Ms4a6c" 7.14417348492633e-117 0.5342132053579 0.922 0.754 8.99022791343129e-113 +"Arhgdib" 1.2768614113754e-116 0.41927841349185 0.942 0.773 1.60680240007481e-112 +"Ntpcr" 1.32413432768722e-116 0.609243130996668 0.521 0.278 1.6662906379616e-112 +"Prdx1" 1.8628125240599e-116 -1.08288211258573 0.974 0.971 2.34416328027698e-112 +"Atpif1" 3.11850277516493e-116 0.50645050682128 0.891 0.729 3.92432389226755e-112 +"Apoe" 3.86434726176846e-116 1.06601023424746 0.915 0.787 4.86289459420943e-112 +"H2-K1" 6.77450538847937e-116 -0.455640730479644 1 1 8.52503758086243e-112 +"Mrc1" 2.82300029038354e-115 0.781491568476253 0.444 0.19 3.55246356541865e-111 +"Pfkfb3" 3.57721306361154e-115 -0.520389380678546 0.202 0.443 4.50156491924876e-111 +"Arrb2" 3.62612817982505e-115 0.483843223268943 0.869 0.693 4.56311970149184e-111 +"Clec4e" 4.9330322861504e-115 -0.899160284153606 0.489 0.694 6.20772782889167e-111 +"Tmem189" 5.90269269215473e-115 -0.526100818246833 0.619 0.794 7.42794848380752e-111 +"Cotl1" 8.14285868986635e-115 0.522449868900162 0.875 0.696 1.02469733753278e-110 +"Sdc1" 1.2966537281088e-114 -0.530503794847836 0.065 0.256 1.63170905145212e-110 +"Ddit4" 1.57075095029468e-114 -0.829993767603271 0.18 0.408 1.97663299585082e-110 +"Emp3" 1.20994634377327e-112 0.464355746887691 0.962 0.839 1.52259647900429e-108 +"mt-Co1" 1.45351155847199e-112 0.47406305023129 1 0.995 1.82909894518116e-108 +"Atp1a1" 2.83829514233291e-112 0.45331884062258 0.746 0.504 3.57171060711174e-108 +"Higd1a" 7.46979110645393e-112 -0.570215358483451 0.67 0.805 9.39998512836163e-108 +"Erp29" 1.91238137195753e-111 0.449855022708108 0.922 0.8 2.40654071847135e-107 +"Pkm" 3.10168405474884e-111 -0.400300387878775 0.999 1 3.90315921449595e-107 +"Ptafr" 1.15241040622268e-110 -0.513201889531031 0.228 0.469 1.45019325519062e-106 +"Plpp3" 1.19321344897596e-110 -0.299565147471788 0.024 0.175 1.50153980419134e-106 +"Tmem37" 2.55420019169573e-110 0.528388122918189 0.486 0.228 3.21420552122991e-106 +"Card19" 4.25169127049194e-110 -0.505415890381675 0.939 0.978 5.35032829478706e-106 +"F10" 1.01926252752831e-109 -0.635866727450961 0.259 0.519 1.28263996464163e-105 +"Pgk1" 1.72122088479385e-109 -0.52335268289536 0.966 0.988 2.16598436142459e-105 +"Mt2" 1.90825798708069e-109 -1.07506092040931 0.244 0.468 2.40135185094234e-105 +"P4hb" 2.16990680455264e-109 -0.526492241482886 0.981 0.992 2.73061072284904e-105 +"Rps8" 1.73472837570838e-108 0.425009678293906 1 0.998 2.18298218799143e-104 +"Nrros" 3.98666376760601e-107 0.501509674388543 0.719 0.491 5.0168176851554e-103 +"Clec4a2" 6.9684278172589e-107 0.508565695769173 0.663 0.417 8.76906956523859e-103 +"Inpp5d" 9.33353640000084e-107 0.41072526493917 0.475 0.225 1.17453222057611e-102 +"Dstn" 2.32178023646438e-106 -0.494695087935666 0.612 0.777 2.92172824956678e-102 +"H2-Q6" 3.74485726921694e-106 -0.518215138796688 0.779 0.896 4.7125283875826e-102 +"Cd1d1" 4.86450682001804e-106 -0.351120680270378 0.039 0.2 6.1214953823107e-102 +"Flna" 1.25485292172541e-105 0.522390478414379 0.71 0.49 1.57910691669925e-101 +"Dpep2" 1.25637466079002e-105 0.525926312058089 0.603 0.367 1.58102187313816e-101 +"Spp1" 4.92943404205683e-105 1.34131143832199 0.751 0.508 6.20319979852431e-101 +"Bin1" 5.15102875172103e-105 0.465093305595062 0.546 0.304 6.48205458116574e-101 +"Mirt2" 1.02840192196002e-104 -0.413642908543324 0.063 0.245 1.29414097859449e-100 +"Vapa" 5.26504053043421e-104 -0.42037838517496 0.777 0.874 6.6255270034984e-100 +"Rgs10" 2.44538046102384e-103 0.539936063085032 0.698 0.49 3.0772667721524e-99 +"Lmna" 4.2704343410645e-103 0.569875327044726 0.798 0.61 5.37391457479557e-99 +"Smox" 3.70087074389144e-102 -0.623607072227812 0.628 0.787 4.65717574411299e-98 +"Gm10260" 9.02579907941842e-102 0.399638094058917 0.983 0.879 1.13580655615401e-97 +"Uqcr11" 4.17171967885535e-101 0.431451375296116 0.853 0.691 5.24969204387157e-97 +"Lyl1" 8.69906323345487e-101 0.37863762275964 0.395 0.158 1.09469011729796e-96 +"Cxcl14" 6.08020569566354e-100 0.650977113638324 0.464 0.229 7.651330847423e-96 +"Ssbp4" 5.38038486852366e-99 0.375005530514311 0.463 0.217 6.77067631855017e-95 +"Htra3" 7.53730640814471e-99 0.331909839928796 0.224 0.046 9.48494638400931e-95 +"Folr2" 2.84251511541436e-97 0.551986534553884 0.424 0.192 3.57702102123743e-93 +"Ctsc" 5.7384316077783e-96 0.489221681118416 0.99 0.905 7.22124233522822e-92 +"Cd72" 6.29259903420425e-96 0.54688565244384 0.425 0.189 7.91860662464262e-92 +"Ctsb" 7.49539564907853e-96 -0.60020225878398 0.996 0.997 9.43220588480042e-92 +"Gpr137b" 1.67819799958618e-94 -0.580650725772565 0.463 0.559 2.11184436267925e-90 +"Dram1" 2.95482444117367e-94 -0.379801079854779 0.172 0.377 3.71835107677295e-90 +"Rpl14" 3.08852378862695e-94 0.378738430782025 0.992 0.926 3.88659833560816e-90 +"BC005537" 3.25393667039616e-94 0.440196872628516 0.539 0.302 4.09475390602652e-90 +"Fcgr1" 7.89134138593442e-94 0.533788796049318 0.862 0.685 9.93046400005988e-90 +"Sgk1" 8.66439199071788e-94 -0.702583785573542 0.493 0.659 1.09032708811194e-89 +"Ccl12" 1.75858276806715e-93 1.16514927189636 0.408 0.179 2.2130005553357e-89 +"Tgfbi" 6.54434854763889e-93 0.567683569146125 0.947 0.81 8.23540821234877e-89 +"Zfand5" 6.79598388185061e-92 -0.544597445943414 0.469 0.65 8.55206611692081e-88 +"Arhgap45" 2.70290014927915e-91 0.39403563881595 0.479 0.244 3.40132954785288e-87 +"Ehd4" 3.34423398341188e-91 0.377697890315087 0.465 0.231 4.20838404472551e-87 +"Igfbp4" 7.06416513452015e-91 0.383870231000301 0.252 0.068 8.88954540528015e-87 +"Csk" 1.69300326627629e-90 0.38044163236639 0.541 0.302 2.13047531028208e-86 +"Bmyc" 3.63717510275795e-90 0.314624010485419 0.307 0.104 4.5770211493106e-86 +"Gapdh" 5.41758487588567e-90 -0.391284664610231 1 0.999 6.81748880781453e-86 +"Extl3" 6.37018862394046e-90 0.289857098460066 0.287 0.092 8.01624536436668e-86 +"Ralgds" 8.68740804593619e-90 -0.41932207679774 0.169 0.369 1.09322342850061e-85 +"Fcgrt" 1.15438832005683e-89 0.491207071603013 0.422 0.203 1.45268226195951e-85 +"Lsp1" 3.77291236524201e-89 0.506898192427722 0.792 0.602 4.74783292042055e-85 +"Stab1" 1.10367711529044e-88 0.512585456313194 0.467 0.247 1.38886728188149e-84 +"Sap30" 1.87078988619059e-88 -0.56586700942393 0.382 0.517 2.35420199278224e-84 +"Slamf9" 6.14475500115004e-88 0.450110263831897 0.442 0.212 7.73255969344722e-84 +"Ccl3" 6.70872704048382e-88 -0.971932951444074 0.357 0.584 8.44226210774483e-84 +"Epn1" 1.12222717316879e-87 0.391800382513956 0.694 0.492 1.41221067471561e-83 +"Ctsl" 2.39822326762033e-87 -0.781592894433246 0.968 0.984 3.01792415997342e-83 +"Atp5j" 2.44132688140275e-87 0.3663833041265 0.936 0.827 3.07216574755722e-83 +"Sdhb" 2.86987956615059e-87 0.388086419692659 0.798 0.612 3.6114564460439e-83 +"Il1a" 3.60505546605451e-87 -0.519050072143665 0.052 0.207 4.536601798483e-83 +"Bnip3l" 5.81984388676035e-87 -0.432954477858755 0.574 0.74 7.32369154709922e-83 +"Unc93b1" 8.63663050816981e-87 0.394609830347893 0.943 0.832 1.08683358314809e-82 +"H2-D1" 1.28181570765892e-86 -0.366319169906975 1 1 1.61303688651799e-82 +"Jpt1" 2.41373946796104e-86 0.37838962257962 0.833 0.647 3.03744974648218e-82 +"Lasp1" 8.39092034945889e-86 -0.44712255699279 0.434 0.583 1.05591341677591e-81 +"Fosb" 1.81195151001791e-85 0.501567141378863 0.476 0.259 2.28015978020654e-81 +"Rsad2" 2.30390192392044e-85 -0.986383748087534 0.084 0.254 2.89923018106148e-81 +"Fkbp5" 2.45424366371126e-85 0.294700582992734 0.282 0.093 3.08842022641425e-81 +"Car13" 3.80529579386468e-85 -0.313338536915429 0.109 0.28 4.78858422699932e-81 +"Mt1" 1.4974211696491e-84 -1.09655301450016 0.864 0.94 1.88435479988642e-80 +"Rpl36a" 1.84127250042019e-84 0.381806280226136 0.987 0.925 2.31705731452877e-80 +"Cst3" 1.90415148310891e-84 0.482046530433535 1 0.99 2.39618422634426e-80 +"Ccl5" 3.8389327841873e-84 -1.75213914179351 0.11 0.29 4.83091301562129e-80 +"Myl6" 4.54076045388723e-84 0.368625187474028 0.992 0.967 5.71409295517169e-80 +"Serf2" 5.81291174920491e-84 0.321837692970802 1 0.996 7.31496814519946e-80 +"Adcy7" 8.01110272639437e-84 0.252642821090986 0.237 0.065 1.00811716708947e-79 +"H2-T22" 1.14248512232142e-83 -0.48288302986611 0.699 0.839 1.43770327792928e-79 +"Romo1" 2.46134405737711e-83 0.377803144902844 0.724 0.521 3.09735536180335e-79 +"Dock8" 2.82301370405833e-83 0.314627360993735 0.342 0.138 3.552480445187e-79 +"Tpd52" 2.91261786877969e-83 -0.387142325014266 0.837 0.919 3.66523832607237e-79 +"Ier2" 1.04673277918154e-82 0.551860325495278 0.822 0.639 1.31720852932205e-78 +"Ccl7" 1.18600483860465e-82 1.1864063839566 0.535 0.31 1.49246848890009e-78 +"Sept9" 1.68255985379308e-82 0.347194556661772 0.445 0.223 2.11733332001321e-78 +"Dab2" 3.00555063932111e-82 0.469130685522448 0.837 0.686 3.78218492452168e-78 +"Eif5a" 1.03764826338301e-81 0.381912286479546 0.981 0.936 1.30577657464118e-77 +"Eif5" 3.30471661501795e-81 -0.42471301644535 0.54 0.689 4.15865538833859e-77 +"Trem2" 3.91561970149759e-81 0.393526921396207 0.918 0.787 4.92741583236457e-77 +"Hsp90ab1" 8.80198740264004e-81 0.382878783890621 0.995 0.964 1.10764209474822e-76 +"Atp6v1a" 9.87831857800304e-81 -0.438000509485242 0.486 0.641 1.2430876098559e-76 +"Stk17b" 1.30882148625687e-80 0.418980253617637 0.593 0.381 1.64702095830564e-76 +"Dusp4" 1.45476667361602e-80 -0.466846104773999 0.113 0.276 1.83067838207841e-76 +"Camk1" 1.50330764625067e-80 0.427743422257516 0.509 0.297 1.89176234204185e-76 +"Tnfrsf9" 6.48765818744093e-80 -0.871501862102165 0.082 0.241 8.16406906307566e-76 +"Gla" 7.25504488314242e-80 -0.375663049714602 0.205 0.396 9.12974848094642e-76 +"Ssr4" 8.9800357549701e-80 0.370642613151324 0.901 0.773 1.13004769940544e-75 +"Olfml3" 1.03565305120724e-79 0.305484125008686 0.229 0.064 1.30326579963919e-75 +"Dock2" 1.25558202087274e-79 0.346587063014209 0.424 0.21 1.58002441506625e-75 +"Ppp1r18" 1.35914206178154e-79 0.369478162991651 0.851 0.689 1.71034437054589e-75 +"Wnk1" 1.37980153471682e-79 0.41021677788072 0.513 0.3 1.73634225128765e-75 +"Nfic" 3.89339077384377e-79 0.344839085863621 0.392 0.182 4.899442949805e-75 +"Tnfrsf11a" 4.59482861664006e-79 0.284524024893313 0.278 0.096 5.78213233117985e-75 +"Atp5g3" 7.33898459276453e-79 0.350579467516236 0.977 0.943 9.23537821153488e-75 +"Samd8" 1.57015985639631e-78 -0.361578863998149 0.145 0.318 1.97588916328912e-74 +"Sigmar1" 3.31008823841402e-78 0.333933952504078 0.402 0.193 4.1654150392202e-74 +"Mmp8" 4.43062690955416e-78 -0.688189434206814 0.07 0.228 5.57550090298296e-74 +"Naa50" 9.265551477115e-78 -0.418193518891996 0.326 0.441 1.16597699788015e-73 +"Ap1b1" 2.11513039297331e-77 0.326207584464943 0.33 0.136 2.66168008651761e-73 +"Tgif1" 2.99441958339282e-77 -0.442498605414562 0.425 0.611 3.76817760374153e-73 +"Cox4i1" 5.63798703152199e-77 0.294197847699566 0.995 0.97 7.09484288046727e-73 +"Wfdc17" 9.60785087125078e-77 -1.08950897196545 0.602 0.787 1.2090519536382e-72 +"Sla" 2.41372373136282e-76 0.347072594103852 0.446 0.229 3.03742994354697e-72 +"Basp1" 4.38888824294523e-76 -0.50061196372569 0.701 0.793 5.52297696492228e-72 +"Rpl36al" 6.3121978420971e-76 0.328450123344453 0.985 0.935 7.94326976449499e-72 +"Pou2f2" 8.77344518716891e-76 0.286788977041608 0.231 0.069 1.10405034235334e-71 +"Bhlhe41" 1.06932249523931e-75 -0.346350344706545 0.066 0.208 1.34563542800914e-71 +"Ass1" 1.56041202312598e-75 -0.724678017573273 0.471 0.641 1.96362248990173e-71 +"Tent5c" 2.06951850275612e-75 -0.428295742901741 0.097 0.255 2.60428208386831e-71 +"Nr4a2" 3.03798227447637e-75 0.412905178671073 0.268 0.094 3.82299689420107e-71 +"Plk2" 3.4650309732026e-75 -0.621678426682978 0.149 0.322 4.36039497667816e-71 +"Vat1" 4.16965811531124e-75 -0.437238855984532 0.522 0.652 5.24709777230767e-71 +"Pltp" 5.9886733952164e-75 0.648989468620342 0.608 0.406 7.53614660054031e-71 +"Atp2b4" 6.50304135934507e-75 0.262150489895997 0.225 0.066 8.18342724659984e-71 +"Mef2a" 7.62985854510567e-75 0.360218292571488 0.468 0.259 9.60141399316098e-71 +"Kcnn4" 1.05917608235222e-74 0.337554097243495 0.407 0.197 1.33286718203203e-70 +"Gpi1" 1.11712327453548e-74 -0.422291488744494 0.975 0.982 1.40578792867545e-70 +"Rps27a" 1.19440173136325e-74 0.337935180749241 1 0.997 1.50303513874752e-70 +"Rpn1" 1.41383397019488e-74 0.384486751202777 0.507 0.304 1.77916866809323e-70 +"Dok2" 2.57029381155253e-74 0.395397691145218 0.48 0.271 3.23445773245771e-70 +"Plec" 3.40808435191723e-74 0.44035289175875 0.616 0.413 4.28873334845265e-70 +"Itm2b" 3.67676297006547e-74 0.389026471215264 0.999 0.997 4.62683852153039e-70 +"Ifngr1" 4.45131017290468e-74 0.47894974224077 0.664 0.497 5.60152872158325e-70 +"Gm5150" 5.36325229491605e-74 0.519355836781004 0.546 0.35 6.74911668792236e-70 +"Aprt" 7.70224036749379e-74 0.34947433055732 0.972 0.931 9.69249927845419e-70 +"Fmnl1" 8.35267166309903e-74 0.356350933026612 0.515 0.304 1.05110020208438e-69 +"Smdt1" 1.79466455365448e-73 0.368370459336364 0.893 0.788 2.2584058743188e-69 +"Lyn" 1.79509515901382e-73 0.379279542705535 0.826 0.661 2.258947748103e-69 +"Chchd10" 1.98606009475229e-73 -0.413499483871465 0.233 0.405 2.49925802323628e-69 +"Maf" 2.11866624249718e-73 0.405404339165447 0.405 0.203 2.66612959955845e-69 +"Rpl11" 7.38039743672578e-73 0.315028103649149 1 0.994 9.28749213437573e-69 +"Hexb" 9.84205038028372e-73 0.540176322527632 0.708 0.556 1.2385236198549e-68 +"Mafb" 1.12515917447898e-72 0.574018942174789 0.924 0.811 1.41590030516435e-68 +"Adgre1" 1.12692930480762e-72 0.386914904840537 0.462 0.259 1.41812783716991e-68 +"Cd9" 1.52435006216533e-72 -0.460433062396908 0.675 0.841 1.91824211822885e-68 +"Cfh" 1.7053135695315e-72 0.267004522746541 0.214 0.06 2.14596659589844e-68 +"Arpc2" 4.94218116480663e-72 0.290023605806728 0.997 0.992 6.21924077779267e-68 +"Upp1" 9.62312468477498e-71 -0.589799877005647 0.436 0.627 1.21097401033208e-66 +"Siglec1" 1.01372343110606e-70 0.282221731196361 0.211 0.061 1.27566956570386e-66 +"Bri3" 1.56202672089382e-70 -0.347326635407361 0.896 0.942 1.96565442557279e-66 +"Gnai2" 1.95939072535302e-70 0.305791150552965 0.983 0.937 2.46569728878424e-66 +"Pdia3" 5.94365660573847e-70 0.418551525454329 0.855 0.744 7.47949747266129e-66 +"Slfn2" 1.33874464902642e-69 -0.434820611439724 0.728 0.84 1.68467626633484e-65 +"Hgsnat" 2.09588076348896e-69 0.325353710513407 0.338 0.157 2.6374563527745e-65 +"H2-Q1" 2.88905420649412e-69 -0.383849259280906 0.622 0.775 3.6355858134522e-65 +"Mgarp" 3.16953050341257e-69 -0.302085251601408 0.109 0.268 3.98853718549438e-65 +"Tpm3-rs7" 1.47533893133259e-68 0.33204549218167 0.492 0.287 1.85656651118894e-64 +"Rpl37" 1.50611795348877e-68 0.343499869550049 1 0.994 1.89529883267027e-64 +"Slc25a37" 2.11320061257784e-68 -0.316528746668423 0.179 0.354 2.65925165086795e-64 +"Mgst3" 9.18900464065144e-68 0.321954691823141 0.43 0.231 1.15634434397958e-63 +"Clec4n" 1.35548629883205e-67 -0.595550758139134 0.77 0.809 1.70574395845025e-63 +"Rac2" 1.36636073196509e-67 0.362781900522053 0.885 0.751 1.71942834510487e-63 +"Cebpb" 1.58080486935944e-67 -0.466027010555198 0.984 0.992 1.98928484760192e-63 +"Ndufb11" 2.81504251562311e-66 0.337673083868715 0.741 0.581 3.54244950166012e-62 +"Atp6v1g1" 6.65430316009653e-66 -0.306145242762307 0.924 0.957 8.37377509666548e-62 +"Adamtsl5" 6.78191332643936e-66 -0.264805719776869 0.061 0.19 8.53435972999129e-62 +"Mdm2" 8.76570047509589e-66 -0.432872384721841 0.331 0.509 1.10307574778607e-61 +"Abcc3" 2.29907726497578e-65 0.265173469983771 0.294 0.122 2.89315883024552e-61 +"Comt" 2.74726779200965e-65 0.314552174956223 0.438 0.253 3.45716178946494e-61 +"Ndufb8" 3.8954353278338e-65 0.331293757575934 0.888 0.781 4.90201581654606e-61 +"Pmp22" 4.09502431837876e-65 -0.679852994703857 0.222 0.346 5.15317860224784e-61 +"Tln1" 7.84614430552238e-65 0.359924538890223 0.758 0.595 9.87358799406936e-61 +"Map1lc3b" 1.35880156876584e-64 -0.348512066968547 0.749 0.856 1.70991589413494e-60 +"Pnrc1" 1.65487565353194e-64 -0.438032417686076 0.821 0.906 2.08249552240459e-60 +"Cox5b" 1.74099020329484e-64 0.307665211304894 0.964 0.904 2.19086207182623e-60 +"Il10ra" 2.61180490365919e-64 0.334455052495732 0.454 0.257 3.28669529076472e-60 +"Pfn1" 6.3952199576076e-64 0.27976999868661 1 0.999 8.0477447946534e-60 +"H2-DMb2" 6.78096896062467e-64 0.569593905066124 0.702 0.537 8.53317134005009e-60 +"Myl12b" 1.26686442382467e-63 0.292996417673467 0.965 0.877 1.59422219094096e-59 +"Rab9" 1.73478722624656e-63 -0.321127948070816 0.269 0.428 2.18305624550867e-59 +"Rpl38" 2.17373646082444e-63 0.362577665349762 0.996 0.967 2.73542996230147e-59 +"Soat1" 2.51690809819367e-63 -0.358312339453242 0.396 0.564 3.16727715076691e-59 +"Twf2" 3.03148324898424e-63 0.317600614952726 0.48 0.282 3.81481852052177e-59 +"2410006H16Rik" 4.46335218982536e-63 -0.527345974266183 0.618 0.735 5.61668239567623e-59 +"Rab1b" 7.72814313514549e-63 0.318871126378996 0.655 0.466 9.72509532126709e-59 +"Rack1" 8.38721190607508e-63 0.328473132695129 0.954 0.87 1.05544674626049e-58 +"Snrpb" 2.57259453566485e-62 0.330730188345383 0.797 0.649 3.23735296368065e-58 +"M6pr" 4.52583401502769e-62 -0.31514423563557 0.78 0.865 5.69530952451085e-58 +"Eif4ebp1" 5.99074268388058e-62 -0.356596129693974 0.875 0.922 7.53875059339532e-58 +"Mcl1" 8.77899218613164e-62 -0.369071799618518 0.905 0.954 1.10474837670281e-57 +"Clta" 9.22490003154387e-62 0.312000928496604 0.981 0.952 1.16086141996948e-57 +"Rhog" 9.23677427323442e-62 0.289972525496559 0.972 0.901 1.16235567454382e-57 +"Rilpl2" 9.7080841418032e-62 -0.464592997417895 0.426 0.521 1.22166530840451e-57 +"Creg1" 1.65585622870951e-61 -0.393291175758029 0.706 0.742 2.08372947820805e-57 +"Hvcn1" 2.44560407145918e-61 -0.270144314960702 0.113 0.259 3.07754816352424e-57 +"Rps11" 2.6233917374969e-61 0.286044829494666 0.999 0.975 3.3012761624661e-57 +"Pdpn" 2.66740738275567e-61 -0.51337946616785 0.619 0.709 3.35666545045974e-57 +"Cltc" 3.00376551185066e-61 0.357847524098244 0.569 0.39 3.77993852011287e-57 +"Procr" 4.27958002417379e-61 -0.270870170525972 0.047 0.166 5.3854235024203e-57 +"Slc48a1" 5.12931337398541e-61 -0.402537970884392 0.47 0.594 6.45472794982324e-57 +"Tax1bp1" 5.14161787014221e-61 -0.355078615392328 0.503 0.651 6.47021192778695e-57 +"Laptm5" 6.79729915845519e-61 0.300608951391313 0.994 0.979 8.55372126100001e-57 +"Ciao2a" 7.66687024309609e-61 0.336923173747125 0.791 0.649 9.64798951391212e-57 +"Adm" 1.05003755786393e-60 -0.288536345817306 0.018 0.109 1.32136726281596e-56 +"Nfam1" 1.41628932203105e-60 0.271939135279338 0.34 0.164 1.78225848284387e-56 +"Tm2d2" 1.89382415718044e-60 0.31242329518547 0.545 0.357 2.38318831939586e-56 +"Ccnd3" 1.916490230449e-60 0.310776432489639 0.516 0.319 2.41171130599702e-56 +"Cybb" 3.24808678836404e-60 -0.44836679446738 0.727 0.793 4.0873924144773e-56 +"Acsl1" 3.69243686903661e-60 -0.35012696952134 0.143 0.292 4.64656255599567e-56 +"Cox6a1" 4.05649562194068e-60 0.299088928990691 0.931 0.842 5.10469409065015e-56 +"Psmb2" 5.69291497396414e-60 0.317368009108983 0.814 0.667 7.16396420323648e-56 +"Akr1b3" 5.72265138653885e-60 0.290658008455747 0.425 0.236 7.20138450482049e-56 +"Lrrc25" 6.30321997551426e-60 0.32174831165187 0.502 0.31 7.93197201718714e-56 +"Cyb5a" 3.35360162839756e-59 -0.373766983175629 0.514 0.592 4.2201722891755e-55 +"Snhg12" 7.47953318382484e-59 -0.329915233870314 0.171 0.303 9.41224455852518e-55 +"Rps17" 8.04471184528245e-59 0.342733961472793 0.915 0.826 1.01234653861034e-54 +"Cxcl16" 1.09243772013556e-58 -0.377017416909435 0.885 0.916 1.37472362701859e-54 +"Fuca1" 1.64999904580044e-58 0.308330603141826 0.634 0.45 2.07635879923527e-54 +"Ube2d3" 2.05350079675104e-58 -0.296528922160374 0.932 0.958 2.58412540263151e-54 +"Nop10" 3.0873031122428e-58 0.327078098333839 0.705 0.536 3.88506223644634e-54 +"Tiparp" 4.01988866154105e-58 -0.374684621690023 0.249 0.41 5.05862789168325e-54 +"Ap2a2" 5.16978775301389e-58 0.289057055968445 0.361 0.188 6.50566090839268e-54 +"Ptms" 8.09502683773364e-58 0.340651413178664 0.858 0.739 1.0186781772604e-53 +"Fnip2" 8.65132670276977e-58 -0.314467900810417 0.184 0.34 1.08868295227655e-53 +"Atp5j2" 1.92832207911007e-57 0.294996454214277 0.952 0.892 2.42660050435211e-53 +"Ilk" 3.69391806579636e-57 0.3037036038507 0.581 0.394 4.64842649399814e-53 +"Txn1" 6.25194956588717e-57 -0.32695264854585 0.958 0.978 7.86745333371241e-53 +"Slamf7" 6.82691439690351e-57 -0.289687481173612 0.056 0.165 8.59098907706338e-53 +"Igsf6" 7.91189548587094e-57 -0.335141865706518 0.414 0.54 9.95632927941999e-53 +"Limd2" 9.39215231437613e-57 0.327136918613933 0.514 0.321 1.18190844724109e-52 +"Fkbp2" 9.7118584296468e-57 0.303625418388995 0.629 0.445 1.22214026478675e-52 +"Irf7" 1.06076667954442e-56 -0.514762720442322 0.677 0.823 1.3348687895387e-52 +"Mthfsl" 1.26048951859065e-56 -0.327840514734013 0.336 0.471 1.58620001019447e-52 +"Rpl35a" 1.64027716681569e-56 0.27105870953196 1 0.985 2.06412478672086e-52 +"Parp10" 1.67031941002639e-56 -0.303184323282144 0.185 0.344 2.10192994557721e-52 +"Ankrd33b" 2.37239940354016e-56 -0.267445557356125 0.041 0.148 2.98542740941494e-52 +"Rps7" 3.02854865947644e-56 0.288659222837417 0.999 0.976 3.81112563308516e-52 +"Csf2ra" 3.83398702267741e-56 0.315910543814918 0.827 0.678 4.82468926933725e-52 +"Dok3" 4.00390306876255e-56 0.313942246004514 0.628 0.446 5.03851162173079e-52 +"Ankrd37" 4.62863346583587e-56 -0.423470628267059 0.286 0.45 5.82467235340785e-52 +"Tnfaip2" 5.39487892511972e-56 -0.376080506784117 0.343 0.534 6.78891563937066e-52 +"Ndufa13" 7.15700350008666e-56 0.300352875270723 0.851 0.735 9.00637320450905e-52 +"Calm1" 7.82943011502457e-56 0.334617886823292 0.995 0.983 9.85255485674692e-52 +"Eno2" 8.30641137589058e-56 -0.283160345528066 0.202 0.371 1.04527880754207e-51 +"Fam20c" 1.48259306981193e-55 -0.452213887920598 0.295 0.431 1.86569511905133e-51 +"Ccrl2" 2.3411539571113e-55 -0.435612587429144 0.533 0.718 2.94610813962886e-51 +"Lsm7" 3.04336874068155e-55 0.289230409885156 0.448 0.269 3.82977522327367e-51 +"Eno1b" 3.16099837687883e-55 -0.321544064002342 0.76 0.853 3.97780035746433e-51 +"Pdia6" 3.56809348564926e-55 0.404488445265549 0.715 0.577 4.49008884234103e-51 +"Btg3" 7.56319988576296e-55 -0.308340757306668 0.2 0.352 9.51753073624411e-51 +"Rpl3" 9.61371638041781e-55 0.294855239468369 0.993 0.952 1.20979006931178e-50 +"Actb" 1.13931192201979e-54 0.337585484255836 1 1 1.43371012266971e-50 +"S100a10" 1.87572547026652e-54 0.387824533099269 0.973 0.946 2.36041293178339e-50 +"Mmp13" 2.51011188610504e-54 -0.6367908258877 0.052 0.16 3.15872479747459e-50 +"Tmem140" 2.63703646299139e-54 -0.374262721845495 0.22 0.371 3.31844668502836e-50 +"Malt1" 4.49699502100795e-54 -0.302944719262197 0.114 0.254 5.6590185344364e-50 +"Ost4" 5.54212301738506e-54 0.284670813415119 0.954 0.895 6.97420760507736e-50 +"Ddit3" 1.00668120671325e-53 -0.274425647637488 0.113 0.254 1.26680763052795e-49 +"Vdac1" 2.46970790321509e-53 -0.357266660715992 0.728 0.779 3.10788042540587e-49 +"Hnrnpa2b1" 3.2155476410737e-53 0.322444576943071 0.887 0.769 4.04644515152715e-49 +"Tbxas1" 4.58869648813693e-53 0.261640938920245 0.346 0.182 5.77441566067152e-49 +"Apobec1" 4.91667261901208e-53 0.379549944138023 0.755 0.616 6.1871408237648e-49 +"Plxnb2" 4.91802186254456e-53 0.292756221136722 0.481 0.304 6.18883871182607e-49 +"H2-DMb1" 5.03365601214506e-53 0.424921825990193 0.419 0.262 6.33435272568335e-49 +"Eno1" 8.43278369041754e-53 -0.351409479198554 0.956 0.973 1.06118149960214e-48 +"Plod1" 1.12816166886671e-52 0.285700773107418 0.408 0.24 1.41967864410187e-48 +"Ndufa4" 2.32255182457406e-52 0.329247723391574 0.812 0.688 2.922699216044e-48 +"Jaml" 3.25111408126285e-52 0.343357130017628 0.491 0.31 4.09120195986117e-48 +"Bax" 5.00207308971562e-52 -0.302105928106756 0.839 0.887 6.29460877609814e-48 +"Adam10" 6.15186060437503e-52 0.259356103829631 0.334 0.179 7.74150138454554e-48 +"Ndufb4" 8.23448935262744e-52 0.291155130327964 0.727 0.579 1.03622814013464e-47 +"Ifrd1" 8.43713878563906e-52 -0.489392935282241 0.526 0.68 1.06172954478482e-47 +"Mbnl1" 1.38207449733752e-51 0.260972193889823 0.351 0.188 1.73920254744954e-47 +"Rpl35" 1.58604852375337e-51 0.293581243166726 0.999 0.988 1.99588346229124e-47 +"Ly6e" 1.62313318933492e-51 0.42170590538028 0.965 0.94 2.04255080545906e-47 +"Msr1" 2.36248350975474e-51 0.327674708802079 0.852 0.735 2.97294924867537e-47 +"Ndufa3" 2.3778313421958e-51 0.308695478032925 0.83 0.727 2.9922629610192e-47 +"Cmtm7" 2.64845002690548e-51 0.303102690149559 0.824 0.701 3.33280951385786e-47 +"Tifab" 3.5141821531863e-51 0.2608440458693 0.5 0.315 4.42224682156964e-47 +"Rps4x" 3.68786024343497e-51 0.299345947691 0.999 0.991 4.64080333033857e-47 +"Znrf1" 6.45703743544193e-51 -0.258203408584323 0.209 0.369 8.12553590876012e-47 +"Celf2" 7.84412310868045e-51 0.259999389480969 0.353 0.194 9.87104451996347e-47 +"Srgn" 9.10986467878374e-51 -0.415988519712348 0.995 0.994 1.14638537117815e-46 +"Gyg" 1.51309354528999e-50 -0.346581082980834 0.395 0.545 1.90407691739292e-46 +"Apoc2" 2.45380392740576e-50 0.538389565048239 0.55 0.417 3.08786686224741e-46 +"Lhfpl2" 2.7211062989206e-50 -0.316270380792251 0.174 0.312 3.42424016656168e-46 +"Acod1" 2.92981917191667e-50 -0.476278596237802 0.221 0.389 3.68688444593994e-46 +"Cbr2" 2.93860596498261e-50 0.388369441522045 0.134 0.032 3.69794174633411e-46 +"Egln3" 3.12328155478152e-50 -0.34278103409587 0.194 0.348 3.93033750853706e-46 +"Rps21" 3.38962267296448e-50 0.29115911754193 0.996 0.969 4.2655011716585e-46 +"Snx2" 3.62675304580968e-50 0.36029748925463 0.592 0.438 4.5639060328469e-46 +"Cd33" 3.85663456288885e-50 0.257335027170043 0.237 0.1 4.85318893393933e-46 +"Cd164" 4.79518149764513e-50 -0.274269427642365 0.239 0.405 6.03425639663663e-46 +"Tsc22d4" 6.02096827048602e-50 0.295308796051118 0.684 0.524 7.57678647157961e-46 +"1810058I24Rik" 8.94341510462634e-50 -0.294393420296669 0.717 0.79 1.12543935676618e-45 +"C3" 1.00970630898083e-49 -0.476174938128431 0.278 0.44 1.27061441922147e-45 +"Clec4a3" 1.05554585165169e-49 0.290003955335235 0.367 0.2 1.32829889971848e-45 +"Fermt3" 1.19022773397562e-49 0.296051332498534 0.671 0.506 1.49778258043492e-45 +"Slc25a3" 1.32811505870967e-49 0.27139086322129 0.959 0.914 1.67129998988025e-45 +"Naaa" 1.37318641147215e-49 0.27694166691971 0.307 0.152 1.72801778019656e-45 +"Clec4a1" 2.40372112669622e-49 0.325118197732514 0.477 0.302 3.02484266583452e-45 +"Gabarapl1" 2.50994864775579e-49 -0.270702539453615 0.249 0.38 3.15851937833589e-45 +"Ndufc1" 3.94591249810691e-49 0.309293307788019 0.767 0.649 4.96553628761774e-45 +"Cd52" 1.17749841602181e-48 0.33001494665798 0.973 0.935 1.48176400672184e-44 +"Rpl6" 1.24715462628481e-48 0.271164303098591 1 0.99 1.5694193817168e-44 +"Clec12a" 1.25716854423867e-48 0.311195624568313 0.417 0.244 1.58202089606994e-44 +"Scand1" 1.5175468644852e-48 -0.276144407385272 0.912 0.949 1.90968097426818e-44 +"Atp5a1" 2.83122263063686e-48 0.297157837113476 0.742 0.614 3.56281055839342e-44 +"Esyt1" 2.93017646133908e-48 0.269210429271532 0.416 0.254 3.6873340589491e-44 +"Timm10b" 3.46447629976001e-48 0.272611871882685 0.803 0.663 4.359696975618e-44 +"Ftl1-ps1" 3.83982141650155e-48 -0.269428407502502 0.245 0.375 4.83203127052556e-44 +"Dpm3" 4.06227807171144e-48 0.279492764581637 0.562 0.394 5.11197072544167e-44 +"Sdf2l1" 4.63554948146959e-48 0.360294345242975 0.523 0.366 5.83337546748133e-44 +"Glo1" 6.3777502227616e-48 0.253885443410902 0.486 0.31 8.0257608803232e-44 +"Mrpl33" 7.06266312100876e-48 0.29053090306407 0.848 0.737 8.88765527147742e-44 +"Mgst1" 7.36267640555192e-48 -0.427516355990591 0.425 0.554 9.26519198874654e-44 +"Arhgap30" 9.20581422962486e-48 0.271075907516048 0.426 0.259 1.15845966265599e-43 +"Creb5" 1.4942376400178e-47 -0.30772388578062 0.393 0.508 1.8803486461984e-43 +"Osbpl8" 1.51145462863299e-47 -0.315228209658033 0.261 0.401 1.90201450467176e-43 +"Gde1" 1.76182429613005e-47 -0.32475318520414 0.419 0.513 2.21707969425005e-43 +"Ranbp1" 1.87089717197346e-47 0.3301104439673 0.564 0.403 2.35433700121141e-43 +"Serinc3" 1.9391583594164e-47 0.312827098889776 0.496 0.344 2.44023687948959e-43 +"Naa38" 2.33371643863547e-47 0.251625595261218 0.435 0.265 2.93674876637887e-43 +"S100a8" 2.39148936990948e-47 -0.561223902674104 0.458 0.637 3.00945022309409e-43 +"Slamf8" 3.17129470466571e-47 -0.350640598348483 0.244 0.39 3.99075725635133e-43 +"Cd40" 4.04170962277927e-47 -0.315584110611766 0.201 0.351 5.08608738930544e-43 +"Wdfy1" 5.19082728346485e-47 -0.267132281871741 0.204 0.326 6.53213705351217e-43 +"Irak2" 5.54508842681533e-47 -0.303145622823677 0.308 0.456 6.97793927630441e-43 +"Smpdl3b" 5.79761221996121e-47 -0.293601913655269 0.274 0.34 7.29571521759919e-43 +"Tnip1" 5.8041096818506e-47 -0.271925164451695 0.219 0.327 7.30389162364079e-43 +"Gnas" 6.81195820349209e-47 -0.260491506365134 0.863 0.943 8.57216820327444e-43 +"Atp5e" 8.21740025192813e-47 0.251386619373474 0.995 0.981 1.03407764770264e-42 +"Cd53" 9.29688150445108e-47 -0.288299435343916 0.773 0.863 1.16991956852012e-42 +"Havcr2" 1.67152682084361e-46 0.286649615016282 0.405 0.25 2.1034493513496e-42 +"Sp140" 1.83481198258868e-46 -0.367474799159628 0.559 0.685 2.30892739888959e-42 +"Kctd12" 2.02424798049282e-46 0.250406877998894 0.302 0.152 2.54731365865216e-42 +"Psmb3" 2.19188859655964e-46 0.285192628910011 0.84 0.734 2.75827260991065e-42 +"Plk3" 4.72462405037499e-46 0.365290476108532 0.526 0.366 5.94546690499188e-42 +"Plp2" 4.81071462891071e-46 0.318589125378401 0.843 0.758 6.05380328902124e-42 +"Zfas1" 6.77739351003319e-46 -0.328171415728593 0.222 0.343 8.52867199302576e-42 +"Traf1" 9.36128615528119e-46 -0.26019296164003 0.11 0.239 1.17802424978058e-41 +"Atp13a2" 1.15723051518443e-45 0.266810935949525 0.476 0.309 1.45625888030809e-41 +"Myo1f" 1.93400523752539e-45 0.255565206972273 0.452 0.283 2.43375219090195e-41 +"Calr" 2.65331647867731e-45 0.333992778668246 0.813 0.698 3.33893345676752e-41 +"Rtcb" 3.18304558392446e-45 0.290740744690668 0.534 0.373 4.00554456281054e-41 +"Dnajc5" 5.59899950007915e-45 -0.271725259251195 0.341 0.476 7.0457809708996e-41 +"Rpl28" 6.19249860351635e-45 0.255695655765818 1 0.989 7.79264024266498e-41 +"Nedd8" 6.81044958935666e-45 0.256135134816635 0.884 0.79 8.57026976324642e-41 +"Hsp90b1" 6.82581224507789e-45 0.370697022674152 0.832 0.727 8.58960212920602e-41 +"Slc11a1" 7.24109265961481e-45 -0.318839715177726 0.601 0.685 9.11219100285927e-41 +"Ptpn6" 9.00369325740643e-45 0.258497511387375 0.633 0.46 1.13302475951203e-40 +"Zfp36" 9.42809862450378e-45 0.485588980589124 0.936 0.885 1.18643193090756e-40 +"Sh3glb1" 1.08241291571015e-44 -0.264872449545615 0.936 0.951 1.36210841312965e-40 +"Cytip" 1.42248770151965e-44 0.304271704055355 0.318 0.167 1.79005852359233e-40 +"Pgls" 5.35067415637083e-44 0.27564788005325 0.752 0.618 6.73328835837706e-40 +"Junb" 5.89404709062513e-44 0.48390202336592 0.955 0.923 7.41706885884266e-40 +"Lamtor2" 8.70509216687462e-44 0.25718104786508 0.846 0.733 1.0954487982795e-39 +"Slc6a8" 1.06946904144364e-43 -0.251529116829637 0.161 0.284 1.34581984175268e-39 +"Cox5a" 1.18155095163464e-43 0.276732801113699 0.937 0.892 1.48686371753704e-39 +"Azin1" 2.30650255934616e-43 -0.292360707882463 0.266 0.396 2.90250282068121e-39 +"Ndufb2" 2.69202740187846e-43 0.263179892442776 0.553 0.398 3.38764728252386e-39 +"Rgs1" 2.94994525543876e-43 -0.552265336305235 0.704 0.781 3.71221110944414e-39 +"Macf1" 3.19669670530946e-43 0.269362519882502 0.385 0.237 4.02272313396142e-39 +"Arl8b" 3.48829763085087e-43 -0.270033522220735 0.374 0.481 4.38967373866273e-39 +"Ubl3" 5.04383361785828e-43 0.260923828391442 0.548 0.383 6.34716022471286e-39 +"Pira2" 1.05832712511217e-42 0.312702198075607 0.488 0.332 1.33179885424116e-38 +"Rpl5" 1.10669357964528e-42 0.260654960173486 0.893 0.785 1.39266320062562e-38 +"Pitpna" 1.14970959270383e-42 0.26775665150765 0.718 0.567 1.4467945514585e-38 +"Ostc" 1.24457408360429e-42 0.270482159973701 0.596 0.452 1.56617202680763e-38 +"Rpl21" 1.55833913319507e-42 0.251621617578032 0.999 0.988 1.96101396521267e-38 +"Ghitm" 2.14621715920209e-42 -0.267851364101749 0.534 0.627 2.70079967313991e-38 +"Park7" 2.5993014002154e-42 0.261318293261236 0.787 0.651 3.27096088203106e-38 +"Atf3" 3.0763901342311e-42 -0.531160187589823 0.619 0.735 3.87132934491641e-38 +"Rps28" 3.40424588162275e-42 0.283451528881952 0.995 0.967 4.28390301743407e-38 +"Ywhab" 4.53871258575554e-42 0.267119988956429 0.787 0.66 5.71151591791477e-38 +"Ppp1r15a" 5.0327985270493e-42 -0.383224400211453 0.463 0.592 6.33327366643883e-38 +"Arrdc4" 5.50207034618532e-42 -0.323445383237127 0.45 0.594 6.92380532363961e-38 +"Lilr4b" 7.57151947920873e-42 -0.347339459806135 0.83 0.9 9.52800011263626e-38 +"Rbm39" 1.23520042068333e-41 -0.28333014574933 0.836 0.892 1.5543762093879e-37 +"Svbp" 1.3871088773129e-41 0.269930823600734 0.678 0.536 1.74553781121056e-37 +"Rgs2" 1.49887989264735e-41 0.310494587215658 0.384 0.235 1.88619045690743e-37 +"Ppp1ca" 1.74791987396477e-41 0.250155925947605 0.895 0.805 2.19958236939726e-37 +"H2afz" 2.67906931201313e-41 0.308273248263866 0.962 0.904 3.37134082223732e-37 +"Blvrb" 3.3314880064667e-41 -0.342567004287369 0.701 0.762 4.1923445073377e-37 +"Mettl9" 6.9203579533263e-41 -0.253302887121979 0.349 0.468 8.70857844846582e-37 +"Ifitm6" 7.09722122609296e-41 0.506828589172907 0.428 0.291 8.93114319091538e-37 +"Dynll1" 7.61893993382397e-41 0.265865126914733 0.891 0.793 9.58767401272409e-37 +"Wdr1" 9.42393980278456e-41 0.255610205926989 0.733 0.588 1.18590858478241e-36 +"Tnfaip8l2" 2.20986681950165e-40 0.261299915097518 0.563 0.404 2.78089640566088e-36 +"Susd3" 2.27709340044536e-40 0.251797876471866 0.419 0.265 2.86549433512044e-36 +"Klra2" 2.4100227301891e-40 0.278935508957256 0.468 0.317 3.03277260366997e-36 +"Selenof" 2.60348539381937e-40 0.251481797643725 0.839 0.733 3.2762260195823e-36 +"Rabac1" 3.09222795557651e-40 -0.268750246087525 0.71 0.798 3.89125965929748e-36 +"Sra1" 4.07297753019682e-40 -0.252335130771757 0.56 0.686 5.12543492399968e-36 +"Cyfip1" 5.21768843100152e-40 0.252649064590772 0.558 0.398 6.56593912157232e-36 +"Gstm1" 6.40883813046755e-40 -0.26429136315863 0.151 0.262 8.06488190338037e-36 +"Rassf4" 1.66347995606831e-39 0.276008791830448 0.486 0.331 2.09332317671636e-35 +"Ctla2b" 2.64376083452698e-39 0.283381645965457 0.314 0.177 3.32690863416875e-35 +"1700017B05Rik" 2.9231648424547e-39 -0.276712111920953 0.338 0.452 3.67851063774499e-35 +"Arl1" 3.23857210153082e-39 -0.250794165619281 0.415 0.539 4.07541913256639e-35 +"Pik3r5" 3.52203132623974e-39 -0.288444283496189 0.271 0.385 4.43212422094009e-35 +"Hmgb2" 3.55402577771069e-39 -0.321068175039203 0.389 0.508 4.47238603867113e-35 +"Tnfrsf1b" 4.33429685217456e-39 -0.285704151839144 0.378 0.516 5.45427915877647e-35 +"Tarm1" 4.45906297052782e-39 -0.296412711397722 0.236 0.365 5.61128484211221e-35 +"Sirpa" 4.89816050695398e-39 -0.259158506979498 0.843 0.874 6.16384518195089e-35 +"H3f3b" 4.94957066035339e-39 -0.3418200768205 0.998 0.998 6.22853971898871e-35 +"Cfb" 6.06907416650285e-39 -0.579738207033625 0.28 0.338 7.63732293112718e-35 +"Rps6" 1.73658409671292e-38 0.256149658874727 0.942 0.866 2.18531742730353e-34 +"Glud1" 1.78365752790583e-38 0.25994347543753 0.607 0.465 2.2445546331167e-34 +"Serpina3g" 2.70303236052296e-38 -0.270694655646468 0.092 0.205 3.40149592248209e-34 +"G530011O06Rik" 3.18334300181546e-38 0.269230558340102 0.263 0.133 4.00591883348458e-34 +"Rps29" 7.44146076010657e-38 0.339240888270735 0.998 0.996 9.36433422051811e-34 +"Hopx" 9.03518968990406e-38 0.350223711128273 0.402 0.269 1.13698827057753e-33 +"Adipor1" 1.01146692343374e-37 -0.263968511191063 0.833 0.9 1.27282997644902e-33 +"Cd93" 1.43567469798633e-37 0.273932806246888 0.57 0.418 1.806653039946e-33 +"Cxcl3" 1.88292289795964e-37 -1.80234576580081 0.08 0.172 2.36947017479242e-33 +"4930430E12Rik" 2.71033490453374e-37 -0.363037881129268 0.403 0.519 3.41068544386526e-33 +"Slc25a4" 3.10110443624867e-37 0.256248210024395 0.44 0.287 3.90242982257532e-33 +"Pycard" 3.23250726749706e-37 0.26390085444793 0.653 0.505 4.0677871454183e-33 +"Tbc1d9" 3.31438998680832e-37 -0.310505245196437 0.435 0.548 4.17082835939959e-33 +"Mcemp1" 5.69116442811704e-37 -0.306740429864826 0.279 0.401 7.16176131634248e-33 +"Rgcc" 5.909254468876e-37 -0.39055721701557 0.263 0.408 7.43620582363356e-33 +"Fpr2" 6.45142428527161e-37 -0.269828134122457 0.235 0.312 8.11847232058579e-33 +"Tgm2" 7.25636357485796e-37 0.327088691256493 0.706 0.57 9.13140792260126e-33 +"Bola2" 1.51035765648567e-36 0.267377773901784 0.653 0.525 1.90063407492157e-32 +"Myh9" 1.69428979575293e-36 0.305901456640103 0.76 0.642 2.13209427897549e-32 +"Ccl4" 2.80482603067503e-36 -0.880199077033406 0.407 0.539 3.52959307700146e-32 +"Trem1" 2.99551920531608e-36 0.338428812208878 0.469 0.323 3.76956136796975e-32 +"Hebp1" 4.34478893224088e-36 0.290424109712436 0.554 0.428 5.46748239233192e-32 +"Pim1" 5.24886573731775e-36 -0.34890957380629 0.745 0.833 6.60517264384066e-32 +"Hk2" 6.75047134337098e-36 -0.269267074107686 0.245 0.373 8.49479313849804e-32 +"Por" 9.98245836216547e-36 -0.285511833635287 0.318 0.429 1.2561925602949e-31 +"Selplg" 2.13021871975807e-35 0.276830419860511 0.758 0.662 2.68066723694356e-31 +"Vcp" 9.66246697611904e-35 0.256059362257189 0.592 0.458 1.21592484427482e-30 +"Manf" 2.81245893322213e-34 0.309407517787569 0.713 0.607 3.53919832156673e-30 +"Slc25a5" 2.91854412127878e-34 0.26631157365882 0.788 0.694 3.67269592221721e-30 +"Sox4" 6.16689201919851e-34 -0.397685913383816 0.073 0.145 7.7604169169594e-30 +"Snhg8" 6.97897346689053e-34 -0.255804370419418 0.276 0.385 8.78234021073505e-30 +"Klf4" 1.03649142845456e-33 0.385108177359182 0.583 0.46 1.30432081356722e-29 +"Gng10" 1.69922629037076e-33 0.251858864578406 0.749 0.63 2.13830636380256e-29 +"Ctsa" 2.21404789360528e-33 -0.261856104525845 0.951 0.954 2.78615786931289e-29 +"Tuba1c" 3.33279954667801e-33 0.289686646362433 0.62 0.492 4.1939949495396e-29 +"Pdlim7" 5.57032328729279e-33 0.256869970093655 0.553 0.426 7.00969482472925e-29 +"Btg2" 5.582358674071e-33 0.350664227513975 0.499 0.374 7.02484015545095e-29 +"Cd14" 1.08850425059774e-32 -0.38430523121089 0.945 0.938 1.3697737489522e-28 +"Lst1" 1.33363808654313e-32 0.273328314127386 0.798 0.676 1.67825016810587e-28 +"Ctsd" 2.5630306299297e-32 -0.309391627830367 0.97 0.989 3.22531774470353e-28 +"Zfp36l1" 2.96186806234808e-32 0.371299578880058 0.738 0.632 3.72721476965882e-28 +"Ifit1" 3.217786413833e-32 -0.508117799114495 0.082 0.149 4.04926242316745e-28 +"Brd2" 4.2410686559368e-32 -0.259846128202746 0.587 0.684 5.33696079663087e-28 +"Sat1" 7.16268457831857e-32 -0.326441655913871 0.941 0.957 9.01352227335608e-28 +"Hspa1a" 7.31926985315662e-32 -0.772965981810197 0.141 0.232 9.2105691832123e-28 +"H2-Eb1" 1.21493169581406e-31 0.328953446241602 0.705 0.765 1.52887004601241e-27 +"Il4ra" 1.08257667246687e-30 0.25095814657959 0.619 0.481 1.36231448463231e-26 +"Cdk2ap2" 1.54533972362813e-30 0.27808521507845 0.643 0.509 1.94465550821364e-26 +"Ifitm1" 1.81179757549017e-30 0.476267799392 0.617 0.651 2.27996606899683e-26 +"Fam162a" 2.45116287191412e-30 -0.309710187918166 0.685 0.747 3.08454335801673e-26 +"Hsp90aa1" 2.55787208854277e-30 -0.346207573220601 0.628 0.698 3.21882623622222e-26 +"Ecm1" 3.06131820408149e-30 0.394081858976577 0.756 0.693 3.85236282801615e-26 +"Itgam" 4.18347330127506e-30 0.253895486943538 0.871 0.792 5.26448280232454e-26 +"Clic4" 4.46677495977266e-29 -0.26499940218975 0.683 0.746 5.62098960937792e-25 +"Isg15" 6.76142215063068e-29 -0.533818669226381 0.518 0.636 8.50857363435365e-25 +"Impa2" 2.62690157630289e-28 -0.25520542421782 0.282 0.367 3.30569294361955e-24 +"Anpep" 3.34047173674051e-28 -0.277058002371777 0.238 0.349 4.20364963351426e-24 +"Cyp4f18" 5.93316922369169e-28 0.33898115333514 0.435 0.319 7.46630015109362e-24 +"Ltc4s" 8.16469163331648e-27 0.258314507213727 0.171 0.082 1.02744479513655e-22 +"Vegfa" 2.29469426029795e-26 -0.268605496742534 0.308 0.433 2.88764325715894e-22 +"Gbp2" 9.42694013776049e-26 -0.308931206140147 0.529 0.654 1.18628614693578e-21 +"Hspa1b" 3.30766689241113e-25 -0.280284319689275 0.041 0.105 4.16236801741016e-21 +"Socs1" 8.98128915979335e-25 -0.291793065694771 0.378 0.506 1.1302054278684e-20 +"Cd74" 6.78400645715455e-24 0.376641700698548 0.93 0.937 8.53699372568328e-20 +"Ifit2" 1.04104768845022e-23 -0.290900033350556 0.052 0.106 1.31005441114575e-19 +"Fbxl5" 1.36738154482359e-23 -0.25745733350245 0.499 0.56 1.720712936006e-19 +"Selenbp2" 7.33153975059024e-23 -0.272060698543993 0.13 0.2 9.22600962214276e-19 +"Nfkbiz" 5.27790259778596e-22 0.266329427903296 0.446 0.336 6.64171262905385e-18 +"Arg1" 1.15073225297612e-21 -0.377303602402678 0.751 0.821 1.44808146714515e-17 +"Ptgs2" 1.862453062308e-21 -0.391848424494821 0.196 0.286 2.34371093360839e-17 +"Timp2" 5.70938441202506e-20 0.282156731651564 0.484 0.379 7.18468934409234e-16 +"Ifi27l2a" 5.74427359426118e-20 0.251545801255814 0.828 0.736 7.22859389101827e-16 +"H1f0" 6.95271095246005e-20 -0.321194866151546 0.439 0.492 8.74929146257573e-16 +"Gadd45b" 1.19816587017382e-18 -0.251852265009034 0.25 0.349 1.50777193102673e-14 +"Nfkbia" 4.5236139603226e-18 -0.340482151792322 0.832 0.882 5.69251580766996e-14 +"Bst2" 7.05332480502681e-18 -0.260375300425551 0.844 0.858 8.87590393464573e-14 +"Cdkn1a" 1.15742102032364e-17 -0.262036364375414 0.772 0.819 1.45649861197527e-13 +"Phlda1" 1.55067575492177e-17 -0.356347105521834 0.318 0.358 1.95137036999355e-13 +"Osm" 3.41665581691362e-17 0.25038860476841 0.389 0.294 4.2995196800041e-13 +"Pf4" 4.2222683338064e-17 0.527894345562052 0.556 0.46 5.31330247126197e-13 +"Oasl1" 3.63123805931119e-14 -0.271168393835739 0.102 0.144 4.5695499738372e-10 +"Gbp4" 2.15756809273651e-13 -0.285118495464999 0.483 0.555 2.71508368789963e-09 +"S100a9" 7.87336398908031e-13 1.64164846602051 0.214 0.265 9.90784124385867e-09 +"Nupr1" 1.69604818594572e-12 -0.285900299964528 0.458 0.494 2.13430703719409e-08 +"Selenom" 2.81554877973916e-12 0.27097139309149 0.72 0.658 3.54308658442376e-08 +"Cxcl9" 4.05343009612739e-09 -0.414001882706981 0.177 0.233 5.10083643296671e-05 +"Tnf" 3.65728182734143e-07 -0.257971030435504 0.28 0.301 0.00460232345152646 +"Ccl8" 1.08573848667136e-06 0.789487941634095 0.193 0.152 0.0136629331162723 +"Gm47283" 2.1295236078118e-06 -0.340986869559595 0.327 0.353 0.0267979250807037 diff --git a/vignettes/images/DEV_CheatSheet.png b/vignettes/images/DEV_CheatSheet.png new file mode 100644 index 0000000..ea888ee Binary files /dev/null and b/vignettes/images/DEV_CheatSheet.png differ diff --git a/vignettes/images/DL1.png b/vignettes/images/DL1.png new file mode 100644 index 0000000..d773c20 Binary files /dev/null and b/vignettes/images/DL1.png differ diff --git a/vignettes/images/DL2.png b/vignettes/images/DL2.png new file mode 100644 index 0000000..a09d734 Binary files /dev/null and b/vignettes/images/DL2.png differ diff --git a/vignettes/images/DPM.png b/vignettes/images/DPM.png new file mode 100644 index 0000000..763d7fc Binary files /dev/null and b/vignettes/images/DPM.png differ diff --git a/vignettes/images/MS1.png b/vignettes/images/MS1.png new file mode 100644 index 0000000..d601811 Binary files /dev/null and b/vignettes/images/MS1.png differ diff --git a/vignettes/images/MS2.png b/vignettes/images/MS2.png new file mode 100644 index 0000000..46e88d4 Binary files /dev/null and b/vignettes/images/MS2.png differ diff --git a/vignettes/images/MS3.png b/vignettes/images/MS3.png new file mode 100644 index 0000000..b447d4d Binary files /dev/null and b/vignettes/images/MS3.png differ diff --git a/vignettes/images/PerCell_Metadata.csv b/vignettes/images/PerCell_Metadata.csv new file mode 100644 index 0000000..c2f6b2f --- /dev/null +++ b/vignettes/images/PerCell_Metadata.csv @@ -0,0 +1,12973 @@ +Barcode,Cell Type +PBS_AAACCTGCAAGGTTTC-1,Monocytes +PBS_AAACCTGGTCTAGCGC-1,Monocytes +PBS_AAACCTGTCACTTACT-1,Monocytes +PBS_AAACCTGTCAGCGATT-1,Monocytes +PBS_AAACCTGTCAGCTGGC-1,Macrophages +PBS_AAACCTGTCGGCTTGG-1,Macrophages +PBS_AAACGGGAGATGCCAG-1,Monocytes +PBS_AAACGGGTCGGATGTT-1,Monocytes +PBS_AAACGGGTCTCTGAGA-1,Monocytes +PBS_AAAGATGTCACCTTAT-1,Monocytes +PBS_AAAGCAAAGACCCACC-1,Macrophages +PBS_AAAGCAAAGCGTGAAC-1,Monocytes +PBS_AAAGCAACAGGGTATG-1,Macrophages +PBS_AAAGCAAGTTGTCTTT-1,Monocytes +PBS_AAAGTAGCAGATGGGT-1,Monocytes +PBS_AAAGTAGGTATCGCAT-1,T cells +PBS_AAAGTAGGTGTGAATA-1,Monocytes +PBS_AAATGCCAGAGTGACC-1,NK cells +PBS_AAATGCCAGTAGCGGT-1,T cells +PBS_AAATGCCTCCTTTCTC-1,Monocytes +PBS_AAATGCCTCTTCTGGC-1,Monocytes +PBS_AAATGCCTCTTTAGGG-1,Monocytes +PBS_AACACGTGTTCCACAA-1,Monocytes +PBS_AACACGTTCGCATGAT-1,Macrophages +PBS_AACCATGTCAAACCGT-1,Granulocytes +PBS_AACCATGTCAGCTCGG-1,Monocytes +PBS_AACCGCGAGCTAGTTC-1,Dendritic cells +PBS_AACCGCGAGTTGTCGT-1,Monocytes +PBS_AACCGCGTCCAACCAA-1,T cells +PBS_AACGTTGGTACTTGAC-1,Granulocytes +PBS_AACGTTGGTCGAATCT-1,B cells +PBS_AACGTTGTCTTACCGC-1,Macrophages +PBS_AACTCCCGTTGACGTT-1,Monocytes +PBS_AACTCCCTCGCGGATC-1,Macrophages +PBS_AACTCTTAGGTGACCA-1,Monocytes +PBS_AACTGGTAGTGGTAGC-1,Monocytes +PBS_AACTGGTCAAGCGTAG-1,Monocytes +PBS_AACTGGTGTAAATGTG-1,Macrophages +PBS_AACTGGTTCACCTTAT-1,Monocytes +PBS_AACTTTCCACTCAGGC-1,Macrophages +PBS_AACTTTCGTATTCTCT-1,Monocytes +PBS_AACTTTCGTTGCGTTA-1,Monocytes +PBS_AACTTTCTCGTACGGC-1,Monocytes +PBS_AAGACCTAGATATACG-1,Dendritic cells +PBS_AAGACCTGTAGGCATG-1,Monocytes +PBS_AAGACCTTCAAACAAG-1,NK cells +PBS_AAGCCGCGTGCAGGTA-1,Macrophages +PBS_AAGGAGCGTTGCTCCT-1,T cells +PBS_AAGTCTGAGGCTATCT-1,Monocytes +PBS_AAGTCTGGTCTGCAAT-1,Monocytes +PBS_AAGTCTGGTGGACGAT-1,Monocytes +PBS_AATCCAGAGGACTGGT-1,Macrophages +PBS_AATCCAGAGGTGCACA-1,Macrophages +PBS_AATCGGTAGGATGGTC-1,Monocytes +PBS_AATCGGTGTAGGCATG-1,Monocytes +PBS_ACACCAATCGTTTAGG-1,Monocytes +PBS_ACACCCTTCCATGCTC-1,Monocytes +PBS_ACACCCTTCTACGAGT-1,Monocytes +PBS_ACACCGGAGGCTCATT-1,Monocytes +PBS_ACACCGGTCATCACCC-1,Monocytes +PBS_ACACCGGTCGCATGGC-1,Monocytes +PBS_ACACTGAAGTTCGCAT-1,Monocytes +PBS_ACAGCCGAGCAGACTG-1,Dendritic cells +PBS_ACAGCTACAACGCACC-1,Granulocytes +PBS_ACAGCTAGTCGCATCG-1,Monocytes +PBS_ACATACGAGGACATTA-1,Monocytes +PBS_ACATACGAGTCGAGTG-1,T cells +PBS_ACATCAGAGAGGGATA-1,Dendritic cells +PBS_ACATCAGAGTAATCCC-1,Monocytes +PBS_ACATCAGTCTAGAGTC-1,Monocytes +PBS_ACATGGTCACACATGT-1,Macrophages +PBS_ACATGGTGTCTCCATC-1,Monocytes +PBS_ACATGGTTCAACCATG-1,Monocytes +PBS_ACCAGTAAGTGGTAGC-1,Monocytes +PBS_ACCAGTACAGAAGCAC-1,Monocytes +PBS_ACCAGTACAGGAATCG-1,T cells +PBS_ACCCACTGTCAGAAGC-1,Monocytes +PBS_ACCCACTGTGATAAAC-1,Macrophages +PBS_ACCCACTGTTAAGGGC-1,Monocytes +PBS_ACCCACTTCCACTGGG-1,Monocytes +PBS_ACCCACTTCCTTGGTC-1,Monocytes +PBS_ACCCACTTCTATCCTA-1,Monocytes +PBS_ACCGTAACAATCGGTT-1,Monocytes +PBS_ACCGTAAGTTTGACTG-1,Monocytes +PBS_ACCGTAATCGTCACGG-1,Monocytes +PBS_ACCTTTAGTAACGCGA-1,Macrophages +PBS_ACCTTTAGTGTGAAAT-1,Monocytes +PBS_ACGAGCCAGGCCCGTT-1,Granulocytes +PBS_ACGAGCCAGTGGTCCC-1,Monocytes +PBS_ACGAGCCGTGCAGGTA-1,Monocytes +PBS_ACGAGCCTCAGTGCAT-1,Macrophages +PBS_ACGAGCCTCCTTTCTC-1,Monocytes +PBS_ACGAGGAGTGGTACAG-1,Monocytes +PBS_ACGATACAGATCCCAT-1,Monocytes +PBS_ACGATACCAAAGGTGC-1,Monocytes +PBS_ACGATACCAGATGGCA-1,Monocytes +PBS_ACGATACTCACAGTAC-1,Monocytes +PBS_ACGATACTCCCATTAT-1,Monocytes +PBS_ACGATGTGTAAGCACG-1,Monocytes +PBS_ACGCAGCAGCTGCAAG-1,Macrophages +PBS_ACGCAGCAGTGTACTC-1,NK cells +PBS_ACGCCAGCAAAGGCGT-1,Monocytes +PBS_ACGCCAGGTGCGATAG-1,Monocytes +PBS_ACGCCAGGTTATGTGC-1,Monocytes +PBS_ACGCCAGTCACATGCA-1,Granulocytes +PBS_ACGCCGACATGTAGTC-1,Dendritic cells +PBS_ACGCCGATCCTTTCGG-1,T cells +PBS_ACGGAGAAGAAGGACA-1,Dendritic cells +PBS_ACGGAGACACGGACAA-1,Monocytes +PBS_ACGGCCACAGACAAGC-1,B cells +PBS_ACGGCCATCGTCACGG-1,Macrophages +PBS_ACGGGCTAGGAATCGC-1,Monocytes +PBS_ACGGGCTCACTTCGAA-1,Macrophages +PBS_ACGGGCTCAGATTGCT-1,Monocytes +PBS_ACGGGCTGTGCAACTT-1,Monocytes +PBS_ACGGGCTTCTCTTATG-1,Macrophages +PBS_ACGTCAATCCGCGCAA-1,Macrophages +PBS_ACTATCTAGTGCCATT-1,Monocytes +PBS_ACTGAACCATGAACCT-1,Monocytes +PBS_ACTGAGTAGATACACA-1,Monocytes +PBS_ACTGATGAGTTGAGAT-1,Monocytes +PBS_ACTGATGCACACATGT-1,Monocytes +PBS_ACTGATGCACCTTGTC-1,Monocytes +PBS_ACTGATGCATGTCCTC-1,Monocytes +PBS_ACTGATGGTCCGACGT-1,Monocytes +PBS_ACTGCTCCAGTATCTG-1,Macrophages +PBS_ACTGCTCCATCTCGCT-1,Monocytes +PBS_ACTGTCCAGTTAGCGG-1,Monocytes +PBS_ACTGTCCGTAAAGGAG-1,Granulocytes +PBS_ACTGTCCGTCCGAGTC-1,Monocytes +PBS_ACTGTCCTCATCACCC-1,Monocytes +PBS_ACTTACTAGATCCGAG-1,Monocytes +PBS_ACTTACTTCGTTTATC-1,Monocytes +PBS_ACTTGTTAGTGTCTCA-1,Monocytes +PBS_ACTTTCATCACCTCGT-1,Monocytes +PBS_AGAATAGTCAAGCCTA-1,Monocytes +PBS_AGAATAGTCCAAGCCG-1,Monocytes +PBS_AGAATAGTCGAGAACG-1,Monocytes +PBS_AGACGTTAGCAGCGTA-1,Granulocytes +PBS_AGACGTTCAGGATTGG-1,Monocytes +PBS_AGACGTTTCTTGCAAG-1,Macrophages +PBS_AGAGCGAAGCCAGTTT-1,Macrophages +PBS_AGAGCTTAGCCTCGTG-1,B cells +PBS_AGATCTGAGTACGATA-1,Monocytes +PBS_AGATCTGGTACCCAAT-1,Monocytes +PBS_AGATCTGGTGAACCTT-1,Monocytes +PBS_AGATCTGTCAACGCTA-1,Monocytes +PBS_AGATTGCAGCCCAGCT-1,Monocytes +PBS_AGATTGCAGTGTCCAT-1,Granulocytes +PBS_AGATTGCCACAAGTAA-1,Monocytes +PBS_AGATTGCTCCGTACAA-1,Monocytes +PBS_AGCAGCCGTACATGTC-1,Monocytes +PBS_AGCAGCCTCCTTTCGG-1,Monocytes +PBS_AGCAGCCTCTCTTGAT-1,Macrophages +PBS_AGCATACGTCCTCTTG-1,Monocytes +PBS_AGCATACGTCGTTGTA-1,Monocytes +PBS_AGCATACGTCTCGTTC-1,Monocytes +PBS_AGCATACGTGGTACAG-1,Macrophages +PBS_AGCGGTCGTATCTGCA-1,Macrophages +PBS_AGCGTATTCATAGCAC-1,Monocytes +PBS_AGCGTCGGTCTAACGT-1,Monocytes +PBS_AGCGTCGTCTCTAAGG-1,Monocytes +PBS_AGCTCCTGTCAGAAGC-1,Monocytes +PBS_AGCTCCTGTCCGTGAC-1,Monocytes +PBS_AGCTCCTTCTACTTAC-1,Macrophages +PBS_AGCTCTCGTCAGAGGT-1,Monocytes +PBS_AGCTCTCTCTCAACTT-1,Monocytes +PBS_AGCTTGAGTAGTGAAT-1,Macrophages +PBS_AGCTTGAGTTTACTCT-1,Dendritic cells +PBS_AGGCCACAGCGGATCA-1,Monocytes +PBS_AGGCCACGTTACGCGC-1,T cells +PBS_AGGCCACTCGGATGGA-1,Monocytes +PBS_AGGGAGTAGGAGTAGA-1,Monocytes +PBS_AGGGAGTCACAAGCCC-1,Monocytes +PBS_AGGGAGTGTTACAGAA-1,Monocytes +PBS_AGGGATGAGCCTCGTG-1,Monocytes +PBS_AGGGATGCAATTCCTT-1,T cells +PBS_AGGGATGTCGGAATCT-1,Monocytes +PBS_AGGGATGTCGGTGTCG-1,Monocytes +PBS_AGGGTGAAGGAATCGC-1,Monocytes +PBS_AGGTCATAGGCTACGA-1,Monocytes +PBS_AGGTCATGTGGAAAGA-1,Macrophages +PBS_AGGTCATTCACCTTAT-1,Monocytes +PBS_AGGTCCGGTAAACCTC-1,Monocytes +PBS_AGGTCCGGTGCAACGA-1,Macrophages +PBS_AGTAGTCCAGCTGGCT-1,Monocytes +PBS_AGTAGTCGTCTTGCGG-1,Monocytes +PBS_AGTAGTCTCATCATTC-1,Monocytes +PBS_AGTCTTTTCTGCAAGT-1,Monocytes +PBS_AGTGAGGCAAGCGAGT-1,Macrophages +PBS_AGTGGGAAGAATCTCC-1,Monocytes +PBS_AGTGGGACAATGGTCT-1,Macrophages +PBS_AGTGTCAAGAAGCCCA-1,Monocytes +PBS_AGTGTCAAGGACAGAA-1,Monocytes +PBS_AGTGTCAAGGTGCTTT-1,Monocytes +PBS_AGTGTCACATATACCG-1,Monocytes +PBS_AGTGTCAGTGATGTCT-1,Monocytes +PBS_AGTTGGTGTAGCGTCC-1,Monocytes +PBS_AGTTGGTTCCAGAAGG-1,Monocytes +PBS_ATAACGCAGGTGCTTT-1,Macrophages +PBS_ATAACGCCATTACGAC-1,Monocytes +PBS_ATAACGCGTAGAAAGG-1,Monocytes +PBS_ATAAGAGTCACCCGAG-1,Monocytes +PBS_ATAGACCAGCGGATCA-1,Granulocytes +PBS_ATAGACCCAGACAAGC-1,Monocytes +PBS_ATAGACCGTTAAAGTG-1,Dendritic cells +PBS_ATAGACCTCAGGTAAA-1,Monocytes +PBS_ATCACGACAGATTGCT-1,Macrophages +PBS_ATCACGACATAACCTG-1,Monocytes +PBS_ATCACGAGTTACCGAT-1,Monocytes +PBS_ATCACGATCAAGGTAA-1,Monocytes +PBS_ATCACGATCGCACTCT-1,Macrophages +PBS_ATCATCTAGGCAATTA-1,Monocytes +PBS_ATCATCTAGTGTTTGC-1,Monocytes +PBS_ATCATCTCAGCTGTAT-1,Monocytes +PBS_ATCATGGGTGGTTTCA-1,Dendritic cells +PBS_ATCCACCAGCCACTAT-1,Monocytes +PBS_ATCCACCAGTGTGAAT-1,Monocytes +PBS_ATCCACCCAATTCCTT-1,Monocytes +PBS_ATCCACCTCCATTCTA-1,Monocytes +PBS_ATCCGAAAGATCGATA-1,Monocytes +PBS_ATCGAGTGTTATGCGT-1,Macrophages +PBS_ATCGAGTTCAGTGCAT-1,Monocytes +PBS_ATCTACTAGGCTAGCA-1,Macrophages +PBS_ATCTACTGTATATGGA-1,Monocytes +PBS_ATCTACTGTCTGATTG-1,Monocytes +PBS_ATCTGCCAGCGTGAGT-1,Monocytes +PBS_ATCTGCCGTGTCAATC-1,Monocytes +PBS_ATCTGCCTCCGGCACA-1,Macrophages +PBS_ATGCGATCATAGTAAG-1,Monocytes +PBS_ATGGGAGCACCATCCT-1,Monocytes +PBS_ATGGGAGGTTTGTTGG-1,Monocytes +PBS_ATGGGAGTCTCCTATA-1,Monocytes +PBS_ATGTGTGCAATGGATA-1,Monocytes +PBS_ATGTGTGGTACCGTTA-1,Macrophages +PBS_ATGTGTGTCTTACCTA-1,Monocytes +PBS_ATTACTCTCCTCGCAT-1,Monocytes +PBS_ATTATCCCAATACGCT-1,Monocytes +PBS_ATTATCCCAGGACCCT-1,Monocytes +PBS_ATTATCCGTCACACGC-1,Monocytes +PBS_ATTATCCGTCCTAGCG-1,Dendritic cells +PBS_ATTATCCTCTTGAGAC-1,Monocytes +PBS_ATTCTACGTTCTGAAC-1,Monocytes +PBS_ATTGGACAGGAGCGAG-1,Granulocytes +PBS_ATTGGACCACATGTGT-1,Monocytes +PBS_ATTGGACTCTTGTCAT-1,Macrophages +PBS_ATTGGTGAGCAGGCTA-1,Monocytes +PBS_ATTGGTGGTCCTAGCG-1,Monocytes +PBS_ATTGGTGGTGAACCTT-1,Monocytes +PBS_ATTGGTGGTGTGGCTC-1,Monocytes +PBS_ATTGGTGTCAACTCTT-1,Monocytes +PBS_ATTGGTGTCCGCATCT-1,Monocytes +PBS_CAACCAAAGTCAAGGC-1,Monocytes +PBS_CAACCAATCAACCATG-1,Monocytes +PBS_CAACCTCAGGATTCGG-1,Monocytes +PBS_CAACCTCGTGACCAAG-1,Monocytes +PBS_CAACCTCGTGCACCAC-1,Macrophages +PBS_CAACCTCGTTAAGAAC-1,Macrophages +PBS_CAACCTCGTTACCGAT-1,T cells +PBS_CAACCTCTCTCTAAGG-1,Macrophages +PBS_CAACTAGAGCACGCCT-1,Monocytes +PBS_CAACTAGAGCGAAGGG-1,Macrophages +PBS_CAACTAGCAGGTTTCA-1,Monocytes +PBS_CAACTAGGTGCAGGTA-1,Monocytes +PBS_CAAGGCCAGAGACTAT-1,Monocytes +PBS_CAAGGCCCACTACAGT-1,Monocytes +PBS_CAAGGCCGTATAATGG-1,Monocytes +PBS_CAAGTTGGTCTACCTC-1,Monocytes +PBS_CAAGTTGTCATTGCGA-1,Monocytes +PBS_CACAAACGTTAAGTAG-1,T cells +PBS_CACACAACAGGGTACA-1,Monocytes +PBS_CACACAACATACAGCT-1,Monocytes +PBS_CACACAATCCATGAAC-1,Monocytes +PBS_CACACCTCAGCCTATA-1,Monocytes +PBS_CACACCTTCCCATTTA-1,Monocytes +PBS_CACACTCAGTGTACCT-1,Monocytes +PBS_CACACTCGTCATGCCG-1,Granulocytes +PBS_CACACTCGTCGATTGT-1,NK cells +PBS_CACACTCTCCACTCCA-1,Monocytes +PBS_CACAGGCAGCGAAGGG-1,Monocytes +PBS_CACAGGCCACATAACC-1,Monocytes +PBS_CACAGGCGTGCTTCTC-1,Monocytes +PBS_CACAGGCGTGTGACGA-1,Monocytes +PBS_CACAGTAAGGGTGTGT-1,Monocytes +PBS_CACAGTAGTTACTGAC-1,Monocytes +PBS_CACATAGAGACACTAA-1,Monocytes +PBS_CACATAGCATAACCTG-1,Macrophages +PBS_CACATAGCATGATCCA-1,Monocytes +PBS_CACATAGGTGGTGTAG-1,Monocytes +PBS_CACATAGTCACAGGCC-1,Macrophages +PBS_CACATTTAGCTAAGAT-1,Monocytes +PBS_CACATTTCAGGTGCCT-1,Monocytes +PBS_CACATTTGTATCGCAT-1,Monocytes +PBS_CACCACTAGTGCGATG-1,Monocytes +PBS_CACCACTTCCTATTCA-1,Monocytes +PBS_CACCAGGAGCAATCTC-1,Monocytes +PBS_CACCAGGAGCGTCAAG-1,Monocytes +PBS_CACCAGGAGCTGATAA-1,Monocytes +PBS_CACCAGGGTAGCGTAG-1,Monocytes +PBS_CACCAGGGTGCCTGGT-1,Dendritic cells +PBS_CACCTTGAGGACAGAA-1,Monocytes +PBS_CACCTTGTCGGCGGTT-1,Monocytes +PBS_CACCTTGTCTCGAGTA-1,Macrophages +PBS_CACTCCAAGCGATAGC-1,Monocytes +PBS_CACTCCACACATTCGA-1,Macrophages +PBS_CACTCCAGTGAGTGAC-1,Monocytes +PBS_CAGAATCAGTGTGAAT-1,Monocytes +PBS_CAGAGAGAGCCACGCT-1,Macrophages +PBS_CAGAGAGTCGAATGGG-1,Monocytes +PBS_CAGATCAGTGAGGGAG-1,Monocytes +PBS_CAGATCAGTGTAACGG-1,Monocytes +PBS_CAGCATACACATTTCT-1,Macrophages +PBS_CAGCATAGTCCAGTTA-1,Monocytes +PBS_CAGCATAGTCGGGTCT-1,Monocytes +PBS_CAGCATATCGAATCCA-1,Monocytes +PBS_CAGCCGAAGAACAATC-1,Monocytes +PBS_CAGCCGACACAACGTT-1,Monocytes +PBS_CAGCCGACACAGGAGT-1,Monocytes +PBS_CAGCCGACATCGGACC-1,Macrophages +PBS_CAGCTGGAGTATTGGA-1,Monocytes +PBS_CAGCTGGCAACACCTA-1,Monocytes +PBS_CAGCTGGTCGTTTAGG-1,Monocytes +PBS_CAGGTGCAGATCCCGC-1,Macrophages +PBS_CAGGTGCGTGATAAGT-1,Macrophages +PBS_CAGTAACCATACCATG-1,Monocytes +PBS_CAGTCCTCATGTAGTC-1,Monocytes +PBS_CAGTCCTGTAGTACCT-1,Monocytes +PBS_CATATGGAGTGGGATC-1,Monocytes +PBS_CATATGGCAATGTTGC-1,Macrophages +PBS_CATATGGTCAGAGCTT-1,Monocytes +PBS_CATATTCAGTGTCCAT-1,Monocytes +PBS_CATATTCGTATATCCG-1,Macrophages +PBS_CATATTCGTCGCTTCT-1,Monocytes +PBS_CATCAAGCAAACGTGG-1,Monocytes +PBS_CATCAAGCAGGGATTG-1,Monocytes +PBS_CATCAAGTCGGATGTT-1,Dendritic cells +PBS_CATCAGAAGCCAGTTT-1,Monocytes +PBS_CATCCACAGGTAGCCA-1,Dendritic cells +PBS_CATCGAACAGGTTTCA-1,Dendritic cells +PBS_CATCGAACAGTGGAGT-1,Monocytes +PBS_CATCGAAGTAAGGGCT-1,Dendritic cells +PBS_CATCGAATCATCGATG-1,Macrophages +PBS_CATCGGGGTGTGGTTT-1,Monocytes +PBS_CATGACAAGGCTCATT-1,Monocytes +PBS_CATGACACAAACGCGA-1,Monocytes +PBS_CATGACAGTAAACACA-1,Monocytes +PBS_CATGACAGTACTTCTT-1,Macrophages +PBS_CATGACATCATTGCCC-1,Monocytes +PBS_CATGACATCGGTTAAC-1,B cells +PBS_CATGCCTCAGATAATG-1,Granulocytes +PBS_CATGCCTGTCACTTCC-1,Monocytes +PBS_CATGCCTTCCGCGGTA-1,Monocytes +PBS_CATGGCGGTAAACCTC-1,Monocytes +PBS_CATGGCGTCGCGCCAA-1,Monocytes +PBS_CATGGCGTCTGCTGCT-1,Macrophages +PBS_CATTATCGTGCCTTGG-1,Monocytes +PBS_CATTATCGTGTGTGCC-1,Macrophages +PBS_CATTATCTCAGGTAAA-1,Monocytes +PBS_CATTATCTCCGGGTGT-1,Dendritic cells +PBS_CATTATCTCGCGTTTC-1,Macrophages +PBS_CATTCGCCAACTGCGC-1,Macrophages +PBS_CATTCGCGTCCTGCTT-1,Monocytes +PBS_CCAATCCAGGTAAACT-1,Monocytes +PBS_CCAATCCGTCATCGGC-1,Monocytes +PBS_CCACCTATCGACGGAA-1,Monocytes +PBS_CCACCTATCTAACTTC-1,Monocytes +PBS_CCACGGAGTCTAGTCA-1,Monocytes +PBS_CCACGGATCATAGCAC-1,Macrophages +PBS_CCACTACCATGCTAGT-1,Monocytes +PBS_CCACTACGTAAGTAGT-1,Monocytes +PBS_CCAGCGAAGAACAATC-1,Monocytes +PBS_CCAGCGAAGCTAGCCC-1,Macrophages +PBS_CCAGCGACATGTTGAC-1,Monocytes +PBS_CCAGCGAGTTTGGCGC-1,Monocytes +PBS_CCAGCGATCATCACCC-1,Macrophages +PBS_CCATGTCAGGAGCGTT-1,Macrophages +PBS_CCATGTCGTAAGGATT-1,Macrophages +PBS_CCATGTCGTAGCAAAT-1,Monocytes +PBS_CCATGTCGTCAAGCGA-1,Monocytes +PBS_CCATGTCTCAGTACGT-1,Monocytes +PBS_CCATTCGGTGGCCCTA-1,Monocytes +PBS_CCATTCGTCCGTAGTA-1,Granulocytes +PBS_CCATTCGTCCTTGGTC-1,Dendritic cells +PBS_CCCAATCCACCTCGGA-1,Monocytes +PBS_CCCAATCTCATCGGAT-1,T cells +PBS_CCCAATCTCCTGCAGG-1,Macrophages +PBS_CCCAGTTAGTGGTAGC-1,Monocytes +PBS_CCCAGTTGTCGACTAT-1,Monocytes +PBS_CCCAGTTTCAGGCAAG-1,Monocytes +PBS_CCCTCCTAGGAATTAC-1,Monocytes +PBS_CCCTCCTCACATTAGC-1,Monocytes +PBS_CCGGGATAGATATACG-1,Dendritic cells +PBS_CCGGGATAGGCTCATT-1,Macrophages +PBS_CCGGTAGCACAACTGT-1,Monocytes +PBS_CCGGTAGCATGCTAGT-1,Monocytes +PBS_CCGGTAGGTTTGACAC-1,Monocytes +PBS_CCGTACTCACCGAAAG-1,Dendritic cells +PBS_CCGTACTTCTCCGGTT-1,Monocytes +PBS_CCGTGGATCAGCTCTC-1,Monocytes +PBS_CCGTTCAAGGTGATTA-1,Monocytes +PBS_CCGTTCACACCCATTC-1,Monocytes +PBS_CCGTTCACAGGTGCCT-1,Monocytes +PBS_CCGTTCAGTCTAAAGA-1,Monocytes +PBS_CCGTTCATCGGCTACG-1,Monocytes +PBS_CCTACACAGCGCTCCA-1,Monocytes +PBS_CCTACACAGTAACCCT-1,Monocytes +PBS_CCTACACCAAGCCTAT-1,Monocytes +PBS_CCTACACCACGGACAA-1,Monocytes +PBS_CCTACACTCAGTTTGG-1,Macrophages +PBS_CCTACACTCTAACTGG-1,Monocytes +PBS_CCTACCAAGGAGTTTA-1,Dendritic cells +PBS_CCTACCACATCTGGTA-1,Monocytes +PBS_CCTACCAGTATTACCG-1,Monocytes +PBS_CCTACCATCGGAAATA-1,Monocytes +PBS_CCTACCATCGTCCGTT-1,Monocytes +PBS_CCTATTATCGGACAAG-1,Monocytes +PBS_CCTCAGTAGTGACTCT-1,Monocytes +PBS_CCTCTGAAGAATGTGT-1,Monocytes +PBS_CCTCTGAAGAGTGACC-1,Dendritic cells +PBS_CCTCTGAAGCTGTTCA-1,Monocytes +PBS_CCTTACGGTCTCCACT-1,Monocytes +PBS_CCTTCCCGTCACCCAG-1,Monocytes +PBS_CCTTCCCGTCCGTCAG-1,Monocytes +PBS_CCTTCCCTCCTGCAGG-1,Monocytes +PBS_CCTTCCCTCGCCTGTT-1,Monocytes +PBS_CCTTCGATCACGATGT-1,Macrophages +PBS_CCTTTCTAGAGCAATT-1,Monocytes +PBS_CCTTTCTCACCGAATT-1,Monocytes +PBS_CGAACATTCTCGAGTA-1,Monocytes +PBS_CGAATGTGTCTCCACT-1,Monocytes +PBS_CGACCTTCAAGCTGGA-1,Monocytes +PBS_CGACCTTCAATGTAAG-1,Monocytes +PBS_CGACTTCGTACCAGTT-1,Macrophages +PBS_CGAGAAGAGAGCCTAG-1,Monocytes +PBS_CGAGAAGCAATGACCT-1,Monocytes +PBS_CGAGAAGCACATGGGA-1,Monocytes +PBS_CGAGAAGGTTGCCTCT-1,Monocytes +PBS_CGAGAAGTCGGAATCT-1,Monocytes +PBS_CGAGCACTCGAGAACG-1,Monocytes +PBS_CGAGCCAAGAAACCAT-1,Dendritic cells +PBS_CGAGCCATCTGCTGTC-1,Monocytes +PBS_CGATCGGGTTTGACTG-1,Monocytes +PBS_CGATCGGTCACCAGGC-1,Monocytes +PBS_CGATCGGTCGGACAAG-1,Macrophages +PBS_CGATGGCCATCCCACT-1,Monocytes +PBS_CGATGGCGTACGACCC-1,Macrophages +PBS_CGATGTAAGATCCGAG-1,Monocytes +PBS_CGATGTAAGTGTCCAT-1,Granulocytes +PBS_CGATGTACACCAGCAC-1,Monocytes +PBS_CGATGTAGTCGAACAG-1,Monocytes +PBS_CGATTGAAGTCAAGCG-1,Monocytes +PBS_CGATTGACAGTTCATG-1,Monocytes +PBS_CGATTGACATGCAATC-1,Monocytes +PBS_CGATTGATCAGTGTTG-1,Macrophages +PBS_CGATTGATCCAAAGTC-1,Dendritic cells +PBS_CGCCAAGCAAGGTTTC-1,Monocytes +PBS_CGCCAAGTCACAGGCC-1,Monocytes +PBS_CGCGGTAAGAGGTAGA-1,Macrophages +PBS_CGCGGTACACCACGTG-1,Monocytes +PBS_CGCGGTATCTGCAGTA-1,Monocytes +PBS_CGCGTTTAGGTGCTAG-1,Monocytes +PBS_CGCGTTTCATGCTGGC-1,Monocytes +PBS_CGCTATCAGTGGGATC-1,Macrophages +PBS_CGCTATCAGTTCGCGC-1,Monocytes +PBS_CGCTGGAAGTATCTCG-1,Macrophages +PBS_CGCTGGATCAGAAATG-1,Monocytes +PBS_CGCTTCATCTTGAGAC-1,Monocytes +PBS_CGGACACAGCTTCGCG-1,Monocytes +PBS_CGGACGTGTCGGCTCA-1,Macrophages +PBS_CGGACGTGTTCCGTCT-1,Monocytes +PBS_CGGACGTTCGGAGGTA-1,Monocytes +PBS_CGGACGTTCGTCGTTC-1,Monocytes +PBS_CGGAGCTGTTACCGAT-1,Monocytes +PBS_CGGAGTCGTAAGTGGC-1,Dendritic cells +PBS_CGGAGTCGTGCAACGA-1,Monocytes +PBS_CGGAGTCGTGTAATGA-1,Monocytes +PBS_CGGAGTCTCGGCTTGG-1,Monocytes +PBS_CGGCTAGCAAGTACCT-1,Monocytes +PBS_CGGCTAGGTCTCACCT-1,Monocytes +PBS_CGGGTCACATGTAAGA-1,Monocytes +PBS_CGGGTCATCACCCTCA-1,B cells +PBS_CGGTTAAAGAAGGTGA-1,Monocytes +PBS_CGGTTAAAGTTATCGC-1,Monocytes +PBS_CGGTTAAGTCGAATCT-1,Macrophages +PBS_CGGTTAATCACTTATC-1,Macrophages +PBS_CGTAGCGAGATAGTCA-1,Monocytes +PBS_CGTAGCGAGCCGGTAA-1,Monocytes +PBS_CGTAGCGAGGCTCATT-1,Monocytes +PBS_CGTAGCGTCAAGGCTT-1,Monocytes +PBS_CGTAGGCAGATGTAAC-1,Granulocytes +PBS_CGTAGGCGTGGCCCTA-1,Monocytes +PBS_CGTCACTAGGCTCTTA-1,Monocytes +PBS_CGTCACTGTCACCCAG-1,Macrophages +PBS_CGTCACTGTTCCGTCT-1,Macrophages +PBS_CGTCAGGAGATGCGAC-1,Macrophages +PBS_CGTCAGGAGTACTTGC-1,Monocytes +PBS_CGTCAGGCATTACCTT-1,Monocytes +PBS_CGTCAGGGTTCCACGG-1,Monocytes +PBS_CGTCAGGTCCGCAGTG-1,Monocytes +PBS_CGTCCATAGCAGGTCA-1,Monocytes +PBS_CGTCCATAGTACCGGA-1,Monocytes +PBS_CGTCCATCACTGTTAG-1,Monocytes +PBS_CGTCCATGTGTGAAAT-1,Macrophages +PBS_CGTCCATGTTTGGGCC-1,Monocytes +PBS_CGTCTACGTATATGGA-1,Macrophages +PBS_CGTCTACTCGCGTTTC-1,Macrophages +PBS_CGTGTAAAGATCGGGT-1,Macrophages +PBS_CGTGTAAAGGAACTGC-1,Monocytes +PBS_CGTGTAATCTCGATGA-1,Monocytes +PBS_CGTGTCTAGACTACAA-1,Monocytes +PBS_CGTGTCTAGTGGTCCC-1,Monocytes +PBS_CGTGTCTAGTGTTGAA-1,Monocytes +PBS_CGTGTCTGTTGCCTCT-1,Monocytes +PBS_CGTGTCTTCTGAGGGA-1,Monocytes +PBS_CGTTAGAAGGCCATAG-1,Monocytes +PBS_CGTTAGAGTCACTGGC-1,Monocytes +PBS_CGTTAGATCCACGCAG-1,Monocytes +PBS_CGTTGGGCATCCTAGA-1,Monocytes +PBS_CTAACTTCACTGAAGG-1,Macrophages +PBS_CTAACTTTCACCGTAA-1,Macrophages +PBS_CTAAGACAGGCTATCT-1,Macrophages +PBS_CTAAGACCACATGGGA-1,NK cells +PBS_CTAAGACCAGCATACT-1,Monocytes +PBS_CTAAGACTCATCACCC-1,Granulocytes +PBS_CTAATGGAGGTGATTA-1,Monocytes +PBS_CTAATGGTCACCAGGC-1,Macrophages +PBS_CTACACCAGACACTAA-1,Monocytes +PBS_CTACACCAGCTTATCG-1,Monocytes +PBS_CTACACCTCGTTACGA-1,Monocytes +PBS_CTACATTAGCCGTCGT-1,Monocytes +PBS_CTACATTAGCGGATCA-1,Monocytes +PBS_CTACATTAGTGACATA-1,Monocytes +PBS_CTACATTCATACTACG-1,Macrophages +PBS_CTACATTGTCAATACC-1,Monocytes +PBS_CTACATTGTGATGTGG-1,Granulocytes +PBS_CTACATTTCGGCATCG-1,Monocytes +PBS_CTACCCAAGAATCTCC-1,Monocytes +PBS_CTACCCAAGGACCACA-1,Monocytes +PBS_CTACCCAAGGTCATCT-1,Monocytes +PBS_CTACCCAGTTACGGAG-1,Dendritic cells +PBS_CTACGTCCACAACGCC-1,Monocytes +PBS_CTAGAGTCACGGTGTC-1,Monocytes +PBS_CTAGAGTTCACTTCAT-1,Monocytes +PBS_CTAGAGTTCTGCCAGG-1,Monocytes +PBS_CTAGCCTGTCAATGTC-1,Monocytes +PBS_CTAGCCTGTTAAGATG-1,Dendritic cells +PBS_CTAGCCTGTTCGCGAC-1,Monocytes +PBS_CTAGTGAGTTGCGCAC-1,Monocytes +PBS_CTAGTGATCTTCATGT-1,Monocytes +PBS_CTCACACGTCCGTCAG-1,Monocytes +PBS_CTCACACTCTTGACGA-1,Monocytes +PBS_CTCAGAAGTCCAAGTT-1,Monocytes +PBS_CTCAGAAGTGTCCTCT-1,Monocytes +PBS_CTCATTACACCCATTC-1,Monocytes +PBS_CTCATTAGTTCAGGCC-1,Monocytes +PBS_CTCCTAGTCTCGAGTA-1,Macrophages +PBS_CTCGAAAGTTGTGGCC-1,Monocytes +PBS_CTCGAAATCATTCACT-1,Granulocytes +PBS_CTCGAAATCGGCGCAT-1,Monocytes +PBS_CTCGGAGAGAAGGTGA-1,Macrophages +PBS_CTCGGAGCAGATGAGC-1,Monocytes +PBS_CTCGGAGCAGGTTTCA-1,Monocytes +PBS_CTCGGAGGTACCATCA-1,Macrophages +PBS_CTCGGAGTCTATCGCC-1,Monocytes +PBS_CTCGGGAAGCGATATA-1,Monocytes +PBS_CTCGGGAAGTGGGATC-1,Macrophages +PBS_CTCGGGATCACCAGGC-1,Monocytes +PBS_CTCGTACAGCAACGGT-1,Monocytes +PBS_CTCGTACAGTACGTAA-1,Monocytes +PBS_CTCGTACGTGTGACCC-1,Macrophages +PBS_CTCGTCAGTAGATTAG-1,Monocytes +PBS_CTCGTCAGTCACACGC-1,Dendritic cells +PBS_CTCGTCAGTGCGGTAA-1,Macrophages +PBS_CTCTAATTCAGAGCTT-1,NK cells +PBS_CTCTACGAGCCGGTAA-1,Monocytes +PBS_CTCTGGTCAAAGGAAG-1,Macrophages +PBS_CTGAAGTAGTGGGATC-1,Macrophages +PBS_CTGAAGTGTGATAAAC-1,Monocytes +PBS_CTGATCCCACTGTTAG-1,Macrophages +PBS_CTGCCTACAGTCCTTC-1,Monocytes +PBS_CTGCCTAGTCTGCAAT-1,Monocytes +PBS_CTGCCTATCGAACGGA-1,Macrophages +PBS_CTGCCTATCGCAAGCC-1,Monocytes +PBS_CTGCCTATCGGCGCAT-1,Macrophages +PBS_CTGCGGATCTTGTTTG-1,Macrophages +PBS_CTGCTGTTCACCACCT-1,Monocytes +PBS_CTGGTCTAGCGGCTTC-1,Monocytes +PBS_CTGGTCTCACCTCGTT-1,Monocytes +PBS_CTGGTCTGTGCCTGCA-1,NK cells +PBS_CTGTTTAGTCAGGACA-1,Monocytes +PBS_CTTAACTGTAATCGTC-1,Monocytes +PBS_CTTACCGAGGTGATAT-1,Macrophages +PBS_CTTACCGGTCTCCATC-1,Macrophages +PBS_CTTAGGAAGCTATGCT-1,Macrophages +PBS_CTTCTCTCATTCCTGC-1,T cells +PBS_CTTCTCTTCACCAGGC-1,Monocytes +PBS_CTTGGCTGTAGCTCCG-1,Macrophages +PBS_CTTGGCTGTCATATGC-1,Monocytes +PBS_CTTGGCTGTGACTCAT-1,Macrophages +PBS_CTTGGCTTCCTGTACC-1,Macrophages +PBS_CTTGGCTTCCTTGACC-1,T cells +PBS_CTTTGCGGTCTCCATC-1,Monocytes +PBS_GAAACTCAGAGCAATT-1,Monocytes +PBS_GAAACTCAGTCAAGCG-1,Macrophages +PBS_GAAACTCCACACCGCA-1,Macrophages +PBS_GAAACTCTCCTAAGTG-1,Monocytes +PBS_GAAATGATCGGCTACG-1,Granulocytes +PBS_GAAATGATCTACCAGA-1,Monocytes +PBS_GAACCTAAGGGTGTGT-1,Granulocytes +PBS_GAACCTAGTGCTCTTC-1,Monocytes +PBS_GAACGGACAACTGGCC-1,Macrophages +PBS_GAACGGAGTAAATGAC-1,Monocytes +PBS_GAACGGAGTGACGCCT-1,Monocytes +PBS_GAAGCAGGTTATCCGA-1,Monocytes +PBS_GAAGCAGTCTAACTTC-1,Macrophages +PBS_GAATAAGCAGTCACTA-1,Monocytes +PBS_GAATAAGCATGGTCTA-1,Monocytes +PBS_GAATGAACAGCTTAAC-1,Monocytes +PBS_GAATGAATCAACACCA-1,Monocytes +PBS_GACACGCAGACTTTCG-1,Monocytes +PBS_GACACGCCAAGGACAC-1,Monocytes +PBS_GACACGCCAGTCAGAG-1,Monocytes +PBS_GACACGCCAGTTCATG-1,Fibroblasts +PBS_GACACGCGTGGTTTCA-1,Monocytes +PBS_GACACGCGTTCAGCGC-1,Monocytes +PBS_GACACGCTCGCATGAT-1,Dendritic cells +PBS_GACAGAGCAAAGTGCG-1,Granulocytes +PBS_GACAGAGTCTCTGAGA-1,Monocytes +PBS_GACCAATAGCTAGTGG-1,Dendritic cells +PBS_GACCTGGAGTGGCACA-1,Monocytes +PBS_GACCTGGGTATTACCG-1,Monocytes +PBS_GACCTGGTCTTCATGT-1,Monocytes +PBS_GACGGCTAGATGTCGG-1,NK cells +PBS_GACGTGCAGCGCCTTG-1,Dendritic cells +PBS_GACTAACCAGCGATCC-1,Monocytes +PBS_GACTAACTCCTTGCCA-1,Monocytes +PBS_GACTACAAGAGCTATA-1,Dendritic cells +PBS_GACTACAGTCCGAATT-1,Monocytes +PBS_GACTACATCGTGGACC-1,Monocytes +PBS_GACTACATCTTGAGGT-1,Monocytes +PBS_GACTGCGAGGACCACA-1,T cells +PBS_GACTGCGAGTGTTGAA-1,Monocytes +PBS_GACTGCGCACCCAGTG-1,Monocytes +PBS_GAGCAGAAGCTGATAA-1,Macrophages +PBS_GAGCAGATCGCCAGCA-1,Monocytes +PBS_GAGCAGATCTCTGAGA-1,Monocytes +PBS_GAGGTGAAGGACTGGT-1,Monocytes +PBS_GAGGTGAGTAGCTGCC-1,Monocytes +PBS_GAGGTGAGTAGGCATG-1,Monocytes +PBS_GAGTCCGAGTACGTTC-1,Dendritic cells +PBS_GAGTCCGAGTCCATAC-1,Monocytes +PBS_GATCAGTAGTGCAAGC-1,Granulocytes +PBS_GATCAGTGTAGTAGTA-1,Macrophages +PBS_GATCGATAGAATAGGG-1,Macrophages +PBS_GATCGATAGACCTTTG-1,Macrophages +PBS_GATCGATAGCCACGCT-1,T cells +PBS_GATCGATCATCACCCT-1,Monocytes +PBS_GATCGATGTACCGGCT-1,Monocytes +PBS_GATCGCGGTACGCTGC-1,Monocytes +PBS_GATCGCGGTTATCCGA-1,Monocytes +PBS_GATCGCGTCTGTCTAT-1,Monocytes +PBS_GATCGTAGTCTTGATG-1,Monocytes +PBS_GATCTAGAGGCGACAT-1,Monocytes +PBS_GATCTAGAGTTAGCGG-1,Monocytes +PBS_GATGAGGAGGCGATAC-1,Macrophages +PBS_GATGCTAAGTGGTCCC-1,Monocytes +PBS_GATGCTAGTCGCATAT-1,Macrophages +PBS_GATTCAGAGATGAGAG-1,Monocytes +PBS_GCAAACTGTTAAAGAC-1,Monocytes +PBS_GCAAACTTCCGAAGAG-1,Monocytes +PBS_GCAATCAAGAGTTGGC-1,Monocytes +PBS_GCAATCACAGTCCTTC-1,Monocytes +PBS_GCAATCACATCCAACA-1,Monocytes +PBS_GCAATCAGTACTTCTT-1,Monocytes +PBS_GCAATCAGTCTGCCAG-1,Monocytes +PBS_GCACATACAAGCCGTC-1,T cells +PBS_GCACATACATCGATTG-1,Dendritic cells +PBS_GCACATACATGCGCAC-1,Monocytes +PBS_GCACTCTAGAGAGCTC-1,Monocytes +PBS_GCACTCTAGCTGCGAA-1,Macrophages +PBS_GCAGCCACAGAGTGTG-1,Macrophages +PBS_GCAGCCATCTGTGCAA-1,Monocytes +PBS_GCAGTTAAGCCACGCT-1,Monocytes +PBS_GCAGTTACAGCCTTGG-1,Monocytes +PBS_GCATACAAGATGCCAG-1,Monocytes +PBS_GCATACAAGGCTAGGT-1,Monocytes +PBS_GCATACACAGGGTATG-1,Monocytes +PBS_GCATACATCAAGATCC-1,Dendritic cells +PBS_GCATACATCATGTGGT-1,Monocytes +PBS_GCATGATAGAGACGAA-1,Monocytes +PBS_GCATGCGAGCGTTTAC-1,Monocytes +PBS_GCATGCGAGGCTAGAC-1,Macrophages +PBS_GCATGCGGTCCGAATT-1,Monocytes +PBS_GCATGTAAGACCCACC-1,Monocytes +PBS_GCCAAATCACCAGTTA-1,Monocytes +PBS_GCCAAATGTGTTGAGG-1,T cells +PBS_GCCAAATTCAGGTTCA-1,Macrophages +PBS_GCCTCTAGTCTGGAGA-1,Monocytes +PBS_GCGACCACAGTTCATG-1,Monocytes +PBS_GCGACCATCTTACCTA-1,Monocytes +PBS_GCGAGAAAGAGCTTCT-1,Monocytes +PBS_GCGCAACAGGACCACA-1,Monocytes +PBS_GCGCAACCATCGGTTA-1,Monocytes +PBS_GCGCAACGTACCTACA-1,Monocytes +PBS_GCGCAGTAGACTAGAT-1,Dendritic cells +PBS_GCGCAGTTCGCCGTGA-1,Monocytes +PBS_GCGCCAAGTACCCAAT-1,NK cells +PBS_GCGCCAAGTAGTGAAT-1,Monocytes +PBS_GCGCCAAGTCCGAAGA-1,Monocytes +PBS_GCGCCAATCTCTGAGA-1,Monocytes +PBS_GCGCGATAGGCTATCT-1,Macrophages +PBS_GCGCGATTCCCTTGTG-1,Macrophages +PBS_GCGGGTTCACTCTGTC-1,Monocytes +PBS_GCGGGTTCAGGAATCG-1,Dendritic cells +PBS_GCTCCTATCATCTGCC-1,Monocytes +PBS_GCTCTGTAGCCAGAAC-1,Macrophages +PBS_GCTCTGTCAGGGTATG-1,Monocytes +PBS_GCTGCAGCAGTCGATT-1,Monocytes +PBS_GCTGCAGTCAGAGCTT-1,Monocytes +PBS_GCTGCAGTCCCTGACT-1,Macrophages +PBS_GCTGCGACATTATCTC-1,Monocytes +PBS_GCTGCGAGTATCGCAT-1,Monocytes +PBS_GCTGCGAGTGACTACT-1,Macrophages +PBS_GCTGCTTTCAACACAC-1,Macrophages +PBS_GCTGCTTTCTAACTCT-1,Monocytes +PBS_GCTGGGTCACAGTCGC-1,Monocytes +PBS_GCTGGGTCATGCCTAA-1,Monocytes +PBS_GCTTGAAGTTTACTCT-1,Macrophages +PBS_GGAAAGCCAAACAACA-1,Monocytes +PBS_GGAAAGCCAGCTGTGC-1,Monocytes +PBS_GGAAAGCCAGGACGTA-1,Monocytes +PBS_GGAAAGCGTATAAACG-1,Monocytes +PBS_GGAAAGCGTCGGCATC-1,Monocytes +PBS_GGAAAGCGTTATCACG-1,Monocytes +PBS_GGAAAGCTCAGTTAGC-1,Monocytes +PBS_GGAACTTAGTTGCAGG-1,Monocytes +PBS_GGAACTTGTCTCCCTA-1,Granulocytes +PBS_GGAACTTTCCCTTGTG-1,Macrophages +PBS_GGAATAATCGGAAACG-1,Dendritic cells +PBS_GGACAAGGTCTCACCT-1,Monocytes +PBS_GGACAAGTCGTCCAGG-1,Monocytes +PBS_GGACATTGTAGGCTGA-1,Monocytes +PBS_GGACATTTCCCGACTT-1,Monocytes +PBS_GGACGTCGTTAAGACA-1,Monocytes +PBS_GGACGTCGTTCGTCTC-1,Monocytes +PBS_GGACGTCTCGGAAATA-1,Monocytes +PBS_GGAGCAATCAGAGACG-1,Monocytes +PBS_GGATGTTAGCTACCTA-1,Monocytes +PBS_GGATGTTTCCTGCTTG-1,Dendritic cells +PBS_GGCAATTAGAGGACGG-1,Monocytes +PBS_GGCAATTGTAGAGGAA-1,Monocytes +PBS_GGCCGATAGGGATACC-1,Monocytes +PBS_GGCCGATGTGCAACTT-1,Monocytes +PBS_GGCCGATTCCGTCAAA-1,Monocytes +PBS_GGCCGATTCGAATGCT-1,Monocytes +PBS_GGCCGATTCTAACTGG-1,T cells +PBS_GGCCGATTCTGGTATG-1,Macrophages +PBS_GGCGACTGTCTTGATG-1,Monocytes +PBS_GGCGTGTCAACGATGG-1,Macrophages +PBS_GGCGTGTCACATGTGT-1,Monocytes +PBS_GGCGTGTGTATATGGA-1,Monocytes +PBS_GGCTCGACACTTCTGC-1,Macrophages +PBS_GGCTCGATCGTTGACA-1,Monocytes +PBS_GGCTGGTAGCCCGAAA-1,Monocytes +PBS_GGCTGGTTCAAAGACA-1,Monocytes +PBS_GGGAATGAGTCTCGGC-1,Monocytes +PBS_GGGAATGTCTTAGCCC-1,Monocytes +PBS_GGGACCTCAGTAGAGC-1,Monocytes +PBS_GGGACCTTCATGTAGC-1,Macrophages +PBS_GGGAGATGTCCATCCT-1,Monocytes +PBS_GGGAGATGTGATAAAC-1,Monocytes +PBS_GGGATGATCCACTCCA-1,Monocytes +PBS_GGGCACTAGCTACCGC-1,Monocytes +PBS_GGGCACTGTGCTCTTC-1,Monocytes +PBS_GGGCACTTCCAGAAGG-1,Monocytes +PBS_GGGCACTTCGGCTTGG-1,Monocytes +PBS_GGGCATCAGCTGAAAT-1,Monocytes +PBS_GGGCATCTCTAGAGTC-1,Monocytes +PBS_GGGTCTGAGCCCAGCT-1,Monocytes +PBS_GGGTCTGGTTGTGGAG-1,Monocytes +PBS_GGGTCTGTCTCAAGTG-1,Monocytes +PBS_GGGTTGCAGCGTCAAG-1,Monocytes +PBS_GGGTTGCCACTTGGAT-1,Monocytes +PBS_GGTATTGAGGGTCTCC-1,Monocytes +PBS_GGTATTGGTGTATGGG-1,Macrophages +PBS_GGTGAAGAGTGGGTTG-1,T cells +PBS_GGTGAAGCATCCCATC-1,Monocytes +PBS_GGTGAAGGTAAAGTCA-1,Monocytes +PBS_GGTGTTACATAAAGGT-1,Monocytes +PBS_GGTGTTATCACCGTAA-1,Monocytes +PBS_GGTGTTATCGTCGTTC-1,Macrophages +PBS_GGTGTTATCTAACTCT-1,Monocytes +PBS_GTAACGTGTAAATGAC-1,Monocytes +PBS_GTAACTGGTAGCTGCC-1,T cells +PBS_GTAACTGGTCGATTGT-1,Monocytes +PBS_GTAACTGTCCACGTGG-1,Monocytes +PBS_GTACGTAAGTGAAGAG-1,Monocytes +PBS_GTACGTACAATGGAGC-1,Monocytes +PBS_GTACGTACATATGAGA-1,Monocytes +PBS_GTACGTAGTATTACCG-1,Monocytes +PBS_GTACTCCAGGAGCGAG-1,Monocytes +PBS_GTACTTTCACATGTGT-1,Dendritic cells +PBS_GTACTTTCATCACGTA-1,Monocytes +PBS_GTACTTTTCACTCCTG-1,Macrophages +PBS_GTAGTCAAGATCACGG-1,Monocytes +PBS_GTAGTCAAGGCACATG-1,Monocytes +PBS_GTAGTCACATCGATGT-1,Monocytes +PBS_GTAGTCAGTCATATGC-1,Monocytes +PBS_GTAGTCAGTGATAAGT-1,Monocytes +PBS_GTAGTCAGTTGGTTTG-1,Monocytes +PBS_GTATCTTCAAGAGGCT-1,Monocytes +PBS_GTATTCTGTGGTCCGT-1,Monocytes +PBS_GTATTCTTCTGCGGCA-1,Monocytes +PBS_GTCAAGTAGGGTCGAT-1,Macrophages +PBS_GTCAAGTAGTGGTCCC-1,Monocytes +PBS_GTCAAGTGTGCACTTA-1,Dendritic cells +PBS_GTCACAAAGCCGATTT-1,Monocytes +PBS_GTCACAACACGACGAA-1,Monocytes +PBS_GTCACGGAGGAACTGC-1,Monocytes +PBS_GTCACGGTCTTGTCAT-1,Dendritic cells +PBS_GTCATTTCAATAGCAA-1,Macrophages +PBS_GTCATTTTCACCACCT-1,Monocytes +PBS_GTCATTTTCATCGATG-1,Monocytes +PBS_GTCCTCAAGCTGTCTA-1,Monocytes +PBS_GTCCTCAGTTTACTCT-1,T cells +PBS_GTCGGGTAGATATGGT-1,Macrophages +PBS_GTCGGGTTCCAGTATG-1,Monocytes +PBS_GTCGTAAAGTGCCATT-1,Monocytes +PBS_GTCGTAACAAGGGTCA-1,Dendritic cells +PBS_GTCGTAAGTTTGACTG-1,T cells +PBS_GTCTCGTAGATATACG-1,Monocytes +PBS_GTCTCGTAGGTGTTAA-1,Monocytes +PBS_GTCTCGTCATCGATTG-1,Monocytes +PBS_GTCTCGTGTAATCACC-1,T cells +PBS_GTCTCGTGTTACCGAT-1,Monocytes +PBS_GTCTCGTTCGCGGATC-1,Monocytes +PBS_GTCTCGTTCTCTGTCG-1,Dendritic cells +PBS_GTCTTCGGTGCCTGTG-1,Monocytes +PBS_GTGAAGGGTACCGTAT-1,Macrophages +PBS_GTGAAGGTCCCGACTT-1,Monocytes +PBS_GTGCAGCAGGCGTACA-1,Monocytes +PBS_GTGCAGCCATGGTTGT-1,Monocytes +PBS_GTGCAGCCATTAACCG-1,Macrophages +PBS_GTGCATAAGCAACGGT-1,Macrophages +PBS_GTGCATAGTTACGACT-1,Monocytes +PBS_GTGCGGTCAGGATTGG-1,Monocytes +PBS_GTGCGGTCATATACGC-1,Monocytes +PBS_GTGCGGTTCGGTGTTA-1,Monocytes +PBS_GTGCTTCAGGGCATGT-1,Macrophages +PBS_GTGCTTCGTCGGCATC-1,Monocytes +PBS_GTGCTTCTCATCACCC-1,Monocytes +PBS_GTGCTTCTCCAGAGGA-1,Monocytes +PBS_GTGGGTCAGCTAACTC-1,Macrophages +PBS_GTGGGTCAGGCCCTCA-1,Monocytes +PBS_GTGTTAGAGCCACTAT-1,Monocytes +PBS_GTGTTAGGTAAACACA-1,Monocytes +PBS_GTGTTAGGTCAGGACA-1,Monocytes +PBS_GTGTTAGTCGAGAGCA-1,Monocytes +PBS_GTGTTAGTCGCCGTGA-1,Macrophages +PBS_GTTAAGCTCACTTCAT-1,Macrophages +PBS_GTTACAGAGTGCAAGC-1,Monocytes +PBS_GTTCATTAGATGAGAG-1,Monocytes +PBS_GTTCATTAGTCATGCT-1,Monocytes +PBS_GTTCATTTCTCAACTT-1,Dendritic cells +PBS_GTTCGGGAGTTACGGG-1,Macrophages +PBS_GTTCGGGGTTACCGAT-1,Monocytes +PBS_GTTCTCGCAATCTGCA-1,Macrophages +PBS_GTTCTCGGTATGAATG-1,Monocytes +PBS_GTTCTCGTCTGGAGCC-1,Monocytes +PBS_GTTTCTATCGCAAGCC-1,Monocytes +PBS_GTTTCTATCGCGTAGC-1,Macrophages +PBS_TAAACCGAGATCGGGT-1,Dendritic cells +PBS_TAAGAGAAGAAGGACA-1,Monocytes +PBS_TAAGAGATCTAGAGTC-1,Monocytes +PBS_TAAGAGATCTCTAAGG-1,Monocytes +PBS_TAAGCGTAGACGCAAC-1,Monocytes +PBS_TAAGCGTGTATGAATG-1,Monocytes +PBS_TAAGTGCAGACACGAC-1,Monocytes +PBS_TAAGTGCAGGTACTCT-1,Granulocytes +PBS_TAAGTGCCATCGATTG-1,Monocytes +PBS_TACACGAAGCACACAG-1,Dendritic cells +PBS_TACACGAGTAACGTTC-1,Macrophages +PBS_TACACGAGTGCCTTGG-1,Monocytes +PBS_TACACGAGTTCCGTCT-1,Monocytes +PBS_TACAGTGCAGGTCTCG-1,Monocytes +PBS_TACAGTGTCCAACCAA-1,Monocytes +PBS_TACCTATAGGTGCAAC-1,Monocytes +PBS_TACCTATGTAGAAGGA-1,Dendritic cells +PBS_TACCTTACAAGAGGCT-1,Monocytes +PBS_TACCTTACACAACTGT-1,NK cells +PBS_TACCTTATCCGCAAGC-1,T cells +PBS_TACGGATAGTCCAGGA-1,Granulocytes +PBS_TACGGATAGTGATCGG-1,Monocytes +PBS_TACGGTACATTGGCGC-1,Macrophages +PBS_TACGGTAGTAAAGGAG-1,Monocytes +PBS_TACGGTAGTCTCTCTG-1,Monocytes +PBS_TACGGTATCACCATAG-1,Monocytes +PBS_TACTCATAGACACTAA-1,Monocytes +PBS_TACTCATAGAGACTAT-1,Monocytes +PBS_TACTCATGTCTTCAAG-1,Monocytes +PBS_TACTCATTCGTAGGTT-1,Monocytes +PBS_TACTCGCCAAAGGAAG-1,Monocytes +PBS_TACTCGCGTATAGTAG-1,Macrophages +PBS_TACTCGCGTGTGAATA-1,Monocytes +PBS_TACTCGCTCCTAGGGC-1,Monocytes +PBS_TACTTACGTGGCAAAC-1,Monocytes +PBS_TACTTACGTGGCCCTA-1,Monocytes +PBS_TACTTGTAGAAGGGTA-1,Macrophages +PBS_TACTTGTGTTTAGGAA-1,Monocytes +PBS_TACTTGTTCCTGCCAT-1,Monocytes +PBS_TAGACCAGTCCAGTGC-1,Monocytes +PBS_TAGACCAGTGAAATCA-1,Macrophages +PBS_TAGCCGGTCGCACTCT-1,Monocytes +PBS_TAGCCGGTCGTGACAT-1,Monocytes +PBS_TAGGCATTCAATAAGG-1,Monocytes +PBS_TAGTTGGAGCGATGAC-1,Monocytes +PBS_TAGTTGGAGGGTCTCC-1,Monocytes +PBS_TAGTTGGAGTTCGCGC-1,Monocytes +PBS_TAGTTGGCAAGCGTAG-1,Monocytes +PBS_TAGTTGGTCCCAAGTA-1,T cells +PBS_TAGTTGGTCCGGCACA-1,Macrophages +PBS_TATCAGGGTGGACGAT-1,Monocytes +PBS_TATCTCACAGTCAGAG-1,Monocytes +PBS_TATCTCACATATACGC-1,T cells +PBS_TATGCCCGTGCTCTTC-1,Monocytes +PBS_TATGCCCTCATCACCC-1,Macrophages +PBS_TATGCCCTCCAAGCCG-1,Monocytes +PBS_TATGCCCTCTGTACGA-1,Monocytes +PBS_TATTACCAGACAGGCT-1,Monocytes +PBS_TATTACCCACTACAGT-1,Macrophages +PBS_TATTACCGTGATGTGG-1,Monocytes +PBS_TATTACCTCGTATCAG-1,Monocytes +PBS_TCAACGAAGAAGGCCT-1,Granulocytes +PBS_TCAACGACACCACCAG-1,Monocytes +PBS_TCAATCTTCACAGGCC-1,Monocytes +PBS_TCACAAGAGACTTGAA-1,Monocytes +PBS_TCACAAGAGCATGGCA-1,Monocytes +PBS_TCACGAAAGAGCTGGT-1,Macrophages +PBS_TCACGAACAGACGCAA-1,Macrophages +PBS_TCAGATGAGAGTTGGC-1,Macrophages +PBS_TCAGATGAGCGTAATA-1,Monocytes +PBS_TCAGATGAGGTGATTA-1,Macrophages +PBS_TCAGATGGTGTGGCTC-1,Dendritic cells +PBS_TCAGCAAAGCGTGAAC-1,Macrophages +PBS_TCAGCAAAGTGTTAGA-1,Macrophages +PBS_TCAGCAAGTAATTGGA-1,Monocytes +PBS_TCAGCAAGTTAAGACA-1,Monocytes +PBS_TCAGCAATCAGTACGT-1,Dendritic cells +PBS_TCAGCAATCGCGCCAA-1,Monocytes +PBS_TCAGCTCAGCCAGTTT-1,Monocytes +PBS_TCAGCTCAGGAATGGA-1,Macrophages +PBS_TCAGCTCGTGCGATAG-1,Macrophages +PBS_TCAGCTCTCTTGCCGT-1,Monocytes +PBS_TCAGGATAGTACGATA-1,Monocytes +PBS_TCAGGATTCATGTGGT-1,Monocytes +PBS_TCAGGTAAGGCTAGCA-1,Macrophages +PBS_TCAGGTAGTAAGGGCT-1,Monocytes +PBS_TCAGGTAGTACAAGTA-1,Monocytes +PBS_TCATTACTCGGTCTAA-1,Macrophages +PBS_TCCACACGTCAAGCGA-1,Monocytes +PBS_TCCCGATCAACGATCT-1,Macrophages +PBS_TCCCGATGTGTTAAGA-1,Monocytes +PBS_TCCCGATTCATAGCAC-1,Granulocytes +PBS_TCGAGGCCATAGGATA-1,Monocytes +PBS_TCGCGTTAGCCAACAG-1,Monocytes +PBS_TCGCGTTAGCTAAACA-1,Granulocytes +PBS_TCGCGTTGTACGCTGC-1,Monocytes +PBS_TCGCGTTGTCTTCAAG-1,Monocytes +PBS_TCGGGACAGACCTAGG-1,Macrophages +PBS_TCGGGACCAAACGCGA-1,Monocytes +PBS_TCGGGACTCCTCGCAT-1,Monocytes +PBS_TCGGGACTCGTGACAT-1,Monocytes +PBS_TCGGTAAGTCTGGAGA-1,Monocytes +PBS_TCGTACCCACGGTAGA-1,Monocytes +PBS_TCGTACCGTCTCTTTA-1,Monocytes +PBS_TCGTAGACACTAAGTC-1,Granulocytes +PBS_TCGTAGACATACGCCG-1,Monocytes +PBS_TCGTAGACATGTAGTC-1,Macrophages +PBS_TCGTAGAGTGTGGTTT-1,Macrophages +PBS_TCGTAGATCACGCGGT-1,T cells +PBS_TCTATTGAGCGGATCA-1,Monocytes +PBS_TCTATTGAGTGGGCTA-1,Macrophages +PBS_TCTATTGGTCCGACGT-1,Macrophages +PBS_TCTATTGTCACCACCT-1,Macrophages +PBS_TCTCATAAGATATACG-1,Monocytes +PBS_TCTCATAAGATCTGCT-1,Macrophages +PBS_TCTCATACAACAACCT-1,Macrophages +PBS_TCTCATAGTCTTCGTC-1,Monocytes +PBS_TCTCATATCTATCCCG-1,Monocytes +PBS_TCTCTAACATGGATGG-1,Macrophages +PBS_TCTCTAACATTGCGGC-1,Macrophages +PBS_TCTCTAAGTTGAGGTG-1,Monocytes +PBS_TCTGAGAAGCTGTCTA-1,Macrophages +PBS_TCTGAGAAGGAGTCTG-1,Monocytes +PBS_TCTGGAAAGGGTCTCC-1,Monocytes +PBS_TCTTTCCAGGCACATG-1,Monocytes +PBS_TCTTTCCAGGCTCAGA-1,Monocytes +PBS_TGAAAGAGTATTCGTG-1,Macrophages +PBS_TGACAACAGCCACGTC-1,Granulocytes +PBS_TGACAACAGGAGCGTT-1,Monocytes +PBS_TGACAACAGTGGGATC-1,Monocytes +PBS_TGACGGCCATATGGTC-1,Monocytes +PBS_TGACGGCGTAAAGGAG-1,Monocytes +PBS_TGACGGCGTATTCGTG-1,Monocytes +PBS_TGACGGCGTGGTGTAG-1,Monocytes +PBS_TGACTAGCAGCCTTTC-1,Monocytes +PBS_TGACTAGCATCAGTCA-1,Monocytes +PBS_TGACTAGTCCTTGACC-1,Monocytes +PBS_TGACTAGTCGAGAACG-1,Dendritic cells +PBS_TGACTTTTCAGCACAT-1,Monocytes +PBS_TGACTTTTCTTGCCGT-1,Monocytes +PBS_TGAGAGGGTTCTGAAC-1,Monocytes +PBS_TGAGAGGTCATTGCGA-1,Monocytes +PBS_TGAGAGGTCTATGTGG-1,Macrophages +PBS_TGAGCATGTTCGTGAT-1,Monocytes +PBS_TGAGCCGCACTTGGAT-1,Monocytes +PBS_TGAGCCGCAGTAAGCG-1,Monocytes +PBS_TGAGCCGTCAGGCCCA-1,Monocytes +PBS_TGAGCCGTCGTAGGAG-1,Monocytes +PBS_TGAGGGAAGGTGGGTT-1,Macrophages +PBS_TGAGGGACAGACAAAT-1,Granulocytes +PBS_TGAGGGAGTAGAAAGG-1,Monocytes +PBS_TGAGGGAGTATAATGG-1,Macrophages +PBS_TGATTTCAGCAGCCTC-1,Monocytes +PBS_TGCACCTCACGGTAGA-1,Monocytes +PBS_TGCACCTGTGAAAGAG-1,Monocytes +PBS_TGCCCATGTCCGAAGA-1,Monocytes +PBS_TGCCCTACAGTGGGAT-1,Monocytes +PBS_TGCCCTACATGCTAGT-1,Monocytes +PBS_TGCCCTAGTCCTCCAT-1,Monocytes +PBS_TGCGCAGAGTGGTCCC-1,Monocytes +PBS_TGCGCAGAGTTAGCGG-1,Monocytes +PBS_TGCGCAGCAGGGTATG-1,Monocytes +PBS_TGCGCAGGTTAGAACA-1,Macrophages +PBS_TGCGGGTCAATAACGA-1,Monocytes +PBS_TGCGGGTGTCTCATCC-1,Monocytes +PBS_TGCGGGTGTGCTGTAT-1,Monocytes +PBS_TGCGTGGAGATCCTGT-1,Macrophages +PBS_TGCGTGGTCAAGGCTT-1,Macrophages +PBS_TGCTACCTCCTAGAAC-1,Macrophages +PBS_TGCTGCTAGGCTAGAC-1,Monocytes +PBS_TGCTGCTTCTAACTCT-1,Monocytes +PBS_TGGACGCAGGATATAC-1,Monocytes +PBS_TGGACGCAGGCTAGGT-1,Monocytes +PBS_TGGACGCAGGGAAACA-1,Monocytes +PBS_TGGACGCCAGGATTGG-1,Monocytes +PBS_TGGACGCGTCCGTGAC-1,Monocytes +PBS_TGGCCAGCAGTATCTG-1,Monocytes +PBS_TGGCTGGTCATTATCC-1,Monocytes +PBS_TGGGAAGAGGTGCAAC-1,Monocytes +PBS_TGGGAAGAGTTATCGC-1,Monocytes +PBS_TGGGAAGTCACTTACT-1,Monocytes +PBS_TGGGAAGTCATGCTCC-1,Macrophages +PBS_TGGGAAGTCTATCCTA-1,Monocytes +PBS_TGGGCGTCACAGGTTT-1,Monocytes +PBS_TGGGCGTCACCGGAAA-1,Monocytes +PBS_TGGTTAGGTAAGGATT-1,Monocytes +PBS_TGGTTAGTCAACCATG-1,Monocytes +PBS_TGGTTAGTCGGCGCAT-1,Monocytes +PBS_TGGTTCCGTTCCACGG-1,Monocytes +PBS_TGTATTCAGTGCCAGA-1,Monocytes +PBS_TGTATTCCAAGTTAAG-1,Macrophages +PBS_TGTATTCCATCGGAAG-1,Monocytes +PBS_TGTATTCGTTCTGAAC-1,Monocytes +PBS_TGTCCCAAGACATAAC-1,Monocytes +PBS_TGTCCCAAGTAATCCC-1,Monocytes +PBS_TGTCCCACATGGTTGT-1,Monocytes +PBS_TGTCCCAGTAAGTAGT-1,T cells +PBS_TGTCCCAGTGGTACAG-1,Monocytes +PBS_TGTGGTAGTTTGTTTC-1,Monocytes +PBS_TGTTCCGAGTCCATAC-1,Macrophages +PBS_TGTTCCGGTATAGGTA-1,Monocytes +PBS_TGTTCCGGTCGTCTTC-1,Macrophages +PBS_TTAGGACTCAGCGACC-1,Monocytes +PBS_TTAGGCAAGTACCGGA-1,Monocytes +PBS_TTAGGCAAGTCGAGTG-1,Monocytes +PBS_TTAGGCAGTAGCGTGA-1,Monocytes +PBS_TTAGGCATCCACGTTC-1,Macrophages +PBS_TTAGTTCAGTCAATAG-1,Dendritic cells +PBS_TTAGTTCGTTTCCACC-1,Monocytes +PBS_TTAGTTCTCAACACAC-1,Monocytes +PBS_TTAGTTCTCGCAAACT-1,Monocytes +PBS_TTATGCTAGTCACGCC-1,Monocytes +PBS_TTCGAAGCACCACCAG-1,Monocytes +PBS_TTCGGTCCATCGGTTA-1,Monocytes +PBS_TTCGGTCTCGTGGTCG-1,Monocytes +PBS_TTCTACAAGTCCCACG-1,Macrophages +PBS_TTCTACACAGGATTGG-1,Granulocytes +PBS_TTCTACATCCCTCAGT-1,Monocytes +PBS_TTCTCAACACGAAGCA-1,Monocytes +PBS_TTCTCCTCAGTAGAGC-1,Monocytes +PBS_TTCTTAGGTCGCGTGT-1,Monocytes +PBS_TTCTTAGTCTTTCCTC-1,Monocytes +PBS_TTGACTTAGAGCTGCA-1,Monocytes +PBS_TTGACTTAGCCCAGCT-1,Monocytes +PBS_TTGACTTAGGGTTTCT-1,Monocytes +PBS_TTGACTTGTCTCCCTA-1,Monocytes +PBS_TTGCCGTAGAAGGCCT-1,Monocytes +PBS_TTGCCGTAGTCCATAC-1,Macrophages +PBS_TTGCGTCAGTGTACGG-1,Monocytes +PBS_TTGCGTCGTACCTACA-1,Monocytes +PBS_TTGCGTCGTTGCGTTA-1,Monocytes +PBS_TTGTAGGAGGACAGAA-1,Monocytes +PBS_TTGTAGGGTGGCTCCA-1,Monocytes +PBS_TTGTAGGGTTCACGGC-1,Monocytes +PBS_TTGTAGGTCTCCAACC-1,Granulocytes +PBS_TTTACTGTCCAGTATG-1,Monocytes +PBS_TTTATGCAGATACACA-1,Monocytes +PBS_TTTATGCAGCTATGCT-1,Monocytes +PBS_TTTATGCAGGATGGTC-1,Monocytes +PBS_TTTATGCTCAACTCTT-1,Macrophages +PBS_TTTCCTCAGATGAGAG-1,Monocytes +PBS_TTTCCTCCAACGATCT-1,Monocytes +PBS_TTTCCTCCACCCAGTG-1,Monocytes +PBS_TTTCCTCGTGCCTGGT-1,Monocytes +PBS_TTTCCTCGTGGGTATG-1,Macrophages +PBS_TTTGCGCAGCCCAATT-1,Macrophages +PBS_TTTGCGCAGTCTCCTC-1,Monocytes +PBS_TTTGCGCGTTAGTGGG-1,Monocytes +PBS_TTTGCGCTCCTAAGTG-1,Monocytes +PBS_TTTGCGCTCGAACTGT-1,Monocytes +PBS_TTTGGTTAGAGTTGGC-1,Monocytes +PBS_TTTGGTTGTATATGAG-1,Macrophages +ENT_AAACCTGAGACTAAGT-1,Monocytes +ENT_AAACCTGAGATGTTAG-1,Monocytes +ENT_AAACCTGAGCAACGGT-1,Monocytes +ENT_AAACCTGAGGTAGCTG-1,Monocytes +ENT_AAACCTGGTGTGAATA-1,Monocytes +ENT_AAACCTGGTTGCGTTA-1,Monocytes +ENT_AAACCTGTCGACGGAA-1,Monocytes +ENT_AAACGGGAGACAGACC-1,Monocytes +ENT_AAACGGGTCGTAGGTT-1,Monocytes +ENT_AAAGATGCAGGTCCAC-1,Monocytes +ENT_AAAGATGGTATATCCG-1,Monocytes +ENT_AAAGATGTCGCTTGTC-1,Monocytes +ENT_AAAGCAACAATAGCAA-1,Monocytes +ENT_AAAGCAACAATGGTCT-1,Monocytes +ENT_AAAGCAACACAGGTTT-1,Dendritic cells +ENT_AAAGCAAGTAAGCACG-1,T cells +ENT_AAAGCAAGTATATCCG-1,Monocytes +ENT_AAAGTAGCATATGAGA-1,Monocytes +ENT_AAAGTAGTCGGCGGTT-1,Monocytes +ENT_AAATGCCAGTCATCCA-1,Monocytes +ENT_AAATGCCCAAGGACAC-1,Monocytes +ENT_AAATGCCCACGGACAA-1,T cells +ENT_AAATGCCCAGTAGAGC-1,Monocytes +ENT_AACACGTAGTCATGCT-1,Monocytes +ENT_AACACGTGTCTAAAGA-1,Monocytes +ENT_AACACGTGTTCAGTAC-1,Monocytes +ENT_AACACGTGTTCCCTTG-1,Granulocytes +ENT_AACCATGAGACTAAGT-1,Dendritic cells +ENT_AACCATGCAGCAGTTT-1,Granulocytes +ENT_AACCATGCATGTTCCC-1,T cells +ENT_AACCATGGTCCATCCT-1,Dendritic cells +ENT_AACCATGTCGATCCCT-1,Monocytes +ENT_AACCGCGAGTAGATGT-1,Monocytes +ENT_AACCGCGAGTGATCGG-1,Monocytes +ENT_AACCGCGCAAAGTCAA-1,Granulocytes +ENT_AACCGCGGTGATGTGG-1,Monocytes +ENT_AACCGCGTCAGGTAAA-1,Granulocytes +ENT_AACGTTGCACTGTGTA-1,Monocytes +ENT_AACGTTGTCAAGAAGT-1,Granulocytes +ENT_AACTCAGCAATCCAAC-1,Monocytes +ENT_AACTCAGCATTGAGCT-1,Monocytes +ENT_AACTCAGGTCAAGCGA-1,Dendritic cells +ENT_AACTCAGTCTCCAGGG-1,Dendritic cells +ENT_AACTCCCCAAATACAG-1,Monocytes +ENT_AACTCCCGTCCGCTGA-1,Monocytes +ENT_AACTCCCGTGAACCTT-1,Monocytes +ENT_AACTCTTAGAAGGTTT-1,Monocytes +ENT_AACTCTTAGGAGTCTG-1,Monocytes +ENT_AACTCTTAGTCATGCT-1,Monocytes +ENT_AACTCTTCAATAGAGT-1,Monocytes +ENT_AACTGGTCAAGCGTAG-1,Monocytes +ENT_AACTGGTCATGCAACT-1,Monocytes +ENT_AACTGGTGTCTCCATC-1,Dendritic cells +ENT_AACTGGTGTGCCTGCA-1,Monocytes +ENT_AACTGGTTCACATAGC-1,Monocytes +ENT_AACTGGTTCTAACTTC-1,Monocytes +ENT_AACTTTCAGAAACGCC-1,Monocytes +ENT_AACTTTCAGGCCGAAT-1,Granulocytes +ENT_AACTTTCCACATCCGG-1,Granulocytes +ENT_AAGACCTAGCCGGTAA-1,Monocytes +ENT_AAGACCTCAAGGTGTG-1,Monocytes +ENT_AAGACCTGTAGATTAG-1,Monocytes +ENT_AAGACCTGTCTTCAAG-1,Monocytes +ENT_AAGACCTTCTAACCGA-1,Monocytes +ENT_AAGCCGCCAATGAAAC-1,Monocytes +ENT_AAGCCGCCATTTCACT-1,Monocytes +ENT_AAGCCGCGTTGTGGCC-1,Monocytes +ENT_AAGCCGCGTTTGGGCC-1,Monocytes +ENT_AAGCCGCTCGCTGATA-1,Monocytes +ENT_AAGGAGCAGACGCTTT-1,Monocytes +ENT_AAGGAGCAGCATCATC-1,Monocytes +ENT_AAGGAGCAGTCCGGTC-1,Monocytes +ENT_AAGGAGCCAAGCGATG-1,Monocytes +ENT_AAGGCAGAGTTGAGAT-1,Monocytes +ENT_AAGGCAGGTAGAGCTG-1,Monocytes +ENT_AAGGCAGGTCAGATAA-1,Dendritic cells +ENT_AAGGCAGGTGAGTATA-1,Monocytes +ENT_AAGGCAGGTTGTCGCG-1,Monocytes +ENT_AAGGCAGTCTCTAGGA-1,Monocytes +ENT_AAGGTTCCAAATACAG-1,Dendritic cells +ENT_AAGGTTCTCACTTATC-1,Monocytes +ENT_AAGGTTCTCCGAACGC-1,Monocytes +ENT_AAGTCTGAGAACAACT-1,Monocytes +ENT_AAGTCTGAGCTGAACG-1,Monocytes +ENT_AAGTCTGGTACAGACG-1,Monocytes +ENT_AAGTCTGGTATATCCG-1,Monocytes +ENT_AAGTCTGGTGCAGGTA-1,Monocytes +ENT_AAGTCTGGTGGCCCTA-1,Monocytes +ENT_AAGTCTGTCAGTCAGT-1,Monocytes +ENT_AAGTCTGTCGGAATCT-1,T cells +ENT_AATCCAGAGGTGTGGT-1,Monocytes +ENT_AATCCAGAGTTAGCGG-1,Monocytes +ENT_AATCCAGCACCGAATT-1,Monocytes +ENT_AATCCAGCAGCGTTCG-1,Monocytes +ENT_AATCCAGGTCAGAATA-1,Granulocytes +ENT_AATCCAGTCAGGCCCA-1,Monocytes +ENT_AATCCAGTCATTTGGG-1,Granulocytes +ENT_AATCCAGTCCGTAGTA-1,Monocytes +ENT_AATCGGTAGCGATAGC-1,Dendritic cells +ENT_AATCGGTAGTTGAGTA-1,Monocytes +ENT_AATCGGTCACTTACGA-1,Dendritic cells +ENT_AATCGGTGTGTTTGGT-1,Monocytes +ENT_AATCGGTTCGCGCCAA-1,Granulocytes +ENT_AATCGGTTCGTCGTTC-1,Dendritic cells +ENT_ACACCAAAGCTGCGAA-1,Monocytes +ENT_ACACCAAAGTGTTTGC-1,Monocytes +ENT_ACACCAACAAGTTAAG-1,Monocytes +ENT_ACACCAACATAACCTG-1,Monocytes +ENT_ACACCAAGTGCTTCTC-1,Monocytes +ENT_ACACCAATCATGTCCC-1,Monocytes +ENT_ACACCAATCTTTAGGG-1,Dendritic cells +ENT_ACACCCTAGACGCACA-1,Granulocytes +ENT_ACACCCTCATTCGACA-1,Monocytes +ENT_ACACCGGAGAGCTTCT-1,Monocytes +ENT_ACACCGGAGTATCTCG-1,Macrophages +ENT_ACACCGGAGTCTCGGC-1,Monocytes +ENT_ACACCGGCACCCTATC-1,Monocytes +ENT_ACACCGGCACTAAGTC-1,Granulocytes +ENT_ACACCGGGTTCCAACA-1,Monocytes +ENT_ACACCGGTCACTTATC-1,Monocytes +ENT_ACACCGGTCAGTCAGT-1,T cells +ENT_ACACCGGTCATGTCTT-1,Macrophages +ENT_ACACCGGTCCAGAGGA-1,Monocytes +ENT_ACACTGACAGCTCCGA-1,Monocytes +ENT_ACACTGACATCACGTA-1,Monocytes +ENT_ACACTGAGTTTGGCGC-1,Monocytes +ENT_ACACTGATCGCAAGCC-1,Dendritic cells +ENT_ACAGCCGCAAAGGTGC-1,Monocytes +ENT_ACAGCCGCAAGAAAGG-1,Macrophages +ENT_ACAGCCGGTAGTGAAT-1,Monocytes +ENT_ACAGCCGGTTAAGTAG-1,Monocytes +ENT_ACAGCCGTCAGCTCTC-1,Monocytes +ENT_ACAGCTAAGAGACTAT-1,Monocytes +ENT_ACAGCTAAGGCTCATT-1,Dendritic cells +ENT_ACAGCTAAGTTGCAGG-1,Monocytes +ENT_ACAGCTACACAGACAG-1,Monocytes +ENT_ACAGCTACATGGGACA-1,Dendritic cells +ENT_ACAGCTAGTAGCTTGT-1,Monocytes +ENT_ACAGCTAGTGACGCCT-1,Granulocytes +ENT_ACAGCTAGTGGCGAAT-1,Monocytes +ENT_ACAGCTATCATTTGGG-1,Monocytes +ENT_ACAGCTATCCTATGTT-1,Macrophages +ENT_ACAGCTATCTCTGAGA-1,Monocytes +ENT_ACATACGAGAAGGGTA-1,Monocytes +ENT_ACATACGCACAACGTT-1,Dendritic cells +ENT_ACATACGCAGGCTGAA-1,Monocytes +ENT_ACATCAGAGACAGACC-1,Monocytes +ENT_ACATCAGCAATCAGAA-1,Granulocytes +ENT_ACATCAGTCGTCACGG-1,Granulocytes +ENT_ACATGGTAGGCCCGTT-1,Monocytes +ENT_ACATGGTCACGGTAGA-1,Granulocytes +ENT_ACATGGTCAGTGAGTG-1,Monocytes +ENT_ACATGGTTCGTGACAT-1,Monocytes +ENT_ACCAGTACACCAGTTA-1,Monocytes +ENT_ACCAGTACACCTGGTG-1,Monocytes +ENT_ACCAGTAGTAGCGTAG-1,Dendritic cells +ENT_ACCAGTAGTTAAGATG-1,Dendritic cells +ENT_ACCAGTAGTTAGGGTG-1,Granulocytes +ENT_ACCAGTATCTCTGAGA-1,Granulocytes +ENT_ACCCACTAGAGGTTAT-1,Granulocytes +ENT_ACCCACTAGGTGATAT-1,Monocytes +ENT_ACCCACTGTCTGGTCG-1,Monocytes +ENT_ACCCACTGTGATGTGG-1,Monocytes +ENT_ACCCACTGTTTGACTG-1,Monocytes +ENT_ACCCACTTCTTTAGTC-1,Monocytes +ENT_ACCGTAACAGCATGAG-1,Monocytes +ENT_ACCTTTAAGGCTAGCA-1,Monocytes +ENT_ACCTTTACAATGTTGC-1,Monocytes +ENT_ACCTTTACACGTCAGC-1,Monocytes +ENT_ACCTTTACAGCCAATT-1,Monocytes +ENT_ACCTTTAGTTGAGTTC-1,Monocytes +ENT_ACGAGCCCAGCGAACA-1,Granulocytes +ENT_ACGAGCCCAGCTCGCA-1,Granulocytes +ENT_ACGAGCCCATTCACTT-1,Granulocytes +ENT_ACGAGCCGTCCGAGTC-1,Granulocytes +ENT_ACGAGCCGTGCTTCTC-1,Monocytes +ENT_ACGAGGAAGCTAGTCT-1,Monocytes +ENT_ACGAGGACAACGCACC-1,Dendritic cells +ENT_ACGAGGACATAACCTG-1,Granulocytes +ENT_ACGAGGAGTACCGGCT-1,Monocytes +ENT_ACGAGGAGTGCTCTTC-1,T cells +ENT_ACGAGGAGTGGTCTCG-1,Granulocytes +ENT_ACGAGGAGTGTGACCC-1,Monocytes +ENT_ACGAGGAGTTGTTTGG-1,Monocytes +ENT_ACGATACAGGAGTAGA-1,Dendritic cells +ENT_ACGATACCAGTAGAGC-1,Granulocytes +ENT_ACGATACGTACAGCAG-1,Monocytes +ENT_ACGATACGTGATGTGG-1,Dendritic cells +ENT_ACGATACGTGTTGGGA-1,Monocytes +ENT_ACGATACTCACAATGC-1,Monocytes +ENT_ACGATGTAGAGTCTGG-1,Monocytes +ENT_ACGATGTAGCCCAACC-1,Monocytes +ENT_ACGATGTCACTCTGTC-1,Macrophages +ENT_ACGATGTGTTGTCTTT-1,Monocytes +ENT_ACGATGTTCAGCAACT-1,T cells +ENT_ACGATGTTCTCGCATC-1,Granulocytes +ENT_ACGCAGCTCTGGCGTG-1,Granulocytes +ENT_ACGCCAGCACAACTGT-1,Monocytes +ENT_ACGCCAGGTACTCAAC-1,Monocytes +ENT_ACGCCAGGTTACCGAT-1,T cells +ENT_ACGCCGAAGGACAGAA-1,Granulocytes +ENT_ACGCCGAAGGCTAGCA-1,Monocytes +ENT_ACGCCGATCAAGAAGT-1,Monocytes +ENT_ACGGAGAAGTAGGCCA-1,Monocytes +ENT_ACGGAGAGTGGACGAT-1,Monocytes +ENT_ACGGCCAAGCCTCGTG-1,T cells +ENT_ACGGCCACATGTTCCC-1,Granulocytes +ENT_ACGGCCAGTCTAGTCA-1,Monocytes +ENT_ACGGCCATCACCCTCA-1,Monocytes +ENT_ACGGCCATCATGCTCC-1,Monocytes +ENT_ACGGCCATCTGCAGTA-1,Granulocytes +ENT_ACGGGCTAGAGCTGGT-1,Macrophages +ENT_ACGGGCTAGCCCAATT-1,Monocytes +ENT_ACGGGCTAGTGTTGAA-1,Monocytes +ENT_ACGGGCTCATACGCTA-1,Monocytes +ENT_ACGGGCTGTGACTCAT-1,Monocytes +ENT_ACGGGCTGTTAAGATG-1,Dendritic cells +ENT_ACGGGCTTCCAGATCA-1,Monocytes +ENT_ACGGGCTTCCTAGAAC-1,Granulocytes +ENT_ACGGGCTTCTGCTTGC-1,Monocytes +ENT_ACGGGTCAGTTTGCGT-1,Monocytes +ENT_ACGTCAAAGATGAGAG-1,Dendritic cells +ENT_ACGTCAAAGCAGATCG-1,Monocytes +ENT_ACGTCAATCCTCAACC-1,Monocytes +ENT_ACTATCTAGAAAGTGG-1,T cells +ENT_ACTATCTCACGAGAGT-1,Granulocytes +ENT_ACTATCTGTGGCAAAC-1,Monocytes +ENT_ACTGAACAGCGTAATA-1,Monocytes +ENT_ACTGAACGTTGTCGCG-1,Monocytes +ENT_ACTGAACTCCTTGACC-1,Dendritic cells +ENT_ACTGAGTTCGAGGTAG-1,Monocytes +ENT_ACTGAGTTCGCAAGCC-1,Granulocytes +ENT_ACTGAGTTCTGTTTGT-1,Monocytes +ENT_ACTGATGAGTTCGCGC-1,Monocytes +ENT_ACTGATGCAATGGATA-1,Granulocytes +ENT_ACTGATGCACGAAATA-1,Granulocytes +ENT_ACTGATGTCATGTCTT-1,Monocytes +ENT_ACTGCTCCAATGAATG-1,Monocytes +ENT_ACTGCTCGTAAATACG-1,Granulocytes +ENT_ACTGCTCGTAATAGCA-1,Monocytes +ENT_ACTGCTCGTCATACTG-1,Monocytes +ENT_ACTGCTCGTCATATCG-1,Granulocytes +ENT_ACTGCTCGTGACAAAT-1,Monocytes +ENT_ACTGCTCGTGGCTCCA-1,Monocytes +ENT_ACTGTCCAGATGTTAG-1,Granulocytes +ENT_ACTGTCCAGCTAGTGG-1,Monocytes +ENT_ACTGTCCTCACATACG-1,Monocytes +ENT_ACTGTCCTCCAAGCCG-1,Monocytes +ENT_ACTTACTAGTGGGTTG-1,Monocytes +ENT_ACTTACTCAAAGGCGT-1,Dendritic cells +ENT_ACTTACTGTGACGCCT-1,Granulocytes +ENT_ACTTACTGTTGAACTC-1,Dendritic cells +ENT_ACTTGTTAGCAGCCTC-1,Dendritic cells +ENT_ACTTGTTCACAGGCCT-1,Monocytes +ENT_ACTTGTTCACGGCGTT-1,Monocytes +ENT_ACTTGTTTCTTGCAAG-1,Monocytes +ENT_ACTTTCAAGCTTTGGT-1,NK cells +ENT_ACTTTCAAGGGTTCCC-1,Monocytes +ENT_ACTTTCAAGGTGACCA-1,Monocytes +ENT_ACTTTCACACGGATAG-1,Monocytes +ENT_ACTTTCAGTCTAGTGT-1,Monocytes +ENT_AGAATAGGTGTTTGTG-1,Monocytes +ENT_AGACGTTAGACAAAGG-1,Monocytes +ENT_AGACGTTAGCGCTCCA-1,Monocytes +ENT_AGACGTTCATTCCTCG-1,Monocytes +ENT_AGACGTTGTCGACTGC-1,Monocytes +ENT_AGACGTTGTGGCAAAC-1,Monocytes +ENT_AGACGTTTCCTTAATC-1,Monocytes +ENT_AGAGCGAAGTGTGGCA-1,Monocytes +ENT_AGAGCGACACCTTGTC-1,Monocytes +ENT_AGAGCTTAGACAGGCT-1,Granulocytes +ENT_AGAGCTTAGGAACTGC-1,Monocytes +ENT_AGAGCTTAGGACAGAA-1,Monocytes +ENT_AGAGCTTCATGCCTAA-1,Monocytes +ENT_AGAGCTTCATTAGCCA-1,Granulocytes +ENT_AGAGCTTGTCAACATC-1,Monocytes +ENT_AGAGCTTGTCGCTTCT-1,Monocytes +ENT_AGAGCTTGTGCGAAAC-1,Monocytes +ENT_AGAGTGGAGGATCGCA-1,Monocytes +ENT_AGATCTGAGGAGTAGA-1,Granulocytes +ENT_AGATCTGAGGAGTTTA-1,Monocytes +ENT_AGATCTGAGTCATGCT-1,Monocytes +ENT_AGATCTGCATTTCAGG-1,Monocytes +ENT_AGATCTGGTACAGTGG-1,Monocytes +ENT_AGATCTGGTAGAGGAA-1,Dendritic cells +ENT_AGATCTGTCTAACGGT-1,Monocytes +ENT_AGATTGCAGAGAACAG-1,T cells +ENT_AGATTGCCAACAACCT-1,Dendritic cells +ENT_AGATTGCCATCTCCCA-1,Monocytes +ENT_AGCAGCCAGAGTGACC-1,Monocytes +ENT_AGCATACAGCTAGGCA-1,Monocytes +ENT_AGCATACAGTTAACGA-1,Monocytes +ENT_AGCATACCACTGCCAG-1,Monocytes +ENT_AGCATACTCCGTCATC-1,Monocytes +ENT_AGCCTAACAATCCGAT-1,Monocytes +ENT_AGCCTAACACGTCTCT-1,Monocytes +ENT_AGCCTAAGTAAAGTCA-1,Monocytes +ENT_AGCCTAAGTCGATTGT-1,Dendritic cells +ENT_AGCCTAAGTGACCAAG-1,T cells +ENT_AGCCTAATCCAGAAGG-1,Monocytes +ENT_AGCCTAATCCAGGGCT-1,Monocytes +ENT_AGCCTAATCCCAAGAT-1,Monocytes +ENT_AGCCTAATCTGCCAGG-1,Monocytes +ENT_AGCGGTCCAAGACGTG-1,Monocytes +ENT_AGCGGTCCACCAGCAC-1,Monocytes +ENT_AGCGGTCCAGTCGATT-1,Monocytes +ENT_AGCGGTCGTCTGCCAG-1,Monocytes +ENT_AGCGGTCGTGGTTTCA-1,Monocytes +ENT_AGCGGTCTCTTCAACT-1,Monocytes +ENT_AGCGTATAGTCAATAG-1,Monocytes +ENT_AGCGTATCATATGCTG-1,Monocytes +ENT_AGCGTATGTTGGTTTG-1,Monocytes +ENT_AGCGTATTCTTATCTG-1,Monocytes +ENT_AGCGTCGAGATTACCC-1,Monocytes +ENT_AGCGTCGAGCGATGAC-1,Monocytes +ENT_AGCGTCGGTACCATCA-1,Dendritic cells +ENT_AGCGTCGGTAGCCTAT-1,Monocytes +ENT_AGCTCCTAGAAGGGTA-1,Granulocytes +ENT_AGCTCCTAGATATGGT-1,Dendritic cells +ENT_AGCTCCTAGGACACCA-1,Monocytes +ENT_AGCTCCTCACCATGTA-1,Monocytes +ENT_AGCTCCTCATTGAGCT-1,Monocytes +ENT_AGCTCCTGTCCCTTGT-1,Monocytes +ENT_AGCTCTCAGTGTGGCA-1,Monocytes +ENT_AGCTCTCGTGCACCAC-1,Dendritic cells +ENT_AGCTCTCTCCCTTGTG-1,Monocytes +ENT_AGCTCTCTCTGCAGTA-1,Granulocytes +ENT_AGCTTGAAGTGTACCT-1,Monocytes +ENT_AGCTTGAGTCTGCGGT-1,Dendritic cells +ENT_AGCTTGATCACGGTTA-1,Monocytes +ENT_AGCTTGATCTCGCATC-1,Granulocytes +ENT_AGGCCACAGATATGGT-1,Monocytes +ENT_AGGCCACAGCTGTTCA-1,Monocytes +ENT_AGGCCACCAAGAAGAG-1,Monocytes +ENT_AGGCCACGTAGAGTGC-1,Monocytes +ENT_AGGCCACGTGATGCCC-1,Dendritic cells +ENT_AGGCCACTCATTATCC-1,Monocytes +ENT_AGGCCACTCCAGTAGT-1,Monocytes +ENT_AGGCCACTCCTCCTAG-1,Monocytes +ENT_AGGCCGTAGATATACG-1,Dendritic cells +ENT_AGGCCGTCAATGTTGC-1,Monocytes +ENT_AGGCCGTCAGTGGGAT-1,Granulocytes +ENT_AGGCCGTCATCCTTGC-1,Monocytes +ENT_AGGCCGTGTTAAAGAC-1,Granulocytes +ENT_AGGCCGTTCAGAGCTT-1,Monocytes +ENT_AGGCCGTTCGCTTAGA-1,T cells +ENT_AGGCCGTTCTTTAGTC-1,Monocytes +ENT_AGGGAGTCACGAAGCA-1,Monocytes +ENT_AGGGAGTCAGTATAAG-1,Monocytes +ENT_AGGGAGTGTCTTGATG-1,Monocytes +ENT_AGGGATGAGTACACCT-1,Granulocytes +ENT_AGGGATGCAATGGTCT-1,Monocytes +ENT_AGGGATGCACGGCCAT-1,Monocytes +ENT_AGGGATGGTTAAAGAC-1,Monocytes +ENT_AGGGATGGTTCGTCTC-1,Monocytes +ENT_AGGGATGTCCCTTGCA-1,Macrophages +ENT_AGGGATGTCCGCTGTT-1,Monocytes +ENT_AGGGATGTCCGTAGTA-1,Monocytes +ENT_AGGGTGACATCGTCGG-1,Macrophages +ENT_AGGGTGACATGGGAAC-1,Monocytes +ENT_AGGGTGAGTTGTCTTT-1,Dendritic cells +ENT_AGGGTGATCAGTGTTG-1,Monocytes +ENT_AGGTCATAGAAGGACA-1,Dendritic cells +ENT_AGGTCATAGCGATAGC-1,Monocytes +ENT_AGGTCATAGCTTATCG-1,T cells +ENT_AGGTCATAGTCCTCCT-1,Monocytes +ENT_AGGTCATCATTCGACA-1,Monocytes +ENT_AGGTCATGTACGAAAT-1,Monocytes +ENT_AGGTCATTCATAAAGG-1,Granulocytes +ENT_AGGTCATTCGGATGTT-1,Monocytes +ENT_AGTAGTCAGAAACGCC-1,Granulocytes +ENT_AGTAGTCAGACCGGAT-1,Monocytes +ENT_AGTAGTCAGCTAGGCA-1,Dendritic cells +ENT_AGTAGTCAGGCCATAG-1,Monocytes +ENT_AGTAGTCCAATGTTGC-1,Monocytes +ENT_AGTAGTCCAGCCTTTC-1,Monocytes +ENT_AGTAGTCGTAAGGGAA-1,Granulocytes +ENT_AGTAGTCGTTTGGCGC-1,Monocytes +ENT_AGTAGTCTCTTGCAAG-1,Monocytes +ENT_AGTCTTTAGGAGCGTT-1,Monocytes +ENT_AGTCTTTAGTTCCACA-1,Granulocytes +ENT_AGTCTTTCACGTCTCT-1,Monocytes +ENT_AGTCTTTCATCCTAGA-1,Monocytes +ENT_AGTCTTTGTTCATGGT-1,Monocytes +ENT_AGTCTTTGTTTAGGAA-1,Dendritic cells +ENT_AGTCTTTTCAGGATCT-1,Monocytes +ENT_AGTGAGGAGATCTGAA-1,Granulocytes +ENT_AGTGAGGAGGGATGGG-1,Monocytes +ENT_AGTGAGGAGGTCATCT-1,Monocytes +ENT_AGTGAGGCAACGATCT-1,Granulocytes +ENT_AGTGAGGCAGCTGTTA-1,Dendritic cells +ENT_AGTGAGGGTAAGGATT-1,Monocytes +ENT_AGTGAGGGTCCAACTA-1,Monocytes +ENT_AGTGAGGGTTACCAGT-1,Monocytes +ENT_AGTGAGGGTTCAGGCC-1,Monocytes +ENT_AGTGAGGTCTGTCAAG-1,Monocytes +ENT_AGTGGGAAGAAACCTA-1,Monocytes +ENT_AGTGGGAAGTGGAGTC-1,Monocytes +ENT_AGTGGGACATGGAATA-1,Monocytes +ENT_AGTGGGAGTACTTAGC-1,Monocytes +ENT_AGTGGGATCAGAAATG-1,Monocytes +ENT_AGTGTCACAATCGAAA-1,Monocytes +ENT_AGTTGGTAGCAGATCG-1,Monocytes +ENT_AGTTGGTCAAGCGTAG-1,Monocytes +ENT_AGTTGGTCACGACGAA-1,Granulocytes +ENT_AGTTGGTGTCGGGTCT-1,Monocytes +ENT_AGTTGGTTCGCCCTTA-1,Monocytes +ENT_ATAACGCGTAAGAGAG-1,Granulocytes +ENT_ATAACGCGTATGAAAC-1,Granulocytes +ENT_ATAACGCGTCGCATCG-1,Monocytes +ENT_ATAACGCGTCTAACGT-1,Granulocytes +ENT_ATAACGCGTTATGTGC-1,Monocytes +ENT_ATAACGCGTTCCCTTG-1,Monocytes +ENT_ATAACGCGTTGGACCC-1,Monocytes +ENT_ATAAGAGAGGACATTA-1,Dendritic cells +ENT_ATAAGAGCACATGTGT-1,Granulocytes +ENT_ATAAGAGTCCGTCAAA-1,Monocytes +ENT_ATAAGAGTCGCTAGCG-1,Granulocytes +ENT_ATAGACCAGCAGCGTA-1,Monocytes +ENT_ATAGACCCAACACGCC-1,Monocytes +ENT_ATAGACCCAGTCAGCC-1,Monocytes +ENT_ATAGACCCATTCACTT-1,Macrophages +ENT_ATAGACCTCAGGTTCA-1,Monocytes +ENT_ATAGACCTCCTACAGA-1,Dendritic cells +ENT_ATAGACCTCTGGCGAC-1,Monocytes +ENT_ATAGACCTCTGGCGTG-1,Dendritic cells +ENT_ATCACGAAGCCAGTAG-1,Monocytes +ENT_ATCACGAAGTATTGGA-1,Macrophages +ENT_ATCACGAGTAGCGCTC-1,Monocytes +ENT_ATCACGATCCATGCTC-1,Dendritic cells +ENT_ATCATCTAGATCTGAA-1,Monocytes +ENT_ATCATCTAGCCAGGAT-1,Macrophages +ENT_ATCATCTAGTTCGCGC-1,Monocytes +ENT_ATCATCTCACCGAATT-1,Monocytes +ENT_ATCATCTTCGTAGATC-1,Monocytes +ENT_ATCATCTTCTTGTTTG-1,Macrophages +ENT_ATCATGGAGAATGTGT-1,Monocytes +ENT_ATCATGGAGTGCAAGC-1,Granulocytes +ENT_ATCATGGAGTTGTAGA-1,Monocytes +ENT_ATCATGGCAATGCCAT-1,T cells +ENT_ATCATGGCATGTCTCC-1,T cells +ENT_ATCATGGGTAAATGTG-1,Monocytes +ENT_ATCATGGGTCCCTACT-1,T cells +ENT_ATCATGGGTCTAGCGC-1,Monocytes +ENT_ATCCACCAGATCCTGT-1,Monocytes +ENT_ATCCACCAGTCCTCCT-1,Dendritic cells +ENT_ATCCACCCAGAAGCAC-1,Granulocytes +ENT_ATCCACCGTACAGCAG-1,Dendritic cells +ENT_ATCCACCGTGACGCCT-1,Monocytes +ENT_ATCCGAAAGCACACAG-1,Monocytes +ENT_ATCCGAAAGTGTACCT-1,Granulocytes +ENT_ATCCGAACACGCCAGT-1,Granulocytes +ENT_ATCCGAAGTACCATCA-1,Monocytes +ENT_ATCCGAAGTCTAGCGC-1,Monocytes +ENT_ATCCGAAGTGCGCTTG-1,Granulocytes +ENT_ATCCGAAGTGTCTGAT-1,Monocytes +ENT_ATCCGAAGTGTGGTTT-1,Macrophages +ENT_ATCCGAATCAACACAC-1,Monocytes +ENT_ATCCGAATCTGTCTAT-1,Monocytes +ENT_ATCGAGTAGCCATCGC-1,Monocytes +ENT_ATCGAGTAGGCACATG-1,Monocytes +ENT_ATCGAGTCAGGCGATA-1,Monocytes +ENT_ATCGAGTCATGCCTTC-1,Monocytes +ENT_ATCGAGTCATGCTGGC-1,Dendritic cells +ENT_ATCGAGTGTACGCTGC-1,Monocytes +ENT_ATCGAGTTCATGTAGC-1,Monocytes +ENT_ATCGAGTTCCTTGCCA-1,Monocytes +ENT_ATCTACTAGGGTATCG-1,Dendritic cells +ENT_ATCTACTCACTTACGA-1,Monocytes +ENT_ATCTACTGTAGCGTCC-1,Monocytes +ENT_ATCTACTGTGTAAGTA-1,Dendritic cells +ENT_ATCTACTGTTCTGTTT-1,Dendritic cells +ENT_ATCTACTTCAATAAGG-1,Dendritic cells +ENT_ATCTACTTCCGTTGCT-1,Monocytes +ENT_ATCTGCCCAGTCTTCC-1,Monocytes +ENT_ATCTGCCGTTCTGTTT-1,Monocytes +ENT_ATCTGCCTCCGCTGTT-1,Macrophages +ENT_ATCTGCCTCTCGAGTA-1,Monocytes +ENT_ATGAGGGAGCAGGTCA-1,Monocytes +ENT_ATGAGGGCAGACAAGC-1,Granulocytes +ENT_ATGAGGGCAGACAGGT-1,Monocytes +ENT_ATGAGGGGTCCAGTGC-1,Monocytes +ENT_ATGAGGGGTGACAAAT-1,Monocytes +ENT_ATGAGGGTCTGATTCT-1,Monocytes +ENT_ATGCGATAGAATGTGT-1,Monocytes +ENT_ATGCGATAGGACAGCT-1,Monocytes +ENT_ATGGGAGAGGCCCGTT-1,Monocytes +ENT_ATGGGAGGTTAAAGTG-1,Monocytes +ENT_ATGGGAGTCCCGGATG-1,Monocytes +ENT_ATGGGAGTCGTATCAG-1,Macrophages +ENT_ATGTGTGAGGCGTACA-1,Monocytes +ENT_ATGTGTGAGGCTATCT-1,Monocytes +ENT_ATGTGTGAGGGTATCG-1,Monocytes +ENT_ATGTGTGTCAGGTTCA-1,Monocytes +ENT_ATGTGTGTCTTCGGTC-1,Monocytes +ENT_ATTACTCCACCAGTTA-1,Monocytes +ENT_ATTACTCCATGGGACA-1,Macrophages +ENT_ATTACTCGTGGCTCCA-1,Dendritic cells +ENT_ATTACTCTCCGAATGT-1,Monocytes +ENT_ATTACTCTCTTTACAC-1,Monocytes +ENT_ATTATCCAGACAGACC-1,Monocytes +ENT_ATTATCCAGTGACATA-1,Monocytes +ENT_ATTATCCCAGAGCCAA-1,Monocytes +ENT_ATTATCCGTAACGACG-1,Monocytes +ENT_ATTATCCGTAGGCTGA-1,Macrophages +ENT_ATTATCCTCTGTCCGT-1,Monocytes +ENT_ATTCTACCACAAGTAA-1,Monocytes +ENT_ATTCTACGTCACCTAA-1,Granulocytes +ENT_ATTCTACGTGTCAATC-1,Dendritic cells +ENT_ATTCTACGTGTGAATA-1,Monocytes +ENT_ATTCTACTCTCTGTCG-1,Monocytes +ENT_ATTGGACAGCTAGGCA-1,Macrophages +ENT_ATTGGACCAAACCTAC-1,Monocytes +ENT_ATTGGACCAGGTCCAC-1,Monocytes +ENT_ATTGGACGTCGCTTCT-1,Monocytes +ENT_ATTGGACGTCTAGAGG-1,Monocytes +ENT_ATTGGTGAGACGCTTT-1,Granulocytes +ENT_ATTGGTGGTAGTAGTA-1,Macrophages +ENT_ATTGGTGGTGAAAGAG-1,Monocytes +ENT_ATTGGTGTCCATGAGT-1,Monocytes +ENT_ATTGGTGTCTGCCAGG-1,Granulocytes +ENT_ATTTCTGAGTGTACCT-1,Monocytes +ENT_ATTTCTGCACACAGAG-1,Macrophages +ENT_ATTTCTGCACGACGAA-1,Monocytes +ENT_ATTTCTGCAGAAGCAC-1,Monocytes +ENT_ATTTCTGCATGACATC-1,Monocytes +ENT_ATTTCTGCATTCCTGC-1,Granulocytes +ENT_ATTTCTGGTCTAGCGC-1,Dendritic cells +ENT_CAACCAAAGGCGATAC-1,Monocytes +ENT_CAACCAAAGGTGACCA-1,Dendritic cells +ENT_CAACCAAAGTGGAGAA-1,Monocytes +ENT_CAACCAACAGACAGGT-1,Granulocytes +ENT_CAACCAAGTATCTGCA-1,Monocytes +ENT_CAACCAAGTCACCCAG-1,Monocytes +ENT_CAACCTCCACAACGTT-1,Monocytes +ENT_CAACCTCCATCACGAT-1,Monocytes +ENT_CAACTAGAGGGATACC-1,Dendritic cells +ENT_CAACTAGCAAAGCAAT-1,Granulocytes +ENT_CAACTAGCAATAAGCA-1,Monocytes +ENT_CAACTAGCACATTTCT-1,Granulocytes +ENT_CAACTAGGTATAGGGC-1,Monocytes +ENT_CAACTAGTCCCACTTG-1,Monocytes +ENT_CAAGAAACAGTCACTA-1,Monocytes +ENT_CAAGAAACATTTGCCC-1,Monocytes +ENT_CAAGAAAGTCTGATCA-1,Monocytes +ENT_CAAGAAAGTGGTTTCA-1,Dendritic cells +ENT_CAAGAAAGTTGCGCAC-1,Monocytes +ENT_CAAGATCAGATAGCAT-1,Granulocytes +ENT_CAAGATCAGTACCGGA-1,Monocytes +ENT_CAAGATCGTTAGATGA-1,Granulocytes +ENT_CAAGATCTCAAAGTAG-1,Monocytes +ENT_CAAGATCTCTGTTTGT-1,Monocytes +ENT_CAAGGCCCACAGTCGC-1,Monocytes +ENT_CAAGGCCCACTTAAGC-1,Monocytes +ENT_CAAGGCCGTAATCGTC-1,Monocytes +ENT_CAAGTTGAGAGTACCG-1,Monocytes +ENT_CAAGTTGAGATGGGTC-1,Granulocytes +ENT_CAAGTTGAGATTACCC-1,Monocytes +ENT_CAAGTTGAGCTCCTTC-1,Monocytes +ENT_CAAGTTGCAGTCCTTC-1,Monocytes +ENT_CAAGTTGTCGCGGATC-1,Dendritic cells +ENT_CACAAACAGAAGGGTA-1,Dendritic cells +ENT_CACAAACCAGTATCTG-1,Monocytes +ENT_CACAAACTCCTGCCAT-1,Granulocytes +ENT_CACACAAAGGTGTGGT-1,Monocytes +ENT_CACACAATCATGCAAC-1,Monocytes +ENT_CACACCTAGGGCACTA-1,T cells +ENT_CACACCTCAAGTCTGT-1,Dendritic cells +ENT_CACACCTGTGCGCTTG-1,Granulocytes +ENT_CACACCTGTGTGCCTG-1,Monocytes +ENT_CACACCTTCTCCTATA-1,Dendritic cells +ENT_CACACTCAGATCCCAT-1,Granulocytes +ENT_CACACTCAGCGATTCT-1,Macrophages +ENT_CACACTCGTCGCATCG-1,Monocytes +ENT_CACACTCTCACTGGGC-1,Granulocytes +ENT_CACAGGCAGAGTCTGG-1,NK cells +ENT_CACAGGCAGATGTTAG-1,NK cells +ENT_CACAGGCAGGCTAGCA-1,Monocytes +ENT_CACAGGCAGTGTACGG-1,Monocytes +ENT_CACAGGCCAGTCCTTC-1,Monocytes +ENT_CACAGGCTCAAACAAG-1,Monocytes +ENT_CACAGTAAGACTACAA-1,Granulocytes +ENT_CACAGTAAGATCCGAG-1,Granulocytes +ENT_CACAGTAAGGCAGTCA-1,Granulocytes +ENT_CACAGTACACCAGTTA-1,Monocytes +ENT_CACAGTACATTAACCG-1,Monocytes +ENT_CACATAGAGAATGTGT-1,Monocytes +ENT_CACATAGCAAGCTGAG-1,Monocytes +ENT_CACATAGCATGGGACA-1,Granulocytes +ENT_CACATAGGTAGCGTCC-1,Monocytes +ENT_CACATAGTCGCCAAAT-1,Monocytes +ENT_CACATTTAGGCCATAG-1,Monocytes +ENT_CACATTTTCACGAAGG-1,Monocytes +ENT_CACATTTTCGGCTTGG-1,Monocytes +ENT_CACCACTAGACCACGA-1,Dendritic cells +ENT_CACCACTAGCCACTAT-1,Macrophages +ENT_CACCACTAGTTAGCGG-1,Monocytes +ENT_CACCACTCAAGCTGTT-1,Monocytes +ENT_CACCACTCACACCGAC-1,Dendritic cells +ENT_CACCACTCAGCTGGCT-1,Dendritic cells +ENT_CACCACTGTTTGTTGG-1,T cells +ENT_CACCAGGAGAGAACAG-1,Monocytes +ENT_CACCTTGAGATGTCGG-1,Monocytes +ENT_CACCTTGCACGGTGTC-1,Monocytes +ENT_CACCTTGGTAGAAAGG-1,Monocytes +ENT_CACCTTGTCGTAGATC-1,Monocytes +ENT_CACTCCAAGGCATGTG-1,Monocytes +ENT_CACTCCAGTGACGGTA-1,Monocytes +ENT_CACTCCAGTGAGTATA-1,Monocytes +ENT_CAGAATCAGTAGCGGT-1,Monocytes +ENT_CAGAATCAGTATCGAA-1,Monocytes +ENT_CAGAATCCACCCTATC-1,Macrophages +ENT_CAGAATCTCACATACG-1,Dendritic cells +ENT_CAGAATCTCCTGCAGG-1,Monocytes +ENT_CAGAGAGAGATCCTGT-1,Granulocytes +ENT_CAGAGAGAGCGTGAAC-1,Monocytes +ENT_CAGAGAGGTCATCCCT-1,Monocytes +ENT_CAGAGAGGTCGCCATG-1,Monocytes +ENT_CAGAGAGGTCTCCCTA-1,Granulocytes +ENT_CAGATCACAATAACGA-1,Monocytes +ENT_CAGATCAGTGCAACGA-1,Monocytes +ENT_CAGCAGCAGCAATATG-1,Dendritic cells +ENT_CAGCAGCAGCCCAGCT-1,Granulocytes +ENT_CAGCAGCTCCGTTGTC-1,Granulocytes +ENT_CAGCAGCTCGGCATCG-1,Monocytes +ENT_CAGCATACAAAGGCGT-1,Macrophages +ENT_CAGCATAGTGAGCGAT-1,Monocytes +ENT_CAGCATAGTGTCAATC-1,Monocytes +ENT_CAGCATATCAAGGTAA-1,Dendritic cells +ENT_CAGCATATCCATGAAC-1,Dendritic cells +ENT_CAGCATATCTGCTGCT-1,Granulocytes +ENT_CAGCCGACAGCATACT-1,Monocytes +ENT_CAGCCGATCCGTAGTA-1,Monocytes +ENT_CAGCCGATCGACCAGC-1,Monocytes +ENT_CAGCCGATCGTAGGAG-1,Monocytes +ENT_CAGCGACCAGCATACT-1,Monocytes +ENT_CAGCGACCATTAGGCT-1,Granulocytes +ENT_CAGCGACGTCGGCACT-1,Monocytes +ENT_CAGCGACGTCGTCTTC-1,Monocytes +ENT_CAGCGACGTGAAAGAG-1,T cells +ENT_CAGCGACTCAACGGGA-1,Monocytes +ENT_CAGCGACTCGCGTTTC-1,Monocytes +ENT_CAGCGACTCGGCTACG-1,Granulocytes +ENT_CAGCTAAAGAACTGTA-1,Monocytes +ENT_CAGCTAAAGAGCAATT-1,Granulocytes +ENT_CAGCTAAAGCGTCAAG-1,Monocytes +ENT_CAGCTAAGTCCGAGTC-1,Monocytes +ENT_CAGCTAATCTTACCGC-1,Monocytes +ENT_CAGCTGGAGATGCCAG-1,Monocytes +ENT_CAGCTGGCAATGGACG-1,Dendritic cells +ENT_CAGCTGGCAGCCTATA-1,Monocytes +ENT_CAGCTGGTCAGCACAT-1,Dendritic cells +ENT_CAGCTGGTCCAATGGT-1,Monocytes +ENT_CAGTAACCAAGCGAGT-1,NK cells +ENT_CAGTAACCAGCTCCGA-1,Monocytes +ENT_CAGTCCTAGAACTGTA-1,Monocytes +ENT_CAGTCCTGTTCAGTAC-1,Dendritic cells +ENT_CAGTCCTTCAGTTGAC-1,Granulocytes +ENT_CATATGGGTAAGTAGT-1,Monocytes +ENT_CATATGGGTATAGGGC-1,Monocytes +ENT_CATATTCAGCCACTAT-1,Monocytes +ENT_CATATTCAGGTGATAT-1,Monocytes +ENT_CATATTCAGTGCCATT-1,Monocytes +ENT_CATATTCCAGACAAGC-1,Dendritic cells +ENT_CATATTCCATAGACTC-1,Dendritic cells +ENT_CATATTCGTATATCCG-1,Monocytes +ENT_CATATTCGTCGCGAAA-1,Monocytes +ENT_CATATTCTCATTGCCC-1,Dendritic cells +ENT_CATCAAGCACCAGCAC-1,Monocytes +ENT_CATCAAGTCGATAGAA-1,Monocytes +ENT_CATCAAGTCGGCTACG-1,Monocytes +ENT_CATCAAGTCTCAAACG-1,Monocytes +ENT_CATCAGAAGAAACCTA-1,Monocytes +ENT_CATCAGAAGCTCTCGG-1,Monocytes +ENT_CATCAGAGTCAGAATA-1,Monocytes +ENT_CATCAGATCTCGGACG-1,Monocytes +ENT_CATCCACAGCTACCTA-1,Monocytes +ENT_CATCCACAGTATTGGA-1,Monocytes +ENT_CATCCACCACAAGTAA-1,Monocytes +ENT_CATCCACGTCAACTGT-1,Monocytes +ENT_CATCCACTCATACGGT-1,Monocytes +ENT_CATCCACTCCAGATCA-1,T cells +ENT_CATCCACTCCGCTGTT-1,Monocytes +ENT_CATCGAAAGCTAACTC-1,Granulocytes +ENT_CATCGAAAGGGTTTCT-1,Monocytes +ENT_CATCGAACAATCCGAT-1,Granulocytes +ENT_CATCGAACACGGCTAC-1,Monocytes +ENT_CATCGAACAGACGCTC-1,Monocytes +ENT_CATCGAACATACCATG-1,Monocytes +ENT_CATCGAATCTTGCATT-1,Granulocytes +ENT_CATCGGGAGGATATAC-1,Monocytes +ENT_CATCGGGAGGCAAAGA-1,Monocytes +ENT_CATCGGGCATGTTCCC-1,Monocytes +ENT_CATCGGGGTGTAATGA-1,Dendritic cells +ENT_CATCGGGGTTCCCTTG-1,Granulocytes +ENT_CATGACAAGAAGATTC-1,Macrophages +ENT_CATGACAAGAGACGAA-1,Monocytes +ENT_CATGACAAGTTGTCGT-1,Monocytes +ENT_CATGACACAGTTCATG-1,Monocytes +ENT_CATGACAGTCTAGCGC-1,Monocytes +ENT_CATGACATCGGAAACG-1,Monocytes +ENT_CATGCCTAGCGTTGCC-1,Granulocytes +ENT_CATGCCTGTCGCTTCT-1,Dendritic cells +ENT_CATGCCTTCACCTCGT-1,Dendritic cells +ENT_CATGCCTTCCTGTAGA-1,Granulocytes +ENT_CATGGCGAGGGTTCCC-1,Dendritic cells +ENT_CATGGCGCACAGTCGC-1,Monocytes +ENT_CATGGCGCATTACCTT-1,Monocytes +ENT_CATGGCGGTCTAGGTT-1,Monocytes +ENT_CATGGCGTCTTGCCGT-1,Monocytes +ENT_CATTATCAGAAGGTTT-1,Monocytes +ENT_CATTATCAGCCACGTC-1,Monocytes +ENT_CATTATCAGCGTCAAG-1,Monocytes +ENT_CATTATCTCACGCATA-1,Monocytes +ENT_CATTATCTCGGATGTT-1,Granulocytes +ENT_CATTCGCAGCAGCGTA-1,Monocytes +ENT_CCAATCCAGAGCTGGT-1,Monocytes +ENT_CCAATCCAGGGTTTCT-1,Granulocytes +ENT_CCAATCCCAGAAGCAC-1,Granulocytes +ENT_CCAATCCCATGCCACG-1,Granulocytes +ENT_CCAATCCGTAGCACGA-1,Granulocytes +ENT_CCAATCCGTAGCTTGT-1,Monocytes +ENT_CCAATCCGTATGGTTC-1,Monocytes +ENT_CCAATCCGTCATTAGC-1,Monocytes +ENT_CCAATCCGTGACGGTA-1,Macrophages +ENT_CCAATCCGTTCAGACT-1,Monocytes +ENT_CCACCTACATCGGACC-1,Granulocytes +ENT_CCACCTAGTAAGTTCC-1,Monocytes +ENT_CCACCTAGTTAAGACA-1,Monocytes +ENT_CCACGGAGTTACGCGC-1,Monocytes +ENT_CCACGGATCTCTGCTG-1,Monocytes +ENT_CCACTACAGAATTGTG-1,Monocytes +ENT_CCACTACAGCGTTCCG-1,Monocytes +ENT_CCACTACAGGTAGCCA-1,Dendritic cells +ENT_CCACTACAGTTAGCGG-1,Monocytes +ENT_CCACTACCACAGACAG-1,Monocytes +ENT_CCACTACGTACCGCTG-1,Monocytes +ENT_CCACTACGTACTCTCC-1,Monocytes +ENT_CCACTACGTCGGCTCA-1,Monocytes +ENT_CCAGCGAAGAATTGTG-1,Monocytes +ENT_CCAGCGAAGGCTCTTA-1,Monocytes +ENT_CCAGCGACAGTATGCT-1,Monocytes +ENT_CCATGTCAGCTAGTCT-1,Granulocytes +ENT_CCATGTCGTCATACTG-1,Granulocytes +ENT_CCATTCGAGGCCGAAT-1,Monocytes +ENT_CCATTCGAGGGATCTG-1,Granulocytes +ENT_CCATTCGCACGCGAAA-1,Dendritic cells +ENT_CCATTCGCACGGCGTT-1,Granulocytes +ENT_CCATTCGGTATCTGCA-1,Monocytes +ENT_CCATTCGGTTAGATGA-1,Macrophages +ENT_CCCAATCAGAAACCAT-1,Monocytes +ENT_CCCAATCAGATGCCTT-1,Monocytes +ENT_CCCAATCAGGCCCGTT-1,Monocytes +ENT_CCCAATCCATTAGGCT-1,Granulocytes +ENT_CCCAATCCATTCCTGC-1,Granulocytes +ENT_CCCAATCGTGCAGGTA-1,Monocytes +ENT_CCCAATCTCTTCAACT-1,Monocytes +ENT_CCCAGTTCAGTAGAGC-1,Monocytes +ENT_CCCAGTTGTAAAGTCA-1,Monocytes +ENT_CCCAGTTGTCATACTG-1,Monocytes +ENT_CCCAGTTGTGTTTGGT-1,Monocytes +ENT_CCCTCCTAGTGAAGTT-1,Monocytes +ENT_CCCTCCTCAACCGCCA-1,Monocytes +ENT_CCCTCCTCATTAGCCA-1,Dendritic cells +ENT_CCCTCCTTCTTGTATC-1,Monocytes +ENT_CCGGGATAGGCAAAGA-1,Dendritic cells +ENT_CCGGGATCAATAAGCA-1,Monocytes +ENT_CCGGGATGTTGCGCAC-1,Monocytes +ENT_CCGGGATTCTGCAGTA-1,Dendritic cells +ENT_CCGGTAGAGTCACGCC-1,Monocytes +ENT_CCGGTAGCACAAGCCC-1,Monocytes +ENT_CCGGTAGGTGGCTCCA-1,Monocytes +ENT_CCGGTAGGTTATCGGT-1,Monocytes +ENT_CCGTACTAGCGTCAAG-1,Monocytes +ENT_CCGTACTAGCTGCGAA-1,Monocytes +ENT_CCGTGGAAGCCAGAAC-1,Granulocytes +ENT_CCGTGGAAGTGTCCAT-1,Monocytes +ENT_CCGTGGACATCACCCT-1,Granulocytes +ENT_CCGTGGATCAACCATG-1,Granulocytes +ENT_CCGTTCAAGAAGGACA-1,Dendritic cells +ENT_CCGTTCAAGGTGCTTT-1,Dendritic cells +ENT_CCGTTCACAACCGCCA-1,Macrophages +ENT_CCGTTCAGTAGCGTAG-1,Dendritic cells +ENT_CCGTTCATCGGTCTAA-1,Monocytes +ENT_CCTAAAGCACGCCAGT-1,Granulocytes +ENT_CCTACACAGTTCGCGC-1,Monocytes +ENT_CCTACACTCTAACGGT-1,Monocytes +ENT_CCTACCAAGACGCACA-1,Granulocytes +ENT_CCTACCAGTGTGAAAT-1,Monocytes +ENT_CCTACCATCAAGCCTA-1,Granulocytes +ENT_CCTAGCTAGAGACTTA-1,Granulocytes +ENT_CCTAGCTAGCTAGTCT-1,Monocytes +ENT_CCTAGCTAGGACTGGT-1,Monocytes +ENT_CCTAGCTAGTGCTGCC-1,Monocytes +ENT_CCTAGCTCAAGCTGAG-1,Granulocytes +ENT_CCTAGCTCAATAGCGG-1,Monocytes +ENT_CCTAGCTTCTTGTTTG-1,Monocytes +ENT_CCTATTAAGATGAGAG-1,Monocytes +ENT_CCTATTAAGGAATCGC-1,Dendritic cells +ENT_CCTATTAGTAGTACCT-1,Dendritic cells +ENT_CCTATTAGTATCTGCA-1,Monocytes +ENT_CCTATTAGTCCGAATT-1,Monocytes +ENT_CCTATTAGTCGCGAAA-1,Monocytes +ENT_CCTATTAGTCTGATTG-1,Monocytes +ENT_CCTCAGTCAAACGTGG-1,Monocytes +ENT_CCTCAGTCATTGAGCT-1,Monocytes +ENT_CCTCAGTGTAACGACG-1,Dendritic cells +ENT_CCTCTGACATTCACTT-1,Monocytes +ENT_CCTCTGAGTCTGATTG-1,Monocytes +ENT_CCTCTGATCGCCATAA-1,T cells +ENT_CCTTACGAGTACGATA-1,Monocytes +ENT_CCTTACGCATATACCG-1,Monocytes +ENT_CCTTACGGTGGCTCCA-1,Monocytes +ENT_CCTTACGGTTGCGTTA-1,Monocytes +ENT_CCTTCCCCAGGGCATA-1,Monocytes +ENT_CCTTCCCTCACATACG-1,Monocytes +ENT_CCTTCCCTCCGTTGTC-1,Dendritic cells +ENT_CCTTCGAAGATCTGAA-1,Monocytes +ENT_CCTTCGAAGTCTCAAC-1,Dendritic cells +ENT_CCTTCGAAGTGGTAGC-1,Granulocytes +ENT_CCTTCGACAAATCCGT-1,Monocytes +ENT_CCTTCGACAATTCCTT-1,Monocytes +ENT_CCTTCGAGTCTACCTC-1,Monocytes +ENT_CCTTCGATCCGGGTGT-1,Granulocytes +ENT_CCTTTCTCACATGTGT-1,Dendritic cells +ENT_CCTTTCTGTCAAAGAT-1,Monocytes +ENT_CCTTTCTGTCCGAATT-1,Dendritic cells +ENT_CCTTTCTTCTAGCACA-1,Macrophages +ENT_CCTTTCTTCTCCAACC-1,Monocytes +ENT_CGAACATAGCCAGGAT-1,Monocytes +ENT_CGAACATCATTGTGCA-1,Monocytes +ENT_CGAATGTAGTCTCGGC-1,Monocytes +ENT_CGAATGTGTCTACCTC-1,Granulocytes +ENT_CGAATGTTCGGCTACG-1,Monocytes +ENT_CGACCTTAGCTACCGC-1,Granulocytes +ENT_CGACCTTGTCAGATAA-1,Monocytes +ENT_CGACCTTGTCTGATCA-1,Monocytes +ENT_CGACTTCAGTAGGTGC-1,Monocytes +ENT_CGACTTCAGTGTGGCA-1,Granulocytes +ENT_CGACTTCGTACTTGAC-1,Monocytes +ENT_CGACTTCGTTTGGCGC-1,Granulocytes +ENT_CGACTTCTCAATAAGG-1,Monocytes +ENT_CGACTTCTCCCGACTT-1,Monocytes +ENT_CGACTTCTCTTGTTTG-1,Monocytes +ENT_CGAGAAGTCACAACGT-1,Monocytes +ENT_CGAGAAGTCTCCTATA-1,Monocytes +ENT_CGAGCACAGATACACA-1,Monocytes +ENT_CGAGCACAGGAATGGA-1,Monocytes +ENT_CGAGCACAGTGTTAGA-1,Monocytes +ENT_CGAGCACGTACCATCA-1,Monocytes +ENT_CGAGCACGTCAGGACA-1,Monocytes +ENT_CGAGCACGTCCTCTTG-1,Granulocytes +ENT_CGAGCACTCAAGGTAA-1,NK cells +ENT_CGAGCACTCACTCCTG-1,Monocytes +ENT_CGAGCCAAGTGGACGT-1,T cells +ENT_CGAGCCACAGAAGCAC-1,Macrophages +ENT_CGAGCCATCAGCGATT-1,Dendritic cells +ENT_CGAGCCATCCGATATG-1,Monocytes +ENT_CGATCGGCACCACGTG-1,Macrophages +ENT_CGATCGGCACGAAAGC-1,Monocytes +ENT_CGATCGGCACTCAGGC-1,Monocytes +ENT_CGATCGGCATATGGTC-1,Granulocytes +ENT_CGATCGGCATCGGTTA-1,Granulocytes +ENT_CGATCGGCATGCATGT-1,Monocytes +ENT_CGATCGGGTAAGTAGT-1,Granulocytes +ENT_CGATCGGGTAAGTTCC-1,Granulocytes +ENT_CGATCGGGTATAAACG-1,Monocytes +ENT_CGATCGGGTTGGTTTG-1,Monocytes +ENT_CGATCGGTCTGTCTCG-1,Monocytes +ENT_CGATGGCAGCCGATTT-1,Monocytes +ENT_CGATGGCGTTCGTTGA-1,Monocytes +ENT_CGATGGCTCTTACCTA-1,Monocytes +ENT_CGATGTAAGAAACCTA-1,Granulocytes +ENT_CGATGTAAGTGAACGC-1,Monocytes +ENT_CGATGTACACGGTAAG-1,Monocytes +ENT_CGATTGAAGCGGCTTC-1,Monocytes +ENT_CGATTGAAGCGTGAGT-1,Monocytes +ENT_CGATTGAGTCTCTCTG-1,Monocytes +ENT_CGATTGAGTGTTCGAT-1,Dendritic cells +ENT_CGATTGATCGGCCGAT-1,Monocytes +ENT_CGCCAAGAGATGTCGG-1,Monocytes +ENT_CGCCAAGCACGGATAG-1,Monocytes +ENT_CGCCAAGGTAAGTAGT-1,Monocytes +ENT_CGCCAAGGTAGTACCT-1,Dendritic cells +ENT_CGCCAAGGTCTTCAAG-1,Monocytes +ENT_CGCGGTAAGAGGGCTT-1,Monocytes +ENT_CGCGGTAAGGCAATTA-1,Dendritic cells +ENT_CGCGGTAGTCTGATTG-1,T cells +ENT_CGCGGTATCAGAGCTT-1,Monocytes +ENT_CGCGTTTAGAAGGTGA-1,Monocytes +ENT_CGCGTTTCATCATCCC-1,T cells +ENT_CGCGTTTGTCGCTTTC-1,Monocytes +ENT_CGCGTTTGTCTTCTCG-1,Granulocytes +ENT_CGCTATCAGGTGATTA-1,Dendritic cells +ENT_CGCTATCAGTCGTACT-1,Monocytes +ENT_CGCTATCGTTGTCTTT-1,Monocytes +ENT_CGCTGGAAGCCCTAAT-1,Monocytes +ENT_CGCTGGAAGCGAAGGG-1,NK cells +ENT_CGCTGGACAGGAATCG-1,Monocytes +ENT_CGCTGGACATGGTTGT-1,Monocytes +ENT_CGCTGGAGTTTCCACC-1,Dendritic cells +ENT_CGCTGGATCGTCCAGG-1,Monocytes +ENT_CGCTTCAAGAAAGTGG-1,Monocytes +ENT_CGCTTCAAGGCTAGAC-1,Dendritic cells +ENT_CGCTTCATCGCCGTGA-1,Monocytes +ENT_CGGACACCAAAGCGGT-1,Monocytes +ENT_CGGACGTAGACTCGGA-1,Monocytes +ENT_CGGACGTAGTTTAGGA-1,Monocytes +ENT_CGGACGTTCTCGTATT-1,Monocytes +ENT_CGGACTGAGACTCGGA-1,Monocytes +ENT_CGGACTGAGCCAACAG-1,Monocytes +ENT_CGGACTGGTTCTGGTA-1,Monocytes +ENT_CGGACTGTCAACCAAC-1,Dendritic cells +ENT_CGGACTGTCAAGCCTA-1,Monocytes +ENT_CGGACTGTCCACGAAT-1,T cells +ENT_CGGAGCTAGAGTAAGG-1,Dendritic cells +ENT_CGGAGCTAGATGTAAC-1,Monocytes +ENT_CGGAGCTTCTACTTAC-1,Dendritic cells +ENT_CGGAGTCCAACTGCGC-1,Monocytes +ENT_CGGAGTCCATTCACTT-1,Dendritic cells +ENT_CGGAGTCTCACTTATC-1,Monocytes +ENT_CGGAGTCTCAGAGCTT-1,Monocytes +ENT_CGGAGTCTCCCTTGTG-1,Monocytes +ENT_CGGAGTCTCTATCCCG-1,Monocytes +ENT_CGGCTAGAGGAATGGA-1,Monocytes +ENT_CGGCTAGAGTTAGCGG-1,Monocytes +ENT_CGGCTAGCACCAGGTC-1,Monocytes +ENT_CGGCTAGCAGCCTTTC-1,Monocytes +ENT_CGGCTAGCATCCGGGT-1,Monocytes +ENT_CGGCTAGTCGTGGACC-1,Monocytes +ENT_CGGGTCAAGGCCGAAT-1,Dendritic cells +ENT_CGGGTCACAGTGAGTG-1,Granulocytes +ENT_CGGGTCAGTATTCTCT-1,Monocytes +ENT_CGGGTCAGTCCGAATT-1,Dendritic cells +ENT_CGGTTAAAGCCTTGAT-1,Monocytes +ENT_CGGTTAAGTCATATGC-1,Dendritic cells +ENT_CGTAGCGCACGGATAG-1,Monocytes +ENT_CGTAGGCAGATTACCC-1,Granulocytes +ENT_CGTAGGCGTTCAGGCC-1,Dendritic cells +ENT_CGTAGGCTCTGTGCAA-1,Granulocytes +ENT_CGTCACTAGACGCTTT-1,Monocytes +ENT_CGTCACTAGAGATGAG-1,Monocytes +ENT_CGTCACTGTACATGTC-1,Monocytes +ENT_CGTCACTGTGAGTATA-1,Monocytes +ENT_CGTCACTTCCCACTTG-1,Dendritic cells +ENT_CGTCACTTCGTCTGCT-1,Monocytes +ENT_CGTCAGGAGAACTGTA-1,Monocytes +ENT_CGTCAGGAGACCCACC-1,Monocytes +ENT_CGTCAGGAGGATCGCA-1,Granulocytes +ENT_CGTCAGGCAGTAGAGC-1,Monocytes +ENT_CGTCAGGCATCGACGC-1,Monocytes +ENT_CGTCAGGGTCCGTCAG-1,Monocytes +ENT_CGTCAGGGTTCGGCAC-1,Dendritic cells +ENT_CGTCCATCAACTGCTA-1,Monocytes +ENT_CGTCTACAGATACACA-1,Monocytes +ENT_CGTCTACAGGGCTCTC-1,Monocytes +ENT_CGTCTACCACATCTTT-1,Granulocytes +ENT_CGTCTACGTCACTTCC-1,Monocytes +ENT_CGTCTACTCGGTCTAA-1,Monocytes +ENT_CGTGAGCAGCCCAGCT-1,NK cells +ENT_CGTGAGCAGCTGTCTA-1,Monocytes +ENT_CGTGAGCCACTAAGTC-1,Granulocytes +ENT_CGTGAGCGTACCGGCT-1,T cells +ENT_CGTGAGCGTACTCAAC-1,Monocytes +ENT_CGTGAGCTCATCATTC-1,T cells +ENT_CGTGAGCTCGTTACAG-1,Monocytes +ENT_CGTGTAAAGAGTGAGA-1,Monocytes +ENT_CGTGTAAGTAGCTTGT-1,Monocytes +ENT_CGTGTAAGTTGGAGGT-1,Monocytes +ENT_CGTGTCTAGTGGACGT-1,T cells +ENT_CGTGTCTCAAACGTGG-1,Monocytes +ENT_CGTGTCTGTTCTGTTT-1,Monocytes +ENT_CGTTAGAAGTTCGATC-1,Monocytes +ENT_CGTTAGACATGCGCAC-1,Monocytes +ENT_CGTTAGAGTAGTACCT-1,Monocytes +ENT_CGTTAGATCCAAGCCG-1,Monocytes +ENT_CGTTAGATCTTCATGT-1,Monocytes +ENT_CGTTCTGAGATGTGGC-1,Monocytes +ENT_CGTTCTGAGGGATACC-1,Monocytes +ENT_CGTTCTGAGTTGCAGG-1,Monocytes +ENT_CGTTCTGCATTCCTCG-1,Monocytes +ENT_CGTTCTGGTCCTGCTT-1,Monocytes +ENT_CGTTGGGAGAAGCCCA-1,Monocytes +ENT_CGTTGGGAGAAGGCCT-1,Granulocytes +ENT_CGTTGGGAGGAGCGAG-1,Monocytes +ENT_CGTTGGGCAGGACCCT-1,Dendritic cells +ENT_CGTTGGGGTAGTAGTA-1,Monocytes +ENT_CGTTGGGTCAACACCA-1,Monocytes +ENT_CGTTGGGTCGTTGACA-1,T cells +ENT_CTAACTTCACATTCGA-1,Monocytes +ENT_CTAACTTCACGCCAGT-1,Monocytes +ENT_CTAACTTGTCCGAAGA-1,Monocytes +ENT_CTAACTTGTGCACGAA-1,Dendritic cells +ENT_CTAACTTGTGTTAAGA-1,Monocytes +ENT_CTAACTTGTTGGTAAA-1,Dendritic cells +ENT_CTAACTTTCGAATCCA-1,Dendritic cells +ENT_CTAACTTTCGTCTGAA-1,Monocytes +ENT_CTAAGACAGCGTTCCG-1,Monocytes +ENT_CTAATGGCACGTAAGG-1,Monocytes +ENT_CTACACCAGTGCCAGA-1,Monocytes +ENT_CTACACCAGTTAACGA-1,Granulocytes +ENT_CTACACCCAAATACAG-1,Monocytes +ENT_CTACACCGTAAGGGAA-1,Macrophages +ENT_CTACACCGTCGGGTCT-1,Monocytes +ENT_CTACACCGTTTCCACC-1,Dendritic cells +ENT_CTACATTAGACAAAGG-1,Macrophages +ENT_CTACATTGTCCAGTGC-1,Monocytes +ENT_CTACATTGTCGTGGCT-1,Monocytes +ENT_CTACATTGTCTTCTCG-1,Granulocytes +ENT_CTACCCAAGCTAGGCA-1,Monocytes +ENT_CTACCCAAGTGTGGCA-1,Monocytes +ENT_CTACCCATCTGCTTGC-1,Dendritic cells +ENT_CTACGTCAGATCCCAT-1,Granulocytes +ENT_CTACGTCAGGCTCTTA-1,Monocytes +ENT_CTACGTCAGGGTGTGT-1,Monocytes +ENT_CTACGTCCAATAGCGG-1,Monocytes +ENT_CTACGTCGTACTTGAC-1,Monocytes +ENT_CTACGTCGTCAACATC-1,Macrophages +ENT_CTACGTCTCTCTAGGA-1,Monocytes +ENT_CTAGAGTAGGCTACGA-1,Monocytes +ENT_CTAGAGTGTCCGAGTC-1,Granulocytes +ENT_CTAGAGTGTGCCTGTG-1,Granulocytes +ENT_CTAGAGTGTGGCGAAT-1,Granulocytes +ENT_CTAGAGTGTTATGCGT-1,T cells +ENT_CTAGAGTTCACAATGC-1,Dendritic cells +ENT_CTAGCCTAGACAGAGA-1,Granulocytes +ENT_CTAGCCTCAAGTAATG-1,Monocytes +ENT_CTAGCCTCATCTACGA-1,Monocytes +ENT_CTAGCCTGTTCGGGCT-1,Monocytes +ENT_CTAGCCTTCACCGTAA-1,Granulocytes +ENT_CTAGCCTTCATGCATG-1,Granulocytes +ENT_CTAGCCTTCATGTCCC-1,Monocytes +ENT_CTAGCCTTCCACGTTC-1,Monocytes +ENT_CTAGTGAAGACCCACC-1,Monocytes +ENT_CTAGTGACAACGATGG-1,Monocytes +ENT_CTAGTGACAAGCTGTT-1,Monocytes +ENT_CTAGTGACAATTGCTG-1,Macrophages +ENT_CTAGTGAGTAGAAGGA-1,Granulocytes +ENT_CTAGTGAGTAGCACGA-1,Monocytes +ENT_CTAGTGATCCAGTAGT-1,Monocytes +ENT_CTCACACCAGGAATCG-1,Monocytes +ENT_CTCACACTCTCAAGTG-1,Monocytes +ENT_CTCAGAACAGGATTGG-1,Monocytes +ENT_CTCAGAAGTCTCGTTC-1,Monocytes +ENT_CTCATTAAGACCACGA-1,Monocytes +ENT_CTCATTAAGGCTCTTA-1,Monocytes +ENT_CTCATTACACACTGCG-1,Monocytes +ENT_CTCATTACATTAACCG-1,Dendritic cells +ENT_CTCATTAGTGTCGCTG-1,Dendritic cells +ENT_CTCATTATCTGATACG-1,Monocytes +ENT_CTCCTAGAGACTAAGT-1,Monocytes +ENT_CTCCTAGAGAGGTTAT-1,Macrophages +ENT_CTCCTAGAGATATACG-1,Monocytes +ENT_CTCCTAGAGCTAGCCC-1,Monocytes +ENT_CTCCTAGCAGGGTTAG-1,Monocytes +ENT_CTCCTAGTCCGTCATC-1,Monocytes +ENT_CTCCTAGTCCTCAACC-1,Monocytes +ENT_CTCGAAAAGCCAACAG-1,Monocytes +ENT_CTCGAAACAGGAATGC-1,Monocytes +ENT_CTCGAGGAGGCTACGA-1,Monocytes +ENT_CTCGAGGAGTGGGATC-1,Macrophages +ENT_CTCGAGGCAAACCCAT-1,Monocytes +ENT_CTCGAGGCAGGAATCG-1,Monocytes +ENT_CTCGAGGGTTCTGAAC-1,Monocytes +ENT_CTCGAGGTCTGCGACG-1,Monocytes +ENT_CTCGGAGAGTGTGAAT-1,Monocytes +ENT_CTCGGAGCAGTTCCCT-1,T cells +ENT_CTCGGAGGTAGCGCTC-1,Monocytes +ENT_CTCGGAGGTCAACATC-1,Monocytes +ENT_CTCGGGATCCAATGGT-1,Monocytes +ENT_CTCGGGATCGTTGCCT-1,Monocytes +ENT_CTCGGGATCTTATCTG-1,Monocytes +ENT_CTCGTACAGAGCCCAA-1,Dendritic cells +ENT_CTCGTACCACCAGGCT-1,Monocytes +ENT_CTCGTACCACGCCAGT-1,Granulocytes +ENT_CTCGTACTCAACACCA-1,Granulocytes +ENT_CTCGTACTCAGGCGAA-1,Monocytes +ENT_CTCGTACTCATTGCGA-1,Monocytes +ENT_CTCGTACTCCGCGGTA-1,Dendritic cells +ENT_CTCGTCAAGCTAGTGG-1,Monocytes +ENT_CTCGTCACAGCGTAAG-1,Monocytes +ENT_CTCGTCAGTCTGCCAG-1,Monocytes +ENT_CTCGTCAGTGTGACGA-1,Granulocytes +ENT_CTCGTCATCAATACCG-1,Monocytes +ENT_CTCGTCATCTCCAACC-1,Monocytes +ENT_CTCTAATAGAGTACCG-1,Monocytes +ENT_CTCTAATAGAGTGAGA-1,Monocytes +ENT_CTCTAATAGTCCAGGA-1,Monocytes +ENT_CTCTAATCACCCTATC-1,Macrophages +ENT_CTCTACGCACGAGAGT-1,Monocytes +ENT_CTCTACGCAGACACTT-1,Monocytes +ENT_CTCTACGGTGGGTATG-1,Granulocytes +ENT_CTCTACGGTTAGATGA-1,Monocytes +ENT_CTCTACGTCGGTCCGA-1,Monocytes +ENT_CTCTGGTAGATCACGG-1,Monocytes +ENT_CTCTGGTAGGCCCTTG-1,Granulocytes +ENT_CTCTGGTTCCCAACGG-1,Monocytes +ENT_CTCTGGTTCTCCAGGG-1,Monocytes +ENT_CTGAAACAGATATGCA-1,Monocytes +ENT_CTGAAACAGCCGCCTA-1,Monocytes +ENT_CTGAAACCACACAGAG-1,Monocytes +ENT_CTGAAACCAGTAGAGC-1,Granulocytes +ENT_CTGAAACCATGCAATC-1,Monocytes +ENT_CTGAAACCATGTCGAT-1,Granulocytes +ENT_CTGAAACGTCTGGAGA-1,Monocytes +ENT_CTGAAACGTTCCCGAG-1,Monocytes +ENT_CTGAAACTCCCTTGCA-1,Monocytes +ENT_CTGAAGTAGATAGTCA-1,Monocytes +ENT_CTGAAGTAGCAATCTC-1,Granulocytes +ENT_CTGAAGTAGTTCCACA-1,Granulocytes +ENT_CTGAAGTCAGGGATTG-1,Dendritic cells +ENT_CTGAAGTTCAACTCTT-1,Monocytes +ENT_CTGAAGTTCACAAACC-1,Dendritic cells +ENT_CTGATAGAGAGACGAA-1,Granulocytes +ENT_CTGATAGAGGCTCAGA-1,Monocytes +ENT_CTGATAGGTACTTCTT-1,Monocytes +ENT_CTGATAGTCCAGGGCT-1,Monocytes +ENT_CTGATCCAGCTAAACA-1,Granulocytes +ENT_CTGATCCCAGCTGTAT-1,Monocytes +ENT_CTGATCCGTTCCACTC-1,Monocytes +ENT_CTGATCCTCCAGTATG-1,Granulocytes +ENT_CTGCCTACAAACAACA-1,Monocytes +ENT_CTGCCTACAAATCCGT-1,Monocytes +ENT_CTGCCTACACAGCCCA-1,Granulocytes +ENT_CTGCCTAGTCATATCG-1,Monocytes +ENT_CTGCCTATCTGAGTGT-1,Monocytes +ENT_CTGCGGAAGCCCAGCT-1,Monocytes +ENT_CTGCGGAAGGAATCGC-1,Monocytes +ENT_CTGCGGAAGTGTACGG-1,Granulocytes +ENT_CTGCGGACATCAGTCA-1,Monocytes +ENT_CTGCGGAGTAGCCTAT-1,Monocytes +ENT_CTGCGGATCAGGCAAG-1,Monocytes +ENT_CTGCGGATCCCTTGTG-1,Monocytes +ENT_CTGCGGATCCGAATGT-1,Monocytes +ENT_CTGCTGTAGATCTGAA-1,Granulocytes +ENT_CTGCTGTAGTGGTAGC-1,Granulocytes +ENT_CTGCTGTCACTTAACG-1,Granulocytes +ENT_CTGCTGTGTTGGTGGA-1,Granulocytes +ENT_CTGGTCTAGATACACA-1,Macrophages +ENT_CTGGTCTAGATAGTCA-1,Monocytes +ENT_CTGGTCTAGGATGTAT-1,Monocytes +ENT_CTGGTCTCATGGTAGG-1,Monocytes +ENT_CTGGTCTGTGACAAAT-1,Monocytes +ENT_CTGGTCTTCATGGTCA-1,Monocytes +ENT_CTGGTCTTCCGTTGTC-1,Granulocytes +ENT_CTGTGCTCAAATTGCC-1,Monocytes +ENT_CTGTGCTCATACTCTT-1,Monocytes +ENT_CTGTGCTCATATGCTG-1,Granulocytes +ENT_CTGTGCTTCGTGGTCG-1,Monocytes +ENT_CTGTTTAAGAGGTTAT-1,Granulocytes +ENT_CTGTTTACACCTTGTC-1,Monocytes +ENT_CTGTTTACATGAAGTA-1,Monocytes +ENT_CTGTTTAGTCAGATAA-1,Monocytes +ENT_CTGTTTATCACATGCA-1,Monocytes +ENT_CTGTTTATCATCGATG-1,Monocytes +ENT_CTGTTTATCTGACCTC-1,Monocytes +ENT_CTTAACTAGGCTAGGT-1,Monocytes +ENT_CTTAACTAGTCCGTAT-1,Granulocytes +ENT_CTTAACTCAATAACGA-1,Monocytes +ENT_CTTAACTCAGCCAGAA-1,Monocytes +ENT_CTTAACTGTCAGAAGC-1,Monocytes +ENT_CTTAACTGTCTAGGTT-1,Monocytes +ENT_CTTAACTTCCAGAAGG-1,Monocytes +ENT_CTTACCGCAGGACCCT-1,Dendritic cells +ENT_CTTACCGTCCTAGGGC-1,Monocytes +ENT_CTTACCGTCCTATTCA-1,Monocytes +ENT_CTTAGGAAGCGTTTAC-1,Macrophages +ENT_CTTAGGAGTACATCCA-1,Granulocytes +ENT_CTTCTCTAGAAAGTGG-1,Monocytes +ENT_CTTCTCTAGAGCTGCA-1,Monocytes +ENT_CTTCTCTCAATGGAGC-1,Monocytes +ENT_CTTGGCTAGGCGATAC-1,Granulocytes +ENT_CTTGGCTCAAAGTCAA-1,Dendritic cells +ENT_CTTGGCTCAATGGAGC-1,Monocytes +ENT_CTTGGCTTCTTTAGTC-1,Monocytes +ENT_CTTTGCGAGAATTGTG-1,Monocytes +ENT_CTTTGCGAGAGTCGGT-1,Dendritic cells +ENT_CTTTGCGCAAGACACG-1,Macrophages +ENT_CTTTGCGCAGTATAAG-1,Monocytes +ENT_CTTTGCGGTAGCTGCC-1,Monocytes +ENT_CTTTGCGGTCTCCATC-1,Monocytes +ENT_CTTTGCGTCGCACTCT-1,Dendritic cells +ENT_CTTTGCGTCTATCCCG-1,Monocytes +ENT_GAAACTCCATACAGCT-1,Granulocytes +ENT_GAAACTCGTGGTAACG-1,Monocytes +ENT_GAAACTCTCACGAAGG-1,Monocytes +ENT_GAAACTCTCCTTGGTC-1,Monocytes +ENT_GAAACTCTCTATCGCC-1,Monocytes +ENT_GAAATGAAGGAGCGAG-1,Monocytes +ENT_GAAATGAAGGGTTCCC-1,Macrophages +ENT_GAAATGACACGGTAAG-1,Monocytes +ENT_GAAATGAGTACCGTAT-1,Monocytes +ENT_GAAATGAGTCGCTTCT-1,Granulocytes +ENT_GAACATCAGAAACCGC-1,Monocytes +ENT_GAACATCCAAGTCTGT-1,Monocytes +ENT_GAACATCGTAGGGACT-1,Granulocytes +ENT_GAACATCTCACAACGT-1,Granulocytes +ENT_GAACATCTCGCATGGC-1,Dendritic cells +ENT_GAACCTAAGTCGTTTG-1,Monocytes +ENT_GAACCTAGTATCAGTC-1,Granulocytes +ENT_GAACCTAGTCAATGTC-1,Monocytes +ENT_GAACCTAGTCGCATAT-1,NK cells +ENT_GAACCTAGTGCCTGTG-1,Monocytes +ENT_GAACCTATCCAGAAGG-1,Dendritic cells +ENT_GAACCTATCTGGAGCC-1,Monocytes +ENT_GAACGGAAGCGCTTAT-1,Monocytes +ENT_GAACGGAAGCTGGAAC-1,Monocytes +ENT_GAACGGAGTCGCGTGT-1,Monocytes +ENT_GAACGGATCTACCTGC-1,Monocytes +ENT_GAACGGATCTCTAGGA-1,Monocytes +ENT_GAAGCAGAGCTCCTCT-1,Dendritic cells +ENT_GAAGCAGCACATGACT-1,Monocytes +ENT_GAAGCAGGTATAATGG-1,Monocytes +ENT_GAAGCAGGTTTGTGTG-1,Dendritic cells +ENT_GAATAAGAGGCATGTG-1,Monocytes +ENT_GAATAAGAGTTGCAGG-1,Monocytes +ENT_GAATAAGCAAGCTGAG-1,Granulocytes +ENT_GAATAAGCAAGGTGTG-1,Dendritic cells +ENT_GAATAAGCAATACGCT-1,Monocytes +ENT_GAATAAGTCCACGCAG-1,Monocytes +ENT_GAATGAAAGATGCCTT-1,Granulocytes +ENT_GACACGCGTGCACGAA-1,Monocytes +ENT_GACAGAGAGCACCGTC-1,Monocytes +ENT_GACAGAGAGCACGCCT-1,Monocytes +ENT_GACAGAGCATGCAATC-1,Monocytes +ENT_GACAGAGGTTAGATGA-1,Monocytes +ENT_GACAGAGGTTCTCATT-1,Monocytes +ENT_GACAGAGTCAATACCG-1,Dendritic cells +ENT_GACAGAGTCTCGGACG-1,Dendritic cells +ENT_GACCAATCACTAGTAC-1,Monocytes +ENT_GACCAATGTACCGTAT-1,Macrophages +ENT_GACCAATTCAGGTAAA-1,Dendritic cells +ENT_GACCTGGAGCGGATCA-1,Monocytes +ENT_GACCTGGAGCTGAACG-1,Dendritic cells +ENT_GACCTGGGTAACGACG-1,Monocytes +ENT_GACCTGGGTATAAACG-1,Granulocytes +ENT_GACCTGGGTGACAAAT-1,Monocytes +ENT_GACCTGGGTTCCACGG-1,Dendritic cells +ENT_GACGCGTCAAGCTGAG-1,Monocytes +ENT_GACGCGTGTCGCGGTT-1,Granulocytes +ENT_GACGCGTGTCTCACCT-1,Monocytes +ENT_GACGCGTTCAGTTCGA-1,Dendritic cells +ENT_GACGCGTTCATGCTCC-1,Monocytes +ENT_GACGGCTAGTTTAGGA-1,Monocytes +ENT_GACGGCTCAAGGCTCC-1,Monocytes +ENT_GACGGCTGTAGAAAGG-1,Monocytes +ENT_GACGGCTTCGCAAACT-1,Monocytes +ENT_GACGGCTTCTGCTGCT-1,Monocytes +ENT_GACGTGCAGATGAGAG-1,Monocytes +ENT_GACGTGCAGCGTGTCC-1,Granulocytes +ENT_GACGTGCAGGTGCTAG-1,Monocytes +ENT_GACGTGCCACGTGAGA-1,Monocytes +ENT_GACGTGCTCCAATGGT-1,Monocytes +ENT_GACGTTACAAGCTGAG-1,Dendritic cells +ENT_GACGTTAGTCTCTTTA-1,Monocytes +ENT_GACGTTATCGTAGGAG-1,Monocytes +ENT_GACTAACAGATGAGAG-1,Monocytes +ENT_GACTAACAGGTAAACT-1,Granulocytes +ENT_GACTAACCAAGCCTAT-1,Monocytes +ENT_GACTAACCACAACGTT-1,Granulocytes +ENT_GACTAACCACCAGGCT-1,Monocytes +ENT_GACTAACGTAGCAAAT-1,Monocytes +ENT_GACTAACGTCACAAGG-1,Monocytes +ENT_GACTACAAGAGCCCAA-1,Granulocytes +ENT_GACTACAAGCAAATCA-1,Monocytes +ENT_GACTACAAGCGTTTAC-1,Monocytes +ENT_GACTACACACGAAGCA-1,Monocytes +ENT_GACTACACATTGCGGC-1,Monocytes +ENT_GACTACAGTGACGCCT-1,Macrophages +ENT_GACTACAGTGCGATAG-1,Monocytes +ENT_GACTACAGTTAAGGGC-1,Monocytes +ENT_GACTACATCCCGGATG-1,Monocytes +ENT_GACTGCGAGAAACCAT-1,T cells +ENT_GACTGCGAGGAGCGAG-1,Monocytes +ENT_GACTGCGGTAAGAGGA-1,Granulocytes +ENT_GACTGCGGTATAATGG-1,Monocytes +ENT_GAGCAGACAGCCACCA-1,Monocytes +ENT_GAGCAGAGTAACGCGA-1,Dendritic cells +ENT_GAGCAGAGTCACCTAA-1,Monocytes +ENT_GAGCAGATCAACGCTA-1,Monocytes +ENT_GAGGTGAAGACCGGAT-1,Monocytes +ENT_GAGGTGAAGAGTCGGT-1,Monocytes +ENT_GAGGTGAGTAAGGATT-1,Monocytes +ENT_GAGGTGAGTGAGTATA-1,Monocytes +ENT_GAGGTGAGTGTCCTCT-1,Monocytes +ENT_GAGGTGATCGTTTAGG-1,Monocytes +ENT_GAGTCCGAGCTAACAA-1,Monocytes +ENT_GAGTCCGAGCTAGTCT-1,Granulocytes +ENT_GAGTCCGAGCTCCTTC-1,Monocytes +ENT_GAGTCCGCAGTATCTG-1,Granulocytes +ENT_GAGTCCGCATCCGTGG-1,Dendritic cells +ENT_GAGTCCGGTGCGGTAA-1,Monocytes +ENT_GATCAGTAGATGGCGT-1,Monocytes +ENT_GATCAGTAGGATCGCA-1,Dendritic cells +ENT_GATCGATAGGCTATCT-1,Monocytes +ENT_GATCGCGAGGAATTAC-1,Monocytes +ENT_GATCGCGAGTCGTACT-1,Monocytes +ENT_GATCGCGCAGCCTGTG-1,Monocytes +ENT_GATCGCGCAGTCTTCC-1,Monocytes +ENT_GATCGCGGTGTTGGGA-1,Granulocytes +ENT_GATCGCGGTTTACTCT-1,Monocytes +ENT_GATCGCGGTTTGCATG-1,Monocytes +ENT_GATCGTAAGGCCCTCA-1,Dendritic cells +ENT_GATCGTACACTATCTT-1,Granulocytes +ENT_GATCGTATCGTTTGCC-1,Monocytes +ENT_GATCTAGAGGAATCGC-1,Monocytes +ENT_GATCTAGAGTTACCCA-1,Monocytes +ENT_GATCTAGCACGACTCG-1,Monocytes +ENT_GATCTAGCAGGACCCT-1,Granulocytes +ENT_GATCTAGCATCCCATC-1,Monocytes +ENT_GATCTAGTCTCCAACC-1,Monocytes +ENT_GATGAAAAGCTGGAAC-1,Dendritic cells +ENT_GATGAAAAGTGTGAAT-1,T cells +ENT_GATGAAACACCCATGG-1,Monocytes +ENT_GATGAAAGTGGTTTCA-1,Monocytes +ENT_GATGAAATCAGTTGAC-1,Dendritic cells +ENT_GATGAGGAGAAACCTA-1,Monocytes +ENT_GATGAGGCAATCCGAT-1,Monocytes +ENT_GATGAGGTCATGTCCC-1,Granulocytes +ENT_GATGAGGTCCTTGCCA-1,Granulocytes +ENT_GATGAGGTCCTTGGTC-1,Monocytes +ENT_GATGAGGTCGCGTTTC-1,Monocytes +ENT_GATGCTAAGATACACA-1,Monocytes +ENT_GATGCTAAGTACTTGC-1,Granulocytes +ENT_GATGCTACATCTCGCT-1,Dendritic cells +ENT_GATGCTAGTGTCTGAT-1,Dendritic cells +ENT_GATGCTAGTTAAGGGC-1,Monocytes +ENT_GATGCTATCAGCTGGC-1,Monocytes +ENT_GATGCTATCGACGGAA-1,Monocytes +ENT_GATTCAGCACTAGTAC-1,Granulocytes +ENT_GATTCAGGTCAAAGAT-1,Granulocytes +ENT_GCAAACTAGATGCCTT-1,Granulocytes +ENT_GCAAACTAGTTACGGG-1,Monocytes +ENT_GCAAACTCACGAGAGT-1,Monocytes +ENT_GCAAACTGTATTCGTG-1,Monocytes +ENT_GCAATCACAAGGTGTG-1,Monocytes +ENT_GCAATCATCCTTTCGG-1,Monocytes +ENT_GCACATAAGACAGAGA-1,Monocytes +ENT_GCACATAAGAGGGATA-1,Monocytes +ENT_GCACATAAGTACATGA-1,Granulocytes +ENT_GCACATAGTAAATGAC-1,Monocytes +ENT_GCACATATCACGACTA-1,Monocytes +ENT_GCACTCTAGCTGAACG-1,Monocytes +ENT_GCACTCTCAACACCTA-1,Granulocytes +ENT_GCACTCTGTAAGGATT-1,Granulocytes +ENT_GCACTCTGTCCAACTA-1,Monocytes +ENT_GCACTCTGTGCCTTGG-1,Dendritic cells +ENT_GCACTCTTCACTTCAT-1,Granulocytes +ENT_GCACTCTTCATGTCTT-1,Dendritic cells +ENT_GCAGCCACAAAGGAAG-1,T cells +ENT_GCAGCCACAGGGATTG-1,Monocytes +ENT_GCAGCCACAGTTCATG-1,T cells +ENT_GCAGCCAGTGCACGAA-1,Dendritic cells +ENT_GCAGCCATCGAGAGCA-1,Monocytes +ENT_GCAGCCATCGTCCAGG-1,Monocytes +ENT_GCAGTTACAATTCCTT-1,Monocytes +ENT_GCAGTTAGTTGTGGAG-1,Monocytes +ENT_GCAGTTATCCGCATCT-1,Monocytes +ENT_GCATACAAGCCTCGTG-1,Monocytes +ENT_GCATACAAGCTAGGCA-1,Monocytes +ENT_GCATACAAGTGGTAGC-1,Monocytes +ENT_GCATACAAGTGGTCCC-1,Monocytes +ENT_GCATACACAAACGCGA-1,Monocytes +ENT_GCATACAGTGTCGCTG-1,Monocytes +ENT_GCATACAGTTACCGAT-1,Dendritic cells +ENT_GCATACATCGTAGATC-1,Monocytes +ENT_GCATGATAGTTCGCGC-1,Granulocytes +ENT_GCATGATCATGCCTAA-1,Monocytes +ENT_GCATGATTCTTTAGGG-1,Granulocytes +ENT_GCATGTAAGTTAACGA-1,Monocytes +ENT_GCATGTAGTACGACCC-1,Dendritic cells +ENT_GCATGTAGTGGTCCGT-1,Monocytes +ENT_GCCAAATAGACTAGAT-1,Granulocytes +ENT_GCCAAATAGTACATGA-1,Macrophages +ENT_GCCAAATCACCGAATT-1,Macrophages +ENT_GCCAAATCATGCAATC-1,Monocytes +ENT_GCCAAATTCACCTTAT-1,Granulocytes +ENT_GCCAAATTCACTGGGC-1,Macrophages +ENT_GCCAAATTCCGAATGT-1,Monocytes +ENT_GCCAAATTCGAACTGT-1,Dendritic cells +ENT_GCCTCTAAGGTAAACT-1,Monocytes +ENT_GCCTCTACATGGGACA-1,Monocytes +ENT_GCCTCTATCGGAATCT-1,Monocytes +ENT_GCGACCAAGTACGCGA-1,Monocytes +ENT_GCGACCACAATCTGCA-1,Monocytes +ENT_GCGACCAGTATTCTCT-1,Monocytes +ENT_GCGACCAGTTCCAACA-1,Monocytes +ENT_GCGACCATCGGTTAAC-1,Granulocytes +ENT_GCGAGAAAGAATTGTG-1,Monocytes +ENT_GCGAGAAAGAGGTACC-1,Monocytes +ENT_GCGAGAAAGCAGGTCA-1,Monocytes +ENT_GCGAGAAAGCGTAATA-1,Monocytes +ENT_GCGAGAAGTACGAAAT-1,Granulocytes +ENT_GCGAGAATCGTTACGA-1,Monocytes +ENT_GCGAGAATCTTCGGTC-1,Monocytes +ENT_GCGCAACAGATGCCAG-1,Monocytes +ENT_GCGCAACAGCCATCGC-1,Monocytes +ENT_GCGCAACAGCGACGTA-1,Monocytes +ENT_GCGCAACAGCGTTCCG-1,Monocytes +ENT_GCGCAACAGTCCGTAT-1,Monocytes +ENT_GCGCAACAGTGTACGG-1,Monocytes +ENT_GCGCAACGTAATAGCA-1,Granulocytes +ENT_GCGCAGTGTATTCGTG-1,Monocytes +ENT_GCGCAGTGTTGGAGGT-1,Monocytes +ENT_GCGCCAACACTTAACG-1,Monocytes +ENT_GCGCCAACAGACAGGT-1,Monocytes +ENT_GCGCCAATCATGTCTT-1,Monocytes +ENT_GCGCCAATCTGCCCTA-1,Monocytes +ENT_GCGCCAATCTGTCCGT-1,Monocytes +ENT_GCGCCAATCTTACCGC-1,Monocytes +ENT_GCGCCAATCTTGCAAG-1,Monocytes +ENT_GCGCGATAGACTAAGT-1,Monocytes +ENT_GCGCGATGTAACGTTC-1,Monocytes +ENT_GCGCGATGTCTAGCGC-1,Monocytes +ENT_GCGGGTTAGCACAGGT-1,Dendritic cells +ENT_GCGGGTTAGGTGTGGT-1,T cells +ENT_GCGGGTTAGTGCAAGC-1,Monocytes +ENT_GCGGGTTAGTGGGCTA-1,Monocytes +ENT_GCGGGTTGTAAAGGAG-1,Dendritic cells +ENT_GCGGGTTGTTACGACT-1,Granulocytes +ENT_GCGGGTTTCACGCGGT-1,Monocytes +ENT_GCGGGTTTCGTGGGAA-1,Granulocytes +ENT_GCTCCTACAATGGAAT-1,Dendritic cells +ENT_GCTCCTAGTAGCTAAA-1,Monocytes +ENT_GCTCCTATCCGCGTTT-1,Monocytes +ENT_GCTCTGTCAGACAAGC-1,Granulocytes +ENT_GCTCTGTGTAGCTAAA-1,Macrophages +ENT_GCTCTGTGTTTGACAC-1,Monocytes +ENT_GCTCTGTTCGTACGGC-1,Granulocytes +ENT_GCTCTGTTCTGCGTAA-1,Monocytes +ENT_GCTGCAGAGATGAGAG-1,Monocytes +ENT_GCTGCAGAGCCAGTAG-1,Monocytes +ENT_GCTGCAGCAAGCCGTC-1,Monocytes +ENT_GCTGCAGTCAACCATG-1,Granulocytes +ENT_GCTGCAGTCCAAAGTC-1,Granulocytes +ENT_GCTGCAGTCGGTTCGG-1,Monocytes +ENT_GCTGCGAAGCCCGAAA-1,Dendritic cells +ENT_GCTGCGAAGTAGATGT-1,Monocytes +ENT_GCTGCGACATACAGCT-1,Monocytes +ENT_GCTGCGACATTAACCG-1,Monocytes +ENT_GCTGCGATCTCAAACG-1,Monocytes +ENT_GCTGCTTGTTACCGAT-1,Dendritic cells +ENT_GCTGCTTGTTCCACGG-1,Granulocytes +ENT_GCTGGGTAGCCGATTT-1,Monocytes +ENT_GCTGGGTTCCGAAGAG-1,Monocytes +ENT_GCTGGGTTCTCCAACC-1,Monocytes +ENT_GCTTCCACAAAGTGCG-1,Dendritic cells +ENT_GCTTCCATCAGCACAT-1,Granulocytes +ENT_GCTTCCATCTGACCTC-1,Monocytes +ENT_GCTTCCATCTTTACAC-1,T cells +ENT_GCTTGAAAGACTGTAA-1,Dendritic cells +ENT_GCTTGAAGTGAGCGAT-1,Macrophages +ENT_GCTTGAAGTTAGATGA-1,Monocytes +ENT_GCTTGAATCAGTGTTG-1,Granulocytes +ENT_GCTTGAATCTGGTTCC-1,Monocytes +ENT_GGAAAGCCAATAGCAA-1,Granulocytes +ENT_GGAAAGCCAGGACCCT-1,Monocytes +ENT_GGAAAGCCATCCTAGA-1,Monocytes +ENT_GGAAAGCGTCTTCGTC-1,Monocytes +ENT_GGAAAGCGTTTCGCTC-1,Monocytes +ENT_GGAACTTCAAACGTGG-1,Monocytes +ENT_GGAACTTCATGCGCAC-1,Dendritic cells +ENT_GGAACTTTCCACGTTC-1,Monocytes +ENT_GGAATAAAGACGCAAC-1,Monocytes +ENT_GGAATAACAAGAGTCG-1,Granulocytes +ENT_GGAATAACAAGCGTAG-1,Macrophages +ENT_GGAATAACAAGTACCT-1,Monocytes +ENT_GGAATAAGTCATCCCT-1,Dendritic cells +ENT_GGAATAAGTCGACTGC-1,Monocytes +ENT_GGACAAGAGGACAGCT-1,Monocytes +ENT_GGACAAGAGGTGCACA-1,Monocytes +ENT_GGACAAGAGTCCGGTC-1,Granulocytes +ENT_GGACAAGCACGTCAGC-1,Monocytes +ENT_GGACAAGCATCAGTCA-1,Monocytes +ENT_GGACAAGGTCGAACAG-1,Monocytes +ENT_GGACAAGGTCTCAACA-1,Monocytes +ENT_GGACAAGGTGATAAGT-1,Monocytes +ENT_GGACAAGGTGTTCGAT-1,Monocytes +ENT_GGACAAGTCGTTTGCC-1,Monocytes +ENT_GGACAGAAGCTTTGGT-1,T cells +ENT_GGACAGAAGTCAATAG-1,Monocytes +ENT_GGACAGACAACCGCCA-1,Dendritic cells +ENT_GGACAGACAGCTGGCT-1,Monocytes +ENT_GGACATTAGCACGCCT-1,Monocytes +ENT_GGACATTGTGCAGACA-1,Monocytes +ENT_GGACATTTCAGGATCT-1,Monocytes +ENT_GGACGTCCAAGCCCAC-1,Monocytes +ENT_GGACGTCCATGTCGAT-1,Granulocytes +ENT_GGACGTCTCTGGTATG-1,Monocytes +ENT_GGAGCAACAGTATGCT-1,Granulocytes +ENT_GGAGCAACATTAACCG-1,Monocytes +ENT_GGATGTTGTCTTCAAG-1,Monocytes +ENT_GGATGTTGTGTAAGTA-1,Monocytes +ENT_GGATTACAGGCATTGG-1,Monocytes +ENT_GGATTACGTGGTCCGT-1,Monocytes +ENT_GGATTACGTGTGACCC-1,Granulocytes +ENT_GGATTACGTTCGGGCT-1,Monocytes +ENT_GGATTACTCAAAGACA-1,Granulocytes +ENT_GGATTACTCCGGGTGT-1,Monocytes +ENT_GGCAATTCACCACGTG-1,Granulocytes +ENT_GGCAATTGTCCCGACA-1,Monocytes +ENT_GGCAATTGTCTCGTTC-1,Monocytes +ENT_GGCAATTGTGTCTGAT-1,T cells +ENT_GGCAATTTCCTCAACC-1,Granulocytes +ENT_GGCCGATAGAAACGAG-1,Granulocytes +ENT_GGCCGATGTCTAGTCA-1,Monocytes +ENT_GGCCGATGTGTGACGA-1,Monocytes +ENT_GGCCGATGTTGGTGGA-1,Monocytes +ENT_GGCGACTAGCTGTCTA-1,Dendritic cells +ENT_GGCGTGTAGTGAATTG-1,Monocytes +ENT_GGCGTGTCATGTCCTC-1,Macrophages +ENT_GGCGTGTGTTTGCATG-1,Monocytes +ENT_GGCTCGAAGTTGTCGT-1,Monocytes +ENT_GGCTCGACACGCATCG-1,Monocytes +ENT_GGCTCGACATTTCAGG-1,Monocytes +ENT_GGCTCGAGTCTCCACT-1,Monocytes +ENT_GGCTCGATCCCAAGTA-1,Monocytes +ENT_GGCTGGTAGTTGAGTA-1,Monocytes +ENT_GGCTGGTCACGGCTAC-1,Monocytes +ENT_GGCTGGTCATAACCTG-1,Dendritic cells +ENT_GGCTGGTGTAGCGCTC-1,Monocytes +ENT_GGCTGGTGTATTACCG-1,Dendritic cells +ENT_GGCTGGTTCGGCTACG-1,Monocytes +ENT_GGCTGGTTCTGCAAGT-1,Monocytes +ENT_GGGAATGAGCCAGGAT-1,Monocytes +ENT_GGGAATGAGGACACCA-1,Dendritic cells +ENT_GGGAATGAGTGGGCTA-1,Granulocytes +ENT_GGGAATGAGTGTTGAA-1,Monocytes +ENT_GGGAATGCAGGAACGT-1,Monocytes +ENT_GGGAATGGTCGAAAGC-1,Monocytes +ENT_GGGAATGGTCTTTCAT-1,Monocytes +ENT_GGGAATGTCGCTAGCG-1,Monocytes +ENT_GGGACCTAGGCGACAT-1,Dendritic cells +ENT_GGGACCTCATGGTCTA-1,Monocytes +ENT_GGGACCTTCGTTACAG-1,Granulocytes +ENT_GGGACCTTCGTTGCCT-1,Monocytes +ENT_GGGAGATAGAGCAATT-1,Monocytes +ENT_GGGAGATGTGGTCTCG-1,Monocytes +ENT_GGGAGATTCAGCCTAA-1,Granulocytes +ENT_GGGATGAAGCCTTGAT-1,Monocytes +ENT_GGGATGACATGCCTTC-1,Monocytes +ENT_GGGATGACATGGTTGT-1,Granulocytes +ENT_GGGATGACATTACCTT-1,Monocytes +ENT_GGGATGAGTAGCGTGA-1,Monocytes +ENT_GGGATGAGTGCCTGCA-1,Dendritic cells +ENT_GGGATGAGTGCGAAAC-1,Monocytes +ENT_GGGATGATCACAGGCC-1,Dendritic cells +ENT_GGGATGATCTCATTCA-1,Monocytes +ENT_GGGCACTGTAAATGAC-1,Monocytes +ENT_GGGCACTGTGCGGTAA-1,Dendritic cells +ENT_GGGCACTTCGTCACGG-1,Macrophages +ENT_GGGCACTTCTTGAGGT-1,Monocytes +ENT_GGGCATCAGTACTTGC-1,Monocytes +ENT_GGGCATCAGTCCGTAT-1,Monocytes +ENT_GGGCATCAGTGTCCAT-1,Monocytes +ENT_GGGCATCTCCACTCCA-1,Monocytes +ENT_GGGTCTGAGGCATGGT-1,Monocytes +ENT_GGGTCTGAGGGTGTGT-1,Monocytes +ENT_GGGTCTGTCATACGGT-1,Monocytes +ENT_GGGTTGCAGCTGTTCA-1,Granulocytes +ENT_GGGTTGCCAGTGGGAT-1,Monocytes +ENT_GGGTTGCCATATGAGA-1,Dendritic cells +ENT_GGGTTGCGTACACCGC-1,Monocytes +ENT_GGGTTGCGTGAAAGAG-1,Granulocytes +ENT_GGGTTGCGTGTCGCTG-1,Granulocytes +ENT_GGGTTGCTCAGAGACG-1,Monocytes +ENT_GGGTTGCTCGTGGGAA-1,Macrophages +ENT_GGTATTGCAAGGTGTG-1,Monocytes +ENT_GGTATTGGTCGCGGTT-1,Dendritic cells +ENT_GGTATTGGTGACCAAG-1,Monocytes +ENT_GGTGAAGAGAGTACCG-1,Monocytes +ENT_GGTGAAGAGGACAGCT-1,Monocytes +ENT_GGTGAAGAGTTGAGAT-1,Dendritic cells +ENT_GGTGAAGCAGTGACAG-1,Granulocytes +ENT_GGTGAAGCATGCCACG-1,Monocytes +ENT_GGTGAAGCATGGAATA-1,Monocytes +ENT_GGTGAAGGTAATCACC-1,Monocytes +ENT_GGTGAAGGTCACAAGG-1,Monocytes +ENT_GGTGAAGTCAACGGGA-1,Monocytes +ENT_GGTGCGTAGATCCCAT-1,Monocytes +ENT_GGTGCGTGTGCACGAA-1,T cells +ENT_GGTGCGTTCGGCGCAT-1,Monocytes +ENT_GGTGTTAAGACCACGA-1,T cells +ENT_GGTGTTAAGCTGCCCA-1,Monocytes +ENT_GGTGTTAAGTACGTTC-1,Monocytes +ENT_GGTGTTACACAGACAG-1,Granulocytes +ENT_GGTGTTACACGTAAGG-1,Monocytes +ENT_GGTGTTACAGCGTAAG-1,Monocytes +ENT_GGTGTTAGTAAGCACG-1,Monocytes +ENT_GGTGTTATCACCGGGT-1,Monocytes +ENT_GTAACGTAGAGGGATA-1,Monocytes +ENT_GTAACGTGTAAGCACG-1,Monocytes +ENT_GTAACGTGTCTGGTCG-1,Monocytes +ENT_GTAACGTTCAATCACG-1,Granulocytes +ENT_GTAACGTTCATCGCTC-1,Granulocytes +ENT_GTAACGTTCGCATGGC-1,Monocytes +ENT_GTAACTGAGTAGGTGC-1,Monocytes +ENT_GTAACTGGTGATAAGT-1,Granulocytes +ENT_GTAACTGGTTCGGCAC-1,Monocytes +ENT_GTAACTGTCTCCAACC-1,Dendritic cells +ENT_GTACGTACATCCCATC-1,Granulocytes +ENT_GTACGTAGTCTGCGGT-1,Monocytes +ENT_GTACGTAGTTAAAGAC-1,Granulocytes +ENT_GTACGTATCCTTTCTC-1,Monocytes +ENT_GTACTCCAGAGCCCAA-1,Dendritic cells +ENT_GTACTCCAGGATGCGT-1,Monocytes +ENT_GTACTCCAGGGTGTTG-1,Dendritic cells +ENT_GTACTCCCAGGGATTG-1,Monocytes +ENT_GTACTCCCATCCAACA-1,Monocytes +ENT_GTACTCCGTGTCGCTG-1,Monocytes +ENT_GTACTCCGTTATTCTC-1,T cells +ENT_GTACTCCGTTCAGTAC-1,Monocytes +ENT_GTACTCCGTTTGTTGG-1,Monocytes +ENT_GTACTCCTCTTAGAGC-1,Monocytes +ENT_GTACTTTAGTGTGGCA-1,Monocytes +ENT_GTACTTTCACCCATGG-1,Monocytes +ENT_GTACTTTCACGTCAGC-1,T cells +ENT_GTACTTTCAGCTATTG-1,Monocytes +ENT_GTACTTTGTCAGAAGC-1,Granulocytes +ENT_GTACTTTGTCATGCCG-1,Granulocytes +ENT_GTACTTTGTCCGTCAG-1,Granulocytes +ENT_GTACTTTTCTTTCCTC-1,T cells +ENT_GTAGGCCAGTCAAGGC-1,Monocytes +ENT_GTAGGCCAGTTAACGA-1,Monocytes +ENT_GTAGGCCGTTTACTCT-1,Monocytes +ENT_GTAGGCCTCATCATTC-1,Granulocytes +ENT_GTAGGCCTCATGTCCC-1,Granulocytes +ENT_GTAGGCCTCTTATCTG-1,Monocytes +ENT_GTAGTCAAGACTTGAA-1,Dendritic cells +ENT_GTAGTCACAAGGACTG-1,Dendritic cells +ENT_GTAGTCACATGGGACA-1,Monocytes +ENT_GTAGTCAGTAAATGAC-1,Dendritic cells +ENT_GTAGTCAGTATGCTTG-1,Monocytes +ENT_GTAGTCATCCCATTAT-1,Monocytes +ENT_GTATCTTAGAGAGCTC-1,Granulocytes +ENT_GTATCTTAGCGTAATA-1,Monocytes +ENT_GTATCTTAGTGGTAAT-1,Granulocytes +ENT_GTATCTTCAGTTAACC-1,Monocytes +ENT_GTATCTTGTACAAGTA-1,T cells +ENT_GTATCTTGTAGCCTCG-1,Monocytes +ENT_GTATTCTCACCAGATT-1,Monocytes +ENT_GTATTCTCAGACAGGT-1,Macrophages +ENT_GTATTCTGTCGTTGTA-1,Monocytes +ENT_GTATTCTGTCTTCGTC-1,Monocytes +ENT_GTATTCTGTGTTTGGT-1,Monocytes +ENT_GTATTCTTCACATGCA-1,Monocytes +ENT_GTATTCTTCATCATTC-1,Monocytes +ENT_GTCAAGTAGCTTTGGT-1,Monocytes +ENT_GTCAAGTAGGCGTACA-1,Monocytes +ENT_GTCAAGTCATACTCTT-1,Macrophages +ENT_GTCAAGTTCAACGAAA-1,Granulocytes +ENT_GTCAAGTTCACTTATC-1,Macrophages +ENT_GTCACAAAGGCGTACA-1,Monocytes +ENT_GTCACAACACAACGCC-1,Monocytes +ENT_GTCACAACATGAAGTA-1,Monocytes +ENT_GTCACAAGTACCGTTA-1,T cells +ENT_GTCACAAGTCCGAACC-1,Granulocytes +ENT_GTCACAAGTTGTCTTT-1,Granulocytes +ENT_GTCACAATCAATCTCT-1,Monocytes +ENT_GTCACAATCACCCGAG-1,Granulocytes +ENT_GTCACAATCCTAGAAC-1,Dendritic cells +ENT_GTCACAATCGCTTAGA-1,Monocytes +ENT_GTCACAATCTGCAGTA-1,Monocytes +ENT_GTCACGGAGGACAGAA-1,Macrophages +ENT_GTCACGGTCAGTTGAC-1,Monocytes +ENT_GTCACGGTCTGCCAGG-1,Monocytes +ENT_GTCATTTAGACTCGGA-1,Monocytes +ENT_GTCATTTAGACTTTCG-1,Monocytes +ENT_GTCATTTCACTTCGAA-1,Monocytes +ENT_GTCATTTGTGTTCTTT-1,Monocytes +ENT_GTCATTTGTTGGTGGA-1,Monocytes +ENT_GTCATTTTCTTTACAC-1,Monocytes +ENT_GTCCTCAAGTGTTAGA-1,Monocytes +ENT_GTCCTCAGTACTTCTT-1,Granulocytes +ENT_GTCCTCAGTACTTGAC-1,Granulocytes +ENT_GTCCTCAGTTAAGTAG-1,Monocytes +ENT_GTCCTCATCATTGCGA-1,Monocytes +ENT_GTCGGGTTCCAAACAC-1,Monocytes +ENT_GTCGGGTTCCTTTACA-1,Monocytes +ENT_GTCGTAAAGGCTCTTA-1,Monocytes +ENT_GTCGTAAGTGCTGTAT-1,Macrophages +ENT_GTCTCGTCAAGTCTAC-1,Granulocytes +ENT_GTCTCGTCACGGTTTA-1,Macrophages +ENT_GTCTCGTCATCCAACA-1,Macrophages +ENT_GTCTCGTGTGCGGTAA-1,Monocytes +ENT_GTCTCGTTCAACCATG-1,Monocytes +ENT_GTCTCGTTCCGTAGGC-1,Monocytes +ENT_GTCTTCGAGATAGCAT-1,Granulocytes +ENT_GTCTTCGCAATTGCTG-1,Granulocytes +ENT_GTCTTCGCACATCTTT-1,Monocytes +ENT_GTCTTCGCAGCTGCAC-1,Monocytes +ENT_GTCTTCGGTTATCCGA-1,Monocytes +ENT_GTCTTCGTCAGAGCTT-1,Dendritic cells +ENT_GTGAAGGAGAAGAAGC-1,Monocytes +ENT_GTGAAGGAGCGAAGGG-1,Monocytes +ENT_GTGAAGGAGGATCGCA-1,Dendritic cells +ENT_GTGAAGGCAATCAGAA-1,Granulocytes +ENT_GTGAAGGGTGAGTGAC-1,Monocytes +ENT_GTGAAGGTCAAACCAC-1,Monocytes +ENT_GTGCAGCCACATGGGA-1,Dendritic cells +ENT_GTGCAGCCATTACCTT-1,Monocytes +ENT_GTGCAGCGTCAGTGGA-1,Monocytes +ENT_GTGCAGCGTCCAGTGC-1,Monocytes +ENT_GTGCAGCGTGTCGCTG-1,Granulocytes +ENT_GTGCAGCGTGTGACGA-1,Monocytes +ENT_GTGCAGCGTTTGACTG-1,Granulocytes +ENT_GTGCATAAGCCCAATT-1,Monocytes +ENT_GTGCATACATCAGTAC-1,Monocytes +ENT_GTGCATATCCAGGGCT-1,Monocytes +ENT_GTGCATATCGCCTGAG-1,Monocytes +ENT_GTGCGGTGTTTGTGTG-1,Monocytes +ENT_GTGCGGTTCCAGTAGT-1,Monocytes +ENT_GTGCGGTTCCGCTGTT-1,Monocytes +ENT_GTGCGGTTCTCGCTTG-1,Monocytes +ENT_GTGCTTCAGAGCCTAG-1,Macrophages +ENT_GTGCTTCAGTCAAGCG-1,Monocytes +ENT_GTGCTTCTCCCAGGTG-1,Monocytes +ENT_GTGGGTCAGAAGAAGC-1,Monocytes +ENT_GTGGGTCAGCTAGTGG-1,Monocytes +ENT_GTGGGTCAGTCGAGTG-1,Monocytes +ENT_GTGGGTCGTCAGAATA-1,Dendritic cells +ENT_GTGGGTCTCTTGTACT-1,Monocytes +ENT_GTGTGCGAGCTAGCCC-1,Dendritic cells +ENT_GTGTGCGAGGAGTAGA-1,Monocytes +ENT_GTGTTAGAGATATGGT-1,Granulocytes +ENT_GTGTTAGGTAAGAGAG-1,NK cells +ENT_GTGTTAGGTCACTTCC-1,Monocytes +ENT_GTGTTAGGTTACGGAG-1,Monocytes +ENT_GTGTTAGTCAAGAAGT-1,Granulocytes +ENT_GTGTTAGTCGCCTGTT-1,Monocytes +ENT_GTGTTAGTCGTGGACC-1,Monocytes +ENT_GTGTTAGTCGTTTATC-1,Monocytes +ENT_GTTAAGCAGTAGCCGA-1,Monocytes +ENT_GTTAAGCCATATACCG-1,Dendritic cells +ENT_GTTAAGCGTCGCTTCT-1,Monocytes +ENT_GTTAAGCTCGGCGCTA-1,Monocytes +ENT_GTTAAGCTCTAACCGA-1,Monocytes +ENT_GTTACAGCACGGCCAT-1,Monocytes +ENT_GTTACAGGTAAACCTC-1,Monocytes +ENT_GTTACAGGTCAAGCGA-1,Granulocytes +ENT_GTTACAGGTTTGGCGC-1,Granulocytes +ENT_GTTCATTCAAGTAGTA-1,Monocytes +ENT_GTTCATTCAGTAACGG-1,Monocytes +ENT_GTTCATTGTACTCTCC-1,Dendritic cells +ENT_GTTCATTGTTGTCGCG-1,Dendritic cells +ENT_GTTCATTTCTGGAGCC-1,Monocytes +ENT_GTTCGGGAGACCTAGG-1,Monocytes +ENT_GTTCGGGAGGAATTAC-1,Monocytes +ENT_GTTCGGGAGGCTCATT-1,Monocytes +ENT_GTTCGGGAGTAACCCT-1,T cells +ENT_GTTCGGGAGTGAAGTT-1,Monocytes +ENT_GTTCGGGTCTCCTATA-1,Monocytes +ENT_GTTCTCGAGGGCACTA-1,Monocytes +ENT_GTTCTCGAGTCTCAAC-1,T cells +ENT_GTTCTCGAGTGGAGTC-1,Monocytes +ENT_GTTCTCGCAGGCAGTA-1,Monocytes +ENT_GTTCTCGCAGTCACTA-1,Monocytes +ENT_GTTCTCGCATGACGGA-1,Monocytes +ENT_GTTTCTACATAGTAAG-1,Granulocytes +ENT_GTTTCTACATGCCCGA-1,T cells +ENT_GTTTCTACATTGGTAC-1,Granulocytes +ENT_GTTTCTATCCTTAATC-1,Monocytes +ENT_TAAACCGAGATGTGTA-1,Monocytes +ENT_TAAACCGAGCTGTTCA-1,Monocytes +ENT_TAAACCGCACCAGTTA-1,Monocytes +ENT_TAAGAGACAATGCCAT-1,Monocytes +ENT_TAAGAGACACGGTAAG-1,Granulocytes +ENT_TAAGAGAGTATCAGTC-1,Granulocytes +ENT_TAAGAGAGTATGGTTC-1,Monocytes +ENT_TAAGAGAGTCTAAAGA-1,Granulocytes +ENT_TAAGAGAGTGCAGGTA-1,Monocytes +ENT_TAAGAGATCAACACGT-1,Monocytes +ENT_TAAGAGATCCGTTGTC-1,Monocytes +ENT_TAAGCGTCAAGCGCTC-1,Monocytes +ENT_TAAGCGTCAATGGATA-1,Granulocytes +ENT_TAAGCGTTCCATGAGT-1,Monocytes +ENT_TAAGCGTTCTTAACCT-1,Granulocytes +ENT_TAAGTGCCAATCTACG-1,Dendritic cells +ENT_TAAGTGCTCCTTGCCA-1,T cells +ENT_TACACGAAGCTGAAAT-1,Monocytes +ENT_TACACGAAGCTGTCTA-1,Monocytes +ENT_TACACGAAGGCATTGG-1,Monocytes +ENT_TACACGACATCACCCT-1,Monocytes +ENT_TACACGAGTCGCGAAA-1,Monocytes +ENT_TACAGTGCACGCGAAA-1,Monocytes +ENT_TACAGTGCATCGGACC-1,Monocytes +ENT_TACAGTGGTCTAACGT-1,Monocytes +ENT_TACAGTGTCAAAGTAG-1,Monocytes +ENT_TACCTATAGATGGCGT-1,Monocytes +ENT_TACCTATCAATGACCT-1,Monocytes +ENT_TACCTATCAGAGCCAA-1,Monocytes +ENT_TACCTATCAGGAATGC-1,Granulocytes +ENT_TACCTATGTCCAGTTA-1,Monocytes +ENT_TACCTTAAGCCAACAG-1,Monocytes +ENT_TACCTTAAGGCTCAGA-1,Monocytes +ENT_TACCTTAAGGTAGCTG-1,Monocytes +ENT_TACCTTAAGTGTTAGA-1,Monocytes +ENT_TACCTTACAATCTACG-1,Dendritic cells +ENT_TACCTTACACCCAGTG-1,B cells +ENT_TACCTTAGTGTCAATC-1,Monocytes +ENT_TACCTTATCGTGACAT-1,Monocytes +ENT_TACGGATAGATGTGTA-1,Monocytes +ENT_TACGGATAGTGACTCT-1,Monocytes +ENT_TACGGATCAGACGCTC-1,Monocytes +ENT_TACGGGCAGTGTCTCA-1,Monocytes +ENT_TACGGGCCATACCATG-1,Dendritic cells +ENT_TACGGGCCATGGATGG-1,Monocytes +ENT_TACGGGCGTAAGTTCC-1,Dendritic cells +ENT_TACGGGCGTCATATGC-1,Monocytes +ENT_TACGGTAAGTGTTTGC-1,Monocytes +ENT_TACGGTATCCGGCACA-1,Monocytes +ENT_TACGGTATCCTGTAGA-1,Dendritic cells +ENT_TACTCATAGCAATATG-1,Granulocytes +ENT_TACTCATTCGAGGTAG-1,Monocytes +ENT_TACTCGCCATTTGCTT-1,Monocytes +ENT_TACTCGCTCCAGATCA-1,Granulocytes +ENT_TACTCGCTCTACTTAC-1,Monocytes +ENT_TACTTACAGCCCTAAT-1,Monocytes +ENT_TACTTACCATATACCG-1,Monocytes +ENT_TACTTACGTAGCGTAG-1,Monocytes +ENT_TACTTGTAGGTGATAT-1,Granulocytes +ENT_TACTTGTGTACAGCAG-1,Monocytes +ENT_TACTTGTGTCCCGACA-1,Dendritic cells +ENT_TACTTGTGTCCGTGAC-1,Monocytes +ENT_TACTTGTGTTGCCTCT-1,Dendritic cells +ENT_TACTTGTTCACCGGGT-1,Monocytes +ENT_TACTTGTTCCCATTTA-1,Monocytes +ENT_TACTTGTTCCGTACAA-1,Dendritic cells +ENT_TACTTGTTCGCATGGC-1,Monocytes +ENT_TACTTGTTCGGCTTGG-1,Dendritic cells +ENT_TAGACCAGTAACGTTC-1,Monocytes +ENT_TAGACCATCTTTCCTC-1,Monocytes +ENT_TAGAGCTAGACATAAC-1,Monocytes +ENT_TAGAGCTCACAGAGGT-1,Macrophages +ENT_TAGAGCTGTATAGGGC-1,Dendritic cells +ENT_TAGAGCTGTTACGTCA-1,Monocytes +ENT_TAGAGCTTCGTCTGAA-1,Monocytes +ENT_TAGCCGGAGGATGGTC-1,Macrophages +ENT_TAGCCGGAGTAGCGGT-1,T cells +ENT_TAGCCGGCAATCGGTT-1,Monocytes +ENT_TAGCCGGGTAAGAGGA-1,Dendritic cells +ENT_TAGCCGGGTCGAATCT-1,Monocytes +ENT_TAGGCATGTAAATGTG-1,Dendritic cells +ENT_TAGGCATGTACCGGCT-1,Granulocytes +ENT_TAGGCATGTCTGCGGT-1,Granulocytes +ENT_TAGTGGTAGCTCCCAG-1,Granulocytes +ENT_TAGTGGTGTCCGACGT-1,Monocytes +ENT_TAGTGGTTCTGTTTGT-1,Monocytes +ENT_TAGTTGGAGTTACGGG-1,Monocytes +ENT_TAGTTGGGTAACGCGA-1,Monocytes +ENT_TAGTTGGGTATTCTCT-1,Dendritic cells +ENT_TATCAGGCAGATGAGC-1,Monocytes +ENT_TATCAGGGTAGAGTGC-1,Monocytes +ENT_TATCAGGGTCAGTGGA-1,Monocytes +ENT_TATCAGGGTCGCATAT-1,Monocytes +ENT_TATCAGGGTGATGCCC-1,Monocytes +ENT_TATCAGGTCCGAAGAG-1,Monocytes +ENT_TATCTCAAGCCCGAAA-1,Granulocytes +ENT_TATCTCACATGCTGGC-1,T cells +ENT_TATCTCAGTCCAGTTA-1,Monocytes +ENT_TATCTCAGTTTACTCT-1,Monocytes +ENT_TATCTCATCGGTCCGA-1,Granulocytes +ENT_TATGCCCAGGAACTGC-1,Monocytes +ENT_TATGCCCAGGAGTTTA-1,Monocytes +ENT_TATGCCCCACGTCTCT-1,Monocytes +ENT_TATTACCAGGCTACGA-1,Dendritic cells +ENT_TATTACCGTGCTCTTC-1,Monocytes +ENT_TCAACGACATGGTCAT-1,T cells +ENT_TCAACGAGTAGCACGA-1,T cells +ENT_TCAACGAGTGCTGTAT-1,Monocytes +ENT_TCAACGAGTTTACTCT-1,Monocytes +ENT_TCAATCTAGCTGCCCA-1,Monocytes +ENT_TCAATCTAGGGTCGAT-1,Monocytes +ENT_TCAATCTCAGCTGCTG-1,Monocytes +ENT_TCAATCTCAGGGTACA-1,Monocytes +ENT_TCAATCTGTCTTCAAG-1,Dendritic cells +ENT_TCAATCTGTGTTGGGA-1,Dendritic cells +ENT_TCAATCTTCAGAGACG-1,T cells +ENT_TCACAAGAGATGGCGT-1,Monocytes +ENT_TCACAAGAGTGATCGG-1,Monocytes +ENT_TCACAAGCAATGGAAT-1,Granulocytes +ENT_TCACAAGCATGCATGT-1,Macrophages +ENT_TCACAAGCATGTCTCC-1,Monocytes +ENT_TCACAAGCATTATCTC-1,Monocytes +ENT_TCACAAGGTTACCGAT-1,Dendritic cells +ENT_TCACAAGGTTGGACCC-1,Monocytes +ENT_TCACGAAAGCCGGTAA-1,Monocytes +ENT_TCACGAAAGGTGATAT-1,Monocytes +ENT_TCACGAAGTAAGTAGT-1,Monocytes +ENT_TCACGAATCAGCTCTC-1,T cells +ENT_TCAGATGAGGAACTGC-1,Monocytes +ENT_TCAGATGTCAGAGACG-1,T cells +ENT_TCAGATGTCGCGTTTC-1,Monocytes +ENT_TCAGCAAAGGCAAAGA-1,Monocytes +ENT_TCAGCAACAAGCCCAC-1,Monocytes +ENT_TCAGCAACAGCAGTTT-1,NK cells +ENT_TCAGCAACATCACGAT-1,Erythrocytes +ENT_TCAGCAACATCCAACA-1,Granulocytes +ENT_TCAGCAAGTAGCGTCC-1,Monocytes +ENT_TCAGCTCAGGACACCA-1,Monocytes +ENT_TCAGCTCAGGGCACTA-1,Granulocytes +ENT_TCAGCTCCAGGATTGG-1,Granulocytes +ENT_TCAGGATAGTGTACCT-1,Monocytes +ENT_TCAGGATGTATTAGCC-1,T cells +ENT_TCAGGATGTTGTACAC-1,Monocytes +ENT_TCAGGTAAGATGGCGT-1,Monocytes +ENT_TCAGGTAAGGGAACGG-1,Monocytes +ENT_TCAGGTACACTTCGAA-1,Monocytes +ENT_TCAGGTAGTCACAAGG-1,Granulocytes +ENT_TCAGGTAGTCAGGACA-1,Monocytes +ENT_TCAGGTAGTCGCATAT-1,Monocytes +ENT_TCAGGTAGTCGTGGCT-1,Granulocytes +ENT_TCAGGTAGTTTGTGTG-1,Monocytes +ENT_TCAGGTATCGATAGAA-1,Granulocytes +ENT_TCATTACAGCTGCGAA-1,Granulocytes +ENT_TCATTACAGGATGGTC-1,Granulocytes +ENT_TCATTACGTACATCCA-1,Dendritic cells +ENT_TCATTACGTCTAACGT-1,Monocytes +ENT_TCATTACGTGGCGAAT-1,Monocytes +ENT_TCATTACGTGTCAATC-1,Monocytes +ENT_TCATTACGTGTGCGTC-1,Dendritic cells +ENT_TCATTTGAGCTACCTA-1,Monocytes +ENT_TCATTTGAGTATCTCG-1,Monocytes +ENT_TCATTTGGTGGTAACG-1,Monocytes +ENT_TCATTTGTCAGAAATG-1,Monocytes +ENT_TCATTTGTCTCAAGTG-1,Dendritic cells +ENT_TCCACACCACGTAAGG-1,Monocytes +ENT_TCCACACGTCGCGGTT-1,Monocytes +ENT_TCCACACGTTGTACAC-1,Monocytes +ENT_TCCACACTCAAACCGT-1,Granulocytes +ENT_TCCACACTCACTCCTG-1,Dendritic cells +ENT_TCCCGATAGGTGATTA-1,Monocytes +ENT_TCCCGATTCAGCTCTC-1,Dendritic cells +ENT_TCGAGGCAGAGGGATA-1,Monocytes +ENT_TCGAGGCAGCACGCCT-1,Monocytes +ENT_TCGAGGCCAAAGCGGT-1,Granulocytes +ENT_TCGAGGCCAATGAATG-1,Granulocytes +ENT_TCGAGGCCACGGACAA-1,Monocytes +ENT_TCGAGGCGTAACGCGA-1,Monocytes +ENT_TCGAGGCGTAGAGCTG-1,Monocytes +ENT_TCGAGGCTCGGTGTTA-1,Monocytes +ENT_TCGCGAGAGAGGGATA-1,Granulocytes +ENT_TCGCGAGAGGCGACAT-1,Monocytes +ENT_TCGCGAGAGTGCCATT-1,Monocytes +ENT_TCGCGAGCAGTATGCT-1,Monocytes +ENT_TCGCGAGCATCCGTGG-1,Monocytes +ENT_TCGCGAGGTTCTGTTT-1,Monocytes +ENT_TCGCGAGGTTTGACTG-1,Monocytes +ENT_TCGCGAGTCCCATTAT-1,Monocytes +ENT_TCGCGAGTCTGTTTGT-1,Dendritic cells +ENT_TCGCGTTAGTCAAGCG-1,Dendritic cells +ENT_TCGCGTTAGTCATGCT-1,Monocytes +ENT_TCGCGTTCACGAGAGT-1,Monocytes +ENT_TCGCGTTCAGTGGAGT-1,Monocytes +ENT_TCGCGTTCATTGCGGC-1,Monocytes +ENT_TCGGGACAGATCACGG-1,Monocytes +ENT_TCGGGACAGCTCAACT-1,Monocytes +ENT_TCGGGACCAACTGGCC-1,Granulocytes +ENT_TCGGGACCACGGCGTT-1,Monocytes +ENT_TCGGGACCATGGTAGG-1,Monocytes +ENT_TCGGGACGTGTGGTTT-1,Monocytes +ENT_TCGGGACTCGCATGAT-1,Monocytes +ENT_TCGGGACTCGCCAAAT-1,Monocytes +ENT_TCGGTAAAGCTCCTCT-1,Monocytes +ENT_TCGGTAACAAGCGAGT-1,Monocytes +ENT_TCGGTAAGTTATTCTC-1,Monocytes +ENT_TCGGTAAGTTTGCATG-1,Dendritic cells +ENT_TCGTACCAGAGGACGG-1,Monocytes +ENT_TCGTACCAGCAATATG-1,Monocytes +ENT_TCGTACCAGTCGCCGT-1,Monocytes +ENT_TCGTACCCAGCTCCGA-1,Granulocytes +ENT_TCGTACCTCACCTTAT-1,Monocytes +ENT_TCGTAGAAGACAGAGA-1,Monocytes +ENT_TCGTAGAAGCACCGCT-1,Monocytes +ENT_TCGTAGACAGCTGGCT-1,T cells +ENT_TCGTAGAGTCCATCCT-1,Monocytes +ENT_TCGTAGATCAACTCTT-1,Monocytes +ENT_TCGTAGATCGAGAACG-1,Monocytes +ENT_TCTATTGCACTGAAGG-1,Monocytes +ENT_TCTATTGGTATGAAAC-1,Monocytes +ENT_TCTATTGGTCCTCTTG-1,Granulocytes +ENT_TCTATTGGTTGTGGAG-1,T cells +ENT_TCTATTGTCCAAACTG-1,Monocytes +ENT_TCTCATAAGCTAGTCT-1,Monocytes +ENT_TCTCATAGTACTCTCC-1,Monocytes +ENT_TCTCATAGTTGTCTTT-1,Monocytes +ENT_TCTCTAAAGCATCATC-1,Monocytes +ENT_TCTCTAACAGTGAGTG-1,Monocytes +ENT_TCTGAGATCACTCTTA-1,Dendritic cells +ENT_TCTGAGATCCAACCAA-1,Macrophages +ENT_TCTGGAAAGGGCATGT-1,Monocytes +ENT_TCTGGAACAATCTACG-1,Monocytes +ENT_TCTGGAACAGCCTATA-1,Monocytes +ENT_TCTGGAATCCACGTGG-1,Dendritic cells +ENT_TCTGGAATCCCTAATT-1,Monocytes +ENT_TCTGGAATCGCAGGCT-1,T cells +ENT_TCTTCGGAGACTAGGC-1,Monocytes +ENT_TCTTCGGAGCGCCTCA-1,Monocytes +ENT_TCTTCGGGTTGTCTTT-1,Monocytes +ENT_TCTTCGGTCACATAGC-1,Granulocytes +ENT_TCTTCGGTCAGTTAGC-1,Monocytes +ENT_TCTTTCCAGAATGTTG-1,Monocytes +ENT_TCTTTCCAGATTACCC-1,Granulocytes +ENT_TCTTTCCAGGCCCGTT-1,Monocytes +ENT_TCTTTCCAGTGTCCAT-1,Macrophages +ENT_TCTTTCCCAATAAGCA-1,Monocytes +ENT_TCTTTCCCATCCCACT-1,Monocytes +ENT_TCTTTCCGTCTCCCTA-1,Monocytes +ENT_TCTTTCCTCTCAAACG-1,Monocytes +ENT_TGAAAGAAGGCAGGTT-1,Monocytes +ENT_TGAAAGACACATCTTT-1,Monocytes +ENT_TGAAAGATCCCTAACC-1,Monocytes +ENT_TGACAACCACGGACAA-1,Granulocytes +ENT_TGACGGCCACACTGCG-1,Monocytes +ENT_TGACGGCCAGGCGATA-1,Monocytes +ENT_TGACTAGGTAATAGCA-1,Monocytes +ENT_TGACTAGGTCGCGAAA-1,Granulocytes +ENT_TGACTAGTCGTATCAG-1,Monocytes +ENT_TGACTAGTCTCAAGTG-1,Granulocytes +ENT_TGACTTTCATGTTCCC-1,Monocytes +ENT_TGACTTTTCTGGTATG-1,Monocytes +ENT_TGAGAGGAGTCCTCCT-1,Monocytes +ENT_TGAGAGGCATCCTTGC-1,Monocytes +ENT_TGAGAGGCATGCCTAA-1,Monocytes +ENT_TGAGAGGTCAAACCGT-1,Monocytes +ENT_TGAGAGGTCACGGTTA-1,Dendritic cells +ENT_TGAGCATGTGACTACT-1,Monocytes +ENT_TGAGCATTCAGCTGGC-1,Monocytes +ENT_TGAGCATTCATGTCTT-1,Monocytes +ENT_TGAGCATTCCTAGTGA-1,Monocytes +ENT_TGAGCCGAGGATGTAT-1,Monocytes +ENT_TGAGCCGCACTGTCGG-1,Granulocytes +ENT_TGAGCCGGTCCTAGCG-1,Dendritic cells +ENT_TGAGCCGGTTACTGAC-1,Monocytes +ENT_TGAGGGAAGACAATAC-1,Granulocytes +ENT_TGAGGGAAGCCACGTC-1,Monocytes +ENT_TGAGGGAAGTGAAGTT-1,Macrophages +ENT_TGAGGGATCCTCAACC-1,Monocytes +ENT_TGATTTCCATACTCTT-1,Monocytes +ENT_TGATTTCCATTCTCAT-1,Monocytes +ENT_TGATTTCGTGATGTGG-1,Monocytes +ENT_TGATTTCTCCTAGTGA-1,Monocytes +ENT_TGCACCTAGCTAAACA-1,Granulocytes +ENT_TGCACCTTCACGACTA-1,Monocytes +ENT_TGCACCTTCTTAGCCC-1,Monocytes +ENT_TGCCAAAAGAGTAATC-1,Monocytes +ENT_TGCCAAACACATCTTT-1,Monocytes +ENT_TGCCAAACACATGGGA-1,Monocytes +ENT_TGCCAAACACTGTGTA-1,Dendritic cells +ENT_TGCCAAACATGTCTCC-1,Monocytes +ENT_TGCCAAAGTCAAACTC-1,Monocytes +ENT_TGCCAAATCTTTCCTC-1,Granulocytes +ENT_TGCCCATAGATATGGT-1,T cells +ENT_TGCCCATAGCTCCTCT-1,Granulocytes +ENT_TGCCCATCACCACCAG-1,Dendritic cells +ENT_TGCCCATCACCATGTA-1,Monocytes +ENT_TGCCCATTCACTTATC-1,Monocytes +ENT_TGCCCTAAGGCCGAAT-1,Granulocytes +ENT_TGCCCTACATGAGCGA-1,Granulocytes +ENT_TGCCCTACATGGTCAT-1,Dendritic cells +ENT_TGCCCTAGTTGCGCAC-1,Monocytes +ENT_TGCCCTATCGCAAACT-1,Granulocytes +ENT_TGCGCAGAGAGTGAGA-1,T cells +ENT_TGCGCAGCAGATTGCT-1,Dendritic cells +ENT_TGCGCAGGTCCAGTAT-1,Monocytes +ENT_TGCGCAGGTCCCTACT-1,Dendritic cells +ENT_TGCGCAGGTGTAATGA-1,Monocytes +ENT_TGCGCAGGTGTGGCTC-1,Monocytes +ENT_TGCGGGTAGAACTGTA-1,Dendritic cells +ENT_TGCGGGTAGCGTTGCC-1,Monocytes +ENT_TGCGGGTCAAGCCGTC-1,T cells +ENT_TGCGGGTGTACGCTGC-1,Monocytes +ENT_TGCGGGTGTGAGTATA-1,Monocytes +ENT_TGCGGGTTCAACACCA-1,Monocytes +ENT_TGCGGGTTCACCCGAG-1,Macrophages +ENT_TGCGGGTTCCTCTAGC-1,Monocytes +ENT_TGCGGGTTCTGCGGCA-1,Monocytes +ENT_TGCGTGGCATTGAGCT-1,Monocytes +ENT_TGCGTGGGTAATAGCA-1,Monocytes +ENT_TGCGTGGGTATAATGG-1,Monocytes +ENT_TGCGTGGGTTCGCTAA-1,Monocytes +ENT_TGCTACCAGTGTGGCA-1,NK cells +ENT_TGCTACCGTAGATTAG-1,Monocytes +ENT_TGCTACCGTATAAACG-1,Monocytes +ENT_TGCTACCTCGTTGACA-1,Monocytes +ENT_TGCTGCTAGCAACGGT-1,Granulocytes +ENT_TGCTGCTAGGCCGAAT-1,Monocytes +ENT_TGCTGCTCACGGTTTA-1,Monocytes +ENT_TGCTGCTCATGCCACG-1,Monocytes +ENT_TGCTGCTGTAAGGATT-1,Monocytes +ENT_TGCTGCTGTCCTCCAT-1,Granulocytes +ENT_TGCTGCTGTCGCTTCT-1,Monocytes +ENT_TGCTGCTTCCAAATGC-1,Monocytes +ENT_TGCTGCTTCGAATGGG-1,Granulocytes +ENT_TGGACGCAGTAGCGGT-1,Granulocytes +ENT_TGGACGCGTCGAGATG-1,Dendritic cells +ENT_TGGACGCGTGGCGAAT-1,Monocytes +ENT_TGGCCAGAGAAAGTGG-1,Granulocytes +ENT_TGGCCAGAGAGTGACC-1,Monocytes +ENT_TGGCCAGAGATTACCC-1,Dendritic cells +ENT_TGGCCAGTCATGCATG-1,Monocytes +ENT_TGGCCAGTCCTCGCAT-1,NK cells +ENT_TGGCGCAAGTCGTTTG-1,NK cells +ENT_TGGCGCACACAGGCCT-1,Monocytes +ENT_TGGCGCATCCCAACGG-1,Monocytes +ENT_TGGCTGGAGGGTGTTG-1,Monocytes +ENT_TGGCTGGCATACTACG-1,Monocytes +ENT_TGGGAAGCAAACGCGA-1,Monocytes +ENT_TGGGAAGGTCGCGTGT-1,Monocytes +ENT_TGGGAAGGTGTAAGTA-1,Monocytes +ENT_TGGGAAGTCATCGGAT-1,Dendritic cells +ENT_TGGGCGTAGACTCGGA-1,Dendritic cells +ENT_TGGGCGTAGGACAGAA-1,Dendritic cells +ENT_TGGGCGTCAATCGAAA-1,Monocytes +ENT_TGGGCGTTCACCTTAT-1,Monocytes +ENT_TGGGCGTTCTCGCTTG-1,Monocytes +ENT_TGGGCGTTCTTACCTA-1,Monocytes +ENT_TGGTTAGCAACCGCCA-1,Granulocytes +ENT_TGGTTCCAGAAACGAG-1,Monocytes +ENT_TGGTTCCAGCACCGCT-1,Granulocytes +ENT_TGGTTCCAGCTTCGCG-1,Monocytes +ENT_TGGTTCCCAGCCTATA-1,Dendritic cells +ENT_TGGTTCCCAGCTCCGA-1,Monocytes +ENT_TGGTTCCCATTGGTAC-1,Monocytes +ENT_TGGTTCCGTAGCTCCG-1,Monocytes +ENT_TGGTTCCGTCGCTTCT-1,Dendritic cells +ENT_TGTATTCAGAACTCGG-1,Monocytes +ENT_TGTATTCAGCTAAACA-1,Monocytes +ENT_TGTATTCCAATCGAAA-1,Monocytes +ENT_TGTATTCGTCCGAATT-1,Monocytes +ENT_TGTATTCGTTGAACTC-1,Granulocytes +ENT_TGTATTCTCAAGGTAA-1,T cells +ENT_TGTATTCTCACCCTCA-1,T cells +ENT_TGTATTCTCATGTGGT-1,Dendritic cells +ENT_TGTCCCAAGCACCGTC-1,Monocytes +ENT_TGTCCCAAGGTAAACT-1,Monocytes +ENT_TGTCCCAAGTCCGTAT-1,Monocytes +ENT_TGTCCCACATGCAACT-1,Dendritic cells +ENT_TGTGGTAAGAAAGTGG-1,Dendritic cells +ENT_TGTGGTAAGGCTACGA-1,Monocytes +ENT_TGTGGTAAGGCTCATT-1,Granulocytes +ENT_TGTGGTAAGTTCGCAT-1,Monocytes +ENT_TGTGGTAAGTTTAGGA-1,Granulocytes +ENT_TGTGGTAGTGTCCTCT-1,Monocytes +ENT_TGTGGTAGTTCGGCAC-1,Granulocytes +ENT_TGTGTTTAGCCCAATT-1,Dendritic cells +ENT_TGTGTTTAGCCTCGTG-1,Monocytes +ENT_TGTGTTTAGCGTTTAC-1,Monocytes +ENT_TGTGTTTCACCACGTG-1,Monocytes +ENT_TGTGTTTGTGTCGCTG-1,Monocytes +ENT_TGTGTTTTCTATCCCG-1,Monocytes +ENT_TGTGTTTTCTTGGGTA-1,Granulocytes +ENT_TGTTCCGAGCGATAGC-1,Monocytes +ENT_TGTTCCGCACCAGGCT-1,Monocytes +ENT_TGTTCCGTCACTTATC-1,Monocytes +ENT_TGTTCCGTCCTCTAGC-1,Monocytes +ENT_TGTTCCGTCGGCGGTT-1,Monocytes +ENT_TTAACTCAGCTAGGCA-1,Monocytes +ENT_TTAACTCAGTGGTAAT-1,Dendritic cells +ENT_TTAACTCCAAGCGCTC-1,Granulocytes +ENT_TTAACTCCAGCTCGAC-1,Monocytes +ENT_TTAACTCGTAGCGCTC-1,Monocytes +ENT_TTAACTCTCCACGTGG-1,Monocytes +ENT_TTAGGACAGAAACCTA-1,Monocytes +ENT_TTAGGACAGATCGGGT-1,Dendritic cells +ENT_TTAGGACAGCACAGGT-1,Granulocytes +ENT_TTAGGACAGTTAACGA-1,Monocytes +ENT_TTAGGACCAGACACTT-1,Monocytes +ENT_TTAGGACGTCAGAATA-1,Monocytes +ENT_TTAGGACGTCAGCTAT-1,Monocytes +ENT_TTAGGCAAGACCACGA-1,Dendritic cells +ENT_TTAGGCAAGTCGTACT-1,Monocytes +ENT_TTAGGCAAGTGCCATT-1,Monocytes +ENT_TTAGGCAGTATGCTTG-1,Dendritic cells +ENT_TTAGGCAGTGGTACAG-1,Monocytes +ENT_TTAGGCATCCGCTGTT-1,Monocytes +ENT_TTAGGCATCTGTCCGT-1,Monocytes +ENT_TTAGTTCAGCACCGCT-1,Monocytes +ENT_TTAGTTCAGCGTCAAG-1,Dendritic cells +ENT_TTAGTTCAGGGCATGT-1,Monocytes +ENT_TTAGTTCCAAGACGTG-1,Granulocytes +ENT_TTAGTTCCAGACGCTC-1,Monocytes +ENT_TTAGTTCCATTCGACA-1,Monocytes +ENT_TTAGTTCTCGGATGGA-1,Monocytes +ENT_TTAGTTCTCTGGTATG-1,Monocytes +ENT_TTATGCTAGGTGATTA-1,Monocytes +ENT_TTATGCTAGTGTACTC-1,Monocytes +ENT_TTATGCTCACATTTCT-1,Monocytes +ENT_TTATGCTCAGCTCGAC-1,Granulocytes +ENT_TTATGCTGTCTGGAGA-1,Monocytes +ENT_TTATGCTGTTCAGGCC-1,Macrophages +ENT_TTATGCTTCTTCATGT-1,Monocytes +ENT_TTCCCAGAGTGTGAAT-1,Monocytes +ENT_TTCCCAGGTATATGGA-1,Monocytes +ENT_TTCCCAGGTCTCTTAT-1,Granulocytes +ENT_TTCCCAGTCTGAAAGA-1,Monocytes +ENT_TTCCCAGTCTTAACCT-1,Monocytes +ENT_TTCGAAGAGCGGCTTC-1,Monocytes +ENT_TTCGAAGAGTGGAGAA-1,Dendritic cells +ENT_TTCGAAGCAATCCGAT-1,Monocytes +ENT_TTCGGTCAGAGTAAGG-1,Monocytes +ENT_TTCGGTCGTGTATGGG-1,Monocytes +ENT_TTCGGTCTCAACGCTA-1,Monocytes +ENT_TTCTACACAAGACGTG-1,Macrophages +ENT_TTCTACACACACCGCA-1,Monocytes +ENT_TTCTACACATGATCCA-1,Macrophages +ENT_TTCTACAGTAGAGCTG-1,Monocytes +ENT_TTCTCAAAGCTCCTCT-1,T cells +ENT_TTCTCAAGTATTCTCT-1,Monocytes +ENT_TTCTCAATCAGCCTAA-1,Dendritic cells +ENT_TTCTCCTAGAAACCGC-1,Dendritic cells +ENT_TTCTCCTAGCTTTGGT-1,Dendritic cells +ENT_TTCTCCTGTCAATGTC-1,Granulocytes +ENT_TTCTCCTTCTCTAGGA-1,Granulocytes +ENT_TTCTTAGAGACAAAGG-1,Monocytes +ENT_TTCTTAGCAAGAGGCT-1,Monocytes +ENT_TTCTTAGCAGCCTTGG-1,Monocytes +ENT_TTGAACGCATTCTTAC-1,Monocytes +ENT_TTGAACGGTAAGAGGA-1,Monocytes +ENT_TTGAACGTCCCATTAT-1,Monocytes +ENT_TTGAACGTCCGGGTGT-1,Monocytes +ENT_TTGACTTAGGACGAAA-1,Macrophages +ENT_TTGACTTCATATGGTC-1,Monocytes +ENT_TTGACTTCATCCAACA-1,Monocytes +ENT_TTGACTTGTTAAGAAC-1,Dendritic cells +ENT_TTGACTTGTTACGGAG-1,T cells +ENT_TTGACTTGTTACTGAC-1,Monocytes +ENT_TTGACTTTCTGTTTGT-1,Dendritic cells +ENT_TTGCCGTAGAGGGCTT-1,Monocytes +ENT_TTGCCGTCAGATCCAT-1,Monocytes +ENT_TTGCCGTGTACTTAGC-1,Macrophages +ENT_TTGCCGTTCTTTAGGG-1,Monocytes +ENT_TTGCGTCCAGATCCAT-1,Monocytes +ENT_TTGGAACGTGCAGTAG-1,Monocytes +ENT_TTGGAACGTGGTGTAG-1,Granulocytes +ENT_TTGGAACTCATTATCC-1,Monocytes +ENT_TTGGAACTCTAAGCCA-1,Granulocytes +ENT_TTGGCAACAATTCCTT-1,Monocytes +ENT_TTGGCAACACCAGGTC-1,Monocytes +ENT_TTGGCAAGTGTGCCTG-1,Monocytes +ENT_TTGGCAAGTTCAGGCC-1,Dendritic cells +ENT_TTGTAGGAGAAGATTC-1,Granulocytes +ENT_TTGTAGGAGCTGCAAG-1,Monocytes +ENT_TTGTAGGCACGGTGTC-1,Monocytes +ENT_TTGTAGGGTGAGCGAT-1,Monocytes +ENT_TTGTAGGGTTCCATGA-1,Monocytes +ENT_TTGTAGGTCGGTTAAC-1,Granulocytes +ENT_TTGTAGGTCTAACTCT-1,T cells +ENT_TTTACTGAGATCGGGT-1,Granulocytes +ENT_TTTACTGAGCTTTGGT-1,Monocytes +ENT_TTTACTGTCGCCCTTA-1,Granulocytes +ENT_TTTACTGTCGTAGGTT-1,Monocytes +ENT_TTTACTGTCTTATCTG-1,Monocytes +ENT_TTTACTGTCTTGCAAG-1,Monocytes +ENT_TTTATGCAGGTGATTA-1,Granulocytes +ENT_TTTATGCAGGTGGGTT-1,Granulocytes +ENT_TTTATGCCAACTGGCC-1,Monocytes +ENT_TTTATGCCAGGTCCAC-1,Monocytes +ENT_TTTATGCGTAAACCTC-1,Monocytes +ENT_TTTATGCGTGTTGAGG-1,Monocytes +ENT_TTTATGCTCCACGAAT-1,Granulocytes +ENT_TTTCCTCAGTCCCACG-1,Monocytes +ENT_TTTCCTCCAATAGCGG-1,Granulocytes +ENT_TTTCCTCGTGAAAGAG-1,Monocytes +ENT_TTTCCTCTCTAAGCCA-1,Monocytes +ENT_TTTCCTCTCTATCCCG-1,Monocytes +ENT_TTTGCGCAGACCTAGG-1,Monocytes +ENT_TTTGCGCAGCTAACTC-1,Dendritic cells +ENT_TTTGCGCAGTGCAAGC-1,Monocytes +ENT_TTTGCGCAGTTCCACA-1,Monocytes +ENT_TTTGCGCGTCAACTGT-1,Granulocytes +ENT_TTTGGTTAGACTAGAT-1,Monocytes +ENT_TTTGGTTAGTGCTGCC-1,Monocytes +ENT_TTTGGTTTCTATCCTA-1,Dendritic cells +ENT_TTTGGTTTCTCTGCTG-1,Monocytes +ENT_TTTGTCAAGCGTGTCC-1,Monocytes +ENT_TTTGTCAAGTCCAGGA-1,Granulocytes +ENT_TTTGTCACATCGTCGG-1,Dendritic cells +ENT_TTTGTCATCAACGAAA-1,Monocytes +ENT_TTTGTCATCCTTGCCA-1,Monocytes +NHSIL12_AAACCTGAGGCTAGAC-1,Monocytes +NHSIL12_AAACCTGTCCCAACGG-1,Monocytes +NHSIL12_AAACGGGAGTCGATAA-1,Monocytes +NHSIL12_AAACGGGCACCATGTA-1,Granulocytes +NHSIL12_AAACGGGCACTTCGAA-1,Monocytes +NHSIL12_AAACGGGCATCGACGC-1,Monocytes +NHSIL12_AAAGATGAGGATGGAA-1,Monocytes +NHSIL12_AAAGATGAGGGAACGG-1,Macrophages +NHSIL12_AAAGATGCAGGATCGA-1,Monocytes +NHSIL12_AAAGATGGTGATGTGG-1,Macrophages +NHSIL12_AAAGATGTCTAGCACA-1,Monocytes +NHSIL12_AAAGCAAGTCATCCCT-1,Monocytes +NHSIL12_AAAGTAGGTGCTTCTC-1,Monocytes +NHSIL12_AAAGTAGTCCGCAAGC-1,Monocytes +NHSIL12_AAAGTAGTCTGATTCT-1,Monocytes +NHSIL12_AAATGCCCAAGCGTAG-1,Fibroblasts +NHSIL12_AAATGCCCATATGGTC-1,Monocytes +NHSIL12_AAATGCCGTAGAAGGA-1,Monocytes +NHSIL12_AACACGTAGATACACA-1,Monocytes +NHSIL12_AACACGTTCAACACTG-1,Granulocytes +NHSIL12_AACCATGAGCGATCCC-1,Granulocytes +NHSIL12_AACCATGAGGTGACCA-1,Granulocytes +NHSIL12_AACCATGCACTAAGTC-1,Monocytes +NHSIL12_AACCATGGTCTCAACA-1,Monocytes +NHSIL12_AACCATGGTTTCCACC-1,Dendritic cells +NHSIL12_AACCGCGTCATCTGTT-1,Granulocytes +NHSIL12_AACGTTGCACTTGGAT-1,Monocytes +NHSIL12_AACGTTGCATGCCTTC-1,Monocytes +NHSIL12_AACGTTGGTTCGGCAC-1,Monocytes +NHSIL12_AACTCAGAGCCGATTT-1,Granulocytes +NHSIL12_AACTCAGTCACATGCA-1,Macrophages +NHSIL12_AACTCCCAGAGGTTGC-1,Monocytes +NHSIL12_AACTCCCGTTGACGTT-1,Monocytes +NHSIL12_AACTCTTGTTAAGTAG-1,Monocytes +NHSIL12_AACTGGTAGAGACTTA-1,Monocytes +NHSIL12_AACTGGTTCCGTACAA-1,Monocytes +NHSIL12_AACTTTCAGGTGTGGT-1,Monocytes +NHSIL12_AAGACCTGTCTGATTG-1,Macrophages +NHSIL12_AAGCCGCTCCACTGGG-1,Monocytes +NHSIL12_AAGGAGCAGTCCCACG-1,Granulocytes +NHSIL12_AAGGAGCAGTTTAGGA-1,Monocytes +NHSIL12_AAGGAGCGTCTGCCAG-1,Monocytes +NHSIL12_AAGGAGCTCCAAAGTC-1,Monocytes +NHSIL12_AAGGCAGCATGTAGTC-1,Monocytes +NHSIL12_AAGTCTGAGGGAAACA-1,Dendritic cells +NHSIL12_AAGTCTGAGTGGTAGC-1,T cells +NHSIL12_AAGTCTGGTTCAGACT-1,Monocytes +NHSIL12_AAGTCTGTCCTTGGTC-1,Granulocytes +NHSIL12_AATCCAGAGAGCTATA-1,Monocytes +NHSIL12_AATCCAGAGTACGATA-1,Macrophages +NHSIL12_AATCCAGAGTTAAGTG-1,Monocytes +NHSIL12_AATCCAGGTATCAGTC-1,Monocytes +NHSIL12_AATCCAGGTCACCCAG-1,Monocytes +NHSIL12_AATCGGTGTCTCACCT-1,Macrophages +NHSIL12_AATCGGTGTGGAAAGA-1,Dendritic cells +NHSIL12_AATCGGTGTGGTCCGT-1,Monocytes +NHSIL12_AATCGGTTCTAACTCT-1,Monocytes +NHSIL12_AATCGGTTCTGTCTCG-1,Monocytes +NHSIL12_ACACCAAAGGCTAGAC-1,Monocytes +NHSIL12_ACACCAAGTAGAAGGA-1,Dendritic cells +NHSIL12_ACACCCTCAAGGACTG-1,Monocytes +NHSIL12_ACACCCTGTGGTCTCG-1,Monocytes +NHSIL12_ACACCCTGTGTTCTTT-1,Monocytes +NHSIL12_ACACCCTTCTCACATT-1,Monocytes +NHSIL12_ACACCGGCATGGTTGT-1,Monocytes +NHSIL12_ACACCGGGTTCCATGA-1,Monocytes +NHSIL12_ACACCGGTCATCACCC-1,Monocytes +NHSIL12_ACACTGAAGCAGCCTC-1,Monocytes +NHSIL12_ACACTGAGTCAGGACA-1,Monocytes +NHSIL12_ACACTGAGTCGAACAG-1,Monocytes +NHSIL12_ACACTGATCATTCACT-1,Dendritic cells +NHSIL12_ACACTGATCTGCTGTC-1,NK cells +NHSIL12_ACAGCCGAGATATGCA-1,Monocytes +NHSIL12_ACAGCCGAGCTTATCG-1,Monocytes +NHSIL12_ACAGCCGTCTTTACAC-1,Macrophages +NHSIL12_ACAGCTATCACGACTA-1,Monocytes +NHSIL12_ACATACGAGGAGTACC-1,Dendritic cells +NHSIL12_ACATGGTCAAGTTGTC-1,Monocytes +NHSIL12_ACATGGTGTAAATGAC-1,Granulocytes +NHSIL12_ACATGGTGTCAGTGGA-1,Monocytes +NHSIL12_ACATGGTGTCGGCATC-1,Dendritic cells +NHSIL12_ACCAGTAGTGCGGTAA-1,Monocytes +NHSIL12_ACCAGTATCGGCGGTT-1,Monocytes +NHSIL12_ACCCACTAGACTGTAA-1,Monocytes +NHSIL12_ACCCACTAGGTGTTAA-1,Granulocytes +NHSIL12_ACCCACTAGTGGACGT-1,Dendritic cells +NHSIL12_ACCCACTCAGATCCAT-1,Monocytes +NHSIL12_ACCCACTCATGACGGA-1,Monocytes +NHSIL12_ACCCACTGTTAAGTAG-1,Monocytes +NHSIL12_ACCCACTTCATGCTCC-1,Monocytes +NHSIL12_ACCGTAAGTATTCTCT-1,Monocytes +NHSIL12_ACCGTAAGTCTTGATG-1,Macrophages +NHSIL12_ACCTTTAAGCTGAAAT-1,T cells +NHSIL12_ACCTTTAGTCAGAGGT-1,T cells +NHSIL12_ACCTTTAGTTTGTTTC-1,Monocytes +NHSIL12_ACCTTTATCGCATGGC-1,Dendritic cells +NHSIL12_ACCTTTATCTTACCTA-1,Monocytes +NHSIL12_ACGAGCCGTTATGCGT-1,Monocytes +NHSIL12_ACGAGGAGTCTACCTC-1,Monocytes +NHSIL12_ACGAGGATCCGCAGTG-1,Monocytes +NHSIL12_ACGATACAGGCAAAGA-1,Monocytes +NHSIL12_ACGATACAGTACTTGC-1,Macrophages +NHSIL12_ACGATGTGTAAACGCG-1,Monocytes +NHSIL12_ACGATGTGTATAGGGC-1,Monocytes +NHSIL12_ACGCAGCGTCAAACTC-1,Dendritic cells +NHSIL12_ACGCCAGGTCCCTACT-1,Monocytes +NHSIL12_ACGCCAGTCGGTGTTA-1,Monocytes +NHSIL12_ACGGAGACACAGCGTC-1,Monocytes +NHSIL12_ACGGAGACATCCCACT-1,Monocytes +NHSIL12_ACGGAGATCTACCAGA-1,Dendritic cells +NHSIL12_ACGGCCAAGTCGTTTG-1,Macrophages +NHSIL12_ACGGCCAGTAAAGGAG-1,Monocytes +NHSIL12_ACGGGCTAGGGATACC-1,Granulocytes +NHSIL12_ACGGGCTCAGTATGCT-1,Monocytes +NHSIL12_ACGGGCTCATGCCACG-1,Monocytes +NHSIL12_ACGGGCTGTCCCGACA-1,Monocytes +NHSIL12_ACGGGCTTCCATTCTA-1,Monocytes +NHSIL12_ACGGGTCGTGCTGTAT-1,Monocytes +NHSIL12_ACGTCAAAGGCATGTG-1,Monocytes +NHSIL12_ACGTCAACAACGATGG-1,Dendritic cells +NHSIL12_ACGTCAAGTATTCGTG-1,Monocytes +NHSIL12_ACGTCAAGTTCAGGCC-1,Monocytes +NHSIL12_ACTATCTAGATCCGAG-1,Monocytes +NHSIL12_ACTATCTCAATGACCT-1,Monocytes +NHSIL12_ACTATCTCACGAAACG-1,Monocytes +NHSIL12_ACTATCTCACGACGAA-1,Monocytes +NHSIL12_ACTATCTGTGCCTGTG-1,Monocytes +NHSIL12_ACTGAACAGTATGACA-1,Monocytes +NHSIL12_ACTGAACGTGCTTCTC-1,Macrophages +NHSIL12_ACTGAACTCCCAACGG-1,Granulocytes +NHSIL12_ACTGAGTAGTACCGGA-1,Dendritic cells +NHSIL12_ACTGATGAGAGACTAT-1,Monocytes +NHSIL12_ACTGATGAGAGTACAT-1,Dendritic cells +NHSIL12_ACTGATGCAGGGATTG-1,Monocytes +NHSIL12_ACTGATGGTAAGGGAA-1,Monocytes +NHSIL12_ACTGCTCCAGCATACT-1,Monocytes +NHSIL12_ACTGCTCTCAGCGATT-1,Monocytes +NHSIL12_ACTGTCCGTAGTAGTA-1,Monocytes +NHSIL12_ACTGTCCGTTACGGAG-1,Monocytes +NHSIL12_ACTTACTCAGCGTCCA-1,Monocytes +NHSIL12_ACTTACTGTGGCGAAT-1,Monocytes +NHSIL12_ACTTACTTCTTTAGGG-1,Monocytes +NHSIL12_ACTTGTTAGATATACG-1,Monocytes +NHSIL12_ACTTGTTAGCGTTCCG-1,Monocytes +NHSIL12_ACTTGTTGTATGGTTC-1,Monocytes +NHSIL12_ACTTGTTGTTAAGACA-1,Monocytes +NHSIL12_ACTTTCAAGATATGCA-1,Granulocytes +NHSIL12_ACTTTCAAGCAGCCTC-1,Monocytes +NHSIL12_ACTTTCACATTACCTT-1,Monocytes +NHSIL12_ACTTTCATCACAGGCC-1,Monocytes +NHSIL12_AGAATAGAGCCACCTG-1,Monocytes +NHSIL12_AGAATAGAGGATATAC-1,Monocytes +NHSIL12_AGAATAGGTAATTGGA-1,Monocytes +NHSIL12_AGAATAGGTCCATCCT-1,Monocytes +NHSIL12_AGAATAGGTTACGGAG-1,Dendritic cells +NHSIL12_AGACGTTCATGTCGAT-1,Monocytes +NHSIL12_AGAGCGAAGTGTACGG-1,Monocytes +NHSIL12_AGAGCGAGTGGTACAG-1,Monocytes +NHSIL12_AGAGCGATCTAGCACA-1,Monocytes +NHSIL12_AGAGCTTCACGGTAAG-1,Monocytes +NHSIL12_AGAGTGGCATGTCTCC-1,Monocytes +NHSIL12_AGATCTGCACTGCCAG-1,Macrophages +NHSIL12_AGATCTGCATAGAAAC-1,Granulocytes +NHSIL12_AGATCTGTCCGGGTGT-1,Monocytes +NHSIL12_AGATCTGTCCGTTGCT-1,Monocytes +NHSIL12_AGATCTGTCGCCAAAT-1,Dendritic cells +NHSIL12_AGATTGCGTCAATACC-1,Monocytes +NHSIL12_AGATTGCTCGCGTTTC-1,Monocytes +NHSIL12_AGATTGCTCGGATGTT-1,Monocytes +NHSIL12_AGCAGCCAGACGCAAC-1,Monocytes +NHSIL12_AGCAGCCCAAGGCTCC-1,Granulocytes +NHSIL12_AGCATACGTAGCCTAT-1,Granulocytes +NHSIL12_AGCCTAAGTACCAGTT-1,Granulocytes +NHSIL12_AGCCTAAGTATAAACG-1,Monocytes +NHSIL12_AGCCTAAGTCTGCCAG-1,Monocytes +NHSIL12_AGCGGTCGTGGTCCGT-1,Monocytes +NHSIL12_AGCGTATAGCCGATTT-1,Monocytes +NHSIL12_AGCGTATGTTACGCGC-1,Granulocytes +NHSIL12_AGCGTATTCGGCGCAT-1,Monocytes +NHSIL12_AGCGTCGGTTCGCTAA-1,Monocytes +NHSIL12_AGCGTCGTCCTCAATT-1,Monocytes +NHSIL12_AGCTCCTCAAGTAATG-1,Dendritic cells +NHSIL12_AGCTCCTTCATGCAAC-1,Monocytes +NHSIL12_AGCTCTCCACGAAACG-1,T cells +NHSIL12_AGCTCTCCATGCTAGT-1,Monocytes +NHSIL12_AGCTTGATCCACGAAT-1,Monocytes +NHSIL12_AGGCCACAGAGCTGCA-1,Macrophages +NHSIL12_AGGCCACAGTCAAGCG-1,Monocytes +NHSIL12_AGGCCACCACTCAGGC-1,Macrophages +NHSIL12_AGGCCGTAGGGATGGG-1,Dendritic cells +NHSIL12_AGGCCGTAGTACGACG-1,Monocytes +NHSIL12_AGGCCGTAGTTTCCTT-1,Monocytes +NHSIL12_AGGGAGTAGTTAGCGG-1,Granulocytes +NHSIL12_AGGGAGTCACGCATCG-1,Monocytes +NHSIL12_AGGGAGTTCACCACCT-1,Monocytes +NHSIL12_AGGGAGTTCTGAAAGA-1,Monocytes +NHSIL12_AGGGAGTTCTGTCTAT-1,Macrophages +NHSIL12_AGGGATGAGGTGTGGT-1,Monocytes +NHSIL12_AGGGATGAGTGCCAGA-1,Monocytes +NHSIL12_AGGGTGACATGAGCGA-1,Monocytes +NHSIL12_AGGGTGAGTCAGCTAT-1,Monocytes +NHSIL12_AGGTCATAGTGTCCCG-1,Monocytes +NHSIL12_AGGTCATCACATCCGG-1,Monocytes +NHSIL12_AGGTCATCAGACGCCT-1,Macrophages +NHSIL12_AGGTCCGCACAGCCCA-1,Macrophages +NHSIL12_AGTAGTCAGCAACGGT-1,Monocytes +NHSIL12_AGTAGTCAGTACGCCC-1,Monocytes +NHSIL12_AGTAGTCCACGCCAGT-1,Monocytes +NHSIL12_AGTAGTCGTTCGTTGA-1,Monocytes +NHSIL12_AGTCTTTAGTGACTCT-1,Monocytes +NHSIL12_AGTCTTTCAGGACGTA-1,Monocytes +NHSIL12_AGTCTTTCAGGTGCCT-1,Monocytes +NHSIL12_AGTCTTTGTGTCAATC-1,Monocytes +NHSIL12_AGTCTTTTCGGTGTCG-1,Monocytes +NHSIL12_AGTGAGGAGCCACTAT-1,Dendritic cells +NHSIL12_AGTGAGGAGCCTATGT-1,Monocytes +NHSIL12_AGTGAGGTCATCATTC-1,T cells +NHSIL12_AGTGGGATCCTATTCA-1,Monocytes +NHSIL12_AGTGTCACAGTCACTA-1,Monocytes +NHSIL12_AGTGTCAGTATAGTAG-1,Macrophages +NHSIL12_AGTGTCAGTTGAACTC-1,Monocytes +NHSIL12_AGTGTCATCATGGTCA-1,Monocytes +NHSIL12_AGTTGGTAGCCGGTAA-1,Macrophages +NHSIL12_AGTTGGTAGGAGCGTT-1,Monocytes +NHSIL12_AGTTGGTTCCGCATCT-1,Granulocytes +NHSIL12_ATAACGCAGCTGCAAG-1,Monocytes +NHSIL12_ATAACGCGTCACCCAG-1,Granulocytes +NHSIL12_ATAAGAGAGATGCGAC-1,Monocytes +NHSIL12_ATAAGAGAGTTGAGAT-1,Monocytes +NHSIL12_ATAAGAGGTCGAGATG-1,Monocytes +NHSIL12_ATAAGAGGTTAAAGTG-1,Monocytes +NHSIL12_ATAAGAGTCTGGAGCC-1,Monocytes +NHSIL12_ATAGACCCATGTAGTC-1,Dendritic cells +NHSIL12_ATAGACCGTCTGCGGT-1,Monocytes +NHSIL12_ATCACGAGTCATTAGC-1,Dendritic cells +NHSIL12_ATCACGAGTTCTGGTA-1,Monocytes +NHSIL12_ATCATCTCACAGGTTT-1,Monocytes +NHSIL12_ATCATCTCATTCTCAT-1,Monocytes +NHSIL12_ATCATCTGTAAGAGGA-1,Monocytes +NHSIL12_ATCATCTGTCAAAGAT-1,Monocytes +NHSIL12_ATCATGGCATGCCTTC-1,Monocytes +NHSIL12_ATCATGGTCCGAATGT-1,Monocytes +NHSIL12_ATCCACCCAATCAGAA-1,Monocytes +NHSIL12_ATCCACCCATTTGCTT-1,Monocytes +NHSIL12_ATCCACCGTGTATGGG-1,Monocytes +NHSIL12_ATCCACCTCTGTTTGT-1,Monocytes +NHSIL12_ATCCGAAAGCAACGGT-1,Monocytes +NHSIL12_ATCCGAACAGCATACT-1,Monocytes +NHSIL12_ATCCGAAGTCTTCTCG-1,Monocytes +NHSIL12_ATCCGAAGTGGGTATG-1,Dendritic cells +NHSIL12_ATCCGAATCAACCATG-1,Monocytes +NHSIL12_ATCCGAATCCAGAGGA-1,Dendritic cells +NHSIL12_ATCCGAATCTTGTACT-1,Monocytes +NHSIL12_ATCGAGTGTCCGCTGA-1,Monocytes +NHSIL12_ATGAGGGAGAGGTACC-1,Macrophages +NHSIL12_ATGAGGGGTACGCACC-1,Monocytes +NHSIL12_ATGAGGGGTACTTAGC-1,Dendritic cells +NHSIL12_ATGAGGGTCCTATGTT-1,Monocytes +NHSIL12_ATGCGATCATCGGTTA-1,Dendritic cells +NHSIL12_ATGCGATGTCTTGATG-1,Monocytes +NHSIL12_ATGGGAGAGGAATCGC-1,Granulocytes +NHSIL12_ATGGGAGTCAAACCGT-1,Macrophages +NHSIL12_ATGGGAGTCTGCGACG-1,Monocytes +NHSIL12_ATGTGTGCAATGTTGC-1,Monocytes +NHSIL12_ATGTGTGCACCGAATT-1,Dendritic cells +NHSIL12_ATTACTCAGCGTTGCC-1,Monocytes +NHSIL12_ATTACTCAGCTGATAA-1,Dendritic cells +NHSIL12_ATTACTCCATGCCCGA-1,Dendritic cells +NHSIL12_ATTACTCCATTTCAGG-1,Monocytes +NHSIL12_ATTACTCGTTGCGTTA-1,Granulocytes +NHSIL12_ATTATCCAGCACCGCT-1,Macrophages +NHSIL12_ATTATCCCAATAGCAA-1,Monocytes +NHSIL12_ATTATCCGTCAAAGAT-1,Dendritic cells +NHSIL12_ATTATCCTCCTATGTT-1,Dendritic cells +NHSIL12_ATTCTACCATGCAATC-1,Monocytes +NHSIL12_ATTCTACGTGGGTCAA-1,Monocytes +NHSIL12_ATTCTACGTGTTCTTT-1,Monocytes +NHSIL12_ATTCTACTCCTGCTTG-1,Monocytes +NHSIL12_ATTCTACTCCTTGGTC-1,Monocytes +NHSIL12_ATTGGACCACATCTTT-1,Granulocytes +NHSIL12_ATTGGACTCGGATGTT-1,Dendritic cells +NHSIL12_ATTGGACTCTTGCAAG-1,Monocytes +NHSIL12_ATTGGTGAGCCGGTAA-1,Monocytes +NHSIL12_ATTGGTGCACTGTCGG-1,Monocytes +NHSIL12_ATTGGTGGTGTAATGA-1,NK cells +NHSIL12_ATTTCTGAGAGTGAGA-1,Dendritic cells +NHSIL12_ATTTCTGGTTTCCACC-1,Dendritic cells +NHSIL12_CAACCAAAGGAGTAGA-1,Monocytes +NHSIL12_CAACCAACAAGCCTAT-1,Monocytes +NHSIL12_CAACCAAGTCAACATC-1,Monocytes +NHSIL12_CAACCTCAGCGGCTTC-1,Monocytes +NHSIL12_CAACCTCCATATGAGA-1,Monocytes +NHSIL12_CAACCTCGTAACGCGA-1,Monocytes +NHSIL12_CAACTAGAGACACGAC-1,Monocytes +NHSIL12_CAACTAGAGGTGCAAC-1,Macrophages +NHSIL12_CAAGAAACATTAGCCA-1,Dendritic cells +NHSIL12_CAAGATCAGATTACCC-1,Monocytes +NHSIL12_CAAGATCAGGTAAACT-1,Monocytes +NHSIL12_CAAGATCCAGATGGCA-1,Monocytes +NHSIL12_CAAGATCCAGGCAGTA-1,Monocytes +NHSIL12_CAAGGCCAGTAGGTGC-1,T cells +NHSIL12_CAAGGCCAGTCCAGGA-1,Monocytes +NHSIL12_CAAGGCCCAAGTTCTG-1,Monocytes +NHSIL12_CAAGGCCCATCGGAAG-1,Monocytes +NHSIL12_CAAGTTGCAGACACTT-1,Monocytes +NHSIL12_CAAGTTGCAGACGTAG-1,Monocytes +NHSIL12_CAAGTTGTCATTGCGA-1,Monocytes +NHSIL12_CACAAACAGGAACTGC-1,Monocytes +NHSIL12_CACAAACAGGTTACCT-1,Macrophages +NHSIL12_CACAAACCACTACAGT-1,Dendritic cells +NHSIL12_CACACAACAATAACGA-1,Macrophages +NHSIL12_CACACAAGTTCAGGCC-1,Monocytes +NHSIL12_CACACCTAGGGCTCTC-1,Monocytes +NHSIL12_CACACCTGTTGGTAAA-1,Dendritic cells +NHSIL12_CACACTCGTCCCTTGT-1,Dendritic cells +NHSIL12_CACAGGCGTAGGCTGA-1,Monocytes +NHSIL12_CACAGGCGTGGTACAG-1,Monocytes +NHSIL12_CACAGGCGTTACGGAG-1,Monocytes +NHSIL12_CACAGGCTCAAACCGT-1,Monocytes +NHSIL12_CACAGGCTCTCCAGGG-1,Monocytes +NHSIL12_CACAGTAAGAACAATC-1,Monocytes +NHSIL12_CACATAGAGAGTCTGG-1,Monocytes +NHSIL12_CACATAGCAGTTCCCT-1,Monocytes +NHSIL12_CACATAGGTAAGTGGC-1,Monocytes +NHSIL12_CACATAGGTCGGGTCT-1,Monocytes +NHSIL12_CACATTTGTTTGACAC-1,Monocytes +NHSIL12_CACCACTAGGTGCTAG-1,Monocytes +NHSIL12_CACCACTAGTTGAGTA-1,Macrophages +NHSIL12_CACCACTTCAGTTTGG-1,Monocytes +NHSIL12_CACCAGGAGAGACTTA-1,T cells +NHSIL12_CACCAGGCATGCATGT-1,Monocytes +NHSIL12_CACCAGGCATTTGCTT-1,Monocytes +NHSIL12_CACCAGGGTAAGTAGT-1,T cells +NHSIL12_CACCAGGGTTCAGACT-1,Monocytes +NHSIL12_CACCTTGAGGCAAAGA-1,Granulocytes +NHSIL12_CACCTTGGTCATATCG-1,Dendritic cells +NHSIL12_CACCTTGGTTGTTTGG-1,Granulocytes +NHSIL12_CACCTTGTCACTCCTG-1,Monocytes +NHSIL12_CACCTTGTCGACCAGC-1,Monocytes +NHSIL12_CACTCCAGTCGCGGTT-1,Monocytes +NHSIL12_CACTCCAGTTCCCGAG-1,Granulocytes +NHSIL12_CAGAATCAGATGCCTT-1,Monocytes +NHSIL12_CAGATCAAGCCCAACC-1,Monocytes +NHSIL12_CAGATCAGTCCCTTGT-1,Monocytes +NHSIL12_CAGATCATCGCTGATA-1,Macrophages +NHSIL12_CAGCAGCAGAAGGGTA-1,T cells +NHSIL12_CAGCAGCGTGCACGAA-1,Monocytes +NHSIL12_CAGCAGCTCTCCAACC-1,Granulocytes +NHSIL12_CAGCATAAGAGGTAGA-1,Dendritic cells +NHSIL12_CAGCATAAGATATGGT-1,Dendritic cells +NHSIL12_CAGCATAAGCGAAGGG-1,Monocytes +NHSIL12_CAGCATAAGGTGCTTT-1,Monocytes +NHSIL12_CAGCATACAACAACCT-1,Macrophages +NHSIL12_CAGCCGAGTACCAGTT-1,Monocytes +NHSIL12_CAGCCGAGTTGTGGAG-1,Granulocytes +NHSIL12_CAGCGACTCCACTGGG-1,Monocytes +NHSIL12_CAGCGACTCCCAGGTG-1,Monocytes +NHSIL12_CAGCTGGAGCTAGTCT-1,Dendritic cells +NHSIL12_CAGCTGGAGTAGCCGA-1,Monocytes +NHSIL12_CAGCTGGGTAACGTTC-1,Dendritic cells +NHSIL12_CAGCTGGGTCCGTCAG-1,Monocytes +NHSIL12_CAGGTGCGTCATCCCT-1,Dendritic cells +NHSIL12_CAGTAACAGTGTTAGA-1,Monocytes +NHSIL12_CAGTAACTCAGCTGGC-1,Monocytes +NHSIL12_CAGTAACTCCCATTTA-1,Monocytes +NHSIL12_CAGTAACTCGGAGCAA-1,Monocytes +NHSIL12_CAGTCCTAGGGCACTA-1,Monocytes +NHSIL12_CAGTCCTAGGTGTTAA-1,Dendritic cells +NHSIL12_CAGTCCTCAAGTTGTC-1,Monocytes +NHSIL12_CATATGGGTAAATGTG-1,Monocytes +NHSIL12_CATATGGGTTACTGAC-1,Monocytes +NHSIL12_CATATGGTCACTTCAT-1,Monocytes +NHSIL12_CATATGGTCCAAGCCG-1,Monocytes +NHSIL12_CATCAAGAGAAAGTGG-1,Monocytes +NHSIL12_CATCAGAAGGCCGAAT-1,Monocytes +NHSIL12_CATCAGAAGTTAAGTG-1,Monocytes +NHSIL12_CATCAGACAGATAATG-1,Monocytes +NHSIL12_CATCAGAGTCTCGTTC-1,T cells +NHSIL12_CATCCACAGCGTAATA-1,Monocytes +NHSIL12_CATCCACCAGCTCGAC-1,Dendritic cells +NHSIL12_CATCGAACACTACAGT-1,Granulocytes +NHSIL12_CATCGAATCGTGGTCG-1,Monocytes +NHSIL12_CATCGGGAGCCAGTTT-1,Monocytes +NHSIL12_CATCGGGTCATGCTCC-1,Monocytes +NHSIL12_CATCGGGTCCAAGCCG-1,Granulocytes +NHSIL12_CATGACAAGGTGCACA-1,Dendritic cells +NHSIL12_CATGACAGTATATCCG-1,Monocytes +NHSIL12_CATGCCTGTATTCGTG-1,T cells +NHSIL12_CATGGCGCAACTGGCC-1,Monocytes +NHSIL12_CATGGCGCATACGCTA-1,Monocytes +NHSIL12_CATGGCGGTCTCGTTC-1,Monocytes +NHSIL12_CATTATCAGTTACGGG-1,Monocytes +NHSIL12_CATTATCTCTAACTTC-1,Dendritic cells +NHSIL12_CATTCGCAGACAGAGA-1,Monocytes +NHSIL12_CATTCGCAGATCTGAA-1,Monocytes +NHSIL12_CATTCGCAGGTAGCTG-1,Monocytes +NHSIL12_CATTCGCCAAATACAG-1,Monocytes +NHSIL12_CATTCGCCAAGAGTCG-1,Monocytes +NHSIL12_CATTCGCCATTGGCGC-1,Monocytes +NHSIL12_CATTCGCGTCCCTTGT-1,Monocytes +NHSIL12_CATTCGCGTGTCCTCT-1,Monocytes +NHSIL12_CATTCGCTCAGTTCGA-1,Monocytes +NHSIL12_CCAATCCAGTACGCGA-1,Monocytes +NHSIL12_CCAATCCAGTCGTACT-1,Monocytes +NHSIL12_CCAATCCGTGGTCCGT-1,Monocytes +NHSIL12_CCACCTACACCGAAAG-1,Monocytes +NHSIL12_CCACGGAAGCCTATGT-1,T cells +NHSIL12_CCACGGACATCACCCT-1,Monocytes +NHSIL12_CCACTACAGGATGTAT-1,Monocytes +NHSIL12_CCACTACGTTAGAACA-1,Monocytes +NHSIL12_CCAGCGAAGAAGGACA-1,Dendritic cells +NHSIL12_CCAGCGACAGACGCAA-1,Monocytes +NHSIL12_CCATGTCTCATCATTC-1,Granulocytes +NHSIL12_CCATTCGAGCCCGAAA-1,Dendritic cells +NHSIL12_CCCAATCAGCTAGGCA-1,Monocytes +NHSIL12_CCCAATCTCCAAGCCG-1,Granulocytes +NHSIL12_CCCAGTTAGCTGCAAG-1,Monocytes +NHSIL12_CCCAGTTCAAACGCGA-1,Monocytes +NHSIL12_CCCATACGTAAATGTG-1,Monocytes +NHSIL12_CCCATACGTACCATCA-1,Monocytes +NHSIL12_CCCTCCTAGGCCCGTT-1,Monocytes +NHSIL12_CCCTCCTGTAACGCGA-1,T cells +NHSIL12_CCCTCCTGTCTCCACT-1,Monocytes +NHSIL12_CCGGGATAGACTTGAA-1,Macrophages +NHSIL12_CCGGGATAGCGACGTA-1,Monocytes +NHSIL12_CCGGGATCAAGGACAC-1,Monocytes +NHSIL12_CCGGGATCACCAGGCT-1,Monocytes +NHSIL12_CCGGGATCAGCTGTAT-1,Granulocytes +NHSIL12_CCGTACTAGTCCTCCT-1,Monocytes +NHSIL12_CCGTGGATCATGCTCC-1,Monocytes +NHSIL12_CCGTGGATCTGAGGGA-1,Dendritic cells +NHSIL12_CCGTGGATCTGGTGTA-1,Macrophages +NHSIL12_CCGTTCACACCCAGTG-1,Monocytes +NHSIL12_CCGTTCACATGCCCGA-1,Monocytes +NHSIL12_CCTAAAGAGACTTGAA-1,Monocytes +NHSIL12_CCTAAAGAGAGTAAGG-1,Monocytes +NHSIL12_CCTAAAGAGTTAAGTG-1,Monocytes +NHSIL12_CCTACACCAATCTGCA-1,Monocytes +NHSIL12_CCTACACCACAGGTTT-1,Monocytes +NHSIL12_CCTACCACACAAGCCC-1,Dendritic cells +NHSIL12_CCTAGCTAGTGCCAGA-1,Monocytes +NHSIL12_CCTAGCTCATCAGTCA-1,Monocytes +NHSIL12_CCTATTAGTTGACGTT-1,Monocytes +NHSIL12_CCTCAGTAGTCCGGTC-1,Macrophages +NHSIL12_CCTCAGTCACCCTATC-1,Monocytes +NHSIL12_CCTCAGTTCCATGAGT-1,Monocytes +NHSIL12_CCTCAGTTCTATCGCC-1,Monocytes +NHSIL12_CCTCTGAGTAGAAAGG-1,Dendritic cells +NHSIL12_CCTCTGAGTAGCGATG-1,Macrophages +NHSIL12_CCTCTGAGTCAACTGT-1,Macrophages +NHSIL12_CCTCTGATCAAGAAGT-1,Monocytes +NHSIL12_CCTCTGATCGTTTATC-1,Granulocytes +NHSIL12_CCTCTGATCTTGTCAT-1,Dendritic cells +NHSIL12_CCTTCCCAGAGTAATC-1,Monocytes +NHSIL12_CCTTCCCAGGCTACGA-1,Monocytes +NHSIL12_CCTTCCCAGGGATGGG-1,Monocytes +NHSIL12_CCTTCCCGTATCACCA-1,Monocytes +NHSIL12_CCTTCCCTCCAAGTAC-1,Monocytes +NHSIL12_CCTTCCCTCTGAAAGA-1,Monocytes +NHSIL12_CCTTCGAAGGCTAGCA-1,Granulocytes +NHSIL12_CCTTTCTCACTCAGGC-1,Monocytes +NHSIL12_CCTTTCTGTATAATGG-1,Monocytes +NHSIL12_CCTTTCTGTTTAGGAA-1,Monocytes +NHSIL12_CCTTTCTTCCCTCTTT-1,Monocytes +NHSIL12_CCTTTCTTCGGACAAG-1,Monocytes +NHSIL12_CGAACATCAAGGACAC-1,Macrophages +NHSIL12_CGAACATCAGCATACT-1,Monocytes +NHSIL12_CGAATGTCAGCATGAG-1,Monocytes +NHSIL12_CGAATGTGTACCGTTA-1,Monocytes +NHSIL12_CGAATGTTCAGGCGAA-1,Granulocytes +NHSIL12_CGAATGTTCGGTGTCG-1,Monocytes +NHSIL12_CGAATGTTCTTGACGA-1,Granulocytes +NHSIL12_CGACCTTGTACCGAGA-1,Monocytes +NHSIL12_CGACTTCAGTCTCGGC-1,Granulocytes +NHSIL12_CGACTTCCACCGCTAG-1,Monocytes +NHSIL12_CGACTTCGTGTCGCTG-1,Macrophages +NHSIL12_CGAGCCACAAACTGCT-1,Monocytes +NHSIL12_CGAGCCAGTGCCTGCA-1,Macrophages +NHSIL12_CGAGCCAGTTAAGGGC-1,Monocytes +NHSIL12_CGATCGGAGACACTAA-1,Monocytes +NHSIL12_CGATCGGAGACTGTAA-1,Monocytes +NHSIL12_CGATCGGCAGGATTGG-1,Macrophages +NHSIL12_CGATCGGTCAGTCCCT-1,Monocytes +NHSIL12_CGATGGCAGACCGGAT-1,Monocytes +NHSIL12_CGATGGCCACAACGCC-1,Monocytes +NHSIL12_CGATGGCGTCGCATCG-1,Monocytes +NHSIL12_CGATGGCGTCTCACCT-1,Monocytes +NHSIL12_CGATGGCTCTCAAACG-1,Monocytes +NHSIL12_CGATGTAAGTAGGTGC-1,Monocytes +NHSIL12_CGATGTAGTAGCGTGA-1,Monocytes +NHSIL12_CGATTGAAGAGCTTCT-1,Dendritic cells +NHSIL12_CGATTGACAGTACACT-1,Monocytes +NHSIL12_CGATTGAGTCGATTGT-1,Monocytes +NHSIL12_CGATTGAGTCTGCCAG-1,Monocytes +NHSIL12_CGCCAAGAGCCACGCT-1,T cells +NHSIL12_CGCCAAGCACCACGTG-1,Dendritic cells +NHSIL12_CGCCAAGCACGGTAAG-1,Monocytes +NHSIL12_CGCGGTATCGGATGGA-1,Macrophages +NHSIL12_CGCGTTTCAATGGACG-1,Macrophages +NHSIL12_CGCGTTTCATCACGTA-1,Monocytes +NHSIL12_CGCGTTTGTACCATCA-1,Macrophages +NHSIL12_CGCGTTTGTGTAACGG-1,Monocytes +NHSIL12_CGCGTTTGTGTCCTCT-1,Monocytes +NHSIL12_CGCGTTTTCGGTCTAA-1,Monocytes +NHSIL12_CGCGTTTTCTCTGTCG-1,Monocytes +NHSIL12_CGCTATCGTGACGCCT-1,Monocytes +NHSIL12_CGCTATCGTGCACTTA-1,Monocytes +NHSIL12_CGCTATCGTGCAGTAG-1,Monocytes +NHSIL12_CGCTATCTCTACTATC-1,Monocytes +NHSIL12_CGCTGGACACAACGCC-1,Monocytes +NHSIL12_CGCTGGAGTACAAGTA-1,Monocytes +NHSIL12_CGCTGGATCTGAGTGT-1,Monocytes +NHSIL12_CGCTGGATCTGGTATG-1,Monocytes +NHSIL12_CGGACACTCTTGAGAC-1,Monocytes +NHSIL12_CGGACTGAGAATCTCC-1,Monocytes +NHSIL12_CGGACTGCACAGACAG-1,Monocytes +NHSIL12_CGGACTGCATTCCTCG-1,Monocytes +NHSIL12_CGGACTGTCAAACCGT-1,Monocytes +NHSIL12_CGGAGCTCATTGGCGC-1,Monocytes +NHSIL12_CGGAGCTTCCTTTCTC-1,Granulocytes +NHSIL12_CGGAGTCCAAGGGTCA-1,Monocytes +NHSIL12_CGGAGTCCATTTGCCC-1,Monocytes +NHSIL12_CGGGTCAGTCTGCAAT-1,Macrophages +NHSIL12_CGGGTCAGTGCAACTT-1,Monocytes +NHSIL12_CGGGTCATCCTTGGTC-1,Monocytes +NHSIL12_CGGTTAAAGATGTAAC-1,Granulocytes +NHSIL12_CGGTTAACACTTACGA-1,Monocytes +NHSIL12_CGGTTAAGTAGCGTCC-1,Dendritic cells +NHSIL12_CGGTTAATCCACGAAT-1,Granulocytes +NHSIL12_CGTAGCGTCAGCTGGC-1,Monocytes +NHSIL12_CGTAGCGTCCTAGGGC-1,Monocytes +NHSIL12_CGTAGCGTCTCGCTTG-1,Monocytes +NHSIL12_CGTAGGCTCGGCGCTA-1,Monocytes +NHSIL12_CGTCACTAGACACGAC-1,Monocytes +NHSIL12_CGTCACTAGATACACA-1,T cells +NHSIL12_CGTCACTAGGATCGCA-1,Macrophages +NHSIL12_CGTCACTGTGTCGCTG-1,Granulocytes +NHSIL12_CGTCACTTCGCATGAT-1,Monocytes +NHSIL12_CGTCAGGGTGGCGAAT-1,Monocytes +NHSIL12_CGTCCATAGAATCTCC-1,Monocytes +NHSIL12_CGTCCATCACAACTGT-1,Monocytes +NHSIL12_CGTCCATGTATATGGA-1,Monocytes +NHSIL12_CGTCCATGTGCGAAAC-1,Monocytes +NHSIL12_CGTCTACCACACCGAC-1,Monocytes +NHSIL12_CGTCTACGTTTCCACC-1,Dendritic cells +NHSIL12_CGTGAGCTCGCCTGTT-1,NK cells +NHSIL12_CGTGTAAAGACTACAA-1,Monocytes +NHSIL12_CGTGTAAAGCGTAATA-1,Monocytes +NHSIL12_CGTGTAAAGCTTCGCG-1,Monocytes +NHSIL12_CGTGTAACAACTGGCC-1,Monocytes +NHSIL12_CGTGTAAGTCTCCACT-1,Macrophages +NHSIL12_CGTGTCTAGTGCCAGA-1,T cells +NHSIL12_CGTTAGACAGCTCCGA-1,Granulocytes +NHSIL12_CGTTAGAGTTGAGGTG-1,Macrophages +NHSIL12_CGTTCTGAGTGTTAGA-1,NK cells +NHSIL12_CGTTCTGCATCTCCCA-1,Monocytes +NHSIL12_CGTTCTGTCCGCATCT-1,Macrophages +NHSIL12_CGTTGGGAGGATGGAA-1,Monocytes +NHSIL12_CGTTGGGAGTCCGTAT-1,Monocytes +NHSIL12_CGTTGGGTCGCCTGTT-1,Monocytes +NHSIL12_CTAACTTAGGGTATCG-1,Dendritic cells +NHSIL12_CTAACTTAGTCGTACT-1,Macrophages +NHSIL12_CTAACTTAGTGAACGC-1,Monocytes +NHSIL12_CTAACTTCAGCTGTTA-1,Monocytes +NHSIL12_CTAACTTTCACGACTA-1,Dendritic cells +NHSIL12_CTAACTTTCCAGAGGA-1,Dendritic cells +NHSIL12_CTAAGACAGACTACAA-1,Macrophages +NHSIL12_CTAAGACAGTCGTTTG-1,Monocytes +NHSIL12_CTAAGACCACAAGACG-1,Macrophages +NHSIL12_CTAAGACCATGGTCAT-1,NK cells +NHSIL12_CTAAGACGTCATCGGC-1,Monocytes +NHSIL12_CTAAGACGTGCTGTAT-1,Monocytes +NHSIL12_CTAATGGGTGCCTTGG-1,Monocytes +NHSIL12_CTAATGGTCTTAGAGC-1,Dendritic cells +NHSIL12_CTACACCGTCGGATCC-1,Monocytes +NHSIL12_CTACACCGTGTCAATC-1,Granulocytes +NHSIL12_CTACATTAGATCACGG-1,Monocytes +NHSIL12_CTACATTAGGAATTAC-1,Monocytes +NHSIL12_CTACATTAGGTGGGTT-1,T cells +NHSIL12_CTACCCACATACCATG-1,Monocytes +NHSIL12_CTACCCATCTCTTGAT-1,Macrophages +NHSIL12_CTAGAGTAGCTGCGAA-1,Macrophages +NHSIL12_CTAGAGTTCTGTCAAG-1,Monocytes +NHSIL12_CTAGCCTGTCTCCACT-1,Monocytes +NHSIL12_CTAGCCTTCGAATGCT-1,Monocytes +NHSIL12_CTAGCCTTCTTGTTTG-1,Monocytes +NHSIL12_CTAGTGAAGGATCGCA-1,Granulocytes +NHSIL12_CTAGTGAGTACTCGCG-1,Monocytes +NHSIL12_CTCACACAGAGTCGGT-1,Monocytes +NHSIL12_CTCAGAAGTGACGCCT-1,Monocytes +NHSIL12_CTCAGAATCCGCGTTT-1,Monocytes +NHSIL12_CTCATTAAGCACACAG-1,Monocytes +NHSIL12_CTCATTAAGCACCGTC-1,Monocytes +NHSIL12_CTCATTAAGGAGTTGC-1,Dendritic cells +NHSIL12_CTCATTATCCTTTCTC-1,Monocytes +NHSIL12_CTCCTAGAGGCCCTCA-1,Granulocytes +NHSIL12_CTCCTAGCACCACCAG-1,Monocytes +NHSIL12_CTCCTAGGTTCAACCA-1,Dendritic cells +NHSIL12_CTCCTAGTCAAACCAC-1,NK cells +NHSIL12_CTCGAAAAGCGATAGC-1,Dendritic cells +NHSIL12_CTCGAAAAGCTAAGAT-1,Granulocytes +NHSIL12_CTCGAAACAACACCCG-1,Dendritic cells +NHSIL12_CTCGAAAGTTAAGATG-1,Macrophages +NHSIL12_CTCGAAAGTTATGTGC-1,Monocytes +NHSIL12_CTCGAAATCAAACCAC-1,T cells +NHSIL12_CTCGAGGCAATCCGAT-1,Monocytes +NHSIL12_CTCGAGGGTAGAGCTG-1,Monocytes +NHSIL12_CTCGAGGTCACATACG-1,T cells +NHSIL12_CTCGGAGCACAGACAG-1,T cells +NHSIL12_CTCGGAGGTGTTAAGA-1,Macrophages +NHSIL12_CTCGGGATCAACACTG-1,Monocytes +NHSIL12_CTCGGGATCTCGTTTA-1,Monocytes +NHSIL12_CTCGTCAAGTTACCCA-1,Monocytes +NHSIL12_CTCGTCAGTCTGATTG-1,Monocytes +NHSIL12_CTCGTCATCTACTCAT-1,Monocytes +NHSIL12_CTCTAATGTCTAGAGG-1,Monocytes +NHSIL12_CTCTACGGTAAGAGGA-1,Monocytes +NHSIL12_CTCTACGTCGTCTGAA-1,Monocytes +NHSIL12_CTCTGGTCAGTTCCCT-1,Monocytes +NHSIL12_CTCTGGTGTTTGTGTG-1,Monocytes +NHSIL12_CTCTGGTTCCTCATTA-1,Monocytes +NHSIL12_CTGAAACGTACCTACA-1,Monocytes +NHSIL12_CTGATAGCACCCATTC-1,Monocytes +NHSIL12_CTGATAGGTTCCACTC-1,Monocytes +NHSIL12_CTGATCCAGACAGGCT-1,Macrophages +NHSIL12_CTGATCCGTACCTACA-1,Macrophages +NHSIL12_CTGATCCGTGGAAAGA-1,Monocytes +NHSIL12_CTGATCCGTGGTGTAG-1,Macrophages +NHSIL12_CTGATCCTCCGAAGAG-1,Monocytes +NHSIL12_CTGCCTAAGCCTATGT-1,Monocytes +NHSIL12_CTGCCTAGTCATTAGC-1,Monocytes +NHSIL12_CTGCCTAGTTCAGACT-1,Monocytes +NHSIL12_CTGCTGTTCATCATTC-1,Monocytes +NHSIL12_CTGCTGTTCGGAGGTA-1,Macrophages +NHSIL12_CTGCTGTTCGTCTGAA-1,Dendritic cells +NHSIL12_CTGGTCTAGACCTTTG-1,Monocytes +NHSIL12_CTGGTCTAGTGTACCT-1,T cells +NHSIL12_CTGGTCTAGTTAAGTG-1,Monocytes +NHSIL12_CTGTGCTAGACTTTCG-1,Macrophages +NHSIL12_CTGTGCTAGTTCGCAT-1,Granulocytes +NHSIL12_CTGTGCTCACGTCAGC-1,Monocytes +NHSIL12_CTGTGCTCAGCTCCGA-1,Monocytes +NHSIL12_CTGTTTAAGAGGTACC-1,Macrophages +NHSIL12_CTGTTTATCATGCTCC-1,Macrophages +NHSIL12_CTTAACTAGGAATTAC-1,Granulocytes +NHSIL12_CTTAACTTCTGAGTGT-1,Monocytes +NHSIL12_CTTAACTTCTTCAACT-1,T cells +NHSIL12_CTTACCGAGCTGAACG-1,Monocytes +NHSIL12_CTTACCGGTACCATCA-1,Monocytes +NHSIL12_CTTACCGTCTAGAGTC-1,Granulocytes +NHSIL12_CTTAGGAGTGTGCGTC-1,Monocytes +NHSIL12_CTTCTCTAGCGCTTAT-1,Monocytes +NHSIL12_CTTCTCTAGCTGAACG-1,Macrophages +NHSIL12_CTTCTCTAGTTAGCGG-1,Monocytes +NHSIL12_CTTCTCTGTTGAGGTG-1,Monocytes +NHSIL12_CTTGGCTAGAATGTGT-1,Macrophages +NHSIL12_CTTGGCTAGATACACA-1,Monocytes +NHSIL12_CTTGGCTAGCGAAGGG-1,Monocytes +NHSIL12_CTTGGCTTCTTTAGGG-1,Dendritic cells +NHSIL12_CTTTGCGCACGGTAAG-1,Macrophages +NHSIL12_CTTTGCGCAGAGCCAA-1,Monocytes +NHSIL12_CTTTGCGCATTGGTAC-1,Monocytes +NHSIL12_GAAACTCAGGCAGTCA-1,Monocytes +NHSIL12_GAAACTCCACAGCCCA-1,Monocytes +NHSIL12_GAAACTCGTACGAAAT-1,Macrophages +NHSIL12_GAAATGAAGATCCCGC-1,Monocytes +NHSIL12_GAAATGAAGCAATCTC-1,Monocytes +NHSIL12_GAAATGAGTCTCTCGT-1,Granulocytes +NHSIL12_GAACGGAAGTTATCGC-1,Monocytes +NHSIL12_GAATAAGGTAATAGCA-1,Dendritic cells +NHSIL12_GAATAAGTCGCTAGCG-1,Monocytes +NHSIL12_GAATGAAGTACCGAGA-1,Granulocytes +NHSIL12_GAATGAAGTGAGGGTT-1,Macrophages +NHSIL12_GAATGAATCCCAGGTG-1,Monocytes +NHSIL12_GAATGAATCGCGTAGC-1,Dendritic cells +NHSIL12_GACACGCTCGGCTTGG-1,Monocytes +NHSIL12_GACAGAGAGCAGCCTC-1,Granulocytes +NHSIL12_GACAGAGCAAGTACCT-1,Monocytes +NHSIL12_GACAGAGGTTCTGTTT-1,Monocytes +NHSIL12_GACCAATAGCCCAACC-1,Monocytes +NHSIL12_GACCAATAGGCTCAGA-1,Monocytes +NHSIL12_GACCTGGAGGCCCGTT-1,Macrophages +NHSIL12_GACCTGGCAAGCTGAG-1,Monocytes +NHSIL12_GACCTGGCAGGATCGA-1,Monocytes +NHSIL12_GACGCGTAGCACCGTC-1,Monocytes +NHSIL12_GACGCGTGTTTGTGTG-1,Monocytes +NHSIL12_GACGGCTAGTAGTGCG-1,Monocytes +NHSIL12_GACGGCTAGTCACGCC-1,Monocytes +NHSIL12_GACGGCTAGTCGTACT-1,Fibroblasts +NHSIL12_GACGGCTTCACAGGCC-1,Monocytes +NHSIL12_GACGGCTTCATGCATG-1,Monocytes +NHSIL12_GACGTGCAGATCTGCT-1,Monocytes +NHSIL12_GACGTGCAGGGTATCG-1,Monocytes +NHSIL12_GACGTGCAGTACTTGC-1,Monocytes +NHSIL12_GACGTGCCACAGGTTT-1,Monocytes +NHSIL12_GACGTGCGTGGTACAG-1,Monocytes +NHSIL12_GACGTGCTCCCTCAGT-1,Monocytes +NHSIL12_GACGTTAAGGCGATAC-1,Monocytes +NHSIL12_GACGTTAAGTGTTGAA-1,Dendritic cells +NHSIL12_GACGTTAGTTAAGTAG-1,Monocytes +NHSIL12_GACGTTATCATACGGT-1,Monocytes +NHSIL12_GACTAACAGGCCATAG-1,Monocytes +NHSIL12_GACTAACCAAGCCGCT-1,Dendritic cells +NHSIL12_GACTAACCACAACTGT-1,Monocytes +NHSIL12_GACTAACGTTCAGACT-1,Monocytes +NHSIL12_GACTACACAAGAAAGG-1,T cells +NHSIL12_GACTACAGTAAATGTG-1,Granulocytes +NHSIL12_GACTACAGTCATCGGC-1,Monocytes +NHSIL12_GACTACAGTCGACTGC-1,Monocytes +NHSIL12_GACTGCGAGCGATAGC-1,Monocytes +NHSIL12_GACTGCGAGCTGTTCA-1,Monocytes +NHSIL12_GACTGCGGTCCTGCTT-1,Monocytes +NHSIL12_GACTGCGTCCCTTGTG-1,Monocytes +NHSIL12_GAGCAGACACGCCAGT-1,Monocytes +NHSIL12_GAGCAGAGTTGGTGGA-1,Monocytes +NHSIL12_GAGGTGACATCCCACT-1,Monocytes +NHSIL12_GAGGTGATCCTAAGTG-1,Macrophages +NHSIL12_GATCAGTAGCGTGAAC-1,Monocytes +NHSIL12_GATCAGTGTCCGAAGA-1,Granulocytes +NHSIL12_GATCGATAGCAAATCA-1,Macrophages +NHSIL12_GATCGATAGGGAAACA-1,Monocytes +NHSIL12_GATCGATGTTAAGACA-1,T cells +NHSIL12_GATCGCGAGACGCACA-1,Macrophages +NHSIL12_GATCGCGGTAGTGAAT-1,Monocytes +NHSIL12_GATCGCGTCCTCGCAT-1,Macrophages +NHSIL12_GATCGTAGTACCGAGA-1,Monocytes +NHSIL12_GATCGTAGTAGGGTAC-1,Monocytes +NHSIL12_GATCGTAGTGTTAAGA-1,Monocytes +NHSIL12_GATCGTAGTGTTGGGA-1,Granulocytes +NHSIL12_GATCGTATCAGTACGT-1,Monocytes +NHSIL12_GATCGTATCTACTCAT-1,Monocytes +NHSIL12_GATCTAGAGACCTAGG-1,Monocytes +NHSIL12_GATCTAGAGGAATCGC-1,Monocytes +NHSIL12_GATCTAGGTTCGGCAC-1,Monocytes +NHSIL12_GATCTAGTCGTCTGAA-1,Monocytes +NHSIL12_GATGAAAAGTCCCACG-1,Monocytes +NHSIL12_GATGAGGAGCCCGAAA-1,Granulocytes +NHSIL12_GATGAGGCATTTGCCC-1,NK cells +NHSIL12_GATGAGGGTCGGGTCT-1,Monocytes +NHSIL12_GATGCTAAGATGCCTT-1,Monocytes +NHSIL12_GATGCTATCAGGCCCA-1,Monocytes +NHSIL12_GATGCTATCTACCAGA-1,Dendritic cells +NHSIL12_GATGCTATCTTGTACT-1,Monocytes +NHSIL12_GATTCAGAGGTCATCT-1,Macrophages +NHSIL12_GATTCAGCATGCCCGA-1,Monocytes +NHSIL12_GATTCAGGTGTCGCTG-1,Macrophages +NHSIL12_GCAAACTAGCGATTCT-1,Monocytes +NHSIL12_GCAAACTCACAAGACG-1,Monocytes +NHSIL12_GCAAACTTCCTCGCAT-1,Monocytes +NHSIL12_GCAATCAGTGCAACTT-1,Monocytes +NHSIL12_GCACATAAGTTAACGA-1,Monocytes +NHSIL12_GCACATACACTTGGAT-1,Monocytes +NHSIL12_GCACATAGTAAGTGGC-1,Dendritic cells +NHSIL12_GCACATAGTACTCTCC-1,T cells +NHSIL12_GCACATATCAAACAAG-1,Monocytes +NHSIL12_GCACATATCGCCCTTA-1,Monocytes +NHSIL12_GCAGTTAAGAGCTGCA-1,Monocytes +NHSIL12_GCAGTTAAGCCCAACC-1,Monocytes +NHSIL12_GCAGTTAAGTTTAGGA-1,Granulocytes +NHSIL12_GCATACACAGTAGAGC-1,Monocytes +NHSIL12_GCATACACATGGTCTA-1,Monocytes +NHSIL12_GCATGATGTCGCATAT-1,Monocytes +NHSIL12_GCATGATTCAAGAAGT-1,Monocytes +NHSIL12_GCATGATTCCAGGGCT-1,Granulocytes +NHSIL12_GCATGCGCAAACGCGA-1,Monocytes +NHSIL12_GCATGTAAGACAGAGA-1,Dendritic cells +NHSIL12_GCATGTAAGTCATGCT-1,Monocytes +NHSIL12_GCCAAATAGTGTTAGA-1,Dendritic cells +NHSIL12_GCCAAATAGTTCCACA-1,Monocytes +NHSIL12_GCCAAATGTCACCTAA-1,Dendritic cells +NHSIL12_GCCAAATTCAGTTGAC-1,Monocytes +NHSIL12_GCCAAATTCGCCGTGA-1,Granulocytes +NHSIL12_GCCTCTAAGAAGCCCA-1,Monocytes +NHSIL12_GCCTCTAAGGATCGCA-1,Monocytes +NHSIL12_GCCTCTACAATAAGCA-1,NK cells +NHSIL12_GCCTCTACAGATCTGT-1,Dendritic cells +NHSIL12_GCGACCACAAATCCGT-1,Monocytes +NHSIL12_GCGACCAGTACCGTTA-1,Monocytes +NHSIL12_GCGAGAAAGCAATCTC-1,Dendritic cells +NHSIL12_GCGAGAAGTGGACGAT-1,Monocytes +NHSIL12_GCGCAACAGGATGCGT-1,Macrophages +NHSIL12_GCGCAACCATATGCTG-1,Monocytes +NHSIL12_GCGCAACGTGCAGGTA-1,Monocytes +NHSIL12_GCGCAACTCGCCCTTA-1,Monocytes +NHSIL12_GCGCAGTAGTTCGATC-1,Granulocytes +NHSIL12_GCGCAGTGTCACCCAG-1,Monocytes +NHSIL12_GCGCAGTTCTGTGCAA-1,Monocytes +NHSIL12_GCGCCAAAGACTGTAA-1,Monocytes +NHSIL12_GCGCCAAAGCGTTCCG-1,Monocytes +NHSIL12_GCGCCAAAGGATCGCA-1,Monocytes +NHSIL12_GCGCCAAAGTATCTCG-1,Monocytes +NHSIL12_GCGCCAACAGGTCTCG-1,Monocytes +NHSIL12_GCGCCAACATGGTCAT-1,Monocytes +NHSIL12_GCGCCAATCCGGCACA-1,NK cells +NHSIL12_GCGCCAATCTGCGACG-1,Monocytes +NHSIL12_GCGCGATGTACAGTTC-1,Monocytes +NHSIL12_GCGGGTTGTCTCTCTG-1,Monocytes +NHSIL12_GCGGGTTGTTCATGGT-1,Monocytes +NHSIL12_GCGGGTTGTTCTGGTA-1,Macrophages +NHSIL12_GCTCCTAAGCCTATGT-1,Monocytes +NHSIL12_GCTCTGTCACGGTAGA-1,Monocytes +NHSIL12_GCTCTGTGTCTCTCTG-1,Monocytes +NHSIL12_GCTCTGTTCAGGTTCA-1,Monocytes +NHSIL12_GCTCTGTTCTGGTTCC-1,Dendritic cells +NHSIL12_GCTGCAGGTCGTCTTC-1,Monocytes +NHSIL12_GCTGCTTCACTCGACG-1,Monocytes +NHSIL12_GCTGCTTGTCACACGC-1,NK cells +NHSIL12_GCTGGGTAGAGACTTA-1,Monocytes +NHSIL12_GCTGGGTAGTTGTCGT-1,Monocytes +NHSIL12_GCTTCCAAGTAGATGT-1,NK cells +NHSIL12_GCTTCCACAGCGAACA-1,Monocytes +NHSIL12_GCTTCCAGTGTCGCTG-1,Monocytes +NHSIL12_GCTTGAAAGAGCTTCT-1,Monocytes +NHSIL12_GCTTGAAAGGCGACAT-1,Monocytes +NHSIL12_GGAAAGCAGTACGCCC-1,Monocytes +NHSIL12_GGAAAGCCAGTATGCT-1,Dendritic cells +NHSIL12_GGAAAGCCATGCCCGA-1,Dendritic cells +NHSIL12_GGAAAGCGTGCTCTTC-1,Monocytes +NHSIL12_GGAAAGCGTGTCTGAT-1,Monocytes +NHSIL12_GGAAAGCGTTACCAGT-1,Monocytes +NHSIL12_GGAACTTAGCTGCCCA-1,Granulocytes +NHSIL12_GGAACTTCATCTGGTA-1,T cells +NHSIL12_GGAATAAGTTGTCGCG-1,Dendritic cells +NHSIL12_GGAATAATCAGGTTCA-1,Monocytes +NHSIL12_GGACAAGCAGACGCAA-1,Macrophages +NHSIL12_GGACAAGGTCTTCTCG-1,Macrophages +NHSIL12_GGACAAGGTGCCTGCA-1,Endothelial cells +NHSIL12_GGACAAGTCTCCGGTT-1,Monocytes +NHSIL12_GGACAGACACATTCGA-1,Granulocytes +NHSIL12_GGACAGATCGGTTAAC-1,Monocytes +NHSIL12_GGACAGATCTCGAGTA-1,Dendritic cells +NHSIL12_GGAGCAAAGACAGAGA-1,Macrophages +NHSIL12_GGAGCAAGTCCTCTTG-1,Monocytes +NHSIL12_GGAGCAATCTTGCATT-1,Monocytes +NHSIL12_GGATGTTTCGCGGATC-1,Monocytes +NHSIL12_GGATTACAGTTACCCA-1,Monocytes +NHSIL12_GGCAATTAGCGTGAGT-1,Macrophages +NHSIL12_GGCAATTGTTTGACTG-1,Monocytes +NHSIL12_GGCCGATAGACTAAGT-1,Macrophages +NHSIL12_GGCCGATCAGCATGAG-1,NK cells +NHSIL12_GGCCGATGTCGAACAG-1,Monocytes +NHSIL12_GGCGACTAGGACACCA-1,Monocytes +NHSIL12_GGCGACTGTACCCAAT-1,Monocytes +NHSIL12_GGCGTGTTCAAACCAC-1,Monocytes +NHSIL12_GGCTCGAGTCCGAGTC-1,Dendritic cells +NHSIL12_GGCTGGTAGAGCTTCT-1,Macrophages +NHSIL12_GGCTGGTAGGGATCTG-1,Monocytes +NHSIL12_GGCTGGTCAGGGTATG-1,Macrophages +NHSIL12_GGCTGGTGTCCTCCAT-1,Dendritic cells +NHSIL12_GGCTGGTTCGTAGGAG-1,Dendritic cells +NHSIL12_GGCTGGTTCTATGTGG-1,Monocytes +NHSIL12_GGGACCTTCTCGTTTA-1,Monocytes +NHSIL12_GGGATGACACACATGT-1,Macrophages +NHSIL12_GGGATGACATGCCCGA-1,Monocytes +NHSIL12_GGGCACTGTATAGTAG-1,Monocytes +NHSIL12_GGGCACTGTTACCGAT-1,Monocytes +NHSIL12_GGGCATCAGTCTCCTC-1,Monocytes +NHSIL12_GGGCATCCAACTTGAC-1,Monocytes +NHSIL12_GGGCATCCAATAAGCA-1,T cells +NHSIL12_GGGCATCCAGATTGCT-1,Monocytes +NHSIL12_GGGCATCTCGTTGACA-1,Dendritic cells +NHSIL12_GGGTCTGCAGCTGCAC-1,Monocytes +NHSIL12_GGGTCTGCATTCGACA-1,Macrophages +NHSIL12_GGGTCTGGTCAAAGAT-1,Monocytes +NHSIL12_GGGTCTGGTGAGGGTT-1,Monocytes +NHSIL12_GGGTCTGGTGCAACGA-1,Monocytes +NHSIL12_GGGTTGCCACTTAAGC-1,Monocytes +NHSIL12_GGGTTGCCAGCCTGTG-1,Monocytes +NHSIL12_GGGTTGCGTTATGCGT-1,Monocytes +NHSIL12_GGTATTGAGGATATAC-1,Monocytes +NHSIL12_GGTATTGAGGGTATCG-1,Monocytes +NHSIL12_GGTATTGCACCACGTG-1,Monocytes +NHSIL12_GGTATTGGTACCTACA-1,Monocytes +NHSIL12_GGTGAAGAGCTGCAAG-1,Macrophages +NHSIL12_GGTGCGTAGCTAAGAT-1,Monocytes +NHSIL12_GGTGCGTAGTTCGCGC-1,Monocytes +NHSIL12_GGTGCGTTCAGCTCTC-1,Monocytes +NHSIL12_GGTGTTAAGATAGTCA-1,Monocytes +NHSIL12_GGTGTTATCACGCGGT-1,Monocytes +NHSIL12_GTAACGTAGTGGACGT-1,Monocytes +NHSIL12_GTAACGTCATGTAGTC-1,Monocytes +NHSIL12_GTAACGTGTCAACATC-1,Monocytes +NHSIL12_GTAACGTTCTCTGAGA-1,Monocytes +NHSIL12_GTAACGTTCTGCAGTA-1,Monocytes +NHSIL12_GTAACTGAGGCGATAC-1,Monocytes +NHSIL12_GTAACTGCAGGGTTAG-1,Monocytes +NHSIL12_GTAACTGCAGTCGTGC-1,Monocytes +NHSIL12_GTACTCCAGCCCAGCT-1,Monocytes +NHSIL12_GTACTCCAGGCAGGTT-1,Monocytes +NHSIL12_GTACTCCCAATGCCAT-1,Dendritic cells +NHSIL12_GTACTCCCACCTCGGA-1,T cells +NHSIL12_GTACTCCGTGCGATAG-1,Monocytes +NHSIL12_GTACTTTAGAAGGGTA-1,NK cells +NHSIL12_GTACTTTAGTGGTCCC-1,Monocytes +NHSIL12_GTACTTTCACTACAGT-1,Monocytes +NHSIL12_GTACTTTCAGCCTATA-1,Macrophages +NHSIL12_GTACTTTCATTGGTAC-1,Monocytes +NHSIL12_GTAGGCCTCCGCGTTT-1,Monocytes +NHSIL12_GTAGTCAGTTCAGTAC-1,Monocytes +NHSIL12_GTATCTTAGCCAGTAG-1,Macrophages +NHSIL12_GTATCTTCATTGGTAC-1,Monocytes +NHSIL12_GTATCTTGTTTGGCGC-1,Monocytes +NHSIL12_GTATCTTTCATCTGTT-1,Monocytes +NHSIL12_GTATCTTTCTCTAGGA-1,Monocytes +NHSIL12_GTATTCTAGAGTAAGG-1,Granulocytes +NHSIL12_GTATTCTCAAAGGCGT-1,Monocytes +NHSIL12_GTATTCTGTATATGGA-1,Monocytes +NHSIL12_GTCAAGTGTCGAATCT-1,Monocytes +NHSIL12_GTCAAGTTCTATCCTA-1,Monocytes +NHSIL12_GTCACAACATGCAATC-1,Monocytes +NHSIL12_GTCACGGCAAAGCGGT-1,Monocytes +NHSIL12_GTCACGGGTTCCGGCA-1,Monocytes +NHSIL12_GTCATTTCATATGCTG-1,Monocytes +NHSIL12_GTCATTTTCAGAGGTG-1,Monocytes +NHSIL12_GTCCTCAGTCAGAAGC-1,Monocytes +NHSIL12_GTCGGGTAGGGAACGG-1,Monocytes +NHSIL12_GTCGGGTGTCGTGGCT-1,Monocytes +NHSIL12_GTCGGGTGTTCTCATT-1,Monocytes +NHSIL12_GTCGGGTTCTCTAAGG-1,Dendritic cells +NHSIL12_GTCGTAAGTTCACCTC-1,Monocytes +NHSIL12_GTCTCGTGTGATAAGT-1,Monocytes +NHSIL12_GTCTTCGGTTGCTCCT-1,Monocytes +NHSIL12_GTCTTCGTCGACAGCC-1,Monocytes +NHSIL12_GTGAAGGAGCACAGGT-1,Monocytes +NHSIL12_GTGAAGGCATAAGACA-1,Monocytes +NHSIL12_GTGAAGGCATCGGACC-1,Monocytes +NHSIL12_GTGAAGGGTATTCGTG-1,Monocytes +NHSIL12_GTGAAGGTCTGTCAAG-1,T cells +NHSIL12_GTGCAGCAGAATGTGT-1,Granulocytes +NHSIL12_GTGCAGCGTGATGTCT-1,Granulocytes +NHSIL12_GTGCAGCTCATTATCC-1,Monocytes +NHSIL12_GTGCAGCTCCTTGACC-1,Monocytes +NHSIL12_GTGCGGTGTCCAACTA-1,Monocytes +NHSIL12_GTGCTTCAGAGGGATA-1,Macrophages +NHSIL12_GTGCTTCAGCGGATCA-1,Monocytes +NHSIL12_GTGCTTCCATGCAACT-1,Dendritic cells +NHSIL12_GTGCTTCGTTCGTTGA-1,Monocytes +NHSIL12_GTGCTTCTCTACTCAT-1,Monocytes +NHSIL12_GTGGGTCAGACGACGT-1,Monocytes +NHSIL12_GTGGGTCCAGTTTACG-1,Monocytes +NHSIL12_GTGTGCGAGAGGTAGA-1,Dendritic cells +NHSIL12_GTGTGCGAGGGTTTCT-1,Monocytes +NHSIL12_GTGTGCGCAAGAGTCG-1,Monocytes +NHSIL12_GTGTGCGCACGCATCG-1,Macrophages +NHSIL12_GTGTTAGTCTGTTGAG-1,Macrophages +NHSIL12_GTTAAGCAGGTACTCT-1,Monocytes +NHSIL12_GTTAAGCAGTCGCCGT-1,Monocytes +NHSIL12_GTTAAGCGTAGATTAG-1,Monocytes +NHSIL12_GTTAAGCTCCACGACG-1,Dendritic cells +NHSIL12_GTTAAGCTCCCATTTA-1,Monocytes +NHSIL12_GTTACAGCATTCGACA-1,T cells +NHSIL12_GTTACAGGTATGAAAC-1,Monocytes +NHSIL12_GTTACAGGTCGCTTTC-1,Monocytes +NHSIL12_GTTCATTAGACTTGAA-1,Monocytes +NHSIL12_GTTCATTCATTCCTGC-1,Monocytes +NHSIL12_GTTCATTGTAAATGAC-1,Macrophages +NHSIL12_GTTCATTTCATAAAGG-1,Monocytes +NHSIL12_GTTCGGGAGCATCATC-1,Monocytes +NHSIL12_GTTCGGGCAAGAAAGG-1,Monocytes +NHSIL12_GTTCTCGGTACAAGTA-1,Monocytes +NHSIL12_GTTTCTATCTAACTGG-1,T cells +NHSIL12_TAAACCGAGGATGGAA-1,Monocytes +NHSIL12_TAAACCGTCAGATAAG-1,Monocytes +NHSIL12_TAAGAGAAGTATCTCG-1,Monocytes +NHSIL12_TAAGCGTCAAACGTGG-1,Macrophages +NHSIL12_TAAGCGTGTGGTGTAG-1,Dendritic cells +NHSIL12_TAAGTGCAGGTAGCTG-1,Monocytes +NHSIL12_TAAGTGCGTAAATGAC-1,Monocytes +NHSIL12_TAAGTGCGTCTTGATG-1,Macrophages +NHSIL12_TACACGATCCTAAGTG-1,Dendritic cells +NHSIL12_TACAGTGGTGTGGCTC-1,Macrophages +NHSIL12_TACCTATGTAGCCTCG-1,Monocytes +NHSIL12_TACCTATGTAGGGACT-1,Granulocytes +NHSIL12_TACCTATGTTAAGGGC-1,Monocytes +NHSIL12_TACCTTAAGCGTGTCC-1,Monocytes +NHSIL12_TACCTTAAGGTGCTAG-1,Monocytes +NHSIL12_TACCTTAGTAGTGAAT-1,Monocytes +NHSIL12_TACCTTAGTTACAGAA-1,Monocytes +NHSIL12_TACCTTATCACATAGC-1,Monocytes +NHSIL12_TACCTTATCCTGCCAT-1,Macrophages +NHSIL12_TACGGATAGAGTCGGT-1,Monocytes +NHSIL12_TACGGATAGTGTGAAT-1,Monocytes +NHSIL12_TACGGATTCTCTTATG-1,Monocytes +NHSIL12_TACGGATTCTGTCAAG-1,Monocytes +NHSIL12_TACGGGCGTACCGTTA-1,Monocytes +NHSIL12_TACGGGCTCAGAGACG-1,Monocytes +NHSIL12_TACGGGCTCGGAATCT-1,Monocytes +NHSIL12_TACGGTATCAATCTCT-1,Granulocytes +NHSIL12_TACTCATAGAGCCTAG-1,Monocytes +NHSIL12_TACTCGCAGTTTGCGT-1,Monocytes +NHSIL12_TACTCGCGTTCGTTGA-1,Monocytes +NHSIL12_TACTTGTAGAACTGTA-1,Monocytes +NHSIL12_TACTTGTCACCAGTTA-1,Dendritic cells +NHSIL12_TACTTGTCAGGAACGT-1,Monocytes +NHSIL12_TAGACCAGTAGCCTCG-1,Monocytes +NHSIL12_TAGAGCTAGAGTCGGT-1,Monocytes +NHSIL12_TAGAGCTAGCCCTAAT-1,Monocytes +NHSIL12_TAGAGCTAGCCGGTAA-1,Monocytes +NHSIL12_TAGAGCTCAACGCACC-1,Monocytes +NHSIL12_TAGCCGGCATACGCCG-1,Monocytes +NHSIL12_TAGGCATAGAATTGTG-1,Monocytes +NHSIL12_TAGGCATAGCTACCTA-1,Macrophages +NHSIL12_TAGGCATAGTACTTGC-1,Monocytes +NHSIL12_TAGGCATAGTGCAAGC-1,Monocytes +NHSIL12_TAGGCATCAATGAATG-1,Monocytes +NHSIL12_TAGGCATGTCAGGACA-1,Monocytes +NHSIL12_TAGTGGTCAAGTTAAG-1,Dendritic cells +NHSIL12_TAGTTGGAGATACACA-1,Monocytes +NHSIL12_TAGTTGGCAATCCAAC-1,Monocytes +NHSIL12_TAGTTGGTCAAACCAC-1,Monocytes +NHSIL12_TATCAGGCAAAGAATC-1,Dendritic cells +NHSIL12_TATCAGGCAAGTCATC-1,Monocytes +NHSIL12_TATCTCAAGTGCCAGA-1,Monocytes +NHSIL12_TATCTCACATGCAACT-1,Monocytes +NHSIL12_TATGCCCAGATATGCA-1,Monocytes +NHSIL12_TATGCCCCATGCAATC-1,Monocytes +NHSIL12_TATGCCCCATTTCAGG-1,Macrophages +NHSIL12_TATTACCAGTATCGAA-1,Monocytes +NHSIL12_TATTACCCAGGACCCT-1,Macrophages +NHSIL12_TATTACCGTACGACCC-1,Monocytes +NHSIL12_TCAACGAAGCAGGTCA-1,Monocytes +NHSIL12_TCAACGAAGCGATTCT-1,Granulocytes +NHSIL12_TCAACGAGTCTAGCCG-1,Dendritic cells +NHSIL12_TCAACGAGTTCGTTGA-1,Monocytes +NHSIL12_TCAATCTCATCGGGTC-1,Macrophages +NHSIL12_TCAATCTTCCTAAGTG-1,Monocytes +NHSIL12_TCACAAGAGCGTGAGT-1,Monocytes +NHSIL12_TCACAAGAGTGGGTTG-1,Monocytes +NHSIL12_TCACAAGGTGGTTTCA-1,Monocytes +NHSIL12_TCACAAGGTTCACGGC-1,Monocytes +NHSIL12_TCACAAGTCGGAGGTA-1,Macrophages +NHSIL12_TCACGAAAGACAATAC-1,Monocytes +NHSIL12_TCACGAAGTAACGCGA-1,Dendritic cells +NHSIL12_TCAGATGAGCAATCTC-1,Monocytes +NHSIL12_TCAGATGCATACTACG-1,Monocytes +NHSIL12_TCAGCAACAAGGTTCT-1,T cells +NHSIL12_TCAGCTCAGACTTTCG-1,Monocytes +NHSIL12_TCAGCTCCAGTCAGAG-1,Monocytes +NHSIL12_TCAGGATAGATGAGAG-1,Monocytes +NHSIL12_TCAGGATTCTGCGGCA-1,Monocytes +NHSIL12_TCAGGTAAGGGCTTCC-1,Dendritic cells +NHSIL12_TCAGGTAAGTGGGATC-1,Monocytes +NHSIL12_TCAGGTAGTTAGATGA-1,Macrophages +NHSIL12_TCATTACAGCAATCTC-1,Monocytes +NHSIL12_TCATTACGTTGTCGCG-1,Monocytes +NHSIL12_TCATTACTCGAGCCCA-1,Monocytes +NHSIL12_TCATTTGCAAGCCGTC-1,Granulocytes +NHSIL12_TCATTTGGTGGTAACG-1,Monocytes +NHSIL12_TCATTTGTCGGAAATA-1,Macrophages +NHSIL12_TCCACACGTTACTGAC-1,Monocytes +NHSIL12_TCCCGATCAGCGTAAG-1,Monocytes +NHSIL12_TCCCGATGTCCTCCAT-1,Monocytes +NHSIL12_TCCCGATGTCTCAACA-1,Monocytes +NHSIL12_TCCCGATGTGATGTGG-1,Monocytes +NHSIL12_TCCCGATTCGGCTTGG-1,Macrophages +NHSIL12_TCGAGGCAGACTAGGC-1,Monocytes +NHSIL12_TCGAGGCAGTTGAGAT-1,Monocytes +NHSIL12_TCGAGGCCATTGTGCA-1,Macrophages +NHSIL12_TCGAGGCGTGCCTTGG-1,Monocytes +NHSIL12_TCGAGGCGTTTGGGCC-1,Monocytes +NHSIL12_TCGCGAGAGGCTAGAC-1,Monocytes +NHSIL12_TCGCGAGAGTCTCGGC-1,Monocytes +NHSIL12_TCGCGAGGTTAAGTAG-1,Monocytes +NHSIL12_TCGCGAGTCCCAAGAT-1,Monocytes +NHSIL12_TCGCGTTCAATGCCAT-1,Monocytes +NHSIL12_TCGCGTTGTCCTCCAT-1,Monocytes +NHSIL12_TCGCGTTGTTCAGGCC-1,Monocytes +NHSIL12_TCGCGTTTCTTGAGGT-1,Monocytes +NHSIL12_TCGGGACGTTCCATGA-1,Monocytes +NHSIL12_TCGGTAAAGCTCCTCT-1,Monocytes +NHSIL12_TCGGTAAGTAGTGAAT-1,Monocytes +NHSIL12_TCGTACCGTATATGAG-1,Monocytes +NHSIL12_TCGTACCGTCCGAAGA-1,NK cells +NHSIL12_TCGTACCGTCTTGTCC-1,Dendritic cells +NHSIL12_TCGTAGACAGCTGTAT-1,Macrophages +NHSIL12_TCGTAGACATTTCAGG-1,Macrophages +NHSIL12_TCTATTGAGACTCGGA-1,Monocytes +NHSIL12_TCTATTGAGCCTTGAT-1,Macrophages +NHSIL12_TCTATTGGTGCAACTT-1,Monocytes +NHSIL12_TCTATTGTCTTTAGTC-1,Monocytes +NHSIL12_TCTCATACAGCGATCC-1,Monocytes +NHSIL12_TCTCATACATCCCATC-1,Monocytes +NHSIL12_TCTCATAGTGTGAATA-1,Monocytes +NHSIL12_TCTCATATCCGGGTGT-1,Monocytes +NHSIL12_TCTGAGACACGAAAGC-1,Granulocytes +NHSIL12_TCTGAGACAGGTCGTC-1,Granulocytes +NHSIL12_TCTGAGAGTACAGCAG-1,Monocytes +NHSIL12_TCTGAGAGTTAAGGGC-1,Macrophages +NHSIL12_TCTGAGAGTTTGTTGG-1,Monocytes +NHSIL12_TCTGAGATCCTTTACA-1,Monocytes +NHSIL12_TCTGAGATCTAGAGTC-1,Monocytes +NHSIL12_TCTGGAATCAGGCCCA-1,NK cells +NHSIL12_TCTGGAATCCAGTATG-1,Monocytes +NHSIL12_TCTGGAATCTACGAGT-1,Monocytes +NHSIL12_TCTTCGGTCCGTAGTA-1,Monocytes +NHSIL12_TGAAAGAAGAATTCCC-1,Monocytes +NHSIL12_TGAAAGAAGATGGCGT-1,Monocytes +NHSIL12_TGACAACTCGTGTAGT-1,Monocytes +NHSIL12_TGACGGCGTTCCACTC-1,Monocytes +NHSIL12_TGACGGCTCTTGACGA-1,Monocytes +NHSIL12_TGACTAGAGGATTCGG-1,Monocytes +NHSIL12_TGACTAGGTAGCCTCG-1,Monocytes +NHSIL12_TGACTAGTCAAGGCTT-1,Monocytes +NHSIL12_TGACTTTAGCCACCTG-1,Dendritic cells +NHSIL12_TGACTTTCAGATCCAT-1,Macrophages +NHSIL12_TGACTTTTCTCCCTGA-1,Monocytes +NHSIL12_TGAGAGGAGTGGTAAT-1,Monocytes +NHSIL12_TGAGAGGGTCGCCATG-1,Monocytes +NHSIL12_TGAGCATGTGACGGTA-1,Dendritic cells +NHSIL12_TGAGCATTCCAAGTAC-1,Monocytes +NHSIL12_TGAGCCGCACCATCCT-1,Granulocytes +NHSIL12_TGAGCCGCAGCTATTG-1,Dendritic cells +NHSIL12_TGAGCCGGTCAGCTAT-1,Monocytes +NHSIL12_TGAGCCGGTCATGCAT-1,Monocytes +NHSIL12_TGAGCCGTCTGAGGGA-1,Monocytes +NHSIL12_TGAGGGAAGGGTCGAT-1,Dendritic cells +NHSIL12_TGAGGGAGTAATAGCA-1,Monocytes +NHSIL12_TGCACCTAGAGTACCG-1,Monocytes +NHSIL12_TGCACCTCACCTGGTG-1,Monocytes +NHSIL12_TGCACCTCACGGTTTA-1,Monocytes +NHSIL12_TGCACCTGTAAGCACG-1,Monocytes +NHSIL12_TGCACCTGTACAGACG-1,Monocytes +NHSIL12_TGCACCTGTAGCCTAT-1,Macrophages +NHSIL12_TGCACCTGTTCGTTGA-1,Monocytes +NHSIL12_TGCACCTTCCACGAAT-1,Monocytes +NHSIL12_TGCCAAAGTCGGCACT-1,Monocytes +NHSIL12_TGCCCTAAGCGATCCC-1,Monocytes +NHSIL12_TGCCCTACAACCGCCA-1,Monocytes +NHSIL12_TGCCCTATCCAGAAGG-1,Macrophages +NHSIL12_TGCGCAGGTTCCGTCT-1,Monocytes +NHSIL12_TGCGCAGTCCATGAAC-1,T cells +NHSIL12_TGCGCAGTCGTGGGAA-1,Monocytes +NHSIL12_TGCGGGTAGTCGTACT-1,Macrophages +NHSIL12_TGCGGGTCAAACGTGG-1,Monocytes +NHSIL12_TGCGGGTCAGGAACGT-1,Monocytes +NHSIL12_TGCGTGGCATTGGTAC-1,Monocytes +NHSIL12_TGCTACCGTAAGTTCC-1,Dendritic cells +NHSIL12_TGCTACCTCACCCTCA-1,Monocytes +NHSIL12_TGCTGCTCACCAACCG-1,Monocytes +NHSIL12_TGCTGCTGTTAGATGA-1,Dendritic cells +NHSIL12_TGCTGCTTCTGGTGTA-1,Monocytes +NHSIL12_TGGACGCAGAGGGCTT-1,Monocytes +NHSIL12_TGGCCAGAGAGACTTA-1,Monocytes +NHSIL12_TGGCCAGGTAAGCACG-1,Monocytes +NHSIL12_TGGCCAGGTTGTGGAG-1,Monocytes +NHSIL12_TGGCGCAAGATCGGGT-1,Monocytes +NHSIL12_TGGCTGGAGAATGTTG-1,Monocytes +NHSIL12_TGGCTGGCAAGCGATG-1,Monocytes +NHSIL12_TGGCTGGGTTTCGCTC-1,Macrophages +NHSIL12_TGGCTGGTCATGCAAC-1,Granulocytes +NHSIL12_TGGGAAGTCACCTCGT-1,Monocytes +NHSIL12_TGGGAAGTCGCGGATC-1,Monocytes +NHSIL12_TGGGCGTAGAGACTTA-1,Macrophages +NHSIL12_TGGGCGTAGGAATTAC-1,Granulocytes +NHSIL12_TGGGCGTAGGGCTTCC-1,Monocytes +NHSIL12_TGGGCGTCATTACCTT-1,Dendritic cells +NHSIL12_TGGGCGTGTGCATCTA-1,Dendritic cells +NHSIL12_TGGGCGTGTTATGTGC-1,Monocytes +NHSIL12_TGGTTAGAGATCACGG-1,Granulocytes +NHSIL12_TGGTTAGAGCCAGAAC-1,Macrophages +NHSIL12_TGGTTAGAGTCCAGGA-1,Monocytes +NHSIL12_TGGTTAGGTGTCTGAT-1,Monocytes +NHSIL12_TGGTTAGGTTGCCTCT-1,Granulocytes +NHSIL12_TGGTTAGGTTTAGCTG-1,Monocytes +NHSIL12_TGGTTCCAGAAGGCCT-1,Monocytes +NHSIL12_TGGTTCCTCATTATCC-1,Macrophages +NHSIL12_TGTATTCAGGTCGGAT-1,Dendritic cells +NHSIL12_TGTATTCCAATCTGCA-1,Monocytes +NHSIL12_TGTATTCGTAAATGTG-1,Monocytes +NHSIL12_TGTCCCATCAGAGACG-1,Monocytes +NHSIL12_TGTCCCATCCCGACTT-1,Monocytes +NHSIL12_TGTCCCATCTCAAACG-1,Macrophages +NHSIL12_TGTGGTAAGAGCTTCT-1,Monocytes +NHSIL12_TGTGGTAAGATATACG-1,Monocytes +NHSIL12_TGTGGTATCTTCTGGC-1,Monocytes +NHSIL12_TGTGGTATCTTGACGA-1,Dendritic cells +NHSIL12_TGTGTTTCAGTTCATG-1,Monocytes +NHSIL12_TGTGTTTCATGACATC-1,Dendritic cells +NHSIL12_TGTGTTTGTTCCGGCA-1,Dendritic cells +NHSIL12_TGTGTTTTCCGGGTGT-1,Dendritic cells +NHSIL12_TGTTCCGAGCTTATCG-1,Monocytes +NHSIL12_TGTTCCGCAGTCGTGC-1,Dendritic cells +NHSIL12_TGTTCCGGTTATGTGC-1,Monocytes +NHSIL12_TGTTCCGTCTTTAGGG-1,Monocytes +NHSIL12_TTAGGACGTTACGTCA-1,T cells +NHSIL12_TTAGGCAAGCAGGTCA-1,Monocytes +NHSIL12_TTAGGCACAAGGTGTG-1,Dendritic cells +NHSIL12_TTAGGCACATATACGC-1,Granulocytes +NHSIL12_TTAGGCACATATGGTC-1,Monocytes +NHSIL12_TTAGGCAGTCCGAATT-1,Macrophages +NHSIL12_TTAGGCAGTCTTCAAG-1,Monocytes +NHSIL12_TTAGTTCAGGAATTAC-1,Monocytes +NHSIL12_TTAGTTCCACTCGACG-1,Monocytes +NHSIL12_TTAGTTCGTTGCGCAC-1,Monocytes +NHSIL12_TTAGTTCTCTGGAGCC-1,Monocytes +NHSIL12_TTATGCTAGAAGGTGA-1,Monocytes +NHSIL12_TTCCCAGAGAATAGGG-1,Monocytes +NHSIL12_TTCGAAGAGGATTCGG-1,Monocytes +NHSIL12_TTCGAAGCACAACGCC-1,Monocytes +NHSIL12_TTCGAAGGTGTGAAAT-1,Monocytes +NHSIL12_TTCGGTCGTTCTCATT-1,Monocytes +NHSIL12_TTCTACAGTCTTGTCC-1,Dendritic cells +NHSIL12_TTCTACAGTTACGACT-1,Monocytes +NHSIL12_TTCTCAACAAGCCGCT-1,Monocytes +NHSIL12_TTCTCAACAATGGAGC-1,Macrophages +NHSIL12_TTCTCCTAGATGCGAC-1,Macrophages +NHSIL12_TTCTCCTCAAGTCTAC-1,Monocytes +NHSIL12_TTCTTAGCATCCCATC-1,Monocytes +NHSIL12_TTCTTAGGTCAGTGGA-1,T cells +NHSIL12_TTCTTAGTCAGGTAAA-1,Macrophages +NHSIL12_TTGAACGAGTTCCACA-1,Monocytes +NHSIL12_TTGAACGGTAAGTGGC-1,Monocytes +NHSIL12_TTGAACGGTCCTGCTT-1,Monocytes +NHSIL12_TTGAACGTCGAACTGT-1,Monocytes +NHSIL12_TTGACTTAGCGTGAGT-1,Monocytes +NHSIL12_TTGCGTCGTAAGAGAG-1,Monocytes +NHSIL12_TTGGAACAGTCCTCCT-1,Granulocytes +NHSIL12_TTGGAACTCGTATCAG-1,Monocytes +NHSIL12_TTGGAACTCTGCAAGT-1,Dendritic cells +NHSIL12_TTGGCAACACACTGCG-1,Monocytes +NHSIL12_TTGTAGGGTTAAGATG-1,Granulocytes +NHSIL12_TTGTAGGTCCGCAAGC-1,Monocytes +NHSIL12_TTTACTGAGTCCCACG-1,Monocytes +NHSIL12_TTTACTGGTCGCCATG-1,NK cells +NHSIL12_TTTACTGGTTGGGACA-1,Monocytes +NHSIL12_TTTATGCAGGCTACGA-1,Monocytes +NHSIL12_TTTATGCCAAAGAATC-1,Dendritic cells +NHSIL12_TTTATGCGTACCATCA-1,Monocytes +NHSIL12_TTTATGCGTGAACCTT-1,Monocytes +NHSIL12_TTTGCGCAGCACAGGT-1,Monocytes +NHSIL12_TTTGCGCAGCTACCTA-1,Monocytes +NHSIL12_TTTGCGCGTGACCAAG-1,Monocytes +NHSIL12_TTTGCGCGTTGTGGAG-1,Monocytes +NHSIL12_TTTGGTTGTAAGGGCT-1,Macrophages +NHSIL12_TTTGGTTTCATGTGGT-1,Monocytes +NHSIL12_TTTGTCAAGAGTACCG-1,Monocytes +NHSIL12_TTTGTCACAGTAAGCG-1,Monocytes +NHSIL12_TTTGTCAGTAAGGATT-1,Monocytes +Combo_AAACCTGAGAGTACAT-1,Monocytes +Combo_AAACCTGAGCGTTCCG-1,Granulocytes +Combo_AAACCTGAGCGTTTAC-1,Dendritic cells +Combo_AAACCTGAGGAGTTGC-1,Monocytes +Combo_AAACCTGAGGCTCAGA-1,Dendritic cells +Combo_AAACCTGCACCGATAT-1,Monocytes +Combo_AAACCTGCATCTCGCT-1,Dendritic cells +Combo_AAACCTGCATGCTAGT-1,Monocytes +Combo_AAACCTGTCAGCACAT-1,Monocytes +Combo_AAACCTGTCGTTACGA-1,Dendritic cells +Combo_AAACCTGTCTACTATC-1,Monocytes +Combo_AAACGGGAGAAGGTTT-1,Monocytes +Combo_AAACGGGAGAATCTCC-1,Dendritic cells +Combo_AAACGGGAGGAATTAC-1,Monocytes +Combo_AAACGGGCAGTAACGG-1,T cells +Combo_AAACGGGGTCGCATCG-1,Dendritic cells +Combo_AAACGGGGTCTTGTCC-1,Monocytes +Combo_AAACGGGGTGAGTATA-1,Granulocytes +Combo_AAACGGGGTGGAAAGA-1,Monocytes +Combo_AAACGGGGTGTATGGG-1,Monocytes +Combo_AAACGGGGTTACGGAG-1,Monocytes +Combo_AAAGATGAGTAAGTAC-1,Dendritic cells +Combo_AAAGATGAGTACGATA-1,Monocytes +Combo_AAAGATGAGTCTCAAC-1,Monocytes +Combo_AAAGATGCACATTTCT-1,Monocytes +Combo_AAAGATGCACCCATGG-1,Granulocytes +Combo_AAAGATGGTGAGGGTT-1,Monocytes +Combo_AAAGATGGTGTGACGA-1,T cells +Combo_AAAGATGGTTTCCACC-1,Monocytes +Combo_AAAGATGTCCAGATCA-1,Monocytes +Combo_AAAGATGTCCCGGATG-1,Monocytes +Combo_AAAGATGTCTAACGGT-1,Monocytes +Combo_AAAGCAACAAGTTAAG-1,Dendritic cells +Combo_AAAGCAACACGGCTAC-1,Monocytes +Combo_AAAGCAACACGGTTTA-1,Monocytes +Combo_AAAGCAACAGTGGAGT-1,Granulocytes +Combo_AAAGCAAGTCTGCCAG-1,Dendritic cells +Combo_AAAGCAAGTGTTCTTT-1,Dendritic cells +Combo_AAAGCAATCACCATAG-1,Granulocytes +Combo_AAAGTAGAGCTACCTA-1,Monocytes +Combo_AAAGTAGCAAGCTGTT-1,Monocytes +Combo_AAAGTAGCAATGGACG-1,Dendritic cells +Combo_AAAGTAGCACATGTGT-1,Monocytes +Combo_AAAGTAGCATTAGGCT-1,Monocytes +Combo_AAAGTAGGTCCGAACC-1,Monocytes +Combo_AAAGTAGGTGTGACCC-1,Macrophages +Combo_AAAGTAGTCACCAGGC-1,Dendritic cells +Combo_AAAGTAGTCATCGGAT-1,Granulocytes +Combo_AAAGTAGTCTATGTGG-1,Dendritic cells +Combo_AAATGCCAGAAGAAGC-1,Monocytes +Combo_AAATGCCAGCGACGTA-1,Monocytes +Combo_AAATGCCCAAAGTCAA-1,Monocytes +Combo_AAATGCCCAAGTACCT-1,T cells +Combo_AAATGCCCAATAACGA-1,Monocytes +Combo_AAATGCCGTCTAACGT-1,Monocytes +Combo_AAATGCCGTGTTCTTT-1,Monocytes +Combo_AAATGCCTCACAACGT-1,Monocytes +Combo_AAATGCCTCGCCGTGA-1,Monocytes +Combo_AAATGCCTCGTTGCCT-1,Monocytes +Combo_AAATGCCTCTGGCGAC-1,Monocytes +Combo_AAATGCCTCTTGCAAG-1,Monocytes +Combo_AACACGTAGAGATGAG-1,Granulocytes +Combo_AACACGTAGCTAGTGG-1,Monocytes +Combo_AACACGTAGTTCGCGC-1,Monocytes +Combo_AACACGTCACTTAAGC-1,Dendritic cells +Combo_AACACGTCATGAACCT-1,Granulocytes +Combo_AACACGTTCACAAACC-1,Granulocytes +Combo_AACACGTTCATGCATG-1,Monocytes +Combo_AACACGTTCCAAACAC-1,Monocytes +Combo_AACACGTTCTTCTGGC-1,Monocytes +Combo_AACCATGAGCCACGCT-1,Monocytes +Combo_AACCATGAGGTGGGTT-1,Granulocytes +Combo_AACCATGCAAGCGATG-1,Granulocytes +Combo_AACCATGCACATGTGT-1,Granulocytes +Combo_AACCATGCACGAAAGC-1,Granulocytes +Combo_AACCATGGTAGCGCAA-1,Monocytes +Combo_AACCATGGTCACAAGG-1,Monocytes +Combo_AACCATGGTCATCCCT-1,Monocytes +Combo_AACCATGGTCTCCCTA-1,Monocytes +Combo_AACCATGTCAGAGCTT-1,Dendritic cells +Combo_AACCATGTCGTACCGG-1,Dendritic cells +Combo_AACCGCGAGCAGCCTC-1,Dendritic cells +Combo_AACCGCGTCTTGTCAT-1,Monocytes +Combo_AACGTTGAGGGTGTGT-1,Granulocytes +Combo_AACGTTGAGTAGGTGC-1,Monocytes +Combo_AACGTTGCACTCTGTC-1,Dendritic cells +Combo_AACGTTGCAGGTCGTC-1,Monocytes +Combo_AACGTTGGTACACCGC-1,Dendritic cells +Combo_AACGTTGGTAGTACCT-1,Dendritic cells +Combo_AACGTTGGTCTGGAGA-1,Monocytes +Combo_AACGTTGGTGCACCAC-1,Dendritic cells +Combo_AACGTTGGTTCCCTTG-1,Monocytes +Combo_AACGTTGTCAATCACG-1,Monocytes +Combo_AACTCAGAGAAACGCC-1,Granulocytes +Combo_AACTCAGAGATGTGTA-1,Monocytes +Combo_AACTCAGCAAAGGTGC-1,Macrophages +Combo_AACTCAGTCACTCCTG-1,Monocytes +Combo_AACTCAGTCTCGCTTG-1,Monocytes +Combo_AACTCCCAGATATGGT-1,Monocytes +Combo_AACTCCCCAGTCGTGC-1,Granulocytes +Combo_AACTCCCCATGCGCAC-1,Granulocytes +Combo_AACTCCCGTTTACTCT-1,Granulocytes +Combo_AACTCCCTCACCTTAT-1,Monocytes +Combo_AACTCCCTCGTTGCCT-1,Monocytes +Combo_AACTCTTCATTTCAGG-1,Macrophages +Combo_AACTCTTTCGATGAGG-1,Monocytes +Combo_AACTCTTTCGTCTGCT-1,Monocytes +Combo_AACTGGTAGAGGGCTT-1,Monocytes +Combo_AACTGGTCATATACGC-1,Monocytes +Combo_AACTGGTGTAGGGTAC-1,Dendritic cells +Combo_AACTGGTTCAGCTGGC-1,Monocytes +Combo_AACTGGTTCCAAATGC-1,Monocytes +Combo_AACTTTCAGGATCGCA-1,Granulocytes +Combo_AACTTTCCAGGGTATG-1,Macrophages +Combo_AACTTTCGTTATGTGC-1,Monocytes +Combo_AAGACCTAGACAAAGG-1,Monocytes +Combo_AAGACCTAGTAGCGGT-1,Monocytes +Combo_AAGACCTCAGGGAGAG-1,Dendritic cells +Combo_AAGACCTCATGGGACA-1,Dendritic cells +Combo_AAGACCTCATTGTGCA-1,Monocytes +Combo_AAGACCTGTATATGGA-1,Monocytes +Combo_AAGACCTGTGGCCCTA-1,Monocytes +Combo_AAGACCTTCACTATTC-1,Dendritic cells +Combo_AAGACCTTCCCTAACC-1,Monocytes +Combo_AAGCCGCAGAATGTGT-1,Monocytes +Combo_AAGCCGCAGCAATATG-1,Monocytes +Combo_AAGCCGCAGTCAATAG-1,Dendritic cells +Combo_AAGCCGCAGTGTCCCG-1,Monocytes +Combo_AAGCCGCCAAGAGGCT-1,Monocytes +Combo_AAGCCGCCACATTAGC-1,Monocytes +Combo_AAGCCGCGTAGAGTGC-1,Dendritic cells +Combo_AAGCCGCGTCTCCACT-1,Granulocytes +Combo_AAGCCGCGTCTCCATC-1,Dendritic cells +Combo_AAGCCGCTCAACACGT-1,Granulocytes +Combo_AAGCCGCTCCTGTACC-1,Monocytes +Combo_AAGGAGCAGATACACA-1,Dendritic cells +Combo_AAGGAGCCAGACACTT-1,Monocytes +Combo_AAGGAGCCATGACATC-1,Monocytes +Combo_AAGGAGCTCAACACTG-1,Monocytes +Combo_AAGGAGCTCAATAAGG-1,Monocytes +Combo_AAGGAGCTCACGATGT-1,Monocytes +Combo_AAGGCAGAGCGTTGCC-1,Dendritic cells +Combo_AAGGCAGAGTGCAAGC-1,Granulocytes +Combo_AAGGCAGCAAAGAATC-1,Granulocytes +Combo_AAGGCAGCACCTTGTC-1,Dendritic cells +Combo_AAGGCAGGTAAGTGGC-1,Monocytes +Combo_AAGGCAGGTGAGTATA-1,Granulocytes +Combo_AAGGCAGGTTACGTCA-1,Monocytes +Combo_AAGGCAGGTTACTGAC-1,Granulocytes +Combo_AAGGCAGTCCTGCTTG-1,Monocytes +Combo_AAGGCAGTCGAATGCT-1,Monocytes +Combo_AAGGTTCAGCTCTCGG-1,Monocytes +Combo_AAGGTTCAGGTAGCCA-1,Monocytes +Combo_AAGGTTCCACGGCCAT-1,Monocytes +Combo_AAGGTTCCAGCATACT-1,T cells +Combo_AAGGTTCCAGGATCGA-1,Monocytes +Combo_AAGGTTCGTATCGCAT-1,Granulocytes +Combo_AAGGTTCGTTCGAATC-1,Dendritic cells +Combo_AAGGTTCGTTCGTTGA-1,Monocytes +Combo_AAGGTTCTCGGATGTT-1,Dendritic cells +Combo_AAGGTTCTCGTAGGAG-1,Dendritic cells +Combo_AAGTCTGAGCAGATCG-1,Monocytes +Combo_AAGTCTGCAACACCCG-1,Granulocytes +Combo_AAGTCTGCAAGCCGCT-1,Granulocytes +Combo_AAGTCTGCATCGTCGG-1,Monocytes +Combo_AAGTCTGGTCAATACC-1,Monocytes +Combo_AAGTCTGTCCCACTTG-1,Monocytes +Combo_AAGTCTGTCTTCATGT-1,Monocytes +Combo_AATCCAGAGCTGGAAC-1,Dendritic cells +Combo_AATCCAGAGGCCCTTG-1,Monocytes +Combo_AATCCAGCAAAGGTGC-1,Monocytes +Combo_AATCCAGCACAAGACG-1,Monocytes +Combo_AATCCAGCACGGTGTC-1,Monocytes +Combo_AATCCAGCAGGTTTCA-1,Dendritic cells +Combo_AATCCAGGTGGAAAGA-1,Granulocytes +Combo_AATCCAGTCCAAGCCG-1,Dendritic cells +Combo_AATCGGTAGAAGGGTA-1,Dendritic cells +Combo_AATCGGTAGTCCGTAT-1,Monocytes +Combo_AATCGGTCACGACGAA-1,Monocytes +Combo_AATCGGTCAGGGTACA-1,Monocytes +Combo_AATCGGTCATTATCTC-1,Monocytes +Combo_AATCGGTTCCCAGGTG-1,Monocytes +Combo_AATCGGTTCTGAGGGA-1,Monocytes +Combo_AATCGGTTCTTCCTTC-1,Monocytes +Combo_ACACCAAAGGGAGTAA-1,Monocytes +Combo_ACACCAACAAGGGTCA-1,Granulocytes +Combo_ACACCAACAATGTTGC-1,Dendritic cells +Combo_ACACCAACATAACCTG-1,Monocytes +Combo_ACACCAAGTCGATTGT-1,Monocytes +Combo_ACACCAAGTGGTCTCG-1,Granulocytes +Combo_ACACCAAGTGTGGCTC-1,Granulocytes +Combo_ACACCAAGTTCTGGTA-1,Monocytes +Combo_ACACCAATCCAGTAGT-1,Dendritic cells +Combo_ACACCAATCCCACTTG-1,Monocytes +Combo_ACACCAATCCGCATAA-1,Monocytes +Combo_ACACCAATCCGTAGTA-1,Dendritic cells +Combo_ACACCAATCTGATACG-1,Monocytes +Combo_ACACCAATCTTGTCAT-1,Dendritic cells +Combo_ACACCCTAGATGCGAC-1,Monocytes +Combo_ACACCCTAGTAACCCT-1,Granulocytes +Combo_ACACCCTCACAGCGTC-1,Monocytes +Combo_ACACCCTCATCACAAC-1,Granulocytes +Combo_ACACCCTCATGTCTCC-1,Monocytes +Combo_ACACCCTGTCATATGC-1,Monocytes +Combo_ACACCCTGTCCTAGCG-1,Monocytes +Combo_ACACCCTGTTCCCTTG-1,Monocytes +Combo_ACACCCTTCACTATTC-1,Dendritic cells +Combo_ACACCGGAGGGAGTAA-1,Monocytes +Combo_ACACCGGCACGAAAGC-1,Dendritic cells +Combo_ACACCGGCACGGTGTC-1,Monocytes +Combo_ACACCGGGTATATGAG-1,Monocytes +Combo_ACACCGGGTCGACTAT-1,Monocytes +Combo_ACACCGGTCACCAGGC-1,Monocytes +Combo_ACACCGGTCGCCCTTA-1,Dendritic cells +Combo_ACACCGGTCGTGGACC-1,Monocytes +Combo_ACACTGAAGCTAGTGG-1,Granulocytes +Combo_ACACTGAAGCTCTCGG-1,Monocytes +Combo_ACACTGAAGGCCCTCA-1,T cells +Combo_ACACTGACATCCCATC-1,Dendritic cells +Combo_ACACTGACATTCACTT-1,Monocytes +Combo_ACACTGAGTCGGGTCT-1,Dendritic cells +Combo_ACACTGAGTTCGTCTC-1,Monocytes +Combo_ACACTGATCAATAAGG-1,Granulocytes +Combo_ACACTGATCCGTACAA-1,Granulocytes +Combo_ACAGCCGAGAAACGAG-1,Monocytes +Combo_ACAGCCGAGAATTGTG-1,Dendritic cells +Combo_ACAGCCGAGCGTGAAC-1,Granulocytes +Combo_ACAGCCGAGGCAAAGA-1,Granulocytes +Combo_ACAGCCGAGGGTTCCC-1,Monocytes +Combo_ACAGCCGAGTGAACGC-1,Monocytes +Combo_ACAGCCGCATCGATGT-1,Monocytes +Combo_ACAGCCGGTACTTAGC-1,Monocytes +Combo_ACAGCCGGTCAAAGCG-1,Monocytes +Combo_ACAGCCGGTGTCCTCT-1,Dendritic cells +Combo_ACAGCCGGTTACGCGC-1,Dendritic cells +Combo_ACAGCCGTCAAACAAG-1,Monocytes +Combo_ACAGCCGTCAACGGGA-1,Monocytes +Combo_ACAGCCGTCCACGAAT-1,Monocytes +Combo_ACAGCTAAGAAGAAGC-1,Monocytes +Combo_ACAGCTAAGCACGCCT-1,Dendritic cells +Combo_ACAGCTAAGGGTCGAT-1,Monocytes +Combo_ACAGCTAAGTCAATAG-1,Monocytes +Combo_ACAGCTACAACAACCT-1,Monocytes +Combo_ACAGCTACAAGGTGTG-1,Dendritic cells +Combo_ACAGCTACACAACGTT-1,Monocytes +Combo_ACAGCTAGTAAACCTC-1,Monocytes +Combo_ACAGCTAGTACCGGCT-1,Granulocytes +Combo_ACAGCTAGTAGCTAAA-1,Monocytes +Combo_ACAGCTAGTCTCCACT-1,Monocytes +Combo_ACAGCTATCCTTTACA-1,Monocytes +Combo_ACATACGAGAGAGCTC-1,Monocytes +Combo_ACATACGAGGAGCGAG-1,Monocytes +Combo_ACATACGAGGCCCTTG-1,Dendritic cells +Combo_ACATACGCACATCCAA-1,Monocytes +Combo_ACATACGGTAGCACGA-1,Dendritic cells +Combo_ACATACGGTAGCGTAG-1,Monocytes +Combo_ACATACGGTCCAACTA-1,Monocytes +Combo_ACATACGGTCTGGTCG-1,Monocytes +Combo_ACATACGGTTAGATGA-1,Monocytes +Combo_ACATCAGAGATAGGAG-1,Dendritic cells +Combo_ACATCAGAGTTGTCGT-1,Monocytes +Combo_ACATCAGCAAAGGCGT-1,Monocytes +Combo_ACATCAGTCGGGAGTA-1,Monocytes +Combo_ACATGGTAGAGTACCG-1,Dendritic cells +Combo_ACATGGTAGATGCCAG-1,Monocytes +Combo_ACATGGTAGCACACAG-1,Dendritic cells +Combo_ACATGGTAGCTAGCCC-1,Monocytes +Combo_ACATGGTCAAATACAG-1,Monocytes +Combo_ACATGGTGTCCTCTTG-1,Dendritic cells +Combo_ACATGGTGTTAAGATG-1,Monocytes +Combo_ACATGGTGTTACAGAA-1,Monocytes +Combo_ACATGGTGTTCGCTAA-1,Monocytes +Combo_ACATGGTTCCTTGCCA-1,Granulocytes +Combo_ACATGGTTCTTGTACT-1,Granulocytes +Combo_ACCAGTAAGCTGAAAT-1,Dendritic cells +Combo_ACCAGTAAGCTGTTCA-1,Monocytes +Combo_ACCAGTAAGGTGACCA-1,Monocytes +Combo_ACCAGTACAAATACAG-1,Dendritic cells +Combo_ACCAGTACAACGCACC-1,Monocytes +Combo_ACCAGTACACGAAACG-1,T cells +Combo_ACCAGTACAGATCCAT-1,Monocytes +Combo_ACCAGTACAGGTGGAT-1,Monocytes +Combo_ACCAGTAGTAATTGGA-1,Dendritic cells +Combo_ACCAGTAGTCATGCAT-1,Monocytes +Combo_ACCAGTAGTGGTCTCG-1,Monocytes +Combo_ACCAGTATCGCCTGAG-1,Dendritic cells +Combo_ACCCACTAGAAGGCCT-1,Monocytes +Combo_ACCCACTCAGCTTAAC-1,Monocytes +Combo_ACCCACTCATCGGGTC-1,Granulocytes +Combo_ACCCACTGTCAATGTC-1,T cells +Combo_ACCCACTTCAAGGTAA-1,Monocytes +Combo_ACCCACTTCCATGAAC-1,Granulocytes +Combo_ACCGTAAAGCAAATCA-1,Dendritic cells +Combo_ACCGTAAAGGCAGGTT-1,Monocytes +Combo_ACCGTAAAGGCTATCT-1,Dendritic cells +Combo_ACCGTAAAGGGAAACA-1,Monocytes +Combo_ACCGTAACAGCCTTGG-1,Monocytes +Combo_ACCGTAAGTCACCCAG-1,Dendritic cells +Combo_ACCGTAAGTCTGCGGT-1,Monocytes +Combo_ACCGTAAGTTAAGAAC-1,Granulocytes +Combo_ACCGTAAGTTTCGCTC-1,Monocytes +Combo_ACCGTAATCACTCCTG-1,Monocytes +Combo_ACCTTTAAGACAGACC-1,Monocytes +Combo_ACCTTTAAGCTGCAAG-1,Monocytes +Combo_ACCTTTAAGTAGGTGC-1,Monocytes +Combo_ACCTTTAAGTGTACCT-1,Dendritic cells +Combo_ACCTTTACAGCTGTGC-1,Monocytes +Combo_ACCTTTACATATGCTG-1,Monocytes +Combo_ACCTTTAGTAAGAGGA-1,Monocytes +Combo_ACCTTTAGTCTGCGGT-1,Dendritic cells +Combo_ACCTTTAGTGCTTCTC-1,Monocytes +Combo_ACCTTTAGTGGTAACG-1,Monocytes +Combo_ACCTTTAGTTTGACTG-1,Dendritic cells +Combo_ACCTTTATCTCAAGTG-1,Dendritic cells +Combo_ACGAGCCAGAAAGTGG-1,Granulocytes +Combo_ACGAGCCAGCATCATC-1,Dendritic cells +Combo_ACGAGCCAGCCGATTT-1,Monocytes +Combo_ACGAGCCAGCTCCTTC-1,Monocytes +Combo_ACGAGCCAGCTGCGAA-1,Monocytes +Combo_ACGAGCCAGGAATTAC-1,Monocytes +Combo_ACGAGCCCAATGTAAG-1,Monocytes +Combo_ACGAGCCGTACAGACG-1,T cells +Combo_ACGAGCCGTCCAGTAT-1,Monocytes +Combo_ACGAGCCGTTTGCATG-1,Monocytes +Combo_ACGAGCCTCGTCACGG-1,Monocytes +Combo_ACGAGCCTCTCTTATG-1,Monocytes +Combo_ACGAGGAAGTCAAGGC-1,Monocytes +Combo_ACGAGGACACATAACC-1,Monocytes +Combo_ACGAGGAGTCTCACCT-1,Monocytes +Combo_ACGAGGATCGGAAACG-1,Granulocytes +Combo_ACGATACAGACTAAGT-1,Granulocytes +Combo_ACGATACAGGGCTCTC-1,Dendritic cells +Combo_ACGATACAGGGTTTCT-1,Dendritic cells +Combo_ACGATACAGGTTCCTA-1,Granulocytes +Combo_ACGATACAGTGACTCT-1,Monocytes +Combo_ACGATACCAGATGGCA-1,Monocytes +Combo_ACGATACGTAGCGTGA-1,Monocytes +Combo_ACGATACTCTTTACAC-1,Monocytes +Combo_ACGATGTAGGGTATCG-1,Macrophages +Combo_ACGATGTCAAGTAGTA-1,Granulocytes +Combo_ACGATGTCACTACAGT-1,Monocytes +Combo_ACGATGTCAGTATGCT-1,Granulocytes +Combo_ACGATGTCATCTGGTA-1,Monocytes +Combo_ACGATGTGTAATCACC-1,Granulocytes +Combo_ACGATGTGTCGTCTTC-1,Granulocytes +Combo_ACGATGTGTGTGAATA-1,Monocytes +Combo_ACGCAGCAGATACACA-1,T cells +Combo_ACGCAGCAGCTCCTCT-1,Monocytes +Combo_ACGCAGCAGTAGCGGT-1,Granulocytes +Combo_ACGCAGCAGTGACTCT-1,Monocytes +Combo_ACGCAGCAGTGGTCCC-1,Monocytes +Combo_ACGCAGCCACCCATTC-1,Monocytes +Combo_ACGCAGCCACGAAGCA-1,Granulocytes +Combo_ACGCAGCCAGATCGGA-1,Dendritic cells +Combo_ACGCAGCCAGGCAGTA-1,Granulocytes +Combo_ACGCAGCGTCACAAGG-1,Monocytes +Combo_ACGCAGCTCGGTCCGA-1,Dendritic cells +Combo_ACGCCAGAGGGATGGG-1,Monocytes +Combo_ACGCCAGAGTTTCCTT-1,Monocytes +Combo_ACGCCAGCACCCAGTG-1,Monocytes +Combo_ACGCCAGGTAGGCATG-1,Monocytes +Combo_ACGCCAGGTCACCCAG-1,Granulocytes +Combo_ACGCCAGGTCGTGGCT-1,Monocytes +Combo_ACGCCAGGTTCAGACT-1,Monocytes +Combo_ACGCCAGTCGCTAGCG-1,Monocytes +Combo_ACGCCAGTCTCGAGTA-1,Monocytes +Combo_ACGCCGAAGGACCACA-1,Fibroblasts +Combo_ACGCCGACAATAACGA-1,Monocytes +Combo_ACGCCGACACGGCGTT-1,Monocytes +Combo_ACGCCGACATGGTAGG-1,Monocytes +Combo_ACGCCGAGTACAGACG-1,Dendritic cells +Combo_ACGCCGAGTCAAGCGA-1,Granulocytes +Combo_ACGCCGATCATCACCC-1,Granulocytes +Combo_ACGCCGATCCGTCATC-1,Monocytes +Combo_ACGCCGATCCTACAGA-1,Monocytes +Combo_ACGCCGATCGGGAGTA-1,Monocytes +Combo_ACGCCGATCTGAAAGA-1,Monocytes +Combo_ACGGAGAAGATATACG-1,Monocytes +Combo_ACGGAGAAGATCGATA-1,Monocytes +Combo_ACGGAGAAGCCTATGT-1,Granulocytes +Combo_ACGGAGAAGGATGGAA-1,Monocytes +Combo_ACGGAGAGTCATATGC-1,Granulocytes +Combo_ACGGAGATCAATAAGG-1,Monocytes +Combo_ACGGAGATCCAAGCCG-1,Dendritic cells +Combo_ACGGAGATCCCTCTTT-1,Granulocytes +Combo_ACGGCCAAGTCAAGCG-1,Granulocytes +Combo_ACGGCCAAGTGGGCTA-1,Monocytes +Combo_ACGGCCACACCCTATC-1,Monocytes +Combo_ACGGCCAGTACGAAAT-1,Monocytes +Combo_ACGGCCAGTATAATGG-1,Monocytes +Combo_ACGGCCAGTGCCTGCA-1,Dendritic cells +Combo_ACGGCCAGTGCCTGTG-1,Monocytes +Combo_ACGGCCAGTTAGAACA-1,Dendritic cells +Combo_ACGGCCAGTTAGATGA-1,Dendritic cells +Combo_ACGGCCATCCAGATCA-1,Granulocytes +Combo_ACGGCCATCGTTTAGG-1,Dendritic cells +Combo_ACGGCCATCTTGAGAC-1,Monocytes +Combo_ACGGGCTAGCGAAGGG-1,Granulocytes +Combo_ACGGGCTAGGGAGTAA-1,Monocytes +Combo_ACGGGCTCAGGTCTCG-1,Macrophages +Combo_ACGGGCTGTAAACCTC-1,Monocytes +Combo_ACGGGCTGTCGCCATG-1,Dendritic cells +Combo_ACGGGCTTCAACCATG-1,Granulocytes +Combo_ACGGGCTTCCGCAAGC-1,Granulocytes +Combo_ACGGGTCAGAGTACAT-1,T cells +Combo_ACGGGTCAGTCTTGCA-1,Granulocytes +Combo_ACGGGTCAGTGACATA-1,Dendritic cells +Combo_ACGGGTCGTAAATGAC-1,Monocytes +Combo_ACGGGTCGTAAGTGGC-1,Dendritic cells +Combo_ACGGGTCGTCTCTTAT-1,Monocytes +Combo_ACGGGTCTCCTATGTT-1,Monocytes +Combo_ACGGGTCTCGAGAGCA-1,Monocytes +Combo_ACGGGTCTCGTACGGC-1,Monocytes +Combo_ACGGGTCTCGTTGCCT-1,Dendritic cells +Combo_ACGTCAAAGACACGAC-1,Granulocytes +Combo_ACGTCAAAGATGGGTC-1,Monocytes +Combo_ACGTCAAAGATGTGTA-1,Monocytes +Combo_ACGTCAAAGCCCAACC-1,Monocytes +Combo_ACGTCAAAGGCATGGT-1,Monocytes +Combo_ACGTCAAGTCCAACTA-1,Monocytes +Combo_ACGTCAAGTGCCTGTG-1,Monocytes +Combo_ACGTCAAGTTTGTGTG-1,Macrophages +Combo_ACGTCAATCAACTCTT-1,Granulocytes +Combo_ACGTCAATCCGCAAGC-1,Granulocytes +Combo_ACGTCAATCGCACTCT-1,Granulocytes +Combo_ACTATCTAGAGGTACC-1,Monocytes +Combo_ACTATCTAGATGAGAG-1,Dendritic cells +Combo_ACTATCTCAGTCTTCC-1,T cells +Combo_ACTATCTCATATGCTG-1,Dendritic cells +Combo_ACTATCTGTATTCGTG-1,Monocytes +Combo_ACTATCTGTGGTAACG-1,Dendritic cells +Combo_ACTATCTTCCACGTTC-1,Monocytes +Combo_ACTGAACAGACAAAGG-1,Monocytes +Combo_ACTGAACAGACGCAAC-1,Monocytes +Combo_ACTGAACAGAGGTAGA-1,Monocytes +Combo_ACTGAACAGCATCATC-1,Macrophages +Combo_ACTGAACAGGTGCTTT-1,Monocytes +Combo_ACTGAACCAATAGCGG-1,Monocytes +Combo_ACTGAACCAGCTGTAT-1,Granulocytes +Combo_ACTGAGTCACGCCAGT-1,Granulocytes +Combo_ACTGAGTCAGTATAAG-1,Granulocytes +Combo_ACTGAGTGTCAGGACA-1,Monocytes +Combo_ACTGAGTGTGAGGGTT-1,Dendritic cells +Combo_ACTGAGTGTTAAAGTG-1,Granulocytes +Combo_ACTGAGTTCCAAAGTC-1,Monocytes +Combo_ACTGATGAGTCCTCCT-1,T cells +Combo_ACTGATGCAACAACCT-1,Monocytes +Combo_ACTGATGCACGACTCG-1,Monocytes +Combo_ACTGATGGTCACTTCC-1,Granulocytes +Combo_ACTGATGTCGGAGCAA-1,Monocytes +Combo_ACTGATGTCGTAGATC-1,Monocytes +Combo_ACTGATGTCTCGCTTG-1,Monocytes +Combo_ACTGATGTCTTCAACT-1,Dendritic cells +Combo_ACTGCTCAGCACCGTC-1,Monocytes +Combo_ACTGCTCAGCCGTCGT-1,Monocytes +Combo_ACTGCTCAGGTCGGAT-1,Monocytes +Combo_ACTGCTCCAAGTCTAC-1,Monocytes +Combo_ACTGCTCCACGGTAGA-1,Granulocytes +Combo_ACTGCTCCACTATCTT-1,Monocytes +Combo_ACTGCTCCATACGCCG-1,Monocytes +Combo_ACTGCTCGTGCTCTTC-1,Monocytes +Combo_ACTGCTCTCAACACTG-1,Granulocytes +Combo_ACTGCTCTCTACCAGA-1,Monocytes +Combo_ACTGTCCAGAATCTCC-1,Monocytes +Combo_ACTGTCCAGCTGTTCA-1,Granulocytes +Combo_ACTGTCCCATGGTAGG-1,Monocytes +Combo_ACTGTCCGTATAGTAG-1,Monocytes +Combo_ACTGTCCGTCTAACGT-1,Monocytes +Combo_ACTGTCCTCGACCAGC-1,Monocytes +Combo_ACTGTCCTCGGGAGTA-1,Granulocytes +Combo_ACTTACTAGATAGGAG-1,Monocytes +Combo_ACTTACTAGCCACGTC-1,Monocytes +Combo_ACTTACTAGTAACCCT-1,Granulocytes +Combo_ACTTACTGTGACTCAT-1,Dendritic cells +Combo_ACTTACTGTGGAAAGA-1,Monocytes +Combo_ACTTACTTCTGTTTGT-1,Monocytes +Combo_ACTTGTTAGATGTGTA-1,Monocytes +Combo_ACTTGTTAGGAGTCTG-1,Monocytes +Combo_ACTTGTTAGTTTAGGA-1,Granulocytes +Combo_ACTTGTTCATAGAAAC-1,Monocytes +Combo_ACTTGTTCATGTTGAC-1,Granulocytes +Combo_ACTTGTTGTAAACCTC-1,Monocytes +Combo_ACTTGTTGTGATGCCC-1,Monocytes +Combo_ACTTGTTGTTAGTGGG-1,Monocytes +Combo_ACTTGTTTCGGTTCGG-1,Monocytes +Combo_ACTTTCAAGACGACGT-1,Monocytes +Combo_ACTTTCAAGTTAGGTA-1,Granulocytes +Combo_ACTTTCAGTACTTCTT-1,Granulocytes +Combo_AGAATAGCATAGACTC-1,Dendritic cells +Combo_AGAATAGGTAAACGCG-1,Monocytes +Combo_AGAATAGTCAGTTTGG-1,Monocytes +Combo_AGAATAGTCTACTCAT-1,Monocytes +Combo_AGACGTTAGACCTTTG-1,Dendritic cells +Combo_AGACGTTAGCCACGTC-1,Monocytes +Combo_AGACGTTAGCTGTTCA-1,Macrophages +Combo_AGACGTTCAAACGTGG-1,Granulocytes +Combo_AGACGTTCAAGAGTCG-1,Monocytes +Combo_AGACGTTCAGCCTGTG-1,Granulocytes +Combo_AGACGTTCAGTACACT-1,Dendritic cells +Combo_AGACGTTGTAGCGATG-1,Monocytes +Combo_AGACGTTGTATATCCG-1,Monocytes +Combo_AGACGTTGTCTCACCT-1,Dendritic cells +Combo_AGACGTTGTTGAACTC-1,Monocytes +Combo_AGACGTTGTTGCTCCT-1,Dendritic cells +Combo_AGAGCGAAGGAGCGTT-1,Monocytes +Combo_AGAGCGACACATTCGA-1,Monocytes +Combo_AGAGCGACACCGAAAG-1,Dendritic cells +Combo_AGAGCGACACGGTGTC-1,Monocytes +Combo_AGAGCGACAGCCACCA-1,T cells +Combo_AGAGCGACATACGCTA-1,Granulocytes +Combo_AGAGCGAGTAGAGTGC-1,Monocytes +Combo_AGAGCGAGTCCGAAGA-1,Monocytes +Combo_AGAGCGAGTTCGAATC-1,Monocytes +Combo_AGAGCGAGTTCTGGTA-1,Monocytes +Combo_AGAGCGATCAGCACAT-1,Monocytes +Combo_AGAGCGATCGGCTTGG-1,Monocytes +Combo_AGAGCTTAGATCCCGC-1,Monocytes +Combo_AGAGCTTCAGCTGGCT-1,Monocytes +Combo_AGAGCTTCATTGTGCA-1,Monocytes +Combo_AGAGCTTGTAGGCTGA-1,Monocytes +Combo_AGAGCTTGTCAACATC-1,T cells +Combo_AGAGCTTGTCATTAGC-1,Monocytes +Combo_AGAGCTTGTTAGATGA-1,Monocytes +Combo_AGAGCTTTCCAGTATG-1,T cells +Combo_AGAGTGGAGACTTTCG-1,Monocytes +Combo_AGAGTGGAGGCCGAAT-1,Monocytes +Combo_AGAGTGGAGTAGATGT-1,Monocytes +Combo_AGAGTGGCACTACAGT-1,Monocytes +Combo_AGAGTGGGTCTCTTAT-1,Monocytes +Combo_AGAGTGGGTGCGAAAC-1,Monocytes +Combo_AGAGTGGTCAACGAAA-1,Monocytes +Combo_AGAGTGGTCAGTCCCT-1,Granulocytes +Combo_AGAGTGGTCGATCCCT-1,Monocytes +Combo_AGATCTGAGAGGGATA-1,Monocytes +Combo_AGATCTGAGATGTGTA-1,Dendritic cells +Combo_AGATCTGAGCTACCGC-1,Monocytes +Combo_AGATCTGAGGGAAACA-1,Monocytes +Combo_AGATCTGAGTATCGAA-1,Monocytes +Combo_AGATCTGAGTATTGGA-1,Monocytes +Combo_AGATCTGCACCGAATT-1,Monocytes +Combo_AGATCTGGTCGAAAGC-1,Monocytes +Combo_AGATCTGGTTGAGTTC-1,Monocytes +Combo_AGATCTGTCAGCGACC-1,Dendritic cells +Combo_AGATCTGTCTCAAACG-1,Granulocytes +Combo_AGATTGCAGCTAGTCT-1,Dendritic cells +Combo_AGATTGCCAAGTCATC-1,Dendritic cells +Combo_AGATTGCCACGTCTCT-1,Granulocytes +Combo_AGATTGCCAGGAACGT-1,Granulocytes +Combo_AGATTGCCATCTACGA-1,Monocytes +Combo_AGATTGCTCACAACGT-1,Monocytes +Combo_AGCAGCCAGATGTAAC-1,Monocytes +Combo_AGCAGCCAGGGATCTG-1,Monocytes +Combo_AGCAGCCAGGGATGGG-1,Dendritic cells +Combo_AGCAGCCAGTGGACGT-1,Monocytes +Combo_AGCAGCCCAAGGACTG-1,Granulocytes +Combo_AGCAGCCCACCACCAG-1,Dendritic cells +Combo_AGCAGCCCAGTATGCT-1,Granulocytes +Combo_AGCAGCCGTAGAAGGA-1,Dendritic cells +Combo_AGCAGCCGTTGGTGGA-1,Monocytes +Combo_AGCAGCCTCTTCGGTC-1,Monocytes +Combo_AGCAGCCTCTTGGGTA-1,Dendritic cells +Combo_AGCATACAGCTAAACA-1,Monocytes +Combo_AGCATACCACCTTGTC-1,Granulocytes +Combo_AGCATACCATTCCTGC-1,Monocytes +Combo_AGCATACTCCAGTAGT-1,Monocytes +Combo_AGCATACTCCGTAGGC-1,Monocytes +Combo_AGCATACTCTTGCAAG-1,Monocytes +Combo_AGCCTAAAGATCTGAA-1,Dendritic cells +Combo_AGCCTAAAGCTAGCCC-1,Granulocytes +Combo_AGCCTAAAGTGCAAGC-1,Dendritic cells +Combo_AGCCTAAGTCATCCCT-1,Monocytes +Combo_AGCCTAAGTGCGATAG-1,Granulocytes +Combo_AGCCTAATCATCTGCC-1,Monocytes +Combo_AGCCTAATCCGAATGT-1,Granulocytes +Combo_AGCGGTCAGAAGAAGC-1,Monocytes +Combo_AGCGGTCAGCAGGTCA-1,Granulocytes +Combo_AGCGGTCAGCTATGCT-1,Monocytes +Combo_AGCGGTCAGTTCGCGC-1,Monocytes +Combo_AGCGGTCCAGGGCATA-1,Granulocytes +Combo_AGCGGTCCATTCTTAC-1,Monocytes +Combo_AGCGGTCGTCAGAATA-1,Monocytes +Combo_AGCGGTCGTCTCGTTC-1,Dendritic cells +Combo_AGCGGTCGTCTTCAAG-1,Monocytes +Combo_AGCGGTCGTGACGGTA-1,Monocytes +Combo_AGCGGTCGTTAAAGAC-1,Monocytes +Combo_AGCGGTCTCAAACCAC-1,Monocytes +Combo_AGCGGTCTCACCTCGT-1,Monocytes +Combo_AGCGGTCTCTTGTATC-1,Dendritic cells +Combo_AGCGTATAGAGGGATA-1,Dendritic cells +Combo_AGCGTATAGGAATGGA-1,Monocytes +Combo_AGCGTATCAAAGGTGC-1,Monocytes +Combo_AGCGTATCAGATCGGA-1,Monocytes +Combo_AGCGTATCAGTAAGCG-1,T cells +Combo_AGCGTATGTGCCTGTG-1,Monocytes +Combo_AGCGTATGTTCCCTTG-1,Monocytes +Combo_AGCGTATTCGTCTGCT-1,Monocytes +Combo_AGCGTATTCTGATACG-1,Dendritic cells +Combo_AGCGTCGAGGTGATAT-1,Monocytes +Combo_AGCGTCGCAGCCTTTC-1,Monocytes +Combo_AGCGTCGTCCAAATGC-1,Dendritic cells +Combo_AGCGTCGTCGAACGGA-1,Monocytes +Combo_AGCTCCTAGCCCAGCT-1,Dendritic cells +Combo_AGCTCCTCAATGAAAC-1,Monocytes +Combo_AGCTCCTCACGTCAGC-1,Monocytes +Combo_AGCTCCTGTGCAGACA-1,Dendritic cells +Combo_AGCTCCTGTGGAAAGA-1,Monocytes +Combo_AGCTCCTTCGCATGAT-1,Monocytes +Combo_AGCTCTCAGAGCTGGT-1,Granulocytes +Combo_AGCTCTCAGTGGTAAT-1,Monocytes +Combo_AGCTCTCCATAGGATA-1,Dendritic cells +Combo_AGCTCTCCATTAGCCA-1,Dendritic cells +Combo_AGCTCTCGTTCCTCCA-1,Granulocytes +Combo_AGCTCTCTCAGTACGT-1,Dendritic cells +Combo_AGCTCTCTCGGCGGTT-1,Monocytes +Combo_AGCTCTCTCTATCCTA-1,Monocytes +Combo_AGCTCTCTCTTCTGGC-1,Monocytes +Combo_AGCTTGAAGACGCACA-1,Granulocytes +Combo_AGCTTGACAAGTCTGT-1,Monocytes +Combo_AGCTTGACATCCAACA-1,Monocytes +Combo_AGCTTGAGTACCTACA-1,Monocytes +Combo_AGCTTGAGTGAGGCTA-1,Dendritic cells +Combo_AGCTTGATCCTTGGTC-1,Monocytes +Combo_AGCTTGATCTGCTTGC-1,Monocytes +Combo_AGGCCACCAAACCCAT-1,Monocytes +Combo_AGGCCACCAAGTCTGT-1,Monocytes +Combo_AGGCCACGTCCCGACA-1,Monocytes +Combo_AGGCCACGTCGGCATC-1,Monocytes +Combo_AGGCCACTCACGCATA-1,Dendritic cells +Combo_AGGCCACTCCGGGTGT-1,Monocytes +Combo_AGGCCACTCCTACAGA-1,Macrophages +Combo_AGGCCACTCTCCTATA-1,Monocytes +Combo_AGGCCACTCTTATCTG-1,Dendritic cells +Combo_AGGCCGTAGGAGTCTG-1,Dendritic cells +Combo_AGGCCGTCACAGCCCA-1,Granulocytes +Combo_AGGCCGTCACCGTTGG-1,Monocytes +Combo_AGGCCGTGTCATATGC-1,Granulocytes +Combo_AGGCCGTGTGATGTCT-1,Dendritic cells +Combo_AGGCCGTTCCAGAGGA-1,Dendritic cells +Combo_AGGCCGTTCGCTTAGA-1,Granulocytes +Combo_AGGGAGTAGCCACGCT-1,Monocytes +Combo_AGGGAGTAGGCATGGT-1,Monocytes +Combo_AGGGAGTAGGGATACC-1,Monocytes +Combo_AGGGAGTAGTGGTAGC-1,Granulocytes +Combo_AGGGAGTCAACTGCTA-1,Dendritic cells +Combo_AGGGAGTCATCCCACT-1,Monocytes +Combo_AGGGAGTCATCGGAAG-1,Monocytes +Combo_AGGGAGTGTATGAAAC-1,Granulocytes +Combo_AGGGAGTGTCACTTCC-1,Monocytes +Combo_AGGGAGTGTCTCGTTC-1,Dendritic cells +Combo_AGGGAGTGTTGATTGC-1,Dendritic cells +Combo_AGGGAGTGTTTGGGCC-1,Monocytes +Combo_AGGGAGTGTTTGTGTG-1,Dendritic cells +Combo_AGGGAGTTCATGTAGC-1,Monocytes +Combo_AGGGAGTTCGACAGCC-1,Monocytes +Combo_AGGGATGAGCAGCCTC-1,Monocytes +Combo_AGGGATGAGGGTATCG-1,Monocytes +Combo_AGGGATGAGTACGATA-1,Monocytes +Combo_AGGGATGAGTCGCCGT-1,Granulocytes +Combo_AGGGATGCAGGATTGG-1,Monocytes +Combo_AGGGATGCATAACCTG-1,Dendritic cells +Combo_AGGGATGCATACGCCG-1,Monocytes +Combo_AGGGATGCATCTCCCA-1,Granulocytes +Combo_AGGGATGGTAAGTGTA-1,Dendritic cells +Combo_AGGGATGGTACATCCA-1,Monocytes +Combo_AGGGATGGTACCGTAT-1,Macrophages +Combo_AGGGATGGTCATATGC-1,Monocytes +Combo_AGGGATGGTCTGATTG-1,T cells +Combo_AGGGATGTCAAACCAC-1,Granulocytes +Combo_AGGGTGAAGAAACCGC-1,Monocytes +Combo_AGGGTGAAGATATGCA-1,Dendritic cells +Combo_AGGGTGAAGCAGCGTA-1,Monocytes +Combo_AGGGTGAAGCTACCGC-1,Monocytes +Combo_AGGGTGAAGCTAGCCC-1,Monocytes +Combo_AGGGTGAAGCTAGTTC-1,Monocytes +Combo_AGGGTGAAGGCCCTCA-1,Dendritic cells +Combo_AGGGTGACAAGCCCAC-1,Monocytes +Combo_AGGGTGAGTAGGACAC-1,Monocytes +Combo_AGGGTGAGTGTCCTCT-1,Dendritic cells +Combo_AGGGTGAGTGTGGTTT-1,Monocytes +Combo_AGGGTGAGTTCGAATC-1,Monocytes +Combo_AGGGTGAGTTGAGTTC-1,Dendritic cells +Combo_AGGGTGATCTGGCGTG-1,Monocytes +Combo_AGGTCATAGACCCACC-1,Monocytes +Combo_AGGTCATAGAGGACGG-1,Granulocytes +Combo_AGGTCATAGGCAAAGA-1,Granulocytes +Combo_AGGTCATAGTCGTACT-1,Dendritic cells +Combo_AGGTCATCAGCGTCCA-1,Monocytes +Combo_AGGTCATCAGGTCGTC-1,Monocytes +Combo_AGGTCATGTCTCCCTA-1,Dendritic cells +Combo_AGGTCATGTTCAGGCC-1,Monocytes +Combo_AGGTCATTCAGCTCTC-1,Monocytes +Combo_AGGTCATTCTTGCAAG-1,Dendritic cells +Combo_AGGTCCGAGAACTCGG-1,Dendritic cells +Combo_AGGTCCGAGGTGACCA-1,Monocytes +Combo_AGGTCCGCACCCAGTG-1,Granulocytes +Combo_AGGTCCGCAGCTCGCA-1,Dendritic cells +Combo_AGGTCCGCAGGACGTA-1,Dendritic cells +Combo_AGGTCCGCAGTGACAG-1,Monocytes +Combo_AGGTCCGGTCCGTCAG-1,Monocytes +Combo_AGGTCCGGTGGCGAAT-1,Dendritic cells +Combo_AGGTCCGTCAGAGACG-1,Monocytes +Combo_AGGTCCGTCTTGTATC-1,Monocytes +Combo_AGTAGTCAGACACGAC-1,Monocytes +Combo_AGTAGTCAGATCCCGC-1,Monocytes +Combo_AGTAGTCCACGGTTTA-1,Monocytes +Combo_AGTAGTCCAGATTGCT-1,Granulocytes +Combo_AGTAGTCCAGCTTAAC-1,Monocytes +Combo_AGTAGTCCAGTCCTTC-1,Monocytes +Combo_AGTAGTCGTGGAAAGA-1,Monocytes +Combo_AGTAGTCGTTCGTTGA-1,Monocytes +Combo_AGTAGTCTCCTTTCGG-1,Granulocytes +Combo_AGTCTTTAGGCCCGTT-1,Granulocytes +Combo_AGTCTTTAGTACACCT-1,Granulocytes +Combo_AGTCTTTCACTACAGT-1,Granulocytes +Combo_AGTCTTTCAGCCTATA-1,Granulocytes +Combo_AGTCTTTGTACCTACA-1,Monocytes +Combo_AGTCTTTTCAAGGCTT-1,Monocytes +Combo_AGTCTTTTCGATAGAA-1,Dendritic cells +Combo_AGTGAGGCAGTATGCT-1,Monocytes +Combo_AGTGAGGCATTCCTCG-1,Granulocytes +Combo_AGTGAGGGTACCATCA-1,Granulocytes +Combo_AGTGAGGGTCAACATC-1,Granulocytes +Combo_AGTGAGGGTGTTGGGA-1,Dendritic cells +Combo_AGTGAGGGTTCGGGCT-1,Monocytes +Combo_AGTGAGGTCAACACCA-1,Dendritic cells +Combo_AGTGGGAAGGATGCGT-1,Monocytes +Combo_AGTGGGAAGGCAGTCA-1,Monocytes +Combo_AGTGGGAAGGTGATTA-1,Monocytes +Combo_AGTGGGAAGGTGTTAA-1,Monocytes +Combo_AGTGGGAAGTATTGGA-1,Monocytes +Combo_AGTGGGAGTAGCGATG-1,Granulocytes +Combo_AGTGGGAGTAGGGACT-1,Monocytes +Combo_AGTGGGAGTTACCGAT-1,Monocytes +Combo_AGTGGGATCAAACGGG-1,Granulocytes +Combo_AGTGGGATCAGTGTTG-1,Dendritic cells +Combo_AGTGGGATCCACTCCA-1,Monocytes +Combo_AGTGTCAAGACGACGT-1,Monocytes +Combo_AGTGTCAAGCTAAGAT-1,Granulocytes +Combo_AGTGTCAAGTACTTGC-1,Monocytes +Combo_AGTGTCAAGTGGTAGC-1,Monocytes +Combo_AGTGTCACAAGCTGAG-1,T cells +Combo_AGTGTCAGTAGAAGGA-1,Dendritic cells +Combo_AGTGTCATCTTTAGTC-1,Monocytes +Combo_AGTTGGTAGGCAGTCA-1,Monocytes +Combo_AGTTGGTAGGCCATAG-1,Monocytes +Combo_AGTTGGTCAGTCACTA-1,Monocytes +Combo_AGTTGGTCATCGGACC-1,Granulocytes +Combo_AGTTGGTCATGGTTGT-1,Monocytes +Combo_AGTTGGTGTAAAGGAG-1,Monocytes +Combo_AGTTGGTGTCAATACC-1,Monocytes +Combo_AGTTGGTGTGAGGGTT-1,Monocytes +Combo_AGTTGGTTCAACGGGA-1,Granulocytes +Combo_AGTTGGTTCGCATGAT-1,Dendritic cells +Combo_ATAACGCAGAGCTATA-1,Dendritic cells +Combo_ATAACGCAGCACCGTC-1,Granulocytes +Combo_ATAACGCCAATGGAGC-1,Monocytes +Combo_ATAACGCCACTTAAGC-1,Monocytes +Combo_ATAACGCGTACCGCTG-1,Dendritic cells +Combo_ATAACGCGTCACCTAA-1,Granulocytes +Combo_ATAACGCGTCGAATCT-1,Dendritic cells +Combo_ATAACGCGTCGGCACT-1,Monocytes +Combo_ATAACGCTCAGCGATT-1,Monocytes +Combo_ATAAGAGAGAGCTATA-1,Dendritic cells +Combo_ATAAGAGAGCGCCTCA-1,Monocytes +Combo_ATAAGAGAGCTCCTCT-1,Fibroblasts +Combo_ATAAGAGAGGAATTAC-1,T cells +Combo_ATAAGAGCATCCGGGT-1,Dendritic cells +Combo_ATAAGAGGTAATAGCA-1,Dendritic cells +Combo_ATAAGAGGTCATACTG-1,Monocytes +Combo_ATAAGAGGTCCATCCT-1,Monocytes +Combo_ATAAGAGGTGCTTCTC-1,Dendritic cells +Combo_ATAAGAGGTTCGGCAC-1,Monocytes +Combo_ATAAGAGGTTGTCGCG-1,Monocytes +Combo_ATAGACCAGAGACGAA-1,Dendritic cells +Combo_ATAGACCAGCCGATTT-1,Monocytes +Combo_ATAGACCCAGACGTAG-1,Granulocytes +Combo_ATAGACCGTCTAGTGT-1,Dendritic cells +Combo_ATAGACCGTGCGGTAA-1,Monocytes +Combo_ATAGACCGTGGGTATG-1,Dendritic cells +Combo_ATAGACCTCACAATGC-1,Monocytes +Combo_ATAGACCTCCAAAGTC-1,Granulocytes +Combo_ATCACGAAGCCTATGT-1,Monocytes +Combo_ATCACGAAGCCTTGAT-1,Granulocytes +Combo_ATCACGAAGTCATCCA-1,Monocytes +Combo_ATCACGAAGTCCATAC-1,Dendritic cells +Combo_ATCACGACAACACCCG-1,Monocytes +Combo_ATCACGACACATGACT-1,Monocytes +Combo_ATCACGAGTAGCACGA-1,Granulocytes +Combo_ATCACGAGTCCAGTTA-1,Monocytes +Combo_ATCACGATCCCAACGG-1,Granulocytes +Combo_ATCACGATCCGTTGCT-1,Monocytes +Combo_ATCATCTAGCCTTGAT-1,Granulocytes +Combo_ATCATCTAGCTCCTCT-1,Monocytes +Combo_ATCATCTCAGCTATTG-1,Monocytes +Combo_ATCATCTGTATTACCG-1,Dendritic cells +Combo_ATCATCTGTCTTCTCG-1,Monocytes +Combo_ATCATCTGTGATGTCT-1,Monocytes +Combo_ATCATCTTCAGAAATG-1,Dendritic cells +Combo_ATCATCTTCAGTACGT-1,Dendritic cells +Combo_ATCATGGAGATGCCTT-1,Monocytes +Combo_ATCATGGAGGGTCGAT-1,Granulocytes +Combo_ATCATGGCACAGCGTC-1,Dendritic cells +Combo_ATCATGGCACGTTGGC-1,Monocytes +Combo_ATCATGGGTAGCTCCG-1,Monocytes +Combo_ATCATGGGTCAGCTAT-1,Monocytes +Combo_ATCATGGTCACCCGAG-1,Monocytes +Combo_ATCATGGTCAGGATCT-1,Monocytes +Combo_ATCCACCAGTCCCACG-1,Monocytes +Combo_ATCCACCCAATGACCT-1,Granulocytes +Combo_ATCCACCCATTACGAC-1,Monocytes +Combo_ATCCACCGTAATCGTC-1,Dendritic cells +Combo_ATCCACCGTCAGCTAT-1,Dendritic cells +Combo_ATCCACCGTTGTGGAG-1,Granulocytes +Combo_ATCCACCTCCATGAAC-1,Granulocytes +Combo_ATCCGAAAGAAGCCCA-1,Monocytes +Combo_ATCCGAAAGGGATCTG-1,Granulocytes +Combo_ATCCGAAGTCATATCG-1,Monocytes +Combo_ATCCGAAGTGTGGTTT-1,Monocytes +Combo_ATCCGAAGTTATCACG-1,Dendritic cells +Combo_ATCCGAATCAGCAACT-1,Monocytes +Combo_ATCCGAATCGGACAAG-1,Erythrocytes +Combo_ATCCGAATCTGGGCCA-1,Dendritic cells +Combo_ATCGAGTAGCTAGCCC-1,Monocytes +Combo_ATCGAGTAGGCAGTCA-1,Granulocytes +Combo_ATCGAGTAGGGTCTCC-1,Dendritic cells +Combo_ATCGAGTCAGTCAGCC-1,Dendritic cells +Combo_ATCGAGTCATGGTCTA-1,Monocytes +Combo_ATCGAGTGTAGCGCTC-1,Monocytes +Combo_ATCGAGTGTGTGTGCC-1,Monocytes +Combo_ATCGAGTGTTCAGTAC-1,Monocytes +Combo_ATCGAGTGTTTGTTTC-1,Monocytes +Combo_ATCGAGTTCAAACCAC-1,Monocytes +Combo_ATCGAGTTCCCGACTT-1,Granulocytes +Combo_ATCGAGTTCCTCAATT-1,Dendritic cells +Combo_ATCGAGTTCGCACTCT-1,Dendritic cells +Combo_ATCGAGTTCGTATCAG-1,Granulocytes +Combo_ATCTACTAGCTGGAAC-1,Monocytes +Combo_ATCTACTAGGGTTTCT-1,Dendritic cells +Combo_ATCTACTCAAGAAGAG-1,Monocytes +Combo_ATCTACTCACTAGTAC-1,Monocytes +Combo_ATCTACTCATGCAATC-1,Monocytes +Combo_ATCTACTCATGCCTAA-1,Granulocytes +Combo_ATCTACTCATGGATGG-1,Monocytes +Combo_ATCTACTGTAACGCGA-1,Granulocytes +Combo_ATCTACTGTCATACTG-1,Monocytes +Combo_ATCTGCCAGACACGAC-1,Granulocytes +Combo_ATCTGCCAGATAGGAG-1,Dendritic cells +Combo_ATCTGCCAGCCACGCT-1,Monocytes +Combo_ATCTGCCAGTCCATAC-1,Monocytes +Combo_ATCTGCCCACAGCCCA-1,Dendritic cells +Combo_ATCTGCCCAGCTATTG-1,T cells +Combo_ATCTGCCGTCGCATAT-1,Macrophages +Combo_ATCTGCCGTCTCCCTA-1,Monocytes +Combo_ATCTGCCTCCTATTCA-1,Monocytes +Combo_ATCTGCCTCGTCGTTC-1,Monocytes +Combo_ATGAGGGAGAAACCAT-1,Monocytes +Combo_ATGAGGGAGAAGGGTA-1,Monocytes +Combo_ATGAGGGAGCACCGTC-1,Monocytes +Combo_ATGAGGGAGCTCCTCT-1,Monocytes +Combo_ATGAGGGAGGACAGAA-1,Monocytes +Combo_ATGAGGGAGGGCATGT-1,T cells +Combo_ATGAGGGCAGATTGCT-1,Dendritic cells +Combo_ATGAGGGGTCCGAAGA-1,Dendritic cells +Combo_ATGAGGGGTCCGAATT-1,Dendritic cells +Combo_ATGAGGGGTGATAAGT-1,Monocytes +Combo_ATGAGGGGTTGATTCG-1,Dendritic cells +Combo_ATGAGGGTCAGCAACT-1,Monocytes +Combo_ATGAGGGTCAGGCCCA-1,Granulocytes +Combo_ATGAGGGTCTTGAGGT-1,Monocytes +Combo_ATGCGATAGTGGGTTG-1,T cells +Combo_ATGCGATCACGAGGTA-1,Dendritic cells +Combo_ATGCGATCATGCATGT-1,Monocytes +Combo_ATGCGATGTAAGGATT-1,Dendritic cells +Combo_ATGCGATGTCCAAGTT-1,Monocytes +Combo_ATGCGATGTCGTGGCT-1,Monocytes +Combo_ATGCGATGTCTTTCAT-1,Monocytes +Combo_ATGCGATGTTCAGGCC-1,Monocytes +Combo_ATGCGATTCCGAACGC-1,Monocytes +Combo_ATGGGAGAGAGAACAG-1,Monocytes +Combo_ATGGGAGAGGCCCTCA-1,Monocytes +Combo_ATGGGAGCAAGTTAAG-1,Granulocytes +Combo_ATGGGAGCAATGCCAT-1,Granulocytes +Combo_ATGGGAGGTCGCGTGT-1,Monocytes +Combo_ATGGGAGGTCTCAACA-1,Dendritic cells +Combo_ATGGGAGTCTGCAGTA-1,Dendritic cells +Combo_ATGGGAGTCTGCTGTC-1,Monocytes +Combo_ATGGGAGTCTGCTTGC-1,Monocytes +Combo_ATGTGTGAGGCGACAT-1,Granulocytes +Combo_ATGTGTGAGTCATCCA-1,Monocytes +Combo_ATGTGTGCACGAGGTA-1,Dendritic cells +Combo_ATGTGTGGTGTGCGTC-1,Monocytes +Combo_ATGTGTGGTTGTGGAG-1,Monocytes +Combo_ATGTGTGTCGACCAGC-1,Monocytes +Combo_ATGTGTGTCTCGAGTA-1,Granulocytes +Combo_ATTACTCAGTCCGGTC-1,Monocytes +Combo_ATTACTCCAAGTAATG-1,Monocytes +Combo_ATTACTCCATGACGGA-1,Granulocytes +Combo_ATTACTCGTCATACTG-1,Monocytes +Combo_ATTACTCGTGAAAGAG-1,Monocytes +Combo_ATTACTCTCACTGGGC-1,Monocytes +Combo_ATTACTCTCCAAAGTC-1,Monocytes +Combo_ATTACTCTCTAACTCT-1,Dendritic cells +Combo_ATTACTCTCTGCAAGT-1,Monocytes +Combo_ATTATCCAGGGTATCG-1,T cells +Combo_ATTATCCCACCGATAT-1,Dendritic cells +Combo_ATTATCCCACCTTGTC-1,Monocytes +Combo_ATTATCCGTAGAGTGC-1,Monocytes +Combo_ATTATCCGTATTCGTG-1,Monocytes +Combo_ATTATCCGTTGACGTT-1,Monocytes +Combo_ATTATCCTCACCAGGC-1,Monocytes +Combo_ATTATCCTCACCCTCA-1,Monocytes +Combo_ATTATCCTCCTTTACA-1,Granulocytes +Combo_ATTCTACAGATCTGAA-1,Granulocytes +Combo_ATTCTACAGGACATTA-1,Monocytes +Combo_ATTCTACAGGCCGAAT-1,Monocytes +Combo_ATTCTACAGGTAGCCA-1,Granulocytes +Combo_ATTCTACCAACGATGG-1,Monocytes +Combo_ATTCTACGTACTCAAC-1,Monocytes +Combo_ATTCTACGTCCGAGTC-1,T cells +Combo_ATTCTACGTCGGCTCA-1,Monocytes +Combo_ATTCTACGTTACAGAA-1,Dendritic cells +Combo_ATTGGACAGGACCACA-1,T cells +Combo_ATTGGACCACAGGAGT-1,Monocytes +Combo_ATTGGACCACCTCGGA-1,Granulocytes +Combo_ATTGGACCAGATCGGA-1,Monocytes +Combo_ATTGGACGTGATAAAC-1,Monocytes +Combo_ATTGGACGTTATCACG-1,Monocytes +Combo_ATTGGACTCAACGGGA-1,Monocytes +Combo_ATTGGACTCGGTTAAC-1,T cells +Combo_ATTGGACTCTGTCAAG-1,Monocytes +Combo_ATTGGTGAGAACAATC-1,Dendritic cells +Combo_ATTGGTGAGAATAGGG-1,Granulocytes +Combo_ATTGGTGAGCCAGGAT-1,Monocytes +Combo_ATTGGTGAGCGCTTAT-1,Monocytes +Combo_ATTGGTGAGGCTACGA-1,Macrophages +Combo_ATTGGTGAGGGAAACA-1,Monocytes +Combo_ATTGGTGAGTGCTGCC-1,Monocytes +Combo_ATTGGTGCAATGACCT-1,Granulocytes +Combo_ATTGGTGCACATTTCT-1,Monocytes +Combo_ATTGGTGCATGGTTGT-1,Monocytes +Combo_ATTGGTGTCACCTCGT-1,Monocytes +Combo_ATTGGTGTCCGTACAA-1,Monocytes +Combo_ATTGGTGTCCTGCTTG-1,Monocytes +Combo_ATTTCTGAGAAACCTA-1,Monocytes +Combo_ATTTCTGAGAAAGTGG-1,Monocytes +Combo_ATTTCTGAGATCACGG-1,Monocytes +Combo_ATTTCTGGTTAAGACA-1,Monocytes +Combo_ATTTCTGTCTGCTTGC-1,Monocytes +Combo_CAACCAACAATCTGCA-1,Granulocytes +Combo_CAACCAACAGCTGTAT-1,Monocytes +Combo_CAACCAAGTAATAGCA-1,Dendritic cells +Combo_CAACCAAGTCGGCACT-1,Monocytes +Combo_CAACCAAGTGTCCTCT-1,Monocytes +Combo_CAACCAATCCGAATGT-1,Dendritic cells +Combo_CAACCTCAGCTAGTCT-1,Dendritic cells +Combo_CAACCTCAGGGAGTAA-1,Monocytes +Combo_CAACCTCAGGTGACCA-1,Monocytes +Combo_CAACCTCAGTAGTGCG-1,Monocytes +Combo_CAACCTCCACATTTCT-1,Monocytes +Combo_CAACCTCGTCCCTACT-1,Granulocytes +Combo_CAACCTCGTCTAACGT-1,Granulocytes +Combo_CAACCTCTCAATAAGG-1,Monocytes +Combo_CAACTAGAGGCCCGTT-1,Granulocytes +Combo_CAACTAGAGGTGCAAC-1,Monocytes +Combo_CAACTAGCAAAGTCAA-1,Dendritic cells +Combo_CAACTAGCACAGGTTT-1,Monocytes +Combo_CAACTAGCAGATGGGT-1,Monocytes +Combo_CAACTAGCATATGCTG-1,Dendritic cells +Combo_CAACTAGCATCACCCT-1,Monocytes +Combo_CAACTAGGTACGACCC-1,Monocytes +Combo_CAACTAGGTTGTCGCG-1,Dendritic cells +Combo_CAACTAGGTTTACTCT-1,Monocytes +Combo_CAAGAAAAGAGCAATT-1,Monocytes +Combo_CAAGAAAAGCAAATCA-1,Dendritic cells +Combo_CAAGAAAAGGAGTTTA-1,Monocytes +Combo_CAAGAAAAGGTGCTTT-1,Monocytes +Combo_CAAGAAACAAGTCATC-1,Monocytes +Combo_CAAGAAACACAACGCC-1,Monocytes +Combo_CAAGAAAGTGAGTATA-1,Monocytes +Combo_CAAGAAAGTGCAGACA-1,Dendritic cells +Combo_CAAGAAAGTGTTTGTG-1,Monocytes +Combo_CAAGAAAGTTTGTGTG-1,Dendritic cells +Combo_CAAGAAATCCGTTGCT-1,Monocytes +Combo_CAAGAAATCTCGCATC-1,Monocytes +Combo_CAAGATCAGGCCGAAT-1,Granulocytes +Combo_CAAGATCCAAAGAATC-1,Granulocytes +Combo_CAAGATCCACATTAGC-1,Monocytes +Combo_CAAGATCCACTAAGTC-1,Monocytes +Combo_CAAGATCCAGCTCGAC-1,Monocytes +Combo_CAAGATCCATTATCTC-1,Monocytes +Combo_CAAGATCGTATGGTTC-1,Granulocytes +Combo_CAAGATCGTCACACGC-1,Dendritic cells +Combo_CAAGATCGTCTTTCAT-1,Monocytes +Combo_CAAGATCGTTGAGGTG-1,Dendritic cells +Combo_CAAGATCTCTTAGCCC-1,Monocytes +Combo_CAAGGCCAGAAGGTGA-1,Monocytes +Combo_CAAGGCCAGCCCTAAT-1,Monocytes +Combo_CAAGGCCAGTTGTAGA-1,Monocytes +Combo_CAAGGCCCAATGGAAT-1,Granulocytes +Combo_CAAGGCCGTACCGTAT-1,Monocytes +Combo_CAAGGCCGTCTAGGTT-1,Monocytes +Combo_CAAGGCCGTGAAATCA-1,Monocytes +Combo_CAAGGCCTCCCTTGCA-1,Monocytes +Combo_CAAGGCCTCGCAAACT-1,Dendritic cells +Combo_CAAGGCCTCTTGGGTA-1,Monocytes +Combo_CAAGTTGAGAGTACCG-1,Dendritic cells +Combo_CAAGTTGAGCAGGCTA-1,Granulocytes +Combo_CAAGTTGAGGAGTCTG-1,Dendritic cells +Combo_CAAGTTGGTACTCAAC-1,Monocytes +Combo_CAAGTTGGTCAGTGGA-1,Monocytes +Combo_CAAGTTGGTCATCCCT-1,Monocytes +Combo_CAAGTTGTCGGCTTGG-1,Monocytes +Combo_CAAGTTGTCTAGCACA-1,Monocytes +Combo_CACAAACAGAGTTGGC-1,Monocytes +Combo_CACAAACAGCCCAATT-1,Monocytes +Combo_CACAAACAGGAACTGC-1,Monocytes +Combo_CACAAACCAATAAGCA-1,Granulocytes +Combo_CACAAACCATCACGAT-1,Monocytes +Combo_CACAAACGTACCGAGA-1,Monocytes +Combo_CACAAACGTACTCTCC-1,Monocytes +Combo_CACAAACGTGAGGCTA-1,Monocytes +Combo_CACAAACTCATGTAGC-1,Monocytes +Combo_CACAAACTCCAACCAA-1,Monocytes +Combo_CACACAAAGAAGGTTT-1,Monocytes +Combo_CACACAAAGAGCTATA-1,Granulocytes +Combo_CACACAAAGGTGATTA-1,Monocytes +Combo_CACACAAAGGTGCTTT-1,Dendritic cells +Combo_CACACAACACGAAATA-1,Monocytes +Combo_CACACAACATTACGAC-1,Monocytes +Combo_CACACAAGTCAGAATA-1,Monocytes +Combo_CACACAATCAGCTCTC-1,Granulocytes +Combo_CACACCTAGGGAGTAA-1,Monocytes +Combo_CACACCTCAGCGTAAG-1,Granulocytes +Combo_CACACCTGTTAAGACA-1,Monocytes +Combo_CACACCTTCACGACTA-1,Macrophages +Combo_CACACTCAGTCAATAG-1,Dendritic cells +Combo_CACACTCCAAAGCGGT-1,Dendritic cells +Combo_CACACTCCAGGGCATA-1,Dendritic cells +Combo_CACACTCCATCACGAT-1,Dendritic cells +Combo_CACACTCCATTCTCAT-1,Dendritic cells +Combo_CACACTCGTGTCTGAT-1,Monocytes +Combo_CACACTCTCGGTGTTA-1,Monocytes +Combo_CACACTCTCGTTGACA-1,Monocytes +Combo_CACAGGCAGAGCTATA-1,Granulocytes +Combo_CACAGGCAGATCCTGT-1,Monocytes +Combo_CACAGGCCAAAGGAAG-1,Monocytes +Combo_CACAGGCCAAGCCATT-1,Monocytes +Combo_CACAGGCCAAGGCTCC-1,Monocytes +Combo_CACAGGCCACCTGGTG-1,Granulocytes +Combo_CACAGGCCAGCTGTGC-1,Dendritic cells +Combo_CACAGGCCAGGGAGAG-1,Monocytes +Combo_CACAGGCGTGCATCTA-1,Monocytes +Combo_CACAGGCGTTGGGACA-1,Dendritic cells +Combo_CACAGTAAGAACAATC-1,Monocytes +Combo_CACAGTAAGAGACTAT-1,Monocytes +Combo_CACAGTAAGGTTCCTA-1,Dendritic cells +Combo_CACAGTAAGTCGAGTG-1,Monocytes +Combo_CACAGTACAAACTGTC-1,Monocytes +Combo_CACAGTACAGCCAGAA-1,Monocytes +Combo_CACAGTACAGGATCGA-1,Monocytes +Combo_CACAGTAGTAGCCTCG-1,Monocytes +Combo_CACAGTAGTAGCTGCC-1,Monocytes +Combo_CACAGTATCACCGTAA-1,Monocytes +Combo_CACAGTATCCCTAACC-1,T cells +Combo_CACAGTATCGTGGGAA-1,Monocytes +Combo_CACAGTATCTAGAGTC-1,Monocytes +Combo_CACAGTATCTGCTGCT-1,Dendritic cells +Combo_CACATAGAGGTGCTTT-1,Monocytes +Combo_CACATAGTCAAACCGT-1,Monocytes +Combo_CACATAGTCAAAGACA-1,Granulocytes +Combo_CACATAGTCACGGTTA-1,Monocytes +Combo_CACATTTAGAGGGCTT-1,Dendritic cells +Combo_CACATTTAGCGTAGTG-1,Dendritic cells +Combo_CACATTTAGTGTACGG-1,Dendritic cells +Combo_CACATTTCACGAAAGC-1,Monocytes +Combo_CACATTTCACGACGAA-1,Monocytes +Combo_CACATTTCATCTATGG-1,Monocytes +Combo_CACATTTGTCTTTCAT-1,Dendritic cells +Combo_CACATTTGTTACGGAG-1,Monocytes +Combo_CACATTTGTTCATGGT-1,Monocytes +Combo_CACATTTTCGATCCCT-1,Granulocytes +Combo_CACATTTTCTACCTGC-1,Monocytes +Combo_CACATTTTCTGCGTAA-1,Dendritic cells +Combo_CACATTTTCTGGTTCC-1,Monocytes +Combo_CACCACTAGACAAAGG-1,Dendritic cells +Combo_CACCACTAGATGTCGG-1,Dendritic cells +Combo_CACCACTAGGAGCGTT-1,Dendritic cells +Combo_CACCACTCAGGACGTA-1,Monocytes +Combo_CACCACTGTATTCTCT-1,Dendritic cells +Combo_CACCACTGTGACTCAT-1,Monocytes +Combo_CACCACTGTGTTGGGA-1,Monocytes +Combo_CACCACTTCAACACTG-1,Granulocytes +Combo_CACCACTTCCCTAACC-1,Monocytes +Combo_CACCAGGAGACGACGT-1,Granulocytes +Combo_CACCAGGAGATGTAAC-1,Monocytes +Combo_CACCAGGAGCCAGTTT-1,Monocytes +Combo_CACCAGGAGCTATGCT-1,Monocytes +Combo_CACCAGGTCGCCAGCA-1,Monocytes +Combo_CACCTTGAGCAATCTC-1,Monocytes +Combo_CACCTTGAGCGATCCC-1,Monocytes +Combo_CACCTTGAGGTGCTTT-1,Dendritic cells +Combo_CACCTTGCAATAGAGT-1,Granulocytes +Combo_CACCTTGCAGCCACCA-1,Dendritic cells +Combo_CACTCCAAGAAACGCC-1,Monocytes +Combo_CACTCCAAGAAGGACA-1,Monocytes +Combo_CACTCCACAAAGGCGT-1,Monocytes +Combo_CACTCCACAGACGCCT-1,Monocytes +Combo_CACTCCAGTGCAGTAG-1,Monocytes +Combo_CACTCCAGTTTGGGCC-1,Monocytes +Combo_CACTCCATCATTGCGA-1,Monocytes +Combo_CAGAATCAGAGTCTGG-1,Granulocytes +Combo_CAGAATCCAAAGGCGT-1,Granulocytes +Combo_CAGAATCCACCAGCAC-1,Monocytes +Combo_CAGAATCCATAGACTC-1,Granulocytes +Combo_CAGAATCGTCATGCCG-1,Monocytes +Combo_CAGAATCGTGTCCTCT-1,Monocytes +Combo_CAGAATCGTGTTGGGA-1,Dendritic cells +Combo_CAGAATCGTTGTCGCG-1,Dendritic cells +Combo_CAGAATCTCACAGTAC-1,Dendritic cells +Combo_CAGAATCTCAGCATGT-1,Monocytes +Combo_CAGAATCTCTAGAGTC-1,Monocytes +Combo_CAGAGAGAGAGATGAG-1,Monocytes +Combo_CAGAGAGCAGATAATG-1,Dendritic cells +Combo_CAGAGAGCAGCATGAG-1,Granulocytes +Combo_CAGAGAGCATTCCTCG-1,Dendritic cells +Combo_CAGAGAGGTACAAGTA-1,Dendritic cells +Combo_CAGAGAGGTATCACCA-1,Dendritic cells +Combo_CAGAGAGGTCTCGTTC-1,Monocytes +Combo_CAGAGAGGTTGTGGCC-1,Dendritic cells +Combo_CAGATCAAGCTCCCAG-1,Monocytes +Combo_CAGATCAAGCTCTCGG-1,Monocytes +Combo_CAGATCACACGTCTCT-1,Dendritic cells +Combo_CAGATCACATGAGCGA-1,Monocytes +Combo_CAGATCACATGGAATA-1,Dendritic cells +Combo_CAGATCAGTATAAACG-1,Granulocytes +Combo_CAGATCAGTCTAAACC-1,Dendritic cells +Combo_CAGATCATCGCTTGTC-1,Dendritic cells +Combo_CAGCAGCAGATAGCAT-1,Monocytes +Combo_CAGCAGCAGATGCGAC-1,T cells +Combo_CAGCAGCAGCTTTGGT-1,Monocytes +Combo_CAGCAGCAGTTGAGTA-1,Macrophages +Combo_CAGCAGCGTCTCCCTA-1,Monocytes +Combo_CAGCAGCGTGGCGAAT-1,Dendritic cells +Combo_CAGCAGCGTTCAGTAC-1,Monocytes +Combo_CAGCAGCTCCAGATCA-1,Monocytes +Combo_CAGCATAAGACCTAGG-1,Monocytes +Combo_CAGCATAAGGTCGGAT-1,Monocytes +Combo_CAGCATAAGTGCCAGA-1,Monocytes +Combo_CAGCATACAAACCTAC-1,Monocytes +Combo_CAGCATACACATCCGG-1,Dendritic cells +Combo_CAGCATACAGATGGGT-1,Monocytes +Combo_CAGCATACATAAGACA-1,Dendritic cells +Combo_CAGCATACATCCGGGT-1,Dendritic cells +Combo_CAGCATAGTACTCAAC-1,Macrophages +Combo_CAGCATAGTCGACTAT-1,Dendritic cells +Combo_CAGCATAGTTATGTGC-1,Granulocytes +Combo_CAGCATAGTTCTGTTT-1,Granulocytes +Combo_CAGCATATCGTTGACA-1,Monocytes +Combo_CAGCCGAAGAAGAAGC-1,Monocytes +Combo_CAGCCGAAGTTACCCA-1,Dendritic cells +Combo_CAGCCGACACGTCAGC-1,Granulocytes +Combo_CAGCCGACATCCGTGG-1,Monocytes +Combo_CAGCCGACATGCTAGT-1,Monocytes +Combo_CAGCCGACATTGGTAC-1,Monocytes +Combo_CAGCCGAGTCAAAGAT-1,Monocytes +Combo_CAGCCGAGTTAGAACA-1,Granulocytes +Combo_CAGCCGAGTTATGTGC-1,Monocytes +Combo_CAGCCGAGTTGCTCCT-1,Monocytes +Combo_CAGCCGATCAGTCAGT-1,Granulocytes +Combo_CAGCCGATCGAATGGG-1,Granulocytes +Combo_CAGCCGATCGCGTAGC-1,Monocytes +Combo_CAGCCGATCTACCTGC-1,Monocytes +Combo_CAGCGACAGACGCAAC-1,Monocytes +Combo_CAGCGACAGAGTTGGC-1,Granulocytes +Combo_CAGCGACAGCTCTCGG-1,Monocytes +Combo_CAGCGACAGGATATAC-1,Monocytes +Combo_CAGCGACGTCATCGGC-1,Dendritic cells +Combo_CAGCGACTCAGTTAGC-1,Monocytes +Combo_CAGCTAAAGCTTCGCG-1,Monocytes +Combo_CAGCTAAAGGGCTTCC-1,Dendritic cells +Combo_CAGCTAAAGTATCGAA-1,Granulocytes +Combo_CAGCTAACACTAGTAC-1,Monocytes +Combo_CAGCTAACAGACAGGT-1,Monocytes +Combo_CAGCTAAGTCTCACCT-1,Dendritic cells +Combo_CAGCTAAGTGCAGACA-1,Monocytes +Combo_CAGCTAAGTTATCCGA-1,Dendritic cells +Combo_CAGCTAATCCTTGCCA-1,Monocytes +Combo_CAGCTGGAGCGTGAAC-1,Monocytes +Combo_CAGCTGGCAGATGGCA-1,Monocytes +Combo_CAGCTGGGTATAGGGC-1,Monocytes +Combo_CAGCTGGTCAAACCAC-1,Dendritic cells +Combo_CAGGTGCAGAACAATC-1,Macrophages +Combo_CAGGTGCAGGAGCGTT-1,Monocytes +Combo_CAGGTGCAGTATTGGA-1,Monocytes +Combo_CAGGTGCAGTTGAGAT-1,Granulocytes +Combo_CAGGTGCCAAGAGTCG-1,Dendritic cells +Combo_CAGGTGCCAGAGTGTG-1,Monocytes +Combo_CAGGTGCCAGATGGCA-1,Monocytes +Combo_CAGGTGCGTCAGATAA-1,Monocytes +Combo_CAGGTGCTCAGCAACT-1,Monocytes +Combo_CAGGTGCTCCAAACTG-1,Dendritic cells +Combo_CAGGTGCTCCACGCAG-1,Monocytes +Combo_CAGGTGCTCGCTTAGA-1,Monocytes +Combo_CAGTAACAGCGCCTCA-1,Granulocytes +Combo_CAGTAACAGCTTTGGT-1,Monocytes +Combo_CAGTAACCACGTCTCT-1,Monocytes +Combo_CAGTAACGTTACCGAT-1,Dendritic cells +Combo_CAGTAACGTTCCACAA-1,Monocytes +Combo_CAGTAACTCGAATCCA-1,Monocytes +Combo_CAGTAACTCGCATGGC-1,Monocytes +Combo_CAGTAACTCGCCGTGA-1,Monocytes +Combo_CAGTCCTAGGCTCTTA-1,Dendritic cells +Combo_CAGTCCTAGGGTATCG-1,Dendritic cells +Combo_CAGTCCTAGTAAGTAC-1,Monocytes +Combo_CAGTCCTCAGATGGCA-1,Monocytes +Combo_CAGTCCTCAGCCTTGG-1,Granulocytes +Combo_CAGTCCTTCTTTAGTC-1,Dendritic cells +Combo_CATATGGAGGCCATAG-1,Dendritic cells +Combo_CATATGGCACGTAAGG-1,Monocytes +Combo_CATATGGGTCAATGTC-1,Monocytes +Combo_CATATGGTCATTATCC-1,Monocytes +Combo_CATATGGTCTACTATC-1,Dendritic cells +Combo_CATATGGTCTCACATT-1,Granulocytes +Combo_CATATGGTCTGTCAAG-1,T cells +Combo_CATATTCAGATGTAAC-1,Dendritic cells +Combo_CATATTCAGCGATAGC-1,Granulocytes +Combo_CATATTCCAGATTGCT-1,Monocytes +Combo_CATATTCCATTTGCTT-1,Monocytes +Combo_CATATTCGTACATCCA-1,Monocytes +Combo_CATATTCGTACCGGCT-1,Dendritic cells +Combo_CATATTCGTGGCAAAC-1,Monocytes +Combo_CATATTCTCAAGCCTA-1,Dendritic cells +Combo_CATCAAGAGACTTGAA-1,Dendritic cells +Combo_CATCAAGAGATATACG-1,Monocytes +Combo_CATCAAGCACACATGT-1,Dendritic cells +Combo_CATCAAGCACGGTAAG-1,Dendritic cells +Combo_CATCAAGCAGGTGGAT-1,Monocytes +Combo_CATCAAGCATTCCTCG-1,Dendritic cells +Combo_CATCAAGGTGACTCAT-1,Dendritic cells +Combo_CATCAAGTCGGTGTTA-1,Granulocytes +Combo_CATCAAGTCGTCACGG-1,Granulocytes +Combo_CATCAGAAGGACAGAA-1,Granulocytes +Combo_CATCAGAAGTACGTTC-1,Monocytes +Combo_CATCAGACACTTAAGC-1,Dendritic cells +Combo_CATCAGACAGCTTCGG-1,Macrophages +Combo_CATCAGAGTTAAGATG-1,Monocytes +Combo_CATCAGATCCGAAGAG-1,Monocytes +Combo_CATCAGATCCGCATCT-1,Dendritic cells +Combo_CATCAGATCCTTAATC-1,Granulocytes +Combo_CATCAGATCGGCCGAT-1,Monocytes +Combo_CATCAGATCTACTCAT-1,Monocytes +Combo_CATCAGATCTGGTATG-1,Dendritic cells +Combo_CATCCACAGAGTCTGG-1,Monocytes +Combo_CATCCACAGCAAATCA-1,Monocytes +Combo_CATCCACCAAGGTGTG-1,Granulocytes +Combo_CATCCACGTCGACTGC-1,Dendritic cells +Combo_CATCCACGTCGCGGTT-1,Granulocytes +Combo_CATCCACGTGAAAGAG-1,Monocytes +Combo_CATCCACTCCGAAGAG-1,Monocytes +Combo_CATCGAAAGGCGATAC-1,Dendritic cells +Combo_CATCGAACACTTCTGC-1,Monocytes +Combo_CATCGAAGTCAAGCGA-1,Monocytes +Combo_CATCGAAGTCCTGCTT-1,Dendritic cells +Combo_CATCGAAGTGAGGGTT-1,Monocytes +Combo_CATCGAAGTTCCTCCA-1,Monocytes +Combo_CATCGAATCAACCAAC-1,Monocytes +Combo_CATCGAATCTTCGGTC-1,Granulocytes +Combo_CATCGGGAGACATAAC-1,Granulocytes +Combo_CATCGGGAGATCTGAA-1,Monocytes +Combo_CATCGGGAGCTCCTTC-1,Monocytes +Combo_CATCGGGAGTCATCCA-1,T cells +Combo_CATCGGGGTACCATCA-1,Dendritic cells +Combo_CATCGGGGTACCGTTA-1,Monocytes +Combo_CATCGGGGTCATATCG-1,Dendritic cells +Combo_CATCGGGGTTGGAGGT-1,Dendritic cells +Combo_CATCGGGTCAGAGACG-1,Dendritic cells +Combo_CATCGGGTCCCTCTTT-1,Monocytes +Combo_CATCGGGTCGGAGGTA-1,Monocytes +Combo_CATGACAAGGACATTA-1,Monocytes +Combo_CATGACAAGGGAAACA-1,Granulocytes +Combo_CATGACAAGGGATACC-1,Granulocytes +Combo_CATGACACACAGACTT-1,Monocytes +Combo_CATGACAGTCAGAATA-1,Granulocytes +Combo_CATGACAGTCATCGGC-1,Monocytes +Combo_CATGACAGTCGAGATG-1,Granulocytes +Combo_CATGACAGTGATAAAC-1,Dendritic cells +Combo_CATGACAGTTGGGACA-1,Monocytes +Combo_CATGACATCAGTACGT-1,Dendritic cells +Combo_CATGACATCCGATATG-1,Dendritic cells +Combo_CATGCCTAGCCGATTT-1,Monocytes +Combo_CATGCCTAGGACAGCT-1,Dendritic cells +Combo_CATGCCTAGTACACCT-1,Monocytes +Combo_CATGCCTAGTGGTAGC-1,Dendritic cells +Combo_CATGCCTCAGACTCGC-1,T cells +Combo_CATGCCTGTAATCACC-1,Monocytes +Combo_CATGCCTGTCTACCTC-1,Monocytes +Combo_CATGCCTGTGATGCCC-1,Dendritic cells +Combo_CATGGCGAGAAAGTGG-1,Monocytes +Combo_CATGGCGAGACAGAGA-1,Granulocytes +Combo_CATGGCGAGCCACGCT-1,Dendritic cells +Combo_CATGGCGAGGATATAC-1,Granulocytes +Combo_CATGGCGAGGCCCGTT-1,Monocytes +Combo_CATGGCGCATAAGACA-1,Dendritic cells +Combo_CATGGCGCATGACGGA-1,Granulocytes +Combo_CATGGCGGTGATAAAC-1,Monocytes +Combo_CATGGCGGTGTGAAAT-1,Monocytes +Combo_CATGGCGTCCATGAGT-1,Monocytes +Combo_CATGGCGTCCTCAATT-1,Monocytes +Combo_CATTATCAGCCCTAAT-1,Monocytes +Combo_CATTATCAGCTCCTCT-1,Granulocytes +Combo_CATTATCAGTGACATA-1,Granulocytes +Combo_CATTATCAGTGGTCCC-1,Dendritic cells +Combo_CATTATCCATACAGCT-1,Monocytes +Combo_CATTATCTCACTGGGC-1,Granulocytes +Combo_CATTATCTCCATTCTA-1,Granulocytes +Combo_CATTATCTCCCTAATT-1,Dendritic cells +Combo_CATTATCTCCCTGACT-1,Dendritic cells +Combo_CATTATCTCCTTTCGG-1,Monocytes +Combo_CATTATCTCGCTTGTC-1,Monocytes +Combo_CATTCGCAGAGCTGCA-1,Monocytes +Combo_CATTCGCAGATATGCA-1,Monocytes +Combo_CATTCGCAGCTATGCT-1,Monocytes +Combo_CATTCGCAGGGATGGG-1,Monocytes +Combo_CATTCGCCATTAGGCT-1,Monocytes +Combo_CATTCGCGTAAGGATT-1,Monocytes +Combo_CATTCGCGTCAAGCGA-1,Monocytes +Combo_CATTCGCGTCCAGTAT-1,Dendritic cells +Combo_CATTCGCGTCTCTCTG-1,Monocytes +Combo_CATTCGCGTTAAGTAG-1,Dendritic cells +Combo_CATTCGCTCTCCTATA-1,Monocytes +Combo_CATTCGCTCTTAGAGC-1,Monocytes +Combo_CCAATCCAGAATCTCC-1,Monocytes +Combo_CCAATCCAGCCCGAAA-1,Monocytes +Combo_CCAATCCAGCTAGTTC-1,Monocytes +Combo_CCAATCCAGGGTTCCC-1,Monocytes +Combo_CCAATCCCAATCTACG-1,Dendritic cells +Combo_CCAATCCCACCTTGTC-1,Granulocytes +Combo_CCAATCCCAGCTTAAC-1,Monocytes +Combo_CCAATCCGTACCAGTT-1,Monocytes +Combo_CCAATCCGTATATGGA-1,T cells +Combo_CCAATCCGTTCATGGT-1,Monocytes +Combo_CCAATCCGTTTAGCTG-1,Monocytes +Combo_CCACCTAAGGTGGGTT-1,Monocytes +Combo_CCACCTAAGTGGTAAT-1,Monocytes +Combo_CCACCTACAACTTGAC-1,Monocytes +Combo_CCACCTACAAGTAGTA-1,Dendritic cells +Combo_CCACCTACACGCATCG-1,Monocytes +Combo_CCACCTACAGGATCGA-1,Dendritic cells +Combo_CCACCTACATGTTCCC-1,Monocytes +Combo_CCACCTAGTCTCTCTG-1,Monocytes +Combo_CCACCTATCCGTCAAA-1,Granulocytes +Combo_CCACCTATCCTAAGTG-1,Dendritic cells +Combo_CCACCTATCTGTGCAA-1,Dendritic cells +Combo_CCACGGAAGAAACGAG-1,Monocytes +Combo_CCACGGAAGTGATCGG-1,Granulocytes +Combo_CCACGGACAGCTCGCA-1,Monocytes +Combo_CCACGGAGTACTTAGC-1,Dendritic cells +Combo_CCACGGAGTCGACTGC-1,Monocytes +Combo_CCACGGAGTCTCATCC-1,Granulocytes +Combo_CCACGGAGTGCCTGCA-1,Macrophages +Combo_CCACGGAGTGCGATAG-1,Monocytes +Combo_CCACGGAGTTTAGCTG-1,Monocytes +Combo_CCACGGATCAACACTG-1,Monocytes +Combo_CCACGGATCTACTTAC-1,Monocytes +Combo_CCACTACAGAAACCTA-1,Monocytes +Combo_CCACTACAGGTGCTAG-1,Monocytes +Combo_CCACTACCATCACAAC-1,Granulocytes +Combo_CCACTACCATTGTGCA-1,Granulocytes +Combo_CCACTACGTCCGAACC-1,Monocytes +Combo_CCACTACGTCTTTCAT-1,Dendritic cells +Combo_CCACTACGTTCCATGA-1,T cells +Combo_CCACTACTCAATAAGG-1,Dendritic cells +Combo_CCACTACTCGACAGCC-1,Granulocytes +Combo_CCACTACTCGTTTATC-1,Monocytes +Combo_CCACTACTCTTAGAGC-1,Monocytes +Combo_CCAGCGAAGTACCGGA-1,Granulocytes +Combo_CCAGCGACAGTGGGAT-1,Granulocytes +Combo_CCAGCGAGTAAGGGAA-1,Granulocytes +Combo_CCAGCGAGTACGAAAT-1,Monocytes +Combo_CCAGCGAGTCACTGGC-1,Monocytes +Combo_CCAGCGAGTGACTCAT-1,Monocytes +Combo_CCAGCGAGTTAGTGGG-1,Monocytes +Combo_CCATGTCAGAACTCGG-1,Monocytes +Combo_CCATGTCAGATCTGAA-1,Monocytes +Combo_CCATGTCAGATGCCTT-1,Granulocytes +Combo_CCATGTCAGGGCTCTC-1,Monocytes +Combo_CCATGTCAGTCATCCA-1,Monocytes +Combo_CCATGTCAGTCATGCT-1,Dendritic cells +Combo_CCATGTCGTCCTCCAT-1,Monocytes +Combo_CCATGTCGTCGGCACT-1,Monocytes +Combo_CCATGTCGTCTTTCAT-1,Dendritic cells +Combo_CCATGTCGTTACGTCA-1,Monocytes +Combo_CCATGTCTCCCAGGTG-1,Monocytes +Combo_CCATGTCTCCCTTGCA-1,Dendritic cells +Combo_CCATGTCTCGATAGAA-1,Granulocytes +Combo_CCATTCGAGATCTGAA-1,T cells +Combo_CCATTCGAGCATGGCA-1,Monocytes +Combo_CCATTCGCAAAGTCAA-1,Dendritic cells +Combo_CCATTCGCACTTAACG-1,Monocytes +Combo_CCATTCGGTAAGTTCC-1,Monocytes +Combo_CCATTCGGTAGGCATG-1,Monocytes +Combo_CCATTCGGTCATCGGC-1,Monocytes +Combo_CCATTCGGTTCGTCTC-1,Monocytes +Combo_CCATTCGTCATCTGCC-1,Monocytes +Combo_CCATTCGTCTTGTATC-1,Monocytes +Combo_CCCAATCAGAGACTAT-1,Monocytes +Combo_CCCAATCAGCAAATCA-1,Monocytes +Combo_CCCAATCAGCGATTCT-1,Monocytes +Combo_CCCAATCCATGGATGG-1,Dendritic cells +Combo_CCCAATCGTAACGCGA-1,Dendritic cells +Combo_CCCAATCGTCGTCTTC-1,Monocytes +Combo_CCCAATCGTCTTGATG-1,Monocytes +Combo_CCCAATCGTGACTCAT-1,Granulocytes +Combo_CCCAATCGTTGAGTTC-1,Monocytes +Combo_CCCAATCGTTTCGCTC-1,Monocytes +Combo_CCCAATCTCACTTACT-1,Monocytes +Combo_CCCAATCTCGGCCGAT-1,Monocytes +Combo_CCCAGTTAGAGTCTGG-1,Monocytes +Combo_CCCAGTTAGTACGCGA-1,Monocytes +Combo_CCCAGTTAGTTACCCA-1,Monocytes +Combo_CCCAGTTGTAGTGAAT-1,Monocytes +Combo_CCCAGTTGTCCGTTAA-1,Granulocytes +Combo_CCCAGTTGTCGCTTTC-1,Dendritic cells +Combo_CCCAGTTTCATGTCCC-1,Monocytes +Combo_CCCAGTTTCCGCGCAA-1,Monocytes +Combo_CCCAGTTTCCGGGTGT-1,Monocytes +Combo_CCCAGTTTCGATCCCT-1,Monocytes +Combo_CCCAGTTTCTCATTCA-1,Monocytes +Combo_CCCATACGTCCGTGAC-1,Monocytes +Combo_CCCATACGTCTCCCTA-1,Monocytes +Combo_CCCTCCTAGGTGATTA-1,Monocytes +Combo_CCCTCCTCACGTGAGA-1,Granulocytes +Combo_CCCTCCTGTCCGTTAA-1,Dendritic cells +Combo_CCCTCCTGTCTACCTC-1,Monocytes +Combo_CCCTCCTGTTAGGGTG-1,T cells +Combo_CCCTCCTTCAGTCAGT-1,Dendritic cells +Combo_CCCTCCTTCCTTTACA-1,Monocytes +Combo_CCGGGATAGCCGATTT-1,Monocytes +Combo_CCGGGATCACTGTCGG-1,Granulocytes +Combo_CCGGGATGTACATCCA-1,Monocytes +Combo_CCGGGATGTCACACGC-1,Dendritic cells +Combo_CCGGGATGTCTCACCT-1,Monocytes +Combo_CCGGGATGTTCCCGAG-1,Dendritic cells +Combo_CCGGGATGTTTAAGCC-1,Monocytes +Combo_CCGGGATTCAGTTGAC-1,Monocytes +Combo_CCGGGATTCCCAACGG-1,Granulocytes +Combo_CCGGTAGCATGCAACT-1,Granulocytes +Combo_CCGGTAGGTATAGTAG-1,Granulocytes +Combo_CCGGTAGGTTTCGCTC-1,Granulocytes +Combo_CCGGTAGTCGCATGAT-1,Monocytes +Combo_CCGTACTAGCCAGGAT-1,Granulocytes +Combo_CCGTACTAGGCAATTA-1,Monocytes +Combo_CCGTACTAGTGCTGCC-1,Dendritic cells +Combo_CCGTACTCAGCTGTAT-1,Monocytes +Combo_CCGTACTCAGTCGTGC-1,Granulocytes +Combo_CCGTACTCATGCAATC-1,Monocytes +Combo_CCGTACTGTGTATGGG-1,Granulocytes +Combo_CCGTACTTCAAACCAC-1,Monocytes +Combo_CCGTACTTCGGTTAAC-1,Macrophages +Combo_CCGTACTTCTCAACTT-1,Monocytes +Combo_CCGTGGAAGTGCCATT-1,Monocytes +Combo_CCGTGGAGTATAATGG-1,Monocytes +Combo_CCGTGGAGTCATATGC-1,Macrophages +Combo_CCGTTCAAGGATGTAT-1,Dendritic cells +Combo_CCGTTCAAGTTAGGTA-1,Monocytes +Combo_CCGTTCACACGGTGTC-1,Monocytes +Combo_CCGTTCACATATACGC-1,T cells +Combo_CCGTTCAGTAAGTGTA-1,Monocytes +Combo_CCGTTCATCCGAGCCA-1,Monocytes +Combo_CCGTTCATCTATGTGG-1,Dendritic cells +Combo_CCTAAAGAGAAGCCCA-1,Monocytes +Combo_CCTAAAGAGAGACGAA-1,T cells +Combo_CCTAAAGAGTGTACGG-1,Monocytes +Combo_CCTAAAGAGTGTGGCA-1,Monocytes +Combo_CCTAAAGCAGACGCCT-1,Monocytes +Combo_CCTAAAGCAGCTATTG-1,Dendritic cells +Combo_CCTAAAGCAGCTGGCT-1,Monocytes +Combo_CCTAAAGGTACGCACC-1,Monocytes +Combo_CCTAAAGGTTGAGGTG-1,Monocytes +Combo_CCTAAAGTCGGACAAG-1,T cells +Combo_CCTACACAGACTGGGT-1,Monocytes +Combo_CCTACACAGAGACTTA-1,Dendritic cells +Combo_CCTACACAGGATTCGG-1,Monocytes +Combo_CCTACACCAATCCGAT-1,Dendritic cells +Combo_CCTACACCAATCTACG-1,Dendritic cells +Combo_CCTACACGTAAGAGGA-1,Granulocytes +Combo_CCTACACGTAGAGTGC-1,Monocytes +Combo_CCTACACGTGCCTTGG-1,Monocytes +Combo_CCTACACGTTGATTGC-1,Dendritic cells +Combo_CCTACACTCCTACAGA-1,Monocytes +Combo_CCTACACTCCTGCCAT-1,Monocytes +Combo_CCTACACTCGTACCGG-1,Monocytes +Combo_CCTACACTCTATGTGG-1,T cells +Combo_CCTACCAAGAGGTTGC-1,Monocytes +Combo_CCTACCAAGGCAATTA-1,Monocytes +Combo_CCTACCACAAGGACTG-1,Monocytes +Combo_CCTACCACACAGACTT-1,Monocytes +Combo_CCTACCAGTATGGTTC-1,Dendritic cells +Combo_CCTACCAGTCCAAGTT-1,Monocytes +Combo_CCTACCATCATGCTCC-1,Granulocytes +Combo_CCTACCATCCTTTCGG-1,Monocytes +Combo_CCTACCATCGACAGCC-1,Monocytes +Combo_CCTAGCTAGGGTGTTG-1,Monocytes +Combo_CCTAGCTAGTCCATAC-1,Monocytes +Combo_CCTAGCTCATAAGACA-1,Monocytes +Combo_CCTAGCTGTAGCGTAG-1,Monocytes +Combo_CCTAGCTGTAGGCATG-1,Dendritic cells +Combo_CCTAGCTGTCCGTTAA-1,Monocytes +Combo_CCTAGCTTCTGCGACG-1,Monocytes +Combo_CCTATTAAGACCACGA-1,Monocytes +Combo_CCTATTAAGCGTCTAT-1,Monocytes +Combo_CCTATTACACCAGGCT-1,Dendritic cells +Combo_CCTATTACAGCCTTGG-1,Monocytes +Combo_CCTATTAGTCGGCACT-1,Monocytes +Combo_CCTATTAGTTAGTGGG-1,Granulocytes +Combo_CCTATTAGTTGCGCAC-1,Dendritic cells +Combo_CCTATTATCAAACAAG-1,Monocytes +Combo_CCTCAGTAGCCTATGT-1,Macrophages +Combo_CCTCAGTAGGAATGGA-1,Granulocytes +Combo_CCTCAGTCAATCCGAT-1,Monocytes +Combo_CCTCAGTCACCCATTC-1,Monocytes +Combo_CCTCAGTCATCCCACT-1,Dendritic cells +Combo_CCTCAGTGTCGTGGCT-1,Monocytes +Combo_CCTCAGTGTGCGCTTG-1,Monocytes +Combo_CCTCAGTGTGTATGGG-1,Monocytes +Combo_CCTCAGTGTTACGGAG-1,Monocytes +Combo_CCTCTGAAGCGATATA-1,Monocytes +Combo_CCTCTGAAGCTAGTCT-1,T cells +Combo_CCTCTGAAGTAGGCCA-1,Dendritic cells +Combo_CCTCTGACAAGGACAC-1,Fibroblasts +Combo_CCTCTGACACACCGCA-1,Monocytes +Combo_CCTCTGACAGTCGATT-1,Dendritic cells +Combo_CCTCTGACATGTTCCC-1,Monocytes +Combo_CCTCTGAGTAAGTGTA-1,Dendritic cells +Combo_CCTCTGAGTACCATCA-1,Monocytes +Combo_CCTCTGAGTATAAACG-1,Monocytes +Combo_CCTCTGAGTGCAACGA-1,Granulocytes +Combo_CCTCTGATCCAGTATG-1,Monocytes +Combo_CCTCTGATCCATGCTC-1,Dendritic cells +Combo_CCTCTGATCTGTCCGT-1,Monocytes +Combo_CCTTACGAGATCGATA-1,Monocytes +Combo_CCTTACGAGCCAGGAT-1,Dendritic cells +Combo_CCTTACGAGCTCAACT-1,Granulocytes +Combo_CCTTACGAGTCCATAC-1,Monocytes +Combo_CCTTACGCACTCTGTC-1,Macrophages +Combo_CCTTACGGTCTCATCC-1,Monocytes +Combo_CCTTACGTCCTATGTT-1,Monocytes +Combo_CCTTACGTCGCTAGCG-1,Monocytes +Combo_CCTTACGTCTTGTTTG-1,Granulocytes +Combo_CCTTCCCAGCGTAATA-1,Monocytes +Combo_CCTTCCCCACCTGGTG-1,Macrophages +Combo_CCTTCCCGTTGGTAAA-1,Monocytes +Combo_CCTTCCCTCCAAATGC-1,Granulocytes +Combo_CCTTCCCTCGCATGAT-1,Monocytes +Combo_CCTTCGAAGCCAGGAT-1,Monocytes +Combo_CCTTCGAAGCTCCCAG-1,Monocytes +Combo_CCTTCGAAGGCTCTTA-1,T cells +Combo_CCTTCGACATCTGGTA-1,Monocytes +Combo_CCTTCGAGTGACGGTA-1,Monocytes +Combo_CCTTCGATCCAAGTAC-1,Monocytes +Combo_CCTTCGATCTCACATT-1,Granulocytes +Combo_CCTTTCTAGCCACCTG-1,Monocytes +Combo_CCTTTCTAGTACGCCC-1,Monocytes +Combo_CCTTTCTCAGCTCCGA-1,Monocytes +Combo_CCTTTCTCATGTAGTC-1,Dendritic cells +Combo_CCTTTCTGTGAAAGAG-1,Granulocytes +Combo_CCTTTCTTCTGCGGCA-1,Monocytes +Combo_CGAACATAGATGTTAG-1,Monocytes +Combo_CGAACATAGCTGATAA-1,Monocytes +Combo_CGAACATCACGGTTTA-1,Monocytes +Combo_CGAACATCAGCTGGCT-1,Monocytes +Combo_CGAACATCATGCCTAA-1,Monocytes +Combo_CGAACATGTAGCGTAG-1,Monocytes +Combo_CGAACATGTGGGTATG-1,Monocytes +Combo_CGAACATGTGTCAATC-1,Monocytes +Combo_CGAACATTCATGTAGC-1,Monocytes +Combo_CGAACATTCTAAGCCA-1,Granulocytes +Combo_CGAATGTAGACTCGGA-1,Monocytes +Combo_CGAATGTAGCAGATCG-1,Monocytes +Combo_CGAATGTAGCTGAACG-1,Monocytes +Combo_CGAATGTAGTAGATGT-1,Monocytes +Combo_CGAATGTAGTAGGCCA-1,Dendritic cells +Combo_CGAATGTAGTGGAGTC-1,Monocytes +Combo_CGAATGTCAAACTGTC-1,Granulocytes +Combo_CGAATGTCAGTATGCT-1,Monocytes +Combo_CGAATGTCATCCGTGG-1,Granulocytes +Combo_CGAATGTGTAGCTCCG-1,Monocytes +Combo_CGAATGTGTCTAGGTT-1,Dendritic cells +Combo_CGAATGTGTGTAATGA-1,Granulocytes +Combo_CGAATGTTCACAATGC-1,Monocytes +Combo_CGAATGTTCGGAATCT-1,Monocytes +Combo_CGAATGTTCTAACTCT-1,Dendritic cells +Combo_CGACCTTAGGCTACGA-1,Monocytes +Combo_CGACCTTAGGGCATGT-1,Granulocytes +Combo_CGACCTTCAAACCCAT-1,Monocytes +Combo_CGACCTTCAAGCTGAG-1,Granulocytes +Combo_CGACCTTCAGGGAGAG-1,Monocytes +Combo_CGACCTTGTAATTGGA-1,Monocytes +Combo_CGACCTTGTGCCTGGT-1,Granulocytes +Combo_CGACCTTGTTAAAGTG-1,Monocytes +Combo_CGACCTTGTTCAGGCC-1,Monocytes +Combo_CGACCTTTCGGTCTAA-1,T cells +Combo_CGACTTCCAAACGCGA-1,Monocytes +Combo_CGACTTCGTGGTGTAG-1,Monocytes +Combo_CGACTTCGTTCTGTTT-1,Monocytes +Combo_CGAGAAGAGTCGTACT-1,Monocytes +Combo_CGAGAAGAGTTGTAGA-1,Monocytes +Combo_CGAGAAGCACATCCGG-1,Granulocytes +Combo_CGAGAAGCACTTGGAT-1,Monocytes +Combo_CGAGAAGCATCACCCT-1,Monocytes +Combo_CGAGAAGGTACCGTTA-1,Dendritic cells +Combo_CGAGAAGGTCCATGAT-1,Monocytes +Combo_CGAGAAGGTCCGAACC-1,Dendritic cells +Combo_CGAGAAGGTCGGCACT-1,Monocytes +Combo_CGAGAAGGTCGTCTTC-1,Monocytes +Combo_CGAGAAGGTCTTCAAG-1,Monocytes +Combo_CGAGAAGGTCTTTCAT-1,Monocytes +Combo_CGAGAAGTCCGTACAA-1,Granulocytes +Combo_CGAGCACAGACTCGGA-1,T cells +Combo_CGAGCACAGCTGCGAA-1,Dendritic cells +Combo_CGAGCACAGTACACCT-1,Monocytes +Combo_CGAGCACCAGCTCGCA-1,Dendritic cells +Combo_CGAGCACCATAGTAAG-1,Granulocytes +Combo_CGAGCACGTACCATCA-1,Granulocytes +Combo_CGAGCACTCCACTCCA-1,Granulocytes +Combo_CGAGCACTCTAAGCCA-1,Monocytes +Combo_CGAGCCAAGTAATCCC-1,Monocytes +Combo_CGAGCCACACGTGAGA-1,T cells +Combo_CGAGCCACAGAGCCAA-1,Monocytes +Combo_CGAGCCACATAGACTC-1,Monocytes +Combo_CGAGCCAGTCTCAACA-1,Monocytes +Combo_CGAGCCAGTGTCGCTG-1,Monocytes +Combo_CGAGCCAGTTCACGGC-1,Monocytes +Combo_CGAGCCATCAAACAAG-1,Monocytes +Combo_CGAGCCATCTCCAGGG-1,Dendritic cells +Combo_CGATCGGCAAAGCAAT-1,Granulocytes +Combo_CGATCGGCACCGTTGG-1,Monocytes +Combo_CGATCGGCAGGATCGA-1,Monocytes +Combo_CGATCGGGTGGTAACG-1,Monocytes +Combo_CGATCGGGTTTAAGCC-1,Monocytes +Combo_CGATCGGTCAGGTAAA-1,Monocytes +Combo_CGATCGGTCGGCGCAT-1,Monocytes +Combo_CGATCGGTCTCTGCTG-1,Granulocytes +Combo_CGATCGGTCTGGGCCA-1,Monocytes +Combo_CGATGGCGTAAGTAGT-1,Monocytes +Combo_CGATGGCGTAGCGTGA-1,Monocytes +Combo_CGATGGCTCATAACCG-1,Dendritic cells +Combo_CGATGGCTCTCCAGGG-1,Monocytes +Combo_CGATGTACAAGCGAGT-1,Monocytes +Combo_CGATGTACACGGATAG-1,Monocytes +Combo_CGATGTACAGGTGCCT-1,Monocytes +Combo_CGATGTAGTAGAAGGA-1,Monocytes +Combo_CGATGTAGTAGCGCTC-1,Monocytes +Combo_CGATGTAGTATGGTTC-1,Monocytes +Combo_CGATGTAGTCTCCCTA-1,Monocytes +Combo_CGATGTAGTTCCAACA-1,Monocytes +Combo_CGATGTATCACATACG-1,Monocytes +Combo_CGATGTATCGGAAATA-1,Monocytes +Combo_CGATGTATCGTTACAG-1,Dendritic cells +Combo_CGATGTATCTCAAACG-1,Granulocytes +Combo_CGATGTATCTTGTCAT-1,Monocytes +Combo_CGATTGAAGCGCCTCA-1,Monocytes +Combo_CGATTGAAGTGCCATT-1,Monocytes +Combo_CGATTGAAGTTGAGTA-1,Monocytes +Combo_CGATTGAGTGCGGTAA-1,Monocytes +Combo_CGATTGAGTTGCGCAC-1,Monocytes +Combo_CGATTGAGTTGGTGGA-1,Monocytes +Combo_CGATTGATCAGCTGGC-1,Granulocytes +Combo_CGATTGATCGAATGGG-1,Dendritic cells +Combo_CGATTGATCTTGCAAG-1,Monocytes +Combo_CGCCAAGAGACAGACC-1,Granulocytes +Combo_CGCCAAGAGACCACGA-1,Monocytes +Combo_CGCCAAGAGACGCAAC-1,Monocytes +Combo_CGCCAAGCAATGACCT-1,Granulocytes +Combo_CGCCAAGCAGACGTAG-1,Monocytes +Combo_CGCCAAGCAGCGTTCG-1,Granulocytes +Combo_CGCCAAGCATTTCAGG-1,Monocytes +Combo_CGCCAAGTCGCGATCG-1,Granulocytes +Combo_CGCGGTAAGCTTCGCG-1,Granulocytes +Combo_CGCGGTAAGGTAAACT-1,Dendritic cells +Combo_CGCGGTACAAACGCGA-1,Monocytes +Combo_CGCGGTACAAATTGCC-1,Monocytes +Combo_CGCGGTAGTACATGTC-1,Dendritic cells +Combo_CGCGGTAGTGCATCTA-1,Monocytes +Combo_CGCGTTTAGCTTATCG-1,Granulocytes +Combo_CGCGTTTAGGACATTA-1,Granulocytes +Combo_CGCGTTTCAAAGCGGT-1,Dendritic cells +Combo_CGCGTTTCAGCTCGCA-1,Monocytes +Combo_CGCGTTTCATCACGTA-1,Granulocytes +Combo_CGCGTTTGTAAGCACG-1,Dendritic cells +Combo_CGCGTTTGTGCGAAAC-1,Granulocytes +Combo_CGCGTTTGTTACGCGC-1,Monocytes +Combo_CGCGTTTGTTTGCATG-1,Monocytes +Combo_CGCGTTTGTTTGGGCC-1,Dendritic cells +Combo_CGCGTTTTCAAACAAG-1,Monocytes +Combo_CGCGTTTTCCAAGCCG-1,Dendritic cells +Combo_CGCGTTTTCCAGTAGT-1,Macrophages +Combo_CGCGTTTTCTTGTTTG-1,Dendritic cells +Combo_CGCTATCAGCCAGTAG-1,Monocytes +Combo_CGCTATCCAAGCCTAT-1,Monocytes +Combo_CGCTATCCAAGCTGGA-1,Monocytes +Combo_CGCTATCCACGGCGTT-1,Dendritic cells +Combo_CGCTATCCAGACACTT-1,Granulocytes +Combo_CGCTATCCATGGGAAC-1,Monocytes +Combo_CGCTATCGTCCAACTA-1,Dendritic cells +Combo_CGCTATCTCAAGCCTA-1,Granulocytes +Combo_CGCTATCTCCGAACGC-1,Dendritic cells +Combo_CGCTATCTCTTGGGTA-1,Dendritic cells +Combo_CGCTGGAAGAAGCCCA-1,Dendritic cells +Combo_CGCTGGAAGAATCTCC-1,Dendritic cells +Combo_CGCTGGAAGAGACTTA-1,Dendritic cells +Combo_CGCTGGAAGTGGGATC-1,Monocytes +Combo_CGCTGGACAACGCACC-1,Monocytes +Combo_CGCTGGACAGTGAGTG-1,Dendritic cells +Combo_CGCTGGAGTCGACTAT-1,Monocytes +Combo_CGCTGGAGTTAAGTAG-1,Monocytes +Combo_CGCTTCAAGACTAGAT-1,Granulocytes +Combo_CGCTTCAAGATGTTAG-1,Monocytes +Combo_CGCTTCAAGGTAGCCA-1,Monocytes +Combo_CGCTTCACAAGCCGTC-1,Granulocytes +Combo_CGCTTCACAATGGATA-1,Dendritic cells +Combo_CGCTTCACACAAGCCC-1,Monocytes +Combo_CGCTTCACATATACGC-1,Dendritic cells +Combo_CGCTTCAGTCAAAGAT-1,Monocytes +Combo_CGCTTCAGTGGTCCGT-1,Monocytes +Combo_CGGACACCATTAGCCA-1,Monocytes +Combo_CGGACACGTATAAACG-1,Monocytes +Combo_CGGACACGTCAGTGGA-1,Granulocytes +Combo_CGGACACTCCGAGCCA-1,Monocytes +Combo_CGGACACTCGGTCCGA-1,Monocytes +Combo_CGGACGTAGACAAGCC-1,Monocytes +Combo_CGGACGTAGGACAGCT-1,T cells +Combo_CGGACGTAGTGACTCT-1,Monocytes +Combo_CGGACGTCACGAAGCA-1,Monocytes +Combo_CGGACGTCATGATCCA-1,Monocytes +Combo_CGGACGTCATGCCTTC-1,Dendritic cells +Combo_CGGACGTGTTATGCGT-1,Dendritic cells +Combo_CGGACGTTCACGATGT-1,Granulocytes +Combo_CGGACGTTCTTGAGGT-1,Dendritic cells +Combo_CGGACTGAGAGGACGG-1,Monocytes +Combo_CGGACTGAGCTACCGC-1,Dendritic cells +Combo_CGGACTGAGGAGTCTG-1,Granulocytes +Combo_CGGACTGAGGGCTCTC-1,Monocytes +Combo_CGGACTGAGTACCGGA-1,Dendritic cells +Combo_CGGACTGCAGGTGGAT-1,Monocytes +Combo_CGGACTGGTAGAGCTG-1,Monocytes +Combo_CGGACTGGTAGCGTAG-1,Monocytes +Combo_CGGACTGGTCTAGTCA-1,Monocytes +Combo_CGGACTGGTGCCTGGT-1,Monocytes +Combo_CGGACTGGTGTCGCTG-1,Dendritic cells +Combo_CGGACTGGTTCCCGAG-1,Dendritic cells +Combo_CGGACTGTCAATACCG-1,Granulocytes +Combo_CGGAGCTAGACAAGCC-1,Monocytes +Combo_CGGAGCTAGTGGACGT-1,Dendritic cells +Combo_CGGAGCTCAAGCGTAG-1,Monocytes +Combo_CGGAGCTGTAAACACA-1,Monocytes +Combo_CGGAGCTGTCCGTCAG-1,Dendritic cells +Combo_CGGAGCTGTGTTGAGG-1,Monocytes +Combo_CGGAGCTTCAGGCCCA-1,Monocytes +Combo_CGGAGTCAGTGTCTCA-1,Granulocytes +Combo_CGGAGTCTCAACCATG-1,Monocytes +Combo_CGGAGTCTCAATAAGG-1,Dendritic cells +Combo_CGGAGTCTCATTCACT-1,Dendritic cells +Combo_CGGAGTCTCGTGGGAA-1,Dendritic cells +Combo_CGGAGTCTCTATGTGG-1,Dendritic cells +Combo_CGGAGTCTCTTAACCT-1,Monocytes +Combo_CGGCTAGGTTACGCGC-1,Monocytes +Combo_CGGCTAGTCGAGCCCA-1,Monocytes +Combo_CGGCTAGTCGCATGAT-1,Monocytes +Combo_CGGCTAGTCTCAAACG-1,Dendritic cells +Combo_CGGGTCAAGATCTGAA-1,Monocytes +Combo_CGGGTCAAGGTCATCT-1,Monocytes +Combo_CGGGTCAAGTCCTCCT-1,Granulocytes +Combo_CGGGTCACAAACCCAT-1,Granulocytes +Combo_CGGGTCACAGTTCCCT-1,Dendritic cells +Combo_CGGGTCACATCACGTA-1,Granulocytes +Combo_CGGGTCAGTCGCCATG-1,Monocytes +Combo_CGGGTCAGTCGGATCC-1,Dendritic cells +Combo_CGGGTCATCCTCAACC-1,Monocytes +Combo_CGGGTCATCTTGAGGT-1,Dendritic cells +Combo_CGGTTAAGTAAGTGGC-1,Monocytes +Combo_CGGTTAAGTAGCGTAG-1,Dendritic cells +Combo_CGGTTAAGTGCCTGGT-1,Monocytes +Combo_CGGTTAAGTTAGTGGG-1,Monocytes +Combo_CGGTTAAGTTCGGCAC-1,Monocytes +Combo_CGTAGCGAGCTCAACT-1,Monocytes +Combo_CGTAGCGAGGCCGAAT-1,Monocytes +Combo_CGTAGCGAGTCCATAC-1,Monocytes +Combo_CGTAGCGCAATCGGTT-1,Monocytes +Combo_CGTAGCGCATTCTTAC-1,Dendritic cells +Combo_CGTAGCGGTACAGTGG-1,Monocytes +Combo_CGTAGCGGTCCAGTGC-1,Monocytes +Combo_CGTAGCGGTCGGCATC-1,Granulocytes +Combo_CGTAGCGGTCTCCCTA-1,Monocytes +Combo_CGTAGCGTCGTACCGG-1,Dendritic cells +Combo_CGTAGCGTCTGGTATG-1,Monocytes +Combo_CGTAGGCAGAGCCTAG-1,Monocytes +Combo_CGTAGGCAGATCCCAT-1,Dendritic cells +Combo_CGTAGGCAGGATGCGT-1,Granulocytes +Combo_CGTAGGCGTACAGCAG-1,Dendritic cells +Combo_CGTAGGCGTACTTAGC-1,Monocytes +Combo_CGTAGGCGTCAGATAA-1,Dendritic cells +Combo_CGTAGGCGTGAGTGAC-1,Monocytes +Combo_CGTAGGCTCAGAGGTG-1,Granulocytes +Combo_CGTAGGCTCTGCCAGG-1,Dendritic cells +Combo_CGTCACTAGTACGACG-1,Monocytes +Combo_CGTCACTAGTGGGCTA-1,Monocytes +Combo_CGTCACTCAATGACCT-1,Granulocytes +Combo_CGTCACTCAGTGGAGT-1,Monocytes +Combo_CGTCACTCATGTTGAC-1,Monocytes +Combo_CGTCACTTCCCGGATG-1,Granulocytes +Combo_CGTCACTTCGTCTGAA-1,Monocytes +Combo_CGTCACTTCTGATACG-1,Dendritic cells +Combo_CGTCAGGAGAACTCGG-1,Monocytes +Combo_CGTCAGGAGGCCCGTT-1,Monocytes +Combo_CGTCAGGAGTTAAGTG-1,Monocytes +Combo_CGTCAGGCAGTAACGG-1,Monocytes +Combo_CGTCAGGCATAGAAAC-1,Granulocytes +Combo_CGTCAGGCATGTTGAC-1,Granulocytes +Combo_CGTCAGGGTAAATGTG-1,Dendritic cells +Combo_CGTCAGGTCGCATGAT-1,Dendritic cells +Combo_CGTCAGGTCGCCGTGA-1,Granulocytes +Combo_CGTCCATAGCGACGTA-1,Monocytes +Combo_CGTCCATAGGATATAC-1,Monocytes +Combo_CGTCCATGTTATCACG-1,Monocytes +Combo_CGTCCATTCAACCATG-1,Monocytes +Combo_CGTCCATTCAATACCG-1,Dendritic cells +Combo_CGTCTACAGCTTTGGT-1,Monocytes +Combo_CGTCTACAGGACAGAA-1,Granulocytes +Combo_CGTCTACAGGCTCTTA-1,Dendritic cells +Combo_CGTCTACAGTCAAGCG-1,Monocytes +Combo_CGTCTACAGTGCCATT-1,Dendritic cells +Combo_CGTCTACAGTTTAGGA-1,Macrophages +Combo_CGTCTACCAAGTTAAG-1,Monocytes +Combo_CGTCTACCACAAGCCC-1,Monocytes +Combo_CGTCTACCATGGATGG-1,Monocytes +Combo_CGTCTACGTAAGGGCT-1,Granulocytes +Combo_CGTCTACTCGAGAGCA-1,Dendritic cells +Combo_CGTCTACTCGCAGGCT-1,Monocytes +Combo_CGTCTACTCGTTTGCC-1,Monocytes +Combo_CGTCTACTCTATGTGG-1,Monocytes +Combo_CGTCTACTCTGAAAGA-1,Granulocytes +Combo_CGTGAGCAGCCACGCT-1,Monocytes +Combo_CGTGAGCAGCTGCGAA-1,Monocytes +Combo_CGTGAGCAGGTAAACT-1,Monocytes +Combo_CGTGAGCAGTCATCCA-1,Monocytes +Combo_CGTGAGCCAAAGAATC-1,Dendritic cells +Combo_CGTGAGCCAAGCTGGA-1,Granulocytes +Combo_CGTGAGCCAATAAGCA-1,Dendritic cells +Combo_CGTGAGCGTGCCTGTG-1,Dendritic cells +Combo_CGTGAGCGTGGCCCTA-1,Dendritic cells +Combo_CGTGAGCGTTTCGCTC-1,Monocytes +Combo_CGTGAGCTCAACGCTA-1,Granulocytes +Combo_CGTGAGCTCATATCGG-1,Monocytes +Combo_CGTGAGCTCCTATTCA-1,Monocytes +Combo_CGTGTAAAGACGACGT-1,Monocytes +Combo_CGTGTAAAGCGTGAGT-1,Monocytes +Combo_CGTGTAAAGGCCCTCA-1,Monocytes +Combo_CGTGTAAAGTACGATA-1,Monocytes +Combo_CGTGTAACATCGATGT-1,Monocytes +Combo_CGTGTAAGTGTTGGGA-1,Monocytes +Combo_CGTGTAAGTTAGGGTG-1,Monocytes +Combo_CGTGTAATCTCTTATG-1,NK cells +Combo_CGTGTAATCTGTGCAA-1,Monocytes +Combo_CGTGTAATCTTGACGA-1,Monocytes +Combo_CGTGTCTAGATCTGAA-1,Monocytes +Combo_CGTGTCTAGCGTTTAC-1,Monocytes +Combo_CGTGTCTAGGCAAAGA-1,Granulocytes +Combo_CGTGTCTCAATCTACG-1,Monocytes +Combo_CGTGTCTGTAACGACG-1,Monocytes +Combo_CGTTAGAAGCATCATC-1,Monocytes +Combo_CGTTAGAAGCGATATA-1,Monocytes +Combo_CGTTAGAAGCGTAGTG-1,Monocytes +Combo_CGTTAGAAGGGATCTG-1,Granulocytes +Combo_CGTTAGAAGTACTTGC-1,Dendritic cells +Combo_CGTTAGAAGTGGTAAT-1,Monocytes +Combo_CGTTAGACAAGTTGTC-1,Monocytes +Combo_CGTTAGACAGCATACT-1,Monocytes +Combo_CGTTAGAGTAAGTTCC-1,Dendritic cells +Combo_CGTTAGAGTATATGAG-1,Dendritic cells +Combo_CGTTAGAGTGTTTGGT-1,Granulocytes +Combo_CGTTAGATCAGGTTCA-1,Monocytes +Combo_CGTTAGATCCCAAGTA-1,Granulocytes +Combo_CGTTAGATCGTGACAT-1,T cells +Combo_CGTTCTGAGAATTGTG-1,Dendritic cells +Combo_CGTTCTGAGATATGGT-1,Dendritic cells +Combo_CGTTCTGCACTAAGTC-1,Monocytes +Combo_CGTTCTGCAGATCCAT-1,Monocytes +Combo_CGTTCTGGTCAAACTC-1,Monocytes +Combo_CGTTCTGGTCAGTGGA-1,Granulocytes +Combo_CGTTCTGGTCCGAACC-1,Monocytes +Combo_CGTTCTGGTGGCCCTA-1,Granulocytes +Combo_CGTTCTGTCATCTGCC-1,Monocytes +Combo_CGTTCTGTCCCTCAGT-1,Monocytes +Combo_CGTTCTGTCCTGCAGG-1,Monocytes +Combo_CGTTGGGAGCTGGAAC-1,Monocytes +Combo_CGTTGGGAGGCCGAAT-1,Granulocytes +Combo_CGTTGGGAGGGTGTGT-1,Monocytes +Combo_CGTTGGGCAAATCCGT-1,Monocytes +Combo_CGTTGGGCATGGTTGT-1,Monocytes +Combo_CGTTGGGGTAAGGGAA-1,Monocytes +Combo_CGTTGGGGTAGCGTAG-1,Granulocytes +Combo_CGTTGGGGTGTAATGA-1,Dendritic cells +Combo_CGTTGGGTCCTTGACC-1,Monocytes +Combo_CTAACTTAGAAGGTTT-1,Dendritic cells +Combo_CTAACTTAGCTAGTCT-1,Monocytes +Combo_CTAACTTAGTTCGCGC-1,Granulocytes +Combo_CTAACTTAGTTGTAGA-1,Monocytes +Combo_CTAACTTCAGCATACT-1,Monocytes +Combo_CTAACTTCAGTTAACC-1,Dendritic cells +Combo_CTAACTTCATACTCTT-1,Monocytes +Combo_CTAACTTGTAATCGTC-1,Granulocytes +Combo_CTAACTTTCACCAGGC-1,Monocytes +Combo_CTAACTTTCATGCTCC-1,T cells +Combo_CTAACTTTCGTCCGTT-1,Dendritic cells +Combo_CTAAGACAGCTGGAAC-1,Monocytes +Combo_CTAAGACAGGGATGGG-1,Granulocytes +Combo_CTAAGACCAGTAACGG-1,Dendritic cells +Combo_CTAAGACGTACAGACG-1,Monocytes +Combo_CTAAGACGTACCTACA-1,Monocytes +Combo_CTAAGACGTCGTGGCT-1,Monocytes +Combo_CTAAGACGTGCGATAG-1,Monocytes +Combo_CTAATGGAGATGGCGT-1,Monocytes +Combo_CTAATGGCAACGATCT-1,Granulocytes +Combo_CTAATGGCATCCCATC-1,Monocytes +Combo_CTAATGGGTCAGGACA-1,Monocytes +Combo_CTAATGGTCATATCGG-1,Monocytes +Combo_CTAATGGTCTTGTTTG-1,Monocytes +Combo_CTACACCAGAGGTACC-1,Monocytes +Combo_CTACACCAGCTAGTCT-1,Monocytes +Combo_CTACACCCATCTCGCT-1,Monocytes +Combo_CTACACCGTACCATCA-1,Monocytes +Combo_CTACACCGTCTCATCC-1,Monocytes +Combo_CTACACCGTTCCTCCA-1,Monocytes +Combo_CTACACCTCAGTGTTG-1,Monocytes +Combo_CTACACCTCCTGTACC-1,Dendritic cells +Combo_CTACACCTCTCCCTGA-1,T cells +Combo_CTACATTAGCGCCTTG-1,Dendritic cells +Combo_CTACATTAGCGTAGTG-1,Monocytes +Combo_CTACATTAGGGTCGAT-1,Granulocytes +Combo_CTACATTAGGTACTCT-1,Monocytes +Combo_CTACATTAGTTACCCA-1,Granulocytes +Combo_CTACATTCAGGAATGC-1,Monocytes +Combo_CTACATTGTGTAACGG-1,Macrophages +Combo_CTACATTTCACATAGC-1,Monocytes +Combo_CTACCCACAAGAAAGG-1,Monocytes +Combo_CTACCCACATCTGGTA-1,Monocytes +Combo_CTACCCAGTCAATACC-1,Granulocytes +Combo_CTACCCAGTGAAAGAG-1,Monocytes +Combo_CTACCCATCAGCGACC-1,Monocytes +Combo_CTACCCATCGGGAGTA-1,Dendritic cells +Combo_CTACCCATCTTCGGTC-1,Monocytes +Combo_CTACGTCAGACAGACC-1,Monocytes +Combo_CTACGTCAGCTACCGC-1,Dendritic cells +Combo_CTACGTCAGGACGAAA-1,Dendritic cells +Combo_CTACGTCCAATCGAAA-1,Monocytes +Combo_CTACGTCGTAAGAGAG-1,Monocytes +Combo_CTACGTCGTAGAGTGC-1,Monocytes +Combo_CTACGTCGTAGCTAAA-1,Monocytes +Combo_CTACGTCGTCACTGGC-1,Monocytes +Combo_CTACGTCGTCGCGAAA-1,Monocytes +Combo_CTACGTCGTTCCAACA-1,Granulocytes +Combo_CTACGTCGTTCCACAA-1,Monocytes +Combo_CTACGTCGTTTAAGCC-1,Monocytes +Combo_CTACGTCTCCAAGCCG-1,Monocytes +Combo_CTAGAGTAGATCTGAA-1,Monocytes +Combo_CTAGAGTCACATAACC-1,Dendritic cells +Combo_CTAGAGTCATACGCTA-1,Granulocytes +Combo_CTAGAGTGTCTAGCGC-1,Monocytes +Combo_CTAGAGTTCATAGCAC-1,Monocytes +Combo_CTAGCCTAGACTTGAA-1,Granulocytes +Combo_CTAGCCTAGAGGTAGA-1,Dendritic cells +Combo_CTAGCCTAGGAGTAGA-1,Monocytes +Combo_CTAGCCTAGTACGTTC-1,Monocytes +Combo_CTAGCCTCAGTCTTCC-1,Dendritic cells +Combo_CTAGCCTGTAGCGTAG-1,Dendritic cells +Combo_CTAGCCTGTCCTAGCG-1,Dendritic cells +Combo_CTAGCCTTCAGGCAAG-1,Monocytes +Combo_CTAGTGAAGCGTGAAC-1,Monocytes +Combo_CTAGTGAAGGTGCACA-1,Dendritic cells +Combo_CTAGTGAAGTGAATTG-1,Granulocytes +Combo_CTAGTGAGTAAGTGTA-1,Dendritic cells +Combo_CTAGTGAGTCGGCACT-1,Monocytes +Combo_CTAGTGAGTCTAGTCA-1,Monocytes +Combo_CTAGTGAGTCTCTTAT-1,Granulocytes +Combo_CTAGTGATCCCAAGAT-1,Monocytes +Combo_CTAGTGATCGCTGATA-1,Monocytes +Combo_CTAGTGATCGGTTCGG-1,Monocytes +Combo_CTAGTGATCTCGTTTA-1,Dendritic cells +Combo_CTCACACAGCGATTCT-1,Dendritic cells +Combo_CTCACACAGTGACATA-1,Monocytes +Combo_CTCACACCAAACAACA-1,Monocytes +Combo_CTCACACGTACCCAAT-1,Dendritic cells +Combo_CTCACACGTCAACATC-1,Monocytes +Combo_CTCACACGTCTAGAGG-1,Monocytes +Combo_CTCACACGTTAAGGGC-1,Monocytes +Combo_CTCACACTCCGTACAA-1,Monocytes +Combo_CTCACACTCGACGGAA-1,Dendritic cells +Combo_CTCAGAAAGAGTGACC-1,Monocytes +Combo_CTCAGAACAGCCAATT-1,Granulocytes +Combo_CTCAGAACATCACGAT-1,Granulocytes +Combo_CTCAGAACATGCAATC-1,Dendritic cells +Combo_CTCAGAAGTATAGGGC-1,Monocytes +Combo_CTCAGAAGTCCTCCAT-1,Granulocytes +Combo_CTCAGAAGTTCCACAA-1,Monocytes +Combo_CTCAGAAGTTGGGACA-1,Dendritic cells +Combo_CTCAGAATCGTCTGAA-1,Granulocytes +Combo_CTCAGAATCTTGAGAC-1,Granulocytes +Combo_CTCATTAAGACTCGGA-1,Monocytes +Combo_CTCATTAAGCGTAGTG-1,Monocytes +Combo_CTCATTAAGTGGAGAA-1,Monocytes +Combo_CTCATTACAGACACTT-1,Monocytes +Combo_CTCATTAGTACCTACA-1,T cells +Combo_CTCATTAGTAGAAAGG-1,Monocytes +Combo_CTCATTAGTTCAGACT-1,Dendritic cells +Combo_CTCATTAGTTCAGTAC-1,Monocytes +Combo_CTCATTATCCATGAGT-1,Monocytes +Combo_CTCATTATCCGTAGTA-1,Granulocytes +Combo_CTCATTATCCTGCTTG-1,Dendritic cells +Combo_CTCATTATCGTCTGAA-1,Monocytes +Combo_CTCATTATCTAACCGA-1,Monocytes +Combo_CTCCTAGAGCGAGAAA-1,Dendritic cells +Combo_CTCCTAGAGGGATGGG-1,Dendritic cells +Combo_CTCCTAGAGTTAGGTA-1,Dendritic cells +Combo_CTCCTAGCAGCTCCGA-1,Monocytes +Combo_CTCCTAGCATGTCTCC-1,T cells +Combo_CTCCTAGGTGCAGGTA-1,Monocytes +Combo_CTCCTAGGTTCATGGT-1,Dendritic cells +Combo_CTCCTAGTCAGCGACC-1,Monocytes +Combo_CTCGAAAAGTCACGCC-1,Monocytes +Combo_CTCGAAAAGTCATCCA-1,Dendritic cells +Combo_CTCGAAAAGTGCAAGC-1,T cells +Combo_CTCGAAAAGTGGGATC-1,Monocytes +Combo_CTCGAAACAGAGCCAA-1,Monocytes +Combo_CTCGAAAGTACCGTTA-1,Monocytes +Combo_CTCGAAAGTACTTGAC-1,Granulocytes +Combo_CTCGAAAGTAGCGCTC-1,Monocytes +Combo_CTCGAAAGTCAATACC-1,Dendritic cells +Combo_CTCGAAAGTGGTCCGT-1,Monocytes +Combo_CTCGAAAGTTGGTGGA-1,Macrophages +Combo_CTCGAAATCCGCGGTA-1,Monocytes +Combo_CTCGAGGAGCAGGCTA-1,Monocytes +Combo_CTCGAGGAGTAGGCCA-1,Dendritic cells +Combo_CTCGAGGAGTGAAGAG-1,Monocytes +Combo_CTCGAGGCAGCATGAG-1,Monocytes +Combo_CTCGAGGCATACTCTT-1,Granulocytes +Combo_CTCGAGGTCCCAAGAT-1,Granulocytes +Combo_CTCGAGGTCGTGACAT-1,Monocytes +Combo_CTCGGAGAGAAGAAGC-1,Monocytes +Combo_CTCGGAGAGAAGATTC-1,Granulocytes +Combo_CTCGGAGAGAGTTGGC-1,Monocytes +Combo_CTCGGAGAGTACGTAA-1,Monocytes +Combo_CTCGGAGCATACCATG-1,Monocytes +Combo_CTCGGAGCATCGGACC-1,Monocytes +Combo_CTCGGAGCATGGGACA-1,Dendritic cells +Combo_CTCGGAGTCTACTCAT-1,Monocytes +Combo_CTCGGAGTCTGTCAAG-1,Monocytes +Combo_CTCGGGAAGATGAGAG-1,Monocytes +Combo_CTCGGGAAGGCGCTCT-1,Dendritic cells +Combo_CTCGGGAAGTGACTCT-1,Monocytes +Combo_CTCGGGACAGACACTT-1,Monocytes +Combo_CTCGGGAGTCAAAGAT-1,Monocytes +Combo_CTCGGGAGTCCGCTGA-1,Monocytes +Combo_CTCGGGAGTGGCTCCA-1,Monocytes +Combo_CTCGGGAGTTTCCACC-1,Monocytes +Combo_CTCGTACAGAGGTAGA-1,Macrophages +Combo_CTCGTACAGCGTAATA-1,Dendritic cells +Combo_CTCGTACCACATCTTT-1,T cells +Combo_CTCGTACCATCCGCGA-1,Monocytes +Combo_CTCGTACGTATAAACG-1,Monocytes +Combo_CTCGTACGTCGAGATG-1,Dendritic cells +Combo_CTCGTACGTCGCCATG-1,Dendritic cells +Combo_CTCGTACGTGACGCCT-1,Monocytes +Combo_CTCGTACGTGAGGGAG-1,Dendritic cells +Combo_CTCGTACGTTCGTGAT-1,Dendritic cells +Combo_CTCGTACTCTTATCTG-1,Monocytes +Combo_CTCGTCAAGCACACAG-1,Dendritic cells +Combo_CTCGTCAAGCTGTTCA-1,Dendritic cells +Combo_CTCGTCAAGTGTTAGA-1,Monocytes +Combo_CTCGTCACATCGACGC-1,Monocytes +Combo_CTCGTCAGTACCGTAT-1,Monocytes +Combo_CTCGTCAGTAGTACCT-1,Monocytes +Combo_CTCGTCAGTCTAGCGC-1,Dendritic cells +Combo_CTCGTCATCAAACAAG-1,Monocytes +Combo_CTCGTCATCACAACGT-1,Dendritic cells +Combo_CTCGTCATCCAAGTAC-1,Dendritic cells +Combo_CTCGTCATCGTATCAG-1,Dendritic cells +Combo_CTCTAATAGACACGAC-1,Granulocytes +Combo_CTCTAATAGTATTGGA-1,Monocytes +Combo_CTCTAATCACTGAAGG-1,Monocytes +Combo_CTCTAATCAGCCACCA-1,Monocytes +Combo_CTCTAATGTACTCTCC-1,Dendritic cells +Combo_CTCTAATGTAGCCTCG-1,Monocytes +Combo_CTCTAATGTCTCGTTC-1,Dendritic cells +Combo_CTCTAATGTGCATCTA-1,Monocytes +Combo_CTCTAATGTTAAAGTG-1,Monocytes +Combo_CTCTAATGTTGTGGCC-1,Monocytes +Combo_CTCTAATTCACTTACT-1,Monocytes +Combo_CTCTAATTCATTGCGA-1,Macrophages +Combo_CTCTAATTCGTCGTTC-1,Monocytes +Combo_CTCTACGAGAGGTTGC-1,Monocytes +Combo_CTCTACGAGTTCGCAT-1,Monocytes +Combo_CTCTACGCACTCGACG-1,Monocytes +Combo_CTCTACGCATGGATGG-1,Monocytes +Combo_CTCTACGTCCCTTGCA-1,Monocytes +Combo_CTCTACGTCCGAATGT-1,Monocytes +Combo_CTCTACGTCTGGCGAC-1,Monocytes +Combo_CTCTGGTAGAAGCCCA-1,Monocytes +Combo_CTCTGGTAGAGCTTCT-1,Monocytes +Combo_CTCTGGTAGTGAATTG-1,Monocytes +Combo_CTCTGGTAGTGTACGG-1,Monocytes +Combo_CTCTGGTCAGCTTCGG-1,Monocytes +Combo_CTCTGGTGTAGCTTGT-1,Monocytes +Combo_CTCTGGTGTCCATGAT-1,Monocytes +Combo_CTCTGGTGTGAAAGAG-1,Dendritic cells +Combo_CTCTGGTGTTGTGGCC-1,Dendritic cells +Combo_CTCTGGTTCAGCGATT-1,Monocytes +Combo_CTCTGGTTCCGCGTTT-1,Dendritic cells +Combo_CTCTGGTTCCTCCTAG-1,Dendritic cells +Combo_CTGAAACAGATCTGCT-1,Monocytes +Combo_CTGAAACCACATGGGA-1,Dendritic cells +Combo_CTGAAACCACCCAGTG-1,Monocytes +Combo_CTGAAACGTAATCGTC-1,Monocytes +Combo_CTGAAACGTTCCGGCA-1,Dendritic cells +Combo_CTGAAACTCCACTGGG-1,Monocytes +Combo_CTGAAGTAGGTCGGAT-1,Monocytes +Combo_CTGAAGTGTCGTTGTA-1,Dendritic cells +Combo_CTGAAGTTCGCTTGTC-1,Monocytes +Combo_CTGAAGTTCTATCCTA-1,Monocytes +Combo_CTGAAGTTCTCCAGGG-1,Monocytes +Combo_CTGATAGAGTCCAGGA-1,Granulocytes +Combo_CTGATAGCACGGTGTC-1,Monocytes +Combo_CTGATAGCATGTCGAT-1,Dendritic cells +Combo_CTGATAGTCCTTCAAT-1,Dendritic cells +Combo_CTGATAGTCCTTTACA-1,Dendritic cells +Combo_CTGATAGTCTCGCATC-1,Granulocytes +Combo_CTGATAGTCTTGACGA-1,Dendritic cells +Combo_CTGATCCAGATGCGAC-1,Monocytes +Combo_CTGATCCAGGCTAGCA-1,Dendritic cells +Combo_CTGATCCAGGTGACCA-1,Granulocytes +Combo_CTGATCCAGTCAAGGC-1,Monocytes +Combo_CTGATCCGTAAGAGAG-1,Dendritic cells +Combo_CTGATCCGTAGGCTGA-1,Dendritic cells +Combo_CTGATCCGTCCCTACT-1,Dendritic cells +Combo_CTGATCCTCACGACTA-1,Monocytes +Combo_CTGATCCTCGTTTAGG-1,Granulocytes +Combo_CTGCCTAAGAGGGATA-1,Dendritic cells +Combo_CTGCCTAAGAGTACAT-1,Granulocytes +Combo_CTGCCTAAGATGGCGT-1,Dendritic cells +Combo_CTGCCTAAGGAATCGC-1,Monocytes +Combo_CTGCCTACAATGGAAT-1,Monocytes +Combo_CTGCCTACACATGACT-1,Granulocytes +Combo_CTGCCTAGTAGGCTGA-1,Monocytes +Combo_CTGCCTAGTCGCTTCT-1,Granulocytes +Combo_CTGCCTAGTTGATTGC-1,Monocytes +Combo_CTGCCTATCCTAGAAC-1,Granulocytes +Combo_CTGCGGAAGGTTCCTA-1,T cells +Combo_CTGCGGAAGTGCTGCC-1,Monocytes +Combo_CTGCGGAAGTGTCCCG-1,Monocytes +Combo_CTGCGGACAACTGGCC-1,Monocytes +Combo_CTGCGGACACGGTTTA-1,Dendritic cells +Combo_CTGCGGACAGTGGAGT-1,Dendritic cells +Combo_CTGCGGAGTACCGTAT-1,Monocytes +Combo_CTGCGGAGTCTAAACC-1,Dendritic cells +Combo_CTGCGGATCAGAAATG-1,Dendritic cells +Combo_CTGCGGATCCGAGCCA-1,Monocytes +Combo_CTGCTGTAGTCATGCT-1,Monocytes +Combo_CTGCTGTAGTGACATA-1,T cells +Combo_CTGCTGTAGTTTAGGA-1,Monocytes +Combo_CTGCTGTCACGGTAAG-1,Monocytes +Combo_CTGCTGTCATCCGGGT-1,Monocytes +Combo_CTGCTGTGTACCGCTG-1,Monocytes +Combo_CTGCTGTGTACTTCTT-1,Monocytes +Combo_CTGCTGTGTCGAATCT-1,Dendritic cells +Combo_CTGCTGTGTCTAAAGA-1,Granulocytes +Combo_CTGCTGTGTTAAGGGC-1,Monocytes +Combo_CTGCTGTTCAGGCAAG-1,Granulocytes +Combo_CTGCTGTTCGGACAAG-1,Monocytes +Combo_CTGGTCTAGAATGTGT-1,Granulocytes +Combo_CTGGTCTAGAATTCCC-1,Monocytes +Combo_CTGGTCTAGGCTCTTA-1,Monocytes +Combo_CTGGTCTAGTGCGATG-1,Monocytes +Combo_CTGGTCTCACACAGAG-1,Monocytes +Combo_CTGGTCTCACGGTAAG-1,Monocytes +Combo_CTGGTCTCAGGGAGAG-1,Monocytes +Combo_CTGGTCTCAGTAGAGC-1,Granulocytes +Combo_CTGGTCTGTCGGATCC-1,Monocytes +Combo_CTGGTCTGTCTCTCGT-1,Monocytes +Combo_CTGGTCTGTGAGTGAC-1,Monocytes +Combo_CTGGTCTTCATCACCC-1,Granulocytes +Combo_CTGGTCTTCCTTTCGG-1,Monocytes +Combo_CTGGTCTTCGCGCCAA-1,Dendritic cells +Combo_CTGTGCTAGACACTAA-1,Dendritic cells +Combo_CTGTGCTAGATCCTGT-1,Monocytes +Combo_CTGTGCTAGGAATTAC-1,Dendritic cells +Combo_CTGTGCTCAGATGGCA-1,Monocytes +Combo_CTGTGCTGTAACGCGA-1,Dendritic cells +Combo_CTGTGCTGTCTTTCAT-1,Dendritic cells +Combo_CTGTGCTTCCGTCATC-1,Monocytes +Combo_CTGTGCTTCTACTATC-1,Dendritic cells +Combo_CTGTTTAAGAAACCGC-1,Dendritic cells +Combo_CTGTTTACAGCTGTTA-1,Dendritic cells +Combo_CTGTTTACATGCATGT-1,Monocytes +Combo_CTGTTTAGTCAATACC-1,Monocytes +Combo_CTGTTTAGTTGATTCG-1,Dendritic cells +Combo_CTGTTTATCGACAGCC-1,Monocytes +Combo_CTTAACTAGACGACGT-1,Monocytes +Combo_CTTAACTAGATGTGTA-1,Monocytes +Combo_CTTAACTAGTACCGGA-1,Monocytes +Combo_CTTAACTCAAAGTGCG-1,Monocytes +Combo_CTTAACTCAGCGATCC-1,Dendritic cells +Combo_CTTAACTCAGGGTATG-1,Monocytes +Combo_CTTAACTCATACGCCG-1,Monocytes +Combo_CTTAACTGTAACGACG-1,Dendritic cells +Combo_CTTAACTGTACAGTGG-1,Dendritic cells +Combo_CTTAACTGTACTCAAC-1,Dendritic cells +Combo_CTTAACTGTATGAAAC-1,Monocytes +Combo_CTTAACTGTCCGAAGA-1,Macrophages +Combo_CTTAACTGTCTAGCGC-1,Dendritic cells +Combo_CTTAACTGTTACGGAG-1,Monocytes +Combo_CTTAACTTCAGTTAGC-1,Dendritic cells +Combo_CTTACCGAGATGTGTA-1,Monocytes +Combo_CTTACCGAGCTGATAA-1,Dendritic cells +Combo_CTTACCGAGGAGTTTA-1,Monocytes +Combo_CTTACCGCACTTCTGC-1,Monocytes +Combo_CTTACCGCAGATAATG-1,Dendritic cells +Combo_CTTACCGCATCAGTAC-1,Granulocytes +Combo_CTTACCGCATTAGCCA-1,Macrophages +Combo_CTTACCGGTAAGGATT-1,Granulocytes +Combo_CTTACCGGTTACTGAC-1,Dendritic cells +Combo_CTTACCGGTTCTGGTA-1,Dendritic cells +Combo_CTTACCGTCACAAACC-1,Monocytes +Combo_CTTAGGAAGGCTAGAC-1,Monocytes +Combo_CTTAGGAGTTCCCTTG-1,Monocytes +Combo_CTTAGGATCATTGCGA-1,Monocytes +Combo_CTTAGGATCCCTCAGT-1,Monocytes +Combo_CTTAGGATCTGTCTCG-1,Monocytes +Combo_CTTCTCTAGGAGCGTT-1,Monocytes +Combo_CTTCTCTAGGCTACGA-1,Granulocytes +Combo_CTTCTCTAGTTACCCA-1,Granulocytes +Combo_CTTCTCTCAAGCCATT-1,Granulocytes +Combo_CTTCTCTCACCTCGGA-1,Granulocytes +Combo_CTTCTCTCATGAAGTA-1,Granulocytes +Combo_CTTCTCTGTCACCTAA-1,Dendritic cells +Combo_CTTCTCTGTCATATCG-1,Monocytes +Combo_CTTCTCTTCACTCCTG-1,Monocytes +Combo_CTTCTCTTCACTGGGC-1,Monocytes +Combo_CTTCTCTTCCTTCAAT-1,Monocytes +Combo_CTTCTCTTCGTCGTTC-1,T cells +Combo_CTTCTCTTCTGATTCT-1,Monocytes +Combo_CTTGGCTAGACATAAC-1,Granulocytes +Combo_CTTGGCTAGAGACTAT-1,Monocytes +Combo_CTTGGCTAGCAGGTCA-1,Monocytes +Combo_CTTGGCTAGCGATATA-1,Monocytes +Combo_CTTGGCTCACATTAGC-1,Granulocytes +Combo_CTTGGCTGTGAGGGTT-1,Granulocytes +Combo_CTTGGCTGTTACGGAG-1,Dendritic cells +Combo_CTTGGCTTCATTTGGG-1,Granulocytes +Combo_CTTGGCTTCTGCAAGT-1,Dendritic cells +Combo_CTTTGCGAGGCTCTTA-1,Monocytes +Combo_CTTTGCGCACTGAAGG-1,Monocytes +Combo_CTTTGCGCAGATGGGT-1,Granulocytes +Combo_CTTTGCGCAGGTGGAT-1,Dendritic cells +Combo_GAAACTCAGCAGATCG-1,Granulocytes +Combo_GAAACTCAGGACTGGT-1,Granulocytes +Combo_GAAACTCAGGATGTAT-1,Monocytes +Combo_GAAACTCAGTCCCACG-1,Monocytes +Combo_GAAACTCGTCAGAAGC-1,Dendritic cells +Combo_GAAACTCGTGCTTCTC-1,Monocytes +Combo_GAAACTCTCAGCAACT-1,Granulocytes +Combo_GAAACTCTCTACTATC-1,Monocytes +Combo_GAAATGAAGCCCTAAT-1,Monocytes +Combo_GAAATGAAGTCTCCTC-1,Monocytes +Combo_GAAATGAAGTTGAGTA-1,Monocytes +Combo_GAAATGAGTCCAGTAT-1,Dendritic cells +Combo_GAAATGAGTGTAACGG-1,Monocytes +Combo_GAAATGATCAAGGTAA-1,Monocytes +Combo_GAAATGATCATATCGG-1,Monocytes +Combo_GAACATCCAAGAAAGG-1,Monocytes +Combo_GAACATCCAGTGGGAT-1,Dendritic cells +Combo_GAACATCCATAGACTC-1,Dendritic cells +Combo_GAACATCGTCTAGAGG-1,Monocytes +Combo_GAACATCGTCTGCCAG-1,Monocytes +Combo_GAACATCTCGCCTGTT-1,Dendritic cells +Combo_GAACATCTCGTTGCCT-1,Monocytes +Combo_GAACCTAAGACCTTTG-1,Dendritic cells +Combo_GAACCTAAGCCTCGTG-1,Monocytes +Combo_GAACCTAAGCGCCTCA-1,Granulocytes +Combo_GAACCTAAGGAGCGTT-1,Monocytes +Combo_GAACCTAAGTCACGCC-1,Monocytes +Combo_GAACCTACAAGCCGTC-1,Monocytes +Combo_GAACCTACACCGATAT-1,Monocytes +Combo_GAACCTAGTACTTGAC-1,Granulocytes +Combo_GAACCTAGTGATAAAC-1,Monocytes +Combo_GAACCTATCCACGAAT-1,Granulocytes +Combo_GAACCTATCGCTTGTC-1,Monocytes +Combo_GAACCTATCGTTTAGG-1,Monocytes +Combo_GAACGGAGTACACCGC-1,Dendritic cells +Combo_GAACGGAGTCCAAGTT-1,Dendritic cells +Combo_GAACGGAGTTCCACTC-1,Granulocytes +Combo_GAACGGAGTTTGACTG-1,Monocytes +Combo_GAACGGATCATACGGT-1,Dendritic cells +Combo_GAACGGATCGAGAGCA-1,Monocytes +Combo_GAACGGATCTCACATT-1,Monocytes +Combo_GAAGCAGAGACAAGCC-1,Monocytes +Combo_GAAGCAGAGGTAGCCA-1,Monocytes +Combo_GAAGCAGCACTTAACG-1,Dendritic cells +Combo_GAAGCAGCAGATCGGA-1,Monocytes +Combo_GAAGCAGTCACCGTAA-1,Monocytes +Combo_GAAGCAGTCATTGCCC-1,Granulocytes +Combo_GAAGCAGTCCACTGGG-1,Monocytes +Combo_GAAGCAGTCTATCGCC-1,Macrophages +Combo_GAAGCAGTCTGCAAGT-1,Dendritic cells +Combo_GAATAAGAGATTACCC-1,Monocytes +Combo_GAATAAGAGTAGGTGC-1,Granulocytes +Combo_GAATAAGCATCCCATC-1,Monocytes +Combo_GAATAAGGTCAACATC-1,Monocytes +Combo_GAATAAGGTCCGTTAA-1,Dendritic cells +Combo_GAATAAGTCACTTCAT-1,Dendritic cells +Combo_GAATAAGTCAGTCAGT-1,Granulocytes +Combo_GAATAAGTCCGTCATC-1,Monocytes +Combo_GAATAAGTCTCCGGTT-1,Granulocytes +Combo_GAATGAAAGGCGTACA-1,Dendritic cells +Combo_GAATGAACAAGGACAC-1,Granulocytes +Combo_GAATGAACACAACTGT-1,Monocytes +Combo_GAATGAAGTAAGGATT-1,Dendritic cells +Combo_GAATGAAGTATGGTTC-1,Monocytes +Combo_GAATGAAGTCTGATCA-1,Monocytes +Combo_GAATGAATCACATGCA-1,Monocytes +Combo_GAATGAATCTAGAGTC-1,Monocytes +Combo_GAATGAATCTGTCTAT-1,Dendritic cells +Combo_GACACGCAGCCAACAG-1,Monocytes +Combo_GACACGCCATCGGAAG-1,Monocytes +Combo_GACACGCGTAGAGTGC-1,Monocytes +Combo_GACACGCGTTTCCACC-1,Monocytes +Combo_GACACGCTCATGTCCC-1,Monocytes +Combo_GACACGCTCCCGGATG-1,Dendritic cells +Combo_GACAGAGAGAATCTCC-1,Granulocytes +Combo_GACAGAGAGAGCTGCA-1,Monocytes +Combo_GACAGAGAGCAGATCG-1,Monocytes +Combo_GACAGAGAGGCACATG-1,Granulocytes +Combo_GACAGAGGTCAGAAGC-1,Monocytes +Combo_GACAGAGGTCTTTCAT-1,Dendritic cells +Combo_GACAGAGGTTCGGCAC-1,Monocytes +Combo_GACAGAGGTTGACGTT-1,Monocytes +Combo_GACAGAGTCTGATTCT-1,Dendritic cells +Combo_GACCAATAGCACAGGT-1,Monocytes +Combo_GACCAATAGCTAAACA-1,Monocytes +Combo_GACCAATAGTACGCGA-1,Granulocytes +Combo_GACCAATCAAGGACAC-1,Dendritic cells +Combo_GACCAATGTCTTTCAT-1,Dendritic cells +Combo_GACCAATGTTCGCGAC-1,Monocytes +Combo_GACCTGGCAAGGACAC-1,Dendritic cells +Combo_GACCTGGCACACCGCA-1,Monocytes +Combo_GACCTGGCAGCCTGTG-1,Monocytes +Combo_GACCTGGCATCCGTGG-1,Dendritic cells +Combo_GACCTGGGTGACAAAT-1,Dendritic cells +Combo_GACCTGGGTGATGATA-1,Dendritic cells +Combo_GACCTGGGTGGAAAGA-1,Dendritic cells +Combo_GACCTGGTCACGCGGT-1,Monocytes +Combo_GACCTGGTCAGCGATT-1,Dendritic cells +Combo_GACCTGGTCCTGCCAT-1,Monocytes +Combo_GACCTGGTCGGATGGA-1,Granulocytes +Combo_GACGCGTAGACTCGGA-1,Monocytes +Combo_GACGCGTAGAGAACAG-1,Monocytes +Combo_GACGCGTAGGCTACGA-1,Dendritic cells +Combo_GACGCGTAGGGCTTCC-1,Monocytes +Combo_GACGCGTCAATGGATA-1,Monocytes +Combo_GACGCGTCATCGACGC-1,Monocytes +Combo_GACGCGTCATGGGACA-1,Monocytes +Combo_GACGCGTGTCATATCG-1,Monocytes +Combo_GACGCGTGTCTAGTCA-1,Macrophages +Combo_GACGCGTTCGACAGCC-1,Monocytes +Combo_GACGCGTTCGCCTGAG-1,Monocytes +Combo_GACGCGTTCGTCGTTC-1,Granulocytes +Combo_GACGCGTTCTTGTACT-1,Dendritic cells +Combo_GACGGCTAGAGTGACC-1,Monocytes +Combo_GACGGCTAGCTGCCCA-1,Granulocytes +Combo_GACGGCTAGGAGTTGC-1,Monocytes +Combo_GACGGCTCACCAGCAC-1,Dendritic cells +Combo_GACGGCTCACGAGGTA-1,Dendritic cells +Combo_GACGGCTCATGCCACG-1,Monocytes +Combo_GACGGCTGTCATTAGC-1,Monocytes +Combo_GACGGCTGTGGTGTAG-1,Monocytes +Combo_GACGGCTGTGTTGGGA-1,Monocytes +Combo_GACGGCTTCATGTCCC-1,Granulocytes +Combo_GACGGCTTCGGTGTCG-1,Dendritic cells +Combo_GACGTGCAGGCTAGGT-1,Monocytes +Combo_GACGTGCAGGTGATAT-1,Granulocytes +Combo_GACGTGCCACGAAAGC-1,Monocytes +Combo_GACGTGCCACTTACGA-1,Monocytes +Combo_GACGTGCCATTCCTCG-1,Dendritic cells +Combo_GACGTGCGTTCACGGC-1,Monocytes +Combo_GACGTGCTCTAACTTC-1,Monocytes +Combo_GACGTTAAGTTGAGAT-1,Monocytes +Combo_GACGTTACATCCGTGG-1,Monocytes +Combo_GACGTTAGTCTGCCAG-1,Monocytes +Combo_GACGTTATCCGTAGGC-1,Monocytes +Combo_GACGTTATCCTTGGTC-1,Dendritic cells +Combo_GACGTTATCGCCGTGA-1,T cells +Combo_GACTAACAGCTCAACT-1,Dendritic cells +Combo_GACTAACCAAGCTGTT-1,Dendritic cells +Combo_GACTAACCACACTGCG-1,Dendritic cells +Combo_GACTAACCATCCCATC-1,Granulocytes +Combo_GACTAACGTCTTCGTC-1,Monocytes +Combo_GACTAACTCTGATTCT-1,Monocytes +Combo_GACTACAAGAATAGGG-1,Monocytes +Combo_GACTACAAGATCACGG-1,Granulocytes +Combo_GACTACAAGTCCATAC-1,Dendritic cells +Combo_GACTACACAGATGGGT-1,Monocytes +Combo_GACTACAGTCAAACTC-1,Monocytes +Combo_GACTACAGTCGACTAT-1,T cells +Combo_GACTACATCGAATCCA-1,Monocytes +Combo_GACTGCGAGAGACTAT-1,Granulocytes +Combo_GACTGCGAGAGGACGG-1,Dendritic cells +Combo_GACTGCGAGATACACA-1,Dendritic cells +Combo_GACTGCGAGCGTCTAT-1,Monocytes +Combo_GACTGCGCAAGTTGTC-1,Monocytes +Combo_GACTGCGGTCAGAGGT-1,Granulocytes +Combo_GACTGCGGTGCCTGCA-1,T cells +Combo_GACTGCGGTGCGATAG-1,T cells +Combo_GACTGCGGTTAGGGTG-1,Monocytes +Combo_GACTGCGTCCCAGGTG-1,Monocytes +Combo_GACTGCGTCCTAAGTG-1,Monocytes +Combo_GACTGCGTCTCTTATG-1,Monocytes +Combo_GAGCAGAAGACGCTTT-1,Monocytes +Combo_GAGCAGAAGGATGGTC-1,Dendritic cells +Combo_GAGCAGACAATGGTCT-1,Monocytes +Combo_GAGCAGACACACATGT-1,Dendritic cells +Combo_GAGCAGACACGCTTTC-1,Monocytes +Combo_GAGCAGACACGTAAGG-1,Monocytes +Combo_GAGCAGACATGCCTTC-1,Monocytes +Combo_GAGCAGACATTAGGCT-1,Granulocytes +Combo_GAGCAGAGTAAATGAC-1,Dendritic cells +Combo_GAGCAGAGTTCCGGCA-1,Dendritic cells +Combo_GAGCAGATCAATCACG-1,Monocytes +Combo_GAGCAGATCAGCTGGC-1,Monocytes +Combo_GAGCAGATCTCTAAGG-1,Dendritic cells +Combo_GAGGTGAAGACCACGA-1,Dendritic cells +Combo_GAGGTGAAGGTGCTTT-1,Granulocytes +Combo_GAGGTGACACAACTGT-1,Monocytes +Combo_GAGGTGAGTATCTGCA-1,Dendritic cells +Combo_GAGGTGAGTTCCTCCA-1,Monocytes +Combo_GAGGTGATCCACGAAT-1,Monocytes +Combo_GAGGTGATCCTATGTT-1,Dendritic cells +Combo_GAGGTGATCGCCAAAT-1,Monocytes +Combo_GAGGTGATCGGCATCG-1,Dendritic cells +Combo_GAGGTGATCTATCGCC-1,Monocytes +Combo_GAGTCCGCACCAACCG-1,Monocytes +Combo_GAGTCCGCACGAAATA-1,Dendritic cells +Combo_GAGTCCGGTCTGCCAG-1,Monocytes +Combo_GAGTCCGTCTGTGCAA-1,Macrophages +Combo_GAGTCCGTCTTTAGGG-1,Monocytes +Combo_GATCAGTAGGCCGAAT-1,Dendritic cells +Combo_GATCAGTCATCGTCGG-1,Monocytes +Combo_GATCAGTGTCGGATCC-1,Monocytes +Combo_GATCAGTTCACGATGT-1,Granulocytes +Combo_GATCAGTTCTCAAACG-1,Monocytes +Combo_GATCGATAGACAAGCC-1,Monocytes +Combo_GATCGATAGAGTGACC-1,Dendritic cells +Combo_GATCGATAGCGATGAC-1,Monocytes +Combo_GATCGATAGGCAAAGA-1,Monocytes +Combo_GATCGATCAACTTGAC-1,Monocytes +Combo_GATCGATGTAGAGCTG-1,Monocytes +Combo_GATCGATTCTCGATGA-1,Macrophages +Combo_GATCGCGAGATGCCAG-1,Dendritic cells +Combo_GATCGCGAGGCAGTCA-1,Monocytes +Combo_GATCGTAAGAAACCAT-1,Granulocytes +Combo_GATCGTAGTACCCAAT-1,Monocytes +Combo_GATCGTAGTATATCCG-1,Monocytes +Combo_GATCGTAGTATCGCAT-1,Monocytes +Combo_GATCGTAGTATGCTTG-1,Monocytes +Combo_GATCGTAGTCTAGAGG-1,Monocytes +Combo_GATCGTATCCTAGGGC-1,Monocytes +Combo_GATCTAGAGCGTTCCG-1,Monocytes +Combo_GATCTAGAGGGTTTCT-1,Monocytes +Combo_GATCTAGCACCCATGG-1,Monocytes +Combo_GATCTAGCACGCATCG-1,Monocytes +Combo_GATCTAGCAGTGAGTG-1,Dendritic cells +Combo_GATCTAGCATCTACGA-1,Monocytes +Combo_GATCTAGGTCGATTGT-1,Monocytes +Combo_GATCTAGTCGGCGCTA-1,Granulocytes +Combo_GATGAAAAGACGCTTT-1,Dendritic cells +Combo_GATGAAAAGAGGTTAT-1,Monocytes +Combo_GATGAAAAGATATGGT-1,Monocytes +Combo_GATGAAAAGGACAGAA-1,Monocytes +Combo_GATGAAACAGACGCTC-1,Dendritic cells +Combo_GATGAAAGTGTGACCC-1,Granulocytes +Combo_GATGAAAGTGTTTGTG-1,Dendritic cells +Combo_GATGAAAGTTCCACGG-1,Monocytes +Combo_GATGAAAGTTTGACTG-1,Monocytes +Combo_GATGAAATCTTATCTG-1,Granulocytes +Combo_GATGAGGAGAGCAATT-1,Dendritic cells +Combo_GATGAGGAGATGCCAG-1,Granulocytes +Combo_GATGAGGAGCCGCCTA-1,Dendritic cells +Combo_GATGAGGAGCGCCTCA-1,Monocytes +Combo_GATGAGGAGGTCGGAT-1,Monocytes +Combo_GATGAGGAGTGCCAGA-1,Monocytes +Combo_GATGAGGAGTTAGCGG-1,Monocytes +Combo_GATGAGGCAACTTGAC-1,Dendritic cells +Combo_GATGAGGCAGACGCTC-1,Granulocytes +Combo_GATGAGGGTATGAAAC-1,Monocytes +Combo_GATGAGGTCCCAAGAT-1,Monocytes +Combo_GATGAGGTCCCAGGTG-1,Monocytes +Combo_GATGAGGTCGGAGCAA-1,Monocytes +Combo_GATGCTAAGCAACGGT-1,Monocytes +Combo_GATGCTAAGTGGTAGC-1,Monocytes +Combo_GATGCTAAGTTAAGTG-1,Monocytes +Combo_GATGCTAGTACTTCTT-1,Dendritic cells +Combo_GATGCTAGTCTAGTCA-1,Monocytes +Combo_GATGCTATCGTCACGG-1,Monocytes +Combo_GATGCTATCTCACATT-1,Monocytes +Combo_GATTCAGAGCGTTGCC-1,Monocytes +Combo_GATTCAGAGTAGGCCA-1,Dendritic cells +Combo_GATTCAGAGTCGAGTG-1,Dendritic cells +Combo_GATTCAGCACACCGCA-1,Monocytes +Combo_GATTCAGTCAGCAACT-1,T cells +Combo_GATTCAGTCTGGTGTA-1,Monocytes +Combo_GCAAACTAGATGCGAC-1,Monocytes +Combo_GCAAACTAGCAGATCG-1,Monocytes +Combo_GCAAACTAGCGCCTCA-1,Monocytes +Combo_GCAAACTAGGGTTTCT-1,Granulocytes +Combo_GCAAACTCAAGTTAAG-1,Monocytes +Combo_GCAAACTCAGTTCATG-1,Granulocytes +Combo_GCAAACTCATCGGGTC-1,Dendritic cells +Combo_GCAAACTGTAGAAGGA-1,Granulocytes +Combo_GCAAACTGTCAGGACA-1,Dendritic cells +Combo_GCAATCAAGACTAAGT-1,Dendritic cells +Combo_GCAATCAAGCCGTCGT-1,Granulocytes +Combo_GCAATCAAGTCGAGTG-1,Monocytes +Combo_GCAATCAAGTTAGCGG-1,Dendritic cells +Combo_GCAATCACAATCCAAC-1,Dendritic cells +Combo_GCAATCACACATTCGA-1,Dendritic cells +Combo_GCAATCAGTAAGGGAA-1,Dendritic cells +Combo_GCAATCAGTCAGCTAT-1,Monocytes +Combo_GCAATCATCAACACCA-1,Monocytes +Combo_GCAATCATCAGTTCGA-1,Monocytes +Combo_GCAATCATCATGGTCA-1,Monocytes +Combo_GCAATCATCGGTGTCG-1,Granulocytes +Combo_GCAATCATCTGTCAAG-1,Monocytes +Combo_GCACATAAGCTAGTGG-1,Dendritic cells +Combo_GCACATAAGTCTCCTC-1,Monocytes +Combo_GCACATACACACTGCG-1,Monocytes +Combo_GCACATACATGGATGG-1,Monocytes +Combo_GCACATAGTAAACCTC-1,Monocytes +Combo_GCACATAGTCATCGGC-1,Monocytes +Combo_GCACATAGTTCGAATC-1,Granulocytes +Combo_GCACATATCACGGTTA-1,Monocytes +Combo_GCACATATCATCTGTT-1,Monocytes +Combo_GCACATATCTAACTCT-1,Dendritic cells +Combo_GCACTCTAGAAACCTA-1,Monocytes +Combo_GCACTCTAGCAGCCTC-1,Monocytes +Combo_GCACTCTCATCCCATC-1,Dendritic cells +Combo_GCACTCTTCGAGAACG-1,Granulocytes +Combo_GCAGCCAAGCCTATGT-1,Dendritic cells +Combo_GCAGCCAAGGGAACGG-1,Monocytes +Combo_GCAGCCACACCGTTGG-1,Granulocytes +Combo_GCAGCCACAGGACGTA-1,Dendritic cells +Combo_GCAGCCACAGGTGGAT-1,Monocytes +Combo_GCAGCCACATCTCCCA-1,Monocytes +Combo_GCAGCCAGTTAAGAAC-1,Monocytes +Combo_GCAGCCATCATCTGTT-1,T cells +Combo_GCAGCCATCCTTTACA-1,Monocytes +Combo_GCAGCCATCTACTATC-1,Granulocytes +Combo_GCAGTTAAGAGGGATA-1,Monocytes +Combo_GCAGTTACAATCTGCA-1,Monocytes +Combo_GCAGTTACATTCTTAC-1,Monocytes +Combo_GCAGTTAGTGGTCCGT-1,Monocytes +Combo_GCAGTTATCATCTGCC-1,Monocytes +Combo_GCAGTTATCCGCAGTG-1,Monocytes +Combo_GCAGTTATCTTCGGTC-1,Monocytes +Combo_GCATACAAGCTGCAAG-1,T cells +Combo_GCATACACAACGATCT-1,Monocytes +Combo_GCATACACACAGACTT-1,Monocytes +Combo_GCATACACAGCTGTAT-1,Dendritic cells +Combo_GCATACAGTGGCAAAC-1,T cells +Combo_GCATGATAGATCGATA-1,Monocytes +Combo_GCATGATAGCCAGGAT-1,Monocytes +Combo_GCATGATAGTGGGCTA-1,Dendritic cells +Combo_GCATGATCAACTGCGC-1,Monocytes +Combo_GCATGATCACCAACCG-1,Monocytes +Combo_GCATGATCAGTCGTGC-1,Monocytes +Combo_GCATGATGTACCATCA-1,Granulocytes +Combo_GCATGATGTCGCGGTT-1,Dendritic cells +Combo_GCATGATGTGGTCCGT-1,Monocytes +Combo_GCATGATTCGGAGGTA-1,Monocytes +Combo_GCATGCGAGAGCCCAA-1,Monocytes +Combo_GCATGCGAGCAGACTG-1,Monocytes +Combo_GCATGCGAGGCTAGCA-1,Monocytes +Combo_GCATGCGCATTAGGCT-1,T cells +Combo_GCATGCGGTCTACCTC-1,Monocytes +Combo_GCATGCGGTTAAGGGC-1,Monocytes +Combo_GCATGCGTCAGCATGT-1,Dendritic cells +Combo_GCATGCGTCGGCGCTA-1,Monocytes +Combo_GCATGTAAGACTAAGT-1,Monocytes +Combo_GCATGTACACTTGGAT-1,Dendritic cells +Combo_GCATGTATCAAGGCTT-1,Granulocytes +Combo_GCCAAATAGATATACG-1,Dendritic cells +Combo_GCCAAATAGCTGCAAG-1,Monocytes +Combo_GCCAAATAGGGCTTGA-1,Dendritic cells +Combo_GCCAAATAGGTGGGTT-1,Granulocytes +Combo_GCCAAATCATCTCGCT-1,Monocytes +Combo_GCCAAATCATTGTGCA-1,Monocytes +Combo_GCCAAATGTAAACCTC-1,Monocytes +Combo_GCCAAATGTAAATGAC-1,Monocytes +Combo_GCCAAATGTCAACATC-1,Granulocytes +Combo_GCCAAATGTCTTGCGG-1,Dendritic cells +Combo_GCCAAATGTGTGGCTC-1,Monocytes +Combo_GCCAAATTCAAACAAG-1,Monocytes +Combo_GCCAAATTCACCCGAG-1,Dendritic cells +Combo_GCCAAATTCCGCAAGC-1,Monocytes +Combo_GCCAAATTCCTATGTT-1,Dendritic cells +Combo_GCCTCTAAGACATAAC-1,Monocytes +Combo_GCCTCTAAGGTGCTAG-1,Granulocytes +Combo_GCCTCTAAGTGACATA-1,Granulocytes +Combo_GCCTCTAAGTGACTCT-1,Monocytes +Combo_GCCTCTACACTGAAGG-1,Monocytes +Combo_GCCTCTACATGCCTAA-1,Granulocytes +Combo_GCCTCTAGTCCAGTGC-1,Monocytes +Combo_GCCTCTAGTCTAGCCG-1,Dendritic cells +Combo_GCCTCTAGTCTCTCGT-1,Dendritic cells +Combo_GCCTCTAGTTATTCTC-1,Granulocytes +Combo_GCGACCAAGACTAGAT-1,Monocytes +Combo_GCGACCAAGCCTCGTG-1,Monocytes +Combo_GCGACCACAAGTTCTG-1,Dendritic cells +Combo_GCGACCACAGACGCAA-1,Monocytes +Combo_GCGACCACATCTCGCT-1,Monocytes +Combo_GCGACCAGTCATACTG-1,Dendritic cells +Combo_GCGACCATCATGTCCC-1,Monocytes +Combo_GCGACCATCTACTTAC-1,Monocytes +Combo_GCGACCATCTGGCGAC-1,Dendritic cells +Combo_GCGAGAAAGCTGATAA-1,Monocytes +Combo_GCGAGAAAGGCTAGCA-1,Monocytes +Combo_GCGAGAACAAGTTGTC-1,Monocytes +Combo_GCGAGAAGTAGTAGTA-1,Granulocytes +Combo_GCGAGAAGTCTAGGTT-1,Dendritic cells +Combo_GCGAGAATCCACGTGG-1,Monocytes +Combo_GCGAGAATCCGCAGTG-1,Dendritic cells +Combo_GCGAGAATCTTGACGA-1,Dendritic cells +Combo_GCGCAACAGATGAGAG-1,Monocytes +Combo_GCGCAACAGTTTAGGA-1,Dendritic cells +Combo_GCGCAACCACACTGCG-1,Dendritic cells +Combo_GCGCAACCACGTCTCT-1,Dendritic cells +Combo_GCGCAACGTTCTGTTT-1,Monocytes +Combo_GCGCAACTCATGTCTT-1,T cells +Combo_GCGCAACTCGACGGAA-1,Monocytes +Combo_GCGCAACTCGCGCCAA-1,Granulocytes +Combo_GCGCAACTCGTATCAG-1,Monocytes +Combo_GCGCAACTCTGCAAGT-1,Granulocytes +Combo_GCGCAACTCTGTGCAA-1,Monocytes +Combo_GCGCAACTCTTGAGGT-1,Monocytes +Combo_GCGCAGTCAATCGGTT-1,Granulocytes +Combo_GCGCAGTCACATGGGA-1,Dendritic cells +Combo_GCGCAGTGTAGAAAGG-1,Granulocytes +Combo_GCGCAGTTCACAGTAC-1,Monocytes +Combo_GCGCAGTTCTCCTATA-1,Dendritic cells +Combo_GCGCAGTTCTTGTCAT-1,Monocytes +Combo_GCGCCAAAGCGTGTCC-1,Monocytes +Combo_GCGCCAAAGGTGCTAG-1,Monocytes +Combo_GCGCCAACAACTGCGC-1,Monocytes +Combo_GCGCCAACACAACGTT-1,Granulocytes +Combo_GCGCCAACATACGCCG-1,Monocytes +Combo_GCGCCAAGTCATGCCG-1,Granulocytes +Combo_GCGCCAAGTTAAGTAG-1,Monocytes +Combo_GCGCCAAGTTGAACTC-1,Monocytes +Combo_GCGCGATCAGAGTGTG-1,Granulocytes +Combo_GCGCGATCAGATTGCT-1,Monocytes +Combo_GCGCGATCATAGAAAC-1,Dendritic cells +Combo_GCGCGATTCACCACCT-1,Monocytes +Combo_GCGCGATTCATACGGT-1,Dendritic cells +Combo_GCGCGATTCCGCAGTG-1,Monocytes +Combo_GCGGGTTGTAAAGGAG-1,Dendritic cells +Combo_GCGGGTTTCTGAGGGA-1,Monocytes +Combo_GCGGGTTTCTGGTTCC-1,Granulocytes +Combo_GCGGGTTTCTTCAACT-1,Monocytes +Combo_GCTCCTAAGCTGTTCA-1,Dendritic cells +Combo_GCTCCTAGTAAATGAC-1,Monocytes +Combo_GCTCCTAGTGAGGCTA-1,Monocytes +Combo_GCTCCTAGTGATGTCT-1,Monocytes +Combo_GCTCCTAGTGTGAATA-1,Monocytes +Combo_GCTCCTATCGGAAATA-1,Dendritic cells +Combo_GCTCTGTCAACGATGG-1,Granulocytes +Combo_GCTCTGTCAAGAGGCT-1,Granulocytes +Combo_GCTCTGTGTAAAGTCA-1,Monocytes +Combo_GCTCTGTGTCGCCATG-1,Monocytes +Combo_GCTCTGTGTTACCGAT-1,Monocytes +Combo_GCTCTGTTCTTACCTA-1,Dendritic cells +Combo_GCTGCAGAGACTAAGT-1,Monocytes +Combo_GCTGCAGAGCGATTCT-1,Monocytes +Combo_GCTGCAGAGCGTCTAT-1,Monocytes +Combo_GCTGCAGCAGTCTTCC-1,Monocytes +Combo_GCTGCAGGTAGTAGTA-1,Monocytes +Combo_GCTGCAGGTATAGTAG-1,Dendritic cells +Combo_GCTGCAGGTTGGTAAA-1,Monocytes +Combo_GCTGCAGTCATGCATG-1,Monocytes +Combo_GCTGCAGTCGACCAGC-1,Granulocytes +Combo_GCTGCGAAGAGCTGGT-1,Dendritic cells +Combo_GCTGCGAAGCTAACAA-1,Granulocytes +Combo_GCTGCGAAGGCATTGG-1,Monocytes +Combo_GCTGCGAGTCCGTCAG-1,Monocytes +Combo_GCTGCGATCCGGCACA-1,Dendritic cells +Combo_GCTGCGATCGGCGCTA-1,Monocytes +Combo_GCTGCTTAGGTGGGTT-1,Monocytes +Combo_GCTGCTTCACCCAGTG-1,Granulocytes +Combo_GCTGCTTGTCACAAGG-1,Monocytes +Combo_GCTGCTTTCCCTAACC-1,Dendritic cells +Combo_GCTGGGTCAGCTGCTG-1,Dendritic cells +Combo_GCTGGGTCATACGCTA-1,Monocytes +Combo_GCTGGGTGTACCATCA-1,Monocytes +Combo_GCTGGGTGTACTTCTT-1,Dendritic cells +Combo_GCTGGGTTCACCACCT-1,Monocytes +Combo_GCTGGGTTCACTCTTA-1,Monocytes +Combo_GCTTCCAAGTAGCCGA-1,Monocytes +Combo_GCTTCCACAAACTGTC-1,Dendritic cells +Combo_GCTTCCACAATGAATG-1,Granulocytes +Combo_GCTTCCAGTATATCCG-1,Monocytes +Combo_GCTTCCAGTGAGTGAC-1,Monocytes +Combo_GCTTCCAGTTACGCGC-1,Monocytes +Combo_GCTTCCAGTTTGGGCC-1,Monocytes +Combo_GCTTGAAAGAAGGCCT-1,Monocytes +Combo_GCTTGAAAGGGTGTGT-1,Dendritic cells +Combo_GCTTGAAAGTTTAGGA-1,Monocytes +Combo_GCTTGAACAACACGCC-1,T cells +Combo_GCTTGAACACAGCCCA-1,Monocytes +Combo_GCTTGAACACCGCTAG-1,Monocytes +Combo_GCTTGAACACGCTTTC-1,Dendritic cells +Combo_GCTTGAACATGCTAGT-1,Dendritic cells +Combo_GCTTGAAGTCGTGGCT-1,Dendritic cells +Combo_GCTTGAAGTGACTCAT-1,Monocytes +Combo_GCTTGAATCAATAAGG-1,T cells +Combo_GGAAAGCAGAAGCCCA-1,Monocytes +Combo_GGAAAGCAGAAGGCCT-1,Granulocytes +Combo_GGAAAGCCAACTGCGC-1,Monocytes +Combo_GGAAAGCCATGCGCAC-1,Monocytes +Combo_GGAAAGCGTGTAATGA-1,Monocytes +Combo_GGAAAGCGTTTCCACC-1,Monocytes +Combo_GGAAAGCTCAAACCAC-1,Monocytes +Combo_GGAAAGCTCAGTACGT-1,Granulocytes +Combo_GGAAAGCTCTTACCGC-1,Monocytes +Combo_GGAACTTAGAGAACAG-1,Granulocytes +Combo_GGAACTTAGAGTAATC-1,Monocytes +Combo_GGAACTTGTCGCATAT-1,T cells +Combo_GGAACTTGTCGTCTTC-1,Granulocytes +Combo_GGAACTTTCGTATCAG-1,Granulocytes +Combo_GGAATAAAGGCTATCT-1,Monocytes +Combo_GGAATAAAGTGACTCT-1,Monocytes +Combo_GGAATAACACTCTGTC-1,Monocytes +Combo_GGAATAACATGATCCA-1,Monocytes +Combo_GGAATAAGTCGAGTTT-1,Dendritic cells +Combo_GGAATAAGTGCACGAA-1,Granulocytes +Combo_GGAATAATCAAAGACA-1,Monocytes +Combo_GGACAAGAGCCTTGAT-1,Monocytes +Combo_GGACAAGAGCGATCCC-1,Monocytes +Combo_GGACAAGAGGAGTACC-1,Granulocytes +Combo_GGACAAGCAAATTGCC-1,Dendritic cells +Combo_GGACAAGCACATCCAA-1,Granulocytes +Combo_GGACAAGCATGCAATC-1,Dendritic cells +Combo_GGACAAGGTAAGCACG-1,Monocytes +Combo_GGACAAGGTACGCACC-1,Dendritic cells +Combo_GGACAAGGTATTCGTG-1,Monocytes +Combo_GGACAAGGTATTCTCT-1,Dendritic cells +Combo_GGACAAGGTGAAAGAG-1,Monocytes +Combo_GGACAAGGTTACAGAA-1,Granulocytes +Combo_GGACAGAAGCACGCCT-1,Monocytes +Combo_GGACAGAGTCGCATAT-1,Monocytes +Combo_GGACAGAGTTTGCATG-1,Monocytes +Combo_GGACAGATCATGCATG-1,Monocytes +Combo_GGACAGATCGCCATAA-1,Dendritic cells +Combo_GGACATTAGACTTGAA-1,Monocytes +Combo_GGACATTAGCGATCCC-1,Dendritic cells +Combo_GGACATTAGCGGCTTC-1,Granulocytes +Combo_GGACATTGTACGCTGC-1,Dendritic cells +Combo_GGACATTGTCCGTTAA-1,Dendritic cells +Combo_GGACATTTCATGCATG-1,Granulocytes +Combo_GGACATTTCGGTGTCG-1,Monocytes +Combo_GGACGTCAGGGATACC-1,Monocytes +Combo_GGACGTCAGTGGGATC-1,Dendritic cells +Combo_GGACGTCCATAAGACA-1,Monocytes +Combo_GGACGTCGTAGGACAC-1,Granulocytes +Combo_GGACGTCTCCACGCAG-1,Dendritic cells +Combo_GGACGTCTCGCCAGCA-1,Dendritic cells +Combo_GGACGTCTCGCCTGAG-1,Monocytes +Combo_GGACGTCTCGGCGGTT-1,Monocytes +Combo_GGAGCAAAGAGACTAT-1,Monocytes +Combo_GGAGCAAAGAGTAAGG-1,Granulocytes +Combo_GGAGCAAAGCGTTGCC-1,Monocytes +Combo_GGAGCAAAGGAACTGC-1,Monocytes +Combo_GGAGCAACACGAAAGC-1,Granulocytes +Combo_GGAGCAACAGATCCAT-1,Dendritic cells +Combo_GGAGCAAGTTAAGTAG-1,Monocytes +Combo_GGAGCAATCGCCGTGA-1,NK cells +Combo_GGAGCAATCTCGAGTA-1,Dendritic cells +Combo_GGATGTTAGATCCCGC-1,Monocytes +Combo_GGATGTTAGCCACGTC-1,Granulocytes +Combo_GGATGTTGTACCGAGA-1,Granulocytes +Combo_GGATGTTGTCGCCATG-1,Monocytes +Combo_GGATGTTGTTACGCGC-1,Monocytes +Combo_GGATGTTTCATCACCC-1,Dendritic cells +Combo_GGATGTTTCATCGATG-1,Monocytes +Combo_GGATTACAGATAGCAT-1,Granulocytes +Combo_GGATTACAGATGCCTT-1,Monocytes +Combo_GGATTACCAAGCGCTC-1,Monocytes +Combo_GGATTACGTACGCTGC-1,Dendritic cells +Combo_GGATTACTCGTGACAT-1,Dendritic cells +Combo_GGCAATTAGGGCTCTC-1,Dendritic cells +Combo_GGCAATTAGGTCGGAT-1,Monocytes +Combo_GGCAATTAGTCGTACT-1,Dendritic cells +Combo_GGCAATTAGTGGTCCC-1,Monocytes +Combo_GGCAATTGTATAAACG-1,Monocytes +Combo_GGCAATTGTCTCTCTG-1,Dendritic cells +Combo_GGCAATTGTGCTTCTC-1,Monocytes +Combo_GGCAATTGTTGAACTC-1,Monocytes +Combo_GGCCGATAGGCGATAC-1,Granulocytes +Combo_GGCCGATAGGGATACC-1,Monocytes +Combo_GGCCGATCATGAGCGA-1,Monocytes +Combo_GGCCGATGTTCGGGCT-1,Granulocytes +Combo_GGCCGATGTTTCCACC-1,Dendritic cells +Combo_GGCGACTAGCTGATAA-1,Dendritic cells +Combo_GGCGACTAGCTTTGGT-1,Monocytes +Combo_GGCGACTAGGAGTACC-1,Monocytes +Combo_GGCGACTCAGTTTACG-1,Monocytes +Combo_GGCGACTCATGGTCTA-1,Monocytes +Combo_GGCGACTCATTGCGGC-1,Monocytes +Combo_GGCGACTGTCGACTGC-1,Dendritic cells +Combo_GGCGACTGTGATGATA-1,Monocytes +Combo_GGCGACTTCATTGCCC-1,Granulocytes +Combo_GGCGACTTCCTAGAAC-1,Monocytes +Combo_GGCGACTTCGTAGGTT-1,Dendritic cells +Combo_GGCGTGTAGCGTGTCC-1,Monocytes +Combo_GGCGTGTAGGTGACCA-1,Monocytes +Combo_GGCGTGTAGTCGAGTG-1,Dendritic cells +Combo_GGCGTGTCACGGCTAC-1,Monocytes +Combo_GGCGTGTCATTCCTGC-1,Monocytes +Combo_GGCGTGTGTCCAACTA-1,Granulocytes +Combo_GGCGTGTGTCGATTGT-1,Monocytes +Combo_GGCGTGTGTCTCATCC-1,Dendritic cells +Combo_GGCGTGTGTGTAACGG-1,Dendritic cells +Combo_GGCGTGTTCTGGGCCA-1,Granulocytes +Combo_GGCTCGAAGACGACGT-1,Dendritic cells +Combo_GGCTCGAGTTATCACG-1,Monocytes +Combo_GGCTCGATCAACGGCC-1,Dendritic cells +Combo_GGCTCGATCAGCAACT-1,Monocytes +Combo_GGCTCGATCCGTTGCT-1,Monocytes +Combo_GGCTGGTAGTGAACAT-1,Monocytes +Combo_GGCTGGTCAAGCCATT-1,Monocytes +Combo_GGCTGGTGTCCAAGTT-1,Monocytes +Combo_GGCTGGTGTGTCGCTG-1,Granulocytes +Combo_GGCTGGTGTTCTCATT-1,Dendritic cells +Combo_GGCTGGTGTTTAGGAA-1,Monocytes +Combo_GGCTGGTTCCTTTCGG-1,Granulocytes +Combo_GGGAATGAGACAAGCC-1,Dendritic cells +Combo_GGGAATGAGACTGTAA-1,Monocytes +Combo_GGGAATGAGTGACTCT-1,Granulocytes +Combo_GGGAATGGTGGAAAGA-1,Monocytes +Combo_GGGAATGGTGTGACGA-1,Monocytes +Combo_GGGAATGTCGGTCTAA-1,Granulocytes +Combo_GGGAATGTCTATCCTA-1,Dendritic cells +Combo_GGGACCTAGAACAATC-1,Dendritic cells +Combo_GGGACCTAGAATAGGG-1,Monocytes +Combo_GGGACCTCACTTCGAA-1,Granulocytes +Combo_GGGACCTCAGTAGAGC-1,Dendritic cells +Combo_GGGACCTGTAATCGTC-1,Monocytes +Combo_GGGACCTGTACGACCC-1,Dendritic cells +Combo_GGGACCTGTAGTGAAT-1,Monocytes +Combo_GGGACCTGTCTTCGTC-1,Monocytes +Combo_GGGACCTTCTCGATGA-1,Dendritic cells +Combo_GGGAGATAGCGTAATA-1,Monocytes +Combo_GGGAGATAGTACTTGC-1,Dendritic cells +Combo_GGGAGATAGTCAAGCG-1,Monocytes +Combo_GGGAGATCATTGGGCC-1,T cells +Combo_GGGAGATGTGCAGACA-1,Monocytes +Combo_GGGATGAAGACATAAC-1,Dendritic cells +Combo_GGGATGAAGTCAAGCG-1,Monocytes +Combo_GGGATGACAATCCAAC-1,Dendritic cells +Combo_GGGATGAGTACCGGCT-1,Monocytes +Combo_GGGATGAGTTGTACAC-1,Monocytes +Combo_GGGATGATCATAACCG-1,T cells +Combo_GGGATGATCCCTCAGT-1,Granulocytes +Combo_GGGATGATCTGATTCT-1,Dendritic cells +Combo_GGGCACTCAGGATTGG-1,Monocytes +Combo_GGGCACTGTCCAGTTA-1,Monocytes +Combo_GGGCACTGTTTGGCGC-1,Dendritic cells +Combo_GGGCACTTCACGAAGG-1,Dendritic cells +Combo_GGGCATCAGATGGCGT-1,Monocytes +Combo_GGGCATCAGTACGCGA-1,Monocytes +Combo_GGGCATCCATACAGCT-1,Monocytes +Combo_GGGCATCCATCACGTA-1,Granulocytes +Combo_GGGCATCGTAATCGTC-1,Dendritic cells +Combo_GGGCATCGTAGGCTGA-1,Monocytes +Combo_GGGCATCGTCATCGGC-1,Dendritic cells +Combo_GGGCATCGTCGCATCG-1,Monocytes +Combo_GGGCATCTCACCATAG-1,Monocytes +Combo_GGGCATCTCGCTTAGA-1,Granulocytes +Combo_GGGTCTGAGAAGGTTT-1,Monocytes +Combo_GGGTCTGAGCTAGTCT-1,Monocytes +Combo_GGGTCTGAGGACATTA-1,Dendritic cells +Combo_GGGTCTGAGGGTGTGT-1,Monocytes +Combo_GGGTCTGCAGCCTTTC-1,Granulocytes +Combo_GGGTCTGGTACATGTC-1,Granulocytes +Combo_GGGTCTGGTCACAAGG-1,Dendritic cells +Combo_GGGTCTGGTCGTGGCT-1,Granulocytes +Combo_GGGTCTGGTGAAAGAG-1,Monocytes +Combo_GGGTCTGGTGATGATA-1,Dendritic cells +Combo_GGGTCTGTCGTACGGC-1,Granulocytes +Combo_GGGTCTGTCTCAAGTG-1,Granulocytes +Combo_GGGTCTGTCTTAACCT-1,Monocytes +Combo_GGGTTGCAGATGTCGG-1,Granulocytes +Combo_GGGTTGCCAGGGATTG-1,Dendritic cells +Combo_GGGTTGCGTATAGGGC-1,Monocytes +Combo_GGGTTGCGTCCGCTGA-1,Monocytes +Combo_GGGTTGCGTTAGGGTG-1,Dendritic cells +Combo_GGGTTGCGTTTCCACC-1,Granulocytes +Combo_GGGTTGCTCAAAGTAG-1,Monocytes +Combo_GGTATTGCAAGCCTAT-1,Granulocytes +Combo_GGTATTGCATACCATG-1,Monocytes +Combo_GGTATTGCATCAGTAC-1,Monocytes +Combo_GGTATTGGTAGCTCCG-1,Monocytes +Combo_GGTATTGGTCTAAAGA-1,Monocytes +Combo_GGTATTGGTCTTTCAT-1,Monocytes +Combo_GGTATTGGTTCCTCCA-1,Dendritic cells +Combo_GGTATTGTCTTCTGGC-1,Monocytes +Combo_GGTGAAGAGAGTACAT-1,Monocytes +Combo_GGTGAAGAGATATGCA-1,Dendritic cells +Combo_GGTGAAGAGGGCATGT-1,Dendritic cells +Combo_GGTGAAGAGTGCTGCC-1,Dendritic cells +Combo_GGTGAAGCAGACGCCT-1,Dendritic cells +Combo_GGTGAAGGTACCGCTG-1,Monocytes +Combo_GGTGAAGGTTCCCGAG-1,Monocytes +Combo_GGTGAAGTCACTTCAT-1,Macrophages +Combo_GGTGAAGTCTCGTTTA-1,Granulocytes +Combo_GGTGCGTAGGCAATTA-1,Dendritic cells +Combo_GGTGCGTAGGCAGGTT-1,Monocytes +Combo_GGTGCGTAGTTGAGAT-1,Monocytes +Combo_GGTGCGTCAATAGCGG-1,Monocytes +Combo_GGTGCGTCAGACGCCT-1,Monocytes +Combo_GGTGCGTGTCTAGGTT-1,Monocytes +Combo_GGTGCGTGTTCCCTTG-1,Monocytes +Combo_GGTGCGTTCACGGTTA-1,Monocytes +Combo_GGTGCGTTCCGATATG-1,Macrophages +Combo_GGTGCGTTCGTGGACC-1,Dendritic cells +Combo_GGTGTTAAGCGAGAAA-1,Monocytes +Combo_GGTGTTACATTCTTAC-1,Monocytes +Combo_GGTGTTAGTTATCACG-1,T cells +Combo_GGTGTTATCCGCATAA-1,Granulocytes +Combo_GGTGTTATCGTTTGCC-1,Granulocytes +Combo_GTAACGTAGTTTGCGT-1,Dendritic cells +Combo_GTAACGTCAACTGCGC-1,Granulocytes +Combo_GTAACGTCAAGTTGTC-1,Monocytes +Combo_GTAACGTCAGCTGTTA-1,Granulocytes +Combo_GTAACGTGTTATCCGA-1,Monocytes +Combo_GTAACGTTCCAAGCCG-1,Granulocytes +Combo_GTAACGTTCGCCATAA-1,Granulocytes +Combo_GTAACTGAGATATACG-1,Monocytes +Combo_GTAACTGAGCGATCCC-1,Granulocytes +Combo_GTAACTGCAACGCACC-1,Monocytes +Combo_GTAACTGCAAGGTTTC-1,Monocytes +Combo_GTAACTGCACGCCAGT-1,Monocytes +Combo_GTAACTGGTAGAGCTG-1,Monocytes +Combo_GTAACTGGTCGAGTTT-1,Monocytes +Combo_GTACGTAAGAGAACAG-1,Dendritic cells +Combo_GTACGTAAGCGTCTAT-1,Granulocytes +Combo_GTACGTAAGTATGACA-1,Granulocytes +Combo_GTACGTACAATAGCAA-1,Granulocytes +Combo_GTACGTACACCGAAAG-1,Dendritic cells +Combo_GTACGTACACGTCTCT-1,Monocytes +Combo_GTACGTAGTAGCACGA-1,Dendritic cells +Combo_GTACGTAGTATGAAAC-1,Dendritic cells +Combo_GTACGTAGTCTGCAAT-1,Dendritic cells +Combo_GTACGTATCGCAGGCT-1,Dendritic cells +Combo_GTACTCCAGGAACTGC-1,Monocytes +Combo_GTACTCCAGGATATAC-1,Monocytes +Combo_GTACTCCAGTGGGTTG-1,Monocytes +Combo_GTACTCCCAAGAAGAG-1,Monocytes +Combo_GTACTCCCACCCAGTG-1,Monocytes +Combo_GTACTCCGTAGCAAAT-1,Dendritic cells +Combo_GTACTCCTCATCGGAT-1,Monocytes +Combo_GTACTCCTCCCTCTTT-1,Monocytes +Combo_GTACTCCTCTGCAAGT-1,Monocytes +Combo_GTACTTTAGCGCCTTG-1,Monocytes +Combo_GTACTTTAGTGATCGG-1,Monocytes +Combo_GTACTTTAGTGCAAGC-1,Granulocytes +Combo_GTACTTTCACCGCTAG-1,Dendritic cells +Combo_GTACTTTCACGTCAGC-1,Granulocytes +Combo_GTACTTTCACTGTCGG-1,Monocytes +Combo_GTACTTTCAGAGTGTG-1,T cells +Combo_GTACTTTGTAGGCTGA-1,T cells +Combo_GTACTTTTCGGCATCG-1,Dendritic cells +Combo_GTAGGCCAGTACGACG-1,Monocytes +Combo_GTAGGCCCACGACGAA-1,Dendritic cells +Combo_GTAGGCCCACGTAAGG-1,Monocytes +Combo_GTAGGCCGTCAAACTC-1,Dendritic cells +Combo_GTAGGCCGTCCAACTA-1,Macrophages +Combo_GTAGGCCTCCGCGGTA-1,Monocytes +Combo_GTAGTCAAGACCGGAT-1,Monocytes +Combo_GTAGTCACACGAGGTA-1,Monocytes +Combo_GTAGTCACACGGCCAT-1,Monocytes +Combo_GTAGTCACATATACGC-1,Monocytes +Combo_GTAGTCACATCCGGGT-1,Monocytes +Combo_GTAGTCACATCGACGC-1,T cells +Combo_GTAGTCAGTCAGCTAT-1,Monocytes +Combo_GTAGTCATCACCTCGT-1,Monocytes +Combo_GTAGTCATCGGATGGA-1,Dendritic cells +Combo_GTATCTTAGACTACAA-1,Monocytes +Combo_GTATCTTAGGGCATGT-1,Monocytes +Combo_GTATCTTAGGGTCTCC-1,Monocytes +Combo_GTATCTTAGTAATCCC-1,Monocytes +Combo_GTATCTTAGTGTCTCA-1,Monocytes +Combo_GTATCTTCAATTGCTG-1,Dendritic cells +Combo_GTATCTTCAGCTTAAC-1,Dendritic cells +Combo_GTATCTTCATAACCTG-1,Dendritic cells +Combo_GTATCTTGTTGCTCCT-1,Granulocytes +Combo_GTATCTTTCTTCAACT-1,Granulocytes +Combo_GTATTCTAGCTAGTGG-1,Monocytes +Combo_GTATTCTCAGCTGGCT-1,Monocytes +Combo_GTATTCTCAGGATTGG-1,Dendritic cells +Combo_GTATTCTCATTAGCCA-1,Monocytes +Combo_GTATTCTGTACAGCAG-1,Monocytes +Combo_GTATTCTGTACGAAAT-1,Granulocytes +Combo_GTATTCTGTAGTGAAT-1,Monocytes +Combo_GTATTCTGTTATGCGT-1,Monocytes +Combo_GTATTCTGTTTACTCT-1,Dendritic cells +Combo_GTATTCTTCAACTCTT-1,Granulocytes +Combo_GTATTCTTCAGAAATG-1,Monocytes +Combo_GTATTCTTCCCTGACT-1,Dendritic cells +Combo_GTATTCTTCGCCATAA-1,Monocytes +Combo_GTATTCTTCGTAGGAG-1,Granulocytes +Combo_GTCAAGTAGACTACAA-1,Monocytes +Combo_GTCAAGTGTATATGAG-1,Granulocytes +Combo_GTCAAGTGTATTCGTG-1,Dendritic cells +Combo_GTCACAAAGACCTTTG-1,Granulocytes +Combo_GTCACAAAGGAGTAGA-1,Monocytes +Combo_GTCACAAAGGCCCGTT-1,Monocytes +Combo_GTCACAACACTGTTAG-1,Granulocytes +Combo_GTCACAACATGTTCCC-1,Granulocytes +Combo_GTCACAAGTCAGATAA-1,Granulocytes +Combo_GTCACAAGTGTCGCTG-1,Monocytes +Combo_GTCACAAGTTAAGACA-1,Dendritic cells +Combo_GTCACAATCAGTTGAC-1,Monocytes +Combo_GTCACAATCATCGCTC-1,Dendritic cells +Combo_GTCACAATCCGCAGTG-1,Granulocytes +Combo_GTCACAATCTATGTGG-1,Dendritic cells +Combo_GTCACAATCTTACCTA-1,Granulocytes +Combo_GTCACGGAGCCGATTT-1,Monocytes +Combo_GTCACGGGTGGACGAT-1,Monocytes +Combo_GTCACGGTCTGGCGTG-1,Granulocytes +Combo_GTCATTTAGCTGATAA-1,Dendritic cells +Combo_GTCATTTAGTCCAGGA-1,Monocytes +Combo_GTCATTTCACAGGCCT-1,Monocytes +Combo_GTCATTTCAGCGTAAG-1,Monocytes +Combo_GTCATTTCATAGACTC-1,Granulocytes +Combo_GTCATTTGTCGAACAG-1,Dendritic cells +Combo_GTCATTTTCAAACCAC-1,Granulocytes +Combo_GTCATTTTCAACGAAA-1,Monocytes +Combo_GTCATTTTCAGGCAAG-1,Dendritic cells +Combo_GTCATTTTCATTTGGG-1,Dendritic cells +Combo_GTCATTTTCCTGCTTG-1,Monocytes +Combo_GTCATTTTCGCTTGTC-1,Monocytes +Combo_GTCATTTTCTGCGTAA-1,Monocytes +Combo_GTCATTTTCTTTAGGG-1,Monocytes +Combo_GTCCTCAAGAAGGCCT-1,Monocytes +Combo_GTCCTCAAGGATGGAA-1,Monocytes +Combo_GTCCTCAAGGCATGTG-1,Monocytes +Combo_GTCCTCAAGGCGTACA-1,Monocytes +Combo_GTCCTCAAGTAGTGCG-1,Monocytes +Combo_GTCCTCAAGTCATGCT-1,Monocytes +Combo_GTCCTCACATCAGTCA-1,Dendritic cells +Combo_GTCCTCACATTTCAGG-1,Granulocytes +Combo_GTCCTCAGTCCTAGCG-1,Monocytes +Combo_GTCCTCAGTCTCCACT-1,Monocytes +Combo_GTCCTCATCATTCACT-1,Dendritic cells +Combo_GTCGGGTAGCGTAATA-1,Monocytes +Combo_GTCGGGTCATAGAAAC-1,Granulocytes +Combo_GTCGGGTCATTCACTT-1,T cells +Combo_GTCGGGTGTGATGTCT-1,Dendritic cells +Combo_GTCGGGTGTGTCCTCT-1,Monocytes +Combo_GTCGGGTGTTCTGTTT-1,Monocytes +Combo_GTCGTAAAGCGCCTTG-1,Dendritic cells +Combo_GTCGTAAAGTGCCATT-1,Dendritic cells +Combo_GTCGTAACAAGCCTAT-1,Granulocytes +Combo_GTCGTAATCCGATATG-1,Monocytes +Combo_GTCGTAATCTATCCTA-1,Monocytes +Combo_GTCTCGTAGTGTTAGA-1,Dendritic cells +Combo_GTCTCGTCAAAGGTGC-1,Dendritic cells +Combo_GTCTCGTCAATCCGAT-1,Monocytes +Combo_GTCTCGTCAGGCTCAC-1,Dendritic cells +Combo_GTCTCGTCATGTTCCC-1,Granulocytes +Combo_GTCTCGTGTTCAGCGC-1,Granulocytes +Combo_GTCTTCGAGAAGGACA-1,Granulocytes +Combo_GTCTTCGAGTCACGCC-1,Monocytes +Combo_GTCTTCGCAAGCCATT-1,Dendritic cells +Combo_GTCTTCGCACAGATTC-1,Dendritic cells +Combo_GTCTTCGCACGGCGTT-1,Monocytes +Combo_GTCTTCGGTTAAGTAG-1,Monocytes +Combo_GTCTTCGTCATAACCG-1,Granulocytes +Combo_GTCTTCGTCGTTGCCT-1,Dendritic cells +Combo_GTGAAGGAGACCACGA-1,Dendritic cells +Combo_GTGAAGGAGCAAATCA-1,Monocytes +Combo_GTGAAGGAGCGGCTTC-1,Monocytes +Combo_GTGAAGGAGCTCAACT-1,Monocytes +Combo_GTGAAGGAGCTTCGCG-1,Monocytes +Combo_GTGAAGGAGGCAATTA-1,Monocytes +Combo_GTGAAGGAGGGCATGT-1,Monocytes +Combo_GTGAAGGAGTCTCCTC-1,Dendritic cells +Combo_GTGAAGGGTAGCGATG-1,Dendritic cells +Combo_GTGAAGGGTCCTCCAT-1,Granulocytes +Combo_GTGAAGGGTTCCAACA-1,Monocytes +Combo_GTGAAGGTCAACCAAC-1,Monocytes +Combo_GTGAAGGTCAAGGCTT-1,Monocytes +Combo_GTGAAGGTCGGATGTT-1,Monocytes +Combo_GTGAAGGTCGGCGGTT-1,Monocytes +Combo_GTGAAGGTCTAACCGA-1,Monocytes +Combo_GTGCAGCAGACTACAA-1,Monocytes +Combo_GTGCAGCAGCTACCGC-1,Monocytes +Combo_GTGCAGCCACGAAGCA-1,Monocytes +Combo_GTGCAGCCAGTTAACC-1,Granulocytes +Combo_GTGCAGCGTCGCGAAA-1,Monocytes +Combo_GTGCAGCTCACGATGT-1,Granulocytes +Combo_GTGCAGCTCGAGCCCA-1,Dendritic cells +Combo_GTGCAGCTCGGCCGAT-1,Dendritic cells +Combo_GTGCATAAGAGCAATT-1,Monocytes +Combo_GTGCATACACCAGGCT-1,Dendritic cells +Combo_GTGCATACACTCAGGC-1,Monocytes +Combo_GTGCATACATATGAGA-1,Dendritic cells +Combo_GTGCATAGTAGGACAC-1,Dendritic cells +Combo_GTGCATAGTCCAGTAT-1,Monocytes +Combo_GTGCATATCATCTGTT-1,Monocytes +Combo_GTGCATATCGCATGAT-1,Monocytes +Combo_GTGCGGTCAAGCCGTC-1,Monocytes +Combo_GTGCGGTCAGTCGATT-1,Monocytes +Combo_GTGCGGTCATCCGCGA-1,Monocytes +Combo_GTGCGGTGTATGCTTG-1,Monocytes +Combo_GTGCGGTGTCGAGATG-1,Monocytes +Combo_GTGCGGTGTCTAGGTT-1,Monocytes +Combo_GTGCGGTTCAGTTTGG-1,Monocytes +Combo_GTGCTTCAGAAGGTGA-1,Granulocytes +Combo_GTGCTTCCAACTGCTA-1,Monocytes +Combo_GTGCTTCCACATTCGA-1,Monocytes +Combo_GTGCTTCCATCTGGTA-1,Monocytes +Combo_GTGCTTCGTAAACACA-1,Dendritic cells +Combo_GTGCTTCTCAGCAACT-1,Monocytes +Combo_GTGCTTCTCTACTATC-1,Monocytes +Combo_GTGGGTCAGATGTGGC-1,Monocytes +Combo_GTGGGTCAGGTGTGGT-1,Monocytes +Combo_GTGGGTCAGTCCATAC-1,Monocytes +Combo_GTGGGTCCACGAGAGT-1,Monocytes +Combo_GTGGGTCGTAGCTCCG-1,Monocytes +Combo_GTGGGTCGTTACGCGC-1,Monocytes +Combo_GTGGGTCGTTGTTTGG-1,Monocytes +Combo_GTGGGTCTCCTTTACA-1,Dendritic cells +Combo_GTGGGTCTCTCTAAGG-1,Monocytes +Combo_GTGTGCGAGGCGTACA-1,Monocytes +Combo_GTGTGCGAGGGTCTCC-1,Dendritic cells +Combo_GTGTGCGAGTACGTAA-1,Dendritic cells +Combo_GTGTGCGAGTAGGCCA-1,Dendritic cells +Combo_GTGTGCGCATGCCACG-1,Monocytes +Combo_GTGTGCGGTACCTACA-1,Monocytes +Combo_GTGTGCGGTCGTTGTA-1,Monocytes +Combo_GTGTTAGCACGACGAA-1,Granulocytes +Combo_GTGTTAGCACTGTGTA-1,Granulocytes +Combo_GTGTTAGCATGCCACG-1,Dendritic cells +Combo_GTGTTAGGTAATCGTC-1,Granulocytes +Combo_GTGTTAGGTGATGTGG-1,Monocytes +Combo_GTGTTAGGTGGTCCGT-1,Dendritic cells +Combo_GTGTTAGTCAGCACAT-1,Monocytes +Combo_GTTAAGCAGCATGGCA-1,Dendritic cells +Combo_GTTAAGCAGCTGCCCA-1,Monocytes +Combo_GTTAAGCGTAGCGCAA-1,Monocytes +Combo_GTTAAGCGTCGAATCT-1,Monocytes +Combo_GTTAAGCGTCTAGAGG-1,Monocytes +Combo_GTTAAGCGTGTTTGGT-1,Monocytes +Combo_GTTAAGCGTTAAAGTG-1,Monocytes +Combo_GTTAAGCGTTAAGATG-1,Monocytes +Combo_GTTAAGCGTTGGTGGA-1,Granulocytes +Combo_GTTAAGCGTTGTTTGG-1,Granulocytes +Combo_GTTAAGCTCTAACTCT-1,Monocytes +Combo_GTTAAGCTCTCGATGA-1,Monocytes +Combo_GTTACAGAGAACTCGG-1,Monocytes +Combo_GTTACAGAGCCGGTAA-1,Granulocytes +Combo_GTTACAGAGGTGTTAA-1,Dendritic cells +Combo_GTTCATTAGCAGGCTA-1,Granulocytes +Combo_GTTCATTAGGAATGGA-1,Monocytes +Combo_GTTCATTCAATAGCGG-1,Monocytes +Combo_GTTCATTCATACCATG-1,Monocytes +Combo_GTTCATTCATCCTTGC-1,Monocytes +Combo_GTTCATTGTAAATACG-1,Dendritic cells +Combo_GTTCATTGTCACTTCC-1,Monocytes +Combo_GTTCATTGTGATGATA-1,Monocytes +Combo_GTTCATTGTGATGCCC-1,Monocytes +Combo_GTTCGGGAGCTGCAAG-1,Monocytes +Combo_GTTCGGGAGGGAACGG-1,Monocytes +Combo_GTTCGGGGTCGCATCG-1,Dendritic cells +Combo_GTTCGGGTCAAGGTAA-1,Monocytes +Combo_GTTCGGGTCACCGGGT-1,Monocytes +Combo_GTTCGGGTCGAGAACG-1,Monocytes +Combo_GTTCGGGTCGCCGTGA-1,Granulocytes +Combo_GTTCTCGAGGTTCCTA-1,Monocytes +Combo_GTTCTCGCAAGGCTCC-1,Monocytes +Combo_GTTCTCGCACTTAAGC-1,Dendritic cells +Combo_GTTCTCGCAGGAATCG-1,Dendritic cells +Combo_GTTCTCGCATCGATTG-1,Monocytes +Combo_GTTCTCGCATGCCTTC-1,Monocytes +Combo_GTTCTCGGTAGCGATG-1,Monocytes +Combo_GTTCTCGGTCCAAGTT-1,Granulocytes +Combo_GTTCTCGTCATTTGGG-1,Monocytes +Combo_GTTCTCGTCCAGAAGG-1,Monocytes +Combo_GTTCTCGTCGTAGATC-1,Dendritic cells +Combo_GTTTCTAGTACGAAAT-1,Dendritic cells +Combo_GTTTCTATCGGCGCTA-1,Monocytes +Combo_GTTTCTATCTAACCGA-1,Dendritic cells +Combo_TAAACCGAGAGACGAA-1,Monocytes +Combo_TAAACCGAGCTAGTGG-1,Granulocytes +Combo_TAAACCGCACTAGTAC-1,Monocytes +Combo_TAAACCGCAGAGCCAA-1,Monocytes +Combo_TAAACCGCATGCCACG-1,Granulocytes +Combo_TAAACCGGTATTCGTG-1,Monocytes +Combo_TAAACCGGTGATGATA-1,Monocytes +Combo_TAAACCGGTGCAACTT-1,Dendritic cells +Combo_TAAACCGGTGGTGTAG-1,T cells +Combo_TAAACCGGTGTGCCTG-1,Monocytes +Combo_TAAACCGGTGTTAAGA-1,T cells +Combo_TAAACCGTCAATCTCT-1,Monocytes +Combo_TAAACCGTCACATACG-1,Monocytes +Combo_TAAACCGTCATTGCCC-1,Granulocytes +Combo_TAAACCGTCCGCAAGC-1,Monocytes +Combo_TAAGAGAAGAATTGTG-1,Monocytes +Combo_TAAGAGAAGTGACATA-1,Dendritic cells +Combo_TAAGAGACAGGGAGAG-1,Monocytes +Combo_TAAGAGACATTCGACA-1,Dendritic cells +Combo_TAAGAGAGTCCCTACT-1,Granulocytes +Combo_TAAGAGAGTCTCTTTA-1,Monocytes +Combo_TAAGAGAGTTATCCGA-1,Monocytes +Combo_TAAGAGATCCACGAAT-1,Monocytes +Combo_TAAGCGTAGCACAGGT-1,Granulocytes +Combo_TAAGCGTCATTCTCAT-1,T cells +Combo_TAAGCGTGTTTAGCTG-1,Granulocytes +Combo_TAAGCGTTCCCAAGAT-1,Dendritic cells +Combo_TAAGTGCAGAGTGACC-1,T cells +Combo_TAAGTGCAGATCTGCT-1,Monocytes +Combo_TAAGTGCAGCGTCTAT-1,Granulocytes +Combo_TAAGTGCAGGCCCGTT-1,Monocytes +Combo_TAAGTGCAGTTCCACA-1,Monocytes +Combo_TAAGTGCCACAGCCCA-1,Granulocytes +Combo_TAAGTGCCAGTGACAG-1,Monocytes +Combo_TAAGTGCGTAGCGATG-1,Monocytes +Combo_TAAGTGCGTGACCAAG-1,Dendritic cells +Combo_TAAGTGCGTGGTCTCG-1,Granulocytes +Combo_TAAGTGCGTTACGACT-1,Monocytes +Combo_TACACGAAGGCATTGG-1,Monocytes +Combo_TACACGACACTGCCAG-1,Dendritic cells +Combo_TACACGAGTCGCTTTC-1,Dendritic cells +Combo_TACACGAGTGTGCCTG-1,Monocytes +Combo_TACACGATCCTCGCAT-1,Dendritic cells +Combo_TACAGTGAGCCCGAAA-1,Monocytes +Combo_TACAGTGGTCATACTG-1,Monocytes +Combo_TACAGTGGTGAAATCA-1,Dendritic cells +Combo_TACAGTGGTGTGAAAT-1,Dendritic cells +Combo_TACAGTGGTTACCGAT-1,Granulocytes +Combo_TACAGTGGTTCGCTAA-1,Monocytes +Combo_TACAGTGTCGTTACAG-1,Granulocytes +Combo_TACCTATAGATGGGTC-1,Dendritic cells +Combo_TACCTATAGCTGGAAC-1,Macrophages +Combo_TACCTATAGTGCGATG-1,Monocytes +Combo_TACCTATCAAGCCGTC-1,Monocytes +Combo_TACCTATCACCACGTG-1,Dendritic cells +Combo_TACCTATCACTCAGGC-1,Monocytes +Combo_TACCTATCAGGGCATA-1,Dendritic cells +Combo_TACCTATGTATTACCG-1,Granulocytes +Combo_TACCTATTCGGGAGTA-1,Monocytes +Combo_TACCTTAAGTCACGCC-1,Monocytes +Combo_TACCTTAAGTCCCACG-1,Monocytes +Combo_TACCTTACAAGCTGGA-1,Monocytes +Combo_TACCTTACACCGGAAA-1,Monocytes +Combo_TACCTTACAGCCTATA-1,Dendritic cells +Combo_TACCTTACATCAGTCA-1,Monocytes +Combo_TACCTTAGTAAACACA-1,Monocytes +Combo_TACCTTAGTCCCGACA-1,Dendritic cells +Combo_TACCTTAGTTGGTGGA-1,Granulocytes +Combo_TACCTTATCAGCAACT-1,Monocytes +Combo_TACCTTATCAGTGCAT-1,Monocytes +Combo_TACCTTATCGCTAGCG-1,Monocytes +Combo_TACCTTATCTACTTAC-1,Granulocytes +Combo_TACGGATAGAAGGGTA-1,Monocytes +Combo_TACGGATAGCGTAATA-1,Dendritic cells +Combo_TACGGATAGTCCGGTC-1,Monocytes +Combo_TACGGATGTGACTACT-1,Granulocytes +Combo_TACGGATTCACCTTAT-1,Monocytes +Combo_TACGGATTCAGCTCGG-1,Monocytes +Combo_TACGGATTCCGCAAGC-1,Monocytes +Combo_TACGGATTCGGCTTGG-1,Monocytes +Combo_TACGGATTCGTGGACC-1,Monocytes +Combo_TACGGATTCTCCTATA-1,Granulocytes +Combo_TACGGGCAGATCCCAT-1,Granulocytes +Combo_TACGGGCAGGAATGGA-1,Granulocytes +Combo_TACGGGCCATTGGCGC-1,Monocytes +Combo_TACGGGCGTACCGTTA-1,Dendritic cells +Combo_TACGGGCTCCACGTTC-1,Monocytes +Combo_TACGGGCTCGCCAAAT-1,Monocytes +Combo_TACGGGCTCTCAAGTG-1,Monocytes +Combo_TACGGGCTCTTAACCT-1,Monocytes +Combo_TACGGGCTCTTAGAGC-1,T cells +Combo_TACGGTAAGCGGCTTC-1,Monocytes +Combo_TACGGTAAGGGTGTTG-1,NK cells +Combo_TACGGTAAGTAGCCGA-1,Monocytes +Combo_TACGGTACATACTACG-1,Dendritic cells +Combo_TACGGTAGTGTGACCC-1,Monocytes +Combo_TACGGTAGTTGTACAC-1,Granulocytes +Combo_TACGGTAGTTGTGGAG-1,Monocytes +Combo_TACGGTATCAAACAAG-1,Granulocytes +Combo_TACTCATAGATCCTGT-1,Dendritic cells +Combo_TACTCATAGCCTTGAT-1,Monocytes +Combo_TACTCATAGGCGACAT-1,Granulocytes +Combo_TACTCATCACAACTGT-1,Monocytes +Combo_TACTCATCACGTCTCT-1,Dendritic cells +Combo_TACTCATGTAAGCACG-1,Granulocytes +Combo_TACTCATGTCCTAGCG-1,Monocytes +Combo_TACTCATGTCGGCATC-1,Monocytes +Combo_TACTCATGTGGTACAG-1,Monocytes +Combo_TACTCATTCCAATGGT-1,Granulocytes +Combo_TACTCGCAGAGCTATA-1,Granulocytes +Combo_TACTCGCAGAGTACAT-1,Monocytes +Combo_TACTCGCAGATATGCA-1,Monocytes +Combo_TACTCGCAGCACACAG-1,Dendritic cells +Combo_TACTCGCAGTCCGGTC-1,Monocytes +Combo_TACTCGCCAATGGACG-1,Dendritic cells +Combo_TACTCGCCACCGTTGG-1,Monocytes +Combo_TACTCGCGTAGCGTGA-1,Monocytes +Combo_TACTCGCGTCCTAGCG-1,Monocytes +Combo_TACTCGCGTGCAGGTA-1,Monocytes +Combo_TACTCGCTCATGTCTT-1,Dendritic cells +Combo_TACTTACAGAACAATC-1,Macrophages +Combo_TACTTACAGCAGGTCA-1,Granulocytes +Combo_TACTTACAGGAGTTGC-1,Monocytes +Combo_TACTTACAGTCATGCT-1,Dendritic cells +Combo_TACTTACCAACGATGG-1,Dendritic cells +Combo_TACTTACCAATTCCTT-1,Dendritic cells +Combo_TACTTACGTAAGTGTA-1,Monocytes +Combo_TACTTACGTGCAGTAG-1,Monocytes +Combo_TACTTACGTTGGAGGT-1,Monocytes +Combo_TACTTGTAGAATCTCC-1,Monocytes +Combo_TACTTGTAGCACACAG-1,Dendritic cells +Combo_TACTTGTAGTTAGCGG-1,Monocytes +Combo_TACTTGTGTAAAGTCA-1,Monocytes +Combo_TACTTGTGTGCGATAG-1,Granulocytes +Combo_TAGACCAAGAGTCTGG-1,Monocytes +Combo_TAGACCAAGTAAGTAC-1,Granulocytes +Combo_TAGACCAAGTGATCGG-1,Monocytes +Combo_TAGACCAAGTGTGGCA-1,Monocytes +Combo_TAGACCACAAGCTGAG-1,Monocytes +Combo_TAGACCACATCACCCT-1,Monocytes +Combo_TAGACCATCAATCACG-1,Dendritic cells +Combo_TAGACCATCCTGCTTG-1,Monocytes +Combo_TAGACCATCGAACGGA-1,Dendritic cells +Combo_TAGACCATCGAGGTAG-1,Granulocytes +Combo_TAGACCATCGCTTAGA-1,Monocytes +Combo_TAGACCATCTGCGGCA-1,Granulocytes +Combo_TAGAGCTCAAGGACTG-1,Dendritic cells +Combo_TAGAGCTCATTAACCG-1,Dendritic cells +Combo_TAGAGCTGTCGCGAAA-1,Monocytes +Combo_TAGAGCTGTGCTGTAT-1,Monocytes +Combo_TAGAGCTGTTAAGATG-1,Monocytes +Combo_TAGAGCTGTTTGTGTG-1,Monocytes +Combo_TAGCCGGAGATAGCAT-1,Monocytes +Combo_TAGCCGGCAATGCCAT-1,Dendritic cells +Combo_TAGCCGGCAGATAATG-1,Monocytes +Combo_TAGCCGGGTCACAAGG-1,Monocytes +Combo_TAGCCGGGTCGAGTTT-1,Monocytes +Combo_TAGCCGGTCAATACCG-1,Monocytes +Combo_TAGCCGGTCACGCGGT-1,Monocytes +Combo_TAGCCGGTCCCAAGAT-1,Dendritic cells +Combo_TAGCCGGTCTTGGGTA-1,Granulocytes +Combo_TAGGCATAGTCGAGTG-1,Dendritic cells +Combo_TAGGCATCAAGTTCTG-1,Monocytes +Combo_TAGGCATCAGCGTTCG-1,Dendritic cells +Combo_TAGGCATGTCACAAGG-1,Dendritic cells +Combo_TAGGCATGTCCAGTAT-1,Monocytes +Combo_TAGGCATGTGGACGAT-1,Dendritic cells +Combo_TAGGCATTCTGATACG-1,Macrophages +Combo_TAGTGGTAGACTAGAT-1,Dendritic cells +Combo_TAGTGGTAGATCACGG-1,Monocytes +Combo_TAGTGGTAGGCTCATT-1,Monocytes +Combo_TAGTGGTCACAAGTAA-1,Monocytes +Combo_TAGTGGTCACCCAGTG-1,Monocytes +Combo_TAGTGGTCAGCTCGCA-1,Monocytes +Combo_TAGTGGTGTAGGGACT-1,Monocytes +Combo_TAGTGGTGTATTACCG-1,Dendritic cells +Combo_TAGTGGTTCACATACG-1,Granulocytes +Combo_TAGTGGTTCGAATCCA-1,Granulocytes +Combo_TAGTGGTTCTATGTGG-1,Monocytes +Combo_TAGTGGTTCTCAAGTG-1,Monocytes +Combo_TAGTGGTTCTGATTCT-1,Monocytes +Combo_TAGTTGGAGACCCACC-1,Dendritic cells +Combo_TAGTTGGAGGTGTTAA-1,Granulocytes +Combo_TAGTTGGCAAGCGCTC-1,Monocytes +Combo_TAGTTGGCAGTAAGCG-1,Dendritic cells +Combo_TAGTTGGCATCGTCGG-1,Dendritic cells +Combo_TAGTTGGCATGTCTCC-1,Monocytes +Combo_TAGTTGGCATTCCTCG-1,Monocytes +Combo_TAGTTGGGTTAAGACA-1,Granulocytes +Combo_TAGTTGGGTTACCAGT-1,Granulocytes +Combo_TAGTTGGTCAAACAAG-1,Monocytes +Combo_TAGTTGGTCAACGGGA-1,Monocytes +Combo_TAGTTGGTCTGTCTCG-1,Monocytes +Combo_TATCAGGAGACCCACC-1,Monocytes +Combo_TATCAGGAGATATACG-1,Granulocytes +Combo_TATCAGGAGCGTGAGT-1,Monocytes +Combo_TATCAGGAGGCGCTCT-1,Monocytes +Combo_TATCAGGAGTACGCCC-1,Monocytes +Combo_TATCAGGAGTGTCTCA-1,Dendritic cells +Combo_TATCAGGCACACAGAG-1,Granulocytes +Combo_TATCAGGCAGTATGCT-1,Monocytes +Combo_TATCAGGGTAGCGCAA-1,Monocytes +Combo_TATCAGGGTCGACTGC-1,Granulocytes +Combo_TATCAGGGTTAAAGAC-1,Monocytes +Combo_TATCTCAAGATAGTCA-1,Monocytes +Combo_TATCTCAAGATATACG-1,Dendritic cells +Combo_TATCTCAAGGGTATCG-1,Monocytes +Combo_TATCTCAAGTACGATA-1,Dendritic cells +Combo_TATCTCAAGTGGTAGC-1,Monocytes +Combo_TATCTCAAGTGTCCCG-1,Monocytes +Combo_TATCTCACAACGCACC-1,Monocytes +Combo_TATCTCACAATTCCTT-1,Monocytes +Combo_TATCTCACAGGTGCCT-1,Monocytes +Combo_TATCTCAGTACCATCA-1,Monocytes +Combo_TATCTCAGTCACCTAA-1,Granulocytes +Combo_TATCTCAGTGAACCTT-1,Monocytes +Combo_TATCTCAGTTCTGGTA-1,Dendritic cells +Combo_TATGCCCAGAACAACT-1,Monocytes +Combo_TATGCCCAGACTGGGT-1,Granulocytes +Combo_TATGCCCAGATGTGGC-1,Dendritic cells +Combo_TATGCCCAGGAGTCTG-1,Monocytes +Combo_TATGCCCGTACCAGTT-1,Monocytes +Combo_TATGCCCGTTACGTCA-1,Granulocytes +Combo_TATGCCCTCACCAGGC-1,Monocytes +Combo_TATGCCCTCCCGACTT-1,Monocytes +Combo_TATGCCCTCCGAACGC-1,Monocytes +Combo_TATTACCCAACACGCC-1,Dendritic cells +Combo_TATTACCCAGGAATGC-1,Granulocytes +Combo_TATTACCGTGACCAAG-1,Granulocytes +Combo_TATTACCTCCTATTCA-1,Dendritic cells +Combo_TCAACGAAGGAGTTTA-1,Monocytes +Combo_TCAACGACAAGCCCAC-1,Granulocytes +Combo_TCAACGACAGCCAGAA-1,Granulocytes +Combo_TCAACGAGTAAATGTG-1,Monocytes +Combo_TCAACGAGTACGCACC-1,Monocytes +Combo_TCAATCTAGCGATGAC-1,Granulocytes +Combo_TCAATCTAGGATCGCA-1,Monocytes +Combo_TCAATCTAGGGTGTGT-1,Monocytes +Combo_TCAATCTAGTGTACTC-1,Dendritic cells +Combo_TCAATCTCAAGCCCAC-1,Macrophages +Combo_TCAATCTCACGGTTTA-1,Monocytes +Combo_TCAATCTCAGATTGCT-1,Granulocytes +Combo_TCAATCTCAGCCTTGG-1,Monocytes +Combo_TCAATCTCATCCAACA-1,Granulocytes +Combo_TCAATCTGTAGAGCTG-1,Dendritic cells +Combo_TCAATCTGTGTGGTTT-1,Monocytes +Combo_TCAATCTTCTGCCAGG-1,Monocytes +Combo_TCACAAGAGACATAAC-1,Dendritic cells +Combo_TCACAAGAGGCAGTCA-1,Monocytes +Combo_TCACAAGCATCCCACT-1,Monocytes +Combo_TCACAAGGTCCAACTA-1,Monocytes +Combo_TCACAAGGTGAAGGCT-1,Monocytes +Combo_TCACAAGGTTGGACCC-1,Monocytes +Combo_TCACAAGTCACGCGGT-1,Monocytes +Combo_TCACAAGTCTTCATGT-1,Monocytes +Combo_TCACAAGTCTTGTATC-1,Monocytes +Combo_TCACGAAAGATGAGAG-1,Monocytes +Combo_TCACGAAAGGTGGGTT-1,Monocytes +Combo_TCACGAAAGTTCGCGC-1,Monocytes +Combo_TCACGAACAAACGTGG-1,Granulocytes +Combo_TCACGAACATACTCTT-1,Granulocytes +Combo_TCACGAAGTAGCCTAT-1,Dendritic cells +Combo_TCACGAAGTGCACCAC-1,Monocytes +Combo_TCACGAAGTTAGGGTG-1,Monocytes +Combo_TCACGAATCAAGGCTT-1,Granulocytes +Combo_TCACGAATCCTAGGGC-1,Monocytes +Combo_TCAGATGAGCTCCTCT-1,Monocytes +Combo_TCAGATGCACATCCGG-1,Granulocytes +Combo_TCAGATGCACCAGATT-1,Monocytes +Combo_TCAGATGCATGCAACT-1,Monocytes +Combo_TCAGATGGTCTAGCGC-1,Granulocytes +Combo_TCAGATGGTCTTGCGG-1,Dendritic cells +Combo_TCAGATGTCTGTTGAG-1,Granulocytes +Combo_TCAGCAAAGAACTGTA-1,Dendritic cells +Combo_TCAGCAAAGCAATATG-1,Monocytes +Combo_TCAGCAAAGCTTATCG-1,Monocytes +Combo_TCAGCAAAGGATCGCA-1,Monocytes +Combo_TCAGCAAAGGTGATAT-1,Granulocytes +Combo_TCAGCAAAGTAGTGCG-1,Dendritic cells +Combo_TCAGCAACACATTAGC-1,Monocytes +Combo_TCAGCAACATTAACCG-1,Monocytes +Combo_TCAGCAAGTTCAACCA-1,Monocytes +Combo_TCAGCAAGTTCCGTCT-1,Monocytes +Combo_TCAGCAATCAGTTAGC-1,Granulocytes +Combo_TCAGCAATCCAACCAA-1,Granulocytes +Combo_TCAGCAATCGGTCTAA-1,Dendritic cells +Combo_TCAGCTCCACTAGTAC-1,Dendritic cells +Combo_TCAGCTCCACTTGGAT-1,Monocytes +Combo_TCAGCTCCAGATGGGT-1,Monocytes +Combo_TCAGCTCCAGTGAGTG-1,Monocytes +Combo_TCAGCTCGTTAGGGTG-1,Monocytes +Combo_TCAGCTCGTTGTCTTT-1,Monocytes +Combo_TCAGCTCTCTACTCAT-1,Dendritic cells +Combo_TCAGGATCACACCGCA-1,Monocytes +Combo_TCAGGATCACCCAGTG-1,Monocytes +Combo_TCAGGATCACTATCTT-1,Monocytes +Combo_TCAGGATCAGACAAGC-1,Monocytes +Combo_TCAGGATCAGATCGGA-1,Monocytes +Combo_TCAGGATCAGGTCTCG-1,Monocytes +Combo_TCAGGATCATCGGACC-1,Monocytes +Combo_TCAGGATGTCCGAACC-1,Dendritic cells +Combo_TCAGGATGTGCACCAC-1,T cells +Combo_TCAGGATGTGCCTGGT-1,Monocytes +Combo_TCAGGATTCAAAGTAG-1,Monocytes +Combo_TCAGGATTCGTAGATC-1,Granulocytes +Combo_TCAGGTAAGTCAAGCG-1,Macrophages +Combo_TCAGGTAAGTGGTAGC-1,Monocytes +Combo_TCAGGTACACGACTCG-1,Granulocytes +Combo_TCAGGTACAGAGTGTG-1,Monocytes +Combo_TCAGGTACAGCTGCTG-1,Dendritic cells +Combo_TCAGGTAGTCGCATAT-1,Granulocytes +Combo_TCAGGTAGTTACCGAT-1,Dendritic cells +Combo_TCAGGTATCATCTGTT-1,B cells +Combo_TCAGGTATCCAAGTAC-1,Granulocytes +Combo_TCATTACAGATCTGAA-1,Monocytes +Combo_TCATTACCAACGATGG-1,Monocytes +Combo_TCATTACCATCGGGTC-1,Monocytes +Combo_TCATTACGTAGAGTGC-1,Dendritic cells +Combo_TCATTACGTGATGATA-1,Monocytes +Combo_TCATTACTCATTTGGG-1,Granulocytes +Combo_TCATTTGAGGGTTTCT-1,Monocytes +Combo_TCATTTGAGTGGGCTA-1,Dendritic cells +Combo_TCATTTGGTAAGGATT-1,Dendritic cells +Combo_TCATTTGGTTGTGGAG-1,Dendritic cells +Combo_TCATTTGTCATGGTCA-1,Dendritic cells +Combo_TCATTTGTCGGTTCGG-1,Granulocytes +Combo_TCATTTGTCTTGCCGT-1,Monocytes +Combo_TCCACACAGTTAACGA-1,Dendritic cells +Combo_TCCACACCAAGTCTGT-1,Monocytes +Combo_TCCACACCACCGAAAG-1,Dendritic cells +Combo_TCCACACGTCAACTGT-1,Monocytes +Combo_TCCACACGTCAGCTAT-1,Monocytes +Combo_TCCACACTCAGCCTAA-1,Monocytes +Combo_TCCACACTCATGGTCA-1,Dendritic cells +Combo_TCCACACTCATTTGGG-1,Monocytes +Combo_TCCACACTCCATGAGT-1,Monocytes +Combo_TCCCGATAGATCCGAG-1,Monocytes +Combo_TCCCGATAGGCTCAGA-1,Dendritic cells +Combo_TCCCGATGTAAATGAC-1,Monocytes +Combo_TCCCGATGTACGCACC-1,Dendritic cells +Combo_TCCCGATGTAGTAGTA-1,Dendritic cells +Combo_TCCCGATTCAATAAGG-1,Monocytes +Combo_TCCCGATTCACCTCGT-1,Granulocytes +Combo_TCGAGGCAGGCAGGTT-1,Monocytes +Combo_TCGAGGCAGGGCTTGA-1,Monocytes +Combo_TCGAGGCCAACACCCG-1,Monocytes +Combo_TCGAGGCCAAGCGATG-1,Monocytes +Combo_TCGAGGCCAGCATACT-1,Dendritic cells +Combo_TCGAGGCGTACTTAGC-1,Monocytes +Combo_TCGAGGCGTCTCGTTC-1,Monocytes +Combo_TCGAGGCGTGTGGCTC-1,Monocytes +Combo_TCGAGGCGTTCGCGAC-1,Granulocytes +Combo_TCGAGGCGTTTGACTG-1,Monocytes +Combo_TCGCGAGAGCGCCTCA-1,Monocytes +Combo_TCGCGAGAGCTAGTTC-1,Monocytes +Combo_TCGCGAGAGGCCGAAT-1,Monocytes +Combo_TCGCGAGCAATAGCAA-1,Monocytes +Combo_TCGCGAGCAGCTTCGG-1,Monocytes +Combo_TCGCGAGCAGTCTTCC-1,Monocytes +Combo_TCGCGAGGTACCAGTT-1,Monocytes +Combo_TCGCGAGGTCAAACTC-1,Granulocytes +Combo_TCGCGAGGTCTGGAGA-1,Granulocytes +Combo_TCGCGAGGTTGATTGC-1,Monocytes +Combo_TCGCGAGTCCAGAGGA-1,Dendritic cells +Combo_TCGCGAGTCGGCATCG-1,Granulocytes +Combo_TCGCGTTAGCCAACAG-1,Monocytes +Combo_TCGCGTTAGTATCGAA-1,Granulocytes +Combo_TCGCGTTCATTCACTT-1,Monocytes +Combo_TCGCGTTGTCGCTTCT-1,Monocytes +Combo_TCGCGTTGTCTAAAGA-1,Granulocytes +Combo_TCGCGTTGTGCTCTTC-1,Monocytes +Combo_TCGCGTTTCGGTTAAC-1,Monocytes +Combo_TCGCGTTTCTTTCCTC-1,Monocytes +Combo_TCGGGACAGAGGTTGC-1,Monocytes +Combo_TCGGGACAGATCCTGT-1,Granulocytes +Combo_TCGGGACAGCATCATC-1,Dendritic cells +Combo_TCGGGACAGGACGAAA-1,Granulocytes +Combo_TCGGGACAGGGTATCG-1,Granulocytes +Combo_TCGGGACAGTAACCCT-1,Granulocytes +Combo_TCGGGACCAGGGAGAG-1,Dendritic cells +Combo_TCGGGACCAGTAGAGC-1,Monocytes +Combo_TCGGGACGTGACGCCT-1,T cells +Combo_TCGGGACGTGGAAAGA-1,Monocytes +Combo_TCGGGACTCAGCATGT-1,Monocytes +Combo_TCGGTAAAGAAGAAGC-1,Granulocytes +Combo_TCGGTAAAGTGAATTG-1,Dendritic cells +Combo_TCGGTAACAATGGAAT-1,Monocytes +Combo_TCGGTAACATTAACCG-1,Granulocytes +Combo_TCGGTAACATTAGGCT-1,Granulocytes +Combo_TCGGTAACATTGAGCT-1,Monocytes +Combo_TCGGTAAGTAAAGTCA-1,Monocytes +Combo_TCGGTAAGTGTTGAGG-1,Dendritic cells +Combo_TCGTACCAGCACAGGT-1,Granulocytes +Combo_TCGTACCAGCTAGTCT-1,Granulocytes +Combo_TCGTACCAGGGTATCG-1,Granulocytes +Combo_TCGTACCCACGAAATA-1,Monocytes +Combo_TCGTACCCACGAGAGT-1,Monocytes +Combo_TCGTACCCATCTCCCA-1,Dendritic cells +Combo_TCGTACCGTGTAAGTA-1,Monocytes +Combo_TCGTACCGTGTGAATA-1,Monocytes +Combo_TCGTACCTCCAGAAGG-1,Granulocytes +Combo_TCGTACCTCCTTGCCA-1,Monocytes +Combo_TCGTAGAAGGCCATAG-1,Granulocytes +Combo_TCGTAGACACGAAACG-1,Monocytes +Combo_TCGTAGACACTCGACG-1,Monocytes +Combo_TCGTAGACATCAGTCA-1,Monocytes +Combo_TCGTAGACATTTGCTT-1,T cells +Combo_TCGTAGAGTAACGCGA-1,Monocytes +Combo_TCGTAGAGTATCGCAT-1,Dendritic cells +Combo_TCGTAGAGTGCATCTA-1,Dendritic cells +Combo_TCGTAGAGTTGAGGTG-1,Monocytes +Combo_TCGTAGATCACCGTAA-1,Monocytes +Combo_TCGTAGATCTCGATGA-1,Monocytes +Combo_TCGTAGATCTTTAGGG-1,Monocytes +Combo_TCTATTGAGATCACGG-1,Macrophages +Combo_TCTATTGAGCACCGCT-1,Monocytes +Combo_TCTATTGAGCTAGTTC-1,Granulocytes +Combo_TCTATTGGTATCACCA-1,Granulocytes +Combo_TCTATTGGTCTCCCTA-1,Monocytes +Combo_TCTATTGGTTGCGCAC-1,Dendritic cells +Combo_TCTCATAAGAGTGAGA-1,Monocytes +Combo_TCTCATAAGGAGTTGC-1,Monocytes +Combo_TCTCATACAATGGTCT-1,Monocytes +Combo_TCTCATACAGGGCATA-1,Dendritic cells +Combo_TCTCATAGTACAGACG-1,Granulocytes +Combo_TCTCATAGTCCTGCTT-1,Granulocytes +Combo_TCTCATAGTCGCATAT-1,Granulocytes +Combo_TCTCATAGTGCCTTGG-1,Monocytes +Combo_TCTCATAGTGTGTGCC-1,Monocytes +Combo_TCTCATATCACGCGGT-1,Monocytes +Combo_TCTCATATCCGCAGTG-1,Dendritic cells +Combo_TCTCATATCGGAGGTA-1,Dendritic cells +Combo_TCTCTAAAGAAACGAG-1,Dendritic cells +Combo_TCTCTAAAGAGTACCG-1,Granulocytes +Combo_TCTCTAAAGAGTGACC-1,Monocytes +Combo_TCTCTAAAGATCTGAA-1,Monocytes +Combo_TCTCTAACACAGGCCT-1,Granulocytes +Combo_TCTCTAAGTAATAGCA-1,Monocytes +Combo_TCTCTAAGTCTAAAGA-1,Dendritic cells +Combo_TCTCTAATCAGTTTGG-1,Dendritic cells +Combo_TCTCTAATCCTATGTT-1,Granulocytes +Combo_TCTCTAATCGATAGAA-1,Dendritic cells +Combo_TCTGAGAAGCGTGTCC-1,Monocytes +Combo_TCTGAGACACTTAACG-1,Monocytes +Combo_TCTGAGACATTCCTGC-1,Monocytes +Combo_TCTGAGAGTCAAAGAT-1,Monocytes +Combo_TCTGAGAGTCTGCAAT-1,Monocytes +Combo_TCTGAGAGTGACGCCT-1,Dendritic cells +Combo_TCTGAGAGTTGTCTTT-1,Monocytes +Combo_TCTGAGAGTTTAGCTG-1,Dendritic cells +Combo_TCTGGAAAGAGCCTAG-1,Dendritic cells +Combo_TCTGGAAAGAGTACCG-1,Monocytes +Combo_TCTGGAAAGATGCGAC-1,Monocytes +Combo_TCTGGAAAGCGGATCA-1,Monocytes +Combo_TCTGGAAAGTTCGCAT-1,Monocytes +Combo_TCTGGAACAAAGAATC-1,Granulocytes +Combo_TCTGGAACACAACGTT-1,T cells +Combo_TCTGGAAGTAATTGGA-1,Monocytes +Combo_TCTGGAAGTTATCCGA-1,Monocytes +Combo_TCTGGAATCAGCGACC-1,Granulocytes +Combo_TCTTCGGAGAGTAAGG-1,Granulocytes +Combo_TCTTCGGAGCTACCGC-1,Monocytes +Combo_TCTTCGGAGGCTCTTA-1,Granulocytes +Combo_TCTTCGGAGTACGCCC-1,Granulocytes +Combo_TCTTCGGCAAGTTGTC-1,Dendritic cells +Combo_TCTTCGGCACTGAAGG-1,Monocytes +Combo_TCTTCGGGTGCACGAA-1,Monocytes +Combo_TCTTCGGGTGCCTGCA-1,Macrophages +Combo_TCTTCGGGTTGAGTTC-1,Monocytes +Combo_TCTTCGGTCAGCGATT-1,Monocytes +Combo_TCTTCGGTCTATCCTA-1,Macrophages +Combo_TCTTTCCAGAAACCTA-1,Monocytes +Combo_TCTTTCCAGAGAACAG-1,Monocytes +Combo_TCTTTCCCACACTGCG-1,Monocytes +Combo_TCTTTCCCAGATGAGC-1,Granulocytes +Combo_TCTTTCCCATCACAAC-1,Monocytes +Combo_TCTTTCCCATTGTGCA-1,Dendritic cells +Combo_TCTTTCCGTAAGAGGA-1,Dendritic cells +Combo_TCTTTCCGTGAGGGTT-1,Monocytes +Combo_TCTTTCCGTGCTCTTC-1,Monocytes +Combo_TCTTTCCTCGTTGCCT-1,Granulocytes +Combo_TGAAAGAAGAAGCCCA-1,Dendritic cells +Combo_TGAAAGAAGACCCACC-1,Monocytes +Combo_TGAAAGAAGTTCGCGC-1,Monocytes +Combo_TGAAAGACAGCATACT-1,Monocytes +Combo_TGAAAGAGTAAGAGAG-1,Monocytes +Combo_TGAAAGAGTCTAAAGA-1,Monocytes +Combo_TGAAAGATCAACACCA-1,Monocytes +Combo_TGAAAGATCCGTAGTA-1,Granulocytes +Combo_TGAAAGATCCGTTGTC-1,Monocytes +Combo_TGAAAGATCTTTAGGG-1,Monocytes +Combo_TGACAACAGAGTAATC-1,Dendritic cells +Combo_TGACAACAGGAACTGC-1,Monocytes +Combo_TGACAACCACCAACCG-1,Monocytes +Combo_TGACAACGTACATCCA-1,Monocytes +Combo_TGACAACGTAGAGCTG-1,Monocytes +Combo_TGACAACGTCTAGCGC-1,Monocytes +Combo_TGACAACTCCAAAGTC-1,Granulocytes +Combo_TGACAACTCGCCAAAT-1,Monocytes +Combo_TGACAACTCGTCTGAA-1,T cells +Combo_TGACAACTCTAACTTC-1,Monocytes +Combo_TGACGGCAGGATCGCA-1,Monocytes +Combo_TGACGGCAGGGAGTAA-1,Monocytes +Combo_TGACGGCAGTCCGTAT-1,Dendritic cells +Combo_TGACGGCGTACGCTGC-1,Monocytes +Combo_TGACTAGAGAAACCTA-1,Monocytes +Combo_TGACTAGAGAATCTCC-1,Monocytes +Combo_TGACTAGCACGTGAGA-1,Dendritic cells +Combo_TGACTAGGTCGCGAAA-1,Monocytes +Combo_TGACTAGGTCTCCCTA-1,Monocytes +Combo_TGACTAGGTGAAGGCT-1,Dendritic cells +Combo_TGACTAGGTTCCCGAG-1,T cells +Combo_TGACTAGTCAGGCAAG-1,Monocytes +Combo_TGACTAGTCATCGCTC-1,Monocytes +Combo_TGACTAGTCATCTGTT-1,Monocytes +Combo_TGACTAGTCCGCAAGC-1,Granulocytes +Combo_TGACTAGTCGCGGATC-1,Monocytes +Combo_TGACTTTAGTTGTAGA-1,Monocytes +Combo_TGACTTTCAGACACTT-1,Dendritic cells +Combo_TGACTTTCATTTGCCC-1,Monocytes +Combo_TGACTTTGTAGTACCT-1,Dendritic cells +Combo_TGACTTTTCGTCTGCT-1,Granulocytes +Combo_TGAGAGGAGTGGTAAT-1,Dendritic cells +Combo_TGAGAGGCAGCTGTGC-1,T cells +Combo_TGAGAGGCATTACGAC-1,Monocytes +Combo_TGAGAGGGTTGTTTGG-1,Dendritic cells +Combo_TGAGAGGTCCATTCTA-1,Dendritic cells +Combo_TGAGAGGTCGCTAGCG-1,Monocytes +Combo_TGAGAGGTCTCCAGGG-1,Monocytes +Combo_TGAGCATAGCTGAACG-1,Dendritic cells +Combo_TGAGCATAGGACGAAA-1,Monocytes +Combo_TGAGCATCAATCCGAT-1,Dendritic cells +Combo_TGAGCATCAATGGATA-1,Dendritic cells +Combo_TGAGCATCACCAACCG-1,Granulocytes +Combo_TGAGCATCATGTAGTC-1,Dendritic cells +Combo_TGAGCATGTCGCGTGT-1,Monocytes +Combo_TGAGCATGTCTCGTTC-1,Monocytes +Combo_TGAGCATGTTCCATGA-1,Monocytes +Combo_TGAGCCGCACCGAATT-1,Monocytes +Combo_TGAGCCGGTATATGAG-1,Monocytes +Combo_TGAGCCGGTCCCGACA-1,Monocytes +Combo_TGAGCCGTCTGTGCAA-1,Monocytes +Combo_TGAGGGAAGACACTAA-1,Monocytes +Combo_TGAGGGAAGCCTATGT-1,Monocytes +Combo_TGAGGGACAAACGTGG-1,Monocytes +Combo_TGAGGGACAAGGACAC-1,Dendritic cells +Combo_TGAGGGACAGCGTCCA-1,Dendritic cells +Combo_TGAGGGAGTCCAGTAT-1,Monocytes +Combo_TGAGGGAGTGCATCTA-1,Dendritic cells +Combo_TGAGGGAGTTCGCGAC-1,Monocytes +Combo_TGAGGGATCCGGGTGT-1,Dendritic cells +Combo_TGATTTCAGATGTGGC-1,Monocytes +Combo_TGATTTCCAAGGGTCA-1,Monocytes +Combo_TGATTTCGTAGCGCAA-1,Monocytes +Combo_TGATTTCGTGGTCCGT-1,Dendritic cells +Combo_TGATTTCGTTCTCATT-1,Granulocytes +Combo_TGATTTCTCATCGCTC-1,T cells +Combo_TGATTTCTCCTGCCAT-1,Monocytes +Combo_TGATTTCTCTGAGTGT-1,Monocytes +Combo_TGCACCTAGACCTAGG-1,Monocytes +Combo_TGCACCTAGGACACCA-1,Granulocytes +Combo_TGCACCTCAAACAACA-1,Monocytes +Combo_TGCACCTCACGGCTAC-1,Monocytes +Combo_TGCACCTCATCTATGG-1,Granulocytes +Combo_TGCACCTCATTATCTC-1,Granulocytes +Combo_TGCACCTGTGCAGTAG-1,Monocytes +Combo_TGCACCTGTGTAAGTA-1,Monocytes +Combo_TGCACCTGTTAGAACA-1,Granulocytes +Combo_TGCACCTTCTTGTATC-1,Monocytes +Combo_TGCCAAAAGAATCTCC-1,Monocytes +Combo_TGCCAAAAGACAGACC-1,Monocytes +Combo_TGCCAAAAGAGCAATT-1,Monocytes +Combo_TGCCAAAAGCACCGCT-1,Granulocytes +Combo_TGCCAAAAGCGTGAGT-1,Dendritic cells +Combo_TGCCAAAAGGCGACAT-1,Monocytes +Combo_TGCCAAACAGCCTTTC-1,Dendritic cells +Combo_TGCCAAATCAGTCAGT-1,Dendritic cells +Combo_TGCCAAATCATCTGCC-1,Granulocytes +Combo_TGCCCATAGACCCACC-1,Monocytes +Combo_TGCCCATAGACTTTCG-1,Monocytes +Combo_TGCCCATAGAGGACGG-1,Monocytes +Combo_TGCCCATAGCGCCTTG-1,Monocytes +Combo_TGCCCATAGTCCATAC-1,Granulocytes +Combo_TGCCCATCAGAGTGTG-1,Monocytes +Combo_TGCCCATGTGCGCTTG-1,Monocytes +Combo_TGCCCATTCTATCCTA-1,Dendritic cells +Combo_TGCCCTAAGACTTGAA-1,Monocytes +Combo_TGCCCTAAGCCACGCT-1,Granulocytes +Combo_TGCCCTAAGGACATTA-1,Monocytes +Combo_TGCCCTACACGGTAGA-1,Monocytes +Combo_TGCCCTAGTCACTTCC-1,Dendritic cells +Combo_TGCCCTAGTTCCGTCT-1,Monocytes +Combo_TGCCCTATCCGCATAA-1,Dendritic cells +Combo_TGCGCAGAGCACCGCT-1,Monocytes +Combo_TGCGCAGAGTGCAAGC-1,Monocytes +Combo_TGCGCAGCAAAGGTGC-1,Dendritic cells +Combo_TGCGCAGCAAGTACCT-1,Dendritic cells +Combo_TGCGCAGCACACGCTG-1,Monocytes +Combo_TGCGCAGCACATAACC-1,Monocytes +Combo_TGCGCAGGTACAGTGG-1,Monocytes +Combo_TGCGCAGGTTCACGGC-1,Monocytes +Combo_TGCGCAGTCAACCAAC-1,Granulocytes +Combo_TGCGCAGTCCGTACAA-1,Monocytes +Combo_TGCGGGTAGATCCCGC-1,Dendritic cells +Combo_TGCGGGTAGGATGGAA-1,Monocytes +Combo_TGCGGGTAGGTGATTA-1,Monocytes +Combo_TGCGGGTAGTCGCCGT-1,Dendritic cells +Combo_TGCGGGTCAAAGCAAT-1,Monocytes +Combo_TGCGGGTCACCAGTTA-1,Monocytes +Combo_TGCGGGTGTAAGAGAG-1,Dendritic cells +Combo_TGCGGGTGTATCTGCA-1,Monocytes +Combo_TGCGGGTGTCTCGTTC-1,Macrophages +Combo_TGCGGGTGTCTCTCGT-1,Monocytes +Combo_TGCGTGGAGACTAGAT-1,Monocytes +Combo_TGCGTGGAGACTTGAA-1,Monocytes +Combo_TGCGTGGAGATGGCGT-1,Dendritic cells +Combo_TGCGTGGAGTTTAGGA-1,Granulocytes +Combo_TGCGTGGCAAGGTTTC-1,Dendritic cells +Combo_TGCGTGGGTAACGCGA-1,Granulocytes +Combo_TGCGTGGTCACAATGC-1,Dendritic cells +Combo_TGCGTGGTCAGCATGT-1,Dendritic cells +Combo_TGCGTGGTCGGAGCAA-1,Dendritic cells +Combo_TGCTACCAGTAGATGT-1,Monocytes +Combo_TGCTACCCACGGCCAT-1,Dendritic cells +Combo_TGCTACCCAGGATTGG-1,T cells +Combo_TGCTACCGTATCTGCA-1,Monocytes +Combo_TGCTACCGTCCGAGTC-1,Monocytes +Combo_TGCTACCGTGAGCGAT-1,Monocytes +Combo_TGCTACCGTGGAAAGA-1,Granulocytes +Combo_TGCTACCTCCAGAAGG-1,Dendritic cells +Combo_TGCTGCTAGCCACTAT-1,Monocytes +Combo_TGCTGCTAGGGATGGG-1,Dendritic cells +Combo_TGCTGCTAGTGCGTGA-1,Dendritic cells +Combo_TGCTGCTCATACGCTA-1,Monocytes +Combo_TGCTGCTTCCCTTGCA-1,Monocytes +Combo_TGCTGCTTCGGTGTTA-1,Macrophages +Combo_TGGACGCAGCCAGGAT-1,Monocytes +Combo_TGGACGCAGCGATTCT-1,T cells +Combo_TGGACGCAGTGTCTCA-1,Granulocytes +Combo_TGGACGCAGTTTGCGT-1,Dendritic cells +Combo_TGGACGCCACTGTGTA-1,Granulocytes +Combo_TGGACGCGTTGTTTGG-1,Monocytes +Combo_TGGACGCTCCACTCCA-1,Dendritic cells +Combo_TGGACGCTCGTACCGG-1,Dendritic cells +Combo_TGGCCAGAGGACGAAA-1,Monocytes +Combo_TGGCCAGAGTACTTGC-1,Granulocytes +Combo_TGGCCAGCACGGTGTC-1,Dendritic cells +Combo_TGGCCAGCACTCGACG-1,Dendritic cells +Combo_TGGCCAGGTACCTACA-1,Monocytes +Combo_TGGCCAGGTAGCCTAT-1,Monocytes +Combo_TGGCCAGGTCGGGTCT-1,Monocytes +Combo_TGGCCAGGTGCCTTGG-1,NK cells +Combo_TGGCCAGGTTAGAACA-1,Dendritic cells +Combo_TGGCCAGTCGACAGCC-1,Dendritic cells +Combo_TGGCGCAAGGACATTA-1,Dendritic cells +Combo_TGGCGCACACTGTTAG-1,Monocytes +Combo_TGGCGCACATGGATGG-1,Dendritic cells +Combo_TGGCGCACATTAGCCA-1,Monocytes +Combo_TGGCGCACATTATCTC-1,Dendritic cells +Combo_TGGCGCAGTACCGTAT-1,Monocytes +Combo_TGGCGCAGTCAGAAGC-1,Dendritic cells +Combo_TGGCGCAGTCTTGATG-1,Monocytes +Combo_TGGCGCAGTTATTCTC-1,Monocytes +Combo_TGGCGCATCCTAAGTG-1,Monocytes +Combo_TGGCTGGAGCTGCAAG-1,Granulocytes +Combo_TGGCTGGCAAAGGTGC-1,Monocytes +Combo_TGGCTGGGTAGAAGGA-1,Dendritic cells +Combo_TGGCTGGGTCCATGAT-1,Monocytes +Combo_TGGCTGGGTCGGCATC-1,Monocytes +Combo_TGGCTGGGTGCATCTA-1,Monocytes +Combo_TGGCTGGTCATGTCCC-1,Dendritic cells +Combo_TGGGAAGAGAAGCCCA-1,Monocytes +Combo_TGGGAAGAGCTGCAAG-1,Dendritic cells +Combo_TGGGAAGAGTTCGCGC-1,Dendritic cells +Combo_TGGGAAGCAACTGCTA-1,Monocytes +Combo_TGGGAAGCATCAGTCA-1,Monocytes +Combo_TGGGAAGGTAAGGGCT-1,Monocytes +Combo_TGGGAAGGTATATCCG-1,Granulocytes +Combo_TGGGAAGGTCAGAGGT-1,Dendritic cells +Combo_TGGGAAGGTCCCGACA-1,Monocytes +Combo_TGGGAAGGTCTAAAGA-1,Granulocytes +Combo_TGGGAAGGTTCATGGT-1,Monocytes +Combo_TGGGAAGTCAGAAATG-1,Monocytes +Combo_TGGGAAGTCGGTGTCG-1,Monocytes +Combo_TGGGCGTAGAGCCTAG-1,Monocytes +Combo_TGGGCGTAGGCGACAT-1,Monocytes +Combo_TGGGCGTCAACTGCTA-1,Dendritic cells +Combo_TGGGCGTCAATCCAAC-1,Monocytes +Combo_TGGGCGTGTTCATGGT-1,Dendritic cells +Combo_TGGGCGTTCGTACGGC-1,Monocytes +Combo_TGGTTAGAGGCGATAC-1,Monocytes +Combo_TGGTTAGAGGTACTCT-1,Monocytes +Combo_TGGTTAGAGTCTCCTC-1,Granulocytes +Combo_TGGTTAGCAAGCCGTC-1,Macrophages +Combo_TGGTTAGCATGGTAGG-1,T cells +Combo_TGGTTAGCATTAACCG-1,Monocytes +Combo_TGGTTAGGTCGCATAT-1,Monocytes +Combo_TGGTTAGTCAGATAAG-1,Monocytes +Combo_TGGTTAGTCCACGAAT-1,Granulocytes +Combo_TGGTTAGTCGTAGGAG-1,Monocytes +Combo_TGGTTCCAGAATTGTG-1,Granulocytes +Combo_TGGTTCCCACGCGAAA-1,Monocytes +Combo_TGGTTCCCAGACACTT-1,Monocytes +Combo_TGGTTCCCAGTATAAG-1,Dendritic cells +Combo_TGGTTCCGTACCGAGA-1,Monocytes +Combo_TGGTTCCGTCTTGCGG-1,Dendritic cells +Combo_TGGTTCCTCCATGAGT-1,Monocytes +Combo_TGTATTCAGGAACTGC-1,Monocytes +Combo_TGTATTCAGTACGCCC-1,Monocytes +Combo_TGTATTCCAAGCGAGT-1,Dendritic cells +Combo_TGTATTCCAGCTGGCT-1,Monocytes +Combo_TGTATTCGTAGGGTAC-1,Monocytes +Combo_TGTATTCTCAAACAAG-1,Monocytes +Combo_TGTATTCTCGTTTGCC-1,Monocytes +Combo_TGTATTCTCTTGAGAC-1,Dendritic cells +Combo_TGTATTCTCTTTCCTC-1,Dendritic cells +Combo_TGTCCCAAGATTACCC-1,Monocytes +Combo_TGTCCCAAGCTAAACA-1,Granulocytes +Combo_TGTCCCAGTAAATGTG-1,Monocytes +Combo_TGTCCCAGTCAAAGCG-1,Monocytes +Combo_TGTCCCAGTGCAACTT-1,Monocytes +Combo_TGTCCCATCCGTTGCT-1,Monocytes +Combo_TGTCCCATCTACCTGC-1,Macrophages +Combo_TGTGGTAAGAAACGAG-1,Monocytes +Combo_TGTGGTAAGCCTCGTG-1,Dendritic cells +Combo_TGTGGTAAGTGGAGTC-1,Monocytes +Combo_TGTGGTACAGTGGGAT-1,Dendritic cells +Combo_TGTGGTACATCCGTGG-1,Monocytes +Combo_TGTGGTAGTTCGGCAC-1,Monocytes +Combo_TGTGGTATCTTGTACT-1,Monocytes +Combo_TGTGTTTAGCTAACTC-1,Dendritic cells +Combo_TGTGTTTAGGAATGGA-1,Monocytes +Combo_TGTGTTTCAGATGGGT-1,Granulocytes +Combo_TGTGTTTGTCTAAACC-1,Monocytes +Combo_TGTGTTTTCGTAGGAG-1,T cells +Combo_TGTGTTTTCTCGGACG-1,Monocytes +Combo_TGTGTTTTCTGTTGAG-1,Monocytes +Combo_TGTGTTTTCTTCCTTC-1,Monocytes +Combo_TGTTCCGAGCAAATCA-1,Dendritic cells +Combo_TGTTCCGAGGCCATAG-1,Monocytes +Combo_TGTTCCGAGGCCCGTT-1,Granulocytes +Combo_TGTTCCGAGTCCGTAT-1,Granulocytes +Combo_TGTTCCGAGTTGTAGA-1,Monocytes +Combo_TGTTCCGAGTTGTCGT-1,Dendritic cells +Combo_TGTTCCGCAAGCGCTC-1,Dendritic cells +Combo_TGTTCCGCATGACGGA-1,Dendritic cells +Combo_TGTTCCGCATTGGTAC-1,Granulocytes +Combo_TGTTCCGGTCTAGAGG-1,Monocytes +Combo_TGTTCCGGTGCGAAAC-1,Monocytes +Combo_TGTTCCGGTGTAACGG-1,Dendritic cells +Combo_TGTTCCGTCACGACTA-1,Granulocytes +Combo_TGTTCCGTCATGGTCA-1,Dendritic cells +Combo_TTAACTCAGATTACCC-1,Granulocytes +Combo_TTAACTCAGTCCAGGA-1,Monocytes +Combo_TTAACTCCACAAGCCC-1,Monocytes +Combo_TTAACTCGTAGCGTGA-1,Monocytes +Combo_TTAACTCGTTCTCATT-1,Dendritic cells +Combo_TTAACTCTCTTGGGTA-1,Monocytes +Combo_TTAACTCTCTTTCCTC-1,Monocytes +Combo_TTAGGACAGATATGCA-1,Monocytes +Combo_TTAGGACAGTACGTTC-1,Monocytes +Combo_TTAGGACAGTGCGTGA-1,Monocytes +Combo_TTAGGACAGTGGAGAA-1,Granulocytes +Combo_TTAGGACCAAAGGAAG-1,Dendritic cells +Combo_TTAGGACCACAGCCCA-1,Monocytes +Combo_TTAGGACCATTGCGGC-1,Monocytes +Combo_TTAGGACGTAGCGCAA-1,Monocytes +Combo_TTAGGACGTATTCGTG-1,Dendritic cells +Combo_TTAGGACGTGTGACGA-1,Monocytes +Combo_TTAGGCAAGAATTCCC-1,Granulocytes +Combo_TTAGGCAAGCGATAGC-1,Dendritic cells +Combo_TTAGGCAAGGTGTGGT-1,Dendritic cells +Combo_TTAGGCAAGTACTTGC-1,Monocytes +Combo_TTAGGCAAGTGGAGAA-1,Monocytes +Combo_TTAGGCACAATGCCAT-1,Monocytes +Combo_TTAGGCACAGCCAGAA-1,Granulocytes +Combo_TTAGGCAGTAAGGATT-1,Monocytes +Combo_TTAGGCAGTACGCACC-1,Monocytes +Combo_TTAGGCAGTATTAGCC-1,T cells +Combo_TTAGGCAGTTTAGCTG-1,Monocytes +Combo_TTAGGCATCGATGAGG-1,Granulocytes +Combo_TTAGTTCCAAAGGTGC-1,Granulocytes +Combo_TTAGTTCCACAGATTC-1,Granulocytes +Combo_TTAGTTCCAGACGCAA-1,Granulocytes +Combo_TTAGTTCGTAGCAAAT-1,Granulocytes +Combo_TTAGTTCGTCACCTAA-1,Monocytes +Combo_TTATGCTAGTCGTACT-1,Dendritic cells +Combo_TTATGCTCACGAAACG-1,Monocytes +Combo_TTATGCTCACTAAGTC-1,Monocytes +Combo_TTATGCTCAGGATTGG-1,Monocytes +Combo_TTATGCTCATCACAAC-1,Monocytes +Combo_TTATGCTGTAGCGCAA-1,Monocytes +Combo_TTATGCTGTAGGCATG-1,T cells +Combo_TTATGCTGTGAGGGAG-1,Monocytes +Combo_TTATGCTTCCAAACTG-1,Monocytes +Combo_TTATGCTTCCCATTAT-1,Monocytes +Combo_TTATGCTTCCTGTACC-1,Monocytes +Combo_TTATGCTTCTCGCTTG-1,Dendritic cells +Combo_TTCCCAGAGATCTGAA-1,Dendritic cells +Combo_TTCCCAGAGCCCAACC-1,Dendritic cells +Combo_TTCCCAGAGTACGTAA-1,Monocytes +Combo_TTCCCAGAGTGACTCT-1,Monocytes +Combo_TTCCCAGCACAGATTC-1,Monocytes +Combo_TTCCCAGCAGTTTACG-1,Monocytes +Combo_TTCCCAGGTCGCGAAA-1,Monocytes +Combo_TTCCCAGGTGAACCTT-1,Granulocytes +Combo_TTCCCAGGTTCAGCGC-1,Monocytes +Combo_TTCCCAGTCCGATATG-1,Monocytes +Combo_TTCGAAGAGAAACCGC-1,Macrophages +Combo_TTCGAAGAGAAAGTGG-1,Dendritic cells +Combo_TTCGAAGAGCACCGCT-1,Monocytes +Combo_TTCGAAGAGGGTCGAT-1,Monocytes +Combo_TTCGAAGCAACTTGAC-1,Monocytes +Combo_TTCGAAGCAGTATCTG-1,Dendritic cells +Combo_TTCGAAGCATGGATGG-1,Dendritic cells +Combo_TTCGAAGGTGAACCTT-1,Dendritic cells +Combo_TTCGAAGGTGCAACGA-1,Granulocytes +Combo_TTCGAAGTCCCAAGAT-1,Monocytes +Combo_TTCGAAGTCCGTAGGC-1,Monocytes +Combo_TTCGAAGTCTAGAGTC-1,Monocytes +Combo_TTCGAAGTCTCTAAGG-1,T cells +Combo_TTCGGTCAGACGCTTT-1,Monocytes +Combo_TTCGGTCAGCCAACAG-1,Monocytes +Combo_TTCGGTCCAAGGTTTC-1,Dendritic cells +Combo_TTCGGTCCACATTAGC-1,T cells +Combo_TTCGGTCGTATAATGG-1,Granulocytes +Combo_TTCGGTCGTCTAAAGA-1,Monocytes +Combo_TTCGGTCGTCTCCATC-1,Monocytes +Combo_TTCGGTCTCAGCAACT-1,Dendritic cells +Combo_TTCGGTCTCGTTTATC-1,Monocytes +Combo_TTCTACAAGACTAAGT-1,Monocytes +Combo_TTCTACAAGATATGGT-1,Granulocytes +Combo_TTCTACAAGCCACCTG-1,Monocytes +Combo_TTCTACACACGTGAGA-1,Granulocytes +Combo_TTCTACAGTAAACGCG-1,Dendritic cells +Combo_TTCTACAGTAAATGAC-1,Monocytes +Combo_TTCTACAGTAGAAGGA-1,Monocytes +Combo_TTCTACAGTCAGCTAT-1,Dendritic cells +Combo_TTCTACAGTCTCTTTA-1,Granulocytes +Combo_TTCTACAGTTCAGGCC-1,Granulocytes +Combo_TTCTACAGTTCCACGG-1,Monocytes +Combo_TTCTCAAAGTAACCCT-1,Granulocytes +Combo_TTCTCAAAGTCCGTAT-1,Monocytes +Combo_TTCTCAACACGCCAGT-1,Monocytes +Combo_TTCTCAACACGGCTAC-1,Monocytes +Combo_TTCTCAACATTGGTAC-1,Monocytes +Combo_TTCTCAAGTTAGTGGG-1,Monocytes +Combo_TTCTCAATCCTTTACA-1,Monocytes +Combo_TTCTCCTAGAACTCGG-1,Monocytes +Combo_TTCTCCTAGCTGCGAA-1,Monocytes +Combo_TTCTCCTAGGTACTCT-1,Granulocytes +Combo_TTCTCCTAGTGGCACA-1,Monocytes +Combo_TTCTCCTAGTGTACCT-1,Monocytes +Combo_TTCTCCTCAAGCGCTC-1,Dendritic cells +Combo_TTCTCCTCAAGGTTTC-1,Monocytes +Combo_TTCTCCTCATCTGGTA-1,Monocytes +Combo_TTCTCCTGTAGCGATG-1,Monocytes +Combo_TTCTCCTGTATTAGCC-1,Dendritic cells +Combo_TTCTCCTGTCGTGGCT-1,Monocytes +Combo_TTCTCCTTCATCGATG-1,Dendritic cells +Combo_TTCTCCTTCATTATCC-1,Monocytes +Combo_TTCTCCTTCCACGTGG-1,Granulocytes +Combo_TTCTCCTTCGACGGAA-1,Monocytes +Combo_TTCTCCTTCTCCAACC-1,Dendritic cells +Combo_TTCTTAGAGCATCATC-1,Monocytes +Combo_TTCTTAGCAGCTGGCT-1,Granulocytes +Combo_TTCTTAGCATTCTTAC-1,Monocytes +Combo_TTCTTAGGTGTTGAGG-1,Monocytes +Combo_TTCTTAGGTTATCGGT-1,Monocytes +Combo_TTCTTAGGTTCTGTTT-1,Monocytes +Combo_TTCTTAGTCAAGCCTA-1,Monocytes +Combo_TTCTTAGTCGACAGCC-1,Dendritic cells +Combo_TTGAACGAGGACCACA-1,Dendritic cells +Combo_TTGAACGCACAGTCGC-1,Dendritic cells +Combo_TTGAACGGTCAGGACA-1,Granulocytes +Combo_TTGAACGGTCCAGTAT-1,Monocytes +Combo_TTGAACGGTGAACCTT-1,Monocytes +Combo_TTGAACGTCAGCCTAA-1,Monocytes +Combo_TTGAACGTCAGCTCTC-1,Monocytes +Combo_TTGAACGTCGAGAGCA-1,Dendritic cells +Combo_TTGAACGTCTCGCATC-1,Monocytes +Combo_TTGACTTAGCTATGCT-1,Monocytes +Combo_TTGACTTAGTTAAGTG-1,Granulocytes +Combo_TTGACTTGTATCTGCA-1,Monocytes +Combo_TTGACTTGTCCGCTGA-1,Granulocytes +Combo_TTGACTTGTGGCGAAT-1,Monocytes +Combo_TTGACTTGTGTCAATC-1,Monocytes +Combo_TTGACTTGTTCGTTGA-1,Dendritic cells +Combo_TTGACTTTCACCTTAT-1,Granulocytes +Combo_TTGACTTTCTGCTTGC-1,Monocytes +Combo_TTGCCGTAGTATTGGA-1,Granulocytes +Combo_TTGCCGTAGTTAAGTG-1,Dendritic cells +Combo_TTGCCGTCAGACTCGC-1,Monocytes +Combo_TTGCCGTCATCGATGT-1,Monocytes +Combo_TTGCCGTCATCGGAAG-1,Monocytes +Combo_TTGCCGTGTCCAGTGC-1,Monocytes +Combo_TTGCCGTGTCCTCCAT-1,Dendritic cells +Combo_TTGCCGTGTGGACGAT-1,Monocytes +Combo_TTGCCGTTCCAGATCA-1,Dendritic cells +Combo_TTGCCGTTCGCACTCT-1,Monocytes +Combo_TTGCCGTTCTAGAGTC-1,Monocytes +Combo_TTGCGTCAGCTGCGAA-1,Granulocytes +Combo_TTGCGTCCAGAAGCAC-1,Dendritic cells +Combo_TTGCGTCCAGCTGGCT-1,Monocytes +Combo_TTGCGTCCATCATCCC-1,Monocytes +Combo_TTGCGTCGTACTTGAC-1,Monocytes +Combo_TTGCGTCGTTAAGGGC-1,Monocytes +Combo_TTGCGTCTCATAGCAC-1,Monocytes +Combo_TTGGAACAGCGAGAAA-1,Monocytes +Combo_TTGGAACAGGCTCAGA-1,Monocytes +Combo_TTGGAACAGGGCACTA-1,Dendritic cells +Combo_TTGGAACCAAAGGCGT-1,Monocytes +Combo_TTGGAACCACATGACT-1,Monocytes +Combo_TTGGAACCATACAGCT-1,Monocytes +Combo_TTGGAACGTAAGGGCT-1,Dendritic cells +Combo_TTGGAACGTGACCAAG-1,Monocytes +Combo_TTGGAACGTTATGTGC-1,Monocytes +Combo_TTGGAACTCACCTCGT-1,Monocytes +Combo_TTGGAACTCGCGTTTC-1,Monocytes +Combo_TTGGAACTCTTGTTTG-1,Monocytes +Combo_TTGGCAAAGATCCCAT-1,Monocytes +Combo_TTGGCAAAGTGTCCAT-1,Granulocytes +Combo_TTGGCAACAAGAAAGG-1,Monocytes +Combo_TTGGCAACAAGCTGAG-1,Monocytes +Combo_TTGGCAATCTGACCTC-1,Dendritic cells +Combo_TTGTAGGAGCGTTCCG-1,Monocytes +Combo_TTGTAGGAGTCATGCT-1,Granulocytes +Combo_TTGTAGGCACGGATAG-1,Monocytes +Combo_TTGTAGGCAGCCTGTG-1,Granulocytes +Combo_TTGTAGGGTAACGCGA-1,Monocytes +Combo_TTGTAGGGTAGCACGA-1,Monocytes +Combo_TTGTAGGGTCCCTACT-1,Granulocytes +Combo_TTGTAGGGTGATGTCT-1,Monocytes +Combo_TTGTAGGTCACAGTAC-1,Monocytes +Combo_TTGTAGGTCAGAGGTG-1,Monocytes +Combo_TTTACTGAGCAGGTCA-1,Monocytes +Combo_TTTACTGAGGCCCTCA-1,Dendritic cells +Combo_TTTACTGAGTGAACGC-1,Monocytes +Combo_TTTACTGAGTGGCACA-1,Dendritic cells +Combo_TTTACTGCATCGACGC-1,Dendritic cells +Combo_TTTATGCAGCGTGAGT-1,T cells +Combo_TTTATGCAGGCCGAAT-1,Monocytes +Combo_TTTATGCAGTGGTAGC-1,Granulocytes +Combo_TTTATGCGTAGGGTAC-1,Monocytes +Combo_TTTATGCGTATAAACG-1,Dendritic cells +Combo_TTTATGCTCTTTAGGG-1,Monocytes +Combo_TTTCCTCAGCGTAATA-1,Monocytes +Combo_TTTCCTCAGGGCACTA-1,Dendritic cells +Combo_TTTCCTCAGGTGGGTT-1,T cells +Combo_TTTCCTCCAAGCTGTT-1,Dendritic cells +Combo_TTTCCTCCAATAGAGT-1,Monocytes +Combo_TTTCCTCGTAAGTAGT-1,Monocytes +Combo_TTTCCTCGTTTGGGCC-1,Monocytes +Combo_TTTCCTCTCGAGGTAG-1,Granulocytes +Combo_TTTGCGCAGATCCCAT-1,Dendritic cells +Combo_TTTGCGCCAGCGTTCG-1,Monocytes +Combo_TTTGCGCCAGTATAAG-1,Monocytes +Combo_TTTGCGCGTCGAAAGC-1,Monocytes +Combo_TTTGCGCTCAGTTCGA-1,Monocytes +Combo_TTTGCGCTCGTGGACC-1,Dendritic cells +Combo_TTTGCGCTCTTAGAGC-1,Monocytes +Combo_TTTGGTTAGATATGCA-1,Dendritic cells +Combo_TTTGGTTAGTAGGTGC-1,Monocytes +Combo_TTTGGTTAGTCGAGTG-1,Granulocytes +Combo_TTTGGTTAGTCGATAA-1,Dendritic cells +Combo_TTTGGTTCACCTCGTT-1,Monocytes +Combo_TTTGGTTCATTGGCGC-1,Granulocytes +Combo_TTTGGTTGTAGCAAAT-1,Monocytes +Combo_TTTGGTTGTGTTAAGA-1,Monocytes +Combo_TTTGGTTTCGGCGCAT-1,Monocytes +Combo_TTTGTCAAGAGTTGGC-1,Monocytes +Combo_TTTGTCAGTCAGAGGT-1,Monocytes +Combo_TTTGTCAGTGAACCTT-1,Monocytes +Combo_TTTGTCATCAACTCTT-1,Monocytes +Combo_TTTGTCATCATCGATG-1,Dendritic cells +Combo_TTTGTCATCTCAACTT-1,Monocytes +Combo_TTTGTCATCTTGAGAC-1,Monocytes +CD8dep_AAACCTGAGACAGAGA-1,Monocytes +CD8dep_AAACCTGCACAACGTT-1,Monocytes +CD8dep_AAACCTGCACGTTGGC-1,Dendritic cells +CD8dep_AAACCTGTCACCAGGC-1,Monocytes +CD8dep_AAACCTGTCACTGGGC-1,Monocytes +CD8dep_AAACCTGTCAGGTTCA-1,Monocytes +CD8dep_AAACGGGCACGTTGGC-1,Monocytes +CD8dep_AAACGGGCAGCTATTG-1,Dendritic cells +CD8dep_AAACGGGCATTGGTAC-1,Dendritic cells +CD8dep_AAACGGGGTAGGACAC-1,T cells +CD8dep_AAACGGGGTCCCTTGT-1,Monocytes +CD8dep_AAACGGGTCTCGCATC-1,Monocytes +CD8dep_AAACGGGTCTGGCGTG-1,Monocytes +CD8dep_AAAGATGAGGATGTAT-1,Monocytes +CD8dep_AAAGATGCACAAGCCC-1,Monocytes +CD8dep_AAAGATGCAGCATGAG-1,Dendritic cells +CD8dep_AAAGATGGTACCGAGA-1,Monocytes +CD8dep_AAAGATGGTAGTAGTA-1,Monocytes +CD8dep_AAAGATGGTCCAACTA-1,Monocytes +CD8dep_AAAGATGGTCGTGGCT-1,Monocytes +CD8dep_AAAGATGTCGTACCGG-1,Monocytes +CD8dep_AAAGATGTCTCTGAGA-1,Monocytes +CD8dep_AAAGCAAAGCGCTCCA-1,Monocytes +CD8dep_AAAGCAAAGCTGCCCA-1,Monocytes +CD8dep_AAAGCAAAGTGTCTCA-1,Dendritic cells +CD8dep_AAAGCAACAGTTAACC-1,Macrophages +CD8dep_AAAGCAACATATGAGA-1,Monocytes +CD8dep_AAAGCAAGTACCAGTT-1,Monocytes +CD8dep_AAAGCAAGTCTCCACT-1,Macrophages +CD8dep_AAAGCAATCACAATGC-1,Monocytes +CD8dep_AAAGCAATCCTTCAAT-1,Monocytes +CD8dep_AAAGCAATCTTGCATT-1,Monocytes +CD8dep_AAAGTAGAGACTAAGT-1,Monocytes +CD8dep_AAAGTAGAGACTTGAA-1,Monocytes +CD8dep_AAAGTAGAGAGCAATT-1,Monocytes +CD8dep_AAAGTAGCAAAGGTGC-1,Monocytes +CD8dep_AAAGTAGCAAATCCGT-1,Dendritic cells +CD8dep_AAAGTAGCACTCGACG-1,Monocytes +CD8dep_AAAGTAGCAGGTCCAC-1,Monocytes +CD8dep_AAAGTAGCAGTAGAGC-1,T cells +CD8dep_AAAGTAGCATAGGATA-1,Monocytes +CD8dep_AAAGTAGCATCACGAT-1,Monocytes +CD8dep_AAAGTAGGTATTCGTG-1,T cells +CD8dep_AAAGTAGGTTCATGGT-1,Macrophages +CD8dep_AAATGCCAGAAACCTA-1,Monocytes +CD8dep_AAATGCCAGATCGATA-1,Monocytes +CD8dep_AAATGCCAGCAATCTC-1,Monocytes +CD8dep_AAATGCCAGTATCGAA-1,Monocytes +CD8dep_AAATGCCCAATGAATG-1,Monocytes +CD8dep_AAATGCCCACCACGTG-1,Dendritic cells +CD8dep_AAATGCCGTTGATTGC-1,Macrophages +CD8dep_AAATGCCTCAGAGGTG-1,Monocytes +CD8dep_AAATGCCTCCAAAGTC-1,Monocytes +CD8dep_AAATGCCTCCGTTGCT-1,Monocytes +CD8dep_AAATGCCTCTATGTGG-1,Monocytes +CD8dep_AACACGTAGAAGGACA-1,Monocytes +CD8dep_AACACGTAGAGGGATA-1,Granulocytes +CD8dep_AACACGTAGAGTCGGT-1,Monocytes +CD8dep_AACACGTCAGTTCATG-1,Monocytes +CD8dep_AACACGTCATGAAGTA-1,Macrophages +CD8dep_AACACGTGTCTCTCTG-1,Monocytes +CD8dep_AACACGTGTGGTGTAG-1,Monocytes +CD8dep_AACACGTTCTACCAGA-1,Monocytes +CD8dep_AACCATGAGACATAAC-1,Macrophages +CD8dep_AACCATGAGTCATGCT-1,Dendritic cells +CD8dep_AACCATGCACCGAATT-1,Macrophages +CD8dep_AACCATGCACTTGGAT-1,Monocytes +CD8dep_AACCATGGTTTACTCT-1,Dendritic cells +CD8dep_AACCATGTCACGACTA-1,Monocytes +CD8dep_AACCATGTCTGCTTGC-1,Monocytes +CD8dep_AACCATGTCTGGTGTA-1,Granulocytes +CD8dep_AACCGCGAGGAGTTTA-1,Monocytes +CD8dep_AACCGCGGTAATCGTC-1,Monocytes +CD8dep_AACCGCGGTATTACCG-1,Monocytes +CD8dep_AACCGCGGTCGCTTCT-1,Monocytes +CD8dep_AACCGCGTCAATCTCT-1,Monocytes +CD8dep_AACCGCGTCCAGTAGT-1,Macrophages +CD8dep_AACCGCGTCTGTGCAA-1,Monocytes +CD8dep_AACGTTGAGACACTAA-1,Monocytes +CD8dep_AACGTTGAGCGATTCT-1,Monocytes +CD8dep_AACGTTGAGTACATGA-1,Monocytes +CD8dep_AACGTTGCAAATACAG-1,Monocytes +CD8dep_AACGTTGCACACGCTG-1,Monocytes +CD8dep_AACGTTGCATTACGAC-1,Monocytes +CD8dep_AACGTTGCATTATCTC-1,Monocytes +CD8dep_AACGTTGGTAAGTGTA-1,Monocytes +CD8dep_AACGTTGGTCCAGTAT-1,Monocytes +CD8dep_AACGTTGGTCTTGATG-1,Monocytes +CD8dep_AACGTTGGTGTGAATA-1,Monocytes +CD8dep_AACGTTGTCAAGGCTT-1,Monocytes +CD8dep_AACTCAGAGAGAGCTC-1,Monocytes +CD8dep_AACTCAGAGATGGCGT-1,Monocytes +CD8dep_AACTCAGAGCCACGCT-1,Monocytes +CD8dep_AACTCAGAGCGTTTAC-1,Monocytes +CD8dep_AACTCAGCATCGACGC-1,Monocytes +CD8dep_AACTCAGTCAGCATGT-1,Monocytes +CD8dep_AACTCAGTCTCACATT-1,Monocytes +CD8dep_AACTCCCAGAGCCCAA-1,Monocytes +CD8dep_AACTCCCCACAGCGTC-1,Monocytes +CD8dep_AACTCCCCATACAGCT-1,Monocytes +CD8dep_AACTCCCGTCATGCCG-1,Monocytes +CD8dep_AACTCCCGTCCTGCTT-1,Dendritic cells +CD8dep_AACTCCCGTGTCCTCT-1,Monocytes +CD8dep_AACTCCCGTTACCGAT-1,Monocytes +CD8dep_AACTCCCTCCGCAAGC-1,Monocytes +CD8dep_AACTCTTAGACAGAGA-1,Macrophages +CD8dep_AACTCTTAGTCAAGCG-1,Dendritic cells +CD8dep_AACTCTTAGTCAATAG-1,Monocytes +CD8dep_AACTCTTTCAACACCA-1,Monocytes +CD8dep_AACTCTTTCAGTGCAT-1,Dendritic cells +CD8dep_AACTCTTTCCTGCTTG-1,Monocytes +CD8dep_AACTCTTTCGCGTAGC-1,Monocytes +CD8dep_AACTGGTAGCTAACAA-1,Monocytes +CD8dep_AACTGGTAGGATTCGG-1,Monocytes +CD8dep_AACTGGTCAAACAACA-1,Dendritic cells +CD8dep_AACTGGTCATGGTAGG-1,Monocytes +CD8dep_AACTGGTGTAAATGAC-1,Monocytes +CD8dep_AACTGGTGTAGGCATG-1,Monocytes +CD8dep_AACTGGTGTCTCTCGT-1,Monocytes +CD8dep_AACTGGTGTGATAAGT-1,Dendritic cells +CD8dep_AACTGGTGTTACCAGT-1,Dendritic cells +CD8dep_AACTGGTTCCTGTACC-1,Monocytes +CD8dep_AACTGGTTCGATAGAA-1,Monocytes +CD8dep_AACTGGTTCTATCCTA-1,Monocytes +CD8dep_AACTTTCAGACACTAA-1,Granulocytes +CD8dep_AACTTTCAGCAGATCG-1,Monocytes +CD8dep_AACTTTCAGCTAGCCC-1,Monocytes +CD8dep_AACTTTCAGGTGCTTT-1,Monocytes +CD8dep_AACTTTCCAATCGAAA-1,Monocytes +CD8dep_AACTTTCCAGATGGGT-1,Monocytes +CD8dep_AACTTTCGTCTAGCGC-1,Monocytes +CD8dep_AACTTTCGTGACGCCT-1,Monocytes +CD8dep_AACTTTCGTTTGGGCC-1,Monocytes +CD8dep_AACTTTCTCGAACGGA-1,Dendritic cells +CD8dep_AAGACCTAGAAGCCCA-1,Monocytes +CD8dep_AAGACCTAGGCTCATT-1,Monocytes +CD8dep_AAGACCTGTCGTGGCT-1,Monocytes +CD8dep_AAGACCTGTGCGCTTG-1,Macrophages +CD8dep_AAGACCTGTGTCAATC-1,Granulocytes +CD8dep_AAGACCTGTTCGTCTC-1,Monocytes +CD8dep_AAGACCTTCAGATAAG-1,Monocytes +CD8dep_AAGCCGCCAGGTGCCT-1,Monocytes +CD8dep_AAGCCGCGTTAAGAAC-1,Monocytes +CD8dep_AAGCCGCTCGAATGGG-1,Granulocytes +CD8dep_AAGCCGCTCGTCACGG-1,Monocytes +CD8dep_AAGGAGCAGCCCGAAA-1,Monocytes +CD8dep_AAGGAGCCATGACATC-1,Monocytes +CD8dep_AAGGAGCGTAGGCTGA-1,Dendritic cells +CD8dep_AAGGAGCGTGACAAAT-1,Monocytes +CD8dep_AAGGAGCGTGAGGCTA-1,Monocytes +CD8dep_AAGGAGCTCAGCACAT-1,Monocytes +CD8dep_AAGGCAGAGTACGCGA-1,Monocytes +CD8dep_AAGGCAGAGTACGTAA-1,Monocytes +CD8dep_AAGGCAGCACAGGTTT-1,Granulocytes +CD8dep_AAGGCAGCACCCATGG-1,Monocytes +CD8dep_AAGGCAGGTAGGCTGA-1,Dendritic cells +CD8dep_AAGGCAGGTCACAAGG-1,Monocytes +CD8dep_AAGGCAGGTCTCTCTG-1,Monocytes +CD8dep_AAGGCAGTCACATACG-1,Monocytes +CD8dep_AAGGCAGTCCCAAGAT-1,Monocytes +CD8dep_AAGGCAGTCCGAAGAG-1,Monocytes +CD8dep_AAGGCAGTCCTAGAAC-1,Monocytes +CD8dep_AAGGTTCCAACTTGAC-1,Monocytes +CD8dep_AAGGTTCCACAGGCCT-1,Monocytes +CD8dep_AAGGTTCCATATACGC-1,Monocytes +CD8dep_AAGGTTCGTACACCGC-1,Monocytes +CD8dep_AAGGTTCGTGTATGGG-1,Monocytes +CD8dep_AAGGTTCTCAACGCTA-1,Macrophages +CD8dep_AAGGTTCTCAGTTTGG-1,Monocytes +CD8dep_AAGGTTCTCGTACCGG-1,Monocytes +CD8dep_AAGTCTGAGACTAGAT-1,Monocytes +CD8dep_AAGTCTGAGAGAACAG-1,Monocytes +CD8dep_AAGTCTGAGTCCAGGA-1,Macrophages +CD8dep_AAGTCTGAGTCTTGCA-1,Monocytes +CD8dep_AAGTCTGCAATAGAGT-1,Monocytes +CD8dep_AAGTCTGCAGTATCTG-1,Monocytes +CD8dep_AAGTCTGCATTCACTT-1,Macrophages +CD8dep_AAGTCTGGTATAATGG-1,Macrophages +CD8dep_AAGTCTGGTATTCGTG-1,Monocytes +CD8dep_AAGTCTGGTCCGTGAC-1,Monocytes +CD8dep_AAGTCTGTCTGAGGGA-1,Macrophages +CD8dep_AATCCAGAGAACTGTA-1,Monocytes +CD8dep_AATCCAGAGATGAGAG-1,Granulocytes +CD8dep_AATCCAGAGGCAAAGA-1,Granulocytes +CD8dep_AATCCAGGTCTGGAGA-1,Dendritic cells +CD8dep_AATCCAGGTGGGTCAA-1,Monocytes +CD8dep_AATCCAGGTTCCACAA-1,Monocytes +CD8dep_AATCCAGTCCCAGGTG-1,Monocytes +CD8dep_AATCGGTAGAACTCGG-1,Monocytes +CD8dep_AATCGGTAGACGCACA-1,Monocytes +CD8dep_AATCGGTAGAGTGACC-1,Monocytes +CD8dep_AATCGGTAGGCCCTCA-1,Monocytes +CD8dep_AATCGGTAGGTTCCTA-1,Dendritic cells +CD8dep_AATCGGTGTAAGTGGC-1,Monocytes +CD8dep_AATCGGTGTGCATCTA-1,Dendritic cells +CD8dep_AATCGGTGTGCGGTAA-1,Monocytes +CD8dep_AATCGGTTCAACCAAC-1,Monocytes +CD8dep_AATCGGTTCGCTGATA-1,Monocytes +CD8dep_AATCGGTTCTCGAGTA-1,Monocytes +CD8dep_ACACCAAAGAAGGTGA-1,Monocytes +CD8dep_ACACCAAAGCACACAG-1,Monocytes +CD8dep_ACACCAAAGCGTGTCC-1,Monocytes +CD8dep_ACACCAAAGTTTAGGA-1,Monocytes +CD8dep_ACACCAATCAACGAAA-1,Monocytes +CD8dep_ACACCAATCAGGCAAG-1,Granulocytes +CD8dep_ACACCAATCAGTTGAC-1,Monocytes +CD8dep_ACACCAATCCTTCAAT-1,Monocytes +CD8dep_ACACCAATCTCTGAGA-1,Monocytes +CD8dep_ACACCCTAGACTAAGT-1,Monocytes +CD8dep_ACACCCTAGCCAGTAG-1,Monocytes +CD8dep_ACACCCTAGGACAGAA-1,Monocytes +CD8dep_ACACCCTAGGTGCAAC-1,Monocytes +CD8dep_ACACCCTCATGACATC-1,Monocytes +CD8dep_ACACCCTGTAATCGTC-1,Macrophages +CD8dep_ACACCCTGTCTACCTC-1,Monocytes +CD8dep_ACACCCTGTTGAGGTG-1,Monocytes +CD8dep_ACACCCTTCTAACCGA-1,Monocytes +CD8dep_ACACCGGAGCTACCGC-1,Monocytes +CD8dep_ACACCGGAGGTAGCTG-1,Monocytes +CD8dep_ACACCGGGTCTCATCC-1,Monocytes +CD8dep_ACACCGGGTGCCTTGG-1,Monocytes +CD8dep_ACACCGGGTGGTGTAG-1,Monocytes +CD8dep_ACACCGGTCAGCGACC-1,Monocytes +CD8dep_ACACCGGTCGCGATCG-1,Macrophages +CD8dep_ACACCGGTCGCGGATC-1,Monocytes +CD8dep_ACACTGAAGAGCCCAA-1,Monocytes +CD8dep_ACACTGAAGCTAGCCC-1,Monocytes +CD8dep_ACACTGAAGTCTCAAC-1,Monocytes +CD8dep_ACACTGAAGTGTTGAA-1,Monocytes +CD8dep_ACACTGACAGGAATGC-1,Monocytes +CD8dep_ACACTGAGTACAGCAG-1,Monocytes +CD8dep_ACACTGAGTAGCGTGA-1,Monocytes +CD8dep_ACACTGATCGCCAGCA-1,Monocytes +CD8dep_ACACTGATCGGATGTT-1,Monocytes +CD8dep_ACAGCCGAGGAGCGTT-1,Monocytes +CD8dep_ACAGCCGAGTTCGATC-1,Monocytes +CD8dep_ACAGCCGCAACACCTA-1,Monocytes +CD8dep_ACAGCCGGTAGCGCTC-1,Macrophages +CD8dep_ACAGCCGGTCCGCTGA-1,Dendritic cells +CD8dep_ACAGCCGGTGGTTTCA-1,Dendritic cells +CD8dep_ACAGCCGGTTTGCATG-1,Macrophages +CD8dep_ACAGCCGTCGCCCTTA-1,Monocytes +CD8dep_ACAGCCGTCTTGACGA-1,Monocytes +CD8dep_ACAGCTACACCAGCAC-1,Granulocytes +CD8dep_ACAGCTACAGCATGAG-1,Dendritic cells +CD8dep_ACAGCTACAGTAAGAT-1,Monocytes +CD8dep_ACAGCTAGTAGGACAC-1,Monocytes +CD8dep_ACAGCTAGTCCGAACC-1,Monocytes +CD8dep_ACAGCTATCCAGATCA-1,Monocytes +CD8dep_ACAGCTATCGCATGGC-1,Monocytes +CD8dep_ACAGCTATCGGCGCAT-1,Monocytes +CD8dep_ACAGCTATCTCTTGAT-1,Monocytes +CD8dep_ACATACGAGAAAGTGG-1,Granulocytes +CD8dep_ACATACGAGCTCTCGG-1,Monocytes +CD8dep_ACATACGAGTGGCACA-1,Monocytes +CD8dep_ACATACGCACCCATGG-1,Monocytes +CD8dep_ACATACGCATCCAACA-1,Monocytes +CD8dep_ACATACGGTACTTGAC-1,Monocytes +CD8dep_ACATACGGTCCGAGTC-1,Granulocytes +CD8dep_ACATACGTCCAGAGGA-1,Monocytes +CD8dep_ACATACGTCCGCAAGC-1,Macrophages +CD8dep_ACATCAGAGCTCAACT-1,Macrophages +CD8dep_ACATCAGAGGAACTGC-1,Monocytes +CD8dep_ACATCAGAGTATCTCG-1,Monocytes +CD8dep_ACATCAGGTATAGGTA-1,Monocytes +CD8dep_ACATCAGGTTATCGGT-1,Monocytes +CD8dep_ACATCAGGTTCTGTTT-1,Monocytes +CD8dep_ACATCAGGTTGCGCAC-1,Dendritic cells +CD8dep_ACATCAGTCAACGAAA-1,Monocytes +CD8dep_ACATCAGTCCGTCAAA-1,Monocytes +CD8dep_ACATGGTAGCGCCTTG-1,Monocytes +CD8dep_ACATGGTAGTACGTTC-1,Monocytes +CD8dep_ACATGGTAGTGTTAGA-1,Monocytes +CD8dep_ACATGGTCACAGTCGC-1,Granulocytes +CD8dep_ACATGGTCATCGACGC-1,Monocytes +CD8dep_ACATGGTCATGGGACA-1,Monocytes +CD8dep_ACATGGTGTACCCAAT-1,Monocytes +CD8dep_ACATGGTGTACCGCTG-1,Monocytes +CD8dep_ACATGGTGTGAGTATA-1,Monocytes +CD8dep_ACATGGTTCACTTACT-1,Monocytes +CD8dep_ACCAGTAAGATGCGAC-1,Dendritic cells +CD8dep_ACCAGTAAGGCATTGG-1,Monocytes +CD8dep_ACCAGTAAGTGGTAAT-1,Macrophages +CD8dep_ACCAGTACAAGGTGTG-1,Granulocytes +CD8dep_ACCAGTAGTACCAGTT-1,Monocytes +CD8dep_ACCAGTAGTCGGCACT-1,Monocytes +CD8dep_ACCAGTAGTTTGGGCC-1,Monocytes +CD8dep_ACCAGTATCAGTTGAC-1,Monocytes +CD8dep_ACCCACTAGATGGGTC-1,Monocytes +CD8dep_ACCCACTAGCCAACAG-1,Monocytes +CD8dep_ACCCACTCATTAGCCA-1,Monocytes +CD8dep_ACCCACTGTGCGCTTG-1,Monocytes +CD8dep_ACCCACTGTGTTCGAT-1,Monocytes +CD8dep_ACCGTAAAGACCTTTG-1,Monocytes +CD8dep_ACCGTAAAGATACACA-1,Monocytes +CD8dep_ACCGTAAAGGTGTTAA-1,Macrophages +CD8dep_ACCGTAAAGTCGATAA-1,Monocytes +CD8dep_ACCGTAACAATCGAAA-1,Monocytes +CD8dep_ACCGTAACAGACGTAG-1,Dendritic cells +CD8dep_ACCGTAACAGGATCGA-1,Monocytes +CD8dep_ACCGTAAGTAGCTAAA-1,Monocytes +CD8dep_ACCGTAAGTCACCTAA-1,Monocytes +CD8dep_ACCGTAAGTCCGACGT-1,Monocytes +CD8dep_ACCGTAAGTTACGTCA-1,Monocytes +CD8dep_ACCGTAATCAGTTTGG-1,Monocytes +CD8dep_ACCGTAATCCACTCCA-1,Monocytes +CD8dep_ACCGTAATCTGACCTC-1,Monocytes +CD8dep_ACCGTAATCTTGCATT-1,Monocytes +CD8dep_ACCTTTAAGCCCGAAA-1,Monocytes +CD8dep_ACCTTTAAGCGTGAAC-1,Monocytes +CD8dep_ACCTTTACAACGATCT-1,Dendritic cells +CD8dep_ACCTTTACACAAGTAA-1,Macrophages +CD8dep_ACCTTTACACATCCAA-1,Monocytes +CD8dep_ACCTTTACACCAGATT-1,Monocytes +CD8dep_ACCTTTAGTAACGTTC-1,Monocytes +CD8dep_ACCTTTAGTACGCACC-1,Monocytes +CD8dep_ACCTTTAGTAGCTCCG-1,Dendritic cells +CD8dep_ACCTTTAGTATAGGTA-1,Dendritic cells +CD8dep_ACCTTTAGTCTTCGTC-1,Monocytes +CD8dep_ACCTTTAGTCTTGATG-1,Granulocytes +CD8dep_ACGAGCCAGAGAACAG-1,Monocytes +CD8dep_ACGAGCCAGGCAAAGA-1,Granulocytes +CD8dep_ACGAGCCAGGGTGTTG-1,Dendritic cells +CD8dep_ACGAGCCGTAGAAGGA-1,Monocytes +CD8dep_ACGAGCCGTATAAACG-1,Monocytes +CD8dep_ACGAGGAAGTGAACAT-1,Monocytes +CD8dep_ACGAGGAAGTGGGATC-1,Monocytes +CD8dep_ACGAGGAAGTTACCCA-1,Monocytes +CD8dep_ACGAGGACAAGGTTTC-1,Monocytes +CD8dep_ACGAGGACAGATGAGC-1,Monocytes +CD8dep_ACGAGGACAGCCAATT-1,Dendritic cells +CD8dep_ACGAGGAGTATTCTCT-1,Monocytes +CD8dep_ACGAGGAGTGTGAAAT-1,Monocytes +CD8dep_ACGAGGAGTTGACGTT-1,Monocytes +CD8dep_ACGAGGAGTTTAGGAA-1,Monocytes +CD8dep_ACGATACAGCAGCGTA-1,Dendritic cells +CD8dep_ACGATACAGCGTGAGT-1,Monocytes +CD8dep_ACGATACAGGAGCGAG-1,Dendritic cells +CD8dep_ACGATACCAAAGGCGT-1,Monocytes +CD8dep_ACGATACCACGAGGTA-1,Monocytes +CD8dep_ACGATACCAGCGTAAG-1,Macrophages +CD8dep_ACGATACGTAGTAGTA-1,Monocytes +CD8dep_ACGATACGTGACCAAG-1,Monocytes +CD8dep_ACGATACGTGCAGACA-1,Monocytes +CD8dep_ACGATACTCACGAAGG-1,Monocytes +CD8dep_ACGATACTCCAGATCA-1,Monocytes +CD8dep_ACGATACTCCTATGTT-1,Monocytes +CD8dep_ACGATACTCGAATGCT-1,Monocytes +CD8dep_ACGATACTCGCGATCG-1,Monocytes +CD8dep_ACGATACTCGGCTACG-1,Macrophages +CD8dep_ACGATGTAGAAGGTTT-1,Monocytes +CD8dep_ACGATGTAGAGACGAA-1,Monocytes +CD8dep_ACGATGTAGTGTTTGC-1,Monocytes +CD8dep_ACGATGTGTAAAGTCA-1,Monocytes +CD8dep_ACGATGTGTGGAAAGA-1,Monocytes +CD8dep_ACGATGTTCAGAGCTT-1,Dendritic cells +CD8dep_ACGCAGCAGACGCACA-1,Monocytes +CD8dep_ACGCAGCAGCCAACAG-1,Monocytes +CD8dep_ACGCAGCAGCTAAACA-1,Monocytes +CD8dep_ACGCAGCAGTCTTGCA-1,Monocytes +CD8dep_ACGCAGCCAAGTTGTC-1,Dendritic cells +CD8dep_ACGCAGCCAGCTCGCA-1,Monocytes +CD8dep_ACGCAGCGTCTAGCCG-1,Dendritic cells +CD8dep_ACGCAGCGTTATTCTC-1,Monocytes +CD8dep_ACGCAGCGTTTGTTGG-1,Macrophages +CD8dep_ACGCAGCTCACCACCT-1,Monocytes +CD8dep_ACGCAGCTCAGCCTAA-1,Macrophages +CD8dep_ACGCAGCTCCCAACGG-1,Monocytes +CD8dep_ACGCAGCTCGAGCCCA-1,Monocytes +CD8dep_ACGCCAGAGTAAGTAC-1,Monocytes +CD8dep_ACGCCAGAGTGCCATT-1,Monocytes +CD8dep_ACGCCAGCACACGCTG-1,Monocytes +CD8dep_ACGCCAGCACCACGTG-1,Macrophages +CD8dep_ACGCCAGTCTATCCTA-1,Monocytes +CD8dep_ACGCCAGTCTCTGTCG-1,Monocytes +CD8dep_ACGCCGAAGTCGTACT-1,Monocytes +CD8dep_ACGCCGAAGTGTTGAA-1,Monocytes +CD8dep_ACGCCGACAACACGCC-1,Monocytes +CD8dep_ACGCCGACAAGAGTCG-1,Monocytes +CD8dep_ACGCCGACACCAGGTC-1,Macrophages +CD8dep_ACGCCGAGTATCGCAT-1,Monocytes +CD8dep_ACGCCGAGTCGTCTTC-1,Macrophages +CD8dep_ACGCCGATCAAGAAGT-1,Dendritic cells +CD8dep_ACGCCGATCCGCATAA-1,Dendritic cells +CD8dep_ACGCCGATCCTATGTT-1,Monocytes +CD8dep_ACGCCGATCTCTTATG-1,Monocytes +CD8dep_ACGCCGATCTGTCTCG-1,Monocytes +CD8dep_ACGGAGACAATCCGAT-1,Monocytes +CD8dep_ACGGAGACACCAACCG-1,Monocytes +CD8dep_ACGGAGACATCGATGT-1,Monocytes +CD8dep_ACGGAGACATCTCCCA-1,Monocytes +CD8dep_ACGGAGACATTCCTGC-1,Monocytes +CD8dep_ACGGAGAGTATATCCG-1,Monocytes +CD8dep_ACGGAGATCTAACTCT-1,Monocytes +CD8dep_ACGGCCACAACGATCT-1,Monocytes +CD8dep_ACGGCCACAGGATCGA-1,Monocytes +CD8dep_ACGGCCACATGTTCCC-1,Granulocytes +CD8dep_ACGGCCAGTAGAAAGG-1,Monocytes +CD8dep_ACGGCCAGTCATATGC-1,Macrophages +CD8dep_ACGGCCAGTCCTAGCG-1,Monocytes +CD8dep_ACGGCCAGTCTAGGTT-1,Monocytes +CD8dep_ACGGCCAGTGACGGTA-1,Monocytes +CD8dep_ACGGCCAGTGTCAATC-1,Monocytes +CD8dep_ACGGCCAGTGTGTGCC-1,Monocytes +CD8dep_ACGGCCATCAGTTGAC-1,Dendritic cells +CD8dep_ACGGCCATCCGGCACA-1,Monocytes +CD8dep_ACGGCCATCGAACGGA-1,Monocytes +CD8dep_ACGGGCTAGAAACCGC-1,Monocytes +CD8dep_ACGGGCTCATATACCG-1,Monocytes +CD8dep_ACGGGCTCATGCTAGT-1,Monocytes +CD8dep_ACGGGCTCATGGTCAT-1,Monocytes +CD8dep_ACGGGCTGTTATTCTC-1,Monocytes +CD8dep_ACGGGTCAGTTACGGG-1,Monocytes +CD8dep_ACGGGTCCAATAGCAA-1,Monocytes +CD8dep_ACGGGTCCATGTAGTC-1,Monocytes +CD8dep_ACGGGTCCATTGTGCA-1,Monocytes +CD8dep_ACGGGTCGTCTAGTCA-1,Monocytes +CD8dep_ACGGGTCGTGAGGGTT-1,Monocytes +CD8dep_ACGGGTCGTGTTGAGG-1,Monocytes +CD8dep_ACGGGTCGTTTGGCGC-1,Monocytes +CD8dep_ACGGGTCTCCCTCAGT-1,Monocytes +CD8dep_ACGGGTCTCGTTACGA-1,Monocytes +CD8dep_ACGTCAAAGACGACGT-1,Monocytes +CD8dep_ACGTCAACAAGTTGTC-1,Monocytes +CD8dep_ACGTCAACAGCGTTCG-1,Monocytes +CD8dep_ACGTCAACAGGACCCT-1,Dendritic cells +CD8dep_ACGTCAACATCTACGA-1,Monocytes +CD8dep_ACGTCAACATTTCAGG-1,Monocytes +CD8dep_ACGTCAAGTAGCTTGT-1,Monocytes +CD8dep_ACGTCAAGTATGCTTG-1,Macrophages +CD8dep_ACGTCAAGTGCACGAA-1,Granulocytes +CD8dep_ACGTCAAGTGGTTTCA-1,Dendritic cells +CD8dep_ACGTCAAGTTGACGTT-1,Monocytes +CD8dep_ACGTCAATCAGAAATG-1,Monocytes +CD8dep_ACGTCAATCATCGGAT-1,Monocytes +CD8dep_ACGTCAATCTAACCGA-1,Dendritic cells +CD8dep_ACTATCTCACTTACGA-1,Monocytes +CD8dep_ACTATCTCATGCAATC-1,Macrophages +CD8dep_ACTATCTCATGGGAAC-1,Monocytes +CD8dep_ACTATCTGTTACGCGC-1,Monocytes +CD8dep_ACTGAACAGGCAAAGA-1,Granulocytes +CD8dep_ACTGAACAGGCCCTTG-1,Granulocytes +CD8dep_ACTGAACCAGCTGCAC-1,Monocytes +CD8dep_ACTGAACGTAAGAGAG-1,Dendritic cells +CD8dep_ACTGAACGTACATGTC-1,Monocytes +CD8dep_ACTGAACGTCTTCGTC-1,Macrophages +CD8dep_ACTGAACTCAACACTG-1,Monocytes +CD8dep_ACTGAACTCGTTACAG-1,Macrophages +CD8dep_ACTGAGTAGAGTCGGT-1,Monocytes +CD8dep_ACTGAGTAGATCGGGT-1,Monocytes +CD8dep_ACTGAGTAGCGTTTAC-1,Monocytes +CD8dep_ACTGAGTCAACGATGG-1,Monocytes +CD8dep_ACTGAGTCAGATTGCT-1,Monocytes +CD8dep_ACTGAGTGTACGACCC-1,Monocytes +CD8dep_ACTGAGTGTCGGCTCA-1,Monocytes +CD8dep_ACTGAGTGTCTAGGTT-1,Monocytes +CD8dep_ACTGATGAGAGACGAA-1,Monocytes +CD8dep_ACTGATGAGAGGTTGC-1,Monocytes +CD8dep_ACTGATGAGATGCCTT-1,Monocytes +CD8dep_ACTGATGAGCAGGTCA-1,Monocytes +CD8dep_ACTGATGCATTGGCGC-1,Monocytes +CD8dep_ACTGATGGTTAGGGTG-1,Monocytes +CD8dep_ACTGATGGTTATCACG-1,Dendritic cells +CD8dep_ACTGATGTCAACACTG-1,Monocytes +CD8dep_ACTGATGTCAGTTAGC-1,Monocytes +CD8dep_ACTGATGTCGCTTAGA-1,Macrophages +CD8dep_ACTGATGTCTAGAGTC-1,Macrophages +CD8dep_ACTGCTCAGTTCGCGC-1,Monocytes +CD8dep_ACTGCTCCACCCATTC-1,Monocytes +CD8dep_ACTGCTCCAGGCTGAA-1,Monocytes +CD8dep_ACTGCTCGTGGCTCCA-1,Monocytes +CD8dep_ACTGCTCGTGGTCTCG-1,Dendritic cells +CD8dep_ACTGCTCGTTACCAGT-1,Monocytes +CD8dep_ACTGCTCTCTCCCTGA-1,Monocytes +CD8dep_ACTGTCCAGAACTCGG-1,Monocytes +CD8dep_ACTGTCCAGGCTCAGA-1,Monocytes +CD8dep_ACTGTCCGTACTTCTT-1,Monocytes +CD8dep_ACTGTCCGTCGCGGTT-1,Monocytes +CD8dep_ACTGTCCGTTACTGAC-1,Monocytes +CD8dep_ACTGTCCGTTCCAACA-1,Monocytes +CD8dep_ACTTACTAGTGCCATT-1,Monocytes +CD8dep_ACTTACTAGTGGCACA-1,Monocytes +CD8dep_ACTTACTCAGGGAGAG-1,Monocytes +CD8dep_ACTTACTCATGATCCA-1,Monocytes +CD8dep_ACTTACTCATGCGCAC-1,Monocytes +CD8dep_ACTTACTCATGGATGG-1,Granulocytes +CD8dep_ACTTACTCATTAGGCT-1,Monocytes +CD8dep_ACTTACTGTATTCGTG-1,Monocytes +CD8dep_ACTTACTGTCGCTTTC-1,Monocytes +CD8dep_ACTTACTTCTGTCTAT-1,Monocytes +CD8dep_ACTTGTTAGCTCCCAG-1,Monocytes +CD8dep_ACTTGTTAGGAGTCTG-1,Monocytes +CD8dep_ACTTGTTAGTGATCGG-1,Monocytes +CD8dep_ACTTGTTCACAAGCCC-1,Monocytes +CD8dep_ACTTGTTGTAGAGTGC-1,Monocytes +CD8dep_ACTTGTTGTCGACTAT-1,Monocytes +CD8dep_ACTTGTTGTCTGATCA-1,Monocytes +CD8dep_ACTTGTTGTGATGTCT-1,Monocytes +CD8dep_ACTTGTTGTGGTTTCA-1,Dendritic cells +CD8dep_ACTTGTTGTGTGTGCC-1,Dendritic cells +CD8dep_ACTTGTTTCGTCCGTT-1,Monocytes +CD8dep_ACTTTCAAGATCACGG-1,Macrophages +CD8dep_ACTTTCAAGGGATACC-1,Monocytes +CD8dep_ACTTTCAAGGTAGCTG-1,Monocytes +CD8dep_ACTTTCACAGTATAAG-1,Monocytes +CD8dep_ACTTTCAGTACAGCAG-1,Monocytes +CD8dep_ACTTTCAGTAGCACGA-1,Monocytes +CD8dep_ACTTTCATCAAGGTAA-1,Monocytes +CD8dep_ACTTTCATCACTGGGC-1,Dendritic cells +CD8dep_ACTTTCATCCACGCAG-1,Macrophages +CD8dep_ACTTTCATCCTAGAAC-1,Monocytes +CD8dep_ACTTTCATCCTGCCAT-1,Monocytes +CD8dep_ACTTTCATCGTCACGG-1,Dendritic cells +CD8dep_AGAATAGAGAGCTGGT-1,Granulocytes +CD8dep_AGAATAGAGCATCATC-1,Monocytes +CD8dep_AGAATAGCAGGTCGTC-1,Monocytes +CD8dep_AGAATAGGTTCACCTC-1,Macrophages +CD8dep_AGAATAGGTTTGTGTG-1,Macrophages +CD8dep_AGAATAGTCCACGTGG-1,Monocytes +CD8dep_AGACGTTAGCTGAACG-1,Monocytes +CD8dep_AGACGTTAGTAACCCT-1,Monocytes +CD8dep_AGACGTTGTCCGCTGA-1,Monocytes +CD8dep_AGACGTTGTGATGTGG-1,Granulocytes +CD8dep_AGACGTTGTGCACTTA-1,Macrophages +CD8dep_AGACGTTGTGTAACGG-1,Monocytes +CD8dep_AGACGTTTCGACGGAA-1,Monocytes +CD8dep_AGACGTTTCTGGAGCC-1,Macrophages +CD8dep_AGAGCGAAGATACACA-1,Monocytes +CD8dep_AGAGCGAAGATCCCAT-1,Monocytes +CD8dep_AGAGCGACAAGGTGTG-1,Macrophages +CD8dep_AGAGCGAGTACATGTC-1,Monocytes +CD8dep_AGAGCGAGTACGACCC-1,Monocytes +CD8dep_AGAGCGAGTAGCACGA-1,Monocytes +CD8dep_AGAGCGAGTCATACTG-1,Dendritic cells +CD8dep_AGAGCGAGTCGGGTCT-1,Dendritic cells +CD8dep_AGAGCGAGTCGTTGTA-1,Monocytes +CD8dep_AGAGCGAGTGAGGGAG-1,Dendritic cells +CD8dep_AGAGCGATCACAGGCC-1,Macrophages +CD8dep_AGAGCGATCTGCTTGC-1,Monocytes +CD8dep_AGAGCTTCACGGACAA-1,Monocytes +CD8dep_AGAGCTTGTAAACGCG-1,Monocytes +CD8dep_AGAGCTTGTAGAGGAA-1,Monocytes +CD8dep_AGAGCTTGTCCGTCAG-1,Monocytes +CD8dep_AGAGCTTGTGGTACAG-1,Monocytes +CD8dep_AGAGCTTTCAGCGATT-1,Monocytes +CD8dep_AGAGCTTTCCGCATAA-1,Monocytes +CD8dep_AGAGCTTTCGCCCTTA-1,Monocytes +CD8dep_AGAGTGGAGAAGGTTT-1,Monocytes +CD8dep_AGAGTGGAGCTACCTA-1,Monocytes +CD8dep_AGAGTGGGTAACGACG-1,Monocytes +CD8dep_AGAGTGGGTACCGGCT-1,Monocytes +CD8dep_AGAGTGGGTATATCCG-1,Dendritic cells +CD8dep_AGAGTGGGTATCGCAT-1,Monocytes +CD8dep_AGAGTGGGTCCATGAT-1,Dendritic cells +CD8dep_AGAGTGGTCACGACTA-1,Macrophages +CD8dep_AGAGTGGTCCGATATG-1,Dendritic cells +CD8dep_AGATCTGAGACAAGCC-1,Monocytes +CD8dep_AGATCTGAGTAATCCC-1,Monocytes +CD8dep_AGATCTGAGTTGTCGT-1,Monocytes +CD8dep_AGATCTGCAGCCTATA-1,Monocytes +CD8dep_AGATCTGGTAACGTTC-1,Monocytes +CD8dep_AGATCTGGTCATTAGC-1,Monocytes +CD8dep_AGATCTGGTTCGGGCT-1,Monocytes +CD8dep_AGATCTGTCCGTAGTA-1,Monocytes +CD8dep_AGATCTGTCGGAATCT-1,Monocytes +CD8dep_AGATTGCAGACTAGGC-1,Monocytes +CD8dep_AGATTGCCAACTTGAC-1,Macrophages +CD8dep_AGATTGCCAAGTAATG-1,Dendritic cells +CD8dep_AGATTGCCACTACAGT-1,Monocytes +CD8dep_AGATTGCGTAAATACG-1,Granulocytes +CD8dep_AGATTGCGTGACTACT-1,Macrophages +CD8dep_AGATTGCGTGGCGAAT-1,Granulocytes +CD8dep_AGATTGCGTGTGACCC-1,Monocytes +CD8dep_AGCAGCCAGCTAGTGG-1,Monocytes +CD8dep_AGCAGCCAGGACTGGT-1,Monocytes +CD8dep_AGCAGCCGTGGTGTAG-1,Monocytes +CD8dep_AGCAGCCGTTATCGGT-1,Monocytes +CD8dep_AGCAGCCGTTCGAATC-1,Monocytes +CD8dep_AGCAGCCTCTCTTATG-1,Monocytes +CD8dep_AGCAGCCTCTTGTCAT-1,Monocytes +CD8dep_AGCATACAGAGAGCTC-1,Monocytes +CD8dep_AGCATACAGCACACAG-1,Monocytes +CD8dep_AGCATACCACGTAAGG-1,Monocytes +CD8dep_AGCATACCAGTCAGCC-1,Dendritic cells +CD8dep_AGCATACGTACTTCTT-1,Monocytes +CD8dep_AGCATACGTCGGGTCT-1,Monocytes +CD8dep_AGCATACGTGGTCCGT-1,Monocytes +CD8dep_AGCATACTCAAGATCC-1,Monocytes +CD8dep_AGCATACTCACATGCA-1,Monocytes +CD8dep_AGCATACTCGGTCTAA-1,Monocytes +CD8dep_AGCCTAAAGGACTGGT-1,Monocytes +CD8dep_AGCCTAAAGTTCGCGC-1,Dendritic cells +CD8dep_AGCCTAAGTAAATGAC-1,Monocytes +CD8dep_AGCCTAAGTCTTTCAT-1,Monocytes +CD8dep_AGCCTAATCCGTTGCT-1,Monocytes +CD8dep_AGCCTAATCGCTGATA-1,Monocytes +CD8dep_AGCCTAATCTCACATT-1,Granulocytes +CD8dep_AGCGGTCAGCCATCGC-1,Monocytes +CD8dep_AGCGGTCAGCCGCCTA-1,Monocytes +CD8dep_AGCGGTCAGGCGATAC-1,Monocytes +CD8dep_AGCGGTCAGGTGATTA-1,Monocytes +CD8dep_AGCGGTCCAAGTTGTC-1,Monocytes +CD8dep_AGCGGTCCAGCTTCGG-1,Monocytes +CD8dep_AGCGGTCCAGTAACGG-1,Monocytes +CD8dep_AGCGGTCCATCGGAAG-1,Monocytes +CD8dep_AGCGGTCCATGGGAAC-1,Monocytes +CD8dep_AGCGGTCGTACCGCTG-1,Monocytes +CD8dep_AGCGGTCGTCCAGTAT-1,Dendritic cells +CD8dep_AGCGGTCTCGGCCGAT-1,Monocytes +CD8dep_AGCGTATAGACTAAGT-1,Monocytes +CD8dep_AGCGTATAGATGTTAG-1,Monocytes +CD8dep_AGCGTATAGGATGGTC-1,Macrophages +CD8dep_AGCGTATAGTCCGGTC-1,Monocytes +CD8dep_AGCGTATAGTGTCTCA-1,Monocytes +CD8dep_AGCGTATGTAAATGAC-1,Dendritic cells +CD8dep_AGCGTATGTCATTAGC-1,Monocytes +CD8dep_AGCGTATGTGGCTCCA-1,Monocytes +CD8dep_AGCGTATGTTCGAATC-1,Monocytes +CD8dep_AGCGTATTCAACGAAA-1,Monocytes +CD8dep_AGCGTATTCACGATGT-1,Dendritic cells +CD8dep_AGCGTATTCATAAAGG-1,Granulocytes +CD8dep_AGCGTATTCATACGGT-1,Granulocytes +CD8dep_AGCGTATTCCCAAGAT-1,Monocytes +CD8dep_AGCGTATTCGTCTGCT-1,Monocytes +CD8dep_AGCGTATTCTTGAGGT-1,Monocytes +CD8dep_AGCGTCGAGCCAGAAC-1,Monocytes +CD8dep_AGCGTCGCAGTGGGAT-1,Monocytes +CD8dep_AGCGTCGGTCATCCCT-1,Monocytes +CD8dep_AGCGTCGTCCACGCAG-1,Monocytes +CD8dep_AGCTCCTAGATCCCGC-1,Macrophages +CD8dep_AGCTCCTGTGAGCGAT-1,Monocytes +CD8dep_AGCTCCTGTGATGTGG-1,Granulocytes +CD8dep_AGCTCCTTCCAAAGTC-1,Granulocytes +CD8dep_AGCTCCTTCTGCCCTA-1,Macrophages +CD8dep_AGCTCTCAGACTTGAA-1,Granulocytes +CD8dep_AGCTCTCAGAGACTAT-1,Dendritic cells +CD8dep_AGCTCTCCAATAACGA-1,Macrophages +CD8dep_AGCTCTCCAGCCAATT-1,Monocytes +CD8dep_AGCTCTCCATTTCAGG-1,Monocytes +CD8dep_AGCTCTCGTCATGCAT-1,Monocytes +CD8dep_AGCTCTCGTCTCAACA-1,Monocytes +CD8dep_AGCTCTCTCATCACCC-1,Dendritic cells +CD8dep_AGCTCTCTCCTAGGGC-1,Monocytes +CD8dep_AGCTCTCTCGGAAATA-1,Monocytes +CD8dep_AGCTCTCTCTCTGAGA-1,Monocytes +CD8dep_AGCTCTCTCTTGCAAG-1,Monocytes +CD8dep_AGCTTGAAGCTCTCGG-1,Macrophages +CD8dep_AGCTTGAAGGCAAAGA-1,Monocytes +CD8dep_AGCTTGACAAAGAATC-1,Monocytes +CD8dep_AGCTTGACAGACACTT-1,Dendritic cells +CD8dep_AGCTTGAGTCGTCTTC-1,Monocytes +CD8dep_AGCTTGATCTGTCCGT-1,Monocytes +CD8dep_AGGCCACAGCGTTTAC-1,Monocytes +CD8dep_AGGCCACCAACGATGG-1,Monocytes +CD8dep_AGGCCACCACGAGAGT-1,Monocytes +CD8dep_AGGCCACCAGTATAAG-1,Monocytes +CD8dep_AGGCCACGTATCGCAT-1,Monocytes +CD8dep_AGGCCACGTCTGATCA-1,Monocytes +CD8dep_AGGCCACGTGTAACGG-1,Monocytes +CD8dep_AGGCCACTCCCAAGAT-1,Monocytes +CD8dep_AGGCCACTCTGCCAGG-1,Monocytes +CD8dep_AGGCCACTCTGGCGAC-1,Monocytes +CD8dep_AGGCCGTAGAAACGAG-1,Monocytes +CD8dep_AGGCCGTAGGCAGGTT-1,Monocytes +CD8dep_AGGCCGTAGGCTCATT-1,Monocytes +CD8dep_AGGCCGTCATAACCTG-1,Monocytes +CD8dep_AGGCCGTGTACATGTC-1,Dendritic cells +CD8dep_AGGCCGTGTACCGTTA-1,Monocytes +CD8dep_AGGCCGTGTATAGTAG-1,Monocytes +CD8dep_AGGCCGTGTCCAAGTT-1,Monocytes +CD8dep_AGGCCGTGTCTCCCTA-1,Monocytes +CD8dep_AGGCCGTGTCTGCGGT-1,Monocytes +CD8dep_AGGGAGTAGAGCCCAA-1,Monocytes +CD8dep_AGGGAGTAGGCGACAT-1,Monocytes +CD8dep_AGGGAGTAGTGTCCAT-1,Monocytes +CD8dep_AGGGAGTCAACTGGCC-1,Monocytes +CD8dep_AGGGAGTGTGTCCTCT-1,Monocytes +CD8dep_AGGGAGTTCAAGGTAA-1,Monocytes +CD8dep_AGGGAGTTCATCGATG-1,Monocytes +CD8dep_AGGGAGTTCCCATTAT-1,Monocytes +CD8dep_AGGGAGTTCTATGTGG-1,Monocytes +CD8dep_AGGGATGAGCTGATAA-1,Dendritic cells +CD8dep_AGGGATGCACAAGCCC-1,Dendritic cells +CD8dep_AGGGATGCAGACGCCT-1,Macrophages +CD8dep_AGGGATGGTCTAGTGT-1,Monocytes +CD8dep_AGGGATGTCCATGAAC-1,Monocytes +CD8dep_AGGGATGTCCGTACAA-1,Monocytes +CD8dep_AGGGATGTCCGTCAAA-1,Monocytes +CD8dep_AGGGATGTCGGAGCAA-1,Monocytes +CD8dep_AGGGTGAAGCAGATCG-1,Monocytes +CD8dep_AGGGTGAAGCCACCTG-1,T cells +CD8dep_AGGGTGAAGCTAAACA-1,Monocytes +CD8dep_AGGGTGACAAGGTTTC-1,Monocytes +CD8dep_AGGGTGACAGGACCCT-1,Monocytes +CD8dep_AGGGTGACAGGGAGAG-1,Dendritic cells +CD8dep_AGGGTGAGTCAGAGGT-1,Monocytes +CD8dep_AGGGTGAGTTAAGTAG-1,Monocytes +CD8dep_AGGGTGATCACCCTCA-1,Monocytes +CD8dep_AGGTCATAGCTAACAA-1,Monocytes +CD8dep_AGGTCATAGCTAGCCC-1,Monocytes +CD8dep_AGGTCATAGGCTCTTA-1,Monocytes +CD8dep_AGGTCATCAAACGTGG-1,Macrophages +CD8dep_AGGTCATCAAGTCTGT-1,Macrophages +CD8dep_AGGTCATCACCACCAG-1,Macrophages +CD8dep_AGGTCATCATGCTAGT-1,Dendritic cells +CD8dep_AGGTCATGTAACGCGA-1,Monocytes +CD8dep_AGGTCATGTACCGTTA-1,Monocytes +CD8dep_AGGTCATGTAGTACCT-1,Monocytes +CD8dep_AGGTCATGTCCTAGCG-1,Monocytes +CD8dep_AGGTCATGTCGGGTCT-1,Granulocytes +CD8dep_AGGTCATGTTTGTTGG-1,Dendritic cells +CD8dep_AGGTCATTCACGCATA-1,Monocytes +CD8dep_AGGTCATTCCTCAATT-1,Monocytes +CD8dep_AGGTCATTCGCTAGCG-1,Monocytes +CD8dep_AGGTCATTCGGCTTGG-1,Dendritic cells +CD8dep_AGGTCATTCTCAACTT-1,Monocytes +CD8dep_AGGTCATTCTGCGACG-1,Monocytes +CD8dep_AGGTCCGAGAAGGGTA-1,Monocytes +CD8dep_AGGTCCGAGCGGATCA-1,Monocytes +CD8dep_AGGTCCGAGTACCGGA-1,Monocytes +CD8dep_AGGTCCGAGTGTTAGA-1,Monocytes +CD8dep_AGGTCCGCACCTTGTC-1,Monocytes +CD8dep_AGGTCCGCAGCCAATT-1,Macrophages +CD8dep_AGGTCCGGTAAAGGAG-1,Monocytes +CD8dep_AGGTCCGGTAGCGCTC-1,Monocytes +CD8dep_AGGTCCGGTCAAGCGA-1,Dendritic cells +CD8dep_AGGTCCGGTGTATGGG-1,Monocytes +CD8dep_AGGTCCGGTTACGGAG-1,Monocytes +CD8dep_AGGTCCGTCAGCCTAA-1,Monocytes +CD8dep_AGGTCCGTCTGCGGCA-1,Monocytes +CD8dep_AGTAGTCAGAGACGAA-1,Monocytes +CD8dep_AGTAGTCAGCCGGTAA-1,Monocytes +CD8dep_AGTAGTCAGTGAAGTT-1,Monocytes +CD8dep_AGTAGTCCAGGTGCCT-1,Monocytes +CD8dep_AGTAGTCCATGCAATC-1,Monocytes +CD8dep_AGTAGTCGTAGCTAAA-1,Monocytes +CD8dep_AGTAGTCGTCAGGACA-1,Monocytes +CD8dep_AGTCTTTAGGGAGTAA-1,Monocytes +CD8dep_AGTCTTTAGGGTCGAT-1,Monocytes +CD8dep_AGTCTTTCAAGCGTAG-1,Monocytes +CD8dep_AGTCTTTCATACGCCG-1,Monocytes +CD8dep_AGTCTTTGTCAAAGAT-1,Monocytes +CD8dep_AGTCTTTGTCAAGCGA-1,Monocytes +CD8dep_AGTCTTTGTCCAGTGC-1,Dendritic cells +CD8dep_AGTCTTTGTCTGATCA-1,Monocytes +CD8dep_AGTCTTTGTCTTGTCC-1,Monocytes +CD8dep_AGTCTTTGTGGTAACG-1,Monocytes +CD8dep_AGTCTTTGTTCGTTGA-1,Monocytes +CD8dep_AGTCTTTTCGCCAAAT-1,Monocytes +CD8dep_AGTGAGGAGCTTCGCG-1,Monocytes +CD8dep_AGTGAGGAGTGGTAAT-1,Monocytes +CD8dep_AGTGAGGCAAAGGCGT-1,Monocytes +CD8dep_AGTGAGGCAATAACGA-1,Granulocytes +CD8dep_AGTGAGGGTAGAAGGA-1,Monocytes +CD8dep_AGTGAGGTCATGCTCC-1,Monocytes +CD8dep_AGTGAGGTCCTATGTT-1,Macrophages +CD8dep_AGTGAGGTCTATCCTA-1,Monocytes +CD8dep_AGTGGGAAGATGGCGT-1,Monocytes +CD8dep_AGTGGGAAGCACCGCT-1,Monocytes +CD8dep_AGTGGGAAGTTATCGC-1,Dendritic cells +CD8dep_AGTGGGACACTATCTT-1,Monocytes +CD8dep_AGTGGGACAGGAATGC-1,Monocytes +CD8dep_AGTGGGACAGGCAGTA-1,Monocytes +CD8dep_AGTGGGACAGTAAGCG-1,Monocytes +CD8dep_AGTGGGAGTCTAGTGT-1,Monocytes +CD8dep_AGTGGGAGTTGGGACA-1,Monocytes +CD8dep_AGTGTCAAGCGATCCC-1,Dendritic cells +CD8dep_AGTGTCAAGTCTCAAC-1,Monocytes +CD8dep_AGTGTCACAGCCAATT-1,Granulocytes +CD8dep_AGTGTCACATGTTGAC-1,Monocytes +CD8dep_AGTGTCAGTGTTCTTT-1,Monocytes +CD8dep_AGTGTCATCCTGTAGA-1,Dendritic cells +CD8dep_AGTGTCATCGCACTCT-1,Dendritic cells +CD8dep_AGTTGGTAGAAGATTC-1,Dendritic cells +CD8dep_AGTTGGTAGGGTGTGT-1,Dendritic cells +CD8dep_AGTTGGTGTCCATGAT-1,Macrophages +CD8dep_AGTTGGTGTGAAATCA-1,Monocytes +CD8dep_AGTTGGTGTGGTCTCG-1,Monocytes +CD8dep_AGTTGGTTCAGTTGAC-1,Dendritic cells +CD8dep_AGTTGGTTCCCAGGTG-1,Monocytes +CD8dep_AGTTGGTTCGGAAACG-1,Dendritic cells +CD8dep_AGTTGGTTCTAGCACA-1,Monocytes +CD8dep_AGTTGGTTCTGCGTAA-1,Monocytes +CD8dep_ATAACGCGTCAGAATA-1,Monocytes +CD8dep_ATAACGCTCACCTTAT-1,Monocytes +CD8dep_ATAACGCTCATGCAAC-1,Monocytes +CD8dep_ATAACGCTCTCCAGGG-1,Monocytes +CD8dep_ATAAGAGAGATGAGAG-1,Monocytes +CD8dep_ATAAGAGAGCGGCTTC-1,Monocytes +CD8dep_ATAAGAGCAAGTACCT-1,Monocytes +CD8dep_ATAAGAGCACTCGACG-1,Monocytes +CD8dep_ATAAGAGCATGGGACA-1,Monocytes +CD8dep_ATAAGAGGTACGCTGC-1,Monocytes +CD8dep_ATAAGAGGTTTGGCGC-1,Monocytes +CD8dep_ATAAGAGTCCAGGGCT-1,Monocytes +CD8dep_ATAAGAGTCGCCAAAT-1,Monocytes +CD8dep_ATAAGAGTCTCGGACG-1,Monocytes +CD8dep_ATAGACCAGAATGTTG-1,Monocytes +CD8dep_ATAGACCAGATAGTCA-1,Monocytes +CD8dep_ATAGACCAGGACTGGT-1,Monocytes +CD8dep_ATAGACCAGGATGTAT-1,Macrophages +CD8dep_ATAGACCAGGCTCATT-1,Monocytes +CD8dep_ATAGACCCAAGTACCT-1,Monocytes +CD8dep_ATAGACCGTCTCTTTA-1,Monocytes +CD8dep_ATAGACCGTTTAGCTG-1,Monocytes +CD8dep_ATAGACCTCACTTCAT-1,Monocytes +CD8dep_ATAGACCTCCAGATCA-1,Monocytes +CD8dep_ATAGACCTCCCATTTA-1,Monocytes +CD8dep_ATAGACCTCGTGGACC-1,Monocytes +CD8dep_ATAGACCTCTGGTTCC-1,Monocytes +CD8dep_ATAGACCTCTTGCATT-1,Monocytes +CD8dep_ATCACGAAGACCCACC-1,Granulocytes +CD8dep_ATCACGACAATCGAAA-1,Monocytes +CD8dep_ATCACGACAGCCAGAA-1,Monocytes +CD8dep_ATCACGACATGTAAGA-1,Granulocytes +CD8dep_ATCACGATCAACACAC-1,Monocytes +CD8dep_ATCACGATCCATGAGT-1,Monocytes +CD8dep_ATCACGATCGGACAAG-1,Monocytes +CD8dep_ATCACGATCTATCGCC-1,Monocytes +CD8dep_ATCACGATCTCGCTTG-1,Monocytes +CD8dep_ATCACGATCTGTCAAG-1,Monocytes +CD8dep_ATCATCTCATGTCGAT-1,Monocytes +CD8dep_ATCATGGAGTTGAGAT-1,Monocytes +CD8dep_ATCATGGCAAGCCGTC-1,Monocytes +CD8dep_ATCATGGCATGTAAGA-1,Monocytes +CD8dep_ATCATGGGTCAAAGAT-1,Monocytes +CD8dep_ATCATGGGTTGGTAAA-1,Monocytes +CD8dep_ATCATGGTCACAGTAC-1,Monocytes +CD8dep_ATCATGGTCTTGCAAG-1,Monocytes +CD8dep_ATCCACCAGACTAAGT-1,Monocytes +CD8dep_ATCCACCAGTACGCCC-1,Monocytes +CD8dep_ATCCACCAGTTGCAGG-1,Monocytes +CD8dep_ATCCACCCACATCCGG-1,Monocytes +CD8dep_ATCCACCGTCTTGATG-1,Monocytes +CD8dep_ATCCGAAAGAAGCCCA-1,Monocytes +CD8dep_ATCCGAAAGAATTGTG-1,Macrophages +CD8dep_ATCCGAAAGATGTGGC-1,Fibroblasts +CD8dep_ATCCGAAAGTTGAGTA-1,Monocytes +CD8dep_ATCCGAACAACGATGG-1,Monocytes +CD8dep_ATCCGAACAGGGATTG-1,Monocytes +CD8dep_ATCCGAAGTAAAGTCA-1,Monocytes +CD8dep_ATCCGAAGTTTCCACC-1,Dendritic cells +CD8dep_ATCCGAATCGGCCGAT-1,Monocytes +CD8dep_ATCCGAATCTTAGAGC-1,Monocytes +CD8dep_ATCCGAATCTTGACGA-1,Monocytes +CD8dep_ATCGAGTAGAAGGCCT-1,Monocytes +CD8dep_ATCGAGTAGTCTCCTC-1,Monocytes +CD8dep_ATCGAGTAGTGCAAGC-1,Monocytes +CD8dep_ATCGAGTCAGGCAGTA-1,Monocytes +CD8dep_ATCGAGTGTACAGTGG-1,Dendritic cells +CD8dep_ATCGAGTTCAATCTCT-1,Monocytes +CD8dep_ATCGAGTTCGTTGCCT-1,Monocytes +CD8dep_ATCTACTAGAGATGAG-1,Monocytes +CD8dep_ATCTACTAGATGCGAC-1,Monocytes +CD8dep_ATCTACTAGTGCGTGA-1,Monocytes +CD8dep_ATCTACTAGTTCCACA-1,Macrophages +CD8dep_ATCTACTCACATTTCT-1,T cells +CD8dep_ATCTACTGTTGTGGAG-1,Monocytes +CD8dep_ATCTGCCAGAACAATC-1,Monocytes +CD8dep_ATCTGCCAGACGCAAC-1,Monocytes +CD8dep_ATCTGCCAGATGTGTA-1,Dendritic cells +CD8dep_ATCTGCCAGCTCCTCT-1,Monocytes +CD8dep_ATCTGCCAGTTATCGC-1,Monocytes +CD8dep_ATCTGCCCAACGATCT-1,Dendritic cells +CD8dep_ATCTGCCCAAGACGTG-1,B cells +CD8dep_ATCTGCCCAAGTAATG-1,Monocytes +CD8dep_ATCTGCCCACAGAGGT-1,Monocytes +CD8dep_ATCTGCCCACTAGTAC-1,Monocytes +CD8dep_ATCTGCCCATGCTAGT-1,Monocytes +CD8dep_ATCTGCCCATTACCTT-1,Monocytes +CD8dep_ATCTGCCGTACGACCC-1,Monocytes +CD8dep_ATCTGCCGTACTTGAC-1,Monocytes +CD8dep_ATCTGCCGTCATGCAT-1,Monocytes +CD8dep_ATCTGCCGTTAAGACA-1,Dendritic cells +CD8dep_ATCTGCCGTTACTGAC-1,Monocytes +CD8dep_ATCTGCCTCAACTCTT-1,Monocytes +CD8dep_ATGAGGGAGCCATCGC-1,Monocytes +CD8dep_ATGAGGGAGGCATGGT-1,Monocytes +CD8dep_ATGAGGGGTCCTCTTG-1,Monocytes +CD8dep_ATGAGGGGTCGCTTTC-1,Monocytes +CD8dep_ATGAGGGGTGCCTTGG-1,Monocytes +CD8dep_ATGAGGGGTGGTCCGT-1,Monocytes +CD8dep_ATGAGGGGTTCCAACA-1,Monocytes +CD8dep_ATGAGGGTCACCGGGT-1,Monocytes +CD8dep_ATGAGGGTCCTCATTA-1,Monocytes +CD8dep_ATGAGGGTCGCACTCT-1,Monocytes +CD8dep_ATGAGGGTCGTCTGAA-1,Monocytes +CD8dep_ATGCGATAGTATGACA-1,Monocytes +CD8dep_ATGCGATAGTCCGGTC-1,Monocytes +CD8dep_ATGCGATAGTTAACGA-1,Monocytes +CD8dep_ATGCGATCATGCCTTC-1,Monocytes +CD8dep_ATGCGATGTCAGTGGA-1,Monocytes +CD8dep_ATGCGATGTCCAGTAT-1,Monocytes +CD8dep_ATGCGATGTTTCCACC-1,Monocytes +CD8dep_ATGCGATTCAGCACAT-1,Monocytes +CD8dep_ATGCGATTCTACGAGT-1,Monocytes +CD8dep_ATGGGAGAGCCAGAAC-1,Monocytes +CD8dep_ATGGGAGAGCGCTCCA-1,Monocytes +CD8dep_ATGGGAGAGGGCATGT-1,Monocytes +CD8dep_ATGGGAGCACCGATAT-1,Monocytes +CD8dep_ATGGGAGCAGATTGCT-1,Monocytes +CD8dep_ATGGGAGTCGGCTTGG-1,Dendritic cells +CD8dep_ATGTGTGAGATAGTCA-1,Monocytes +CD8dep_ATGTGTGAGCCCAGCT-1,Dendritic cells +CD8dep_ATGTGTGAGGTGCTTT-1,Monocytes +CD8dep_ATGTGTGAGTTGAGTA-1,Dendritic cells +CD8dep_ATGTGTGCACTACAGT-1,Monocytes +CD8dep_ATGTGTGGTGATGTCT-1,Monocytes +CD8dep_ATGTGTGTCGCGCCAA-1,Monocytes +CD8dep_ATTACTCAGCATGGCA-1,Granulocytes +CD8dep_ATTACTCAGCGTGAAC-1,Dendritic cells +CD8dep_ATTACTCAGGTGCTTT-1,Monocytes +CD8dep_ATTACTCAGTGCGTGA-1,Monocytes +CD8dep_ATTACTCGTGCGGTAA-1,Monocytes +CD8dep_ATTACTCTCGCTAGCG-1,Monocytes +CD8dep_ATTACTCTCTATGTGG-1,Monocytes +CD8dep_ATTACTCTCTTTAGTC-1,Monocytes +CD8dep_ATTATCCAGATGCCAG-1,Monocytes +CD8dep_ATTATCCAGATGCCTT-1,Monocytes +CD8dep_ATTATCCAGTCCTCCT-1,Monocytes +CD8dep_ATTATCCCACTACAGT-1,Monocytes +CD8dep_ATTATCCCAGACAAAT-1,Monocytes +CD8dep_ATTATCCCAGGTTTCA-1,Monocytes +CD8dep_ATTATCCCATATACGC-1,Monocytes +CD8dep_ATTATCCGTTCCGTCT-1,Monocytes +CD8dep_ATTATCCGTTGTACAC-1,Dendritic cells +CD8dep_ATTATCCTCAGGATCT-1,Monocytes +CD8dep_ATTATCCTCAGTGCAT-1,Macrophages +CD8dep_ATTCTACAGATAGGAG-1,Granulocytes +CD8dep_ATTCTACAGCAGATCG-1,Monocytes +CD8dep_ATTCTACCATGCGCAC-1,Monocytes +CD8dep_ATTCTACGTGAGGGAG-1,Monocytes +CD8dep_ATTCTACGTGGGTCAA-1,Monocytes +CD8dep_ATTCTACGTTCGTCTC-1,Monocytes +CD8dep_ATTGGACAGACCACGA-1,Monocytes +CD8dep_ATTGGACAGATATGGT-1,Monocytes +CD8dep_ATTGGACAGTACGACG-1,Monocytes +CD8dep_ATTGGACCAAACCTAC-1,Monocytes +CD8dep_ATTGGACCAAGCCGCT-1,Monocytes +CD8dep_ATTGGACCAATGTAAG-1,Monocytes +CD8dep_ATTGGACCACACAGAG-1,Monocytes +CD8dep_ATTGGACCACGAAACG-1,Monocytes +CD8dep_ATTGGTGAGAAAGTGG-1,Monocytes +CD8dep_ATTGGTGAGAACTGTA-1,Monocytes +CD8dep_ATTGGTGAGTCCGGTC-1,T cells +CD8dep_ATTGGTGGTCAGAATA-1,Granulocytes +CD8dep_ATTGGTGGTCCGTGAC-1,Dendritic cells +CD8dep_ATTGGTGGTGATAAGT-1,Monocytes +CD8dep_ATTGGTGGTGTTCGAT-1,Monocytes +CD8dep_ATTGGTGTCATACGGT-1,Monocytes +CD8dep_ATTGGTGTCGTACCGG-1,Dendritic cells +CD8dep_ATTGGTGTCTAACGGT-1,Monocytes +CD8dep_ATTGGTGTCTGTTGAG-1,Monocytes +CD8dep_ATTTCTGAGTGCCATT-1,Monocytes +CD8dep_ATTTCTGTCAGTTAGC-1,Monocytes +CD8dep_ATTTCTGTCATTGCGA-1,Monocytes +CD8dep_ATTTCTGTCCTTGGTC-1,Fibroblasts +CD8dep_ATTTCTGTCGCGCCAA-1,Monocytes +CD8dep_ATTTCTGTCTTAGCCC-1,Monocytes +CD8dep_CAACCAAAGACTGTAA-1,Monocytes +CD8dep_CAACCAAAGACTTTCG-1,Monocytes +CD8dep_CAACCAAAGAGGTTGC-1,Dendritic cells +CD8dep_CAACCAACAACACGCC-1,Monocytes +CD8dep_CAACCAACACATGGGA-1,Monocytes +CD8dep_CAACCAACAGGACCCT-1,Granulocytes +CD8dep_CAACCAACAGGGTACA-1,Monocytes +CD8dep_CAACCAACATGGGACA-1,Monocytes +CD8dep_CAACCAAGTCACTTCC-1,Monocytes +CD8dep_CAACCAAGTCATTAGC-1,Monocytes +CD8dep_CAACCAAGTTCCACAA-1,Monocytes +CD8dep_CAACCTCAGCGACGTA-1,Macrophages +CD8dep_CAACCTCGTCCGCTGA-1,Monocytes +CD8dep_CAACCTCGTCGAGTTT-1,Monocytes +CD8dep_CAACCTCGTTCATGGT-1,Monocytes +CD8dep_CAACTAGAGGTAAACT-1,Monocytes +CD8dep_CAACTAGCAAGTCTAC-1,Dendritic cells +CD8dep_CAACTAGCACAGACAG-1,Monocytes +CD8dep_CAACTAGCACCAGGCT-1,Granulocytes +CD8dep_CAACTAGCACTTACGA-1,Monocytes +CD8dep_CAACTAGCAGGTTTCA-1,Monocytes +CD8dep_CAACTAGCATTGGGCC-1,Dendritic cells +CD8dep_CAACTAGGTCGGGTCT-1,Monocytes +CD8dep_CAACTAGGTGTTTGGT-1,Monocytes +CD8dep_CAACTAGTCCTTGCCA-1,Monocytes +CD8dep_CAAGAAAAGGCTAGAC-1,Monocytes +CD8dep_CAAGAAACAATGTTGC-1,Monocytes +CD8dep_CAAGAAACACGGATAG-1,Dendritic cells +CD8dep_CAAGAAACAGCGTTCG-1,Monocytes +CD8dep_CAAGAAAGTCCGAAGA-1,Monocytes +CD8dep_CAAGAAAGTCGGCTCA-1,Monocytes +CD8dep_CAAGAAAGTGATGTCT-1,Macrophages +CD8dep_CAAGAAAGTGCACCAC-1,Monocytes +CD8dep_CAAGAAATCCATGCTC-1,Monocytes +CD8dep_CAAGATCAGCGCCTTG-1,Monocytes +CD8dep_CAAGATCAGGATGGTC-1,Granulocytes +CD8dep_CAAGATCAGGGTTCCC-1,Monocytes +CD8dep_CAAGATCAGTGTCCAT-1,Monocytes +CD8dep_CAAGATCCATATGCTG-1,Monocytes +CD8dep_CAAGATCGTAATCACC-1,Granulocytes +CD8dep_CAAGATCGTCAGAATA-1,Macrophages +CD8dep_CAAGATCTCCAACCAA-1,Monocytes +CD8dep_CAAGATCTCTCTGTCG-1,Monocytes +CD8dep_CAAGGCCCAGGAACGT-1,Monocytes +CD8dep_CAAGGCCCATACGCTA-1,Monocytes +CD8dep_CAAGGCCGTGGTCCGT-1,Monocytes +CD8dep_CAAGGCCGTTTGTTTC-1,Monocytes +CD8dep_CAAGGCCTCCGAACGC-1,Monocytes +CD8dep_CAAGTTGAGCCACGCT-1,Monocytes +CD8dep_CAAGTTGCAGTATGCT-1,Monocytes +CD8dep_CAAGTTGGTGACGCCT-1,Monocytes +CD8dep_CAAGTTGTCCTTGACC-1,Monocytes +CD8dep_CAAGTTGTCTAACCGA-1,Monocytes +CD8dep_CAAGTTGTCTCTGTCG-1,Monocytes +CD8dep_CAAGTTGTCTGGTGTA-1,Monocytes +CD8dep_CACAAACCAAACCTAC-1,Monocytes +CD8dep_CACAAACCAGATAATG-1,Dendritic cells +CD8dep_CACAAACCATTTGCTT-1,Dendritic cells +CD8dep_CACAAACGTACCTACA-1,Dendritic cells +CD8dep_CACAAACGTCACTTCC-1,Monocytes +CD8dep_CACAAACGTCAGATAA-1,Macrophages +CD8dep_CACAAACGTGGACGAT-1,Monocytes +CD8dep_CACAAACGTTACTGAC-1,Monocytes +CD8dep_CACAAACTCCAAATGC-1,Monocytes +CD8dep_CACAAACTCCTGCTTG-1,Monocytes +CD8dep_CACAAACTCCTTGGTC-1,Monocytes +CD8dep_CACAAACTCTTGAGGT-1,Dendritic cells +CD8dep_CACACAAAGAAGGGTA-1,Monocytes +CD8dep_CACACAAAGCCTTGAT-1,Granulocytes +CD8dep_CACACAAAGTGATCGG-1,Monocytes +CD8dep_CACACAACACCAGGCT-1,Monocytes +CD8dep_CACACAAGTCTAGCCG-1,Dendritic cells +CD8dep_CACACAATCAGTTGAC-1,Macrophages +CD8dep_CACACAATCCGCAAGC-1,Monocytes +CD8dep_CACACAATCCGTTGCT-1,Monocytes +CD8dep_CACACCTAGACTGTAA-1,Monocytes +CD8dep_CACACCTAGGCAGTCA-1,Dendritic cells +CD8dep_CACACCTCACTAAGTC-1,Monocytes +CD8dep_CACACTCAGATGGGTC-1,Monocytes +CD8dep_CACACTCAGCCAACAG-1,Monocytes +CD8dep_CACACTCAGTCAATAG-1,Monocytes +CD8dep_CACACTCCACTGTCGG-1,Monocytes +CD8dep_CACACTCCAGTCAGCC-1,Monocytes +CD8dep_CACACTCGTAAGGATT-1,Monocytes +CD8dep_CACACTCGTAAGGGAA-1,Monocytes +CD8dep_CACACTCGTCATGCCG-1,Monocytes +CD8dep_CACACTCGTGAAAGAG-1,Monocytes +CD8dep_CACACTCGTGAGTATA-1,Monocytes +CD8dep_CACAGGCAGCGATGAC-1,Monocytes +CD8dep_CACAGGCAGCGTCAAG-1,Monocytes +CD8dep_CACAGGCAGCGTGAAC-1,Monocytes +CD8dep_CACAGGCAGGTAAACT-1,Monocytes +CD8dep_CACAGGCCAAAGCGGT-1,Dendritic cells +CD8dep_CACAGGCCACGGACAA-1,Monocytes +CD8dep_CACAGGCCATACTACG-1,Monocytes +CD8dep_CACAGGCCATCGTCGG-1,T cells +CD8dep_CACAGGCGTAAACCTC-1,Granulocytes +CD8dep_CACAGGCGTAAGTGTA-1,Monocytes +CD8dep_CACAGGCGTATAATGG-1,Monocytes +CD8dep_CACAGGCGTCATCCCT-1,Dendritic cells +CD8dep_CACAGGCTCATTTGGG-1,Monocytes +CD8dep_CACAGGCTCCGTACAA-1,Monocytes +CD8dep_CACAGGCTCGGACAAG-1,Monocytes +CD8dep_CACAGTAAGAAGCCCA-1,Monocytes +CD8dep_CACAGTAAGGTGGGTT-1,Monocytes +CD8dep_CACAGTAAGGTGTGGT-1,Macrophages +CD8dep_CACAGTAAGTCTCAAC-1,Monocytes +CD8dep_CACAGTACACCAGTTA-1,Monocytes +CD8dep_CACAGTACATCTCGCT-1,Monocytes +CD8dep_CACAGTAGTAAGAGAG-1,Monocytes +CD8dep_CACAGTAGTATATGAG-1,Macrophages +CD8dep_CACAGTAGTCGCTTCT-1,Macrophages +CD8dep_CACAGTAGTGAACCTT-1,Monocytes +CD8dep_CACAGTAGTGAGGCTA-1,Monocytes +CD8dep_CACAGTAGTTCAGACT-1,Monocytes +CD8dep_CACAGTAGTTGGTGGA-1,Monocytes +CD8dep_CACAGTATCCGTAGTA-1,Monocytes +CD8dep_CACAGTATCGCCTGTT-1,Dendritic cells +CD8dep_CACATAGAGACAGAGA-1,Macrophages +CD8dep_CACATAGAGGCATTGG-1,Monocytes +CD8dep_CACATAGAGTCAAGGC-1,Monocytes +CD8dep_CACATAGCAATGGAGC-1,Monocytes +CD8dep_CACATAGCAGTTCCCT-1,Monocytes +CD8dep_CACATAGGTCAGAATA-1,Monocytes +CD8dep_CACATAGGTGCTCTTC-1,Monocytes +CD8dep_CACATAGGTGGTACAG-1,Monocytes +CD8dep_CACATAGGTTAGTGGG-1,Monocytes +CD8dep_CACATAGGTTCCACAA-1,Monocytes +CD8dep_CACATAGTCAGTTCGA-1,Monocytes +CD8dep_CACATTTAGGAGTCTG-1,Macrophages +CD8dep_CACATTTAGGTAAACT-1,Dendritic cells +CD8dep_CACATTTGTCGCGAAA-1,Monocytes +CD8dep_CACATTTGTTACAGAA-1,Monocytes +CD8dep_CACATTTTCTATGTGG-1,Dendritic cells +CD8dep_CACATTTTCTTGACGA-1,Monocytes +CD8dep_CACATTTTCTTGCCGT-1,Macrophages +CD8dep_CACCACTAGAGTACCG-1,Dendritic cells +CD8dep_CACCACTAGCTAGTCT-1,Monocytes +CD8dep_CACCACTAGGAGTTGC-1,Monocytes +CD8dep_CACCACTAGGCTAGGT-1,Monocytes +CD8dep_CACCACTAGGTGATAT-1,Monocytes +CD8dep_CACCACTAGTGGGTTG-1,Monocytes +CD8dep_CACCACTCAAGCGCTC-1,Monocytes +CD8dep_CACCACTGTACATGTC-1,Granulocytes +CD8dep_CACCACTGTATCACCA-1,Monocytes +CD8dep_CACCAGGAGGGTATCG-1,Monocytes +CD8dep_CACCAGGCACGAAACG-1,Monocytes +CD8dep_CACCAGGCACGGCCAT-1,Monocytes +CD8dep_CACCAGGCAGCGTAAG-1,Monocytes +CD8dep_CACCAGGCATGCGCAC-1,Monocytes +CD8dep_CACCAGGGTAGCGATG-1,Monocytes +CD8dep_CACCAGGGTCCAGTGC-1,Monocytes +CD8dep_CACCAGGGTCTTGATG-1,Monocytes +CD8dep_CACCAGGTCGCTGATA-1,Monocytes +CD8dep_CACCTTGAGATCTGCT-1,Monocytes +CD8dep_CACCTTGCAATGGAAT-1,Monocytes +CD8dep_CACCTTGCAGTATGCT-1,Monocytes +CD8dep_CACCTTGGTAGCCTAT-1,Monocytes +CD8dep_CACCTTGGTATGAAAC-1,Monocytes +CD8dep_CACCTTGGTCCGAACC-1,Monocytes +CD8dep_CACCTTGGTTCCAACA-1,Monocytes +CD8dep_CACCTTGGTTTGGGCC-1,Monocytes +CD8dep_CACCTTGTCCCTTGCA-1,Monocytes +CD8dep_CACCTTGTCCTTGCCA-1,Monocytes +CD8dep_CACTCCAAGCCGGTAA-1,Monocytes +CD8dep_CACTCCAAGCTAGCCC-1,Monocytes +CD8dep_CACTCCAAGCTGGAAC-1,Macrophages +CD8dep_CACTCCAAGGCGCTCT-1,Dendritic cells +CD8dep_CACTCCAAGTGAAGTT-1,Monocytes +CD8dep_CACTCCAAGTGACTCT-1,Monocytes +CD8dep_CACTCCACAATAACGA-1,Monocytes +CD8dep_CACTCCAGTACGAAAT-1,Monocytes +CD8dep_CACTCCAGTCTCTCTG-1,Macrophages +CD8dep_CACTCCAGTGTGACCC-1,Monocytes +CD8dep_CACTCCAGTTCAGGCC-1,Monocytes +CD8dep_CACTCCATCCAAGCCG-1,Granulocytes +CD8dep_CACTCCATCCGAAGAG-1,Monocytes +CD8dep_CACTCCATCCGAGCCA-1,Monocytes +CD8dep_CACTCCATCCTAGGGC-1,Monocytes +CD8dep_CACTCCATCTGGCGTG-1,Monocytes +CD8dep_CAGAATCAGACACTAA-1,Monocytes +CD8dep_CAGAATCAGACAGGCT-1,Monocytes +CD8dep_CAGAATCAGATATACG-1,Monocytes +CD8dep_CAGAATCGTATTACCG-1,Monocytes +CD8dep_CAGAATCGTCACAAGG-1,Monocytes +CD8dep_CAGAATCTCCGAATGT-1,Macrophages +CD8dep_CAGAATCTCTCAAACG-1,Monocytes +CD8dep_CAGAGAGAGAGTAAGG-1,Monocytes +CD8dep_CAGAGAGAGATATACG-1,Monocytes +CD8dep_CAGAGAGAGCCAGAAC-1,Monocytes +CD8dep_CAGAGAGAGTGGTAGC-1,Monocytes +CD8dep_CAGAGAGAGTTAGCGG-1,Monocytes +CD8dep_CAGAGAGCAGCATACT-1,Dendritic cells +CD8dep_CAGAGAGCAGTTTACG-1,Monocytes +CD8dep_CAGAGAGCATGGTCAT-1,Monocytes +CD8dep_CAGAGAGGTACACCGC-1,Dendritic cells +CD8dep_CAGAGAGGTACAGACG-1,Monocytes +CD8dep_CAGAGAGGTCTAGGTT-1,Monocytes +CD8dep_CAGAGAGGTTAAAGAC-1,Monocytes +CD8dep_CAGAGAGTCCAAACTG-1,Granulocytes +CD8dep_CAGAGAGTCCCATTAT-1,Monocytes +CD8dep_CAGAGAGTCGGCTTGG-1,Monocytes +CD8dep_CAGAGAGTCTCTGAGA-1,Monocytes +CD8dep_CAGAGAGTCTTGGGTA-1,Macrophages +CD8dep_CAGATCAAGGGTATCG-1,Monocytes +CD8dep_CAGATCAGTCTCTCTG-1,Monocytes +CD8dep_CAGATCATCAAACCGT-1,Dendritic cells +CD8dep_CAGATCATCCGTTGCT-1,Monocytes +CD8dep_CAGATCATCTGCCCTA-1,Monocytes +CD8dep_CAGCAGCAGAGTTGGC-1,Monocytes +CD8dep_CAGCAGCAGGCAAAGA-1,Monocytes +CD8dep_CAGCAGCAGTATTGGA-1,Dendritic cells +CD8dep_CAGCAGCGTAGCCTCG-1,Monocytes +CD8dep_CAGCAGCGTCCGAATT-1,Dendritic cells +CD8dep_CAGCAGCTCCGGGTGT-1,Monocytes +CD8dep_CAGCAGCTCGCCGTGA-1,Dendritic cells +CD8dep_CAGCAGCTCGCTGATA-1,Monocytes +CD8dep_CAGCAGCTCGCTTGTC-1,Dendritic cells +CD8dep_CAGCAGCTCTTTACAC-1,Monocytes +CD8dep_CAGCATAAGAGGACGG-1,Monocytes +CD8dep_CAGCATAAGATCCCGC-1,Monocytes +CD8dep_CAGCATAAGTACATGA-1,Monocytes +CD8dep_CAGCATACAATGTAAG-1,Macrophages +CD8dep_CAGCATAGTAGGCATG-1,Monocytes +CD8dep_CAGCATAGTCAAACTC-1,Monocytes +CD8dep_CAGCATATCAAACCGT-1,Monocytes +CD8dep_CAGCATATCGAGCCCA-1,Monocytes +CD8dep_CAGCCGAAGAGTTGGC-1,Monocytes +CD8dep_CAGCCGAAGATCACGG-1,Dendritic cells +CD8dep_CAGCCGAAGATCTGAA-1,Dendritic cells +CD8dep_CAGCCGACAAAGGAAG-1,Monocytes +CD8dep_CAGCCGACAAGGACAC-1,Macrophages +CD8dep_CAGCCGACAAGTTCTG-1,Monocytes +CD8dep_CAGCCGACATGATCCA-1,Monocytes +CD8dep_CAGCCGAGTAAGCACG-1,Macrophages +CD8dep_CAGCCGAGTATGAAAC-1,Monocytes +CD8dep_CAGCCGAGTCAACATC-1,Monocytes +CD8dep_CAGCCGAGTCCGTTAA-1,Monocytes +CD8dep_CAGCCGAGTCTGCCAG-1,Dendritic cells +CD8dep_CAGCCGAGTGACAAAT-1,Monocytes +CD8dep_CAGCCGAGTTACGTCA-1,Monocytes +CD8dep_CAGCCGATCAGCTTAG-1,Monocytes +CD8dep_CAGCGACAGATATGCA-1,Monocytes +CD8dep_CAGCGACGTTCAGCGC-1,Macrophages +CD8dep_CAGCGACTCCGAAGAG-1,Monocytes +CD8dep_CAGCTAAAGCTAGTGG-1,Monocytes +CD8dep_CAGCTAACATCGGAAG-1,Monocytes +CD8dep_CAGCTAAGTACGCACC-1,Monocytes +CD8dep_CAGCTAAGTCATACTG-1,Monocytes +CD8dep_CAGCTAAGTCGCTTTC-1,Monocytes +CD8dep_CAGCTAAGTCTGATTG-1,Monocytes +CD8dep_CAGCTGGAGGGTGTGT-1,Dendritic cells +CD8dep_CAGCTGGAGTGCGATG-1,Monocytes +CD8dep_CAGCTGGGTAATCGTC-1,Monocytes +CD8dep_CAGCTGGGTAGTACCT-1,Monocytes +CD8dep_CAGCTGGTCCGTCAAA-1,Monocytes +CD8dep_CAGCTGGTCTGGGCCA-1,Monocytes +CD8dep_CAGGTGCAGACACTAA-1,Monocytes +CD8dep_CAGGTGCAGCATGGCA-1,Granulocytes +CD8dep_CAGGTGCCAAGACACG-1,Monocytes +CD8dep_CAGGTGCCATCTACGA-1,Monocytes +CD8dep_CAGGTGCGTACAGTGG-1,Monocytes +CD8dep_CAGGTGCGTGCACGAA-1,Monocytes +CD8dep_CAGGTGCTCAGCTCGG-1,Monocytes +CD8dep_CAGTAACAGCCTATGT-1,Monocytes +CD8dep_CAGTAACGTCGCCATG-1,Monocytes +CD8dep_CAGTAACGTCTTCGTC-1,Monocytes +CD8dep_CAGTAACGTCTTGATG-1,Monocytes +CD8dep_CAGTAACGTTCCGTCT-1,Monocytes +CD8dep_CAGTAACTCAACGGCC-1,Monocytes +CD8dep_CAGTCCTAGCCACGCT-1,T cells +CD8dep_CAGTCCTAGCTTATCG-1,Dendritic cells +CD8dep_CAGTCCTCACGTTGGC-1,Macrophages +CD8dep_CAGTCCTGTACATGTC-1,Monocytes +CD8dep_CAGTCCTGTACCGCTG-1,Macrophages +CD8dep_CAGTCCTGTTCACCTC-1,T cells +CD8dep_CAGTCCTGTTGGTAAA-1,Dendritic cells +CD8dep_CAGTCCTTCATCTGCC-1,Monocytes +CD8dep_CAGTCCTTCTGTTGAG-1,Monocytes +CD8dep_CAGTCCTTCTTGTTTG-1,Monocytes +CD8dep_CATATGGAGACGACGT-1,Monocytes +CD8dep_CATATGGAGCTAGTCT-1,Dendritic cells +CD8dep_CATATGGAGGGCTTCC-1,Macrophages +CD8dep_CATATGGAGTTCCACA-1,Monocytes +CD8dep_CATATGGCAATAGCGG-1,Monocytes +CD8dep_CATATGGCAGGGTACA-1,Monocytes +CD8dep_CATATGGCATAAAGGT-1,Dendritic cells +CD8dep_CATATGGCATGAACCT-1,Monocytes +CD8dep_CATATGGGTCTACCTC-1,Monocytes +CD8dep_CATATGGGTTCATGGT-1,Monocytes +CD8dep_CATATGGGTTTAGCTG-1,Monocytes +CD8dep_CATATGGTCTTTAGGG-1,Monocytes +CD8dep_CATATTCAGTTGAGAT-1,Monocytes +CD8dep_CATATTCAGTTGTAGA-1,Monocytes +CD8dep_CATATTCCATAAAGGT-1,Monocytes +CD8dep_CATATTCCATATACGC-1,Monocytes +CD8dep_CATATTCCATTAGGCT-1,Monocytes +CD8dep_CATATTCGTAGAAAGG-1,Monocytes +CD8dep_CATATTCGTCTTCTCG-1,Monocytes +CD8dep_CATATTCGTCTTTCAT-1,Monocytes +CD8dep_CATATTCGTGTGACGA-1,Dendritic cells +CD8dep_CATATTCGTTCGGCAC-1,Macrophages +CD8dep_CATCAAGAGCCAGTTT-1,Monocytes +CD8dep_CATCAAGAGTCAATAG-1,Monocytes +CD8dep_CATCAAGAGTGCGATG-1,Monocytes +CD8dep_CATCAAGCAACACCCG-1,Monocytes +CD8dep_CATCAAGCACGGTTTA-1,Monocytes +CD8dep_CATCAAGGTAATCACC-1,Monocytes +CD8dep_CATCAGAAGTGAACAT-1,Monocytes +CD8dep_CATCAGACACGGTGTC-1,Monocytes +CD8dep_CATCAGACAGGTGGAT-1,Monocytes +CD8dep_CATCAGACAGTGACAG-1,Monocytes +CD8dep_CATCAGACATCAGTAC-1,Monocytes +CD8dep_CATCAGAGTCTCTTAT-1,Monocytes +CD8dep_CATCCACAGACCACGA-1,Dendritic cells +CD8dep_CATCCACCAAGTCTGT-1,Monocytes +CD8dep_CATCCACCATTCCTGC-1,Monocytes +CD8dep_CATCCACCATTTGCTT-1,Monocytes +CD8dep_CATCCACGTAAAGGAG-1,Monocytes +CD8dep_CATCCACGTCCCTTGT-1,Monocytes +CD8dep_CATCCACGTCGTTGTA-1,Dendritic cells +CD8dep_CATCCACGTGCATCTA-1,Macrophages +CD8dep_CATCCACTCGGTGTCG-1,Monocytes +CD8dep_CATCGAAAGCCACTAT-1,Monocytes +CD8dep_CATCGAAAGCGTGAGT-1,Monocytes +CD8dep_CATCGAAAGGAGTAGA-1,Monocytes +CD8dep_CATCGAAAGTACGCCC-1,Monocytes +CD8dep_CATCGAAAGTGGAGAA-1,Monocytes +CD8dep_CATCGAAAGTTAGGTA-1,Monocytes +CD8dep_CATCGAACAAGCTGAG-1,Macrophages +CD8dep_CATCGAACAATGTAAG-1,Monocytes +CD8dep_CATCGAAGTCGCGGTT-1,Monocytes +CD8dep_CATCGAAGTGAGCGAT-1,Monocytes +CD8dep_CATCGAAGTTGCTCCT-1,Monocytes +CD8dep_CATCGAAGTTTACTCT-1,Macrophages +CD8dep_CATCGAATCTTTCCTC-1,Monocytes +CD8dep_CATCGGGAGAGGGATA-1,Monocytes +CD8dep_CATCGGGAGCGTGAGT-1,Monocytes +CD8dep_CATCGGGAGCTGTTCA-1,Granulocytes +CD8dep_CATCGGGAGGTGCTAG-1,Monocytes +CD8dep_CATCGGGCACATCCGG-1,Dendritic cells +CD8dep_CATCGGGCACTTCGAA-1,Monocytes +CD8dep_CATCGGGCAGGAATGC-1,Monocytes +CD8dep_CATCGGGGTCAGAATA-1,Monocytes +CD8dep_CATCGGGGTCGTTGTA-1,Dendritic cells +CD8dep_CATCGGGGTGTTCGAT-1,Monocytes +CD8dep_CATCGGGGTTCCACAA-1,Monocytes +CD8dep_CATCGGGGTTCCGGCA-1,Dendritic cells +CD8dep_CATCGGGTCATGCATG-1,Monocytes +CD8dep_CATGACAAGAGGACGG-1,Monocytes +CD8dep_CATGACAAGCTAGTGG-1,Monocytes +CD8dep_CATGACAAGTGAATTG-1,Monocytes +CD8dep_CATGACAAGTGACTCT-1,Monocytes +CD8dep_CATGACACACACGCTG-1,Monocytes +CD8dep_CATGACAGTAATTGGA-1,Monocytes +CD8dep_CATGACAGTCCGAGTC-1,Macrophages +CD8dep_CATGACAGTCTAAACC-1,Macrophages +CD8dep_CATGCCTAGAGGGCTT-1,Monocytes +CD8dep_CATGCCTAGCGCCTCA-1,Monocytes +CD8dep_CATGCCTAGCGTGTCC-1,Macrophages +CD8dep_CATGCCTCAATCACAC-1,Monocytes +CD8dep_CATGCCTTCCCTAACC-1,Granulocytes +CD8dep_CATGCCTTCTGTTGAG-1,Monocytes +CD8dep_CATGGCGAGAGTGACC-1,Granulocytes +CD8dep_CATGGCGAGGAGTTGC-1,Dendritic cells +CD8dep_CATGGCGAGGTGTGGT-1,Monocytes +CD8dep_CATGGCGCAGGAACGT-1,Dendritic cells +CD8dep_CATGGCGGTCTAGCGC-1,Monocytes +CD8dep_CATGGCGTCGCGCCAA-1,Monocytes +CD8dep_CATGGCGTCGTTACAG-1,Monocytes +CD8dep_CATGGCGTCGTTGACA-1,Monocytes +CD8dep_CATGGCGTCTCGAGTA-1,Monocytes +CD8dep_CATTATCGTAAGTAGT-1,Dendritic cells +CD8dep_CATTATCTCCCTGACT-1,Macrophages +CD8dep_CATTATCTCGCCATAA-1,Monocytes +CD8dep_CATTATCTCGTTGCCT-1,Macrophages +CD8dep_CATTATCTCTACCTGC-1,Monocytes +CD8dep_CATTATCTCTTGTACT-1,Dendritic cells +CD8dep_CATTCGCCACAGGTTT-1,Dendritic cells +CD8dep_CATTCGCCACGAAAGC-1,Monocytes +CD8dep_CATTCGCCAGATGAGC-1,Granulocytes +CD8dep_CATTCGCCATTTGCCC-1,Monocytes +CD8dep_CATTCGCGTCCAACTA-1,Monocytes +CD8dep_CATTCGCTCTACCAGA-1,Monocytes +CD8dep_CATTCGCTCTGAGTGT-1,Monocytes +CD8dep_CCAATCCAGAGACGAA-1,Granulocytes +CD8dep_CCAATCCAGCTGAACG-1,Macrophages +CD8dep_CCAATCCAGGATGCGT-1,Monocytes +CD8dep_CCAATCCAGGTGCTAG-1,Monocytes +CD8dep_CCAATCCCACAAGCCC-1,Monocytes +CD8dep_CCAATCCCACCGGAAA-1,Dendritic cells +CD8dep_CCAATCCCATACGCTA-1,Monocytes +CD8dep_CCAATCCCATTCGACA-1,Monocytes +CD8dep_CCAATCCTCATGTGGT-1,Monocytes +CD8dep_CCAATCCTCCAGATCA-1,Monocytes +CD8dep_CCAATCCTCGCGTTTC-1,Monocytes +CD8dep_CCACCTAAGATGGCGT-1,Monocytes +CD8dep_CCACCTACAAACAACA-1,Monocytes +CD8dep_CCACCTACAAGGACTG-1,Monocytes +CD8dep_CCACCTACAGATCGGA-1,Monocytes +CD8dep_CCACCTAGTTAAGAAC-1,Dendritic cells +CD8dep_CCACCTAGTTCGTTGA-1,Monocytes +CD8dep_CCACCTAGTTCTGTTT-1,Monocytes +CD8dep_CCACCTATCAATAAGG-1,Dendritic cells +CD8dep_CCACCTATCTATCCTA-1,Monocytes +CD8dep_CCACGGAAGAGTCTGG-1,Monocytes +CD8dep_CCACGGAAGCCTCGTG-1,Monocytes +CD8dep_CCACGGAAGCGCCTTG-1,Monocytes +CD8dep_CCACGGACAACTTGAC-1,Monocytes +CD8dep_CCACGGACAGATTGCT-1,Monocytes +CD8dep_CCACGGAGTAGAGTGC-1,Granulocytes +CD8dep_CCACGGAGTCGCGTGT-1,Monocytes +CD8dep_CCACGGATCGGAAATA-1,Monocytes +CD8dep_CCACTACAGGAATTAC-1,Monocytes +CD8dep_CCACTACAGTGTCCCG-1,Monocytes +CD8dep_CCACTACAGTTGTAGA-1,Monocytes +CD8dep_CCACTACCAAGCGTAG-1,Monocytes +CD8dep_CCACTACCAATCCGAT-1,Monocytes +CD8dep_CCACTACGTTCAACCA-1,Macrophages +CD8dep_CCACTACTCAGTCAGT-1,Monocytes +CD8dep_CCACTACTCCTGCTTG-1,Monocytes +CD8dep_CCAGCGAAGAAGGCCT-1,Dendritic cells +CD8dep_CCAGCGAAGAGGGCTT-1,Dendritic cells +CD8dep_CCAGCGAAGGTGGGTT-1,Monocytes +CD8dep_CCAGCGAAGTGTGAAT-1,Monocytes +CD8dep_CCAGCGAGTCTTTCAT-1,Monocytes +CD8dep_CCAGCGAGTTACGCGC-1,Monocytes +CD8dep_CCAGCGAGTTCCGTCT-1,Dendritic cells +CD8dep_CCAGCGATCTCACATT-1,Monocytes +CD8dep_CCATGTCAGGTGACCA-1,Monocytes +CD8dep_CCATGTCCAATGACCT-1,Monocytes +CD8dep_CCATGTCCATCGGGTC-1,Dendritic cells +CD8dep_CCATGTCGTCCGAATT-1,Macrophages +CD8dep_CCATGTCTCAAAGACA-1,Monocytes +CD8dep_CCATGTCTCGAACTGT-1,Monocytes +CD8dep_CCATTCGAGAATTGTG-1,Monocytes +CD8dep_CCATTCGCACCTATCC-1,Monocytes +CD8dep_CCATTCGGTAAATGAC-1,Monocytes +CD8dep_CCATTCGTCAACACAC-1,Monocytes +CD8dep_CCCAATCAGCACGCCT-1,Dendritic cells +CD8dep_CCCAATCAGGTAGCTG-1,Monocytes +CD8dep_CCCAATCCAGTCCTTC-1,Monocytes +CD8dep_CCCAATCCATCGGAAG-1,Macrophages +CD8dep_CCCAATCGTACCGCTG-1,Monocytes +CD8dep_CCCAATCGTACGACCC-1,Monocytes +CD8dep_CCCAATCTCCTATGTT-1,Dendritic cells +CD8dep_CCCAATCTCGGCTACG-1,Monocytes +CD8dep_CCCAGTTAGAAACGCC-1,Monocytes +CD8dep_CCCAGTTAGACGCTTT-1,Monocytes +CD8dep_CCCAGTTAGACTAAGT-1,Monocytes +CD8dep_CCCAGTTAGCTGTTCA-1,Monocytes +CD8dep_CCCAGTTAGGAATCGC-1,Monocytes +CD8dep_CCCAGTTAGTAGGTGC-1,Monocytes +CD8dep_CCCAGTTAGTCCAGGA-1,Monocytes +CD8dep_CCCAGTTCACCATCCT-1,Monocytes +CD8dep_CCCAGTTCATTTCAGG-1,Granulocytes +CD8dep_CCCAGTTGTAAGCACG-1,Monocytes +CD8dep_CCCAGTTGTTCCACTC-1,Macrophages +CD8dep_CCCAGTTTCTGGCGTG-1,T cells +CD8dep_CCCATACGTCGAATCT-1,Monocytes +CD8dep_CCCATACGTCTCTCGT-1,Monocytes +CD8dep_CCCATACGTGTGCCTG-1,Monocytes +CD8dep_CCCATACGTTCCCGAG-1,Monocytes +CD8dep_CCCATACTCAGAGACG-1,Monocytes +CD8dep_CCCTCCTAGAGTGAGA-1,Granulocytes +CD8dep_CCCTCCTAGGGTGTTG-1,Monocytes +CD8dep_CCCTCCTCAATAGCAA-1,Dendritic cells +CD8dep_CCCTCCTCACACTGCG-1,Monocytes +CD8dep_CCCTCCTCACCGGAAA-1,Granulocytes +CD8dep_CCCTCCTCAGCATACT-1,Monocytes +CD8dep_CCCTCCTCAGTCCTTC-1,Monocytes +CD8dep_CCCTCCTGTACGCACC-1,Monocytes +CD8dep_CCCTCCTGTAGAGTGC-1,Monocytes +CD8dep_CCCTCCTGTGTTCTTT-1,Monocytes +CD8dep_CCCTCCTGTTACGCGC-1,Macrophages +CD8dep_CCCTCCTGTTCTGAAC-1,Monocytes +CD8dep_CCCTCCTTCGGCGGTT-1,Monocytes +CD8dep_CCGGGATAGGATGGTC-1,Monocytes +CD8dep_CCGGGATCAGTGAGTG-1,Monocytes +CD8dep_CCGGGATCATCGGGTC-1,Monocytes +CD8dep_CCGGGATGTCTGGTCG-1,Monocytes +CD8dep_CCGGGATGTTCCCGAG-1,Monocytes +CD8dep_CCGGGATTCAGCAACT-1,Macrophages +CD8dep_CCGGTAGAGAAGCCCA-1,Monocytes +CD8dep_CCGGTAGAGCCTATGT-1,Monocytes +CD8dep_CCGGTAGAGGGTGTTG-1,Monocytes +CD8dep_CCGGTAGCAGCCACCA-1,Monocytes +CD8dep_CCGGTAGCATTCTCAT-1,Dendritic cells +CD8dep_CCGGTAGGTAGCTCCG-1,Monocytes +CD8dep_CCGGTAGGTCAAAGCG-1,Monocytes +CD8dep_CCGGTAGGTCGGCTCA-1,Monocytes +CD8dep_CCGGTAGGTGAGCGAT-1,Monocytes +CD8dep_CCGGTAGGTGTGACGA-1,Monocytes +CD8dep_CCGGTAGTCAGCACAT-1,Monocytes +CD8dep_CCGGTAGTCCGTTGCT-1,Monocytes +CD8dep_CCGGTAGTCTGCCCTA-1,Monocytes +CD8dep_CCGGTAGTCTGTCAAG-1,Monocytes +CD8dep_CCGTACTAGCAACGGT-1,Monocytes +CD8dep_CCGTACTAGCTAGTTC-1,Monocytes +CD8dep_CCGTACTCAAGAAGAG-1,Macrophages +CD8dep_CCGTACTCAGACGCCT-1,Monocytes +CD8dep_CCGTACTCATATACGC-1,Macrophages +CD8dep_CCGTACTTCACGAAGG-1,Monocytes +CD8dep_CCGTACTTCTCGTTTA-1,Monocytes +CD8dep_CCGTACTTCTTTAGTC-1,Monocytes +CD8dep_CCGTGGAAGCACGCCT-1,Monocytes +CD8dep_CCGTGGAGTACCGTAT-1,Macrophages +CD8dep_CCGTGGAGTAGGCTGA-1,Macrophages +CD8dep_CCGTGGAGTATAATGG-1,Macrophages +CD8dep_CCGTGGATCGGTTAAC-1,Monocytes +CD8dep_CCGTGGATCGTCCAGG-1,Dendritic cells +CD8dep_CCGTTCAAGAAGAAGC-1,Monocytes +CD8dep_CCGTTCAAGCGTCTAT-1,Monocytes +CD8dep_CCGTTCACAAATTGCC-1,Dendritic cells +CD8dep_CCGTTCACACCTATCC-1,Granulocytes +CD8dep_CCGTTCACACGCCAGT-1,Dendritic cells +CD8dep_CCGTTCAGTCTCAACA-1,Monocytes +CD8dep_CCGTTCATCCTGTACC-1,Monocytes +CD8dep_CCGTTCATCTGTACGA-1,Dendritic cells +CD8dep_CCTAAAGAGATCCTGT-1,Monocytes +CD8dep_CCTAAAGCAATCCAAC-1,Dendritic cells +CD8dep_CCTAAAGCATAGTAAG-1,Monocytes +CD8dep_CCTAAAGGTGAACCTT-1,Monocytes +CD8dep_CCTAAAGTCCGTACAA-1,Monocytes +CD8dep_CCTACACAGCGTTCCG-1,Monocytes +CD8dep_CCTACACAGGTAAACT-1,Monocytes +CD8dep_CCTACACAGTGTACGG-1,Monocytes +CD8dep_CCTACACCAAAGCAAT-1,Monocytes +CD8dep_CCTACACCAAAGGAAG-1,Monocytes +CD8dep_CCTACACCACTGCCAG-1,Monocytes +CD8dep_CCTACACGTCAATGTC-1,Monocytes +CD8dep_CCTACACGTTGTGGCC-1,Macrophages +CD8dep_CCTACACTCACAATGC-1,Monocytes +CD8dep_CCTACACTCATCGGAT-1,Monocytes +CD8dep_CCTACACTCTGCCCTA-1,Dendritic cells +CD8dep_CCTACCAAGAATTCCC-1,Monocytes +CD8dep_CCTACCAAGAGGGCTT-1,Monocytes +CD8dep_CCTACCAAGTAGGCCA-1,Granulocytes +CD8dep_CCTACCAAGTTTCCTT-1,Monocytes +CD8dep_CCTACCACAATCCGAT-1,Dendritic cells +CD8dep_CCTACCACACATCTTT-1,Monocytes +CD8dep_CCTACCACACCAGGCT-1,Monocytes +CD8dep_CCTACCACAGACAAGC-1,Dendritic cells +CD8dep_CCTACCACAGGGTACA-1,Monocytes +CD8dep_CCTACCAGTATAGGGC-1,Monocytes +CD8dep_CCTACCAGTGTTGGGA-1,Monocytes +CD8dep_CCTACCAGTTGAACTC-1,Macrophages +CD8dep_CCTACCATCAACGGCC-1,Monocytes +CD8dep_CCTACCATCATTTGGG-1,Macrophages +CD8dep_CCTACCATCCAACCAA-1,Monocytes +CD8dep_CCTACCATCCCAACGG-1,Monocytes +CD8dep_CCTACCATCGCCATAA-1,Monocytes +CD8dep_CCTACCATCTCCTATA-1,Monocytes +CD8dep_CCTAGCTAGCAACGGT-1,Monocytes +CD8dep_CCTAGCTAGCGTGAAC-1,Monocytes +CD8dep_CCTAGCTCAAACCCAT-1,Monocytes +CD8dep_CCTAGCTCACTTACGA-1,Monocytes +CD8dep_CCTAGCTCAGCTGCTG-1,Monocytes +CD8dep_CCTAGCTCATGAAGTA-1,Dendritic cells +CD8dep_CCTAGCTGTCCGTCAG-1,Monocytes +CD8dep_CCTAGCTGTTGTACAC-1,Monocytes +CD8dep_CCTAGCTTCGATGAGG-1,Monocytes +CD8dep_CCTATTAAGAGGTTGC-1,Monocytes +CD8dep_CCTATTAAGAGTGACC-1,Monocytes +CD8dep_CCTATTAAGCGTAGTG-1,Monocytes +CD8dep_CCTATTAAGTCCGTAT-1,Monocytes +CD8dep_CCTATTACAAGAGGCT-1,Monocytes +CD8dep_CCTATTAGTACGCTGC-1,Monocytes +CD8dep_CCTATTATCTTTAGGG-1,Monocytes +CD8dep_CCTCAGTAGCCGTCGT-1,Monocytes +CD8dep_CCTCAGTAGCGTGAGT-1,Monocytes +CD8dep_CCTCAGTCAACGCACC-1,Macrophages +CD8dep_CCTCAGTGTGATAAAC-1,Monocytes +CD8dep_CCTCAGTGTGATGCCC-1,Granulocytes +CD8dep_CCTCAGTTCTGCCAGG-1,Monocytes +CD8dep_CCTCTGAAGCCGGTAA-1,Monocytes +CD8dep_CCTCTGAAGGCGATAC-1,Monocytes +CD8dep_CCTCTGAAGTGGTAAT-1,Monocytes +CD8dep_CCTCTGACAAGGACTG-1,Monocytes +CD8dep_CCTCTGACAATGCCAT-1,Monocytes +CD8dep_CCTCTGACACCTCGTT-1,Dendritic cells +CD8dep_CCTCTGACATGCCCGA-1,Dendritic cells +CD8dep_CCTCTGAGTCCTGCTT-1,Monocytes +CD8dep_CCTCTGATCACATACG-1,Monocytes +CD8dep_CCTCTGATCAGAGACG-1,Macrophages +CD8dep_CCTCTGATCTCGCATC-1,Macrophages +CD8dep_CCTCTGATCTGCCCTA-1,Monocytes +CD8dep_CCTTACGAGTCGAGTG-1,Monocytes +CD8dep_CCTTACGGTAAACACA-1,Dendritic cells +CD8dep_CCTTACGGTGGTTTCA-1,Dendritic cells +CD8dep_CCTTACGTCCCATTAT-1,Monocytes +CD8dep_CCTTACGTCGCCGTGA-1,Monocytes +CD8dep_CCTTACGTCGCCTGTT-1,Macrophages +CD8dep_CCTTCCCAGGACTGGT-1,Monocytes +CD8dep_CCTTCCCAGGAGTCTG-1,Monocytes +CD8dep_CCTTCCCGTACAGTGG-1,Monocytes +CD8dep_CCTTCCCGTGCAACTT-1,Macrophages +CD8dep_CCTTCCCGTTCCACGG-1,Monocytes +CD8dep_CCTTCCCGTTCGCTAA-1,Monocytes +CD8dep_CCTTCCCTCAACACCA-1,Granulocytes +CD8dep_CCTTCCCTCATTCACT-1,Monocytes +CD8dep_CCTTCGAAGGACAGCT-1,Monocytes +CD8dep_CCTTCGACAAACTGTC-1,Macrophages +CD8dep_CCTTCGACACGTCAGC-1,Monocytes +CD8dep_CCTTCGACACTGTCGG-1,Monocytes +CD8dep_CCTTCGACATCAGTCA-1,Dendritic cells +CD8dep_CCTTCGAGTAGAGTGC-1,Dendritic cells +CD8dep_CCTTCGAGTATGAAAC-1,Monocytes +CD8dep_CCTTCGAGTCCATCCT-1,Monocytes +CD8dep_CCTTCGAGTGCGATAG-1,Monocytes +CD8dep_CCTTCGAGTGTGTGCC-1,Macrophages +CD8dep_CCTTCGAGTTGAACTC-1,Monocytes +CD8dep_CCTTCGATCCCTCAGT-1,Monocytes +CD8dep_CCTTCGATCCCTTGCA-1,Monocytes +CD8dep_CCTTCGATCCGCAGTG-1,Monocytes +CD8dep_CCTTCGATCCGTCAAA-1,Monocytes +CD8dep_CCTTCGATCGAGGTAG-1,Dendritic cells +CD8dep_CCTTCGATCTGCGTAA-1,Dendritic cells +CD8dep_CCTTTCTAGTCAAGGC-1,Dendritic cells +CD8dep_CCTTTCTCACCACCAG-1,Granulocytes +CD8dep_CCTTTCTGTAAGAGAG-1,Dendritic cells +CD8dep_CCTTTCTGTCGCGAAA-1,Monocytes +CD8dep_CCTTTCTTCCAATGGT-1,Macrophages +CD8dep_CGAACATAGCAGCCTC-1,Monocytes +CD8dep_CGAACATCACATCCGG-1,Monocytes +CD8dep_CGAACATGTAAACCTC-1,Monocytes +CD8dep_CGAACATGTATTAGCC-1,Monocytes +CD8dep_CGAACATGTGATGTGG-1,Monocytes +CD8dep_CGAACATTCGCGCCAA-1,Macrophages +CD8dep_CGAACATTCGGCTTGG-1,Monocytes +CD8dep_CGAATGTAGACAAAGG-1,Dendritic cells +CD8dep_CGAATGTAGACGCAAC-1,Monocytes +CD8dep_CGAATGTAGACGCTTT-1,Monocytes +CD8dep_CGAATGTAGAGTACAT-1,Monocytes +CD8dep_CGAATGTAGATCCTGT-1,Monocytes +CD8dep_CGAATGTCAACTGCTA-1,Monocytes +CD8dep_CGAATGTCAGCTGTGC-1,Dendritic cells +CD8dep_CGAATGTCATGTCTCC-1,Monocytes +CD8dep_CGAATGTGTACCGCTG-1,Monocytes +CD8dep_CGAATGTTCAACACAC-1,Monocytes +CD8dep_CGACCTTAGTTAAGTG-1,Monocytes +CD8dep_CGACCTTCAGTAAGCG-1,Monocytes +CD8dep_CGACCTTCATCCCACT-1,Monocytes +CD8dep_CGACCTTGTTCCACGG-1,Monocytes +CD8dep_CGACCTTGTTTAGGAA-1,Monocytes +CD8dep_CGACCTTTCAACCATG-1,Dendritic cells +CD8dep_CGACCTTTCCAGATCA-1,Macrophages +CD8dep_CGACCTTTCGTTTATC-1,Monocytes +CD8dep_CGACCTTTCTTCTGGC-1,Monocytes +CD8dep_CGACTTCAGGACAGAA-1,Macrophages +CD8dep_CGACTTCAGTCGCCGT-1,Monocytes +CD8dep_CGACTTCCAAGCGCTC-1,Monocytes +CD8dep_CGACTTCCATATACCG-1,Monocytes +CD8dep_CGACTTCCATCCGTGG-1,Monocytes +CD8dep_CGACTTCCATGGTCTA-1,Monocytes +CD8dep_CGACTTCGTTAAAGTG-1,Monocytes +CD8dep_CGACTTCTCCACTGGG-1,Macrophages +CD8dep_CGAGAAGAGAAGAAGC-1,Monocytes +CD8dep_CGAGAAGAGACTAAGT-1,Monocytes +CD8dep_CGAGAAGCAACGATCT-1,Monocytes +CD8dep_CGAGAAGTCGCCCTTA-1,Dendritic cells +CD8dep_CGAGAAGTCGTATCAG-1,Monocytes +CD8dep_CGAGCACAGACAAGCC-1,Granulocytes +CD8dep_CGAGCACAGCGAAGGG-1,Monocytes +CD8dep_CGAGCACAGGCTAGGT-1,Monocytes +CD8dep_CGAGCACCAAATACAG-1,Monocytes +CD8dep_CGAGCACCACACCGAC-1,Monocytes +CD8dep_CGAGCACCAGTAAGAT-1,Monocytes +CD8dep_CGAGCACGTAAGAGGA-1,Monocytes +CD8dep_CGAGCACGTCTACCTC-1,Monocytes +CD8dep_CGAGCCAAGACAGACC-1,Monocytes +CD8dep_CGAGCCAAGCTCCCAG-1,Monocytes +CD8dep_CGAGCCACAGACGCAA-1,Dendritic cells +CD8dep_CGAGCCACATAGACTC-1,Monocytes +CD8dep_CGAGCCAGTCGAGATG-1,Monocytes +CD8dep_CGAGCCAGTTCTCATT-1,Monocytes +CD8dep_CGAGCCAGTTGAGTTC-1,Monocytes +CD8dep_CGATCGGAGGAGTCTG-1,Monocytes +CD8dep_CGATCGGCAACAACCT-1,Monocytes +CD8dep_CGATCGGCACGGCCAT-1,Monocytes +CD8dep_CGATCGGGTCCAGTTA-1,T cells +CD8dep_CGATCGGGTGCCTGTG-1,Monocytes +CD8dep_CGATGGCAGCGACGTA-1,Monocytes +CD8dep_CGATGGCGTAAATGAC-1,Monocytes +CD8dep_CGATGGCGTAAGAGGA-1,Monocytes +CD8dep_CGATGGCGTCTTGCGG-1,Monocytes +CD8dep_CGATGGCGTGCGCTTG-1,Granulocytes +CD8dep_CGATGGCTCCCTGACT-1,Monocytes +CD8dep_CGATGTAAGCCTTGAT-1,Monocytes +CD8dep_CGATGTAAGCTGTTCA-1,Monocytes +CD8dep_CGATGTAAGTATTGGA-1,Dendritic cells +CD8dep_CGATGTAAGTCCGTAT-1,Dendritic cells +CD8dep_CGATGTAGTCCAGTTA-1,Monocytes +CD8dep_CGATGTAGTCGGCATC-1,Monocytes +CD8dep_CGATGTAGTGTAATGA-1,Monocytes +CD8dep_CGATGTAGTTAAGAAC-1,Granulocytes +CD8dep_CGATGTAGTTTGTGTG-1,Monocytes +CD8dep_CGATGTATCTCTTGAT-1,Monocytes +CD8dep_CGATTGAAGGCTCTTA-1,Monocytes +CD8dep_CGATTGAAGTGGGATC-1,Granulocytes +CD8dep_CGATTGAAGTTGCAGG-1,Monocytes +CD8dep_CGATTGACATGGGACA-1,Dendritic cells +CD8dep_CGATTGAGTCACAAGG-1,Macrophages +CD8dep_CGATTGAGTCCGTCAG-1,Monocytes +CD8dep_CGATTGAGTGTTGAGG-1,Dendritic cells +CD8dep_CGATTGATCAGTACGT-1,Monocytes +CD8dep_CGATTGATCATGTCTT-1,Monocytes +CD8dep_CGATTGATCTGCTGCT-1,Macrophages +CD8dep_CGATTGATCTTCAACT-1,Dendritic cells +CD8dep_CGCCAAGAGCACCGCT-1,Dendritic cells +CD8dep_CGCCAAGAGCAGCCTC-1,Monocytes +CD8dep_CGCCAAGGTTGAGGTG-1,Monocytes +CD8dep_CGCGGTAAGACCACGA-1,Dendritic cells +CD8dep_CGCGGTAAGCCACCTG-1,Monocytes +CD8dep_CGCGGTAGTCTACCTC-1,Monocytes +CD8dep_CGCGGTAGTTGGTAAA-1,Monocytes +CD8dep_CGCGGTATCATGTGGT-1,Dendritic cells +CD8dep_CGCGGTATCCAGAAGG-1,Monocytes +CD8dep_CGCGTTTCACGTCAGC-1,Monocytes +CD8dep_CGCGTTTGTGTGACGA-1,Monocytes +CD8dep_CGCGTTTGTTAGAACA-1,Monocytes +CD8dep_CGCGTTTTCCTGTAGA-1,Monocytes +CD8dep_CGCGTTTTCTCCAACC-1,Macrophages +CD8dep_CGCGTTTTCTTAACCT-1,Macrophages +CD8dep_CGCTATCAGGCAGGTT-1,Monocytes +CD8dep_CGCTATCCATAGTAAG-1,Dendritic cells +CD8dep_CGCTATCGTGCAACGA-1,Monocytes +CD8dep_CGCTATCGTTCATGGT-1,Monocytes +CD8dep_CGCTATCGTTGGAGGT-1,Macrophages +CD8dep_CGCTATCGTTTGTTGG-1,Monocytes +CD8dep_CGCTATCTCAATCACG-1,Granulocytes +CD8dep_CGCTATCTCTGATACG-1,Monocytes +CD8dep_CGCTGGAAGCTAAACA-1,Monocytes +CD8dep_CGCTGGACACCAGTTA-1,Monocytes +CD8dep_CGCTGGACACTGAAGG-1,Monocytes +CD8dep_CGCTGGACAGAGCCAA-1,Monocytes +CD8dep_CGCTGGACAGCCAATT-1,Monocytes +CD8dep_CGCTGGACATAAGACA-1,Dendritic cells +CD8dep_CGCTGGAGTAAGTTCC-1,Monocytes +CD8dep_CGCTGGAGTGACTACT-1,Dendritic cells +CD8dep_CGCTGGATCCGAATGT-1,Monocytes +CD8dep_CGCTGGATCGAGAACG-1,Monocytes +CD8dep_CGCTTCAAGTAGCGGT-1,Monocytes +CD8dep_CGCTTCAAGTTTGCGT-1,Monocytes +CD8dep_CGCTTCACAAACTGCT-1,Monocytes +CD8dep_CGCTTCACACTACAGT-1,Monocytes +CD8dep_CGCTTCACAGTCGATT-1,Monocytes +CD8dep_CGCTTCACATGCGCAC-1,Macrophages +CD8dep_CGCTTCAGTCTCCCTA-1,Granulocytes +CD8dep_CGCTTCAGTGGTGTAG-1,Monocytes +CD8dep_CGCTTCATCTGTCTAT-1,Monocytes +CD8dep_CGGACACCACAGTCGC-1,Monocytes +CD8dep_CGGACACGTGTGAATA-1,Monocytes +CD8dep_CGGACACTCAAACCGT-1,Monocytes +CD8dep_CGGACACTCACCTTAT-1,Dendritic cells +CD8dep_CGGACACTCATATCGG-1,Monocytes +CD8dep_CGGACACTCATGGTCA-1,Monocytes +CD8dep_CGGACACTCCGAGCCA-1,Monocytes +CD8dep_CGGACACTCTTGTCAT-1,Monocytes +CD8dep_CGGACGTAGGATGGTC-1,Monocytes +CD8dep_CGGACGTCAAGCCGCT-1,Monocytes +CD8dep_CGGACGTCACAACGTT-1,Monocytes +CD8dep_CGGACGTCACCTCGTT-1,Monocytes +CD8dep_CGGACGTCACGTGAGA-1,Monocytes +CD8dep_CGGACGTCACTCAGGC-1,Macrophages +CD8dep_CGGACGTCATCGATTG-1,Monocytes +CD8dep_CGGACGTGTTAAGATG-1,Monocytes +CD8dep_CGGACGTGTTACCGAT-1,Monocytes +CD8dep_CGGACGTTCTCGGACG-1,Monocytes +CD8dep_CGGACTGAGCGATATA-1,Monocytes +CD8dep_CGGACTGAGTACACCT-1,Monocytes +CD8dep_CGGACTGCATACGCTA-1,Monocytes +CD8dep_CGGACTGGTAAGTGTA-1,Monocytes +CD8dep_CGGACTGGTCGTCTTC-1,Monocytes +CD8dep_CGGACTGGTTAAGAAC-1,Monocytes +CD8dep_CGGACTGTCACCCGAG-1,Monocytes +CD8dep_CGGACTGTCCCTCAGT-1,Monocytes +CD8dep_CGGACTGTCGTAGGTT-1,Macrophages +CD8dep_CGGAGCTAGACGCTTT-1,Monocytes +CD8dep_CGGAGCTCACAGACAG-1,Monocytes +CD8dep_CGGAGCTGTGAGGGTT-1,Monocytes +CD8dep_CGGAGCTGTTGATTCG-1,Monocytes +CD8dep_CGGAGCTGTTGTGGCC-1,Dendritic cells +CD8dep_CGGAGCTTCGATCCCT-1,Dendritic cells +CD8dep_CGGAGTCAGACTACAA-1,Monocytes +CD8dep_CGGAGTCAGCAGCGTA-1,Dendritic cells +CD8dep_CGGAGTCGTTCAGGCC-1,Monocytes +CD8dep_CGGAGTCTCCATGCTC-1,Monocytes +CD8dep_CGGCTAGAGATATGGT-1,Monocytes +CD8dep_CGGCTAGCATGTCCTC-1,Granulocytes +CD8dep_CGGCTAGGTATTCGTG-1,Monocytes +CD8dep_CGGCTAGGTCTTCGTC-1,Monocytes +CD8dep_CGGCTAGTCCGAGCCA-1,Monocytes +CD8dep_CGGCTAGTCGCCAAAT-1,Monocytes +CD8dep_CGGCTAGTCGTTTATC-1,Monocytes +CD8dep_CGGGTCACACCAACCG-1,Dendritic cells +CD8dep_CGGGTCACAGTATCTG-1,Monocytes +CD8dep_CGGGTCACATACGCTA-1,Monocytes +CD8dep_CGGGTCACATCTACGA-1,Monocytes +CD8dep_CGGGTCAGTCCCGACA-1,Monocytes +CD8dep_CGGGTCAGTTTGACTG-1,Monocytes +CD8dep_CGGGTCATCGGAGCAA-1,Monocytes +CD8dep_CGGTTAAGTTCGCGAC-1,Monocytes +CD8dep_CGGTTAATCTACTCAT-1,Monocytes +CD8dep_CGGTTAATCTCGTATT-1,Monocytes +CD8dep_CGTAGCGAGATGTGGC-1,Monocytes +CD8dep_CGTAGCGCACTCAGGC-1,Monocytes +CD8dep_CGTAGCGCACTGTTAG-1,Monocytes +CD8dep_CGTAGCGCAGGATTGG-1,Monocytes +CD8dep_CGTAGCGCATTAGCCA-1,Dendritic cells +CD8dep_CGTAGCGGTCCAAGTT-1,Monocytes +CD8dep_CGTAGCGGTGTGTGCC-1,Monocytes +CD8dep_CGTAGCGTCATCGCTC-1,Monocytes +CD8dep_CGTAGCGTCCTATTCA-1,Monocytes +CD8dep_CGTAGCGTCTACGAGT-1,Monocytes +CD8dep_CGTAGGCAGAAACCAT-1,Macrophages +CD8dep_CGTAGGCAGACTAAGT-1,Dendritic cells +CD8dep_CGTAGGCAGTACGATA-1,Monocytes +CD8dep_CGTAGGCAGTCGTTTG-1,Monocytes +CD8dep_CGTAGGCAGTGTGGCA-1,Granulocytes +CD8dep_CGTAGGCAGTTGCAGG-1,Monocytes +CD8dep_CGTAGGCCAAAGCAAT-1,Monocytes +CD8dep_CGTAGGCCAAGTACCT-1,Monocytes +CD8dep_CGTAGGCCACGCGAAA-1,Monocytes +CD8dep_CGTAGGCGTAGAGTGC-1,Dendritic cells +CD8dep_CGTAGGCTCACAACGT-1,Monocytes +CD8dep_CGTAGGCTCCTCCTAG-1,Monocytes +CD8dep_CGTAGGCTCTATCCCG-1,Dendritic cells +CD8dep_CGTCACTAGAGCCTAG-1,Monocytes +CD8dep_CGTCACTAGTGTGGCA-1,Monocytes +CD8dep_CGTCACTCACCTCGTT-1,Monocytes +CD8dep_CGTCACTCAGCGTAAG-1,Monocytes +CD8dep_CGTCACTCAGGACGTA-1,Monocytes +CD8dep_CGTCACTCAGTCACTA-1,Monocytes +CD8dep_CGTCACTGTAAGGGAA-1,Monocytes +CD8dep_CGTCACTGTAGCACGA-1,Monocytes +CD8dep_CGTCACTGTCACCTAA-1,Monocytes +CD8dep_CGTCACTGTCTTGATG-1,Dendritic cells +CD8dep_CGTCACTGTGGGTATG-1,Monocytes +CD8dep_CGTCACTTCAAGAAGT-1,Dendritic cells +CD8dep_CGTCACTTCTGATACG-1,Monocytes +CD8dep_CGTCACTTCTTGGGTA-1,Monocytes +CD8dep_CGTCAGGCAATAAGCA-1,Monocytes +CD8dep_CGTCAGGGTCGATTGT-1,Macrophages +CD8dep_CGTCAGGGTTATGCGT-1,Monocytes +CD8dep_CGTCAGGTCCAGTAGT-1,Monocytes +CD8dep_CGTCAGGTCCCAACGG-1,Monocytes +CD8dep_CGTCCATAGAGTACCG-1,Monocytes +CD8dep_CGTCCATAGTTTAGGA-1,Macrophages +CD8dep_CGTCCATCACAGGTTT-1,Monocytes +CD8dep_CGTCCATCACCTTGTC-1,Monocytes +CD8dep_CGTCCATCACTATCTT-1,Monocytes +CD8dep_CGTCCATCATTTGCCC-1,Monocytes +CD8dep_CGTCCATGTATAAACG-1,Monocytes +CD8dep_CGTCCATTCTGTCTCG-1,Macrophages +CD8dep_CGTCCATTCTTGTATC-1,Macrophages +CD8dep_CGTCTACAGACTGGGT-1,Monocytes +CD8dep_CGTCTACAGGCAGTCA-1,Dendritic cells +CD8dep_CGTCTACAGTCCGTAT-1,Monocytes +CD8dep_CGTCTACCACAGTCGC-1,Dendritic cells +CD8dep_CGTCTACGTCGGATCC-1,Monocytes +CD8dep_CGTCTACGTCTAACGT-1,Monocytes +CD8dep_CGTCTACGTTGCTCCT-1,Monocytes +CD8dep_CGTCTACTCGGCGGTT-1,Monocytes +CD8dep_CGTGAGCAGCGGATCA-1,Monocytes +CD8dep_CGTGAGCCACAGGAGT-1,Monocytes +CD8dep_CGTGAGCTCGCGCCAA-1,Macrophages +CD8dep_CGTGTAAAGAACTGTA-1,Monocytes +CD8dep_CGTGTAAAGGGCTCTC-1,Monocytes +CD8dep_CGTGTAAAGTCACGCC-1,Monocytes +CD8dep_CGTGTAACAGTACACT-1,Dendritic cells +CD8dep_CGTGTAACAGTATCTG-1,Monocytes +CD8dep_CGTGTAAGTAAATGAC-1,Monocytes +CD8dep_CGTGTAAGTACGAAAT-1,Granulocytes +CD8dep_CGTGTAATCGCATGGC-1,Monocytes +CD8dep_CGTGTAATCGTAGGTT-1,Monocytes +CD8dep_CGTGTAATCTCTGTCG-1,Monocytes +CD8dep_CGTGTCTAGGTAAACT-1,Monocytes +CD8dep_CGTGTCTCAAACAACA-1,Monocytes +CD8dep_CGTGTCTCAGGCTCAC-1,Monocytes +CD8dep_CGTGTCTCATGACGGA-1,Monocytes +CD8dep_CGTGTCTGTTTAGGAA-1,Monocytes +CD8dep_CGTGTCTTCACAAACC-1,Macrophages +CD8dep_CGTGTCTTCACTTATC-1,Dendritic cells +CD8dep_CGTGTCTTCCGCATCT-1,Monocytes +CD8dep_CGTGTCTTCTTAACCT-1,Monocytes +CD8dep_CGTTAGAAGGCTATCT-1,Monocytes +CD8dep_CGTTAGAAGTAGGCCA-1,Monocytes +CD8dep_CGTTAGACAATGAATG-1,Monocytes +CD8dep_CGTTAGAGTCCCTTGT-1,Monocytes +CD8dep_CGTTAGAGTTGATTCG-1,Monocytes +CD8dep_CGTTAGATCAATAAGG-1,Macrophages +CD8dep_CGTTAGATCCTATGTT-1,Monocytes +CD8dep_CGTTAGATCGAACGGA-1,Monocytes +CD8dep_CGTTAGATCGGTCCGA-1,Monocytes +CD8dep_CGTTCTGAGGAGCGAG-1,Monocytes +CD8dep_CGTTCTGCATCGGACC-1,Monocytes +CD8dep_CGTTCTGGTAGTAGTA-1,Monocytes +CD8dep_CGTTCTGGTGTTAAGA-1,Monocytes +CD8dep_CGTTCTGTCTCAAACG-1,T cells +CD8dep_CGTTGGGAGCGATTCT-1,Monocytes +CD8dep_CGTTGGGAGGCGCTCT-1,Monocytes +CD8dep_CGTTGGGAGTAGTGCG-1,Monocytes +CD8dep_CGTTGGGCAATTCCTT-1,Monocytes +CD8dep_CGTTGGGCACAGTCGC-1,Monocytes +CD8dep_CGTTGGGGTCTTCGTC-1,Monocytes +CD8dep_CGTTGGGTCCGCAGTG-1,Monocytes +CD8dep_CGTTGGGTCGCCTGAG-1,Dendritic cells +CD8dep_CTAACTTAGCTAGGCA-1,Monocytes +CD8dep_CTAACTTCACCGCTAG-1,Monocytes +CD8dep_CTAACTTCAGGTCCAC-1,Monocytes +CD8dep_CTAACTTGTCCATCCT-1,Dendritic cells +CD8dep_CTAACTTGTCCTAGCG-1,Monocytes +CD8dep_CTAACTTGTCGCTTTC-1,Monocytes +CD8dep_CTAACTTGTCGTCTTC-1,Monocytes +CD8dep_CTAACTTTCGGCATCG-1,Monocytes +CD8dep_CTAAGACAGATGGGTC-1,Monocytes +CD8dep_CTAAGACAGCTAACAA-1,Monocytes +CD8dep_CTAAGACAGTGGTCCC-1,Monocytes +CD8dep_CTAAGACAGTTTAGGA-1,Monocytes +CD8dep_CTAAGACCACACCGCA-1,Macrophages +CD8dep_CTAAGACCAGGGTACA-1,Monocytes +CD8dep_CTAAGACCATCCCATC-1,Monocytes +CD8dep_CTAAGACCATTAACCG-1,Monocytes +CD8dep_CTAAGACGTAGGCTGA-1,Monocytes +CD8dep_CTAAGACGTATAGGTA-1,Dendritic cells +CD8dep_CTAAGACGTCAAGCGA-1,Monocytes +CD8dep_CTAAGACGTTGTGGAG-1,Monocytes +CD8dep_CTAAGACTCGTCACGG-1,Monocytes +CD8dep_CTAAGACTCTGTCTCG-1,Dendritic cells +CD8dep_CTAAGACTCTTTACAC-1,Monocytes +CD8dep_CTAATGGAGCCGATTT-1,Monocytes +CD8dep_CTAATGGAGGCGATAC-1,Monocytes +CD8dep_CTAATGGAGGGTGTTG-1,Monocytes +CD8dep_CTAATGGCACAGACTT-1,Granulocytes +CD8dep_CTAATGGGTACCGCTG-1,Monocytes +CD8dep_CTAATGGTCGGAAACG-1,Monocytes +CD8dep_CTAATGGTCTCTTATG-1,Macrophages +CD8dep_CTACACCAGGAGCGTT-1,Monocytes +CD8dep_CTACACCAGGCAGGTT-1,Monocytes +CD8dep_CTACACCCATCGATGT-1,Monocytes +CD8dep_CTACACCTCAACACCA-1,Monocytes +CD8dep_CTACACCTCAAGAAGT-1,Monocytes +CD8dep_CTACACCTCTGCGGCA-1,Monocytes +CD8dep_CTACATTAGCAGCGTA-1,Dendritic cells +CD8dep_CTACATTAGCGATCCC-1,Monocytes +CD8dep_CTACATTCACGGCCAT-1,Monocytes +CD8dep_CTACATTCAGTCAGAG-1,Monocytes +CD8dep_CTACATTCAGTTCCCT-1,Monocytes +CD8dep_CTACATTGTGAAGGCT-1,Monocytes +CD8dep_CTACATTTCTCGATGA-1,Dendritic cells +CD8dep_CTACATTTCTTACCGC-1,Monocytes +CD8dep_CTACCCACAGTGAGTG-1,Monocytes +CD8dep_CTACCCACATACCATG-1,Monocytes +CD8dep_CTACCCAGTGCGAAAC-1,Monocytes +CD8dep_CTACCCAGTTACGTCA-1,Adipocytes +CD8dep_CTACCCAGTTATGTGC-1,Monocytes +CD8dep_CTACGTCAGTGAAGAG-1,Monocytes +CD8dep_CTACGTCCACAGATTC-1,Monocytes +CD8dep_CTACGTCCATGTAAGA-1,Monocytes +CD8dep_CTACGTCGTCAAGCGA-1,Monocytes +CD8dep_CTACGTCTCAACGAAA-1,Granulocytes +CD8dep_CTAGAGTAGATAGGAG-1,Monocytes +CD8dep_CTAGAGTAGATCCCAT-1,Monocytes +CD8dep_CTAGAGTAGTGTTAGA-1,Monocytes +CD8dep_CTAGAGTCACGAGGTA-1,Monocytes +CD8dep_CTAGAGTCATTGGCGC-1,Monocytes +CD8dep_CTAGAGTTCAAGGCTT-1,Monocytes +CD8dep_CTAGAGTTCAGGTAAA-1,Monocytes +CD8dep_CTAGAGTTCATAACCG-1,Granulocytes +CD8dep_CTAGAGTTCTCAACTT-1,Monocytes +CD8dep_CTAGCCTAGAGACGAA-1,Monocytes +CD8dep_CTAGCCTAGAGACTTA-1,Monocytes +CD8dep_CTAGCCTAGATGCCAG-1,Macrophages +CD8dep_CTAGCCTAGGCTACGA-1,Monocytes +CD8dep_CTAGCCTCAACTGGCC-1,Monocytes +CD8dep_CTAGCCTCAATGGAAT-1,Dendritic cells +CD8dep_CTAGCCTCACAGGAGT-1,Monocytes +CD8dep_CTAGCCTCAGATGGCA-1,Monocytes +CD8dep_CTAGCCTCAGCCAGAA-1,Granulocytes +CD8dep_CTAGCCTTCAAACCAC-1,Monocytes +CD8dep_CTAGCCTTCAGCACAT-1,Macrophages +CD8dep_CTAGTGACAGGGTACA-1,Monocytes +CD8dep_CTAGTGAGTCTAGTCA-1,Monocytes +CD8dep_CTAGTGAGTTCTCATT-1,Granulocytes +CD8dep_CTAGTGAGTTGTACAC-1,Monocytes +CD8dep_CTAGTGATCGCAGGCT-1,Monocytes +CD8dep_CTAGTGATCGTCTGAA-1,Dendritic cells +CD8dep_CTAGTGATCTATCGCC-1,Dendritic cells +CD8dep_CTAGTGATCTGCGACG-1,Monocytes +CD8dep_CTCACACCACACCGCA-1,Monocytes +CD8dep_CTCACACCATTGCGGC-1,Monocytes +CD8dep_CTCACACGTAAGGGCT-1,Monocytes +CD8dep_CTCACACGTGGTGTAG-1,Monocytes +CD8dep_CTCACACGTGTGGCTC-1,Monocytes +CD8dep_CTCACACGTGTTGGGA-1,Monocytes +CD8dep_CTCACACTCAAGATCC-1,Macrophages +CD8dep_CTCACACTCTTGAGAC-1,Dendritic cells +CD8dep_CTCAGAACAACCGCCA-1,Monocytes +CD8dep_CTCAGAACATATACCG-1,Monocytes +CD8dep_CTCAGAAGTAGAGGAA-1,Monocytes +CD8dep_CTCAGAAGTCGAAAGC-1,Monocytes +CD8dep_CTCAGAATCTACGAGT-1,Dendritic cells +CD8dep_CTCATTAAGTCCATAC-1,Monocytes +CD8dep_CTCATTAGTAGCTTGT-1,Macrophages +CD8dep_CTCCTAGAGTTAGCGG-1,Monocytes +CD8dep_CTCCTAGCACGGCGTT-1,Monocytes +CD8dep_CTCCTAGCAGATCCAT-1,Monocytes +CD8dep_CTCCTAGGTACCGTTA-1,Macrophages +CD8dep_CTCCTAGGTATAATGG-1,Monocytes +CD8dep_CTCCTAGTCCTAGGGC-1,Dendritic cells +CD8dep_CTCGAAAAGCCACTAT-1,Monocytes +CD8dep_CTCGAAAAGCGTTCCG-1,Monocytes +CD8dep_CTCGAAAAGCTGAACG-1,Monocytes +CD8dep_CTCGAAAAGTACGTTC-1,Monocytes +CD8dep_CTCGAAAGTAAGAGGA-1,Monocytes +CD8dep_CTCGAAAGTGTGGCTC-1,Monocytes +CD8dep_CTCGAAATCCAGTATG-1,Dendritic cells +CD8dep_CTCGAAATCTACCTGC-1,Monocytes +CD8dep_CTCGAGGAGAACTGTA-1,Macrophages +CD8dep_CTCGAGGAGTCATCCA-1,Monocytes +CD8dep_CTCGAGGGTCAAAGCG-1,Granulocytes +CD8dep_CTCGAGGGTCTAGCGC-1,Monocytes +CD8dep_CTCGAGGTCATGGTCA-1,Dendritic cells +CD8dep_CTCGGAGAGTTCCACA-1,Monocytes +CD8dep_CTCGGAGCACACCGCA-1,Monocytes +CD8dep_CTCGGAGCACGCCAGT-1,Monocytes +CD8dep_CTCGGAGTCACCGGGT-1,Monocytes +CD8dep_CTCGGAGTCCTAAGTG-1,Monocytes +CD8dep_CTCGGGAAGGAGTCTG-1,Monocytes +CD8dep_CTCGGGACACCCATTC-1,Monocytes +CD8dep_CTCGGGACAGGCGATA-1,Monocytes +CD8dep_CTCGGGACATGGTAGG-1,Monocytes +CD8dep_CTCGGGAGTGCAACTT-1,Monocytes +CD8dep_CTCGGGAGTTCGCGAC-1,Monocytes +CD8dep_CTCGGGATCAGGTAAA-1,Monocytes +CD8dep_CTCGGGATCGCCCTTA-1,Monocytes +CD8dep_CTCGGGATCTTCGAGA-1,Monocytes +CD8dep_CTCGTACAGAGGGATA-1,Monocytes +CD8dep_CTCGTACAGGGTGTGT-1,Monocytes +CD8dep_CTCGTACCAGAGTGTG-1,Macrophages +CD8dep_CTCGTACGTAGTGAAT-1,Dendritic cells +CD8dep_CTCGTACGTCCTGCTT-1,Monocytes +CD8dep_CTCGTACGTCGAAAGC-1,Granulocytes +CD8dep_CTCGTACTCAGATAAG-1,Monocytes +CD8dep_CTCGTACTCGAACTGT-1,Monocytes +CD8dep_CTCGTACTCTGCTGTC-1,Monocytes +CD8dep_CTCGTCAAGCCGCCTA-1,Dendritic cells +CD8dep_CTCGTCAAGGAGTAGA-1,Dendritic cells +CD8dep_CTCGTCACACAGGTTT-1,Monocytes +CD8dep_CTCGTCACAGGTCCAC-1,Monocytes +CD8dep_CTCGTCAGTAGCGTAG-1,Monocytes +CD8dep_CTCGTCAGTCAGAGGT-1,Monocytes +CD8dep_CTCGTCAGTCCCTTGT-1,Dendritic cells +CD8dep_CTCGTCAGTGTGACCC-1,Monocytes +CD8dep_CTCGTCAGTTTCCACC-1,Monocytes +CD8dep_CTCGTCATCAATCACG-1,Dendritic cells +CD8dep_CTCGTCATCCCAGGTG-1,Monocytes +CD8dep_CTCTAATAGGCTCAGA-1,Monocytes +CD8dep_CTCTAATCAAGCGCTC-1,Monocytes +CD8dep_CTCTAATCAGGTGGAT-1,Dendritic cells +CD8dep_CTCTAATCATCACGAT-1,Monocytes +CD8dep_CTCTAATGTACCAGTT-1,Monocytes +CD8dep_CTCTAATGTATATGAG-1,Granulocytes +CD8dep_CTCTAATGTATCAGTC-1,Monocytes +CD8dep_CTCTAATGTCTAACGT-1,Monocytes +CD8dep_CTCTACGAGGACATTA-1,Monocytes +CD8dep_CTCTACGAGGATGGAA-1,Monocytes +CD8dep_CTCTACGGTAGAGTGC-1,Monocytes +CD8dep_CTCTACGTCCAAAGTC-1,Monocytes +CD8dep_CTCTACGTCTTGACGA-1,Dendritic cells +CD8dep_CTCTGGTAGATGCGAC-1,Macrophages +CD8dep_CTCTGGTAGCTACCTA-1,Monocytes +CD8dep_CTCTGGTAGGTTCCTA-1,Dendritic cells +CD8dep_CTCTGGTCAACGATGG-1,Monocytes +CD8dep_CTCTGGTCACACAGAG-1,Monocytes +CD8dep_CTCTGGTGTACAGTTC-1,Monocytes +CD8dep_CTCTGGTGTCCAACTA-1,Monocytes +CD8dep_CTCTGGTGTGTCCTCT-1,Monocytes +CD8dep_CTCTGGTGTTCATGGT-1,Monocytes +CD8dep_CTCTGGTGTTCGAATC-1,Monocytes +CD8dep_CTCTGGTTCGTGGTCG-1,Dendritic cells +CD8dep_CTCTGGTTCTGTTGAG-1,Monocytes +CD8dep_CTCTGGTTCTTGCAAG-1,Monocytes +CD8dep_CTGAAACAGAGGACGG-1,Monocytes +CD8dep_CTGAAACCACCGCTAG-1,Monocytes +CD8dep_CTGAAACCAGCGTAAG-1,Monocytes +CD8dep_CTGAAACCAGTCGATT-1,Monocytes +CD8dep_CTGAAACCATCACGTA-1,Monocytes +CD8dep_CTGAAACTCTCGAGTA-1,Monocytes +CD8dep_CTGAAGTAGAGCTATA-1,Monocytes +CD8dep_CTGAAGTAGAGTGACC-1,Macrophages +CD8dep_CTGAAGTCACAGAGGT-1,Monocytes +CD8dep_CTGAAGTCACGAAAGC-1,Monocytes +CD8dep_CTGAAGTCAGACAAGC-1,Monocytes +CD8dep_CTGAAGTGTGCTCTTC-1,Macrophages +CD8dep_CTGAAGTGTGTAACGG-1,Macrophages +CD8dep_CTGAAGTTCGCGATCG-1,Monocytes +CD8dep_CTGATAGAGAAACCAT-1,Monocytes +CD8dep_CTGATAGAGACATAAC-1,Monocytes +CD8dep_CTGATAGAGTGAACAT-1,Monocytes +CD8dep_CTGATAGCAAGTCTGT-1,Macrophages +CD8dep_CTGATAGCACCGATAT-1,Monocytes +CD8dep_CTGATAGCAGATCGGA-1,Monocytes +CD8dep_CTGATAGCAGGGTTAG-1,Monocytes +CD8dep_CTGATAGCAGTTCATG-1,Monocytes +CD8dep_CTGATAGGTCAGAAGC-1,Macrophages +CD8dep_CTGATAGGTCCCGACA-1,Monocytes +CD8dep_CTGATAGGTTACGTCA-1,Monocytes +CD8dep_CTGATAGGTTCATGGT-1,Monocytes +CD8dep_CTGATAGTCCCTGACT-1,Monocytes +CD8dep_CTGATAGTCCGTAGGC-1,Monocytes +CD8dep_CTGATAGTCCTAGTGA-1,Dendritic cells +CD8dep_CTGATCCAGAATTGTG-1,Monocytes +CD8dep_CTGATCCAGTCAAGCG-1,Monocytes +CD8dep_CTGATCCCAATGCCAT-1,Dendritic cells +CD8dep_CTGATCCCATTGTGCA-1,Monocytes +CD8dep_CTGATCCCATTTGCTT-1,Dendritic cells +CD8dep_CTGATCCGTAGTGAAT-1,Monocytes +CD8dep_CTGATCCGTCTTCTCG-1,Monocytes +CD8dep_CTGATCCGTGAAATCA-1,Monocytes +CD8dep_CTGATCCGTTCAGTAC-1,Monocytes +CD8dep_CTGATCCTCTAGCACA-1,Monocytes +CD8dep_CTGATCCTCTCGCTTG-1,Macrophages +CD8dep_CTGCCTAAGTACGACG-1,Dendritic cells +CD8dep_CTGCCTACACAAGTAA-1,Dendritic cells +CD8dep_CTGCCTAGTACTTGAC-1,Macrophages +CD8dep_CTGCCTAGTCAGAATA-1,NK cells +CD8dep_CTGCCTATCCGAGCCA-1,Dendritic cells +CD8dep_CTGCCTATCTACGAGT-1,Dendritic cells +CD8dep_CTGCCTATCTTTAGTC-1,Monocytes +CD8dep_CTGCGGAAGCGATGAC-1,Monocytes +CD8dep_CTGCGGACAGGAATGC-1,Dendritic cells +CD8dep_CTGCGGACAGGCTGAA-1,Macrophages +CD8dep_CTGCGGACATCGGGTC-1,Monocytes +CD8dep_CTGCGGAGTTCGTCTC-1,Monocytes +CD8dep_CTGCGGATCAGGCAAG-1,Monocytes +CD8dep_CTGCGGATCCACTGGG-1,Monocytes +CD8dep_CTGCGGATCGCCATAA-1,Macrophages +CD8dep_CTGCTGTAGTGTACCT-1,Monocytes +CD8dep_CTGCTGTCACCAGTTA-1,Macrophages +CD8dep_CTGCTGTGTAGCACGA-1,Monocytes +CD8dep_CTGCTGTGTCCGAAGA-1,Monocytes +CD8dep_CTGCTGTTCCAGATCA-1,Monocytes +CD8dep_CTGCTGTTCGCAAACT-1,Dendritic cells +CD8dep_CTGGTCTAGTACGACG-1,T cells +CD8dep_CTGGTCTCAGATCCAT-1,Dendritic cells +CD8dep_CTGGTCTGTGCACGAA-1,Monocytes +CD8dep_CTGGTCTGTTATCACG-1,Monocytes +CD8dep_CTGGTCTGTTTAGCTG-1,Dendritic cells +CD8dep_CTGGTCTTCTTCTGGC-1,Monocytes +CD8dep_CTGTGCTAGAGTTGGC-1,Dendritic cells +CD8dep_CTGTGCTAGCATGGCA-1,Monocytes +CD8dep_CTGTGCTAGCGGATCA-1,Monocytes +CD8dep_CTGTGCTAGTACGCCC-1,Dendritic cells +CD8dep_CTGTGCTAGTTTAGGA-1,Monocytes +CD8dep_CTGTGCTCACGGTAGA-1,Monocytes +CD8dep_CTGTGCTGTAAGGGCT-1,Monocytes +CD8dep_CTGTGCTGTACTTAGC-1,Monocytes +CD8dep_CTGTGCTTCATAAAGG-1,Dendritic cells +CD8dep_CTGTGCTTCCGCGGTA-1,Monocytes +CD8dep_CTGTGCTTCGCCTGAG-1,Monocytes +CD8dep_CTGTTTAAGATCCTGT-1,Monocytes +CD8dep_CTGTTTAAGATGCCTT-1,Monocytes +CD8dep_CTGTTTAAGTGCTGCC-1,Monocytes +CD8dep_CTGTTTACAAAGTCAA-1,Monocytes +CD8dep_CTGTTTACAAAGTGCG-1,Monocytes +CD8dep_CTGTTTACAAGCGAGT-1,Monocytes +CD8dep_CTGTTTACATAGAAAC-1,Monocytes +CD8dep_CTGTTTAGTGTGCCTG-1,Monocytes +CD8dep_CTGTTTAGTTATGTGC-1,Monocytes +CD8dep_CTGTTTAGTTGTCGCG-1,T cells +CD8dep_CTGTTTATCCATGAAC-1,Monocytes +CD8dep_CTGTTTATCTGCCAGG-1,Monocytes +CD8dep_CTGTTTATCTGCGTAA-1,Dendritic cells +CD8dep_CTGTTTATCTTGCAAG-1,Monocytes +CD8dep_CTTAACTAGACAATAC-1,Dendritic cells +CD8dep_CTTAACTAGATACACA-1,Monocytes +CD8dep_CTTAACTAGTCTCAAC-1,Monocytes +CD8dep_CTTAACTCAGGGTATG-1,Macrophages +CD8dep_CTTAACTGTCCGAACC-1,Monocytes +CD8dep_CTTAACTGTCTGATCA-1,Monocytes +CD8dep_CTTAACTGTGGTCTCG-1,Monocytes +CD8dep_CTTAACTTCAGTTGAC-1,Monocytes +CD8dep_CTTAACTTCTGGCGAC-1,Macrophages +CD8dep_CTTACCGAGACAAAGG-1,Monocytes +CD8dep_CTTACCGAGCCACTAT-1,Monocytes +CD8dep_CTTACCGAGTCCAGGA-1,Monocytes +CD8dep_CTTACCGAGTGTGGCA-1,Monocytes +CD8dep_CTTACCGCAGCCAGAA-1,Granulocytes +CD8dep_CTTACCGCAGGATCGA-1,Monocytes +CD8dep_CTTACCGCATATACCG-1,Monocytes +CD8dep_CTTACCGCATTAGCCA-1,Dendritic cells +CD8dep_CTTACCGGTAAGGGAA-1,Monocytes +CD8dep_CTTACCGGTAGTAGTA-1,T cells +CD8dep_CTTACCGGTCATACTG-1,Monocytes +CD8dep_CTTACCGGTTCAACCA-1,Monocytes +CD8dep_CTTACCGTCATGTCCC-1,Monocytes +CD8dep_CTTAGGAAGGCAAAGA-1,Monocytes +CD8dep_CTTAGGAAGTAGGTGC-1,Monocytes +CD8dep_CTTAGGACAAGTTAAG-1,Monocytes +CD8dep_CTTAGGACAGATCGGA-1,Monocytes +CD8dep_CTTAGGACATGACGGA-1,Monocytes +CD8dep_CTTAGGAGTAGCGCTC-1,Macrophages +CD8dep_CTTAGGAGTATAGGGC-1,Monocytes +CD8dep_CTTAGGAGTCTAAACC-1,Macrophages +CD8dep_CTTAGGAGTGTATGGG-1,Macrophages +CD8dep_CTTAGGATCATTGCGA-1,Monocytes +CD8dep_CTTAGGATCCTTAATC-1,Dendritic cells +CD8dep_CTTAGGATCTTTAGGG-1,Monocytes +CD8dep_CTTCTCTAGCGATAGC-1,Monocytes +CD8dep_CTTCTCTAGGACAGAA-1,Monocytes +CD8dep_CTTCTCTAGGCCGAAT-1,Monocytes +CD8dep_CTTCTCTAGGGTCGAT-1,Monocytes +CD8dep_CTTCTCTCAATCTGCA-1,Monocytes +CD8dep_CTTCTCTCACATCTTT-1,Monocytes +CD8dep_CTTCTCTCATTGAGCT-1,Monocytes +CD8dep_CTTCTCTGTCGCATAT-1,Monocytes +CD8dep_CTTCTCTGTCTCATCC-1,Monocytes +CD8dep_CTTCTCTGTTATCACG-1,Monocytes +CD8dep_CTTGGCTAGGACAGAA-1,Monocytes +CD8dep_CTTGGCTCATAACCTG-1,Macrophages +CD8dep_CTTGGCTGTCGAATCT-1,Monocytes +CD8dep_CTTGGCTTCTCGCTTG-1,Monocytes +CD8dep_CTTTGCGAGGGCTTCC-1,Dendritic cells +CD8dep_CTTTGCGAGTGTGAAT-1,Monocytes +CD8dep_CTTTGCGCAGGCTGAA-1,Monocytes +CD8dep_CTTTGCGGTACGAAAT-1,Macrophages +CD8dep_CTTTGCGGTCTTCTCG-1,Monocytes +CD8dep_CTTTGCGTCGGCGCAT-1,Dendritic cells +CD8dep_CTTTGCGTCGTTACGA-1,Monocytes +CD8dep_GAAACTCAGACCTTTG-1,Monocytes +CD8dep_GAAACTCCAAGTCATC-1,Dendritic cells +CD8dep_GAAACTCCATACGCCG-1,Monocytes +CD8dep_GAAACTCTCATCGATG-1,Monocytes +CD8dep_GAAATGAAGACAGACC-1,Monocytes +CD8dep_GAAATGAAGCAAATCA-1,Monocytes +CD8dep_GAAATGAAGGGAACGG-1,Monocytes +CD8dep_GAAATGAAGTGTCCAT-1,Monocytes +CD8dep_GAAATGACATATACGC-1,Granulocytes +CD8dep_GAAATGAGTAAGAGGA-1,Dendritic cells +CD8dep_GAAATGAGTTTGACAC-1,Monocytes +CD8dep_GAAATGATCACAGGCC-1,Monocytes +CD8dep_GAAATGATCTCAAGTG-1,Monocytes +CD8dep_GAACATCAGATCCGAG-1,Dendritic cells +CD8dep_GAACATCAGATGCCAG-1,Monocytes +CD8dep_GAACATCAGCTGTCTA-1,Monocytes +CD8dep_GAACATCAGGTAGCTG-1,Monocytes +CD8dep_GAACATCAGTCTTGCA-1,Monocytes +CD8dep_GAACATCCACGGCCAT-1,Monocytes +CD8dep_GAACATCGTCGCGTGT-1,Monocytes +CD8dep_GAACATCTCAGCTCTC-1,Monocytes +CD8dep_GAACCTACAATGGAGC-1,Monocytes +CD8dep_GAACCTACATACGCCG-1,Monocytes +CD8dep_GAACCTAGTCGATTGT-1,Monocytes +CD8dep_GAACCTAGTGTGTGCC-1,Macrophages +CD8dep_GAACCTATCATGTGGT-1,Monocytes +CD8dep_GAACCTATCCGAATGT-1,Monocytes +CD8dep_GAACGGAAGCACGCCT-1,Monocytes +CD8dep_GAACGGACAACTGCTA-1,Macrophages +CD8dep_GAACGGACAAGAAGAG-1,Monocytes +CD8dep_GAACGGACATCTACGA-1,Monocytes +CD8dep_GAACGGATCAACCAAC-1,Monocytes +CD8dep_GAACGGATCTAACTGG-1,Monocytes +CD8dep_GAAGCAGAGCCACTAT-1,Monocytes +CD8dep_GAAGCAGAGCTGTCTA-1,Monocytes +CD8dep_GAAGCAGAGGTGATTA-1,Monocytes +CD8dep_GAAGCAGCACATCCGG-1,Monocytes +CD8dep_GAAGCAGGTACTTAGC-1,Monocytes +CD8dep_GAAGCAGGTCGCATAT-1,Monocytes +CD8dep_GAAGCAGTCCGAGCCA-1,Monocytes +CD8dep_GAAGCAGTCCTCATTA-1,Monocytes +CD8dep_GAATAAGAGAGTGACC-1,Dendritic cells +CD8dep_GAATAAGAGATCCCGC-1,Monocytes +CD8dep_GAATAAGAGCACACAG-1,Monocytes +CD8dep_GAATAAGGTAAGAGAG-1,Monocytes +CD8dep_GAATAAGGTCAAAGAT-1,Monocytes +CD8dep_GAATAAGGTCAGCTAT-1,Dendritic cells +CD8dep_GAATAAGTCAACGCTA-1,Macrophages +CD8dep_GAATGAAAGCTGCGAA-1,Monocytes +CD8dep_GAATGAAAGGAGTTGC-1,Dendritic cells +CD8dep_GAATGAAAGGGAAACA-1,Monocytes +CD8dep_GAATGAACATGAACCT-1,Dendritic cells +CD8dep_GAATGAAGTTCACCTC-1,Monocytes +CD8dep_GAATGAAGTTTGGCGC-1,Macrophages +CD8dep_GAATGAATCAAGGCTT-1,Monocytes +CD8dep_GAATGAATCAGCTGGC-1,Dendritic cells +CD8dep_GAATGAATCATAAAGG-1,Macrophages +CD8dep_GACACGCAGACCCACC-1,Dendritic cells +CD8dep_GACACGCAGCCCAGCT-1,Dendritic cells +CD8dep_GACACGCCAAGTCATC-1,Monocytes +CD8dep_GACACGCCACAGACTT-1,Monocytes +CD8dep_GACACGCCATACTACG-1,Monocytes +CD8dep_GACACGCCATTAACCG-1,Monocytes +CD8dep_GACACGCGTAAGAGGA-1,Monocytes +CD8dep_GACACGCGTCGTCTTC-1,Monocytes +CD8dep_GACACGCGTTCCATGA-1,Monocytes +CD8dep_GACACGCGTTCGCTAA-1,Monocytes +CD8dep_GACACGCGTTCGGCAC-1,Monocytes +CD8dep_GACACGCTCATATCGG-1,Monocytes +CD8dep_GACACGCTCGTTGCCT-1,Monocytes +CD8dep_GACACGCTCTGCGACG-1,Monocytes +CD8dep_GACAGAGCAGCCTGTG-1,Macrophages +CD8dep_GACAGAGGTAAACACA-1,Monocytes +CD8dep_GACCAATAGCTAAACA-1,Monocytes +CD8dep_GACCAATAGTGTGGCA-1,Monocytes +CD8dep_GACCAATGTACAGTTC-1,Monocytes +CD8dep_GACCAATGTTAAAGTG-1,Monocytes +CD8dep_GACCAATGTTCAGCGC-1,Dendritic cells +CD8dep_GACCAATGTTGGACCC-1,Monocytes +CD8dep_GACCAATTCATCTGCC-1,Monocytes +CD8dep_GACCAATTCGACGGAA-1,Monocytes +CD8dep_GACCAATTCGTATCAG-1,Granulocytes +CD8dep_GACCAATTCTCAAACG-1,Dendritic cells +CD8dep_GACCTGGAGGCTAGAC-1,Monocytes +CD8dep_GACCTGGAGTACGTTC-1,Macrophages +CD8dep_GACCTGGCATACTCTT-1,Monocytes +CD8dep_GACCTGGCATGGGACA-1,Granulocytes +CD8dep_GACCTGGCATTAGCCA-1,Monocytes +CD8dep_GACCTGGCATTTGCTT-1,Granulocytes +CD8dep_GACCTGGGTAGATTAG-1,Macrophages +CD8dep_GACCTGGGTCCCTACT-1,Monocytes +CD8dep_GACCTGGGTTCCATGA-1,Monocytes +CD8dep_GACGCGTAGCGGCTTC-1,Monocytes +CD8dep_GACGCGTCAGACGCAA-1,Monocytes +CD8dep_GACGCGTGTCTGGTCG-1,Monocytes +CD8dep_GACGCGTGTGCACCAC-1,Dendritic cells +CD8dep_GACGCGTGTGGGTATG-1,Dendritic cells +CD8dep_GACGCGTTCAACCAAC-1,Monocytes +CD8dep_GACGCGTTCAATCACG-1,Dendritic cells +CD8dep_GACGGCTAGATGTCGG-1,Monocytes +CD8dep_GACGGCTAGCTAGCCC-1,Macrophages +CD8dep_GACGGCTAGTTCGATC-1,Dendritic cells +CD8dep_GACGGCTCACAGACTT-1,Monocytes +CD8dep_GACGGCTCACAGGTTT-1,Dendritic cells +CD8dep_GACGGCTTCAACACCA-1,Monocytes +CD8dep_GACGGCTTCAATAAGG-1,Monocytes +CD8dep_GACGGCTTCAGAGCTT-1,Monocytes +CD8dep_GACGGCTTCATGTCCC-1,Monocytes +CD8dep_GACGGCTTCGTTTAGG-1,Monocytes +CD8dep_GACGTGCAGCTGGAAC-1,Granulocytes +CD8dep_GACGTGCCAGTCACTA-1,Monocytes +CD8dep_GACGTGCGTAGGACAC-1,Macrophages +CD8dep_GACGTGCGTCCGAATT-1,Monocytes +CD8dep_GACGTGCGTCCGACGT-1,Monocytes +CD8dep_GACGTGCGTCGCCATG-1,Monocytes +CD8dep_GACGTGCGTTCGGCAC-1,Dendritic cells +CD8dep_GACGTGCTCAGCTCGG-1,Monocytes +CD8dep_GACGTGCTCGGAATCT-1,Macrophages +CD8dep_GACGTTAAGGAGTAGA-1,Monocytes +CD8dep_GACGTTAAGGGTATCG-1,Dendritic cells +CD8dep_GACGTTACAAGGTTCT-1,Monocytes +CD8dep_GACGTTACAGATCGGA-1,Monocytes +CD8dep_GACGTTAGTCAAACTC-1,Dendritic cells +CD8dep_GACGTTAGTGCTTCTC-1,Monocytes +CD8dep_GACGTTATCCAGAAGG-1,Monocytes +CD8dep_GACTAACAGCGTTCCG-1,Monocytes +CD8dep_GACTAACAGGTTCCTA-1,Monocytes +CD8dep_GACTAACAGTTGAGTA-1,Monocytes +CD8dep_GACTAACCACACGCTG-1,Macrophages +CD8dep_GACTAACCAGTCGATT-1,Monocytes +CD8dep_GACTAACCATGCTAGT-1,Monocytes +CD8dep_GACTAACGTTAAGAAC-1,Monocytes +CD8dep_GACTAACGTTACAGAA-1,Dendritic cells +CD8dep_GACTAACTCAAGAAGT-1,Dendritic cells +CD8dep_GACTAACTCACGCGGT-1,Monocytes +CD8dep_GACTAACTCGCAGGCT-1,Monocytes +CD8dep_GACTACAAGGTCATCT-1,Monocytes +CD8dep_GACTACAAGTCTCCTC-1,T cells +CD8dep_GACTACACACTACAGT-1,Granulocytes +CD8dep_GACTACAGTCAAAGAT-1,Monocytes +CD8dep_GACTACAGTTTACTCT-1,Monocytes +CD8dep_GACTACATCGGAAATA-1,Monocytes +CD8dep_GACTACATCGTGACAT-1,Macrophages +CD8dep_GACTACATCTAGCACA-1,Monocytes +CD8dep_GACTGCGAGGACCACA-1,Granulocytes +CD8dep_GACTGCGCAGACAAAT-1,Dendritic cells +CD8dep_GACTGCGCAGTTCATG-1,Monocytes +CD8dep_GACTGCGGTACTTCTT-1,Monocytes +CD8dep_GACTGCGGTAGATTAG-1,Monocytes +CD8dep_GACTGCGGTTTGGCGC-1,Monocytes +CD8dep_GACTGCGTCAACACTG-1,Monocytes +CD8dep_GAGCAGAAGAAACGAG-1,Monocytes +CD8dep_GAGCAGAAGTATTGGA-1,Monocytes +CD8dep_GAGCAGACAGCTCCGA-1,Monocytes +CD8dep_GAGCAGACAGGTCTCG-1,Monocytes +CD8dep_GAGCAGACAGTACACT-1,Monocytes +CD8dep_GAGCAGAGTAAGAGGA-1,Dendritic cells +CD8dep_GAGCAGAGTCTGCAAT-1,Monocytes +CD8dep_GAGCAGAGTGATAAGT-1,Monocytes +CD8dep_GAGCAGAGTGTTCTTT-1,Macrophages +CD8dep_GAGGTGAAGGACTGGT-1,Dendritic cells +CD8dep_GAGGTGACATCGTCGG-1,Monocytes +CD8dep_GAGTCCGAGAACAATC-1,Dendritic cells +CD8dep_GAGTCCGAGCGTAGTG-1,Monocytes +CD8dep_GAGTCCGAGTTCCACA-1,Macrophages +CD8dep_GAGTCCGCATCCGCGA-1,Dendritic cells +CD8dep_GAGTCCGGTCAAACTC-1,Monocytes +CD8dep_GAGTCCGGTGATGTGG-1,Monocytes +CD8dep_GAGTCCGGTGCACTTA-1,Monocytes +CD8dep_GAGTCCGGTGTTCTTT-1,Monocytes +CD8dep_GAGTCCGGTTCAGCGC-1,Monocytes +CD8dep_GATCAGTGTTTCCACC-1,Monocytes +CD8dep_GATCAGTTCAAAGTAG-1,Dendritic cells +CD8dep_GATCAGTTCCACGCAG-1,Monocytes +CD8dep_GATCAGTTCCTCAACC-1,Monocytes +CD8dep_GATCAGTTCGTTTAGG-1,Monocytes +CD8dep_GATCGATAGGGTCGAT-1,Monocytes +CD8dep_GATCGATAGGGTTCCC-1,Monocytes +CD8dep_GATCGATAGGTAGCCA-1,Monocytes +CD8dep_GATCGATAGTCGCCGT-1,Monocytes +CD8dep_GATCGATCATTAGGCT-1,Monocytes +CD8dep_GATCGATGTAGGGTAC-1,Monocytes +CD8dep_GATCGATGTCATTAGC-1,Macrophages +CD8dep_GATCGATGTCGAACAG-1,Macrophages +CD8dep_GATCGATTCTTGACGA-1,T cells +CD8dep_GATCGCGAGAGTACCG-1,Monocytes +CD8dep_GATCGCGAGGGCTCTC-1,Monocytes +CD8dep_GATCGCGCACTCGACG-1,Monocytes +CD8dep_GATCGCGCAGACGCCT-1,Dendritic cells +CD8dep_GATCGCGCATGTTGAC-1,Macrophages +CD8dep_GATCGCGGTACTTCTT-1,Monocytes +CD8dep_GATCGCGGTAGCACGA-1,Monocytes +CD8dep_GATCGCGGTCCAGTGC-1,Monocytes +CD8dep_GATCGCGTCTAACTGG-1,Monocytes +CD8dep_GATCGCGTCTACTTAC-1,Monocytes +CD8dep_GATCGCGTCTTACCGC-1,Monocytes +CD8dep_GATCGCGTCTTGACGA-1,Monocytes +CD8dep_GATCGTAAGAAACCGC-1,Monocytes +CD8dep_GATCGTAAGGTGACCA-1,Granulocytes +CD8dep_GATCGTAGTCTGGTCG-1,Dendritic cells +CD8dep_GATCGTAGTGCCTGTG-1,Monocytes +CD8dep_GATCGTATCACAAACC-1,Dendritic cells +CD8dep_GATCGTATCATTGCCC-1,Monocytes +CD8dep_GATCGTATCGCCAGCA-1,Monocytes +CD8dep_GATCGTATCGGCGCAT-1,Monocytes +CD8dep_GATCTAGAGCCTCGTG-1,Monocytes +CD8dep_GATCTAGAGCTTTGGT-1,Monocytes +CD8dep_GATCTAGAGGACATTA-1,Monocytes +CD8dep_GATCTAGCACAAGACG-1,Monocytes +CD8dep_GATCTAGCAGGGATTG-1,Monocytes +CD8dep_GATCTAGCATTCCTCG-1,Macrophages +CD8dep_GATCTAGGTAGCGTAG-1,Dendritic cells +CD8dep_GATCTAGGTCTAGCGC-1,Monocytes +CD8dep_GATCTAGTCAACACTG-1,Monocytes +CD8dep_GATCTAGTCCGTACAA-1,Monocytes +CD8dep_GATCTAGTCCGTTGTC-1,Monocytes +CD8dep_GATCTAGTCGCCATAA-1,Monocytes +CD8dep_GATCTAGTCGGTGTCG-1,Monocytes +CD8dep_GATGAAAAGGACATTA-1,Monocytes +CD8dep_GATGAAAAGGACCACA-1,Monocytes +CD8dep_GATGAAAAGGTGTGGT-1,Dendritic cells +CD8dep_GATGAAACACCAACCG-1,Monocytes +CD8dep_GATGAAACATTGGGCC-1,Monocytes +CD8dep_GATGAAATCAATAAGG-1,Monocytes +CD8dep_GATGAAATCAATCACG-1,Monocytes +CD8dep_GATGAAATCCTCATTA-1,Monocytes +CD8dep_GATGAGGCAAGACGTG-1,Monocytes +CD8dep_GATGAGGGTCGTGGCT-1,Monocytes +CD8dep_GATGAGGGTGCTTCTC-1,Monocytes +CD8dep_GATGAGGGTGTGGTTT-1,Dendritic cells +CD8dep_GATGAGGTCCATTCTA-1,Dendritic cells +CD8dep_GATGAGGTCCCAAGTA-1,Monocytes +CD8dep_GATGAGGTCCCTCTTT-1,Macrophages +CD8dep_GATGAGGTCCGCAAGC-1,Monocytes +CD8dep_GATGCTAAGGAGCGAG-1,Monocytes +CD8dep_GATGCTACAATGAAAC-1,Monocytes +CD8dep_GATGCTACAGACGTAG-1,Monocytes +CD8dep_GATGCTAGTAGGACAC-1,Monocytes +CD8dep_GATGCTAGTCGCCATG-1,Monocytes +CD8dep_GATGCTATCATGTCCC-1,Monocytes +CD8dep_GATGCTATCTATGTGG-1,Dendritic cells +CD8dep_GATGCTATCTTAACCT-1,Dendritic cells +CD8dep_GATTCAGAGTGATCGG-1,Monocytes +CD8dep_GATTCAGCAGTTTACG-1,Monocytes +CD8dep_GATTCAGCATGTAAGA-1,Monocytes +CD8dep_GATTCAGGTGTTTGTG-1,Monocytes +CD8dep_GCAAACTAGCGGCTTC-1,Macrophages +CD8dep_GCAAACTAGGAGTAGA-1,Dendritic cells +CD8dep_GCAAACTAGGCAAAGA-1,Monocytes +CD8dep_GCAAACTAGGGAACGG-1,Monocytes +CD8dep_GCAAACTCACATAACC-1,Dendritic cells +CD8dep_GCAAACTCACGTGAGA-1,Macrophages +CD8dep_GCAAACTGTTAGATGA-1,Monocytes +CD8dep_GCAAACTGTTCAGGCC-1,Monocytes +CD8dep_GCAAACTGTTTGGGCC-1,Macrophages +CD8dep_GCAAACTTCACTCCTG-1,Monocytes +CD8dep_GCAAACTTCCGCATCT-1,Monocytes +CD8dep_GCAATCAAGAGCCCAA-1,Monocytes +CD8dep_GCAATCAAGCTGAACG-1,Granulocytes +CD8dep_GCAATCAAGTACGCCC-1,Monocytes +CD8dep_GCAATCATCCAAGCCG-1,Macrophages +CD8dep_GCAATCATCTGTTGAG-1,Monocytes +CD8dep_GCACATAAGCAGCCTC-1,Monocytes +CD8dep_GCACATAGTAAGGATT-1,Monocytes +CD8dep_GCACATAGTACAGTTC-1,Monocytes +CD8dep_GCACATAGTACCGGCT-1,Monocytes +CD8dep_GCACATAGTCGCGAAA-1,Monocytes +CD8dep_GCACATAGTTGAGGTG-1,Monocytes +CD8dep_GCACATATCAAGATCC-1,Monocytes +CD8dep_GCACATATCCAGAAGG-1,Monocytes +CD8dep_GCACTCTAGAGCTGCA-1,Monocytes +CD8dep_GCACTCTAGAGTGACC-1,NK cells +CD8dep_GCACTCTAGCCGGTAA-1,Dendritic cells +CD8dep_GCACTCTCACGGCCAT-1,Monocytes +CD8dep_GCACTCTTCGGAATCT-1,Monocytes +CD8dep_GCAGCCAAGGAATCGC-1,Monocytes +CD8dep_GCAGCCAAGTTGAGAT-1,Monocytes +CD8dep_GCAGCCACAAAGAATC-1,Monocytes +CD8dep_GCAGCCACAAGGTTCT-1,Monocytes +CD8dep_GCAGCCACACTTAAGC-1,Monocytes +CD8dep_GCAGCCACATAAGACA-1,Monocytes +CD8dep_GCAGCCACATGCCACG-1,Monocytes +CD8dep_GCAGCCAGTCCGTTAA-1,Macrophages +CD8dep_GCAGCCATCATGCTCC-1,Monocytes +CD8dep_GCAGTTAAGAATTCCC-1,Monocytes +CD8dep_GCAGTTAAGCCAGAAC-1,Monocytes +CD8dep_GCAGTTACAGCTGTTA-1,Monocytes +CD8dep_GCAGTTAGTAAATACG-1,Monocytes +CD8dep_GCAGTTAGTAGCTCCG-1,Monocytes +CD8dep_GCAGTTAGTCAATACC-1,Monocytes +CD8dep_GCAGTTAGTTCCACTC-1,Monocytes +CD8dep_GCAGTTATCACCATAG-1,Macrophages +CD8dep_GCAGTTATCGGCGCTA-1,Monocytes +CD8dep_GCATACAAGATCCCGC-1,Monocytes +CD8dep_GCATACAAGATGTGGC-1,Monocytes +CD8dep_GCATACAAGGCCCTCA-1,Monocytes +CD8dep_GCATACAAGTCATCCA-1,Monocytes +CD8dep_GCATACACACCCTATC-1,Monocytes +CD8dep_GCATACACAGTATCTG-1,Monocytes +CD8dep_GCATACAGTCAAACTC-1,Monocytes +CD8dep_GCATACAGTCGACTAT-1,Monocytes +CD8dep_GCATACAGTTGTGGCC-1,Monocytes +CD8dep_GCATGATCAAAGTCAA-1,Monocytes +CD8dep_GCATGATGTAACGTTC-1,Monocytes +CD8dep_GCATGATGTAGCGTAG-1,Monocytes +CD8dep_GCATGATGTATGAAAC-1,Monocytes +CD8dep_GCATGATTCGTCTGAA-1,Monocytes +CD8dep_GCATGCGAGATAGTCA-1,Monocytes +CD8dep_GCATGCGAGTCCGTAT-1,Monocytes +CD8dep_GCATGCGCATTACGAC-1,Dendritic cells +CD8dep_GCATGCGTCGACCAGC-1,Monocytes +CD8dep_GCATGCGTCTCGATGA-1,Monocytes +CD8dep_GCATGTAAGAAGGTTT-1,Monocytes +CD8dep_GCATGTAAGATGTGGC-1,Monocytes +CD8dep_GCATGTAAGTGACTCT-1,Monocytes +CD8dep_GCATGTACACCATCCT-1,Monocytes +CD8dep_GCATGTACAGGGCATA-1,Monocytes +CD8dep_GCATGTACATGACGGA-1,Monocytes +CD8dep_GCATGTACATGCATGT-1,Monocytes +CD8dep_GCATGTATCATTCACT-1,Dendritic cells +CD8dep_GCATGTATCCTGTAGA-1,Macrophages +CD8dep_GCCAAATAGAAACGCC-1,Monocytes +CD8dep_GCCAAATAGCCCAGCT-1,Monocytes +CD8dep_GCCAAATAGGAATGGA-1,Monocytes +CD8dep_GCCAAATCAAGCGAGT-1,Macrophages +CD8dep_GCCAAATCACCTATCC-1,Monocytes +CD8dep_GCCAAATCACGAGGTA-1,Monocytes +CD8dep_GCCAAATGTACGACCC-1,Monocytes +CD8dep_GCCAAATGTCTCCCTA-1,Monocytes +CD8dep_GCCAAATTCCCAGGTG-1,Macrophages +CD8dep_GCCAAATTCCTCCTAG-1,Monocytes +CD8dep_GCCAAATTCGAATGGG-1,Monocytes +CD8dep_GCCAAATTCTTCTGGC-1,Monocytes +CD8dep_GCCTCTAAGACTGTAA-1,Macrophages +CD8dep_GCCTCTAAGCCAGGAT-1,Monocytes +CD8dep_GCCTCTAAGGGTATCG-1,Monocytes +CD8dep_GCCTCTACAAGGGTCA-1,Macrophages +CD8dep_GCCTCTAGTCAATGTC-1,Monocytes +CD8dep_GCCTCTAGTGCCTGCA-1,Monocytes +CD8dep_GCCTCTAGTGCTTCTC-1,Monocytes +CD8dep_GCGACCAAGAGTGAGA-1,Monocytes +CD8dep_GCGACCAAGTGAAGAG-1,Monocytes +CD8dep_GCGACCACATTAGGCT-1,Monocytes +CD8dep_GCGACCAGTGACGGTA-1,Monocytes +CD8dep_GCGACCATCAGCCTAA-1,Monocytes +CD8dep_GCGACCATCATAACCG-1,Monocytes +CD8dep_GCGAGAAAGACTGGGT-1,Monocytes +CD8dep_GCGAGAAAGCTTCGCG-1,Monocytes +CD8dep_GCGAGAAAGGGTATCG-1,Monocytes +CD8dep_GCGAGAAAGGTGCTTT-1,Monocytes +CD8dep_GCGAGAAGTTAAAGAC-1,Monocytes +CD8dep_GCGAGAATCCAAATGC-1,Monocytes +CD8dep_GCGAGAATCCTTGCCA-1,Monocytes +CD8dep_GCGAGAATCGACCAGC-1,Macrophages +CD8dep_GCGAGAATCGCCAAAT-1,Macrophages +CD8dep_GCGCAACAGCCTTGAT-1,Macrophages +CD8dep_GCGCAACAGGACAGCT-1,Granulocytes +CD8dep_GCGCAACAGGCCATAG-1,Monocytes +CD8dep_GCGCAACCATCCCACT-1,Monocytes +CD8dep_GCGCAACCATTGAGCT-1,Monocytes +CD8dep_GCGCAACTCTCAAGTG-1,Monocytes +CD8dep_GCGCAGTAGGCGACAT-1,Granulocytes +CD8dep_GCGCAGTCACGAAGCA-1,Monocytes +CD8dep_GCGCAGTCAGCTCGAC-1,Monocytes +CD8dep_GCGCAGTGTACTCAAC-1,Monocytes +CD8dep_GCGCAGTGTCAGTGGA-1,Monocytes +CD8dep_GCGCCAAAGGTGACCA-1,Monocytes +CD8dep_GCGCCAAAGTTCGCGC-1,Monocytes +CD8dep_GCGCCAACAACAACCT-1,Monocytes +CD8dep_GCGCCAACAGACTCGC-1,Monocytes +CD8dep_GCGCCAAGTATGCTTG-1,Monocytes +CD8dep_GCGCCAAGTGTCGCTG-1,Monocytes +CD8dep_GCGCCAAGTGTTAAGA-1,Monocytes +CD8dep_GCGCCAAGTTGCTCCT-1,Monocytes +CD8dep_GCGCCAAGTTGTCGCG-1,Macrophages +CD8dep_GCGCCAATCCAAGTAC-1,Dendritic cells +CD8dep_GCGCCAATCGTACGGC-1,Granulocytes +CD8dep_GCGCGATCACTAAGTC-1,Monocytes +CD8dep_GCGCGATCAGTAACGG-1,Monocytes +CD8dep_GCGCGATCAGTATCTG-1,Monocytes +CD8dep_GCGCGATGTAAGAGGA-1,Monocytes +CD8dep_GCGCGATGTGAAGGCT-1,Monocytes +CD8dep_GCGCGATTCTGGCGAC-1,Monocytes +CD8dep_GCGGGTTAGAAGCCCA-1,Monocytes +CD8dep_GCGGGTTAGCTCAACT-1,Monocytes +CD8dep_GCGGGTTAGCTGTTCA-1,Macrophages +CD8dep_GCGGGTTGTGGCGAAT-1,Dendritic cells +CD8dep_GCTCCTAAGAGATGAG-1,Monocytes +CD8dep_GCTCCTAAGCTAGTCT-1,Monocytes +CD8dep_GCTCCTAAGGGTATCG-1,Monocytes +CD8dep_GCTCCTAAGTGGGATC-1,Monocytes +CD8dep_GCTCCTACAGTAACGG-1,Monocytes +CD8dep_GCTCCTACATCACGAT-1,Monocytes +CD8dep_GCTCCTAGTTATGCGT-1,Monocytes +CD8dep_GCTCCTATCATCGGAT-1,Granulocytes +CD8dep_GCTCCTATCTCAACTT-1,Monocytes +CD8dep_GCTCTGTAGGATGGAA-1,Monocytes +CD8dep_GCTCTGTAGTTCGCGC-1,Monocytes +CD8dep_GCTCTGTCAGTAAGAT-1,Monocytes +CD8dep_GCTCTGTGTCTAGAGG-1,Monocytes +CD8dep_GCTCTGTGTTAGATGA-1,Monocytes +CD8dep_GCTCTGTTCCCTAACC-1,Monocytes +CD8dep_GCTGCAGAGAGCCTAG-1,Monocytes +CD8dep_GCTGCAGAGCGAAGGG-1,Monocytes +CD8dep_GCTGCAGAGTCGATAA-1,Monocytes +CD8dep_GCTGCAGCAAAGGTGC-1,Monocytes +CD8dep_GCTGCAGCACTACAGT-1,Monocytes +CD8dep_GCTGCAGGTACTTAGC-1,Dendritic cells +CD8dep_GCTGCAGTCAACACGT-1,Macrophages +CD8dep_GCTGCAGTCTCGCTTG-1,Monocytes +CD8dep_GCTGCGAAGCTAACAA-1,Dendritic cells +CD8dep_GCTGCGAAGCTGAAAT-1,Monocytes +CD8dep_GCTGCGACACGAAACG-1,Monocytes +CD8dep_GCTGCGAGTACCAGTT-1,Monocytes +CD8dep_GCTGCGAGTGCATCTA-1,Monocytes +CD8dep_GCTGCGATCACATACG-1,Monocytes +CD8dep_GCTGCGATCATTATCC-1,Monocytes +CD8dep_GCTGCGATCGCACTCT-1,Monocytes +CD8dep_GCTGCGATCGCCAGCA-1,Macrophages +CD8dep_GCTGCTTAGCCGATTT-1,Monocytes +CD8dep_GCTGCTTAGCTGGAAC-1,Monocytes +CD8dep_GCTGCTTCACGGTGTC-1,Dendritic cells +CD8dep_GCTGCTTCAGATGGGT-1,Monocytes +CD8dep_GCTGCTTCAGGTCTCG-1,Monocytes +CD8dep_GCTGCTTGTACCGAGA-1,Monocytes +CD8dep_GCTGCTTGTCAGCTAT-1,Macrophages +CD8dep_GCTGCTTGTGCAGGTA-1,Granulocytes +CD8dep_GCTGCTTTCCAAGCCG-1,Monocytes +CD8dep_GCTGGGTAGAGTTGGC-1,Monocytes +CD8dep_GCTGGGTGTAGGGTAC-1,Monocytes +CD8dep_GCTGGGTGTATTCGTG-1,Dendritic cells +CD8dep_GCTGGGTGTTACGTCA-1,T cells +CD8dep_GCTGGGTTCAACGCTA-1,Macrophages +CD8dep_GCTGGGTTCCACTCCA-1,Monocytes +CD8dep_GCTGGGTTCCCTAACC-1,Dendritic cells +CD8dep_GCTGGGTTCTTGAGGT-1,Monocytes +CD8dep_GCTTCCAAGAAACGAG-1,Monocytes +CD8dep_GCTTCCAAGACTAAGT-1,Granulocytes +CD8dep_GCTTCCAAGGTGGGTT-1,Monocytes +CD8dep_GCTTCCACAGACTCGC-1,Monocytes +CD8dep_GCTTCCACAGATCGGA-1,Monocytes +CD8dep_GCTTCCAGTGTGACCC-1,Dendritic cells +CD8dep_GCTTCCATCAACCATG-1,Dendritic cells +CD8dep_GCTTCCATCCGTAGTA-1,Dendritic cells +CD8dep_GCTTCCATCCTCAATT-1,Macrophages +CD8dep_GCTTCCATCGTCTGCT-1,Monocytes +CD8dep_GCTTGAAAGCCGGTAA-1,Dendritic cells +CD8dep_GCTTGAAAGGAATTAC-1,Monocytes +CD8dep_GCTTGAAAGTGGACGT-1,Monocytes +CD8dep_GCTTGAAGTAAATACG-1,Monocytes +CD8dep_GCTTGAAGTCGCATAT-1,Macrophages +CD8dep_GCTTGAAGTTGGTAAA-1,Monocytes +CD8dep_GCTTGAATCATCGCTC-1,Monocytes +CD8dep_GCTTGAATCGCTGATA-1,Monocytes +CD8dep_GGAAAGCAGACCGGAT-1,Monocytes +CD8dep_GGAAAGCAGATAGGAG-1,Monocytes +CD8dep_GGAAAGCAGCTGCAAG-1,Monocytes +CD8dep_GGAAAGCAGTGTCCCG-1,Monocytes +CD8dep_GGAAAGCCAAGTCTAC-1,Fibroblasts +CD8dep_GGAAAGCGTAGTGAAT-1,Dendritic cells +CD8dep_GGAACTTAGAGCAATT-1,Monocytes +CD8dep_GGAACTTAGAGGGATA-1,Monocytes +CD8dep_GGAACTTAGATCCCGC-1,Dendritic cells +CD8dep_GGAACTTAGCGTTGCC-1,Monocytes +CD8dep_GGAACTTCACGGTAGA-1,Monocytes +CD8dep_GGAACTTCATGCAATC-1,Monocytes +CD8dep_GGAACTTCATGTCGAT-1,Monocytes +CD8dep_GGAACTTGTGAGTATA-1,Monocytes +CD8dep_GGAACTTGTTAAGAAC-1,Monocytes +CD8dep_GGAACTTTCAACGCTA-1,Monocytes +CD8dep_GGAACTTTCCAGAGGA-1,Dendritic cells +CD8dep_GGAATAAAGCCCAGCT-1,Monocytes +CD8dep_GGAATAAAGCTAGGCA-1,Monocytes +CD8dep_GGAATAACAAGCTGGA-1,Monocytes +CD8dep_GGAATAACAGGCTGAA-1,Macrophages +CD8dep_GGAATAATCTTACCGC-1,Monocytes +CD8dep_GGACAAGAGATAGTCA-1,Monocytes +CD8dep_GGACAAGCACTATCTT-1,Monocytes +CD8dep_GGACAAGGTGACAAAT-1,Monocytes +CD8dep_GGACAAGGTTCTGAAC-1,Monocytes +CD8dep_GGACAAGTCAAACCGT-1,Monocytes +CD8dep_GGACAAGTCAACGCTA-1,Monocytes +CD8dep_GGACAGAAGGCGATAC-1,Dendritic cells +CD8dep_GGACAGAAGTCATGCT-1,Monocytes +CD8dep_GGACAGAAGTTCCACA-1,Monocytes +CD8dep_GGACAGACACGAAATA-1,Monocytes +CD8dep_GGACAGACAGTCTTCC-1,Monocytes +CD8dep_GGACAGAGTCGGGTCT-1,Dendritic cells +CD8dep_GGACAGAGTGTCGCTG-1,Monocytes +CD8dep_GGACAGATCGCACTCT-1,Monocytes +CD8dep_GGACATTAGCTAAACA-1,Granulocytes +CD8dep_GGACATTAGTGGAGAA-1,Macrophages +CD8dep_GGACATTAGTTAACGA-1,Macrophages +CD8dep_GGACATTCACCAGTTA-1,Monocytes +CD8dep_GGACATTCAGATGAGC-1,Monocytes +CD8dep_GGACATTGTAAATACG-1,Dendritic cells +CD8dep_GGACATTGTAAGTTCC-1,Monocytes +CD8dep_GGACATTGTACCGTTA-1,Macrophages +CD8dep_GGACATTGTGTTAAGA-1,Monocytes +CD8dep_GGACATTGTTGTCTTT-1,Monocytes +CD8dep_GGACATTTCAAACAAG-1,Monocytes +CD8dep_GGACATTTCCATGCTC-1,Monocytes +CD8dep_GGACATTTCCTCAACC-1,Monocytes +CD8dep_GGACATTTCGTATCAG-1,Monocytes +CD8dep_GGACATTTCTCAACTT-1,Monocytes +CD8dep_GGACATTTCTGGCGAC-1,Monocytes +CD8dep_GGACGTCAGGACAGCT-1,Monocytes +CD8dep_GGACGTCAGTATCTCG-1,Monocytes +CD8dep_GGACGTCAGTGACATA-1,Monocytes +CD8dep_GGACGTCCAGACAAGC-1,Monocytes +CD8dep_GGACGTCCATAGAAAC-1,Monocytes +CD8dep_GGACGTCGTACCAGTT-1,Monocytes +CD8dep_GGACGTCGTCACTTCC-1,Monocytes +CD8dep_GGACGTCGTCGGCATC-1,Monocytes +CD8dep_GGACGTCGTGTGACCC-1,Monocytes +CD8dep_GGACGTCGTTGAGTTC-1,Monocytes +CD8dep_GGACGTCTCCATTCTA-1,Monocytes +CD8dep_GGACGTCTCGGACAAG-1,Monocytes +CD8dep_GGAGCAAAGGTGCACA-1,Monocytes +CD8dep_GGAGCAAGTACTCGCG-1,Monocytes +CD8dep_GGAGCAAGTACTTAGC-1,Monocytes +CD8dep_GGAGCAAGTCAGAATA-1,Monocytes +CD8dep_GGAGCAAGTCGTGGCT-1,Monocytes +CD8dep_GGAGCAAGTCTCTCTG-1,Monocytes +CD8dep_GGAGCAATCATCTGCC-1,Monocytes +CD8dep_GGAGCAATCCCTTGTG-1,Dendritic cells +CD8dep_GGAGCAATCGTCTGCT-1,Monocytes +CD8dep_GGAGCAATCTGCCCTA-1,Monocytes +CD8dep_GGATGTTAGAAGGGTA-1,Monocytes +CD8dep_GGATGTTAGACAAGCC-1,Monocytes +CD8dep_GGATGTTAGAGCCTAG-1,Dendritic cells +CD8dep_GGATGTTAGTTCCACA-1,Monocytes +CD8dep_GGATGTTGTCGCTTCT-1,Monocytes +CD8dep_GGATGTTGTGTTTGGT-1,Monocytes +CD8dep_GGATGTTGTTAAGATG-1,Monocytes +CD8dep_GGATGTTGTTTGACTG-1,Dendritic cells +CD8dep_GGATTACAGGGTTTCT-1,Macrophages +CD8dep_GGATTACAGTGACATA-1,Monocytes +CD8dep_GGATTACAGTTAGCGG-1,Monocytes +CD8dep_GGATTACCAGCTCGAC-1,Monocytes +CD8dep_GGATTACCATGTCTCC-1,Dendritic cells +CD8dep_GGATTACGTCTGCGGT-1,Monocytes +CD8dep_GGATTACGTTCGCTAA-1,Dendritic cells +CD8dep_GGATTACGTTTCGCTC-1,Monocytes +CD8dep_GGATTACTCAACCAAC-1,Dendritic cells +CD8dep_GGATTACTCACGACTA-1,Dendritic cells +CD8dep_GGATTACTCCAAATGC-1,Monocytes +CD8dep_GGATTACTCGCGCCAA-1,Monocytes +CD8dep_GGCAATTAGAAGGCCT-1,Macrophages +CD8dep_GGCAATTCACACTGCG-1,Monocytes +CD8dep_GGCAATTCACAGACTT-1,Monocytes +CD8dep_GGCAATTCACGTTGGC-1,Granulocytes +CD8dep_GGCAATTCACTTAAGC-1,Monocytes +CD8dep_GGCAATTGTGCTGTAT-1,Monocytes +CD8dep_GGCAATTGTTTGACTG-1,Monocytes +CD8dep_GGCAATTTCACCCTCA-1,Macrophages +CD8dep_GGCCGATCACGAAATA-1,Monocytes +CD8dep_GGCCGATCATGCCTTC-1,Monocytes +CD8dep_GGCCGATCATGTCCTC-1,Monocytes +CD8dep_GGCCGATGTAACGTTC-1,Monocytes +CD8dep_GGCCGATGTACAAGTA-1,Granulocytes +CD8dep_GGCCGATGTACAGACG-1,Monocytes +CD8dep_GGCCGATGTACATCCA-1,Monocytes +CD8dep_GGCCGATGTGTTTGGT-1,Macrophages +CD8dep_GGCCGATTCTGACCTC-1,Monocytes +CD8dep_GGCCGATTCTGGCGAC-1,Macrophages +CD8dep_GGCGACTAGCACACAG-1,Monocytes +CD8dep_GGCGACTAGGGTCTCC-1,Monocytes +CD8dep_GGCGACTGTTAAAGAC-1,Monocytes +CD8dep_GGCGACTTCACCTCGT-1,Monocytes +CD8dep_GGCGACTTCCGTACAA-1,Monocytes +CD8dep_GGCGTGTAGTCCAGGA-1,Dendritic cells +CD8dep_GGCGTGTTCACATGCA-1,T cells +CD8dep_GGCGTGTTCCAAACAC-1,Dendritic cells +CD8dep_GGCGTGTTCGCTTAGA-1,Monocytes +CD8dep_GGCGTGTTCTCCAGGG-1,Monocytes +CD8dep_GGCGTGTTCTCCCTGA-1,Monocytes +CD8dep_GGCGTGTTCTGCCAGG-1,Monocytes +CD8dep_GGCTCGAAGCGATAGC-1,Monocytes +CD8dep_GGCTCGACACGTCAGC-1,Monocytes +CD8dep_GGCTCGACATGCATGT-1,Monocytes +CD8dep_GGCTCGAGTCCAGTGC-1,Monocytes +CD8dep_GGCTCGAGTCCGTCAG-1,Macrophages +CD8dep_GGCTCGAGTCGCGGTT-1,Monocytes +CD8dep_GGCTCGAGTTCTGTTT-1,Monocytes +CD8dep_GGCTCGATCTGCAGTA-1,Monocytes +CD8dep_GGCTGGTCACCGAAAG-1,Monocytes +CD8dep_GGCTGGTGTCAGAAGC-1,Monocytes +CD8dep_GGCTGGTGTCATGCCG-1,Macrophages +CD8dep_GGCTGGTGTGTCGCTG-1,Monocytes +CD8dep_GGCTGGTTCTTTAGGG-1,Monocytes +CD8dep_GGGAATGAGCCAGTTT-1,Monocytes +CD8dep_GGGAATGAGCGTAATA-1,Monocytes +CD8dep_GGGAATGCAAGGGTCA-1,Granulocytes +CD8dep_GGGAATGCACACCGAC-1,Monocytes +CD8dep_GGGAATGCATGCCACG-1,Monocytes +CD8dep_GGGAATGGTAAACACA-1,Monocytes +CD8dep_GGGAATGGTACAGACG-1,Monocytes +CD8dep_GGGAATGGTGCGAAAC-1,Dendritic cells +CD8dep_GGGAATGGTGTGCGTC-1,Dendritic cells +CD8dep_GGGAATGTCAGTTGAC-1,Macrophages +CD8dep_GGGAATGTCCTATTCA-1,Monocytes +CD8dep_GGGAATGTCGTCGTTC-1,Monocytes +CD8dep_GGGAATGTCTAACTTC-1,Granulocytes +CD8dep_GGGAATGTCTGCTGCT-1,Monocytes +CD8dep_GGGACCTAGGTGGGTT-1,Monocytes +CD8dep_GGGACCTGTTCCCGAG-1,T cells +CD8dep_GGGACCTTCGCGTAGC-1,Monocytes +CD8dep_GGGACCTTCTCTAAGG-1,Monocytes +CD8dep_GGGACCTTCTGCTGTC-1,Monocytes +CD8dep_GGGACCTTCTGTACGA-1,Monocytes +CD8dep_GGGAGATAGAAACGCC-1,Macrophages +CD8dep_GGGAGATCACGCCAGT-1,Monocytes +CD8dep_GGGAGATCAGACACTT-1,Monocytes +CD8dep_GGGATGAAGCTAAGAT-1,Monocytes +CD8dep_GGGATGAAGTTATCGC-1,Monocytes +CD8dep_GGGATGACAGAGTGTG-1,Monocytes +CD8dep_GGGATGACAGGCAGTA-1,Monocytes +CD8dep_GGGATGACAGTCGATT-1,Macrophages +CD8dep_GGGATGAGTAGATTAG-1,Monocytes +CD8dep_GGGATGAGTCACAAGG-1,Dendritic cells +CD8dep_GGGCACTCAATAGCAA-1,Monocytes +CD8dep_GGGCACTCAGACAAAT-1,Monocytes +CD8dep_GGGCACTTCCACGACG-1,Monocytes +CD8dep_GGGCACTTCCCAAGTA-1,Monocytes +CD8dep_GGGCATCAGAGCTATA-1,Dendritic cells +CD8dep_GGGCATCAGCACGCCT-1,Monocytes +CD8dep_GGGCATCAGCCACGCT-1,Monocytes +CD8dep_GGGCATCCAAAGAATC-1,Monocytes +CD8dep_GGGCATCCAATGCCAT-1,Macrophages +CD8dep_GGGCATCCACACGCTG-1,Dendritic cells +CD8dep_GGGCATCCACTGTCGG-1,Monocytes +CD8dep_GGGCATCCACTTCGAA-1,Monocytes +CD8dep_GGGCATCCATCAGTCA-1,Monocytes +CD8dep_GGGCATCGTTCAGCGC-1,Monocytes +CD8dep_GGGCATCGTTGATTGC-1,Monocytes +CD8dep_GGGTCTGAGAGGTTGC-1,Monocytes +CD8dep_GGGTCTGAGGCCCTTG-1,Monocytes +CD8dep_GGGTCTGCACGCTTTC-1,Monocytes +CD8dep_GGGTCTGGTATATCCG-1,Monocytes +CD8dep_GGGTCTGGTCATATCG-1,Monocytes +CD8dep_GGGTCTGGTTATGTGC-1,Macrophages +CD8dep_GGGTCTGTCTGAGGGA-1,Monocytes +CD8dep_GGGTTGCAGACAGGCT-1,Dendritic cells +CD8dep_GGGTTGCAGCACACAG-1,Monocytes +CD8dep_GGGTTGCAGTCATCCA-1,Granulocytes +CD8dep_GGGTTGCAGTCTTGCA-1,Monocytes +CD8dep_GGGTTGCCAGCGTTCG-1,Monocytes +CD8dep_GGGTTGCGTACTCGCG-1,Macrophages +CD8dep_GGGTTGCGTAGTACCT-1,Adipocytes +CD8dep_GGGTTGCGTCTAGAGG-1,Monocytes +CD8dep_GGTATTGAGACTAGGC-1,Monocytes +CD8dep_GGTATTGAGGCAATTA-1,Monocytes +CD8dep_GGTATTGGTACTCGCG-1,Monocytes +CD8dep_GGTATTGGTATTCGTG-1,Dendritic cells +CD8dep_GGTATTGGTGCGAAAC-1,Monocytes +CD8dep_GGTATTGGTGTGAAAT-1,Dendritic cells +CD8dep_GGTATTGGTTAAGGGC-1,Monocytes +CD8dep_GGTATTGGTTCTGTTT-1,Monocytes +CD8dep_GGTATTGTCATAACCG-1,Monocytes +CD8dep_GGTATTGTCCCTTGCA-1,Monocytes +CD8dep_GGTATTGTCCTAAGTG-1,Monocytes +CD8dep_GGTATTGTCTCCCTGA-1,Monocytes +CD8dep_GGTATTGTCTGTCTAT-1,Macrophages +CD8dep_GGTGAAGAGCGTAGTG-1,Monocytes +CD8dep_GGTGAAGAGGCGCTCT-1,Monocytes +CD8dep_GGTGAAGAGTTAAGTG-1,Dendritic cells +CD8dep_GGTGAAGCAGCTATTG-1,Monocytes +CD8dep_GGTGAAGGTAAACCTC-1,Monocytes +CD8dep_GGTGAAGGTCAGAAGC-1,Monocytes +CD8dep_GGTGAAGGTTAAGTAG-1,Monocytes +CD8dep_GGTGAAGTCCGTCAAA-1,Monocytes +CD8dep_GGTGAAGTCTGCCAGG-1,Monocytes +CD8dep_GGTGCGTAGAAGGTGA-1,Monocytes +CD8dep_GGTGCGTAGATACACA-1,Monocytes +CD8dep_GGTGCGTAGCAGCGTA-1,Monocytes +CD8dep_GGTGCGTAGCCAGAAC-1,Monocytes +CD8dep_GGTGCGTAGCCCTAAT-1,Dendritic cells +CD8dep_GGTGCGTCAAGTTAAG-1,Granulocytes +CD8dep_GGTGCGTCAGTACACT-1,Monocytes +CD8dep_GGTGCGTCATGAGCGA-1,Monocytes +CD8dep_GGTGCGTGTAAATGAC-1,Monocytes +CD8dep_GGTGCGTGTCATGCAT-1,Monocytes +CD8dep_GGTGCGTGTTGGTTTG-1,Granulocytes +CD8dep_GGTGTTAAGAAACCAT-1,Macrophages +CD8dep_GGTGTTAAGCACCGCT-1,Monocytes +CD8dep_GGTGTTACAATTCCTT-1,Monocytes +CD8dep_GGTGTTACACGGATAG-1,Monocytes +CD8dep_GGTGTTACATCCTTGC-1,Macrophages +CD8dep_GGTGTTAGTACCAGTT-1,Monocytes +CD8dep_GGTGTTAGTCGGATCC-1,Monocytes +CD8dep_GGTGTTATCGTCTGAA-1,Monocytes +CD8dep_GTAACGTAGACCGGAT-1,Monocytes +CD8dep_GTAACGTAGTGGTAGC-1,Monocytes +CD8dep_GTAACGTGTGTGCGTC-1,Macrophages +CD8dep_GTAACGTGTTCGTGAT-1,Monocytes +CD8dep_GTAACGTGTTTGCATG-1,Monocytes +CD8dep_GTAACGTTCTTCAACT-1,Granulocytes +CD8dep_GTAACTGAGGCATGGT-1,Monocytes +CD8dep_GTAACTGAGGCTAGAC-1,Dendritic cells +CD8dep_GTAACTGCAACTTGAC-1,Monocytes +CD8dep_GTAACTGCAAGAGTCG-1,Monocytes +CD8dep_GTAACTGCACCGTTGG-1,Monocytes +CD8dep_GTAACTGCACGACGAA-1,Monocytes +CD8dep_GTAACTGGTGACCAAG-1,Fibroblasts +CD8dep_GTAACTGGTGCACTTA-1,Monocytes +CD8dep_GTAACTGGTGCGAAAC-1,Monocytes +CD8dep_GTAACTGGTTCAACCA-1,Monocytes +CD8dep_GTAACTGGTTCTGAAC-1,Monocytes +CD8dep_GTAACTGTCCGTCATC-1,Monocytes +CD8dep_GTACGTAAGCCACCTG-1,Monocytes +CD8dep_GTACGTACAAAGTCAA-1,Monocytes +CD8dep_GTACGTACAGGGATTG-1,Monocytes +CD8dep_GTACGTACATGCATGT-1,Macrophages +CD8dep_GTACGTAGTCACTGGC-1,Granulocytes +CD8dep_GTACGTAGTCGTGGCT-1,Monocytes +CD8dep_GTACGTAGTGACCAAG-1,Monocytes +CD8dep_GTACGTATCCCATTAT-1,Monocytes +CD8dep_GTACGTATCGGCGCTA-1,Monocytes +CD8dep_GTACGTATCGGCTTGG-1,Monocytes +CD8dep_GTACTCCCACACCGCA-1,Dendritic cells +CD8dep_GTACTCCCAGACGTAG-1,Monocytes +CD8dep_GTACTCCGTCATGCCG-1,Monocytes +CD8dep_GTACTCCGTCTGCGGT-1,Monocytes +CD8dep_GTACTCCTCCACGCAG-1,Monocytes +CD8dep_GTACTCCTCGGTTCGG-1,Monocytes +CD8dep_GTACTTTAGTAGCGGT-1,Granulocytes +CD8dep_GTACTTTAGTCGTACT-1,Monocytes +CD8dep_GTACTTTAGTGAACAT-1,Monocytes +CD8dep_GTACTTTCATGGTAGG-1,Monocytes +CD8dep_GTACTTTGTCCGACGT-1,Monocytes +CD8dep_GTACTTTGTGGTACAG-1,Monocytes +CD8dep_GTACTTTGTTACAGAA-1,Monocytes +CD8dep_GTACTTTTCGAGGTAG-1,Monocytes +CD8dep_GTACTTTTCGCCAAAT-1,Monocytes +CD8dep_GTACTTTTCTATCCTA-1,Monocytes +CD8dep_GTACTTTTCTTAGCCC-1,Monocytes +CD8dep_GTAGGCCAGCGATATA-1,Macrophages +CD8dep_GTAGGCCAGGTGCTAG-1,Monocytes +CD8dep_GTAGGCCAGTGGAGTC-1,Monocytes +CD8dep_GTAGGCCCATATACGC-1,Monocytes +CD8dep_GTAGGCCGTACTCTCC-1,Monocytes +CD8dep_GTAGGCCGTAGTACCT-1,Monocytes +CD8dep_GTAGGCCGTGGTCTCG-1,Monocytes +CD8dep_GTAGGCCGTTCGTTGA-1,Monocytes +CD8dep_GTAGTCAAGACCCACC-1,Granulocytes +CD8dep_GTAGTCAAGTGGTAAT-1,Monocytes +CD8dep_GTAGTCACAGTTCCCT-1,Monocytes +CD8dep_GTAGTCAGTGGACGAT-1,Macrophages +CD8dep_GTAGTCAGTGGTCCGT-1,Monocytes +CD8dep_GTAGTCAGTTAGATGA-1,Monocytes +CD8dep_GTAGTCATCACATAGC-1,Monocytes +CD8dep_GTAGTCATCACCGTAA-1,Monocytes +CD8dep_GTAGTCATCCGTCATC-1,Monocytes +CD8dep_GTAGTCATCTGATACG-1,Dendritic cells +CD8dep_GTATCTTAGCATCATC-1,Monocytes +CD8dep_GTATCTTCAGTCACTA-1,Monocytes +CD8dep_GTATCTTCATGAGCGA-1,Monocytes +CD8dep_GTATCTTGTAGCACGA-1,Monocytes +CD8dep_GTATCTTGTCGACTGC-1,Dendritic cells +CD8dep_GTATTCTAGGCTCTTA-1,Monocytes +CD8dep_GTATTCTAGTGAAGTT-1,Monocytes +CD8dep_GTATTCTCATACTACG-1,Macrophages +CD8dep_GTATTCTGTAAATGTG-1,Monocytes +CD8dep_GTATTCTGTTGGTAAA-1,Granulocytes +CD8dep_GTATTCTTCGAATGGG-1,Monocytes +CD8dep_GTCAAGTAGAGGTAGA-1,Monocytes +CD8dep_GTCAAGTAGTCGTACT-1,Monocytes +CD8dep_GTCAAGTAGTGTACGG-1,Monocytes +CD8dep_GTCAAGTCACACTGCG-1,Monocytes +CD8dep_GTCAAGTCAGGACCCT-1,Monocytes +CD8dep_GTCAAGTCAGGTTTCA-1,Monocytes +CD8dep_GTCAAGTGTCTCCCTA-1,Monocytes +CD8dep_GTCAAGTGTTCAACCA-1,Monocytes +CD8dep_GTCACAAAGAGTGAGA-1,Monocytes +CD8dep_GTCACAAAGCCGATTT-1,Monocytes +CD8dep_GTCACAAAGCTAACAA-1,Monocytes +CD8dep_GTCACAAAGTCCCACG-1,Monocytes +CD8dep_GTCACAAAGTTAACGA-1,Monocytes +CD8dep_GTCACAACAACACGCC-1,Monocytes +CD8dep_GTCACAACACCATCCT-1,Monocytes +CD8dep_GTCACAACAGACGCCT-1,Monocytes +CD8dep_GTCACAACAGATAATG-1,Monocytes +CD8dep_GTCACAAGTCATCGGC-1,Monocytes +CD8dep_GTCACAAGTCCCTACT-1,Monocytes +CD8dep_GTCACAAGTCGCGAAA-1,Monocytes +CD8dep_GTCACAAGTCTCCACT-1,Monocytes +CD8dep_GTCACAAGTTCCATGA-1,Monocytes +CD8dep_GTCACAATCACTCCTG-1,Monocytes +CD8dep_GTCACAATCACTTATC-1,Dendritic cells +CD8dep_GTCACAATCAGAAATG-1,Monocytes +CD8dep_GTCACAATCCGTAGTA-1,Monocytes +CD8dep_GTCACAATCGCCGTGA-1,Monocytes +CD8dep_GTCACGGCAAGCGAGT-1,Monocytes +CD8dep_GTCACGGCACAGATTC-1,Monocytes +CD8dep_GTCACGGCACATTTCT-1,Monocytes +CD8dep_GTCACGGCACGTAAGG-1,Monocytes +CD8dep_GTCACGGCAGCTCGAC-1,Dendritic cells +CD8dep_GTCACGGGTATCGCAT-1,Monocytes +CD8dep_GTCACGGTCAGTCCCT-1,Monocytes +CD8dep_GTCACGGTCAGTGTTG-1,Monocytes +CD8dep_GTCACGGTCGCGTAGC-1,Monocytes +CD8dep_GTCACGGTCTCTAGGA-1,Monocytes +CD8dep_GTCATTTAGCACACAG-1,Monocytes +CD8dep_GTCATTTAGGACCACA-1,Monocytes +CD8dep_GTCATTTAGGCAATTA-1,Monocytes +CD8dep_GTCATTTCAAACTGCT-1,Monocytes +CD8dep_GTCATTTCAAGCTGTT-1,Monocytes +CD8dep_GTCATTTGTATGAAAC-1,Dendritic cells +CD8dep_GTCATTTGTCCGAGTC-1,Monocytes +CD8dep_GTCATTTGTCTGATCA-1,Monocytes +CD8dep_GTCATTTGTGATAAAC-1,Monocytes +CD8dep_GTCATTTGTGTGGCTC-1,Monocytes +CD8dep_GTCATTTGTTTGACTG-1,Monocytes +CD8dep_GTCATTTTCAGGCCCA-1,Dendritic cells +CD8dep_GTCATTTTCCAACCAA-1,Monocytes +CD8dep_GTCATTTTCTTCCTTC-1,Monocytes +CD8dep_GTCCTCAAGCGTGAGT-1,Monocytes +CD8dep_GTCCTCAAGCTAACAA-1,Monocytes +CD8dep_GTCCTCAAGGCTCATT-1,Monocytes +CD8dep_GTCCTCAAGGGCACTA-1,Monocytes +CD8dep_GTCCTCACACCCTATC-1,Monocytes +CD8dep_GTCCTCACAGCTTCGG-1,Monocytes +CD8dep_GTCCTCATCAACCATG-1,Monocytes +CD8dep_GTCGGGTAGATACACA-1,Monocytes +CD8dep_GTCGGGTAGGCGATAC-1,Monocytes +CD8dep_GTCGGGTAGTACGTAA-1,Monocytes +CD8dep_GTCGGGTCACGTTGGC-1,Monocytes +CD8dep_GTCGGGTCAGCCAGAA-1,Monocytes +CD8dep_GTCGGGTCAGTGACAG-1,Monocytes +CD8dep_GTCGGGTGTATAAACG-1,Dendritic cells +CD8dep_GTCGGGTGTTGTTTGG-1,Monocytes +CD8dep_GTCGGGTTCCAAATGC-1,Monocytes +CD8dep_GTCGGGTTCGGTCTAA-1,Monocytes +CD8dep_GTCGGGTTCTGAGTGT-1,Monocytes +CD8dep_GTCGTAACAACACGCC-1,Monocytes +CD8dep_GTCGTAACAAGGTTCT-1,Monocytes +CD8dep_GTCGTAACACCAGATT-1,Monocytes +CD8dep_GTCGTAACAGTGGAGT-1,Dendritic cells +CD8dep_GTCGTAACATTAGCCA-1,Monocytes +CD8dep_GTCGTAAGTCTTCTCG-1,Monocytes +CD8dep_GTCGTAAGTTCAGTAC-1,Monocytes +CD8dep_GTCGTAATCCCAACGG-1,Monocytes +CD8dep_GTCGTAATCTAACTGG-1,Monocytes +CD8dep_GTCTCGTAGAGACTAT-1,Monocytes +CD8dep_GTCTCGTAGCGACGTA-1,Monocytes +CD8dep_GTCTCGTAGCTGTTCA-1,Monocytes +CD8dep_GTCTCGTAGGCTCTTA-1,Monocytes +CD8dep_GTCTCGTAGGGCTTGA-1,Monocytes +CD8dep_GTCTCGTAGGTGCTAG-1,Monocytes +CD8dep_GTCTCGTAGTACGTAA-1,Monocytes +CD8dep_GTCTCGTAGTGTTTGC-1,Fibroblasts +CD8dep_GTCTCGTGTCAGGACA-1,Granulocytes +CD8dep_GTCTCGTGTGCTGTAT-1,Monocytes +CD8dep_GTCTCGTGTTATGTGC-1,Macrophages +CD8dep_GTCTCGTTCAGTCCCT-1,Monocytes +CD8dep_GTCTCGTTCCGCGGTA-1,Monocytes +CD8dep_GTCTTCGAGAACTGTA-1,Dendritic cells +CD8dep_GTCTTCGAGAAGGGTA-1,Monocytes +CD8dep_GTCTTCGAGCTTCGCG-1,Macrophages +CD8dep_GTCTTCGAGGAGTACC-1,Monocytes +CD8dep_GTCTTCGAGTTTCCTT-1,Monocytes +CD8dep_GTCTTCGCAACGCACC-1,Dendritic cells +CD8dep_GTCTTCGGTAAACCTC-1,Monocytes +CD8dep_GTCTTCGGTATATGGA-1,Macrophages +CD8dep_GTCTTCGTCCAGATCA-1,T cells +CD8dep_GTCTTCGTCCGCATCT-1,Monocytes +CD8dep_GTCTTCGTCTCGAGTA-1,Macrophages +CD8dep_GTGAAGGAGCCATCGC-1,Monocytes +CD8dep_GTGAAGGAGTATTGGA-1,Monocytes +CD8dep_GTGAAGGCACCAGGTC-1,Monocytes +CD8dep_GTGAAGGCAGCGTCCA-1,Monocytes +CD8dep_GTGAAGGGTATCGCAT-1,Monocytes +CD8dep_GTGAAGGGTTATCACG-1,Monocytes +CD8dep_GTGAAGGGTTATGTGC-1,Monocytes +CD8dep_GTGAAGGGTTGGTGGA-1,Monocytes +CD8dep_GTGAAGGTCTGGGCCA-1,Macrophages +CD8dep_GTGCAGCCACAAGACG-1,T cells +CD8dep_GTGCAGCGTAAGGATT-1,Monocytes +CD8dep_GTGCAGCGTCATTAGC-1,Granulocytes +CD8dep_GTGCAGCGTCTAGAGG-1,Macrophages +CD8dep_GTGCAGCGTGATGTGG-1,Monocytes +CD8dep_GTGCAGCGTTCATGGT-1,Monocytes +CD8dep_GTGCATAAGTACATGA-1,Dendritic cells +CD8dep_GTGCATAAGTTCGATC-1,Monocytes +CD8dep_GTGCATACAGCTGTGC-1,Monocytes +CD8dep_GTGCATACAGTAAGCG-1,Monocytes +CD8dep_GTGCATACATTGGGCC-1,Monocytes +CD8dep_GTGCATAGTAAGGGCT-1,Monocytes +CD8dep_GTGCATAGTAGCAAAT-1,Granulocytes +CD8dep_GTGCATAGTCAACTGT-1,Monocytes +CD8dep_GTGCATAGTTGGACCC-1,Granulocytes +CD8dep_GTGCATATCATGTCTT-1,Dendritic cells +CD8dep_GTGCATATCCGAATGT-1,Monocytes +CD8dep_GTGCATATCCTTAATC-1,Fibroblasts +CD8dep_GTGCGGTAGCCCAACC-1,Monocytes +CD8dep_GTGCGGTAGCCGATTT-1,Monocytes +CD8dep_GTGCGGTAGCGATCCC-1,Monocytes +CD8dep_GTGCGGTAGCTAACAA-1,Granulocytes +CD8dep_GTGCGGTAGGGATCTG-1,Granulocytes +CD8dep_GTGCGGTCAAGGTTCT-1,Monocytes +CD8dep_GTGCGGTCACCGAATT-1,Monocytes +CD8dep_GTGCGGTCACGACTCG-1,Monocytes +CD8dep_GTGCGGTCAGAAGCAC-1,Monocytes +CD8dep_GTGCGGTGTAGCCTCG-1,Monocytes +CD8dep_GTGCGGTGTCGCTTCT-1,Monocytes +CD8dep_GTGCGGTGTTAGTGGG-1,Monocytes +CD8dep_GTGCGGTGTTCAGCGC-1,Monocytes +CD8dep_GTGCGGTGTTCGAATC-1,Monocytes +CD8dep_GTGCGGTGTTGAGGTG-1,Monocytes +CD8dep_GTGCGGTTCGGTCCGA-1,Monocytes +CD8dep_GTGCTTCAGGGATACC-1,Monocytes +CD8dep_GTGCTTCAGTTAACGA-1,Monocytes +CD8dep_GTGCTTCGTACTTCTT-1,Monocytes +CD8dep_GTGCTTCGTCCTCCAT-1,Monocytes +CD8dep_GTGCTTCGTTCACCTC-1,Monocytes +CD8dep_GTGCTTCTCGCAGGCT-1,Monocytes +CD8dep_GTGCTTCTCTCAAGTG-1,Monocytes +CD8dep_GTGCTTCTCTGGTATG-1,Monocytes +CD8dep_GTGGGTCAGACTTGAA-1,Monocytes +CD8dep_GTGGGTCAGATGTGGC-1,Monocytes +CD8dep_GTGGGTCAGTCCTCCT-1,Monocytes +CD8dep_GTGGGTCAGTCTCAAC-1,Dendritic cells +CD8dep_GTGGGTCAGTGTCCCG-1,Monocytes +CD8dep_GTGGGTCCAAGGTTCT-1,Monocytes +CD8dep_GTGGGTCGTGTGACGA-1,Monocytes +CD8dep_GTGGGTCGTTCCATGA-1,Monocytes +CD8dep_GTGTGCGAGAAGAAGC-1,Monocytes +CD8dep_GTGTGCGCATGGAATA-1,Monocytes +CD8dep_GTGTGCGCATTACGAC-1,Monocytes +CD8dep_GTGTGCGCATTGGTAC-1,Monocytes +CD8dep_GTGTGCGGTGTGACGA-1,Monocytes +CD8dep_GTGTGCGTCACAAACC-1,Dendritic cells +CD8dep_GTGTGCGTCACTCTTA-1,Monocytes +CD8dep_GTGTGCGTCAGTGCAT-1,Monocytes +CD8dep_GTGTGCGTCGGCGCTA-1,Monocytes +CD8dep_GTGTGCGTCTTTACAC-1,Monocytes +CD8dep_GTGTTAGAGGCTAGCA-1,Monocytes +CD8dep_GTGTTAGAGTAAGTAC-1,Monocytes +CD8dep_GTGTTAGCAGTCGATT-1,Monocytes +CD8dep_GTGTTAGCATGGTTGT-1,Monocytes +CD8dep_GTGTTAGGTGGCAAAC-1,Monocytes +CD8dep_GTGTTAGTCGACCAGC-1,Monocytes +CD8dep_GTGTTAGTCTCATTCA-1,Monocytes +CD8dep_GTTAAGCAGCCCGAAA-1,Macrophages +CD8dep_GTTAAGCAGCGAGAAA-1,Monocytes +CD8dep_GTTAAGCAGGATGGAA-1,Monocytes +CD8dep_GTTAAGCAGTACGCCC-1,Monocytes +CD8dep_GTTAAGCCAACGATGG-1,Macrophages +CD8dep_GTTAAGCCAACTGCGC-1,Monocytes +CD8dep_GTTAAGCCAATGAATG-1,Macrophages +CD8dep_GTTAAGCCATCAGTCA-1,Monocytes +CD8dep_GTTAAGCGTAAGTTCC-1,Dendritic cells +CD8dep_GTTAAGCGTCGAATCT-1,Dendritic cells +CD8dep_GTTAAGCGTGCTCTTC-1,Monocytes +CD8dep_GTTAAGCTCGGCGCTA-1,Monocytes +CD8dep_GTTAAGCTCGGCTACG-1,Monocytes +CD8dep_GTTACAGAGAAACGAG-1,Monocytes +CD8dep_GTTACAGAGAGGTACC-1,T cells +CD8dep_GTTACAGAGATGCCAG-1,Monocytes +CD8dep_GTTACAGCACAACGTT-1,Dendritic cells +CD8dep_GTTACAGCATGTTGAC-1,Dendritic cells +CD8dep_GTTACAGCATTCTCAT-1,Monocytes +CD8dep_GTTACAGGTGGCAAAC-1,Monocytes +CD8dep_GTTACAGGTGTTCGAT-1,Monocytes +CD8dep_GTTACAGGTTCCCTTG-1,Monocytes +CD8dep_GTTACAGTCACTTCAT-1,Granulocytes +CD8dep_GTTCATTAGAGCCCAA-1,Monocytes +CD8dep_GTTCATTAGGATGTAT-1,T cells +CD8dep_GTTCATTCAATAGAGT-1,Monocytes +CD8dep_GTTCATTCAGTACACT-1,Monocytes +CD8dep_GTTCATTCATGGGAAC-1,Monocytes +CD8dep_GTTCATTCATGGTAGG-1,Monocytes +CD8dep_GTTCATTTCACGATGT-1,Monocytes +CD8dep_GTTCATTTCATCGATG-1,Monocytes +CD8dep_GTTCATTTCTTGCATT-1,Monocytes +CD8dep_GTTCGGGAGATCACGG-1,Monocytes +CD8dep_GTTCGGGAGTTGTAGA-1,Monocytes +CD8dep_GTTCGGGCACCAGCAC-1,Macrophages +CD8dep_GTTCGGGTCACTTATC-1,Monocytes +CD8dep_GTTCGGGTCTGAAAGA-1,Monocytes +CD8dep_GTTCGGGTCTTGTTTG-1,Monocytes +CD8dep_GTTCGGGTCTTTACGT-1,Monocytes +CD8dep_GTTCTCGGTAGAGTGC-1,Monocytes +CD8dep_GTTCTCGGTCCATGAT-1,Monocytes +CD8dep_GTTCTCGGTGAAAGAG-1,Monocytes +CD8dep_GTTCTCGTCACTTATC-1,Macrophages +CD8dep_GTTCTCGTCCGTACAA-1,Granulocytes +CD8dep_GTTCTCGTCTTCTGGC-1,Dendritic cells +CD8dep_GTTTCTAAGAGACTTA-1,Monocytes +CD8dep_GTTTCTAAGCAGCCTC-1,Dendritic cells +CD8dep_GTTTCTAAGGTACTCT-1,Monocytes +CD8dep_GTTTCTACAAGGGTCA-1,Macrophages +CD8dep_GTTTCTACACAGACAG-1,Monocytes +CD8dep_GTTTCTACACGAAGCA-1,Dendritic cells +CD8dep_GTTTCTACATCGTCGG-1,Dendritic cells +CD8dep_GTTTCTAGTCCTCCAT-1,Monocytes +CD8dep_GTTTCTATCACTATTC-1,Monocytes +CD8dep_GTTTCTATCCTACAGA-1,Monocytes +CD8dep_GTTTCTATCGCCTGTT-1,Granulocytes +CD8dep_TAAACCGAGAACAATC-1,Monocytes +CD8dep_TAAACCGAGACGCAAC-1,Monocytes +CD8dep_TAAACCGCACGGTAAG-1,Dendritic cells +CD8dep_TAAACCGCATCGTCGG-1,Monocytes +CD8dep_TAAACCGGTAATTGGA-1,Monocytes +CD8dep_TAAACCGGTTCGGCAC-1,Monocytes +CD8dep_TAAACCGGTTGGTAAA-1,Monocytes +CD8dep_TAAGAGACATGTCGAT-1,Monocytes +CD8dep_TAAGAGAGTACTTGAC-1,Monocytes +CD8dep_TAAGAGAGTAGGCATG-1,Monocytes +CD8dep_TAAGAGATCGCCGTGA-1,Monocytes +CD8dep_TAAGAGATCTGATTCT-1,Macrophages +CD8dep_TAAGCGTAGACAGGCT-1,Monocytes +CD8dep_TAAGCGTAGCAGATCG-1,Monocytes +CD8dep_TAAGCGTAGGTAGCCA-1,Monocytes +CD8dep_TAAGCGTCAAACGTGG-1,Monocytes +CD8dep_TAAGCGTCAAAGCGGT-1,Monocytes +CD8dep_TAAGCGTCAAGTTGTC-1,Monocytes +CD8dep_TAAGCGTCAGTTAACC-1,Monocytes +CD8dep_TAAGCGTCAGTTCCCT-1,Monocytes +CD8dep_TAAGCGTTCTACTTAC-1,Macrophages +CD8dep_TAAGCGTTCTTCGAGA-1,Monocytes +CD8dep_TAAGTGCAGAGTAAGG-1,Monocytes +CD8dep_TAAGTGCAGATATGCA-1,Granulocytes +CD8dep_TAAGTGCAGATGGCGT-1,Monocytes +CD8dep_TAAGTGCAGCTGGAAC-1,Monocytes +CD8dep_TAAGTGCAGGCCCTCA-1,Monocytes +CD8dep_TAAGTGCAGTTTAGGA-1,Monocytes +CD8dep_TAAGTGCCAACTGCTA-1,T cells +CD8dep_TAAGTGCCACAGTCGC-1,Monocytes +CD8dep_TAAGTGCCACCACGTG-1,Monocytes +CD8dep_TAAGTGCCACCTATCC-1,Monocytes +CD8dep_TAAGTGCCACGACGAA-1,Monocytes +CD8dep_TAAGTGCCACGGCCAT-1,Monocytes +CD8dep_TAAGTGCTCCAGTATG-1,Monocytes +CD8dep_TAAGTGCTCGGTGTCG-1,Monocytes +CD8dep_TACACGAAGGCAGGTT-1,Monocytes +CD8dep_TACACGAAGTAAGTAC-1,Monocytes +CD8dep_TACACGACATCTGGTA-1,Macrophages +CD8dep_TACACGAGTAGCTTGT-1,Monocytes +CD8dep_TACACGAGTCGACTGC-1,Monocytes +CD8dep_TACACGAGTGAGTGAC-1,Monocytes +CD8dep_TACACGAGTGCCTTGG-1,Monocytes +CD8dep_TACAGTGAGCCGATTT-1,Monocytes +CD8dep_TACAGTGAGGCGTACA-1,Monocytes +CD8dep_TACAGTGGTCCGACGT-1,Monocytes +CD8dep_TACAGTGGTTGGTGGA-1,Monocytes +CD8dep_TACAGTGTCCTGTACC-1,Monocytes +CD8dep_TACAGTGTCCTTGGTC-1,Monocytes +CD8dep_TACAGTGTCTATCCTA-1,Macrophages +CD8dep_TACCTATAGGCATGTG-1,Macrophages +CD8dep_TACCTATAGGTGATAT-1,Dendritic cells +CD8dep_TACCTATCACCACGTG-1,Monocytes +CD8dep_TACCTATCAGGCTGAA-1,Monocytes +CD8dep_TACCTATGTCGCTTCT-1,Dendritic cells +CD8dep_TACCTATTCATGCTCC-1,Monocytes +CD8dep_TACCTTACAATGGAAT-1,Monocytes +CD8dep_TACCTTACACAGTCGC-1,Dendritic cells +CD8dep_TACCTTACAGGGTTAG-1,Monocytes +CD8dep_TACCTTACAGTCCTTC-1,Monocytes +CD8dep_TACCTTAGTTTGTTTC-1,Monocytes +CD8dep_TACCTTATCCTTTCTC-1,Monocytes +CD8dep_TACCTTATCGACAGCC-1,Dendritic cells +CD8dep_TACCTTATCGTCCGTT-1,Monocytes +CD8dep_TACGGATAGAGGTTGC-1,Monocytes +CD8dep_TACGGATAGATCCTGT-1,Monocytes +CD8dep_TACGGATAGTAACCCT-1,Monocytes +CD8dep_TACGGATAGTAGATGT-1,Monocytes +CD8dep_TACGGATAGTCCGGTC-1,Macrophages +CD8dep_TACGGATCACTTACGA-1,Monocytes +CD8dep_TACGGATCATCAGTCA-1,Monocytes +CD8dep_TACGGATGTACCCAAT-1,Monocytes +CD8dep_TACGGATGTCACCTAA-1,Monocytes +CD8dep_TACGGATTCCCTTGTG-1,Monocytes +CD8dep_TACGGATTCCGTAGGC-1,Granulocytes +CD8dep_TACGGATTCCTAGTGA-1,Monocytes +CD8dep_TACGGATTCCTCATTA-1,Monocytes +CD8dep_TACGGATTCGGCATCG-1,Monocytes +CD8dep_TACGGGCCAATTGCTG-1,Monocytes +CD8dep_TACGGGCGTGCACCAC-1,Monocytes +CD8dep_TACGGGCTCTCTGAGA-1,Monocytes +CD8dep_TACGGGCTCTGTACGA-1,Monocytes +CD8dep_TACGGGCTCTGTGCAA-1,Monocytes +CD8dep_TACGGTAAGCAGGCTA-1,Monocytes +CD8dep_TACGGTACAATAAGCA-1,Monocytes +CD8dep_TACGGTAGTAAACGCG-1,Monocytes +CD8dep_TACGGTAGTTCCACTC-1,Monocytes +CD8dep_TACTCATAGCGCCTCA-1,Monocytes +CD8dep_TACTCATAGCGCCTTG-1,Monocytes +CD8dep_TACTCATAGTTAGCGG-1,Dendritic cells +CD8dep_TACTCATCAGACGCCT-1,Monocytes +CD8dep_TACTCATGTAAATGAC-1,Monocytes +CD8dep_TACTCATGTTAGGGTG-1,Monocytes +CD8dep_TACTCATGTTATGCGT-1,Granulocytes +CD8dep_TACTCATTCGTATCAG-1,Macrophages +CD8dep_TACTCGCAGACCCACC-1,Granulocytes +CD8dep_TACTCGCAGCGATTCT-1,Monocytes +CD8dep_TACTCGCAGTGCTGCC-1,Monocytes +CD8dep_TACTCGCCAATCCAAC-1,Monocytes +CD8dep_TACTCGCCACATTAGC-1,Monocytes +CD8dep_TACTCGCCATCACAAC-1,Macrophages +CD8dep_TACTCGCCATGTAGTC-1,Granulocytes +CD8dep_TACTCGCGTCTTCTCG-1,Monocytes +CD8dep_TACTCGCGTTGCCTCT-1,Monocytes +CD8dep_TACTCGCTCATGTCTT-1,Monocytes +CD8dep_TACTCGCTCATTATCC-1,Monocytes +CD8dep_TACTCGCTCCTGTACC-1,Monocytes +CD8dep_TACTCGCTCTCTAGGA-1,Monocytes +CD8dep_TACTTACGTAGCCTCG-1,Dendritic cells +CD8dep_TACTTACGTGACCAAG-1,Monocytes +CD8dep_TACTTACTCGCAGGCT-1,Macrophages +CD8dep_TACTTGTAGATCCGAG-1,Monocytes +CD8dep_TACTTGTCACTGTCGG-1,Macrophages +CD8dep_TACTTGTCAGGACGTA-1,Monocytes +CD8dep_TACTTGTGTATCGCAT-1,Monocytes +CD8dep_TACTTGTTCTTGCAAG-1,Monocytes +CD8dep_TAGACCAAGTTTAGGA-1,Monocytes +CD8dep_TAGACCACAATCAGAA-1,Monocytes +CD8dep_TAGACCAGTACAGCAG-1,Monocytes +CD8dep_TAGACCAGTCTAAAGA-1,Monocytes +CD8dep_TAGACCAGTTCGCTAA-1,Macrophages +CD8dep_TAGACCATCACAACGT-1,Monocytes +CD8dep_TAGACCATCACTTATC-1,Monocytes +CD8dep_TAGACCATCCCAAGTA-1,Monocytes +CD8dep_TAGAGCTAGAATTCCC-1,Monocytes +CD8dep_TAGAGCTAGAGACTTA-1,Monocytes +CD8dep_TAGAGCTAGTGGTAGC-1,Monocytes +CD8dep_TAGAGCTCATACAGCT-1,Monocytes +CD8dep_TAGAGCTCATTCGACA-1,Monocytes +CD8dep_TAGAGCTGTAAGCACG-1,Monocytes +CD8dep_TAGAGCTTCCGTACAA-1,Monocytes +CD8dep_TAGCCGGAGACAAGCC-1,Granulocytes +CD8dep_TAGCCGGAGACCTTTG-1,Monocytes +CD8dep_TAGCCGGCAAGTCATC-1,Granulocytes +CD8dep_TAGCCGGCAGGACCCT-1,Monocytes +CD8dep_TAGCCGGCAGTATGCT-1,Monocytes +CD8dep_TAGCCGGGTATGAAAC-1,Monocytes +CD8dep_TAGCCGGGTGTGCCTG-1,Monocytes +CD8dep_TAGCCGGGTTGGTGGA-1,Monocytes +CD8dep_TAGCCGGTCATCATTC-1,Dendritic cells +CD8dep_TAGGCATAGCCACCTG-1,Monocytes +CD8dep_TAGGCATCACAACGCC-1,Monocytes +CD8dep_TAGGCATCAGACTCGC-1,Granulocytes +CD8dep_TAGGCATGTAAGGATT-1,Macrophages +CD8dep_TAGGCATGTTTCCACC-1,Monocytes +CD8dep_TAGGCATTCAGCAACT-1,Macrophages +CD8dep_TAGGCATTCAGCATGT-1,Dendritic cells +CD8dep_TAGGCATTCTAACTGG-1,Monocytes +CD8dep_TAGTGGTAGAAGGCCT-1,Monocytes +CD8dep_TAGTGGTAGAATCTCC-1,Monocytes +CD8dep_TAGTGGTAGACTCGGA-1,Monocytes +CD8dep_TAGTGGTAGTCAAGGC-1,Macrophages +CD8dep_TAGTGGTCAATCTGCA-1,Monocytes +CD8dep_TAGTGGTCAATGGTCT-1,Monocytes +CD8dep_TAGTGGTCACCCATTC-1,Monocytes +CD8dep_TAGTGGTCACTCTGTC-1,Monocytes +CD8dep_TAGTGGTGTCAGAAGC-1,Monocytes +CD8dep_TAGTGGTGTCGGCTCA-1,Monocytes +CD8dep_TAGTGGTTCGCAGGCT-1,Monocytes +CD8dep_TAGTTGGAGACAATAC-1,Granulocytes +CD8dep_TAGTTGGAGAGGTTAT-1,Monocytes +CD8dep_TAGTTGGAGGTTACCT-1,Monocytes +CD8dep_TAGTTGGAGTGCGTGA-1,Monocytes +CD8dep_TAGTTGGAGTGTACCT-1,Dendritic cells +CD8dep_TAGTTGGAGTTAGCGG-1,Monocytes +CD8dep_TAGTTGGCAAGTTCTG-1,Monocytes +CD8dep_TAGTTGGCACGGTAAG-1,Monocytes +CD8dep_TAGTTGGGTCTGCAAT-1,Monocytes +CD8dep_TAGTTGGGTTGGACCC-1,Monocytes +CD8dep_TAGTTGGTCCGAAGAG-1,Monocytes +CD8dep_TAGTTGGTCCGTCATC-1,Monocytes +CD8dep_TATCAGGAGAATCTCC-1,Monocytes +CD8dep_TATCAGGAGACTCGGA-1,Monocytes +CD8dep_TATCAGGAGCCCAACC-1,Monocytes +CD8dep_TATCAGGAGCGAAGGG-1,Monocytes +CD8dep_TATCAGGAGTCAAGGC-1,Monocytes +CD8dep_TATCAGGCAATAAGCA-1,Monocytes +CD8dep_TATCAGGCACGCTTTC-1,Monocytes +CD8dep_TATCAGGTCATCTGCC-1,Monocytes +CD8dep_TATCAGGTCTCAACTT-1,Monocytes +CD8dep_TATCTCAAGAGACTAT-1,Macrophages +CD8dep_TATCTCACACAGACAG-1,Monocytes +CD8dep_TATCTCACAGGCTCAC-1,Monocytes +CD8dep_TATCTCACATACAGCT-1,Monocytes +CD8dep_TATCTCAGTACCCAAT-1,Monocytes +CD8dep_TATCTCAGTCATACTG-1,Monocytes +CD8dep_TATCTCAGTCCAGTTA-1,Dendritic cells +CD8dep_TATCTCAGTCTCATCC-1,Monocytes +CD8dep_TATCTCAGTTGAGGTG-1,Monocytes +CD8dep_TATCTCATCCTCCTAG-1,Monocytes +CD8dep_TATGCCCAGCTGAACG-1,Monocytes +CD8dep_TATGCCCAGGCCATAG-1,Monocytes +CD8dep_TATGCCCAGGTAGCTG-1,Monocytes +CD8dep_TATGCCCAGTGTACGG-1,Monocytes +CD8dep_TATGCCCCACCTCGTT-1,Monocytes +CD8dep_TATGCCCCAGGGCATA-1,Monocytes +CD8dep_TATGCCCCAGTGGGAT-1,Monocytes +CD8dep_TATGCCCCATTAGCCA-1,Monocytes +CD8dep_TATGCCCGTAGCTGCC-1,Monocytes +CD8dep_TATGCCCGTCCGCTGA-1,Monocytes +CD8dep_TATGCCCTCGGTCCGA-1,Monocytes +CD8dep_TATTACCCATAGACTC-1,Monocytes +CD8dep_TATTACCCATCTCGCT-1,Macrophages +CD8dep_TATTACCGTAATTGGA-1,Monocytes +CD8dep_TATTACCGTCTCTCTG-1,Monocytes +CD8dep_TATTACCGTGTAATGA-1,Monocytes +CD8dep_TATTACCGTGTCCTCT-1,Monocytes +CD8dep_TATTACCGTTCGGGCT-1,Monocytes +CD8dep_TATTACCTCCACTCCA-1,T cells +CD8dep_TCAACGAAGAAACCAT-1,Monocytes +CD8dep_TCAACGAAGACATAAC-1,Macrophages +CD8dep_TCAACGAAGACTTGAA-1,Monocytes +CD8dep_TCAACGAAGCCAGTTT-1,Monocytes +CD8dep_TCAACGAAGCGATCCC-1,Monocytes +CD8dep_TCAACGAAGGGCATGT-1,Monocytes +CD8dep_TCAACGAAGTCGTACT-1,Monocytes +CD8dep_TCAACGAAGTTGTAGA-1,Monocytes +CD8dep_TCAACGACAAACGCGA-1,Monocytes +CD8dep_TCAACGACAAGTCTAC-1,Dendritic cells +CD8dep_TCAACGACAGCTGTGC-1,Monocytes +CD8dep_TCAACGACAGTGGAGT-1,Dendritic cells +CD8dep_TCAACGAGTGTTGGGA-1,Monocytes +CD8dep_TCAACGAGTTCAGACT-1,Dendritic cells +CD8dep_TCAACGATCATACGGT-1,Monocytes +CD8dep_TCAACGATCCCTGACT-1,Monocytes +CD8dep_TCAACGATCTACGAGT-1,Monocytes +CD8dep_TCAACGATCTGGTGTA-1,Monocytes +CD8dep_TCAATCTAGTGTTTGC-1,Macrophages +CD8dep_TCAATCTCAATGGATA-1,Monocytes +CD8dep_TCAATCTCATCGGAAG-1,Monocytes +CD8dep_TCAATCTGTCAATACC-1,Monocytes +CD8dep_TCAATCTGTCCCTACT-1,Monocytes +CD8dep_TCAATCTGTTCAGCGC-1,Monocytes +CD8dep_TCAATCTTCTATGTGG-1,Dendritic cells +CD8dep_TCACAAGAGAAGCCCA-1,Macrophages +CD8dep_TCACAAGCAATTGCTG-1,Monocytes +CD8dep_TCACAAGCAGGTCTCG-1,Monocytes +CD8dep_TCACAAGCATTACGAC-1,Monocytes +CD8dep_TCACAAGGTAGCGTGA-1,Monocytes +CD8dep_TCACAAGGTGAAAGAG-1,Monocytes +CD8dep_TCACAAGGTGTTAAGA-1,Monocytes +CD8dep_TCACAAGTCTACGAGT-1,Monocytes +CD8dep_TCACGAAAGGTGCAAC-1,Monocytes +CD8dep_TCACGAACAATGGACG-1,Monocytes +CD8dep_TCACGAAGTATATGGA-1,Monocytes +CD8dep_TCACGAATCGTTTGCC-1,Monocytes +CD8dep_TCACGAATCTCAAACG-1,Macrophages +CD8dep_TCAGATGAGTCACGCC-1,Macrophages +CD8dep_TCAGATGCAAAGTGCG-1,Dendritic cells +CD8dep_TCAGATGCATCATCCC-1,Monocytes +CD8dep_TCAGATGCATCGGACC-1,Macrophages +CD8dep_TCAGATGGTCTAAAGA-1,Macrophages +CD8dep_TCAGATGGTCTGGAGA-1,Dendritic cells +CD8dep_TCAGATGGTTAAGACA-1,Monocytes +CD8dep_TCAGATGGTTGCGTTA-1,Monocytes +CD8dep_TCAGATGTCAGCTCGG-1,Monocytes +CD8dep_TCAGATGTCAGGCAAG-1,Monocytes +CD8dep_TCAGCAACAAACCTAC-1,Macrophages +CD8dep_TCAGCAACAGACGCAA-1,Macrophages +CD8dep_TCAGCAACAGGCTCAC-1,Monocytes +CD8dep_TCAGCAACATCGTCGG-1,Monocytes +CD8dep_TCAGCAACATGCAACT-1,Monocytes +CD8dep_TCAGCAAGTAGTACCT-1,Dendritic cells +CD8dep_TCAGCAAGTCTGCGGT-1,Monocytes +CD8dep_TCAGCAAGTCTGGAGA-1,Monocytes +CD8dep_TCAGCAAGTGGACGAT-1,Monocytes +CD8dep_TCAGCAATCCTTGACC-1,Monocytes +CD8dep_TCAGCAATCCTTGGTC-1,Monocytes +CD8dep_TCAGCTCAGGACTGGT-1,Monocytes +CD8dep_TCAGCTCAGTCAATAG-1,Monocytes +CD8dep_TCAGCTCCAAGGCTCC-1,Monocytes +CD8dep_TCAGCTCCAAGTTAAG-1,Macrophages +CD8dep_TCAGCTCGTACTTCTT-1,Monocytes +CD8dep_TCAGCTCGTCTTCAAG-1,Monocytes +CD8dep_TCAGCTCGTTAAGATG-1,Monocytes +CD8dep_TCAGCTCTCACTTACT-1,Monocytes +CD8dep_TCAGGATAGCGCTTAT-1,Monocytes +CD8dep_TCAGGATAGCTTCGCG-1,Monocytes +CD8dep_TCAGGATAGGTACTCT-1,Monocytes +CD8dep_TCAGGATCAAGTCTGT-1,Dendritic cells +CD8dep_TCAGGATCAATGTAAG-1,Monocytes +CD8dep_TCAGGATCACAACGTT-1,Granulocytes +CD8dep_TCAGGATCATATGGTC-1,Monocytes +CD8dep_TCAGGATGTACAGTGG-1,Granulocytes +CD8dep_TCAGGATGTGTTGGGA-1,Granulocytes +CD8dep_TCAGGATTCCGCATCT-1,Monocytes +CD8dep_TCAGGATTCCTGCAGG-1,Monocytes +CD8dep_TCAGGTAAGCGTCTAT-1,Monocytes +CD8dep_TCAGGTAAGTTATCGC-1,Monocytes +CD8dep_TCAGGTAAGTTGTCGT-1,Monocytes +CD8dep_TCAGGTACACGGACAA-1,Monocytes +CD8dep_TCAGGTACAGCCAGAA-1,Macrophages +CD8dep_TCAGGTAGTAAGAGAG-1,Monocytes +CD8dep_TCAGGTAGTCGAGATG-1,Dendritic cells +CD8dep_TCAGGTAGTTGTGGAG-1,Monocytes +CD8dep_TCAGGTATCCGGCACA-1,Monocytes +CD8dep_TCATTACAGACCTAGG-1,Dendritic cells +CD8dep_TCATTACAGAGTTGGC-1,Monocytes +CD8dep_TCATTACAGCATGGCA-1,Monocytes +CD8dep_TCATTACAGCCCAGCT-1,Macrophages +CD8dep_TCATTACAGCTCCCAG-1,Monocytes +CD8dep_TCATTACAGTGAAGAG-1,Dendritic cells +CD8dep_TCATTACCAGTCCTTC-1,Dendritic cells +CD8dep_TCATTACCATCCTTGC-1,Monocytes +CD8dep_TCATTACGTAGATTAG-1,Monocytes +CD8dep_TCATTACGTATAAACG-1,Monocytes +CD8dep_TCATTACGTCCCTTGT-1,Monocytes +CD8dep_TCATTACTCAGAGACG-1,Granulocytes +CD8dep_TCATTACTCATCACCC-1,Monocytes +CD8dep_TCATTACTCGCCTGAG-1,Monocytes +CD8dep_TCATTACTCGGCGCTA-1,Dendritic cells +CD8dep_TCATTTGAGACCGGAT-1,Dendritic cells +CD8dep_TCATTTGAGTAAGTAC-1,Monocytes +CD8dep_TCATTTGCACACTGCG-1,Monocytes +CD8dep_TCATTTGCACTGTTAG-1,Monocytes +CD8dep_TCATTTGCATCGATGT-1,Monocytes +CD8dep_TCATTTGCATTAGGCT-1,Monocytes +CD8dep_TCATTTGCATTTCACT-1,Dendritic cells +CD8dep_TCATTTGGTCAAGCGA-1,Monocytes +CD8dep_TCCACACAGATGCGAC-1,Monocytes +CD8dep_TCCACACCACGAGGTA-1,Monocytes +CD8dep_TCCACACCATCACGTA-1,Macrophages +CD8dep_TCCACACCATTCCTGC-1,Monocytes +CD8dep_TCCACACGTAAACCTC-1,Monocytes +CD8dep_TCCACACGTCCTAGCG-1,Monocytes +CD8dep_TCCACACTCCACTCCA-1,Monocytes +CD8dep_TCCACACTCGTGGTCG-1,Monocytes +CD8dep_TCCCGATAGCCCAACC-1,Dendritic cells +CD8dep_TCCCGATAGCTAACAA-1,Monocytes +CD8dep_TCCCGATAGGAGTTGC-1,Monocytes +CD8dep_TCCCGATAGTGAAGAG-1,Adipocytes +CD8dep_TCCCGATCATTGGCGC-1,Monocytes +CD8dep_TCCCGATGTGACCAAG-1,Monocytes +CD8dep_TCCCGATGTGCTCTTC-1,Monocytes +CD8dep_TCCCGATTCAGCGACC-1,Monocytes +CD8dep_TCCCGATTCGTGACAT-1,Monocytes +CD8dep_TCCCGATTCTAGAGTC-1,Macrophages +CD8dep_TCCCGATTCTGGTATG-1,Monocytes +CD8dep_TCGAGGCAGCAGCGTA-1,Monocytes +CD8dep_TCGAGGCCAGTGGGAT-1,Monocytes +CD8dep_TCGAGGCCATCCTTGC-1,Monocytes +CD8dep_TCGAGGCGTCATCGGC-1,Monocytes +CD8dep_TCGAGGCGTCTGCAAT-1,Monocytes +CD8dep_TCGAGGCTCCGCGGTA-1,Monocytes +CD8dep_TCGAGGCTCTCGCATC-1,Monocytes +CD8dep_TCGCGAGAGCCGCCTA-1,Monocytes +CD8dep_TCGCGAGAGCTGTTCA-1,Monocytes +CD8dep_TCGCGAGCAACCGCCA-1,Monocytes +CD8dep_TCGCGAGCAGGAATCG-1,Dendritic cells +CD8dep_TCGCGAGCAGGGTATG-1,Monocytes +CD8dep_TCGCGAGCATGGTCTA-1,Monocytes +CD8dep_TCGCGAGTCAAAGTAG-1,Monocytes +CD8dep_TCGCGAGTCGCGCCAA-1,Monocytes +CD8dep_TCGCGTTAGCTGAAAT-1,Granulocytes +CD8dep_TCGCGTTAGGGATCTG-1,Monocytes +CD8dep_TCGCGTTGTAAGAGAG-1,Monocytes +CD8dep_TCGCGTTGTACCATCA-1,Monocytes +CD8dep_TCGCGTTGTACCGTTA-1,Monocytes +CD8dep_TCGCGTTGTCGTGGCT-1,Monocytes +CD8dep_TCGCGTTTCAATAAGG-1,Monocytes +CD8dep_TCGCGTTTCCAGATCA-1,Monocytes +CD8dep_TCGCGTTTCTGCGGCA-1,Granulocytes +CD8dep_TCGGGACAGGGTCTCC-1,Dendritic cells +CD8dep_TCGGGACAGTATGACA-1,Monocytes +CD8dep_TCGGGACCAATACGCT-1,Dendritic cells +CD8dep_TCGGGACGTATAAACG-1,Dendritic cells +CD8dep_TCGGGACGTATATCCG-1,Monocytes +CD8dep_TCGGGACTCAACTCTT-1,Monocytes +CD8dep_TCGGGACTCCCAGGTG-1,Monocytes +CD8dep_TCGGTAAAGAGTACAT-1,Macrophages +CD8dep_TCGGTAAGTAAGCACG-1,Monocytes +CD8dep_TCGGTAATCAATCACG-1,Monocytes +CD8dep_TCGGTAATCTGGAGCC-1,Macrophages +CD8dep_TCGTACCAGACCTAGG-1,Monocytes +CD8dep_TCGTACCGTACTCTCC-1,Monocytes +CD8dep_TCGTACCGTAGCTTGT-1,Monocytes +CD8dep_TCGTACCGTCTCGTTC-1,Monocytes +CD8dep_TCGTACCGTTTCCACC-1,Monocytes +CD8dep_TCGTACCTCAGTTGAC-1,Monocytes +CD8dep_TCGTACCTCCACTCCA-1,Monocytes +CD8dep_TCGTACCTCTGTCTCG-1,Monocytes +CD8dep_TCGTACCTCTGTTTGT-1,Monocytes +CD8dep_TCGTACCTCTTAGAGC-1,Dendritic cells +CD8dep_TCGTAGAAGCAATCTC-1,Dendritic cells +CD8dep_TCGTAGAAGCATGGCA-1,Monocytes +CD8dep_TCGTAGAAGCGCCTTG-1,Monocytes +CD8dep_TCGTAGACAATCCAAC-1,Dendritic cells +CD8dep_TCGTAGACAGATGGGT-1,Macrophages +CD8dep_TCGTAGAGTTACGCGC-1,Monocytes +CD8dep_TCGTAGATCTGGTGTA-1,Monocytes +CD8dep_TCTATTGAGACTTTCG-1,Monocytes +CD8dep_TCTATTGCACAGGCCT-1,Monocytes +CD8dep_TCTATTGGTTAAGATG-1,Monocytes +CD8dep_TCTATTGTCCAGTATG-1,Dendritic cells +CD8dep_TCTATTGTCCGTAGTA-1,Macrophages +CD8dep_TCTATTGTCGTCTGCT-1,Monocytes +CD8dep_TCTCATAAGGATGTAT-1,Monocytes +CD8dep_TCTCATACAACACGCC-1,Monocytes +CD8dep_TCTCATACACATTAGC-1,Monocytes +CD8dep_TCTCATACACTTAACG-1,Dendritic cells +CD8dep_TCTCATACAGCCACCA-1,Monocytes +CD8dep_TCTCTAAAGCCCAACC-1,T cells +CD8dep_TCTCTAAAGTGCTGCC-1,Monocytes +CD8dep_TCTCTAACAAAGGTGC-1,Granulocytes +CD8dep_TCTCTAACACATGGGA-1,Monocytes +CD8dep_TCTCTAACATCGGAAG-1,Monocytes +CD8dep_TCTCTAAGTAAAGGAG-1,Monocytes +CD8dep_TCTCTAAGTAGTGAAT-1,Monocytes +CD8dep_TCTCTAATCAACGAAA-1,Monocytes +CD8dep_TCTCTAATCACATAGC-1,Granulocytes +CD8dep_TCTCTAATCCCACTTG-1,Dendritic cells +CD8dep_TCTCTAATCCGTCATC-1,Monocytes +CD8dep_TCTGAGAAGACAAGCC-1,Monocytes +CD8dep_TCTGAGAAGAGCCTAG-1,Monocytes +CD8dep_TCTGAGACAATAACGA-1,Monocytes +CD8dep_TCTGAGAGTCTGGTCG-1,Macrophages +CD8dep_TCTGAGATCCAGGGCT-1,Dendritic cells +CD8dep_TCTGAGATCCGCGCAA-1,Dendritic cells +CD8dep_TCTGAGATCGGAATCT-1,Monocytes +CD8dep_TCTGGAAAGACCACGA-1,Monocytes +CD8dep_TCTGGAACACAGACAG-1,Monocytes +CD8dep_TCTGGAAGTACAGTGG-1,Monocytes +CD8dep_TCTGGAAGTTGGTTTG-1,Dendritic cells +CD8dep_TCTGGAATCCATGCTC-1,Dendritic cells +CD8dep_TCTGGAATCTGCCCTA-1,Monocytes +CD8dep_TCTTCGGAGAATGTGT-1,Monocytes +CD8dep_TCTTCGGAGACCGGAT-1,Monocytes +CD8dep_TCTTCGGAGCGACGTA-1,Monocytes +CD8dep_TCTTCGGAGCTTATCG-1,Monocytes +CD8dep_TCTTCGGCAAACAACA-1,Dendritic cells +CD8dep_TCTTCGGCACAAGACG-1,Monocytes +CD8dep_TCTTCGGCAGCGTTCG-1,Dendritic cells +CD8dep_TCTTCGGGTCTAGGTT-1,Monocytes +CD8dep_TCTTCGGGTGTCTGAT-1,Monocytes +CD8dep_TCTTCGGGTTATTCTC-1,Monocytes +CD8dep_TCTTCGGGTTTGGCGC-1,Macrophages +CD8dep_TCTTCGGTCACCCGAG-1,Monocytes +CD8dep_TCTTCGGTCATAAAGG-1,Monocytes +CD8dep_TCTTTCCAGACGCACA-1,Monocytes +CD8dep_TCTTTCCAGGAGTAGA-1,Monocytes +CD8dep_TCTTTCCAGTGGTAAT-1,Monocytes +CD8dep_TCTTTCCCAACTGCTA-1,Macrophages +CD8dep_TCTTTCCCACATGGGA-1,Monocytes +CD8dep_TCTTTCCCACCCTATC-1,Monocytes +CD8dep_TCTTTCCGTAGAAAGG-1,Monocytes +CD8dep_TCTTTCCGTGCCTGTG-1,Dendritic cells +CD8dep_TCTTTCCGTGTCAATC-1,Monocytes +CD8dep_TCTTTCCGTTACCGAT-1,Monocytes +CD8dep_TCTTTCCTCAGGTAAA-1,Monocytes +CD8dep_TCTTTCCTCATATCGG-1,Monocytes +CD8dep_TCTTTCCTCGTGTAGT-1,Monocytes +CD8dep_TGAAAGAAGTGGAGAA-1,Monocytes +CD8dep_TGAAAGAAGTGGTAAT-1,Monocytes +CD8dep_TGAAAGACACCGAATT-1,Monocytes +CD8dep_TGAAAGACACTTCTGC-1,Monocytes +CD8dep_TGAAAGACAGATGGGT-1,Monocytes +CD8dep_TGAAAGAGTCCCTTGT-1,Monocytes +CD8dep_TGAAAGAGTGGCTCCA-1,Monocytes +CD8dep_TGAAAGAGTGTTGGGA-1,T cells +CD8dep_TGAAAGATCCAGGGCT-1,Macrophages +CD8dep_TGAAAGATCGAGGTAG-1,Monocytes +CD8dep_TGACAACAGAGGTTGC-1,Monocytes +CD8dep_TGACAACAGATATGGT-1,Monocytes +CD8dep_TGACAACAGCCCTAAT-1,Monocytes +CD8dep_TGACAACAGGAGCGAG-1,Monocytes +CD8dep_TGACAACAGTGTACCT-1,Monocytes +CD8dep_TGACAACGTATCACCA-1,Dendritic cells +CD8dep_TGACAACGTCCAGTTA-1,Monocytes +CD8dep_TGACAACTCACAGGCC-1,Monocytes +CD8dep_TGACAACTCTTTAGGG-1,Monocytes +CD8dep_TGACGGCAGCGACGTA-1,Dendritic cells +CD8dep_TGACGGCAGGTTCCTA-1,Monocytes +CD8dep_TGACGGCAGTTTGCGT-1,Monocytes +CD8dep_TGACGGCCACCATGTA-1,Monocytes +CD8dep_TGACGGCGTCGTCTTC-1,Monocytes +CD8dep_TGACGGCGTGCAGACA-1,Macrophages +CD8dep_TGACGGCTCCGCAGTG-1,Macrophages +CD8dep_TGACTAGAGAATGTGT-1,Monocytes +CD8dep_TGACTAGAGACAAAGG-1,Monocytes +CD8dep_TGACTAGAGTGAATTG-1,Monocytes +CD8dep_TGACTAGCAGACGCAA-1,Monocytes +CD8dep_TGACTAGGTACGACCC-1,Monocytes +CD8dep_TGACTAGGTCTACCTC-1,Monocytes +CD8dep_TGACTAGGTCTCCATC-1,Dendritic cells +CD8dep_TGACTAGGTGACTCAT-1,Monocytes +CD8dep_TGACTTTAGAACTCGG-1,Monocytes +CD8dep_TGACTTTAGCGAAGGG-1,Monocytes +CD8dep_TGACTTTAGGACAGAA-1,Macrophages +CD8dep_TGACTTTAGTGCAAGC-1,Monocytes +CD8dep_TGACTTTAGTTCGCAT-1,Monocytes +CD8dep_TGACTTTGTCTAGCCG-1,Macrophages +CD8dep_TGACTTTTCCGCGTTT-1,Macrophages +CD8dep_TGACTTTTCTACCAGA-1,Monocytes +CD8dep_TGACTTTTCTCCAGGG-1,Monocytes +CD8dep_TGAGAGGAGAAGAAGC-1,Monocytes +CD8dep_TGAGAGGGTGCATCTA-1,Monocytes +CD8dep_TGAGAGGTCACGGTTA-1,Monocytes +CD8dep_TGAGCATAGACTAGAT-1,Monocytes +CD8dep_TGAGCATAGAGCAATT-1,Macrophages +CD8dep_TGAGCATCAAGCTGAG-1,Monocytes +CD8dep_TGAGCATCACACCGAC-1,Monocytes +CD8dep_TGAGCATCAGGTGGAT-1,Monocytes +CD8dep_TGAGCATCATTACGAC-1,Monocytes +CD8dep_TGAGCATGTCGGCATC-1,Monocytes +CD8dep_TGAGCATGTTCGTTGA-1,Monocytes +CD8dep_TGAGCATTCAGCAACT-1,Granulocytes +CD8dep_TGAGCATTCATTGCCC-1,Dendritic cells +CD8dep_TGAGCCGAGATGCGAC-1,Monocytes +CD8dep_TGAGCCGAGCAGGTCA-1,Monocytes +CD8dep_TGAGCCGAGGTGTGGT-1,Monocytes +CD8dep_TGAGCCGCACTTCGAA-1,Monocytes +CD8dep_TGAGCCGCATCGGGTC-1,Monocytes +CD8dep_TGAGCCGCATGCCACG-1,Monocytes +CD8dep_TGAGCCGTCGCCCTTA-1,Monocytes +CD8dep_TGAGCCGTCGGTGTTA-1,Monocytes +CD8dep_TGAGCCGTCTTCTGGC-1,Monocytes +CD8dep_TGAGGGACAAGCCGCT-1,Granulocytes +CD8dep_TGAGGGACATAGAAAC-1,Monocytes +CD8dep_TGAGGGAGTCCAGTTA-1,Monocytes +CD8dep_TGAGGGAGTCTCCATC-1,Monocytes +CD8dep_TGAGGGAGTTAGGGTG-1,Monocytes +CD8dep_TGAGGGATCACAGTAC-1,Monocytes +CD8dep_TGAGGGATCACCCTCA-1,Monocytes +CD8dep_TGATTTCAGAAGAAGC-1,Monocytes +CD8dep_TGATTTCAGTGGTCCC-1,Monocytes +CD8dep_TGATTTCGTCTTGATG-1,Monocytes +CD8dep_TGATTTCGTGTCCTCT-1,Monocytes +CD8dep_TGATTTCGTTCTGTTT-1,Monocytes +CD8dep_TGATTTCTCGGTTCGG-1,Monocytes +CD8dep_TGATTTCTCTACGAGT-1,Monocytes +CD8dep_TGCACCTAGGACCACA-1,Monocytes +CD8dep_TGCACCTCATATACCG-1,Monocytes +CD8dep_TGCACCTTCAACCATG-1,Monocytes +CD8dep_TGCACCTTCTGGCGAC-1,Monocytes +CD8dep_TGCCAAAAGATAGTCA-1,Monocytes +CD8dep_TGCCAAAAGATGCCAG-1,Monocytes +CD8dep_TGCCAAAAGCAAATCA-1,Monocytes +CD8dep_TGCCAAAAGGCTACGA-1,Monocytes +CD8dep_TGCCAAAAGTAATCCC-1,Monocytes +CD8dep_TGCCAAAAGTCAAGCG-1,Monocytes +CD8dep_TGCCAAACACCTCGTT-1,Monocytes +CD8dep_TGCCAAACACGGATAG-1,Granulocytes +CD8dep_TGCCAAACAGACTCGC-1,Monocytes +CD8dep_TGCCAAAGTATAGGTA-1,Monocytes +CD8dep_TGCCAAATCCCGACTT-1,Monocytes +CD8dep_TGCCCATAGAGTGAGA-1,Monocytes +CD8dep_TGCCCATAGCCTATGT-1,Monocytes +CD8dep_TGCCCATAGGCTAGCA-1,Monocytes +CD8dep_TGCCCATCAAGGTTTC-1,Monocytes +CD8dep_TGCCCATCACATAACC-1,Macrophages +CD8dep_TGCCCATGTGTTTGGT-1,Monocytes +CD8dep_TGCCCATTCACCTTAT-1,Granulocytes +CD8dep_TGCCCATTCTGAGTGT-1,Monocytes +CD8dep_TGCCCTAAGACGCACA-1,Monocytes +CD8dep_TGCCCTAAGAGGGCTT-1,Monocytes +CD8dep_TGCCCTAAGCATGGCA-1,Dendritic cells +CD8dep_TGCCCTAAGTACCGGA-1,Monocytes +CD8dep_TGCCCTAAGTCATGCT-1,Monocytes +CD8dep_TGCCCTACAGTATGCT-1,Monocytes +CD8dep_TGCCCTACAGTTTACG-1,Monocytes +CD8dep_TGCCCTAGTCCCGACA-1,Monocytes +CD8dep_TGCCCTAGTTTCCACC-1,Monocytes +CD8dep_TGCCCTATCGTTACAG-1,Monocytes +CD8dep_TGCCCTATCTAACTGG-1,Monocytes +CD8dep_TGCGCAGAGCAGGCTA-1,Monocytes +CD8dep_TGCGCAGAGCGTTCCG-1,Monocytes +CD8dep_TGCGCAGAGTTTCCTT-1,Monocytes +CD8dep_TGCGCAGCAAGAGGCT-1,Dendritic cells +CD8dep_TGCGCAGCAAGTACCT-1,Monocytes +CD8dep_TGCGCAGCATGGATGG-1,Dendritic cells +CD8dep_TGCGCAGCATGGGACA-1,Monocytes +CD8dep_TGCGCAGGTCGAGTTT-1,Monocytes +CD8dep_TGCGCAGGTTATCCGA-1,Monocytes +CD8dep_TGCGCAGTCAACACAC-1,Monocytes +CD8dep_TGCGCAGTCCAAGTAC-1,Monocytes +CD8dep_TGCGCAGTCTCTTATG-1,Macrophages +CD8dep_TGCGGGTAGATATACG-1,Monocytes +CD8dep_TGCGGGTAGCAGATCG-1,Monocytes +CD8dep_TGCGGGTAGGAATTAC-1,Monocytes +CD8dep_TGCGGGTAGGGATGGG-1,Granulocytes +CD8dep_TGCGGGTAGTCTTGCA-1,Monocytes +CD8dep_TGCGGGTCAAAGCGGT-1,Monocytes +CD8dep_TGCGGGTCATAGAAAC-1,Macrophages +CD8dep_TGCGGGTGTGACAAAT-1,Monocytes +CD8dep_TGCGGGTGTGCGAAAC-1,Dendritic cells +CD8dep_TGCGGGTTCTCGAGTA-1,Monocytes +CD8dep_TGCGTGGAGCAGCCTC-1,Macrophages +CD8dep_TGCGTGGCAAAGGTGC-1,Dendritic cells +CD8dep_TGCGTGGCAGGCAGTA-1,Monocytes +CD8dep_TGCGTGGGTAAATGTG-1,Monocytes +CD8dep_TGCGTGGGTCTTCTCG-1,Dendritic cells +CD8dep_TGCGTGGTCGCCATAA-1,Granulocytes +CD8dep_TGCTACCAGATGCCTT-1,Dendritic cells +CD8dep_TGCTACCCAAGTTCTG-1,Monocytes +CD8dep_TGCTACCCAGATCGGA-1,Monocytes +CD8dep_TGCTACCGTCTAGGTT-1,Monocytes +CD8dep_TGCTACCGTGATGATA-1,Monocytes +CD8dep_TGCTGCTAGAGGTTAT-1,Monocytes +CD8dep_TGCTGCTAGGATGGTC-1,Monocytes +CD8dep_TGCTGCTGTACCGAGA-1,Monocytes +CD8dep_TGCTGCTGTCGCTTTC-1,Monocytes +CD8dep_TGCTGCTGTGAAAGAG-1,Macrophages +CD8dep_TGCTGCTGTTATGTGC-1,Monocytes +CD8dep_TGCTGCTTCCATGAGT-1,Monocytes +CD8dep_TGCTGCTTCTCCGGTT-1,Monocytes +CD8dep_TGCTGCTTCTGCCCTA-1,Monocytes +CD8dep_TGCTGCTTCTGGCGTG-1,Monocytes +CD8dep_TGGACGCAGAGCTGCA-1,Monocytes +CD8dep_TGGACGCAGGCTCATT-1,Monocytes +CD8dep_TGGACGCAGTGGCACA-1,Monocytes +CD8dep_TGGACGCAGTTGAGTA-1,Monocytes +CD8dep_TGGACGCCACAGCGTC-1,Monocytes +CD8dep_TGGACGCGTCCGAAGA-1,Monocytes +CD8dep_TGGACGCGTGCTCTTC-1,Monocytes +CD8dep_TGGACGCTCGCGTAGC-1,Monocytes +CD8dep_TGGACGCTCTGCGGCA-1,Monocytes +CD8dep_TGGCCAGAGATCCGAG-1,Monocytes +CD8dep_TGGCCAGAGGGAACGG-1,Monocytes +CD8dep_TGGCCAGCAATGGTCT-1,Monocytes +CD8dep_TGGCCAGCACATTCGA-1,Monocytes +CD8dep_TGGCCAGCATGAAGTA-1,Monocytes +CD8dep_TGGCCAGCATGCATGT-1,T cells +CD8dep_TGGCCAGGTCATGCCG-1,Monocytes +CD8dep_TGGCCAGGTGCAACTT-1,Monocytes +CD8dep_TGGCCAGGTTAGATGA-1,Macrophages +CD8dep_TGGCCAGGTTCGTTGA-1,Monocytes +CD8dep_TGGCCAGTCAAACGGG-1,Macrophages +CD8dep_TGGCGCAAGCTCCTTC-1,Granulocytes +CD8dep_TGGCGCAAGTGGTAAT-1,Monocytes +CD8dep_TGGCGCACATGGTCAT-1,Monocytes +CD8dep_TGGCGCAGTACTTCTT-1,Monocytes +CD8dep_TGGCGCAGTAGGCTGA-1,Monocytes +CD8dep_TGGCGCAGTTCGGCAC-1,Fibroblasts +CD8dep_TGGCGCATCGCCAGCA-1,Monocytes +CD8dep_TGGCTGGAGCGATAGC-1,T cells +CD8dep_TGGCTGGAGCTCCTCT-1,Granulocytes +CD8dep_TGGCTGGCACCGATAT-1,Monocytes +CD8dep_TGGCTGGCACTCAGGC-1,Monocytes +CD8dep_TGGCTGGCATCGGGTC-1,Monocytes +CD8dep_TGGCTGGGTAGAAAGG-1,Monocytes +CD8dep_TGGCTGGGTCACTTCC-1,Monocytes +CD8dep_TGGCTGGGTCGGCACT-1,Monocytes +CD8dep_TGGCTGGTCTGGTTCC-1,Macrophages +CD8dep_TGGGAAGAGTGAACAT-1,Monocytes +CD8dep_TGGGAAGCAGCTGGCT-1,Granulocytes +CD8dep_TGGGAAGCATCACGAT-1,Monocytes +CD8dep_TGGGAAGCATGGTAGG-1,Monocytes +CD8dep_TGGGAAGGTAATCACC-1,Monocytes +CD8dep_TGGGAAGGTATAAACG-1,Monocytes +CD8dep_TGGGAAGGTCCCGACA-1,Monocytes +CD8dep_TGGGAAGTCAGGTTCA-1,Monocytes +CD8dep_TGGGAAGTCATCACCC-1,Monocytes +CD8dep_TGGGCGTAGGCATGGT-1,Monocytes +CD8dep_TGGGCGTGTCACCCAG-1,Monocytes +CD8dep_TGGGCGTGTGGCAAAC-1,Monocytes +CD8dep_TGGGCGTTCCTTGCCA-1,Monocytes +CD8dep_TGGTTAGAGGCCCTTG-1,Monocytes +CD8dep_TGGTTAGCACCTTGTC-1,Monocytes +CD8dep_TGGTTAGCAGGATCGA-1,Monocytes +CD8dep_TGGTTAGCAGGTCCAC-1,Monocytes +CD8dep_TGGTTAGCAGTCTTCC-1,Monocytes +CD8dep_TGGTTAGGTAGCCTAT-1,Monocytes +CD8dep_TGGTTAGGTCAGCTAT-1,Monocytes +CD8dep_TGGTTAGGTGAAATCA-1,Monocytes +CD8dep_TGGTTAGGTGCAGGTA-1,Monocytes +CD8dep_TGGTTAGGTGCGCTTG-1,Monocytes +CD8dep_TGGTTAGTCATATCGG-1,Monocytes +CD8dep_TGGTTAGTCTGTACGA-1,Monocytes +CD8dep_TGGTTCCAGCATGGCA-1,Monocytes +CD8dep_TGGTTCCCACGGTAGA-1,Monocytes +CD8dep_TGGTTCCGTGCGATAG-1,Monocytes +CD8dep_TGGTTCCGTTGCGCAC-1,Monocytes +CD8dep_TGGTTCCTCAGTGTTG-1,Monocytes +CD8dep_TGGTTCCTCCAGATCA-1,Monocytes +CD8dep_TGGTTCCTCGGACAAG-1,Monocytes +CD8dep_TGTATTCCAATAGCGG-1,Monocytes +CD8dep_TGTATTCCAGGCAGTA-1,Monocytes +CD8dep_TGTATTCGTAGCGCAA-1,Monocytes +CD8dep_TGTATTCGTGAGGGTT-1,Granulocytes +CD8dep_TGTATTCGTGTGGCTC-1,Monocytes +CD8dep_TGTATTCGTTGTACAC-1,Macrophages +CD8dep_TGTATTCTCACCAGGC-1,Monocytes +CD8dep_TGTCCCAAGAGACTAT-1,Monocytes +CD8dep_TGTCCCAAGCACAGGT-1,Macrophages +CD8dep_TGTCCCAAGTCGAGTG-1,Monocytes +CD8dep_TGTCCCAAGTGTGAAT-1,Monocytes +CD8dep_TGTCCCACATGAGCGA-1,Monocytes +CD8dep_TGTCCCAGTCCGTGAC-1,Monocytes +CD8dep_TGTCCCAGTTGTCTTT-1,Dendritic cells +CD8dep_TGTCCCATCCTAAGTG-1,Monocytes +CD8dep_TGTGGTACACAAGTAA-1,Dendritic cells +CD8dep_TGTGGTACATAGTAAG-1,Granulocytes +CD8dep_TGTGGTACATCGGTTA-1,Monocytes +CD8dep_TGTGGTACATGTAAGA-1,Monocytes +CD8dep_TGTGGTAGTATAGGGC-1,Dendritic cells +CD8dep_TGTGGTAGTCCCGACA-1,Monocytes +CD8dep_TGTGGTAGTTCGAATC-1,Macrophages +CD8dep_TGTGGTATCGCAAGCC-1,Monocytes +CD8dep_TGTGGTATCTGCGGCA-1,Dendritic cells +CD8dep_TGTGGTATCTTTACGT-1,Monocytes +CD8dep_TGTGTTTAGAGGTTAT-1,Monocytes +CD8dep_TGTGTTTAGTACGTAA-1,Monocytes +CD8dep_TGTGTTTCAAGCCGCT-1,Dendritic cells +CD8dep_TGTGTTTCAGCCACCA-1,Dendritic cells +CD8dep_TGTGTTTGTAAAGTCA-1,B cells +CD8dep_TGTGTTTGTTAGATGA-1,Monocytes +CD8dep_TGTGTTTTCAAAGTAG-1,Monocytes +CD8dep_TGTGTTTTCTCTAGGA-1,Dendritic cells +CD8dep_TGTTCCGAGAGTACCG-1,Monocytes +CD8dep_TGTTCCGGTTAAGAAC-1,Dendritic cells +CD8dep_TGTTCCGGTTGGACCC-1,Monocytes +CD8dep_TGTTCCGTCCGAATGT-1,Macrophages +CD8dep_TGTTCCGTCGGCGCTA-1,NK cells +CD8dep_TGTTCCGTCTAAGCCA-1,Dendritic cells +CD8dep_TGTTCCGTCTGCAGTA-1,Monocytes +CD8dep_TTAACTCAGCCAGTAG-1,Monocytes +CD8dep_TTAACTCAGCCCAACC-1,Monocytes +CD8dep_TTAACTCAGGAGTCTG-1,Monocytes +CD8dep_TTAACTCAGTCTCGGC-1,Monocytes +CD8dep_TTAACTCAGTGCCATT-1,Monocytes +CD8dep_TTAACTCGTAACGCGA-1,Monocytes +CD8dep_TTAACTCGTAGGCATG-1,Dendritic cells +CD8dep_TTAACTCGTCTTGTCC-1,Monocytes +CD8dep_TTAGGACAGCACACAG-1,Monocytes +CD8dep_TTAGGACAGTACGACG-1,Dendritic cells +CD8dep_TTAGGACCAAGGACAC-1,Monocytes +CD8dep_TTAGGACCACTTACGA-1,Monocytes +CD8dep_TTAGGACCAGATCTGT-1,Monocytes +CD8dep_TTAGGACCAGTCCTTC-1,Monocytes +CD8dep_TTAGGACGTCTCTTAT-1,Monocytes +CD8dep_TTAGGACGTGGCCCTA-1,Macrophages +CD8dep_TTAGGACGTTAAAGTG-1,Monocytes +CD8dep_TTAGGACGTTCTCATT-1,Monocytes +CD8dep_TTAGGACTCAGCCTAA-1,Monocytes +CD8dep_TTAGGACTCGAATGGG-1,Monocytes +CD8dep_TTAGGACTCGGGAGTA-1,Monocytes +CD8dep_TTAGGACTCGGTTAAC-1,Monocytes +CD8dep_TTAGGACTCTCTAGGA-1,Monocytes +CD8dep_TTAGGCAAGAAACGAG-1,T cells +CD8dep_TTAGGCAAGACTAAGT-1,Monocytes +CD8dep_TTAGGCAAGCGAAGGG-1,Monocytes +CD8dep_TTAGGCAAGCTAGGCA-1,Monocytes +CD8dep_TTAGGCAAGTAAGTAC-1,Monocytes +CD8dep_TTAGGCAGTGACTCAT-1,Monocytes +CD8dep_TTAGGCAGTTCCACAA-1,Monocytes +CD8dep_TTAGTTCAGAACAATC-1,Dendritic cells +CD8dep_TTAGTTCCAATTCCTT-1,T cells +CD8dep_TTAGTTCCATTAACCG-1,Monocytes +CD8dep_TTAGTTCGTAGCTAAA-1,Monocytes +CD8dep_TTAGTTCGTCTCACCT-1,Monocytes +CD8dep_TTAGTTCGTGATGTCT-1,Monocytes +CD8dep_TTAGTTCTCCTATTCA-1,Granulocytes +CD8dep_TTAGTTCTCGGCATCG-1,NK cells +CD8dep_TTAGTTCTCTGACCTC-1,Monocytes +CD8dep_TTAGTTCTCTGTCAAG-1,Monocytes +CD8dep_TTAGTTCTCTTAACCT-1,Monocytes +CD8dep_TTATGCTAGACCGGAT-1,Monocytes +CD8dep_TTATGCTAGGAGTACC-1,Monocytes +CD8dep_TTATGCTAGGAGTCTG-1,Monocytes +CD8dep_TTATGCTCAAGGACTG-1,Granulocytes +CD8dep_TTATGCTCACCGATAT-1,Monocytes +CD8dep_TTATGCTGTAGCTCCG-1,Monocytes +CD8dep_TTATGCTGTCACAAGG-1,Monocytes +CD8dep_TTATGCTGTCCGTGAC-1,Monocytes +CD8dep_TTATGCTGTGAGTGAC-1,Monocytes +CD8dep_TTATGCTGTGCAGTAG-1,Monocytes +CD8dep_TTATGCTGTTGATTCG-1,Monocytes +CD8dep_TTATGCTGTTGCGTTA-1,Dendritic cells +CD8dep_TTATGCTTCAAAGACA-1,Monocytes +CD8dep_TTCCCAGAGAGCTGCA-1,Monocytes +CD8dep_TTCCCAGAGCCCAGCT-1,Monocytes +CD8dep_TTCCCAGAGGGCACTA-1,Dendritic cells +CD8dep_TTCCCAGCATGTAGTC-1,Monocytes +CD8dep_TTCCCAGGTCTAGTGT-1,Monocytes +CD8dep_TTCCCAGGTGTTCTTT-1,Monocytes +CD8dep_TTCCCAGTCACATAGC-1,Monocytes +CD8dep_TTCCCAGTCAGTACGT-1,Monocytes +CD8dep_TTCGAAGAGCGCTTAT-1,Monocytes +CD8dep_TTCGAAGCAAGCCGTC-1,Monocytes +CD8dep_TTCGAAGTCCACGAAT-1,Monocytes +CD8dep_TTCGGTCAGTGTGAAT-1,Monocytes +CD8dep_TTCGGTCCAAACCCAT-1,Monocytes +CD8dep_TTCGGTCCACGAAACG-1,Monocytes +CD8dep_TTCGGTCCATAGACTC-1,Monocytes +CD8dep_TTCGGTCCATCACGTA-1,Monocytes +CD8dep_TTCGGTCGTCTGCGGT-1,Macrophages +CD8dep_TTCGGTCTCCCTTGCA-1,Dendritic cells +CD8dep_TTCGGTCTCGGATGTT-1,Monocytes +CD8dep_TTCGGTCTCGGTTCGG-1,Monocytes +CD8dep_TTCTACAAGACAATAC-1,Monocytes +CD8dep_TTCTACAAGAGACTAT-1,Monocytes +CD8dep_TTCTACAAGCCAACAG-1,Monocytes +CD8dep_TTCTACACAAGCCATT-1,Monocytes +CD8dep_TTCTACACAGTAACGG-1,Granulocytes +CD8dep_TTCTACAGTACGACCC-1,Monocytes +CD8dep_TTCTACAGTCAACTGT-1,Monocytes +CD8dep_TTCTACAGTCATATCG-1,Monocytes +CD8dep_TTCTACAGTCTAAACC-1,Monocytes +CD8dep_TTCTACAGTGCACGAA-1,Monocytes +CD8dep_TTCTACATCAACCATG-1,Monocytes +CD8dep_TTCTACATCGTGGACC-1,Monocytes +CD8dep_TTCTCAAAGATCTGAA-1,Monocytes +CD8dep_TTCTCAAAGCTCCTTC-1,Monocytes +CD8dep_TTCTCAACAAGTTAAG-1,Macrophages +CD8dep_TTCTCAACACTCTGTC-1,Dendritic cells +CD8dep_TTCTCAACAGTCAGCC-1,Monocytes +CD8dep_TTCTCAACATGTCCTC-1,Monocytes +CD8dep_TTCTCAACATGTCGAT-1,T cells +CD8dep_TTCTCAAGTACGCACC-1,Monocytes +CD8dep_TTCTCAAGTCGGCACT-1,Monocytes +CD8dep_TTCTCAATCACGCGGT-1,Monocytes +CD8dep_TTCTCAATCAGCGACC-1,Monocytes +CD8dep_TTCTCAATCCTCAACC-1,Monocytes +CD8dep_TTCTCAATCTACTCAT-1,Monocytes +CD8dep_TTCTCCTCAGCGTCCA-1,Monocytes +CD8dep_TTCTCCTCAGTCACTA-1,Macrophages +CD8dep_TTCTCCTCATATACCG-1,Macrophages +CD8dep_TTCTCCTCATTAGGCT-1,Monocytes +CD8dep_TTCTCCTGTAACGACG-1,Dendritic cells +CD8dep_TTCTCCTGTGTCTGAT-1,Monocytes +CD8dep_TTCTCCTGTTAAGATG-1,Macrophages +CD8dep_TTCTCCTTCACATACG-1,Dendritic cells +CD8dep_TTCTCCTTCGAACTGT-1,Dendritic cells +CD8dep_TTCTTAGAGAGGTTAT-1,Monocytes +CD8dep_TTCTTAGAGAGTGACC-1,Dendritic cells +CD8dep_TTCTTAGAGATGAGAG-1,Monocytes +CD8dep_TTCTTAGAGCAGATCG-1,Monocytes +CD8dep_TTCTTAGAGCCACGCT-1,Monocytes +CD8dep_TTCTTAGAGCTAAACA-1,Dendritic cells +CD8dep_TTCTTAGAGGAGTTTA-1,Macrophages +CD8dep_TTCTTAGCACAGATTC-1,Monocytes +CD8dep_TTCTTAGCACGAAGCA-1,Monocytes +CD8dep_TTCTTAGCAGCAGTTT-1,Monocytes +CD8dep_TTCTTAGGTTCATGGT-1,Monocytes +CD8dep_TTCTTAGGTTTAGCTG-1,Monocytes +CD8dep_TTCTTAGTCAAGCCTA-1,Monocytes +CD8dep_TTGAACGAGTGCGTGA-1,Monocytes +CD8dep_TTGAACGGTGCAACGA-1,Monocytes +CD8dep_TTGAACGGTGCCTGTG-1,Monocytes +CD8dep_TTGAACGGTTAGATGA-1,Monocytes +CD8dep_TTGAACGTCATCTGCC-1,Dendritic cells +CD8dep_TTGAACGTCCACGTTC-1,Granulocytes +CD8dep_TTGAACGTCGGTCCGA-1,Monocytes +CD8dep_TTGAACGTCTAACTCT-1,Monocytes +CD8dep_TTGAACGTCTCTAGGA-1,Monocytes +CD8dep_TTGACTTAGCGATCCC-1,Monocytes +CD8dep_TTGACTTAGCGTGAGT-1,Monocytes +CD8dep_TTGACTTAGCTTATCG-1,Monocytes +CD8dep_TTGACTTAGGTTCCTA-1,Monocytes +CD8dep_TTGACTTCAAACTGCT-1,Granulocytes +CD8dep_TTGACTTCACCGATAT-1,Monocytes +CD8dep_TTGACTTCAGGGCATA-1,Monocytes +CD8dep_TTGACTTCATTACCTT-1,Monocytes +CD8dep_TTGACTTGTAGGGACT-1,Monocytes +CD8dep_TTGACTTGTGCATCTA-1,Monocytes +CD8dep_TTGACTTGTGGGTATG-1,Monocytes +CD8dep_TTGCCGTCAATAAGCA-1,Monocytes +CD8dep_TTGCCGTCATTAACCG-1,Monocytes +CD8dep_TTGCCGTGTGCAGACA-1,Macrophages +CD8dep_TTGCCGTTCAGCATGT-1,Monocytes +CD8dep_TTGCGTCAGATATACG-1,Monocytes +CD8dep_TTGCGTCAGCTAGTCT-1,Monocytes +CD8dep_TTGCGTCAGGACACCA-1,Monocytes +CD8dep_TTGCGTCAGGATATAC-1,Monocytes +CD8dep_TTGCGTCAGGGTTCCC-1,Monocytes +CD8dep_TTGCGTCCAAACTGCT-1,Monocytes +CD8dep_TTGCGTCCACAGTCGC-1,Monocytes +CD8dep_TTGCGTCGTACAGCAG-1,Monocytes +CD8dep_TTGCGTCGTCGCTTTC-1,Monocytes +CD8dep_TTGCGTCGTCGGCTCA-1,Monocytes +CD8dep_TTGCGTCGTTGAACTC-1,Monocytes +CD8dep_TTGCGTCTCGTTTAGG-1,Monocytes +CD8dep_TTGCGTCTCTCAACTT-1,Monocytes +CD8dep_TTGGAACAGATGCCTT-1,Monocytes +CD8dep_TTGGAACAGCACACAG-1,Dendritic cells +CD8dep_TTGGAACAGCCGATTT-1,Monocytes +CD8dep_TTGGAACAGGGCATGT-1,Monocytes +CD8dep_TTGGAACCAAGAAGAG-1,Dendritic cells +CD8dep_TTGGAACCAGGTGGAT-1,Monocytes +CD8dep_TTGGAACGTATTCGTG-1,Macrophages +CD8dep_TTGGAACGTCCGCTGA-1,Dendritic cells +CD8dep_TTGGAACGTTAGTGGG-1,Monocytes +CD8dep_TTGGAACGTTCCCTTG-1,Monocytes +CD8dep_TTGGCAAAGAGCAATT-1,Monocytes +CD8dep_TTGGCAAAGGTAGCTG-1,Monocytes +CD8dep_TTGGCAACACCGTTGG-1,Monocytes +CD8dep_TTGGCAACATGGGACA-1,Monocytes +CD8dep_TTGGCAAGTCATCGGC-1,Monocytes +CD8dep_TTGGCAATCGCCTGTT-1,Monocytes +CD8dep_TTGTAGGAGCCCTAAT-1,Granulocytes +CD8dep_TTGTAGGCATACGCTA-1,Monocytes +CD8dep_TTGTAGGGTCTAGTGT-1,Monocytes +CD8dep_TTGTAGGGTGTAACGG-1,Granulocytes +CD8dep_TTGTAGGGTTGGAGGT-1,Monocytes +CD8dep_TTGTAGGTCGAGAACG-1,Monocytes +CD8dep_TTGTAGGTCGCAGGCT-1,Monocytes +CD8dep_TTGTAGGTCGGACAAG-1,Monocytes +CD8dep_TTGTAGGTCGTGGTCG-1,Monocytes +CD8dep_TTGTAGGTCTGCGTAA-1,Monocytes +CD8dep_TTTACTGAGAATTGTG-1,Monocytes +CD8dep_TTTACTGAGGCCCTCA-1,Granulocytes +CD8dep_TTTACTGAGTACGACG-1,Monocytes +CD8dep_TTTACTGAGTCAATAG-1,Monocytes +CD8dep_TTTACTGAGTGTGAAT-1,Monocytes +CD8dep_TTTACTGCAAGACACG-1,Monocytes +CD8dep_TTTACTGCAGACGCCT-1,Granulocytes +CD8dep_TTTACTGCATCTGGTA-1,Monocytes +CD8dep_TTTACTGCATTCTCAT-1,Macrophages +CD8dep_TTTACTGGTGCAGACA-1,Monocytes +CD8dep_TTTACTGGTGTGAATA-1,Dendritic cells +CD8dep_TTTACTGGTTCTGGTA-1,Monocytes +CD8dep_TTTACTGTCAACACTG-1,Monocytes +CD8dep_TTTACTGTCATGCAAC-1,Dendritic cells +CD8dep_TTTACTGTCTTCAACT-1,Monocytes +CD8dep_TTTATGCCAAGTTGTC-1,Monocytes +CD8dep_TTTATGCCACGTGAGA-1,Monocytes +CD8dep_TTTATGCCAGTGACAG-1,Monocytes +CD8dep_TTTATGCGTAAGGATT-1,Monocytes +CD8dep_TTTATGCGTCTAGCGC-1,Dendritic cells +CD8dep_TTTATGCTCGGTTAAC-1,Macrophages +CD8dep_TTTCCTCAGATCGGGT-1,Monocytes +CD8dep_TTTCCTCAGCTGAAAT-1,Monocytes +CD8dep_TTTCCTCAGTCTTGCA-1,Monocytes +CD8dep_TTTCCTCCACCTGGTG-1,Dendritic cells +CD8dep_TTTCCTCGTATCTGCA-1,Monocytes +CD8dep_TTTCCTCGTGCGCTTG-1,Monocytes +CD8dep_TTTCCTCGTGTAATGA-1,Monocytes +CD8dep_TTTCCTCGTGTGCCTG-1,Monocytes +CD8dep_TTTCCTCGTTCTGAAC-1,Macrophages +CD8dep_TTTCCTCTCATCTGTT-1,Monocytes +CD8dep_TTTCCTCTCTTTACGT-1,Monocytes +CD8dep_TTTGCGCAGAATGTTG-1,Monocytes +CD8dep_TTTGCGCCATCGTCGG-1,Monocytes +CD8dep_TTTGCGCCATGTCTCC-1,Monocytes +CD8dep_TTTGCGCGTCCGAACC-1,Monocytes +CD8dep_TTTGCGCTCCTACAGA-1,Monocytes +CD8dep_TTTGCGCTCGAATGGG-1,Monocytes +CD8dep_TTTGCGCTCGCTAGCG-1,Monocytes +CD8dep_TTTGCGCTCTCCAGGG-1,Dendritic cells +CD8dep_TTTGGTTAGAAGATTC-1,Macrophages +CD8dep_TTTGGTTAGACAGAGA-1,Dendritic cells +CD8dep_TTTGGTTAGATCCCGC-1,Monocytes +CD8dep_TTTGGTTCAACACCCG-1,Monocytes +CD8dep_TTTGGTTCATATGCTG-1,Monocytes +CD8dep_TTTGGTTGTTCCACAA-1,Monocytes +CD8dep_TTTGGTTGTTGCGCAC-1,Dendritic cells +CD8dep_TTTGGTTTCGTGGACC-1,Dendritic cells +CD8dep_TTTGGTTTCTGATACG-1,Monocytes +CD8dep_TTTGTCAAGACGACGT-1,Monocytes +CD8dep_TTTGTCAAGGACCACA-1,Dendritic cells +CD8dep_TTTGTCACATCGGTTA-1,Macrophages +CD8dep_TTTGTCAGTACTTCTT-1,Monocytes +CD8dep_TTTGTCAGTCGCTTCT-1,Monocytes +CD8dep_TTTGTCAGTTCAGTAC-1,Monocytes +CD8dep_TTTGTCATCGTAGGAG-1,Monocytes diff --git a/vignettes/images/ProcessInputData1.png b/vignettes/images/ProcessInputData1.png new file mode 100644 index 0000000..de0eb06 Binary files /dev/null and b/vignettes/images/ProcessInputData1.png differ diff --git a/vignettes/images/ProcessInputData2.png b/vignettes/images/ProcessInputData2.png new file mode 100644 index 0000000..7f07fe9 Binary files /dev/null and b/vignettes/images/ProcessInputData2.png differ diff --git a/vignettes/images/QC1.png b/vignettes/images/QC1.png new file mode 100644 index 0000000..35c9f78 Binary files /dev/null and b/vignettes/images/QC1.png differ diff --git a/vignettes/images/QC2.png b/vignettes/images/QC2.png new file mode 100644 index 0000000..369953e Binary files /dev/null and b/vignettes/images/QC2.png differ diff --git a/vignettes/images/QC3.png b/vignettes/images/QC3.png new file mode 100644 index 0000000..3668caf Binary files /dev/null and b/vignettes/images/QC3.png differ diff --git a/vignettes/images/RNC.png b/vignettes/images/RNC.png new file mode 100644 index 0000000..bd47367 Binary files /dev/null and b/vignettes/images/RNC.png differ diff --git a/vignettes/images/Sample_Metadata.txt b/vignettes/images/Sample_Metadata.txt new file mode 100644 index 0000000..8e40bff --- /dev/null +++ b/vignettes/images/Sample_Metadata.txt @@ -0,0 +1,6 @@ +"Sample_Name" "Rename" "Treatment" +"SCAF1713_1_1" "PBS" "WT" +"SCAF1714_2_1" "ENT" "Entinostat" +"SCAF1715_3_1" "NHSIL12" "NHS-IL12" +"SCAF1716_4_1" "Combo" "Entinostat + NHS-IL12" +"SCAF1717_5_1" "CD8dep" "Entinostat + NHS-IL12" diff --git a/vignettes/images/SubRec_recl.png b/vignettes/images/SubRec_recl.png new file mode 100644 index 0000000..4e993a7 Binary files /dev/null and b/vignettes/images/SubRec_recl.png differ diff --git a/vignettes/images/SubRec_sub1.png b/vignettes/images/SubRec_sub1.png new file mode 100644 index 0000000..9d165a7 Binary files /dev/null and b/vignettes/images/SubRec_sub1.png differ diff --git a/vignettes/images/SubRec_sub2.png b/vignettes/images/SubRec_sub2.png new file mode 100644 index 0000000..09a9ca9 Binary files /dev/null and b/vignettes/images/SubRec_sub2.png differ diff --git a/vignettes/images/Vis_3D.html b/vignettes/images/Vis_3D.html new file mode 100644 index 0000000..1313685 --- /dev/null +++ b/vignettes/images/Vis_3D.html @@ -0,0 +1,1961 @@ + + + + +plotly + + + + + + + + + + + + +
    +
    +
    + + + + diff --git a/vignettes/images/Vis_3D_files/crosstalk-1.2.1/css/crosstalk.min.css b/vignettes/images/Vis_3D_files/crosstalk-1.2.1/css/crosstalk.min.css new file mode 100644 index 0000000..6b45382 --- /dev/null +++ b/vignettes/images/Vis_3D_files/crosstalk-1.2.1/css/crosstalk.min.css @@ -0,0 +1 @@ +.container-fluid.crosstalk-bscols{margin-left:-30px;margin-right:-30px;white-space:normal}body>.container-fluid.crosstalk-bscols{margin-left:auto;margin-right:auto}.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column{display:inline-block;padding-right:12px;vertical-align:top}@media only screen and (max-width: 480px){.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column{display:block;padding-right:inherit}}.crosstalk-input{margin-bottom:15px}.crosstalk-input .control-label{margin-bottom:0;vertical-align:middle}.crosstalk-input input[type="checkbox"]{margin:4px 0 0;margin-top:1px;line-height:normal}.crosstalk-input .checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.crosstalk-input .checkbox>label{padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.crosstalk-input .checkbox input[type="checkbox"],.crosstalk-input .checkbox-inline input[type="checkbox"]{position:absolute;margin-top:2px;margin-left:-20px}.crosstalk-input .checkbox+.checkbox{margin-top:-5px}.crosstalk-input .checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.crosstalk-input .checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px} diff --git a/vignettes/images/Vis_3D_files/crosstalk-1.2.1/js/crosstalk.js b/vignettes/images/Vis_3D_files/crosstalk-1.2.1/js/crosstalk.js new file mode 100644 index 0000000..fd9eb53 --- /dev/null +++ b/vignettes/images/Vis_3D_files/crosstalk-1.2.1/js/crosstalk.js @@ -0,0 +1,1474 @@ +(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o b) { + return 1; + } +} + +/** + * @private + */ + +var FilterSet = function () { + function FilterSet() { + _classCallCheck(this, FilterSet); + + this.reset(); + } + + _createClass(FilterSet, [{ + key: "reset", + value: function reset() { + // Key: handle ID, Value: array of selected keys, or null + this._handles = {}; + // Key: key string, Value: count of handles that include it + this._keys = {}; + this._value = null; + this._activeHandles = 0; + } + }, { + key: "update", + value: function update(handleId, keys) { + if (keys !== null) { + keys = keys.slice(0); // clone before sorting + keys.sort(naturalComparator); + } + + var _diffSortedLists = (0, _util.diffSortedLists)(this._handles[handleId], keys), + added = _diffSortedLists.added, + removed = _diffSortedLists.removed; + + this._handles[handleId] = keys; + + for (var i = 0; i < added.length; i++) { + this._keys[added[i]] = (this._keys[added[i]] || 0) + 1; + } + for (var _i = 0; _i < removed.length; _i++) { + this._keys[removed[_i]]--; + } + + this._updateValue(keys); + } + + /** + * @param {string[]} keys Sorted array of strings that indicate + * a superset of possible keys. + * @private + */ + + }, { + key: "_updateValue", + value: function _updateValue() { + var keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._allKeys; + + var handleCount = Object.keys(this._handles).length; + if (handleCount === 0) { + this._value = null; + } else { + this._value = []; + for (var i = 0; i < keys.length; i++) { + var count = this._keys[keys[i]]; + if (count === handleCount) { + this._value.push(keys[i]); + } + } + } + } + }, { + key: "clear", + value: function clear(handleId) { + if (typeof this._handles[handleId] === "undefined") { + return; + } + + var keys = this._handles[handleId]; + if (!keys) { + keys = []; + } + + for (var i = 0; i < keys.length; i++) { + this._keys[keys[i]]--; + } + delete this._handles[handleId]; + + this._updateValue(); + } + }, { + key: "value", + get: function get() { + return this._value; + } + }, { + key: "_allKeys", + get: function get() { + var allKeys = Object.keys(this._keys); + allKeys.sort(naturalComparator); + return allKeys; + } + }]); + + return FilterSet; +}(); + +exports.default = FilterSet; + +},{"./util":11}],4:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +exports.default = group; + +var _var2 = require("./var"); + +var _var3 = _interopRequireDefault(_var2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +// Use a global so that multiple copies of crosstalk.js can be loaded and still +// have groups behave as singletons across all copies. +global.__crosstalk_groups = global.__crosstalk_groups || {}; +var groups = global.__crosstalk_groups; + +function group(groupName) { + if (groupName && typeof groupName === "string") { + if (!groups.hasOwnProperty(groupName)) { + groups[groupName] = new Group(groupName); + } + return groups[groupName]; + } else if ((typeof groupName === "undefined" ? "undefined" : _typeof(groupName)) === "object" && groupName._vars && groupName.var) { + // Appears to already be a group object + return groupName; + } else if (Array.isArray(groupName) && groupName.length == 1 && typeof groupName[0] === "string") { + return group(groupName[0]); + } else { + throw new Error("Invalid groupName argument"); + } +} + +var Group = function () { + function Group(name) { + _classCallCheck(this, Group); + + this.name = name; + this._vars = {}; + } + + _createClass(Group, [{ + key: "var", + value: function _var(name) { + if (!name || typeof name !== "string") { + throw new Error("Invalid var name"); + } + + if (!this._vars.hasOwnProperty(name)) this._vars[name] = new _var3.default(this, name); + return this._vars[name]; + } + }, { + key: "has", + value: function has(name) { + if (!name || typeof name !== "string") { + throw new Error("Invalid var name"); + } + + return this._vars.hasOwnProperty(name); + } + }]); + + return Group; +}(); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./var":12}],5:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _group = require("./group"); + +var _group2 = _interopRequireDefault(_group); + +var _selection = require("./selection"); + +var _filter = require("./filter"); + +var _input = require("./input"); + +require("./input_selectize"); + +require("./input_checkboxgroup"); + +require("./input_slider"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var defaultGroup = (0, _group2.default)("default"); + +function var_(name) { + return defaultGroup.var(name); +} + +function has(name) { + return defaultGroup.has(name); +} + +if (global.Shiny) { + global.Shiny.addCustomMessageHandler("update-client-value", function (message) { + if (typeof message.group === "string") { + (0, _group2.default)(message.group).var(message.name).set(message.value); + } else { + var_(message.name).set(message.value); + } + }); +} + +var crosstalk = { + group: _group2.default, + var: var_, + has: has, + SelectionHandle: _selection.SelectionHandle, + FilterHandle: _filter.FilterHandle, + bind: _input.bind +}; + +/** + * @namespace crosstalk + */ +exports.default = crosstalk; + +global.crosstalk = crosstalk; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./group":4,"./input":6,"./input_checkboxgroup":7,"./input_selectize":8,"./input_slider":9,"./selection":10}],6:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.register = register; +exports.bind = bind; +var $ = global.jQuery; + +var bindings = {}; + +function register(reg) { + bindings[reg.className] = reg; + if (global.document && global.document.readyState !== "complete") { + $(function () { + bind(); + }); + } else if (global.document) { + setTimeout(bind, 100); + } +} + +function bind() { + Object.keys(bindings).forEach(function (className) { + var binding = bindings[className]; + $("." + binding.className).not(".crosstalk-input-bound").each(function (i, el) { + bindInstance(binding, el); + }); + }); +} + +// Escape jQuery identifier +function $escape(val) { + return val.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); +} + +function bindEl(el) { + var $el = $(el); + Object.keys(bindings).forEach(function (className) { + if ($el.hasClass(className) && !$el.hasClass("crosstalk-input-bound")) { + var binding = bindings[className]; + bindInstance(binding, el); + } + }); +} + +function bindInstance(binding, el) { + var jsonEl = $(el).find("script[type='application/json'][data-for='" + $escape(el.id) + "']"); + var data = JSON.parse(jsonEl[0].innerText); + + var instance = binding.factory(el, data); + $(el).data("crosstalk-instance", instance); + $(el).addClass("crosstalk-input-bound"); +} + +if (global.Shiny) { + var inputBinding = new global.Shiny.InputBinding(); + var _$ = global.jQuery; + _$.extend(inputBinding, { + find: function find(scope) { + return _$(scope).find(".crosstalk-input"); + }, + initialize: function initialize(el) { + if (!_$(el).hasClass("crosstalk-input-bound")) { + bindEl(el); + } + }, + getId: function getId(el) { + return el.id; + }, + getValue: function getValue(el) {}, + setValue: function setValue(el, value) {}, + receiveMessage: function receiveMessage(el, data) {}, + subscribe: function subscribe(el, callback) { + _$(el).data("crosstalk-instance").resume(); + }, + unsubscribe: function unsubscribe(el) { + _$(el).data("crosstalk-instance").suspend(); + } + }); + global.Shiny.inputBindings.register(inputBinding, "crosstalk.inputBinding"); +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{}],7:[function(require,module,exports){ +(function (global){ +"use strict"; + +var _input = require("./input"); + +var input = _interopRequireWildcard(_input); + +var _filter = require("./filter"); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +var $ = global.jQuery; + +input.register({ + className: "crosstalk-input-checkboxgroup", + + factory: function factory(el, data) { + /* + * map: {"groupA": ["keyA", "keyB", ...], ...} + * group: "ct-groupname" + */ + var ctHandle = new _filter.FilterHandle(data.group); + + var lastKnownKeys = void 0; + var $el = $(el); + $el.on("change", "input[type='checkbox']", function () { + var checked = $el.find("input[type='checkbox']:checked"); + if (checked.length === 0) { + lastKnownKeys = null; + ctHandle.clear(); + } else { + var keys = {}; + checked.each(function () { + data.map[this.value].forEach(function (key) { + keys[key] = true; + }); + }); + var keyArray = Object.keys(keys); + keyArray.sort(); + lastKnownKeys = keyArray; + ctHandle.set(keyArray); + } + }); + + return { + suspend: function suspend() { + ctHandle.clear(); + }, + resume: function resume() { + if (lastKnownKeys) ctHandle.set(lastKnownKeys); + } + }; + } +}); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./input":6}],8:[function(require,module,exports){ +(function (global){ +"use strict"; + +var _input = require("./input"); + +var input = _interopRequireWildcard(_input); + +var _util = require("./util"); + +var util = _interopRequireWildcard(_util); + +var _filter = require("./filter"); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +var $ = global.jQuery; + +input.register({ + className: "crosstalk-input-select", + + factory: function factory(el, data) { + /* + * items: {value: [...], label: [...]} + * map: {"groupA": ["keyA", "keyB", ...], ...} + * group: "ct-groupname" + */ + + var first = [{ value: "", label: "(All)" }]; + var items = util.dataframeToD3(data.items); + var opts = { + options: first.concat(items), + valueField: "value", + labelField: "label", + searchField: "label" + }; + + var select = $(el).find("select")[0]; + + var selectize = $(select).selectize(opts)[0].selectize; + + var ctHandle = new _filter.FilterHandle(data.group); + + var lastKnownKeys = void 0; + selectize.on("change", function () { + if (selectize.items.length === 0) { + lastKnownKeys = null; + ctHandle.clear(); + } else { + var keys = {}; + selectize.items.forEach(function (group) { + data.map[group].forEach(function (key) { + keys[key] = true; + }); + }); + var keyArray = Object.keys(keys); + keyArray.sort(); + lastKnownKeys = keyArray; + ctHandle.set(keyArray); + } + }); + + return { + suspend: function suspend() { + ctHandle.clear(); + }, + resume: function resume() { + if (lastKnownKeys) ctHandle.set(lastKnownKeys); + } + }; + } +}); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./input":6,"./util":11}],9:[function(require,module,exports){ +(function (global){ +"use strict"; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _input = require("./input"); + +var input = _interopRequireWildcard(_input); + +var _filter = require("./filter"); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +var $ = global.jQuery; +var strftime = global.strftime; + +input.register({ + className: "crosstalk-input-slider", + + factory: function factory(el, data) { + /* + * map: {"groupA": ["keyA", "keyB", ...], ...} + * group: "ct-groupname" + */ + var ctHandle = new _filter.FilterHandle(data.group); + + var opts = {}; + var $el = $(el).find("input"); + var dataType = $el.data("data-type"); + var timeFormat = $el.data("time-format"); + var round = $el.data("round"); + var timeFormatter = void 0; + + // Set up formatting functions + if (dataType === "date") { + timeFormatter = strftime.utc(); + opts.prettify = function (num) { + return timeFormatter(timeFormat, new Date(num)); + }; + } else if (dataType === "datetime") { + var timezone = $el.data("timezone"); + if (timezone) timeFormatter = strftime.timezone(timezone);else timeFormatter = strftime; + + opts.prettify = function (num) { + return timeFormatter(timeFormat, new Date(num)); + }; + } else if (dataType === "number") { + if (typeof round !== "undefined") opts.prettify = function (num) { + var factor = Math.pow(10, round); + return Math.round(num * factor) / factor; + }; + } + + $el.ionRangeSlider(opts); + + function getValue() { + var result = $el.data("ionRangeSlider").result; + + // Function for converting numeric value from slider to appropriate type. + var convert = void 0; + var dataType = $el.data("data-type"); + if (dataType === "date") { + convert = function convert(val) { + return formatDateUTC(new Date(+val)); + }; + } else if (dataType === "datetime") { + convert = function convert(val) { + // Convert ms to s + return +val / 1000; + }; + } else { + convert = function convert(val) { + return +val; + }; + } + + if ($el.data("ionRangeSlider").options.type === "double") { + return [convert(result.from), convert(result.to)]; + } else { + return convert(result.from); + } + } + + var lastKnownKeys = null; + + $el.on("change.crosstalkSliderInput", function (event) { + if (!$el.data("updating") && !$el.data("animating")) { + var _getValue = getValue(), + _getValue2 = _slicedToArray(_getValue, 2), + from = _getValue2[0], + to = _getValue2[1]; + + var keys = []; + for (var i = 0; i < data.values.length; i++) { + var val = data.values[i]; + if (val >= from && val <= to) { + keys.push(data.keys[i]); + } + } + keys.sort(); + ctHandle.set(keys); + lastKnownKeys = keys; + } + }); + + // let $el = $(el); + // $el.on("change", "input[type="checkbox"]", function() { + // let checked = $el.find("input[type="checkbox"]:checked"); + // if (checked.length === 0) { + // ctHandle.clear(); + // } else { + // let keys = {}; + // checked.each(function() { + // data.map[this.value].forEach(function(key) { + // keys[key] = true; + // }); + // }); + // let keyArray = Object.keys(keys); + // keyArray.sort(); + // ctHandle.set(keyArray); + // } + // }); + + return { + suspend: function suspend() { + ctHandle.clear(); + }, + resume: function resume() { + if (lastKnownKeys) ctHandle.set(lastKnownKeys); + } + }; + } +}); + +// Convert a number to a string with leading zeros +function padZeros(n, digits) { + var str = n.toString(); + while (str.length < digits) { + str = "0" + str; + }return str; +} + +// Given a Date object, return a string in yyyy-mm-dd format, using the +// UTC date. This may be a day off from the date in the local time zone. +function formatDateUTC(date) { + if (date instanceof Date) { + return date.getUTCFullYear() + "-" + padZeros(date.getUTCMonth() + 1, 2) + "-" + padZeros(date.getUTCDate(), 2); + } else { + return null; + } +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./input":6}],10:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.SelectionHandle = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _events = require("./events"); + +var _events2 = _interopRequireDefault(_events); + +var _group = require("./group"); + +var _group2 = _interopRequireDefault(_group); + +var _util = require("./util"); + +var util = _interopRequireWildcard(_util); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/** + * Use this class to read and write (and listen for changes to) the selection + * for a Crosstalk group. This is intended to be used for linked brushing. + * + * If two (or more) `SelectionHandle` instances in the same webpage share the + * same group name, they will share the same state. Setting the selection using + * one `SelectionHandle` instance will result in the `value` property instantly + * changing across the others, and `"change"` event listeners on all instances + * (including the one that initiated the sending) will fire. + * + * @param {string} [group] - The name of the Crosstalk group, or if none, + * null or undefined (or any other falsy value). This can be changed later + * via the [SelectionHandle#setGroup](#setGroup) method. + * @param {Object} [extraInfo] - An object whose properties will be copied to + * the event object whenever an event is emitted. + */ +var SelectionHandle = exports.SelectionHandle = function () { + function SelectionHandle() { + var group = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var extraInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + + _classCallCheck(this, SelectionHandle); + + this._eventRelay = new _events2.default(); + this._emitter = new util.SubscriptionTracker(this._eventRelay); + + // Name of the group we're currently tracking, if any. Can change over time. + this._group = null; + // The Var we're currently tracking, if any. Can change over time. + this._var = null; + // The event handler subscription we currently have on var.on("change"). + this._varOnChangeSub = null; + + this._extraInfo = util.extend({ sender: this }, extraInfo); + + this.setGroup(group); + } + + /** + * Changes the Crosstalk group membership of this SelectionHandle. The group + * being switched away from (if any) will not have its selection value + * modified as a result of calling `setGroup`, even if this handle was the + * most recent handle to set the selection of the group. + * + * The group being switched to (if any) will also not have its selection value + * modified as a result of calling `setGroup`. If you want to set the + * selection value of the new group, call `set` explicitly. + * + * @param {string} group - The name of the Crosstalk group, or null (or + * undefined) to clear the group. + */ + + + _createClass(SelectionHandle, [{ + key: "setGroup", + value: function setGroup(group) { + var _this = this; + + // If group is unchanged, do nothing + if (this._group === group) return; + // Treat null, undefined, and other falsy values the same + if (!this._group && !group) return; + + if (this._var) { + this._var.off("change", this._varOnChangeSub); + this._var = null; + this._varOnChangeSub = null; + } + + this._group = group; + + if (group) { + this._var = (0, _group2.default)(group).var("selection"); + var sub = this._var.on("change", function (e) { + _this._eventRelay.trigger("change", e, _this); + }); + this._varOnChangeSub = sub; + } + } + + /** + * Retrieves the current selection for the group represented by this + * `SelectionHandle`. + * + * - If no selection is active, then this value will be falsy. + * - If a selection is active, but no data points are selected, then this + * value will be an empty array. + * - If a selection is active, and data points are selected, then the keys + * of the selected data points will be present in the array. + */ + + }, { + key: "_mergeExtraInfo", + + + /** + * Combines the given `extraInfo` (if any) with the handle's default + * `_extraInfo` (if any). + * @private + */ + value: function _mergeExtraInfo(extraInfo) { + // Important incidental effect: shallow clone is returned + return util.extend({}, this._extraInfo ? this._extraInfo : null, extraInfo ? extraInfo : null); + } + + /** + * Overwrites the current selection for the group, and raises the `"change"` + * event among all of the group's '`SelectionHandle` instances (including + * this one). + * + * @fires SelectionHandle#change + * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see + * {@link SelectionHandle#value}). + * @param {Object} [extraInfo] - Extra properties to be included on the event + * object that's passed to listeners (in addition to any options that were + * passed into the `SelectionHandle` constructor). + */ + + }, { + key: "set", + value: function set(selectedKeys, extraInfo) { + if (this._var) this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo)); + } + + /** + * Overwrites the current selection for the group, and raises the `"change"` + * event among all of the group's '`SelectionHandle` instances (including + * this one). + * + * @fires SelectionHandle#change + * @param {Object} [extraInfo] - Extra properties to be included on the event + * object that's passed to listeners (in addition to any that were passed + * into the `SelectionHandle` constructor). + */ + + }, { + key: "clear", + value: function clear(extraInfo) { + if (this._var) this.set(void 0, this._mergeExtraInfo(extraInfo)); + } + + /** + * Subscribes to events on this `SelectionHandle`. + * + * @param {string} eventType - Indicates the type of events to listen to. + * Currently, only `"change"` is supported. + * @param {SelectionHandle~listener} listener - The callback function that + * will be invoked when the event occurs. + * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel + * this subscription. + */ + + }, { + key: "on", + value: function on(eventType, listener) { + return this._emitter.on(eventType, listener); + } + + /** + * Cancels event subscriptions created by {@link SelectionHandle#on}. + * + * @param {string} eventType - The type of event to unsubscribe. + * @param {string|SelectionHandle~listener} listener - Either the callback + * function previously passed into {@link SelectionHandle#on}, or the + * string that was returned from {@link SelectionHandle#on}. + */ + + }, { + key: "off", + value: function off(eventType, listener) { + return this._emitter.off(eventType, listener); + } + + /** + * Shuts down the `SelectionHandle` object. + * + * Removes all event listeners that were added through this handle. + */ + + }, { + key: "close", + value: function close() { + this._emitter.removeAllListeners(); + this.setGroup(null); + } + }, { + key: "value", + get: function get() { + return this._var ? this._var.get() : null; + } + }]); + + return SelectionHandle; +}(); + +/** + * @callback SelectionHandle~listener + * @param {Object} event - An object containing details of the event. For + * `"change"` events, this includes the properties `value` (the new + * value of the selection, or `undefined` if no selection is active), + * `oldValue` (the previous value of the selection), and `sender` (the + * `SelectionHandle` instance that made the change). + */ + +/** + * @event SelectionHandle#change + * @type {object} + * @property {object} value - The new value of the selection, or `undefined` + * if no selection is active. + * @property {object} oldValue - The previous value of the selection. + * @property {SelectionHandle} sender - The `SelectionHandle` instance that + * changed the value. + */ + +},{"./events":1,"./group":4,"./util":11}],11:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +exports.extend = extend; +exports.checkSorted = checkSorted; +exports.diffSortedLists = diffSortedLists; +exports.dataframeToD3 = dataframeToD3; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function extend(target) { + for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + sources[_key - 1] = arguments[_key]; + } + + for (var i = 0; i < sources.length; i++) { + var src = sources[i]; + if (typeof src === "undefined" || src === null) continue; + + for (var key in src) { + if (src.hasOwnProperty(key)) { + target[key] = src[key]; + } + } + } + return target; +} + +function checkSorted(list) { + for (var i = 1; i < list.length; i++) { + if (list[i] <= list[i - 1]) { + throw new Error("List is not sorted or contains duplicate"); + } + } +} + +function diffSortedLists(a, b) { + var i_a = 0; + var i_b = 0; + + if (!a) a = []; + if (!b) b = []; + + var a_only = []; + var b_only = []; + + checkSorted(a); + checkSorted(b); + + while (i_a < a.length && i_b < b.length) { + if (a[i_a] === b[i_b]) { + i_a++; + i_b++; + } else if (a[i_a] < b[i_b]) { + a_only.push(a[i_a++]); + } else { + b_only.push(b[i_b++]); + } + } + + if (i_a < a.length) a_only = a_only.concat(a.slice(i_a)); + if (i_b < b.length) b_only = b_only.concat(b.slice(i_b)); + return { + removed: a_only, + added: b_only + }; +} + +// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... } +// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ] +function dataframeToD3(df) { + var names = []; + var length = void 0; + for (var name in df) { + if (df.hasOwnProperty(name)) names.push(name); + if (_typeof(df[name]) !== "object" || typeof df[name].length === "undefined") { + throw new Error("All fields must be arrays"); + } else if (typeof length !== "undefined" && length !== df[name].length) { + throw new Error("All fields must be arrays of the same length"); + } + length = df[name].length; + } + var results = []; + var item = void 0; + for (var row = 0; row < length; row++) { + item = {}; + for (var col = 0; col < names.length; col++) { + item[names[col]] = df[names[col]][row]; + } + results.push(item); + } + return results; +} + +/** + * Keeps track of all event listener additions/removals and lets all active + * listeners be removed with a single operation. + * + * @private + */ + +var SubscriptionTracker = exports.SubscriptionTracker = function () { + function SubscriptionTracker(emitter) { + _classCallCheck(this, SubscriptionTracker); + + this._emitter = emitter; + this._subs = {}; + } + + _createClass(SubscriptionTracker, [{ + key: "on", + value: function on(eventType, listener) { + var sub = this._emitter.on(eventType, listener); + this._subs[sub] = eventType; + return sub; + } + }, { + key: "off", + value: function off(eventType, listener) { + var sub = this._emitter.off(eventType, listener); + if (sub) { + delete this._subs[sub]; + } + return sub; + } + }, { + key: "removeAllListeners", + value: function removeAllListeners() { + var _this = this; + + var current_subs = this._subs; + this._subs = {}; + Object.keys(current_subs).forEach(function (sub) { + _this._emitter.off(current_subs[sub], sub); + }); + } + }]); + + return SubscriptionTracker; +}(); + +},{}],12:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _events = require("./events"); + +var _events2 = _interopRequireDefault(_events); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Var = function () { + function Var(group, name, /*optional*/value) { + _classCallCheck(this, Var); + + this._group = group; + this._name = name; + this._value = value; + this._events = new _events2.default(); + } + + _createClass(Var, [{ + key: "get", + value: function get() { + return this._value; + } + }, { + key: "set", + value: function set(value, /*optional*/event) { + if (this._value === value) { + // Do nothing; the value hasn't changed + return; + } + var oldValue = this._value; + this._value = value; + // Alert JavaScript listeners that the value has changed + var evt = {}; + if (event && (typeof event === "undefined" ? "undefined" : _typeof(event)) === "object") { + for (var k in event) { + if (event.hasOwnProperty(k)) evt[k] = event[k]; + } + } + evt.oldValue = oldValue; + evt.value = value; + this._events.trigger("change", evt, this); + + // TODO: Make this extensible, to let arbitrary back-ends know that + // something has changed + if (global.Shiny && global.Shiny.onInputChange) { + global.Shiny.onInputChange(".clientValue-" + (this._group.name !== null ? this._group.name + "-" : "") + this._name, typeof value === "undefined" ? null : value); + } + } + }, { + key: "on", + value: function on(eventType, listener) { + return this._events.on(eventType, listener); + } + }, { + key: "off", + value: function off(eventType, listener) { + return this._events.off(eventType, listener); + } + }]); + + return Var; +}(); + +exports.default = Var; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./events":1}]},{},[5]) +//# sourceMappingURL=crosstalk.js.map diff --git a/vignettes/images/Vis_3D_files/crosstalk-1.2.1/js/crosstalk.js.map b/vignettes/images/Vis_3D_files/crosstalk-1.2.1/js/crosstalk.js.map new file mode 100644 index 0000000..cff94f0 --- /dev/null +++ b/vignettes/images/Vis_3D_files/crosstalk-1.2.1/js/crosstalk.js.map @@ -0,0 +1,37 @@ +{ + "version": 3, + "sources": [ + "node_modules/browser-pack/_prelude.js", + "javascript/src/events.js", + "javascript/src/filter.js", + "javascript/src/filterset.js", + "javascript/src/group.js", + "javascript/src/index.js", + "javascript/src/input.js", + "javascript/src/input_checkboxgroup.js", + "javascript/src/input_selectize.js", + "javascript/src/input_slider.js", + "javascript/src/selection.js", + "javascript/src/util.js", + "javascript/src/var.js" + ], + "names": [], + "mappings": "AAAA;;;;;;;;;;;ICAqB,M;AACnB,oBAAc;AAAA;;AACZ,SAAK,MAAL,GAAc,EAAd;AACA,SAAK,IAAL,GAAY,CAAZ;AACD;;;;uBAEE,S,EAAW,Q,EAAU;AACtB,UAAI,OAAO,KAAK,MAAL,CAAY,SAAZ,CAAX;AACA,UAAI,CAAC,IAAL,EAAW;AACT,eAAO,KAAK,MAAL,CAAY,SAAZ,IAAyB,EAAhC;AACD;AACD,UAAI,MAAM,QAAS,KAAK,IAAL,EAAnB;AACA,WAAK,GAAL,IAAY,QAAZ;AACA,aAAO,GAAP;AACD;;AAED;;;;wBACI,S,EAAW,Q,EAAU;AACvB,UAAI,OAAO,KAAK,MAAL,CAAY,SAAZ,CAAX;AACA,UAAI,OAAO,QAAP,KAAqB,UAAzB,EAAqC;AACnC,aAAK,IAAI,GAAT,IAAgB,IAAhB,EAAsB;AACpB,cAAI,KAAK,cAAL,CAAoB,GAApB,CAAJ,EAA8B;AAC5B,gBAAI,KAAK,GAAL,MAAc,QAAlB,EAA4B;AAC1B,qBAAO,KAAK,GAAL,CAAP;AACA,qBAAO,GAAP;AACD;AACF;AACF;AACD,eAAO,KAAP;AACD,OAVD,MAUO,IAAI,OAAO,QAAP,KAAqB,QAAzB,EAAmC;AACxC,YAAI,QAAQ,KAAK,QAAL,CAAZ,EAA4B;AAC1B,iBAAO,KAAK,QAAL,CAAP;AACA,iBAAO,QAAP;AACD;AACD,eAAO,KAAP;AACD,OANM,MAMA;AACL,cAAM,IAAI,KAAJ,CAAU,8BAAV,CAAN;AACD;AACF;;;4BAEO,S,EAAW,G,EAAK,O,EAAS;AAC/B,UAAI,OAAO,KAAK,MAAL,CAAY,SAAZ,CAAX;AACA,WAAK,IAAI,GAAT,IAAgB,IAAhB,EAAsB;AACpB,YAAI,KAAK,cAAL,CAAoB,GAApB,CAAJ,EAA8B;AAC5B,eAAK,GAAL,EAAU,IAAV,CAAe,OAAf,EAAwB,GAAxB;AACD;AACF;AACF;;;;;;kBA/CkB,M;;;;;;;;;;;;ACArB;;;;AACA;;;;AACA;;;;AACA;;IAAY,I;;;;;;;;AAEZ,SAAS,YAAT,CAAsB,KAAtB,EAA6B;AAC3B,MAAI,QAAQ,MAAM,GAAN,CAAU,WAAV,CAAZ;AACA,MAAI,SAAS,MAAM,GAAN,EAAb;AACA,MAAI,CAAC,MAAL,EAAa;AACX,aAAS,yBAAT;AACA,UAAM,GAAN,CAAU,MAAV;AACD;AACD,SAAO,MAAP;AACD;;AAED,IAAI,KAAK,CAAT;AACA,SAAS,MAAT,GAAkB;AAChB,SAAO,IAAP;AACD;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;IAwBa,Y,WAAA,Y;AACX,wBAAY,KAAZ,EAAmB,SAAnB,EAA8B;AAAA;;AAC5B,SAAK,WAAL,GAAmB,sBAAnB;AACA,SAAK,QAAL,GAAgB,IAAI,KAAK,mBAAT,CAA6B,KAAK,WAAlC,CAAhB;;AAEA;AACA,SAAK,MAAL,GAAc,IAAd;AACA;AACA,SAAK,UAAL,GAAkB,IAAlB;AACA;AACA,SAAK,UAAL,GAAkB,IAAlB;AACA;AACA,SAAK,eAAL,GAAuB,IAAvB;;AAEA,SAAK,UAAL,GAAkB,KAAK,MAAL,CAAY,EAAE,QAAQ,IAAV,EAAZ,EAA8B,SAA9B,CAAlB;;AAEA,SAAK,GAAL,GAAW,WAAW,QAAtB;;AAEA,SAAK,QAAL,CAAc,KAAd;AACD;;AAED;;;;;;;;;;;;;;6BAUS,K,EAAO;AAAA;;AACd;AACA,UAAI,KAAK,MAAL,KAAgB,KAApB,EACE;AACF;AACA,UAAI,CAAC,KAAK,MAAN,IAAgB,CAAC,KAArB,EACE;;AAEF,UAAI,KAAK,UAAT,EAAqB;AACnB,aAAK,UAAL,CAAgB,GAAhB,CAAoB,QAApB,EAA8B,KAAK,eAAnC;AACA,aAAK,KAAL;AACA,aAAK,eAAL,GAAuB,IAAvB;AACA,aAAK,UAAL,GAAkB,IAAlB;AACA,aAAK,UAAL,GAAkB,IAAlB;AACD;;AAED,WAAK,MAAL,GAAc,KAAd;;AAEA,UAAI,KAAJ,EAAW;AACT,gBAAQ,qBAAI,KAAJ,CAAR;AACA,aAAK,UAAL,GAAkB,aAAa,KAAb,CAAlB;AACA,aAAK,UAAL,GAAkB,qBAAI,KAAJ,EAAW,GAAX,CAAe,QAAf,CAAlB;AACA,YAAI,MAAM,KAAK,UAAL,CAAgB,EAAhB,CAAmB,QAAnB,EAA6B,UAAC,CAAD,EAAO;AAC5C,gBAAK,WAAL,CAAiB,OAAjB,CAAyB,QAAzB,EAAmC,CAAnC;AACD,SAFS,CAAV;AAGA,aAAK,eAAL,GAAuB,GAAvB;AACD;AACF;;AAED;;;;;;;;oCAKgB,S,EAAW;AACzB,aAAO,KAAK,MAAL,CAAY,EAAZ,EACL,KAAK,UAAL,GAAkB,KAAK,UAAvB,GAAoC,IAD/B,EAEL,YAAY,SAAZ,GAAwB,IAFnB,CAAP;AAGD;;AAED;;;;;;;4BAIQ;AACN,WAAK,QAAL,CAAc,kBAAd;AACA,WAAK,KAAL;AACA,WAAK,QAAL,CAAc,IAAd;AACD;;AAED;;;;;;;;;;;;0BASM,S,EAAW;AACf,UAAI,CAAC,KAAK,UAAV,EACE;AACF,WAAK,UAAL,CAAgB,KAAhB,CAAsB,KAAK,GAA3B;AACA,WAAK,SAAL,CAAe,SAAf;AACD;;AAED;;;;;;;;;;;;;;;;;;;;wBAiBI,I,EAAM,S,EAAW;AACnB,UAAI,CAAC,KAAK,UAAV,EACE;AACF,WAAK,UAAL,CAAgB,MAAhB,CAAuB,KAAK,GAA5B,EAAiC,IAAjC;AACA,WAAK,SAAL,CAAe,SAAf;AACD;;AAED;;;;;;;;;;AASA;;;;;;;;;;uBAUG,S,EAAW,Q,EAAU;AACtB,aAAO,KAAK,QAAL,CAAc,EAAd,CAAiB,SAAjB,EAA4B,QAA5B,CAAP;AACD;;AAED;;;;;;;;;;;wBAQI,S,EAAW,Q,EAAU;AACvB,aAAO,KAAK,QAAL,CAAc,GAAd,CAAkB,SAAlB,EAA6B,QAA7B,CAAP;AACD;;;8BAES,S,EAAW;AACnB,UAAI,CAAC,KAAK,UAAV,EACE;AACF,WAAK,UAAL,CAAgB,GAAhB,CAAoB,KAAK,UAAL,CAAgB,KAApC,EAA2C,KAAK,eAAL,CAAqB,SAArB,CAA3C;AACD;;AAED;;;;;;;;;;;wBApCmB;AACjB,aAAO,KAAK,UAAL,GAAkB,KAAK,UAAL,CAAgB,KAAlC,GAA0C,IAAjD;AACD;;;;;;AA6CH;;;;;;;;;;;;;;;;;;;ACzNA;;;;AAEA,SAAS,iBAAT,CAA2B,CAA3B,EAA8B,CAA9B,EAAiC;AAC/B,MAAI,MAAM,CAAV,EAAa;AACX,WAAO,CAAP;AACD,GAFD,MAEO,IAAI,IAAI,CAAR,EAAW;AAChB,WAAO,CAAC,CAAR;AACD,GAFM,MAEA,IAAI,IAAI,CAAR,EAAW;AAChB,WAAO,CAAP;AACD;AACF;;AAED;;;;IAGqB,S;AACnB,uBAAc;AAAA;;AACZ,SAAK,KAAL;AACD;;;;4BAEO;AACN;AACA,WAAK,QAAL,GAAgB,EAAhB;AACA;AACA,WAAK,KAAL,GAAa,EAAb;AACA,WAAK,MAAL,GAAc,IAAd;AACA,WAAK,cAAL,GAAsB,CAAtB;AACD;;;2BAMM,Q,EAAU,I,EAAM;AACrB,UAAI,SAAS,IAAb,EAAmB;AACjB,eAAO,KAAK,KAAL,CAAW,CAAX,CAAP,CADiB,CACK;AACtB,aAAK,IAAL,CAAU,iBAAV;AACD;;AAJoB,6BAME,2BAAgB,KAAK,QAAL,CAAc,QAAd,CAAhB,EAAyC,IAAzC,CANF;AAAA,UAMhB,KANgB,oBAMhB,KANgB;AAAA,UAMT,OANS,oBAMT,OANS;;AAOrB,WAAK,QAAL,CAAc,QAAd,IAA0B,IAA1B;;AAEA,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,MAAM,MAA1B,EAAkC,GAAlC,EAAuC;AACrC,aAAK,KAAL,CAAW,MAAM,CAAN,CAAX,IAAuB,CAAC,KAAK,KAAL,CAAW,MAAM,CAAN,CAAX,KAAwB,CAAzB,IAA8B,CAArD;AACD;AACD,WAAK,IAAI,KAAI,CAAb,EAAgB,KAAI,QAAQ,MAA5B,EAAoC,IAApC,EAAyC;AACvC,aAAK,KAAL,CAAW,QAAQ,EAAR,CAAX;AACD;;AAED,WAAK,YAAL,CAAkB,IAAlB;AACD;;AAED;;;;;;;;mCAKmC;AAAA,UAAtB,IAAsB,uEAAf,KAAK,QAAU;;AACjC,UAAI,cAAc,OAAO,IAAP,CAAY,KAAK,QAAjB,EAA2B,MAA7C;AACA,UAAI,gBAAgB,CAApB,EAAuB;AACrB,aAAK,MAAL,GAAc,IAAd;AACD,OAFD,MAEO;AACL,aAAK,MAAL,GAAc,EAAd;AACA,aAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,cAAI,QAAQ,KAAK,KAAL,CAAW,KAAK,CAAL,CAAX,CAAZ;AACA,cAAI,UAAU,WAAd,EAA2B;AACzB,iBAAK,MAAL,CAAY,IAAZ,CAAiB,KAAK,CAAL,CAAjB;AACD;AACF;AACF;AACF;;;0BAEK,Q,EAAU;AACd,UAAI,OAAO,KAAK,QAAL,CAAc,QAAd,CAAP,KAAoC,WAAxC,EAAqD;AACnD;AACD;;AAED,UAAI,OAAO,KAAK,QAAL,CAAc,QAAd,CAAX;AACA,UAAI,CAAC,IAAL,EAAW;AACT,eAAO,EAAP;AACD;;AAED,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,aAAK,KAAL,CAAW,KAAK,CAAL,CAAX;AACD;AACD,aAAO,KAAK,QAAL,CAAc,QAAd,CAAP;;AAEA,WAAK,YAAL;AACD;;;wBA3DW;AACV,aAAO,KAAK,MAAZ;AACD;;;wBA2Dc;AACb,UAAI,UAAU,OAAO,IAAP,CAAY,KAAK,KAAjB,CAAd;AACA,cAAQ,IAAR,CAAa,iBAAb;AACA,aAAO,OAAP;AACD;;;;;;kBA/EkB,S;;;;;;;;;;;;;;kBCRG,K;;AAPxB;;;;;;;;AAEA;AACA;AACA,OAAO,kBAAP,GAA4B,OAAO,kBAAP,IAA6B,EAAzD;AACA,IAAI,SAAS,OAAO,kBAApB;;AAEe,SAAS,KAAT,CAAe,SAAf,EAA0B;AACvC,MAAI,aAAa,OAAO,SAAP,KAAsB,QAAvC,EAAiD;AAC/C,QAAI,CAAC,OAAO,cAAP,CAAsB,SAAtB,CAAL,EAAuC;AACrC,aAAO,SAAP,IAAoB,IAAI,KAAJ,CAAU,SAAV,CAApB;AACD;AACD,WAAO,OAAO,SAAP,CAAP;AACD,GALD,MAKO,IAAI,QAAO,SAAP,yCAAO,SAAP,OAAsB,QAAtB,IAAkC,UAAU,KAA5C,IAAqD,UAAU,GAAnE,EAAwE;AAC7E;AACA,WAAO,SAAP;AACD,GAHM,MAGA,IAAI,MAAM,OAAN,CAAc,SAAd,KACP,UAAU,MAAV,IAAoB,CADb,IAEP,OAAO,UAAU,CAAV,CAAP,KAAyB,QAFtB,EAEgC;AACrC,WAAO,MAAM,UAAU,CAAV,CAAN,CAAP;AACD,GAJM,MAIA;AACL,UAAM,IAAI,KAAJ,CAAU,4BAAV,CAAN;AACD;AACF;;IAEK,K;AACJ,iBAAY,IAAZ,EAAkB;AAAA;;AAChB,SAAK,IAAL,GAAY,IAAZ;AACA,SAAK,KAAL,GAAa,EAAb;AACD;;;;yBAEG,I,EAAM;AACR,UAAI,CAAC,IAAD,IAAS,OAAO,IAAP,KAAiB,QAA9B,EAAwC;AACtC,cAAM,IAAI,KAAJ,CAAU,kBAAV,CAAN;AACD;;AAED,UAAI,CAAC,KAAK,KAAL,CAAW,cAAX,CAA0B,IAA1B,CAAL,EACE,KAAK,KAAL,CAAW,IAAX,IAAmB,kBAAQ,IAAR,EAAc,IAAd,CAAnB;AACF,aAAO,KAAK,KAAL,CAAW,IAAX,CAAP;AACD;;;wBAEG,I,EAAM;AACR,UAAI,CAAC,IAAD,IAAS,OAAO,IAAP,KAAiB,QAA9B,EAAwC;AACtC,cAAM,IAAI,KAAJ,CAAU,kBAAV,CAAN;AACD;;AAED,aAAO,KAAK,KAAL,CAAW,cAAX,CAA0B,IAA1B,CAAP;AACD;;;;;;;;;;;;;;;;AC/CH;;;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;AAEA,IAAM,eAAe,qBAAM,SAAN,CAArB;;AAEA,SAAS,IAAT,CAAc,IAAd,EAAoB;AAClB,SAAO,aAAa,GAAb,CAAiB,IAAjB,CAAP;AACD;;AAED,SAAS,GAAT,CAAa,IAAb,EAAmB;AACjB,SAAO,aAAa,GAAb,CAAiB,IAAjB,CAAP;AACD;;AAED,IAAI,OAAO,KAAX,EAAkB;AAChB,SAAO,KAAP,CAAa,uBAAb,CAAqC,qBAArC,EAA4D,UAAS,OAAT,EAAkB;AAC5E,QAAI,OAAO,QAAQ,KAAf,KAA0B,QAA9B,EAAwC;AACtC,2BAAM,QAAQ,KAAd,EAAqB,GAArB,CAAyB,QAAQ,IAAjC,EAAuC,GAAvC,CAA2C,QAAQ,KAAnD;AACD,KAFD,MAEO;AACL,WAAK,QAAQ,IAAb,EAAmB,GAAnB,CAAuB,QAAQ,KAA/B;AACD;AACF,GAND;AAOD;;AAED,IAAM,YAAY;AAChB,wBADgB;AAEhB,OAAK,IAFW;AAGhB,OAAK,GAHW;AAIhB,6CAJgB;AAKhB,oCALgB;AAMhB;AANgB,CAAlB;;AASA;;;kBAGe,S;;AACf,OAAO,SAAP,GAAmB,SAAnB;;;;;;;;;;;QCrCgB,Q,GAAA,Q;QAWA,I,GAAA,I;AAfhB,IAAI,IAAI,OAAO,MAAf;;AAEA,IAAI,WAAW,EAAf;;AAEO,SAAS,QAAT,CAAkB,GAAlB,EAAuB;AAC5B,WAAS,IAAI,SAAb,IAA0B,GAA1B;AACA,MAAI,OAAO,QAAP,IAAmB,OAAO,QAAP,CAAgB,UAAhB,KAA+B,UAAtD,EAAkE;AAChE,MAAE,YAAM;AACN;AACD,KAFD;AAGD,GAJD,MAIO,IAAI,OAAO,QAAX,EAAqB;AAC1B,eAAW,IAAX,EAAiB,GAAjB;AACD;AACF;;AAEM,SAAS,IAAT,GAAgB;AACrB,SAAO,IAAP,CAAY,QAAZ,EAAsB,OAAtB,CAA8B,UAAS,SAAT,EAAoB;AAChD,QAAI,UAAU,SAAS,SAAT,CAAd;AACA,MAAE,MAAM,QAAQ,SAAhB,EAA2B,GAA3B,CAA+B,wBAA/B,EAAyD,IAAzD,CAA8D,UAAS,CAAT,EAAY,EAAZ,EAAgB;AAC5E,mBAAa,OAAb,EAAsB,EAAtB;AACD,KAFD;AAGD,GALD;AAMD;;AAED;AACA,SAAS,OAAT,CAAiB,GAAjB,EAAsB;AACpB,SAAO,IAAI,OAAJ,CAAY,uCAAZ,EAAqD,MAArD,CAAP;AACD;;AAED,SAAS,MAAT,CAAgB,EAAhB,EAAoB;AAClB,MAAI,MAAM,EAAE,EAAF,CAAV;AACA,SAAO,IAAP,CAAY,QAAZ,EAAsB,OAAtB,CAA8B,UAAS,SAAT,EAAoB;AAChD,QAAI,IAAI,QAAJ,CAAa,SAAb,KAA2B,CAAC,IAAI,QAAJ,CAAa,uBAAb,CAAhC,EAAuE;AACrE,UAAI,UAAU,SAAS,SAAT,CAAd;AACA,mBAAa,OAAb,EAAsB,EAAtB;AACD;AACF,GALD;AAMD;;AAED,SAAS,YAAT,CAAsB,OAAtB,EAA+B,EAA/B,EAAmC;AACjC,MAAI,SAAS,EAAE,EAAF,EAAM,IAAN,CAAW,+CAA+C,QAAQ,GAAG,EAAX,CAA/C,GAAgE,IAA3E,CAAb;AACA,MAAI,OAAO,KAAK,KAAL,CAAW,OAAO,CAAP,EAAU,SAArB,CAAX;;AAEA,MAAI,WAAW,QAAQ,OAAR,CAAgB,EAAhB,EAAoB,IAApB,CAAf;AACA,IAAE,EAAF,EAAM,IAAN,CAAW,oBAAX,EAAiC,QAAjC;AACA,IAAE,EAAF,EAAM,QAAN,CAAe,uBAAf;AACD;;AAED,IAAI,OAAO,KAAX,EAAkB;AAChB,MAAI,eAAe,IAAI,OAAO,KAAP,CAAa,YAAjB,EAAnB;AACA,MAAI,KAAI,OAAO,MAAf;AACA,KAAE,MAAF,CAAS,YAAT,EAAuB;AACrB,UAAM,cAAS,KAAT,EAAgB;AACpB,aAAO,GAAE,KAAF,EAAS,IAAT,CAAc,kBAAd,CAAP;AACD,KAHoB;AAIrB,gBAAY,oBAAS,EAAT,EAAa;AACvB,UAAI,CAAC,GAAE,EAAF,EAAM,QAAN,CAAe,uBAAf,CAAL,EAA8C;AAC5C,eAAO,EAAP;AACD;AACF,KARoB;AASrB,WAAO,eAAS,EAAT,EAAa;AAClB,aAAO,GAAG,EAAV;AACD,KAXoB;AAYrB,cAAU,kBAAS,EAAT,EAAa,CAEtB,CAdoB;AAerB,cAAU,kBAAS,EAAT,EAAa,KAAb,EAAoB,CAE7B,CAjBoB;AAkBrB,oBAAgB,wBAAS,EAAT,EAAa,IAAb,EAAmB,CAElC,CApBoB;AAqBrB,eAAW,mBAAS,EAAT,EAAa,QAAb,EAAuB;AAChC,SAAE,EAAF,EAAM,IAAN,CAAW,oBAAX,EAAiC,MAAjC;AACD,KAvBoB;AAwBrB,iBAAa,qBAAS,EAAT,EAAa;AACxB,SAAE,EAAF,EAAM,IAAN,CAAW,oBAAX,EAAiC,OAAjC;AACD;AA1BoB,GAAvB;AA4BA,SAAO,KAAP,CAAa,aAAb,CAA2B,QAA3B,CAAoC,YAApC,EAAkD,wBAAlD;AACD;;;;;;;;AChFD;;IAAY,K;;AACZ;;;;AAEA,IAAI,IAAI,OAAO,MAAf;;AAEA,MAAM,QAAN,CAAe;AACb,aAAW,+BADE;;AAGb,WAAS,iBAAS,EAAT,EAAa,IAAb,EAAmB;AAC1B;;;;AAIA,QAAI,WAAW,yBAAiB,KAAK,KAAtB,CAAf;;AAEA,QAAI,sBAAJ;AACA,QAAI,MAAM,EAAE,EAAF,CAAV;AACA,QAAI,EAAJ,CAAO,QAAP,EAAiB,wBAAjB,EAA2C,YAAW;AACpD,UAAI,UAAU,IAAI,IAAJ,CAAS,gCAAT,CAAd;AACA,UAAI,QAAQ,MAAR,KAAmB,CAAvB,EAA0B;AACxB,wBAAgB,IAAhB;AACA,iBAAS,KAAT;AACD,OAHD,MAGO;AACL,YAAI,OAAO,EAAX;AACA,gBAAQ,IAAR,CAAa,YAAW;AACtB,eAAK,GAAL,CAAS,KAAK,KAAd,EAAqB,OAArB,CAA6B,UAAS,GAAT,EAAc;AACzC,iBAAK,GAAL,IAAY,IAAZ;AACD,WAFD;AAGD,SAJD;AAKA,YAAI,WAAW,OAAO,IAAP,CAAY,IAAZ,CAAf;AACA,iBAAS,IAAT;AACA,wBAAgB,QAAhB;AACA,iBAAS,GAAT,CAAa,QAAb;AACD;AACF,KAjBD;;AAmBA,WAAO;AACL,eAAS,mBAAW;AAClB,iBAAS,KAAT;AACD,OAHI;AAIL,cAAQ,kBAAW;AACjB,YAAI,aAAJ,EACE,SAAS,GAAT,CAAa,aAAb;AACH;AAPI,KAAP;AASD;AAxCY,CAAf;;;;;;;;ACLA;;IAAY,K;;AACZ;;IAAY,I;;AACZ;;;;AAEA,IAAI,IAAI,OAAO,MAAf;;AAEA,MAAM,QAAN,CAAe;AACb,aAAW,wBADE;;AAGb,WAAS,iBAAS,EAAT,EAAa,IAAb,EAAmB;AAC1B;;;;;;AAMA,QAAI,QAAQ,CAAC,EAAC,OAAO,EAAR,EAAY,OAAO,OAAnB,EAAD,CAAZ;AACA,QAAI,QAAQ,KAAK,aAAL,CAAmB,KAAK,KAAxB,CAAZ;AACA,QAAI,OAAO;AACT,eAAS,MAAM,MAAN,CAAa,KAAb,CADA;AAET,kBAAY,OAFH;AAGT,kBAAY,OAHH;AAIT,mBAAa;AAJJ,KAAX;;AAOA,QAAI,SAAS,EAAE,EAAF,EAAM,IAAN,CAAW,QAAX,EAAqB,CAArB,CAAb;;AAEA,QAAI,YAAY,EAAE,MAAF,EAAU,SAAV,CAAoB,IAApB,EAA0B,CAA1B,EAA6B,SAA7C;;AAEA,QAAI,WAAW,yBAAiB,KAAK,KAAtB,CAAf;;AAEA,QAAI,sBAAJ;AACA,cAAU,EAAV,CAAa,QAAb,EAAuB,YAAW;AAChC,UAAI,UAAU,KAAV,CAAgB,MAAhB,KAA2B,CAA/B,EAAkC;AAChC,wBAAgB,IAAhB;AACA,iBAAS,KAAT;AACD,OAHD,MAGO;AACL,YAAI,OAAO,EAAX;AACA,kBAAU,KAAV,CAAgB,OAAhB,CAAwB,UAAS,KAAT,EAAgB;AACtC,eAAK,GAAL,CAAS,KAAT,EAAgB,OAAhB,CAAwB,UAAS,GAAT,EAAc;AACpC,iBAAK,GAAL,IAAY,IAAZ;AACD,WAFD;AAGD,SAJD;AAKA,YAAI,WAAW,OAAO,IAAP,CAAY,IAAZ,CAAf;AACA,iBAAS,IAAT;AACA,wBAAgB,QAAhB;AACA,iBAAS,GAAT,CAAa,QAAb;AACD;AACF,KAhBD;;AAkBA,WAAO;AACL,eAAS,mBAAW;AAClB,iBAAS,KAAT;AACD,OAHI;AAIL,cAAQ,kBAAW;AACjB,YAAI,aAAJ,EACE,SAAS,GAAT,CAAa,aAAb;AACH;AAPI,KAAP;AASD;AArDY,CAAf;;;;;;;;;;ACNA;;IAAY,K;;AACZ;;;;AAEA,IAAI,IAAI,OAAO,MAAf;AACA,IAAI,WAAW,OAAO,QAAtB;;AAEA,MAAM,QAAN,CAAe;AACb,aAAW,wBADE;;AAGb,WAAS,iBAAS,EAAT,EAAa,IAAb,EAAmB;AAC1B;;;;AAIA,QAAI,WAAW,yBAAiB,KAAK,KAAtB,CAAf;;AAEA,QAAI,OAAO,EAAX;AACA,QAAI,MAAM,EAAE,EAAF,EAAM,IAAN,CAAW,OAAX,CAAV;AACA,QAAI,WAAW,IAAI,IAAJ,CAAS,WAAT,CAAf;AACA,QAAI,aAAa,IAAI,IAAJ,CAAS,aAAT,CAAjB;AACA,QAAI,QAAQ,IAAI,IAAJ,CAAS,OAAT,CAAZ;AACA,QAAI,sBAAJ;;AAEA;AACA,QAAI,aAAa,MAAjB,EAAyB;AACvB,sBAAgB,SAAS,GAAT,EAAhB;AACA,WAAK,QAAL,GAAgB,UAAS,GAAT,EAAc;AAC5B,eAAO,cAAc,UAAd,EAA0B,IAAI,IAAJ,CAAS,GAAT,CAA1B,CAAP;AACD,OAFD;AAID,KAND,MAMO,IAAI,aAAa,UAAjB,EAA6B;AAClC,UAAI,WAAW,IAAI,IAAJ,CAAS,UAAT,CAAf;AACA,UAAI,QAAJ,EACE,gBAAgB,SAAS,QAAT,CAAkB,QAAlB,CAAhB,CADF,KAGE,gBAAgB,QAAhB;;AAEF,WAAK,QAAL,GAAgB,UAAS,GAAT,EAAc;AAC5B,eAAO,cAAc,UAAd,EAA0B,IAAI,IAAJ,CAAS,GAAT,CAA1B,CAAP;AACD,OAFD;AAGD,KAVM,MAUA,IAAI,aAAa,QAAjB,EAA2B;AAChC,UAAI,OAAO,KAAP,KAAiB,WAArB,EACE,KAAK,QAAL,GAAgB,UAAS,GAAT,EAAc;AAC5B,YAAI,SAAS,KAAK,GAAL,CAAS,EAAT,EAAa,KAAb,CAAb;AACA,eAAO,KAAK,KAAL,CAAW,MAAM,MAAjB,IAA2B,MAAlC;AACD,OAHD;AAIH;;AAED,QAAI,cAAJ,CAAmB,IAAnB;;AAEA,aAAS,QAAT,GAAoB;AAClB,UAAI,SAAS,IAAI,IAAJ,CAAS,gBAAT,EAA2B,MAAxC;;AAEA;AACA,UAAI,gBAAJ;AACA,UAAI,WAAW,IAAI,IAAJ,CAAS,WAAT,CAAf;AACA,UAAI,aAAa,MAAjB,EAAyB;AACvB,kBAAU,iBAAS,GAAT,EAAc;AACtB,iBAAO,cAAc,IAAI,IAAJ,CAAS,CAAC,GAAV,CAAd,CAAP;AACD,SAFD;AAGD,OAJD,MAIO,IAAI,aAAa,UAAjB,EAA6B;AAClC,kBAAU,iBAAS,GAAT,EAAc;AACtB;AACA,iBAAO,CAAC,GAAD,GAAO,IAAd;AACD,SAHD;AAID,OALM,MAKA;AACL,kBAAU,iBAAS,GAAT,EAAc;AAAE,iBAAO,CAAC,GAAR;AAAc,SAAxC;AACD;;AAED,UAAI,IAAI,IAAJ,CAAS,gBAAT,EAA2B,OAA3B,CAAmC,IAAnC,KAA4C,QAAhD,EAA0D;AACxD,eAAO,CAAC,QAAQ,OAAO,IAAf,CAAD,EAAuB,QAAQ,OAAO,EAAf,CAAvB,CAAP;AACD,OAFD,MAEO;AACL,eAAO,QAAQ,OAAO,IAAf,CAAP;AACD;AACF;;AAED,QAAI,gBAAgB,IAApB;;AAEA,QAAI,EAAJ,CAAO,6BAAP,EAAsC,UAAS,KAAT,EAAgB;AACpD,UAAI,CAAC,IAAI,IAAJ,CAAS,UAAT,CAAD,IAAyB,CAAC,IAAI,IAAJ,CAAS,WAAT,CAA9B,EAAqD;AAAA,wBAClC,UADkC;AAAA;AAAA,YAC9C,IAD8C;AAAA,YACxC,EADwC;;AAEnD,YAAI,OAAO,EAAX;AACA,aAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAL,CAAY,MAAhC,EAAwC,GAAxC,EAA6C;AAC3C,cAAI,MAAM,KAAK,MAAL,CAAY,CAAZ,CAAV;AACA,cAAI,OAAO,IAAP,IAAe,OAAO,EAA1B,EAA8B;AAC5B,iBAAK,IAAL,CAAU,KAAK,IAAL,CAAU,CAAV,CAAV;AACD;AACF;AACD,aAAK,IAAL;AACA,iBAAS,GAAT,CAAa,IAAb;AACA,wBAAgB,IAAhB;AACD;AACF,KAdD;;AAiBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,WAAO;AACL,eAAS,mBAAW;AAClB,iBAAS,KAAT;AACD,OAHI;AAIL,cAAQ,kBAAW;AACjB,YAAI,aAAJ,EACE,SAAS,GAAT,CAAa,aAAb;AACH;AAPI,KAAP;AASD;AApHY,CAAf;;AAwHA;AACA,SAAS,QAAT,CAAkB,CAAlB,EAAqB,MAArB,EAA6B;AAC3B,MAAI,MAAM,EAAE,QAAF,EAAV;AACA,SAAO,IAAI,MAAJ,GAAa,MAApB;AACE,UAAM,MAAM,GAAZ;AADF,GAEA,OAAO,GAAP;AACD;;AAED;AACA;AACA,SAAS,aAAT,CAAuB,IAAvB,EAA6B;AAC3B,MAAI,gBAAgB,IAApB,EAA0B;AACxB,WAAO,KAAK,cAAL,KAAwB,GAAxB,GACA,SAAS,KAAK,WAAL,KAAmB,CAA5B,EAA+B,CAA/B,CADA,GACoC,GADpC,GAEA,SAAS,KAAK,UAAL,EAAT,EAA4B,CAA5B,CAFP;AAID,GALD,MAKO;AACL,WAAO,IAAP;AACD;AACF;;;;;;;;;;;;;;ACjJD;;;;AACA;;;;AACA;;IAAY,I;;;;;;;;AAEZ;;;;;;;;;;;;;;;;IAgBa,e,WAAA,e;AAEX,6BAA4C;AAAA,QAAhC,KAAgC,uEAAxB,IAAwB;AAAA,QAAlB,SAAkB,uEAAN,IAAM;;AAAA;;AAC1C,SAAK,WAAL,GAAmB,sBAAnB;AACA,SAAK,QAAL,GAAgB,IAAI,KAAK,mBAAT,CAA6B,KAAK,WAAlC,CAAhB;;AAEA;AACA,SAAK,MAAL,GAAc,IAAd;AACA;AACA,SAAK,IAAL,GAAY,IAAZ;AACA;AACA,SAAK,eAAL,GAAuB,IAAvB;;AAEA,SAAK,UAAL,GAAkB,KAAK,MAAL,CAAY,EAAE,QAAQ,IAAV,EAAZ,EAA8B,SAA9B,CAAlB;;AAEA,SAAK,QAAL,CAAc,KAAd;AACD;;AAED;;;;;;;;;;;;;;;;;6BAaS,K,EAAO;AAAA;;AACd;AACA,UAAI,KAAK,MAAL,KAAgB,KAApB,EACE;AACF;AACA,UAAI,CAAC,KAAK,MAAN,IAAgB,CAAC,KAArB,EACE;;AAEF,UAAI,KAAK,IAAT,EAAe;AACb,aAAK,IAAL,CAAU,GAAV,CAAc,QAAd,EAAwB,KAAK,eAA7B;AACA,aAAK,IAAL,GAAY,IAAZ;AACA,aAAK,eAAL,GAAuB,IAAvB;AACD;;AAED,WAAK,MAAL,GAAc,KAAd;;AAEA,UAAI,KAAJ,EAAW;AACT,aAAK,IAAL,GAAY,qBAAI,KAAJ,EAAW,GAAX,CAAe,WAAf,CAAZ;AACA,YAAI,MAAM,KAAK,IAAL,CAAU,EAAV,CAAa,QAAb,EAAuB,UAAC,CAAD,EAAO;AACtC,gBAAK,WAAL,CAAiB,OAAjB,CAAyB,QAAzB,EAAmC,CAAnC;AACD,SAFS,CAAV;AAGA,aAAK,eAAL,GAAuB,GAAvB;AACD;AACF;;AAED;;;;;;;;;;;;;;;AAcA;;;;;oCAKgB,S,EAAW;AACzB;AACA,aAAO,KAAK,MAAL,CAAY,EAAZ,EACL,KAAK,UAAL,GAAkB,KAAK,UAAvB,GAAoC,IAD/B,EAEL,YAAY,SAAZ,GAAwB,IAFnB,CAAP;AAGD;;AAED;;;;;;;;;;;;;;;wBAYI,Y,EAAc,S,EAAW;AAC3B,UAAI,KAAK,IAAT,EACE,KAAK,IAAL,CAAU,GAAV,CAAc,YAAd,EAA4B,KAAK,eAAL,CAAqB,SAArB,CAA5B;AACH;;AAED;;;;;;;;;;;;;0BAUM,S,EAAW;AACf,UAAI,KAAK,IAAT,EACE,KAAK,GAAL,CAAS,KAAK,CAAd,EAAiB,KAAK,eAAL,CAAqB,SAArB,CAAjB;AACH;;AAED;;;;;;;;;;;;;uBAUG,S,EAAW,Q,EAAU;AACtB,aAAO,KAAK,QAAL,CAAc,EAAd,CAAiB,SAAjB,EAA4B,QAA5B,CAAP;AACD;;AAED;;;;;;;;;;;wBAQI,S,EAAW,Q,EAAU;AACvB,aAAO,KAAK,QAAL,CAAc,GAAd,CAAkB,SAAlB,EAA6B,QAA7B,CAAP;AACD;;AAED;;;;;;;;4BAKQ;AACN,WAAK,QAAL,CAAc,kBAAd;AACA,WAAK,QAAL,CAAc,IAAd;AACD;;;wBAlFW;AACV,aAAO,KAAK,IAAL,GAAY,KAAK,IAAL,CAAU,GAAV,EAAZ,GAA8B,IAArC;AACD;;;;;;AAmFH;;;;;;;;;AASA;;;;;;;;;;;;;;;;;;;;;QCpLgB,M,GAAA,M;QAeA,W,GAAA,W;QAQA,e,GAAA,e;QAoCA,a,GAAA,a;;;;AA3DT,SAAS,MAAT,CAAgB,MAAhB,EAAoC;AAAA,oCAAT,OAAS;AAAT,WAAS;AAAA;;AACzC,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,QAAQ,MAA5B,EAAoC,GAApC,EAAyC;AACvC,QAAI,MAAM,QAAQ,CAAR,CAAV;AACA,QAAI,OAAO,GAAP,KAAgB,WAAhB,IAA+B,QAAQ,IAA3C,EACE;;AAEF,SAAK,IAAI,GAAT,IAAgB,GAAhB,EAAqB;AACnB,UAAI,IAAI,cAAJ,CAAmB,GAAnB,CAAJ,EAA6B;AAC3B,eAAO,GAAP,IAAc,IAAI,GAAJ,CAAd;AACD;AACF;AACF;AACD,SAAO,MAAP;AACD;;AAEM,SAAS,WAAT,CAAqB,IAArB,EAA2B;AAChC,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,QAAI,KAAK,CAAL,KAAW,KAAK,IAAE,CAAP,CAAf,EAA0B;AACxB,YAAM,IAAI,KAAJ,CAAU,0CAAV,CAAN;AACD;AACF;AACF;;AAEM,SAAS,eAAT,CAAyB,CAAzB,EAA4B,CAA5B,EAA+B;AACpC,MAAI,MAAM,CAAV;AACA,MAAI,MAAM,CAAV;;AAEA,MAAI,CAAC,CAAL,EAAQ,IAAI,EAAJ;AACR,MAAI,CAAC,CAAL,EAAQ,IAAI,EAAJ;;AAER,MAAI,SAAS,EAAb;AACA,MAAI,SAAS,EAAb;;AAEA,cAAY,CAAZ;AACA,cAAY,CAAZ;;AAEA,SAAO,MAAM,EAAE,MAAR,IAAkB,MAAM,EAAE,MAAjC,EAAyC;AACvC,QAAI,EAAE,GAAF,MAAW,EAAE,GAAF,CAAf,EAAuB;AACrB;AACA;AACD,KAHD,MAGO,IAAI,EAAE,GAAF,IAAS,EAAE,GAAF,CAAb,EAAqB;AAC1B,aAAO,IAAP,CAAY,EAAE,KAAF,CAAZ;AACD,KAFM,MAEA;AACL,aAAO,IAAP,CAAY,EAAE,KAAF,CAAZ;AACD;AACF;;AAED,MAAI,MAAM,EAAE,MAAZ,EACE,SAAS,OAAO,MAAP,CAAc,EAAE,KAAF,CAAQ,GAAR,CAAd,CAAT;AACF,MAAI,MAAM,EAAE,MAAZ,EACE,SAAS,OAAO,MAAP,CAAc,EAAE,KAAF,CAAQ,GAAR,CAAd,CAAT;AACF,SAAO;AACL,aAAS,MADJ;AAEL,WAAO;AAFF,GAAP;AAID;;AAED;AACA;AACO,SAAS,aAAT,CAAuB,EAAvB,EAA2B;AAChC,MAAI,QAAQ,EAAZ;AACA,MAAI,eAAJ;AACA,OAAK,IAAI,IAAT,IAAiB,EAAjB,EAAqB;AACnB,QAAI,GAAG,cAAH,CAAkB,IAAlB,CAAJ,EACE,MAAM,IAAN,CAAW,IAAX;AACF,QAAI,QAAO,GAAG,IAAH,CAAP,MAAqB,QAArB,IAAiC,OAAO,GAAG,IAAH,EAAS,MAAhB,KAA4B,WAAjE,EAA8E;AAC5E,YAAM,IAAI,KAAJ,CAAU,2BAAV,CAAN;AACD,KAFD,MAEO,IAAI,OAAO,MAAP,KAAmB,WAAnB,IAAkC,WAAW,GAAG,IAAH,EAAS,MAA1D,EAAkE;AACvE,YAAM,IAAI,KAAJ,CAAU,8CAAV,CAAN;AACD;AACD,aAAS,GAAG,IAAH,EAAS,MAAlB;AACD;AACD,MAAI,UAAU,EAAd;AACA,MAAI,aAAJ;AACA,OAAK,IAAI,MAAM,CAAf,EAAkB,MAAM,MAAxB,EAAgC,KAAhC,EAAuC;AACrC,WAAO,EAAP;AACA,SAAK,IAAI,MAAM,CAAf,EAAkB,MAAM,MAAM,MAA9B,EAAsC,KAAtC,EAA6C;AAC3C,WAAK,MAAM,GAAN,CAAL,IAAmB,GAAG,MAAM,GAAN,CAAH,EAAe,GAAf,CAAnB;AACD;AACD,YAAQ,IAAR,CAAa,IAAb;AACD;AACD,SAAO,OAAP;AACD;;AAED;;;;;;;IAMa,mB,WAAA,mB;AACX,+BAAY,OAAZ,EAAqB;AAAA;;AACnB,SAAK,QAAL,GAAgB,OAAhB;AACA,SAAK,KAAL,GAAa,EAAb;AACD;;;;uBAEE,S,EAAW,Q,EAAU;AACtB,UAAI,MAAM,KAAK,QAAL,CAAc,EAAd,CAAiB,SAAjB,EAA4B,QAA5B,CAAV;AACA,WAAK,KAAL,CAAW,GAAX,IAAkB,SAAlB;AACA,aAAO,GAAP;AACD;;;wBAEG,S,EAAW,Q,EAAU;AACvB,UAAI,MAAM,KAAK,QAAL,CAAc,GAAd,CAAkB,SAAlB,EAA6B,QAA7B,CAAV;AACA,UAAI,GAAJ,EAAS;AACP,eAAO,KAAK,KAAL,CAAW,GAAX,CAAP;AACD;AACD,aAAO,GAAP;AACD;;;yCAEoB;AAAA;;AACnB,UAAI,eAAe,KAAK,KAAxB;AACA,WAAK,KAAL,GAAa,EAAb;AACA,aAAO,IAAP,CAAY,YAAZ,EAA0B,OAA1B,CAAkC,UAAC,GAAD,EAAS;AACzC,cAAK,QAAL,CAAc,GAAd,CAAkB,aAAa,GAAb,CAAlB,EAAqC,GAArC;AACD,OAFD;AAGD;;;;;;;;;;;;;;;;;;ACpHH;;;;;;;;IAEqB,G;AACnB,eAAY,KAAZ,EAAmB,IAAnB,EAAyB,YAAa,KAAtC,EAA6C;AAAA;;AAC3C,SAAK,MAAL,GAAc,KAAd;AACA,SAAK,KAAL,GAAa,IAAb;AACA,SAAK,MAAL,GAAc,KAAd;AACA,SAAK,OAAL,GAAe,sBAAf;AACD;;;;0BAEK;AACJ,aAAO,KAAK,MAAZ;AACD;;;wBAEG,K,EAAO,YAAa,K,EAAO;AAC7B,UAAI,KAAK,MAAL,KAAgB,KAApB,EAA2B;AACzB;AACA;AACD;AACD,UAAI,WAAW,KAAK,MAApB;AACA,WAAK,MAAL,GAAc,KAAd;AACA;AACA,UAAI,MAAM,EAAV;AACA,UAAI,SAAS,QAAO,KAAP,yCAAO,KAAP,OAAkB,QAA/B,EAAyC;AACvC,aAAK,IAAI,CAAT,IAAc,KAAd,EAAqB;AACnB,cAAI,MAAM,cAAN,CAAqB,CAArB,CAAJ,EACE,IAAI,CAAJ,IAAS,MAAM,CAAN,CAAT;AACH;AACF;AACD,UAAI,QAAJ,GAAe,QAAf;AACA,UAAI,KAAJ,GAAY,KAAZ;AACA,WAAK,OAAL,CAAa,OAAb,CAAqB,QAArB,EAA+B,GAA/B,EAAoC,IAApC;;AAEA;AACA;AACA,UAAI,OAAO,KAAP,IAAgB,OAAO,KAAP,CAAa,aAAjC,EAAgD;AAC9C,eAAO,KAAP,CAAa,aAAb,CACE,mBACG,KAAK,MAAL,CAAY,IAAZ,KAAqB,IAArB,GAA4B,KAAK,MAAL,CAAY,IAAZ,GAAmB,GAA/C,GAAqD,EADxD,IAEE,KAAK,KAHT,EAIE,OAAO,KAAP,KAAkB,WAAlB,GAAgC,IAAhC,GAAuC,KAJzC;AAMD;AACF;;;uBAEE,S,EAAW,Q,EAAU;AACtB,aAAO,KAAK,OAAL,CAAa,EAAb,CAAgB,SAAhB,EAA2B,QAA3B,CAAP;AACD;;;wBAEG,S,EAAW,Q,EAAU;AACvB,aAAO,KAAK,OAAL,CAAa,GAAb,CAAiB,SAAjB,EAA4B,QAA5B,CAAP;AACD;;;;;;kBAjDkB,G", + "file": "generated.js", + "sourceRoot": "", + "sourcesContent": [ + "(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Combine the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Close the handle. This clears this handle's contribution to the filter set,\n * and unsubscribes all event listeners.\n */\n close() {\n this._emitter.removeAllListeners();\n this.clear();\n this.setGroup(null);\n }\n\n /**\n * Clear this handle's contribution to the filter set.\n *\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n clear(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.clear(this._id);\n this._onChange(extraInfo);\n }\n\n /**\n * Set this handle's contribution to the filter set. This array should consist\n * of the keys of the rows that _should_ be displayed; any keys that are not\n * present in the array will be considered _filtered out_. Note that multiple\n * `FilterHandle` instances in the group may each contribute an array of keys,\n * and only those keys that appear in _all_ of the arrays make it through the\n * filter.\n *\n * @param {string[]} keys - Empty array, or array of keys. To clear the\n * filter, don't pass an empty array; instead, use the\n * {@link FilterHandle#clear} method.\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n set(keys, extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.update(this._id, keys);\n this._onChange(extraInfo);\n }\n\n /**\n * @return {string[]|null} - Either: 1) an array of keys that made it through\n * all of the `FilterHandle` instances, or, 2) `null`, which means no filter\n * is being applied (all data should be displayed).\n */\n get filteredKeys() {\n return this._filterSet ? this._filterSet.value : null;\n }\n\n /**\n * Subscribe to events on this `FilterHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {FilterHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link FilterHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancel event subscriptions created by {@link FilterHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|FilterHandle~listener} listener - Either the callback\n * function previously passed into {@link FilterHandle#on}, or the\n * string that was returned from {@link FilterHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n _onChange(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterVar.set(this._filterSet.value, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * @callback FilterHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the filter set, or `null` if no filter set is active),\n * `oldValue` (the previous value of the filter set), and `sender` (the\n * `FilterHandle` instance that made the change).\n */\n\n}\n\n/**\n * @event FilterHandle#change\n * @type {object}\n * @property {object} value - The new value of the filter set, or `null`\n * if no filter set is active.\n * @property {object} oldValue - The previous value of the filter set.\n * @property {FilterHandle} sender - The `FilterHandle` instance that\n * changed the value.\n */\n", + "import { diffSortedLists } from \"./util\";\n\nfunction naturalComparator(a, b) {\n if (a === b) {\n return 0;\n } else if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n }\n}\n\n/**\n * @private\n */\nexport default class FilterSet {\n constructor() {\n this.reset();\n }\n\n reset() {\n // Key: handle ID, Value: array of selected keys, or null\n this._handles = {};\n // Key: key string, Value: count of handles that include it\n this._keys = {};\n this._value = null;\n this._activeHandles = 0;\n }\n\n get value() {\n return this._value;\n }\n\n update(handleId, keys) {\n if (keys !== null) {\n keys = keys.slice(0); // clone before sorting\n keys.sort(naturalComparator);\n }\n\n let {added, removed} = diffSortedLists(this._handles[handleId], keys);\n this._handles[handleId] = keys;\n\n for (let i = 0; i < added.length; i++) {\n this._keys[added[i]] = (this._keys[added[i]] || 0) + 1;\n }\n for (let i = 0; i < removed.length; i++) {\n this._keys[removed[i]]--;\n }\n\n this._updateValue(keys);\n }\n\n /**\n * @param {string[]} keys Sorted array of strings that indicate\n * a superset of possible keys.\n * @private\n */\n _updateValue(keys = this._allKeys) {\n let handleCount = Object.keys(this._handles).length;\n if (handleCount === 0) {\n this._value = null;\n } else {\n this._value = [];\n for (let i = 0; i < keys.length; i++) {\n let count = this._keys[keys[i]];\n if (count === handleCount) {\n this._value.push(keys[i]);\n }\n }\n }\n }\n\n clear(handleId) {\n if (typeof(this._handles[handleId]) === \"undefined\") {\n return;\n }\n\n let keys = this._handles[handleId];\n if (!keys) {\n keys = [];\n }\n\n for (let i = 0; i < keys.length; i++) {\n this._keys[keys[i]]--;\n }\n delete this._handles[handleId];\n\n this._updateValue();\n }\n\n get _allKeys() {\n let allKeys = Object.keys(this._keys);\n allKeys.sort(naturalComparator);\n return allKeys;\n }\n}\n", + "import Var from \"./var\";\n\n// Use a global so that multiple copies of crosstalk.js can be loaded and still\n// have groups behave as singletons across all copies.\nglobal.__crosstalk_groups = global.__crosstalk_groups || {};\nlet groups = global.__crosstalk_groups;\n\nexport default function group(groupName) {\n if (groupName && typeof(groupName) === \"string\") {\n if (!groups.hasOwnProperty(groupName)) {\n groups[groupName] = new Group(groupName);\n }\n return groups[groupName];\n } else if (typeof(groupName) === \"object\" && groupName._vars && groupName.var) {\n // Appears to already be a group object\n return groupName;\n } else if (Array.isArray(groupName) &&\n groupName.length == 1 &&\n typeof(groupName[0]) === \"string\") {\n return group(groupName[0]);\n } else {\n throw new Error(\"Invalid groupName argument\");\n }\n}\n\nclass Group {\n constructor(name) {\n this.name = name;\n this._vars = {};\n }\n\n var(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n if (!this._vars.hasOwnProperty(name))\n this._vars[name] = new Var(this, name);\n return this._vars[name];\n }\n\n has(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n return this._vars.hasOwnProperty(name);\n }\n}\n", + "import group from \"./group\";\nimport { SelectionHandle } from \"./selection\";\nimport { FilterHandle } from \"./filter\";\nimport { bind } from \"./input\";\nimport \"./input_selectize\";\nimport \"./input_checkboxgroup\";\nimport \"./input_slider\";\n\nconst defaultGroup = group(\"default\");\n\nfunction var_(name) {\n return defaultGroup.var(name);\n}\n\nfunction has(name) {\n return defaultGroup.has(name);\n}\n\nif (global.Shiny) {\n global.Shiny.addCustomMessageHandler(\"update-client-value\", function(message) {\n if (typeof(message.group) === \"string\") {\n group(message.group).var(message.name).set(message.value);\n } else {\n var_(message.name).set(message.value);\n }\n });\n}\n\nconst crosstalk = {\n group: group,\n var: var_,\n has: has,\n SelectionHandle: SelectionHandle,\n FilterHandle: FilterHandle,\n bind: bind\n};\n\n/**\n * @namespace crosstalk\n */\nexport default crosstalk;\nglobal.crosstalk = crosstalk;\n", + "let $ = global.jQuery;\n\nlet bindings = {};\n\nexport function register(reg) {\n bindings[reg.className] = reg;\n if (global.document && global.document.readyState !== \"complete\") {\n $(() => {\n bind();\n });\n } else if (global.document) {\n setTimeout(bind, 100);\n }\n}\n\nexport function bind() {\n Object.keys(bindings).forEach(function(className) {\n let binding = bindings[className];\n $(\".\" + binding.className).not(\".crosstalk-input-bound\").each(function(i, el) {\n bindInstance(binding, el);\n });\n });\n}\n\n// Escape jQuery identifier\nfunction $escape(val) {\n return val.replace(/([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, \"\\\\$1\");\n}\n\nfunction bindEl(el) {\n let $el = $(el);\n Object.keys(bindings).forEach(function(className) {\n if ($el.hasClass(className) && !$el.hasClass(\"crosstalk-input-bound\")) {\n let binding = bindings[className];\n bindInstance(binding, el);\n }\n });\n}\n\nfunction bindInstance(binding, el) {\n let jsonEl = $(el).find(\"script[type='application/json'][data-for='\" + $escape(el.id) + \"']\");\n let data = JSON.parse(jsonEl[0].innerText);\n\n let instance = binding.factory(el, data);\n $(el).data(\"crosstalk-instance\", instance);\n $(el).addClass(\"crosstalk-input-bound\");\n}\n\nif (global.Shiny) {\n let inputBinding = new global.Shiny.InputBinding();\n let $ = global.jQuery;\n $.extend(inputBinding, {\n find: function(scope) {\n return $(scope).find(\".crosstalk-input\");\n },\n initialize: function(el) {\n if (!$(el).hasClass(\"crosstalk-input-bound\")) {\n bindEl(el);\n }\n },\n getId: function(el) {\n return el.id;\n },\n getValue: function(el) {\n\n },\n setValue: function(el, value) {\n\n },\n receiveMessage: function(el, data) {\n\n },\n subscribe: function(el, callback) {\n $(el).data(\"crosstalk-instance\").resume();\n },\n unsubscribe: function(el) {\n $(el).data(\"crosstalk-instance\").suspend();\n }\n });\n global.Shiny.inputBindings.register(inputBinding, \"crosstalk.inputBinding\");\n}\n", + "import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-checkboxgroup\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n let $el = $(el);\n $el.on(\"change\", \"input[type='checkbox']\", function() {\n let checked = $el.find(\"input[type='checkbox']:checked\");\n if (checked.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n checked.each(function() {\n data.map[this.value].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n", + "import * as input from \"./input\";\nimport * as util from \"./util\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-select\",\n\n factory: function(el, data) {\n /*\n * items: {value: [...], label: [...]}\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n\n let first = [{value: \"\", label: \"(All)\"}];\n let items = util.dataframeToD3(data.items);\n let opts = {\n options: first.concat(items),\n valueField: \"value\",\n labelField: \"label\",\n searchField: \"label\"\n };\n\n let select = $(el).find(\"select\")[0];\n\n let selectize = $(select).selectize(opts)[0].selectize;\n\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n selectize.on(\"change\", function() {\n if (selectize.items.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n selectize.items.forEach(function(group) {\n data.map[group].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n", + "import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\nlet strftime = global.strftime;\n\ninput.register({\n className: \"crosstalk-input-slider\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let opts = {};\n let $el = $(el).find(\"input\");\n let dataType = $el.data(\"data-type\");\n let timeFormat = $el.data(\"time-format\");\n let round = $el.data(\"round\");\n let timeFormatter;\n\n // Set up formatting functions\n if (dataType === \"date\") {\n timeFormatter = strftime.utc();\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n\n } else if (dataType === \"datetime\") {\n let timezone = $el.data(\"timezone\");\n if (timezone)\n timeFormatter = strftime.timezone(timezone);\n else\n timeFormatter = strftime;\n\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n } else if (dataType === \"number\") {\n if (typeof round !== \"undefined\")\n opts.prettify = function(num) {\n let factor = Math.pow(10, round);\n return Math.round(num * factor) / factor;\n };\n }\n\n $el.ionRangeSlider(opts);\n\n function getValue() {\n let result = $el.data(\"ionRangeSlider\").result;\n\n // Function for converting numeric value from slider to appropriate type.\n let convert;\n let dataType = $el.data(\"data-type\");\n if (dataType === \"date\") {\n convert = function(val) {\n return formatDateUTC(new Date(+val));\n };\n } else if (dataType === \"datetime\") {\n convert = function(val) {\n // Convert ms to s\n return +val / 1000;\n };\n } else {\n convert = function(val) { return +val; };\n }\n\n if ($el.data(\"ionRangeSlider\").options.type === \"double\") {\n return [convert(result.from), convert(result.to)];\n } else {\n return convert(result.from);\n }\n }\n\n let lastKnownKeys = null;\n\n $el.on(\"change.crosstalkSliderInput\", function(event) {\n if (!$el.data(\"updating\") && !$el.data(\"animating\")) {\n let [from, to] = getValue();\n let keys = [];\n for (let i = 0; i < data.values.length; i++) {\n let val = data.values[i];\n if (val >= from && val <= to) {\n keys.push(data.keys[i]);\n }\n }\n keys.sort();\n ctHandle.set(keys);\n lastKnownKeys = keys;\n }\n });\n\n\n // let $el = $(el);\n // $el.on(\"change\", \"input[type=\"checkbox\"]\", function() {\n // let checked = $el.find(\"input[type=\"checkbox\"]:checked\");\n // if (checked.length === 0) {\n // ctHandle.clear();\n // } else {\n // let keys = {};\n // checked.each(function() {\n // data.map[this.value].forEach(function(key) {\n // keys[key] = true;\n // });\n // });\n // let keyArray = Object.keys(keys);\n // keyArray.sort();\n // ctHandle.set(keyArray);\n // }\n // });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n\n\n// Convert a number to a string with leading zeros\nfunction padZeros(n, digits) {\n let str = n.toString();\n while (str.length < digits)\n str = \"0\" + str;\n return str;\n}\n\n// Given a Date object, return a string in yyyy-mm-dd format, using the\n// UTC date. This may be a day off from the date in the local time zone.\nfunction formatDateUTC(date) {\n if (date instanceof Date) {\n return date.getUTCFullYear() + \"-\" +\n padZeros(date.getUTCMonth()+1, 2) + \"-\" +\n padZeros(date.getUTCDate(), 2);\n\n } else {\n return null;\n }\n}\n", + "import Events from \"./events\";\nimport grp from \"./group\";\nimport * as util from \"./util\";\n\n/**\n * Use this class to read and write (and listen for changes to) the selection\n * for a Crosstalk group. This is intended to be used for linked brushing.\n *\n * If two (or more) `SelectionHandle` instances in the same webpage share the\n * same group name, they will share the same state. Setting the selection using\n * one `SelectionHandle` instance will result in the `value` property instantly\n * changing across the others, and `\"change\"` event listeners on all instances\n * (including the one that initiated the sending) will fire.\n *\n * @param {string} [group] - The name of the Crosstalk group, or if none,\n * null or undefined (or any other falsy value). This can be changed later\n * via the [SelectionHandle#setGroup](#setGroup) method.\n * @param {Object} [extraInfo] - An object whose properties will be copied to\n * the event object whenever an event is emitted.\n */\nexport class SelectionHandle {\n\n constructor(group = null, extraInfo = null) {\n this._eventRelay = new Events();\n this._emitter = new util.SubscriptionTracker(this._eventRelay);\n\n // Name of the group we're currently tracking, if any. Can change over time.\n this._group = null;\n // The Var we're currently tracking, if any. Can change over time.\n this._var = null;\n // The event handler subscription we currently have on var.on(\"change\").\n this._varOnChangeSub = null;\n\n this._extraInfo = util.extend({ sender: this }, extraInfo);\n\n this.setGroup(group);\n }\n\n /**\n * Changes the Crosstalk group membership of this SelectionHandle. The group\n * being switched away from (if any) will not have its selection value\n * modified as a result of calling `setGroup`, even if this handle was the\n * most recent handle to set the selection of the group.\n *\n * The group being switched to (if any) will also not have its selection value\n * modified as a result of calling `setGroup`. If you want to set the\n * selection value of the new group, call `set` explicitly.\n *\n * @param {string} group - The name of the Crosstalk group, or null (or\n * undefined) to clear the group.\n */\n setGroup(group) {\n // If group is unchanged, do nothing\n if (this._group === group)\n return;\n // Treat null, undefined, and other falsy values the same\n if (!this._group && !group)\n return;\n\n if (this._var) {\n this._var.off(\"change\", this._varOnChangeSub);\n this._var = null;\n this._varOnChangeSub = null;\n }\n\n this._group = group;\n\n if (group) {\n this._var = grp(group).var(\"selection\");\n let sub = this._var.on(\"change\", (e) => {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Retrieves the current selection for the group represented by this\n * `SelectionHandle`.\n *\n * - If no selection is active, then this value will be falsy.\n * - If a selection is active, but no data points are selected, then this\n * value will be an empty array.\n * - If a selection is active, and data points are selected, then the keys\n * of the selected data points will be present in the array.\n */\n get value() {\n return this._var ? this._var.get() : null;\n }\n\n /**\n * Combines the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n // Important incidental effect: shallow clone is returned\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see\n * {@link SelectionHandle#value}).\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `SelectionHandle` constructor).\n */\n set(selectedKeys, extraInfo) {\n if (this._var)\n this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any that were passed\n * into the `SelectionHandle` constructor).\n */\n clear(extraInfo) {\n if (this._var)\n this.set(void 0, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Subscribes to events on this `SelectionHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {SelectionHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancels event subscriptions created by {@link SelectionHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|SelectionHandle~listener} listener - Either the callback\n * function previously passed into {@link SelectionHandle#on}, or the\n * string that was returned from {@link SelectionHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n /**\n * Shuts down the `SelectionHandle` object.\n *\n * Removes all event listeners that were added through this handle.\n */\n close() {\n this._emitter.removeAllListeners();\n this.setGroup(null);\n }\n}\n\n/**\n * @callback SelectionHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the selection, or `undefined` if no selection is active),\n * `oldValue` (the previous value of the selection), and `sender` (the\n * `SelectionHandle` instance that made the change).\n */\n\n/**\n * @event SelectionHandle#change\n * @type {object}\n * @property {object} value - The new value of the selection, or `undefined`\n * if no selection is active.\n * @property {object} oldValue - The previous value of the selection.\n * @property {SelectionHandle} sender - The `SelectionHandle` instance that\n * changed the value.\n */\n", + "export function extend(target, ...sources) {\n for (let i = 0; i < sources.length; i++) {\n let src = sources[i];\n if (typeof(src) === \"undefined\" || src === null)\n continue;\n\n for (let key in src) {\n if (src.hasOwnProperty(key)) {\n target[key] = src[key];\n }\n }\n }\n return target;\n}\n\nexport function checkSorted(list) {\n for (let i = 1; i < list.length; i++) {\n if (list[i] <= list[i-1]) {\n throw new Error(\"List is not sorted or contains duplicate\");\n }\n }\n}\n\nexport function diffSortedLists(a, b) {\n let i_a = 0;\n let i_b = 0;\n\n if (!a) a = [];\n if (!b) b = [];\n\n let a_only = [];\n let b_only = [];\n\n checkSorted(a);\n checkSorted(b);\n\n while (i_a < a.length && i_b < b.length) {\n if (a[i_a] === b[i_b]) {\n i_a++;\n i_b++;\n } else if (a[i_a] < b[i_b]) {\n a_only.push(a[i_a++]);\n } else {\n b_only.push(b[i_b++]);\n }\n }\n\n if (i_a < a.length)\n a_only = a_only.concat(a.slice(i_a));\n if (i_b < b.length)\n b_only = b_only.concat(b.slice(i_b));\n return {\n removed: a_only,\n added: b_only\n };\n}\n\n// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... }\n// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ]\nexport function dataframeToD3(df) {\n let names = [];\n let length;\n for (let name in df) {\n if (df.hasOwnProperty(name))\n names.push(name);\n if (typeof(df[name]) !== \"object\" || typeof(df[name].length) === \"undefined\") {\n throw new Error(\"All fields must be arrays\");\n } else if (typeof(length) !== \"undefined\" && length !== df[name].length) {\n throw new Error(\"All fields must be arrays of the same length\");\n }\n length = df[name].length;\n }\n let results = [];\n let item;\n for (let row = 0; row < length; row++) {\n item = {};\n for (let col = 0; col < names.length; col++) {\n item[names[col]] = df[names[col]][row];\n }\n results.push(item);\n }\n return results;\n}\n\n/**\n * Keeps track of all event listener additions/removals and lets all active\n * listeners be removed with a single operation.\n *\n * @private\n */\nexport class SubscriptionTracker {\n constructor(emitter) {\n this._emitter = emitter;\n this._subs = {};\n }\n\n on(eventType, listener) {\n let sub = this._emitter.on(eventType, listener);\n this._subs[sub] = eventType;\n return sub;\n }\n\n off(eventType, listener) {\n let sub = this._emitter.off(eventType, listener);\n if (sub) {\n delete this._subs[sub];\n }\n return sub;\n }\n\n removeAllListeners() {\n let current_subs = this._subs;\n this._subs = {};\n Object.keys(current_subs).forEach((sub) => {\n this._emitter.off(current_subs[sub], sub);\n });\n }\n}\n", + "import Events from \"./events\";\n\nexport default class Var {\n constructor(group, name, /*optional*/ value) {\n this._group = group;\n this._name = name;\n this._value = value;\n this._events = new Events();\n }\n\n get() {\n return this._value;\n }\n\n set(value, /*optional*/ event) {\n if (this._value === value) {\n // Do nothing; the value hasn't changed\n return;\n }\n let oldValue = this._value;\n this._value = value;\n // Alert JavaScript listeners that the value has changed\n let evt = {};\n if (event && typeof(event) === \"object\") {\n for (let k in event) {\n if (event.hasOwnProperty(k))\n evt[k] = event[k];\n }\n }\n evt.oldValue = oldValue;\n evt.value = value;\n this._events.trigger(\"change\", evt, this);\n\n // TODO: Make this extensible, to let arbitrary back-ends know that\n // something has changed\n if (global.Shiny && global.Shiny.onInputChange) {\n global.Shiny.onInputChange(\n \".clientValue-\" +\n (this._group.name !== null ? this._group.name + \"-\" : \"\") +\n this._name,\n typeof(value) === \"undefined\" ? null : value\n );\n }\n }\n\n on(eventType, listener) {\n return this._events.on(eventType, listener);\n }\n\n off(eventType, listener) {\n return this._events.off(eventType, listener);\n }\n}\n" + ] +} \ No newline at end of file diff --git a/vignettes/images/Vis_3D_files/crosstalk-1.2.1/js/crosstalk.min.js b/vignettes/images/Vis_3D_files/crosstalk-1.2.1/js/crosstalk.min.js new file mode 100644 index 0000000..b7ec0ac --- /dev/null +++ b/vignettes/images/Vis_3D_files/crosstalk-1.2.1/js/crosstalk.min.js @@ -0,0 +1,2 @@ +!function o(u,a,l){function s(n,e){if(!a[n]){if(!u[n]){var t="function"==typeof require&&require;if(!e&&t)return t(n,!0);if(f)return f(n,!0);var r=new Error("Cannot find module '"+n+"'");throw r.code="MODULE_NOT_FOUND",r}var i=a[n]={exports:{}};u[n][0].call(i.exports,function(e){var t=u[n][1][e];return s(t||e)},i,i.exports,o,u,a,l)}return a[n].exports}for(var f="function"==typeof require&&require,e=0;e?@[\\\]^`{|}~])/g,"\\$1")+"']"),r=JSON.parse(n[0].innerText),i=e.factory(t,r);o(t).data("crosstalk-instance",i),o(t).addClass("crosstalk-input-bound")}if(t.Shiny){var e=new t.Shiny.InputBinding,u=t.jQuery;u.extend(e,{find:function(e){return u(e).find(".crosstalk-input")},initialize:function(e){var t,n;u(e).hasClass("crosstalk-input-bound")||(n=o(t=e),Object.keys(r).forEach(function(e){n.hasClass(e)&&!n.hasClass("crosstalk-input-bound")&&i(r[e],t)}))},getId:function(e){return e.id},getValue:function(e){},setValue:function(e,t){},receiveMessage:function(e,t){},subscribe:function(e,t){u(e).data("crosstalk-instance").resume()},unsubscribe:function(e){u(e).data("crosstalk-instance").suspend()}}),t.Shiny.inputBindings.register(e,"crosstalk.inputBinding")}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],7:[function(r,e,t){(function(e){"use strict";var t=function(e){{if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}}(r("./input")),n=r("./filter");var a=e.jQuery;t.register({className:"crosstalk-input-checkboxgroup",factory:function(e,r){var i=new n.FilterHandle(r.group),o=void 0,u=a(e);return u.on("change","input[type='checkbox']",function(){var e=u.find("input[type='checkbox']:checked");if(0===e.length)o=null,i.clear();else{var t={};e.each(function(){r.map[this.value].forEach(function(e){t[e]=!0})});var n=Object.keys(t);n.sort(),o=n,i.set(n)}}),{suspend:function(){i.clear()},resume:function(){o&&i.set(o)}}}})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./filter":2,"./input":6}],8:[function(r,e,t){(function(e){"use strict";var t=n(r("./input")),l=n(r("./util")),s=r("./filter");function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}var f=e.jQuery;t.register({className:"crosstalk-input-select",factory:function(e,n){var t=l.dataframeToD3(n.items),r={options:[{value:"",label:"(All)"}].concat(t),valueField:"value",labelField:"label",searchField:"label"},i=f(e).find("select")[0],o=f(i).selectize(r)[0].selectize,u=new s.FilterHandle(n.group),a=void 0;return o.on("change",function(){if(0===o.items.length)a=null,u.clear();else{var t={};o.items.forEach(function(e){n.map[e].forEach(function(e){t[e]=!0})});var e=Object.keys(t);e.sort(),a=e,u.set(e)}}),{suspend:function(){u.clear()},resume:function(){a&&u.set(a)}}}})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./filter":2,"./input":6,"./util":11}],9:[function(n,e,t){(function(e){"use strict";var d=function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,i=!1,o=void 0;try{for(var u,a=e[Symbol.iterator]();!(r=(u=a.next()).done)&&(n.push(u.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{!r&&a.return&&a.return()}finally{if(i)throw o}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")},t=function(e){{if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}}(n("./input")),a=n("./filter");var v=e.jQuery,p=e.strftime;function y(e,t){for(var n=e.toString();n.length {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Combine the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Close the handle. This clears this handle's contribution to the filter set,\n * and unsubscribes all event listeners.\n */\n close() {\n this._emitter.removeAllListeners();\n this.clear();\n this.setGroup(null);\n }\n\n /**\n * Clear this handle's contribution to the filter set.\n *\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n clear(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.clear(this._id);\n this._onChange(extraInfo);\n }\n\n /**\n * Set this handle's contribution to the filter set. This array should consist\n * of the keys of the rows that _should_ be displayed; any keys that are not\n * present in the array will be considered _filtered out_. Note that multiple\n * `FilterHandle` instances in the group may each contribute an array of keys,\n * and only those keys that appear in _all_ of the arrays make it through the\n * filter.\n *\n * @param {string[]} keys - Empty array, or array of keys. To clear the\n * filter, don't pass an empty array; instead, use the\n * {@link FilterHandle#clear} method.\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n set(keys, extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.update(this._id, keys);\n this._onChange(extraInfo);\n }\n\n /**\n * @return {string[]|null} - Either: 1) an array of keys that made it through\n * all of the `FilterHandle` instances, or, 2) `null`, which means no filter\n * is being applied (all data should be displayed).\n */\n get filteredKeys() {\n return this._filterSet ? this._filterSet.value : null;\n }\n\n /**\n * Subscribe to events on this `FilterHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {FilterHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link FilterHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancel event subscriptions created by {@link FilterHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|FilterHandle~listener} listener - Either the callback\n * function previously passed into {@link FilterHandle#on}, or the\n * string that was returned from {@link FilterHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n _onChange(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterVar.set(this._filterSet.value, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * @callback FilterHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the filter set, or `null` if no filter set is active),\n * `oldValue` (the previous value of the filter set), and `sender` (the\n * `FilterHandle` instance that made the change).\n */\n\n}\n\n/**\n * @event FilterHandle#change\n * @type {object}\n * @property {object} value - The new value of the filter set, or `null`\n * if no filter set is active.\n * @property {object} oldValue - The previous value of the filter set.\n * @property {FilterHandle} sender - The `FilterHandle` instance that\n * changed the value.\n */\n","import { diffSortedLists } from \"./util\";\n\nfunction naturalComparator(a, b) {\n if (a === b) {\n return 0;\n } else if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n }\n}\n\n/**\n * @private\n */\nexport default class FilterSet {\n constructor() {\n this.reset();\n }\n\n reset() {\n // Key: handle ID, Value: array of selected keys, or null\n this._handles = {};\n // Key: key string, Value: count of handles that include it\n this._keys = {};\n this._value = null;\n this._activeHandles = 0;\n }\n\n get value() {\n return this._value;\n }\n\n update(handleId, keys) {\n if (keys !== null) {\n keys = keys.slice(0); // clone before sorting\n keys.sort(naturalComparator);\n }\n\n let {added, removed} = diffSortedLists(this._handles[handleId], keys);\n this._handles[handleId] = keys;\n\n for (let i = 0; i < added.length; i++) {\n this._keys[added[i]] = (this._keys[added[i]] || 0) + 1;\n }\n for (let i = 0; i < removed.length; i++) {\n this._keys[removed[i]]--;\n }\n\n this._updateValue(keys);\n }\n\n /**\n * @param {string[]} keys Sorted array of strings that indicate\n * a superset of possible keys.\n * @private\n */\n _updateValue(keys = this._allKeys) {\n let handleCount = Object.keys(this._handles).length;\n if (handleCount === 0) {\n this._value = null;\n } else {\n this._value = [];\n for (let i = 0; i < keys.length; i++) {\n let count = this._keys[keys[i]];\n if (count === handleCount) {\n this._value.push(keys[i]);\n }\n }\n }\n }\n\n clear(handleId) {\n if (typeof(this._handles[handleId]) === \"undefined\") {\n return;\n }\n\n let keys = this._handles[handleId];\n if (!keys) {\n keys = [];\n }\n\n for (let i = 0; i < keys.length; i++) {\n this._keys[keys[i]]--;\n }\n delete this._handles[handleId];\n\n this._updateValue();\n }\n\n get _allKeys() {\n let allKeys = Object.keys(this._keys);\n allKeys.sort(naturalComparator);\n return allKeys;\n }\n}\n","import Var from \"./var\";\n\n// Use a global so that multiple copies of crosstalk.js can be loaded and still\n// have groups behave as singletons across all copies.\nglobal.__crosstalk_groups = global.__crosstalk_groups || {};\nlet groups = global.__crosstalk_groups;\n\nexport default function group(groupName) {\n if (groupName && typeof(groupName) === \"string\") {\n if (!groups.hasOwnProperty(groupName)) {\n groups[groupName] = new Group(groupName);\n }\n return groups[groupName];\n } else if (typeof(groupName) === \"object\" && groupName._vars && groupName.var) {\n // Appears to already be a group object\n return groupName;\n } else if (Array.isArray(groupName) &&\n groupName.length == 1 &&\n typeof(groupName[0]) === \"string\") {\n return group(groupName[0]);\n } else {\n throw new Error(\"Invalid groupName argument\");\n }\n}\n\nclass Group {\n constructor(name) {\n this.name = name;\n this._vars = {};\n }\n\n var(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n if (!this._vars.hasOwnProperty(name))\n this._vars[name] = new Var(this, name);\n return this._vars[name];\n }\n\n has(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n return this._vars.hasOwnProperty(name);\n }\n}\n","import group from \"./group\";\nimport { SelectionHandle } from \"./selection\";\nimport { FilterHandle } from \"./filter\";\nimport { bind } from \"./input\";\nimport \"./input_selectize\";\nimport \"./input_checkboxgroup\";\nimport \"./input_slider\";\n\nconst defaultGroup = group(\"default\");\n\nfunction var_(name) {\n return defaultGroup.var(name);\n}\n\nfunction has(name) {\n return defaultGroup.has(name);\n}\n\nif (global.Shiny) {\n global.Shiny.addCustomMessageHandler(\"update-client-value\", function(message) {\n if (typeof(message.group) === \"string\") {\n group(message.group).var(message.name).set(message.value);\n } else {\n var_(message.name).set(message.value);\n }\n });\n}\n\nconst crosstalk = {\n group: group,\n var: var_,\n has: has,\n SelectionHandle: SelectionHandle,\n FilterHandle: FilterHandle,\n bind: bind\n};\n\n/**\n * @namespace crosstalk\n */\nexport default crosstalk;\nglobal.crosstalk = crosstalk;\n","let $ = global.jQuery;\n\nlet bindings = {};\n\nexport function register(reg) {\n bindings[reg.className] = reg;\n if (global.document && global.document.readyState !== \"complete\") {\n $(() => {\n bind();\n });\n } else if (global.document) {\n setTimeout(bind, 100);\n }\n}\n\nexport function bind() {\n Object.keys(bindings).forEach(function(className) {\n let binding = bindings[className];\n $(\".\" + binding.className).not(\".crosstalk-input-bound\").each(function(i, el) {\n bindInstance(binding, el);\n });\n });\n}\n\n// Escape jQuery identifier\nfunction $escape(val) {\n return val.replace(/([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, \"\\\\$1\");\n}\n\nfunction bindEl(el) {\n let $el = $(el);\n Object.keys(bindings).forEach(function(className) {\n if ($el.hasClass(className) && !$el.hasClass(\"crosstalk-input-bound\")) {\n let binding = bindings[className];\n bindInstance(binding, el);\n }\n });\n}\n\nfunction bindInstance(binding, el) {\n let jsonEl = $(el).find(\"script[type='application/json'][data-for='\" + $escape(el.id) + \"']\");\n let data = JSON.parse(jsonEl[0].innerText);\n\n let instance = binding.factory(el, data);\n $(el).data(\"crosstalk-instance\", instance);\n $(el).addClass(\"crosstalk-input-bound\");\n}\n\nif (global.Shiny) {\n let inputBinding = new global.Shiny.InputBinding();\n let $ = global.jQuery;\n $.extend(inputBinding, {\n find: function(scope) {\n return $(scope).find(\".crosstalk-input\");\n },\n initialize: function(el) {\n if (!$(el).hasClass(\"crosstalk-input-bound\")) {\n bindEl(el);\n }\n },\n getId: function(el) {\n return el.id;\n },\n getValue: function(el) {\n\n },\n setValue: function(el, value) {\n\n },\n receiveMessage: function(el, data) {\n\n },\n subscribe: function(el, callback) {\n $(el).data(\"crosstalk-instance\").resume();\n },\n unsubscribe: function(el) {\n $(el).data(\"crosstalk-instance\").suspend();\n }\n });\n global.Shiny.inputBindings.register(inputBinding, \"crosstalk.inputBinding\");\n}\n","import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-checkboxgroup\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n let $el = $(el);\n $el.on(\"change\", \"input[type='checkbox']\", function() {\n let checked = $el.find(\"input[type='checkbox']:checked\");\n if (checked.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n checked.each(function() {\n data.map[this.value].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n","import * as input from \"./input\";\nimport * as util from \"./util\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-select\",\n\n factory: function(el, data) {\n /*\n * items: {value: [...], label: [...]}\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n\n let first = [{value: \"\", label: \"(All)\"}];\n let items = util.dataframeToD3(data.items);\n let opts = {\n options: first.concat(items),\n valueField: \"value\",\n labelField: \"label\",\n searchField: \"label\"\n };\n\n let select = $(el).find(\"select\")[0];\n\n let selectize = $(select).selectize(opts)[0].selectize;\n\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n selectize.on(\"change\", function() {\n if (selectize.items.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n selectize.items.forEach(function(group) {\n data.map[group].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n","import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\nlet strftime = global.strftime;\n\ninput.register({\n className: \"crosstalk-input-slider\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let opts = {};\n let $el = $(el).find(\"input\");\n let dataType = $el.data(\"data-type\");\n let timeFormat = $el.data(\"time-format\");\n let round = $el.data(\"round\");\n let timeFormatter;\n\n // Set up formatting functions\n if (dataType === \"date\") {\n timeFormatter = strftime.utc();\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n\n } else if (dataType === \"datetime\") {\n let timezone = $el.data(\"timezone\");\n if (timezone)\n timeFormatter = strftime.timezone(timezone);\n else\n timeFormatter = strftime;\n\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n } else if (dataType === \"number\") {\n if (typeof round !== \"undefined\")\n opts.prettify = function(num) {\n let factor = Math.pow(10, round);\n return Math.round(num * factor) / factor;\n };\n }\n\n $el.ionRangeSlider(opts);\n\n function getValue() {\n let result = $el.data(\"ionRangeSlider\").result;\n\n // Function for converting numeric value from slider to appropriate type.\n let convert;\n let dataType = $el.data(\"data-type\");\n if (dataType === \"date\") {\n convert = function(val) {\n return formatDateUTC(new Date(+val));\n };\n } else if (dataType === \"datetime\") {\n convert = function(val) {\n // Convert ms to s\n return +val / 1000;\n };\n } else {\n convert = function(val) { return +val; };\n }\n\n if ($el.data(\"ionRangeSlider\").options.type === \"double\") {\n return [convert(result.from), convert(result.to)];\n } else {\n return convert(result.from);\n }\n }\n\n let lastKnownKeys = null;\n\n $el.on(\"change.crosstalkSliderInput\", function(event) {\n if (!$el.data(\"updating\") && !$el.data(\"animating\")) {\n let [from, to] = getValue();\n let keys = [];\n for (let i = 0; i < data.values.length; i++) {\n let val = data.values[i];\n if (val >= from && val <= to) {\n keys.push(data.keys[i]);\n }\n }\n keys.sort();\n ctHandle.set(keys);\n lastKnownKeys = keys;\n }\n });\n\n\n // let $el = $(el);\n // $el.on(\"change\", \"input[type=\"checkbox\"]\", function() {\n // let checked = $el.find(\"input[type=\"checkbox\"]:checked\");\n // if (checked.length === 0) {\n // ctHandle.clear();\n // } else {\n // let keys = {};\n // checked.each(function() {\n // data.map[this.value].forEach(function(key) {\n // keys[key] = true;\n // });\n // });\n // let keyArray = Object.keys(keys);\n // keyArray.sort();\n // ctHandle.set(keyArray);\n // }\n // });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n\n\n// Convert a number to a string with leading zeros\nfunction padZeros(n, digits) {\n let str = n.toString();\n while (str.length < digits)\n str = \"0\" + str;\n return str;\n}\n\n// Given a Date object, return a string in yyyy-mm-dd format, using the\n// UTC date. This may be a day off from the date in the local time zone.\nfunction formatDateUTC(date) {\n if (date instanceof Date) {\n return date.getUTCFullYear() + \"-\" +\n padZeros(date.getUTCMonth()+1, 2) + \"-\" +\n padZeros(date.getUTCDate(), 2);\n\n } else {\n return null;\n }\n}\n","import Events from \"./events\";\nimport grp from \"./group\";\nimport * as util from \"./util\";\n\n/**\n * Use this class to read and write (and listen for changes to) the selection\n * for a Crosstalk group. This is intended to be used for linked brushing.\n *\n * If two (or more) `SelectionHandle` instances in the same webpage share the\n * same group name, they will share the same state. Setting the selection using\n * one `SelectionHandle` instance will result in the `value` property instantly\n * changing across the others, and `\"change\"` event listeners on all instances\n * (including the one that initiated the sending) will fire.\n *\n * @param {string} [group] - The name of the Crosstalk group, or if none,\n * null or undefined (or any other falsy value). This can be changed later\n * via the [SelectionHandle#setGroup](#setGroup) method.\n * @param {Object} [extraInfo] - An object whose properties will be copied to\n * the event object whenever an event is emitted.\n */\nexport class SelectionHandle {\n\n constructor(group = null, extraInfo = null) {\n this._eventRelay = new Events();\n this._emitter = new util.SubscriptionTracker(this._eventRelay);\n\n // Name of the group we're currently tracking, if any. Can change over time.\n this._group = null;\n // The Var we're currently tracking, if any. Can change over time.\n this._var = null;\n // The event handler subscription we currently have on var.on(\"change\").\n this._varOnChangeSub = null;\n\n this._extraInfo = util.extend({ sender: this }, extraInfo);\n\n this.setGroup(group);\n }\n\n /**\n * Changes the Crosstalk group membership of this SelectionHandle. The group\n * being switched away from (if any) will not have its selection value\n * modified as a result of calling `setGroup`, even if this handle was the\n * most recent handle to set the selection of the group.\n *\n * The group being switched to (if any) will also not have its selection value\n * modified as a result of calling `setGroup`. If you want to set the\n * selection value of the new group, call `set` explicitly.\n *\n * @param {string} group - The name of the Crosstalk group, or null (or\n * undefined) to clear the group.\n */\n setGroup(group) {\n // If group is unchanged, do nothing\n if (this._group === group)\n return;\n // Treat null, undefined, and other falsy values the same\n if (!this._group && !group)\n return;\n\n if (this._var) {\n this._var.off(\"change\", this._varOnChangeSub);\n this._var = null;\n this._varOnChangeSub = null;\n }\n\n this._group = group;\n\n if (group) {\n this._var = grp(group).var(\"selection\");\n let sub = this._var.on(\"change\", (e) => {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Retrieves the current selection for the group represented by this\n * `SelectionHandle`.\n *\n * - If no selection is active, then this value will be falsy.\n * - If a selection is active, but no data points are selected, then this\n * value will be an empty array.\n * - If a selection is active, and data points are selected, then the keys\n * of the selected data points will be present in the array.\n */\n get value() {\n return this._var ? this._var.get() : null;\n }\n\n /**\n * Combines the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n // Important incidental effect: shallow clone is returned\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see\n * {@link SelectionHandle#value}).\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `SelectionHandle` constructor).\n */\n set(selectedKeys, extraInfo) {\n if (this._var)\n this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any that were passed\n * into the `SelectionHandle` constructor).\n */\n clear(extraInfo) {\n if (this._var)\n this.set(void 0, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Subscribes to events on this `SelectionHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {SelectionHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancels event subscriptions created by {@link SelectionHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|SelectionHandle~listener} listener - Either the callback\n * function previously passed into {@link SelectionHandle#on}, or the\n * string that was returned from {@link SelectionHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n /**\n * Shuts down the `SelectionHandle` object.\n *\n * Removes all event listeners that were added through this handle.\n */\n close() {\n this._emitter.removeAllListeners();\n this.setGroup(null);\n }\n}\n\n/**\n * @callback SelectionHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the selection, or `undefined` if no selection is active),\n * `oldValue` (the previous value of the selection), and `sender` (the\n * `SelectionHandle` instance that made the change).\n */\n\n/**\n * @event SelectionHandle#change\n * @type {object}\n * @property {object} value - The new value of the selection, or `undefined`\n * if no selection is active.\n * @property {object} oldValue - The previous value of the selection.\n * @property {SelectionHandle} sender - The `SelectionHandle` instance that\n * changed the value.\n */\n","export function extend(target, ...sources) {\n for (let i = 0; i < sources.length; i++) {\n let src = sources[i];\n if (typeof(src) === \"undefined\" || src === null)\n continue;\n\n for (let key in src) {\n if (src.hasOwnProperty(key)) {\n target[key] = src[key];\n }\n }\n }\n return target;\n}\n\nexport function checkSorted(list) {\n for (let i = 1; i < list.length; i++) {\n if (list[i] <= list[i-1]) {\n throw new Error(\"List is not sorted or contains duplicate\");\n }\n }\n}\n\nexport function diffSortedLists(a, b) {\n let i_a = 0;\n let i_b = 0;\n\n if (!a) a = [];\n if (!b) b = [];\n\n let a_only = [];\n let b_only = [];\n\n checkSorted(a);\n checkSorted(b);\n\n while (i_a < a.length && i_b < b.length) {\n if (a[i_a] === b[i_b]) {\n i_a++;\n i_b++;\n } else if (a[i_a] < b[i_b]) {\n a_only.push(a[i_a++]);\n } else {\n b_only.push(b[i_b++]);\n }\n }\n\n if (i_a < a.length)\n a_only = a_only.concat(a.slice(i_a));\n if (i_b < b.length)\n b_only = b_only.concat(b.slice(i_b));\n return {\n removed: a_only,\n added: b_only\n };\n}\n\n// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... }\n// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ]\nexport function dataframeToD3(df) {\n let names = [];\n let length;\n for (let name in df) {\n if (df.hasOwnProperty(name))\n names.push(name);\n if (typeof(df[name]) !== \"object\" || typeof(df[name].length) === \"undefined\") {\n throw new Error(\"All fields must be arrays\");\n } else if (typeof(length) !== \"undefined\" && length !== df[name].length) {\n throw new Error(\"All fields must be arrays of the same length\");\n }\n length = df[name].length;\n }\n let results = [];\n let item;\n for (let row = 0; row < length; row++) {\n item = {};\n for (let col = 0; col < names.length; col++) {\n item[names[col]] = df[names[col]][row];\n }\n results.push(item);\n }\n return results;\n}\n\n/**\n * Keeps track of all event listener additions/removals and lets all active\n * listeners be removed with a single operation.\n *\n * @private\n */\nexport class SubscriptionTracker {\n constructor(emitter) {\n this._emitter = emitter;\n this._subs = {};\n }\n\n on(eventType, listener) {\n let sub = this._emitter.on(eventType, listener);\n this._subs[sub] = eventType;\n return sub;\n }\n\n off(eventType, listener) {\n let sub = this._emitter.off(eventType, listener);\n if (sub) {\n delete this._subs[sub];\n }\n return sub;\n }\n\n removeAllListeners() {\n let current_subs = this._subs;\n this._subs = {};\n Object.keys(current_subs).forEach((sub) => {\n this._emitter.off(current_subs[sub], sub);\n });\n }\n}\n","import Events from \"./events\";\n\nexport default class Var {\n constructor(group, name, /*optional*/ value) {\n this._group = group;\n this._name = name;\n this._value = value;\n this._events = new Events();\n }\n\n get() {\n return this._value;\n }\n\n set(value, /*optional*/ event) {\n if (this._value === value) {\n // Do nothing; the value hasn't changed\n return;\n }\n let oldValue = this._value;\n this._value = value;\n // Alert JavaScript listeners that the value has changed\n let evt = {};\n if (event && typeof(event) === \"object\") {\n for (let k in event) {\n if (event.hasOwnProperty(k))\n evt[k] = event[k];\n }\n }\n evt.oldValue = oldValue;\n evt.value = value;\n this._events.trigger(\"change\", evt, this);\n\n // TODO: Make this extensible, to let arbitrary back-ends know that\n // something has changed\n if (global.Shiny && global.Shiny.onInputChange) {\n global.Shiny.onInputChange(\n \".clientValue-\" +\n (this._group.name !== null ? this._group.name + \"-\" : \"\") +\n this._name,\n typeof(value) === \"undefined\" ? null : value\n );\n }\n }\n\n on(eventType, listener) {\n return this._events.on(eventType, listener);\n }\n\n off(eventType, listener) {\n return this._events.off(eventType, listener);\n }\n}\n"]} \ No newline at end of file diff --git a/vignettes/images/Vis_3D_files/crosstalk-1.2.1/scss/crosstalk.scss b/vignettes/images/Vis_3D_files/crosstalk-1.2.1/scss/crosstalk.scss new file mode 100644 index 0000000..3566561 --- /dev/null +++ b/vignettes/images/Vis_3D_files/crosstalk-1.2.1/scss/crosstalk.scss @@ -0,0 +1,75 @@ +/* Adjust margins outwards, so column contents line up with the edges of the + parent of container-fluid. */ +.container-fluid.crosstalk-bscols { + margin-left: -30px; + margin-right: -30px; + white-space: normal; +} + +/* But don't adjust the margins outwards if we're directly under the body, + i.e. we were the top-level of something at the console. */ +body > .container-fluid.crosstalk-bscols { + margin-left: auto; + margin-right: auto; +} + +.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column { + display: inline-block; + padding-right: 12px; + vertical-align: top; +} + +@media only screen and (max-width:480px) { + .crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column { + display: block; + padding-right: inherit; + } +} + +/* Relevant BS3 styles to make filter_checkbox() look reasonable without Bootstrap */ +.crosstalk-input { + margin-bottom: 15px; /* a la .form-group */ + .control-label { + margin-bottom: 0; + vertical-align: middle; + } + input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px; + line-height: normal; + } + .checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; + } + .checkbox > label{ + padding-left: 20px; + margin-bottom: 0; + font-weight: 400; + cursor: pointer; + } + .checkbox input[type="checkbox"], + .checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 2px; + margin-left: -20px; + } + .checkbox + .checkbox { + margin-top: -5px; + } + .checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: 400; + vertical-align: middle; + cursor: pointer; + } + .checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; + } +} diff --git a/vignettes/images/Vis_3D_files/htmltools-fill-0.5.8.1/fill.css b/vignettes/images/Vis_3D_files/htmltools-fill-0.5.8.1/fill.css new file mode 100644 index 0000000..841ea9d --- /dev/null +++ b/vignettes/images/Vis_3D_files/htmltools-fill-0.5.8.1/fill.css @@ -0,0 +1,21 @@ +@layer htmltools { + .html-fill-container { + display: flex; + flex-direction: column; + /* Prevent the container from expanding vertically or horizontally beyond its + parent's constraints. */ + min-height: 0; + min-width: 0; + } + .html-fill-container > .html-fill-item { + /* Fill items can grow and shrink freely within + available vertical space in fillable container */ + flex: 1 1 auto; + min-height: 0; + min-width: 0; + } + .html-fill-container > :not(.html-fill-item) { + /* Prevent shrinking or growing of non-fill items */ + flex: 0 0 auto; + } +} diff --git a/vignettes/images/Vis_3D_files/htmlwidgets-1.6.4/htmlwidgets.js b/vignettes/images/Vis_3D_files/htmlwidgets-1.6.4/htmlwidgets.js new file mode 100644 index 0000000..1067d02 --- /dev/null +++ b/vignettes/images/Vis_3D_files/htmlwidgets-1.6.4/htmlwidgets.js @@ -0,0 +1,901 @@ +(function() { + // If window.HTMLWidgets is already defined, then use it; otherwise create a + // new object. This allows preceding code to set options that affect the + // initialization process (though none currently exist). + window.HTMLWidgets = window.HTMLWidgets || {}; + + // See if we're running in a viewer pane. If not, we're in a web browser. + var viewerMode = window.HTMLWidgets.viewerMode = + /\bviewer_pane=1\b/.test(window.location); + + // See if we're running in Shiny mode. If not, it's a static document. + // Note that static widgets can appear in both Shiny and static modes, but + // obviously, Shiny widgets can only appear in Shiny apps/documents. + var shinyMode = window.HTMLWidgets.shinyMode = + typeof(window.Shiny) !== "undefined" && !!window.Shiny.outputBindings; + + // We can't count on jQuery being available, so we implement our own + // version if necessary. + function querySelectorAll(scope, selector) { + if (typeof(jQuery) !== "undefined" && scope instanceof jQuery) { + return scope.find(selector); + } + if (scope.querySelectorAll) { + return scope.querySelectorAll(selector); + } + } + + function asArray(value) { + if (value === null) + return []; + if ($.isArray(value)) + return value; + return [value]; + } + + // Implement jQuery's extend + function extend(target /*, ... */) { + if (arguments.length == 1) { + return target; + } + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var prop in source) { + if (source.hasOwnProperty(prop)) { + target[prop] = source[prop]; + } + } + } + return target; + } + + // IE8 doesn't support Array.forEach. + function forEach(values, callback, thisArg) { + if (values.forEach) { + values.forEach(callback, thisArg); + } else { + for (var i = 0; i < values.length; i++) { + callback.call(thisArg, values[i], i, values); + } + } + } + + // Replaces the specified method with the return value of funcSource. + // + // Note that funcSource should not BE the new method, it should be a function + // that RETURNS the new method. funcSource receives a single argument that is + // the overridden method, it can be called from the new method. The overridden + // method can be called like a regular function, it has the target permanently + // bound to it so "this" will work correctly. + function overrideMethod(target, methodName, funcSource) { + var superFunc = target[methodName] || function() {}; + var superFuncBound = function() { + return superFunc.apply(target, arguments); + }; + target[methodName] = funcSource(superFuncBound); + } + + // Add a method to delegator that, when invoked, calls + // delegatee.methodName. If there is no such method on + // the delegatee, but there was one on delegator before + // delegateMethod was called, then the original version + // is invoked instead. + // For example: + // + // var a = { + // method1: function() { console.log('a1'); } + // method2: function() { console.log('a2'); } + // }; + // var b = { + // method1: function() { console.log('b1'); } + // }; + // delegateMethod(a, b, "method1"); + // delegateMethod(a, b, "method2"); + // a.method1(); + // a.method2(); + // + // The output would be "b1", "a2". + function delegateMethod(delegator, delegatee, methodName) { + var inherited = delegator[methodName]; + delegator[methodName] = function() { + var target = delegatee; + var method = delegatee[methodName]; + + // The method doesn't exist on the delegatee. Instead, + // call the method on the delegator, if it exists. + if (!method) { + target = delegator; + method = inherited; + } + + if (method) { + return method.apply(target, arguments); + } + }; + } + + // Implement a vague facsimilie of jQuery's data method + function elementData(el, name, value) { + if (arguments.length == 2) { + return el["htmlwidget_data_" + name]; + } else if (arguments.length == 3) { + el["htmlwidget_data_" + name] = value; + return el; + } else { + throw new Error("Wrong number of arguments for elementData: " + + arguments.length); + } + } + + // http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex + function escapeRegExp(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + } + + function hasClass(el, className) { + var re = new RegExp("\\b" + escapeRegExp(className) + "\\b"); + return re.test(el.className); + } + + // elements - array (or array-like object) of HTML elements + // className - class name to test for + // include - if true, only return elements with given className; + // if false, only return elements *without* given className + function filterByClass(elements, className, include) { + var results = []; + for (var i = 0; i < elements.length; i++) { + if (hasClass(elements[i], className) == include) + results.push(elements[i]); + } + return results; + } + + function on(obj, eventName, func) { + if (obj.addEventListener) { + obj.addEventListener(eventName, func, false); + } else if (obj.attachEvent) { + obj.attachEvent(eventName, func); + } + } + + function off(obj, eventName, func) { + if (obj.removeEventListener) + obj.removeEventListener(eventName, func, false); + else if (obj.detachEvent) { + obj.detachEvent(eventName, func); + } + } + + // Translate array of values to top/right/bottom/left, as usual with + // the "padding" CSS property + // https://developer.mozilla.org/en-US/docs/Web/CSS/padding + function unpackPadding(value) { + if (typeof(value) === "number") + value = [value]; + if (value.length === 1) { + return {top: value[0], right: value[0], bottom: value[0], left: value[0]}; + } + if (value.length === 2) { + return {top: value[0], right: value[1], bottom: value[0], left: value[1]}; + } + if (value.length === 3) { + return {top: value[0], right: value[1], bottom: value[2], left: value[1]}; + } + if (value.length === 4) { + return {top: value[0], right: value[1], bottom: value[2], left: value[3]}; + } + } + + // Convert an unpacked padding object to a CSS value + function paddingToCss(paddingObj) { + return paddingObj.top + "px " + paddingObj.right + "px " + paddingObj.bottom + "px " + paddingObj.left + "px"; + } + + // Makes a number suitable for CSS + function px(x) { + if (typeof(x) === "number") + return x + "px"; + else + return x; + } + + // Retrieves runtime widget sizing information for an element. + // The return value is either null, or an object with fill, padding, + // defaultWidth, defaultHeight fields. + function sizingPolicy(el) { + var sizingEl = document.querySelector("script[data-for='" + el.id + "'][type='application/htmlwidget-sizing']"); + if (!sizingEl) + return null; + var sp = JSON.parse(sizingEl.textContent || sizingEl.text || "{}"); + if (viewerMode) { + return sp.viewer; + } else { + return sp.browser; + } + } + + // @param tasks Array of strings (or falsy value, in which case no-op). + // Each element must be a valid JavaScript expression that yields a + // function. Or, can be an array of objects with "code" and "data" + // properties; in this case, the "code" property should be a string + // of JS that's an expr that yields a function, and "data" should be + // an object that will be added as an additional argument when that + // function is called. + // @param target The object that will be "this" for each function + // execution. + // @param args Array of arguments to be passed to the functions. (The + // same arguments will be passed to all functions.) + function evalAndRun(tasks, target, args) { + if (tasks) { + forEach(tasks, function(task) { + var theseArgs = args; + if (typeof(task) === "object") { + theseArgs = theseArgs.concat([task.data]); + task = task.code; + } + var taskFunc = tryEval(task); + if (typeof(taskFunc) !== "function") { + throw new Error("Task must be a function! Source:\n" + task); + } + taskFunc.apply(target, theseArgs); + }); + } + } + + // Attempt eval() both with and without enclosing in parentheses. + // Note that enclosing coerces a function declaration into + // an expression that eval() can parse + // (otherwise, a SyntaxError is thrown) + function tryEval(code) { + var result = null; + try { + result = eval("(" + code + ")"); + } catch(error) { + if (!(error instanceof SyntaxError)) { + throw error; + } + try { + result = eval(code); + } catch(e) { + if (e instanceof SyntaxError) { + throw error; + } else { + throw e; + } + } + } + return result; + } + + function initSizing(el) { + var sizing = sizingPolicy(el); + if (!sizing) + return; + + var cel = document.getElementById("htmlwidget_container"); + if (!cel) + return; + + if (typeof(sizing.padding) !== "undefined") { + document.body.style.margin = "0"; + document.body.style.padding = paddingToCss(unpackPadding(sizing.padding)); + } + + if (sizing.fill) { + document.body.style.overflow = "hidden"; + document.body.style.width = "100%"; + document.body.style.height = "100%"; + document.documentElement.style.width = "100%"; + document.documentElement.style.height = "100%"; + cel.style.position = "absolute"; + var pad = unpackPadding(sizing.padding); + cel.style.top = pad.top + "px"; + cel.style.right = pad.right + "px"; + cel.style.bottom = pad.bottom + "px"; + cel.style.left = pad.left + "px"; + el.style.width = "100%"; + el.style.height = "100%"; + + return { + getWidth: function() { return cel.getBoundingClientRect().width; }, + getHeight: function() { return cel.getBoundingClientRect().height; } + }; + + } else { + el.style.width = px(sizing.width); + el.style.height = px(sizing.height); + + return { + getWidth: function() { return cel.getBoundingClientRect().width; }, + getHeight: function() { return cel.getBoundingClientRect().height; } + }; + } + } + + // Default implementations for methods + var defaults = { + find: function(scope) { + return querySelectorAll(scope, "." + this.name); + }, + renderError: function(el, err) { + var $el = $(el); + + this.clearError(el); + + // Add all these error classes, as Shiny does + var errClass = "shiny-output-error"; + if (err.type !== null) { + // use the classes of the error condition as CSS class names + errClass = errClass + " " + $.map(asArray(err.type), function(type) { + return errClass + "-" + type; + }).join(" "); + } + errClass = errClass + " htmlwidgets-error"; + + // Is el inline or block? If inline or inline-block, just display:none it + // and add an inline error. + var display = $el.css("display"); + $el.data("restore-display-mode", display); + + if (display === "inline" || display === "inline-block") { + $el.hide(); + if (err.message !== "") { + var errorSpan = $("").addClass(errClass); + errorSpan.text(err.message); + $el.after(errorSpan); + } + } else if (display === "block") { + // If block, add an error just after the el, set visibility:none on the + // el, and position the error to be on top of the el. + // Mark it with a unique ID and CSS class so we can remove it later. + $el.css("visibility", "hidden"); + if (err.message !== "") { + var errorDiv = $("
    ").addClass(errClass).css("position", "absolute") + .css("top", el.offsetTop) + .css("left", el.offsetLeft) + // setting width can push out the page size, forcing otherwise + // unnecessary scrollbars to appear and making it impossible for + // the element to shrink; so use max-width instead + .css("maxWidth", el.offsetWidth) + .css("height", el.offsetHeight); + errorDiv.text(err.message); + $el.after(errorDiv); + + // Really dumb way to keep the size/position of the error in sync with + // the parent element as the window is resized or whatever. + var intId = setInterval(function() { + if (!errorDiv[0].parentElement) { + clearInterval(intId); + return; + } + errorDiv + .css("top", el.offsetTop) + .css("left", el.offsetLeft) + .css("maxWidth", el.offsetWidth) + .css("height", el.offsetHeight); + }, 500); + } + } + }, + clearError: function(el) { + var $el = $(el); + var display = $el.data("restore-display-mode"); + $el.data("restore-display-mode", null); + + if (display === "inline" || display === "inline-block") { + if (display) + $el.css("display", display); + $(el.nextSibling).filter(".htmlwidgets-error").remove(); + } else if (display === "block"){ + $el.css("visibility", "inherit"); + $(el.nextSibling).filter(".htmlwidgets-error").remove(); + } + }, + sizing: {} + }; + + // Called by widget bindings to register a new type of widget. The definition + // object can contain the following properties: + // - name (required) - A string indicating the binding name, which will be + // used by default as the CSS classname to look for. + // - initialize (optional) - A function(el) that will be called once per + // widget element; if a value is returned, it will be passed as the third + // value to renderValue. + // - renderValue (required) - A function(el, data, initValue) that will be + // called with data. Static contexts will cause this to be called once per + // element; Shiny apps will cause this to be called multiple times per + // element, as the data changes. + window.HTMLWidgets.widget = function(definition) { + if (!definition.name) { + throw new Error("Widget must have a name"); + } + if (!definition.type) { + throw new Error("Widget must have a type"); + } + // Currently we only support output widgets + if (definition.type !== "output") { + throw new Error("Unrecognized widget type '" + definition.type + "'"); + } + // TODO: Verify that .name is a valid CSS classname + + // Support new-style instance-bound definitions. Old-style class-bound + // definitions have one widget "object" per widget per type/class of + // widget; the renderValue and resize methods on such widget objects + // take el and instance arguments, because the widget object can't + // store them. New-style instance-bound definitions have one widget + // object per widget instance; the definition that's passed in doesn't + // provide renderValue or resize methods at all, just the single method + // factory(el, width, height) + // which returns an object that has renderValue(x) and resize(w, h). + // This enables a far more natural programming style for the widget + // author, who can store per-instance state using either OO-style + // instance fields or functional-style closure variables (I guess this + // is in contrast to what can only be called C-style pseudo-OO which is + // what we required before). + if (definition.factory) { + definition = createLegacyDefinitionAdapter(definition); + } + + if (!definition.renderValue) { + throw new Error("Widget must have a renderValue function"); + } + + // For static rendering (non-Shiny), use a simple widget registration + // scheme. We also use this scheme for Shiny apps/documents that also + // contain static widgets. + window.HTMLWidgets.widgets = window.HTMLWidgets.widgets || []; + // Merge defaults into the definition; don't mutate the original definition. + var staticBinding = extend({}, defaults, definition); + overrideMethod(staticBinding, "find", function(superfunc) { + return function(scope) { + var results = superfunc(scope); + // Filter out Shiny outputs, we only want the static kind + return filterByClass(results, "html-widget-output", false); + }; + }); + window.HTMLWidgets.widgets.push(staticBinding); + + if (shinyMode) { + // Shiny is running. Register the definition with an output binding. + // The definition itself will not be the output binding, instead + // we will make an output binding object that delegates to the + // definition. This is because we foolishly used the same method + // name (renderValue) for htmlwidgets definition and Shiny bindings + // but they actually have quite different semantics (the Shiny + // bindings receive data that includes lots of metadata that it + // strips off before calling htmlwidgets renderValue). We can't + // just ignore the difference because in some widgets it's helpful + // to call this.renderValue() from inside of resize(), and if + // we're not delegating, then that call will go to the Shiny + // version instead of the htmlwidgets version. + + // Merge defaults with definition, without mutating either. + var bindingDef = extend({}, defaults, definition); + + // This object will be our actual Shiny binding. + var shinyBinding = new Shiny.OutputBinding(); + + // With a few exceptions, we'll want to simply use the bindingDef's + // version of methods if they are available, otherwise fall back to + // Shiny's defaults. NOTE: If Shiny's output bindings gain additional + // methods in the future, and we want them to be overrideable by + // HTMLWidget binding definitions, then we'll need to add them to this + // list. + delegateMethod(shinyBinding, bindingDef, "getId"); + delegateMethod(shinyBinding, bindingDef, "onValueChange"); + delegateMethod(shinyBinding, bindingDef, "onValueError"); + delegateMethod(shinyBinding, bindingDef, "renderError"); + delegateMethod(shinyBinding, bindingDef, "clearError"); + delegateMethod(shinyBinding, bindingDef, "showProgress"); + + // The find, renderValue, and resize are handled differently, because we + // want to actually decorate the behavior of the bindingDef methods. + + shinyBinding.find = function(scope) { + var results = bindingDef.find(scope); + + // Only return elements that are Shiny outputs, not static ones + var dynamicResults = results.filter(".html-widget-output"); + + // It's possible that whatever caused Shiny to think there might be + // new dynamic outputs, also caused there to be new static outputs. + // Since there might be lots of different htmlwidgets bindings, we + // schedule execution for later--no need to staticRender multiple + // times. + if (results.length !== dynamicResults.length) + scheduleStaticRender(); + + return dynamicResults; + }; + + // Wrap renderValue to handle initialization, which unfortunately isn't + // supported natively by Shiny at the time of this writing. + + shinyBinding.renderValue = function(el, data) { + Shiny.renderDependencies(data.deps); + // Resolve strings marked as javascript literals to objects + if (!(data.evals instanceof Array)) data.evals = [data.evals]; + for (var i = 0; data.evals && i < data.evals.length; i++) { + window.HTMLWidgets.evaluateStringMember(data.x, data.evals[i]); + } + if (!bindingDef.renderOnNullValue) { + if (data.x === null) { + el.style.visibility = "hidden"; + return; + } else { + el.style.visibility = "inherit"; + } + } + if (!elementData(el, "initialized")) { + initSizing(el); + + elementData(el, "initialized", true); + if (bindingDef.initialize) { + var rect = el.getBoundingClientRect(); + var result = bindingDef.initialize(el, rect.width, rect.height); + elementData(el, "init_result", result); + } + } + bindingDef.renderValue(el, data.x, elementData(el, "init_result")); + evalAndRun(data.jsHooks.render, elementData(el, "init_result"), [el, data.x]); + }; + + // Only override resize if bindingDef implements it + if (bindingDef.resize) { + shinyBinding.resize = function(el, width, height) { + // Shiny can call resize before initialize/renderValue have been + // called, which doesn't make sense for widgets. + if (elementData(el, "initialized")) { + bindingDef.resize(el, width, height, elementData(el, "init_result")); + } + }; + } + + Shiny.outputBindings.register(shinyBinding, bindingDef.name); + } + }; + + var scheduleStaticRenderTimerId = null; + function scheduleStaticRender() { + if (!scheduleStaticRenderTimerId) { + scheduleStaticRenderTimerId = setTimeout(function() { + scheduleStaticRenderTimerId = null; + window.HTMLWidgets.staticRender(); + }, 1); + } + } + + // Render static widgets after the document finishes loading + // Statically render all elements that are of this widget's class + window.HTMLWidgets.staticRender = function() { + var bindings = window.HTMLWidgets.widgets || []; + forEach(bindings, function(binding) { + var matches = binding.find(document.documentElement); + forEach(matches, function(el) { + var sizeObj = initSizing(el, binding); + + var getSize = function(el) { + if (sizeObj) { + return {w: sizeObj.getWidth(), h: sizeObj.getHeight()} + } else { + var rect = el.getBoundingClientRect(); + return {w: rect.width, h: rect.height} + } + }; + + if (hasClass(el, "html-widget-static-bound")) + return; + el.className = el.className + " html-widget-static-bound"; + + var initResult; + if (binding.initialize) { + var size = getSize(el); + initResult = binding.initialize(el, size.w, size.h); + elementData(el, "init_result", initResult); + } + + if (binding.resize) { + var lastSize = getSize(el); + var resizeHandler = function(e) { + var size = getSize(el); + if (size.w === 0 && size.h === 0) + return; + if (size.w === lastSize.w && size.h === lastSize.h) + return; + lastSize = size; + binding.resize(el, size.w, size.h, initResult); + }; + + on(window, "resize", resizeHandler); + + // This is needed for cases where we're running in a Shiny + // app, but the widget itself is not a Shiny output, but + // rather a simple static widget. One example of this is + // an rmarkdown document that has runtime:shiny and widget + // that isn't in a render function. Shiny only knows to + // call resize handlers for Shiny outputs, not for static + // widgets, so we do it ourselves. + if (window.jQuery) { + window.jQuery(document).on( + "shown.htmlwidgets shown.bs.tab.htmlwidgets shown.bs.collapse.htmlwidgets", + resizeHandler + ); + window.jQuery(document).on( + "hidden.htmlwidgets hidden.bs.tab.htmlwidgets hidden.bs.collapse.htmlwidgets", + resizeHandler + ); + } + + // This is needed for the specific case of ioslides, which + // flips slides between display:none and display:block. + // Ideally we would not have to have ioslide-specific code + // here, but rather have ioslides raise a generic event, + // but the rmarkdown package just went to CRAN so the + // window to getting that fixed may be long. + if (window.addEventListener) { + // It's OK to limit this to window.addEventListener + // browsers because ioslides itself only supports + // such browsers. + on(document, "slideenter", resizeHandler); + on(document, "slideleave", resizeHandler); + } + } + + var scriptData = document.querySelector("script[data-for='" + el.id + "'][type='application/json']"); + if (scriptData) { + var data = JSON.parse(scriptData.textContent || scriptData.text); + // Resolve strings marked as javascript literals to objects + if (!(data.evals instanceof Array)) data.evals = [data.evals]; + for (var k = 0; data.evals && k < data.evals.length; k++) { + window.HTMLWidgets.evaluateStringMember(data.x, data.evals[k]); + } + binding.renderValue(el, data.x, initResult); + evalAndRun(data.jsHooks.render, initResult, [el, data.x]); + } + }); + }); + + invokePostRenderHandlers(); + } + + + function has_jQuery3() { + if (!window.jQuery) { + return false; + } + var $version = window.jQuery.fn.jquery; + var $major_version = parseInt($version.split(".")[0]); + return $major_version >= 3; + } + + /* + / Shiny 1.4 bumped jQuery from 1.x to 3.x which means jQuery's + / on-ready handler (i.e., $(fn)) is now asyncronous (i.e., it now + / really means $(setTimeout(fn)). + / https://jquery.com/upgrade-guide/3.0/#breaking-change-document-ready-handlers-are-now-asynchronous + / + / Since Shiny uses $() to schedule initShiny, shiny>=1.4 calls initShiny + / one tick later than it did before, which means staticRender() is + / called renderValue() earlier than (advanced) widget authors might be expecting. + / https://github.com/rstudio/shiny/issues/2630 + / + / For a concrete example, leaflet has some methods (e.g., updateBounds) + / which reference Shiny methods registered in initShiny (e.g., setInputValue). + / Since leaflet is privy to this life-cycle, it knows to use setTimeout() to + / delay execution of those methods (until Shiny methods are ready) + / https://github.com/rstudio/leaflet/blob/18ec981/javascript/src/index.js#L266-L268 + / + / Ideally widget authors wouldn't need to use this setTimeout() hack that + / leaflet uses to call Shiny methods on a staticRender(). In the long run, + / the logic initShiny should be broken up so that method registration happens + / right away, but binding happens later. + */ + function maybeStaticRenderLater() { + if (shinyMode && has_jQuery3()) { + window.jQuery(window.HTMLWidgets.staticRender); + } else { + window.HTMLWidgets.staticRender(); + } + } + + if (document.addEventListener) { + document.addEventListener("DOMContentLoaded", function() { + document.removeEventListener("DOMContentLoaded", arguments.callee, false); + maybeStaticRenderLater(); + }, false); + } else if (document.attachEvent) { + document.attachEvent("onreadystatechange", function() { + if (document.readyState === "complete") { + document.detachEvent("onreadystatechange", arguments.callee); + maybeStaticRenderLater(); + } + }); + } + + + window.HTMLWidgets.getAttachmentUrl = function(depname, key) { + // If no key, default to the first item + if (typeof(key) === "undefined") + key = 1; + + var link = document.getElementById(depname + "-" + key + "-attachment"); + if (!link) { + throw new Error("Attachment " + depname + "/" + key + " not found in document"); + } + return link.getAttribute("href"); + }; + + window.HTMLWidgets.dataframeToD3 = function(df) { + var names = []; + var length; + for (var name in df) { + if (df.hasOwnProperty(name)) + names.push(name); + if (typeof(df[name]) !== "object" || typeof(df[name].length) === "undefined") { + throw new Error("All fields must be arrays"); + } else if (typeof(length) !== "undefined" && length !== df[name].length) { + throw new Error("All fields must be arrays of the same length"); + } + length = df[name].length; + } + var results = []; + var item; + for (var row = 0; row < length; row++) { + item = {}; + for (var col = 0; col < names.length; col++) { + item[names[col]] = df[names[col]][row]; + } + results.push(item); + } + return results; + }; + + window.HTMLWidgets.transposeArray2D = function(array) { + if (array.length === 0) return array; + var newArray = array[0].map(function(col, i) { + return array.map(function(row) { + return row[i] + }) + }); + return newArray; + }; + // Split value at splitChar, but allow splitChar to be escaped + // using escapeChar. Any other characters escaped by escapeChar + // will be included as usual (including escapeChar itself). + function splitWithEscape(value, splitChar, escapeChar) { + var results = []; + var escapeMode = false; + var currentResult = ""; + for (var pos = 0; pos < value.length; pos++) { + if (!escapeMode) { + if (value[pos] === splitChar) { + results.push(currentResult); + currentResult = ""; + } else if (value[pos] === escapeChar) { + escapeMode = true; + } else { + currentResult += value[pos]; + } + } else { + currentResult += value[pos]; + escapeMode = false; + } + } + if (currentResult !== "") { + results.push(currentResult); + } + return results; + } + // Function authored by Yihui/JJ Allaire + window.HTMLWidgets.evaluateStringMember = function(o, member) { + var parts = splitWithEscape(member, '.', '\\'); + for (var i = 0, l = parts.length; i < l; i++) { + var part = parts[i]; + // part may be a character or 'numeric' member name + if (o !== null && typeof o === "object" && part in o) { + if (i == (l - 1)) { // if we are at the end of the line then evalulate + if (typeof o[part] === "string") + o[part] = tryEval(o[part]); + } else { // otherwise continue to next embedded object + o = o[part]; + } + } + } + }; + + // Retrieve the HTMLWidget instance (i.e. the return value of an + // HTMLWidget binding's initialize() or factory() function) + // associated with an element, or null if none. + window.HTMLWidgets.getInstance = function(el) { + return elementData(el, "init_result"); + }; + + // Finds the first element in the scope that matches the selector, + // and returns the HTMLWidget instance (i.e. the return value of + // an HTMLWidget binding's initialize() or factory() function) + // associated with that element, if any. If no element matches the + // selector, or the first matching element has no HTMLWidget + // instance associated with it, then null is returned. + // + // The scope argument is optional, and defaults to window.document. + window.HTMLWidgets.find = function(scope, selector) { + if (arguments.length == 1) { + selector = scope; + scope = document; + } + + var el = scope.querySelector(selector); + if (el === null) { + return null; + } else { + return window.HTMLWidgets.getInstance(el); + } + }; + + // Finds all elements in the scope that match the selector, and + // returns the HTMLWidget instances (i.e. the return values of + // an HTMLWidget binding's initialize() or factory() function) + // associated with the elements, in an array. If elements that + // match the selector don't have an associated HTMLWidget + // instance, the returned array will contain nulls. + // + // The scope argument is optional, and defaults to window.document. + window.HTMLWidgets.findAll = function(scope, selector) { + if (arguments.length == 1) { + selector = scope; + scope = document; + } + + var nodes = scope.querySelectorAll(selector); + var results = []; + for (var i = 0; i < nodes.length; i++) { + results.push(window.HTMLWidgets.getInstance(nodes[i])); + } + return results; + }; + + var postRenderHandlers = []; + function invokePostRenderHandlers() { + while (postRenderHandlers.length) { + var handler = postRenderHandlers.shift(); + if (handler) { + handler(); + } + } + } + + // Register the given callback function to be invoked after the + // next time static widgets are rendered. + window.HTMLWidgets.addPostRenderHandler = function(callback) { + postRenderHandlers.push(callback); + }; + + // Takes a new-style instance-bound definition, and returns an + // old-style class-bound definition. This saves us from having + // to rewrite all the logic in this file to accomodate both + // types of definitions. + function createLegacyDefinitionAdapter(defn) { + var result = { + name: defn.name, + type: defn.type, + initialize: function(el, width, height) { + return defn.factory(el, width, height); + }, + renderValue: function(el, x, instance) { + return instance.renderValue(x); + }, + resize: function(el, width, height, instance) { + return instance.resize(width, height); + } + }; + + if (defn.find) + result.find = defn.find; + if (defn.renderError) + result.renderError = defn.renderError; + if (defn.clearError) + result.clearError = defn.clearError; + + return result; + } +})(); diff --git a/vignettes/images/Vis_3D_files/jquery-3.5.1/jquery-AUTHORS.txt b/vignettes/images/Vis_3D_files/jquery-3.5.1/jquery-AUTHORS.txt new file mode 100644 index 0000000..06df1a5 --- /dev/null +++ b/vignettes/images/Vis_3D_files/jquery-3.5.1/jquery-AUTHORS.txt @@ -0,0 +1,357 @@ +Authors ordered by first contribution. + +John Resig +Gilles van den Hoven +Michael Geary +Stefan Petre +Yehuda Katz +Corey Jewett +Klaus Hartl +Franck Marcia +Jörn Zaefferer +Paul Bakaus +Brandon Aaron +Mike Alsup +Dave Methvin +Ed Engelhardt +Sean Catchpole +Paul Mclanahan +David Serduke +Richard D. Worth +Scott González +Ariel Flesler +Cheah Chu Yeow +Andrew Chalkley +Fabio Buffoni +Stefan Bauckmeier  +Jon Evans +TJ Holowaychuk +Riccardo De Agostini +Michael Bensoussan +Louis-Rémi Babé +Robert Katić +Damian Janowski +Anton Kovalyov +Dušan B. Jovanovic +Earle Castledine +Rich Dougherty +Kim Dalsgaard +Andrea Giammarchi +Fabian Jakobs +Mark Gibson +Karl Swedberg +Justin Meyer +Ben Alman +James Padolsey +David Petersen +Batiste Bieler +Jake Archibald +Alexander Farkas +Filipe Fortes +Rick Waldron +Neeraj Singh +Paul Irish +Iraê Carvalho +Matt Curry +Michael Monteleone +Noah Sloan +Tom Viner +J. Ryan Stinnett +Douglas Neiner +Adam J. Sontag +Heungsub Lee +Dave Reed +Carl Fürstenberg +Jacob Wright +Ralph Whitbeck +unknown +temp01 +Colin Snover +Jared Grippe +Ryan W Tenney +Alex Sexton +Pinhook +Ron Otten +Jephte Clain +Anton Matzneller +Dan Heberden +Henri Wiechers +Russell Holbrook +Julian Aubourg +Gianni Alessandro Chiappetta +Scott Jehl +James Burke +Jonas Pfenniger +Xavi Ramirez +Sylvester Keil +Brandon Sterne +Mathias Bynens +Lee Carpenter +Timmy Willison <4timmywil@gmail.com> +Corey Frang +Digitalxero +David Murdoch +Josh Varner +Charles McNulty +Jordan Boesch +Jess Thrysoee +Michael Murray +Alexis Abril +Rob Morgan +John Firebaugh +Sam Bisbee +Gilmore Davidson +Brian Brennan +Xavier Montillet +Daniel Pihlstrom +Sahab Yazdani +avaly +Scott Hughes +Mike Sherov +Greg Hazel +Schalk Neethling +Denis Knauf +Timo Tijhof +Steen Nielsen +Anton Ryzhov +Shi Chuan +Matt Mueller +Berker Peksag +Toby Brain +Justin +Daniel Herman +Oleg Gaidarenko +Rock Hymas +Richard Gibson +Rafaël Blais Masson +cmc3cn <59194618@qq.com> +Joe Presbrey +Sindre Sorhus +Arne de Bree +Vladislav Zarakovsky +Andrew E Monat +Oskari +Joao Henrique de Andrade Bruni +tsinha +Dominik D. Geyer +Matt Farmer +Trey Hunner +Jason Moon +Jeffery To +Kris Borchers +Vladimir Zhuravlev +Jacob Thornton +Chad Killingsworth +Vitya Muhachev +Nowres Rafid +David Benjamin +Alan Plum +Uri Gilad +Chris Faulkner +Marcel Greter +Elijah Manor +Daniel Chatfield +Daniel Gálvez +Nikita Govorov +Wesley Walser +Mike Pennisi +Matthias Jäggli +Devin Cooper +Markus Staab +Dave Riddle +Callum Macrae +Jonathan Sampson +Benjamin Truyman +Jay Merrifield +James Huston +Sai Lung Wong +Erick Ruiz de Chávez +David Bonner +Allen J Schmidt Jr +Akintayo Akinwunmi +MORGAN +Ismail Khair +Carl Danley +Mike Petrovich +Greg Lavallee +Tom H Fuertes +Roland Eckl +Yiming He +David Fox +Bennett Sorbo +Paul Ramos +Rod Vagg +Sebastian Burkhard +Zachary Adam Kaplan +Adam Coulombe +nanto_vi +nanto +Danil Somsikov +Ryunosuke SATO +Diego Tres +Jean Boussier +Andrew Plummer +Mark Raddatz +Pascal Borreli +Isaac Z. Schlueter +Karl Sieburg +Nguyen Phuc Lam +Dmitry Gusev +Steven Benner +Li Xudong +Michał Gołębiowski-Owczarek +Renato Oliveira dos Santos +Frederic Junod +Tom H Fuertes +Mitch Foley +ros3cin +Kyle Robinson Young +John Paul +Jason Bedard +Chris Talkington +Eddie Monge +Terry Jones +Jason Merino +Dan Burzo +Jeremy Dunck +Chris Price +Guy Bedford +njhamann +Goare Mao +Amey Sakhadeo +Mike Sidorov +Anthony Ryan +Lihan Li +George Kats +Dongseok Paeng +Ronny Springer +Ilya Kantor +Marian Sollmann +Chris Antaki +David Hong +Jakob Stoeck +Christopher Jones +Forbes Lindesay +S. Andrew Sheppard +Leonardo Balter +Rodrigo Rosenfeld Rosas +Daniel Husar +Philip Jägenstedt +John Hoven +Roman Reiß +Benjy Cui +Christian Kosmowski +David Corbacho +Liang Peng +TJ VanToll +Aurelio De Rosa +Senya Pugach +Dan Hart +Nazar Mokrynskyi +Benjamin Tan +Amit Merchant +Jason Bedard +Veaceslav Grimalschi +Richard McDaniel +Arthur Verschaeve +Shivaji Varma +Ben Toews +Bin Xin +Neftaly Hernandez +T.J. Crowder +Nicolas HENRY +Frederic Hemberger +Victor Homyakov +Aditya Raghavan +Anne-Gaelle Colom +Leonardo Braga +George Mauer +Stephen Edgar +Thomas Tortorini +Jörn Wagner +Jon Hester +Colin Frick +Winston Howes +Alexander O'Mara +Chris Rebert +Bastian Buchholz +Mu Haibao +Calvin Metcalf +Arthur Stolyar +Gabriel Schulhof +Gilad Peleg +Julian Alexander Murillo +Kevin Kirsche +Martin Naumann +Yongwoo Jeon +John-David Dalton +Marek Lewandowski +Bruno Pérel +Daniel Nill +Reed Loden +Sean Henderson +Gary Ye +Richard Kraaijenhagen +Connor Atherton +Christian Grete +Tom von Clef +Liza Ramo +Joelle Fleurantin +Steve Mao +Jon Dufresne +Jae Sung Park +Josh Soref +Saptak Sengupta +Henry Wong +Jun Sun +Martijn W. van der Lee +Devin Wilson +Damian Senn +Zack Hall +Vitaliy Terziev +Todor Prikumov +Bernhard M. Wiedemann +Jha Naman +Alexander Lisianoi +William Robinet +Joe Trumbull +Alexander K +Ralin Chimev +Felipe Sateler +Christophe Tafani-Dereeper +Manoj Kumar +David Broder-Rodgers +Alex Louden +Alex Padilla +karan-96 +南漂一卒 +Erik Lax +Boom Lee +Andreas Solleder +Pierre Spring +Shashanka Nataraj +CDAGaming +Matan Kotler-Berkowitz <205matan@gmail.com> +Jordan Beland +Henry Zhu +Nilton Cesar +basil.belokon +Andrey Meshkov +tmybr11 +Luis Emilio Velasco Sanchez +Ed S +Bert Zhang +Sébastien Règne +wartmanm <3869625+wartmanm@users.noreply.github.com> +Siddharth Dungarwal +abnud1 +Andrei Fangli +Marja Hölttä +buddh4 +Hoang +Wonseop Kim +Pat O'Callaghan +JuanMa Ruiz +Ahmed.S.ElAfifi +Sean Robinson +Christian Oliff diff --git a/vignettes/images/Vis_3D_files/jquery-3.5.1/jquery.js b/vignettes/images/Vis_3D_files/jquery-3.5.1/jquery.js new file mode 100644 index 0000000..5093733 --- /dev/null +++ b/vignettes/images/Vis_3D_files/jquery-3.5.1/jquery.js @@ -0,0 +1,10872 @@ +/*! + * jQuery JavaScript Library v3.5.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2020-05-04T22:49Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var flat = arr.flat ? function( array ) { + return arr.flat.call( array ); +} : function( array ) { + return arr.concat.apply( [], array ); +}; + + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + return typeof obj === "function" && typeof obj.nodeType !== "number"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + +var document = window.document; + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.5.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return flat( ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.5 + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://js.foundation/ + * + * Date: 2020-03-14 + */ +( function( window ) { +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ( {} ).hasOwnProperty, + arr = [], + pop = arr.pop, + pushNative = arr.push, + push = arr.push, + slice = arr.slice, + + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[ i ] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + + "ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] + // or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rhtml = /HTML$/i, + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + return nonHex ? + + // Strip the backslash prefix from a non-hex escape sequence + nonHex : + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android<4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + + // Can't trust NodeList.length + while ( ( target[ j++ ] = els[ i++ ] ) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && + + // Support: IE 8 only + // Exclude object elements + ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + if ( newContext !== context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + " " ] = value ); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement( "fieldset" ); + + try { + return !!fn( el ); + } catch ( e ) { + return false; + } finally { + + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split( "|" ), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[ i ] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( ( cur = cur.nextSibling ) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return ( name === "input" || name === "button" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction( function( argument ) { + argument = +argument; + return markFunction( function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); + } + } + } ); + } ); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + var namespace = elem.namespaceURI, + docElem = ( elem.ownerDocument || elem ).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, + // Safari 4 - 5 only, Opera <=11.6 - 12.x only + // IE/Edge & older browsers don't support the :scope pseudo-class. + // Support: Safari 6.0 only + // Safari 6.0 supports :scope but it's an alias of :root there. + support.scope = assert( function( el ) { + docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); + return typeof el.querySelectorAll !== "undefined" && + !el.querySelectorAll( ":scope fieldset div" ).length; + } ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert( function( el ) { + el.className = "i"; + return !el.getAttribute( "className" ); + } ); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert( function( el ) { + el.appendChild( document.createComment( "" ) ); + return !el.getElementsByTagName( "*" ).length; + } ); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + } ); + + // ID filter and find + if ( support.getById ) { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }; + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode( "id" ); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find[ "TAG" ] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } + + // Support: Firefox <=3.6 - 5 only + // Old Firefox doesn't throw on a badly-escaped identifier. + el.querySelectorAll( "\\\f" ); + rbuggyQSA.push( "[\\r\\n\\f]" ); + } ); + + assert( function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll( "[name=d]" ).length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: Opera 10 - 11 only + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll( "*,:x" ); + rbuggyQSA.push( ",.*:" ); + } ); + } + + if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector ) ) ) ) { + + assert( function( el ) { + + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + } ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); + } : + function( a, b ) { + if ( b ) { + while ( ( b = b.parentNode ) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { + + // Choose the first element that is related to our preferred document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a == document || a.ownerDocument == preferredDoc && + contains( preferredDoc, a ) ) { + return -1; + } + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b == document || b.ownerDocument == preferredDoc && + contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + return a == document ? -1 : + b == document ? 1 : + /* eslint-enable eqeqeq */ + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( ( cur = cur.parentNode ) ) { + ap.unshift( cur ); + } + cur = b; + while ( ( cur = cur.parentNode ) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[ i ] === bp[ i ] ) { + i++; + } + + return i ? + + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[ i ], bp[ i ] ) : + + // Otherwise nodes in our document sort first + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + ap[ i ] == preferredDoc ? -1 : + bp[ i ] == preferredDoc ? 1 : + /* eslint-enable eqeqeq */ + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( support.matchesSelector && documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( elem.ownerDocument || elem ) != document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[ 1 ] = match[ 1 ].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || + match[ 5 ] || "" ).replace( runescape, funescape ); + + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + ( pattern = new RegExp( "(^|" + whitespace + + ")" + className + "(" + whitespace + "|$)" ) ) && classCache( + className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + /* eslint-disable max-len */ + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + /* eslint-enable max-len */ + + }; + }, + + "CHILD": function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction( function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[ i ] ); + seed[ idx ] = !( matches[ idx ] = matched[ i ] ); + } + } ) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + "not": markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element (issue #299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + "has": markFunction( function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + } ), + + "contains": markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && + ( !document.hasFocus || document.hasFocus() ) && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return ( nodeName === "input" && !!elem.checked ) || + ( nodeName === "option" && !!elem.selected ); + }, + + "selected": function( elem ) { + + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos[ "empty" ]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( ( attr = elem.getAttribute( "type" ) ) == null || + attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo( function() { + return [ 0 ]; + } ), + + "last": createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + "even": createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "odd": createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? + argument + length : + argument > length ? + length : + argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rcombinators.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrim, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || + ( outerCache[ elem.uniqueID ] = {} ); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = uniqueCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( + selector || "*", + context.nodeType ? [ context ] : context, + [] + ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || Expr.relative[ " " ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens + .slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), + len = elems.length; + + if ( outermost ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( + selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) + ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + + context = ( Expr.find[ "ID" ]( token.matches[ 0 ] + .replace( runescape, funescape ), context ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( Expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = Expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + token.matches[ 0 ].replace( runescape, funescape ), + rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || + context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert( function( el ) { + + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert( function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute( "href" ) === "#"; +} ) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + } ); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert( function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +} ) ) { + addHandle( "value", function( elem, _name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + } ); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert( function( el ) { + return el.getAttribute( "disabled" ) == null; +} ) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; + } + } ); +} + +return Sizzle; + +} )( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, _i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, _i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, _i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( elem.contentDocument != null && + + // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( _i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, _key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached( elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // Support: IE <=9 only + // IE <=9 replaces "; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
    " ], + col: [ 2, "", "
    " ], + tr: [ 2, "", "
    " ], + td: [ 3, "", "
    " ], + + _default: [ 0, "", "" ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: IE <=9 only +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = Object.create( null ); + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", returnTrue ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + return result.value; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering the + // native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + delegateType: delegateType + }; +} ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.get( src ); + events = pdataOld.events; + + if ( events ) { + dataPriv.remove( dest, "handle events" ); + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = flat( args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + }, doc ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var swap = function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableTrDimensionsVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + }, + + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( "table" ); + tr = document.createElement( "tr" ); + trChild = document.createElement( "div" ); + + table.style.cssText = "position:absolute;left:-11111px"; + tr.style.height = "1px"; + trChild.style.height = "9px"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( name ) { + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +function setPositiveNumber( _elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Support: IE 9 - 11 only + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + if ( ( !support.boxSizingReliable() && isBorderBox || + + // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName( elem, "tr" ) || + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || + + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "gridArea": true, + "gridColumn": true, + "gridColumnEnd": true, + "gridColumnStart": true, + "gridRow": true, + "gridRowEnd": true, + "gridRowStart": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( _i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( + dataPriv.get( cur, "events" ) || Object.create( null ) + )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( _i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Use a noop converter for missing script + if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { + s.converters[ "text script" ] = function() {}; + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( _i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + +jQuery.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + + +jQuery._evalUrl = function( url, options, doc ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options, doc ); + } + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( "