diff --git a/.github/.gitignore b/.github/.gitignore new file mode 100644 index 0000000..2d19fc7 --- /dev/null +++ b/.github/.gitignore @@ -0,0 +1 @@ +*.html diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml new file mode 100644 index 0000000..0f2fe08 --- /dev/null +++ b/.github/workflows/R-CMD-check.yaml @@ -0,0 +1,52 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] + +name: R-CMD-check + +permissions: read-all + +jobs: + R-CMD-check: + runs-on: ${{ matrix.config.os }} + + name: ${{ matrix.config.os }} (${{ matrix.config.r }}) + + strategy: + fail-fast: false + matrix: + config: + - {os: macos-latest, r: 'release'} + - {os: windows-latest, r: 'release'} + - {os: ubuntu-latest, r: 'devel', http-user-agent: 'release'} + - {os: ubuntu-latest, r: 'release'} + - {os: ubuntu-latest, r: 'oldrel-1'} + + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + R_KEEP_PKG_SOURCE: yes + + steps: + - uses: actions/checkout@v4 + + - uses: r-lib/actions/setup-pandoc@v2 + + - uses: r-lib/actions/setup-r@v2 + with: + r-version: ${{ matrix.config.r }} + http-user-agent: ${{ matrix.config.http-user-agent }} + use-public-rspm: true + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::rcmdcheck + needs: check + + - uses: r-lib/actions/check-r-package@v2 + with: + upload-snapshots: true + build_args: 'c("--no-manual","--compact-vignettes=gs+qpdf")' diff --git a/.github/workflows/pkgdown.yaml b/.github/workflows/pkgdown.yaml new file mode 100644 index 0000000..c9f0165 --- /dev/null +++ b/.github/workflows/pkgdown.yaml @@ -0,0 +1,50 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] + release: + types: [published] + workflow_dispatch: + +name: pkgdown + +permissions: read-all + +jobs: + pkgdown: + runs-on: ubuntu-latest + # Only restrict concurrency for non-PR jobs + concurrency: + group: pkgdown-${{ github.event_name != 'pull_request' || github.run_id }} + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + + - uses: r-lib/actions/setup-pandoc@v2 + + - uses: r-lib/actions/setup-r@v2 + with: + use-public-rspm: true + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::pkgdown, local::. + needs: website + + - name: Build site + run: pkgdown::build_site_github_pages(new_process = FALSE, install = FALSE) + shell: Rscript {0} + + - name: Deploy to GitHub pages 🚀 + if: github.event_name != 'pull_request' + uses: JamesIves/github-pages-deploy-action@v4.5.0 + with: + clean: false + branch: gh-pages + folder: docs diff --git a/DESCRIPTION b/DESCRIPTION index 28526c0..43d9efb 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,23 +1,55 @@ Package: learnitgrid Type: Package -Version: 0.1.0 +Version: 0.7.0 Title: Manage Rubrics or Assessment Grids for GitHub Repositories Description: Create and manage semi-automatically rubrics to assess GitHub projects (R scripts, R Markdown or Quarto files). Create directed projects where students have to complete documents and submit them to GitHub (classroom) so that they are evaluated using the rubric (or assessment grid). -Authors@R: c(person("Philippe", "Grosjean", role = c("aut", "cre"), +Authors@R: c( + person("Philippe", "Grosjean", role = c("aut", "cre"), email = "phgrosjean@sciviews.org", - comment = c(ORCID = "0000-0002-2694-9471"))) + comment = c(ORCID = "0000-0002-2694-9471")), + person("Guyliann", "Engels", role = "aut", + email = "guyliann.engels@umons.ac.be", + comment = c(ORCID = "0000-0001-9514-1014"))) Maintainer: Philippe Grosjean Depends: R (>= 4.2.0) -Suggests: +Imports: + data.io, + chart, + collapse, + diffr, + DT, + flashClust, + fs, + ggplot2, + gh, + glue, + highr, + htmlwidgets, + lubridate, + parsermd, + shiny, + shinycssloaders, + shinydashboard, + stats, + stringdist, + svMisc, + tibble +Suggests: knitr, rmarkdown, spelling, testthat (>= 3.0.0) - +Enhances: + learnitdown +Remotes: + SciViews/chart, + SciViews/data.io, + SciViews/svMisc, + learnitr/learnitdown License: MIT + file LICENSE URL: https://github.com/learnitr/learnitgrid, https://learnitr.github.io/learnitgrid/ BugReports: https://github.com/learnitr/learnitgrid/issues diff --git a/NAMESPACE b/NAMESPACE index 6ae9268..a62b1ec 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,2 +1,64 @@ # Generated by roxygen2: do not edit by hand +export(check_grids) +export(chunk_labels) +export(correct_rmd) +export(create_context) +export(dir_path_check) +export(dir_path_create) +export(file_path_check) +export(get_git_stats) +export(link_to_www) +export(populate_table) +export(www_relative) +importFrom(DT,JS) +importFrom(DT,dataTableOutput) +importFrom(DT,datatable) +importFrom(DT,formatStyle) +importFrom(DT,renderDataTable) +importFrom(DT,styleEqual) +importFrom(chart,chart) +importFrom(collapse,GRP) +importFrom(collapse,fcumsum) +importFrom(collapse,roworder) +importFrom(data.io,read) +importFrom(data.io,write) +importFrom(flashClust,hclust) +importFrom(fs,dir_create) +importFrom(fs,dir_exists) +importFrom(fs,dir_ls) +importFrom(fs,file_exists) +importFrom(fs,link_create) +importFrom(fs,link_delete) +importFrom(fs,link_exists) +importFrom(fs,path) +importFrom(ggplot2,geom_histogram) +importFrom(ggplot2,geom_point) +importFrom(ggplot2,geom_step) +importFrom(ggplot2,geom_vline) +importFrom(ggplot2,labs) +importFrom(ggplot2,theme) +importFrom(ggplot2,xlim) +importFrom(gh,gh) +importFrom(gh,gh_whoami) +importFrom(glue,glue) +importFrom(lubridate,with_tz) +importFrom(lubridate,ymd_hms) +importFrom(parsermd,as_document) +importFrom(parsermd,by_section) +importFrom(parsermd,has_label) +importFrom(parsermd,has_type) +importFrom(parsermd,parse_rmd) +importFrom(parsermd,rmd_select) +importFrom(shiny,runApp) +importFrom(shiny,shinyApp) +importFrom(shinycssloaders,withSpinner) +importFrom(shinydashboard,dashboardBody) +importFrom(shinydashboard,dashboardHeader) +importFrom(shinydashboard,dashboardPage) +importFrom(shinydashboard,dashboardSidebar) +importFrom(stats,fivenum) +importFrom(stringdist,stringsim) +importFrom(svMisc,aka) +importFrom(tibble,as_tibble) +importFrom(tibble,tibble) diff --git a/NEWS.md b/NEWS.md index 0fe143a..7656be6 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,23 @@ -# learnitgrid 0.1.0 +# learnitgrid 0.7.0 -- Initial version of the package. +- Repo transferred to learnitr. + +# learnitgrid 0.6.0 + +- Renamed (from shiny_assess) and partly refactored. + +- Second tab by grid added. + +- Use a correction repository and check R objects (to be finished). + +# learnitgrid 0.5.1 + +- Allow for bonus points (max = 0 and score higher than max in this case). + +# learnitgrid 0.5.0 + +- Adjustment for teams + use of _corr.Rmd version. + +# learnitgrid 0.4.0 + +- Versions 0.1.0 - 0.4.0: initial concept and code. diff --git a/R/check_grids.R b/R/check_grids.R new file mode 100644 index 0000000..1edf98e --- /dev/null +++ b/R/check_grids.R @@ -0,0 +1,142 @@ +# Summarize and check evaluation grids (corrections) for learnitdown projects +# Copyright (c) 2021-2022, Philippe Grosjean & Guyliann Engels +# +# Warning: correction for grid_one when grid is a data.table! and NA everywhere -> NA + +# At the point, all the evaluations must be filled. We check there is no missing +# scores and we calculate the final score for each student. The results are +# printed on screen and saved in a .log file in the same directory. + +#res <- stat_git(git_stats, type = c("Rmd", "R")) + + + +#' Summarize and check evaluation grids for the learnitgrid Shiny app +#' +#' @description +#' This function checks all evaluation grids in a correction set and computes +#' the required statistics for the summary page of the learnitgrid shiny app. +#' +#' @param dir The path to the evaluation grids +#' @param save.log Should a log file be saved (yes by default)? +#' @param save.rds Should an RDS file with the data be saved (yes by default)? +#' +#' @return A data frame with the results of the evaluation grids check for the +#' learnitgrid Shiny app. +#' @export +check_grids <- function(dir, save.log = TRUE, save.rds = TRUE) { + stopifnot(is.character(dir), length(dir) == 1, dir_exists(dir)) + + # Get the assignment name + assignment <- substring(basename(dir), 1, nchar(basename(dir)) - 11) + + # Get a list of all .csv files + grids <- dir_ls(dir, glob = "*.csv") + if (!length(grids)) + stop("'No correction grids found in the directory ", dir) + + # Initialize the results + res <- tibble( + assignment = character(0), + team = character(0), + student = character(0), + score_20 = numeric(0), + score = numeric(0), + max = numeric(0), + missing = numeric(0), + wrong = numeric(0), + file = character(0) + ) + + for (i in 1:length(grids)) { + # Get the team name (= user login for individual projects) + team <- substring(basename(grids[i]), nchar(assignment) + 2, + nchar(basename(grids[i])) - 4) + + # Get and process the grid + grid <- suppressMessages(read(grids[i])) + # If the column student is missing, create one filled with "" + if (is.null(suppressWarnings(grid$student)) || + all(grid$student == "", na.rm = TRUE)) { + suppressWarnings(grid$student <- NULL) + grid$student <- "" + students <- team # single student in the team with login = team name + } else { + # Replace missing values by "" + grid$student[is.na(grid$student)] <- "" + # Get a list of students in the team + students <- unique(grid$student) + students <- students[students != ""] + } + # Create a results table for this team + res2 <- tibble( + assignment = assignment, + team = team, + student = students, + score_20 = as.numeric(NA), + score = as.numeric(NA), + max = as.numeric(NA), + missing = 0, + wrong = 0, + file = basename(grids[i]) + ) + + # Calculate scores for each student + for (j in 1:length(students)) { + student <- students[j] + sel_student <- grid$student %in% c("", student) + grid_one <- grid[sel_student, ] + is_missing <- sum(is.na(grid_one$score)) + res2$missing[j] <- is_missing + if (!is.numeric(grid_one$score)) { + grid_one$score <- suppressWarnings(as.numeric(grid_one$score)) + res2$wrong[j] <- sum(is.na(grid_one$score)) - is_missing + } + # In case of missing values, we keep NA instead (student that does not + # have NA score for all items!) + #res2$score[j] <- max(0, sum(grid_one$score, na.rm = TRUE)) + res2$score[j] <- sum(grid_one$score, na.rm = FALSE) + res2$max[j] <- sum(grid_one$max) + res2$score_20[j] <- round(res2$score[j] / res2$max[j] * 20, 1) + } + + res <- rbind(res, res2) + } + + attr(res, "date") <- as.character(Sys.time()) + + # Do we save the log on disk? + if (isTRUE(save.log)) { + lines <- paste0( + format(res$team, width = 20), " ", + format(res$student, width = 20), " ", + format(as.character(res$score_20), width = 4), "/20 (", + format(paste0(res$score, "/", res$max), width = 8), " - ", + res$missing, " missing, ", res$wrong, + " incorrect scores) ", res$file + ) + writeLines(lines, con = path(dir, "summary.log")) + } + + if (isTRUE(save.rds)) { + write$rds(res, path(dir, "summary.rds")) + } + + # Check a couple of cases: + cat(length(grids), " correction grids checked.\n") + cat(nrow(res), " students are in the projects.\n") + cat(sum(!is.na(res$score_20)), " students are scored.\n") + if (length(unique(res$max)) != 1) + message("Error: not all correction grids have same max score.") + if (sum(res$missing) > 0) + message("Warning: there is a total of ", sum(res$missing), + " missing scores.") + if (sum(res$wrong) > 0) + message("Warning: there is a total of ", sum(res$wrong), + " incorrect scores.") + cat(sum(res$score_20 < 10, na.rm = TRUE), " students did not succeed.\n") + cat("\nThe scores /20 distribute like this (min, q1, median, q3, max):\n") + print(fivenum(res$score_20)) + + invisible(res) +} diff --git a/R/create_context.R b/R/create_context.R new file mode 100644 index 0000000..17f6ef5 --- /dev/null +++ b/R/create_context.R @@ -0,0 +1,124 @@ +#' Create a context object for a correction set +#' +#' @description +#' Create a list that contains context for a given correction set (must be +#' recalculated when a different correction set/project is selected). +#' +#' @param correction The correction set +#' @param base_corr_dir The base directory for correction sets +#' @param base_templ_dir The base directory for correction templates +#' @param base_repos_dir The vase directory for GitHub repositories to correct +#' @param repositories The repositories +#' @param assignments The assignments +#' @param github_url The GitHub URL (base part) +#' @param branch The GitHub branch concerned by this correction +#' +#' @return A list with the context information for the learnitgrid Shiny app. +#' @export +create_context <- function(correction, base_corr_dir, base_templ_dir, +base_repos_dir, repositories, assignments, github_url, branch) { + course_dirs <- dir_ls(base_corr_dir, type = "directory") + if (!length(course_dirs)) + stop("There is still no evalaution grids for this assignment. ", + "Use the script '04create_assessments4.R' to create them...") + courses <- basename(course_dirs) + + corr_dirs <- dir_ls(course_dirs, type = "directory") + if (!length(corr_dirs)) + stop("There is still no evalaution grids for this assignment. ", + "Use the script '04create_assessments4.R' to create them...") + corrections <- basename(corr_dirs) + + if (is.null(correction) || !length(correction) || correction == "") + stop("Correction set not provided, or operation cancelled.") + if (!correction %in% corrections) + stop("Correction set '", correction, "' not found. Check it...") + + # Get corr_dir for this correction + get course, assignment and corr_date + corr_dir <- corr_dirs[corrections == correction] + course <- basename(dirname(corr_dir)) + corr_parts <- strsplit(correction, "_", fixed = TRUE)[[1]] + if (length(corr_parts) < 4) + stop("Problem with the correction set '", correction, + "' : it should be something like A00Ia_21M_title_2022-01-01") + corr_date <- corr_parts[length(corr_parts)] + assignment <- paste(corr_parts[-length(corr_parts)], collapse = "_") + rm(corr_parts) + + # Get dirs, files and more for this correction set + templ_file <- file_path_check(base_templ_dir, course, + paste0(assignment, ".csv")) + repos_dir <- dir_path_check(base_repos_dir, course, assignment) + corr_files <- dir_ls(corr_dir, glob = '*.csv') + if (!length(corr_files)) + stop("Correction files not found in '", corr_dir, "' !") + n <- length(corr_files) + repos_names <- sub("\\.csv$", "", basename(corr_files)) + # PhG: adapted for urchins in Q2 + #repos_names2 <- paste0(substring(repo, 1L, 3L), substring(repos_names, 4L)) + repos_names2 <- repos_names + # PhG: in case this is a pseudonymised version, we got either the original + # GitHub repos, or the pseudonymized one from repositories_xx.csv + if (is.null(repositories$pseudo)) { + message("Use regular repositories names") + repos_names3 <- repos_names2 + } else { + message("Pseudonymised data with regular repostories") + rnames <- repositories$name + names(rnames) <- tolower(repositories$pseudo) + repos_names3 <- rnames[tolower(repos_names2)] + names(repos_names3) <- NULL + } + + repos_dirs <- path(repos_dir, repos_names) + repos_dirs2 <- path(repos_dir, repos_names2) + user_logins <- substring(repos_names, nchar(assignment) + 2) + + # General assignment infos from assign_file + assign_infos <- as.data.frame(assignments)[tolower(assignments$assignment) == + tolower(assignment), ] + # Also filter on app, if provided + #if (!is.null(app)) + # assign_infos <- assign_infos[tolower(assign_infos$app) == tolower(app), ] + if (!NROW(assign_infos)) { + stop("The selected assignment (", assignment, ") is not found in ", + "the table.") + } + + if (NROW(assign_infos) > 1) { + warning("The selected assignment (", assignment, + ") is found in several variants in the table. Use of the first one.") + assign_infos <- assign_infos[1, ] + } + + # Read information from the template file + templ_corrs <- suppressMessages(read(templ_file)) + if (NROW(templ_corrs) < 1) + stop("No correction items found in '", templ_file, + "', or error reading the file.") + + # Eliminate user-specific items (starting with !{login} in the template) + templ_corrs <- + templ_corrs[substring(templ_corrs$criterion, 1, 8) != "!{login}", ] + + # Path of git_stat.csv + git_stats <- file_path_check(repos_dir, "git_stats.csv") + + # The context object (list) contains info required to populate tables + context <- list( + assignment = assignment, # The corresponding assignment (project) + templ_corrs = templ_corrs, # The content of the correction grid template + corr_files = corr_files, # The correction grids files (CSV) + assign_infos = assign_infos, # Informations about the assignment + github_url = github_url, # The base URL for GitHub links + branch = branch, # The GitHub branch + git_stats_file = git_stats, # The path to git_stats.csv file + user_logins = user_logins, # The users logins (teams for group projects) + repos_names = repos_names, # The names of repositories + repos_names2 = repos_names2, # The names of repos if different from apps + repos_names3 = repos_names3, # The name of original repos (pseudonymisation) + repos_dirs = repos_dirs, # The paths to the repositories + repos_dirs2 = repos_dirs2 # The paths to repos if different from apps + ) + context +} diff --git a/R/get_git_stats.R b/R/get_git_stats.R new file mode 100644 index 0000000..bdf098e --- /dev/null +++ b/R/get_git_stats.R @@ -0,0 +1,43 @@ +#' Summarize the git stats for one or more git repositories +#' +#' @description Use data from a git_stats.csv file to get a history of commits +#' done in a repository for the learnitgrid Shiny app. +#' +#' @param git_stats_file The path the the git_stats.csv file +#' @param exclude_authors The list of authors to exclude from the stats +#' @param type The type of files to consider ("all", "R", "Rmd", or "Qmd") +#' @param tz The time zone to use for times +#' +#' @return A data frame with git stats data to be used by the learnitgrid Shiny +#' app. +#' @export +get_git_stats <- function(git_stats_file, +exclude_authors = "github-classroom[bot]", type = "all", tz = "UTC") { + + if (!file_exists(git_stats_file)) + stop("The file ", git_stats_file, " does not exist") + stat <- suppressMessages(read(git_stats_file)) + + # TODO: allow for more types too (e.g., doc, docx, pdf, ppt, pptx, ...) + vec <- match.arg(type, choices = c("all", "R", "Rmd", "Qmd"), + several.ok = TRUE) + + if (length(exclude_authors)) + stat <- stat[!stat$author %in% exclude_authors, ] + + if (!any(vec == "all")) + stat <- stat[stat$extension %in% vec, ] + #message("items in git_stats.csv: ", nrow(stat)) + + stat <- collapse::roworder(stat, 'github_repository', 'author', 'author_date') + g <- collapse::GRP(stat, ~ github_repository + author) + stat$change_cum <- collapse::fcumsum(stat$change, g) + g1 <- collapse::GRP(stat, ~ github_repository + author + extension) + stat$change_cum1 <- collapse::fcumsum(stat$change, g1) + #stat$github_repository2 <- tolower(stat$github_repository) + stat$author_date <- with_tz( + ymd_hms(stat$author_date,tz = "UTC"), tz) + stat$author_date <- ymd_hms(as.character(stat$author_date)) + + stat +} diff --git a/R/learnitgrid-package.R b/R/learnitgrid-package.R index b438c51..0f359b2 100644 --- a/R/learnitgrid-package.R +++ b/R/learnitgrid-package.R @@ -5,10 +5,36 @@ #' them to GitHub (classroom) so that they are evaluated using the rubric #' (or assessment grid). #' -#' See ... +#' @section Important functions: +#' +#' - [create_context()] creates a context object (a list) with ... +#' +#' - [populate_table()] computes the content for a `DT::datatable()` with the +#' evaluation grid information. +#' #' @keywords internal "_PACKAGE" +#' @importFrom gh gh gh_whoami +#' @importFrom glue glue +#' @importFrom fs path dir_create dir_exists dir_ls file_exists link_create link_delete link_exists +#' @importFrom data.io read write +#' @importFrom chart chart +#' @importFrom tibble as_tibble tibble +#' @importFrom collapse fcumsum GRP roworder +#' @importFrom ggplot2 geom_histogram geom_point geom_step geom_vline labs theme xlim +#' @importFrom stats fivenum +#' @importFrom lubridate ymd_hms with_tz +#' @importFrom parsermd as_document by_section has_label has_type parse_rmd rmd_select +#' @importFrom DT datatable dataTableOutput formatStyle JS renderDataTable styleEqual +#' @importFrom flashClust hclust +#' @importFrom shiny shinyApp runApp +#' @importFrom shinydashboard dashboardBody dashboardHeader dashboardPage dashboardSidebar +#' @importFrom shinycssloaders withSpinner +#' @importFrom stringdist stringsim +#' @importFrm svMisc aka +# The following block is used by usethis to automatically manage +# roxygen namespace tags. Modify with care! ## usethis namespace: start ## usethis namespace: end NULL diff --git a/R/populate_table.R b/R/populate_table.R new file mode 100644 index 0000000..d4b6404 --- /dev/null +++ b/R/populate_table.R @@ -0,0 +1,446 @@ +#' Computes the content of a DT::datatable for a correction set +#' +#' @description +#' The most important function for the learnitgrid Shiny app to fill in the +#' table according to selected items with a list of grids (or "all") or +#' according to a selected grid with a list of items (or "all") +#' +#' @param items The items of the evaluation grid to display in the table, +#' usually either one item, or "all" for everything +#' @param grids The evaluation grids to display, usually either "all" if only +#' one item, or one grid if "all" items +#' @param context A context object as computed by [create_context()]. +#' @param reorder Should the rows in the table be reordered by similarities? +#' This is usually `TRUE` for a single items, or `FALSE` otherwise (and it is +#' computed as such by default). +#' @param highlight Syntax highlighting for code (slow, thus `FALSE` by default) +#' @param max_lines The maximum number of content lines that are displayed +#' (truncate very long contents). +#' +#' @return A data frame with the content to be displayed in a DT::datatable object. +#' @export +populate_table <- function(items, grids = "all", context, +reorder = (length(items) == 1), highlight = FALSE, max_lines = 20L) { + if (grids == "all") + grids <- context$repos_names + # This selects the grids to use (one, several or all) + gsel <- context$repos_names %in% grids + n <- sum(gsel) # Number of grids to use + + templ_corrs <- context$templ_corrs + if (items == "all") { + if (length(grids) == 1) { + # Single grid, all items, also !{login} items resolved for the group + # so, need to get these from the correction grid directly + templ_corrs <- suppressMessages(read(context$corr_files[gsel])) + } + items <- templ_corrs$criterion + } + + res <- NULL # The resulting object + for (item in items) { + pos <- (1:nrow(templ_corrs))[templ_corrs$criterion == item] + templ_corr <- templ_corrs[pos, ] + + # Get some more data from the correction items + item_score_max <- templ_corr$max + item_path <- templ_corr$file + # We have different situations: *[.R|Rmd], dir/*[.R|Rmd], [dir/]script.R, + # [dir/]report.Rmd + item_subdir <- dirname(item_path) + if (item_subdir == ".") + item_subdir <- "" + item_file <- basename(item_path) + if (item_file == "*") { + item_type <- "*" + } else if (tolower(substring(item_file, nchar(item_file) - 1L)) == ".r") { + item_type <- "R" + } else if (tolower(substring(item_file, nchar(item_file) - 3L)) == ".rmd") { + item_type <- "Rmd" + } else { + item_type <- "*" + } + + # Fill the table with all corrections for the item + # Get all scores, authors and comments + scores <- rep(NA, n) + evaluators <- rep("", n) + comments <- rep("", n) + for (i in 1:n) { + corrs <- suppressMessages(read(context$corr_files[gsel][i])) + pos1 <- (1:nrow(corrs))[corrs$criterion == item] + if (length(pos1) < 1) + stop("Item ", item, " not found") + if (length(pos1) > 1) + stop("Item ", item, " found ", length(pos1), " times") + scores[i] <- corrs[pos1, ]$score + evaluators[i] <- corrs[pos1, ]$evaluator + comments[i] <- corrs[pos1, ]$comment + } + comments[is.na(comments)] <- "" + + # Construct an HTML fragments with useful links (template, repo, file, ...) + repos_urls <- path(context$github_url, context$repos_names3[gsel]) + template <- context$assign_infos$template + links <- c('template', + 'repo') + + # If we have a subdir, we offer the link to go there directly + if (item_subdir != "") { + repos_subdirs <- path(repos_urls, "blob", context$branch, item_subdir) + links <- c(links, + '{item_subdir}') + } else { + repos_subdirs <- repos_urls + } + + # If the file type is an R script, add a link to it + another one to get it + if (item_type == "R") { + r_files <- path(repos_urls, "blob", + context$branch, item_subdir, item_file) + r_local_files <- path(context$repos_dirs[gsel], item_subdir, item_file) + links <- c(links, + 'R script', + '(get it)') + } else { + r_files <- character(0) + r_local_files <- character(0) + } + + # If the file type is an Rmd report, add a link to the HTML report + a link + # to the Rmd file on GitHub + a get it from local version + if (item_type == "Rmd") { + rmd_files <- path(repos_urls, "blob", + context$branch, item_subdir, item_file) + rmd_local_files <- path(context$repos_dirs[gsel], item_subdir, item_file) + html_local_files <- sub("\\.Rmd$", ".html", rmd_local_files) + # When the Rmd does not compile, there is no associated HTML file. + # However, there may be a _corr.html file instead... Here we don't look + # for it, but we just replace .html by _corr.html where the .html file + # does not exist. + exists_html_file <- file_exists(html_local_files) + if (any(!exists_html_file)) { + corr_html_local_files <- sub("\\.html", "_corr.html", + html_local_files[!exists_html_file]) + html_local_files[!exists_html_file] <- corr_html_local_files + } + links <- c(links, + 'html', + 'Rmd', + '(get it)' + ) + # If there are _corr.Rmd and .Rmd files, add a _diff.html and a link to it + corr_rmd_local_files <- sub("\\.Rmd$", "_corr.Rmd", rmd_local_files) + diff_files <- sub("\\.Rmd$", "_diff.html", rmd_local_files) + exists_both_rmd_files <- file_exists(rmd_local_files) & + file_exists(corr_rmd_local_files) + if (any(exists_both_rmd_files)) { + # Create or update the _diff.html files + pos_diffs <- (1:length(rmd_local_files))[exists_both_rmd_files] + for (pos_diff in pos_diffs) + try(htmlwidgets::saveWidget(diffr::diffr( + # Original Rmd file + sub("^\\.", "./www", www_relative(rmd_local_files[pos_diff])), + # Corr. Rmd file + sub("^\\.", "./www", www_relative(corr_rmd_local_files[pos_diff])), + before = "original", after = "corrected"), + title = basename(rmd_local_files[pos_diff]), + file = diff_files[pos_diff])) + # Add a link to these files (only where diff_files exists) + diff_links <- rep('', length(rmd_local_files)) + diff_links[pos_diffs] <- "diff" + links <- c(links, + '{diff_links}') + } + } else { + rmd_files <- character(0) + rmd_local_files <- character(0) + html_local_files <- character(0) + } + + # We paste all links items together, separated by ' ', then, we resolve them + # using glue + links <- glue(paste(links, collapse = ' ')) + + # Data for the table (we still don't know what to place in content and plot + # at this stage, but it will be filled later on) + dat <- data.frame(check.names = FALSE, stringsAsFactors = FALSE, + max = item_score_max, + # Only one entry combining score ansd comment for faster correction + `score_comment` = paste(scores, comments), + criterion = item, + content = "", # Don't know yet + plot = "", # Don't know yet + links = links, + evaluator = evaluators, + user = context$user_logins[gsel] + ) + + # Fill in content and plot + + # Extraction of content and plot according to criterion type: + # - R script -> code in content and nothing in plot + # - YAML = ... => YAML header in content and nothing in plot + # - #(####) Title = ... => Markdown section in content and nothing in plot + # - @label = ... (chunk label) => code in content + chart generated in plot + # - Something else => has to Rmd compiled or not? + # TODO: lot of repeated code here...needs heavy reworking! + is_content <- FALSE # By default + + if (item_type == "R") { + # We place the code of the R file in content (the max_lines first lines) + codes <- rep("", n) + for (i in 1:n) { + r_content <- try(suppressWarnings(readLines(r_local_files[i])), + silent = TRUE) + if (inherits(r_content, "try-error")) { + codes[i] <- "FILE NOT FOUND" + } else { + # Syntax highlighting + if (isTRUE(highlight)) + r_content <- suppressWarnings(highr::hi_html(r_content)) + if (length(r_content) > max_lines) + r_content <- c(r_content[1:max_lines], "[...]") + codes[i] <- paste0("
", paste(r_content, collapse = "\n"),
+            "
") + } + } + dat$content <- codes + is_content <- TRUE + + } else if (item_type == "Rmd") { + # Target sections of the Rmd file are like key = message in item + key <- trimws(strsplit(item, "=", fixed = TRUE)[[1]][1]) + + if (key == "YAML") {# YAML header + headers <- rep("", n) + for (i in 1:n) { + rmd_content <- try(suppressWarnings(readLines(rmd_local_files[i])), + silent = TRUE) + if (inherits(rmd_content, "try-error")) { + headers[i] <- "FILE NOT FOUND" + } else { + # Knitr now accepts spaces in chunks but not parse_rmd => replace + # them with another character + rmd_content <- correct_rmd(rmd_content) + # Try parsing the Rmd content + rmd <- try(parse_rmd(rmd_content, allow_incomplete = TRUE), + silent = TRUE) + if (inherits(rmd, "try-error")) { + headers[i] <- "SYNTAX ERROR RMD" + } else { + header <- as_document(rmd_select(rmd, has_type("rmd_yaml_list"))) + # Eliminate empty lines, or lines with only --- + header <- header[!grepl("^-+$", header) & !grepl("^ *$", header)] + # Write key in bold + header <- sub("^([^:]+)(:)(.*)$", "\\1:\\3", header) + # Restrict to max_lines + if (length(header) > max_lines) + header <- c(header[1:max_lines], "[...]") + # Collapse into a single string + headers[i] <- paste0("
",
+                paste(header, collapse = "\n"), "
") + } + } + } + dat$content <- headers + is_content <- TRUE + + } else if (grepl("^#{1,5} +", key)) {# A section title + header <- trimws(sub("^#+", "", key)) + + # Get the content of the section for all repositories + sections <- rep("", n) + for (i in 1:n) { + rmd_content <- try(suppressWarnings(readLines(rmd_local_files[i])), + silent = TRUE) + if (inherits(rmd_content, "try-error")) { + sections[i] <- "FILE NOT FOUND" + } else { + # Knitr now accepts spaces in chunks but not parse_rmd => replace + # them with another character + rmd_content <- correct_rmd(rmd_content) + # Try parsing the Rmd content + rmd <- try(parse_rmd(rmd_content, allow_incomplete = TRUE), + silent = TRUE) + if (inherits(rmd, "try-error")) { + sections[i] <- "SYNTAX ERROR RMD" + } else { + section <- try(as_document(rmd_select(rmd, + by_section(header, keep_parents = FALSE))), silent = TRUE) + # If there are trailing spaces, it does not find it and returns + # NULL => retry it with up to two trailing spaces + if (is.null(section)) + section <- try(as_document(rmd_select(rmd, + by_section(paste0(header, " "), keep_parents = FALSE))), + silent = TRUE) + if (is.null(section)) + section <- try(as_document(rmd_select(rmd, + by_section(paste0(header, " "), keep_parents = FALSE))), + silent = TRUE) + if (inherits(section, "try-error")) { + section[i] <- "TITLE NOT FOUND" + } else { + # Eliminate empty lines, or containing only spaces + section <- section[!grepl("^[ \t]*$", section)] + # TODO: R Markdown syntax highlighting + # Put headers starting with # in bold + is_header <- substring(section, 1, 1) == "#" + section[is_header] <- paste0("", section[is_header], "") + # Restrict to max_lines + if (length(section) > max_lines) + section <- c(section[1:max_lines], "[...]") + # Collapse into a single string + sections[i] <- paste(section, collapse = "
") + } + } + } + } + dat$content <- sections + is_content <- TRUE + + } else if (substring(key, 1, 1) == "@") {# A chunk label like @label + key <- trimws(substring(key, 2)) # The original chunk label + chunk <- chunk_labels(key) # "Repair" labels for parsermd::parse_rmd() + + # Get the code inside the chunk for all repositories + codes <- rep("", n) + for (i in 1:n) { + rmd_content <- try(suppressWarnings(readLines(rmd_local_files[i])), + silent = TRUE) + if (inherits(rmd_content, "try-error")) { + codes[i] <- "FILE NOT FOUND" + } else { + # Knitr now accepts spaces in chunks but not parse_rmd => replace + # them with another character + rmd_content <- correct_rmd(rmd_content) + # Try parsing the Rmd content + rmd <- try(parse_rmd(rmd_content, allow_incomplete = TRUE), + silent = TRUE) + if (inherits(rmd, "try-error")) { + codes[i] <- "SYNTAX ERROR RMD" + } else { + code <- try(as_document(rmd_select(rmd, has_label(chunk))), + silent = TRUE) + if (inherits(code, "try-error")) { + codes[i] <- "CHUNK NOT FOUND" + } else { + # TODO: extract fig.cap if present + # Eliminate empty lines, containing only spaces, + # or beginning with ``` + code <- code[!grepl("^[ \t]*$", code)] + code <- code[substring(code, 1, 3) != "```"] + # Syntax highlighting + if (isTRUE(highlight)) + code <- suppressWarnings(highr::hi_html(code)) + # Restrict to max_lines + if (length(code) > max_lines) + code <- c(code[1:max_lines], "[...]") + # Collapse to a single string + codes[i] <- paste0("
", paste(code, collapse = "\n"),
+                  "
") + } + } + } + } + dat$content <- codes + is_content <- TRUE + + # Path to the plots (if they exist, or to the first one if there are + # several plots that are generated by that chunk) + plot_local_files <- path(context$repos_dirs[gsel], item_subdir, sub( + "\\.Rmd$", "_files", item_file), "figure-html", paste0(key, "-1.png")) + dat$plot <- glue(paste0( + '', + '')) + # Eliminate items that do not point to an existing image file + dat$plot[!file_exists(plot_local_files)] <- "" + + } else if (substring(key, 1, 1) == "+" || grepl("@[a-zA-Z]+", item)) { + # +chunk = ... item, or message @chunk + if (substring(key, 1, 1) == "+") { + key <- trimws(substring(key, 2)) # The original chunk label + } else {# Get key from inside the item (only allows a-zA-Z0-9_) + key <- sub("^.+@([a-zA-Z0-9_]+).*$", "\\1", item) + } + chunk <- chunk_labels(key) # "Repair" labels for parsermd::parse_rmd() + # Get the content between the chunk and another one, or a new section + paras <- rep("", n) + for (i in 1:n) { + rmd_content <- try(suppressWarnings(readLines(rmd_local_files[i])), + silent = TRUE) + if (inherits(rmd_content, "try-error")) { + paras[i] <- "FILE NOT FOUND" + } else { + # Knitr now accepts spaces in chunks but not parse_rmd => replace + # them with another character + rmd_content <- correct_rmd(rmd_content) + # Try parsing the Rmd content + rmd <- try(parse_rmd(rmd_content, allow_incomplete = TRUE), + silent = TRUE) + if (inherits(rmd, "try-error")) { + paras[i] <- "SYNTAX ERROR RMD" + } else { + # We collect markdown paragraphs beneath the chunk and before + # another chunk or a section + # Transform in a tibble + rmd <- as_tibble(rmd) + # Get the position of the chunk + rmd_pos <- (1:nrow(rmd))[rmd$label == chunk] + rmd_pos <- rmd_pos[!is.na(rmd_pos)] + if (length(rmd_pos) < 1) { + paras[i] <- "CHUNK NOT FOUND" + } else { + # Keep only data after the chunk + rmd <- rmd[-(1:rmd_pos), ] + # Seek for the first non R markdown item in the truncated df + rmd_pos2 <- (1:nrow(rmd))[rmd$type != "rmd_markdown"][1] + if (!is.na(rmd_pos2)) # Otherwise, we keep everything to the end + rmd <- rmd[-(rmd_pos2:nrow(rmd)), ] + para <- as_document(rmd) + # Eliminate empty lines, containing only spaces, or comments + # starting with -The goal of learnitgrid is to ... +Marking work on the basis of marking grids is time-consuming and requires particular attention to ensure fair marking from one student to another. + +learnitgrid, via a new web application {shiny}, makes it possible to mark all the work in a series criterion by criterion. The relevant part of each piece of work, identified by a title or a piece label, is extracted from the R/R Markdown/ Quarto documents. These extracts are grouped and sorted automatically using a text similarity calculation algorithm in the {stringdist} package. This makes it easier to score similar responses in the same way. This method also reduces the time needed for correction. Clickable links allow quick access to the complete job and to any context (dataset, additional documents, etc.), which further improves the speed of correction and the user’s comfort when filling in the criteria grids. + +This package is associated with and enhances the {learnitdown} package. + ## Installation @@ -31,3 +36,6 @@ library(learnitgrid) ## basic example code ``` +# Code of Conduct + +Please note that the {learnitgrid} package is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms. diff --git a/inst/WORDLIST b/inst/WORDLIST index 97a2dc2..316e426 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -1 +1,15 @@ +csv +datatable +DT +learnitdown +learnitgrid +learnitr ORCID +parsermd +Qmd +Repo +Repos +Rmd +rmd +stringdist +www diff --git a/inst/shiny/app.R b/inst/shiny/app.R new file mode 100644 index 0000000..4101231 --- /dev/null +++ b/inst/shiny/app.R @@ -0,0 +1,1041 @@ +# Packages required ------------------------------------------------------- + +library(shiny) +library(shinydashboard) + +# Initialization ---------------------------------------------------------- + +library("learnitgrid") + +# Global constants -------------------------------------------------------- + +# Absolute path to the data directory, use environment variable on RSConnect +# and default value (unset = ) locally +data_dir <- Sys.getenv("LEARNITGRID_DATA_DIR", + unset = getOption("learnintgrid.data.dir", + fs::path(getwd(), "www"))) +root_dir <- dir_path_check(data_dir) + +# Possibly input these values from a learnitgrid_config.R either in root_dir +# or (if not present) in www +config_file <- fs::path(root_dir, "learnitgrid_config.R") +if (!fs::file_exists(config_file)) + config_file <- fs::path("www", "learnitgrid_config.R") +if (fs::file_exists(config_file)) { + message("Sourcing config file ", config_file, "...") + source(config_file, encoding = "UTF-8") #, echo = TRUE) +} else { + message("No config file ", config_file, " found!") +} + +# Subdirectories +if (!exists("base_corr_dir")) + base_corr_dir <- dir_path_check(root_dir, + getOption("learnitigrid.corrections", "corrections")) +if (!exists("base_templ_dir")) + base_templ_dir <- dir_path_check(root_dir, + getOption("learnitigrid.templates", "templates")) +if (!exists("base_repos_dir")) + base_repos_dir <- dir_path_check(root_dir, + getOption("learnitigrid.repos", "repos")) +# Shiny apps can only share files relatives to its www subdir. So, we (re)create +# simlinks to these three folders (but do not delete if it is an existing file) +link_to_www(base_corr_dir, "corr") +link_to_www(base_templ_dir, "temp") +link_to_www(base_repos_dir, "repo") + +# TODO: this could be located possibly in a database too (then create a +# snapshot in a file in learnitgrid_config.R?) +if (!exists("repos_filename")) + repos_filename <- Sys.getenv("LEARNITGRID_REPOS", + unset = "repositories.csv") +if (!exists("assign_filename")) + assign_filename <- Sys.getenv("LEARNITGRID_ASSIGN", + unset = "assignments.csv") + +if (!exists("github_org")) + github_org <- Sys.getenv("LEARNITGRID_ORG", + unset = getOption("learnitgrid.org", + "learnitgrid-test")) +if (!exists("github_url")) + github_url <- paste0("https://github.com/", github_org) +# TODO: the branch should be deduced from the set name (a branch or a date) +# ... or use the default branch (note: master is also OK here) +if (!exists("branch")) + branch <- getOption("learnitgrid.branch", "main") + +# Some more info about courses (no data by default) +if (!exists("courses_aliases")) + courses_aliases <- NULL # The aliases in tnhe dropdown box for your courses +if (!exists("classroom_urls")) { + classroom_urls <- rep("https://classroom.github.com/classrooms/???/", 26L) + names(classroom_urls) <- LETTERS # Default URLS for classrooms => unknown +} + +# TODO: make these two options in the UI +# Maximum number of lines to place in content +if (!exists("max_lines")) + max_lines <- getOption("learnitgrid.maxlines", 20L) +# This one is nice, but slow => better to leave it FALSE +if (!exists("default_highlight")) + default_highlight <- getOption("learnitgrid.highlight", FALSE) + +# Default options for get_git_stats() +if (!exists("exclude_authors")) + exclude_authors <- "github-classroom[bot]" +if (!exists("git_stats_type")) + git_stats_type <- "all" +if (!exists("git_stats_tz")) + git_stats_tz <- "UTC" # Your own tz, e.g., "Europe/Paris" + +# Read csv files without issuing messages +read <- function(file) { + suppressMessages(data.io::read(file)) +} + +# Global objects ---------------------------------------------------------- + +repos_file <- file_path_check(root_dir, repos_filename) +repositories <- suppressMessages(read(repos_file)) +assign_file <- file_path_check(root_dir, assign_filename) +assignments <- suppressMessages(read(assign_file)) +order <- NULL # The order for the table by criterion + +course_dirs <- fs::dir_ls(base_corr_dir, type = "directory") +if (!length(course_dirs)) + stop("Il n'y a pas encore de grilles de correction disponibles. ", + "CrĂ©ez-en avant de relancer cette application...") +courses <- basename(course_dirs) +courses_list <- courses +names(courses_list) <- courses +courses_list <- c(courses_aliases, + courses_list[!courses_list %in% courses_aliases]) +courses_list <- courses_list[courses_list %in% courses] + +# TODO: get login of user if app is run in RStudio Connect +default_evaluator <- try(gh::gh_whoami()$login, silent = TRUE) +if (inherits(default_evaluator, 'try-error') || is.null(default_evaluator)) { + default_evaluator <- "" +} else { + default_evaluator <- as.character(default_evaluator)[1] +} + +# Sort the table according to content similarities +# Note: depends on a global variable `order` initialized to `NULL`! +# For this reason, it cannot be relocated in learnitgrid_functions.R +sort_table <- function(x, is_content = attr(x, "is_content")) { + # Calculate a dissimilarity matrix with string distances ('osa' method) + # TODO: try other methods as well + if (isTRUE(is_content)) { + n <- nrow(x) + dissim_mat <- matrix(0, nrow = n, ncol = n) + content <- x$content + stringsim <- stringdist::stringsim + for (i in 1:n) + dissim_mat[i, ] <- 1 - stringsim(content, content[i], method = "osa") + # Create a dist object by keeping only the lower triangle + dissim <- as.dist(dissim_mat) + # Cluster this dist object, in order to sort items by dissimilarities + cl <- flashClust::hclust(dissim, method = "complete") + #plot(cl) # TODO: we could display this in a plot above the grid + # We are only interested by order in cl + order <- cl$order + # Reorder x accordingly + x <- x[order, ] + } else { + order <- 1:nrow(x) # Initial order simply + } + order <<- order # TODO: do this differently! + attr(x, "order") <- order + x +} + +# The Shiny app UI -------------------------------------------------------- + +header <- dashboardHeader( + title = a("Learnitgrid", + href = "https://github.com/SciViews/learnitgrid"),# style = "color:black;"), + titleWidth = 350, + tags$li(a( + onclick = "onclick=window.open('https://wp.sciviews.org/')", + href = NULL, icon("book"), title = "Cours", style = "cursor:pointer;"), + class = "dropdown"), + tags$li(a( + onclick = "onclick=window.open('https://github.com/BioDataScience-Course')", + href = NULL, icon("github"), title = "GitHub", style = "cursor:pointer;"), + class = "dropdown") +) + +sidebar <- dashboardSidebar(width = 350, + selectInput("course", label = "Cours :", choices = names(courses_list), + width = 325), + selectInput("correction", label = "Set de correction :", choices = NULL, + width = 325), + textInput("evaluator", "Evaluateur (login GitHub) :", + value = default_evaluator, width = 325, + placeholder = "Votre login (Github) comme Ă©valuateur"), + textOutput("evaluator_check"), + hr(), + sidebarMenu(id = "menu_item", + menuItem("RĂ©sumĂ©", tabName = "summary", + icon = icon("calculator")), + menuItem("Correction par grille", tabName = "correction_grid", + icon = icon("tasks")), + menuItem("Correction par critère", tabName = "correction_criterion", + icon = icon("check-square")) + )#, + #hr(), + #downloadButton("downloadData1", "Generate report") +) + +body <- dashboardBody( + #shinybusy::add_busy_spinner(spin = "fading-circle"), + tags$head( + tags$base(target = "_blank"), + tags$style( + HTML(".shiny-notification { + position:fixed; + top: calc(50%); + left: calc(30%); + } + ")) + ), + tabItems( + tabItem(tabName = "summary", + tags$h2(icon("calculator"), " RĂ©sumĂ©"), + h5(textOutput("last_summary")), + fluidRow( + infoBoxOutput("correction_set1"), + infoBoxOutput("template_link1"), + infoBoxOutput("evaluator_name1") + ), + fluidRow( + valueBoxOutput("n_students", width = 3), + valueBoxOutput("n_grids", width = 3), + valueBoxOutput("n_success", width = 3), + valueBoxOutput("mean", width = 3), + ), + fluidRow( + downloadButton("downloadcsv", "CSV", icon = NULL, + style = "margin-left:15px;" ), + downloadButton("downloadexcel", "Excel", icon = NULL), + actionButton("refresh", "Rafraichir", class = "btn-info") + ), + br(), + fluidRow( + box(title = "Notes de la classe", status = "info", + shinycssloaders::withSpinner(plotOutput("score_plot"))), + box(title = "DĂ©tails par Ă©tudiant", status = "info", + shinycssloaders::withSpinner(DT::dataTableOutput("summary_tab"))) + ) + ), + + tabItem(tabName = "correction_grid", + tags$h2(icon("tasks"), " Correction par grille"), + h5(textOutput("to_corresct_per_grid")), + fluidRow( + infoBoxOutput("correction_set2"), + infoBoxOutput("template_link2"), + infoBoxOutput("evaluator_name2") + ), + fluidRow( + box(title = "Contribution au projet", status = "info", width = 12, + collapsible = TRUE, collapsed = TRUE, + selectInput("contri_ext", label = "Type de fichiers", + choices = c("Rmd", "R"), multiple = TRUE, selected = c("Rmd", "R")), + radioButtons("contri_split", label = "", + choices = c("unifier", "sĂ©parer"), + selected = "unifier", inline = TRUE), + #plotly::plotlyOutput("contri_plot"), + plotOutput("contri_plot"), + ) + ), + fluidRow( + box(title = "Grille critĂ©riĂ©e", status = "info", width = 12, + selectInput("grid", "Grille critĂ©riĂ©e :", label = NULL, + multiple = FALSE, selectize = TRUE, size = NULL, width = "50%", + selected = NULL), + #verbatimTextOutput("last_edited_grid"), + #br(), + shinycssloaders::withSpinner( + DT::dataTableOutput('correction_table_grid', width = "100%") + ) + ) + ) + ), + + tabItem(tabName = "correction_criterion", + tags$h2(icon("check-square"), " Correction par critère"), + h5(textOutput("to_correct_per_criterion")), + fluidRow( + infoBoxOutput("correction_set3"), + infoBoxOutput("template_link3"), + infoBoxOutput("evaluator_name3") + ), + fluidRow( + box(title = "EntrĂ©es pour un critère", status = "info", width = 12, + selectInput("item", "Critère :", label = NULL, + multiple = FALSE, selectize = TRUE, size = NULL, width = "50%", + selected = NULL), + #verbatimTextOutput("last_edited"), + #br(), + shinycssloaders::withSpinner( + DT::dataTableOutput('correction_table_criterion', width = "100%") + ) + ) + ) + ) + ) +) + +shinyUI <- dashboardPage(header, sidebar, body, skin = "black") + + +# The Shiny app server ---------------------------------------------------- + +shinyServer <- function(input, output, session) { + # TODO: some temporary code for further enhancements + # A modal dialog box prompting for evaluator login and correction set + #modal_startup <- modalDialog( + # "Veuillez vĂ©rifier votre identitĂ© et sĂ©lectionner un set de correction", + # title = "Correction Science des DonnĂ©es Biologiques", + # footer = tagList( + # actionButton("cancel", "Annuler"), + # actionButton("ok", "Continuer", class = "btn btn-primary btn-lg") + # ) + #) + + # https://stackoverflow.com/questions/66262809/how-to-trigger-edit-on-single-click-in-r-shiny-dt-datatable + # https://stackoverflow.com/questions/54907273/use-tab-to-edit-next-cell-on-dt-table + js <- c( + "table.on('click', 'td', function() {", + "$(this).dblclick();", + "});", + "table.on('key', function(e, datatable, key, cell, originalEvent){", + " var targetName = originalEvent.target.localName;", + " if(key == 13){", + " if(targetName == 'body'){", + " $(cell.node()).trigger('dblclick.dt');", + " }else if(targetName == 'input'){", + " $(originalEvent.target).trigger('blur');", + " }", + " }", + "})", + "table.on('keydown', function(e){", + " if(e.target.localName == 'input' && [9,13,37,38,39,40].indexOf(e.keyCode) > -1){", + " $(e.target).trigger('blur');", + " }", + "});", + "table.on('key-focus', function(e, datatable, cell, originalEvent){", + " var targetName = originalEvent.target.localName;", + " var type = originalEvent.type;", + " if(type == 'keydown' && targetName == 'input'){", + " if([9,37,38,39,40].indexOf(originalEvent.keyCode) > -1){", + " $(cell.node()).trigger('dblclick.dt');", + " }", + " }", + "});") + + #showModal(modal_startup) + + #observeEvent(input$ok, { + # showNotification("RĂ©cupĂ©ration+ + # 3, des donnĂ©es...") + # removeModal() + #}) + #observeEvent(input$cancel, { + # removeModal() + # stopApp(1) + #}) + + grid_dir <- eventReactive(input$course, { + # Select the course e.g. A22M, B22M,.... + course <- courses_list[input$course] + x <- grep(course, course_dirs, value = TRUE) + # Create a vector with de directory path + res <- fs::dir_ls(x, type = "directory") + names(res) <- basename(res) + attr(res, "ntot") <- length(res) + #message(glue::glue(' + #======================== + ##1 corr_dir1() = The list of directories by course. + #{attr(res, "ntot")} folder(s) are to correct. + #The first folder is {names(res)[1]}} + #========================')) + res + }) + + observe({ + req(input$course) + updateSelectizeInput(session, 'correction', choices = names(grid_dir())) + }) + + context_react <- reactive({ + req(input$correction) + + default_correction <- input$correction + create_context(correction = default_correction, + base_corr_dir = base_corr_dir, base_templ_dir = base_templ_dir, + base_repos_dir = base_repos_dir, repositories = repositories, + assignments = assignments, #repo = repo, app = app, + github_url = github_url, branch = branch) + }) + + + # tabItem : summary ---- + + summary_react <- reactive({ + req(input$correction) + input$refresh + + course <- courses_list[input$course] + dir <- fs::path(base_corr_dir, course, input$correction, "summary.rds") + + if (fs::file_exists(dir)) { + res <- suppressMessages(read(dir)) + } else { + check_grids(fs::path(base_corr_dir, course, input$correction)) + res <- suppressMessages(read(dir)) + } + #message(glue::glue(' + #======================== + ##1 summary_react . + #{dim(res)} + #========================') + # ) + res + }) + + output$last_summary <- renderText({ + #req(input$correction) + x1 <- attr(summary_react(), "date") + glue::glue('Dernière mise Ă  jour : {x1}.') + }) + + correction_set <- reactive({ + req(input$correction) + context <- context_react() + ref <- classroom_urls[names(classroom_urls) == + substr(input$correction, 1, 1)] + ref1 <- fs::path(ref, "assignments",context$assignment[1]) + assignment_set <- input$correction + curr_assign <- sub("^(.+)_([^_]+)$", "\\1", assignment_set) + curr_set <- sub("^(.+)_([^_]+)$", "\\2", assignment_set) + infoBox(h4(curr_assign), paste("Set:", curr_set), + color = "blue", icon = icon("folder-open"), href = ref1, fill = TRUE) + }) + + output$correction_set1 <- renderInfoBox({correction_set()}) + + template_link <- reactive({ + req(input$course) + context <- context_react() + templ_url <- context$assign_infos$template[1] + templ_name <- basename(templ_url) + infoBox(h4("Template"), templ_name, + color = "blue", icon = icon("file-alt"), href = templ_url, fill = TRUE) + }) + + output$template_link1 <- renderInfoBox({template_link()}) + + evaluator <- eventReactive(input$evaluator, { + x <- input$evaluator + res <- try(gh::gh("/users/{username}", username = x), silent = TRUE) + attr(x, "exist") <- !inherits(res, 'try-error') + x + }) + + evaluator_name <- reactive({ + req(input$course) + x <- evaluator() + if (!isTRUE(attr(x, "exist"))) { + col <- "orange" + } else { + col <- "green" + } + infoBox(h4("Evaluateur"), x, + color = col, icon = icon("user-check"), + href = paste0("https://github.com/", x), fill = TRUE) + }) + + output$evaluator_name1 <- renderInfoBox({ + evaluator_name() + }) + + output$n_students <- renderValueBox({ + x <- summary_react() + x1 <- length(unique(x$student)) + valueBox(x1, "Etudiants", icon = icon("users"), color = "blue")}) + + output$n_grids <- renderValueBox({ + x <- summary_react() + ntot <- length(unique(x$team)) + x1 <- x[x$missing >= 1, ] + completed <- ntot - length(unique(x1$team)) + # Propose a three-colors coding instead + if (ntot == completed) { + col <- "green" + } else { + col <- "red" + } + res <- glue::glue("{completed} ({ntot - completed})") + valueBox(res, "Grilles terminĂ©es (Ă  faire)", icon = icon("check"), + color = col) + }) + + output$n_success <- renderValueBox({ + x <- summary_react() + x1 <- sum(x$score_20 >= 10, na.rm = TRUE) + x2 <- sum(is.na(x$score_20)) + x3 <- nrow(x) - x2 + x4 <- round((x1 / sum(!is.na(x$score_20))) * 100, 0) + if (is.na(x4)) { + col <- "red" + } else{ + col <- cut(x4, + breaks = c(0, 74, 89, 100), + labels = c("red", "orange", "green")) + } + if (x2 != 0) { + res <- glue::glue("{x1}/{x3} ({x2})") + res1 <- "Succès (non Ă©valuĂ©)" + } else { + res <- glue::glue("{x1}/{x3}") + res1 <- "Succès" + } + valueBox(res, res1, icon = icon("user-graduate"), color = col) + }) + + output$mean <- renderValueBox({ + x <- summary_react() + x1 <- round(mean(x$score_20, na.rm = TRUE),1) + x2 <- round(median(x$score_20, na.rm = TRUE),1) + res <- glue::glue("{x1} ({x2})") + valueBox(res, "Moyenne (MĂ©diane) [/20]", icon = icon("equals"), + color = "blue") + }) + + download <- reactive({ + res <- summary_react() + res$email <- paste0(res$student, "@umons.ac.be") + res1 <- res[,c("student", "email", "score_20", "file")] + colnames(res1)[colnames(res1) == "score_20"] <- res$assignment[1] + res1 + }) + + output$downloadcsv <- downloadHandler( + filename = function() { + context <- context_react() + paste0(context$assignment[1],"-summary-", Sys.Date(), ".csv") + }, + content = function(file) { + data.io::write$csv(download(), file) + } + ) + + output$downloadexcel <- downloadHandler( + filename = function() { + context <- context_react() + paste0(context$assignment[1],"-summary-", Sys.Date(), ".xlsx") + }, + content = function(file) { + data.io::write$xlsx(download(), file) + } + ) + + observeEvent(input$refresh, { + course <- courses_list[input$course] + check_grids(fs::path(base_corr_dir, course, input$correction)) + }) + + output$score_plot <- renderPlot({ + req(input$correction) + x <- summary_react() + #x1 <- sum(!(x$missing > 1)) + x1 <- mean(x$score_20) + chart::chart(data = x, ~ score_20) + + ggplot2::geom_histogram(bins = nrow(x)/2) + + ggplot2::geom_vline(xintercept = x1, color = "red", size = 1.5) + + ggplot2::labs(x = "Note des grilles completĂ©es [/20] - moyenne en rouge", + y = "DĂ©nombrement") + }) + + output$summary_tab <- DT::renderDataTable({ + req(input$correction) + x <- summary_react() + x1 <- x[, c("team", "student", "score_20", "missing")] + x1 <- collapse::roworder(x1, -missing, score_20) + + x1$team[x1$team == x1$student] <- "/" + + DT::formatStyle( + DT::datatable(x1, + colnames = c('Equipe', 'Etudiant', 'Note [/20]','EntrĂ©es manquantes'), + rownames = FALSE, + selection = "single", + options = list(language = list(search = 'Filtrer :')) + ), + "score_20", + target = "row", + backgroundColor = DT::styleEqual(NA, "#FF4500") + ) + }) + + + # tabItem : correction_grid ---- + + output$correction_set2 <- renderInfoBox({correction_set()}) + + output$template_link2 <- renderInfoBox({template_link()}) + + output$evaluator_name2 <- renderInfoBox({evaluator_name()}) + + git_stats <- reactive({ + context <- context_react() + #message("Git stats file: ", context$git_dir) + res <- get_git_stats(context$git_stats_file, type = input$contri_ext, + tz = git_stats_tz) + #res$author_date <- with_tz( + # # TODO: generalize this! + # ymd_hms(res$author_date,tz = "UTC"), "Europe/Paris") + #res$author_date <- ymd_hms(as.character(res$author_date)) + res + }) + + ## selection_grid ---- + selection_grid <- reactiveVal() + + observeEvent(input$correction, { + res <- NULL + selection_grid(res) + message(glue::glue(" + reset selection_grid() : {selection_grid()}")) + }) + + observeEvent(input$summary_tab_rows_selected,{ + # Collect the selected row + info <- input$summary_tab_rows_selected + # Use the summary_react table to find the grid + res <- collapse::roworder(summary_react(), -missing, score_20) + res1 <- res[info,] + grid <- paste0(res1$assignment, "-", res1$team) + + # Check that the grid names correspond to the context + context <- context_react() + + if (!any(context$repos_names %in% grid)) { + if (any(context$repos_names %in% tolower(grid))) { + grid <- tolower(grid) + } else { + grid <- NULL + } + } + # Update selection_grid() + selection_grid(grid) + # debug test + message(glue::glue(" + #### summary_tab_rows_selected #### + The selection_grid : {selection_grid()} + The info : {info} ")) + }) + + observeEvent(input$correction_table_criterion_cell_clicked,{ + # Collect the selected cell + info <- input$correction_table_criterion_cell_clicked + # Check that the grid names correspond to the context + context <- context_react() + grid <- context$repos_names[ + order[info$row]] + + if (!any(context$repos_names %in% grid)) + grid <- NULL + + # Update selection_grid() + selection_grid(grid) + # debug test + message(glue::glue(" + #### correction_table_criterion_cell_clicked #### + The selection_grid : {selection_grid()} + The info : row = {info$row}, col = {info$col}")) + }) + + observe({ + context <- context_react() + selection1 <- selection_grid() + updateSelectizeInput(session, 'grid', choices = context$repos_names, + selected = selection1) + }) + + #output$contri_plot <- plotly::renderPlotly({ + output$contri_plot <- renderPlot({ + context <- context_react() + x <- git_stats() + stat_red <- x[tolower(x$github_repository) %in% tolower(input$grid), ] + + if (input$contri_split == "sĂ©parer") { + p <- chart::chart(data = stat_red, + change_cum1 ~ author_date %col=% author | extension) + } else { + p <- chart::chart(data = stat_red, + change_cum ~ author_date %col=% author) + } + p <- p + + ggplot2::geom_step(size = 1, na.rm = TRUE) + + ggplot2::geom_point(na.rm = TRUE) + + ggplot2::theme(legend.position = "bottom") + + ggplot2::labs(x = "Temps", y = "Somme cumulĂ©e des lignes modifiĂ©s par projet", color = "Auteur") + + assign_infos <- context$assign_infos + assign_time <- c(start = assign_infos$start[1], end = assign_infos$end[1]) + + if (length(assign_time) == 2) { + stat_time <- c( + start = min(stat_red$author_date), + end = max(stat_red$author_date)) + plot_range <- range(c(assign_time, + min(stat_red$author_date), + max(stat_red$author_date))) + p <- p + + ggplot2::geom_vline(xintercept = assign_time, + linetype = 4, alpha = 0.8) + + ggplot2::xlim(plot_range) + + ggplot2::labs(caption = + "Chaque point reprĂ©sente un commit. Les lignes verticales reprĂ©sentent le dĂ©but et la fin de l'exercice.") + } + + p + #plotly::ggplotly(p) + }) + + correction_table_grid_react <- reactive({ + req(input$grid) + context <- context_react() + + populate_table(items = "all", grids = input$grid, context = context, + reorder = FALSE, highlight = input$highlight, max_lines = max_lines) + }) + + output$correction_table_grid <- DT::renderDataTable({ + req(input$grid) + + DT::formatStyle( + DT::datatable( + correction_table_grid_react(), + colnames = c('Max', 'Score Commentaire', 'Critère', 'Contenu', + 'Graphique', 'Liens', 'Evaluateur', 'Étudiant/groupe'), + rownames = FALSE, + selection = "none", + escape = FALSE, + callback = DT::JS(js), + extensions = c("Buttons", "KeyTable"), + options = list( + keys = TRUE, + paging = FALSE, + searching = TRUE, + #fixedColumns = TRUE, + autoWidth = TRUE, + autoFill = TRUE, + ordering = FALSE, + dom = 'Bfrtip', + buttons = c('csv', 'excel'), + language = list(search = 'Filtrer :'), + columnDefs = list( + list(width = '300px', targets = 1), # score_comment + #list(width = '300px', targets = 2), # criterion + list(width = '1000px', targets = 3), # content + list(visible = FALSE, targets = 7) # student/group (hidden here) + ) + ), + editable = list(target = "cell", disable = list(columns = c(0, 2:10))), + class = "display" + ), 'score_comment', backgroundColor = "lightgrey" + ) + }) + + + # tabItem : correction_criterion ---- + + output$correction_set3 <- renderInfoBox({correction_set()}) + + output$template_link3 <- renderInfoBox({template_link()}) + + output$evaluator_name3 <- renderInfoBox({evaluator_name()}) + ## Select the criterion + + selection_criterion <- reactiveVal() + + observeEvent(input$correction, { + res <- NULL + selection_criterion(res) + }) + + observeEvent(input$correction_table_grid_cell_clicked,{ + # Collect the selected cell + info <- input$correction_table_grid_cell_clicked + # Check that the criterion correspond to the context + context <- context_react() + + res <- NULL + + if (!is.null(info$row)) { + x <- correction_table_grid_react()[info$row, ] + res <- x$criterion + } + + if (!any(context$templ_corrs$criterion %in% res)) + res <- NULL + # Update selection_grid() + selection_criterion(res) + # Message info + message(glue::glue(" + #### correction_table_grid_cell_clicked #### + The selection_grid : {selection_criterion()} + The info : row = {info$row}, col = {info$col}")) + }) + + observe({ + context <- context_react() + selection1 <- selection_criterion() + updateSelectizeInput(session, 'item', + choices = context$templ_corrs$criterion, + selected = selection1) + }) + + correction_table_criterion_react <- reactive({ + req(input$item) + context <- context_react() + + sort_table(populate_table(items = input$item, grids = "all", + context = context, reorder = TRUE, highlight = input$highlight, + max_lines = max_lines)) + }) + + output$correction_table_criterion <- DT::renderDataTable({ + DT::formatStyle( + DT::datatable( + correction_table_criterion_react(), + colnames = c('Max', 'Score Commentaire', 'Critère', 'Contenu', + 'Graphique', 'Liens', 'Evaluateur', 'Étudiant/groupe'), + rownames = FALSE, + selection = "none", + escape = FALSE, + callback = DT::JS(js), + extensions = c("Buttons", "KeyTable"), + options = list( + keys = TRUE, + paging = FALSE, + searching = TRUE, + #fixedColumns = TRUE, + autoWidth = TRUE, + autoFill = TRUE, + ordering = FALSE, + dom = 'Bfrtip', + buttons = c('csv', 'excel'), + language = list(search = 'Filtrer :'), + columnDefs = list( + list(width = '300px', targets = 1), # score_comment + list(visible = FALSE, targets = 2), # criterion (don't show it here) + list(width = '1000px', targets = 3) # content + ) + ), + editable = list(target = "cell", disable = list(columns = c(0, 2:10))), + class = "display" + ), 'score_comment', backgroundColor = "lightgrey" + ) + }) + + #output$last_edited <- renderText({ + # #str(input$correction_table_criterion_cell_edit) + # if (!is.null(input$correction_table_criterion_cell_edit)) { + # if (input$correction_table_criterion_cell_edit$col == 2) { + # score_comment <- input$correction_table_criterion_cell_edit$value + # score <- trimws(sub("^([^ ]+).*$", "\\1", score_comment)) + # comment <- trimws(sub("^[^ ]+(.*)$", "\\1", score_comment)) + # num_score <- try(as.numeric(score), silent = TRUE) + # if (inherits(num_score, "try-error")) { + # "ERROR: score must be a numeric value or NA" + # } else {# TODO: check that score is between 0 and item_score_max + # paste( + # context$user_logins[ + # order[input$correction_table_criterion_cell_edit$row]], + # "score:", score, "comment:", comment) + # } + # } + # } + #}) + #TODO: the same for last_edited_grid vs correction_table_grid + #TODO: add shinyFeedback item, something like + #half <- reactive({ + # even <- input$orrectionTable_cell_edit %% 2 == 0 + # shinyFeedback::feedbackWarning("n", !even, "Please select an even number") + # input$orrectionTable_cell_edit / 2 + #}) + # Or use this instead: + #showNotification("message", type = "message") + #showNotification("message", type = "warning") + #showNotification("message", type = "error") + + #myProxy = dataTableProxy('correction_table_criterion') + + observeEvent(input$correction_table_criterion_cell_edit, { + # validate(need(!is.null(input$correction_table_criterion_cell_edit), '')) + #print(input$correction_table_criterion_cell_edit$row) + #print(input$correction_table_criterion_cell_edit$col) + #print(input$correction_Table_criterion_cell_edit$value) + if (input$correction_table_criterion_cell_edit$col == 1) { + # This is a score, possibly followed by a comment + # Get the corr_file + context <- context_react() + corr_file <- context$corr_files[ + order[input$correction_table_criterion_cell_edit$row]] + # Read it + message("Changing ", corr_file, " rubric...") + corrs <- suppressMessages(read(corr_file)) + # Make sure columns score, evaluator and comment are the right type + corrs$score <- as.numeric(corrs$score) + corrs$evaluator <- as.character(corrs$evaluator) + corrs$comment <- as.character(corrs$comment) + # Get position in the file + pos <- (1:nrow(corrs))[corrs$criterion == input$item] + max <- corrs$max[pos] + if (length(pos) != 1) { + msg <- paste0("ERROR: criterion ", input$item, " not found in ", + corr_file) + message(msg) + showNotification(msg, type = "error") + #selectCells(myProxy, selected = NULL) + + } else {# pos found in corrs + score_comment <- input$correction_table_criterion_cell_edit$value + # Decompose into score and comment + score <- trimws(sub("^([^ ]+).*$", "\\1", score_comment)) + if (is.null(score) || !length(score) || score == "") + score <- "NA" + comment <- trimws(sub("^[^ ]+(.*)$", "\\1", score_comment)) + if (is.null(comment) || !length(comment)) + comment <- "" + + is_ok <- TRUE + # Special case for score being "NA" + if (score == "NA") { + num_score <- as.numeric(NA) + } else { + num_score <- try(suppressWarnings(as.numeric(score)), silent = TRUE) + if (is.na(num_score) || inherits(num_score, "try-error")) + is_ok <- FALSE + } + + if (is_ok) { + # Check score is not > max (note: since we allow negative scores, they + # can be lower that zero and it is not an error) + # Exception: if the item is for a BONUS, max is zero, and we allow for + # positive values + if (!is.na(num_score) && max > 0 && num_score > max) { + msg <- paste0("ERROR: attempting to put a score ", num_score, + " higher than the max score (", max, ")") + message(msg) + showNotification(msg, type = "error") + #selectCells(myProxy, selected = NULL) + + } else {# Everything is fine, record this entry + corrs[pos, "score"] <- num_score + corrs[pos, "comment"] <- comment + corrs[pos, "evaluator"] <- input$evaluator + data.io::write$csv(corrs, corr_file) + } + } else {# !is_ok + msg <- paste0("ERROR: score '", score, + "' not convertible into a numeric value") + message(msg) + showNotification(msg, type = "error") + #selectCells(myProxy, selected = NULL) + } + } + } + }) + + # TODO: refactor to avoid duplicated code + observeEvent(input$correction_table_grid_cell_edit, { + # validate(need(!is.null(input$correction_table_grid_cell_edit), '')) + #print(input$correction_table_grid_cell_edit$row) + #print(input$correction_table_grid_cell_edit$col) + #print(input$correction_Table_grid_cell_edit$value) + if (input$correction_table_grid_cell_edit$col == 1) { + # This is a score, possibly followed by a comment + # Get the corr_file + context <- context_react() + corr_pos <- + (1:length(context$repos_names))[context$repos_names == input$grid] + if (length(corr_pos) != 1) { + msg <- paste0("ERROR: grid ", input$grid, " not found") + message(msg) + showNotification(msg, type = "error") + #selectCells(myProxy, selected = NULL) + } else { + corr_file <- context$corr_files[corr_pos] + message("Changing ", corr_file, " rubric...") + # Read it + corrs <- suppressMessages(read(corr_file)) + # Make sure columns score, evaluator and comment are the right type + corrs$score <- as.numeric(corrs$score) + corrs$evaluator <- as.character(corrs$evaluator) + corrs$comment <- as.character(corrs$comment) + # Get position in the file (criterion)... assume no changes in the order + # of the criteria in the evaluation grid! + pos <- input$correction_table_grid_cell_edit$row + max <- corrs$max[pos] + score_comment <- input$correction_table_grid_cell_edit$value + # Decompose into score and comment + score <- trimws(sub("^([^ ]+).*$", "\\1", score_comment)) + if (is.null(score) || !length(score) || score == "") + score <- "NA" + comment <- trimws(sub("^[^ ]+(.*)$", "\\1", score_comment)) + if (is.null(comment) || !length(comment)) + comment <- "" + + is_ok <- TRUE + # Special case for score being "NA" + if (score == "NA") { + num_score <- as.numeric(NA) + } else { + num_score <- try(suppressWarnings(as.numeric(score)), silent = TRUE) + if (is.na(num_score) || inherits(num_score, "try-error")) + is_ok <- FALSE + } + + if (is_ok) { + # Check score is not > max (note: since we allow negative scores, they + # can be lower that zero and it is not an error) + # Exception: if the item is for a BONUS, max is zero, and we allow for + # positive values + if (!is.na(num_score) && max > 0 && num_score > max) { + msg <- paste0("ERROR: attempting to put a score ", num_score, + " higher than the max score (", max, ")") + message(msg) + showNotification(msg, type = "error") + #selectCells(myProxy, selected = NULL) + + } else {# Everything is fine, record this entry + corrs[pos, "score"] <- num_score + corrs[pos, "comment"] <- comment + corrs[pos, "evaluator"] <- input$evaluator + data.io::write$csv(corrs, corr_file) + } + } else {# !is_ok + msg <- paste0("ERROR: score '", score, + "' not convertible into a numeric value") + message(msg) + showNotification(msg, type = "error") + #selectCells(myProxy, selected = NULL) + } + } + } + }) + + ## Reset last selected value + #observeEvent(input$reset, { + # selectCells(myProxy, selected = NULL) + #}) +} + +shinyApp(shinyUI, shinyServer) diff --git a/inst/shiny/www/assignments.csv b/inst/shiny/www/assignments.csv new file mode 100644 index 0000000..01d3d3a --- /dev/null +++ b/inst/shiny/www/assignments.csv @@ -0,0 +1,2 @@ +app,type,icourse,course,acad_year,term,module,assignment,template,url,alt_url,start,end,part,toc,clone,n,level,session +B05Ia_abies_balsamea,ind. github,S-BIOG-015,B,2022-2023,Q1,B05,B05Ia_22M_x,https://github.com/BioDataScience-Course/B05Ia_abies_balsamea,https://classroom.github.com/a/eacAtxT5,https://github.com/BioDataScience-Course/B05Ia_abies_balsamea,2022-12-05T10:15:00Z,2022-12-05T13:00:00Z,NA,TRUE,TRUE,1,3,22M diff --git a/inst/shiny/www/corrections/B22M/B05Ia_22M_x_2022-12-07/b05ia_22m_x-id227.csv b/inst/shiny/www/corrections/B22M/B05Ia_22M_x_2022-12-07/b05ia_22m_x-id227.csv new file mode 100755 index 0000000..796048f --- /dev/null +++ b/inst/shiny/www/corrections/B22M/B05Ia_22M_x_2022-12-07/b05ia_22m_x-id227.csv @@ -0,0 +1,12 @@ +file,category,criterion,code,score,max,evaluator,comment,student +*,common,Remarques gĂ©nĂ©rales sur le projet.,NA,0,0,NA,NA,NA +*,common,RĂ©alisation d'au moins un commit.,"(nb_commit(files = ¨docs/x.Rmd¨, cdata = cdata) > 0) - 1",0,0,auto,NA,NA +docs/x.Rmd,rmarkdown,Compilation du document.,"is_compiled(files = ¨docs/x.Rmd¨, cdata = cdata) -1",0,0,auto,NA,NA +docs/x.Rmd,rmarkdown,YAML = EntĂŞte complète (title+author+date).,NA,0,0,NA,NA,NA +docs/x.Rmd,import,@import = Importation et filtrage 950m < altitude < 1050m.,NA,2,2,phgrosjean,NA,NA +docs/x.Rmd,dataviz,@p = graphique height ~ diameter.,NA,0.9,1,phgrosjean,Points limite pâles,NA +docs/x.Rmd,statinterpretation,+p = interprĂ©tation du graphique.,NA,0.25,1,phgrosjean,Très insuffisant comme analyse. HĂ©tĂ©roscĂ©dasticitĂ© flagrante qui devrait suggĂ©rer de tester des transformations pour la stabiliser (pas observĂ© par aucunb Ă©tudiant!),NA +docs/x.Rmd,model,@model = ajuster le modèle et afficher le rĂ©sumĂ©.,NA,3,3,phgrosjean,OK,NA +docs/x.Rmd,statinterpretation,+model = InterprĂ©tation et paramĂ©trisation de @model.,NA,4,6,phgrosjean,"OK, mais juste un modèle, c'est maigre pour dĂ©cider si c'est le meilleur, et comparer sur un graphique et via AIC. Attention aussi aux chiffres significatifs dans la paramĂ©trisation.",NA +docs/x.Rmd,dataviz,@m = Graphique du modèle.,NA,1.5,2,phgrosjean,OK mais les points sont un peu pâles,NA +docs/x.Rmd,model,# Discussions et conclusions = Discussion sur l’ajustement d’un modèle.,NA,2,3,phgrosjean,"OK, et par rapport aux modèles?",NA diff --git a/inst/shiny/www/corrections/B22M/B05Ia_22M_x_2022-12-07/b05ia_22m_x-id93.csv b/inst/shiny/www/corrections/B22M/B05Ia_22M_x_2022-12-07/b05ia_22m_x-id93.csv new file mode 100755 index 0000000..1d5f725 --- /dev/null +++ b/inst/shiny/www/corrections/B22M/B05Ia_22M_x_2022-12-07/b05ia_22m_x-id93.csv @@ -0,0 +1,12 @@ +file,category,criterion,code,score,max,evaluator,comment,student +*,common,Remarques gĂ©nĂ©rales sur le projet.,NA,0,0,NA,NA,NA +*,common,RĂ©alisation d'au moins un commit.,"(nb_commit(files = ¨docs/x.Rmd¨, cdata = cdata) > 0) - 1",0,0,auto,NA,NA +docs/x.Rmd,rmarkdown,Compilation du document.,"is_compiled(files = ¨docs/x.Rmd¨, cdata = cdata) -1",0,0,auto,NA,NA +docs/x.Rmd,rmarkdown,YAML = EntĂŞte complète (title+author+date).,NA,0,0,NA,NA,NA +docs/x.Rmd,import,@import = Importation et filtrage 950m < altitude < 1050m.,NA,2,2,phgrosjean,NA,NA +docs/x.Rmd,dataviz,@p = graphique height ~ diameter.,NA,1,1,phgrosjean,La ligne horizontale est-elle rĂ©ellement nĂ©cessaire?,NA +docs/x.Rmd,statinterpretation,+PDURATION() = interprĂ©tation du graphique.,NA,0.5,1,phgrosjean,Tu vois une asymptote dans un nuage de points Ă  peu près linĂ©aire? HĂ©tĂ©roscĂ©dasticitĂ© flagrante qui devrait suggĂ©rer de tester des transformations pour la stabiliser (pas observĂ© par aucunb Ă©tudiant!),NA +docs/x.Rmd,model,@model = ajuster le modèle et afficher le rĂ©sumĂ©.,NA,3,3,phgrosjean,OK,NA +docs/x.Rmd,statinterpretation,+model = InterprĂ©tation et paramĂ©trisation de @model.,NA,5.5,6,phgrosjean,"OK. Juste , fais attention Ă  la validitĂ© des tests t lorsqu'il y a hĂ©tĂ©roscĂ©dasticitĂ©.",NA +docs/x.Rmd,dataviz,@m = Graphique du modèle.,NA,1.5,2,phgrosjean,"OK, mais pas besoin de rĂ©pĂ©ter la dĂ©finition de la fonction.",NA +docs/x.Rmd,model,# Discussions et conclusions = Discussion sur l’ajustement d’un modèle.,NA,2.5,3,phgrosjean,"Oui, un peu plus d'interprĂ©tation biologique aurait Ă©tĂ© bien.",NA diff --git a/inst/shiny/www/corrections/B22M/B05Ia_22M_x_2022-12-07/summary.log b/inst/shiny/www/corrections/B22M/B05Ia_22M_x_2022-12-07/summary.log new file mode 100644 index 0000000..9ff5406 --- /dev/null +++ b/inst/shiny/www/corrections/B22M/B05Ia_22M_x_2022-12-07/summary.log @@ -0,0 +1,2 @@ +id227 id227 15.2/20 (13.65/18 - 0 missing, 0 incorrect scores) b05ia_22m_x-id227.csv +id93 id93 17.8/20 (16/18 - 0 missing, 0 incorrect scores) b05ia_22m_x-id93.csv diff --git a/inst/shiny/www/corrections/B22M/B05Ia_22M_x_2022-12-07/summary.rds b/inst/shiny/www/corrections/B22M/B05Ia_22M_x_2022-12-07/summary.rds new file mode 100644 index 0000000..f3f5f30 Binary files /dev/null and b/inst/shiny/www/corrections/B22M/B05Ia_22M_x_2022-12-07/summary.rds differ diff --git a/inst/shiny/www/learnitgrid_config.R b/inst/shiny/www/learnitgrid_config.R new file mode 100644 index 0000000..ce0e9d2 --- /dev/null +++ b/inst/shiny/www/learnitgrid_config.R @@ -0,0 +1,27 @@ +# Learnitgrid configuration file +# Place here any constant or variable definitions that you need for your +# learnitgrid application + +# Non-standard repos and assign files +repos_filename <- "repositories.csv" +assign_filename <- "assignments.csv" + +# GitHub related constants +github_org <- "BioDataScience-Course" +github_url <- paste0("https://github.com/", github_org) +branch <- "main" + +# Various data relative to the courses +courses_aliases <- c( # Alias for the courses in the dropdown box + "A22M - Science des donnĂ©es I" = "A22M", + "B22M - Sciences des donnĂ©es II" = "B22M", + "C22M - Sciences des donnĂ©es III" = "C22M") +classroom_urls <- c( # Links to the GitHub Classroom pages + A = "https://classroom.github.com/classrooms/xxx/", + B = "https://classroom.github.com/classrooms/xxx/", + C = "https://classroom.github.com/classrooms/xxx/") + +# stat_git() options +exclude_authors <- c("sdd", "github-classroom[bot]") +git_stats_type <- c("all", "R", "Rmd", "Qmd") +git_stats_tz <- "Europe/Paris" diff --git a/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/.gitignore b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/.gitignore new file mode 100755 index 0000000..7967499 --- /dev/null +++ b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/.gitignore @@ -0,0 +1,52 @@ +ory files +.Rhistory +.Rapp.history + +# Session Data files +.RData + +# User-specific files +.Ruserdata + +# Example code in package build process +*-Ex.R + +# Output files from R CMD build +/*.tar.gz + +# Output files from R CMD check +/*.Rcheck/ + +# RStudio files +.Rproj.user/ + +# produced vignettes +vignettes/*.html +vignettes/*.pdf + +# OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3 +.httr-oauth + +# knitr and R markdown default cache directories +*_cache/ +/cache/ + +# Temporary files created by R Markdown +*.utf8.md +*.knit.md + +# R Environment Variables +.Renviron + +# README +README.html + +# html and pdf in docs +docs/*.html +docs/*.pdf +docs/*.nb.html + +# OS-specific files +.DS_Store + +test/** diff --git a/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/B05Ia_x.Rproj b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/B05Ia_x.Rproj new file mode 100755 index 0000000..00ee036 --- /dev/null +++ b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/B05Ia_x.Rproj @@ -0,0 +1,15 @@ +Version: 1.0 + +RestoreWorkspace: Default +SaveWorkspace: Default +AlwaysSaveHistory: Default + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 2 +Encoding: UTF-8 + +RnwWeave: knitr +LaTeX: XeLaTeX + +AutoAppendNewline: Yes diff --git a/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/R/dataset.R b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/R/dataset.R new file mode 100755 index 0000000..c776587 --- /dev/null +++ b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/R/dataset.R @@ -0,0 +1,34 @@ +# Importation des donnĂ©es +# Date : 2022-11-29 + +# Importation des packages +SciViews::R() + +# DonnĂ©es importĂ©es depuis ZENODO +url <- "https://zenodo.org/record/4943286/files/Abies_bals_allom_data_Peart.csv?download=1" + +# Importation des donnĂ©es +abies <- read$csv(url, cache_file = "data/raw/ab.csv") + +# Renommer les variables +abies <- janitor::clean_names(abies) + +# Ajout des labels et des unitĂ©s +abies <- labelise(abies, + label = list( + height = "Hauteur", + diameter = 'Diamètre Ă  1.37m du sol', + elevation = "Altitude", + canopyheight = "Hauteur du plus grand arbre proche" + ), + units = list( + height = "m", + diameter = "cm", + elevation = "m", + canopyheight = "m" + )) + +# Sauvegarde des donnĂ©es localement +write$rds(abies, "data/abies.rds", compress = "xz") + +rm(abies, url) diff --git a/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/README.Rmd b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/README.Rmd new file mode 100755 index 0000000..99c4de5 --- /dev/null +++ b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/README.Rmd @@ -0,0 +1,28 @@ +--- +title: "Croissance du sapin *Abies balsamea* (L.) Mill., 1768 au mont Moosilauke" +output: github_document +lang: "fr" +bibliography: "docs/bibliography.bib" +--- + + + +## PrĂ©sentation des donnĂ©es + +@wood_2015 ont Ă©tudiĂ© la croissance de *Abies balsamea*. Ils Ă©tudient la hauteur des arbres en fonction du diamètre du tronc Ă  1.37m, des arbres les plus proches dans un carrĂ© de 6m\*6m et de l'altitude. Les donnĂ©es associĂ©es Ă  cette Ă©tude sont disponible via [DRYAD](https://datadryad.org/) [@wood_data_2016]. + +## Objectif + +Ce projet est un projet individuel et cadrĂ©. Il permet de montrer que vous ĂŞtes capable d'utiliser la fonction `nls()` pour ajuster correctement un modèle non linĂ©aire dans un jeu de donnĂ©es. + +## Consignes + +ModĂ©lisez la hauteur de *Abies balsamea* en fonction de son diamètre. ComplĂ©tez le document `abies.Rmd` prĂ©sent dans le dossier `docs/`. + +Lorsque vous aurez terminĂ© de complĂ©ter le fichier, compilez ce dernier en HTML (bouton **Knit**) et assurez-vous que la compilation s'est faites sans erreurs, sinon, apportez les corrections nĂ©cessaires. Dans votre commit - push final, assurez-vous d'avoir un fichiers `.Rmd` qui compile correctement. Cela fait partie de l'exercice. VĂ©rifiez que votre dernier commit a bien Ă©tĂ© pushĂ© sur GitHub avant la fin de la sĂ©ance. + +Faites attention Ă  bien citer vos sources. Le plagiat est, comme toujours, bien Ă©videmment interdit. Si vous avez Ă©tĂ© aidĂ© par quelqu'un (un ou une autre Ă©tudiant•e ou enseignant•e) pour l'une ou l'autre partie de votre projet, vous devez le ou la citer. + +Ce projet correspond au template + +## Bibliographie diff --git a/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/README.md b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/README.md new file mode 100755 index 0000000..ce71020 --- /dev/null +++ b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/README.md @@ -0,0 +1,61 @@ +Croissance du sapin *Abies balsamea* (L.) Mill., 1768 au mont Moosilauke +================ + + + +## PrĂ©sentation des donnĂ©es + +Wood et al. (2015) ont Ă©tudiĂ© la croissance de *Abies balsamea*. Ils +Ă©tudient la hauteur des arbres en fonction du diamètre du tronc Ă  1.37m, +des arbres les plus proches dans un carrĂ© de 6m\*6m et de l’altitude. +Les donnĂ©es associĂ©es Ă  cette Ă©tude sont disponible via +[DRYAD](https://datadryad.org/) (Wood et al. 2016). + +## Objectif + +Ce projet est un projet individuel et cadrĂ©. Il permet de montrer que +vous ĂŞtes capable d’utiliser la fonction `nls()` pour ajuster correctement +un modèle non linĂ©aire dans un jeu de donnĂ©es. + +## Consignes + +ModĂ©lisez la hauteur de *Abies balsamea* en fonction de son diamètre. +ComplĂ©tez le document `abies.Rmd` prĂ©sent dans le dossier `docs/`. + +Lorsque vous aurez terminĂ© de complĂ©ter le fichier, compilez ce dernier +en HTML (bouton **Knit**) et assurez-vous que la compilation s’est +faites sans erreurs, sinon, apportez les corrections nĂ©cessaires. Dans +votre commit - push final, assurez-vous d’avoir un fichiers `.Rmd` qui +compile correctement. Cela fait partie de l’exercice. VĂ©rifiez que votre +dernier commit a bien Ă©tĂ© pushĂ© sur GitHub avant la fin de la sĂ©ance. + +Faites attention Ă  bien citer vos sources. Le plagiat est, comme +toujours, bien Ă©videmment interdit. Si vous avez Ă©tĂ© aidĂ© par quelqu’un +(un ou une autre Ă©tudiant•e ou enseignant•e) pour l’une ou l’autre +partie de votre projet, vous devez le ou la citer. + +Ce projet correspond au template + + +## Bibliographie + +
+ +
+ +Wood, Zachary T., David R. Peart, Peter A. Palmiotto, Lixi Kong, et Noah +V. Peart. 2015. « Asymptotic allometry and transition to the canopy in +Abies balsamea ». *Journal of Ecology* 103 (6): 1658‑66. +https://doi.org/. + +
+ +
+ +———. 2016. « Data from: Asymptotic allometry and transition to the +canopy in Abies balsamea ». Zenodo. +. + +
+ +
diff --git a/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/data/abies.rds b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/data/abies.rds new file mode 100755 index 0000000..a0e88e0 Binary files /dev/null and b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/data/abies.rds differ diff --git a/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/data/raw/ab.csv b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/data/raw/ab.csv new file mode 100755 index 0000000..cd0a551 --- /dev/null +++ b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/data/raw/ab.csv @@ -0,0 +1 @@ +HEIGHT,DIAMETER,ELEVATION,CANOPYHEIGHT 9.434452806,24,808,9.434452806 6.1,14.4,808,11.76730981 1.9,1.2,808,15.53032406 1.4,0.5,808,6.8 1.7,0.5,808,7.4 1.9,1,808,13.9 1.8,1.5,808,11.76730981 1.4,0.5,808,11.76730981 1.5,0.5,808,9.434452806 1.5,0.5,808,15.62653365 2.7,2.9,808,15.62653365 1.7,1,808,15.62653365 2.3,4.3,808,15.62653365 2.5,3.3,808,13.970052 13.28221264,28.3,808,20.4277355 10.09529675,15.1,808,20.4277355 1.5,0.5,808,15.62653365 4.4,4.4,808,15.6 4.4,6.5,808,15.6 6,9.6,808,15.6 17,31.2,808,17 15.55203149,24.3,808,20.4277355 1.5,0.5,808,17 7.1,11,808,8.8 4.4,4.9,808,12.3 1.7,0.5,808,12.3 1.8,1.3,808,12.3 2,1.2,808,12.3 10.7,12,840,15.85591307 10.2,12.9,840,15.85591307 8.3,9.5,840,15.85591307 8.3,14.5,840,15.85591307 8.1,11.1,840,15.85591307 3.1,3.5,840,15.85591307 2,2.3,840,17.09374389 3.1,4,840,17.09374389 3,3.4,840,17.09374389 1.5,0.5,840,17.09374389 1.9,1.8,840,19.63009369 2.4,3,840,19.63009369 3.5,4.4,840,19.63009369 2.8,3.4,840,19.63009369 1.5,0.5,840,19.63009369 1.7,1.4,840,17.09374389 2.8,3,840,14.2027458 1.3,1.9,840,17.09374389 3.3,5.1,840,14.2027458 3,3.3,840,14.2027458 1.5,0.5,840,19.63009369 2,1.7,840,17.09374389 3.4,3.9,840,19.63009369 4.1,5.8,840,14.2027458 2.9,3.6,840,17.09374389 3.1,4,840,17.09374389 7.5,12.7,840,13.35732473 8.6,10,840,13.35732473 5.4,9.5,840,15.80133404 3.3,3.6,840,15.5 4.2,4.7,840,17.07748162 5.4,6.8,840,13.6 2,2.7,840,17.07748162 5.5,7.7,840,13.53250579 2.2,2,840,17.07748162 4.2,6.2,840,13.6 6.5,7.6,840,13.53250579 5.7,7.4,840,17.07748162 2.2,1.7,840,17.07748162 4.9,6,840,15.5 3.8,4.8,840,15.80133404 6.9,7.5,840,13.7 6.3,8,840,18.06543231 7.4,9.2,840,11.5 13.7,23.1,840,13.7 8.8,31.6,840,13.6 7.6,9.4,840,18.06543231 3.3,4.8,840,13.7 4.5,3.9,840,18.06543231 2.7,2.2,840,18.06543231 2.9,3,840,13.7 5,6,840,18.06543231 4.2,3.6,840,18.06543231 1.9,1.5,840,18.06543231 2,2.3,840,18.06543231 2.2,2.8,840,13.7 3.7,4.3,840,18.06543231 1.5,1,840,18.06543231 2.5,2,840,18.06543231 4.7,5.2,840,18.06543231 2.8,2.8,840,13.7 5.2,6.3,840,13.7 3.9,4.5,840,18.06543231 5.4,6.1,840,13.6 3.9,5.4,840,18.06543231 13.3,19.7,840,17.09374389 5.2,8.2,840,15.78342419 11.6,18.5,840,17.09374389 6.2,7.8,840,15.78342419 6.7,7.2,840,15.78342419 8.4,9.3,840,15.78342419 1.9,3.2,840,15.78342419 4.5,5.6,840,15.78342419 5.5,7.1,840,15.78342419 1.5,0.5,840,15.78342419 5.7,7.7,840,17.09374389 3.1,3.6,840,17.09374389 2.1,1.8,840,19.63009369 3.1,3.9,840,15.78342419 3.3,3.4,840,15.78342419 1.9,3.4,840,15.78342419 1.8,1,840,19.63009369 4.6,6.5,840,15.78342419 5.1,6.9,840,15.78342419 5.6,7.2,840,15.78342419 4.9,8.1,840,15.78342419 2.7,2.7,815,13.5 13.6,20.6,815,13.6 13.5,34.9,815,13.5 8.6,13.5,815,13.5 1.2,0.5,815,13.5 1.6,1,815,13.5 1.3,0.5,815,13.5 1.2,0.5,815,13.5 8.1,15.8,815,13.3 1.8,1.5,815,13.6 1.5,0.5,815,13.6 1.7,0.5,815,6.8 13.7,20.9,815,21.13632107 5.1,8.8,815,21.13632107 1.6,1,815,21.13632107 2.9,3.5,815,12 3.4,4.9,815,12 3.3,5,815,12 5,6.7,815,11.2 5.4,8.1,815,11.2 1.5,0.5,815,7.5 2,2.6,815,11.2 1.8,0.5,815,12 6,10.4,815,6 8.1,6.7,1017,12 6.1,7.8,1017,12 10.9,16.3,1017,13.6 7.9,9.6,1017,13.6 7.2,17.2,1017,13.6 7.3,10.2,1017,13.6 9.1,16,1017,11.2 5.6,9.9,1017,13.6 2.8,3.8,1017,13.6 3.1,3,1017,11.2 2,1.4,1017,13.6 2.2,2.8,1017,13.6 1.7,0.9,1017,11.3 1.7,1.9,1017,13.6 2.1,2.1,1017,11.3 2.8,3.2,1017,11.3 1.6,0.6,1017,11.3 1.9,1.6,1017,12 1.8,1.8,1017,11.2 2.5,2.1,1017,11.2 2.5,3.4,1017,13.6 1.8,2,1017,11.2 2.8,3.2,1017,11.2 1.4,0.2,1017,11.2 2.6,3.2,1017,11.2 2.7,2.8,1017,11.2 2.4,2.8,1017,12.1 2.5,3,1017,12.1 2.1,2.2,1017,11.2 1.5,0.4,1017,12 6.7,8.1,1017,13.4 6.1,8.8,1017,13.4 8.5,12.5,1017,13.5 5.4,7.3,1017,13.4 4.8,7.7,1017,13.4 10.5,18.4,1017,12.1 5.3,7.5,1017,14.9 7.5,12,1017,13.4 1.6,0.5,1017,13.4 1.5,0.6,1017,14.9 2,1.9,1017,11.8 1.7,0.7,1017,14.9 2.7,2.7,1017,13.5 1.5,0.3,1017,14.9 2.7,2.4,1017,14.9 2.6,1.8,1017,14.9 2.8,3,1017,13.4 1.9,1.1,1017,14.9 1.4,0.5,1017,13.5 3.2,6,1017,13.5 1.5,0.4,1017,14.9 6.2,5,1017,13.4 1.7,0.9,1017,12.1 2.6,1.5,1017,14.9 1.4,0.2,1017,13.5 9.6,14.6,1017,13.8 14.1,18.6,1017,14.1 2.7,2,1017,12.1 4.4,5.1,1017,10.1 2.7,2.5,1017,12.1 3,5.3,1017,12.1 2.7,2.7,1017,10.5 2,1.4,1017,14.9 1.7,1.1,1017,14.9 2.8,2.7,1017,14.9 2.4,1.7,1017,14.9 3.5,3.8,1017,14.9 2.7,1.2,1017,14.9 1.7,0.9,1017,14.9 2.1,1.8,1017,14.9 3.1,3.3,1017,14.9 2.4,3.3,1017,14.9 1.8,1.4,1017,10.5 3.1,2.6,1017,14.9 2,1.4,1017,10.5 1.7,1.2,1017,14.9 2.7,2.6,1017,14.9 2.2,2.1,1017,14.9 2.8,0.8,1017,10.5 2,1.5,1017,10.5 1.5,0.9,1017,10.5 2.3,1.4,1017,14.9 1.4,0.4,1017,10.5 7.7,13.8,1017,13.5 7.7,13,1017,13.5 9.2,12.7,1017,13.6 4.8,10.1,1017,13.8 2.7,2.1,1017,13.6 3.5,4,1017,13.6 2.2,1.2,1017,12.7 1.5,0.4,1017,12.7 3.5,6,1017,10.6 2.7,2.4,1017,9.2 2.1,1.4,1017,10.6 2.4,1.8,1017,9.2 3.8,3.9,1017,9.2 1.6,0.7,1017,9.2 2,1.4,1017,9.2 1.3,0.3,1017,11.7 2.1,1.6,1017,9.6 4.5,5.9,1017,11.7 4.3,5.3,1017,9.6 1.2,0.5,1017,9.2 2,1.1,1017,12.7 1.5,0.5,1017,13.6 1.5,0.4,1017,13.6 16.1305285,35.6,990,16.1305285 13.7,20.1,990,17.66244256 7.2,7,990,17.66244256 5.1,6.5,990,16.1305285 4.9,5.6,990,16.1305285 7.4,9.6,990,17.66244256 7.2,7.1,990,17.66244256 11.1,15.8,990,15.90672889 3.8,5.9,990,15.7 2.9,2.7,990,15.7 1.2,0.5,990,15.7 2,1.5,990,15.90672889 4.8,6.3,990,16.1305285 4.8,6.3,990,17.66244256 5,6.5,990,17.66244256 7.1,10.7,990,14.3 13.4,15.5,990,15.2 15.7,16.6,990,16.1305285 7.8,11.9,990,15.2 9.5,14,990,13.4 9.5,13.6,990,13.3 14.5,12.6,990,16.1305285 10.6,16,990,20.00100157 15.2,18.9,990,15.7 1.4,0.4,990,20.00100157 1.5,0.8,990,20.00100157 4.4,5.3,990,15.7 2.6,3.8,990,20.00100157 1.6,1.3,990,20.00100157 2.1,1.8,990,20.00100157 3.1,3.2,990,20.00100157 2.5,2.9,990,20.00100157 3.9,4.6,990,15.7 1.6,1.2,990,20.00100157 6.6,8.1,990,15.7 3.6,4.2,990,15.7 2.2,1.6,990,15.7 1.9,1.4,990,15.7 2.3,2.4,990,15.7 1.5,1.7,990,15.7 3.4,3.3,990,15.7 15.7,22.2,990,15.7 11.3,13.8,990,15.5 6.3,7.4,990,15.5 2.9,3.6,990,15.7 9.2,12.1,990,15.5 9.6,11.3,990,15.5 5.4,5.6,990,15.5 9.8,12.3,990,15.5 1.8,1.3,990,20.00100157 3.1,3.8,990,20.00100157 2.1,1.2,990,20.00100157 2.3,1.8,990,20.00100157 3.7,3.5,990,20.00100157 2.4,2.2,990,15.7 4.4,4.3,990,15.7 3.5,3.6,990,15.7 2.6,2.5,990,20.00100157 2.1,2.9,990,20.00100157 2,1,990,15.7 2.9,3,990,15.7 1.6,1.7,990,15.7 1.7,1.1,990,15.7 2.2,1.8,990,20.00100157 2.3,2.4,990,20.00100157 3.9,4.1,990,20.00100157 1.8,1.4,990,20.00100157 11,17.7,990,20.00100157 1.7,1.1,990,15.7 6.9,11.4,990,16.71016044 8,14.2,990,12 7.5,8.5,990,12 5.7,8,990,10.1 8.1,10.3,990,11.2 10.1,15,990,10.1 9.1,10.9,990,13.7 9.7,11.2,990,16.71016044 10.4,16.3,990,16.71016044 3.7,4.7,990,16.71016044 4.3,4.7,990,10.1 3.3,4.5,990,13.7 4.3,5.5,990,12.1 3.8,4.9,990,12.1 5.1,5.8,990,12.1 5.6,6.7,990,12.1 3.3,4.7,990,12.1 5.2,5.2,990,12.1 5.2,5.4,990,13.7 3.1,3.3,990,13.7 4.3,6.4,1030,16 7.5,8.8,1030,12.5 6.7,7.5,1030,16 5.2,7.5,1030,15 5,6.1,1030,16 4.7,8.7,1030,12.5 6.3,8.2,1030,16 8.5,12.5,1030,16 15,25.4,1030,16 5.7,11.9,1030,16 8.9,9.3,1030,16 11.4,18.5,1030,15 3.8,6.8,1030,15 10.1,13.1,1030,14.9 12.5,26.4,1030,16 6.6,7.8,1030,16 5.5,7,1030,16 4,5.5,1030,16 8.1,19.3,1030,11.6 2.1,2.6,1030,11.6 2.1,1.6,1030,11.6 3.8,4.7,1030,12 2.7,2.8,1030,12 3.2,3.9,1030,12 4.8,7.8,1030,15.3 5.1,7.6,1030,11.6 6.5,8.7,1030,11.6 4.9,5.3,1030,15.3 1.7,1,1030,15.3 5.5,7.1,1030,15.3 3.6,3.2,1030,7.8 3.5,3.5,1030,11.2 3.7,3.8,1030,11.2 5.6,8.1,1030,11.2 2,1.4,1030,16.1 5.3,5,1030,11.2 4.4,4.2,1030,11.2 4.1,4.8,1030,7.8 1.9,1.5,1030,16.1 3.3,2.7,1030,15.3 2.7,2.5,1030,15.3 4.1,6,1030,15.3 10.7,13.8,1030,11.6 11.2,20.9,1030,11.6 5.7,6.5,1030,16.1 3.3,3,1030,16.1 5.7,6.8,1030,16.1 2.9,4.4,1030,8.5 4,3.7,1030,16.1 3.4,3.5,1030,16.1 2.8,2.3,1030,16.1 2.1,1.8,1030,16.1 4,3.5,1030,16.1 5.7,7.8,1030,16.1 15.3,24.6,1030,15.3 4.5,6.5,1030,16.1 5.1,5,1030,16.1 2,1.7,1030,16.1 7.1,10.3,1030,11.6 8.5,13.8,1030,11.2 2.5,2.3,1030,15.3 2.8,4,1030,15.3 2.2,1.7,1030,15.3 1.8,1.2,1030,15.3 3.6,3.9,1030,15.3 2.8,2.7,1030,15.3 1.4,0.8,1030,15.3 5.2,8.1,1030,7.8 2.6,1.8,1030,12 4.6,6.1,1030,15.3 6.8,9.9,1030,11.2 2,1.2,1030,11.6 2.3,1.2,1030,15.3 5.7,8.7,1030,12 5.8,8.6,1030,10.9 7.2,10.9,1030,12 7.7,14.5,1030,10.9 8.3,10.6,1030,10.9 6.9,10.9,1030,12 4.3,5.4,1030,10.9 5.3,9,1030,14.1 6.2,10.8,1030,14.1 6.6,9.5,1030,13.6 6,7.3,1030,14.1 4.9,6,1030,14.1 4.3,5.7,1030,14.1 5.8,8,1030,14.1 4.9,7.4,1030,10.9 4.1,5.8,1030,10.9 5.3,7,1030,10.9 4.4,6.4,1030,12 11,18.5,1030,11.3 12,20.8,1030,12 14.7,27.5,1030,14.7 7.8,10.8,1030,12 10.4,12.5,1030,11.3 10,13.9,1030,10.4 10.4,13.1,1030,14.7 11.3,19.1,1030,11.3 9.2,17.2,1030,10.4 9.7,13.1,1030,14.7 10.1,12.8,1030,14.7 8.7,8.1,1030,12 7.4,11.1,1030,11.3 9,9.3,1030,14.7 10,13.2,1030,14.7 8.9,15.5,1030,10.4 10.7,16.4,1030,14.7 4,5.7,1030,11.3 13.6,19.7,1017,17 17,20.7,1017,17 5.6,9.3,1017,6.5 6.1,7.8,1017,14 4.7,5.1,1017,13.6 5.3,7,1017,6.5 5,6.2,1017,11.2 4.4,5.1,1017,11.2 6.8,6.6,1017,14 4.5,6.2,1017,12 5,5.8,1017,12 4.6,7.3,1017,12 4.4,5.1,1017,13.6 4.6,5.3,1017,17 4.9,5.5,1017,17 4.9,5.6,1017,17 4.4,5.8,1017,17 6.5,8.6,1017,17 5,6.1,1017,17 10.4,12.7,1017,19.94501094 7.4,11.2,1017,10.4 8.7,11.7,1017,19.94501094 7.2,10.3,1017,13 8.1,13.5,1017,13 15.9,21.4,1017,19.94501094 19.94501094,21.5,1017,19.94501094 5.4,8.3,1017,10.1 4.8,6.4,1017,19.94501094 4.1,5.1,1017,13 3.4,5.1,1017,19.94501094 4.7,5.9,1017,19.94501094 9.7,9.9,1017,13.6 9.5,14.2,1017,14.6 7.4,12.6,1017,16.985 8.6,14.4,1017,12.7 16.985,32.9,1017,16.985 8.6,9.1,1017,14.6 6.3,11.6,1017,16.985 7.9,9.8,1017,14.6 9.3,12.5,1017,14.6 1.1,4.6,1017,14.6 2.3,1.4,1017,19.94501094 3,3.2,1017,19.94501094 4.6,4.9,1017,12.7 1.8,1.3,1017,19.94501094 2.9,3.3,1017,14.6 1.5,0.7,1017,14.6 3.5,5.1,1017,19.94501094 1.7,2.2,1017,14.6 2.1,1.9,1017,16.985 1.8,1.8,1017,16.985 2.4,2,1017,16.985 4.5,7,1017,13.6 8.8,11,1017,14 7.1,8.6,1017,13.6 4.5,6.3,1017,13.6 8.6,11.5,1017,14 10.1,15.3,1017,13.6 5.4,8.7,1017,13.6 11.2,18.4,1017,11.6 9.4,20,1017,11.6 6.8,7.1,1017,12.7 11.3,19.7,1017,12.7 3,2.6,1025,15 2.5,1.4,1025,13.6 1.5,0.8,1025,15 1.6,1.4,1025,15 15,20.2,1025,15 1.3,0.5,1025,14.1 1.4,0.7,1025,15 1.9,1.2,1025,15 3,3.1,1025,15 3.2,3.7,1025,15 1.6,1.3,1025,15 1.7,1.3,1025,15 2.1,2,1025,15 2.9,3.3,1025,15 2.2,1.4,1025,15 2,1.3,1025,15 2.1,1.5,1025,15 4.2,4.9,1025,15 3.4,3.6,1025,15 2.4,2.8,1025,15 1.8,1.2,1025,15 1.6,1.5,1025,15 2.6,2.5,1025,13.6 2.4,2.5,1025,13.6 2.6,3.8,1025,13.6 2.6,2.8,1025,13.6 3,3.1,1025,13.6 2.2,1.9,1025,14.1 2,1.8,1025,11.5 3.6,3.7,1025,11.5 2.7,2.9,1025,14.1 3.4,4.7,1025,14.1 1.8,1.1,1025,14.1 3.4,5.2,1025,14.1 1.7,0.9,1025,15 2.6,2.5,1025,14.1 13.6,13.1,1025,15 3,4.6,1025,15 1.6,0.5,1025,15 3.5,5,1025,15 1.7,1.3,1025,15 1.5,1.2,1025,15 2.5,1.8,1025,15 2.3,2.3,1025,13.6 2.9,3.5,1025,15 1.9,1.6,1025,13.6 4,5.1,1025,6.1 2.5,2.2,1025,6.1 2.5,2.6,1025,13.6 5.4,7,1025,13.6 1.7,1.2,1025,13.6 2.1,2.1,1025,13.6 3,3.5,1025,15 2.8,2.8,1025,13.6 5.1,6,1025,13.6 2,1.9,1025,13.6 3.2,3.5,1025,13.6 2.9,3.5,1025,5.4 3,3.5,1025,13.6 4,4.6,1025,13.6 1.6,1.4,1025,14.1 2.5,2.2,1025,14.1 2.5,2.5,1025,14.1 3.1,3.4,1025,13.6 1.7,1.1,1025,5.4 2.7,3,1025,5.4 3.2,3.2,1025,13.6 2.4,3.1,1025,15 2.7,2.3,1025,15 2.4,2,1025,13.6 1.7,1,1025,15 4.2,4.6,1025,11.5 2,1.7,1025,13 1.7,0.8,1025,14.1 3.3,3.1,1025,15 1.5,0.7,1025,15 1.5,0.5,1025,15 3.6,4.2,1025,15 1.6,2.5,1025,15 2.7,2.5,1025,15 2.8,2.6,1025,15 1.9,2.2,1025,15 3.9,4.6,1025,15 3.4,3.4,1025,14.1 1.9,1.4,1025,14.1 1.6,0.8,1025,15 1.9,2.2,1025,15 2.5,1.9,1025,14.1 2,1.4,1025,15 2.5,2,1025,14.1 2.5,2.5,1025,15 1.9,1.2,1025,15 1.3,0.6,1025,15 3,2.9,1025,15 4.3,5.1,1025,15 3.9,4.1,1025,15 4.1,4.4,1025,15 3,2.7,1025,15 1.4,0.6,1025,6.1 3.4,3.5,1025,6.1 2.9,3,1025,14.1 1.6,1.3,1025,6.1 1.7,1.3,1025,6.1 4.6,4.6,1025,5.4 2.8,3,1025,6.1 3,2.9,1025,13 3.4,3.1,1025,13 1.7,0.8,1025,13 1.8,1.3,1025,13 1.7,1.5,1025,13 2,0.9,1025,13 2.5,4.5,1025,13 3.3,3.7,1025,13 1.8,1.7,1025,5.4 2.8,3.4,1025,13 2.4,2.1,1025,14.1 2.3,2.9,1025,15 2.3,3.5,1025,15 2.4,2.2,1025,15 1.6,1.3,1025,15 2.6,2.6,1025,15 2.5,2.3,1025,15 2.6,3,1025,13.6 2,2,1025,13.6 3.5,3.4,1025,13.6 1.4,2.4,1025,6.1 1.6,1.1,1025,13.6 3.7,4.2,1025,11.5 2,1.5,1025,11.5 2.2,1.7,1025,13.6 2.1,1.8,1025,11.5 1.9,1,1025,15 2.8,2.8,1025,14.1 3.3,3.1,1025,14.1 3.9,4.7,1025,13.6 5.3,5.8,1025,13.6 1.6,1.8,1025,15 3,3.3,1025,14.1 1.8,1.1,1025,15 1.5,0.9,1025,15 1.4,0.6,1025,15 1.3,0.9,1025,15 1.4,0.6,1025,15 1.9,2.6,1025,14.1 1.4,0.6,1025,13 1.5,0.8,1025,15 1.6,0.8,1025,14.1 2,1.4,1025,15 1.4,0.7,1025,15 1.4,0.9,1025,15 1.5,0.8,1025,15 2,1.8,1025,15 2.3,1.5,1025,15 1.2,0.6,1025,15 1.3,0.7,1025,13.6 1.5,0.8,1025,5.4 1.5,0.8,1025,15 1.4,0.6,1025,15 1.7,0.6,1025,13 1.5,0.6,1025,15 1.4,0.3,1025,14.1 2.2,0.4,1025,14.1 1.9,1.3,1025,15 10.7,11.7,1025,13.6 4.5,7,1025,13.6 13.2,16.5,1025,15 10.9,11.1,1025,13.2 12.1,15.7,1025,13.2 1.6,1.1,1025,15 3.3,2.9,1025,15 1.9,1,1025,15 1.9,1,1025,15 3.2,3.1,1025,15 2.4,2.2,1025,15 14.8,24.8,1025,14.8 6.3,7.8,1025,14.8 4.6,6.2,1025,14.1 11.3,14.3,1025,15 7.4,10.9,1025,15.9 15,15.4,1025,15.9 7.9,9.5,1025,15 15.9,25.9,1025,15.9 7.8,11.7,1025,15 8.7,10.7,1025,14.9 4.7,6,1025,15.9 5.4,7.2,1025,15.9 5.1,6.3,1025,15.9 7.7,12.6,1025,12.4 8.3,11.6,1025,13 4.9,7.1,1025,14.9 9.7,14.4,1025,16.9 4.7,7.5,1025,16.9 9.9,12.5,1025,13 10.6,13.3,1025,16.9 9.4,11.5,1025,13 6.5,9.4,1025,16.9 7.2,12.1,1025,12.4 4.2,5.8,1025,13 4.3,6,1025,12.4 4,5.7,1025,16.9 3.5,5.4,1025,10.4 3.9,6.3,1025,12.4 13.4,16,1011,15.2 11.3,10.3,1011,15.2 6.5,7.3,1011,15.7 15.2,23.2,1011,15.2 16,18.4,1011,16 14.1,13.6,1011,14.1 6.7,10.2,1011,12.2 8.6,11.1,1011,15.1 8.2,10.8,1011,11.2 6.8,7.4,1011,10.6 5.2,6.7,1011,16 12.5,19.4,1011,15.1 6,7.5,1011,15.8 5.8,8.1,1011,15.8 7.3,5.7,1011,12.5 2.1,2,1011,13.5 1.9,1.4,1011,14.9 1.4,0.5,1011,13.5 1.5,9,1011,13.5 1.7,1.3,1011,13.5 1.5,0.8,1011,14.9 1.6,1,1011,14.9 9,10.9,1011,13.5 9.1,13.4,1011,14.9 6.5,8.6,1011,14.9 8.1,12.7,1011,14.9 7.8,12.7,1011,14.9 4.2,5.4,1011,16 8,11.5,1011,14.9 8.5,7.3,1011,14.9 5.4,6.2,1011,16 4.3,5.3,1011,12 6.2,8.7,1011,15.7 7.2,12.4,1011,11.4 15.7,21,1011,16 14.6,21.9,1011,14.6 7.3,10.5,1011,11.4 6.2,9.3,1011,15.7 9.3,10.5,1011,12 4.3,5.6,1011,14.6 2.7,5.4,1167,8.6 4.8,6.2,1167,8.1 7,11.6,1167,8.7 5,9,1167,8.1 8.5,14.5,1167,8.6 4.9,6.7,1167,8.7 5.7,10.2,1167,9 6.3,11.1,1167,9 5.5,7.1,1167,8.1 3.6,7,1167,8.6 5.9,6.8,1167,8.1 7.3,12.6,1167,8.1 4.9,5.8,1167,8.7 6.3,7.2,1167,8.1 5.5,7.3,1167,8.6 8.7,17.1,1167,8.7 8.1,15.7,1167,8.1 7.5,8.4,1167,8.1 5.6,6.7,1167,8.1 8.6,12.8,1167,8.7 5.8,7.5,1167,8.1 7.8,12.7,1167,9 6.9,8.8,1167,8.1 7.5,11.9,1167,8.7 6.9,10.6,1167,8.7 4.6,5.5,1167,8.1 4.7,5.8,1167,8.1 5.3,5.7,1167,8.1 5.3,5.7,1167,8.7 4.6,5.7,1167,8.1 4.5,7.8,1167,8.6 2.2,2.5,1167,8.9 6.3,14.2,1167,8.9 4.7,7.7,1167,8.9 8.4,11.3,1167,9 7.1,11.7,1167,9 6.1,8.1,1167,8.9 7.9,11.5,1167,8.9 6.4,8.6,1167,8.9 5.8,9.6,1167,9 5.3,6.1,1167,9 1.6,1.4,1167,9 1.7,2.5,1167,9 1.5,1.1,1167,9 1.6,4,1167,8.9 2.7,2.5,1167,9 1.7,1,1167,9 2.5,3.9,1167,9 3.9,4.6,1167,9 3,4.7,1167,9 1.7,1.5,1167,8.9 2.6,2.9,1167,8.9 3.3,3.8,1167,7.5 1.5,0.7,1167,7.5 3,3.7,1167,9 2.8,2.9,1167,9 2.9,3.9,1167,7.5 1.4,1,1167,7.5 1.5,1.6,1167,7.5 3.1,3.6,1167,8.9 3.3,4.9,1167,9 2.4,2.8,1167,9 1.5,1.1,1167,9 3.7,4,1167,9 1.8,1.3,1167,9 2.8,2.9,1167,8.5 5.3,5.1,1167,8.5 1.7,1.3,1167,8.9 5,6.3,1167,8.5 2.7,2,1167,8.5 2.4,3.4,1167,9 2.3,3.6,1167,8.9 8.8,13.2,1167,9 8.4,10.8,1167,8.9 6.3,9.9,1167,8.9 1.5,0.9,1167,8.5 3.4,4.3,1167,8.5 2.6,3.1,1167,8.9 2.2,2.4,1167,9 1.8,2.1,1167,8.9 2.8,4.8,1167,8.9 3.7,5.1,1167,8.9 3.3,3.9,1167,8.9 2.9,4.3,1167,8.9 9,12.2,1167,9.5 5,6.4,1167,8.9 7,11.2,1167,8.9 8.9,15,1167,9.5 7,10.5,1167,9.5 4.9,6.6,1167,9.5 5.5,9.3,1167,9.5 5.8,6.6,1167,9.5 7.6,12,1167,9.5 5.9,15.5,1167,10 7.5,8.7,1167,7.6 4.9,6.7,1167,7.6 3.7,6.6,1167,9.5 4.9,15,1167,9.5 9,15.7,1167,9.5 6.4,20.2,1167,10 4.6,6.9,1167,9.5 9.5,15.7,1167,9.5 7,12.5,1167,9.5 5.4,9.7,1167,9.5 4,5.3,1167,9.5 3.8,5.2,1167,9.5 6.7,7.7,1167,7.7 6.6,9.7,1167,8.5 6.4,9.5,1167,7.7 5.4,9,1167,7.7 4.5,6.4,1167,8.2 4.8,6.9,1167,8.2 7.1,12.2,1167,7.9 6.6,9.1,1167,8.2 3.7,5.1,1167,7.7 5.3,8.8,1167,8.2 7.6,12.5,1167,7.7 5,9.4,1167,7.9 8.1,14,1167,8.5 7,17.3,1167,8.2 6.2,7,1167,7.9 7.7,9.7,1167,8.2 7.9,13.8,1167,8.2 8.1,13.9,1167,8.2 4.9,7.8,1167,8.5 6.6,9.7,1167,7.3 5.7,7.6,1167,8.2 6.4,8.7,1167,7.7 7,8.9,1167,7.9 8.2,12,1167,8.2 4.3,7.2,1167,8.2 5.8,6.5,1167,8.2 4.3,5.5,1167,7.3 6,9.2,1167,7.7 3.2,5.2,1167,7.3 4.8,5.3,1167,7.9 3.9,5.7,1167,8.2 6.7,8.7,1177,9.2 6.3,9.1,1177,9.2 8.5,10.7,1177,9.2 4.3,7.4,1177,10.3 4.7,7,1177,10.3 5.7,10.1,1177,10.3 5,8.5,1177,9.2 7.9,10,1177,9.2 5.1,6.9,1177,8 5.6,6.3,1177,10.3 3,5,1177,10.3 3.1,5.5,1177,10.3 3.6,6.7,1177,9.2 4.1,5.6,1177,7.9 4.4,9.5,1177,7.9 3.4,6,1177,9 6.1,7,1177,8.1 1.4,0.3,1177,9.1 2.4,3.2,1177,9.2 1.9,1.8,1177,9.1 3,5.3,1177,9.1 2.2,2.6,1177,9.1 2,1.3,1177,9 2.5,2.4,1177,9 2.5,3,1177,9 2.6,3.7,1177,9 3.9,4.5,1177,8.4 4.9,13.5,1177,8.1 4.7,7.2,1177,9.9 6.8,8.2,1177,8.4 9.2,19.7,1177,9.3 7.3,10.4,1177,9.9 9.1,13.7,1177,9.2 5,6.1,1177,9.9 8.1,10.5,1177,9.9 5.5,11.3,1177,9 5.2,5.5,1177,9.9 5.5,6.5,1177,9.2 6.2,10.8,1177,9.2 6.7,9.4,1177,9.9 6.7,6.8,1177,9.2 6.2,7,1177,9.9 9.2,16.9,1177,9.2 5.1,6.9,1177,9.2 4.3,5.8,1177,9.2 7.1,10,1177,8.4 6.2,11,1177,9.2 6.7,9.7,1177,9.2 4.7,4.6,1177,9.9 3,4,1177,9.9 4.6,5.2,1177,9.9 1.9,2.3,1177,8.1 4,5.3,1177,9.9 7.5,11.5,1177,8.1 3.7,4.3,1177,9.1 2.3,3.1,1177,9.2 1.4,1.1,1177,9.2 3.4,4.6,1177,9.2 3.7,4.1,1177,9 1.8,1.7,1177,9 2.4,2.5,1177,9 3.3,5.1,1177,9.1 2,3.3,1177,8.4 2,1.6,1177,9 1.5,1,1177,9.1 5.9,10.8,1177,9.1 4.8,5.1,1177,9.9 1.4,0.2,1177,9 3.2,4.9,1177,9.2 2.3,3.4,1177,9.3 8.7,9.8,1177,8.7 7.1,13,1177,8.7 6.7,10.5,1177,9.2 6.7,8.3,1177,9.5 4.2,6.5,1177,8.9 7.5,10.9,1177,8.7 8.4,10.4,1177,8.9 6.3,14.8,1177,8.9 7.6,13.5,1177,8.7 4.1,6.7,1177,7.9 7.6,9.2,1177,9.5 6.9,9.9,1177,9.5 7.1,10.3,1177,8.9 8.5,10.3,1177,9.1 5.3,7.4,1177,9.3 7.6,11.5,1177,7.9 3.2,7,1177,9.5 7.2,8.9,1177,8.7 8.9,13.9,1177,9.5 7.1,10.3,1177,8.7 7,12.7,1177,8.7 7.5,14.7,1177,8.7 6.8,7.7,1177,9.5 9.1,14,1177,9.5 5.3,6.2,1177,9.2 4.9,5.7,1177,7.7 4.2,9.4,1177,7.7 6.9,11.4,1177,7.7 4.4,7.5,1177,7.9 4,5.7,1177,8.6 2.6,8.4,1177,7.7 5.1,9.5,1177,7.7 4.2,6.9,1177,7.8 7.7,12.5,1177,7.7 5.9,9.2,1177,7.8 6.9,10.8,1177,7.7 6.7,10.1,1177,8.6 3.3,5.6,1177,7.1 3.8,5.8,1177,6.9 3.8,5.6,1177,10.3 5.1,8,1180,10.7 5.2,6.8,1180,9.1 5.8,8.7,1180,9.1 5.3,6,1180,7.3 6,6.9,1180,7.3 5.8,7.4,1180,7.3 6.2,9.2,1180,9.1 6.5,6.7,1180,9.1 4.7,10.2,1180,10.7 5.2,7.5,1180,9.1 4.1,7.4,1180,9.1 5.3,7.2,1180,10.7 6.8,9.6,1180,7.3 10.7,19.1,1180,10.7 6,7.4,1180,9.1 6.3,10.8,1180,7.3 7.8,12.2,1180,9.1 5.5,8.7,1180,9.1 4.2,7.5,1180,8.1 3.8,5.1,1180,8.1 4.5,5.4,1180,8.1 4.2,5.4,1180,9.1 5.6,6.8,1180,10.7 4,3.1,1180,10.7 3.9,5.7,1180,11 4.2,6,1180,8.1 3.7,3.6,1180,10.7 1.9,1.6,1180,10.7 2.9,2,1180,8.1 3.5,3.7,1180,10.4 2.2,2.9,1180,10.4 1.7,1.3,1180,10.4 1.5,1.6,1180,10.4 1.6,1,1180,10.4 2.1,1.9,1180,10.4 2.1,2,1180,10.4 7.7,11.4,1180,10.7 4.9,8.9,1180,8.1 7,9.3,1180,10.4 6.7,7.1,1180,10.4 6.7,10.1,1180,10.7 6,6.7,1180,11.2 8.1,13.2,1180,8.1 2.8,6,1180,8.1 3.8,7.1,1180,8.1 7,13,1180,10.4 4.8,6.4,1180,8.1 6.3,7.6,1180,10.7 7.2,7.9,1180,10.7 10.7,25.8,1180,11.2 7.1,14.8,1180,10.7 10.1,15.3,1180,11.4 4.4,8.6,1180,11 3.2,2.5,1180,10.4 1.6,2.6,1180,10.7 4.8,4.9,1180,11.2 4.1,4.2,1180,10.7 2.4,2.8,1180,11 2,2.8,1180,8.1 1.5,1.1,1180,11 2.9,3.2,1180,8.1 3.9,4.1,1180,11.2 4.5,4.6,1180,11 4.6,5.2,1180,11 2.2,1.5,1180,8.1 5.1,6.4,1180,11 2.9,3.8,1180,8.1 4.8,4.8,1180,8.1 4,3.4,1180,8.1 5.2,4.6,1180,8.1 3.7,3.9,1180,10.7 2.8,2.5,1180,10.7 4.4,4.6,1180,10.7 6.3,6.8,1180,10.4 8.1,12.4,1180,8.1 2.9,3,1180,10.7 5.4,5.3,1180,11.2 3.3,2.7,1180,10.4 4.7,4.4,1180,10.7 6.5,8.5,1180,11.1 5.9,8.9,1180,11.1 7.9,10.7,1180,11.1 10.4,15.1,1180,10.4 8.1,12.9,1180,13.4 5.3,6.6,1180,13.4 5.7,8.2,1180,10.4 7.9,13,1180,11.1 5.6,6.9,1180,11.1 6.4,10,1180,10.7 6.3,10.2,1180,11.1 5.8,10.4,1180,11.1 9.3,15.5,1180,10.4 7.1,13.8,1180,11.1 6.9,9.4,1180,11.1 6.2,7.5,1180,11.1 6.1,10.4,1180,13.4 6.4,8.9,1180,11.1 7.9,11.6,1180,10.7 7.2,15,1180,11.1 5,5.6,1180,10.1 5.9,6.5,1180,11.1 4.9,5.1,1180,11.1 4.9,5.5,1180,11.1 4.5,5.4,1180,11.1 5.3,6.6,1180,12.5 6.6,10.2,1180,10 7.4,14.5,1180,12.5 6.3,9.3,1180,12.5 5.6,7.2,1180,12.5 10,16.8,1180,10 7.3,11.2,1180,12.5 8.3,16.8,1180,11.2 8.8,20.1,1180,12.5 5.9,6.4,1180,12.5 5.3,6.4,1180,12.5 10.3,16.9,1180,12.5 6,6.4,1180,10 5.5,8,1180,8.3 6.1,8.3,1180,12.5 6.3,8.6,1180,12.5 6.8,13.4,1180,10 6.7,10.1,1180,10.3 5.4,6.1,1180,12.5 6.5,8.1,1180,12.5 5.6,7.2,1180,12.5 4.7,5.3,1180,12.5 5.3,7,1180,12.5 5,6.1,1180,13.4 4.2,6,1180,10.3 5.1,5.7,1180,10.3 3.9,5.8,1180,8.3 5.7,5.9,1180,11.2 5,5.7,1180,11.2 5,7.1,1180,10 3.7,5.5,1180,10 4.7,6.5,1180,12.5 4.4,5.6,1180,10 6.3,7.1,1180,10 4.2,5.7,1180,12.5 5.1,5.6,1180,12.5 5.2,6.5,1180,12.5 4.9,5.4,1180,12.5 5,5.3,1180,12.5 2.8,4.7,840,14.2 13.8,30.4,840,14.2 14.2,18.9,840,14.2 9,12.9,840,10.8 4.4,5.8,840,15.3 6,7.6,840,15.3 4.8,6.2,840,15.3 15.3,15.7,840,15.3 9.8,15.3,840,12.7 7.6,9.8,840,12.7 7.7,9.7,840,15.3 12.5,15.5,840,12.5 6,8.4,840,13.2 2.8,3.7,840,14.5 2.7,3.3,840,12.7 3,4.4,840,12.7 1.3,0.6,840,12.7 2.6,2.3,840,14.7 1.4,0.3,840,14.7 3.4,3.6,840,14.7 1.8,1.4,840,12.7 1.4,0.9,840,13.8 3.6,3.6,840,13.8 4.3,3.9,840,15.3 2,1.8,840,12.7 15.2,27.2,840,16.1 4.6,9.3,840,15.2 4.2,5.6,840,16.1 9.5,12.2,840,14 6.8,6,840,17.5 9.8,12.8,840,16.1 9,10.9,840,17.5 5.4,6.8,840,17.6 14.5,18.7,840,15.2 6.7,8.6,840,16.1 7.1,5.4,840,17.5 5.6,8.8,840,16.1 13.5,15,840,16.1 13.7,16.6,840,16.1 10.6,10.7,840,17.6 12.9,13.4,840,13.7 5.1,6.1,840,14.5 3.8,6.5,820,16.31168444 16.31168444,23.6,820,16.31168444 19.9100783,30.8,820,19.9100783 17.31813412,27.8,820,17.31813412 16.60538022,28.6,820,16.60538022 5.3,8.3,820,13.1 1.5,0.6,820,17.71529983 10.7,11.9,820,19.02239125 1.4,0.9,820,16.2 2.1,1.5,820,16.2 2.1,1.8,820,16.2 2.5,2,820,17.70867505 2.4,2.1,820,18.82586711 1.5,0.6,820,16.2 2.4,1.9,820,19.02239125 2,1.4,820,19.02239125 1.6,0.6,820,19.02239125 1.7,0.7,820,19.02239125 7.2,9.9,820,14.7 14.7,17.3,820,14.7 16.2,27,820,16.31168444 17.20919086,34,820,17.20919086 1.4,0.4,820,16.2 8.1,8.8,840,13.2 8.1,8.5,840,13.2 12.5,15.9,840,13.2 11.1,17.8,840,13.6 5.9,6.5,840,13.11193153 9.2,11.5,840,13.6 2.2,4.5,840,13.2 2.9,3.2,840,13.2 2.5,2.8,840,13.2 5,5.9,840,13.2 12.1,15.3,840,13.2 10,13.5,840,13.2 1.9,1.1,840,13.2 2.6,2.6,840,13.2 2.6,3,840,13.2 1.6,0.5,840,13.2 1.7,0.6,840,13.2 1.7,0.6,840,13.2 1.5,0.4,840,13.2 5.5,7.9,840,13.6 14.6,21.5,840,14.6 13.4,14.6,840,13.4 6.8,9.1,840,12.5 2,6.8,840,13.4 9.3,9.6,840,13.4 5.5,6.6,840,14.6 11.6,17.9,840,12.5 8.4,10.8,840,12.5 3.6,3.8,840,12.5 4.5,5,840,12.5 11.1,12.4,840,16.7 13,13.3,840,15.6 13.7,20.8,840,15.3 3.6,4.4,840,15.3 2.5,3,840,16.7 8.7,16.3,840,13.2 12.4,13.1,840,12.4 14.1,18.6,840,16 1.8,3.8,840,15.7 3.8,3.6,840,16 6,5,840,13.2 13.4,21.5,840,15.7 5.8,5,840,14.1 6.3,7.9,963,13.2 8.7,7.7,963,11.1 13.2,18.6,963,13.2 11.1,14.4,963,11.1 8.7,22.3,963,11.9 12.6,16.1,963,13.2 12.5,17.1,963,14.1 14.1,24.3,963,14.1 12.7,15.2,963,13.2 1.8,2.3,963,14.8 14,28.5,963,14 13.4,18.5,963,14.8 13.9,17.4,963,14.6 13.9,21.8,963,14.1 10.2,12,963,14.6 10.5,19.9,963,14.6 12.8,15.2,963,14.1 14.6,23.6,963,16.7 12.5,17.8,963,14.6 13.6,19.9,963,14.6 5.1,7,963,12.1 14.6,23.9,963,14.6 12,18.6,963,14.6 12.9,15.2,963,14.6 16.7,33.4,963,16.7 1.6,0.5,963,14.6 12.9,21,963,15.9 15.9,37.9,963,15.9 4.1,6.4,964,15.3 2.1,1.7,964,15.7 2.4,2.4,964,15.7 3,3.5,964,15.7 2.6,3.5,964,15.3 3.5,4.4,964,4 5.9,9.2,964,16.4 1.9,2.4,964,15.3 13.1,19.3,964,15.3 15.3,28.2,964,15.3 15.8,29.2,964,15.8 15.7,27.9,964,15.7 12.3,24.5,964,15.8 5,6.9,964,15.7 12.5,20.2,964,15.8 12.2,17.4,964,15.8 11.3,21.2,964,12 1.5,2,964,15.8 2.6,2.5,964,15.7 2.1,2.5,964,15.1 2,1.5,964,15.1 3.1,3.9,964,15.1 2,1.7,964,15.8 5.3,6.1,964,15.8 1.6,1,964,15.8 3,4,964,15.8 1.5,1.3,964,15.8 3.2,3.5,964,15.8 2.3,3.3,964,15.7 2.7,3.3,964,15.7 2.3,2.8,964,15.7 2.9,4.2,964,12.3 1.5,0.6,964,15.7 1.7,1.9,964,15.8 3,3.8,964,15.8 16.4,29.4,964,16.4 7.8,7.4,964,15.7 14.2,17.8,964,16.4 15.1,27.1,964,15.7 9.6,9.8,964,14.1 13.4,18.4,964,14.2 14.1,20.2,964,14.1 12.6,19.2,964,15.7 14.9,28.3,964,16.4 4.7,4.6,964,15.1 3.2,3.6,964,16.4 3.3,4.6,964,14.2 3,3.8,964,13.1 2.3,2.7,964,11.3 4,4.5,964,14.2 1.6,1.1,964,11.3 2.4,2.9,964,11.3 10.2,10.7,964,11.3 13.1,18.2,964,13.4 2.7,3.5,964,11.3 2.8,2.9,964,16.4 1.6,1.5,964,14.2 9.9,11.4,964,16.4 3.3,3.9,964,11.3 11.3,18.9,964,11.3 3.1,3.6,964,11.3 16.1,23.1,971,16.1 14.7,20.6,971,16.1 17.10430479,32.2,971,17.10430479 11.8,12.1,971,14.7 10.5,12.5,971,16.1 11.8,20.9,971,17.10430479 3,3.8,971,14.7 3.1,2.5,971,17.10430479 1.7,0.9,971,17.10430479 3.3,3.1,971,17.10430479 1.5,0.3,971,17.10430479 13.4,18.9,971,14.6 14.7,18.4,971,14.7 13.3,16.7,971,14.7 13.5,27.2,971,14.7 6.1,6.6,971,14.6 17.2,29.7,971,17.2 14.6,28.2,971,14.6 12.6,27,971,17.2 2.7,3.8,971,17.2 2.1,2.9,971,17.2 3.2,5,971,14.7 4.5,6.8,971,17.2 1.8,1.1,971,17.2 14.6,16.7,971,14.6 14.1,19.9,971,14.4 14.4,19.1,971,16.9 7,7.7,971,14.6 16.9,33.3,971,16.9 8.9,22,971,16.9 6.3,8.5,971,12.1 3.2,3.4,971,16.9 4.4,5,971,17.4 12.1,20.3,971,12.1 11.3,22.4,971,12.1 5.2,5.8,971,13.3 13.3,18.8,971,13.3 5.7,6.3,971,16.9 9.5,11.4,978,15.3 6.1,8,978,15.3 8.7,9.2,978,15.3 6.1,7,978,15.3 7.9,11.5,978,15.3 6.9,7.8,978,10.6 7.4,8.1,978,8.7 7.1,7.8,978,13.1 6.6,13.5,978,13.1 7.1,7.5,978,15.9 8.2,16,978,15.9 8.8,8.3,978,12.6 10.6,5.2,978,15.9 10.5,17.1,978,15.9 8,8.4,978,15.9 6.4,5.4,978,12.6 5.2,6.8,978,10.6 3.8,5.4,978,10.6 6.2,7,978,8.7 6.5,6.4,978,15.3 6.1,5.8,978,15.3 5.7,5.1,978,15.3 7.7,11.5,978,7.9 6.5,8.5,978,11.5 13.1,24.4,978,13.7 7.8,9.9,978,7.9 5.5,8.7,978,7.8 9.1,15,978,13.7 6.7,13.1,978,15.6 6.6,8.4,978,7.9 4.1,5.2,978,6.7 4,6,978,6.7 3.7,5.7,978,10.4 4.1,5.1,978,13.1 4.3,5.4,978,10.4 5,5.4,978,6.7 5.7,7.1,978,6.7 5.8,7.5,978,7.8 4.5,5.5,978,7.9 5.3,5.1,978,7.9 5.3,5.7,978,11.5 5,5.2,978,11.5 5.6,7.6,978,11.5 5.3,6.5,978,11.5 6.1,6.8,978,7.8 6.5,7,978,7.8 5.7,9.6,978,11.5 4.1,4.1,978,13.7 2.5,2.4,978,14.9 1.4,1.9,978,14.9 1.8,1.1,978,14.9 1.5,0.8,978,14.9 1.8,1,978,14.9 1.7,0.7,978,14.9 3.1,5.2,978,17 2.6,2.9,978,13.7 4.1,4.4,978,13.7 1.4,0.6,978,17 1.8,1.2,978,17 1.5,0.8,978,17 3.7,4.5,978,14.9 10.7,17.7,978,14.9 13.7,18,978,13.7 10.5,20.1,978,17 8.1,10.7,978,14.9 2.8,5.6,978,14.9 6.8,10.7,978,17 1.7,0.8,978,13.7 2.4,1.9,978,13.7 2.1,1.4,978,13.7 1.5,0.5,978,17 2,1.5,978,14.9 1.9,1,978,14.9 1.7,0.8,978,14.9 7.7,12.1,978,15 14.2,21,978,14.2 10.4,16.6,978,14.6 10.8,13.2,978,14.6 6.4,9.3,978,17 8.6,13.3,978,14.2 11,17.4,978,11 14.6,21,978,14.6 5,6.1,978,14.6 10,10.5,978,17 5.2,6.2,978,17 9.4,24.8,977,13.5 9.4,14.1,977,9.4 3,7.5,977,9.4 6,10.4,977,9.4 6,8.9,977,13.5 11.5,23,977,11.5 5.6,8.3,977,13.5 4,5.2,977,13.5 10.8,16.6,977,12.3 7.8,11,977,11.5 5.3,8.1,977,8.9 7,10.8,977,10.8 8.7,12.9,977,11.8 6.6,10.9,977,11.8 7.4,12,977,12.9 5.4,7.9,977,10.9 6,8.8,977,10.8 4.4,5.3,977,11.3 5.9,6.7,977,18.1 6.3,9.6,977,18.1 11,16.9,977,18.1 4.5,5.1,977,18.1 4.6,5.5,977,18.1 5.4,7.6,977,18.1 5.2,5.5,977,18.1 4.7,5,977,18.1 6.8,11,977,12.9 6.7,5.8,977,18.1 5.3,6.2,977,18.1 6.6,8.1,977,11 5.8,6.5,977,18.1 5.2,5.7,977,18.1 12.2,18.7,977,12.2 13.8,22.3,977,18.4 9.3,13.8,977,12.2 7,8.9,977,18.4 12.5,15.2,977,18.4 3.4,5.7,977,12.7 1.3,0.2,977,18.4 1.4,0.5,977,18.4 1.7,0.7,977,18.4 1.5,0.4,977,18.4 1.8,0.6,977,18.4 1.8,1.6,977,18.4 2,0.7,977,18.4 1.6,0.4,977,18.4 1.5,0.4,977,18.4 1.4,0.4,977,18.4 1.4,0.3,977,18.4 1.6,0.5,977,18.4 1.4,0.3,977,18.4 1.8,0.7,977,18.4 1.4,0.4,977,18.4 1.4,0.3,977,12.2 1.6,0.5,977,12.2 1.5,0.4,977,12.2 1.5,0.4,977,12.2 2.1,1.3,977,12.2 1.6,0.4,977,12.2 1.4,0.3,977,18.4 1.5,0.7,977,18.4 1.4,0.3,977,18.4 2,0.9,977,18.4 2,0.8,977,18.4 1.5,0.4,977,18.4 1.5,0.5,977,18.4 1.7,0.5,977,12.2 1.5,0.5,977,18.4 2,1,977,12.3 2.1,0.8,977,12.3 1.4,0.5,977,12.3 1.4,0.5,977,12.3 1.4,0.2,977,12.3 2.6,1.7,977,12.3 1.4,0.3,977,12.2 2.3,1.2,977,18.4 2,1,977,12.3 2.1,1.1,977,12.3 1.6,0.7,977,12.2 2,0.8,977,12.2 1.6,0.4,977,12.2 1.8,0.5,977,12.2 1.4,0.3,977,12.2 1.5,0.5,977,18.4 1.4,0.3,977,18.4 1.8,0.5,977,18.4 1.5,0.5,977,18.4 1.5,0.6,977,18.4 11.6,19,971,12.5 9.9,17.4,971,12.5 3.1,4,971,4.5 3.1,3,971,4.5 3.9,5.8,971,5.2 1.7,0.8,971,3.9 2.1,1.6,971,3.9 2.1,1.4,971,3.9 2,1.5,971,3.9 2.1,1.6,971,3.9 1.8,0.7,971,3.9 1.5,0.8,971,3.9 2,1.4,971,3.9 2.2,1.8,971,3.9 2,1.2,971,3.9 2.6,1.6,971,3.9 2.9,3.2,971,3.9 1.5,0.6,971,3.9 2.1,1.6,971,3.9 1.8,1.4,971,3.9 1.6,0.7,971,3.9 1.8,0.9,971,3.9 1.5,0.7,971,3.9 1.4,0.5,971,3.9 1.5,0.6,971,12.7 2,1.5,971,12.7 1.6,0.6,971,12.7 1.8,1.1,971,4.2 2.9,2.5,971,4.2 2.2,2,971,4.2 2.3,1.7,971,4.2 1.4,0.7,971,4.2 1.4,0.5,971,4.2 2,1.1,971,3.9 1.4,0.3,971,4.3 3,2.8,971,5.2 2.3,2,971,3.9 1.8,1.2,971,4.2 1.4,0.5,971,4.2 2.5,2.1,971,3.9 2.3,1.9,971,4.2 2,1.4,971,4.2 2.4,2,971,3.9 1.4,0.4,971,5.2 1.5,0.6,971,5.2 2.3,1.9,971,4.2 1.9,0.4,971,3.9 1.4,0.4,971,3.9 1.5,0.6,971,4.2 1.4,0.4,971,3.9 1.4,0.7,971,12.1 2,0.9,971,12.1 2.6,2.8,971,12.1 1.9,1.6,971,12.7 1.7,0.8,971,12.7 1.9,0.9,971,12.7 1.9,0.6,971,12.1 1.7,1.1,971,12.1 2.2,1.5,971,12.1 2,1.4,971,12.1 2.4,2,971,12.7 1.5,0.7,971,12.7 1.7,1,971,12.7 1.5,0.4,971,12.7 1.5,0.6,971,12.1 1.5,0.8,971,12.5 2.1,1.6,971,12.5 1.7,0.8,971,12.7 1.4,0.6,971,12.7 1.4,0.5,971,12.5 1.9,0.7,971,12.1 1.6,0.5,971,12.1 1.7,0.8,971,12.1 2,1,971,10.7 1.4,0.7,971,10.7 1.7,0.6,971,10.7 1.5,0.8,971,10.7 2,1.7,971,10.7 2.4,1.7,971,10.7 1.4,0.3,971,10.7 1.5,0.5,971,4.3 2,1.2,971,4.5 2.8,2,971,4.5 2.3,1.4,971,5.2 2.7,1.5,971,4.5 2.3,1.3,971,4.3 1.6,0.8,971,4.3 1.8,0.9,971,4.5 2.7,2.2,971,4.5 3.3,3.2,971,4.5 1.4,0.4,971,4.3 2,1.2,971,4.3 3,3.3,971,4.3 1.4,0.4,971,10.7 1.4,0.4,971,10.7 1.9,1.3,971,4.3 1.6,0.9,971,4.3 2.5,2.3,971,4.3 2,1.3,971,4.3 2.8,2.3,971,4.3 1.7,1,971,4.3 1.4,0.6,971,4.3 1.7,0.5,971,5.2 3.5,3.7,971,4.5 1.6,0.4,971,4.5 1.4,0.3,971,4.3 2.4,2,971,4.5 2.2,1.4,971,4.5 3,2.4,971,4.5 1.5,0.4,971,4.5 2,1.4,971,4.3 3.2,3.6,971,4.3 1.9,0.9,971,4.3 1.8,0.7,971,4.3 1.5,0.5,971,4.3 2.2,1.6,971,4.5 3,3.1,971,4.5 3.9,3.1,971,4.3 1.8,1,971,4.5 3,3.2,971,4.5 2.2,1.8,971,4.5 1.5,0.4,971,4.3 10.5,13.5,971,14.6 7,11.7,971,12.8 3.6,5.7,971,7 4.2,5,971,5.2 4.9,5.9,971,12.8 4.9,5.2,971,14.6 5,5.4,971,14.6 5.5,6.2,971,14.6 13.7,16.9,971,14.5 11.1,17.9,971,13.4 12.5,14.5,971,14.5 14.5,24.1,971,14.5 13,29.5,971,14.5 13.2,20,971,14.5 14.5,23.2,971,14.5 12.4,16,971,14.5 13.4,17.5,971,13.4 12.5,13.9,971,13.4 12.5,13,971,13.4 10.7,10.8,971,13.5 12.9,16.2,971,14.5 12.9,15.3,971,13.5 12.1,13.9,971,13.5 12.5,13.7,971,13.5 10.7,11,971,12.9 3,2.9,1115,9.7 2.2,2.2,1115,9.7 3.3,4.4,1115,9.7 2.8,4.3,1115,9.6 1.6,1.1,1115,9.7 2.4,2.7,1115,9.6 2,1.7,1115,9.6 1.8,1.6,1115,9.6 1.6,0.8,1115,9.5 1.7,1.2,1115,10.1 3.5,4.3,1115,9.6 2.5,2.8,1115,9.6 1.7,1.2,1115,9.6 3.6,4.3,1115,9.7 3.3,3.6,1115,9.6 1.8,1.2,1115,9.7 6.9,8.9,1115,10.1 9.5,14.6,1115,9.9 9.6,14.7,1115,10.1 7.7,10.9,1115,9.9 9.2,12.4,1115,9.5 9.6,12.8,1115,9.6 7.9,11.5,1115,9.7 7.5,9.5,1115,9.6 9.6,14.1,1115,9.7 6.6,12.5,1115,9.7 7.9,10.9,1115,9.6 6.3,5.7,1115,9.6 9.2,22.3,1115,9.7 9.7,17,1115,9.7 8.9,16.5,1115,10.1 8.8,11.2,1115,9.7 8,14.5,1115,9.5 2.3,1.7,1115,10.1 1.6,1.3,1115,9.9 1.8,4.4,1115,9.5 2.8,4.3,1115,9.9 1.6,0.8,1115,9.5 1.6,0.7,1115,9.7 6.9,8,1115,8.3 6.2,6.4,1115,8.1 6.2,6.5,1115,8.3 8.1,12.7,1115,8.1 7.7,11,1115,8.1 6.1,6.8,1115,8.1 8.3,8.9,1115,9.2 4.9,8,1115,8.8 8.1,10.1,1115,8.1 8.8,15,1115,8.8 8,12.1,1115,8.1 7.3,17.6,1115,8.1 7.1,10.1,1115,8.8 6.8,7.7,1115,8.8 4.9,6.4,1115,10.1 6.5,7.7,1115,8.1 7.6,7.8,1115,10.4 7.4,8.9,1115,10.4 6.8,8.9,1115,10.4 5.4,5.8,1115,10.1 4.7,7,1115,8.1 10.1,15.8,1115,10.1 4.8,6.7,1115,10.1 9.6,15.7,1115,10.4 10.4,16.2,1115,10.4 8,10.3,1115,10.1 6.9,9.4,1115,10.4 5.8,6.1,1115,10.1 7.9,15.1,1115,10.4 9.5,17.5,1115,10.1 5.7,7.2,1115,10.4 7.4,7.9,1115,10.4 5.2,10.5,1115,10.4 8.2,13.5,1115,10.4 6.6,10.8,1115,8.9 7.5,11.2,1115,8.9 8.2,12.2,1115,10.5 7.4,6.2,1115,10.5 7.6,12.3,1115,10.5 3,5.9,1115,10.5 10.5,20.9,1115,10.5 9.7,16.7,1115,10.5 7.7,9.1,1115,10.5 11.1,25.8,1115,11.1 9.1,15.6,1115,9.1 8.7,12.4,1115,9.1 9,13,1115,11.1 9,11.3,1115,9.5 8.9,8.6,1115,9.5 7,7.8,1115,11.1 8.9,20.2,1115,10.5 2.8,5.4,1115,11.1 6.5,7.4,1115,9.9 9.9,23.6,1115,10.5 9,13.7,1115,9.9 3.9,9.1,1162,11.3 8.9,15.4,1162,9.8 6.6,9.5,1162,13.2 6.5,14.5,1162,13.3 4.7,7.4,1162,13.3 3.9,5.7,1162,13.2 3,6.3,1162,13.2 3.7,8.9,1162,13.2 6.5,10.1,1162,13.2 9.8,20,1162,13.2 13.4,20.3,1162,13.4 6.5,10.3,1162,13.2 5.3,7.7,1162,13.2 4.9,5.5,1162,13.4 3.8,5.9,1162,13.2 9.1,14.7,1162,10.2 5.3,10.7,1162,10.4 4.5,7.8,1162,10.2 11,21.4,1162,11 7.3,10.3,1162,11.9 5.4,7.4,1162,13.3 6.1,8.6,1162,11.9 5,6.6,1162,11.9 11.9,17.8,1162,13.3 3.5,6.7,1162,11.9 13.3,21.7,1162,13.3 3.7,6.5,1162,11.3 4.6,6.1,1162,11.3 4,5.7,1162,10.2 3.8,5.3,1162,11 2.8,5.5,1162,13.3 5.3,5.7,1162,13.3 12.4,19,1162,13.3 5.9,8.5,1162,13.3 10.4,12.8,1162,11.9 11.5,15.9,1162,12.4 6.4,8.9,1162,12.4 5.5,6.3,1162,12.4 5.2,8.1,1162,11.5 6.2,8.4,1162,11.5 7.3,10,1162,8.7 6.9,11.2,1162,9.7 6.6,8.3,1162,9.7 7.5,11.5,1162,8.7 7.7,9.9,1162,8.7 7.9,12.4,1162,13.2 7.8,10.3,1162,13.2 8.7,12,1162,13.2 5.7,5.6,1162,13.3 4,5.4,1162,12.4 2.7,4.8,1162,13.4 2.7,2.6,1162,13.4 1.8,1.1,1162,12.8 1.8,1.8,1162,10.2 2.1,2.8,1162,10.2 1.9,2.3,1162,13.6 5,6.1,1162,13.4 2.3,2.4,1162,13.4 2,1.8,1162,13.4 3.1,2.9,1162,13.4 3.3,3.2,1162,13.4 3.7,5.7,1162,13.4 1.4,0.3,1162,13.4 12.8,24,1162,12.8 10.2,16.4,1162,13.4 6.6,10.9,1162,13.4 6.8,10.9,1162,13.3 4.6,6.5,1162,13.4 4,6.8,1162,13.4 4.4,6,1162,13.4 4,6.1,1162,10.2 1.6,0.7,1162,13.4 1.5,0.4,1162,13.4 1.5,0.6,1162,12.8 1.5,1.5,1162,12.8 1.8,1.4,1162,12.4 1.5,1.1,1162,13.6 2.7,2.8,1162,13.6 2.8,3.4,1162,13.6 2.1,1.8,1162,13.6 1.4,0.4,1162,13.6 5.4,10.1,1162,12.4 3.2,4.6,1162,12.8 2.8,4.7,1162,12.8 1.4,1.2,1162,12.8 1.7,1.5,1162,12.8 1.5,1.2,1162,12.8 1.9,1.4,1162,12.8 2.2,2.8,1162,11.4 2.3,2.9,1162,12.8 2.3,2.6,1162,12.8 1.9,1.8,1162,12.8 2,1.4,1162,12.4 1.8,1.3,1162,12.4 2.2,1.8,1162,12.4 1.6,2.2,1162,13.6 1.8,1.4,1162,13.6 4.4,4.9,1162,12.4 3.7,3.8,1162,12.4 2.1,1.6,1162,12.4 2.7,4.7,1162,12.4 2.9,3,1162,12.8 2,2.2,1162,13.6 2.6,3.4,1162,12.8 1.6,1.7,1162,12.8 2.5,3.6,1162,12.4 3,3.5,1162,13.6 2,2,1162,13.6 3.1,4,1162,12.4 1.5,0.8,1162,12.8 3.3,4.6,1162,13.6 2.3,2.3,1162,13.6 1.9,1.4,1162,13.6 2,1.9,1162,12.4 1.7,1.4,1162,13.6 2.4,2.8,1162,12.8 2.3,3.4,1162,13.6 1.6,1.4,1162,12.8 12.8,23,1162,12.8 8.5,12.6,1162,13.6 12.4,17.5,1162,13.6 11.4,22.5,1162,12.8 1.5,0.5,1162,13.6 1.4,0.5,1162,13.6 2.1,1.7,1162,13.6 7.2,13.1,1162,11.7 4,6.7,1162,16.1 5,8.1,1162,16.1 16.1,22.4,1162,16.1 10.3,14.9,1162,16.1 7.2,12,1162,12.3 7.8,9.7,1162,12.3 6.4,9.4,1162,12.3 4.9,7.8,1162,12.3 4,14.3,1162,9.5 6,9,1162,12.3 8.5,7,1162,12.3 4.3,5.9,1162,12.3 6.7,10,1162,12.3 4.8,5.2,1162,16.1 5.8,6.4,1162,12.3 4.5,5.5,1162,12.3 5.1,7,1162,16.1 4.6,9.3,1162,11.4 7.5,10.9,1162,11.4 5.4,8.1,1162,11.4 8.2,17.8,1162,11.4 5.1,7.2,1162,9.5 8.3,13.5,1162,11.4 9.5,13.8,1162,11.4 7.9,9.8,1162,8.3 4.9,5,1162,9.5 6.2,7.9,1162,11.4 5.4,6.4,1162,14.4 5.7,6.4,1162,9.5 4,5.5,1162,11.4 4.7,5.6,1162,14.4 6.2,6.8,1162,11.4 5.1,5.5,1162,11.4 4.5,8,1162,11.4 4.2,5.3,1162,11.4 6.7,10.3,1162,14.4 3.8,5.3,1162,11.4 4,5.8,1162,11.4 4.6,5.9,1162,11.4 13.6,20.4,1162,13.6 11,12.8,1162,13.6 12.7,14.8,1162,13.6 8.2,13.7,1162,13.6 3.1,5.5,1162,9.5 4.8,5.9,1162,11.2 3.8,6,1162,13.6 4.6,7,1162,11.2 \ No newline at end of file diff --git a/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/.gitignore b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/.gitignore new file mode 100755 index 0000000..7967499 --- /dev/null +++ b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/.gitignore @@ -0,0 +1,52 @@ +ory files +.Rhistory +.Rapp.history + +# Session Data files +.RData + +# User-specific files +.Ruserdata + +# Example code in package build process +*-Ex.R + +# Output files from R CMD build +/*.tar.gz + +# Output files from R CMD check +/*.Rcheck/ + +# RStudio files +.Rproj.user/ + +# produced vignettes +vignettes/*.html +vignettes/*.pdf + +# OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3 +.httr-oauth + +# knitr and R markdown default cache directories +*_cache/ +/cache/ + +# Temporary files created by R Markdown +*.utf8.md +*.knit.md + +# R Environment Variables +.Renviron + +# README +README.html + +# html and pdf in docs +docs/*.html +docs/*.pdf +docs/*.nb.html + +# OS-specific files +.DS_Store + +test/** diff --git a/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/B05Ia_x.Rproj b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/B05Ia_x.Rproj new file mode 100755 index 0000000..00ee036 --- /dev/null +++ b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/B05Ia_x.Rproj @@ -0,0 +1,15 @@ +Version: 1.0 + +RestoreWorkspace: Default +SaveWorkspace: Default +AlwaysSaveHistory: Default + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 2 +Encoding: UTF-8 + +RnwWeave: knitr +LaTeX: XeLaTeX + +AutoAppendNewline: Yes diff --git a/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/R/dataset.R b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/R/dataset.R new file mode 100755 index 0000000..c776587 --- /dev/null +++ b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/R/dataset.R @@ -0,0 +1,34 @@ +# Importation des données +# Date : 2022-11-29 + +# Importation des packages +SciViews::R() + +# Données importées depuis ZENODO +url <- "https://zenodo.org/record/4943286/files/Abies_bals_allom_data_Peart.csv?download=1" + +# Importation des données +abies <- read$csv(url, cache_file = "data/raw/ab.csv") + +# Renommer les variables +abies <- janitor::clean_names(abies) + +# Ajout des labels et des unités +abies <- labelise(abies, + label = list( + height = "Hauteur", + diameter = 'Diamètre à 1.37m du sol', + elevation = "Altitude", + canopyheight = "Hauteur du plus grand arbre proche" + ), + units = list( + height = "m", + diameter = "cm", + elevation = "m", + canopyheight = "m" + )) + +# Sauvegarde des données localement +write$rds(abies, "data/abies.rds", compress = "xz") + +rm(abies, url) diff --git a/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/README.Rmd b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/README.Rmd new file mode 100755 index 0000000..99c4de5 --- /dev/null +++ b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/README.Rmd @@ -0,0 +1,28 @@ +--- +title: "Croissance du sapin *Abies balsamea* (L.) Mill., 1768 au mont Moosilauke" +output: github_document +lang: "fr" +bibliography: "docs/bibliography.bib" +--- + + + +## Présentation des données + +@wood_2015 ont étudié la croissance de *Abies balsamea*. Ils étudient la hauteur des arbres en fonction du diamètre du tronc à 1.37m, des arbres les plus proches dans un carré de 6m\*6m et de l'altitude. Les données associées à cette étude sont disponible via [DRYAD](https://datadryad.org/) [@wood_data_2016]. + +## Objectif + +Ce projet est un projet individuel et cadré. Il permet de montrer que vous êtes capable d'utiliser la fonction `nls()` pour ajuster correctement un modèle non linéaire dans un jeu de données. + +## Consignes + +Modélisez la hauteur de *Abies balsamea* en fonction de son diamètre. Complétez le document `abies.Rmd` présent dans le dossier `docs/`. + +Lorsque vous aurez terminé de compléter le fichier, compilez ce dernier en HTML (bouton **Knit**) et assurez-vous que la compilation s'est faites sans erreurs, sinon, apportez les corrections nécessaires. Dans votre commit - push final, assurez-vous d'avoir un fichiers `.Rmd` qui compile correctement. Cela fait partie de l'exercice. Vérifiez que votre dernier commit a bien été pushé sur GitHub avant la fin de la séance. + +Faites attention à bien citer vos sources. Le plagiat est, comme toujours, bien évidemment interdit. Si vous avez été aidé par quelqu'un (un ou une autre étudiant•e ou enseignant•e) pour l'une ou l'autre partie de votre projet, vous devez le ou la citer. + +Ce projet correspond au template + +## Bibliographie diff --git a/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/README.md b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/README.md new file mode 100755 index 0000000..ce71020 --- /dev/null +++ b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/README.md @@ -0,0 +1,61 @@ +Croissance du sapin *Abies balsamea* (L.) Mill., 1768 au mont Moosilauke +================ + + + +## Présentation des données + +Wood et al. (2015) ont étudié la croissance de *Abies balsamea*. Ils +étudient la hauteur des arbres en fonction du diamètre du tronc à 1.37m, +des arbres les plus proches dans un carré de 6m\*6m et de l’altitude. +Les données associées à cette étude sont disponible via +[DRYAD](https://datadryad.org/) (Wood et al. 2016). + +## Objectif + +Ce projet est un projet individuel et cadré. Il permet de montrer que +vous êtes capable d’utiliser la fonction `nls()` pour ajuster correctement +un modèle non linéaire dans un jeu de données. + +## Consignes + +Modélisez la hauteur de *Abies balsamea* en fonction de son diamètre. +Complétez le document `abies.Rmd` présent dans le dossier `docs/`. + +Lorsque vous aurez terminé de compléter le fichier, compilez ce dernier +en HTML (bouton **Knit**) et assurez-vous que la compilation s’est +faites sans erreurs, sinon, apportez les corrections nécessaires. Dans +votre commit - push final, assurez-vous d’avoir un fichiers `.Rmd` qui +compile correctement. Cela fait partie de l’exercice. Vérifiez que votre +dernier commit a bien été pushé sur GitHub avant la fin de la séance. + +Faites attention à bien citer vos sources. Le plagiat est, comme +toujours, bien évidemment interdit. Si vous avez été aidé par quelqu’un +(un ou une autre étudiant•e ou enseignant•e) pour l’une ou l’autre +partie de votre projet, vous devez le ou la citer. + +Ce projet correspond au template + + +## Bibliographie + +
+ +
+ +Wood, Zachary T., David R. Peart, Peter A. Palmiotto, Lixi Kong, et Noah +V. Peart. 2015. « Asymptotic allometry and transition to the canopy in +Abies balsamea ». *Journal of Ecology* 103 (6): 1658‑66. +https://doi.org/. + +
+ +
+ +———. 2016. « Data from: Asymptotic allometry and transition to the +canopy in Abies balsamea ». Zenodo. +. + +
+ +
diff --git a/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/data/abies.rds b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/data/abies.rds new file mode 100755 index 0000000..a0e88e0 Binary files /dev/null and b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/data/abies.rds differ diff --git a/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/data/raw/ab.csv b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/data/raw/ab.csv new file mode 100755 index 0000000..cd0a551 --- /dev/null +++ b/inst/shiny/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/data/raw/ab.csv @@ -0,0 +1 @@ +HEIGHT,DIAMETER,ELEVATION,CANOPYHEIGHT 9.434452806,24,808,9.434452806 6.1,14.4,808,11.76730981 1.9,1.2,808,15.53032406 1.4,0.5,808,6.8 1.7,0.5,808,7.4 1.9,1,808,13.9 1.8,1.5,808,11.76730981 1.4,0.5,808,11.76730981 1.5,0.5,808,9.434452806 1.5,0.5,808,15.62653365 2.7,2.9,808,15.62653365 1.7,1,808,15.62653365 2.3,4.3,808,15.62653365 2.5,3.3,808,13.970052 13.28221264,28.3,808,20.4277355 10.09529675,15.1,808,20.4277355 1.5,0.5,808,15.62653365 4.4,4.4,808,15.6 4.4,6.5,808,15.6 6,9.6,808,15.6 17,31.2,808,17 15.55203149,24.3,808,20.4277355 1.5,0.5,808,17 7.1,11,808,8.8 4.4,4.9,808,12.3 1.7,0.5,808,12.3 1.8,1.3,808,12.3 2,1.2,808,12.3 10.7,12,840,15.85591307 10.2,12.9,840,15.85591307 8.3,9.5,840,15.85591307 8.3,14.5,840,15.85591307 8.1,11.1,840,15.85591307 3.1,3.5,840,15.85591307 2,2.3,840,17.09374389 3.1,4,840,17.09374389 3,3.4,840,17.09374389 1.5,0.5,840,17.09374389 1.9,1.8,840,19.63009369 2.4,3,840,19.63009369 3.5,4.4,840,19.63009369 2.8,3.4,840,19.63009369 1.5,0.5,840,19.63009369 1.7,1.4,840,17.09374389 2.8,3,840,14.2027458 1.3,1.9,840,17.09374389 3.3,5.1,840,14.2027458 3,3.3,840,14.2027458 1.5,0.5,840,19.63009369 2,1.7,840,17.09374389 3.4,3.9,840,19.63009369 4.1,5.8,840,14.2027458 2.9,3.6,840,17.09374389 3.1,4,840,17.09374389 7.5,12.7,840,13.35732473 8.6,10,840,13.35732473 5.4,9.5,840,15.80133404 3.3,3.6,840,15.5 4.2,4.7,840,17.07748162 5.4,6.8,840,13.6 2,2.7,840,17.07748162 5.5,7.7,840,13.53250579 2.2,2,840,17.07748162 4.2,6.2,840,13.6 6.5,7.6,840,13.53250579 5.7,7.4,840,17.07748162 2.2,1.7,840,17.07748162 4.9,6,840,15.5 3.8,4.8,840,15.80133404 6.9,7.5,840,13.7 6.3,8,840,18.06543231 7.4,9.2,840,11.5 13.7,23.1,840,13.7 8.8,31.6,840,13.6 7.6,9.4,840,18.06543231 3.3,4.8,840,13.7 4.5,3.9,840,18.06543231 2.7,2.2,840,18.06543231 2.9,3,840,13.7 5,6,840,18.06543231 4.2,3.6,840,18.06543231 1.9,1.5,840,18.06543231 2,2.3,840,18.06543231 2.2,2.8,840,13.7 3.7,4.3,840,18.06543231 1.5,1,840,18.06543231 2.5,2,840,18.06543231 4.7,5.2,840,18.06543231 2.8,2.8,840,13.7 5.2,6.3,840,13.7 3.9,4.5,840,18.06543231 5.4,6.1,840,13.6 3.9,5.4,840,18.06543231 13.3,19.7,840,17.09374389 5.2,8.2,840,15.78342419 11.6,18.5,840,17.09374389 6.2,7.8,840,15.78342419 6.7,7.2,840,15.78342419 8.4,9.3,840,15.78342419 1.9,3.2,840,15.78342419 4.5,5.6,840,15.78342419 5.5,7.1,840,15.78342419 1.5,0.5,840,15.78342419 5.7,7.7,840,17.09374389 3.1,3.6,840,17.09374389 2.1,1.8,840,19.63009369 3.1,3.9,840,15.78342419 3.3,3.4,840,15.78342419 1.9,3.4,840,15.78342419 1.8,1,840,19.63009369 4.6,6.5,840,15.78342419 5.1,6.9,840,15.78342419 5.6,7.2,840,15.78342419 4.9,8.1,840,15.78342419 2.7,2.7,815,13.5 13.6,20.6,815,13.6 13.5,34.9,815,13.5 8.6,13.5,815,13.5 1.2,0.5,815,13.5 1.6,1,815,13.5 1.3,0.5,815,13.5 1.2,0.5,815,13.5 8.1,15.8,815,13.3 1.8,1.5,815,13.6 1.5,0.5,815,13.6 1.7,0.5,815,6.8 13.7,20.9,815,21.13632107 5.1,8.8,815,21.13632107 1.6,1,815,21.13632107 2.9,3.5,815,12 3.4,4.9,815,12 3.3,5,815,12 5,6.7,815,11.2 5.4,8.1,815,11.2 1.5,0.5,815,7.5 2,2.6,815,11.2 1.8,0.5,815,12 6,10.4,815,6 8.1,6.7,1017,12 6.1,7.8,1017,12 10.9,16.3,1017,13.6 7.9,9.6,1017,13.6 7.2,17.2,1017,13.6 7.3,10.2,1017,13.6 9.1,16,1017,11.2 5.6,9.9,1017,13.6 2.8,3.8,1017,13.6 3.1,3,1017,11.2 2,1.4,1017,13.6 2.2,2.8,1017,13.6 1.7,0.9,1017,11.3 1.7,1.9,1017,13.6 2.1,2.1,1017,11.3 2.8,3.2,1017,11.3 1.6,0.6,1017,11.3 1.9,1.6,1017,12 1.8,1.8,1017,11.2 2.5,2.1,1017,11.2 2.5,3.4,1017,13.6 1.8,2,1017,11.2 2.8,3.2,1017,11.2 1.4,0.2,1017,11.2 2.6,3.2,1017,11.2 2.7,2.8,1017,11.2 2.4,2.8,1017,12.1 2.5,3,1017,12.1 2.1,2.2,1017,11.2 1.5,0.4,1017,12 6.7,8.1,1017,13.4 6.1,8.8,1017,13.4 8.5,12.5,1017,13.5 5.4,7.3,1017,13.4 4.8,7.7,1017,13.4 10.5,18.4,1017,12.1 5.3,7.5,1017,14.9 7.5,12,1017,13.4 1.6,0.5,1017,13.4 1.5,0.6,1017,14.9 2,1.9,1017,11.8 1.7,0.7,1017,14.9 2.7,2.7,1017,13.5 1.5,0.3,1017,14.9 2.7,2.4,1017,14.9 2.6,1.8,1017,14.9 2.8,3,1017,13.4 1.9,1.1,1017,14.9 1.4,0.5,1017,13.5 3.2,6,1017,13.5 1.5,0.4,1017,14.9 6.2,5,1017,13.4 1.7,0.9,1017,12.1 2.6,1.5,1017,14.9 1.4,0.2,1017,13.5 9.6,14.6,1017,13.8 14.1,18.6,1017,14.1 2.7,2,1017,12.1 4.4,5.1,1017,10.1 2.7,2.5,1017,12.1 3,5.3,1017,12.1 2.7,2.7,1017,10.5 2,1.4,1017,14.9 1.7,1.1,1017,14.9 2.8,2.7,1017,14.9 2.4,1.7,1017,14.9 3.5,3.8,1017,14.9 2.7,1.2,1017,14.9 1.7,0.9,1017,14.9 2.1,1.8,1017,14.9 3.1,3.3,1017,14.9 2.4,3.3,1017,14.9 1.8,1.4,1017,10.5 3.1,2.6,1017,14.9 2,1.4,1017,10.5 1.7,1.2,1017,14.9 2.7,2.6,1017,14.9 2.2,2.1,1017,14.9 2.8,0.8,1017,10.5 2,1.5,1017,10.5 1.5,0.9,1017,10.5 2.3,1.4,1017,14.9 1.4,0.4,1017,10.5 7.7,13.8,1017,13.5 7.7,13,1017,13.5 9.2,12.7,1017,13.6 4.8,10.1,1017,13.8 2.7,2.1,1017,13.6 3.5,4,1017,13.6 2.2,1.2,1017,12.7 1.5,0.4,1017,12.7 3.5,6,1017,10.6 2.7,2.4,1017,9.2 2.1,1.4,1017,10.6 2.4,1.8,1017,9.2 3.8,3.9,1017,9.2 1.6,0.7,1017,9.2 2,1.4,1017,9.2 1.3,0.3,1017,11.7 2.1,1.6,1017,9.6 4.5,5.9,1017,11.7 4.3,5.3,1017,9.6 1.2,0.5,1017,9.2 2,1.1,1017,12.7 1.5,0.5,1017,13.6 1.5,0.4,1017,13.6 16.1305285,35.6,990,16.1305285 13.7,20.1,990,17.66244256 7.2,7,990,17.66244256 5.1,6.5,990,16.1305285 4.9,5.6,990,16.1305285 7.4,9.6,990,17.66244256 7.2,7.1,990,17.66244256 11.1,15.8,990,15.90672889 3.8,5.9,990,15.7 2.9,2.7,990,15.7 1.2,0.5,990,15.7 2,1.5,990,15.90672889 4.8,6.3,990,16.1305285 4.8,6.3,990,17.66244256 5,6.5,990,17.66244256 7.1,10.7,990,14.3 13.4,15.5,990,15.2 15.7,16.6,990,16.1305285 7.8,11.9,990,15.2 9.5,14,990,13.4 9.5,13.6,990,13.3 14.5,12.6,990,16.1305285 10.6,16,990,20.00100157 15.2,18.9,990,15.7 1.4,0.4,990,20.00100157 1.5,0.8,990,20.00100157 4.4,5.3,990,15.7 2.6,3.8,990,20.00100157 1.6,1.3,990,20.00100157 2.1,1.8,990,20.00100157 3.1,3.2,990,20.00100157 2.5,2.9,990,20.00100157 3.9,4.6,990,15.7 1.6,1.2,990,20.00100157 6.6,8.1,990,15.7 3.6,4.2,990,15.7 2.2,1.6,990,15.7 1.9,1.4,990,15.7 2.3,2.4,990,15.7 1.5,1.7,990,15.7 3.4,3.3,990,15.7 15.7,22.2,990,15.7 11.3,13.8,990,15.5 6.3,7.4,990,15.5 2.9,3.6,990,15.7 9.2,12.1,990,15.5 9.6,11.3,990,15.5 5.4,5.6,990,15.5 9.8,12.3,990,15.5 1.8,1.3,990,20.00100157 3.1,3.8,990,20.00100157 2.1,1.2,990,20.00100157 2.3,1.8,990,20.00100157 3.7,3.5,990,20.00100157 2.4,2.2,990,15.7 4.4,4.3,990,15.7 3.5,3.6,990,15.7 2.6,2.5,990,20.00100157 2.1,2.9,990,20.00100157 2,1,990,15.7 2.9,3,990,15.7 1.6,1.7,990,15.7 1.7,1.1,990,15.7 2.2,1.8,990,20.00100157 2.3,2.4,990,20.00100157 3.9,4.1,990,20.00100157 1.8,1.4,990,20.00100157 11,17.7,990,20.00100157 1.7,1.1,990,15.7 6.9,11.4,990,16.71016044 8,14.2,990,12 7.5,8.5,990,12 5.7,8,990,10.1 8.1,10.3,990,11.2 10.1,15,990,10.1 9.1,10.9,990,13.7 9.7,11.2,990,16.71016044 10.4,16.3,990,16.71016044 3.7,4.7,990,16.71016044 4.3,4.7,990,10.1 3.3,4.5,990,13.7 4.3,5.5,990,12.1 3.8,4.9,990,12.1 5.1,5.8,990,12.1 5.6,6.7,990,12.1 3.3,4.7,990,12.1 5.2,5.2,990,12.1 5.2,5.4,990,13.7 3.1,3.3,990,13.7 4.3,6.4,1030,16 7.5,8.8,1030,12.5 6.7,7.5,1030,16 5.2,7.5,1030,15 5,6.1,1030,16 4.7,8.7,1030,12.5 6.3,8.2,1030,16 8.5,12.5,1030,16 15,25.4,1030,16 5.7,11.9,1030,16 8.9,9.3,1030,16 11.4,18.5,1030,15 3.8,6.8,1030,15 10.1,13.1,1030,14.9 12.5,26.4,1030,16 6.6,7.8,1030,16 5.5,7,1030,16 4,5.5,1030,16 8.1,19.3,1030,11.6 2.1,2.6,1030,11.6 2.1,1.6,1030,11.6 3.8,4.7,1030,12 2.7,2.8,1030,12 3.2,3.9,1030,12 4.8,7.8,1030,15.3 5.1,7.6,1030,11.6 6.5,8.7,1030,11.6 4.9,5.3,1030,15.3 1.7,1,1030,15.3 5.5,7.1,1030,15.3 3.6,3.2,1030,7.8 3.5,3.5,1030,11.2 3.7,3.8,1030,11.2 5.6,8.1,1030,11.2 2,1.4,1030,16.1 5.3,5,1030,11.2 4.4,4.2,1030,11.2 4.1,4.8,1030,7.8 1.9,1.5,1030,16.1 3.3,2.7,1030,15.3 2.7,2.5,1030,15.3 4.1,6,1030,15.3 10.7,13.8,1030,11.6 11.2,20.9,1030,11.6 5.7,6.5,1030,16.1 3.3,3,1030,16.1 5.7,6.8,1030,16.1 2.9,4.4,1030,8.5 4,3.7,1030,16.1 3.4,3.5,1030,16.1 2.8,2.3,1030,16.1 2.1,1.8,1030,16.1 4,3.5,1030,16.1 5.7,7.8,1030,16.1 15.3,24.6,1030,15.3 4.5,6.5,1030,16.1 5.1,5,1030,16.1 2,1.7,1030,16.1 7.1,10.3,1030,11.6 8.5,13.8,1030,11.2 2.5,2.3,1030,15.3 2.8,4,1030,15.3 2.2,1.7,1030,15.3 1.8,1.2,1030,15.3 3.6,3.9,1030,15.3 2.8,2.7,1030,15.3 1.4,0.8,1030,15.3 5.2,8.1,1030,7.8 2.6,1.8,1030,12 4.6,6.1,1030,15.3 6.8,9.9,1030,11.2 2,1.2,1030,11.6 2.3,1.2,1030,15.3 5.7,8.7,1030,12 5.8,8.6,1030,10.9 7.2,10.9,1030,12 7.7,14.5,1030,10.9 8.3,10.6,1030,10.9 6.9,10.9,1030,12 4.3,5.4,1030,10.9 5.3,9,1030,14.1 6.2,10.8,1030,14.1 6.6,9.5,1030,13.6 6,7.3,1030,14.1 4.9,6,1030,14.1 4.3,5.7,1030,14.1 5.8,8,1030,14.1 4.9,7.4,1030,10.9 4.1,5.8,1030,10.9 5.3,7,1030,10.9 4.4,6.4,1030,12 11,18.5,1030,11.3 12,20.8,1030,12 14.7,27.5,1030,14.7 7.8,10.8,1030,12 10.4,12.5,1030,11.3 10,13.9,1030,10.4 10.4,13.1,1030,14.7 11.3,19.1,1030,11.3 9.2,17.2,1030,10.4 9.7,13.1,1030,14.7 10.1,12.8,1030,14.7 8.7,8.1,1030,12 7.4,11.1,1030,11.3 9,9.3,1030,14.7 10,13.2,1030,14.7 8.9,15.5,1030,10.4 10.7,16.4,1030,14.7 4,5.7,1030,11.3 13.6,19.7,1017,17 17,20.7,1017,17 5.6,9.3,1017,6.5 6.1,7.8,1017,14 4.7,5.1,1017,13.6 5.3,7,1017,6.5 5,6.2,1017,11.2 4.4,5.1,1017,11.2 6.8,6.6,1017,14 4.5,6.2,1017,12 5,5.8,1017,12 4.6,7.3,1017,12 4.4,5.1,1017,13.6 4.6,5.3,1017,17 4.9,5.5,1017,17 4.9,5.6,1017,17 4.4,5.8,1017,17 6.5,8.6,1017,17 5,6.1,1017,17 10.4,12.7,1017,19.94501094 7.4,11.2,1017,10.4 8.7,11.7,1017,19.94501094 7.2,10.3,1017,13 8.1,13.5,1017,13 15.9,21.4,1017,19.94501094 19.94501094,21.5,1017,19.94501094 5.4,8.3,1017,10.1 4.8,6.4,1017,19.94501094 4.1,5.1,1017,13 3.4,5.1,1017,19.94501094 4.7,5.9,1017,19.94501094 9.7,9.9,1017,13.6 9.5,14.2,1017,14.6 7.4,12.6,1017,16.985 8.6,14.4,1017,12.7 16.985,32.9,1017,16.985 8.6,9.1,1017,14.6 6.3,11.6,1017,16.985 7.9,9.8,1017,14.6 9.3,12.5,1017,14.6 1.1,4.6,1017,14.6 2.3,1.4,1017,19.94501094 3,3.2,1017,19.94501094 4.6,4.9,1017,12.7 1.8,1.3,1017,19.94501094 2.9,3.3,1017,14.6 1.5,0.7,1017,14.6 3.5,5.1,1017,19.94501094 1.7,2.2,1017,14.6 2.1,1.9,1017,16.985 1.8,1.8,1017,16.985 2.4,2,1017,16.985 4.5,7,1017,13.6 8.8,11,1017,14 7.1,8.6,1017,13.6 4.5,6.3,1017,13.6 8.6,11.5,1017,14 10.1,15.3,1017,13.6 5.4,8.7,1017,13.6 11.2,18.4,1017,11.6 9.4,20,1017,11.6 6.8,7.1,1017,12.7 11.3,19.7,1017,12.7 3,2.6,1025,15 2.5,1.4,1025,13.6 1.5,0.8,1025,15 1.6,1.4,1025,15 15,20.2,1025,15 1.3,0.5,1025,14.1 1.4,0.7,1025,15 1.9,1.2,1025,15 3,3.1,1025,15 3.2,3.7,1025,15 1.6,1.3,1025,15 1.7,1.3,1025,15 2.1,2,1025,15 2.9,3.3,1025,15 2.2,1.4,1025,15 2,1.3,1025,15 2.1,1.5,1025,15 4.2,4.9,1025,15 3.4,3.6,1025,15 2.4,2.8,1025,15 1.8,1.2,1025,15 1.6,1.5,1025,15 2.6,2.5,1025,13.6 2.4,2.5,1025,13.6 2.6,3.8,1025,13.6 2.6,2.8,1025,13.6 3,3.1,1025,13.6 2.2,1.9,1025,14.1 2,1.8,1025,11.5 3.6,3.7,1025,11.5 2.7,2.9,1025,14.1 3.4,4.7,1025,14.1 1.8,1.1,1025,14.1 3.4,5.2,1025,14.1 1.7,0.9,1025,15 2.6,2.5,1025,14.1 13.6,13.1,1025,15 3,4.6,1025,15 1.6,0.5,1025,15 3.5,5,1025,15 1.7,1.3,1025,15 1.5,1.2,1025,15 2.5,1.8,1025,15 2.3,2.3,1025,13.6 2.9,3.5,1025,15 1.9,1.6,1025,13.6 4,5.1,1025,6.1 2.5,2.2,1025,6.1 2.5,2.6,1025,13.6 5.4,7,1025,13.6 1.7,1.2,1025,13.6 2.1,2.1,1025,13.6 3,3.5,1025,15 2.8,2.8,1025,13.6 5.1,6,1025,13.6 2,1.9,1025,13.6 3.2,3.5,1025,13.6 2.9,3.5,1025,5.4 3,3.5,1025,13.6 4,4.6,1025,13.6 1.6,1.4,1025,14.1 2.5,2.2,1025,14.1 2.5,2.5,1025,14.1 3.1,3.4,1025,13.6 1.7,1.1,1025,5.4 2.7,3,1025,5.4 3.2,3.2,1025,13.6 2.4,3.1,1025,15 2.7,2.3,1025,15 2.4,2,1025,13.6 1.7,1,1025,15 4.2,4.6,1025,11.5 2,1.7,1025,13 1.7,0.8,1025,14.1 3.3,3.1,1025,15 1.5,0.7,1025,15 1.5,0.5,1025,15 3.6,4.2,1025,15 1.6,2.5,1025,15 2.7,2.5,1025,15 2.8,2.6,1025,15 1.9,2.2,1025,15 3.9,4.6,1025,15 3.4,3.4,1025,14.1 1.9,1.4,1025,14.1 1.6,0.8,1025,15 1.9,2.2,1025,15 2.5,1.9,1025,14.1 2,1.4,1025,15 2.5,2,1025,14.1 2.5,2.5,1025,15 1.9,1.2,1025,15 1.3,0.6,1025,15 3,2.9,1025,15 4.3,5.1,1025,15 3.9,4.1,1025,15 4.1,4.4,1025,15 3,2.7,1025,15 1.4,0.6,1025,6.1 3.4,3.5,1025,6.1 2.9,3,1025,14.1 1.6,1.3,1025,6.1 1.7,1.3,1025,6.1 4.6,4.6,1025,5.4 2.8,3,1025,6.1 3,2.9,1025,13 3.4,3.1,1025,13 1.7,0.8,1025,13 1.8,1.3,1025,13 1.7,1.5,1025,13 2,0.9,1025,13 2.5,4.5,1025,13 3.3,3.7,1025,13 1.8,1.7,1025,5.4 2.8,3.4,1025,13 2.4,2.1,1025,14.1 2.3,2.9,1025,15 2.3,3.5,1025,15 2.4,2.2,1025,15 1.6,1.3,1025,15 2.6,2.6,1025,15 2.5,2.3,1025,15 2.6,3,1025,13.6 2,2,1025,13.6 3.5,3.4,1025,13.6 1.4,2.4,1025,6.1 1.6,1.1,1025,13.6 3.7,4.2,1025,11.5 2,1.5,1025,11.5 2.2,1.7,1025,13.6 2.1,1.8,1025,11.5 1.9,1,1025,15 2.8,2.8,1025,14.1 3.3,3.1,1025,14.1 3.9,4.7,1025,13.6 5.3,5.8,1025,13.6 1.6,1.8,1025,15 3,3.3,1025,14.1 1.8,1.1,1025,15 1.5,0.9,1025,15 1.4,0.6,1025,15 1.3,0.9,1025,15 1.4,0.6,1025,15 1.9,2.6,1025,14.1 1.4,0.6,1025,13 1.5,0.8,1025,15 1.6,0.8,1025,14.1 2,1.4,1025,15 1.4,0.7,1025,15 1.4,0.9,1025,15 1.5,0.8,1025,15 2,1.8,1025,15 2.3,1.5,1025,15 1.2,0.6,1025,15 1.3,0.7,1025,13.6 1.5,0.8,1025,5.4 1.5,0.8,1025,15 1.4,0.6,1025,15 1.7,0.6,1025,13 1.5,0.6,1025,15 1.4,0.3,1025,14.1 2.2,0.4,1025,14.1 1.9,1.3,1025,15 10.7,11.7,1025,13.6 4.5,7,1025,13.6 13.2,16.5,1025,15 10.9,11.1,1025,13.2 12.1,15.7,1025,13.2 1.6,1.1,1025,15 3.3,2.9,1025,15 1.9,1,1025,15 1.9,1,1025,15 3.2,3.1,1025,15 2.4,2.2,1025,15 14.8,24.8,1025,14.8 6.3,7.8,1025,14.8 4.6,6.2,1025,14.1 11.3,14.3,1025,15 7.4,10.9,1025,15.9 15,15.4,1025,15.9 7.9,9.5,1025,15 15.9,25.9,1025,15.9 7.8,11.7,1025,15 8.7,10.7,1025,14.9 4.7,6,1025,15.9 5.4,7.2,1025,15.9 5.1,6.3,1025,15.9 7.7,12.6,1025,12.4 8.3,11.6,1025,13 4.9,7.1,1025,14.9 9.7,14.4,1025,16.9 4.7,7.5,1025,16.9 9.9,12.5,1025,13 10.6,13.3,1025,16.9 9.4,11.5,1025,13 6.5,9.4,1025,16.9 7.2,12.1,1025,12.4 4.2,5.8,1025,13 4.3,6,1025,12.4 4,5.7,1025,16.9 3.5,5.4,1025,10.4 3.9,6.3,1025,12.4 13.4,16,1011,15.2 11.3,10.3,1011,15.2 6.5,7.3,1011,15.7 15.2,23.2,1011,15.2 16,18.4,1011,16 14.1,13.6,1011,14.1 6.7,10.2,1011,12.2 8.6,11.1,1011,15.1 8.2,10.8,1011,11.2 6.8,7.4,1011,10.6 5.2,6.7,1011,16 12.5,19.4,1011,15.1 6,7.5,1011,15.8 5.8,8.1,1011,15.8 7.3,5.7,1011,12.5 2.1,2,1011,13.5 1.9,1.4,1011,14.9 1.4,0.5,1011,13.5 1.5,9,1011,13.5 1.7,1.3,1011,13.5 1.5,0.8,1011,14.9 1.6,1,1011,14.9 9,10.9,1011,13.5 9.1,13.4,1011,14.9 6.5,8.6,1011,14.9 8.1,12.7,1011,14.9 7.8,12.7,1011,14.9 4.2,5.4,1011,16 8,11.5,1011,14.9 8.5,7.3,1011,14.9 5.4,6.2,1011,16 4.3,5.3,1011,12 6.2,8.7,1011,15.7 7.2,12.4,1011,11.4 15.7,21,1011,16 14.6,21.9,1011,14.6 7.3,10.5,1011,11.4 6.2,9.3,1011,15.7 9.3,10.5,1011,12 4.3,5.6,1011,14.6 2.7,5.4,1167,8.6 4.8,6.2,1167,8.1 7,11.6,1167,8.7 5,9,1167,8.1 8.5,14.5,1167,8.6 4.9,6.7,1167,8.7 5.7,10.2,1167,9 6.3,11.1,1167,9 5.5,7.1,1167,8.1 3.6,7,1167,8.6 5.9,6.8,1167,8.1 7.3,12.6,1167,8.1 4.9,5.8,1167,8.7 6.3,7.2,1167,8.1 5.5,7.3,1167,8.6 8.7,17.1,1167,8.7 8.1,15.7,1167,8.1 7.5,8.4,1167,8.1 5.6,6.7,1167,8.1 8.6,12.8,1167,8.7 5.8,7.5,1167,8.1 7.8,12.7,1167,9 6.9,8.8,1167,8.1 7.5,11.9,1167,8.7 6.9,10.6,1167,8.7 4.6,5.5,1167,8.1 4.7,5.8,1167,8.1 5.3,5.7,1167,8.1 5.3,5.7,1167,8.7 4.6,5.7,1167,8.1 4.5,7.8,1167,8.6 2.2,2.5,1167,8.9 6.3,14.2,1167,8.9 4.7,7.7,1167,8.9 8.4,11.3,1167,9 7.1,11.7,1167,9 6.1,8.1,1167,8.9 7.9,11.5,1167,8.9 6.4,8.6,1167,8.9 5.8,9.6,1167,9 5.3,6.1,1167,9 1.6,1.4,1167,9 1.7,2.5,1167,9 1.5,1.1,1167,9 1.6,4,1167,8.9 2.7,2.5,1167,9 1.7,1,1167,9 2.5,3.9,1167,9 3.9,4.6,1167,9 3,4.7,1167,9 1.7,1.5,1167,8.9 2.6,2.9,1167,8.9 3.3,3.8,1167,7.5 1.5,0.7,1167,7.5 3,3.7,1167,9 2.8,2.9,1167,9 2.9,3.9,1167,7.5 1.4,1,1167,7.5 1.5,1.6,1167,7.5 3.1,3.6,1167,8.9 3.3,4.9,1167,9 2.4,2.8,1167,9 1.5,1.1,1167,9 3.7,4,1167,9 1.8,1.3,1167,9 2.8,2.9,1167,8.5 5.3,5.1,1167,8.5 1.7,1.3,1167,8.9 5,6.3,1167,8.5 2.7,2,1167,8.5 2.4,3.4,1167,9 2.3,3.6,1167,8.9 8.8,13.2,1167,9 8.4,10.8,1167,8.9 6.3,9.9,1167,8.9 1.5,0.9,1167,8.5 3.4,4.3,1167,8.5 2.6,3.1,1167,8.9 2.2,2.4,1167,9 1.8,2.1,1167,8.9 2.8,4.8,1167,8.9 3.7,5.1,1167,8.9 3.3,3.9,1167,8.9 2.9,4.3,1167,8.9 9,12.2,1167,9.5 5,6.4,1167,8.9 7,11.2,1167,8.9 8.9,15,1167,9.5 7,10.5,1167,9.5 4.9,6.6,1167,9.5 5.5,9.3,1167,9.5 5.8,6.6,1167,9.5 7.6,12,1167,9.5 5.9,15.5,1167,10 7.5,8.7,1167,7.6 4.9,6.7,1167,7.6 3.7,6.6,1167,9.5 4.9,15,1167,9.5 9,15.7,1167,9.5 6.4,20.2,1167,10 4.6,6.9,1167,9.5 9.5,15.7,1167,9.5 7,12.5,1167,9.5 5.4,9.7,1167,9.5 4,5.3,1167,9.5 3.8,5.2,1167,9.5 6.7,7.7,1167,7.7 6.6,9.7,1167,8.5 6.4,9.5,1167,7.7 5.4,9,1167,7.7 4.5,6.4,1167,8.2 4.8,6.9,1167,8.2 7.1,12.2,1167,7.9 6.6,9.1,1167,8.2 3.7,5.1,1167,7.7 5.3,8.8,1167,8.2 7.6,12.5,1167,7.7 5,9.4,1167,7.9 8.1,14,1167,8.5 7,17.3,1167,8.2 6.2,7,1167,7.9 7.7,9.7,1167,8.2 7.9,13.8,1167,8.2 8.1,13.9,1167,8.2 4.9,7.8,1167,8.5 6.6,9.7,1167,7.3 5.7,7.6,1167,8.2 6.4,8.7,1167,7.7 7,8.9,1167,7.9 8.2,12,1167,8.2 4.3,7.2,1167,8.2 5.8,6.5,1167,8.2 4.3,5.5,1167,7.3 6,9.2,1167,7.7 3.2,5.2,1167,7.3 4.8,5.3,1167,7.9 3.9,5.7,1167,8.2 6.7,8.7,1177,9.2 6.3,9.1,1177,9.2 8.5,10.7,1177,9.2 4.3,7.4,1177,10.3 4.7,7,1177,10.3 5.7,10.1,1177,10.3 5,8.5,1177,9.2 7.9,10,1177,9.2 5.1,6.9,1177,8 5.6,6.3,1177,10.3 3,5,1177,10.3 3.1,5.5,1177,10.3 3.6,6.7,1177,9.2 4.1,5.6,1177,7.9 4.4,9.5,1177,7.9 3.4,6,1177,9 6.1,7,1177,8.1 1.4,0.3,1177,9.1 2.4,3.2,1177,9.2 1.9,1.8,1177,9.1 3,5.3,1177,9.1 2.2,2.6,1177,9.1 2,1.3,1177,9 2.5,2.4,1177,9 2.5,3,1177,9 2.6,3.7,1177,9 3.9,4.5,1177,8.4 4.9,13.5,1177,8.1 4.7,7.2,1177,9.9 6.8,8.2,1177,8.4 9.2,19.7,1177,9.3 7.3,10.4,1177,9.9 9.1,13.7,1177,9.2 5,6.1,1177,9.9 8.1,10.5,1177,9.9 5.5,11.3,1177,9 5.2,5.5,1177,9.9 5.5,6.5,1177,9.2 6.2,10.8,1177,9.2 6.7,9.4,1177,9.9 6.7,6.8,1177,9.2 6.2,7,1177,9.9 9.2,16.9,1177,9.2 5.1,6.9,1177,9.2 4.3,5.8,1177,9.2 7.1,10,1177,8.4 6.2,11,1177,9.2 6.7,9.7,1177,9.2 4.7,4.6,1177,9.9 3,4,1177,9.9 4.6,5.2,1177,9.9 1.9,2.3,1177,8.1 4,5.3,1177,9.9 7.5,11.5,1177,8.1 3.7,4.3,1177,9.1 2.3,3.1,1177,9.2 1.4,1.1,1177,9.2 3.4,4.6,1177,9.2 3.7,4.1,1177,9 1.8,1.7,1177,9 2.4,2.5,1177,9 3.3,5.1,1177,9.1 2,3.3,1177,8.4 2,1.6,1177,9 1.5,1,1177,9.1 5.9,10.8,1177,9.1 4.8,5.1,1177,9.9 1.4,0.2,1177,9 3.2,4.9,1177,9.2 2.3,3.4,1177,9.3 8.7,9.8,1177,8.7 7.1,13,1177,8.7 6.7,10.5,1177,9.2 6.7,8.3,1177,9.5 4.2,6.5,1177,8.9 7.5,10.9,1177,8.7 8.4,10.4,1177,8.9 6.3,14.8,1177,8.9 7.6,13.5,1177,8.7 4.1,6.7,1177,7.9 7.6,9.2,1177,9.5 6.9,9.9,1177,9.5 7.1,10.3,1177,8.9 8.5,10.3,1177,9.1 5.3,7.4,1177,9.3 7.6,11.5,1177,7.9 3.2,7,1177,9.5 7.2,8.9,1177,8.7 8.9,13.9,1177,9.5 7.1,10.3,1177,8.7 7,12.7,1177,8.7 7.5,14.7,1177,8.7 6.8,7.7,1177,9.5 9.1,14,1177,9.5 5.3,6.2,1177,9.2 4.9,5.7,1177,7.7 4.2,9.4,1177,7.7 6.9,11.4,1177,7.7 4.4,7.5,1177,7.9 4,5.7,1177,8.6 2.6,8.4,1177,7.7 5.1,9.5,1177,7.7 4.2,6.9,1177,7.8 7.7,12.5,1177,7.7 5.9,9.2,1177,7.8 6.9,10.8,1177,7.7 6.7,10.1,1177,8.6 3.3,5.6,1177,7.1 3.8,5.8,1177,6.9 3.8,5.6,1177,10.3 5.1,8,1180,10.7 5.2,6.8,1180,9.1 5.8,8.7,1180,9.1 5.3,6,1180,7.3 6,6.9,1180,7.3 5.8,7.4,1180,7.3 6.2,9.2,1180,9.1 6.5,6.7,1180,9.1 4.7,10.2,1180,10.7 5.2,7.5,1180,9.1 4.1,7.4,1180,9.1 5.3,7.2,1180,10.7 6.8,9.6,1180,7.3 10.7,19.1,1180,10.7 6,7.4,1180,9.1 6.3,10.8,1180,7.3 7.8,12.2,1180,9.1 5.5,8.7,1180,9.1 4.2,7.5,1180,8.1 3.8,5.1,1180,8.1 4.5,5.4,1180,8.1 4.2,5.4,1180,9.1 5.6,6.8,1180,10.7 4,3.1,1180,10.7 3.9,5.7,1180,11 4.2,6,1180,8.1 3.7,3.6,1180,10.7 1.9,1.6,1180,10.7 2.9,2,1180,8.1 3.5,3.7,1180,10.4 2.2,2.9,1180,10.4 1.7,1.3,1180,10.4 1.5,1.6,1180,10.4 1.6,1,1180,10.4 2.1,1.9,1180,10.4 2.1,2,1180,10.4 7.7,11.4,1180,10.7 4.9,8.9,1180,8.1 7,9.3,1180,10.4 6.7,7.1,1180,10.4 6.7,10.1,1180,10.7 6,6.7,1180,11.2 8.1,13.2,1180,8.1 2.8,6,1180,8.1 3.8,7.1,1180,8.1 7,13,1180,10.4 4.8,6.4,1180,8.1 6.3,7.6,1180,10.7 7.2,7.9,1180,10.7 10.7,25.8,1180,11.2 7.1,14.8,1180,10.7 10.1,15.3,1180,11.4 4.4,8.6,1180,11 3.2,2.5,1180,10.4 1.6,2.6,1180,10.7 4.8,4.9,1180,11.2 4.1,4.2,1180,10.7 2.4,2.8,1180,11 2,2.8,1180,8.1 1.5,1.1,1180,11 2.9,3.2,1180,8.1 3.9,4.1,1180,11.2 4.5,4.6,1180,11 4.6,5.2,1180,11 2.2,1.5,1180,8.1 5.1,6.4,1180,11 2.9,3.8,1180,8.1 4.8,4.8,1180,8.1 4,3.4,1180,8.1 5.2,4.6,1180,8.1 3.7,3.9,1180,10.7 2.8,2.5,1180,10.7 4.4,4.6,1180,10.7 6.3,6.8,1180,10.4 8.1,12.4,1180,8.1 2.9,3,1180,10.7 5.4,5.3,1180,11.2 3.3,2.7,1180,10.4 4.7,4.4,1180,10.7 6.5,8.5,1180,11.1 5.9,8.9,1180,11.1 7.9,10.7,1180,11.1 10.4,15.1,1180,10.4 8.1,12.9,1180,13.4 5.3,6.6,1180,13.4 5.7,8.2,1180,10.4 7.9,13,1180,11.1 5.6,6.9,1180,11.1 6.4,10,1180,10.7 6.3,10.2,1180,11.1 5.8,10.4,1180,11.1 9.3,15.5,1180,10.4 7.1,13.8,1180,11.1 6.9,9.4,1180,11.1 6.2,7.5,1180,11.1 6.1,10.4,1180,13.4 6.4,8.9,1180,11.1 7.9,11.6,1180,10.7 7.2,15,1180,11.1 5,5.6,1180,10.1 5.9,6.5,1180,11.1 4.9,5.1,1180,11.1 4.9,5.5,1180,11.1 4.5,5.4,1180,11.1 5.3,6.6,1180,12.5 6.6,10.2,1180,10 7.4,14.5,1180,12.5 6.3,9.3,1180,12.5 5.6,7.2,1180,12.5 10,16.8,1180,10 7.3,11.2,1180,12.5 8.3,16.8,1180,11.2 8.8,20.1,1180,12.5 5.9,6.4,1180,12.5 5.3,6.4,1180,12.5 10.3,16.9,1180,12.5 6,6.4,1180,10 5.5,8,1180,8.3 6.1,8.3,1180,12.5 6.3,8.6,1180,12.5 6.8,13.4,1180,10 6.7,10.1,1180,10.3 5.4,6.1,1180,12.5 6.5,8.1,1180,12.5 5.6,7.2,1180,12.5 4.7,5.3,1180,12.5 5.3,7,1180,12.5 5,6.1,1180,13.4 4.2,6,1180,10.3 5.1,5.7,1180,10.3 3.9,5.8,1180,8.3 5.7,5.9,1180,11.2 5,5.7,1180,11.2 5,7.1,1180,10 3.7,5.5,1180,10 4.7,6.5,1180,12.5 4.4,5.6,1180,10 6.3,7.1,1180,10 4.2,5.7,1180,12.5 5.1,5.6,1180,12.5 5.2,6.5,1180,12.5 4.9,5.4,1180,12.5 5,5.3,1180,12.5 2.8,4.7,840,14.2 13.8,30.4,840,14.2 14.2,18.9,840,14.2 9,12.9,840,10.8 4.4,5.8,840,15.3 6,7.6,840,15.3 4.8,6.2,840,15.3 15.3,15.7,840,15.3 9.8,15.3,840,12.7 7.6,9.8,840,12.7 7.7,9.7,840,15.3 12.5,15.5,840,12.5 6,8.4,840,13.2 2.8,3.7,840,14.5 2.7,3.3,840,12.7 3,4.4,840,12.7 1.3,0.6,840,12.7 2.6,2.3,840,14.7 1.4,0.3,840,14.7 3.4,3.6,840,14.7 1.8,1.4,840,12.7 1.4,0.9,840,13.8 3.6,3.6,840,13.8 4.3,3.9,840,15.3 2,1.8,840,12.7 15.2,27.2,840,16.1 4.6,9.3,840,15.2 4.2,5.6,840,16.1 9.5,12.2,840,14 6.8,6,840,17.5 9.8,12.8,840,16.1 9,10.9,840,17.5 5.4,6.8,840,17.6 14.5,18.7,840,15.2 6.7,8.6,840,16.1 7.1,5.4,840,17.5 5.6,8.8,840,16.1 13.5,15,840,16.1 13.7,16.6,840,16.1 10.6,10.7,840,17.6 12.9,13.4,840,13.7 5.1,6.1,840,14.5 3.8,6.5,820,16.31168444 16.31168444,23.6,820,16.31168444 19.9100783,30.8,820,19.9100783 17.31813412,27.8,820,17.31813412 16.60538022,28.6,820,16.60538022 5.3,8.3,820,13.1 1.5,0.6,820,17.71529983 10.7,11.9,820,19.02239125 1.4,0.9,820,16.2 2.1,1.5,820,16.2 2.1,1.8,820,16.2 2.5,2,820,17.70867505 2.4,2.1,820,18.82586711 1.5,0.6,820,16.2 2.4,1.9,820,19.02239125 2,1.4,820,19.02239125 1.6,0.6,820,19.02239125 1.7,0.7,820,19.02239125 7.2,9.9,820,14.7 14.7,17.3,820,14.7 16.2,27,820,16.31168444 17.20919086,34,820,17.20919086 1.4,0.4,820,16.2 8.1,8.8,840,13.2 8.1,8.5,840,13.2 12.5,15.9,840,13.2 11.1,17.8,840,13.6 5.9,6.5,840,13.11193153 9.2,11.5,840,13.6 2.2,4.5,840,13.2 2.9,3.2,840,13.2 2.5,2.8,840,13.2 5,5.9,840,13.2 12.1,15.3,840,13.2 10,13.5,840,13.2 1.9,1.1,840,13.2 2.6,2.6,840,13.2 2.6,3,840,13.2 1.6,0.5,840,13.2 1.7,0.6,840,13.2 1.7,0.6,840,13.2 1.5,0.4,840,13.2 5.5,7.9,840,13.6 14.6,21.5,840,14.6 13.4,14.6,840,13.4 6.8,9.1,840,12.5 2,6.8,840,13.4 9.3,9.6,840,13.4 5.5,6.6,840,14.6 11.6,17.9,840,12.5 8.4,10.8,840,12.5 3.6,3.8,840,12.5 4.5,5,840,12.5 11.1,12.4,840,16.7 13,13.3,840,15.6 13.7,20.8,840,15.3 3.6,4.4,840,15.3 2.5,3,840,16.7 8.7,16.3,840,13.2 12.4,13.1,840,12.4 14.1,18.6,840,16 1.8,3.8,840,15.7 3.8,3.6,840,16 6,5,840,13.2 13.4,21.5,840,15.7 5.8,5,840,14.1 6.3,7.9,963,13.2 8.7,7.7,963,11.1 13.2,18.6,963,13.2 11.1,14.4,963,11.1 8.7,22.3,963,11.9 12.6,16.1,963,13.2 12.5,17.1,963,14.1 14.1,24.3,963,14.1 12.7,15.2,963,13.2 1.8,2.3,963,14.8 14,28.5,963,14 13.4,18.5,963,14.8 13.9,17.4,963,14.6 13.9,21.8,963,14.1 10.2,12,963,14.6 10.5,19.9,963,14.6 12.8,15.2,963,14.1 14.6,23.6,963,16.7 12.5,17.8,963,14.6 13.6,19.9,963,14.6 5.1,7,963,12.1 14.6,23.9,963,14.6 12,18.6,963,14.6 12.9,15.2,963,14.6 16.7,33.4,963,16.7 1.6,0.5,963,14.6 12.9,21,963,15.9 15.9,37.9,963,15.9 4.1,6.4,964,15.3 2.1,1.7,964,15.7 2.4,2.4,964,15.7 3,3.5,964,15.7 2.6,3.5,964,15.3 3.5,4.4,964,4 5.9,9.2,964,16.4 1.9,2.4,964,15.3 13.1,19.3,964,15.3 15.3,28.2,964,15.3 15.8,29.2,964,15.8 15.7,27.9,964,15.7 12.3,24.5,964,15.8 5,6.9,964,15.7 12.5,20.2,964,15.8 12.2,17.4,964,15.8 11.3,21.2,964,12 1.5,2,964,15.8 2.6,2.5,964,15.7 2.1,2.5,964,15.1 2,1.5,964,15.1 3.1,3.9,964,15.1 2,1.7,964,15.8 5.3,6.1,964,15.8 1.6,1,964,15.8 3,4,964,15.8 1.5,1.3,964,15.8 3.2,3.5,964,15.8 2.3,3.3,964,15.7 2.7,3.3,964,15.7 2.3,2.8,964,15.7 2.9,4.2,964,12.3 1.5,0.6,964,15.7 1.7,1.9,964,15.8 3,3.8,964,15.8 16.4,29.4,964,16.4 7.8,7.4,964,15.7 14.2,17.8,964,16.4 15.1,27.1,964,15.7 9.6,9.8,964,14.1 13.4,18.4,964,14.2 14.1,20.2,964,14.1 12.6,19.2,964,15.7 14.9,28.3,964,16.4 4.7,4.6,964,15.1 3.2,3.6,964,16.4 3.3,4.6,964,14.2 3,3.8,964,13.1 2.3,2.7,964,11.3 4,4.5,964,14.2 1.6,1.1,964,11.3 2.4,2.9,964,11.3 10.2,10.7,964,11.3 13.1,18.2,964,13.4 2.7,3.5,964,11.3 2.8,2.9,964,16.4 1.6,1.5,964,14.2 9.9,11.4,964,16.4 3.3,3.9,964,11.3 11.3,18.9,964,11.3 3.1,3.6,964,11.3 16.1,23.1,971,16.1 14.7,20.6,971,16.1 17.10430479,32.2,971,17.10430479 11.8,12.1,971,14.7 10.5,12.5,971,16.1 11.8,20.9,971,17.10430479 3,3.8,971,14.7 3.1,2.5,971,17.10430479 1.7,0.9,971,17.10430479 3.3,3.1,971,17.10430479 1.5,0.3,971,17.10430479 13.4,18.9,971,14.6 14.7,18.4,971,14.7 13.3,16.7,971,14.7 13.5,27.2,971,14.7 6.1,6.6,971,14.6 17.2,29.7,971,17.2 14.6,28.2,971,14.6 12.6,27,971,17.2 2.7,3.8,971,17.2 2.1,2.9,971,17.2 3.2,5,971,14.7 4.5,6.8,971,17.2 1.8,1.1,971,17.2 14.6,16.7,971,14.6 14.1,19.9,971,14.4 14.4,19.1,971,16.9 7,7.7,971,14.6 16.9,33.3,971,16.9 8.9,22,971,16.9 6.3,8.5,971,12.1 3.2,3.4,971,16.9 4.4,5,971,17.4 12.1,20.3,971,12.1 11.3,22.4,971,12.1 5.2,5.8,971,13.3 13.3,18.8,971,13.3 5.7,6.3,971,16.9 9.5,11.4,978,15.3 6.1,8,978,15.3 8.7,9.2,978,15.3 6.1,7,978,15.3 7.9,11.5,978,15.3 6.9,7.8,978,10.6 7.4,8.1,978,8.7 7.1,7.8,978,13.1 6.6,13.5,978,13.1 7.1,7.5,978,15.9 8.2,16,978,15.9 8.8,8.3,978,12.6 10.6,5.2,978,15.9 10.5,17.1,978,15.9 8,8.4,978,15.9 6.4,5.4,978,12.6 5.2,6.8,978,10.6 3.8,5.4,978,10.6 6.2,7,978,8.7 6.5,6.4,978,15.3 6.1,5.8,978,15.3 5.7,5.1,978,15.3 7.7,11.5,978,7.9 6.5,8.5,978,11.5 13.1,24.4,978,13.7 7.8,9.9,978,7.9 5.5,8.7,978,7.8 9.1,15,978,13.7 6.7,13.1,978,15.6 6.6,8.4,978,7.9 4.1,5.2,978,6.7 4,6,978,6.7 3.7,5.7,978,10.4 4.1,5.1,978,13.1 4.3,5.4,978,10.4 5,5.4,978,6.7 5.7,7.1,978,6.7 5.8,7.5,978,7.8 4.5,5.5,978,7.9 5.3,5.1,978,7.9 5.3,5.7,978,11.5 5,5.2,978,11.5 5.6,7.6,978,11.5 5.3,6.5,978,11.5 6.1,6.8,978,7.8 6.5,7,978,7.8 5.7,9.6,978,11.5 4.1,4.1,978,13.7 2.5,2.4,978,14.9 1.4,1.9,978,14.9 1.8,1.1,978,14.9 1.5,0.8,978,14.9 1.8,1,978,14.9 1.7,0.7,978,14.9 3.1,5.2,978,17 2.6,2.9,978,13.7 4.1,4.4,978,13.7 1.4,0.6,978,17 1.8,1.2,978,17 1.5,0.8,978,17 3.7,4.5,978,14.9 10.7,17.7,978,14.9 13.7,18,978,13.7 10.5,20.1,978,17 8.1,10.7,978,14.9 2.8,5.6,978,14.9 6.8,10.7,978,17 1.7,0.8,978,13.7 2.4,1.9,978,13.7 2.1,1.4,978,13.7 1.5,0.5,978,17 2,1.5,978,14.9 1.9,1,978,14.9 1.7,0.8,978,14.9 7.7,12.1,978,15 14.2,21,978,14.2 10.4,16.6,978,14.6 10.8,13.2,978,14.6 6.4,9.3,978,17 8.6,13.3,978,14.2 11,17.4,978,11 14.6,21,978,14.6 5,6.1,978,14.6 10,10.5,978,17 5.2,6.2,978,17 9.4,24.8,977,13.5 9.4,14.1,977,9.4 3,7.5,977,9.4 6,10.4,977,9.4 6,8.9,977,13.5 11.5,23,977,11.5 5.6,8.3,977,13.5 4,5.2,977,13.5 10.8,16.6,977,12.3 7.8,11,977,11.5 5.3,8.1,977,8.9 7,10.8,977,10.8 8.7,12.9,977,11.8 6.6,10.9,977,11.8 7.4,12,977,12.9 5.4,7.9,977,10.9 6,8.8,977,10.8 4.4,5.3,977,11.3 5.9,6.7,977,18.1 6.3,9.6,977,18.1 11,16.9,977,18.1 4.5,5.1,977,18.1 4.6,5.5,977,18.1 5.4,7.6,977,18.1 5.2,5.5,977,18.1 4.7,5,977,18.1 6.8,11,977,12.9 6.7,5.8,977,18.1 5.3,6.2,977,18.1 6.6,8.1,977,11 5.8,6.5,977,18.1 5.2,5.7,977,18.1 12.2,18.7,977,12.2 13.8,22.3,977,18.4 9.3,13.8,977,12.2 7,8.9,977,18.4 12.5,15.2,977,18.4 3.4,5.7,977,12.7 1.3,0.2,977,18.4 1.4,0.5,977,18.4 1.7,0.7,977,18.4 1.5,0.4,977,18.4 1.8,0.6,977,18.4 1.8,1.6,977,18.4 2,0.7,977,18.4 1.6,0.4,977,18.4 1.5,0.4,977,18.4 1.4,0.4,977,18.4 1.4,0.3,977,18.4 1.6,0.5,977,18.4 1.4,0.3,977,18.4 1.8,0.7,977,18.4 1.4,0.4,977,18.4 1.4,0.3,977,12.2 1.6,0.5,977,12.2 1.5,0.4,977,12.2 1.5,0.4,977,12.2 2.1,1.3,977,12.2 1.6,0.4,977,12.2 1.4,0.3,977,18.4 1.5,0.7,977,18.4 1.4,0.3,977,18.4 2,0.9,977,18.4 2,0.8,977,18.4 1.5,0.4,977,18.4 1.5,0.5,977,18.4 1.7,0.5,977,12.2 1.5,0.5,977,18.4 2,1,977,12.3 2.1,0.8,977,12.3 1.4,0.5,977,12.3 1.4,0.5,977,12.3 1.4,0.2,977,12.3 2.6,1.7,977,12.3 1.4,0.3,977,12.2 2.3,1.2,977,18.4 2,1,977,12.3 2.1,1.1,977,12.3 1.6,0.7,977,12.2 2,0.8,977,12.2 1.6,0.4,977,12.2 1.8,0.5,977,12.2 1.4,0.3,977,12.2 1.5,0.5,977,18.4 1.4,0.3,977,18.4 1.8,0.5,977,18.4 1.5,0.5,977,18.4 1.5,0.6,977,18.4 11.6,19,971,12.5 9.9,17.4,971,12.5 3.1,4,971,4.5 3.1,3,971,4.5 3.9,5.8,971,5.2 1.7,0.8,971,3.9 2.1,1.6,971,3.9 2.1,1.4,971,3.9 2,1.5,971,3.9 2.1,1.6,971,3.9 1.8,0.7,971,3.9 1.5,0.8,971,3.9 2,1.4,971,3.9 2.2,1.8,971,3.9 2,1.2,971,3.9 2.6,1.6,971,3.9 2.9,3.2,971,3.9 1.5,0.6,971,3.9 2.1,1.6,971,3.9 1.8,1.4,971,3.9 1.6,0.7,971,3.9 1.8,0.9,971,3.9 1.5,0.7,971,3.9 1.4,0.5,971,3.9 1.5,0.6,971,12.7 2,1.5,971,12.7 1.6,0.6,971,12.7 1.8,1.1,971,4.2 2.9,2.5,971,4.2 2.2,2,971,4.2 2.3,1.7,971,4.2 1.4,0.7,971,4.2 1.4,0.5,971,4.2 2,1.1,971,3.9 1.4,0.3,971,4.3 3,2.8,971,5.2 2.3,2,971,3.9 1.8,1.2,971,4.2 1.4,0.5,971,4.2 2.5,2.1,971,3.9 2.3,1.9,971,4.2 2,1.4,971,4.2 2.4,2,971,3.9 1.4,0.4,971,5.2 1.5,0.6,971,5.2 2.3,1.9,971,4.2 1.9,0.4,971,3.9 1.4,0.4,971,3.9 1.5,0.6,971,4.2 1.4,0.4,971,3.9 1.4,0.7,971,12.1 2,0.9,971,12.1 2.6,2.8,971,12.1 1.9,1.6,971,12.7 1.7,0.8,971,12.7 1.9,0.9,971,12.7 1.9,0.6,971,12.1 1.7,1.1,971,12.1 2.2,1.5,971,12.1 2,1.4,971,12.1 2.4,2,971,12.7 1.5,0.7,971,12.7 1.7,1,971,12.7 1.5,0.4,971,12.7 1.5,0.6,971,12.1 1.5,0.8,971,12.5 2.1,1.6,971,12.5 1.7,0.8,971,12.7 1.4,0.6,971,12.7 1.4,0.5,971,12.5 1.9,0.7,971,12.1 1.6,0.5,971,12.1 1.7,0.8,971,12.1 2,1,971,10.7 1.4,0.7,971,10.7 1.7,0.6,971,10.7 1.5,0.8,971,10.7 2,1.7,971,10.7 2.4,1.7,971,10.7 1.4,0.3,971,10.7 1.5,0.5,971,4.3 2,1.2,971,4.5 2.8,2,971,4.5 2.3,1.4,971,5.2 2.7,1.5,971,4.5 2.3,1.3,971,4.3 1.6,0.8,971,4.3 1.8,0.9,971,4.5 2.7,2.2,971,4.5 3.3,3.2,971,4.5 1.4,0.4,971,4.3 2,1.2,971,4.3 3,3.3,971,4.3 1.4,0.4,971,10.7 1.4,0.4,971,10.7 1.9,1.3,971,4.3 1.6,0.9,971,4.3 2.5,2.3,971,4.3 2,1.3,971,4.3 2.8,2.3,971,4.3 1.7,1,971,4.3 1.4,0.6,971,4.3 1.7,0.5,971,5.2 3.5,3.7,971,4.5 1.6,0.4,971,4.5 1.4,0.3,971,4.3 2.4,2,971,4.5 2.2,1.4,971,4.5 3,2.4,971,4.5 1.5,0.4,971,4.5 2,1.4,971,4.3 3.2,3.6,971,4.3 1.9,0.9,971,4.3 1.8,0.7,971,4.3 1.5,0.5,971,4.3 2.2,1.6,971,4.5 3,3.1,971,4.5 3.9,3.1,971,4.3 1.8,1,971,4.5 3,3.2,971,4.5 2.2,1.8,971,4.5 1.5,0.4,971,4.3 10.5,13.5,971,14.6 7,11.7,971,12.8 3.6,5.7,971,7 4.2,5,971,5.2 4.9,5.9,971,12.8 4.9,5.2,971,14.6 5,5.4,971,14.6 5.5,6.2,971,14.6 13.7,16.9,971,14.5 11.1,17.9,971,13.4 12.5,14.5,971,14.5 14.5,24.1,971,14.5 13,29.5,971,14.5 13.2,20,971,14.5 14.5,23.2,971,14.5 12.4,16,971,14.5 13.4,17.5,971,13.4 12.5,13.9,971,13.4 12.5,13,971,13.4 10.7,10.8,971,13.5 12.9,16.2,971,14.5 12.9,15.3,971,13.5 12.1,13.9,971,13.5 12.5,13.7,971,13.5 10.7,11,971,12.9 3,2.9,1115,9.7 2.2,2.2,1115,9.7 3.3,4.4,1115,9.7 2.8,4.3,1115,9.6 1.6,1.1,1115,9.7 2.4,2.7,1115,9.6 2,1.7,1115,9.6 1.8,1.6,1115,9.6 1.6,0.8,1115,9.5 1.7,1.2,1115,10.1 3.5,4.3,1115,9.6 2.5,2.8,1115,9.6 1.7,1.2,1115,9.6 3.6,4.3,1115,9.7 3.3,3.6,1115,9.6 1.8,1.2,1115,9.7 6.9,8.9,1115,10.1 9.5,14.6,1115,9.9 9.6,14.7,1115,10.1 7.7,10.9,1115,9.9 9.2,12.4,1115,9.5 9.6,12.8,1115,9.6 7.9,11.5,1115,9.7 7.5,9.5,1115,9.6 9.6,14.1,1115,9.7 6.6,12.5,1115,9.7 7.9,10.9,1115,9.6 6.3,5.7,1115,9.6 9.2,22.3,1115,9.7 9.7,17,1115,9.7 8.9,16.5,1115,10.1 8.8,11.2,1115,9.7 8,14.5,1115,9.5 2.3,1.7,1115,10.1 1.6,1.3,1115,9.9 1.8,4.4,1115,9.5 2.8,4.3,1115,9.9 1.6,0.8,1115,9.5 1.6,0.7,1115,9.7 6.9,8,1115,8.3 6.2,6.4,1115,8.1 6.2,6.5,1115,8.3 8.1,12.7,1115,8.1 7.7,11,1115,8.1 6.1,6.8,1115,8.1 8.3,8.9,1115,9.2 4.9,8,1115,8.8 8.1,10.1,1115,8.1 8.8,15,1115,8.8 8,12.1,1115,8.1 7.3,17.6,1115,8.1 7.1,10.1,1115,8.8 6.8,7.7,1115,8.8 4.9,6.4,1115,10.1 6.5,7.7,1115,8.1 7.6,7.8,1115,10.4 7.4,8.9,1115,10.4 6.8,8.9,1115,10.4 5.4,5.8,1115,10.1 4.7,7,1115,8.1 10.1,15.8,1115,10.1 4.8,6.7,1115,10.1 9.6,15.7,1115,10.4 10.4,16.2,1115,10.4 8,10.3,1115,10.1 6.9,9.4,1115,10.4 5.8,6.1,1115,10.1 7.9,15.1,1115,10.4 9.5,17.5,1115,10.1 5.7,7.2,1115,10.4 7.4,7.9,1115,10.4 5.2,10.5,1115,10.4 8.2,13.5,1115,10.4 6.6,10.8,1115,8.9 7.5,11.2,1115,8.9 8.2,12.2,1115,10.5 7.4,6.2,1115,10.5 7.6,12.3,1115,10.5 3,5.9,1115,10.5 10.5,20.9,1115,10.5 9.7,16.7,1115,10.5 7.7,9.1,1115,10.5 11.1,25.8,1115,11.1 9.1,15.6,1115,9.1 8.7,12.4,1115,9.1 9,13,1115,11.1 9,11.3,1115,9.5 8.9,8.6,1115,9.5 7,7.8,1115,11.1 8.9,20.2,1115,10.5 2.8,5.4,1115,11.1 6.5,7.4,1115,9.9 9.9,23.6,1115,10.5 9,13.7,1115,9.9 3.9,9.1,1162,11.3 8.9,15.4,1162,9.8 6.6,9.5,1162,13.2 6.5,14.5,1162,13.3 4.7,7.4,1162,13.3 3.9,5.7,1162,13.2 3,6.3,1162,13.2 3.7,8.9,1162,13.2 6.5,10.1,1162,13.2 9.8,20,1162,13.2 13.4,20.3,1162,13.4 6.5,10.3,1162,13.2 5.3,7.7,1162,13.2 4.9,5.5,1162,13.4 3.8,5.9,1162,13.2 9.1,14.7,1162,10.2 5.3,10.7,1162,10.4 4.5,7.8,1162,10.2 11,21.4,1162,11 7.3,10.3,1162,11.9 5.4,7.4,1162,13.3 6.1,8.6,1162,11.9 5,6.6,1162,11.9 11.9,17.8,1162,13.3 3.5,6.7,1162,11.9 13.3,21.7,1162,13.3 3.7,6.5,1162,11.3 4.6,6.1,1162,11.3 4,5.7,1162,10.2 3.8,5.3,1162,11 2.8,5.5,1162,13.3 5.3,5.7,1162,13.3 12.4,19,1162,13.3 5.9,8.5,1162,13.3 10.4,12.8,1162,11.9 11.5,15.9,1162,12.4 6.4,8.9,1162,12.4 5.5,6.3,1162,12.4 5.2,8.1,1162,11.5 6.2,8.4,1162,11.5 7.3,10,1162,8.7 6.9,11.2,1162,9.7 6.6,8.3,1162,9.7 7.5,11.5,1162,8.7 7.7,9.9,1162,8.7 7.9,12.4,1162,13.2 7.8,10.3,1162,13.2 8.7,12,1162,13.2 5.7,5.6,1162,13.3 4,5.4,1162,12.4 2.7,4.8,1162,13.4 2.7,2.6,1162,13.4 1.8,1.1,1162,12.8 1.8,1.8,1162,10.2 2.1,2.8,1162,10.2 1.9,2.3,1162,13.6 5,6.1,1162,13.4 2.3,2.4,1162,13.4 2,1.8,1162,13.4 3.1,2.9,1162,13.4 3.3,3.2,1162,13.4 3.7,5.7,1162,13.4 1.4,0.3,1162,13.4 12.8,24,1162,12.8 10.2,16.4,1162,13.4 6.6,10.9,1162,13.4 6.8,10.9,1162,13.3 4.6,6.5,1162,13.4 4,6.8,1162,13.4 4.4,6,1162,13.4 4,6.1,1162,10.2 1.6,0.7,1162,13.4 1.5,0.4,1162,13.4 1.5,0.6,1162,12.8 1.5,1.5,1162,12.8 1.8,1.4,1162,12.4 1.5,1.1,1162,13.6 2.7,2.8,1162,13.6 2.8,3.4,1162,13.6 2.1,1.8,1162,13.6 1.4,0.4,1162,13.6 5.4,10.1,1162,12.4 3.2,4.6,1162,12.8 2.8,4.7,1162,12.8 1.4,1.2,1162,12.8 1.7,1.5,1162,12.8 1.5,1.2,1162,12.8 1.9,1.4,1162,12.8 2.2,2.8,1162,11.4 2.3,2.9,1162,12.8 2.3,2.6,1162,12.8 1.9,1.8,1162,12.8 2,1.4,1162,12.4 1.8,1.3,1162,12.4 2.2,1.8,1162,12.4 1.6,2.2,1162,13.6 1.8,1.4,1162,13.6 4.4,4.9,1162,12.4 3.7,3.8,1162,12.4 2.1,1.6,1162,12.4 2.7,4.7,1162,12.4 2.9,3,1162,12.8 2,2.2,1162,13.6 2.6,3.4,1162,12.8 1.6,1.7,1162,12.8 2.5,3.6,1162,12.4 3,3.5,1162,13.6 2,2,1162,13.6 3.1,4,1162,12.4 1.5,0.8,1162,12.8 3.3,4.6,1162,13.6 2.3,2.3,1162,13.6 1.9,1.4,1162,13.6 2,1.9,1162,12.4 1.7,1.4,1162,13.6 2.4,2.8,1162,12.8 2.3,3.4,1162,13.6 1.6,1.4,1162,12.8 12.8,23,1162,12.8 8.5,12.6,1162,13.6 12.4,17.5,1162,13.6 11.4,22.5,1162,12.8 1.5,0.5,1162,13.6 1.4,0.5,1162,13.6 2.1,1.7,1162,13.6 7.2,13.1,1162,11.7 4,6.7,1162,16.1 5,8.1,1162,16.1 16.1,22.4,1162,16.1 10.3,14.9,1162,16.1 7.2,12,1162,12.3 7.8,9.7,1162,12.3 6.4,9.4,1162,12.3 4.9,7.8,1162,12.3 4,14.3,1162,9.5 6,9,1162,12.3 8.5,7,1162,12.3 4.3,5.9,1162,12.3 6.7,10,1162,12.3 4.8,5.2,1162,16.1 5.8,6.4,1162,12.3 4.5,5.5,1162,12.3 5.1,7,1162,16.1 4.6,9.3,1162,11.4 7.5,10.9,1162,11.4 5.4,8.1,1162,11.4 8.2,17.8,1162,11.4 5.1,7.2,1162,9.5 8.3,13.5,1162,11.4 9.5,13.8,1162,11.4 7.9,9.8,1162,8.3 4.9,5,1162,9.5 6.2,7.9,1162,11.4 5.4,6.4,1162,14.4 5.7,6.4,1162,9.5 4,5.5,1162,11.4 4.7,5.6,1162,14.4 6.2,6.8,1162,11.4 5.1,5.5,1162,11.4 4.5,8,1162,11.4 4.2,5.3,1162,11.4 6.7,10.3,1162,14.4 3.8,5.3,1162,11.4 4,5.8,1162,11.4 4.6,5.9,1162,11.4 13.6,20.4,1162,13.6 11,12.8,1162,13.6 12.7,14.8,1162,13.6 8.2,13.7,1162,13.6 3.1,5.5,1162,9.5 4.8,5.9,1162,11.2 3.8,6,1162,13.6 4.6,7,1162,11.2 \ No newline at end of file diff --git a/inst/shiny/www/repos/B22M/B05Ia_22M_x/git_stats.csv b/inst/shiny/www/repos/B22M/B05Ia_22M_x/git_stats.csv new file mode 100644 index 0000000..0dbb2f7 --- /dev/null +++ b/inst/shiny/www/repos/B22M/B05Ia_22M_x/git_stats.csv @@ -0,0 +1,25 @@ +commit,parents,author,author_email,author_date,committer,committer_email,committer_date,message,log,file,extension,bin_before,bin_after,change,add,delete,dir,github_assignment,github_repository +61ace7fb91d0d69dbf8d874de13ae8956c02fc87,243b2c27b24a50829ae02df8285a61bd64bb48d7,id93,id93@student.university.edu,2022-12-05T11:30:12Z,id93,id93@student.university.edu,2022-12-05T11:30:12Z,fin,docs/x.Rmd | 4 ++--,docs/x.Rmd,Rmd,NA,NA,4,2,2,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93,B05Ia_22M_x,b05ia_22m_x-id93 +243b2c27b24a50829ae02df8285a61bd64bb48d7,fd0c1088228e8d3234cac657adf62b0c93aff4df,id93,id93@student.university.edu,2022-12-05T11:28:59Z,id93,id93@student.university.edu,2022-12-05T11:28:59Z,presque fin,docs/x.Rmd | 32 +++++++++++++++++++++++++++-----,docs/x.Rmd,Rmd,NA,NA,32,27,5,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93,B05Ia_22M_x,b05ia_22m_x-id93 +fd0c1088228e8d3234cac657adf62b0c93aff4df,61981faa67f15c9534ae7435eea768514fa3b901,id93,id93@student.university.edu,2022-12-05T10:05:55Z,id93,id93@student.university.edu,2022-12-05T10:05:55Z,test,docs/x.Rmd | 13 ++++++++-----,docs/x.Rmd,Rmd,NA,NA,13,8,5,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93,B05Ia_22M_x,b05ia_22m_x-id93 +61981faa67f15c9534ae7435eea768514fa3b901,NA,github-classroom[bot],66690702+github-classroom[bot]@users.noreply.github.com,2022-12-05T09:41:18Z,GitHub,noreply@github.com,2022-12-05T09:41:18Z,Initial commit,.gitignore | 52 ++++++++++++++++++++++++++++++++++++++,.gitignore,gitignore,NA,NA,52,38,0,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93,B05Ia_22M_x,b05ia_22m_x-id93 +61981faa67f15c9534ae7435eea768514fa3b901,NA,github-classroom[bot],66690702+github-classroom[bot]@users.noreply.github.com,2022-12-05T09:41:18Z,GitHub,noreply@github.com,2022-12-05T09:41:18Z,Initial commit,B05Ia_x.Rproj | 15 +++++++++++,B05Ia_x.Rproj,Rproj,NA,NA,15,11,0,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93,B05Ia_22M_x,b05ia_22m_x-id93 +61981faa67f15c9534ae7435eea768514fa3b901,NA,github-classroom[bot],66690702+github-classroom[bot]@users.noreply.github.com,2022-12-05T09:41:18Z,GitHub,noreply@github.com,2022-12-05T09:41:18Z,Initial commit,R/dataset.R | 34 +++++++++++++++++++++++++,R/dataset.R,R,NA,NA,34,25,0,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93,B05Ia_22M_x,b05ia_22m_x-id93 +61981faa67f15c9534ae7435eea768514fa3b901,NA,github-classroom[bot],66690702+github-classroom[bot]@users.noreply.github.com,2022-12-05T09:41:18Z,GitHub,noreply@github.com,2022-12-05T09:41:18Z,Initial commit,README.Rmd | 28 +++++++++++++++++++++,README.Rmd,Rmd,NA,NA,28,21,0,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93,B05Ia_22M_x,b05ia_22m_x-id93 +61981faa67f15c9534ae7435eea768514fa3b901,NA,github-classroom[bot],66690702+github-classroom[bot]@users.noreply.github.com,2022-12-05T09:41:18Z,GitHub,noreply@github.com,2022-12-05T09:41:18Z,Initial commit,README.md | 61 +++++++++++++++++++++++++++++++++++++++++++++,README.md,md,NA,NA,61,45,0,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93,B05Ia_22M_x,b05ia_22m_x-id93 +61981faa67f15c9534ae7435eea768514fa3b901,NA,github-classroom[bot],66690702+github-classroom[bot]@users.noreply.github.com,2022-12-05T09:41:18Z,GitHub,noreply@github.com,2022-12-05T09:41:18Z,Initial commit,data/abies.rds | Bin 0 -> 7092 bytes,data/abies.rds,rds,0,7092,NA,NA,NA,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93,B05Ia_22M_x,b05ia_22m_x-id93 +61981faa67f15c9534ae7435eea768514fa3b901,NA,github-classroom[bot],66690702+github-classroom[bot]@users.noreply.github.com,2022-12-05T09:41:18Z,GitHub,noreply@github.com,2022-12-05T09:41:18Z,Initial commit,data/raw/ab.csv | 1 +,data/raw/ab.csv,csv,NA,NA,1,1,0,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93,B05Ia_22M_x,b05ia_22m_x-id93 +61981faa67f15c9534ae7435eea768514fa3b901,NA,github-classroom[bot],66690702+github-classroom[bot]@users.noreply.github.com,2022-12-05T09:41:18Z,GitHub,noreply@github.com,2022-12-05T09:41:18Z,Initial commit,docs/x.Rmd | 55 ++++++++++++++++++++++++++++++++++++++++,docs/x.Rmd,Rmd,NA,NA,55,40,0,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93,B05Ia_22M_x,b05ia_22m_x-id93 +61981faa67f15c9534ae7435eea768514fa3b901,NA,github-classroom[bot],66690702+github-classroom[bot]@users.noreply.github.com,2022-12-05T09:41:18Z,GitHub,noreply@github.com,2022-12-05T09:41:18Z,Initial commit,docs/biblio.bib | 34 +++++++++++++++++++++++++,docs/biblio.bib,bib,NA,NA,34,25,0,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93,B05Ia_22M_x,b05ia_22m_x-id93 +2a71caf0f1b5131c547ef1237aa845e4285cb0b9,faa48113235800e85c0cee686b4635763ec07048,id227,id227@student.university.edu,2022-12-05T11:14:26Z,id227,id227@student.university.edu,2022-12-05T11:14:26Z,Projet fini,docs/x.Rmd | 18 ++++++++++--------,docs/x.Rmd,Rmd,NA,NA,18,10,8,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227,B05Ia_22M_x,b05ia_22m_x-id227 +faa48113235800e85c0cee686b4635763ec07048,d21c2b9105e7c9252212b80d4ec5c9b76a66a353,id227,id227@student.university.edu,2022-12-05T10:55:32Z,id227,id227@student.university.edu,2022-12-05T10:55:32Z,code fini,docs/x.Rmd | 19 ++++++++++---------,docs/x.Rmd,Rmd,NA,NA,19,10,9,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227,B05Ia_22M_x,b05ia_22m_x-id227 +d21c2b9105e7c9252212b80d4ec5c9b76a66a353,0667a4755085d32c5d1eb14136cb55bd919137d3,id227,id227@student.university.edu,2022-12-05T10:37:03Z,id227,id227@student.university.edu,2022-12-05T10:37:03Z,code partie 1,docs/x.Rmd | 16 +++++++++++-----,docs/x.Rmd,Rmd,NA,NA,16,11,5,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227,B05Ia_22M_x,b05ia_22m_x-id227 +0667a4755085d32c5d1eb14136cb55bd919137d3,NA,github-classroom[bot],66690702+github-classroom[bot]@users.noreply.github.com,2022-12-05T09:48:33Z,GitHub,noreply@github.com,2022-12-05T09:48:33Z,Initial commit,.gitignore | 52 ++++++++++++++++++++++++++++++++++++++,.gitignore,gitignore,NA,NA,52,38,0,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227,B05Ia_22M_x,b05ia_22m_x-id227 +0667a4755085d32c5d1eb14136cb55bd919137d3,NA,github-classroom[bot],66690702+github-classroom[bot]@users.noreply.github.com,2022-12-05T09:48:33Z,GitHub,noreply@github.com,2022-12-05T09:48:33Z,Initial commit,B05Ia_x.Rproj | 15 +++++++++++,B05Ia_x.Rproj,Rproj,NA,NA,15,11,0,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227,B05Ia_22M_x,b05ia_22m_x-id227 +0667a4755085d32c5d1eb14136cb55bd919137d3,NA,github-classroom[bot],66690702+github-classroom[bot]@users.noreply.github.com,2022-12-05T09:48:33Z,GitHub,noreply@github.com,2022-12-05T09:48:33Z,Initial commit,R/dataset.R | 34 +++++++++++++++++++++++++,R/dataset.R,R,NA,NA,34,25,0,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227,B05Ia_22M_x,b05ia_22m_x-id227 +0667a4755085d32c5d1eb14136cb55bd919137d3,NA,github-classroom[bot],66690702+github-classroom[bot]@users.noreply.github.com,2022-12-05T09:48:33Z,GitHub,noreply@github.com,2022-12-05T09:48:33Z,Initial commit,README.Rmd | 28 +++++++++++++++++++++,README.Rmd,Rmd,NA,NA,28,21,0,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227,B05Ia_22M_x,b05ia_22m_x-id227 +0667a4755085d32c5d1eb14136cb55bd919137d3,NA,github-classroom[bot],66690702+github-classroom[bot]@users.noreply.github.com,2022-12-05T09:48:33Z,GitHub,noreply@github.com,2022-12-05T09:48:33Z,Initial commit,README.md | 61 +++++++++++++++++++++++++++++++++++++++++++++,README.md,md,NA,NA,61,45,0,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227,B05Ia_22M_x,b05ia_22m_x-id227 +0667a4755085d32c5d1eb14136cb55bd919137d3,NA,github-classroom[bot],66690702+github-classroom[bot]@users.noreply.github.com,2022-12-05T09:48:33Z,GitHub,noreply@github.com,2022-12-05T09:48:33Z,Initial commit,data/abies.rds | Bin 0 -> 7092 bytes,data/abies.rds,rds,0,7092,NA,NA,NA,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227,B05Ia_22M_x,b05ia_22m_x-id227 +0667a4755085d32c5d1eb14136cb55bd919137d3,NA,github-classroom[bot],66690702+github-classroom[bot]@users.noreply.github.com,2022-12-05T09:48:33Z,GitHub,noreply@github.com,2022-12-05T09:48:33Z,Initial commit,data/raw/ab.csv | 1 +,data/raw/ab.csv,csv,NA,NA,1,1,0,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227,B05Ia_22M_x,b05ia_22m_x-id227 +0667a4755085d32c5d1eb14136cb55bd919137d3,NA,github-classroom[bot],66690702+github-classroom[bot]@users.noreply.github.com,2022-12-05T09:48:33Z,GitHub,noreply@github.com,2022-12-05T09:48:33Z,Initial commit,docs/x.Rmd | 55 ++++++++++++++++++++++++++++++++++++++++,docs/x.Rmd,Rmd,NA,NA,55,40,0,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227,B05Ia_22M_x,b05ia_22m_x-id227 +0667a4755085d32c5d1eb14136cb55bd919137d3,NA,github-classroom[bot],66690702+github-classroom[bot]@users.noreply.github.com,2022-12-05T09:48:33Z,GitHub,noreply@github.com,2022-12-05T09:48:33Z,Initial commit,docs/biblio.bib | 34 +++++++++++++++++++++++++,docs/biblio.bib,bib,NA,NA,34,25,0,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227,B05Ia_22M_x,b05ia_22m_x-id227 diff --git a/inst/shiny/www/repos/B22M/B05Ia_22M_x/render.csv b/inst/shiny/www/repos/B22M/B05Ia_22M_x/render.csv new file mode 100644 index 0000000..b8601de --- /dev/null +++ b/inst/shiny/www/repos/B22M/B05Ia_22M_x/render.csv @@ -0,0 +1,3 @@ +repo,path,file +b05ia_22m_x-id93,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/docs/x.Rmd,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id93/docs/x.html +b05ia_22m_x-id227,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/docs/x.Rmd,/Volumes/Cuttlefish3/sdd-projects/www/repos/B22M/B05Ia_22M_x/b05ia_22m_x-id227/docs/x.html diff --git a/inst/shiny/www/repositories.csv b/inst/shiny/www/repositories.csv new file mode 100644 index 0000000..1173337 --- /dev/null +++ b/inst/shiny/www/repositories.csv @@ -0,0 +1,3 @@ +full_name,name,url,html_url,git_url,ssh_url,clone_url,private,created_at,pseudo +BioDataScience-Course/b05ia_22m_x-id227,b05ia_22m_x-id227,https://api.github.com/repos/BioDataScience-Course/b05ia_22m_x-id227,https://github.com/BioDataScience-Course/b05ia_22m_x-id227,git://github.com/BioDataScience-Course/b05ia_22m_x-id227.git,git@github.com:BioDataScience-Course/b05ia_22m_x-id227.git,https://github.com/BioDataScience-Course/b05ia_22m_x-id227.git,TRUE,2022-12-05T09:48:32Z,b05ia_22m_x-id227 +BioDataScience-Course/b05ia_22m_x-id93,b05ia_22m_x-id93,https://api.github.com/repos/BioDataScience-Course/b05ia_22m_x-id93,https://github.com/BioDataScience-Course/b05ia_22m_x-id93,git://github.com/BioDataScience-Course/b05ia_22m_x-id93.git,git@github.com:BioDataScience-Course/b05ia_22m_x-id93.git,https://github.com/BioDataScience-Course/b05ia_22m_x-id93.git,TRUE,2022-12-05T09:41:16Z,b05ia_22m_x-id93 diff --git a/inst/shiny/www/templates/B22M/B05Ia_22M_x.csv b/inst/shiny/www/templates/B22M/B05Ia_22M_x.csv new file mode 100755 index 0000000..475167a --- /dev/null +++ b/inst/shiny/www/templates/B22M/B05Ia_22M_x.csv @@ -0,0 +1,12 @@ +file,category,criterion,code,score,max,evaluator,comment +*,common,Remarques générales sur le projet.,,0,0,, +*,common,Réalisation d'au moins un commit.,"(nb_commit(files = ¨docs/x.Rmd¨, cdata = cdata) > 0) - 1",,0,, +docs/x.Rmd,rmarkdown,Compilation du document.,"is_compiled(files = ¨docs/x.Rmd¨, cdata = cdata) -1",,0,, +docs/x.Rmd,rmarkdown,YAML = Entête complète (title+author+date).,,0,0,, +docs/x.Rmd,import,@import = Importation et filtrage 950m < altitude < 1050m.,,,2,, +docs/x.Rmd,dataviz,@p = graphique height ~ diameter.,,,1,, +docs/x.Rmd,statinterpretation,+p = interprétation du graphique.,,,1,, +docs/x.Rmd,model,@model = ajuster le modèle et afficher le résumé.,,,3,, +docs/x.Rmd,statinterpretation,+model = Interprétation et paramétrisation de @model.,,,6,, +docs/x.Rmd,dataviz,@m = Graphique du modèle.,,,2,, +docs/x.Rmd,model,# Discussions et conclusions = Discussion sur l’ajustement d’un modèle.,,,3,, diff --git a/man/check_grids.Rd b/man/check_grids.Rd new file mode 100644 index 0000000..93862ac --- /dev/null +++ b/man/check_grids.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/check_grids.R +\name{check_grids} +\alias{check_grids} +\title{Summarize and check evaluation grids for the learnitgrid Shiny app} +\usage{ +check_grids(dir, save.log = TRUE, save.rds = TRUE) +} +\arguments{ +\item{dir}{The path to the evaluation grids} + +\item{save.log}{Should a log file be saved (yes by default)?} + +\item{save.rds}{Should an RDS file with the data be saved (yes by default)?} +} +\value{ +A data frame with the results of the evaluation grids check for the +learnitgrid Shiny app. +} +\description{ +This function checks all evaluation grids in a correction set and computes +the required statistics for the summary page of the learnitgrid shiny app. +} diff --git a/man/chunk_labels.Rd b/man/chunk_labels.Rd new file mode 100644 index 0000000..5448b0a --- /dev/null +++ b/man/chunk_labels.Rd @@ -0,0 +1,20 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{chunk_labels} +\alias{chunk_labels} +\title{Make proper Rmd/Qmd chunk labels from strings for parsermd::parse_rmd()} +\usage{ +chunk_labels(x) +} +\arguments{ +\item{x}{A character string of chunk labels to convert} +} +\value{ +A character string of the same length as \code{x} with "educated" labels. +} +\description{ +Make proper Rmd/Qmd chunk labels from strings for parsermd::parse_rmd() +} +\examples{ +chunk_labels(c("Summer is hot", "", NA, " ", "Winter is cold ")) +} diff --git a/man/correct_rmd.Rd b/man/correct_rmd.Rd new file mode 100644 index 0000000..5003509 --- /dev/null +++ b/man/correct_rmd.Rd @@ -0,0 +1,17 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{correct_rmd} +\alias{correct_rmd} +\title{Make sure that Rmd/Qmd chunk labels are written without spaces} +\usage{ +correct_rmd(rmd) +} +\arguments{ +\item{rmd}{Character string with the content of a Rmd/Qmd file.} +} +\value{ +The same Rmd/Qmd content, but with "educated" chunk labels. +} +\description{ +Make sure that Rmd/Qmd chunk labels are written without spaces +} diff --git a/man/create_context.Rd b/man/create_context.Rd new file mode 100644 index 0000000..90757d4 --- /dev/null +++ b/man/create_context.Rd @@ -0,0 +1,41 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/create_context.R +\name{create_context} +\alias{create_context} +\title{Create a context object for a correction set} +\usage{ +create_context( + correction, + base_corr_dir, + base_templ_dir, + base_repos_dir, + repositories, + assignments, + github_url, + branch +) +} +\arguments{ +\item{correction}{The correction set} + +\item{base_corr_dir}{The base directory for correction sets} + +\item{base_templ_dir}{The base directory for correction templates} + +\item{base_repos_dir}{The vase directory for GitHub repositories to correct} + +\item{repositories}{The repositories} + +\item{assignments}{The assignments} + +\item{github_url}{The GitHub URL (base part)} + +\item{branch}{The GitHub branch concerned by this correction} +} +\value{ +A list with the context information for the learnitgrid Shiny app. +} +\description{ +Create a list that contains context for a given correction set (must be +recalculated when a different correction set/project is selected). +} diff --git a/man/dir_path_create.Rd b/man/dir_path_create.Rd new file mode 100644 index 0000000..8616478 --- /dev/null +++ b/man/dir_path_create.Rd @@ -0,0 +1,39 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{dir_path_create} +\alias{dir_path_create} +\alias{dir_path_check} +\alias{file_path_check} +\title{Make sure a directory exists, or create it} +\usage{ +dir_path_create(...) + +dir_path_check(...) + +file_path_check(...) +} +\arguments{ +\item{...}{The successive folders that make the path.} +} +\value{ +A \strong{path} object is returned invisibly. +} +\description{ +Make sure a directory exists, or create it +} +\section{Functions}{ +\itemize{ +\item \code{dir_path_check()}: Check that a directory exists. + +\item \code{file_path_check()}: Check that a file exists. + +}} +\examples{ +test_path <- dir_path_create(tempdir(), "dir_path_create_test", "subfolder") +test_path +dir.exists(test_path) # Should be TRUE +dir_path_check(test_path) # Return the path only if it exists +# Remove +unlink(test_path) +unlink(dirname(test_path)) +} diff --git a/man/get_git_stats.Rd b/man/get_git_stats.Rd new file mode 100644 index 0000000..df61f7a --- /dev/null +++ b/man/get_git_stats.Rd @@ -0,0 +1,30 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/get_git_stats.R +\name{get_git_stats} +\alias{get_git_stats} +\title{Summarize the git stats for one or more git repositories} +\usage{ +get_git_stats( + git_stats_file, + exclude_authors = "github-classroom[bot]", + type = "all", + tz = "UTC" +) +} +\arguments{ +\item{git_stats_file}{The path the the git_stats.csv file} + +\item{exclude_authors}{The list of authors to exclude from the stats} + +\item{type}{The type of files to consider ("all", "R", "Rmd", or "Qmd")} + +\item{tz}{The time zone to use for times} +} +\value{ +A data frame with git stats data to be used by the learnitgrid Shiny +app. +} +\description{ +Use data from a git_stats.csv file to get a history of commits +done in a repository for the learnitgrid Shiny app. +} diff --git a/man/learnitgrid-package.Rd b/man/learnitgrid-package.Rd new file mode 100644 index 0000000..30caf9c --- /dev/null +++ b/man/learnitgrid-package.Rd @@ -0,0 +1,45 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/learnitgrid-package.R +\docType{package} +\name{learnitgrid-package} +\alias{learnitgrid} +\alias{learnitgrid-package} +\title{learnitgrid: Manage Rubrics or Assessment Grids for GitHub Repositories} +\description{ +Create and manage semi-automatically rubrics to assess GitHub projects (R scripts, R Markdown or Quarto files). Create directed projects where students have to complete documents and submit them to GitHub (classroom) so that they are evaluated using the rubric (or assessment grid). +} +\details{ +The learnitgrid package allows to create and manage semi-automatically +rubrics to assess GitHub projects (R scripts, R Markdown or Quarto files). +Create directed projects where students have to complete documents and submit +them to GitHub (classroom) so that they are evaluated using the rubric +(or assessment grid). +} +\section{Important functions}{ + +\itemize{ +\item \code{\link[=create_context]{create_context()}} creates a context object (a list) with ... +\item \code{\link[=populate_table]{populate_table()}} computes the content for a \code{DT::datatable()} with the +evaluation grid information. +} +} + +\seealso{ +Useful links: +\itemize{ + \item \url{https://github.com/learnitr/learnitgrid} + \item \url{https://learnitr.github.io/learnitgrid/} + \item Report bugs at \url{https://github.com/learnitr/learnitgrid/issues} +} + +} +\author{ +\strong{Maintainer}: Philippe Grosjean \email{phgrosjean@sciviews.org} (\href{https://orcid.org/0000-0002-2694-9471}{ORCID}) + +Authors: +\itemize{ + \item Guyliann Engels \email{guyliann.engels@umons.ac.be} (\href{https://orcid.org/0000-0001-9514-1014}{ORCID}) +} + +} +\keyword{internal} diff --git a/man/link_to_www.Rd b/man/link_to_www.Rd new file mode 100644 index 0000000..6fb3d1e --- /dev/null +++ b/man/link_to_www.Rd @@ -0,0 +1,30 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{link_to_www} +\alias{link_to_www} +\alias{www_relative} +\title{Create symbolic links under www subdirectory or strip www subdirectory from the path} +\usage{ +link_to_www(path, link) + +www_relative(path) +} +\arguments{ +\item{path}{The (absolute) path containing the documents.} + +\item{link}{The name to use for the symbolic link under the www subdirectory of the Shiny app.} +} +\value{ +\code{TRUE} if the symbolic link exists for \code{\link[=link_to_www]{link_to_www()}} or \code{FALSE} +otherwise. The modified path is returned by\code{\link[=www_relative]{www_relative()}} +} +\description{ +Symbolic links in the www subdirectory of the Shiny app are +required for the application to properly display html documents or images in +html tags. +} +\section{Functions}{ +\itemize{ +\item \code{www_relative()}: Strip www/ in front of the relative paths for a Shiny app. + +}} diff --git a/man/populate_table.Rd b/man/populate_table.Rd new file mode 100644 index 0000000..47bd9dc --- /dev/null +++ b/man/populate_table.Rd @@ -0,0 +1,41 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/populate_table.R +\name{populate_table} +\alias{populate_table} +\title{Computes the content of a DT::datatable for a correction set} +\usage{ +populate_table( + items, + grids = "all", + context, + reorder = (length(items) == 1), + highlight = FALSE, + max_lines = 20L +) +} +\arguments{ +\item{items}{The items of the evaluation grid to display in the table, +usually either one item, or "all" for everything} + +\item{grids}{The evaluation grids to display, usually either "all" if only +one item, or one grid if "all" items} + +\item{context}{A context object as computed by \code{\link[=create_context]{create_context()}}.} + +\item{reorder}{Should the rows in the table be reordered by similarities? +This is usually \code{TRUE} for a single items, or \code{FALSE} otherwise (and it is +computed as such by default).} + +\item{highlight}{Syntax highlighting for code (slow, thus \code{FALSE} by default)} + +\item{max_lines}{The maximum number of content lines that are displayed +(truncate very long contents).} +} +\value{ +A data frame with the content to be displayed in a DT::datatable object. +} +\description{ +The most important function for the learnitgrid Shiny app to fill in the +table according to selected items with a list of grids (or "all") or +according to a selected grid with a list of items (or "all") +}