From 9ee0eeba6ed2df09066b6b926867279e4db7fac5 Mon Sep 17 00:00:00 2001 From: michalovadek <46047818+michalovadek@users.noreply.github.com> Date: Mon, 15 Mar 2021 11:47:54 +0100 Subject: [PATCH] version 0.3.5 --- DESCRIPTION | 3 +- NEWS.md | 2 +- R/elx_make_query.R | 5 +- README.md | 17 +- doc/eurlexpkg.R | 28 +- doc/eurlexpkg.Rmd | 41 +- doc/eurlexpkg.html | 490 ++++++++++-------- docs/404.html | 2 +- docs/articles/eurlexpkg.html | 85 ++- .../figure-html/unnamed-chunk-9-1.png | Bin 9719 -> 56081 bytes .../figure-html/wordcloud-1.png | Bin 30282 -> 30617 bytes docs/articles/index.html | 2 +- docs/authors.html | 2 +- docs/index.html | 23 +- docs/news/index.html | 4 +- docs/pkgdown.yml | 2 +- docs/reference/elx_council_votes.html | 2 +- docs/reference/elx_curia_list.html | 14 +- docs/reference/elx_fetch_data.html | 2 +- docs/reference/elx_label_eurovoc.html | 2 +- docs/reference/elx_make_query.html | 34 +- docs/reference/elx_parse_xml.html | 2 +- docs/reference/elx_run_query.html | 6 +- docs/reference/index.html | 2 +- man/elx_make_query.Rd | 4 +- vignettes/eurlexpkg.Rmd | 32 +- 26 files changed, 492 insertions(+), 314 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 6cc2b3c..9e59232 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -32,7 +32,6 @@ Suggests: tidytext, wordcloud, purrr, - ggplot2, - glue + ggplot2 URL: https://michalovadek.github.io/eurlex/ VignetteBuilder: knitr diff --git a/NEWS.md b/NEWS.md index 2c107f5..99b3bda 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,7 +4,7 @@ - it is now possible to select all resource types available with `elx_make_query(resource_type = "any")`. Since there are nearly 1 million CELEX codes, use with discretion and expect long execution times - results can be restricted to a particular directory code with `elx_make_query(directory = "18")` (directory code "18" denotes Common Foreign and Security Policy) -- results can be restricted to a particular sector with `elx_make_query(sector = 2)` (sector code 3 denotes EU international agreements) +- results can be restricted to a particular sector with `elx_make_query(sector = 2)` (sector code 2 denotes EU international agreements) ## Minor changes diff --git a/R/elx_make_query.R b/R/elx_make_query.R index b72251b..756e983 100644 --- a/R/elx_make_query.R +++ b/R/elx_make_query.R @@ -1,8 +1,8 @@ -#' Create SPARQL quries +#' Create SPARQL queries #' #' Generates pre-defined or manual SPARQL queries to retrieve document ids from Cellar. #' List of available resource types: http://publications.europa.eu/resource/authority/resource-type . -#' Note that not all resource types are compatible with the pre-defined query. +#' Note that not all resource types are compatible with default parameter values. #' #' @importFrom magrittr %>% #' @@ -46,6 +46,7 @@ elx_make_query <- function(resource_type = c("directive","regulation","decision" include_directory = FALSE, include_sector = FALSE, order = FALSE, limit = NULL){ + if (missing(resource_type)) stop("'resource_type' must be defined") if (!resource_type %in% c("any","directive","regulation","decision","recommendation","intagr","caselaw","manual","proposal","national_impl")) stop("'resource_type' must be defined") if (resource_type == "manual" & nchar(manual_type) < 2){ diff --git a/README.md b/README.md index d384a33..51d079c 100644 --- a/README.md +++ b/README.md @@ -26,11 +26,11 @@ For the moment, it is recommended to retrieve metadata one variable at a time. F 2. `dates <- elx_make_query("directive", include_date_transpos = TRUE) %>% elx_run_query()` 3. `ids %>% dplyr::left_join(lbs) %>% dplyr::left_join(dates)` -rather than `elx_make_query("directive", include_lbs = TRUE, include_date_transpos = TRUE)`. This approach should make it easier to understand the returned data frame(s), especially when some variables contain missing or duplicated data. +rather than `elx_make_query("directive", include_lbs = TRUE, include_date_transpos = TRUE)`. This approach should make it easier to understand the returned data frame(s), especially when some variables contain missing or duplicated data. Always keep an eye on whether the `work` and `celex` columns identify rows uniquely or not. One of the main contributions of the SPARQL requests is that we obtain a comprehensive list of identifiers that we can subsequently use to obtain more data relating to the document in question. While the results of the SPARQL queries are useful also for webscraping (with the `rvest` package), the function `elx_fetch_data()` enables us to fire GET requests to retrieve data on documents with known identifiers (including Cellar URI). The function currently enables downloading the title and the full text of a document in all available languages. -See the [vignette](https://michalovadek.github.io/eurlex/articles/eurlexpkg.html) for a walkthrough on how to use the package. Check function documentation for most up-to-date overview of features. +See the [vignette](https://michalovadek.github.io/eurlex/articles/eurlexpkg.html) for a walkthrough on how to use the package. Check function documentation for most up-to-date overview of features. Example use cases are shown in this [paper](https://www.tandfonline.com/doi/full/10.1080/2474736X.2020.1870150). ## Cite Michal Ovádek (2021) Facilitating access to data on European Union laws, Political Research Exchange, 3:1, DOI: [10.1080/2474736X.2020.1870150](https://www.tandfonline.com/doi/full/10.1080/2474736X.2020.1870150) @@ -40,6 +40,19 @@ This package nor its author are in any way affiliated with the EU Publications O Please consider contributing to the maintanance and development of the package by reporting bugs or suggesting new features. +## Latest changes + +### eurlex 0.3.5 + +- it is now possible to select all resource types available with `elx_make_query(resource_type = "any")`. Since there are nearly 1 million CELEX codes, use with discretion and expect long execution times +- results can be restricted to a particular directory code with `elx_make_query(directory = "18")` (directory code "18" denotes Common Foreign and Security Policy) +- results can be restricted to a particular sector with `elx_make_query(sector = 2)` (sector code 2 denotes EU international agreements) + +- new feature: request date of court case submission `elx_make_query(include_date_lodged = TRUE)` +- new feature: request type of court procedure and outcome `elx_make_query(include_court_procedure = TRUE)` +- new feature: request directory code of legal act `elx_make_query(include_directory = TRUE)` +- `elx_curia_list()` has a new default parameter `parse = TRUE` which creates separate columns for `ecli`, `see_case`, `appeal` applying regular expressions on `case_info` + ## Useful resources Guide to CELEX numbers: https://eur-lex.europa.eu/content/tools/TableOfSectors/types_of_documents_in_eurlex.html diff --git a/doc/eurlexpkg.R b/doc/eurlexpkg.R index 488fba1..fb4df0b 100644 --- a/doc/eurlexpkg.R +++ b/doc/eurlexpkg.R @@ -17,27 +17,36 @@ results <- dirs %>% select(-force,-date) ## ----------------------------------------------------------------------------- query_dir %>% - glue::as_glue() # for nicer printing + cat() # for nicer printing elx_make_query(resource_type = "caselaw") %>% - glue::as_glue() + cat() elx_make_query(resource_type = "manual", manual_type = "SWD") %>% - glue::as_glue() + cat() ## ----------------------------------------------------------------------------- elx_make_query(resource_type = "directive", include_date = TRUE, include_force = TRUE) %>% - glue::as_glue() + cat() # minimal query: elx_make_query(resource_type = "directive") elx_make_query(resource_type = "recommendation", include_date = TRUE, include_lbs = TRUE) %>% - glue::as_glue() + cat() # minimal query: elx_make_query(resource_type = "recommendation") +## ----------------------------------------------------------------------------- +# request documents from directory 18 ("Common Foreign and Security Policy") +# and sector 3 ("Legal acts") + +elx_make_query(resource_type = "any", + directory = "18", + sector = 3) %>% + cat() + ## ----runquery, eval=FALSE----------------------------------------------------- # results <- elx_run_query(query = query_dir) # @@ -65,18 +74,14 @@ rec_eurovoc %>% ## ----eurovoctable------------------------------------------------------------- - eurovoc_lookup <- elx_label_eurovoc(uri_eurovoc = rec_eurovoc$eurovoc) print(eurovoc_lookup) - ## ----appendlabs--------------------------------------------------------------- - rec_eurovoc %>% left_join(eurovoc_lookup) - ## ----------------------------------------------------------------------------- eurovoc_lookup <- elx_label_eurovoc(uri_eurovoc = rec_eurovoc$eurovoc, alt_labels = TRUE, @@ -86,7 +91,6 @@ rec_eurovoc %>% left_join(eurovoc_lookup) %>% select(celex, eurovoc, labels) - ## ----getdatapur, message = FALSE, warning=FALSE, error=FALSE------------------ # the function is not vectorized by default elx_fetch_data(results$work[1],"title") @@ -117,7 +121,9 @@ dirs %>% ## ----------------------------------------------------------------------------- dirs %>% - ggplot(aes(x = as.Date(date), y = celex)) + + filter(!is.na(force)) %>% + mutate(date = as.Date(date)) %>% + ggplot(aes(x = date, y = celex)) + geom_point(aes(color = force), alpha = 0.1) + theme(axis.text.y = element_blank(), axis.line.y = element_blank(), diff --git a/doc/eurlexpkg.Rmd b/doc/eurlexpkg.Rmd index 7258dbd..05b1e3d 100644 --- a/doc/eurlexpkg.Rmd +++ b/doc/eurlexpkg.Rmd @@ -2,7 +2,7 @@ title: "eurlex: Retrieve data on European Union law in R" output: rmarkdown::html_vignette description: > - Retrieve efficiently tidy data on European Union law in R with + Retrieve data on European Union law in R with pre-defined SPARQL and REST queries. vignette: > %\VignetteIndexEntry{eurlex: Retrieve data on European Union law in R} @@ -29,6 +29,8 @@ The `eurlex` R package attempts to significantly reduce the overhead associated The `eurlex` package currently envisions the typical use-case to consist of getting bulk information about EU legislation into R as fast as possible. The package contains three core functions to achieve that objective: `elx_make_query()` to create pre-defined or customized SPARQL queries; `elx_run_query()` to execute the pre-made or any other manually input query; and `elx_fetch_data()` to fire GET requests for certain metadata to the REST API. +The package also contains largely self-explanatory functions for retrieving data on EU court cases (`elx_curia_list()`) and Council votes (`elx_council_votes()`) from outside Eur-Lex. + ## `elx_make_query()`: Generate SPARQL queries The function `elx_make_query` takes as its first argument the type of resource to be retrieved from the semantic database that powers Eur-Lex (and other publications) called Cellar. @@ -55,13 +57,13 @@ The choice of resource type is then reflected in the SPARQL query generated by t ```{r} query_dir %>% - glue::as_glue() # for nicer printing + cat() # for nicer printing elx_make_query(resource_type = "caselaw") %>% - glue::as_glue() + cat() elx_make_query(resource_type = "manual", manual_type = "SWD") %>% - glue::as_glue() + cat() ``` @@ -69,21 +71,33 @@ There are various ways of querying the same information in the Cellar database d The other arguments in `elx_make_query()` relate to additional metadata to be returned. The results include by default the [CELEX number](https://eur-lex.europa.eu/content/tools/TableOfSectors/types_of_documents_in_eurlex.html) and exclude corrigenda (corrections of errors in legislation). Other data needs to be opted into. Make sure to select ones that are logically compatible (e.g. case law does not have a legal basis). More options should be added in the future. -Note that availability of data for each variable has an impact on the results. The data frame returned by the query will be shrunken to the size of the variable with most missing data. It is recommended to always compare results from a desired query to a minimal query requesting only celex ids. +Note that availability of data for each variable might have an impact on the results. The data frame returned by the query might be shrunken to the size of the variable with most missing data. It is recommended to always compare results from a desired query to a minimal query requesting only celex ids. ```{r} elx_make_query(resource_type = "directive", include_date = TRUE, include_force = TRUE) %>% - glue::as_glue() + cat() # minimal query: elx_make_query(resource_type = "directive") elx_make_query(resource_type = "recommendation", include_date = TRUE, include_lbs = TRUE) %>% - glue::as_glue() + cat() # minimal query: elx_make_query(resource_type = "recommendation") ``` +You can also decide to not specify any resource types, in which case all types of documents will be returned. As there are over a million documents with a CELEX identifier, this is likely not efficient for a majority of users. But since version 0.3.5 it is possible to request documents belonging to a particular ["sector"](https://eur-lex.europa.eu/content/tools/TableOfSectors/types_of_documents_in_eurlex.html) or [directory code](https://eur-lex.europa.eu/browse/directories/legislation.html). + +```{r} +# request documents from directory 18 ("Common Foreign and Security Policy") +# and sector 3 ("Legal acts") + +elx_make_query(resource_type = "any", + directory = "18", + sector = 3) %>% + cat() +``` + Now that we have a query, we are ready to run it. ## `elx_run_query()`: Execute SPARQL queries @@ -135,20 +149,16 @@ rec_eurovoc %>% By default, the endpoint returns the EuroVoc concept codes rather than the labels (keywords). The function `elx_label_eurovoc()` needs to be called to obtain a look-up table with the labels. ```{r eurovoctable} - eurovoc_lookup <- elx_label_eurovoc(uri_eurovoc = rec_eurovoc$eurovoc) print(eurovoc_lookup) - ``` The results include labels only for unique identifiers, but with `dplyr::left_join()` it is straightforward to append the labels to the entire dataset. ```{r appendlabs} - rec_eurovoc %>% left_join(eurovoc_lookup) - ``` As elsewhere in the API, we can tap into the multilingual nature of EU documents also when it comes to the EuroVoc keywords. Moreover, most concepts in the thesaurus are associated with alternative labels; these can be returned as well (separated by a comma). @@ -161,7 +171,6 @@ eurovoc_lookup <- elx_label_eurovoc(uri_eurovoc = rec_eurovoc$eurovoc, rec_eurovoc %>% left_join(eurovoc_lookup) %>% select(celex, eurovoc, labels) - ``` ## `elx_fetch_data()`: Fire GET requests @@ -186,7 +195,7 @@ print(dir_titles) ``` -Note that text requests are by far the most time-intensive; requesting the full text for thousands of documents is liable to extend the run-time into hours. Currently, no method for downloading text in non-html/plain formats is implemented, which means pdf-only texts will be missing from the results.^[It is worth pointing out that the html and pdf contents of older case law differs. Whereas typically the html file is only going to contain a summary and grounds of a judgment, the pdf should also contain background to the dispute.] +Note that text requests are by far the most time-intensive; requesting the full text for thousands of documents is liable to extend the run-time into hours. Texts are retrieved from html by priority, but methods for pdfs and .docs are also implemented.^[It is worth pointing out that the html and pdf contents of older case law differs. Whereas typically the html file is only going to contain a summary and grounds of a judgment, the pdf should also contain background to the dispute.] The function even handles multi-document resources (by pasting them together). # Application @@ -213,7 +222,9 @@ Directives become naturally outdated with time. It might be all the more interes ```{r} dirs %>% - ggplot(aes(x = as.Date(date), y = celex)) + + filter(!is.na(force)) %>% + mutate(date = as.Date(date)) %>% + ggplot(aes(x = date, y = celex)) + geom_point(aes(color = force), alpha = 0.1) + theme(axis.text.y = element_blank(), axis.line.y = element_blank(), @@ -251,6 +262,6 @@ dirs_1970_title %>% I use term-frequency inverse-document frequency (tf-idf) to weight the importance of the words in the wordcloud. If we used pure frequencies, the wordcloud would largely consist of words conveying little meaning ("the", "and", ...). -This is an extremely basic application of the `eurlex` package. Much more sophisticated methods can be used to analyse both the content and metadata of European Union legislation. If the package is useful for your research, please consider citing it. +This is an extremely basic application of the `eurlex` package. Much more sophisticated methods can be used to analyse both the content and metadata of European Union legislation. If the package is useful for your research, please consider citing the [accompanying paper](https://www.tandfonline.com/doi/full/10.1080/2474736X.2020.1870150).^[Michal Ovádek (2021) Facilitating access to data on European Union laws, Political Research Exchange, 3:1, DOI: [10.1080/2474736X.2020.1870150](https://www.tandfonline.com/doi/full/10.1080/2474736X.2020.1870150)] diff --git a/doc/eurlexpkg.html b/doc/eurlexpkg.html index b4098ba..495b333 100644 --- a/doc/eurlexpkg.html +++ b/doc/eurlexpkg.html @@ -311,6 +311,7 @@

Introduction

The eurlex package

The eurlex package currently envisions the typical use-case to consist of getting bulk information about EU legislation into R as fast as possible. The package contains three core functions to achieve that objective: elx_make_query() to create pre-defined or customized SPARQL queries; elx_run_query() to execute the pre-made or any other manually input query; and elx_fetch_data() to fire GET requests for certain metadata to the REST API.

+

The package also contains largely self-explanatory functions for retrieving data on EU court cases (elx_curia_list()) and Council votes (elx_council_votes()) from outside Eur-Lex.

elx_make_query(): Generate SPARQL queries

The function elx_make_query takes as its first argument the type of resource to be retrieved from the semantic database that powers Eur-Lex (and other publications) called Cellar.

@@ -321,266 +322,306 @@

elx_make_query(): Generate SPARQL queries

Currently, it is possible to choose from among a host of resource types, including directives, regulations and even case law (see function description for the full list). It is also possible to manually specify a resource type from the eligible list.1

The choice of resource type is then reflected in the SPARQL query generated by the function:

query_dir %>% 
-  glue::as_glue() # for nicer printing
+  cat() # for nicer printing
 #> PREFIX cdm: <http://publications.europa.eu/ontology/cdm#>
-#>   PREFIX skos:<http://www.w3.org/2004/02/skos/core#>
-#>   PREFIX dc:<http://purl.org/dc/elements/1.1/>
-#>   PREFIX xsd:<http://www.w3.org/2001/XMLSchema#>
-#>   PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
-#>   PREFIX owl:<http://www.w3.org/2002/07/owl#>
-#>   select distinct ?work ?type ?celex where{ ?work cdm:work_has_resource-type ?type. FILTER(?type=<http://publications.europa.eu/resource/authority/resource-type/DIR>||
-#>   ?type=<http://publications.europa.eu/resource/authority/resource-type/DIR_IMPL>||
-#>   ?type=<http://publications.europa.eu/resource/authority/resource-type/DIR_DEL>) 
-#>  FILTER not exists{?work cdm:work_has_resource-type <http://publications.europa.eu/resource/authority/resource-type/CORRIGENDUM>} ?work cdm:resource_legal_id_celex ?celex. }
-
-elx_make_query(resource_type = "caselaw") %>% 
-  glue::as_glue()
-#> PREFIX cdm: <http://publications.europa.eu/ontology/cdm#>
-#>   PREFIX skos:<http://www.w3.org/2004/02/skos/core#>
-#>   PREFIX dc:<http://purl.org/dc/elements/1.1/>
-#>   PREFIX xsd:<http://www.w3.org/2001/XMLSchema#>
-#>   PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
-#>   PREFIX owl:<http://www.w3.org/2002/07/owl#>
-#>   select distinct ?work ?type ?celex where{ ?work cdm:work_has_resource-type ?type. FILTER(?type=<http://publications.europa.eu/resource/authority/resource-type/JUDG>||
-#>   ?type=<http://publications.europa.eu/resource/authority/resource-type/ORDER>||
-#>   ?type=<http://publications.europa.eu/resource/authority/resource-type/OPIN_JUR>||
-#>   ?type=<http://publications.europa.eu/resource/authority/resource-type/THIRDPARTY_PROCEED>||
-#>   ?type=<http://publications.europa.eu/resource/authority/resource-type/GARNISHEE_ORDER>||
-#>   ?type=<http://publications.europa.eu/resource/authority/resource-type/RULING>||
-#>   ?type=<http://publications.europa.eu/resource/authority/resource-type/JUDG_EXTRACT>||
-#>   ?type=<http://publications.europa.eu/resource/authority/resource-type/INFO_JUDICIAL>||
-#>   ?type=<http://publications.europa.eu/resource/authority/resource-type/VIEW_AG>||
-#>   ?type=<http://publications.europa.eu/resource/authority/resource-type/OPIN_AG>) ?work cdm:resource_legal_id_celex ?celex. }
-
-elx_make_query(resource_type = "manual", manual_type = "SWD") %>% 
-  glue::as_glue()
-#> PREFIX cdm: <http://publications.europa.eu/ontology/cdm#>
-#>   PREFIX skos:<http://www.w3.org/2004/02/skos/core#>
-#>   PREFIX dc:<http://purl.org/dc/elements/1.1/>
-#>   PREFIX xsd:<http://www.w3.org/2001/XMLSchema#>
-#>   PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
-#>   PREFIX owl:<http://www.w3.org/2002/07/owl#>
-#>   select distinct ?work ?type ?celex where{ ?work cdm:work_has_resource-type ?type.FILTER(?type=<http://publications.europa.eu/resource/authority/resource-type/SWD>) 
-#>  FILTER not exists{?work cdm:work_has_resource-type <http://publications.europa.eu/resource/authority/resource-type/CORRIGENDUM>} ?work cdm:resource_legal_id_celex ?celex. }
+#> PREFIX annot: <http://publications.europa.eu/ontology/annotation#> +#> PREFIX skos:<http://www.w3.org/2004/02/skos/core#> +#> PREFIX dc:<http://purl.org/dc/elements/1.1/> +#> PREFIX xsd:<http://www.w3.org/2001/XMLSchema#> +#> PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> +#> PREFIX owl:<http://www.w3.org/2002/07/owl#> +#> select distinct ?work ?type ?celex where{ ?work cdm:work_has_resource-type ?type. FILTER(?type=<http://publications.europa.eu/resource/authority/resource-type/DIR>|| +#> ?type=<http://publications.europa.eu/resource/authority/resource-type/DIR_IMPL>|| +#> ?type=<http://publications.europa.eu/resource/authority/resource-type/DIR_DEL>) +#> FILTER not exists{?work cdm:work_has_resource-type <http://publications.europa.eu/resource/authority/resource-type/CORRIGENDUM>} OPTIONAL{?work cdm:resource_legal_id_celex ?celex.} } + +elx_make_query(resource_type = "caselaw") %>% + cat() +#> PREFIX cdm: <http://publications.europa.eu/ontology/cdm#> +#> PREFIX annot: <http://publications.europa.eu/ontology/annotation#> +#> PREFIX skos:<http://www.w3.org/2004/02/skos/core#> +#> PREFIX dc:<http://purl.org/dc/elements/1.1/> +#> PREFIX xsd:<http://www.w3.org/2001/XMLSchema#> +#> PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> +#> PREFIX owl:<http://www.w3.org/2002/07/owl#> +#> select distinct ?work ?type ?celex where{ ?work cdm:work_has_resource-type ?type. FILTER(?type=<http://publications.europa.eu/resource/authority/resource-type/JUDG>|| +#> ?type=<http://publications.europa.eu/resource/authority/resource-type/ORDER>|| +#> ?type=<http://publications.europa.eu/resource/authority/resource-type/OPIN_JUR>|| +#> ?type=<http://publications.europa.eu/resource/authority/resource-type/THIRDPARTY_PROCEED>|| +#> ?type=<http://publications.europa.eu/resource/authority/resource-type/GARNISHEE_ORDER>|| +#> ?type=<http://publications.europa.eu/resource/authority/resource-type/RULING>|| +#> ?type=<http://publications.europa.eu/resource/authority/resource-type/JUDG_EXTRACT>|| +#> ?type=<http://publications.europa.eu/resource/authority/resource-type/INFO_JUDICIAL>|| +#> ?type=<http://publications.europa.eu/resource/authority/resource-type/VIEW_AG>|| +#> ?type=<http://publications.europa.eu/resource/authority/resource-type/OPIN_AG>) OPTIONAL{?work cdm:resource_legal_id_celex ?celex.} } + +elx_make_query(resource_type = "manual", manual_type = "SWD") %>% + cat() +#> PREFIX cdm: <http://publications.europa.eu/ontology/cdm#> +#> PREFIX annot: <http://publications.europa.eu/ontology/annotation#> +#> PREFIX skos:<http://www.w3.org/2004/02/skos/core#> +#> PREFIX dc:<http://purl.org/dc/elements/1.1/> +#> PREFIX xsd:<http://www.w3.org/2001/XMLSchema#> +#> PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> +#> PREFIX owl:<http://www.w3.org/2002/07/owl#> +#> select distinct ?work ?type ?celex where{ ?work cdm:work_has_resource-type ?type.FILTER(?type=<http://publications.europa.eu/resource/authority/resource-type/SWD>) +#> FILTER not exists{?work cdm:work_has_resource-type <http://publications.europa.eu/resource/authority/resource-type/CORRIGENDUM>} OPTIONAL{?work cdm:resource_legal_id_celex ?celex.} }

There are various ways of querying the same information in the Cellar database due to the existence of several overlapping classes and identifiers describing the same resources. The queries generated by the function should offer a reliable way of obtaining exhaustive results, as they have been validated by the helpdesk of the Publication Office. At the same time, it is always possible there will be issues either on the query or the database side; please report any you encounter through Github.

The other arguments in elx_make_query() relate to additional metadata to be returned. The results include by default the CELEX number and exclude corrigenda (corrections of errors in legislation). Other data needs to be opted into. Make sure to select ones that are logically compatible (e.g. case law does not have a legal basis). More options should be added in the future.

-

Note that availability of data for each variable has an impact on the results. The data frame returned by the query will be shrunken to the size of the variable with most missing data. It is recommended to always compare results from a desired query to a minimal query requesting only celex ids.

+

Note that availability of data for each variable might have an impact on the results. The data frame returned by the query might be shrunken to the size of the variable with most missing data. It is recommended to always compare results from a desired query to a minimal query requesting only celex ids.

elx_make_query(resource_type = "directive", include_date = TRUE, include_force = TRUE) %>% 
-  glue::as_glue()
+  cat()
 #> PREFIX cdm: <http://publications.europa.eu/ontology/cdm#>
-#>   PREFIX skos:<http://www.w3.org/2004/02/skos/core#>
-#>   PREFIX dc:<http://purl.org/dc/elements/1.1/>
-#>   PREFIX xsd:<http://www.w3.org/2001/XMLSchema#>
-#>   PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
-#>   PREFIX owl:<http://www.w3.org/2002/07/owl#>
-#>   select distinct ?work ?type ?celex str(?date) ?force where{ ?work cdm:work_has_resource-type ?type. FILTER(?type=<http://publications.europa.eu/resource/authority/resource-type/DIR>||
-#>   ?type=<http://publications.europa.eu/resource/authority/resource-type/DIR_IMPL>||
-#>   ?type=<http://publications.europa.eu/resource/authority/resource-type/DIR_DEL>) 
-#>  FILTER not exists{?work cdm:work_has_resource-type <http://publications.europa.eu/resource/authority/resource-type/CORRIGENDUM>} ?work cdm:resource_legal_id_celex ?celex. ?work cdm:work_date_document ?date. ?work cdm:resource_legal_in-force ?force. }
-
-# minimal query: elx_make_query(resource_type = "directive")
-
-elx_make_query(resource_type = "recommendation", include_date = TRUE, include_lbs = TRUE) %>% 
-  glue::as_glue()
-#> PREFIX cdm: <http://publications.europa.eu/ontology/cdm#>
-#>   PREFIX skos:<http://www.w3.org/2004/02/skos/core#>
-#>   PREFIX dc:<http://purl.org/dc/elements/1.1/>
-#>   PREFIX xsd:<http://www.w3.org/2001/XMLSchema#>
-#>   PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
-#>   PREFIX owl:<http://www.w3.org/2002/07/owl#>
-#>   select distinct ?work ?type ?celex str(?date) ?lbs ?lbcelex where{ ?work cdm:work_has_resource-type ?type. FILTER(?type=<http://publications.europa.eu/resource/authority/resource-type/RECO>||
-#>                    ?type=<http://publications.europa.eu/resource/authority/resource-type/RECO_DEC>||
-#>                    ?type=<http://publications.europa.eu/resource/authority/resource-type/RECO_DIR>||
-#>                    ?type=<http://publications.europa.eu/resource/authority/resource-type/RECO_OPIN>||
-#>                    ?type=<http://publications.europa.eu/resource/authority/resource-type/RECO_RES>||
-#>                    ?type=<http://publications.europa.eu/resource/authority/resource-type/RECO_REG>||
-#>                    ?type=<http://publications.europa.eu/resource/authority/resource-type/RECO_RECO>||
-#>                    ?type=<http://publications.europa.eu/resource/authority/resource-type/RECO_DRAFT>) 
-#>  FILTER not exists{?work cdm:work_has_resource-type <http://publications.europa.eu/resource/authority/resource-type/CORRIGENDUM>} ?work cdm:resource_legal_id_celex ?celex. ?work cdm:work_date_document ?date. ?work cdm:resource_legal_based_on_resource_legal ?lbs.
-#>                    ?lbs cdm:resource_legal_id_celex ?lbcelex. }
-
-# minimal query: elx_make_query(resource_type = "recommendation")
+#> PREFIX annot: <http://publications.europa.eu/ontology/annotation#> +#> PREFIX skos:<http://www.w3.org/2004/02/skos/core#> +#> PREFIX dc:<http://purl.org/dc/elements/1.1/> +#> PREFIX xsd:<http://www.w3.org/2001/XMLSchema#> +#> PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> +#> PREFIX owl:<http://www.w3.org/2002/07/owl#> +#> select distinct ?work ?type ?celex str(?date) ?force where{ ?work cdm:work_has_resource-type ?type. FILTER(?type=<http://publications.europa.eu/resource/authority/resource-type/DIR>|| +#> ?type=<http://publications.europa.eu/resource/authority/resource-type/DIR_IMPL>|| +#> ?type=<http://publications.europa.eu/resource/authority/resource-type/DIR_DEL>) +#> FILTER not exists{?work cdm:work_has_resource-type <http://publications.europa.eu/resource/authority/resource-type/CORRIGENDUM>} OPTIONAL{?work cdm:resource_legal_id_celex ?celex.} OPTIONAL{?work cdm:work_date_document ?date.} OPTIONAL{?work cdm:resource_legal_in-force ?force.} } + +# minimal query: elx_make_query(resource_type = "directive") + +elx_make_query(resource_type = "recommendation", include_date = TRUE, include_lbs = TRUE) %>% + cat() +#> PREFIX cdm: <http://publications.europa.eu/ontology/cdm#> +#> PREFIX annot: <http://publications.europa.eu/ontology/annotation#> +#> PREFIX skos:<http://www.w3.org/2004/02/skos/core#> +#> PREFIX dc:<http://purl.org/dc/elements/1.1/> +#> PREFIX xsd:<http://www.w3.org/2001/XMLSchema#> +#> PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> +#> PREFIX owl:<http://www.w3.org/2002/07/owl#> +#> select distinct ?work ?type ?celex str(?date) ?lbs ?lbcelex ?lbsuffix where{ ?work cdm:work_has_resource-type ?type. FILTER(?type=<http://publications.europa.eu/resource/authority/resource-type/RECO>|| +#> ?type=<http://publications.europa.eu/resource/authority/resource-type/RECO_DEC>|| +#> ?type=<http://publications.europa.eu/resource/authority/resource-type/RECO_DIR>|| +#> ?type=<http://publications.europa.eu/resource/authority/resource-type/RECO_OPIN>|| +#> ?type=<http://publications.europa.eu/resource/authority/resource-type/RECO_RES>|| +#> ?type=<http://publications.europa.eu/resource/authority/resource-type/RECO_REG>|| +#> ?type=<http://publications.europa.eu/resource/authority/resource-type/RECO_RECO>|| +#> ?type=<http://publications.europa.eu/resource/authority/resource-type/RECO_DRAFT>) +#> FILTER not exists{?work cdm:work_has_resource-type <http://publications.europa.eu/resource/authority/resource-type/CORRIGENDUM>} OPTIONAL{?work cdm:resource_legal_id_celex ?celex.} OPTIONAL{?work cdm:work_date_document ?date.} OPTIONAL{?work cdm:resource_legal_based_on_resource_legal ?lbs. +#> ?lbs cdm:resource_legal_id_celex ?lbcelex. +#> OPTIONAL{?bn owl:annotatedSource ?work. +#> ?bn owl:annotatedProperty <http://publications.europa.eu/ontology/cdm#resource_legal_based_on_resource_legal>. +#> ?bn owl:annotatedTarget ?lbs. +#> ?bn annot:comment_on_legal_basis ?lbsuffix}} } + +# minimal query: elx_make_query(resource_type = "recommendation")
+

You can also decide to not specify any resource types, in which case all types of documents will be returned. As there are over a million documents with a CELEX identifier, this is likely not efficient for a majority of users. But since version 0.3.5 it is possible to request documents belonging to a particular “sector” or directory code.

+
# request documents from directory 18 ("Common Foreign and Security Policy")
+# and sector 3 ("Legal acts")
+
+elx_make_query(resource_type = "any",
+               directory = "18",
+               sector = 3) %>% 
+  cat()
+#> PREFIX cdm: <http://publications.europa.eu/ontology/cdm#>
+#>   PREFIX annot: <http://publications.europa.eu/ontology/annotation#>
+#>   PREFIX skos:<http://www.w3.org/2004/02/skos/core#>
+#>   PREFIX dc:<http://purl.org/dc/elements/1.1/>
+#>   PREFIX xsd:<http://www.w3.org/2001/XMLSchema#>
+#>   PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
+#>   PREFIX owl:<http://www.w3.org/2002/07/owl#>
+#>   select distinct ?work ?type ?celex where{
+#>     VALUES (?value)
+#>     { (<http://publications.europa.eu/resource/authority/fd_555/18>)
+#>       (<http://publications.europa.eu/resource/authority/dir-eu-legal-act/18>)
+#>     }
+#>     {?work cdm:resource_legal_is_about_concept_directory-code ?value.
+#>     }
+#>     UNION
+#>     {?work cdm:resource_legal_is_about_concept_directory-code ?directory.
+#>       ?value skos:narrower+ ?directory.
+#>     }
+#>     
+#>     ?work cdm:resource_legal_id_sector ?sector.
+#>     FILTER(str(?sector)='3')
+#>      
+#>  FILTER not exists{?work cdm:work_has_resource-type <http://publications.europa.eu/resource/authority/resource-type/CORRIGENDUM>} OPTIONAL{?work cdm:resource_legal_id_celex ?celex.} }

Now that we have a query, we are ready to run it.

elx_run_query(): Execute SPARQL queries

elx_run_query() sends SPARQL queries to a pre-specified endpoint. The function takes the query string as the main argument, which means you can manually pass it any working SPARQL query (relevant to official EU publications).

