patchwork/0000755000176200001440000000000014671775232012272 5ustar liggesuserspatchwork/tests/0000755000176200001440000000000014545733023013424 5ustar liggesuserspatchwork/tests/testthat/0000755000176200001440000000000014671775232015274 5ustar liggesuserspatchwork/tests/testthat/test-arithmetic.R0000644000176200001440000000261514464235345020525 0ustar liggesuserstest_that("`+` works", { expect_doppelganger('Standard addition: p1 + p2 + p3', { p1 + p2 + p3 }) expect_doppelganger('Adding to patchwork: (p1 + p2) + p3', { (p1 + p2) + p3 }) expect_doppelganger('Add patchwork to plot: p1 + (p2 + p3)', { p1 + (p2 + p3) }) expect_doppelganger('Add grob: p1 + textGrob("test")', { p1 + grid::textGrob("test") }) expect_doppelganger('Add ggplot elements: p1 + p2 + theme_bw()', { p1 + p2 + theme_bw() }) skip_if_not_installed("gridGraphics") expect_doppelganger('Add base graphics: p1 + ~plot(1:10, 1:10)', { p1 + ~plot(1:10, 1:10) }) }) test_that("`-` works", { expect_doppelganger('Nest left-hand side: (p1 + p2) - p3', { (p1 + p2) - p3 }) expect_doppelganger('Nest right-hand side: p1 - (p2 + p3)', { p1 - (p2 + p3) }) }) test_that("`|` and `/` works", { expect_doppelganger('Stack 3 plots: p1 / p2 / p3', { p1 / p2 / p3 }) expect_doppelganger('Pack 4 plots: p1 | p2 | p3 | p4', { p1 | p2 | p3 | p4 }) expect_doppelganger('Complex composition: ((p1 / p2) | p3) / p4', { ((p1 / p2) | p3) / p4 }) }) test_that("`&` and `*` works", { patchwork <- ((p1 / p2) | p3) / p4 expect_doppelganger('Adding to all subplots: patchwork & theme_bw()', { patchwork & theme_bw() }) expect_doppelganger('Adding to all on level: patchwork * theme_bw()', { patchwork * theme_bw() }) }) patchwork/tests/testthat/test-layout.R0000644000176200001440000000616614666007751017720 0ustar liggesuserstest_that("The grid can be controlled", { expect_doppelganger('Setting ncol', { p1 + p2 + p3 + p4 + plot_layout(ncol = 3) }) expect_doppelganger('Setting nrow', { p1 + p2 + p3 + p4 + plot_layout(nrow = 3) }) expect_doppelganger('Setting widths', { p1 + p2 + p3 + p4 + plot_layout(widths = c(1, 2)) }) expect_doppelganger('Setting heights', { p1 + p2 + p3 + p4 + plot_layout(heights = c(1, 2)) }) expect_doppelganger('Setting widths as units', { p1 + p2 + p3 + p4 + plot_layout(widths = grid::unit(3, "cm")) }) expect_doppelganger('Setting heights as units', { p1 + p2 + p3 + p4 + plot_layout(heights = grid::unit(3, "cm")) }) }) test_that("Fixed aspect plots behave", { p_f <- ggplot(mtcars) + geom_point(aes(hp, disp)) + coord_fixed() + ggtitle('Fixed Aspect') expect_doppelganger('FAR optimise space by default 1', { p1 + p_f + p3 + p4 }) expect_doppelganger('FAR optimise space by default 2', { p1 + p_f + p_f + p4 }) expect_doppelganger('FAR optimise space by default 3', { p_f + p_f + p3 + p4 }) expect_doppelganger('FAR space optimisation can be turned off', { p1 + p2 + p_f + p4 + plot_layout(widths = 1) }) expect_doppelganger('FAR dimensions can be set with units:...', { p1 + p2 + p_f + plot_layout(widths = unit(c(1, 3, -1), c('null', 'cm', 'null'))) }) p_l1 <- ggplot(mtcars, aes(cyl, qsec, color=as.factor(vs))) + geom_point() p_l2 <- p_l1 + labs(color="a very looooooong legend title") expect_doppelganger('FAR legend justification', { p_l1 + p_l2 + plot_layout(ncol=1) & theme(legend.justification = "left", aspect.ratio=1) }) }) test_that("Insets looks as they should", { expect_doppelganger('Basic inset works', { p1 + inset_element(p2, 0.6, 0.6, 1, 1) }) expect_doppelganger('Other alignments work', { p1 + inset_element(p2, 0, 0.6, 0.4, 1, align_to = 'full') }) expect_doppelganger('Patchworks can be inset', { p1 + inset_element(p2 / p3, 0, 0.6, 0.4, 1) }) expect_doppelganger('Grobs can be inset', { p1 + inset_element(grid::circleGrob(), 0, 0.6, 0.4, 1) }) expect_doppelganger('insets can be changed', { p1 + inset_element(p2, 0, 0.6, 0.4, 1) + theme_void() }) }) test_that("various flavours of free() works", { p5 <- ggplot(mtcars) + geom_bar(aes(y = factor(gear), fill = factor(gear))) + scale_y_discrete( "", labels = c("3 gears are often enough", "But, you know, 4 is a nice number", "I would def go with 5 gears in a modern car") ) expect_doppelganger('Free panel works', { p1 / free(p5, "panel") }) expect_doppelganger('Free panel works on one side', { p1 / free(p5, "panel", "l") }) expect_doppelganger('Free label works', { free(p1, "label") / p5 }) expect_doppelganger('Free space works', { plot_spacer() + free(p5, "space", "l") + p1 + p1 }) expect_doppelganger('Free can be nested', { p1 / free(p5 / free(p2, "label"), side = "l") }) expect_doppelganger('Free can be stacked and nested', { free(free(p1 + p2 + p3 + p4, "label", "l"), "panel", "t") - p4 + p5 + plot_spacer() }) }) patchwork/tests/testthat/helper-vdiffr.R0000644000176200001440000000107113766061310020140 0ustar liggesusers# vdiffr ignores failures when # - VDIFFR_RUN_TESTS is "false" (on Travis CI with older versions and dev version of R) # - CI is not set (on CRAN) if (requireNamespace("vdiffr", quietly = TRUE)) { expect_doppelganger <- vdiffr::expect_doppelganger } else { # If vdiffr is not available and visual tests are not explicitly disabled, raise error. if (!identical(Sys.getenv("VDIFFR_RUN_TESTS"), "false")) { stop("vdiffr is not installed") } # Otherwise, assign a dummy function expect_doppelganger <- function(...) skip("vdiffr is not installed.") } patchwork/tests/testthat/test-collect.R0000644000176200001440000000354714670774554020037 0ustar liggesuserstest_that("axes and titles are collected correctly for multi-cell plots", { plots <- wrap_plots(rep(list(p1), 8)) layout <- plot_layout( design = "12345\n62378", axes = "collect", axis_titles = "collect" ) # columns 1, 2 and 4 should have titles and y-axes # only row 2 should have titles and x-axes expect_doppelganger( "multi-cell title and axis collection", plots + layout ) }) test_that("axis columns are properly resized", { p5 <- p1 + scale_y_continuous( labels = function(x) paste0("a long axis label signifying ", x) ) p6 <- p1 + theme(axis.text = element_text(colour = "red")) + ggtitle("Interrupting plot") layout <- plot_layout(2, 2, axes = "collect", axis_titles = "collect") # only column 1 should have long axis labels # upper left plot should not have x-axis, there rest should # there should be no excess space between column 1 and 2 expect_doppelganger( "corrected spacing for long axis labels", p5 + p5 + p5 + p6 + layout ) }) test_that("axis titles are collected across empty areas", { plots <- wrap_plots(rep(list(p1), 6)) + plot_layout( axes = "collect", axis_titles = "collect", design = "#AB\nC#D\nEF#" ) expect_doppelganger( "Empty areas doesn't interfere with title collection", plots ) }) test_that("collect guides works well", { expect_doppelganger( "collect normal guides", wrap_plots(p1 + p3, guides = "collect") ) p_guides <- p3 + scale_color_continuous(guide = guide_colorbar( theme = theme(legend.key.height = unit(1, "null")) )) expect_doppelganger( "collect guides with null unit", wrap_plots(p1 + p_guides, guides = "collect") ) expect_doppelganger( "collect guides with multiple plots with null unit", wrap_plots(p1 + p_guides + p_guides + labs(color = "another"), guides = "collect" ) ) }) patchwork/tests/testthat/_snaps/0000755000176200001440000000000014671764320016553 5ustar liggesuserspatchwork/tests/testthat/_snaps/layout/0000755000176200001440000000000014667773642020104 5ustar liggesuserspatchwork/tests/testthat/_snaps/layout/insets-can-be-changed.svg0000644000176200001440000003152514665353153024637 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 Plot 2 insets can be changed patchwork/tests/testthat/_snaps/layout/far-dimensions-can-be-set-with-units.svg0000644000176200001440000005145214662061457027564 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 100 200 300 400 disp 100 200 300 hp Fixed Aspect FAR dimensions can be set with units:... patchwork/tests/testthat/_snaps/layout/basic-inset-works.svg0000644000176200001440000004165214665353152024165 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 Basic inset works patchwork/tests/testthat/_snaps/layout/setting-ncol.svg0000644000176200001440000010107214662061455023217 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt mpg 15 20 25 30 Plot 3 4 6 8 3 4 5 3 4 5 3 4 5 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 Setting ncol patchwork/tests/testthat/_snaps/layout/free-can-be-nested.svg0000644000176200001440000005044414667773606024160 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 factor(gear) 3 4 5 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear 3 gears are often enough But, you know, 4 is a nice number I would def go with 5 gears in a modern car 0 5 10 15 count 100 200 300 400 disp Plot 2 Free can be nested patchwork/tests/testthat/_snaps/layout/free-space-works.svg0000644000176200001440000005153514667773606024013 0ustar liggesusers 0 5 10 15 count factor(gear) 3 4 5 3 gears are often enough But, you know, 4 is a nice number I would def go with 5 gears in a modern car 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 Free space works patchwork/tests/testthat/_snaps/layout/setting-widths-as-units.svg0000644000176200001440000010166314662061456025336 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt mpg 15 20 25 30 Plot 3 4 6 8 3 4 5 3 4 5 3 4 5 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 Setting widths as units patchwork/tests/testthat/_snaps/layout/free-panel-works-on-one-side.svg0000644000176200001440000003243414667773606026127 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 0 5 10 15 count factor(gear) 3 4 5 3 gears are often enough But, you know, 4 is a nice number I would def go with 5 gears in a modern car Free panel works on one side patchwork/tests/testthat/_snaps/layout/far-legend-justification.svg0000644000176200001440000004307114662061460025466 0ustar liggesusers 16 18 20 22 qsec 4 5 6 7 8 cyl as.factor(vs) 0 1 16 18 20 22 qsec 4 5 6 7 8 cyl a very looooooong legend title 0 1 FAR legend justification patchwork/tests/testthat/_snaps/layout/patchworks-can-be-inset.svg0000644000176200001440000007047414665353152025255 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt mpg 15 20 25 30 Plot 3 Patchworks can be inset patchwork/tests/testthat/_snaps/layout/setting-widths.svg0000644000176200001440000010114514662061456023570 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt mpg 15 20 25 30 Plot 3 4 6 8 3 4 5 3 4 5 3 4 5 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 Setting widths patchwork/tests/testthat/_snaps/layout/far-optimise-space-by-default-1.svg0000644000176200001440000010072714662061457026501 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 disp 100 200 300 hp Fixed Aspect 2 3 4 5 100 200 300 hp wt mpg 15 20 25 30 Plot 3 4 6 8 3 4 5 3 4 5 3 4 5 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 FAR optimise space by default 1 patchwork/tests/testthat/_snaps/layout/free-can-be-stacked-and-nested.svg0000644000176200001440000014160314667554313026322 0ustar liggesusers 100 200 300 hp 100 200 300 400 disp 2 3 4 5 wt 3 4 5 3 4 5 3 4 5 gear 10 15 20 25 30 35 mpg Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 mpg 15 20 25 30 Plot 3 4 6 8 0.0 2.5 5.0 7.5 10.0 12.5 count Plot 4 4 6 8 3 4 5 3 4 5 3 4 5 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 3 gears are often enough But, you know, 4 is a nice number I would def go with 5 gears in a modern car 0 5 10 15 count factor(gear) 3 4 5 Free can be stacked and nested patchwork/tests/testthat/_snaps/layout/free-panel-works.svg0000644000176200001440000003242014667773606024007 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 3 gears are often enough But, you know, 4 is a nice number I would def go with 5 gears in a modern car 0 5 10 15 count factor(gear) 3 4 5 Free panel works patchwork/tests/testthat/_snaps/layout/setting-heights-as-units.svg0000644000176200001440000010165214662061456025465 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt mpg 15 20 25 30 Plot 3 4 6 8 3 4 5 3 4 5 3 4 5 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 Setting heights as units patchwork/tests/testthat/_snaps/layout/far-optimise-space-by-default-2.svg0000644000176200001440000007427314662061457026510 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 disp 100 200 300 hp Fixed Aspect 100 200 300 400 disp 100 200 300 hp Fixed Aspect 4 6 8 3 4 5 3 4 5 3 4 5 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 FAR optimise space by default 2 patchwork/tests/testthat/_snaps/layout/setting-nrow.svg0000644000176200001440000010114314662061455023250 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt mpg 15 20 25 30 Plot 3 4 6 8 3 4 5 3 4 5 3 4 5 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 Setting nrow patchwork/tests/testthat/_snaps/layout/grobs-can-be-inset.svg0000644000176200001440000002310314665306024024163 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 Grobs can be inset patchwork/tests/testthat/_snaps/layout/setting-heights.svg0000644000176200001440000010114714662061456023723 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt mpg 15 20 25 30 Plot 3 4 6 8 3 4 5 3 4 5 3 4 5 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 Setting heights patchwork/tests/testthat/_snaps/layout/other-alignments-work.svg0000644000176200001440000004144114665353152025055 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 Other alignments work patchwork/tests/testthat/_snaps/layout/far-space-optimisation-can-be-turned-off.svg0000644000176200001440000007404214662061457030371 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 100 200 300 400 disp 100 200 300 hp Fixed Aspect 4 6 8 3 4 5 3 4 5 3 4 5 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 FAR space optimisation can be turned off patchwork/tests/testthat/_snaps/layout/far-optimise-space-by-default-3.svg0000644000176200001440000007772214662061457026513 0ustar liggesusers 100 200 300 400 disp 100 200 300 hp Fixed Aspect 100 200 300 400 disp 100 200 300 hp Fixed Aspect 2 3 4 5 100 200 300 hp wt mpg 15 20 25 30 Plot 3 4 6 8 3 4 5 3 4 5 3 4 5 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 FAR optimise space by default 3 patchwork/tests/testthat/_snaps/layout/free-label-works.svg0000644000176200001440000003244614667773606023777 0ustar liggesusers 10 15 20 25 30 35 mpg 100 200 300 400 disp Plot 1 3 gears are often enough But, you know, 4 is a nice number I would def go with 5 gears in a modern car 0 5 10 15 count factor(gear) 3 4 5 Free label works patchwork/tests/testthat/_snaps/collect/0000755000176200001440000000000014670774554020211 5ustar liggesuserspatchwork/tests/testthat/_snaps/collect/multi-cell-title-and-axis-collection.svg0000644000176200001440000013323014670774554027755 0ustar liggesusers 100 200 300 400 Plot 1 100 200 300 400 10 15 20 25 30 35 Plot 1 10 15 20 25 30 35 Plot 1 100 200 300 400 Plot 1 Plot 1 100 200 300 400 10 15 20 25 30 35 Plot 1 100 200 300 400 10 15 20 25 30 35 Plot 1 10 15 20 25 30 35 mpg disp Plot 1 multi-cell title and axis collection patchwork/tests/testthat/_snaps/collect/empty-areas-doesn-t-interfere-with-title-collection.svg0000644000176200001440000010661414670774554032742 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 Plot 1 Plot 1 100 200 300 400 Plot 1 100 200 300 400 10 15 20 25 30 35 Plot 1 100 200 300 400 10 15 20 25 30 35 Plot 1 10 15 20 25 30 35 mpg disp Plot 1 Empty areas doesn't interfere with title collection patchwork/tests/testthat/_snaps/collect/collect-normal-guides.svg0000644000176200001440000004221114670774554025123 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 2 3 4 5 100 200 300 hp wt Plot 3 mpg 15 20 25 30 collect normal guides patchwork/tests/testthat/_snaps/collect/corrected-spacing-for-long-axis-labels.svg0000644000176200001440000006256514670774554030267 0ustar liggesusers a long axis label signifying 100 a long axis label signifying 200 a long axis label signifying 300 a long axis label signifying 400 Plot 1 10 15 20 25 30 35 Plot 1 a long axis label signifying 100 a long axis label signifying 200 a long axis label signifying 300 a long axis label signifying 400 10 15 20 25 30 35 Plot 1 100 200 300 400 10 15 20 25 30 35 mpg disp Interrupting plot corrected spacing for long axis labels patchwork/tests/testthat/_snaps/collect/collect-guides-with-null-unit.svg0000644000176200001440000004221714670774554026541 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 2 3 4 5 100 200 300 hp wt Plot 3 mpg 15 20 25 30 collect guides with null unit patchwork/tests/testthat/_snaps/collect/collect-guides-with-multiple-plots-with-null-unit.svg0000644000176200001440000006351314670774554032504 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 2 3 4 5 100 200 300 hp wt Plot 3 2 3 4 5 100 200 300 hp wt Plot 3 mpg 15 20 25 30 another 15 20 25 30 collect guides with multiple plots with null unit patchwork/tests/testthat/_snaps/arithmetic/0000755000176200001440000000000014662061415020677 5ustar liggesuserspatchwork/tests/testthat/_snaps/arithmetic/adding-to-patchwork-p1-p2-p3.svg0000644000176200001440000005616214662061333026454 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt mpg 15 20 25 30 Plot 3 Adding to patchwork: (p1 + p2) + p3 patchwork/tests/testthat/_snaps/arithmetic/adding-to-all-on-level-patchwork-theme-bw.svg0000644000176200001440000011714114662061335031267 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt mpg 15 20 25 30 Plot 3 4 6 8 3 4 5 3 4 5 3 4 5 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 Adding to all on level: patchwork * theme_bw() patchwork/tests/testthat/_snaps/arithmetic/complex-composition-p1-p2-p3-p4.svg0000644000176200001440000010261014662061335027127 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt mpg 15 20 25 30 Plot 3 4 6 8 3 4 5 3 4 5 3 4 5 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 Complex composition: ((p1 / p2) | p3) / p4 patchwork/tests/testthat/_snaps/arithmetic/add-base-graphics-p1-plot-1-10-1-10.svg0000644000176200001440000003471214545731201027104 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 2 4 6 8 10 2 4 6 8 10 1:10 1:10 Add base graphics: p1 + ~plot(1:10, 1:10) patchwork/tests/testthat/_snaps/arithmetic/stack-3-plots-p1-p2-p3.svg0000644000176200001440000005610614662061334025211 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt mpg 15 20 25 30 Plot 3 Stack 3 plots: p1 / p2 / p3 patchwork/tests/testthat/_snaps/arithmetic/standard-addition-p1-p2-p3.svg0000644000176200001440000005615614662061333026202 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt mpg 15 20 25 30 Plot 3 Standard addition: p1 + p2 + p3 patchwork/tests/testthat/_snaps/arithmetic/adding-to-all-subplots-patchwork-theme-bw.svg0000644000176200001440000013356614662061335031432 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt mpg 15 20 25 30 Plot 3 4 6 8 3 4 5 3 4 5 3 4 5 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 Adding to all subplots: patchwork & theme_bw() patchwork/tests/testthat/_snaps/arithmetic/nest-left-hand-side-p1-p2-p3.svg0000644000176200001440000005701414662061334026337 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt mpg 15 20 25 30 Plot 3 Nest left-hand side: (p1 + p2) - p3 patchwork/tests/testthat/_snaps/arithmetic/pack-4-plots-p1-p2-p3-p4.svg0000644000176200001440000010116414662061334025337 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt mpg 15 20 25 30 Plot 3 4 6 8 3 4 5 3 4 5 3 4 5 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 Pack 4 plots: p1 | p2 | p3 | p4 patchwork/tests/testthat/_snaps/arithmetic/add-ggplot-elements-p1-p2-theme-bw.svg0000644000176200001440000004156014662061334027625 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 Add ggplot elements: p1 + p2 + theme_bw() patchwork/tests/testthat/_snaps/arithmetic/nest-right-hand-side-p1-p2-p3.svg0000644000176200001440000005702514662061334026524 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt mpg 15 20 25 30 Plot 3 Nest right-hand side: p1 - (p2 + p3) patchwork/tests/testthat/_snaps/arithmetic/add-grob-p1-textgrob-test.svg0000644000176200001440000002375214466365431026246 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 test Add grob: p1 + textGrob("test") patchwork/tests/testthat/_snaps/arithmetic/add-patchwork-to-plot-p1-p2-p3.svg0000644000176200001440000005702614662061333026732 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt mpg 15 20 25 30 Plot 3 Add patchwork to plot: p1 + (p2 + p3) patchwork/tests/testthat/helper-setup.R0000644000176200001440000000120513567503320020020 0ustar liggesusers# vdiffr ignores failures when # - VDIFFR_RUN_TESTS is "false" (on Travis CI with older versions and dev version of R) # - CI is not set (on CRAN) expect_doppelganger <- vdiffr::expect_doppelganger # Predefined plots library(ggplot2) theme_set(theme_test() + theme(panel.grid = element_blank())) p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) + ggtitle('Plot 1') p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) + ggtitle('Plot 2') p3 <- ggplot(mtcars) + geom_point(aes(hp, wt, colour = mpg)) + ggtitle('Plot 3') p4 <- ggplot(mtcars) + geom_bar(aes(gear)) + facet_wrap(~cyl) + ggtitle('Plot 4') patchwork/tests/testthat.R0000644000176200001440000000007613567466225015424 0ustar liggesuserslibrary(testthat) library(patchwork) test_check("patchwork") patchwork/tests/figs/0000755000176200001440000000000014671764320014360 5ustar liggesuserspatchwork/tests/figs/insets-can-be-changed.svg0000644000176200001440000004475413751063431021127 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 Plot 2 insets can be changed patchwork/tests/figs/adding-to-patchwork-p1-p2-p3.svg0000644000176200001440000007746613672703056022147 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt 15 20 25 30 mpg Plot 3 Adding to patchwork: (p1 + p2) + p3 patchwork/tests/figs/setting-widths-p1-p2-p3-p4-plot-layout-widths-c-1-2.svg0000644000176200001440000013515313672703336026070 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt 15 20 25 30 mpg Plot 3 4 6 8 2 3 4 5 6 2 3 4 5 6 2 3 4 5 6 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 Setting widths: p1 + p2 + p3 + p4 + plot_layout(widths = c(1, 2)) patchwork/tests/figs/far-optimise-space-by-default-p1-p-f-p3-p4.svg0000644000176200001440000013666213672703352024476 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 disp 100 200 300 hp Fixed Aspect 2 3 4 5 100 200 300 hp wt 15 20 25 30 mpg Plot 3 4 6 8 2 3 4 5 6 2 3 4 5 6 2 3 4 5 6 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 FAR optimise space by default: p1 + p_f + p3 + p4 patchwork/tests/figs/far-dimensions-can-be-set-with-units.svg0000644000176200001440000007066613567560536024071 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 100 200 300 400 disp 100 200 300 hp Fixed Aspect FAR dimensions can be set with units:... patchwork/tests/figs/setting-widths-as-units-p1-p2-p3-p4-plot-layout-widths-unit-3-cm.svg0000644000176200001440000013602513672703344030624 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt 15 20 25 30 mpg Plot 3 4 6 8 2 3 4 5 6 2 3 4 5 6 2 3 4 5 6 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 Setting widths as units: p1 + p2 + p3 + p4 + plot_layout(widths = unit(3, "cm")) patchwork/tests/figs/far-optimise-space-by-default-p1-p-f-p-f-p4.svg0000644000176200001440000013013013567556777024642 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 disp 100 200 300 hp Fixed Aspect 100 200 300 400 disp 100 200 300 hp Fixed Aspect 4 6 8 2 3 4 5 6 2 3 4 5 6 2 3 4 5 6 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 FAR optimise space by default: p1 + p_f + p_f + p4 patchwork/tests/figs/setting-nrow-p1-p2-p3-p4-plot-layout-nrow-3.svg0000644000176200001440000013514013672703333024652 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt 15 20 25 30 mpg Plot 3 4 6 8 2 3 4 5 6 2 3 4 5 6 2 3 4 5 6 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 Setting nrow: p1 + p2 + p3 + p4 + plot_layout(nrow = 3) patchwork/tests/figs/basic-inset-works.svg0000644000176200001440000005773313751063431020455 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 Basic inset works patchwork/tests/figs/setting-heights-as-units-p1-p2-p3-p4-plot-layout-heights-unit-3-cm.svg0000644000176200001440000013576013672703347031116 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt 15 20 25 30 mpg Plot 3 4 6 8 2 3 4 5 6 2 3 4 5 6 2 3 4 5 6 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 Setting heights as units: p1 + p2 + p3 + p4 + plot_layout(heights = unit(3, "cm")) patchwork/tests/figs/adding-to-all-on-level-patchwork-theme-bw.svg0000644000176200001440000016255613672703324024756 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt 15 20 25 30 mpg Plot 3 4 6 8 2 3 4 5 6 2 3 4 5 6 2 3 4 5 6 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 Adding to all on level: patchwork * theme_bw() patchwork/tests/figs/setting-ncol-p1-p2-p3-p4-plot-layout-ncol-3.svg0000644000176200001440000013510113672703330024560 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt 15 20 25 30 mpg Plot 3 4 6 8 2 3 4 5 6 2 3 4 5 6 2 3 4 5 6 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 Setting ncol: p1 + p2 + p3 + p4 + plot_layout(ncol = 3) patchwork/tests/figs/complex-composition-p1-p2-p3-p4.svg0000644000176200001440000013616713672703315022622 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt 15 20 25 30 mpg Plot 3 4 6 8 2 3 4 5 6 2 3 4 5 6 2 3 4 5 6 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 Complex composition: ((p1 / p2) | p3) / p4 patchwork/tests/figs/add-base-graphics-p1-plot-1-10-1-10.svg0000644000176200001440000004721213567474552022577 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 2 4 6 8 10 2 4 6 8 10 1:10 1:10 Add base graphics: p1 + ~plot(1:10, 1:10) patchwork/tests/figs/stack-3-plots-p1-p2-p3.svg0000644000176200001440000007741313672703306020673 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt 15 20 25 30 mpg Plot 3 Stack 3 plots: p1 / p2 / p3 patchwork/tests/figs/standard-addition-p1-p2-p3.svg0000644000176200001440000007746213672703052021662 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt 15 20 25 30 mpg Plot 3 Standard addition: p1 + p2 + p3 patchwork/tests/figs/far-legend-justification.svg0000644000176200001440000006023113672702127021755 0ustar liggesusers 16 18 20 22 qsec 4 5 6 7 8 cyl as.factor(vs) 0 1 16 18 20 22 qsec 4 5 6 7 8 cyl a very looooooong legend title 0 1 FAR legend justification patchwork/tests/figs/adding-to-all-subplots-patchwork-theme-bw.svg0000644000176200001440000020531713672703320025075 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt 15 20 25 30 mpg Plot 3 4 6 8 2 3 4 5 6 2 3 4 5 6 2 3 4 5 6 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 Adding to all subplots: patchwork & theme_bw() patchwork/tests/figs/nest-left-hand-side-p1-p2-p3.svg0000644000176200001440000010012213672703276022010 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt 15 20 25 30 mpg Plot 3 Nest left-hand side: (p1 + p2) - p3 patchwork/tests/figs/patchworks-can-be-inset.svg0000644000176200001440000012302213751063431021522 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt 15 20 25 30 mpg Plot 3 Patchworks can be inset patchwork/tests/figs/pack-4-plots-p1-p2-p3-p4.svg0000644000176200001440000013507613672703311021022 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt 15 20 25 30 mpg Plot 3 4 6 8 2 3 4 5 6 2 3 4 5 6 2 3 4 5 6 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 Pack 4 plots: p1 | p2 | p3 | p4 patchwork/tests/figs/deps.txt0000644000176200001440000000010513751063431016041 0ustar liggesusers- vdiffr-svg-engine: 1.0 - vdiffr: 0.3.2.2 - freetypeharfbuzz: 0.2.5 patchwork/tests/figs/grobs-can-be-inset.svg0000644000176200001440000003305013751063431020452 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 Grobs can be inset patchwork/tests/figs/add-ggplot-elements-p1-p2-theme-bw.svg0000644000176200001440000005525613567474564023330 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 Add ggplot elements: p1 + p2 + theme_bw() patchwork/tests/figs/setting-heights-p1-p2-p3-p4-plot-layout-heights-c-1-2.svg0000644000176200001440000013515513672703341026350 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt 15 20 25 30 mpg Plot 3 4 6 8 2 3 4 5 6 2 3 4 5 6 2 3 4 5 6 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 Setting heights: p1 + p2 + p3 + p4 + plot_layout(heights = c(1, 2)) patchwork/tests/figs/other-alignments-work.svg0000644000176200001440000005751713751063431021351 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 Other alignments work patchwork/tests/figs/far-optimise-space-by-default-p-f-p-f-p3-p4.svg0000644000176200001440000013530113672703355024630 0ustar liggesusers 100 200 300 400 disp 100 200 300 hp Fixed Aspect 100 200 300 400 disp 100 200 300 hp Fixed Aspect 2 3 4 5 100 200 300 hp wt 15 20 25 30 mpg Plot 3 4 6 8 2 3 4 5 6 2 3 4 5 6 2 3 4 5 6 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 FAR optimise space by default: p_f + p_f + p3 + p4 patchwork/tests/figs/nest-right-hand-side-p1-p2-p3.svg0000644000176200001440000010015213672703303022165 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt 15 20 25 30 mpg Plot 3 Nest right-hand side: p1 - (p2 + p3) patchwork/tests/figs/add-grob-p1-textgrob-test.svg0000644000176200001440000003203013567474540021712 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 test Add grob: p1 + textGrob("test") patchwork/tests/figs/add-patchwork-to-plot-p1-p2-p3.svg0000644000176200001440000010015313672703061022375 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 2 3 4 5 100 200 300 hp wt 15 20 25 30 mpg Plot 3 Add patchwork to plot: p1 + (p2 + p3) patchwork/tests/figs/far-space-optimisation-can-be-turned-off-p1-p2-p-f-p4-plot-layout-widths-1.svg0000644000176200001440000012565613567557006032457 0ustar liggesusers 100 200 300 400 10 15 20 25 30 35 mpg disp Plot 1 100 200 300 400 2.5 3.0 3.5 4.0 4.5 5.0 5.5 gear disp Plot 2 100 200 300 400 disp 100 200 300 hp Fixed Aspect 4 6 8 2 3 4 5 6 2 3 4 5 6 2 3 4 5 6 0.0 2.5 5.0 7.5 10.0 12.5 gear count Plot 4 FAR space optimisation can be turned off: p1 + p2 + p_f + p4 + plot_layout(widths = 1) patchwork/MD50000644000176200001440000002447214671775232012613 0ustar liggesusers48741fb905da4cc24ba65196204b6439 *DESCRIPTION 390aa971d748d2d8595f400ac17045c9 *LICENSE 12b8e183a09d63eb84080192cd10a1c0 *NAMESPACE 4c55340cd519cff65214d2351e7db42d *NEWS.md e1083945ed9226bea81e62021f562036 *R/aaa.R 2eddd3f94000fa03c949700482b541b4 *R/add_plot.R e46d4bdd0b8d17137af2dbdde26e3365 *R/arithmetic.R f9e605cf1cbbea303a97055d2f225d9a *R/collect_axes.R 37fc9d40396bf4ad715f063fb67cde45 *R/free.R c3c8d87181db5e42452b19ba5c0bceb2 *R/guide_area.R 44a68f28d3d0deef0b1d98ea2a049bab *R/guides.R c80a9eb1427c585807cecf618b6f3870 *R/import-standalone-obj-type.R c40f882046a958444c6058a9e2cb9a3b *R/import-standalone-types-check.R 50d1ef049f6a9a3d7e7880393d1d0794 *R/inset_element.R 448577cbb18083e29639ceac9e917357 *R/merge.R ec204fb2be70d54e0c5acde9c57aa073 *R/patch.R dfaba9db754d3511b7eaa2122987e4d6 *R/patchwork-package.r 8f20c6ab2b687f5bdadcddd42126b32f *R/plot_annotation.R 8e3deadb8fbf3135de81829e9e7df699 *R/plot_layout.R c578d30be67eab8268d8177c9f03bebf *R/plot_multipage.R 732240b72b264e9f97c28c98d40b4ff0 *R/plot_patchwork.R ba0aeaa8e8d26e5b1030de18f0e66d3e *R/plot_spacer.R c057f7c85927cc0b6bc69ae0cc5913c3 *R/wrap_elements.R 6f68d8f0219614f457ab9318a0af4744 *R/wrap_ggplot_grob.R 2c9a8cdeb3cc8597cc1016ec15f4637f *R/wrap_plots.R a3ce6b5b92dd94f75632ae4ae1b3777c *R/wrap_table.R c5845f8f4e297b3950b2c2464ce8b4e0 *R/zzz.R 4339ad293a273441264754c34c252c35 *README.md fda0e73f95ed5a4f88db4e52676698ee *build/vignette.rds b2dac9e39188b4a419223d6c41d1bee5 *inst/doc/patchwork.R 3f40d4e15b5c9ede0db65584a801db54 *inst/doc/patchwork.Rmd cf75230fe082eed110361eb344de8ae1 *inst/doc/patchwork.html 911d3670e8b69b3e3444fcb44a6067eb *man/align_plots.Rd 3f39ec8b674e06a78a8fb754d6d2caef *man/area.Rd 32c6a72b9dfafc2141340fcf60d1a1c9 *man/figures/README-example-1.png 6a1126cd4f456362a1b4f149cb0bbf02 *man/figures/README-unnamed-chunk-10-1.png eeff8c60b5307e575516b48d5b9ee08d *man/figures/README-unnamed-chunk-11-1.png f021e4bbb8ef2fd1da89434e96c2bb9d *man/figures/README-unnamed-chunk-2-1.png 28949c885178f8b65e2c412e9e55863f *man/figures/README-unnamed-chunk-3-1.png 200ad5416eba48dea71e3f1fc8877e25 *man/figures/README-unnamed-chunk-4-1.png 7009269c9a8df69e63035b12cc21b87a *man/figures/README-unnamed-chunk-5-1.png 80247c6b5b5a8441883f873df1ac6301 *man/figures/README-unnamed-chunk-6-1.png b12accdb96c24f8fc7e4ab1e5b1daccb *man/figures/README-unnamed-chunk-7-1.png e42f2ae460285eecbd2436c6b332dc30 *man/figures/README-unnamed-chunk-8-1.png 81b34cb49e962146d28aaff041c6ec8c *man/figures/README-unnamed-chunk-9-1.png 654d3d24503566d1a4bef1b5f050de66 *man/figures/logo.png 3154db2c9392ed5339d86f999228ffa6 *man/figures/logo.svg 3dc9771de47f35d912fbb152db3504bf *man/free.Rd 54ebb2b857d07a40f9cae6b5efd087b0 *man/guide_area.Rd 6d654df4eb479fe5c47424f0c7c04116 *man/inset_element.Rd a3ffa09f3e9ca6871840c56a81ccf718 *man/multipage_align.Rd 41c1c78698eb7297af8b9fe27f38fb76 *man/patchGrob.Rd b72a77dbae7ef2c315930d37de009b5f *man/patchwork-package.Rd d292f64d700ae842a4b45b31e1a31e74 *man/patchworkGrob.Rd 73f08af3309a02f720d23bc11cbd3568 *man/plot_annotation.Rd 4e55782a9e85f03a86d21f6f88dd80d5 *man/plot_arithmetic.Rd 5baa7277d40edcdab0e63fe2f8781048 *man/plot_layout.Rd 882919ca2761e9b1d522f83a7100a0bb *man/plot_spacer.Rd 17eedacbf66eb8814ecfd48c734f266f *man/wrap_elements.Rd ef6b6b02d11b3ed73be98f2f263a908c *man/wrap_ggplot_grob.Rd 8e498c1e31f7fd5cf92f484253c22f74 *man/wrap_plots.Rd ea7723040f071d6b8a0064cb18270ff9 *man/wrap_table.Rd cf02db3838cf247fb46b9e52669ff954 *tests/figs/add-base-graphics-p1-plot-1-10-1-10.svg 66e71d32d03ac1992d1955c879402c0c *tests/figs/add-ggplot-elements-p1-p2-theme-bw.svg fdf476322ba39a126aa437661754f805 *tests/figs/add-grob-p1-textgrob-test.svg 90c20a5b212df8a3a84505f686d1f9ff *tests/figs/add-patchwork-to-plot-p1-p2-p3.svg f2379b6dde4c499b60238c09f7e890cb *tests/figs/adding-to-all-on-level-patchwork-theme-bw.svg 9f420b7b9543b96ce78a89d06f52da17 *tests/figs/adding-to-all-subplots-patchwork-theme-bw.svg e33b813d8d722141293886405592afe1 *tests/figs/adding-to-patchwork-p1-p2-p3.svg 76fe2c9302d30a3cb9e3b7547a94d0cb *tests/figs/basic-inset-works.svg ed571fac8f35d06620dc862fe8b82566 *tests/figs/complex-composition-p1-p2-p3-p4.svg e9a16bcba1c521977776cda238112ad2 *tests/figs/deps.txt 5e0f89e2f4292145d1d0e5816417211c *tests/figs/far-dimensions-can-be-set-with-units.svg 3d5994a3ea592f88ff383d5ad0a325d2 *tests/figs/far-legend-justification.svg 08de1a81dafe032bfeab67fb6aee0917 *tests/figs/far-optimise-space-by-default-p-f-p-f-p3-p4.svg 6ba693e9f72e7b7396137b64260f8a32 *tests/figs/far-optimise-space-by-default-p1-p-f-p-f-p4.svg f48ff6535d180f70e798145be02bc28d *tests/figs/far-optimise-space-by-default-p1-p-f-p3-p4.svg d1994eb6e664a2547860e182d7512496 *tests/figs/far-space-optimisation-can-be-turned-off-p1-p2-p-f-p4-plot-layout-widths-1.svg 3259871859ed05387f920beb49f5bffb *tests/figs/grobs-can-be-inset.svg 01c77144f1b5c866323ccc979c808f9c *tests/figs/insets-can-be-changed.svg e32bb425f2c7c733ac7e847d6d26fd00 *tests/figs/nest-left-hand-side-p1-p2-p3.svg 806186648e8fea881450e76f346f7e40 *tests/figs/nest-right-hand-side-p1-p2-p3.svg c4bf55d33ea765455e5a53cec027330d *tests/figs/other-alignments-work.svg 48584dfe897b12df123b832cf5d28670 *tests/figs/pack-4-plots-p1-p2-p3-p4.svg 8687b54502e57034def6172b2b137194 *tests/figs/patchworks-can-be-inset.svg 5cb229a237088e08815d50508d61824a *tests/figs/setting-heights-as-units-p1-p2-p3-p4-plot-layout-heights-unit-3-cm.svg 6d81d2bb5e8f82336708d83baa2a6764 *tests/figs/setting-heights-p1-p2-p3-p4-plot-layout-heights-c-1-2.svg cb9895e4ec20345c670e34dbd5959957 *tests/figs/setting-ncol-p1-p2-p3-p4-plot-layout-ncol-3.svg 2a673d72f3d0280aaa8bc33b06c3721e *tests/figs/setting-nrow-p1-p2-p3-p4-plot-layout-nrow-3.svg 731ec0a402d44625610924bb7e09db20 *tests/figs/setting-widths-as-units-p1-p2-p3-p4-plot-layout-widths-unit-3-cm.svg db74509b8b1554e6dac735333a1184a2 *tests/figs/setting-widths-p1-p2-p3-p4-plot-layout-widths-c-1-2.svg c13d20579da582b4f98bff7213700dc4 *tests/figs/stack-3-plots-p1-p2-p3.svg 639c2e5787468ff39d89c43f88b879bf *tests/figs/standard-addition-p1-p2-p3.svg d8187666272264157fe2194d8418d8c2 *tests/testthat.R a4f53be1ec85172662d12c0b9cc327a3 *tests/testthat/_snaps/arithmetic/add-base-graphics-p1-plot-1-10-1-10.svg fcd9ed0330c189df739c7d60ab0390ff *tests/testthat/_snaps/arithmetic/add-ggplot-elements-p1-p2-theme-bw.svg f0838bc9274955cb77f95caf9af72542 *tests/testthat/_snaps/arithmetic/add-grob-p1-textgrob-test.svg 4adf1b4e488e5aceeb620395b034ab3a *tests/testthat/_snaps/arithmetic/add-patchwork-to-plot-p1-p2-p3.svg e9bfd1e96adcc12dc5cf18421b35ee57 *tests/testthat/_snaps/arithmetic/adding-to-all-on-level-patchwork-theme-bw.svg 6817e83cd3e32abfc4c3d52b4c3b00db *tests/testthat/_snaps/arithmetic/adding-to-all-subplots-patchwork-theme-bw.svg 87ceb8d2fa0396371604cfd2d07a6f82 *tests/testthat/_snaps/arithmetic/adding-to-patchwork-p1-p2-p3.svg c473a35071ada8198cd2b4c5cf5c99bf *tests/testthat/_snaps/arithmetic/complex-composition-p1-p2-p3-p4.svg 5a318eb863cb4ef329c0a7952ff07f33 *tests/testthat/_snaps/arithmetic/nest-left-hand-side-p1-p2-p3.svg 6f8ff8827edaf72aa26229ef6a954539 *tests/testthat/_snaps/arithmetic/nest-right-hand-side-p1-p2-p3.svg f81654a18401e6cd26646fa7e278bb92 *tests/testthat/_snaps/arithmetic/pack-4-plots-p1-p2-p3-p4.svg 8ad342531a597392ffbb7b8ad4fd5c56 *tests/testthat/_snaps/arithmetic/stack-3-plots-p1-p2-p3.svg 8f187e6270b3314ce78c7b3abb18c087 *tests/testthat/_snaps/arithmetic/standard-addition-p1-p2-p3.svg 5d2eed5b32afab8222c03072be1669cf *tests/testthat/_snaps/collect/collect-guides-with-multiple-plots-with-null-unit.svg 3aa141d7a1402e4306886caed37e6405 *tests/testthat/_snaps/collect/collect-guides-with-null-unit.svg 4f44b6dc4420d4814896d3c6c3d4b0f0 *tests/testthat/_snaps/collect/collect-normal-guides.svg ce418f0ffd4178858b65831395553fa1 *tests/testthat/_snaps/collect/corrected-spacing-for-long-axis-labels.svg 5b5ded625cec3439efb60f5cf18f0216 *tests/testthat/_snaps/collect/empty-areas-doesn-t-interfere-with-title-collection.svg 248407d0a18e5def36b58a497c51aab6 *tests/testthat/_snaps/collect/multi-cell-title-and-axis-collection.svg 86a8292ba94b7ea252555bb2348742ce *tests/testthat/_snaps/layout/basic-inset-works.svg ed58482d6eb693137b14de769e0a8eae *tests/testthat/_snaps/layout/far-dimensions-can-be-set-with-units.svg 0a575df614d6b8765962d7f0eaad8371 *tests/testthat/_snaps/layout/far-legend-justification.svg eda44fa158020c3672e2d75820355687 *tests/testthat/_snaps/layout/far-optimise-space-by-default-1.svg 2f08f69012a99e6b5aa49b57892f9c97 *tests/testthat/_snaps/layout/far-optimise-space-by-default-2.svg 5a004f2fd4363c5f38bf493e7bcb20c6 *tests/testthat/_snaps/layout/far-optimise-space-by-default-3.svg 155b4ef7d8e3420f758d16f3065d773e *tests/testthat/_snaps/layout/far-space-optimisation-can-be-turned-off.svg 9c0975d694c8ad4593234d3c1567e18b *tests/testthat/_snaps/layout/free-can-be-nested.svg 1aaa05d4ba53915de3cc0ed52546397f *tests/testthat/_snaps/layout/free-can-be-stacked-and-nested.svg 547509431588add352fe7fddf8ab15b1 *tests/testthat/_snaps/layout/free-label-works.svg cc5e44451b4f52210a315c610d7d1198 *tests/testthat/_snaps/layout/free-panel-works-on-one-side.svg 89e4014917b53cf43c43efc3cfab400d *tests/testthat/_snaps/layout/free-panel-works.svg 43d0f24cd646459eaca28733869e62f8 *tests/testthat/_snaps/layout/free-space-works.svg a6d28fc2ae006d57d67ffd4e0ec6bbe2 *tests/testthat/_snaps/layout/grobs-can-be-inset.svg 85049acb629056d72e0a310a8a1a0acc *tests/testthat/_snaps/layout/insets-can-be-changed.svg deabffee51b5d66589ebab2ed5c05be8 *tests/testthat/_snaps/layout/other-alignments-work.svg c15ae1d1cb2e819f0d989973f01aeebf *tests/testthat/_snaps/layout/patchworks-can-be-inset.svg 3a30400a1b0f66463a3ac7351e8f7c49 *tests/testthat/_snaps/layout/setting-heights-as-units.svg ebc5d049597870b22eac0e896b4d9be9 *tests/testthat/_snaps/layout/setting-heights.svg ea1c144321ece94f4ce570a18ef7ae60 *tests/testthat/_snaps/layout/setting-ncol.svg 74ebabf8d3cacccecfc9294aea558626 *tests/testthat/_snaps/layout/setting-nrow.svg 2387d277e9523e8661a269f95f2b9e1f *tests/testthat/_snaps/layout/setting-widths-as-units.svg 307cb0c08faf8786b1f7a1efef8ea23b *tests/testthat/_snaps/layout/setting-widths.svg e5df7b46906921ea2b3d80fcf86c59f6 *tests/testthat/helper-setup.R 85a17f8af714e3b5e9dd9a950cd39f7a *tests/testthat/helper-vdiffr.R 4181d3db955d6f77307c618e9cda472f *tests/testthat/test-arithmetic.R 4735f233c877cf914e4b11af8c8b993c *tests/testthat/test-collect.R cebc85687d2b38ff8b60ffcec2a748b5 *tests/testthat/test-layout.R 3f40d4e15b5c9ede0db65584a801db54 *vignettes/patchwork.Rmd patchwork/R/0000755000176200001440000000000014670774554012500 5ustar liggesuserspatchwork/R/wrap_ggplot_grob.R0000644000176200001440000000431014663056230016141 0ustar liggesusers#' Make a gtable created from a ggplot object patchwork compliant #' #' This function converts a gtable, as produced by [ggplot2::ggplotGrob()] and #' makes it ready to be added to a patchwork. In contrast to passing #' the gtable to [wrap_elements()], `wrap_ggplot_grob()` ensures proper #' alignment as expected. On the other hand major restructuring of the gtable #' will result in an object that doesn't work properly with #' `wrap_ggplot_grob()`. #' #' @param x A gtable as produced by [ggplot2::ggplotGrob()] #' #' @return A `table_patch` object to be added to a patchwork #' #' @export #' #' @examples #' library(grid) #' library(gtable) #' library(ggplot2) #' #' p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) + ggtitle('disp and mpg seems connected') #' p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) #' #' # Convert p2 so we can add new stuff to it #' p2_table <- ggplotGrob(p2) #' stamp <- textGrob('TOP SECRET', rot = 35, #' gp = gpar(fontsize = 72, fontface = 'bold') #' ) #' p2_table <- gtable_add_grob(p2_table, stamp, #' t = 1, l = 1, b = nrow(p2_table), r = ncol(p2_table) #' ) #' #' # Adding it directly will loose alignment #' p1 + p2_table #' #' # Use wrap_ggplot_grob to keep alignment #' p1 + wrap_ggplot_grob(p2_table) #' wrap_ggplot_grob <- function(x) { check_object(x, is.gtable, "a object") if (length(x$widths) > TABLE_COLS || length(x$heights) > TABLE_ROWS) { cli_abort("{.arg x} does not appear to be a gtable created from a {.cls ggplot} object") } patch <- make_patch() class(patch) <- c('table_patch', class(patch)) attr(patch, 'table') <- x patch } #' @export patchGrob.table_patch <- function(x, guides = 'auto') { gt <- attr(x, 'table') gt <- add_strips(gt) gt <- add_guides(gt, guides == 'collect') if ("tag" %in% names(x$labels)) { plot <- add_guides(add_strips(ggplotGrob(x))) tag_idx <- which(plot$layout$name == "tag") gt <- gtable_add_grob( gt, grobs = plot$grobs[[tag_idx]], t = plot$layout$t[tag_idx], l = plot$layout$l[tag_idx], b = plot$layout$b[tag_idx], r = plot$layout$r[tag_idx], z = max(gt$layout$z) + 1, clip = plot$layout$clip[tag_idx], name = "tag" ) } gt } patchwork/R/plot_layout.R0000644000176200001440000002601414665530246015171 0ustar liggesusers#' Define the grid to compose plots in #' #' To control how different plots are laid out, you need to add a #' layout specification. If you are nesting grids, the layout is scoped to the #' current nesting level. An already set value can be removed by setting it to #' `NULL`. #' #' @param ncol,nrow The dimensions of the grid to create - if both are `NULL` it #' will use the same logic as [facet_wrap()][ggplot2::facet_wrap] to set the #' dimensions #' @param byrow Analogous to `byrow` in [matrix()][base::matrix]. If `FALSE` the #' plots will be filled in in column-major order #' @param widths,heights The relative widths and heights of each column and row #' in the grid. Will get repeated to match the dimensions of the grid. The #' special value of `NA`/`-1null` will behave as `1null` unless a fixed aspect #' plot is inserted in which case it will allow the dimension to expand or #' contract to match the aspect ratio of the content #' @param guides A string specifying how guides should be treated in the layout. #' `'collect'` will collect guides below to the given nesting level, removing #' duplicates. `'keep'` will stop collection at this level and let guides be #' placed alongside their plot. `auto` will allow guides to be collected if a #' upper level tries, but place them alongside the plot if not. If you modify #' default guide "position" with [theme(legend.position=...)][ggplot2::theme] #' while also collecting guides you must apply that change to the overall #' patchwork (see example). #' @param tag_level A string (`'keep'` or `'new'`) to indicate how #' auto-tagging should behave. See [plot_annotation()]. #' @param design Specification of the location of areas in the layout. Can either #' be specified as a text string or by concatenating calls to [area()] together. #' See the examples for further information on use. #' @param axes A string specifying how axes should be treated. `'keep'` will #' retain all axes in individual plots. `'collect'` will remove duplicated #' axes when placed in the same run of rows or columns of the layout. #' `'collect_x'` and `'collect_y'` will remove duplicated x-axes in the columns #' or duplicated y-axes in the rows respectively. #' @param axis_titles A string specifying how axis titltes should be treated. #' `'keep'` will retain all axis titles in individual plots. `'collect'` will #' remove duplicated titles in one direction and merge titles in the opposite #' direction. `'collect_x'` and `'collect_y'` control this for x-axis titles #' and y-axis titles respectively. #' #' @return A `plot_layout` object to be added to a `ggassmble` object #' #' @export #' #' @examples #' library(ggplot2) #' #' p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) #' p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) #' p3 <- ggplot(mtcars) + geom_bar(aes(gear)) + facet_wrap(~cyl) #' p4 <- ggplot(mtcars) + geom_bar(aes(carb)) #' p5 <- ggplot(mtcars) + geom_violin(aes(cyl, mpg, group = cyl)) #' #' # The plots are layed out automatically by default #' p1 + p2 + p3 + p4 + p5 #' #' # Use byrow to change how the grid is filled out #' p1 + p2 + p3 + p4 + p5 + plot_layout(byrow = FALSE) #' #' # Change the grid dimensions #' p1 + p2 + p3 + p4 + p5 + plot_layout(ncol = 2, widths = c(1, 2)) #' #' # Define layout at different nesting levels #' p1 + #' p2 + #' (p3 + #' p4 + #' plot_layout(ncol = 1) #' ) + #' p5 + #' plot_layout(widths = c(2, 1)) #' #' # Complex layouts can be created with the `design` argument #' design <- c( #' area(1, 1, 2), #' area(1, 2, 1, 3), #' area(2, 3, 3), #' area(3, 1, 3, 2), #' area(2, 2) #' ) #' p1 + p2 + p3 + p4 + p5 + plot_layout(design = design) #' #' \donttest{ #' # The same can be specified as a character string: #' design <- " #' 122 #' 153 #' 443 #' " #' p1 + p2 + p3 + p4 + p5 + plot_layout(design = design) #' #' # When using strings to define the design `#` can be used to denote empty #' # areas #' design <- " #' 1## #' 123 #' ##3 #' " #' p1 + p2 + p3 + plot_layout(design = design) #' } #' # Use guides="collect" to remove duplicate guides #' p6 <- ggplot(mtcars) + geom_point(aes(mpg, disp, color=cyl)) #' p7 <- ggplot(mtcars) + geom_point(aes(mpg, hp, color=cyl)) #' p6 + p7 + plot_layout(guides='collect') #' #' # Guide position must be applied to entire patchwork #' p6 + p7 + plot_layout(guides='collect') & #' theme(legend.position='bottom') plot_layout <- function(ncol = waiver(), nrow = waiver(), byrow = waiver(), widths = waiver(), heights = waiver(), guides = waiver(), tag_level = waiver(), design = waiver(), axes = waiver(), axis_titles = axes) { if (!is.null(guides) && !is_waiver(guides)) { guides <- arg_match0(guides, c('auto', 'collect', 'keep')) } if (!is.null(tag_level) && !is_waiver(tag_level)) { tag_level <- arg_match0(tag_level, c('keep', 'new')) } if (!is.null(axes) && !is_waiver(axes)) { axes <- arg_match0(axes, c('keep', 'collect', 'collect_x', 'collect_y')) } if (!is.null(axis_titles) && !is_waiver(axis_titles)) { collect_titles <- arg_match0(axis_titles, c('keep', 'collect', 'collect_x', 'collect_y')) } structure(list( ncol = ncol, nrow = nrow, byrow = byrow, widths = widths, heights = heights, guides = guides, tag_level = tag_level, axes = axes, axis_titles = axis_titles, design = if (is_waiver(design)) design else as_areas(design) ), class = 'plot_layout') } #' Specify a plotting area in a layout #' #' This is a small helper used to specify a single area in a rectangular grid #' that should contain a plot. Objects constructed with `area()` can be #' concatenated together with `c()` in order to specify multiple areas. #' #' The grid that the areas are specified in reference to enumerate rows from top #' to bottom, and coloumns from left to right. This means that `t` and `l` #' should always be less or equal to `b` and `r` respectively. Instead of #' specifying area placement with a combination of `area()` calls, it is #' possible to instead pass in a single string #' #' ``` #' areas <- c(area(1, 1, 2, 1), #' area(2, 3, 3, 3)) #' ``` #' #' is equivalent to #' #' ``` #' areas < -"A## #' A#B #' ##B" #' ``` #' #' For an example of this, see the [plot_layout()] examples. #' #' @param t,b The top and bottom bounds of the area in the grid #' @param l,r The left and right bounds of the area int the grid #' #' @return A `patch_area` object #' #' @export #' #' @examples #' library(ggplot2) #' #' p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) #' p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) #' p3 <- ggplot(mtcars) + geom_bar(aes(gear)) + facet_wrap(~cyl) #' #' layout <- c( #' area(1, 1), #' area(1, 3, 3), #' area(3, 1, 3, 2) #' ) #' #' # Show the layout to make sure it looks as it should #' plot(layout) #' #' # Apply it to a patchwork #' p1 + p2 + p3 + plot_layout(design = layout) #' area <- function(t, l, b = t, r = l) { if (missing(t) || missing(l)) { one_area <- list( t = integer(0), l = integer(0), b = integer(0), r = integer(0) ) } else { len <- max(length(t), length(l), length(b), length(r)) one_area <- list( t = rep_len(as.integer(t), len), l = rep_len(as.integer(l), len), b = rep_len(as.integer(b), len), r = rep_len(as.integer(r), len) ) if (any(t > b)) { cli_abort('{.arg t} must be less than {.arg b}') } if (any(l > r)) { cli_abort('{.arg l} must be less than {.arg r}') } } class(one_area) <- 'patch_area' one_area } #' @importFrom ggplot2 ggplot geom_rect aes scale_y_reverse scale_x_continuous labs theme_void theme element_line element_text margin #' @importFrom grid unit #' @export plot.patch_area <- function(x, y, ...) { area <- as.data.frame(unclass(x)) area$l <- area$l - 0.45 area$r <- area$r + 0.45 area$t <- area$t - 0.45 area$b <- area$b + 0.45 area$name <- as.factor(seq_len(nrow(area))) b_fun <- function(lim) { if (lim[1] < lim[2]) { lim <- seq(floor(lim[1]), ceiling(lim[2]), by = 1) } else { lim <- seq(ceiling(lim[1]), floor(lim[2]), by = -1) } lim[-c(1, length(lim))] } ggplot(area) + geom_rect(aes(xmin = l, xmax = r, ymin = t, ymax = b, fill = name), alpha = 0.3) + scale_y_reverse(breaks = b_fun, expand = c(0, 0.04)) + scale_x_continuous(breaks = b_fun, expand = c(0, 0.04), position = 'top') + labs(fill = 'Patch') + theme_void() + theme( panel.grid.minor = element_line(size = 0.5, colour = 'grey'), axis.text = element_text(), axis.ticks.length = unit(3, 'mm'), plot.margin = margin(10, 10, 10, 10) ) } utils::globalVariables(c( 'l', 'r', 't', 'b', 'name' )) as_areas <- function(x) { if (is.null(x)) return(NULL) if (is_area(x)) return(x) if (!is.character(x)) { cli_abort("Don't know how to convert {.cls {class(x)}} into area positions") } x <- strsplit(x, split = '\n')[[1]] x <- lapply(x, trimws) if (identical(x[[1]], '')) x[1] <- NULL if (identical(x[[length(x)]], '')) x[length(x)] <- NULL x <- lapply(x, function(x) strsplit(x, '')[[1]]) ncols <- vapply(x, length, integer(1)) if (length(unique(ncols)) != 1) { cli_abort("character layout must be rectangular") } row <- rep(seq_along(x), each = ncols[1]) col <- rep(seq_len(ncols[1]), length(x)) x <- unlist(x) area_names <- unique(sort(x)) area_names[area_names == '#'] <- NA x <- match(x, area_names) exec(c, !!!lapply(split(seq_along(x), x), function(i) { if (is.na(x[i[1]])) return(area()) area_rows <- range(row[i]) area_cols <- range(col[i]) if (!all(x[row >= area_rows[1] & row <= area_rows[2] & col >= area_cols[1] & col <= area_cols[2]] == x[i[1]])) { cli_abort('Patch areas must be rectangular') } area(area_rows[1], area_cols[1], area_rows[2], area_cols[2]) })) } is_area <- function(x) inherits(x, 'patch_area') #' @export length.patch_area <- function(x) length(x$t) #' @export print.patch_area <- function(x, ...) { cat(length(x), 'patch areas, spanning', max(x$r), 'columns and', max(x$b), 'rows\n\n') print(as.data.frame(unclass(x), row.names = paste0(seq_along(x), ': '))) } #' @export c.patch_area <- function(..., recursive = FALSE) { all_areas <- list(...) if (length(all_areas) == 0) return(area()) if (any(!vapply(all_areas, is_area, logical(1)))) { cli_abort('Areas can only be combined with each other') } area <- all_areas[[1]] area$t <- unlist(lapply(all_areas, `[[`, 't')) area$l <- unlist(lapply(all_areas, `[[`, 'l')) area$b <- unlist(lapply(all_areas, `[[`, 'b')) area$r <- unlist(lapply(all_areas, `[[`, 'r')) area } default_layout <- plot_layout( ncol = NULL, nrow = NULL, byrow = TRUE, widths = NA, heights = NA, guides = 'auto', tag_level = 'keep', design = NULL, axes = 'keep', axis_titles = 'keep' ) #' @importFrom utils modifyList #' @export ggplot_add.plot_layout <- function(object, plot, object_name) { plot <- as_patchwork(plot) do_change <- object[!vapply(object, is_waiver, logical(1))] plot$patches$layout[names(do_change)] <- do_change plot } patchwork/R/import-standalone-types-check.R0000644000176200001440000002761614466400451020475 0ustar liggesusers# Standalone file: do not edit by hand # Source: # ---------------------------------------------------------------------- # # --- # repo: r-lib/rlang # file: standalone-types-check.R # last-updated: 2023-03-13 # license: https://unlicense.org # dependencies: standalone-obj-type.R # imports: rlang (>= 1.1.0) # --- # # ## Changelog # # 2023-03-13: # - Improved error messages of number checkers (@teunbrand) # - Added `allow_infinite` argument to `check_number_whole()` (@mgirlich). # - Added `check_data_frame()` (@mgirlich). # # 2023-03-07: # - Added dependency on rlang (>= 1.1.0). # # 2023-02-15: # - Added `check_logical()`. # # - `check_bool()`, `check_number_whole()`, and # `check_number_decimal()` are now implemented in C. # # - For efficiency, `check_number_whole()` and # `check_number_decimal()` now take a `NULL` default for `min` and # `max`. This makes it possible to bypass unnecessary type-checking # and comparisons in the default case of no bounds checks. # # 2022-10-07: # - `check_number_whole()` and `_decimal()` no longer treat # non-numeric types such as factors or dates as numbers. Numeric # types are detected with `is.numeric()`. # # 2022-10-04: # - Added `check_name()` that forbids the empty string. # `check_string()` allows the empty string by default. # # 2022-09-28: # - Removed `what` arguments. # - Added `allow_na` and `allow_null` arguments. # - Added `allow_decimal` and `allow_infinite` arguments. # - Improved errors with absent arguments. # # # 2022-09-16: # - Unprefixed usage of rlang functions with `rlang::` to # avoid onLoad issues when called from rlang (#1482). # # 2022-08-11: # - Added changelog. # # nocov start # Scalars ----------------------------------------------------------------- .standalone_types_check_dot_call <- .Call check_bool <- function(x, ..., allow_na = FALSE, allow_null = FALSE, arg = caller_arg(x), call = caller_env()) { if (!missing(x) && .standalone_types_check_dot_call(ffi_standalone_is_bool_1.0.7, x, allow_na, allow_null)) { return(invisible(NULL)) } stop_input_type( x, c("`TRUE`", "`FALSE`"), ..., allow_na = allow_na, allow_null = allow_null, arg = arg, call = call ) } check_string <- function(x, ..., allow_empty = TRUE, allow_na = FALSE, allow_null = FALSE, arg = caller_arg(x), call = caller_env()) { if (!missing(x)) { is_string <- .rlang_check_is_string( x, allow_empty = allow_empty, allow_na = allow_na, allow_null = allow_null ) if (is_string) { return(invisible(NULL)) } } stop_input_type( x, "a single string", ..., allow_na = allow_na, allow_null = allow_null, arg = arg, call = call ) } .rlang_check_is_string <- function(x, allow_empty, allow_na, allow_null) { if (is_string(x)) { if (allow_empty || !is_string(x, "")) { return(TRUE) } } if (allow_null && is_null(x)) { return(TRUE) } if (allow_na && (identical(x, NA) || identical(x, na_chr))) { return(TRUE) } FALSE } check_name <- function(x, ..., allow_null = FALSE, arg = caller_arg(x), call = caller_env()) { if (!missing(x)) { is_string <- .rlang_check_is_string( x, allow_empty = FALSE, allow_na = FALSE, allow_null = allow_null ) if (is_string) { return(invisible(NULL)) } } stop_input_type( x, "a valid name", ..., allow_na = FALSE, allow_null = allow_null, arg = arg, call = call ) } IS_NUMBER_true <- 0 IS_NUMBER_false <- 1 IS_NUMBER_oob <- 2 check_number_decimal <- function(x, ..., min = NULL, max = NULL, allow_infinite = TRUE, allow_na = FALSE, allow_null = FALSE, arg = caller_arg(x), call = caller_env()) { if (missing(x)) { exit_code <- IS_NUMBER_false } else if (0 == (exit_code <- .standalone_types_check_dot_call( ffi_standalone_check_number_1.0.7, x, allow_decimal = TRUE, min, max, allow_infinite, allow_na, allow_null ))) { return(invisible(NULL)) } .stop_not_number( x, ..., exit_code = exit_code, allow_decimal = TRUE, min = min, max = max, allow_na = allow_na, allow_null = allow_null, arg = arg, call = call ) } check_number_whole <- function(x, ..., min = NULL, max = NULL, allow_infinite = FALSE, allow_na = FALSE, allow_null = FALSE, arg = caller_arg(x), call = caller_env()) { if (missing(x)) { exit_code <- IS_NUMBER_false } else if (0 == (exit_code <- .standalone_types_check_dot_call( ffi_standalone_check_number_1.0.7, x, allow_decimal = FALSE, min, max, allow_infinite, allow_na, allow_null ))) { return(invisible(NULL)) } .stop_not_number( x, ..., exit_code = exit_code, allow_decimal = FALSE, min = min, max = max, allow_na = allow_na, allow_null = allow_null, arg = arg, call = call ) } .stop_not_number <- function(x, ..., exit_code, allow_decimal, min, max, allow_na, allow_null, arg, call) { if (allow_decimal) { what <- "a number" } else { what <- "a whole number" } if (exit_code == IS_NUMBER_oob) { min <- min %||% -Inf max <- max %||% Inf if (min > -Inf && max < Inf) { what <- sprintf("%s between %s and %s", what, min, max) } else if (x < min) { what <- sprintf("%s larger than or equal to %s", what, min) } else if (x > max) { what <- sprintf("%s smaller than or equal to %s", what, max) } else { abort("Unexpected state in OOB check", .internal = TRUE) } } stop_input_type( x, what, ..., allow_na = allow_na, allow_null = allow_null, arg = arg, call = call ) } check_symbol <- function(x, ..., allow_null = FALSE, arg = caller_arg(x), call = caller_env()) { if (!missing(x)) { if (is_symbol(x)) { return(invisible(NULL)) } if (allow_null && is_null(x)) { return(invisible(NULL)) } } stop_input_type( x, "a symbol", ..., allow_na = FALSE, allow_null = allow_null, arg = arg, call = call ) } check_arg <- function(x, ..., allow_null = FALSE, arg = caller_arg(x), call = caller_env()) { if (!missing(x)) { if (is_symbol(x)) { return(invisible(NULL)) } if (allow_null && is_null(x)) { return(invisible(NULL)) } } stop_input_type( x, "an argument name", ..., allow_na = FALSE, allow_null = allow_null, arg = arg, call = call ) } check_call <- function(x, ..., allow_null = FALSE, arg = caller_arg(x), call = caller_env()) { if (!missing(x)) { if (is_call(x)) { return(invisible(NULL)) } if (allow_null && is_null(x)) { return(invisible(NULL)) } } stop_input_type( x, "a defused call", ..., allow_na = FALSE, allow_null = allow_null, arg = arg, call = call ) } check_environment <- function(x, ..., allow_null = FALSE, arg = caller_arg(x), call = caller_env()) { if (!missing(x)) { if (is_environment(x)) { return(invisible(NULL)) } if (allow_null && is_null(x)) { return(invisible(NULL)) } } stop_input_type( x, "an environment", ..., allow_na = FALSE, allow_null = allow_null, arg = arg, call = call ) } check_function <- function(x, ..., allow_null = FALSE, arg = caller_arg(x), call = caller_env()) { if (!missing(x)) { if (is_function(x)) { return(invisible(NULL)) } if (allow_null && is_null(x)) { return(invisible(NULL)) } } stop_input_type( x, "a function", ..., allow_na = FALSE, allow_null = allow_null, arg = arg, call = call ) } check_closure <- function(x, ..., allow_null = FALSE, arg = caller_arg(x), call = caller_env()) { if (!missing(x)) { if (is_closure(x)) { return(invisible(NULL)) } if (allow_null && is_null(x)) { return(invisible(NULL)) } } stop_input_type( x, "an R function", ..., allow_na = FALSE, allow_null = allow_null, arg = arg, call = call ) } check_formula <- function(x, ..., allow_null = FALSE, arg = caller_arg(x), call = caller_env()) { if (!missing(x)) { if (is_formula(x)) { return(invisible(NULL)) } if (allow_null && is_null(x)) { return(invisible(NULL)) } } stop_input_type( x, "a formula", ..., allow_na = FALSE, allow_null = allow_null, arg = arg, call = call ) } # Vectors ----------------------------------------------------------------- check_character <- function(x, ..., allow_null = FALSE, arg = caller_arg(x), call = caller_env()) { if (!missing(x)) { if (is_character(x)) { return(invisible(NULL)) } if (allow_null && is_null(x)) { return(invisible(NULL)) } } stop_input_type( x, "a character vector", ..., allow_na = FALSE, allow_null = allow_null, arg = arg, call = call ) } check_logical <- function(x, ..., allow_null = FALSE, arg = caller_arg(x), call = caller_env()) { if (!missing(x)) { if (is_logical(x)) { return(invisible(NULL)) } if (allow_null && is_null(x)) { return(invisible(NULL)) } } stop_input_type( x, "a logical vector", ..., allow_na = FALSE, allow_null = allow_null, arg = arg, call = call ) } check_data_frame <- function(x, ..., allow_null = FALSE, arg = caller_arg(x), call = caller_env()) { if (!missing(x)) { if (is.data.frame(x)) { return(invisible(NULL)) } if (allow_null && is_null(x)) { return(invisible(NULL)) } } stop_input_type( x, "a data frame", ..., allow_null = allow_null, arg = arg, call = call ) } # nocov end patchwork/R/arithmetic.R0000644000176200001440000001123214667775506014757 0ustar liggesusers#' Plot arithmetic #' #' In addition to the `+` operator known in `ggplot2`, `patchwork` defines logic #' for some of the other operators that aids in building up your plot #' composition and reduce code-reuse. #' #' @details #' `patchwork` augment the `+` operator from `ggplot2` and allows the user to #' add full `ggplot` objects together in order to compose them into the same #' view. The last added plot is always the active one where new geoms etc. are #' added to. Another operator that is much like it, but not quite, is `-`. It #' also adds plots together but instead of adding the right hand side to the #' patchwork defined in the left hand side, it puts the left hand side besides #' the right hand side in a patchwork. This might sound confusing, but in #' essence `-` ensures that the right and left side are put in the same nesting #' level (`+` puts the right side *into* the left side). Using `-` might seem #' unintuitive if you think of the operator as "subtract", but look at it as a #' hyphen instead (the underlying reason is that `-` is the only operator in the #' same precedence group as `+`). An alternative and more explicit way to get #' the same effect as `-` is to use `merge()` on the left hand side. #' #' Often you are interested in creating single column or single row layouts. #' `patchwork` provides `|` (besides) and `/` (over) operators to support #' stacking and packing of plots. See the examples for their use. #' #' In order to reduce code repetition `patchwork` provides two operators for #' adding ggplot elements (geoms, themes, facets, etc.) to multiple/all plots in #' a patchwork. `*` will add the element to all plots in the current nesting #' level, while `&` will recurse into nested patches. #' #' @param e1 A `ggplot` or `patchwork` object #' @param e2 A `ggplot` or `patchwork` object in case of `/`, or a `gg` object #' such as a geom or theme specification in case of `*` and `&` #' #' @return A `patchwork` object #' #' @name plot_arithmetic #' @rdname plot_arithmetic #' #' @examples #' library(ggplot2) #' #' p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) #' p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) #' p3 <- ggplot(mtcars) + geom_bar(aes(gear)) + facet_wrap(~cyl) #' p4 <- ggplot(mtcars) + geom_bar(aes(carb)) #' #' # Standard addition vs division #' p1 + p2 + p3 + plot_layout(ncol = 1) #' p1 + p2 - p3 + plot_layout(ncol = 1) #' #' # Stacking and packing #' (p1 | p2 | p3) / #' p4 #' #' # Add elements to the same nesting level #' (p1 + (p2 + p3) + p4 + plot_layout(ncol = 1)) * theme_bw() #' #' # Recurse into nested plots as well #' (p1 + (p2 + p3) + p4 + plot_layout(ncol = 1)) & theme_bw() #' NULL #' @importFrom grid is.grob #' @rdname plot_arithmetic #' @export "-.ggplot" <- function(e1, e2) { if (is.null(e2)) return(e1) if (is.null(e1)) return(e2) if (should_autowrap(e2)) e2 <- wrap_elements(full = e2) if (!is.ggplot(e2)) cli_abort("Only knows how to fold ggplot objects together") patchwork <- new_patchwork() if (is_patchwork(e2)) { plot <- plot_filler() patchwork$plots <- list(e1, e2) } else { plot <- e2 patchwork$plots <- list(e1) } add_patches(plot, patchwork) } #' @importFrom grid is.grob #' @rdname plot_arithmetic #' @export "/.ggplot" <- function(e1, e2) { if (is.null(e2)) return(e1) if (is.null(e1)) return(e2) if (should_autowrap(e2)) e2 <- wrap_elements(full = e2) if (!is_patchwork(e1)) { e1 + e2 + plot_layout(ncol = 1) } else if (!is.null(e1$patches$layout$ncol) && e1$patches$layout$ncol == 1) { e1 + e2 } else { e1 - e2 + plot_layout(ncol = 1) } } #' @importFrom grid is.grob #' @rdname plot_arithmetic #' @export "|.ggplot" <- function(e1, e2) { if (is.null(e2)) return(e1) if (is.null(e1)) return(e2) if (should_autowrap(e2)) e2 <- wrap_elements(full = e2) if (!is_patchwork(e1)) { e1 + e2 + plot_layout(nrow = 1) } else if (!is.null(e1$patches$layout$nrow) && e1$patches$layout$nrow == 1) { e1 + e2 } else { e1 - e2 + plot_layout(nrow = 1) } } #' @rdname plot_arithmetic #' @export "*.gg" <- function(e1, e2) { if (is.null(e2)) return(e1) if (is_patchwork(e1)) { e1$patches$plots <- lapply(e1$patches$plots, function(p) { if (!is_patchwork(p)) p <- p + e2 p }) } e1 + e2 } #' @rdname plot_arithmetic #' @importFrom ggplot2 is.theme #' @export "&.gg" <- function(e1, e2) { if (is.null(e2)) return(e1) if (is_patchwork(e1)) { if (is.theme(e2)) { e1$patches$annotation$theme <- e1$patches$annotation$theme + e2 } e1$patches$plots <- lapply(e1$patches$plots, function(p) { if (is_patchwork(p)) { p <- p & e2 } else { p <- p + e2 } p }) } e1 + e2 } patchwork/R/wrap_elements.R0000644000176200001440000001751114670012556015460 0ustar liggesusers#' Wrap arbitrary graphics in a patchwork-compliant patch #' #' In order to add non-ggplot2 element to a patchwork they can be #' converted to a compliant representation using the `wrap_elements()` function. #' This allows you to position either grobs, ggplot objects, patchwork #' objects, or even base graphics (if passed as a formula) in either the full #' area, the full plotting area (anything between and #' including the axis label), or the panel area (only the actual area where data #' is drawn). Further you can still add title, subtitle, tag, and caption using #' the same approach as with normal ggplots (using #' [ggtitle()][ggplot2::ggtitle] and [labs()][ggplot2::labs]) as well as styling #' using [theme()][ggplot2::theme]. For the latter, only the theme elements #' targeting plot margins and background as well as title, subtitle, etc styling #' will have an effect. If a patchwork or ggplot object is wrapped, it will be #' fixated in its state and will no longer respond to addition of styling, #' geoms, etc.. When grobs and formulas are added directly, they will implicitly #' be converted to `wrap_elements(full = x)`. #' #' @param panel,plot,full A grob, ggplot, patchwork, formula, raster, #' nativeRaster, or gt object to add to the respective area. #' #' @param clip Should the grobs be clipped if expanding outside its area #' #' @param ignore_tag Should tags be ignored for this patch. This is relevant #' when using automatic tagging of plots and the content of the patch does not #' qualify for a tag. #' #' @return A wrapped_patch object #' #' @export #' #' @examples #' library(ggplot2) #' library(grid) #' #' # Combine grobs with each other #' wrap_elements(panel = textGrob('Here are some text')) + #' wrap_elements( #' panel = rectGrob(gp = gpar(fill = 'steelblue')), #' full = rectGrob(gp = gpar(fill = 'goldenrod')) #' ) #' #' # wrapped elements can still get titles etc like ggplots #' wrap_elements(panel = textGrob('Here are some text')) + #' wrap_elements( #' panel = rectGrob(gp = gpar(fill = 'steelblue')), #' full = rectGrob(gp = gpar(fill = 'goldenrod')) #' ) + #' ggtitle('Title for the amazing rectangles') #' #' # You can also pass in ggplots or patchworks to e.g. have it fill out the #' # panel area #' p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) #' p1 + wrap_elements(panel = p1 + ggtitle('Look at me shrink')) #' #' # You can even add base graphics if you pass it as a formula (requires gridGraphics package) #' if (requireNamespace("gridGraphics", quietly = TRUE)) { #' p1 + wrap_elements(full = ~ plot(mtcars$mpg, mtcars$disp)) #' #' # Adding a grob or formula directly is equivalent to placing it in `full` #' p1 + ~ plot(mtcars$mpg, mtcars$disp) #' } #' wrap_elements <- function(panel = NULL, plot = NULL, full = NULL, clip = TRUE, ignore_tag = FALSE) { clip <- if (clip) 'on' else 'off' table <- make_patch() attr(table, 'grobs') <- list(panel = panel, plot = plot, full = full) attr(table, 'patch_settings') <- list(clip = clip, ignore_tag = ignore_tag) class(table) <- c('wrapped_patch', class(table)) table } is_wrapped_patch <- function(x) inherits(x, 'wrapped_patch') #' @importFrom ggplot2 ggplotGrob theme_get #' @importFrom gtable gtable_add_grob #' @importFrom grid grobHeight convertHeight #' @export patchGrob.wrapped_patch <- function(x, guides = 'auto') { gt <- ggplotGrob(x) table <- patch_table(x, gt) settings <- attr(x, 'patch_settings') grobs <- attr(x, 'grobs') if (!is.null(grobs$full)) { table <- gtable_add_grob(table, list(as_patch(grobs$full)), 1, 1, nrow(table), ncol(table), clip = settings$clip, name = 'full') } if (!is.null(grobs$plot)) { table <- gtable_add_grob(table, list(as_patch(grobs$plot)), PLOT_TOP, PLOT_LEFT, PLOT_BOTTOM, PLOT_RIGHT, clip = settings$clip, name = 'plot') } if (!is.null(grobs$panel)) { table <- gtable_add_grob(table, list(as_patch(grobs$panel)), PANEL_ROW, PANEL_COL, clip = settings$clip, name = 'panel') } title <- get_grob(gt, 'title') table <- gtable_add_grob(table, list(title), TITLE_ROW, PANEL_COL, clip = settings$clip, name = 'title') table$heights[TITLE_ROW] <- convertHeight(grobHeight(title), 'mm') subtitle <- get_grob(gt, 'subtitle') table <- gtable_add_grob(table, list(subtitle), SUBTITLE_ROW, PANEL_COL, clip = settings$clip, name = 'subtitle') table$heights[SUBTITLE_ROW] <- convertHeight(grobHeight(subtitle), 'mm') caption <- get_grob(gt, 'caption') table <- gtable_add_grob(table, list(caption), CAPTION_ROW, PANEL_COL, clip = settings$clip, name = 'caption') table$heights[CAPTION_ROW] <- convertHeight(grobHeight(caption), 'mm') if (!settings$ignore_tag) { table$widths[c(2, ncol(table)-1)] <- gt$widths[c(2, ncol(gt)-1)] table$heights[c(2, nrow(table)-1)] <- gt$heights[c(2, nrow(gt)-1)] tag <- get_grob(gt, 'tag') tag_pos <- calc_element("plot.tag.position", x$theme %||% theme_get()) if (is.null(tag_pos)) tag_pos <- theme_get()$plot.tag.position if (!is.character(tag_pos)) tag_pos <- 'manual' table <- switch( tag_pos, topleft = gtable_add_grob(table, tag, name = "tag", t = 2, l = 2, clip = "off"), top = gtable_add_grob(table, tag, name = "tag", t = 2, l = 2, r = ncol(table)-1, clip = "off"), topright = gtable_add_grob(table, tag, name = "tag", t = 2, l = ncol(table)-1, clip = "off"), left = gtable_add_grob(table, tag, name = "tag", t = 2, b = nrow(table)-1, l = 2, clip = "off"), right = gtable_add_grob(table, tag, name = "tag", t = 2, b = nrow(table)-1, l = ncol(table)-1, clip = "off"), bottomleft = gtable_add_grob(table, tag, name = "tag", t = nrow(table)-1, l = 2, clip = "off"), bottom = gtable_add_grob(table, tag, name = "tag", t = nrow(table)-1, l = 2, r = ncol(table)-1, clip = "off"), bottomright = gtable_add_grob(table, tag, name = "tag", t = nrow(table)-1, l = ncol(table)-1, clip = "off"), manual = gtable_add_grob(table, tag, name = 'tag', t = 2, l = 2, b = nrow(table)-1, r = ncol(table)-1, clip = "off") ) } table } as_patch <- function(x, ...) { UseMethod('as_patch') } #' @export as_patch.grob <- function(x, ...) { x } #' @importFrom grid gTree #' @export as_patch.gList <- function(x, ...) { gTree(children = x) } #' @importFrom ggplot2 ggplotGrob #' @export as_patch.ggplot <- function(x, ...) { ggplotGrob(x) } #' @export as_patch.patchwork <- function(x, ...) { patchworkGrob(x) } #' @export as_patch.formula <- function(x, ...) { rlang::check_installed('gridGraphics', 'to add base plots to patchworks') gp <- graphics::par(no.readonly = TRUE) plot_call <- function() { old_gp <- graphics::par(no.readonly = TRUE) graphics::par(gp) on.exit(try(graphics::par(old_gp))) res <- suppressMessages(eval(x[[2]], attr(x, '.Environment'))) invisible(NULL) } gridGraphics::echoGrob(plot_call, name = 'patchwork_base', device = offscreen_dev()) } #' @export #' @importFrom grid rasterGrob as_patch.raster <- function(x, ...) { as_patch(rasterGrob(x), ...) } #' @export as_patch.nativeRaster <- as_patch.raster #' @importFrom ggplot2 ggplotGrob get_grob <- function(x, name) { ind <- grep(paste0('^', name, '$'), x$layout$name) if (length(ind) == 0) return(ggplot2::zeroGrob()) x$grobs[[grep(paste0('^', name, '$'), x$layout$name)]] } offscreen_dev <- function() { if (requireNamespace('ragg', quietly = TRUE)) { function(width, height) { ragg::agg_capture(width = width, height = height, units = 'in') grDevices::dev.control("enable") } } else { function(width, height) { grDevices::pdf(NULL, width = width, height = height) grDevices::dev.control("enable") } } } #' @export has_tag.wrapped_patch <- function(x) !attr(x, 'patch_settings')$ignore_tag patchwork/R/free.R0000644000176200001440000000740514667764415013553 0ustar liggesusers#' Free a plot from various alignments #' #' While the purpose of patchwork is often to align plots by their various parts, #' sometimes this doesn't cut it and we want to compose plots without alignment. #' The `free()` function tells patchwork to treat the content (which can either #' be a ggplot or a patchwork) specially and not align it with the remaining #' plots in the composition. `free()` has various modes to control what type of #' "non-alignment" is applied (see Details). Further you can control which side #' of the plot the non-alignment is applied to. You can stack `free()` calls if #' you e.g. want the top part to not align to the panel and the left part to not #' align to the labels. #' #' @param x A ggplot or patchwork object #' @param type Which type of freeing should be applied. See the Details section #' @param side Which side should the freeing be applied to. A string containing #' one or more of "t", "r", "b", and "l" #' #' @return A modified version of `x` with a `free_plot` class #' #' @details #' `free()` has multiple modes depending on what you are needing: #' #' The default `"panel"` will allow the panel area to ignore alginment with the #' remaining plots and expand as much as needed to fill any empty space. #' #' The `"label"` type will instead free the axis label to keep its proximity to #' the axis, even if a longer axis text from another plot would push them apart. #' #' The `"space"` type also keeps axis and title together, but will instead not #' reserve any space for it. This allows the axis to occupy space in an #' otherwise empty area without making additional space available for itself. #' #' @importFrom ggplot2 is.ggplot #' @export #' #' @examples #' # Sometimes you have a plot that defies good composition alginment, e.g. due #' # to long axis labels #' library(ggplot2) #' p1 <- ggplot(mtcars) + #' geom_bar(aes(y = factor(gear), fill = factor(gear))) + #' scale_y_discrete( #' "", #' labels = c("3 gears are often enough", #' "But, you know, 4 is a nice number", #' "I would def go with 5 gears in a modern car") #' ) #' #' # When combined with other plots it ends up looking bad #' p2 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) #' #' p1 / p2 #' #' # We can fix this be using free (here, with the default "panel" type) #' free(p1) / p2 #' #' # If we still want the panels to be aligned to the right, we can choose to #' # free only the left side #' free(p1, side = "l") / p2 #' #' # We can still collect guides like before #' free(p1) / p2 + plot_layout(guides = "collect") #' #' # We could use "label" to fix the layout in a different way #' p1 / free(p2, "label") #' #' # Another issue is that long labels are not using already available free #' # space. #' plot_spacer() + p1 + p2 + p2 #' #' # This can be fixed with the "space" type #' plot_spacer() + free(p1, "space", "l") + p2 + p2 #' free <- function(x, type = c("panel", "label", "space"), side = "trbl") { check_object(x, function(x) is.ggplot(x) || is_patchwork(x), "a or object") type <- arg_match(type) side <- tolower(side) if (grepl("[^trbl]", side)) { abort("{.arg side} can only contain the t, r, b, and l characters: ") } side <- strsplit(side, "")[[1]] settings <- rep_along(side, type) names(settings) <- side attr_name <- if (is_patchwork(x)) "patchwork_free_settings" else "free_settings" old_settings <- attr(x, attr_name) %||% character() overlap <- names(old_settings) %in% names(settings) if (any(overlap)) { cli::cli_warn("Overwriting free settings for {names(old_settings)[overlap]}") old_settings <- old_settings[!overlap] } attr(x, attr_name) <- c(settings, old_settings) class(x) <- unique(c("free_plot", class(x))) merge(x) } is_free_plot <- function(x) inherits(x, "free_plot") patchwork/R/patchwork-package.r0000644000176200001440000000270614466376415016260 0ustar liggesusers#' @section Overview: #' The use and premise of `patchwork` is simple: Just add `ggplot2` plots #' together to compose multiplot layouts. Because of this simplicity there is #' not much more to say. Still, a few functions allow you to modify the #' behaviour, e.g.: #' #' - [plot_layout()] allows you to define the grid that plots are put into #' - [plot_annotation()] allows you to add titles, tags etc. #' #' @section Learn more: #' The guides below will teach you all about what you can do with patchwork. #' #' - [Getting Started](https://patchwork.data-imaginist.com/articles/patchwork.html) #' - [Assembling Plots](https://patchwork.data-imaginist.com/articles/guides/assembly.html) #' - [Defining Layouts](https://patchwork.data-imaginist.com/articles/guides/layout.html) #' - [Adding Annotation](https://patchwork.data-imaginist.com/articles/guides/annotation.html) #' - [Aligning across pages](https://patchwork.data-imaginist.com/articles/guides/multipage.html) #' #' @examples #' library(ggplot2) #' # You can add plots saved to variables #' #' p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) #' p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) #' #' p1 + p2 #' #' # Or build it up in one step #' ggplot(mtcars) + #' geom_point(aes(mpg, disp)) + #' ggplot(mtcars) + #' geom_boxplot(aes(gear, disp, group = gear)) #' #' @keywords internal "_PACKAGE" ## usethis namespace: start #' @import rlang #' @import cli ## usethis namespace: end NULL patchwork/R/plot_annotation.R0000644000176200001440000001744514665524526016042 0ustar liggesusershas_tag <- function(x) { UseMethod('has_tag') } #' Annotate the final patchwork #' #' The result of this function can be added to a patchwork using `+` in the same #' way as [plot_layout()], but unlike [plot_layout()] it will only have an #' effect on the top level plot. As the name suggests it controls different #' aspects of the annotation of the final plot, such as titles and tags. Already #' added annotations can be removed by setting the relevant argument to `NULL`. #' #' @details #' Tagging of subplots is done automatically and following the order of the #' plots as they are added. When the plot contains nested layouts the #' `tag_level` argument in the nested [plot_layout] will define whether #' enumeration should continue as usual or add a new level. The format of the #' levels are defined with `tag_levels` argument in `plot_annotation` #' #' @param title,subtitle,caption Text strings to use for the various plot #' annotations. #' #' @param tag_levels A character vector defining the enumeration format to use #' at each level. Possible values are `'a'` for lowercase letters, `'A'` for #' uppercase letters, `'1'` for numbers, `'i'` for lowercase Roman numerals, and #' `'I'` for uppercase Roman numerals. It can also be a list containing #' character vectors defining arbitrary tag sequences. If any element in the #' list is a scalar and one of `'a'`, `'A'`, `'1'`, `'i`, or `'I'`, this level #' will be expanded to the expected sequence. #' #' @param tag_prefix,tag_suffix Strings that should appear before or after the #' tag. #' #' @param tag_sep A separator between different tag levels #' #' @param theme A ggplot theme specification to use for the plot. Only elements #' related to the titles as well as plot margin and background is used. #' #' @return A `plot_annotation` object #' #' @export #' @importFrom ggplot2 waiver #' #' @examples #' library(ggplot2) #' #' p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) #' p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) #' p3 <- ggplot(mtcars) + geom_bar(aes(gear)) + facet_wrap(~cyl) #' #' # Add title, etc. to a patchwork #' p1 + p2 + plot_annotation('This is a title', caption = 'made with patchwork') #' #' # Change styling of patchwork elements #' p1 + p2 + #' plot_annotation( #' title = 'This is a title', #' caption = 'made with patchwork', #' theme = theme(plot.title = element_text(size = 16)) #' ) #' #' # Add tags to plots #' p1 / (p2 | p3) + #' plot_annotation(tag_levels = 'A') #' #' # Add multilevel tagging to nested layouts #' p1 / ((p2 | p3) + plot_layout(tag_level = 'new')) + #' plot_annotation(tag_levels = c('A', '1')) #' #' # Use a custom tag sequence (mixed with a standard one) #' p1 / ((p2 | p3) + plot_layout(tag_level = 'new')) + #' plot_annotation(tag_levels = list(c('&', '%'), '1')) #' plot_annotation <- function(title = waiver(), subtitle = waiver(), caption = waiver(), tag_levels = waiver(), tag_prefix = waiver(), tag_suffix = waiver(), tag_sep = waiver(), theme = waiver()) { th <- if (is.null(theme)) ggplot2::theme() else theme structure(list( title = title, subtitle = subtitle, caption = caption, tag_levels = tag_levels, tag_prefix = tag_prefix, tag_suffix = tag_suffix, tag_sep = tag_sep, theme = th ), class = 'plot_annotation') } default_annotation <- plot_annotation( title = NULL, subtitle = NULL, caption = NULL, tag_levels = character(), tag_prefix = '', tag_suffix = '', tag_sep = '', theme = NULL ) #' @importFrom utils modifyList #' @export ggplot_add.plot_annotation <- function(object, plot, object_name) { plot <- as_patchwork(plot) if (is.null(object$theme)) { plot$patches$annotation$theme <- NULL } else if (!is_waiver(object$theme)) { plot$patches$annotation$theme <- plot$patches$annotation$theme + object$theme } object$theme <- NULL do_change <- object[!vapply(object, is_waiver, logical(1))] plot$patches$annotation[names(do_change)] <- do_change plot } #' @importFrom ggplot2 is.ggplot labs recurse_tags <- function(x, levels, prefix, suffix, sep, offset = 1) { if (length(levels) == 0) return(list(patches = x, tab_ind = offset)) level <- get_level(levels[1]) patches <- x$patches$plots tag_ind <- offset for (i in seq_along(patches)) { this_level <- if (length(level) < tag_ind) '' else level[tag_ind] if (is_patchwork(patches[[i]])) { if (is_inset_patch(patches[[i]]) && !has_tag(patches[[i]])) { next } tag_level <- patches[[i]]$patches$layout$tag_level tag_level <- if (is.null(tag_level)) default_layout$tag_level else tag_level if (tag_level == 'keep') { new_plots <- recurse_tags(patches[[i]], levels, prefix, suffix, sep, tag_ind) patches[[i]] <- new_plots$patches tag_ind <- new_plots$tag_ind } else if (length(levels) > 1) { patches[[i]] <- recurse_tags(patches[[i]], levels[-1], prefix = paste0(prefix, this_level, sep), suffix, sep)$patches tag_ind <- tag_ind + 1 } } else if (has_tag(patches[[i]])) { patches[[i]] <- patches[[i]] + labs(tag = paste0(prefix, this_level, suffix)) tag_ind <- tag_ind + 1 } } x$patches$plots <- patches if (has_tag(x)) { this_level <- if (length(level) < tag_ind) '' else level[tag_ind] x <- x + labs(tag = paste0(prefix, this_level, suffix)) tag_ind <- tag_ind + 1 } list( patches = x, tag_ind = tag_ind ) } #' @importFrom ggplot2 ggplot labs ggplotGrob #' @importFrom gtable gtable_add_rows gtable_add_cols #' @importFrom grid unit #' @importFrom utils tail annotate_table <- function(table, annotation) { p <- ggplot() + annotation$theme + exec(labs, !!!annotation[c('title', 'subtitle', 'caption')]) p <- ggplotGrob(p) max_z <- max(table$layout$z) fix_respect <- is.matrix(table$respect) if (!is.null(annotation$title) || !is.null(annotation$subtitle)) { table <- gtable_add_rows(table, p$heights[c(1, 3, 4)], 0) table <- gtable_add_grob(table, get_grob(p, 'title'), 2, 2, r = ncol(table) - 1, z = max_z + 3, name = 'title', clip = 'off') table <- gtable_add_grob(table, get_grob(p, 'subtitle'), 3, 2, r = ncol(table) - 1, z = max_z + 2, name = 'subtitle', clip = 'off') if (fix_respect) table$respect <- rbind(matrix(0, nrow = 3, ncol = ncol(table$respect)), table$respect) } else { table <- gtable_add_rows(table, p$heights[1], 0) if (fix_respect) table$respect <- rbind(0, table$respect) } if (!is.null(annotation$caption)) { table <- gtable_add_rows(table, tail(p$heights, 3)[-2]) table <- gtable_add_grob(table, get_grob(p, 'caption'), nrow(table) - 1, 2, r = ncol(table) - 1, z = max_z + 1, name = 'caption', clip = 'off') if (fix_respect) table$respect <- rbind(table$respect, matrix(0, nrow = 2, ncol = ncol(table$respect))) } else { table <- gtable_add_rows(table, tail(p$heights, 1)) if (fix_respect) table$respect <- rbind(table$respect, 0) } table <- gtable_add_cols(table, p$widths[1], 0) table <- gtable_add_cols(table, tail(p$widths, 1)) if (fix_respect) table$respect <- cbind(0, table$respect, 0) table <- gtable_add_grob(table, get_grob(p, 'background'), 1, 1, nrow(table), ncol(table), z = -Inf, name = 'background') table } #' @importFrom utils as.roman get_level <- function(x) { if (is.list(x)) { if (length(x[[1]]) == 1 && x[[1]] %in% c('a', 'A', '1', 'i', 'I')) { x <- x[[1]] } else { return(x[[1]]) } } switch( as.character(x), a = letters, A = LETTERS, "1" = 1:100, i = tolower(as.roman(1:100)), I = as.roman(1:100), cli_abort('Unknown tag type: {.val {x}}') ) } patchwork/R/aaa.R0000644000176200001440000000160614665360406013337 0ustar liggesusers# Standard gtable layout TABLE_ROWS <- 18 TABLE_COLS <- 15 PANEL_ROW <- 10 PANEL_COL <- 8 PLOT_TOP <- 7 PLOT_BOTTOM <- 13 PLOT_LEFT <- 5 PLOT_RIGHT <- 11 TITLE_ROW <- 3 SUBTITLE_ROW <- 4 CAPTION_ROW <- 16 GUIDE_RIGHT <- 13 GUIDE_LEFT <- 3 GUIDE_TOP <- 5 GUIDE_BOTTOM <- 15 patchwork_namespace_link <- function() NULL check_object <- function(x, check_fun, what, ..., allow_null = FALSE, arg = caller_arg(x), call = caller_env()) { if (!missing(x)) { if (check_fun(x)) { return(invisible(NULL)) } if (allow_null && is_null(x)) { return(invisible(NULL)) } } stop_input_type( x, what, ..., allow_null = allow_null, arg = arg, call = call ) } is_waiver <- function(x) inherits(x, "waiver") patchwork/R/import-standalone-obj-type.R0000644000176200001440000002072714466400451020003 0ustar liggesusers# Standalone file: do not edit by hand # Source: # ---------------------------------------------------------------------- # # --- # repo: r-lib/rlang # file: standalone-obj-type.R # last-updated: 2023-05-01 # license: https://unlicense.org # imports: rlang (>= 1.1.0) # --- # # ## Changelog # # 2023-05-01: # - `obj_type_friendly()` now only displays the first class of S3 objects. # # 2023-03-30: # - `stop_input_type()` now handles `I()` input literally in `arg`. # # 2022-10-04: # - `obj_type_friendly(value = TRUE)` now shows numeric scalars # literally. # - `stop_friendly_type()` now takes `show_value`, passed to # `obj_type_friendly()` as the `value` argument. # # 2022-10-03: # - Added `allow_na` and `allow_null` arguments. # - `NULL` is now backticked. # - Better friendly type for infinities and `NaN`. # # 2022-09-16: # - Unprefixed usage of rlang functions with `rlang::` to # avoid onLoad issues when called from rlang (#1482). # # 2022-08-11: # - Prefixed usage of rlang functions with `rlang::`. # # 2022-06-22: # - `friendly_type_of()` is now `obj_type_friendly()`. # - Added `obj_type_oo()`. # # 2021-12-20: # - Added support for scalar values and empty vectors. # - Added `stop_input_type()` # # 2021-06-30: # - Added support for missing arguments. # # 2021-04-19: # - Added support for matrices and arrays (#141). # - Added documentation. # - Added changelog. # # nocov start #' Return English-friendly type #' @param x Any R object. #' @param value Whether to describe the value of `x`. Special values #' like `NA` or `""` are always described. #' @param length Whether to mention the length of vectors and lists. #' @return A string describing the type. Starts with an indefinite #' article, e.g. "an integer vector". #' @noRd obj_type_friendly <- function(x, value = TRUE) { if (is_missing(x)) { return("absent") } if (is.object(x)) { if (inherits(x, "quosure")) { type <- "quosure" } else { type <- class(x)[[1L]] } return(sprintf("a <%s> object", type)) } if (!is_vector(x)) { return(.rlang_as_friendly_type(typeof(x))) } n_dim <- length(dim(x)) if (!n_dim) { if (!is_list(x) && length(x) == 1) { if (is_na(x)) { return(switch( typeof(x), logical = "`NA`", integer = "an integer `NA`", double = if (is.nan(x)) { "`NaN`" } else { "a numeric `NA`" }, complex = "a complex `NA`", character = "a character `NA`", .rlang_stop_unexpected_typeof(x) )) } show_infinites <- function(x) { if (x > 0) { "`Inf`" } else { "`-Inf`" } } str_encode <- function(x, width = 30, ...) { if (nchar(x) > width) { x <- substr(x, 1, width - 3) x <- paste0(x, "...") } encodeString(x, ...) } if (value) { if (is.numeric(x) && is.infinite(x)) { return(show_infinites(x)) } if (is.numeric(x) || is.complex(x)) { number <- as.character(round(x, 2)) what <- if (is.complex(x)) "the complex number" else "the number" return(paste(what, number)) } return(switch( typeof(x), logical = if (x) "`TRUE`" else "`FALSE`", character = { what <- if (nzchar(x)) "the string" else "the empty string" paste(what, str_encode(x, quote = "\"")) }, raw = paste("the raw value", as.character(x)), .rlang_stop_unexpected_typeof(x) )) } return(switch( typeof(x), logical = "a logical value", integer = "an integer", double = if (is.infinite(x)) show_infinites(x) else "a number", complex = "a complex number", character = if (nzchar(x)) "a string" else "\"\"", raw = "a raw value", .rlang_stop_unexpected_typeof(x) )) } if (length(x) == 0) { return(switch( typeof(x), logical = "an empty logical vector", integer = "an empty integer vector", double = "an empty numeric vector", complex = "an empty complex vector", character = "an empty character vector", raw = "an empty raw vector", list = "an empty list", .rlang_stop_unexpected_typeof(x) )) } } vec_type_friendly(x) } vec_type_friendly <- function(x, length = FALSE) { if (!is_vector(x)) { abort("`x` must be a vector.") } type <- typeof(x) n_dim <- length(dim(x)) add_length <- function(type) { if (length && !n_dim) { paste0(type, sprintf(" of length %s", length(x))) } else { type } } if (type == "list") { if (n_dim < 2) { return(add_length("a list")) } else if (is.data.frame(x)) { return("a data frame") } else if (n_dim == 2) { return("a list matrix") } else { return("a list array") } } type <- switch( type, logical = "a logical %s", integer = "an integer %s", numeric = , double = "a double %s", complex = "a complex %s", character = "a character %s", raw = "a raw %s", type = paste0("a ", type, " %s") ) if (n_dim < 2) { kind <- "vector" } else if (n_dim == 2) { kind <- "matrix" } else { kind <- "array" } out <- sprintf(type, kind) if (n_dim >= 2) { out } else { add_length(out) } } .rlang_as_friendly_type <- function(type) { switch( type, list = "a list", NULL = "`NULL`", environment = "an environment", externalptr = "a pointer", weakref = "a weak reference", S4 = "an S4 object", name = , symbol = "a symbol", language = "a call", pairlist = "a pairlist node", expression = "an expression vector", char = "an internal string", promise = "an internal promise", ... = "an internal dots object", any = "an internal `any` object", bytecode = "an internal bytecode object", primitive = , builtin = , special = "a primitive function", closure = "a function", type ) } .rlang_stop_unexpected_typeof <- function(x, call = caller_env()) { abort( sprintf("Unexpected type <%s>.", typeof(x)), call = call ) } #' Return OO type #' @param x Any R object. #' @return One of `"bare"` (for non-OO objects), `"S3"`, `"S4"`, #' `"R6"`, or `"R7"`. #' @noRd obj_type_oo <- function(x) { if (!is.object(x)) { return("bare") } class <- inherits(x, c("R6", "R7_object"), which = TRUE) if (class[[1]]) { "R6" } else if (class[[2]]) { "R7" } else if (isS4(x)) { "S4" } else { "S3" } } #' @param x The object type which does not conform to `what`. Its #' `obj_type_friendly()` is taken and mentioned in the error message. #' @param what The friendly expected type as a string. Can be a #' character vector of expected types, in which case the error #' message mentions all of them in an "or" enumeration. #' @param show_value Passed to `value` argument of `obj_type_friendly()`. #' @param ... Arguments passed to [abort()]. #' @inheritParams args_error_context #' @noRd stop_input_type <- function(x, what, ..., allow_na = FALSE, allow_null = FALSE, show_value = TRUE, arg = caller_arg(x), call = caller_env()) { # From standalone-cli.R cli <- env_get_list( nms = c("format_arg", "format_code"), last = topenv(), default = function(x) sprintf("`%s`", x), inherit = TRUE ) if (allow_na) { what <- c(what, cli$format_code("NA")) } if (allow_null) { what <- c(what, cli$format_code("NULL")) } if (length(what)) { what <- oxford_comma(what) } if (inherits(arg, "AsIs")) { format_arg <- identity } else { format_arg <- cli$format_arg } message <- sprintf( "%s must be %s, not %s.", format_arg(arg), what, obj_type_friendly(x, value = show_value) ) abort(message, ..., call = call, arg = arg) } oxford_comma <- function(chr, sep = ", ", final = "or") { n <- length(chr) if (n < 2) { return(chr) } head <- chr[seq_len(n - 1)] last <- chr[n] head <- paste(head, collapse = sep) # Write a or b. But a, b, or c. if (n > 2) { paste0(head, sep, final, " ", last) } else { paste0(head, " ", final, " ", last) } } # nocov end patchwork/R/patch.R0000644000176200001440000000470714545547771013732 0ustar liggesusers#' @importFrom gtable gtable gtable_add_grob #' @importFrom grid unit #' @importFrom ggplot2 zeroGrob ggplot make_patch <- function() { widths <- unit(rep(0, TABLE_COLS), 'mm') widths[PANEL_COL] <- unit(1, 'null') heights <- unit(rep(0, TABLE_ROWS), 'mm') heights[PANEL_ROW] <- unit(1, 'null') table <- gtable(widths, heights) # Mark the panel patch table <- gtable_add_grob(table, list(zeroGrob()), PANEL_ROW, PANEL_COL, z = -Inf, name = 'panel_patch') class(table) <- c('patchgrob', class(table)) patch <- ggplot() class(patch) <- c('patch', class(patch)) attr(patch, 'table') <- table patch } is_patch <- function(x) inherits(x, 'patch') is_patchgrob <- function(x) inherits(x, 'patchgrob') #' @importFrom ggplot2 ggplotGrob #' @importFrom gtable gtable_add_grob patch_table <- function(x, grob = NULL) { table <- attr(x, 'table') if (is.null(grob)) grob <- ggplotGrob(x) table$widths[c(1, ncol(table))] <- grob$widths[c(1, ncol(grob))] table$heights[c(1, nrow(table))] <- grob$heights[c(1, nrow(grob))] gtable_add_grob(table, grob$grobs[grep('background', grob$layout$name)], 1, 1, nrow(table), ncol(table), z = -100, clip = 'on', name = 'background') } #' Get a grob describing the content of a patch object #' #' Methods for this generic should be defined for all `patch` subclasses #' and should return a compliant `gtable` object ready to be combined with #' regular plot objects. In general it is best to call `patch_table()` on the #' object and add grobs to this as `patch_table()` will return a compliant #' `gtable` #' #' @param x An `patch` object #' #' @return A `gtable` object #' #' @export #' @keywords internal #' patchGrob <- function(x, guides = 'auto') { UseMethod('patchGrob') } #' @export patchGrob.patch <- function(x, guides = 'auto') patch_table(x) #' @importFrom grid grid.newpage grid.draw seekViewport pushViewport upViewport #' @export print.patch <- function(x, newpage = is.null(vp), vp = NULL, ...) { if (newpage) grid.newpage() grDevices::recordGraphics( requireNamespace("patchwork", quietly = TRUE), list(), getNamespace("patchwork") ) gt <- patchGrob(x) if (is.null(vp)) { grid.draw(gt) } else { if (is.character(vp)) { seekViewport(vp) } else { pushViewport(vp) } grid.draw(gt) upViewport() } invisible(x) } #' @export plot.patch <- print.patch #' @export has_tag.ggplot <- function(x) !is_empty(x) patchwork/R/plot_patchwork.R0000644000176200001440000013260714670774554015674 0ustar liggesusers#' @importFrom grid grid.newpage grid.draw seekViewport pushViewport upViewport #' @importFrom utils modifyList #' @importFrom ggplot2 set_last_plot #' @export print.patchwork <- function(x, newpage = is.null(vp), vp = NULL, ...) { if (newpage) grid.newpage() grDevices::recordGraphics( requireNamespace("patchwork", quietly = TRUE), list(), getNamespace("patchwork") ) annotation <- modifyList( default_annotation, x$patches$annotation[!vapply(x$patches$annotation, is.null, logical(1))] ) x <- recurse_tags(x, annotation$tag_levels, annotation$tag_prefix, annotation$tag_suffix, annotation$tag_sep)$patches plot <- get_patches(x) gtable <- build_patchwork(plot, plot$layout$guides %||% 'auto') gtable <- annotate_table(gtable, annotation) set_last_plot(x) if (!is.null(vp)) { if (is.character(vp)) { seekViewport(vp) } else { pushViewport(vp) } } tryCatch( grid.draw(gtable), error = function(e) { if (inherits(e, 'simpleError') && deparse(conditionCall(e)[[1]]) == 'grid.Call') { if (Sys.getenv("RSTUDIO") == "1") { cli_abort(c("The RStudio {.field Plots} window may be too small to show this patchwork.", i = "Please make the window larger.") ) } else { cli_abort(c("The viewport may be too small to show this patchwork.", i = "Please make the window larger.") ) } } } ) if (!is.null(vp)) { upViewport() } invisible(x) } #' @export plot.patchwork <- print.patchwork #' @export length.patchwork <- function(x) { length(x$patches$plots) + !is_empty(x) } #' @export names.patchwork <- function(x) NULL #' @export `[[.patchwork` <- function(x, ..., exact = TRUE) { ind <- ..1 if (!is.numeric(ind)) { cli_abort('Patchworks can only be indexed with numeric indices') } n_patches <- length(x$patches$plots) if (!is_empty(x) && ind[1] == n_patches + 1) { plot <- x plot$patches <- NULL class(plot) <- setdiff(class(plot), 'patchwork') } else { if (ind > n_patches) { cli_abort('Index out of bounds') } plot <- x$patches$plots[[ind[1]]] } if (length(ind) > 1) { if (!is_patchwork(plot)) { cli_abort('Can only do nested indexing into patchworks') } plot <- plot[[ind[-1]]] } plot } #' @export `[[<-.patchwork` <- function(x, ..., value) { ind <- ..1 if (!is.numeric(ind)) { cli_abort('Patchworks can only be indexed with numeric indices') } if (!is.ggplot(value)) { value <- wrap_elements(value) } n_patches <- length(x$patches$plots) if (!is_empty(x) && ind == n_patches + 1) { if (length(ind) != 1) { cli_abort('Can only do nested indexing into patchworks') } return(add_patches(value, x$patches)) } if (length(ind) > 1) { if (!is_patchwork(x$patches$plots[[ind[1]]])) { cli_abort('Can only do nested indexing into patchworks') } x$patches$plots[[ind[1]]][[ind[-1]]] <- value } else { x$patches$plots[[ind]] <- value } x } #' @export as.list.patchwork <- function(x, ...) { get_patches(x)$plots } #' @importFrom utils str #' @export str.patchwork <- function(object, ...) { n_patches <- length(object$patches$plots) if (!is_empty(object)) n_patches <- n_patches + 1 cat('A patchwork composed of ', n_patches, ' patches\n', sep = '') cat('- Autotagging is turned ', if (is.null(object$patches$annotation$tag_levels)) 'off' else 'on', '\n', sep = '') cat('- Guides are ', if (isTRUE(object$patches$layout$guides == 'collect')) 'collected' else 'kept', '\n', sep = '') cat('\n') cat('Layout:\n') if (is.null(object$layout$design)) { l <- object$layout if (is.null(l$ncol) && !is.null(l$widths) && length(l$widths) > 1) { l$ncol <- length(l$widths) } if (is.null(l$nrow) && !is.null(l$heights) && length(l$heights) > 1) { l$nrow <- length(l$heights) } dims <- wrap_dims(n_patches, nrow = l$nrow, ncol = l$ncol) print(create_design(dims[2], dims[1], isTRUE(l$byrow))) } else { print(object$layout$design) } } #' @importFrom ggplot2 ggplot_build ggplot_gtable panel_rows panel_cols wrap_dims #' @importFrom gtable gtable #' @importFrom grid unit unit.pmax is.unit #' @importFrom utils modifyList #' @importFrom stats na.omit build_patchwork <- function(x, guides = 'auto') { x$layout <- modifyList(default_layout, x$layout[!vapply(x$layout, is.null, logical(1))]) guides <- if (guides == 'collect' && x$layout$guides != 'keep') { 'collect' } else { x$layout$guides } gt <- lapply(x$plots, plot_table, guides = guides) guide_grobs <- unlist(lapply(gt, `[[`, 'collected_guides'), recursive = FALSE) gt <- lapply(gt, simplify_gt) gt <- add_insets(gt) fixed_asp <- vapply(gt, function(x) isTRUE(x$respect), logical(1)) if (is.null(x$layout$design)) { if (is.null(x$layout$ncol) && !is.null(x$layout$widths) && length(x$layout$widths) > 1) { x$layout$ncol <- length(x$layout$widths) } if (is.null(x$layout$nrow) && !is.null(x$layout$heights) && length(x$layout$heights) > 1) { x$layout$nrow <- length(x$layout$heights) } dims <- wrap_dims(length(gt), nrow = x$layout$nrow, ncol = x$layout$ncol) x$layout$design <- create_design(dims[2], dims[1], isTRUE(x$layout$byrow)) } else { dims <- c( max(x$layout$design$b), max(x$layout$design$r) ) } gt_new <- gtable(unit(rep(0, TABLE_COLS * dims[2]), 'null'), unit(rep(0, TABLE_ROWS * dims[1]), 'null')) design <- as.data.frame(unclass(x$layout$design)) if (nrow(design) < length(gt)) { warning('Too few patch areas to hold all plots. Dropping plots', call. = FALSE) gt <- gt[seq_len(nrow(design))] fixed_asp <- fixed_asp[seq_len(nrow(design))] } else { design <- design[seq_along(gt), ] } if (any(design$t < 1)) design$t[design$t < 1] <- 1 if (any(design$l < 1)) design$l[design$l < 1] <- 1 if (any(design$b > dims[1])) design$b[design$b > dims[1]] <- dims[1] if (any(design$r > dims[2])) design$r[design$r > dims[2]] <- dims[2] max_z <- lapply(gt, function(x) max(x$layout$z)) max_z <- c(0, cumsum(max_z)) gt_new$layout <- exec(rbind, !!!lapply(seq_along(gt), function(i) { loc <- design[i, ] lay <- gt[[i]]$layout lay$z <- lay$z + ifelse(lay$name == "background", 0, max_z[i]) lay$t <- lay$t + ifelse(lay$t <= PANEL_ROW, (loc$t - 1) * TABLE_ROWS, (loc$b - 1) * TABLE_ROWS) lay$l <- lay$l + ifelse(lay$l <= PANEL_COL, (loc$l - 1) * TABLE_COLS, (loc$r - 1) * TABLE_COLS) lay$b <- lay$b + ifelse(lay$b < PANEL_ROW, (loc$t - 1) * TABLE_ROWS, (loc$b - 1) * TABLE_ROWS) lay$r <- lay$r + ifelse(lay$r < PANEL_COL, (loc$l - 1) * TABLE_COLS, (loc$r - 1) * TABLE_COLS) lay$name <- paste0(lay$name, '-', i) lay })) table_dimensions <- table_dims( lapply(gt, `[[`, 'widths'), lapply(gt, `[[`, 'heights'), design, dims[2], dims[1] ) gt_new$grobs <- set_grob_sizes(gt, table_dimensions$widths, table_dimensions$heights, design) gt_new$widths <- table_dimensions$widths gt_new$heights <- table_dimensions$heights widths <- rep(x$layout$widths, length.out = dims[2]) heights <- rep(x$layout$heights, length.out = dims[1]) gt_new <- set_panel_dimensions(gt_new, gt, widths, heights, fixed_asp, design) if (x$layout$guides == 'collect') { guide_grobs <- collapse_guides(guide_grobs) if (length(guide_grobs) != 0) { theme <- x$annotation$theme if (!attr(theme, 'complete')) { theme <- theme_get() + theme } position <- theme$legend.position %||% "right" if (length(position) == 2) { warning("Manual legend position not possible for collected guides. Defaulting to 'right'", call. = FALSE) position <- "right" } guide_grobs <- assemble_guides(guide_grobs, position, theme) gt_new <- attach_guides(gt_new, guide_grobs, position, theme) } } else { gt_new$collected_guides <- guide_grobs } axes <- x$layout$axes %||% default_layout$axes if (axes %in% c('collect', 'collect_x')) { gt_new <- collect_axes(gt_new, "x") } if (axes %in% c('collect', 'collect_y')) { gt_new <- collect_axes(gt_new, "y") } titles <- x$layout$axis_titles %||% default_layout$axis_titles if (titles %in% c('collect', 'collect_x')) { gt_new <- collect_axis_titles(gt_new, "x", merge = TRUE) } if (titles %in% c('collect', 'collect_y')) { gt_new <- collect_axis_titles(gt_new, "y", merge = TRUE) } gt_new <- gtable_add_grob( gt_new, zeroGrob(), t = PANEL_ROW, l = PANEL_COL, b = PANEL_ROW + TABLE_ROWS * (dims[1] - 1), r = PANEL_COL + TABLE_COLS * (dims[2] - 1), z = -1, name = "panel-area" ) class(gt_new) <- c('gtable_patchwork', class(gt_new)) gt_new } #' Convert a patchwork to a gtable #' #' This function is the patchwork analogue of [ggplot2::ggplotGrob()] in that it #' takes an unevaluated patchwork object and fixate it into a gtable object to #' further manipulate directly. #' #' @param x A `patchwork` object #' #' @return A `gtable` object #' #' @keywords internal #' @importFrom utils modifyList #' @export #' patchworkGrob <- function(x) { annotation <- modifyList( default_annotation, x$patches$annotation[!vapply(x$patches$annotation, is.null, logical(1))] ) x <- recurse_tags(x, annotation$tag_levels, annotation$tag_prefix, annotation$tag_suffix, annotation$tag_sep)$patches plot <- get_patches(x) gtable <- build_patchwork(plot) gtable <- annotate_table(gtable, annotation) class(gtable) <- setdiff(class(gtable), 'gtable_patchwork') gtable } plot_table <- function(x, guides) { UseMethod('plot_table') } #' @importFrom ggplot2 ggplotGrob #' @export plot_table.ggplot <- function(x, guides) { gt <- ggplotGrob(x) gt <- add_strips(gt) add_guides(gt, guides == 'collect') } #' @export plot_table.patchwork <- function(x, guides) { if (is_free_plot(x)) { plot_table.free_plot(x, guides) } else { build_patchwork(get_patches(x), guides) } } #' @export plot_table.patch <- function(x, guides) { patchGrob(x, guides) } #' @export plot_table.inset_patch <- function(x, guides) { settings <- attr(x, 'inset_settings') class(x) <- setdiff(class(x), 'inset_patch') table <- plot_table(x, guides) table$vp <- viewport(x = settings$left, y = settings$bottom, width = settings$right - settings$left, height = settings$top - settings$bottom, just = c(0, 0)) attr(table, 'inset_settings') <- settings class(table) <- c('inset_table', class(table)) table } #' @export plot_table.free_plot <- function(x, guides) { if (is_patchwork(x)) { settings <- attr(x, 'patchwork_free_settings') # We do this directly because the last plot in the patchwork might be free # so we don't want to remove the free class and dispatch table <- build_patchwork(get_patches(x), guides) } else { settings <- attr(x, 'free_settings') class(x) <- setdiff(class(x), 'free_plot') table <- plot_table(x, guides) } attr(table, 'free_settings') <- settings class(table) <- c('free_table', class(table)) table } simplify_gt <- function(gt) { UseMethod('simplify_gt') } #' @importFrom gtable gtable_add_grob gtable_add_rows gtable_add_cols #' @importFrom ggplot2 find_panel #' @importFrom grid unit convertWidth convertHeight #' @export simplify_gt.gtable <- function(gt) { guides <- gt$collected_guides gt$collected_guides <- NULL panel_pos <- find_panel(gt) rows <- c(panel_pos$t, panel_pos$b) cols <- c(panel_pos$l, panel_pos$r) if (!gt$respect && rows[1] == rows[2] && cols[1] == cols[2] && !any(grepl('^strip-', gt$layout$name))) { gt$widths <- convertWidth(gt$widths, 'mm') gt$heights <- convertHeight(gt$heights, 'mm') return(gt) } p_rows <- seq(rows[1], rows[2]) p_cols <- seq(cols[1], cols[2]) panels <- gt[p_rows, p_cols] gt_new <- gt[-p_rows, -p_cols] gt_new$widths <- convertWidth(gt$widths[-p_cols], 'mm') if (all(is_abs_unit(gt$widths[p_cols]))) { new_width <- sum(convertWidth(gt$widths[p_cols], 'mm')) } else { new_width <- unit(1, 'null') } gt_new$heights <- convertHeight(gt$heights[-p_rows], 'mm') if (all(is_abs_unit(gt$heights[p_rows]))) { new_height <- sum(convertHeight(gt$heights[p_rows], 'mm')) } else { new_height <- unit(1, 'null') } gt_new <- gtable_add_rows(gt_new, new_height, rows[1] - 1) gt_new <- gtable_add_cols(gt_new, new_width, cols[1] - 1) if (gt$respect) { gt_new <- simplify_fixed(gt, gt_new, panels, rows, cols) } else { gt_new <- simplify_free(gt, gt_new, panels, rows, cols) } gt_new$collected_guides <- guides gt_new } #' @importFrom grid unit.c unit #' @importFrom ggplot2 find_panel #' @importFrom gtable gtable gtable_add_grob #' @export simplify_gt.gtable_patchwork <- function(gt) { guides <- gt$collected_guides gt$collected_guides <- NULL panel_pos <- find_panel(gt) if (all(is_abs_unit(gt$widths[panel_pos$l:panel_pos$r]))) { new_width <- sum(convertWidth(gt$widths[panel_pos$l:panel_pos$r], 'mm')) } else { new_width <- unit(1, 'null') } if (all(is_abs_unit(gt$heights[panel_pos$t:panel_pos$b]))) { new_height <- sum(convertHeight(gt$widths[panel_pos$t:panel_pos$b], 'mm')) } else { new_height <- unit(1, 'null') } widths <- unit.c(gt$widths[seq_len(panel_pos$l - 1)], new_width, gt$widths[seq(panel_pos$r + 1, ncol(gt))]) heights <- unit.c(gt$heights[seq_len(panel_pos$t - 1)], new_height, gt$heights[seq(panel_pos$b + 1, nrow(gt))]) gt_new <- gtable(widths = widths, heights = heights) gt_new <- gtable_add_grob(gt_new, zeroGrob(), PANEL_ROW, PANEL_COL, name = 'panel-nested-patchwork') gt_new <- gtable_add_grob(gt_new, gt, 1, 1, nrow(gt_new), ncol(gt_new), clip = 'off', name = 'patchwork-table') class(gt_new) <- c('gtable_patchwork_simple', class(gt_new)) gt_new$collected_guides <- guides gt_new } #' @export simplify_gt.patchgrob <- function(gt) gt #' @export simplify_gt.inset_table <- function(gt) gt #' @export simplify_gt.free_table <- function(gt) { settings <- attr(gt, "free_settings") settings <- split(names(settings), settings) gt_new <- NextMethod() if (!is.null(settings$label)) { gt_new <- free_label(gt_new, c("t", "r", "b", "l") %in% settings$label) } if (!is.null(settings$space)) { gt_new <- free_space(gt_new, c("t", "r", "b", "l") %in% settings$space) } if (!is.null(settings$panel)) { gt_new <- free_panel(gt_new, c("t", "r", "b", "l") %in% settings$panel) } gt_new } #' @importFrom gtable gtable_add_grob is.gtable #' @importFrom grid viewport simplify_free <- function(gt, gt_new, panels, rows, cols) { p_cols <- seq(cols[1], cols[2]) if (length(p_cols) == 1) { top <- which(gt$layout$l == p_cols & gt$layout$r == p_cols & gt$layout$b < rows[1]) gt_new <- gtable_add_grob(gt_new, gt$grobs[top], gt$layout$t[top], p_cols, gt$layout$b[top], z = gt$layout$z[top], clip = gt$layout$clip[top], name = gt$layout$name[top]) bottom <- which(gt$layout$l == p_cols & gt$layout$r == p_cols & gt$layout$t > rows[2]) b_mod <- rows[2] - rows[1] gt_new <- gtable_add_grob(gt_new, gt$grobs[bottom], gt$layout$t[bottom] - b_mod, p_cols, gt$layout$b[bottom] - b_mod, z = gt$layout$z[bottom], clip = gt$layout$clip[bottom], name = gt$layout$name[bottom]) t_strips <- grepl('^strip-t-', gt_new$layout$name) if (any(t_strips)) { gt_new$grobs[t_strips] <- lapply(gt_new$grobs[t_strips], function(g) { if (is.gtable(g)) { g$vp <- viewport(y = 0, just = 'bottom', height = sum(g$heights)) } g }) } b_strips <- grepl('^strip-b-', gt_new$layout$name) if (any(b_strips)) { gt_new$grobs[b_strips] <- lapply(gt_new$grobs[b_strips], function(g) { if (is.gtable(g)) { g$vp <- viewport(y = 1, just = 'top', height = sum(g$heights)) } g }) } } else { for (i in seq_len(nrow(gt))) { if (i >= rows[1]) { if (i <= rows[2]) next ii <- i - diff(rows) pos <- 'bottom' } else { ii <- i pos <- 'top' } table <- gt[i, p_cols] if (length(table$grobs) != 0) { grobname <- paste(table$layout$name, collapse = ', ') if (pos == 'top') { table$vp <- viewport(y = 0, just = 'bottom', height = table$heights) } else { table$vp <- viewport(y = 1, just = 'top', height = table$heights) } gt_new <- gtable_add_grob(gt_new, table, ii, cols[1], clip = 'off', name = grobname, z = max(table$layout$z)) } } } p_rows <- seq(rows[1], rows[2]) if (length(p_rows) == 1) { left <- which(gt$layout$t == p_rows & gt$layout$b == p_rows & gt$layout$r < cols[1]) gt_new <- gtable_add_grob(gt_new, gt$grobs[left], p_rows, gt$layout$l[left], p_rows, gt$layout$r[left], z = gt$layout$z[left], clip = gt$layout$clip[left], name = gt$layout$name[left]) right <- which(gt$layout$t == p_rows & gt$layout$b == p_rows & gt$layout$l > cols[2]) r_mod <- cols[2] - cols[1] gt_new <- gtable_add_grob(gt_new, gt$grobs[right], p_rows, gt$layout$l[right] - r_mod, p_rows, gt$layout$r[right] - r_mod, z = gt$layout$z[right], clip = gt$layout$clip[right], name = gt$layout$name[right]) l_strips <- grepl('^strip-l-', gt_new$layout$name) if (any(l_strips)) { gt_new$grobs[l_strips] <- lapply(gt_new$grobs[l_strips], function(g) { if (is.gtable(g)) { g$vp <- viewport(x = 1, just = 'right', width = sum(g$widths)) } g }) } r_strips <- grepl('^strip-r-', gt_new$layout$name) if (any(r_strips)) { gt_new$grobs[r_strips] <- lapply(gt_new$grobs[r_strips], function(g) { if (is.gtable(g)) { g$vp <- viewport(x = 0, just = 'left', width = sum(g$widths)) } g }) } } else { for (i in seq_len(ncol(gt))) { if (i >= cols[1]) { if (i <= cols[2]) next ii <- i - diff(cols) pos <- 'right' } else { ii <- i pos <- 'left' } table <- gt[p_rows, i] if (length(table$grobs) != 0) { grobname <- paste(table$layout$name, collapse = ', ') if (pos == 'left') { table$vp <- viewport(x = 1, just = 'right', width = table$widths) } else { table$vp <- viewport(x = 0, just = 'left', width = table$widths) } gt_new <- gtable_add_grob(gt_new, table, rows[1], ii, clip = 'off', name = grobname, z = max(table$layout$z)) } } } panel_name <- paste0('panel; ', paste(panels$layout$name, collapse = ', ')) gtable_add_grob(gt_new, panels, rows[1], cols[1], clip = 'off', name = panel_name, z = 1) } #' @importFrom grid viewport unit convertWidth convertHeight #' @importFrom gtable gtable_add_grob simplify_fixed <- function(gt, gt_new, panels, rows, cols) { p_rows <- seq(rows[1], rows[2]) p_cols <- seq(cols[1], cols[2]) left <- gt$layout$l[grep('-l(-|$)', gt$layout$name)] right <- gt$layout$r[grep('-r(-|$)', gt$layout$name)] top <- gt$layout$t[grep('-t(-|$)', gt$layout$name)] bottom <- gt$layout$b[grep('-b(-|$)', gt$layout$name)] # Add strips, axes and labels to panel grob if (length(left) != 0 && min(left) < cols[1]) { left_grob <- gt[p_rows, seq(min(left), cols[1] - 1)] h_width <- unit(sum(convertWidth(left_grob$widths, 'mm', TRUE))/2, 'mm') left_grob$vp <- viewport(x = unit(0, 'npc') - h_width) panels <- gtable_add_grob(panels, grobs = list(left_grob), t = 1, l = 1, b = nrow(panels), r = ncol(panels), z = Inf, clip = 'off', name = 'left-l') } if (length(right) != 0 && max(right) > cols[2]) { right_grob <- gt[p_rows, seq(cols[2] + 1, max(right))] h_width <- unit(sum(convertWidth(right_grob$widths, 'mm', TRUE))/2, 'mm') right_grob$vp <- viewport(x = unit(1, 'npc') + h_width) panels <- gtable_add_grob(panels, grobs = list(right_grob), t = 1, l = 1, b = nrow(panels), r = ncol(panels), z = Inf, clip = 'off', name = 'right-r') } if (length(top) != 0 && min(top) < rows[1]) { top_grob <- gt[seq(min(top), rows[1] - 1), p_cols] h_height <- unit(sum(convertHeight(top_grob$heights, 'mm', TRUE))/2, 'mm') top_grob$vp <- viewport(y = unit(1, 'npc') + h_height) panels <- gtable_add_grob(panels, grobs = list(top_grob), t = 1, l = 1, b = nrow(panels), r = ncol(panels), z = Inf, clip = 'off', name = 'top-t') } if (length(bottom) != 0 && max(bottom) > rows[2]) { bottom_grob <- gt[seq(rows[2] + 1, max(bottom)), p_cols] h_height <- unit(sum(convertHeight(bottom_grob$heights, 'mm', TRUE))/2, 'mm') bottom_grob$vp <- viewport(y = unit(0, 'npc') - h_height) panels <- gtable_add_grob(panels, grobs = list(bottom_grob), t = 1, l = 1, b = nrow(panels), r = ncol(panels), z = Inf, clip = 'off', name = 'bottom-b') } # Add remaining grobs to gt_new left <- if (length(left) != 0) min(left) else cols[1] for (i in seq_len(left - 1)) { table <- gt[p_rows, i] if (length(table$grobs) != 0) { if (length(table$grobs) == 1) { grobname <- table$layout$name grob <- table$grobs[[1]] } else { grobname <- paste(table$layout$name, collapse = ', ') grob <- table } gt_new <- gtable_add_grob(gt_new, grob, rows[1], i, clip = 'off', name = grobname, z = max(table$layout$z)) } } right <- if (length(right) != 0) max(right) else cols[2] for (i in seq_len(ncol(gt) - right)) { table <- gt[p_rows, i + right] if (length(table$grobs) != 0) { if (length(table$grobs) == 1) { grobname <- table$layout$name grob <- table$grobs[[1]] } else { grobname <- paste(table$layout$name, collapse = ', ') grob <- table } gt_new <- gtable_add_grob(gt_new, grob, rows[1], i + cols[1] + right - cols[2], clip = 'off', name = grobname, z = max(table$layout$z)) } } top <- if (length(top) != 0) min(top) else rows[1] for (i in seq_len(top - 1)) { table <- gt[i, p_cols] if (length(table$grobs) != 0) { if (length(table$grobs) == 1) { grobname <- table$layout$name grob <- table$grobs[[1]] } else { grobname <- paste(table$layout$name, collapse = ', ') grob <- table } gt_new <- gtable_add_grob(gt_new, grob, i, cols[1], clip = 'off', name = grobname, z = max(table$layout$z)) } } bottom <- if (length(bottom) != 0) max(bottom) else rows[2] for (i in seq_len(nrow(gt) - bottom)) { table <- gt[i + bottom, p_cols] if (length(table$grobs) != 0) { if (length(table$grobs) == 1) { grobname <- table$layout$name grob <- table$grobs[[1]] } else { grobname <- paste(table$layout$name, collapse = ', ') grob <- table } gt_new <- gtable_add_grob(gt_new, grob, i + rows[1] + bottom - rows[2], cols[1], clip = 'off', name = grobname, z = max(table$layout$z)) } } panel_name <- paste0('panel; ', paste(panels$layout$name, collapse = ', ')) gtable_add_grob(gt_new, panels, rows[1], cols[1], clip = 'off', name = panel_name, z = 1) } free_panel <- function(gt, has_side) { nested <- grep("patchwork-table", gt$layout$name) for (i in nested) { loc <- gt$layout[i, ] loc <- c(loc$t, loc$r, loc$b, loc$l) == c(1, ncol(gt), nrow(gt), 1) & has_side if (!any(loc)) next gt$grobs[[i]] <- free_panel(gt$grobs[[i]], loc) } top <- if (has_side[1]) 3 else PANEL_ROW right <- ncol(gt) - if (has_side[2]) 2 else TABLE_COLS - PANEL_COL bottom <- nrow(gt) - if (has_side[3]) 2 else TABLE_ROWS - PANEL_ROW left <- if (has_side[4]) 3 else PANEL_COL panel_col_pos <- seq(0, by = TABLE_COLS, length.out = floor(ncol(gt) / TABLE_COLS)) + PANEL_COL panel_row_pos <- seq(0, by = TABLE_ROWS, length.out = floor(nrow(gt) / TABLE_ROWS)) + PANEL_ROW panel_width <- gt$widths[panel_col_pos] panel_height <- gt$heights[panel_row_pos] gt$widths[panel_col_pos][as.numeric(panel_width) == 0] <- unit(1, "null") gt$heights[panel_row_pos][as.numeric(panel_height) == 0] <- unit(1, "null") # Fixed aspect plots needs special treatment if (isTRUE(gt$respect)) { p_i <- grep("panel;", gt$layout$name) if (has_side[1]) { h <- gt$grobs[[p_i]]$grobs[[grep("top", gt$grobs[[p_i]]$layout$name)]] gt$grobs[[p_i]] <- gtable_add_rows(gt$grobs[[p_i]], sum(h$heights), pos = 0) gt$layout$t[p_i] <- top } if (has_side[2]) { w <- gt$grobs[[p_i]]$grobs[[grep("right", gt$grobs[[p_i]]$layout$name)]] gt$grobs[[p_i]] <- gtable_add_cols(gt$grobs[[p_i]], sum(w$widths), pos = -1) gt$layout$r[p_i] <- right } if (has_side[3]) { h <- gt$grobs[[p_i]]$grobs[[grep("bottom", gt$grobs[[p_i]]$layout$name)]] gt$grobs[[p_i]] <- gtable_add_rows(gt$grobs[[p_i]], sum(h$heights), pos = -1) gt$layout$b[p_i] <- bottom } if (has_side[4]) { w <- gt$grobs[[p_i]]$grobs[[grep("left", gt$grobs[[p_i]]$layout$name)]] gt$grobs[[p_i]] <- gtable_add_cols(gt$grobs[[p_i]], sum(w$widths), pos = 0) gt$layout$l[p_i] <- left } } else { gt <- liberate_area(gt, top, right, bottom, left, "free_panel") } if (!has_side[1] && (has_side[2] || has_side[4])) { gt <- liberate_rows(gt, 3, right, top - 1, left, align = 0, "free_row") } if (!has_side[2] && (has_side[1] || has_side[3])) { gt <- liberate_cols(gt, top, ncol(gt) - 2, bottom, right + 1, align = 0, "free_col") } if (!has_side[3] && (has_side[2] || has_side[4])) { gt <- liberate_rows(gt, bottom + 1, right, nrow(gt) - 2, left, align = 1, "free_row") } if (!has_side[4] && (has_side[1] || has_side[3])) { gt <- liberate_cols(gt, top, left - 1, bottom, 3, align = 1, "free_col") } old_free <- grepl("free_panel-", gt$layout$name) | grepl("free_row-", gt$layout$name) | grepl("free_col-", gt$layout$name) if (any(old_free)) { for (i in which(old_free)) { loc <- unlist(gt$layout[i, c("t", "r", "b", "l")]) loc[has_side] <- c(top, right, bottom, left)[has_side] gt_old <- gt gt_old$grobs <- gt_old$grobs[i] gt_old$layout <- gt_old$layout[i, ] gt$grobs[[i]] <- gt_old[loc[1]:loc[3], loc[4]:loc[2]] gt$layout[i, c("t", "r", "b", "l")] <- loc } } gt$widths[setdiff(left:right, min(panel_col_pos):max(panel_col_pos))] <- unit(0, "mm") gt$widths[panel_col_pos] <- panel_width gt$heights[setdiff(top:bottom, min(panel_row_pos):max(panel_row_pos))] <- unit(0, "mm") gt$heights[panel_row_pos] <- panel_height gt } grob_in_rect <- function(gt, top, right, bottom, left) { gt$layout$l >= left & gt$layout$t >= top & gt$layout$r <= right & gt$layout$b <= bottom } liberate_area <- function(gt, top, right, bottom, left, name = NULL, vp = NULL) { liberated <- gt[top:bottom, left:right] remove <- grob_in_rect(gt, top, right, bottom, left) if (any(remove)) { if (!is.null(vp)) liberated$vp <- vp name <- name %||% paste(liberated$layout$name, collapse ="; ") gt$grobs <- gt$grobs[!remove] gt$layout <- gt$layout[!remove,] gt <- gtable_add_grob(gt, liberated, top, left, bottom, right, max(liberated$layout$z), "inherit", name) } gt } liberate_rows <- function(gt, top, right, bottom, left, align = 0.5, name = NULL) { liberate <- which(grob_in_rect(gt, top, right, bottom, left)) unique_rows <- unique(gt$layout[liberate, c("t", "b")]) for (i in seq_len(nrow(unique_rows))) { gt <- liberate_area(gt, unique_rows$t[i], right, unique_rows$b[i], left, name, vp = viewport(y = align, height = sum(gt$heights[unique_rows$t[i]:unique_rows$b[i]]), just = c(0.5, align))) } gt } liberate_cols <- function(gt, top, right, bottom ,left, align = 0.5, name = NULL) { liberate <- which(grob_in_rect(gt, top, right, bottom, left)) unique_cols <- unique(gt$layout[liberate, c("l", "r")]) for (i in seq_len(nrow(unique_cols))) { gt <- liberate_area(gt, top, unique_cols$r[i], bottom, unique_cols$l[i], name, vp = viewport(x = align, width = sum(gt$widths[unique_cols$l[i]:unique_cols$r[i]]), just = c(align, 0.5))) } gt } free_label <- function(gt, has_side) { # Fixed aspect plots already have this behaviour if (isTRUE(gt$respect)) return(gt) nested <- grep("patchwork-table", gt$layout$name) for (i in nested) { loc <- gt$layout[i, ] loc <- c(loc$t, loc$r, loc$b, loc$l) == c(1, ncol(gt), nrow(gt), 1) & has_side if (!any(loc)) next gt$grobs[[i]] <- free_label(gt$grobs[[i]], loc) } panel_col_pos <- seq(0, by = TABLE_COLS, length.out = floor(ncol(gt) / TABLE_COLS)) + PANEL_COL panel_row_pos <- seq(0, by = TABLE_ROWS, length.out = floor(nrow(gt) / TABLE_ROWS)) + PANEL_ROW panel_width <- gt$widths[panel_col_pos] panel_height <- gt$heights[panel_row_pos] gt$widths[panel_col_pos][as.numeric(panel_width) == 0] <- unit(1, "null") gt$heights[panel_row_pos][as.numeric(panel_height) == 0] <- unit(1, "null") top <- PANEL_ROW right <- ncol(gt) - (TABLE_COLS - PANEL_COL) bottom <- nrow(gt) - (TABLE_ROWS - PANEL_ROW) left <- PANEL_COL if (has_side[1]) { gt <- liberate_area(gt, top - 3, right, top - 1, left, vp = viewport(y = 0, height = sum(gt$heights[(top - 3):(top - 1)]), just = c(0.5, 0))) } if (has_side[2]) { gt <- liberate_area(gt, top, right + 3, bottom, right + 1, vp = viewport(x = 0, width = sum(gt$widths[(right + 1):(right + 3)]), just = c(0, 0.5))) } if (has_side[3]) { gt <- liberate_area(gt, bottom + 1, right, bottom + 3, left, vp = viewport(y = 1, height = sum(gt$heights[(bottom + 1):(bottom + 3)]), just = c(0.5, 1))) } if (has_side[4]) { gt <- liberate_area(gt, top, left - 1, bottom, left - 3, vp = viewport(x = 1, width = sum(gt$widths[(left - 3):(left - 1)]), just = c(1, 0.5))) } gt$widths[panel_col_pos] <- panel_width gt$heights[panel_row_pos] <- panel_height gt } free_space <- function(gt, has_side) { nested <- grep("patchwork-table", gt$layout$name) for (i in nested) { loc <- gt$layout[i, ] loc <- c(loc$t, loc$r, loc$b, loc$l) == c(1, ncol(gt), nrow(gt), 1) & has_side if (!any(loc)) next gt$grobs[[i]] <- free_space(gt$grobs[[i]], loc) } panel_col_pos <- seq(0, by = TABLE_COLS, length.out = floor(ncol(gt) / TABLE_COLS)) + PANEL_COL panel_row_pos <- seq(0, by = TABLE_ROWS, length.out = floor(nrow(gt) / TABLE_ROWS)) + PANEL_ROW panel_width <- gt$widths[panel_col_pos] panel_height <- gt$heights[panel_row_pos] gt$widths[panel_col_pos][as.numeric(panel_width) == 0] <- unit(1, "null") gt$heights[panel_row_pos][as.numeric(panel_height) == 0] <- unit(1, "null") top <- PANEL_ROW right <- ncol(gt) - (TABLE_COLS - PANEL_COL) bottom <- nrow(gt) - (TABLE_ROWS - PANEL_ROW) left <- PANEL_COL if (has_side[1]) { gt <- liberate_area(gt, 3, right, top - 1, left, vp = viewport(y = 0, height = sum(gt$heights[3:(top - 1)]), just = c(0.5, 0))) gt$heights[3:(top - 1)] <- unit(0, "mm") } if (has_side[2]) { gt <- liberate_area(gt, top, ncol(gt) - 2, bottom, right + 1, vp = viewport(x = 0, width = sum(gt$widths[(right + 1):(ncol(gt) - 2)]), just = c(0, 0.5))) gt$widths[(right + 1):(ncol(gt) - 2)] <- unit(0, "mm") } if (has_side[3]) { gt <- liberate_area(gt, bottom + 1, right, nrow(gt) - 2, left, vp = viewport(y = 1, height = sum(gt$heights[(bottom + 1):(nrow(gt) - 2)]), just = c(0.5, 1))) gt$heights[(bottom + 1):(nrow(gt) - 2)] <- unit(0, "mm") } if (has_side[4]) { gt <- liberate_area(gt, top, left - 1, bottom, 3, vp = viewport(x = 1, width = sum(gt$widths[3:(left - 1)]), just = c(1, 0.5))) gt$widths[3:(left - 1)] <- unit(0, "mm") } gt$widths[panel_col_pos] <- panel_width gt$heights[panel_row_pos] <- panel_height gt } create_design <- function(width, height, byrow) { mat <- matrix(seq_len(width * height), nrow = height, ncol = width, byrow = byrow) ind <- as.vector(mat) ind <- match(seq_along(ind), ind) area( t = row(mat)[ind], l = col(mat)[ind] ) } #' @importFrom grid convertHeight convertWidth unit table_dims <- function(widths, heights, areas, ncol, nrow) { widths <- lapply(widths, convertWidth, 'mm', valueOnly = TRUE) widths <- vapply(seq_len(ncol * TABLE_COLS), function(i) { area <- (i - 1) %/% TABLE_COLS + 1 col_loc <- i %% TABLE_COLS if (col_loc == 0) col_loc <- TABLE_COLS area_side <- if (col_loc <= PANEL_COL) 'l' else 'r' tables <- which(areas[[area_side]] == area) if (length(tables) == 0) { 0 } else { max(vapply(widths[tables], `[[`, numeric(1), col_loc), 0) } }, numeric(1)) heights <- lapply(heights, convertHeight, 'mm', valueOnly = TRUE) heights <- vapply(seq_len(nrow * TABLE_ROWS), function(i) { area <- (i - 1) %/% TABLE_ROWS + 1 row_loc <- i %% TABLE_ROWS if (row_loc == 0) row_loc <- TABLE_ROWS area_side <- if (row_loc <= PANEL_ROW) 't' else 'b' tables <- which(areas[[area_side]] == area) if (length(tables) == 0) { 0 } else { max(vapply(heights[tables], `[[`, numeric(1), row_loc), 0) } }, numeric(1)) list(widths = unit(widths, 'mm'), heights = unit(heights, 'mm')) } set_grob_sizes <- function(tables, widths, heights, design) { unlist(lapply(seq_along(tables), function(i) { gt <- tables[[i]] if (!inherits(gt, 'gtable_patchwork_simple')) { return(gt$grobs) } table_loc <- design[i, , drop = FALSE] l <- (table_loc$l - 1) * TABLE_COLS l_widths <- widths[seq(l + 1, l + PANEL_COL - 1)] r <- (table_loc$r - 1) * TABLE_COLS r_widths <- widths[seq(r + PANEL_COL + 1, r + TABLE_COLS)] t <- (table_loc$t - 1) * TABLE_ROWS t_heights <- heights[seq(t + 1, t + PANEL_ROW - 1)] b <- (table_loc$b - 1) * TABLE_ROWS b_heights <- heights[seq(b + PANEL_ROW + 1, b + TABLE_ROWS)] nested <- grep("patchwork-table", gt$layout$name) gt$grobs[[nested]] <- set_border_sizes(gt$grobs[[nested]], l_widths, r_widths, t_heights, b_heights) gt$grobs }), recursive = FALSE) } set_border_sizes <- function(gt, l = NULL, r = NULL, t = NULL, b = NULL) { if (is.null(l) && is.null(r) && is.null(t) && is.null(b)) return(gt) if (!is.null(l)) gt$widths[seq_along(l)] <- l if (!is.null(r)) gt$widths[seq(ncol(gt) - length(r) + 1, ncol(gt))] <- r if (!is.null(t)) gt$heights[seq_along(t)] <- t if (!is.null(b)) gt$heights[seq(nrow(gt) - length(b) + 1, nrow(gt))] <- b gt$grobs <- lapply(seq_along(gt$grobs), function(i) { grob <- gt$grobs[[i]] if (!inherits(grob, 'gtable_patchwork')) { return(grob) } set_border_sizes( grob, if (gt$layout$l[i] == 1) l else NULL, if (gt$layout$r[i] == ncol(gt)) r else NULL, if (gt$layout$t[i] == 1) t else NULL, if (gt$layout$b[i] == nrow(gt)) b else NULL ) }) gt } #' @importFrom gtable gtable_add_rows gtable_add_cols #' @importFrom grid unit #' @importFrom ggplot2 find_panel add_strips <- function(gt) { panel_loc <- find_panel(gt) strip_pos <- switch( find_strip_pos(gt), inside = 0, outside = 2 ) if (!any(grepl('strip-b', gt$layout$name))) { gt <- gtable_add_rows(gt, unit(0, 'mm'), panel_loc$b + strip_pos) } else if (strip_pos == 2 && !any(gt$layout$b == panel_loc$b + 2)) { # Merge the strip-gap height into the axis and remove it. Only performed if # an axis exist gt$heights[panel_loc$b + 1] <- sum(gt$heights[panel_loc$b + c(1, 2)]) gt <- gt[-(panel_loc$b + 2), ] } if (!any(grepl('strip-t', gt$layout$name))) { gt <- gtable_add_rows(gt, unit(0, 'mm'), panel_loc$t - 1 - strip_pos) } else if (strip_pos == 2 && !any(gt$layout$t == panel_loc$t - 2)) { gt$heights[panel_loc$t - 1] <- sum(gt$heights[panel_loc$t - c(1, 2)]) gt <- gt[-(panel_loc$t - 2), ] } if (!any(grepl('strip-r', gt$layout$name))) { gt <- gtable_add_cols(gt, unit(0, 'mm'), panel_loc$r + strip_pos) } else if (strip_pos == 2 && !any(gt$layout$r == panel_loc$r + 2)) { gt$widths[panel_loc$r + 1] <- sum(gt$widths[panel_loc$r + c(1, 2)]) gt <- gt[, -(panel_loc$r + 2)] } if (!any(grepl('strip-l', gt$layout$name))) { gt <- gtable_add_cols(gt, unit(0, 'mm'), panel_loc$l - 1 - strip_pos) } else if (strip_pos == 2 && !any(gt$layout$l == panel_loc$l - 2)) { gt$widths[panel_loc$l - 1] <- sum(gt$widths[panel_loc$l - c(1, 2)]) gt <- gt[, -(panel_loc$l - 2)] } gt } #' @importFrom gtable gtable_add_rows gtable_add_cols #' @importFrom grid unit add_guides <- function(gt, collect = FALSE) { panel_loc <- find_panel(gt)[, c('t', 'l', 'b', 'r')] guide_ind <- which(grepl('guide-box', gt$layout$name)) if (length(guide_ind) == 5) { # For ggplot2 >3.5.0, we don't need to add extra space for missing legends, # as every position already has relevant cells in the gtable. if (!collect) { return(gt) } # We need to collect guides from multiple cells in the gtable instead. guide_loc <- gt$layout[guide_ind, ] guide_pos <- gsub("guide-box-", "", guide_loc$name) # Set space for guides to zero space_pos <- ifelse(guide_pos %in% c('left', 'top'), 1L, -1L) lr <- guide_pos %in% c('left', 'right') col <- guide_loc$l[lr] gt$widths[c(col, col + space_pos[lr])] <- unit(0, "mm") tb <- guide_pos %in% c('top', 'bottom') row <- guide_loc$t[tb] gt$heights[c(row, row + space_pos[tb])] <- unit(0, "mm") # Collect guides collection <- lapply(gt$grobs[guide_ind], function(box) { box$grobs[grepl('guides', box$layout$name)] # NULL if legend is empty }) collection <- unlist(collection, recursive = FALSE) # drops NULL gt$collected_guides <- collection # Remove guides from gtable gt$grobs[guide_ind] <- NULL gt$layout <- gt$layout[-guide_ind, ] return(gt) } guide_loc <- gt$layout[guide_ind, c('t', 'l', 'b', 'r')] guide_pos <- if (nrow(guide_loc) == 0) { 'none' } else if (all(unlist(guide_loc == panel_loc))) { 'inside' } else { if (panel_loc$t == guide_loc$t) { if (panel_loc$l > guide_loc$l) { 'left' } else { 'right' } } else { if (panel_loc$t > guide_loc$t) { 'top' } else { 'bottom' } } } if (guide_pos != 'right') { gt <- gtable_add_cols(gt, unit(c(0, 0), 'mm'), panel_loc$r + 3) } if (guide_pos != 'left') { gt <- gtable_add_cols(gt, unit(c(0, 0), 'mm'), panel_loc$l - 4) } if (guide_pos != 'bottom') { gt <- gtable_add_rows(gt, unit(c(0, 0), 'mm'), panel_loc$b + 5) } if (guide_pos != 'top') { gt <- gtable_add_rows(gt, unit(c(0, 0), 'mm'), panel_loc$t - 4) } if (collect && guide_pos != 'none') { guide_grob <- gt$grobs[[guide_ind]] guide_loc <- gt$layout[guide_ind, ] # May have changed above space_pos <- if (guide_pos %in% c('left', 'top')) 1 else -1 if (guide_pos %in% c('right', 'left')) { gt$widths[c(guide_loc$l, guide_loc$l + space_pos)] <- unit(c(0, 0), 'mm') } else if (guide_pos %in% c('bottom', 'top')) { gt$heights[c(guide_loc$t, guide_loc$t + space_pos)] <- unit(c(0, 0), 'mm') } gt$grobs[guide_ind] <- NULL gt$layout <- gt$layout[-guide_ind, ] gt$collected_guides <- guide_grob$grobs[grepl('guides', guide_grob$layout$name)] } gt } find_strip_pos <- function(gt) { panel_loc <- find_panel(gt) ind <- grep('strip-t', gt$layout$name) if (length(ind) != 0 && panel_loc$t - min(gt$layout$t[ind]) != 1) { return('outside') } ind <- grep('strip-r', gt$layout$name) if (length(ind) != 0 && max(gt$layout$r[ind]) - panel_loc$r != 1) { return('outside') } ind <- grep('strip-b', gt$layout$name) if (length(ind) != 0 && max(gt$layout$b[ind]) - panel_loc$b != 1) { return('outside') } ind <- grep('strip-l', gt$layout$name) if (length(ind) != 0 && panel_loc$l - min(gt$layout$l[ind]) != 1) { return('outside') } 'inside' } set_panel_dimensions <- function(gt, panels, widths, heights, fixed_asp, design) { width_ind <- seq(PANEL_COL, by = TABLE_COLS, length.out = length(widths)) height_ind <- seq(PANEL_ROW, by = TABLE_ROWS, length.out = length(heights)) if (!is.unit(widths)) { widths[is.na(widths)] <- -1 widths <- unit(widths, 'null') } width_strings <- as.character(widths) if (!is.unit(heights)) { heights[is.na(heights)] <- -1 heights <- unit(heights, 'null') } height_strings <- as.character(heights) panel_widths <- do.call(unit.c, lapply(panels, function(x) x$widths[PANEL_COL])) absolute_col <- is_abs_unit(panel_widths) & as.numeric(panel_widths) != 0 if (any(absolute_col)) { pos <- ifelse(absolute_col & design$l == design$r & width_strings[design$l] == "-1null", design$l, NA) fixed_widths <- lapply(split(panel_widths, pos), "max") widths[as.numeric(names(fixed_widths))] <- do.call(unit.c, fixed_widths) width_strings <- as.character(widths) } panel_heights <- do.call(unit.c, lapply(panels, function(x) x$heights[PANEL_ROW])) absolute_row <- is_abs_unit(panel_heights) & as.numeric(panel_heights) != 0 if (any(absolute_row)) { pos <- ifelse(absolute_row & design$t == design$b & height_strings[design$t] == "-1null", design$t, NA) fixed_heights <- lapply(split(panel_heights, pos), "max") heights[as.numeric(names(fixed_heights))] <- do.call(unit.c, fixed_heights) height_strings <- as.character(heights) } if (any(width_strings == '-1null') && any(height_strings == '-1null')) { respect <- matrix(0, nrow = length(gt$heights), ncol = length(gt$widths)) fixed_areas <- lapply(which(fixed_asp), function(i) { list( rows = seq(design$t[i], design$b[i]), cols = seq(design$l[i], design$r[i]) ) }) can_fix <- vapply(fixed_areas, function(x) length(x$rows) == 1 && length(x$cols), logical(1)) can_fix_row <- vapply(fixed_areas, function(x) all(grepl('null$', height_strings[x$rows])), logical(1)) can_fix_col <- vapply(fixed_areas, function(x) all(grepl('null$', width_strings[x$cols])), logical(1)) fixed_areas <- fixed_areas[can_fix & (can_fix_row & can_fix_col)] fixed_gt <- which(fixed_asp)[can_fix & (can_fix_row & can_fix_col)] all_fixed_rows <- table(unlist(lapply(fixed_areas, `[[`, 'rows'))) all_fixed_cols <- table(unlist(lapply(fixed_areas, `[[`, 'cols'))) controls_dim <- vapply(fixed_areas, function(a) { all(all_fixed_rows[as.character(a$rows)] == 1) || all(all_fixed_cols[as.character(a$cols)] == 1) }, logical(1)) for (i in order(controls_dim)) { panel_ind <- grep('panel', panels[[fixed_gt[i]]]$layout$name)[1] # Guard against rows and cols added by free_panel() content_cols <- range(panels[[fixed_gt[i]]]$grobs[[panel_ind]]$layout$l, panels[[fixed_gt[i]]]$grobs[[panel_ind]]$layout$r) content_rows <- range(panels[[fixed_gt[i]]]$grobs[[panel_ind]]$layout$t, panels[[fixed_gt[i]]]$grobs[[panel_ind]]$layout$b) w <- panels[[fixed_gt[i]]]$grobs[[panel_ind]]$widths[content_cols[1]:content_cols[2]] h <- panels[[fixed_gt[i]]]$grobs[[panel_ind]]$heights[content_rows[1]:content_rows[2]] can_set_width <- all(width_strings[fixed_areas[[i]]$cols] == '-1null') && length(w) == 1 && length(h) == 1 can_set_height <- all(height_strings[fixed_areas[[i]]$rows] == '-1null') && length(w) == 1 && length(h) == 1 will_be_fixed <- TRUE if (can_set_width && can_set_height) { widths[fixed_areas[[i]]$cols] <- w width_strings[fixed_areas[[i]]$cols] <- '' heights[fixed_areas[[i]]$rows] <- h height_strings[fixed_areas[[i]]$rows] <- '' } else if (can_set_width) { widths[fixed_areas[[i]]$cols] <- heights[fixed_areas[[i]]$rows] * (as.numeric(w) / as.numeric(h)) width_strings[fixed_areas[[i]]$cols] <- '' } else if (can_set_height) { heights[fixed_areas[[i]]$rows] <- widths[fixed_areas[[i]]$cols] * (as.numeric(h) / as.numeric(w)) height_strings[fixed_areas[[i]]$rows] <- '' } else { will_be_fixed <- FALSE } if (will_be_fixed) { respect[height_ind[fixed_areas[[i]]$rows], width_ind[fixed_areas[[i]]$cols]] <- 1 } } if (all(respect == 0)) respect <- FALSE gt$respect <- respect } widths[width_strings == '-1null'] <- unit(1, 'null') heights[height_strings == '-1null'] <- unit(1, 'null') gt$widths[width_ind] <- widths gt$heights[height_ind] <- heights gt } add_insets <- function(gt) { is_inset <- vapply(gt, inherits, logical(1), 'inset_table') if (!any(is_inset)) { return(gt) } canvas <- rank(cumsum(!is_inset), ties.method = "min")[is_inset] if (canvas[1] == 0) { cli_abort("insets cannot be the first plot in a patchwork") } insets <- which(is_inset) name <- paste0('inset_', insets) for (i in seq_along(insets)) { ins <- gt[[insets[i]]] can <- gt[[canvas[i]]] setting <- attr(ins, 'inset_settings') if (setting$on_top) { z <- max(can$layout$z) + 1 } else { bg <- which(grepl('background', can$layout$name)) if (length(bg) != 0) { z <- can$layout$z[bg[1]] } else { z <- min(can$layout$z) - 1 } } gt[[canvas[i]]] <- switch(setting$align_to, panel = gtable_add_grob(can, list(ins), PANEL_ROW, PANEL_COL, z = z, clip = setting$clip, name = name[i]), plot = gtable_add_grob(can, list(ins), PLOT_TOP, PLOT_LEFT, PLOT_BOTTOM, PLOT_RIGHT, z = z, clip = setting$clip, name = name[i]), full = gtable_add_grob(can, list(ins), 1, 1, nrow(can), ncol(can), z = z, clip = setting$clip, name = name[i]), cli_abort('Unknown alignment setting: {.arg {setting$align_to}}') ) } gt[!is_inset] } patchwork/R/zzz.R0000644000176200001440000000261414670021173013441 0ustar liggesusers.onLoad <- function(...) { run_on_load() } print_plot.patchwork <- function(p, title = '') { if (is.null(p$patches$annotation$title)) { p <- p + plot_annotation(title = title) } print(p) } register_s3_method <- function(pkg, generic, class, fun = NULL) { check_string(pkg) check_string(generic) check_string(class) if (is.null(fun)) { fun <- get(paste0(generic, ".", class), envir = parent.frame()) } else { check_function(fun) } if (pkg %in% loadedNamespaces()) { registerS3method(generic, class, fun, envir = asNamespace(pkg)) } # Always register hook in case package is later unloaded & reloaded setHook( packageEvent(pkg, "onLoad"), function(...) { registerS3method(generic, class, fun, envir = asNamespace(pkg)) } ) } unitType <- function(x) { unit <- attr(x, "unit") if (!is.null(unit)) { return(unit) } if (is.list(x) && is.unit(x[[1]])) { unit <- vapply(x, unitType, character(1)) return(unit) } else if ("fname" %in% names(x)) { return(x$fname) } rep("", length(x)) # we're only interested in simple units for now } is_abs_unit <- function(x) { unitType(x) %in% c("cm", "inches", "mm", "points", "picas", "bigpts", "dida", "cicero", "scaledpts") } on_load({ register_s3_method("vdiffr", "print_plot", "patchwork") if ("unitType" %in% getNamespaceExports("grid")) { unitType <- grid::unitType } }) patchwork/R/wrap_plots.R0000644000176200001440000000600714571545322015005 0ustar liggesusers#' Wrap plots into a patchwork #' #' While the use of `+` is a natural way to add plots together, it can be #' difficult to string together multiple plots programmatically if the number #' of plots is not known beforehand. `wrap_plots` makes it easy to take a list #' of plots and add them into one composition, along with layout specifications. #' #' If `design` is specified as a text string *and* the plots are named (e.g. #' `wrap_plots(A = p1, ...)`) *and* all plot names are single characters #' represented in the design layout string, the plots will be matched to their #' respective area by name. Otherwise the areas will be filled out #' sequentially in the same manner as using the `+` operator. See the examples #' for more. #' #' @param ... multiple `ggplot`s or a list containing `ggplot` objects #' @inheritParams plot_layout #' #' @return A `patchwork` object #' #' @importFrom ggplot2 is.ggplot #' @export #' #' @examples #' library(ggplot2) #' #' p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) #' p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) #' p3 <- ggplot(mtcars) + geom_bar(aes(gear)) + facet_wrap(~cyl) #' p4 <- ggplot(mtcars) + geom_bar(aes(carb)) #' p5 <- ggplot(mtcars) + geom_violin(aes(cyl, mpg, group = cyl)) #' #' # Either add the plots as single arguments #' wrap_plots(p1, p2, p3, p4, p5) #' #' # Or add them as a list... #' plots <- list(p1, p2, p3, p4, p5) #' wrap_plots(plots) #' #' # Match plots to areas by name #' design <- "#BB #' AA#" #' wrap_plots(B = p1, A = p2, design = design) #' #' # Compare to not using named plot arguments #' wrap_plots(p1, p2, design = design) #' wrap_plots <- function(..., ncol = NULL, nrow = NULL, byrow = NULL, widths = NULL, heights = NULL, guides = NULL, tag_level = NULL, design = NULL, axes = NULL, axis_titles = axes) { if (is_valid_plot(..1)) { plots <- list(...) } else if (is.list(..1)) { plots <- ..1 } else { cli_abort('Can only wrap {.cls ggplot} and/or {.cls grob} objects or a list of them') } if (!all(vapply(plots, is_valid_plot, logical(1)))) cli_abort('Only know how to add {.cls ggplot} and/or {.cls grob} objects') if (!is.null(names(plots)) && !is.null(design) && is.character(design)) { area_names <- unique(trimws(strsplit(design, '')[[1]])) area_names <- sort(setdiff(area_names, c('', '#'))) if (all(names(plots) %in% area_names)) { plot_list <- vector('list', length(area_names)) names(plot_list) <- area_names plot_list[names(plots)] <- plots plot_list[vapply(plot_list, is.null, logical(1))] <- list(plot_spacer()) plots <- plot_list } } Reduce(`+`, plots, init = plot_filler()) + plot_layout( ncol = ncol, nrow = nrow, byrow = byrow, widths = widths, heights = heights, guides = guides, tag_level = tag_level, design = design, axes = axes, axis_titles = axis_titles ) } #' @importFrom ggplot2 is.ggplot #' @importFrom grid is.grob is_valid_plot <- function(x) is.ggplot(x) || is.grob(x) patchwork/R/plot_multipage.R0000644000176200001440000001217714466377413015654 0ustar liggesusers#' Align plots across multiple pages #' #' Sometimes it is necessary to make sure that separate plots are aligned, with #' each other, but still exists as separate plots. That could e.g. be if they #' need to be part of a slideshow and you don't want titles and panels jumping #' around as you switch between slides. patchwork provides a range of utilities #' to achieve that. Currently it is only possible to align ggplots, but aligning #' patchworks will be supported in the future. #' #' @param plot A ggplot object #' @param dim A plot_dimension object as created by `get_dim()` #' @param ... ggplot objects or a single list of them #' #' @return `get_dim()` and `get_max_dim()` return a plot_dimension object. #' `set_dim()` returns a modified ggplot object with fixed outer dimensions and #' `align_patches()` return a list of such. The modified ggplots still behaves #' like a standard ggplot and new layers, scales, etc can be added to them. #' #' @name multipage_align #' @rdname multipage_align #' #' @examples #' library(ggplot2) #' p1 <- ggplot(mtcars) + #' geom_point(aes(mpg, disp)) + #' ggtitle('Plot 1') #' #' p2 <- ggplot(mtcars) + #' geom_boxplot(aes(gear, disp, group = gear)) + #' ggtitle('Plot 2') #' #' p3 <- ggplot(mtcars) + #' geom_point(aes(hp, wt, colour = mpg)) + #' ggtitle('Plot 3') #' #' p4 <- ggplot(mtcars) + #' geom_bar(aes(gear)) + #' facet_wrap(~cyl) + #' ggtitle('Plot 4') #' #' # Align a plot to p4 #' p4_dim <- get_dim(p4) #' set_dim(p1, p4_dim) #' #' # Align a plot to the maximum dimensions of a list of plots #' max_dims <- get_max_dim(p1, p2, p3, p4) #' set_dim(p2, max_dims) #' #' # Align a list of plots with each other #' aligned_plots <- align_patches(p1, p2, p3, p4) #' aligned_plots[[3]] #' #' # Aligned plots still behave like regular ggplots #' aligned_plots[[3]] + theme_bw() #' NULL #' @rdname multipage_align #' @export get_dim <- function(plot) { UseMethod('get_dim') } is_plot_dimension <- function(x) inherits(x, 'plot_dimension') #' @export print.plot_dimension <- function(x, ...) { cat('A plot dimension object to be applied to a ggplot or patchwork with `set_dim()`') invisible(x) } #' @importFrom ggplot2 ggplot_build ggplot_gtable geom_blank #' @export get_dim.ggplot <- function(plot) { table <- plot_table(plot, 'auto') panel_pos <- find_panel(table) widths <- convertWidth(table$widths, 'mm', TRUE) heights <- convertHeight(table$heights, 'mm', TRUE) dims <- list(l = widths[seq_len(panel_pos$l - 1)], r = widths[seq(panel_pos$r + 1, ncol(table))], t = heights[seq_len(panel_pos$t - 1)], b = heights[seq(panel_pos$b + 1, nrow(table))]) class(dims) <- c('ggplot_dimension', 'plot_dimension') dims } is_ggplot_dimension <- function(x) inherits(x, 'ggplot_dimension') #' @export get_dim.patchwork <- function(plot) { cli_abort('Getting dimensions on patchworks are currently unsupported') } #' @rdname multipage_align #' @export set_dim <- function(plot, dim) { if (!is_plot_dimension(dim)) { cli_abort('{.arg dim} must be a {.cls plot_dimension} object created with {.fun get_dim}') } UseMethod('set_dim') } #' @export set_dim.ggplot <- function(plot, dim) { plot$fixed_dimensions <- dim class(plot) <- c('fixed_dim_ggplot', class(plot)) plot } #' @export set_dim.patchwork <- function(plot, dim) { cli_abort('Setting dimensions on patchworks are currently unsupported') } #' @importFrom ggplot2 ggplot_build #' @export ggplot_build.fixed_dim_ggplot <- function(plot) { plot <- NextMethod() class(plot) <- c('fixed_dim_build', class(plot)) plot } #' @importFrom ggplot2 ggplot_gtable #' @export ggplot_gtable.fixed_dim_build <- function(data) { dim <- data$plot$fixed_dimensions table <- NextMethod() table <- add_strips(table) table <- add_guides(table, FALSE) panel_pos <- find_panel(table) table$widths[seq_len(panel_pos$l - 1)] <- unit(dim$l, 'mm') table$widths[seq(panel_pos$r + 1, ncol(table))] <- unit(dim$r, 'mm') table$heights[seq_len(panel_pos$t - 1)] <- unit(dim$t, 'mm') table$heights[seq(panel_pos$b + 1, nrow(table))] <- unit(dim$b, 'mm') table } #' @rdname multipage_align #' @export get_max_dim <- function(...) { if (is.ggplot(..1)) { plots <- list(...) } else if (is.list(..1)) { plots <- ..1 } else { cli_abort('Can only get dimensions from {.cls ggplot} objects or a list of them') } dims <- lapply(plots, get_dim) dims <- list( l = exec(pmax, !!!lapply(dims, `[[`, 'l')), r = exec(pmax, !!!lapply(dims, `[[`, 'r')), t = exec(pmax, !!!lapply(dims, `[[`, 't')), b = exec(pmax, !!!lapply(dims, `[[`, 'b')) ) class(dims) <- c('ggplot_dimension', 'plot_dimension') dims } #' @rdname multipage_align #' @export align_patches <- function(...) { if (is.ggplot(..1)) { plots <- list(...) } else if (is.list(..1)) { plots <- ..1 } else { cli_abort('Can only align {.cls ggplot} objects or a list of them') } lapply(plots, set_dim, get_max_dim(plots)) } #' Deprecated functions #' #' These functions are deprecated and should not be used. #' #' @export #' @keywords internal #' @usage NULL align_plots <- function(...) { .Deprecated('align_patches') align_patches(...) } patchwork/R/collect_axes.R0000644000176200001440000003450114665336707015271 0ustar liggesusers collect_axis_titles <- function(gt, dir = "x", merge = TRUE) { names <- paste0(dir, "lab", switch(dir, x = c("-t", "-b"), y = c("-l", "-r"))) delete <- integer() for (name in names) { # Find titles idx <- which(grepl(paste0("^", name), gt$layout$name)) if (length(idx) < 2) { # No titles to collapse, leave as-is next } if (all(is_zero(gt$grobs[idx]))) { # No need to bother with non-existing titles next } # We want patches to be able to break title runs patch_index <- grep("panel-nested-patchwork", gt$layout$name) # Simplify layout of grobs to matrix layout <- grob_layout(gt, c(idx, patch_index)) nested <- layout %in% patch_index layout[nested] <- NA # Remove patches # Mark duplicated grobs structure <- grob_id(gt$grobs, layout, byrow = dir == "x", merge = merge, unpack = TRUE) # If all title grobs are unique, there is nothing to collapse if (anyDuplicated(structure[!is.na(structure)]) == 0) { next } structure[nested] <- 0 # Identify 'run'-rectangles in the structure runs <- rle_2d(structure, byrow = dir == "y", ignore.na = TRUE) runs <- runs[!is.na(runs$value) & runs$value != 0, , drop = FALSE] # Get all panels in each run and put the keeper first panels <- lapply(seq_len(nrow(runs)), function(i) { rows <- runs$row_start[i]:runs$row_end[i] cols <- runs$col_start[i]:runs$col_end[i] first <- switch(name, "xlab-t" = layout[runs$row_start[i], cols], "xlab-b" = layout[runs$row_end[i], cols], "ylab-l" = layout[rows, runs$col_start[i]], "ylab-r" = layout[rows, runs$col_end[i]] ) first <- first[!is.na(first)][1] panels <- as.vector(layout[rows , cols]) panels <- panels[!is.na(panels)] unique(c(first, panels)) }) title_grob <- vapply(panels, `[[`, numeric(1), 1) # Mark every non-start grob for deletion delete <- c(delete, setdiff(idx, title_grob)) if ((dir == "x" && all(runs$col_start == runs$col_end)) || (dir == "y" && all(runs$row_start == runs$row_end))) { next } # Stretch titles over span if (dir == "y") { gt$layout$t[title_grob] <- vapply(panels, function(i) min(gt$layout$t[i]), numeric(1)) gt$layout$b[title_grob] <- vapply(panels, function(i) max(gt$layout$b[i]), numeric(1)) gt$layout$z[title_grob] <- max(gt$layout$z[idx]) } else { gt$layout$l[title_grob] <- vapply(panels, function(i) min(gt$layout$l[i]), numeric(1)) gt$layout$r[title_grob] <- vapply(panels, function(i) max(gt$layout$r[i]), numeric(1)) gt$layout$z[title_grob] <- max(gt$layout$z[idx]) } } delete_grobs(gt, delete) } # Very similar to `collect_titles`, except there is no merging step involved # and rows/columns are resized afterwards. collect_axes <- function(gt, dir = "x") { if (dir == "x") { names <- c("axis-b", "axis-t") } else { names <- c("axis-l", "axis-r") } delete <- integer() for (name in names) { # Find axes idx <- which(grepl(paste0("^", name), gt$layout$name)) if (length(idx) < 2) { # No axes to collapse, leave as-is next } if (all(is_zero(gt$grobs[idx]))) { # No need to bother with non-existing axes next } # We want patches to be able to break axis runs patch_index <- grep("panel-nested-patchwork", gt$layout$name) # Simplify layout of grobs to matrix layout <- grob_layout(gt, c(idx, patch_index)) layout[layout %in% patch_index] <- NA # Remove patches # Mark duplicated grobs structure <- grob_id(gt$grobs, layout, byrow = dir == "x", merge = FALSE) # If all grobs are unique, there is nothing to collapse if (anyDuplicated(structure[!is.na(structure)]) == 0) { next } # Identify 'run'-rectangles in the structure runs <- rle_2d(structure, byrow = dir == "y") runs <- runs[!is.na(runs$value), , drop = FALSE] # Find first grob in run start_runs <- c("row_start", "col_start") if (name == "axis-b") start_runs[1] <- "row_end" if (name == "axis-r") start_runs[2] <- "col_end" start_idx <- layout[as.matrix(runs[, start_runs])] # Mark every non-start grob for deletion delete <- c(delete, setdiff(idx, start_idx)) } deleted_rows <- unique(c(gt$layout$t[delete], gt$layout$b[delete])) deleted_cols <- unique(c(gt$layout$l[delete], gt$layout$r[delete])) new <- delete_grobs(gt, delete) new <- retrofit_rows(new, deleted_rows, pattern = "^axis") new <- retrofit_cols(new, deleted_cols, pattern = "^axis") new } # For every given row, check if all non-zero grobs occupying that row have a # name that has a pattern. If all these grobs in that row do, measure the # grob heights and put that into the gtable's heights. #' @importFrom ggplot2 max_height retrofit_rows <- function(gt, rows, pattern = NULL) { if (is.null(pattern) || length(rows) == 0) { return(gt) } # zeroGrobs are ignored for fitting layout <- gt$layout[!is_zero(gt$grobs), , drop = FALSE] # Grab grob index and their rows grob_idx <- which(layout$t %in% rows | layout$b %in% rows) row_idx <- layout$t[grob_idx] # 'layout$b' is ignored, but that is probably fine # Check if any grob in row does not have the pattern. # If all grobs in a row have the pattern, include for resizing is_pattern <- grepl(pattern, layout$name[grob_idx]) resize_row <- rowsum(as.integer(!is_pattern), group = row_idx) == 0 resize_row <- as.integer(rownames(resize_row)[resize_row[, 1]]) # Do resizing for (row in resize_row) { grobs <- gt$grobs[gt$layout$t == row | gt$layout$b == row] size <- max_height(grobs[!is_zero(grobs)]) gt$heights[row] <- size } gt } # For every given column, check if all non-zero grobs occupying that column # have a name that has a pattern. If all these grobs in that column do, measure # the grob widths and put that into the gtable's widths. #' @importFrom ggplot2 max_width retrofit_cols <- function(gt, cols, pattern = NULL) { if (is.null(pattern) || length(cols) == 0) { return(gt) } # zeroGrobs are ignored for fitting layout <- gt$layout[!is_zero(gt$grobs), , drop = FALSE] # Grab grob index and their columns grob_idx <- which(layout$l %in% cols | layout$r %in% cols) col_idx <- layout$l[grob_idx] # 'layout$r' is ignored, but that is probably fine # Check if any grob in column does not have the pattern. # If all grobs in a column have the pattern, include for resizing is_pattern <- grepl(pattern, layout$name[grob_idx]) resize_col <- rowsum(as.integer(!is_pattern), group = col_idx) == 0 resize_col <- as.integer(rownames(resize_col)[resize_col[, 1]]) # Do resizing for (col in resize_col) { grobs <- gt$grobs[gt$layout$l == col | gt$layout$r == col] size <- max_width(grobs[!is_zero(grobs)]) gt$widths[col] <- size } gt } # Delete grobs from the gtable while preserving dimensions. # If a row or column in the gtable becomes empty, optionally set size to 0. delete_grobs <- function(gt, idx, resize = TRUE) { if (length(idx) == 0) { return(gt) } if (resize) { # Candidate rows/cols for resizing resize_rows <- unique(gt$layout[idx, "t"]) resize_cols <- unique(gt$layout[idx, "l"]) } gt$layout <- gt$layout[-idx, , drop = FALSE] gt$grobs <- gt$grobs[-idx] if (!resize) { return(gt) } # Only resize rows/columns that don't have any (non-zero) grobs associated # with them. # Note that this ignores grobs that 'span' the rows/columns, but these are # typically background rectangles. zero <- is_zero(gt$grobs) resize_rows <- setdiff(resize_rows, unlist(gt$layout[!zero, c("t", "b")])) resize_cols <- setdiff(resize_cols, unlist(gt$layout[!zero, c("l", "r")])) if (length(resize_rows) > 0) { gt$heights[resize_rows] <- unit(0, "pt") } if (length(resize_cols) > 0) { gt$widths[resize_cols] <- unit(0, "pt") } gt } # Check if 'x' is 'empty': a zeroGrob or NULL is_zero <- function(x) { if (is_bare_list(x)) { vapply(x, inherits, logical(1), what = "zeroGrob") | lengths(x) == 0 } else { is.null(x) || inherits(x, "zeroGrob") } } # Determine uniqueness of grobs #' @importFrom stats ave grob_id <- function(grobs, layout, byrow, merge = FALSE, unpack = FALSE) { # Hash the grobs to determine unique grobs valid <- !is.na(layout) idx <- as.vector(layout)[valid] hash <- vapply(grobs[idx], function(x) { if (unpack && inherits(x, "gtable") && length(x$grobs) == 1) { x <- x$grobs[[1]] } hash(unname_grob(x)) }, character(1)) # For multi-cell grobs, compute an extra identifier if (!merge) { index <- if (byrow) col(layout) else row(layout) min <- ave(index, layout, FUN = min) max <- ave(index, layout, FUN = max) identifier <- paste0(min, ";", max) # Include the multi-cell identifier in the hash hash <- paste0(hash, identifier[valid]) } layout[valid] <- match(hash, unique(hash)) layout } # Representing grob indices in a simplified layout matrix # Assumes cell can be uniquely mapped to a grob, so no overlapping grobs grob_layout <- function(gt, idx) { layout <- gt$layout[idx, , drop = FALSE] top <- sort(unique(c(layout$t, layout$b))) left <- sort(unique(c(layout$l, layout$r))) new <- matrix(NA_integer_, length(top), length(left)) # Account for fact that grobs may span multiple cells right <- match(layout$r, left) bottom <- match(layout$b, top) top <- match(layout$t, top) left <- match(layout$l, left) for(i in seq_along(idx)) { new[top[i]:bottom[i], left[i]:right[i]] <- idx[i] } new } # Backports of hash table functionality hashtab <- function(type, size) { new_environment() } gethash <- function(h, key, nomatch = NULL) { get0(hash(key), envir = h, ifnotfound = nomatch) } sethash <- function(h, key, value) { assign(hash(key), value, envir = h) } on_load({ if ("hashtab" %in% getNamespaceExports("utils")) { hashtab <- utils::hashtab } if ("gethash" %in% getNamespaceExports("utils")) { gethash <- utils::gethash } if ("sethash" %in% getNamespaceExports("utils")) { sethash <- utils::sethash } }) # 2D equivalent of run-length encoding. # Essentially, it tries to look for rectangular arrangements of cells in a # matrix that have the same values, and reports back their positions. # # Worked example: # # # Let's say we have the following matrix # (m <- matrix(c(1, 1, 2, 1, 1, 2, 3, 3, 1), 3, 3)) # #> [,1] [,2] [,3] # #> [1,] 1 1 3 # #> [2,] 1 1 3 # #> [3,] 2 2 1 # # # The `rle_2d()` function finds the `i` and `j` arguments that define the # # rectangular areas with the same values. For this example so this finds: # # m[1:2, 1:2], m[1:2, 3], m[3, 1:2] and m[3, 3] as runs. # # rle_2d(m) # #> col_start col_end row_start row_end value # #> 1 1 2 1 2 1 # #> 2 1 2 3 3 2 # #> 5 3 3 1 2 3 # #> 6 3 3 3 3 1 rle_2d <- function(m, byrow = FALSE, ignore.na = FALSE) { n <- length(m) # Return 0-row data.frame if matrix is empty if (n == 0L) { ans <- data.frame( col_start = integer(), col_end = integer(), row_start = integer(), row_end = integer(), value = as.vector(m) ) return(ans) } if (isTRUE(byrow)) { m <- t(m) rename <- function(x) { names(x) <- c("row_start", "row_end", "col_start", "col_end", "value") rownames(x) <- NULL x } } else { rename <- function(x) { rownames(x) <- NULL x } } dim <- dim(m) levels <- unique(as.vector(m)) # Simplified case when there is just a single level if ((ignore.na && sum(!is.na(levels)) == 1) || length(levels) == 1L) { ans <- data.frame( col_start = 1L, col_end = dim[2], row_start = 1L, row_end = dim[1], value = sort(levels, na.last = TRUE)[1] ) return(rename(ans)) } # Simplified case when all levels are different if (length(levels) == n) { col <- as.vector(col(m)) row <- as.vector(row(m)) ans <- data.frame( col_start = col, col_end = col, row_start = row, row_end = row, value = as.vector(m) ) return(rename(ans)) } # Treat matrix content as levels, so we can deal with NAs m <- matrix(match(m, levels), nrow(m), ncol(m)) # Simplified case when m has only a single row if (dim[1] == 1L) { rle <- rle(as.vector(m)) ends <- cumsum(rle$lengths) ans <- data.frame( col_start = ends - rle$lengths + 1, col_end = ends, row_start = 1L, row_end = 1L, value = levels[rle$values] ) } # Run length encoding by column # classic RLE column-wise RLE # |------------------| |----------------------| ends <- c(which(m[-1] != m[-n] | (row(m) == nrow(m))[-n]), n) lengths <- diff(c(0L, ends)) values <- m[ends] starts <- ends - lengths + 1L # Simplified case when m has only a single column if (dim[2] == 1L) { ans <- data.frame( col_start = 1L, col_end = 1L, row_start = starts, row_end = ends, value = levels[values] ) return(rename(ans)) } # Translate to indices # `col_end` is initialised as `col_start` but will be updated throughout # the coming for-loop row_start <- arrayInd(starts, dim)[, 1] row_end <- row_start + lengths - 1L col_start <- col_end <- arrayInd(ends, dim)[, 2] # Initialise hash table no longer than number of runs # Inspiration for using hash tables for this problem taken from TimTaylor: # https://fosstodon.org/@_TimTaylor/111266682218212785 htab <- hashtab("identical", size = length(values)) for (i in seq_along(values)) { # Lookup if there has been a similar column key <- c(row_start[i], row_end[i], values[i]) hsh <- gethash(htab, key) if (!is.null(hsh) && col_start[i] == col_end[hsh] + 1L) { # Matches run in previous column, merge by updating column end # and deleting current run (NA value will be filtered out later) col_end[hsh] <- col_start[i] values[i] <- NA_integer_ } else { # Add run-index to the table sethash(htab, key, i) } } ans <- data.frame( col_start = col_start, col_end = col_end, row_start = row_start, row_end = row_end, value = levels[values] )[!is.na(values), , drop = FALSE] rename(ans) } patchwork/R/wrap_table.R0000644000176200001440000001505214670021433014723 0ustar liggesusers#' Wrap a table in a patchwork compliant patch #' #' This function works much like [wrap_elements()] in that it turns the input #' into patchwork compliant objects that can be added to a composition. However, #' `wrap_table()` uses the knowledge that the input is a table to provide some #' very nifty layout options that makes it generally better to use than #' [wrap_elements()] for this type of object. #' #' @param table A gt table or an object coercible to a data frame #' @param panel what portion of the table should be aligned with the panel #' region? `"body"` means that any column and row headers will be placed outside #' the panel region, i.e. the topleft corner of the panel region will be aligned #' with the topleft data cell. `"full"` means that the whole table will be #' placed inside the panel region. `"rows"` means that all rows (including column #' headers) will be placed inside the panel region but row headers will be #' placed to the left. `"cols"` is the opposite, placing all columns within the #' panel region but keeping the column header on top of it. If this is set to #' `"body"` or `"cols"` and `space` is set to `"fixed"` or `"free_x"` then any #' footnotes or source notes in the table will be placed outside the bottom of #' the panel region. #' @param space How should the dimension of the table influence the final #' composition? `"fixed"` means that the table width will set the width of the #' column it occupies and the table height will set the height of the row it #' occupies. `"free"` is the opposite meaning that the table dimension will not #' have any influence on the sizing. `"free_x"` and `"free_y"` allows you to #' free either direction while keeping the remaining fixed. Do note that if you #' set a specific width or height in [plot_layout()] it will have higher #' priority than the table dimensions #' @inheritParams wrap_elements #' #' @return A wrapped_table object #' #' @export #' #' @note This functionality requires v0.11.0 or higher of the gt package #' #' @examplesIf requireNamespace("gt", quietly = TRUE) && packageVersion("gt") >= "0.11.0" #' library(ggplot2) #' library(gt) #' #' p1 <- ggplot(airquality) + #' geom_line(aes(x = Day, y = Temp, colour = month.name[Month])) + #' labs(colour = "Month") #' #' table <- data.frame( #' Month = month.name[5:9], #' "Mean temp." = tapply(airquality$Temp, airquality$Month, mean), #' "Min temp." = tapply(airquality$Temp, airquality$Month, min), #' "Max temp." = tapply(airquality$Temp, airquality$Month, max) #' ) #' gt_tab <- gt(table, rowname_col = "Month") #' #' # Default addition usees wrap_table #' p1 + gt_tab #' #' # Default places column and row headers outside panel area. Use wrap_table #' # to control this #' p1 + wrap_table(gt_tab, panel = "full") #' #' # Tables generally have fixed dimensions and these can be used to control #' # the size of the area they occupy #' p2 <- ggplot(airquality) + #' geom_boxplot(aes(y = month.name[Month], x = Temp)) + #' scale_y_discrete(name = NULL, limits = month.name[9:5], guide = "none") #' #' wrap_table(gt_tab, space = "fixed") + p2 #' wrap_table <- function(table, panel = c("body", "full", "rows", "cols"), space = c("free", "free_x", "free_y", "fixed"), ignore_tag = FALSE) { check_installed("gt", version = "0.11.0") if (!inherits(table, "gt_tbl")) { table <- try_fetch( gt::gt(as.data.frame(table)), error = function(cnd, ...) cli::cli_abort("Unable to convert input table to {.cls gt_tbl}", parent = cnd) ) } n_row_headers <- (!all(is.na(table[["_stub_df"]]$row_id))) + (!all(is.na(table[["_stub_df"]]$group_id))) if (n_row_headers == 2 && !table[["_options"]]$value[[which(table[["_options"]]$parameter == "row_group_as_column")]]) { n_row_headers <- 1 } table <- wrap_elements(table, ignore_tag = ignore_tag) attr(table, "patch_settings")$panel <- arg_match(panel) attr(table, "patch_settings")$n_row_headers <- n_row_headers attr(table, "patch_settings")$space <- c(space %in% c("free", "free_x"), space %in% c("free", "free_y")) class(table) <- c("wrapped_table", class(table)) table } #' @export patchGrob.wrapped_table <- function(x, guides = 'auto') { panel <- attr(x, "patch_settings")$panel row_head <- attr(x, "patch_settings")$n_row_headers space <- attr(x, "patch_settings")$space x <- NextMethod() table_loc <- which(x$layout$name == "panel") table_width <- x$grobs[[table_loc]]$widths if (all(is_abs_unit(table_width))) table_width <- convertWidth(table_width, "mm") table_height <- x$grobs[[table_loc]]$heights if (all(is_abs_unit(table_height))) table_height <- convertHeight(table_height, "mm") if (panel %in% c("body", "cols")) { table_body <- x$grobs[[table_loc]]$layout$name == "table_body" col_head <- x$grobs[[table_loc]]$layout$t[table_body] - 1 col_tail <- x$grobs[[table_loc]]$layout$b[table_body] + 1 if (!space[2] && col_tail <= nrow(x$grobs[[table_loc]])) { height <- sum(x$grobs[[table_loc]]$heights[col_tail:nrow(x$grobs[[table_loc]])]) x$heights[PANEL_ROW + 2] <- height table_height <- table_height[-(col_tail:nrow(x$grobs[[table_loc]]))] } if (col_head > 0) { height <- sum(x$grobs[[table_loc]]$heights[1:col_head]) x$grobs[[table_loc]]$vp$y <- x$grobs[[table_loc]]$vp$y + height x$heights[PANEL_ROW - 2] <- height table_height <- table_height[-(1:col_head)] } } if (panel %in% c("body", "rows") && row_head > 0) { width <- sum(x$grobs[[table_loc]]$widths[1:row_head]) x$grobs[[table_loc]]$vp$x <- x$grobs[[table_loc]]$vp$x - width x$widths[PANEL_COL - 2] <- width table_width <- table_width[-(1:row_head)] } if (!space[1]) { # Something wonky is going on with unit addition sometimes where it looses # it's unit type. So we make a dance to make sure w <- if (inherits(table_width, "simpleUnit")) sum(table_width) else Reduce(`+`, table_width) if (!is.unit(w)) w <- unit(w, unitType(table_width)[1]) x$widths[PANEL_COL] <- w } if (!space[2]) { h <- if (inherits(table_height, "simpleUnit")) sum(table_height) else Reduce(`+`, table_height) if (!is.unit(h)) h <- unit(h, unitType(table_height)[1]) x$heights[PANEL_ROW] <- h } x } #' @export #' @importFrom grid viewport grobWidth grobHeight grobTree as_patch.gt_tbl <- function(x, ...) { check_installed("gt", version = "0.11.0") grob <- gt::as_gtable(x) loc <- grob$layout[grob$layout$name == "table",] grob <- grob[loc$t:loc$b, loc$l:loc$r] grob$vp <- viewport( x = 0, y = 1, width = grobWidth(grob), height = grobHeight(grob), default.units = "npc", just = c(0, 1) ) grob } patchwork/R/inset_element.R0000644000176200001440000000661714665304640015455 0ustar liggesusers#' Create an inset to be added on top of the previous plot #' #' The standard approach of patchwork is to place plots next to each other based #' on the provided layout. However, it may sometimes be beneficial to place one #' or several plots or graphic elements freely on top or below another plot. The #' `inset_element()` function provides a way to create such insets and gives you #' full control over placement. #' #' @param p A grob, ggplot, patchwork, formula, raster, nativeRaster, or gt object #' to add as an inset #' @param left,bottom,right,top numerics or units giving the location of the #' outer bounds. If given as numerics they will be converted to `npc` units. #' @param align_to Specifies what `left`, `bottom`, etc should be relative to. #' Either `'panel'` (default), `'plot'`, or `'full'`. #' @param on_top Logical. Should the inset be placed on top of the other plot or #' below (but above the background)? #' @param clip Logical. Should clipping be performed on the inset? #' @param ignore_tag Logical. Should autotagging ignore the inset? #' #' @return A `inset_path` object #' #' @export #' #' @examples #' library(ggplot2) #' p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) #' p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) #' #' # Basic use #' p1 + inset_element(p2, 0.6, 0.6, 1, 1) #' #' # Align to the full area instead #' p1 + inset_element(p2, 0, 0.6, 0.4, 1, align_to = 'full') #' #' # Grobs and other objects can be added as insets as well #' p1 + inset_element(grid::circleGrob(), 0.4, 0.4, 0.6, 0.6) #' #' if (requireNamespace('png', quietly = TRUE)) { #' logo <- system.file('help', 'figures', 'logo.png', package = 'patchwork') #' logo <- png::readPNG(logo, native = TRUE) #' p1 + inset_element(logo, 0.8, 0.8, 1, 1, align_to = 'full') #' } #' #' # Just as expected insets are still amenable to changes after the fact #' p1 + #' inset_element(p2, 0.6, 0.6, 1, 1) + #' theme_classic() #' #' # Tagging also continues to work as expected #' p1 + #' inset_element(p2, 0.6, 0.6, 1, 1) + #' plot_annotation(tag_levels = '1') #' #' # but can be turned off, like for wrapped plots #' p1 + #' inset_element(p2, 0.6, 0.6, 1, 1, ignore_tag = TRUE) + #' plot_annotation(tag_levels = '1') #' inset_element <- function(p, left, bottom, right, top, align_to = 'panel', on_top = TRUE, clip = TRUE, ignore_tag = FALSE) { align_to <- match.arg(align_to, c('panel', 'plot', 'full')) if (!is.unit(left)) { left <- unit(left, 'npc') } if (!is.unit(bottom)) { bottom <- unit(bottom, 'npc') } if (!is.unit(right)) { right <- unit(right, 'npc') } if (!is.unit(top)) { top <- unit(top, 'npc') } if (!is.ggplot(p)) { p <- wrap_elements(full = p, clip = FALSE) } if (!is.ggplot(p)) { p <- wrap_elements(full = p, clip = clip) } clip <- if (clip) 'on' else 'off' attr(p, 'inset_settings') <- list(left = left, bottom = bottom, right = right, top = top, align_to = align_to, on_top = on_top, clip = clip, ignore_tag = ignore_tag) class(p) <- c('inset_patch', class(p)) p } is_inset_patch <- function(x) inherits(x, 'inset_patch') #' @export print.inset_patch <- function(x, newpage = is.null(vp), vp = NULL, ...) { print(plot_spacer() + x, newpage = newpage, vp = vp, ...) } #' @export plot.inset_patch <- print.inset_patch #' @export has_tag.inset_patch <- function(x) !attr(x, 'inset_settings')$ignore_tag patchwork/R/guide_area.R0000644000176200001440000000264713751212415014677 0ustar liggesusers#' Add an area to hold collected guides #' #' Using the `guides` argument in [plot_layout()] you can collect and collapse #' guides from plots. By default these guides will be put on the side like with #' regular plots, but by adding a `guide_area()` to the plot you can tell #' patchwork to place the guides in that area instead. If guides are not #' collected or no guides exists to collect it behaves as a standard #' [plot_spacer()] instead. #' #' @export #' #' @examples #' library(ggplot2) #' p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp, colour = factor(gear))) #' p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) #' p3 <- ggplot(mtcars) + geom_bar(aes(gear)) + facet_wrap(~cyl) #' #' # Guides are by default kept beeside their plot #' p1 + p2 + p3 #' #' # They can be collected and placed on the side (according to the patchwork #' # theme) #' p1 + p2 + p3 + plot_layout(guides = 'collect', ncol = 2) #' #' # Using guide_area() you can also designate an empty area for this #' p1 + p2 + p3 + guide_area() + plot_layout(guides = 'collect') #' guide_area <- function() { table <- make_patch() class(table) <- c('guide_area', class(table)) table } #' @importFrom gtable gtable_add_grob #' @export patchGrob.guide_area <- function(x, guides = 'auto') { table <- NextMethod() gtable_add_grob(table, zeroGrob(), PANEL_ROW, PANEL_COL, name = 'panel-guide_area') } #' @export has_tag.guide_area <- function(x) FALSE patchwork/R/guides.R0000644000176200001440000002020114670774554014076 0ustar liggesusersunname_vp <- function(x) { if (inherits(x, 'vpTree')) { x$parent <- unname_vp(x$parent) x$children <- lapply(x$children, unname_vp) } else if (inherits(x, 'viewport')) { x$name <- '' if (!is.null(x$layout$widths)) { x$layout$widths <- absolute.size(x$layout$widths) } if (!is.null(x$layout$heights)) { x$layout$heights <- absolute.size(x$layout$heights) } } unit_elements <- vapply(x, is.unit, logical(1)) x[unit_elements] <- lapply(.subset(x, unit_elements), absolute.size) x } #' @importFrom grid is.grob is.unit absolute.size #' @importFrom gtable is.gtable #' @importFrom farver set_channel get_channel unname_grob <- function(x) { if (is.gtable(x)) { x$name <- '' x$rownames <- NULL x$vp <- unname_vp(x$vp) names(x$grobs) <- NULL x$grobs <- lapply(x$grobs, unname_grob) } else if (is.grob(x)) { x$name <- '' x$vp <- unname_vp(x$vp) x$children <- unname(lapply(x$children, unname_grob)) x$childrenOrder <- rep_len('', length(x$childrenOrder)) } unit_elements <- vapply(x, is.unit, logical(1)) x[unit_elements] <- lapply(.subset(x, unit_elements), absolute.size) if (!is.null(x$gp)) { if (is.character(x$gp$col)) x$gp$col <- set_channel(x$gp$col, "r", get_channel(x$gp$col, "r")) if (is.character(x$gp$fill)) x$gp$fill <- set_channel(x$gp$fill, "r", get_channel(x$gp$fill, "r")) if (is.numeric(x$gp$lty)) x$gp$lty <- c("blank", "solid", "dashed", "dotted", "dotdash", "longdash", "twodash")[x$gp$lty + 1] if (is.character(x$gp$lty)) { rename <- match(x$gp$lty, c("44", "13", "1343", "73", "2262")) matched <- !is.na(rename) x$gp$lty[matched] <- c("dashed", "dotted", "dotdash", "longdash", "twodash")[rename[matched]] } if (is.numeric(x$gp$lineend)) x$gp$lineend <- c("round", "butt", "square")[x$gp$lineend] if (is.numeric(x$gp$linejoin)) x$gp$linejoin <- c("round", "mitre", "bevel")[x$gp$linejoin] } x } collapse_guides <- function(guides) { unnamed <- lapply(guides, unname_grob) for (i in rev(seq_along(unnamed)[-1])) { for (j in seq_len(i - 1)) { if (isTRUE(all.equal(unnamed[[i]], unnamed[[j]], check.names = FALSE, check.attributes = FALSE))) { guides[i] <- NULL break } } } guides } #' @importFrom gtable gtable_width gtable_height gtable gtable_add_grob #' @importFrom grid editGrob heightDetails widthDetails valid.just unit.c unit #' @importFrom ggplot2 margin element_grob element_blank calc_element element_render guides_build <- function(guides, theme) { legend.spacing.y <- calc_element(theme, "legend.spacing.y") legend.spacing.x <- calc_element(theme, "legend.spacing.x") legend.box.margin <- calc_element("legend.box.margin", theme) %||% margin() widths <- exec(unit.c, !!!lapply(guides, gtable_width)) heights <- exec(unit.c, !!!lapply(guides, gtable_height)) just <- valid.just(calc_element("legend.box.just", theme)) xjust <- just[1] yjust <- just[2] vert <- identical(calc_element("legend.box", theme), "horizontal") guides <- lapply(guides, function(g) { editGrob(g, vp = viewport(x = xjust, y = yjust, just = c(xjust, yjust), height = if (vert) heightDetails(g) else 1, width = if (!vert) widthDetails(g) else 1)) }) guide_ind <- seq(by = 2, length.out = length(guides)) sep_ind <- seq(2, by = 2, length.out = length(guides) - 1) if (vert) { heights <- max(heights) if (length(widths) != 1) { w <- unit(rep_len(0, length(widths) * 2 - 1), 'mm') w[guide_ind] <- widths w[sep_ind] <- legend.spacing.x widths <- w } } else { widths <- max(widths) if (length(heights) != 1) { h <- unit(rep_len(0, length(heights) * 2 - 1), 'mm') h[guide_ind] <- heights h[sep_ind] <- legend.spacing.y heights <- h } } widths <- unit.c(legend.box.margin[4], widths, legend.box.margin[2]) heights <- unit.c(legend.box.margin[1], heights, legend.box.margin[3]) guides <- gtable_add_grob( gtable(widths, heights, name = 'guide-box'), guides, t = 1 + if (!vert) guide_ind else 1, l = 1 + if (vert) guide_ind else 1, name = 'guides' ) gtable_add_grob( guides, element_render(theme, "legend.box.background"), t = 1, l = 1, b = -1, r = -1, z = -Inf, clip = "off", name = "legend.box.background" ) } #' @importFrom ggplot2 calc_element complete_guide_theme <- function(guide_pos, theme) { if (guide_pos %in% c("top", "bottom")) { theme$legend.box <- theme$legend.box %||% "horizontal" theme$legend.direction <- theme$legend.direction %||% "horizontal" theme$legend.box.just <- theme$legend.box.just %||% c("center", "top") } else { theme$legend.box <- theme$legend.box %||% "vertical" theme$legend.direction <- theme$legend.direction %||% "vertical" theme$legend.box.just <- theme$legend.box.just %||% c("left", "top") } theme } #' @importFrom utils getFromNamespace #' @importFrom ggplot2 calc_element assemble_guides <- function(guides, position, theme) { # https://github.com/tidyverse/ggplot2/blob/57ba97fa04dadc6fd73db1904e39a09d57a4fcbe/R/guides-.R#L512 theme$legend.spacing <- theme$legend.spacing %||% unit(0.5, "lines") theme$legend.spacing.y <- calc_element("legend.spacing.y", theme) theme$legend.spacing.x <- calc_element("legend.spacing.x", theme) # for every position, collect all individual guides and arrange them # into a guide box which will be inserted into the main gtable package_box <- try_fetch( .subset2(getFromNamespace("Guides", "ggplot2"), "package_box"), error = function(cnd) package_box ) package_box(guides, position, theme) } #' @importFrom grid valid.just editGrob package_box <- function(guides, guide_pos, theme) { theme <- complete_guide_theme(guide_pos, theme) guides <- guides_build(guides, theme) # Set the justification of the legend box # First value is xjust, second value is yjust just <- valid.just(calc_element("legend.justification", theme)) xjust <- just[1] yjust <- just[2] guides <- editGrob(guides, vp = viewport(x = xjust, y = yjust, just = c(xjust, yjust)) ) guides <- gtable_add_rows(guides, unit(yjust, 'null')) guides <- gtable_add_rows(guides, unit(1 - yjust, 'null'), 0) guides <- gtable_add_cols(guides, unit(xjust, 'null'), 0) guides <- gtable_add_cols(guides, unit(1 - xjust, 'null')) guides } #' @importFrom ggplot2 calc_element find_panel #' @importFrom gtable gtable_width gtable_height #' @importFrom grid unit.c attach_guides <- function(table, guides, position, theme) { guide_areas <- grepl("panel-guide_area", table$layout$name) if (any(guide_areas)) { area_ind <- which(guide_areas) if (length(area_ind) != 1) { warning("Only using the first guide area", call. = FALSE) } table$grobs[[area_ind[1]]] <- guides return(table) } p_loc <- find_panel(table) spacing <- calc_element("legend.box.spacing", theme) %||% unit(0.2, 'cm') legend_width <- gtable_width(guides) legend_height <- gtable_height(guides) if (position == "left") { table <- gtable_add_grob(table, guides, clip = "off", t = p_loc$t, l = p_loc$l - 5, b = p_loc$b, name = "guide-box") table <- set_border_sizes(table, l = unit.c(table$widths[seq_len(p_loc$l - 6)], legend_width, spacing)) } else if (position == "right") { table <- gtable_add_grob(table, guides, clip = "off", t = p_loc$t, l = p_loc$r + 5, b = p_loc$b, name = "guide-box") table <- set_border_sizes(table, r = unit.c(spacing, legend_width, table$widths[seq(p_loc$r + 6, ncol(table))])) } else if (position == "bottom") { table <- gtable_add_grob(table, guides, clip = "off", t = p_loc$b + 5, l = p_loc$l, r = p_loc$r, name = "guide-box") table <- set_border_sizes(table, b = unit.c(spacing, legend_height, table$heights[seq(p_loc$b + 6, nrow(table))])) } else if (position == "top") { table <- gtable_add_grob(table, guides, clip = "off", t = p_loc$t - 5, l = p_loc$l, r = p_loc$r, name = "guide-box") table <- set_border_sizes(table, t = unit.c(table$heights[seq_len(p_loc$t - 6)], legend_height, spacing)) } table } patchwork/R/merge.R0000644000176200001440000000032214667764165013722 0ustar liggesusers #' @export #' merge.patchwork <- function(x, ...) { patchwork <- new_patchwork() patchwork$plots <- list(x) add_patches(plot_filler(), patchwork) } #' @export #' merge.ggplot <- function(x, ...) { x } patchwork/R/plot_spacer.R0000644000176200001440000000172514277441660015133 0ustar liggesusers#' Add a completely blank area #' #' This simple wrapper creates an empty transparent patch that can be added to #' push your other plots apart. The patch responds to adding #' [theme()][ggplot2::theme] specifications, but only `plot.background` will #' have an effect. #' #' @return A `ggplot` object containing an empty plot #' #' @export #' #' @examples #' library(ggplot2) #' #' p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) #' p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) #' #' p1 + plot_spacer() + p2 #' #' #' # To have more control over spacing, you can use the `plot.margin` #' # parameter for `theme()` on each individual plot. #' #' (p1 + theme(plot.margin = unit(c(0,30,0,0), "pt"))) + #' (p2 + theme(plot.margin = unit(c(0,0,0,30), "pt"))) #' plot_spacer <- function() { table <- make_patch() class(table) <- c('spacer', class(table)) table } is_spacer <- function(x) inherits(x, 'spacer') #' @export has_tag.spacer <- function(x) FALSE patchwork/R/add_plot.R0000644000176200001440000000634014666524350014404 0ustar liggesusers#' @importFrom ggplot2 ggplot_add #' @export ggplot_add.ggplot <- function(object, plot, object_name) { patches <- get_patches(plot) add_patches(object, patches) } #' @importFrom ggplot2 ggplot_add #' @export ggplot_add.grob <- function(object, plot, object_name) { table <- as_patch(object) plot + wrap_elements(full = object) } #' @importFrom ggplot2 ggplot_add #' @export ggplot_add.formula <- ggplot_add.grob #' @importFrom ggplot2 ggplot_add #' @export ggplot_add.raster <- ggplot_add.grob #' @importFrom ggplot2 ggplot_add #' @export ggplot_add.nativeRaster <- ggplot_add.grob #' @importFrom ggplot2 ggplot_add #' @export ggplot_add.gt_tbl <- function(object, plot, object_name) { plot + wrap_table(object) } #' @importFrom grid is.grob #' @importFrom grDevices is.raster should_autowrap <- function(x) { is.grob(x) || inherits(x, 'formula') || is.raster(x) || inherits(x, 'nativeRaster') } # Convert a plot with a (possible) list of patches into a self-contained # patchwork to be attached to another plot get_patches <- function(plot) { empty <- is_empty(plot) if (is_patchwork(plot)) { patches <- plot$patches plot$patches <- NULL class(plot) <- setdiff(class(plot), 'patchwork') if (is_free_plot(plot)) { attr(plot, "patchwork_free_settings") <- NULL if (is.null(attr(plot, "free_settings"))) { class(plot) <- setdiff(class(plot), 'free_plot') } } } else { patches <- new_patchwork() } if (!empty) { patches$plots <- c(patches$plots, list(plot)) } patches } is_patchwork <- function(x) inherits(x, 'patchwork') as_patchwork <- function(x) { UseMethod('as_patchwork') } #' @export as_patchwork.default <- function(x) { cli_abort('Don\'t know how to convert an object of class {.cls {class(x)}} to a patchwork') } #' @export as_patchwork.ggplot <- function(x) { class(x) <- c('patchwork', class(x)) x$patches <- new_patchwork() # Will ensure serialisation includes a link to the patchwork namespace attr(x, 'patchwork_link') <- patchwork_namespace_link x } #' @export as_patchwork.patchwork <- function(x) x add_patches <- function(plot, patches) { UseMethod('add_patches') } #' @export add_patches.ggplot <- function(plot, patches) { plot <- as_patchwork(plot) plot$patches <- patches plot } #' @export add_patches.patchwork <- function(plot, patches) { patches$plots <- c(patches$plots, list(plot)) add_patches(plot_filler(), patches) } new_patchwork <- function() { list( plots = list(), # We need to initialise layout and annotation with NULL values rather than waivers layout = plot_layout( ncol = NULL, nrow = NULL, byrow = NULL, widths = NULL, heights = NULL, guides = NULL, tag_level = NULL, design = NULL, axes = NULL, axis_titles = NULL ), annotation = plot_annotation( title = NULL, subtitle = NULL, caption = NULL, tag_levels = NULL, tag_prefix = NULL, tag_suffix = NULL, tag_sep = NULL, theme = NULL ) ) } #' @importFrom ggplot2 ggplot plot_filler <- function() { p <- ggplot() class(p) <- c('plot_filler', class(p)) p } is_empty <- function(x) inherits(x, 'plot_filler') #' @export has_tag.plot_filler <- function(x) FALSE patchwork/vignettes/0000755000176200001440000000000014671764320014276 5ustar liggesuserspatchwork/vignettes/patchwork.Rmd0000644000176200001440000000737214277441660016756 0ustar liggesusers--- title: "Getting Started" output: rmarkdown::html_vignette: fig_width: 6 fig_height: 4 vignette: > %\VignetteIndexEntry{Getting Started} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` ```{r setup} library(patchwork) ``` Patchwork is a package designed to make plot composition in R extremely simple and powerful. It is mainly intended for users of ggplot2 and goes to great lengths to make sure ggplots are properly aligned no matter the complexity of your composition. In this tutorial we'll work through the basics of using patchwork. In the end you'll have a fairly good understanding of the API, and will be ready to dive into some of the more advanced topics covered in the other vignettes. ## Example plots We'll start by creating some example plots to use throughout this tutorial: ```{r} library(ggplot2) p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) + ggtitle('Plot 1') p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) + ggtitle('Plot 2') p3 <- ggplot(mtcars) + geom_point(aes(hp, wt, colour = mpg)) + ggtitle('Plot 3') p4 <- ggplot(mtcars) + geom_bar(aes(gear)) + facet_wrap(~cyl) + ggtitle('Plot 4') ``` These plots are fairly meaningless and only serve to illustrate plot composition - don't read anything into the resulting plots. ## Basic use The absolute simplest use is the extension of the `+` operator used in ggplot2, to allow adding plots together: ```{r} p1 + p2 ``` When adding plots together, the last added plot will be the active one, and will receive any addition of new ggplot2 objects such as geoms, labels, etc: ```{r} p1 + p2 + labs(subtitle = 'This will appear in the last plot') ``` ## Controlling layout By default, patchwork will try to keep the grid square, and fill it out in row order ```{r} p1 + p2 + p3 + p4 ``` This can be controlled with the addition of a `plot_layout()` ```{r} p1 + p2 + p3 + p4 + plot_layout(nrow = 3, byrow = FALSE) ``` `plot_layout()` have all sorts of amazing features for controlling the layout of your composition. See the *Layout* vignette for a full rundown of all its options. ## Stacking and packing plots Often you want to place plots on top of each other, or beside each other, rather than fill out a grid. While this can be accomplished by adding a one-row or one-column layout, patchwork also provides two operators that does this directly and further provides visual cues to the layout. `|` will place the plots beside each other, while `/` will stack them: ```{r} p1 / p2 ``` As patchworks can be nested, these two operators are often enough to create rather complex layouts: ```{r} p1 | (p2 / p3) ``` ## Annotating the composition It is often necessary to add titles, captions, tags, etc. to a composition. This can be achieved by adding a `plot_annotation()` to the patchwork: ```{r} (p1 | (p2 / p3)) + plot_annotation(title = 'The surprising story about mtcars') ``` Patchwork also provides auto-tagging capabilities, in order to identify subplots in text: ```{r} p1 + p2 + p3 + plot_annotation(tag_levels = 'I') ``` The tagging can be either arabic or roman numbers, or latin letters, and separate tags can be given for different nesting levels. See the *Annotation* vignette for more information. ## Want more? This is enough to get you started, but we have only scratched the surface of what patchwork is capable of. Look into the other guides to find out more about, e.g. how to [collect all legends in one place and remove duplicates](https://patchwork.data-imaginist.com/articles/guides/layout.html#controlling-guides) or [aligning plots across multiple pages](https://patchwork.data-imaginist.com/articles/guides/multipage.html). patchwork/NAMESPACE0000644000176200001440000001074214670774554013522 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method("&",gg) S3method("*",gg) S3method("-",ggplot) S3method("/",ggplot) S3method("[[",patchwork) S3method("[[<-",patchwork) S3method("|",ggplot) S3method(add_patches,ggplot) S3method(add_patches,patchwork) S3method(as.list,patchwork) S3method(as_patch,formula) S3method(as_patch,gList) S3method(as_patch,ggplot) S3method(as_patch,grob) S3method(as_patch,gt_tbl) S3method(as_patch,nativeRaster) S3method(as_patch,patchwork) S3method(as_patch,raster) S3method(as_patchwork,default) S3method(as_patchwork,ggplot) S3method(as_patchwork,patchwork) S3method(c,patch_area) S3method(get_dim,ggplot) S3method(get_dim,patchwork) S3method(ggplot_add,formula) S3method(ggplot_add,ggplot) S3method(ggplot_add,grob) S3method(ggplot_add,gt_tbl) S3method(ggplot_add,nativeRaster) S3method(ggplot_add,plot_annotation) S3method(ggplot_add,plot_layout) S3method(ggplot_add,raster) S3method(ggplot_build,fixed_dim_ggplot) S3method(ggplot_gtable,fixed_dim_build) S3method(has_tag,ggplot) S3method(has_tag,guide_area) S3method(has_tag,inset_patch) S3method(has_tag,plot_filler) S3method(has_tag,spacer) S3method(has_tag,wrapped_patch) S3method(length,patch_area) S3method(length,patchwork) S3method(merge,ggplot) S3method(merge,patchwork) S3method(names,patchwork) S3method(patchGrob,guide_area) S3method(patchGrob,patch) S3method(patchGrob,table_patch) S3method(patchGrob,wrapped_patch) S3method(patchGrob,wrapped_table) S3method(plot,inset_patch) S3method(plot,patch) S3method(plot,patch_area) S3method(plot,patchwork) S3method(plot_table,free_plot) S3method(plot_table,ggplot) S3method(plot_table,inset_patch) S3method(plot_table,patch) S3method(plot_table,patchwork) S3method(print,inset_patch) S3method(print,patch) S3method(print,patch_area) S3method(print,patchwork) S3method(print,plot_dimension) S3method(set_dim,ggplot) S3method(set_dim,patchwork) S3method(simplify_gt,free_table) S3method(simplify_gt,gtable) S3method(simplify_gt,gtable_patchwork) S3method(simplify_gt,inset_table) S3method(simplify_gt,patchgrob) S3method(str,patchwork) export(align_patches) export(align_plots) export(area) export(free) export(get_dim) export(get_max_dim) export(guide_area) export(inset_element) export(patchGrob) export(patchworkGrob) export(plot_annotation) export(plot_layout) export(plot_spacer) export(set_dim) export(wrap_elements) export(wrap_ggplot_grob) export(wrap_plots) export(wrap_table) import(cli) import(rlang) importFrom(farver,get_channel) importFrom(farver,set_channel) importFrom(ggplot2,aes) importFrom(ggplot2,calc_element) importFrom(ggplot2,element_blank) importFrom(ggplot2,element_grob) importFrom(ggplot2,element_line) importFrom(ggplot2,element_render) importFrom(ggplot2,element_text) importFrom(ggplot2,find_panel) importFrom(ggplot2,geom_blank) importFrom(ggplot2,geom_rect) importFrom(ggplot2,ggplot) importFrom(ggplot2,ggplotGrob) importFrom(ggplot2,ggplot_add) importFrom(ggplot2,ggplot_build) importFrom(ggplot2,ggplot_gtable) importFrom(ggplot2,is.ggplot) importFrom(ggplot2,is.theme) importFrom(ggplot2,labs) importFrom(ggplot2,margin) importFrom(ggplot2,max_height) importFrom(ggplot2,max_width) importFrom(ggplot2,panel_cols) importFrom(ggplot2,panel_rows) importFrom(ggplot2,scale_x_continuous) importFrom(ggplot2,scale_y_reverse) importFrom(ggplot2,set_last_plot) importFrom(ggplot2,theme) importFrom(ggplot2,theme_get) importFrom(ggplot2,theme_void) importFrom(ggplot2,waiver) importFrom(ggplot2,wrap_dims) importFrom(ggplot2,zeroGrob) importFrom(grDevices,is.raster) importFrom(grid,absolute.size) importFrom(grid,convertHeight) importFrom(grid,convertWidth) importFrom(grid,editGrob) importFrom(grid,gTree) importFrom(grid,grid.draw) importFrom(grid,grid.newpage) importFrom(grid,grobHeight) importFrom(grid,grobTree) importFrom(grid,grobWidth) importFrom(grid,heightDetails) importFrom(grid,is.grob) importFrom(grid,is.unit) importFrom(grid,pushViewport) importFrom(grid,rasterGrob) importFrom(grid,seekViewport) importFrom(grid,unit) importFrom(grid,unit.c) importFrom(grid,unit.pmax) importFrom(grid,upViewport) importFrom(grid,valid.just) importFrom(grid,viewport) importFrom(grid,widthDetails) importFrom(gtable,gtable) importFrom(gtable,gtable_add_cols) importFrom(gtable,gtable_add_grob) importFrom(gtable,gtable_add_rows) importFrom(gtable,gtable_height) importFrom(gtable,gtable_width) importFrom(gtable,is.gtable) importFrom(stats,ave) importFrom(stats,na.omit) importFrom(utils,as.roman) importFrom(utils,getFromNamespace) importFrom(utils,modifyList) importFrom(utils,str) importFrom(utils,tail) patchwork/LICENSE0000644000176200001440000000006113207337010013252 0ustar liggesusersYEAR: 2017 COPYRIGHT HOLDER: Thomas Lin Pedersen patchwork/NEWS.md0000644000176200001440000001246014671764257013400 0ustar liggesusers# patchwork 1.3.0 * `free()` now better aligns plots in horizontal direction * Plot backgrounds are now always placed beneath all other elements in the patchwork (#370) * Axis titles can now reliably be collected even with faceted plots (#367) * Native support for gt objects, either adding them directly or controlling their layout with `wrap_table()` * Empty patches no longer breaks up axis title collection (#375) * `wrap_ggplot_grob()` now respects auto-tagging (#363) * Fix a bug where guide collecting would prevent proper axes collecting (#359) * Fix a bug in `free()` where tags placed on top of the plot region would become missing (#350) * `free()` gains `type` and `side` argument. The first to control whether to free the panel, the label, or the space occupied outside the panel, the second to control which sides it applies to (#345 and #379) * `as.list()` is now provided for patchwork objects to get the plots in a patchwork as a list. This also allows the use of `lapply()` and friends on patchwork objects (#381) * The default arguments in `plot_annotation()` and `plot_layout()` are now `waiver()` allowing the use of `NULL` to remove an already set value (#198) * Guide and axis merging is slightly more robust when it comes to merging if different graphical parameters that means the same are used (e.g. "black" and "#000000") (#369) * fix a bug when collecting guides with null unit key size (#390) * Added `nest()` to explicitly nest a patchwork on the LHS of an operator # patchwork 1.2.0 * Axes and axis titles can now be collected using the `plot_layout()` function. Collecting axes will remove duplicated axes in the x- or y-direction. Collecting axis titles will also remove duplicated titles in the x- or y-direction, but also merge duplicated titles in the other direction (#150). * Fix a bug that prevented faceted plots with axes on the right from being used (#340) * Added `free()` function to mark a plot to not be aligned with the rest. The margin of the plot will still be aligned with the margins of the other plots but everything inside of that will by unaligned. # patchwork 1.1.3 * `NULL` can now be used with the different arithmetic operators and will result in a non-operation (i.e. the non-null part will be returned unmodified) (#290) * Fix a bug that prevented plots with multi-level strips from being merged together (#277) * Patchworks will now render correctly when unserialised in a fresh session, providing the patchwork package is available (#242) * Fixed a bug preventing faceted plots with strip placement outside the axis from being aligned (#325) * Fixed a bug that let to inconsistent results when combining fixed aspect plots in different order (#274) * Fixed a bug that prevented nested patchworks with empty columns or rows at the bottom or to the right to be inserted into a layout (#273) * Patchwork objects now behaves more correctly like an unnamed list of ggplots. This makes `View()` work on them (#317), and allow one to use `length()` to determine the number of patches in a patchwork (#293) * Expressions and calls can now be used as plot annotations in the same way as they can be used for titles in ggplot2 (#295) # patchwork 1.1.2 * Better error message if rendering fails due to too small plotting space # patchwork 1.1.1 * Use vdiffr conditionally to pass test on M1 mac * Add `str()` method to patchwork objects (#217) * Fix a bug in `inset_element()` when insetting plots with fixed dimensions (#214) * Make sure that `-`, `/`, and `|` works with all supported object types (#221) # patchwork 1.1.0 * Add `inset_element()` to allow adding plots as insets * patchwork now supports `raster` and `nativeRaster` objects * Avoid incrementing tag counter when recursing into a nested plot without additional tags to use (#147) * Fix bug that prevented strips turned off with `element_blank()` from working (#200) * Add option to supply a custom sequence of tags to use for auto-tagging (#211, #63) # patchwork 1.0.1 * Renaming of `align_plots()` to `align_patches()` to avoid namespace clash with cowplot (#130) * Renaming of `as_grob()` (unexported) to `as_patch()` to avoid potential future namespace clash with cowplot (#131) * Fix bug in plot simplification with `theme(strip.placement = 'outside')` (#132) * Fix a bug in guide collection in R >= 4.0 due to the new unit implementation in grid (#170) * Collected guides now behave as ggplot2 guides when position is top or bottom (#137) * Fix a bug in base graphic support where the environment of the plot was not captured (#138) * Fix a bug when combining plots having guides placed manually in combination with faceting (#144) * Fix a bug where having negative margins around the legend would result in an unintelligeble error (#148) * Fix a bug when trying to combine faceted plots with fixed aspect ratio (#156) * Fix alignments of strips when only a single strip is present (#163) * Fix a bug that caused theme void to result in errors (#180) * Make aligning multiple fixed aspect plots more consistent (#175) * Correct alignment of guides when ssembling fixed aspect plots (#140, @ilia-kats) # patchwork 1.0.0 * First CRAN release. Provide utility and operators for assembling and nesting plots into a composition, tag subplots, collect guides and remove duplicates, and align plots across pages. patchwork/inst/0000755000176200001440000000000014671764317013251 5ustar liggesuserspatchwork/inst/doc/0000755000176200001440000000000014671764317014016 5ustar liggesuserspatchwork/inst/doc/patchwork.R0000644000176200001440000000316514671764317016150 0ustar liggesusers## ----include = FALSE---------------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ## ----setup-------------------------------------------------------------------- library(patchwork) ## ----------------------------------------------------------------------------- library(ggplot2) p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) + ggtitle('Plot 1') p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) + ggtitle('Plot 2') p3 <- ggplot(mtcars) + geom_point(aes(hp, wt, colour = mpg)) + ggtitle('Plot 3') p4 <- ggplot(mtcars) + geom_bar(aes(gear)) + facet_wrap(~cyl) + ggtitle('Plot 4') ## ----------------------------------------------------------------------------- p1 + p2 ## ----------------------------------------------------------------------------- p1 + p2 + labs(subtitle = 'This will appear in the last plot') ## ----------------------------------------------------------------------------- p1 + p2 + p3 + p4 ## ----------------------------------------------------------------------------- p1 + p2 + p3 + p4 + plot_layout(nrow = 3, byrow = FALSE) ## ----------------------------------------------------------------------------- p1 / p2 ## ----------------------------------------------------------------------------- p1 | (p2 / p3) ## ----------------------------------------------------------------------------- (p1 | (p2 / p3)) + plot_annotation(title = 'The surprising story about mtcars') ## ----------------------------------------------------------------------------- p1 + p2 + p3 + plot_annotation(tag_levels = 'I') patchwork/inst/doc/patchwork.Rmd0000644000176200001440000000737214277441660016470 0ustar liggesusers--- title: "Getting Started" output: rmarkdown::html_vignette: fig_width: 6 fig_height: 4 vignette: > %\VignetteIndexEntry{Getting Started} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` ```{r setup} library(patchwork) ``` Patchwork is a package designed to make plot composition in R extremely simple and powerful. It is mainly intended for users of ggplot2 and goes to great lengths to make sure ggplots are properly aligned no matter the complexity of your composition. In this tutorial we'll work through the basics of using patchwork. In the end you'll have a fairly good understanding of the API, and will be ready to dive into some of the more advanced topics covered in the other vignettes. ## Example plots We'll start by creating some example plots to use throughout this tutorial: ```{r} library(ggplot2) p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) + ggtitle('Plot 1') p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) + ggtitle('Plot 2') p3 <- ggplot(mtcars) + geom_point(aes(hp, wt, colour = mpg)) + ggtitle('Plot 3') p4 <- ggplot(mtcars) + geom_bar(aes(gear)) + facet_wrap(~cyl) + ggtitle('Plot 4') ``` These plots are fairly meaningless and only serve to illustrate plot composition - don't read anything into the resulting plots. ## Basic use The absolute simplest use is the extension of the `+` operator used in ggplot2, to allow adding plots together: ```{r} p1 + p2 ``` When adding plots together, the last added plot will be the active one, and will receive any addition of new ggplot2 objects such as geoms, labels, etc: ```{r} p1 + p2 + labs(subtitle = 'This will appear in the last plot') ``` ## Controlling layout By default, patchwork will try to keep the grid square, and fill it out in row order ```{r} p1 + p2 + p3 + p4 ``` This can be controlled with the addition of a `plot_layout()` ```{r} p1 + p2 + p3 + p4 + plot_layout(nrow = 3, byrow = FALSE) ``` `plot_layout()` have all sorts of amazing features for controlling the layout of your composition. See the *Layout* vignette for a full rundown of all its options. ## Stacking and packing plots Often you want to place plots on top of each other, or beside each other, rather than fill out a grid. While this can be accomplished by adding a one-row or one-column layout, patchwork also provides two operators that does this directly and further provides visual cues to the layout. `|` will place the plots beside each other, while `/` will stack them: ```{r} p1 / p2 ``` As patchworks can be nested, these two operators are often enough to create rather complex layouts: ```{r} p1 | (p2 / p3) ``` ## Annotating the composition It is often necessary to add titles, captions, tags, etc. to a composition. This can be achieved by adding a `plot_annotation()` to the patchwork: ```{r} (p1 | (p2 / p3)) + plot_annotation(title = 'The surprising story about mtcars') ``` Patchwork also provides auto-tagging capabilities, in order to identify subplots in text: ```{r} p1 + p2 + p3 + plot_annotation(tag_levels = 'I') ``` The tagging can be either arabic or roman numbers, or latin letters, and separate tags can be given for different nesting levels. See the *Annotation* vignette for more information. ## Want more? This is enough to get you started, but we have only scratched the surface of what patchwork is capable of. Look into the other guides to find out more about, e.g. how to [collect all legends in one place and remove duplicates](https://patchwork.data-imaginist.com/articles/guides/layout.html#controlling-guides) or [aligning plots across multiple pages](https://patchwork.data-imaginist.com/articles/guides/multipage.html). patchwork/inst/doc/patchwork.html0000644000176200001440000142420414671764317016715 0ustar liggesusers Getting Started

Getting Started

library(patchwork)

Patchwork is a package designed to make plot composition in R extremely simple and powerful. It is mainly intended for users of ggplot2 and goes to great lengths to make sure ggplots are properly aligned no matter the complexity of your composition.

In this tutorial we’ll work through the basics of using patchwork. In the end you’ll have a fairly good understanding of the API, and will be ready to dive into some of the more advanced topics covered in the other vignettes.

Example plots

We’ll start by creating some example plots to use throughout this tutorial:

library(ggplot2)
p1 <- ggplot(mtcars) + 
  geom_point(aes(mpg, disp)) + 
  ggtitle('Plot 1')

p2 <- ggplot(mtcars) + 
  geom_boxplot(aes(gear, disp, group = gear)) + 
  ggtitle('Plot 2')

p3 <- ggplot(mtcars) + 
  geom_point(aes(hp, wt, colour = mpg)) + 
  ggtitle('Plot 3')

p4 <- ggplot(mtcars) + 
  geom_bar(aes(gear)) + 
  facet_wrap(~cyl) + 
  ggtitle('Plot 4')

These plots are fairly meaningless and only serve to illustrate plot composition - don’t read anything into the resulting plots.

Basic use

The absolute simplest use is the extension of the + operator used in ggplot2, to allow adding plots together:

p1 + p2

When adding plots together, the last added plot will be the active one, and will receive any addition of new ggplot2 objects such as geoms, labels, etc:

p1 + p2 + labs(subtitle = 'This will appear in the last plot')

Controlling layout

By default, patchwork will try to keep the grid square, and fill it out in row order

p1 + p2 + p3 + p4

This can be controlled with the addition of a plot_layout()

p1 + p2 + p3 + p4 + plot_layout(nrow = 3, byrow = FALSE)

plot_layout() have all sorts of amazing features for controlling the layout of your composition. See the Layout vignette for a full rundown of all its options.

Stacking and packing plots

Often you want to place plots on top of each other, or beside each other, rather than fill out a grid. While this can be accomplished by adding a one-row or one-column layout, patchwork also provides two operators that does this directly and further provides visual cues to the layout. | will place the plots beside each other, while / will stack them:

p1 / p2

As patchworks can be nested, these two operators are often enough to create rather complex layouts:

p1 | (p2 / p3)

Annotating the composition

It is often necessary to add titles, captions, tags, etc. to a composition. This can be achieved by adding a plot_annotation() to the patchwork:

(p1 | (p2 / p3)) + 
  plot_annotation(title = 'The surprising story about mtcars')

Patchwork also provides auto-tagging capabilities, in order to identify subplots in text:

p1 + p2 + p3 + 
  plot_annotation(tag_levels = 'I')

The tagging can be either arabic or roman numbers, or latin letters, and separate tags can be given for different nesting levels. See the Annotation vignette for more information.

Want more?

This is enough to get you started, but we have only scratched the surface of what patchwork is capable of. Look into the other guides to find out more about, e.g. how to collect all legends in one place and remove duplicates or aligning plots across multiple pages.

patchwork/README.md0000644000176200001440000000551014666010403013534 0ustar liggesusers # patchwork [![R-CMD-check](https://github.com/thomasp85/patchwork/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/thomasp85/patchwork/actions/workflows/R-CMD-check.yaml) [![CRAN_Release_Badge](http://www.r-pkg.org/badges/version-ago/patchwork)](https://CRAN.R-project.org/package=patchwork) [![CRAN_Download_Badge](http://cranlogs.r-pkg.org/badges/patchwork)](https://CRAN.R-project.org/package=patchwork) [![Codecov test coverage](https://codecov.io/gh/thomasp85/patchwork/branch/main/graph/badge.svg)](https://app.codecov.io/gh/thomasp85/patchwork?branch=main) The goal of `patchwork` is to make it ridiculously simple to combine separate ggplots into the same graphic. As such it tries to solve the same problem as `gridExtra::grid.arrange()` and `cowplot::plot_grid` but using an API that incites exploration and iteration, and scales to arbitrarily complex layouts. ## Installation You can install patchwork from CRAN using `install.packages('patchwork')`. Alternatively you can grab the development version from github using devtools: ``` r # install.packages("devtools") devtools::install_github("thomasp85/patchwork") ``` ## Basic example The usage of `patchwork` is simple: just add plots together! ``` r library(ggplot2) library(patchwork) p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) p1 + p2 ``` ![](man/figures/README-example-1.png) patchwork provides rich support for arbitrarily complex layouts with full alignment. As an example, check out this very readable code for nesting three plots on top of a third: ``` r p3 <- ggplot(mtcars) + geom_smooth(aes(disp, qsec)) p4 <- ggplot(mtcars) + geom_bar(aes(carb)) (p1 | p2 | p3) / p4 ``` ![](man/figures/README-unnamed-chunk-2-1.png) ## Learn more patchwork can do so much more. Check out the guides for learning everything there is to know about all the different features: - [Getting Started](https://patchwork.data-imaginist.com/articles/patchwork.html) - [Assembling Plots](https://patchwork.data-imaginist.com/articles/guides/assembly.html) - [Defining Layouts](https://patchwork.data-imaginist.com/articles/guides/layout.html) - [Adding Annotation](https://patchwork.data-imaginist.com/articles/guides/annotation.html) - [Aligning across pages](https://patchwork.data-imaginist.com/articles/guides/multipage.html) ## Code of Conduct Please note that the patchwork project is released with a [Contributor Code of Conduct](https://patchwork.data-imaginist.com/CODE_OF_CONDUCT.html). By contributing to this project, you agree to abide by its terms. patchwork/build/0000755000176200001440000000000014671764317013373 5ustar liggesuserspatchwork/build/vignette.rds0000644000176200001440000000032014671764317015725 0ustar liggesusersmPK0-P?`P. 8.6P/eΓ$37,Ƙ8טn`j8ktqfi¸. HB!K T9q}@"= "0.11.0") (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} library(ggplot2) library(gt) p1 <- ggplot(airquality) + geom_line(aes(x = Day, y = Temp, colour = month.name[Month])) + labs(colour = "Month") table <- data.frame( Month = month.name[5:9], "Mean temp." = tapply(airquality$Temp, airquality$Month, mean), "Min temp." = tapply(airquality$Temp, airquality$Month, min), "Max temp." = tapply(airquality$Temp, airquality$Month, max) ) gt_tab <- gt(table, rowname_col = "Month") # Default addition usees wrap_table p1 + gt_tab # Default places column and row headers outside panel area. Use wrap_table # to control this p1 + wrap_table(gt_tab, panel = "full") # Tables generally have fixed dimensions and these can be used to control # the size of the area they occupy p2 <- ggplot(airquality) + geom_boxplot(aes(y = month.name[Month], x = Temp)) + scale_y_discrete(name = NULL, limits = month.name[9:5], guide = "none") wrap_table(gt_tab, space = "fixed") + p2 \dontshow{\}) # examplesIf} } patchwork/man/inset_element.Rd0000644000176200001440000000463214652111104016151 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/inset_element.R \name{inset_element} \alias{inset_element} \title{Create an inset to be added on top of the previous plot} \usage{ inset_element( p, left, bottom, right, top, align_to = "panel", on_top = TRUE, clip = TRUE, ignore_tag = FALSE ) } \arguments{ \item{p}{A grob, ggplot, patchwork, formula, raster, nativeRaster, or gt object to add as an inset} \item{left, bottom, right, top}{numerics or units giving the location of the outer bounds. If given as numerics they will be converted to \code{npc} units.} \item{align_to}{Specifies what \code{left}, \code{bottom}, etc should be relative to. Either \code{'panel'} (default), \code{'plot'}, or \code{'full'}.} \item{on_top}{Logical. Should the inset be placed on top of the other plot or below (but above the background)?} \item{clip}{Logical. Should clipping be performed on the inset?} \item{ignore_tag}{Logical. Should autotagging ignore the inset?} } \value{ A \code{inset_path} object } \description{ The standard approach of patchwork is to place plots next to each other based on the provided layout. However, it may sometimes be beneficial to place one or several plots or graphic elements freely on top or below another plot. The \code{inset_element()} function provides a way to create such insets and gives you full control over placement. } \examples{ library(ggplot2) p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) # Basic use p1 + inset_element(p2, 0.6, 0.6, 1, 1) # Align to the full area instead p1 + inset_element(p2, 0, 0.6, 0.4, 1, align_to = 'full') # Grobs and other objects can be added as insets as well p1 + inset_element(grid::circleGrob(), 0.4, 0.4, 0.6, 0.6) if (requireNamespace('png', quietly = TRUE)) { logo <- system.file('help', 'figures', 'logo.png', package = 'patchwork') logo <- png::readPNG(logo, native = TRUE) p1 + inset_element(logo, 0.8, 0.8, 1, 1, align_to = 'full') } # Just as expected insets are still amenable to changes after the fact p1 + inset_element(p2, 0.6, 0.6, 1, 1) + theme_classic() # Tagging also continues to work as expected p1 + inset_element(p2, 0.6, 0.6, 1, 1) + plot_annotation(tag_levels = '1') # but can be turned off, like for wrapped plots p1 + inset_element(p2, 0.6, 0.6, 1, 1, ignore_tag = TRUE) + plot_annotation(tag_levels = '1') } patchwork/man/plot_arithmetic.Rd0000644000176200001440000000573214667775513016541 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/arithmetic.R \name{plot_arithmetic} \alias{plot_arithmetic} \alias{-.ggplot} \alias{/.ggplot} \alias{|.ggplot} \alias{*.gg} \alias{&.gg} \title{Plot arithmetic} \usage{ \method{-}{ggplot}(e1, e2) \method{/}{ggplot}(e1, e2) \method{|}{ggplot}(e1, e2) \method{*}{gg}(e1, e2) \method{&}{gg}(e1, e2) } \arguments{ \item{e1}{A \code{ggplot} or \code{patchwork} object} \item{e2}{A \code{ggplot} or \code{patchwork} object in case of \code{/}, or a \code{gg} object such as a geom or theme specification in case of \code{*} and \code{&}} } \value{ A \code{patchwork} object } \description{ In addition to the \code{+} operator known in \code{ggplot2}, \code{patchwork} defines logic for some of the other operators that aids in building up your plot composition and reduce code-reuse. } \details{ \code{patchwork} augment the \code{+} operator from \code{ggplot2} and allows the user to add full \code{ggplot} objects together in order to compose them into the same view. The last added plot is always the active one where new geoms etc. are added to. Another operator that is much like it, but not quite, is \code{-}. It also adds plots together but instead of adding the right hand side to the patchwork defined in the left hand side, it puts the left hand side besides the right hand side in a patchwork. This might sound confusing, but in essence \code{-} ensures that the right and left side are put in the same nesting level (\code{+} puts the right side \emph{into} the left side). Using \code{-} might seem unintuitive if you think of the operator as "subtract", but look at it as a hyphen instead (the underlying reason is that \code{-} is the only operator in the same precedence group as \code{+}). An alternative and more explicit way to get the same effect as \code{-} is to use \code{merge()} on the left hand side. Often you are interested in creating single column or single row layouts. \code{patchwork} provides \code{|} (besides) and \code{/} (over) operators to support stacking and packing of plots. See the examples for their use. In order to reduce code repetition \code{patchwork} provides two operators for adding ggplot elements (geoms, themes, facets, etc.) to multiple/all plots in a patchwork. \code{*} will add the element to all plots in the current nesting level, while \code{&} will recurse into nested patches. } \examples{ library(ggplot2) p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) p3 <- ggplot(mtcars) + geom_bar(aes(gear)) + facet_wrap(~cyl) p4 <- ggplot(mtcars) + geom_bar(aes(carb)) # Standard addition vs division p1 + p2 + p3 + plot_layout(ncol = 1) p1 + p2 - p3 + plot_layout(ncol = 1) # Stacking and packing (p1 | p2 | p3) / p4 # Add elements to the same nesting level (p1 + (p2 + p3) + p4 + plot_layout(ncol = 1)) * theme_bw() # Recurse into nested plots as well (p1 + (p2 + p3) + p4 + plot_layout(ncol = 1)) & theme_bw() } patchwork/man/multipage_align.Rd0000644000176200001440000000374013571014505016464 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot_multipage.R \name{multipage_align} \alias{multipage_align} \alias{get_dim} \alias{set_dim} \alias{get_max_dim} \alias{align_patches} \title{Align plots across multiple pages} \usage{ get_dim(plot) set_dim(plot, dim) get_max_dim(...) align_patches(...) } \arguments{ \item{plot}{A ggplot object} \item{dim}{A plot_dimension object as created by \code{get_dim()}} \item{...}{ggplot objects or a single list of them} } \value{ \code{get_dim()} and \code{get_max_dim()} return a plot_dimension object. \code{set_dim()} returns a modified ggplot object with fixed outer dimensions and \code{align_patches()} return a list of such. The modified ggplots still behaves like a standard ggplot and new layers, scales, etc can be added to them. } \description{ Sometimes it is necessary to make sure that separate plots are aligned, with each other, but still exists as separate plots. That could e.g. be if they need to be part of a slideshow and you don't want titles and panels jumping around as you switch between slides. patchwork provides a range of utilities to achieve that. Currently it is only possible to align ggplots, but aligning patchworks will be supported in the future. } \examples{ library(ggplot2) p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) + ggtitle('Plot 1') p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) + ggtitle('Plot 2') p3 <- ggplot(mtcars) + geom_point(aes(hp, wt, colour = mpg)) + ggtitle('Plot 3') p4 <- ggplot(mtcars) + geom_bar(aes(gear)) + facet_wrap(~cyl) + ggtitle('Plot 4') # Align a plot to p4 p4_dim <- get_dim(p4) set_dim(p1, p4_dim) # Align a plot to the maximum dimensions of a list of plots max_dims <- get_max_dim(p1, p2, p3, p4) set_dim(p2, max_dims) # Align a list of plots with each other aligned_plots <- align_patches(p1, p2, p3, p4) aligned_plots[[3]] # Aligned plots still behave like regular ggplots aligned_plots[[3]] + theme_bw() } patchwork/man/plot_spacer.Rd0000644000176200001440000000160314277442534015645 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot_spacer.R \name{plot_spacer} \alias{plot_spacer} \title{Add a completely blank area} \usage{ plot_spacer() } \value{ A \code{ggplot} object containing an empty plot } \description{ This simple wrapper creates an empty transparent patch that can be added to push your other plots apart. The patch responds to adding \link[ggplot2:theme]{theme()} specifications, but only \code{plot.background} will have an effect. } \examples{ library(ggplot2) p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) p1 + plot_spacer() + p2 # To have more control over spacing, you can use the `plot.margin` # parameter for `theme()` on each individual plot. (p1 + theme(plot.margin = unit(c(0,30,0,0), "pt"))) + (p2 + theme(plot.margin = unit(c(0,0,0,30), "pt"))) } patchwork/man/align_plots.Rd0000644000176200001440000000037513571015322015635 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot_multipage.R \name{align_plots} \alias{align_plots} \title{Deprecated functions} \description{ These functions are deprecated and should not be used. } \keyword{internal} patchwork/man/free.Rd0000644000176200001440000000557414666004142014255 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/free.R \name{free} \alias{free} \title{Free a plot from various alignments} \usage{ free(x, type = c("panel", "label", "space"), side = "trbl") } \arguments{ \item{x}{A ggplot or patchwork object} \item{type}{Which type of freeing should be applied. See the Details section} \item{side}{Which side should the freeing be applied to. A string containing one or more of "t", "r", "b", and "l"} } \value{ A modified version of \code{x} with a \code{free_plot} class } \description{ While the purpose of patchwork is often to align plots by their various parts, sometimes this doesn't cut it and we want to compose plots without alignment. The \code{free()} function tells patchwork to treat the content (which can either be a ggplot or a patchwork) specially and not align it with the remaining plots in the composition. \code{free()} has various modes to control what type of "non-alignment" is applied (see Details). Further you can control which side of the plot the non-alignment is applied to. You can stack \code{free()} calls if you e.g. want the top part to not align to the panel and the left part to not align to the labels. } \details{ \code{free()} has multiple modes depending on what you are needing: The default \code{"panel"} will allow the panel area to ignore alginment with the remaining plots and expand as much as needed to fill any empty space. The \code{"label"} type will instead free the axis label to keep its proximity to the axis, even if a longer axis text from another plot would push them apart. The \code{"space"} type also keeps axis and title together, but will instead not reserve any space for it. This allows the axis to occupy space in an otherwise empty area without making additional space available for itself. } \examples{ # Sometimes you have a plot that defies good composition alginment, e.g. due # to long axis labels library(ggplot2) p1 <- ggplot(mtcars) + geom_bar(aes(y = factor(gear), fill = factor(gear))) + scale_y_discrete( "", labels = c("3 gears are often enough", "But, you know, 4 is a nice number", "I would def go with 5 gears in a modern car") ) # When combined with other plots it ends up looking bad p2 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) p1 / p2 # We can fix this be using free (here, with the default "panel" type) free(p1) / p2 # If we still want the panels to be aligned to the right, we can choose to # free only the left side free(p1, side = "l") / p2 # We can still collect guides like before free(p1) / p2 + plot_layout(guides = "collect") # We could use "label" to fix the layout in a different way p1 / free(p2, "label") # Another issue is that long labels are not using already available free # space. plot_spacer() + p1 + p2 + p2 # This can be fixed with the "space" type plot_spacer() + free(p1, "space", "l") + p2 + p2 } patchwork/man/plot_layout.Rd0000644000176200001440000001112514665552173015707 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot_layout.R \name{plot_layout} \alias{plot_layout} \title{Define the grid to compose plots in} \usage{ plot_layout( ncol = waiver(), nrow = waiver(), byrow = waiver(), widths = waiver(), heights = waiver(), guides = waiver(), tag_level = waiver(), design = waiver(), axes = waiver(), axis_titles = axes ) } \arguments{ \item{ncol, nrow}{The dimensions of the grid to create - if both are \code{NULL} it will use the same logic as \link[ggplot2:facet_wrap]{facet_wrap()} to set the dimensions} \item{byrow}{Analogous to \code{byrow} in \link[base:matrix]{matrix()}. If \code{FALSE} the plots will be filled in in column-major order} \item{widths, heights}{The relative widths and heights of each column and row in the grid. Will get repeated to match the dimensions of the grid. The special value of \code{NA}/\verb{-1null} will behave as \verb{1null} unless a fixed aspect plot is inserted in which case it will allow the dimension to expand or contract to match the aspect ratio of the content} \item{guides}{A string specifying how guides should be treated in the layout. \code{'collect'} will collect guides below to the given nesting level, removing duplicates. \code{'keep'} will stop collection at this level and let guides be placed alongside their plot. \code{auto} will allow guides to be collected if a upper level tries, but place them alongside the plot if not. If you modify default guide "position" with \link[ggplot2:theme]{theme(legend.position=...)} while also collecting guides you must apply that change to the overall patchwork (see example).} \item{tag_level}{A string (\code{'keep'} or \code{'new'}) to indicate how auto-tagging should behave. See \code{\link[=plot_annotation]{plot_annotation()}}.} \item{design}{Specification of the location of areas in the layout. Can either be specified as a text string or by concatenating calls to \code{\link[=area]{area()}} together. See the examples for further information on use.} \item{axes}{A string specifying how axes should be treated. \code{'keep'} will retain all axes in individual plots. \code{'collect'} will remove duplicated axes when placed in the same run of rows or columns of the layout. \code{'collect_x'} and \code{'collect_y'} will remove duplicated x-axes in the columns or duplicated y-axes in the rows respectively.} \item{axis_titles}{A string specifying how axis titltes should be treated. \code{'keep'} will retain all axis titles in individual plots. \code{'collect'} will remove duplicated titles in one direction and merge titles in the opposite direction. \code{'collect_x'} and \code{'collect_y'} control this for x-axis titles and y-axis titles respectively.} } \value{ A \code{plot_layout} object to be added to a \code{ggassmble} object } \description{ To control how different plots are laid out, you need to add a layout specification. If you are nesting grids, the layout is scoped to the current nesting level. An already set value can be removed by setting it to \code{NULL}. } \examples{ library(ggplot2) p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) p3 <- ggplot(mtcars) + geom_bar(aes(gear)) + facet_wrap(~cyl) p4 <- ggplot(mtcars) + geom_bar(aes(carb)) p5 <- ggplot(mtcars) + geom_violin(aes(cyl, mpg, group = cyl)) # The plots are layed out automatically by default p1 + p2 + p3 + p4 + p5 # Use byrow to change how the grid is filled out p1 + p2 + p3 + p4 + p5 + plot_layout(byrow = FALSE) # Change the grid dimensions p1 + p2 + p3 + p4 + p5 + plot_layout(ncol = 2, widths = c(1, 2)) # Define layout at different nesting levels p1 + p2 + (p3 + p4 + plot_layout(ncol = 1) ) + p5 + plot_layout(widths = c(2, 1)) # Complex layouts can be created with the `design` argument design <- c( area(1, 1, 2), area(1, 2, 1, 3), area(2, 3, 3), area(3, 1, 3, 2), area(2, 2) ) p1 + p2 + p3 + p4 + p5 + plot_layout(design = design) \donttest{ # The same can be specified as a character string: design <- " 122 153 443 " p1 + p2 + p3 + p4 + p5 + plot_layout(design = design) # When using strings to define the design `#` can be used to denote empty # areas design <- " 1## 123 ##3 " p1 + p2 + p3 + plot_layout(design = design) } # Use guides="collect" to remove duplicate guides p6 <- ggplot(mtcars) + geom_point(aes(mpg, disp, color=cyl)) p7 <- ggplot(mtcars) + geom_point(aes(mpg, hp, color=cyl)) p6 + p7 + plot_layout(guides='collect') # Guide position must be applied to entire patchwork p6 + p7 + plot_layout(guides='collect') & theme(legend.position='bottom') } patchwork/man/figures/0000755000176200001440000000000014666010403014473 5ustar liggesuserspatchwork/man/figures/README-unnamed-chunk-3-1.png0000644000176200001440000007220013565477507021213 0ustar liggesusersPNG  IHDRz4iCCPkCGColorSpaceGenericRGB8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|U\ @IDATxåIPD) l1Xb&@46$*h1(j ( JDAP."¥]yޭS>wwgwfyΜ9¾@@Ȑ@   @@@2*@QnV  @6  QЌr2@@P@@ f!   dT4ܬ @@m@@ fe  l   (7+C@ e@@Ȩ@匮-+Mz 4}ƍ^PfM۳gܹL:o5]vY^^^j׮Re sjܸرölbZ:ul{PI&uVu9իٽ{͚5sm۶999iӦPB ִiSWN7D@@ !Єؘ @@ QD@@ !Єؘ @@ QD@@ !Єؘ @@ QD@@ !Єؘ @@ QDJo֡Ckժun LB@(@z@}`ƌv-͛(B֭SO=ՍS%)@@ ); bKPׯwy'6'  f) JW)ZA@-@4hUP/4  @@Sx֧OkҤ$@@TS%#?}F#8j֬"@h U.͚5˶lbjzǦp, @hqǎvqY~~ܹ|A=zLX   ڀ/"۰a|^]0)}|Vb@@Pk۽{wUR/^\h/@@ h hڴi%iT:t&  Q MQ?CnI^_+WO|uJ@@_ D hڵJ*پ},J:3i\WGz sX+cjժm,uTYPjk}4IeB}~Zj0קVZ5~ 1ȫ?g2)2:O6 [h*l^= ҽ.z.( {}ꀯ,MXVӰr }2>cB](ԧgPԩSvS?~ ҏC>kԨ<2h*||/J20r {9EQOg\ENQYÞPQ(Olυ}o|  @@XidsZve˖vWFՁe  ~4۶meӧۨQҰ&  -@nn}Wxɓ]c " rАWptGtѤ T I  ]4ͧF*IM]/@@ gi_v/zY޽KX, G 2_@^ھ7BQ@B"@% iӦ7 Y|Y1  Mh;F@&@5zV DS4N@@ f#  fSj@@ kYg  @4@Y@ȚhY1  Mh;F@&@5zV DS4N@@ f#  fSj@@ kYg  @4@Y@Ț%KӺulƌŦܹ̙csε]vsmlƍgϞl"B7MlȑʵpB6l-]Խ7emС6k,4i{o߾}xx'svG[Vlڵ49DHo4hPPƍ1c5\c'N'| lֳgO5jM0te޼yW`v~ٖ-[ir 2)[R zW~ֲeRvm+W]iM45kڪUlٲe6`gwn-^zŦ=6?<'+WNNN|*(רQ#M4*U *XjժwDR>ߣ>jjFGv9O.+ZjLTJӟ37Wnq72Us\?'ywEaN*_ؿSSLLz ^rg2zXYt9VZ.@&j'ݰaY֭Mvϵ7oMҗSIDfXVyI*R˩2a/rdF?SX:3e2PN%rrfkZoǰL/UQ}&ꌇ.tMζ,Fy".=[wW=MQMtMaNU#gVFVB]K?ݬwx'`ѣ?7n.2~:uL?u sU/3???tg?͆vf\s95 sOiӦu֤f5olv׻ ;G HՔtyAϽ纉2d}Wʇf蠭W6Qr @Vv;˷n(ٷ?ᮤNj/lٮڊǦMX]1p!uBg2mÂQ+Ȍ@V񪫮u6~Ew˪PE[۶m8G 4lGBPuSU"GΜg79  t_aQc|  @(X%  Y rz@@ jQqʋ dY4@@ F)/  e,WG@&@  @@\@hj" Y rz@@ jQqʋ dY4@@ F)/  e,WG@&@Iy lժUy搔(صk\Q J дt ,_NdiLȜ̙3q&@ B ]"r1 NPT{`.X @PJMO'Ejժو#ʢI'd*U*/@@0x{7]FkժeիW6@J/=#[Yzի5jz[SOz  uX®:ӝ YÆ SR-[w}QSf͔,7֬Yc۶m}qg H7onM6Y%g@T[ɫٳ͛7rss/=zSVʕ+6ĉ[Smʔ))+gz E(3Eۧ%R/XV"2jMKF:AS,z맼K;LFѥdS Abƍ.`gϞBUy2A[{nϏs@(h9hXb&  &\8Sot_թSn6۷oD(& &ԛĐ (=slŊֲeK;CBVB @f@3*жm[ @|,!$riɒ%~b  OP ʰ[oVzu ƵӧO@@~~ .>3{L_^Zp 6̖.]j#G)SonCYf٤I{f \z[~3=E'@R S)XX"xsϵ?u}Ygnݺ7ƌcGy 4.2;3m.1b[_Π+,0Ot\M%VZя@R Tg3uqƦftk׮&MX͚5mժUl20`7u-Zd^(M6UX=0Q5Igիgyyy,7Pj:*RqTְ*cժU 91 RYҏ0եʢϰQZ>ݓe=}w̙3+tի]P 6ؚ5knݺެO믿_x5rG$ТEbCkzӁCA_W{`ԨQ2uAaO:D!>==vӄ}u]6|p7LfͬcǎՎ_skzQni)''J-ٳdוew^+((f6Ҳnp9^3o[+ sڵ^UOœ6lhjbb/pm0QFm6yejf~-[sw͛\Dw2OW `)nM65}y'nǺSY_(ޯ l޼^VZy/ݣRƟ-~"/t_*аvԌ3LாXD )'(ou { WwQf+*k2) >#r%]vT:u{oҨ.*86mi;wu}E75 GB@ d :{K/ug\Nx*~n͙3g 2X&@@P}w]jϢ;O#  ?R*K쥗^r]()X];۷oN3~AjMB@N7&oOݐ{S}-3;uI2+  F[nqݽ>`a&eB@2-Tm5?byYP,z  zXCN۴iF5_yJn=*D@(] %#<]W&Mrs>ux DO %M(yC9G FgEhXtnbp„ 3^z٠A.25<کJ$P @RVRGB A=8h4.+?-[Zc2{=6e_0avr=bTcܓ@@JnBR [x+߬Y\ϑ#G͛Vf@!~} D<3H#RJi7Mh z駟vCzyD@/) @Z.]lˀ?mժU+!6RX@I_~||ڹsgUT<={ZTAA;rl޽P(H M %g6l1~7L*eF~8CH\ _)aVҾ\j*ŹynhUMf g@8@J˗[߾}iuZfͬZjn,䃷Ț._Z]vWRL]tQFv r}v'qƹ2u.rW&^(3" &܄Q}]x=㲫+ZliM6MSY, ̡`jH?ڶmPx uqxu7)N&h–,YF I f8dɼ Mm 7~K`U .O>Ե̡jjꫯ;חu]RS;M 4pg6nܘ|=.GR95jȝԥ0ڵkA)U?je˖0/V&پ};K'M4[Z~~~K"իWmEpx+:*Ns4sIXT92%g@ufp>sgswǺIjGʥl  @@kӟ~ &4o޼B^+V'@@  <3];vNR h# L u'(n,/`&d(תFk^>DQ 3j_M2# U:!+\4 @ >>۹[蒓_:GvmeRoB@AuCG}_R @ _իK7[+cx #@^|z#gURO=hAPZ@) @o=-ZȭZgtyk#<3>hݺ-^ 8nf9sf An@ $| >>Ç7ܹ,B(SN$@ j\vʆ$"6 Awnso~jd.)}LJ*Kajժ2ۜ0'էF1J}V\V7U0'g؏Aիΰקℰ^}wM) @D&Mz5jӪ/qTfM> Ü5jyyya.ծ]OnͰ9S-K:{m6?5kf:0w.ePwlTyM)iʙ@@ zѫsJ dU4@h# Y *?+G@'@:  @V@@@ F)1  UЬr@@ zѫsJ dU4@h#_;w 7`;vN:;S& \<[ਣ|۳g+%\b'NSO=5t  hƨYxmS9޵kq<9Dh`"~[Z5(//4&  hṙ@=XۻwoUZzQh/@HF4=E d 4_|ѕ*''֭kG}=S!+)AȦ7!eSu#C.]n ,ZjY޽}K d yG M׷~i,@ \@@@ f! Q @@@ f! Q @@@ f! QE?COm߾}dݺu6c [dI;w9sܹsXՅ  oYW_}.SppB6l-]FiSLqӷonCYf٤I{EWA! N  /`gyp 6j(k׮jܸq6fklĉOZAAM?a۶m͛7wd@@@GB˭B p޽V\i]vu5ij֬iVe˖ـbt-ZdzM   ?VZ5&3sLt~vZ7u|pZ^=۰a}ݺuc鹂toɦA|=gf J*Yj|]fN1ݣPZFd|=[3m*kzꡯOa:uvaNS}=F*0>1٩Scǎu֭[mϞ=QgE*hOӋ~wqְaLl:t߱cGUTqkԏuΌ*͞=ׯcӦMs2Mb֭@@-3ww{T{]wuvUWź_R TׯtȐ!qj۶7;  >z/ӺukҦM,'''9=zmٲŵ?k  @0j@B@@ۀ" $+@ # K\\|@@ Yd@@\   &+   -F@HV4YAG@(h0  @ 2?  @@Ň-???kںu]ٓ:uؾ} g):/y|ƯF;O9 @H@CZ TR;w,6-]*UTl:3KBh4R"ڵ5l0ZOWnw^i|1lذb߲e۷lOЍZj&֭vvX?  PT#@+WSx .we_H/~a_[JڵM66oSƍf,7UI 'Plqg}-]d @8Z&&>@*T`tPVOOSp}|* KJw6EBH\4q;D ԬYmC[y@DYQPy'c8+6  e -D U˞-uuڇ~Ћ/?ϣP:/ޢC'wK(|x^]E&MΝeyGZI,O ק _ko/#,@%L B}jbo5mnJT$t  bݔ5گS"ر#i/uˢ'J:3i\|ٳ296xS5Y$mv*otu3?@ĈשSGgSgT*_ӢELK':+Q}F>u6[Zo.",t a/&kak)ШC7n,PV\i:8mڴL3[Eڃ@ D (ՍЯlMYm۶~>sLKMg<ŋgmЎ;UK)".Јo oފ ۜtI֩S'{G'g= @~C}֢E ܹ @FQnVG`رY0KE 4H@@@K@@4E" .@Z  A4 ,@@t/݆w@2 L9?uS~e/kٲeVΚ@ &@  P~?nX^RH O>=1{.2ФԩSc^X3|D+b#@j~ >ٳǶlb>7, lݺʂ.ݻwW\;sj"'@* J3Ey[NNN5GŽ;MgW4,B.K+ZӦMK{hРAkSZzc"O4}," Y T 6Cyx̢@ڵ-~RUժU^jժe1gh pR4R#@ ^kmƍ /Yf6fUV Ģ8L7"=3?|;#Y$"@ 1 /ТE _Ν'g 8 =.G)1L`vW[;Rg@V"'бcG۽{'%Kׯ_,(0C3'r(0k,7 >b׮]vwC(@Z!O @mVb7Byyye\C2/7t֭[g3f̰%KOv#W̙3Ν~z @DzUnN8ᄈPLoп!/#-\І fK.#Gڔ)S:tiҤI= FB&аaCSI#ԭ[N0!j$po7 V47wGڠA.3<&Ol={#FY.r7o;]@ g٧~j5ktǰ!@ꌧ~qv)4\Һv5iXWZe˖->۽{w[hQ_ŋ>sWĞ'D#(թS'Eb*U\4JHITYPިKN Vӂ 쭷ފMc}R5]D ~@T}QOÞT*gؿTΰV}U}&Eyq裏?njbw7UW]┘?}xBdOR[I3~AſE]ןrss ?6hJp{aN'ߝ;w֨Q#wFե sjܸرölb+q/IWnja.Ċ٢gVh Mr׆iԨQO&랏oyv؛6m Hn˦~45m6oڝ'3܄TjXO|͛7w{ɛ@/:r:#^NgϞmw}iӦT4+nݺ( !Zj+β)%WE6 ^KjS]RrtȐ!m۶%J @ԢE)T7Rx|{uG\R{ Ύ=ڵ'Qϰ7R# aULP:ﺛDTVRXWhU|)|=ӑ(m@ˣg@(+b]w9y|w_9$СiHJ=_v~ʧ_P BW^ >U qK/W_}?s\&[ouFy?,EB:聍  TRؼ:k˷${.27 .z)|׶gϞBT0zBxQh.LE@ %s\=~a` 5L|ڹs3ƶm?wϏ8+Bh6m|W?fԏB@B#O޽{ݘGg?~mYfhʘhAN:fhH~@GevժUN;4\x6uǾ}2L@(@o3f't5lذ 5z깡㋷uV7=~ߞĊ+GkڱkCuÇg:/9tXiv饗)hև 9]8p`}ls=g'x;C\BYQ Y5vz8vmݱl(U{>:w'~  @ڵkY;/ASH P-Mt&ٯԯ5C@@NN <8"M}1.ߕg]tIRDnBJ$A@!?ѭF`^snƖ:@@ x7D{F7@\; @(@>}Kٯr DJ4RMa@@ f  )HU7E@/@:   @@#U@Ⱦh  oذ!b.]*WlrH*Ud,l&/4jD֭^mVuϬ~֢E ?WGyS}j?kڴK ޻vqS l7N}U}dKcֶm[k׮]ˌLP܌\rծ]Ə7A8쳭Cv=;N'?nָ< Fr:t׿jwnv]xqSyD-[1cwg?K\O@@ MDy@@t)#6c&M{ocjm֬O=/мys; ~a(l]kԨ!hժO&[bŊ oիpah03" $"%DԘ@@ a ]w|;w[ Lwj R0Jυ K۷ x/yelŊ֫W/םMOO"X'gnk֬qbrrrXg#0OJO}qY#c5jPھ}]z֩S'[zUVƎ,| PR}?N;$,.]x/y 7`CYfٍ7h=z`a]%K'gYnɪWno߷|еuUV:>装{˲H΀B|ro7^yHرM81ɼ?Sjt?M\6o9S`>jp{>rFZfйs/êMKݺucscyOSë.Y4 d֭g!ȕP vZw&/v?C>?U2oع`,D%է?5E|go.W_..s4F2_W5kL e8ס.r-6lذX eݕÒ$`L0`p ۘ1cwߟsYR}>䓦#?sʕb )23E@R"oذ!1=Wؤ` Z|0ŋw80VrEV쟁F]M ?]1z)`고[|DUVu7,wYhYcӦMsmtvܹ֭[r.E`㏻̙3SNKG FiwqtI>Y#/W쟁Bq[o֝ڵsa,DէT@jxQG\\/3}_~6gwsN;TÇKzT3'էAWo@!TT=W\~@ tӊ~;U1[+Oկ+)k޽{YP}}|?5|HtC$hY@@h4! @@(hy,  @I@@G" $-@4! @@(hy,  @I@@,"أ>j۷^ukѢ|n֮]k_ew5Ȓ%K߶Ν;СC#i._ܞ~i7Fy7w]3Cꫯ,Xjc9ƚ6mj\r{_o֬9Pd"'U9FL ԪUˍSa{[jes;֮zw}^yjBAA͙3]tk?xӰsu]q֩S'fL HV6 2? Tt衇N;=_ƍm͚5}^uTgAϟΜƏ4ePTQ.6?ATfMVZ`AT؂q8ɫ wT-BYnWa co$M[[:U`NÃvBU~; :߹sg;CGږ|NTAM op٫.o{HCABZo]jmJwݺu_ڷUAhB[;W,J*t޽?es>Wl%uǗ!PU ;r.)u'eBUԅ0lSa(T6QG@@f  x   3+A@|.Y֭[g3f(6]wΙ3Νkv튟  >Mi&9r}1 ڰalҥ)S=СCm֬Y6i$"! _7}g 4($6n83f]s56qD{']?`'O={ڨQl„ _y  E?կ_ZlSR'+W]iM4qZʖ-[f }{h"իWl/ly#b#(h$ B`4ҋ:zV'AMCSa}'ȣkCuFkmJ; oTE0ԅkoMPQA/Tئ*|饗ܙ̧z*M]֍4쓆p\fM Tej9i;&r-AT$Ekb' .?VNzW0d@"/#_   HESL@@/~  DD m@SQI(i$,TCteFO@7iNgRA~totZ{8J>l-W۔ Qhz]hК.]gUO P:jHvLT:ktщ2S#5z8S )5R4FAb$dS3FB1RR4U{Nf1YWA[*\FB|j  8P6@@ T޽x≮eFK@@|-T%\b/5n؍Ztwz׭}FHuk .LbY^D "Zr VO<}nnݺ;Ϸկrڵ4>= T0V*Y R߶[n]v::>֮]2[]WZuٌ3lɒ%sN3g͝;@@!3[?~_*~M(m,w}~+k:k:ydrto؄ lСvgn1.Rԩ^^x;vlB uYgeaͬ2oVE@",/N6m̙3/{Lՙ_[gO]߳g *7n3Ǝ#߻SAg|ZtM4M JE/ǷO.ů\ҺvUdժUl2wV[_hQTy%z/=33:#Gh, 6Lb -N:ѐGU}!}T*! Ri1]5# ~3wU/2uss=g?|?ekڷuM;)%>`a%}PwW^vx]ZA8~zن l͚5wК VFh޼yl[)yP$$R-Jm:S&֑{NJt; ޲P:.4z+Uۖ-[ .VZy# 曶bŊmʘbHIr:#l֬Y裏ڡjF*,z]wo4 Eױcb:+_^t /P}. elٙ?}nӦMiY? řr/Tut)!CqHIMz *bt}_H4~(΢WySr?OҥM>?T+n_p1L:ս7{leuǦM>n%! _ %/_`R,RI2ՆS7TpӦMK8{ugJuY]ׅUW]e#G)SI_~!C麑m۶%.?_|X5 n7x @ ) @:W3^D [lYj)ڵkѣ]{'n{I*KTgG5Ϩ^%L 'TN) o5j`tC75e.=XݻwP7 R]{.#_xJKymR\p|)PW .Ih;Q߮5I}&2ͻQ+]Õ%~$WmU7AMMHj aGmG/>n z6]ӵ뻈@}OYɮ#T#7qn&Lp#1۸qcl$͛7m$T湴e&|W< j MH:Xib$$l N#!e>=HZ@C{5~$$M  "=|  >|2rw ȇ@@,pzW1ߵ&xF*:\3gδ?Ovg93|@@  .=v 7S7Lwn6,&O@@"+P1%_zu7h-^Cf/N?>bw[f̘aK,)>g;wЛ@@@JC=d-rUO>Į7bƍKXf <Ri…6l07ȑ#Mc+CڬYlҤIhgh ^ K%>|;{ٹsg7Xvu^{{ /ؙgi^z{OH|M8p75  g'O1b/yY^-   HI^Zݻ1s Ep޽ԵkW'6yժUl20`@LRW O@@ $JץK_yRs^wԟ~ FfNիg6l0]AB5_|e_=6>=W'aHjRJ0[NVE,999A~Rv g]E1.I'ڿu…@4RQW5ҙF K&4M&#SNu95@ٳ"uVT#7=M/ K:tͯ4Z-[T uVP*رt˨mJ~~mI_KAMIFB <_y6 ^{nS/TtmSA*u|+I(`:N%C>tG\Rm 6tv~oLdl޼ {I[jt'tKn(N6 CqjUҁ;U2EK˫OoHQoZu@~D?  I1!o"P 4l0ѣGB,0f5kVsQhٜ  @8"H MI$+0mڴdgΜi˗/M~Hp.]*}7SNu$EQ6mU绻v=شv9[)OR&иqc7ˡe >n_Mȡ@ڰFƧz* >8ꨣ|7Nŗr T|e=UOguV-mڵ˴,/2† LCMխ[כ+XOIj/-A<ɮ@XTGAOTˢ}@~Rә='unL .m*hi_:;tVT.רQ#vWK:ӦG/.;< r|ա^bjR&u`ikeHFcэJ:Y};~ oٲ%]LYygrHZ;эgA Q4RFfm/D  tyz%=oժ=jC՟tIK_P7 :5۷e]r^q(KW]_P({޽if=t:S&Y-[=hhHߠoKq6u-_eH6^N|Y%h4uT 3fӧ8m;w\֭[kb6@@L *9rM25xJ9sؐ!C[۶m{C ,/˴;?( D[ܹsPNW{Wu֮%_Ύ=ڝWO&!:v}Mg=ju[Xx XmVur y޽{2, 2(->Qc^_@mo馴fTnRT& ;Bm؃VН|#dN h8X =v7!mۖf@  )f  Y jt _ ߜ''UPP CC׬YΈLX`_#8"mÂ,W_gaO=st h02n8;ӵ[wyf 4 tu~Wq-,,}حZ4 s9־}{Z3# Wb|@@ )J?^3%hf6]tq(˪vavQG=n*Fgr!ˍAnPI q1|# e bPu~lIhѢƍg7#ݵ>裓n6l7  |  HH˖-+VX^Lŗ;[zu-]feaRj֮]k~ֶmRdoݥF9H\,u~o"sΚ5]Z,E"ͳP7~:.>Zu}sBuuI][l.BJ@Y""m@oh\eu-6Uj?R4=7|c_| ]x\ԯ_ߞ|IV顇2uƏoիWx@Y" r:{l\W999f(F 9sc~BO[~`}_r%n(ZX'-4iRCш#\;?O{ %u~Ô cE9s믿>:x-~S(}\s;-羋.g{_}>DŽZZE~GpY/mB+1O-,x߾/8xؚ5k>Y(k]$_ hǎmĉ?//v{=ٶmit<6i$[r)?-Ap藒.M˗/wg5H ./Rg%=:qK푃b{,ulk׶{>#| ȸe˖6}t{WLǣIg}]Qʳjժue ->"tͧ.<㯥bՠxD z1!y͛7FN%aÆ[`nnnu5CJ"%-_qwBhH foSjdJ)dnH6BЖpGePPlN|g|8lϫ9qs]!~2 vECKOOZ۹sgѬӧObS_ؤ)]KJΖH7!E<:իWܲBu} 7nX_ :涏K]pcx)P E"l.OF'~B'SvU%GQQ-_ĩƎ@iiO5J$Rmh[wB+qI -rj@KM6Y#Ykk<''ZZZL7. E1PRp~~ojjp ,U:lÓ"1g?{744hnH6[~EHw؝rс#)OʏFvDjUޑP3z^VK@lh5?3c7q~"rPUڵ7lশ3Õw` m@g zȞ?m3h .??._lϞ=gϺ۽MHS DH=>j)Æ ^H[[[n}lb&M_ŋmܹ~w=1bDE]۷k߿"S+~a5556~xv544ثWln?-SuOHAj@S0Ӹd9vX[ryE.ԧš\ې!C\Q---n{qU;JBRY4skGn+mnJۼy^8fׯ_/_ؔ)Slȑܹs_v>++̙U5?}۾n. #' @wŋ>}TnN  @{@@ TP9  (@@P@Cd  @@B ! @@U4TnN  @{@@ TP9  (@@P;rFFIENDB`patchwork/man/figures/README-unnamed-chunk-4-1.png0000644000176200001440000006574713565477507021236 0ustar liggesusersPNG  IHDRz4iCCPkCGColorSpaceGenericRGB8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|U\ @IDATxu.- *v9l !Xv^PςNDlT+(rQSAl ^}71fwɤl>L$3LNAIi2  i(LS9   僀  VдrS  (@@ @@@  U4  @g@@ i0@@P>  i M+7! @@HhZ) @@  @Z `իg 4 FOMaacʕ,1oMu"'Zj.UV%XļGݺumѢEySzuS^:":]-^8b|"ojԨajղ5k$XļEEEVfM[dIDhyeڵ,1oÆ M3@ wٴiSB v֯_rV7oܖ.]j -m9֭Kh9-ӢE _ej[:'Z-[e˖ƍWmÆ wߥ@V,e&9[@@ ֗@@@@x  Z;  @ho@@R+@Z_rG@ -  @j@SK  QQ E@Hhj}@@ J4    M/# D F@@ %w@@(Q̙3W^B;m; S qQGO6rHܹs:e! y%׭[O[? _xᅶa @@R eˬqeH]xF  +WG}.\ ͡ UT oXUnݺUtuRm@*!C+P ozSO=A[fMmuԉ@@&O<Əo<W^{KN  e:nwygF  F oO\@@* L   If   5[l3fXAAu!T  O PuƫGq.Z6mdWΊi  @y} ^+T >uΪ@@ m`2O<*))q/__%@@*VZ1a֯_o5jԈ9   mڤIwv!Ezկ_?4@@`&aÆڵkmȑ@3ϴk&XarC@T7}/B7  )S)%c@@ @+a"  @A  @0@@ h I7J协5o8oY5zz"[{M\o^oYȫȲ޼޲ޫ7>WoY5eyeWo|"ZKdy)?<@ n+.' ?z$5^Uo~e].v&SWn>{V.茶^^˛4իc!7N+L'|C+dP; ë񛂨_jVíW-iPزev T z֭[K)uuDqv-2PRoە^fy 5GMڙ2ԩc5k֬n3j^ӝ&]reE7Za 4H*uz/U2ЇGYjU%5./L2P;XzuU2E8%SW}׬YSIiOFY_dU575l0#e9'զMZXJYz_"iݺun 6$ӶU/x2?h{X\\bn>mKIL27nܘp~*SRU$.}2Uf"틞7!ot x  Wyi,  y̯j h^n d^4`[oو#lE" ț3GY֭-ZJJJ/vey G@ӼbO:$3g2NK& dF4?C?_|P  47nܸL˖-F@@ @ӼV;ᄊ~yxE@rZ4ͫѣGnڵ+¦LZP  9π{iǏw%zv, @"|YӴ@,YT@|YӴ@,YT@|YӴ@,YT@|YӴ@,YT@|YӴ@,YT@|YӴ@,YT@|YӴ@,YT@|YӴ@,YT@|YӴ@,YT@|YӴ@,YT@|YӴ@,YT@|YӴ@,YT@|YӴ@,YT@|YӴ@,YT@|YӴ@ @{_xZd;eoܸ&Ol}mڴ)|@T`„ z<;vi??k0@l @WXa?8T/;<9s믻iׯs=״A>|VRRZ^{5ӧ]s5jժgd  4i|ͶlٲȽk 2._4O!"PzS8&MD8tP;SN?N={^zɺtb_~ /O>8y)pe-[Xj矷)Svm9#@n>S֨Q?l|+VXXh/۞^BJ P@Vo5nڶm͛m޼yֱcG7e˖Vn]?ֽ{м쳏}7O?qZdwͯ`J5kt~O2yQmWQ=>s{CT_q&C+#p9Cl=W3z%!@ftf/ĬYܾ~j4zh7=MGJիg:t5jm?ml/lڙhM%[ևOt_XLtƚ?L6l=ӡ:.Z}1 6t@.\hEEEy5|C= hw}ݴi| ׮]r Q:ug1f/_<4^_ XxáfD=%D=I&'8"OvmmAM폼}ҥKxOW_}͙3Ϳ{}`x~^֯_?Y|~@&۸D*2n4howߕ2T> @u藙҅'ͯ`/zG/E]Z<"qͯVq (8V &}To'Sk׮-wqadجY3[x;l=OE(7AjՊ֪e{<׭[=)闺{`2 aF(#0{l3f=eUh?{0Ѿ,#l馧Dʕ+wiHRlذ!2 vuG7k[*We*w22u_Geʯy1V8=oi`RJA*( dDIo6n_ aJ O:e?/kxںu{><} u1uOohU\V(x.弃;~(%Zvj觝޶o~^~lv&[+翌.sĉ4[zn45jviuO]vuL_pI*+M*͘)`S^~H?`@ ^X*Cwn݂!@@4"@@~ ݂!@@4"@@~ ݂!@@4"@@~ ݂!@@4"@@~ ݂!@@4"@@~ ݂!@@4Tg"@:/~טs 8F._M2e͝;bWqƘӛ6mj]t9 k0 @ 0V\=)޳ /RC ɡIS@rK`֭vEم^ {Wo+̼h5@@\SNӳeB͚5*ԣ pRXIT@%\Z@U`%QE@@ @sim@@ VD@@\ ͥI[@@* @ZVUD@rI4&mA@hXIT@%\Z@U`%QE@@ @sim@@ VD@@\ Mڜ={֩S';Cmɒ%i)/pֽ{w[n]Zʥ@@88>_~h|Ϸ={]ztA[:uB@@)4hyVZPI%%%i&{GBR1пl7o쎀1"b9ȫ޸qyAC^  @B qYf>}7v}0;0ƹ\`~QF{v}8s`6@@ xnB 4fzqn;ib{t'n|j߾m6"@HH4!fu]MN{w<@@\ri27᫯/Қ4iэRjD  @pYNj}^zż"|I;zak޼}}E1 @*܄2dvi6p@ݵ "MӧOnݩuҥK7 C@^4U4m4|xu\yV^N<* C}jmjԨN{ekZ6m*C(+UPL^=T=YMACuI͚5VõA@ LOɋNچTHkڹuքmKkժrzuݺuqze~+H2Zrϝ}ѣG\fRח7=#T*y/_<"W}8E1S%oAQZy_0o12P]4>8:ݮ0KC0}xǪUE~յL!'.m/֭Kd1D}j<~+.P'r wsDY~T|ӪUx(˝S$6gϞֲeBG l@O0N=TOAd'NtwW,@@"7G@ӱB>w/=u>)m4hP:K  @F@fM$@@X@@ l@@b va,  @@SK  @c0@@ E)%[@@]  "-  @l.E@Hh`@@ hl" H4Ed  [4 c@@R$@"XE@-@ۅ  ) M,"  X@@ l@@b va,  @@SK  @c0@@ E)%[@@]22vѢE6i$2R>" B(r{.bV-_N:${衇*_9@@*&@+믿>;&otAvgD  @lݺƏo:C駟~*R, ͂o[͚58T{饗@C" '}3_׀fڭWըQLMʌc  P8kβ[n֯_o:;@  O?OY'SO=!@AZ=lҥִiSlm͂Q@L X۶mK.BΙ3'y, 4l>, @@R'5%g@@1P  :ْ3  @ (B@Hhl@@ h tڴiZ6lؐ)@Hh# oᄊ;رc#g  c\t^ Ϛ5֮]jҷo_:ujkE  @j@S[aU,b{'+\  @UȊT>g͛#<,Yb}7nh'O>t eUK%%%6bĈ2U; Zۨ/ +-?6{2M~IMi?)- #*/38f̘a/]~vy̙3믻iׯs=&L`ÇwUtڏ?}9 x뭷kyٍ7hG~ڠAL .~7-OF2@ "7nr)vۖ-[N9sooC;:udMYϞ=^rN^~. />;+&먮NG>J#GrA@5tt[ovڹk^f͘UlԨQ  I&2nL髯r6;wuM4jԨtlq@J 0Əo]t 4W>Oe˖… #VV~gV O$z|< nC$t:GGne!ӝvXuR=ԞXGT㭗ڡPG6ԣZjI]jOA#_sCG.Ӷw ,X폼R&J쟺uf˗/w:_u`Rx~J5m1l~ߕS1O'd @>c c,?mɚTG,UW]e[v}cFHQ>}(§i|Q7ןO"(Zzu脆hР< 6]F`CaÆٚ5kfړL[AR>S!<)dP0.S?6"~>uȫMdE\5u`ȑ?e*nݺ~40#ֶ/>KuD)WO^xE U@麮Qү?vygw*W뗧uƌWiv@dtGO?e.t]7znu:oc<@Oz6p@) VחWw+/k|n{vku#;@dtSH)}e=TLG?tɘzfiҤ Juc'?*xknvӵSKS]ZXZC-kt͡ޓ@R`r'㎳>][>SkrY k")ݰBB@ fx9:M}7'+~?{:c@@T4PN2C@L2!# *@('! T&@Z@@ @@* L   hII矛:g}C@+Lf $"?ަMfM6:D`^X T9c{L:0`{ѣm]w d @_~tI?n-e˖SOGlV s @'/o̙3mΜ9|ܠ+N~ T&Я_?;l޼yŋO?)SСC+[ "@qٵ^Nnvvwی3/՟l@)vZwYؠAM6nBܹg?#@ o5]]՗gG{@W5ltv.:L]˖-G$5^xuQvZ=]vgyN9܍j޼9qJ/2{m֭V\\l> d>v7Z[UW_}6uTw}:uL=hӭYfQ%_oV\鶭ھ'<|A- b@ЇzJ]Zy2ѯ4|{MC]wyf@+7|ӽ_~{m߾}]On@uXY~W6_&oܸV^*%3@ h5짟~2}۷oNiN;hϗKRqQI&TG44hQ [ƍm塌#!.رc#4]6x`wOwyϘCGuYZ2`SF$USwhV ;u+hF5i֭k&KժU֭[+K$@t AݏJ={K/m>sq`5Sp`O.IG:˶vD5XGec%uGcՙq$}//ܝRS8WZe;찃mذj׮fq[o5[l t>#\ K6l0׿v^z)@s4ۦZsȑv=s=M @==w\z ~%.YĝnkcuuTKo:vh~m۶ U둧]vuwujcBBIm;M8=ISu$Ȍ@ G@鼞 TG>Nך_,{!Rl/q=A#N:}?Aiyq&!O@zilVW^gty\?j:֞yݻ]tEi"䵀У>>lSO=UWdF #{キ{n:ҥ]:73R@Jt1E.SR֙#dFw:{lӟNw+>䓈b?x @cwy׏^Ҕ)Sܣ8;t(;z=ĦMlȐ!;K\7@B .p7nҰO<= )Vv1"$!@|z<_盛.xY#%_^Y4E]F7@ 3Py?%:ʣT@,Kz Owf_^n>S&MO"!(翯\ve2Aɓ'H@ }PuQ7|j__~]r%GJIo~Uȁ/SR"A9:y5ׄUP:f뮻gϞAC C #}iӦ(_[nu})ojH6 )n_vmZZ:MBY੧r+ҡ6m؂ _K/S7rZ Tn}+l}ۏS9y-'h$@ vi'Oӭ:wl $sO)w_ˁU]ϫS[z v:ua|4|l筷6|LZH>f@'@-/:#M$@@ @O,  _i-  q9g B8oR~=_ʏ\22c Êӎ @ޕ7ƃU/ [7r^j~/Kf|a8UmɛtÆ =>bJ~Y%~ei&w/'}کD~ v6lЕqDtC?oo{]Z]k@ʱ  /P_l,  Wԯ!  B  ~@ʱ  /P_l,  Wԯ!  B  ~@ʱ  /P_l,  Wԯ!  B  ~@ʱ  /P_l,  Wԯ!  B  ~@ʱ  /P_l,  WY.;֯_o`ڵkvVZ! @ Ъ/...]ڵkmÆ v_nϡV@k0+W)=M6-l.@@ f?ҿ{۴iSDwE   IL\v6m "5kX-"@Ȥh&.{Իz*ըQ8;#.@@܄.l۶;~ 7ŋ裏;/I@@ @slȴ< @/_n-XL/;ִ O5F @Ѕ Z^\ oga*}vy̙3믻ׯs=&L`ÇwӢW7#@)0rHKmv뭷СCC9{6h _~q?@B/ӮJmww}UZ_;.{쩧b{饗K.naÆٺuO>LD@ ^-[s=gv!C#:"?|K^{۞y5x/g /P5V\iyf7ouMkٲխ[ϟo?u=>c|pqoׯ7^kԨ^4h1>7I&-|#zԬY3zZՓj|Jdj QZ5oc֭~g9)3k]wuhA E;j9?dk^qT3b\)[g7 |N*kVPFrs4Gmڵ7]:**8%ƹ馛L^܋M%_:j7K2Xjj8s2M V^:^xϝ'LԨeu͈#Mmڴqhtbmq@-o@-ꫯvni͛N+sZnROY02T?~xu*M47nvjcƌq.tJ]1ޢ" lv뮻.ҢΝ;ی3lܹ̜zp]y쟒f'<)xo;=SN9.2ӍC^K:}7Yu՝nvaoq^@HJouSj҃>n@۷ǚ4iܝ~nOT,W^):.-tHFBNZC]s}mBhF@!о}{RywqvGk u-?y"P@Њg <@(O@7/VbKq.k@ C   @k6" Y$@E+   @k6" Y$@E+   @k6" Y$@E+   @k6" Y$@E+   @k6" Y$@E+   @k6" Y$@E+   @k6" Y$@E+   @k6" Y$@E+   @k6" Y$@E+   @k6" Y$P=BU())w}VZe]tmm6e+**:*}{7  @ 8Bteݷo_ꫯOJ}y慪믿Z޽mƍnb[~x㍡y@@!@'2:ujhg}f 6 ͛mرx @.@l+W̅\@s`6nܸL+֭[&4hthtQF(# P/_.;ӥf ;uphժU -WzukԨ 5{Z駟  t(<>Ck׮n:,) '`Z/l{glG@R*])M_ $? ,((ybMTpt!Ě8@@ !Єk%KzRQmߴi  ̭:vhk׮ j]׮]s@.дW]biJmڴ9 $*0db.$ln}vډ,ʫLukxwn%@Ο[/Ufrۨ>FI %GD+СCPY|t&/4w\vtwAپvv[-g.u&L$*hMw3U5rǪnzN:e&ɯ%= M}<}8EMU$rxf9OMuI >ǪUbQ 6\^dꡠM_իWWTI'd6mr_x{o߾iCA6k֬PTTdSuYvmyT:^_ànzÈ QmUvmԓ|i۪}M$i-Z:DQY^zvۿ7$zi:'G>wZJU/O,.o=]vڵkF, >U-[/ӭSN)y֭m֬Y,[,C@,P,VF)gX7( ]kc*wnԻ'&Md  @J8RSN'|2"HTرcǤ*}w|Bo6]۷iӦO?=CI dnR~Ve{Y7|3e$Mmvg|-pԩ;f0aBD@h ~a2dmܸ-#=z'ңk޼?z4@I:ү_o @~-U KϟB]J-Zwky䑈JuT](=C|˂  [ͭpkڴiQmɦXҪY,  pR6LIPs)wҥK@@ ux/RݻWOxR_~e?/ @@p ʬQ{NgF˩% +@-дiӸeF@?N:  @F@3O  @ p >9-F@ Y&26l5q &  ~g_9[ p >[ B@rT#9bi UE5kf/ӊ+lܹ^ͬh֯"* @n N8暬o[oeW]uU3+)l_C@1[4@vl_C@1ͱ̜9ӦNj5={(F@ d^z%kMw*nڴ֭k_ըQ#bvé<]ޱcre d{dEt+b۸qmݺC=4-{O>6i$7nx㍴M!  G@7͹?SwSG>/bcǎݻtxҥvwSGc֮]4F  s̱ѣGgkBYT&THލ7vG=gOѣ}6lh+WWĒ@6sα-[& s'-PTTd'OvIg t[:uRRhJXs+c=Y|yDt=h-"FOŨYfl7l`j*3  4i0*R bk׮Y=t["Iy><0E͊W|"B5TGYC-m۶v)ƥb@{.tkA  UE@N$+yhꉅf޾^z<[fy%2>V&3攀N̞=n6?WV߾}Fۘ1c\Щ.6m)@ 4gsai_VH  S  Ph%@LF@V4XOrC@D &'.=͛g[lI|a@@ U^wuֹsg;#lmu̥ .@k oSO::֭_ " @@S-G?eM=2sԩy@S@@2ʄ@ڵ̻yf2 y+@>ǢUVY.]/@@ VU}ף9s֩S:ud3fpϚ;R#@Ȕ@VmxZd;߇7ɓ>2]gH=>~mkҤIvTZ >֬Y7ыk4vX~*< `YvmE_Ϝ9ok>sm„ 6|p7$v vuZƍ eS  z[lȑ{6h ~ ._~Mgx#ݯZ:Ks]K/+mذan:O= f͚v^:">_kwަ^@?EPr;%M8=XyWS=McǎnT˖-MGϟNvݛgo\>_t6m ի'P:ʗlP2yTViLAzD|,(\yn=PCyIM~DѣGɺO?tL7nkm/=mR~o9YVNt9OYOޙ??FW?-3? Ν7|)>4ا@U{~I*nfnݺ>tva,@YcK+/xurg]1 7StZy])o>44I @խExҗZ]Zژ }uto7]'@~TfE_[A֏@ }~/<wqvGmD•N>z`w3R: =޸3|# a8(ۯ̍mv A*.~xO R@guX=ФyW4ҼG "OWԝNx6bĈTM s~@DFnW]=o~,  哀@ < @|p  hĤ  hp  hĤ  hp  hĤ  hp  Ɓ,/PRRb=9{7n꫶xbs=X=(@l ƵBӟdmٲ-ۡC5j t-Y6l`7o?}dey@rF4gVe6dʔ)6uꪫBs7: ?Gژ1cc@̙cǏ}D͘1#KkVEZ!l2w}ŊS.]:^~}yfG#ӦM#-#@3X_UH5k4 c,رGԦF;GKA lĈ6n8k߾}YiƪWN{3.޼"(GVtmC]]~}~_o:u*oU֭[szݺuv112>+ڶmkC}Z:u܆J7"⋾kO?OeSJ]tQ>|UV]_[n?-?@ +i;`02nHmժTvxa@c8\`8i$kРuYe&R_՚6mjѧ цn֬Yvڼyl/t  哐3OZ5|" q#N{keIe>W~Aϝ;׾[kѢ^et@rBsb5҈t-!C\:zVtSRPW^#<!=c9M, dG@~QL 4~f\Щ#SHӧOK/4"cڳ>kg}vx  kFiO;w6&LPnyݬM~ JO+**g{ @} Q|דSÆ 2 SI&Kƍ}bTɒ/~(oցz" 9jiX6 z:ׯvykٲe6W! a$PH G@m^@@ ^ hqڋ dX4+@@| ͷ5N{@@ fxP<  oi/  a G@M48E@2,@@  @   @@3(@7|[@ȰhW# &PPR˖-h… m޼y~EOM5lӦM.ޡqXՓmɒ%֩SDͯzTV6oܹsmֱcD D=̙cW:MtٳmƍvA%Z<#@XfM<ڷooOھh{e˖[~͘1v}wkРAB-S۱ӧnfEEEi-s]vF%\wqqM6vygkܸqBewi_N;dM4IK}^{Y˖-*34|LO=T7}ذa%O1dȐ ';K<Ȍo.9c3^|@|7%kg}b?2?SS3veN4)5ȵ+sܸq1fԢE\RS@\Kڸ2|SS3+^]C8   M2e  RBh@נڅSmKQ=tJ&Uu$Iǎ;jXӦMk׮]FѬY3^~փ@ 55kt!]_N>Ge֭[7jjj~ ]{zRSHT7B46*ߪLHڸ Qתze&z}mTVqU;찃ְaø 1onB o4  |)@Kw}׎8mg:Rt=~_CEp*O˫+<poCA323}WmvYg{x S]=|gJb{?JL_UA.G;Ιcȑv?eJ[oeCu}vek]NN>;LCms ^6% sd;vd7ts11 d;_U '﨣z 髝;pB +K[r!lذվN:CU4*?WثWң)+;<￿' *–tzv[r)̚5cڵ%={,)}`{.[\r%*O?-)Nʤ5 @eۻ‚WM r;o*;vzXxq9SRz0D}F ]Y/v,*׿5vSv5_Gt3<?;KIK;%n:ӓJ?6|p@ /tG+W4=#zb3<:]t_FХ]%^=#gWN]x)A~+ڦv.2lR]we_|;>o8v[f,}^Sv{^ng}zf= )[]2e˖-]{LsήKs纻Koı?|]eX`^q:L]ˢ ZЕxM_ bK0`ۣ뮻mN]#6VBa((OGEHxE`{䕂WM /3\eNڟ;jʞx /OU;-3vVg+&~WRJ7^z}SvݓvjB+M6iwqGkE5_)!Ge:}#-ZXߩꎰꈟJH.,mJǃ>n KǗ_~Pښ޽{[io n|TTtzx ^@ w:H)zy۔>, sd;ifvT32l~L7eQבJC7bAxμ @?4ްVEL׳br_u]w+dW ۣzd#MF M z;OA3=  t;uQqB4t;)3vF5# T M,#  H@@T J|@@b da$  @@S%K  1@c0@@ U%_@@ced ID͞=Fmmڴk=tРAh"_bz ﺧ1 z>t' g͚e׿LOcºu?H #ϾguOc)8KBO7g>:uZ= rOMR鱞|nx< }f9ozս{w{MO7shի?O}מ{9⋭AvW… r#-\|s9^|E֭M#! P@<=N^py>If.]7p~.cz^?{6c k׮5n؆ TV7?^^z `smO>ن bW\qko#G4J%UV]zz&u죏>r f{챇 jC@%3g4>|(;e]L:X-ۻvm7s[lթS&LcnR&@2ڪ~*Tik=ܫ5oFԪUK:rz]wܹsiw9 fqgFf@ t WEM/))qקMʫ~n?taو#8]ۤI|: %XAR S_%T5MrQQQquZ&M5k)xE O5 0  |E+V': RXX5:S:r衇K:3ʔkWf&F"@;ykhtC3 }?wy'=o@H};l6m2pAlb<󌻱Hׁ7t#z׆>R8~,QwO>Ğ|I;s/P]7SwN> `'OI %]=t_xr-vךFX]iΜ9v 7a%_49WbÆ M[lv >tP}]9~x;C\ڧO]v9 @T/QO-9V7֬Y3wS=hX)? K׮;Q:-8\S"xIHF€fnFI4M4ڻn ؆iLeiQWGGMNׇ (7C6^Ksw\{뺶p8lͥOaM>8v0iXt:k<#XrϸOYcƥS ~vL<ϭxsg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|U\ @IDATxEֆKD$"(ȪiI(,`XXPQ, (I$-9b_5̝wLLWwgfz:Vts2]J @\2$@$@$@$@$eA    )1͋ e    )1͋ e    )1͋ e    )1͋ e    )1͋ e    )1͋ e    )1Z/v$.]'ND}.7 [l/dFyʯ*N\n>Aٕ.W/K|3gx9r 7ȅ ~t>ܹsrYO3gΜgսg\ɓcL@*oH9nϞ=?,~a=HHHH aZ@VÇN:o .oVƎy~   0[@mRW۶mUwe޼yb Ӑ 7IONuZD9a衇K,8Ղj1X x1B>Mg8z>@ڡOY*]z]x^x{u (^ lYSEϿ.3r]sV7P#3fjՒ%KcHH5 6SLTCJl˛u{"SWkͿ!PnQ6!G3jI5 xف0 7 uF )RD ĸ| ƕQHHHKh|9ydڙ={vɕ+~l2S d@LB(o69sʾ}d۶mTRfg'  !e2+`x.]% ĝ7o,Xѣ2{T"hҥ[ek֬;ʖ-[ԶӧmpޡCYpr8ه $`ٙ3g::N! H9r$%%3f >\nViݺtY6m*p*^F իڿ[n|rYC$^M4;wdzgʨQM6M0SF$@$`W~(CժUe +*UR뒓%[l%X޸qX,uEz  @o߾gQ`|B|&HH Jqo駟8݈ÂV_|qA/ӂe*}Q{zݦMΥG[`H1.$8xs^D#tr붲DJ{a*A0V^xA~iWԚ:Uc쏇T6Tx˖-G}N;} F˪c"+Z˂8icLGK7n^qa`B"®zYO=;hXdS|,:F1DGD:/ g })(OSO*Z<1;ϝ;n>:v7Z? *$yU-c=XVZňa& @0V~GŁaJM" &(DㅠQF/ȣp^A/^'> ]"~@@,0>OD{=Ӵ>1@:3gjJڵkZD:f̘ŋ8Q[̚5K݄a"Mʕ]^< MB j &(QByXv_  k hzl{sVAC6l|mV3g CpEҜ3$@$@vp *ŊS.#: Z ܬƧk"̎$@$@$@$qC ` N:r} \vQOҬY3.-b HHHP7cG[nQnL@dҥK/QXZ/UVyIrHHHIᅲ>HkL>y瞳: 7y73tv/4m|"o˳>l2/$@$@6` M y=ra[oS0! ~Nsر!ZdIZLEHwyG~G!u4]^&B$@$@H&'Z*| ZRZTFԯ_?Sg^{My`H? nTN`׮]1$@$@HP33T{\nEt7 7 (hoG ܔx4bݻ?9jԨ ;#hTO#G">g3(:jG F3FF Z}݈A&^}:eA˥z5ADSLM$5a HK[ 0oǹu2nh-{McZc&Ji; @~A3#9o99oO%G"6ʬ Ђ {m"xzY`(P@e4 Q0?rxDݻ˞={L2K/%K2ԣGٻwp<V3qի3:HHH 2Ο?_=hѢM~8EPEf͕Yex֭sҴiS2eի:WnT j͚5?$& 8Pm?`3+n>Cr~O[ FHHH <019K.~WE+(K>iƷ -0BэhTĘOLiܸ87nQq⮍O UFPf͚%-[T1a<{I$@$@$[ P@6jHui6iDD4,usҥ*TvŘQM{1h҂ǏMnB(3Vӧ\z}$@1#~8EkZ~7& >^D#tre7Q.'lh^l1@_Ow 6y… Ku8 A'f( Z\HWb>Z7 P0?tk Z4Qat_Ȑ!CԬwC_˜O/l` t8_ y + P/Rik6Bu}ƒ P`u}yijS3ԖY@;w;vNl4h*px IMpʕYTq,7ᏉF3fP/^,sVѕl2\ڏ_${GΝ+{~Z[)_ՠA2yَԫ0uhN;رc2l0'B$@$@n%)ER[b9rHi׮,YRʕ+''N+ġ#FPIpe-SzG=\7a=&2j*%z;Z@T (eW[@zCK:ZN:%wqF ݜ/+xKAІ>Ț -D [O}<^9 y'alZ# E8F44-<HH#`Dā w|6kL]wʕ j)$V28{8!KNյntvPx P7)! r  b>*Z fG*Z zRH CA D;8> Nz^U &GE*x *DzJ>tH Impq @h tĤ 7øjժ \,9Պ:KB#UV)o (ܽ{wA7k19uFp4͛7+&eĦh /m e8neB$@$@(\.ӆ˗]eϞ=rwp#Ν;,Y]z=CJ ҐNO;ȣi9x E>A'~Kdh4Wlgzp~\/z,vi9zC~ ٩I8lLvm>]"nA`7̂njhpӷ\ѦqWD^ōj,h 9@>c툾lٲ&"XSWȩt`&{AD m3z/ \YD"'|QH#PfM5nQ|tt'N<HH,lXkN1gmڴe˖_|fk0f;vOO.:t ʤI_pMԯ%Kmݦ^ )$@$@$`[Z@I̴iӤiӦҩS'uAܹsYf2fH[n-Ս}L"5jԐ^zcubУB$=C|($@$@$0] NQ򂱥ٲe})07@w?&@Y P: @ Pk'8y=IL!h5Ns)Ǐt#|,8GfΜ[i&s6DP`!n$x |c"HK":DM p|.1%y; xUxvz} Ok/^UU|A^ 'lh^\abٳ7EWʓ'2Bq B I޼yղZE/0z1_`Qq`y⪫Re "u}_ ^,^Dih P[gGpꫯ~mdΜYM4B(dŒ;wn[̚5K݄ 3+W Ľtܸqr!5]B\'|RŠЊg6lPৰm۶pTD }8IHHH\L ObŔ%8vEa11)$@#0o<Ԙ} R0cыJۦ $#,7iUK"̎$`W^yEFN^ &ȢEtv]"`"a#mbH$@$ q  D`Ν>֓z\ &$X'FEヒY½0Gd{# H 4p x9`B_`}dBafݻc׿U}3R̡aN$@$&iF֭ENzp˕+jٳg]5رcF`~uc큫HH hfw%/geV~`n{YpP{Z]^3Z8qC4!ayqeƬB^YS>,o׭[7x qr3O%02۷o2 YZCs'L߆С//Pz=L%FzFmrrg(7ᔋ邷&}  GYneɂN#O@h"hy$ `BuQؠAk&7ǎ; /h믿5jȩS7`n8'YؼMk}ӦMj[t@(f>I!зo_ٙuc񪕭UVz#h~zG핓,5}tj. Āǀ2/A$]+V3>s@G1K,医\CFB5`&@U-sΕ/DnW)1A f`U7AA_ pzn۶-e0im۶>EIII0,",8xP @l D k֬Qc0_~ntouA.\(mn,Eɫ $"^zIrP͛7W21^9jРAN^ָsOl-YxY2H9q7@1瞓9s1cdҳgOAXqƩ)S9vXy婎  p?Qʔ) !:\nr4 h̙35p_E&?#FSOɋ/Ņ0! Jb{<܆`$@] n{U^qgD2% }(n-?~\V?`ƪUn̙Ux˷! Fpq# wcz#MS`,HJ5ڵk}sQN*߫Pn&=<[f|t|oE8xDhpO PJ pTYVQ ܆ oٲ~Ta|2l}%eCeLj^]' ?bRD>aV\TXQ50/ ](j^ax^kuW ukE;v u&1>L>OBѼ<͓'Tn~*TH0Z\HW֪UKr/*I"c7~Tf^@kt ˂D 8ց/9j9 uk[Ν[mBk5  >K0X PQ)gDASKzD^ZIHK1c ŋUEE?nPeˤrʡN$@$@$7X~}>^[ʗ//[n[zta< =oV{NӫW/5~WQ>Sk6׶"=z_v+ҰaCYtr6mH%&7 @|7ĉ~`0'hIJtI|ݺus=xXk9Pаb=Q:u*h+0 SuXQtb|d< Vv0`#([ԭ.  H!CRqlԨH˗C0LbG;Xøb3\Z+Г(y1 X^HH `￯*`hY>H(2 #sѩ6#v{T;y\!#&Ra,/lPƌ#ժUڵk@nbUժUIppqw iv8 )k?~n&([~ȴeidŊ8oYvȴe^ ]J>lm۶EDQ$@$@$@$@%@4ĸ? @T84Z 7\+|]s5Z @,:K=zT E(hÇ{}{O`Б#GT$h>u^W -0H$@$@$@$<Mٳgeݺu~@`ժU;nBЍK1@0}YFS-eʔ`avf`ٳGj֬h*B3$ݱ?RzuatJY(}~Eͽ۞~id^oӽ*K3epBy7}1"sY7Jò}v L"5jԐ^zu&˗/W0ù2sNucHqY.9x'#G} POCZd4O;v_U^}U˼yC-}nݺU7o.۷(c*̀m۶~{J*uX޸q?I >Qf `? r-{y)A6ӇŘi} E8?<`[bO&c''|ᇲrJh`M!A vbLK9|Gaرc\p'Pܲel޼YΜ9~[n-pBq/ Ѯ\-ڵS ftB,-}~s̑-ZHܹ}s(X?ݯP) O8a۷oÃg|P,Wbcз ҥ-[6f Gk(ƁRM]}| :Tz `7n`^"ݻW*:u=[@4XΛ7,*THa7hѢrrxEL駞zJ{1i֬Q iUb:z/<`'ڵK`Z~u֕Yf1g]lT\9gn!xbywTr0sr]w%yLGwKz`aği h}1STRjO?TF O tCሷv[b|ب.ذaCYtf6mR$ЪU+ xtbfuF&+ozԩ O>/g 1 i5!~vUu? R1 ד =gYI?LZόR<,Ydx ~:M8g-o;VP=zNO+ 3'<`BvF5CL% xǀzF Azb*IHHH3hzF Azb*IHHH3hzF Azb*IHHH3hzF A |f䇩$ x7L2c9s.\X'+ra_"-[TiRT)[oɫ*Kl2{R|ye2O DKc@%IH h 馛o&M/'oذoD)ZA!VR-͚֘5SE$@&jV ɓ'Usȑj^Qxq~ܹsj]hEJ\L$@FjH D!`bQ*U:t~gϞHH4@MH$0֭['Ǐ ._L2„#ƍӧ2x`5^4a0$@!@3dFH@~ /(o4h@e -3f֩SG/_.;wYz! @R6J$npÄ1cǎ}IBlwjfɒEnfJx 7]>$\ 0[@ PH$x:,Y"wqv?{|+gG9&0=HS~ 7~ٳGv*6mRQ]ߩSp ݨH!/tvf p%T E$@$@$@%1-sF$@$@$@$@ԕjaHHHHhzW PW"   ]2g$@$@$@$J4@]&HHHKwu˜ + uZ(   .-sF$@$@$@$@ԕjaHHHHhzW PW"   ݬr5H޼yȑ#o`пYJL… ?3g|ɱcŋ wתru9RԫJĉ?o4ٳg Ju,XPN:%ϟOѐ5W_}\riCR<(O&o<+r)'O ICyә3g IqdΝ[ko5c-_UݧpT)9G$@$@$@$aA$@$@$@$@)9G$@$@$@$aAذqɡC='  0 P?~\F!wJ   0 w#    P{8,$@$@$@$@a&(F$@$@$@$`qD 7nC ?`$D}I8 1UpJ-GՐ뮻N971H3t:cj>,Yʖ Hu|^ e+@`hTg˖MESQ/!GEA Rk֬;ʖ-[Զӧmp~ڡCYpL4Imo- 9r$%%3f >\z)7NEk2eԨQC(cǎ    wpE$/Br-7x6ݻW*U%''hm۶Iƍ}VRE6n(5k6l̟?޼yHHo'CtDh3gΜQG3)Q_@(K%gΜ#G] |邺M;7Ț5q|~E6m4Y/tXHwF槟~Z2ǏÇUGт~J<4qT\*#e j:8`r\\TB+2:c\ Ĵ7Y` &e 1MuZ7`|N^R{dKl(h^j0 Oz] ׊P^6|+j֬ꆈB|9o`ɆխZW&^{\L*0Eyz11/0>Q7Ξ=kb}i 7v -2UpF2n=Ѕ t]n4=O 0ݹsOSO,2ʂzR_7PB7o^oX_H$@$@$@$@.&RJ7|à Ex2F3f̐VZŋ8Q[̚5K^~euN>hZ@ J,Z@Ra& M`=|M8h uHÆ жm۪wmڴ%Jwl9s+1.2`/d<Y/@$@$@ *U+&p\r6a f c?-O 1b[tN_SN &HHpv%MƧu[awӦMI2 DLp)$@$@$%qD% @h4@C    u*OI$@$@$@$ lHHHHFLB#ߘWNDp*voGyoԩIwڿ(brXT|zҺukܹ4mT5jԐ^zvM֬Y3eHH\GɓrGpXs*@IDATri=# #sɡC2rESM  ZiB٤I)]`qtR-kcҦMx8R{JJdFs߾}m6*Ą76l2o<_ iRR^m/BRHn k̙Ix؂˦.fj*p*xW(>}CI@ dԩiVDC3Fl1@x VlٲE&MVDw|0%]h{<c*j@ c pgV\v+X&_oL؂ '`.Pt]^D:v2>{-Kv'IHHHKtŊRbE믕1y ƶ|iʕ+n h} hD3fm/ܹsOݺue֬Yjiŏ7H S:vf?^u͙3Gͺ+Q2LZl)#FP*a\b&_z%7KCViNcmr1NՀ;+3L1nڵk'(? ^~qzZBn  `l1@x 2yc9o&yGtH ꫯg(Z줛G3rr͂ZjUh9u~ `SdJ7K$@$@$`\~zF:c{2e?^HHHHe"6@r toڴIzGޖ/_={8"wA!   p5 &8pF:j(LPxPz    w8p<*Wo3Kfok=_|i\udN_PtJ+t2xxVS:@15H7l*G\.iM5ULw :YP9 & l ⒱R(Q;CF9&OB%D29Y ^L.Sz[LУ^8YrJt]yNTy'}6l(ԋhBqFl"r1CsgMZ9 >E'ȋy/B?hM1]ɺ@ 19h0=5lA}-]Q#6@_{52dHX84,L܉HHH@h1!PM4Q ,w}WB$@$@$@$@@hrrywEһwo}^VZRzuyUMF. $,+ף@瓒YB$@$@$@$@ `ڨQ#=zlܸQQŘϵkJϞ=U|6 (w[uU֭['*TPua)_|]L$@$@$@$l1@px Yfc=&kזˈ#d*AIƍі:t (Rre?8 hx8a(&J*7q:Ԗ|t d8N_JǶMEӱM.Sbڛ,0xu2qu۩&*xGwT1cL4IDΝ;bS ox[cb=XYf" P;dܜ7^Py-ʔ Z'uٳ&&ߗfpc"Sh)6 :6l&B ɺO'Nٳgoዮ'OPǍX7PB7o^ )RD/ }W_}j>КFh,^Xrέ>u֕YfiZl˝B$@$@$@$~qC?ңGׯL>]K&HÆ eҥҶm[M6RD }8IHHH\L Ob.0S0W\:YO!   0b5 5\&   D"1y% `ԩSeΝim$@$`<#Z@ @۴kO \-矗VZIjF\b9fdɒ+J2 Fm(y" PVX!>l\@!MN:*\s{q+  uV&IfPmx< @ń%t A 8M9~MLCq겥2eؗw He ĵx 2! N?P7ũHKo~:˭[ ƒ;Y/P cb\ 6TxtD|JS19nïcP QLx)CnʔSIaE\Kq'5t?2f#P@,huPP/n"Ly19t]Mu[wԅ=?@KuzG@hN ӣF´V ĊnZ4FcEׁATEz%;G ̛7O8i$@Q_~g$p@51x{ի&-߯›%=iӢm$@$@$@$@` HyB P+&@!h m>y< x Pj"8q"0P/&&K.ym5ÇK9b}Y^σvڥ"™5&hɃi,^lڴI?x0 I`ҤIG] p]ߥ o\|ϟ_J(T4uQ\9q:w\뮻_E ѣzjRlYZZJ#Bd(bˬT3$@$`8߿=' qgs)'O z!;sf$8D*s-'N5Vf'|"CsfرlٲE'ӧOWځS:… eҤIj\r$VdnIHH@[@tРArرTnj#s뭷J֭՛OӦMeʔ)zRtM<_fT     wH0 Z`ݻW*UV%''0m۶IƍRJٸq:l0?o8g]III&.|D yϕ+U4]MDBv@H@ tJPj|8)"hz>y y7ܪ,E7o*͇VN brA%0VRre?8#/m,+X/C:P QLoՅSe q)$`7;ӎmrF>qD0;|w,d͚U`,  eʓ`4Lpa=XYfD%Ν3x &WDѸ?Y^{*W(S hɩeT&Bq?scY &o<+tc q2=x u$$K9SyQ yP}^HHHH\k-f̘-^XuʬY4-[LN!   p?M Q=|M ҥKm۶j]6mwNn# Ҿ}{??LHXb+ DEU%K2ph,w?O @wt5^R1 #d1sLzH"Uh:).p_vrq餄IJj|ZAz 5?\&3ש<g:u ϋ0Dx3U"mO65 L7 0@fӓ +p"l<HHHH R4@#%HHHH""0c@Al٢}A?wqF΀AT8ܹs71RhQɛ7/ię?($7lؠ.\8YMTh2&o$@$@$@$@"g)    )΂nj={(2w-ϓ'gdhطpaխW&%Jy͛7ˮ] v?Նptz  p~za.0k~2֬Y#落mIeRxqd<7]DS/Nq1m6={V)7kɷ~+;wi }E_:qI֬Y=Z>3x[RvE G+-/^5-ʬD..]exF9<3۷֌hqVaԫW/Ug G \]DU/K2#<҂ .=Sօ6m\JiqⲍR^.Ҏ;YWXqGMul.8JV&O|_LWDN \] sȑGԬYK)/eHıN1t._r, ]x~%K0aބlM"<9sFۺukXO~׫z="AbLOZ4³Rg<cD@,UشiSH3culK.o6&%O.X//"7͚5K~4/z&[6 \ cs%hjC]t|Т d$ ] ^`J@8բk~IR}c=&)㫰*W,Xк $.X/W` u6ܹ;#[W؄3g)P2za+' W?FPn-y22%3)宻RuȜ9ԨQCaFqSl G EB;v̢bpj*:t~2o>ᜩUVꫯ3Lt뭷c֋p(ڳOZILpńJL^߿rgϕy#F(` 7W)TTÐ^5 MGѠA# h ЌF;8G14-/9-}"}ڃ"Vûz "3 i a\.9"zsjIHHH`:    ]0%$@$@$@$h&I   pSB$@$@$@ AhB$   ]0%$@$@$@$h&I   pSB$1lpҥ β &H֭y2zhMo#GDӟ$Oa.ZH*T 痷~[ʕ+-[V^<99Y5B$@jN ZJr)uiӦ l!rJYnoٳmՓSڵk_^_x… VfVpH .x$ GV̙ʕ˗'OmYdٳ/_^~giҤy睪>[lj[ȓ'O*' rgt}R@ 0]v Ѥ$ٳg2PT)_S?>@ʔ)#}̟?_o.EQaDUE$@` JcIOc5K,)>9yd5j/wu`LAdÆ Cyɑ#/ СC Ph h=H0)h޼yr 7(7LÆ \RbEɛ7j8qZƌN: u*ck֬qm0 @Aّ Oȑ#~z5>SL%K& &(i9ul<ŋѣRP!;IHx4@W!3@$FEK/޽[u&h5k4 @ >fy! D"?P9φ J%dڴiy%  W }R($@$@ eI    )v7/F$@$@$@$@eHHHH h7/F$@$@$@$@eHHHH h7/F$@$@$@$@eHHHH h7/F$@$@$@$@eHHHH h7/F$@$@$@$@eHHHH h7/F$@$@$@$@eHHHH 2jq؁xuw\:s̒/_>9zHTS;wn9qDS_{'O9|HTSqEYf8x\tʆ^ʕ+i 8l$    H    $    Hs ϥIHH@LBXɮ]$K,?~@dN &\s5nIV\qWK,F\31I ruމ㊞=.sA2 Lbe2e,B}'ob`z9rDͮNNNV3mH'ŒGI!xeܸaBe&,9[|, ,y\exb(GݻUZC*O7`˚$e#((Q8咠 Pz WrU<%C/\ G([o8zԍ Q˗OnےݨQp-1.9Y]&CE˺`R&}O%qׁ 2L2X=N 0`H"'Ѣ رc[7>dzR I'IH ?x`)[g|b}ݺue֬YfgepTrel !>cڙA  P I&Ȉk[@'gԩboJÆ жm &ִiFJ('Q`ヷ 4c~` HHH[(ⰋaHHH JxclcJLfwN.tQ:8c,vVIZv]!; &:eZ=%؎_V =#'tb"uu♇`6 !7sC A`k :O4X @u/Ez=!i2 c6F1i',c=HbIu@~G_p[ 0eZ6_}uXڇ:Zk-ѡ\N:^ȗŋ+5E]ѽ 4J=xf\F Epߞ^L)+O@2%_hŽرCy^Fn`-0TPV:EFoھx؂A Vu(3- FhlDXFi(o돗ǣ-e:PWPc@L<Ȩ$#}{j,$& nX ZrDog 7`U*0HP?T 8[+apÕVLFZL[NMo ^P>ҪfIQ8k]ҽA;A{ZY>.+`L~ݷmF9Vϴ9:YGv>^9#0VC( [0p Ee`2?خabk][ƶ$=#c 0DL}H44b"5~$L Vr,~U,km  ? ⋪[oћ\`Uaټ+9M fٳGw"e4>Q +_G__L+wuoСCe ,-;dW)ZIg)dz9o-2ÃF]GL >99YMzj|ܖLЂMb<.ݎ^,9:jBtCW*TP lDWyf͚cA˗/wR_V,YkdƜ/Jԧ` R0)gIq1e8߮?B8Y"K #\"!I!/x򡕞F cy/M/Mގ|(?N[{)/,"!Z|b-g|4 6@C)I&qFiݺz@T\Y³߬Y3G [J:wZ'{eUq]:HSQ(b,1Qs0Qrl%!X%vDÉ9sr4$AED: Vw?y;o}o}oΙ7so曢4Ik[wkDAzgV%ƷI)QqHN|~v@:`Yߛ/OOxNL?LHDApC<'B?:'yGƏh@A-Bb@{t#> 'T޶W2EtW*SX~isk>VEDe" Hvh<&D%bBIIȆDsu%4 @_s*Wfl _z%mz 7hz~z皶Cq$תvƽѢcXODhΫ~m8qH;Uio폾OG2ՏSWWa?xA"blnn\99 *g [y䦛n:KN9= 6ov- e Pe: *ܬVeB)jZ "k<b zC}mH[ElQ1d$%)etA|^xMް@xozH8NuD0@ќf!֤&6iSEJRWI*3N/TGc" [H08ʿ@k@@es yhmOS1L\6pԖIH$L#?~tIaߔǚF$$kǟ ˈF5^:EFT)ll8&oTvSK4f?N+)do<5lp㕺ZJH;C"|״gsܜLeV?'^I}jU7߮$ *U2F"]ć Z*4j\o>gT1}|Utx0!+ɳDN ϯ[%/\ NvyNBފԉ &u$x/Ro:ks '[H||zY̑#GzU?#ц@2=UʎU4ȉ!.-}=uPH`a| ? <XDĠ'?0ΘXcC%̓UNva52"e+Zxqh931qg@g 5n IC:GM01H?YDyaYr֩]}cNJm 7L~&~o&</ꯜ뮻N [oU|M.P pU"@D\ygm^HAN=DNYV -,&+A*g's.tBi')lڞ&_ݔv`ŕrƜ<lLm%*/L{H@/^=]s52go 55+`g(#/1oœVPp93U`+)@og 5#L͞fsd9c2Qg!ƦX']=)D#30b`BCt'>`bG9{>X7\{MP!;H{P;찐}:Z~mQ㉐0qYO?^ ;ľ5jcz˚5kP|#ʕp aQ6'ϴUSbA~agp1Md#[忟2jhGɔqrQ \-F0Ч?L \ }B>c` 1 ;@:M4\jcJ>\I;z'9$'EX=RI;< P wynذA0_x.'x , D #Juܼ+[M;`UZhVz5=0R|=dggInG&Apa'Rn|o6X %W!ÒsIlEzjk;vll@h|G$VIDAT ѣ>г!|uyȑ#B>;0Xס`#h餁^-P)5y :H~@q4!.X\z-zCcs3 ct$[-/*bee."o3!uTV.hw _X LvH;R+E"2"]n̝;WlB_utPJ@1 ?+  48PQ+)a5_xSZ2랔vG)@EZ3G6([ovg{w-qLY%i.;8X hײ3Bj"{)Hwڥ=J@Aaj&!FդsTe7i==%P[(* ttk5|"L4I %MAj(NpYL@{;1CH )5 U;`VP'펲GKk@=նVZ p˂5g+ ֤OPPzmbjPL@!4MfBT^hXw^`ME R[d%2[M6]`"p)$zˠӗ>}93ė!B@?/H*E}0RjG /-w~$C 1xpz˕o+U^rӒ#k¤*II3e]8pN(!HՐT5IF k:C3(hE%\u@}@<\6| Z1}3f W_- [̌ G02Y3c{)2 &pmKMCH)>E=*^ֈ慁/nL4 s.!m;2LOD D h vo|ܷhM}i1-MnqHJMޤow \{v (quGAx3GOE1|9_ʾ4U?JNz@Qnb{sNx P ui&?3^g3fxm@:ueC]$o,ygc3)”ΐ&)c+¶9J̾}MG$ XpӅD%`gEgy Bʂ} n"VڔWrd䐨⃄—¾0~ f|N Df)s8H@c#̤} &tOIS^+ؚ'E~_f˶gU$M6^{b#kM(|t/pP&Юz@$7D z5P+!5'Pqy|ojx@W{۽ `  ~2|-3Z}~MMMbr 0 э -JL4D)$Hå w ehh("Al*Z~gM2GMZB/pcXȖM.m1x|Ts2T`3 {Nnϵ}ɂ%:2Lbɒ%ڮP{nm+m3"@|*WZ iJJcߜ>BDz$Gg=Z1rr9ă2*Jpp+0s ]A:="~:2ʠ^w+--<O;gßŋk17Yٸq}rWz1C Rh!`$EDE4/I~x9z=zHEݛ9Ft)'uOT07 ,U(u:" =P͠؉"*EPSZ-*dzgۣ Vx_!РL?vg('|fHUmݶ+ 8J&:(FVIRbp rp_n޼Y?pZUQ"@@0!U4D!#!)$u z9B8߼obCSZPGԹP9<#!;("`MP3dwI᧶g4%u:GVk Ӫ^yLËk Ν;ᅏO'DHl#"T 2)MM=XǺxY5WZAަXWD { ˭u:9-T9 AWb<#4>5+}_Y+M"U3Pcqkf>il6vT6׏cHGɒ XX)cl@m}c|k7J2 {h\@%RO>ض{ ڀvb#ScwQ*Ep)gуbY DsDCnn_vZ hjp">0I!??_GLf%7Ѿ"&^#>?ƒJ4F/j}VfZ&y zio#`TfHeM).Tht2Qd ґV#d5p7!2 BI@R#Z XIŌtl?*ИIM 5-ⶢI9mb I>Hi^VZFդ6s*>"P[/5RQ=y31?RMp3ebA4zښ5%D%XɨY.)+3ABz؈Mɍ!9 ;RZշ-N=W7ڮP ٨Lf%Amrz_qQ2Aj;'m, L10Ta r BlIfǬ4tӉWBv' M ?`n,>X %IRR"RENMo:[6pN3Z$[Ik3u>3UUHrc >{L̄5=("$ p8><[A1V*{IZ tB4Xq}MjT%LWW3RZ`~`SMf&*DШlvVHF(DROHa0 h X 1PEF *"תDՠw0!EMU-!i$&}mzT0!LH G ipTxډ&EpPIM(󐊚MѾ6MZ{ &h{L&WRQ^7*v;Tc>NE FjvaHA>- "'NL??HEO;46h蘙TY:$iʔ):O4I6mԅy䑂hWB 3_/XSQ J28%/iP,zTbL4RQD,S;D N򴧑xU iH{3YKO$&WSN9EV\)>H,Xv`ى F/Lh0xnVJ Gs9Zyki ZʽD"  AztN=RC|F_0Ѥ%!2؋+ܹs=Nmk  Dym|t VE:w^DVBMf^vW@ "@܃qdJ R "tk؛sF' VJ+D޺MR>jYJ"@ cC{& vVJ#4D7T! dm z3tJNԤڮ`%Ȣ!)!$m=-j(+` -聐}@$6yLd`a 8iSl.}AD4њ/`Z WLS9~ QC@1.@.(``aÃ@/`H[C @ćw!&>k 4FW 4DҤhOy`e#kCaDy[3j(=``A0h)xz!|x0a_+GݝY0 /ì"sMˊ~Isqq}CxA m7js D3TX*Uֺ2OFu"@ DD%$Q4 D"@‡ h瓉 D"(hyEEE4T:b黍7G(9-NP4vuulٲEOm;?G@PYY)~}H?:{n9:wFyY!CNN΀5Ҁu؅%%%rM7ɋ/(GvXXp#yf?VX!Çwq|!OnVYz 2acqo) wY|w @;ډ$D"@@ @1MɊ"@ D-QEe)&M$GydUA ^^D+a@`iӦɔ)Ss1@ffuQ2ydA@LB<"@ D Pt"@ D+$V4"(oKkkk[o%eee]cڏ?XVZ.#T< 7JgʕngI퀧?cǎnu?0nE{OjjjT Hn;W^~X.'xBi˖-ٳgKVV444_.uuub`93k3D<_z%NЕdHmx y'?,lu7,Xg!r宻3F]1%h֦ht~jk?63۷oRguVZ#2x08tP7ިf͚voSKۿ }^qqqgݮ4*z?@iii… u;ܹSW#9T5 >>7WS т3fHlgΜ)6mҧ`el`=f1u?qqqEƍ+>NVg?߾4K.cj3 g޽zly*EEEd0)zHn.+DXC:$!;؏JJJs=׫v7σ&]FyyTR cf@ntKz)?i{Ph˱G?ah(\y/,Fc=K?~ @z*_tEJJ9i gXV>ӱA51^}k6~c 2DJ.kV1~`/q!G7z h4~~~$Æ 5*@Gfo]222:gOSO=UO0ٸqz">jLawޑ]v9#h~fimH@C wxvqɆ dϞ= _Yf̙3G&T裏OAԠ"FRhѢ.+ٰvW&T|ע<Ym~i=#T-욄bLqE @*_R`rέ%KfxG8]a97ƾ'ND#@6b  ̒%KпbŊ!B:}#A?voޘ"TH@2, Y(o >\>.Zldee_,p裏ڵk~\yz}իW{̞=[/11Q?|~~ DJ,# E,}{I' O.u}{O~/~ y衇[/R7y/Rq"(uC+D/RyٰaL2EaԩrmϪU.L?å{nuu&8馛ޓ!DJ@]H," D//D-ϟ2 .뮻NN>dydܸq]TIII2w\͓2ٳgw3D7 @Vbp%=  D-(ۤN$$D H3322H3U6ӄr-IGRS"@l ڰD"`%1==]@" wE3DD;PF;^? F*xgKG DCЈkRV"@ F"@ D  &e D"lH@>, D"@"ЈkRV"@ F"@ D  &e D"lH@>, D"@"ЈkRV"@ F"@ D  &e D"lH@>, D"@"ЈkRV"@ F/SlDSIENDB`patchwork/man/figures/README-unnamed-chunk-10-1.png0000644000176200001440000013344713565477507021304 0ustar liggesusersPNG  IHDRz4iCCPkCGColorSpaceGenericRGB8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|U\ @IDATxE ɒs9E0S@ 9 QQA83 ((F $Gy{g}x6V}fٙ_TWWWDIPE@PE@H%FPE@PE@0"("(@RP4pke"("(*3("("TTM*Z"("( ("("$@ V("(">"("(IE@Ф­)"("π"("(@RP4pke"("(*3("("TTM*Z"("(@L`i?8'Oo믿-ϔ ,0k& ㏎)"wB?nݺUʕ+{>._L&'lҥ>>&Lʖ-W9^>K(k?۷K |'( ƍ |?c%J"}h 7ڵO>DкΛ7υҵE@PE@P0ozir6YZj{O+"("_|Y6rzڵSz("(@F"he˖J0QF E@PE@P2 @+VV*N<8$))"("' \QP<E@PE@tTMpEIo>9Ӳ?E@PE@D22 q刻N,pzoʕ+MCI߾}Aa>i:?`&viӤI&Ax b3Ar8O93piڟ&pOw;dY8)| xARF v) 9d7nl޼YZnmxKսI@t D9DgϖXyɄ|F|'  Xm D(iK^> f kM6x@eۙʹ˲u\XO/4x`#T"xYxȐ!2l0sk7۟~+/gH?ۗ~ûGgS(ۏzBPE@PE3xV}eAf͚%=zEI>}dر $dժU@P!K>yWJ"(GKh2"$9_Zh!]t^zINdݺuW_ɘ1cLܭQFȑ#M!z(DM6Bck_jE@P\AsƍwY:0I5kH8gڵ|rs}%ĉJʞuV9֟,V~fyM4*gMU;[~W!^Ҷm[iܸ=K|@.72_)}g>-o~n-__!LśP'|RN)X`e)Vql[ngIF-[ޓ~8xۆ sV9!fJvl3v6?,' +P|Rtۉ& } |>Icwڻwo,Z~=%ҰaCiٲ,X K޼yeA+J8N~CC!ahѢ{ɀ0{14gIϓ_ >yfTjN"0b}GK|:sg ?PW_}u}%>cf7\&d}l''^ix*Oy$!CHZ?lƏo>}*Ul80̛7OV^-K&LN:),zRPN8׫WOn喌XnV/hkE@H>iֺ曃ᗘ%>#-pd+5jHnݒ֨(1!PZ5bWoRE@HO<+6j(h,G-۷o%KfAsҡCDw,"("!@s2Ta("("mTWJx>(E !-'6$^$X)*˕+gҫ:ۊJ*`G1cƘ',M6uV1/"S,|6l0l>\^R/=d"i phڴi&W\!y捨/ܸh߾}RPF[)KW/r߿y+RfΜ)ѾUz4+˦ )j3ͯLV:huE}[=thpa`%]w%eʔ={A~T~V\h̙*U A:ufOw@cΒm6yuozFhű77C#?nݻy;6ߟYPI\&cM0ބɖ |"_ 9E»+^H+V0h%[꫍w1جSØbmN*u5B۶mMo>}*UlmڴRW^mEN:餜@[&6CDNP4С{u_o%i"C|2lذxE@PpE?[Mv9QFF0yc̘15'$lFXZoԆ_bHt+t>O5N/%hoVcO^e>C袋?aFaC b% 95P&t+ 0ar^+"(FW^11Ny7R9AY CD4kLPq=zY'77*n zMlGJğe"tv &oEeS3mh.R^z%eDPE@H8,q&V"ڤ?ew:!6NyoiC{§EC |(HBhqVjb%Sm" LbEG k`iԯ8>Qfb51OqfZx4mTnHobD+!ql $EJ"(GY%o;o&ńVIH)a櫮J"ϭⴜرcwg I֭3c J"(GY}뭷L"sĸiʳ,}nv]/|B~6dgƌF=YJƖݻwGTgŊ#.Y!dF$Xdcmo,"*L~ɢڸ'4BLJx$H~&' L3Oh$RQ.$ EӞ{N}шQQٱ\+-''8YudՙzR]w%lɠT l?ۗ~ûސỵ3[sc@o&r֬YޱcGE"W.hڣ* '|b/׳zMQE,VPAؠ&wK9$?q*`z()EL-Z0Kg$LjR V("Gmt5.'q]vPW@{&MCB a RE]%eZ0TE@w`xosX-_Ll4(VRA`ҥRd, 潞3gq("D@Kzz-g6YWXChP>#z(i'QB GQ%E@PE \рO zЧ~ڤꫯd̙R3 K,S ˀN!bɲpBis̹O?TFIPCjժ3Aw+"pEjl֬C82CN:ƹ{1Lf͒GyDڷo/Æ ݻ˥^jb3A*իWz"<=cQc("ċh7o n:bST dԨQF%HW.Q{%:uж3#GJ߾}mޯd<hAٔE@P7ڸqcy嗃}KVky7LɯvZY|9onZ&N,`j 6*Ƕk{Y^ngu\w>mz7ە)}g>-o~n-_7o@"m*Є_2MsF'5֭[M\Bg6|mٲ%K?{&=ag\{ʉ 97եL4n:… 2aq>ee ;ݻ7\-@mjw}ңGi׮lܸQ>l6{ 28oX{ '  )jEe;<~P`L2O&~#|eh~"XiGٕ0LV,h+ɵm۶Ǜ[O.J2[6mիW[ &"("(ESj-l5o.wqGy7Nnf#; N |⹶Fҭ[z("("-<%"d#ѣG54E`ΝCf6s@<6W_5vrगLi74^{m2׺E@PRH>=ò))@=-3d${?VAF<_%E@P")P¬)COu]g߉_qFt束4i|嗉61?ss~ae "(GP(zd 0m۶`aC+#XSNJK.zE@P @Ӫ{/\OL$5kf\8"GzRzLvpxK+WE P4{Oۮāp새?hc'7`GU9/O;ݻ˩=Ŀ5k,Z(kaݺuagc;d1" +)"i焤ݦ(!piɲeW^1ިQ#*ȥ$B۷O/6m26^ziw]VN?tٱcI{'w} Vة>c+W44hdU &[o% g6"<{f(s|珞)"$=ՎEl$V-uOlOd?s0`@4|6,Ybse5ǶzHn%L)M&͛7?'}O*ŋgqrcҰa\<~gSqq;<~N;JԌ3ԥK\pd!xt Oq/|<펦^$ a;,{Us[}e79P 47x2S|0>l%.4=qhYYIZdsfɵ>I 0%LpF^IV2Rengpk%>7dV]JDyYg W(Ǘ^zYm_g|ZtoḶ־\4{uB-VPR',kΒp-p4@l>$!|ᄂgJ&Z"D@Fj@#FR/!_Mxޯ_?av?~q,@k]t1 b 'TYp{GZ]vjN^b0j۶1"TM Z" Vr(EFgݰ]D>}!uRGd1b7ZVZɸqR.\aӧ͸YÔ0^Ғjժq(@9Vz"(af͚~Cay/`E ~3KGN;~'iI^Ykݺ-[+"P4,/Bꫯ.K PP}رc 4Hhӳ6b" g}6u3A?scs@O x5 %0 `n+?PllvmB_x0X9Gx]ȑ#3OwE@H7t|gr9뮻|˷l"d{'B/ߖ?˯CshpX&w3:moB=l8ӴI4# '`V{ѐ"C 촩hѢ{eDa|ch /"'|&&2ãu:Μq&P?&Ӌ/c<3'߭x>^LJg aCt%[?cƌ1qmΛ}3 d$,T6@˔)#{1IGgʕ~Μ9A9_Rw_|ǜe}Vϗ/-Q Lm?~,( ]vB(g|_ qU' ?O> V7ӡΜ9SU0 D@sNyͩ>Vu7t}N=K#DVڴicⷑai„ rI'+F)"()AQÆ 믗޽{1Pp+^n?`U4w^{09 g5!8ʉnC姝-z"("jghm[.rjjժes6&ey/Go`WI۳oO[)OU\hE@P7hի'l8fHIc f68?Ӟs޼yMv͚5lM4Iz d٫YPRE@PbA/6,]T $hj׮-=PXw 2!,j0L&ґ㍏~24uT=:"("$+),3hFJZ5F`ƌUVz3f͚ɝw)dWQJoGyfD[o2_mw7N88]r%1^1C7*"("Ă ("("Č.*h?Џ-SDX)شiq=ozP'!s8(7I߱cvSMYqT4w E@PE@P%xԢE@PE@PrG #0K+Xv={zY. $ʕ+u֞N{|grgmпUsRvXd^Z+bZbɏ %,i&Kf{'ʰRJƭZJ֭[sY*y}F7%T3͛M?=JG_ 6wBk c7~L2Eڷoo@5k K/Fe6`{5aÄT hl2Ҋ)\2~W2fzԨQ2rHqf"x$b"AP"ysIe}V1bi,N:IF-m۶5:~6 4.Z8p@ꫯ.]w$ͧ~:+hj/nݺ'2UV 2Q߿hq^SN&wyj[C`&>k~޻wPtݼ|34!]fYF<:աGhѢ&55GC(B,/rQxزR=}E›{OD#{Weo˚5kɄ*UW]eON~G@Yu Lko!@r^x4h1!,s~3U6mj^Jj1Ft8Z}w ?/36=m /s歷v(y&~l9hcwѶ [A|:vhl.]jq2)D!;ĉm0˼E= y7 OV 7Ssf =A_l.BljժD%|%v}7Aq4Ǭ>a8v`,кu *˶JF޽{=#8jfzĒ6i6v 2ĘPT hK ΙN8[Q Ф)y  -";w6lٲʕ+!R;Ŋ'x"hȲW.7n4R{NBiSYge"R@&niޞwH?ZK/L@oBAfq&L0q?oi (C\#,yYyllBoVZeF#dd.я>,z m `.ꫯ05O8?6}tLWOĐwQt㛩iӦɤIg `8tP\o Bxl>!rAKgm])hfB_#R#ƅC\e&v2v:)L9 \\gwVcZapePh("("(@BPЄ«+"(""h(""("(@BP4jኀ"("(("("PTM(Z"("(@(*"+"("$@ ("(" ߊ"*nYxsid8qtE3g^?w\[ / fr`Cuz(@^m".\ؤn2LHGl2m+T :uvڙ-Z1cƘ ]ˤk׮ҤI2dA vʈ"|eM9SE; |04h…&իjժFXWcǎkN8AؾK9묳o={ʋ/h~G (@ KSNE@HkN<`ԩ#M65''˖-k~۰aC??xܪU+)Wϲm6Yt tZjܸԬY{E@P< "m"ҥKgaXb<5j԰fٽdɒe{Zj9(UTE@P ^m"d,_|EUV'֭[ i"E6^qF_쟺WE H([o%{8~a[q/_>l͚5'|RLIyV4E@48m"6m?؋xi<8ow.+V0FES aғʇ"%SO=ՄWISLʔ)cN#b`w"(^G@5^!m"d, 0<rǛ0L ${ۇ^+"I ɓݢRLEx49/l۶mkϘ1C&O3>"(F@SZ"(1";)=c z"(A@வ*"("|v2("(@jP45k"("d,*fl+㊀"("@S֪("(@"hv2("(@jP45k"("d,*fl+㊀"("@S֪("(@"hv2("(@jP45k"("d,*fl+㊀"("@S֪("(@"/9߱c(QB6n()RD<(p܂ JҥӲͿ>|Ub ^~}R륲|I…e׮]Idɒrq֭[^wH)_ݻWv^ST)ٶmeFRYrd˖-"?Y|WT)愽F5aaѓ"("(B@D!*"("E@аIE@PE@PD!hu5k믿nh\.ZSE bܶ玸bPP|@F:!c.[L~iiӦ*T(Y6+qǘH Mp䉕pЀRyMINsF?C8TVXo"}E73j֬@@gϞˇ9Uu#"o0G{vH: TK_#|~{)Y|3T9OP PM&BJlڵRrRf ~SQ7n0Tm遉Tm5w4]K4굊"(D:DL۷GeJP@Fj@QMCEjIw`cx">k6.VXEtmfcYMb Ve:[X$ge.Qmfg#QmkvV[9VCY٠E@@1nzܶL?&l4n?s"ی 88lgۭym4A+c[r֭['իWw} ^NE@H)Z BC[]iI(;m9v[0eE"ۜgjmfv&nCz~I4i"txLDfΜiHoABlE@j~T.E o˗c=&6ܳ:ҽ{w:uҧOM 7'uGURE T%FP xĈ 7 ?L2EЈ=Zڶm+= 6$]mY0B XP@Ue7^[(@o>t%KH탅nZϟ/ڵ C{JвRg8Bk.VZ#h%uMt%YRԟ ^<ؓDSᄛ ̣囉#I&b 3h,="^;JٲeeÆ Y4NRK؉"DK@CVjU[E7[!q8rk*nTiSy3:A0G7,dbhAPE =وex>n>i4!K8xj_nFa@yfg;v.D$bŊFz-JESoh@&hjM%K4B֭[]r<#Fʗ/oAx.MJ2b9+WhƆ{Ŋf,t:@FڀF^(@{51x`$Nd.9aA#DS*?v"M6=''O, .t6ǜOS2=(@ׯ4h@,᧟~|8 @IDATFoVZڒhJV^E+jc0E@ ThigP<;v֬YңGYh -2vo  SVZME@ ,xqb9sȹkvjٯ U[H a19'ǥHE]!'Yȓ6h2W\_Zh!]t^zINW_}%cƌ15F#GJ߾}ܯ("5j$y9K a34# h!e׳6Fã7F'Gzw[oC_0Ɠy *jox|A8q97RK O>xsnDDi6rҥ }\6ۺ˔)c]kC8wjԨW2f4U|g38L fdo.ĸ}\JϞ@yɞ|I;0 ;‡h |QvIĤ DX/m8xgv\j3 ZtYll0\X7[ti>n7؍oB͜ʈ<+hѢa*l"W4R=^"@ c!(3pv!j3n6;(Fh܆ @_[\n380p (PfG7g#QmVԝbeU){#/dQl紗4UX9oϱ~1JV*eHs; @'M$7nyI/>1mlxx-q>T+" jF 1މe@$-Q#R/KLXUb>T)lA(OMJl|KYY& &Fv hIhMSaBd%'yؘLdb)!Kh@z)rs7?~\y2}t@T6mL& <'L 't-ƕ=RfˉЀ28B;wtݱ 6uSRG1$Rzxjm9QfE6ޮ } |v9[)4|)TPm(.Q&4~&]уqXod%М(ZQyJ |K̦ys9޽{x0n֭۱7K/Uq^|YB^ -AP| RGm!!:Th29B%:TĽlF!z m 屄dYP#ofѣGDdܹth)ݶ%Bîao~hbf*ʷ"$D+&̫IP9Lv0§Ύnq"hܹsU@W!JԪU&&wy!V g3!6TVE@Ȋ3fd93)8͛\R`#O#cI&iM&8Z"(^Eգ>j!O=TLBs=& FleڋkY8,k̩8ST2z^P"l2޽{y&ӦM(,"@&J6,{TjhE@<ҵk,Wٙt~ٲ9cߴ-|}UٹǝY?<|Og-K6BCxLHrM"_n8GNgML9]6C5m]n͛O?>;g) w>Qm>\:״iSSUv)SHvLlA4iY?uw}UqkK;[U]Km}ν3|2S Jm"cc\^=W|7"iW2ںB'*4|'}֒UF vF Un&(eE$/Gs" ܤDx*0Ȁ3Fv >҉hŋ"1eUVsM9j38{=gǎeҥKiժ:&l[='}u$?ȏKBF[mҰ΀]jN%9Ϥw-q%E+hE}mY9ǀ yQ?D>Yf\I<90Dѳԉ3,ұkc}r@S1H9;ȫǑb5s|nH l3vV#Gn㜨6v&DkqyGFI'xYCήoO}d f+ZYZ5$ oa4l?qźg|ANE`f߽Hy-ʕ+Ǭ YDYsirUTJ (Bw2W\i8RoX+"N[oh5I[ޱpDԫ?m dwÖBA,][LV/*7/{Ö"fsw#1!)PQEp+0 ,T|y0F<"8="(kBAbBh\;=bqǙ2lg:Uze [) ר[jW-jeҴ!V2ڶm1xxf03I6oWMYE!eMZ6|&+W?\>ATzuyg[&@ Eg {&~^~eyjժ2k,yG}2l0c饗Z/СCݤ˅^fiYSO=%|IZ]x O*L`~w'u:õ\784yl4\z(\"a oZX*pZ&#[l~ʹl48dပ7 "Btђ5Wm_km>l=D@#ܸv9@A]8&!TX1|nr$sUO:7B+r)mlTAa/qEE$?D0TJ#˗eg}\zrxbآE W^ҩS'~ꫯd̘1QFȑ#ԫ(6[aW#I`UXfjKmƤ$Gj˱~+]0vz/YfҸqcojDx)]")JΑQl²ugAض.(;v{ˮx6P~! ""Y\^ŀTw|G <, d*\P`кIZrwQ-`i o+΋fq0FZ5&X/ulGD&PbE_" A*굚IN7O5kY)gE$+7(wI_|!o\~2c #UժU˄wfT,#"7o܊vSZXN` O>9zY^umJD.\thFg~m3\-n^wF{ףFo?,n4aqԤLmi;QeD\vݶ<c6{.JQ6Rl1I6|CFDľFh h$D yDr.cCwodEMdOx[, a]ao"z ܹA ,?ػS&͓c-gQe.ڎHCSR4%#Z{v{ޣimTs9KʙLUؒB6w?'!ڮ2ht8U6MxWP. kG:c]ifd[n&h1)pIhH }L@?>@,F_pQnE;}&/7`+ uU- 6ZUaQ8xAQk6 |n+wq-+"=z x Ď81P͍޽{uF nfӧ; ΄dz #6YQNN-tc+"r>F,Bx$ทS˖-3);w/z܅0ʪR r**2OP#V`iEw cm[i5:r?ʼPD9|bCS8%"22CXvGpԠk1$BӈrѦ,DdYܹtn@9MIL\VAPC8ǘbyg*W]u~,a4(r=Gxc΄"'㏂s%h}0Gsǹj8ˌ?uo궼;~m ~y:&[=W0&Mw!z*K43v9H'՗Y r}`ٮ1! s$|§m P&hFDӋ K.5 ,"63()@|`NdbocѲeKaˍ6mj.6mZK''VBOBZT{>=fD~PQo>N"6pm[@H Ke&=(^DX!B ;FsG#kk,yc)XD"~:Hne?G[+-aZm Œk"2[?묳u oʻt'F\++|4vD9bBE @ga~zLb^{hND:ΐ[؍R%Ήh#DzOuhf8[Nh3D v ̱)"IR;+Ȑ W֐[.Bc2VHlBIeHٴiS!#%ޱi&>79ixi-ӷ++aI'$Y~9cDG^(7` !?l?;z̍b~h|Tb% ꄔB{]W5ٝbɚV&\Aݍ6 ,is"pƆ.l2g RV"yWg-%%xl:vh/񈏄`,wCv'{*07xfPcT)T+Gv ylhՑ~ tX$ /VbLBwNFr/]ņɦ)?V1_ԑ F2{.stnJP>z×A.MϼDx!sCo]D̚fhN8'|Ly"1HQ61yg>9o~K$8#81fqwmh!$ x({>^ax'(AhnDZʔ/}B軟֓7PTv:uEPQn!I7"gqxt[k݁0KsflTsx as.˭~Ye E)2><n^gic轶m!"QmM0 7mnc6' gpv)]~[ر+*`/κr;4E>b޳j`Bvbۺ,F=hYeaw}w)bHaI'()"AQFb[3$Ʃ(R3>NH c5h,~%JCH(d#D hf:l Aߍ6R/QV{[c M aԑJ]h(!0CVȣ cg*kA9n윎w'H~]~$&U(\)ZH+,:+\n68eyjE@0 8d?||'O, !CMvxGHWBHAsfm A4tB C 'N!! ܃*I4?v")7BPf-*guMٲ\qaxJ^a7+;eCOD.+%oNj`fvj]`}Pz\@;<t!fϞ-=`lYIPE3 BN>lĬI) ,DSEdcIMhQչܛ6+@?7%~_\܊&'HHYЀ"4!f'- my^8x\ UN4UmIDK7?n 6uԪD&Q师ѮHtEeH&$rϚ5nZN<Ęޗ,YbRuBKg q͚5A/\PV\)%, ?E f1-[4ˉSNgyFǤDH6VBF%l^pvymB#ctm 8ɴVɆ18D#@i~)جRFU\@m5k&lL,k{82!ew.^z _Uիg :TW?O[^E@P;wl&,bφ?{#eX̝͛7!Λ36*hL3Lj`),c+;,Phxjm3.=^ۜHp惤h)"lN;4ESeLw:cBӞ}!*6c(xAO>"/L~v#qbB84e%0Ajlْ5ժU% ma',_rAs7)QmfIL'f@ÿ9SOLySM,KnҤIٚ8&R^E@~M6l7^/L |SV229FAzu|#YWhFsEҶI M ЎJ7n-l9UNZn\x iY/??g:!d#ѣG:눥סCNmE@H+Vڵkz7o-ν \vuYG FۻmҦ&)[r_#hzg-*+&6'V*;cUҬ֌=%ﲬgCO+rt(@ 2;XRRbE*UO۷Z1#feKseٺ[ȸV3Ry-f#SNE V O ]8YmFVM=0̊ZQ {:% Z"()EO}!mb,s8 w/o-( jIbVAR CvۣmeiYk d/v9z9:)U<3Djݧ Fpg۶JK,1k6G ,))" @k֬i$jINhl7BT,OpbB&Mjo ݍ h9Wm,* WVEUyҧ4 Ml/Gд:5P7tSTٲRM{wS MB7duKEԛ74W++ZZD,--sW/&{ɃʯʘM>mPc4 umGMڲXW<`>P̴/ԑ{Āݪf)Z6Xp "'{1e $ }׌)@5Yxˇ*v~<1cA~z:u9,mh3*EgbFJu:6ʥgm{ť[IDqc`.R8p_Av\]6 `@EC4 QFلh@%| Y\PQDY.E;=۝3SS>]uNzsR,(IϞ#GO#].q/`z` r:-#^rxޤb2xUwo:'Ne ?Vú@ R>ES\ y_⛋4 :}%K(XԬ|\٧o.>OuCph޼yA@h9%gˁF X9Ndrz8?M֭zL-w7<ܲ;RHC)P0kUʟRK 'OZJe׉@Z*k/c_&^"h9!V"*(%Jf29=S6> i4\tҒs| HJ,&Gk(';.xAM؎-{=?]\-O,/`ْh!-Z蜔,vbg5'iҙriL)U\wb! h,6 ke;w6n#)QRqu]˻溟|lذ5RP0*V<۷/D-U+R ^ m?ZB1B|sKgJOT.pdO<`ah(͚5;QwuaqF((_^P:cDA_)54<Œ-vҜx\Ox   ͖-==eO?nݺ59)yt# V\9)ҍU-^ ?FWF3"0Î_m۶`^z2tP5uT $\@R`t4'%E h(*KAIǎSvSn/ٳ&]`A® ޽-DK'LU01{g[jy睲rJ5 {AFeddIhӠDThKŽqT[3O}5jYaP iuSqo4{9P]R7o.}  `MFLEa4IR(/X#B`*-DJYU@l:`1L8t3t3r7lP_T6 JG<0S<G Oe])i%ŝj$ ~ٲeҦMK|ˀlMf]ɾ/LGF'30/‹sg&;9f1e+SwٲeU<%+~~E#;P0pNEsX(Ř[XNF2R.맔M_v >\Zj%'O=z]wݥdر&xĉRZXˋIH*~V֭+~MR`88C_;Z$-*{RqoP* 70wOFH ;rYT)UZʦ杊}o6NwCqѣk.]H^]vgYb̚5K}a͜9SO.Æ yH҂Lu>C Fs=iwf=~GO>~B果%_R|XS+F+?j9|bq (a4ayR0둜*TPZx.E`^ƌ#7xcBȯ4w[6-3]r ITGFV!^KKT"%ZHDɬ;Ѭov⩧_-[T!TjUqbe6vfP,׈sk0NEZCS=l)b/.LU)[Ka茑m۶V0u0S&wT2(^b&MmV4y &>&QA|Fw yGnfO*Fȋ Lv E<'&!V}ioJÒC`EdM|Lz=BE"^($~lH}9#RJ^/7\OGaH!w<Ѡ,(X;`1^DL|Bm:W(hvnҤGΝeF7ˮ]ɵ1  { :,0l E>pBLhk+PdO>2d;wp)P1{FcիK׮]1f;2ewXbtMüM/H$3h[6<WRqo(hOŽJdŜz?PF:u873yF}o6̢P0/KE˭Vޓ]ֱXtȑ|@|Do^ZnZ}kwPH9ٖFs-4P[o %Ov,2BZ !$b`cN4dSuo(*PRo02r16|,(e 4L(;|@/G>A,z;0M"!ӼCɋxC0xO}[])>#?!j1_N?Ll٢ 'N'L1! @B[$Z TMսyNUKhBWAI8x_`P(p w8RU*u hL0"𥍩B=TC$@$XhB=@W͓ xP"@$@$@$@n"@MEYIHHH UȪ[nOpM֗,Yd)u?9##52 %Ν;]#OaV2㏮ad\#OyP2>`]#N6M4UD#dw}991VDg _Q".k ަsHHHH &0O$@$@$@$`#6G ]s5z1ٺu`Jx^pCp̰u'_uUje7 -3lœNTᅲ+q;Dlu<(v풆 *bBɨԩz 6(;J**rҷ~+(ŋ;~}/\0-P/@$@$@$@n%.x&   g_pQ M[P7Y6m$j̔eˆJoFk)SLIL'L0 2D#i ]ުFa9M,pVhӅXipf Wjժr1Aô9ʕ㖝pY0 3xaݰT^7y:.oI=4H)hmܸqRzuRJ_|Q }vN %#bJ('Oo1XK!QI`9Ɍt&qF8G#iu0e0uwg;ĊT[Nݷo_QH:H<}Jpϳ"Lo],Æ ѣp@_+֞" OÇ Fe_R#in`dvZmF-0R$Go',68G+I$m'{זpe}y=O*TPfEwﶝoNwGgv8&3PpHe| tҸqc KiYY…UqƂS&vJ;BТE%3~߫' 9lgd<3-I$bhe6].peg4ڍ*3n 9])~f<T^7ly̙# .F;W_s^񥩕m[$$I}& rWu0,\0s29ZYLѦ W5>\Yƃkn#ֿ`YpJ+m'&xvSClU1R-2dƍʓ`r 7$XЗVf8O>]]̰a7oʠ$Αd1s2GJXʗ/4iDϟ@-_\J-!;禛nSvoկpK!gw@2 Wܒo.]jG:wL")o[wӟ,fWSa2tkaWV-رF%.<9܀"OȂzC!E2"M^\Եkdj+ZMl bT!De6s$Ye6>G+stVp#@ƀ@4$ M!;e˖j% B|3-Xs,uw@2TÔ"-R=0EdAW.wLʓY0b?ϝ;+jB429Zh&qVf8G+I9tі[T0o\^ p|AH<әBw@2BÕIx*^-YHHH %YPCyS,   H{T@Ӿ  $HHHH PM*@$@$@$@$\T@˛w#  c?S*yky獑xPo/sG$@$@a @i(@ @4y  08pp))WgJ/m۶믿.k֬Q.bɒ%?~\u98CnV|S?^V^֫WO}Q)ׯJs)ZX%07HH <ʺu .X 1c7Nŭ]V+޹sԬYS|A/9m޼Y>#+ D- :tH)P8;t ˖-o]|:uJz;PIڵk'ӦMݺuk9sm&o,s} ,)~曥PBJ̓'4kL;>P o\nܸQnٽ{u=n@$lD\MLO>L|媫R#2޽{Uhɒ%ԭ[W{1֭a}饗7_hm۶`f5kQ:=<a&f a hhLC.!sLRD]8GvGg`Hϟ~I*Wx$@$Jx? )\FۧLLɤiɓ3k&x+oT]L'OT]똷Ӊ|R>T>qH̋FD1[Xx.ӗ!o{>s׮]S&OFЭ@$@$?t/^< ̴'.n3@$@$@$zT@S_HHHҊm@ӪY   H=*/J@$@$@$@iE hZ73K$@$@$@'@4e@ HHHH PMffIHHH  ( *iU, ԗ%    "@4%   2$@$@$@$VUq3$@$@$@$zR/B%8r䈜={67N$OPQdK,[nE֋'//zꅽ͛eǎҰaC)W\t8гgOu\~_~sI]?}[ p.ҙ3g~x|jJ&O,=z+cǎoFԩ#&M'JjՂ鈼yʈ#':uJupDD_2eʐ|-[LdW'NgkŊ#|ٚ?4'q1hCOk-}Ƌ`/^,(xCP(JP2:(GkVt"zvډ eŊ2k,1sL>} 6,z    H=+.\MJ۶mUF4##C4h*TS=ׯ/Ŝ7%`a&.E&vFa=23=ưx9=zԦŚה+&ZGZ1CFO?mE͛7ϦZ<v0 daB;vhIaΜ9IgN72=9%bjI!a K 0A`(ŋ $ 7)wcP t=+WF6l␦RJ>6j֬ Y`"SS&&L&눽ǽee4y{q.2 (gI^$N͠3֤I?˥tj\BhܸlܸQ0 ,nA ym>}Ȑ!Cdܹ0ҨQr ޽{*zҵkW?$@$@$@$@0JtJo-0t-Uu6e۷֭[bŊYA$@$@$@$`pxpi`{BptO$@$@$@0DHHHHIT@k H hHHHHIT@k H hHHHHIdq-x8rӗ5z4 z˜XΝ;Bba#0px7HHHH!`zyw-RgϞ5kĉ^{M/JR4h@"    0 (&_b뮻ΊQiU&   0+l@eAO>-ʿ/J    shԩҹsg)Z޺u^tRpa0`Sڵkg={1ڇ}޽{}/o@Ag0uT(JajY*WrK~72g;4y9MonPϗ #fC$)geIDX?^233Ueo0^}巿+V,d=*ǏP؁Bi #gN5YYYϧ)\Ne"5QT2IM, {sܹsaP |W.24po0tӦMLݱc:v옲 E .-ZXʧy&   H=P(5kִ GyDժUK:v({]ʺu{!   0m3fըQ#?'OJ%xn Gx4Zd4QlӦMYT:2 @(t3F͛t}LSQjUT@AhA$@$@$@iK P<0a/8Q` sHHHH Gq+޷o\RHDŽ^09iٲeeR@a     HHHH VR@ 8IHHHH GP}a :?XL{ݤp #@lMd.&L/=bL, {L,+ۃ7W;‰'<+ ųUVqƐr*!%1]%AoEMd&L/=bL, {C# ؙ`neI{#?:EJ޼y#'vQ9> (\du 3A!Zeׯl2x @pd"_Wz4Ƭ K޽{K۶mer 7(n]n 1G{N6o,O?tH B )$#IHHHB.I&Ifff%)9MHHHH\APLK…ʕ+;1S;NԴiӐvǎҰaC)W\4$   H=G!Cȫ67vc`}֮]ۺv(tر7&GkĉtPI    0# (&&ݾ}=ZlǺ:t ݻw{*b 5kl̙2}t6lXsxHHHH uQ@/25jñڵk\CE[oZ7qIOm& 4.Em    8O{nZjda㡀"@ }7ߖpZdI+Dr!k͓g}֊R۷7L`c\#IJ`=mRfbY%MDz .lcݺu>Jp|2 W_Rs/XGI;{={VXV(gy_Wr)R< Gп/!![7ވ)j/S[B ƿ6laTEG_^/wN j"k(W01,XGuĉB&v&ht‡,PQ'P|爚e$V9 G?~=zԶ9~׮]Ҿ}dCE~饗dʕM6뮻N7 qj& _ ,PޘA GZ0bak%͛7j 0@CU_֭QF6pګW/ZZzu5)0 @r 8 n>H*V(^z[k]}q믗W^yE;M=|V֭[ P+&   0#]vV={l,Rihy`V>Ý.{*0HHH!tRׯԊ"a#x(P}    GK.DMS{_~ <}    4%ڦM5PvNR(1PGZ/[leIHHH 82L ,&iHHHHH@pD7"L8߷o_A';3^V4iIHHHGPL?i$5 ~:t?P+DlRᣞ!q7L5Q`zcbYee4y{`*ƃ0rpIe&p8S(~N0aȑSOeƌV O׉- k"8L+^zĘX#.r.i|n'c %{5Ezn\q:KQN,4uTS 0iN(YkUB67Lun\#IJ`=ݢebY%M@$ L#oz͋9בr|fddĉJė # hVW_e˖YPh 4Ll$@$@$@$@#]r7+;`$|e^\ 8#=òvZjՒ_מ`!   c (n XHHHHH Gp7a< @dpgnO,3$@$@%`z/媫 ۺsNٳgUHHHH#` g͚%͛7W+B D^SvJR4h@4#HHHH *uڴi /H5.]Hݥt6z[lQUf yU@7ސE*jgΜQk%|>|X<(˗/WSA]veZ/ZH^z%+-!q7-ؙLdgrKN N d\yɾCyɱcǬ)5cPdF+Ǐ (W-[nU>WW^|󢋾gϞҮ];+w땏V+\;2!;=>M+^rb$7-g6+`]|R*Pd {ԨQJ~'yWܹsnڵk˔)Sl ^+Xtի(QBr LL{&2D%'./rGtbŊyz."E6D+o[JtdiF3bLK$@$@$@!45xW    X Pӓ \$@$@$@$@+1'   cG*W9I͂!q7-ؙLd?&L/91p=9$7JW?p)OI9ٵ97-@6o4/^XHHHH\F+k׮={/C s$9vXyGv2#IHHHROy@Ǎ'GkVt"zv&޾}XBf͚\^͜9SO.Æ K=]J@$@$@$@$DX222AJ *H"EdRF +#۶mSiaÆh"86,Y"'N>7'@L΄<pʼn7ʌB*T?JUzt 5,:+TRzדkp8uM9dFc)  XcɛI,x9-Hpj&G3Fs$$yx6oy|0V۱c~Iۖ >\֭+k֬QF)pB5ȨL2J)HޘiӦM8[^?` ۾bŊzgӳ؋Vճ{5 H6 l>}Z-ʕH= @ =蚆Nˡ{ҬYhstm`BrqHEҾ}{yq}*ӟ_DH $ɓ'˔)STCHL{˖-޽{ˇ~(UVM{/p40~?5n d&.JE$@$@$@$[hm&y> O>)]va@X=zռva/!вeK\Ԟ3+B (Cx /> VbHHH\N GGȑ#jD"\2@$7o, $H3|'駟T#-۶mSs;ұr"@B 7o_~G9r7ΫYerIS 2D>\^{|衇,[nj?1cƨy7n(]v={><\̚ȅ dڴi Fr}I.]« xq&WzСCS  (h8AyI(*!0;7ސEL9sFN<S9q⣄3%8A{Xjy睲rJG,=ys#8|xW ZAo\ ́V>.nҦM= 2gׯ4I"pA1c{3333 x„;vTv:t 0ho1SO= V昛\8<32x`)\pœK]J:?TREG< h۷oM6UԹs$OPyI    g#$@$@$@$@ @4PyI    g#$@$@$@$@ @4PyI H$zKL=xm H$*k @PMT^H &7oF$@$@$@$@OH$@$ӦMŋ+?wq`ɗ#x2w\ٱcTRE^۔T&LǹÇ_~Eƍ'|TVM \&!+ [@s  F!J*IFGI&ڵԬYSw.Ӷm[Yz:K޽e͚5rI)V7T͛q?DGIHl5 ( 7 ݻWF%˖-͛LV\Yxe߁_TJ&B-_\R)+\|ǒ7o^P`AYjjE}ᇥz /+pM$@jlP0 /Xv@Y馛tI 9RΙ3G;Y~#}+_oS>quV>[lZI@$@`%DH\Mvh̓'O|F2f K/-[m;UVUPA~g[wHHTT@M-E$ jՒG*Rg:tC?a ecǎ*-E ֭ % Vb  7R$@%_Zׯ/ܶmQ#ϝ;'|WҷoPIG$@j\P  /TKgϖ]v:uH?/3gT+VTA+iйsgp,YR  'N[o5) P $DIHHHlppHHHH &0O$@$@$@$`#@Ԇ;$@$@$@$@&@4фy}    *6!   H4*& P @ ?ivNGkIENDB`patchwork/man/figures/README-example-1.png0000644000176200001440000006772114666010402017741 0ustar liggesusersPNG  IHDRz4iCCPkCGColorSpaceGenericRGB8U]hU>+$΃Ԧ5lRфem,lAݝi&3i)>A['!j-P(G 3k~s ,[%,-:t} }-+*&¿ gPG݅ج8"eŲ]A b ;l õWϙ2_E,(ۈ#Zsێ<5)"E6N#ӽEkۃO0}*rUt.iei #]r >cU{t7+ԙg߃xuWB_-%=^ t0uvW9 %/VBW'_tMۓP\>@y0`D i|[` hh)Tj0B#ЪhU# ~yhu fp#1I/I"0! 'Sdd:J5ǖ"sdy#R7wAgdJ7kʕn^:}nWFVst$gj-tԝr_װ_7Z ~V54V }o[G=Nd>-UlaY5V}xg[?k&>srq߀].r_r_qsGjy4k iQܟBZ-<(d=dKO a/zv7]ǰod}sn?TF'|3Nn#I?"mzv~K=گsl<b|_|4>?pߋQrib 2* (Ѧh{28oIyes8';Z9h6g>xRx'b8ՃWOϫ[xn%|^z}%x c8eXIfMM*i_@IDATxEXrFbC@` b!եN:Ad< v>mVZyyyV[iߔ]oWoiG]`XyÆ jժdɒ-|ayzj[jUeWd~[k?lܸ"EK8/t|ի~/.-   In  eh@@`@$7@@2@b4  @z  @e1@@ X`= @@ 2  h  Ph@F@V4XOrC@(C F# +@'! !P97zʕc٢E젃nݺF@ _:t`֭3}~N{7@@*#%x_nWv7޲{_  PIPO?d6m /0 O`ŊOؼyW ѵn|C̝vm  @z-[fw͙3'a P!P[UklC.]#  @e ɧ״iS1c.\SN97@@*+@ZBVZַoC  $@@@bb"@@@$@@@0M:ƍgK.3A  &zW\q1&Æ ;   O4zsժU't͝;7@@*#@{7^j׮m}o*>" TFԧ`dڼyլY`# TPw뭷^éUV5k   u^z%wވwO2XPꛜ  .hx͚5P" %Р$@@ )Ф@@ (Р$@@ )Ф@@ ( J* ͼq߄Vr%_ '`Dxu7 /o܉eb9*n*@Ю^~ߠ?7W0(Wΰ#_ϸ2s&_~B'=//J&e=TN:VXXXoTG%TF(iYa&i=-ժU }9^9իW/ֶm/, :weQv).]~tygX:̤2{ra*7[]IOmf-W9._ݻ-Y$hj+?|_ݸDmglF> i qƱ0h ۷>ֽ{w [n+Xǎ+t_tE6aԩSmq-??tF޲ܾ;Z52FFt9! ;sLOmСny^n)aYF|@)߶Fٶnشi͙3ڶm5oj׮msε~?شڵ)S @g̘Q;䇼wu >6ol:#:'i=.B9VfAiU%o+mʎS}m}Cہ;K/Xq~g>CIíuֱKA_al+6wm-}ۘU  cݩ7̼ðP.ͅ]] QAoǞV&=Uoأ>jC eVNb+A~iY#<coشiӊ mҤkhu/$UM5kָxy֪U/nݺXūg Nr"լY3qE)YP) ڷo_ly[ŋ Oݙ9wAF z]|+~'R}VyW+ s[kAmkQ'~ٵ^E`;:5~xJ 7`_|7kA<.]ZrTude Ѕe4P_A/K?z+VP:]~g3 .r3ttņEGZOY٠SmVCة2(ٲiT@C8Wpj[:C_VϿ1{-&Iӟ믿 ĩcSynzUh/gWWd6lPΣ|իxys6NX  jupA&=:0Oh]V%O:0M:ծ*WniCW'T;ce˖ִib5\gIK:[(яVRIuKrT]G}wz!WFUШork9ZO%h=Tms:*o9-Ga'٥35f͚e{+~TuR͚5slѢ;Sߝvյacam@)g۲U } k?Wu >,0 6ʫ$㠝U0?J^ G}+.йEw+F#ݘr'Y=ҥ;+:գGY:nP6miY(`Zm=cZrWx={ <՗C H3Ģ5 P.eTѣ%$J]vuU᧞z;sVV~y͂Q*",˗={t?((=]ECTFӟԠKW濡FIR겭@lx׊Uc#8uU8,63_@4 dD>VMBrY@7P_7-@T Tj,@@#e#@@HhJY  (  @J@S@@@@@R*@Rn  @6  RДr0@@P@@ ! dĻYM /mI(//jԨak׮Mjd'Zlt6wdgKj|ۼymܸ1իg]tIjZ&B?@@%ꫯĉ5OXKaet[&MZ C-@x=#/fӧ}V-@@ tiVZWr֨Z5~FI8nBbC@@HhJY  (  @J@S@@@@@R*@Rn  @6  RДr0@@P@@ !   T4, @@m@@ )faۅ^h7o&s9ruvm7;S %= DQ4k2kvܹsmyWg`yΜ9b ?~(@@  kl?.6,.R۸qch6l3f'|@  [իWߢyyyf͚-Gi@nWR1)  @4A.)e˖Y۶m"[n[[]' %@aUZZaÆ֨Q#;vծ];5;Yf3*w޳&MD@|Yfٸq\_[z\d y+]UVٟ'kܸq y  dhfXi;wI8L*.eE@@C@zzG}d5kִ;]z) dh_|a_~y)X*U/ĉo3ZXXh]vM2 |ad  As=ñEx?Z~~~lXe?nN8e~J;! a p|I7}gz8Og'O2m4wv?ϩ3$@H=j(/=}K̙3z\QTZ5w&i[rKA\^rd]ףzi/6"oUhx }>ZWa&VҲL悮 ^:2y)eR7oeYe֭^5|t*h:uOAʷJc=c%Ox;h wuWo쥗^.]?! e в =^8p3ƝIRO).R?  t'Xu]gGB@YKټv  A dh6] DP4+"! ,@k!  JH  @6 fڥn  @@#R(  ټv  A dh6] DP4+"! ,@k!  JH  @6 fڥn  @@#R(  ټv  A dh6] DP4+"! ,@k!  JH  @6 TQ ,^&Ol 6mo@@ <3t^lu^uRJ:2@@ @|c)V/ dW]uU|Ak~{gt_~dma %|?cW\2V"5C%+0o<{;[VNveea pRȻN:q/Gt@rQ3Y֏:(߿Y6mj.gyթ(Y2~(,D BZaz6j(;_uw0;&OrH@Oرc8~Un3gΌ? P4!MU3&{*DM@@ ѫ# '@y# -@ѫ# '@y# -@ѫ# '@y,oذiݺuIÄ  @a )I&YΝO6z4" @{dŷ ؾ#H{pB;3~^{n馘.믷aÆqk׮s=׽^w cO?nfG\o0@ ]wu6g[Motk?|F|E-P:mJ3j(;餓O;l֬Y֪U+4hg޽)֭+ֱcG+]/"0au) 5"K?`k߾} C Zg7a\[Cvp̙ΡCZժU_^x'j;kԨњR,#п:uj R}kӦMVfMׯU^=$3ʫl[nm?}.A+HjӤICyX//<6,a_N-GVZvz?lu wo S]u}ݢԅFݎv( D~g>JjuvT?fNx3mxu]Icʙ &Ӯ{K2ӖaIes:u\ҥK]I~n*̺ʠ= G)XRo _ ؒ%KlV~}oVY ?l_ݺuct>QRci[ZzeC )v ^5\ZtQ'/OmaMԽCmN 3LLbK:|msa&CZNG-vze_b몤婧r͛gj6qŦvP]mvy&i+G.ն̾,3L[^ǰsm)ʬ_l}|v3 nwM2Zgj+{E%2XK-Z=c25$41]?/Ns rʕ& d9裏vݡLɣ>jԠU?ֻ~,^V>:8 s[/+HPf͚XP/CuNj* {ɺ(|뭷O>1u9z7%G-k;˻_]>Ih;Imҁژd-mX'sTf9k[CXeݖW6MMH'OvG6lc|^W^]l~lҚ6m΄zdp{.mӦ,o̘1$L?^tvSj:x// n_|=ArawvG׺HGJ:oԨץK1bGQL@le&N誤G.2nCfϞp֡CRlq in;% ꛤ>t wnx׮]]gN;]ЍLMn"C2\@g=z~*ےҸqci"JN7@=U_>}c@K:#-[VZu<ꓢE&*U1cGq6+ԣSD)ѣ]~TN0H?/[=;0Q韟 @:w1Kg  9'@s #  M?KG@rN4V9F@+@^ hέr* W4,@9ZXXh}ڵ/V~C @IPc6i$[ΝKNw@ ' @s9x 8=owt>|.9I%@x~x6sLmldӫ3^o>!*%~Wm֬Y{7qR/@,9sԩSm…6qD?~ 4d@ Qn0]vRC~m?B @Wv]hljժvK"&AK UVH$΂}%e"PNkР QɤE͛7/9 @ .;=\;#mvpI'dcǎu5j԰<0QRA6ekѢs1eK}y fׯ]o&N{Ygśa [ .3<ӵ:+ې!C{1cƸu>>8>"@ >CN'*?ԬY3.qBܣG{W6l`mڴq?r^]tqMwPl/}]U{]BLo@ hZ|}A^KZ@Gy|2R$ d%Z:(P۩2#ctSsĈ^3c: . lsJ iݏ@Rr!nD\uDd+ٳgg9cw@ xKu>roEꦴhѢ32b@΀ͣ Tg>.GGl[g1a4j=giwW^yuV_~it^H _@ΨyS):tGBrM 3/|謧u / ]|ŹfJ}@ G\z{^@\ .nitԱcGSl˙:ݨ P믿y}nH @ T8m޼{|q;餓ꫯ.ֹsg;wh"v}wꪫ>Rbl]wu ԵkW{n8\D ) ~~aܸqc7HA&-06o~M66n SK ˗/6mڔǎp .?;0>e#o.2wYfH"&3 SO>dJJq]@뮻.,P#F[nݲ![rgϞ6i$[mm66oS!×-[fڵs=۷OCӟ{oW>#v&N}wV~}m=HY 5@PRqo:z0w\wF^A[hag}v:ŲsXVZvA9@@'h)QRM0^z%_lwSO=5*ţ hNi d@ wgX).  @@ӈϢ@@\șK#Z%=/RoMaЗe(!իWJ*: [Zǰbyo6m^]@7fr>־PBRvڗ˫mHe #_!WnaW*K&d#o[Lr&RY?Xe గ/gRa/C1_)+:+IŲocXz]00W4d=ªW!y&?3hAW6~V`3Da/GG&soڴiSE|:z >*꣺bYZOa/GG^RT 6KHyW /LuMIfʓ~PưIm:t֔h{ Mjq,mZ k?Ն~*s .nGn2)Hf 1}@3iˠ  @fJ   @& fڢ  @fJ   @& fڢ  @fJ   @& fڢ  @fJ   @& fڢ  @fJ   @& fڢ  @fJ   @& fڢ  @fJ   @& fڢ  @fJ   @& fڢ  @fJ   @& TˤR1c >ܪWnr5n83 N)@@ %)aΝ|gֽ{wVUZci&w) *%RyYUVSlڴ6lfѣ^@W4{mk[FXy@Pa +@>7l6nܸEk׮*Ul1  Cu&M[n)nDz-??p  @ pRPj~9袋l} eYd )@-ҥܹ @'%x* C@M44Z2F@'@Oa   FK  @0 @@ 4h@@ h<! &@-#  0@@@C%c@@xT  hhd  O4 @@B @@ Sa  @h@7nhǏI&Yaaa.Z} _~;ƍgdҥK?ymQE#G4Og@ ]i@ϟoz $~m;3L7|c=zӧ_oÆ s׮]k{3ƞy7d&?@ |M_~; otmo@ i@_{5֭]}v뭷;l|cQC۷o_'ۆ W^;}Q[fM0!͔,V{9; /ϝ љ3gڧ~nN;4{\@ TyEY*Ub-_tsӦM6gk۶׼ys]͝;~';ckΦLb:u {w0o@^[QUZիŸTV-.JuԱ͛7]b>Z:R}K.îWGC_իWun]SIۜ/cs˳n_֭UVӟٵ^>ԶuֱB}I'pB(F;QV-WmoAovj? 2yJU0V *o:Q]I&}jlJ{GΣ:,X]MmР-Ytپ~볂U%QF ?؈^T-G;2*75A3yH;WiL6u_qYfeHj^_$=vGZӦM]P^R;xRN~:Wܹx. c: :_}StѭK*]^~Tfy O&yHoG޶\^z-ןStvc(:+5d:% /svm^y[?%;{e˖e|JlL52] ;5k̝Yre00m:[S*֑z#m&f> ڇxNu*+oexEr^{k;ˬs-3[Ld@w}]*LG-^Qn4ҙQO>鈩K.wYK=if/ 5~v7?`gvg8:ˎάA" i;ww'yI'W\aq{iMҵkW Pzo@L:u{FD^z H={ .7n~nDm7?@t =:thB]#GP>E$@ v}wD:c#p}կKNo<@t dD>`ϋ @& DOmHvfb=)3d@f'A@(K,!# *@('! %@Z@@ @@ -K   If  e %x@@@@$3@@@b<  @r  @Ye 1@@ P@9 @@,в  hd  PhYBG@T4PN2C@(K,!# *@('! %@Z@@hndϷqYݺu/_|aͳ֭[{]y@2O4YJ&@@|殻H|…v']n:+,,뮻 :^}U[jW3F2I_OC):m4@}s;I+.IDAT@ :κ$H'e{ușY@ ̘18=$ Lh"oϞ=LQ-s^l}3RZ%SF #@K=OnrZΘJTеkךN2% ͞u5%xg:oƜv ]v瞙]J~.d61FlP 虢=z\vm6&j#  hdV@~LH  m΀F{P:@@ @nR!@@ ^?@:Ь[T@hC@N goԨQ•WZ5Z6M™9z/GBW_~쵔,fғ>*4_fMӺ 3i;PҲ*>#{g-??m2u׼2% xޥK&QޘS4 g.z.e1W'gŊiӦgP9Æ G@ IfLoYre9JWI,'y2iȐ!v-,3%:Y-rs.G.oVL @V p4+WkVCիWn`K K>}L7CҔ)SLMo<3mmIvvCHN^c=6K"F~P.ФI5jr!1R~yY=](୷OשׂOs'ڈ#d-{aGB+Laf͚eSNM @SF͂u]mƌzDT2=sł]=~sڶmʢ,@R4+WkWJweTDτ-7ջ_r@@|܄T>/38cZ܂ THBl̔~{Oz$^{.lvn $+%d.g)]p*-[}4T΀PQ@ G@'! @\ޔ@@J -Q   p >xSrD@ kڪU+S3kI'@}!d@eIըF p >7 Z3gy $); iƍ6mڴ\&ʺfjR  0`s=*M.GsP*@@ k@vR1@@ \/ @Zfb?~믶;X@A@F`%PpJ{wMwP_w_=kAAw}[ rD@ )gq6lڮjSNUcǎh"۰a+nf'NmݶX @ fI 3&tWzw|T[ᅴ΂*m޼7t=sQ)&@2^@m39s*E'-g@&M\͟g^z,U!Uv5$0Ws9{ TF￷2YdͼJD*iR+† ._nHmZaaa[N *ШQ#m[jB/ЧO۴iSR3꤀UV%5}F/nM,N:>uJ&72U4U,' 64jy1u?u ܳD  THBl̔jڢzɾm [nA€\ѣլY3Ơٯ\{0>  @@+nǜY*p7>Ά6m4Z%KW9BH@~Q?-nУp}Ѭ_Ǝkƍ7*+p}O?d|Oh+%#P)UV6d&jGij+)Q韆 @"7wy,ˡӧOw6l;=\3f=nCB Hڵkx J^Mq?7,otJn||A(T7w|àAo߾veٓO>i 6+b;v[o}Q[fM0|G2^vO3gδO?Ե7pvi /IS N:GmrHB9sm۶nXMgf]=cӶkΦLob 5i$Ӎ&ժˡeb9yyyߒ {*j9ZOa#,j®禿a/6o7/-+Iطr-^}Xq}&>|Ɣlݺul~]Y ֭k-Ze6ƾ6-'_~+O6VZ_Vɖ!tF\owo:u7,Yϟ_Ҩ{50DR֏IfͼC:5n8cyM M)UvZNÆ Sz=*+Gk^{Gyv. RKk;hc/Z?M6W _3^d)svm)#F :_JK~a+y=MTaENgE%.R;c{+86ASmٲeT3 %/$ZtA/K;LQ5jdLgL: RҲL1ֶS*֑I˗~S!mٻmQFXTõ/pȐ!ANmʣ*}7mN/u 2)_m%o-3tU3;|.zUA۲wVԯ7폗\r}goyn|yہT'^a.yLw}]^Z~P϶؈J~Əʫ}42+_d-y!+f/: c[~#Y~SdW>āyoBJ# h[oI>wEG]t#F%hAb*٘&ʗ ]w=Bwn袋? o9O?ٳom:tp}p9JE@ =*^z{v]vu]~ꩧoS)9!{~KT:[Я_?~K N@zi\pcVbݎ-@ D*#EI 0:;ڧOPYxNlOsqz)Q/DG`vp/hDd$ẹ"ޏ>#@lqpuQ+D-I?Z_Dm>#@z+wIoiR@S@2A{[FIo9#! pړ/"{;yd=#|@ {@g]R"#d8Ȕ DKKZ@zЬ_T@hA@^4W1D@%@Ai@@ UL@@h Fk}P@@ @~S\>}u;0{Ǐ|lYS/*ŵNV~C=6o8c /W^:{1xe]f[Z2^U\];+>X [&Md#G?<#7߸3^7mdիWw뮻E +tgeݒҥK2H4VEE,UVŝdɒ%q5^#FX&MwV^ /￷ڵkۚ5kbylܸ&LUl]ԋm,ܹ2ziŊ֮];k/B{]t^'ڶn[e7mԪV-]J*$UM6/'] ˓> z!ﭷޚ,IOW27j(鼙0_G~MAZAAi]vI:L@s,|+CƆG0m47QSO'E jԨa[oueVpFh婮<)K.+@^@;wꫦ3puRՇJg_ׯULwϛ7ZGA٨Qlmnt (5 tvSNI8>;;_FjլEAsʕnJ&C݌`u]mOfAIxǪB m۶5g} \O>d+SN/,@΀% @_uƌV* UsϹ. _wu^{f @@Soz>/ iذa[Cw?)4 @vmg 6,6/!@"y @dݬ~uԉl)QP=y"J)Gx ϖ@ 7|錧Y9sAEHhYV@ݝz3Ad?) @zw)㡾.E!&t  hd  Phi:C@\4pR2D@(M4! .@8)" &@Z@@ @@J -Mq   NJ   8@@@'%C@@@Ka  @!  @iU Rid˸%K$ʬYlʕ^{%&իW7]|VZeSN=j׮w֨Q6lTv qƶ&&yyy. KܹsmѢE>$&XGk׮~vm7W^PEO*!-xʔ)VNo#3ƚ4i>VJ~iӦ@֭[gV~@VyӸy@]p͜9@Ufa3fpYڷNao͛[˖--rX5klɶ[ݺu-sjv<|3g~/\O{.<裳/(e] Ь\ؿ}Wعs笩O?䶹qeMN8o1kSVE?s=eMEƎ2U^xI#3.+<3"Sd R>CLi[lvgJpO+#vQO7" 4>9[|ylRpg fbz7Mۜڵ^zt4JmGuS?Jw_(n[˖-K.=RK(|vmvQG;m9ٲDi[N7r━3qrJaϞ= X ~O<{>[Q\ꇢ3k7tW\NJZ>3҅gyfG.ꪫ!C혱qZy{T?<׿b+j, ~mSO-,: ~/:sYY5WV]r/S֑U-:4].+ԟJ tz\/ 5rH+:~ԗZKQ%]-5tQb f䫮JꦣXzUvݽB5 H{"<ȸ}ݣv[7G.˫Qڶto`d9ߣ:=J}?KKQږ)Kd*-MH%7X /*9m|W_6c??aO=v 7@룖護rg:^Loa\'w?,,ayE>þ}c}H~~t@u>e:k3^x3J:`Тn"PeTNwEDW⥨֍}bPr?Ee>گ_?SU8aĈcyEK7Jr2e@趜sg@mzخL>'C4QQaw7ץ@gtITGQOEŵ~.:^S J-[z#Wgr_}U+z?\HooT){2 b pu}EW trnaL:LM@Cw .LQj;J[7rGN˫QٶN*h~LW瞒Evgˣ5Ċʬߵ .o+sԶe=a(mFUt[&U^"=GGӡCbs&}%_i~XKA;T/=믷ou7n{(~~wM wO/mU&]U5PQʤ otVر;t&Q}/I?Rp}EZUSRՅB:ԤJәR }+JmGiF~Е~'?TNmi裏L]OvݞtV+TYo+{cQݖ&(m˥Fn9&$p  v,@g?貢LD?~Sb =B7GsOV=G#t`pwiEw2ju(Y̦N;yWBT7]fYڪd+MAЙN:p#=2jKUŋwփU&Eu/PC=Lj>ǘ1xn:-zr~aw%*2JmGu벶M(ENmKml{uD}ԣ+h[n+Eu[N_ ?J۲n\.*-l/)X%7ݩ-IG1 n?:\7JtpP.ndLJ*Θy#eץY!޾Z RRۑhG3q68Jr2eڶoTyePKg@@:1 @@ 5  h,@@/@3  @@@_   N@@_@& zroyꩧ:wl7t{C-Z?߽ś/'x½{azޏW~6lcw\&sQvA3yGq{SK?=6m48խF6vXOmw4 3ϴݻ{b-L(((p>#[k^rj#tT0O? 'M+] (Zs9ǽ]uW5\s{^FB2IlѦRo-'L*Z_~}_duY֦MՍ>}v-7]%!P@5vEza;c5*z6{l7lw}WM_pƦ/zW?f7lv*,:?yd7n  eg_'X*v%a#F(< cѣK.]v@Y\O3"Sڷo+zQk{mnXӦMߢ@QG鿢֚5kf_>6c ;cuIjv} K.-=[~M4M >VÍLIϕIqmm-f~$d ,,,d;$ݕiܜAiIr_+@.0?{OSwuJ}^gTz[O/KpSϟ';XAG4避XٴuSbmhTVT#ԟigvv4h$qjou+SoFߛYU1g3918??GSr٩Uڲl6;L||eL"' E`lww...ړʻ;T*9i]oR5HՕ]^^YU7q lllx]T/zssoёw'''aj՞mjjj[`PvxxG;;;d>#^2{{{y;>P5󧧧VLC,",QNXE@ Kooo>g|*W'?+IUM:r}O+gFF7{{}}:Пǰ ހb*W Tr||[ևsn[\=m@ g|*yR/@ hꛈ_SggB?3 @Z܇!4٠C! @*R, htMN  @Xsu@@ :蚜@@$a:   htMN  @Xа\@N4&'`@@ hX D'@]0  V4?WG@  @+@֟#  F 9V]?xIENDB`patchwork/man/figures/logo.svg0000644000176200001440001331203313563227034016167 0ustar liggesusers patchwork/man/figures/README-unnamed-chunk-5-1.png0000644000176200001440000012533213565477507021222 0ustar liggesusersPNG  IHDRz4iCCPkCGColorSpaceGenericRGB8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|U\ @IDATx ǟ"X[+[VCRJJTѤM,ADk[H"""" .BdO~{߻ߙ{{>33g39ySg÷ @(%ʇl @  @ hIq @( @@I 7A  @ hIq @( @@I 7A  @ hIq @( @@I 7A  @ @.\hWHi)FzI&lٲp2iVXa_}U-,}8Enٲ-^8kaQN[hQ-,}8EIڴiSn;wn*>j֬{])lzFl7yٺu6m\+F@ FǍ @@-@ L`t@ PH /%,X^|E͛M!P+7Ez)jN)g $3#GMxx ~~@l0P]MWTFn& $_k$pM/YVV\pD3''Q,WZtb[$wDŶJ,ipDZkB0QIId>Rr15|r[jUV'i׮]X;[NXD?!q @'YT]v#GJ3ןS6mo?3f8NF.]!@!)xUsύ_N&N\6I8g߾}^nW^:A D@PS&x oMFFuGmGq~ @ "%/|Fp9 @ :"D @ HA$-@ @"@ I @@͊ @$$M҂ @J4+". @h4I  @ +Ь @ HA$-@ @"@ I @@͊ @$P?jKZ 4M6٤r֩ST͛t?7O mQ~}yF FW^5mU2IIݺumÆ Ig^zM6IG*еkʕ+3`2tMm嵿2R((B/Hd~/mU.>b"A &ߵ:aD43B L4`$@ hf> @h@I @ 3|8 @ 0Ѐ @@fp @ `%9@ @3, @@@Jr @ fY@  @2@̇ @@ (A d&P?]j5 ;[VOngώ|ǎc@ D@dЕ+Wڳ>#zj{w;!/sfmԩh; @ Z"+hn?ONkbq~>sn>- @@D DV5qD{Wv|-Zϟocƌnݺ6lpFOXڵkN:JJcmST"mDyQ-W M&&0I$Vڅ-t^*$ ??]-YĖ-[@%\JhUKSh߾.\h2rP^=ӏY0mGU5ȲF-xF[XUuV%-Q Lq,By'"~@'Md{GB 47m4FH߆ 瞳C=4&|& @@ D^;&Qvi';o߾֫W/OO@ c=V־k#GK<Ӝ{c@ D@G@sE&}O\iq @(@ˇ!@!- @(@u@aSj VF Ʉ@  !@j@Ʉ@  !@j@Ʉ@  !@j@Ʉ@  !@j@Ʉ@  !@j@Ʉ@  TZ5&M[l $QdҠAbUaۂg$WթSM뛞 6Vnݺߍh&@WZe_}U,*ŋM" ~m@qҤI6o<2 @"Pdؼys/mܸq6m4?͜93FUVZo6lg @ , ]wz뭶.X=& @J(ԧ~]|._߫;KB T9@P ݻw?8%NӦB$ @J_s@/۶nk~$J!@2Dγ?;,}@ *&z7ɓK#X @UI )VX*Ri@ L뽷k.eDB T@}ݗ^S_u ߢ|%A;wl[lEk @(?@P7f͚5_/#z-١CحСCĉM+.I;tHc7@ l/>n4R^z^E=X;Nؗ;vX6lGy.8 @@tUiݺ-[f͚e۷OwYx |G覄:u$\?uTԩSLѣwߍ>#馛x-M9LիgQ,W-m⢋ŶIl P*;_m&~eCq0NΝF:_j-Z:v. Bz!{'[nIHB+7on .n{9>{Il#&ZS*vvaj[D\Q.$rJH$ЬY"tM)4-F'r61qg3gLW|ݺu֮]zowN:$;cQK.5 &(2iٲ-^fa) `+ӦMV]J/%W5jdo͛7/A>D6m۶-Zmɒ% r4c ; *իU{ݺaÆ[ڗ_~-Z~2Mk%Onf @ tsj7|p 6rȢF%,z6n8aҤInj}r=-\Ro& }5-N @ rۥ'Ӷj+kӦiZ^[}ϻׯ{ove{?4hr%j->}!Y!7@ @ n~G6~xeK %d.!lJSC#>h#UVs @%kfwB0;9Ч>! D@  v)9*NK&1 @^GyԴMi^tE&VZU/aj@ @ _[o9?%ߝ& Y @ "Kt„ he\4 @ "d. rDɰ @x_§k'|f͚c @#Fp[k_ e@ 2/Tx≱{o{cǎE>:ch؁ @UM  6̙3kꫯ @@ݻ}gIU7oi]#uH@ -@O;42euTK,wݞ~i@C @ F Tv~@~v<,Xف @۶mk#@ @ @tD-nݺ֠AߚE&jS9cxFI?Qb[Vv֩S'kaZRALR zRÁj@ϖt D/(+\E-xF?/hEKZ#}S6lhׯ/] b #\ܲ*5kի2믫y1L4r.b[$>`i D&͚5+VVE$onIuU4}!7Lf} @GڜC @-+~2 @GڜC @-+~2 @GڜC @-+~2 @GڜC @-+~2 @GڜC @-+~2 @G*ׂfQ'pgF5iQ[r}&4>|7h"?3ƺuflM%6vX|x7ڡCGk>`ӟ .47#ߚla5m4wF]KS=zn_ @ :";?i$7n{'c.[z9rNv 'X߾}hiv @"E t;e.HAN;4g%/@ ],>!Ƶ @<*F->r @ȗhĸ @(Ef@ | K!@"Z>n @ȗhĸ @(Ef@ | K!@"Z>n @ȗhĸ @(Ef@ | K!@"Z>n @ȗ@|o4h`5D͚5lU0$G"EI#YJG:u`aÆVn][~}\l֫WUI&aÆU)]֭[ !bŊbn{aجH䡣(2rդW 0Id-sʕ|Wƍ;&.7m4a*PH$#ߚla$uʕ+cׯO8 @@Dvt޼y֤ISNF-lѢE;̙cypBO?]uU{Ǻu;f'xm۶ >Z"LD`ȑΈ.s@ T#:uu`TZ~OPBM5SAիg>5ijʕ_ǯ85uJf$ "0~xOjƍsube4m4h`}wݺu+:JM_O,§~=[l;fΜi8b ?sϭj&**W_^ Xkt?L8X;8C+ݻFO bgt$ ͦۦ8Bj[!4%=䓱Zu]Xhd#p1ǸO~頃bIlЪ|GvEիMsNQȽ,ř;+ *' Yo&UN#agZ}g!@&|@I @ 3|8 @ 0Ѐ @@fp @ `%9@axGݒaC"Y҅ А, P2%CMF @"JH<J@^zɭ3qǙ|M6Ͷzk;S'?+waZw\Ν;ׯ_ov⋶څ^薜-AU@-! @Lꫯ .ڶmkvwիv駛V9ꨣwqX߾}wߵښ6mC=ɓ'~gSL\BF@#Ls̱A믿nrdv܈7opBNJmݺ7 kܸV^=ШQ#?~E=m!C=/a @ @#4 &L0 ?b9M ^{IH}g}n+WƮg}O8#bS:>( N)j5mjN:)!=vn7*M6 ׶j*X۷Or-mժU q@*Ш *N;dK,q¥FE=X[p]zn\:FO8w2> ᴌdD P ֆV@%pnӜ:u͟?߮*ټys_~i8e$c%dOo,׬Ycw&եA5 *\-=6c 7BٱcGk֬3LjР|㏻iY|ɦQLᤓNrg-_~vwڏ~Lp@d sCdJCA T0M ɻR̙3M .~eJs&6a҇ @H | @&6a҇ @H @ M!@ & @ la&}@  88 @h؄I @ h @&6a҇ @H @ M!@ & @ la&}@  88 @@3b_}Y&eիg 4+W<ddÆ mA&Y#uZ6lPAF}*>uԱFYgM7 ъlZ˗/7ajn1@;ջ A߃kSN띥uBa!J;wߵg\̻*P }ƍ.]4Cʴ0&l|֯_fV|D/Bqi%ч?]9#!CoQ[˖-c ͛7Ak֬{N2YVK2N띥gB 2'A3;-Zf,T'tA LC{!@&72n ;駟Jq( #Aq Doa~a F R4#/M>ݶ~{;Ór@ / zi&Lp 2Z~`O =1kFЮq$ ]Dt$m]/A@ax&dž9b-u^[d/duEXU^YI_bEb;i䭷ުqFǸq@k!$0H;,Ee̞w[_ "rO;tJ[eAe-6=l۶AşV[G@ '4.^C wJKs'iW_}5!#μ'O6S.X  hM4)Ht\C숆 [oŮngҿ6`TСCmȐ!ΘwΣGFv h2B򽾇,|4w @ \ɜ6mZB&ѵkW+3x/cڽk^zr)#$ r) LFHrD PJsεG};<;cYO2źw;ܹ}'NԩIŏ=:vvf̘C=ׯ_pmRcaJ+ nvn$,ƚ FLemv JWUˬvS 2j؀*CU>P<@) Hz?/2ș3gW-bT… cڑz5ne]Yf wTJ #mQaU9 + 0BX,JWZX[|M4 A!iA?:)#h@JЮj{M4)!R=]N#8 >nnw޼yŋjQu3gN`i*!%pQXhD;Qn ,[,PEg PbܦM7kg8,?D3扗tWg~W)H=by?=nV33w19 _hQZoލ}G fp$cqM-zm>YdS%x-YL7I{3]9@ @U q9~zOS`w'ؔ7?.M6^T2RǻRN9ڧ}ry977h>KRK n`ηjnv'I5juҥb$ܫi*!\g϶>\ٻ|5'#1 @5]rʔ$j:)TI #MCQrNy(F}%S '3" zxnyGywf(E}ԁ ( h&~*+wuhN>da\6}>}onm+O¯} ;@%j~erd;W_}=NF5{8]#_wF}KmmTJѭDe4wnF?/AskKױG}4rX 3}=UGG`*:d4%G#t͚5+H@YK8B@ 4iAA@ bD4rFC^{@ugȏ~|o~θQw1DBڏ`K6J#4Z.]lPfY Qɥ 橺AY|˔z 3,a[ljySo;܀4`5:a~/@/ٯ_?M-_;ӊM@$sаu|L;q vO ȥ :] :]oWȾx"#4o49MJ%m?CZS *F=p θIƂ<򗿴( tՎV\իWg۳Q6!?kbI(\ʐt[C=a-<2{(t*,J[. :]?rX PrO֯^x+,Z}A G /я~d/b2ޑ)K>@1-^K޽]/M:FiE(RU?ع^MTԩSm-eĉ7gҋAVo&O:A)J~ꩧ|Qr/Ih67Bg6*U$vɹE:?І:ZW_uԊ:ZJ0>\|NLklmqgr.a[ouСCMBkǎv o?~Өz%ԅ:@@KA< 'oV~r޽{,J+=رFؤsy-8-,+gaO&O_~ILvzZȯ5r_>e^5'4G?z,e8mڴXVLH }I;k=3lu1y?j d}e>s28ɥ k!Ki0UsIW*0j\*CAj4r&] gѠfHEle: D@Zyx?͛7ϭL^J3[Z7tSNF/{"hGk.\;[oe\pA,N#[o[3fG«t[w}4WUGq mVBv#H K+ri\ya ;M|诜AggJ@KA< ' SzrMkd򨣎rf3DHҸ;l6h ;eFt$(h"U||COƢPh";bg)b7J , @zzTai 栃kp&J=(!\,ri= htƥ 7C1F >@y3f+SFo-ӁN9唔)Ν;#n!wjDۻϏ>(۶m;֎FHx5?5DLsK \ʐXGJWe :m / :]K9(lLBv*w=υ[. !f#y@!,h>sKyv8i.{1g Q:{ /`ʱo4)3f8So.]Ib2rT~5?\}  G@5V>F7_~e0`@55u,TAN5SjA ?t:իWy{BnT'?TGoɥ,\Gr-` DV+vaH/A/4v% MFȤ_|Mndr=ȘVP)]RM뮻IO?G6hC>þY# Cos5 _tEYːbPQe <.)Gҏa„ vg%5R >HqvȐ!k )lMD@믿,L?3׹(xz꫑x3z] O6[@\Sn6g)={i=z?p\hG>uF9>CSHJ" hD-~VGi2jAB7 lMoU]fI㠭A j#]iEsa#g) ҇zGMky睮-e&vr W%5kI?e/X?tMA?V\xkD_s9ǭ0>'2'g*1&={#wW4邦۴itI}}%k #:mWmtwt@+"&qEJ wN9ߔ3gNVgZ㪫{[nT;*֭[fqG/dT/<h䐋{ 9.>/{_ח>ZQT).ɑ3P$Y/бtG1wIN+ݱos,]3Bi\QmY)Q'Hz-i' F.0 @%ϛ Q}Y',e}qO?$r{[BIv2tٜ-rf 6>(;C^e裧U,؊ >&>͌>>ɝ{/>;Opiz])8ײ)V(3߁JUg]LA˯V0h7"!רoLD9@PA#r]ȑ#VKe[ g˾NQy@IDAT\l! c#|NLӕᔂT!,O?rm /t3>r9cyWr̞=۞z) 2qDrw;m6J DJT~z4J9p@w/tL >%@R\u4ڭw10ߴF)3u>c7;nDH'u9묳|!R$#YTS~Sص^K r595JE@*C~uQ|sFJHrL/sn{otlδΝ;'|\y% C鯓Sޓg @ 6NKWzӗISRIWT>>yH%\/!OOBr['7ޅ$^p[nŭOwx]XEtuH[EcAaqcy # #¢T;¨_iʐ4nA] *MJM@~__NGSnCS=P"^V!B:O 3LS:Z 9hEPA *F '+d1xAnٲe{& p2xw0Q.?e@vԲeKgH4; * < F8&^ _Νx҅\US.X Ш~kȑ#&t\h*%>@㡰@ \ve@X+1 j$Usx7Lc* tf͚5]fϞ70 K] ')se$}@.@witRmHshH瑏e?5J_K.[o%LhZ/-K)gџܼ\yn+꼖K^=AB|# P,:od1m4ܹiդJ 2Ω@.zyֶs_JRE[r@)3PJtAn\JawlMB)׿ڮjR?^z%\@pu)'@9<xn@8$|@ 3E9<^ՒZ{@?SN\Cĉ6rhJ frY .v~衇oB}CO;2nwjQ };2XHߝ-\y\( b3f̈jj4TBt'D3gδ1cƸv횳+b)p**/}8e8n87R#A8zJ#0b{\-nO<[γ_~.β~uƎkÆ sy̐֓'@1M޽s!=ŋ|}˦YM A ̒!QZJT N BPFgr>* !T?x[c]~h"ᜄW.,]TIuG!j2>L)?|KzQ{TB}t:7TTmW8hC90e޽{8jO;D{3ѣGǮӎTx{֭[P4K٪ci".l{;rƴ.v|.!X7'2{ >bҬJT#^ҁ[tkH֧i+aVBhG(4RǧVe2>jpIr9s=.E}Ul k9sǦuֹ)x/L3#jxF .L(wGJ<n*@0qttK\S`sra"z.r6_a=?яo12܃NW|/C}U QJ۷P#"ÁW#TZwr#z@ ӏwQG:]||c(SGHA4b0NO:3HTR;H"u4ryۙ˵9d? 9kܬEeuhgV^!}nN_SN9%6dMG?̃ p %}о[4GhwM۶mcZt$SJ׶"S,\_A$#@\ Fۍ7-ӫNQF9#Y, ve4ҕmT5[ϟ?͔i,ٷ\=bP9@+-  P?p{7c3%;8RӧӛnW^UHVYsOK/ZKJ@dTP5jI % `^{m\wuNoSo:裏#8-lwp!ip l|S%j tӣa@ F5(  2K'0]0t{tq]zB3a 8MkN`|M7U;t;cO>] aQKqs ЌE!%6x 9r|nwr# T0!Eiϙ31^re醙?Of=}t8hWb2)6iҤJ/XF@WKUpɶ[ڏZZ @@m%Z[[r?VFrr|sA ֆowh9իW_S$a\fė[n(s皦QN=8AH{N/ѪrM2o޼WjIs)gK>2vc grԒcM[^)*%`nKIssg1֟_-Z-gܸq5J%$ @mh&"ns>bO46T9o|ЏuQC P *h%~۟'7իO^4$W@L2-)'SOBijgnyώ;ƎK#~ۚ4ib{WrH޳-c'N4g},(1|de@S(1V+{wKU\0asONj+kڧ[r;*s}> a\[kJ?*X"tؤ7Y 7$zC[ng}֎9{=SD۔>GK\hzM75s|Rx&…^\陻Ltn5?/کSׅ!_W-z-{W{5G_~Nzn5+E_{?8ػ7>0eZd71%A?9D/ۍ7h>*n_.]CϱR-ߛlTD%ƹ<2h^czlӦMsV2 |G@N8h)5ǧx P}4#N04[.]jLNȷvJ!=gn-{{}/9>>x`SZc=zy|: `Jh>3q0ecqk QaK/g'oyfms|jk=3(1,qt@k|O>:fΜI=3<>SJc7tP2df5 fvxnB§F 5%$@v*T31-Zտwq|NTHM](~V#\]5kV K]Vk&(~nGJ%~m,d^X裏ڹW] P@}Ĉ3xET,ǝj/Js}> e)Ճ=hz Gx<~JIرc]ܥ^jr=#{"ӟggݞݔ* # c(h*P#/kJ'C)OSۣGq])#j߿+H]""ENȭ:FQb,g;F9}DK}D z.3hJ3V#M-G&o4r'C%\RQbY(%%Ѥ?)rHJ?"U׿K׳Ъw|_Z{_e)tSJҗTzXq;+|Kj]w <0]k腓 b[ZߡJO034T]3K !;& O :tp?Z۷]tEnx$(&I\Az|qN5@}LJ0' sr(1,cSʹd:U>*Vg2F{RwQbY(@P iPI"^XeqOPQzGzk#xr}h޼||1cFj?J3udƧ]̾°I+#6m8%bʞ0드_)>*za6ړ>ؗ_~M2mr c$e} 5R(ԇ(1~zk5v@i  } ėAׯ"$RJ\%ƹ>2D_t\bv0*#^,l{ % u%JMttSSh\+hdC^&^qN1?Yد6uޖ>~%$}(JQŋY ),"m  0}dw{*ky(ç%{%ZT N5?+' *c׮]mȑvI'٘1cAjN]vӵWd(2V^{5W>վ6o4Eve :3sgZ.˿/lvn[fTf}Ǽ(2j  eH7Vz1hۏ !k:Y\*^V|V#Am۶U>wqG^裏vl5}UH6@9V'PτT8;@qBY ^JquƏJ4lA:IqKCF^3pwXVןqw;SS۷OTW#qR їbDJ: ؖ>~T/Je-R2dT}ݗ;\34-%dFb]h* & #a iCL PMk<[6kL#ЇO@ hIrEA"NNShu ClAUrʥVz2 §Qn dTŒ|lyWX\$ɒ] 'dwEjM 7 xM>x34Y|yd @1JP}ܾ9ާ !pǦ?SH>Te]Ԯw]|Jo@$t޽{yf-}ТӪX={?嶣Fr?яm}}AZOSO=5H?@ V=zם%|jZ&PZ?\4ikTAZz)wJ j? _r%n% %- K@OiV-}nLik\>~֩S*U*{~[򨣎r˥~ rͨU 5(kDG>L_pX/:rL-TՈXeMԋJĮ8L(F5=Uk߮5`5­5/pJN߷ KT5\'?PyjθX?8!S%qLV4 !cd @ O?ԭ޵kWуXwyty_Bj=35ݮխt#+y45:tdK]. P*ԌRT@4=:9 %H^kּz-o> |:ZD`TOzÌ3Lz"ɓjIױc:T*B(5n qTA6nsKd>mV9@* = <-w뭷uL T aP^§,}rPVDBN{,At7w}cTt۵k ]NjNi%ld*99.wdQ}?5k֬F^z/]F<*ds9ȑ# ?kё SnFJթ St UOHns5aPo>ѳ+Ey j! ]W^y:,I\&/QS2BՔ"^A{-@"O &T FPYylea >!·E@Ő!CKH T0I'^r U$k]A:t͝;׹s'?9HKηᆴg3Ѓax=ҩG#t&SIC_}J*c|Exk*|rz5LNGz;G6uriKQ &^RWP=#ۢ\r_hE*Z)+seRG P O~o^in4TH+! @㫦_m}u sQZSe:aL>lg)A*W5yHU>Gr/-e}$P/ `,E}$PK`HBh)G P)|I78oߪ:{NTJG P||ԫJhHP}%0 ~Z ՚(E>JQqP}pJQux<]^T5kքUn)<jH% гgOӟޡ {@@Vݑ0|'.ZB֒9?%@@y |;n$}jŜFڴ|=ssc @ "jsAZ;v}{շ6 @@"zhi. @ @ :' @@pYA=z8sa $@@$^ K=}]k׮]  @ 8ǒٱFZ1˟g @@u@v.y-%h~._-ؤIҬW\qEB DFHj*5\cݻwwHZN:Ge @(haܸ+G e=GX\@LWICSM@ 2e͘1kܸqՂ ޳veXv&OlӦMsko 8 /^l+W~aW4k̽͛`%fҥKmÆ UM6M7Ԫβ;wn@sOElٲs9W_\ ڶm[p {qgaǏw0ay駟ڀlJ:Ԇ bw6}9v @E R#͟?~aGI?un6nٳgرcmذa冷G/iJ@ht%oU@!۽F4vZ9suɝr-ŬY/Ν;%c@9˴xl7i5kX6m]|۲e˴ׄuB4|C5Y+t5s9gLQ@%Dtc4z%8=Q;6Eu!7oR> 4(ԃ>8vjGBnA)E>G֭îkRէzl ;>v(e}®KTҗ0)\ 4kw~j|iCu@-W)Կ|4y饗:O"IiY8n&n}sB~]w:޺)O@)4N\bEtzARv_|y '&IH=dЕK>Dh<(MfRhc֮];;@ Ƚ)&M7oz+F$@Z5j4ݗ_~i}QOʒ?[Wz^Kw>=5l0|$K-@PU B }f(E}ԁ* EaRG”wo~;蠃nx+e9qDر}vwڶnJuD~@D ^nd~WDŽO^]ȑ#]]ƌHK~IQF9L J!SO9Ly+C/_| 4WSN9hYou N~]Y/҆''|Җ,Yboc5.t8=ܘ%M 8]#Ͼ}:x]vY^b@ H(~]zQ:ujVM7};_QTS*zk57lM%~Vyڬ,娳jkg_|:R=5o6JP K$X>N@MZ<#pSQ.KU7 J cˍ@'?#F$X2:|\Ydҗ)\ aC0񀩳'vXcK%$DJ͌绳§Gg#@FRQnz[Ht*;|.]J5ҹRY-U듃t/R g(2ғRj<-HvVe˒JH~@^Z'J~N@.^|Egd?uf)w>|ԥ % ?2*M5Xˇ2vP!ȼ=jR iu6R޶7ճ̹~6RFH+!@@y?iӟ G@S2(k^x: W" @ףGX?Ϝng 45"#% ٗ@Xe|G45OU~J[me`dn^uW(ѾAߪ~~TQv}>Rl\<}}k5+\CIT[JԡkkKT;O,)f3t@|nzmӻ+wvyNr$Z)~dCS3X"e%ШxV]z_-*/!` 3k֬Y(we\R㚪&Q /|zpďfm>z."mlJX饐AЇއ ~"ďn\venA;/l:ӧOk$վjBPG) F5jyYdJ\d O ehMh]|`=S]YklM`̘1n$w[׮]W_-hw^z)!)S3iyN:뮄k=X-[ r^j…Q+ɓ:\|7$B)V_4c{SjHL^Li W2zBW| F^'wpr<(,3冽a1W͙3 wDvQGw_9ԩ?tKi4>L<ٞ}XTݭcǎl;oNkW޵N" ’"(QߌQSSN1zzf=ENE0(*IQAsΰl0;=gzϧtWUwWޫA[|T֭@P "lIc8g4g`Ӽy3>DW,XVCHkdOԩEڶX'm|n^j^JrByYeWnЂIx?&U&MhTseb)`f"}Oj#@>z}tAH~ m (C9$(i[UA!0>Ѧ*h)Jb! ..(9ì -sU?ɫT(w( f+Vq?׵ѠixhdRõ<ԫj[G[4E|>agX)/Y-o%]UÀ~).~W]ZQ L%@ENJ:v(D ѣGÌl1Mn{D k)Ga.Z4O?L4I<Ȕٷo_93ЋFNi'u_&5ځNSW~Wۦ9jɶŗ,]UCHGPit4qRoMF+Lw1S %d5ዛAn"AQ4hĵ<_foIef8waʺ/]#lR)OƍOͷt֭k횙.g,@COZs/.W/Z w/8Eh&naqEȬ ftѲbbq*2mEi*ۤa Ɩt44Aݍohr"O2ԃ@p(v~R-h9pǙb7fx{%4%t6>aؐ2eôNt.k~TNv6l(?<\[)@bS~G!5]!=P1bDd3!mfO9 c}/:"{ Fn[RlX[_-M6-5C*1M8:Gcb/:>jQBl餓R>= hxRI3f̰ І3@!RBh~v|\V3 jɬBF(]]ZNpՍPj7#U w7`ЈC0Bh7Z[fT&lFn Kv7J%Ss4%)wIh&FQXL7ϼY-3fbB&J~)@~Əo;:ѽ L룹bDE fhڕ&>Sh? ~LhGxnkr+.:gi?ԟ}x\exƣJ׺J}lڦƿh^_W,"UuzsMM27*&V;WfT4h+gŊFiΣ Ek˖s\JFx;|1~?WԨn۷^7SiR%lyT2Gf^>z嫌1y_&c0uvnbhRct2J#+tf DMۙЀg̘5w4%2&*BEezش%iݺyHt 9fE{t9Twy|}oo^z]{-<,Ds={o=8lKO%?Sk=y4_b\j5` cيͿi1*z,͓yKdZ2sAm+fM|ш^͒= "GHBAKϜ.[|YD_hӦ㏂f=zEAUsf)Z#ĔBT+v~˭kC9' Q2D|Ph>Z,@z衇G |%>g5[BvOˀ FsN_P'Sg@سbhZ]ir| <`5-mbc㞌`BMh:1 vKhhkY`?/H)" F# >O'xlO4`7ty5j(:t}vy}]K~9A Һb9h v=B d/֔(ή'wPOwvo֛@1BxbR xPϔx%]֘=r7.퉛RT=D2d믿Z9zj?Q @d"|rp hD?|bł f+}pJa"Y\V021Ql3oF;E~W RI S:r$bE"ZIΧ2툾w­A2~Ψ۟ӡ`tۿOոDIDB <$L0@%U4G$> Rhb< ;QFojvҶeķ-qdݗm|Ot^7#2(a孬JoՂk )ǴmJ[:o"n;V`Ae>P-/j]&^)y Ӫwg9_| |6l]ַo_Maʢ#4h)ƎkmES|.I@x_;a$\Ӱ=QJ-?=ҵb+~12njMMcots'VDIZj]_(\˾߷~L>1:/Ζ] Hg[Txk!T#hbqhPˏmt^TG]t[G! ,Zh!w 'Mh6hm;|OyhI!z>DJd=U JNsHf-FI]7n(|B>\֛ ppRVfn*VmN"v$l'%錣EV>ً! Kvif< ѣGˢO>vK<>ȣxVK ~{ш)7@#=ж9a*Se'RnAmrac&76Kv^moԖrѳ;;g9޲i;-xNDy6^3$  }&dIDATB1Gu*'46-K_fHi+;߂Sm;K$Gb@of;e]M~yЩN/:twAڵkg͡AhWyO z% b1Ϣ]>X(+Д4`U9G提A}@uGQpPJo%]x?Xd u`K=xR_Wd4iԃlE#m*'6®zi6fJ;M %&J*&}H$;NI~xYL|Vԍ_x9ꨣʺ-k8-gB , xPVZBi?>%\`̜9X؆D|x?%]ysOt~cLyu uֵC}NuBw%/B$:ݾλu b!'mChW(WJulDH82''4eV=erxr¡3%zo=yh7O3qvqm>'$q/rץr[[>5 "~ooYV2 zU-9\@SN"t͛gct{ ߖN:yOuQ_24#}m`ݾ=a~~(:'ɂ20I)>VHFV$,B)D},&5w,5ZahfO ڣ۲vSB6Wn>7]\d<9EҰL`)Sj FPquO ;ә3mB+={GthA@W .7ȑ#;4x>c$ܧ k'K&0`!!bUɘit1ʺkb:Ovѓɹ͕ 1¦IYgDj,ޅ`.jU!.#;ϕu62d5ej_nM0ad{19L|x@X-4+ΖyiٲeV~)om+!S^~(>SAߎ4 2RE 1/\͙*XQxƯH, ܳĠ~)su"x͛7wl' +j2{Ѯ7kLfϞmqw:A_טYϏBBH].fj}k\ҽ[M<p fw*GrD]C-[YUA&LզFnI=H]S`'Q`@;TUYu'c0ef]Yԕ[o&"iްl, \6k̷+XLd@^|V[Q GL? q/ZIǺ's4$0]}+~7xɒ%;=~[^~@#OSq*}Y9sfDK!CRQ}п秤ҹkh佤g}))Ǜ ?"Ps< FHiY}| 9,̄9Y$<"/[T'olqZZ6ZkSfZL_[~SG~1i.bT&>Bȱ9I@yә+M6"qKT$GZ֝O6xxQ~bQ+f-SO|Ј?@yaɷ~kmA8 tV ty Aky[ȗfU˼%Eh'oCvEõfFt5{yK&Wc ]gc"lvkY586C!U֭_G;`$b+?CvjDQR!+TfJF*5ʼngh*) (4,fCcXV̳ͪ(JH~6ą.I6n\1-ݤ:iZ2}_wM Ǥd^WfS KV֐EF\uƿu[U41ݣJPBڵZ;L(P" #ct;髋/خ%鬳β"dWiO<5X^2SC-5E0ź.P0ЧP-_FHY ޏ;'Ȓ`ZdblRAfϓ✚fQNM1(>qseunmXvɯhH7Kڛ~Rf)6Ve s#ѶmlޛV0eֲ͕^.Z^W&bfr[~~ۍs]hն:t"ƶ1x'.cHU0SX;Z RP6_: FeL{#CTJ2HȟM&:\F$$,<?h-Ɍ"V9?LSa56AAVI\BB("c"4~жKhKt\7$V,qcKx"yR8bQ'ӆA 049~䒭[<;AJR佃Lנ=ۙr NA=xLE!зo_Kh"[hߘ!t̙w;ԡzLQl$"'2`J/C` .!&Sx3fu<{1rs^<3 XW0JX)JW)gcs6l|S BRQ [xꫯZ7eAT0ѣ~:+{iݭ=vzW\!GqD\y ?džŌ/,!0fh5w_+.W^}0 $ Rנ <7 YD{3K#\Ś.nqt&L+ԃՇm4 RדDID,G'.⎷l2n$DիW :g%Cru焆~"zB5B֮];+|ZЇ~Lz3 mL`(r1x*o-X:!CI \TΫZ"X}N!젵dA.Jm1I~"K\EcA`$ŊP+O@YcJ칱M0dvKtm ш" lg}ֆehLOg>+ݘ A=ܓb5E !А'$!2N7!;e5ڌG֡TP4VRPEi_~ŚaA;YB.Qt,xxѣs$Ğ"atv l9Nv0"PF .` e!+@ &<<xO> HWa6h_3!vng4hKHkT3#mJ>nڜ}4Qn}usЭ"(>~W& =n \,s^^^B"d%S<Ӝ!;ބMMۖP ߧs:y.G,iRi\ł ^("( '@D+t/4̄$N,V"("( P{@-<yƌ6^2#tR,.~:{ QMfj;r:r?~xLb}Z.~pB:ةTGt^A4ɓk׮)]'qʎ]4w\Ylt1bmYhJ2"U/M߽-N:Ͳe,X .i0!*!oͅ&rA{dY~sQTI&Y~DŽv߅&N}V-]z MDte>#]tʺR=X CozU| z"("(@"h("(@"P韆n.AW{D\@3(E@PE@PN |'ҪUbSN['a~*7o3[릥QF6Z4.}M Y-a+-6lX c?EWnO6 `ȻܲeHQ8vX'5nܸPXQx70EQ.xb'c l0xywOG}TXBIR=-Y\`N'|R?xF&L+RqAl cǐظ)#F1c Ců*nӸPٸ4i]{r7ʱkIl;S #$0ڨ뮻/.BYǦ);()[KҍV8x`*R~AEr3/xa9S8qDoB#gl)0K/d޺uka^ gΜi>ӧO/ׯ_ѹ뮻 {9{03ΰ#[3Џ;a|~# zj!d;S.lb^q|;o(t~exkAun˵ (SJpzt6Ҏd.kq$~+уjժ%/3N6PN\rJVi)}<&Df*ӧuYr4V<iݺN:N*.۩$~7c]rS0`4ii s`jLrFn[o5퓭AIly"dhhܷ%<׆goD2-l4o³17>@q*ŘLAրӈ^m|XJ7oYfEV(cښQZ / 8‘ۅ thMì'073ЬY3޽|wYh¤؁[~>Y^1yg,ع('amk'M~zVij˥1cсxy,`?O<2 Lc}3sڼ<\Ϋ =("("64mjƊ"("(P4*zNPE@PE m6h5cE@PE@PX =("("6TM"("puW_4QseXP4-VE@PR~]UIH'N4oE@PE@["vTM;Z@&`:H3f̐{OU>p@,{ŋg!D''6:V*D]:#՟>} <'\Gm[#"(a@_^FG:uH߾}!Co-|رKH.L'O>vQGb9N3|Grʰaì_J޽夓NڷooPB,BӦMa9˗gu+ӱ"p 2j(oaE@P‚~hBܹ\pVxtG8τy߿ ˠ>}*=z 6<{BJ@i4tP#'Er)o;SC:tpO4zgdOLcbrr̘16饗^*{QIP0!pW_/7t駟ngbW_Y!=PoQϞ=eРADڽ{wwnP N\A"_M6-:JGpBw(ժU+as1tR3gv?cmn8ݮnE@֭3>Gyd[.Qӧ|Ҷm[+l/7:ԩз?ޝҭ"@c¢'sFڵw:Ni֬Y 6Nڵk)x^[PE@z֬YcgnnZUT)v88q 2- [nrJwj*_BoTRJC@sε{#iv=vJ" Iy:Zd|ؖ~nr˄ fkvfϞmߝҭ"@c¢'+hgرcMygWcO;`Q|͂m"(aC~_#Gʊ+EC&M> \Sg,T‰EovX`.B p-.{-[B'.|A[aFp OAd]8˕LPľ㎳+ٱw/IcBL4xlܸ=]1[:(sJ3w*^=*T0#P^[_ /t{b ZFh0}#:SrVPlG[ YUyI#1~)>XVZe ^t ^E /yO=z0N=|pxJ"ի%|[ŊBL"wSI).#.'.b2euY4E@( o"|*)~)xD>= "("@}+"("$ڀ&ޭ("("@}+"("$ w+"("D@P劀"("(!hr݊"("(>P'`z"("(@r~z"("(OT ^("("*&ޭ("("@}+"("$ w+"("D@P劀"("(!@TPٮIENDB`patchwork/man/figures/logo.png0000644000176200001440000031755213563226762016172 0ustar liggesusersPNG  IHDRޫhiCCPsRGB IEC61966-2.1(u+DQ?3bҰB~(3 5i 63P뽑dl(k_VY+EdccMls̽s>{9s.#M*{A;V?SG#CLP(HqKnGbU#<fNxB83o hآp)Uz)pM/b-mR9>=ߣ*OdgKaf?^&# } ~zdGB5Xdirt"ⓢ'dfXSW+9dCՓmu@|mж.z=_|ـ˒߁Mh}0bf Ur'z Qhygs!._u{)= ? Bg%i pHYs   IDATxyeU-wyՒWe풪]Ŗdl˲ecc0`#i:{g`&h: `YllYem͒j{UrDcTFdd/w~gs`oH|k:Ifٲ|VU|;nq—<6r[緊Us?}?: ˾DZwu|į幮b|[{_۶lk~_]*V|t͡ Bwp &+C|W7%~>PE(\eOu{ճW|o;|zV7ȇwkCW4_y?l/?Ck_Q_QZ]*P ?݃5vG|n~~oe+,Ϝ"+`^شKǮÇ'sn{ťyϝwL=z/E Z*ԇ?x W:ѣ<&C_-< [,͌hPP ƼLx}塿~{?R{H~rZWǪ~'~𾁑_v!~eP;ț7Y:ɷˍe>HsN~޳?.b:nzq9vg&?uۮ>վX׾z׾GϿcy7__ɟbd(A6`~8㧎ѱ|a.PNEl,y:~౧f^?Y?rtۉӧ֛oÏ|_[z®1=s-(γme;{U1,5h.iqqGg, BPYݻ!| ]c;%M;|˜sh6gluGxً}kVX]) ?F^xJ=?,)$_|Ye̺Xw4IWk'_Xq lm"{B+{a~ag_xӘM{{oo7}tbݢU2?Uj8p}Ùc` Ś pݰa l*AH(2RtU"%lL5'<=/S8x]kYN{76k)@ ̇{|'/m}cU_ekW#fg7]7u*@l`Ii5qjXW*%!nBs wݐTALjٱnB[x@HZ︍뮺6.{ϑ=w]s3k^?VU[M?_`/7 "7A`ЪBXŐ%ZTzJTg8 T ݃0 OSI#\w?s_΋o+` \QDHB!BBxRqtn t:ٹkdx#N/,~f=S'|7 VU #)z,MMvQ;x3+.MR*UjWJ{q\ fs FBv13*mK8LKP! Kq/>8x>>{(g fwzt䙷[?;6=255wb>7V7TW㣢­j=.AL=uA4Q4qZ w mT!N ˴l hCzh3>K广#>؆Al⦁+󴝧t3b[8:TH#TG_X6 -$lFB@ָkxq8O>VǶoxێ?wL<7>VV6Ns { \ {upewN34:( ~l\ mgtm.@ހJfgcl?n ֎fz=$s=;R |]J!G592!س?yzM +?=sӺĬX荊U'dǾ/ vw1Fr9=0" A xezO| 2Vm4 Z+<+29D֠Gu.<ƚfoRoez֍or5QN`mwjZE<0$IJ\yH EH5y #=6Bڗ#f[Om0=3ZOw=r~d]ԸA҅Id:8i1}-( qiJ(!~ : X 4j ޲63=C ^ g7 qמaʉN/̓w,<ERzbpdEMN l6+P<ITu8ÖxT O'hP9 vF%R-Q/U;9癟_޾\̞][mղ]RuϾz!>na á$2<_ޒBl ɘjw!d -h.̍#g=:̻`A-Ӟ7h.)Z9676!H"4A9(hmP2bRZvOt50I<͎[/[Q]1yJVE"Oa+u׬a('"5$ZH!09w,-qri[9ʗ4'xə/035iH!R i-Ț&y'CIɺu\o;NfS{-7m&&W +V{#/?;RRR1BaqH"\9zBB Oa-XX 3[0eMsݥuyI3uL+'og\ e$]gݴu6% 0"C*Ȋk -@)M=JH(H&y xj,w)qsygΜc/Rt %$!I*h` Cբ XE۶n`Ffh6ڳ_-.۾}g&WoaU_T>r˚$~j"H$uޗ1!!H+)yn(TTLNQJ!$oVOMӦ4fݬMq+d&c1H)Bi4FGY3](BXLam(X{-B* "*-YYN5z kc|4_~0Űy(8F)Pt:;* : ( 06nub~}[b;VG话$;ǟw_N3B+9Fx-H|)) g-TtJc,+ lj?~n Gd SNJ,k;hc Zi8&U?+%N*t" &E'o7. zM%{Hi2ye~jQ^b 8 U;r,4=hR"ETdDqJ޽}\пmE% H/YA)qc@Io $q@uX^@}n 3i8M(DqԊBj$%t3?"|1{N7&x-vpûGIk7vy~ XuΓg98%Eg"0Rc,[dZUCK`/Z<ng;6֑G4eo LTG&2]cTCZ"DEro>0C KJ Xi ɻbwCnFj%A ғDfyW1 iLTB.kv!UVcZK,vznB"ԥ CjGEk$&fyC%Eeh~'$9H#$SƵdw5eoh>ur?c4:ާnq7߰7ՏΗ'(5/f%<$2 lZ+24(;IOÆ6p9JQ>#R2%CyuND)i4Lc<ο~iBHXGHBEVig-K,.׹0f(cMqoX(CJAQQ:&F&iCHv(|(:mVK3y0D(u0$%<›Pd ׏r貫81C])j5a-ZK4O1I~T`+e !=i7kZ\fqU3LyϻzVK߃i0|Smm_M?}X%o^~|C\#dΠQ9'{Ґ!J7۷sG?f:rD¢ogEd!KM.CQhhXOsDZ!Z-,ΑY,y֡*h63S=g-pDe"Db)L3v\{ͭTuT6ϑ6"!Ax#CIIݶ<{j%<2+34xn9j=t*' YV[)ISL7d2y|`'kȡ??We|cF6_q{yw7I#J/L4Lj&1qgHp?Q"mp G O@x @϶qU=[$4yhKtLrιr{\ahrpX[ZYg2?ߞp T5VHy6G I,(!0Πu:dcǦHK—V !,T\>6סq8vHA$}C+79 *}Qlшw|6d{]~ϠL-2^J;9}w>s픽_:_{Կr6ޖ(D{M\בB8XȽEzsIZ.Wrypl0YC*uVS.yǧ&IRй…) 4;(6 )'PBjT!Q 3]OF IDAT -,JJՔզX_`nj3sO.jw^a'H)IH,IRC8sk;vuvEVt鄿|ٱRxH}…ΆD˲CE褂vpmw2=;@A@-5yDZQq`]  _2G$wow }/zbn|O og"Ϲ'ˏo%*lz$zɄ yGŔDcR-'#yFz5(΢$1P9G!}"AEx Me4l<StHyPC_l798s%2 fhϟ>#)W;Kf 9{)C-8uN ;Үjū?8jq[b XO#X)[2X [ ;DTeH2w7W~c\Cdps/oM,<8[ (o 8?_@DqjIaK7)㵨$XmQ8@"P?dZց}M(ws;$ʉ%S,rlCJKH\Z* )B % zXhL[&(-|4<"g&B *"$^X/x V2OO_5h7XY^?Bw"\c%|h҇DD1և*&<e "$.` Z#mNM3;?GmB2/KHX{bʕlatXk. IKsd{#\O^XskߙRpɖ uqZ}dZZahPxtؠE )-ص8"2,M]0xKܛ M ͹ R6c ٮer4 Bu@A-rBRd&:f3[O13>IX 9j޽QB%xg{vAQdlK:hT "4ICMe˴+p$aqRRxJ Ph Z)VHv^ǎ=r( -QLrDR뗀XGIhJd-UnBrn)oc{D3^e[dltc/V`ߦyv:\{k?~sњqҒ5FX38BYz+<*|*FGv_|vlFG٠!A-FxÈ#@DeqBhSiW@{6E33'X_6<;ÓsN?|#Ո^FE ^%09 Dq  HJ6P.^ \k%Bn6eDu5뮢JLOh41@#" 3FKnʪ0"Rc\G8 3';o})&i?&z#pʫix 6ƽo..(q[pɎ DI| IIGR U=è},Hr˚$&H !, QNƶoʟQvaa R@ "xEQBUv'BybBnyEJ 'ѧ^<2EkaB uTgqa"InG)Ǩ$JjgZ9} n s-dE2!JGerP{ّ e۳M O( *J__XOp˓6R_YF"t!KTEl4Aĉ K!W$Cu3$}6/u9N)=^$u#=#rB ʞMxX?ȷy |T{ysY_54F(BMH88Wt8ufǾ<6C MO<; B iMHygf!`GD@‹ХÕaLrc+9_:9ů\෧;L/O-q1k-]aa6lFLO)H r4"r;;I>EI舂>O7Ŕo_ܬ7薾Jw%{6_;3s^~L]9o+dYoKRIbT@j *LZJb1M6X>5Gm1u  ]ɩ[>pY:,*|[6g oٴzbX]Q}(5V Qt2B`CU: ~Hiy#~ܣĶJMgPU)(Ȃ {TZx J'(E B.`βk~n6;mGU0BJ0l͚<6 E RcSdm 5o/4eӠ%-ԗZ824IBbŖ4PkaQr.H%mBao}a#D&CPʚly?*I/ 4I䳛L-\ ]>Y%Q66ڬ5d }#yM|N,.[xM,5k]7=. K<`Ÿ?M@#ۿp]w~W^Fヒ=O8N9_x{&jHR-X:v;CkM/;*%zHRG"yeu{oFc R))@ HQ&[X%ʊ(RN\I*'V)#%:%QIC7 |{珵I)-@{{瞳o}NVF C|18~:9He+woSR&lM'#1IJݽ9`%hhU``͇2E=!TH!Q7J9Mr6hVguo7`7:$ O2J1()%joLf{C2ń& 6f-[DFvy{[rZl_DE3kerJo+N!uQ _nAd4bqc-I3V=Sj,YF o8`K6>8\ӫhmΟO?`#WoG[cxxkl| ?EV1VE*lFdJlRJr<+AqƓv<׻n~s~DhjC5bMؽunKnΦ~M-&!WuZLpޕ]b5AJv`X]P{[Nʾ^r(䝅1[}vK1SȠQ-عnV2sSz8hpD0ȗ&kK 1yṟrt ?G̙{?xyȣ-D6l7m6T坤qE!k",A.!N@g0J.^<5_ 1t %fƨQs4ҁQhMC#_ (z^p)Bp&HI?#C ֨{4z[ۦT؍_g#8K+Z`ED`:08e@2z⿄nkC3VvN^ϛx|,O't4SϔFѱ]bCpPp,_+:bI7cZ zgя|><=??ajB/_~7 ?7Rsv%= q|vK3ܥjBi|M5Ʉ#V8~(ۑ;6&#ZM/kt+@#ے5J぀"r"Zee1wM JT8fwM~Fz "K|Uʍ 0)Y5(c %Β&u҃:;Y. \$3qjгz(0mj (=/JGmM2T1tPE{KBsHm%qSv#{,#ޘLeq6[|^Bo,1ݦ\&@,ڜF3~9pϘƊiz|\ ?G }&5*+y/Og?{??^2޻zIsG󱤭=1`2dnTng-n ݢNtpրx̰ 9~n~pFI*ԁl _ ='rm{W`kij"FnO\O148j hMj!PTLKZ ZGP8+Z8FwTbsIC~)h֎D?#ߚjpy%wN}^gG>true˿GåxMç"|G;+5pC~Kzx-~9iNC3(&akOg^ Fl0._+Q0ˡGB<_ b-CdKeQ(&zZ.H{> IDATxsߦoS^9KD^b2@ 4 %a1PcMBDY]nLSDw'uqԿʇvz] n5)]}C|8 ʱ sq7NGAj}a.ಅMiȖP&FkN2"Z,3L`'2B'o`pMNGdUdǮsuX0=SbERxgrF눾_~>ɇxͳƹ¥KKO>?}Nm??#;O_[1Q{i$bœ0TJaQƔBHQz_ 16|32꼭MsFXaNEh(bD#bzc6O&8=!`Cƛ0ݎDh*=yWB<ĢI WD֌(uRWSpv.t֎{wzʥ%m=DRR0hF)5^sx?z((+}z3>={k?ٛ'_3- ?x;}-? -ɝ;4W$}ךjˍq>ױ;!WU eέ]rSKߎ0[o%lJįf"JZkvVBVj*޻a:$/Qq(NE}F;؋oސXװ*Df j9Zk;d8:N8HAwI̖K֘=*GcLJagL Ddp eih({T)N/ŹsÉԏG9SϞf6_𫧳ynl\|ݧNzeO7s/8|:CVA߻"noSi<\\PLg5KfBS7k"Qu[7Vq.680hDIY$  #"J[8b8V`؊D 1}̢vut?SUI!kdy=fD}lHDQ"rAceY[ϧfk8 b(5cԺт=I8/-vm $:YV` {,;cٝ`Ghdi5!{&w[qRX"j16'0y|;Oȏ09WeK[[SN}Ϟz̀у˽/?_zqq}_間~D|x=uِ^kSmX6fܾhSxϳ a:eGӤDIܩ2Է!v$=^9(ċΊ2, R.1*7K[j MK#c53eX=(UUdfa,Z6YQP3Q<܉u1Vj}$dZdA硃fbmo 8 k0%A0hrR0N 8kKIPY@.S]}QR#pqf \rG#6Ē˄>BeG> ?yk{ͫ͋W}}>_|mW?eo+S/n(v^;nXFGƦ{j#%VʅQԠB{9Wn$f)lށC'adyKc\9Ac\;,}0,ik,DUȺr}]j"lb_R>Eˡ2iSs4QRS1N"6YF˲EKG%s1۴yM6gVKqmV[K<mjFݶNkmRѢm뉬h%1 sn!Z9K//[p &VF߼YcT-fmyOW)ziVQ[͔5vv7c2 yßKH"SKvP$K#d]|4^D]^`.VWO|w: =kٳ푇:>;?[s?Nv}ɴm,uKO}n?}>ܾ:MS5 Bʍr!6|ߣ|goyp^-Zc&;j{hd$/aX9$aywrIt rё{-x)($l, Jp0._v8&=ɹFUiI sHɹMCkF/"s#鴀JAfyD/HRϵY. Y.}adQS 9JZ"z?VC )eub*/mjybN)pqâ+>)+ .b!6.bHKe(z:RbO;?΁Cl י<88#RB^ +b鵈 1..}E[v;?ϱ\7O?OU/Ǔ= OG.<]9Oΰo~kWKy&ũ7kK_9x}ӑLX#t:1AKL(RdךKF._taR%+onۃ7K@i"\ ;/a%ؤaZ&S9-~#){s2iv.r?tA>t8`2juck, w#7_Ik\ SD)]o7#+s?E͗VO7saoGU"!}8jLy.@x 7w i 7:5*4hJ/Cipr1fUᡙȍȞ~mIYdMij)b:Q9YydJ?&iI &I>Բ,s)cvxRƂ]&z2̟gdD5^@T,h@b[ ,b,fMH\H2 }ᏉzҚۑ;N)V\zKƧ$kgFiQQ/d@^xx;nk5rmC@ٶ>&)^F _I;A$!\YA}cߤ[oW_4k|rf83<~+3xa;zFz5v+Ig#bh`ƻl tOJkjo13`YC"TYN\Ws* r/Q>G;8ƶASZM=A) 41!jTu\eOj"__7\v+^ #FFL,Ȍ;jL5R:{u9=NXp0;ƃ3iKl[cee}y %&z[3/u0@5jl=73$_[r@%!E=7D1^e9[TrԭN3F/6Ea:Xgo^¼MӏQLF뵎dt 6~(K --'%7ʳ ل^κ,Wj-pflzX6ʷGƂS7 9&\0 7fF33MQI%}S0LίijS[)plU׾b}ը#hFVLG\ӏb_MwN@gUB iV ẤvPV5zʤ^lt_q昧Nyo\b﹇p`M3t15:ΐef͘΀7}0X^" _e6+)WS:x=S^yk5Bp#S4KUyޓX0ӉfF>r>\C+ɤ4\N=/2LB@"n/+JKdO|dL&u"ߝ"iBDHlЕ&! AUʐ&9)_D ,\)}#G,FY 01=Am6SU5yʈ8_Wِj6vkfFF(.hTe'bSNVFmiK`^жX7X Q>OFa%4d 'XJ9 I.g*ȕ5T:8U$b{mSrS|nCˏY{-7X߁niSZH8u4MF,׮ү=uv!㬢wy-A)Иlc+5෾yC׳ [+Q~A=m6n>yhDisevN^˴:D]a16GRIo2d^FZAbh/{2øm't}qG1-䥼 }1| ~g,kRk5`'ܰ5hvzYnd8ƭnG*O4/+=M uWe_-ٞ 8&2YdJs_'?(e2"<[{ &N$hFBAi}%I-I#-bkqFk DO_6IT#ud $hG }e?Q"D53E.%h @ԸS_ſz#r/,\jFP^[hƊϕo$U vUny #jLɵ<7 ٓqxESbCYo<$`7gTMECp~=l\I?Հhl]"˓̲om'_ˇAsLh 6љl;٠S _.V;"j.ra"{eGPJab#Q.)1tqBTd6C1&/|XE52[jVL5#&&"ΒEmHUۤ(V?VLZNBC顬ե QSY8zU{Voͼ,"9Rn x!xԉؔk,f"򒦩A:ĕVE4Ĵ,3hb;4sbd=c?:/wpDizcZ9a1C4k (=7Yo3R9q*z }s ,^̹02c^\x%܅!Ǫmo=^m^W0+?ɀ1,׭s N7׏?TJ,e鞀Tѓ_xۧghMow!W ! [[!7P@bMBɚ2IA GcسZCcZ+CN}Yil’iFh!fb6I4jz 6X;?e -ޚ阎82,URBc}ɰ&ӗ^_gמcO_=afpXK&T /}򻸘{۲eJsU?'gʻmjU,s<㮵eXl vE6^<$߸2R'}Т(hF G{C\m}^*P:sb`lAXwlc}(.ɨS#3_WM"ۢm_%1Zh ڂҩ5ErAhv{xCl|!Ψi*rND eyҥhoU*:IQ s*(3jY(Rgf!x|S#A64d)uZ&h;S\7`9RyyO(({'t Gy>6]eg7 9.Xb׍pM͕mf*W/sӥHlasdˌ\_`JWݥ%N}4[ j6~8gs_|tt[\߀KȦ~2 Gdt^voT$ieZ"5Oa(HDISN 1h(f5F4UN#@] &т>II2FZ#h ]D}Q1.S#A,]Q#6fH%VjgiF KzSBckA$mtqE#1j= IDATжHI"11󘋯nF0)4jfa} >Ž_=>e SiwM HfDo,XƦbr>YsGy_[œ+91b?v-;f(iZ^x6>eTBe5pj]3si. tʂ~C)FfS 嶕]:(=:.`ջVVWvWR2z\DxkyT$ "|%ۦ"4WO"8o`cdŨ _h+ 74 ̯FL-i`ɒ -CL&@~疜Kz绠.V~7hr@TI) y6C6>uq=%Jk!*áGkudhTm5Mlfؤ=^\r?3,2~Jdz.w4t}ffNGU`ŁA1xlMc9{}}=?d씬Y2 ݜX9]Y垼+c-~\@0G Z8+ z69ٮ|CghI}!o\,ijܷ9^;6 m mEkFgGOaOݼJu/1&sMwd} &/( Euo^m1Bh&! r{0z`#˷2m</o3~7\S_*Y^~2\Y3wyG1]S=gw/08peb<,4vw 6tSyd_&NejAkE|К:>)ߢa*,AmMfսk1jAGP*Up&WH>R22 M5;jpkea_Ze}+d^8>3Ǿ b%$^T gCVI JN 4$ MbQ\zsmGiۘ&֩I-}} OVͨWoF9"W5mu7Ͻ-{ ~(k}-DSX7TβpCOl^c5e͔:йkpcWeg 49zA,^=]>\ `#mZ+:r,,w9?saxwtcyRրPS%A%4,!?[I7aqpƥ ˘K/B/s0c,L'c!!xۗÜEs@ed/DbӀN$$Eb" ֑YY^ԲZ6/}b`/ն"f8c[WAqO~DxM=-|5U!/ҭTAQieŴKZ1D07* qNDKCS #QOU*˜MG2*kfIV;eDc-5niUE0S nmOد. O|ߏnX9ȡ}•.?!wPQg*v˒?B-l[d5CVR-qJ>ƒj2= j&Zl18^iނx@ząP1h%1S29@^X_MEH%vQXb[B^HH #LZFs.O'hb euL4`[O=b42e0Fyb5bFV Ĩ\ r JKlP!^ւEo.vE):-RԆ%nxGQg`L"הM O?{=! dZPQțKyQꎃ3@=v.b k#!MBpΌYl>Q\hL83 QiD?ͼJxֱՌ=~(0qtkˈ3^&㱕aw<¾n{;Ĩ5 XzvM ʡ !hus ?֞ )ג7o|![%}1~MRp:RWR#VR5_ͨQSexhEАeF1Yb=A:edeGִ'EG p彎>B $; 2ךKL R4>kQ[?R鐲u*kn؂&Yr 5f1ELɩv#,kjW30 n1]J,eo>sUXQ8~LU\d+ g# (z}1꒏s̑sTx?'6jaX HB{(Ja#(-AƥzN"e$ڜIi8z՜lsa:'8"mG 7aoNZKT7$¾"xX{ICC6S 6@*CQF׀JCbfDH@&6hE'|k=֦1n2jHꒁo{8h?Fry*O;Ll?_r/Cky\A=І_WTt-%V<ӠFm{;iG5~. s4.D6i`uS9/cw!SyN3 n8/g]ZMcEYPvsVWJ"ͩ'۞jl8f1V`l,2/1}^;Fb$46;D0>i}M- f_ڋl Y FK@ 7igډ?:QKJ@3ԳMy.t(m\F̴Z6Ab\fqm#F\'FȮ2mo"Z^vZ6;<RńpL](6j_ AWQalRhIqsx)bDyԯs(X}\H 8rf-p# &#^ƃ!q~t^kS ~lN$< dD+\4Ng9Lk 1ǐgKz.u^l,K(E u,95'ΦLح n٥$wsJ i8jjWm[#icΩZQS,UUR/ɀూFVs(-&V`"Q]0 DŎEgLF662։VQM9M[ccs=:.Zr]r+཰ߜz Br`^p C2LDa<5F1qm=aYQ^&sMHʊT= A:yp!/1lkeoJHl*[W[դM20fznMKkLC7N&RW. KؒtL˱^ܯDmNϊx D\Q*Й8Fy pi++^Gqb0yɷíQ!L"'B#1e:75.[f68hTW%BMKSMC'pU,Ojt0xopYR1g``e7# x1YASD51Z kX8oq3_3$!HDHQDIto6S=+m/(yh\Jlk֚E-k>D=0ȬQ:)Qևeq)fdvp 4M5e>ڢO%4Һd>ɐ?Z/3"L|FuL.rR+l7.ϠڷPiA(162{)u c Vh X6IRO".FEYȂFڅ!Dy( b1m Mtz\R+k{yG۲g-n\hم'L)[M%pYFT54MCz 8`p2e=c7Ap>F(/0ͰFg_C1dyF9E٧hh#M8QW3擉Rv 5֑"Qr}b\P +M h͵X5c0n8Z%rhS֑eDke_>4Sj)iO-+q9&/YN4svi?rm&-MMβ^1!Sb  jfdu3p:pSrd.ij)Dmok .4Az̉&sN;'YG#Z2,|馞 74]#:6%[OuwʅL0㭧;2StkѰ.'#Xf~NQqUa7ԡYhJ4j/V |mC$ʖ-uXZ[%/zTU-. ړ);]ΌCk];ڥySDTX*߈rDSS}`TJ)(+³,ˉ!Ck[ E/4 _Mb-EQIiZxQ/ȫARK;|>j+meB&6B Zb1r& K06`){4Ոz>EZ!:#X!W\$k="0jJa!+LjZ!L[r6IN&!Eڰoj;e%>^>PymN֨:LzMAON "[+amqw{K^ȍHH@GhIFcd{=Y^-a$Hb$ sNjukнw=U{o3.雝ijTƆʈJDk<#hV1b)֑&qHSzЁ]qJyUx V8i`&ei9S3B|RjȋȉF+)!hpHx/W 61Q9S76+Ѷ;j P)}0nĕ9*cy md kKq0{Rz%! eJŕ̚L!,jkpr)HV8EiMћ;3Fޛ2*(RS?J!,%k)s@pUVB6V 썯 筴J@:V;TrHQW^! n4KI;K8YM;/^ARI e ؂YB\٣ZWkn2#;#(TyW"hb;WhOnK<%qcKj{͖?B{"+KZQ:k1>1ѐ1FS2nS%1ӌ%cEjBBwBfl[*Bֆ4N1&)C0I ҔhBcC+r(-K(A'):nUUx[fB,Pf^9c11&n(i Z_EQ=\v)9CY깘pY6XIKhX"alMgpHb]ݦʥ`0I(|F!S7WuE `՚GvnYH5z]Yʸޤ*C8W{g-K``3R=~^i!x9E֡80#J4EwZS$Mt$JNm96xW1IZ GإozE0@+šULy*utz ^#ѮUƄ6Z* 1^\儀(Hreih˜^R4} Tu~> Bk#&ta9ږ"'u_d1q 4@X//DS|2|j"bV NPiEAV8U, DA E9\Ŗ]~8sP8E Q"7L@Tap&!jC6I N2Q +0үA7.g-q [0px0sgר*=L.h,v=(̍/"SL7Q& ƒUfbO\Ry\"klԡy0/%2(9 z4(՞,Q8k)tD'0 ں˜G=i>{"I psnQw[MLDO^:J"MyRf*3ʚ9}'^^[iCo*QyEBf=J~:+ŬK+sʬMQ9c}Bk!e"L3P@ 3K]l۪Q j1d])+a+پ1U(V GD@v$MF?qOf\5bWu1@M0CQP}m2{Av.`+Kᴭ U|B[[W_T=n~V;z/od6hPN 'qY-ْ=R8itLFHm3\.+Y+$`1ƕBz0̄8Ce%IzÅ.uP5r`?YdN҈RG#ȜSV3ۖȗD9H9M %%I (t}1e֕JEVT 'زӞ%MSZ F6-Td_p!W/mXHĕS*BtS1 m ח9\ޥ,AWk)U;0?Å_d^ +($M!FWעgB \7}BTݲ@Ǩpgu(jb*:k/K8EM*emnhw b+mȷd K%eBZcMٱBQ& t(m7F֐r^#\:J\Q+ 4 V(9Uy"='_|qnA IDAT4*'rDR8r]hnzzIwI8fyZ BVkףbc$y]Ei,b|,I ]5 {Zc.qGڃBTaB`I ٽ rWnq{V{}UXNBYk%Ζ GnZtT@1&+%c 7' AƕOeتh6x;ڒrYx^ʫGΓa®vyT uC[-IFh!FH +:9̴1 󳎒UCy vI(T='#mÖyk$d q)ynXmT=+H);_q[:lMY[#΅ysmmT1Zl4ɋKW1:vFҢ0$,6/@I[.Tenp;߀^7Guq"]W)ibtu nK'.vVcJE8?H,u}q?6BI4b( q~&,=wgeL_%QR%FWNFzO=M|뜽xvͱZ,2WMFd={d.n"qI~+ U4,J EBZkHaҔ}q7QX9&$Wbn9Qnv6,J9{4V;=]w /}]r1˛ IZQy֩iX,+z+q]ʼVZUŝ~*\(g._r6rMqxR_Rl۴ssO~K>S[We% Y1\?wyzVAįM$~\Uk,y!4naDr)N\H |y _eI7< hdı!d.FC֓-Jc:}le0ZJfNf[M>2$.X0 { -qϝ293ĊC,ha>rܳ^^=ݷۇ_CqeQ tYQtf(z3-rR/U^ڵaWff#DI"칃MY^LpLxؕD1Wot[nϺ1Ap}H)F&Fpu@nZi2f]C9V.]s'r<Yւx-wyFŒXf…5 @ 6ی$;Jߡ+Oe1:9,@pǔt[UcWɯwB 4ټ~IIRf,YND 4@dCd kVo`ݨT12H&ekӕ9g/\7ޢCr0:J 5O{zyOvdU,gxT)7wuY|Sss -ě˖bŲ|Yܴ.E ik([63JޙgsGQt< 9&SY2o= .]{^Ӂ`m"q~ܵV-_Cףp̘tX<8Dwv"&Gle4/ &4~}CxXj^Uԙtk+"_ቀpYw3˖`2+Yz3sYGM֬YG>ūڕYh9W_Z+k)mAVvMHX=ѩ1:9*mpž|@7G35DQq1;㣄ɱ8lٜjTEU1|`0Jta`3.kEw]nYz:>#^ME$MVZQap%-cQ_yꛜ>~-bb)k.˰,䙖됎ylѢnR5@@ K7.J $~-\HyӦ< kt`" [M,B9G{:/eqc#{xouN]:]HcǖM;8r_B'/Ɛ}č~tdb/y \0i( |Q>?ω+WعN>7O41ImƶcDPp֭o%;ǚUxA| /|vˑG9QN_8+(|,Yȵlݼ _d[)Rܺe'l_gϰm\žޛ0hzΜ=ۇ_=#DZ}c'fq&ˇW$M"$J"턥,tSy9DAL|ZXMspƧ92W4tN:VS0' UkSE3t]N@v$x QFkPok*[낟ǻ_b{37QX6"(SwLA]bat{(5‰*( 6IFǢ0$K^/DEQQ * &98uus.]<\vU6g΍\tl?c'8q4ew^-ز {t P`"P&bx ~3h/E^zY֯2,$p[M3Gx $s< q;lXc$7 βjM\No {57saw%Ξ?ƖM;GY+鶹:v;QW^;⯟G/)yY215N#m<|G3s;y|#?|oi)X+HҘʰHImS4m1FB vLczhmdm<+\DZ8օ+.G'(S$^QԾj$&f@7ijC/W-Zs}ي" UZLQd\&]-7]&̪5Z{x<hH8RЙnf6nRa}WxSBHbJ${u^)U#Z̯BDp4,BGǟ}o~ ,o>HQ朾pC$wصi-杓'yh){s .1QH"%+oc;C;9{$Qs kN2ϯRty댍_Ü9ѱ+|E|e\Ypi.t}9&W_CLrw)W|ǏwErn83,\QRLNP ׮'u8~WG/LN)ʂsNre|-vru|'E'>hk9?roKbJ5j p:YUeYLD!%č~*͵d8p ,gryLPzIUu0aFX^!6\)|em Xȼ<`h56`!bAhe!!xb}VOQ]kKE\` k l^Js$VDNhj;랉vl-73oB!ʌDJg\.q QCăxAk񧟣`K9;@uc]6L߰ضywzy虓u5fsTȲ.F/g%/ٱc7Og3˹ 'ecj#`-[oɷ'};bTMqo1vHdb\ksnz3 &㇮1'|,$RTitP|lEl}{&)axv\rQ\3T0S^dm|o8zxkl r ,e9":G"m a-`b'tׯ+r+Y0Q T+je&'k5pVsH:)^hWFATƩp]D$DNlg{ba 9_ ?h .;(NP9시t>vlX*,EXlHuh 8&JbJ  [nV1CSrJgV]5/Pޡ=eqnr/`*|J }:.gxx9w߲uqț5Sфj$K 33;p?r"]V7jΊaW::Y #t7lwqy&fd4ZCDi Jl'O$7oeϞhOOqܱwy*U 5\5 T[Tvٝ,a,J G^+ʐgRI0T)f2:ʫlm5 |!|ye${xォȡq Xh"Mb}}8iMl6W`vvZP/l!Z 7uuqC~91lЍ"r*ByU^geH̋e-|r KDq@Ƒ<'22/Y|Y_051o269QyZU~ɲ_OAf\>}_I?o8wkVʕ <ivf.P,O*{(9<'i;^sug+@ă0TF{1<ȩ,axDžʞG"M$(pԵbǼSq˽|BYWY䳏 Q+$$O *S{}xa?{H"CG8Mi4SV*1`" ٹ9nM[ D4] r<Z|&'y껯u!";TP]Mhuqe^ye-YkWïS 6L*N0}?odzz=U QB$++ɖ,&x+-5<ŤMF\ޡġW:\p8rB &`>h%iP Y_sbPt9(Y֖0)ysЫL]ce,Yt8'J[%]nzAo\jnyoq1n{/~: J 2F>lc6FrQcåbCǤʐ[c/(K{\8D$p/P8'>DB xW`$ $ EYഢjk[a(j9>i({BBo5jIR Zblpu}J+QK(mw("cDx.{du~~ßܥ 㧎_'+xwt/=ew'g? .\9cPqQ: e,XȩӇx}f8m14IA~w/6cרꊑDJTMF,.~.p'?J^=é(Y[H 4-{{8|%Tg0râ* ybKr5a ݗ$,ӝ񋧹45 :5py^EGKV\s<fjf s)F\c x\ٓ:lamRCQ..';!9G 0y-d] !gDZ=Wں\(i1ɬaJCf8zE^ЙfFo%+-+NKn2Dw+zhize:^X< :^WlUʡcGXx[[ me*UA_k Iɯog`=C+Lɿնڕ9z ^9yeI7( f9#/][S|T'sf0yW` sةp24%p*K`o?|\ Nj0y}sDnsh2Ha\"[uٲ`zns#G?Y g/3V{>6Jc^?ՃW~豃|}>/}yebn+W ^"g0K- _.Ub0Ti0/LJuF6'Ў%(<=_[pGrڕx >(D>M8pg8sb9| lH8lmՆ8)]iֲOŒkRq\p %N"un"!" (`Eqs)&ѥ}VёՎYZRB^{yeb:__rvܻ>K%3Jq1r 'Ξ;o䥄`W\BҲ_3_(^ˡGy͗L:K?`,WkS)vjwAG ΅Dx>`ǁ~ټ 5',-yo{1q=de+zxR{'2!JX {|?Kߢ圼rspbǮXn#ׯ]/ٴv KrڭlX붲j6Ⱥ+ć>EK9vOs G|CBm`fEUn]dvvM?x t|#H[x AYҤ4 [rx@ D@ IDATR7K wF8&J]Q҆(JGnOy5Ye\YB:gb @e "_}^g&89Y[őJ,wst;$&a=iDAZ!PHE_;oWc"C)&+2l=m{d-<.r,-7oncg}6>@dvnZ$lu |VNaezv{ngʍpr^va婴+\t6ksw=8:O2ݞ8[N!+ES6(cKxl1i7ٷvꝵ\7|O0י~?>>U:#\ 68{ OFgg ?z#:}WɫZ~Z o3|*9"iZ2,YwXi g)Eȕe.LGm+1O(:At*+n}'D#VX+L'*"8BVg,Zζ=wȁ"'S3ÚiXgbrg^~i6Ta/\'*Hh$ hMݻn#?/9y=!Unb-lx{KgGO&˻kS7n$kl )F8JBz`,v޳j*^|I|ajj#'}r`nw:BCWb5 ",XkƮ݀RuVbGa7^bfnm7 mpHpը:2p$3\Is2Rd1E#n|$}D&aŚu'҆}t k6pnu`U /Z3ů`bGsd:6KϿs\Yz=nmof3u[19vνgzr^̴+>}JW>ZZ̏r@hhM7/Y09.uut8VO>,sLNsuޫ'T T OjUZF\n-J`x4t¹K9r-2eƙiO1>5N-ZYP+򌴯(2DIQ&&Gᆋ~j_`𜚚U%*$oPu?ڐ=ǫ1rdR)l6"O6ڹDjpj޷q%,Uj=b(9"G$Iq, egXt=푇$pIsx^\V]׻[j#|[abb*VetaP 뷱sNPY"gӏ=_ɑ05;Kx;_3*9deuIljob 5CQ+Vш#>O7_W={zVܺc_z⯸c\2φ ;xЁzuTJ ȪAz{׃ /^E屫LgN ,`1yW(}Wfi*32&&?Ld\~^Z~LMp[\9CYImDH̝j/Vzq?1r".kI7R]a1Rq"<?+&pi\L$J>3-9B0\ue1'9U){/B[ 7xny㵸x%+ԓ>El߸Nxi6l ~);,gE,VaöW 󪚪ݫT=^q˥m˯rjrBiK .d>⅓a4 L8;ҡl"c ,euyb)DlLLҲ^0&"I$!FK>2Ubu-:Kgnk.s_}󧙚{1Qj25/Y{WpE\^xh!VcREAUn~Pt-W))T% XRcv(l`^]Fsf~ھ!:k ɳtnZS#DX.<Ի*𻳑#/=}.RGqȳ(Ip@#Y^VMC.::1Wql*Pϯ?v)FlhTyLH-zݹja l۸{fy٧pP˂?o1=7ͥk:Gn Sul]F +ekX:;_b/"Xeٰro<̣|}s<yAӜt4m?ʡG5 )pn~,ճ ĖYBB0C|_~e)UUȇg̪'^_cl[rBBBW0C!Y0ޑ &iǕUM^d?H;ó=[29=.py@Fr0EIgaтequ}\NНw^]ᴗ{ 9sm;\A+̊Gɜm%;`#wPq-hYx87-YħCz]:hF!ˈ\#r,`ޭ$CJnN6[APFƫ.'fXz37+Ū,t`8:Y|o39= J=Djge?Lѿ-{x{ߢ, zYĀ /2W0gFj VE:gw?Ć5irwƒ+Fg,{o;7n^}AEg7w7ߴFRBT<ɾ>™o{~ւe:*Nj] 䂵lX}wq)^w:!"J6T#J+w?U8!pAd^R44ZXyDo˜EsĘη8q?Ory'ιokK @SJBk, @AEP__o@39zͿyx,/HcӇiwWzY~LqEt33=$^+7㓣u'eAI҄,C@V TIS:acQ:>qzx  hr5WTgsQvc*rޣ꨹J}6`xVcjuV uXӿBO^~;6f,'U++vŰiB V?|wzG9Cxq`gdRzOIӐ{M}9eQR77za*JSGٸ|!\4X"+Y xȻKXvmZaI+xX\"Bz9&Ǧ^uS@y 14"Fy+sE-4YOщ LR6i?2Tձ+|< vl^a2/3Uu N+h% qq͐e]\YR2*d=n%( d.Ex'Xt-;vezr/sYe"FQO5_d^{N;M;y#왣f~yYqT\}`$#2 P{k ۰ k=f[J6MjnGnf7FE4Nf7 S)^78 7"/,,n|Ozff)(\$(z%VbTD'0FAm?֮cbȶء-QB;1Qmbl#/{DJ; .FyGhe EIkCli}t/rf\@.iڄYtF-0`wUeCܲ&Ēv^yoivbH* YlɎG7$V;7N"۹ƹ.88.-Q EIbH@t+kǻo3 콿yX)n]^5BU[2 U9)qCūg^'m[גC'xb5-PYsNo?k=>lS -EJЇ '#L_9UI/~S?Y-FiKqѫ+_0XT8I$n|?\~W8ڋώ.qmo/-qY7↽tvg1 f ;(+<*v"7m֛oCq~ J&*jց> YXXDX}^Z/gn ~tiJVz# JɝgX7:[P,^U^1TJsZ0h%*eY\,&b4~g=V]_?8f`4!`[!U96_MUTZ$EuZ)k_{OXGFGI*EFM$##cRȢ!+̪;[}!YOOr|]@(2ȡ}XFۼ۷qp"NDFS9GWpˍw0<4/_o~?km>̥o`ŲsXf.?8&0[afthBI_{{ط |#TdJžyp+L˱Qb)͞}eb2^n/#JFVW8LY6G8FL|S$&bCΤip [O x+1wavIbfX kJG2ZAdh$ Ws.6)0("MʢONs,^Nst%듔3ި]SNEFcZP 8#> >ɶ-;wRXeQJ"X~G4,uD=Q}U1;7Gz}ۼà:b V"×&ʕȌLsH)ltNр 'ILכݕ"$28Oιŵ;Q ՍUy.>Ⱦذ#n]b=-JeQ:BT+uoz6i6LRaUgNcv4_>թEq wn'3 Y/|RCŔFcqw13;IQP IDATh3w.p*`+b\+4fbvno)<a:-KjFVEj%Fgj"Ssm,YKR=1Hh)E3K\EjlW`~E?1I7MZ~<(-1q _+0,=ݥ6}uRU֒Tqъ8EU>͔<0p$iˢ&a(iҨ 9Ƨ' $Jٺa{]悵E(kq11}/?>7~YXc]vد {P"݊W40O=ugI[(d =.EE0ɫ,Oc6k׮SMhBTXWҰ&)IiJ et%.\rq? 뺜㓗)ZQP_t8z<&2_ѱ1xjcx(0tª&&'US]5'8d߸Qza&N_s'dvp%/ LҊRAl)ʜ~SsLI"-:!`L8H_)!D1)!kY><ĥP}qB4~-2rZ"U xT:>|B6"*G{K,sa*9  6uO]WՆNTEbTnL&)% %޾,d)EcNsa\M7- 1칚[ت" *IP:+E7Eޗw|(J̗,_{ z]>ſut|!ԓ) ^3'81}Z,!ɶ g.suB`*lYi- 'xYܽo#+173-=q,${<.MXZZk#'M*" e)espKMV EfQַ?;E!?mJ*ykE//вRa~Ǫ08VS3{-j%EK9(s%#/F)F8mt_t ҫB>ZUMehc~3K<{z5``YUu_DICK-~!q;Y6_1}Ld}5c"{Kф̋qLdU ΈVӥS&jlm*[]l>!@O Ř$rBP*r<^wYT^GZD!D Ͻ4fgqe^B#DJE܊l: i6?J"en܏ZҊ~њ^?#rEYbbCYZ"7F,64K\F.0+ nM H& nd+ehR<ψČ /a "ju*{ j:V].-j/ڛ}uGaU}-}jXDZⴁ9eHB`ERY:mb [:Db۲TYtXA>,ؠU]dm0CLP̓h\)E{LbEpx+ .uʬ]Zk$@t&TKET˪j9E1hP,1"/ۂ֌ 1QaED~_QE@2II L io\4߼M42)",<4P!V MT[\""(.2U$LKK,ĻnO3x+V@V4d8Ŗ(6$i1Lۮj,k#LBvlk)kw|tZmTl&ji(4dЃ;yr^8!RQ~U}T(=!G}ϭ+1&V!ú'@aDXJ9RQ Ձ %Wx(j'7 N""C(85ZC -c%5Z_+/D[J SZvU"(G{/6y J0 j\zIB[!ܪQ6)krD^.-JtP@h$0|c Jb" g (fhx"vj]j/Z>ed]-uRXk%v'o]~P>WQU$i[TR)Gy uؿatV}S We.8+&e6 E2CZ.~u5ՕwL 0[O -d}D( K޳V ~QaH5׀̣|]!?2+!ќe^Y(Xު|` RKsđB1}_pDPOPcM,֠-)gx!RА0z0ĄDh"A2pf ,%2D+lu FE$J5SPKTbs:6VB-TΉ 8F0FOQ/VO sתHCz@r]h:PsUj 9,e.u~ $(--\ZDzf@{yʌ@d+aG墧9ɠHY1cY3reM&l%S ?kP e0(r鱌?d9DQz( Ce:Se1).JU"X*tP J&e]hqԁg5{ں R5U!VUf56bJ Rkd=6q[dYe5fRV.F,^)%5G.)J1ݼ)( Nz2EZZIB`~7cdhH  WZSM:|$FfE450qS)N9lQUEN%4]DOJW>MPYDD,;Ӏ j-A8]kY)9ȔD8˥(Xx eYbm(Ju2FWlGQ_}ʼ[]ug7 8@{<: ՖLhrfѕvk]U J_QAWckqTi-@T}* *uWZk0J,P%"rpr>(ӄ%͉ r{ f̢$PtFC#/\) VazU1J2d]x H-M/Ai8†A]^:i׉d ihcD҅ @Ɩ bE'I 3I])iCFEY5hM%g"+NgR*5T=|i+ͰpXf`%(4E_.I >F9B*(QI ^wQ8ւRBz0!A؝Jfу6N(Q;R׬Z[n&֕ڠʋ).IW/V\;[e @ X>8!w BÆXU! & Ux JǗx+JD$DUf%Z&%4Y#|pc]eYe.ͩ/JiZ.Ib1:K&< q^ѨHc&E yIzi8h o 2U*/EH R-NFeڭM\s+ V(W+n nKIAKB48_Txa[i?V %o'U(Dk4)mi$猰XQT}փkCW彴}D|јȈDF):ER֊egU% Q*JfX/Jzl2ߡJjQL܈)k^Nlؽ+)=αv*P년Q= C)x4Vhg1:+ zȠ#3rᒨЛѪQhlp +K(&rw?ZO1%:d&+xJxeZD.(+J1qpYՕTr&tmQ%&(么y&}WDe^ZШh\O䆅n`CaAVy)9N81ަa êr W2Ft eR)P(B-ё*JUfq:p\*jX5%ʪvQJO9zEl"ҴA#+Kmd1j%1.yQs)+C[^+傗VnYrǛ*m+ G,` R$DV4(J1q&ϣ(+֡*2G{YF?wBJ45Et^Hʂg!SnK+j${\(K+piR&v?U徨lOUiUUxP-U Q u$h+ TS1U %b)yo8$i5M Vc&iHktS݂~Hx(\_S.Þy#넅fҖzlǻ]JJV3&CB,] `ǩq^^\qk+QRM)E" `mBD^w~28[si1j\-Vo<ĥgj^b*W֊ݞmq{Y7"P!nT<^3:1՘"cdYA͓u 1Bs: $*alg ,c΃d22ɿK涑Mk`/\ &6q lJ>4ΉǮ6V;(FذqudE~Q#F3%IcΝL(cK., c+%2žbqv*.2;p1{l!+K.d,MQB0 (TF[lX ZPqpDXeJo*tҧSL~pp5/ 2FzF[;-w㧏yfgi 8-Z# C|^4 vYy|YbĻ?F΢YJyگ.G]F7v{^~SJkݶdt*")8Fz&?t=QX~[fvvo^ϻFFٲq+tg`jUjeǹ5h6[ Yn_wod '1ܲ6<Ph{9Gaٗ@Xo!NR֯eDFJ[t*=+dtu~W^{+<ΟP)2k*|O0 >pZє6\hL,T:XT#"n5("+ɥ@?]:[YzН̈ dUX D8Z5 .ã aXK+ & Md +Kpڥ{6?Ց!}RhdpgK٠ 8} OG"|ObL"dAt|;W%nCl":t'Jk*>v6B'j[6_}(ua` weG$Y~+w=i:7*ݢdæ~"GJC4qsdl=͑dYT#>7v'{w䅋GfݚHkֲ|dŅ9ݜ=}nݛvhW,y" R =/81V-bΕ q3Slx=2:5a ]q QbLL?/dzml9R{whrǁ;Xj#GOE{o+ͫ'^yv(mIqk٢赅V|gO֭٫O=z=cYvl^.~񣯱>^|v9ɳضq;7g9µ`Qfvq 珓-uY9][CY6611=ξ7p|x sSl]gϙ˴ /4^i1&i$\rVbZ''?E^\Ï>ob8w<35?ljGEѣ/qˮjOu9m//3 ѝ?g1n߱e7~0W/^j-qԫ8í3)lCi;\z'Y\j39=b2$%^xfF'9q${U l, >?MHƣn>΍;yg)]Y*ԓ 4(˕8 ٬s9c#ct: ޶mVR$ferr$uv=b\VuM@x<:8uMxNy÷3 p4)yd$QĻH9otx9cْy1dzG__1^u=G|,zP~WpjA:L^:˷m󭜿]n3 {xW8t!zK]Os[02%L9yfuw]w{&ke+i-'~/~slް+ϐe&&/s‰JkKg8ULoغu#$&/-yQReij።86MQ\v083O=i .o2W ?D++L~1:эc8_ڐRVK k} D9z{H\Y2U%?gץ/Q9 t?yWLjLARH1Q?ӳ3}]quVlD+=7bsq붲ОC)i2}?|ClZ+Yme$a-Ⱥ m瞷AG ?/ذv#_yz,,=YT}bZEt5]-5!Ҏwmdu>䙈DƠ&"CC>s3$ysS~, \0:3ZbLBcxXziL`M5`2JxoytzHPLC սwȿ?;/4 0w5y5y>0T>Ra~pe?PgN~z{}\rOrWyPJho8~c.31u4(`¿->Oa9{,6`1/ms3;7w_6c!.]:K%q$iKl ^V&{alhx+_О{~o-9YwzBS+y)F /=mof˕A,8kg$1)?[cG,@z|J޲, l[4_yK^$ґW \Orn:x+< Lj'~iM~e%y)6J(9s^U\o"TgLoP ]Uwq/ܳV#QňNF3l^X\Vtqub2]'^t[,Nu_bh(94HҔFIՔ>px깧ٱm'[o5ᜣظr+c رsOS.-So`:zQ٩ (Qks6z?`}XߖS -JhkWU ޏ_~vO5ygff*d?f-^Z iwiA޸xWsyfk `]_4##|ˏOOzy_Il < OKS]b[h?+<Уz?9VVRg792xELIu*Q•=֮_E,<#ϊZPXr1C͔RNHYƩ˳$޺ ?ʼ.&-Jb+0; u4@Xm%}[2lh5&.Cxn/sRExdD"q9s5~D&D_Yf.JyiTv+2 @Qt/q/Y71&NU~H;֯X[O~ptz}8r񝿓!+^ǩi>W%JLX2yΖ9+:yfϮHۈ0G;/)"SyBmVgrn{nsA*6(9^:K}ֻGţYa$9g*PVEyNUi3,xW r[x·am|[_ޅuÇa ._|E#( jF"3 " Q)˾뷰|r(/z}i鴌=y~v=3:kwI:0 }qĕTJe ?QMnVSP_geuk"#'HYt@`/}߃ {z5grC dHp]h0g Jՠ]V}z N) &J}I;o3iffG%'9q(;nuc}ǖ9ǖq 6[G<<ٻ:.O3(Nذ~+G>OZQ*֛WȃO-&IC냴a>+cctٶ~__Cv2@ O3|YWІ8NQPŽ:u GpMp"[tUD; R,wn͇W#/3Oruf!wʐhMbC;ލi5!\`-?[a2Xr59y[oE͚2@/d_A+TX(2q%6ʺWԠVe0&Ɨ]vڵY|CZ winMk7sáˆ@J5g,_?~O_b|MuWoW9 ^L C(>’}BUTk3x ɀJ"mn[:Vo|4Nhw {ȉX>43/=Eg$QB{q+wFן5!=b6o/_gn9x N_c "5iMɚ 21]{w7 Q1 I2/`]Rmj.EVaCw3f滌nʄx`1t aqٿFN?M_C u&6Z3bƕ3,,-fVK-=n2ywrq/z<yJFDR ޛ/:KWI_֛jr"QݞlX~#X1=9P 2Kg^X`?Llu`!ɝ9.Z) _+sE5K^WO1fZIeϗ(g,(nPPq.*_^^[[eH\Ak CB5+By,cB(aq3Ij(0EM9~/|q>bt!>c̴d0Iן]w`t{bv~][cӚ7Ml9$:p6DM.c9B7pe.6*'>,rQRx$OX8bj8 ^ "P_VqקּPβi n(2!; mj58{ O}:6 w{cHEt%NnwFkH,vG ĨxƵ/s؋?4Si/Q‹6j*PvGU>y(QJP|X @I,4MQ@5} DŽwm(Xdxmd0!nY/%aVJ0+Y* |(Z#NDPhxCkI31yF%uqqz{q eg_=ƯO2\R[3zݫ7ITu1WIZ^'SYcoѪR:"N${g)>eK^\`Ute>ʱG3-L3lN=}w?_cm,cwro>'DqS/y50[nbYno+dy_J(&YI:\vi~_Teץ6Svlڰo,YQm(U> rהDCW՘(l9~?Z'^WS8I>N6mΟ]\g\?oNi9"ꮤ ;x;dEGW(/wi4eHn+n/6VJ=YeDIf2Ȳ0s$q?@J3Tt V΅ UsU݇(1%5kxUkTՓ16:& ֺ(MT4"TP8A"Ⱥ=6(+ol,! Rڵzz8JI}q? .+e' =qč&ik<{oYk}iӋʌfԬ^,V%0mpL_% MIB 5i\'Ɛ8`\dI^-i4h)rxw푍ᣏ,=қ_Xxk|g^O.0i]JL"Zw3r"J|إHOGUsy$LM[uԆWox}?:z[-Vkkc"NGzP&Ͻ^} 7m.,lbia~ 1VQW5B35cؼٰ!Wyy@Sꂙm>1e.o؜S$vȝI޵I{LxbH9EY27X`ak:[K$^W=Q "5)۔rٔ;F )¯7ЛU[VtbP7-aKŃGs̚o)u8w9'0\FbΟi6/KTʙ~H{#t5uI/]yN#Wn&^;rM]SX{f^yE/<[o?OsLYQouM9q2\pu7;̹~V_B5,fJh&r q{FSzlݶg{IƖD 0%6~xnagْ6ٵuϞXnd,,,q7gx)k7wm˫_߯ؼy+/-ѓ1s5b[cL1ksu_/L,h%v's3rI.yuNF(rzaK*Lt;~*L|'Sɋ_ 5+gW/%yωՍ`v`=E1sQI #S +_1(JhJF)¾Σx [2GCuG~;ާrl+-\epSX55/ kZ `m1KQX)y)I7< )ڇY][A)EYEI4?*Jy>2^?ó|Ƿbnj~s*}[> {}=7~@_,GfBH!*^~78{uOtP~\(K<,қ :/ XFYyɯ0A"*>s oǿrn(9>?˾x}>'|+*|nei[Ɩ%O{3óүVVKZ_מ7q֝]oPY(y2D{\UZ֠5uQNBpMYV(r+4}+7v&wR%8*(RN}$G5QT!jp࿳~ ]qk-410=6֞C3jk1G.\Y=/H2AބDv X}VN,'wa#W35E%;aUJlXħ'i;!7mCQTآdȧ쏸yt.nF{q"1F3m\b~%F|? wq穧J거L'45Tn"*)P~WXXAϱ4KPZ#GPE)X@QLok&)l,  p=/70L9}^)Ź3<̣{0^{ϼGYP|΍W]9^~q"Ŏ\gDky'xA]]rȫ|-Էb:ٶeo{=6Q7eul e)@51X+ttwJ%]ZDBAaj'!hx9lQ`mn9tnhqIK2hUneYJ9BNIxGӶBY7O N>{ϗ.*hlPqcq8C.?e IDATұ 3˦|Ԑ@"I"ha_x2 XYrJ>䯼PE!љu&^?sw2q9ڰԟ|qnX^?-7\?+=LЛ߂27ZGp0q@"0y?e]gZ; ?dOF> -5W <ڋ3_Ƙ+C)3}!ixK_St }(NbK8rZUqQ6@iw m;g*;sgsofʒɤgoGŽ$Z 4 */Y 8@),i }h]DSm3R?GCiib>`ʒZ:)el6&F7}n[ڦ<Z̥ؤI w.ZFA!E$P;OʟҖ"˨ÇP'?㔉㓏NPA2ݾVQJ3 %o=Cx|/k9p0mˇ_7F3ăϭ~ìrp xXXZ=q}_mkʲO~#8WBT*Sq?Kgkn>B NH0-E[xdH7<%XO#݌&cuo'_#K%hG{*wN|1Ɠujwmq Ɉ|m HD/DGO'jn~ɸge8Z{{n[U0Z.lNW]%yv7_E+:sT} (Ml[Μ],+ cm81K&iG-J&%LtjߝJY^-V9"FiHHW)LC˙Mw/2XrWg?%fD/om9wB>h7c6 וM6T3PآD:E?֚q?\q=M)رe'Oe/k#_ <kl߼''s䙓'&sh 6JCXّؽ[U'8x?O0t-o~f^ysrUsKDqӑ|KL(9TND'I̾ПV1+yG9!u*/^F?ض">?1ίqpwC?aWP_1~#.aПŰeWBSXZB['rV@UD$i8(kq>Q+G-v=D5rculѾ?.К29NQ mm= rJ8F"V`tNzJ\T~x`{Uj 2n[=NS{궡qdHk;Ag 3*-Rdk,.D )aq}7ymqe., ϱ~$ŗFM=cn{%L̙?hh2e _E!FF-D׵S=vqvG1A뮼3OwKKWlߴMKQswZ=;Ω3gyb\22<ړ|"M2z:N:}1 m45x> h#=?_즌hkuꦡm[bۦ#-RѦY]_AG~?q]K~#жD H&Z"TNT7uRLjO`cNOPD&`UU2[H$!BzdڀS$bȰ8ډle*3&Jde?MVB_o&4='Y>VbXyr}y"? Hډƛ@()/'52%%vB:F `> D,s-mS i+ʹetCGpS,-gxGlV>?ᶷ5׿zojz칓<7|̥^{[׌DeokxߌR?ɳ82+ˮӟnVt~07_se]~ݝBoKv&R 2_{lQи x^STlv]w h¤8|eHR*iљhcy}\*nZ&u;qޫ]>vwk4;qy.e$NF1_غeĘ]͆<Ӝ:D?5!UY폳)-m @ 5]!hj'fvhACeVWWY_a*K鵚#[m^h fQNz.'TJ,2$*BiD $9OAմ2MFdMÔe `AO)gFJ1t?rm$GeY0ALA9HCrNܼ7_M~e8Z澻w~ߤL䈫DŽFlo@32Y=t wwyt.i{[Die}a~_y}y5m<Φس2Nf:y՗u.CNsveL (V9SO̓dx,Ue;vS {w]/>'YGf*rEuW'>?~Ѵuq.( Jbæ+O?$>p_m~Rf_59ov^}9: >[wF&e␧E LATZpeS'uIƩ)LIY+oiSsV1(ʪZQkz/x({InZJ%: pA@r.V.`lmL,bQ-ZZߊxbP\WlGXXC:[Ȧ5EMbR&lË@M7,6@Jf2 Md >j禒X GrMv%ya?YR&p垫9s<ϼGJ e@kiCB <m÷VNUw vdFyF?]9+I ゚׎mrɄv'|@Ȩ<ڒYRs(/g],{.3_#GNg`*0ΤQ7}.gOMicQZzf߀0ogaq}O=*(UAIFS$7r[\5F2[Og̴-H@5/6]JwTY]MzTJI jke>*Ch"*+s uۢ")UGo[^/G'V2^/R0 A.-ѐ*oX(K8Ϝ3{5xN(7@(SO;>rJǴ2֢،zDaKN4DKŻ4Uo^ ST(SxMy'@Xތεl۰S+ge󖝌'q8A}ZJ ؔq4rS/cmE?Nq̈́w-k++`#Ju-1 -5m'?XןhmANğ6E_ QlJɓC^7UT)٩|&͈Kb"ίqMM=u غekgOr:UUP*aկ>G]`qd}\bbյ!ߣ$R7MeG>%v/7;?(;/lߢTDGl'f̎ecE΂Z#Dn_7MNܼґ٨N٨(-%U?EN!j]/)0 TfG@@E5=!hCLRYdmRWp טe)9L5/""Ifš CJ4oӬ6; B'Ahbtw2*sP,F [dPwv:g"ZD UU}@iIUkFф5߶]s.C'!M>砝sl/4; שuҞ#ڌ s 3R#J]a:6,K|\g/>tL:Ld"2ώ1JF>YD:RFd.B⩥C <5`fBu҉2ޑ|(+'чCab~PKZ6$w A36QviuT D/X+EC$9jDB 21F|3SOkʴɝ!]m2Cɕ#(Nڑ0EI_\MLabK4}^pXlH,VO}"JK5E*3v="im-Jr #LkMD>W'c =آmdspk)肨Rξr (Eo4 ^9$bWQ#,#)et*CeHLhAd/ kޣMI_۷$jTz`fc*eŏJPtR-) S;Ӽ4x1+;!-ؘgtњF-d&F1Ih[QU-&LO{BUԶr[|KY iCdBd|Pm;EV&P$I.AT즥33v!Y@2[TDm)>m#tTFaP6M.䦍1=P5S+\fFSU0Xa9J @/m :k&8x\ ΋N)Є Q'hMPZȊ;PhбEGCu db 2 |M57^iߺk ^a#VV>W1P»Ym'#I4)Eo@aʔrNDCtu2k8*Tڪ 1`ӆ4V,c\8-F"i|s ]Zy3 nvvVAZKIhN;'rXmQҤ K.O`2k*A  >x]y_wJTEiB7Kw1%51 \/ru%XD7 Ƥ$#tQ3) KCGr3ۈ2E01t*ceF,df|C'3*t&ֈ0/h4S,2׶5-'qD ].h[ "*&;٪QRIe΀-۶~DFXq2T/ MPZ'ZiKh.D\3?NCe)=Ipzwk8"udAf ֐ҳfUr7fwlKoԭF,2i:`b8ix%+%=qʙ tE5$X<9vFv3e) i]s Drz9OOdԞ0&J `vxt5(gQVϺd. w O%IXFkk7Y+H}>!X4V$NljFfV(dFTuމ\6Ҋ(?x).rB3^,&QR$*ζCaEgTmCQ%ضʰ(=UPix"- )klQP hc*Y%oeD֧ۖ5uV q.RoR4FPr*a C)&faL 9q 2΋;"OwLBZ^ˤ~ZSC2~bDye,{'#% YӉbJrT^*s+kuB*I}wnu6D ,φӞ vIKubJ̀iV'#1HVL$yT3גxJ) Z=1.˂ Ϗ(w{W^/|GID)(ce =Di]xh%6m7rOL%JRu- '2f `}8GkCFUyRNR1/$cTN!)|;a:ZC_=[rMW 7[BfU>9:͝VHڂ&0TJϣ9qT|m_y'7`@ԩΣ~1Z $b`Љ oQ_LL)+(vidF!Diz"54N1Ji\$$[Pna_?φus3mZ6SV=hiHi5=[2NhI) h+*SUL3C6eG1m/ `"҃xrY5#^g||;vC`ײ- ΄^>eŠ\zvL^N#Q>2wR^R<#;&fZCE}8ϢTW*+t aAVv"'3R%Fh>8 s u\;M}.J8P ~DH"n%֔4qa)$YBE75JUZ&^gIR9'tIɉ+w2[?UYx;Q+q ݙCǙ& A6s`];/8Ȝ%"))5ހ~Yb(gRaۆsh$$ *S#E'=]v'uV6<ՌΟ,PKvP֠EzJlZ&Ú;vs?Ď2??@/7_~54룆p>5N2o:LQGS(dqE~¾IL_ic . 0cFhe樺ʆ9_7MBw4Kt5 xSi ])y&:U&AYA$.3-=;7Di(&MbsHBe͊ оMU0 Q4ݢ'Zg|C~5'p8tbb潘d#ED-06LJoP4mԵXGq3,Js|7"Z9?D, L1 nH_ƣ1gOaAv_s.(\3pA3ĥ x.~{?O3<3n%se`?J3*('חFf}ilyG1&A$i5cyN6"kkDE'$9mLgN>&9hɺ#Mbн|x1;az}ft:Bf1Na^''z~a D'@rrd~1:mD3ȇawDa *(幇h yeyoxԣUD>C RȨsE'(pvU9ІМ)Yu#/k94<&wM9…tB7vAQ(]Iӳc˦yVc\Ӣ΁0fu o;字0D`іL m[ w?t-mMmbB5>Ma0.'GB݆1 7k] ݺ]yMtΐN##n~Gy MdP)8YRGBֶR+%v\b!H@4_e: :MvR[JV{.Ȍ)ȌVl0ٙЅs'\!?_De(l"$kKQzvGWS膽W_m[6B="X4-W[ǹ\E8+e0 ׈}L诮`.I#3먼TUM*>JNhkm!Tﶁy.(+g0)RjͤAM-^P1<+K.( ]EL=5%:a#( iPG?+鹝<:G=>&է$LBؽS$s^n}A=c/gfL 6=/|0-viYW\ڼPi8TPR楓cfH8!dN€V$[ @!d<(*󋌇ktv:e7N1L SO%8!te{0f+dT]ud{ ϙ{ b,eSgOg^a{ ˮs½i'1H H-J"lIZW첽ZVzm-YEKEDtI$ 3{9gsA(V{; \W1`J re1ƐIv/VG Z`3+uuWysӖq6A-2A൥TV16*?^ƪK9պ`+ JM\5-WdTmbYKF #%D4)#5r#eAW EgpAt\tE6v-3(U@YIAܢ个\i0t?Q45Y|33^<mwXf3o3Ihͨd8p>JݸRP.~Xeoq*\(q8+61g>; ѹ>і*ԋ0Xj@THKw 5HHu3=LJ &6)|D,h&hœh1"J RQ9 p j ͠M+Km4NFoq'lx IMyoTq6Vw7 5 xFFGß(r2 %!2Ղ]Ma jbb,71ÚQ78r 3_h@܀c"F*@{uF ɟq/25 e q0pifQiQ4E(bm&Xac /A/yQmD/f] m5@ > "D"+~-V1 "Sdl[ݷ;?Ķ+](T Yuؾek^x$XMUCY T2Ki9V X5rOj8Ǜ͔Q:fPj.=zN+ct8@d(92 ck;{)9eb iI?S? _~~ WsZŗ%#ض<3=Xa *km\WMuI`0sy'~ԏClݥ %O-2FEX㺃v)C,#ް2b:uhPW8K*xqR29R3ecb٬T/db3"H6筘#UbzmV}wीJ:f,a>g8=Xz%VyQrz&֬X#OعkWMI!Uw~g~qk %c]Ȕimgj:hF(rRu#esUEgcie%^V+XB)%TT.BZm2# GvTU 0Q _G.n$r7G %ѻ7{ ĺSœ)=GJSץ`%}m+RVHZrT[` OJA5b$]6*nIP0tbFy4!#*&F 7n7Gkb!S6Dg=!|5ʫyN IDATzu5բ=:Nr*M1˵aXI» rf{=/~WѯDi՞3_zQl`"bX^+91ZlA?.K_3_'SGqŞ)z~O*茏2z5kZcy3f=–Kؼn#- e!&Hs__k^ A@Yj92 Ar,2ڂePWxU}U6nmKn,JSWxF(g-cO<uF(FFREdu@#W=\YYW/2B{na-/<ĥ_KAcˏ **F5Ɵ*?"/aCGebb9koO;QF'YwC>nIlsK;뷳mòHgXPѝ@86Ga'֎2^H6V)Bu$!%mlQN!ufN?(}:J;f1&NUS%R2SE1L_ &ՒCg8wIE4rPY<I*!<M%[fbMY& R_&bw`xș8g Xz8C!* 'Kj-L.UjY|'w?lA 4AVQ$rF&Ws-<5^eLPy(l ʒgӗϑU=5|嚻ٽ &NjHW<¹Ͼ 7PTS`QJaB WTGMXV.\aSp44ҎRn*B'ߪNaSzd%){UtcQd蔰 lG@XT4qgKiOZkCڵ'(clSE$|kE .FTz1 g'tĄ(3tB̧{^mąv=9f FPǁ&K"ËtLÞ]8~xYZj(d .rʪDWpu\y]lܶtb3_iDlݱeāݼy󋏠.^9ڣ9-Ѭ<i'qS|'8vamoz&*,ar&Ʒm#GPY. ]I"u؛<} p_q8!}Q& m@*ӫjPiU1*jWWG.{"WUɡ⴩XT T$78H&hx\ @B2G*4D>F״@UWXc)ֲ^p!%tUO\ԄĮNRZȘRD(RH}1pV\%1R8'}o2=kPf^E&.CZr\aL!q_3{ش{yq/WL`4Jt#ZMH"nSfvJ{h#C"̘PBMJdVA5 \b̶`iŃ<ڒ2ʡѬ˘j3[vn䥽9ԋsǘj5WW-9v^{?i?| Ӟ`U\>ŹЮ,+BYcI\y #w2Њ9n6DuE ɥܫXFʠP"gEz(4^;]PJL͚lӌ`OZ$oi K"ҊM$I[}Cr?Z.9NeըG>ڍE% H:V*QAW,WUV'}_8I՝Y`uχsFl&,CБaɁk";Z3+v>ycY%o =^?-ضc#Yџs4Bs-JV=p`\yZYמNqR%7<-0}/^W6le5']N^&*8a>ڭ j2a8YjK"vLnJdZ-A95WMclbw!V&'ɴÊ3 Ƽc:$1eҬ+PY$82kjJN ?z 3,Tfj͙shYfgg1rzv\{ U8 =p~kpgdYl|9h9g=u鋗aI!L)v<5%C1`,d%QE8J8ebi d( 2 F+Q*\=Nό8J*4ULn:2QI7h dl$!hؕ\NdBRXBLPC"5[V6+*fn2CA)#IHū h~>J 7FdTa&p~ &nhxXrB^;syp/7;ٲfƗ-#5 Anơ}) ,b%%/m2i Fy_K/1˖QKl|\rTwiڭXuyOV|,$/?sZ̦;ֻ7cQöob *qeًzJzuEPϿD xjl(% s̓Yî+vkܹ!bnZ8+}bQ q8fUң+O+xa69ЙI>*Ռ-t-Y6y Q"Уc%bMWmDIC6%qK?bi64"%$UHX2ynGkL֢,T"{Oឱl\!/x?aX&R':Vktb]W򾽓,bLTCIZ,k hFrט{7첞SQ#63MI*L3 9N=^Y~]7u?x/0􉇏_Y>0-׍*B5$ׁa5l3o,gOa(* ccآA Kj-dMg`(oLM2}<*J1yؽq3;U5f)dwzu<>)S }l;CZ-aϪЛ>ř36[oYTL6j'QdEer%ehk |(˒__Mz{nI?3qՎ5?39V,_Vo,+9ƚ.nLA*_3´sU0iʚJZՌ\ιY>v?F28c'L`^CiՊ-ڴ0X2=jr,D\gd:.C)X!>j(ua]hjGꏚ*5Mٜ4o JnTrfK荋\ ]9  na6 1o!9Zbmzk "-٤ʹǟ=7mGcu尿b#&ϚRkQ2pB{JkPW=񙎳)2'K7̹#OrE-7~:as*-$s#dU*EB^O]Wo>0?eU%pWXwwҁ+#vpa^yUU}{LCAV(.LpH Y*2Z%aY8?='|3r:(>l0?2FT\Ć,+?}+YM45"V&a 'W%<*rtTN+_W ɼj&% zȬp,p4/9y$- Is$4(9x%c$yLH8 }kv22!B ![ؼ-=krPIS+tTTCF B>#* =STPWuU` ݰ&YU]6k=p}s3jtJZ**AP56CXIxB٧.\2=x-kb)E1" %_yG7_57h4JN2J}{PZKh@lbGS?_O-ZE=wv|.~f^=^>Zquy߻ec1wqv aieo[5Q՞kڣ_` [7+2CoN ʾZmо<'Kv 4^*CZB*M,j*#UtEZya5L؁3 "K@~Id%D $IjcE[E"y8dd4U.pk$fZɎZ`e8XGLBS7>Nڠ`e-e9,ej&&+q|qfW\YpUxǍ7no+pֈn2DH5(SzHf3v2 ,I=$T=yOGa{xXIuaAU4S=(BH~yv_SKnk{{ȑ'/\y˕auBwB.3[`2eUXux\j[9wOп025U/_<'u|5m컚17c3kTPX0x UbNtĬ͠p|SC.}`^f,im)89sT. 㾕pJ*!|woV){'df9$,t ZZᖁKѓvq)&&įLԀ/{k5ӞXM щ0~Q%Jd1ج;x%Ff=;?AnCu# P"UAёM$N,Mָ`J$Aق:jA\qU#K=9&7 \KщLI8,izm"~>iM2V )ub& ~ɔ==fMF3}?aw`ƦP :FUk-DH0P&()y&^c0?Wݞ ɰ r0;- P (ډ۶Cp;l>v#/II;xW`8|KM-[{ㆃoŏu gɳӟ}ivqzn҃?x^c3BBNNo]r | >(/Q LIPJ^S{#3U<:( Lk`)Z[R҇F)J14NXL=R9}%Ŧq&&Gٳm 堤3(tF)[ ٗFjXV(޵X>u5_4n&J`1ti ceȸst24ABR/]\1)[#dFy{n?r;>@|&;o/H%b5tQeTu-;Jw4 1 Ss2(k$`ۣ .V֘XX41Njny֖ a4dXddD;+Y; UO #^ar#T2Zc8^ c+ع}-.9O<_jbh^9@MDKQl[߸6qK3tJ 虛**G"FBgݔM3&z0 -$2ܨi4 25m{nwq>+ HeZKQwtP2эE{\eBkC]8z ~K3]ti26yG=,ʡp Ũ3lٸQai Ѿ"TXbg;Ͽ_Ǒx[Ef`cIc9!I*y2>> gy:kW326B~K3WAI]URa}8tw||x7@NڛY}SĿˏ?!Mw Ͻ7ÿq̥Gn?痍<[EXfY| ^<|Fino+r $p֑ ;1paCkDAIuH(<kc/2Ο=h1xaX4YPTk"W6n$妨 D*n@#*ۿ*evUl߶AIŒ H׈޽*-?'@^<| aekNj~w㝼zƭ2+*&JFf :EV)x*2KL(_#آ|O> 6+֯#k/t!4A]`P8Tyfn|5PǙh}xoO|^x016{߽t 7/p=y:sav"ꥏ-ysizPXwʴyؗ[kIF5 :bULJ "e(~8 Ws7R"T@VO^y)hef@"at<:5b'X+-`UuenbCK\r0Yg%Sc8ЋՔ6`["SDMd,޳p8~|ᙯ3eG=R,Jbu{JH&ȭ! Tt (ˊuřiN~_ٯ<*KkTxW\y//׷%^{\8uv7_?w:/vwxZCp( .DH[lRaWn1.ǫ2~ˢiY!ϴI5\`γk ,xqXDK+:R22L^:hZTUQЛ×+ʭ} deٲ0|b L,pq?#|?eVA}go~7~O{"5׷- ~wUt'׿KSoyex+0w 6d*Bd.K6%=5~R2"yA. =zt'8b-Ź>jMQ !'C+EoU  \Ma*}}U1ПcP KFF:]=.ZSdaX\רZY䎕l_!WS"%T2'ke,PMA!00Tx=pݰzK̚^i}'U">:8!&zoZl/WzΧjdðh,"h`X2bPgXx(u]K61VTUEwg_{+=w?۟-l,3~.z[p<9Y1ePUJ c)*r]U.sнL2 36ƻ7CW^v=} mkgf1gȂg#w$Vdq|<9fNeIUs,d ؿk^gE,)!ZkdIB#(I6D8do+߃5(op;aJC̺qYg+80Y-\8P,$`aCgϓOI8ܪyڝ"⺃xM(V%sԕa"dʊ?dXqz߾ݹc{=y&jKO6\ޯY,̾YF2jI^ (ɪ&H-+;1mkу9v]ǵZu&e pNQUgܯ[)JWѮ50"hJU5ru [rSP2|%pP2(yѢ5>J:˦PGyC< JG|._NH5DALQ 䑕TJV]DCcV,Շ`tJ~~ 0\.tEB+ dp'(KnRDl$ԕe@J-_>w?IxqϺ/pyv~HX !(VYN fy>~` vRfZ6NM Vim;|dԪꗾvF·'uWq'xwPS5HrZW%Z|PmlaIѱ2iiORq Ap^QjzfxWO k^= 30U @Iu8*8?~+Uݲdl|z +Of3ʪ$8Pʬ`## {=ʅ9Ξ:ūkg9?37Rj#N4d뜠M[ȋT—e#h_)+(0XMGS EV>ux'N{i[?"{1ڭWOLpպoQX͊B1QZVjQiDne8bh5dJetrX_'~O|saMi._2D0(B˨UYawD; !6˨]sS^+'Gi]UǾGޠt*@K&(u$, [G'2ZEu]FgM}Z(ٸ}3#()mhaYLWx癝c2C«hZ ;)C׏؉ oc l޺5V}Gk oכGN0s?uaNz Gk5{m]US9,Z\+މdIjrZ>QTë؃!x]c3,cMsIWRh2 V@1c0TUMnD.,k"0SͰ0%q֬b1/puqǛӊ 'dǜh0aэSIꃷm-WdģgCQU8RJH9U{7M͢U,Upj C L3}0jj&;5WcM49z8GqZt SG,<.8qv^~KvN-_wΟ|Ы>ủoG(up>?;l|+",s8>,vlbKۀhJ1#J$$0(cQ:0X3~ y33,gjZj3Xq` P2>5`#TuM];\k2tD{^PL)rlɍbSΤT-@[Du-aj#oȊ(9|@g@2!"UNQﺒpŭ0N&䣈ruJ_^e{mh׾Bde}tlѩ F'12>"&_A@L +fEyŰ*ee^ j8y̅HWVמ+S O#G}mNXx.]>)^|e=p%SHcٓZPm1f$r?hBmTvFȬi1q<ꋌK۩z, L\:1jOw8UX:ye9.j/ %j|% Spxl_<>M#9s"i?rYXjw44@h;Ϋs6wh{%7qۀ鐲'ے͖'6& ,pXmlY%[FS4sq;=^bY<潺ν7[nn"vrкrKׯ<34i9 K4g\Na[C R(_ID"<֌O0^,/4Wp}B(Ieݿrwt ,Y q^ yS ('`#<CSs6mbVDq@mS Mѯp̥sXlX Cm0s~Yvf']AJu^%&K7+^AQt87.bq}5ݳ1JH]FqzO?%GCJa c0F24e(' ro=Rɼ:C("ڽh2gzygpT&Uu>,\0OvVۡ/ 8'nЗ[[f<ٽ"qXGg?hT;%8[ U08adEIghY6s)f<7PIDt뮺`%J>«`9&S*G/Sˆ+o`nC{dYpW^(086μ vg~aL4Xi[ЋV'/QUV^]a!'NM5 ڴU(`\L#z:ܡ}<3HX1z(M U#[[E*J=R)&QK'r|~# wzy۪{vwϞxm_^1 m?̭7}&3.w~S\v uu$7Yڄ4)N7d* ͊P2-yF"=ݼ [$(XhC)E#! E1R)9p$ #p!" $,GZv-׮]w2+%$V,_-sZ T(  >|mBG A; _0Wڌٖ$O)ɜM6ϠiKDh6Ssyk~)tDVrF-K0g] Vb/aoBaKBCJrh0|^-#{qn>#3Atu$&^|'||?%]RD<(qP({QxrCCS53j?5)xYػ-K _5>1Q1[]OˬX+L0@e)Q#tB[ \DgAH#='W_ Qj"AwWٌO.RrDbJOf*)ɚF(;fRP*3w&֯یng401& |j1s&,W^mO*<53nKDqDu#}YэL7R(I9UꫵcGsɏv-j"lD8rOc[il#q2:V$5R3a%'UA\'xhv;z2)/\sGmU;_KWtl۱?tῙܴsI?ߌsOO~jf66$E\it%^UEPTq\#*!c)U>""ҶȜyY2a8NsjBtJ7: ;߉8XSʯj o|$3L&+,hokcA6 D\"kdXF]]:>EVI3OmI?@v[Ay nS)IDATNg2(-Z|bez֭ـ!daxkH󳈨mHh eƆH m<<#qL<2H ذNmr%1ΕB.AqY3ʀ5fu#ك?}BS3!Zg$ 2;Dakcr tlu*y> u̜1#q@82Ho?[PN6U7B0U ū+ؾwO[G_-oJ]x}|׮qVOIdKV`Tuk N.G#T 1DjY [CP\|.C]MF}jG!1DžI8q09.3QIp*!{cv9K$,(G"$GŢN 99W J'=FH) >jNo9Y<ktXF(e|hqr@c3Gpod硡j|hmhxd~ `׳Ţy3{7KqF<~aKhcL(˫MLc=Mjr w$86ޤI Gc]Ν˂囈(ex|>JNKC+Ye"n$1ncyCmJ;pԔ|: >Q>F8["WaW*'.8ifk$С]^]~0o] ;aLqFG)Mc|S>JyƐf\“O*K&Ba) 89~9*5uFc>r/ ^ mc}~mFsUgv bذv-M H]Ee8 t9g\G Zc lXDձp\rUMR(KhCX& b~QISe;ԻD`vI}R!T dyFg80)4ӭD EO!g5Dug܊*+Vƙ$o:Cteɑ5UkPCbc(&('J eʡ<24*.GcC=c"ϓJtr}[yY)\'krϑuϹ = N>zˣn<]sgw(7#%WL2^Q%no5.H:&%&Te(hbŢ*:K8AT,B)JAkGXMF.x$JU08Gv\QV%<^άX,*aU밺 d., ؤqǎ8G-l|Q. ldi%iF &ҎSH#NPcØ '>К;ӟmgEι;6H[ϟu ^%DW}޳g>846>qi]O?<֬$qT\!e ?X$9!SXNO.R3{v wd\$*<ߚX:js_bnt^eWxݶv&[e;iljsY斳TjÔ=؍1 GP0&"W=ISe&48O>KgW5MZgAGz/ k+쁝2kAA0I,ly1ܲeKpX1)O `02fnMRx'2{ټc7-6CʈDo_qHmQ%K's`ںhՈW>_OOqf7nƊb5[S*:v HPݻDE:OԶčrhkk\e4$sDmJÜZЊ-@0r/Mfcki<-9.I>5 AHDlIbgnDHpxJitL 1hk?+^2|Wcޓ]}cY~d[֚ww?@SC#kV,Ú(IpLm4q#d*V`\_ U8s3TTI^rsꊻspFրX4:,qo?Nc9>Ql(rOz(+(N@ E r&qV<ǟ`}JSGPŷPD$6[\Yh4| b& Y;8эy̯6X;982q|*.}L w[?yۭ_3{+ d"?yb6V-^D̙ R(7vDIcWpIlƨ4&;jwq 6,!2<;@ CƗU׺pZ@J;T.EXLTуqʐRG.!(萒M28^wsիuzFO2&ƚi2h%R %PV!.Q!FS"L"܎7O(wV} o_6qV3Cã8xB4P)0DFmL`""aBG'SǵsE~xx=v&^2`o{Xhaw`9-sXdI{kZe]1@'8wsDa8Jb"JX'#)CJh8&s(D KF@M0_c<ۈbXU D%Q݌ v3J5H SymxZ`ӞkQ1=4eͭQw/{ߪW% ׀m۷|ƫΞ}lqx{{ر'F$.I H\DFG.j`9XT skL KKڐ) -ňcw_[~,XtC m{Z\tf *Y-!E( 2(#ܿ#!H0)r͖az };x'NsXV,͛ZImMmb)a$V'zN<& DJbm,j$}Ctv+qmů^ (d娟؊aJYTVwgnv?gˣ;`&ޞ:Ի_54~჏nҷ=CW=}l^-q[h?E>Fk.:F`@ZN#h(b5Z\14Bz)+i*J IЌ{~D||[H}棔O>[苌sC'&JwlZ5b]SZKg0Ot2)xRUZ"ch *%m),R@\W]A˼ŨTaוV ۭX7ExD~t˭saw`n/|"c_&t>qպ_gWkc&3aǧX*F*IJ('C( & " _JtK",g/* X$acKzLL@g~>O~B|6mv^?uZ2az 2Goe+}oՅ׻zƏvy+o2jWJXEGQTP&IQۻdCk;,N!zo_Ky),\joEx+0_8780xEyq+1]GoXƺB|EœLc,:9pO>" "J0ae|Ewr9b٬x 6]iXj9v'Wɖr'nG~N? 5>~e-9V2K cKl\08<~xgNs-W)^.0wmࣟlxV?:k8t9޹ce+~1;W>-1}DC^u,zW(=q%ͬ_:R /&-tFEX<`?ҟsľ\k:n7w~i1;|ndW]E Rv_xwӘ pիR,3I%yS~/kӘ˄7nX)erp}Ә4oon}/LGfSIENDB`patchwork/man/figures/README-unnamed-chunk-8-1.png0000644000176200001440000013034013565477507021220 0ustar liggesusersPNG  IHDRz4iCCPkCGColorSpaceGenericRGB8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|U\ @IDATxxU_HB @PDuQPc[Wu? 6 "6ł  *NfM&̝>ϽO2rHHHH\"P% (T@HHHH\%@UHHHH (  Pe    pPWq3    *$@$@$@$@*nzF$@$@$@$@yHHHHUT@]MHHHH2 J  P    W [=[n999RBټy=v\(WTZUpҍ YlڴI8`yrsse۶mv8UjՒٹsg{bŊtڳgON|ʕ%++K6nX}v\t#ieٷoteСCqeqζ9ϻqA.c*U즥Iڵs(w^[ ">Cyjդ|uXfSaSڵK-ޭO %hϠvpJ*}iy l IHHH%@^tHHHH *a2 c'/^lR)   H9T@CKnݤYfhѢ;xH$@$@$@$*&zGÇ;vPW:v?%   "@Ԕof ;050yd]% H4Be($@#@Ԕf*`B$@$Vo2k,!!5+[nE7R_؝;w6> @uUN=T1cƨkNHHHH fT@M>C1c_z :    P54i$]%   P+v1 )==y    P>}: K.K$@$@$@$*&zO30ԲeKeRJK$@$@$@$[.Ƨ&ʕS^{xwt]`S2 S7&`tr v/Uqu" o8Qvu^sm;rD=D!]'vDN0^Axǚ/H(HX+AB{x/'Gؐ ៓b?ns#N: H7sRt>pR5p:.f|iwDz43fԉ0V햓ީrsm'u"Msve]c٦k.K>)ˇ ̙3Gٴi[o ݳg8p F+^Oiʒ;n;'yH#ĥrRPP s{n9t萣`~8(BDӊyy fۨo޽{XpW9{(^~ 3"'2XBןx v t^̌+)E_^`@_mݺU˂ <jHHH 8?d]{߾}'WZBGR DG ht}߿}F`Æ ҚB$`M+ܹ3ԙ~mcUw= H(yyyr?@oI^d…g}ٳGz쩖|Եs~[:t W]ujJt' ) C`ʔ)C%wCgyFPW[V\.Y՝9nIH <>Rz = |1B'Gvɀdذa{n9sfг<>~Ixϗ-[r-2{l!$ 5_j._\N~ɕW^)FR׭! Z_|JÆ 88 WVb8YNʒ5kŋSN{۴i#sΕ=쳂-|--_Wf>?ʕS6쎇v/&w}'guBmOJ$333lr/\ժU䅌 ct9tcG0x>ҧOyꩧ-]TՏKԃ_~Uw6k,|=@tIҿGʘ.Sv]=eL"㩋 S/TX~Je!;ۉcrw/osDPHu~(-pcf=~ZPY[ * *ۭn<2^N Nڶ@ukHL<ӭX+gT\Y}.œFJep׮]&gen 4(GuP=N/[L&L J xPםfG0,eL .v#ifF]5NsAѰ1X:fx)Вo]rM _S.x# U@1i޼yrw84w Hwݠ~+Zy2~x9sUVkQ"ВC{Yb|]ýVZ2gΜϨի! HzG?@ EBip`Ѹq.S9fMU[|1HQG㎓UV/ 1 @&~ZPb|{&Mdǎϫc1)Vuv[ H4*"7/ @w}(f}W\!Mu ;  "PJa bUw= ? @J,Par 6B3?h 5 pL! d'0f̘(vM:w1XUݩsK$@& ͬ|UR|} H9`5L9H0 B5HR5kVD0L 2&E)zV=DHGxa+R+"͛7SN9%Ry A ( @T>_6݌3fZl`%>,B46~|*u PMݴgIH & _dzcdBό+A'$@$@$@$@D h2&B$@$@$@> @ @2P7,ˇ%Kj.]g`3$@$@$@6j3P[zvi<L1B{9ѣ^>O,0۷O}]ׯvmqˇIHHG]>K]JAAA}:\vc_ CnIHHRP%YARV҇n۶M`,ʕ+ͧO$@$@$z(wyeܸq[nknРAC ۫|87jHʕ+<_~9 $?*I7xCw.=G;nvLL⁘9Je]P<.^X.r?~|$u?KKKS`yr.&  NB@͙3G0Kޱc<2`s1u}Yp_|t1sӃ.߿_/ݺu :oA&Md޼yOZ>~G$@$@$`Q@fdddZʺhïPOR v?M}NokKlH*UT+i(a2_/kX?t =VL-V{^Md;nEk/乜-%.&hҀRL$:TH-v=h\,B jOaF}TbEA=k]YF^뮻3*x]/O`MxBhuPʺh#VZ?)VF%?TDpsΝAhʩv0c;Xad[V-:89)6V(jpi ,8e 545k|'z`")c@,lO")(Nk*P<ވ$~ѦSaSNVݸqꝼ{0ggg ki!1M^tEj gh۰al(|:>^7'#   L hY} -nO? Z0V-vK˖-ѽN:cw @r x7%\WHHHJ`| $y宻R,Q9^s5rw Z?1&B$7nYf:YfAb iӦԬY3pͪ  H ]̦MW!cƌ?~Mz%exg}ٳGz)`{kRygƌrˍ7ި&/sp6mT/ {իWˀ/ cС3޽{ʕ+53 wHH ^.5k_0sϩYPЅ|y'GVnv_} 7E_\j`rz'IGoG}T.|U=|r:u|ǂ~5J}[՝*T^$" $p+W;Zj VV:u1=xbԩS9t=͝;W ed֭{Z *ot;ݍ?S >\ţ`cnpC9N獴4W[hvN937cLiOgVCᜥs%R /hj G,]TՏA=ѲNs?Ujժ)w5[+KeݓJאN1{H$F/0D.:|N4_0Ax(cvJ~~rVeN^ɑ֗[ . llS@QSLTvRzĸI&M7ݤ͵kת1Hp-UVUJ܅be,h%0wU͟??<~v;+?οAc S &Q熸5Ny.4-PFevC"# K^^fϞ-5jԐm)ɣc5T Ï0uͼQb66Ƌb<}iuYi c{;ʫW$e- [/hr4<`ɺoaF/|w2o<1p8q_a>^p7 ^xzi(0%𨣎 t1a"&ԫWOZh:/vjJ*C;7pC[Iʕ/iu_B_;wשRGoQ ֛oٝi^2'TH'LsRGu|i24崍YݻwGEk:CbƋ.Hm~G+%=40cE!)Hqɔ)SCƎkY֏;,0I+`:;#)chsxvԭzh$FérwQ'n߾= ߩ0W' 2&2&ե_~ƺH'_E҃zVG-2+?lu+?nݺEArg:tP!*D]9†|ױO z+A%BTN 8ZyO p'd|i'`]H'q+!nn‹iv:>`/;o駟T$D_^| 7D9sC=w|DVwn6v7on>Tiis}P<~d`jnNH.ft)̈Cyٮ2ͯǑ#㉧-1( TƍO?-ݎ.!+hC?ZN` s|C埛~PN'LZв9}tZJ籾E_~%|ƕD HVx&ƠY keKh5ǘv<|rI'qVu?aJ(&7Õ %Xze"'  آbL9#=A`41wQ&0s1CzjP1hРAj@Ԃ 0̬Ģu`,%!B$@^%п(Pu$ZEy뭷i4t<&'@X{ԗf֭tYuY՝gO$@$`6lP 'N F!j/kY4Le' h 8ۃY[n^zIm X՝O$@ `AV]YC˺#G&&`xD88@ &/jbV`Vh MLv`oNyH yآ{ɒ%=cTw?ptL-P%0Sx=jUK b-ƌ.?|XtYvFbr,I U |`E3G <`aB d `Eiv݉ ` |M:U!,03u&;_$T˳{ 5k(1i̙p $!k$bwĤ#,{uX&slL m]SheTŎp[ZR^`VMk ^Mz `AX.rm} @Y]lnYNqhK:I)_~Sm۶ &q҄Sn(ԅ?c%1U` c,ٲeK}[ H 1+ ;tYhaB~騲DEo˺7k}ǭp7A8KEo?Qױt-fC`O=Y~zoy̆Uvy{zkf7.ª8ر:lNq'-n1+W_Ubp)(3#>`—,jecWF_NǔArٍ= ϣa(BnP3wH$cCxN'FWr9.UR%V?Cnl޼:B$m6ep xz7ٳ1e|ѣefG`yϒ 1B]4h@ ;ئR H5(R!zT}'mڴm&=%?\~3gO[h2D$@$[P;N O?]HR-c@ScL$@$@$@$+[[@c K.6mNs֭Ù\1dlHHH!@4z|XBChq믿JK$@$@$@I]e|B`OòNlt$BtHHHT@ZJҥKQ<&  HMT@S35V)mHՅ($@$@$@$T@l#E~_|1m!   _$$_&w}G-ÇWkc9֎;z7  <=޽G!    4* $@W\/B~Mz% .Ln'<ٳL_NJzzzR9]*Ws999N&ry.wޑlukAA S0Qwԃ_~eugf^?ԢE DCp%J*^"UvONa0#UXQPφH F2]G$u^'S'#xVgn:i$tvU6nܨ*]buuVA}(fٲeK; d;P>^NcCG;2/-KcR}} 7aTN /<'Q-xAqRrss݁NKZrΝztB+<}FicǎRc%2'eHI%Z.!V`yܫNkywڢNE!o~]`]P6kwxF9Zàlnq*1E^FoA8$`B+"ɟ0F/k<1<8}Gj&MԨQC) ~\x@Y "(Xw} >N(`zӋcHR@ЯJ{yW_-ZՌFhL2E}ዩC2a"S#0Ժuk($@$4~ai޼w}A]N} ߋ/Lli,[L>ð   ` !/֫bNΝ[b=o( . G}T:y']tHHYE!; Pf U~}ٿcpҴiST7--M5j~ၮO>D.25 *Gx3 @xݶmZ5p;$`v1hٲ3 $ƁB 'Xnu޽b5^z{3<3|cƌ/RrK$@"$*ذoG;NƎ+999rwJ =&+VTߟ}YYb`Aa,YǾ+_E$ Xz/)Aرc" ƍ^zI''kT@}| /E+Tc%Giiu5J$@$u۷oWuڍ7E'رC{9ٲeK0V0+Ci$믿^B\ʕ+Wf|nH0@`qsRP^ 'At+n#?mYe,b 9$\K^ԝ)ڽHGbIΰ-y$쐗#~MQ^#ar4nޛ2 (f[[ ^Ѐ^=VFs^ A||( bQځTaN4B% `~vI:묈&U0/_(\s  yٝF*!B-m,nqjnH+' ~8hF\Q_؝'7Pv*Nᅻve oJ0G$P!Dr/_}`R?'e[⑔Q@˪Hʷ{E/JZ{kw|&L󃂊+t^vΝ;Ua뮻dܸq+=(P[nU*%| G!w#'57G}-uR'/'N0GBmN(S"#a)IH2#v$ӎ.e(u{vΩ|̼2 k#yG@s/(   iebg-=PP`sJk}?za8%?䓕]T(իW/-!@$@$(L?OGGV=n [ODT"'OVZAh90.l7Zj%VURtP"#&MYӦMSnHHHJ'^zr~C e޼yŘ kQj֬)k֬Q '*=51I1C'VjF0s<{IHH %PMd_$% IN^ J7t 2$@''sss}x"k$#@4Ҕ1=HI`ҤI~c8 1t 0vͰ x[@ >sXRu>裕qy)w!3gTˋ~Ҽys?a$,4k& l+r- d|եK+v~2_6c=W^yEB^}qO:L$@$@n` [0YgŊ2k, Z #K1C ?|iӦ̙3G-ڮ];[ݧc$@$@$(j8 yfo-G}[:ӧOWk'M]&P.|_fѻ-Pv[:/T`oԕf;pHE3 '|fj3oq .T"~gٳL >k  $@ǀų}rIիWnשSGd͚5xbԩU;wrGD)f~iѦy}m[}lnV|z-9T~+c5kچN3[pMעEdƌjԅ^hO{(yW-_}UQ(?0^ UwWԁ/s.vOosGޏHѦ[jvq]~,ۄ+{ս{a߸q|ZժUKraU3؇j_Uۺull7N e4sssUK;w3/XD{-vnSzu"0QDZplc ~YѲeKu~eݺu:Q A )4SO=U}\yXXxWrݴs 9I$K & Sbyyy*(ϑωxfP /k8]uUAN2gťs'Z4Aٱc:tIT+Ar3@NDLAq袋^ "p"c+E9-n9!*D@lp 4|r<&t}z0v nwuZ]IPٝ.c gPՍ̆FD!h_ ž7jHm۶m?-e}MB@eV' 8t|28"C:9عF!JgCM4ɶje+;퇂V.-ի'e՝^luf> ΓNԯ(CZѰ6V4:v>=@:G‰n$ Fvg4FCce$|UQi|θq-SLtסC0aZnmϓ D4*T?rZJla*줓NR-4Vug3cIህGCdNPDo_C}l;W\r gwF{$`\QFGitD<7x\j&M?X՝ǹK$@ %)&Ê &0&utРAO׸%H,O?Tcnwba};gqgtwYu'X՝gO$@$) Y4cL4'@Ìh('<裂+ 6T3S;[Ǧߪ $@$6_(nC$W1Ҙ<̙3}WI<? $c>V_*X$@$T@Ý#ٻfEfRڡFh(zR",Y`6X[,^C [ /sW@IDAT/>,SY%PM4eRKObӦMz-@6'~xXr2Ԗ)L̛7/*簊ðD[Tfpm1Ԕ"n,DBkDb% oѢ>tt?+یf ?(ljyF3鬳R`M7$>v[,Gl蔵J|饗Ԃ<@NX>MQk׮m/PCLx ҫ_V?ˇl@ m*v_+'&ݼ9n7|S~r*hS 'ZXnq*v9C 3\* $^@0LoVSN9EeN:IӦMeXcĈGɏ?( 4>}VH ɓK܂?B ZR @  x޽{'$H*Gw;c18+ @ص?SN?t5ꫯ%K(4 _/)p L5* j/OF$@$@$@$0xHHHH^T@IHHHH/ LX7:G)<󓆃a裏.4VI8y晅O?t+4YxsRIK.X~0i."ƊSC wg/]TiӦy&L0~{a3$ ڵ+|#]w8'I N =Hn-Bۀf#6;gvF]\"KI ]'d ɔ¥9OoG9\u5v0Ȱ @ P#fdTR$wnnZE8 1(%:rQGIǎ&>+WVyFI'#"ȏ͛7Mt}7nŒ%k"'pւ?묳# bK.w_Yfҹs縂[ H>Pa    7 HHHH @ eeقn6,X@VX!mڴ5k/y~SݺEɊ8An߾}бWYղj*Ax#+,A։'(^BP/U\ZjV\)k׮ ܋.#<2p~z&ժU u*M6Uƍe֬Y*^o  ^>v۶m*}0^zkuUڄKU0ًy !V1XODz)kD+y1*竟9^ϝwީ̲C4i" 4={H^x$ Ơx}<뮻N/^{MuO|r>(^[i2l09%''GP f[BxVXQ9GGƏ`1B&k۷:ux>NpرCH⥼0G5/ݻwK+HjkT|"$肟;wn=^<}6`6TLd}1 Fc-dၨ - ]%in - ȋ_JT{=Yz[>*h1PR+q-h%ʒ5kx:>hA7>C0T؇ 5lPkA!̯&(W,ƣWꎲƜ^ʇ9Z2>,l m/n$ǯGXX+y$,^ˑb)lR;yuݺu[J_@w-[gҽ{@93fk}|1:0rH1ZTXѕt4PB`Ѣ4tjl!>/oEM08!ꅒٱc\|Ū;C= X;wT=zƸU> oGL6kuGiicN/ߡ^{)oO?U\h8^?ciԨic辗r$aR^k^NIHhE(^c,&@3 .@)?hү_?5SQ{7Nti`iftz=yT:u$ưz8x`5v\pƁAA4˜2ZnP?B00?D0"T=" *MVw6ًuChsx%o>cqf}pa„ +Yn# WhXrʵZZjԠj^:Tͯ]1S)4-54P8Zr?#yUw5kH#6l) ;,`10hƸe=ޞ~ 0| Z(*R׃  ⥺1KU0^[\(cƌQ=f>lhUk^а0v׋1~;(^ˑ#}GŚ]1&`_sI'ef?<Z 6KB+?RaС57}tiݺOW _ EA1 }OF/06z ڵS;Z1{꫁kkEp xcWByZZEeKuGYir:KU@8aJBC԰'|@Pa'^lNa[wW;ٜ/zGEy9eWBBbOB?(h?|ЭMn*'1&NbB&V` ^:vOy8BcGU PҌyZBs饗Ms0vnSBf*UvP'vtݘӛyyPZGj($^;Ɯ^*01oR^$,^ˑT@5IHHH'1#$@$@$@$@fT@4O$@$@$@$8*#$@$@$@$@fT@4O$@$@$@$8*#$@$@$@$@fT@4O$@$@$@$8*#$@$@$@$@f p7߬VyՊIr_Uի'{V++Z笳RcǮ*mРtϸv $>S/[hSreҥ /"'|ZխB 2m4:uvaՠH=ܒ@ #cMounժU9s XW]O !T@C0k}*+WEI6mivvj mժa nݺ(ƘHgL8zĤ u#GZ=2 駟)$-Ϝh$$}]_ʥ1S89$==]|g̘fZ$ @>馛dȑ2n8TN2E.eՎTL.B=8vX[@%'5 EK8PUٳ,_\*Vt! &>{K/T}שSG5#dNeQb3<#tSH 0K)x/ $ (*URabij9~`JF4T EE{  H3HF-[q` h8B0cBeРA2 3gee)wwN:c 4H3R>AA2p'1O")ʧ >\Qf͚>3㭞y  g^I |@@;fz٠<[HHXy2YR.PT@S.a   H,v'?}'   #@4咜&   XHHHRДKrFHHHK hbw   H9T@S.a   H,*OIHHH PM$gIHHH &?}'   #@4咜&   XHHHRДKrFHHHK =޻֭[̣>+WN233e߾}r!`UPApWoV|y{Jaa7r?QPPP|2222d)N(iii!GՋ#^(xKnn޽_!++KvܙYCx Q *Vxر(aT*/ŔRweIHHH%@YtHHHH  <$   pPgu    T@CHHHHYT@KIHHHBP b!MAn $+* htHHH 9!*UVrCl"5kL,㆟øl0(7:T\ƙ?JtA]J)"nX@] !"7?XX|k.?4nXeB.TXKq"R`ʧ{JHe⒁U]R.ZJ9";y={L k\R6l(0ք9 n#Nt""81@AZąl!o /yc@rJի mIGHHHPRJ  oPu)0.tڵn 7$@$@$@$9T@]LL@w+HHH=)&`.q֭A DBKbe رco߾l2yGS]ݳgOHq/UhJOOW]9Qe('@B P"&n_bE@?Sș=PD bUZU".MbQ=uPFȣ@F8)(XlOiVk<=;Hw-UTAB3~ IFw*^RiW0+U~>S x R2L: @4HCVSg$D(9@"FRHAx*@1V(HL$@n{;Y&2JĆc'ZjllyV֩JkP`tKV9>6q}}zZ0∰8xNO3} )@9auJJ!  .pd*ɚe M8K `a. ~RȐ0\c&)s>A/H&%s]2  Dw#{Qi?U4^P "P*-C럕IAaUV⚌QfB bPQfWZ18;(/R49~4G8~ݜ?;w,H/f?Yz'K(Zr#A7F̜R+X3,|*P:њY>_=~;q5 X @Se&77Wmciz>&ME<4 d};m;gx.gnlSFgn@Eӹ[@ueL/m_Qe??dHs]$q l*H2⇖z%ԥEC|[Ɲ|&"ʺ$Z#Y;|uQ@JnA!-=R`K RDeVP.f(ա3L h)_bԯ__}FK ;1$^ӎpPH'ke-TaC+VH1-i IlqIqB&|.4E<HrPu :R4~ݻGV㥭N|Z$uÛ6mRԩ^scH  QSMZ' xBFiSݠAj0-xB# q0*M! M 3Ǩ- 8DCLn~~C>Y ?ҩ-)v 4 XP(4O@JB4Sq'p*J{LIN;*@$@$`E@onu ϓ $)vPĥ"6z;: '/P|-L6-(0wV $@$qPBH p)y;XGQO=TիW]w%'pB`@c=0j.ҼN$@^!PF  Z=Q)<tRٳg@A0a~r?}9RhΈ (&e˖5F]L{$|`(% xS_P9Wϙ3G.QG%K,;}{^;*ęrLҺ6's9o8*TP^?/_^*V Q G?e(z^Xc7nUrUTa@FF䐇A =H OA=uڲeK/u]'N۫1c b=o<;WA,//~szyo7fDHyJBW VBPbn(+Wf͚IJ=?233=oQy' '>|i489t"sΕ=z֭[Kvvv ӂVݐ=[w,J>it8ldw#h5?KSDU+WV_l-xyխ[Wڈ\JQ?UZXcEYB;Acq[ГV hzb^?B裏D ^ڵkR|TPnt-VU9kE5d֌+̹uOPɗ V9Hgg)hyR<|4cyNNJdgD`3"Qr, T@?5.O>ʎޔ)Sgq R,sn~=Z"k7elCciuY*}d* cWA9igo&v ܢ GEZ|ѥz)@1tWR޽<r 7(%]w4hөPnɫ4Y˕-d\+$9vi8Oh]ץBfHf"b P; xZ>|rxJR΀^$8#7J`4qVR干7 [Fyr6/.)7-"1~c Gy:W Z@543Pmc(fZ\T49SK:1(c@6m1YәHOg|:~gm5/jCeJ+VW}a_dZChEa i*70wHl#Gny۰!Ŋf >h&uկsFKe9c|eRF id;x,][U?ES e- ksbCJa n5kJH'51bM& N;ԯ2ƼXY) tbVY(:2ZIe(ra^!Kf~$@~#QBIAbxI.({\=>T@P-v㶊Yb̮vlce/VR=HcXFFh#@a[.I7^ P(^3^ ) DN`ƍ9.;ZυڹFfoQ/_eF }W%K ?-h)WsRHWh9uP$@8p`#fɳK>:v"%w1ؔ P\XPܶVЪFh Y"PJe }YmR}̂_nݒU6 $^P.&N:o[{P]5fרEN۾y uP:=?+ gJg(uӺwU@  N G= X}޽9ħP ‘Z5~m۱+Cٔ-Sz`Ko`4=5LK8.(ϥF#BCſC9c17W\%C>T %qCA>$'^T@{0޳h]m`mB et,Yg6l*U1θҤr2j(9Bj(Ռ_R;W6J@ػ5Lwa}ij[oq@LٙиǸ'~}~3- %>XBiL˪xk{@:.7T~LL); &5`:H :ziM%RFus:D) OdK Z0n|nΒBU6C'=2vdߪU̧KWH?(  Ibl |\)C1Ư1.WK9;LBK Z? CIS-kpLr|9)|g(}CBϤ 5&iecbi&&Dٻe/PFkTk 0RhٷˢC#T}ߴij],[4ԥ\ n.ܽۜ?ݑuܢ _4q/򥯗&Y3wKwٲe\BEk/ e_LC)͔-;*<礤j$Uoq.M+_fYAcxro<srWD KrgctI}n` J2쥶EPYY+d$ Cc(8`jZũ:U}Zjkk}lX8 cDŽ2'${s|vΐ3ky g>u*C ?$(a111zCN0 #,j?x64ק]>~+z\w!TEP8o;^D,'Bv6TRC+l:eֶ `c J-TvUqzSeMTVc=V*',5ӎ׽4k pB5I77J>f?oxi:RL>z$v!WHΪ|>qHxt,#|B"[C&'meX] >‚b,c3bcgUUb\7Ƃo`OVܙ3gʲedJ=cib]#T>^&!uZ0R[ook!uhZQ3eT:<-!XhT&PMYi4^MhXmc mmB}Z}7<zrrqWv a%Lz:>`` dhSe\>p<ӟ|WG5ř:{6Kr16|Pv]?q ߕ ;wdhH<Ɇ45ڑ!@Ν+O=<ޒ?\^3gw?WH Xz7A?A5F`mRf3&6A}6xl1h=D%I=KNm+# (!½1lۗ=<jԣdW}ԇQ>\F-C7 &8;vB(#'tn@ee|Ҷ9 $C3f̐wPzЬtgh/ wg_ӆXOZѭ`И"TɲUE ۰=MJldl\ =mj`n:lM!x;C}ethaH1LoR8:~ĂRrҐFלf%rxiE!$APLqR]ySLϋ/X:,z 0>vX8rp ,5| t $ڭ,)K=!~ΈvWpհʲs5Xv0d#0u]wl޼Y&Mg}>F)ZՎw& `bSvI}c,Y$+6dƝizB.?|6P<L%0vI,qxYYBsrr:`!H0Bbju+d2tP9;\/KڀDP7؀j۱5QU#+7eɲu ?a~Ҋ{.IMfE ֜X>CPۀB9H$ڀrH460hGf" P3TwO+KQQ<6wi,ZOu thE|i7mh|0Lzv}w&qFg `r,w^K O~6lޘCիCUhUm$)]}Z}$ $p҆q[{zsֆzwd(\@ e"+m۶i/])**(K,~X&L -&4Т |޼yޓ0%MOO+VQ>N#R G;+tƵ Ljʈ`Ŷꎶ/gzZUxuu9`~z[9$|Yp qa- ,Jr<; w>Y[f7D(s2,2d~@1satD|)s,0 O?/_hnM~ۻkvL$@$`,\)/_<'Wo{Va}>}"L5 $CnLujsӕ>mgNF~\| \B&7nn#s=7$Z /ր>Zл[n3<Ġ7;ug+ƗXrrbȂIQ"꼡́f j@=ew<ϑ:,U&Ckrlܸ `jr9#Q6􇔔mURR"|Z=a4#N$ʟ_)WX"_Qz7%.{@V1!xFh&$hCaLl[;/3f} OCbvG;tO,uV Yۡ9 ~yp܂I^ni P]/koGR0]q{-&Bb o0n)Tܽי8q|WzM8 \! &7=W3O0p:B1K~^GsáڳgH-x.65OU+ gvZ e@H4-7x`VYCPÕR( 1i̙O|riEoG$@#N$TʜpS'&Nء&0tqVyyڻwoWkC;4!ܜVmT a┑)]لD ` ؓjsw6M4IM°;?)af$ÄK 8}2 JУjHO˚ ~d('F smVa; x>^Q&:mJܨ>;//O86mKrss$|ZU HN`P* _c}`KwW3p:!`fcvۅO,_=$#Oh@t~kerr"3DZ.VybVci=E'[=[˺̄?^ vNOgM,[j6e$d Z'p d҈eWT=e8#˿r-('n eeeZ A։p zig.i=^iE`w}H{W'\p 2D;e̘10HuLW EFd ?!BpF6 (R @C1d[8-Pa|ǎljb_aږwHLRa4/Wq +oB"SOI~~m'?czg` B'L'%9tF5KړΏ{K 1Iщ',fg;$xe_"W[,Y6rdZkm2(u>6 e t,%_ȫʩ|u]l+ܴCVSj-O0>j(3z&|c':+ d a !hpdYj: JE@vkҖnsv@#FCjԐc `;Soؑ=-6I Oޥ&7{m%$6~~W&P;<؆uVEm'C0΄@ưrx@"C(maO^3+wNs/ˑ~/> R~tV?K?PF3\o>TaOo@Nh8lP sD;j{EzKQavrһG[[B7gkP !@y$$;wj!Cx COB . ͉ђBǗ<@Hex=2xCB:ڛm,!c2c,!evcQQ>_qJr'x5S֩pOBT9 C08֡9m7Cݜ#Px>#) +Ands!C#׮@[BoZ ]V܏e}us¼ w(X){$@#A-#0Tmd%gLl9nF!6F3 #M?WP'BTiG/dh+%%>샫}pG!YF͙Fz&پS.;xܱF@¸A4pyi א w1vBm_uB[!/9Bjq4EmJ``E݌C6C&6 Pm A$`(2&1LoR1V~A2ewn59B("A$`y/(n׌T/T 95ujrIPc ``&fI&ʻKdrT(Iz < P,mH٪Udĉk֬ j & @MIIQhE> }R/1A)]nlvx`\G`yGAܔ<vv^pN?] W+@ oݬڵkoٻ+$@$MFݽ{vԙO&Z\&( {JcSdqɨkXnhR1VlȖse^ %x3nK ߚP =CrA7o1x'3^RL2(̶fݍZ֙,Pp<Cy=K EEE}Qu^`~Ar)owugpJFF#]UAv?쩙|ÇKyyH COt5{eyanPY%Gnbr^_5Db3=l+5q$:Xi2γLb,)ѻwoC8hK o|moQ.Bp{DhtɁYj1G:cMI#̨o FY%/+G*5H'ev(-iC!\ V<[@܉՛壯[`$;qPj>P'h?ccc@މmPLBm֤IZ7GdkV]&3$&&zmh?4^=aNm%'5ɍӾQ/ohW _gɿYϢo5Cţ2N++*Ytrm9GA9\ (>y⺶@1>|p  th!:Z=! pX`|6Gc۱?E~3{~@8X2zwXG9_v}V?%%Z6-% jNq=h@m&C <HIE|YYcѤFiz-pQ̔Gb}oY9SC¨f gCږ%0Kr!d[a+=rRaɊ!xNvv3nb̔pN+lDɣ;-X$%%i3i_<;GZr\vv:ꀚ,oCר5Ñjc *3%xt҄QƳ_vM851@e4hРـ۷ճ5$@$!x af>C- ;崢}CdCU2@9WW  KJJ+JRmIʡ7C|s_Yy}`e{&e/gkΆ(WLP3Ok]H!@4D y 8 cc ~XS%]R f<pwI>>Vd؉T~!.ף/qyEpbhm:k˫ĪECa9ͷ)ڼY| {DL ĬyL "7|!A>P JK㝬;YYr@ th j0ӝKQN3UΐRZ:sЃ*%gvd-HlJ3aLRlzWM,9k|oJ|D1T#J }*szubC i{C J&lO *WƶZ@ Rα:[%̝@ٮ .C C:,fߤ!ҹ.F 'inkrϯ#ryEs2j@ PU QN5^oJV+C*At+&*8Z#{+=zwݼ#@؁K'TY'+6fqj@5l?D ;:^IϬ3U51\b2غ7E=oj=orlg; m[֌H`ڿm3pf䈻:A>m~ݚ6+hvKpP-vl?+V 0:PMr2!C8:+I&Cg? "311pD=-t߾}-m eee!=>$bcSLdʍ&CS)%2AG  + s{W BX>vY|G̃ڧONWcӗΉV~`FaYԽzdpf#Ck heee~ۆYZB`I{_dZͤOɭ )C@pzspZ3fnCHRX檐~g$S/+kb뇕Y^/Tn+\r/F N,i| wo{C5h0Px, ؉Lk(N'l,![R-免##-5peʗe5YEoJyD7=%&Ĩp1!:P˦Q:M=G{H]CNF%딦ZeZaw5%%Qj~jVzE#@cx Xl`FӁ*mnc5M@LNrM4FރI$Q%L˔6,YB@Y$)ݸۤÜ+md+a\ʙH; PN7 lw|аiD(Pd-eYEDt8XDz*QWFKJvԞŔOê^jAҔ 3-A_L[e# .@t%ja LzO``xB{*e ߤ?fhM1յ:&;a_B\ߤzȌOv'@- @$%% 2&Ĝ7SN! i<"Tw B&uKfwcIHV0`/bZl%j@#7! k0Cp laiH(:Y? hb\7Adtv 8P70G$@#YpݔPvpd}z$@%@P KF$@%УG~z|DoΛ -P[xq@ݧ~v) 7HHKrss%>>K$@$ uuu#ܹs審[n+^{B'^<\! HLL<ݻ +I@EH4K?QvIM27ސByYfɆ d̘1.IHB@iiiZP̚}h$bڵB!EIU fyO?zw˥^A755i&]O/>zn^!L@_ xp!?`gr~3~FUk4-HtXZZTT}GKJJdΜ9X3gΔ_|Q`٤ѣG뗩P:':KCCv7<0 |7sp<4cFPhBۧ'ܵAsBƻ;lm~6׻#pgж*g~~@aEԩS\r%l޽{ͪk̰ -n&xX` P oI C(xG˵&7~ࣞ|O=Čyy݃\#!  d^FOL!lB56h:adz؆ 鿿eWI ("A$@$h=D6)-- B5(qֲ(% 8P'*D$@$q27 Ifzج,. Py$@$@$@$`7@b,/ ؜P7 O$@$@$@v#@n- Py$@$@$@$`7Q/jYYYbKڵkeĈިQKtD{ ٰa=: \uK͛eر?]ceǎr'v| >c[$,kvRZw!gϖ8 A~Ae4h{3sp-'FXE@{so-ܢm-x,avyw[o=b-y܏?@]Z h(k NQSS#{?u6V :;΁FL֮]+mL=y5&aH8kpBپ}L>]L"9~ VYMP(',k֬;w/7|SN9]3} /#iHׄ"MA?Z,Y(3w  P90\|LTvj0;۽egD{СC^-mw`pG;@CI"   8.ڀ    % k "$@$@$@$@$@44y-    z\D<HBG`f#ڍM+ P~$@"(2<W^y9 >  ?k$@$`U@2, # g?OMP3gJjj\{od:ɓoٗ.]1qD}8+;NA$@v !x;H$`[~ 駟.F?SB~(\sӟT~_mڴI?1cx8nΜ9 ؁5vh%HV^-/YFF0j({Zϒ%KWp Ç&Z袋h;tvA\! " ؓʕ+%''+|SNm2_vmrgȓO>)bI&yϟ2eΝ;B$@v @2 ؒl:=*Ĵ=NΝ+JQQ<s%11ѻ͌z?B$@'@ ؗqMI .4˚5kzz~Ϟ=]J]]>v׮][P,X IIIZ`5$ ;jVbIlI`{L <&3[K={OhNkkkD/ Sp-Ta/ڣ^@\!>lL,$  @p|뭷aÆfQDEEs='[lB'ס|׼]S}}9#p{  (e3NKYN h3SRRmU6ЀӤr]wIGԶК2  m oڰ$@$`Q񊘜,m̶$@$` E3$@n'`XbIMCnHHHGP5)+D$@$@$@&@ґ Pu\B$@$@$@$`m@>, 8P5)+D$@$@$@&@ґ Pu\B$@$@$@$`m@>, 8P5)+D$@$@$@&@ґ Pu\B$@$@$@$`m@>, 8P5)+D$@$@$@& g} :IENDB`patchwork/man/figures/README-unnamed-chunk-9-1.png0000644000176200001440000012662213565477507021231 0ustar liggesusersPNG  IHDRz4iCCPkCGColorSpaceGenericRGB8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|U\ @IDATxEAIQI*0#Nx3̇P0#"""9(9IPZk흞}ޞ ~]Uի9$J"("(@zE@PE@PE vE@PE@P"h^E@PE@PT>("("WT+Z"("( E@PE@P y[+SE@PE@PT"("(@^P4pke"("(*jPE@PE@+*nLPE@PE@P"("(yE@м­)"("}@PE@PE Tkm lٲeq7Փ7\.]nݺ~z_d3i7l3iҤ{ӦMW^]jժ%?SdnXzu 6+VD[N F_vm_eÆ WREZhaxC'C dʕ[͚5#-L֭3kɒ%Xҷ5j$[͛ڵke͚5eVVM5k&˗/י$LQE Aeb-9PgEB(wyn`xbHQKte ޱl=c,̜>摦MFee"e]oe%]5"("(@@\e*"(""/4"("(@.Pԅ*jӧOlDE@PE@Pr _n&rtU *"("PϜS})q{Ȑ!Ҿ}{8p`"("(@voԨQis<١E r([2)" N'.%E@(=\k aTQ}:-RE@h;0JtW7E@PFIժuH?72U%[ʁʊl˲ʮl˱ %YY3DSE@P2"6_(NBC%e&BA6$uՋBUN7≐-O/rxf9G &'̣Rz} 4/vOhmE@Pʌ"dTuv?lZPE@hn))IE@Pp 콥+"(GdJ@RPy27 &g}6 ?t-MRE@P2"aGE KJ,v)6m044_͚57ŞK_V!~'3A~>dJ:[~mۣN~dFld2鿁wXK= Î҇c }5L_( v'< JgWF(+J O\h@$J+ɏK 3i(K6CX"?ԙmugM~_X,lq sk>aq䋚'l }<YXnyTc&l0Qvg`pϵ"MRTJr Q+H1s&?~{wyǸfNN,QyOF͏$j^p%Eڵ(y=yIvp B]*QV> Jرe2?WÆelGxd\q:0He FyQ '2W9A4@* vɬH,[-GPE@5k֨ /I$O(R{h'EwY:S.0`s9YYE@PK/$^x̚5KnF:th{GN8q~2wo^`DAהBR'e3@yjȑ2|pc/᣸-`y"h.P Pn+|*+hE@P*,zǥN:L"Μ9D޳Q){J`۾O?4uFw_P6.D=say}qqG9`V[<~b]f}zjomOǣ P{"(@XᓃA{1"ROՆy`IkᄒO(yleX{曲*z*+rl x@;gaOm~=?ZNP4GSE@PD`78P/l{R@EKR h.ղE@PX8GJpEIC`&r_m@yE@PE te; l^8(cƌ)qz-!^rC[OJ?r}6A!/}|ǥ\}d9dSV@Eå!kOMzw˰aRSOiӦɕW^)/b\MURx#+8/c=L7IYx[~r)fSO1gWÙbliq">Yt*)~TZ6s :Tn G?>aư{;uכ6mwQU/ +peƶ=x{gw׿Uz!g}f7+ E2 $˜>vlmU|B#ϗ I?qU͛ ,X f*3ѣSeڵD\U>DB%$)FhРAky7nP/,=1D!e nM~0ŇQOfv@Ky|o1}t9R,1^L"={ڵ3鉶Bwas| QrԺ„ÃLba:8>L7/x:e$_|U8)x/x#.LP@5qwh0V1^%"zrB"%n."%WnROAK0>G5?40 Cܹ+LqV(XDX}:B iX$'0~qܞ\~U4jي"GyI8-;ZF 9w\=شۯi!Z@ڂ@RKR`'% c;Dޔ'E  X gG ;NK+W5(#M("( l8W4#<"("(@ @wE@PE@ ՀWLٺtJ_]&_ϟ/O< I?Iw{|Mys`bhtkE@PE"!Rw[ Ϝ9So?sz׿䡇2EsQW^)ĀgUT•N<9\e*"(– %@ߩ]!|9_~F@hD\}ղdɒ/䩧2'V'cK TE@P -Ch琓;֏pi="n"7 ZiӦ](">T.vƎ[*bz#+؂ϧˬCY*Λ7O|IySZHz-ش;e=#8„8+-[\kҤIYYwE@P"s 7 pUWɝw)'N4E -<4~IEf h=Ђwڏ /P[y4%7lYڵ.Gc9{lq?ƍde~G  /I ([Æ +3&PE@ h8_ZO.3f̐{jݺ<;B)7֨Hؖ0h}1cJ+ 4{ >\&L`!huQҷosPaѺB`A[oDڲeѣG.+-_V"(@|'_=UI[nv۔\` iz}`̦ҽrGasȖ03xGYx=6y\:,g7OS{<8ʱ؄ߏI [ft;(Nݫ(`cO 4)}:qƙS˗/Og q u}XYӦիWfXsgLD5j)/]6QF6msTS$^V[e!Ɩ~҉~938IJƫ_vvNs>zNDo3F/2;.]wiv{LVXa4(^~e:th*;\MyOԒFז{,s4qCߍksxоlC-mذ` ov`(gL~Hc QaÆU)+? 1(,1 M56YQ$*f(uR~҉>97o\RV[W s}5L_#a|<;zLxpXy:l32'p\YAifE{g-zkdl5jdƎWi?x 83& Ud"{ FXWE@P\j890zI'gl3%4'WE>):Ț{ζ  q`^hО("D@gPUG=dzIZ'G?S 9 *#q,T=ͫ("$496''[=t&(!<)p 䂭8d\@AO*"(}g 9 k 7_Ct?,FuE%,o'pN("(@SԪQʚG;/9T)/BEMB}r9Ch_T#8XE@P;[!W ixe/U wRݒ. oy@HՀ&;}w&'#;u$Æ Kgʆ"(@EBErI_HKSr"6IݫleN~ʻܱ${ٲeFtr5HVo8}V*D ѿH3g!$<+O@jnstq=wǐ4LH@+ujیf]Y $<'É!_IЊtCpX M("P hga^o.8QZ>jK٭B'Ҽ~C5t ,XT])n&~p_oR&i\giO+c"Ud;M69-\5Aa?\:R5dγTazCH UV^zɀȝȋ/X&$!(SyA{i_;ȉЇ0VӪalfjloxK#\.\V[,#!tn!KS Bc,NզjwEYbSAAI~ ~0W.s\r%&&-ےߤO>yBRvm''pB+P_~)}D/kזjժ&A0},K\u|Ryݖ2~jC#%|^w)l:G F:^#*RTG/! ԒjUo\pHu?ckLд|}YXO|i[9y?m~exVZBl|6˦ԎiݺugN̉L4l0UgV{2'Rod…ңGiР&.]*&Lmۚp|Μ9;erǛOGhڴR^=wZ~ $O&]v٥Ĥi,Q-XPRF/ziABJaurơ刽jm SVUf.|$V*R$͜-[VMKR R/V䴷\SCМ~?LD*vde yvIA+]brҨQT-Zg4Li.<<[-$J+d\6N'-x,X2'T[F!8/7͛7G}T'N믿^8y衇SN#8hǎ_zk7Ɖ3fL)ܹs6 "ki&;w~A{9$i,_-_H n}V));.#)Sf5Qc9׺S9[mӝ-+l߸۞(t֬YF뮻L;6*rt] $gq|?oT#GÇW_7V`R' 5jقB-L i=3һwoM.l?3c7ݞ*D`!k̻ X媫 .@NUTBXOL4}~=#ml9 ,[6]h49gcY漣Ess}9=nsx M#vkN& MnX$

6wx WWU3k+<;X` ;|.=nV$iÛ߶cƍ3 Û7l-ZRr`Ȣ M6?ɝB_7qeqݹkPoZz,_]SV9[>\yNʣ-_~y~~GN&2_|axa瞑l~mw]/^,u)!1/_nBW; ^{Od:†CF֑3v{챇w}f+e 5Ƴ S׵k3{c"dUmdUA8PxRoFaJW*ќncbj`5| PG!ڍ&J^} xME%l*EH;,O?YwtM;(܎E[Z H,cZ6I 6a9DmBxV q{aÆ1A8 {E*hPwwdsN&73{Z~=U[IJ{b1D{weҾرBSs`Hvkݿ{!;#34+XG =\+Md% 9u-bCK>Biw`Ln[Dc3gQ6۱+o,գla=M&^N)% ]Vȸoɸ)e/q'?B)&eCQI&q`b@qү_?9IHm  Dhr Ya [^a}EPgGSyQGia!* 4v ccoą-e6~+4gDB\¨R8t㷔S3/۶Č%?d037Ѵ#[% p='7q:S8E[1§;j6'[s[~+;NCvF}o37XK~+x9y!lsb{M Pljt`2򝎆}U` Q&,5J(냝Ri p~jOt!C-¿RDϲƝN%E@O?]vuWL`]( ~:Pp!@VDvY$56+s՚#R(f}IcEE8{lX;&'Ǟ`+AnM: ׿eBn6)?!m 7N8@vJ^z 1Xrco*)@t87n8U-dܽ7n^zDfg. m}x .|GaW>\U ɗ4>Zc;wUFDzπĶSD:Í+:d*Fh1DGGHnu>l@%V!@ Qi2g./CPѬ .ʒnD]7HI޾J"^'liX}nOXb E wR<bïZ ShK @Gm'6}zmS]#M:""zc=f1ysr$5frw: +!~w  OP3O&Iܐv${R/Zb-|IMy/Ů% (lqEkr7vh% 0%)MIdACe#Aj M任j+ S ͏_\5XPVuh^42Jx1av|oC{UVF3d}R@r9 x{gP9G(SBmGI#&W;A Cjٲe4mGG5AR0bg} =\]x[p q Mh<,~XeC<lb@(F|3*U>,x1y뭷Khhp(!E =Ӽ82S(C{N3Cs .K,= ֮,BA( *4ԩv_%o\U;K&PødJ`e{ {v>h׼c2izCHV;tDG"0P,X`gs gPNaA]XKQ`Ԍ3́?>`c젙o?3R~@)yM <Ťۂ] M~4f[iԈTu`{F#mClx|~Z0( ) ^ `\3 2Ѐ,_\>C}Ir%w m"S3'|^55 4Yiĉr'-F@`NK-fI#hq3gڼ%ISصkz8y 7Ar(ݺJǔIJa?Q7{f#t<#0g!V;QWXyY6裏E ,m m%H!A|܄ySNWgti\X|8e% CȶwR[_yE6XY |&_rCƒI ˔/|ʹ E;0aftcB>+b!a5C q 2O= '!T`ywVI[{$kA~)HGրJ "EO| Jt:9AV:V0G0WA4@ bQ#]p 0?o7Kq-=(ǵrPEޛR@oLbg[Pv\=T)ϵoj?#J|iclxZYL7Iۀhv3]Q4v6/L Qy~O:e[{ml&AԈٴ̣޽>fPl&0hI :hРUŒ>'s>U"Vv <0}G7L]ϼ(}+PGX!4; <zR17&vA=4Nrm/k*ZUp=_B ĸT<3}B}{B;\- ~7eS*`E6^J"?cb˝8vbB5'uUSRx`]}f]~?2AW ӼB¶{;hOfw}ݨ:!sI,S0G({æbߟH۽ش/}\c@AYy.] ?ё#k %E@ ~Z.]vE H62RnjRʅ;]Fڐֳ#¶l҈v xgNJ-gv9SBm@yRc_ 6+kb4G*ud q<46,l=1.W8woE" Kƍg}_7I4+EmlkXF ɜOqV#sw{(N\5q:5; |E"?o%E41F2s{.L>*Ӿ=s}jڵQR"&CoZ"P  R4't-$|8 M*B-PQkg.k?G㜄b[Cv-[%alCU$<q)Y_8mdlfǟX|0u("(f.&LW_}e3؃'@C[?vl-&h6t޼y-iPGYAy9һ2 RSK52p,ei79H̶8Zb{ ~h_) s)s β?^w-eՓK P~m\n()"ċڧ=|-9xi;~8ʲ T ef pf+}wkP_4~v0 A" 1iBci?>#RN>'|9Wm횛v?8~A9'f#g)@f @"(@BOEAH"aL3fYg2=llyg7C=XX춍HezAZ2eV١݊Tr ZB"J< 8RFX,axJ5ugR^; WϕK@K~'SӔ@>͠!N<ĬWTE@q{ahB0m@t״C>m~A˔fp?)o,ݧ ¤m ~i_fT~3–mzՀf`9:;wQg"O@E@P@-K>Za" *gU@Նw~<6Md՚͜{뱙 Bޠ@IDATj Ňȷ{ERNv [?UZwn?[PE@Vs=ED`ц A4.oһb7%ӧslj2Di;3[lFXe˝<뫛6R~z&@h5v&~MHP*qȐ!9۪(PmE@Pr@+nbS C }u<))y{8UZN.8N78Z^hIF?;Zs饗JN69#iTRE@P**h Ԧ'Yd Y\PWv-xҊu?W1_0ErHi\RU R$9"("PYDvб`B o ӶKUFQ[E@PE@3)ZbSM;r,cͺ&h1 Ersʑ@|\PE@PG{Js7Iml7Tq4[D"ӿ)-֖+ԀN>]ƌ:Pc"[o%8]D%E@xP>?TLc1x͚RPTV[mt-?!$>Wp"<~VR$]l&N0#@y[Ç:'i@EA x{gwruYgI>}|"ElpW_n-gMl)3ޔ#olc-#HFkd"~TnuG OD(tvG}4 pJ'"Onox2k,s:y^K/{.upfkÁ{a9c5DaZ?`D+m6Lݤ%.j^k5?Y6aو9 ev77b[Hȸ2ew,JZpu]9 (c9j]ۏS paǫ#aaGPBY`ϼ>'y#^,w 7`@ojX+^~=q̈́SX#3SygƁzϓu5Qq+_P&?;MW\ab2ډƳ!L+G-1qztoqNQH/0ݞ0edlp#/w-'LmZ[?w+i?x.H5@ƥX(P (QI<}*j]a>j!0ylt߂_^?'3g5\cYV߾}5d./+D6mA>jTv[Y?8rŪ2ef#B 2R#&%ZPj2d bѢE&oVh.`j~[H}Ϧ M,ۨ~Vbˋ;,}8AˡnpbŊՕH vQqF(Qx2jѢ DB51LE/hx#߸'\C[g}/$u3E"0S(uøgW0Gי#LFsبQ#3/0u#OPoA1Z3i-]vMmD/1+vE_f Z噊oUUֶn+E^&X#׭w `]5IW]L1. ֮&ϏHRsa4>x6]Y8o5\r^y4LvbAi745&MJ}\1()@obaX5eh"GK.?m9o&b5+Q+l\ UJQ%vX*h-k.՗%+A~-lF.:M9gFkͽkZvStL,lLs%څ7tN)h裏c ."{Y x+R*^(@Z|77>\1 2;ŴME@oi_h׽ K?G`͆Тe[<>4Vqeybݾ(w'!Y9(!y&F?q>_|?kKSeCD l۱yEfCtQFɹ瞛r_3<Ӝ'-6KP488;ά؏=vXG+@0ؖ?%T@xm8pKJ_n%̓77Uam'EreUYndeMAE$s]K{O[4yTh"Ln]XtkE@ڹMQ-Xo*"(@T-s^N㒨ئ[܅/[_4OsSQ(U9gԩңG塇}G} >\=PyGbsRIPE@lEn9_| 7/vԎRT,y&Mo$#6U{*p*[]`=4.”_"E]qqD:>9kr("ĀNa}g˖ך\={hBWW}iAzw^$B*ʓJ'e:[.^ .4c ąkAvɩz(G0_70BkT*s1WVKkU.9+ihIoлF(_;.EΪ#CGvMT3Un|`z|@"|;#P v^@zjJ.TN vyR1a/2}K)>C5qiV*$76!'vmV"{mf7-g[$56Og #^DSrmdҤIh:=7}ق{D8}$kk#o-gu(0{9R֞#{WFΛ.mVjHN)͛ˏ? Zz|w>o-?.-9[8# M*2;Y)kY' Nڵ[~ i3ٴhKZ,v`"G7g,~=ʰ:ȏK8mw' %}3v7?L+ e!T~ {-j| 8=GP2#pAo9Q9믿*cD N (2X$Qp)ׯO{^*=86_/uMa}H^?x)[UK$gXor~s}V:ph '~{ӥQ4*?`y&MJvҡC㺉O?t4Q?\r%(uRfQ<"T6~/BǙl -YԪUQV8{*C?5wn,F~qG-ZUy|u9fYyue3qn?vV7M~[~46Ш5!KTO+ʀs;Nyn]KFAHC~;iРAW_Ɇ M(.O>dyS^ FlٳnݺeOW&h7`b b vNo9?XG_Qw]}og,1xy!cMQƙ;iw.e1/Gvڂk&WR˦kS&9B$4wQ]sx7GxIznP:mJ茳*j򃳽>z Fde9z^fѷ 3 S)PϤ , 1( ¯\;G]Zovž\~g9eĈ~,fDk ќӧToyv΋u]r=DãJLyӹO?GPܽ/HXQ< !>1J,睎wCfLx6ڊ+.vˬ믿6iσUo{,PT:6m*ݍ. lD; =' vn]:܂M4Rx8dn,[noFLɋu֕lO>1ұ %?0pO8v^Z^l~ ˳״;r'q/(2Q|֕Go_OsN cG?,LnaO()e!B6KYurˇZ۟m-+~*{U5\wђn RMAhA>fpqjJ-,=2zٞ}YׯҀ_,ԃM!VE@HD|ԝtm|d?~=ɬʄueizJԭI4X/[;g֫aݍ銩pTpԿA ,C݃ Ll1Ҙ1cJeA@9 fм'TIP |&^tEdxܸq /$7ep<ԍ8ѩOҶҸ.T-k?Ea%2ll&wyC 1B( zk^+@`z'Q*&S*g$r 6%$d Ŋ<.yc+V}4{n]v>J"(@tIfySaRFc1tb\ۓ8\@@(rz=k^.T 'hn3H| Nm"w}7lM( B@}Ûin1ԥsB~ʔ)FY+"T*PT&~7T=XvAy睜(I>} Չ)'oBCm6qlJ5kL4w߽|1k3 !F9['@ʅC߿DhB{-}Yq ѣG*d'Rnjr IC7pq@05qDGk̇ǩ x~ ??ķ~Lh( ď{;9uQqRRE`ҥ8M"@N:͜9Cc ?c&D0 q÷R#ЬY3YjU3R8P=иIvӲDO)P|PoE7D+O@6m>_3~OV⋱f)uՃC>J0?_{&믿*y„ Eݒ%K?4;sw.>#yS?xA0ʆ <իM1&/UVԪUKxC )Îmz~c-~3ӕ-[UNUZ%CTN4KN JӰaJ ;,'iݻZ$U<ĂhРA'M~z#P=ݽ#F{Gg{FX$:-H?ٳN϶n+l_yҧO~64gΜ<»-~[a("wSV\ UV q!HVpn\DZضP%>(GвjDہ1%:w)L=ٹsg;Cz{K.D#'tRNiE@%,!Hln_,!c O6^C\ GȸxjѢ ,- <[46lTZD֦-*er83Ln"D%@"W jʜ|dn>xl6f¤N:UF-dfRB_~;w{%E@P*25ԩS|E>JA$ ~`/JP$܄4[ow}m {zO9'nF+'{royA~ر~S&{ҍ7V؝n5e6~+@0vuWoeѢE&4lq0 *ĊF8oOSD"9k,̀zL6ư=a{1[ä9Ӎ߹Cw݄8seunH7n3fd,BG(N%K/Wn($fޓ7`ռRa 7ޞy/6 9묳WEElEl{oH~';^/֮4K!-")_%ND.۰̟?f j׮-įVzuۇ ja˘SԲ EOlG َ;hL0?dtD?l3cω܅ ݶӍ7x! WƢmk|XQ^>PGԺ[6~+؀진uږv{:%V/'D R ^l-|]uץ=#VI[Djeۡc(DTW^yŸ޻Rf6)/ ~G97Bh_^{)x=ny\4۵kg@x=CR\pSB%G%6S^)ƅ@(u!ATA[ĘWAIƤUiK9Ў[/eY"cvA; 5Nʣq=h; BE;j&zT'L4)^{R%4nI A}Ϧ 7;cP7B Щ;yawԶ≚$`,Kq !hrQN2lҤI w#+nƢ 5,VQI|E;Ӎ(bo^ʂ6̂:Hb, AWSGHW>=cl@Ӂرc KTɓ'/lOUܦDXHm~#F%\1Nfo,CWnoWTn@&3l%n(P$ B x 4zLgy9hI^*wG8;fňM$ 3ck7+;f~E@| $(&[R2~ejC[|NiG<~cѝFE@ M(gVEh`jGiPhTxo+LL1Fe\'Bl99y*waΖ/ oGPEpK[qC(+. ,8Bn_P\m:I7e@ֿMxfc^9͗w:w\j5ݍ;dd̙SB$/'q(=^br(MJv۷𶖗+݋o?_P}z|hBrCzB@r&rfüGYqFfZlgH7&mz7O\" ʀ'wcw0#G!G%@"~(:,{@du]wE ]a=Cgw_&Ei]w55N8A>_IG&*=\)W˂/(ͯE {V2v KW:sBNck<_h.P2smbɶ'XJ+C駟Z1 Ϲ;P[P/z7-|+WU FJ B ~Bm24"/(,҈pP:we!@+˓@Dȇ!8vWK]vbD-HLJXrO翶zwEgƋIE@H%ph~pZ?좿/Rw+^主K'|rE]zU3u-X1c伮wyԵpœ9!os^8LN=ԼUH8Q䊜b1ἧx_%NjƩB0),EC5d g 鹼OĽ-/‘{y՟˫{|䳮|;Gkg]`,uY~y~{1oǩr_ByRʧ"("(({1ἧx_%aÆIa)UUnu"E@PE@P*"_IPE@P#P_X[f8'd뭷.Qw}'_|]vgҦMZx ?;ԧUVqViZb|G¶^ݺuSoذA>3Sw-Zjشi|ٲeV_*ULsΕo6Kƍ6U7|#_4jH[K.>l7i$>΋ŋ:սm7ĉeΜ98?c[vyˈ=;w]q_ĻkԨ&uɄE.y<\R;c=VtT`Sqq}`^yS[h&m /LtMϹ/C:Tl/I .(Aƍ+r?n{_dz"|ufCÇ"tPx)Ud϶g0 >tmsz뭷oLp8g2☃fI˄w&SO<1+K~ҺukٳqS[oՌ5;'*p]?o\0%}w&0(x7u=f֏8|:^I&,rf13S~'ZD"YbcolCdr!ra!-H{7tAg_~e{_|1u0`Fnպ[mS!}@).&i;}h qrכ ?*|?#Pg[Λ☋e]fz4E}鞝wnv:[ko3c;8fa`WTb0(J5jed Q*BPD# y`D BP.K蚞n<3]w[U{Jcumt_p|}+'=\y {ޤ>j(c\JɆZ~qOTZmRQ-ITx4<W UUx%_n'U4IEΤԺnRyԩS:W향_O?M4UkugTU&]ISip;u㕂 /!y׾UɶJZ8 CC7b5F޽|5g]zռ![[dN =E6վ_W:?O;@?>CIa,f8~UAsS͖ZOm)).#Aslc_vd8oC?zTskt#mSɾORYdrt3gsVNy'|Iv ,+W_|j4FRմJ@E.]oU17tS1KzJ_Gաz,K~ҵZ]tU Oj/#U8UQ+Htlokk~UҪ'*SRTLRCׯ}~ @XVmP# Ý?:jvCIE1K.݈/=JTw{o$֕}jiPh8lP34ʣtnR:b7pQWVRq|Zt|:uc_i{s=%NyFaȑkSmJ1ɾORYdr]k%\)(zo MHhu]P9='Riuf"`c{qnT 9 N1]IA+_W:m}6̺i㏷t:T!ٌ֫C)S^Pt*^W:dˈW:7؊_WU"*j_RyIo=OM@񇩶)|mK}"2SW\'[o*E`d;Aܭl$(?Ak;tcڜd*NU@yT:Tb?_ 7Ijg2_aOP{/*-OǾMjowc=p=k_>Fԟ;M&ۦL:n}$6%Kd~ɖg  @ w:YF@)@M}֍ ht dS4@(@d@|sL%|{.4ۈ PW*)ճuI ξ`K@@ ue`,2@f^vk@۫ʽ toC:So^x!E+o߾MwHO<ٽI{PC!V^ӉO{РAGV@-[f<{^wg/vm7 zU B/ʘ8qz^{ 7&i~^So9vZv/MCB tn71LԛҼ[o0M0 7o;WVXa=z@1ON+r;8&c=[i4 zgLwsp) /t+h:Y 安S ׫:Q]jQ揄@! lذMΑ_?|csiut|ԫNsuԩn9zo6zη}l>U7s:;<>} 0:c^00`{OyPתon/ΧzʽZAFRA ĂȚT }ػݰ+Wak֬qϯw+ֳgϚX?~…nѣat P:ڷo_ ӧcqثEkx %K{wM&&>7^R,(~Ё@ g?W8b*5&y+jjbx=U,&Vվ#-@|\^T͏hʡsnG>c8W*x_~֮];{㏷Kڹ덶־/t P*Թ/f̙Wcz?&15o8U+>ӮQ"={N5^:]'.jwjƟ[Sz>]TpYgs߬m۶j5{@M+lpnK2 䣲?ݺu: ߪU+Wݧj.]Ѻu@?=k:wyfw+++XI6_W\P]TO?tW ߼ys˼ ?X@N|Oeomƍ;w 4VO_D;vh% 7,%)FܱjB;܍-ZpiIImT%=$ Y@Aj ڛyW^F? UO%]T}Qwcѳ>JttjGħJ?5>r WO%Am=tOju'@ h, jIKW \v.*Qno]suwȫZ@ \wuS7T-b}]t1c,vڕx?QFYMu:/_n?O]'!P{L!zBJU+iӦIM\7!Z>UmI MeA-IQ{UBϻ Ǝ .pm@f͚EJPS+#L6lnpƌZ0vCJqtu^G;\j|=V@ FN6o4+1e.vUUUG.|StqnY_=mgtR E@,Vlٲ݀vhTuS=O@ TE;cwzn&H[zw3:㞭۩St#@L@KҹQ ts55ײj/al M&nvj:P{5V,0g7N=l^wOMs38pOMf-gm,&>%Z\0YmzQ0*nH6w#FXAz赪UͧjuDC@%OVVP429RջM(l(@JMUǓ@B -ĽN@@, 4@(DB@ȢhY5  P3  E,j@@@ qg@@ Yg  @! ^'  @@Ϫ@@B -ĽN@@, fU# (@Z{<# Y(⺳m۶޽{XqQQ}>cYVVf}giӦgϞc}2WZZj:w091rB]^߮]# On)`CYoҤٽ{wޛiPU..~)..Ozy;yUUUWW/d=3ּys2Ay(1r)IDATB]ҬY3۲eKpDy?*y}v2Ta$  @@-@@R D*}}/ŋSfD_z%$@@ D&}glرͳCG}d#Gӧ)yM_y啶bŊ:c   @~-36lؐ1a㏷K/Ԇ ft7x'6g6mγS?n7|7   zG7r)v7MFUo߾nؑG*O{t˖-s(T:ǫCwg/iٺ5?3Z߼a#>L&x=8F8 I|_P=`РA׭[g-Z<=Fgƍtզ^jٲeBi>kG&ɓ'ۀ|!@EEtHCzr<$hjC}ڵK_ %:K'\kt<~Wzwútb6mC% K~QٔFݎ'|Qw8+;vΤ: Hr\YT黕B5W5ه(.=#̷n:t"m]&J*ԩS 1|ر߯]?oڛ[,oG3ǜ.Qܮhߊ( qU][x}z8*"Ȅ<koN6sL7j٦H[*[|~I'ق lʕ5k|ɵG?  @D"[*u… #z'inln:! DO RL>Syfkժ?~ɨwyvg*BLt  TL(>L6ڠ菄  mȶ6[  V4!  L  a@1  @(Pl̄  V4!  L  a@1  @(Pl̄  V4!  L  a@1  @(Pl̄  V4! ( 5WTVVf-Z\"+..֭[&}QZZ1hGc䋍=W}-wIMMM6!Rm`^UU&)LAwm۶`QTuL`ӦMˉ.QܮA5Eq_pw~EEn niUVVZuu۷V5M6eۿֱc >43"  <  @C1#  @0j̃  Z443"  <  @C1#  @0j̃  Z443"  <  @C1#  @0j̃  Z443"  <  @C1#  @035{@@@d]vٳ>Kٳ}]4iRBCڵkUVn}rt  lZUUewy__a^ǒ%Kܴ]v  Q^ .W_}զL?uܹ6nhׯٳgۀs΁Sovyy٤I+))_.f*c$BHvFMRUM`4kߟu cD&ȅM6DK.-Z$ -]^wq_^{ :OqG'O\0Ueee~ȮD$[nWnW6L HA-[|Ϸ z=X>}n ի=Á__mРA,m6[zߟ*Ru|^N)ǜΛM6g>n4HjEEnյtPҪm߾}TӦM]ޗ w1>c^xַe:J7o\@T_ S4 @@ ;-Zd_W:|r7l˖-vu׹__555sga2z@@D>U٣GnJя~.">| <>2dH`zz@@#6O>dVm̙p_~m߾hЁ DR %*wb:@@ {yf5# G>ZL  `ȷmp=S]o*D &0@@ e  & A@ȠhqY4  @h C@@2(@A\  (@h@@ fE# $ &0@@ e  *΢"+))Ȭ'o"lM8S6pdSݤr(AIqqqK,XR鋣iӦu04-iYN>-$&v~O^/8F{PQW-m>4k8x+T&555nZA{={dW>׾m۶=\3f|֢E| Ӄ  Pi @/^lv[܄T' @@HKoI RL# )P=3;uT  Pxi @Gi>`RU۷oOx)Rz@=#s" d_ -n>ݻ>o׷Cwuzg+{m…7.9IH@@@ZΝ;S]i>zAlȐ!t+Н3gM6ͭcԩ7@@h%Mv֭[O?.]$,p*|'\馂٢˖-}4o1ӑ~֭[9(Z+wu͏ bw nioKgM 0IAtҥvZ5:~7iuQt(UR򩧞;^R˖-mÆ ^8pISЁ @T8ĵwyg7!ZGK'+[V]pjժ@u~߿_}Wi P7m|QhR(nW^a  {e+QW-mJF]Ifeee֦M۲eK >G;VZ:qDۼysOeZrwy6nϞ=v(iӦvGښ5kS5ƍan :@@2"T%~Wq̙3Maړs=6w\E}ktI'G5)կYfׁC@@Zإ|;?:t`۷7USÎ;zg\IZ֯_o7t|`cǎuA_~ذaȻ[nz@@E -9|{ͻS]FrPzBeOɓ'v 4;zIg}޽>  ]Tkv5׸p/HT;_ mܽ&T=g2# HKإکT=Џ  PXi @9NS;vpjy 7nj۶ma[@@ii|MN=JԃuCJ'!  %ݡg՛^xaC  Pi @;A+UK5  ii:c nVW 7@@@ -% @/ׯM2zI>   @A VZm6|$@@$β|^uS0n:SJBy #  @L -U_~}6`cMwǞy@@jihĈ6oǵmzӁ  H3f̰iӦ駟>9kz![vjʍ۷/h@@hD6ݿ=c6~x޽]vev饗ڐ!Cu%K؝wi]v @@ zmZ\\l> >Ŷk.۾})0O;w7wZ*~뮩{'! dG %hѢS9pM89;#RK.ݻw;c宊^T8p?{=z?yd0`OGMrgAE$ە(xC0 ZWTTg۷G!@Pm˱cǚJ-ӟ&dcӧz~8xn̝;w-[x|f@DTL&x=E͛jHL[nP- Hf%%%m۶myoRUUzG:՗ިQ쨣'jikv!I'B&[ 6ad V",&A<ꋢ(nW^ uiӦqڬfrZ:gT[]]l0TF v-bG}tMS;un?s;Z=q~o;  .EܹsO?;w}gW>sLWyEݯ-[mOO  @"m9sj)t嗻@@+*]g}Ę@Ȏ@c   # 4HA|̌  P_1=  @@   # 4HA|̌  P_1=  @@   # 4HA|̌  P_1=  @@   # 4HAseee֢E֭[Ɔ6Vb#衾(FrgHqqa]RRb:Njjjng&0Iqd{n۶m[ F5T`ӦM ]D͏IpP_MGqgHEE+weeUWW۾} ,.riƶlbk;U@@ h5A@-@@@d0P̃ CFgcqKL҈kUq+%~@@ @sjw  @ >$  @N bc@@ }H@@ ͩ" /@  9%@SE@r_4!9@@rJ4v hCr @?^|E[xqJX饗Lӓ@@+t޼y6tP裏lȑ6}:%^?~i+VXQt D@Ⱦ@I7!L0nv;K/aÆiӦL|͙3ǦMfM4S?n7|?   lo>[jiyּysO{e4 >N8{Xr͟?vZ֭~:/ЬY/4ǗIpP_MJ+!Q%%%VVVf$e_ H]*=Z֭[g-Z"lƍtզ^jٲmذuo=6ydѣߟɎ^x!ec0 v_|S[?Lj'Ϩ='8>ڊŶ6TA^{:MS^^ /3<w^[fߟrQm1{Ԯ];۷?gjժm޼9*OЏM6?g UO$k.d`6ml qLt!t"mvawvEʡJ?;uȬuMӱc4K*!ݳgכ555._g^f2d0 P&A<#u{p]I$/w-׿u9sٳgvjR˗'t-XԯYf'G@@"$P]uU~̘1n…6vX*֭ <8Bl   @@Qx`]mЈu!JjשzETUjvJ[n"߾}{WzNC\5 w z  p]cݺvt߭=x*S;aRc}P/#_|jR'  @4"4\l  @Cr =`UeIՈ+Y}йs̖ DKG}- ^={Zׯ_pDZh({i˖-z9?a,HLgqwy$?2D..pWǿ=#i_6 x~a{w#C"9W^.]}@eO@@ G@sdG  @]M>+_W\An^ܽ{nk1cǏ1 hY-  PT'  @@jW@oz T/6-?q-[fgvogґ @@€|1c?v뭷ڄ -'Mzȑ#7LYLܹ?@`Mc>ƍg&M >KkQ܄_Ñ{1 \7\vev饗ڐ!CL&!/p]wq@<ݾ̙3M/(馛ܰ)Sr=lVU@1b@uց (..G}Zh2k.۾}{kG䒜C`֬YG oJf-߶ /Ν?#I*oOQEEwqtsr&{'9cGq4V?v5@ ^`OG{LU]*T_tEA \%y @0&tѣ_G9#+ طoqv7ZyyyCy*<{cǚ}K_rխy]B`ɒ%fEu]ݻ׊?wA7-о}{ӧ/׿ -7 իswkW]uUA<h*-nz5/vg3k/͛ފDB8ݣ:,S}'v)4C)oMu04OTOW}:@ ?|W=~L$! th7pٳTjh>k *Z " L@Mzt{f͒Mq7&\4 c@@2 ]@e  @0@@ @e  @0@@ @e @&x JLe# ͤ.F2 @T*@ڨܬ @@7!q  cK/3JJ~Ϛ5˦On˗/:ʾwU/M׼k׮1cƸ &؋/h]v믿޽r*@ P`B[?uo?яw3s֣G2dM;{;n /`Çw}׶onn#Ԏ{6n8W}i۶mWO.]Îv˖-ѣ];ϖ-[J7׬Yc 8unVRIf||]7ܝ{|}뚔a @@#K '=jg+W޽{[ee1.:uvС{4UK\YUUe^{M4ɾoq @dbwaDfk@ TG)guժU{6hTaKL! ʹ0G@P@@ f  =   ʹ0G@8A@ȴhY>  @@4A  @@3-@@z@@2-@ia   pЃ  iL |@@h@@L fZ# @  dZz<UIENDB`patchwork/man/figures/README-unnamed-chunk-11-1.png0000644000176200001440000013526313565477507021303 0ustar liggesusersPNG  IHDRz4iCCPkCGColorSpaceGenericRGB8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|U\ @IDATxNj9KIY gNńg" $* 9,A$Ϳ 3UtwzB$J"("(@ȟzE@PE@PE >"("(IE@Ф­)"("π"("(@RP4pke"("(*3("("TTM*Z"("( ("("$@ V("(">"("(IE@Ф­)"("π"("(@RP4pke"("(3iӦƍb2o>get|2ᙥ3x>3aq9)١CYf\Lee]`={#|"EH|Lяv풒%KσJѢE}ۗ0m6ã-Q>g}-h۷Ovm D@Wܱc,Z(4Ty;w/?S*V-[}'WSO=U瞈y$|qR*֭[B aB˺ud|̖-[CHBc2| TR@پ}TT|"2+!nذ3^T/"NjƀYP!]/ܹs(]PE@PE c3Kh,\RFaս"("( .te̲QhѨ׬YzJE@PE@HTu[jT 7nPE@PE Pԅ_|yRq!IIPE@PLG@PH1F@TRE@PE Pԅ'sϕ… g)y޽rg9("("dd&w-ÝXXʹ[ޓ+V8Y}JÆ #^H;ܾ>i:7o`ժU&v)SiӦAx b3Ar8OӅFgҴ?M(4 ƟlPL2?g)lH|̐W|G xD2RE o" cN,^XF-7o6mژ-Ru/|P7]cy&1ٳAV^"E2!+<d~&VȂw>rҿ|2O=yl''_bfwrӦMf7A;#Pfv[9^xaK2O 2B%%,/9eyco~ÛO?L3Sx^ŸK?iycoooḥ3[xIm@ENK І٥`foƕE@PE 5ܵ$!pehxu؄*)"(@jP45kIBcǎ!ʗ/ol|lvIjV("(2T{>k䬳2PT"*U,[E@PEc渃@ MIPE@PRgw)'O΂!&L ,r87qD(ۏzBPE@PE3xV}w 5k,ѣ,\P#F 6p@0`p %+W "mY'o!$ PRE@?\GIP"ce˖ҭ[7իtE֮]+ӧO#G[Æ CC"xv [o%={fcU"( 9tÆ  ,_|E$W^--Z0DBv5kȲeyCǏ7Kh\l*){.޽S[Y̧6*gMU;BݻBVK?CҤI{*x}WuA4>PW^ye}%>f&yn}.d2> LϓCkxjޘp'Oy<N:2fA(&lرiӦI2ĕܹseժU4n8i߾}Df"x  q8=_|^("|FuM7/1K| Z,ȀW<6cjՒ+"Hj"5jԐ~!{&E@PDhƍ9r}v)]tv*gqYMfE@PE@P 9a.|E`SRE@PE@66T:/" ' 64R<4h@@Ay%E@PE Ӏ6^3AmpDg ޼ysYhq LVvz>E@P$!$ՠ~7tTvO%ySADo |_o2 , ()"(ՀZ$t "iSFF5Q!-v"{9{Lh_ F2m۶- ęe* "(@4Gh'@pǎFLd1Q:묳9!K'/r/6e>Yg3O2FI)o *mEKYZ5G#ȑ#cf͚V1/"S<|6j(b>\^R/=dhl4e/ DN\w^)Z|:D@(/9{.$J<y;)>Xb^;i&IDHYf/&ZcOKY70a, ^z&qSM֭[BEYX D /xd_*/clr_<Ζ*Jz3Gxt!ۗ~KNxCg-/"߿yK.D~GT^)"(A@Q~=8ڨYTE@pwD-"sϤk׮&O%E@PE@@cLP,]tرcСC3 e[PE@ǖ1:u̜9Sv%mڴO9s=… kIUG?Ȧ2a/dxg5d4it] dWxz2xk׮ӧ`6l`׷o 3B%A ^>n8s) ;NaG$2;))"(@8""d~wrg-(BaNKY.SNyiѪR&[ЄhVR%#8Yh8ob{H8@^ r'F+?I*O#|BH(c ;x3O?Ѡ>04>X.E MF#Fz(Xo&Mi_dL{]}"BOYn~%cϷ2T_GЗ^zyUC 'VyR\9ٽ{GgժUVjΜ99_Jԭ[l$D4>,&ZmWVgoV{cxO98=c޽{g#h38Ee;yܷoe?֔M8l'|}Z4;|rcVo+x3p 95Y N &oR^=# tiӦI2e֮];a)uժUFQ}9U Dzi%i"CtM/'Zޯ("8#j~j;76!#G8!a30:[d>6DB@,s=^e˖5^~qz/@+-{bLDj.7f9s]៰aC 1!MԈĊB(:ޕ'|҄Ez=("$G7xL;w1Kg) !&h誫2C'T}W=V$wh0kCm=p",PgkovV^&^8ƹ ^VgN1MUyv/#MR.Of7̘1AؼCqk@زk׮\rT%"Dc:`Hdo=Vy>^$B|2Y{ZCw8|>&ZYϕnNO~x/g8:yD?F8ry' M8(->s#DUWJ֨ʎ"f_vh9?X̧卽=N&ɪ l&TՓ*>NaKdfG%پ37FgmwԞez7Tz`3;赊"!_wCkSE@=q *U6W_59 `_"!!lz表Sq E@H)ddjٲYgF=#q-fRRrE@P8m;DH>ܹЅWP쵚6mj 1-0K-{n8i6RPEs8"~a6Ѡ`[IP%KHҥ4zΜ9."("#q/ӻwo={ɺ²<RG駟^NJ" |!xDURE@PA (G}M:ӧˏ?(xbRfD*>kW^yTIPE@HGD3w\tȐ! ʰaÌJ\Kt"8@m9rC}&_xЂ))"(N")I&&do!h-oؙ_y͚5l2s}mӦ?>X=.6lNٱ9Um+?iyzjT^-|*N+S|ZZ,N^))<%"DU81 ?iHql[n5q CӴk˖-YiĈ&=~zoB{I.nru)+>S쇣MpbBeBLx2Oy@'N{"ʯPx{C:v(6lڟhѢEhoBm۶ү_?ѐ"&Be[DD0{q4gI~%䙥?L w>yfY 3#M?| U_=)Y9ۯL *M6g 7S>餓 /ʕݻwjժffLlBKRqhbDD4>,'ZmWV/XscZ~'? ~< IS&d}OLϓCd+7Qv$ St=K}1J+|r-BAdرiӦI2e֮];yiժUVtܸqi):"("(@jZ [۷DtGnF2DB2A,xU\q@PE@PE[xJEdDÇ7jx]gan =$is|Mckw7 Nz${1cNû|W'zKPE xJpރ1,"DØI0cALaMlc0jURE@//ʙ"=p@>-]{)/6gh>LNf1)bp.3fLe "(P0zd0m۶`a+#XÓ'OJϗxE@P @Ӫs/ROL$7on\Ex뇞J1"S.\PtF@t=m"$r"AHHiUxK/d?mf츻w.w\r֬YpqkF ݪRň&v`_(v"8/K.7xzƍ w^߿lڴؤ^p9޵f9dǎ&G-}S}GɫWXa7l0bWNL_ l E@5^|aH>) 63SE-IzJKFH2'Z8랮ٞT~Jx' :xtFpPŋMb{.{ʻk%L)L"-Z?'}O*Eeqrc„ ҨQ<<~gSqq;<~N;JԌ3ԭ[Cg={ =c֭[Eݺuԭ[7[Ejg|ZtoḶ־\,{uB-VPR1#GuThԞPDҸ_Ofb& cu&=V2yֺE :2R4z"x &D,xX{hƎknD;3P2ZŹkLXlj*UD+y!օ^(guV5̨:t`L6?"$@V(N ʕ+(2>oٲY{7lMflH4@Z 2D.Rlݺ=:6:}!6kR A[Z"T^=ᲵE@@JTE "8wծ];oI'd]E&M 5^M[4ibNb,l^j^6(@Z#`EOz?^:ե]hCO<`ܹiNj6XHg<Qƀ?4`WJ^YkӦ/_>'=VEU4,9>}eiA4±fJ`ZcE tٲerw}@ @cӧO5jTʀLz뮻γ6b" g}6u+] _}9EX'arpKf0[LFs1c;xxРA&]߭*\~͌seСܧʻ"oQK9Sهz{BJPǍ1))T0wq<3& n&v =J7':W S_YFf78")y+'l2aR!?ynyر%/D">p|+_|aH`!d}OH|C$at{? `:9L5v#X4Լ1s:9'H E( ]) `֮];LKƍG*F)"()AQFgϞһwoc: uk"M|ɔU,wW_}0<:6mZx*K~a73'^^zIٲeVZrW$ޫ("8@͚5(TcDJŋ;ZO:VBW_ bw)Kk{yꩧR@ ;#۷o7&8(L@JÇ7.]:'ڵm20(" 4z޽&(߷L>( ?%\}A `Gl~%-t ^X/\a?§EC"(^B 9`@d3p>5ܡvEk۽{wLO?Zeki'ʠ^("Y'Zۖ.ȄgFٜ eYD%x o,[V 3gδznD("7ncFV~}a0CJbH0cXĩ駟4<s5hk׮-dslڴiMT ^%ڀz0m"("w)eG`ɒ%2p@AwQGɃ>3>=L&K" Stx㼅16 vV )"(@R;R+iРI:SȊv{Ռ@|7 u <)*=t3|bP#S @OYXBDwGɡ/g6|;|/<|"c&Ǿ}N߶mۄ82RKܳЂ 1H1σe)H_9{} ?'Ol&_~8V}[ʄ\n̛7ħt/ ,SN&MHV|owssc=fUSJof̘a:u73zi޼qBvF~d9?LoF&?O{߻Mv۶m77tz"("(@<jz"("(@|СؘJHr AM6?wEzR8Rz#@;vyn=wd90gO@ZPE@PE@p]wL-JPE@PE o22 SްDeٳgqB2XBڴiWYȗ_~):u f۠IJ;v W=ŋeժUB_K~d(a]vY5kt--O?TUT 6nʕvːRɻݻd5")zBC/m޼3+ޣ}~WY~~fx$@g=-eze…rDѣG{З^zJ DO>1!$H8A/ĉe kor٭뮻d̙&X9}Gjժ z!$R_ zg홇rh?sG  ;_Y|y/CآE sM>gϞoI&IΝ (f2ab^{5cCظqs=c\}嗅&T htRҊ1Td0>}96l :TB3DQ^Dp1 |8Ձ2S>h 24M `eҡCnhc@}28я 0xJ֭yq@|ʺYۯJ."+*L(_ZliW^ҥK<#!l2g5?ٳL(wnDj s_Sf6 KdzP.|BV%JK ypFaJђ o>{AЏ,2^| W&ڪ ]v>9Ɠ~gו*U2֬YWY^x(`h%T4n֬ɮ~)B5#iSy#2;k}!kw`gm>ɖk1 V)4G2l!R;3M%KL:N&2dG?~MF_~rwh92P6'N4ZmV$LL]Oϙ3 Zbvg?~[KB9s3իR^ciL1}Q@ի',*yG}Tz-w}TƪE7L$O=eƄ4oj@x>XRq깙@zk =6J֜p4%"0|a曥k׮/_>ۻYjz=Xj١dɒmY;R͚5eÆ FSj[1mWq }eN:)K#O8ύM(}7Һu,?B~đ˒ ^qE3駟Eoq%|Mx£ cǚߦMf4ۚ?L y'}=EK' ).2e|g3b0|MJN sd_A<B A?S/uL!ABд~%,B "q%o!Z(?xWWyѐVX[Lhk@FXrg%,141qw$ 4ޫC?l@3\:o 5 K xP+?h\ȅ~ӟ`Ν.['8'!؄:?W՘V؀Fe>f("("*j*Z"("(@8*#+"(" «+"("#h8""("(*Z"("(@8*#+"(" «+"("#h8""("@믿^-Zd2}&cbƏ/ݺuo]̙cj/r-9# 2ACEf%7,J0auz(@^m"+V̤KMf{޺u\}_ (.]jp}JK.ұcGְe˖2rH^x\~ҴiS䓦A ,0yWZ%իW7dʕg5gy[m۶6uT9n뮻N^z%;ZUQ%E@P]Ov*@Z#pG_n]i֬>9Y|yלuY֭[K d̙m6Yd tZjҤԮ]{E@P< "m"efadɒ<jղfٽte{F9(SLE@P ^m"d,_u+W'6mGa 6?lս"(G@m@=E@E@D}9ӌCIzO g_o޼<g"Lʳ")*iiEk8_^MGyaOwݻˍQQE/h&(@mb 3p@ I& Iʕ3R E0;^IP#POP2… pq)^ ~gܹs"(D@<-(E@TGC&3d„ =+"',ҳPBq)"TM Z"("(.gl+㊀"("@S֪("(@"hv2("(@jP45k"("d,*fl+㊀"("@S֪("(@"hv2("(@jP45k"("d,*fl+㊀"("@S֪("(@"hv2("(@j(jS[o&۷o|ߦ8v(M|Uӥa,8r٨RԪU+ki̙3I>'_ _ʷ+Z̝G[/7;<Wzlٲ4)5ݻwVZI%?S (  :+߿_㏴lGa0qڷo;pv F r #<ٳG͇`p GuSYع+~R@ݻW<ȤKeiѢE^7)\d[cf4|ܹS .,ErGbŊ1т(lRxq<6?7uI(ڷo/_|q\8+%ՄĬK/+:.ڵNh ۶mK6WP-j3?|Lzn*;.3򎻁yd\>ٳ5d/&;Of\rfCn0a# ,Y2L2I@y6olNLFS>L8Ѽ^~]?[+"("d*fTw+"("@SQ`ժU2b z"(. m"("6/^,/1MR*x:E}(wuE7n4CbRo Bl0OER6dS/dd{[^wNW@AMQE' ╍CŦMAqG!Xu nRUwpB=DSo0d As,̸ڵkvq Ro\E 0V#)Fc FhoxO߶'xΠTb6j'RRE Vy URE 2RjmkgfIgyNuhI 4δ)*"D!C믿^y4i>|tA|A7;}^'r2A!4DZ"%yuѼjE@PB{/[Z?SVt9X~6md޼yұc9B),xGK8o"F"ΣVZ\,oNS JE` n0g@$ܓM=Odw3w,%KHz"NψqR<ҟE@64 / gy/_^֯_o5m_RKŋ)4[߫Tbȶ-J6e˴bls{flK*Sy|o޼ʱv"ogfs@IDAT/rz"()DK<%hGC?| £fp fgϞRBo{>Py}x YfĨhNX<T*Rc&6ʕ]8*"Z Nɒ%c(ʒ)S&seq]sPWt`e˖h׭[g'wTR TШG/RE; s=ÑcUG"DS*?IeT+S5k֤=lb„ `s'N43l? E@P|@~aÆr}e %w 'n/iݺqrbW^NPGY+6pYw}7YGpBZdԨQ( dʕ@P?!0|'(v3gvi9/7_|ԩSQsϩ~Q且}z^PEՉpqwkZ'm@dX"KKs׿iٲtMz%]tRM>]FiO6L*}r(hܸr%y~:"::٢Ez)̫}"-ys(~r-/\0xGJoѢRJƠl8oSjvdY4aM7Lfy*V mWn{Ж-[fTRӘs^Hn٭gí6MymZ8f(EB<-.blmfpO#Z5~EGlxl0 t("p(P6fg5 y:BJ57PV X2aAش{67@}n֑SlC4`hC#~x&NUc+'^[oQ)smye,*{o{O 8YBSOs#رcK.iӦ]v&Eƍbہ).\8ˣk F]Hf4NC".>$%Bo56>؈28Cǘz0fG@qzle=c-de'c ֭6+غiTycrVq~w{ͳ3`ny=ww)^7tS0/?l.g9w+jժ%W\qEnE u5 bj7kh([TEaA:!,!1?#T4܇ CgC:ju[;f/Wȳ(F{ NÇ =(v*gqF.x*>i̘1ftE@pJ|%wP!]|P: &^" 9.|).-Nq"h/h?ʿ"P MC[]ko/qmQEg`7cƌ,\L ιshQ$Fr'k+  ^ᨦ4_PLD%GyCwqv}&=Uh4P(qfx+?8 ѧ^$ՀzWM"ҥK{k&6ӥF,$h&NUaE/ <+\|慗e9ꨣJ"S߬/^<-CnSQx&nYu Kk&+VҌ>Z,}لT[}lL/.#Y\goA:J? G7!mGB#kFR!3~nxNJG^]b*ʂPsHɞ82!"Ƌ[(-w}ٌ:ʀ3q .49⎹PqPF`k)Wp*: (@,ڙD =\7F={jժҜ-Ro9v0|-+F8kigN?UߥaR|bn^58TPAV|f)\ q{1gN̩2z^P aITb[On֨VN>da /\[a9#8(ub{ ȏ(/KJʾ 4,[[l"KQ=ҤNi\gԫ'sк8˲kڵUMmWdt"@ө"N;o߾'  dZjɅ^7EyE(Yt:zgП)?/() 6kK` *T/9iPsԯeKB&XhԩS vO;&2(M:Uۀq6mOڻ2^uGeS' &ȯj3)/@mS.m(s"FȀOef*_ځZUJeW>Ui>VTُs۟Uyycү_?v&rExgxT:@^IPrGeld G=](A'~_hnGZjNm={ݕe2)돬 f(P/B+S*'hI˕'eJ# _䏽eO *d͹wm~wݗ_3`?)>p-Vϟo)\/)ZVrd` a@^u7_່ Bh"υ=Pam7|SfϞ-?w+B~ǘJF+@0ԶmfѶX:jlOBQ \4n%܀a]b#'#,h3#Xr){w}x(J~Ik#|Ȣ%r'zzŤQq:?TEed[#dެN_rj3!JoG?pP -? 0 BXDDWX?߇pDqrjO<~ڲ/aSWR[}WwJCuZ@&`}NDLbyr*+8OQod7ܮ\49{{KцD'GЯJ^#Yj֬)<`˴qlu{ͪTsIe֬YKΝ_6F\p~K/ɋ/($_9'L˲z)!n"$'c cX 1i뮻+<ƻqΩ* 6473e~KQ{98w.d@HEBLR3Bo@f3-R D/ 7ی9eJfu뜂M(qõͩïs괛UV(yh>s>)#kbik,F!3?B+A#mH6%=쳦$q!q>B`˖-M^z4~ȝ>}95l0:thа?=z(bҨFkR;Hx)5%F4GƝhLn:e˚՛ٴyҤInq{'s=b#g/9"p rATp,{E]$3f0*Ή#DQgzҢE 8 Bh5f P` zm1/RVuEqgUN8See2tX̲YgXqL$SM ͍S{,`8h" >,o3q7޻XG Қ-{ 0Pm4 J3l,e1?Fy@-%bB Z+۲5d^vn Ւ5Ń̩`6m:n7J( eʔ,>,YPXs߂-b-ȞSe9>/8q<ҨQ##rBRJC}x-Ͱ{۔>kHμz:\)+C4$&|`9k y쎾)#+n3946s-yÞ4n8ozrW8~7:Yn +WNxk8XpVfҏьaӄUzvز旙o甖ًJ'X=|ue9懶rZ͎ |LŪ;(.^8.vvGP.g# W^yqBj[^ZT q2+\r&K;aJ0xF*Up"(D~A{,/ExgQ[^kdo`$ DȏZ;' |ar m9\3n$Gx ѣq;@8qp,bfّkY~ݻYR覛n>}ȨQLH&`ǀ"bm!l ϗG2UJ#(! L-qewh ꯺*#@" o r᦬N]v38#hgqbomq`S#+"9̈N:e.Ln\ GX}̊Sr=GxcDps%"ib{Nt"v JE?v,n4ȩѬ5\iT)KW8*-$x:ϫ~3a4k:Jhs++kdMA{4mhʉ9#K d+c 9_["+"R&|IJG+|! >y§ ;T6 ~[mUt&N8C 1F*EqQm]v%"ذ?8ƿ _ӪU+aˋ5kf.2eJK'%+G+Vr aBNǎ9cT9 ܛ=;R6\-]ha;-Y]Rv4=CQE3ԉDNH""0ǩ;y=gdz?MeC)q[x`SoE9VYqDe~' )9֭+h1 =@?;-vi87 #|p~_^#"z%X~wͱAU2 4Lؙxfׯ`CIS<[o'k2ԡ (X?%NTxC˖YڎpYȩ=#VMw$'M/ޭkūKKi-z H{<2&("YHDPh=M\KIOssOyúxաg t[./(ph2ÏQҧ#NH̠Y u0w>^f>E@PKڻ3(駟](&$N|o8}TST~nSU7Bq=e&@?.XQBylQؑ6Xn酲ʫ-D"Bz^;; (|*}29Ŏ?e|@lGGxCx_bW:J"(YMYҥh'453g4aC!бcx>JEQ5KMP\ԟŋ{,61%fazO(#՜"+, tvTr"B,Q )"Ad (;Iֶ%FcY-Kg.ذq^)ދrxq4ω4HcԨMwm[}o߾_~YZwʮXb`dpulyu9=[n DƙᲸ8u2씁96k;eB. GKgi/񈏆`,Nx&7lr׻ĉ,΅\Rּ\x͞w_}jU+߸k75vC?&g_%k&YNG96;q<'Y- UݡjJ߀oҩ{@1ffR9y!'eӂ&9gtcT`zm| xf֛1ejxLF~#?uѼS;;~D.) (zFfL8%B^"s/5pPH'xaLgnVO[PfE"-[f=ڥ,7O4Vwz5"a L0>8ԡBE]2 UoŖuiIņr˥aieN&D ʖJ~ `^B2iڟ !z#Q eǮC,]}9Ѳuq 7x A yHJ!=&vLhbv @PtCS4sl%XlbI*T`>ѮvՑXFG o6R/#:ю]~ړlnL%BwZ$un?/{4oՕ,M# 7`Nc<Ͳ`$/b,k*+"2>1$yNF:h|m55%\4Żby'yy@A~]whР{f90s 6^E@pƍV^|ͮ:y0%ڵk'ԎP Ky Kf;@8q1:0@CF3wAv+#X=&N mmFG-0˻K7)<_PuCswBC6zd@F zJMYhg5‰wլ%N=&gҁwXIpo㥸 q@ 'd;%_PLD`&_/;w6BDŽ d2x`6u1OWBHAfo0!!L E$CL+hh>X6Xi,GiB5{D-B7m+,7\* F˹sVBG+j7 eb'L /%OjY]w,tY# Ԣ$GPm_AGb:l裏 6NE@P!IO>DN: ,D &fMJ#VInJ V>Yn4r  {R*\7r0`:nڡѩ3=˗2*%Oa`?!qa#}ˆ@Kvd.vDz߷? WCbEʵ]G&gwDݻ8,OGriӦ駟FNP@m ze!% 6)J*fA*T geہp?ę[)v]s2>U,r=º8S7]zڬFQn%dm^rw]іʋI&$rϚ56ڴi#G}tʜxbƓrv"qQÆ ܾ`YbPז4TQG1Z2ɓg1)) BN"t%NE<‼ȴs`~YHL;[!$Yo&ĀNcl`@-#͛7DG&㤣ù6Lxc+Eݻ\`f_4t/ԬY3f轊"錻vj&Uek{'qr܉ܹs2dLMUHk,;4!%/gԑ?,`?#%{ViB21NqeV+7]RH<;U$8*&^O- 2sذaF4h3Ŧ[nҫW/ҥ J:#G:th0MhmE@p:uhE۶m+-Z:\<:uTYre_~Eѿ;X(N3|S2,jzT<[v?h%w^@O<`}Z=U J7T^u4 66P^`3`(Xv`Δz͚5l2s?~`?w>/v!8]&F;1`$fkĒӘsyXp;Qvb\Z)7[,e.]|lĪF]w= COի V2Kɀ<ݰHN]YH ^h!y&rE+VۓԱgo~3|6?pJD]YI&A"'hB1 1 ^94H35g{5j;R 6=x;Kh,9IVd@9U[mFax6ZoFp3lҩvf@NDNP 60J6 Qw*g,So x\ T+iB=,_B=ae{y0IH6 + sͪ"cה]^n/^t\p 9:0Н X)ge3zSe+=zN^Ç A/7·LМZ)C,6EtB= (:I<>Dqͼt i 0eZ\vyxn$0Tlqg'B杲P#tʔ)4iUZ5x|ʶ`Xl^'u9v"!0a2.{ͯ2kpΨ%붔]Kۅ" 9/굘Ǣ |Oi( X,y.( 3\_Bnl4LeR*G&9`Pw Ϙ]FFO%<4S:k` 6F#|c+l2aX[ G>)C  M6ͤs8/17nqZ2E@P2 ?3se7XbŊ i,_rꪀ@VC6ԛG^/O,STg~cyM䕑Zϣ푾ݗ=/<1b!ѣGM7dS2ƸbK |⹶VZrWE@PD~FEuHMeE&p,Չm B j˪ f䓯+˔ʥ %64v&㷵oԙeMȪ:kVC.9mkz)!-!X>*bbqA;H9E@P2l::L`Uytlц |U7Oihz.)hKVoZ伓6Jg )4'#\`c^";,+BJ@`F"k׺O[-'*CWE\ Xlu)%6]6ޑ8|3|Kl|h:wH6Iڇ-wv_ 7 ĉM^ŅVPA2dEDE" *+]@ DfUAeTI>]I \2H[}'ݙ=35=ܧ~U}9$= AhOxAkoO3џH @zb N[WRʵV^\bΊnsi9~C憇&=;grvb&И#%d%N$p!_'Llʗ/(aak/_#qRd%HAc,`O %4V]WӫiOkwIt0 і}3շ,G _ ۜs{"]{QrG~݅$?Ф)*w  pNzꩧ<]TB/"cy K@+ w'/N$x.wBk^"|"߉6H.LA4!ϘkI\s tٱ\l]sE{IDZsQ5AEJǥnR )⺺E*wxȷuwll-_Nt_鑭U )R(Hb}/:O8먀CĜȏ=P ~zK-Zd r3@(x_Y)Q׆bk9H ﲃm(zeB4`I JJvʱyd39>O\[JM79QT)wR*9-JG).#JƉ|9pw/h7#=_0yWg:Zj`qI#ᭅ\pm*hϐ!D$BA8YEFwک>Ar5P o,d:Ȝg8F*]rHTZSp:z_cfb 3CD0eSv(1xVg]ѣNDJm]{`Z]s\;(p?rKr'<.ygj~K[G!yej+ Ryz4S侨83:2wsswAjyY^YTi|(xțȈz2~"ț~'T@bD}rň|ܼHT2Cf?\D-YL ֻ*nC= #ٳ,n燛0o$(*sϞ=9RDvM^QmGND~\rB򋧻se!tL,OggGѬUT* ~j_%V@t9#-'dvz #StB]+YA ns=rF9Z$`:F ZC ;ީPߥԄkCtψ] xl5ȑ%ӥ~D˖4h%M+xA {49'%G eO ׄyx7/s.6Y$S=Gǫuj7O>)<;=ec5k&w}wN4Ly}}u^V\^7] mݻ&G! 튀 $ xglC Zv+ڵ" eLt52L'%lP "PL}Z3JQIm۶*;]sQ5ydٴiԯ_?)If{N%ψy&%@ԗJ`ұcDŽ`_}Uc& Ν;7fO0Z:aȟ|򉕅+Vw!˗/Wu#==]5<)3i-.kcd"mqm<^*W\5A 2ij׍wX'2ߑƠH& T@#){7+ʕKtļ'1sYzp xk ;Zj#QԫWOɳxb\:m4AO ,>6Lj}^kSHxCNT edKdcPHy]<8W>ΉD3ظKpA L&"X~R``GN:zG7F5h@93mtBN % D2 0(rxH9,Y"z'xB Zpx臫MsAB$tӃu6m,|A[/k&P"@xfY] /lyMK(BqL0)^-G~~zk19#; >D!  rS)R$Ь:F* $c߾} a׬Y#CVZĉ{rw|5J^|7NALHR@ٲenݺVVk׮F{+*UL:AYw:>w'ׅheVOXSe+RYtO <ރ\BD)Cu/| WPDhѣeȑrWKΝgϞҮ];vٲe2c x2uT2dH(nF$@#мysՇ:,{\Of( .0@)T7qr2>BjN(9>RDwPرc-R4둜ZZK^k肟?_~ek{h f`9qzm蛌2t";&:ʔE@8n9R>=z4CCHG +!O1V2khR؋vje˖aI ^J^K<E)/ѴQ+?ޭN21NEN~eĠ>[KulZ}c^۶mU#EBV\9Mm>ea% .Ųn9mP8y̎XɬԼCMM7$tקzJWن L49h$NdAwfY?7M3' B?vtp݆/4SEN+hA%Ʉ(3ZS`$d9|PeP/09sn -Z(C5V$Է2^ZL$,pOY :%UzƠ@oѭOnKR(/ءbŊw^Y~ +T`-sHLɠșIR{ a 170j QHA+ k1?99)P5iDSNtR)Q5j$cƌ]v)εHHH y wc60$ QPD1%ҷgD=Y+=U@̒B{AɬY&\2!`OQIV*]tQ|^KzIvE]Ǣu.1HYp V%eG-[H.Ad0Jĵo<um$q]'nj!R=:2Nʏ3]_\X x~CFӦ~`/z u٪( Ѳwj߾nڲ >2`N +[ N=oPu!̹um(6%¶:o40NPA!E@9htÀQs9W@u:y63>W6;95DԉVJGq"o ǏW1tI^HH @LɉxJg/HHHH!@4@L$@$@$@$,삇mB>6 N&i' Ya2cԟӶ?2לc%3v0d9a FuǹP. /v&/ W5g8lxX=32lD]w<!{"!!Gb%'ٔT@yWTZ1mf6=IDAT#mtYzzzdNߠZ5k:dhoeƃ /dF?bƝ;wJs tJfHv!]6iy3'33\qN6sA tPI'#.N/?0()Qem۶I*Ub>=xC.:OLge֮];Ӛ4y_pyϞ=I#%硛42/^XQFe˖)嗤Jɼe˖oU2oڴ)id6U)S(+y/V7@21 l_8'm@ӹ C:!   @.ㆷ{q.l3*mcE [nz9nG;vL<]'I7o+q{,2i֭4a [6-±5S0x 4$IxLF UVJׯW+TIH tոD xK\)&CPF   p+vd/   0@g>|"[zLW8 O bf׮]-Iٿk{{8^yG}ԺG8 =zLCcjڴi?pePpրR|*ۿI`ɌL,qGf8aʿgdwߝ٫W+TY>\v>}"XgBs(%Vo P`e|b2dHfݭwu\ZP׿e}O`9}>|X0*'^8UWLE~HIvHlgpBH{OzIÕ$bpew'{ז`e0=OʕSfEwoBwGgv0&W`Pe|ܹsUFYXB-X=N*Pδ'x`;%HC p%JP]DCu'Llgd9\x eӴiSѬYW 6"I]v~kEV;VF)#F]Pu—Vxg'I=& r u0,X2s29\YLn`e|\+P@ҡ ͟~f[t]{ yeF>ЈWwoږeS] 0P.\M@Gf1_M.2tkaWF رxF%<1"?Yɂz,C!E2Bޞ={*_ԥKxj]+\Ml `TDVylPxlR}WPY?h(4S2P-[ /aP`6Y-P`eD+)Dž[z`񔃡8K]pʓY0bҹsTU…Cmlp9\M,&qWp RePe ucB u;ὟLB-X=v.֒eHHHHP57"   '@4 @| P/o^HHHRД@$@$@$@%@4y5  0L$T@A    ⹅| l۶M~mYj H .T˱cT#>qO~1cʕ+վuԑ{L} R*3$@$o]VpႵ~+ӦMѣGuk֬Qw)իW| <~xiӦM_Hz+E-p[R8tR&pvA,Y"v|*_'O뮻NhUtvɔ)S|nZOs뭷 ? ~ śo ϟ_~i a>,s}*رc-)lb='7t(P@)rf͚O?ϔТ6loYvm3$[@Cᶤ&[SN_-xx>rW*ÃwϞ=uXb׿Uj׮-?tU.[Uжmʁ$--M뮻^HjVHF%ݬx5m4`ơP9|ps033ٳ*=BRfMye„ >!`#IOh̙WX!˗)zǗzzT\Y>Un|t5-]T{iKmҤ>=IHXvG3M6 WhnKj肇靊/n-fddHB&1a!C3g͛7W3d$@$`#G'˛7o@1Rt%wtѢE]v5%K LH l IJn_zMv- ȑ#C[nU]J4sL2}~p؀2 @2hР|'61(PK(0`-|[O$ؒz'L$C$% NZ_~ 6L):3=jZCayI|TB;Z>}Fz}qH <[H{,S!nٻ>k.Γѥ"t3 DO]E<2 >@j@Lt3 $ė%    "@Д*nfHHHO hˀ @JR̒ @ PM|P   H)T@SY   H<*/J@$@$@$@)E hJ73K$@$@$@'@4e@ HHHH PMffIHHH & ( *)U, $@ċ 222ٳp)rUͽx IVd눝f{& H =&q?HbŤ@va.VXpB%O,we]&u zM6Ɏ;ARtaC=Bw9wϟ?sNRu+_|Ν4t̙IRԀ'M#DPB )&xo_r ;UQ P?~7)XڵKڴi#wuWT?KӋp裏dҼysK]f :TZj%'Nݻ˝wwQF? jՒ &ȸqJ*~saÆEW8y"}BѢE>,%K$/&/Ux1aɪǏWgLcǎgk޼yS =eʔ7Y`M W@(A"b Lu$ H 9֑,Ii.YiFC~%~IKK Aw2 ={غѽۚѧ~ںFݺue޽ֲgN>E7%`b"*BV#;#ؙƞNcXܜ9b"k`N |>0N 6g}Z5{ljmp 0ܗ Yر b]3g]8>LK#攈u$Q`߇&*4t4c&Q)RՃ0O܌܍U@1>z$7Z?+Vh'|ׯ_o>*T1Szu50uF(05p{>u&ÿer%CyBF˂u^IJK%8AH㞁3o>+\ th>PhM49s樼-]TJ(&|mRFdÆ w Ν+7VC$@$@$@$`c[@w2h 5kjhy$\1bRNa٫W/5BBV*]tQHHHH<F)p䝠LCŋ[`ө[F}Һuk\pak?ΐ G(4o3>=I0:\O$@$@$@0DHHHHIT@s dK h :I"   Ȗlq    ' $(x'3s!EFFӧ5| 4 z6˜XΝ;{!b1j3QP<}EL\6-`ѣfr qQe6T@q=/n2~&3X(%)L, {=KW.i?NEO PG6+W.W24mOq&$&&Hp6l=dbY%~#nfFS^ 5C$@$@$@$5*Q$@$@$@$@ 5C$@$@$@$5*Q$@$@$@$@ 5C$@$@$@$5cGÍի2Vvm)UmΝ;_a{Zeΐ CX̙3[Ξ=+Vq)o۷O/_>PgHHHH,*pݢC)\sNl޼Y[J$@$@$@$@H ~A-Z$x)9|8p@Kzz>\A$@$@$@$`c[@MH f->tϞ=ֲg3A:g\fZ|0,L+cy 3ܜ7'W@a۹~zygW\!f͒%J5k֔I&ЫJ `_  'f (%gشe2J 4xjbY;qv2~ϟӧOF373A>d駟G)\p<9rD;f) LOt}>D/RJ$D^IJ`$@$@$@$@'` Ez6R#u5jԐ;J^K.vZ֭m. CiӦjذ̙3Z'NHѢE!   0 h`i٦Mp`D$@$@$@8 /ٳ7+WC$@$@$@$nc*pP>[m 1hf0HHHH%{Ոt8\B礥J1cH|; P?~kI:ulSsI$@$@$@$))bQ: @ (txp{ݤt{ _&2ADkL, {L,+[B4Wu]+]+ ųUVaÆr*wJ$&#_|![M˟^j1,XGu,dbg氓^B|tLiii;w;'V9>ȢM(=!.\(nWHRD[<|iȄ9%r H"wm3H&Ux9p~/0{L.:ۙ ~V9n޼Y+-[FC$@$@$@$BqDʕ+SJ$@$@$@$-GZ@{%m۶CJƍ݃@7|"IHHHR# /(6mg}6 J!+IHHHB. &ӧNq /B$@$@$@$i[ *VlSpکiӦA ;ARtp% @ 84Hx㍠ fֹ͚)F~AƍS8C$@$@$@$` GP >ӧ)8&ݾ}9Rht:t ݺu z(l21cC6}t:u 2$1@$@$@$@$8(^z`N 6TҥKT顀S8m۶I ~ޢpHHHH (SL9v޽[*Wl례"A }wߗW^yŶ?€+VZWhQ9t萵ٳg?oTݻZןL`c\Rce:b{ڤIJK%0 5$~q%]G8hfH9nݺUg1護R!hҤIxuno]mu[`Ak3 ڵoUjm#ND&^{إR< ēvt:{`2QΏByZ=9?crzș3gPBfXM(BB;U S^dI|IrTkww?ZYׯ_oRBk3uU^n:)R^ ?T^D˂u^?.dbgF'|B e|BGJ.{*p= Ctҷo_eE #D(P}&    GK.D]E /}7qHHHH E 8iF ]ɓ'J zK*xm    _ Bz(>y<cD:"1 &hDp8ߧOA'|"w(+4IHHHGP80a?uTu:uF3VeTĨggk"ܻ&O/5֘X#(}cbY%ཊ LB є# (رc-.O? 8PMf7a#:%A|MdrK5&눽 IJK%(0ssHh➁_rA[B$c (u]gDB~R>%D$@$@$@$@ ڪU+y7dɒ%=U;ZB醉HHHH@p -[M7ݤ@`u֕>H_$@$@$@$@$ (AG?YFFr 7HHHH r)4cb"    `U@]IB@8TK~ie% /Ќ + ںsN_BŠ'b"   0 (Ϙ1C7o/rׯ7|Sٝ/^\m_>P?J\A$@$@$@f0V#)S/,ժUO:w,ݺu%Jm޼YEbRm=HHHH#`U󎤥)jgΜQNuH>,K*WP^zެϟ/-S;ϖLLK&23Dg N" dӧO(*NْNG?t萫=zM"3ZD3f`FҥmܺurJ]=zvYA![u֩ 8N1pȄ<L#7Q.zY8߈M&Ya<+ϝ?^%5o^m2ZEPG'|/W\q̚5ꖯYL4ɦ^}ՂI={JѢE"c@| yy`D&x(?Ai2>vjb,\ݥp®^P!u/kCK rJ"Eg|0R^'؁>ZMHHHH#`:l0S <ִ[;v(A߿?żyEn6Q"   ]7n˗>r4~xesn9s樐;v^zY"h-e"   0 (l;-[OWiHHH$`t|$0Ҍg$ĸ/ $kUIHHH"%@4RbܟHHHH G&   Hq    0v|rpRhL#@l΄<u97%\r b2Ŏ%;LRDgͅ ;k(\TxLqrǂEe#PXX\+UI%O&v&a%ŝrӋ(HdƂD7+h?W%HHFM6 v"/駟&IwT'RG8)n' L$@$@$@M hr'   #@4銌 @rGIHHH PM"$@$@$@$W@<(}lڴ)$il_``&    s YFz!? 4Hf͚Q_??s΀q% @ t2rHꫥsҳgOi׮eٲe2c j2uT2dHR    ?*핞.WB+WN *$wjժYٶm:4h Ϸcf…2n8k"X8pZן)ؙLdГ&O/5֘XhH9\ƫ=zԝ/iii ]X19|Mݳg`NECE_D KŊ͛7-dZd233ܹsD蚉b$..QLLH}uB=U4,X0keρ !$xٳ9b"8Q&c[@QQ 7}WJ_CÆ N/^^t?8* >\F֬2_9$o o&gn#=vUs[>x_ 6H.]_ ]|4!p5 .Ȕ)SAxjΝ; " xx饗hu'@T:uɓ' (P4z <$P=wޑ43gȉ'b\2'N@_|S4w+Vw!˗/W|2Ҝ9'9B #Gz ZAo馜Dz ́V>.n̘1ҦMa= o2sL۷jΓE2m4OTgt>}@'LxJޱcGe'ܡC B h0\.0as#ϟ{N( ѹx{ VZ2be][ݛc,R7o<=*իWWu%ON|bO+WǏ^ppH vj5k&D@ʕ]vcٳg_f`(N \$  ``҃  ק8L5@ =)L P Ά[HHHHb@c$   N hp6B$@$@$@$T@c$   N hp6B$@$@$@$T@c$ XxTHX^& XK<7 Ā@)IJ h\qb$@$@$@$@:@$@q 0eY`3 Ν+f͒;vHJ{[oUI5vXAqo>:tZѣ>*UȀT8d  ` h$@$aG *HÆ G &ߥK^tMim۶rJO?^zɪUĉRpaߖw}W)6mFɖ-[B ­$@$`RH##F%KHU&+VZ<oꫯ*%)SF/_J+X,ZHr΍E/+VP?TZU^~ey.' c P5h( YF,xVv.4|p:sL駟dݺu*3g: [ܲeKJy& 0M/!G$`\r8U&/j bZlY۾J-crʶuʕ~Ͷ $@$`** "p5jȑ#Gr3V:ȡC'P]2ڱcG/Jk׮m % Vb" d @4J2 $-nA֭+ܶm8p@~ieYhQA޽{ ' aZ2e/T#ϝ;'o^ZhW# P5H( G}$vR-jՒ"EIy敗^zIO˗/Fs=VPSNJ,VOƍ'ӟBm$@$` \QHCAHHIڕwV -|Dž:' @ P5aHHHHF]6\    5*& P @ P5aHHHHF HHHHbM h $@$@$@$@6T@m8@$@$@$@$kT@cM'   j    Xksg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|U\ @IDATx }A( ("`V@[+.غTVUѢj]JEDq bEEQPV-=Nܛ{or3dyM2˙sޓ<93sR( @@ Tv   N7  @F@3@@@y  dT4l @@  @F| @o6h%ؚ5k|믷zB/o~1bDb%@@ *5~kmڴU%\bcǎͥz&U^x.[zuR˗<9rzR+iذ[riӦ)SN;47M5\~ sύ+RFj׮):<bp3<3:^sӔW֢=RteӸ2h kٲg43  !;~gLfկ߷>Ƚ.!gyƶon|v={G젃~ncٯ_?SIaiӦ٧~j?ϣt) {n'x~_sXuM7]?ѓVPEB믿hq׳yYg~g_|񅫫zl̙crۻwvah"QV-q֨Qy3@@sѡH͚5#^xa4 *RRHiv=~7pCM/Ztid˖-e^v4={@MW!C"E-zRHPUiQ =b{@H5BE+CхJnRѩ-;ȏi@@(P5hYѣ;˯sSO]wzG鱏:RNlGu.:ta- ~y:KES.{֧O{ϟ[oTuz'c):\׿p}?A-:\7/z@c;  @@u]IW'J:T}e%=ܬᅊ'\S-&-]ԊzZGE琚.:Rң0.j޼uW_nT)Ie0I;t-zkW"@B.VƢ\Yt>BWT#8"·UœؤD3;45LԘ1csΉBOoZTWO*svJZUV w߹Xo!a   .B7nz8t׵kW4h;<>}:l@ɻ )vZ:T'N!B(% ۤ`+wu,+].R\^Ҙڶ4.*Rj*` W:T|X#Gr'X8# @h*j'|Ҋ[rf&8|0lwn7l:or-FWog֔ ,.q6l](ʦuڷoo|-,yg}vJ{/ԩ >u~X|sq5й dUDIdzOw㝪<_EPEW穫rYIwGR@OB@B/P+Ewv/Wtc(.>+4Rs) "EEo2TcuO .wWHQ@-:]Tϋ\7Vʻh$W]_GzNݴ.nrnE= ^3}.Yf]PcSQPe.NrtսFB@.۽ztmۺ q #z7o&CCQQZjϩGe < T_|ݱH&(u%CJUSJ˗  @*|ޏ|G]|StWF^"d]k:CZFW4iRjY|=ÚJܖ(kS$@7#k@Pq~IGWBn͊nup @@ Y=Uvv3gtwjwjz\{r! @. D@ @@_oU @@ aK@#<ڙT@heD@H4v&UA@ @D@@< ͣIU@@0a/QF@@ @hgR@@ aK@#<ڙT@heD@H4v&UA@ @D@@< ͣIU@@0Tv}7v5Xv̚@ O?4͚5>؎;8o(onFZծ]Ǝ[(H(/@sϞ=f۵k5iĞyիWu䳀o{1_]tE۶mٍ!I %Kmǎ6k,Q 2$2 dN`ٲeָqckٲe6ʖ@пP_Wv7G}~H]) qݻw /ණEk׮iӦ?OSYJ "T F)E#NYҏuҩS';wntY "vhnO.LGV@=M?ʋ9sX.]뮳?gkz@Հj8qܟkX/y H@r!VZ5+: H"qƹ+СC AC=dӧO޽{@P&O?# z#@ TΝ;!̙3P:6jԨhvjω'ZzQVZE( nRwnznd\Y3@ _tMݦK3nͩ:ӓ I=D]@@H"$AN  "PCbŊUUM65kָ .Fٺu|)q+W͛ر#B>L *n"l۶͇'΢AnL4ې8Np=[l)stfC9ePI&IIڷv0oimz|͒հaC۰a&)vX߃:D~&=3;Bܺuoj?U^jժTE?W W$z@c]@@@S&c@@t@c]@@@S&c@@t@c]@@@S&c@@t@c]@@@S&c@@t@c]@@@S&c@@t@c]@@@S&c@@t2뚽˶xb  #@ZPY `g϶;vݻ)S @@|&LwyǶlOe3o<{'+#! !@Z{XS=3g,1  o_E""@BЄ,OlѢլY3njժ~7 5k9ٓBe(!@Z$ _~m߾ݪTVPk.+ˀ@@ U-YĆ b?m`S JB@(]K)wz?orc@@ ? ! d@4l@@г+Vo˖- h{??|;ꨣL#7VE@ Cwߵ6nhk׮u=W0GVC@ Cyĉ ,mz… hw\ծ]{#  @(L⋭jaTk#FHfuA@ V^|QFVNСM:՚6mZY @( .¨olݺ}GF  @!Z{:" 9$@C;   @Z{:" 9$@C;   EHe]ݞ(UTMWE"D2Zj {_2+#u:viꡑj֬YFMӛz4l0LY[-/[zrl x5j1x5YPIVA:UL덁w;~>OjӋUmʧOi?-oڬ0Un[_Iu׾_~T|}kҩ7h)z֭K8Gd7mdvJ. ~7ol;v#˄y]mEe۶m[21AA$͛7wuP]J {6a͚5s)ݦ6ܹ3MX&MlϞ== Q{g6lG}kA}eg}GlݺW~Rg{O?W {? Yn   hT,    hT_P̟?V^P@hhw]jwgϞvgZ.]OSj4  O_m pWVzWW_|1M@@ O@tVk yGb9  Ќ0gw#[,Ѡ~ʛu@hVzg' @G]Y @hB>com~;XL0:t:PP@nř?̚nږ.]]F$!  Ɇ:D@ Xw>UG@!@ u h| dC4l@(`T@Ȇh6&  P:  lM@@@ xSu@@ Pg  @ Χ  @6@6@@ -O@@lfCm" ,@Z;#  ͆:D@ Xw>UG@!@ u h| dC4l@(`T@Ȇh6&  P:  lM@@@ xSu@@ @Nj6ms/^5kMW_}4={؆ l۶m)4%E 6M;v3fػkv튝L8^ @ @MfFkFyƎkcƌٳg\`~C  5\c'NÓ;k׮֮];{s h=XTwy繠'tma$qi#L}=sVre{gl6rH{[o.]؀ /[գ${ӳgϸBi_6k7 /@|M &X=lذan_l3gt38*^ @Bn]vqQ:wOMTK/dwﶥKy޼ys]-[ڴiI.]۷w=޼J*u5 v_ϫU`W:uXZɾ?Vw2޼ysL;wGy:4i5?zrkh_h[A%孿{ ԾƪVwRJN~x}wSO6O7.\hV9w\֭[mٻ;~tI3g"}~T~%u`(O?믲ώ;O}>f~Qgtz}R?ߧ1ݒ$z8[jUVXa 4N_}j*SX-t>6]~;P7V~6<ŷV˦:mTxֱDevb.빗\SVYҙ3 1~J]m˳n?,lʕvKzɴŞ}v TRY~OQ> UE *_SeU^ "_M Uh"{,QgE`Kj0t׼5kz?DIv6mj7n,q+:QFnݺ^zz37X.L*UG}tG+СC5Ee˖@/Tҏs?lzy[nuu_:PN{J^A%E4*5i$M j;~;vh~͛7/.ma*my^`{(T=@6A팾cb}<NJemS߃ $WuU~%'ǯO?W:BϻY𣼊Uo~8?}|NN3gNU`%7kٲetY䞀zzma+-%B 7LbWFjN;44i蹎&Fƾ@Pgmwunb{mɒ%.0  I@h#Ka:-x!B~  W  @F@3@@@y  dT4l @@  @F@3@@@y  dT4l @@ .E/&Md{-P=Kfr3K.u.\ٿ>իΝ;*n =tи۟&" !ys mӧ۔)S젃ZQ:t`-7ol˖-3<Ӛ7o2QrQ4 eBHA /Q[oeo_%(GD@HO4=?F@HQ4E0G@HO4=?F@HQ4E0G@HO4=?F@HQ4E0G@HO4=?F@HQ4E0G@HO4=?F@HQ4E0G@HO4=?F@HQ4E,|r;ӬCo9]k9ctxty) T\jWe\غuu*UdHo߾o/ʽsN;Crʶw^Wg[׮]s@4M\\}ܸqVzh2޽\,ZjEOv[NB! @z۷owgm޼xD)W˛LC@@ ͒M ~YgyOs3ͱF6`I n:ncƌ-2B@ 5j=Sn-[X=lĉB{9~x޽}پm@@p)D޲G}4мO>{1܏UZwɳ>G  4$رcG7duP6lp=]HIW{wJ`Ufˠ`xڵkM6]^|^YzԩS -5M^8zScmi&݁H KlCnCNTRTɞIK3+eE7n3)e OV@P gTƊs|Ϟ=e,ެMԦM˨C?JA&=qƾ6Io8 zd%U <}[VR"mmYQ}]3U;BmJO hl0@L @Ky7_I^?d{衇> "E0z╽v̘1N9[v5k>~6T'[T z;^z 2y j^Ǡ|FVAK샠aLʫfl+Ca)^~~?6Җ m |5k]qnVZuϤ3g%y! Q(E8Ga)%  @0 @@ 8l@@ h&! '@-9# $ M$@@@%g@@ P  hp  @4 @@ Ζ@@&@a  @pْ3  @(LB@N48[rF@H @I   gK   @0 @@ 8l@@ h&! '@mr޾}-_6mS`@hxU%3gs1֧OС=3n@@pnթ'w't#F-[ڱ7 @;w﩮/X /A%[o7yd^K"6 4V P"tǦZJ*X%@@ ]z@̃ۨQJ//1  @5kִ*b/sbOR @ a~:7ߴN8իg{?vᇇ6rM@ <8׊[f#a  :uE!j׮m#! Aݺuf~vafP@^4wq ~6k֬uֹFMS@@BZ^y7nequ^3VI_}U|M7d+; -矻ׯȎ;lƌڮ]Fq(tꫯK 7`/R4˱cژ1clvzzȐ!`klĉu I>}_ww<*^ݱ-/~i;w]|ŮTmmfwM:՞|IF"WQoJ@XB5Knw8tbӟxb9={gl6rH{[ou0.BN![׿\/S[k.k(grߺu.0aÆ )89sٓ62;2"GmjժVZ5.L[|[믿={T$ԬYlڷoo*UJC s%)Uܹsr׮]]ݻ])5ofrٲe֦M7MtH>c|pt^*UcހA%UٯX"azE{P(^LhCd[ Z+޻NPIvʯx 6{uEO>."z…֯_huFT"RYmڵkmڴiu۵k.\L -P(3smfyzꮑy ɴ|]veNL%ûzU*~|AYfnܸ~_A%}>tJ2Qv&qnA|VfN`舑N?[Jz͚5+Zl_%\^;c7A>Yzu]iW;:enҤ3HI*NI)+y#~yz*)(-**ϛcP}|GR ~2gΜh՛٢E ӇD_j0kٲetY=Q`l*/S d0)SE wMP *m+^|2ܗGܩFgqqRꇁwGUVIQ/^zL>ʔXyu,3*/ɓ'[]WNWcjԨs NaxݡJBzx]GcW֕봑REŋ]új*w[8 ?nܸ-3S #y"nh8%Vs̘1q<_2OjI5@r^w}ܗ.]jͳիWk{v= Pj/2c\kQ"=>#v_]BTA -[죏>ro?g_^kJ>R@B:5N0L^7PiFV@ 2֩S4h`f*As7o^b:@Bm1?3ӏش{nIs@V /tO>dоn:uTijr~+V0ݞ[yկ_wak֬q4j[GHB@G:wl'tuY֫W/w~ĉw^#8¸}f,9'tԨQa;__}y饗ڟk+^SO=նnj7n?6pR7矻Àwyݴ͛7e^;c9!0c {z^WiĈ^޽{Nvգy'MkUV/@'n+ U|zB@ܶm[uYOW^l!9+Zj5wuM>N?t2dHbS&M䆻O$ @_|ń h4eY0}lZ"5~j(&ʘ0a񹯖'%TݰJjՊz]ZtK@>UWkzd.7|znꢦu.s(C@i }Əos;Y 2@x_:Tku3g!TF*dƚ6mZL$H]@,MlҤ:߶m[޽vag @ d<Uuё)jPt.׌S.@RЩstHn@|XMx!ջzP'{sWwz$@] >{lW t̛oz@g7 @X2j 85O=viDhkγ>h@y}_zݎWX#w+k@PƑԸlDH,@|ԩ:v "bPBȤ@P]%nI :c (T, Rr$@P6L&}T;IB,TZqhD,y&`wf2dXr] c?O7@4^q֥K[riGy ǔh/e]憹QMx wp׊҇Y@w8]tkǡC`#F0ݵ죏>{ξ +0Pv(,W]/}IM6vG۞={uA=s3Az%TSN;rg"_sw;~ݻw#P&Qg'vnݺ|=WɴA'~'P{; N9MGu@@R M@@ MGu@@R M@@ MGu@@R M@@ MGu@@R M@@ MGu@@R M@@ MGu@@R M@@ MGu@@R M@@ MGu@@R M@@ MGuSرc5ʎ?x0`[.6{lkҤ'?@ Lvx.TK.?  sSk@@ kYg  @a ~  @@Fφ@@ -N@@ f # )@ZZ# Y =F@ S0;F@&@5z6 hawj dM4kl@(LP֭7xVXQb}kٚ5kjOBY`…6uT۶m[\5wa3f̰w}v762 @I&o[[hw{'J4vX3f͞=.o<2d-X8qbt $0b{衇܏;}W=z'tma$qh#@]@prϞ=O M6 `կlÆ 6}t{r3mȑ.H[K.n /oիWS)+ Pg}fWvСk wn&L=zذa\_|͜9zIY*3@ PUTԩ,on7o6_uٵkW{饗lݶtR7Oӛ7onk׶e˖X/)7@۩T7+旷LSd^aI=<3aRxKT%2U.;k|G7j'tX_~yj#Νkݺu+Tu AyAL\ְa@ރ隣x։r뱼Vk_^RϧŧkլY[=tM|5kfׯwϋS~ 6m˥ZNlC__6#t=Tn}XdsΠK/{cއ~~{*H5jm~ k֝JT&ڶm_vAmhmTF(sDYزeK@^t U:)t 5eFUIA9slѢ.L}qSҼ-[FƦDWk~ Vyb?رeSO5A|wqѬuHmUVI:ӼUmƍ`ϕOn6 ey;"5'O>M7 Uԉ]wEˣ:thɒ%oɦ^x-:m4ScJW'#䋀RHj'cOկw/Ii(#862_v>@ d/{=Q?"Cpoܸn얹K/Q:tvWD矷}1@ z=62Ȑ@N:J9SNrc/P0!H0+䣀I%J:4zhw~wm'#dJ Th2(:GSg"!@! 5md!+9b   +  )    +  )    +  )    +  )    +  )    +  )    +  )    +  )    +  ) غu]}~۪UfvZϞ=N+W& ! @n TQ D";Zjk.W]ڴiӬm۶VOo*U][n6uT;蠃J]  > u Y5A*rԨQeU\9n{ڍ7XzD@ }nذD~%NzUT䞯Y4& dV=䓙([+̽S`+1-vBmݱf͚v'M @fϞmڵb727+rQGȑ#]֭k;leXtMիg;wv%"3@@ ]7c=̙cM4z?>7nl'|7+Yfɓm}_)   T!bK5uN;{fq… jUQ  AgMe^wމ >U;wڙg°E@ptFk &$p:@0\y65I:W[o9ٲr)ve}2˜hRtRD*LC,^>`;cRd_9i$)w< oƏ7V7n\k .,'ئM ySg͛]IE T^ݾ kԨ;[j;.LC@ d6] `gl@F)x  L( @@h'  R5nZYI[˛ULl'H'ϑzxe?z{,{yz/A䩽D3TA5y&kO6l9gʊ=٠As7h:u|7v2.W^=j׮mH't=rתUt{PIWׯ_?7l`/lnL> <8Ec**Uޭ\ըQTR=kA%9iQ b곫ϖm+X?M2m׆Ǭ^pO啌`ԶzҠ~&).(k"-Eo 7͛K-p N԰AYƭFNزeر#n/oa3gδƍСC?mݺնmg҇qƍȨrK.vm?Oݶ7o}TrvJ͚5s)yE;趪A&MDUPk{qE b}aÆ޵jgLv)V־MJ?T{3\\P>B%pW۳>x=:vur .<3&jGPX@ MU3+{ﹻy[UނÇ@ΛeNb) Ph{n:#'hN_~;/P|it_w(ۖN8S<"er_;ja#Yݺu댔D/mۺmIoW狽+ny=-ܒt, .*Կuz@gׯ|ꐶҧz*ЋQ1h߾;Lqc=f|Rrx-\͛箨?蠃Z@2' ]uhիW[^2Vmz@3F͆4izv 'gkȈɓ^鐺ʒJRY+ipu)bF*t @O Ug}f]D@@ uXt?,@@H_C  @ )`(  @Oߐ@Ȩ$~gvsec˗/;Jq(G@+* dS mݺu,F0+" TDЊ YН."6lXKM_r%e˖--@6!  yʕ+'EpK-p ý(=  :2 ޽{mӦMuV?#@HA4,+V؉'h]t VNWO.^nꪫrK,+•mǎJ*6|p7n\NB!aYcƍ3ZeЌrl !K @?sӹaÆhU> ' PRaÆ֩S>QLɆ~+~|ls@A N G?;w&,SZNυM65]8U}30MB,.5o^V)[j锰?ZlҺe-\F {sT=z HPoom{l\K/uf{)SD2^$@|wqIe:kv׮]|TX@%Еwt>oǏws>|vᇛzruBB@ lmQ^_ׯo )liС? a4{# ! N  @@ü(;  B49p@kӦ~K/e l@ pRw ό}ر7祗^j_o߾)[A@ O͓I5x-UY v5ktmqVR%;ꨣLm'#dB =۷owĞ4iRرcm̘16{l ouzȐ!.xklĉqd֭kݻw'L"h"+m޼y|;ϦNjO>-D"n>md' !_kD7mGxb>}=vڠAln{nVqƹ+2 a>|pkРA\m&L`=znxۺu͜9-CG Ȁ@Ѽ￷)SDvٍӨ:wmK.u4yVvm[lP\Ӕ.@J:ԪރDIׯ=H\thqfSs3`T=tNfZ*XWZ^Qk[zo⦠Qz@߻-@umh_巙~Ov}C Z~$ݺu+ꫯlԨQu `v`r16AyHwQtT_ԶW~׫VrY2d*2$Z.t衇ogŊq *HΌg`ڵqvw>-Gr 55/W 3 ?6W,[2 @K"|ݭKTO@隯y^-CIm U"]v%Zėi5WLT=lRbxDWtZP3䘜ѲqF_lw^u> *[g ԬY3E-#FW^yŝ~YO7*5i/ʚLT֭[۽݌> J~AW|T"ꨙ}$SV?ݱ!{6 +}G_II+?k|zL^E}l/e&՗ޜ9slѢK rkٲetY XKA;t_^x#rԃKzުU+HGȨ@.B*MGC|gdO<]CG:^pN6+?#駟_^h?l\ݻ˦QDwߵ#8h#˥c@ oz@u>СCM+:St7=ǞL)Y"P rt8!Seo߾6c 7BFσahӦ o\lѼxG?/6zvI'%DT+patݺu |!M'eFw]܆9zhv:KDI@t^N 1^ 㷜7jit=|jtwڋNgϞ"8sօhg슴C;w  !oze{xn0={%; 6<@kڴvm%b  @(@C($ 裏+WF"7op gk{sϙ`{'JF@R` TX֠A۰aC{u=3-[fSNuwB:cE_ҥKM]^Q(0qD{ h"k߾}A=_*M/{z PL@cTRĕㄙ3g~3]Unٸq㔷O|qn۶-5/(:˾ꫤ;ܹ3e]H?pԩS$\em֬;(LY('@srP(ѣn6olwv֨Qn3/'ugڲe{\׿g}K>蠃I&qhjլ]v%f  0hРk٨Q#gt%ߕW^gְaøϹYN phN 4ip`M wio#sMؤ"IFS zijEc@, R@M݄eⰵyhZeJ{+uU[۪^T+ꜱW^yŪVj py-#+@/#P;v4]tw ?>-vԩ0--?vgt*M7d.m#'!l3f]wuv[ng޽{gD*TRW:,c =!y\ML˗/Da|nD*UdxlP t%: VT@ ; W4v@lhsc.{ "/!x^!@ >6bĈZ\ҧ~4, @ fޜ-"@4falܸq.K#p) '@Iy-p 'H |%@@ Jv7E@/@}@ @@ -Me@@ fP@@@ jwSY@@ @((ЂT@Ⱦh%@@ Jv7E@/@}@ @@ -Me@@ T#Jvڄڲe͝;:uduMWn;w#yر̙ct5l02~L {YfY6miӦ~9aժU]v%ٳg[-l}+TZcA~?SjժU5Aо_PiVF ;#Dh? b^/^lݺuJ*fD7͛C(vX߃k׶8 X֭m}񭬕+W6޽۷`.b7r뭷&B.9pȰart-V~ڵE? ֯ȩĒ_3Έ\{/H%wO<Ē](tբN$;WEYI,xW(lg%@@ VT@@*$PT5 t%֡CܹժU+ :ת]vVt7sY98:Iw5h ΙT=4iv|sMyUeNڵl2삞vPҩyu~@=yAU9~[mmԨ_Y-:!6"S@@8_ @@Hy믿nе4 C25k֌ѐ}Y\{:^,\Ж,Yb*giZ?tَ:(0)JcR]C27^ܣ Yr;;WǪU죏>re 奰~=[εsH]o֖/_H4[Sirh9sթS?ز{/pE+.N'(R)5C.ؠ4fܶmÌ3{1}*8՟4b$h<3[m۶ِ!CL㴪NjN:餜=竴zhL_WaÆP0Լy%W]u+x;裭~/{?qƹϳ$&M۝_]4GSZwqm λd*[\h'4.?oX~b{ov饗0O}8m4SNI8u.|%[c?c|+^M<:S%qF:thW^9s=7:hQ藵7;đN;-2hРȔ)S+ #=klC*8>C})| ?DAP! BfފD1E*"4AL2)߲-Eq&iZ$%K)fs=^g_pg}Y3kf|78/(c|7Sԋy9>8TC 3f!WWx>y#?[F7}zYy'y#[8oO<FZ)w?38|b7:?RfSDHJ؞;w΍=1;b~+ CLc 7re1%1˹s:?cuCceڵf~.let+CWGdmZv[+jΕ%@(@&pw~F0UԄ!HhyB~c5tL4$L0]bMyE!8믿R*;|&Ol#)G{ yJՇ,z|׭[طo_%Ⲙ͘ywr-bk^]Cx om)i6aÆ ·2#,{CW\ѦUljl|DP1a3 /\`?N(Ao>5!dj:0?{~8;pccǎ(-a0{%ۅ)N+SK@;c wł+Pf)vT*yb(0;!CdM^z=CB=af,٢EjZM6Y[ ҆M8yKtͫV2۴v$geUh2|A-㌘z6( Ie%Kd/ cUş{g̘ᘺH?l=`Ըo۶m)O,ǕAYLUʶE7sBR vXH)?y^3"l T2%Ņ3tlgjZ,u\⪰rJA}JP7ԻӖ-[n =.@@ECMР+љ`\k m^%e[HdAF? DuJv^׶UEB2.PcJvΜ9Bʯm4(L[E>,ahh_ݔl懭`6NO#M+a\ Oٛ"9T+#!o5Vjqp 7`)Gtr?zI)rIb@k#)ڼjt`prRLgr˪ Z暾[D@D@D@D|@K@- %]}@ %HtBD@D@D@Dd֒[D@D@D@D $:!" " " "PK2@kIW-" " " "PB@h %q|M yGzš^xqw'M~w7el2d;$ 2j([d>CtDhaqZ'RB &GyBvnذ!O?YԤʍ9**W=IXA :B0>cn#0a0wKIqYky-aM:7dӧ,dVm޼ 0:ᄹ_ܽޛ3f;$"qKYfY@UРJD&Xzߵt^pu|gv}O87kv~ *" mA+<Ჽr^9s>캟E*U䣏>nA&"_~TF@{e#!ݻwwG ouذa{_:ٱc馛#Fp@D@R 믿Jwv=zp3g̒t:>̛7ϵk׺?g_@e't h  3H.]\׮][bݻwvGoSPNrzè 5Fܹsŋk\E W&>}Om~r%(#D[pF" F'|<Ç;|Io~EKݺu~D{q3f~~nY6nhtnѢEnԩv?cǚ}@"PD@ݑ" z+u۷owǎsgv}u 2zGn dɒ1@2X,Z} /O?ԭ_i'p'No_fpiڴi|2@haCmu;S{uMMM6Tw}nFۆi]RKΝ}YZcGӧ;VS[o/1~mt=ܹU[#Ѕ%Xݤ"Йkǐd rgϞHݞ={8 ?+$΃Ԧ5lRфem,lAݝi&3i)>A['!j-P(G 3k~s ,[%,-:t} }-+*&¿ gPG݅ج8"eŲ]A b ;l õWϙ2_E,(ۈ#Zsێ<5)"E6N#ӽEkۃO0}*rUt.iei #]r >cU{t7+ԙg߃xuWB_-%=^ t0uvW9 %/VBW'_tMۓP\>@y0`D i|[` hh)Tj0B#ЪhU# ~yhu fp#1I/I"0! 'Sdd:J5ǖ"sdy#R7wAgdJ7kʕn^:}nWFVst$gj-tԝr_װ_7Z ~V54V }o[G=Nd>-UlaY5V}xg[?k&>srq߀].r_r_qsGjy4k iQܟBZ-<(d=dKO a/zv7]ǰod}sn?TF'|3Nn#I?"mzv~K=گsl<b|_|4>?pߋQrib 2* (Ѧh{28oIyes8';Z9h6g>xRx'b8ՃWOϫ[xn%|^z}%x c8eXIfMM*i_@IDATxE 9+HD% `@DEP1'30zL;11+x QD@D2H΂^vٙݝ}ggCo{*9$J"("(@zE@PE@PE vE@PE@P"hNE@PE@PT>("("ST)Z"("( E@PE@Pr 9[+SE@PE@PT"("(@NP4pke"("(*jPE@PE@)*nLPE@PE@P"("(9E@М­)"("}@PE@PE Tim1lժU?']TZUV\VZyf_d3iT" 64uoݺ5pʕ+; 6l ׯ^zf͚Pyk֬)`tPkԨ!lٲ%p *HӦM ?Sd[]6T^p^ziӦMf|X"aV~ \դIeƍi+xT4nXV^3/I]Z5e˖mX9pw BayL 1¼s繁ݷC]y.* ;O+x23! sFG5jZnp{~䖉ܿvݬYҒP_hE@PE@Pl h6P2E@PE@P|PAPE@PE B[ٳg 6J"("(A@q/d>Z:u$vRE@PE@(Sg)̞={=diӦ 0}GPE@PE 3T7z9|܊"Sp9-WNE@PDPS _{^g" npVN, Ƨt"ϱ+7tv@]{"(@@iRbrjq_Y X2%xx(ʁʴ,ʴPT%L[ rDz'OxQGI.]"("B~#Mi)#ݾ(ˁ83Ly(FP#_GUE@P!@DP&l$a-S BL!&^pQO,LyB}3#-9Ss BfPa)>liW_MR|ꩧ Eʶ"(@yFmx%E <V%V~Xe"("+vKI+*:OCH4x`-_PE@=lcE@'ӠA(xLN:d<% kJ[}b a<jz0y(Lyo?ikm6o՘$<|K6m(;J`pϵ,MRKr a]#0M6l 8qƝX8 MIؼK5jȯ*"/1gX? vp c V%Le]A :vŒW'j0mҿ+NP闌08l 8xYf*'*>E@@ ۛX裏EdERE@(HV?m^%Om~+|oqcUQE@(p@˫]g_?b'39Z*ǜhu"(eA0:ھ hE^F>s)"5kB@{o1cʕ+?e?!h>#7t_.s)"W^yE.R;wz2tDw}2e9se2`MI)Ez)[Ȧ(ϗ>Xi֬xST?)"|zPRm +Py߃|SVTPoTeEQ i.ST(4KE#@"(@@;ݼoFS C4VHMsb >^v_}\ϟ?65+Lآ,2yrɄRo_ ҎtaU SE@P @"]wuҾ+ӦM mk&ݻw?G=_6Ղb@|,2("P1c9DA{.|@;ygSOMm~u$*>x h_xZxL9VE@P#`] v: "X e4jي"(@-" lk?;(ƍ+qy!^C[Oi6}w;$o~'N(}v>R,E+@H#Ed."Ozg}̚5KZye3n?O>dyh` Izx͛嬳2~ڌ9J5#fKS, a$uɔ`PM@nj#8uСCoK.D{1kΛ7vsor)z֭^{ 8e:۲dg=z_WyO?4o,<@y@vQY=.ۙ)B2^G)_0EWhҤ2wRc;6Q>A]KUCH0D^Bb6ZݺuC o5ێI& eJ`\ꫯ?n ?l1|e|fn!Hd >fϞ-~x%ӥ[ncu&=Gм0 X3<$dD# A7A~1ƓŽ0s y/{Dil؂҇ 41",.mj@υ0+Ntw_^Bb XvrB:"҉K8Ν;'g%NR-o3y9r9H~ ݍ,&01S_~wdיߴ?l0,@ˤ;n|-]D5Ƣ@qfl}Ι mJ5^ 9&H_glCA7y/|f 2RO_'oɞCYx&d!}ɻvab*d!9_<m3nqkI;2A}o ]6|,Z)@:)'Ѣ"0qVЗ&e0^e2B(ɓ''ʧ.̴aƢg!Ac, Lda찼=\o7Ik";Xc^A ӷx).}/H\ƫ qp A7;)|a@4~A_XXk9sA\mϟwQnvA闺}X #FHptȐ!O{nO +Z>6l۬Y3V cxv̔7[^䭷኉o,kE@(  1ZHCB)FȦvӄF{4J#s(T 4(~7l}xs|rxA"k7E `b0!ĥcy[|Pb>РB{a4%xbݺL(!tﰇum Sm3@Xs[Go]5>7k6(yFM$n~e˖kd+\ M D}mb.X,+@#܁=SZ4:pχV`9sL"?-xkx+`sP 'kYQFf~sv]6a={;a)_^f?AиO(KB//VNGAڶmh`jBȂ #3k'ߢ>(+`UGg_E pdqkF8<)YGOY!hB˧Үt)z%h~E@PE@PJAn×h}pE@PE@&@&o.[|?_PE@P$MTi2u X-Z$O>q?AtAig}>0.5w4"("PpȆS>,,sy֬E"8=C 3oyMhlT} 1q0T•N6F}Z"("PpIВO*?mz"}UU_MUOᓲQFcQW)"(@>kOP4G"Yi="j;w.YܷZPE pfĉN ]Bl7TF2CqI*f SO=%/BB I4/n޹+xQby;v g 6&E@Pr-ܲ]뮻Nn2ey,[,\؅d^|i48a9StK/Tf̘!<q&݂L3*N:r4͓K>3iРMVwϞ=BCPn?"(G 7 u1ٳᅲjѢ<;B);UVv /R%aGA{yI'E8h 1bL<B(z*Q;+D^;J-x@z-cǎ5UW]4wE@P&~x75M:U:wvK(ŋ]v ]4.8JcoffQ/QW'y&3KJU&){E9ߏIB+2m_ݙ:c|0ݱy ĺugҤIի Dr uħeEfOׯ_@C||wy&_j|vFya;daf͚xieҏn[~˾,sfq6mWMks}5H_sBӾyԮ]VַN:z-7nu]$O 3;|Sǎ s/?YhFQx2tD6vly΅ʑA^[C\N?r((X(JUsx}-CѤgJvd֯d˥Jl[w4: qڵ0*j|r" ~Owӧo~:/ 6g؅3BnW/o`;?lJ FC J MuXg%ay7+ NdϹI&fO#A:0Hf|9;wƒÒ,Γa*_9^\WPda~SVPnTeV -Kmږ owҮ'rl=)O(J):,o@d?ڵѣGu=>=zH;h8޽{jBE@PCNߌH|p膜w,YU>)cvBCWR2Cz!B666 z>y9',q򝏒"(@Geaf/!82j}g_+ĩl1W&?o(|;> 83g6ʫyNl?V@("@prh30ۡffJnS^bϿV6n"4/L~:B%ORGc_E@P2(zlzqKF{G?SD׿Qn5/APf*fU-SPE@hBOq~5,6&( eM]īF6W4j"(@8<9,0R껅uwyKQQ2bSa]fTq3NI*}[PE@įejNW.{t_9b1oՄ738ﰯh1É~QVbQbe)"#g5rݟ ~4Rќt(-y޿#Y$S4&}o58پ}{>|xL8S6E@PMlBztXh֗5[߾2yfĽvnݺr|_ E ߫V2§nA7on|ù"P *Ȍ3L8kΜ9Ewc@ɠ?Ζ6ʓo4-[+9ctVþFu*W-IhB+`h zK/d{U4GY}dJm2+@s+1FOUKE1~Pϫ/t],{.;یƸF\uիWB\8 1x c6* "(e ~NFzmdEi̤2fN,%Ҥ欶|JxUMY,U?VM?8ԯT7]s4jAvemZZeY5.*fu8Wq'\pv3 ]azC!+VݻKcȝ/:)Se٧J2щЇ0ͧyҹ*ٽZizZPK#\.]UC) ((+S MYeIʙBmذeh:==i*W,w\q;oҳg,׬+EtwN;-_w}V@5RJIx:},K\^p"pJy V8yӉ6eMrkQU,_]MA,AV*?\I~sBC/m [SDM˗婷k۟_kIimJ 7"; Dʄ9J*1UV`_D}rc?¦j[z2/s,oF.]*]vumRhʕ+eҪU+sR(Nϟ?_gZ|rꩧ@Gޒڵk׊@o%2i%&Tc1kj"@7:~{p嗎Wswj9w5 ?yf#Yfoel EoOҼ&iX{4tEjT܊V ֑)uŎW&>V>},^W#h%k[iL.^XBWӦM3N5m:Tdc'^}I&cɿ/s|ʔ)r7.?uYr,m׮Ѹ2|>sqr\*n[!_g*@GX s5=cI|w9tPۥK.2p@9䨣2/ & /`TۣF#F_5V +ٶ#['G@#[ K@J=/79QOYXLz$ M^޽ͻz6m뮓K.DNUBXӧD")^T[~j;7hnrb;QG漣EC5s}9=^[sx M#Κ%uMnP~2LqsҺuk6lyVk׮J?Es76xrk-7x\?ٞԸqcO^eI2%\,U#]^ ԟnzo]iuI~g (ga7|͞=6XWӧOnݺX<)i-կ_H$>6wx ŒWWU3 k+<;^}U/e3dY Mn;/IjvB 0oI+&˖-K(9 dQPڲeK*{'OώK<^s;eU˵<}YL3Uʼn"@y`A3FNs8˗ jy˪N:1-Q-ap_nĭG}Tv"y)oA_m|۱]//&Ѱ5ZN&˛> &Ӷ{ Y?>1nʤCFlpj,Zt…Ʈ֍V/K>m+6ߌ>ʼ'(y.h}AӳhNmXāKL9Qq eMhBqρA1mC|G"*=쪐~vP[dmw&r^qb'ӟI^{wqohǢ--f$1ʂK^-8OAFۛVͦ~u]`yl;iwMP&nm')'>C($'|h^7,&X q&o¹eu-RE{a5'l DeY㝪ŒyZ}x7zغv|$m;C1Ç7c:xq.Uw[girMo4',v[6W0;iW(Ȃ,DsĖDb{Ͷ}s jڴif.1,ShQ@6H 5w^x^{5$c=M8ф"DTR yɡ*~z.};L~mze܁1PGfqj,V?(eO8:1+PK )-(>nn/)Y؝D1h"р-'Cn9[{ ' Y?)4h kMd% 9u-bCK> Bi w`W,ưo,mc|bm<Ƣ_=z_(K*`|`RqLfLDRIp!`yP4~́fr~eFu?-}ߜkժy'@ɋ ¾-T&PEhϨ()4/s?ia! 4v ccoی+j,4ed% roJB侳RNYRGf9wk.-&Yc\Ȅ9Ni[%p='7q:S8E[1§;j6'Ss[~+;NCvF>oS7XK3#0:>hsށCb^5G)>t(sza_씶JBtcrCJ`=w h8ЅS~KLC 1vJ?Kww:E 3=\o2yv,y晴 g^O`l3q<0VbhˤZb- ;m6lYqHP43q(?irڜ{| ȑG)M]w53ݻ[!"x P!K~!!>%i㛴J"^&M\ab [kݛoio~3^oyWJ?izrWtP*Nq^P:LlX7n]ёl3 ;Q;8ㆅĊ0J#@\wX#$z :^xq%V!@ Qn2g./CPѬ .RDPLD^#x?XfN-˂ECv8|c@.(j/AދSj*G??mlcyFQvK󙍥Oc6Hje$(gma?f-7'gyIQ*Zc&!%+!~w ;r>e+,:gpCv sq&^Zt4#S -v( P@hE_gŏ#xf˭-P'ڱcGu($$:ߗvnIN,cm^%w) O4g6[*;+ɟOI![Q/9^ja=ѼysZNJ`Fz>NH Qxڜg=sf r(œ#l\6]//W;A B;|M[vxḶc\K/MPKnB㉛AX\s1$B\YzjwS^;R6]Nʡިrk F4sY*1GԌ> ;o] ?VG6m)խ챛Ke8eh>ep§7nq0W^|FeRk׮*J޽M$VvGPȘlFaLat86vXR3#M N[A(L]A״e"_3g4^{%|ШH=SKhD hr'BYQ# Bo얢t[KvS] 86N*a҇nW=`ήp&OW(?:}mk2ʪAHN.l2< n%Ň#yq^uU1=9Xm11M[?! wZb7RC>m;c^JDCl%E@#-(\: p(L9YϼtI&,LA ļ l@NZ7/ɮ( pxY}N[T9 _Uf̭K&P:gA~-r!?,h}m2uv=SGȾ{wx6n'(}r舐lg-Q6[ J@`ǁv5rfAP[ ŋn:w}.DXhh= 'S9ǶQGe1@x J={4v̷~pO)zFi EH &΄v5w6Lx >WJR-_lψv a1p O>\+&Ż6D۹; !ek&AիWˇ~h&GNs/1 P(YE;c{ꩧu\3Y `JL"gyfb4}~,2)?s nLҨ6gIzOGSSدTI3-AGN: P/؁1Ύ=X#&s.9)ţx*|f`zyMfe=R^O]8e͡5u[&ɜ*[֮BӊNTho@ bQl/sH <8b9ï|S{=Y) w]%j,6UʪuդA-iՁ8|ez_+ȧk;+8MPF[C ׿[nI'݂O X%b[|voR~_*Ent ލ^+##8¼4BqVɡҝwG+ӭ̑^ *Мc'jr'9ܴ*d>D} oʏYcPaJ+_haE%bJ> '9Nve#3Ml5 /54vt͝,c([w J_J~uOݎ75m ϗVZɕW^i|~&-Rه2t o|aviMkm|1hW|4752j߾hj0v1n?.%bn9 VU]< [qvqxA+Hyݹ RN:V'vv ~\|ZD}*8 m`tsLD~ZI^J8bV*H16820t+k$Sqtn2M -9[d6_Lx,0a13$!- Alc{ʋ)P ""/) JJ2|zg&?`_wp/{/oAG+.\i>4ڊ|f'(Va/\Ÿk a+K_ A7pt{tߏ5+җuXJO3aGP?3n~o{aAxfZݿkE͡ 1!~y_Q<_n;vR#W&*kM!hjvEliJE@H1Nh; -k4Nb( x꫍dya;.@69Y"!ǥ_{98XDArEA~|nZQ>V~$(6h8+رz':a$qM(A3W\aUnڼ(x!rFFNZ"P`h2zvD!4F!<-yv9n O Z_M3ʵ!]Ϩv>lR!zӳ Tđl}#zb{p`%N[IگGս{I&Eׄč)͂Y8`{wb2q#LlK3ruHȻpv*Ϛ)}gbbeslsW"Jdymt[\ljԩQR"&cmZ"P ǀR4gq-'|Byϖ< 6ĉJ*l~#tsN[-̓kJl964UlD3p کᏲ{˵ڝIHLѼ"(@eW_}e]v5{֏@̖y6m7{%%jP" ,0p9Ŏޢ(+]vrv{v\%6$Lo!,iBJEe[m0xSϝ;7/[yxIaX~=B A1cv Op("-GxD[r5ϵ'A Ǐ8Il&+Xj&&<u@)gFwW\*XSiЊsͫD(0xS.Od)ԯ${;ȗ}֨U) 79CP)q:~!U/[$l7Ѯ"(@YBOV=+-M!֞3gN(w\lluoioXm>oy݉mxl^/DAؚ޳D eyrhCmK}|OP,e{TSuwP~L})UFn>}LfZ~zF3|k"(#5}MJQd[RoB(Ã@V„dy&rtjA{mvwmW-^X2E󙉠u&W,]64lBbuFm+LT9jV("P r򼛼Bf |B%X"@zc<ϕʺU[I_vB˦aM$j@IDAT5k2(bϋ]˥vڙ.TCc-n{"("-2v h3^t{)ѨZߤG?'&oKO? Cbyg#ZnÏ+6rタ_ܹ^rCw2!AiC VEBl+"IQPBNJP裯@MaJ|E|)lں:N8Z^h=WI?9;EnU Y+#loKL5ZP\!P{2:,L"g}̚5KZyw}rw4{MQ/Eyfa|͘ƢoE"(9@Fxɔ:Jj(c͜ejǷ_~-ߜW~LQy3ZNԣƆ;O0+t={, p̊Vtf O5w\sߪgy7epO#D%­%lFO0D0>VC &hEa

}tw,"=ܓȋ;0 x 3E߱8t9y6P347|p5[nS+2^ (Vx꫉{z իWA4Xm "~H# Hߐ yldҭ?_?ǁ9s 7`YV^5de^˖-MΰwjIZ^.-+UsK' Hh>_\,#խƆX  >l>قXlvtVhjvۗ-C>PB*/WV{6m:af. 9aYJh_h7|P7yXi8&^mBrgoJၗQӦM nh$k׆*D343yƕ>iXjѢ/>xSSkK!@w*!3ճPX\veb8zh4hP|wV69OZl>N=s"!jqprY|ɉ>WW`[/N/JdL'8c@p;I j<ůL?o(]~?xgwe=V(/6>0Ӵ ~v%E@(TUmfѐTcѦoE@ڬy+&M,. PX9s-ҡZfN]ٰLtgIiU>h--lG9rpwP|L2۵DXWEVӢߊ@4E>ݥEwV 3L v{'( &pS˸/v2#G͔*67' N *Z"("%>`뮻Jޮ];PM'RPT C{8xZ7+vDj}ulz}egƪ8/vv~etd/rUCF+"(@BIa~ Y_Z _C6njxl| 8 [g9oE@PE@P9]%~ׂvMlyh5os JUs"kg.ۡ8&o?7 -izSPE@( گ;7~9v6}\, _6< s̔;գT4WHg3gJ׮]~X#^F!s]l٫J -$G^j<h]El"PNGh+ i!B赧O[1ىvmm0%g:&6;N*ժ3~&m"_:u4NbwsM^x7Q6H6mIF4q1c\཭+Z.k3/UW\!{^* b}aig;i'}g-U5~>ݶ2qjqپZ􇯥z ((8nZlš*|J#=dӢ-yb~+@j?|iڴiDy|mf2J_ kh ?bիWBIA 9Ļnݺm/v;v4m.N N'ʠ]ۊR8lv cWYri^{;6G~'+ ŅGQoo\o8ߵ9j_%Rg֩?ݛ^ ͓˺^|-NA=ƪ=WR4nX].kw N}Jv:炂YJs\ Vh?o̭e M07ttӦM%4eŊFm(){ibû<{M3@)'l~z%' 3˺q}ݑaLz('Ec m;, %E470}uuzgԦ2]d͆w:7(uK-֨X]9RSChKѸz5|I;vll=Wp`o/oԃM!VE@(b8vg,YVMDLPO&Ϭ%7M7;VͭҰf<۶X'jm<&Y~OB.![}&AiܸqeAG@9 fмs9`(@&M.%Ó&M_|1)SYF[|oAZ5]Y8dS@nn좰AAFar7d#rp]v1>ݿ"w\,eh,M1}7T9#=T,v&i&k/V|:^0bh5G:hР;u$|E@P8#РAhA\hI}QTa<餓k;dLl(yAu/ꁜl#Ђ"̲|A|_f>Se%E Z{h E X%KN+-G o庩>}pnOPE@8/O>sj@sxՇcO>Ds=w}7- JlgϞmBubc[%E?)Z+RظqFw`o1fMx&!4RPmC<g/_.+Q7=zȧ~Z~T0ȻvIԇ[v)jE ''nbR)p[n1(Lb?cr 70j @߹8q|{z7B\ڵk]2 FUV9i"'edZ*J>cdkh7fTeL]m;w߬(MÇrf>-!ХK3!gkTKE\rIF~ALF)=ztYL:l#׬Y(O\r 9o<ӳn [^{ٓ ͟?DN8!n˲V ߔU9DQU9E@S)!bR|@x[n5 C0"抢g[$܄4;ȷ~mt$2 _Xi*!|[o59#'+?CvC5nIi2G xc^lV[Sh"~'3f̐e˖ HҰaThg>%ߩBӉ2.'5Ls=ho=~j{[ .FαwH6n7nk|^~!\pʡ-",|Կ۷s"LlA1; 648U$势i@e֞EltįVzuۇ ja˘Sز OL ^{eL0?#j [fK. gʻmC7x! WƢmk|XQ^.PGغc[6~٪+؀龍VĸQi@qcn[fM21H95HFUVdn)qGnɏt KDKȄ4hIv8lET^{͸޻OLpO|4?M=~y}Bd '(Y[6P } Xp݃09L*/LlvS, x~mfK8(܏TcBt` vŁ @=bGTo s;mViѢE GC CAs<no*@n0/ ѩ{u[n]" X ńÍ;[BcCqXP:7ߎExS_aWAKР{]-b{+ $c*iK9Ў[/Y"cvBX|Ɲn@E BE;j&zT'L:5~Zl)|,!u \< 9=6o&mxj:ylF$:ug;/lv^YX,iE!&Is5R!tq=Y{c+M^k7`a5Wn^c9Dn['t\xa&ϵzv۴6ҖTcѦoE@P 3/rӖ\J9̣ՋӋKlP/icOg:˧~g6= n-Le9a .b4q:UeuG~c/WE";MhCa1a׎]`( BCXC9~+ѣGIhCB"sbݗ&T]tEocL8wu;[Z0iE@PAwRM4@dP x_h>romB0l2d)3Lde}'B K ohe}V@w^MN-nx*?h2ng2- ǖeYQnYhtF2r IxqkNm^)?gp`p~(9|̖[.%%43gδ&I믛ɁzLHJ lhl!Q/vq@Rڤ?[QC(+* (VC`@+|,(NŸ' ʁ۠eӃLLV4Z6tСjft N xq(=^bb|&V;qѰ2ހJe(5r^$KG"u]Yߗdf#P){_AGHbQ6>EQl7(+*[ B#c5 1ioc"D7PzU FJAi9p( I4"`b*pega2*KS4|X%2`ꪫ'niD:>la&c~2գ+ @?{^ؾH*@<`mN[< *g%Y"nȐ!r%8HDd6V)"( AKZnhg {gNSE@PE enm"("o]E@PE@PE ;\TE@PE@PTFo+"("d@("("0ӭZtQGSE_}U^0`@?)r"',7K^xaџԝJ9rRgYte央ݻ_Zxƍz]kҥY,rBf*pB}9*q9acŲ1$gc8݆}9s Հ:qh'g>u6_#||ƴ7D=+|grY?0e]~FQ9د~^zɮ[n-Kk׮ZQg=#gZIg[\j֬$>äm۶u;ڸqlU(I&.bRgڵk'zh1>&vN*+Jڷo/}=zNἧx_Ņ^zqa)UnuBE@PE@P"_IPE@P#Pb_X۸q8'd]v)QǷ~+_|QFߢgرҲeKXx ?ԻhѢħyQViZfL8Q֫UV-[ȧ~jnڴTT)[T[n5ZJP)z2cƌD7o, 4D9||R~}qo1\R&L`6lHM6Uۣl_Y~כ~ʔ)2fO?d1ώi;eDlǯs]ժUsWjڰa|GۋQtˈbJoE%wbܤcx~5UTI$MST}>Q"| ld٣ޙw_\ toYf͚%}MIE6y<]V.bqe2MLmy<_tI'E\sMs-r&"݂hE?GqhzSXL bhp&N8hΜ9hG4O9:Q%8/Q\%9/آ^{}'9(IZmK9/]fns/4*26 g-K_ФIO۞(_csĈGY,^+2g[ڳsWu^a6E9O;7&8Q32[Q=+?t} LM;;PE~z"_tWx'*v]O6O=䅳:lTg2Oݴixr)X 8BѺ٭DLG^r&O9r٦v7IFO$X-OhBil .0_[0Vl<GVO?ٖiF6l0S+J~Xu1j[±8ju3iժEk(m7VM?Ǵ4`FN=T }QF%ٲJTẹt0q)vs$= [dqSk)m푵qVFcY v+"HoXV"3f8Z`31LܦB ֯_/-]\=x{t`!l7q'h)]F6ٳsu^-ZHnݼ'bbqf9!Q"nQA( X_r$zʌ_EOƋw>IEyB1K/ŨTkACdՏ(^6 zG˱k"!7>(YClj4{bo/'W,ШÍc`Z~q?s*乻(EB=mǾm!ڿ\=vVz;G=GDlyBVsꪫ?W?Co6ٳ _gkMz-qB{l]a)쿝Ʀ~EL(ڕnYUHާMaM*<6qv{%Euq? 03 A@ ƸģF]WMqnF԰,шƨh0h(D< 鞮sfUSU]VRu{vቖ̸'*w}H6)$Zoqx4CIȑ#-f8zUAsS͖ZOm)).#Aslb_wxީ8oC?zTskt#mSOYst3gsVNx|Iv/5kָ_|j4GRմJ@E.]oU17tS1KzJ_Gաz,SZ]tU Oj/#U8UQ+HTlokk~UҪ'*SRT~LRSׯ}~ @XVmP#MÝ?:jvCIE1K.݈/=JTw{o$֕}hiPh8lP34ʣtnR*"7pQWVRRq|&ZT|%:ub_i{=NyFa̘1kSmJ1OYs]k%\)(zoMHhu]P9='Riu#`c{qnT 9 N1UIA+^W*m}6̺i㏷T:T!ٌ֫C)S^Pt*_W*xˈW:7؊^WU",_y⼉o=OM@񇉶)|mK}"2SW\[o"兩;ox;AܭL$(>Ak;tcڜ+NU@yOW:Tb?^ 7Ikj3_,[ `.Cu<6޾u6T*]F*j}U S"T756q$E)_󋷬L'ͤ>F@P6y2  ILn@@ @pe@@ g  @ N' 亀3<}tͿ/.z޳!ٰF@hPzUIK hx[ i6lmܸ1 Kf 5?n 5h{UW=mHz| /7]W^y 0iӦ7 }vo~Ⱥ:wk:v: ʕ+Gqoҫݛintsq.]x.zR'ݻ5^qz5^'^-g͛7~)9~y.z=Ι~?zթtΘ1-GU5㷾-ۆQvop'*ecNygfr]{1׫fvo>R7Z͍]SOWS5!R(PGkHY9"yWf7lѢEuӟ>ne7W_uS)U/Yč7n?Q@YN"s1?RRyhO<_|;"$E_׿5h #'r֭vGΕʨG%/^8pu};mŊvz-r/}K~?䫀J%uK*3gȷ^IL[4NՊO?bT5͛SN/45rx:.@ h r jgs)wN8w#DYY+ MKJjo_*!! "USK}u7]*裏}YW-@VÔ6䙀? :5T}e |* j멤k\tRm:J@SgWK]2ҶtT,t_`C^Պ$]3(Ҧn;ǏoӮ?;"mҬs. yj*Ou< |ܻ`* "EMUϭ.W\q͜9ӝO @nFײBlKJh,jIz|ۨ*^] 0awn\pkXj*,T*]az4ȑ#sCUgvՂ*LUwխsz.Pۗ/*e)--uP=bG04ݘCSՠ y$U@*j'3uu3QtUFң̼ȟ!Q]]힭۵kt#@D@Kҹ ts55hԲ/&al-[nvj:P{5V,0|7N=l^wâOMs38pOMf-g},'&>'Z\0^mzQ0*n7uѣG[Az赪UͧjuC@%O VVP{449Rջ(l(@JMUǓ@| ǽN@@ 4@G|@ȠhY5  3  A j@@ @qg@@ g  @> ^'  @@3Ϫ@@| ǽN@@ fU# (@{<# (3;w3XqAA|>cYRRbVSSӘrzږ-[ZuuuN1+..6;R9d.}o޽y'}¡ht۷/Mڷo(T\'@#ҪܗBfkݺ頀<br9d.Hiժm߾=8"`?7)IDATvٵk Hu0@@ ey   B1>s{mٲe 3/iz  @xB>36a„@{ ڈ#죏>1cجY{mҤI鯼J[zu1@@  IǏo7oј6n8o6m < H:w|.'I@#>L&|=ױc؁ 2[RCϱThtRɥOiJKK'q%w}?{uV?;T">7,Mix'u}2@ٽ{Lڬp4+w•Iik[y!d]sUX}h҃+**1r|v_h: $]I]v dV0-Z4]tѣG T{\sp|Ӆ#=[}1<kRUpKO׵Z@$c?"Bs|MI̙F͛7iOzVrO:$[xYsεO>G@@hK@sUW_RWZd{dS5jC^$ٳ 6M?@@ *㔢ɧzʶmfm۶G 4/;>lW@Ch@@  @ EQ@@-6fc@@ MV@@ M@@ MV@@ M@@ MV@@ M@@ MV@@ M@@ MV@@ M@@ MV@@ M@@ MV@@(Jj,ʲ<7 ]v'dl q_s4+bLOU}q_eʦ]RWWMz[8XWYYI=}lΝ X$dر#3#9غukrh+tPʹAa#_^^[ø[|}VUUe555ͷI\۷۷[mmm֥KB|ẗ  h2j̃  hẗ  h2j̃  hẗ  h2j̃  hẗ  h2j̃  hẗ  h2j̃  hẗ  h2j̃  hẗ  h2j̃  hẗ  @Q235<?fU_CW>@@@hн{ڳ>KUWWۻkSN @z!۰amM?`P_@@ \ @+++;~_k_?X|G >@@B*4kɒ%ꫯӣ={ؖ-[lӦM6o<UE{={͚5ڵk~@6tPo۹s[l)`߱cG.f/+cN֭[37c${}D:(PQQaUUUVSSID@?۷7|p.] /`ַL'}Ci۶m ځ![~y&! dF ҥK_j@GVZm߾ݮ:뫮Ξ{9;3 3@F   4{MI?яܰ>}E]dFaÆ|`ÇLO  @xB'4h͙3/]v~}:@@P pTNyZL dN gf@@6Fi@@,6MacjU@@@ VX  Q4,@@ V4ք!  i M#.F@ 5a  @@ӈˢ@@b@cM  F4h@@XX  Q4,@@ V /_YPP`EEy# MC B~L޺[8Xn}ux9HT2),,Lt>KjX /0}qlٲaD4%ɥD_aܮ\KHp"*'VZفo!^ʤ.[MtV]]Y_Ν;s<^Mtv5^77 [V\\yRQQaUUUVSS54;KJJݻw[mmmNC|H64Y9C@HJ4)6fB@HV %ĉm1۰n:޽ٳ'f@@S 6;v_NM[oe_K.7ry@@@ @۴icׯ تUlӦMvZ_Sw vL   I=cG} 2Q@@ 4)|׻Nc?_~ޤ|" @JPgu-^Ai1@@ /Rq/üW D@h@J˗5\cgyfV  '8y#  HI Qsϵ'leee 7@@ R-[n% A" y)*ߪ,F@hP %%zgwڵ3@@ R3|zVڵ+٢rJQN#8i  yꫯs~OooY}ן{%K޸SNu#g@@ 4) @ufN r6lXREjÇ^t[m̙n3f̰nt  C %htva~u=dq+UOSvwk^jӦm޼uڞ8I| :@h 61;l&$U?~dce~ak۶Ϸ .֮]ׯZ555VZZNs@[nzLa4Q)N+V/?q_pr06__EE{ $k߾m߾=M.]VJ:e۶m[OeZfwyIm\uu+nٲy䑶~TͿe/@@$U_}U뮻lĉ6gSxII[`[ҥK]׾5KK\R:餓ܣܹs@H! N %Uzwӟd;wN:aw\3$^{׿v6mn> & WE?rHWݳgOw}W   "T\hݩϱcǺG({IeOiӦv 4;zIg}۷>  ^Tkv5׸p/HT;_MmܽƣT=g<# HIإT=Џ  _) @9NSwvjy 7nСC~[@@)i|MN=JԃuCJ'!  $ݡg՛^xaC  ) @;ɡC+8sk@@ Rt/kz뭮oс  @JJ@!_|/:p@>}!#|:@@HI h]]]6rΝ.I  H %Yge>`Tiƍw&G?@@@J/rm0߿=3@#  $tѣm…>}ةjEE)[t  d@JC]$@@ h3@@)-[˖-úy9]F@P m@nj}+_.]4V^m}?C֯_?@@:={͜9N?ty1ص^Cن m۶n܀@c C hmm=c6i$ի]vev饗í]v˗۝wi=z @@ |mZXXh> >Ŷw^۵k)0N{-[ئMw]6z뮫'! dF %(++s*)S9cGqD@jŊo>{wU뙊C oƍMfH@_S,#衾ubo&ASN($uVp9aSOӘ{6k,Zo߾O<-Û[n}v4IhҺukSM@IIoǎC@eTaɬܹ3M*++@7vX;ꨣ'?Z~ڶm"څnH҉Т}1yi|zi Ih"gWyE٨Qܯ6mmOO  @Bmj)t嗻@@+*ư]gcĘ@Ȍ@c   m# 4II|̌  XƊ1=  @@   m# 4II|̌  XƊ1=  @@   m# 4II|̌  XƊ1=  @@   m# 4IIsg%%%VVV[ݮ]fJLx=FPnW^ ),,LLI]]]l`^ee%&  @g;wL¨ lݺȹ1 R< 0nW^ )//w򮨨*940Tվ}{۾}D.]UI1#  @2ɨ1  @I1#  @2y4(A#³1͸%ӧOoƵe8ɖc?  UYX@@ @@@ @jw  @ f>$  @V fbc@@ }H@@ ͪ" /@  Y%@UE@_4!9@@J n/-[,!ƿKI  upB1b}G6f5kV{M44W^iWnp:" d^( &Ol~v饗ȑ#mȐ!ֲeKO>ϟo3gδ-Z،3oٟ@@6kڀ֑Gi[O?z \MSN5kآEa{k#ZJB|w AD߭aܮX}QTTd%%%ORx4ڣeƍVVVfvWVVږ-[uLýԦMۼy>|M7n?lڴiֻwo?/B:$va4#ZLo~O"a z8Nq|4 @ 6*ןNӔ 3߿֯_b\Tbs\^RyرUUUٮ]?gj۶m۶-T[nMj\c$WU0? ޽{M_f۷M61ӹs礳C{n۷o+WUٵk@fTDWk.]ѯw ^R iuuכuuu._gNf2La#>L&x=8F8 It_hW[6gs6vSXVrO:$[xk__sεO>9:t# H %2ꪫ/!ݒ%Kl„ .8UQF;UٳgO6lX@@hH!V5CJԮSjE)TvEy3SNvvjhPP5!  uÆ yWQQ[iz T veɵä~/%^F(tϛO@@p h8*@@ dE|S3Y~U>u#W1?4=][n-"rف+Vp93[NO1ܽz7p<ӵFUYТY+"Ur~Pchc>78 ;'?Ind\\ꫯv{GRl<=FE^uws+bݻwOseTʞ$  @fɎb3@@\Ȋs|dVg??3 B+vӡK@ֹW^jc9&Mxc78CG Z@@ _=O@@ f6;-[f#!P_@o{73M5 \͛#F4&0{ll[oɓ'ZO1c؛o%\سg? ȕ|L8ѦNj/aÆg}¥֢ )''#?cAnK/ÇqMB Z஻Ɓh}9s^PpM7aӧOw%z8  B=^q3zh mA#PXXh>Lݻvڑ;$';wQ›R{x / mтJ稼܊K ;8W :xsr&{)S9cGq4k׮?v5@ Z`ӦMOG{LUUUUѓН*T_tEСC\%~ @0&tq_C9#+M;nF+--m?GԜ_~6aS;/}K5GKX|gFwXIbQy1 Uy;y`رvQGZ''ҥKso矻ԛԩGl_]?9|ߵ*Me4rB[nq7P3^X֭MoE"! ~Qngu\c;SMGjڔz aІ]#*M{\w}ݫ> +OOrwnC nM泞B/ ԤGwj*$ s:wjRH@0@@ T  _4 c@@ @T  _4 c@@ @TS'pL:X6 Ntl@ i@e Ь@@x =K=\p鯨Wܹsm֬Yj*;ꨣ};q[_qͻa?~~ f{Ç޴s;ƿ 6j({wm׮]V^^?#˖-N:>X@ $dG ֭ &믿n~d׮]]^ٷqF_djю;ڂ \PaꫯZaaz]*))~ە=zi&MiӦyV4 C\Xp)X<\|Ŧ?[ooHݻןO qgU?3])I @b@ nS% C8{e'Nt L;uC~t=0#}уU4{Bӧm۶^T*:tPۼy;Uͧы.M> 0Z7)f% ٰFZSO=ojrJ۴i7εlӦtsS7 f%dFW77x~{߷IN4t B\Уy[f+ׯUTT3fjΝ;ܿJIK.vԩSvYF rf]h ArX@U!{RtV׮]k @gFKԝ|8@ f    [4,@@ @@@ f  =   M0G@8A@HhY>  @@4A  @@-@@z@@-@na   pЃ  nt |@@h@@t ?#oIENDB`patchwork/man/wrap_elements.Rd0000644000176200001440000000547114652111104016165 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/wrap_elements.R \name{wrap_elements} \alias{wrap_elements} \title{Wrap arbitrary graphics in a patchwork-compliant patch} \usage{ wrap_elements( panel = NULL, plot = NULL, full = NULL, clip = TRUE, ignore_tag = FALSE ) } \arguments{ \item{panel, plot, full}{A grob, ggplot, patchwork, formula, raster, nativeRaster, or gt object to add to the respective area.} \item{clip}{Should the grobs be clipped if expanding outside its area} \item{ignore_tag}{Should tags be ignored for this patch. This is relevant when using automatic tagging of plots and the content of the patch does not qualify for a tag.} } \value{ A wrapped_patch object } \description{ In order to add non-ggplot2 element to a patchwork they can be converted to a compliant representation using the \code{wrap_elements()} function. This allows you to position either grobs, ggplot objects, patchwork objects, or even base graphics (if passed as a formula) in either the full area, the full plotting area (anything between and including the axis label), or the panel area (only the actual area where data is drawn). Further you can still add title, subtitle, tag, and caption using the same approach as with normal ggplots (using \link[ggplot2:labs]{ggtitle()} and \link[ggplot2:labs]{labs()}) as well as styling using \link[ggplot2:theme]{theme()}. For the latter, only the theme elements targeting plot margins and background as well as title, subtitle, etc styling will have an effect. If a patchwork or ggplot object is wrapped, it will be fixated in its state and will no longer respond to addition of styling, geoms, etc.. When grobs and formulas are added directly, they will implicitly be converted to \code{wrap_elements(full = x)}. } \examples{ library(ggplot2) library(grid) # Combine grobs with each other wrap_elements(panel = textGrob('Here are some text')) + wrap_elements( panel = rectGrob(gp = gpar(fill = 'steelblue')), full = rectGrob(gp = gpar(fill = 'goldenrod')) ) # wrapped elements can still get titles etc like ggplots wrap_elements(panel = textGrob('Here are some text')) + wrap_elements( panel = rectGrob(gp = gpar(fill = 'steelblue')), full = rectGrob(gp = gpar(fill = 'goldenrod')) ) + ggtitle('Title for the amazing rectangles') # You can also pass in ggplots or patchworks to e.g. have it fill out the # panel area p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) p1 + wrap_elements(panel = p1 + ggtitle('Look at me shrink')) # You can even add base graphics if you pass it as a formula (requires gridGraphics package) if (requireNamespace("gridGraphics", quietly = TRUE)) { p1 + wrap_elements(full = ~ plot(mtcars$mpg, mtcars$disp)) # Adding a grob or formula directly is equivalent to placing it in `full` p1 + ~ plot(mtcars$mpg, mtcars$disp) } } patchwork/man/wrap_ggplot_grob.Rd0000644000176200001440000000271213567464644016701 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/wrap_ggplot_grob.R \name{wrap_ggplot_grob} \alias{wrap_ggplot_grob} \title{Make a gtable created from a ggplot object patchwork compliant} \usage{ wrap_ggplot_grob(x) } \arguments{ \item{x}{A gtable as produced by \code{\link[ggplot2:ggplotGrob]{ggplot2::ggplotGrob()}}} } \value{ A \code{table_patch} object to be added to a patchwork } \description{ This function converts a gtable, as produced by \code{\link[ggplot2:ggplotGrob]{ggplot2::ggplotGrob()}} and makes it ready to be added to a patchwork. In contrast to passing the gtable to \code{\link[=wrap_elements]{wrap_elements()}}, \code{wrap_ggplot_grob()} ensures proper alignment as expected. On the other hand major restructuring of the gtable will result in an object that doesn't work properly with \code{wrap_ggplot_grob()}. } \examples{ library(grid) library(gtable) library(ggplot2) p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) + ggtitle('disp and mpg seems connected') p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) # Convert p2 so we can add new stuff to it p2_table <- ggplotGrob(p2) stamp <- textGrob('TOP SECRET', rot = 35, gp = gpar(fontsize = 72, fontface = 'bold') ) p2_table <- gtable_add_grob(p2_table, stamp, t = 1, l = 1, b = nrow(p2_table), r = ncol(p2_table) ) # Adding it directly will loose alignment p1 + p2_table # Use wrap_ggplot_grob to keep alignment p1 + wrap_ggplot_grob(p2_table) } patchwork/man/patchGrob.Rd0000644000176200001440000000122313564736444015245 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/patch.R \name{patchGrob} \alias{patchGrob} \title{Get a grob describing the content of a patch object} \usage{ patchGrob(x, guides = "auto") } \arguments{ \item{x}{An \code{patch} object} } \value{ A \code{gtable} object } \description{ Methods for this generic should be defined for all \code{patch} subclasses and should return a compliant \code{gtable} object ready to be combined with regular plot objects. In general it is best to call \code{patch_table()} on the object and add grobs to this as \code{patch_table()} will return a compliant \code{gtable} } \keyword{internal} patchwork/man/wrap_plots.Rd0000644000176200001440000001021414571545322015516 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/wrap_plots.R \name{wrap_plots} \alias{wrap_plots} \title{Wrap plots into a patchwork} \usage{ wrap_plots( ..., ncol = NULL, nrow = NULL, byrow = NULL, widths = NULL, heights = NULL, guides = NULL, tag_level = NULL, design = NULL, axes = NULL, axis_titles = axes ) } \arguments{ \item{...}{multiple \code{ggplot}s or a list containing \code{ggplot} objects} \item{ncol, nrow}{The dimensions of the grid to create - if both are \code{NULL} it will use the same logic as \link[ggplot2:facet_wrap]{facet_wrap()} to set the dimensions} \item{byrow}{Analogous to \code{byrow} in \link[base:matrix]{matrix()}. If \code{FALSE} the plots will be filled in in column-major order} \item{widths, heights}{The relative widths and heights of each column and row in the grid. Will get repeated to match the dimensions of the grid. The special value of \code{NA}/\verb{-1null} will behave as \verb{1null} unless a fixed aspect plot is inserted in which case it will allow the dimension to expand or contract to match the aspect ratio of the content} \item{guides}{A string specifying how guides should be treated in the layout. \code{'collect'} will collect guides below to the given nesting level, removing duplicates. \code{'keep'} will stop collection at this level and let guides be placed alongside their plot. \code{auto} will allow guides to be collected if a upper level tries, but place them alongside the plot if not. If you modify default guide "position" with \link[ggplot2:theme]{theme(legend.position=...)} while also collecting guides you must apply that change to the overall patchwork (see example).} \item{tag_level}{A string (\code{'keep'} or \code{'new'}) to indicate how auto-tagging should behave. See \code{\link[=plot_annotation]{plot_annotation()}}.} \item{design}{Specification of the location of areas in the layout. Can either be specified as a text string or by concatenating calls to \code{\link[=area]{area()}} together. See the examples for further information on use.} \item{axes}{A string specifying how axes should be treated. \code{'keep'} will retain all axes in individual plots. \code{'collect'} will remove duplicated axes when placed in the same run of rows or columns of the layout. \code{'collect_x'} and \code{'collect_y'} will remove duplicated x-axes in the columns or duplicated y-axes in the rows respectively.} \item{axis_titles}{A string specifying how axis titltes should be treated. \code{'keep'} will retain all axis titles in individual plots. \code{'collect'} will remove duplicated titles in one direction and merge titles in the opposite direction. \code{'collect_x'} and \code{'collect_y'} control this for x-axis titles and y-axis titles respectively.} } \value{ A \code{patchwork} object } \description{ While the use of \code{+} is a natural way to add plots together, it can be difficult to string together multiple plots programmatically if the number of plots is not known beforehand. \code{wrap_plots} makes it easy to take a list of plots and add them into one composition, along with layout specifications. } \details{ If \code{design} is specified as a text string \emph{and} the plots are named (e.g. \code{wrap_plots(A = p1, ...)}) \emph{and} all plot names are single characters represented in the design layout string, the plots will be matched to their respective area by name. Otherwise the areas will be filled out sequentially in the same manner as using the \code{+} operator. See the examples for more. } \examples{ library(ggplot2) p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) p3 <- ggplot(mtcars) + geom_bar(aes(gear)) + facet_wrap(~cyl) p4 <- ggplot(mtcars) + geom_bar(aes(carb)) p5 <- ggplot(mtcars) + geom_violin(aes(cyl, mpg, group = cyl)) # Either add the plots as single arguments wrap_plots(p1, p2, p3, p4, p5) # Or add them as a list... plots <- list(p1, p2, p3, p4, p5) wrap_plots(plots) # Match plots to areas by name design <- "#BB AA#" wrap_plots(B = p1, A = p2, design = design) # Compare to not using named plot arguments wrap_plots(p1, p2, design = design) } patchwork/man/guide_area.Rd0000644000176200001440000000231213567470054015414 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/guide_area.R \name{guide_area} \alias{guide_area} \title{Add an area to hold collected guides} \usage{ guide_area() } \description{ Using the \code{guides} argument in \code{\link[=plot_layout]{plot_layout()}} you can collect and collapse guides from plots. By default these guides will be put on the side like with regular plots, but by adding a \code{guide_area()} to the plot you can tell patchwork to place the guides in that area instead. If guides are not collected or no guides exists to collect it behaves as a standard \code{\link[=plot_spacer]{plot_spacer()}} instead. } \examples{ library(ggplot2) p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp, colour = factor(gear))) p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) p3 <- ggplot(mtcars) + geom_bar(aes(gear)) + facet_wrap(~cyl) # Guides are by default kept beeside their plot p1 + p2 + p3 # They can be collected and placed on the side (according to the patchwork # theme) p1 + p2 + p3 + plot_layout(guides = 'collect', ncol = 2) # Using guide_area() you can also designate an empty area for this p1 + p2 + p3 + guide_area() + plot_layout(guides = 'collect') } patchwork/man/patchworkGrob.Rd0000644000176200001440000000103213564736727016152 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot_patchwork.R \name{patchworkGrob} \alias{patchworkGrob} \title{Convert a patchwork to a gtable} \usage{ patchworkGrob(x) } \arguments{ \item{x}{A \code{patchwork} object} } \value{ A \code{gtable} object } \description{ This function is the patchwork analogue of \code{\link[ggplot2:ggplotGrob]{ggplot2::ggplotGrob()}} in that it takes an unevaluated patchwork object and fixate it into a gtable object to further manipulate directly. } \keyword{internal} patchwork/man/plot_annotation.Rd0000644000176200001440000000603714665524527016554 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot_annotation.R \name{plot_annotation} \alias{plot_annotation} \title{Annotate the final patchwork} \usage{ plot_annotation( title = waiver(), subtitle = waiver(), caption = waiver(), tag_levels = waiver(), tag_prefix = waiver(), tag_suffix = waiver(), tag_sep = waiver(), theme = waiver() ) } \arguments{ \item{title, subtitle, caption}{Text strings to use for the various plot annotations.} \item{tag_levels}{A character vector defining the enumeration format to use at each level. Possible values are \code{'a'} for lowercase letters, \code{'A'} for uppercase letters, \code{'1'} for numbers, \code{'i'} for lowercase Roman numerals, and \code{'I'} for uppercase Roman numerals. It can also be a list containing character vectors defining arbitrary tag sequences. If any element in the list is a scalar and one of \code{'a'}, \code{'A'}, \code{'1'}, \verb{'i}, or \code{'I'}, this level will be expanded to the expected sequence.} \item{tag_prefix, tag_suffix}{Strings that should appear before or after the tag.} \item{tag_sep}{A separator between different tag levels} \item{theme}{A ggplot theme specification to use for the plot. Only elements related to the titles as well as plot margin and background is used.} } \value{ A \code{plot_annotation} object } \description{ The result of this function can be added to a patchwork using \code{+} in the same way as \code{\link[=plot_layout]{plot_layout()}}, but unlike \code{\link[=plot_layout]{plot_layout()}} it will only have an effect on the top level plot. As the name suggests it controls different aspects of the annotation of the final plot, such as titles and tags. Already added annotations can be removed by setting the relevant argument to \code{NULL}. } \details{ Tagging of subplots is done automatically and following the order of the plots as they are added. When the plot contains nested layouts the \code{tag_level} argument in the nested \link{plot_layout} will define whether enumeration should continue as usual or add a new level. The format of the levels are defined with \code{tag_levels} argument in \code{plot_annotation} } \examples{ library(ggplot2) p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) p3 <- ggplot(mtcars) + geom_bar(aes(gear)) + facet_wrap(~cyl) # Add title, etc. to a patchwork p1 + p2 + plot_annotation('This is a title', caption = 'made with patchwork') # Change styling of patchwork elements p1 + p2 + plot_annotation( title = 'This is a title', caption = 'made with patchwork', theme = theme(plot.title = element_text(size = 16)) ) # Add tags to plots p1 / (p2 | p3) + plot_annotation(tag_levels = 'A') # Add multilevel tagging to nested layouts p1 / ((p2 | p3) + plot_layout(tag_level = 'new')) + plot_annotation(tag_levels = c('A', '1')) # Use a custom tag sequence (mixed with a standard one) p1 / ((p2 | p3) + plot_layout(tag_level = 'new')) + plot_annotation(tag_levels = list(c('&', '\%'), '1')) } patchwork/man/patchwork-package.Rd0000644000176200001440000000476214277433671016740 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/patchwork-package.r \docType{package} \name{patchwork-package} \alias{patchwork} \alias{patchwork-package} \title{patchwork: The Composer of Plots} \description{ \if{html}{\figure{logo.png}{options: style='float: right' alt='logo' width='120'}} The 'ggplot2' package provides a strong API for sequentially building up a plot, but does not concern itself with composition of multiple plots. 'patchwork' is a package that expands the API to allow for arbitrarily complex composition of plots by, among others, providing mathematical operators for combining multiple plots. Other packages that try to address this need (but with a different approach) are 'gridExtra' and 'cowplot'. } \section{Overview}{ The use and premise of \code{patchwork} is simple: Just add \code{ggplot2} plots together to compose multiplot layouts. Because of this simplicity there is not much more to say. Still, a few functions allow you to modify the behaviour, e.g.: \itemize{ \item \code{\link[=plot_layout]{plot_layout()}} allows you to define the grid that plots are put into \item \code{\link[=plot_annotation]{plot_annotation()}} allows you to add titles, tags etc. } } \section{Learn more}{ The guides below will teach you all about what you can do with patchwork. \itemize{ \item \href{https://patchwork.data-imaginist.com/articles/patchwork.html}{Getting Started} \item \href{https://patchwork.data-imaginist.com/articles/guides/assembly.html}{Assembling Plots} \item \href{https://patchwork.data-imaginist.com/articles/guides/layout.html}{Defining Layouts} \item \href{https://patchwork.data-imaginist.com/articles/guides/annotation.html}{Adding Annotation} \item \href{https://patchwork.data-imaginist.com/articles/guides/multipage.html}{Aligning across pages} } } \examples{ library(ggplot2) # You can add plots saved to variables p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) p1 + p2 # Or build it up in one step ggplot(mtcars) + geom_point(aes(mpg, disp)) + ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) } \seealso{ Useful links: \itemize{ \item \url{https://patchwork.data-imaginist.com} \item \url{https://github.com/thomasp85/patchwork} \item Report bugs at \url{https://github.com/thomasp85/patchwork/issues} } } \author{ \strong{Maintainer}: Thomas Lin Pedersen \email{thomasp85@gmail.com} (\href{https://orcid.org/0000-0002-5147-4711}{ORCID}) } \keyword{internal} patchwork/man/area.Rd0000644000176200001440000000334714277433671014253 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot_layout.R \name{area} \alias{area} \title{Specify a plotting area in a layout} \usage{ area(t, l, b = t, r = l) } \arguments{ \item{t, b}{The top and bottom bounds of the area in the grid} \item{l, r}{The left and right bounds of the area int the grid} } \value{ A \code{patch_area} object } \description{ This is a small helper used to specify a single area in a rectangular grid that should contain a plot. Objects constructed with \code{area()} can be concatenated together with \code{c()} in order to specify multiple areas. } \details{ The grid that the areas are specified in reference to enumerate rows from top to bottom, and coloumns from left to right. This means that \code{t} and \code{l} should always be less or equal to \code{b} and \code{r} respectively. Instead of specifying area placement with a combination of \code{area()} calls, it is possible to instead pass in a single string \if{html}{\out{

}}\preformatted{areas <- c(area(1, 1, 2, 1), area(2, 3, 3, 3)) }\if{html}{\out{
}} is equivalent to \if{html}{\out{
}}\preformatted{areas < -"A## A#B ##B" }\if{html}{\out{
}} For an example of this, see the \code{\link[=plot_layout]{plot_layout()}} examples. } \examples{ library(ggplot2) p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) p3 <- ggplot(mtcars) + geom_bar(aes(gear)) + facet_wrap(~cyl) layout <- c( area(1, 1), area(1, 3, 3), area(3, 1, 3, 2) ) # Show the layout to make sure it looks as it should plot(layout) # Apply it to a patchwork p1 + p2 + p3 + plot_layout(design = layout) } patchwork/DESCRIPTION0000644000176200001440000000276414671775232014011 0ustar liggesusersPackage: patchwork Type: Package Title: The Composer of Plots Version: 1.3.0 Authors@R: person(given = "Thomas Lin", family = "Pedersen", role = c("cre", "aut"), email = "thomasp85@gmail.com", comment = c(ORCID = "0000-0002-5147-4711")) Maintainer: Thomas Lin Pedersen Description: The 'ggplot2' package provides a strong API for sequentially building up a plot, but does not concern itself with composition of multiple plots. 'patchwork' is a package that expands the API to allow for arbitrarily complex composition of plots by, among others, providing mathematical operators for combining multiple plots. Other packages that try to address this need (but with a different approach) are 'gridExtra' and 'cowplot'. License: MIT + file LICENSE Encoding: UTF-8 Imports: ggplot2 (>= 3.0.0), gtable, grid, stats, grDevices, utils, graphics, rlang (>= 1.0.0), cli, farver RoxygenNote: 7.3.2 URL: https://patchwork.data-imaginist.com, https://github.com/thomasp85/patchwork BugReports: https://github.com/thomasp85/patchwork/issues Suggests: knitr, rmarkdown, gridGraphics, gridExtra, ragg, testthat (>= 2.1.0), vdiffr, covr, png, gt (>= 0.11.0) VignetteBuilder: knitr Config/Needs/website: gifski NeedsCompilation: no Packaged: 2024-09-16 08:14:08 UTC; thomas Author: Thomas Lin Pedersen [cre, aut] () Repository: CRAN Date/Publication: 2024-09-16 09:30:02 UTC