From 9575a4c2cfdf4d72e45c41328baede91e66ea11d Mon Sep 17 00:00:00 2001 From: xl-mini Date: Tue, 26 May 2026 06:28:38 -0700 Subject: [PATCH 1/2] revise code for library report diagram --- code/002-library-report.R | 239 +++++++--- data_raw/OS-Inventory-list-20260518.xlsx | Bin 12256 -> 12647 bytes images/library-report-gray.svg | 574 +++++++++++++++++++++++ images/library-report-light.svg | 574 +++++++++++++++++++++++ images/library-report.svg | 564 ---------------------- 5 files changed, 1309 insertions(+), 642 deletions(-) create mode 100644 images/library-report-gray.svg create mode 100644 images/library-report-light.svg delete mode 100644 images/library-report.svg diff --git a/code/002-library-report.R b/code/002-library-report.R index 99a1d2e..8b51ab2 100644 --- a/code/002-library-report.R +++ b/code/002-library-report.R @@ -20,9 +20,12 @@ rm(list = ls()) # clean out environment first inventory <- read_xlsx("data_raw/OS-Inventory-list-20260518.xlsx") glimpse(inventory) +## note, this version of the inventory dataset include a column called `Color` +## it will be used to assign color to chords for the library report -# Wrangle data | OS Domain ---- +# Wrangle data ---- +## OS Domain ---- list_domain <- inventory for (domain in c("Data", "Method", "Source", "Access", "Review", "Education", "Infastructure")) { @@ -51,8 +54,7 @@ pairs_domain <- list_domain %>% pairs_domain - -# Wrangle data | Provider ---- +## Provider ---- list_provider <- inventory for (provider in c("CSD", "DREAM", "R&E", "RDS", "SRC", "T&L", "Materials")) { @@ -78,7 +80,7 @@ pairs_provider -# Wrangle data | Service ---- +## Service ---- list_service <- inventory for (service in c("Carpentries", "Dryad", "DMPTool", "eScholarship", "LibGuide", @@ -108,13 +110,50 @@ pairs_service -# Create pairs dataset ---- -pairs <- rbind(pairs_domain, pairs_provider, pairs_service) %>% +# Create and reorganize pairs dataset ---- +pairs_temp <- rbind(pairs_domain, pairs_provider, pairs_service) %>% arrange(Viz.ID.1, Viz.ID.2) +rm(pairs_domain, pairs_provider, pairs_service) -# Chord diagram | Define categories + colors ---- +pairs_reorg_domain <- pairs_temp %>% + filter(Category.2 == "OS Domains") %>% # all OS Domains are in Category.2 + mutate(Category.Temp = Category.1, Item.Temp = Item.1, Viz.ID.Temp = Viz.ID.1) %>% + select(Category.1 = Category.2, Item.1 = Item.2, Viz.ID.1 = Viz.ID.2, + Category.2 = Category.Temp, Item.2 = Item.Temp, Viz.ID.2 = Viz.ID.Temp) + +pairs_reorg_service1 <- pairs_temp %>% + filter(Category.2 != "OS Domains") %>% # already in pairs_domain_graph + filter(Category.1 == "Services & Programs") + +pairs_reorg_service2 <- pairs_temp %>% + filter(Category.2 != "OS Domains") %>% # already in pairs_domain_graph + filter((Category.1 == "Instruction & Consultation" & Category.2 == "Services & Programs") ) %>% view() + mutate(Category.Temp = Category.1, Item.Temp = Item.1, Viz.ID.Temp = Viz.ID.1) %>% + select(Category.1 = Category.2, Item.1 = Item.2, Viz.ID.1 = Viz.ID.2, + Category.2 = Category.Temp, Item.2 = Item.Temp, Viz.ID.2 = Viz.ID.Temp) + +pairs_reorg_instruction <- pairs_temp %>% + filter(Category.2 != "OS Domains") %>% # already in pairs_domain_graph + filter(Category.1 == "Instruction & Consultation", Category.2 == "Provider") + +pairs_reorg_engagement <- pairs_temp %>% + filter(Category.2 != "OS Domains") %>% # already in pairs_domain_graph + filter(Category.1 == "Engagement & Community") + +## sanity check +nrow(pairs_temp) == nrow(pairs_reorg_domain) + nrow(pairs_reorg_service1) + nrow(pairs_reorg_service2) + + nrow(pairs_reorg_instruction) + nrow(pairs_reorg_engagement) + +# create pairs df for graphing +pairs <- rbind(pairs_reorg_domain, pairs_reorg_service1, pairs_reorg_service2, + pairs_reorg_instruction, pairs_reorg_engagement) %>% + arrange(Viz.ID.1, Viz.ID.2) + + + +# Define categories + colors for chord diagram ---- xlim_df <- inventory %>% group_by(Category) %>% summarize(min = min(Viz.ID) - 1.6, @@ -122,58 +161,111 @@ xlim_df <- inventory %>% xlim_df$Category -sector_colors <- c("OS Domains" = "#003660", - "Provider" = "#09847A", - "Services & Programs" = "#6D7D33", - "Instruction & Consultation" = "#C43424", - "Engagement & Community" = "#FEBC11") - -status_palette <- c("#64B5F6", "#B58CD2", "#D0D2D3") - -list_coded <- inventory %>% - mutate(Status.Color = case_when(Status == "Active" ~ status_palette[1], - Status == "In development" ~ status_palette[2], - Status == "On hold" ~ status_palette[3], - TRUE ~ "white"), - Category.Color = plyr::revalue(Category, sector_colors), - ) - -domain_colors <- tibble( - OS.Viz.ID = 1:7, - OS.Domain = c("Open data", "Open methodology", "Open source", "Open access", - "Open peer review", "Open educational resource", "Open infastructure"), - OS.Color = c("#4E79A770", "#9C6ADE70", "#59A14F70", "#F28E2B70", - "#E1575970", "#EDC94870", "#76B7B270") +sector_colors <- c("OS Domains" = "#DAE6E6", + "Provider" = "#DCD6CC", + "Services & Programs" = "#EDEADF", + "Instruction & Consultation" = "#DCE1E5", + "Engagement & Community" = "#EEF0F2") + +domain_colors_light <- c("Data" = "#00366040", + "Method" = "#FEBC1140", + "Source" = "#047C9140", + "Access" = "#09847A40", + "Review" = "#C9BF9D40", + "Education" = "#6D7D3340", + "Infastructure" = "#EF564540") + +domain_colors_dark <- c("Data" = "#00366080", + "Method" = "#FEBC1180", + "Source" = "#047C9180", + "Access" = "#09847A80", + "Review" = "#C9BF9D80", + "Education" = "#6D7D3380", + "Infastructure" = "#EF564580") + +inventory_graph <- inventory %>% + mutate(Category.Color = plyr::revalue(Category, sector_colors), + Chord.Color = plyr::revalue(Color, domain_colors_light), + Chord.Color.Solid = plyr::revalue(Color, domain_colors_dark)) + +pairs_graph <- pairs %>% + left_join(inventory_graph %>% select(Viz.ID, Chord.Color, Chord.Color.Solid), + by = join_by(Viz.ID.1 == Viz.ID)) + + +# Generate chord diagram (version 1) ---- +## set up svg export +svglite::svglite("images/library-report-light.svg", width = 7, height = 10) + +## initialize +circos.clear() +circos.par(canvas.xlim = c(-1.35, 1.35), canvas.ylim = c(-1.35, 1.35), + gap.after = rep(0, times = length(unique(inventory_graph$Category))), + start.degree = -13) + +circos.initialize(sectors = inventory_graph$Category, + xlim = as.matrix(xlim_df %>% select(min, max))) + +## add items and label +circos.labels(sectors = inventory_graph$Category, x = inventory_graph$Viz.ID, + labels = inventory_graph$Item, side = "outside", + cex = 0.6, padding = 0.0, connection_height = mm_h(0.5)) + +## annotate buckets +circos.trackPlotRegion(ylim = c(0, 1), track.height = 0.06, + panel.fun = function(x, y) { + # obtain cell meta data + sector_name <- get.cell.meta.data("sector.index") + xlim_cell <- CELL_META$xlim + ylim_cell <- CELL_META$ylim + # draw color coding rectangles + circos.rect(xlim_cell[1] + 1.3, ylim_cell[1], xlim_cell[2]-1.3, ylim_cell[2], + col = sector_colors[sector_name], + border = NA) + # add text label + circos.text(mean(xlim_cell), 0.45, labels = sector_name, + facing = "bending.inside", niceFacing = TRUE, + cex = 0.65, col = "grey15", font = 2) + }, + # turn off default grid lines + bg.border = NA, cell.padding = c(0.01, 0, 0, 0) ) -# Chord diagram | Generate visual ---- +## loop around each item to add chord connections +for(i in nrow(pairs_graph):1){ + circos.link(sector.index1 = pairs_graph$Category.1[i], + point1 = c(pairs_graph$Viz.ID.1[i] - 0.26, pairs_graph$Viz.ID.1[i] + 0.26), + sector.index2 = pairs_graph$Category.2[i], + point2 = c(pairs_graph$Viz.ID.2[i] - 0.26, pairs_graph$Viz.ID.2[i] + 0.26), + col = pairs_graph$Chord.Color[i], h.ratio = 0.5, w = 0.8) +} + + +## close the device +dev.off() + + + +# Generate chord diagram (version 2) ---- +## version 2 uses gray as background ## set up svg export -svglite::svglite("images/library-report.svg", width = 13, height = 15) +svglite::svglite("images/library-report-gray.svg", width = 7, height = 10) ## initialize circos.clear() -circos.par(canvas.xlim = c(-1.1, 1.1), canvas.ylim = c(-1.1, 1.1), - gap.after = rep(0, times = length(unique(list_coded$Category))), +circos.par(canvas.xlim = c(-1.35, 1.35), canvas.ylim = c(-1.35, 1.35), + gap.after = rep(0, times = length(unique(inventory_graph$Category))), start.degree = -13) -circos.initialize(sectors = list_coded$Category, +circos.initialize(sectors = inventory_graph$Category, xlim = as.matrix(xlim_df %>% select(min, max))) ## add items and label -circos.labels(sectors = list_coded$Category, x = list_coded$Viz.ID, - labels = list_coded$Item, side = "outside", - cex = 0.62, padding = 0.0, connection_height = mm_h(0.5)) - -## annotate status -circos.track(sectors = list_coded$Category, ylim = c(0, 1), - track.height = 0.04, cell.padding = c(0, 0, 0, 0), bg.border = NA) - -circos.trackPoints(sectors = list_coded$Category, - x = list_coded$Viz.ID, y = rep(0.5, times = nrow(list_coded)), - col = list_coded$Status.Color, - pch = 20, cex = 2) +circos.labels(sectors = inventory_graph$Category, x = inventory_graph$Viz.ID, + labels = inventory_graph$Item, side = "outside", + cex = 0.6, padding = 0.0, connection_height = mm_h(0.5)) ## annotate buckets circos.trackPlotRegion(ylim = c(0, 1), track.height = 0.06, @@ -183,13 +275,13 @@ circos.trackPlotRegion(ylim = c(0, 1), track.height = 0.06, xlim_cell <- CELL_META$xlim ylim_cell <- CELL_META$ylim # draw color coding rectangles - circos.rect(xlim_cell[1] + 1.2, ylim_cell[1], xlim_cell[2]-1.2, ylim_cell[2], + circos.rect(xlim_cell[1] + 1.3, ylim_cell[1], xlim_cell[2]-1.3, ylim_cell[2], col = sector_colors[sector_name], border = NA) # add text label circos.text(mean(xlim_cell), 0.45, labels = sector_name, facing = "bending.inside", niceFacing = TRUE, - cex = 0.8, col = "white", font = 2) + cex = 0.65, col = "grey15", font = 2) }, # turn off default grid lines bg.border = NA, cell.padding = c(0.01, 0, 0, 0) @@ -197,45 +289,36 @@ circos.trackPlotRegion(ylim = c(0, 1), track.height = 0.06, -## add chords to where different OS domains map to -## loop around each OS domain -for (i in 1:nrow(domain_colors)) { - # filter for chord that extend from each domain - pairs_graph <- pairs %>% - filter(Viz.ID.1 == domain_colors$OS.Viz.ID[i] | Viz.ID.2 == domain_colors$OS.Viz.ID[i]) - - # loop around each chord - for(j in 1:nrow(pairs_graph)){ - circos.link(sector.index1 = pairs_graph$Category.1[j], - point1 = c(pairs_graph$Viz.ID.1[j] - 0.26, pairs_graph$Viz.ID.1[j] + 0.26), - sector.index2 = pairs_graph$Category.2[j], - point2 = c(pairs_graph$Viz.ID.2[j] - 0.26, pairs_graph$Viz.ID.2[j] + 0.26), - col = domain_colors$OS.Color[i], h.ratio = 0.5, w = 0.8) - } +## loop around each item to add chord connections +pairs_graph1 <- pairs_graph %>% + filter(Category.1 != "OS Domains") + +for(i in 1:nrow(pairs_graph1)){ + circos.link(sector.index1 = pairs_graph1$Category.1[i], + point1 = c(pairs_graph1$Viz.ID.1[i] - 0.26, pairs_graph1$Viz.ID.1[i] + 0.26), + sector.index2 = pairs_graph1$Category.2[i], + point2 = c(pairs_graph1$Viz.ID.2[i] - 0.26, pairs_graph1$Viz.ID.2[i] + 0.26), + col = "#80808040", h.ratio = 0.5, w = 0.8) } -## add legend -legend( - x = "topleft", - inset = c(0.08, 0.08), - legend = c("Active", "In development", "On hold"), - col = status_palette, - pch = 16, - pt.cex = 1.2, - cex = 0.78, - bty = "o", # draw box - box.lwd = 0.2, # thin border - box.col = "grey55", # border color - title = "Status", - title.font = 2 # bold title -) +pairs_graph2 <- pairs_graph %>% + filter(Category.1 == "OS Domains") + +for(i in 1:nrow(pairs_graph2)){ + circos.link(sector.index1 = pairs_graph2$Category.1[i], + point1 = c(pairs_graph2$Viz.ID.1[i] - 0.26, pairs_graph2$Viz.ID.1[i] + 0.26), + sector.index2 = pairs_graph2$Category.2[i], + point2 = c(pairs_graph2$Viz.ID.2[i] - 0.26, pairs_graph2$Viz.ID.2[i] + 0.26), + col = pairs_graph$Chord.Color.Solid[i], h.ratio = 0.5, w = 0.8) +} ## close the device dev.off() + # Export visual as png ---- ## will require adjusting font size, etc ##dev.copy(png, "images/library-report.png", diff --git a/data_raw/OS-Inventory-list-20260518.xlsx b/data_raw/OS-Inventory-list-20260518.xlsx index f9276e7f33b7c6b7d80bec0e87684cdf05e93b88..184c51c53152478109a604b5b581149fb0cd7e5b 100644 GIT binary patch delta 5728 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