-
results <- elx_run_query(query = query_dir)
-
-# the functions are compatible with piping
-# 
-# elx_make_query("directive") %>% 
-#   elx_run_query()
-
as_tibble(results)
-#> # A tibble: 4,192 x 3
-#>   work                                   type                            celex  
-#>   <chr>                                  <chr>                           <chr>  
-#> 1 http://publications.europa.eu/resourc~ http://publications.europa.eu/~ 31979L~
-#> 2 http://publications.europa.eu/resourc~ http://publications.europa.eu/~ 31989L~
-#> 3 http://publications.europa.eu/resourc~ http://publications.europa.eu/~ 31984L~
-#> 4 http://publications.europa.eu/resourc~ http://publications.europa.eu/~ 31966L~
-#> # ... with 4,188 more rows
+
results <- elx_run_query(query = query_dir)
+
+# the functions are compatible with piping
+# 
+# elx_make_query("directive") %>% 
+#   elx_run_query()
+
as_tibble(results)
+#> # A tibble: 4,317 x 3
+#>   work                                   type                            celex  
+#>   <chr>                                  <chr>                           <chr>  
+#> 1 http://publications.europa.eu/resourc~ http://publications.europa.eu/~ 31979L~
+#> 2 http://publications.europa.eu/resourc~ http://publications.europa.eu/~ 31989L~
+#> 3 http://publications.europa.eu/resourc~ http://publications.europa.eu/~ 31984L~
+#> 4 http://publications.europa.eu/resourc~ http://publications.europa.eu/~ 31966L~
+#> # ... with 4,313 more rows

The function outputs a data.frame where each column corresponds to one of the requested variables, while the rows accumulate observations of the resource type satisfying the query criteria. Obviously, the more data is to be returned, the longer the execution time, varying from a few seconds to several minutes, depending also on your connection.

The first column always contains the unique URI of a “work” (legislative act or court judgment) which identifies each resource in Cellar. Several human-readable identifiers are normally associated with each “work” but the most useful one is CELEX, retrieved by default.2

One column you should always pay attention to is type (as in resource_type). The URIs contained there reflect the FILTER argument in the SPARQL query, which is manually pre-specified. All resources are indexed as being of one type or another. For example, when retrieving directives, the results are going to return also delegated directives, which might not be desirable, depending on your needs. You can filter results by type to make the necessary adjustments. The queries are expansive by default in the spirit of erring on the side of over-inclusiveness rather than vice versa.

-
head(results$type,5)
-#> [1] "http://publications.europa.eu/resource/authority/resource-type/DIR"
-#> [2] "http://publications.europa.eu/resource/authority/resource-type/DIR"
-#> [3] "http://publications.europa.eu/resource/authority/resource-type/DIR"
-#> [4] "http://publications.europa.eu/resource/authority/resource-type/DIR"
-#> [5] "http://publications.europa.eu/resource/authority/resource-type/DIR"
-
-results %>% 
-  distinct(type)
-#> # A tibble: 3 x 1
-#>   type                                                                   
-#>   <chr>                                                                  
-#> 1 http://publications.europa.eu/resource/authority/resource-type/DIR     
-#> 2 http://publications.europa.eu/resource/authority/resource-type/DIR_IMPL
-#> 3 http://publications.europa.eu/resource/authority/resource-type/DIR_DEL
+
head(results$type,5)
+#> [1] "http://publications.europa.eu/resource/authority/resource-type/DIR"
+#> [2] "http://publications.europa.eu/resource/authority/resource-type/DIR"
+#> [3] "http://publications.europa.eu/resource/authority/resource-type/DIR"
+#> [4] "http://publications.europa.eu/resource/authority/resource-type/DIR"
+#> [5] "http://publications.europa.eu/resource/authority/resource-type/DIR"
+
+results %>% 
+  distinct(type)
+#> # A tibble: 3 x 1
+#>   type                                                                   
+#>   <chr>                                                                  
+#> 1 http://publications.europa.eu/resource/authority/resource-type/DIR     
+#> 2 http://publications.europa.eu/resource/authority/resource-type/DIR_IMPL
+#> 3 http://publications.europa.eu/resource/authority/resource-type/DIR_DEL

The data is returned in the long format, which means that rows are recycled up to the length of the variable with the most data points. For example, if 20 directives are returned, each with two legal bases, the resulting data.frame will have 40 rows. Some variables, such as dates, contain unexpectedly several entries for some documents. You should always check the number of unique identifiers in the results instead of assuming that each row is a unique observation.

EuroVoc descriptors

EuroVoc is a multilingual thesaurus, keywords from which are used to describe the content of European Union documents. Most resource types that can be retrieved with the pre-defined queries in this package can be accompanied by EuroVoc keywords and these can be retrieved as other variables.

- -

By default, the endpoint returns the EuroVoc concept codes rather than the labels (keywords). The function elx_label_eurovoc() needs to be called to obtain a look-up table with the labels.

+rec_eurovoc <- elx_make_query("recommendation", include_eurovoc = TRUE, limit = 10) %>% + elx_run_query() # truncated results for sake of the example + +rec_eurovoc %>% + select(celex, eurovoc) +#> # A tibble: 10 x 2 +#> celex eurovoc +#> <chr> <chr> +#> 1 32012H0090 http://eurovoc.europa.eu/1425 +#> 2 31962H0816 http://eurovoc.europa.eu/1004 +#> 3 31974H0435 http://eurovoc.europa.eu/1085 +#> 4 31996H0592 http://eurovoc.europa.eu/1076 +#> # ... with 6 more rows
+

By default, the endpoint returns the EuroVoc concept codes rather than the labels (keywords). The function elx_label_eurovoc() needs to be called to obtain a look-up table with the labels.

+
eurovoc_lookup <- elx_label_eurovoc(uri_eurovoc = rec_eurovoc$eurovoc)
+
+print(eurovoc_lookup)
+#> # A tibble: 9 x 2
+#>   eurovoc                       labels         
+#>   <chr>                         <chr>          
+#> 1 http://eurovoc.europa.eu/1085 France         
+#> 2 http://eurovoc.europa.eu/1442 food inspection
+#> 3 http://eurovoc.europa.eu/1076 form           
+#> 4 http://eurovoc.europa.eu/1318 Germany        
+#> # ... with 5 more rows

The results include labels only for unique identifiers, but with dplyr::left_join() it is straightforward to append the labels to the entire dataset.

-

-rec_eurovoc %>% 
-  left_join(eurovoc_lookup)
-#> Joining, by = "eurovoc"
-#> # A tibble: 10 x 5
-#>   work                      type                   celex    eurovoc      labels 
-#>   <chr>                     <chr>                  <chr>    <chr>        <chr>  
-#> 1 http://publications.euro~ http://publications.e~ 31962H0~ http://euro~ welfare
-#> 2 http://publications.euro~ http://publications.e~ 32015H0~ http://euro~ tax sy~
-#> 3 http://publications.euro~ http://publications.e~ 32016H0~ http://euro~ tax sy~
-#> 4 http://publications.euro~ http://publications.e~ 32017H0~ http://euro~ tax sy~
-#> # ... with 6 more rows
+
rec_eurovoc %>% 
+  left_join(eurovoc_lookup)
+#> Joining, by = "eurovoc"
+#> # A tibble: 10 x 5
+#>   work                      type                   celex  eurovoc      labels   
+#>   <chr>                     <chr>                  <chr>  <chr>        <chr>    
+#> 1 http://publications.euro~ http://publications.e~ 32012~ http://euro~ consumer~
+#> 2 http://publications.euro~ http://publications.e~ 31962~ http://euro~ welfare  
+#> 3 http://publications.euro~ http://publications.e~ 31974~ http://euro~ France   
+#> 4 http://publications.euro~ http://publications.e~ 31996~ http://euro~ form     
+#> # ... with 6 more rows

As elsewhere in the API, we can tap into the multilingual nature of EU documents also when it comes to the EuroVoc keywords. Moreover, most concepts in the thesaurus are associated with alternative labels; these can be returned as well (separated by a comma).

-
eurovoc_lookup <- elx_label_eurovoc(uri_eurovoc = rec_eurovoc$eurovoc,
-                                    alt_labels = TRUE,
-                                    language = "sk")
-
-rec_eurovoc %>% 
-  left_join(eurovoc_lookup) %>% 
-  select(celex, eurovoc, labels)
-#> Joining, by = "eurovoc"
-#> # A tibble: 10 x 3
-#>   celex          eurovoc                       labels                      
-#>   <chr>          <chr>                         <chr>                       
-#> 1 31962H0816     http://eurovoc.europa.eu/1004 blahobyt                    
-#> 2 32015H0818(10) http://eurovoc.europa.eu/1021 danová sústava,danový systém
-#> 3 32016H0818(09) http://eurovoc.europa.eu/1021 danová sústava,danový systém
-#> 4 32017H0809(10) http://eurovoc.europa.eu/1021 danová sústava,danový systém
-#> # ... with 6 more rows
+
eurovoc_lookup <- elx_label_eurovoc(uri_eurovoc = rec_eurovoc$eurovoc,
+                                    alt_labels = TRUE,
+                                    language = "sk")
+
+rec_eurovoc %>% 
+  left_join(eurovoc_lookup) %>% 
+  select(celex, eurovoc, labels)
+#> Joining, by = "eurovoc"
+#> # A tibble: 10 x 3
+#>   celex     eurovoc                   labels                                    
+#>   <chr>     <chr>                     <chr>                                     
+#> 1 32012H00~ http://eurovoc.europa.eu~ informácie pre spotrebitela,vzdelávanie s~
+#> 2 31962H08~ http://eurovoc.europa.eu~ blahobyt                                  
+#> 3 31974H04~ http://eurovoc.europa.eu~ Francúzska republika,Francúzsko           
+#> 4 31996H05~ http://eurovoc.europa.eu~ formulár                                  
+#> # ... with 6 more rows

elx_fetch_data(): Fire GET requests

A core contribution of the SPARQL requests is that we obtain a comprehensive list of identifiers that we can subsequently use to obtain more data relating to the document in question. While the results of the SPARQL queries are useful also for webscraping (with the rvest package), the function elx_fetch_data() enables us to fire GET requests to retrieve data on documents with known identifiers (including Cellar URI).

One of the most sought-after data in the Eur-Lex dataverse is the text. It is possible now to automate the pipeline for downloading html and plain texts from Eur-Lex. Similarly, you can retrieve the title of the document. For both you can specify also the desired language (English by default). Other metadata might be added in the future.

-
# the function is not vectorized by default
-elx_fetch_data(results$work[1],"title")
-#> [1] "Council Directive 79/173/EEC of 6 February 1979 on the programme for the acceleration and guidance of collective irrigation works in Corsica"
-
-# we can use purrr::map() to play that role
-library(purrr)
-
-dir_titles <- results[1:10,] %>% # take the first 10 directives only to save time
-  mutate(title = map_chr(work,elx_fetch_data, "title")) %>% 
-  as_tibble() %>% 
-  select(celex, title)
-
-print(dir_titles)
-#> # A tibble: 10 x 2
-#>   celex      title                                                              
-#>   <chr>      <chr>                                                              
-#> 1 31979L0173 Council Directive 79/173/EEC of 6 February 1979 on the programme f~
-#> 2 31989L0194 Council Directive 89/194/EEC of 13 March 1989 amending Directive 6~
-#> 3 31984L0378 Council Directive 84/378/EEC of 28 June 1984 amending the Annexes ~
-#> 4 31966L0683 Commission Directive 66/683/EEC of 7 November 1966 eliminating all~
-#> # ... with 6 more rows
-

Note that text requests are by far the most time-intensive; requesting the full text for thousands of documents is liable to extend the run-time into hours. Currently, no method for downloading text in non-html/plain formats is implemented, which means pdf-only texts will be missing from the results.3

+
# the function is not vectorized by default
+elx_fetch_data(results$work[1],"title")
+#> [1] "Council Directive 79/173/EEC of 6 February 1979 on the programme for the acceleration and guidance of collective irrigation works in Corsica"
+
+# we can use purrr::map() to play that role
+library(purrr)
+
+dir_titles <- results[1:10,] %>% # take the first 10 directives only to save time
+  mutate(title = map_chr(work,elx_fetch_data, "title")) %>% 
+  as_tibble() %>% 
+  select(celex, title)
+
+print(dir_titles)
+#> # A tibble: 10 x 2
+#>   celex      title                                                              
+#>   <chr>      <chr>                                                              
+#> 1 31979L0173 Council Directive 79/173/EEC of 6 February 1979 on the programme f~
+#> 2 31989L0194 Council Directive 89/194/EEC of 13 March 1989 amending Directive 6~
+#> 3 31984L0378 Council Directive 84/378/EEC of 28 June 1984 amending the Annexes ~
+#> 4 31966L0683 Commission Directive 66/683/EEC of 7 November 1966 eliminating all~
+#> # ... with 6 more rows
+

Note that text requests are by far the most time-intensive; requesting the full text for thousands of documents is liable to extend the run-time into hours. Texts are retrieved from html by priority, but methods for pdfs and .docs are also implemented.3 The function even handles multi-document resources (by pasting them together).

Application

In this section I showcase a simple application of eurlex on making overviews of EU legislation. First, we collate data on directives.

-
dirs <- elx_make_query(resource_type = "directive", include_date = TRUE, include_force = TRUE) %>% 
-  elx_run_query() %>% 
-  rename(date = `callret-3`)
+
dirs <- elx_make_query(resource_type = "directive", include_date = TRUE, include_force = TRUE) %>% 
+  elx_run_query() %>% 
+  rename(date = `callret-3`)

Let’s calculate the proportion of directives currently in force in the entire set of directives ever adopted. This variable offers a particularly good demonstration of the usefulness of the package to retrieve EU law data, because it changes every day, as new acts enter into force and old ones drop out. Regularly scraping webpages for this purpose and scale is simply impractical and disproportional.

-
library(ggplot2)
-
-dirs %>% 
-  count(force) %>% 
-  ggplot(aes(x = force, y = n)) +
-  geom_col()
-

+
library(ggplot2)
+
+dirs %>% 
+  count(force) %>% 
+  ggplot(aes(x = force, y = n)) +
+  geom_col()
+

Directives become naturally outdated with time. It might be all the more interesting to see which older acts are thus still surviving.

-
dirs %>% 
-  ggplot(aes(x = as.Date(date), y = celex)) +
-  geom_point(aes(color = force), alpha = 0.1) +
-  theme(axis.text.y = element_blank(),
-        axis.line.y = element_blank(),
-        axis.ticks.y = element_blank())
-

+
dirs %>% 
+  filter(!is.na(force)) %>% 
+  mutate(date = as.Date(date)) %>% 
+  ggplot(aes(x = date, y = celex)) +
+  geom_point(aes(color = force), alpha = 0.1) +
+  theme(axis.text.y = element_blank(),
+        axis.line.y = element_blank(),
+        axis.ticks.y = element_blank())
+

We want to know a bit more about the directives from 1970s that are still in force today. Their titles could give us a clue.

-
dirs_1970_title <- dirs %>% 
-  filter(between(as.Date(date), as.Date("1970-01-01"), as.Date("1980-01-01")),
-         force == "true") %>% 
-  mutate(title = map_chr(work,elx_fetch_data,"title")) %>% 
-  as_tibble()
-
-print(dirs_1970_title)
-#> # A tibble: 78 x 6
-#>   work                 type               celex  date  force title              
-#>   <chr>                <chr>              <chr>  <chr> <chr> <chr>              
-#> 1 http://publications~ http://publicatio~ 31975~ 1975~ true  Council Directive ~
-#> 2 http://publications~ http://publicatio~ 31977~ 1977~ true  First Commission D~
-#> 3 http://publications~ http://publicatio~ 31977~ 1977~ true  Council Directive ~
-#> 4 http://publications~ http://publicatio~ 31973~ 1973~ true  Council Directive ~
-#> # ... with 74 more rows
+
dirs_1970_title <- dirs %>% 
+  filter(between(as.Date(date), as.Date("1970-01-01"), as.Date("1980-01-01")),
+         force == "true") %>% 
+  mutate(title = map_chr(work,elx_fetch_data,"title")) %>% 
+  as_tibble()
+
+print(dirs_1970_title)
+#> # A tibble: 70 x 6
+#>   work                 type               celex  date  force title              
+#>   <chr>                <chr>              <chr>  <chr> <chr> <chr>              
+#> 1 http://publications~ http://publicatio~ 31975~ 1975~ true  Council Directive ~
+#> 2 http://publications~ http://publicatio~ 31977~ 1977~ true  First Commission D~
+#> 3 http://publications~ http://publicatio~ 31977~ 1977~ true  Council Directive ~
+#> 4 http://publications~ http://publicatio~ 31973~ 1973~ true  Council Directive ~
+#> # ... with 66 more rows

I will use the tidytext package to get a quick idea of what the legislation is about.

-
library(tidytext)
-library(wordcloud)
-
-dirs_1970_title %>% 
-  select(celex,title) %>% 
-  unnest_tokens(word, title) %>% 
-  count(celex, word, sort = TRUE) %>% 
-  filter(!grepl("\\d", word)) %>% 
-  bind_tf_idf(word, celex, n) %>% 
-  with(wordcloud(word, tf_idf, max.words = 40, scale = c(1.8,0.1)))
-

+
library(tidytext)
+library(wordcloud)
+
+dirs_1970_title %>% 
+  select(celex,title) %>% 
+  unnest_tokens(word, title) %>% 
+  count(celex, word, sort = TRUE) %>% 
+  filter(!grepl("\\d", word)) %>% 
+  bind_tf_idf(word, celex, n) %>% 
+  with(wordcloud(word, tf_idf, max.words = 40, scale = c(1.8,0.1)))
+

I use term-frequency inverse-document frequency (tf-idf) to weight the importance of the words in the wordcloud. If we used pure frequencies, the wordcloud would largely consist of words conveying little meaning (“the”, “and”, …).

-

This is an extremely basic application of the eurlex package. Much more sophisticated methods can be used to analyse both the content and metadata of European Union legislation. If the package is useful for your research, please consider citing it.

+

This is an extremely basic application of the eurlex package. Much more sophisticated methods can be used to analyse both the content and metadata of European Union legislation. If the package is useful for your research, please consider citing the accompanying paper.4


@@ -588,6 +629,7 @@

Application

  • Note, however, that not all resource types will work properly with the pre-specified query.

  • Occasionally, you may encounter legal acts without CELEX numbers, especially when digging through older legislation. It is good to report these to the Eur-Lex helpdesk.

  • It is worth pointing out that the html and pdf contents of older case law differs. Whereas typically the html file is only going to contain a summary and grounds of a judgment, the pdf should also contain background to the dispute.

  • +
  • Michal Ovádek (2021) Facilitating access to data on European Union laws, Political Research Exchange, 3:1, DOI: 10.1080/2474736X.2020.1870150

  • diff --git a/docs/404.html b/docs/404.html index 45cec7e..21866c3 100644 --- a/docs/404.html +++ b/docs/404.html @@ -79,7 +79,7 @@ eurlex - 0.3.4 + 0.3.5 diff --git a/docs/articles/eurlexpkg.html b/docs/articles/eurlexpkg.html index 5739615..dfc9641 100644 --- a/docs/articles/eurlexpkg.html +++ b/docs/articles/eurlexpkg.html @@ -39,7 +39,7 @@ eurlex - 0.3.4 + 0.3.5 @@ -105,6 +105,7 @@

    The eurlex package

    The eurlex package currently envisions the typical use-case to consist of getting bulk information about EU legislation into R as fast as possible. The package contains three core functions to achieve that objective: elx_make_query() to create pre-defined or customized SPARQL queries; elx_run_query() to execute the pre-made or any other manually input query; and elx_fetch_data() to fire GET requests for certain metadata to the REST API.

    +

    The package also contains largely self-explanatory functions for retrieving data on EU court cases (elx_curia_list()) and Council votes (elx_council_votes()) from outside Eur-Lex.

    elx_make_query(): Generate SPARQL queries

    @@ -116,7 +117,7 @@

    Currently, it is possible to choose from among a host of resource types, including directives, regulations and even case law (see function description for the full list). It is also possible to manually specify a resource type from the eligible list.1

    The choice of resource type is then reflected in the SPARQL query generated by the function:

    query_dir %>%
    -  glue::as_glue() # for nicer printing
    +  cat() # for nicer printing
     #> PREFIX cdm: <http://publications.europa.eu/ontology/cdm#>
     #>   PREFIX annot: <http://publications.europa.eu/ontology/annotation#>
     #>   PREFIX skos:<http://www.w3.org/2004/02/skos/core#>
    @@ -130,7 +131,7 @@ 

    #> FILTER not exists{?work cdm:work_has_resource-type <http://publications.europa.eu/resource/authority/resource-type/CORRIGENDUM>} OPTIONAL{?work cdm:resource_legal_id_celex ?celex.} } elx_make_query(resource_type = "caselaw") %>% - glue::as_glue() + cat() #> PREFIX cdm: <http://publications.europa.eu/ontology/cdm#> #> PREFIX annot: <http://publications.europa.eu/ontology/annotation#> #> PREFIX skos:<http://www.w3.org/2004/02/skos/core#> @@ -150,7 +151,7 @@

    #> ?type=<http://publications.europa.eu/resource/authority/resource-type/OPIN_AG>) OPTIONAL{?work cdm:resource_legal_id_celex ?celex.} } elx_make_query(resource_type = "manual", manual_type = "SWD") %>% - glue::as_glue() + cat() #> PREFIX cdm: <http://publications.europa.eu/ontology/cdm#> #> PREFIX annot: <http://publications.europa.eu/ontology/annotation#> #> PREFIX skos:<http://www.w3.org/2004/02/skos/core#> @@ -162,9 +163,9 @@

    #> FILTER not exists{?work cdm:work_has_resource-type <http://publications.europa.eu/resource/authority/resource-type/CORRIGENDUM>} OPTIONAL{?work cdm:resource_legal_id_celex ?celex.} }

    There are various ways of querying the same information in the Cellar database due to the existence of several overlapping classes and identifiers describing the same resources. The queries generated by the function should offer a reliable way of obtaining exhaustive results, as they have been validated by the helpdesk of the Publication Office. At the same time, it is always possible there will be issues either on the query or the database side; please report any you encounter through Github.

    The other arguments in elx_make_query() relate to additional metadata to be returned. The results include by default the CELEX number and exclude corrigenda (corrections of errors in legislation). Other data needs to be opted into. Make sure to select ones that are logically compatible (e.g. case law does not have a legal basis). More options should be added in the future.

    -

    Note that availability of data for each variable has an impact on the results. The data frame returned by the query will be shrunken to the size of the variable with most missing data. It is recommended to always compare results from a desired query to a minimal query requesting only celex ids.

    +

    Note that availability of data for each variable might have an impact on the results. The data frame returned by the query might be shrunken to the size of the variable with most missing data. It is recommended to always compare results from a desired query to a minimal query requesting only celex ids.

    elx_make_query(resource_type = "directive", include_date = TRUE, include_force = TRUE) %>%
    -  glue::as_glue()
    +  cat()
     #> PREFIX cdm: <http://publications.europa.eu/ontology/cdm#>
     #>   PREFIX annot: <http://publications.europa.eu/ontology/annotation#>
     #>   PREFIX skos:<http://www.w3.org/2004/02/skos/core#>
    @@ -180,7 +181,7 @@ 

    # minimal query: elx_make_query(resource_type = "directive") elx_make_query(resource_type = "recommendation", include_date = TRUE, include_lbs = TRUE) %>% - glue::as_glue() + cat() #> PREFIX cdm: <http://publications.europa.eu/ontology/cdm#> #> PREFIX annot: <http://publications.europa.eu/ontology/annotation#> #> PREFIX skos:<http://www.w3.org/2004/02/skos/core#> @@ -204,31 +205,62 @@

    #> ?bn annot:comment_on_legal_basis ?lbsuffix}} } # minimal query: elx_make_query(resource_type = "recommendation")

    +

    You can also decide to not specify any resource types, in which case all types of documents will be returned. As there are over a million documents with a CELEX identifier, this is likely not efficient for a majority of users. But since version 0.3.5 it is possible to request documents belonging to a particular “sector” or directory code.

    +
    # request documents from directory 18 ("Common Foreign and Security Policy")
    +# and sector 3 ("Legal acts")
    +
    +elx_make_query(resource_type = "any",
    +               directory = "18",
    +               sector = 3) %>%
    +  cat()
    +#> PREFIX cdm: <http://publications.europa.eu/ontology/cdm#>
    +#>   PREFIX annot: <http://publications.europa.eu/ontology/annotation#>
    +#>   PREFIX skos:<http://www.w3.org/2004/02/skos/core#>
    +#>   PREFIX dc:<http://purl.org/dc/elements/1.1/>
    +#>   PREFIX xsd:<http://www.w3.org/2001/XMLSchema#>
    +#>   PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    +#>   PREFIX owl:<http://www.w3.org/2002/07/owl#>
    +#>   select distinct ?work ?type ?celex where{
    +#>     VALUES (?value)
    +#>     { (<http://publications.europa.eu/resource/authority/fd_555/18>)
    +#>       (<http://publications.europa.eu/resource/authority/dir-eu-legal-act/18>)
    +#>     }
    +#>     {?work cdm:resource_legal_is_about_concept_directory-code ?value.
    +#>     }
    +#>     UNION
    +#>     {?work cdm:resource_legal_is_about_concept_directory-code ?directory.
    +#>       ?value skos:narrower+ ?directory.
    +#>     }
    +#>     
    +#>     ?work cdm:resource_legal_id_sector ?sector.
    +#>     FILTER(str(?sector)='3')
    +#>      
    +#>  FILTER not exists{?work cdm:work_has_resource-type <http://publications.europa.eu/resource/authority/resource-type/CORRIGENDUM>} OPTIONAL{?work cdm:resource_legal_id_celex ?celex.} }

    Now that we have a query, we are ready to run it.

    elx_run_query(): Execute SPARQL queries

    elx_run_query() sends SPARQL queries to a pre-specified endpoint. The function takes the query string as the main argument, which means you can manually pass it any working SPARQL query (relevant to official EU publications).

    -
    results <- elx_run_query(query = query_dir)
    +
    results <- elx_run_query(query = query_dir)
     
     # the functions are compatible with piping
     # 
     # elx_make_query("directive") %>% 
     #   elx_run_query()
    -
    as_tibble(results)
    -#> # A tibble: 4,316 x 3
    +
    as_tibble(results)
    +#> # A tibble: 4,317 x 3
     #>   work                                   type                            celex  
     #>   <chr>                                  <chr>                           <chr>  
     #> 1 http://publications.europa.eu/resourc~ http://publications.europa.eu/~ 31979L~
     #> 2 http://publications.europa.eu/resourc~ http://publications.europa.eu/~ 31989L~
     #> 3 http://publications.europa.eu/resourc~ http://publications.europa.eu/~ 31984L~
     #> 4 http://publications.europa.eu/resourc~ http://publications.europa.eu/~ 31966L~
    -#> # ... with 4,312 more rows
    +#> # ... with 4,313 more rows

    The function outputs a data.frame where each column corresponds to one of the requested variables, while the rows accumulate observations of the resource type satisfying the query criteria. Obviously, the more data is to be returned, the longer the execution time, varying from a few seconds to several minutes, depending also on your connection.

    The first column always contains the unique URI of a “work” (legislative act or court judgment) which identifies each resource in Cellar. Several human-readable identifiers are normally associated with each “work” but the most useful one is CELEX, retrieved by default.2

    One column you should always pay attention to is type (as in resource_type). The URIs contained there reflect the FILTER argument in the SPARQL query, which is manually pre-specified. All resources are indexed as being of one type or another. For example, when retrieving directives, the results are going to return also delegated directives, which might not be desirable, depending on your needs. You can filter results by type to make the necessary adjustments. The queries are expansive by default in the spirit of erring on the side of over-inclusiveness rather than vice versa.

    -
    head(results$type,5)
    +
    head(results$type,5)
     #> [1] "http://publications.europa.eu/resource/authority/resource-type/DIR"
     #> [2] "http://publications.europa.eu/resource/authority/resource-type/DIR"
     #> [3] "http://publications.europa.eu/resource/authority/resource-type/DIR"
    @@ -248,7 +280,7 @@ 

    EuroVoc descriptors

    EuroVoc is a multilingual thesaurus, keywords from which are used to describe the content of European Union documents. Most resource types that can be retrieved with the pre-defined queries in this package can be accompanied by EuroVoc keywords and these can be retrieved as other variables.

    -
    +
     rec_eurovoc <- elx_make_query("recommendation", include_eurovoc = TRUE, limit = 10) %>%
       elx_run_query() # truncated results for sake of the example
     
    @@ -263,7 +295,7 @@ 

    #> 4 31996H0592 http://eurovoc.europa.eu/1076 #> # ... with 6 more rows

    By default, the endpoint returns the EuroVoc concept codes rather than the labels (keywords). The function elx_label_eurovoc() needs to be called to obtain a look-up table with the labels.

    -
    eurovoc_lookup <- elx_label_eurovoc(uri_eurovoc = rec_eurovoc$eurovoc)
    +
    eurovoc_lookup <- elx_label_eurovoc(uri_eurovoc = rec_eurovoc$eurovoc)
     
     print(eurovoc_lookup)
     #> # A tibble: 9 x 2
    @@ -275,7 +307,7 @@ 

    #> 4 http://eurovoc.europa.eu/1318 Germany #> # ... with 5 more rows

    The results include labels only for unique identifiers, but with dplyr::left_join() it is straightforward to append the labels to the entire dataset.

    -
    rec_eurovoc %>%
    +
    rec_eurovoc %>%
       left_join(eurovoc_lookup)
     #> Joining, by = "eurovoc"
     #> # A tibble: 10 x 5
    @@ -287,7 +319,7 @@ 

    #> 4 http://publications.euro~ http://publications.e~ 31996~ http://euro~ form #> # ... with 6 more rows

    As elsewhere in the API, we can tap into the multilingual nature of EU documents also when it comes to the EuroVoc keywords. Moreover, most concepts in the thesaurus are associated with alternative labels; these can be returned as well (separated by a comma).

    -
    eurovoc_lookup <- elx_label_eurovoc(uri_eurovoc = rec_eurovoc$eurovoc,
    +
    eurovoc_lookup <- elx_label_eurovoc(uri_eurovoc = rec_eurovoc$eurovoc,
                                         alt_labels = TRUE,
                                         language = "sk")
     
    @@ -310,7 +342,7 @@ 

    elx_fetch_data(): Fire GET requests

    A core contribution of the SPARQL requests is that we obtain a comprehensive list of identifiers that we can subsequently use to obtain more data relating to the document in question. While the results of the SPARQL queries are useful also for webscraping (with the rvest package), the function elx_fetch_data() enables us to fire GET requests to retrieve data on documents with known identifiers (including Cellar URI).

    One of the most sought-after data in the Eur-Lex dataverse is the text. It is possible now to automate the pipeline for downloading html and plain texts from Eur-Lex. Similarly, you can retrieve the title of the document. For both you can specify also the desired language (English by default). Other metadata might be added in the future.

    -
    # the function is not vectorized by default
    +
    # the function is not vectorized by default
     elx_fetch_data(results$work[1],"title")
     #> [1] "Council Directive 79/173/EEC of 6 February 1979 on the programme for the acceleration and guidance of collective irrigation works in Corsica"
     
    @@ -338,11 +370,11 @@ 

    Application

    In this section I showcase a simple application of eurlex on making overviews of EU legislation. First, we collate data on directives.

    -
    dirs <- elx_make_query(resource_type = "directive", include_date = TRUE, include_force = TRUE) %>%
    +
    dirs <- elx_make_query(resource_type = "directive", include_date = TRUE, include_force = TRUE) %>%
       elx_run_query() %>%
       rename(date = `callret-3`)

    Let’s calculate the proportion of directives currently in force in the entire set of directives ever adopted. This variable offers a particularly good demonstration of the usefulness of the package to retrieve EU law data, because it changes every day, as new acts enter into force and old ones drop out. Regularly scraping webpages for this purpose and scale is simply impractical and disproportional.

    -
    library(ggplot2)
    +
    library(ggplot2)
     
     dirs %>%
       count(force) %>%
    @@ -350,15 +382,17 @@ 

    geom_col()

    Directives become naturally outdated with time. It might be all the more interesting to see which older acts are thus still surviving.

    -
    dirs %>%
    -  ggplot(aes(x = as.Date(date), y = celex)) +
    +
    dirs %>%
    +  filter(!is.na(force)) %>%
    +  mutate(date = as.Date(date)) %>%
    +  ggplot(aes(x = date, y = celex)) +
       geom_point(aes(color = force), alpha = 0.1) +
       theme(axis.text.y = element_blank(),
             axis.line.y = element_blank(),
             axis.ticks.y = element_blank())
    -

    +

    We want to know a bit more about the directives from 1970s that are still in force today. Their titles could give us a clue.

    -
    dirs_1970_title <- dirs %>%
    +
    dirs_1970_title <- dirs %>%
       filter(between(as.Date(date), as.Date("1970-01-01"), as.Date("1980-01-01")),
              force == "true") %>%
       mutate(title = map_chr(work,elx_fetch_data,"title")) %>%
    @@ -374,7 +408,7 @@ 

    #> 4 http://publications~ http://publicatio~ 31973~ 1973~ true Council Directive ~ #> # ... with 66 more rows

    I will use the tidytext package to get a quick idea of what the legislation is about.

    -
    library(tidytext)
    +
    library(tidytext)
     library(wordcloud)
     
     dirs_1970_title %>%
    @@ -386,7 +420,7 @@ 

    with(wordcloud(word, tf_idf, max.words = 40, scale = c(1.8,0.1)))

    I use term-frequency inverse-document frequency (tf-idf) to weight the importance of the words in the wordcloud. If we used pure frequencies, the wordcloud would largely consist of words conveying little meaning (“the”, “and”, …).

    -

    This is an extremely basic application of the eurlex package. Much more sophisticated methods can be used to analyse both the content and metadata of European Union legislation. If the package is useful for your research, please consider citing it.

    +

    This is an extremely basic application of the eurlex package. Much more sophisticated methods can be used to analyse both the content and metadata of European Union legislation. If the package is useful for your research, please consider citing the accompanying paper.4


    @@ -394,6 +428,7 @@

  • Note, however, that not all resource types will work properly with the pre-specified query.

  • Occasionally, you may encounter legal acts without CELEX numbers, especially when digging through older legislation. It is good to report these to the Eur-Lex helpdesk.

  • It is worth pointing out that the html and pdf contents of older case law differs. Whereas typically the html file is only going to contain a summary and grounds of a judgment, the pdf should also contain background to the dispute.

  • +
  • Michal Ovádek (2021) Facilitating access to data on European Union laws, Political Research Exchange, 3:1, DOI: 10.1080/2474736X.2020.1870150

  • diff --git a/docs/articles/eurlexpkg_files/figure-html/unnamed-chunk-9-1.png b/docs/articles/eurlexpkg_files/figure-html/unnamed-chunk-9-1.png index 8f93a1014e68a600b0a417adbd54a19cff0423d4..e7a0faf45fbe53d8ce055cb56bc98cab8c43d50a 100644 GIT binary patch literal 56081 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 yQmAWMR_i(i_`((R;Z18mTb6Mw<&;$VF_;g1A literal 9719 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%0DkPO`fk%g|E)>irLjEEFLHRAogA~B5Pqu%s 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 Qd#xbK^6GNsGDZRa1(N}Z=l}o! literal 30282 zcmeFYg9p&)Y2i+A&V@bh2AQ_Ht|D*?0*Qe@wjePvkQh)VfoyF-wm{heJOv(!fo$);xqks4lEiFn z#cYAHMJy>vED0!AZ2xO)`(HiayZhGvU2JWWY?FX@i!D&6rNy=dDDRTQKuP~mNwNhc z*@`6rl>jpL6@ga^@R!sAlq*R<&6Sp+9Tt!+z^SW6O6-q*XQ_ur+Z zWu>L%?!Lv!N()f=4!B!sxw~6Q5?e{KU10J zmE{%>6y?#|$6xuHT$#ajTrw~V=gnjOLt0cRNl&ZA?_fyp@~~K5;9V&R@YR2}nR{o8 zcjXU=_!dQ(z;(h*V9+QA`cnyY0i&nbYXA2m=t^ip{+lbUs~NuDHz_-vILBR~BKxp* z|MUI%8!GDu23__Rgm9zu8qv&7O&jNK`m5K zl-xrnibE_)WgpO&$`jUup|Y7GM72~~`8zprv;4`GpgKT{S%`*7Cw`l>CFQ5mTMt%= z6Oniw<&BDGfRFMB4_1Dp676)rQ9i`(5yk?#nW;7%r>4xFO&cTPuKQK~iB9R!Gjo_r zgN8D_)j6g`P6(t|XX^P2QrbrYvr=EnehqNtyqydMnuBF z8V8mk18c?Er6OLIRQu_uI%q!kai9b*a`HNOx)ehj;5s)}-eJRAa0rA|IlgbFUIz9R z5=!BA0v?k*?Fv63~xYOnv;(iEKoI(YG9PGLMrZA!-C-a zUt;~X1LAj@{N>APM9w!(AchgMTG znpjNuK&M&sI;J-m2@y>Y&4>tQ|xc_ra(&%%e=%&Zs<5QBH!Yz5JoJ z2)FsT8p_!7v!3n&_2{1=pQM;DfMHoX-~`yhD7nHI7=${lZJ6zpQijxF*H?j?oHXSh z-pJV9k{7gT8ovnx)o6-^KP1oDNfJS|(Y45-Uk}7swsq8N3{BC_xlw(wB*H;rtFeZb z(NikK`+WYJc!c`}k9PpI#*dz^fT1f@iYZlzRRdG#a4Mhu^S1gJ$F>>6s4{E#$FqPw zX?TOpCsX?4(A-r$&3FDyY*j$8Cfqu0lnPlJe65G(--ISClJ7Ie!o^t-dWj#lox5%} z)`yzE=})l$H3x=2lwL`>A|Fil2#9@+r_p_)v$`l&#JbFaw&h-SdN^u21S$p=iLd~D z{vG1tJI8b}I|uJW=^&d1Y+Nky&mVp z2$Ln?;{YMCS0+!!Du-@lK5h-{y&R3Iql^;Kih}Mh9t*qx)ycq^M*n`e>mgMW*kex6 z+Sr&pLV5{!w&$dp=)*iEP0laAf&~}7nZQKr^H7&}1A9*v#RJ}v8EL?Ti{d6n(urK% zz2H+Flz1F6bWxOHaF)yovRc3CNa>(!hoDM^jr6xx9knn$n`kQ6WWAwUg6zwT5O$#B zAh6r#5oG$CPpEwfeNFgY1I@Rr^d}?wBw|Hz+uIpLs82Tb{h`?I55)m_$J~6;;Qw!D z&rEt)uFcXp2(wnymMx2{c9i3t>U*{$h~OL&BbY26wEuWN743fc4rRJ=xe% zJ0=g=&7=$g1q1a9cwR=#uH_rD2`87ZSF<=vBG7oh<;+wquZ8w!YKk?aT&{%%dhIKe z2ajn}+a3MhN5vzD*H!IIzKH~1hCo6R`AXRPS7fdy6!ny?BNrItu6MhYnq$?W7i{1A zXCO7lZ=5y)t7sp70H!6$S)(i@>+nxRO)!(>f>Zm8yn+CV3%3!cOgULXm0aN#pFf@- z>%MOY7yhOJ#_}n+dNeefU?AIabru?E{Y0yax4&^|uDr#X2~5G0?~7BcN!z_Y=HD3e z%HVf{n*yU*ge(m(u}(8dl)*dzdzsxWBK;5`CqS_(B$)-`)Yei@m=8bf$p9ub*tPTq zCojo)#1r%x4Xi8+|CmisT^{fWScVpj!1dRPz4YMyjpY9q^aw@je3mE*6(S7CjKpUT4F8G`zSU1<04-2*R6C{ zV=lyOFaPTBpFrm+MEFV%r{mP0zw6NQhSm8PC?cZ8$H%Ko!{~#up z)g4kN2^YoDlMTp{XMZlGk2mi2aUbMuAx?i{Wk#Su+&F-QG-z`tYxE7OQF61I|LYFm z{m}gLq4Z{te)Nllci+)=W^Xj$IJ)MiH=9P=lSg4iwT1lG7@eQrFG<~~Dv%LumfyYl z!6?=@d#?BZx%;3xxyL~U)}tI$avsrIq*7(cgQPET3{NLQ)n8pKUe`$<3s3(}%(FSn z75Bw0THZJv9M9vNTrBueF4l-0%yz$mr(#e&i!EMJK8LVrWOKz>6Nbk*Mz8MskI{K0 zDDGPi^%@txG7$trn^v~E8QZ(;?wKT!do}ZGMjPG1cg}jFcBn~R&v$35yw4qI=iPZB z>>=wRLEbp;^sO0BRc0d?5~3wPuosc})L7<-c$jF`RLDEymT-mb6Db1Qem)DqZAaCq z<$Od9QUfe1#xKkt52J#Pg=e|Jl)B`E5Q%sB`N|D76A#v7Pp67UM;J72dcq~$m#ntyti`CsV@p%R-_6URr+JY0eYm)F5=4Aa z7JEM+#F!DfB@7gHN+0U6Eve6`&7`-Z7rL{TRp!l!204G(Dk4v7w}-uC`mUYy|1EzH-Aq}pk=iTV za1hKb$KlTx(F7AYLdDJPONA_V{wD>nTg6_}yne>E70YZqt9A5*?1J^_oR5`dy8$zEI>Sxye=&be|f4MV-4b2jZM z)EKJhhXx*-4ThPN=N2MrY2nvUO2puMBNa(Q@QZfg!ZnN+zp(FhjZJj<%WMX5QdPsm zE8CeAWYC_B?AI_Gz~K~h12EF4(HE0aWpWH*kd}z zursy5yPeWPDijNP{zv70|AoTK!6^k2zz6nt@j8p5$u`37KV|KcX)m8|MhaG0w_ci zkcs}*nV^qlb(qW%+P>6;fH~vMZ*wRhYlghj=6y@3fv;xl~>KeZ1cE0^VWiR9Wy8VBoG z1hM!&bF0Ki>}sGt&y{owjD9uNwZB-OwDk`_SNQ$zLYc9)6+`;vEBU3QElL)!NwZdj zA#dG^4HXL4>=r0yI_IzT@-+Ci*Tf$l1?DwWc8oOF`(a!0Sp1L=xgR6jwlT|Pu6S=E zLmV#bD!`jENzc_GAZV|{h;BODju`zgvY|`Rvuf;h+f746m}7ImA4IA7#3-!md(A8DBwraY zY8=rz5e#Cki!NTyRB8r~6;qqnWE`dF zmnE~R%!V%N(k?{%Bz6jUbJc~*z{JDwA*7KV^9osU z^@llK4!p6^3wim;H-~C{!%9@#KnDX|K{Xl4Zs`gjwI%Z2wW#dU|oNi zp}3sI)fkF~7TZ6rdd7;>pmP{(dD*++io?sxG%+-=XZ;?oCI=Uw^!c0m_v}D*`_Ce= z^}ZPH_DB=tz&Di9HH8v$?!>lNW$rfZ)$CWF z33@+Nw|U!4SF*r)%VWH_Ma6+1{AdTuRDPfRs24$MbvxFF3KxoOAGqqgfPoI_Wu`ES z{yF))(bxc)GuZvo23UOCrR92Sq@TYrPRy#rgT$P#V>_ItR zLOFpuApSZLq84ia6FRGU7u5>jLZ&{&XMM)-E3Ha`z2^ExRZopzQrGRJ**Fq3!s30N5&p8h@jHj9%%x`>%m@|zP`~~&_~)BE)retJO8<*beXM1WgA~igmzmtu z2!GbeZm|!nz9=~h+7O5j-j{@~JKq;~wA-;594^1?HAFeHWhuRPB)RyzH5=>47xswX zc1UYBf2W(+Xnt%Gdkj%^f&QCxk@8Y-2|ZWrR)L`W_?iikCzrW#asA!+dW79>I8S^3C8kK58r>Sdd?QPlb^M{bt*1d(M%`q( z(53nm#q1yeXC zEi^GcH7FEoe{Owf)$%m0FX550XIWcBa&CTHODZxg#dl2=pFw+ZFa*eW;~i-c|0F)pt28-B|lJc z4~?mP|Kl9bz$8->amN(UKj}03*@)w^A_GF9s^ySAiHIArkA2q^ zh9vh*C>`87ye7HyXan8Xf70T~4#G|B-8C2*aploBS#?{k|siUesR&B<;&h%udAZEosljdaAMGpjmY#>qn(5X zp3@o+4RE1KqABEDiF}7PpPP4A5(NUN3^2!#>bGX+25AvHx7xeKT+-#TJm9Gy)u;te z)?MiHCXb;uKG2Z|vW5}Ii3?!O@JUA+@z8JH_cEN@rrx83__Ty(>{g@mAZ_X>pL4^- z5G(33ug-u!#?0i-c$pOh@4F&7bg(jTkgGzkJwKO?hb3Tzz7!?5{nC=G@~kNV-9c+7~s*A|dtf`ru8hRAVpzGx$dV62l@oIpQrk zZL{th2X?#&HG$MWqY9bsgDqm6ePlu+$Q!N3$k}ePYYe3GGhior19ZvVOoda}(j%0# z`NKSnAzoulC`$btd-eC0Zsou^$9+c7@8s??lBS{#&WvCGMQIm>nJ4p4S~?$n8j!pm!UN53ESJPX!G$842( z4~-wdJKvIde>PNvDH`>rx~me~*w;bKDlKjXD|n9v>!|HnwS-gqq&i%Zd6x7IKQcJ+ z10d&(DTTW|`c}GG^RI{@Om;e#*LPnDcD^&tN?hx>#Cxmyl4dU)a=$IAkx|Osc`x%> zPsKfMco++np5Gi(%lrNXzY^D6;yO8vc;0_Pu#|-FB2sl;{ox8e&?0S5rd~?8Fm5{r zN_Iw{&ya+A%wE}B7tu=VQ>@0Marr&7hT8J=gpVtQz@H;?~Qjj)64-2c*!jU2S$OkLA zUG+$t0u=>VQ=FK2`*t*CGmSAJ;MjN_1NBjh{e=&KR`m*`GPqk3e^{`MHGl?_UUYC8 zJI;*kE6*WTjFKU5@~RF1@W8}^I7~IHaiO65{pW(51!|Toar`xNfA+1%Kqbxh)BM#x z4frm`2e0R28Ov_zu#rNikl(aZvfu83WptT8xh{922anB%Oa`BHbvhGS7&Wb=-2@p* zDHvjc3qYqQTAuA0n&DLuDhFV>Rpf*TAK2iGS>G3@2~Z}j!zESfZY`eq)qjoMH}&*k zV++5QWYOM=pKaaiNxQ_o0UcdBRY_AEq$<=mu&KDQp}Ic4NMk5G>&B)w_hf$Fq=xrT z7288tH2|QWyEp3UMUC@?fy1Abupq&0;RvdN3am_gQ&QMHf0XuUthq zS4&`P_%yaS2w2MR=WOX`PFkAOSlL|R)>*kkYTvV~tL+pIzj=G8r^t*?Y=ir?j$MK&gsbMDb(kgBF-3_ISUF>ND-d56kixkU7g$i zU6z3RJv$(dU$#re6?FB%>h9UA;t+B)I4`0y9*;-k@WUP7V1036Z_pI_2@)IsesL>A zA8LI}PD#b~B`vQ7>tQ!f&PhYC(O_LsL(4I`{Tn2m zy{QXxZe|aPBGvav+N>Yri&Im%iM_;u*T3bz;KQr-MY5&OoW#;~?~ZZCW36l&e4UBc zQrK8)MN%fef0p{#GySn|Kd+IYWZ(kSfayV%e@*a&y|#jR{f% zWRhxTJ+-uu1l21274K*e-q|XQs+ihOHXdU3l#);-{01E$MMXuXB~Ex;A10%#h)`OG zQCD|Q2O{RQ#RzLbJt_BVeVkA{pz&YTv^70_>kI03xsyFwZCaH$gP@dQ!t9;&;b84I z_!k&cfl@hUQX-^Y{wy&}LtTWPm0w7Y>#Ur9l6Ts?i$0a+U3|_2))sJo;gFI4Tqr?| zR;8T{$(9$YvJ{<6JF#niA`mzHYT?P4eRB+P1k6GaU^wU6ZTIU9OObEnp(;CKj;&ru z_!v}Yih#o9xNL(#mLMr{gdi`#j-V!+k2zuOPeV7qK7}hSu-B2VmwzH~sqasZFvW<{ zh+}^1XN_zYX)Z!#or}seH z%_e(HfiE%-_R;+^csFvckA}u#lDKpSV+XDzhS0d z{jKRZ0%^;|+FxqIUWQBrQB<*jKP-I-$O1?7Z_2?FuQ(rmDHJR}BPKN_{N#QSd=g13 zm4UGn^j9k32AAZ2=q9OG3@E&OMp=)veq(Cd#(~`f2IB_ZDV0M!cC00gCSn{!(J@?h zho2g3$}0Dmc;9nLc@}iO+lL_Z0~W7xQ^U3oSJa)Q-r{H{=7veF#$s&>It(!WHi)tH6oKM+8{2w8m5ZE`v66Or=S6< zgEuaxIlf#fisSwtOOS#4;|JJ&C*`w~+c%+*R&v09x*3Aw>U`w*_^WU@6I*C9{km9k zmE`+uqFVpw>F_cAZelz~)tIHBa=P8K0hM#5-*3tUq99w`Yd#{v6Ma1Esq!o6k#C|Z zx-nBfasrQ;`X;S9cl$pG1JnWU>^~JK#Qgf$!D04LW7NVa<@Vs0%gySKT!_7^pAF~5 zZbdka%8Cdy-V)p+#dGvo%S){&527l{np?Pwm`PJD+X&`1KkI(u;g@6OuabTvz+{)~eS2 zbRVvEz{95kcSKD}Z@%;NNGMqlk`a;{T={vp^3n&K&z>w3-P) z<%tolAxIRWTQpZ;gx~6Nx`MFtqx4D71+$UWwq?YwD~vXks}X$vh(b7ASzI$k`E&vZ zSF1|pUAcDXuHo0}PE*M&p}veKmCAb~+9AX)r=AU8oDzN(wKu~Eut;m?sw5-Cr@Ouj zK04@!?-7hLBdYILh9F56Vw1mQizo(K^H@F3;8BTDGhqdB6!f>28+!Yil*fbvv3LG* zY&>S+h7=GpAbgJ5$BgRRwG{MkJrDSzJXD-!nF(vr_*-{?iS`o;JZ^%Nnu8?|SA58j z&h&uOoLU-*$3fuuF}nwcT@&Mr@voDV5^ zD+he#H4spejZ-;DSznraoTrJ)WWzj$?Y%nMoHemo%>s`-vMYv*OYmIMmH*|=p+a{U zJ9PDnutv4si?zk&(Fp0zAR<*X(bw@rGYMexHru?Hcij)#{ z{WxWrcbQTe27`16<+Frg=kA z7?u2+;V)LN3M(L#c0$A7OHhBjo?vabw+&-_J)aGNmbv49-g?M0!+~tc6B0n zbougsI`_E{QaU%U3gK#eS~YXY(y+_+l$HfinC|G*OUpuzYx`b&z zSqUacQC<5-$HFUc1si$FCwu-wiD+aA7K1FI=Qz7nP&?=l|NHX&M{yurenZmYgI?1F zRH)$0o@jZVcUpFSY%HOb(Sd?uiP)a-V9t&$VZ+zj^i-#ZAHEDl16~QrA$-2|v*^f% z8wMTo?aCM^!AN5pq}(^rWglM$Ddam5b?ib)#HaF$0+SE{e^{gzyD+g$%jreYfFwVc zY=ow{yW0%7pUz;Sm3WgEp}1kX6nub9MpEnY_9wl>Osy(d;5lL`UBVBmd9!yg7}A;< zUgD_#DH`NsXGlaCGTE5U=!ACx8`96^j4?z+5SYqpK&DjLLx(}MdB#-g7zYCPd+ zZ|v2?K)dkMlA*#;Q$@ds>g)dP#NRSc&iv~yM-8$Y$W&9+FtwKP6m@cW zqm~yUgj@4g6Shgxl#lg}KIVzzOC~}mY4Htrc$G5&15~}8;3#<6k zX?qSo>se9*}mE76#-# zz#in7n%o6@zV3WsK=V6P9|J8+MIN*th=Ss_<+?Hi@RFeZl{i%7h|Pdaf5*J6$RLcZ zJzxDfUck@7U!>W@wqxzr(;)*}XUj}0A6Q^p-}zplhwhKr2$OD_eqIw2*8(zn zUXcSG^nT0*Zm^L3=9>d~Zeb7tK|Sg?;&|4tdi7hgf}l-49D`v+LjeYbcLr2{JW^Mt zqBIMIh=|y0DZyT9GC@x|UT?UM{ME`UWb4;&OICYD9h+F*r6nd29A;9d$%GL96j!?W zXXcedvDx#|#)ru7;4qwVm#x{07v2F4THOQ1R)lpjoj5`|)~xUF-5PGvIrcm*++R7# zM$O@0`4)7E2FrAOchRJ>(e(~+fOc^u3Wvn1IZAtfWi0yD-`=p*uau`)x5sO2W!gp5 z(d=~oT^PG}yS!vfZdqA60o-?(qv1UK_4ANBh9NTs5GnTwuTGM?olZ}KYl+_EY#o^Y z{5Sj0!&3%#Is*SmpTG`(>qm)eDyeL~IKzt<(lbI~@x=>#V6#%w*}os6tz+@N;B78M zp^(tJEA>f}rLz$!K%Ozs2y#~Os@&LO*V{kJHR{~NKZf6H{h7g6YKFL$`$SJoFt2Cf z#c8($P~8sS=1VM-wrcsXZdAxZv)PJECmNGCotAQ88 zP~CVQ+se!`$nBu5_?__?FJ~@8b@sP8K<8t_{S6*vW!L}dx(iyj^@b}glf98~Y!It{ zjlK=_U8r2%ZFshr$&5^%5PGSX37U?TIA z$nnK)w$p@vfpmh;WSj=MBxdNy`98Q5wPL+ld9xs|#TO9_0d~~;U$x7u3J^6&TS=}l zdej3KkJ+8UR=aRownC@$pIHegufvRbSp=g*fDEmBmPbs^-r3T;n4GiiC(J5sP(*rV z@ID83bnxg4^zi*OG;I0Mo`N?pyrAE#g0BiQ$woKo#4 zO-*T&oWl3;TKOr^RkaRrk4f}^>C?7&peh;zu7(Sl&ODpL3XENkB zO3ZE@l z7QO~@i)7Q^b>75wOa7^mIO?E9gDJQPz?v{Z)lvHAc*Ic)cW~?Y7pu_J-TyTB#LMSQ6$+i_;e+aH-(P(b^zAo`A>q_wx- zWT3V~1GKj@hbwqB4Inx}lBjb6;u!~9{`6sIH$8kwjb+rA59rZu*p)~?&bHOxjfG+I z$BvnpI>eU##HaMHMCqZ1GR%>#mGNmJoCqBSc;y-eB~eT)ly6qp+*IEjL_qTx?jIS& z5n8^=BiHq@)%-G6zeW+R#wiXN@Z1>92Oyej?V;T*$$!QVRNHd!+eUWOyY(slf!AyS zIUL|+7DP3IU|`H3+KzX@Z4Ud_=V)M7qmmBHPYb>pcAsS?nvyiruprYv`WGLCdbAwS z^-hk9fi0Mh4m`yqgkGxGHn|b1<%!NaQ;>+=c{{AA)hxmA$xxDK7lGr|)+DzQ8(^*3j-mwLb$#D|?~eI!pgQigjv4dmTU=2lZ|w5BQK-gr z{t-d6$5*dvweXuigwc8gl^pnQWOL=`=DP0Ef{Njjl&)6i94SluzNJcsl9vj}65z|1 z2ZF}xu+6{Y*q{HKh(~aLXxy-mqlkH-ir43;SObR1iW2|9O}iucPp;>KovXL~Gq-Zb zw)JXcO+&>+zUNYHeKtd9Oy_35;smXJKPGj#LfCO?-rer|ESn+J|NNM0G?Id#C~q{q zzQd{_m=Ew!Qi_24@H<0x96f36)$b%?=GaMAJ{}XzYYZaD#)12nP8sojY|g$A`}uME z+wZRfW6wH<_y%N})gokM#g^vU>Bi1jADbTO2s%Ja$m%uH98~n(RD}3j8kKn8^hck6 zPsF@fB#riEOe1mqEKura4%pu=Up4W=Rive$28%2WwfpSJ7*#Kmx162l@AP)HEYz8O=AXg$JksG5ol;MXhG+QA~#8+we zXaMOY%&ba=2rGUGq-yw;;|bpIvVd!!CYyYd0n>^)1Bu2)_=0`K4MR@x9pWY+0$~C; zUI1=nF){K2Z=@ao)Ua-haM=o-eB$K$Z zB>EKO?}0yQ6uPHTn-RbBEc-g((*M$S(;m&PUsM0ov{pg>aME}W5Kkt+j_e<6=D?N1_Y)ml`SmZY zeCu1Fdwn^*3Hvc*r{pEOokNzpFU(=-wUdSd2lyx(uOgK^YC)>NgX4;5BhPkn`o`Iu><*TMbQ*e3+T&hw1`RRVx&m^@f|o{E9*kEAb< znGt!e<%yrG=*8SgSP=N{?{59{XVs#ZVw|VsG=r~Hbel~XT%ke>j|TSUwylwQ;I5B5 zyEjh$1|bJn1+*7?m1$(PkI7F8VETD7q)4-e#i0ie z0f7V@SG14_Y$U!%_>2*Lv`*Jd!CdRf&9JO0dUS-}7{@6dIgy-RcMm2kOyIN>XKayv zBNjU}JMyg{Ao1k}j+`BBX8UWR8Jq#wU*hjLjqjeGr4zd*t?$*E9?vw)){I;Y^>zqs z{cuOd*RC)r1{x5#f^(%Xmw{CG!-orM0?V(yq(N>9A2(IIPDYm0#K~*hhmhHRe;o@2 z2MdxI$--tX?t)(9kI9Y!jzZf^({5>vp{Kk?6$-@=pXcb&(4QK*QDHSHuVVL8q?HW% z^oaR@6ct56t|*a8z67j8AYZvEblq2aSj=SBHj~8DlZy>(V_;GaolHdw(>Or|b1TVZ z@y%Yt!0Gfi)D1vxgP+&~8gDG1+2pGh_i7oK?SxDBn#fYqH{Y>n12%6j#Y+@iu=sZ; z+{z?JK;2PjI8_}FR{)fu8N`5ylzwwKS+MA7acXQpgsN6KA2^Dn2fUSBspFr3Nt%1{ zLXYGGY4Tlv3%FOUE*_T+x?304%zSxj*|9Z8G}u9YOoRaTY^j z7M*D(jw(9avgK*~;Cl}TIr9Ncv^1&4njLUT4%h-yszuF$s_?j%rI4q;mgZr_)&)T3 z7bxod(6IL2bFA(kCQi!d49VG7Gi{FM2LaxVF7bIz@Q<6V!vVEy;?k>kw(Ewk2ubNd z?|}f}YP~)>LCl8@EcS^FQ$v}sZ;;qh(F0_R5BK*0tWYm`B;HdVZXR%!L(4sa_pNF} zm>#MHq{VG;{RXvp0Fbtb2g!EoG%%${n{rJh9+LJ+cWfA`+RYW^;}^1R^SK;=S;{7G zE-Y;28lMEeIEgOyKEYVJDE7e)20!E!Ib2+BL1oI22{FMR^jtsv?EUlLtYIl4JX6J1 zln$~>C$Q%Ny1o9+D6a0~pX{>I0e?2i*0XPS`zURmLBh}jy*CU8(U@^H^wjpvsbZli zukEJ*83wYUDWiPe{&9%>B#9I@X|q8!lJmLlXso!bE?aT?yY{Oss&zUT$@w|CPngN- z#{5_z*!FQ7upuy**y!*o>DfwLwPV!XIN2l$*qy^s%lHB$PjiJpL>^Sq{dw4;@ap`w zNgGx)ECl;eNDEdP7<>IaTTKO>QW(u;H&xL&jOM8xF!VG#YM*^hV6h_J8p)Zf7f$An$xvN}n>zlq^Ag z42hc-=)tEt(0Ug@p0)C51QmcjBRF|c0CyiQjiYw}STQ04 zqh)^glJqrE!=~D(sa|au#C|^1h+&)jW)yE=PjoIOw{)?lQ~x^+5h3qjJ@o6dBvRD% z`S-IV5f+%+ufj1F5yM#vXgBL1UN#=Q^KqO#{&IgSj??j{s)y@Zlvr(4*Bqf=X4WrI z?P}j)1-X!}tNMe((dK9$ce6*)r`y{X@f=v+w94dZ!#_JFvMXaM1w!q8Fw z@wcBhCvTllPDh9JKi78f^9PESEug^=5e$)XuX3nk4rS~@t52L2dK+QjTx7_*31dgI z`x7??hXi3*3r~}x>V0|6zNA|!H%0$la+*Nq)m^tT;lH~~cv^pwe`VLWnrBU^T_+AK zhhQIy)?Ov84@Fk!%QJ$upu0syeo~~(YatfR-}tU6N60)z`=Bi8if0G`kKw?S44A9e zo?$7ZtEDgRkkCoQ(d*}9cCMSo-*nY`BR$@jXqQhC|Kww%fneS)BMXbVK1qQ_H*9*% zBz9mAhj^Udgb7?!!;}|y((&u-*tJ12S*@`+74H^pH_1xq8MLuXbf-kQ*Too<W26Qyd#;os^^4q&`8rvI@IU*XAQavHuON%x;caQ0?;h_x06aXFYK( zIqF2Nz*r8J&TB3QL!4g#8UBnhnF1^YA+F&f0dhmIj(Om+gibtU@n`TE@<|5Fy7f; zY>a#f=+W~nlzQFO=Kf}|Zn?+WYh!%NgM&Gioh$u0zd!1f?QW^Rzn%0R0**z@j+5S% zfWe^nXpwyXzXyqtjCRJDYfIfmB26{fb9EV1s0cV0IM~F1lAKReVWWX&*4o4rrt^t~ zQN5 z#_*P*ATW1TwHGFj`bAin;lw)JIR>n&9usrhID;m4XX&5ga!r1xe2jvrSGs2H^AFIP z10B(DFPrc$mTm465)}bC@CNH-OD>V!bjLzuv4r>Lm3HKlKN=^lth~y;pZzzKLX3|Q z{R<15oVQodWLk|{MBXje8lxo6J{b{8iOLJ6*uMKciQIVjz?_k^ctstHLTSj77|2nk zm~&|JKodB-4>FnJ+6vU&CS{s#s2UGlS}vkIe?Cuk1^Jer6)09KuoL#?xK`j{SF#Mh z`-e96RT9hiCH-hok_i#dbk{Uquu*a&P^38Kl+N=lD*(SFC;q8nR(LL)COR3w)#-Wt(B95|Jb|c}Ze3$aEeazmkfLwp`u|;RpINSN*%zhi}Zzs)7V_h`jf~FK%90 z+;IpT@vE${`xFMr_zZP>5oU)?N_6>r$1^)&TnTXN$T0&)Td*ub{mE7T4uef0Fq8#BE8xh4lCPU zZ^XnbRF{}!KDU|NKffZ>**24|QaOrSOvj0M01KiG{N5Sxi`F~Q<3T+XNOxtBuA}?} z@c|O6-X^7Md)jm#gvVK6%4nbLwCwA29K)9DH#e6rkbc;MBTg8%ITBImHKhwP z2cLCy0r_lzMoB=cHJ`2Jh^I8Z?y?hUB)-{u%kxoDH#o+C?!bpyKenhN)UKnlR`lPl zu6X`4t?`J4F}DITR&Me3jO3A5H$~YB0F#?rIr8oB2?3yrG8?2`!qfI_b zsGvRFOZ6wRId-_h5=b-wVmB$t8iPcZ#FlR*A0@;rv`LvX(Ru%O$SB7G8@+o<@!$r( zI1a+cx*QJi0pRdcej(C^$*wy;>l99SMj0gD?nn_iA=XQrtg-j(IRaAFtA;~c;PLVD zCL#rSsyx<(l4h>71WqEzW{=0Yo_iUGXnJx~&DE*EzTG|eaw#l>jgFXc{)Dc?TC0p* zkW1Q`Mf}={tQ9Cu1uR)I{*=OO!n=g@&P3S(>I&Eq@c1xv!EX zGP7$Zw_n8kLim3ML^HD@yOof)lx@L7iu#02CPgY~;O&&aovr>PHq~khKl` zWD3_0$+`05M26APZf)^V{4$f>PGfJ@7N1 z><_EKPoi+OG#dWAI2jjXaBvEqY*oG~txK!wIjjk6B(|b;p8vBJm~(;d zIan6v?h>s(olGmdmi$Eq77jT7dr~?57t+H$6qnc<{^oWxk?{FDZ|ehDHUPF}F+Il? zV+9PC^mk&8eYS;Et5-hyDo)~nvtFJuV38=3zo0Ys#HQUHEU5JMc zwQ%CV?=|V?M^JmVkJFg^$hm3JN)B-9iWuaj@`8Nrm-BaDAhFAxdkskypskbLpEjwF z)#nN&v&#K%4uiXxx>~uu=e6ykyaJ|!w*k{n&XkL)j z3YCJQzyFF>PVVB>PY%C29OLJ|>_ojJ;^TPQx>l}AE4w+=y3 zb>#J6&^#u5#hV7u7?=D%cqo73DvON8thxF#K{$rdU z?|V*uzpZCAT@VXmYax{4A*tnPZ$7vG<}W5;ulhI>a0~n|5qcmIloH>?xw0BYDXyeV!fV>1%$mQvJu^8Di@&+4y-O z%)#LzKim!&=0l{jxH=5>q{gGj-0f_5pDMLy`{pBAG?Y!m8gGCrav(-lBCi5Nml#zY zBxx21BvvAZI*I3&6AG+WB3E>Gw? z-)Y;{Gd~>=e~fF~;S+PV?Z)VK-1^TPJjIHMzWhHOP=FoPn)=-NDLec>?Y;LmoL%@X zE)kLFUG(0|Bm_b9=rwvB(Itc+7%hV6L9_^hM2!+HxIxK>K?htm01aatEl3xEUZf;{ii=jnfdx& z#Xo7GbbfOeF>MRXZ~>9(cDzfs=xq8#_Og3gMgU*D2-eXH#X|M{=`=Ba=}P>1XWQLo zWAjqBU(%{MHp{5iOc|ZKO-^0{)2Rz(kc3NdWEg0q)_S&IP#eQp=iN*z-pgkEXI+L( zckef_6xJ6S5Oy*&@fFNhFS*NEL;%+n3dm|L4@xe_`h;O|_i2<;a3k_g1kHQj=sOvx zz`K0f5IpqyF>dlwjF-`8b)#yH@IM)r`y;(3d8}zfCF1|}QCTB7g~b#Zjioo4U8j_n z$blYNZoIN8A++$I6yOCg9sMjMw{9lWsWK45em5h7}4VfZgN%on}yFWm8v{^nGFs7B|wl2U#f zts>_$SL}BEJX>~4reJjO(WH%HufSZCxM(d86Y`*e8I>j_@w|wx<1Q*^$Ac4jsvH2j z6l6pK0gEa+9^`Y5!1IxG=;g)Y!L4b@J!>}pL^5ZMqj1c46nV#aYwN^B3R0yz#e10U z>0a7bBsryXGbnQOmfrw0pf7AKQM&NI z|5bv3)OjXkgi^m|_G)B&9P;_T(7oyH@U|v{Zq!;=B`^Ie&LY;e@FZ$3o(7(@j?@~1 z(=MSTKKA&wuL>P8MX=fLe+mO&eg9Kfs%d18dajN;p}G0=9v`}^QWkx-5j#R3<$HVa z`~1E5<2<@zEpK$uL9qZhLPvxrX)r_UX1$kEzNC=unC0Ha)~T1)dWZYu;%TaaesPx~ z!T+oRhGIq)hFP?`b%_?+K1~c5oW&Xn?R}yC5N;xR{d>`Qs$ut=jv=!j<}8Ext9krN zR&V3DEF(9-=a^%WI=dkF!SC{#XbR^T_DG|W0_%`pyZ`lKDBrgiOw-f;624iuc36TY zPPec`S(MJ=YS>!k9vN;Dq|ZLXUHK#k_inK4nugAQDPw>kzrje4BO;P~e-Bo-7EkLq ze=))v_d9BNW_eU;GOAiBF%DggzxW@+X%u)Oe7J~j-Bf#E(D+AY+fY@LL8yJKtzj`~ zL+-l#ukYM4A{A}`*Khq({BWCoNcy9x&!dMtdy9Em&R0y?%d?ALQ#t7-eVpbn1%7#v zrT;feVe+m;UN(HR)nnu9Hk?goae|xPA4nw;g(}&0$@Xbh{+1GNCz>T{?|NCG)aQ7N zDE4}KI5g9rUK;)#jeiQoU__3|F&7lDH%nKnB!9xHbiJ6As7s&B{B(h5q@MG!Lg2wtu`3KD7C->B!>_`Bq6N%By(LdtcCOFo8d$M%zL zP(YN?d^MB^T;V%l^|mLtl}f4NBuNq{M&LPnzB7f`;8-lC*W4B83xnZq>v2M3DVN2H z_`t4C26i^qR5KC>HD#HphJmL;N8_0FEa@Hfw^ohK&zXCFjx$56Yl>H)E@0Yx$a6cI ztR(ukI;74!NV=z4bgi}v2IbAK&7GD`>vbm2tFABD%iddJ-f4;d`#uq|F`Ah$^%kW* z!=rc4?;VqlYLO!fWV$(l77P6qXM#JOF%;haoqLm*4n6FXgY$jhHP0cBWVlL28TM~L zknNLOGCD!WCL#*!OiO#8R2Hs6AE68OlInJsegwJj8r}rph?3fcQ{jReu*2%JB}Ad^ z{rUn60f$nfHzjY~1^%K1o0M2FY=G~K8Ez|G#0o9pUT$cbHp4nr8DHod<)i{ET;O%G zqYk;IeEeT5-0GpQ{>IgHEE(S$bPtukgAU!G8ol+5HiNlZSHNOE6f1Q=pMj~R(L*R+90-I$0H$kr@lq@ z=^QaL`~?+|W8fU)L9Vq4$PHVf`*T}4H08gXOf%S2Jb1qjT*>D}dhpz`#k~QH-vCH2 zlLZ1fN#vZsDu8oL-6ob(EsE9vj@n7(DiH<_*y=T0TIbr!@KFtq$?56_lKh{Pf|KEE zY?RrtSN1D-_p2{WK;kD8lM(zB5PO&RU2D&_K$2)BHxdhhTX5q5359!JXjlE%r8ela zscDgFP_or)E}lFweJorxUKgk8f$dD8yra_Xw40S7A@1eL-E?(4Q9M!kC#{ZfuGd#Z zGDvA*bh19vDz5lB2%Q6B_iH;Kf)FPl5UTrn(ZMqY`>9U7wHd^WsHl*>mpuQu-)u`! zh}zX+^v2aEZ!rgX)Y|Gp;j*BR9Uqq2wnY7_WbHIvnYr_YG?-- zT!MxaNW=N$6Qyb4e^H5#hWYX9qHU~yt%N#pbvp)$lsgbS`m7B^ois``()J=exz64F zYm)H^qqn|G48<$ndDm5z4%@<-8yZV8M*BEhZ_p>Mvhh8LFlZn+MRBZCcWk;?4cw^G zxMQHJNYB-;S4B7gp6>A&vw36u5;S|#@tLld22^Y6jplKTuK8G$KgE_d<(GFtO*?{- zxd;dTC+`-`2dd8WAWGNWR+ZHUT(%38S3;QsM5T;>9wz+qKXc>#wFA$e6OTWev&*eg zj2g|$^cr8rPFIHzh|M-nCttpQ<{k!=NUGvu&vUQEd7x*9QhQ7FFNDMI@+d4Dj#eL2 zHp)>oyh!@|b(W3rP>#$6U56X})vRGZ*|8QTxNcVUYo038S<%%ss`n~57U0OWSsSo+V(u)pxB@cWq0PoK)q(Ejc?5%*V*2* zY&>1|_{Q;-*r2cT*D&vn#3d|Cy_q_?D>hThq?vz-5k=5sLWqWQAW!Vwg-=fpj&cI^r+fa9muLUPpF4I9Ja)#YJ2oY>Prx4?C@ zujgia+0FH~OYtnP7yZ27^8s^alBGQ=5ghThps94}8efLT+fRQvCt(x$OHi85Ga--d zKUA2#56c(w)AJsn0hm3Nbnh9IJS}fmYlZE|250YtPxjH`S)H59QQBgRol^`I`M%qd zYTvBR(&pTK_Yq?Z#I&pe@3?-9lcKJfF}YW`7=){1mj2Gr{e{&)vqnI#-%o($U+NGF zdHGL;M;cu9c0^1vBEdb{*#wX zhnbq!t?nvdj|-5l7Fh;+X2KJknAx*=@`6jm7F>ZP+ua71I?eoZ$uf*V71xIdlR-&C z)}IajUaulT+7PM>CD7j$t5hVuUZ;y)@p%k(M^ng^kLiz6rQZ7v8LeD7o3<(ZUN+}o z30RM%Ba46XCU1XNs9UQFJFGf*H+LcVa%7n{KFY^gyUQ9Nve#MLHiUywOQHNs&{Us# zI80|i3x^-Mc6gqI&2RdReeP%_rpS(UG&SFUF!rv0RD{UAs`^%L@)zO(Fq3k1H5$tZoJNn83jYOg_2}JHnutr&k?qg@yTUME!@&W0i z&}wYJL7tWcx)sHL*WbdlKj)xXptgUIBbwn|mG0q5kZ+~qpQqb7kcpL0w=@|KwUJJN zPf~lQAL*SH4p)ysQ`;PZgz`^V1cIi-=s8z=PZHkr zYxY8!r(LZ(QddWvjZ@pxr&d3fULQLvY&RrG#eH(#eIs+#axu5Yc)D|^3Kx{gn{J9r z#KVb_%f~UoXFvY-BFSGOdA=thzV{VC-SmqOmCW5ovr9=wWH9~iO?qx09i|>x^|HRB z8e1&=-43NdD7(C)T%*y+n;}FQ7m3&OEzrtk|FwP}cDc7?1c~;Sv`o1_90H#r*CLyL zX%;S_>u7>QZASqa{)FA2I7i1nGM$MPCC7*Sh;O%(j7m6XIqy2Q6Ep3%zEr++mX)G# zOC6Plb|j1Aqh8;-F(HyZai?3svp*7gqE&;L10kp>ox&p1g#aQCd+#MrTlo6|*UQSg^y}NRpD8=`x>MkFwncsr-ylZX61m(^eL@xoJ%Aa^I%Yg8L?8 zt5}HXyWsF4OCb@pd2IikvcXvP;&AlU1JrWG|a%vo5Bw!_1ZJ; z-T!VVhYPmVu!~fRLoD}8Qv+7T1oE%lcc0jj&5*O<Tzia9|a!F1k7rc zF#7FlHhqe?u_FQ2Gu>TpxRr=T{4z@3vrmX(6X)(=)o`&&CpQGi#aHMceu6+0Caoop zKgwwxJ`lX)E57A+x0tAI)CwR)xq0XZ+gv8~oC#NV`00$K?%}duzq;O{C`R9%1~1as z#CR3co2{54Uk9~XV`ZBS2z={QN~)N)B&MZx`GX^I!6{Y8)WVgo+HOEoq>!?=M*Hkq zR6^O`CZj-~d^t*4N{-7^0&3K4da(XxtaoeSWQbNORIOS|n2Oq$!g)_)ER2>l=|La> zAiw6>8>l(n3`xB8K$60L`qD1@O^q6Ai{eV=+yP>5`sI1~3Uw0o^&ZksPaQrKOsoJG zJ(pOeTWPG|$gqeTeL=XP))pH<0X5Bv5f0Zwds0UZA$5OA_mgsT2I?~M*{mm*;SuHd(`q|Fp zxOU!IOg$BPoq)&~K6LaHgBRr8T$GND>+w{Nq~AE$6Dsdx@*vIEP}2j8@Q=L1mDpQ; z>_X#N#|dfVoprO-)_#!u4~AzhX7@vd2!|EDw?3?`hszVaxDPaCLK43)RoWCui_?uM zE1LB3h%BtrdoaYS#=gQozDnVIWh)%P^R6Qzz&tLipId4hfZuR88;MbgQ5?iCF@R6L z{n!;NarKE{y_hHW$Zhh`w|cm^1|zBZ1eE8aUT5c3akIXxVv>_0*nXZ?s++5Y9Xt7Y z{M_T69uG35k{z>IG#mYO4qZgpp-@>88>bs3vU%7QaC7ftuhtEdLnU$6h>hj+{xGQP(aZP%3x(W{i=TFUP@T zNVj0bYw?Ey`3Y2y1Q5 zbd+CHU^BxgcPziYeH`?aZPk>pGDZ=gH-wh04?ifoA3vMN$MW>%Y_dPMPv7FP`f`A@ zspfBf6lM0da*Aw!r~R1ebJsBopkzAO)-6hxZ9Ifv=11qOFd86=@fG8`+Hvd{rX}Xkwd7eJJP3d{ZcD6^IjQF9gV8- zeyz5$BViBJueRe>oobY;7iJm!9w>ULpNe@kxtP4ycii zY`Vv?QEFB6j%1b*MgHBcJ=Fku8P6uEd-MiRkdhsP?q$`LJc|g%!r^%LUY}SP?I0fL zM)uJ*-&mMU|CZ;UI2Uw#IkomNFBcN$pE+s&jGvHIVmz1fLg1(pECT*(Se>)}xO*In z({P4{i=n9c2l%TKMGcD!?`?0Yi5f__l855GOOTt8M=hP2?3GB7Im^&HZ>F;$Kz+eP zFiUduSMVvuy0z-(8gv_d)s^zxG+;?{F!=qIRh-_?!J2}t!Jdn>;Cq!I~7Rnmi>Q70(&Ep=qa$@lk{&G8J!V5Zyx*&MZ(rs(0T zG7!%*e6*AX5GU^Cz4&z`$Gj}aS1}uYlB^Hf?gn9@(l(yc?p$nSBDZr!u+3PZ)y@b< zWfpv@xdpDttw*sTfgQK{fELEfKUyjY4SGN6qPNC^;~jjQozxr{+%hT86Pbzk*9?m2 zoiEaD5GGqLqbsc|lQj=@BFW!Bj01^=?W3$=YK61!Uf~(1G7WhQT>yvy^V&q5w|`4# zz9(Cw*;raN=u(;}L12Fu$V{{*Vbaz{1+Q7di4k)IsDJrgi>4F}c3fzE@0sLc!$!tB zF6+Y?pAcsBI+vtNXP$rQ)GIU%A5lql=Z851h9`T`Swl|L4sS&9*Z!@$OFOH?pFdKj z@b`iDc30cax+zOGYCWz)_^l&nfjVR1(_+4DE!vgDK++NYR}|fUUMWQw>^vSFR4x)~ z#Ipq2s&^QFKs1^0pFZ2bVIDCI>U+uguZgDFU1%qmt`Z;(u@Vdgil{L>u>}O@c%$zj zRO|5e$q|1gR3oZe7W!+&asoAeD-5lR1*6jNHLYO=Y`9O4`2|jf&Na+s;JlAFJkA1w zsPuSe*Yq{B8L%G%yy2f)$FF|9$+BNqwM0{gXr|Zn@3Xp8^%xI8h#=?Rn9J^xjN7Oq zX<0|q8h%*|3tm3?Mg_2bf-^@=9BD2W%*%b2Cx%ty6}S#yF1CJ-h;=^IL#R5cYSRKK z2TOdX2d2CKJ+WIOm;a}DYkB=cZU3Do1z|}DN~H&xhH(C|d1id9e~bxN7;|H(bvm;$ zF<-ej{?l)Vm*^=M{ys(?ijpXy!T&Mg=8#W?dDcV+XS2=47fYIycuZ71R1=vXUI%SfbVHM=~_qGJH$k zj(qrOvv-Bwd5Jg87UG3Uq^f#}eg)Yt$9I%Zosu2LC=_^IWbE?q%)4bs)x^)=Rebo> zK)0qht@C*1jLEg6Ac!|iEwY*X=|3f7@UW;W^;Q1rp~Ju+tGT%&V7WJ0@O}Ya@NIOr zVe9qs$jet=0>t?SW{R+*`reX#BLAB;42q$zs0Xv2{Zv7<^yV-f`c&9<-}E_MM3f&y z;Gw03>*!eMCT02--HFxw$v+F#?NYIVCxPARBN7Y;VLJE*Hheu@!RfDoN^tQe=~3yQ z#3y-4+~UW)6Y9b_|Cxzq#TkseT<=-=a2Hn~yWJ61^u)4{zd0lHmuVormO9^KY*kvF z>RleScJRP$U{?caVV-B({uAj$G!L%4Ui;N+e0`h&NZWCKL@{vN0C~IbUS2Kyk+cwR z+QB=(8I$s4LY`7?pQn=TY{q>~vLM!hSF-bJykfEXZ4* z85zMxU%JZ7k5b8#699-C?mCG32^#r+#H0T2AIPhrT{9`HA2)9R-$A@Stzb|Cj6L_G zxT};Y_RoTk*4*Yjk5U>(=(r|p*MDb~n8HWC|HziBH;8`rTbp-pUDB5)yId-@%gVbd zC@P%+w_NYFAj-fO+C>Lz=NNCnjzX49l997x_5s1$#80Toe3h1F%Em)`2_Nw%}fI6*<_d?1r`?7(YlM0*!* zau>Ag`_-_`D2AxM-^1}G1Bp&nu?@-i%KKmI7WHFKq#B+w=9XRt=-$6QZec(m1IeJV zi;%ustH??|&fccd+LJK3miWNB&?rv{tjqrttN;(&b)o|GLi|{8e9UYmJ3g)LI6I=V zS=`08b}#qC@z`cHos)n!miV9EG=mulS@hoRnt?7`cZFwg^iAKC{RrzNIMjQE3(9yl z7>xe1NmNc&<(jXa`%`>+oju5&*r?WP?yGf!iUTaw=L5=JwHkI7NHmgMZInUlKX`IU z-J{!UKwvyKp9NCj-$>p@=?*qus$Gx!p@kY3O!}Va{`l;x+~1{j@WrvBX`=81C6wlY ziG!fIc^1PEta?B0#52>CQnxLc2GnjzXjJvbBsL{q*E#f2*JNeCTaE--=}*`SOoI1RMJY zRFstc#XF3mo2YH(N7!ZaYO=E^3zCtpHzKKW!lwDJ7TmQw`pgAJVk!WnTZ7tnuz!1l z!wlPJO30*G^*rD`8yLJbpu0GUdHazPfE0iz6nEKYVhFKwQI)C?`s`wkm;kd}J zmM)<%%9$H8K^R-Xy`EBjkAv+KG=1;Y`*o_^MUsbhr5F zp~YhR`BB8tEdkLL;med_4Ueyl3>X^#*#aIzK9hjf9TLVA89`RdyseDTA-HphSjP=d zNbiYAwO0%723i*W0tEiQk+30DQ?yG7$g19*p+QV}I3V-a@g&j;3mwPP53y%>PH8D+ zOUKE4(^Bf2mUf4EUd@_S3ixzxkZU~46CU~+6=85}x^ZCryLrZn9K9a>W<7A*cm&ra zmF4Qs-~Sqpf$@V1EQ-xAi=W$Tk*j-u>%I^=xkpc$Nn%Zq1L(U~E@fm>nH>B@DBv3` zQzhO@1oivpZ!Q+3xI!f5d*hog0Mz3J*namx?&RSOV7^v$zCmKJ&;=szy*VGHo2*=| zha0g*AFJbYZF};f@$awb;_hoT^_CI^yXh3+<)iFl>*+{ ztvgzg6f;~Tu{H;tNTe`=H=N5JRPJ1Z7<7itnkoEQL)T2Z4_oZYQStKwRI8OtJ-8j9 zphgYjGXB>+p7b{qo5b5|UFzq89MI68l(wSF97_tiJqkFRmHr)w!g0!xfk=O^X8LY_ zw!d!YtsVll%pf9aq9+H9l~phib<+m=VSlu0VT zYi<%7l7o82-G9wX^YRnnfl-ntBPy*aQ=)7hcF{tvUX8uo0aZSkxe|(i!u@&e#Q{Bl zipHTcJ3vvNK9@ac$g(DstjGm5y0Bt;`qFx1qko6RGu9F}S@MZF|L~^~4Immrm0w}o zzI!A++a1;vw_AJZK-K`eHXQT-<09Z@^5q>-x3PZUR1FIa%kHtYN45%LLpIa*Ag@GI zgCt3mMN{jtxes&cD(v{m&h^_%5<6#l`2VjIF;TjS;Wvf!xG|1{zvtp>jpOv;)@KnD zZ}*m#WI7_o@5rts%@~C8Q@wn+pz0?mB1SIM^Nv+hb(rIbrG(YjX@@!(f^1^=r*U*! z5<xhjVm)766(d#X-9{Lfs53RjF)ahmibPlR=^z=SX?%rVzr`hY+O?;M~ zYM!;*c7BWrvSV0PB;htTQ1ZnclR?%Vd$LdrRc`*8>>ciEkpS`YcVwhHzSj)& zeCLNV%jgK$-GPNsg9_AW+1;P>^NAl=px4y$5Tq1E1s#|%n4<34QB17tV{iJ{Dd|$} zY)SkYB-mu}lW~N8ta0qH${^S1cqv~F7IsPY*~&RDr6}!`7cLzg_K06>>Zf6qu%-iy zBA7FmRx;CI&WL^Dv5k6Ue{8N}m1{*&iI!kP^myM_L~Q6M@&z=UFre0~&larT#nAWI z<3g2X#F9nx=G(A40zZRZto-DubkA*ZNg*FcpaTrsa2Nl_w;5{>xhNqn2t)&nkp zIOK94(&Uiyd@9wa>6y6|Z`w!mtkt&AjzEu_5~Oo8Y?=9g7xrkhIbJ@u*38EuYt`}U zj^di0x54B!A=U;G#9^ZgX=Z7->g!Xr+@YJ+S7ZaEC67`@f8We}mX1JuP!3;SG?JJ# zhVs1-2t)F5n6nLQk$}Ded!VC8YY=sA7ML|4%TU_(u~T=H9W)#4c+C`U4tvfb{s0S5 z1Sn^YkLEPQ(z2-cF#i4Rze}nkjb&LgcXB<(j40Twguz#b!0e{MVmSt03nY!OOn}te z|K{?mf`{+8xVt^hLY?7s1`viY!u%bY@OH>&(1VXb6ozZ`lOU;Bs2BXO93Vcs;wtmka8ij2Wtst9X+5Vi; zCyjo3YMtv)vcW;pVbKM#Cj#-qzMuP9zw>!lrk99xz#&j81^z-YHqH`FH(YS-``6>` zzzhL1a)Jr@iyrKoMmGV-Om!#S*xG6{F%2d3_o|G!^XHay$rDUJ&nWBU#%B)^G~%qj zWAZ5S%;jt-eYh~20M7c-sBle*-nftbGM zW|K~iD6vY)&4(5^Lr12E9^)#@Ku|Z+x{>2{zX1mT0o(*U!z;ehaa4%+4wM|llY z`f-e2X;kCpcC5_!X{2}2sjND$VQtSPJZ0S&JX-}!7;4~=sxXJ<5{q~(!!O6>lC{}$ z?5nX4$ra8lyXcTui$_0TETLhFY?O(bjbCBFu`y%;FNvgma+L0sU-k5M>=ge@hw(ue z{<*yP1um|jLK}@Jf^H+77RbH<TpYFIg~v`w&qc7D+6vG=s)Yl z@Ud$NKoDF9o_Wr9FLRIN2ZWbmHDrp!4c#Mg;`+qS+gS1l0!{dpr3fGLZ~g?WiF8Ms zxZn7=b07z@2YbKIHV1i4UeRB(wil7Y--GS@lYljAjnl4mBCC^r` zr3e?aT3~0ly&a0qdJm^}Uwq=WO^zk$Ek*aEL0lTA zGd5*O$#F^nJ)F9}-^N7P6*&Uo;)m|tdb^{k3y^xNzE1bHW7DE0nrc7wZ9| zA)ic6wd5Xmrw}wbX~4C^Q9g~Prr+tI4%&`srV}y_rtnv6T?XR0l_)){X>@q9(B|f( z9$WuTOFzomo2JwOn2*2+51+Y3?OwdY(2$vH$1?l4HUEdby=v0^tl`{iuDd+V58rZ<9`ph?Rk$RHqTR^M@_j9WXr2IhbN3d!vJ_eR!n!IBN zH;NA`EwfLwNsg%12&8HV;((?j=bhM!=bcg>z}o|DamPuD%(IRv`8tsXnNuCs`yY^4-OvCdP03q z{2Jkz0gaAcaNFY|uf?Ab0zNN^9?D}^0gouJbtD>}_*40(amp&;Eb|XCqxWch>mH3V z^mRfif#*0}{z)uVcnvWz2B_avwDN5%e)8F2e_#Kf z=tP8x*1a@MpCPv-l9JwDA%h7HO5mXauPvcnaFM?7boKlRr?{|RbMziNl35li4|hD3 zJ?;`~OO*kB6sTCbd3c{GdXLK4Bfs@`0L)0UhoDf0Xtpc`rfk*UP|X`tEsSm-Q;>#B z1N-B~)AKpro>zpRuh(ZBcEGg=YbXGQI#g&5t z&;Rv@6m3i<3mBV^B3A!T};Z2tP|f$7MG5I2xtpYx;9 eurlex - 0.3.4 + 0.3.5
    diff --git a/docs/authors.html b/docs/authors.html index b8fc41e..6a118cd 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -79,7 +79,7 @@ eurlex - 0.3.4 + 0.3.5
    diff --git a/docs/index.html b/docs/index.html index 52ee2a8..064a425 100644 --- a/docs/index.html +++ b/docs/index.html @@ -38,7 +38,7 @@ eurlex - 0.3.4 + 0.3.5
    @@ -108,9 +108,9 @@

  • dates <- elx_make_query("directive", include_date_transpos = TRUE) %>% elx_run_query()
  • ids %>% dplyr::left_join(lbs) %>% dplyr::left_join(dates)
  • -

    rather than elx_make_query("directive", include_lbs = TRUE, include_date_transpos = TRUE). This approach should make it easier to understand the returned data frame(s), especially when some variables contain missing or duplicated data.

    +

    rather than elx_make_query("directive", include_lbs = TRUE, include_date_transpos = TRUE). This approach should make it easier to understand the returned data frame(s), especially when some variables contain missing or duplicated data. Always keep an eye on whether the work and celex columns identify rows uniquely or not.

    One of the main contributions of the SPARQL requests is that we obtain a comprehensive list of identifiers that we can subsequently use to obtain more data relating to the document in question. While the results of the SPARQL queries are useful also for webscraping (with the rvest package), the function elx_fetch_data() enables us to fire GET requests to retrieve data on documents with known identifiers (including Cellar URI). The function currently enables downloading the title and the full text of a document in all available languages.

    -

    See the vignette for a walkthrough on how to use the package. Check function documentation for most up-to-date overview of features.

    +

    See the vignette for a walkthrough on how to use the package. Check function documentation for most up-to-date overview of features. Example use cases are shown in this paper.

    @@ -123,6 +123,23 @@

    This package nor its author are in any way affiliated with the EU Publications Office. Please refer to the applicable data reuse policies.

    Please consider contributing to the maintanance and development of the package by reporting bugs or suggesting new features.

    +
    +

    +Latest changes

    +
    +

    +eurlex 0.3.5

    + +
    +

    Useful resources

    diff --git a/docs/news/index.html b/docs/news/index.html index e985a87..01d636d 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -79,7 +79,7 @@ eurlex - 0.3.4 + 0.3.5
    @@ -139,7 +139,7 @@

    • it is now possible to select all resource types available with elx_make_query(resource_type = "any"). Since there are nearly 1 million CELEX codes, use with discretion and expect long execution times
    • results can be restricted to a particular directory code with elx_make_query(directory = "18") (directory code “18” denotes Common Foreign and Security Policy)
    • -
    • results can be restricted to a particular sector with elx_make_query(sector = 2) (sector code 3 denotes EU international agreements)
    • +
    • results can be restricted to a particular sector with elx_make_query(sector = 2) (sector code 2 denotes EU international agreements)

    diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index 26598c4..c90be6b 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -3,5 +3,5 @@ pkgdown: 1.5.1 pkgdown_sha: ~ articles: eurlexpkg: eurlexpkg.html -last_built: 2021-03-08T23:15Z +last_built: 2021-03-14T13:10Z diff --git a/docs/reference/elx_council_votes.html b/docs/reference/elx_council_votes.html index 5c46eb8..07882fe 100644 --- a/docs/reference/elx_council_votes.html +++ b/docs/reference/elx_council_votes.html @@ -80,7 +80,7 @@ eurlex - 0.3.4 + 0.3.5
    diff --git a/docs/reference/elx_curia_list.html b/docs/reference/elx_curia_list.html index 67f64ed..4a9e65f 100644 --- a/docs/reference/elx_curia_list.html +++ b/docs/reference/elx_curia_list.html @@ -81,7 +81,7 @@ eurlex - 0.3.4 + 0.3.5
    @@ -137,7 +137,10 @@

    Scrape list of court cases from Curia

    CELEX identifiers are extracted from hyperlinks where available.

    -
    elx_curia_list(data = c("all", "ecj_old", "ecj_new", "gc_all", "cst_all"))
    +
    elx_curia_list(
    +  data = c("all", "ecj_old", "ecj_new", "gc_all", "cst_all"),
    +  parse = TRUE
    +)

    Arguments

    @@ -147,11 +150,16 @@

    Arg

    + + + +

    Data to be scraped from four separate lists of cases maintained by Curia, defaults to "all" which contains cases from Court of Justice, General Court and Civil Service Tribunal.

    parse

    If `TRUE`, references to cases and appeals are parsed out from `case_info` into separate columns

    Value

    -

    A data frame containing case identifiers and information as character columns.

    +

    A data frame containing case identifiers and information as character columns. Where the case id +contains a hyperlink to Eur-Lex, the CELEX identifier is retrieved as well.

    Examples

    # \donttest{ diff --git a/docs/reference/elx_fetch_data.html b/docs/reference/elx_fetch_data.html index d61b510..cc5b191 100644 --- a/docs/reference/elx_fetch_data.html +++ b/docs/reference/elx_fetch_data.html @@ -80,7 +80,7 @@ eurlex - 0.3.4 + 0.3.5
    diff --git a/docs/reference/elx_label_eurovoc.html b/docs/reference/elx_label_eurovoc.html index eef7929..b20829e 100644 --- a/docs/reference/elx_label_eurovoc.html +++ b/docs/reference/elx_label_eurovoc.html @@ -80,7 +80,7 @@ eurlex - 0.3.4 + 0.3.5
    diff --git a/docs/reference/elx_make_query.html b/docs/reference/elx_make_query.html index f146474..12f39b1 100644 --- a/docs/reference/elx_make_query.html +++ b/docs/reference/elx_make_query.html @@ -82,7 +82,7 @@ eurlex - 0.3.4 + 0.3.5
    @@ -141,8 +141,10 @@

    Create SPARQL quries

    elx_make_query(
       resource_type = c("directive", "regulation", "decision", "recommendation", "intagr",
    -    "caselaw", "manual", "proposal", "national_impl"),
    +    "caselaw", "manual", "proposal", "national_impl", "any"),
       manual_type = "",
    +  directory = NULL,
    +  sector = NULL,
       include_corrigenda = FALSE,
       include_celex = TRUE,
       include_lbs = FALSE,
    @@ -150,10 +152,14 @@ 

    Create SPARQL quries

    include_date_force = FALSE, include_date_endvalid = FALSE, include_date_transpos = FALSE, + include_date_lodged = FALSE, include_force = FALSE, include_eurovoc = FALSE, include_author = FALSE, include_citations = FALSE, + include_court_procedure = FALSE, + include_directory = FALSE, + include_sector = FALSE, order = FALSE, limit = NULL )
    @@ -169,6 +175,14 @@

    Arg manual_type

    Define manually the type of resource to be retrieved

    + + directory +

    Restrict the results to a given directory code

    + + + sector +

    Restrict the results to a given sector code

    + include_corrigenda

    If `TRUE`, results include corrigenda

    @@ -197,6 +211,10 @@

    Arg include_date_transpos

    If `TRUE`, results include date of transposition deadline for directives

    + + include_date_lodged +

    If `TRUE`, results include date a court case was lodged with the court

    + include_force

    If `TRUE`, results include whether legislation is in force

    @@ -213,6 +231,18 @@

    Arg include_citations

    If `TRUE`, results include citations (CELEX-labelled)

    + + include_court_procedure +

    If `TRUE`, results include type of court procedure and outcome

    + + + include_directory +

    If `TRUE`, results include the Eur-Lex directory code

    + + + include_sector +

    If `TRUE`, results include the Eur-Lex sector code

    + order

    Order results by ids

    diff --git a/docs/reference/elx_parse_xml.html b/docs/reference/elx_parse_xml.html index 1bf612e..958f88d 100644 --- a/docs/reference/elx_parse_xml.html +++ b/docs/reference/elx_parse_xml.html @@ -80,7 +80,7 @@ eurlex - 0.3.4 + 0.3.5

    diff --git a/docs/reference/elx_run_query.html b/docs/reference/elx_run_query.html index 9f0551a..53a9bc9 100644 --- a/docs/reference/elx_run_query.html +++ b/docs/reference/elx_run_query.html @@ -81,7 +81,7 @@ eurlex - 0.3.4 + 0.3.5
    @@ -162,7 +162,7 @@

    Value

    Examples

    # \donttest{ -elx_run_query(elx_make_query("directive", include_force = TRUE))
    #> # A tibble: 4,316 x 4 +elx_run_query(elx_make_query("directive", include_force = TRUE))
    #> # A tibble: 4,317 x 4 #> work type celex force #> <chr> <chr> <chr> <chr> #> 1 http://publications.europa.eu/res~ http://publications.europa.e~ 31979~ false @@ -175,7 +175,7 @@

    Examp #> 8 http://publications.europa.eu/res~ http://publications.europa.e~ 31966~ false #> 9 http://publications.europa.eu/res~ http://publications.europa.e~ 31974~ false #> 10 http://publications.europa.eu/res~ http://publications.europa.e~ 31982~ false -#> # ... with 4,306 more rows

    # } +#> # ... with 4,307 more rows
    # }
    diff --git a/man/elx_make_query.Rd b/man/elx_make_query.Rd index 042c2e6..d99885b 100644 --- a/man/elx_make_query.Rd +++ b/man/elx_make_query.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/elx_make_query.R \name{elx_make_query} \alias{elx_make_query} -\title{Create SPARQL quries} +\title{Create SPARQL queries} \usage{ elx_make_query( resource_type = c("directive", "regulation", "decision", "recommendation", "intagr", @@ -78,7 +78,7 @@ A character string containing the SPARQL query \description{ Generates pre-defined or manual SPARQL queries to retrieve document ids from Cellar. List of available resource types: http://publications.europa.eu/resource/authority/resource-type . -Note that not all resource types are compatible with the pre-defined query. +Note that not all resource types are compatible with default parameter values. } \examples{ elx_make_query(resource_type = "directive", include_date = TRUE, include_force = TRUE) diff --git a/vignettes/eurlexpkg.Rmd b/vignettes/eurlexpkg.Rmd index df6e722..05b1e3d 100644 --- a/vignettes/eurlexpkg.Rmd +++ b/vignettes/eurlexpkg.Rmd @@ -29,6 +29,8 @@ The `eurlex` R package attempts to significantly reduce the overhead associated The `eurlex` package currently envisions the typical use-case to consist of getting bulk information about EU legislation into R as fast as possible. The package contains three core functions to achieve that objective: `elx_make_query()` to create pre-defined or customized SPARQL queries; `elx_run_query()` to execute the pre-made or any other manually input query; and `elx_fetch_data()` to fire GET requests for certain metadata to the REST API. +The package also contains largely self-explanatory functions for retrieving data on EU court cases (`elx_curia_list()`) and Council votes (`elx_council_votes()`) from outside Eur-Lex. + ## `elx_make_query()`: Generate SPARQL queries The function `elx_make_query` takes as its first argument the type of resource to be retrieved from the semantic database that powers Eur-Lex (and other publications) called Cellar. @@ -55,13 +57,13 @@ The choice of resource type is then reflected in the SPARQL query generated by t ```{r} query_dir %>% - glue::as_glue() # for nicer printing + cat() # for nicer printing elx_make_query(resource_type = "caselaw") %>% - glue::as_glue() + cat() elx_make_query(resource_type = "manual", manual_type = "SWD") %>% - glue::as_glue() + cat() ``` @@ -69,21 +71,33 @@ There are various ways of querying the same information in the Cellar database d The other arguments in `elx_make_query()` relate to additional metadata to be returned. The results include by default the [CELEX number](https://eur-lex.europa.eu/content/tools/TableOfSectors/types_of_documents_in_eurlex.html) and exclude corrigenda (corrections of errors in legislation). Other data needs to be opted into. Make sure to select ones that are logically compatible (e.g. case law does not have a legal basis). More options should be added in the future. -Note that availability of data for each variable has an impact on the results. The data frame returned by the query will be shrunken to the size of the variable with most missing data. It is recommended to always compare results from a desired query to a minimal query requesting only celex ids. +Note that availability of data for each variable might have an impact on the results. The data frame returned by the query might be shrunken to the size of the variable with most missing data. It is recommended to always compare results from a desired query to a minimal query requesting only celex ids. ```{r} elx_make_query(resource_type = "directive", include_date = TRUE, include_force = TRUE) %>% - glue::as_glue() + cat() # minimal query: elx_make_query(resource_type = "directive") elx_make_query(resource_type = "recommendation", include_date = TRUE, include_lbs = TRUE) %>% - glue::as_glue() + cat() # minimal query: elx_make_query(resource_type = "recommendation") ``` +You can also decide to not specify any resource types, in which case all types of documents will be returned. As there are over a million documents with a CELEX identifier, this is likely not efficient for a majority of users. But since version 0.3.5 it is possible to request documents belonging to a particular ["sector"](https://eur-lex.europa.eu/content/tools/TableOfSectors/types_of_documents_in_eurlex.html) or [directory code](https://eur-lex.europa.eu/browse/directories/legislation.html). + +```{r} +# request documents from directory 18 ("Common Foreign and Security Policy") +# and sector 3 ("Legal acts") + +elx_make_query(resource_type = "any", + directory = "18", + sector = 3) %>% + cat() +``` + Now that we have a query, we are ready to run it. ## `elx_run_query()`: Execute SPARQL queries @@ -208,7 +222,9 @@ Directives become naturally outdated with time. It might be all the more interes ```{r} dirs %>% - ggplot(aes(x = as.Date(date), y = celex)) + + filter(!is.na(force)) %>% + mutate(date = as.Date(date)) %>% + ggplot(aes(x = date, y = celex)) + geom_point(aes(color = force), alpha = 0.1) + theme(axis.text.y = element_blank(), axis.line.y = element_blank(), @@ -246,6 +262,6 @@ dirs_1970_title %>% I use term-frequency inverse-document frequency (tf-idf) to weight the importance of the words in the wordcloud. If we used pure frequencies, the wordcloud would largely consist of words conveying little meaning ("the", "and", ...). -This is an extremely basic application of the `eurlex` package. Much more sophisticated methods can be used to analyse both the content and metadata of European Union legislation. If the package is useful for your research, please consider citing it. +This is an extremely basic application of the `eurlex` package. Much more sophisticated methods can be used to analyse both the content and metadata of European Union legislation. If the package is useful for your research, please consider citing the [accompanying paper](https://www.tandfonline.com/doi/full/10.1080/2474736X.2020.1870150).^[Michal Ovádek (2021) Facilitating access to data on European Union laws, Political Research Exchange, 3:1, DOI: [10.1080/2474736X.2020.1870150](https://www.tandfonline.com/doi/full/10.1080/2474736X.2020.1870150)]