ya1 z1^8KrnTkJyfP>$`tkwBO_{KMHLxJdvgaod^GZ!lr2?p(lGF + + + + + + + + + + + + + + + + + + + + +Foundational Data Literacy Module +Open science & data management planning +Methodological documentation +Research process management +Ethical & responsible data practices +Programming and data analysis +Data visualization +Reproducible coding +Code collaboration & sharing +(FAIR) data sharing +Researcher identity +Open access publishing +Copyright & licensing +Open data +Open methodology +Open source +Open access +Open peer review +Open educational resource +Open infastructure +CSD +DREAM Lab +R&E +RDS +SRC +T&L +Open Course Materials Program +Carpentries Community +Data to Discovery +Department & Program Orientation +Douglass Day +Library Award for Undergraduate Research +Library Open Science Award +Open Access Week +Open Education Week +Open Source Meetup +Research Data Community +UC Love Data Week +Carpentries program +Coder workspace +Data Literacy Series +Data rescue +Dataverse +DMPTool +Dryad +eScholarship +EZID +LibGuides (OS-themed) +Open access fund +ORCiD +Open Source Program +Protocols.io +RCD website +Reproducible and Collaborative Lab +Transformative Agreements + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +y +t +i +n +u +m +m +o +C + +& + +t +n +e +m +e +g +a +g +n +E + + +n +o +i +t +a +t +l +u +s +n +o +C + +& + +n +o +i +t +c +u +r +t +s +n +I + + +O +S + +D +o +m +a +i +n +s + + +P +r +o +v +i +d +e +r + + +S +e +r +v +i +c +e +s + +& + +P +r +o +g +r +a +m +s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/library-report-light.svg b/images/library-report-light.svg new file mode 100644 index 0000000..f477216 --- /dev/null +++ b/images/library-report-light.svg @@ -0,0 +1,574 @@ + + + + + + + + + + + + + + + + + + + + + +Foundational Data Literacy Module +Open science & data management planning +Methodological documentation +Research process management +Ethical & responsible data practices +Programming and data analysis +Data visualization +Reproducible coding +Code collaboration & sharing +(FAIR) data sharing +Researcher identity +Open access publishing +Copyright & licensing +Open data +Open methodology +Open source +Open access +Open peer review +Open educational resource +Open infastructure +CSD +DREAM Lab +R&E +RDS +SRC +T&L +Open Course Materials Program +Carpentries Community +Data to Discovery +Department & Program Orientation +Douglass Day +Library Award for Undergraduate Research +Library Open Science Award +Open Access Week +Open Education Week +Open Source Meetup +Research Data Community +UC Love Data Week +Carpentries program +Coder workspace +Data Literacy Series +Data rescue +Dataverse +DMPTool +Dryad +eScholarship +EZID +LibGuides (OS-themed) +Open access fund +ORCiD +Open Source Program +Protocols.io +RCD website +Reproducible and Collaborative Lab +Transformative Agreements + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +y +t +i +n +u +m +m +o +C + +& + +t +n +e +m +e +g +a +g +n +E + + +n +o +i +t +a +t +l +u +s +n +o +C + +& + +n +o +i +t +c +u +r +t +s +n +I + + +O +S + +D +o +m +a +i +n +s + + +P +r +o +v +i +d +e +r + + +S +e +r +v +i +c +e +s + +& + +P +r +o +g +r +a +m +s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/library-report.svg b/images/library-report.svg deleted file mode 100644 index cae21d2..0000000 --- a/images/library-report.svg +++ /dev/null @@ -1,564 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - -Foundational Data Literacy Module -Open science & data management planning -Methodological documentation -Research process management -Ethical & responsible data practices -Programming and data analysis -Data visualization -Reproducible coding -Code collaboration & sharing -(FAIR) data sharing -Researcher identity -Open access publishing -Copyright & licensing -Open data -Open methodology -Open source -Open access -Open peer review -Open educational resource -Open infastructure -CSD -DREAM Lab -R&E -RDS -SRC -T&L -Open Course Materials Program -Carpentries Community -Data to Discovery -Department & Program Orientation -Douglass Day -Library Award for Undergraduate Research -Library Open Science Award -Open Access Week -Open Education Week -Open Source Meetup -Research Data Community -UC Love Data Week -Carpentries program -Coder workspace -Data Literacy Series -Data rescue -Dataverse -DMPTool -Dryad -eScholarship -EZID -LibGuides (OS-themed) -Open access fund -ORCiD -Open Source Program -Protocols.io -RCD website -Reproducible and Collaborative Lab -Transformative Agreements - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -y -t -i -n -u -m -m -o -C - -& - -t -n -e -m -e -g -a -g -n -E - - -n -o -i -t -a -t -l -u -s -n -o -C - -& - -n -o -i -t -c -u -r -t -s -n -I - - -O -S - -D -o -m -a -i -n -s - - -P -r -o -v -i -d -e -r - - -S -e -r -v -i -c -e -s - -& - -P -r -o -g -r -a -m -s - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Status -Active -In development -On hold - - - From 7bcb6b7f5b4a8ec70ee274a1474f0ed0a98d5571 Mon Sep 17 00:00:00 2001 From: xl-mini Date: Tue, 26 May 2026 06:39:33 -0700 Subject: [PATCH 2/2] fix typo --- code/002-library-report.R | 4 +- images/library-report-gray.svg | 154 ++++++++++++++++----------------- 2 files changed, 79 insertions(+), 79 deletions(-) diff --git a/code/002-library-report.R b/code/002-library-report.R index 8b51ab2..e627ec4 100644 --- a/code/002-library-report.R +++ b/code/002-library-report.R @@ -129,7 +129,7 @@ pairs_reorg_service1 <- pairs_temp %>% pairs_reorg_service2 <- pairs_temp %>% filter(Category.2 != "OS Domains") %>% # already in pairs_domain_graph - filter((Category.1 == "Instruction & Consultation" & Category.2 == "Services & Programs") ) %>% view() + filter((Category.1 == "Instruction & Consultation" & Category.2 == "Services & Programs") ) %>% mutate(Category.Temp = Category.1, Item.Temp = Item.1, Viz.ID.Temp = Viz.ID.1) %>% select(Category.1 = Category.2, Item.1 = Item.2, Viz.ID.1 = Viz.ID.2, Category.2 = Category.Temp, Item.2 = Item.Temp, Viz.ID.2 = Viz.ID.Temp) @@ -305,7 +305,7 @@ for(i in 1:nrow(pairs_graph1)){ pairs_graph2 <- pairs_graph %>% filter(Category.1 == "OS Domains") -for(i in 1:nrow(pairs_graph2)){ +for(i in nrow(pairs_graph2):1){ circos.link(sector.index1 = pairs_graph2$Category.1[i], point1 = c(pairs_graph2$Viz.ID.1[i] - 0.26, pairs_graph2$Viz.ID.1[i] + 0.26), sector.index2 = pairs_graph2$Category.2[i], diff --git a/images/library-report-gray.svg b/images/library-report-gray.svg index d43d614..56d108a 100644 --- a/images/library-report-gray.svg +++ b/images/library-report-gray.svg @@ -491,84 +491,84 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +